flowstack-sdk 0.2.2 → 0.2.3
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.
- package/README.md +5 -0
- package/dist/api/index.js +19 -1
- package/dist/api/index.js.map +1 -1
- package/dist/api/index.mjs +19 -1
- package/dist/api/index.mjs.map +1 -1
- package/dist/index.js +26 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +26 -4
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/client.ts","../src/utils/storage.ts","../src/mock/fixtures.ts","../src/context/FlowstackProvider.tsx","../src/errors/codes.ts","../src/errors/index.ts","../src/config/validator.ts","../src/hooks/useAuth.ts","../src/hooks/useWorkspace.ts","../src/hooks/useDatasets.ts","../src/hooks/useVisualizations.ts","../src/hooks/useReports.ts","../src/hooks/useModels.ts","../src/hooks/useDataSources.ts","../src/utils/sse-parser.ts","../src/utils/stream-utils.ts","../src/hooks/useCollection.ts","../src/hooks/useAgent.ts","../src/hooks/useQuery.ts","../src/factory/intent-analyzer.ts","../src/factory/agent-registry.ts","../src/factory/agent-factory.ts","../src/hooks/useIntentAgent.ts","../src/hooks/useAuthGuard.ts","../src/hooks/useFlowstackStatus.ts","../src/hooks/useUserManagement.ts","../src/hooks/useSites.ts","../src/hooks/useAgents.ts","../src/hooks/useToolInvocation.ts","../src/hooks/useConnections.ts","../src/hooks/useThreads.ts","../src/hooks/useMessages.ts","../src/hooks/useSiteVersions.ts","../src/hooks/useProviderCredentials.ts","../src/hooks/useOllamaDetection.ts","../src/hooks/useDataOverview.ts","../src/hooks/useUserCollections.ts","../src/hooks/useCollectionExplorer.ts","../src/hooks/usePublicCollection.ts","../src/hooks/useConversations.ts","../src/hooks/useIntegrations.ts","../src/hooks/useAutomations.ts","../src/components/auth/LoginForm.tsx","../src/components/auth/RegisterForm.tsx","../src/components/auth/GoogleSignIn.tsx","../src/components/auth/BrokeredLoginButton.tsx","../src/components/auth/AuthGuard.tsx","../src/components/auth/AdminGate.tsx","../src/components/workspace/WorkspaceSelector.tsx","../src/components/workspace/CreateWorkspaceModal.tsx","../src/components/datasets/DatasetUploader.tsx","../src/utils/mermaid-utils.ts","../src/components/chat/MermaidDiagram.tsx","../src/components/chat/MessageList.tsx","../src/components/chat/ChatInterface.tsx","../src/components/chat/MarkdownRenderer.tsx","../src/components/pages/AuthPage.tsx","../src/components/pages/DashboardLayout.tsx","../src/components/pages/ChatPage.tsx","../src/types/index.ts","../src/api/cache.ts","../src/templates/index.ts","../src/hooks/useModelPreference.ts","../src/hooks/useAdminProviderCredentials.ts","../src/hooks/useLibrary.ts","../src/hooks/useSubagents.ts","../src/hooks/useConversation.ts","../src/index.ts"],"names":["DEFAULT_BASE_URL","createContext","useState","useEffect","useCallback","createWorkspace","clearMessages","datasets","jsx","useContext","login","register","useMemo","deleteDataset","createDataSource","deleteDataSource","i","useRef","fullContent","generateId","listAgents","getUser","updateUser","suspendUser","reactivateUser","deleteUser","getUserActivity","createSite","deleteSite","openThread","jsxs","Fragment","ReactMarkdown","remarkGfm","_authedFetch","TYPE_PATH"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Flowstack API Client\n *\n * CRITICAL: This enforces user-level isolation for the shared tenant architecture.\n * ALL API requests MUST go through this client to prevent data leakage.\n *\n * Architecture:\n * - Flowstack: Multi-user, single-tenant system\n * - Backend: Multi-tenant system\n * - Isolation: By user_id within shared tenant\n */\n\nimport type {\n ApiResponse,\n FlowstackCredentials,\n WorkspaceInfo,\n DatasetInfo,\n VisualizationData,\n ReportInfo,\n ModelInfo,\n DataSource,\n DataSourceConfig,\n ConnectionTestResult,\n ManagedUser,\n UserStats,\n UserActivityLog,\n UserListParams,\n UserListResponse,\n UpdateUserRequest,\n DatasetPreview,\n GitHubRepo,\n PiiSettings,\n PiiRedactedEntity,\n PublishedSiteInfo,\n ScriptInfo,\n AgentInfo,\n SiteVersionManifest,\n PublishToGitHubParams,\n PublishToGitHubResult,\n CollectionLayer,\n UserDataOverview,\n UserCollectionInfo,\n CollectionSchemaInfo,\n} from '../types';\n\n// Default API URL\nconst DEFAULT_BASE_URL = 'https://sage-api.flowstack.fun';\n// No real default tenant: every function here is authenticated (takes `credentials`),\n// so the backend derives tenant_id from the JWT/API key and ignores the X-Tenant-ID\n// header. Falling back to '' avoids silently tagging requests with a platform tenant.\nconst DEFAULT_TENANT_ID = '';\n\n// Client configuration\nexport interface FlowstackClientConfig {\n baseUrl?: string;\n tenantId?: string;\n enforceUserScope?: boolean;\n /** App scope (site_id) — embedded in JWT for built-app users */\n appScope?: string;\n}\n\n/**\n * Request options for API calls\n */\nexport interface RequestOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n body?: unknown;\n headers?: Record<string, string>;\n credentials: FlowstackCredentials;\n}\n\n/**\n * Make a request to the Flowstack API with user-level isolation\n */\nexport async function flowstackFetch<T = unknown>(\n endpoint: string,\n options: RequestOptions,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<T>> {\n const { method = 'GET', body, headers = {}, credentials } = options;\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n const enforceUserScope = config?.enforceUserScope !== false;\n\n const { apiKey, tenantId, userId } = credentials;\n\n // CRITICAL: Enforce user ID requirement\n if (enforceUserScope && !userId) {\n console.error('[FlowstackClient] CRITICAL: No user ID provided!');\n throw new Error('SECURITY: User ID is required for all API requests.');\n }\n\n // Build full URL\n const url = new URL(`${baseUrl}${endpoint}`);\n\n // Add user_id as query parameter for GET requests\n if (method === 'GET' && userId) {\n url.searchParams.set('user_id', userId);\n }\n\n // Build request headers\n const requestHeaders: HeadersInit = {\n 'Authorization': `Bearer ${apiKey}`,\n 'X-Tenant-ID': tenantId || config?.tenantId || DEFAULT_TENANT_ID,\n 'X-User-ID': userId || '',\n ...headers,\n };\n\n // Add Content-Type for POST/PUT/PATCH\n if (body && !requestHeaders['Content-Type']) {\n requestHeaders['Content-Type'] = 'application/json';\n }\n\n try {\n const response = await fetch(url.toString(), {\n method,\n headers: requestHeaders,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n console.error(`[FlowstackClient] Error ${response.status}:`, errorText);\n return {\n ok: false,\n status: response.status,\n error: errorText,\n };\n }\n\n const data = await response.json();\n return {\n ok: true,\n status: response.status,\n data: data as T,\n };\n } catch (error) {\n console.error('[FlowstackClient] Request failed:', error);\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n\n// =============================================================================\n// Workspace Operations\n// =============================================================================\n\n/**\n * List workspaces for the current user\n */\nexport async function listWorkspaces(\n credentials: FlowstackCredentials,\n limit: number = 50,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ workspaces: WorkspaceInfo[]; total_count: number; has_more: boolean }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/workspaces?limit=${limit}`, {\n credentials,\n }, config);\n}\n\n/**\n * Create a new workspace\n */\nexport async function createWorkspace(\n credentials: FlowstackCredentials,\n name: string,\n description?: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ workspace: WorkspaceInfo }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/workspaces`, {\n method: 'POST',\n credentials,\n body: {\n name,\n workspace_name: name,\n description,\n user_id: credentials.userId,\n },\n }, config);\n}\n\n/**\n * Get a single workspace\n */\nexport async function getWorkspace(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ workspace: WorkspaceInfo }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/workspaces/${workspaceId}`, {\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Dataset Operations\n// =============================================================================\n\n/**\n * List datasets for a tenant (optionally filtered by workspace)\n */\nexport async function listDatasets(\n credentials: FlowstackCredentials,\n workspaceId?: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ datasets: DatasetInfo[] }>> {\n // Use workspace-scoped endpoint (non-tenant-prefixed) — demo users lack admin:read\n const query = workspaceId\n ? `?workspace_id=${workspaceId}&session_id=${workspaceId}`\n : '';\n return flowstackFetch(`/datasets${query}`, {\n credentials,\n }, config);\n}\n\n/**\n * Get dataset details\n */\nexport async function getDataset(\n credentials: FlowstackCredentials,\n datasetName: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ dataset: DatasetInfo }>> {\n // API provides dataset info through the download endpoint\n return flowstackFetch(`/datasets/${datasetName}/download`, {\n credentials,\n }, config);\n}\n\n/**\n * Get a preview of dataset rows and columns\n */\nexport async function getDatasetPreview(\n credentials: FlowstackCredentials,\n datasetName: string,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<DatasetPreview>> {\n return flowstackFetch(`/datasets/${datasetName}/preview?workspace_id=${workspaceId}&session_id=${workspaceId}&limit=50`, {\n credentials,\n }, config);\n}\n\n/**\n * Delete a dataset\n * Note: Dataset deletion must be done through the agent chat interface\n */\nexport async function deleteDataset(\n _credentials: FlowstackCredentials,\n _datasetName: string,\n _config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n // Dataset deletion is handled through agent interactions, not a direct API call\n return {\n ok: false,\n status: 501,\n error: 'Dataset deletion is handled through the agent chat interface. Use the /stream endpoint to request deletion.',\n };\n}\n\n// =============================================================================\n// Visualization Operations\n// =============================================================================\n\n/**\n * List visualizations in a workspace\n */\nexport async function listVisualizations(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ visualizations: VisualizationData[] }>> {\n return flowstackFetch(`/visualizations?workspace_id=${workspaceId}&session_id=${workspaceId}`, {\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Report Operations\n// =============================================================================\n\n/**\n * List reports in a workspace\n */\nexport async function listReports(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ reports: ReportInfo[] }>> {\n return flowstackFetch(`/reports?workspace_id=${workspaceId}&session_id=${workspaceId}`, {\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Model Operations\n// =============================================================================\n\n/**\n * List ML models in a workspace\n */\nexport async function listModels(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ models: ModelInfo[] }>> {\n return flowstackFetch(`/models?workspace_id=${workspaceId}&session_id=${workspaceId}`, {\n credentials,\n }, config);\n}\n\n/**\n * Get model details\n */\nexport async function getModel(\n credentials: FlowstackCredentials,\n workspaceId: string,\n modelName: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ model: ModelInfo }>> {\n return flowstackFetch(`/models/${modelName}?workspace_id=${workspaceId}&session_id=${workspaceId}`, {\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Script Operations\n// =============================================================================\n\n/**\n * List scripts in a workspace\n */\nexport async function listScripts(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ scripts: ScriptInfo[] }>> {\n return flowstackFetch(`/scripts/detailed?workspace_id=${workspaceId}&session_id=${workspaceId}`, {\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Data Source Operations\n// =============================================================================\n\n/**\n * List data sources\n */\nexport async function listDataSources(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig,\n options?: {\n /**\n * P0-69: when true, appends `include_provenance=true` so the backend\n * returns the `_flowstack` workspace attribution envelope on every\n * data source. Required for built apps that need to know which\n * workspace a shared data source belongs to.\n */\n includeProvenance?: boolean;\n },\n): Promise<ApiResponse<{ datasources: DataSource[] }>> {\n const qs = options?.includeProvenance ? '?include_provenance=true' : '';\n return flowstackFetch(`/data-sources${qs}`, {\n credentials,\n }, config);\n}\n\n/**\n * Create a data source\n */\nexport async function createDataSource(\n credentials: FlowstackCredentials,\n sourceConfig: DataSourceConfig,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<DataSource>> {\n return flowstackFetch('/data-sources', {\n method: 'POST',\n credentials,\n body: {\n source_type: sourceConfig.type,\n name: sourceConfig.name,\n auth_method: sourceConfig.auth_method || 'connection_string',\n credentials: sourceConfig.credentials || {\n connection_string: sourceConfig.connectionString,\n },\n metadata: sourceConfig.metadata,\n is_tenant_wide: sourceConfig.is_tenant_wide || false,\n },\n }, config);\n}\n\n/**\n * Test a data source connection\n */\nexport async function testDataSource(\n credentials: FlowstackCredentials,\n sourceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<ConnectionTestResult>> {\n return flowstackFetch(`/data-sources/${sourceId}/test`, {\n method: 'POST',\n credentials,\n }, config);\n}\n\n/**\n * Delete a data source\n */\nexport async function deleteDataSource(\n credentials: FlowstackCredentials,\n sourceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n return flowstackFetch(`/data-sources/${sourceId}`, {\n method: 'DELETE',\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Agent Discovery\n// =============================================================================\n\n/**\n * List available agents with descriptions and capabilities.\n * No credentials required — this is a public capability catalog.\n */\nexport async function listAgents(\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ agents: AgentInfo[]; count: number; workflows: any[] }>> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n\n try {\n const response = await fetch(`${baseUrl}/agents`, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return { ok: false, status: response.status, error: errorText };\n }\n\n const data = await response.json();\n return { ok: true, status: response.status, data };\n } catch (error) {\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Failed to fetch agents',\n };\n }\n}\n\n// =============================================================================\n// Query Execution\n// =============================================================================\n\n/**\n * Execute a streaming query\n * Returns the Response object for SSE streaming\n */\nexport async function executeQuery(\n credentials: FlowstackCredentials,\n query: string,\n workspaceId: string,\n options?: {\n networkMode?: 'SANDBOX' | 'PUBLIC';\n tools?: string[];\n /** @deprecated P0-73: Strands swarm removed. Use `capabilities` instead. */\n targetAgent?: string;\n /** @deprecated P0-73: Strands swarm removed. Use `capabilities` instead. */\n targetAgents?: string[];\n /** P0-80: meta-tool categories to pre-load on the server so the agent\n * has the right tools available from turn 1. Values: 'site_operations',\n * 'data_access', 'external_integration', 'code_execution',\n * 'domain_task', 'workspace_management'. */\n capabilities?: string[];\n /** Session ID for conversation continuity */\n sessionId?: string;\n /**\n * When true, backend generates a new session key (appends timestamp to\n * the deterministic hash) so end-users of built apps get a fresh\n * conversation on the backend, not just cleared frontend state.\n */\n forceNewSession?: boolean;\n },\n config?: FlowstackClientConfig\n): Promise<Response> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n\n const response = await fetch(`${baseUrl}/stream`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': tenantId,\n 'X-User-ID': credentials.userId || '',\n 'Accept': 'text/event-stream',\n },\n body: JSON.stringify({\n query,\n workspace_id: workspaceId,\n session_id: options?.sessionId || undefined,\n force_new_session: options?.forceNewSession || undefined,\n tenant_id: tenantId,\n user_id: credentials.userId,\n code_interpreter_network_mode: options?.networkMode || 'SANDBOX',\n // P0-80: capabilities replaces target_agents on the wire. Deprecated\n // target_agents/target_agent are intentionally NOT forwarded — they\n // were no-ops post-P0-73 and forwarding them just added noise to logs.\n capabilities: options?.capabilities && options.capabilities.length > 0\n ? options.capabilities\n : undefined,\n }),\n });\n\n if (!response.ok) {\n // 402 Payment Required → out of credits. Throw a typed error that Casino's\n // useAgent hook can catch and surface via the CreditGate modal.\n if (response.status === 402) {\n let body: any = {};\n try { body = await response.json(); } catch {}\n const err = new Error(body?.message || 'Out of credits — top up to continue');\n (err as any).status = 402;\n (err as any).code = 'INSUFFICIENT_CREDITS';\n (err as any).body = body;\n throw err;\n }\n // Other failures — try to parse the body for a meaningful message\n let detail = response.statusText;\n try {\n const body = await response.json();\n detail = body?.detail || body?.error || body?.message || detail;\n } catch {}\n throw new Error(`Query failed: ${detail}`);\n }\n\n return response;\n}\n\n/**\n * Execute a streaming query with custom agent configuration\n *\n * Extends executeQuery to support system prompt overrides, tool whitelists,\n * and direct agent targeting.\n */\nexport async function executeQueryWithConfig(\n credentials: FlowstackCredentials,\n query: string,\n workspaceId: string,\n options?: {\n networkMode?: 'SANDBOX' | 'PUBLIC';\n systemPrompt?: string;\n tools?: string[];\n /** @deprecated P0-73: Strands swarm removed. Use `capabilities` instead. */\n targetAgent?: string;\n /** @deprecated P0-73: Strands swarm removed. Use `capabilities` instead. */\n targetAgents?: string[];\n /** P0-80: meta-tool categories to pre-load on the server. */\n capabilities?: string[];\n /** P0-132 (G4): target a specific registered persona/subagent by name. Sent\n * as `target_agents` on the wire so multi-persona apps can pick a persona\n * instead of always hitting the auto-selected first subagent. This is the\n * supported persona-selection path — distinct from the deprecated Strands\n * swarm `targetAgent(s)` fields above. */\n persona?: string;\n /** Session ID for conversation continuity */\n sessionId?: string;\n /** P0-57: Per-request PII allowlist — terms the user explicitly allowed */\n allowedTerms?: string[];\n /** Force backend to create a new conversation (appends timestamp to session hash) */\n forceNewSession?: boolean;\n },\n config?: FlowstackClientConfig\n): Promise<Response> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n\n const response = await fetch(`${baseUrl}/stream`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': tenantId,\n 'X-User-ID': credentials.userId || '',\n 'Accept': 'text/event-stream',\n },\n body: JSON.stringify({\n query,\n workspace_id: workspaceId,\n session_id: options?.sessionId || undefined,\n force_new_session: options?.forceNewSession || undefined,\n tenant_id: tenantId,\n user_id: credentials.userId,\n code_interpreter_network_mode: options?.networkMode || 'SANDBOX',\n // P0-80: capabilities replaces target_agents on the wire.\n capabilities: options?.capabilities && options.capabilities.length > 0\n ? options.capabilities\n : undefined,\n system_prompt_override: options?.systemPrompt,\n tool_whitelist: options?.tools,\n allowed_terms: options?.allowedTerms || undefined,\n // P0-132 (G4): persona selection → target_agents. The backend persona\n // resolver honors request.target_agents and otherwise auto-selects the\n // first registered subagent. Only sent when a persona is requested.\n target_agents: options?.persona ? [options.persona] : undefined,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Query failed: ${response.statusText}`);\n }\n\n return response;\n}\n\n// =============================================================================\n// Collections — Direct MongoDB Read Access\n// =============================================================================\n\n/**\n * Query a MongoDB collection directly (for useCollection hook).\n *\n * Requires app_scope in JWT — only built-app users can use this.\n * Collection name is auto-prefixed with app_scope by the backend.\n */\nexport async function queryCollection<T = Record<string, any>>(\n credentials: FlowstackCredentials,\n collection: string,\n options?: {\n filter?: Record<string, any>;\n limit?: number;\n skip?: number;\n sort?: Record<string, 1 | -1>;\n projection?: Record<string, 0 | 1>;\n layer?: CollectionLayer;\n /**\n * P0-69: when true, appends `include_provenance=true` so the backend\n * returns the `_flowstack` workspace attribution envelope on every\n * document. Backend strips the envelope when this param is absent.\n */\n includeProvenance?: boolean;\n },\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ documents: T[]; count: number; total: number }>> {\n const params = new URLSearchParams();\n params.set('collection', collection);\n if (options?.filter) params.set('filter', JSON.stringify(options.filter));\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.skip) params.set('skip', String(options.skip));\n if (options?.sort) params.set('sort', JSON.stringify(options.sort));\n if (options?.projection) params.set('projection', JSON.stringify(options.projection));\n if (options?.layer) params.set('layer', options.layer);\n if (options?.includeProvenance) params.set('include_provenance', 'true');\n\n return flowstackFetch<{ documents: T[]; count: number; total: number }>(\n `/collections/query?${params.toString()}`,\n { credentials },\n config,\n );\n}\n\n/**\n * Insert one or more documents into a MongoDB collection.\n *\n * Requires app_scope in JWT — only built-app users can use this.\n * Collection name is auto-prefixed with app_scope by the backend.\n */\nexport async function insertDocuments(\n credentials: FlowstackCredentials,\n collection: string,\n documents: Record<string, any> | Record<string, any>[],\n config?: FlowstackClientConfig,\n layer?: CollectionLayer,\n): Promise<ApiResponse<{ inserted_count: number; inserted_ids: string[]; collection: string }>> {\n const isArray = Array.isArray(documents);\n return flowstackFetch<{ inserted_count: number; inserted_ids: string[]; collection: string }>(\n '/collections/insert',\n {\n method: 'POST',\n credentials,\n body: {\n collection,\n ...(isArray ? { documents } : { document: documents }),\n ...(layer ? { layer } : {}),\n },\n },\n config,\n );\n}\n\n/**\n * Update documents in a MongoDB collection matching the filter.\n *\n * Requires app_scope in JWT — only built-app users can use this.\n * Collection name is auto-prefixed with app_scope by the backend.\n */\nexport async function updateDocuments(\n credentials: FlowstackCredentials,\n collection: string,\n filter: Record<string, any>,\n update: Record<string, any>,\n options?: { upsert?: boolean },\n config?: FlowstackClientConfig,\n layer?: CollectionLayer,\n): Promise<ApiResponse<{ matched_count: number; modified_count: number; collection: string }>> {\n return flowstackFetch<{ matched_count: number; modified_count: number; collection: string }>(\n '/collections/update',\n {\n method: 'POST',\n credentials,\n body: {\n collection,\n filter,\n update,\n upsert: options?.upsert ?? false,\n ...(layer ? { layer } : {}),\n },\n },\n config,\n );\n}\n\n/**\n * Delete documents from a MongoDB collection matching the filter.\n *\n * Requires app_scope in JWT — only built-app users can use this.\n * Collection name is auto-prefixed with app_scope by the backend.\n */\nexport async function deleteDocuments(\n credentials: FlowstackCredentials,\n collection: string,\n filter: Record<string, any>,\n config?: FlowstackClientConfig,\n layer?: CollectionLayer,\n): Promise<ApiResponse<{ deleted_count: number; collection: string }>> {\n return flowstackFetch<{ deleted_count: number; collection: string }>(\n '/collections/delete',\n {\n method: 'POST',\n credentials,\n body: {\n collection,\n filter,\n ...(layer ? { layer } : {}),\n },\n },\n config,\n );\n}\n\n// =============================================================================\n// Private Messaging (P0-138)\n// =============================================================================\n//\n// Server-mediated, ACL'd, key-addressed direct messages between two app users.\n// The backend pins `from` to the caller's JWT identity, gates sends on a\n// mutually-consented thread, and ACLs reads to thread participants — neither\n// party ever learns the other's contact.\n//\n// Message bodies are UNTRUSTED user input. Render them as plain text / sanitized\n// markdown only — never as raw HTML (no dangerouslySetInnerHTML). If a body is\n// ever passed to an agent, treat it as data, not instructions.\n\nexport interface DmMessage {\n message_id: string;\n from: string;\n to: string;\n /** UNTRUSTED user input — render as text, never raw HTML. */\n body: string;\n created_at: string;\n read_at: string | null;\n}\n\nexport interface DmThread {\n pair_key: string;\n with_user_key: string;\n status: 'pending' | 'open';\n last_message: DmMessage | null;\n unread_count: number;\n updated_at: string | null;\n}\n\n/**\n * Deterministic, order-independent thread key for a pair of user keys.\n * Mirrors the backend's `pair_key` (sorted, '::'-joined).\n */\nexport function dmPairKey(a: string, b: string): string {\n return [a, b].sort().join('::');\n}\n\nfunction requireAppScope(config?: FlowstackClientConfig): string {\n const scope = config?.appScope;\n if (!scope) {\n throw new Error('Private messaging requires an app scope (built-app context).');\n }\n return scope;\n}\n\n/** List the caller's threads (counterpart key, last message, unread count). */\nexport async function listThreads(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ threads: DmThread[]; count: number }>> {\n const scope = requireAppScope(config);\n return flowstackFetch<{ threads: DmThread[]; count: number }>(\n `/apps/${encodeURIComponent(scope)}/threads`,\n { credentials },\n config,\n );\n}\n\n/** List messages in the caller's thread with `withUserKey`. ACL'd server-side. */\nexport async function listMessages(\n credentials: FlowstackCredentials,\n withUserKey: string,\n options?: { limit?: number; before?: string },\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ messages: DmMessage[]; count: number }>> {\n const scope = requireAppScope(config);\n const params = new URLSearchParams();\n params.set('with', withUserKey);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.before) params.set('before', options.before);\n return flowstackFetch<{ messages: DmMessage[]; count: number }>(\n `/apps/${encodeURIComponent(scope)}/messages?${params.toString()}`,\n { credentials },\n config,\n );\n}\n\n/** Send a message to `toUserKey`. 403 unless the thread is mutually open. */\nexport async function sendMessage(\n credentials: FlowstackCredentials,\n toUserKey: string,\n body: string,\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ message_id: string; created_at: string }>> {\n const scope = requireAppScope(config);\n return flowstackFetch<{ message_id: string; created_at: string }>(\n `/apps/${encodeURIComponent(scope)}/messages`,\n { method: 'POST', credentials, body: { to_user_key: toUserKey, body } },\n config,\n );\n}\n\n/**\n * Record the caller's consent to open a thread with `withUserKey`.\n * The thread becomes `open` (sendable) only once BOTH parties have consented.\n */\nexport async function openThread(\n credentials: FlowstackCredentials,\n withUserKey: string,\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ pair_key: string; status: string }>> {\n const scope = requireAppScope(config);\n const me = credentials.userId;\n if (!me) throw new Error('openThread requires an authenticated user.');\n const pk = dmPairKey(me, withUserKey);\n return flowstackFetch<{ pair_key: string; status: string }>(\n `/apps/${encodeURIComponent(scope)}/threads/${encodeURIComponent(pk)}/consent`,\n { method: 'POST', credentials },\n config,\n );\n}\n\n/** Mark a received message as read (recipient only). */\nexport async function markMessageRead(\n credentials: FlowstackCredentials,\n messageId: string,\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ message_id: string; read: boolean }>> {\n const scope = requireAppScope(config);\n return flowstackFetch<{ message_id: string; read: boolean }>(\n `/apps/${encodeURIComponent(scope)}/messages/${encodeURIComponent(messageId)}/read`,\n { method: 'POST', credentials },\n config,\n );\n}\n\n// =============================================================================\n// Direct Tool Invocation\n// =============================================================================\n\n/**\n * Invoke an agent tool directly (bypasses LLM orchestration).\n */\nexport async function invokeTool<T = any>(\n credentials: FlowstackCredentials,\n agentName: string,\n toolName: string,\n kwargs: Record<string, any> = {},\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ status: string; result: T }>> {\n return flowstackFetch<{ status: string; result: T }>(\n '/tool/invoke',\n {\n method: 'POST',\n credentials,\n body: {\n agent_name: agentName,\n tool_name: toolName,\n kwargs,\n },\n },\n config,\n );\n}\n\n// =============================================================================\n// File Upload\n// =============================================================================\n\n/**\n * Upload a file to a workspace\n */\nexport async function uploadFile(\n credentials: FlowstackCredentials,\n workspaceId: string,\n file: File,\n name?: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ dataset?: DatasetInfo; report?: ReportInfo }>> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n\n const formData = new FormData();\n formData.append('file', file);\n formData.append('workspace_id', workspaceId);\n if (name) {\n formData.append('name', name);\n formData.append('dataset_name', name);\n }\n\n try {\n const response = await fetch(`${baseUrl}/upload`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': tenantId,\n 'X-User-ID': credentials.userId || '',\n 'X-Session-ID': workspaceId,\n },\n body: formData,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n ok: false,\n status: response.status,\n error: errorText,\n };\n }\n\n const data = await response.json();\n return {\n ok: true,\n status: response.status,\n data,\n };\n } catch (error) {\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Upload failed',\n };\n }\n}\n\n/**\n * Upload a document (PDF/DOCX/image/etc.) to a workspace's uploads/ prefix.\n *\n * The two upload routes split by intent: `/upload` parses tabular formats into\n * a queryable DataFrame (dataset); `/upload-document` stores raw bytes for the\n * agent's `ingest_document` / `search_documents` tools. The chat input\n * accepts both kinds of file, so useAgent.query() must pick the right route\n * by extension or the backend 400s with \"Unsupported file type\".\n */\nexport async function uploadDocument(\n credentials: FlowstackCredentials,\n workspaceId: string,\n file: File,\n documentName?: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ document_name?: string; filename?: string; format?: string; size_bytes?: number; s3_key?: string }>> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n\n const formData = new FormData();\n formData.append('file', file);\n formData.append('workspace_id', workspaceId);\n if (documentName) formData.append('document_name', documentName);\n\n try {\n const response = await fetch(`${baseUrl}/upload-document`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': tenantId,\n 'X-User-ID': credentials.userId || '',\n 'X-Session-ID': workspaceId,\n },\n body: formData,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return { ok: false, status: response.status, error: errorText };\n }\n\n const data = await response.json();\n return { ok: true, status: response.status, data };\n } catch (error) {\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Document upload failed',\n };\n }\n}\n\n// =============================================================================\n// Authentication\n// =============================================================================\n\n/**\n * Login to get session token\n */\nexport async function login(\n email: string,\n password: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{\n session_token: string;\n user_id: string;\n access_token?: string;\n}>> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n\n try {\n const response = await fetch(`${baseUrl}/auth/user/login`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(config?.tenantId ? { 'X-Tenant-ID': config.tenantId } : {}),\n },\n body: JSON.stringify({\n email,\n password,\n ...(config?.appScope ? { app_scope: config.appScope } : {}),\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n ok: false,\n status: response.status,\n error: errorText,\n };\n }\n\n const data = await response.json();\n return {\n ok: true,\n status: response.status,\n data,\n };\n } catch (error) {\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Login failed',\n };\n }\n}\n\n/**\n * Register a new user\n */\nexport async function register(\n email: string,\n password: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ user_id: string; message?: string; session_token?: string; tenant_id?: string }>> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n\n try {\n const response = await fetch(`${baseUrl}/auth/user/register`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(config?.tenantId ? { 'X-Tenant-ID': config.tenantId } : {}),\n },\n body: JSON.stringify({\n email,\n password,\n skip_email_verification: true,\n ...(config?.appScope ? { app_scope: config.appScope } : {}),\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n ok: false,\n status: response.status,\n error: errorText,\n };\n }\n\n const data = await response.json();\n return {\n ok: true,\n status: response.status,\n data,\n };\n } catch (error) {\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Registration failed',\n };\n }\n}\n\n/**\n * Authenticate via Google OAuth authorization code.\n * Call this from the /api/auth/google/callback route after receiving the code from Google.\n */\nexport async function googleLogin(\n code: string,\n redirectUri: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ session_token: string; user_id: string; tenant_id?: string; expires_at?: string }>> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n\n try {\n const response = await fetch(`${baseUrl}/auth/google/login`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(config?.tenantId ? { 'X-Tenant-ID': config.tenantId } : {}),\n },\n body: JSON.stringify({ code, redirect_uri: redirectUri }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n ok: false,\n status: response.status,\n error: errorText,\n };\n }\n\n const data = await response.json();\n return {\n ok: true,\n status: response.status,\n data,\n };\n } catch (error) {\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Google login failed',\n };\n }\n}\n\n// =============================================================================\n// User Management Operations\n// =============================================================================\n\n/**\n * List users in the tenant with pagination and filtering\n */\nexport async function listUsers(\n credentials: FlowstackCredentials,\n params?: UserListParams,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<UserListResponse>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n\n // Build query string\n const queryParams = new URLSearchParams();\n if (params?.page) queryParams.set('page', String(params.page));\n if (params?.limit) queryParams.set('limit', String(params.limit));\n if (params?.search) queryParams.set('search', params.search);\n if (params?.role) queryParams.set('role', params.role);\n if (params?.status) queryParams.set('status', params.status);\n if (params?.sortBy) queryParams.set('sort_by', params.sortBy);\n if (params?.sortOrder) queryParams.set('sort_order', params.sortOrder);\n\n const queryString = queryParams.toString();\n const endpoint = `/tenants/${tenantId}/users${queryString ? `?${queryString}` : ''}`;\n\n return flowstackFetch<UserListResponse>(endpoint, { credentials }, config);\n}\n\n/**\n * Get a single user by ID\n */\nexport async function getUser(\n credentials: FlowstackCredentials,\n userId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ user: ManagedUser }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/${userId}`, { credentials }, config);\n}\n\n/**\n * Update a user's profile or role\n */\nexport async function updateUser(\n credentials: FlowstackCredentials,\n userId: string,\n updates: UpdateUserRequest,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ user: ManagedUser }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/${userId}`, {\n method: 'PATCH',\n credentials,\n body: updates,\n }, config);\n}\n\n/**\n * Delete a user permanently\n */\nexport async function deleteUser(\n credentials: FlowstackCredentials,\n userId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/${userId}`, {\n method: 'DELETE',\n credentials,\n }, config);\n}\n\n/**\n * Suspend a user account\n */\nexport async function suspendUser(\n credentials: FlowstackCredentials,\n userId: string,\n reason?: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ user: ManagedUser }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/${userId}/suspend`, {\n method: 'POST',\n credentials,\n body: reason ? { reason } : undefined,\n }, config);\n}\n\n/**\n * Reactivate a suspended user account\n */\nexport async function reactivateUser(\n credentials: FlowstackCredentials,\n userId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ user: ManagedUser }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/${userId}/reactivate`, {\n method: 'POST',\n credentials,\n }, config);\n}\n\n/**\n * Get user activity logs\n */\nexport async function getUserActivity(\n credentials: FlowstackCredentials,\n userId: string,\n limit: number = 50,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ activities: UserActivityLog[] }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/${userId}/activity?limit=${limit}`, {\n credentials,\n }, config);\n}\n\n/**\n * Get user statistics for the tenant\n */\nexport async function getUserStats(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<UserStats>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/stats`, { credentials }, config);\n}\n\n/**\n * Check if the current user has admin permissions to manage users\n */\nexport async function checkAdminPermissions(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ canManageUsers: boolean; role: string }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/me/permissions`, { credentials }, config);\n}\n\n// =============================================================================\n// Conversation History\n// =============================================================================\n\n/**\n * Get conversation history for a workspace/session\n */\nexport async function getConversationHistory(\n credentials: FlowstackCredentials,\n workspaceId: string,\n options?: { limit?: number; offset?: number },\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ messages: Array<{ role: string; content: string; timestamp: string }> }>> {\n const params = new URLSearchParams();\n params.set('session_id', workspaceId);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.offset) params.set('offset', String(options.offset));\n\n return flowstackFetch(\n `/conversations?${params.toString()}`,\n { method: 'GET', credentials },\n config\n );\n}\n\n// =============================================================================\n// Sites — Published websites and CDN management\n// =============================================================================\n\nexport interface CreateSiteParams {\n name: string;\n siteType?: 'on_demand' | 'daily' | 'js_build';\n description?: string;\n files?: Record<string, string>;\n}\n\n/**\n * List all published sites for the current user\n */\nexport async function listSites(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ sites: PublishedSiteInfo[]; count: number }>> {\n return flowstackFetch('/api/v1/sites', { method: 'GET', credentials }, config);\n}\n\n/**\n * Get a single published site by ID\n */\nexport async function getSite(\n credentials: FlowstackCredentials,\n siteId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ site: PublishedSiteInfo }>> {\n return flowstackFetch(`/api/v1/sites/${siteId}`, { method: 'GET', credentials }, config);\n}\n\n/**\n * Create a new site. If files are provided, publishes immediately.\n * Otherwise creates a staging area for incremental file uploads.\n */\nexport async function createSite(\n credentials: FlowstackCredentials,\n params: CreateSiteParams,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ site?: PublishedSiteInfo; site_id?: string; mode?: string }>> {\n return flowstackFetch('/api/v1/sites', {\n method: 'POST',\n credentials,\n body: {\n site_name: params.name,\n site_type: params.siteType || 'on_demand',\n description: params.description,\n files: params.files,\n },\n }, config);\n}\n\n/**\n * Add or update a single file in a site's staging area.\n * Call this for each file, then publishStagedSite() to deploy.\n */\nexport async function addSiteFile(\n credentials: FlowstackCredentials,\n siteId: string,\n filePath: string,\n content: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/files/${filePath}`, {\n method: 'PUT',\n credentials,\n body: { content },\n }, config);\n}\n\n/**\n * Publish a staged site to CDN. Call after adding all files with addSiteFile().\n */\nexport async function publishStagedSite(\n credentials: FlowstackCredentials,\n siteId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ site: PublishedSiteInfo }>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/publish`, {\n method: 'POST',\n credentials,\n }, config);\n}\n\n/**\n * Delete a published site and all its files from CDN\n */\nexport async function deleteSite(\n credentials: FlowstackCredentials,\n siteId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n return flowstackFetch(`/api/v1/sites/${siteId}`, {\n method: 'DELETE',\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Site Versioning\n// =============================================================================\n\nexport async function getSiteVersions(\n credentials: FlowstackCredentials,\n siteId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<SiteVersionManifest>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/versions`, {\n method: 'GET',\n credentials,\n }, config);\n}\n\nexport async function promoteSiteVersion(\n credentials: FlowstackCredentials,\n siteId: string,\n version: number,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<SiteVersionManifest>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/promote`, {\n method: 'POST',\n credentials,\n body: { version },\n }, config);\n}\n\nexport async function deleteSiteVersion(\n credentials: FlowstackCredentials,\n siteId: string,\n version: number,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<SiteVersionManifest>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/versions/${version}`, {\n method: 'DELETE',\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Site Aliases\n// =============================================================================\n\nexport async function setSiteAlias(\n credentials: FlowstackCredentials,\n siteId: string,\n alias: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ alias: string; url: string }>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/alias`, {\n method: 'POST',\n credentials,\n body: { alias },\n }, config);\n}\n\nexport async function removeSiteAlias(\n credentials: FlowstackCredentials,\n siteId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/alias`, {\n method: 'DELETE',\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Publish to GitHub\n// =============================================================================\n\nexport async function publishToGitHub(\n credentials: FlowstackCredentials,\n siteId: string,\n params: PublishToGitHubParams,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<PublishToGitHubResult>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/publish-github`, {\n method: 'POST',\n credentials,\n body: {\n repo_name: params.repoName,\n private: params.isPrivate ?? true,\n ...(params.version != null ? { version: params.version } : {}),\n },\n }, config);\n}\n\n// =============================================================================\n// GitHub Repository Import\n// =============================================================================\n\nexport async function listGitHubRepos(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ repos: GitHubRepo[] }>> {\n return flowstackFetch('/api/v1/github/repos', {\n credentials,\n }, config);\n}\n\nexport async function importFromGitHub(\n credentials: FlowstackCredentials,\n params: { repoFullName: string; branch?: string; workspaceId?: string },\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ files_imported: number }>> {\n return flowstackFetch('/api/v1/github/import', {\n method: 'POST',\n credentials,\n body: params,\n }, config);\n}\n\n// =============================================================================\n// PII Settings\n// =============================================================================\n\nexport async function getPiiSettings(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ settings: PiiSettings }>> {\n return flowstackFetch(`/api/v1/workspaces/${workspaceId}/pii-settings`, {\n credentials,\n }, config);\n}\n\nexport async function updatePiiSettings(\n credentials: FlowstackCredentials,\n workspaceId: string,\n settings: PiiSettings,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n return flowstackFetch(`/api/v1/workspaces/${workspaceId}/pii-settings`, {\n method: 'PUT',\n credentials,\n body: settings,\n }, config);\n}\n\n// P0-57: PII preview — detect entities without masking\nexport async function previewPiiMasking(\n credentials: FlowstackCredentials,\n query: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ entities: PiiRedactedEntity[] }>> {\n // Guard: skip if credentials not yet loaded (prevents \"Not enough segments\" 401 spam\n // when built apps call this on mount before Privy has issued a valid token)\n if (!credentials?.apiKey || credentials.apiKey.split('.').length !== 3) {\n return { ok: false, error: 'Not authenticated', status: 401 };\n }\n return flowstackFetch('/stream/pii-preview', {\n method: 'POST',\n credentials,\n body: { query },\n }, config);\n}\n\n// P0-57: PII allowlist CRUD\nexport async function getPiiAllowlist(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ allowlist: Array<{ term: string; entity_type: string }> }>> {\n return flowstackFetch(`/api/v1/workspaces/${workspaceId}/pii-allowlist`, {\n credentials,\n }, config);\n}\n\nexport async function addPiiAllowlistTerm(\n credentials: FlowstackCredentials,\n workspaceId: string,\n term: string,\n entityType: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean; allowlist: Array<{ term: string; entity_type: string }> }>> {\n return flowstackFetch(`/api/v1/workspaces/${workspaceId}/pii-allowlist`, {\n method: 'POST',\n credentials,\n body: { term, entity_type: entityType },\n }, config);\n}\n\nexport async function removePiiAllowlistTerm(\n credentials: FlowstackCredentials,\n workspaceId: string,\n term: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean; allowlist: Array<{ term: string; entity_type: string }> }>> {\n return flowstackFetch(`/api/v1/workspaces/${workspaceId}/pii-allowlist`, {\n method: 'DELETE',\n credentials,\n body: { term },\n }, config);\n}\n\n// =============================================================================\n// User Data Explorer\n// =============================================================================\n\nexport async function getUserDataOverview(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<UserDataOverview>> {\n return flowstackFetch('/api/v1/user/data-overview', {\n credentials,\n }, config);\n}\n\nexport async function getUserCollections(\n credentials: FlowstackCredentials,\n params?: { siteId?: string; includeSchema?: boolean },\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ collections: UserCollectionInfo[]; grouped_by_site: Record<string, UserCollectionInfo[]> }>> {\n const query = new URLSearchParams();\n if (params?.siteId) query.set('site_id', params.siteId);\n if (params?.includeSchema) query.set('include_schema', 'true');\n const qs = query.toString();\n return flowstackFetch(`/api/v1/user/collections${qs ? `?${qs}` : ''}`, {\n credentials,\n }, config);\n}\n\nexport async function getUserCollectionDocuments<T = Record<string, any>>(\n credentials: FlowstackCredentials,\n collection: string,\n params?: { filter?: Record<string, any>; limit?: number; skip?: number; sort?: Record<string, 1 | -1>; database?: string },\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ documents: T[]; total: number }>> {\n const query = new URLSearchParams();\n if (params?.filter) query.set('filter', JSON.stringify(params.filter));\n if (params?.limit != null) query.set('limit', String(params.limit));\n if (params?.skip != null) query.set('skip', String(params.skip));\n if (params?.sort) query.set('sort', JSON.stringify(params.sort));\n if (params?.database) query.set('database', params.database);\n const qs = query.toString();\n return flowstackFetch(`/api/v1/user/collections/${encodeURIComponent(collection)}/documents${qs ? `?${qs}` : ''}`, {\n credentials,\n }, config);\n}\n\nexport async function getUserCollectionSchema(\n credentials: FlowstackCredentials,\n collection: string,\n params?: { database?: string; sampleSize?: number },\n config?: FlowstackClientConfig\n): Promise<ApiResponse<CollectionSchemaInfo>> {\n const query = new URLSearchParams();\n if (params?.database) query.set('database', params.database);\n if (params?.sampleSize != null) query.set('sample_size', String(params.sampleSize));\n const qs = query.toString();\n return flowstackFetch(`/api/v1/user/collections/${encodeURIComponent(collection)}/schema${qs ? `?${qs}` : ''}`, {\n credentials,\n }, config);\n}\n\nexport async function deleteUserCollection(\n credentials: FlowstackCredentials,\n collection: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ deleted: boolean; collection: string }>> {\n return flowstackFetch(`/api/v1/user/collections/${encodeURIComponent(collection)}?confirm=true`, {\n method: 'DELETE',\n credentials,\n }, config);\n}\n\nexport async function exportUserCollection(\n credentials: FlowstackCredentials,\n collection: string,\n params?: { format?: 'json' | 'csv'; filter?: Record<string, any>; database?: string },\n config?: FlowstackClientConfig\n): Promise<ApiResponse<Blob>> {\n const query = new URLSearchParams();\n if (params?.database) query.set('database', params.database);\n const qs = query.toString();\n return flowstackFetch(`/api/v1/user/collections/${encodeURIComponent(collection)}/export${qs ? `?${qs}` : ''}`, {\n method: 'POST',\n credentials,\n body: {\n format: params?.format || 'json',\n filter: params?.filter || null,\n },\n }, config);\n}\n","/**\n * Storage utilities for credential and state persistence\n * Supports both localStorage and sessionStorage with user-scoped isolation\n */\n\nimport type { FlowstackCredentials } from '../types';\n\n// Storage key constants\nconst CREDENTIALS_KEY = 'flowstack_credentials';\nconst WORKSPACE_KEY = 'flowstack_workspace';\nconst MESSAGES_KEY = 'flowstack_messages';\n\n/**\n * Get the storage adapter (localStorage or sessionStorage)\n * @param type - Storage type ('local' or 'session')\n * @returns Storage object or null if not available\n */\nfunction getStorage(type: 'local' | 'session' = 'local'): Storage | null {\n if (typeof window === 'undefined') return null;\n\n try {\n const storage = type === 'local' ? window.localStorage : window.sessionStorage;\n // Test if storage is accessible\n storage.setItem('__test__', '__test__');\n storage.removeItem('__test__');\n return storage;\n } catch {\n console.warn(`[Storage] ${type}Storage not available`);\n return null;\n }\n}\n\n/**\n * Extract user ID from credentials for storage isolation\n * @param credentials - User credentials\n * @returns User-specific storage key prefix\n */\nfunction getUserPrefix(credentials: FlowstackCredentials | null): string {\n if (!credentials?.userId) return '';\n return `${credentials.userId.substring(0, 16)}:`;\n}\n\n/**\n * Get user-scoped storage key\n * @param baseKey - Base key name\n * @param credentials - User credentials for scoping\n * @returns Scoped storage key\n */\nfunction getScopedKey(baseKey: string, credentials: FlowstackCredentials | null): string {\n return `${getUserPrefix(credentials)}${baseKey}`;\n}\n\n// =============================================================================\n// Credentials Storage\n// =============================================================================\n\n/**\n * Save credentials to storage\n * @param credentials - Credentials to save\n * @param storageType - Storage type ('local' or 'session')\n */\nexport function saveCredentials(\n credentials: FlowstackCredentials,\n storageType: 'local' | 'session' = 'local'\n): void {\n const storage = getStorage(storageType);\n if (!storage) return;\n\n try {\n storage.setItem(CREDENTIALS_KEY, JSON.stringify(credentials));\n } catch (error) {\n console.error('[Storage] Failed to save credentials:', error);\n }\n}\n\n/**\n * Load credentials from storage\n * @param storageType - Storage type ('local' or 'session')\n * @returns Stored credentials or null\n */\nexport function loadCredentials(\n storageType: 'local' | 'session' = 'local'\n): FlowstackCredentials | null {\n const storage = getStorage(storageType);\n if (!storage) return null;\n\n try {\n const stored = storage.getItem(CREDENTIALS_KEY);\n if (!stored) return null;\n\n const credentials = JSON.parse(stored) as FlowstackCredentials;\n\n // Check if expired\n if (credentials.expiresAt) {\n const expiresAt = new Date(credentials.expiresAt);\n if (expiresAt < new Date()) {\n console.log('[Storage] Credentials expired, clearing');\n clearCredentials(storageType);\n return null;\n }\n }\n\n return credentials;\n } catch (error) {\n console.error('[Storage] Failed to load credentials:', error);\n return null;\n }\n}\n\n/**\n * Clear credentials from storage\n * @param storageType - Storage type ('local' or 'session')\n */\nexport function clearCredentials(storageType: 'local' | 'session' = 'local'): void {\n const storage = getStorage(storageType);\n if (!storage) return;\n\n try {\n storage.removeItem(CREDENTIALS_KEY);\n } catch (error) {\n console.error('[Storage] Failed to clear credentials:', error);\n }\n}\n\n// =============================================================================\n// Workspace Storage\n// =============================================================================\n\n/**\n * Save selected workspace ID to storage\n * @param workspaceId - Workspace ID to save\n * @param credentials - User credentials for scoping\n * @param storageType - Storage type\n */\nexport function saveSelectedWorkspace(\n workspaceId: string,\n credentials: FlowstackCredentials | null,\n storageType: 'local' | 'session' = 'local'\n): void {\n const storage = getStorage(storageType);\n if (!storage) return;\n\n try {\n const key = getScopedKey(WORKSPACE_KEY, credentials);\n storage.setItem(key, workspaceId);\n } catch (error) {\n console.error('[Storage] Failed to save workspace:', error);\n }\n}\n\n/**\n * Load selected workspace ID from storage\n * @param credentials - User credentials for scoping\n * @param storageType - Storage type\n * @returns Workspace ID or null\n */\nexport function loadSelectedWorkspace(\n credentials: FlowstackCredentials | null,\n storageType: 'local' | 'session' = 'local'\n): string | null {\n const storage = getStorage(storageType);\n if (!storage) return null;\n\n try {\n const key = getScopedKey(WORKSPACE_KEY, credentials);\n return storage.getItem(key);\n } catch (error) {\n console.error('[Storage] Failed to load workspace:', error);\n return null;\n }\n}\n\n/**\n * Clear selected workspace from storage\n * @param credentials - User credentials for scoping\n * @param storageType - Storage type\n */\nexport function clearSelectedWorkspace(\n credentials: FlowstackCredentials | null,\n storageType: 'local' | 'session' = 'local'\n): void {\n const storage = getStorage(storageType);\n if (!storage) return;\n\n try {\n const key = getScopedKey(WORKSPACE_KEY, credentials);\n storage.removeItem(key);\n } catch (error) {\n console.error('[Storage] Failed to clear workspace:', error);\n }\n}\n\n// =============================================================================\n// Messages Storage (optional persistence)\n// =============================================================================\n\n/**\n * Save chat messages to storage\n * @param messages - Messages to save\n * @param workspaceId - Workspace ID for scoping\n * @param credentials - User credentials for scoping\n * @param storageType - Storage type\n */\nexport function saveMessages<T>(\n messages: T[],\n workspaceId: string,\n credentials: FlowstackCredentials | null,\n storageType: 'local' | 'session' = 'session'\n): void {\n const storage = getStorage(storageType);\n if (!storage) return;\n\n try {\n const key = getScopedKey(`${MESSAGES_KEY}:${workspaceId}`, credentials);\n const data = JSON.stringify(messages);\n try {\n storage.setItem(key, data);\n } catch (quotaError) {\n // Storage full — keep only the last 20 messages and retry\n if (messages.length > 20) {\n const trimmed = messages.slice(-20);\n storage.setItem(key, JSON.stringify(trimmed));\n } else {\n // Can't trim further — clear all flowstack storage and retry\n for (let i = storage.length - 1; i >= 0; i--) {\n const k = storage.key(i);\n if (k && k.includes('flowstack')) storage.removeItem(k);\n }\n storage.setItem(key, data);\n }\n }\n } catch (error) {\n // Silently fail — storage is best-effort for the web demo\n }\n}\n\n/**\n * Load chat messages from storage\n * @param workspaceId - Workspace ID for scoping\n * @param credentials - User credentials for scoping\n * @param storageType - Storage type\n * @returns Messages array or empty array\n */\nexport function loadMessages<T>(\n workspaceId: string,\n credentials: FlowstackCredentials | null,\n storageType: 'local' | 'session' = 'session'\n): T[] {\n const storage = getStorage(storageType);\n if (!storage) return [];\n\n try {\n const key = getScopedKey(`${MESSAGES_KEY}:${workspaceId}`, credentials);\n const stored = storage.getItem(key);\n return stored ? JSON.parse(stored) : [];\n } catch (error) {\n console.error('[Storage] Failed to load messages:', error);\n return [];\n }\n}\n\n/**\n * Clear chat messages from storage\n * @param workspaceId - Workspace ID for scoping\n * @param credentials - User credentials for scoping\n * @param storageType - Storage type\n */\nexport function clearMessages(\n workspaceId: string,\n credentials: FlowstackCredentials | null,\n storageType: 'local' | 'session' = 'session'\n): void {\n const storage = getStorage(storageType);\n if (!storage) return;\n\n try {\n const key = getScopedKey(`${MESSAGES_KEY}:${workspaceId}`, credentials);\n storage.removeItem(key);\n } catch (error) {\n console.error('[Storage] Failed to clear messages:', error);\n }\n}\n\n// =============================================================================\n// Generic Storage Utilities\n// =============================================================================\n\n/**\n * Set an item in storage with optional expiry\n * @param key - Storage key\n * @param value - Value to store\n * @param ttlMs - Time to live in milliseconds (optional)\n * @param storageType - Storage type\n */\nexport function setItem<T>(\n key: string,\n value: T,\n ttlMs?: number,\n storageType: 'local' | 'session' = 'local'\n): void {\n const storage = getStorage(storageType);\n if (!storage) return;\n\n try {\n const item = ttlMs\n ? { value, expiresAt: Date.now() + ttlMs }\n : { value };\n storage.setItem(key, JSON.stringify(item));\n } catch (error) {\n console.error(`[Storage] Failed to set ${key}:`, error);\n }\n}\n\n/**\n * Get an item from storage\n * @param key - Storage key\n * @param storageType - Storage type\n * @returns Stored value or null\n */\nexport function getItem<T>(\n key: string,\n storageType: 'local' | 'session' = 'local'\n): T | null {\n const storage = getStorage(storageType);\n if (!storage) return null;\n\n try {\n const stored = storage.getItem(key);\n if (!stored) return null;\n\n const item = JSON.parse(stored) as { value: T; expiresAt?: number };\n\n // Check expiry\n if (item.expiresAt && Date.now() > item.expiresAt) {\n storage.removeItem(key);\n return null;\n }\n\n return item.value;\n } catch (error) {\n console.error(`[Storage] Failed to get ${key}:`, error);\n return null;\n }\n}\n\n/**\n * Remove an item from storage\n * @param key - Storage key\n * @param storageType - Storage type\n */\nexport function removeItem(key: string, storageType: 'local' | 'session' = 'local'): void {\n const storage = getStorage(storageType);\n if (!storage) return;\n\n try {\n storage.removeItem(key);\n } catch (error) {\n console.error(`[Storage] Failed to remove ${key}:`, error);\n }\n}\n\n/**\n * Clear all Flowstack-related items from storage. P0-72: also clears\n * `privy:*` keys as a belt-and-suspenders sweep so a logout always leaves\n * a clean slate for the next login attempt — even if Privy's own\n * `logout()` call missed a key. Without this, a Flowstack-only clear\n * left Privy's sticky session in place and silently re-authed the\n * same wallet on the next click.\n * @param storageType - Storage type\n */\nexport function clearAllFlowstackData(storageType: 'local' | 'session' = 'local'): void {\n const storage = getStorage(storageType);\n if (!storage) return;\n\n try {\n const keysToRemove: string[] = [];\n for (let i = 0; i < storage.length; i++) {\n const key = storage.key(i);\n if (key?.startsWith('flowstack_') || key?.startsWith('privy:')) {\n keysToRemove.push(key);\n }\n }\n keysToRemove.forEach(key => storage.removeItem(key));\n } catch (error) {\n console.error('[Storage] Failed to clear all data:', error);\n }\n}\n","/**\n * Mock Fixtures for Development Mode\n *\n * Provides realistic test data for development without a backend.\n */\n\nimport type {\n FlowstackCredentials,\n WorkspaceInfo,\n DatasetInfo,\n VisualizationData,\n ChatMessage,\n DataSource,\n User,\n ManagedUser,\n UserStats,\n UserActivityLog,\n} from '../types';\n\n/**\n * Mock user credentials\n */\nexport const mockCredentials: FlowstackCredentials = {\n apiKey: 'mock_session_token_abc123',\n tenantId: 't_mock_tenant',\n userId: 'user_mock_123',\n email: 'demo@example.com',\n expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),\n};\n\n/**\n * Mock user derived from credentials\n */\nexport const mockUser: User = {\n id: 'user_mock_123',\n email: 'demo@example.com',\n tenantId: 't_mock_tenant',\n expiresAt: mockCredentials.expiresAt,\n};\n\n/**\n * Mock workspaces\n */\nexport const mockWorkspaces: WorkspaceInfo[] = [\n {\n workspaceId: 'ws_demo_1',\n name: 'Demo Workspace',\n description: 'A demo workspace for testing',\n datasetCount: 3,\n visualizationCount: 5,\n modelCount: 1,\n createdAt: '2024-01-15T10:00:00Z',\n lastAccessed: new Date().toISOString(),\n },\n {\n workspaceId: 'ws_analytics',\n name: 'Analytics Project',\n description: 'Customer analytics and insights',\n datasetCount: 7,\n visualizationCount: 12,\n modelCount: 2,\n createdAt: '2024-02-20T14:30:00Z',\n lastAccessed: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString(),\n },\n {\n workspaceId: 'ws_ml_project',\n name: 'ML Experiments',\n description: 'Machine learning model experiments',\n datasetCount: 5,\n visualizationCount: 8,\n modelCount: 4,\n createdAt: '2024-03-10T09:15:00Z',\n lastAccessed: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(),\n },\n];\n\n/**\n * Mock datasets\n */\nexport const mockDatasets: DatasetInfo[] = [\n {\n id: 'ds_customers',\n name: 'customers',\n rows: 10000,\n columns: 12,\n columnNames: ['id', 'name', 'email', 'created_at', 'country', 'segment', 'revenue', 'orders', 'last_order', 'lifetime_value', 'churn_risk', 'status'],\n schema: {\n id: { type: 'string', nullable: false, unique: true },\n name: { type: 'string', nullable: false },\n email: { type: 'string', nullable: false },\n created_at: { type: 'date', nullable: false },\n country: { type: 'string', nullable: true },\n segment: { type: 'string', nullable: true },\n revenue: { type: 'number', nullable: false },\n orders: { type: 'number', nullable: false },\n last_order: { type: 'date', nullable: true },\n lifetime_value: { type: 'number', nullable: false },\n churn_risk: { type: 'number', nullable: true },\n status: { type: 'string', nullable: false },\n },\n createdAt: '2024-01-15T10:30:00Z',\n updatedAt: '2024-03-15T08:00:00Z',\n },\n {\n id: 'ds_orders',\n name: 'orders',\n rows: 50000,\n columns: 8,\n columnNames: ['order_id', 'customer_id', 'order_date', 'total', 'status', 'items', 'shipping_country', 'payment_method'],\n createdAt: '2024-01-20T11:00:00Z',\n updatedAt: '2024-03-14T16:45:00Z',\n },\n {\n id: 'ds_products',\n name: 'products',\n rows: 500,\n columns: 10,\n columnNames: ['product_id', 'name', 'category', 'price', 'cost', 'stock', 'rating', 'reviews', 'created_at', 'is_active'],\n createdAt: '2024-02-01T09:00:00Z',\n updatedAt: '2024-03-10T14:20:00Z',\n },\n];\n\n/**\n * Mock visualizations\n */\nexport const mockVisualizations: VisualizationData[] = [\n {\n name: 'Revenue by Month',\n type: 'line_chart',\n format: 'png',\n createdAt: '2024-03-15T10:00:00Z',\n metadata: { xAxis: 'month', yAxis: 'revenue' },\n },\n {\n name: 'Customer Segments',\n type: 'pie_chart',\n format: 'png',\n createdAt: '2024-03-14T15:30:00Z',\n metadata: { dimension: 'segment', measure: 'count' },\n },\n {\n name: 'Orders Heatmap',\n type: 'heatmap',\n format: 'png',\n createdAt: '2024-03-13T11:45:00Z',\n metadata: { xAxis: 'day_of_week', yAxis: 'hour' },\n },\n];\n\n/**\n * Mock data sources\n */\nexport const mockDataSources: DataSource[] = [\n {\n source_id: 'src_mongodb_1',\n tenant_id: 't_mock_tenant',\n source_type: 'mongodb',\n name: 'Production MongoDB',\n auth_method: 'connection_string',\n is_tenant_wide: true,\n created_at: Date.now() - 30 * 24 * 60 * 60 * 1000,\n credentials_preview: { host: 'mongodb.example.com', database: 'production' },\n },\n {\n source_id: 'src_postgres_1',\n tenant_id: 't_mock_tenant',\n source_type: 'postgresql',\n name: 'Analytics Database',\n auth_method: 'connection_string',\n is_tenant_wide: false,\n user_id: 'user_mock_123',\n created_at: Date.now() - 14 * 24 * 60 * 60 * 1000,\n credentials_preview: { host: 'pg.example.com', database: 'analytics' },\n },\n];\n\n/**\n * Mock chat messages (for demo)\n */\nexport const mockChatHistory: ChatMessage[] = [\n {\n id: 'msg_1',\n role: 'user',\n content: 'What are my top customers by revenue?',\n timestamp: new Date(Date.now() - 5 * 60 * 1000),\n },\n {\n id: 'msg_2',\n role: 'assistant',\n content: 'I analyzed the customers dataset and found your top 10 customers by revenue. Here are the results:\\n\\n1. Acme Corp - $125,000\\n2. TechStart Inc - $98,500\\n3. Global Retail - $87,200\\n...',\n timestamp: new Date(Date.now() - 4 * 60 * 1000),\n toolCalls: [\n {\n id: 'tool_1',\n name: 'query_dataset',\n args: { dataset: 'customers', query: 'SELECT * FROM customers ORDER BY revenue DESC LIMIT 10' },\n result: { rows: 10 },\n status: 'complete',\n },\n ],\n },\n];\n\n/**\n * Generate a unique ID for mock data\n */\nexport function generateMockId(prefix: string = 'mock'): string {\n return `${prefix}_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Simulate network delay for realistic mock responses\n */\nexport function mockDelay(minMs: number = 100, maxMs: number = 500): Promise<void> {\n const delay = Math.random() * (maxMs - minMs) + minMs;\n return new Promise((resolve) => setTimeout(resolve, delay));\n}\n\n// =============================================================================\n// User Management Mock Data\n// =============================================================================\n\n/**\n * Mock managed users for admin dashboard\n */\nexport const mockManagedUsers: ManagedUser[] = [\n {\n id: 'user_mock_123',\n email: 'demo@example.com',\n name: 'Demo User',\n role: 'owner',\n status: 'active',\n tenantId: 't_mock_tenant',\n createdAt: '2024-01-01T10:00:00Z',\n lastLoginAt: new Date().toISOString(),\n lastActivityAt: new Date().toISOString(),\n metadata: { plan: 'pro', company: 'Demo Inc' },\n },\n {\n id: 'user_admin_456',\n email: 'admin@example.com',\n name: 'Admin User',\n role: 'admin',\n status: 'active',\n tenantId: 't_mock_tenant',\n createdAt: '2024-01-15T14:30:00Z',\n lastLoginAt: new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString(),\n lastActivityAt: new Date(Date.now() - 30 * 60 * 1000).toISOString(),\n },\n {\n id: 'user_member_789',\n email: 'member@example.com',\n name: 'Team Member',\n role: 'member',\n status: 'active',\n tenantId: 't_mock_tenant',\n createdAt: '2024-02-10T09:00:00Z',\n lastLoginAt: new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString(),\n lastActivityAt: new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString(),\n },\n {\n id: 'user_suspended_101',\n email: 'suspended@example.com',\n name: 'Suspended User',\n role: 'member',\n status: 'suspended',\n tenantId: 't_mock_tenant',\n createdAt: '2024-02-20T11:00:00Z',\n lastLoginAt: '2024-03-01T08:00:00Z',\n metadata: { suspendReason: 'Policy violation' },\n },\n {\n id: 'user_pending_102',\n email: 'pending@example.com',\n name: 'New User',\n role: 'viewer',\n status: 'pending_verification',\n tenantId: 't_mock_tenant',\n createdAt: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString(),\n },\n];\n\n/**\n * Mock user statistics\n */\nexport const mockUserStats: UserStats = {\n totalUsers: 127,\n activeUsers: 98,\n usersByRole: {\n owner: 1,\n admin: 5,\n member: 85,\n viewer: 36,\n },\n usersByStatus: {\n active: 98,\n suspended: 8,\n pending_verification: 15,\n deactivated: 6,\n },\n newUsersThisMonth: 23,\n dailyActiveUsers: [45, 52, 48, 61, 55, 43, 38, 67, 72, 58, 63, 71, 65, 54],\n};\n\n/**\n * Mock user activity logs\n */\nexport const mockUserActivity: UserActivityLog[] = [\n {\n id: 'act_1',\n userId: 'user_mock_123',\n activityType: 'login',\n description: 'Logged in from Chrome on macOS',\n timestamp: new Date().toISOString(),\n },\n {\n id: 'act_2',\n userId: 'user_mock_123',\n activityType: 'query_execute',\n description: 'Executed query: \"Show top customers\"',\n timestamp: new Date(Date.now() - 30 * 60 * 1000).toISOString(),\n resourceType: 'workspace',\n resourceId: 'ws_demo_1',\n },\n {\n id: 'act_3',\n userId: 'user_mock_123',\n activityType: 'dataset_upload',\n description: 'Uploaded dataset: sales_data.csv',\n timestamp: new Date(Date.now() - 60 * 60 * 1000).toISOString(),\n resourceType: 'dataset',\n resourceId: 'ds_sales',\n },\n {\n id: 'act_4',\n userId: 'user_mock_123',\n activityType: 'workspace_create',\n description: 'Created workspace: Analytics Project',\n timestamp: new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString(),\n resourceType: 'workspace',\n resourceId: 'ws_analytics',\n },\n {\n id: 'act_5',\n userId: 'user_mock_123',\n activityType: 'logout',\n description: 'Logged out',\n timestamp: new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString(),\n },\n];\n","'use client';\n\n/**\n * Flowstack SDK Provider\n *\n * Main context provider that manages all SDK state including:\n * - Authentication (credentials, session)\n * - Workspaces (list, selection, creation)\n * - Chat messages with persistence\n * - Datasets, visualizations, reports, models\n * - Query execution state\n */\n\nimport React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useEffect,\n ReactNode,\n} from 'react';\n\nimport type {\n FlowstackConfig,\n FlowstackCredentials,\n FlowstackContextValue,\n ChatMessage,\n WorkspaceInfo,\n DatasetInfo,\n VisualizationData,\n ReportInfo,\n ModelInfo,\n ScriptInfo,\n SessionState,\n} from '../types';\n\nimport {\n listWorkspaces,\n createWorkspace as apiCreateWorkspace,\n listDatasets,\n listVisualizations,\n listReports,\n listModels,\n listScripts,\n} from '../api/client';\n\nimport {\n saveCredentials,\n loadCredentials,\n clearCredentials,\n saveSelectedWorkspace,\n loadSelectedWorkspace,\n clearSelectedWorkspace,\n saveMessages,\n loadMessages,\n clearMessages as clearStoredMessages,\n clearAllFlowstackData,\n} from '../utils/storage';\n\nimport {\n mockCredentials,\n mockWorkspaces,\n mockDatasets,\n mockVisualizations,\n mockDelay,\n generateMockId,\n} from '../mock/fixtures';\n\n// Default configuration\nconst DEFAULT_BASE_URL = 'https://sage-api.flowstack.fun';\n// NOTE: there is intentionally no DEFAULT_TENANT_ID. For authenticated calls the\n// backend derives tenant_id from the JWT/API key and ignores any client-sent\n// X-Tenant-ID, so a default is pointless there. The only case that needs an\n// explicit tenant is anonymous access (usePublicCollection) — and silently\n// defaulting that to a real platform tenant would route a misconfigured app's\n// public data into the wrong pool. So tenant is JWT-derived or explicitly set.\n\n/**\n * Normalize workspace object from backend (snake_case) to SDK (camelCase).\n * The backend returns workspace_id, dataset_count, etc. but the SDK type expects camelCase.\n */\nfunction normalizeWorkspace(ws: any): WorkspaceInfo {\n return {\n workspaceId: ws.workspaceId || ws.workspace_id || ws.id || '',\n name: ws.name || '',\n description: ws.description,\n datasetCount: ws.datasetCount ?? ws.dataset_count ?? 0,\n visualizationCount: ws.visualizationCount ?? ws.visualization_count ?? 0,\n modelCount: ws.modelCount ?? ws.model_count ?? 0,\n createdAt: ws.createdAt || ws.created_at || '',\n lastAccessed: ws.lastAccessed || ws.last_accessed || '',\n };\n}\n\n/** Check if a URL is a valid presigned S3 URL (not raw/unsigned). */\nfunction isPresignedUrl(url?: string): boolean {\n return !!url && url.includes('X-Amz-');\n}\n\n/** Normalize visualization object from backend snake_case to SDK camelCase. */\nfunction normalizeVisualization(v: any): VisualizationData {\n const meta = v.metadata || {};\n // Presigned URLs first — they have auth. Unsigned S3 URLs will AccessDenied.\n const imageUrl =\n v.presigned_url || meta.presigned_url ||\n v.imageUrl || v.image_url ||\n (v.url && !v.url.includes('s3.amazonaws.com') ? v.url : undefined) ||\n (meta.url && !meta.url.includes('s3.amazonaws.com') ? meta.url : undefined) ||\n meta.image_url ||\n undefined;\n return {\n name: v.name || '',\n type: v.type || v.visualization_type || v.chart_type || meta.chart_type,\n imageUrl,\n imageBase64: v.imageBase64 || v.image_base64 || meta.image_base64,\n format: v.format || meta.format,\n createdAt: v.createdAt || v.created_at || meta.created_at,\n metadata: v.metadata,\n };\n}\n\n/** Normalize dataset object from backend to SDK format. */\nfunction normalizeDataset(d: any): DatasetInfo {\n // Backend returns shape: [rows, cols] and columns: [\"col1\", \"col2\", ...]\n const shape = d.shape || [];\n const colArray = Array.isArray(d.columns) ? d.columns : d.column_names || d.columns_list || [];\n const rowCount = d.rows ?? d.row_count ?? d.num_rows ?? d.size ?? (shape[0] || 0);\n const colCount = typeof d.columns === 'number' ? d.columns : (d.column_count ?? d.num_columns ?? shape[1] ?? colArray.length ?? 0);\n return {\n ...d,\n id: d.id || d.dataset_id,\n name: d.name || d.dataset_name || '',\n rows: rowCount,\n columns: colCount,\n columnNames: colArray,\n createdAt: d.createdAt || d.created_at,\n fileSize: d.fileSize || d.file_size || d.size,\n schema: d.schema || d.dtypes,\n };\n}\n\n// Context instance\nconst FlowstackContext = createContext<FlowstackContextValue | null>(null);\n\n/**\n * Extract user ID from JWT or API key\n */\nfunction extractUserId(apiKey: string): string {\n try {\n // JWT token - extract from payload\n if (apiKey.includes('.')) {\n const parts = apiKey.split('.');\n if (parts.length === 3) {\n try {\n const payload = JSON.parse(atob(parts[1]));\n if (payload.user_id) return String(payload.user_id);\n } catch {\n // JWT decode failed\n }\n }\n }\n\n // Legacy API key format\n if (apiKey.startsWith('sage_t_')) {\n return apiKey.substring(7, 23);\n } else if (apiKey.startsWith('sage_')) {\n return apiKey.substring(5, 21);\n }\n\n // Fallback\n return apiKey.substring(0, 16);\n } catch {\n return apiKey.substring(0, 16);\n }\n}\n\n/**\n * Derive tenant_id from a JWT's payload (browser-safe, no jsonwebtoken dep).\n * Returns undefined when it can't be derived — callers fall back to an explicitly\n * configured tenantId, never to a hardcoded platform tenant.\n */\nfunction extractTenantId(apiKey?: string | null): string | undefined {\n if (!apiKey || !apiKey.includes('.')) return undefined;\n try {\n const parts = apiKey.split('.');\n if (parts.length === 3) {\n const payload = JSON.parse(atob(parts[1]));\n if (payload.tenant_id) return String(payload.tenant_id);\n }\n } catch {\n // not a decodable JWT — caller falls back to configured tenantId\n }\n return undefined;\n}\n\n/**\n * Check if credentials are expired\n */\nfunction isExpired(credentials: FlowstackCredentials): boolean {\n if (!credentials.expiresAt) {\n // Try to extract from JWT\n if (credentials.apiKey.includes('.')) {\n try {\n const parts = credentials.apiKey.split('.');\n const payload = JSON.parse(atob(parts[1]));\n if (payload.exp) {\n return Date.now() > payload.exp * 1000;\n }\n } catch {\n return false;\n }\n }\n return false;\n }\n\n const expiresAt = new Date(credentials.expiresAt);\n return expiresAt < new Date();\n}\n\n/**\n * FlowstackProvider Props\n */\ninterface FlowstackProviderProps {\n children: ReactNode;\n config: FlowstackConfig;\n /**\n * P0-72: Optional Privy auth state passed from the parent. When provided,\n * FlowstackProvider cross-validates stored credentials against Privy on\n * mount — if Privy says \"not authenticated\", stale Flowstack creds are\n * cleared instead of blindly hydrated. This eliminates the 4-minute 401\n * request storm on cold load when Privy's session is absent but\n * sessionStorage still has `flowstack_credentials`.\n *\n * When omitted (e.g., SIWE-only mode, tests), the provider falls back\n * to the legacy behavior of trusting sessionStorage.\n */\n privyAuthState?: {\n ready: boolean;\n authenticated: boolean;\n };\n}\n\n/**\n * Flowstack Provider Component\n *\n * Wrap your app with this provider to enable all Flowstack SDK features.\n *\n * @example\n * ```tsx\n * <FlowstackProvider config={{ jwtSecret: process.env.JWT_SECRET! }}>\n * <App />\n * </FlowstackProvider>\n * ```\n */\nexport function FlowstackProvider({\n children,\n config,\n privyAuthState,\n}: FlowstackProviderProps) {\n // Configuration\n const baseUrl = config.baseUrl || DEFAULT_BASE_URL;\n // Empty string (not a real tenant) when unset — authenticated calls ignore the\n // X-Tenant-ID header (backend uses the JWT), and usePublicCollection hard-errors\n // on an empty tenant rather than silently using a platform default.\n const tenantId = config.tenantId || '';\n const isMockMode = config.mode === 'mock';\n\n // Auth state\n const [credentials, setCredentialsState] = useState<FlowstackCredentials | null>(null);\n const [isInitialized, setIsInitialized] = useState(false);\n\n // Session state\n const [session, setSession] = useState<SessionState>({\n sessionId: null,\n workspaceId: null,\n isConnected: false,\n lastActivity: null,\n });\n\n // Workspaces state\n const [workspaces, setWorkspaces] = useState<WorkspaceInfo[]>([]);\n const [selectedWorkspace, setSelectedWorkspaceState] = useState<WorkspaceInfo | null>(null);\n const [isLoadingWorkspaces, setIsLoadingWorkspaces] = useState(false);\n\n // Chat state\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n\n // Query state\n const [isQueryRunning, setIsQueryRunning] = useState(false);\n const [queryStartTime, setQueryStartTime] = useState<number | null>(null);\n\n // Data state\n const [datasets, setDatasetsState] = useState<DatasetInfo[]>([]);\n const [isLoadingDatasets, setIsLoadingDatasets] = useState(false);\n\n const [visualizations, setVisualizationsState] = useState<VisualizationData[]>([]);\n const [isLoadingVisualizations, setIsLoadingVisualizations] = useState(false);\n\n const [reports, setReportsState] = useState<ReportInfo[]>([]);\n const [isLoadingReports, setIsLoadingReports] = useState(false);\n\n const [models, setModelsState] = useState<ModelInfo[]>([]);\n const [isLoadingModels, setIsLoadingModels] = useState(false);\n\n const [scripts, setScriptsState] = useState<ScriptInfo[]>([]);\n const [isLoadingScripts, setIsLoadingScripts] = useState(false);\n\n // UI state\n const [isSidebarOpen, setSidebarOpen] = useState(true);\n const [activeTab, setActiveTab] = useState<'chat' | 'datasets' | 'visualizations' | 'reports' | 'models'>('chat');\n\n // Build client config for API calls\n const clientConfig = { baseUrl, tenantId };\n\n // =============================================================================\n // Authentication\n // =============================================================================\n\n // Load credentials on mount — with P0-72 Privy cross-validation.\n //\n // Legacy behavior (no privyAuthState prop):\n // Trust sessionStorage. Hydrate whatever's there if not expired.\n //\n // P0-72 behavior (privyAuthState passed):\n // Wait for `ready`, then hydrate only if Privy agrees the user is\n // authenticated. If sessionStorage has creds but Privy says no,\n // clear the stale creds instead of firing authenticated API\n // requests into a 401 storm.\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n // Gate on Privy being ready when caller opted into cross-validation.\n if (privyAuthState && !privyAuthState.ready) {\n return;\n }\n\n const stored = loadCredentials('session');\n if (!stored) {\n setIsInitialized(true);\n return;\n }\n\n if (isExpired(stored)) {\n clearCredentials('session');\n setIsInitialized(true);\n return;\n }\n\n // app_scope cross-check: if this provider is configured with an appScope\n // (a built app), the stored JWT must carry a matching claim. A JWT issued\n // from the main Casino login (app_scope=null) silently bypasses all\n // collection guards and loads the full platform orchestrator instead of\n // the app's custom agent. Same logic as the broker fix for the Privy path.\n if (config.appScope) {\n try {\n const _parts = stored.apiKey.split('.');\n const _payload = JSON.parse(atob(_parts[1]));\n const _tokenScope: string | null = _payload.app_scope ?? null;\n if (_tokenScope !== config.appScope) {\n clearCredentials('session');\n clearAllFlowstackData('session');\n setIsInitialized(true);\n return;\n }\n } catch {\n // Malformed JWT — clear and force re-auth.\n clearCredentials('session');\n setIsInitialized(true);\n return;\n }\n }\n\n // P0-72 cross-check: Privy is the source of truth for \"is this user\n // authenticated.\" If sessionStorage disagrees, trust Privy and clear\n // the stale Flowstack creds.\n if (privyAuthState && !privyAuthState.authenticated) {\n console.log('[FlowstackProvider] Privy session absent, clearing stale credentials');\n clearCredentials('session');\n clearAllFlowstackData('session');\n setIsInitialized(true);\n return;\n }\n\n // Both storage and (optionally) Privy agree — hydrate.\n setCredentialsState(stored);\n const workspaceId = loadSelectedWorkspace(stored, 'local');\n if (workspaceId) {\n setSession(prev => ({\n ...prev,\n sessionId: workspaceId,\n workspaceId,\n isConnected: true,\n }));\n }\n setIsInitialized(true);\n }, [privyAuthState?.ready, privyAuthState?.authenticated]);\n\n // Set credentials handler\n const setCredentials = useCallback((creds: FlowstackCredentials | null) => {\n setCredentialsState(creds);\n if (creds) {\n // Resolve tenant: explicit on the creds, else derive from the JWT, else the\n // configured tenantId. No hardcoded platform default.\n const credsWithTenant = {\n ...creds,\n tenantId: creds.tenantId || extractTenantId(creds.apiKey) || tenantId,\n };\n saveCredentials(credsWithTenant, 'session');\n } else {\n clearCredentials('session');\n }\n }, [tenantId]);\n\n // Logout handler\n const logout = useCallback(() => {\n if (credentials) {\n // Clear workspace selection\n clearSelectedWorkspace(credentials, 'local');\n\n // Clear messages for current workspace\n if (session.workspaceId) {\n clearStoredMessages(session.workspaceId, credentials, 'session');\n }\n }\n\n // Clear all Flowstack data\n clearAllFlowstackData('local');\n clearAllFlowstackData('session');\n\n // One-shot marker (set AFTER the clears so it survives): tells the next\n // BrokeredLoginButton click to pass force_login=1, so the broker purges its\n // sticky Privy/Casino session and the user can sign in with a DIFFERENT\n // account. Without this, brokered re-login silently returns the same identity.\n try {\n if (typeof window !== 'undefined') {\n window.localStorage.setItem('flowstack:force_relogin', '1');\n }\n } catch { /* storage unavailable — non-fatal */ }\n\n // Reset state\n setCredentialsState(null);\n setWorkspaces([]);\n setSelectedWorkspaceState(null);\n setMessages([]);\n setDatasetsState([]);\n setVisualizationsState([]);\n setReportsState([]);\n setModelsState([]);\n setSession({\n sessionId: null,\n workspaceId: null,\n isConnected: false,\n lastActivity: null,\n });\n }, [credentials, session.workspaceId]);\n\n // =============================================================================\n // Workspace Management\n // =============================================================================\n\n // Refresh workspaces\n const refreshWorkspaces = useCallback(async () => {\n if (!credentials && !isMockMode) return;\n\n setIsLoadingWorkspaces(true);\n try {\n if (isMockMode) {\n await mockDelay();\n setWorkspaces(mockWorkspaces);\n return;\n }\n\n const response = await listWorkspaces(credentials!, 50, clientConfig);\n if (response.ok && response.data) {\n setWorkspaces(response.data.workspaces.map(normalizeWorkspace));\n }\n } catch (error) {\n console.error('[Flowstack] Failed to refresh workspaces:', error);\n } finally {\n setIsLoadingWorkspaces(false);\n }\n }, [credentials, clientConfig, isMockMode]);\n\n // Create workspace\n const createWorkspace = useCallback(async (name: string, description?: string): Promise<WorkspaceInfo | null> => {\n if (!credentials && !isMockMode) return null;\n\n try {\n if (isMockMode) {\n await mockDelay();\n const newWorkspace: WorkspaceInfo = {\n workspaceId: generateMockId('ws'),\n name,\n description,\n datasetCount: 0,\n visualizationCount: 0,\n modelCount: 0,\n createdAt: new Date().toISOString(),\n lastAccessed: new Date().toISOString(),\n };\n setWorkspaces(prev => [newWorkspace, ...prev]);\n return newWorkspace;\n }\n\n const response = await apiCreateWorkspace(credentials!, name, description, clientConfig);\n if (response.ok && response.data) {\n const newWorkspace = normalizeWorkspace(response.data.workspace);\n setWorkspaces(prev => [newWorkspace, ...prev]);\n return newWorkspace;\n }\n return null;\n } catch (error) {\n console.error('[Flowstack] Failed to create workspace:', error);\n return null;\n }\n }, [credentials, clientConfig, isMockMode]);\n\n // Select workspace\n const setSelectedWorkspace = useCallback((workspace: WorkspaceInfo | null) => {\n setSelectedWorkspaceState(workspace);\n\n if (workspace && credentials) {\n // Update session\n setSession(prev => ({\n ...prev,\n sessionId: workspace.workspaceId,\n workspaceId: workspace.workspaceId,\n isConnected: true,\n lastActivity: new Date(),\n }));\n\n // Persist selection\n saveSelectedWorkspace(workspace.workspaceId, credentials, 'local');\n\n // Load messages for this workspace\n const storedMessages = loadMessages<ChatMessage>(\n workspace.workspaceId,\n credentials,\n 'session'\n );\n\n // Fix any interrupted streaming messages\n const fixedMessages = storedMessages.map(m => ({\n ...m,\n timestamp: new Date(m.timestamp),\n isStreaming: false,\n content: m.isStreaming && !m.content?.trim()\n ? '*(Response interrupted)*'\n : m.content,\n }));\n setMessages(fixedMessages);\n\n // Clear data - will be refreshed\n setDatasetsState([]);\n setVisualizationsState([]);\n setReportsState([]);\n setModelsState([]);\n } else {\n setSession(prev => ({\n ...prev,\n sessionId: null,\n workspaceId: null,\n isConnected: false,\n }));\n setMessages([]);\n }\n }, [credentials]);\n\n // Auto-load workspaces when authenticated (or in mock mode)\n useEffect(() => {\n if ((credentials || isMockMode) && workspaces.length === 0 && isInitialized) {\n refreshWorkspaces();\n }\n }, [credentials, isInitialized, isMockMode]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Auto-select or auto-create workspace when workspaces load\n useEffect(() => {\n if (!credentials && !isMockMode) return;\n if (selectedWorkspace) return;\n\n if (workspaces.length > 0) {\n // If a session workspace exists, select it; otherwise select the first one\n const found = session.workspaceId\n ? workspaces.find(ws => ws.workspaceId === session.workspaceId)\n : null;\n // Use setSelectedWorkspace (not raw state setter) to trigger message restoration\n setSelectedWorkspace(found || workspaces[0]);\n } else if (workspaces.length === 0 && isInitialized && !isLoadingWorkspaces) {\n // No workspaces — auto-create a default one\n createWorkspace('My Workspace', 'Default workspace').then(ws => {\n if (ws) setSelectedWorkspace(ws);\n });\n }\n }, [workspaces, session.workspaceId, selectedWorkspace, credentials, isMockMode, isInitialized, isLoadingWorkspaces]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // =============================================================================\n // Message Management\n // =============================================================================\n\n const addMessage = useCallback((message: ChatMessage) => {\n setMessages(prev => {\n const updated = [...prev, message];\n\n // Persist non-streaming messages\n if (!message.isStreaming && credentials && session.workspaceId) {\n saveMessages(updated, session.workspaceId, credentials, 'session');\n }\n\n return updated;\n });\n }, [credentials, session.workspaceId]);\n\n const updateMessage = useCallback((id: string, updates: Partial<ChatMessage>) => {\n setMessages(prev => {\n const updated = prev.map(msg =>\n msg.id === id ? { ...msg, ...updates } : msg\n );\n\n // Persist when streaming completes\n if (updates.isStreaming === false && credentials && session.workspaceId) {\n saveMessages(updated, session.workspaceId, credentials, 'session');\n }\n\n return updated;\n });\n }, [credentials, session.workspaceId]);\n\n const clearMessages = useCallback(() => {\n setMessages([]);\n if (credentials && session.workspaceId) {\n clearStoredMessages(session.workspaceId, credentials, 'session');\n }\n }, [credentials, session.workspaceId]);\n\n // =============================================================================\n // Dataset Management\n // =============================================================================\n\n const setDatasets = useCallback((datasets: DatasetInfo[]) => {\n setDatasetsState(datasets);\n }, []);\n\n const refreshDatasets = useCallback(async () => {\n if ((!credentials || !selectedWorkspace) && !isMockMode) return;\n\n setIsLoadingDatasets(true);\n try {\n if (isMockMode) {\n await mockDelay();\n setDatasetsState(mockDatasets);\n return;\n }\n\n const response = await listDatasets(\n credentials!,\n selectedWorkspace!.workspaceId,\n clientConfig\n );\n if (response.ok && response.data) {\n setDatasetsState(response.data.datasets.map(normalizeDataset));\n }\n } catch (error) {\n console.error('[Flowstack] Failed to refresh datasets:', error);\n } finally {\n setIsLoadingDatasets(false);\n }\n }, [credentials, selectedWorkspace, clientConfig, isMockMode]);\n\n // =============================================================================\n // Visualization Management\n // =============================================================================\n\n const setVisualizations = useCallback((vizs: VisualizationData[]) => {\n setVisualizationsState(vizs);\n }, []);\n\n const addVisualization = useCallback((viz: VisualizationData) => {\n setVisualizationsState(prev => {\n const exists = prev.some(v => v.name === viz.name);\n if (exists) {\n return prev.map(v => v.name === viz.name ? viz : v);\n }\n return [...prev, viz];\n });\n }, []);\n\n const refreshVisualizations = useCallback(async () => {\n if ((!credentials || !selectedWorkspace) && !isMockMode) return;\n\n setIsLoadingVisualizations(true);\n try {\n if (isMockMode) {\n await mockDelay();\n setVisualizationsState(mockVisualizations);\n return;\n }\n\n const response = await listVisualizations(\n credentials!,\n selectedWorkspace!.workspaceId,\n clientConfig\n );\n if (response.ok && response.data) {\n const apiVizs = response.data.visualizations.map(normalizeVisualization);\n // Merge: preserve image data from streaming visualizations (SSE events\n // include imageBase64/imageUrl but the list API does not)\n setVisualizationsState(prev => {\n const streamMap = new Map(prev.filter(v => v.imageUrl || v.imageBase64).map(v => [v.name, v]));\n return apiVizs.map(v => {\n const streamed = streamMap.get(v.name);\n if (streamed && !v.imageUrl && !v.imageBase64) {\n return { ...v, imageUrl: streamed.imageUrl, imageBase64: streamed.imageBase64, format: streamed.format || v.format };\n }\n return v;\n });\n });\n }\n } catch (error) {\n console.error('[Flowstack] Failed to refresh visualizations:', error);\n } finally {\n setIsLoadingVisualizations(false);\n }\n }, [credentials, selectedWorkspace, clientConfig, isMockMode]);\n\n const clearVisualizations = useCallback(() => {\n setVisualizationsState([]);\n }, []);\n\n // =============================================================================\n // Report Management\n // =============================================================================\n\n const refreshReports = useCallback(async () => {\n if ((!credentials || !selectedWorkspace) && !isMockMode) return;\n\n setIsLoadingReports(true);\n try {\n if (isMockMode) {\n await mockDelay();\n setReportsState([]); // No mock reports by default\n return;\n }\n\n const response = await listReports(\n credentials!,\n selectedWorkspace!.workspaceId,\n clientConfig\n );\n if (response.ok && response.data) {\n setReportsState(response.data.reports);\n }\n } catch (error) {\n console.error('[Flowstack] Failed to refresh reports:', error);\n } finally {\n setIsLoadingReports(false);\n }\n }, [credentials, selectedWorkspace, clientConfig, isMockMode]);\n\n // =============================================================================\n // Model Management\n // =============================================================================\n\n const refreshModels = useCallback(async () => {\n if ((!credentials || !selectedWorkspace) && !isMockMode) return;\n\n setIsLoadingModels(true);\n try {\n if (isMockMode) {\n await mockDelay();\n setModelsState([]); // No mock models by default\n return;\n }\n\n const response = await listModels(\n credentials!,\n selectedWorkspace!.workspaceId,\n clientConfig\n );\n if (response.ok && response.data) {\n setModelsState(response.data.models);\n }\n } catch (error) {\n console.error('[Flowstack] Failed to refresh models:', error);\n } finally {\n setIsLoadingModels(false);\n }\n }, [credentials, selectedWorkspace, clientConfig, isMockMode]);\n\n // =============================================================================\n // Script Management\n // =============================================================================\n\n const refreshScripts = useCallback(async () => {\n if ((!credentials || !selectedWorkspace) && !isMockMode) return;\n\n setIsLoadingScripts(true);\n try {\n if (isMockMode) {\n await mockDelay();\n setScriptsState([]);\n return;\n }\n\n const response = await listScripts(\n credentials!,\n selectedWorkspace!.workspaceId,\n clientConfig\n );\n if (response.ok && response.data) {\n setScriptsState(response.data.scripts);\n }\n } catch (error) {\n console.error('[Flowstack] Failed to refresh scripts:', error);\n } finally {\n setIsLoadingScripts(false);\n }\n }, [credentials, selectedWorkspace, clientConfig, isMockMode]);\n\n // =============================================================================\n // Auto-refresh on workspace change\n // =============================================================================\n\n useEffect(() => {\n if ((credentials || isMockMode) && selectedWorkspace) {\n const timer = setTimeout(() => {\n refreshDatasets();\n refreshVisualizations();\n refreshReports();\n refreshModels();\n refreshScripts();\n }, 100);\n return () => clearTimeout(timer);\n }\n }, [selectedWorkspace?.workspaceId, isMockMode]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // =============================================================================\n // Context Value\n // =============================================================================\n\n const value: FlowstackContextValue = {\n // Config\n config,\n\n // Auth\n credentials,\n setCredentials,\n isAuthenticated: !!credentials,\n isInitialized,\n logout,\n\n // Session\n session,\n\n // Workspaces\n workspaces,\n selectedWorkspace,\n setSelectedWorkspace,\n refreshWorkspaces,\n createWorkspace,\n isLoadingWorkspaces,\n\n // Messages\n messages,\n addMessage,\n updateMessage,\n clearMessages,\n\n // Query state\n isQueryRunning,\n setIsQueryRunning,\n queryStartTime,\n setQueryStartTime,\n\n // Datasets\n datasets,\n setDatasets,\n refreshDatasets,\n isLoadingDatasets,\n\n // Visualizations\n visualizations,\n setVisualizations,\n addVisualization,\n refreshVisualizations,\n isLoadingVisualizations,\n clearVisualizations,\n\n // Reports\n reports,\n refreshReports,\n isLoadingReports,\n\n // Models\n models,\n refreshModels,\n isLoadingModels,\n\n // Scripts\n scripts,\n refreshScripts,\n isLoadingScripts,\n\n // UI\n isSidebarOpen,\n setSidebarOpen,\n activeTab,\n setActiveTab,\n };\n\n return (\n <FlowstackContext.Provider value={value}>\n {children}\n </FlowstackContext.Provider>\n );\n}\n\n/**\n * Hook to access Flowstack context\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { isAuthenticated, credentials } = useFlowstack();\n * // ...\n * }\n * ```\n */\nexport function useFlowstack(): FlowstackContextValue {\n const context = useContext(FlowstackContext);\n if (!context) {\n throw new Error('useFlowstack must be used within a FlowstackProvider');\n }\n return context;\n}\n\n/**\n * Optional hook - returns null if not in provider (for conditional usage)\n */\nexport function useFlowstackOptional(): FlowstackContextValue | null {\n return useContext(FlowstackContext);\n}\n","/**\n * Flowstack SDK Error Codes\n *\n * Standardized error codes for programmatic error handling.\n */\n\nexport const ErrorCodes = {\n // Configuration errors\n CONFIG_INVALID: 'CONFIG_INVALID',\n CONFIG_MISSING_JWT_SECRET: 'CONFIG_MISSING_JWT_SECRET',\n CONFIG_MISSING_PASSWORD_SECRET: 'CONFIG_MISSING_PASSWORD_SECRET',\n\n // Network errors\n NETWORK_ERROR: 'NETWORK_ERROR',\n NETWORK_TIMEOUT: 'NETWORK_TIMEOUT',\n NETWORK_OFFLINE: 'NETWORK_OFFLINE',\n\n // Authentication errors\n AUTHENTICATION_FAILED: 'AUTHENTICATION_FAILED',\n AUTHENTICATION_EXPIRED: 'AUTHENTICATION_EXPIRED',\n INVALID_CREDENTIALS: 'INVALID_CREDENTIALS',\n ACCOUNT_NOT_ACTIVE: 'ACCOUNT_NOT_ACTIVE',\n ACCOUNT_LOCKED: 'ACCOUNT_LOCKED',\n EMAIL_NOT_VERIFIED: 'EMAIL_NOT_VERIFIED',\n\n // Authorization errors\n UNAUTHORIZED: 'UNAUTHORIZED',\n FORBIDDEN: 'FORBIDDEN',\n INSUFFICIENT_PERMISSIONS: 'INSUFFICIENT_PERMISSIONS',\n\n // Workspace errors\n WORKSPACE_NOT_FOUND: 'WORKSPACE_NOT_FOUND',\n WORKSPACE_REQUIRED: 'WORKSPACE_REQUIRED',\n WORKSPACE_CREATE_FAILED: 'WORKSPACE_CREATE_FAILED',\n\n // Dataset errors\n DATASET_NOT_FOUND: 'DATASET_NOT_FOUND',\n DATASET_UPLOAD_FAILED: 'DATASET_UPLOAD_FAILED',\n DATASET_DOWNLOAD_FAILED: 'DATASET_DOWNLOAD_FAILED',\n DATASET_DELETE_FAILED: 'DATASET_DELETE_FAILED',\n DATASET_TOO_LARGE: 'DATASET_TOO_LARGE',\n INVALID_FILE_TYPE: 'INVALID_FILE_TYPE',\n\n // Query/Agent errors\n QUERY_FAILED: 'QUERY_FAILED',\n QUERY_TIMEOUT: 'QUERY_TIMEOUT',\n QUERY_CANCELLED: 'QUERY_CANCELLED',\n AGENT_ERROR: 'AGENT_ERROR',\n STREAMING_ERROR: 'STREAMING_ERROR',\n\n // Data source errors\n DATA_SOURCE_NOT_FOUND: 'DATA_SOURCE_NOT_FOUND',\n DATA_SOURCE_CONNECTION_FAILED: 'DATA_SOURCE_CONNECTION_FAILED',\n DATA_SOURCE_AUTH_FAILED: 'DATA_SOURCE_AUTH_FAILED',\n\n // Rate limiting\n RATE_LIMITED: 'RATE_LIMITED',\n CREDITS_EXHAUSTED: 'CREDITS_EXHAUSTED',\n\n // Server errors\n SERVER_ERROR: 'SERVER_ERROR',\n SERVICE_UNAVAILABLE: 'SERVICE_UNAVAILABLE',\n MAINTENANCE_MODE: 'MAINTENANCE_MODE',\n\n // Validation errors\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n INVALID_EMAIL: 'INVALID_EMAIL',\n PASSWORD_TOO_SHORT: 'PASSWORD_TOO_SHORT',\n MISSING_REQUIRED_FIELD: 'MISSING_REQUIRED_FIELD',\n\n // Unknown\n UNKNOWN_ERROR: 'UNKNOWN_ERROR',\n} as const;\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];\n\n/**\n * User-friendly messages for each error code\n */\nexport const ErrorMessages: Record<ErrorCode, string> = {\n [ErrorCodes.CONFIG_INVALID]: 'Invalid SDK configuration',\n [ErrorCodes.CONFIG_MISSING_JWT_SECRET]: 'JWT secret is required in configuration',\n [ErrorCodes.CONFIG_MISSING_PASSWORD_SECRET]: 'Password secret is required in configuration',\n\n [ErrorCodes.NETWORK_ERROR]: 'Unable to connect to the server',\n [ErrorCodes.NETWORK_TIMEOUT]: 'Request timed out. Please try again',\n [ErrorCodes.NETWORK_OFFLINE]: 'No internet connection',\n\n [ErrorCodes.AUTHENTICATION_FAILED]: 'Authentication failed',\n [ErrorCodes.AUTHENTICATION_EXPIRED]: 'Your session has expired. Please log in again',\n [ErrorCodes.INVALID_CREDENTIALS]: 'Invalid email or password',\n [ErrorCodes.ACCOUNT_NOT_ACTIVE]: 'Your account is not active. Please check your email for activation instructions',\n [ErrorCodes.ACCOUNT_LOCKED]: 'Your account has been locked. Please contact support',\n [ErrorCodes.EMAIL_NOT_VERIFIED]: 'Please verify your email address to continue',\n\n [ErrorCodes.UNAUTHORIZED]: 'You are not authorized to perform this action',\n [ErrorCodes.FORBIDDEN]: 'Access denied',\n [ErrorCodes.INSUFFICIENT_PERMISSIONS]: 'You do not have permission to access this resource',\n\n [ErrorCodes.WORKSPACE_NOT_FOUND]: 'Workspace not found',\n [ErrorCodes.WORKSPACE_REQUIRED]: 'Please select a workspace to continue',\n [ErrorCodes.WORKSPACE_CREATE_FAILED]: 'Failed to create workspace',\n\n [ErrorCodes.DATASET_NOT_FOUND]: 'Dataset not found',\n [ErrorCodes.DATASET_UPLOAD_FAILED]: 'Failed to upload dataset',\n [ErrorCodes.DATASET_DOWNLOAD_FAILED]: 'Failed to download dataset',\n [ErrorCodes.DATASET_DELETE_FAILED]: 'Failed to delete dataset',\n [ErrorCodes.DATASET_TOO_LARGE]: 'Dataset exceeds maximum size limit',\n [ErrorCodes.INVALID_FILE_TYPE]: 'Invalid file type',\n\n [ErrorCodes.QUERY_FAILED]: 'Query failed',\n [ErrorCodes.QUERY_TIMEOUT]: 'Query timed out. Please try a simpler request',\n [ErrorCodes.QUERY_CANCELLED]: 'Query was cancelled',\n [ErrorCodes.AGENT_ERROR]: 'AI agent encountered an error',\n [ErrorCodes.STREAMING_ERROR]: 'Error in streaming response',\n\n [ErrorCodes.DATA_SOURCE_NOT_FOUND]: 'Data source not found',\n [ErrorCodes.DATA_SOURCE_CONNECTION_FAILED]: 'Failed to connect to data source',\n [ErrorCodes.DATA_SOURCE_AUTH_FAILED]: 'Data source authentication failed',\n\n [ErrorCodes.RATE_LIMITED]: 'Too many requests. Please slow down',\n [ErrorCodes.CREDITS_EXHAUSTED]: 'You have run out of credits',\n\n [ErrorCodes.SERVER_ERROR]: 'An unexpected server error occurred',\n [ErrorCodes.SERVICE_UNAVAILABLE]: 'Service is temporarily unavailable',\n [ErrorCodes.MAINTENANCE_MODE]: 'Service is under maintenance',\n\n [ErrorCodes.VALIDATION_ERROR]: 'Validation error',\n [ErrorCodes.INVALID_EMAIL]: 'Please enter a valid email address',\n [ErrorCodes.PASSWORD_TOO_SHORT]: 'Password is too short',\n [ErrorCodes.MISSING_REQUIRED_FIELD]: 'Required field is missing',\n\n [ErrorCodes.UNKNOWN_ERROR]: 'An unexpected error occurred',\n};\n\n/**\n * Recovery actions for each error code\n */\nexport const RecoveryActions: Partial<Record<ErrorCode, string>> = {\n [ErrorCodes.NETWORK_ERROR]: 'Check your internet connection and try again',\n [ErrorCodes.NETWORK_OFFLINE]: 'Connect to the internet and try again',\n [ErrorCodes.AUTHENTICATION_EXPIRED]: 'Log in again to continue',\n [ErrorCodes.ACCOUNT_NOT_ACTIVE]: 'Check your email for the activation link',\n [ErrorCodes.EMAIL_NOT_VERIFIED]: 'Check your email for the verification link',\n [ErrorCodes.WORKSPACE_REQUIRED]: 'Select or create a workspace',\n [ErrorCodes.RATE_LIMITED]: 'Wait a moment and try again',\n [ErrorCodes.CREDITS_EXHAUSTED]: 'Upgrade your plan or wait for credits to reset',\n};\n","/**\n * Flowstack SDK Error Handling\n *\n * Provides structured error handling with error codes, user-friendly messages,\n * and recovery actions.\n *\n * @example\n * ```tsx\n * import { FlowstackError, ErrorCodes } from 'flowstack-sdk';\n *\n * try {\n * await login(email, password);\n * } catch (error) {\n * if (error instanceof FlowstackError) {\n * if (error.code === ErrorCodes.ACCOUNT_NOT_ACTIVE) {\n * showActivationPrompt();\n * }\n * showError(error.userMessage);\n * }\n * }\n * ```\n */\n\nimport { ErrorCode, ErrorCodes, ErrorMessages, RecoveryActions } from './codes';\n\nexport { ErrorCodes, ErrorMessages, RecoveryActions } from './codes';\nexport type { ErrorCode } from './codes';\n\nexport interface FlowstackErrorOptions {\n /** User-friendly error message */\n userMessage?: string;\n /** Suggested recovery action */\n recoveryAction?: string;\n /** Additional error details */\n details?: Record<string, unknown>;\n /** HTTP status code if from API */\n status?: number;\n /** Original error that caused this error */\n cause?: Error;\n}\n\n/**\n * Structured error class for Flowstack SDK\n *\n * Provides:\n * - Error code for programmatic handling\n * - User-friendly message for display\n * - Recovery action suggestions\n * - Additional details for debugging\n */\nexport class FlowstackError extends Error {\n /** Error code for programmatic handling */\n readonly code: ErrorCode;\n\n /** User-friendly message safe to display */\n readonly userMessage: string;\n\n /** Suggested action to recover from the error */\n readonly recoveryAction?: string;\n\n /** Additional error details */\n details?: Record<string, unknown>;\n\n /** HTTP status code if from API response */\n readonly status?: number;\n\n /** Original error that caused this error */\n readonly originalCause?: Error;\n\n constructor(code: ErrorCode, message?: string, options?: FlowstackErrorOptions) {\n const finalMessage = message || ErrorMessages[code] || 'An error occurred';\n super(finalMessage);\n\n this.name = 'FlowstackError';\n this.code = code;\n this.userMessage = options?.userMessage || ErrorMessages[code] || finalMessage;\n this.recoveryAction = options?.recoveryAction || RecoveryActions[code];\n this.details = options?.details;\n this.status = options?.status;\n this.originalCause = options?.cause;\n\n // Maintain proper prototype chain\n Object.setPrototypeOf(this, FlowstackError.prototype);\n }\n\n /**\n * Create a FlowstackError from an API response\n */\n static fromApiError(status: number, body: string | Record<string, unknown>): FlowstackError {\n const parsed = typeof body === 'string' ? tryParseJSON(body) : body;\n const detail = parsed?.detail || parsed?.error || parsed?.message || 'Request failed';\n\n // Map common API errors to error codes\n const code = mapStatusToErrorCode(status, String(detail));\n\n return new FlowstackError(code, String(detail), {\n status,\n details: typeof parsed === 'object' && parsed !== null ? parsed : { raw: body },\n });\n }\n\n /**\n * Create a FlowstackError from a network error\n */\n static fromNetworkError(error: Error): FlowstackError {\n // Check for common network error patterns\n if (error.message.includes('Failed to fetch') || error.message.includes('NetworkError')) {\n return new FlowstackError(ErrorCodes.NETWORK_ERROR, 'Failed to connect to server', {\n cause: error,\n });\n }\n\n if (error.message.includes('timeout') || error.name === 'AbortError') {\n return new FlowstackError(ErrorCodes.NETWORK_TIMEOUT, 'Request timed out', {\n cause: error,\n });\n }\n\n return new FlowstackError(ErrorCodes.NETWORK_ERROR, error.message, {\n cause: error,\n });\n }\n\n /**\n * Create a FlowstackError from any error\n */\n static from(error: unknown): FlowstackError {\n if (error instanceof FlowstackError) {\n return error;\n }\n\n if (error instanceof Error) {\n // Check if it's a network error\n if (\n error.message.includes('fetch') ||\n error.message.includes('network') ||\n error.message.includes('ECONNREFUSED')\n ) {\n return FlowstackError.fromNetworkError(error);\n }\n\n return new FlowstackError(ErrorCodes.UNKNOWN_ERROR, error.message, {\n cause: error,\n });\n }\n\n // Handle non-Error values\n const message = typeof error === 'string' ? error : 'An unexpected error occurred';\n return new FlowstackError(ErrorCodes.UNKNOWN_ERROR, message);\n }\n\n /**\n * Check if this error is retryable\n */\n isRetryable(): boolean {\n const retryableCodes: ErrorCode[] = [\n ErrorCodes.NETWORK_ERROR,\n ErrorCodes.NETWORK_TIMEOUT,\n ErrorCodes.SERVER_ERROR,\n ErrorCodes.SERVICE_UNAVAILABLE,\n ErrorCodes.RATE_LIMITED,\n ];\n return retryableCodes.includes(this.code);\n }\n\n /**\n * Check if this error requires re-authentication\n */\n requiresReauth(): boolean {\n const reauthCodes: ErrorCode[] = [\n ErrorCodes.AUTHENTICATION_EXPIRED,\n ErrorCodes.UNAUTHORIZED,\n ErrorCodes.INVALID_CREDENTIALS,\n ];\n return reauthCodes.includes(this.code);\n }\n\n /**\n * Get a serializable representation of the error\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n userMessage: this.userMessage,\n recoveryAction: this.recoveryAction,\n details: this.details,\n status: this.status,\n };\n }\n}\n\n/**\n * Helper to try parsing JSON, returning null on failure\n */\nfunction tryParseJSON(str: string): Record<string, unknown> | null {\n try {\n return JSON.parse(str);\n } catch {\n return null;\n }\n}\n\n/**\n * Map HTTP status codes to error codes\n */\nfunction mapStatusToErrorCode(status: number, detail: string): ErrorCode {\n // Check for specific error patterns in the detail\n const lowerDetail = detail.toLowerCase();\n\n if (lowerDetail.includes('not active') || lowerDetail.includes('account not active')) {\n return ErrorCodes.ACCOUNT_NOT_ACTIVE;\n }\n if (lowerDetail.includes('not verified') || lowerDetail.includes('verify')) {\n return ErrorCodes.EMAIL_NOT_VERIFIED;\n }\n if (lowerDetail.includes('locked')) {\n return ErrorCodes.ACCOUNT_LOCKED;\n }\n if (lowerDetail.includes('rate limit') || lowerDetail.includes('too many')) {\n return ErrorCodes.RATE_LIMITED;\n }\n if (lowerDetail.includes('credit') || lowerDetail.includes('quota')) {\n return ErrorCodes.CREDITS_EXHAUSTED;\n }\n\n // Map by status code\n switch (status) {\n case 400:\n return ErrorCodes.VALIDATION_ERROR;\n case 401:\n return ErrorCodes.AUTHENTICATION_FAILED;\n case 403:\n return ErrorCodes.FORBIDDEN;\n case 404:\n return ErrorCodes.WORKSPACE_NOT_FOUND;\n case 408:\n return ErrorCodes.NETWORK_TIMEOUT;\n case 409:\n return ErrorCodes.VALIDATION_ERROR;\n case 429:\n return ErrorCodes.RATE_LIMITED;\n case 500:\n return ErrorCodes.SERVER_ERROR;\n case 502:\n case 503:\n return ErrorCodes.SERVICE_UNAVAILABLE;\n case 504:\n return ErrorCodes.NETWORK_TIMEOUT;\n default:\n return status >= 500 ? ErrorCodes.SERVER_ERROR : ErrorCodes.UNKNOWN_ERROR;\n }\n}\n\n/**\n * Type guard to check if an error is a FlowstackError\n */\nexport function isFlowstackError(error: unknown): error is FlowstackError {\n return error instanceof FlowstackError;\n}\n\n/**\n * Utility to wrap async functions with error handling\n */\nexport async function withErrorHandling<T>(\n fn: () => Promise<T>,\n context?: string\n): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n const flowstackError = FlowstackError.from(error);\n if (context) {\n flowstackError.details = { ...flowstackError.details, context };\n }\n throw flowstackError;\n }\n}\n","/**\n * Configuration Validator\n *\n * Validates FlowstackConfig on startup and provides helpful error messages.\n */\n\nimport type { FlowstackConfig } from '../types';\nimport { FlowstackError, ErrorCodes } from '../errors';\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n}\n\n/**\n * Validate the SDK configuration\n *\n * @param config - FlowstackConfig to validate\n * @returns ValidationResult with errors and warnings\n *\n * @example\n * ```ts\n * const result = validateConfig(config);\n * if (!result.valid) {\n * console.error('Config errors:', result.errors);\n * }\n * result.warnings.forEach(w => console.warn(w));\n * ```\n */\nexport function validateConfig(config: FlowstackConfig): ValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Required fields\n if (!config.jwtSecret) {\n errors.push(\n 'Missing required: jwtSecret. This is needed to verify session tokens. ' +\n 'Get your JWT secret from your dashboard or set via FLOWSTACK_JWT_SECRET env var.'\n );\n } else if (config.jwtSecret.length < 32) {\n warnings.push(\n 'jwtSecret is shorter than 32 characters. Consider using a longer secret for security.'\n );\n }\n\n if (!config.passwordSecret) {\n errors.push(\n 'Missing required: passwordSecret. This is needed for secure password hashing. ' +\n 'Generate a unique secret or set via FLOWSTACK_PASSWORD_SECRET env var.'\n );\n } else if (config.passwordSecret.length < 32) {\n warnings.push(\n 'passwordSecret is shorter than 32 characters. Consider using a longer secret for security.'\n );\n }\n\n // tenantId is optional: for authenticated calls the backend derives it from the\n // JWT/API key (the X-Tenant-ID header is ignored), so most apps never set it.\n // It is only required for anonymous access (usePublicCollection), where there is\n // no token — usePublicCollection raises a clear error if it's missing.\n if (!config.tenantId) {\n warnings.push(\n 'No tenantId set. Fine for authenticated apps (tenant comes from the JWT). ' +\n 'Required only if you use usePublicCollection (anonymous access).'\n );\n }\n\n if (!config.baseUrl) {\n warnings.push('No baseUrl provided. Using default Flowstack API URL.');\n }\n\n // Auth configuration\n if (config.auth) {\n if (config.auth.providers.includes('google')) {\n if (!config.auth.googleClientId) {\n errors.push(\n 'Google OAuth is enabled but googleClientId is missing. ' +\n 'Get your client ID from the Google Cloud Console.'\n );\n }\n }\n\n if (config.auth.passwordMinLength && config.auth.passwordMinLength < 8) {\n warnings.push(\n 'passwordMinLength is less than 8. Consider requiring stronger passwords.'\n );\n }\n }\n\n // Redis configuration\n if (config.redis) {\n if (!config.redis.url) {\n errors.push('Redis config provided but url is missing.');\n }\n if (!config.redis.token) {\n errors.push('Redis config provided but token is missing.');\n }\n }\n\n // Database configuration\n if (config.database) {\n if (!config.database.supabaseUrl) {\n errors.push('Database config provided but supabaseUrl is missing.');\n }\n if (!config.database.supabaseKey) {\n errors.push('Database config provided but supabaseKey is missing.');\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n/**\n * Validate config and throw FlowstackError if invalid\n *\n * @param config - FlowstackConfig to validate\n * @throws FlowstackError if configuration is invalid\n */\nexport function validateConfigOrThrow(config: FlowstackConfig): void {\n const result = validateConfig(config);\n\n if (!result.valid) {\n throw new FlowstackError(ErrorCodes.CONFIG_INVALID, result.errors.join('\\n'), {\n userMessage: 'SDK configuration is invalid. Check the console for details.',\n details: { errors: result.errors, warnings: result.warnings },\n });\n }\n\n // Log warnings\n result.warnings.forEach((warning) => {\n console.warn('[Flowstack]', warning);\n });\n}\n\n/**\n * Check if config is for development/testing (relaxed validation)\n */\nexport function isDevelopmentConfig(config: FlowstackConfig): boolean {\n return (\n config.mode === 'development' ||\n config.mode === 'mock' ||\n (typeof process !== 'undefined' && process.env?.NODE_ENV === 'development')\n );\n}\n\n/**\n * Get a summary of the config for debugging\n */\nexport function getConfigSummary(config: FlowstackConfig): Record<string, unknown> {\n return {\n mode: config.mode || 'production',\n hasJwtSecret: !!config.jwtSecret,\n hasPasswordSecret: !!config.passwordSecret,\n tenantId: config.tenantId || '(from token)',\n baseUrl: config.baseUrl || '(default)',\n authProviders: config.auth?.providers || ['email'],\n hasRedis: !!config.redis,\n hasDatabase: !!config.database,\n storage: config.storage || 'local',\n };\n}\n","'use client';\n\n/**\n * useAuth Hook\n *\n * Provides authentication functionality including login, register, and Google OAuth.\n *\n * @example\n * ```tsx\n * function LoginPage() {\n * const { login, isLoading, error } = useAuth();\n *\n * const handleLogin = async (email: string, password: string) => {\n * const success = await login(email, password);\n * if (success) router.push('/dashboard');\n * };\n * }\n * ```\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport type { UseAuthReturn, FlowstackCredentials, User } from '../types';\nimport { login as apiLogin, register as apiRegister } from '../api/client';\nimport { mockCredentials, mockDelay } from '../mock/fixtures';\n\n/**\n * Hook for authentication operations\n */\nexport function useAuth(): UseAuthReturn {\n const {\n credentials,\n setCredentials,\n isAuthenticated,\n logout: contextLogout,\n config,\n } = useFlowstack();\n\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const clientConfig = {\n baseUrl: config.baseUrl,\n tenantId: config.tenantId,\n appScope: config.appScope,\n };\n\n const isMockMode = config.mode === 'mock';\n\n /**\n * Login with email and password\n */\n const login = useCallback(async (email: string, password: string): Promise<boolean> => {\n setIsLoading(true);\n setError(null);\n\n try {\n // Mock mode - return mock credentials without API call\n if (isMockMode) {\n await mockDelay(200, 600);\n const newCredentials: FlowstackCredentials = {\n ...mockCredentials,\n email,\n expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),\n };\n setCredentials(newCredentials);\n return true;\n }\n\n const response = await apiLogin(email, password, clientConfig);\n\n if (response.ok && response.data) {\n const { session_token, user_id, access_token } = response.data;\n\n const newCredentials: FlowstackCredentials = {\n apiKey: access_token || session_token,\n // setCredentials derives tenant from the JWT; config is just a fallback.\n tenantId: config.tenantId || '',\n userId: user_id,\n email,\n };\n\n setCredentials(newCredentials);\n return true;\n }\n\n setError(response.error || 'Login failed');\n return false;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Login failed';\n setError(message);\n return false;\n } finally {\n setIsLoading(false);\n }\n }, [config.tenantId, setCredentials, clientConfig, isMockMode]);\n\n /**\n * Register a new user\n */\n const register = useCallback(async (\n email: string,\n password: string,\n _name?: string\n ): Promise<boolean> => {\n setIsLoading(true);\n setError(null);\n\n try {\n // Mock mode - simulate registration then auto-login\n if (isMockMode) {\n await mockDelay(300, 800);\n // Auto-login after mock registration\n return await login(email, password);\n }\n\n const response = await apiRegister(email, password, clientConfig);\n\n if (response.ok && response.data) {\n // Use session token from registration directly if available\n if (response.data.session_token) {\n const newCredentials: FlowstackCredentials = {\n apiKey: response.data.session_token,\n // setCredentials derives tenant from the JWT; server/config are fallbacks.\n tenantId: response.data.tenant_id || config.tenantId || '',\n userId: response.data.user_id,\n email,\n };\n setCredentials(newCredentials);\n return true;\n }\n // Fall back to login if registration didn't return a token\n if (response.data.user_id) {\n return await login(email, password);\n }\n return true;\n }\n\n setError(response.error || 'Registration failed');\n return false;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Registration failed';\n setError(message);\n return false;\n } finally {\n setIsLoading(false);\n }\n }, [login, clientConfig, isMockMode]);\n\n /**\n * Initiate Google OAuth sign-in\n */\n const googleSignIn = useCallback(async (): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n // Redirect to Google OAuth endpoint\n // The actual implementation depends on server-side route\n const googleClientId = config.auth?.googleClientId;\n if (!googleClientId) {\n throw new Error('Google OAuth not configured');\n }\n\n const redirectUri = `${window.location.origin}/api/auth/google/callback`;\n const scope = 'openid email profile';\n const state = crypto.randomUUID();\n\n // Store state for CSRF protection\n sessionStorage.setItem('google_oauth_state', state);\n\n const params = new URLSearchParams({\n client_id: googleClientId,\n redirect_uri: redirectUri,\n response_type: 'code',\n scope,\n state,\n access_type: 'offline',\n prompt: 'consent',\n });\n\n window.location.href = `https://accounts.google.com/o/oauth2/v2/auth?${params}`;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Google sign-in failed';\n setError(message);\n setIsLoading(false);\n }\n }, [config.auth?.googleClientId]);\n\n /**\n * Logout and clear credentials\n */\n const logout = useCallback(() => {\n setError(null);\n contextLogout();\n }, [contextLogout]);\n\n /**\n * Refresh token if needed\n */\n const refreshToken = useCallback(async (): Promise<boolean> => {\n if (!credentials) return false;\n\n // Check if token is expired or expiring soon\n if (credentials.expiresAt) {\n const expiresAt = new Date(credentials.expiresAt).getTime();\n const now = Date.now();\n const fiveMinutes = 5 * 60 * 1000;\n\n if (now < expiresAt - fiveMinutes) {\n // Token still valid\n return true;\n }\n }\n\n // Token refresh would require server-side session refresh endpoint\n // For now, return true if we have valid credentials\n return !!credentials.apiKey;\n }, [credentials]);\n\n // Derive user from credentials\n const user: User | null = useMemo(() => {\n if (!credentials) return null;\n return {\n id: credentials.userId || '',\n email: credentials.email || '',\n tenantId: credentials.tenantId,\n expiresAt: credentials.expiresAt,\n };\n }, [credentials]);\n\n return {\n user,\n credentials,\n isAuthenticated,\n isLoading,\n error,\n login,\n register,\n googleSignIn,\n logout,\n refreshToken,\n };\n}\n","'use client';\n\n/**\n * useWorkspace Hook\n *\n * Provides workspace management functionality.\n *\n * @example\n * ```tsx\n * function WorkspaceManager() {\n * const { workspaces, selectedWorkspace, createWorkspace, selectWorkspace } = useWorkspace();\n *\n * return (\n * <div>\n * <select onChange={(e) => {\n * const ws = workspaces.find(w => w.workspaceId === e.target.value);\n * if (ws) selectWorkspace(ws);\n * }}>\n * {workspaces.map(ws => (\n * <option key={ws.workspaceId} value={ws.workspaceId}>{ws.name}</option>\n * ))}\n * </select>\n * <button onClick={() => createWorkspace('New Project')}>New Workspace</button>\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport type { UseWorkspaceReturn, WorkspaceInfo } from '../types';\n\n/**\n * Hook for workspace management\n */\nexport function useWorkspace(): UseWorkspaceReturn {\n const {\n workspaces,\n selectedWorkspace,\n setSelectedWorkspace,\n refreshWorkspaces: contextRefresh,\n createWorkspace: contextCreate,\n isLoadingWorkspaces,\n } = useFlowstack();\n\n const [error, setError] = useState<string | null>(null);\n\n /**\n * Create a new workspace\n */\n const createWorkspace = useCallback(async (\n name: string,\n description?: string\n ): Promise<WorkspaceInfo | null> => {\n setError(null);\n\n try {\n const workspace = await contextCreate(name, description);\n if (!workspace) {\n setError('Failed to create workspace');\n }\n return workspace;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to create workspace';\n setError(message);\n return null;\n }\n }, [contextCreate]);\n\n /**\n * Select a workspace\n */\n const selectWorkspace = useCallback((workspace: WorkspaceInfo) => {\n setError(null);\n setSelectedWorkspace(workspace);\n }, [setSelectedWorkspace]);\n\n /**\n * Refresh workspaces list\n */\n const refreshWorkspaces = useCallback(async () => {\n setError(null);\n try {\n await contextRefresh();\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to refresh workspaces';\n setError(message);\n }\n }, [contextRefresh]);\n\n return {\n workspaces,\n selectedWorkspace,\n isLoading: isLoadingWorkspaces,\n error,\n createWorkspace,\n selectWorkspace,\n refreshWorkspaces,\n };\n}\n","'use client';\n\n/**\n * useDatasets Hook\n *\n * Provides dataset management functionality including upload, download, and deletion.\n *\n * @example\n * ```tsx\n * function DatasetManager() {\n * const { datasets, uploadDataset, deleteDataset, isLoading } = useDatasets();\n *\n * const handleUpload = async (file: File) => {\n * const dataset = await uploadDataset(file);\n * if (dataset) console.log('Uploaded:', dataset.name);\n * };\n *\n * return (\n * <div>\n * <input type=\"file\" onChange={(e) => handleUpload(e.target.files[0])} />\n * <ul>\n * {datasets.map(ds => (\n * <li key={ds.id}>\n * {ds.name} ({ds.rows} rows)\n * <button onClick={() => deleteDataset(ds.name)}>Delete</button>\n * </li>\n * ))}\n * </ul>\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport type { UseDatasetsReturn, DatasetInfo } from '../types';\nimport { uploadFile, deleteDataset as apiDeleteDataset, flowstackFetch } from '../api/client';\nimport { mockDelay, generateMockId } from '../mock/fixtures';\n\n/**\n * Hook for dataset operations\n */\nexport function useDatasets(): UseDatasetsReturn {\n const {\n credentials,\n selectedWorkspace,\n datasets,\n refreshDatasets: contextRefresh,\n isLoadingDatasets,\n config,\n } = useFlowstack();\n\n const [error, setError] = useState<string | null>(null);\n\n const clientConfig = {\n baseUrl: config.baseUrl,\n tenantId: config.tenantId,\n };\n\n const isMockMode = config.mode === 'mock';\n\n /**\n * Upload a dataset file\n */\n const uploadDataset = useCallback(async (\n file: File,\n name?: string\n ): Promise<DatasetInfo | null> => {\n setError(null);\n\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n return null;\n }\n\n if (!selectedWorkspace && !isMockMode) {\n setError('No workspace selected');\n return null;\n }\n\n try {\n // Mock mode - create mock dataset\n if (isMockMode) {\n await mockDelay(500, 1500);\n const mockDataset: DatasetInfo = {\n id: generateMockId('ds'),\n name: name || file.name.replace(/\\.[^/.]+$/, ''),\n rows: Math.floor(Math.random() * 10000) + 100,\n columns: Math.floor(Math.random() * 20) + 3,\n columnNames: ['col1', 'col2', 'col3'],\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n await contextRefresh();\n return mockDataset;\n }\n\n const response = await uploadFile(\n credentials!,\n selectedWorkspace!.workspaceId,\n file,\n name,\n clientConfig\n );\n\n if (response.ok && response.data?.dataset) {\n // Refresh datasets list\n await contextRefresh();\n return response.data.dataset;\n }\n\n setError(response.error || 'Upload failed');\n return null;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Upload failed';\n setError(message);\n return null;\n }\n }, [credentials, selectedWorkspace, clientConfig, contextRefresh, isMockMode]);\n\n /**\n * Download a dataset\n */\n const downloadDataset = useCallback(async (name: string): Promise<Blob | null> => {\n setError(null);\n\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n return null;\n }\n\n if (!selectedWorkspace && !isMockMode) {\n setError('No workspace selected');\n return null;\n }\n\n try {\n // Mock mode - return mock CSV blob\n if (isMockMode) {\n await mockDelay(200, 500);\n const mockCsv = 'id,name,value\\n1,Item A,100\\n2,Item B,200\\n3,Item C,300';\n return new Blob([mockCsv], { type: 'text/csv' });\n }\n\n const baseUrl = config.baseUrl || 'https://sage-api.flowstack.fun';\n const tenantId = credentials!.tenantId || config.tenantId || '';\n\n // API uses /datasets/{name}/download (not workspace-scoped)\n const url = `${baseUrl}/datasets/${name}/download`;\n\n const response = await fetch(url, {\n headers: {\n 'Authorization': `Bearer ${credentials!.apiKey}`,\n 'X-Tenant-ID': tenantId,\n 'X-User-ID': credentials!.userId || '',\n },\n });\n\n if (!response.ok) {\n setError(`Download failed: ${response.statusText}`);\n return null;\n }\n\n return await response.blob();\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Download failed';\n setError(message);\n return null;\n }\n }, [credentials, selectedWorkspace, config, isMockMode]);\n\n /**\n * Delete a dataset\n */\n const deleteDataset = useCallback(async (name: string): Promise<boolean> => {\n setError(null);\n\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n return false;\n }\n\n if (!selectedWorkspace && !isMockMode) {\n setError('No workspace selected');\n return false;\n }\n\n try {\n // Mock mode - just refresh to simulate delete\n if (isMockMode) {\n await mockDelay(200, 500);\n await contextRefresh();\n return true;\n }\n\n const response = await apiDeleteDataset(\n credentials!,\n name,\n clientConfig\n );\n\n if (response.ok) {\n // Refresh datasets list\n await contextRefresh();\n return true;\n }\n\n setError(response.error || 'Delete failed');\n return false;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Delete failed';\n setError(message);\n return false;\n }\n }, [credentials, selectedWorkspace, clientConfig, contextRefresh, isMockMode]);\n\n /**\n * Refresh datasets list\n */\n const refreshDatasets = useCallback(async () => {\n setError(null);\n try {\n await contextRefresh();\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Refresh failed';\n setError(message);\n }\n }, [contextRefresh]);\n\n return {\n datasets,\n isLoading: isLoadingDatasets,\n error,\n uploadDataset,\n downloadDataset,\n deleteDataset,\n refreshDatasets,\n };\n}\n","'use client';\n\n/**\n * useVisualizations Hook\n *\n * Provides access to workspace visualizations.\n *\n * @example\n * ```tsx\n * function VizGallery() {\n * const { visualizations, isLoading } = useVisualizations();\n *\n * return (\n * <div className=\"grid\">\n * {visualizations.map(viz => (\n * <img key={viz.name} src={viz.imageUrl} alt={viz.name} />\n * ))}\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport type { UseVisualizationsReturn } from '../types';\n\n/**\n * Hook for visualization operations\n */\nexport function useVisualizations(): UseVisualizationsReturn {\n const {\n visualizations,\n refreshVisualizations: contextRefresh,\n isLoadingVisualizations,\n } = useFlowstack();\n\n const [error, setError] = useState<string | null>(null);\n\n /**\n * Refresh visualizations list\n */\n const refreshVisualizations = useCallback(async () => {\n setError(null);\n try {\n await contextRefresh();\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Refresh failed';\n setError(message);\n }\n }, [contextRefresh]);\n\n return {\n visualizations,\n isLoading: isLoadingVisualizations,\n error,\n refreshVisualizations,\n };\n}\n","'use client';\n\n/**\n * useReports Hook\n *\n * Provides report management functionality.\n *\n * @example\n * ```tsx\n * function ReportsList() {\n * const { reports, downloadReport, isLoading } = useReports();\n *\n * const handleDownload = async (report) => {\n * const blob = await downloadReport(report.url, report.name, report.format);\n * if (blob) {\n * const url = URL.createObjectURL(blob);\n * window.open(url, '_blank');\n * }\n * };\n *\n * return (\n * <ul>\n * {reports.map(r => (\n * <li key={r.id}>\n * {r.name}\n * <button onClick={() => handleDownload(r)}>Download</button>\n * </li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport type { UseReportsReturn, ReportInfo } from '../types';\n\n/**\n * Hook for report operations\n */\nexport function useReports(): UseReportsReturn {\n const {\n credentials,\n reports,\n refreshReports: contextRefresh,\n isLoadingReports,\n config,\n } = useFlowstack();\n\n const [error, setError] = useState<string | null>(null);\n\n /**\n * Upload a report file\n */\n const uploadReport = useCallback(async (\n _file: File,\n _name?: string\n ): Promise<ReportInfo | null> => {\n setError(null);\n\n // Report upload would go through the same upload endpoint\n // Implementation depends on backend support\n setError('Report upload not implemented');\n return null;\n }, []);\n\n /**\n * Download a report\n */\n const downloadReport = useCallback(async (\n url: string,\n _name: string,\n _format: string\n ): Promise<Blob | null> => {\n setError(null);\n\n if (!credentials) {\n setError('Not authenticated');\n return null;\n }\n\n try {\n const response = await fetch(url, {\n headers: {\n 'Authorization': `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': credentials.tenantId,\n 'X-User-ID': credentials.userId || '',\n },\n });\n\n if (!response.ok) {\n setError(`Download failed: ${response.statusText}`);\n return null;\n }\n\n return await response.blob();\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Download failed';\n setError(message);\n return null;\n }\n }, [credentials]);\n\n /**\n * Refresh reports list\n */\n const refreshReports = useCallback(async () => {\n setError(null);\n try {\n await contextRefresh();\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Refresh failed';\n setError(message);\n }\n }, [contextRefresh]);\n\n return {\n reports,\n isLoading: isLoadingReports,\n error,\n uploadReport,\n downloadReport,\n refreshReports,\n };\n}\n","'use client';\n\n/**\n * useModels Hook\n *\n * Provides ML model management functionality.\n *\n * @example\n * ```tsx\n * function ModelsList() {\n * const { models, downloadModel, isLoading } = useModels();\n *\n * const handleDownload = async (name: string) => {\n * const blob = await downloadModel(name);\n * if (blob) {\n * const url = URL.createObjectURL(blob);\n * const a = document.createElement('a');\n * a.href = url;\n * a.download = name;\n * a.click();\n * }\n * };\n *\n * return (\n * <ul>\n * {models.map(m => (\n * <li key={m.id}>\n * {m.name} ({m.format})\n * <button onClick={() => handleDownload(m.name)}>Download</button>\n * </li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport type { UseModelsReturn } from '../types';\n\n/**\n * Hook for ML model operations\n */\nexport function useModels(): UseModelsReturn {\n const {\n credentials,\n selectedWorkspace,\n models,\n refreshModels: contextRefresh,\n isLoadingModels,\n config,\n } = useFlowstack();\n\n const [error, setError] = useState<string | null>(null);\n\n /**\n * Download a model\n */\n const downloadModel = useCallback(async (name: string): Promise<Blob | null> => {\n setError(null);\n\n if (!credentials) {\n setError('Not authenticated');\n return null;\n }\n\n if (!selectedWorkspace) {\n setError('No workspace selected');\n return null;\n }\n\n try {\n // Find model to get download URL\n const model = models.find(m => m.name === name);\n if (!model?.download_url) {\n setError('Model download URL not available');\n return null;\n }\n\n const response = await fetch(model.download_url, {\n headers: {\n 'Authorization': `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': credentials.tenantId,\n 'X-User-ID': credentials.userId || '',\n },\n });\n\n if (!response.ok) {\n setError(`Download failed: ${response.statusText}`);\n return null;\n }\n\n return await response.blob();\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Download failed';\n setError(message);\n return null;\n }\n }, [credentials, selectedWorkspace, models]);\n\n /**\n * Refresh models list\n */\n const refreshModels = useCallback(async () => {\n setError(null);\n try {\n await contextRefresh();\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Refresh failed';\n setError(message);\n }\n }, [contextRefresh]);\n\n return {\n models,\n isLoading: isLoadingModels,\n error,\n downloadModel,\n refreshModels,\n };\n}\n","'use client';\n\n/**\n * useDataSources Hook\n *\n * Provides data source management for connecting to external databases.\n *\n * @example\n * ```tsx\n * function ConnectDB() {\n * const { dataSources, createDataSource, testConnection, isLoading } = useDataSources();\n *\n * const connect = async () => {\n * const source = await createDataSource({\n * type: 'mongodb',\n * name: 'Production DB',\n * connectionString: 'mongodb://...'\n * });\n *\n * if (source) {\n * const result = await testConnection(source.source_id);\n * console.log(result.success ? 'Connected!' : result.message);\n * }\n * };\n *\n * return (\n * <div>\n * <button onClick={connect}>Connect MongoDB</button>\n * <ul>\n * {dataSources.map(ds => (\n * <li key={ds.source_id}>{ds.name} ({ds.source_type})</li>\n * ))}\n * </ul>\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback, useEffect } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport type { UseDataSourcesReturn, DataSource, DataSourceConfig, ConnectionTestResult } from '../types';\nimport {\n listDataSources,\n createDataSource as apiCreateDataSource,\n testDataSource,\n deleteDataSource as apiDeleteDataSource,\n} from '../api/client';\n\n/**\n * Hook options for {@link useDataSources}.\n */\nexport interface UseDataSourcesOptions {\n /**\n * P0-69: when true, appends `include_provenance=true` to the list\n * request so each data source comes back with a `_flowstack`\n * workspace attribution envelope. Useful for built apps that need to\n * know which workspace a shared data source belongs to.\n */\n includeProvenance?: boolean;\n}\n\n/**\n * Hook for data source management\n */\nexport function useDataSources(options?: UseDataSourcesOptions): UseDataSourcesReturn {\n const {\n credentials,\n config,\n } = useFlowstack();\n\n const [dataSources, setDataSources] = useState<DataSource[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const clientConfig = {\n baseUrl: config.baseUrl,\n tenantId: config.tenantId,\n };\n const includeProvenance = options?.includeProvenance;\n\n /**\n * Refresh data sources list\n */\n const refreshDataSources = useCallback(async () => {\n if (!credentials) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await listDataSources(credentials, clientConfig, { includeProvenance });\n\n if (response.ok && response.data) {\n setDataSources(response.data.datasources || []);\n } else {\n setError(response.error || 'Failed to load data sources');\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to load data sources';\n setError(message);\n } finally {\n setIsLoading(false);\n }\n }, [credentials, clientConfig, includeProvenance]);\n\n // Load data sources on mount\n useEffect(() => {\n if (credentials) {\n refreshDataSources();\n }\n }, [credentials]); // eslint-disable-line react-hooks/exhaustive-deps\n\n /**\n * Create a new data source\n */\n const createDataSource = useCallback(async (\n sourceConfig: DataSourceConfig\n ): Promise<DataSource | null> => {\n setError(null);\n\n if (!credentials) {\n setError('Not authenticated');\n return null;\n }\n\n try {\n const response = await apiCreateDataSource(credentials, sourceConfig, clientConfig);\n\n if (response.ok && response.data) {\n // Refresh list\n await refreshDataSources();\n return response.data;\n }\n\n setError(response.error || 'Failed to create data source');\n return null;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to create data source';\n setError(message);\n return null;\n }\n }, [credentials, clientConfig, refreshDataSources]);\n\n /**\n * Test a data source connection\n */\n const testConnection = useCallback(async (id: string): Promise<ConnectionTestResult> => {\n setError(null);\n\n if (!credentials) {\n return { success: false, message: 'Not authenticated' };\n }\n\n try {\n const response = await testDataSource(credentials, id, clientConfig);\n\n if (response.ok && response.data) {\n return response.data;\n }\n\n return { success: false, message: response.error || 'Connection test failed' };\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Connection test failed';\n return { success: false, message };\n }\n }, [credentials, clientConfig]);\n\n /**\n * Delete a data source\n */\n const deleteDataSource = useCallback(async (id: string): Promise<boolean> => {\n setError(null);\n\n if (!credentials) {\n setError('Not authenticated');\n return false;\n }\n\n try {\n const response = await apiDeleteDataSource(credentials, id, clientConfig);\n\n if (response.ok) {\n // Refresh list\n await refreshDataSources();\n return true;\n }\n\n setError(response.error || 'Failed to delete data source');\n return false;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to delete data source';\n setError(message);\n return false;\n }\n }, [credentials, clientConfig, refreshDataSources]);\n\n return {\n dataSources,\n isLoading,\n error,\n createDataSource,\n testConnection,\n deleteDataSource,\n refreshDataSources,\n };\n}\n","/**\n * Server-Sent Events (SSE) parser for streaming responses.\n *\n * ─── ARCHITECTURE ───────────────────────────────────────────────────────\n *\n * The backend (streaming_v2.py) emits SSE in standard two-line format:\n *\n * event: delta\n * data: {\"delta\": {\"text\": \"Hello\"}}\n *\n * event: tool_call\n * data: {\"name\": \"execute_python\", \"id\": \"toolu_01...\", \"args\": {...}}\n *\n * event: tool_result\n * data: {\"tool_use_id\": \"toolu_01...\", \"content\": \"...\", \"status\": \"success\"}\n *\n * event: complete\n * data: {\"event_count\": 483, \"execution_ms\": 12340}\n *\n * This parser:\n * 1. Pairs `event:` lines with the next `data:` line (pendingEventType)\n * 2. Normalizes the JSON payload into a consistent StreamEvent shape\n * 3. Yields events for consumption by useAgent() hook\n *\n * ─── V2 BACKEND EVENT FORMATS ──────────────────────────────────────────\n *\n * Text deltas: event: delta → data: {\"delta\": {\"text\": \"token\"}}\n * Tool calls: event: tool_call → data: {\"name\": \"...\", \"id\": \"...\", \"args\": {...}}\n * Tool results: event: tool_result → data: {\"tool_use_id\": \"...\", \"content\": \"...\"}\n * Final text: event: text → data: {\"content\": \"full response\", \"accumulated\": true}\n * Stream end: event: complete → data: {\"event_count\": N, \"execution_ms\": N}\n * Errors: event: error → data: {\"error\": \"message\"}\n *\n * ────────────────────────────────────────────────────────────────────────\n */\n\nimport type { StreamEvent, StreamEventType } from '../types';\n\n/**\n * Parse a single SSE line into a StreamEvent.\n *\n * Handles three line types:\n * - \"data: {...}\" → Parse JSON, normalize to StreamEvent\n * - \"data: [DONE]\" → Return done event\n * - \"event: type\" → Return bare type (used by parseSSEStream for pairing)\n *\n * @param line - Raw SSE line (e.g., \"data: {...}\")\n * @returns Parsed StreamEvent or null\n */\nexport function parseSSELine(line: string): StreamEvent | null {\n // Skip empty lines and comments (SSE spec: lines starting with \":\" are comments)\n if (!line || line.startsWith(':')) {\n return null;\n }\n\n // Parse \"data: \" prefix — this is where the actual payload lives\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n\n // Handle [DONE] signal (OpenAI-style stream termination)\n if (data === '[DONE]') {\n return { type: 'done' };\n }\n\n try {\n const parsed = JSON.parse(data);\n return normalizeEvent(parsed);\n } catch {\n // Non-JSON data: treat as plain text content\n return { type: 'content', content: data };\n }\n }\n\n // Parse \"event: \" prefix — bare event type, no payload.\n // In parseSSEStream, this is captured as pendingEventType and applied\n // to the NEXT data: line. We still return it here for standalone use.\n if (line.startsWith('event: ')) {\n const eventType = line.slice(7) as StreamEventType;\n return { type: eventType };\n }\n\n return null;\n}\n\n/**\n * Normalize a parsed JSON payload into a consistent StreamEvent.\n *\n * ─── WHY THIS EXISTS ────────────────────────────────────────────────────\n *\n * Different backends and API versions emit events in different JSON shapes.\n * This function maps ALL of them to a single StreamEvent interface so\n * the useAgent() hook doesn't need to know about format differences.\n *\n * ─── FORMAT PRIORITY ────────────────────────────────────────────────────\n *\n * Formats are checked in this order (first match wins):\n *\n * 1. Standard {type: \"...\"} — has explicit type field (e.g., v2 metadata/text/complete)\n * 2. Delta {delta: {text: \"...\"}} — v2 incremental text tokens\n * 3. Content block {content_block: {...}} — Anthropic raw format\n * 4. Tool format {name: \"...\", args: {...}} — v2 tool_call/tool_result events\n * 5. Text {text: \"...\" | content: \"...\"} — simple text payloads\n * 6. Error {error: \"...\"} — error events\n * 7. Visualization {visualization: {...}} — chart/image data\n * 8. Credit status {credits: N} — billing events\n * 9. Progress {step: \"...\" | percentage: N} — progress updates\n * 10. Fallback — generic content event\n *\n * ────────────────────────────────────────────────────────────────────────\n */\nfunction normalizeEvent(data: Record<string, unknown>): StreamEvent {\n\n // ── 1. STANDARD FORMAT: {type: \"...\", ...} ──────────────────────────\n // Events that already declare their type. Most v2 events with explicit\n // type fields hit this path (metadata, text, complete, error).\n // Also handles tool_call when type is present — note we check data.name\n // as a fallback for tool since v2 emits \"name\" not \"tool\".\n if (data.type) {\n return {\n type: normalizeEventType(String(data.type)),\n content: data.content as string | undefined,\n tool: (data.tool || data.name) as string | undefined,\n toolUseId: (data.tool_use_id || data.toolUseId || data.id) as string | undefined,\n args: (data.args || data.input) as Record<string, unknown> | undefined,\n result: data.result,\n // P0-132 (G1): preserve the tool_result error flag (backend key: `is_error`).\n isError: (data.is_error ?? data.isError) as boolean | undefined,\n error: data.error as string | undefined,\n data: data.data,\n message: data.message as string | undefined,\n percentage: data.percentage as number | undefined,\n };\n }\n\n // ── 2. DELTA FORMAT: {delta: {text: \"...\"}} ─────────────────────────\n // V2 backend emits incremental text tokens as:\n // event: delta\n // data: {\"delta\": {\"text\": \"Hello\"}}\n //\n // The delta object may or may not have a \"type\" field:\n // - Anthropic raw: {type: \"text_delta\", text: \"...\"}\n // - V2 backend: {text: \"...\"} (no type field)\n // - Tool input: {type: \"input_json_delta\", partial_json: \"...\"}\n if (data.delta) {\n const delta = data.delta as Record<string, unknown>;\n // Anthropic raw text_delta format\n if (delta.type === 'text_delta') {\n return { type: 'text', content: delta.text as string };\n }\n // Anthropic raw tool input streaming\n if (delta.type === 'input_json_delta') {\n return { type: 'tool_use', args: { partial: delta.partial_json } };\n }\n // V2 backend delta format: {\"delta\": {\"text\": \"...\"}} — no type field.\n // This is the PRIMARY text streaming path for v2.\n if (delta.text) {\n return { type: 'delta', content: delta.text as string };\n }\n }\n\n // ── 3. CONTENT BLOCK FORMAT: {content_block: {...}} ─────────────────\n // Anthropic raw content_block_start events (not commonly seen with v2)\n if (data.content_block) {\n const block = data.content_block as Record<string, unknown>;\n if (block.type === 'text') {\n return { type: 'text', content: block.text as string };\n }\n if (block.type === 'tool_use') {\n return {\n type: 'tool_use',\n tool: block.name as string,\n args: block.input as Record<string, unknown>,\n };\n }\n }\n\n // ── 4. TOOL FORMAT: {name: \"...\", id: \"...\", args: {...}} ───────────\n // V2 tool_call events: {\"name\": \"execute_python\", \"id\": \"toolu_...\", \"args\": {...}}\n // V2 tool_result events: {\"tool_use_id\": \"toolu_...\", \"content\": \"...\", \"status\": \"success\"}\n //\n // Detection: any of tool_use_id, tool_name, or name present.\n // Disambiguation: if content/output exists → tool_result, else → tool_use.\n //\n // NOTE: checks both data.input (Anthropic format) and data.args (v2 format)\n if (data.tool_use_id || data.tool_name || data.name) {\n return {\n type: data.content || data.output ? 'tool_result' : 'tool_use',\n tool: (data.tool_name || data.name) as string | undefined,\n toolUseId: (data.tool_use_id || data.id) as string | undefined,\n args: (data.input || data.args) as Record<string, unknown> | undefined,\n result: data.content || data.output,\n // P0-132 (G1): preserve the tool_result error flag (backend key: `is_error`).\n isError: (data.is_error ?? data.isError) as boolean | undefined,\n };\n }\n\n // ── 5. PLAIN TEXT: {text: \"...\" | content: \"...\"} ───────────────────\n if (data.text || data.content) {\n return { type: 'text', content: (data.text || data.content) as string };\n }\n\n // ── 6. ERROR: {error: \"...\"} ────────────────────────────────────────\n if (data.error) {\n return { type: 'error', error: data.error as string };\n }\n\n // ── 7. VISUALIZATION: {visualization: {...}} ────────────────────────\n if (data.visualization || data.image_url || data.imageUrl) {\n return {\n type: 'visualization',\n data: data.visualization || {\n imageUrl: data.image_url || data.imageUrl,\n name: data.name,\n format: data.format,\n },\n };\n }\n\n // ── 8. CREDIT STATUS: {credits: N | remaining: N} ──────────────────\n if (data.credits !== undefined || data.remaining !== undefined) {\n return {\n type: 'credit_status',\n data: {\n remaining: data.credits ?? data.remaining,\n used: data.used,\n },\n };\n }\n\n // ── 9. PROGRESS: {step: \"...\" | percentage: N} ─────────────────────\n if (data.step || data.progress || data.percentage !== undefined) {\n return {\n type: 'progress',\n message: (data.step || data.progress) as string | undefined,\n percentage: data.percentage as number | undefined,\n };\n }\n\n // ── 10. FALLBACK ────────────────────────────────────────────────────\n // Unknown format — wrap as generic content event for debugging\n return { type: 'content', data };\n}\n\n/**\n * Normalize event type strings to standard StreamEventType values.\n *\n * Maps backend-specific type names to the canonical types that useAgent()\n * switches on. This is where aliases collapse:\n * \"content_block_delta\" → \"delta\"\n * \"viz\" → \"visualization\"\n * \"message_stop\" → \"done\"\n */\nfunction normalizeEventType(type: string): StreamEventType {\n const typeMap: Record<string, StreamEventType> = {\n // Text streaming\n 'text': 'text', // Final accumulated text (v2: event: text)\n 'delta': 'delta', // Incremental token (v2: event: delta)\n 'content': 'content', // Generic content\n 'content_block_delta': 'delta', // Anthropic raw format → delta\n\n // Tool lifecycle\n 'tool_use': 'tool_use', // Tool invocation start\n 'tool_call': 'tool_call', // V2 tool call with name + args\n 'tool_result': 'tool_result', // Tool execution result\n\n // Data events\n 'visualization': 'visualization',\n 'viz': 'visualization', // Shorthand alias\n\n // Progress\n 'progress': 'progress',\n 'step': 'progress', // Step-based progress alias\n\n // Billing\n 'credit_status': 'credit_status',\n 'credits': 'credit_status', // Shorthand alias\n\n // P0-66: per-query execution budget snapshot (time/tool/cost)\n 'budget_update': 'budget_update',\n\n // Stream lifecycle\n 'metadata': 'metadata', // V2 metadata with session info + data sources\n 'complete': 'complete', // V2 stream end event\n 'done': 'done', // OpenAI-style stream end\n 'message_stop': 'done', // Anthropic raw format → done\n\n // Interrupt\n 'interrupt': 'interrupt',\n\n // Errors\n 'error': 'error',\n };\n\n return typeMap[type.toLowerCase()] || 'content';\n}\n\n/**\n * Async generator that reads a ReadableStream and yields parsed StreamEvents.\n *\n * ─── SSE WIRE FORMAT ────────────────────────────────────────────────────\n *\n * The backend sends events as two-line pairs separated by blank lines:\n *\n * event: delta\\n ← event type (optional but v2 always sends it)\n * data: {\"delta\":...}\\n ← JSON payload\n * \\n ← blank line = end of event\n *\n * This generator:\n * 1. Buffers incoming bytes and splits on newlines\n * 2. When it sees \"event: X\", stores X as pendingEventType\n * 3. When it sees \"data: {...}\", parses the JSON via normalizeEvent()\n * 4. Applies the pending event type (overrides whatever normalizeEvent guessed)\n * 5. Yields the final StreamEvent\n *\n * This pairing is critical because normalizeEvent may guess wrong\n * (e.g., a tool_call payload with \"name\" field could be mistaken for\n * tool_use), but the explicit \"event: tool_call\" line corrects it.\n *\n * ────────────────────────────────────────────────────────────────────────\n *\n * @param reader - ReadableStreamDefaultReader from fetch response\n * @returns AsyncGenerator yielding StreamEvents\n */\nexport async function* parseSSEStream(\n reader: ReadableStreamDefaultReader<Uint8Array>\n): AsyncGenerator<StreamEvent, void, unknown> {\n const decoder = new TextDecoder();\n let buffer = '';\n // Stores the event type from an \"event: X\" line until the next \"data: \" line\n let pendingEventType: string | null = null;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n // Append decoded chunk to buffer, split into complete lines\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n // Last element is incomplete (no trailing newline yet) — keep in buffer\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n // \"event: delta\" → store type, DON'T yield yet.\n // The actual payload comes on the next \"data: \" line.\n if (trimmed.startsWith('event: ')) {\n pendingEventType = trimmed.slice(7);\n continue;\n }\n\n // \"data: {...}\" → parse JSON and yield as StreamEvent\n const event = parseSSELine(trimmed);\n if (event) {\n // Override the type that normalizeEvent() guessed with the\n // explicit type from the preceding \"event: \" line.\n // This ensures \"event: tool_call\" + \"data: {name: ...}\"\n // correctly yields {type: 'tool_call'} not {type: 'tool_use'}.\n if (pendingEventType) {\n event.type = normalizeEventType(pendingEventType);\n pendingEventType = null;\n }\n\n yield event;\n\n // Stream termination — stop reading after done/complete\n if (event.type === 'done' || event.type === 'complete') {\n return;\n }\n }\n }\n }\n\n // Process any remaining bytes in the buffer after stream closes\n if (buffer.trim()) {\n const event = parseSSELine(buffer.trim());\n if (event) {\n yield event;\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Convenience wrapper: process an SSE stream with callbacks instead of async iteration.\n * Used when you prefer callback-style over for-await-of.\n *\n * @param response - Fetch Response with SSE body\n * @param onEvent - Called for each parsed StreamEvent\n * @param onError - Called if the stream throws (optional)\n */\nexport async function processSSEStream(\n response: Response,\n onEvent: (event: StreamEvent) => void,\n onError?: (error: Error) => void\n): Promise<void> {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Response body is not readable');\n }\n\n try {\n for await (const event of parseSSEStream(reader)) {\n onEvent(event);\n }\n } catch (error) {\n if (onError && error instanceof Error) {\n onError(error);\n } else {\n throw error;\n }\n }\n}\n","/**\n * Stream content utilities — ported from mobile casino-utils.ts + error-utils.ts\n * Handles JSON blob filtering, content deduplication, table repair, and cleaning.\n */\n\n/** Check if a string looks like raw JSON (object or array). */\nexport function isJsonBlob(s: string): boolean {\n const t = s.trimStart();\n return t.startsWith('{\"') || t.startsWith('[{') || t.startsWith('[\"');\n}\n\n/** Extract a human-readable summary from a JSON event blob. */\nexport function summarizeJsonEvent(raw: string, tool?: string): string | null {\n try {\n const d = JSON.parse(raw);\n if (d.status === 'success' && d.count !== undefined) {\n return `Found ${d.count} dataset${d.count !== 1 ? 's' : ''}${d.query ? ` for \"${d.query}\"` : ''}`;\n }\n if (d.status === 'progress' && d.message) {\n return typeof d.message === 'string' ? d.message : null;\n }\n const msg = d.message || d.description || d.status;\n if (typeof msg === 'string' && msg.length < 120) {\n return tool ? `${tool}: ${msg}` : msg;\n }\n if (Array.isArray(d) && d.length > 0) {\n return `Received ${d.length} result${d.length !== 1 ? 's' : ''}`;\n }\n return tool ? `${tool} processing...` : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Detect and strip doubled content from streaming responses.\n * The backend sometimes sends the full response twice.\n */\nexport function dedupeContent(text: string): string {\n if (!text || text.length < 100) return text;\n\n const len = text.length;\n const mid = Math.floor(len / 2);\n\n for (let offset = 0; offset <= Math.floor(len * 0.05); offset++) {\n for (const m of [mid + offset, mid - offset]) {\n if (m < 50 || m > len - 50) continue;\n\n const a = text.slice(0, m);\n const b = text.slice(m);\n\n if (Math.abs(a.length - b.length) > Math.min(a.length, b.length) * 0.15) continue;\n\n const norm = (s: string) =>\n s.toLowerCase().replace(/\\s+/g, ' ').replace(/[*#_`\\-|>]/g, '').trim();\n\n const na = norm(a);\n const nb = norm(b);\n\n const cmpLen = 60;\n if (na.length < cmpLen || nb.length < cmpLen) continue;\n\n const prefixMatch = na.slice(0, cmpLen) === nb.slice(0, cmpLen);\n const suffixMatch = na.slice(-cmpLen) === nb.slice(-cmpLen);\n\n const midSample = Math.floor(Math.min(na.length, nb.length) / 2);\n const midMatch = na.slice(midSample, midSample + 30) === nb.slice(midSample, midSample + 30);\n\n if (prefixMatch && suffixMatch && midMatch) {\n return b.trim();\n }\n }\n }\n\n return text;\n}\n\n/** Check if a line is a markdown table separator row. */\nfunction isSeparatorRow(line: string): boolean {\n return /^\\|[\\s:-]*-{2,}[\\s|:-]*\\|?$/.test(line.trim());\n}\n\n/** Repair markdown tables broken by streaming concatenation. */\nfunction repairTables(text: string): string {\n if (!text.includes('|')) return text;\n\n let s = text;\n\n // Handle entire table on a single line\n s = s.replace(/^(\\|[^\\n]*\\|)$/gm, (line) => {\n const cells = line.split('|').slice(1);\n if (cells.length > 0 && !cells[cells.length - 1].trim()) cells.pop();\n if (cells.length < 6) return line;\n\n const isSep = cells.map(c => /^\\s*:?-{2,}:?\\s*$/.test(c));\n let sepStart = -1;\n let sepLen = 0;\n for (let i = 0; i < isSep.length; i++) {\n if (isSep[i]) {\n if (sepStart === -1) sepStart = i;\n sepLen++;\n } else if (sepStart !== -1) break;\n }\n if (sepLen < 2 || sepStart < sepLen) return line;\n const cols = sepLen;\n if (sepStart !== cols) return line;\n const dataCells = cells.slice(sepStart + cols);\n if (dataCells.length < cols) return line;\n\n const header = '| ' + cells.slice(0, cols).map(c => c.trim()).join(' | ') + ' |';\n const sep = '| ' + cells.slice(sepStart, sepStart + cols).map(c => c.trim()).join(' | ') + ' |';\n const rows: string[] = [];\n for (let i = 0; i < dataCells.length; i += cols) {\n const chunk = dataCells.slice(i, i + cols);\n if (chunk.length === cols) {\n rows.push('| ' + chunk.map(c => c.trim()).join(' | ') + ' |');\n } else if (chunk.some(c => c.trim())) {\n while (chunk.length < cols) chunk.push(' ');\n rows.push('| ' + chunk.map(c => c.trim()).join(' | ') + ' |');\n }\n }\n return [header, sep, ...rows].join('\\n');\n });\n\n // Strip separator fragments glued to header row end\n s = s.replace(\n /^(\\|[^|\\n]+(?:\\|[^|\\n]+)*\\|)\\s*---[-|\\s]*$/gm,\n (match, captured) => {\n const cells = captured.split('|').filter((c: string) => c.trim());\n if (cells.every((c: string) => /^[\\s:-]*-{2,}[\\s:-]*$/.test(c))) return match;\n return captured;\n }\n );\n\n // Fix fragmented separator rows\n s = s.replace(\n /^(\\|[^|\\n]+(?:\\|[^|\\n]+)*)\\|\\s*\\|---\\n(?:[-|\\s]*\\n)*/gm,\n (match, headerPart) => {\n const cols = (headerPart.match(/\\|/g) || []).length;\n if (cols < 1) return match;\n return headerPart + '|\\n|' + Array(cols).fill(' --- ').join('|') + '|\\n';\n }\n );\n\n // Split concatenated table rows\n s = s.replace(/\\|\\s*\\|(?=\\s*[^\\s|])/g, '|\\n|');\n\n // Clean orphaned separator debris\n s = s.replace(/^-+\\|[-|\\s]*$/gm, '');\n s = s.replace(/^[-|\\s]*\\|---[-|\\s]*$/gm, '');\n s = s.replace(/^\\|\\s*$/gm, '');\n s = s.replace(/\\n{3,}/g, '\\n\\n');\n\n // Find table blocks and ensure separator + split over-long rows\n const lines = s.split('\\n');\n const result: string[] = [];\n let i = 0;\n while (i < lines.length) {\n const line = lines[i];\n if ((line.match(/\\|/g) || []).length >= 2 && !isSeparatorRow(line)) {\n const tableLines: string[] = [line];\n let hasSeparator = false;\n let j = i + 1;\n while (j < lines.length) {\n const next = lines[j];\n if ((next.match(/\\|/g) || []).length >= 2 || isSeparatorRow(next)) {\n if (isSeparatorRow(next)) hasSeparator = true;\n tableLines.push(next);\n j++;\n } else if (next.trim() === '') {\n if (j + 1 < lines.length && (lines[j + 1].match(/\\|/g) || []).length >= 2) {\n tableLines.push(next);\n j++;\n } else break;\n } else break;\n }\n const headerCols = (tableLines[0].match(/\\|/g) || []).length - 1;\n\n const expanded: string[] = [];\n for (const tl of tableLines) {\n if (tl.trim() === '') continue;\n if (isSeparatorRow(tl) || headerCols < 2) {\n expanded.push(tl);\n continue;\n }\n const rowPipes = (tl.match(/\\|/g) || []).length - 1;\n if (rowPipes > headerCols && rowPipes >= headerCols * 2) {\n const cells = tl.split('|');\n const inner = cells.slice(1, -1);\n for (let c = 0; c < inner.length; c += headerCols) {\n const chunk = inner.slice(c, c + headerCols);\n if (chunk.length === headerCols) {\n expanded.push('|' + chunk.join('|') + '|');\n } else if (chunk.some(cell => cell.trim())) {\n while (chunk.length < headerCols) chunk.push(' ');\n expanded.push('|' + chunk.join('|') + '|');\n }\n }\n } else {\n expanded.push(tl);\n }\n }\n\n if (!hasSeparator && expanded.length >= 2 && headerCols >= 2) {\n const sep = '|' + Array(headerCols).fill(' --- ').join('|') + '|';\n result.push(expanded[0], sep);\n for (let k = 1; k < expanded.length; k++) result.push(expanded[k]);\n } else if (hasSeparator && headerCols >= 2) {\n for (const tl of expanded) {\n if (isSeparatorRow(tl)) {\n const sepCols = (tl.match(/\\|/g) || []).length - 1;\n result.push(sepCols !== headerCols\n ? '|' + Array(headerCols).fill(' --- ').join('|') + '|'\n : tl);\n } else {\n result.push(tl);\n }\n }\n } else {\n result.push(...expanded);\n }\n i = j;\n } else {\n result.push(line);\n i++;\n }\n }\n s = result.join('\\n');\n\n // Ensure table blocks have blank line before them\n s = s.replace(/([^\\n])\\n(\\|[^\\n]*\\|[^\\n]*\\n\\|[\\s|:-]+\\|)/g, '$1\\n\\n$2');\n\n return s;\n}\n\n/**\n * Detect markdown tables that streaming concatenation collapsed onto one line\n * and re-insert row boundaries so remarkGfm can parse them.\n *\n * Ported from casino/components/workspace/ChatMessage.tsx (lines 106-137).\n */\nexport function unflattenMarkdownTables(content: string): string {\n if (!content) return content;\n if (!content.includes('|')) return content;\n if (!/\\|\\s*:?-{3,}:?\\s*\\|/.test(content)) return content;\n\n const lines = content.split('\\n');\n const rewritten = lines.map((line) => {\n if (!/\\|\\s*:?-{3,}:?\\s*\\|/.test(line)) return line;\n const rebuilt = line.replace(/ \\| \\| /g, ' |\\n| ');\n if (rebuilt === line) return line;\n const firstPipe = rebuilt.indexOf('|');\n if (firstPipe > 0) {\n const lead = rebuilt.slice(0, firstPipe).trimEnd();\n const table = rebuilt.slice(firstPipe);\n return lead ? `${lead}\\n\\n${table}` : table;\n }\n return rebuilt;\n });\n return rewritten.join('\\n');\n}\n\n/**\n * Clean assistant message content before rendering as Markdown.\n */\nexport function cleanContent(text: string): string {\n if (!text) return text;\n\n let cleaned = text;\n\n // Strip S3 URLs — both clean and tokenizer-broken (streaming inserts spaces within URLs)\n cleaned = cleaned.replace(/Visualization URL:\\s*https?:\\/\\/[^\\s)]+/gi, '');\n // Strip markdown links containing S3 URLs (clean or broken)\n cleaned = cleaned.replace(/\\[([^\\]]*)\\]\\([^)]*s3\\.amazonaws\\.com[^)]*\\)/g, '$1');\n cleaned = cleaned.replace(/\\[([^\\]]*)\\]\\([^)]*X-Amz[^)]*\\)/g, '$1');\n // Strip clean S3 presigned URLs\n cleaned = cleaned.replace(/https?:\\/\\/[^\\s)]*\\.s3\\.amazonaws\\.com\\/[^\\s)]*\\?X-Amz[^\\s)]*/g, '');\n // Strip tokenizer-broken S3 URLs (spaces within URL) — match from https to closing paren or end of line\n cleaned = cleaned.replace(/https?\\s*:\\s*\\/\\s*\\/[^)]*s\\s*3\\s*\\.\\s*amazonaws\\s*\\.\\s*com[^)\\n]*(?:\\)|$)/gm, '');\n // Strip standalone lines that are purely X-Amz credential debris (no meaningful content)\n cleaned = cleaned.replace(/^\\s*(?:&?X\\s*-\\s*Amz\\s*-\\s*\\w+=[^\\n]*)+\\s*$/gm, '');\n // Strip lines that are just continuation of broken presigned URL tokens (>85% encoded chars, no pipe/table)\n cleaned = cleaned.replace(/^[A-Za-z0-9%+/=\\s]{20,}$/gm, (line) => {\n if (line.includes('|')) return line; // Preserve table rows\n const alphaPercent = (line.match(/[A-Za-z0-9%+/=]/g) || []).length;\n return alphaPercent / line.length > 0.85 ? '' : line;\n });\n\n // Strip JSON blobs that leak from tool results\n cleaned = cleaned.replace(/\\{\"status\"\\s*:\\s*\"[^\"]*\"[^{}]*(?:\\{[^{}]*(?:\\{[^{}]*\\}[^{}]*)*\\}[^{}]*)*\\}/g, '');\n cleaned = cleaned.replace(/(?:complete|success|error)\\s*\\{[^}]*(?:\\{[^}]*\\}[^}]*)*\\}/g, '');\n cleaned = cleaned.replace(/\\[\\s*\\{[^[\\]]*(?:\\[[^\\]]*\\][^[\\]]*)*\\}\\s*(?:,\\s*\\{[^[\\]]*\\}\\s*)*\\]/g, '');\n cleaned = cleaned.replace(/\\[?\\d+ rows? x \\d+ columns?\\]?\\s*/g, '');\n cleaned = cleaned.replace(/^.*(?:NaN\\s+){3,}.*$/gm, '');\n cleaned = cleaned.replace(/[\\d.]+ MB \\(streaming[^)]*\\)/g, '');\n cleaned = cleaned.replace(/,\"?error\"?\\s*:\\s*null[^}\\n]*/g, '');\n\n // Strip orchestrator self-talk\n cleaned = cleaned.replace(/(?:Let me|Now let me|I'll|I will)\\s+(?:start|begin|continue|retrieve|get|run|perform|compile|hand off|create|check|explore)[^.:\\n]*[.:]\\s*/gi, '');\n cleaned = cleaned.replace(/(?:Great|Perfect|Excellent|Wonderful)!\\s*/g, '');\n cleaned = cleaned.replace(/Now\\s+[a-z][^.:]*[.:]\\s*/g, '');\n\n // Fix streaming-broken tables\n cleaned = repairTables(cleaned);\n\n // Clean up excessive whitespace\n cleaned = cleaned.replace(/\\n{4,}/g, '\\n\\n\\n');\n\n return cleaned.trim();\n}\n\n/**\n * Parse error messages from the backend into user-friendly format.\n */\nexport function parseErrorMessage(raw: string): {\n message: string;\n isAuth: boolean;\n isContextLimit: boolean;\n} {\n let msg = raw;\n let isAuth = false;\n let isContextLimit = false;\n\n // Try to extract from JSON\n try {\n const parsed = JSON.parse(raw);\n msg = parsed.error || parsed.detail || parsed.message || raw;\n } catch {\n // Not JSON — use as-is\n }\n\n // Detect auth errors\n if (/token.*expired|unauthorized|401|403|permission denied|invalid.*token|auth.*required/i.test(msg)) {\n isAuth = true;\n msg = 'Session expired — tap Reconnect to continue.';\n }\n\n // Detect context limit\n if (/context.*limit|too many tokens|max.*context|prompt.*too.*long/i.test(msg)) {\n isContextLimit = true;\n msg = 'Conversation got too long. Starting fresh on next message.';\n }\n\n // Truncate overly long messages\n if (msg.length > 200) {\n msg = msg.substring(0, 197) + '...';\n }\n\n return { message: msg, isAuth, isContextLimit };\n}\n","/**\n * useCollection — Direct MongoDB access for built-app components.\n *\n * Provides reactive read access and direct write mutations (insert, update, remove)\n * to MongoDB collections. The agent is NOT involved in data operations.\n *\n * Collection names are auto-prefixed with app_scope by the backend —\n * just pass the short name (e.g. 'transactions', not 'site_abc__transactions').\n *\n * Usage:\n * const { documents, isLoading, insert, update, remove } = useCollection<Transaction>('transactions', {\n * sort: { date: -1 },\n * limit: 50,\n * refreshOnAgentComplete: true,\n * });\n *\n * // Insert a document — auto-refetches all useCollection('transactions') instances\n * await insert({ date: '2026-04-02', amount: 42.50, category: 'Groceries' });\n *\n * // Update a document\n * await update({ _id: docId }, { $set: { category: 'Dining' } });\n *\n * // Delete a document\n * await remove({ _id: docId });\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport { queryCollection, insertDocuments, updateDocuments, deleteDocuments } from '../api/client';\nimport type { CollectionLayer } from '../types';\n\nexport interface UseCollectionOptions {\n /** MongoDB query filter (e.g. { status: 'pending' }) */\n filter?: Record<string, any>;\n /** Max documents to return (default 50, max 500) */\n limit?: number;\n /** Skip N documents for pagination */\n skip?: number;\n /** Sort spec (e.g. { date: -1 } for newest first) */\n sort?: Record<string, 1 | -1>;\n /** Field projection (e.g. { _id: 0, amount: 1 }) */\n projection?: Record<string, 0 | 1>;\n /** Auto-poll interval in ms (optional — no polling by default) */\n refreshInterval?: number;\n /** Auto-refresh when agent completes a MongoDB write (default false) */\n refreshOnAgentComplete?: boolean;\n /** Skip initial fetch (useful for conditional rendering) */\n enabled?: boolean;\n /** Data layer override: 'shared' | 'user' | 'auto' (default: backend decides via app_config) */\n layer?: CollectionLayer;\n /**\n * P0-69: include workspace provenance envelope (`_flowstack`) on every\n * document in the response. Sends `include_provenance=true` on the\n * query string. When true, each document will have a `_flowstack`\n * field with workspace attribution metadata. Default false.\n */\n includeProvenance?: boolean;\n}\n\nexport interface UseCollectionReturn<T> {\n /** Array of documents from the collection */\n documents: T[];\n /** Number of documents returned (≤ limit) */\n count: number;\n /** Total documents matching the filter (for pagination) */\n total: number;\n /** Loading state */\n isLoading: boolean;\n /** Error message if query failed */\n error: string | null;\n /** Manual refresh — re-fetches with current options */\n refresh: () => Promise<void>;\n /** Insert one or more documents. Auto-refetches after success. */\n insert: (doc: Partial<T> | Partial<T>[]) => Promise<{ inserted_ids: string[] }>;\n /** Update documents matching filter. Auto-refetches after success. */\n update: (filter: Record<string, any>, update: Record<string, any>, opts?: { upsert?: boolean }) => Promise<{ modified_count: number }>;\n /** Delete documents matching filter. Auto-refetches after success. */\n remove: (filter: Record<string, any>) => Promise<{ deleted_count: number }>;\n}\n\n// Global event name for collection mutations (from useCollection or agent writes)\nexport const COLLECTION_CHANGED_EVENT = 'flowstack:collection-changed';\n\n/** Dispatch a collection changed event for cross-component sync. */\nfunction dispatchCollectionChanged(collection: string) {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent(COLLECTION_CHANGED_EVENT, { detail: { collection } }),\n );\n }\n}\n\nexport function useCollection<T = Record<string, any>>(\n collection: string,\n options?: UseCollectionOptions,\n): UseCollectionReturn<T> {\n const { credentials, config } = useFlowstack();\n\n const [documents, setDocuments] = useState<T[]>([]);\n const [count, setCount] = useState(0);\n const [total, setTotal] = useState(0);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Track mounted state to prevent state updates after unmount\n const mountedRef = useRef(true);\n useEffect(() => {\n mountedRef.current = true;\n return () => { mountedRef.current = false; };\n }, []);\n\n const enabled = options?.enabled !== false;\n\n const fetchData = useCallback(async () => {\n if (!credentials || !enabled) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await queryCollection<T>(\n credentials,\n collection,\n {\n filter: options?.filter,\n limit: options?.limit,\n skip: options?.skip,\n sort: options?.sort,\n projection: options?.projection,\n layer: options?.layer,\n includeProvenance: options?.includeProvenance,\n },\n { baseUrl: config.baseUrl, tenantId: config.tenantId },\n );\n\n if (!mountedRef.current) return;\n\n if (result.ok && result.data) {\n setDocuments(result.data.documents);\n setCount(result.data.count);\n setTotal(result.data.total);\n } else {\n setError(result.error || 'Failed to fetch collection');\n }\n } catch (err: any) {\n if (mountedRef.current) {\n setError(err.message || 'Network error');\n }\n } finally {\n if (mountedRef.current) {\n setIsLoading(false);\n }\n }\n }, [\n credentials,\n config.baseUrl,\n config.tenantId,\n collection,\n enabled,\n // Serialize options for dependency comparison\n JSON.stringify(options?.filter),\n options?.limit,\n options?.skip,\n JSON.stringify(options?.sort),\n JSON.stringify(options?.projection),\n options?.layer,\n ]);\n\n // Initial fetch + re-fetch on option changes\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n // Optional polling\n useEffect(() => {\n if (!options?.refreshInterval || !enabled) return;\n const interval = setInterval(fetchData, options.refreshInterval);\n return () => clearInterval(interval);\n }, [fetchData, options?.refreshInterval, enabled]);\n\n // Auto-refresh on collection change events (from mutations or agent writes)\n useEffect(() => {\n if (!options?.refreshOnAgentComplete) return;\n const handler = (e: Event) => {\n const detail = (e as CustomEvent)?.detail;\n // Refetch if event targets this collection or is a generic event (no collection specified)\n if (!detail?.collection || detail.collection === collection) {\n fetchData();\n }\n };\n window.addEventListener(COLLECTION_CHANGED_EVENT, handler);\n return () => window.removeEventListener(COLLECTION_CHANGED_EVENT, handler);\n }, [fetchData, options?.refreshOnAgentComplete, collection]);\n\n // --- Mutations ---\n\n const insert = useCallback(async (doc: Partial<T> | Partial<T>[]): Promise<{ inserted_ids: string[] }> => {\n if (!credentials) throw new Error('Not authenticated');\n\n const result = await insertDocuments(\n credentials,\n collection,\n doc as Record<string, any> | Record<string, any>[],\n { baseUrl: config.baseUrl, tenantId: config.tenantId },\n options?.layer,\n );\n\n if (!result.ok) {\n throw new Error(result.error || 'Insert failed');\n }\n\n // Notify other useCollection instances and refetch\n dispatchCollectionChanged(collection);\n await fetchData();\n\n return { inserted_ids: result.data!.inserted_ids };\n }, [credentials, config.baseUrl, config.tenantId, collection, fetchData, options?.layer]);\n\n const update = useCallback(async (\n filter: Record<string, any>,\n updateSpec: Record<string, any>,\n opts?: { upsert?: boolean },\n ): Promise<{ modified_count: number }> => {\n if (!credentials) throw new Error('Not authenticated');\n\n const result = await updateDocuments(\n credentials,\n collection,\n filter,\n updateSpec,\n opts,\n { baseUrl: config.baseUrl, tenantId: config.tenantId },\n options?.layer,\n );\n\n if (!result.ok) {\n throw new Error(result.error || 'Update failed');\n }\n\n dispatchCollectionChanged(collection);\n await fetchData();\n\n return { modified_count: result.data!.modified_count };\n }, [credentials, config.baseUrl, config.tenantId, collection, fetchData, options?.layer]);\n\n const remove = useCallback(async (filter: Record<string, any>): Promise<{ deleted_count: number }> => {\n if (!credentials) throw new Error('Not authenticated');\n\n const result = await deleteDocuments(\n credentials,\n collection,\n filter,\n { baseUrl: config.baseUrl, tenantId: config.tenantId },\n options?.layer,\n );\n\n if (!result.ok) {\n throw new Error(result.error || 'Delete failed');\n }\n\n dispatchCollectionChanged(collection);\n await fetchData();\n\n return { deleted_count: result.data!.deleted_count };\n }, [credentials, config.baseUrl, config.tenantId, collection, fetchData, options?.layer]);\n\n return {\n documents,\n count,\n total,\n isLoading,\n error,\n refresh: fetchData,\n insert,\n update,\n remove,\n };\n}\n","'use client';\n\n/**\n * useAgent Hook\n *\n * The main hook for interacting with AI agents. Supports pre-configured templates\n * and streaming responses with tool calls.\n *\n * @example\n * ```tsx\n * function ChatApp() {\n * const { query, messages, isStreaming, toolCalls, clearMessages } = useAgent('data-science');\n *\n * const handleSend = async (input: string) => {\n * await query(input);\n * };\n *\n * return (\n * <div>\n * {messages.map(m => (\n * <div key={m.id} className={m.role}>\n * {m.content}\n * </div>\n * ))}\n * {isStreaming && <div>Thinking...</div>}\n * <input onKeyDown={(e) => e.key === 'Enter' && handleSend(e.currentTarget.value)} />\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback, useRef, useEffect, useMemo } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport type { UseAgentReturn, UseAgentOptions, ChatMessage, ToolCall, AgentTemplate, VisualizationData, InterruptInfo, DataSourceBadgeInfo, PiiRedactedEntity, AttachmentInput } from '../types';\nimport { executeQueryWithConfig, uploadFile, uploadDocument } from '../api/client';\nimport { parseSSEStream } from '../utils/sse-parser';\nimport { mockDelay, mockChatHistory } from '../mock/fixtures';\nimport { isJsonBlob, summarizeJsonEvent, dedupeContent, cleanContent, parseErrorMessage, unflattenMarkdownTables } from '../utils/stream-utils';\nimport { COLLECTION_CHANGED_EVENT } from './useCollection';\n\n// P0-132 (G3): tool names whose completion should trigger a useCollection\n// refresh (refreshOnAgentComplete). The old gate only matched the legacy\n// mongodb_insert/update/delete names, but the real backend write tools are the\n// document/app-data tools below — so reactive refresh silently never fired and\n// apps had to call collection.refresh() manually. The legacy names are kept for\n// back-compat with any older backend build.\nconst COLLECTION_WRITE_TOOLS = new Set<string>([\n 'insert_documents',\n 'update_documents',\n 'delete_documents',\n 'insert_app_data',\n 'update_app_data',\n 'delete_app_data',\n // legacy aliases\n 'mongodb_insert',\n 'mongodb_update',\n 'mongodb_delete',\n]);\n\n// =============================================================================\n// Standalone Agent Service (mock mode → real GPT-4o-mini)\n// =============================================================================\n\n/**\n * Template system prompts for auto-provisioning agents.\n * Extracted from intent-analyzer DEFAULT_PATTERNS.\n */\nconst TEMPLATE_SYSTEM_PROMPTS: Record<string, string> = {\n 'data-science': `You are a data analyst specializing in exploratory data analysis.\nFocus on:\n- Statistical summaries and distributions\n- Identifying patterns, correlations, and anomalies\n- Providing actionable insights with supporting evidence\n- Creating clear visualizations when helpful\n\nAlways explain your methodology and confidence levels.`,\n 'marketing': `You are a content strategist and copywriter.\nFocus on:\n- Clear, engaging writing tailored to the audience\n- SEO optimization where appropriate\n- Consistent brand voice and messaging\n- Actionable calls-to-action\n\nAlways ask about target audience if unclear.`,\n 'support': `You are a customer support specialist.\nFocus on:\n- Understanding the customer's problem quickly\n- Providing clear, step-by-step solutions\n- Escalating when necessary\n- Being empathetic and professional\n\nAlways verify the solution works before closing.`,\n 'custom': 'You are a helpful AI assistant.',\n};\n\n/**\n * In-memory credentials for auto-provisioned agent sessions.\n * Intentionally NOT persisted to localStorage — every browser session\n * auto-provisions fresh. This avoids exposing API keys to XSS attacks\n * at the cost of a sub-cent auto-provision call per page load.\n */\ninterface AgentCredentials {\n api_key: string;\n tenant_id: string;\n thread_id?: string;\n}\n\n/** Module-level store — lives for the lifetime of the JS context only */\nlet agentCredentialsCache: AgentCredentials | null = null;\n\n/**\n * Generate unique ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Generate mock response based on prompt keywords\n */\nfunction getMockResponse(prompt: string): string {\n const lowerPrompt = prompt.toLowerCase();\n\n if (lowerPrompt.includes('customer') || lowerPrompt.includes('revenue')) {\n return `I analyzed your customer data and found some interesting insights:\n\n**Top Findings:**\n1. Your top 10 customers account for 45% of total revenue\n2. Customer retention rate is 78% (above industry average)\n3. Average order value has increased 12% this quarter\n\n**Recommendations:**\n- Consider implementing a loyalty program for high-value customers\n- Focus marketing efforts on the 25-34 age demographic\n- Investigate churn patterns in the \"Enterprise\" segment\n\nWould you like me to create a visualization of these trends?`;\n }\n\n if (lowerPrompt.includes('analyze') || lowerPrompt.includes('analysis')) {\n return `I've completed the analysis of your data. Here's what I found:\n\n**Summary Statistics:**\n- Total records: 10,432\n- Time period: Jan 2024 - Dec 2024\n- Completeness: 98.5%\n\n**Key Insights:**\n- Significant growth trend detected (r² = 0.87)\n- Seasonal patterns observed in Q4\n- 3 potential outliers identified for review\n\nWould you like me to dive deeper into any specific area?`;\n }\n\n if (lowerPrompt.includes('chart') || lowerPrompt.includes('visual') || lowerPrompt.includes('plot')) {\n return `I've created a visualization based on your request. The chart shows the distribution of your data over time.\n\n**Chart Details:**\n- Type: Line chart with trend overlay\n- X-axis: Time period (monthly)\n- Y-axis: Values (normalized)\n\nThe visualization has been saved to your workspace. You can find it in the Visualizations tab.\n\nWould you like me to create additional views or modify this chart?`;\n }\n\n // Default response\n return `I understand you're asking about: \"${prompt}\"\n\nIn **mock mode**, I'm simulating a response without connecting to the backend. This helps you:\n- Test your UI components\n- Develop without network dependencies\n- Validate user flows\n\nTo connect to a real AI agent, change your config:\n\\`\\`\\`tsx\n<FlowstackProvider config={{ ...config, mode: 'production' }}>\n\\`\\`\\`\n\nIs there anything specific you'd like to test?`;\n}\n\n/**\n * Reconstruct a `File` from the base64 wire format. Browser-only — `atob` and\n * `File` are window globals. We accept the encoded form because that's what\n * existing chat-input components produce; native `File` callers skip this.\n */\nfunction decodeAttachment(att: { filename: string; content_type: string; data: string }): File {\n const binary = atob(att.data);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return new File([bytes], att.filename, { type: att.content_type });\n}\n\n/**\n * Extensions the backend's /upload route parses into a queryable DataFrame.\n * Anything else routes through /upload-document, which stores raw bytes for\n * the agent's ingest_document / search_documents tools. Without this split,\n * a PDF/PNG/DOCX attachment 400s with \"Unsupported file type\" because /upload\n * is dataset-only. Set is intentionally narrow: .txt and .md fall through to\n * /upload-document since chat users typically attach those to discuss, not to\n * query as tab-separated tables.\n */\nconst TABULAR_EXTS = new Set([\n 'csv', 'tsv', 'xlsx', 'xls', 'parquet', 'json', 'jsonl', 'avro', 'h5', 'hdf5', 'pkl',\n]);\n\nfunction _fileExt(filename: string): string {\n const i = filename.lastIndexOf('.');\n return i === -1 ? '' : filename.slice(i + 1).toLowerCase();\n}\n\n/**\n * Hook for AI agent interactions\n * @param template - Agent template to use (default: 'data-science'). NOTE\n * (P0-132 / G6): for apps whose brain is a registered persona, this template\n * only sets a fallback agent_name + default instructions that the persona\n * overrides — it does NOT mean the app runs on a \"data-science parent agent\".\n * Pass a persona via `options.persona` (G4) to target it explicitly, or\n * `options.systemPrompt` (G5) for an inline prompt. The default is fine for\n * persona-backed apps; 'custom' is the honest label when no template applies.\n */\nexport function useAgent(template: AgentTemplate = 'data-science', options?: UseAgentOptions): UseAgentReturn {\n const {\n credentials,\n selectedWorkspace,\n messages,\n addMessage,\n updateMessage,\n clearMessages: contextClear,\n setIsQueryRunning,\n setQueryStartTime,\n addVisualization,\n refreshDatasets,\n refreshVisualizations,\n config,\n } = useFlowstack();\n\n const [isStreaming, setIsStreaming] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [toolCalls, setToolCalls] = useState<ToolCall[]>([]);\n const [error, setError] = useState<string | null>(null);\n const [pendingInterrupts, setPendingInterrupts] = useState<InterruptInfo[] | null>(null);\n const [connectedDataSources, setConnectedDataSources] = useState<DataSourceBadgeInfo[]>([]);\n\n const abortControllerRef = useRef<AbortController | null>(null);\n const currentMessageIdRef = useRef<string | null>(null);\n const pendingPromptRef = useRef<string | null>(null);\n // When true, the NEXT query() call sends force_new_session=true so the\n // backend creates a new conversation on its end (not just cleared frontend state).\n const forceNewSessionRef = useRef<boolean>(false);\n // Persist session_id to sessionStorage so the backend can reload conversation\n // history after a page refresh. Without this, each refresh creates a new session.\n // P0-132 (G8): namespace the key by an optional per-instance sessionKey so two\n // useAgent instances in the same app (e.g. an interview chat and a matchmaker)\n // hold independent conversations instead of sharing one tenant-wide session\n // (which caused replies to bleed across surfaces). Omitting sessionKey keeps the\n // legacy tenant-shared key, so existing single-surface apps are unaffected.\n const sessionStorageKey = `flowstack:session_id:${config.tenantId || 'default'}${\n options?.sessionKey ? `:${options.sessionKey}` : ''\n }`;\n const sessionIdRef = useRef<string | null>(\n typeof window !== 'undefined' ? sessionStorage.getItem(sessionStorageKey) : null\n );\n\n const clientConfig = useMemo(() => ({\n baseUrl: config.baseUrl,\n tenantId: config.tenantId,\n }), [config.baseUrl, config.tenantId]);\n\n const isMockMode = config.mode === 'mock';\n\n /**\n * Execute a query to the agent\n */\n const query = useCallback(async (prompt: string, attachments?: AttachmentInput[], allowedTerms?: string[]): Promise<void> => {\n if (isStreaming) {\n console.warn('[useAgent] Query already in progress, ignoring');\n return;\n }\n\n setError(null);\n\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n return;\n }\n\n if (!selectedWorkspace && !isMockMode) {\n // Workspace auto-create may still be in flight — queue and retry once it resolves\n pendingPromptRef.current = prompt;\n return;\n }\n\n // Upload attachments BEFORE streaming. The `/stream` endpoint has no\n // attachment field on the wire — files have to land as workspace\n // datasets first, then the agent picks them up via list_datasets/get_dataset.\n // We bail out (rather than silently sending the prompt without the file)\n // because the alternative is the agent hallucinating a substitute dataset\n // from the user's library.\n let finalPrompt = prompt;\n let attachmentNames: string[] | undefined;\n if (attachments && attachments.length > 0 && !isMockMode && credentials && selectedWorkspace) {\n const uploaded: string[] = [];\n const datasetNames: string[] = [];\n const documentNames: string[] = [];\n for (const att of attachments) {\n const file = att instanceof File ? att : decodeAttachment(att);\n const ext = _fileExt(file.name);\n const isTabular = TABULAR_EXTS.has(ext);\n const res = isTabular\n ? await uploadFile(credentials, selectedWorkspace.workspaceId, file, file.name, clientConfig)\n : await uploadDocument(credentials, selectedWorkspace.workspaceId, file, file.name, clientConfig);\n if (!res.ok) {\n setError(`Failed to upload ${file.name}: ${res.error || 'unknown error'}`);\n return;\n }\n const resolvedName = isTabular\n ? ((res.data as any)?.dataset?.name || (res.data as any)?.report?.name || file.name)\n : ((res.data as any)?.document_name || file.name);\n uploaded.push(resolvedName);\n (isTabular ? datasetNames : documentNames).push(resolvedName);\n }\n attachmentNames = uploaded;\n // Type-tagged hints route the agent to the right tool. Without these,\n // Gemini wrote PdfReader(\"X.pdf\") in a Daytona sandbox for a PDF — the\n // attached file existed but the agent had to guess the tool from the\n // extension alone. With explicit tool hints, datasets go through the\n // SQL/dataframe path and documents go through ingest/search, sidestepping\n // Daytona entirely for non-tabular files.\n const hints: string[] = [];\n if (datasetNames.length > 0) {\n hints.push(`[Attached dataset${datasetNames.length > 1 ? 's' : ''}: ${datasetNames.join(', ')} — use list_datasets / get_dataset / query_dataset_sql]`);\n }\n if (documentNames.length > 0) {\n hints.push(`[Attached document${documentNames.length > 1 ? 's' : ''}: ${documentNames.join(', ')} — use ingest_document / search_documents]`);\n }\n finalPrompt = `${hints.join('\\n')}\\n${prompt}`;\n // Refresh the dataset list in context so any panels that read it\n // see the new file without waiting for a manual refresh.\n try { await refreshDatasets?.(); } catch {}\n }\n\n // Add user message — use the original prompt so the chat UI shows what\n // the user typed, not the attachment-prefixed wire form.\n const userMessage: ChatMessage = {\n id: generateId(),\n role: 'user',\n content: prompt,\n timestamp: new Date(),\n attachmentNames,\n };\n addMessage(userMessage);\n const userMessageId = userMessage.id; // P0-57: capture for PII metadata attachment\n\n // Create assistant message placeholder\n const assistantId = generateId();\n currentMessageIdRef.current = assistantId;\n const assistantMessage: ChatMessage = {\n id: assistantId,\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n isStreaming: true,\n toolCalls: [],\n visualizations: [],\n };\n addMessage(assistantMessage);\n\n // Set loading state\n setIsStreaming(true);\n setIsLoading(true);\n setIsQueryRunning(true);\n setQueryStartTime(Date.now());\n setToolCalls([]);\n\n // Mock mode — route to standalone agent service if configured,\n // otherwise fall back to canned keyword-matched responses.\n if (isMockMode) {\n if (config.agentServiceUrl) {\n // ── Standalone agent service path (real GPT-4o-mini) ──────────\n abortControllerRef.current = new AbortController();\n let fullContent = '';\n\n try {\n // Bootstrap: auto-provision agent on first query per session\n if (!agentCredentialsCache) {\n const provisionRes = await fetch(`${config.agentServiceUrl}/openai/auto-provision`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n template: template || config.agentTemplate || 'data-science',\n agent_name: `${template || config.agentTemplate || 'data-science'}-agent`,\n instructions: TEMPLATE_SYSTEM_PROMPTS[template || config.agentTemplate || 'data-science'] || TEMPLATE_SYSTEM_PROMPTS['custom'],\n model: 'gpt-4o-mini',\n }),\n });\n\n if (!provisionRes.ok) {\n throw new Error(`Auto-provision failed: ${provisionRes.status}`);\n }\n\n const provisionData = await provisionRes.json();\n agentCredentialsCache = {\n api_key: provisionData.api_key,\n tenant_id: provisionData.tenant_id,\n };\n }\n\n // Chat call — SSE stream from /openai/chat\n const chatRes = await fetch(`${config.agentServiceUrl}/openai/chat`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${agentCredentialsCache.api_key}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n message: prompt,\n thread_id: agentCredentialsCache.thread_id,\n }),\n signal: abortControllerRef.current.signal,\n });\n\n if (!chatRes.ok) {\n throw new Error(`Agent chat failed: ${chatRes.status}`);\n }\n\n if (!chatRes.body) {\n throw new Error('No response body from agent service');\n }\n\n const reader = chatRes.body.getReader();\n\n // Reuse the same SSE parser + event switch as production.\n // The openai-agent backend now emits event:delta + {\"delta\":{\"text\":\"...\"}}\n // which parseSSEStream normalizes into StreamEvent with type='delta'.\n for await (const event of parseSSEStream(reader)) {\n if (abortControllerRef.current?.signal.aborted) break;\n\n switch (event.type) {\n case 'text':\n case 'content':\n case 'delta':\n if (event.content) {\n fullContent += event.content;\n updateMessage(assistantId, { content: fullContent });\n }\n break;\n\n case 'error':\n setError(event.error || 'Agent query failed');\n break;\n\n case 'done':\n case 'complete': {\n // Extract thread_id for multi-turn conversation\n const completeData = event.data as Record<string, unknown> | undefined;\n if (completeData?.thread_id) {\n agentCredentialsCache!.thread_id = completeData.thread_id as string;\n }\n break;\n }\n }\n }\n\n updateMessage(assistantId, {\n content: fullContent,\n isStreaming: false,\n });\n } catch (err) {\n // Network error → fall back to canned mock responses\n const isFetchError = err instanceof TypeError || (err instanceof Error && err.message.includes('fetch'));\n if (isFetchError) {\n console.warn('[useAgent] Agent service unreachable, falling back to mock responses');\n const mockResponse = getMockResponse(prompt);\n updateMessage(assistantId, {\n content: mockResponse,\n isStreaming: false,\n });\n } else {\n const message = err instanceof Error ? err.message : 'Agent query failed';\n setError(message);\n updateMessage(assistantId, {\n content: fullContent || `Error: ${message}`,\n isStreaming: false,\n });\n }\n } finally {\n setIsStreaming(false);\n setIsLoading(false);\n setIsQueryRunning(false);\n setQueryStartTime(null);\n currentMessageIdRef.current = null;\n abortControllerRef.current = null;\n }\n return;\n }\n\n // ── Canned mock responses (no agentServiceUrl configured) ────────\n try {\n await mockDelay(500, 1000);\n\n const mockResponse = getMockResponse(prompt);\n let streamedContent = '';\n\n for (let i = 0; i < mockResponse.length; i += 3) {\n if (abortControllerRef.current?.signal.aborted) break;\n streamedContent += mockResponse.slice(i, i + 3);\n updateMessage(assistantId, { content: streamedContent });\n await mockDelay(10, 30);\n }\n\n updateMessage(assistantId, {\n content: mockResponse,\n isStreaming: false,\n });\n } finally {\n setIsStreaming(false);\n setIsLoading(false);\n setIsQueryRunning(false);\n setQueryStartTime(null);\n currentMessageIdRef.current = null;\n }\n return;\n }\n\n // Create abort controller for cancellation\n abortControllerRef.current = new AbortController();\n\n // Track content outside try block for error handling\n let fullContent = '';\n\n try {\n const networkMode = config.agentTemplate === 'marketing' ? 'PUBLIC' : 'SANDBOX';\n const response = await executeQueryWithConfig(\n credentials!,\n finalPrompt,\n selectedWorkspace!.workspaceId,\n {\n networkMode,\n tools: options?.tools,\n capabilities: options?.capabilities,\n sessionId: sessionIdRef.current || undefined,\n forceNewSession: forceNewSessionRef.current || undefined,\n allowedTerms,\n // P0-132 (G5): forward an inline system-prompt override (was dropped).\n systemPrompt: options?.systemPrompt,\n // P0-132 (G4): target a specific registered persona (maps to\n // target_agents on the wire). persona wins over the agentName alias.\n persona: options?.persona ?? options?.agentName,\n },\n clientConfig\n );\n\n if (!response.body) {\n throw new Error('No response body');\n }\n\n const reader = response.body.getReader();\n const currentToolCalls: ToolCall[] = [];\n const currentVisualizations: VisualizationData[] = [];\n\n // ── Process SSE stream ────────────────────────────────────────────\n //\n // V2 BACKEND EVENT FLOW:\n //\n // 1. metadata → session/workspace/tenant IDs (ignored here)\n // 2. delta → incremental text tokens: {content: \"token\"}\n // Appended to fullContent for real-time display.\n // 3. tool_call → tool invocation: {tool: \"name\", args: {...}}\n // Added to currentToolCalls, shown as \"running\".\n // 4. tool_result → tool output: {result: \"...\", tool: undefined}\n // Matched to running tool call, status → \"complete\".\n // 5. text → final accumulated text: {content: \"full response\"}\n // Appended like any other text event.\n // 6. complete → stream end: {event_count: N, execution_ms: N}\n // Terminates the loop.\n //\n // The SSE parser (sse-parser.ts) normalizes all backend formats\n // into StreamEvent objects before they reach this switch.\n // ────────────────────────────────────────────────────────────────\n for await (const event of parseSSEStream(reader)) {\n // Check if user cancelled the query\n if (abortControllerRef.current?.signal.aborted) {\n break;\n }\n\n switch (event.type) {\n // ── METADATA ───────────────────────────────────────────────\n // First event from v2 backend with session info + data sources.\n // Extract connected data sources for badge display.\n case 'metadata': {\n const metaData = event.data as Record<string, unknown> | undefined;\n if (metaData?.session_id && typeof metaData.session_id === 'string') {\n // Backend assigned a new session_id — store it and clear the\n // force_new_session flag so subsequent turns continue this session.\n sessionIdRef.current = metaData.session_id;\n forceNewSessionRef.current = false;\n if (typeof window !== 'undefined') {\n sessionStorage.setItem(sessionStorageKey, metaData.session_id);\n }\n }\n if (metaData?.data_sources && Array.isArray(metaData.data_sources)) {\n setConnectedDataSources(metaData.data_sources as DataSourceBadgeInfo[]);\n }\n // P0-57: Attach PII masking report to the user message\n if (metaData?.pii_redacted && Array.isArray(metaData.pii_redacted) && metaData.pii_redacted.length > 0) {\n updateMessage(userMessageId, {\n piiRedacted: metaData.pii_redacted as PiiRedactedEntity[],\n });\n }\n break;\n }\n\n // ── TEXT STREAMING ─────────────────────────────────────────\n // 'delta' = incremental token from v2 backend\n // 'text' = final accumulated text from v2, or Anthropic raw\n // 'content' = generic text fallback\n // All append to fullContent for progressive UI rendering.\n case 'text':\n case 'content':\n case 'delta':\n if (event.content) {\n // Filter raw JSON blobs — show summary in statusLine instead\n if (isJsonBlob(event.content)) {\n const summary = summarizeJsonEvent(event.content);\n if (summary) {\n updateMessage(assistantId, { statusLine: summary });\n }\n break;\n }\n\n // MonoSage backend emits {\"type\": \"text\", \"content\": chunk} for EVERY\n // streaming token — there is no separate \"delta\" type in this path.\n // Both 'text' and 'delta' events are incremental chunks: always append.\n // Never replace, never skip based on length — all chunks must accumulate.\n fullContent += event.content;\n const displayContent = unflattenMarkdownTables(fullContent);\n updateMessage(assistantId, { content: displayContent, statusLine: undefined });\n }\n break;\n\n // ── TOOL CALLS ─────────────────────────────────────────────\n // V2 emits: event.tool = tool name (from data.name),\n // event.args = tool arguments (from data.args)\n // Parsed by normalizeEvent's tool format branch (section 4).\n case 'tool_call':\n case 'tool_use':\n if (event.tool) {\n // Deduplicate: if this tool is already running, don't add another entry.\n // The swarm re-broadcasts inner pipeline tool_call events, causing\n // the same tool to appear many times in the stream.\n const alreadyRunning = currentToolCalls.some(\n tc => tc.name === event.tool && tc.status === 'running'\n );\n if (alreadyRunning) break;\n\n const toolCall: ToolCall = {\n id: generateId(),\n toolUseId: event.args?.tool_use_id as string,\n name: event.tool,\n args: event.args,\n status: 'running',\n startTime: Date.now(),\n };\n currentToolCalls.push(toolCall);\n setToolCalls([...currentToolCalls]);\n updateMessage(assistantId, { toolCalls: [...currentToolCalls] });\n }\n break;\n\n // ── TOOL RESULTS ───────────────────────────────────────────\n // V2 emits: tool_use_id, content, status\n // event.tool may be undefined (v2 doesn't include tool name\n // in results), so we fall back to finding the first running\n // tool call in the list.\n case 'tool_result':\n if (event.tool || event.toolUseId || currentToolCalls.length > 0) {\n // Match by toolUseId first, then name, then first running tool\n let toolIndex = -1;\n if (event.toolUseId) {\n toolIndex = currentToolCalls.findIndex(tc => tc.toolUseId === event.toolUseId);\n }\n if (toolIndex < 0 && event.tool) {\n toolIndex = currentToolCalls.findIndex(tc => tc.name === event.tool && tc.status === 'running');\n }\n if (toolIndex < 0) {\n toolIndex = currentToolCalls.findIndex(tc => tc.status === 'running');\n }\n if (toolIndex >= 0) {\n const completedTool = currentToolCalls[toolIndex];\n currentToolCalls[toolIndex] = {\n ...completedTool,\n // P0-132 (G1): the backend emits the tool's return value under\n // `content` (normalized to event.content); `event.result` is only\n // populated by legacy/alternate event shapes. Reading content first\n // makes structured tool output actually reach toolCalls[].result —\n // previously it was always undefined.\n result: event.content ?? event.result,\n // P0-132 (G1): mark a failed tool call as 'error' (backend\n // is_error flag) instead of silently reporting 'complete'.\n status: event.isError ? 'error' : 'complete',\n endTime: Date.now(),\n };\n setToolCalls([...currentToolCalls]);\n updateMessage(assistantId, { toolCalls: [...currentToolCalls] });\n\n // Emit collection-changed event for useCollection reactive updates.\n // P0-132 (G3): match the real backend write tools (see\n // COLLECTION_WRITE_TOOLS) so refreshOnAgentComplete fires. A failed\n // write (is_error) must NOT trigger a refresh.\n const toolName = completedTool.name || '';\n if (COLLECTION_WRITE_TOOLS.has(toolName) && !event.isError) {\n window.dispatchEvent(new CustomEvent(COLLECTION_CHANGED_EVENT, {\n detail: { tool: toolName },\n }));\n }\n }\n }\n break;\n\n // ── PROGRESS (swarm agent text) ──────────────────────────────\n // During swarm execution, specialist agents stream text as\n // 'progress' events. Append to main content AND to the matching\n // tool call's agentResponse so CasinoDemo can render it.\n case 'progress':\n if (event.message) {\n // Skip heartbeat keepalive events — they're for connection stability only\n const progressData = event.data as Record<string, unknown> | undefined;\n if (progressData?.progressType === 'heartbeat') break;\n\n // Filter JSON progress events — show summary instead\n if (isJsonBlob(event.message)) {\n const summary = summarizeJsonEvent(event.message, event.tool);\n if (summary) {\n updateMessage(assistantId, { statusLine: summary });\n }\n break;\n }\n\n // Progress events show tool activity in the status line.\n // They do NOT append to fullContent — the backend's final 'text' event\n // is the authoritative complete response. Mixing progress text into\n // fullContent caused doubled/garbled content when the 'text' event arrived.\n updateMessage(assistantId, {\n statusLine: event.tool\n ? `${event.tool}: ${event.message.substring(0, 80)}`\n : event.message.substring(0, 100),\n });\n\n // Track progress text on the matching tool call's agentResponse\n // (used by tool call UI to show what the agent said during the tool run)\n if (currentToolCalls.length > 0) {\n let idx = -1;\n if (event.tool) {\n for (let i = currentToolCalls.length - 1; i >= 0; i--) {\n if (currentToolCalls[i].name === event.tool) { idx = i; break; }\n }\n }\n if (idx < 0) {\n for (let i = currentToolCalls.length - 1; i >= 0; i--) {\n if (currentToolCalls[i].status === 'running') { idx = i; break; }\n }\n }\n if (idx >= 0) {\n const prev = currentToolCalls[idx].agentResponse || '';\n const sep = prev.length > 0 && !prev.endsWith(' ') && !prev.endsWith('\\n') ? ' ' : '';\n currentToolCalls[idx] = {\n ...currentToolCalls[idx],\n agentResponse: prev + sep + event.message,\n };\n setToolCalls([...currentToolCalls]);\n updateMessage(assistantId, { toolCalls: [...currentToolCalls] });\n }\n }\n }\n break;\n\n // ── VISUALIZATIONS ─────────────────────────────────────────\n case 'visualization':\n if (event.data) {\n const viz = event.data as VisualizationData;\n currentVisualizations.push(viz);\n addVisualization(viz);\n updateMessage(assistantId, { visualizations: [...currentVisualizations] });\n }\n break;\n\n // ── INTERRUPT ─────────────────────────────────────────────\n case 'interrupt':\n if (event.data) {\n setPendingInterrupts([event.data as InterruptInfo]);\n }\n break;\n\n // ── ERRORS ─────────────────────────────────────────────────\n case 'error': {\n const parsed = parseErrorMessage(event.error || 'Query failed');\n setError(parsed.message);\n break;\n }\n\n // ── STREAM END ─────────────────────────────────────────────\n // 'complete' = v2 stream termination (with event_count, execution_ms)\n // 'done' = OpenAI-style [DONE] signal\n case 'done':\n case 'complete': {\n const completeData = event.data as Record<string, unknown> | undefined;\n if (completeData?.stop_reason === 'interrupt') {\n // Keep pendingInterrupts set — agent was interrupted\n }\n break;\n }\n }\n }\n\n // Finalize any tool calls still marked as 'running'\n const now = Date.now();\n for (let i = 0; i < currentToolCalls.length; i++) {\n if (currentToolCalls[i].status === 'running') {\n currentToolCalls[i] = { ...currentToolCalls[i], status: 'complete', endTime: now };\n }\n }\n\n // Apply content cleaning pipeline (table repair only).\n // dedupeContent is intentionally removed — it used heuristic half-split\n // detection that triggered false positives on structured responses (numbered\n // lists, repeated headers) and truncated valid content to its second half.\n const cleanedContent = cleanContent(fullContent);\n\n // Mark message as complete\n updateMessage(assistantId, {\n content: cleanedContent,\n isStreaming: false,\n toolCalls: currentToolCalls,\n visualizations: currentVisualizations,\n statusLine: undefined,\n });\n\n // Refresh artifacts if tools were used\n if (currentToolCalls.length > 0) {\n await Promise.all([\n refreshDatasets(),\n refreshVisualizations(),\n ]);\n }\n\n } catch (err) {\n const raw = err instanceof Error ? err.message : 'Query failed';\n const parsed = parseErrorMessage(raw);\n setError(parsed.message);\n\n // Update message with error\n updateMessage(assistantId, {\n content: fullContent || `Error: ${parsed.message}`,\n isStreaming: false,\n });\n } finally {\n setIsStreaming(false);\n setIsLoading(false);\n setIsQueryRunning(false);\n setQueryStartTime(null);\n currentMessageIdRef.current = null;\n abortControllerRef.current = null;\n }\n }, [\n isStreaming,\n credentials,\n selectedWorkspace,\n addMessage,\n updateMessage,\n setIsQueryRunning,\n setQueryStartTime,\n addVisualization,\n refreshDatasets,\n refreshVisualizations,\n config,\n clientConfig,\n isMockMode,\n template,\n ]);\n\n // Flush pending prompt once workspace is available\n useEffect(() => {\n if (selectedWorkspace && pendingPromptRef.current) {\n const pending = pendingPromptRef.current;\n pendingPromptRef.current = null;\n query(pending);\n }\n }, [selectedWorkspace, query]);\n\n /**\n * Clear all messages\n */\n const clearMessages = useCallback(() => {\n setError(null);\n setToolCalls([]);\n sessionIdRef.current = null;\n if (typeof window !== 'undefined') {\n sessionStorage.removeItem(sessionStorageKey);\n }\n contextClear();\n }, [contextClear, sessionStorageKey]);\n\n /**\n * Start a genuinely new backend conversation.\n *\n * Unlike `clearMessages()` which only clears frontend state, this also\n * tells the backend to create a new session on the next `query()` call via\n * `force_new_session=true`. The backend derives app session IDs\n * deterministically from (tenant, user, app_scope) — without this flag,\n * the old conversation history is always reloaded regardless of what the\n * frontend cleared.\n *\n * Usage in a built app:\n * ```tsx\n * const { startNewSession } = useAgent(undefined, { targetAgents: ['my_agent'] });\n * <button onClick={startNewSession}>New conversation</button>\n * ```\n */\n const startNewSession = useCallback(() => {\n setError(null);\n setToolCalls([]);\n sessionIdRef.current = null;\n forceNewSessionRef.current = true; // ← tells backend to create new session\n if (typeof window !== 'undefined') {\n sessionStorage.removeItem(sessionStorageKey);\n }\n contextClear();\n }, [contextClear, sessionStorageKey]);\n\n /**\n * Cancel the current query\n */\n const cancelQuery = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n // Mark current message as cancelled\n if (currentMessageIdRef.current) {\n updateMessage(currentMessageIdRef.current, {\n content: '*(Query cancelled)*',\n isStreaming: false,\n });\n }\n\n setIsStreaming(false);\n setIsLoading(false);\n setIsQueryRunning(false);\n setQueryStartTime(null);\n setPendingInterrupts(null);\n }, [updateMessage, setIsQueryRunning, setQueryStartTime]);\n\n /**\n * Interrupt the currently running agent\n */\n const interruptAgent = useCallback(async () => {\n if (!credentials || !selectedWorkspace) return;\n\n const baseUrl = clientConfig.baseUrl || 'https://sage-api.flowstack.fun';\n const tenantId = credentials.tenantId || clientConfig.tenantId || '';\n\n await fetch(`${baseUrl}/stream/interrupt`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': tenantId,\n 'X-User-ID': credentials.userId || '',\n },\n body: JSON.stringify({\n workspace_id: selectedWorkspace.workspaceId,\n reason: '',\n }),\n });\n }, [credentials, selectedWorkspace, clientConfig]);\n\n /**\n * Respond to a pending interrupt by clearing the interrupt state and sending a new query\n */\n const respondToInterrupt = useCallback(async (message: string) => {\n setPendingInterrupts(null);\n await query(message);\n }, [query]);\n\n return {\n query,\n messages,\n isStreaming,\n isLoading,\n toolCalls,\n error,\n pendingInterrupts,\n connectedDataSources,\n clearMessages,\n startNewSession,\n cancelQuery,\n interruptAgent,\n respondToInterrupt,\n };\n}\n","'use client';\n\n/**\n * useQuery Hook\n *\n * A lower-level hook for executing queries without managing chat history.\n * Use this when you need direct control over query execution.\n *\n * @example\n * ```tsx\n * function AnalysisRunner() {\n * const { execute, isStreaming, result, toolCalls, visualizations } = useQuery();\n *\n * const analyze = async () => {\n * await execute('analyze sales data and create a chart');\n * };\n *\n * return (\n * <div>\n * <button onClick={analyze} disabled={isStreaming}>Run Analysis</button>\n * {result && <div>{result}</div>}\n * {visualizations.map(v => <img key={v.name} src={v.imageUrl} />)}\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback, useRef } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport type { UseQueryReturn, ToolCall, VisualizationData, QueryOptions } from '../types';\nimport { executeQueryWithConfig } from '../api/client';\nimport { parseSSEStream } from '../utils/sse-parser';\n\n/**\n * Generate unique ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Hook for direct query execution\n */\nexport function useQuery(): UseQueryReturn {\n const {\n credentials,\n selectedWorkspace,\n addVisualization,\n config,\n } = useFlowstack();\n\n const [isStreaming, setIsStreaming] = useState(false);\n const [result, setResult] = useState<string | null>(null);\n const [toolCalls, setToolCalls] = useState<ToolCall[]>([]);\n const [visualizations, setVisualizations] = useState<VisualizationData[]>([]);\n const [error, setError] = useState<string | null>(null);\n\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const clientConfig = {\n baseUrl: config.baseUrl,\n tenantId: config.tenantId,\n };\n\n /**\n * Execute a query\n */\n const execute = useCallback(async (\n prompt: string,\n options?: QueryOptions\n ): Promise<void> => {\n setError(null);\n setResult(null);\n setToolCalls([]);\n setVisualizations([]);\n\n if (!credentials) {\n setError('Not authenticated');\n return;\n }\n\n const workspaceId = options?.workspaceId || selectedWorkspace?.workspaceId;\n if (!workspaceId) {\n setError('No workspace selected');\n return;\n }\n\n setIsStreaming(true);\n abortControllerRef.current = new AbortController();\n\n try {\n const response = await executeQueryWithConfig(\n credentials,\n prompt,\n workspaceId,\n { networkMode: options?.networkMode || 'SANDBOX', tools: options?.tools },\n clientConfig\n );\n\n if (!response.body) {\n throw new Error('No response body');\n }\n\n const reader = response.body.getReader();\n let fullContent = '';\n const currentToolCalls: ToolCall[] = [];\n const currentVisualizations: VisualizationData[] = [];\n\n // Process SSE stream\n for await (const event of parseSSEStream(reader)) {\n // Check if cancelled\n if (abortControllerRef.current?.signal.aborted) {\n break;\n }\n\n switch (event.type) {\n case 'text':\n case 'content':\n case 'delta':\n if (event.content) {\n fullContent += event.content;\n setResult(fullContent);\n }\n break;\n\n case 'tool_call':\n case 'tool_use':\n if (event.tool) {\n const toolCall: ToolCall = {\n id: generateId(),\n toolUseId: event.args?.tool_use_id as string,\n name: event.tool,\n args: event.args,\n status: 'running',\n startTime: Date.now(),\n };\n currentToolCalls.push(toolCall);\n setToolCalls([...currentToolCalls]);\n }\n break;\n\n case 'tool_result':\n if (event.tool || currentToolCalls.length > 0) {\n const toolIndex = currentToolCalls.findIndex(\n tc => tc.name === event.tool || tc.status === 'running'\n );\n if (toolIndex >= 0) {\n currentToolCalls[toolIndex] = {\n ...currentToolCalls[toolIndex],\n result: event.result,\n status: 'complete',\n endTime: Date.now(),\n };\n setToolCalls([...currentToolCalls]);\n }\n }\n break;\n\n case 'visualization':\n if (event.data) {\n const viz = event.data as VisualizationData;\n currentVisualizations.push(viz);\n setVisualizations([...currentVisualizations]);\n addVisualization(viz);\n }\n break;\n\n case 'error':\n setError(event.error || 'Query failed');\n break;\n }\n }\n\n setResult(fullContent);\n\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Query failed';\n setError(message);\n } finally {\n setIsStreaming(false);\n abortControllerRef.current = null;\n }\n }, [credentials, selectedWorkspace, addVisualization, config, clientConfig]);\n\n /**\n * Cancel the current query\n */\n const cancel = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n setIsStreaming(false);\n }, []);\n\n return {\n execute,\n isStreaming,\n result,\n toolCalls,\n visualizations,\n error,\n cancel,\n };\n}\n","/**\n * Intent Analyzer\n *\n * Analyzes user intent and returns structured analysis with suggested config.\n * Uses rule-based matching first, falls back to LLM for ambiguous cases.\n */\n\nimport type {\n IntentAnalysis,\n IntentCategory,\n IntentPattern,\n IntentEntity,\n DynamicAgentConfig,\n IntentAnalyzerOptions,\n LLMExecutor,\n} from './types';\n\n// =============================================================================\n// Default Intent Patterns\n// =============================================================================\n\n/**\n * Pre-configured patterns for common intent categories\n */\nexport const DEFAULT_PATTERNS: IntentPattern[] = [\n {\n id: 'data-analysis',\n category: 'data_analysis',\n patterns: [\n /analyz[es]?\\s+(the\\s+)?data/i,\n /data\\s+analysis/i,\n /explore\\s+(my\\s+)?dataset/i,\n /statistical\\s+analysis/i,\n /find\\s+patterns?\\s+in/i,\n /correlat(e|ion)/i,\n /summarize\\s+(the\\s+)?data/i,\n /describe\\s+(the\\s+)?dataset/i,\n ],\n keywords: ['analyze', 'analysis', 'explore', 'statistics', 'patterns', 'insights', 'trends', 'summary', 'describe'],\n suggestedConfig: {\n template: 'data-science',\n systemPrompt: `You are a data analyst specializing in exploratory data analysis.\nFocus on:\n- Statistical summaries and distributions\n- Identifying patterns, correlations, and anomalies\n- Providing actionable insights with supporting evidence\n- Creating clear visualizations when helpful\n\nAlways explain your methodology and confidence levels.`,\n networkMode: 'SANDBOX',\n },\n priority: 10,\n },\n {\n id: 'visualization',\n category: 'visualization',\n patterns: [\n /create\\s+(a\\s+)?chart/i,\n /visualiz[es]/i,\n /plot\\s+(the\\s+)?data/i,\n /show\\s+(me\\s+)?(a\\s+)?graph/i,\n /dashboard/i,\n /make\\s+(a\\s+)?(bar|line|pie|scatter)/i,\n /draw\\s+(a\\s+)?diagram/i,\n ],\n keywords: ['chart', 'graph', 'plot', 'visualize', 'visualization', 'dashboard', 'diagram', 'bar', 'line', 'pie', 'scatter'],\n suggestedConfig: {\n template: 'data-science',\n systemPrompt: `You are a data visualization expert.\nFocus on:\n- Creating clear, informative visualizations\n- Choosing appropriate chart types for the data\n- Using effective color schemes and layouts\n- Adding meaningful labels and annotations\n\nAlways save visualizations and explain what they show.`,\n networkMode: 'SANDBOX',\n },\n priority: 9,\n },\n {\n id: 'machine-learning',\n category: 'machine_learning',\n patterns: [\n /train\\s+(a\\s+)?model/i,\n /machine\\s+learning/i,\n /predict(ion)?s?/i,\n /classif(y|ication)/i,\n /regression/i,\n /clustering/i,\n /build\\s+(a\\s+)?model/i,\n /deep\\s+learning/i,\n /neural\\s+network/i,\n ],\n keywords: ['model', 'predict', 'train', 'machine learning', 'ML', 'classification', 'regression', 'clustering', 'neural', 'AI'],\n suggestedConfig: {\n template: 'data-science',\n systemPrompt: `You are a machine learning engineer.\nFocus on:\n- Selecting appropriate ML algorithms for the task\n- Proper data preparation and feature engineering\n- Model training, validation, and evaluation\n- Clear explanation of model performance and limitations\n\nAlways split data properly and report metrics.`,\n networkMode: 'SANDBOX',\n },\n priority: 8,\n },\n {\n id: 'data-transformation',\n category: 'data_transformation',\n patterns: [\n /transform\\s+(the\\s+)?data/i,\n /clean\\s+(the\\s+)?data/i,\n /filter\\s+(the\\s+)?rows/i,\n /merge\\s+(the\\s+)?datasets/i,\n /join\\s+(the\\s+)?tables/i,\n /pivot\\s+(the\\s+)?data/i,\n /reshape/i,\n ],\n keywords: ['transform', 'clean', 'filter', 'merge', 'join', 'pivot', 'reshape', 'aggregate', 'group'],\n suggestedConfig: {\n template: 'data-science',\n systemPrompt: `You are a data engineer specializing in data transformation.\nFocus on:\n- Cleaning and preprocessing data\n- Efficient transformations and aggregations\n- Data quality validation\n- Clear documentation of transformations applied\n\nAlways verify data integrity after transformations.`,\n networkMode: 'SANDBOX',\n },\n priority: 7,\n },\n {\n id: 'content-creation',\n category: 'content_creation',\n patterns: [\n /write\\s+(a\\s+)?blog/i,\n /create\\s+content/i,\n /marketing\\s+copy/i,\n /social\\s+media\\s+post/i,\n /draft\\s+(an?\\s+)?email/i,\n /write\\s+(an?\\s+)?article/i,\n /generate\\s+copy/i,\n ],\n keywords: ['write', 'content', 'blog', 'marketing', 'copy', 'email', 'social media', 'article', 'draft'],\n suggestedConfig: {\n template: 'marketing',\n systemPrompt: `You are a content strategist and copywriter.\nFocus on:\n- Clear, engaging writing tailored to the audience\n- SEO optimization where appropriate\n- Consistent brand voice and messaging\n- Actionable calls-to-action\n\nAlways ask about target audience if unclear.`,\n networkMode: 'PUBLIC',\n },\n priority: 6,\n },\n {\n id: 'customer-support',\n category: 'customer_support',\n patterns: [\n /customer\\s+support/i,\n /help\\s+desk/i,\n /answer\\s+questions/i,\n /FAQ/i,\n /troubleshoot/i,\n /resolve\\s+issues/i,\n /support\\s+agent/i,\n ],\n keywords: ['support', 'help', 'troubleshoot', 'FAQ', 'questions', 'issues', 'resolve', 'assist'],\n suggestedConfig: {\n template: 'support',\n systemPrompt: `You are a customer support specialist.\nFocus on:\n- Understanding the customer's problem quickly\n- Providing clear, step-by-step solutions\n- Escalating when necessary\n- Being empathetic and professional\n\nAlways verify the solution works before closing.`,\n networkMode: 'SANDBOX',\n },\n priority: 5,\n },\n {\n id: 'code-generation',\n category: 'code_generation',\n patterns: [\n /write\\s+(some\\s+)?code/i,\n /generate\\s+(a\\s+)?script/i,\n /create\\s+(a\\s+)?function/i,\n /implement\\s+(a\\s+)?feature/i,\n /code\\s+to\\s+/i,\n /python\\s+(script|code)/i,\n ],\n keywords: ['code', 'script', 'function', 'implement', 'program', 'python', 'javascript'],\n suggestedConfig: {\n template: 'data-science',\n systemPrompt: `You are a software developer.\nFocus on:\n- Writing clean, well-documented code\n- Following best practices and conventions\n- Error handling and edge cases\n- Testing and validation\n\nAlways explain your implementation decisions.`,\n networkMode: 'SANDBOX',\n },\n priority: 4,\n },\n {\n id: 'research',\n category: 'research',\n patterns: [\n /research\\s+/i,\n /find\\s+information/i,\n /look\\s+up/i,\n /search\\s+for/i,\n /investigate/i,\n ],\n keywords: ['research', 'find', 'search', 'investigate', 'look up', 'discover'],\n suggestedConfig: {\n template: 'data-science',\n systemPrompt: `You are a research assistant.\nFocus on:\n- Thorough information gathering\n- Source verification and credibility\n- Clear summarization of findings\n- Identifying knowledge gaps\n\nAlways cite your sources when possible.`,\n networkMode: 'PUBLIC',\n },\n priority: 3,\n },\n];\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Extract entities from intent string\n */\nexport function extractEntities(intent: string): IntentEntity[] {\n const entities: IntentEntity[] = [];\n\n // Data source patterns\n const dataSourceMatch = intent.match(/(?:from|using|with)\\s+(?:the\\s+)?(\\w+)\\s+(?:data|dataset|file|table)/i);\n if (dataSourceMatch) {\n entities.push({\n type: 'data_source',\n value: dataSourceMatch[1],\n position: dataSourceMatch.index || 0,\n });\n }\n\n // Output format patterns\n const formatMatch = intent.match(/(?:as|in|to)\\s+(?:a\\s+)?(\\w+)\\s+(?:format|file|chart|graph)/i);\n if (formatMatch) {\n entities.push({\n type: 'output_format',\n value: formatMatch[1],\n position: formatMatch.index || 0,\n });\n }\n\n // Domain patterns\n const domainPatterns = [\n { regex: /(?:sales|revenue|financial)/i, domain: 'finance' },\n { regex: /(?:customer|user|client)/i, domain: 'customer' },\n { regex: /(?:marketing|campaign|ad)/i, domain: 'marketing' },\n { regex: /(?:product|inventory|stock)/i, domain: 'product' },\n { regex: /(?:health|medical|patient)/i, domain: 'healthcare' },\n ];\n\n for (const { regex, domain } of domainPatterns) {\n const match = intent.match(regex);\n if (match) {\n entities.push({\n type: 'domain',\n value: domain,\n position: match.index || 0,\n });\n break;\n }\n }\n\n // Action patterns\n const actionPatterns = ['analyze', 'visualize', 'predict', 'classify', 'train', 'create', 'generate', 'transform', 'clean'];\n for (const action of actionPatterns) {\n const actionIndex = intent.toLowerCase().indexOf(action);\n if (actionIndex !== -1) {\n entities.push({\n type: 'action',\n value: action,\n position: actionIndex,\n });\n break;\n }\n }\n\n return entities;\n}\n\n/**\n * Analyze intent using rule-based matching\n */\nexport function analyzeWithRules(\n intent: string,\n customPatterns: IntentPattern[] = []\n): IntentAnalysis | null {\n const allPatterns = [...customPatterns, ...DEFAULT_PATTERNS]\n .sort((a, b) => (b.priority || 0) - (a.priority || 0));\n\n const normalizedIntent = intent.toLowerCase().trim();\n let bestMatch: { pattern: IntentPattern; score: number } | null = null;\n\n for (const pattern of allPatterns) {\n let score = 0;\n\n // Check regex patterns (weighted at 40%)\n for (const regex of pattern.patterns) {\n if (regex.test(normalizedIntent)) {\n score += 0.4;\n break;\n }\n }\n\n // Check keywords (weighted at 60%)\n const matchedKeywords = pattern.keywords.filter(kw =>\n normalizedIntent.includes(kw.toLowerCase())\n );\n score += (matchedKeywords.length / pattern.keywords.length) * 0.6;\n\n if (score > (bestMatch?.score || 0)) {\n bestMatch = { pattern, score };\n }\n }\n\n if (!bestMatch || bestMatch.score < 0.3) {\n return null;\n }\n\n const entities = extractEntities(intent);\n\n return {\n category: bestMatch.pattern.category,\n confidence: Math.min(bestMatch.score, 1),\n entities,\n suggestedConfig: bestMatch.pattern.suggestedConfig,\n originalIntent: intent,\n method: 'rule',\n };\n}\n\n/**\n * Analyze intent using LLM (fallback for ambiguous cases)\n */\nexport async function analyzeWithLLM(\n intent: string,\n llmExecute: LLMExecutor\n): Promise<IntentAnalysis> {\n const analysisPrompt = `Analyze this user intent and respond with JSON only:\nIntent: \"${intent}\"\n\nRespond with this exact JSON structure (no markdown, just JSON):\n{\n \"category\": \"data_analysis|visualization|machine_learning|data_transformation|content_creation|customer_support|code_generation|research|general_assistant\",\n \"confidence\": 0.0-1.0,\n \"suggestedSystemPrompt\": \"A brief system prompt for an AI agent to handle this intent\",\n \"template\": \"data-science|marketing|support|custom\"\n}`;\n\n try {\n const response = await llmExecute(analysisPrompt);\n const jsonMatch = response.match(/\\{[\\s\\S]*\\}/);\n\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0]);\n return {\n category: parsed.category as IntentCategory,\n confidence: typeof parsed.confidence === 'number' ? parsed.confidence : 0.7,\n entities: extractEntities(intent),\n suggestedConfig: {\n template: parsed.template || 'custom',\n systemPrompt: parsed.suggestedSystemPrompt,\n },\n originalIntent: intent,\n method: 'llm',\n };\n }\n } catch (error) {\n console.error('LLM intent analysis failed:', error);\n }\n\n // Fallback to general assistant\n return {\n category: 'general_assistant',\n confidence: 0.5,\n entities: extractEntities(intent),\n suggestedConfig: {\n template: 'custom',\n systemPrompt: `You are a helpful AI assistant. The user wants: ${intent}`,\n },\n originalIntent: intent,\n method: 'llm',\n };\n}\n\n// =============================================================================\n// Intent Analyzer Class\n// =============================================================================\n\n/**\n * Intent Analyzer\n *\n * Analyzes user intent strings and produces structured analysis\n * with suggested agent configurations.\n */\nexport class IntentAnalyzer {\n private customPatterns: IntentPattern[];\n private confidenceThreshold: number;\n private useLLMFallback: boolean;\n\n constructor(options: IntentAnalyzerOptions = {}) {\n this.customPatterns = options.customPatterns || [];\n this.confidenceThreshold = options.confidenceThreshold || 0.7;\n this.useLLMFallback = options.useLLMFallback !== false;\n }\n\n /**\n * Analyze intent and return structured analysis\n */\n async analyze(\n intent: string,\n llmExecutor?: LLMExecutor\n ): Promise<IntentAnalysis> {\n // Try rule-based first\n const ruleAnalysis = analyzeWithRules(intent, this.customPatterns);\n\n if (ruleAnalysis && ruleAnalysis.confidence >= this.confidenceThreshold) {\n return ruleAnalysis;\n }\n\n // Fall back to LLM if enabled and executor provided\n if (this.useLLMFallback && llmExecutor) {\n const llmAnalysis = await analyzeWithLLM(intent, llmExecutor);\n\n // Merge with rule analysis if available and has higher confidence\n if (ruleAnalysis && llmAnalysis.confidence < ruleAnalysis.confidence) {\n return { ...ruleAnalysis, method: 'hybrid' };\n }\n\n return { ...llmAnalysis, method: 'hybrid' };\n }\n\n // Return rule analysis even if below threshold\n if (ruleAnalysis) {\n return ruleAnalysis;\n }\n\n // Last resort - general assistant\n return {\n category: 'general_assistant',\n confidence: 0.3,\n entities: extractEntities(intent),\n suggestedConfig: {\n template: 'custom',\n systemPrompt: `You are a helpful AI assistant. The user wants: ${intent}`,\n },\n originalIntent: intent,\n method: 'rule',\n };\n }\n\n /**\n * Register a custom intent pattern\n */\n addPattern(pattern: IntentPattern): void {\n this.customPatterns.push(pattern);\n }\n\n /**\n * Remove a custom pattern by ID\n */\n removePattern(patternId: string): boolean {\n const index = this.customPatterns.findIndex(p => p.id === patternId);\n if (index >= 0) {\n this.customPatterns.splice(index, 1);\n return true;\n }\n return false;\n }\n\n /**\n * Get all registered patterns (custom + defaults)\n */\n getPatterns(): IntentPattern[] {\n return [...this.customPatterns, ...DEFAULT_PATTERNS];\n }\n\n /**\n * Get only custom patterns\n */\n getCustomPatterns(): IntentPattern[] {\n return [...this.customPatterns];\n }\n\n /**\n * Update confidence threshold\n */\n setConfidenceThreshold(threshold: number): void {\n this.confidenceThreshold = Math.max(0, Math.min(1, threshold));\n }\n\n /**\n * Enable or disable LLM fallback\n */\n setLLMFallback(enabled: boolean): void {\n this.useLLMFallback = enabled;\n }\n}\n","/**\n * Agent Registry\n *\n * Stores and manages registered agents with caching support.\n * Supports fuzzy intent matching to reuse similar agent configurations.\n */\n\nimport type { RegisteredAgent, AgentRegistryOptions } from './types';\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Calculate similarity between two intent strings using Jaccard similarity\n */\nfunction intentSimilarity(a: string, b: string): number {\n const wordsA = new Set(a.toLowerCase().split(/\\s+/).filter(w => w.length > 2));\n const wordsB = new Set(b.toLowerCase().split(/\\s+/).filter(w => w.length > 2));\n\n if (wordsA.size === 0 && wordsB.size === 0) {\n return 1;\n }\n if (wordsA.size === 0 || wordsB.size === 0) {\n return 0;\n }\n\n const intersection = new Set([...wordsA].filter(w => wordsB.has(w)));\n const union = new Set([...wordsA, ...wordsB]);\n\n return intersection.size / union.size;\n}\n\n/**\n * Normalize intent string for comparison\n */\nfunction normalizeIntent(intent: string): string {\n return intent\n .toLowerCase()\n .trim()\n .replace(/\\s+/g, ' ')\n .replace(/[^\\w\\s]/g, '');\n}\n\n// =============================================================================\n// Agent Registry Class\n// =============================================================================\n\n/**\n * Agent Registry\n *\n * Manages registration, retrieval, and caching of dynamically created agents.\n */\nexport class AgentRegistry {\n private agents: Map<string, RegisteredAgent> = new Map();\n private intentIndex: Map<string, string> = new Map(); // normalized intent -> agentId\n private options: Required<AgentRegistryOptions>;\n\n constructor(options: AgentRegistryOptions = {}) {\n this.options = {\n enableCache: options.enableCache !== false,\n cacheTTL: options.cacheTTL || 30 * 60 * 1000, // 30 minutes default\n };\n }\n\n /**\n * Register a new agent\n */\n register(agent: RegisteredAgent): void {\n this.agents.set(agent.id, agent);\n this.intentIndex.set(normalizeIntent(agent.intent), agent.id);\n }\n\n /**\n * Get agent by ID\n */\n get(id: string): RegisteredAgent | undefined {\n const agent = this.agents.get(id);\n\n if (!agent) {\n return undefined;\n }\n\n // Check if expired (only if caching is enabled)\n if (this.options.enableCache && this.options.cacheTTL > 0) {\n const age = Date.now() - agent.lastUsedAt.getTime();\n if (age > this.options.cacheTTL) {\n this.remove(id);\n return undefined;\n }\n }\n\n return agent;\n }\n\n /**\n * Find agent by exact intent match\n */\n findByExactIntent(intent: string): RegisteredAgent | undefined {\n const normalizedIntent = normalizeIntent(intent);\n const agentId = this.intentIndex.get(normalizedIntent);\n\n if (agentId) {\n return this.get(agentId);\n }\n\n return undefined;\n }\n\n /**\n * Find agent by similar intent (fuzzy matching)\n */\n findByIntent(intent: string, threshold: number = 0.8): RegisteredAgent | undefined {\n // Try exact match first\n const exactMatch = this.findByExactIntent(intent);\n if (exactMatch) {\n return exactMatch;\n }\n\n const normalizedIntent = normalizeIntent(intent);\n\n // Fuzzy match against all registered intents\n let bestMatch: { agent: RegisteredAgent; similarity: number } | null = null;\n\n for (const [registeredIntent, agentId] of this.intentIndex) {\n const similarity = intentSimilarity(normalizedIntent, registeredIntent);\n\n if (similarity >= threshold && similarity > (bestMatch?.similarity || 0)) {\n const agent = this.get(agentId);\n if (agent) {\n bestMatch = { agent, similarity };\n }\n }\n }\n\n return bestMatch?.agent;\n }\n\n /**\n * Record agent usage (updates lastUsedAt and usageCount)\n */\n recordUsage(id: string): void {\n const agent = this.agents.get(id);\n if (agent) {\n agent.lastUsedAt = new Date();\n agent.usageCount++;\n\n if (agent.config.lastUsedAt !== undefined) {\n agent.config.lastUsedAt = new Date();\n }\n }\n }\n\n /**\n * List all registered agents\n */\n listAll(): RegisteredAgent[] {\n // Clean expired entries first if caching is enabled\n if (this.options.enableCache && this.options.cacheTTL > 0) {\n this.cleanExpired();\n }\n\n return Array.from(this.agents.values());\n }\n\n /**\n * List agents sorted by usage count (most used first)\n */\n listByUsage(): RegisteredAgent[] {\n return this.listAll().sort((a, b) => b.usageCount - a.usageCount);\n }\n\n /**\n * List agents sorted by last used (most recent first)\n */\n listByRecent(): RegisteredAgent[] {\n return this.listAll().sort(\n (a, b) => b.lastUsedAt.getTime() - a.lastUsedAt.getTime()\n );\n }\n\n /**\n * Remove agent by ID\n */\n remove(id: string): boolean {\n const agent = this.agents.get(id);\n if (agent) {\n this.intentIndex.delete(normalizeIntent(agent.intent));\n return this.agents.delete(id);\n }\n return false;\n }\n\n /**\n * Clear all registered agents\n */\n clear(): void {\n this.agents.clear();\n this.intentIndex.clear();\n }\n\n /**\n * Get registry size\n */\n size(): number {\n return this.agents.size;\n }\n\n /**\n * Check if agent exists\n */\n has(id: string): boolean {\n return this.agents.has(id);\n }\n\n /**\n * Clean expired agents\n */\n private cleanExpired(): void {\n if (!this.options.enableCache || this.options.cacheTTL <= 0) {\n return;\n }\n\n const now = Date.now();\n const toRemove: string[] = [];\n\n for (const [id, agent] of this.agents) {\n const age = now - agent.lastUsedAt.getTime();\n if (age > this.options.cacheTTL) {\n toRemove.push(id);\n }\n }\n\n for (const id of toRemove) {\n this.remove(id);\n }\n }\n\n /**\n * Update cache TTL\n */\n setCacheTTL(ttl: number): void {\n this.options.cacheTTL = Math.max(0, ttl);\n }\n\n /**\n * Enable or disable caching\n */\n setCacheEnabled(enabled: boolean): void {\n this.options.enableCache = enabled;\n }\n\n /**\n * Export registry state (for persistence)\n */\n export(): RegisteredAgent[] {\n return Array.from(this.agents.values());\n }\n\n /**\n * Import registry state (for restoration)\n */\n import(agents: RegisteredAgent[]): void {\n for (const agent of agents) {\n // Convert date strings back to Date objects if needed\n const normalizedAgent: RegisteredAgent = {\n ...agent,\n createdAt: agent.createdAt instanceof Date ? agent.createdAt : new Date(agent.createdAt),\n lastUsedAt: agent.lastUsedAt instanceof Date ? agent.lastUsedAt : new Date(agent.lastUsedAt),\n };\n this.register(normalizedAgent);\n }\n }\n}\n","/**\n * Agent Factory\n *\n * Creates and manages dynamic agent configurations based on user intent.\n * Combines IntentAnalyzer for intent parsing and AgentRegistry for storage.\n */\n\nimport type {\n DynamicAgentConfig,\n IntentAnalysis,\n RegisteredAgent,\n AgentFactoryOptions,\n IntentCategory,\n LLMExecutor,\n} from './types';\nimport { IntentAnalyzer } from './intent-analyzer';\nimport { AgentRegistry } from './agent-registry';\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Generate unique agent ID\n */\nfunction generateAgentId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 11);\n return `agent_${timestamp}_${random}`;\n}\n\n/**\n * Category to human-readable name mapping\n */\nconst CATEGORY_NAMES: Record<IntentCategory, string> = {\n data_analysis: 'Data Analyst',\n visualization: 'Visualization Expert',\n data_transformation: 'Data Engineer',\n machine_learning: 'ML Engineer',\n content_creation: 'Content Creator',\n research: 'Research Assistant',\n customer_support: 'Support Agent',\n code_generation: 'Code Assistant',\n general_assistant: 'General Assistant',\n custom: 'Custom Agent',\n};\n\n// =============================================================================\n// Agent Factory Class\n// =============================================================================\n\n/**\n * Agent Factory\n *\n * Creates agents dynamically based on user intent.\n * Uses rule-based analysis with optional LLM fallback.\n */\nexport class AgentFactory {\n private analyzer: IntentAnalyzer;\n private registry: AgentRegistry;\n private options: Required<AgentFactoryOptions>;\n\n constructor(options: AgentFactoryOptions = {}) {\n this.options = {\n useLLMFallback: options.useLLMFallback !== false,\n ruleConfidenceThreshold: options.ruleConfidenceThreshold || 0.7,\n enableCache: options.enableCache !== false,\n cacheTTL: options.cacheTTL || 30 * 60 * 1000, // 30 minutes\n customPatterns: options.customPatterns || [],\n };\n\n this.analyzer = new IntentAnalyzer({\n customPatterns: this.options.customPatterns,\n confidenceThreshold: this.options.ruleConfidenceThreshold,\n useLLMFallback: this.options.useLLMFallback,\n });\n\n this.registry = new AgentRegistry({\n enableCache: this.options.enableCache,\n cacheTTL: this.options.cacheTTL,\n });\n }\n\n /**\n * Create agent from user intent\n *\n * @param intent - Natural language description of what the user wants\n * @param llmExecutor - Optional function to execute LLM queries for fallback analysis\n * @returns Created or cached RegisteredAgent\n */\n async createFromIntent(\n intent: string,\n llmExecutor?: LLMExecutor\n ): Promise<RegisteredAgent> {\n // Check if similar intent already exists in registry\n const existingAgent = this.registry.findByIntent(intent);\n if (existingAgent) {\n this.registry.recordUsage(existingAgent.id);\n return existingAgent;\n }\n\n // Analyze intent\n const analysis = await this.analyzer.analyze(intent, llmExecutor);\n\n // Build agent config from analysis\n const config = this.buildConfig(analysis);\n\n // Create registered agent entry\n const agent: RegisteredAgent = {\n id: generateAgentId(),\n name: this.generateAgentName(analysis),\n config,\n intent,\n analysis,\n createdAt: new Date(),\n lastUsedAt: new Date(),\n usageCount: 1,\n };\n\n // Register the agent\n this.registry.register(agent);\n\n return agent;\n }\n\n /**\n * Create agent from explicit configuration (bypass intent analysis)\n *\n * @param name - Human-readable agent name\n * @param config - Partial agent configuration\n * @returns Created RegisteredAgent\n */\n createFromConfig(\n name: string,\n config: Partial<DynamicAgentConfig>\n ): RegisteredAgent {\n const fullConfig: DynamicAgentConfig = {\n template: 'custom',\n streaming: true,\n networkMode: 'SANDBOX',\n ...config,\n name,\n createdAt: new Date(),\n lastUsedAt: new Date(),\n };\n\n const agent: RegisteredAgent = {\n id: generateAgentId(),\n name,\n config: fullConfig,\n intent: `Custom: ${name}`,\n analysis: {\n category: 'custom',\n confidence: 1.0,\n entities: [],\n suggestedConfig: config,\n originalIntent: `Custom: ${name}`,\n method: 'rule',\n },\n createdAt: new Date(),\n lastUsedAt: new Date(),\n usageCount: 1,\n };\n\n this.registry.register(agent);\n return agent;\n }\n\n /**\n * Build full config from intent analysis\n */\n private buildConfig(analysis: IntentAnalysis): DynamicAgentConfig {\n const baseConfig: DynamicAgentConfig = {\n template: analysis.suggestedConfig.template || 'custom',\n streaming: true,\n networkMode: 'SANDBOX',\n createdAt: new Date(),\n lastUsedAt: new Date(),\n };\n\n // Merge suggested config from analysis\n return {\n ...baseConfig,\n ...analysis.suggestedConfig,\n metadata: {\n analysisCategory: analysis.category,\n analysisConfidence: analysis.confidence,\n analysisMethod: analysis.method,\n entities: analysis.entities,\n },\n };\n }\n\n /**\n * Generate human-readable agent name from analysis\n */\n private generateAgentName(analysis: IntentAnalysis): string {\n return CATEGORY_NAMES[analysis.category] || 'Custom Agent';\n }\n\n // ===========================================================================\n // Registry Access Methods\n // ===========================================================================\n\n /**\n * Get agent by ID\n */\n getAgent(id: string): RegisteredAgent | undefined {\n return this.registry.get(id);\n }\n\n /**\n * List all registered agents\n */\n listAgents(): RegisteredAgent[] {\n return this.registry.listAll();\n }\n\n /**\n * List agents by usage (most used first)\n */\n listAgentsByUsage(): RegisteredAgent[] {\n return this.registry.listByUsage();\n }\n\n /**\n * List agents by recency (most recent first)\n */\n listAgentsByRecent(): RegisteredAgent[] {\n return this.registry.listByRecent();\n }\n\n /**\n * Remove an agent by ID\n */\n removeAgent(id: string): boolean {\n return this.registry.remove(id);\n }\n\n /**\n * Clear all agents\n */\n clearAll(): void {\n this.registry.clear();\n }\n\n /**\n * Get number of registered agents\n */\n getAgentCount(): number {\n return this.registry.size();\n }\n\n /**\n * Record usage of an agent\n */\n recordAgentUsage(id: string): void {\n this.registry.recordUsage(id);\n }\n\n // ===========================================================================\n // Analyzer Access Methods\n // ===========================================================================\n\n /**\n * Get the analyzer instance for direct access\n */\n getAnalyzer(): IntentAnalyzer {\n return this.analyzer;\n }\n\n /**\n * Get the registry instance for direct access\n */\n getRegistry(): AgentRegistry {\n return this.registry;\n }\n\n // ===========================================================================\n // Persistence Methods\n // ===========================================================================\n\n /**\n * Export factory state for persistence\n */\n exportState(): {\n agents: RegisteredAgent[];\n options: AgentFactoryOptions;\n } {\n return {\n agents: this.registry.export(),\n options: this.options,\n };\n }\n\n /**\n * Import factory state from persistence\n */\n importState(state: { agents: RegisteredAgent[] }): void {\n this.registry.import(state.agents);\n }\n}\n","'use client';\n\n/**\n * useIntentAgent Hook\n *\n * Creates and manages agents dynamically based on user intent.\n * Uses the AgentFactory to analyze intent and generate appropriate configurations.\n *\n * @example\n * ```tsx\n * function SmartChat() {\n * const {\n * createAgent,\n * query,\n * agent,\n * messages,\n * isStreaming,\n * isCreating\n * } = useIntentAgent();\n *\n * useEffect(() => {\n * createAgent(\"Help me analyze sales data and find trends\");\n * }, []);\n *\n * if (isCreating) {\n * return <p>Setting up your AI assistant...</p>;\n * }\n *\n * return (\n * <div>\n * {agent && (\n * <div>\n * <span>{agent.name}</span>\n * <span>Confidence: {Math.round(agent.analysis.confidence * 100)}%</span>\n * </div>\n * )}\n * <ChatInterface\n * messages={messages}\n * isStreaming={isStreaming}\n * onSend={query}\n * />\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback, useRef, useMemo, useEffect } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport { AgentFactory } from '../factory/agent-factory';\nimport { executeQueryWithConfig } from '../api/client';\nimport { parseSSEStream } from '../utils/sse-parser';\nimport type {\n UseIntentAgentReturn,\n UseIntentAgentOptions,\n RegisteredAgent,\n} from '../factory/types';\nimport type { ChatMessage, ToolCall, VisualizationData } from '../types';\n\n/**\n * Generate unique ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n}\n\n/**\n * Hook for intent-based AI agent interactions\n *\n * @param options - Factory configuration options\n */\nexport function useIntentAgent(\n options: UseIntentAgentOptions = {}\n): UseIntentAgentReturn {\n const {\n credentials,\n selectedWorkspace,\n messages,\n addMessage,\n updateMessage,\n clearMessages: contextClear,\n setIsQueryRunning,\n setQueryStartTime,\n addVisualization,\n refreshDatasets,\n refreshVisualizations,\n config,\n } = useFlowstack();\n\n // Factory instance (memoized based on options)\n const factory = useMemo(\n () => new AgentFactory({\n useLLMFallback: options.useLLMFallback,\n ruleConfidenceThreshold: options.ruleConfidenceThreshold,\n enableCache: options.enableCache,\n cacheTTL: options.cacheTTL,\n customPatterns: options.customPatterns,\n }),\n [\n options.useLLMFallback,\n options.ruleConfidenceThreshold,\n options.enableCache,\n options.cacheTTL,\n options.customPatterns,\n ]\n );\n\n // State\n const [agent, setAgent] = useState<RegisteredAgent | null>(null);\n const [isStreaming, setIsStreaming] = useState(false);\n const [isCreating, setIsCreating] = useState(false);\n const [toolCalls, setToolCalls] = useState<ToolCall[]>([]);\n const [error, setError] = useState<string | null>(null);\n\n const abortControllerRef = useRef<AbortController | null>(null);\n const currentMessageIdRef = useRef<string | null>(null);\n\n const clientConfig = useMemo(() => ({\n baseUrl: config.baseUrl,\n tenantId: config.tenantId,\n }), [config.baseUrl, config.tenantId]);\n\n // Handle initial intent if provided\n useEffect(() => {\n if (options.initialIntent && !agent && !isCreating) {\n createAgent(options.initialIntent);\n }\n }, [options.initialIntent]);\n\n /**\n * Create an LLM executor for fallback intent analysis\n */\n const createLLMExecutor = useCallback(() => {\n if (!credentials || !selectedWorkspace) {\n return undefined;\n }\n\n return async (prompt: string): Promise<string> => {\n const response = await executeQueryWithConfig(\n credentials,\n prompt,\n selectedWorkspace.workspaceId,\n { networkMode: 'SANDBOX' },\n clientConfig\n );\n\n if (!response.body) {\n throw new Error('No response body');\n }\n\n const reader = response.body.getReader();\n let result = '';\n\n for await (const event of parseSSEStream(reader)) {\n if (event.type === 'text' || event.type === 'content' || event.type === 'delta') {\n result += event.content || '';\n }\n }\n\n return result;\n };\n }, [credentials, selectedWorkspace, clientConfig]);\n\n /**\n * Create agent from intent\n */\n const createAgent = useCallback(async (intent: string): Promise<RegisteredAgent> => {\n setError(null);\n setIsCreating(true);\n\n try {\n const llmExecutor = createLLMExecutor();\n const newAgent = await factory.createFromIntent(intent, llmExecutor);\n setAgent(newAgent);\n return newAgent;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to create agent';\n setError(message);\n throw err;\n } finally {\n setIsCreating(false);\n }\n }, [factory, createLLMExecutor]);\n\n /**\n * Execute query with current agent\n */\n const query = useCallback(async (prompt: string): Promise<void> => {\n setError(null);\n\n if (!credentials) {\n setError('Not authenticated');\n return;\n }\n\n if (!selectedWorkspace) {\n setError('No workspace selected');\n return;\n }\n\n if (!agent) {\n setError('No agent created. Call createAgent first.');\n return;\n }\n\n // Add user message\n const userMessage: ChatMessage = {\n id: generateId(),\n role: 'user',\n content: prompt,\n timestamp: new Date(),\n };\n addMessage(userMessage);\n\n // Create assistant message placeholder\n const assistantId = generateId();\n currentMessageIdRef.current = assistantId;\n const assistantMessage: ChatMessage = {\n id: assistantId,\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n isStreaming: true,\n toolCalls: [],\n visualizations: [],\n };\n addMessage(assistantMessage);\n\n // Set loading state\n setIsStreaming(true);\n setIsQueryRunning(true);\n setQueryStartTime(Date.now());\n setToolCalls([]);\n\n // Create abort controller for cancellation\n abortControllerRef.current = new AbortController();\n\n let fullContent = '';\n\n try {\n // Execute with agent's custom configuration\n const response = await executeQueryWithConfig(\n credentials,\n prompt,\n selectedWorkspace.workspaceId,\n {\n networkMode: agent.config.networkMode || 'SANDBOX',\n systemPrompt: agent.config.systemPrompt,\n tools: agent.config.tools,\n },\n clientConfig\n );\n\n if (!response.body) {\n throw new Error('No response body');\n }\n\n const reader = response.body.getReader();\n const currentToolCalls: ToolCall[] = [];\n const currentVisualizations: VisualizationData[] = [];\n\n // Process SSE stream\n for await (const event of parseSSEStream(reader)) {\n // Check if cancelled\n if (abortControllerRef.current?.signal.aborted) {\n break;\n }\n\n switch (event.type) {\n case 'text':\n case 'content':\n case 'delta':\n if (event.content) {\n fullContent += event.content;\n updateMessage(assistantId, { content: fullContent });\n }\n break;\n\n case 'tool_call':\n case 'tool_use':\n if (event.tool) {\n const toolCall: ToolCall = {\n id: generateId(),\n toolUseId: event.args?.tool_use_id as string,\n name: event.tool,\n args: event.args,\n status: 'running',\n startTime: Date.now(),\n };\n currentToolCalls.push(toolCall);\n setToolCalls([...currentToolCalls]);\n updateMessage(assistantId, { toolCalls: [...currentToolCalls] });\n }\n break;\n\n case 'tool_result':\n if (event.tool || currentToolCalls.length > 0) {\n const toolIndex = currentToolCalls.findIndex(\n tc => tc.name === event.tool || tc.status === 'running'\n );\n if (toolIndex >= 0) {\n currentToolCalls[toolIndex] = {\n ...currentToolCalls[toolIndex],\n result: event.result,\n status: 'complete',\n endTime: Date.now(),\n };\n setToolCalls([...currentToolCalls]);\n updateMessage(assistantId, { toolCalls: [...currentToolCalls] });\n }\n }\n break;\n\n case 'visualization':\n if (event.data) {\n const viz = event.data as VisualizationData;\n currentVisualizations.push(viz);\n addVisualization(viz);\n updateMessage(assistantId, { visualizations: [...currentVisualizations] });\n }\n break;\n\n case 'error':\n setError(event.error || 'Query failed');\n break;\n\n case 'done':\n case 'complete':\n // Query complete\n break;\n }\n }\n\n // Mark message as complete\n updateMessage(assistantId, {\n content: fullContent,\n isStreaming: false,\n toolCalls: currentToolCalls,\n visualizations: currentVisualizations,\n });\n\n // Record agent usage\n factory.recordAgentUsage(agent.id);\n\n // Refresh artifacts if tools were used\n if (currentToolCalls.length > 0) {\n await Promise.all([\n refreshDatasets(),\n refreshVisualizations(),\n ]);\n }\n\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Query failed';\n setError(message);\n\n updateMessage(assistantId, {\n content: fullContent || `Error: ${message}`,\n isStreaming: false,\n });\n } finally {\n setIsStreaming(false);\n setIsQueryRunning(false);\n setQueryStartTime(null);\n currentMessageIdRef.current = null;\n abortControllerRef.current = null;\n }\n }, [\n credentials,\n selectedWorkspace,\n agent,\n addMessage,\n updateMessage,\n setIsQueryRunning,\n setQueryStartTime,\n addVisualization,\n refreshDatasets,\n refreshVisualizations,\n clientConfig,\n factory,\n ]);\n\n /**\n * Reset agent and messages\n */\n const reset = useCallback(() => {\n // Cancel any ongoing query\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n setAgent(null);\n setError(null);\n setToolCalls([]);\n setIsStreaming(false);\n setIsCreating(false);\n contextClear();\n }, [contextClear]);\n\n /**\n * List all registered agents\n */\n const listAgents = useCallback((): RegisteredAgent[] => {\n return factory.listAgents();\n }, [factory]);\n\n /**\n * Switch to a registered agent by ID\n */\n const useRegisteredAgent = useCallback((agentId: string) => {\n const registeredAgent = factory.getAgent(agentId);\n if (registeredAgent) {\n setAgent(registeredAgent);\n factory.recordAgentUsage(agentId);\n setError(null);\n } else {\n setError(`Agent ${agentId} not found`);\n }\n }, [factory]);\n\n /**\n * Remove an agent by ID\n */\n const removeAgent = useCallback((agentId: string): boolean => {\n const removed = factory.removeAgent(agentId);\n\n // If removing current agent, clear it\n if (removed && agent?.id === agentId) {\n setAgent(null);\n }\n\n return removed;\n }, [factory, agent]);\n\n return {\n createAgent,\n query,\n agent,\n messages,\n isStreaming,\n isCreating,\n toolCalls,\n error,\n reset,\n listAgents,\n useAgent: useRegisteredAgent,\n removeAgent,\n };\n}\n","'use client';\n\n/**\n * useAuthGuard Hook\n *\n * Provides auth guard logic without rendering components.\n * Useful for programmatic auth checks in pages/components.\n *\n * @example\n * ```tsx\n * function ProtectedPage() {\n * const { isAllowed, isLoading, shouldRedirect } = useAuthGuard({\n * requireAuth: true,\n * redirectTo: '/login',\n * });\n *\n * useEffect(() => {\n * if (shouldRedirect) {\n * router.push('/login');\n * }\n * }, [shouldRedirect]);\n *\n * if (isLoading) return <Loading />;\n * if (!isAllowed) return null;\n *\n * return <ProtectedContent />;\n * }\n * ```\n */\n\nimport { useState, useEffect, useMemo } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\n\nexport interface AuthGuardOptions {\n /** Require authentication (default: true) */\n requireAuth?: boolean;\n /** Require a workspace to be selected */\n requireWorkspace?: boolean;\n /** URL to redirect to when not authenticated */\n redirectTo?: string;\n}\n\nexport interface UseAuthGuardReturn {\n /** Whether the user is allowed to access the protected content */\n isAllowed: boolean;\n /** Whether auth state is still being determined */\n isLoading: boolean;\n /** Whether a redirect should occur */\n shouldRedirect: boolean;\n /** The URL to redirect to (if shouldRedirect is true) */\n redirectTo?: string;\n /** Whether the user is authenticated */\n isAuthenticated: boolean;\n /** Whether a workspace is selected */\n hasWorkspace: boolean;\n}\n\n/**\n * Hook for programmatic auth guard logic\n */\nexport function useAuthGuard(options: AuthGuardOptions = {}): UseAuthGuardReturn {\n const {\n requireAuth = true,\n requireWorkspace = false,\n redirectTo,\n } = options;\n\n const {\n isAuthenticated,\n isInitialized,\n selectedWorkspace,\n } = useFlowstack();\n\n const [shouldRedirect, setShouldRedirect] = useState(false);\n\n const hasWorkspace = selectedWorkspace !== null;\n const isLoading = !isInitialized;\n\n // Determine if user is allowed\n const isAllowed = useMemo(() => {\n if (!isInitialized) return false;\n if (requireAuth && !isAuthenticated) return false;\n if (requireWorkspace && !hasWorkspace) return false;\n return true;\n }, [isInitialized, requireAuth, isAuthenticated, requireWorkspace, hasWorkspace]);\n\n // Determine if redirect should occur\n useEffect(() => {\n if (!isInitialized) return;\n\n if (requireAuth && !isAuthenticated && redirectTo) {\n setShouldRedirect(true);\n } else {\n setShouldRedirect(false);\n }\n }, [isInitialized, requireAuth, isAuthenticated, redirectTo]);\n\n return {\n isAllowed,\n isLoading,\n shouldRedirect,\n redirectTo,\n isAuthenticated,\n hasWorkspace,\n };\n}\n","'use client';\n\n/**\n * useFlowstackStatus Hook\n *\n * Monitors connection status and health of the Flowstack backend.\n *\n * @example\n * ```tsx\n * function StatusIndicator() {\n * const { isConnected, latency, status } = useFlowstackStatus();\n *\n * return (\n * <div>\n * Status: {status}\n * {latency && ` (${latency}ms)`}\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\n\nexport type ConnectionStatus = 'unknown' | 'connecting' | 'connected' | 'disconnected' | 'error';\n\nexport interface UseFlowstackStatusReturn {\n /** Current connection status */\n status: ConnectionStatus;\n /** Whether connected to backend */\n isConnected: boolean;\n /** Whether currently checking connection */\n isChecking: boolean;\n /** Last measured latency in milliseconds */\n latency: number | null;\n /** Last successful connection time */\n lastConnected: Date | null;\n /** Last error message if any */\n error: string | null;\n /** Manually trigger a connection check */\n checkConnection: () => Promise<void>;\n}\n\nexport interface UseFlowstackStatusOptions {\n /** Polling interval in milliseconds (default: 30000) */\n pollInterval?: number;\n /** Whether to poll automatically (default: true) */\n autoPoll?: boolean;\n /** Whether to check on mount (default: true) */\n checkOnMount?: boolean;\n}\n\n/**\n * Hook for monitoring Flowstack backend status\n */\nexport function useFlowstackStatus(options: UseFlowstackStatusOptions = {}): UseFlowstackStatusReturn {\n const {\n pollInterval = 30000,\n autoPoll = true,\n checkOnMount = true,\n } = options;\n\n const { config } = useFlowstack();\n\n const [status, setStatus] = useState<ConnectionStatus>('unknown');\n const [isChecking, setIsChecking] = useState(false);\n const [latency, setLatency] = useState<number | null>(null);\n const [lastConnected, setLastConnected] = useState<Date | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const baseUrl = config.baseUrl || 'https://sage-api.flowstack.fun';\n\n const checkConnection = useCallback(async () => {\n if (isChecking) return;\n\n setIsChecking(true);\n setStatus('connecting');\n setError(null);\n\n const start = Date.now();\n\n try {\n // Try to reach the health endpoint\n const response = await fetch(`${baseUrl}/health`, {\n method: 'GET',\n mode: 'cors',\n cache: 'no-cache',\n });\n\n const elapsed = Date.now() - start;\n setLatency(elapsed);\n\n if (response.ok) {\n setStatus('connected');\n setLastConnected(new Date());\n setError(null);\n } else {\n setStatus('error');\n setError(`Server returned ${response.status}`);\n }\n } catch (err) {\n setStatus('disconnected');\n setLatency(null);\n setError(err instanceof Error ? err.message : 'Connection failed');\n } finally {\n setIsChecking(false);\n }\n }, [baseUrl, isChecking]);\n\n // Check on mount\n useEffect(() => {\n if (checkOnMount) {\n checkConnection();\n }\n }, [checkOnMount]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Set up polling\n useEffect(() => {\n if (!autoPoll || pollInterval <= 0) return;\n\n const interval = setInterval(checkConnection, pollInterval);\n return () => clearInterval(interval);\n }, [autoPoll, pollInterval, checkConnection]);\n\n return {\n status,\n isConnected: status === 'connected',\n isChecking,\n latency,\n lastConnected,\n error,\n checkConnection,\n };\n}\n","'use client';\n\n/**\n * useUserManagement Hook\n *\n * Provides user management functionality for developers to track and manage\n * users who sign up through their apps.\n *\n * @example\n * ```tsx\n * function AdminDashboard() {\n * const { users, stats, suspendUser, canManageUsers } = useUserManagement();\n *\n * if (!canManageUsers) return <div>Access denied</div>;\n *\n * return (\n * <div>\n * <h2>Total Users: {stats?.totalUsers}</h2>\n * {users.map(user => (\n * <div key={user.id}>\n * {user.email} - {user.role}\n * <button onClick={() => suspendUser(user.id)}>Suspend</button>\n * </div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback, useEffect } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport type {\n UseUserManagementReturn,\n ManagedUser,\n UserStats,\n UserActivityLog,\n UserListParams,\n UpdateUserRequest,\n UserRole,\n UserStatus,\n} from '../types';\nimport {\n listUsers as apiListUsers,\n getUser as apiGetUser,\n updateUser as apiUpdateUser,\n deleteUser as apiDeleteUser,\n suspendUser as apiSuspendUser,\n reactivateUser as apiReactivateUser,\n getUserActivity as apiGetUserActivity,\n getUserStats as apiGetUserStats,\n checkAdminPermissions as apiCheckAdminPermissions,\n} from '../api/client';\nimport { mockDelay, mockManagedUsers, mockUserStats, mockUserActivity } from '../mock/fixtures';\n\n/**\n * Hook for user management operations\n */\nexport function useUserManagement(): UseUserManagementReturn {\n const { credentials, config } = useFlowstack();\n\n const [users, setUsers] = useState<ManagedUser[]>([]);\n const [stats, setStats] = useState<UserStats | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [canManageUsers, setCanManageUsers] = useState(false);\n const [pagination, setPagination] = useState({\n page: 1,\n limit: 20,\n totalCount: 0,\n hasMore: false,\n });\n\n // Filter state\n const [search, setSearch] = useState('');\n const [roleFilter, setRoleFilter] = useState<UserRole | null>(null);\n const [statusFilter, setStatusFilter] = useState<UserStatus | null>(null);\n\n const clientConfig = {\n baseUrl: config.baseUrl,\n tenantId: config.tenantId,\n };\n\n const isMockMode = config.mode === 'mock';\n\n /**\n * Check admin permissions on mount\n */\n useEffect(() => {\n const checkPermissions = async () => {\n if (!credentials && !isMockMode) {\n setCanManageUsers(false);\n return;\n }\n\n if (isMockMode) {\n // In mock mode, assume owner/admin can manage\n setCanManageUsers(true);\n return;\n }\n\n try {\n const response = await apiCheckAdminPermissions(credentials!, clientConfig);\n if (response.ok && response.data) {\n setCanManageUsers(response.data.canManageUsers);\n }\n } catch {\n setCanManageUsers(false);\n }\n };\n\n checkPermissions();\n }, [credentials, isMockMode, clientConfig]);\n\n /**\n * Refresh users list with optional parameters\n */\n const refreshUsers = useCallback(async (params?: UserListParams): Promise<void> => {\n setError(null);\n setIsLoading(true);\n\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n setIsLoading(false);\n return;\n }\n\n try {\n if (isMockMode) {\n await mockDelay(200, 500);\n\n // Apply filters to mock data\n let filtered = [...mockManagedUsers];\n\n const searchTerm = params?.search || search;\n if (searchTerm) {\n const lower = searchTerm.toLowerCase();\n filtered = filtered.filter(u =>\n u.email.toLowerCase().includes(lower) ||\n u.name?.toLowerCase().includes(lower)\n );\n }\n\n const role = params?.role || roleFilter;\n if (role) {\n filtered = filtered.filter(u => u.role === role);\n }\n\n const status = params?.status || statusFilter;\n if (status) {\n filtered = filtered.filter(u => u.status === status);\n }\n\n setUsers(filtered);\n setPagination(prev => ({\n ...prev,\n page: params?.page || prev.page,\n limit: params?.limit || prev.limit,\n totalCount: filtered.length,\n hasMore: false,\n }));\n return;\n }\n\n const response = await apiListUsers(credentials!, {\n page: params?.page || pagination.page,\n limit: params?.limit || pagination.limit,\n search: params?.search || search,\n role: params?.role || roleFilter || undefined,\n status: params?.status || statusFilter || undefined,\n sortBy: params?.sortBy,\n sortOrder: params?.sortOrder,\n }, clientConfig);\n\n if (response.ok && response.data) {\n setUsers(response.data.users);\n setPagination({\n page: response.data.page,\n limit: response.data.limit,\n totalCount: response.data.totalCount,\n hasMore: response.data.hasMore,\n });\n } else {\n setError(response.error || 'Failed to load users');\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to load users';\n setError(message);\n } finally {\n setIsLoading(false);\n }\n }, [credentials, isMockMode, clientConfig, pagination.page, pagination.limit, search, roleFilter, statusFilter]);\n\n /**\n * Get a single user by ID\n */\n const getUser = useCallback(async (userId: string): Promise<ManagedUser | null> => {\n setError(null);\n\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n return null;\n }\n\n try {\n if (isMockMode) {\n await mockDelay(100, 300);\n return mockManagedUsers.find(u => u.id === userId) || null;\n }\n\n const response = await apiGetUser(credentials!, userId, clientConfig);\n if (response.ok && response.data) {\n return response.data.user;\n }\n\n setError(response.error || 'User not found');\n return null;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to get user';\n setError(message);\n return null;\n }\n }, [credentials, isMockMode, clientConfig]);\n\n /**\n * Update a user's profile or role\n */\n const updateUser = useCallback(async (\n userId: string,\n updates: UpdateUserRequest\n ): Promise<boolean> => {\n setError(null);\n\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n return false;\n }\n\n try {\n if (isMockMode) {\n await mockDelay(200, 400);\n // Update local state\n setUsers(prev => prev.map(u =>\n u.id === userId ? { ...u, ...updates } : u\n ));\n return true;\n }\n\n const response = await apiUpdateUser(credentials!, userId, updates, clientConfig);\n if (response.ok && response.data) {\n // Update local state with response\n setUsers(prev => prev.map(u =>\n u.id === userId ? response.data!.user : u\n ));\n return true;\n }\n\n setError(response.error || 'Failed to update user');\n return false;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to update user';\n setError(message);\n return false;\n }\n }, [credentials, isMockMode, clientConfig]);\n\n /**\n * Suspend a user account\n */\n const suspendUser = useCallback(async (\n userId: string,\n reason?: string\n ): Promise<boolean> => {\n setError(null);\n\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n return false;\n }\n\n try {\n if (isMockMode) {\n await mockDelay(200, 400);\n setUsers(prev => prev.map(u =>\n u.id === userId ? { ...u, status: 'suspended' as UserStatus } : u\n ));\n return true;\n }\n\n const response = await apiSuspendUser(credentials!, userId, reason, clientConfig);\n if (response.ok && response.data) {\n setUsers(prev => prev.map(u =>\n u.id === userId ? response.data!.user : u\n ));\n return true;\n }\n\n setError(response.error || 'Failed to suspend user');\n return false;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to suspend user';\n setError(message);\n return false;\n }\n }, [credentials, isMockMode, clientConfig]);\n\n /**\n * Reactivate a suspended user account\n */\n const reactivateUser = useCallback(async (userId: string): Promise<boolean> => {\n setError(null);\n\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n return false;\n }\n\n try {\n if (isMockMode) {\n await mockDelay(200, 400);\n setUsers(prev => prev.map(u =>\n u.id === userId ? { ...u, status: 'active' as UserStatus } : u\n ));\n return true;\n }\n\n const response = await apiReactivateUser(credentials!, userId, clientConfig);\n if (response.ok && response.data) {\n setUsers(prev => prev.map(u =>\n u.id === userId ? response.data!.user : u\n ));\n return true;\n }\n\n setError(response.error || 'Failed to reactivate user');\n return false;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to reactivate user';\n setError(message);\n return false;\n }\n }, [credentials, isMockMode, clientConfig]);\n\n /**\n * Delete a user permanently\n */\n const deleteUser = useCallback(async (userId: string): Promise<boolean> => {\n setError(null);\n\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n return false;\n }\n\n try {\n if (isMockMode) {\n await mockDelay(200, 400);\n setUsers(prev => prev.filter(u => u.id !== userId));\n return true;\n }\n\n const response = await apiDeleteUser(credentials!, userId, clientConfig);\n if (response.ok) {\n setUsers(prev => prev.filter(u => u.id !== userId));\n return true;\n }\n\n setError(response.error || 'Failed to delete user');\n return false;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to delete user';\n setError(message);\n return false;\n }\n }, [credentials, isMockMode, clientConfig]);\n\n /**\n * Get user activity logs\n */\n const getUserActivity = useCallback(async (\n userId: string,\n limit: number = 50\n ): Promise<UserActivityLog[]> => {\n setError(null);\n\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n return [];\n }\n\n try {\n if (isMockMode) {\n await mockDelay(100, 300);\n return mockUserActivity.filter(a => a.userId === userId).slice(0, limit);\n }\n\n const response = await apiGetUserActivity(credentials!, userId, limit, clientConfig);\n if (response.ok && response.data) {\n return response.data.activities;\n }\n\n setError(response.error || 'Failed to get activity');\n return [];\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to get activity';\n setError(message);\n return [];\n }\n }, [credentials, isMockMode, clientConfig]);\n\n /**\n * Refresh user statistics\n */\n const refreshStats = useCallback(async (): Promise<void> => {\n setError(null);\n\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n return;\n }\n\n try {\n if (isMockMode) {\n await mockDelay(100, 300);\n setStats(mockUserStats);\n return;\n }\n\n const response = await apiGetUserStats(credentials!, clientConfig);\n if (response.ok && response.data) {\n setStats(response.data);\n } else {\n setError(response.error || 'Failed to load stats');\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to load stats';\n setError(message);\n }\n }, [credentials, isMockMode, clientConfig]);\n\n /**\n * Set page for pagination\n */\n const setPage = useCallback((page: number) => {\n setPagination(prev => ({ ...prev, page }));\n }, []);\n\n /**\n * Set role filter\n */\n const setRoleFilterCallback = useCallback((role: UserRole | null) => {\n setRoleFilter(role);\n setPagination(prev => ({ ...prev, page: 1 }));\n }, []);\n\n /**\n * Set status filter\n */\n const setStatusFilterCallback = useCallback((status: UserStatus | null) => {\n setStatusFilter(status);\n setPagination(prev => ({ ...prev, page: 1 }));\n }, []);\n\n /**\n * Set search term\n */\n const setSearchCallback = useCallback((searchTerm: string) => {\n setSearch(searchTerm);\n setPagination(prev => ({ ...prev, page: 1 }));\n }, []);\n\n // Load users and stats on mount if authenticated\n useEffect(() => {\n if (credentials || isMockMode) {\n refreshUsers();\n refreshStats();\n }\n }, [credentials, isMockMode]);\n\n return {\n users,\n stats,\n isLoading,\n error,\n pagination,\n refreshUsers,\n getUser,\n updateUser,\n suspendUser,\n reactivateUser,\n deleteUser,\n getUserActivity,\n refreshStats,\n setPage,\n setSearch: setSearchCallback,\n setRoleFilter: setRoleFilterCallback,\n setStatusFilter: setStatusFilterCallback,\n canManageUsers,\n };\n}\n","'use client';\n\n/**\n * useSites Hook\n *\n * Provides published site management — list, create, stage files, publish to CDN, delete.\n *\n * @example\n * ```tsx\n * function SiteManager() {\n * const { sites, createSite, deleteSite, isLoading } = useSites();\n *\n * return (\n * <div>\n * {sites.map(site => (\n * <div key={site.id}>\n * <a href={site.url}>{site.name}</a>\n * <button onClick={() => deleteSite(site.id)}>Delete</button>\n * </div>\n * ))}\n * <button onClick={() => createSite({\n * name: 'My Site',\n * files: { 'index.html': '<html>Hello</html>' }\n * })}>\n * Quick Publish\n * </button>\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport type { PublishedSiteInfo, UseSitesReturn, CreateSiteParams } from '../types';\nimport {\n listSites as apiListSites,\n createSite as apiCreateSite,\n addSiteFile as apiAddSiteFile,\n publishStagedSite as apiPublishStagedSite,\n deleteSite as apiDeleteSite,\n} from '../api/client';\n\n/**\n * Hook for published site management\n */\nexport function useSites(): UseSitesReturn {\n const { credentials, config } = useFlowstack();\n\n const [sites, setSites] = useState<PublishedSiteInfo[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const isMockMode = config.mode === 'mock';\n const clientConfig = {\n baseUrl: config.baseUrl,\n tenantId: config.tenantId,\n };\n\n /**\n * Normalize backend response to PublishedSiteInfo\n */\n const normalizeSite = (raw: Record<string, unknown>): PublishedSiteInfo => ({\n id: (raw.site_id || raw.id || '') as string,\n name: (raw.site_name || raw.name || '') as string,\n url: (raw.url || '') as string,\n shortUrl: (raw.short_url || raw.shortUrl) as string | undefined,\n siteType: (raw.site_type || raw.siteType || 'on_demand') as PublishedSiteInfo['siteType'],\n fileCount: (raw.file_count || raw.fileCount || 0) as number,\n totalBytes: (raw.total_bytes || raw.totalBytes) as number | undefined,\n createdAt: (raw.created_at || raw.createdAt || '') as string,\n description: (raw.description) as string | undefined,\n metadata: (raw.metadata) as Record<string, unknown> | undefined,\n currentVersion: (raw.current_version || raw.currentVersion) as number | undefined,\n liveVersion: (raw.live_version || raw.liveVersion) as number | undefined,\n subdomainUrl: (raw.subdomain_url || raw.subdomainUrl) as string | undefined,\n alias: (raw.alias ?? undefined) as string | null | undefined,\n });\n\n /**\n * Refresh the sites list\n */\n const refreshSites = useCallback(async () => {\n if (!credentials && !isMockMode) return;\n setIsLoading(true);\n setError(null);\n\n try {\n if (isMockMode) {\n setSites([]);\n return;\n }\n\n const response = await apiListSites(credentials!, clientConfig);\n if (response.ok && response.data) {\n const rawSites = (response.data as Record<string, unknown>).sites as Record<string, unknown>[];\n setSites((rawSites || []).map(normalizeSite));\n } else {\n setError(response.error || 'Failed to load sites');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load sites');\n } finally {\n setIsLoading(false);\n }\n }, [credentials, isMockMode, config.baseUrl]);\n\n // Auto-load on mount\n useEffect(() => {\n refreshSites();\n }, [refreshSites]);\n\n /**\n * Create a new site. If files provided, publishes immediately.\n */\n const createSite = useCallback(async (params: CreateSiteParams): Promise<PublishedSiteInfo | null> => {\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n return null;\n }\n setError(null);\n\n try {\n const response = await apiCreateSite(credentials!, params, clientConfig);\n if (response.ok && response.data) {\n const data = response.data as Record<string, unknown>;\n const site = data.site as Record<string, unknown> | undefined;\n if (site) {\n const normalized = normalizeSite(site);\n setSites(prev => [normalized, ...prev]);\n return normalized;\n }\n // Staging mode — return partial info\n return {\n id: data.site_id as string,\n name: params.name,\n url: '',\n siteType: params.siteType || 'on_demand',\n fileCount: 0,\n createdAt: new Date().toISOString(),\n };\n }\n setError(response.error || 'Failed to create site');\n return null;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to create site');\n return null;\n }\n }, [credentials, isMockMode, config.baseUrl]);\n\n /**\n * Add a file to a staged site\n */\n const addFile = useCallback(async (siteId: string, path: string, content: string): Promise<boolean> => {\n if (!credentials) {\n setError('Not authenticated');\n return false;\n }\n setError(null);\n\n try {\n const response = await apiAddSiteFile(credentials, siteId, path, content, clientConfig);\n return response.ok;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to add file');\n return false;\n }\n }, [credentials, config.baseUrl]);\n\n /**\n * Publish a staged site to CDN\n */\n const publishSite = useCallback(async (siteId: string): Promise<PublishedSiteInfo | null> => {\n if (!credentials) {\n setError('Not authenticated');\n return null;\n }\n setError(null);\n\n try {\n const response = await apiPublishStagedSite(credentials, siteId, clientConfig);\n if (response.ok && response.data) {\n const site = (response.data as Record<string, unknown>).site as Record<string, unknown>;\n if (site) {\n const normalized = normalizeSite(site);\n await refreshSites();\n return normalized;\n }\n }\n setError(response.error || 'Failed to publish site');\n return null;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to publish site');\n return null;\n }\n }, [credentials, config.baseUrl, refreshSites]);\n\n /**\n * Delete a published site\n */\n const deleteSite = useCallback(async (siteId: string): Promise<boolean> => {\n if (!credentials) {\n setError('Not authenticated');\n return false;\n }\n setError(null);\n\n try {\n const response = await apiDeleteSite(credentials, siteId, clientConfig);\n if (response.ok) {\n setSites(prev => prev.filter(s => s.id !== siteId));\n return true;\n }\n setError(response.error || 'Failed to delete site');\n return false;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to delete site');\n return false;\n }\n }, [credentials, config.baseUrl]);\n\n return {\n sites,\n isLoading,\n error,\n createSite,\n addFile,\n publishSite,\n deleteSite,\n refreshSites,\n };\n}\n","'use client';\n\n/**\n * useAgents Hook\n *\n * Fetches the catalog of available agents from the backend.\n * Use this to discover which agents can be targeted directly via useAgent's targetAgent option.\n *\n * @example\n * ```tsx\n * function AgentPicker() {\n * const { agents, isLoading } = useAgents();\n *\n * return (\n * <select>\n * {agents.map(agent => (\n * <option key={agent.name} value={agent.name}>\n * {agent.description}\n * </option>\n * ))}\n * </select>\n * );\n * }\n * ```\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstackOptional } from '../context/FlowstackProvider';\nimport { listAgents as apiListAgents } from '../api/client';\nimport type { AgentInfo, UseAgentsReturn } from '../types';\n\nexport function useAgents(): UseAgentsReturn {\n const flowstack = useFlowstackOptional();\n\n const [agents, setAgents] = useState<AgentInfo[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const clientConfig = {\n baseUrl: flowstack?.config?.baseUrl,\n tenantId: flowstack?.config?.tenantId,\n };\n\n const refreshAgents = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await apiListAgents(clientConfig);\n if (result.ok && result.data) {\n // Normalize snake_case from backend to camelCase\n const normalized = result.data.agents.map((a: any) => ({\n name: a.name,\n description: a.description || '',\n tools: a.tools || [],\n triggerPhrases: a.trigger_phrases || a.triggerPhrases || [],\n useFor: a.use_for || a.useFor || [],\n isTerminal: a.is_terminal ?? a.isTerminal ?? false,\n }));\n setAgents(normalized);\n } else {\n setError(result.error || 'Failed to fetch agents');\n }\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Failed to fetch agents');\n } finally {\n setIsLoading(false);\n }\n }, [flowstack?.config?.baseUrl]);\n\n useEffect(() => {\n refreshAgents();\n }, [refreshAgents]);\n\n return { agents, isLoading, error, refreshAgents };\n}\n","'use client';\n\n/**\n * useToolInvocation — Direct tool invocation hook.\n *\n * Calls an agent tool directly, bypassing LLM orchestration. Use for tools\n * marked with invocationPattern: \"direct\" in the agent manifest.\n *\n * Returns structured JSON (not streaming). Ideal for:\n * - Form submissions (mongodb_insert)\n * - Data fetching (mongodb_query)\n * - Single-purpose operations (list, describe, aggregate)\n *\n * For complex workflows requiring LLM reasoning, use useAgent instead.\n *\n * @example\n * ```tsx\n * function TransactionForm() {\n * const { invoke, isLoading } = useToolInvocation({\n * agentName: 'finance_agent',\n * toolName: 'mongodb_insert',\n * });\n *\n * const handleSubmit = async (data: FormData) => {\n * const result = await invoke({\n * collection: 'transactions',\n * document: { date: data.date, amount: data.amount },\n * });\n * };\n * }\n * ```\n *\n * @example\n * ```tsx\n * function TransactionTable() {\n * const { invoke, result, isLoading } = useToolInvocation({\n * agentName: 'finance_agent',\n * toolName: 'mongodb_query',\n * });\n *\n * useEffect(() => {\n * invoke({ collection: 'transactions', sort: { date: -1 }, limit: 50 });\n * }, []);\n *\n * return isLoading ? <Spinner /> : (\n * <table>{result?.map(row => <tr key={row._id}>...</tr>)}</table>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback, useRef } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport { invokeTool } from '../api/client';\n\nexport interface UseToolInvocationOptions {\n /** Target agent name (e.g. \"finance_agent\") */\n agentName: string;\n /** Tool to invoke (e.g. \"mongodb_query\") */\n toolName: string;\n}\n\nexport interface UseToolInvocationReturn<T = any> {\n /** Call the tool with keyword arguments */\n invoke: (kwargs?: Record<string, any>) => Promise<T | null>;\n /** Last successful result */\n result: T | null;\n /** True while the tool call is in flight */\n isLoading: boolean;\n /** Error message from the last failed call */\n error: string | null;\n /** Reset result and error state */\n reset: () => void;\n}\n\nexport function useToolInvocation<T = any>(\n options: UseToolInvocationOptions\n): UseToolInvocationReturn<T> {\n const { agentName, toolName } = options;\n const { credentials, config } = useFlowstack();\n\n const [result, setResult] = useState<T | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Prevent concurrent calls to the same tool\n const inflightRef = useRef(false);\n\n const invoke = useCallback(\n async (kwargs: Record<string, any> = {}): Promise<T | null> => {\n if (!credentials) {\n const msg = 'Not authenticated — cannot invoke tool';\n setError(msg);\n console.error(`[useToolInvocation] ${msg}`);\n return null;\n }\n\n if (inflightRef.current) {\n console.warn(`[useToolInvocation] ${agentName}.${toolName} already in flight — skipping`);\n return null;\n }\n\n inflightRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await invokeTool<T>(\n credentials,\n agentName,\n toolName,\n kwargs,\n config,\n );\n\n if (!response.ok) {\n const errMsg = response.error || `Tool invocation failed (${response.status})`;\n setError(errMsg);\n console.error(`[useToolInvocation] ${agentName}.${toolName} failed:`, errMsg);\n return null;\n }\n\n const toolResult = response.data?.result ?? (response.data as any);\n setResult(toolResult);\n return toolResult;\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : 'Tool invocation failed';\n setError(errMsg);\n console.error(`[useToolInvocation] ${agentName}.${toolName} error:`, err);\n return null;\n } finally {\n inflightRef.current = false;\n setIsLoading(false);\n }\n },\n [credentials, config, agentName, toolName]\n );\n\n const reset = useCallback(() => {\n setResult(null);\n setError(null);\n }, []);\n\n return { invoke, result, isLoading, error, reset };\n}\n","/**\n * useConnections — Manage external service connections (Google, Reddit, Strava, Twitter, GitHub).\n *\n * Provides status, connect, and disconnect for all supported OAuth integrations.\n * Built apps should include a Settings page that renders connection cards\n * so users can link their accounts to enable agent capabilities.\n *\n * Usage:\n * const { connections, connect, disconnect, refresh, isLoading } = useConnections();\n *\n * // Check if Google Analytics is connected\n * connections.google?.analytics // true | false\n *\n * // Connect Google services\n * connect('google', ['analytics', 'drive']);\n *\n * // Disconnect Reddit\n * disconnect('reddit');\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport { flowstackFetch } from '../api/client';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface GoogleConnectionStatus {\n connected: boolean;\n email?: string;\n analytics?: boolean;\n ads?: boolean;\n drive?: boolean;\n youtube?: boolean;\n scopes?: string[];\n}\n\nexport interface ServiceConnectionStatus {\n connected: boolean;\n username?: string;\n}\n\nexport interface GitHubConnectionStatus {\n connected: boolean;\n username?: string;\n avatarUrl?: string;\n}\n\nexport interface ConnectionsState {\n google: GoogleConnectionStatus;\n reddit: ServiceConnectionStatus;\n strava: ServiceConnectionStatus;\n twitter: ServiceConnectionStatus;\n github: GitHubConnectionStatus;\n}\n\nexport type GoogleService = 'analytics' | 'ads' | 'drive' | 'youtube' | 'all';\nexport type ServiceProvider = 'google' | 'reddit' | 'strava' | 'twitter' | 'github';\n\nexport interface UseConnectionsReturn {\n /** Current connection status for all services */\n connections: ConnectionsState;\n /** Loading state */\n isLoading: boolean;\n /** Error message */\n error: string | null;\n /** Connect a service — opens OAuth popup/redirect */\n connect: (provider: ServiceProvider, services?: GoogleService[]) => Promise<void>;\n /** Disconnect a service */\n disconnect: (provider: ServiceProvider) => Promise<void>;\n /** Refresh connection status */\n refresh: () => Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// Default state\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_STATE: ConnectionsState = {\n google: { connected: false },\n reddit: { connected: false },\n strava: { connected: false },\n twitter: { connected: false },\n github: { connected: false },\n};\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useConnections(): UseConnectionsReturn {\n const { credentials, config } = useFlowstack();\n const [connections, setConnections] = useState<ConnectionsState>(DEFAULT_STATE);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const clientConfig = { baseUrl: config.baseUrl, tenantId: config.tenantId };\n\n // Fetch status for all services\n const refresh = useCallback(async () => {\n if (!credentials) return;\n setIsLoading(true);\n setError(null);\n\n try {\n const [googleRes, redditRes, stravaRes, twitterRes, githubRes] = await Promise.allSettled([\n flowstackFetch<any>('/auth/google/status', { credentials }, clientConfig),\n flowstackFetch<any>('/auth/reddit/status', { credentials }, clientConfig),\n flowstackFetch<any>('/auth/strava/status', { credentials }, clientConfig),\n flowstackFetch<any>('/auth/twitter/status', { credentials }, clientConfig),\n flowstackFetch<any>('/auth/github/status', { credentials }, clientConfig),\n ]);\n\n const resolveStatus = (res: PromiseSettledResult<any>) =>\n res.status === 'fulfilled' && res.value.ok ? res.value.data : { connected: false };\n\n setConnections({\n google: resolveStatus(googleRes),\n reddit: resolveStatus(redditRes),\n strava: resolveStatus(stravaRes),\n twitter: resolveStatus(twitterRes),\n github: resolveStatus(githubRes),\n });\n } catch (err: any) {\n setError(err.message || 'Failed to fetch connection status');\n } finally {\n setIsLoading(false);\n }\n }, [credentials, config.baseUrl, config.tenantId]);\n\n // Fetch on mount\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n // Connect a service — opens OAuth in a popup or redirects\n const connect = useCallback(async (provider: ServiceProvider, services?: GoogleService[]) => {\n if (!credentials) throw new Error('Not authenticated');\n setError(null);\n\n try {\n let startUrl: string;\n\n if (provider === 'google') {\n const scopes = services?.join(',') || 'all';\n // Strip any leftover google_oauth query params from the URL before using as\n // redirect_uri — a previous failed attempt leaves ?google_oauth=error&... in\n // the URL, which then gets encoded into the next attempt's state, causing the\n // success redirect to append ?google_oauth=success on top of the error params.\n const cleanUrl = (() => {\n const u = new URL(window.location.href);\n ['google_oauth', 'email', 'message'].forEach(p => u.searchParams.delete(p));\n return u.toString();\n })();\n const returnUrl = encodeURIComponent(cleanUrl);\n const res = await flowstackFetch<{ auth_url: string }>(\n `/auth/google/start?scopes=${scopes}&redirect_uri=${returnUrl}`,\n { credentials },\n clientConfig,\n );\n if (!res.ok || !res.data?.auth_url) throw new Error('Failed to start Google OAuth');\n startUrl = res.data.auth_url;\n } else {\n const cleanUrl = (() => {\n const u = new URL(window.location.href);\n ['google_oauth', 'email', 'message'].forEach(p => u.searchParams.delete(p));\n return u.toString();\n })();\n const returnUrl = encodeURIComponent(cleanUrl);\n const res = await flowstackFetch<{ auth_url: string }>(\n `/auth/${provider}/start?redirect_uri=${returnUrl}`,\n { credentials },\n clientConfig,\n );\n if (!res.ok || !res.data?.auth_url) throw new Error(`Failed to start ${provider} OAuth`);\n startUrl = res.data.auth_url;\n }\n\n // Open OAuth in popup.\n // The backend callback returns an HTML page that postMessages the result back here\n // and calls window.close() — no redirect into the popup that would load the full app.\n const popup = window.open(startUrl, `${provider}_oauth`, 'width=600,height=700,scrollbars=yes');\n if (popup) {\n // Listen for the postMessage from the callback page\n const onMessage = (event: MessageEvent) => {\n if (\n event.data?.type === 'flowstack-google-oauth' ||\n event.data?.type === `flowstack-${provider}-oauth`\n ) {\n window.removeEventListener('message', onMessage);\n clearInterval(fallbackTimer);\n refresh();\n }\n };\n window.addEventListener('message', onMessage);\n\n // Fallback: if popup closes without postMessage (user closed it manually)\n const fallbackTimer = setInterval(() => {\n if (popup.closed) {\n clearInterval(fallbackTimer);\n window.removeEventListener('message', onMessage);\n refresh();\n }\n }, 500);\n } else {\n // Popup blocked — fall back to full-page redirect\n window.location.href = startUrl;\n }\n } catch (err: any) {\n setError(err.message || `Failed to connect ${provider}`);\n }\n }, [credentials, config.baseUrl, config.tenantId, refresh]);\n\n // Disconnect a service\n const disconnect = useCallback(async (provider: ServiceProvider) => {\n if (!credentials) throw new Error('Not authenticated');\n setError(null);\n\n try {\n if (provider === 'google') {\n await flowstackFetch('/auth/google/revoke', { method: 'POST', credentials }, clientConfig);\n } else {\n await flowstackFetch(`/auth/${provider}/disconnect`, { method: 'POST', credentials }, clientConfig);\n }\n await refresh();\n } catch (err: any) {\n setError(err.message || `Failed to disconnect ${provider}`);\n }\n }, [credentials, config.baseUrl, config.tenantId, refresh]);\n\n return { connections, isLoading, error, connect, disconnect, refresh };\n}\n","/**\n * useThreads — list a built-app user's private message threads (P0-138).\n *\n * Backed by the server-owned, ACL'd DM store: the backend only ever returns\n * threads the authenticated caller participates in. Each thread carries the\n * counterpart's user key, the last message, and an unread count.\n *\n * Private messaging is a built-app capability — requires an `appScope` on the\n * FlowstackProvider config. In a Casino personal session the backend returns 403\n * and this hook surfaces an error.\n *\n * Usage:\n * const { threads, isLoading, refresh } = useThreads({ refreshInterval: 5000 });\n * threads.map(t => <ThreadRow key={t.pair_key} counterpart={t.with_user_key} ... />)\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport { listThreads, openThread as openThreadApi } from '../api/client';\nimport type { DmThread } from '../api/client';\n\nexport interface UseThreadsOptions {\n /** Auto-poll interval in ms (optional — no polling by default). */\n refreshInterval?: number;\n /** Skip initial fetch. */\n enabled?: boolean;\n}\n\nexport interface UseThreadsReturn {\n threads: DmThread[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n /**\n * Record the caller's consent to open a thread with `withUserKey`. The thread\n * becomes sendable only once BOTH parties have consented. Idempotent per caller;\n * refetches the thread list on success. Returns the resulting status.\n */\n openThread: (withUserKey: string) => Promise<'pending' | 'open' | null>;\n}\n\nexport function useThreads(options?: UseThreadsOptions): UseThreadsReturn {\n const { credentials, config } = useFlowstack();\n const [threads, setThreads] = useState<DmThread[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const enabled = options?.enabled !== false;\n const clientConfig = {\n baseUrl: config.baseUrl,\n tenantId: config.tenantId,\n appScope: config.appScope,\n };\n\n const refresh = useCallback(async () => {\n if (!credentials || !enabled) return;\n setIsLoading(true);\n setError(null);\n try {\n const res = await listThreads(credentials, clientConfig);\n if (res.ok && res.data) {\n setThreads(res.data.threads);\n } else {\n setError(res.error || 'Failed to load threads');\n }\n } catch (err: any) {\n setError(err?.message || 'Failed to load threads');\n } finally {\n setIsLoading(false);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [credentials, config.baseUrl, config.tenantId, config.appScope, enabled]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n // Optional polling\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n useEffect(() => {\n if (!options?.refreshInterval || !enabled) return;\n intervalRef.current = setInterval(refresh, options.refreshInterval);\n return () => {\n if (intervalRef.current) clearInterval(intervalRef.current);\n };\n }, [options?.refreshInterval, enabled, refresh]);\n\n const openThread = useCallback(\n async (withUserKey: string): Promise<'pending' | 'open' | null> => {\n if (!credentials || !withUserKey) return null;\n const res = await openThreadApi(credentials, withUserKey, clientConfig);\n if (res.ok && res.data) {\n await refresh();\n return res.data.status as 'pending' | 'open';\n }\n setError(res.error || 'Failed to open thread');\n return null;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [credentials, config.baseUrl, config.tenantId, config.appScope, refresh],\n );\n\n return { threads, isLoading, error, refresh, openThread };\n}\n","/**\n * useMessages — read + send private messages in one thread (P0-138).\n *\n * Mirrors `useCollection`'s ergonomics but is backed by the server-owned, ACL'd\n * DM endpoints instead of a Mongo collection. The backend pins the sender to the\n * caller's identity and only delivers into a mutually-consented (open) thread, so\n * a `send()` to a not-yet-open thread returns an error.\n *\n * SECURITY: message bodies are UNTRUSTED user input. Render them as plain text or\n * sanitized markdown — never as raw HTML (no dangerouslySetInnerHTML). If a body\n * is ever fed to an agent, treat it as data, not instructions.\n *\n * Usage:\n * const { messages, send, isLoading, refresh } = useMessages(counterpartUserKey, {\n * refreshInterval: 4000,\n * });\n * await send('hey there');\n * messages.map(m => <Bubble key={m.message_id} mine={m.from === myKey}>{m.body}</Bubble>)\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport { listMessages, sendMessage } from '../api/client';\nimport type { DmMessage } from '../api/client';\n\nexport interface UseMessagesOptions {\n /** Max messages to load (default 50, max 200). */\n limit?: number;\n /** Auto-poll interval in ms (optional — no polling by default). */\n refreshInterval?: number;\n /** Skip initial fetch (e.g. before a counterpart is selected). */\n enabled?: boolean;\n}\n\nexport interface UseMessagesReturn {\n messages: DmMessage[];\n isLoading: boolean;\n error: string | null;\n /** Send a message to the counterpart. Refetches on success. */\n send: (body: string) => Promise<void>;\n refresh: () => Promise<void>;\n}\n\nexport function useMessages(\n withUserKey: string | null | undefined,\n options?: UseMessagesOptions,\n): UseMessagesReturn {\n const { credentials, config } = useFlowstack();\n const [messages, setMessages] = useState<DmMessage[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const enabled = options?.enabled !== false && !!withUserKey;\n const clientConfig = {\n baseUrl: config.baseUrl,\n tenantId: config.tenantId,\n appScope: config.appScope,\n };\n\n const refresh = useCallback(async () => {\n if (!credentials || !withUserKey || !enabled) return;\n setIsLoading(true);\n setError(null);\n try {\n const res = await listMessages(\n credentials,\n withUserKey,\n { limit: options?.limit },\n clientConfig,\n );\n if (res.ok && res.data) {\n setMessages(res.data.messages);\n } else {\n setError(res.error || 'Failed to load messages');\n }\n } catch (err: any) {\n setError(err?.message || 'Failed to load messages');\n } finally {\n setIsLoading(false);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [credentials, withUserKey, config.baseUrl, config.tenantId, config.appScope, enabled, options?.limit]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n // Optional polling\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n useEffect(() => {\n if (!options?.refreshInterval || !enabled) return;\n intervalRef.current = setInterval(refresh, options.refreshInterval);\n return () => {\n if (intervalRef.current) clearInterval(intervalRef.current);\n };\n }, [options?.refreshInterval, enabled, refresh]);\n\n const send = useCallback(\n async (body: string) => {\n if (!credentials) throw new Error('Not authenticated');\n if (!withUserKey) throw new Error('No counterpart selected');\n if (!body || !body.trim()) return;\n setError(null);\n const res = await sendMessage(credentials, withUserKey, body, clientConfig);\n if (!res.ok) {\n const msg = res.error || 'Failed to send message';\n setError(msg);\n throw new Error(msg);\n }\n await refresh();\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [credentials, withUserKey, config.baseUrl, config.tenantId, config.appScope, refresh],\n );\n\n return { messages, isLoading, error, send, refresh };\n}\n","'use client';\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport type { SiteVersion, SiteVersionManifest, UseSiteVersionsReturn } from '../types';\nimport {\n getSiteVersions as apiGetVersions,\n promoteSiteVersion as apiPromote,\n deleteSiteVersion as apiDeleteVersion,\n} from '../api/client';\n\nfunction normalizeVersion(raw: Record<string, unknown>): SiteVersion {\n return {\n version: (raw.version || 0) as number,\n type: (raw.type || 'build') as SiteVersion['type'],\n createdAt: (raw.created_at || raw.createdAt || '') as string,\n description: (raw.description) as string | undefined,\n fileCount: (raw.file_count || raw.fileCount || 0) as number,\n totalBytes: (raw.total_bytes || raw.totalBytes || 0) as number,\n url: (raw.url || '') as string,\n };\n}\n\nfunction normalizeManifest(raw: Record<string, unknown>): SiteVersionManifest {\n const versions = raw.versions as Record<string, unknown>[] | undefined;\n return {\n siteId: (raw.site_id || raw.siteId || '') as string,\n name: (raw.name || '') as string,\n liveVersion: (raw.live_version || raw.liveVersion || 1) as number,\n versions: (versions || []).map(normalizeVersion),\n alias: (raw.alias ?? null) as string | null,\n githubRepo: (raw.github_repo || raw.githubRepo || null) as SiteVersionManifest['githubRepo'],\n };\n}\n\nexport function useSiteVersions(siteId: string | null): UseSiteVersionsReturn {\n const { credentials, config } = useFlowstack();\n\n const [versions, setVersions] = useState<SiteVersion[]>([]);\n const [liveVersion, setLiveVersion] = useState<number | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const clientConfig = {\n baseUrl: config.baseUrl,\n tenantId: config.tenantId,\n };\n\n const refresh = useCallback(async () => {\n if (!siteId || !credentials) return;\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await apiGetVersions(credentials, siteId, clientConfig);\n if (response.ok && response.data) {\n const manifest = normalizeManifest(response.data as unknown as Record<string, unknown>);\n setVersions(manifest.versions);\n setLiveVersion(manifest.liveVersion);\n } else {\n setError(response.error || 'Failed to load versions');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load versions');\n } finally {\n setIsLoading(false);\n }\n }, [siteId, credentials, config.baseUrl]);\n\n useEffect(() => {\n if (siteId) {\n refresh();\n } else {\n setVersions([]);\n setLiveVersion(null);\n setError(null);\n }\n }, [siteId, refresh]);\n\n const promote = useCallback(async (version: number): Promise<boolean> => {\n if (!siteId || !credentials) return false;\n setError(null);\n\n try {\n const response = await apiPromote(credentials, siteId, version, clientConfig);\n if (response.ok && response.data) {\n const manifest = normalizeManifest(response.data as unknown as Record<string, unknown>);\n setVersions(manifest.versions);\n setLiveVersion(manifest.liveVersion);\n return true;\n }\n setError(response.error || 'Failed to promote version');\n return false;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to promote version');\n return false;\n }\n }, [siteId, credentials, config.baseUrl]);\n\n const deleteVersion = useCallback(async (version: number): Promise<boolean> => {\n if (!siteId || !credentials) return false;\n setError(null);\n\n try {\n const response = await apiDeleteVersion(credentials, siteId, version, clientConfig);\n if (response.ok && response.data) {\n const manifest = normalizeManifest(response.data as unknown as Record<string, unknown>);\n setVersions(manifest.versions);\n setLiveVersion(manifest.liveVersion);\n return true;\n }\n setError(response.error || 'Failed to delete version');\n return false;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to delete version');\n return false;\n }\n }, [siteId, credentials, config.baseUrl]);\n\n return {\n versions,\n liveVersion,\n isLoading,\n error,\n promote,\n deleteVersion,\n refresh,\n };\n}\n","/**\n * useProviderCredentials — Manage LLM provider credentials (BYOK + Ollama).\n *\n * Wraps the /api/v1/user/provider-credentials backend endpoints.\n * Used by the Casino \"Models\" settings tab to list, create, and delete\n * provider credentials including Ollama local inference.\n *\n * Usage:\n * const { credentials, purposes, createCredential, deleteCredential, isLoading } = useProviderCredentials();\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport { flowstackFetch } from '../api/client';\nimport type { ProviderCredential, PurposeInfo, LLMProvider, ProviderModelSettings } from '../types';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface CreateCredentialParams {\n provider: LLMProvider;\n api_key?: string;\n host?: string;\n model_id?: string;\n purpose?: string;\n is_default?: boolean;\n model_settings?: ProviderModelSettings;\n}\n\nexport interface UseProviderCredentialsReturn {\n credentials: ProviderCredential[];\n purposes: PurposeInfo[];\n createCredential: (params: CreateCredentialParams) => Promise<ProviderCredential>;\n deleteCredential: (credentialId: string) => Promise<void>;\n refresh: () => Promise<void>;\n isLoading: boolean;\n error: string | null;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nconst CRED_PATH = '/api/v1/user/provider-credentials';\n\nexport function useProviderCredentials(): UseProviderCredentialsReturn {\n const { credentials: authCredentials, config } = useFlowstack();\n const [credentials, setCredentials] = useState<ProviderCredential[]>([]);\n const [purposes, setPurposes] = useState<PurposeInfo[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const clientConfig = { baseUrl: config.baseUrl, tenantId: config.tenantId };\n\n const fetchCredentials = useCallback(async () => {\n if (!authCredentials) return;\n try {\n const res = await flowstackFetch<ProviderCredential[]>(\n CRED_PATH,\n { credentials: authCredentials },\n clientConfig,\n );\n if (res.ok && res.data) {\n setCredentials(Array.isArray(res.data) ? res.data : []);\n }\n } catch (err: any) {\n setError(err.message);\n }\n }, [authCredentials, clientConfig.baseUrl]);\n\n const fetchPurposes = useCallback(async () => {\n if (!authCredentials) return;\n try {\n const res = await flowstackFetch<PurposeInfo[]>(\n `${CRED_PATH}/purposes`,\n { credentials: authCredentials },\n clientConfig,\n );\n if (res.ok && res.data) {\n setPurposes(Array.isArray(res.data) ? res.data : []);\n }\n } catch {\n // Non-critical\n }\n }, [authCredentials, clientConfig.baseUrl]);\n\n const refresh = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n await Promise.all([fetchCredentials(), fetchPurposes()]);\n setIsLoading(false);\n }, [fetchCredentials, fetchPurposes]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n const createCredential = useCallback(async (params: CreateCredentialParams): Promise<ProviderCredential> => {\n if (!authCredentials) throw new Error('Not authenticated');\n const res = await flowstackFetch<ProviderCredential>(\n CRED_PATH,\n {\n method: 'POST',\n credentials: authCredentials,\n body: params,\n },\n clientConfig,\n );\n if (!res.ok) {\n throw new Error(res.error || `Failed to create credential: ${res.status}`);\n }\n await fetchCredentials();\n return res.data!;\n }, [authCredentials, clientConfig.baseUrl, fetchCredentials]);\n\n const deleteCredential = useCallback(async (credentialId: string): Promise<void> => {\n if (!authCredentials) throw new Error('Not authenticated');\n const res = await flowstackFetch(\n `${CRED_PATH}/${credentialId}`,\n {\n method: 'DELETE',\n credentials: authCredentials,\n },\n clientConfig,\n );\n if (!res.ok) {\n throw new Error(res.error || `Failed to delete credential: ${res.status}`);\n }\n await fetchCredentials();\n }, [authCredentials, clientConfig.baseUrl, fetchCredentials]);\n\n return {\n credentials,\n purposes,\n createCredential,\n deleteCredential,\n refresh,\n isLoading,\n error,\n };\n}\n","/**\n * useOllamaDetection — Detect a local Ollama instance and list available models.\n *\n * Probes the Ollama API at the given host (default: http://localhost:11434)\n * via GET /api/tags. If Ollama is running and CORS is enabled, returns the\n * list of locally available models.\n *\n * Note: Users must set OLLAMA_ORIGINS=* (or include the Casino origin) when\n * starting Ollama for browser-side detection to work.\n *\n * Usage:\n * const { available, models, error, detect } = useOllamaDetection();\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport type { OllamaStatus, OllamaLocalModel } from '../types';\n\nconst DEFAULT_HOST = 'http://localhost:11434';\nconst DETECTION_TIMEOUT_MS = 3000;\n\nexport interface UseOllamaDetectionReturn {\n available: boolean;\n models: OllamaLocalModel[];\n host: string;\n error: string | null;\n isDetecting: boolean;\n detect: (host?: string) => Promise<OllamaStatus>;\n}\n\nexport function useOllamaDetection(initialHost = DEFAULT_HOST): UseOllamaDetectionReturn {\n const [available, setAvailable] = useState(false);\n const [models, setModels] = useState<OllamaLocalModel[]>([]);\n const [host, setHost] = useState(initialHost);\n const [error, setError] = useState<string | null>(null);\n const [isDetecting, setIsDetecting] = useState(false);\n\n const detect = useCallback(async (targetHost?: string): Promise<OllamaStatus> => {\n const h = targetHost || host;\n setIsDetecting(true);\n setError(null);\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), DETECTION_TIMEOUT_MS);\n\n const res = await fetch(`${h}/api/tags`, {\n signal: controller.signal,\n });\n clearTimeout(timeout);\n\n if (!res.ok) {\n throw new Error(`Ollama returned ${res.status}`);\n }\n\n const data = await res.json();\n const ollamaModels: OllamaLocalModel[] = (data.models || []).map((m: any) => ({\n name: m.name,\n size: m.size || 0,\n modified_at: m.modified_at || '',\n digest: m.digest,\n }));\n\n setAvailable(true);\n setModels(ollamaModels);\n if (targetHost) setHost(targetHost);\n\n return { available: true, host: h, models: ollamaModels };\n } catch (err: any) {\n const msg = err.name === 'AbortError'\n ? 'Connection timed out'\n : err.message?.includes('Failed to fetch') || err.message?.includes('NetworkError')\n ? 'Ollama not reachable. Ensure it is running and OLLAMA_ORIGINS=* is set.'\n : err.message;\n\n setAvailable(false);\n setModels([]);\n setError(msg);\n return { available: false, host: h, models: [], error: msg };\n } finally {\n setIsDetecting(false);\n }\n }, [host]);\n\n // Auto-detect on mount\n useEffect(() => {\n detect();\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return { available, models, host, error, isDetecting, detect };\n}\n","/**\n * useDataOverview — Unified summary of all user-owned data.\n *\n * Fetches workspace artifact counts, site metadata, and MongoDB collection stats.\n * Used by the Casino \"My Data\" view for the top-level summary cards.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport { getUserDataOverview } from '../api/client';\nimport type { UserDataOverview } from '../types';\n\nexport interface UseDataOverviewReturn {\n overview: UserDataOverview | null;\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useDataOverview(): UseDataOverviewReturn {\n const { credentials, config } = useFlowstack();\n const [overview, setOverview] = useState<UserDataOverview | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const clientConfig = { baseUrl: config.baseUrl, tenantId: config.tenantId };\n\n const refresh = useCallback(async () => {\n // Don't leave the skeleton stuck on \"LOADING…\" if credentials aren't ready\n // yet — clear the loading flag and let the effect re-run once they hydrate\n // (deps include credentials). This is the first-mount stuck-load race.\n if (!credentials) { setIsLoading(false); return; }\n setIsLoading(true);\n setError(null);\n try {\n const res = await getUserDataOverview(credentials, clientConfig);\n if (res.ok && res.data) {\n setOverview(res.data);\n } else {\n setError(res.error || 'Failed to load data overview');\n }\n } catch (err: any) {\n setError(err.message);\n } finally {\n setIsLoading(false);\n }\n }, [credentials, clientConfig.baseUrl]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n return { overview, isLoading, error, refresh };\n}\n","/**\n * useUserCollections — List all MongoDB collections the user owns.\n *\n * Returns collections across all sites, grouped by site ID.\n * Supports optional site_id filtering and schema inclusion.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport { getUserCollections, deleteUserCollection } from '../api/client';\nimport type { UserCollectionInfo } from '../types';\n\nexport interface UseUserCollectionsOptions {\n siteId?: string;\n includeSchema?: boolean;\n}\n\nexport interface UseUserCollectionsReturn {\n collections: UserCollectionInfo[];\n groupedBySite: Record<string, UserCollectionInfo[]>;\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n deleteCollection: (fullName: string) => Promise<boolean>;\n}\n\nexport function useUserCollections(options?: UseUserCollectionsOptions): UseUserCollectionsReturn {\n const { credentials, config } = useFlowstack();\n const [collections, setCollections] = useState<UserCollectionInfo[]>([]);\n const [groupedBySite, setGroupedBySite] = useState<Record<string, UserCollectionInfo[]>>({});\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const clientConfig = { baseUrl: config.baseUrl, tenantId: config.tenantId };\n\n const refresh = useCallback(async () => {\n if (!credentials) return;\n setIsLoading(true);\n setError(null);\n try {\n const res = await getUserCollections(\n credentials,\n { siteId: options?.siteId, includeSchema: options?.includeSchema },\n clientConfig,\n );\n if (res.ok && res.data) {\n setCollections(res.data.collections || []);\n setGroupedBySite(res.data.grouped_by_site || {});\n } else {\n setError(res.error || 'Failed to load collections');\n }\n } catch (err: any) {\n setError(err.message);\n } finally {\n setIsLoading(false);\n }\n }, [credentials, options?.siteId, options?.includeSchema, clientConfig.baseUrl]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n const handleDelete = useCallback(async (fullName: string): Promise<boolean> => {\n if (!credentials) return false;\n try {\n const res = await deleteUserCollection(credentials, fullName, clientConfig);\n if (res.ok) {\n await refresh();\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }, [credentials, clientConfig.baseUrl, refresh]);\n\n return {\n collections,\n groupedBySite,\n isLoading,\n error,\n refresh,\n deleteCollection: handleDelete,\n };\n}\n","/**\n * useCollectionExplorer — Browse, query, export, and delete a specific MongoDB collection.\n *\n * Provides paginated document browsing, schema inference, CSV/JSON export,\n * and collection deletion for the Casino data explorer.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport {\n getUserCollectionDocuments,\n getUserCollectionSchema,\n deleteUserCollection,\n exportUserCollection,\n} from '../api/client';\nimport type { CollectionSchemaInfo } from '../types';\n\nexport interface UseCollectionExplorerOptions {\n filter?: Record<string, any>;\n limit?: number;\n skip?: number;\n sort?: Record<string, 1 | -1>;\n database?: string;\n}\n\nexport interface UseCollectionExplorerReturn<T> {\n documents: T[];\n total: number;\n schema: CollectionSchemaInfo | null;\n isLoading: boolean;\n error: string | null;\n page: number;\n pageSize: number;\n setPage: (page: number) => void;\n refresh: () => Promise<void>;\n exportAs: (format: 'json' | 'csv') => Promise<void>;\n deleteCollection: () => Promise<boolean>;\n}\n\nexport function useCollectionExplorer<T = Record<string, any>>(\n collection: string,\n options?: UseCollectionExplorerOptions,\n): UseCollectionExplorerReturn<T> {\n const { credentials, config } = useFlowstack();\n const [documents, setDocuments] = useState<T[]>([]);\n const [total, setTotal] = useState(0);\n const [schema, setSchema] = useState<CollectionSchemaInfo | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [page, setPage] = useState(0);\n const pageSize = options?.limit || 50;\n\n const clientConfig = { baseUrl: config.baseUrl, tenantId: config.tenantId };\n\n const fetchDocuments = useCallback(async () => {\n if (!credentials || !collection) return;\n setIsLoading(true);\n setError(null);\n try {\n const res = await getUserCollectionDocuments<T>(\n credentials,\n collection,\n {\n filter: options?.filter,\n limit: pageSize,\n skip: page * pageSize,\n sort: options?.sort,\n database: options?.database,\n },\n clientConfig,\n );\n if (res.ok && res.data) {\n setDocuments(res.data.documents || []);\n setTotal(res.data.total || 0);\n } else {\n setError(res.error || 'Failed to load documents');\n }\n } catch (err: any) {\n setError(err.message);\n } finally {\n setIsLoading(false);\n }\n }, [credentials, collection, page, pageSize, options?.filter, options?.sort, options?.database, clientConfig.baseUrl]);\n\n const fetchSchema = useCallback(async () => {\n if (!credentials || !collection) return;\n try {\n const res = await getUserCollectionSchema(\n credentials, collection,\n { database: options?.database },\n clientConfig,\n );\n if (res.ok && res.data) {\n setSchema(res.data);\n }\n } catch {\n // Schema is non-critical\n }\n }, [credentials, collection, options?.database, clientConfig.baseUrl]);\n\n useEffect(() => {\n fetchDocuments();\n }, [fetchDocuments]);\n\n useEffect(() => {\n fetchSchema();\n }, [fetchSchema]);\n\n const refresh = useCallback(async () => {\n await Promise.all([fetchDocuments(), fetchSchema()]);\n }, [fetchDocuments, fetchSchema]);\n\n const exportAs = useCallback(async (format: 'json' | 'csv') => {\n if (!credentials) return;\n try {\n const res = await exportUserCollection(\n credentials, collection,\n { format, filter: options?.filter, database: options?.database },\n clientConfig,\n );\n if (res.ok && res.data) {\n // Trigger browser download\n const blob = res.data instanceof Blob ? res.data : new Blob([JSON.stringify(res.data)]);\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${collection}.${format}`;\n a.click();\n URL.revokeObjectURL(url);\n }\n } catch (err: any) {\n setError(`Export failed: ${err.message}`);\n }\n }, [credentials, collection, options?.filter, options?.database, clientConfig.baseUrl]);\n\n const handleDelete = useCallback(async (): Promise<boolean> => {\n if (!credentials) return false;\n try {\n const res = await deleteUserCollection(credentials, collection, clientConfig);\n return res.ok === true;\n } catch {\n return false;\n }\n }, [credentials, collection, clientConfig.baseUrl]);\n\n return {\n documents,\n total,\n schema,\n isLoading,\n error,\n page,\n pageSize,\n setPage,\n refresh,\n exportAs,\n deleteCollection: handleDelete,\n };\n}\n","/**\n * usePublicCollection — anonymous public submissions for built apps.\n *\n * Provides read and insert access to a public collection that requires\n * NO user authentication. Any visitor can read and write documents.\n * The collection must be declared in the app's publicCollections config.\n *\n * Designed for: leaderboards, guestbooks, comment threads, voting, polls.\n *\n * Usage:\n * const { documents, isLoading, insert } = usePublicCollection<HighScore>('high_scores', {\n * sort: { score: -1 },\n * limit: 25,\n * filter: { album: 'yeezus' },\n * });\n *\n * await insert({ album: 'yeezus', name: 'KEON', score: 12500 });\n *\n * No credentials required — the hook reads appScope from FlowstackProvider config.\n * Rate limiting and spam protection are enforced server-side.\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { useFlowstackOptional } from '../context/FlowstackProvider';\n\nconst MISSING_TENANT =\n 'usePublicCollection requires a tenantId. Set `tenantId` on FlowstackProvider — ' +\n 'anonymous public collections have no token for the backend to derive it from.';\n\nexport interface UsePublicCollectionOptions {\n /** MongoDB query filter (e.g. { album: 'yeezus' }) */\n filter?: Record<string, any>;\n /** Max documents to return (default 25, max 200) */\n limit?: number;\n /** Skip N documents for pagination */\n skip?: number;\n /** Sort spec (e.g. { score: -1 } for highest first) */\n sort?: Record<string, 1 | -1>;\n /** Auto-refresh interval in ms (optional) */\n refreshInterval?: number;\n /** Skip initial fetch (useful for conditional rendering) */\n enabled?: boolean;\n}\n\nexport interface UsePublicCollectionReturn<T> {\n /** Array of documents (submitter_ip_hash stripped server-side) */\n documents: T[];\n /** Count of documents returned (≤ limit) */\n count: number;\n /** Total documents in collection matching the filter */\n total: number;\n /** Loading state */\n isLoading: boolean;\n /** Error message if query failed */\n error: string | null;\n /** Insert a single document — no auth required */\n insert: (doc: Partial<T>) => Promise<{ inserted_id: string }>;\n /** Manual refresh */\n refresh: () => Promise<void>;\n}\n\nexport function usePublicCollection<T = Record<string, any>>(\n collection: string,\n options?: UsePublicCollectionOptions,\n): UsePublicCollectionReturn<T> {\n const flowstack = useFlowstackOptional();\n\n const [documents, setDocuments] = useState<T[]>([]);\n const [count, setCount] = useState(0);\n const [total, setTotal] = useState(0);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const mountedRef = useRef(true);\n useEffect(() => {\n mountedRef.current = true;\n return () => { mountedRef.current = false; };\n }, []);\n\n const baseUrl = flowstack?.config?.baseUrl ?? 'https://sage-api.flowstack.fun';\n const appScope = flowstack?.config?.appScope ?? '';\n // Tenant is required for anonymous access (no token for the backend to derive it\n // from). Prefer a logged-in user's JWT tenant, then an explicitly configured\n // tenantId. There is no platform default — an unset tenant is a hard error below.\n const tenantId = flowstack?.credentials?.tenantId || flowstack?.config?.tenantId || '';\n const enabled = options?.enabled !== false;\n\n const fetchData = useCallback(async () => {\n if (!appScope || !enabled) return;\n if (!tenantId) {\n setError(MISSING_TENANT);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const params = new URLSearchParams();\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.skip !== undefined) params.set('skip', String(options.skip));\n if (options?.sort) {\n const [field, dir] = Object.entries(options.sort)[0] ?? [];\n if (field) {\n params.set('sort_field', field);\n params.set('sort_dir', String(dir ?? -1));\n }\n }\n if (options?.filter) {\n params.set('filter_json', JSON.stringify(options.filter));\n }\n\n const url = `${baseUrl}/public/collections/${encodeURIComponent(collection)}/documents?${params.toString()}`;\n const resp = await fetch(url, {\n headers: {\n 'X-App-Scope': appScope,\n 'X-Tenant-ID': tenantId,\n },\n });\n\n if (!mountedRef.current) return;\n\n if (!resp.ok) {\n const body = await resp.json().catch(() => ({}));\n setError(body.detail || `Query failed: ${resp.status}`);\n return;\n }\n\n const data = await resp.json();\n if (mountedRef.current) {\n setDocuments(data.documents ?? []);\n setCount(data.count ?? 0);\n setTotal(data.total ?? 0);\n }\n } catch (err: any) {\n if (mountedRef.current) {\n setError(err.message || 'Network error');\n }\n } finally {\n if (mountedRef.current) {\n setIsLoading(false);\n }\n }\n }, [\n baseUrl,\n appScope,\n tenantId,\n collection,\n enabled,\n JSON.stringify(options?.filter),\n options?.limit,\n options?.skip,\n JSON.stringify(options?.sort),\n ]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n useEffect(() => {\n if (!options?.refreshInterval || !enabled) return;\n const interval = setInterval(fetchData, options.refreshInterval);\n return () => clearInterval(interval);\n }, [fetchData, options?.refreshInterval, enabled]);\n\n const insert = useCallback(async (doc: Partial<T>): Promise<{ inserted_id: string }> => {\n if (!appScope) throw new Error('No appScope — FlowstackProvider must be mounted with a valid appScope');\n if (!tenantId) throw new Error(MISSING_TENANT);\n\n const url = `${baseUrl}/public/collections/${encodeURIComponent(collection)}/insert`;\n const resp = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-App-Scope': appScope,\n 'X-Tenant-ID': tenantId,\n },\n body: JSON.stringify({ document: doc }),\n });\n\n if (!resp.ok) {\n const body = await resp.json().catch(() => ({}));\n throw new Error(body.detail || `Insert failed: ${resp.status}`);\n }\n\n const data = await resp.json();\n // Refresh the list after a successful insert\n fetchData();\n return { inserted_id: data.inserted_id };\n }, [baseUrl, appScope, tenantId, collection, fetchData]);\n\n return { documents, count, total, isLoading, error, insert, refresh: fetchData };\n}\n","/**\n * useConversations — fetches the user's past Casino builder conversations\n * from GET /library/conversations. Powers the Sessions sidebar in ChatView.\n */\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\n\nexport interface ConversationSummary {\n id: string;\n title: string;\n preview?: string;\n last_message_at?: string | number;\n message_count?: number;\n starred?: boolean;\n}\n\nexport interface UseConversationsOptions {\n limit?: number;\n includeDeleted?: boolean;\n refreshIntervalMs?: number;\n}\n\nexport interface UseConversationsReturn {\n conversations: ConversationSummary[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n deleteConversation: (sessionId: string) => Promise<boolean>;\n renameConversation: (sessionId: string, title: string) => Promise<boolean>;\n}\n\nexport function useConversations(options?: UseConversationsOptions): UseConversationsReturn {\n const { credentials, config } = useFlowstack();\n\n const [conversations, setConversations] = useState<ConversationSummary[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const baseUrl = config?.baseUrl || 'https://sage-api.flowstack.fun';\n const apiKey = credentials?.apiKey;\n const limit = options?.limit ?? 50;\n\n const refresh = useCallback(async (): Promise<void> => {\n if (!apiKey) return;\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetch(`${baseUrl}/library/conversations?limit=${limit}`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n });\n if (!res.ok) throw new Error(`${res.status}`);\n const data = await res.json();\n const items: ConversationSummary[] = (data.items || data.conversations || []).map((c: any) => {\n // Title: prefer explicit title, fall back to first_message_preview\n // (trimmed, capped at 60 chars), then last_snippet, then 'Untitled'.\n const rawTitle = c.title?.trim();\n const rawPreview = (c.first_message_preview || c.last_snippet || '').trim();\n const title = rawTitle || (rawPreview ? rawPreview.slice(0, 60) : 'Untitled');\n return {\n id: c.conversation_id || c.id || c.session_id || '',\n title,\n // show the preview text if it differs from the title\n preview: rawPreview && rawPreview !== title ? rawPreview.slice(0, 80) : '',\n last_message_at: c.last_activity_at || c.last_message_at || c.created_at,\n message_count: c.message_count,\n starred: c.starred,\n };\n });\n setConversations(items);\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setIsLoading(false);\n }\n }, [apiKey, baseUrl, limit]);\n\n useEffect(() => {\n if (!credentials) return;\n refresh();\n const onFocus = () => refresh();\n window.addEventListener('focus', onFocus);\n return () => window.removeEventListener('focus', onFocus);\n }, [credentials, refresh]);\n\n useEffect(() => {\n const interval = options?.refreshIntervalMs ?? 0;\n if (!interval || interval < 1000 || !credentials) return;\n const handle = setInterval(refresh, interval);\n return () => clearInterval(handle);\n }, [credentials, refresh, options?.refreshIntervalMs]);\n\n const deleteConversation = useCallback(async (sessionId: string): Promise<boolean> => {\n if (!apiKey) return false;\n try {\n const res = await fetch(`${baseUrl}/library/conversations/${sessionId}`, {\n method: 'DELETE',\n headers: { Authorization: `Bearer ${apiKey}` },\n });\n if (res.ok) {\n setConversations(prev => prev.filter(c => c.id !== sessionId));\n return true;\n }\n return false;\n } catch { return false; }\n }, [apiKey, baseUrl]);\n\n const renameConversation = useCallback(async (sessionId: string, title: string): Promise<boolean> => {\n if (!apiKey) return false;\n try {\n const res = await fetch(`${baseUrl}/library/conversations/${sessionId}`, {\n method: 'PATCH',\n headers: { Authorization: `Bearer ${apiKey}`, 'Content-Type': 'application/json' },\n body: JSON.stringify({ title }),\n });\n if (res.ok) {\n setConversations(prev => prev.map(c => c.id === sessionId ? { ...c, title } : c));\n return true;\n }\n return false;\n } catch { return false; }\n }, [apiKey, baseUrl]);\n\n return { conversations, isLoading, error, refresh, deleteConversation, renameConversation };\n}\n","'use client';\n\n/**\n * useIntegrations — CRUD for HTTP API integrations (P0-79).\n *\n * Lets built apps register any HTTPS REST API as a named integration that\n * the agent can call as a tool. Credentials are encrypted at rest by the\n * backend; the frontend never receives raw secrets after creation.\n *\n * Usage:\n * const { integrations, create, update, remove, isLoading } = useIntegrations();\n *\n * // Register a new API\n * await create({\n * name: 'Shopify',\n * description: 'Shopify Admin API for order management',\n * base_url: 'https://my-store.myshopify.com/admin/api/2024-01',\n * auth_type: 'bearer',\n * auth_config: { token: 'shpat_xxx' },\n * endpoints: [\n * { name: 'list_orders', method: 'GET', path: '/orders.json' },\n * { name: 'get_order', method: 'GET', path: '/orders/{id}.json' },\n * ],\n * });\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type IntegrationAuthType =\n | 'bearer'\n | 'api_key_header'\n | 'api_key_query'\n | 'basic'\n | 'none';\n\nexport interface IntegrationEndpoint {\n name: string;\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n path: string;\n description?: string;\n parameters?: Record<string, unknown>;\n}\n\nexport interface Integration {\n integration_id: string;\n name: string;\n description: string;\n base_url: string;\n auth_type: IntegrationAuthType;\n /** Redacted preview — raw secrets are never returned after creation */\n auth_preview?: Record<string, unknown>;\n endpoint_count: number;\n endpoints?: IntegrationEndpoint[];\n workspace_id?: string;\n created_at: number;\n updated_at?: number;\n}\n\nexport interface CreateIntegrationInput {\n name: string;\n /** 20–300 chars */\n description: string;\n /** HTTPS base URL, e.g. \"https://api.stripe.com/v1\" */\n base_url: string;\n auth_type?: IntegrationAuthType;\n /** Credentials — encrypted at rest, never returned after save */\n auth_config?: Record<string, unknown>;\n endpoints?: IntegrationEndpoint[];\n workspace_id?: string;\n}\n\nexport interface UpdateIntegrationInput {\n name?: string;\n description?: string;\n base_url?: string;\n auth_config?: Record<string, unknown>;\n endpoints?: IntegrationEndpoint[];\n}\n\nexport interface UseIntegrationsReturn {\n integrations: Integration[];\n isLoading: boolean;\n error: string | null;\n /** Create and register a new HTTP API integration */\n create: (input: CreateIntegrationInput) => Promise<Integration | null>;\n /** Update an existing integration */\n update: (id: string, input: UpdateIntegrationInput) => Promise<boolean>;\n /** Delete an integration */\n remove: (id: string) => Promise<boolean>;\n /** Get a single integration with full endpoint details */\n get: (id: string) => Promise<Integration | null>;\n /** Refresh the list */\n refresh: () => Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useIntegrations(): UseIntegrationsReturn {\n const { credentials, config } = useFlowstack();\n const [integrations, setIntegrations] = useState<Integration[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const base = (config as any)?.baseUrl || 'https://sage-api.flowstack.fun';\n const creds = credentials as any;\n\n const headers = (): Record<string, string> => ({\n Authorization: `Bearer ${creds?.apiKey || ''}`,\n 'X-Tenant-ID': creds?.tenantId || (config as any)?.tenantId || '',\n 'Content-Type': 'application/json',\n });\n\n const refresh = useCallback(async () => {\n if (!creds?.apiKey) return;\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetch(`${base}/integrations`, { headers: headers() });\n if (!res.ok) { setError(`Failed to load integrations (${res.status})`); return; }\n const data = await res.json();\n setIntegrations(data.integrations ?? []);\n } catch (e: any) {\n setError(e.message || 'Failed to load integrations');\n } finally {\n setIsLoading(false);\n }\n }, [creds?.apiKey, creds?.tenantId, base]);\n\n useEffect(() => { refresh(); }, [refresh]);\n\n const create = useCallback(async (input: CreateIntegrationInput): Promise<Integration | null> => {\n if (!creds?.apiKey) return null;\n try {\n const res = await fetch(`${base}/integrations`, {\n method: 'POST',\n headers: headers(),\n body: JSON.stringify(input),\n });\n if (!res.ok) return null;\n const data = await res.json();\n await refresh();\n return data as Integration;\n } catch { return null; }\n }, [creds?.apiKey, base, refresh]);\n\n const update = useCallback(async (id: string, input: UpdateIntegrationInput): Promise<boolean> => {\n if (!creds?.apiKey) return false;\n try {\n const res = await fetch(`${base}/integrations/${encodeURIComponent(id)}`, {\n method: 'PUT',\n headers: headers(),\n body: JSON.stringify(input),\n });\n if (res.ok) await refresh();\n return res.ok;\n } catch { return false; }\n }, [creds?.apiKey, base, refresh]);\n\n const remove = useCallback(async (id: string): Promise<boolean> => {\n if (!creds?.apiKey) return false;\n try {\n const res = await fetch(`${base}/integrations/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n headers: headers(),\n });\n if (res.ok) await refresh();\n return res.ok;\n } catch { return false; }\n }, [creds?.apiKey, base, refresh]);\n\n const get = useCallback(async (id: string): Promise<Integration | null> => {\n if (!creds?.apiKey) return null;\n try {\n const res = await fetch(`${base}/integrations/${encodeURIComponent(id)}`, { headers: headers() });\n if (!res.ok) return null;\n return await res.json() as Integration;\n } catch { return null; }\n }, [creds?.apiKey, base]);\n\n return { integrations, isLoading, error, create, update, remove, get, refresh };\n}\n","'use client';\n\n/**\n * useAutomations — CRUD for agent cron automations (P0-85).\n *\n * Lets built apps create scheduled jobs that run an agent prompt on a\n * cron schedule via AWS EventBridge. Each automation can target specific\n * agent personas, configure output delivery (email, webhook, file, silent),\n * and be paused/resumed without deletion.\n *\n * Schedule format: 5-field Unix cron \"minute hour dom month dow\"\n * \"0 9 * * 1-5\" → weekdays at 9 AM\n * \"0 * * * *\" → every hour\n * \"30 8 1 * *\" → 1st of every month at 8:30 AM\n *\n * Usage:\n * const { automations, create, pause, resume, runNow } = useAutomations();\n *\n * await create({\n * name: 'Daily sales digest',\n * prompt: 'Pull yesterday\\'s sales from Shopify, summarize by region, email me.',\n * schedule: '0 8 * * 1-5',\n * target_agents: ['shopify_analyst'],\n * output_config: { type: 'email', to: 'me@company.com' },\n * });\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type AutomationOutputType = 'silent' | 'email' | 'webhook' | 'file';\nexport type AutomationStatus = 'active' | 'paused' | 'error';\nexport type AutomationRunStatus = 'success' | 'failure' | 'running' | 'timeout';\n\nexport interface AutomationOutputConfig {\n /** Where to send results (default: \"silent\" — stored only) */\n type: AutomationOutputType;\n /** Email address — required when type=\"email\" */\n to?: string;\n /** Webhook URL — required when type=\"webhook\" */\n url?: string;\n /** Custom headers for webhook delivery */\n headers?: Record<string, string>;\n /** Output format for file/email: \"csv\" | \"json\" | \"pdf\" */\n format?: string;\n /** Subject line template for emails */\n subject_template?: string;\n}\n\nexport interface Automation {\n automation_id: string;\n name: string;\n description: string;\n prompt: string;\n /** 5-field Unix cron expression */\n schedule: string;\n timezone: string;\n /** Agent persona names to route this job to */\n target_agents: string[];\n status: AutomationStatus;\n output_config: AutomationOutputConfig;\n max_runtime_seconds: number;\n retry_on_failure: boolean;\n max_retries: number;\n created_at: number;\n updated_at: number;\n last_run_at: number;\n last_run_status: string;\n run_count: number;\n failure_count: number;\n}\n\nexport interface AutomationRun {\n automation_id: string;\n run_id: string;\n status: AutomationRunStatus;\n started_at: number;\n completed_at?: number;\n duration_ms: number;\n credits_used: number;\n output_summary: string;\n output_url?: string;\n error_msg?: string;\n}\n\nexport interface CreateAutomationInput {\n name: string;\n /** What the agent should do each run */\n prompt: string;\n /** 5-field Unix cron, e.g. \"0 9 * * 1-5\" */\n schedule: string;\n timezone?: string;\n target_agents?: string[];\n output_config?: Partial<AutomationOutputConfig>;\n max_runtime_seconds?: number;\n retry_on_failure?: boolean;\n max_retries?: number;\n description?: string;\n}\n\nexport interface UpdateAutomationInput {\n name?: string;\n prompt?: string;\n schedule?: string;\n timezone?: string;\n target_agents?: string[];\n output_config?: Partial<AutomationOutputConfig>;\n max_runtime_seconds?: number;\n retry_on_failure?: boolean;\n max_retries?: number;\n description?: string;\n}\n\nexport interface UseAutomationsReturn {\n automations: Automation[];\n isLoading: boolean;\n error: string | null;\n /** Create a new scheduled automation */\n create: (input: CreateAutomationInput) => Promise<Automation | null>;\n /** Update an existing automation */\n update: (id: string, input: UpdateAutomationInput) => Promise<boolean>;\n /** Delete an automation and its EventBridge rule */\n remove: (id: string) => Promise<boolean>;\n /** Pause scheduling without deleting */\n pause: (id: string) => Promise<boolean>;\n /** Resume a paused automation */\n resume: (id: string) => Promise<boolean>;\n /** Trigger an immediate run (ignores schedule) */\n runNow: (id: string) => Promise<{ invoked: boolean; status_code?: number } | null>;\n /** Get run history for an automation */\n getRuns: (id: string, limit?: number) => Promise<AutomationRun[]>;\n /** Refresh the list */\n refresh: () => Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useAutomations(): UseAutomationsReturn {\n const { credentials, config } = useFlowstack();\n const [automations, setAutomations] = useState<Automation[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const base = (config as any)?.baseUrl || 'https://sage-api.flowstack.fun';\n const creds = credentials as any;\n\n const headers = (): Record<string, string> => ({\n Authorization: `Bearer ${creds?.apiKey || ''}`,\n 'X-Tenant-ID': creds?.tenantId || (config as any)?.tenantId || '',\n 'Content-Type': 'application/json',\n });\n\n const refresh = useCallback(async () => {\n if (!creds?.apiKey) return;\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetch(`${base}/automations`, { headers: headers() });\n if (!res.ok) { setError(`Failed to load automations (${res.status})`); return; }\n const data = await res.json();\n setAutomations(data.automations ?? []);\n } catch (e: any) {\n setError(e.message || 'Failed to load automations');\n } finally {\n setIsLoading(false);\n }\n }, [creds?.apiKey, creds?.tenantId, base]);\n\n useEffect(() => { refresh(); }, [refresh]);\n\n const create = useCallback(async (input: CreateAutomationInput): Promise<Automation | null> => {\n if (!creds?.apiKey) return null;\n try {\n const res = await fetch(`${base}/automations`, {\n method: 'POST',\n headers: headers(),\n body: JSON.stringify(input),\n });\n if (!res.ok) return null;\n const data = await res.json();\n await refresh();\n return data as Automation;\n } catch { return null; }\n }, [creds?.apiKey, base, refresh]);\n\n const update = useCallback(async (id: string, input: UpdateAutomationInput): Promise<boolean> => {\n if (!creds?.apiKey) return false;\n try {\n const res = await fetch(`${base}/automations/${encodeURIComponent(id)}`, {\n method: 'PUT',\n headers: headers(),\n body: JSON.stringify(input),\n });\n if (res.ok) await refresh();\n return res.ok;\n } catch { return false; }\n }, [creds?.apiKey, base, refresh]);\n\n const remove = useCallback(async (id: string): Promise<boolean> => {\n if (!creds?.apiKey) return false;\n try {\n const res = await fetch(`${base}/automations/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n headers: headers(),\n });\n if (res.ok) await refresh();\n return res.ok;\n } catch { return false; }\n }, [creds?.apiKey, base, refresh]);\n\n const pause = useCallback(async (id: string): Promise<boolean> => {\n if (!creds?.apiKey) return false;\n try {\n const res = await fetch(`${base}/automations/${encodeURIComponent(id)}/pause`, {\n method: 'POST',\n headers: headers(),\n });\n if (res.ok) await refresh();\n return res.ok;\n } catch { return false; }\n }, [creds?.apiKey, base, refresh]);\n\n const resume = useCallback(async (id: string): Promise<boolean> => {\n if (!creds?.apiKey) return false;\n try {\n const res = await fetch(`${base}/automations/${encodeURIComponent(id)}/resume`, {\n method: 'POST',\n headers: headers(),\n });\n if (res.ok) await refresh();\n return res.ok;\n } catch { return false; }\n }, [creds?.apiKey, base, refresh]);\n\n const runNow = useCallback(async (id: string) => {\n if (!creds?.apiKey) return null;\n try {\n const res = await fetch(`${base}/automations/${encodeURIComponent(id)}/run`, {\n method: 'POST',\n headers: headers(),\n });\n if (!res.ok) return null;\n return await res.json();\n } catch { return null; }\n }, [creds?.apiKey, base]);\n\n const getRuns = useCallback(async (id: string, limit = 20): Promise<AutomationRun[]> => {\n if (!creds?.apiKey) return [];\n try {\n const url = `${base}/automations/${encodeURIComponent(id)}/runs?limit=${limit}`;\n const res = await fetch(url, { headers: headers() });\n if (!res.ok) return [];\n const data = await res.json();\n return data.runs ?? [];\n } catch { return []; }\n }, [creds?.apiKey, base]);\n\n return { automations, isLoading, error, create, update, remove, pause, resume, runNow, getRuns, refresh };\n}\n","'use client';\n\n/**\n * LoginForm Component\n *\n * Pre-built login form with email/password support.\n *\n * @example\n * ```tsx\n * function LoginPage() {\n * return (\n * <LoginForm\n * onSuccess={() => router.push('/dashboard')}\n * showRegisterLink\n * registerHref=\"/register\"\n * />\n * );\n * }\n * ```\n */\n\nimport React, { useState, FormEvent } from 'react';\nimport { useAuth } from '../../hooks/useAuth';\n\nexport interface LoginFormProps {\n /** Callback on successful login */\n onSuccess?: () => void;\n /** Callback on login error */\n onError?: (error: string) => void;\n /** Show \"Register\" link */\n showRegisterLink?: boolean;\n /** Register page href */\n registerHref?: string;\n /** Custom className for form container */\n className?: string;\n /** Custom className for inputs */\n inputClassName?: string;\n /** Custom className for button */\n buttonClassName?: string;\n /** Custom labels */\n labels?: {\n title?: string;\n email?: string;\n password?: string;\n submit?: string;\n register?: string;\n loading?: string;\n };\n}\n\n/**\n * Login form component\n */\nexport function LoginForm({\n onSuccess,\n onError,\n showRegisterLink = false,\n registerHref = '/register',\n className = '',\n inputClassName = '',\n buttonClassName = '',\n labels = {},\n}: LoginFormProps) {\n const { login, isLoading, error: authError } = useAuth();\n\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n setError(null);\n\n if (!email || !password) {\n setError('Please fill in all fields');\n return;\n }\n\n try {\n const success = await login(email, password);\n if (success) {\n onSuccess?.();\n } else {\n const errorMsg = authError || 'Login failed';\n setError(errorMsg);\n onError?.(errorMsg);\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'Login failed';\n setError(errorMsg);\n onError?.(errorMsg);\n }\n };\n\n const displayError = error || authError;\n\n return (\n <form onSubmit={handleSubmit} className={`flowstack-login-form ${className}`}>\n <h2 className=\"flowstack-login-title\">\n {labels.title || 'Sign In'}\n </h2>\n\n {displayError && (\n <div className=\"flowstack-login-error\" role=\"alert\">\n {displayError}\n </div>\n )}\n\n <div className=\"flowstack-login-field\">\n <label htmlFor=\"flowstack-email\">\n {labels.email || 'Email'}\n </label>\n <input\n id=\"flowstack-email\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n disabled={isLoading}\n required\n autoComplete=\"email\"\n className={inputClassName}\n />\n </div>\n\n <div className=\"flowstack-login-field\">\n <label htmlFor=\"flowstack-password\">\n {labels.password || 'Password'}\n </label>\n <input\n id=\"flowstack-password\"\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Enter password\"\n disabled={isLoading}\n required\n autoComplete=\"current-password\"\n className={inputClassName}\n />\n </div>\n\n <button\n type=\"submit\"\n disabled={isLoading}\n className={`flowstack-login-button ${buttonClassName}`}\n >\n {isLoading ? (labels.loading || 'Signing in...') : (labels.submit || 'Sign In')}\n </button>\n\n {showRegisterLink && (\n <p className=\"flowstack-login-register\">\n Don't have an account?{' '}\n <a href={registerHref}>\n {labels.register || 'Register'}\n </a>\n </p>\n )}\n\n <style>{`\n .flowstack-login-form {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n max-width: 400px;\n margin: 0 auto;\n padding: 2rem;\n }\n .flowstack-login-title {\n font-size: 1.5rem;\n font-weight: 600;\n text-align: center;\n margin: 0 0 1rem 0;\n }\n .flowstack-login-error {\n background: #fee2e2;\n border: 1px solid #fecaca;\n color: #dc2626;\n padding: 0.75rem;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n }\n .flowstack-login-field {\n display: flex;\n flex-direction: column;\n gap: 0.375rem;\n }\n .flowstack-login-field label {\n font-size: 0.875rem;\n font-weight: 500;\n }\n .flowstack-login-field input {\n padding: 0.625rem 0.75rem;\n border: 1px solid #d1d5db;\n border-radius: 0.375rem;\n font-size: 1rem;\n }\n .flowstack-login-field input:focus {\n outline: none;\n border-color: #3b82f6;\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);\n }\n .flowstack-login-button {\n padding: 0.75rem 1rem;\n background: #3b82f6;\n color: white;\n border: none;\n border-radius: 0.375rem;\n font-size: 1rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s;\n }\n .flowstack-login-button:hover:not(:disabled) {\n background: #2563eb;\n }\n .flowstack-login-button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n .flowstack-login-register {\n text-align: center;\n font-size: 0.875rem;\n color: #6b7280;\n margin: 0;\n }\n .flowstack-login-register a {\n color: #3b82f6;\n text-decoration: none;\n }\n .flowstack-login-register a:hover {\n text-decoration: underline;\n }\n `}</style>\n </form>\n );\n}\n","'use client';\n\n/**\n * RegisterForm Component\n *\n * Pre-built registration form with email/password support.\n *\n * @example\n * ```tsx\n * function RegisterPage() {\n * return (\n * <RegisterForm\n * onSuccess={() => router.push('/dashboard')}\n * showLoginLink\n * loginHref=\"/login\"\n * />\n * );\n * }\n * ```\n */\n\nimport React, { useState, FormEvent } from 'react';\nimport { useAuth } from '../../hooks/useAuth';\n\nexport interface RegisterFormProps {\n /** Callback on successful registration */\n onSuccess?: () => void;\n /** Callback on registration error */\n onError?: (error: string) => void;\n /** Show \"Login\" link */\n showLoginLink?: boolean;\n /** Login page href */\n loginHref?: string;\n /** Minimum password length */\n minPasswordLength?: number;\n /** Custom className for form container */\n className?: string;\n /** Custom className for inputs */\n inputClassName?: string;\n /** Custom className for button */\n buttonClassName?: string;\n /** Custom labels */\n labels?: {\n title?: string;\n email?: string;\n password?: string;\n confirmPassword?: string;\n submit?: string;\n login?: string;\n loading?: string;\n };\n}\n\n/**\n * Registration form component\n */\nexport function RegisterForm({\n onSuccess,\n onError,\n showLoginLink = false,\n loginHref = '/login',\n minPasswordLength = 8,\n className = '',\n inputClassName = '',\n buttonClassName = '',\n labels = {},\n}: RegisterFormProps) {\n const { register, isLoading, error: authError } = useAuth();\n\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [confirmPassword, setConfirmPassword] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n setError(null);\n\n if (!email || !password || !confirmPassword) {\n setError('Please fill in all fields');\n return;\n }\n\n if (password.length < minPasswordLength) {\n setError(`Password must be at least ${minPasswordLength} characters`);\n return;\n }\n\n if (password !== confirmPassword) {\n setError('Passwords do not match');\n return;\n }\n\n try {\n const success = await register(email, password);\n if (success) {\n onSuccess?.();\n } else {\n const errorMsg = authError || 'Registration failed';\n setError(errorMsg);\n onError?.(errorMsg);\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'Registration failed';\n setError(errorMsg);\n onError?.(errorMsg);\n }\n };\n\n const displayError = error || authError;\n\n return (\n <form onSubmit={handleSubmit} className={`flowstack-register-form ${className}`}>\n <h2 className=\"flowstack-register-title\">\n {labels.title || 'Create Account'}\n </h2>\n\n {displayError && (\n <div className=\"flowstack-register-error\" role=\"alert\">\n {displayError}\n </div>\n )}\n\n <div className=\"flowstack-register-field\">\n <label htmlFor=\"flowstack-reg-email\">\n {labels.email || 'Email'}\n </label>\n <input\n id=\"flowstack-reg-email\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n disabled={isLoading}\n required\n autoComplete=\"email\"\n className={inputClassName}\n />\n </div>\n\n <div className=\"flowstack-register-field\">\n <label htmlFor=\"flowstack-reg-password\">\n {labels.password || 'Password'}\n </label>\n <input\n id=\"flowstack-reg-password\"\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder={`At least ${minPasswordLength} characters`}\n disabled={isLoading}\n required\n autoComplete=\"new-password\"\n className={inputClassName}\n />\n </div>\n\n <div className=\"flowstack-register-field\">\n <label htmlFor=\"flowstack-reg-confirm\">\n {labels.confirmPassword || 'Confirm Password'}\n </label>\n <input\n id=\"flowstack-reg-confirm\"\n type=\"password\"\n value={confirmPassword}\n onChange={(e) => setConfirmPassword(e.target.value)}\n placeholder=\"Confirm your password\"\n disabled={isLoading}\n required\n autoComplete=\"new-password\"\n className={inputClassName}\n />\n </div>\n\n <button\n type=\"submit\"\n disabled={isLoading}\n className={`flowstack-register-button ${buttonClassName}`}\n >\n {isLoading ? (labels.loading || 'Creating account...') : (labels.submit || 'Create Account')}\n </button>\n\n {showLoginLink && (\n <p className=\"flowstack-register-login\">\n Already have an account?{' '}\n <a href={loginHref}>\n {labels.login || 'Sign In'}\n </a>\n </p>\n )}\n\n <style>{`\n .flowstack-register-form {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n max-width: 400px;\n margin: 0 auto;\n padding: 2rem;\n }\n .flowstack-register-title {\n font-size: 1.5rem;\n font-weight: 600;\n text-align: center;\n margin: 0 0 1rem 0;\n }\n .flowstack-register-error {\n background: #fee2e2;\n border: 1px solid #fecaca;\n color: #dc2626;\n padding: 0.75rem;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n }\n .flowstack-register-field {\n display: flex;\n flex-direction: column;\n gap: 0.375rem;\n }\n .flowstack-register-field label {\n font-size: 0.875rem;\n font-weight: 500;\n }\n .flowstack-register-field input {\n padding: 0.625rem 0.75rem;\n border: 1px solid #d1d5db;\n border-radius: 0.375rem;\n font-size: 1rem;\n }\n .flowstack-register-field input:focus {\n outline: none;\n border-color: #3b82f6;\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);\n }\n .flowstack-register-button {\n padding: 0.75rem 1rem;\n background: #3b82f6;\n color: white;\n border: none;\n border-radius: 0.375rem;\n font-size: 1rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s;\n }\n .flowstack-register-button:hover:not(:disabled) {\n background: #2563eb;\n }\n .flowstack-register-button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n .flowstack-register-login {\n text-align: center;\n font-size: 0.875rem;\n color: #6b7280;\n margin: 0;\n }\n .flowstack-register-login a {\n color: #3b82f6;\n text-decoration: none;\n }\n .flowstack-register-login a:hover {\n text-decoration: underline;\n }\n `}</style>\n </form>\n );\n}\n","'use client';\n\n/**\n * GoogleSignIn Component\n *\n * Google OAuth sign-in button.\n *\n * @example\n * ```tsx\n * function LoginPage() {\n * return (\n * <div>\n * <LoginForm />\n * <GoogleSignIn onSuccess={() => router.push('/dashboard')} />\n * </div>\n * );\n * }\n * ```\n */\n\nimport React from 'react';\nimport { useAuth } from '../../hooks/useAuth';\n\nexport interface GoogleSignInProps {\n /** Callback on successful sign-in */\n onSuccess?: () => void;\n /** Callback on error */\n onError?: (error: string) => void;\n /** Custom className */\n className?: string;\n /** Button text */\n label?: string;\n}\n\n/**\n * Google OAuth sign-in button\n */\nexport function GoogleSignIn({\n onSuccess,\n onError,\n className = '',\n label = 'Continue with Google',\n}: GoogleSignInProps) {\n const { googleSignIn, isLoading, error } = useAuth();\n\n const handleClick = async () => {\n try {\n await googleSignIn();\n // Note: actual success happens after OAuth redirect\n onSuccess?.();\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'Google sign-in failed';\n onError?.(errorMsg);\n }\n };\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={isLoading}\n className={`flowstack-google-button ${className}`}\n >\n <svg\n className=\"flowstack-google-icon\"\n viewBox=\"0 0 24 24\"\n width=\"20\"\n height=\"20\"\n >\n <path\n fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n />\n <path\n fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n />\n <path\n fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n />\n </svg>\n <span>{isLoading ? 'Loading...' : label}</span>\n\n {error && (\n <span className=\"flowstack-google-error\">{error}</span>\n )}\n\n <style>{`\n .flowstack-google-button {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.75rem;\n width: 100%;\n padding: 0.75rem 1rem;\n background: white;\n color: #374151;\n border: 1px solid #d1d5db;\n border-radius: 0.375rem;\n font-size: 1rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s, border-color 0.15s;\n }\n .flowstack-google-button:hover:not(:disabled) {\n background: #f9fafb;\n border-color: #9ca3af;\n }\n .flowstack-google-button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n .flowstack-google-icon {\n flex-shrink: 0;\n }\n .flowstack-google-error {\n display: block;\n width: 100%;\n color: #dc2626;\n font-size: 0.75rem;\n margin-top: 0.25rem;\n }\n `}</style>\n </button>\n );\n}\n","/**\n * BrokeredLoginButton — \"Continue with Flowstack\" SSO button for built apps.\n *\n * Opens the /auth/broker route at openinferencefoundation.org in a popup. That\n * origin runs Privy (it's a registered origin), authenticates the user, and\n * postMessages a Flowstack JWT back to this component. We validate the\n * message (origin + source + CSRF state + shape), then inject the credentials\n * into FlowstackProvider via setCredentials — AuthGuard unblocks on the next\n * render.\n *\n * Why this exists: Privy's Allowed Origins list doesn't support wildcards and\n * every built app lives at its own subdomain. Registering every subdomain\n * manually doesn't scale. The broker pattern keeps Privy registered only on\n * openinferencefoundation.org and lets every built app delegate auth there.\n *\n * Security notes:\n * - event.origin must be https://openinferencefoundation.org (strict match).\n * - event.source must equal the popup we opened (prevents other frames\n * from spoofing the response).\n * - `state` is a per-click CSRF nonce.\n * - On popup blocker we surface a clear error and leave the user free to\n * fall back to the email/password tabs in AuthPage.\n */\n\n'use client';\n\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useFlowstack } from '../../context/FlowstackProvider';\nimport type { FlowstackCredentials } from '../../types';\n\nconst DEFAULT_BROKER_URL = 'https://openinferencefoundation.org/auth/broker';\n\n// Exact broker origin. We do NOT accept preview subdomains for the broker —\n// built apps in prod should always talk to the prod broker.\nconst EXPECTED_SENDER_ORIGIN = 'https://openinferencefoundation.org';\n\n// For local SDK development, optionally allow localhost. Set via the\n// `brokerUrl` prop; if it points at localhost we derive the allowed origin\n// from it so dev flows work.\nfunction deriveExpectedOrigin(brokerUrl: string): string {\n try {\n const url = new URL(brokerUrl);\n return url.origin;\n } catch {\n return EXPECTED_SENDER_ORIGIN;\n }\n}\n\nexport interface BrokeredLoginButtonProps {\n /** Override broker URL (default https://openinferencefoundation.org/auth/broker). */\n brokerUrl?: string;\n /** Button label (default \"Continue with Flowstack\"). */\n label?: string;\n /** Optional wrapper className. */\n className?: string;\n /** Fired after credentials are successfully injected. */\n onSuccess?: (credentials: FlowstackCredentials) => void;\n}\n\ninterface BrokerMessage {\n type: 'flowstack-auth-success';\n credentials: Partial<FlowstackCredentials>;\n state: string;\n}\n\nfunction isBrokerMessage(data: unknown): data is BrokerMessage {\n if (!data || typeof data !== 'object') return false;\n const d = data as Record<string, unknown>;\n return d.type === 'flowstack-auth-success' && typeof d.state === 'string' && !!d.credentials;\n}\n\nexport function BrokeredLoginButton({\n brokerUrl = DEFAULT_BROKER_URL,\n label = 'Continue with Flowstack',\n className = '',\n onSuccess,\n}: BrokeredLoginButtonProps) {\n const { setCredentials, config } = useFlowstack();\n const [isOpening, setIsOpening] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const popupRef = useRef<Window | null>(null);\n const stateRef = useRef<string>('');\n const expectedOriginRef = useRef<string>(deriveExpectedOrigin(brokerUrl));\n\n useEffect(() => {\n expectedOriginRef.current = deriveExpectedOrigin(brokerUrl);\n }, [brokerUrl]);\n\n // Listen for postMessage responses from the broker popup.\n useEffect(() => {\n const listener = (event: MessageEvent) => {\n // 1. Sender origin must match the broker's origin.\n if (event.origin !== expectedOriginRef.current) return;\n // 2. Source must be the popup we opened — OR null.\n // On mobile Safari, window.open() opens a new tab; after window.close(),\n // the tab is gone before the message is delivered, so event.source arrives\n // as null. We accept null-source messages when origin + CSRF both match\n // (checks 1 + 4 provide sufficient proof of authenticity).\n if (\n popupRef.current &&\n event.source !== null &&\n event.source !== popupRef.current\n ) return;\n // 3. Shape check.\n if (!isBrokerMessage(event.data)) return;\n // 4. CSRF nonce check.\n if (event.data.state !== stateRef.current) {\n setError('Authentication state mismatch. Please try again.');\n setIsOpening(false);\n return;\n }\n // 5. Credentials payload check.\n const c = event.data.credentials;\n if (!c.apiKey || !c.tenantId) {\n setError('Authentication response was incomplete.');\n setIsOpening(false);\n return;\n }\n // 6. Inject into FlowstackProvider. AuthGuard will unblock on next render.\n const creds: FlowstackCredentials = {\n apiKey: c.apiKey,\n tenantId: c.tenantId,\n userId: c.userId,\n email: c.email,\n expiresAt: c.expiresAt,\n };\n setCredentials(creds);\n setIsOpening(false);\n setError(null);\n onSuccess?.(creds);\n };\n window.addEventListener('message', listener);\n return () => window.removeEventListener('message', listener);\n }, [setCredentials, onSuccess]);\n\n const handleClick = useCallback(() => {\n setError(null);\n setIsOpening(true);\n\n // CSRF nonce — random per click, validated on response.\n const nonce =\n Math.random().toString(36).slice(2) + Date.now().toString(36);\n stateRef.current = nonce;\n\n // After an in-app logout, force the broker to purge its sticky Privy/Casino\n // session so the user can pick a DIFFERENT account. Without this, the broker\n // silently re-auths the just-logged-out identity and account-switching is\n // impossible. logout() sets this one-shot marker; we consume it here.\n let forceRelogin = false;\n try {\n forceRelogin = typeof window !== 'undefined'\n && window.localStorage.getItem('flowstack:force_relogin') === '1';\n if (forceRelogin) window.localStorage.removeItem('flowstack:force_relogin');\n } catch { /* storage unavailable — fall through without force */ }\n\n const url =\n `${brokerUrl}?return=${encodeURIComponent(window.location.origin)}` +\n `&state=${encodeURIComponent(nonce)}` +\n (config.appScope ? `&app_scope=${encodeURIComponent(config.appScope)}` : '') +\n (forceRelogin ? '&force_login=1' : '');\n\n const popup = window.open(\n url,\n 'flowstack-auth',\n 'width=480,height=720,left=200,top=100'\n );\n if (!popup) {\n setError('Pop-up blocked. Please allow pop-ups from this site and try again.');\n setIsOpening(false);\n return;\n }\n popupRef.current = popup;\n\n // Watchdog: if the user closes the popup without completing, reset state.\n const watchdog = window.setInterval(() => {\n if (popup.closed) {\n window.clearInterval(watchdog);\n // Only reset if we're still pending — the message handler may have\n // already set isOpening=false on success.\n setIsOpening((prev) => (prev ? false : prev));\n }\n }, 500);\n }, [brokerUrl]);\n\n return (\n <div className={className}>\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={isOpening}\n style={{\n width: '100%',\n padding: '12px 16px',\n background: '#7c3aed',\n color: '#ffffff',\n border: 'none',\n borderRadius: '10px',\n fontSize: '15px',\n fontWeight: 600,\n cursor: isOpening ? 'default' : 'pointer',\n opacity: isOpening ? 0.6 : 1,\n transition: 'opacity 150ms ease',\n }}\n >\n {isOpening ? 'Signing in…' : label}\n </button>\n {error && (\n <p\n style={{\n marginTop: '8px',\n color: '#ef4444',\n fontSize: '13px',\n lineHeight: 1.4,\n }}\n >\n {error}\n </p>\n )}\n </div>\n );\n}\n","'use client';\n\n/**\n * AuthGuard Component\n *\n * Protects routes/components from unauthenticated access.\n *\n * @example\n * ```tsx\n * function DashboardPage() {\n * return (\n * <AuthGuard fallback={<LoginPage />}>\n * <Dashboard />\n * </AuthGuard>\n * );\n * }\n * ```\n */\n\nimport React, { ReactNode, useEffect, useState, useRef } from 'react';\nimport { useFlowstack } from '../../context/FlowstackProvider';\nimport { BrokeredLoginButton } from './BrokeredLoginButton';\n\nexport interface AuthGuardProps {\n /** Protected content */\n children: ReactNode;\n /** Content to show when not authenticated */\n fallback?: ReactNode;\n /** Redirect URL when not authenticated (alternative to fallback) */\n redirectTo?: string;\n /** Show loading state while checking auth */\n loadingComponent?: ReactNode;\n /** Require a specific workspace to be selected */\n requireWorkspace?: boolean;\n /**\n * Opt-in guest chat for built apps (U1). When the app has an `appScope` and\n * the site enabled guest chat server-side (`app_config.allowGuestChat`), an\n * unauthenticated visitor is transparently issued a short-lived guest session\n * (`POST /auth/guest`) instead of being shown the login gate — removing the\n * \"sign up to the desk\" friction. Per-site control lives entirely in the\n * backend flag: if the site hasn't opted in, `/auth/guest` returns 403 and we\n * fall back to the normal login UI. Default true, but it's a no-op unless the\n * app is built with an `appScope` (the Casino dashboard has none, so it is\n * unaffected and always requires real login).\n */\n allowGuest?: boolean;\n}\n\nconst Spinner = () => (\n <div className=\"flowstack-auth-loading\">\n <div className=\"flowstack-auth-spinner\" />\n <style>{`\n .flowstack-auth-loading { display: flex; align-items: center; justify-content: center; min-height: 200px; }\n .flowstack-auth-spinner { width: 32px; height: 32px; border: 3px solid #e5e7eb; border-top-color: #3b82f6; border-radius: 50%; animation: flowstack-spin 0.8s linear infinite; }\n @keyframes flowstack-spin { to { transform: rotate(360deg); } }\n `}</style>\n </div>\n);\n\n/**\n * Auth guard component\n */\nexport function AuthGuard({\n children,\n fallback,\n redirectTo,\n loadingComponent,\n requireWorkspace = false,\n allowGuest = true,\n}: AuthGuardProps) {\n const {\n isAuthenticated,\n isInitialized,\n selectedWorkspace,\n config,\n setCredentials,\n } = useFlowstack();\n\n // U1: transparently obtain a guest session for opted-in built apps.\n const appScope = (config as any)?.appScope as string | undefined;\n const baseUrl = ((config as any)?.baseUrl as string | undefined) || 'https://sage-api.flowstack.fun';\n const [guestStatus, setGuestStatus] = useState<'idle' | 'trying' | 'done' | 'failed'>('idle');\n const guestStartedRef = useRef(false);\n\n useEffect(() => {\n if (!allowGuest || !isInitialized || isAuthenticated || !appScope || guestStartedRef.current) {\n return;\n }\n // Guard with a ref and keep guestStatus OUT of the dep array: calling\n // setGuestStatus('trying') below would otherwise re-run this effect, whose\n // cleanup would cancel the in-flight fetch, so setCredentials never fires and\n // the guard hangs on the loading state. The ref makes this run exactly once.\n guestStartedRef.current = true;\n setGuestStatus('trying');\n fetch(`${baseUrl}/auth/guest`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ site_id: appScope }),\n })\n .then((r) => (r.ok ? r.json() : Promise.reject(r.status)))\n .then((data) => {\n if (data?.token) {\n // Promote the guest token to the active session. The app_scope claim\n // matches config.appScope, so it survives the provider's hydration\n // cross-check and persists across refresh until it expires.\n setGuestStatus('done');\n setCredentials({ apiKey: data.token, tenantId: data.tenant_id, userId: data.user_id });\n } else {\n setGuestStatus('failed');\n }\n })\n .catch(() => {\n // 403 (site not opted in) or network error → fall back to login UI.\n setGuestStatus('failed');\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [allowGuest, isInitialized, isAuthenticated, appScope, baseUrl, setCredentials]);\n\n // Handle redirect — only fires AFTER the user has explicitly dismissed the\n // login UI (or if there is genuinely no fallback). An immediate redirect\n // races the BrokeredLoginButton popup and prevents the user from ever\n // completing auth, which is why built apps redirect to home on first load.\n // We intentionally do NOT redirect here; the fallback below handles login.\n useEffect(() => {\n // Intentionally empty — redirectTo is deprecated for built-app AuthGuard use.\n // Use fallback={<BrokeredLoginButton />} instead.\n }, [isInitialized, isAuthenticated, redirectTo]);\n\n // Show loading while initializing\n if (!isInitialized) {\n return loadingComponent ? <>{loadingComponent}</> : <Spinner />;\n }\n\n // U1: guest session being obtained for an opted-in built app — show loading,\n // not the login gate, so the visitor never sees the sign-up wall.\n if (!isAuthenticated && allowGuest && appScope && guestStatus === 'trying') {\n return loadingComponent ? <>{loadingComponent}</> : <Spinner />;\n }\n\n // Not authenticated — always show a login UI, never redirect immediately.\n // If the caller passed a fallback, use it. If they passed redirectTo (a\n // common LLM-generated pattern), ignore the redirect and show the default\n // BrokeredLoginButton so the user can actually log in.\n if (!isAuthenticated) {\n if (fallback) return <>{fallback}</>;\n return (\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', minHeight: '100dvh', gap: '16px', padding: '32px' }}>\n <p style={{ color: '#6b7280', fontSize: '15px', textAlign: 'center' }}>Sign in to continue</p>\n <BrokeredLoginButton />\n </div>\n );\n }\n\n // Check workspace requirement\n if (requireWorkspace && !selectedWorkspace) {\n return (\n <div className=\"flowstack-workspace-required\">\n <p>Please select a workspace to continue.</p>\n <style>{`\n .flowstack-workspace-required {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 200px;\n color: #6b7280;\n }\n `}</style>\n </div>\n );\n }\n\n // Authenticated - render children\n return <>{children}</>;\n}\n","'use client';\n\nimport React, { useState, useCallback, type ReactNode } from 'react';\n\nexport interface AdminGateProps {\n children: ReactNode;\n /** SHA-256 hex hash of the admin password. If omitted, accepts any non-empty password (dev mode). */\n passwordHash?: string;\n /** Fallback content shown when not authenticated as admin */\n fallback?: ReactNode;\n /** localStorage key for session persistence (default: 'flowstack_admin') */\n storageKey?: string;\n}\n\n/**\n * Password-based gate for admin routes in Casino-built apps.\n * Persists admin access in localStorage for session duration.\n *\n * Usage:\n * <AdminGate passwordHash=\"a1b2c3...\">\n * <AdminPanel />\n * </AdminGate>\n */\nexport function AdminGate({\n children,\n passwordHash,\n fallback,\n storageKey = 'flowstack_admin',\n}: AdminGateProps) {\n const [isAdmin, setIsAdmin] = useState(() => {\n if (typeof window === 'undefined') return false;\n return localStorage.getItem(storageKey) === 'true';\n });\n const [password, setPassword] = useState('');\n const [error, setError] = useState('');\n\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault();\n if (!password.trim()) return;\n\n if (!passwordHash) {\n // No hash configured — accept any non-empty password (dev/demo mode)\n localStorage.setItem(storageKey, 'true');\n setIsAdmin(true);\n return;\n }\n\n const data = new TextEncoder().encode(password);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashHex = Array.from(new Uint8Array(hashBuffer))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n\n if (hashHex === passwordHash) {\n localStorage.setItem(storageKey, 'true');\n setIsAdmin(true);\n } else {\n setError('Invalid admin password');\n }\n },\n [password, passwordHash, storageKey],\n );\n\n if (isAdmin) return <>{children}</>;\n if (fallback) return <>{fallback}</>;\n\n return (\n <div\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: '200px',\n }}\n >\n <form onSubmit={handleSubmit} style={{ textAlign: 'center' }}>\n <p style={{ marginBottom: '8px', fontSize: '14px', color: '#6b7280' }}>\n Admin access required\n </p>\n <input\n type=\"password\"\n value={password}\n onChange={(e) => {\n setPassword(e.target.value);\n setError('');\n }}\n placeholder=\"Enter admin password\"\n style={{\n padding: '8px 12px',\n border: '1px solid #d1d5db',\n borderRadius: '6px',\n marginRight: '8px',\n fontSize: '16px',\n }}\n />\n <button\n type=\"submit\"\n style={{\n padding: '8px 16px',\n background: '#3b82f6',\n color: '#fff',\n border: 'none',\n borderRadius: '6px',\n cursor: 'pointer',\n fontSize: '14px',\n }}\n >\n Enter\n </button>\n {error && (\n <p style={{ color: '#ef4444', fontSize: '12px', marginTop: '4px' }}>\n {error}\n </p>\n )}\n </form>\n </div>\n );\n}\n","'use client';\n\n/**\n * WorkspaceSelector Component\n *\n * Dropdown selector for workspaces.\n *\n * @example\n * ```tsx\n * function Sidebar() {\n * const { workspaces, selectedWorkspace, selectWorkspace } = useWorkspace();\n *\n * return (\n * <WorkspaceSelector\n * workspaces={workspaces}\n * selected={selectedWorkspace}\n * onSelect={selectWorkspace}\n * onCreateNew={() => setShowCreateModal(true)}\n * />\n * );\n * }\n * ```\n */\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport type { WorkspaceInfo } from '../../types';\n\nexport interface WorkspaceSelectorProps {\n /** List of workspaces */\n workspaces: WorkspaceInfo[];\n /** Currently selected workspace */\n selected: WorkspaceInfo | null;\n /** Callback when workspace is selected */\n onSelect: (workspace: WorkspaceInfo) => void;\n /** Callback to create new workspace */\n onCreateNew?: () => void;\n /** Loading state */\n isLoading?: boolean;\n /** Custom className */\n className?: string;\n /** Placeholder text */\n placeholder?: string;\n}\n\n/**\n * Workspace selector dropdown\n */\nexport function WorkspaceSelector({\n workspaces,\n selected,\n onSelect,\n onCreateNew,\n isLoading = false,\n className = '',\n placeholder = 'Select workspace',\n}: WorkspaceSelectorProps) {\n const [isOpen, setIsOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Close on outside click\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const handleSelect = (workspace: WorkspaceInfo) => {\n onSelect(workspace);\n setIsOpen(false);\n };\n\n const formatDate = (dateStr: string) => {\n try {\n return new Date(dateStr).toLocaleDateString();\n } catch {\n return '';\n }\n };\n\n return (\n <div\n ref={containerRef}\n className={`flowstack-workspace-selector ${className}`}\n >\n <button\n type=\"button\"\n onClick={() => setIsOpen(!isOpen)}\n disabled={isLoading}\n className=\"flowstack-workspace-trigger\"\n >\n <span className=\"flowstack-workspace-value\">\n {selected?.name || placeholder}\n </span>\n <svg\n className={`flowstack-workspace-chevron ${isOpen ? 'open' : ''}`}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n\n {isOpen && (\n <div className=\"flowstack-workspace-dropdown\">\n {workspaces.length === 0 ? (\n <div className=\"flowstack-workspace-empty\">\n No workspaces found\n </div>\n ) : (\n <ul className=\"flowstack-workspace-list\">\n {workspaces.map(workspace => (\n <li key={workspace.workspaceId}>\n <button\n type=\"button\"\n onClick={() => handleSelect(workspace)}\n className={`flowstack-workspace-item ${\n selected?.workspaceId === workspace.workspaceId ? 'selected' : ''\n }`}\n >\n <span className=\"flowstack-workspace-name\">\n {workspace.name}\n </span>\n <span className=\"flowstack-workspace-meta\">\n {workspace.datasetCount} datasets\n {workspace.lastAccessed && ` • ${formatDate(workspace.lastAccessed)}`}\n </span>\n </button>\n </li>\n ))}\n </ul>\n )}\n\n {onCreateNew && (\n <button\n type=\"button\"\n onClick={() => {\n setIsOpen(false);\n onCreateNew();\n }}\n className=\"flowstack-workspace-create\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M8 3V13M3 8H13\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n Create new workspace\n </button>\n )}\n </div>\n )}\n\n <style>{`\n .flowstack-workspace-selector {\n position: relative;\n width: 100%;\n }\n .flowstack-workspace-trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: 0.625rem 0.75rem;\n background: white;\n border: 1px solid #d1d5db;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n cursor: pointer;\n transition: border-color 0.15s;\n }\n .flowstack-workspace-trigger:hover:not(:disabled) {\n border-color: #9ca3af;\n }\n .flowstack-workspace-trigger:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n .flowstack-workspace-value {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .flowstack-workspace-chevron {\n flex-shrink: 0;\n transition: transform 0.15s;\n }\n .flowstack-workspace-chevron.open {\n transform: rotate(180deg);\n }\n .flowstack-workspace-dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n margin-top: 0.25rem;\n background: white;\n border: 1px solid #d1d5db;\n border-radius: 0.375rem;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);\n z-index: 50;\n max-height: 300px;\n overflow-y: auto;\n }\n .flowstack-workspace-empty {\n padding: 1rem;\n text-align: center;\n color: #6b7280;\n font-size: 0.875rem;\n }\n .flowstack-workspace-list {\n list-style: none;\n margin: 0;\n padding: 0.25rem 0;\n }\n .flowstack-workspace-item {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n width: 100%;\n padding: 0.5rem 0.75rem;\n background: none;\n border: none;\n text-align: left;\n cursor: pointer;\n transition: background 0.15s;\n }\n .flowstack-workspace-item:hover {\n background: #f3f4f6;\n }\n .flowstack-workspace-item.selected {\n background: #eff6ff;\n }\n .flowstack-workspace-name {\n font-size: 0.875rem;\n font-weight: 500;\n color: #111827;\n }\n .flowstack-workspace-meta {\n font-size: 0.75rem;\n color: #6b7280;\n margin-top: 0.125rem;\n }\n .flowstack-workspace-create {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.625rem 0.75rem;\n background: none;\n border: none;\n border-top: 1px solid #e5e7eb;\n font-size: 0.875rem;\n color: #3b82f6;\n cursor: pointer;\n transition: background 0.15s;\n }\n .flowstack-workspace-create:hover {\n background: #f3f4f6;\n }\n `}</style>\n </div>\n );\n}\n","'use client';\n\n/**\n * CreateWorkspaceModal Component\n *\n * Modal dialog for creating a new workspace.\n *\n * @example\n * ```tsx\n * function App() {\n * const [showModal, setShowModal] = useState(false);\n *\n * return (\n * <>\n * <button onClick={() => setShowModal(true)}>New Workspace</button>\n * <CreateWorkspaceModal\n * isOpen={showModal}\n * onClose={() => setShowModal(false)}\n * onCreated={(ws) => console.log('Created:', ws.name)}\n * />\n * </>\n * );\n * }\n * ```\n */\n\nimport React, { useState, FormEvent, useEffect, useRef } from 'react';\nimport { useWorkspace } from '../../hooks/useWorkspace';\nimport type { WorkspaceInfo } from '../../types';\n\nexport interface CreateWorkspaceModalProps {\n /** Whether modal is open */\n isOpen: boolean;\n /** Close callback */\n onClose: () => void;\n /** Callback after workspace is created */\n onCreated?: (workspace: WorkspaceInfo) => void;\n /** Custom className */\n className?: string;\n}\n\n/**\n * Create workspace modal\n */\nexport function CreateWorkspaceModal({\n isOpen,\n onClose,\n onCreated,\n className = '',\n}: CreateWorkspaceModalProps) {\n const { createWorkspace, isLoading, error: hookError } = useWorkspace();\n\n const [name, setName] = useState('');\n const [description, setDescription] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Focus input when opened\n useEffect(() => {\n if (isOpen) {\n setName('');\n setDescription('');\n setError(null);\n setTimeout(() => inputRef.current?.focus(), 100);\n }\n }, [isOpen]);\n\n // Handle escape key\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isOpen, onClose]);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n setError(null);\n\n if (!name.trim()) {\n setError('Workspace name is required');\n return;\n }\n\n try {\n const workspace = await createWorkspace(name.trim(), description.trim() || undefined);\n if (workspace) {\n onCreated?.(workspace);\n onClose();\n } else {\n setError(hookError || 'Failed to create workspace');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to create workspace');\n }\n };\n\n if (!isOpen) return null;\n\n const displayError = error || hookError;\n\n return (\n <div className={`flowstack-modal-overlay ${className}`} onClick={onClose}>\n <div\n className=\"flowstack-modal-content\"\n onClick={(e) => e.stopPropagation()}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"flowstack-modal-title\"\n >\n <div className=\"flowstack-modal-header\">\n <h2 id=\"flowstack-modal-title\">Create Workspace</h2>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"flowstack-modal-close\"\n aria-label=\"Close\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M5 5L15 15M15 5L5 15\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </div>\n\n <form onSubmit={handleSubmit}>\n {displayError && (\n <div className=\"flowstack-modal-error\" role=\"alert\">\n {displayError}\n </div>\n )}\n\n <div className=\"flowstack-modal-field\">\n <label htmlFor=\"flowstack-ws-name\">Name *</label>\n <input\n ref={inputRef}\n id=\"flowstack-ws-name\"\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"My Project\"\n disabled={isLoading}\n required\n />\n </div>\n\n <div className=\"flowstack-modal-field\">\n <label htmlFor=\"flowstack-ws-desc\">Description</label>\n <textarea\n id=\"flowstack-ws-desc\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"Optional description...\"\n disabled={isLoading}\n rows={3}\n />\n </div>\n\n <div className=\"flowstack-modal-actions\">\n <button\n type=\"button\"\n onClick={onClose}\n disabled={isLoading}\n className=\"flowstack-modal-cancel\"\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n disabled={isLoading || !name.trim()}\n className=\"flowstack-modal-submit\"\n >\n {isLoading ? 'Creating...' : 'Create Workspace'}\n </button>\n </div>\n </form>\n </div>\n\n <style>{`\n .flowstack-modal-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 100;\n padding: 1rem;\n }\n .flowstack-modal-content {\n background: white;\n border-radius: 0.5rem;\n width: 100%;\n max-width: 400px;\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1);\n }\n .flowstack-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 1rem 1.5rem;\n border-bottom: 1px solid #e5e7eb;\n }\n .flowstack-modal-header h2 {\n font-size: 1.125rem;\n font-weight: 600;\n margin: 0;\n }\n .flowstack-modal-close {\n padding: 0.25rem;\n background: none;\n border: none;\n color: #6b7280;\n cursor: pointer;\n border-radius: 0.25rem;\n transition: color 0.15s;\n }\n .flowstack-modal-close:hover {\n color: #111827;\n }\n .flowstack-modal-content form {\n padding: 1.5rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n }\n .flowstack-modal-error {\n background: #fee2e2;\n border: 1px solid #fecaca;\n color: #dc2626;\n padding: 0.75rem;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n }\n .flowstack-modal-field {\n display: flex;\n flex-direction: column;\n gap: 0.375rem;\n }\n .flowstack-modal-field label {\n font-size: 0.875rem;\n font-weight: 500;\n }\n .flowstack-modal-field input,\n .flowstack-modal-field textarea {\n padding: 0.625rem 0.75rem;\n border: 1px solid #d1d5db;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n resize: vertical;\n }\n .flowstack-modal-field input:focus,\n .flowstack-modal-field textarea:focus {\n outline: none;\n border-color: #3b82f6;\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);\n }\n .flowstack-modal-actions {\n display: flex;\n gap: 0.75rem;\n justify-content: flex-end;\n margin-top: 0.5rem;\n }\n .flowstack-modal-cancel {\n padding: 0.5rem 1rem;\n background: white;\n border: 1px solid #d1d5db;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n cursor: pointer;\n transition: background 0.15s;\n }\n .flowstack-modal-cancel:hover:not(:disabled) {\n background: #f3f4f6;\n }\n .flowstack-modal-submit {\n padding: 0.5rem 1rem;\n background: #3b82f6;\n color: white;\n border: none;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s;\n }\n .flowstack-modal-submit:hover:not(:disabled) {\n background: #2563eb;\n }\n .flowstack-modal-submit:disabled,\n .flowstack-modal-cancel:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n `}</style>\n </div>\n );\n}\n","'use client';\n\n/**\n * DatasetUploader Component\n *\n * Drag-and-drop file uploader for datasets.\n *\n * @example\n * ```tsx\n * function DataPage() {\n * const { uploadDataset } = useDatasets();\n *\n * return (\n * <DatasetUploader\n * onUpload={uploadDataset}\n * onUploadComplete={(dataset) => console.log('Uploaded:', dataset.name)}\n * />\n * );\n * }\n * ```\n */\n\nimport React, { useState, useRef, DragEvent, ChangeEvent } from 'react';\nimport type { DatasetInfo } from '../../types';\n\nexport interface DatasetUploaderProps {\n /** Upload handler */\n onUpload: (file: File, name?: string) => Promise<DatasetInfo | null>;\n /** Callback after successful upload */\n onUploadComplete?: (dataset: DatasetInfo) => void;\n /** Callback on error */\n onError?: (error: string) => void;\n /** Accepted file types */\n accept?: string;\n /** Max file size in MB */\n maxSizeMB?: number;\n /** Custom className */\n className?: string;\n}\n\n/**\n * Dataset uploader component\n */\nexport function DatasetUploader({\n onUpload,\n onUploadComplete,\n onError,\n accept = '.csv,.xlsx,.xls,.json,.parquet',\n maxSizeMB = 100,\n className = '',\n}: DatasetUploaderProps) {\n const [isDragging, setIsDragging] = useState(false);\n const [isUploading, setIsUploading] = useState(false);\n const [progress, setProgress] = useState(0);\n const [error, setError] = useState<string | null>(null);\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleDragOver = (e: DragEvent) => {\n e.preventDefault();\n setIsDragging(true);\n };\n\n const handleDragLeave = (e: DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n };\n\n const handleDrop = (e: DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n\n const files = e.dataTransfer.files;\n if (files.length > 0) {\n handleFile(files[0]);\n }\n };\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (files && files.length > 0) {\n handleFile(files[0]);\n }\n };\n\n const handleFile = async (file: File) => {\n setError(null);\n\n // Validate file size\n const sizeMB = file.size / (1024 * 1024);\n if (sizeMB > maxSizeMB) {\n const errMsg = `File too large. Max size is ${maxSizeMB}MB`;\n setError(errMsg);\n onError?.(errMsg);\n return;\n }\n\n // Validate file type\n const ext = file.name.split('.').pop()?.toLowerCase();\n const acceptedExts = accept.split(',').map(a => a.replace('.', '').trim());\n if (ext && !acceptedExts.includes(ext)) {\n const errMsg = `Invalid file type. Accepted: ${accept}`;\n setError(errMsg);\n onError?.(errMsg);\n return;\n }\n\n setIsUploading(true);\n setProgress(0);\n\n // Simulate progress (actual progress would require XHR)\n const progressInterval = setInterval(() => {\n setProgress(prev => Math.min(prev + 10, 90));\n }, 200);\n\n try {\n const dataset = await onUpload(file);\n clearInterval(progressInterval);\n setProgress(100);\n\n if (dataset) {\n onUploadComplete?.(dataset);\n } else {\n throw new Error('Upload failed');\n }\n } catch (err) {\n clearInterval(progressInterval);\n const errMsg = err instanceof Error ? err.message : 'Upload failed';\n setError(errMsg);\n onError?.(errMsg);\n } finally {\n setIsUploading(false);\n setProgress(0);\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n }\n };\n\n return (\n <div className={`flowstack-uploader ${className}`}>\n <div\n className={`flowstack-uploader-zone ${isDragging ? 'dragging' : ''} ${isUploading ? 'uploading' : ''}`}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={() => inputRef.current?.click()}\n >\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n onChange={handleChange}\n disabled={isUploading}\n hidden\n />\n\n {isUploading ? (\n <div className=\"flowstack-uploader-progress\">\n <div className=\"flowstack-uploader-spinner\" />\n <p>Uploading... {progress}%</p>\n <div className=\"flowstack-uploader-bar\">\n <div\n className=\"flowstack-uploader-fill\"\n style={{ width: `${progress}%` }}\n />\n </div>\n </div>\n ) : (\n <>\n <svg\n className=\"flowstack-uploader-icon\"\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n >\n <path\n d=\"M8 32L8 36C8 38.2091 9.79086 40 12 40H36C38.2091 40 40 38.2091 40 36V32M32 16L24 8M24 8L16 16M24 8V32\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <p className=\"flowstack-uploader-text\">\n <strong>Click to upload</strong> or drag and drop\n </p>\n <p className=\"flowstack-uploader-hint\">\n CSV, Excel, JSON, or Parquet (max {maxSizeMB}MB)\n </p>\n </>\n )}\n </div>\n\n {error && (\n <div className=\"flowstack-uploader-error\" role=\"alert\">\n {error}\n </div>\n )}\n\n <style>{`\n .flowstack-uploader {\n width: 100%;\n }\n .flowstack-uploader-zone {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n border: 2px dashed #d1d5db;\n border-radius: 0.5rem;\n background: #fafafa;\n cursor: pointer;\n transition: border-color 0.15s, background 0.15s;\n }\n .flowstack-uploader-zone:hover,\n .flowstack-uploader-zone.dragging {\n border-color: #3b82f6;\n background: #eff6ff;\n }\n .flowstack-uploader-zone.uploading {\n cursor: default;\n border-style: solid;\n }\n .flowstack-uploader-icon {\n color: #9ca3af;\n margin-bottom: 1rem;\n }\n .flowstack-uploader-text {\n font-size: 0.9375rem;\n color: #374151;\n margin: 0 0 0.25rem;\n }\n .flowstack-uploader-hint {\n font-size: 0.8125rem;\n color: #6b7280;\n margin: 0;\n }\n .flowstack-uploader-progress {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.75rem;\n }\n .flowstack-uploader-spinner {\n width: 32px;\n height: 32px;\n border: 3px solid #e5e7eb;\n border-top-color: #3b82f6;\n border-radius: 50%;\n animation: flowstack-spin 0.8s linear infinite;\n }\n @keyframes flowstack-spin {\n to { transform: rotate(360deg); }\n }\n .flowstack-uploader-progress p {\n margin: 0;\n font-size: 0.875rem;\n color: #374151;\n }\n .flowstack-uploader-bar {\n width: 200px;\n height: 4px;\n background: #e5e7eb;\n border-radius: 2px;\n overflow: hidden;\n }\n .flowstack-uploader-fill {\n height: 100%;\n background: #3b82f6;\n transition: width 0.2s;\n }\n .flowstack-uploader-error {\n margin-top: 0.75rem;\n padding: 0.75rem;\n background: #fee2e2;\n border: 1px solid #fecaca;\n color: #dc2626;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n }\n `}</style>\n </div>\n );\n}\n","/**\n * Mermaid diagram utilities — sanitization and content parsing.\n *\n * Used by both the SDK's MessageList (built apps) and Casino's ChatMessage\n * to safely render LLM-generated Mermaid code.\n */\n\nconst VALID_DIAGRAM_TYPES = [\n 'graph', 'flowchart', 'sequencediagram', 'classdiagram',\n 'statediagram', 'erdiagram', 'gantt', 'pie', 'gitgraph',\n 'mindmap', 'timeline', 'sankey', 'xychart', 'block',\n];\n\n/**\n * Sanitize LLM-generated Mermaid code before passing to the renderer.\n * Strips HTML tags, replaces special characters in labels, and fixes\n * common structural issues that break the Mermaid parser.\n */\nexport function sanitizeMermaidCode(code: string): string {\n if (!code || !code.trim()) return code;\n\n const lines = code.split('\\n');\n const firstNonEmpty = lines.find(l => l.trim())?.trim().toLowerCase() ?? '';\n\n // Only sanitize if it looks like mermaid (starts with a known diagram type)\n if (!VALID_DIAGRAM_TYPES.some(t => firstNonEmpty.startsWith(t))) {\n return code;\n }\n\n let result = code;\n\n // 1. Strip HTML tags (e.g. <br/>, <b>text</b>) — replace with space\n result = result.replace(/<\\/?[a-z][a-z0-9]*\\s*\\/?>/gi, ' ');\n\n // 2. Replace special characters inside node labels [...] and (\"...\")\n // Match [...] brackets (node labels)\n result = result.replace(/\\[([^\\]]*)\\]/g, (_match, inner: string) => {\n const cleaned = inner\n .replace(/&/g, ' and ')\n .replace(/\\|/g, '/')\n .replace(/#(?![0-9a-fA-F]{3,6}\\b)/g, 'no.'); // preserve hex colors\n return `[${cleaned}]`;\n });\n\n // Match (...) parentheses (round node labels)\n result = result.replace(/\\(([^)]*)\\)/g, (_match, inner: string) => {\n const cleaned = inner\n .replace(/&/g, ' and ')\n .replace(/\\|/g, '/')\n .replace(/#(?![0-9a-fA-F]{3,6}\\b)/g, 'no.');\n return `(${cleaned})`;\n });\n\n // 3. Remove blank lines (mermaid can choke on them in some diagram types)\n result = result.replace(/^\\s*$/gm, '').replace(/\\n{2,}/g, '\\n');\n\n // 4. Fix style declarations appended to edge/node lines\n // e.g. \"A --> B style A fill:#f9f\" → \"A --> B\\nstyle A fill:#f9f\"\n result = result.replace(/(\\S)\\s{2,}(style\\s+)/g, '$1\\n$2');\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Content segment splitting — detect ```mermaid blocks in message text\n// ---------------------------------------------------------------------------\n\nexport interface ContentSegment {\n type: 'text' | 'mermaid';\n content: string;\n}\n\nconst MERMAID_BLOCK_RE = /```mermaid\\n([\\s\\S]*?)```/g;\n\n/**\n * Split message content into alternating text and mermaid segments.\n * Text segments preserve everything outside fenced mermaid blocks.\n * Mermaid segments contain only the code inside the fences (trimmed).\n */\nexport function splitContentSegments(text: string): ContentSegment[] {\n if (!text) return [{ type: 'text', content: text ?? '' }];\n\n const segments: ContentSegment[] = [];\n let lastIndex = 0;\n\n for (const match of text.matchAll(MERMAID_BLOCK_RE)) {\n const matchStart = match.index!;\n // Text before this mermaid block\n if (matchStart > lastIndex) {\n const before = text.slice(lastIndex, matchStart);\n if (before.trim()) segments.push({ type: 'text', content: before });\n }\n // The mermaid code (captured group)\n segments.push({ type: 'mermaid', content: match[1].trim() });\n lastIndex = matchStart + match[0].length;\n }\n\n // Remaining text after last block\n if (lastIndex < text.length) {\n const after = text.slice(lastIndex);\n if (after.trim()) segments.push({ type: 'text', content: after });\n }\n\n // If no mermaid blocks found, return the whole thing as text\n if (segments.length === 0) {\n return [{ type: 'text', content: text }];\n }\n\n return segments;\n}\n","'use client';\n\n/**\n * MermaidDiagram — renders sanitized Mermaid code as an SVG diagram.\n *\n * Used by the SDK's MessageList to give built apps diagram rendering.\n * Applies sanitizeMermaidCode before rendering and shows a graceful\n * fallback on parse errors (never exposes parser internals to users).\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { sanitizeMermaidCode } from '../../utils/mermaid-utils';\n\nexport interface MermaidDiagramProps {\n /** Raw Mermaid code (will be sanitized before rendering) */\n code: string;\n}\n\nlet mermaidInitialized = false;\n\nexport function MermaidDiagram({ code }: MermaidDiagramProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [error, setError] = useState(false);\n const [showCode, setShowCode] = useState(false);\n\n useEffect(() => {\n if (!containerRef.current || !code.trim()) return;\n\n let cancelled = false;\n\n async function render() {\n try {\n const mermaid = (await import('mermaid')).default;\n\n if (!mermaidInitialized) {\n mermaid.initialize({\n startOnLoad: false,\n theme: 'neutral',\n securityLevel: 'strict',\n fontFamily: 'inherit',\n });\n mermaidInitialized = true;\n }\n\n const sanitized = sanitizeMermaidCode(code.trim());\n const id = `mermaid-${Math.random().toString(36).slice(2)}`;\n const { svg } = await mermaid.render(id, sanitized);\n\n if (!cancelled && containerRef.current) {\n containerRef.current.innerHTML = svg;\n setError(false);\n }\n } catch {\n if (!cancelled) setError(true);\n }\n }\n\n render();\n return () => { cancelled = true; };\n }, [code]);\n\n if (error) {\n return (\n <div className=\"flowstack-diagram-fallback\">\n <div className=\"flowstack-diagram-fallback-header\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M7 4v3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"7\" cy=\"9.5\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n <span>Diagram could not render</span>\n </div>\n <button\n className=\"flowstack-diagram-toggle\"\n onClick={() => setShowCode(!showCode)}\n >\n {showCode ? 'Hide code' : 'View as code'}\n </button>\n {showCode && (\n <pre className=\"flowstack-diagram-code\">{code}</pre>\n )}\n <style>{`\n .flowstack-diagram-fallback {\n margin: 0.75rem 0;\n padding: 1rem;\n border-radius: 0.5rem;\n border: 1px solid #e5e7eb;\n background: #f9fafb;\n }\n .flowstack-diagram-fallback-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.875rem;\n color: #6b7280;\n }\n .flowstack-diagram-toggle {\n margin-top: 0.5rem;\n font-size: 0.75rem;\n padding: 0.25rem 0.5rem;\n border-radius: 0.25rem;\n border: 1px solid #d1d5db;\n background: white;\n color: #374151;\n cursor: pointer;\n }\n .flowstack-diagram-toggle:hover {\n background: #f3f4f6;\n }\n .flowstack-diagram-code {\n margin-top: 0.5rem;\n font-size: 0.75rem;\n font-family: monospace;\n white-space: pre-wrap;\n overflow-x: auto;\n color: #6b7280;\n background: #f3f4f6;\n padding: 0.5rem;\n border-radius: 0.25rem;\n }\n `}</style>\n </div>\n );\n }\n\n return (\n <>\n <div\n ref={containerRef}\n className=\"flowstack-diagram-container\"\n />\n <style>{`\n .flowstack-diagram-container {\n margin: 0.75rem 0;\n overflow-x: auto;\n border-radius: 0.5rem;\n background: #f9fafb;\n padding: 1rem;\n }\n .flowstack-diagram-container > svg {\n max-width: 100%;\n height: auto;\n }\n `}</style>\n </>\n );\n}\n","'use client';\n\n/**\n * MessageList Component\n *\n * Renders a list of chat messages.\n *\n * @example\n * ```tsx\n * function Chat() {\n * const { messages, isStreaming } = useAgent();\n * return <MessageList messages={messages} isStreaming={isStreaming} />;\n * }\n * ```\n */\n\nimport React from 'react';\nimport type { ChatMessage, ToolCall, VisualizationData } from '../../types';\nimport { splitContentSegments } from '../../utils/mermaid-utils';\nimport { MermaidDiagram } from './MermaidDiagram';\n\nexport interface MessageListProps {\n /** Chat messages */\n messages: ChatMessage[];\n /** Whether agent is streaming */\n isStreaming?: boolean;\n /** Custom className */\n className?: string;\n /** Custom message renderer */\n renderMessage?: (message: ChatMessage) => React.ReactNode;\n /** Custom tool call renderer */\n renderToolCall?: (toolCall: ToolCall) => React.ReactNode;\n /** Custom visualization renderer */\n renderVisualization?: (viz: VisualizationData) => React.ReactNode;\n}\n\n/**\n * Message list component\n */\nexport function MessageList({\n messages,\n isStreaming = false,\n className = '',\n renderMessage,\n renderToolCall,\n renderVisualization,\n}: MessageListProps) {\n const formatTime = (date: Date) => {\n return new Date(date).toLocaleTimeString([], {\n hour: '2-digit',\n minute: '2-digit',\n });\n };\n\n const defaultRenderToolCall = (toolCall: ToolCall) => (\n <div key={toolCall.id} className=\"flowstack-message-tool\">\n <div className=\"flowstack-tool-header\">\n <span className=\"flowstack-tool-name\">{toolCall.name}</span>\n <span className={`flowstack-tool-status ${toolCall.status}`}>\n {toolCall.status === 'running' && (\n <span className=\"flowstack-tool-spinner\" />\n )}\n {toolCall.status}\n </span>\n </div>\n {toolCall.result !== undefined && toolCall.result !== null && (\n <pre className=\"flowstack-tool-result\">\n {typeof toolCall.result === 'string'\n ? toolCall.result\n : JSON.stringify(toolCall.result, null, 2)}\n </pre>\n )}\n </div>\n );\n\n const defaultRenderVisualization = (viz: VisualizationData) => (\n <div key={viz.name} className=\"flowstack-message-viz\">\n {viz.imageUrl ? (\n <img src={viz.imageUrl} alt={viz.name} />\n ) : viz.imageBase64 ? (\n <img\n src={`data:image/${viz.format || 'png'};base64,${viz.imageBase64}`}\n alt={viz.name}\n />\n ) : null}\n <span className=\"flowstack-viz-name\">{viz.name}</span>\n </div>\n );\n\n const defaultRenderMessage = (message: ChatMessage) => (\n <div\n key={message.id}\n className={`flowstack-message ${message.role} ${message.isStreaming ? 'streaming' : ''}`}\n >\n <div className=\"flowstack-message-header\">\n <span className=\"flowstack-message-role\">\n {message.role === 'user' ? 'You' : 'Assistant'}\n </span>\n <span className=\"flowstack-message-time\">\n {formatTime(message.timestamp)}\n </span>\n </div>\n\n <div className=\"flowstack-message-content\">\n {!message.content && message.isStreaming ? (\n <span className=\"flowstack-message-thinking\">Thinking...</span>\n ) : message.isStreaming ? (\n message.content\n ) : (\n splitContentSegments(message.content ?? '').map((seg, i) =>\n seg.type === 'mermaid'\n ? <MermaidDiagram key={`m-${i}`} code={seg.content} />\n : <span key={`t-${i}`}>{seg.content}</span>\n )\n )}\n </div>\n\n {message.toolCalls && message.toolCalls.length > 0 && (\n <div className=\"flowstack-message-tools\">\n {message.toolCalls.map(tc =>\n renderToolCall ? renderToolCall(tc) : defaultRenderToolCall(tc)\n )}\n </div>\n )}\n\n {message.visualizations && message.visualizations.length > 0 && (\n <div className=\"flowstack-message-visualizations\">\n {message.visualizations.map(viz =>\n renderVisualization ? renderVisualization(viz) : defaultRenderVisualization(viz)\n )}\n </div>\n )}\n </div>\n );\n\n return (\n <div className={`flowstack-message-list ${className}`}>\n {messages.length === 0 ? (\n <div className=\"flowstack-message-empty\">\n <p>No messages yet. Start a conversation!</p>\n </div>\n ) : (\n messages.map(message =>\n renderMessage ? renderMessage(message) : defaultRenderMessage(message)\n )\n )}\n\n {isStreaming && messages[messages.length - 1]?.role === 'user' && (\n <div className=\"flowstack-message assistant streaming\">\n <div className=\"flowstack-message-header\">\n <span className=\"flowstack-message-role\">Assistant</span>\n </div>\n <div className=\"flowstack-message-content\">\n <span className=\"flowstack-message-thinking\">\n <span className=\"flowstack-thinking-dot\" />\n <span className=\"flowstack-thinking-dot\" />\n <span className=\"flowstack-thinking-dot\" />\n </span>\n </div>\n </div>\n )}\n\n <style>{`\n .flowstack-message-list {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n }\n .flowstack-message-empty {\n text-align: center;\n color: #6b7280;\n padding: 2rem;\n }\n .flowstack-message {\n max-width: 85%;\n padding: 0.75rem 1rem;\n border-radius: 0.75rem;\n }\n .flowstack-message.user {\n align-self: flex-end;\n background: #3b82f6;\n color: white;\n }\n .flowstack-message.assistant {\n align-self: flex-start;\n background: white;\n border: 1px solid #e5e7eb;\n }\n .flowstack-message-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-bottom: 0.375rem;\n font-size: 0.75rem;\n opacity: 0.7;\n }\n .flowstack-message-role {\n font-weight: 600;\n }\n .flowstack-message-content {\n white-space: pre-wrap;\n word-break: break-word;\n line-height: 1.5;\n }\n .flowstack-message-thinking {\n display: flex;\n gap: 0.25rem;\n }\n .flowstack-thinking-dot {\n width: 6px;\n height: 6px;\n background: #9ca3af;\n border-radius: 50%;\n animation: flowstack-bounce 1.4s ease-in-out infinite both;\n }\n .flowstack-thinking-dot:nth-child(1) { animation-delay: 0s; }\n .flowstack-thinking-dot:nth-child(2) { animation-delay: 0.2s; }\n .flowstack-thinking-dot:nth-child(3) { animation-delay: 0.4s; }\n @keyframes flowstack-bounce {\n 0%, 80%, 100% { transform: scale(0.6); opacity: 0.5; }\n 40% { transform: scale(1); opacity: 1; }\n }\n .flowstack-message-tools {\n margin-top: 0.75rem;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n .flowstack-message-tool {\n background: #f3f4f6;\n border-radius: 0.375rem;\n padding: 0.5rem;\n font-size: 0.8125rem;\n }\n .flowstack-tool-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.5rem;\n }\n .flowstack-tool-name {\n font-family: monospace;\n font-weight: 500;\n }\n .flowstack-tool-status {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n font-size: 0.75rem;\n color: #6b7280;\n }\n .flowstack-tool-status.complete {\n color: #059669;\n }\n .flowstack-tool-status.error {\n color: #dc2626;\n }\n .flowstack-tool-spinner {\n width: 12px;\n height: 12px;\n border: 2px solid #e5e7eb;\n border-top-color: #3b82f6;\n border-radius: 50%;\n animation: flowstack-spin 0.8s linear infinite;\n }\n @keyframes flowstack-spin {\n to { transform: rotate(360deg); }\n }\n .flowstack-tool-result {\n margin: 0.5rem 0 0;\n padding: 0.5rem;\n background: #1f2937;\n color: #e5e7eb;\n border-radius: 0.25rem;\n font-size: 0.75rem;\n overflow-x: auto;\n max-height: 150px;\n }\n .flowstack-message-visualizations {\n margin-top: 0.75rem;\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n }\n .flowstack-message-viz {\n display: flex;\n flex-direction: column;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 0.375rem;\n overflow: hidden;\n }\n .flowstack-message-viz img {\n max-width: 300px;\n max-height: 200px;\n object-fit: contain;\n }\n .flowstack-viz-name {\n padding: 0.25rem 0.5rem;\n font-size: 0.75rem;\n color: #6b7280;\n background: #f9fafb;\n border-top: 1px solid #e5e7eb;\n }\n `}</style>\n </div>\n );\n}\n","'use client';\n\n/**\n * ChatInterface Component\n *\n * Complete chat UI with message list and input.\n *\n * @example\n * ```tsx\n * function ChatPage() {\n * const { messages, query, isStreaming, clearMessages } = useAgent('data-science');\n *\n * return (\n * <ChatInterface\n * messages={messages}\n * isStreaming={isStreaming}\n * onSend={query}\n * onClear={clearMessages}\n * />\n * );\n * }\n * ```\n */\n\nimport React, { useState, useRef, useEffect, FormEvent, KeyboardEvent } from 'react';\nimport { MessageList } from './MessageList';\nimport type { ChatMessage, DataSourceBadgeInfo } from '../../types';\n\nexport interface ChatInterfaceProps {\n /** Chat messages */\n messages: ChatMessage[];\n /** Whether agent is streaming a response */\n isStreaming?: boolean;\n /** Send message callback */\n onSend: (message: string) => void;\n /** Clear messages callback */\n onClear?: () => void;\n /** Cancel current query */\n onCancel?: () => void;\n /** Connected data sources to display as badges */\n dataSources?: DataSourceBadgeInfo[];\n /** Placeholder text */\n placeholder?: string;\n /** Custom className */\n className?: string;\n /** Show clear button */\n showClearButton?: boolean;\n /** Disable input */\n disabled?: boolean;\n}\n\n/**\n * Chat interface component\n */\nexport function ChatInterface({\n messages,\n isStreaming = false,\n onSend,\n onClear,\n onCancel,\n dataSources,\n placeholder = 'Ask a question...',\n className = '',\n showClearButton = true,\n disabled = false,\n}: ChatInterfaceProps) {\n const [input, setInput] = useState('');\n const inputRef = useRef<HTMLTextAreaElement>(null);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n // Auto-scroll to bottom\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, [messages]);\n\n // Auto-resize textarea\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.style.height = 'auto';\n inputRef.current.style.height = `${Math.min(inputRef.current.scrollHeight, 200)}px`;\n }\n }, [input]);\n\n const handleSubmit = (e?: FormEvent) => {\n e?.preventDefault();\n\n const trimmed = input.trim();\n if (!trimmed || isStreaming || disabled) return;\n\n onSend(trimmed);\n setInput('');\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n return (\n <div className={`flowstack-chat ${className}`}>\n <div className=\"flowstack-chat-messages\">\n <MessageList messages={messages} isStreaming={isStreaming} />\n <div ref={messagesEndRef} />\n </div>\n\n {dataSources && dataSources.length > 0 && (\n <div className=\"flowstack-datasource-bar\">\n {dataSources.map((ds) => (\n <span key={ds.source_id} className=\"flowstack-datasource-badge\">\n <span className=\"flowstack-datasource-dot\" />\n {ds.name}\n <span className=\"flowstack-datasource-type\">{ds.type}</span>\n </span>\n ))}\n </div>\n )}\n\n <div className=\"flowstack-chat-input-container\">\n {showClearButton && messages.length > 0 && onClear && (\n <button\n type=\"button\"\n onClick={onClear}\n className=\"flowstack-chat-clear\"\n title=\"Clear messages\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M2 4H14M5 4V3C5 2.44772 5.44772 2 6 2H10C10.5523 2 11 2.44772 11 3V4M12 4V13C12 13.5523 11.5523 14 11 14H5C4.44772 14 4 13.5523 4 13V4H12Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n\n <form onSubmit={handleSubmit} className=\"flowstack-chat-form\">\n <textarea\n ref={inputRef}\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={isStreaming || disabled}\n rows={1}\n className=\"flowstack-chat-input\"\n />\n\n {isStreaming ? (\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"flowstack-chat-cancel\"\n title=\"Cancel\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <rect x=\"4\" y=\"4\" width=\"12\" height=\"12\" rx=\"2\" fill=\"currentColor\" />\n </svg>\n </button>\n ) : (\n <button\n type=\"submit\"\n disabled={!input.trim() || disabled}\n className=\"flowstack-chat-send\"\n title=\"Send\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M3 10L18 3L11 18L9 11L3 10Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n </form>\n </div>\n\n <style>{`\n .flowstack-chat {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: #fafafa;\n }\n .flowstack-chat-messages {\n flex: 1;\n overflow-y: auto;\n padding: 1rem;\n }\n .flowstack-chat-input-container {\n display: flex;\n align-items: flex-end;\n gap: 0.5rem;\n padding: 1rem;\n background: white;\n border-top: 1px solid #e5e7eb;\n }\n .flowstack-chat-clear {\n padding: 0.5rem;\n background: none;\n border: none;\n color: #6b7280;\n cursor: pointer;\n border-radius: 0.375rem;\n transition: color 0.15s, background 0.15s;\n }\n .flowstack-chat-clear:hover {\n color: #dc2626;\n background: #fee2e2;\n }\n .flowstack-chat-form {\n flex: 1;\n display: flex;\n align-items: flex-end;\n gap: 0.5rem;\n background: white;\n border: 1px solid #d1d5db;\n border-radius: 0.5rem;\n padding: 0.5rem;\n }\n .flowstack-chat-input {\n flex: 1;\n border: none;\n outline: none;\n resize: none;\n font-size: 0.9375rem;\n line-height: 1.5;\n max-height: 200px;\n padding: 0.25rem;\n }\n .flowstack-chat-input::placeholder {\n color: #9ca3af;\n }\n .flowstack-chat-send,\n .flowstack-chat-cancel {\n padding: 0.5rem;\n background: #3b82f6;\n color: white;\n border: none;\n border-radius: 0.375rem;\n cursor: pointer;\n transition: background 0.15s;\n }\n .flowstack-chat-send:hover:not(:disabled) {\n background: #2563eb;\n }\n .flowstack-chat-send:disabled {\n background: #9ca3af;\n cursor: not-allowed;\n }\n .flowstack-chat-cancel {\n background: #ef4444;\n }\n .flowstack-chat-cancel:hover {\n background: #dc2626;\n }\n .flowstack-datasource-bar {\n display: flex;\n flex-wrap: wrap;\n gap: 0.375rem;\n padding: 0.5rem 1rem 0;\n }\n .flowstack-datasource-badge {\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.25rem 0.625rem;\n background: #f0fdf4;\n border: 1px solid #bbf7d0;\n border-radius: 999px;\n font-size: 0.75rem;\n color: #166534;\n line-height: 1;\n }\n .flowstack-datasource-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: #22c55e;\n flex-shrink: 0;\n }\n .flowstack-datasource-type {\n text-transform: uppercase;\n font-size: 0.625rem;\n font-weight: 600;\n opacity: 0.7;\n }\n `}</style>\n </div>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport { unflattenMarkdownTables } from '../../utils/stream-utils';\n\nexport interface MarkdownRendererProps {\n content: string;\n isStreaming?: boolean;\n className?: string;\n}\n\nexport function MarkdownRenderer({ content, className }: MarkdownRendererProps) {\n const processed = unflattenMarkdownTables(content ?? '');\n\n return (\n <div className={className} style={{ lineHeight: 1.7 }}>\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={{\n table: ({ children }) => (\n <div style={{ overflowX: 'auto', margin: '8px 0' }}>\n <table style={{ borderCollapse: 'collapse', width: '100%', fontSize: '0.875rem' }}>\n {children}\n </table>\n </div>\n ),\n th: ({ children }) => (\n <th style={{ padding: '6px 12px', borderBottom: '2px solid currentColor', textAlign: 'left', opacity: 0.7 }}>\n {children}\n </th>\n ),\n td: ({ children }) => (\n <td style={{ padding: '6px 12px', borderBottom: '1px solid rgba(128,128,128,0.2)', verticalAlign: 'top' }}>\n {children}\n </td>\n ),\n code: ({ inline, children, ...props }: any) =>\n inline ? (\n <code style={{ background: 'rgba(128,128,128,0.15)', borderRadius: 3, padding: '1px 5px', fontFamily: 'monospace', fontSize: '0.85em' }} {...props}>\n {children}\n </code>\n ) : (\n <pre style={{ background: 'rgba(0,0,0,0.06)', borderRadius: 6, padding: 12, overflowX: 'auto', margin: '8px 0' }}>\n <code style={{ fontFamily: 'monospace', fontSize: '0.85em' }} {...props}>{children}</code>\n </pre>\n ),\n }}\n >\n {processed}\n </ReactMarkdown>\n </div>\n );\n}\n","'use client';\n\n/**\n * AuthPage Component\n *\n * A complete authentication page with login/register tabs.\n *\n * @example\n * ```tsx\n * function LoginPage() {\n * return (\n * <AuthPage\n * defaultTab=\"login\"\n * onSuccess={() => router.push('/dashboard')}\n * logo={<MyLogo />}\n * />\n * );\n * }\n * ```\n */\n\nimport React, { useState, ReactNode } from 'react';\nimport { LoginForm, RegisterForm, GoogleSignIn, BrokeredLoginButton } from '../auth';\nimport { useFlowstack } from '../../context/FlowstackProvider';\n\nexport interface AuthPageProps {\n /** Default tab to show */\n defaultTab?: 'login' | 'register';\n /** Callback when authentication succeeds */\n onSuccess?: () => void;\n /** Callback when authentication fails */\n onError?: (error: string) => void;\n /** Custom logo component */\n logo?: ReactNode;\n /** Page title */\n title?: string;\n /** Show Google Sign In button */\n showGoogle?: boolean;\n /**\n * Show the \"Continue with Flowstack\" brokered-login button as the primary\n * CTA (P0-60). Defaults to true — this is the unified-login path for built\n * apps. Casino itself should pass `false` to avoid opening a broker popup\n * from the same origin that hosts the broker.\n */\n showFlowstackBroker?: boolean;\n /**\n * Override the broker URL (default https://openinferencefoundation.org/auth/broker).\n * Useful for staging or local development.\n */\n brokerUrl?: string;\n /** Custom footer content */\n footer?: ReactNode;\n /** Additional CSS class */\n className?: string;\n /** Custom styles for the container */\n containerClassName?: string;\n /** Custom styles for the card */\n cardClassName?: string;\n}\n\n/**\n * Complete authentication page component\n */\nexport function AuthPage({\n defaultTab = 'login',\n onSuccess,\n onError,\n logo,\n title,\n showGoogle = false,\n showFlowstackBroker = true,\n brokerUrl,\n footer,\n className = '',\n containerClassName = '',\n cardClassName = '',\n}: AuthPageProps) {\n const [activeTab, setActiveTab] = useState<'login' | 'register'>(defaultTab);\n const { config } = useFlowstack();\n\n const hasGoogle = showGoogle && config.auth?.providers?.includes('google');\n\n return (\n <div className={`flowstack-auth-page ${className}`}>\n <div className={`flowstack-auth-container ${containerClassName}`}>\n <div className={`flowstack-auth-card ${cardClassName}`}>\n {/* Logo */}\n {logo && <div className=\"flowstack-auth-logo\">{logo}</div>}\n\n {/* Title */}\n <h1 className=\"flowstack-auth-title\">\n {title || (activeTab === 'login' ? 'Welcome back' : 'Create account')}\n </h1>\n\n {/* P0-60: Continue with Flowstack (brokered SSO) — primary CTA.\n Lets users reuse their Casino identity + wallet in any built app. */}\n {showFlowstackBroker && (\n <>\n <div className=\"flowstack-auth-broker\">\n <BrokeredLoginButton\n brokerUrl={brokerUrl}\n onSuccess={() => onSuccess?.()}\n />\n </div>\n <div className=\"flowstack-auth-divider\">\n <span>or sign in with email</span>\n </div>\n </>\n )}\n\n {/* Tabs */}\n <div className=\"flowstack-auth-tabs\">\n <button\n type=\"button\"\n className={`flowstack-auth-tab ${activeTab === 'login' ? 'active' : ''}`}\n onClick={() => setActiveTab('login')}\n >\n Sign In\n </button>\n <button\n type=\"button\"\n className={`flowstack-auth-tab ${activeTab === 'register' ? 'active' : ''}`}\n onClick={() => setActiveTab('register')}\n >\n Sign Up\n </button>\n </div>\n\n {/* Forms */}\n <div className=\"flowstack-auth-form-container\">\n {activeTab === 'login' ? (\n <LoginForm\n onSuccess={onSuccess}\n onError={onError}\n showRegisterLink={false}\n />\n ) : (\n <RegisterForm\n onSuccess={onSuccess}\n onError={onError}\n showLoginLink={false}\n />\n )}\n </div>\n\n {/* Divider */}\n {hasGoogle && (\n <div className=\"flowstack-auth-divider\">\n <span>or</span>\n </div>\n )}\n\n {/* Google Sign In */}\n {hasGoogle && (\n <div className=\"flowstack-auth-social\">\n <GoogleSignIn onSuccess={onSuccess} onError={onError} />\n </div>\n )}\n\n {/* Footer */}\n {footer && <div className=\"flowstack-auth-footer\">{footer}</div>}\n </div>\n </div>\n\n <style>{`\n .flowstack-auth-page {\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #f5f7fa 0%, #e4e8ec 100%);\n padding: 20px;\n }\n\n .flowstack-auth-container {\n width: 100%;\n max-width: 420px;\n }\n\n .flowstack-auth-card {\n background: white;\n border-radius: 12px;\n box-shadow: 0 4px 24px rgba(0, 0, 0, 0.08);\n padding: 40px;\n }\n\n .flowstack-auth-logo {\n display: flex;\n justify-content: center;\n margin-bottom: 24px;\n }\n\n .flowstack-auth-title {\n font-size: 24px;\n font-weight: 600;\n text-align: center;\n color: #1a1a1a;\n margin: 0 0 24px 0;\n }\n\n .flowstack-auth-tabs {\n display: flex;\n gap: 8px;\n margin-bottom: 24px;\n background: #f5f5f5;\n padding: 4px;\n border-radius: 8px;\n }\n\n .flowstack-auth-tab {\n flex: 1;\n padding: 10px 16px;\n border: none;\n background: transparent;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n color: #666;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .flowstack-auth-tab.active {\n background: white;\n color: #1a1a1a;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n }\n\n .flowstack-auth-tab:hover:not(.active) {\n color: #1a1a1a;\n }\n\n .flowstack-auth-form-container {\n margin-bottom: 16px;\n }\n\n .flowstack-auth-broker {\n margin-bottom: 20px;\n }\n\n .flowstack-auth-divider {\n display: flex;\n align-items: center;\n gap: 16px;\n margin: 24px 0;\n color: #999;\n font-size: 14px;\n }\n\n .flowstack-auth-divider::before,\n .flowstack-auth-divider::after {\n content: '';\n flex: 1;\n height: 1px;\n background: #e5e5e5;\n }\n\n .flowstack-auth-social {\n margin-top: 16px;\n }\n\n .flowstack-auth-footer {\n margin-top: 24px;\n text-align: center;\n font-size: 14px;\n color: #666;\n }\n\n @media (max-width: 480px) {\n .flowstack-auth-card {\n padding: 24px;\n }\n\n .flowstack-auth-title {\n font-size: 20px;\n }\n }\n `}</style>\n </div>\n );\n}\n","'use client';\n\n/**\n * DashboardLayout Component\n *\n * A responsive dashboard layout with sidebar, header, and main content area.\n *\n * @example\n * ```tsx\n * function Dashboard() {\n * return (\n * <DashboardLayout\n * sidebar={<Sidebar />}\n * header={<Header />}\n * >\n * <MainContent />\n * </DashboardLayout>\n * );\n * }\n * ```\n */\n\nimport React, { ReactNode, useState } from 'react';\nimport { useFlowstack } from '../../context/FlowstackProvider';\n\nexport interface DashboardLayoutProps {\n /** Main content */\n children: ReactNode;\n /** Sidebar content */\n sidebar?: ReactNode;\n /** Header content */\n header?: ReactNode;\n /** Footer content */\n footer?: ReactNode;\n /** Show workspace selector in header */\n showWorkspaceSelector?: boolean;\n /** Show user menu in header */\n showUserMenu?: boolean;\n /** Sidebar collapsed by default */\n sidebarCollapsed?: boolean;\n /** Sidebar width in pixels */\n sidebarWidth?: number;\n /** Header height in pixels */\n headerHeight?: number;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Dashboard layout component with responsive sidebar\n */\nexport function DashboardLayout({\n children,\n sidebar,\n header,\n footer,\n showWorkspaceSelector = true,\n showUserMenu = true,\n sidebarCollapsed = false,\n sidebarWidth = 260,\n headerHeight = 64,\n className = '',\n}: DashboardLayoutProps) {\n const [isCollapsed, setIsCollapsed] = useState(sidebarCollapsed);\n const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);\n\n const { credentials, selectedWorkspace, workspaces, logout } = useFlowstack();\n\n const toggleSidebar = () => setIsCollapsed(!isCollapsed);\n const toggleMobileMenu = () => setIsMobileMenuOpen(!isMobileMenuOpen);\n\n return (\n <div className={`flowstack-dashboard ${className}`}>\n {/* Sidebar */}\n {sidebar && (\n <>\n <aside\n className={`flowstack-sidebar ${isCollapsed ? 'collapsed' : ''} ${isMobileMenuOpen ? 'mobile-open' : ''}`}\n style={{ width: isCollapsed ? 80 : sidebarWidth }}\n >\n <div className=\"flowstack-sidebar-content\">{sidebar}</div>\n <button\n className=\"flowstack-sidebar-toggle\"\n onClick={toggleSidebar}\n aria-label={isCollapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n >\n {isCollapsed ? '>' : '<'}\n </button>\n </aside>\n {isMobileMenuOpen && (\n <div\n className=\"flowstack-sidebar-overlay\"\n onClick={toggleMobileMenu}\n />\n )}\n </>\n )}\n\n {/* Main content area */}\n <div\n className=\"flowstack-main-wrapper\"\n style={{\n marginLeft: sidebar ? (isCollapsed ? 80 : sidebarWidth) : 0,\n }}\n >\n {/* Header */}\n <header\n className=\"flowstack-header\"\n style={{ height: headerHeight }}\n >\n {sidebar && (\n <button\n className=\"flowstack-mobile-menu-toggle\"\n onClick={toggleMobileMenu}\n aria-label=\"Toggle menu\"\n >\n <span></span>\n <span></span>\n <span></span>\n </button>\n )}\n\n {header || (\n <div className=\"flowstack-header-default\">\n {showWorkspaceSelector && selectedWorkspace && (\n <div className=\"flowstack-workspace-badge\">\n <span className=\"flowstack-workspace-label\">Workspace:</span>\n <span className=\"flowstack-workspace-name\">\n {selectedWorkspace.name}\n </span>\n </div>\n )}\n\n <div className=\"flowstack-header-spacer\" />\n\n {showUserMenu && credentials && (\n <div className=\"flowstack-user-menu\">\n <span className=\"flowstack-user-email\">\n {credentials.email}\n </span>\n <button\n className=\"flowstack-logout-btn\"\n onClick={() => logout()}\n >\n Logout\n </button>\n </div>\n )}\n </div>\n )}\n </header>\n\n {/* Main content */}\n <main className=\"flowstack-main-content\">\n {children}\n </main>\n\n {/* Footer */}\n {footer && <footer className=\"flowstack-footer\">{footer}</footer>}\n </div>\n\n <style>{`\n .flowstack-dashboard {\n min-height: 100vh;\n background: #f8f9fa;\n }\n\n .flowstack-sidebar {\n position: fixed;\n top: 0;\n left: 0;\n height: 100vh;\n background: #1a1a2e;\n color: white;\n transition: width 0.2s ease, transform 0.2s ease;\n z-index: 1000;\n display: flex;\n flex-direction: column;\n }\n\n .flowstack-sidebar-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n }\n\n .flowstack-sidebar-toggle {\n position: absolute;\n right: -12px;\n top: 50%;\n transform: translateY(-50%);\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: #1a1a2e;\n border: 2px solid #e5e5e5;\n color: white;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n }\n\n .flowstack-sidebar-toggle:hover {\n background: #2a2a4e;\n }\n\n .flowstack-sidebar-overlay {\n display: none;\n }\n\n .flowstack-main-wrapper {\n min-height: 100vh;\n transition: margin-left 0.2s ease;\n display: flex;\n flex-direction: column;\n }\n\n .flowstack-header {\n position: sticky;\n top: 0;\n background: white;\n border-bottom: 1px solid #e5e5e5;\n display: flex;\n align-items: center;\n padding: 0 24px;\n z-index: 100;\n }\n\n .flowstack-mobile-menu-toggle {\n display: none;\n flex-direction: column;\n gap: 4px;\n background: none;\n border: none;\n padding: 8px;\n cursor: pointer;\n margin-right: 16px;\n }\n\n .flowstack-mobile-menu-toggle span {\n display: block;\n width: 20px;\n height: 2px;\n background: #333;\n }\n\n .flowstack-header-default {\n flex: 1;\n display: flex;\n align-items: center;\n }\n\n .flowstack-workspace-badge {\n display: flex;\n align-items: center;\n gap: 8px;\n background: #f0f0f0;\n padding: 6px 12px;\n border-radius: 6px;\n font-size: 14px;\n }\n\n .flowstack-workspace-label {\n color: #666;\n }\n\n .flowstack-workspace-name {\n font-weight: 500;\n color: #1a1a1a;\n }\n\n .flowstack-header-spacer {\n flex: 1;\n }\n\n .flowstack-user-menu {\n display: flex;\n align-items: center;\n gap: 16px;\n }\n\n .flowstack-user-email {\n font-size: 14px;\n color: #666;\n }\n\n .flowstack-logout-btn {\n background: none;\n border: 1px solid #ddd;\n padding: 6px 12px;\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .flowstack-logout-btn:hover {\n background: #f5f5f5;\n border-color: #ccc;\n }\n\n .flowstack-main-content {\n flex: 1;\n padding: 24px;\n }\n\n .flowstack-footer {\n background: white;\n border-top: 1px solid #e5e5e5;\n padding: 16px 24px;\n }\n\n @media (max-width: 768px) {\n .flowstack-sidebar {\n transform: translateX(-100%);\n width: 260px !important;\n }\n\n .flowstack-sidebar.mobile-open {\n transform: translateX(0);\n }\n\n .flowstack-sidebar-toggle {\n display: none;\n }\n\n .flowstack-sidebar-overlay {\n display: block;\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n z-index: 999;\n }\n\n .flowstack-main-wrapper {\n margin-left: 0 !important;\n }\n\n .flowstack-mobile-menu-toggle {\n display: flex;\n }\n\n .flowstack-main-content {\n padding: 16px;\n }\n }\n `}</style>\n </div>\n );\n}\n","'use client';\n\n/**\n * ChatPage Component\n *\n * A complete chat interface page with message history and streaming support.\n *\n * @example\n * ```tsx\n * function AIChat() {\n * return (\n * <ChatPage\n * title=\"AI Assistant\"\n * placeholder=\"Ask me anything...\"\n * />\n * );\n * }\n * ```\n */\n\nimport React, { ReactNode, useEffect, useRef } from 'react';\nimport { useAgent } from '../../hooks/useAgent';\nimport { ChatInterface, MessageList } from '../chat';\n\nexport interface ChatPageProps {\n /** Page title */\n title?: string;\n /** Chat input placeholder */\n placeholder?: string;\n /** Welcome message when no messages */\n welcomeMessage?: ReactNode;\n /** Header content */\n header?: ReactNode;\n /** Sidebar content */\n sidebar?: ReactNode;\n /** Show clear button */\n showClearButton?: boolean;\n /** Show cancel button during streaming */\n showCancelButton?: boolean;\n /** Additional CSS class */\n className?: string;\n /** Callback when a message is sent */\n onMessageSent?: (message: string) => void;\n /** Callback when an error occurs */\n onError?: (error: string) => void;\n}\n\n/**\n * Complete chat page component\n */\nexport function ChatPage({\n title = 'AI Chat',\n placeholder = 'Type your message...',\n welcomeMessage,\n header,\n sidebar,\n showClearButton = true,\n showCancelButton = true,\n className = '',\n onMessageSent,\n onError,\n}: ChatPageProps) {\n const {\n messages,\n isStreaming,\n isLoading,\n error,\n query,\n clearMessages,\n cancelQuery,\n } = useAgent('data-science', { tools: ['code_interpreter', 'data_analysis', 'visualization'] });\n\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n // Auto-scroll to bottom when new messages arrive\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, [messages]);\n\n // Handle error callback\n useEffect(() => {\n if (error && onError) {\n onError(error);\n }\n }, [error, onError]);\n\n const handleSend = async (message: string) => {\n if (onMessageSent) {\n onMessageSent(message);\n }\n await query(message);\n };\n\n const showWelcome = messages.length === 0 && !isLoading;\n\n return (\n <div className={`flowstack-chat-page ${className}`}>\n {/* Sidebar */}\n {sidebar && <aside className=\"flowstack-chat-sidebar\">{sidebar}</aside>}\n\n {/* Main chat area */}\n <div className=\"flowstack-chat-main\">\n {/* Header */}\n <div className=\"flowstack-chat-header\">\n {header || <h1 className=\"flowstack-chat-title\">{title}</h1>}\n </div>\n\n {/* Messages area */}\n <div className=\"flowstack-chat-messages\">\n {showWelcome && welcomeMessage && (\n <div className=\"flowstack-chat-welcome\">{welcomeMessage}</div>\n )}\n\n {showWelcome && !welcomeMessage && (\n <div className=\"flowstack-chat-welcome\">\n <div className=\"flowstack-chat-welcome-icon\">AI</div>\n <h2>How can I help you today?</h2>\n <p>Ask me anything about your data or request analysis.</p>\n </div>\n )}\n\n <MessageList messages={messages} />\n <div ref={messagesEndRef} />\n </div>\n\n {/* Error message */}\n {error && (\n <div className=\"flowstack-chat-error\">\n <span className=\"flowstack-chat-error-icon\">!</span>\n {error}\n </div>\n )}\n\n {/* Input area */}\n <div className=\"flowstack-chat-input-area\">\n <ChatInterface\n messages={messages}\n isStreaming={isStreaming}\n onSend={handleSend}\n onClear={showClearButton ? clearMessages : undefined}\n onCancel={showCancelButton ? cancelQuery : undefined}\n placeholder={placeholder}\n disabled={isLoading}\n showClearButton={showClearButton && messages.length > 0}\n />\n </div>\n </div>\n\n <style>{`\n .flowstack-chat-page {\n display: flex;\n height: 100dvh;\n overflow: hidden;\n background: #f8f9fa;\n }\n\n .flowstack-chat-sidebar {\n width: 280px;\n background: white;\n border-right: 1px solid #e5e5e5;\n flex-shrink: 0;\n }\n\n .flowstack-chat-main {\n flex: 1;\n display: flex;\n flex-direction: column;\n max-width: 900px;\n margin: 0 auto;\n width: 100%;\n }\n\n .flowstack-chat-header {\n padding: 16px 24px;\n background: white;\n border-bottom: 1px solid #e5e5e5;\n }\n\n .flowstack-chat-title {\n font-size: 20px;\n font-weight: 600;\n margin: 0;\n color: #1a1a1a;\n }\n\n .flowstack-chat-messages {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n }\n\n .flowstack-chat-welcome {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 48px 24px;\n color: #666;\n }\n\n .flowstack-chat-welcome-icon {\n width: 64px;\n height: 64px;\n border-radius: 50%;\n background: linear-gradient(135deg, #3b82f6 0%, #8b5cf6 100%);\n color: white;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 24px;\n font-weight: 600;\n margin-bottom: 24px;\n }\n\n .flowstack-chat-welcome h2 {\n font-size: 24px;\n font-weight: 600;\n color: #1a1a1a;\n margin: 0 0 8px 0;\n }\n\n .flowstack-chat-welcome p {\n font-size: 16px;\n margin: 0;\n max-width: 400px;\n }\n\n .flowstack-chat-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 24px;\n background: #fef2f2;\n color: #dc2626;\n font-size: 14px;\n }\n\n .flowstack-chat-error-icon {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: #dc2626;\n color: white;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: bold;\n }\n\n .flowstack-chat-input-area {\n padding: 16px 24px;\n background: white;\n border-top: 1px solid #e5e5e5;\n }\n\n @media (max-width: 768px) {\n .flowstack-chat-sidebar {\n display: none;\n }\n\n .flowstack-chat-messages {\n padding: 16px;\n }\n\n .flowstack-chat-input-area {\n padding: 12px 16px;\n }\n }\n `}</style>\n </div>\n );\n}\n","/**\n * Flowstack SDK Type Definitions\n * Complete Backend-as-a-Service types for AI-powered apps\n */\n\n// =============================================================================\n// Configuration\n// =============================================================================\n\n/**\n * Main SDK configuration\n */\nexport interface FlowstackConfig {\n /** JWT secret for token signing/verification.\n * Optional for built apps using the broker auth flow (BrokeredLoginButton). */\n jwtSecret?: string;\n /** Secret for password hashing.\n * Optional for built apps using the broker auth flow (BrokeredLoginButton). */\n passwordSecret?: string;\n /** Flowstack API base URL (default: https://sage-api.flowstack.fun) */\n baseUrl?: string;\n /** Tenant ID (default: shared tenant) */\n tenantId?: string;\n /** Auth providers configuration */\n auth?: AuthConfig;\n /** Redis cache configuration */\n redis?: RedisConfig;\n /** Database configuration for user accounts */\n database?: DatabaseConfig;\n /** Default agent template */\n agentTemplate?: AgentTemplate;\n /** Base URL for standalone agent service (e.g., openai-agent ALB endpoint) */\n agentServiceUrl?: string;\n /** Credential storage strategy */\n storage?: 'local' | 'session';\n /** SDK mode: production (default), development (relaxed validation), or mock (uses fixtures) */\n mode?: 'production' | 'development' | 'mock';\n /** Privy embedded wallet config (enables email/Google signup with auto-wallet) */\n privyConfig?: { appId: string };\n /** Blockchain chain for INFER token integration */\n chain?: 'arbitrum-sepolia' | 'arbitrum';\n /** MoonPay/Transak fiat on-ramp config */\n onRampConfig?: { apiKey: string; environment: 'sandbox' | 'production' };\n /** App scope (site_id) for built apps — scopes user data to this app's MongoDB collections.\n * Set automatically by the site builder. When present, login/register embeds it in the JWT\n * and all MongoDB operations are scoped to {appScope}__* collections. */\n appScope?: string;\n}\n\nexport interface AuthConfig {\n /** Enabled auth providers */\n providers: ('email' | 'google')[];\n /** Google OAuth client ID */\n googleClientId?: string;\n /** Google OAuth client secret (server-side only) */\n googleClientSecret?: string;\n /** Require email verification */\n emailVerification?: boolean;\n /** Minimum password length (default: 8) */\n passwordMinLength?: number;\n}\n\nexport interface RedisConfig {\n /** Upstash Redis REST URL */\n url: string;\n /** Upstash Redis REST token */\n token: string;\n}\n\nexport interface DatabaseConfig {\n /** Supabase project URL */\n supabaseUrl: string;\n /** Supabase service role key */\n supabaseKey: string;\n}\n\n// =============================================================================\n// Authentication\n// =============================================================================\n\n/**\n * User information for authentication\n */\nexport interface User {\n /** Unique user identifier */\n id: string;\n /** User email address */\n email: string;\n /** Tenant ID the user belongs to */\n tenantId: string;\n /** Token expiration (ISO timestamp) */\n expiresAt?: string;\n}\n\n/**\n * User credentials stored after authentication\n */\nexport interface FlowstackCredentials {\n /** JWT session token */\n apiKey: string;\n /** Tenant ID */\n tenantId: string;\n /** User ID for isolation */\n userId?: string;\n /** User email */\n email?: string;\n /** Token expiration (ISO timestamp) */\n expiresAt?: string;\n}\n\nexport interface LoginRequest {\n email: string;\n password: string;\n}\n\nexport interface LoginResponse {\n success: boolean;\n sessionToken?: string;\n email?: string;\n tenantId?: string;\n userId?: string;\n expiresAt?: string;\n error?: string;\n}\n\nexport interface RegisterRequest {\n email: string;\n password: string;\n name?: string;\n}\n\nexport interface RegisterResponse {\n success: boolean;\n message?: string;\n requiresVerification?: boolean;\n error?: string;\n}\n\nexport interface GoogleAuthResponse {\n success: boolean;\n sessionToken?: string;\n email?: string;\n tenantId?: string;\n userId?: string;\n expiresAt?: string;\n error?: string;\n}\n\n// =============================================================================\n// Session & Workspace\n// =============================================================================\n\nexport interface SessionState {\n sessionId: string | null;\n workspaceId: string | null;\n isConnected: boolean;\n lastActivity: Date | null;\n}\n\nexport interface WorkspaceInfo {\n workspaceId: string;\n name: string;\n description?: string;\n datasetCount: number;\n visualizationCount: number;\n modelCount: number;\n createdAt: string;\n lastAccessed: string;\n}\n\nexport interface CreateWorkspaceRequest {\n name: string;\n description?: string;\n}\n\n// =============================================================================\n// Datasets\n// =============================================================================\n\nexport interface DatasetInfo {\n id: string;\n name: string;\n rows: number;\n columns: number;\n schema?: Record<string, ColumnSchema>;\n columnNames?: string[];\n createdAt?: string;\n updatedAt?: string;\n}\n\nexport interface ColumnSchema {\n type: 'string' | 'number' | 'boolean' | 'date' | 'object';\n nullable: boolean;\n unique?: boolean;\n}\n\nexport interface DatasetRow {\n [key: string]: unknown;\n}\n\nexport type DatasetCellValue = string | number | boolean | null;\n\nexport interface DatasetPreview {\n columns: string[];\n rows: DatasetCellValue[][];\n}\n\nexport interface DatasetStreamOptions {\n limit?: number;\n offset?: number;\n}\n\n// =============================================================================\n// Visualizations\n// =============================================================================\n\nexport interface VisualizationData {\n name: string;\n type?: string;\n imageUrl?: string;\n imageBase64?: string;\n format?: 'png' | 'jpeg' | 'svg' | 'html' | string;\n createdAt?: string;\n metadata?: Record<string, unknown>;\n}\n\n// =============================================================================\n// Reports\n// =============================================================================\n\nexport interface ReportInfo {\n id: string;\n name: string;\n format: string;\n url: string;\n size?: number;\n createdAt?: string;\n}\n\n// =============================================================================\n// Published Sites\n// =============================================================================\n\nexport interface PublishedSiteInfo {\n id: string;\n name: string;\n url: string;\n shortUrl?: string;\n siteType: 'on_demand' | 'daily' | 'js_build';\n fileCount: number;\n totalBytes?: number;\n createdAt: string;\n expiresAt?: string;\n description?: string;\n metadata?: Record<string, unknown>;\n currentVersion?: number;\n liveVersion?: number;\n subdomainUrl?: string;\n alias?: string | null;\n}\n\nexport interface CreateSiteParams {\n name: string;\n siteType?: 'on_demand' | 'daily' | 'js_build';\n description?: string;\n files?: Record<string, string>;\n}\n\nexport interface UseSitesReturn {\n sites: PublishedSiteInfo[];\n isLoading: boolean;\n error: string | null;\n createSite: (params: CreateSiteParams) => Promise<PublishedSiteInfo | null>;\n addFile: (siteId: string, path: string, content: string) => Promise<boolean>;\n publishSite: (siteId: string) => Promise<PublishedSiteInfo | null>;\n deleteSite: (siteId: string) => Promise<boolean>;\n refreshSites: () => Promise<void>;\n}\n\n// =============================================================================\n// Site Versioning\n// =============================================================================\n\nexport interface SiteVersion {\n version: number;\n type: 'build' | 'edit';\n createdAt: string;\n description?: string;\n fileCount: number;\n totalBytes: number;\n url: string;\n}\n\nexport interface SiteVersionManifest {\n siteId: string;\n name: string;\n liveVersion: number;\n versions: SiteVersion[];\n alias?: string | null;\n githubRepo?: {\n owner: string;\n repo: string;\n url: string;\n } | null;\n}\n\nexport interface UseSiteVersionsReturn {\n versions: SiteVersion[];\n liveVersion: number | null;\n isLoading: boolean;\n error: string | null;\n promote: (version: number) => Promise<boolean>;\n deleteVersion: (version: number) => Promise<boolean>;\n refresh: () => Promise<void>;\n}\n\nexport interface PublishToGitHubParams {\n repoName: string;\n isPrivate?: boolean;\n version?: number;\n}\n\nexport interface PublishToGitHubResult {\n repoUrl: string;\n commitSha: string;\n}\n\n// =============================================================================\n// Agent Discovery\n// =============================================================================\n\nexport interface AgentInfo {\n /** Agent identifier (used in targetAgent parameter) */\n name: string;\n /** Human-readable description of what this agent does */\n description: string;\n /** Tools available to this agent */\n tools: string[];\n /** Example phrases that trigger this agent */\n triggerPhrases: string[];\n /** Use cases this agent handles */\n useFor: string[];\n /** Whether this agent owns its full pipeline (never hands off) */\n isTerminal: boolean;\n}\n\nexport interface UseAgentsReturn {\n /** Available agents */\n agents: AgentInfo[];\n /** Loading state */\n isLoading: boolean;\n /** Error message */\n error: string | null;\n /** Refresh the agent list */\n refreshAgents: () => Promise<void>;\n}\n\n// =============================================================================\n// ML Models\n// =============================================================================\n\nexport interface ModelInfo {\n id: string;\n name: string;\n format: string;\n size_bytes: number;\n last_modified?: string;\n download_url?: string;\n metadata?: Record<string, unknown>;\n s3_key?: string;\n}\n\n// =============================================================================\n// Scripts\n// =============================================================================\n\nexport interface ScriptInfo {\n name: string;\n extension: string;\n size_bytes?: number;\n created_at?: string;\n modified_at?: string;\n content?: string;\n metadata?: Record<string, unknown>;\n}\n\n// =============================================================================\n// Data Sources\n// =============================================================================\n\nexport type DataSourceType = 'mongodb' | 'postgresql' | 's3';\n\nexport interface DataSource {\n source_id: string;\n tenant_id: string;\n source_type: DataSourceType;\n name: string;\n auth_method: string;\n is_tenant_wide: boolean;\n user_id?: string;\n credentials_preview?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n created_at: number;\n updated_at?: number;\n}\n\nexport interface DataSourceConfig {\n type: DataSourceType;\n name: string;\n connectionString?: string;\n auth_method?: string;\n credentials?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n is_tenant_wide?: boolean;\n}\n\nexport interface ConnectionTestResult {\n success: boolean;\n message: string;\n details?: Record<string, unknown>;\n}\n\n// =============================================================================\n// Chat & Messages\n// =============================================================================\n\nexport interface ChatMessage {\n id: string;\n role: 'user' | 'assistant';\n content: string;\n timestamp: Date;\n toolCalls?: ToolCall[];\n visualizations?: VisualizationData[];\n searchResults?: SearchResultsData[];\n isStreaming?: boolean;\n /** Live status text shown during streaming (tool progress, agent status) */\n statusLine?: string;\n /** P0-57: PII entities that were masked in this message (user messages only) */\n piiRedacted?: PiiRedactedEntity[];\n /** Filenames the user attached when sending this message (user messages only).\n * Set by useAgent.query() after a successful upload so the chat UI can\n * render an attachment chip on the persisted message. */\n attachmentNames?: string[];\n}\n\n/**\n * Input shape accepted by `useAgent.query()` for file attachments. Either a\n * native `File` (preferred — no double-encode) or an already-base64-encoded\n * payload matching the chat-input wire format. The SDK uploads each one to\n * the workspace via `/upload` before streaming and prepends the resolved\n * dataset names to the prompt so the agent grounds on the right file\n * instead of rummaging the user's library.\n */\nexport type AttachmentInput =\n | File\n | { filename: string; content_type: string; data: string };\n\nexport interface ToolCall {\n id: string;\n toolUseId?: string;\n name: string;\n args?: Record<string, unknown>;\n result?: unknown;\n agentResponse?: string;\n status: 'pending' | 'running' | 'complete' | 'error';\n startTime?: number;\n endTime?: number;\n}\n\nexport interface SearchResult {\n rank: number;\n title: string;\n url: string;\n content: string;\n score: number;\n}\n\nexport interface SearchResultsData {\n search_id: string;\n query: string;\n result_count: number;\n results: SearchResult[];\n answer?: string;\n}\n\n// =============================================================================\n// Streaming Events\n// =============================================================================\n\nexport interface StreamEvent {\n type: StreamEventType;\n content?: string;\n tool?: string;\n toolUseId?: string;\n args?: Record<string, unknown>;\n result?: unknown;\n /** P0-132 (G1): backend emits the tool's return value under `content` and an\n * `is_error` flag on `tool_result` events. Surfaced here so useAgent can mark\n * failed tool calls as 'error' instead of silently 'complete'. */\n isError?: boolean;\n error?: string;\n data?: unknown;\n message?: string;\n percentage?: number;\n}\n\nexport type StreamEventType =\n | 'content'\n | 'text'\n | 'delta'\n | 'metadata'\n | 'tool_call'\n | 'tool_use'\n | 'tool_result'\n | 'visualization'\n | 'progress'\n | 'credit_status'\n | 'budget_update'\n | 'complete'\n | 'done'\n | 'error'\n | 'interrupt';\n\nexport interface InterruptInfo {\n reason: string;\n timestamp?: number;\n}\n\nexport interface DataSourceBadgeInfo {\n source_id: string;\n type: string;\n name: string;\n}\n\n// =============================================================================\n// Agent Templates\n// =============================================================================\n\nexport type AgentTemplate = 'data-science' | 'marketing' | 'support' | 'custom';\n\nexport interface AgentConfig {\n template: AgentTemplate;\n systemPrompt?: string;\n tools?: string[];\n streaming?: boolean;\n networkMode?: 'SANDBOX' | 'PUBLIC';\n}\n\n// =============================================================================\n// Query Execution\n// =============================================================================\n\nexport interface QueryOptions {\n workspaceId?: string;\n networkMode?: 'SANDBOX' | 'PUBLIC';\n tools?: string[];\n}\n\n// =============================================================================\n// Usage & Credits\n// =============================================================================\n\nexport interface UsageStats {\n today: UsagePeriod;\n thisMonth: UsagePeriod;\n allTime: UsagePeriod;\n}\n\nexport interface UsagePeriod {\n analyses: number;\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n}\n\nexport interface CreditStatus {\n remaining: number;\n used: number;\n total: number;\n purchasedRemaining?: number;\n}\n\n// =============================================================================\n// Hook Return Types\n// =============================================================================\n\nexport interface UseAuthReturn {\n /** User information (preferred over credentials) */\n user: User | null;\n /** Raw credentials (maintained for backward compatibility) */\n credentials: FlowstackCredentials | null;\n isAuthenticated: boolean;\n isLoading: boolean;\n error: string | null;\n login: (email: string, password: string) => Promise<boolean>;\n register: (email: string, password: string, name?: string) => Promise<boolean>;\n googleSignIn: () => Promise<void>;\n logout: () => void;\n refreshToken: () => Promise<boolean>;\n}\n\nexport interface UseWorkspaceReturn {\n workspaces: WorkspaceInfo[];\n selectedWorkspace: WorkspaceInfo | null;\n isLoading: boolean;\n error: string | null;\n createWorkspace: (name: string, description?: string) => Promise<WorkspaceInfo | null>;\n selectWorkspace: (workspace: WorkspaceInfo) => void;\n refreshWorkspaces: () => Promise<void>;\n}\n\nexport interface UseDatasetsReturn {\n datasets: DatasetInfo[];\n isLoading: boolean;\n error: string | null;\n uploadDataset: (file: File, name?: string) => Promise<DatasetInfo | null>;\n downloadDataset: (name: string) => Promise<Blob | null>;\n deleteDataset: (name: string) => Promise<boolean>;\n refreshDatasets: () => Promise<void>;\n}\n\nexport interface UseVisualizationsReturn {\n visualizations: VisualizationData[];\n isLoading: boolean;\n error: string | null;\n refreshVisualizations: () => Promise<void>;\n}\n\nexport interface UseReportsReturn {\n reports: ReportInfo[];\n isLoading: boolean;\n error: string | null;\n uploadReport: (file: File, name?: string) => Promise<ReportInfo | null>;\n downloadReport: (url: string, name: string, format: string) => Promise<Blob | null>;\n refreshReports: () => Promise<void>;\n}\n\nexport interface UseModelsReturn {\n models: ModelInfo[];\n isLoading: boolean;\n error: string | null;\n downloadModel: (name: string) => Promise<Blob | null>;\n refreshModels: () => Promise<void>;\n}\n\nexport interface UseDataSourcesReturn {\n dataSources: DataSource[];\n isLoading: boolean;\n error: string | null;\n createDataSource: (config: DataSourceConfig) => Promise<DataSource | null>;\n testConnection: (id: string) => Promise<ConnectionTestResult>;\n deleteDataSource: (id: string) => Promise<boolean>;\n refreshDataSources: () => Promise<void>;\n}\n\nexport interface UseAgentOptions {\n /** Tool whitelist — when provided, only these tools are available to the agent */\n tools?: string[];\n /** @deprecated Strands swarm removed in P0-73. Pass `capabilities` instead\n * to pre-load tool categories for built apps. This field is ignored\n * server-side but kept in the type so older built-app bundles that\n * still pass it continue to compile. */\n targetAgent?: string;\n /** @deprecated Strands swarm removed in P0-73. Use `capabilities` instead.\n * This field is silently ignored by /mono/stream — the SDK no longer\n * forwards it. Kept in the type for back-compat with frozen bundles. */\n targetAgents?: string[];\n /** P0-80: pre-declare the tool categories a built app needs. The SDK forwards\n * these to /mono/stream, and the backend seeds `state.loaded_categories`\n * before the first LLM turn so the agent has the right tools available\n * immediately (no meta-tool discovery step). Values are meta-tool names:\n * 'site_operations' | 'data_access' | 'external_integration'\n * | 'code_execution' | 'domain_task' | 'workspace_management'\n * Omit or pass an empty array to let the agent discover tools on demand. */\n capabilities?: string[];\n /** Query mode hint — \"chat\" forces text-only responses, \"build\" allows the\n * full build/edit pipeline. Defaults to auto-detected from the message\n * content when omitted. Added in P0-66 to unblock MobileChat.tsx and other\n * consumers that want to lock the agent into chat-only behavior. */\n mode?: 'chat' | 'build' | 'edit' | 'auto';\n /** P0-132 (G5): inline system-prompt override forwarded to the backend as\n * `system_prompt_override`. Lets a hook instance run an inline persona prompt\n * without registering a separate agent. Previously dropped by useAgent even\n * though the wire/client already supported it. */\n systemPrompt?: string;\n /** P0-132 (G4): target a specific registered persona/subagent by name. Maps to\n * `target_agents` on the wire. Without this, the backend auto-selects the first\n * registered subagent, so multi-persona apps could only ever reach one. This\n * re-enables persona selection only — it does NOT revive the removed Strands\n * swarm (distinct from the deprecated `targetAgents` field above). */\n persona?: string;\n /** P0-132 (G4): alias for `persona`. Either may be used; `persona` wins if both\n * are set. */\n agentName?: string;\n /** P0-132 (G8): namespaces this hook instance's conversation/session storage so\n * independent surfaces (e.g. an interview chat and a matchmaker) keep separate\n * conversations instead of sharing one tenant-wide session (which caused\n * cross-talk). Pass a STABLE string per surface (e.g. 'interview') to preserve\n * that surface's history across page refreshes. Omit to keep the legacy\n * tenant-shared session (back-compatible default). */\n sessionKey?: string;\n}\n\nexport interface UseAgentReturn {\n query: (prompt: string, attachments?: AttachmentInput[], allowedTerms?: string[]) => Promise<void>;\n messages: ChatMessage[];\n isStreaming: boolean;\n isLoading: boolean;\n toolCalls: ToolCall[];\n error: string | null;\n pendingInterrupts?: InterruptInfo[] | null;\n connectedDataSources: DataSourceBadgeInfo[];\n clearMessages: () => void;\n /** Start a genuinely new backend conversation (sends force_new_session=true). */\n startNewSession: () => void;\n cancelQuery: () => void;\n interruptAgent: () => Promise<void>;\n respondToInterrupt: (message: string) => Promise<void>;\n}\n\nexport interface UseQueryReturn {\n execute: (prompt: string, options?: QueryOptions) => Promise<void>;\n isStreaming: boolean;\n result: string | null;\n toolCalls: ToolCall[];\n visualizations: VisualizationData[];\n error: string | null;\n cancel: () => void;\n}\n\n// =============================================================================\n// User Management (Admin)\n// =============================================================================\n\n/**\n * User role levels for tenant management\n */\nexport type UserRole = 'owner' | 'admin' | 'member' | 'viewer';\n\n/**\n * User account status\n */\nexport type UserStatus = 'active' | 'suspended' | 'pending_verification' | 'deactivated';\n\n/**\n * Activity types for user activity logs\n */\nexport type UserActivityType =\n | 'login'\n | 'logout'\n | 'register'\n | 'password_reset'\n | 'profile_update'\n | 'workspace_create'\n | 'workspace_access'\n | 'dataset_upload'\n | 'query_execute'\n | 'api_call';\n\n/**\n * Managed user - extended user info for admin management\n */\nexport interface ManagedUser {\n /** Unique user identifier */\n id: string;\n /** User email address */\n email: string;\n /** Display name (optional) */\n name?: string;\n /** User's role in the tenant */\n role: UserRole;\n /** Account status */\n status: UserStatus;\n /** Tenant ID the user belongs to */\n tenantId: string;\n /** Account creation timestamp (ISO) */\n createdAt: string;\n /** Last login timestamp (ISO) */\n lastLoginAt?: string;\n /** Last activity timestamp (ISO) */\n lastActivityAt?: string;\n /** Profile image URL */\n avatarUrl?: string;\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * User activity log entry\n */\nexport interface UserActivityLog {\n /** Activity ID */\n id: string;\n /** User who performed the action */\n userId: string;\n /** Type of activity */\n activityType: UserActivityType;\n /** Human-readable description */\n description: string;\n /** Activity timestamp (ISO) */\n timestamp: string;\n /** Related resource (workspace, dataset, etc.) */\n resourceType?: string;\n resourceId?: string;\n /** Additional context */\n metadata?: Record<string, unknown>;\n /** IP address (if available) */\n ipAddress?: string;\n}\n\n/**\n * Request to update a managed user\n */\nexport interface UpdateUserRequest {\n name?: string;\n role?: UserRole;\n status?: UserStatus;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Tenant-level user statistics\n */\nexport interface UserStats {\n /** Total registered users */\n totalUsers: number;\n /** Active users (logged in within 30 days) */\n activeUsers: number;\n /** Users by role */\n usersByRole: Record<UserRole, number>;\n /** Users by status */\n usersByStatus: Record<UserStatus, number>;\n /** New users this month */\n newUsersThisMonth: number;\n /** Daily active users (last 7 days) */\n dailyActiveUsers: number[];\n}\n\n/**\n * Pagination parameters for user lists\n */\nexport interface UserListParams {\n /** Page number (1-indexed) */\n page?: number;\n /** Items per page (default 20, max 100) */\n limit?: number;\n /** Filter by role */\n role?: UserRole;\n /** Filter by status */\n status?: UserStatus;\n /** Search by email or name */\n search?: string;\n /** Sort field */\n sortBy?: 'createdAt' | 'lastLoginAt' | 'email' | 'name';\n /** Sort direction */\n sortOrder?: 'asc' | 'desc';\n}\n\n/**\n * Paginated user list response\n */\nexport interface UserListResponse {\n users: ManagedUser[];\n totalCount: number;\n page: number;\n limit: number;\n hasMore: boolean;\n}\n\n/**\n * Return type for useUserManagement hook\n */\nexport interface UseUserManagementReturn {\n /** List of managed users */\n users: ManagedUser[];\n /** User statistics */\n stats: UserStats | null;\n /** Loading state */\n isLoading: boolean;\n /** Error message */\n error: string | null;\n /** Pagination state */\n pagination: {\n page: number;\n limit: number;\n totalCount: number;\n hasMore: boolean;\n };\n /** Refresh user list */\n refreshUsers: (params?: UserListParams) => Promise<void>;\n /** Get user by ID */\n getUser: (userId: string) => Promise<ManagedUser | null>;\n /** Update user details */\n updateUser: (userId: string, updates: UpdateUserRequest) => Promise<boolean>;\n /** Suspend a user */\n suspendUser: (userId: string, reason?: string) => Promise<boolean>;\n /** Reactivate a suspended user */\n reactivateUser: (userId: string) => Promise<boolean>;\n /** Delete a user (permanent) */\n deleteUser: (userId: string) => Promise<boolean>;\n /** Get user activity logs */\n getUserActivity: (userId: string, limit?: number) => Promise<UserActivityLog[]>;\n /** Refresh statistics */\n refreshStats: () => Promise<void>;\n /** Set current page */\n setPage: (page: number) => void;\n /** Set search query */\n setSearch: (search: string) => void;\n /** Set role filter */\n setRoleFilter: (role: UserRole | null) => void;\n /** Set status filter */\n setStatusFilter: (status: UserStatus | null) => void;\n /** Current admin user has permission */\n canManageUsers: boolean;\n}\n\n// =============================================================================\n// Provider Credentials\n// =============================================================================\n\nexport const LLM_PROVIDERS = ['anthropic', 'openai', 'gemini', 'deepseek', 'xai', 'ollama'] as const;\nexport type LLMProvider = (typeof LLM_PROVIDERS)[number];\n\n/**\n * One platform credential a user can pin via /user/model-preference.\n * Mirrors the backend ModelOption pydantic model in user_preferences.py.\n */\nexport interface ModelOption {\n credential_id: string;\n provider: string;\n model_id: string;\n purpose: string;\n is_default: boolean;\n}\n\n/**\n * The user's resolved model preference state. `is_auto=true` means no\n * pinned cred — runtime resolver falls back to the tenant's purpose default.\n */\nexport interface ModelPreferenceState {\n preferred_credential_id: string | null;\n resolved_provider: string | null;\n resolved_model_id: string | null;\n is_auto: boolean;\n}\n\n/**\n * Tenant-admin platform credential — what `/admin/provider-credentials`\n * lists. `masked_key` is `XXXX…last4` for display.\n */\nexport interface AdminProviderCredential {\n credential_id: string;\n provider: string;\n purpose: string;\n scope: string;\n model_id: string;\n is_default: boolean;\n masked_key: string;\n created_at: number;\n updated_at?: number;\n}\n\n/**\n * Non-platform credential already owned by the tenant — candidate for\n * promotion into the platform pool via `/admin/provider-credentials/promote`.\n */\nexport interface ExistingProviderCredential {\n credential_id: string;\n tenant_id: string;\n provider: string;\n purpose: string;\n scope: string;\n model_id: string;\n is_default: boolean;\n api_key_preview: string;\n created_at?: number;\n}\n\nexport interface CreateAdminProviderCredentialInput {\n provider: LLMProvider | string;\n api_key: string;\n model_id?: string;\n purpose?: string;\n is_default?: boolean;\n}\n\n/**\n * Credential purposes after the P0-68 collapse. Only `default` and\n * `code_sandbox` are actively used by MonoSage. Legacy purposes remain\n * in the union for back-compat — reads resolve them to `default` server-side\n * and writes are still accepted, but new code should target `default`.\n */\nexport const CREDENTIAL_PURPOSES = [\n 'default',\n 'code_sandbox',\n // Legacy — resolved to `default` by the provider_credentials_service shim\n 'llm',\n 'swarm',\n 'thinking',\n 'data_operations',\n 'visualization',\n 'google_marketing',\n 'site_builder',\n 'site_planner',\n 'site_style',\n 'site_data_integrator',\n 'daily_brief',\n 'js_builder',\n 'site_patch',\n 'code_interpreter',\n] as const;\nexport type CredentialPurpose = (typeof CREDENTIAL_PURPOSES)[number];\n\nexport interface ProviderCredential {\n credential_id: string;\n provider: LLMProvider;\n model_id: string;\n purpose: string;\n is_default: boolean;\n api_key?: string;\n host?: string;\n model_settings?: ProviderModelSettings;\n created_at?: string;\n}\n\nexport interface ProviderModelSettings {\n temperature?: number;\n max_tokens?: number;\n top_p?: number;\n [key: string]: unknown;\n}\n\n/** Sensible defaults for model settings. */\nexport const DEFAULT_PROVIDER_MODEL_SETTINGS: ProviderModelSettings = {\n temperature: 0.7,\n max_tokens: 4096,\n top_p: 1.0,\n};\n\n/** Runtime type guard for ProviderCredential objects. */\nexport function isProviderCredential(value: unknown): value is ProviderCredential {\n if (typeof value !== 'object' || value === null) return false;\n const obj = value as Record<string, unknown>;\n return (\n typeof obj.credential_id === 'string' &&\n typeof obj.provider === 'string' &&\n typeof obj.model_id === 'string' &&\n typeof obj.purpose === 'string' &&\n typeof obj.is_default === 'boolean'\n );\n}\n\n// =============================================================================\n// Collection Layers (P0-27)\n// =============================================================================\n\nexport const COLLECTION_LAYERS = ['shared', 'user', 'auto'] as const;\nexport type CollectionLayer = (typeof COLLECTION_LAYERS)[number];\n\nexport interface PurposeInfo {\n purpose: string;\n label: string;\n description: string;\n default_provider?: LLMProvider;\n}\n\n// =============================================================================\n// Ollama Local Inference\n// =============================================================================\n\nexport interface OllamaLocalModel {\n name: string;\n size: number;\n modified_at: string;\n digest?: string;\n}\n\nexport interface OllamaStatus {\n available: boolean;\n host: string;\n models: OllamaLocalModel[];\n error?: string;\n}\n\n// =============================================================================\n// Collection Explorer\n// =============================================================================\n\nexport interface CollectionSchemaInfo {\n fields: { name: string; type: string }[];\n}\n\nexport interface UserCollectionInfo {\n full_name: string;\n name: string;\n database: string;\n doc_count: number;\n site_name?: string;\n data_tier?: string;\n scope?: string;\n}\n\n// =============================================================================\n// API Response Types\n// =============================================================================\n\nexport interface ApiResponse<T = unknown> {\n ok: boolean;\n status: number;\n data?: T;\n error?: string;\n}\n\nexport interface ListResponse<T> {\n items: T[];\n totalCount: number;\n hasMore?: boolean;\n cached?: boolean;\n}\n\n// =============================================================================\n// Context Value\n// =============================================================================\n\n/**\n * Full context value provided by FlowstackProvider\n */\nexport interface FlowstackContextValue {\n // Configuration\n config: FlowstackConfig;\n\n // Authentication\n credentials: FlowstackCredentials | null;\n setCredentials: (creds: FlowstackCredentials | null) => void;\n isAuthenticated: boolean;\n isInitialized: boolean;\n logout: () => void;\n\n // Session\n session: SessionState;\n\n // Workspaces\n workspaces: WorkspaceInfo[];\n selectedWorkspace: WorkspaceInfo | null;\n setSelectedWorkspace: (workspace: WorkspaceInfo | null) => void;\n refreshWorkspaces: () => Promise<void>;\n createWorkspace: (name: string, description?: string) => Promise<WorkspaceInfo | null>;\n isLoadingWorkspaces: boolean;\n\n // Chat Messages\n messages: ChatMessage[];\n addMessage: (message: ChatMessage) => void;\n updateMessage: (id: string, updates: Partial<ChatMessage>) => void;\n clearMessages: () => void;\n\n // Query State\n isQueryRunning: boolean;\n setIsQueryRunning: (running: boolean) => void;\n queryStartTime: number | null;\n setQueryStartTime: (time: number | null) => void;\n\n // Datasets\n datasets: DatasetInfo[];\n setDatasets: (datasets: DatasetInfo[]) => void;\n refreshDatasets: () => Promise<void>;\n isLoadingDatasets: boolean;\n\n // Visualizations\n visualizations: VisualizationData[];\n setVisualizations: (vizs: VisualizationData[]) => void;\n addVisualization: (viz: VisualizationData) => void;\n refreshVisualizations: () => Promise<void>;\n isLoadingVisualizations: boolean;\n clearVisualizations: () => void;\n\n // Reports\n reports: ReportInfo[];\n refreshReports: () => Promise<void>;\n isLoadingReports: boolean;\n\n // Models\n models: ModelInfo[];\n refreshModels: () => Promise<void>;\n isLoadingModels: boolean;\n\n // Scripts\n scripts: ScriptInfo[];\n refreshScripts: () => Promise<void>;\n isLoadingScripts: boolean;\n\n // UI State\n isSidebarOpen: boolean;\n setSidebarOpen: (open: boolean) => void;\n activeTab: 'chat' | 'datasets' | 'visualizations' | 'reports' | 'models';\n setActiveTab: (tab: 'chat' | 'datasets' | 'visualizations' | 'reports' | 'models') => void;\n}\n\n// =============================================================================\n// Data Explorer\n// =============================================================================\n\nexport interface UserDataOverviewWorkspace {\n workspace_id: string;\n name?: string;\n artifact_counts?: Record<string, number>;\n}\n\nexport interface UserDataOverview {\n workspaces: UserDataOverviewWorkspace[];\n sites: { site_id: string; name: string }[];\n mongodb_summary: { total_collections: number; total_documents: number };\n}\n\n// =============================================================================\n// GitHub Integration\n// =============================================================================\n\nexport interface GitHubRepo {\n id: number;\n name: string;\n full_name: string;\n private: boolean;\n html_url: string;\n description?: string;\n language?: string;\n default_branch: string;\n}\n\n// =============================================================================\n// PII Settings\n// =============================================================================\n\nexport interface PiiEntitySettings {\n [entityType: string]: boolean;\n}\n\nexport interface PiiSettings {\n query_masking?: {\n enabled?: boolean;\n entity_types?: PiiEntitySettings;\n };\n file_masking?: {\n enabled?: boolean;\n };\n}\n\n/** P0-57: Detailed report of a single PII entity detected/masked in a query. */\nexport interface PiiRedactedEntity {\n entity_type: string;\n /** Original text that was masked. Partially redacted for ALWAYS_MASK types (SSN, CC). */\n original_text: string;\n start: number;\n end: number;\n score: number;\n is_always_masked: boolean;\n /** Whether this entity will actually be masked given current settings. (Preview only) */\n will_mask?: boolean;\n}\n","/**\n * Redis Cache Layer for Flowstack SDK\n * Uses Upstash Redis for serverless caching\n */\n\nimport type { FlowstackCredentials, WorkspaceInfo, DatasetInfo, VisualizationData, ReportInfo, PublishedSiteInfo } from '../types';\n\n// Cache TTL constants (in seconds)\nexport const CACHE_TTL = {\n WORKSPACES: 300, // 5 minutes\n DATASETS: 60, // 1 minute\n VISUALIZATIONS: 60, // 1 minute\n REPORTS: 60, // 1 minute\n SITES: 120, // 2 minutes\n MESSAGES: 0, // No expiry\n SESSION: 86400, // 24 hours\n} as const;\n\n// Cache key prefix\nconst NAMESPACE = 'flowstack';\n\n/**\n * Redis client configuration\n */\nexport interface RedisConfig {\n url: string;\n token: string;\n}\n\n/**\n * Create a Redis client for Upstash\n */\nfunction createRedisClient(config: RedisConfig) {\n const { url, token } = config;\n\n return {\n async get<T>(key: string): Promise<T | null> {\n try {\n const response = await fetch(`${url}/get/${key}`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n if (!response.ok) return null;\n const data = await response.json();\n return data.result ? JSON.parse(data.result) : null;\n } catch {\n return null;\n }\n },\n\n async set(key: string, value: unknown, ttl?: number): Promise<boolean> {\n try {\n const body = ttl\n ? ['SET', key, JSON.stringify(value), 'EX', ttl.toString()]\n : ['SET', key, JSON.stringify(value)];\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n return response.ok;\n } catch {\n return false;\n }\n },\n\n async del(key: string): Promise<boolean> {\n try {\n const response = await fetch(`${url}/del/${key}`, {\n method: 'POST',\n headers: { Authorization: `Bearer ${token}` },\n });\n return response.ok;\n } catch {\n return false;\n }\n },\n\n async keys(pattern: string): Promise<string[]> {\n try {\n const response = await fetch(`${url}/keys/${pattern}`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n if (!response.ok) return [];\n const data = await response.json();\n return data.result || [];\n } catch {\n return [];\n }\n },\n };\n}\n\n/**\n * Generate user-scoped cache key\n */\nfunction getCacheKey(\n type: string,\n credentials: FlowstackCredentials,\n ...parts: string[]\n): string {\n const userId = credentials.userId || 'anonymous';\n const tenantId = credentials.tenantId;\n const key = [NAMESPACE, type, tenantId, userId, ...parts].filter(Boolean).join(':');\n return key;\n}\n\n// =============================================================================\n// Workspace Cache\n// =============================================================================\n\nexport async function getCachedWorkspaces(\n credentials: FlowstackCredentials,\n config: RedisConfig\n): Promise<WorkspaceInfo[] | null> {\n const client = createRedisClient(config);\n const key = getCacheKey('workspaces', credentials);\n return client.get<WorkspaceInfo[]>(key);\n}\n\nexport async function setCachedWorkspaces(\n credentials: FlowstackCredentials,\n workspaces: WorkspaceInfo[],\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('workspaces', credentials);\n return client.set(key, workspaces, CACHE_TTL.WORKSPACES);\n}\n\nexport async function invalidateWorkspacesCache(\n credentials: FlowstackCredentials,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('workspaces', credentials);\n return client.del(key);\n}\n\n// =============================================================================\n// Dataset Cache\n// =============================================================================\n\nexport async function getCachedDatasets(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<DatasetInfo[] | null> {\n const client = createRedisClient(config);\n const key = getCacheKey('datasets', credentials, workspaceId);\n return client.get<DatasetInfo[]>(key);\n}\n\nexport async function setCachedDatasets(\n credentials: FlowstackCredentials,\n workspaceId: string,\n datasets: DatasetInfo[],\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('datasets', credentials, workspaceId);\n return client.set(key, datasets, CACHE_TTL.DATASETS);\n}\n\nexport async function invalidateDatasetsCache(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('datasets', credentials, workspaceId);\n return client.del(key);\n}\n\n// =============================================================================\n// Visualization Cache\n// =============================================================================\n\nexport async function getCachedVisualizations(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<VisualizationData[] | null> {\n const client = createRedisClient(config);\n const key = getCacheKey('visualizations', credentials, workspaceId);\n return client.get<VisualizationData[]>(key);\n}\n\nexport async function setCachedVisualizations(\n credentials: FlowstackCredentials,\n workspaceId: string,\n visualizations: VisualizationData[],\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('visualizations', credentials, workspaceId);\n return client.set(key, visualizations, CACHE_TTL.VISUALIZATIONS);\n}\n\nexport async function invalidateVisualizationsCache(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('visualizations', credentials, workspaceId);\n return client.del(key);\n}\n\n// =============================================================================\n// Report Cache\n// =============================================================================\n\nexport async function getCachedReports(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<ReportInfo[] | null> {\n const client = createRedisClient(config);\n const key = getCacheKey('reports', credentials, workspaceId);\n return client.get<ReportInfo[]>(key);\n}\n\nexport async function setCachedReports(\n credentials: FlowstackCredentials,\n workspaceId: string,\n reports: ReportInfo[],\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('reports', credentials, workspaceId);\n return client.set(key, reports, CACHE_TTL.REPORTS);\n}\n\nexport async function invalidateReportsCache(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('reports', credentials, workspaceId);\n return client.del(key);\n}\n\n// =============================================================================\n// Bulk Invalidation\n// =============================================================================\n\n/**\n * Invalidate all workspace artifacts (datasets, visualizations, reports)\n */\nexport async function invalidateWorkspaceArtifacts(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<void> {\n await Promise.all([\n invalidateDatasetsCache(credentials, workspaceId, config),\n invalidateVisualizationsCache(credentials, workspaceId, config),\n invalidateReportsCache(credentials, workspaceId, config),\n ]);\n}\n\n/**\n * Invalidate all user cache\n */\nexport async function invalidateAllUserCache(\n credentials: FlowstackCredentials,\n config: RedisConfig\n): Promise<void> {\n const client = createRedisClient(config);\n const userId = credentials.userId || 'anonymous';\n const tenantId = credentials.tenantId;\n const pattern = `${NAMESPACE}:*:${tenantId}:${userId}:*`;\n\n const keys = await client.keys(pattern);\n await Promise.all(keys.map(key => client.del(key)));\n}\n\n// =============================================================================\n// Generic Cache Operations\n// =============================================================================\n\n/**\n * Get a cached value\n */\nexport async function getCached<T>(\n key: string,\n config: RedisConfig\n): Promise<T | null> {\n const client = createRedisClient(config);\n return client.get<T>(`${NAMESPACE}:${key}`);\n}\n\n/**\n * Set a cached value\n */\nexport async function setCached<T>(\n key: string,\n value: T,\n ttl: number,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n return client.set(`${NAMESPACE}:${key}`, value, ttl);\n}\n\n/**\n * Delete a cached value\n */\nexport async function deleteCached(\n key: string,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n return client.del(`${NAMESPACE}:${key}`);\n}\n\n// =============================================================================\n// Sites Cache\n// =============================================================================\n\nexport async function getCachedSites(\n credentials: FlowstackCredentials,\n config: RedisConfig\n): Promise<PublishedSiteInfo[] | null> {\n const client = createRedisClient(config);\n const key = getCacheKey('sites', credentials);\n return client.get<PublishedSiteInfo[]>(key);\n}\n\nexport async function setCachedSites(\n credentials: FlowstackCredentials,\n sites: PublishedSiteInfo[],\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('sites', credentials);\n return client.set(key, sites, CACHE_TTL.SITES);\n}\n\nexport async function invalidateSitesCache(\n credentials: FlowstackCredentials,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('sites', credentials);\n return client.del(key);\n}\n","/**\n * Agent Templates\n *\n * Pre-configured agent templates for different use cases.\n */\n\nimport type { AgentConfig, AgentTemplate } from '../types';\n\n/**\n * Data Science agent template\n * Optimized for data analysis, ML, and visualization\n */\nexport const dataScienceTemplate: AgentConfig = {\n template: 'data-science',\n streaming: true,\n networkMode: 'SANDBOX',\n};\n\n/**\n * Marketing agent template\n * Optimized for content, campaigns, and analytics\n */\nexport const marketingTemplate: AgentConfig = {\n template: 'marketing',\n streaming: true,\n networkMode: 'PUBLIC',\n};\n\n/**\n * Support agent template\n * Optimized for customer support and knowledge base\n */\nexport const supportTemplate: AgentConfig = {\n template: 'support',\n streaming: true,\n networkMode: 'SANDBOX',\n};\n\n/**\n * Custom agent template factory\n */\nexport function createCustomTemplate(config: Partial<AgentConfig>): AgentConfig {\n return {\n template: 'custom',\n streaming: true,\n networkMode: 'SANDBOX',\n ...config,\n };\n}\n\n/**\n * Get agent template by name\n */\nexport function getAgentTemplate(name: AgentTemplate): AgentConfig {\n switch (name) {\n case 'data-science':\n return dataScienceTemplate;\n case 'marketing':\n return marketingTemplate;\n case 'support':\n return supportTemplate;\n case 'custom':\n default:\n return createCustomTemplate({});\n }\n}\n","/**\n * useModelPreference — User-pinned LLM credential resolution.\n *\n * Wraps the backend `/user/model-preference` routes (P0-95 finale):\n * GET /user/model-preference → current resolved state\n * PUT /user/model-preference → set or clear pinned credential_id\n * GET /user/model-preference/options → platform creds available in tenant pool\n *\n * The Casino Settings → Model tab (`ModelSettingsView`) drives off this hook;\n * the previous SDK shim returned the wrong shape and the page error-boundaried\n * to blank.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport { flowstackFetch } from '../api/client';\nimport type { ModelOption, ModelPreferenceState } from '../types';\n\nexport interface UseModelPreferenceReturn {\n preference: ModelPreferenceState | null;\n options: ModelOption[];\n isLoading: boolean;\n error: string | null;\n setPreference: (credentialId: string | null) => Promise<boolean>;\n refresh: () => Promise<void>;\n}\n\nconst PREF_PATH = '/user/model-preference';\n\nexport function useModelPreference(): UseModelPreferenceReturn {\n const { credentials: authCredentials, config } = useFlowstack();\n const [preference, setPref] = useState<ModelPreferenceState | null>(null);\n const [options, setOptions] = useState<ModelOption[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const clientConfig = { baseUrl: config.baseUrl, tenantId: config.tenantId };\n\n const fetchAll = useCallback(async () => {\n if (!authCredentials) return;\n setError(null);\n try {\n const [prefRes, optsRes] = await Promise.all([\n flowstackFetch<ModelPreferenceState>(\n PREF_PATH,\n { credentials: authCredentials },\n clientConfig,\n ),\n flowstackFetch<ModelOption[]>(\n `${PREF_PATH}/options`,\n { credentials: authCredentials },\n clientConfig,\n ),\n ]);\n if (prefRes.ok && prefRes.data) setPref(prefRes.data);\n if (optsRes.ok && optsRes.data) setOptions(Array.isArray(optsRes.data) ? optsRes.data : []);\n if (!prefRes.ok && !optsRes.ok) {\n setError(prefRes.error || optsRes.error || 'Failed to load model preference');\n }\n } catch (err: any) {\n setError(err?.message || 'Failed to load model preference');\n }\n // ESLint exhaustive-deps complains about clientConfig identity, but it\n // changes whenever config does and that's exactly when we want to refetch.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [authCredentials, clientConfig.baseUrl, clientConfig.tenantId]);\n\n const refresh = useCallback(async () => {\n setIsLoading(true);\n await fetchAll();\n setIsLoading(false);\n }, [fetchAll]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n const setPreference = useCallback(\n async (credentialId: string | null): Promise<boolean> => {\n if (!authCredentials) return false;\n setError(null);\n try {\n const res = await flowstackFetch<ModelPreferenceState>(\n PREF_PATH,\n {\n method: 'PUT',\n credentials: authCredentials,\n body: { credential_id: credentialId },\n },\n clientConfig,\n );\n if (!res.ok) {\n setError(res.error || `Failed to set preference: ${res.status}`);\n return false;\n }\n if (res.data) setPref(res.data);\n return true;\n } catch (err: any) {\n setError(err?.message || 'Failed to set preference');\n return false;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n },\n [authCredentials, clientConfig.baseUrl, clientConfig.tenantId],\n );\n\n return { preference, options, isLoading, error, setPreference, refresh };\n}\n","/**\n * useAdminProviderCredentials — Tenant-admin LLM credential pool management.\n *\n * Wraps the backend `/admin/provider-credentials` routes (P0-95 multi-tenant):\n * GET /admin/provider-credentials/am-i-admin → non-throwing isAdmin gate\n * GET /admin/provider-credentials → list tenant's platform pool\n * GET /admin/provider-credentials/existing → non-platform creds (promote candidates)\n * POST /admin/provider-credentials → create new platform credential\n * POST /admin/provider-credentials/promote → clone existing into platform pool\n *\n * Drives the admin-only sections of the Casino Settings → Model tab.\n * For non-admins, am-i-admin returns false and the rest of the requests are\n * skipped — the hook degrades to an empty/no-op state without errors so\n * non-admin users still see their own model picker.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport { flowstackFetch } from '../api/client';\nimport type {\n AdminProviderCredential,\n ExistingProviderCredential,\n CreateAdminProviderCredentialInput,\n} from '../types';\n\nexport interface UseAdminProviderCredentialsReturn {\n isAdmin: boolean;\n isLoading: boolean;\n error: string | null;\n credentials: AdminProviderCredential[];\n existing: ExistingProviderCredential[];\n create: (input: CreateAdminProviderCredentialInput) => Promise<boolean>;\n // Signature mirrors the call site: ModelSettingsView passes\n // (src.tenant_id, src.credential_id) for legacy reasons. Backend's promote\n // endpoint is strict-same-tenant — we drop the tenant arg server-side.\n promote: (sourceTenantId: string, credentialId: string) => Promise<boolean>;\n refresh: () => Promise<void>;\n}\n\nconst ADMIN_PATH = '/admin/provider-credentials';\n\ninterface AmIAdminResponse {\n is_admin: boolean;\n user_id?: string | null;\n tenant_id?: string | null;\n}\n\nexport function useAdminProviderCredentials(): UseAdminProviderCredentialsReturn {\n const { credentials: authCredentials, config } = useFlowstack();\n const [isAdmin, setIsAdmin] = useState(false);\n const [credentials, setCredentials] = useState<AdminProviderCredential[]>([]);\n const [existing, setExisting] = useState<ExistingProviderCredential[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const clientConfig = { baseUrl: config.baseUrl, tenantId: config.tenantId };\n\n const fetchAll = useCallback(async () => {\n if (!authCredentials) return;\n setError(null);\n try {\n // am-i-admin first — both other endpoints 403 for non-admins, no point\n // in firing those when we already know the answer.\n const adminRes = await flowstackFetch<AmIAdminResponse>(\n `${ADMIN_PATH}/am-i-admin`,\n { credentials: authCredentials },\n clientConfig,\n );\n const admin = !!(adminRes.ok && adminRes.data?.is_admin);\n setIsAdmin(admin);\n\n if (!admin) {\n setCredentials([]);\n setExisting([]);\n return;\n }\n\n const [listRes, existRes] = await Promise.all([\n flowstackFetch<AdminProviderCredential[]>(\n ADMIN_PATH,\n { credentials: authCredentials },\n clientConfig,\n ),\n flowstackFetch<ExistingProviderCredential[]>(\n `${ADMIN_PATH}/existing`,\n { credentials: authCredentials },\n clientConfig,\n ),\n ]);\n if (listRes.ok && listRes.data) {\n setCredentials(Array.isArray(listRes.data) ? listRes.data : []);\n }\n if (existRes.ok && existRes.data) {\n setExisting(Array.isArray(existRes.data) ? existRes.data : []);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n } catch (err: any) {\n setError(err?.message || 'Failed to load admin credentials');\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [authCredentials, clientConfig.baseUrl, clientConfig.tenantId]);\n\n const refresh = useCallback(async () => {\n setIsLoading(true);\n await fetchAll();\n setIsLoading(false);\n }, [fetchAll]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n const create = useCallback(\n async (input: CreateAdminProviderCredentialInput): Promise<boolean> => {\n if (!authCredentials) return false;\n setError(null);\n try {\n const res = await flowstackFetch<AdminProviderCredential>(\n ADMIN_PATH,\n {\n method: 'POST',\n credentials: authCredentials,\n body: input,\n },\n clientConfig,\n );\n if (!res.ok) {\n setError(res.error || `Failed to create credential: ${res.status}`);\n return false;\n }\n await fetchAll();\n return true;\n } catch (err: any) {\n setError(err?.message || 'Failed to create credential');\n return false;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n },\n [authCredentials, clientConfig.baseUrl, clientConfig.tenantId, fetchAll],\n );\n\n const promote = useCallback(\n async (_sourceTenantId: string, credentialId: string): Promise<boolean> => {\n if (!authCredentials) return false;\n setError(null);\n try {\n const res = await flowstackFetch<AdminProviderCredential>(\n `${ADMIN_PATH}/promote`,\n {\n method: 'POST',\n credentials: authCredentials,\n body: { credential_id: credentialId, is_default: true },\n },\n clientConfig,\n );\n if (!res.ok) {\n setError(res.error || `Failed to promote credential: ${res.status}`);\n return false;\n }\n await fetchAll();\n return true;\n } catch (err: any) {\n setError(err?.message || 'Failed to promote credential');\n return false;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n },\n [authCredentials, clientConfig.baseUrl, clientConfig.tenantId, fetchAll],\n );\n\n return { isAdmin, isLoading, error, credentials, existing, create, promote, refresh };\n}\n","'use client';\n\n/**\n * useLibrary — paginated library items for a given type.\n *\n * Calls GET /library/{type} with cursor-based pagination.\n * Returns the shape LibraryList.tsx expects:\n * { items, isLoading, error, hasMore, total, loadMore, refresh, deleteItem }\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useFlowstackOptional } from '../context/FlowstackProvider';\nimport type { FlowstackClientConfig } from '../api/client';\n\nexport type LibraryItemType = string;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface UseLibraryReturn {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n items: any[];\n isLoading: boolean;\n error: string | null;\n hasMore: boolean;\n total: number | null;\n loadMore: () => void;\n refresh: (search?: string) => void;\n deleteItem: (name: string) => Promise<boolean>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getDetail: (name: string) => Promise<Record<string, any> | null>;\n}\n\n// Maps SDK type names to backend path segments\nconst TYPE_PATH: Record<string, string> = {\n dataset: 'datasets',\n visualization: 'visualizations',\n code: 'code',\n document: 'documents',\n report: 'reports',\n model: 'models',\n};\n\nasync function _authedFetch(\n method: string,\n url: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n credentials: any,\n): Promise<Response> {\n return fetch(url, {\n method,\n headers: {\n Authorization: `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': credentials.tenantId,\n 'X-User-ID': credentials.userId,\n },\n });\n}\n\nexport function useLibrary(type: LibraryItemType): UseLibraryReturn {\n const ctx = useFlowstackOptional();\n const [items, setItems] = useState<Record<string, unknown>[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [cursor, setCursor] = useState<string | null>(null);\n const [hasMore, setHasMore] = useState(false);\n const [total, setTotal] = useState<number | null>(null);\n\n const creds = useMemo(() => ({\n apiKey: (ctx?.credentials as any)?.apiKey || '',\n tenantId: (ctx?.credentials as any)?.tenantId || ctx?.config?.tenantId || '',\n userId: (ctx?.credentials as any)?.userId || '',\n }), [ctx?.credentials, ctx?.config?.tenantId]);\n\n const baseUrl = ctx?.config?.baseUrl || 'https://sage-api.flowstack.fun';\n const pathSeg = TYPE_PATH[type];\n\n const fetchItems = useCallback(async (opts?: { cursor?: string | null; search?: string; replace?: boolean }) => {\n if (!creds.apiKey || !pathSeg) return;\n setIsLoading(true);\n if (opts?.replace !== false) setError(null);\n try {\n const url = new URL(`${baseUrl}/library/${pathSeg}`);\n url.searchParams.set('user_id', creds.userId);\n url.searchParams.set('limit', '50');\n if (opts?.cursor) url.searchParams.set('cursor', opts.cursor);\n if (opts?.search) url.searchParams.set('search', opts.search);\n\n const resp = await _authedFetch('GET', url.toString(), creds);\n if (!resp.ok) {\n setError(`Failed to load ${type} (${resp.status})`);\n return;\n }\n const data = await resp.json();\n const newItems: Record<string, unknown>[] = data.items ?? [];\n if (opts?.cursor) {\n setItems(prev => [...prev, ...newItems]);\n } else {\n setItems(newItems);\n }\n setHasMore(data.has_more ?? false);\n setCursor(data.next_cursor ?? null);\n if (data.total != null) setTotal(data.total);\n } catch (e: any) {\n setError(e.message || `Failed to load ${type}`);\n } finally {\n setIsLoading(false);\n }\n }, [creds.apiKey, creds.tenantId, creds.userId, baseUrl, pathSeg, type]);\n\n useEffect(() => {\n setItems([]);\n setCursor(null);\n setHasMore(false);\n setTotal(null);\n fetchItems({ replace: true });\n }, [fetchItems]);\n\n const loadMore = useCallback(() => {\n if (!isLoading && hasMore && cursor) {\n fetchItems({ cursor, replace: false });\n }\n }, [fetchItems, isLoading, hasMore, cursor]);\n\n const refresh = useCallback((search?: string) => {\n setItems([]);\n setCursor(null);\n fetchItems({ search, replace: true });\n }, [fetchItems]);\n\n const deleteItem = useCallback(async (name: string): Promise<boolean> => {\n if (!creds.apiKey) return false;\n try {\n const url = new URL(`${baseUrl}/library/${pathSeg}/${encodeURIComponent(name)}`);\n url.searchParams.set('user_id', creds.userId);\n const resp = await _authedFetch('DELETE', url.toString(), creds);\n if (resp.ok) refresh();\n return resp.ok;\n } catch {\n return false;\n }\n }, [creds.apiKey, creds.tenantId, creds.userId, baseUrl, pathSeg, refresh]);\n\n const getDetail = useCallback(async (name: string): Promise<Record<string, unknown> | null> => {\n if (!creds.apiKey || !pathSeg) return null;\n try {\n const url = new URL(`${baseUrl}/library/${pathSeg}/${encodeURIComponent(name)}`);\n url.searchParams.set('user_id', creds.userId);\n const resp = await _authedFetch('GET', url.toString(), creds);\n if (!resp.ok) return null;\n return await resp.json();\n } catch {\n return null;\n }\n }, [creds.apiKey, creds.tenantId, creds.userId, baseUrl, pathSeg]);\n\n return { items, isLoading, error, hasMore, total, loadMore, refresh, deleteItem, getDetail };\n}\n","'use client';\n\n/**\n * useSubagents — fetches the library of user-defined subagent definitions.\n *\n * Calls GET /library/agents on the backend and splits the result into\n * `builtin` (source=builtin) and `userDefined` (source=user or mcp) lists.\n * Also provides uploadSubagent / deleteSubagent for the AgentsTab CRUD UI.\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useFlowstackOptional } from '../context/FlowstackProvider';\nimport type { FlowstackClientConfig } from '../api/client';\n\n// Shape returned by GET /library/agents\nexport interface SubagentSummary {\n id: string;\n name: string;\n description: string;\n source?: string;\n /** kept for legacy compat (AgentsTab checks this) */\n created_by?: string;\n created_at?: string;\n site_id?: string;\n}\n\n// Full definition returned by GET /library/agents/{name}\nexport interface SubagentDefinition extends SubagentSummary {\n system_prompt?: string;\n /** @deprecated use system_prompt — kept for compat */\n systemPrompt?: string;\n tools?: string[];\n model?: string;\n max_turns?: number;\n max_cost_usd?: number;\n}\n\nexport interface UseSubagentsReturn {\n subagents: SubagentSummary[];\n builtin: SubagentSummary[];\n userDefined: SubagentSummary[];\n isLoading: boolean;\n error: string | null;\n refresh: () => void;\n uploadSubagent: (file: File) => Promise<SubagentDefinition | null>;\n deleteSubagent: (name: string) => Promise<boolean>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function _authedFetch(\n method: string,\n path: string,\n credentials: any,\n config: FlowstackClientConfig,\n body?: unknown,\n): Promise<Response> {\n const base = config.baseUrl || 'https://sage-api.flowstack.fun';\n const url = new URL(`${base}${path}`);\n if (method === 'GET' && credentials.userId) {\n url.searchParams.set('user_id', credentials.userId);\n }\n return fetch(url.toString(), {\n method,\n headers: {\n Authorization: `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': String(credentials.tenantId ?? ''),\n 'X-User-ID': String(credentials.userId ?? ''),\n ...(body ? { 'Content-Type': 'application/json' } : {}),\n },\n ...(body ? { body: JSON.stringify(body) } : {}),\n });\n}\n\nexport function useSubagents(): UseSubagentsReturn {\n const ctx = useFlowstackOptional();\n const [subagents, setSubagents] = useState<SubagentSummary[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const creds = useMemo(() => ({\n apiKey: (ctx?.credentials as any)?.apiKey || '',\n tenantId: (ctx?.credentials as any)?.tenantId || ctx?.config?.tenantId || '',\n userId: (ctx?.credentials as any)?.userId || '',\n }), [ctx?.credentials, ctx?.config?.tenantId]);\n\n const clientConfig = useMemo(\n () => ({ baseUrl: ctx?.config?.baseUrl, tenantId: ctx?.config?.tenantId }),\n [ctx?.config?.baseUrl, ctx?.config?.tenantId],\n );\n\n const fetch_ = useCallback(async () => {\n if (!creds.apiKey) return;\n setIsLoading(true);\n setError(null);\n try {\n const resp = await _authedFetch('GET', '/library/agents', creds, clientConfig);\n if (!resp.ok) {\n setError(`Failed to load agents (${resp.status})`);\n return;\n }\n const data = await resp.json();\n setSubagents(data.agents ?? []);\n } catch (e: any) {\n setError(e.message || 'Failed to load agents');\n } finally {\n setIsLoading(false);\n }\n }, [creds.apiKey, creds.tenantId, creds.userId, clientConfig.baseUrl]);\n\n useEffect(() => { fetch_(); }, [fetch_]);\n\n const uploadSubagent = useCallback(async (file: File): Promise<SubagentDefinition | null> => {\n if (!creds.apiKey) return null;\n const formData = new FormData();\n formData.append('file', file);\n try {\n const base = clientConfig.baseUrl || 'https://sage-api.flowstack.fun';\n const resp = await fetch(`${base}/library/agents/upload`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${creds.apiKey}`,\n 'X-Tenant-ID': creds.tenantId,\n 'X-User-ID': creds.userId,\n },\n body: formData,\n });\n if (!resp.ok) return null;\n const result = await resp.json();\n fetch_(); // refresh list\n return result;\n } catch {\n return null;\n }\n }, [creds.apiKey, creds.tenantId, creds.userId, clientConfig.baseUrl, fetch_]);\n\n const deleteSubagent = useCallback(async (name: string): Promise<boolean> => {\n if (!creds.apiKey) return false;\n try {\n const resp = await _authedFetch('DELETE', `/library/agents/${encodeURIComponent(name)}`, creds, clientConfig);\n if (resp.ok) fetch_();\n return resp.ok;\n } catch {\n return false;\n }\n }, [creds.apiKey, creds.tenantId, creds.userId, clientConfig.baseUrl, fetch_]);\n\n const builtin = useMemo(\n () => subagents.filter(a => a.source === 'builtin'),\n [subagents],\n );\n const userDefined = useMemo(\n () => subagents.filter(a => a.source !== 'builtin'),\n [subagents],\n );\n\n return { subagents, builtin, userDefined, isLoading, error, refresh: fetch_, uploadSubagent, deleteSubagent };\n}\n\n/** Fetch full agent definition from GET /library/agents/{name} */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function getSubagent(\n credentials: any,\n name: string,\n config?: FlowstackClientConfig,\n): Promise<{ ok: boolean; data?: SubagentDefinition; error?: string }> {\n try {\n const resp = await _authedFetch('GET', `/library/agents/${encodeURIComponent(name)}`, credentials, config ?? {});\n if (!resp.ok) return { ok: false, error: `${resp.status}` };\n const data = await resp.json();\n return { ok: true, data };\n } catch (e: any) {\n return { ok: false, error: e.message };\n }\n}\n","/**\n * useConversation — fetch the full message history for a specific session.\n *\n * Used by the built-app sidebar when the user clicks a past conversation —\n * we hydrate the chat panel by fetching the S3-backed history via\n * /conversations/{id}/messages and calling restoreConversation on the\n * shared provider so useAgent renders it.\n */\n\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { useFlowstack } from '../context/FlowstackProvider';\n\nexport interface ConversationMessage {\n id?: string;\n role: string;\n content: string | unknown;\n timestamp?: string;\n [key: string]: unknown;\n}\n\nasync function _fetchMessages(\n credentials: { apiKey: string; [k: string]: unknown },\n sessionId: string,\n opts: { appScope?: string; limit?: number },\n config: { baseUrl?: string; tenantId?: string },\n): Promise<{ ok: boolean; data?: { messages: ConversationMessage[] }; error?: string }> {\n const base = config.baseUrl || 'https://sage-api.flowstack.fun';\n const url = new URL(`${base}/conversations/${encodeURIComponent(sessionId)}/messages`);\n url.searchParams.set('limit', String(opts.limit ?? 500));\n if (opts.appScope) url.searchParams.set('app_scope', opts.appScope);\n try {\n const resp = await fetch(url.toString(), {\n headers: {\n Authorization: `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': String((credentials as any).tenantId || config.tenantId || ''),\n 'X-User-ID': String((credentials as any).userId || ''),\n },\n });\n if (!resp.ok) return { ok: false, error: `${resp.status}` };\n const data = await resp.json();\n return { ok: true, data: { messages: data.messages || data.items || [] } };\n } catch (e: any) {\n return { ok: false, error: e.message };\n }\n}\n\nexport interface UseConversationReturn {\n messages: ConversationMessage[];\n /** The sessionId these messages belong to — used by ChatView to guard\n * against painting stale messages from a previous session. */\n forSessionId: string | null | undefined;\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useConversation(sessionId: string | null | undefined): UseConversationReturn {\n const { credentials, config } = useFlowstack();\n const appScope = config.appScope;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [messages, setMessages] = useState<any[]>([]);\n const [resolvedSessionId, setResolvedSessionId] = useState<string | null | undefined>(undefined);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const refresh = useCallback(async (): Promise<void> => {\n if (!credentials || !sessionId) {\n setMessages([]);\n return;\n }\n setIsLoading(true);\n setError(null);\n try {\n const resp = await _fetchMessages(\n credentials as any,\n sessionId,\n { appScope, limit: 500 },\n { baseUrl: config.baseUrl, tenantId: config.tenantId },\n );\n if (resp.ok && resp.data) {\n setMessages(resp.data.messages || []);\n setResolvedSessionId(sessionId); // confirm messages are for THIS session\n } else {\n setError(resp.error || 'Failed to load conversation');\n setMessages([]);\n setResolvedSessionId(sessionId);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n setMessages([]);\n } finally {\n setIsLoading(false);\n }\n }, [credentials, sessionId, appScope, config.baseUrl, config.tenantId]);\n\n useEffect(() => {\n // Reset resolved ID immediately on sessionId change so ChatView's guard\n // never sees a stale match while the new fetch is in-flight.\n setResolvedSessionId(undefined);\n setMessages([]);\n refresh();\n }, [refresh]);\n\n return { messages, forSessionId: resolvedSessionId, isLoading, error, refresh };\n}\n","/**\n * Flowstack SDK\n *\n * Complete Backend-as-a-Service for AI-powered apps.\n *\n * @example\n * ```tsx\n * import { FlowstackProvider, useAuth, useAgent, LoginForm } from 'flowstack-sdk';\n *\n * function App() {\n * return (\n * <FlowstackProvider config={{ jwtSecret: process.env.JWT_SECRET! }}>\n * <MyApp />\n * </FlowstackProvider>\n * );\n * }\n * ```\n *\n * @packageDocumentation\n */\n\n// =============================================================================\n// Core Context\n// =============================================================================\n\nexport {\n FlowstackProvider,\n useFlowstack,\n useFlowstackOptional,\n} from './context';\n\n// =============================================================================\n// Errors\n// =============================================================================\n\nexport {\n FlowstackError,\n ErrorCodes,\n ErrorMessages,\n RecoveryActions,\n isFlowstackError,\n withErrorHandling,\n} from './errors';\n\nexport type {\n ErrorCode,\n FlowstackErrorOptions,\n} from './errors';\n\n// =============================================================================\n// Config Validation\n// =============================================================================\n\nexport {\n validateConfig,\n validateConfigOrThrow,\n isDevelopmentConfig,\n getConfigSummary,\n} from './config';\n\nexport type { ValidationResult } from './config';\n\n// =============================================================================\n// Hooks\n// =============================================================================\n\nexport {\n useAuth,\n useWorkspace,\n useDatasets,\n useVisualizations,\n useReports,\n useModels,\n useDataSources,\n useAgent,\n useQuery,\n useIntentAgent,\n useAuthGuard,\n useFlowstackStatus,\n useUserManagement,\n useSites,\n useAgents,\n useCollection,\n useToolInvocation,\n useConnections,\n useThreads,\n useMessages,\n useSiteVersions,\n useProviderCredentials,\n useOllamaDetection,\n useDataOverview,\n useUserCollections,\n useCollectionExplorer,\n usePublicCollection,\n useConversations,\n COLLECTION_CHANGED_EVENT,\n} from './hooks';\n\nexport type {\n AuthGuardOptions,\n UseAuthGuardReturn,\n ConnectionStatus,\n UseFlowstackStatusReturn,\n UseFlowstackStatusOptions,\n UseToolInvocationOptions,\n UseToolInvocationReturn,\n UseCollectionOptions,\n UseCollectionReturn,\n ConnectionsState,\n GoogleService,\n ServiceProvider,\n UseConnectionsReturn,\n GitHubConnectionStatus,\n CreateCredentialParams,\n UseProviderCredentialsReturn,\n UseDataOverviewReturn,\n UseUserCollectionsOptions,\n UseUserCollectionsReturn,\n UseCollectionExplorerOptions,\n UseCollectionExplorerReturn,\n UsePublicCollectionOptions,\n UsePublicCollectionReturn,\n UseThreadsOptions,\n UseThreadsReturn,\n UseMessagesOptions,\n UseMessagesReturn,\n} from './hooks';\n\n// =============================================================================\n// Mock Mode\n// =============================================================================\n\nexport {\n mockCredentials,\n mockUser,\n mockWorkspaces,\n mockDatasets,\n mockVisualizations,\n mockDataSources,\n mockChatHistory,\n mockManagedUsers,\n mockUserStats,\n mockUserActivity,\n generateMockId,\n mockDelay,\n} from './mock';\n\n// =============================================================================\n// Components\n// =============================================================================\n\nexport {\n // Auth\n LoginForm,\n RegisterForm,\n GoogleSignIn,\n AuthGuard,\n AdminGate,\n BrokeredLoginButton,\n // Workspace\n WorkspaceSelector,\n CreateWorkspaceModal,\n // Datasets\n DatasetUploader,\n // Chat\n ChatInterface,\n MessageList,\n MarkdownRenderer,\n // Pages\n AuthPage,\n DashboardLayout,\n ChatPage,\n} from './components';\n\n// =============================================================================\n// Built-App Monetization (P0-121)\n// =============================================================================\n\n// AppPaywall is intentionally not in the main entry point for tree-shaking.\n// Import from 'flowstack-sdk/wallet':\n// import { AppPaywall, useAppAccess } from 'flowstack-sdk/wallet'\n// Re-exporting type only here for convenience.\nexport type { AppAccessStatus, UseAppAccessReturn, AppPaywallProps } from './wallet/types';\n\n// Component props types\nexport type {\n LoginFormProps,\n RegisterFormProps,\n GoogleSignInProps,\n AuthGuardProps,\n AdminGateProps,\n BrokeredLoginButtonProps,\n WorkspaceSelectorProps,\n CreateWorkspaceModalProps,\n DatasetUploaderProps,\n ChatInterfaceProps,\n MessageListProps,\n MarkdownRendererProps,\n AuthPageProps,\n DashboardLayoutProps,\n ChatPageProps,\n} from './components';\n\n// =============================================================================\n// Types — runtime constants\n// =============================================================================\n\nexport {\n LLM_PROVIDERS,\n CREDENTIAL_PURPOSES,\n DEFAULT_PROVIDER_MODEL_SETTINGS,\n isProviderCredential,\n COLLECTION_LAYERS,\n} from './types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type {\n // Config\n FlowstackConfig,\n AuthConfig,\n RedisConfig,\n DatabaseConfig,\n // Auth\n User,\n FlowstackCredentials,\n LoginRequest,\n LoginResponse,\n RegisterRequest,\n RegisterResponse,\n GoogleAuthResponse,\n // Session & Workspace\n SessionState,\n WorkspaceInfo,\n CreateWorkspaceRequest,\n // Datasets\n DatasetInfo,\n DatasetPreview,\n ColumnSchema,\n DatasetRow,\n DatasetStreamOptions,\n // Visualizations\n VisualizationData,\n // Reports\n ReportInfo,\n // Models\n ModelInfo,\n // Scripts\n ScriptInfo,\n // Data Sources\n DataSourceType,\n DataSource,\n DataSourceConfig,\n ConnectionTestResult,\n // Chat & Messages\n ChatMessage,\n ToolCall,\n SearchResult,\n SearchResultsData,\n // Streaming\n StreamEvent,\n StreamEventType,\n InterruptInfo,\n DataSourceBadgeInfo,\n // Agent\n AgentTemplate,\n AgentConfig,\n QueryOptions,\n // Usage\n UsageStats,\n UsagePeriod,\n CreditStatus,\n // Hook Returns\n UseAuthReturn,\n UseWorkspaceReturn,\n UseDatasetsReturn,\n UseVisualizationsReturn,\n UseReportsReturn,\n UseModelsReturn,\n UseDataSourcesReturn,\n UseAgentOptions,\n UseAgentReturn,\n UseQueryReturn,\n UseUserManagementReturn,\n // Agents\n AgentInfo,\n UseAgentsReturn,\n // Sites\n PublishedSiteInfo,\n CreateSiteParams,\n UseSitesReturn,\n // Site Versioning\n SiteVersion,\n SiteVersionManifest,\n UseSiteVersionsReturn,\n PublishToGitHubParams,\n PublishToGitHubResult,\n // Provider Credentials\n LLMProvider,\n CredentialPurpose,\n ProviderCredential,\n ProviderModelSettings,\n PurposeInfo,\n // Collection Layers\n CollectionLayer,\n // Ollama\n OllamaLocalModel,\n OllamaStatus,\n // Collection Explorer\n CollectionSchemaInfo,\n UserCollectionInfo,\n // Data Explorer\n UserDataOverview,\n UserDataOverviewWorkspace,\n // GitHub\n GitHubRepo,\n // PII\n PiiSettings,\n PiiEntitySettings,\n PiiRedactedEntity,\n // API\n ApiResponse,\n ListResponse,\n // Context\n FlowstackContextValue,\n // User Management\n UserRole,\n UserStatus,\n UserActivityType,\n ManagedUser,\n UserActivityLog,\n UpdateUserRequest,\n UserStats,\n UserListParams,\n UserListResponse,\n} from './types';\n\n// =============================================================================\n// API Client\n// =============================================================================\n\nexport {\n flowstackFetch,\n listWorkspaces,\n createWorkspace,\n getWorkspace,\n listDatasets,\n getDataset,\n getDatasetPreview,\n deleteDataset,\n listVisualizations,\n listReports,\n listModels,\n listScripts,\n getModel,\n listDataSources,\n createDataSource,\n testDataSource,\n deleteDataSource,\n executeQuery,\n executeQueryWithConfig,\n uploadFile,\n login,\n register,\n googleLogin,\n // User Management\n listUsers,\n getUser,\n updateUser,\n deleteUser,\n suspendUser,\n reactivateUser,\n getUserActivity,\n getUserStats,\n checkAdminPermissions,\n // Conversation History\n getConversationHistory,\n // Agents\n listAgents,\n // Sites\n listSites,\n getSite,\n createSite,\n addSiteFile,\n publishStagedSite,\n deleteSite,\n // Site Versioning\n getSiteVersions,\n promoteSiteVersion,\n deleteSiteVersion,\n // Site Aliases\n setSiteAlias,\n removeSiteAlias,\n // GitHub Publishing\n publishToGitHub,\n // Collections — direct MongoDB CRUD\n insertDocuments,\n updateDocuments,\n deleteDocuments,\n // Private messaging (P0-138)\n listThreads,\n listMessages,\n sendMessage,\n openThread,\n markMessageRead,\n dmPairKey,\n // Direct tool invocation\n invokeTool,\n // GitHub Import\n listGitHubRepos,\n importFromGitHub,\n // PII Settings & Masking\n getPiiSettings,\n updatePiiSettings,\n previewPiiMasking,\n getPiiAllowlist,\n addPiiAllowlistTerm,\n removePiiAllowlistTerm,\n // User Data Explorer\n getUserDataOverview,\n getUserCollections,\n getUserCollectionDocuments,\n getUserCollectionSchema,\n deleteUserCollection,\n exportUserCollection,\n} from './api/client';\n\nexport type {\n FlowstackClientConfig,\n RequestOptions,\n DmMessage,\n DmThread,\n} from './api/client';\n\n// =============================================================================\n// Cache\n// =============================================================================\n\nexport {\n CACHE_TTL,\n getCachedWorkspaces,\n setCachedWorkspaces,\n invalidateWorkspacesCache,\n getCachedDatasets,\n setCachedDatasets,\n invalidateDatasetsCache,\n getCachedVisualizations,\n setCachedVisualizations,\n invalidateVisualizationsCache,\n getCachedReports,\n setCachedReports,\n invalidateReportsCache,\n invalidateWorkspaceArtifacts,\n invalidateAllUserCache,\n getCachedSites,\n setCachedSites,\n invalidateSitesCache,\n getCached,\n setCached,\n deleteCached,\n} from './api/cache';\n\n// =============================================================================\n// Utilities\n// =============================================================================\n\nexport {\n // SSE Parser (browser-safe)\n parseSSELine,\n parseSSEStream,\n processSSEStream,\n // Storage (browser-safe)\n saveCredentials,\n loadCredentials,\n clearCredentials,\n saveSelectedWorkspace,\n loadSelectedWorkspace,\n clearSelectedWorkspace,\n saveMessages,\n loadMessages,\n clearMessages,\n setItem,\n getItem,\n removeItem,\n clearAllFlowstackData,\n // Mermaid utilities (browser-safe)\n sanitizeMermaidCode,\n splitContentSegments,\n} from './utils';\n\nexport type { ContentSegment } from './utils';\n\n// =============================================================================\n// Templates\n// =============================================================================\n\nexport {\n dataScienceTemplate,\n marketingTemplate,\n supportTemplate,\n createCustomTemplate,\n getAgentTemplate,\n} from './templates';\n\n// =============================================================================\n// Agent Factory\n// =============================================================================\n\nexport {\n AgentFactory,\n IntentAnalyzer,\n AgentRegistry,\n DEFAULT_PATTERNS,\n extractEntities,\n analyzeWithRules,\n} from './factory';\n\nexport type {\n DynamicAgentConfig,\n IntentCategory,\n IntentEntity,\n IntentAnalysis,\n IntentPattern,\n RegisteredAgent,\n AgentFactoryOptions,\n IntentAnalyzerOptions,\n AgentRegistryOptions,\n UseIntentAgentOptions,\n UseIntentAgentReturn,\n LLMExecutor,\n} from './factory';\n\n// =============================================================================\n// API Route Generators — SERVER-ONLY\n// =============================================================================\n// createLoginRoute and createRegisterRoute use Node.js crypto + jsonwebtoken.\n// Import them directly: import { createLoginRoute } from 'flowstack-sdk/api/routes'\n// They are NOT exported from the main entry point to keep it browser-safe.\n\nexport type {\n LoginRouteConfig,\n RegisterRouteConfig,\n} from './api/routes';\n\n// =============================================================================\n// Session Locking (P0-75) — stub until full implementation ships\n// =============================================================================\nexport function useCurrentSession() {\n return {\n currentSession: null as { sessionId: string } | null,\n lockStatus: 'available' as 'available' | 'elsewhere' | 'claimed',\n claim: async () => {},\n release: async () => {},\n };\n}\n\n// useConversations is now a real hook — exported from hooks/useConversations.ts via hooks/index.ts\n\n// Real implementations — see hooks/useModelPreference.ts and\n// hooks/useAdminProviderCredentials.ts. Previously these were return-empty\n// stubs whose shape didn't even match what ModelSettingsView consumed, which\n// blanked the Settings → Model page via React's error boundary.\nexport { useModelPreference } from './hooks/useModelPreference';\nexport type { UseModelPreferenceReturn } from './hooks/useModelPreference';\n\nexport { useAdminProviderCredentials } from './hooks/useAdminProviderCredentials';\nexport type { UseAdminProviderCredentialsReturn } from './hooks/useAdminProviderCredentials';\n\nexport type {\n ModelOption,\n ModelPreferenceState,\n AdminProviderCredential,\n ExistingProviderCredential,\n CreateAdminProviderCredentialInput,\n} from './types';\n\nexport { useAutomations } from './hooks/useAutomations';\nexport type { Automation, AutomationRun, CreateAutomationInput, UpdateAutomationInput, UseAutomationsReturn, AutomationOutputConfig, AutomationOutputType, AutomationStatus } from './hooks/useAutomations';\n\nexport { useIntegrations } from './hooks/useIntegrations';\nexport type { Integration, CreateIntegrationInput, UpdateIntegrationInput, UseIntegrationsReturn, IntegrationEndpoint, IntegrationAuthType } from './hooks/useIntegrations';\n\nexport { useLibrary } from './hooks/useLibrary';\nexport type { UseLibraryReturn } from './hooks/useLibrary';\n\nexport function useLibraryConversations() {\n return {\n conversations: [] as LibraryConversationSummary[],\n isLoading: false,\n error: null as string | null,\n refresh: () => {},\n star: async (_id: string) => {},\n unstar: async (_id: string) => {},\n deleteConversation: async (_id: string) => {},\n };\n}\n\nexport function useRecentLibraryConversations(_limit?: number) {\n return {\n items: [] as LibraryConversationSummary[],\n conversations: [] as LibraryConversationSummary[],\n isLoading: false,\n error: null as string | null,\n refresh: () => {},\n };\n}\n\nexport function useLibrarySearch(_options?: string | { limit?: number }) {\n return {\n results: [] as LibraryItem[],\n isLoading: false,\n query: '' as string,\n setQuery: (_q: string) => {},\n error: null as string | null,\n clear: () => {},\n };\n}\n\nexport function useLibraryTrash() {\n return {\n items: [] as TrashedItem[],\n isLoading: false,\n restore: async (_id: string) => {},\n deletePermanently: async (_id: string) => {},\n refresh: () => {},\n };\n}\n\nexport { useSubagents } from './hooks/useSubagents';\n\nexport function useSubagentInvoke() {\n return {\n invoke: async (_id: string, _input: Record<string, unknown>): Promise<SubagentInvokeRun> => ({\n runId: '',\n status: 'pending' as const,\n output: null,\n }),\n isRunning: false,\n error: null as string | null,\n };\n}\n\nexport { getSubagent } from './hooks/useSubagents';\n\nexport async function listLibraryItems(\n credentials: { apiKey: string; tenantId: string; userId: string },\n type: string,\n _options?: { limit?: number },\n config?: { baseUrl?: string },\n): Promise<{ ok: boolean; data?: { total: number | null; items: unknown[] }; error?: string }> {\n const TYPE_PATH: Record<string, string> = {\n dataset: 'datasets', visualization: 'visualizations', code: 'code',\n document: 'documents', report: 'reports', model: 'models',\n };\n const seg = TYPE_PATH[type];\n if (!seg || !credentials?.apiKey) return { ok: false };\n try {\n const base = config?.baseUrl || 'https://sage-api.flowstack.fun';\n const url = new URL(`${base}/library/${seg}`);\n url.searchParams.set('user_id', credentials.userId);\n url.searchParams.set('limit', '1');\n const resp = await fetch(url.toString(), {\n headers: {\n Authorization: `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': credentials.tenantId,\n 'X-User-ID': credentials.userId,\n },\n });\n if (!resp.ok) return { ok: false, error: `${resp.status}` };\n const data = await resp.json();\n return { ok: true, data: { total: data.total ?? null, items: data.items ?? [] } };\n } catch (e: any) {\n return { ok: false, error: e.message };\n }\n}\n\n// Automation types now come from ./hooks/useAutomations (real implementation above)\nexport type LibraryItemType = 'dataset' | 'visualization' | 'code' | 'document' | 'report' | 'model' | 'conversation' | 'script';\nexport interface LibraryItem {\n /** Primary display name (from backend \"name\" field) */\n name: string;\n type?: string;\n /** ISO string or Unix epoch (number) */\n created_at?: string | number;\n updated_at?: string | number;\n size_bytes?: number;\n format?: string;\n source_conversation_title_snapshot?: string;\n source?: string;\n // Legacy camelCase aliases kept for compat\n id?: string;\n title?: string;\n createdAt?: string;\n [key: string]: unknown;\n}\nexport type LibraryItemDetail = LibraryItem & { content: string };\nexport type LibraryConversationSummary = {\n id: string;\n conversation_id?: string;\n title: string;\n lastMessageAt?: string;\n last_activity_at?: string;\n first_message_preview?: string;\n last_snippet?: string;\n message_count?: number;\n starred?: boolean;\n};\nexport type TrashedItem = { id: string; type: LibraryItemType; title: string; trashedAt: string };\nexport type SubagentSummary = { id: string; name: string; description: string; source?: string; site_id?: string };\nexport type SubagentDefinition = SubagentSummary & {\n /** snake_case from backend — preferred */\n system_prompt?: string;\n /** camelCase alias — kept for compat */\n systemPrompt?: string;\n tools?: string[];\n model?: string;\n max_turns?: number;\n max_cost_usd?: number;\n created_at?: string;\n};\nexport type SubagentInvokeRun = { runId: string; status: 'pending' | 'running' | 'done' | 'error'; output: string | null };\n\nexport { useConversation } from './hooks/useConversation';\nexport type { UseConversationReturn } from './hooks/useConversation';\n\n// getSubagent is re-exported from hooks/useSubagents above\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/api/client.ts","../src/utils/storage.ts","../src/mock/fixtures.ts","../src/context/FlowstackProvider.tsx","../src/errors/codes.ts","../src/errors/index.ts","../src/config/validator.ts","../src/hooks/useAuth.ts","../src/hooks/useWorkspace.ts","../src/hooks/useDatasets.ts","../src/hooks/useVisualizations.ts","../src/hooks/useReports.ts","../src/hooks/useModels.ts","../src/hooks/useDataSources.ts","../src/utils/sse-parser.ts","../src/utils/stream-utils.ts","../src/hooks/useCollection.ts","../src/hooks/useAgent.ts","../src/hooks/useQuery.ts","../src/factory/intent-analyzer.ts","../src/factory/agent-registry.ts","../src/factory/agent-factory.ts","../src/hooks/useIntentAgent.ts","../src/hooks/useAuthGuard.ts","../src/hooks/useFlowstackStatus.ts","../src/hooks/useUserManagement.ts","../src/hooks/useSites.ts","../src/hooks/useAgents.ts","../src/hooks/useToolInvocation.ts","../src/hooks/useConnections.ts","../src/hooks/useThreads.ts","../src/hooks/useMessages.ts","../src/hooks/useSiteVersions.ts","../src/hooks/useProviderCredentials.ts","../src/hooks/useOllamaDetection.ts","../src/hooks/useDataOverview.ts","../src/hooks/useUserCollections.ts","../src/hooks/useCollectionExplorer.ts","../src/hooks/usePublicCollection.ts","../src/hooks/useConversations.ts","../src/hooks/useIntegrations.ts","../src/hooks/useAutomations.ts","../src/components/auth/LoginForm.tsx","../src/components/auth/RegisterForm.tsx","../src/components/auth/GoogleSignIn.tsx","../src/components/auth/BrokeredLoginButton.tsx","../src/components/auth/AuthGuard.tsx","../src/components/auth/AdminGate.tsx","../src/components/workspace/WorkspaceSelector.tsx","../src/components/workspace/CreateWorkspaceModal.tsx","../src/components/datasets/DatasetUploader.tsx","../src/utils/mermaid-utils.ts","../src/components/chat/MermaidDiagram.tsx","../src/components/chat/MessageList.tsx","../src/components/chat/ChatInterface.tsx","../src/components/chat/MarkdownRenderer.tsx","../src/components/pages/AuthPage.tsx","../src/components/pages/DashboardLayout.tsx","../src/components/pages/ChatPage.tsx","../src/types/index.ts","../src/api/cache.ts","../src/templates/index.ts","../src/hooks/useModelPreference.ts","../src/hooks/useAdminProviderCredentials.ts","../src/hooks/useLibrary.ts","../src/hooks/useSubagents.ts","../src/hooks/useConversation.ts","../src/index.ts"],"names":["DEFAULT_BASE_URL","createContext","useState","useEffect","useCallback","createWorkspace","clearMessages","datasets","jsx","useContext","login","register","useMemo","deleteDataset","createDataSource","deleteDataSource","i","useRef","fullContent","generateId","listAgents","getUser","updateUser","suspendUser","reactivateUser","deleteUser","getUserActivity","createSite","deleteSite","openThread","jsxs","Fragment","ReactMarkdown","remarkGfm","_authedFetch","TYPE_PATH"],"mappings":";;;;;;;;;;;;;;;AA8CA,IAAM,gBAAA,GAAmB,gCAAA;AAIzB,IAAM,iBAAA,GAAoB,EAAA;AAwB1B,eAAsB,cAAA,CACpB,QAAA,EACA,OAAA,EACA,MAAA,EACyB;AACzB,EAAA,MAAM,EAAE,SAAS,KAAA,EAAO,IAAA,EAAM,UAAU,EAAC,EAAG,aAAY,GAAI,OAAA;AAC5D,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,gBAAA;AACnC,EAAA,MAAM,gBAAA,GAAmB,QAAQ,gBAAA,KAAqB,KAAA;AAEtD,EAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAU,MAAA,EAAO,GAAI,WAAA;AAGrC,EAAA,IAAI,gBAAA,IAAoB,CAAC,MAAA,EAAQ;AAC/B,IAAA,OAAA,CAAQ,MAAM,kDAAkD,CAAA;AAChE,IAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,EACvE;AAGA,EAAA,MAAM,MAAM,IAAI,GAAA,CAAI,GAAG,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAE,CAAA;AAG3C,EAAA,IAAI,MAAA,KAAW,SAAS,MAAA,EAAQ;AAC9B,IAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,SAAA,EAAW,MAAM,CAAA;AAAA,EACxC;AAGA,EAAA,MAAM,cAAA,GAA8B;AAAA,IAClC,eAAA,EAAiB,UAAU,MAAM,CAAA,CAAA;AAAA,IACjC,aAAA,EAAe,QAAA,IAAY,MAAA,EAAQ,QAAA,IAAY,iBAAA;AAAA,IAC/C,aAAa,MAAA,IAAU,EAAA;AAAA,IACvB,GAAG;AAAA,GACL;AAGA,EAAA,IAAI,IAAA,IAAQ,CAAC,cAAA,CAAe,cAAc,CAAA,EAAG;AAC3C,IAAA,cAAA,CAAe,cAAc,CAAA,GAAI,kBAAA;AAAA,EACnC;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,CAAI,UAAS,EAAG;AAAA,MAC3C,MAAA;AAAA,MACA,OAAA,EAAS,cAAA;AAAA,MACT,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,KAAA;AAAA,KACrC,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,wBAAA,EAA2B,QAAA,CAAS,MAAM,KAAK,SAAS,CAAA;AACtE,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,IAAA;AAAA,MACJ,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB;AAAA,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,qCAAqC,KAAK,CAAA;AACxD,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,GAAA;AAAA,MACR,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,KAClD;AAAA,EACF;AACF;AASA,eAAsB,cAAA,CACpB,WAAA,EACA,KAAA,GAAgB,EAAA,EAChB,MAAA,EAC+F;AAC/F,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,IAAY,MAAA,EAAQ,QAAA,IAAY,iBAAA;AAC7D,EAAA,OAAO,cAAA,CAAe,CAAA,SAAA,EAAY,QAAQ,CAAA,kBAAA,EAAqB,KAAK,CAAA,CAAA,EAAI;AAAA,IACtE;AAAA,KACC,MAAM,CAAA;AACX;AAKA,eAAsB,eAAA,CACpB,WAAA,EACA,IAAA,EACA,WAAA,EACA,MAAA,EACoD;AACpD,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,IAAY,MAAA,EAAQ,QAAA,IAAY,iBAAA;AAC7D,EAAA,OAAO,cAAA,CAAe,CAAA,SAAA,EAAY,QAAQ,CAAA,WAAA,CAAA,EAAe;AAAA,IACvD,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,IAAA;AAAA,MACA,cAAA,EAAgB,IAAA;AAAA,MAChB,WAAA;AAAA,MACA,SAAS,WAAA,CAAY;AAAA;AACvB,KACC,MAAM,CAAA;AACX;AAKA,eAAsB,YAAA,CACpB,WAAA,EACA,WAAA,EACA,MAAA,EACoD;AACpD,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,IAAY,MAAA,EAAQ,QAAA,IAAY,iBAAA;AAC7D,EAAA,OAAO,cAAA,CAAe,CAAA,SAAA,EAAY,QAAQ,CAAA,YAAA,EAAe,WAAW,CAAA,CAAA,EAAI;AAAA,IACtE;AAAA,KACC,MAAM,CAAA;AACX;AASA,eAAsB,YAAA,CACpB,WAAA,EACA,WAAA,EACA,MAAA,EACmD;AAEnD,EAAA,MAAM,QAAQ,WAAA,GACV,CAAA,cAAA,EAAiB,WAAW,CAAA,YAAA,EAAe,WAAW,CAAA,CAAA,GACtD,EAAA;AACJ,EAAA,OAAO,cAAA,CAAe,CAAA,SAAA,EAAY,KAAK,CAAA,CAAA,EAAI;AAAA,IACzC;AAAA,KACC,MAAM,CAAA;AACX;AAKA,eAAsB,UAAA,CACpB,WAAA,EACA,WAAA,EACA,MAAA,EACgD;AAEhD,EAAA,OAAO,cAAA,CAAe,CAAA,UAAA,EAAa,WAAW,CAAA,SAAA,CAAA,EAAa;AAAA,IACzD;AAAA,KACC,MAAM,CAAA;AACX;AAKA,eAAsB,iBAAA,CACpB,WAAA,EACA,WAAA,EACA,WAAA,EACA,MAAA,EACsC;AACtC,EAAA,OAAO,eAAe,CAAA,UAAA,EAAa,WAAW,yBAAyB,WAAW,CAAA,YAAA,EAAe,WAAW,CAAA,SAAA,CAAA,EAAa;AAAA,IACvH;AAAA,KACC,MAAM,CAAA;AACX;AAMA,eAAsB,aAAA,CACpB,YAAA,EACA,YAAA,EACA,OAAA,EAC4C;AAE5C,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,KAAA;AAAA,IACJ,MAAA,EAAQ,GAAA;AAAA,IACR,KAAA,EAAO;AAAA,GACT;AACF;AASA,eAAsB,kBAAA,CACpB,WAAA,EACA,WAAA,EACA,MAAA,EAC+D;AAC/D,EAAA,OAAO,cAAA,CAAe,CAAA,6BAAA,EAAgC,WAAW,CAAA,YAAA,EAAe,WAAW,CAAA,CAAA,EAAI;AAAA,IAC7F;AAAA,KACC,MAAM,CAAA;AACX;AASA,eAAsB,WAAA,CACpB,WAAA,EACA,WAAA,EACA,MAAA,EACiD;AACjD,EAAA,OAAO,cAAA,CAAe,CAAA,sBAAA,EAAyB,WAAW,CAAA,YAAA,EAAe,WAAW,CAAA,CAAA,EAAI;AAAA,IACtF;AAAA,KACC,MAAM,CAAA;AACX;AASA,eAAsB,UAAA,CACpB,WAAA,EACA,WAAA,EACA,MAAA,EAC+C;AAC/C,EAAA,OAAO,cAAA,CAAe,CAAA,qBAAA,EAAwB,WAAW,CAAA,YAAA,EAAe,WAAW,CAAA,CAAA,EAAI;AAAA,IACrF;AAAA,KACC,MAAM,CAAA;AACX;AAKA,eAAsB,QAAA,CACpB,WAAA,EACA,WAAA,EACA,SAAA,EACA,MAAA,EAC4C;AAC5C,EAAA,OAAO,eAAe,CAAA,QAAA,EAAW,SAAS,iBAAiB,WAAW,CAAA,YAAA,EAAe,WAAW,CAAA,CAAA,EAAI;AAAA,IAClG;AAAA,KACC,MAAM,CAAA;AACX;AASA,eAAsB,WAAA,CACpB,WAAA,EACA,WAAA,EACA,MAAA,EACiD;AACjD,EAAA,OAAO,cAAA,CAAe,CAAA,+BAAA,EAAkC,WAAW,CAAA,YAAA,EAAe,WAAW,CAAA,CAAA,EAAI;AAAA,IAC/F;AAAA,KACC,MAAM,CAAA;AACX;AASA,eAAsB,eAAA,CACpB,WAAA,EACA,MAAA,EACA,OAAA,EASqD;AACrD,EAAA,MAAM,EAAA,GAAK,OAAA,EAAS,iBAAA,GAAoB,0BAAA,GAA6B,EAAA;AACrE,EAAA,OAAO,cAAA,CAAe,CAAA,aAAA,EAAgB,EAAE,CAAA,CAAA,EAAI;AAAA,IAC1C;AAAA,KACC,MAAM,CAAA;AACX;AAKA,eAAsB,gBAAA,CACpB,WAAA,EACA,YAAA,EACA,MAAA,EACkC;AAClC,EAAA,OAAO,eAAe,eAAA,EAAiB;AAAA,IACrC,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,aAAa,YAAA,CAAa,IAAA;AAAA,MAC1B,MAAM,YAAA,CAAa,IAAA;AAAA,MACnB,WAAA,EAAa,aAAa,WAAA,IAAe,mBAAA;AAAA,MACzC,WAAA,EAAa,aAAa,WAAA,IAAe;AAAA,QACvC,mBAAmB,YAAA,CAAa;AAAA,OAClC;AAAA,MACA,UAAU,YAAA,CAAa,QAAA;AAAA,MACvB,cAAA,EAAgB,aAAa,cAAA,IAAkB;AAAA;AACjD,KACC,MAAM,CAAA;AACX;AAKA,eAAsB,cAAA,CACpB,WAAA,EACA,QAAA,EACA,MAAA,EAC4C;AAC5C,EAAA,OAAO,cAAA,CAAe,CAAA,cAAA,EAAiB,QAAQ,CAAA,KAAA,CAAA,EAAS;AAAA,IACtD,MAAA,EAAQ,MAAA;AAAA,IACR;AAAA,KACC,MAAM,CAAA;AACX;AAKA,eAAsB,gBAAA,CACpB,WAAA,EACA,QAAA,EACA,MAAA,EAC4C;AAC5C,EAAA,OAAO,cAAA,CAAe,CAAA,cAAA,EAAiB,QAAQ,CAAA,CAAA,EAAI;AAAA,IACjD,MAAA,EAAQ,QAAA;AAAA,IACR;AAAA,KACC,MAAM,CAAA;AACX;AAUA,eAAsB,WACpB,MAAA,EACgF;AAChF,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,gBAAA;AAEnC,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,OAAA,CAAA,EAAW;AAAA,MAChD,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS,EAAE,QAAA,EAAU,kBAAA;AAAmB,KACzC,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,QAAQ,QAAA,CAAS,MAAA,EAAQ,OAAO,SAAA,EAAU;AAAA,IAChE;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,QAAA,CAAS,QAAQ,IAAA,EAAK;AAAA,EACnD,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,GAAA;AAAA,MACR,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,KAClD;AAAA,EACF;AACF;AAUA,eAAsB,YAAA,CACpB,WAAA,EACA,KAAA,EACA,WAAA,EACA,SAqBA,MAAA,EACmB;AACnB,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,gBAAA;AACnC,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,IAAY,MAAA,EAAQ,QAAA,IAAY,iBAAA;AAE7D,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,OAAA,CAAA,EAAW;AAAA,IAChD,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB,kBAAA;AAAA,MAChB,eAAA,EAAiB,CAAA,OAAA,EAAU,WAAA,CAAY,MAAM,CAAA,CAAA;AAAA,MAC7C,aAAA,EAAe,QAAA;AAAA,MACf,WAAA,EAAa,YAAY,MAAA,IAAU,EAAA;AAAA,MACnC,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,MACnB,KAAA;AAAA,MACA,YAAA,EAAc,WAAA;AAAA,MACd,UAAA,EAAY,SAAS,SAAA,IAAa,MAAA;AAAA,MAClC,iBAAA,EAAmB,SAAS,eAAA,IAAmB,MAAA;AAAA,MAC/C,SAAA,EAAW,QAAA;AAAA,MACX,SAAS,WAAA,CAAY,MAAA;AAAA,MACrB,6BAAA,EAA+B,SAAS,WAAA,IAAe,SAAA;AAAA;AAAA;AAAA;AAAA,MAIvD,YAAA,EAAc,SAAS,YAAA,IAAgB,OAAA,CAAQ,aAAa,MAAA,GAAS,CAAA,GACjE,QAAQ,YAAA,GACR;AAAA,KACL;AAAA,GACF,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAGhB,IAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,MAAA,IAAI,OAAY,EAAC;AACjB,MAAA,IAAI;AAAE,QAAA,IAAA,GAAO,MAAM,SAAS,IAAA,EAAK;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAC;AAC7C,MAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,IAAA,EAAM,WAAW,0CAAqC,CAAA;AAC5E,MAAC,IAAY,MAAA,GAAS,GAAA;AACtB,MAAC,IAAY,IAAA,GAAO,sBAAA;AACpB,MAAC,IAAY,IAAA,GAAO,IAAA;AACpB,MAAA,MAAM,GAAA;AAAA,IACR;AAEA,IAAA,IAAI,SAAS,QAAA,CAAS,UAAA;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,MAAA,GAAS,IAAA,EAAM,MAAA,IAAU,IAAA,EAAM,KAAA,IAAS,MAAM,OAAA,IAAW,MAAA;AAAA,IAC3D,CAAA,CAAA,MAAQ;AAAA,IAAC;AACT,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,MAAM,CAAA,CAAE,CAAA;AAAA,EAC3C;AAEA,EAAA,OAAO,QAAA;AACT;AAQA,eAAsB,sBAAA,CACpB,WAAA,EACA,KAAA,EACA,WAAA,EACA,SAuBA,MAAA,EACmB;AACnB,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,gBAAA;AACnC,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,IAAY,MAAA,EAAQ,QAAA,IAAY,iBAAA;AAE7D,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,OAAA,CAAA,EAAW;AAAA,IAChD,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB,kBAAA;AAAA,MAChB,eAAA,EAAiB,CAAA,OAAA,EAAU,WAAA,CAAY,MAAM,CAAA,CAAA;AAAA,MAC7C,aAAA,EAAe,QAAA;AAAA,MACf,WAAA,EAAa,YAAY,MAAA,IAAU,EAAA;AAAA,MACnC,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,MACnB,KAAA;AAAA,MACA,YAAA,EAAc,WAAA;AAAA,MACd,UAAA,EAAY,SAAS,SAAA,IAAa,MAAA;AAAA,MAClC,iBAAA,EAAmB,SAAS,eAAA,IAAmB,MAAA;AAAA,MAC/C,SAAA,EAAW,QAAA;AAAA,MACX,SAAS,WAAA,CAAY,MAAA;AAAA,MACrB,6BAAA,EAA+B,SAAS,WAAA,IAAe,SAAA;AAAA;AAAA,MAEvD,YAAA,EAAc,SAAS,YAAA,IAAgB,OAAA,CAAQ,aAAa,MAAA,GAAS,CAAA,GACjE,QAAQ,YAAA,GACR,MAAA;AAAA,MACJ,wBAAwB,OAAA,EAAS,YAAA;AAAA,MACjC,gBAAgB,OAAA,EAAS,KAAA;AAAA,MACzB,aAAA,EAAe,SAAS,YAAA,IAAgB,MAAA;AAAA;AAAA;AAAA;AAAA,MAIxC,eAAe,OAAA,EAAS,OAAA,GAAU,CAAC,OAAA,CAAQ,OAAO,CAAA,GAAI;AAAA,KACvD;AAAA,GACF,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAMhB,IAAA,IAAI,OAAA,GAAU,SAAS,UAAA,IAAc,gBAAA;AACrC,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,MAAM,QAAA,CAAS,KAAA,EAAM,CAAE,IAAA,EAAK;AACnC,MAAA,MAAM,OAAA,GAAW,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,QAAA,IAAY,IAAA,IAAQ,OAAO,IAAA,CAAK,MAAA,KAAW,QAAA,GAC5F,IAAA,CAAK,MAAA,GACL,IAAA;AACJ,MAAA,IAAI,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC1C,QAAA,IAAA,GAAO,OAAA,CAAQ,IAAA;AACf,QAAA,OAAA,GAAU,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,OAAA,IAAW,QAAQ,MAAA,IAAU,OAAA;AAAA,MAClE,CAAA,MAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AACtC,QAAA,OAAA,GAAU,OAAA;AAAA,MACZ;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,OAAO,CAAA,CAAE,CAAA;AAKhD,IAAA,GAAA,CAAI,SAAS,QAAA,CAAS,MAAA;AACtB,IAAA,GAAA,CAAI,IAAA,GAAO,IAAA;AACX,IAAA,GAAA,CAAI,IAAA,GAAO,IAAA;AACX,IAAA,MAAM,GAAA;AAAA,EACR;AAEA,EAAA,OAAO,QAAA;AACT;AAYA,eAAsB,eAAA,CACpB,WAAA,EACA,UAAA,EACA,OAAA,EAcA,MAAA,EACwE;AACxE,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,EAAA,MAAA,CAAO,GAAA,CAAI,cAAc,UAAU,CAAA;AACnC,EAAA,IAAI,OAAA,EAAS,QAAQ,MAAA,CAAO,GAAA,CAAI,UAAU,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,MAAM,CAAC,CAAA;AACxE,EAAA,IAAI,OAAA,EAAS,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AAC7D,EAAA,IAAI,OAAA,EAAS,MAAM,MAAA,CAAO,GAAA,CAAI,QAAQ,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,CAAA;AAC1D,EAAA,IAAI,OAAA,EAAS,MAAM,MAAA,CAAO,GAAA,CAAI,QAAQ,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAC,CAAA;AAClE,EAAA,IAAI,OAAA,EAAS,YAAY,MAAA,CAAO,GAAA,CAAI,cAAc,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,UAAU,CAAC,CAAA;AACpF,EAAA,IAAI,SAAS,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,QAAQ,KAAK,CAAA;AACrD,EAAA,IAAI,OAAA,EAAS,iBAAA,EAAmB,MAAA,CAAO,GAAA,CAAI,sBAAsB,MAAM,CAAA;AAEvE,EAAA,OAAO,cAAA;AAAA,IACL,CAAA,mBAAA,EAAsB,MAAA,CAAO,QAAA,EAAU,CAAA,CAAA;AAAA,IACvC,EAAE,WAAA,EAAY;AAAA,IACd;AAAA,GACF;AACF;AAQA,eAAsB,eAAA,CACpB,WAAA,EACA,UAAA,EACA,SAAA,EACA,QACA,KAAA,EAC8F;AAC9F,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA;AACvC,EAAA,OAAO,cAAA;AAAA,IACL,qBAAA;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,MAAA;AAAA,MACR,WAAA;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,UAAA;AAAA,QACA,GAAI,OAAA,GAAU,EAAE,WAAU,GAAI,EAAE,UAAU,SAAA,EAAU;AAAA,QACpD,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU;AAAC;AAC3B,KACF;AAAA,IACA;AAAA,GACF;AACF;AAQA,eAAsB,gBACpB,WAAA,EACA,UAAA,EACA,QACA,MAAA,EACA,OAAA,EACA,QACA,KAAA,EAC6F;AAC7F,EAAA,OAAO,cAAA;AAAA,IACL,qBAAA;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,MAAA;AAAA,MACR,WAAA;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,UAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA,EAAQ,SAAS,MAAA,IAAU,KAAA;AAAA,QAC3B,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU;AAAC;AAC3B,KACF;AAAA,IACA;AAAA,GACF;AACF;AAQA,eAAsB,eAAA,CACpB,WAAA,EACA,UAAA,EACA,MAAA,EACA,QACA,KAAA,EACqE;AACrE,EAAA,OAAO,cAAA;AAAA,IACL,qBAAA;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,MAAA;AAAA,MACR,WAAA;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,UAAA;AAAA,QACA,MAAA;AAAA,QACA,GAAI,KAAA,GAAQ,EAAE,KAAA,KAAU;AAAC;AAC3B,KACF;AAAA,IACA;AAAA,GACF;AACF;AAsCO,SAAS,SAAA,CAAU,GAAW,CAAA,EAAmB;AACtD,EAAA,OAAO,CAAC,CAAA,EAAG,CAAC,EAAE,IAAA,EAAK,CAAE,KAAK,IAAI,CAAA;AAChC;AAEA,SAAS,gBAAgB,MAAA,EAAwC;AAC/D,EAAA,MAAM,QAAQ,MAAA,EAAQ,QAAA;AACtB,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,MAAM,8DAA8D,CAAA;AAAA,EAChF;AACA,EAAA,OAAO,KAAA;AACT;AAGA,eAAsB,WAAA,CACpB,aACA,MAAA,EAC8D;AAC9D,EAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,EAAA,OAAO,cAAA;AAAA,IACL,CAAA,MAAA,EAAS,kBAAA,CAAmB,KAAK,CAAC,CAAA,QAAA,CAAA;AAAA,IAClC,EAAE,WAAA,EAAY;AAAA,IACd;AAAA,GACF;AACF;AAGA,eAAsB,YAAA,CACpB,WAAA,EACA,WAAA,EACA,OAAA,EACA,MAAA,EACgE;AAChE,EAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,EAAA,MAAA,CAAO,GAAA,CAAI,QAAQ,WAAW,CAAA;AAC9B,EAAA,IAAI,OAAA,EAAS,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AAC7D,EAAA,IAAI,SAAS,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,QAAQ,MAAM,CAAA;AACxD,EAAA,OAAO,cAAA;AAAA,IACL,SAAS,kBAAA,CAAmB,KAAK,CAAC,CAAA,UAAA,EAAa,MAAA,CAAO,UAAU,CAAA,CAAA;AAAA,IAChE,EAAE,WAAA,EAAY;AAAA,IACd;AAAA,GACF;AACF;AAGA,eAAsB,WAAA,CACpB,WAAA,EACA,SAAA,EACA,IAAA,EACA,MAAA,EACkE;AAClE,EAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,EAAA,OAAO,cAAA;AAAA,IACL,CAAA,MAAA,EAAS,kBAAA,CAAmB,KAAK,CAAC,CAAA,SAAA,CAAA;AAAA,IAClC,EAAE,QAAQ,MAAA,EAAQ,WAAA,EAAa,MAAM,EAAE,WAAA,EAAa,SAAA,EAAW,IAAA,EAAK,EAAE;AAAA,IACtE;AAAA,GACF;AACF;AAMA,eAAsB,UAAA,CACpB,WAAA,EACA,WAAA,EACA,MAAA,EAC4D;AAC5D,EAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,EAAA,MAAM,KAAK,WAAA,CAAY,MAAA;AACvB,EAAA,IAAI,CAAC,EAAA,EAAI,MAAM,IAAI,MAAM,4CAA4C,CAAA;AACrE,EAAA,MAAM,EAAA,GAAK,SAAA,CAAU,EAAA,EAAI,WAAW,CAAA;AACpC,EAAA,OAAO,cAAA;AAAA,IACL,SAAS,kBAAA,CAAmB,KAAK,CAAC,CAAA,SAAA,EAAY,kBAAA,CAAmB,EAAE,CAAC,CAAA,QAAA,CAAA;AAAA,IACpE,EAAE,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAY;AAAA,IAC9B;AAAA,GACF;AACF;AAGA,eAAsB,eAAA,CACpB,WAAA,EACA,SAAA,EACA,MAAA,EAC6D;AAC7D,EAAA,MAAM,KAAA,GAAQ,gBAAgB,MAAM,CAAA;AACpC,EAAA,OAAO,cAAA;AAAA,IACL,SAAS,kBAAA,CAAmB,KAAK,CAAC,CAAA,UAAA,EAAa,kBAAA,CAAmB,SAAS,CAAC,CAAA,KAAA,CAAA;AAAA,IAC5E,EAAE,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAY;AAAA,IAC9B;AAAA,GACF;AACF;AASA,eAAsB,WACpB,WAAA,EACA,SAAA,EACA,UACA,MAAA,GAA8B,IAC9B,MAAA,EACqD;AACrD,EAAA,OAAO,cAAA;AAAA,IACL,cAAA;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,MAAA;AAAA,MACR,WAAA;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,UAAA,EAAY,SAAA;AAAA,QACZ,SAAA,EAAW,QAAA;AAAA,QACX;AAAA;AACF,KACF;AAAA,IACA;AAAA,GACF;AACF;AASA,eAAsB,UAAA,CACpB,WAAA,EACA,WAAA,EACA,IAAA,EACA,MACA,MAAA,EACsE;AACtE,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,gBAAA;AACnC,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,IAAY,MAAA,EAAQ,QAAA,IAAY,iBAAA;AAE7D,EAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAC9B,EAAA,QAAA,CAAS,MAAA,CAAO,QAAQ,IAAI,CAAA;AAC5B,EAAA,QAAA,CAAS,MAAA,CAAO,gBAAgB,WAAW,CAAA;AAC3C,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,QAAA,CAAS,MAAA,CAAO,QAAQ,IAAI,CAAA;AAC5B,IAAA,QAAA,CAAS,MAAA,CAAO,gBAAgB,IAAI,CAAA;AAAA,EACtC;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,OAAA,CAAA,EAAW;AAAA,MAChD,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,eAAA,EAAiB,CAAA,OAAA,EAAU,WAAA,CAAY,MAAM,CAAA,CAAA;AAAA,QAC7C,aAAA,EAAe,QAAA;AAAA,QACf,WAAA,EAAa,YAAY,MAAA,IAAU,EAAA;AAAA,QACnC,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,IAAA,EAAM;AAAA,KACP,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,IAAA;AAAA,MACJ,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB;AAAA,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,GAAA;AAAA,MACR,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,KAClD;AAAA,EACF;AACF;AAWA,eAAsB,cAAA,CACpB,WAAA,EACA,WAAA,EACA,IAAA,EACA,cACA,MAAA,EAC4H;AAC5H,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,gBAAA;AACnC,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,IAAY,MAAA,EAAQ,QAAA,IAAY,iBAAA;AAE7D,EAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAC9B,EAAA,QAAA,CAAS,MAAA,CAAO,QAAQ,IAAI,CAAA;AAC5B,EAAA,QAAA,CAAS,MAAA,CAAO,gBAAgB,WAAW,CAAA;AAC3C,EAAA,IAAI,YAAA,EAAc,QAAA,CAAS,MAAA,CAAO,eAAA,EAAiB,YAAY,CAAA;AAE/D,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,gBAAA,CAAA,EAAoB;AAAA,MACzD,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,eAAA,EAAiB,CAAA,OAAA,EAAU,WAAA,CAAY,MAAM,CAAA,CAAA;AAAA,QAC7C,aAAA,EAAe,QAAA;AAAA,QACf,WAAA,EAAa,YAAY,MAAA,IAAU,EAAA;AAAA,QACnC,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,IAAA,EAAM;AAAA,KACP,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,QAAQ,QAAA,CAAS,MAAA,EAAQ,OAAO,SAAA,EAAU;AAAA,IAChE;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,QAAA,CAAS,QAAQ,IAAA,EAAK;AAAA,EACnD,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,GAAA;AAAA,MACR,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,KAClD;AAAA,EACF;AACF;AASA,eAAsB,KAAA,CACpB,KAAA,EACA,QAAA,EACA,MAAA,EAKE;AACF,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,gBAAA;AAEnC,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,gBAAA,CAAA,EAAoB;AAAA,MACzD,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,GAAI,QAAQ,QAAA,GAAW,EAAE,eAAe,MAAA,CAAO,QAAA,KAAa;AAAC,OAC/D;AAAA,MACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,KAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAI,QAAQ,QAAA,GAAW,EAAE,WAAW,MAAA,CAAO,QAAA,KAAa;AAAC,OAC1D;AAAA,KACF,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,IAAA;AAAA,MACJ,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB;AAAA,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,GAAA;AAAA,MACR,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,KAClD;AAAA,EACF;AACF;AAKA,eAAsB,QAAA,CACpB,KAAA,EACA,QAAA,EACA,MAAA,EACyG;AACzG,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,gBAAA;AAEnC,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,mBAAA,CAAA,EAAuB;AAAA,MAC5D,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,GAAI,QAAQ,QAAA,GAAW,EAAE,eAAe,MAAA,CAAO,QAAA,KAAa;AAAC,OAC/D;AAAA,MACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,KAAA;AAAA,QACA,QAAA;AAAA,QACA,uBAAA,EAAyB,IAAA;AAAA,QACzB,GAAI,QAAQ,QAAA,GAAW,EAAE,WAAW,MAAA,CAAO,QAAA,KAAa;AAAC,OAC1D;AAAA,KACF,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,IAAA;AAAA,MACJ,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB;AAAA,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,GAAA;AAAA,MACR,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,KAClD;AAAA,EACF;AACF;AAMA,eAAsB,WAAA,CACpB,IAAA,EACA,WAAA,EACA,MAAA,EAC2G;AAC3G,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,gBAAA;AAEnC,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,kBAAA,CAAA,EAAsB;AAAA,MAC3D,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,GAAI,QAAQ,QAAA,GAAW,EAAE,eAAe,MAAA,CAAO,QAAA,KAAa;AAAC,OAC/D;AAAA,MACA,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,YAAA,EAAc,aAAa;AAAA,KACzD,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,IAAA;AAAA,MACJ,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB;AAAA,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ,GAAA;AAAA,MACR,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,KAClD;AAAA,EACF;AACF;AASA,eAAsB,SAAA,CACpB,WAAA,EACA,MAAA,EACA,MAAA,EACwC;AACxC,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,IAAY,MAAA,EAAQ,QAAA,IAAY,iBAAA;AAG7D,EAAA,MAAM,WAAA,GAAc,IAAI,eAAA,EAAgB;AACxC,EAAA,IAAI,MAAA,EAAQ,MAAM,WAAA,CAAY,GAAA,CAAI,QAAQ,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAC7D,EAAA,IAAI,MAAA,EAAQ,OAAO,WAAA,CAAY,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAChE,EAAA,IAAI,QAAQ,MAAA,EAAQ,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,OAAO,MAAM,CAAA;AAC3D,EAAA,IAAI,QAAQ,IAAA,EAAM,WAAA,CAAY,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAI,CAAA;AACrD,EAAA,IAAI,QAAQ,MAAA,EAAQ,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,OAAO,MAAM,CAAA;AAC3D,EAAA,IAAI,QAAQ,MAAA,EAAQ,WAAA,CAAY,GAAA,CAAI,SAAA,EAAW,OAAO,MAAM,CAAA;AAC5D,EAAA,IAAI,QAAQ,SAAA,EAAW,WAAA,CAAY,GAAA,CAAI,YAAA,EAAc,OAAO,SAAS,CAAA;AAErE,EAAA,MAAM,WAAA,GAAc,YAAY,QAAA,EAAS;AACzC,EAAA,MAAM,QAAA,GAAW,YAAY,QAAQ,CAAA,MAAA,EAAS,cAAc,CAAA,CAAA,EAAI,WAAW,KAAK,EAAE,CAAA,CAAA;AAElF,EAAA,OAAO,cAAA,CAAiC,QAAA,EAAU,EAAE,WAAA,IAAe,MAAM,CAAA;AAC3E;AAKA,eAAsB,OAAA,CACpB,WAAA,EACA,MAAA,EACA,MAAA,EAC6C;AAC7C,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,IAAY,MAAA,EAAQ,QAAA,IAAY,iBAAA;AAC7D,EAAA,OAAO,cAAA,CAAe,YAAY,QAAQ,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,EAAI,EAAE,WAAA,EAAY,EAAG,MAAM,CAAA;AACvF;AAKA,eAAsB,UAAA,CACpB,WAAA,EACA,MAAA,EACA,OAAA,EACA,MAAA,EAC6C;AAC7C,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,IAAY,MAAA,EAAQ,QAAA,IAAY,iBAAA;AAC7D,EAAA,OAAO,cAAA,CAAe,CAAA,SAAA,EAAY,QAAQ,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,EAAI;AAAA,IAC5D,MAAA,EAAQ,OAAA;AAAA,IACR,WAAA;AAAA,IACA,IAAA,EAAM;AAAA,KACL,MAAM,CAAA;AACX;AAKA,eAAsB,UAAA,CACpB,WAAA,EACA,MAAA,EACA,MAAA,EAC4C;AAC5C,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,IAAY,MAAA,EAAQ,QAAA,IAAY,iBAAA;AAC7D,EAAA,OAAO,cAAA,CAAe,CAAA,SAAA,EAAY,QAAQ,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,EAAI;AAAA,IAC5D,MAAA,EAAQ,QAAA;AAAA,IACR;AAAA,KACC,MAAM,CAAA;AACX;AAKA,eAAsB,WAAA,CACpB,WAAA,EACA,MAAA,EACA,MAAA,EACA,MAAA,EAC6C;AAC7C,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,IAAY,MAAA,EAAQ,QAAA,IAAY,iBAAA;AAC7D,EAAA,OAAO,cAAA,CAAe,CAAA,SAAA,EAAY,QAAQ,CAAA,OAAA,EAAU,MAAM,CAAA,QAAA,CAAA,EAAY;AAAA,IACpE,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA;AAAA,IACA,IAAA,EAAM,MAAA,GAAS,EAAE,MAAA,EAAO,GAAI;AAAA,KAC3B,MAAM,CAAA;AACX;AAKA,eAAsB,cAAA,CACpB,WAAA,EACA,MAAA,EACA,MAAA,EAC6C;AAC7C,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,IAAY,MAAA,EAAQ,QAAA,IAAY,iBAAA;AAC7D,EAAA,OAAO,cAAA,CAAe,CAAA,SAAA,EAAY,QAAQ,CAAA,OAAA,EAAU,MAAM,CAAA,WAAA,CAAA,EAAe;AAAA,IACvE,MAAA,EAAQ,MAAA;AAAA,IACR;AAAA,KACC,MAAM,CAAA;AACX;AAKA,eAAsB,eAAA,CACpB,WAAA,EACA,MAAA,EACA,KAAA,GAAgB,IAChB,MAAA,EACyD;AACzD,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,IAAY,MAAA,EAAQ,QAAA,IAAY,iBAAA;AAC7D,EAAA,OAAO,eAAe,CAAA,SAAA,EAAY,QAAQ,UAAU,MAAM,CAAA,gBAAA,EAAmB,KAAK,CAAA,CAAA,EAAI;AAAA,IACpF;AAAA,KACC,MAAM,CAAA;AACX;AAKA,eAAsB,YAAA,CACpB,aACA,MAAA,EACiC;AACjC,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,IAAY,MAAA,EAAQ,QAAA,IAAY,iBAAA;AAC7D,EAAA,OAAO,eAAe,CAAA,SAAA,EAAY,QAAQ,gBAAgB,EAAE,WAAA,IAAe,MAAM,CAAA;AACnF;AAKA,eAAsB,qBAAA,CACpB,aACA,MAAA,EACiE;AACjE,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,IAAY,MAAA,EAAQ,QAAA,IAAY,iBAAA;AAC7D,EAAA,OAAO,eAAe,CAAA,SAAA,EAAY,QAAQ,yBAAyB,EAAE,WAAA,IAAe,MAAM,CAAA;AAC5F;AASA,eAAsB,sBAAA,CACpB,WAAA,EACA,WAAA,EACA,OAAA,EACA,MAAA,EACiG;AACjG,EAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,EAAA,MAAA,CAAO,GAAA,CAAI,cAAc,WAAW,CAAA;AACpC,EAAA,IAAI,OAAA,EAAS,OAAO,MAAA,CAAO,GAAA,CAAI,SAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AAC7D,EAAA,IAAI,OAAA,EAAS,QAAQ,MAAA,CAAO,GAAA,CAAI,UAAU,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAC,CAAA;AAEhE,EAAA,OAAO,cAAA;AAAA,IACL,CAAA,eAAA,EAAkB,MAAA,CAAO,QAAA,EAAU,CAAA,CAAA;AAAA,IACnC,EAAE,MAAA,EAAQ,KAAA,EAAO,WAAA,EAAY;AAAA,IAC7B;AAAA,GACF;AACF;AAgBA,eAAsB,SAAA,CACpB,aACA,MAAA,EACqE;AACrE,EAAA,OAAO,eAAe,eAAA,EAAiB,EAAE,QAAQ,KAAA,EAAO,WAAA,IAAe,MAAM,CAAA;AAC/E;AAKA,eAAsB,OAAA,CACpB,WAAA,EACA,MAAA,EACA,MAAA,EACmD;AACnD,EAAA,OAAO,cAAA,CAAe,iBAAiB,MAAM,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,KAAA,EAAO,WAAA,EAAY,EAAG,MAAM,CAAA;AACzF;AAMA,eAAsB,UAAA,CACpB,WAAA,EACA,MAAA,EACA,MAAA,EACqF;AACrF,EAAA,OAAO,eAAe,eAAA,EAAiB;AAAA,IACrC,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,WAAW,MAAA,CAAO,IAAA;AAAA,MAClB,SAAA,EAAW,OAAO,QAAA,IAAY,WAAA;AAAA,MAC9B,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,OAAO,MAAA,CAAO;AAAA;AAChB,KACC,MAAM,CAAA;AACX;AAMA,eAAsB,WAAA,CACpB,WAAA,EACA,MAAA,EACA,QAAA,EACA,SACA,MAAA,EAC4C;AAC5C,EAAA,OAAO,cAAA,CAAe,CAAA,cAAA,EAAiB,MAAM,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAA,EAAI;AAAA,IACjE,MAAA,EAAQ,KAAA;AAAA,IACR,WAAA;AAAA,IACA,IAAA,EAAM,EAAE,OAAA;AAAQ,KACf,MAAM,CAAA;AACX;AAKA,eAAsB,iBAAA,CACpB,WAAA,EACA,MAAA,EACA,MAAA,EACmD;AACnD,EAAA,OAAO,cAAA,CAAe,CAAA,cAAA,EAAiB,MAAM,CAAA,QAAA,CAAA,EAAY;AAAA,IACvD,MAAA,EAAQ,MAAA;AAAA,IACR;AAAA,KACC,MAAM,CAAA;AACX;AAKA,eAAsB,UAAA,CACpB,WAAA,EACA,MAAA,EACA,MAAA,EAC4C;AAC5C,EAAA,OAAO,cAAA,CAAe,CAAA,cAAA,EAAiB,MAAM,CAAA,CAAA,EAAI;AAAA,IAC/C,MAAA,EAAQ,QAAA;AAAA,IACR;AAAA,KACC,MAAM,CAAA;AACX;AAMA,eAAsB,eAAA,CACpB,WAAA,EACA,MAAA,EACA,MAAA,EAC2C;AAC3C,EAAA,OAAO,cAAA,CAAe,CAAA,cAAA,EAAiB,MAAM,CAAA,SAAA,CAAA,EAAa;AAAA,IACxD,MAAA,EAAQ,KAAA;AAAA,IACR;AAAA,KACC,MAAM,CAAA;AACX;AAEA,eAAsB,kBAAA,CACpB,WAAA,EACA,MAAA,EACA,OAAA,EACA,MAAA,EAC2C;AAC3C,EAAA,OAAO,cAAA,CAAe,CAAA,cAAA,EAAiB,MAAM,CAAA,QAAA,CAAA,EAAY;AAAA,IACvD,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA;AAAA,IACA,IAAA,EAAM,EAAE,OAAA;AAAQ,KACf,MAAM,CAAA;AACX;AAEA,eAAsB,iBAAA,CACpB,WAAA,EACA,MAAA,EACA,OAAA,EACA,MAAA,EAC2C;AAC3C,EAAA,OAAO,cAAA,CAAe,CAAA,cAAA,EAAiB,MAAM,CAAA,UAAA,EAAa,OAAO,CAAA,CAAA,EAAI;AAAA,IACnE,MAAA,EAAQ,QAAA;AAAA,IACR;AAAA,KACC,MAAM,CAAA;AACX;AAMA,eAAsB,YAAA,CACpB,WAAA,EACA,MAAA,EACA,KAAA,EACA,MAAA,EACsD;AACtD,EAAA,OAAO,cAAA,CAAe,CAAA,cAAA,EAAiB,MAAM,CAAA,MAAA,CAAA,EAAU;AAAA,IACrD,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA;AAAA,IACA,IAAA,EAAM,EAAE,KAAA;AAAM,KACb,MAAM,CAAA;AACX;AAEA,eAAsB,eAAA,CACpB,WAAA,EACA,MAAA,EACA,MAAA,EAC4C;AAC5C,EAAA,OAAO,cAAA,CAAe,CAAA,cAAA,EAAiB,MAAM,CAAA,MAAA,CAAA,EAAU;AAAA,IACrD,MAAA,EAAQ,QAAA;AAAA,IACR;AAAA,KACC,MAAM,CAAA;AACX;AAMA,eAAsB,eAAA,CACpB,WAAA,EACA,MAAA,EACA,MAAA,EACA,MAAA,EAC6C;AAC7C,EAAA,OAAO,cAAA,CAAe,CAAA,cAAA,EAAiB,MAAM,CAAA,eAAA,CAAA,EAAmB;AAAA,IAC9D,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,WAAW,MAAA,CAAO,QAAA;AAAA,MAClB,OAAA,EAAS,OAAO,SAAA,IAAa,IAAA;AAAA,MAC7B,GAAI,OAAO,OAAA,IAAW,IAAA,GAAO,EAAE,OAAA,EAAS,MAAA,CAAO,OAAA,EAAQ,GAAI;AAAC;AAC9D,KACC,MAAM,CAAA;AACX;AAMA,eAAsB,eAAA,CACpB,aACA,MAAA,EAC+C;AAC/C,EAAA,OAAO,eAAe,sBAAA,EAAwB;AAAA,IAC5C;AAAA,KACC,MAAM,CAAA;AACX;AAEA,eAAsB,gBAAA,CACpB,WAAA,EACA,MAAA,EACA,MAAA,EACkD;AAClD,EAAA,OAAO,eAAe,uBAAA,EAAyB;AAAA,IAC7C,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA;AAAA,IACA,IAAA,EAAM;AAAA,KACL,MAAM,CAAA;AACX;AAMA,eAAsB,cAAA,CACpB,WAAA,EACA,WAAA,EACA,MAAA,EACiD;AACjD,EAAA,OAAO,cAAA,CAAe,CAAA,mBAAA,EAAsB,WAAW,CAAA,aAAA,CAAA,EAAiB;AAAA,IACtE;AAAA,KACC,MAAM,CAAA;AACX;AAEA,eAAsB,iBAAA,CACpB,WAAA,EACA,WAAA,EACA,QAAA,EACA,MAAA,EAC4C;AAC5C,EAAA,OAAO,cAAA,CAAe,CAAA,mBAAA,EAAsB,WAAW,CAAA,aAAA,CAAA,EAAiB;AAAA,IACtE,MAAA,EAAQ,KAAA;AAAA,IACR,WAAA;AAAA,IACA,IAAA,EAAM;AAAA,KACL,MAAM,CAAA;AACX;AAGA,eAAsB,iBAAA,CACpB,WAAA,EACA,KAAA,EACA,MAAA,EACyD;AAGzD,EAAA,IAAI,CAAC,aAAa,MAAA,IAAU,WAAA,CAAY,OAAO,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACtE,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,mBAAA,EAAqB,QAAQ,GAAA,EAAI;AAAA,EAC9D;AACA,EAAA,OAAO,eAAe,qBAAA,EAAuB;AAAA,IAC3C,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA;AAAA,IACA,IAAA,EAAM,EAAE,KAAA;AAAM,KACb,MAAM,CAAA;AACX;AAGA,eAAsB,eAAA,CACpB,WAAA,EACA,WAAA,EACA,MAAA,EACmF;AACnF,EAAA,OAAO,cAAA,CAAe,CAAA,mBAAA,EAAsB,WAAW,CAAA,cAAA,CAAA,EAAkB;AAAA,IACvE;AAAA,KACC,MAAM,CAAA;AACX;AAEA,eAAsB,mBAAA,CACpB,WAAA,EACA,WAAA,EACA,IAAA,EACA,YACA,MAAA,EACqG;AACrG,EAAA,OAAO,cAAA,CAAe,CAAA,mBAAA,EAAsB,WAAW,CAAA,cAAA,CAAA,EAAkB;AAAA,IACvE,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA;AAAA,IACA,IAAA,EAAM,EAAE,IAAA,EAAM,WAAA,EAAa,UAAA;AAAW,KACrC,MAAM,CAAA;AACX;AAEA,eAAsB,sBAAA,CACpB,WAAA,EACA,WAAA,EACA,IAAA,EACA,MAAA,EACqG;AACrG,EAAA,OAAO,cAAA,CAAe,CAAA,mBAAA,EAAsB,WAAW,CAAA,cAAA,CAAA,EAAkB;AAAA,IACvE,MAAA,EAAQ,QAAA;AAAA,IACR,WAAA;AAAA,IACA,IAAA,EAAM,EAAE,IAAA;AAAK,KACZ,MAAM,CAAA;AACX;AAMA,eAAsB,mBAAA,CACpB,aACA,MAAA,EACwC;AACxC,EAAA,OAAO,eAAe,4BAAA,EAA8B;AAAA,IAClD;AAAA,KACC,MAAM,CAAA;AACX;AAEA,eAAsB,kBAAA,CACpB,WAAA,EACA,MAAA,EACA,MAAA,EACoH;AACpH,EAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAgB;AAClC,EAAA,IAAI,QAAQ,MAAA,EAAQ,KAAA,CAAM,GAAA,CAAI,SAAA,EAAW,OAAO,MAAM,CAAA;AACtD,EAAA,IAAI,MAAA,EAAQ,aAAA,EAAe,KAAA,CAAM,GAAA,CAAI,kBAAkB,MAAM,CAAA;AAC7D,EAAA,MAAM,EAAA,GAAK,MAAM,QAAA,EAAS;AAC1B,EAAA,OAAO,eAAe,CAAA,wBAAA,EAA2B,EAAA,GAAK,IAAI,EAAE,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,EAAI;AAAA,IACrE;AAAA,KACC,MAAM,CAAA;AACX;AAEA,eAAsB,0BAAA,CACpB,WAAA,EACA,UAAA,EACA,MAAA,EACA,MAAA,EACyD;AACzD,EAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAgB;AAClC,EAAA,IAAI,MAAA,EAAQ,QAAQ,KAAA,CAAM,GAAA,CAAI,UAAU,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,MAAM,CAAC,CAAA;AACrE,EAAA,IAAI,MAAA,EAAQ,SAAS,IAAA,EAAM,KAAA,CAAM,IAAI,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAClE,EAAA,IAAI,MAAA,EAAQ,QAAQ,IAAA,EAAM,KAAA,CAAM,IAAI,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAC/D,EAAA,IAAI,MAAA,EAAQ,MAAM,KAAA,CAAM,GAAA,CAAI,QAAQ,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,IAAI,CAAC,CAAA;AAC/D,EAAA,IAAI,QAAQ,QAAA,EAAU,KAAA,CAAM,GAAA,CAAI,UAAA,EAAY,OAAO,QAAQ,CAAA;AAC3D,EAAA,MAAM,EAAA,GAAK,MAAM,QAAA,EAAS;AAC1B,EAAA,OAAO,cAAA,CAAe,CAAA,yBAAA,EAA4B,kBAAA,CAAmB,UAAU,CAAC,CAAA,UAAA,EAAa,EAAA,GAAK,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,EAAI;AAAA,IACjH;AAAA,KACC,MAAM,CAAA;AACX;AAEA,eAAsB,uBAAA,CACpB,WAAA,EACA,UAAA,EACA,MAAA,EACA,MAAA,EAC4C;AAC5C,EAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAgB;AAClC,EAAA,IAAI,QAAQ,QAAA,EAAU,KAAA,CAAM,GAAA,CAAI,UAAA,EAAY,OAAO,QAAQ,CAAA;AAC3D,EAAA,IAAI,MAAA,EAAQ,cAAc,IAAA,EAAM,KAAA,CAAM,IAAI,aAAA,EAAe,MAAA,CAAO,MAAA,CAAO,UAAU,CAAC,CAAA;AAClF,EAAA,MAAM,EAAA,GAAK,MAAM,QAAA,EAAS;AAC1B,EAAA,OAAO,cAAA,CAAe,CAAA,yBAAA,EAA4B,kBAAA,CAAmB,UAAU,CAAC,CAAA,OAAA,EAAU,EAAA,GAAK,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,EAAI;AAAA,IAC9G;AAAA,KACC,MAAM,CAAA;AACX;AAEA,eAAsB,oBAAA,CACpB,WAAA,EACA,UAAA,EACA,MAAA,EACgE;AAChE,EAAA,OAAO,cAAA,CAAe,CAAA,yBAAA,EAA4B,kBAAA,CAAmB,UAAU,CAAC,CAAA,aAAA,CAAA,EAAiB;AAAA,IAC/F,MAAA,EAAQ,QAAA;AAAA,IACR;AAAA,KACC,MAAM,CAAA;AACX;AAEA,eAAsB,oBAAA,CACpB,WAAA,EACA,UAAA,EACA,MAAA,EACA,MAAA,EAC4B;AAC5B,EAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAgB;AAClC,EAAA,IAAI,QAAQ,QAAA,EAAU,KAAA,CAAM,GAAA,CAAI,UAAA,EAAY,OAAO,QAAQ,CAAA;AAC3D,EAAA,MAAM,EAAA,GAAK,MAAM,QAAA,EAAS;AAC1B,EAAA,OAAO,cAAA,CAAe,CAAA,yBAAA,EAA4B,kBAAA,CAAmB,UAAU,CAAC,CAAA,OAAA,EAAU,EAAA,GAAK,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA,EAAI;AAAA,IAC9G,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,MAAA,EAAQ,QAAQ,MAAA,IAAU,MAAA;AAAA,MAC1B,MAAA,EAAQ,QAAQ,MAAA,IAAU;AAAA;AAC5B,KACC,MAAM,CAAA;AACX;;;AC1tDA,IAAM,eAAA,GAAkB,uBAAA;AACxB,IAAM,aAAA,GAAgB,qBAAA;AACtB,IAAM,YAAA,GAAe,oBAAA;AAOrB,SAAS,UAAA,CAAW,OAA4B,OAAA,EAAyB;AACvE,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,IAAA;AAE1C,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,IAAA,KAAS,OAAA,GAAU,MAAA,CAAO,eAAe,MAAA,CAAO,cAAA;AAEhE,IAAA,OAAA,CAAQ,OAAA,CAAQ,YAAY,UAAU,CAAA;AACtC,IAAA,OAAA,CAAQ,WAAW,UAAU,CAAA;AAC7B,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,UAAA,EAAa,IAAI,CAAA,qBAAA,CAAuB,CAAA;AACrD,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAOA,SAAS,cAAc,WAAA,EAAkD;AACvE,EAAA,IAAI,CAAC,WAAA,EAAa,MAAA,EAAQ,OAAO,EAAA;AACjC,EAAA,OAAO,GAAG,WAAA,CAAY,MAAA,CAAO,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA,CAAA;AAC/C;AAQA,SAAS,YAAA,CAAa,SAAiB,WAAA,EAAkD;AACvF,EAAA,OAAO,CAAA,EAAG,aAAA,CAAc,WAAW,CAAC,GAAG,OAAO,CAAA,CAAA;AAChD;AAWO,SAAS,eAAA,CACd,WAAA,EACA,WAAA,GAAmC,OAAA,EAC7B;AACN,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,EAAS;AAEd,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,OAAA,CAAQ,eAAA,EAAiB,IAAA,CAAK,SAAA,CAAU,WAAW,CAAC,CAAA;AAAA,EAC9D,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,yCAAyC,KAAK,CAAA;AAAA,EAC9D;AACF;AAOO,SAAS,eAAA,CACd,cAAmC,OAAA,EACN;AAC7B,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,eAAe,CAAA;AAC9C,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAGrC,IAAA,IAAI,YAAY,SAAA,EAAW;AACzB,MAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA;AAChD,MAAA,IAAI,SAAA,mBAAY,IAAI,IAAA,EAAK,EAAG;AAC1B,QAAA,OAAA,CAAQ,IAAI,yCAAyC,CAAA;AACrD,QAAA,gBAAA,CAAiB,WAAW,CAAA;AAC5B,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,WAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,yCAAyC,KAAK,CAAA;AAC5D,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAMO,SAAS,gBAAA,CAAiB,cAAmC,OAAA,EAAe;AACjF,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,EAAS;AAEd,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,WAAW,eAAe,CAAA;AAAA,EACpC,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,0CAA0C,KAAK,CAAA;AAAA,EAC/D;AACF;AAYO,SAAS,qBAAA,CACd,WAAA,EACA,WAAA,EACA,WAAA,GAAmC,OAAA,EAC7B;AACN,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,EAAS;AAEd,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,aAAA,EAAe,WAAW,CAAA;AACnD,IAAA,OAAA,CAAQ,OAAA,CAAQ,KAAK,WAAW,CAAA;AAAA,EAClC,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,uCAAuC,KAAK,CAAA;AAAA,EAC5D;AACF;AAQO,SAAS,qBAAA,CACd,WAAA,EACA,WAAA,GAAmC,OAAA,EACpB;AACf,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,aAAA,EAAe,WAAW,CAAA;AACnD,IAAA,OAAO,OAAA,CAAQ,QAAQ,GAAG,CAAA;AAAA,EAC5B,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,uCAAuC,KAAK,CAAA;AAC1D,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAOO,SAAS,sBAAA,CACd,WAAA,EACA,WAAA,GAAmC,OAAA,EAC7B;AACN,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,EAAS;AAEd,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,aAAA,EAAe,WAAW,CAAA;AACnD,IAAA,OAAA,CAAQ,WAAW,GAAG,CAAA;AAAA,EACxB,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,KAAK,CAAA;AAAA,EAC7D;AACF;AAaO,SAAS,YAAA,CACd,QAAA,EACA,WAAA,EACA,WAAA,EACA,cAAmC,SAAA,EAC7B;AACN,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,EAAS;AAEd,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,YAAA,CAAa,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,WAAW,IAAI,WAAW,CAAA;AACtE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AACpC,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,IAC3B,SAAS,UAAA,EAAY;AAEnB,MAAA,IAAI,QAAA,CAAS,SAAS,EAAA,EAAI;AACxB,QAAA,MAAM,OAAA,GAAU,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAA;AAClC,QAAA,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,MAC9C,CAAA,MAAO;AAEL,QAAA,KAAA,IAAS,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC5C,UAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA;AACvB,UAAA,IAAI,KAAK,CAAA,CAAE,QAAA,CAAS,WAAW,CAAA,EAAG,OAAA,CAAQ,WAAW,CAAC,CAAA;AAAA,QACxD;AACA,QAAA,OAAA,CAAQ,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,SAAS,KAAA,EAAO;AAAA,EAEhB;AACF;AASO,SAAS,YAAA,CACd,WAAA,EACA,WAAA,EACA,WAAA,GAAmC,SAAA,EAC9B;AACL,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAC;AAEtB,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,YAAA,CAAa,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,WAAW,IAAI,WAAW,CAAA;AACtE,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AAClC,IAAA,OAAO,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAM,IAAI,EAAC;AAAA,EACxC,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AACzD,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAQO,SAAS,aAAA,CACd,WAAA,EACA,WAAA,EACA,WAAA,GAAmC,SAAA,EAC7B;AACN,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,EAAS;AAEd,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,YAAA,CAAa,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,WAAW,IAAI,WAAW,CAAA;AACtE,IAAA,OAAA,CAAQ,WAAW,GAAG,CAAA;AAAA,EACxB,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,uCAAuC,KAAK,CAAA;AAAA,EAC5D;AACF;AAaO,SAAS,OAAA,CACd,GAAA,EACA,KAAA,EACA,KAAA,EACA,cAAmC,OAAA,EAC7B;AACN,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,EAAS;AAEd,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,KAAA,GACT,EAAE,KAAA,EAAO,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,EAAM,GACvC,EAAE,KAAA,EAAM;AACZ,IAAA,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,EAC3C,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,wBAAA,EAA2B,GAAG,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,EACxD;AACF;AAQO,SAAS,OAAA,CACd,GAAA,EACA,WAAA,GAAmC,OAAA,EACzB;AACV,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AAClC,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAG9B,IAAA,IAAI,KAAK,SAAA,IAAa,IAAA,CAAK,GAAA,EAAI,GAAI,KAAK,SAAA,EAAW;AACjD,MAAA,OAAA,CAAQ,WAAW,GAAG,CAAA;AACtB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,wBAAA,EAA2B,GAAG,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AACtD,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAOO,SAAS,UAAA,CAAW,GAAA,EAAa,WAAA,GAAmC,OAAA,EAAe;AACxF,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,EAAS;AAEd,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,WAAW,GAAG,CAAA;AAAA,EACxB,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2BAAA,EAA8B,GAAG,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,EAC3D;AACF;AAWO,SAAS,qBAAA,CAAsB,cAAmC,OAAA,EAAe;AACtF,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,EAAS;AAEd,EAAA,IAAI;AACF,IAAA,MAAM,eAAyB,EAAC;AAChC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA;AACzB,MAAA,IAAI,KAAK,UAAA,CAAW,YAAY,KAAK,GAAA,EAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC9D,QAAA,YAAA,CAAa,KAAK,GAAG,CAAA;AAAA,MACvB;AAAA,IACF;AACA,IAAA,YAAA,CAAa,OAAA,CAAQ,CAAA,GAAA,KAAO,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAC,CAAA;AAAA,EACrD,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,uCAAuC,KAAK,CAAA;AAAA,EAC5D;AACF;;;AC5WO,IAAM,eAAA,GAAwC;AAAA,EACnD,MAAA,EAAQ,2BAAA;AAAA,EACR,QAAA,EAAU,eAAA;AAAA,EACV,MAAA,EAAQ,eAAA;AAAA,EACR,KAAA,EAAO,kBAAA;AAAA,EACP,SAAA,EAAW,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,EAAI,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA,CAAE,WAAA;AACxD;AAKO,IAAM,QAAA,GAAiB;AAAA,EAC5B,EAAA,EAAI,eAAA;AAAA,EACJ,KAAA,EAAO,kBAAA;AAAA,EACP,QAAA,EAAU,eAAA;AAAA,EACV,WAAW,eAAA,CAAgB;AAC7B;AAKO,IAAM,cAAA,GAAkC;AAAA,EAC7C;AAAA,IACE,WAAA,EAAa,WAAA;AAAA,IACb,IAAA,EAAM,gBAAA;AAAA,IACN,WAAA,EAAa,8BAAA;AAAA,IACb,YAAA,EAAc,CAAA;AAAA,IACd,kBAAA,EAAoB,CAAA;AAAA,IACpB,UAAA,EAAY,CAAA;AAAA,IACZ,SAAA,EAAW,sBAAA;AAAA,IACX,YAAA,EAAA,iBAAc,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACvC;AAAA,EACA;AAAA,IACE,WAAA,EAAa,cAAA;AAAA,IACb,IAAA,EAAM,mBAAA;AAAA,IACN,WAAA,EAAa,iCAAA;AAAA,IACb,YAAA,EAAc,CAAA;AAAA,IACd,kBAAA,EAAoB,EAAA;AAAA,IACpB,UAAA,EAAY,CAAA;AAAA,IACZ,SAAA,EAAW,sBAAA;AAAA,IACX,YAAA,EAAc,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,EAAI,GAAI,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA,CAAE,WAAA;AAAY,GAC3E;AAAA,EACA;AAAA,IACE,WAAA,EAAa,eAAA;AAAA,IACb,IAAA,EAAM,gBAAA;AAAA,IACN,WAAA,EAAa,oCAAA;AAAA,IACb,YAAA,EAAc,CAAA;AAAA,IACd,kBAAA,EAAoB,CAAA;AAAA,IACpB,UAAA,EAAY,CAAA;AAAA,IACZ,SAAA,EAAW,sBAAA;AAAA,IACX,YAAA,EAAc,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,EAAI,GAAI,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA,CAAE,WAAA;AAAY;AAE7E;AAKO,IAAM,YAAA,GAA8B;AAAA,EACzC;AAAA,IACE,EAAA,EAAI,cAAA;AAAA,IACJ,IAAA,EAAM,WAAA;AAAA,IACN,IAAA,EAAM,GAAA;AAAA,IACN,OAAA,EAAS,EAAA;AAAA,IACT,WAAA,EAAa,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,YAAA,EAAc,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,QAAA,EAAU,YAAA,EAAc,gBAAA,EAAkB,cAAc,QAAQ,CAAA;AAAA,IACpJ,MAAA,EAAQ;AAAA,MACN,IAAI,EAAE,IAAA,EAAM,UAAU,QAAA,EAAU,KAAA,EAAO,QAAQ,IAAA,EAAK;AAAA,MACpD,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,UAAU,KAAA,EAAM;AAAA,MACxC,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,UAAU,KAAA,EAAM;AAAA,MACzC,UAAA,EAAY,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAU,KAAA,EAAM;AAAA,MAC5C,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,MAC1C,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,MAC1C,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAU,UAAU,KAAA,EAAM;AAAA,MAC3C,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,UAAU,KAAA,EAAM;AAAA,MAC1C,UAAA,EAAY,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,MAC3C,cAAA,EAAgB,EAAE,IAAA,EAAM,QAAA,EAAU,UAAU,KAAA,EAAM;AAAA,MAClD,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,MAC7C,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,UAAU,KAAA;AAAM,KAC5C;AAAA,IACA,SAAA,EAAW,sBAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AAAA,EACA;AAAA,IACE,EAAA,EAAI,WAAA;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAM,GAAA;AAAA,IACN,OAAA,EAAS,CAAA;AAAA,IACT,WAAA,EAAa,CAAC,UAAA,EAAY,aAAA,EAAe,cAAc,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,kBAAA,EAAoB,gBAAgB,CAAA;AAAA,IACvH,SAAA,EAAW,sBAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AAAA,EACA;AAAA,IACE,EAAA,EAAI,aAAA;AAAA,IACJ,IAAA,EAAM,UAAA;AAAA,IACN,IAAA,EAAM,GAAA;AAAA,IACN,OAAA,EAAS,EAAA;AAAA,IACT,WAAA,EAAa,CAAC,YAAA,EAAc,MAAA,EAAQ,UAAA,EAAY,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAS,QAAA,EAAU,SAAA,EAAW,YAAA,EAAc,WAAW,CAAA;AAAA,IACxH,SAAA,EAAW,sBAAA;AAAA,IACX,SAAA,EAAW;AAAA;AAEf;AAKO,IAAM,kBAAA,GAA0C;AAAA,EACrD;AAAA,IACE,IAAA,EAAM,kBAAA;AAAA,IACN,IAAA,EAAM,YAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,SAAA,EAAW,sBAAA;AAAA,IACX,QAAA,EAAU,EAAE,KAAA,EAAO,OAAA,EAAS,OAAO,SAAA;AAAU,GAC/C;AAAA,EACA;AAAA,IACE,IAAA,EAAM,mBAAA;AAAA,IACN,IAAA,EAAM,WAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,SAAA,EAAW,sBAAA;AAAA,IACX,QAAA,EAAU,EAAE,SAAA,EAAW,SAAA,EAAW,SAAS,OAAA;AAAQ,GACrD;AAAA,EACA;AAAA,IACE,IAAA,EAAM,gBAAA;AAAA,IACN,IAAA,EAAM,SAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,SAAA,EAAW,sBAAA;AAAA,IACX,QAAA,EAAU,EAAE,KAAA,EAAO,aAAA,EAAe,OAAO,MAAA;AAAO;AAEpD;AAKO,IAAM,eAAA,GAAgC;AAAA,EAC3C;AAAA,IACE,SAAA,EAAW,eAAA;AAAA,IACX,SAAA,EAAW,eAAA;AAAA,IACX,WAAA,EAAa,SAAA;AAAA,IACb,IAAA,EAAM,oBAAA;AAAA,IACN,WAAA,EAAa,mBAAA;AAAA,IACb,cAAA,EAAgB,IAAA;AAAA,IAChB,YAAY,IAAA,CAAK,GAAA,KAAQ,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,GAAA;AAAA,IAC7C,mBAAA,EAAqB,EAAE,IAAA,EAAM,qBAAA,EAAuB,UAAU,YAAA;AAAa,GAC7E;AAAA,EACA;AAAA,IACE,SAAA,EAAW,gBAAA;AAAA,IACX,SAAA,EAAW,eAAA;AAAA,IACX,WAAA,EAAa,YAAA;AAAA,IACb,IAAA,EAAM,oBAAA;AAAA,IACN,WAAA,EAAa,mBAAA;AAAA,IACb,cAAA,EAAgB,KAAA;AAAA,IAChB,OAAA,EAAS,eAAA;AAAA,IACT,YAAY,IAAA,CAAK,GAAA,KAAQ,EAAA,GAAK,EAAA,GAAK,KAAK,EAAA,GAAK,GAAA;AAAA,IAC7C,mBAAA,EAAqB,EAAE,IAAA,EAAM,gBAAA,EAAkB,UAAU,WAAA;AAAY;AAEzE;AAKO,IAAM,eAAA,GAAiC;AAAA,EAC5C;AAAA,IACE,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,OAAA,EAAS,uCAAA;AAAA,IACT,SAAA,EAAW,IAAI,IAAA,CAAK,IAAA,CAAK,KAAI,GAAI,CAAA,GAAI,KAAK,GAAI;AAAA,GAChD;AAAA,EACA;AAAA,IACE,EAAA,EAAI,OAAA;AAAA,IACJ,IAAA,EAAM,WAAA;AAAA,IACN,OAAA,EAAS,4LAAA;AAAA,IACT,SAAA,EAAW,IAAI,IAAA,CAAK,IAAA,CAAK,KAAI,GAAI,CAAA,GAAI,KAAK,GAAI,CAAA;AAAA,IAC9C,SAAA,EAAW;AAAA,MACT;AAAA,QACE,EAAA,EAAI,QAAA;AAAA,QACJ,IAAA,EAAM,eAAA;AAAA,QACN,IAAA,EAAM,EAAE,OAAA,EAAS,WAAA,EAAa,OAAO,wDAAA,EAAyD;AAAA,QAC9F,MAAA,EAAQ,EAAE,IAAA,EAAM,EAAA,EAAG;AAAA,QACnB,MAAA,EAAQ;AAAA;AACV;AACF;AAEJ;AAKO,SAAS,cAAA,CAAe,SAAiB,MAAA,EAAgB;AAC9D,EAAA,OAAO,GAAG,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAC9E;AAKO,SAAS,SAAA,CAAU,KAAA,GAAgB,GAAA,EAAK,KAAA,GAAgB,GAAA,EAAoB;AACjF,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,EAAO,IAAK,QAAQ,KAAA,CAAA,GAAS,KAAA;AAChD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,KAAK,CAAC,CAAA;AAC5D;AASO,IAAM,gBAAA,GAAkC;AAAA,EAC7C;AAAA,IACE,EAAA,EAAI,eAAA;AAAA,IACJ,KAAA,EAAO,kBAAA;AAAA,IACP,IAAA,EAAM,WAAA;AAAA,IACN,IAAA,EAAM,OAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU,eAAA;AAAA,IACV,SAAA,EAAW,sBAAA;AAAA,IACX,WAAA,EAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IACpC,cAAA,EAAA,iBAAgB,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IACvC,QAAA,EAAU,EAAE,IAAA,EAAM,KAAA,EAAO,SAAS,UAAA;AAAW,GAC/C;AAAA,EACA;AAAA,IACE,EAAA,EAAI,gBAAA;AAAA,IACJ,KAAA,EAAO,mBAAA;AAAA,IACP,IAAA,EAAM,YAAA;AAAA,IACN,IAAA,EAAM,OAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU,eAAA;AAAA,IACV,SAAA,EAAW,sBAAA;AAAA,IACX,WAAA,EAAa,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,EAAI,GAAI,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA,CAAE,WAAA,EAAY;AAAA,IACnE,cAAA,EAAgB,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,KAAQ,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA,CAAE,WAAA;AAAY,GACpE;AAAA,EACA;AAAA,IACE,EAAA,EAAI,iBAAA;AAAA,IACJ,KAAA,EAAO,oBAAA;AAAA,IACP,IAAA,EAAM,aAAA;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,QAAA,EAAU,eAAA;AAAA,IACV,SAAA,EAAW,sBAAA;AAAA,IACX,WAAA,EAAa,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,EAAI,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA,CAAE,WAAA,EAAY;AAAA,IACpE,cAAA,EAAgB,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,EAAI,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA,CAAE,WAAA;AAAY,GACzE;AAAA,EACA;AAAA,IACE,EAAA,EAAI,oBAAA;AAAA,IACJ,KAAA,EAAO,uBAAA;AAAA,IACP,IAAA,EAAM,gBAAA;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,WAAA;AAAA,IACR,QAAA,EAAU,eAAA;AAAA,IACV,SAAA,EAAW,sBAAA;AAAA,IACX,WAAA,EAAa,sBAAA;AAAA,IACb,QAAA,EAAU,EAAE,aAAA,EAAe,kBAAA;AAAmB,GAChD;AAAA,EACA;AAAA,IACE,EAAA,EAAI,kBAAA;AAAA,IACJ,KAAA,EAAO,qBAAA;AAAA,IACP,IAAA,EAAM,UAAA;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,sBAAA;AAAA,IACR,QAAA,EAAU,eAAA;AAAA,IACV,SAAA,EAAW,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,EAAI,GAAI,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA,CAAE,WAAA;AAAY;AAE1E;AAKO,IAAM,aAAA,GAA2B;AAAA,EACtC,UAAA,EAAY,GAAA;AAAA,EACZ,WAAA,EAAa,EAAA;AAAA,EACb,WAAA,EAAa;AAAA,IACX,KAAA,EAAO,CAAA;AAAA,IACP,KAAA,EAAO,CAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,MAAA,EAAQ;AAAA,GACV;AAAA,EACA,aAAA,EAAe;AAAA,IACb,MAAA,EAAQ,EAAA;AAAA,IACR,SAAA,EAAW,CAAA;AAAA,IACX,oBAAA,EAAsB,EAAA;AAAA,IACtB,WAAA,EAAa;AAAA,GACf;AAAA,EACA,iBAAA,EAAmB,EAAA;AAAA,EACnB,gBAAA,EAAkB,CAAC,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAE;AAC3E;AAKO,IAAM,gBAAA,GAAsC;AAAA,EACjD;AAAA,IACE,EAAA,EAAI,OAAA;AAAA,IACJ,MAAA,EAAQ,eAAA;AAAA,IACR,YAAA,EAAc,OAAA;AAAA,IACd,WAAA,EAAa,gCAAA;AAAA,IACb,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACpC;AAAA,EACA;AAAA,IACE,EAAA,EAAI,OAAA;AAAA,IACJ,MAAA,EAAQ,eAAA;AAAA,IACR,YAAA,EAAc,eAAA;AAAA,IACd,WAAA,EAAa,sCAAA;AAAA,IACb,SAAA,EAAW,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,KAAQ,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA,CAAE,WAAA,EAAY;AAAA,IAC7D,YAAA,EAAc,WAAA;AAAA,IACd,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,EAAA,EAAI,OAAA;AAAA,IACJ,MAAA,EAAQ,eAAA;AAAA,IACR,YAAA,EAAc,gBAAA;AAAA,IACd,WAAA,EAAa,kCAAA;AAAA,IACb,SAAA,EAAW,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,KAAQ,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA,CAAE,WAAA,EAAY;AAAA,IAC7D,YAAA,EAAc,SAAA;AAAA,IACd,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,EAAA,EAAI,OAAA;AAAA,IACJ,MAAA,EAAQ,eAAA;AAAA,IACR,YAAA,EAAc,kBAAA;AAAA,IACd,WAAA,EAAa,sCAAA;AAAA,IACb,SAAA,EAAW,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,EAAI,GAAI,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA,CAAE,WAAA,EAAY;AAAA,IACjE,YAAA,EAAc,WAAA;AAAA,IACd,UAAA,EAAY;AAAA,GACd;AAAA,EACA;AAAA,IACE,EAAA,EAAI,OAAA;AAAA,IACJ,MAAA,EAAQ,eAAA;AAAA,IACR,YAAA,EAAc,QAAA;AAAA,IACd,WAAA,EAAa,YAAA;AAAA,IACb,SAAA,EAAW,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,EAAI,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA,CAAE,WAAA;AAAY;AAEtE;ACzRA,IAAMA,iBAAAA,GAAmB,gCAAA;AAYzB,SAAS,mBAAmB,EAAA,EAAwB;AAClD,EAAA,OAAO;AAAA,IACL,aAAa,EAAA,CAAG,WAAA,IAAe,EAAA,CAAG,YAAA,IAAgB,GAAG,EAAA,IAAM,EAAA;AAAA,IAC3D,IAAA,EAAM,GAAG,IAAA,IAAQ,EAAA;AAAA,IACjB,aAAa,EAAA,CAAG,WAAA;AAAA,IAChB,YAAA,EAAc,EAAA,CAAG,YAAA,IAAgB,EAAA,CAAG,aAAA,IAAiB,CAAA;AAAA,IACrD,kBAAA,EAAoB,EAAA,CAAG,kBAAA,IAAsB,EAAA,CAAG,mBAAA,IAAuB,CAAA;AAAA,IACvE,UAAA,EAAY,EAAA,CAAG,UAAA,IAAc,EAAA,CAAG,WAAA,IAAe,CAAA;AAAA,IAC/C,SAAA,EAAW,EAAA,CAAG,SAAA,IAAa,EAAA,CAAG,UAAA,IAAc,EAAA;AAAA,IAC5C,YAAA,EAAc,EAAA,CAAG,YAAA,IAAgB,EAAA,CAAG,aAAA,IAAiB;AAAA,GACvD;AACF;AAQA,SAAS,uBAAuB,CAAA,EAA2B;AACzD,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,QAAA,IAAY,EAAC;AAE5B,EAAA,MAAM,QAAA,GACJ,CAAA,CAAE,aAAA,IAAiB,IAAA,CAAK,iBACxB,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,SAAA,KACf,CAAA,CAAE,GAAA,IAAO,CAAC,CAAA,CAAE,IAAI,QAAA,CAAS,kBAAkB,CAAA,GAAI,CAAA,CAAE,GAAA,GAAM,MAAA,CAAA,KACvD,IAAA,CAAK,GAAA,IAAO,CAAC,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,kBAAkB,CAAA,GAAI,IAAA,CAAK,GAAA,GAAM,MAAA,CAAA,IACjE,KAAK,SAAA,IACL,MAAA;AACF,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,EAAE,IAAA,IAAQ,EAAA;AAAA,IAChB,MAAM,CAAA,CAAE,IAAA,IAAQ,EAAE,kBAAA,IAAsB,CAAA,CAAE,cAAc,IAAA,CAAK,UAAA;AAAA,IAC7D,QAAA;AAAA,IACA,WAAA,EAAa,CAAA,CAAE,WAAA,IAAe,CAAA,CAAE,gBAAgB,IAAA,CAAK,YAAA;AAAA,IACrD,MAAA,EAAQ,CAAA,CAAE,MAAA,IAAU,IAAA,CAAK,MAAA;AAAA,IACzB,SAAA,EAAW,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,cAAc,IAAA,CAAK,UAAA;AAAA,IAC/C,UAAU,CAAA,CAAE;AAAA,GACd;AACF;AAGA,SAAS,iBAAiB,CAAA,EAAqB;AAE7C,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,IAAS,EAAC;AAC1B,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,YAAA,IAAgB,CAAA,CAAE,YAAA,IAAgB,EAAC;AAC7F,EAAA,MAAM,QAAA,GAAW,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,IAAA,KAAS,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA,CAAA;AAC/E,EAAA,MAAM,QAAA,GAAW,OAAO,CAAA,CAAE,OAAA,KAAY,WAAW,CAAA,CAAE,OAAA,GAAW,CAAA,CAAE,YAAA,IAAgB,EAAE,WAAA,IAAe,KAAA,CAAM,CAAC,CAAA,IAAK,SAAS,MAAA,IAAU,CAAA;AAChI,EAAA,OAAO;AAAA,IACL,GAAG,CAAA;AAAA,IACH,EAAA,EAAI,CAAA,CAAE,EAAA,IAAM,CAAA,CAAE,UAAA;AAAA,IACd,IAAA,EAAM,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,YAAA,IAAgB,EAAA;AAAA,IAClC,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,QAAA;AAAA,IACT,WAAA,EAAa,QAAA;AAAA,IACb,SAAA,EAAW,CAAA,CAAE,SAAA,IAAa,CAAA,CAAE,UAAA;AAAA,IAC5B,QAAA,EAAU,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,aAAa,CAAA,CAAE,IAAA;AAAA,IACzC,MAAA,EAAQ,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE;AAAA,GACxB;AACF;AAGA,IAAM,gBAAA,GAAmBC,oBAA4C,IAAI,CAAA;AAuCzE,SAAS,gBAAgB,MAAA,EAA4C;AACnE,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,OAAO,QAAA,CAAS,GAAG,GAAG,OAAO,MAAA;AAC7C,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAC9B,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,KAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AACzC,MAAA,IAAI,OAAA,CAAQ,SAAA,EAAW,OAAO,MAAA,CAAO,QAAQ,SAAS,CAAA;AAAA,IACxD;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,UAAU,WAAA,EAA4C;AAC7D,EAAA,IAAI,CAAC,YAAY,SAAA,EAAW;AAE1B,IAAA,IAAI,WAAA,CAAY,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,EAAG;AACpC,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAC1C,QAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,KAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AACzC,QAAA,IAAI,QAAQ,GAAA,EAAK;AACf,UAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA,CAAQ,GAAA,GAAM,GAAA;AAAA,QACpC;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA;AAChD,EAAA,OAAO,SAAA,uBAAgB,IAAA,EAAK;AAC9B;AAqCO,SAAS,iBAAA,CAAkB;AAAA,EAChC,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAA2B;AAEzB,EAAA,MAAM,OAAA,GAAU,OAAO,OAAA,IAAWD,iBAAAA;AAIlC,EAAA,MAAM,QAAA,GAAW,OAAO,QAAA,IAAY,EAAA;AACpC,EAAA,MAAM,UAAA,GAAa,OAAO,IAAA,KAAS,MAAA;AAGnC,EAAA,MAAM,CAAC,WAAA,EAAa,mBAAmB,CAAA,GAAIE,eAAsC,IAAI,CAAA;AACrF,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAGxD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,cAAA,CAAuB;AAAA,IACnD,SAAA,EAAW,IAAA;AAAA,IACX,WAAA,EAAa,IAAA;AAAA,IACb,WAAA,EAAa,KAAA;AAAA,IACb,YAAA,EAAc;AAAA,GACf,CAAA;AAGD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,cAAA,CAA0B,EAAE,CAAA;AAChE,EAAA,MAAM,CAAC,iBAAA,EAAmB,yBAAyB,CAAA,GAAIA,eAA+B,IAAI,CAAA;AAC1F,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAGpE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,cAAA,CAAwB,EAAE,CAAA;AAG1D,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAGxE,EAAA,MAAM,CAAC,QAAA,EAAU,gBAAgB,CAAA,GAAIA,cAAA,CAAwB,EAAE,CAAA;AAC/D,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAEhE,EAAA,MAAM,CAAC,cAAA,EAAgB,sBAAsB,CAAA,GAAIA,cAAA,CAA8B,EAAE,CAAA;AACjF,EAAA,MAAM,CAAC,uBAAA,EAAyB,0BAA0B,CAAA,GAAIA,eAAS,KAAK,CAAA;AAE5E,EAAA,MAAM,CAAC,OAAA,EAAS,eAAe,CAAA,GAAIA,cAAA,CAAuB,EAAE,CAAA;AAC5D,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAE9D,EAAA,MAAM,CAAC,MAAA,EAAQ,cAAc,CAAA,GAAIA,cAAA,CAAsB,EAAE,CAAA;AACzD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAE5D,EAAA,MAAM,CAAC,OAAA,EAAS,eAAe,CAAA,GAAIA,cAAA,CAAuB,EAAE,CAAA;AAC5D,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAG9D,EAAA,MAAM,CAAC,aAAA,EAAe,cAAc,CAAA,GAAIA,eAAS,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAwE,MAAM,CAAA;AAGhH,EAAA,MAAM,YAAA,GAAe,EAAE,OAAA,EAAS,QAAA,EAAS;AAgBzC,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAGnC,IAAA,IAAI,cAAA,IAAkB,CAAC,cAAA,CAAe,KAAA,EAAO;AAC3C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,gBAAgB,SAAS,CAAA;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,CAAU,MAAM,CAAA,EAAG;AACrB,MAAA,gBAAA,CAAiB,SAAS,CAAA;AAC1B,MAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,MAAA;AAAA,IACF;AAOA,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AACtC,QAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AAC3C,QAAA,MAAM,WAAA,GAA6B,SAAS,SAAA,IAAa,IAAA;AACzD,QAAA,IAAI,WAAA,KAAgB,OAAO,QAAA,EAAU;AACnC,UAAA,gBAAA,CAAiB,SAAS,CAAA;AAC1B,UAAA,qBAAA,CAAsB,SAAS,CAAA;AAC/B,UAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,UAAA;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAEN,QAAA,gBAAA,CAAiB,SAAS,CAAA;AAC1B,QAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,QAAA;AAAA,MACF;AAAA,IACF;AAKA,IAAA,IAAI,cAAA,IAAkB,CAAC,cAAA,CAAe,aAAA,EAAe;AACnD,MAAA,OAAA,CAAQ,IAAI,sEAAsE,CAAA;AAClF,MAAA,gBAAA,CAAiB,SAAS,CAAA;AAC1B,MAAA,qBAAA,CAAsB,SAAS,CAAA;AAC/B,MAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,MAAA;AAAA,IACF;AAGA,IAAA,mBAAA,CAAoB,MAAM,CAAA;AAC1B,IAAA,MAAM,WAAA,GAAc,qBAAA,CAAsB,MAAA,EAAQ,OAAO,CAAA;AACzD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,UAAA,CAAW,CAAA,IAAA,MAAS;AAAA,QAClB,GAAG,IAAA;AAAA,QACH,SAAA,EAAW,WAAA;AAAA,QACX,WAAA;AAAA,QACA,WAAA,EAAa;AAAA,OACf,CAAE,CAAA;AAAA,IACJ;AACA,IAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,EACvB,GAAG,CAAC,cAAA,EAAgB,KAAA,EAAO,cAAA,EAAgB,aAAa,CAAC,CAAA;AAGzD,EAAA,MAAM,cAAA,GAAiBC,iBAAA,CAAY,CAAC,KAAA,KAAuC;AACzE,IAAA,mBAAA,CAAoB,KAAK,CAAA;AACzB,IAAA,IAAI,KAAA,EAAO;AAGT,MAAA,MAAM,eAAA,GAAkB;AAAA,QACtB,GAAG,KAAA;AAAA,QACH,UAAU,KAAA,CAAM,QAAA,IAAY,eAAA,CAAgB,KAAA,CAAM,MAAM,CAAA,IAAK;AAAA,OAC/D;AACA,MAAA,eAAA,CAAgB,iBAAiB,SAAS,CAAA;AAAA,IAC5C,CAAA,MAAO;AACL,MAAA,gBAAA,CAAiB,SAAS,CAAA;AAAA,IAC5B;AAAA,EACF,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAA,MAAM,MAAA,GAASA,kBAAY,MAAM;AAC/B,IAAA,IAAI,WAAA,EAAa;AAEf,MAAA,sBAAA,CAAuB,aAAa,OAAO,CAAA;AAG3C,MAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,QAAA,aAAA,CAAoB,OAAA,CAAQ,WAAA,EAAa,WAAA,EAAa,SAAS,CAAA;AAAA,MACjE;AAAA,IACF;AAGA,IAAA,qBAAA,CAAsB,OAAO,CAAA;AAC7B,IAAA,qBAAA,CAAsB,SAAS,CAAA;AAM/B,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,QAAA,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,yBAAA,EAA2B,GAAG,CAAA;AAAA,MAC5D;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAAwC;AAGhD,IAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,IAAA,aAAA,CAAc,EAAE,CAAA;AAChB,IAAA,yBAAA,CAA0B,IAAI,CAAA;AAC9B,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,gBAAA,CAAiB,EAAE,CAAA;AACnB,IAAA,sBAAA,CAAuB,EAAE,CAAA;AACzB,IAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,IAAA,cAAA,CAAe,EAAE,CAAA;AACjB,IAAA,UAAA,CAAW;AAAA,MACT,SAAA,EAAW,IAAA;AAAA,MACX,WAAA,EAAa,IAAA;AAAA,MACb,WAAA,EAAa,KAAA;AAAA,MACb,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,WAAA,EAAa,OAAA,CAAQ,WAAW,CAAC,CAAA;AAOrC,EAAA,MAAM,iBAAA,GAAoBA,kBAAY,YAAY;AAChD,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,UAAA,EAAY;AAEjC,IAAA,sBAAA,CAAuB,IAAI,CAAA;AAC3B,IAAA,IAAI;AACF,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,EAAU;AAChB,QAAA,aAAA,CAAc,cAAc,CAAA;AAC5B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,cAAA,CAAe,WAAA,EAAc,IAAI,YAAY,CAAA;AACpE,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAChC,QAAA,aAAA,CAAc,QAAA,CAAS,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,kBAAkB,CAAC,CAAA;AAAA,MAChE;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,6CAA6C,KAAK,CAAA;AAAA,IAClE,CAAA,SAAE;AACA,MAAA,sBAAA,CAAuB,KAAK,CAAA;AAAA,IAC9B;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,YAAA,EAAc,UAAU,CAAC,CAAA;AAG1C,EAAA,MAAMC,gBAAAA,GAAkBD,iBAAA,CAAY,OAAO,IAAA,EAAc,WAAA,KAAwD;AAC/G,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,UAAA,EAAY,OAAO,IAAA;AAExC,IAAA,IAAI;AACF,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,EAAU;AAChB,QAAA,MAAM,YAAA,GAA8B;AAAA,UAClC,WAAA,EAAa,eAAe,IAAI,CAAA;AAAA,UAChC,IAAA;AAAA,UACA,WAAA;AAAA,UACA,YAAA,EAAc,CAAA;AAAA,UACd,kBAAA,EAAoB,CAAA;AAAA,UACpB,UAAA,EAAY,CAAA;AAAA,UACZ,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UAClC,YAAA,EAAA,iBAAc,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,SACvC;AACA,QAAA,aAAA,CAAc,CAAA,IAAA,KAAQ,CAAC,YAAA,EAAc,GAAG,IAAI,CAAC,CAAA;AAC7C,QAAA,OAAO,YAAA;AAAA,MACT;AAEA,MAAA,MAAM,WAAW,MAAM,eAAA,CAAmB,WAAA,EAAc,IAAA,EAAM,aAAa,YAAY,CAAA;AACvF,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAChC,QAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA;AAC/D,QAAA,aAAA,CAAc,CAAA,IAAA,KAAQ,CAAC,YAAA,EAAc,GAAG,IAAI,CAAC,CAAA;AAC7C,QAAA,OAAO,YAAA;AAAA,MACT;AACA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,2CAA2C,KAAK,CAAA;AAC9D,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,YAAA,EAAc,UAAU,CAAC,CAAA;AAG1C,EAAA,MAAM,oBAAA,GAAuBA,iBAAA,CAAY,CAAC,SAAA,KAAoC;AAC5E,IAAA,yBAAA,CAA0B,SAAS,CAAA;AAEnC,IAAA,IAAI,aAAa,WAAA,EAAa;AAE5B,MAAA,UAAA,CAAW,CAAA,IAAA,MAAS;AAAA,QAClB,GAAG,IAAA;AAAA,QACH,WAAW,SAAA,CAAU,WAAA;AAAA,QACrB,aAAa,SAAA,CAAU,WAAA;AAAA,QACvB,WAAA,EAAa,IAAA;AAAA,QACb,YAAA,sBAAkB,IAAA;AAAK,OACzB,CAAE,CAAA;AAGF,MAAA,qBAAA,CAAsB,SAAA,CAAU,WAAA,EAAa,WAAA,EAAa,OAAO,CAAA;AAGjE,MAAA,MAAM,cAAA,GAAiB,YAAA;AAAA,QACrB,SAAA,CAAU,WAAA;AAAA,QACV,WAAA;AAAA,QACA;AAAA,OACF;AAGA,MAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,QAC7C,GAAG,CAAA;AAAA,QACH,SAAA,EAAW,IAAI,IAAA,CAAK,CAAA,CAAE,SAAS,CAAA;AAAA,QAC/B,WAAA,EAAa,KAAA;AAAA,QACb,OAAA,EAAS,EAAE,WAAA,IAAe,CAAC,EAAE,OAAA,EAAS,IAAA,EAAK,GACvC,0BAAA,GACA,CAAA,CAAE;AAAA,OACR,CAAE,CAAA;AACF,MAAA,WAAA,CAAY,aAAa,CAAA;AAGzB,MAAA,gBAAA,CAAiB,EAAE,CAAA;AACnB,MAAA,sBAAA,CAAuB,EAAE,CAAA;AACzB,MAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,MAAA,cAAA,CAAe,EAAE,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,UAAA,CAAW,CAAA,IAAA,MAAS;AAAA,QAClB,GAAG,IAAA;AAAA,QACH,SAAA,EAAW,IAAA;AAAA,QACX,WAAA,EAAa,IAAA;AAAA,QACb,WAAA,EAAa;AAAA,OACf,CAAE,CAAA;AACF,MAAA,WAAA,CAAY,EAAE,CAAA;AAAA,IAChB;AAAA,EACF,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAGhB,EAAAD,eAAA,CAAU,MAAM;AACd,IAAA,IAAA,CAAK,WAAA,IAAe,UAAA,KAAe,UAAA,CAAW,MAAA,KAAW,KAAK,aAAA,EAAe;AAC3E,MAAA,iBAAA,EAAkB;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,aAAA,EAAe,UAAU,CAAC,CAAA;AAG3C,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,UAAA,EAAY;AACjC,IAAA,IAAI,iBAAA,EAAmB;AAEvB,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AAEzB,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,WAAA,GAClB,UAAA,CAAW,IAAA,CAAK,QAAM,EAAA,CAAG,WAAA,KAAgB,OAAA,CAAQ,WAAW,CAAA,GAC5D,IAAA;AAEJ,MAAA,oBAAA,CAAqB,KAAA,IAAS,UAAA,CAAW,CAAC,CAAC,CAAA;AAAA,IAC7C,WAAW,UAAA,CAAW,MAAA,KAAW,CAAA,IAAK,aAAA,IAAiB,CAAC,mBAAA,EAAqB;AAE3E,MAAAE,gBAAAA,CAAgB,cAAA,EAAgB,mBAAmB,CAAA,CAAE,KAAK,CAAA,EAAA,KAAM;AAC9D,QAAA,IAAI,EAAA,uBAAyB,EAAE,CAAA;AAAA,MACjC,CAAC,CAAA;AAAA,IACH;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,OAAA,CAAQ,WAAA,EAAa,mBAAmB,WAAA,EAAa,UAAA,EAAY,aAAA,EAAe,mBAAmB,CAAC,CAAA;AAMpH,EAAA,MAAM,UAAA,GAAaD,iBAAA,CAAY,CAAC,OAAA,KAAyB;AACvD,IAAA,WAAA,CAAY,CAAA,IAAA,KAAQ;AAClB,MAAA,MAAM,OAAA,GAAU,CAAC,GAAG,IAAA,EAAM,OAAO,CAAA;AAGjC,MAAA,IAAI,CAAC,OAAA,CAAQ,WAAA,IAAe,WAAA,IAAe,QAAQ,WAAA,EAAa;AAC9D,QAAA,YAAA,CAAa,OAAA,EAAS,OAAA,CAAQ,WAAA,EAAa,WAAA,EAAa,SAAS,CAAA;AAAA,MACnE;AAEA,MAAA,OAAO,OAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,WAAA,EAAa,OAAA,CAAQ,WAAW,CAAC,CAAA;AAErC,EAAA,MAAM,aAAA,GAAgBA,iBAAA,CAAY,CAAC,EAAA,EAAY,OAAA,KAAkC;AAC/E,IAAA,WAAA,CAAY,CAAA,IAAA,KAAQ;AAClB,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA;AAAA,QAAI,CAAA,GAAA,KACvB,IAAI,EAAA,KAAO,EAAA,GAAK,EAAE,GAAG,GAAA,EAAK,GAAG,OAAA,EAAQ,GAAI;AAAA,OAC3C;AAGA,MAAA,IAAI,OAAA,CAAQ,WAAA,KAAgB,KAAA,IAAS,WAAA,IAAe,QAAQ,WAAA,EAAa;AACvE,QAAA,YAAA,CAAa,OAAA,EAAS,OAAA,CAAQ,WAAA,EAAa,WAAA,EAAa,SAAS,CAAA;AAAA,MACnE;AAEA,MAAA,OAAO,OAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,WAAA,EAAa,OAAA,CAAQ,WAAW,CAAC,CAAA;AAErC,EAAA,MAAME,cAAAA,GAAgBF,kBAAY,MAAM;AACtC,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,IAAI,WAAA,IAAe,QAAQ,WAAA,EAAa;AACtC,MAAA,aAAA,CAAoB,OAAA,CAAQ,WAAA,EAAa,WAAA,EAAa,SAAS,CAAA;AAAA,IACjE;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,OAAA,CAAQ,WAAW,CAAC,CAAA;AAMrC,EAAA,MAAM,WAAA,GAAcA,iBAAA,CAAY,CAACG,SAAAA,KAA4B;AAC3D,IAAA,gBAAA,CAAiBA,SAAQ,CAAA;AAAA,EAC3B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkBH,kBAAY,YAAY;AAC9C,IAAA,IAAA,CAAK,CAAC,WAAA,IAAe,CAAC,iBAAA,KAAsB,CAAC,UAAA,EAAY;AAEzD,IAAA,oBAAA,CAAqB,IAAI,CAAA;AACzB,IAAA,IAAI;AACF,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,EAAU;AAChB,QAAA,gBAAA,CAAiB,YAAY,CAAA;AAC7B,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,WAAW,MAAM,YAAA;AAAA,QACrB,WAAA;AAAA,QACA,iBAAA,CAAmB,WAAA;AAAA,QACnB;AAAA,OACF;AACA,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAChC,QAAA,gBAAA,CAAiB,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,gBAAgB,CAAC,CAAA;AAAA,MAC/D;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,2CAA2C,KAAK,CAAA;AAAA,IAChE,CAAA,SAAE;AACA,MAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,WAAA,EAAa,iBAAA,EAAmB,YAAA,EAAc,UAAU,CAAC,CAAA;AAM7D,EAAA,MAAM,iBAAA,GAAoBA,iBAAA,CAAY,CAAC,IAAA,KAA8B;AACnE,IAAA,sBAAA,CAAuB,IAAI,CAAA;AAAA,EAC7B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,gBAAA,GAAmBA,iBAAA,CAAY,CAAC,GAAA,KAA2B;AAC/D,IAAA,sBAAA,CAAuB,CAAA,IAAA,KAAQ;AAC7B,MAAA,MAAM,SAAS,IAAA,CAAK,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAAS,IAAI,IAAI,CAAA;AACjD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,OAAO,IAAA,CAAK,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,GAAA,CAAI,IAAA,GAAO,MAAM,CAAC,CAAA;AAAA,MACpD;AACA,MAAA,OAAO,CAAC,GAAG,IAAA,EAAM,GAAG,CAAA;AAAA,IACtB,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,qBAAA,GAAwBA,kBAAY,YAAY;AACpD,IAAA,IAAA,CAAK,CAAC,WAAA,IAAe,CAAC,iBAAA,KAAsB,CAAC,UAAA,EAAY;AAEzD,IAAA,0BAAA,CAA2B,IAAI,CAAA;AAC/B,IAAA,IAAI;AACF,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,EAAU;AAChB,QAAA,sBAAA,CAAuB,kBAAkB,CAAA;AACzC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,WAAW,MAAM,kBAAA;AAAA,QACrB,WAAA;AAAA,QACA,iBAAA,CAAmB,WAAA;AAAA,QACnB;AAAA,OACF;AACA,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAChC,QAAA,MAAM,OAAA,GAAU,QAAA,CAAS,IAAA,CAAK,cAAA,CAAe,IAAI,sBAAsB,CAAA;AAGvE,QAAA,sBAAA,CAAuB,CAAA,IAAA,KAAQ;AAC7B,UAAA,MAAM,YAAY,IAAI,GAAA,CAAI,KAAK,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,QAAA,IAAY,CAAA,CAAE,WAAW,CAAA,CAAE,IAAI,CAAA,CAAA,KAAK,CAAC,EAAE,IAAA,EAAM,CAAC,CAAC,CAAC,CAAA;AAC7F,UAAA,OAAO,OAAA,CAAQ,IAAI,CAAA,CAAA,KAAK;AACtB,YAAA,MAAM,QAAA,GAAW,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AACrC,YAAA,IAAI,YAAY,CAAC,CAAA,CAAE,QAAA,IAAY,CAAC,EAAE,WAAA,EAAa;AAC7C,cAAA,OAAO,EAAE,GAAG,CAAA,EAAG,QAAA,EAAU,QAAA,CAAS,QAAA,EAAU,WAAA,EAAa,QAAA,CAAS,WAAA,EAAa,MAAA,EAAQ,QAAA,CAAS,MAAA,IAAU,EAAE,MAAA,EAAO;AAAA,YACrH;AACA,YAAA,OAAO,CAAA;AAAA,UACT,CAAC,CAAA;AAAA,QACH,CAAC,CAAA;AAAA,MACH;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,iDAAiD,KAAK,CAAA;AAAA,IACtE,CAAA,SAAE;AACA,MAAA,0BAAA,CAA2B,KAAK,CAAA;AAAA,IAClC;AAAA,EACF,GAAG,CAAC,WAAA,EAAa,iBAAA,EAAmB,YAAA,EAAc,UAAU,CAAC,CAAA;AAE7D,EAAA,MAAM,mBAAA,GAAsBA,kBAAY,MAAM;AAC5C,IAAA,sBAAA,CAAuB,EAAE,CAAA;AAAA,EAC3B,CAAA,EAAG,EAAE,CAAA;AAML,EAAA,MAAM,cAAA,GAAiBA,kBAAY,YAAY;AAC7C,IAAA,IAAA,CAAK,CAAC,WAAA,IAAe,CAAC,iBAAA,KAAsB,CAAC,UAAA,EAAY;AAEzD,IAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,IAAA,IAAI;AACF,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,EAAU;AAChB,QAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,WAAW,MAAM,WAAA;AAAA,QACrB,WAAA;AAAA,QACA,iBAAA,CAAmB,WAAA;AAAA,QACnB;AAAA,OACF;AACA,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAChC,QAAA,eAAA,CAAgB,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,MACvC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,0CAA0C,KAAK,CAAA;AAAA,IAC/D,CAAA,SAAE;AACA,MAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,WAAA,EAAa,iBAAA,EAAmB,YAAA,EAAc,UAAU,CAAC,CAAA;AAM7D,EAAA,MAAM,aAAA,GAAgBA,kBAAY,YAAY;AAC5C,IAAA,IAAA,CAAK,CAAC,WAAA,IAAe,CAAC,iBAAA,KAAsB,CAAC,UAAA,EAAY;AAEzD,IAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,IAAA,IAAI;AACF,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,EAAU;AAChB,QAAA,cAAA,CAAe,EAAE,CAAA;AACjB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,WAAW,MAAM,UAAA;AAAA,QACrB,WAAA;AAAA,QACA,iBAAA,CAAmB,WAAA;AAAA,QACnB;AAAA,OACF;AACA,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAChC,QAAA,cAAA,CAAe,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,MACrC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,yCAAyC,KAAK,CAAA;AAAA,IAC9D,CAAA,SAAE;AACA,MAAA,kBAAA,CAAmB,KAAK,CAAA;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,WAAA,EAAa,iBAAA,EAAmB,YAAA,EAAc,UAAU,CAAC,CAAA;AAM7D,EAAA,MAAM,cAAA,GAAiBA,kBAAY,YAAY;AAC7C,IAAA,IAAA,CAAK,CAAC,WAAA,IAAe,CAAC,iBAAA,KAAsB,CAAC,UAAA,EAAY;AAEzD,IAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,IAAA,IAAI;AACF,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,EAAU;AAChB,QAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,WAAW,MAAM,WAAA;AAAA,QACrB,WAAA;AAAA,QACA,iBAAA,CAAmB,WAAA;AAAA,QACnB;AAAA,OACF;AACA,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAChC,QAAA,eAAA,CAAgB,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,MACvC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,0CAA0C,KAAK,CAAA;AAAA,IAC/D,CAAA,SAAE;AACA,MAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,IAC3B;AAAA,EACF,GAAG,CAAC,WAAA,EAAa,iBAAA,EAAmB,YAAA,EAAc,UAAU,CAAC,CAAA;AAM7D,EAAAD,eAAA,CAAU,MAAM;AACd,IAAA,IAAA,CAAK,WAAA,IAAe,eAAe,iBAAA,EAAmB;AACpD,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,QAAA,eAAA,EAAgB;AAChB,QAAA,qBAAA,EAAsB;AACtB,QAAA,cAAA,EAAe;AACf,QAAA,aAAA,EAAc;AACd,QAAA,cAAA,EAAe;AAAA,MACjB,GAAG,GAAG,CAAA;AACN,MAAA,OAAO,MAAM,aAAa,KAAK,CAAA;AAAA,IACjC;AAAA,EACF,CAAA,EAAG,CAAC,iBAAA,EAAmB,WAAA,EAAa,UAAU,CAAC,CAAA;AAM/C,EAAA,MAAM,KAAA,GAA+B;AAAA;AAAA,IAEnC,MAAA;AAAA;AAAA,IAGA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA,EAAiB,CAAC,CAAC,WAAA;AAAA,IACnB,aAAA;AAAA,IACA,MAAA;AAAA;AAAA,IAGA,OAAA;AAAA;AAAA,IAGA,UAAA;AAAA,IACA,iBAAA;AAAA,IACA,oBAAA;AAAA,IACA,iBAAA;AAAA,IACA,eAAA,EAAAE,gBAAAA;AAAA,IACA,mBAAA;AAAA;AAAA,IAGA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA,EAAAC,cAAAA;AAAA;AAAA,IAGA,cAAA;AAAA,IACA,iBAAA;AAAA,IACA,cAAA;AAAA,IACA,iBAAA;AAAA;AAAA,IAGA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,iBAAA;AAAA;AAAA,IAGA,cAAA;AAAA,IACA,iBAAA;AAAA,IACA,gBAAA;AAAA,IACA,qBAAA;AAAA,IACA,uBAAA;AAAA,IACA,mBAAA;AAAA;AAAA,IAGA,OAAA;AAAA,IACA,cAAA;AAAA,IACA,gBAAA;AAAA;AAAA,IAGA,MAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA;AAAA;AAAA,IAGA,OAAA;AAAA,IACA,cAAA;AAAA,IACA,gBAAA;AAAA;AAAA,IAGA,aAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBACEE,cAAA,CAAC,gBAAA,CAAiB,QAAA,EAAjB,EAA0B,OACxB,QAAA,EACH,CAAA;AAEJ;AAaO,SAAS,YAAA,GAAsC;AACpD,EAAA,MAAM,OAAA,GAAUC,iBAAW,gBAAgB,CAAA;AAC3C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAAA,EACxE;AACA,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,oBAAA,GAAqD;AACnE,EAAA,OAAOA,iBAAW,gBAAgB,CAAA;AACpC;;;ACt6BO,IAAM,UAAA,GAAa;AAAA;AAAA,EAExB,cAAA,EAAgB,gBAAA;AAAA,EAChB,yBAAA,EAA2B,2BAAA;AAAA,EAC3B,8BAAA,EAAgC,gCAAA;AAAA;AAAA,EAGhC,aAAA,EAAe,eAAA;AAAA,EACf,eAAA,EAAiB,iBAAA;AAAA,EACjB,eAAA,EAAiB,iBAAA;AAAA;AAAA,EAGjB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,cAAA,EAAgB,gBAAA;AAAA,EAChB,kBAAA,EAAoB,oBAAA;AAAA;AAAA,EAGpB,YAAA,EAAc,cAAA;AAAA,EACd,SAAA,EAAW,WAAA;AAAA,EACX,wBAAA,EAA0B,0BAAA;AAAA;AAAA,EAG1B,mBAAA,EAAqB,qBAAA;AAAA,EACrB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,uBAAA,EAAyB,yBAAA;AAAA;AAAA,EAGzB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,uBAAA,EAAyB,yBAAA;AAAA,EACzB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,iBAAA,EAAmB,mBAAA;AAAA;AAAA,EAGnB,YAAA,EAAc,cAAA;AAAA,EACd,aAAA,EAAe,eAAA;AAAA,EACf,eAAA,EAAiB,iBAAA;AAAA,EACjB,WAAA,EAAa,aAAA;AAAA,EACb,eAAA,EAAiB,iBAAA;AAAA;AAAA,EAGjB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,6BAAA,EAA+B,+BAAA;AAAA,EAC/B,uBAAA,EAAyB,yBAAA;AAAA;AAAA,EAGzB,YAAA,EAAc,cAAA;AAAA,EACd,iBAAA,EAAmB,mBAAA;AAAA;AAAA,EAGnB,YAAA,EAAc,cAAA;AAAA,EACd,mBAAA,EAAqB,qBAAA;AAAA,EACrB,gBAAA,EAAkB,kBAAA;AAAA;AAAA,EAGlB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,aAAA,EAAe,eAAA;AAAA,EACf,kBAAA,EAAoB,oBAAA;AAAA,EACpB,sBAAA,EAAwB,wBAAA;AAAA;AAAA,EAGxB,aAAA,EAAe;AACjB;AAOO,IAAM,aAAA,GAA2C;AAAA,EACtD,CAAC,UAAA,CAAW,cAAc,GAAG,2BAAA;AAAA,EAC7B,CAAC,UAAA,CAAW,yBAAyB,GAAG,yCAAA;AAAA,EACxC,CAAC,UAAA,CAAW,8BAA8B,GAAG,8CAAA;AAAA,EAE7C,CAAC,UAAA,CAAW,aAAa,GAAG,iCAAA;AAAA,EAC5B,CAAC,UAAA,CAAW,eAAe,GAAG,qCAAA;AAAA,EAC9B,CAAC,UAAA,CAAW,eAAe,GAAG,wBAAA;AAAA,EAE9B,CAAC,UAAA,CAAW,qBAAqB,GAAG,uBAAA;AAAA,EACpC,CAAC,UAAA,CAAW,sBAAsB,GAAG,+CAAA;AAAA,EACrC,CAAC,UAAA,CAAW,mBAAmB,GAAG,2BAAA;AAAA,EAClC,CAAC,UAAA,CAAW,kBAAkB,GAAG,iFAAA;AAAA,EACjC,CAAC,UAAA,CAAW,cAAc,GAAG,sDAAA;AAAA,EAC7B,CAAC,UAAA,CAAW,kBAAkB,GAAG,8CAAA;AAAA,EAEjC,CAAC,UAAA,CAAW,YAAY,GAAG,+CAAA;AAAA,EAC3B,CAAC,UAAA,CAAW,SAAS,GAAG,eAAA;AAAA,EACxB,CAAC,UAAA,CAAW,wBAAwB,GAAG,oDAAA;AAAA,EAEvC,CAAC,UAAA,CAAW,mBAAmB,GAAG,qBAAA;AAAA,EAClC,CAAC,UAAA,CAAW,kBAAkB,GAAG,uCAAA;AAAA,EACjC,CAAC,UAAA,CAAW,uBAAuB,GAAG,4BAAA;AAAA,EAEtC,CAAC,UAAA,CAAW,iBAAiB,GAAG,mBAAA;AAAA,EAChC,CAAC,UAAA,CAAW,qBAAqB,GAAG,0BAAA;AAAA,EACpC,CAAC,UAAA,CAAW,uBAAuB,GAAG,4BAAA;AAAA,EACtC,CAAC,UAAA,CAAW,qBAAqB,GAAG,0BAAA;AAAA,EACpC,CAAC,UAAA,CAAW,iBAAiB,GAAG,oCAAA;AAAA,EAChC,CAAC,UAAA,CAAW,iBAAiB,GAAG,mBAAA;AAAA,EAEhC,CAAC,UAAA,CAAW,YAAY,GAAG,cAAA;AAAA,EAC3B,CAAC,UAAA,CAAW,aAAa,GAAG,+CAAA;AAAA,EAC5B,CAAC,UAAA,CAAW,eAAe,GAAG,qBAAA;AAAA,EAC9B,CAAC,UAAA,CAAW,WAAW,GAAG,+BAAA;AAAA,EAC1B,CAAC,UAAA,CAAW,eAAe,GAAG,6BAAA;AAAA,EAE9B,CAAC,UAAA,CAAW,qBAAqB,GAAG,uBAAA;AAAA,EACpC,CAAC,UAAA,CAAW,6BAA6B,GAAG,kCAAA;AAAA,EAC5C,CAAC,UAAA,CAAW,uBAAuB,GAAG,mCAAA;AAAA,EAEtC,CAAC,UAAA,CAAW,YAAY,GAAG,qCAAA;AAAA,EAC3B,CAAC,UAAA,CAAW,iBAAiB,GAAG,6BAAA;AAAA,EAEhC,CAAC,UAAA,CAAW,YAAY,GAAG,qCAAA;AAAA,EAC3B,CAAC,UAAA,CAAW,mBAAmB,GAAG,oCAAA;AAAA,EAClC,CAAC,UAAA,CAAW,gBAAgB,GAAG,8BAAA;AAAA,EAE/B,CAAC,UAAA,CAAW,gBAAgB,GAAG,kBAAA;AAAA,EAC/B,CAAC,UAAA,CAAW,aAAa,GAAG,oCAAA;AAAA,EAC5B,CAAC,UAAA,CAAW,kBAAkB,GAAG,uBAAA;AAAA,EACjC,CAAC,UAAA,CAAW,sBAAsB,GAAG,2BAAA;AAAA,EAErC,CAAC,UAAA,CAAW,aAAa,GAAG;AAC9B;AAKO,IAAM,eAAA,GAAsD;AAAA,EACjE,CAAC,UAAA,CAAW,aAAa,GAAG,8CAAA;AAAA,EAC5B,CAAC,UAAA,CAAW,eAAe,GAAG,uCAAA;AAAA,EAC9B,CAAC,UAAA,CAAW,sBAAsB,GAAG,0BAAA;AAAA,EACrC,CAAC,UAAA,CAAW,kBAAkB,GAAG,0CAAA;AAAA,EACjC,CAAC,UAAA,CAAW,kBAAkB,GAAG,4CAAA;AAAA,EACjC,CAAC,UAAA,CAAW,kBAAkB,GAAG,8BAAA;AAAA,EACjC,CAAC,UAAA,CAAW,YAAY,GAAG,6BAAA;AAAA,EAC3B,CAAC,UAAA,CAAW,iBAAiB,GAAG;AAClC;;;ACjGO,IAAM,cAAA,GAAN,MAAM,eAAA,SAAuB,KAAA,CAAM;AAAA,EAmBxC,WAAA,CAAY,IAAA,EAAiB,OAAA,EAAkB,OAAA,EAAiC;AAC9E,IAAA,MAAM,YAAA,GAAe,OAAA,IAAW,aAAA,CAAc,IAAI,CAAA,IAAK,mBAAA;AACvD,IAAA,KAAA,CAAM,YAAY,CAAA;AAElB,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,WAAA,GAAc,OAAA,EAAS,WAAA,IAAe,aAAA,CAAc,IAAI,CAAA,IAAK,YAAA;AAClE,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAA,EAAS,cAAA,IAAkB,eAAA,CAAgB,IAAI,CAAA;AACrE,IAAA,IAAA,CAAK,UAAU,OAAA,EAAS,OAAA;AACxB,IAAA,IAAA,CAAK,SAAS,OAAA,EAAS,MAAA;AACvB,IAAA,IAAA,CAAK,gBAAgB,OAAA,EAAS,KAAA;AAG9B,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,eAAA,CAAe,SAAS,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,YAAA,CAAa,MAAA,EAAgB,IAAA,EAAwD;AAC1F,IAAA,MAAM,SAAS,OAAO,IAAA,KAAS,QAAA,GAAW,YAAA,CAAa,IAAI,CAAA,GAAI,IAAA;AAC/D,IAAA,MAAM,SAAS,MAAA,EAAQ,MAAA,IAAU,MAAA,EAAQ,KAAA,IAAS,QAAQ,OAAA,IAAW,gBAAA;AAGrE,IAAA,MAAM,IAAA,GAAO,oBAAA,CAAqB,MAAA,EAAQ,MAAA,CAAO,MAAM,CAAC,CAAA;AAExD,IAAA,OAAO,IAAI,eAAA,CAAe,IAAA,EAAM,MAAA,CAAO,MAAM,CAAA,EAAG;AAAA,MAC9C,MAAA;AAAA,MACA,OAAA,EAAS,OAAO,MAAA,KAAW,QAAA,IAAY,WAAW,IAAA,GAAO,MAAA,GAAS,EAAE,GAAA,EAAK,IAAA;AAAK,KAC/E,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,iBAAiB,KAAA,EAA8B;AAEpD,IAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,CAAS,iBAAiB,KAAK,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,cAAc,CAAA,EAAG;AACvF,MAAA,OAAO,IAAI,eAAA,CAAe,UAAA,CAAW,aAAA,EAAe,6BAAA,EAA+B;AAAA,QACjF,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,MAAM,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,IAAK,KAAA,CAAM,SAAS,YAAA,EAAc;AACpE,MAAA,OAAO,IAAI,eAAA,CAAe,UAAA,CAAW,eAAA,EAAiB,mBAAA,EAAqB;AAAA,QACzE,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAI,eAAA,CAAe,UAAA,CAAW,aAAA,EAAe,MAAM,OAAA,EAAS;AAAA,MACjE,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,KAAK,KAAA,EAAgC;AAC1C,IAAA,IAAI,iBAAiB,eAAA,EAAgB;AACnC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,iBAAiB,KAAA,EAAO;AAE1B,MAAA,IACE,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,OAAO,KAC9B,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,IAChC,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,cAAc,CAAA,EACrC;AACA,QAAA,OAAO,eAAA,CAAe,iBAAiB,KAAK,CAAA;AAAA,MAC9C;AAEA,MAAA,OAAO,IAAI,eAAA,CAAe,UAAA,CAAW,aAAA,EAAe,MAAM,OAAA,EAAS;AAAA,QACjE,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,OAAA,GAAU,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,8BAAA;AACpD,IAAA,OAAO,IAAI,eAAA,CAAe,UAAA,CAAW,aAAA,EAAe,OAAO,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,MAAM,cAAA,GAA8B;AAAA,MAClC,UAAA,CAAW,aAAA;AAAA,MACX,UAAA,CAAW,eAAA;AAAA,MACX,UAAA,CAAW,YAAA;AAAA,MACX,UAAA,CAAW,mBAAA;AAAA,MACX,UAAA,CAAW;AAAA,KACb;AACA,IAAA,OAAO,cAAA,CAAe,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAA0B;AACxB,IAAA,MAAM,WAAA,GAA2B;AAAA,MAC/B,UAAA,CAAW,sBAAA;AAAA,MACX,UAAA,CAAW,YAAA;AAAA,MACX,UAAA,CAAW;AAAA,KACb;AACA,IAAA,OAAO,WAAA,CAAY,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAkC;AAChC,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,gBAAgB,IAAA,CAAK,cAAA;AAAA,MACrB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,QAAQ,IAAA,CAAK;AAAA,KACf;AAAA,EACF;AACF;AAKA,SAAS,aAAa,GAAA,EAA6C;AACjE,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACvB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKA,SAAS,oBAAA,CAAqB,QAAgB,MAAA,EAA2B;AAEvE,EAAA,MAAM,WAAA,GAAc,OAAO,WAAA,EAAY;AAEvC,EAAA,IAAI,YAAY,QAAA,CAAS,YAAY,KAAK,WAAA,CAAY,QAAA,CAAS,oBAAoB,CAAA,EAAG;AACpF,IAAA,OAAO,UAAA,CAAW,kBAAA;AAAA,EACpB;AACA,EAAA,IAAI,YAAY,QAAA,CAAS,cAAc,KAAK,WAAA,CAAY,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC1E,IAAA,OAAO,UAAA,CAAW,kBAAA;AAAA,EACpB;AACA,EAAA,IAAI,WAAA,CAAY,QAAA,CAAS,QAAQ,CAAA,EAAG;AAClC,IAAA,OAAO,UAAA,CAAW,cAAA;AAAA,EACpB;AACA,EAAA,IAAI,YAAY,QAAA,CAAS,YAAY,KAAK,WAAA,CAAY,QAAA,CAAS,UAAU,CAAA,EAAG;AAC1E,IAAA,OAAO,UAAA,CAAW,YAAA;AAAA,EACpB;AACA,EAAA,IAAI,YAAY,QAAA,CAAS,QAAQ,KAAK,WAAA,CAAY,QAAA,CAAS,OAAO,CAAA,EAAG;AACnE,IAAA,OAAO,UAAA,CAAW,iBAAA;AAAA,EACpB;AAGA,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,GAAA;AACH,MAAA,OAAO,UAAA,CAAW,gBAAA;AAAA,IACpB,KAAK,GAAA;AACH,MAAA,OAAO,UAAA,CAAW,qBAAA;AAAA,IACpB,KAAK,GAAA;AACH,MAAA,OAAO,UAAA,CAAW,SAAA;AAAA,IACpB,KAAK,GAAA;AACH,MAAA,OAAO,UAAA,CAAW,mBAAA;AAAA,IACpB,KAAK,GAAA;AACH,MAAA,OAAO,UAAA,CAAW,eAAA;AAAA,IACpB,KAAK,GAAA;AACH,MAAA,OAAO,UAAA,CAAW,gBAAA;AAAA,IACpB,KAAK,GAAA;AACH,MAAA,OAAO,UAAA,CAAW,YAAA;AAAA,IACpB,KAAK,GAAA;AACH,MAAA,OAAO,UAAA,CAAW,YAAA;AAAA,IACpB,KAAK,GAAA;AAAA,IACL,KAAK,GAAA;AACH,MAAA,OAAO,UAAA,CAAW,mBAAA;AAAA,IACpB,KAAK,GAAA;AACH,MAAA,OAAO,UAAA,CAAW,eAAA;AAAA,IACpB;AACE,MAAA,OAAO,MAAA,IAAU,GAAA,GAAM,UAAA,CAAW,YAAA,GAAe,UAAA,CAAW,aAAA;AAAA;AAElE;AAKO,SAAS,iBAAiB,KAAA,EAAyC;AACxE,EAAA,OAAO,KAAA,YAAiB,cAAA;AAC1B;AAKA,eAAsB,iBAAA,CACpB,IACA,OAAA,EACY;AACZ,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,EAAA,EAAG;AAAA,EAClB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,cAAA,GAAiB,cAAA,CAAe,IAAA,CAAK,KAAK,CAAA;AAChD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,cAAA,CAAe,OAAA,GAAU,EAAE,GAAG,cAAA,CAAe,SAAS,OAAA,EAAQ;AAAA,IAChE;AACA,IAAA,MAAM,cAAA;AAAA,EACR;AACF;;;ACxPO,SAAS,eAAe,MAAA,EAA2C;AACxE,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,WAAqB,EAAC;AAG5B,EAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACrB,IAAA,MAAA,CAAO,IAAA;AAAA,MACL;AAAA,KAEF;AAAA,EACF,CAAA,MAAA,IAAW,MAAA,CAAO,SAAA,CAAU,MAAA,GAAS,EAAA,EAAI;AACvC,IAAA,QAAA,CAAS,IAAA;AAAA,MACP;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,OAAO,cAAA,EAAgB;AAC1B,IAAA,MAAA,CAAO,IAAA;AAAA,MACL;AAAA,KAEF;AAAA,EACF,CAAA,MAAA,IAAW,MAAA,CAAO,cAAA,CAAe,MAAA,GAAS,EAAA,EAAI;AAC5C,IAAA,QAAA,CAAS,IAAA;AAAA,MACP;AAAA,KACF;AAAA,EACF;AAMA,EAAA,IAAI,CAAC,OAAO,QAAA,EAAU;AACpB,IAAA,QAAA,CAAS,IAAA;AAAA,MACP;AAAA,KAEF;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,QAAA,CAAS,KAAK,uDAAuD,CAAA;AAAA,EACvE;AAGA,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC5C,MAAA,IAAI,CAAC,MAAA,CAAO,IAAA,CAAK,cAAA,EAAgB;AAC/B,QAAA,MAAA,CAAO,IAAA;AAAA,UACL;AAAA,SAEF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,IAAA,CAAK,iBAAA,IAAqB,MAAA,CAAO,IAAA,CAAK,oBAAoB,CAAA,EAAG;AACtE,MAAA,QAAA,CAAS,IAAA;AAAA,QACP;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,GAAA,EAAK;AACrB,MAAA,MAAA,CAAO,KAAK,2CAA2C,CAAA;AAAA,IACzD;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,KAAA,EAAO;AACvB,MAAA,MAAA,CAAO,KAAK,6CAA6C,CAAA;AAAA,IAC3D;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,WAAA,EAAa;AAChC,MAAA,MAAA,CAAO,KAAK,sDAAsD,CAAA;AAAA,IACpE;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,WAAA,EAAa;AAChC,MAAA,MAAA,CAAO,KAAK,sDAAsD,CAAA;AAAA,IACpE;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,IACzB,MAAA;AAAA,IACA;AAAA,GACF;AACF;AAQO,SAAS,sBAAsB,MAAA,EAA+B;AACnE,EAAA,MAAM,MAAA,GAAS,eAAe,MAAM,CAAA;AAEpC,EAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACjB,IAAA,MAAM,IAAI,eAAe,UAAA,CAAW,cAAA,EAAgB,OAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG;AAAA,MAC5E,WAAA,EAAa,8DAAA;AAAA,MACb,SAAS,EAAE,MAAA,EAAQ,OAAO,MAAA,EAAQ,QAAA,EAAU,OAAO,QAAA;AAAS,KAC7D,CAAA;AAAA,EACH;AAGA,EAAA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAY;AACnC,IAAA,OAAA,CAAQ,IAAA,CAAK,eAAe,OAAO,CAAA;AAAA,EACrC,CAAC,CAAA;AACH;AAKO,SAAS,oBAAoB,MAAA,EAAkC;AACpE,EAAA,OACE,MAAA,CAAO,IAAA,KAAS,aAAA,IAChB,MAAA,CAAO,IAAA,KAAS,MAAA,IACf,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,EAAK,QAAA,KAAa,aAAA;AAEjE;AAKO,SAAS,iBAAiB,MAAA,EAAkD;AACjF,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAO,IAAA,IAAQ,YAAA;AAAA,IACrB,YAAA,EAAc,CAAC,CAAC,MAAA,CAAO,SAAA;AAAA,IACvB,iBAAA,EAAmB,CAAC,CAAC,MAAA,CAAO,cAAA;AAAA,IAC5B,QAAA,EAAU,OAAO,QAAA,IAAY,cAAA;AAAA,IAC7B,OAAA,EAAS,OAAO,OAAA,IAAW,WAAA;AAAA,IAC3B,aAAA,EAAe,MAAA,CAAO,IAAA,EAAM,SAAA,IAAa,CAAC,OAAO,CAAA;AAAA,IACjD,QAAA,EAAU,CAAC,CAAC,MAAA,CAAO,KAAA;AAAA,IACnB,WAAA,EAAa,CAAC,CAAC,MAAA,CAAO,QAAA;AAAA,IACtB,OAAA,EAAS,OAAO,OAAA,IAAW;AAAA,GAC7B;AACF;ACxIO,SAAS,OAAA,GAAyB;AACvC,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA;AAAA,IACA,MAAA,EAAQ,aAAA;AAAA,IACR;AAAA,MACE,YAAA,EAAa;AAEjB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIP,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,UAAU,MAAA,CAAO;AAAA,GACnB;AAEA,EAAA,MAAM,UAAA,GAAa,OAAO,IAAA,KAAS,MAAA;AAKnC,EAAA,MAAMQ,MAAAA,GAAQN,iBAAAA,CAAY,OAAO,KAAA,EAAe,QAAA,KAAuC;AACrF,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AAEF,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,CAAU,KAAK,GAAG,CAAA;AACxB,QAAA,MAAM,cAAA,GAAuC;AAAA,UAC3C,GAAG,eAAA;AAAA,UACH,KAAA;AAAA,UACA,SAAA,EAAW,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,EAAI,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA,CAAE,WAAA;AAAY,SACpE;AACA,QAAA,cAAA,CAAe,cAAc,CAAA;AAC7B,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAS,KAAA,EAAO,UAAU,YAAY,CAAA;AAE7D,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAChC,QAAA,MAAM,EAAE,aAAA,EAAe,OAAA,EAAS,YAAA,KAAiB,QAAA,CAAS,IAAA;AAE1D,QAAA,MAAM,cAAA,GAAuC;AAAA,UAC3C,QAAQ,YAAA,IAAgB,aAAA;AAAA;AAAA,UAExB,QAAA,EAAU,OAAO,QAAA,IAAY,EAAA;AAAA,UAC7B,MAAA,EAAQ,OAAA;AAAA,UACR;AAAA,SACF;AAEA,QAAA,cAAA,CAAe,cAAc,CAAA;AAC7B,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,QAAA,CAAS,QAAA,CAAS,SAAS,cAAc,CAAA;AACzC,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,cAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAChB,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,MAAA,CAAO,UAAU,cAAA,EAAgB,YAAA,EAAc,UAAU,CAAC,CAAA;AAK9D,EAAA,MAAMO,SAAAA,GAAWP,iBAAAA,CAAY,OAC3B,KAAA,EACA,UACA,KAAA,KACqB;AACrB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AAEF,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,CAAU,KAAK,GAAG,CAAA;AAExB,QAAA,OAAO,MAAMM,MAAAA,CAAM,KAAA,EAAO,QAAQ,CAAA;AAAA,MACpC;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAY,KAAA,EAAO,UAAU,YAAY,CAAA;AAEhE,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAEhC,QAAA,IAAI,QAAA,CAAS,KAAK,aAAA,EAAe;AAC/B,UAAA,MAAM,cAAA,GAAuC;AAAA,YAC3C,MAAA,EAAQ,SAAS,IAAA,CAAK,aAAA;AAAA;AAAA,YAEtB,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,SAAA,IAAa,OAAO,QAAA,IAAY,EAAA;AAAA,YACxD,MAAA,EAAQ,SAAS,IAAA,CAAK,OAAA;AAAA,YACtB;AAAA,WACF;AACA,UAAA,cAAA,CAAe,cAAc,CAAA;AAC7B,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,IAAI,QAAA,CAAS,KAAK,OAAA,EAAS;AACzB,UAAA,OAAO,MAAMA,MAAAA,CAAM,KAAA,EAAO,QAAQ,CAAA;AAAA,QACpC;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,QAAA,CAAS,QAAA,CAAS,SAAS,qBAAqB,CAAA;AAChD,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,qBAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAChB,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAACA,MAAAA,EAAO,YAAA,EAAc,UAAU,CAAC,CAAA;AAKpC,EAAA,MAAM,YAAA,GAAeN,kBAAY,YAA2B;AAC1D,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AAGF,MAAA,MAAM,cAAA,GAAiB,OAAO,IAAA,EAAM,cAAA;AACpC,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAAA,MAC/C;AAEA,MAAA,MAAM,WAAA,GAAc,CAAA,EAAG,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,yBAAA,CAAA;AAC7C,MAAA,MAAM,KAAA,GAAQ,sBAAA;AACd,MAAA,MAAM,KAAA,GAAQ,OAAO,UAAA,EAAW;AAGhC,MAAA,cAAA,CAAe,OAAA,CAAQ,sBAAsB,KAAK,CAAA;AAElD,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB;AAAA,QACjC,SAAA,EAAW,cAAA;AAAA,QACX,YAAA,EAAc,WAAA;AAAA,QACd,aAAA,EAAe,MAAA;AAAA,QACf,KAAA;AAAA,QACA,KAAA;AAAA,QACA,WAAA,EAAa,SAAA;AAAA,QACb,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,MAAA,CAAO,QAAA,CAAS,IAAA,GAAO,CAAA,6CAAA,EAAgD,MAAM,CAAA,CAAA;AAAA,IAC/E,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,uBAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAChB,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,CAAO,IAAA,EAAM,cAAc,CAAC,CAAA;AAKhC,EAAA,MAAM,MAAA,GAASA,kBAAY,MAAM;AAC/B,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,aAAA,EAAc;AAAA,EAChB,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAKlB,EAAA,MAAM,YAAA,GAAeA,kBAAY,YAA8B;AAC7D,IAAA,IAAI,CAAC,aAAa,OAAO,KAAA;AAGzB,IAAA,IAAI,YAAY,SAAA,EAAW;AACzB,MAAA,MAAM,YAAY,IAAI,IAAA,CAAK,WAAA,CAAY,SAAS,EAAE,OAAA,EAAQ;AAC1D,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,MAAM,WAAA,GAAc,IAAI,EAAA,GAAK,GAAA;AAE7B,MAAA,IAAI,GAAA,GAAM,YAAY,WAAA,EAAa;AAEjC,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAIA,IAAA,OAAO,CAAC,CAAC,WAAA,CAAY,MAAA;AAAA,EACvB,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAGhB,EAAA,MAAM,IAAA,GAAoBQ,cAAQ,MAAM;AACtC,IAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AACzB,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,YAAY,MAAA,IAAU,EAAA;AAAA,MAC1B,KAAA,EAAO,YAAY,KAAA,IAAS,EAAA;AAAA,MAC5B,UAAU,WAAA,CAAY,QAAA;AAAA,MACtB,WAAW,WAAA,CAAY;AAAA,KACzB;AAAA,EACF,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA,EAAAF,MAAAA;AAAA,IACA,QAAA,EAAAC,SAAAA;AAAA,IACA,YAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACF;AC/MO,SAAS,YAAA,GAAmC;AACjD,EAAA,MAAM;AAAA,IACJ,UAAA;AAAA,IACA,iBAAA;AAAA,IACA,oBAAA;AAAA,IACA,iBAAA,EAAmB,cAAA;AAAA,IACnB,eAAA,EAAiB,aAAA;AAAA,IACjB;AAAA,MACE,YAAA,EAAa;AAEjB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIT,eAAwB,IAAI,CAAA;AAKtD,EAAA,MAAMG,gBAAAA,GAAkBD,iBAAAA,CAAY,OAClC,IAAA,EACA,WAAA,KACkC;AAClC,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,MAAM,aAAA,CAAc,IAAA,EAAM,WAAW,CAAA;AACvD,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,QAAA,CAAS,4BAA4B,CAAA;AAAA,MACvC;AACA,MAAA,OAAO,SAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,4BAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAKlB,EAAA,MAAM,eAAA,GAAkBA,iBAAAA,CAAY,CAAC,SAAA,KAA6B;AAChE,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,oBAAA,CAAqB,SAAS,CAAA;AAAA,EAChC,CAAA,EAAG,CAAC,oBAAoB,CAAC,CAAA;AAKzB,EAAA,MAAM,iBAAA,GAAoBA,kBAAY,YAAY;AAChD,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,cAAA,EAAe;AAAA,IACvB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,8BAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,iBAAA;AAAA,IACA,SAAA,EAAW,mBAAA;AAAA,IACX,KAAA;AAAA,IACA,eAAA,EAAAC,gBAAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF;AACF;ACzDO,SAAS,WAAA,GAAiC;AAC/C,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,QAAA;AAAA,IACA,eAAA,EAAiB,cAAA;AAAA,IACjB,iBAAA;AAAA,IACA;AAAA,MACE,YAAA,EAAa;AAEjB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIH,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,UAAU,MAAA,CAAO;AAAA,GACnB;AAEA,EAAA,MAAM,UAAA,GAAa,OAAO,IAAA,KAAS,MAAA;AAKnC,EAAA,MAAM,aAAA,GAAgBE,iBAAAA,CAAY,OAChC,IAAA,EACA,IAAA,KACgC;AAChC,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,UAAA,EAAY;AAC/B,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAC5B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,CAAC,iBAAA,IAAqB,CAAC,UAAA,EAAY;AACrC,MAAA,QAAA,CAAS,uBAAuB,CAAA;AAChC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AAEF,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,CAAU,KAAK,IAAI,CAAA;AACzB,QAAA,MAAM,WAAA,GAA2B;AAAA,UAC/B,EAAA,EAAI,eAAe,IAAI,CAAA;AAAA,UACvB,MAAM,IAAA,IAAQ,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,aAAa,EAAE,CAAA;AAAA,UAC/C,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,GAAK,CAAA,GAAI,GAAA;AAAA,UAC1C,SAAS,IAAA,CAAK,KAAA,CAAM,KAAK,MAAA,EAAO,GAAI,EAAE,CAAA,GAAI,CAAA;AAAA,UAC1C,WAAA,EAAa,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA;AAAA,UACpC,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,UAClC,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,SACpC;AACA,QAAA,MAAM,cAAA,EAAe;AACrB,QAAA,OAAO,WAAA;AAAA,MACT;AAEA,MAAA,MAAM,WAAW,MAAM,UAAA;AAAA,QACrB,WAAA;AAAA,QACA,iBAAA,CAAmB,WAAA;AAAA,QACnB,IAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM,OAAA,EAAS;AAEzC,QAAA,MAAM,cAAA,EAAe;AACrB,QAAA,OAAO,SAAS,IAAA,CAAK,OAAA;AAAA,MACvB;AAEA,MAAA,QAAA,CAAS,QAAA,CAAS,SAAS,eAAe,CAAA;AAC1C,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,eAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,GAAG,CAAC,WAAA,EAAa,mBAAmB,YAAA,EAAc,cAAA,EAAgB,UAAU,CAAC,CAAA;AAK7E,EAAA,MAAM,eAAA,GAAkBA,iBAAAA,CAAY,OAAO,IAAA,KAAuC;AAChF,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,UAAA,EAAY;AAC/B,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAC5B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,CAAC,iBAAA,IAAqB,CAAC,UAAA,EAAY;AACrC,MAAA,QAAA,CAAS,uBAAuB,CAAA;AAChC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AAEF,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,CAAU,KAAK,GAAG,CAAA;AACxB,QAAA,MAAM,OAAA,GAAU,yDAAA;AAChB,QAAA,OAAO,IAAI,KAAK,CAAC,OAAO,GAAG,EAAE,IAAA,EAAM,YAAY,CAAA;AAAA,MACjD;AAEA,MAAA,MAAM,OAAA,GAAU,OAAO,OAAA,IAAW,gCAAA;AAClC,MAAA,MAAM,QAAA,GAAW,WAAA,CAAa,QAAA,IAAY,MAAA,CAAO,QAAA,IAAY,EAAA;AAG7D,MAAA,MAAM,GAAA,GAAM,CAAA,EAAG,OAAO,CAAA,UAAA,EAAa,IAAI,CAAA,SAAA,CAAA;AAEvC,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,OAAA,EAAS;AAAA,UACP,eAAA,EAAiB,CAAA,OAAA,EAAU,WAAA,CAAa,MAAM,CAAA,CAAA;AAAA,UAC9C,aAAA,EAAe,QAAA;AAAA,UACf,WAAA,EAAa,YAAa,MAAA,IAAU;AAAA;AACtC,OACD,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,QAAA,CAAS,CAAA,iBAAA,EAAoB,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAClD,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO,MAAM,SAAS,IAAA,EAAK;AAAA,IAC7B,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,iBAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,GAAG,CAAC,WAAA,EAAa,iBAAA,EAAmB,MAAA,EAAQ,UAAU,CAAC,CAAA;AAKvD,EAAA,MAAMS,cAAAA,GAAgBT,iBAAAA,CAAY,OAAO,IAAA,KAAmC;AAC1E,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,UAAA,EAAY;AAC/B,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAC5B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,CAAC,iBAAA,IAAqB,CAAC,UAAA,EAAY;AACrC,MAAA,QAAA,CAAS,uBAAuB,CAAA;AAChC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI;AAEF,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,CAAU,KAAK,GAAG,CAAA;AACxB,QAAA,MAAM,cAAA,EAAe;AACrB,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,WAAW,MAAM,aAAA;AAAA,QACrB,WAAA;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,IAAI,SAAS,EAAA,EAAI;AAEf,QAAA,MAAM,cAAA,EAAe;AACrB,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,QAAA,CAAS,QAAA,CAAS,SAAS,eAAe,CAAA;AAC1C,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,eAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAChB,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,GAAG,CAAC,WAAA,EAAa,mBAAmB,YAAA,EAAc,cAAA,EAAgB,UAAU,CAAC,CAAA;AAK7E,EAAA,MAAM,eAAA,GAAkBA,kBAAY,YAAY;AAC9C,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,cAAA,EAAe;AAAA,IACvB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,gBAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,SAAA,EAAW,iBAAA;AAAA,IACX,KAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA,EAAAS,cAAAA;AAAA,IACA;AAAA,GACF;AACF;ACjNO,SAAS,iBAAA,GAA6C;AAC3D,EAAA,MAAM;AAAA,IACJ,cAAA;AAAA,IACA,qBAAA,EAAuB,cAAA;AAAA,IACvB;AAAA,MACE,YAAA,EAAa;AAEjB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIX,eAAwB,IAAI,CAAA;AAKtD,EAAA,MAAM,qBAAA,GAAwBE,kBAAY,YAAY;AACpD,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,cAAA,EAAe;AAAA,IACvB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,gBAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,EAAA,OAAO;AAAA,IACL,cAAA;AAAA,IACA,SAAA,EAAW,uBAAA;AAAA,IACX,KAAA;AAAA,IACA;AAAA,GACF;AACF;ACjBO,SAAS,UAAA,GAA+B;AAC7C,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAA,EAAgB,cAAA;AAAA,IAChB,gBAAA;AAAA,IACA;AAAA,MACE,YAAA,EAAa;AAEjB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIF,eAAwB,IAAI,CAAA;AAKtD,EAAA,MAAM,YAAA,GAAeE,iBAAAA,CAAY,OAC/B,KAAA,EACA,KAAA,KAC+B;AAC/B,IAAA,QAAA,CAAS,IAAI,CAAA;AAIb,IAAA,QAAA,CAAS,+BAA+B,CAAA;AACxC,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,EAAE,CAAA;AAKL,EAAA,MAAM,cAAA,GAAiBA,iBAAAA,CAAY,OACjC,GAAA,EACA,OACA,OAAA,KACyB;AACzB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAC5B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,OAAA,EAAS;AAAA,UACP,eAAA,EAAiB,CAAA,OAAA,EAAU,WAAA,CAAY,MAAM,CAAA,CAAA;AAAA,UAC7C,eAAe,WAAA,CAAY,QAAA;AAAA,UAC3B,WAAA,EAAa,YAAY,MAAA,IAAU;AAAA;AACrC,OACD,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,QAAA,CAAS,CAAA,iBAAA,EAAoB,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAClD,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO,MAAM,SAAS,IAAA,EAAK;AAAA,IAC7B,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,iBAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAKhB,EAAA,MAAM,cAAA,GAAiBA,kBAAY,YAAY;AAC7C,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,cAAA,EAAe;AAAA,IACvB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,gBAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,SAAA,EAAW,gBAAA;AAAA,IACX,KAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AACF;ACjFO,SAAS,SAAA,GAA6B;AAC3C,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,MAAA;AAAA,IACA,aAAA,EAAe,cAAA;AAAA,IACf,eAAA;AAAA,IACA;AAAA,MACE,YAAA,EAAa;AAEjB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIF,eAAwB,IAAI,CAAA;AAKtD,EAAA,MAAM,aAAA,GAAgBE,iBAAAA,CAAY,OAAO,IAAA,KAAuC;AAC9E,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAC5B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,MAAA,QAAA,CAAS,uBAAuB,CAAA;AAChC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AAEF,MAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,IAAI,CAAA;AAC9C,MAAA,IAAI,CAAC,OAAO,YAAA,EAAc;AACxB,QAAA,QAAA,CAAS,kCAAkC,CAAA;AAC3C,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,KAAA,CAAM,YAAA,EAAc;AAAA,QAC/C,OAAA,EAAS;AAAA,UACP,eAAA,EAAiB,CAAA,OAAA,EAAU,WAAA,CAAY,MAAM,CAAA,CAAA;AAAA,UAC7C,eAAe,WAAA,CAAY,QAAA;AAAA,UAC3B,WAAA,EAAa,YAAY,MAAA,IAAU;AAAA;AACrC,OACD,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,QAAA,CAAS,CAAA,iBAAA,EAAoB,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAClD,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO,MAAM,SAAS,IAAA,EAAK;AAAA,IAC7B,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,iBAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,iBAAA,EAAmB,MAAM,CAAC,CAAA;AAK3C,EAAA,MAAM,aAAA,GAAgBA,kBAAY,YAAY;AAC5C,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,cAAA,EAAe;AAAA,IACvB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,gBAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,SAAA,EAAW,eAAA;AAAA,IACX,KAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;ACxDO,SAAS,eAAe,OAAA,EAAuD;AACpF,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA;AAAA,MACE,YAAA,EAAa;AAEjB,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIF,cAAAA,CAAuB,EAAE,CAAA;AAC/D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,UAAU,MAAA,CAAO;AAAA,GACnB;AACA,EAAA,MAAM,oBAAoB,OAAA,EAAS,iBAAA;AAKnC,EAAA,MAAM,kBAAA,GAAqBE,kBAAY,YAAY;AACjD,IAAA,IAAI,CAAC,WAAA,EAAa;AAElB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,eAAA,CAAgB,aAAa,YAAA,EAAc,EAAE,mBAAmB,CAAA;AAEvF,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAChC,QAAA,cAAA,CAAe,QAAA,CAAS,IAAA,CAAK,WAAA,IAAe,EAAE,CAAA;AAAA,MAChD,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,QAAA,CAAS,SAAS,6BAA6B,CAAA;AAAA,MAC1D;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,6BAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAAA,IAClB,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,YAAA,EAAc,iBAAiB,CAAC,CAAA;AAGjD,EAAAD,gBAAU,MAAM;AACd,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,kBAAA,EAAmB;AAAA,IACrB;AAAA,EACF,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAKhB,EAAA,MAAMW,iBAAAA,GAAmBV,iBAAAA,CAAY,OACnC,YAAA,KAC+B;AAC/B,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAC5B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,gBAAA,CAAoB,WAAA,EAAa,cAAc,YAAY,CAAA;AAElF,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAEhC,QAAA,MAAM,kBAAA,EAAmB;AACzB,QAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MAClB;AAEA,MAAA,QAAA,CAAS,QAAA,CAAS,SAAS,8BAA8B,CAAA;AACzD,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,8BAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,YAAA,EAAc,kBAAkB,CAAC,CAAA;AAKlD,EAAA,MAAM,cAAA,GAAiBA,iBAAAA,CAAY,OAAO,EAAA,KAA8C;AACtF,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,mBAAA,EAAoB;AAAA,IACxD;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,cAAA,CAAe,WAAA,EAAa,IAAI,YAAY,CAAA;AAEnE,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAChC,QAAA,OAAO,QAAA,CAAS,IAAA;AAAA,MAClB;AAEA,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,QAAA,CAAS,SAAS,wBAAA,EAAyB;AAAA,IAC/E,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,wBAAA;AACrD,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,OAAA,EAAQ;AAAA,IACnC;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,YAAY,CAAC,CAAA;AAK9B,EAAA,MAAMW,iBAAAA,GAAmBX,iBAAAA,CAAY,OAAO,EAAA,KAAiC;AAC3E,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAC5B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,gBAAA,CAAoB,WAAA,EAAa,IAAI,YAAY,CAAA;AAExE,MAAA,IAAI,SAAS,EAAA,EAAI;AAEf,QAAA,MAAM,kBAAA,EAAmB;AACzB,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,QAAA,CAAS,QAAA,CAAS,SAAS,8BAA8B,CAAA;AACzD,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,8BAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAChB,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,YAAA,EAAc,kBAAkB,CAAC,CAAA;AAElD,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,gBAAA,EAAAU,iBAAAA;AAAA,IACA,cAAA;AAAA,IACA,gBAAA,EAAAC,iBAAAA;AAAA,IACA;AAAA,GACF;AACF;;;AC7JO,SAAS,aAAa,IAAA,EAAkC;AAE7D,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC7B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAGzB,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,OAAO,EAAE,MAAM,MAAA,EAAO;AAAA,IACxB;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,MAAA,OAAO,eAAe,MAAM,CAAA;AAAA,IAC9B,CAAA,CAAA,MAAQ;AAEN,MAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,IAAA,EAAK;AAAA,IAC1C;AAAA,EACF;AAKA,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,EAAG;AAC9B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAC9B,IAAA,OAAO,EAAE,MAAM,SAAA,EAAU;AAAA,EAC3B;AAEA,EAAA,OAAO,IAAA;AACT;AA4BA,SAAS,eAAe,IAAA,EAA4C;AAOlE,EAAA,IAAI,KAAK,IAAA,EAAM;AACb,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,kBAAA,CAAmB,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,MAC1C,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,IAAA,EAAO,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA;AAAA,MACzB,SAAA,EAAY,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,aAAa,IAAA,CAAK,EAAA;AAAA,MACvD,IAAA,EAAO,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,KAAA;AAAA,MACzB,QAAQ,IAAA,CAAK,MAAA;AAAA;AAAA,MAEb,OAAA,EAAU,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,OAAA;AAAA,MAChC,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,YAAY,IAAA,CAAK;AAAA,KACnB;AAAA,EACF;AAWA,EAAA,IAAI,KAAK,KAAA,EAAO;AACd,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AAEnB,IAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC/B,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,MAAM,IAAA,EAAe;AAAA,IACvD;AAEA,IAAA,IAAI,KAAA,CAAM,SAAS,kBAAA,EAAoB;AACrC,MAAA,OAAO,EAAE,MAAM,UAAA,EAAY,IAAA,EAAM,EAAE,OAAA,EAAS,KAAA,CAAM,cAAa,EAAE;AAAA,IACnE;AAGA,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,MAAM,IAAA,EAAe;AAAA,IACxD;AAAA,EACF;AAIA,EAAA,IAAI,KAAK,aAAA,EAAe;AACtB,IAAA,MAAM,QAAQ,IAAA,CAAK,aAAA;AACnB,IAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,MAAM,IAAA,EAAe;AAAA,IACvD;AACA,IAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,UAAA;AAAA,QACN,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,MAAM,KAAA,CAAM;AAAA,OACd;AAAA,IACF;AAAA,EACF;AAUA,EAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,SAAA,IAAa,KAAK,IAAA,EAAM;AACnD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,SAAS,aAAA,GAAgB,UAAA;AAAA,MACpD,IAAA,EAAO,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,IAAA;AAAA,MAC9B,SAAA,EAAY,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,EAAA;AAAA,MACrC,IAAA,EAAO,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,IAAA;AAAA,MAC1B,MAAA,EAAQ,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,MAAA;AAAA;AAAA,MAE7B,OAAA,EAAU,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK;AAAA,KAClC;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,OAAA,EAAS;AAC7B,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAU,IAAA,CAAK,IAAA,IAAQ,KAAK,OAAA,EAAmB;AAAA,EACxE;AAGA,EAAA,IAAI,KAAK,KAAA,EAAO;AACd,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,KAAK,KAAA,EAAgB;AAAA,EACtD;AAGA,EAAA,IAAI,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,SAAA,IAAa,KAAK,QAAA,EAAU;AACzD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,eAAA;AAAA,MACN,IAAA,EAAM,KAAK,aAAA,IAAiB;AAAA,QAC1B,QAAA,EAAU,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,QAAA;AAAA,QACjC,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,QAAQ,IAAA,CAAK;AAAA;AACf,KACF;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,OAAA,KAAY,MAAA,IAAa,IAAA,CAAK,cAAc,MAAA,EAAW;AAC9D,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,eAAA;AAAA,MACN,IAAA,EAAM;AAAA,QACJ,SAAA,EAAW,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,SAAA;AAAA,QAChC,MAAM,IAAA,CAAK;AAAA;AACb,KACF;AAAA,EACF;AAGA,EAAA,IAAI,KAAK,IAAA,IAAQ,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,eAAe,MAAA,EAAW;AAC/D,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,UAAA;AAAA,MACN,OAAA,EAAU,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,QAAA;AAAA,MAC5B,YAAY,IAAA,CAAK;AAAA,KACnB;AAAA,EACF;AAIA,EAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAK;AACjC;AAWA,SAAS,mBAAmB,IAAA,EAA+B;AACzD,EAAA,MAAM,OAAA,GAA2C;AAAA;AAAA,IAE/C,MAAA,EAAQ,MAAA;AAAA;AAAA,IACR,OAAA,EAAS,OAAA;AAAA;AAAA,IACT,SAAA,EAAW,SAAA;AAAA;AAAA,IACX,qBAAA,EAAuB,OAAA;AAAA;AAAA;AAAA,IAGvB,UAAA,EAAY,UAAA;AAAA;AAAA,IACZ,WAAA,EAAa,WAAA;AAAA;AAAA,IACb,aAAA,EAAe,aAAA;AAAA;AAAA;AAAA,IAGf,eAAA,EAAiB,eAAA;AAAA,IACjB,KAAA,EAAO,eAAA;AAAA;AAAA;AAAA,IAGP,UAAA,EAAY,UAAA;AAAA,IACZ,MAAA,EAAQ,UAAA;AAAA;AAAA;AAAA,IAGR,eAAA,EAAiB,eAAA;AAAA,IACjB,SAAA,EAAW,eAAA;AAAA;AAAA;AAAA,IAGX,eAAA,EAAiB,eAAA;AAAA;AAAA,IAGjB,UAAA,EAAY,UAAA;AAAA;AAAA,IACZ,UAAA,EAAY,UAAA;AAAA;AAAA,IACZ,MAAA,EAAQ,MAAA;AAAA;AAAA,IACR,cAAA,EAAgB,MAAA;AAAA;AAAA;AAAA,IAGhB,WAAA,EAAa,WAAA;AAAA;AAAA,IAGb,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,WAAA,EAAa,CAAA,IAAK,SAAA;AACxC;AA6BA,gBAAuB,eACrB,MAAA,EAC4C;AAC5C,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,IAAI,MAAA,GAAS,EAAA;AAEb,EAAA,IAAI,gBAAA,GAAkC,IAAA;AAEtC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,MAAA,IAAI,IAAA,EAAM;AAGV,MAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAChD,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAE/B,MAAA,MAAA,GAAS,KAAA,CAAM,KAAI,IAAK,EAAA;AAExB,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,QAAA,IAAI,CAAC,OAAA,EAAS;AAId,QAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,EAAG;AACjC,UAAA,gBAAA,GAAmB,OAAA,CAAQ,MAAM,CAAC,CAAA;AAClC,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,KAAA,GAAQ,aAAa,OAAO,CAAA;AAClC,QAAA,IAAI,KAAA,EAAO;AAKT,UAAA,IAAI,gBAAA,EAAkB;AACpB,YAAA,KAAA,CAAM,IAAA,GAAO,mBAAmB,gBAAgB,CAAA;AAChD,YAAA,gBAAA,GAAmB,IAAA;AAAA,UACrB;AAEA,UAAA,MAAM,KAAA;AAGN,UAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,KAAA,CAAM,SAAS,UAAA,EAAY;AACtD,YAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,CAAO,MAAK,EAAG;AACjB,MAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,MAAA,CAAO,IAAA,EAAM,CAAA;AACxC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF;AAAA,EACF,CAAA,SAAE;AACA,IAAA,MAAA,CAAO,WAAA,EAAY;AAAA,EACrB;AACF;AAUA,eAAsB,gBAAA,CACpB,QAAA,EACA,OAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,EAAM,SAAA,EAAU;AACxC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,EACjD;AAEA,EAAA,IAAI;AACF,IAAA,WAAA,MAAiB,KAAA,IAAS,cAAA,CAAe,MAAM,CAAA,EAAG;AAChD,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,OAAA,IAAW,iBAAiB,KAAA,EAAO;AACrC,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf,CAAA,MAAO;AACL,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF;;;AC1ZO,SAAS,WAAW,CAAA,EAAoB;AAC7C,EAAA,MAAM,CAAA,GAAI,EAAE,SAAA,EAAU;AACtB,EAAA,OAAO,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA,IAAK,CAAA,CAAE,WAAW,IAAI,CAAA,IAAK,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA;AACtE;AAGO,SAAS,kBAAA,CAAmB,KAAa,IAAA,EAA8B;AAC5E,EAAA,IAAI;AACF,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACxB,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,SAAA,IAAa,CAAA,CAAE,UAAU,KAAA,CAAA,EAAW;AACnD,MAAA,OAAO,SAAS,CAAA,CAAE,KAAK,CAAA,QAAA,EAAW,CAAA,CAAE,UAAU,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAG,EAAE,KAAA,GAAQ,CAAA,MAAA,EAAS,CAAA,CAAE,KAAK,MAAM,EAAE,CAAA,CAAA;AAAA,IACjG;AACA,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,UAAA,IAAc,CAAA,CAAE,OAAA,EAAS;AACxC,MAAA,OAAO,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAU,IAAA;AAAA,IACrD;AACA,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,eAAe,CAAA,CAAE,MAAA;AAC5C,IAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,SAAS,GAAA,EAAK;AAC/C,MAAA,OAAO,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,GAAK,GAAA;AAAA,IACpC;AACA,IAAA,IAAI,MAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AACpC,MAAA,OAAO,CAAA,SAAA,EAAY,EAAE,MAAM,CAAA,OAAA,EAAU,EAAE,MAAA,KAAW,CAAA,GAAI,MAAM,EAAE,CAAA,CAAA;AAAA,IAChE;AACA,IAAA,OAAO,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,cAAA,CAAA,GAAmB,IAAA;AAAA,EAC1C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AA8CA,SAAS,eAAe,IAAA,EAAuB;AAC7C,EAAA,OAAO,6BAAA,CAA8B,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,CAAA;AACvD;AAGA,SAAS,aAAa,IAAA,EAAsB;AAC1C,EAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,GAAG,GAAG,OAAO,IAAA;AAEhC,EAAA,IAAI,CAAA,GAAI,IAAA;AAGR,EAAA,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,kBAAA,EAAoB,CAAC,IAAA,KAAS;AAC1C,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,MAAM,CAAC,CAAA;AACrC,IAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,CAAC,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAE,IAAA,EAAK,EAAG,KAAA,CAAM,GAAA,EAAI;AACnE,IAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAE7B,IAAA,MAAM,QAAQ,KAAA,CAAM,GAAA,CAAI,OAAK,mBAAA,CAAoB,IAAA,CAAK,CAAC,CAAC,CAAA;AACxD,IAAA,IAAI,QAAA,GAAW,EAAA;AACf,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,IAASC,EAAAA,GAAI,CAAA,EAAGA,EAAAA,GAAI,KAAA,CAAM,QAAQA,EAAAA,EAAAA,EAAK;AACrC,MAAA,IAAI,KAAA,CAAMA,EAAC,CAAA,EAAG;AACZ,QAAA,IAAI,QAAA,KAAa,IAAI,QAAA,GAAWA,EAAAA;AAChC,QAAA,MAAA,EAAA;AAAA,MACF,CAAA,MAAA,IAAW,aAAa,EAAA,EAAI;AAAA,IAC9B;AACA,IAAA,IAAI,MAAA,GAAS,CAAA,IAAK,QAAA,GAAW,MAAA,EAAQ,OAAO,IAAA;AAC5C,IAAA,MAAM,IAAA,GAAO,MAAA;AACb,IAAA,IAAI,QAAA,KAAa,MAAM,OAAO,IAAA;AAC9B,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,QAAA,GAAW,IAAI,CAAA;AAC7C,IAAA,IAAI,SAAA,CAAU,MAAA,GAAS,IAAA,EAAM,OAAO,IAAA;AAEpC,IAAA,MAAM,MAAA,GAAS,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,GAAG,IAAI,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA,GAAI,IAAA;AAC5E,IAAA,MAAM,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,QAAA,EAAU,WAAW,IAAI,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA,GAAI,IAAA;AAC3F,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,KAAA,IAASA,KAAI,CAAA,EAAGA,EAAAA,GAAI,SAAA,CAAU,MAAA,EAAQA,MAAK,IAAA,EAAM;AAC/C,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAMA,EAAAA,EAAGA,KAAI,IAAI,CAAA;AACzC,MAAA,IAAI,KAAA,CAAM,WAAW,IAAA,EAAM;AACzB,QAAA,IAAA,CAAK,IAAA,CAAK,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA,GAAI,IAAI,CAAA;AAAA,MAC9D,WAAW,KAAA,CAAM,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,EAAM,CAAA,EAAG;AACpC,QAAA,OAAO,KAAA,CAAM,MAAA,GAAS,IAAA,EAAM,KAAA,CAAM,KAAK,GAAG,CAAA;AAC1C,QAAA,IAAA,CAAK,IAAA,CAAK,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA,GAAI,IAAI,CAAA;AAAA,MAC9D;AAAA,IACF;AACA,IAAA,OAAO,CAAC,MAAA,EAAQ,GAAA,EAAK,GAAG,IAAI,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,EACzC,CAAC,CAAA;AAGD,EAAA,CAAA,GAAI,CAAA,CAAE,OAAA;AAAA,IACJ,8CAAA;AAAA,IACA,CAAC,OAAO,QAAA,KAAa;AACnB,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,CAAC,CAAA,KAAc,CAAA,CAAE,IAAA,EAAM,CAAA;AAChE,MAAA,IAAI,KAAA,CAAM,MAAM,CAAC,CAAA,KAAc,wBAAwB,IAAA,CAAK,CAAC,CAAC,CAAA,EAAG,OAAO,KAAA;AACxE,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,GACF;AAGA,EAAA,CAAA,GAAI,CAAA,CAAE,OAAA;AAAA,IACJ,wDAAA;AAAA,IACA,CAAC,OAAO,UAAA,KAAe;AACrB,MAAA,MAAM,QAAQ,UAAA,CAAW,KAAA,CAAM,KAAK,CAAA,IAAK,EAAC,EAAG,MAAA;AAC7C,MAAA,IAAI,IAAA,GAAO,GAAG,OAAO,KAAA;AACrB,MAAA,OAAO,UAAA,GAAa,MAAA,GAAS,KAAA,CAAM,IAAI,CAAA,CAAE,KAAK,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,KAAA;AAAA,IACrE;AAAA,GACF;AAGA,EAAA,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,uBAAA,EAAyB,MAAM,CAAA;AAG7C,EAAA,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,iBAAA,EAAmB,EAAE,CAAA;AACnC,EAAA,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,yBAAA,EAA2B,EAAE,CAAA;AAC3C,EAAA,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA;AAC7B,EAAA,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,SAAA,EAAW,MAAM,CAAA;AAG/B,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,CAAM,IAAI,CAAA;AAC1B,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,MAAM,MAAA,EAAQ;AACvB,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,IAAK,EAAC,EAAG,MAAA,IAAU,CAAA,IAAK,CAAC,cAAA,CAAe,IAAI,CAAA,EAAG;AAClE,MAAA,MAAM,UAAA,GAAuB,CAAC,IAAI,CAAA;AAClC,MAAA,IAAI,YAAA,GAAe,KAAA;AACnB,MAAA,IAAI,IAAI,CAAA,GAAI,CAAA;AACZ,MAAA,OAAO,CAAA,GAAI,MAAM,MAAA,EAAQ;AACvB,QAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,QAAA,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,IAAK,IAAI,MAAA,IAAU,CAAA,IAAK,cAAA,CAAe,IAAI,CAAA,EAAG;AACjE,UAAA,IAAI,cAAA,CAAe,IAAI,CAAA,EAAG,YAAA,GAAe,IAAA;AACzC,UAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AACpB,UAAA,CAAA,EAAA;AAAA,QACF,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,EAAK,KAAM,EAAA,EAAI;AAC7B,UAAA,IAAI,CAAA,GAAI,CAAA,GAAI,KAAA,CAAM,MAAA,IAAA,CAAW,MAAM,CAAA,GAAI,CAAC,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,IAAK,EAAC,EAAG,UAAU,CAAA,EAAG;AACzE,YAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AACpB,YAAA,CAAA,EAAA;AAAA,UACF,CAAA,MAAO;AAAA,QACT,CAAA,MAAO;AAAA,MACT;AACA,MAAA,MAAM,UAAA,GAAA,CAAc,WAAW,CAAC,CAAA,CAAE,MAAM,KAAK,CAAA,IAAK,EAAC,EAAG,MAAA,GAAS,CAAA;AAE/D,MAAA,MAAM,WAAqB,EAAC;AAC5B,MAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,QAAA,IAAI,EAAA,CAAG,IAAA,EAAK,KAAM,EAAA,EAAI;AACtB,QAAA,IAAI,cAAA,CAAe,EAAE,CAAA,IAAK,UAAA,GAAa,CAAA,EAAG;AACxC,UAAA,QAAA,CAAS,KAAK,EAAE,CAAA;AAChB,UAAA;AAAA,QACF;AACA,QAAA,MAAM,YAAY,EAAA,CAAG,KAAA,CAAM,KAAK,CAAA,IAAK,IAAI,MAAA,GAAS,CAAA;AAClD,QAAA,IAAI,QAAA,GAAW,UAAA,IAAc,QAAA,IAAY,UAAA,GAAa,CAAA,EAAG;AACvD,UAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,KAAA,CAAM,GAAG,CAAA;AAC1B,UAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC/B,UAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,UAAA,EAAY;AACjD,YAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,IAAI,UAAU,CAAA;AAC3C,YAAA,IAAI,KAAA,CAAM,WAAW,UAAA,EAAY;AAC/B,cAAA,QAAA,CAAS,KAAK,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,GAAG,IAAI,GAAG,CAAA;AAAA,YAC3C,WAAW,KAAA,CAAM,IAAA,CAAK,UAAQ,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG;AAC1C,cAAA,OAAO,KAAA,CAAM,MAAA,GAAS,UAAA,EAAY,KAAA,CAAM,KAAK,GAAG,CAAA;AAChD,cAAA,QAAA,CAAS,KAAK,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,GAAG,IAAI,GAAG,CAAA;AAAA,YAC3C;AAAA,UACF;AAAA,QACF,CAAA,MAAO;AACL,UAAA,QAAA,CAAS,KAAK,EAAE,CAAA;AAAA,QAClB;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,YAAA,IAAgB,QAAA,CAAS,MAAA,IAAU,CAAA,IAAK,cAAc,CAAA,EAAG;AAC5D,QAAA,MAAM,GAAA,GAAM,GAAA,GAAM,KAAA,CAAM,UAAU,CAAA,CAAE,KAAK,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,GAAA;AAC9D,QAAA,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,EAAG,GAAG,CAAA;AAC5B,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,MAAA,EAAQ,KAAK,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,MACnE,CAAA,MAAA,IAAW,YAAA,IAAgB,UAAA,IAAc,CAAA,EAAG;AAC1C,QAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,UAAA,IAAI,cAAA,CAAe,EAAE,CAAA,EAAG;AACtB,YAAA,MAAM,WAAW,EAAA,CAAG,KAAA,CAAM,KAAK,CAAA,IAAK,IAAI,MAAA,GAAS,CAAA;AACjD,YAAA,MAAA,CAAO,IAAA,CAAK,OAAA,KAAY,UAAA,GACpB,GAAA,GAAM,MAAM,UAAU,CAAA,CAAE,IAAA,CAAK,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,MAClD,EAAE,CAAA;AAAA,UACR,CAAA,MAAO;AACL,YAAA,MAAA,CAAO,KAAK,EAAE,CAAA;AAAA,UAChB;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,QAAQ,CAAA;AAAA,MACzB;AACA,MAAA,CAAA,GAAI,CAAA;AAAA,IACN,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAChB,MAAA,CAAA,EAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,CAAA,GAAI,MAAA,CAAO,KAAK,IAAI,CAAA;AAGpB,EAAA,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,4CAAA,EAA8C,UAAU,CAAA;AAEtE,EAAA,OAAO,CAAA;AACT;AAQO,SAAS,wBAAwB,OAAA,EAAyB;AAC/D,EAAA,IAAI,CAAC,SAAS,OAAO,OAAA;AACrB,EAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAG,GAAG,OAAO,OAAA;AACnC,EAAA,IAAI,CAAC,qBAAA,CAAsB,IAAA,CAAK,OAAO,GAAG,OAAO,OAAA;AAEjD,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAChC,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACpC,IAAA,IAAI,CAAC,qBAAA,CAAsB,IAAA,CAAK,IAAI,GAAG,OAAO,IAAA;AAC9C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAY,QAAQ,CAAA;AACjD,IAAA,IAAI,OAAA,KAAY,MAAM,OAAO,IAAA;AAC7B,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AACrC,IAAA,IAAI,YAAY,CAAA,EAAG;AACjB,MAAA,MAAM,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,SAAS,EAAE,OAAA,EAAQ;AACjD,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,SAAS,CAAA;AACrC,MAAA,OAAO,IAAA,GAAO,GAAG,IAAI;;AAAA,EAAO,KAAK,CAAA,CAAA,GAAK,KAAA;AAAA,IACxC;AACA,IAAA,OAAO,OAAA;AAAA,EACT,CAAC,CAAA;AACD,EAAA,OAAO,SAAA,CAAU,KAAK,IAAI,CAAA;AAC5B;AAKO,SAAS,aAAa,IAAA,EAAsB;AACjD,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,IAAI,OAAA,GAAU,IAAA;AAGd,EAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,2CAAA,EAA6C,EAAE,CAAA;AAEzE,EAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,+CAAA,EAAiD,IAAI,CAAA;AAC/E,EAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,kCAAA,EAAoC,IAAI,CAAA;AAElE,EAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,gEAAA,EAAkE,EAAE,CAAA;AAE9F,EAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,6EAAA,EAA+E,EAAE,CAAA;AAE3G,EAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,+CAAA,EAAiD,EAAE,CAAA;AAE7E,EAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,4BAAA,EAA8B,CAAC,IAAA,KAAS;AAChE,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,IAAA;AAC/B,IAAA,MAAM,gBAAgB,IAAA,CAAK,KAAA,CAAM,kBAAkB,CAAA,IAAK,EAAC,EAAG,MAAA;AAC5D,IAAA,OAAO,YAAA,GAAe,IAAA,CAAK,MAAA,GAAS,IAAA,GAAO,EAAA,GAAK,IAAA;AAAA,EAClD,CAAC,CAAA;AAGD,EAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,6EAAA,EAA+E,EAAE,CAAA;AAC3G,EAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,4DAAA,EAA8D,EAAE,CAAA;AAC1F,EAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,qEAAA,EAAuE,EAAE,CAAA;AACnG,EAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,oCAAA,EAAsC,EAAE,CAAA;AAClE,EAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,wBAAA,EAA0B,EAAE,CAAA;AACtD,EAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,+BAAA,EAAiC,EAAE,CAAA;AAC7D,EAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,+BAAA,EAAiC,EAAE,CAAA;AAG7D,EAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,8IAAA,EAAgJ,EAAE,CAAA;AAC5K,EAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,4CAAA,EAA8C,EAAE,CAAA;AAC1E,EAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,2BAAA,EAA6B,EAAE,CAAA;AAGzD,EAAA,OAAA,GAAU,aAAa,OAAO,CAAA;AAG9B,EAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,SAAA,EAAW,QAAQ,CAAA;AAE7C,EAAA,OAAO,QAAQ,IAAA,EAAK;AACtB;AAKO,SAAS,kBAAkB,GAAA,EAIhC;AACA,EAAA,IAAI,GAAA,GAAM,GAAA;AACV,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,IAAI,cAAA,GAAiB,KAAA;AAGrB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,GAAA,GAAM,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,MAAA,IAAU,OAAO,OAAA,IAAW,GAAA;AAAA,EAC3D,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,IAAI,sFAAA,CAAuF,IAAA,CAAK,GAAG,CAAA,EAAG;AACpG,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,GAAA,GAAM,mDAAA;AAAA,EACR;AAGA,EAAA,IAAI,gEAAA,CAAiE,IAAA,CAAK,GAAG,CAAA,EAAG;AAC9E,IAAA,cAAA,GAAiB,IAAA;AACjB,IAAA,GAAA,GAAM,4DAAA;AAAA,EACR;AAGA,EAAA,IAAI,GAAA,CAAI,SAAS,GAAA,EAAK;AACpB,IAAA,GAAA,GAAM,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,GAAI,KAAA;AAAA,EAChC;AAEA,EAAA,OAAO,EAAE,OAAA,EAAS,GAAA,EAAK,MAAA,EAAQ,cAAA,EAAe;AAChD;AC5QO,IAAM,wBAAA,GAA2B;AAGxC,SAAS,0BAA0B,UAAA,EAAoB;AACrD,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,MAAA,CAAO,aAAA;AAAA,MACL,IAAI,YAAY,wBAAA,EAA0B,EAAE,QAAQ,EAAE,UAAA,IAAc;AAAA,KACtE;AAAA,EACF;AACF;AAEO,SAAS,aAAA,CACd,YACA,OAAA,EACwB;AACxB,EAAA,MAAM,EAAE,WAAA,EAAa,MAAA,EAAO,GAAI,YAAA,EAAa;AAE7C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAId,cAAAA,CAAc,EAAE,CAAA;AAClD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAS,CAAC,CAAA;AACpC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAS,CAAC,CAAA;AACpC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAGtD,EAAA,MAAM,UAAA,GAAae,aAAO,IAAI,CAAA;AAC9B,EAAAd,gBAAU,MAAM;AACd,IAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,IAAA,OAAO,MAAM;AAAE,MAAA,UAAA,CAAW,OAAA,GAAU,KAAA;AAAA,IAAO,CAAA;AAAA,EAC7C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAU,SAAS,OAAA,KAAY,KAAA;AAErC,EAAA,MAAM,SAAA,GAAYC,kBAAY,YAAY;AACxC,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,OAAA,EAAS;AAE9B,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,eAAA;AAAA,QACnB,WAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,UACE,QAAQ,OAAA,EAAS,MAAA;AAAA,UACjB,OAAO,OAAA,EAAS,KAAA;AAAA,UAChB,MAAM,OAAA,EAAS,IAAA;AAAA,UACf,MAAM,OAAA,EAAS,IAAA;AAAA,UACf,YAAY,OAAA,EAAS,UAAA;AAAA,UACrB,OAAO,OAAA,EAAS,KAAA;AAAA,UAChB,mBAAmB,OAAA,EAAS;AAAA,SAC9B;AAAA,QACA,EAAE,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,QAAA,EAAU,OAAO,QAAA;AAAS,OACvD;AAEA,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AAEzB,MAAA,IAAI,MAAA,CAAO,EAAA,IAAM,MAAA,CAAO,IAAA,EAAM;AAC5B,QAAA,YAAA,CAAa,MAAA,CAAO,KAAK,SAAS,CAAA;AAClC,QAAA,QAAA,CAAS,MAAA,CAAO,KAAK,KAAK,CAAA;AAC1B,QAAA,QAAA,CAAS,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,MAC5B,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,MAAA,CAAO,SAAS,4BAA4B,CAAA;AAAA,MACvD;AAAA,IACF,SAAS,GAAA,EAAU;AACjB,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,QAAA,CAAS,GAAA,CAAI,WAAW,eAAe,CAAA;AAAA,MACzC;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAA,EAAG;AAAA,IACD,WAAA;AAAA,IACA,MAAA,CAAO,OAAA;AAAA,IACP,MAAA,CAAO,QAAA;AAAA,IACP,UAAA;AAAA,IACA,OAAA;AAAA;AAAA,IAEA,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,MAAM,CAAA;AAAA,IAC9B,OAAA,EAAS,KAAA;AAAA,IACT,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAI,CAAA;AAAA,IAC5B,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,UAAU,CAAA;AAAA,IAClC,OAAA,EAAS;AAAA,GACV,CAAA;AAGD,EAAAD,gBAAU,MAAM;AACd,IAAA,SAAA,EAAU;AAAA,EACZ,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAGd,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS,eAAA,IAAmB,CAAC,OAAA,EAAS;AAC3C,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,SAAA,EAAW,OAAA,CAAQ,eAAe,CAAA;AAC/D,IAAA,OAAO,MAAM,cAAc,QAAQ,CAAA;AAAA,EACrC,GAAG,CAAC,SAAA,EAAW,OAAA,EAAS,eAAA,EAAiB,OAAO,CAAC,CAAA;AAGjD,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAS,sBAAA,EAAwB;AACtC,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAa;AAC5B,MAAA,MAAM,SAAU,CAAA,EAAmB,MAAA;AAEnC,MAAA,IAAI,CAAC,MAAA,EAAQ,UAAA,IAAc,MAAA,CAAO,eAAe,UAAA,EAAY;AAC3D,QAAA,SAAA,EAAU;AAAA,MACZ;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,0BAA0B,OAAO,CAAA;AACzD,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,wBAAA,EAA0B,OAAO,CAAA;AAAA,EAC3E,GAAG,CAAC,SAAA,EAAW,OAAA,EAAS,sBAAA,EAAwB,UAAU,CAAC,CAAA;AAI3D,EAAA,MAAM,MAAA,GAASC,iBAAAA,CAAY,OAAO,GAAA,KAAwE;AACxG,IAAA,IAAI,CAAC,WAAA,EAAa,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAErD,IAAA,MAAM,SAAS,MAAM,eAAA;AAAA,MACnB,WAAA;AAAA,MACA,UAAA;AAAA,MACA,GAAA;AAAA,MACA,EAAE,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,QAAA,EAAU,OAAO,QAAA,EAAS;AAAA,MACrD,OAAA,EAAS;AAAA,KACX;AAEA,IAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,eAAe,CAAA;AAAA,IACjD;AAGA,IAAA,yBAAA,CAA0B,UAAU,CAAA;AACpC,IAAA,MAAM,SAAA,EAAU;AAEhB,IAAA,OAAO,EAAE,YAAA,EAAc,MAAA,CAAO,IAAA,CAAM,YAAA,EAAa;AAAA,EACnD,CAAA,EAAG,CAAC,WAAA,EAAa,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,QAAA,EAAU,UAAA,EAAY,SAAA,EAAW,OAAA,EAAS,KAAK,CAAC,CAAA;AAExF,EAAA,MAAM,MAAA,GAASA,iBAAAA,CAAY,OACzB,MAAA,EACA,YACA,IAAA,KACwC;AACxC,IAAA,IAAI,CAAC,WAAA,EAAa,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAErD,IAAA,MAAM,SAAS,MAAM,eAAA;AAAA,MACnB,WAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,IAAA;AAAA,MACA,EAAE,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,QAAA,EAAU,OAAO,QAAA,EAAS;AAAA,MACrD,OAAA,EAAS;AAAA,KACX;AAEA,IAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,eAAe,CAAA;AAAA,IACjD;AAEA,IAAA,yBAAA,CAA0B,UAAU,CAAA;AACpC,IAAA,MAAM,SAAA,EAAU;AAEhB,IAAA,OAAO,EAAE,cAAA,EAAgB,MAAA,CAAO,IAAA,CAAM,cAAA,EAAe;AAAA,EACvD,CAAA,EAAG,CAAC,WAAA,EAAa,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,QAAA,EAAU,UAAA,EAAY,SAAA,EAAW,OAAA,EAAS,KAAK,CAAC,CAAA;AAExF,EAAA,MAAM,MAAA,GAASA,iBAAAA,CAAY,OAAO,MAAA,KAAoE;AACpG,IAAA,IAAI,CAAC,WAAA,EAAa,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAErD,IAAA,MAAM,SAAS,MAAM,eAAA;AAAA,MACnB,WAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,EAAE,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,QAAA,EAAU,OAAO,QAAA,EAAS;AAAA,MACrD,OAAA,EAAS;AAAA,KACX;AAEA,IAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,eAAe,CAAA;AAAA,IACjD;AAEA,IAAA,yBAAA,CAA0B,UAAU,CAAA;AACpC,IAAA,MAAM,SAAA,EAAU;AAEhB,IAAA,OAAO,EAAE,aAAA,EAAe,MAAA,CAAO,IAAA,CAAM,aAAA,EAAc;AAAA,EACrD,CAAA,EAAG,CAAC,WAAA,EAAa,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,QAAA,EAAU,UAAA,EAAY,SAAA,EAAW,OAAA,EAAS,KAAK,CAAC,CAAA;AAExF,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA,EAAS,SAAA;AAAA,IACT,MAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACtOA,IAAM,sBAAA,uBAA6B,GAAA,CAAY;AAAA,EAC7C,kBAAA;AAAA,EACA,kBAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA;AAAA,EAEA,gBAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAC,CAAA;AAUD,IAAM,uBAAA,GAAkD;AAAA,EACtD,cAAA,EAAgB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,sDAAA,CAAA;AAAA,EAQhB,WAAA,EAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,4CAAA,CAAA;AAAA,EAQb,SAAA,EAAW,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,gDAAA,CAAA;AAAA,EAQX,QAAA,EAAU;AACZ,CAAA;AAeA,IAAI,qBAAA,GAAiD,IAAA;AAKrD,SAAS,UAAA,GAAqB;AAC5B,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACjE;AAKA,SAAS,gBAAgB,MAAA,EAAwB;AAC/C,EAAA,MAAM,WAAA,GAAc,OAAO,WAAA,EAAY;AAEvC,EAAA,IAAI,YAAY,QAAA,CAAS,UAAU,KAAK,WAAA,CAAY,QAAA,CAAS,SAAS,CAAA,EAAG;AACvE,IAAA,OAAO,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA,4DAAA,CAAA;AAAA,EAaT;AAEA,EAAA,IAAI,YAAY,QAAA,CAAS,SAAS,KAAK,WAAA,CAAY,QAAA,CAAS,UAAU,CAAA,EAAG;AACvE,IAAA,OAAO,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA,wDAAA,CAAA;AAAA,EAaT;AAEA,EAAA,IAAI,WAAA,CAAY,QAAA,CAAS,OAAO,CAAA,IAAK,WAAA,CAAY,QAAA,CAAS,QAAQ,CAAA,IAAK,WAAA,CAAY,QAAA,CAAS,MAAM,CAAA,EAAG;AACnG,IAAA,OAAO,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA,kEAAA,CAAA;AAAA,EAUT;AAGA,EAAA,OAAO,sCAAsC,MAAM,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA,8CAAA,CAAA;AAarD;AAOA,SAAS,iBAAiB,GAAA,EAAqE;AAC7F,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAC5B,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA;AAC1C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,CAAA,EAAA,EAAK,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,CAAC,CAAA;AACtE,EAAA,OAAO,IAAI,IAAA,CAAK,CAAC,KAAK,CAAA,EAAG,GAAA,CAAI,QAAA,EAAU,EAAE,IAAA,EAAM,GAAA,CAAI,YAAA,EAAc,CAAA;AACnE;AAWA,IAAM,YAAA,uBAAmB,GAAA,CAAI;AAAA,EAC3B,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,SAAA;AAAA,EAAW,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,IAAA;AAAA,EAAM,MAAA;AAAA,EAAQ;AACjF,CAAC,CAAA;AAED,SAAS,SAAS,QAAA,EAA0B;AAC1C,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA;AAClC,EAAA,OAAO,CAAA,KAAM,KAAK,EAAA,GAAK,QAAA,CAAS,MAAM,CAAA,GAAI,CAAC,EAAE,WAAA,EAAY;AAC3D;AAYO,SAAS,QAAA,CAAS,QAAA,GAA0B,cAAA,EAAgB,OAAA,EAA2C;AAC5G,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA,EAAe,YAAA;AAAA,IACf,iBAAA;AAAA,IACA,iBAAA;AAAA,IACA,gBAAA;AAAA,IACA,eAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,MACE,YAAA,EAAa;AAEjB,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIF,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,cAAAA,CAAqB,EAAE,CAAA;AACzD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,eAAiC,IAAI,CAAA;AACvF,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAIA,cAAAA,CAAgC,EAAE,CAAA;AAE1F,EAAA,MAAM,kBAAA,GAAqBe,aAA+B,IAAI,CAAA;AAC9D,EAAA,MAAM,mBAAA,GAAsBA,aAAsB,IAAI,CAAA;AACtD,EAAA,MAAM,gBAAA,GAAmBA,aAAsB,IAAI,CAAA;AAGnD,EAAA,MAAM,kBAAA,GAAqBA,aAAgB,KAAK,CAAA;AAQhD,EAAA,MAAM,iBAAA,GAAoB,CAAA,qBAAA,EAAwB,MAAA,CAAO,QAAA,IAAY,SAAS,CAAA,EAC5E,OAAA,EAAS,UAAA,GAAa,CAAA,CAAA,EAAI,OAAA,CAAQ,UAAU,CAAA,CAAA,GAAK,EACnD,CAAA,CAAA;AACA,EAAA,MAAM,YAAA,GAAeA,YAAAA;AAAA,IACnB,OAAO,MAAA,KAAW,WAAA,GAAc,cAAA,CAAe,OAAA,CAAQ,iBAAiB,CAAA,GAAI;AAAA,GAC9E;AAEA,EAAA,MAAM,YAAA,GAAeL,cAAQ,OAAO;AAAA,IAClC,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,UAAU,MAAA,CAAO;AAAA,MACf,CAAC,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,QAAQ,CAAC,CAAA;AAErC,EAAA,MAAM,UAAA,GAAa,OAAO,IAAA,KAAS,MAAA;AAKnC,EAAA,MAAM,KAAA,GAAQR,iBAAAA,CAAY,OAAO,MAAA,EAAgB,aAAiC,YAAA,KAA2C;AAC3H,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAA,CAAQ,KAAK,gDAAgD,CAAA;AAC7D,MAAA;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,UAAA,EAAY;AAC/B,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAC5B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,iBAAA,IAAqB,CAAC,UAAA,EAAY;AAErC,MAAA,gBAAA,CAAiB,OAAA,GAAU,MAAA;AAC3B,MAAA;AAAA,IACF;AAQA,IAAA,IAAI,WAAA,GAAc,MAAA;AAClB,IAAA,IAAI,eAAA;AACJ,IAAA,IAAI,eAAe,WAAA,CAAY,MAAA,GAAS,KAAK,CAAC,UAAA,IAAc,eAAe,iBAAA,EAAmB;AAC5F,MAAA,MAAM,WAAqB,EAAC;AAC5B,MAAA,MAAM,eAAyB,EAAC;AAChC,MAAA,MAAM,gBAA0B,EAAC;AACjC,MAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,QAAA,MAAM,IAAA,GAAO,GAAA,YAAe,IAAA,GAAO,GAAA,GAAM,iBAAiB,GAAG,CAAA;AAC7D,QAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAC9B,QAAA,MAAM,SAAA,GAAY,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AACtC,QAAA,MAAM,GAAA,GAAM,YACR,MAAM,UAAA,CAAW,aAAa,iBAAA,CAAkB,WAAA,EAAa,MAAM,IAAA,CAAK,IAAA,EAAM,YAAY,CAAA,GAC1F,MAAM,eAAe,WAAA,EAAa,iBAAA,CAAkB,aAAa,IAAA,EAAM,IAAA,CAAK,MAAM,YAAY,CAAA;AAClG,QAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,UAAA,QAAA,CAAS,oBAAoB,IAAA,CAAK,IAAI,KAAK,GAAA,CAAI,KAAA,IAAS,eAAe,CAAA,CAAE,CAAA;AACzE,UAAA;AAAA,QACF;AACA,QAAA,MAAM,YAAA,GAAe,SAAA,GACf,GAAA,CAAI,IAAA,EAAc,SAAS,IAAA,IAAS,GAAA,CAAI,IAAA,EAAc,MAAA,EAAQ,QAAQ,IAAA,CAAK,IAAA,GAC3E,GAAA,CAAI,IAAA,EAAc,iBAAiB,IAAA,CAAK,IAAA;AAC9C,QAAA,QAAA,CAAS,KAAK,YAAY,CAAA;AAC1B,QAAA,CAAC,SAAA,GAAY,YAAA,GAAe,aAAA,EAAe,IAAA,CAAK,YAAY,CAAA;AAAA,MAC9D;AACA,MAAA,eAAA,GAAkB,QAAA;AAOlB,MAAA,MAAM,QAAkB,EAAC;AACzB,MAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,YAAA,CAAa,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAA,EAAK,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,4DAAA,CAAyD,CAAA;AAAA,MACxJ;AACA,MAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqB,aAAA,CAAc,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAA,EAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA,+CAAA,CAA4C,CAAA;AAAA,MAC9I;AACA,MAAA,WAAA,GAAc,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC;AAAA,EAAK,MAAM,CAAA,CAAA;AAG5C,MAAA,IAAI;AAAE,QAAA,MAAM,eAAA,IAAkB;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IAC5C;AAIA,IAAA,MAAM,WAAA,GAA2B;AAAA,MAC/B,IAAI,UAAA,EAAW;AAAA,MACf,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,MAAA;AAAA,MACT,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB;AAAA,KACF;AACA,IAAA,UAAA,CAAW,WAAW,CAAA;AACtB,IAAA,MAAM,gBAAgB,WAAA,CAAY,EAAA;AAGlC,IAAA,MAAM,cAAc,UAAA,EAAW;AAC/B,IAAA,mBAAA,CAAoB,OAAA,GAAU,WAAA;AAC9B,IAAA,MAAM,gBAAA,GAAgC;AAAA,MACpC,EAAA,EAAI,WAAA;AAAA,MACJ,IAAA,EAAM,WAAA;AAAA,MACN,OAAA,EAAS,EAAA;AAAA,MACT,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,WAAA,EAAa,IAAA;AAAA,MACb,WAAW,EAAC;AAAA,MACZ,gBAAgB;AAAC,KACnB;AACA,IAAA,UAAA,CAAW,gBAAgB,CAAA;AAG3B,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,IAAA,iBAAA,CAAkB,IAAA,CAAK,KAAK,CAAA;AAC5B,IAAA,YAAA,CAAa,EAAE,CAAA;AAIf,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAI,OAAO,eAAA,EAAiB;AAE1B,QAAA,kBAAA,CAAmB,OAAA,GAAU,IAAI,eAAA,EAAgB;AACjD,QAAA,IAAIc,YAAAA,GAAc,EAAA;AAElB,QAAA,IAAI;AAEF,UAAA,IAAI,CAAC,qBAAA,EAAuB;AAC1B,YAAA,MAAM,eAAe,MAAM,KAAA,CAAM,CAAA,EAAG,MAAA,CAAO,eAAe,CAAA,sBAAA,CAAA,EAA0B;AAAA,cAClF,MAAA,EAAQ,MAAA;AAAA,cACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,cAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,gBACnB,QAAA,EAAU,QAAA,IAAY,MAAA,CAAO,aAAA,IAAiB,cAAA;AAAA,gBAC9C,UAAA,EAAY,CAAA,EAAG,QAAA,IAAY,MAAA,CAAO,iBAAiB,cAAc,CAAA,MAAA,CAAA;AAAA,gBACjE,YAAA,EAAc,wBAAwB,QAAA,IAAY,MAAA,CAAO,iBAAiB,cAAc,CAAA,IAAK,wBAAwB,QAAQ,CAAA;AAAA,gBAC7H,KAAA,EAAO;AAAA,eACR;AAAA,aACF,CAAA;AAED,YAAA,IAAI,CAAC,aAAa,EAAA,EAAI;AACpB,cAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,YAAA,CAAa,MAAM,CAAA,CAAE,CAAA;AAAA,YACjE;AAEA,YAAA,MAAM,aAAA,GAAgB,MAAM,YAAA,CAAa,IAAA,EAAK;AAC9C,YAAA,qBAAA,GAAwB;AAAA,cACtB,SAAS,aAAA,CAAc,OAAA;AAAA,cACvB,WAAW,aAAA,CAAc;AAAA,aAC3B;AAAA,UACF;AAGA,UAAA,MAAM,UAAU,MAAM,KAAA,CAAM,CAAA,EAAG,MAAA,CAAO,eAAe,CAAA,YAAA,CAAA,EAAgB;AAAA,YACnE,MAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS;AAAA,cACP,eAAA,EAAiB,CAAA,OAAA,EAAU,qBAAA,CAAsB,OAAO,CAAA,CAAA;AAAA,cACxD,cAAA,EAAgB;AAAA,aAClB;AAAA,YACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,cACnB,OAAA,EAAS,MAAA;AAAA,cACT,WAAW,qBAAA,CAAsB;AAAA,aAClC,CAAA;AAAA,YACD,MAAA,EAAQ,mBAAmB,OAAA,CAAQ;AAAA,WACpC,CAAA;AAED,UAAA,IAAI,CAAC,QAAQ,EAAA,EAAI;AACf,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,OAAA,CAAQ,MAAM,CAAA,CAAE,CAAA;AAAA,UACxD;AAEA,UAAA,IAAI,CAAC,QAAQ,IAAA,EAAM;AACjB,YAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,UACvD;AAEA,UAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,SAAA,EAAU;AAKtC,UAAA,WAAA,MAAiB,KAAA,IAAS,cAAA,CAAe,MAAM,CAAA,EAAG;AAChD,YAAA,IAAI,kBAAA,CAAmB,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS;AAEhD,YAAA,QAAQ,MAAM,IAAA;AAAM,cAClB,KAAK,MAAA;AAAA,cACL,KAAK,SAAA;AAAA,cACL,KAAK,OAAA;AACH,gBAAA,IAAI,MAAM,OAAA,EAAS;AACjB,kBAAAA,gBAAe,KAAA,CAAM,OAAA;AACrB,kBAAA,aAAA,CAAc,WAAA,EAAa,EAAE,OAAA,EAASA,YAAAA,EAAa,CAAA;AAAA,gBACrD;AACA,gBAAA;AAAA,cAEF,KAAK,OAAA;AACH,gBAAA,QAAA,CAAS,KAAA,CAAM,SAAS,oBAAoB,CAAA;AAC5C,gBAAA;AAAA,cAEF,KAAK,MAAA;AAAA,cACL,KAAK,UAAA,EAAY;AAEf,gBAAA,MAAM,eAAe,KAAA,CAAM,IAAA;AAC3B,gBAAA,IAAI,cAAc,SAAA,EAAW;AAC3B,kBAAA,qBAAA,CAAuB,YAAY,YAAA,CAAa,SAAA;AAAA,gBAClD;AACA,gBAAA;AAAA,cACF;AAAA;AACF,UACF;AAEA,UAAA,aAAA,CAAc,WAAA,EAAa;AAAA,YACzB,OAAA,EAASA,YAAAA;AAAA,YACT,WAAA,EAAa;AAAA,WACd,CAAA;AAAA,QACH,SAAS,GAAA,EAAK;AAEZ,UAAA,MAAM,YAAA,GAAe,eAAe,SAAA,IAAc,GAAA,YAAe,SAAS,GAAA,CAAI,OAAA,CAAQ,SAAS,OAAO,CAAA;AACtG,UAAA,IAAI,YAAA,EAAc;AAChB,YAAA,OAAA,CAAQ,KAAK,sEAAsE,CAAA;AACnF,YAAA,MAAM,YAAA,GAAe,gBAAgB,MAAM,CAAA;AAC3C,YAAA,aAAA,CAAc,WAAA,EAAa;AAAA,cACzB,OAAA,EAAS,YAAA;AAAA,cACT,WAAA,EAAa;AAAA,aACd,CAAA;AAAA,UACH,CAAA,MAAO;AACL,YAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,oBAAA;AACrD,YAAA,QAAA,CAAS,OAAO,CAAA;AAChB,YAAA,aAAA,CAAc,WAAA,EAAa;AAAA,cACzB,OAAA,EAASA,YAAAA,IAAe,CAAA,OAAA,EAAU,OAAO,CAAA,CAAA;AAAA,cACzC,WAAA,EAAa;AAAA,aACd,CAAA;AAAA,UACH;AAAA,QACF,CAAA,SAAE;AACA,UAAA,cAAA,CAAe,KAAK,CAAA;AACpB,UAAA,YAAA,CAAa,KAAK,CAAA;AAClB,UAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,UAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,UAAA,mBAAA,CAAoB,OAAA,GAAU,IAAA;AAC9B,UAAA,kBAAA,CAAmB,OAAA,GAAU,IAAA;AAAA,QAC/B;AACA,QAAA;AAAA,MACF;AAGA,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,CAAU,KAAK,GAAI,CAAA;AAEzB,QAAA,MAAM,YAAA,GAAe,gBAAgB,MAAM,CAAA;AAC3C,QAAA,IAAI,eAAA,GAAkB,EAAA;AAEtB,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,MAAA,EAAQ,KAAK,CAAA,EAAG;AAC/C,UAAA,IAAI,kBAAA,CAAmB,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS;AAChD,UAAA,eAAA,IAAmB,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AAC9C,UAAA,aAAA,CAAc,WAAA,EAAa,EAAE,OAAA,EAAS,eAAA,EAAiB,CAAA;AACvD,UAAA,MAAM,SAAA,CAAU,IAAI,EAAE,CAAA;AAAA,QACxB;AAEA,QAAA,aAAA,CAAc,WAAA,EAAa;AAAA,UACzB,OAAA,EAAS,YAAA;AAAA,UACT,WAAA,EAAa;AAAA,SACd,CAAA;AAAA,MACH,CAAA,SAAE;AACA,QAAA,cAAA,CAAe,KAAK,CAAA;AACpB,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,QAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,QAAA,mBAAA,CAAoB,OAAA,GAAU,IAAA;AAAA,MAChC;AACA,MAAA;AAAA,IACF;AAGA,IAAA,kBAAA,CAAmB,OAAA,GAAU,IAAI,eAAA,EAAgB;AAGjD,IAAA,IAAI,WAAA,GAAc,EAAA;AAElB,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,MAAA,CAAO,aAAA,KAAkB,WAAA,GAAc,QAAA,GAAW,SAAA;AACtE,MAAA,MAAM,WAAW,MAAM,sBAAA;AAAA,QACrB,WAAA;AAAA,QACA,WAAA;AAAA,QACA,iBAAA,CAAmB,WAAA;AAAA,QACnB;AAAA,UACE,WAAA;AAAA,UACA,OAAO,OAAA,EAAS,KAAA;AAAA,UAChB,cAAc,OAAA,EAAS,YAAA;AAAA,UACvB,SAAA,EAAW,aAAa,OAAA,IAAW,KAAA,CAAA;AAAA,UACnC,eAAA,EAAiB,mBAAmB,OAAA,IAAW,KAAA,CAAA;AAAA,UAC/C,YAAA;AAAA;AAAA,UAEA,cAAc,OAAA,EAAS,YAAA;AAAA;AAAA;AAAA,UAGvB,OAAA,EAAS,OAAA,EAAS,OAAA,IAAW,OAAA,EAAS;AAAA,SACxC;AAAA,QACA;AAAA,OACF;AAEA,MAAA,IAAI,CAAC,SAAS,IAAA,EAAM;AAClB,QAAA,MAAM,IAAI,MAAM,kBAAkB,CAAA;AAAA,MACpC;AAEA,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,SAAA,EAAU;AACvC,MAAA,MAAM,mBAA+B,EAAC;AACtC,MAAA,MAAM,wBAA6C,EAAC;AAqBpD,MAAA,WAAA,MAAiB,KAAA,IAAS,cAAA,CAAe,MAAM,CAAA,EAAG;AAEhD,QAAA,IAAI,kBAAA,CAAmB,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS;AAC9C,UAAA;AAAA,QACF;AAEA,QAAA,QAAQ,MAAM,IAAA;AAAM;AAAA;AAAA;AAAA,UAIlB,KAAK,UAAA,EAAY;AACf,YAAA,MAAM,WAAW,KAAA,CAAM,IAAA;AACvB,YAAA,IAAI,QAAA,EAAU,UAAA,IAAc,OAAO,QAAA,CAAS,eAAe,QAAA,EAAU;AAGnE,cAAA,YAAA,CAAa,UAAU,QAAA,CAAS,UAAA;AAChC,cAAA,kBAAA,CAAmB,OAAA,GAAU,KAAA;AAC7B,cAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,gBAAA,cAAA,CAAe,OAAA,CAAQ,iBAAA,EAAmB,QAAA,CAAS,UAAU,CAAA;AAAA,cAC/D;AAAA,YACF;AACA,YAAA,IAAI,UAAU,YAAA,IAAgB,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,YAAY,CAAA,EAAG;AAClE,cAAA,uBAAA,CAAwB,SAAS,YAAqC,CAAA;AAAA,YACxE;AAEA,YAAA,IAAI,QAAA,EAAU,YAAA,IAAgB,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,YAAY,CAAA,IAAK,QAAA,CAAS,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AACtG,cAAA,aAAA,CAAc,aAAA,EAAe;AAAA,gBAC3B,aAAa,QAAA,CAAS;AAAA,eACvB,CAAA;AAAA,YACH;AACA,YAAA;AAAA,UACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAOA,KAAK,MAAA;AAAA,UACL,KAAK,SAAA;AAAA,UACL,KAAK,OAAA;AACH,YAAA,IAAI,MAAM,OAAA,EAAS;AAEjB,cAAA,IAAI,UAAA,CAAW,KAAA,CAAM,OAAO,CAAA,EAAG;AAC7B,gBAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,KAAA,CAAM,OAAO,CAAA;AAChD,gBAAA,IAAI,OAAA,EAAS;AACX,kBAAA,aAAA,CAAc,WAAA,EAAa,EAAE,UAAA,EAAY,OAAA,EAAS,CAAA;AAAA,gBACpD;AACA,gBAAA;AAAA,cACF;AAMA,cAAA,WAAA,IAAe,KAAA,CAAM,OAAA;AACrB,cAAA,MAAM,cAAA,GAAiB,wBAAwB,WAAW,CAAA;AAC1D,cAAA,aAAA,CAAc,aAAa,EAAE,OAAA,EAAS,cAAA,EAAgB,UAAA,EAAY,QAAW,CAAA;AAAA,YAC/E;AACA,YAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAMF,KAAK,WAAA;AAAA,UACL,KAAK,UAAA;AACH,YAAA,IAAI,MAAM,IAAA,EAAM;AAId,cAAA,MAAM,iBAAiB,gBAAA,CAAiB,IAAA;AAAA,gBACtC,QAAM,EAAA,CAAG,IAAA,KAAS,KAAA,CAAM,IAAA,IAAQ,GAAG,MAAA,KAAW;AAAA,eAChD;AACA,cAAA,IAAI,cAAA,EAAgB;AAEpB,cAAA,MAAM,QAAA,GAAqB;AAAA,gBACzB,IAAI,UAAA,EAAW;AAAA,gBACf,SAAA,EAAW,MAAM,IAAA,EAAM,WAAA;AAAA,gBACvB,MAAM,KAAA,CAAM,IAAA;AAAA,gBACZ,MAAM,KAAA,CAAM,IAAA;AAAA,gBACZ,MAAA,EAAQ,SAAA;AAAA,gBACR,SAAA,EAAW,KAAK,GAAA;AAAI,eACtB;AACA,cAAA,gBAAA,CAAiB,KAAK,QAAQ,CAAA;AAC9B,cAAA,YAAA,CAAa,CAAC,GAAG,gBAAgB,CAAC,CAAA;AAClC,cAAA,aAAA,CAAc,aAAa,EAAE,SAAA,EAAW,CAAC,GAAG,gBAAgB,GAAG,CAAA;AAAA,YACjE;AACA,YAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAOF,KAAK,aAAA;AACH,YAAA,IAAI,MAAM,IAAA,IAAQ,KAAA,CAAM,SAAA,IAAa,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAEhE,cAAA,IAAI,SAAA,GAAY,CAAA,CAAA;AAChB,cAAA,IAAI,MAAM,SAAA,EAAW;AACnB,gBAAA,SAAA,GAAY,iBAAiB,SAAA,CAAU,CAAA,EAAA,KAAM,EAAA,CAAG,SAAA,KAAc,MAAM,SAAS,CAAA;AAAA,cAC/E;AACA,cAAA,IAAI,SAAA,GAAY,CAAA,IAAK,KAAA,CAAM,IAAA,EAAM;AAC/B,gBAAA,SAAA,GAAY,gBAAA,CAAiB,UAAU,CAAA,EAAA,KAAM,EAAA,CAAG,SAAS,KAAA,CAAM,IAAA,IAAQ,EAAA,CAAG,MAAA,KAAW,SAAS,CAAA;AAAA,cAChG;AACA,cAAA,IAAI,YAAY,CAAA,EAAG;AACjB,gBAAA,SAAA,GAAY,gBAAA,CAAiB,SAAA,CAAU,CAAA,EAAA,KAAM,EAAA,CAAG,WAAW,SAAS,CAAA;AAAA,cACtE;AACA,cAAA,IAAI,aAAa,CAAA,EAAG;AAClB,gBAAA,MAAM,aAAA,GAAgB,iBAAiB,SAAS,CAAA;AAChD,gBAAA,gBAAA,CAAiB,SAAS,CAAA,GAAI;AAAA,kBAC5B,GAAG,aAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAMH,MAAA,EAAQ,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,MAAA;AAAA;AAAA;AAAA,kBAG/B,MAAA,EAAQ,KAAA,CAAM,OAAA,GAAU,OAAA,GAAU,UAAA;AAAA,kBAClC,OAAA,EAAS,KAAK,GAAA;AAAI,iBACpB;AACA,gBAAA,YAAA,CAAa,CAAC,GAAG,gBAAgB,CAAC,CAAA;AAClC,gBAAA,aAAA,CAAc,aAAa,EAAE,SAAA,EAAW,CAAC,GAAG,gBAAgB,GAAG,CAAA;AAM/D,gBAAA,MAAM,QAAA,GAAW,cAAc,IAAA,IAAQ,EAAA;AACvC,gBAAA,IAAI,uBAAuB,GAAA,CAAI,QAAQ,CAAA,IAAK,CAAC,MAAM,OAAA,EAAS;AAC1D,kBAAA,MAAA,CAAO,aAAA,CAAc,IAAI,WAAA,CAAY,wBAAA,EAA0B;AAAA,oBAC7D,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA;AAAS,mBAC1B,CAAC,CAAA;AAAA,gBACJ;AAAA,cACF;AAAA,YACF;AACA,YAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAMF,KAAK,UAAA;AACH,YAAA,IAAI,MAAM,OAAA,EAAS;AAEjB,cAAA,MAAM,eAAe,KAAA,CAAM,IAAA;AAC3B,cAAA,IAAI,YAAA,EAAc,iBAAiB,WAAA,EAAa;AAGhD,cAAA,IAAI,UAAA,CAAW,KAAA,CAAM,OAAO,CAAA,EAAG;AAC7B,gBAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,KAAA,CAAM,OAAA,EAAS,MAAM,IAAI,CAAA;AAC5D,gBAAA,IAAI,OAAA,EAAS;AACX,kBAAA,aAAA,CAAc,WAAA,EAAa,EAAE,UAAA,EAAY,OAAA,EAAS,CAAA;AAAA,gBACpD;AACA,gBAAA;AAAA,cACF;AAMA,cAAA,aAAA,CAAc,WAAA,EAAa;AAAA,gBACzB,YAAY,KAAA,CAAM,IAAA,GACd,GAAG,KAAA,CAAM,IAAI,KAAK,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA,GAChD,MAAM,OAAA,CAAQ,SAAA,CAAU,GAAG,GAAG;AAAA,eACnC,CAAA;AAID,cAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,gBAAA,IAAI,GAAA,GAAM,CAAA,CAAA;AACV,gBAAA,IAAI,MAAM,IAAA,EAAM;AACd,kBAAA,KAAA,IAAS,IAAI,gBAAA,CAAiB,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACrD,oBAAA,IAAI,gBAAA,CAAiB,CAAC,CAAA,CAAE,IAAA,KAAS,MAAM,IAAA,EAAM;AAAE,sBAAA,GAAA,GAAM,CAAA;AAAG,sBAAA;AAAA,oBAAO;AAAA,kBACjE;AAAA,gBACF;AACA,gBAAA,IAAI,MAAM,CAAA,EAAG;AACX,kBAAA,KAAA,IAAS,IAAI,gBAAA,CAAiB,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACrD,oBAAA,IAAI,gBAAA,CAAiB,CAAC,CAAA,CAAE,MAAA,KAAW,SAAA,EAAW;AAAE,sBAAA,GAAA,GAAM,CAAA;AAAG,sBAAA;AAAA,oBAAO;AAAA,kBAClE;AAAA,gBACF;AACA,gBAAA,IAAI,OAAO,CAAA,EAAG;AACZ,kBAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,GAAG,CAAA,CAAE,aAAA,IAAiB,EAAA;AACpD,kBAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,CAAC,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,IAAK,CAAC,IAAA,CAAK,QAAA,CAAS,IAAI,IAAI,GAAA,GAAM,EAAA;AACnF,kBAAA,gBAAA,CAAiB,GAAG,CAAA,GAAI;AAAA,oBACtB,GAAG,iBAAiB,GAAG,CAAA;AAAA,oBACvB,aAAA,EAAe,IAAA,GAAO,GAAA,GAAM,KAAA,CAAM;AAAA,mBACpC;AACA,kBAAA,YAAA,CAAa,CAAC,GAAG,gBAAgB,CAAC,CAAA;AAClC,kBAAA,aAAA,CAAc,aAAa,EAAE,SAAA,EAAW,CAAC,GAAG,gBAAgB,GAAG,CAAA;AAAA,gBACjE;AAAA,cACF;AAAA,YACF;AACA,YAAA;AAAA;AAAA,UAGF,KAAK,eAAA;AACH,YAAA,IAAI,MAAM,IAAA,EAAM;AACd,cAAA,MAAM,MAAM,KAAA,CAAM,IAAA;AAClB,cAAA,qBAAA,CAAsB,KAAK,GAAG,CAAA;AAC9B,cAAA,gBAAA,CAAiB,GAAG,CAAA;AACpB,cAAA,aAAA,CAAc,aAAa,EAAE,cAAA,EAAgB,CAAC,GAAG,qBAAqB,GAAG,CAAA;AAAA,YAC3E;AACA,YAAA;AAAA;AAAA,UAGF,KAAK,WAAA;AACH,YAAA,IAAI,MAAM,IAAA,EAAM;AACd,cAAA,oBAAA,CAAqB,CAAC,KAAA,CAAM,IAAqB,CAAC,CAAA;AAAA,YACpD;AACA,YAAA;AAAA;AAAA,UAGF,KAAK,OAAA,EAAS;AACZ,YAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,KAAA,CAAM,KAAA,IAAS,cAAc,CAAA;AAC9D,YAAA,QAAA,CAAS,OAAO,OAAO,CAAA;AACvB,YAAA;AAAA,UACF;AAAA;AAAA;AAAA;AAAA,UAKA,KAAK,MAAA;AAAA,UACL,KAAK,UAAA,EAAY;AACf,YAAA,MAAM,eAAe,KAAA,CAAM,IAAA;AAC3B,YAAA,IAAI,YAAA,EAAc,gBAAgB,WAAA,EAAa;AAAA,YAE/C;AACA,YAAA;AAAA,UACF;AAAA;AACF,MACF;AAGA,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,gBAAA,CAAiB,QAAQ,CAAA,EAAA,EAAK;AAChD,QAAA,IAAI,gBAAA,CAAiB,CAAC,CAAA,CAAE,MAAA,KAAW,SAAA,EAAW;AAC5C,UAAA,gBAAA,CAAiB,CAAC,CAAA,GAAI,EAAE,GAAG,gBAAA,CAAiB,CAAC,CAAA,EAAG,MAAA,EAAQ,UAAA,EAAY,OAAA,EAAS,GAAA,EAAI;AAAA,QACnF;AAAA,MACF;AAMA,MAAA,MAAM,cAAA,GAAiB,aAAa,WAAW,CAAA;AAG/C,MAAA,aAAA,CAAc,WAAA,EAAa;AAAA,QACzB,OAAA,EAAS,cAAA;AAAA,QACT,WAAA,EAAa,KAAA;AAAA,QACb,SAAA,EAAW,gBAAA;AAAA,QACX,cAAA,EAAgB,qBAAA;AAAA,QAChB,UAAA,EAAY,KAAA;AAAA,OACb,CAAA;AAGD,MAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,QAAA,MAAM,QAAQ,GAAA,CAAI;AAAA,UAChB,eAAA,EAAgB;AAAA,UAChB,qBAAA;AAAsB,SACvB,CAAA;AAAA,MACH;AAAA,IAEF,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,GAAA,GAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,cAAA;AACjD,MAAA,MAAM,MAAA,GAAS,kBAAkB,GAAG,CAAA;AACpC,MAAA,QAAA,CAAS,OAAO,OAAO,CAAA;AAGvB,MAAA,aAAA,CAAc,WAAA,EAAa;AAAA,QACzB,OAAA,EAAS,WAAA,IAAe,CAAA,OAAA,EAAU,MAAA,CAAO,OAAO,CAAA,CAAA;AAAA,QAChD,WAAA,EAAa;AAAA,OACd,CAAA;AAAA,IACH,CAAA,SAAE;AACA,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,MAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,MAAA,mBAAA,CAAoB,OAAA,GAAU,IAAA;AAC9B,MAAA,kBAAA,CAAmB,OAAA,GAAU,IAAA;AAAA,IAC/B;AAAA,EACF,CAAA,EAAG;AAAA,IACD,WAAA;AAAA,IACA,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA;AAAA,IACA,iBAAA;AAAA,IACA,gBAAA;AAAA,IACA,eAAA;AAAA,IACA,qBAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAAf,gBAAU,MAAM;AACd,IAAA,IAAI,iBAAA,IAAqB,iBAAiB,OAAA,EAAS;AACjD,MAAA,MAAM,UAAU,gBAAA,CAAiB,OAAA;AACjC,MAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAC3B,MAAA,KAAA,CAAM,OAAO,CAAA;AAAA,IACf;AAAA,EACF,CAAA,EAAG,CAAC,iBAAA,EAAmB,KAAK,CAAC,CAAA;AAK7B,EAAA,MAAMG,cAAAA,GAAgBF,kBAAY,MAAM;AACtC,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,YAAA,CAAa,EAAE,CAAA;AACf,IAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,cAAA,CAAe,WAAW,iBAAiB,CAAA;AAAA,IAC7C;AACA,IAAA,YAAA,EAAa;AAAA,EACf,CAAA,EAAG,CAAC,YAAA,EAAc,iBAAiB,CAAC,CAAA;AAkBpC,EAAA,MAAM,eAAA,GAAkBA,kBAAY,MAAM;AACxC,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,YAAA,CAAa,EAAE,CAAA;AACf,IAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,IAAA,kBAAA,CAAmB,OAAA,GAAU,IAAA;AAC7B,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,cAAA,CAAe,WAAW,iBAAiB,CAAA;AAAA,IAC7C;AACA,IAAA,YAAA,EAAa;AAAA,EACf,CAAA,EAAG,CAAC,YAAA,EAAc,iBAAiB,CAAC,CAAA;AAKpC,EAAA,MAAM,WAAA,GAAcA,kBAAY,MAAM;AACpC,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,kBAAA,CAAmB,QAAQ,KAAA,EAAM;AAAA,IACnC;AAGA,IAAA,IAAI,oBAAoB,OAAA,EAAS;AAC/B,MAAA,aAAA,CAAc,oBAAoB,OAAA,EAAS;AAAA,QACzC,OAAA,EAAS,qBAAA;AAAA,QACT,WAAA,EAAa;AAAA,OACd,CAAA;AAAA,IACH;AAEA,IAAA,cAAA,CAAe,KAAK,CAAA;AACpB,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,IAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,IAAA,oBAAA,CAAqB,IAAI,CAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,aAAA,EAAe,iBAAA,EAAmB,iBAAiB,CAAC,CAAA;AAKxD,EAAA,MAAM,cAAA,GAAiBA,kBAAY,YAAY;AAC7C,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,iBAAA,EAAmB;AAExC,IAAA,MAAM,OAAA,GAAU,aAAa,OAAA,IAAW,gCAAA;AACxC,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,QAAA,IAAY,YAAA,CAAa,QAAA,IAAY,EAAA;AAElE,IAAA,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,iBAAA,CAAA,EAAqB;AAAA,MACzC,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,eAAA,EAAiB,CAAA,OAAA,EAAU,WAAA,CAAY,MAAM,CAAA,CAAA;AAAA,QAC7C,aAAA,EAAe,QAAA;AAAA,QACf,WAAA,EAAa,YAAY,MAAA,IAAU;AAAA,OACrC;AAAA,MACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,cAAc,iBAAA,CAAkB,WAAA;AAAA,QAChC,MAAA,EAAQ;AAAA,OACT;AAAA,KACF,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,WAAA,EAAa,iBAAA,EAAmB,YAAY,CAAC,CAAA;AAKjD,EAAA,MAAM,kBAAA,GAAqBA,iBAAAA,CAAY,OAAO,OAAA,KAAoB;AAChE,IAAA,oBAAA,CAAqB,IAAI,CAAA;AACzB,IAAA,MAAM,MAAM,OAAO,CAAA;AAAA,EACrB,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,iBAAA;AAAA,IACA,oBAAA;AAAA,IACA,aAAA,EAAAE,cAAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AACF;ACv8BA,SAASa,WAAAA,GAAqB;AAC5B,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACjE;AAKO,SAAS,QAAA,GAA2B;AACzC,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,MACE,YAAA,EAAa;AAEjB,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIjB,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACxD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,cAAAA,CAAqB,EAAE,CAAA;AACzD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,cAAAA,CAA8B,EAAE,CAAA;AAC5E,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,kBAAA,GAAqBe,aAA+B,IAAI,CAAA;AAE9D,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,UAAU,MAAA,CAAO;AAAA,GACnB;AAKA,EAAA,MAAM,OAAA,GAAUb,iBAAAA,CAAY,OAC1B,MAAA,EACA,OAAA,KACkB;AAClB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,YAAA,CAAa,EAAE,CAAA;AACf,IAAA,iBAAA,CAAkB,EAAE,CAAA;AAEpB,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAC5B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,OAAA,EAAS,WAAA,IAAe,iBAAA,EAAmB,WAAA;AAC/D,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,QAAA,CAAS,uBAAuB,CAAA;AAChC,MAAA;AAAA,IACF;AAEA,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,kBAAA,CAAmB,OAAA,GAAU,IAAI,eAAA,EAAgB;AAEjD,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,sBAAA;AAAA,QACrB,WAAA;AAAA,QACA,MAAA;AAAA,QACA,WAAA;AAAA,QACA,EAAE,WAAA,EAAa,OAAA,EAAS,eAAe,SAAA,EAAW,KAAA,EAAO,SAAS,KAAA,EAAM;AAAA,QACxE;AAAA,OACF;AAEA,MAAA,IAAI,CAAC,SAAS,IAAA,EAAM;AAClB,QAAA,MAAM,IAAI,MAAM,kBAAkB,CAAA;AAAA,MACpC;AAEA,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,SAAA,EAAU;AACvC,MAAA,IAAI,WAAA,GAAc,EAAA;AAClB,MAAA,MAAM,mBAA+B,EAAC;AACtC,MAAA,MAAM,wBAA6C,EAAC;AAGpD,MAAA,WAAA,MAAiB,KAAA,IAAS,cAAA,CAAe,MAAM,CAAA,EAAG;AAEhD,QAAA,IAAI,kBAAA,CAAmB,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS;AAC9C,UAAA;AAAA,QACF;AAEA,QAAA,QAAQ,MAAM,IAAA;AAAM,UAClB,KAAK,MAAA;AAAA,UACL,KAAK,SAAA;AAAA,UACL,KAAK,OAAA;AACH,YAAA,IAAI,MAAM,OAAA,EAAS;AACjB,cAAA,WAAA,IAAe,KAAA,CAAM,OAAA;AACrB,cAAA,SAAA,CAAU,WAAW,CAAA;AAAA,YACvB;AACA,YAAA;AAAA,UAEF,KAAK,WAAA;AAAA,UACL,KAAK,UAAA;AACH,YAAA,IAAI,MAAM,IAAA,EAAM;AACd,cAAA,MAAM,QAAA,GAAqB;AAAA,gBACzB,IAAIe,WAAAA,EAAW;AAAA,gBACf,SAAA,EAAW,MAAM,IAAA,EAAM,WAAA;AAAA,gBACvB,MAAM,KAAA,CAAM,IAAA;AAAA,gBACZ,MAAM,KAAA,CAAM,IAAA;AAAA,gBACZ,MAAA,EAAQ,SAAA;AAAA,gBACR,SAAA,EAAW,KAAK,GAAA;AAAI,eACtB;AACA,cAAA,gBAAA,CAAiB,KAAK,QAAQ,CAAA;AAC9B,cAAA,YAAA,CAAa,CAAC,GAAG,gBAAgB,CAAC,CAAA;AAAA,YACpC;AACA,YAAA;AAAA,UAEF,KAAK,aAAA;AACH,YAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,gBAAA,CAAiB,MAAA,GAAS,CAAA,EAAG;AAC7C,cAAA,MAAM,YAAY,gBAAA,CAAiB,SAAA;AAAA,gBACjC,QAAM,EAAA,CAAG,IAAA,KAAS,KAAA,CAAM,IAAA,IAAQ,GAAG,MAAA,KAAW;AAAA,eAChD;AACA,cAAA,IAAI,aAAa,CAAA,EAAG;AAClB,gBAAA,gBAAA,CAAiB,SAAS,CAAA,GAAI;AAAA,kBAC5B,GAAG,iBAAiB,SAAS,CAAA;AAAA,kBAC7B,QAAQ,KAAA,CAAM,MAAA;AAAA,kBACd,MAAA,EAAQ,UAAA;AAAA,kBACR,OAAA,EAAS,KAAK,GAAA;AAAI,iBACpB;AACA,gBAAA,YAAA,CAAa,CAAC,GAAG,gBAAgB,CAAC,CAAA;AAAA,cACpC;AAAA,YACF;AACA,YAAA;AAAA,UAEF,KAAK,eAAA;AACH,YAAA,IAAI,MAAM,IAAA,EAAM;AACd,cAAA,MAAM,MAAM,KAAA,CAAM,IAAA;AAClB,cAAA,qBAAA,CAAsB,KAAK,GAAG,CAAA;AAC9B,cAAA,iBAAA,CAAkB,CAAC,GAAG,qBAAqB,CAAC,CAAA;AAC5C,cAAA,gBAAA,CAAiB,GAAG,CAAA;AAAA,YACtB;AACA,YAAA;AAAA,UAEF,KAAK,OAAA;AACH,YAAA,QAAA,CAAS,KAAA,CAAM,SAAS,cAAc,CAAA;AACtC,YAAA;AAAA;AACJ,MACF;AAEA,MAAA,SAAA,CAAU,WAAW,CAAA;AAAA,IAEvB,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,cAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAAA,IAClB,CAAA,SAAE;AACA,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,kBAAA,CAAmB,OAAA,GAAU,IAAA;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,WAAA,EAAa,mBAAmB,gBAAA,EAAkB,MAAA,EAAQ,YAAY,CAAC,CAAA;AAK3E,EAAA,MAAM,MAAA,GAASf,kBAAY,MAAM;AAC/B,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,kBAAA,CAAmB,QAAQ,KAAA,EAAM;AAAA,IACnC;AACA,IAAA,cAAA,CAAe,KAAK,CAAA;AAAA,EACtB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACpLO,IAAM,gBAAA,GAAoC;AAAA,EAC/C;AAAA,IACE,EAAA,EAAI,eAAA;AAAA,IACJ,QAAA,EAAU,eAAA;AAAA,IACV,QAAA,EAAU;AAAA,MACR,8BAAA;AAAA,MACA,kBAAA;AAAA,MACA,4BAAA;AAAA,MACA,yBAAA;AAAA,MACA,wBAAA;AAAA,MACA,kBAAA;AAAA,MACA,4BAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,QAAA,EAAU,CAAC,SAAA,EAAW,UAAA,EAAY,SAAA,EAAW,cAAc,UAAA,EAAY,UAAA,EAAY,QAAA,EAAU,SAAA,EAAW,UAAU,CAAA;AAAA,IAClH,eAAA,EAAiB;AAAA,MACf,QAAA,EAAU,cAAA;AAAA,MACV,YAAA,EAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,sDAAA,CAAA;AAAA,MAQd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,EAAA,EAAI,eAAA;AAAA,IACJ,QAAA,EAAU,eAAA;AAAA,IACV,QAAA,EAAU;AAAA,MACR,wBAAA;AAAA,MACA,eAAA;AAAA,MACA,uBAAA;AAAA,MACA,8BAAA;AAAA,MACA,YAAA;AAAA,MACA,uCAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,QAAA,EAAU,CAAC,OAAA,EAAS,OAAA,EAAS,MAAA,EAAQ,WAAA,EAAa,eAAA,EAAiB,WAAA,EAAa,SAAA,EAAW,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,SAAS,CAAA;AAAA,IAC1H,eAAA,EAAiB;AAAA,MACf,QAAA,EAAU,cAAA;AAAA,MACV,YAAA,EAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,sDAAA,CAAA;AAAA,MAQd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,EAAA,EAAI,kBAAA;AAAA,IACJ,QAAA,EAAU,kBAAA;AAAA,IACV,QAAA,EAAU;AAAA,MACR,uBAAA;AAAA,MACA,qBAAA;AAAA,MACA,kBAAA;AAAA,MACA,qBAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,uBAAA;AAAA,MACA,kBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,QAAA,EAAU,CAAC,OAAA,EAAS,SAAA,EAAW,OAAA,EAAS,kBAAA,EAAoB,IAAA,EAAM,gBAAA,EAAkB,YAAA,EAAc,YAAA,EAAc,QAAA,EAAU,IAAI,CAAA;AAAA,IAC9H,eAAA,EAAiB;AAAA,MACf,QAAA,EAAU,cAAA;AAAA,MACV,YAAA,EAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,8CAAA,CAAA;AAAA,MAQd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,EAAA,EAAI,qBAAA;AAAA,IACJ,QAAA,EAAU,qBAAA;AAAA,IACV,QAAA,EAAU;AAAA,MACR,4BAAA;AAAA,MACA,wBAAA;AAAA,MACA,yBAAA;AAAA,MACA,4BAAA;AAAA,MACA,yBAAA;AAAA,MACA,wBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,QAAA,EAAU,CAAC,WAAA,EAAa,OAAA,EAAS,QAAA,EAAU,SAAS,MAAA,EAAQ,OAAA,EAAS,SAAA,EAAW,WAAA,EAAa,OAAO,CAAA;AAAA,IACpG,eAAA,EAAiB;AAAA,MACf,QAAA,EAAU,cAAA;AAAA,MACV,YAAA,EAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,mDAAA,CAAA;AAAA,MAQd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,EAAA,EAAI,kBAAA;AAAA,IACJ,QAAA,EAAU,kBAAA;AAAA,IACV,QAAA,EAAU;AAAA,MACR,sBAAA;AAAA,MACA,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA,wBAAA;AAAA,MACA,yBAAA;AAAA,MACA,2BAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,QAAA,EAAU,CAAC,OAAA,EAAS,SAAA,EAAW,MAAA,EAAQ,aAAa,MAAA,EAAQ,OAAA,EAAS,cAAA,EAAgB,SAAA,EAAW,OAAO,CAAA;AAAA,IACvG,eAAA,EAAiB;AAAA,MACf,QAAA,EAAU,WAAA;AAAA,MACV,YAAA,EAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,4CAAA,CAAA;AAAA,MAQd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,EAAA,EAAI,kBAAA;AAAA,IACJ,QAAA,EAAU,kBAAA;AAAA,IACV,QAAA,EAAU;AAAA,MACR,qBAAA;AAAA,MACA,cAAA;AAAA,MACA,qBAAA;AAAA,MACA,MAAA;AAAA,MACA,eAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,QAAA,EAAU,CAAC,SAAA,EAAW,MAAA,EAAQ,gBAAgB,KAAA,EAAO,WAAA,EAAa,QAAA,EAAU,SAAA,EAAW,QAAQ,CAAA;AAAA,IAC/F,eAAA,EAAiB;AAAA,MACf,QAAA,EAAU,SAAA;AAAA,MACV,YAAA,EAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,gDAAA,CAAA;AAAA,MAQd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,EAAA,EAAI,iBAAA;AAAA,IACJ,QAAA,EAAU,iBAAA;AAAA,IACV,QAAA,EAAU;AAAA,MACR,yBAAA;AAAA,MACA,2BAAA;AAAA,MACA,2BAAA;AAAA,MACA,6BAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,QAAA,EAAU,CAAC,MAAA,EAAQ,QAAA,EAAU,YAAY,WAAA,EAAa,SAAA,EAAW,UAAU,YAAY,CAAA;AAAA,IACvF,eAAA,EAAiB;AAAA,MACf,QAAA,EAAU,cAAA;AAAA,MACV,YAAA,EAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,6CAAA,CAAA;AAAA,MAQd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,EAAA,EAAI,UAAA;AAAA,IACJ,QAAA,EAAU,UAAA;AAAA,IACV,QAAA,EAAU;AAAA,MACR,cAAA;AAAA,MACA,qBAAA;AAAA,MACA,YAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,UAAU,CAAC,UAAA,EAAY,QAAQ,QAAA,EAAU,aAAA,EAAe,WAAW,UAAU,CAAA;AAAA,IAC7E,eAAA,EAAiB;AAAA,MACf,QAAA,EAAU,cAAA;AAAA,MACV,YAAA,EAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,uCAAA,CAAA;AAAA,MAQd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,QAAA,EAAU;AAAA;AAEd;AASO,SAAS,gBAAgB,MAAA,EAAgC;AAC9D,EAAA,MAAM,WAA2B,EAAC;AAGlC,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,KAAA,CAAM,uEAAuE,CAAA;AAC5G,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM,aAAA;AAAA,MACN,KAAA,EAAO,gBAAgB,CAAC,CAAA;AAAA,MACxB,QAAA,EAAU,gBAAgB,KAAA,IAAS;AAAA,KACpC,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,8DAA8D,CAAA;AAC/F,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,IAAA,EAAM,eAAA;AAAA,MACN,KAAA,EAAO,YAAY,CAAC,CAAA;AAAA,MACpB,QAAA,EAAU,YAAY,KAAA,IAAS;AAAA,KAChC,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,EAAE,KAAA,EAAO,8BAAA,EAAgC,MAAA,EAAQ,SAAA,EAAU;AAAA,IAC3D,EAAE,KAAA,EAAO,2BAAA,EAA6B,MAAA,EAAQ,UAAA,EAAW;AAAA,IACzD,EAAE,KAAA,EAAO,4BAAA,EAA8B,MAAA,EAAQ,WAAA,EAAY;AAAA,IAC3D,EAAE,KAAA,EAAO,8BAAA,EAAgC,MAAA,EAAQ,SAAA,EAAU;AAAA,IAC3D,EAAE,KAAA,EAAO,6BAAA,EAA+B,MAAA,EAAQ,YAAA;AAAa,GAC/D;AAEA,EAAA,KAAA,MAAW,EAAE,KAAA,EAAO,MAAA,EAAO,IAAK,cAAA,EAAgB;AAC9C,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AAChC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,QAAA,EAAU,MAAM,KAAA,IAAS;AAAA,OAC1B,CAAA;AACD,MAAA;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,cAAA,GAAiB,CAAC,SAAA,EAAW,WAAA,EAAa,SAAA,EAAW,YAAY,OAAA,EAAS,QAAA,EAAU,UAAA,EAAY,WAAA,EAAa,OAAO,CAAA;AAC1H,EAAA,KAAA,MAAW,UAAU,cAAA,EAAgB;AACnC,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,WAAA,EAAY,CAAE,QAAQ,MAAM,CAAA;AACvD,IAAA,IAAI,gBAAgB,EAAA,EAAI;AACtB,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,QAAA,EAAU;AAAA,OACX,CAAA;AACD,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAKO,SAAS,gBAAA,CACd,MAAA,EACA,cAAA,GAAkC,EAAC,EACZ;AACvB,EAAA,MAAM,cAAc,CAAC,GAAG,cAAA,EAAgB,GAAG,gBAAgB,CAAA,CACxD,IAAA,CAAK,CAAC,CAAA,EAAG,OAAO,CAAA,CAAE,QAAA,IAAY,CAAA,KAAM,CAAA,CAAE,YAAY,CAAA,CAAE,CAAA;AAEvD,EAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,WAAA,EAAY,CAAE,IAAA,EAAK;AACnD,EAAA,IAAI,SAAA,GAA8D,IAAA;AAElE,EAAA,KAAA,MAAW,WAAW,WAAA,EAAa;AACjC,IAAA,IAAI,KAAA,GAAQ,CAAA;AAGZ,IAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,QAAA,EAAU;AACpC,MAAA,IAAI,KAAA,CAAM,IAAA,CAAK,gBAAgB,CAAA,EAAG;AAChC,QAAA,KAAA,IAAS,GAAA;AACT,QAAA;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,eAAA,GAAkB,QAAQ,QAAA,CAAS,MAAA;AAAA,MAAO,CAAA,EAAA,KAC9C,gBAAA,CAAiB,QAAA,CAAS,EAAA,CAAG,aAAa;AAAA,KAC5C;AACA,IAAA,KAAA,IAAU,eAAA,CAAgB,MAAA,GAAS,OAAA,CAAQ,QAAA,CAAS,MAAA,GAAU,GAAA;AAE9D,IAAA,IAAI,KAAA,IAAS,SAAA,EAAW,KAAA,IAAS,CAAA,CAAA,EAAI;AACnC,MAAA,SAAA,GAAY,EAAE,SAAS,KAAA,EAAM;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,KAAA,GAAQ,GAAA,EAAK;AACvC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAA,GAAW,gBAAgB,MAAM,CAAA;AAEvC,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,UAAU,OAAA,CAAQ,QAAA;AAAA,IAC5B,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,IACvC,QAAA;AAAA,IACA,eAAA,EAAiB,UAAU,OAAA,CAAQ,eAAA;AAAA,IACnC,cAAA,EAAgB,MAAA;AAAA,IAChB,MAAA,EAAQ;AAAA,GACV;AACF;AAKA,eAAsB,cAAA,CACpB,QACA,UAAA,EACyB;AACzB,EAAA,MAAM,cAAA,GAAiB,CAAA;AAAA,SAAA,EACd,MAAM,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AAUf,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,UAAA,CAAW,cAAc,CAAA;AAChD,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,KAAA,CAAM,aAAa,CAAA;AAE9C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,CAAC,CAAC,CAAA;AACtC,MAAA,OAAO;AAAA,QACL,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,YAAY,OAAO,MAAA,CAAO,UAAA,KAAe,QAAA,GAAW,OAAO,UAAA,GAAa,GAAA;AAAA,QACxE,QAAA,EAAU,gBAAgB,MAAM,CAAA;AAAA,QAChC,eAAA,EAAiB;AAAA,UACf,QAAA,EAAU,OAAO,QAAA,IAAY,QAAA;AAAA,UAC7B,cAAc,MAAA,CAAO;AAAA,SACvB;AAAA,QACA,cAAA,EAAgB,MAAA;AAAA,QAChB,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAAA,EACpD;AAGA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,mBAAA;AAAA,IACV,UAAA,EAAY,GAAA;AAAA,IACZ,QAAA,EAAU,gBAAgB,MAAM,CAAA;AAAA,IAChC,eAAA,EAAiB;AAAA,MACf,QAAA,EAAU,QAAA;AAAA,MACV,YAAA,EAAc,mDAAmD,MAAM,CAAA;AAAA,KACzE;AAAA,IACA,cAAA,EAAgB,MAAA;AAAA,IAChB,MAAA,EAAQ;AAAA,GACV;AACF;AAYO,IAAM,iBAAN,MAAqB;AAAA,EAK1B,WAAA,CAAY,OAAA,GAAiC,EAAC,EAAG;AAC/C,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAA,CAAQ,cAAA,IAAkB,EAAC;AACjD,IAAA,IAAA,CAAK,mBAAA,GAAsB,QAAQ,mBAAA,IAAuB,GAAA;AAC1D,IAAA,IAAA,CAAK,cAAA,GAAiB,QAAQ,cAAA,KAAmB,KAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CACJ,MAAA,EACA,WAAA,EACyB;AAEzB,IAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,MAAA,EAAQ,IAAA,CAAK,cAAc,CAAA;AAEjE,IAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,UAAA,IAAc,IAAA,CAAK,mBAAA,EAAqB;AACvE,MAAA,OAAO,YAAA;AAAA,IACT;AAGA,IAAA,IAAI,IAAA,CAAK,kBAAkB,WAAA,EAAa;AACtC,MAAA,MAAM,WAAA,GAAc,MAAM,cAAA,CAAe,MAAA,EAAQ,WAAW,CAAA;AAG5D,MAAA,IAAI,YAAA,IAAgB,WAAA,CAAY,UAAA,GAAa,YAAA,CAAa,UAAA,EAAY;AACpE,QAAA,OAAO,EAAE,GAAG,YAAA,EAAc,MAAA,EAAQ,QAAA,EAAS;AAAA,MAC7C;AAEA,MAAA,OAAO,EAAE,GAAG,WAAA,EAAa,MAAA,EAAQ,QAAA,EAAS;AAAA,IAC5C;AAGA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,OAAO,YAAA;AAAA,IACT;AAGA,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,mBAAA;AAAA,MACV,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU,gBAAgB,MAAM,CAAA;AAAA,MAChC,eAAA,EAAiB;AAAA,QACf,QAAA,EAAU,QAAA;AAAA,QACV,YAAA,EAAc,mDAAmD,MAAM,CAAA;AAAA,OACzE;AAAA,MACA,cAAA,EAAgB,MAAA;AAAA,MAChB,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,OAAA,EAA8B;AACvC,IAAA,IAAA,CAAK,cAAA,CAAe,KAAK,OAAO,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,SAAA,EAA4B;AACxC,IAAA,MAAM,QAAQ,IAAA,CAAK,cAAA,CAAe,UAAU,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,SAAS,CAAA;AACnE,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AACnC,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAA+B;AAC7B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,cAAA,EAAgB,GAAG,gBAAgB,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAAqC;AACnC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,cAAc,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAuB,SAAA,EAAyB;AAC9C,IAAA,IAAA,CAAK,mBAAA,GAAsB,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAC,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,OAAA,EAAwB;AACrC,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAA;AAAA,EACxB;AACF;;;AChgBA,SAAS,gBAAA,CAAiB,GAAW,CAAA,EAAmB;AACtD,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,CAAA,CAAE,aAAY,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,GAAS,CAAC,CAAC,CAAA;AAC7E,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,CAAA,CAAE,aAAY,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,GAAS,CAAC,CAAC,CAAA;AAE7E,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,CAAA,IAAK,MAAA,CAAO,SAAS,CAAA,EAAG;AAC1C,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,CAAA,IAAK,MAAA,CAAO,SAAS,CAAA,EAAG;AAC1C,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,CAAC,GAAG,MAAM,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAC,CAAC,CAAA;AACnE,EAAA,MAAM,KAAA,uBAAY,GAAA,CAAI,CAAC,GAAG,MAAA,EAAQ,GAAG,MAAM,CAAC,CAAA;AAE5C,EAAA,OAAO,YAAA,CAAa,OAAO,KAAA,CAAM,IAAA;AACnC;AAKA,SAAS,gBAAgB,MAAA,EAAwB;AAC/C,EAAA,OAAO,MAAA,CACJ,WAAA,EAAY,CACZ,IAAA,EAAK,CACL,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CACnB,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAC3B;AAWO,IAAM,gBAAN,MAAoB;AAAA,EAKzB,WAAA,CAAY,OAAA,GAAgC,EAAC,EAAG;AAJhD,IAAA,IAAA,CAAQ,MAAA,uBAA2C,GAAA,EAAI;AACvD,IAAA,IAAA,CAAQ,WAAA,uBAAuC,GAAA,EAAI;AAIjD,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,WAAA,EAAa,QAAQ,WAAA,KAAgB,KAAA;AAAA,MACrC,QAAA,EAAU,OAAA,CAAQ,QAAA,IAAY,EAAA,GAAK,EAAA,GAAK;AAAA;AAAA,KAC1C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,KAAA,EAA8B;AACrC,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAA;AAC/B,IAAA,IAAA,CAAK,YAAY,GAAA,CAAI,eAAA,CAAgB,MAAM,MAAM,CAAA,EAAG,MAAM,EAAE,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,EAAA,EAAyC;AAC3C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAEhC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,IAAI,KAAK,OAAA,CAAQ,WAAA,IAAe,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA,EAAG;AACzD,MAAA,MAAM,MAAM,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,WAAW,OAAA,EAAQ;AAClD,MAAA,IAAI,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU;AAC/B,QAAA,IAAA,CAAK,OAAO,EAAE,CAAA;AACd,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,MAAA,EAA6C;AAC7D,IAAA,MAAM,gBAAA,GAAmB,gBAAgB,MAAM,CAAA;AAC/C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,gBAAgB,CAAA;AAErD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO,IAAA,CAAK,IAAI,OAAO,CAAA;AAAA,IACzB;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CAAa,MAAA,EAAgB,SAAA,GAAoB,GAAA,EAAkC;AAEjF,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AAChD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,OAAO,UAAA;AAAA,IACT;AAEA,IAAA,MAAM,gBAAA,GAAmB,gBAAgB,MAAM,CAAA;AAG/C,IAAA,IAAI,SAAA,GAAmE,IAAA;AAEvE,IAAA,KAAA,MAAW,CAAC,gBAAA,EAAkB,OAAO,CAAA,IAAK,KAAK,WAAA,EAAa;AAC1D,MAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,gBAAA,EAAkB,gBAAgB,CAAA;AAEtE,MAAA,IAAI,UAAA,IAAc,SAAA,IAAa,UAAA,IAAc,SAAA,EAAW,cAAc,CAAA,CAAA,EAAI;AACxE,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA;AAC9B,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,SAAA,GAAY,EAAE,OAAO,UAAA,EAAW;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,SAAA,EAAW,KAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,EAAA,EAAkB;AAC5B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAChC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,CAAM,UAAA,uBAAiB,IAAA,EAAK;AAC5B,MAAA,KAAA,CAAM,UAAA,EAAA;AAEN,MAAA,IAAI,KAAA,CAAM,MAAA,CAAO,UAAA,KAAe,MAAA,EAAW;AACzC,QAAA,KAAA,CAAM,MAAA,CAAO,UAAA,mBAAa,IAAI,IAAA,EAAK;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAA6B;AAE3B,IAAA,IAAI,KAAK,OAAA,CAAQ,WAAA,IAAe,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA,EAAG;AACzD,MAAA,IAAA,CAAK,YAAA,EAAa;AAAA,IACpB;AAEA,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAiC;AAC/B,IAAA,OAAO,IAAA,CAAK,OAAA,EAAQ,CAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,UAAA,GAAa,CAAA,CAAE,UAAU,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAkC;AAChC,IAAA,OAAO,IAAA,CAAK,SAAQ,CAAE,IAAA;AAAA,MACpB,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,WAAW,OAAA,EAAQ,GAAI,CAAA,CAAE,UAAA,CAAW,OAAA;AAAQ,KAC1D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,EAAA,EAAqB;AAC1B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAChC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,eAAA,CAAgB,KAAA,CAAM,MAAM,CAAC,CAAA;AACrD,MAAA,OAAO,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAAA,IAC9B;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAClB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAe;AACb,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,EAAA,EAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAA,GAAqB;AAC3B,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,eAAe,IAAA,CAAK,OAAA,CAAQ,YAAY,CAAA,EAAG;AAC3D,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,WAAqB,EAAC;AAE5B,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,CAAA,IAAK,KAAK,MAAA,EAAQ;AACrC,MAAA,MAAM,GAAA,GAAM,GAAA,GAAM,KAAA,CAAM,UAAA,CAAW,OAAA,EAAQ;AAC3C,MAAA,IAAI,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU;AAC/B,QAAA,QAAA,CAAS,KAAK,EAAE,CAAA;AAAA,MAClB;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,MAAA,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,GAAA,EAAmB;AAC7B,IAAA,IAAA,CAAK,OAAA,CAAQ,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,GAAG,GAAG,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,OAAA,EAAwB;AACtC,IAAA,IAAA,CAAK,QAAQ,WAAA,GAAc,OAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAA4B;AAC1B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,MAAA,EAAiC;AACtC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAE1B,MAAA,MAAM,eAAA,GAAmC;AAAA,QACvC,GAAG,KAAA;AAAA,QACH,SAAA,EAAW,MAAM,SAAA,YAAqB,IAAA,GAAO,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAAA,QACvF,UAAA,EAAY,MAAM,UAAA,YAAsB,IAAA,GAAO,MAAM,UAAA,GAAa,IAAI,IAAA,CAAK,KAAA,CAAM,UAAU;AAAA,OAC7F;AACA,MAAA,IAAA,CAAK,SAAS,eAAe,CAAA;AAAA,IAC/B;AAAA,EACF;AACF;;;ACxPA,SAAS,eAAA,GAA0B;AACjC,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAA;AACxC,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAA;AACzD,EAAA,OAAO,CAAA,MAAA,EAAS,SAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AACrC;AAKA,IAAM,cAAA,GAAiD;AAAA,EACrD,aAAA,EAAe,cAAA;AAAA,EACf,aAAA,EAAe,sBAAA;AAAA,EACf,mBAAA,EAAqB,eAAA;AAAA,EACrB,gBAAA,EAAkB,aAAA;AAAA,EAClB,gBAAA,EAAkB,iBAAA;AAAA,EAClB,QAAA,EAAU,oBAAA;AAAA,EACV,gBAAA,EAAkB,eAAA;AAAA,EAClB,eAAA,EAAiB,gBAAA;AAAA,EACjB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,MAAA,EAAQ;AACV,CAAA;AAYO,IAAM,eAAN,MAAmB;AAAA,EAKxB,WAAA,CAAY,OAAA,GAA+B,EAAC,EAAG;AAC7C,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,cAAA,EAAgB,QAAQ,cAAA,KAAmB,KAAA;AAAA,MAC3C,uBAAA,EAAyB,QAAQ,uBAAA,IAA2B,GAAA;AAAA,MAC5D,WAAA,EAAa,QAAQ,WAAA,KAAgB,KAAA;AAAA,MACrC,QAAA,EAAU,OAAA,CAAQ,QAAA,IAAY,EAAA,GAAK,EAAA,GAAK,GAAA;AAAA;AAAA,MACxC,cAAA,EAAgB,OAAA,CAAQ,cAAA,IAAkB;AAAC,KAC7C;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,cAAA,CAAe;AAAA,MACjC,cAAA,EAAgB,KAAK,OAAA,CAAQ,cAAA;AAAA,MAC7B,mBAAA,EAAqB,KAAK,OAAA,CAAQ,uBAAA;AAAA,MAClC,cAAA,EAAgB,KAAK,OAAA,CAAQ;AAAA,KAC9B,CAAA;AAED,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,aAAA,CAAc;AAAA,MAChC,WAAA,EAAa,KAAK,OAAA,CAAQ,WAAA;AAAA,MAC1B,QAAA,EAAU,KAAK,OAAA,CAAQ;AAAA,KACxB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,gBAAA,CACJ,MAAA,EACA,WAAA,EAC0B;AAE1B,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,QAAA,CAAS,YAAA,CAAa,MAAM,CAAA;AACvD,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,IAAA,CAAK,QAAA,CAAS,WAAA,CAAY,aAAA,CAAc,EAAE,CAAA;AAC1C,MAAA,OAAO,aAAA;AAAA,IACT;AAGA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,QAAQ,WAAW,CAAA;AAGhE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAGxC,IAAA,MAAM,KAAA,GAAyB;AAAA,MAC7B,IAAI,eAAA,EAAgB;AAAA,MACpB,IAAA,EAAM,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAA;AAAA,MACrC,MAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,UAAA,sBAAgB,IAAA,EAAK;AAAA,MACrB,UAAA,EAAY;AAAA,KACd;AAGA,IAAA,IAAA,CAAK,QAAA,CAAS,SAAS,KAAK,CAAA;AAE5B,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,gBAAA,CACE,MACA,MAAA,EACiB;AACjB,IAAA,MAAM,UAAA,GAAiC;AAAA,MACrC,QAAA,EAAU,QAAA;AAAA,MACV,SAAA,EAAW,IAAA;AAAA,MACX,WAAA,EAAa,SAAA;AAAA,MACb,GAAG,MAAA;AAAA,MACH,IAAA;AAAA,MACA,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,UAAA,sBAAgB,IAAA;AAAK,KACvB;AAEA,IAAA,MAAM,KAAA,GAAyB;AAAA,MAC7B,IAAI,eAAA,EAAgB;AAAA,MACpB,IAAA;AAAA,MACA,MAAA,EAAQ,UAAA;AAAA,MACR,MAAA,EAAQ,WAAW,IAAI,CAAA,CAAA;AAAA,MACvB,QAAA,EAAU;AAAA,QACR,QAAA,EAAU,QAAA;AAAA,QACV,UAAA,EAAY,CAAA;AAAA,QACZ,UAAU,EAAC;AAAA,QACX,eAAA,EAAiB,MAAA;AAAA,QACjB,cAAA,EAAgB,WAAW,IAAI,CAAA,CAAA;AAAA,QAC/B,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,UAAA,sBAAgB,IAAA,EAAK;AAAA,MACrB,UAAA,EAAY;AAAA,KACd;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,SAAS,KAAK,CAAA;AAC5B,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,QAAA,EAA8C;AAChE,IAAA,MAAM,UAAA,GAAiC;AAAA,MACrC,QAAA,EAAU,QAAA,CAAS,eAAA,CAAgB,QAAA,IAAY,QAAA;AAAA,MAC/C,SAAA,EAAW,IAAA;AAAA,MACX,WAAA,EAAa,SAAA;AAAA,MACb,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,UAAA,sBAAgB,IAAA;AAAK,KACvB;AAGA,IAAA,OAAO;AAAA,MACL,GAAG,UAAA;AAAA,MACH,GAAG,QAAA,CAAS,eAAA;AAAA,MACZ,QAAA,EAAU;AAAA,QACR,kBAAkB,QAAA,CAAS,QAAA;AAAA,QAC3B,oBAAoB,QAAA,CAAS,UAAA;AAAA,QAC7B,gBAAgB,QAAA,CAAS,MAAA;AAAA,QACzB,UAAU,QAAA,CAAS;AAAA;AACrB,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,QAAA,EAAkC;AAC1D,IAAA,OAAO,cAAA,CAAe,QAAA,CAAS,QAAQ,CAAA,IAAK,cAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,SAAS,EAAA,EAAyC;AAChD,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAgC;AAC9B,IAAA,OAAO,IAAA,CAAK,SAAS,OAAA,EAAQ;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAAuC;AACrC,IAAA,OAAO,IAAA,CAAK,SAAS,WAAA,EAAY;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,GAAwC;AACtC,IAAA,OAAO,IAAA,CAAK,SAAS,YAAA,EAAa;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,EAAA,EAAqB;AAC/B,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAiB;AACf,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAwB;AACtB,IAAA,OAAO,IAAA,CAAK,SAAS,IAAA,EAAK;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,EAAA,EAAkB;AACjC,IAAA,IAAA,CAAK,QAAA,CAAS,YAAY,EAAE,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAA,GAA8B;AAC5B,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAA,GAGE;AACA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,IAAA,CAAK,QAAA,CAAS,MAAA,EAAO;AAAA,MAC7B,SAAS,IAAA,CAAK;AAAA,KAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,KAAA,EAA4C;AACtD,IAAA,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AAAA,EACnC;AACF;;;AC/OA,SAASe,WAAAA,GAAqB;AAC5B,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AACrE;AAOO,SAAS,cAAA,CACd,OAAA,GAAiC,EAAC,EACZ;AACtB,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA,EAAe,YAAA;AAAA,IACf,iBAAA;AAAA,IACA,iBAAA;AAAA,IACA,gBAAA;AAAA,IACA,eAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,MACE,YAAA,EAAa;AAGjB,EAAA,MAAM,OAAA,GAAUP,aAAAA;AAAA,IACd,MAAM,IAAI,YAAA,CAAa;AAAA,MACrB,gBAAgB,OAAA,CAAQ,cAAA;AAAA,MACxB,yBAAyB,OAAA,CAAQ,uBAAA;AAAA,MACjC,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,gBAAgB,OAAA,CAAQ;AAAA,KACzB,CAAA;AAAA,IACD;AAAA,MACE,OAAA,CAAQ,cAAA;AAAA,MACR,OAAA,CAAQ,uBAAA;AAAA,MACR,OAAA,CAAQ,WAAA;AAAA,MACR,OAAA,CAAQ,QAAA;AAAA,MACR,OAAA,CAAQ;AAAA;AACV,GACF;AAGA,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIV,eAAiC,IAAI,CAAA;AAC/D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,cAAAA,CAAqB,EAAE,CAAA;AACzD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,kBAAA,GAAqBe,aAA+B,IAAI,CAAA;AAC9D,EAAA,MAAM,mBAAA,GAAsBA,aAAsB,IAAI,CAAA;AAEtD,EAAA,MAAM,YAAA,GAAeL,cAAQ,OAAO;AAAA,IAClC,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,UAAU,MAAA,CAAO;AAAA,MACf,CAAC,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,QAAQ,CAAC,CAAA;AAGrC,EAAAT,gBAAU,MAAM;AACd,IAAA,IAAI,OAAA,CAAQ,aAAA,IAAiB,CAAC,KAAA,IAAS,CAAC,UAAA,EAAY;AAClD,MAAA,WAAA,CAAY,QAAQ,aAAa,CAAA;AAAA,IACnC;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,CAAQ,aAAa,CAAC,CAAA;AAK1B,EAAA,MAAM,iBAAA,GAAoBC,kBAAY,MAAM;AAC1C,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,iBAAA,EAAmB;AACtC,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAO,OAAO,MAAA,KAAoC;AAChD,MAAA,MAAM,WAAW,MAAM,sBAAA;AAAA,QACrB,WAAA;AAAA,QACA,MAAA;AAAA,QACA,iBAAA,CAAkB,WAAA;AAAA,QAClB,EAAE,aAAa,SAAA,EAAU;AAAA,QACzB;AAAA,OACF;AAEA,MAAA,IAAI,CAAC,SAAS,IAAA,EAAM;AAClB,QAAA,MAAM,IAAI,MAAM,kBAAkB,CAAA;AAAA,MACpC;AAEA,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,SAAA,EAAU;AACvC,MAAA,IAAI,MAAA,GAAS,EAAA;AAEb,MAAA,WAAA,MAAiB,KAAA,IAAS,cAAA,CAAe,MAAM,CAAA,EAAG;AAChD,QAAA,IAAI,KAAA,CAAM,SAAS,MAAA,IAAU,KAAA,CAAM,SAAS,SAAA,IAAa,KAAA,CAAM,SAAS,OAAA,EAAS;AAC/E,UAAA,MAAA,IAAU,MAAM,OAAA,IAAW,EAAA;AAAA,QAC7B;AAAA,MACF;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,iBAAA,EAAmB,YAAY,CAAC,CAAA;AAKjD,EAAA,MAAM,WAAA,GAAcA,iBAAAA,CAAY,OAAO,MAAA,KAA6C;AAClF,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,aAAA,CAAc,IAAI,CAAA;AAElB,IAAA,IAAI;AACF,MAAA,MAAM,cAAc,iBAAA,EAAkB;AACtC,MAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,gBAAA,CAAiB,QAAQ,WAAW,CAAA;AACnE,MAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,wBAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAChB,MAAA,MAAM,GAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,iBAAiB,CAAC,CAAA;AAK/B,EAAA,MAAM,KAAA,GAAQA,iBAAAA,CAAY,OAAO,MAAA,KAAkC;AACjE,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAC5B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,MAAA,QAAA,CAAS,uBAAuB,CAAA;AAChC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,QAAA,CAAS,2CAA2C,CAAA;AACpD,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAA2B;AAAA,MAC/B,IAAIe,WAAAA,EAAW;AAAA,MACf,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,MAAA;AAAA,MACT,SAAA,sBAAe,IAAA;AAAK,KACtB;AACA,IAAA,UAAA,CAAW,WAAW,CAAA;AAGtB,IAAA,MAAM,cAAcA,WAAAA,EAAW;AAC/B,IAAA,mBAAA,CAAoB,OAAA,GAAU,WAAA;AAC9B,IAAA,MAAM,gBAAA,GAAgC;AAAA,MACpC,EAAA,EAAI,WAAA;AAAA,MACJ,IAAA,EAAM,WAAA;AAAA,MACN,OAAA,EAAS,EAAA;AAAA,MACT,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,WAAA,EAAa,IAAA;AAAA,MACb,WAAW,EAAC;AAAA,MACZ,gBAAgB;AAAC,KACnB;AACA,IAAA,UAAA,CAAW,gBAAgB,CAAA;AAG3B,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,IAAA,iBAAA,CAAkB,IAAA,CAAK,KAAK,CAAA;AAC5B,IAAA,YAAA,CAAa,EAAE,CAAA;AAGf,IAAA,kBAAA,CAAmB,OAAA,GAAU,IAAI,eAAA,EAAgB;AAEjD,IAAA,IAAI,WAAA,GAAc,EAAA;AAElB,IAAA,IAAI;AAEF,MAAA,MAAM,WAAW,MAAM,sBAAA;AAAA,QACrB,WAAA;AAAA,QACA,MAAA;AAAA,QACA,iBAAA,CAAkB,WAAA;AAAA,QAClB;AAAA,UACE,WAAA,EAAa,KAAA,CAAM,MAAA,CAAO,WAAA,IAAe,SAAA;AAAA,UACzC,YAAA,EAAc,MAAM,MAAA,CAAO,YAAA;AAAA,UAC3B,KAAA,EAAO,MAAM,MAAA,CAAO;AAAA,SACtB;AAAA,QACA;AAAA,OACF;AAEA,MAAA,IAAI,CAAC,SAAS,IAAA,EAAM;AAClB,QAAA,MAAM,IAAI,MAAM,kBAAkB,CAAA;AAAA,MACpC;AAEA,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,SAAA,EAAU;AACvC,MAAA,MAAM,mBAA+B,EAAC;AACtC,MAAA,MAAM,wBAA6C,EAAC;AAGpD,MAAA,WAAA,MAAiB,KAAA,IAAS,cAAA,CAAe,MAAM,CAAA,EAAG;AAEhD,QAAA,IAAI,kBAAA,CAAmB,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS;AAC9C,UAAA;AAAA,QACF;AAEA,QAAA,QAAQ,MAAM,IAAA;AAAM,UAClB,KAAK,MAAA;AAAA,UACL,KAAK,SAAA;AAAA,UACL,KAAK,OAAA;AACH,YAAA,IAAI,MAAM,OAAA,EAAS;AACjB,cAAA,WAAA,IAAe,KAAA,CAAM,OAAA;AACrB,cAAA,aAAA,CAAc,WAAA,EAAa,EAAE,OAAA,EAAS,WAAA,EAAa,CAAA;AAAA,YACrD;AACA,YAAA;AAAA,UAEF,KAAK,WAAA;AAAA,UACL,KAAK,UAAA;AACH,YAAA,IAAI,MAAM,IAAA,EAAM;AACd,cAAA,MAAM,QAAA,GAAqB;AAAA,gBACzB,IAAIA,WAAAA,EAAW;AAAA,gBACf,SAAA,EAAW,MAAM,IAAA,EAAM,WAAA;AAAA,gBACvB,MAAM,KAAA,CAAM,IAAA;AAAA,gBACZ,MAAM,KAAA,CAAM,IAAA;AAAA,gBACZ,MAAA,EAAQ,SAAA;AAAA,gBACR,SAAA,EAAW,KAAK,GAAA;AAAI,eACtB;AACA,cAAA,gBAAA,CAAiB,KAAK,QAAQ,CAAA;AAC9B,cAAA,YAAA,CAAa,CAAC,GAAG,gBAAgB,CAAC,CAAA;AAClC,cAAA,aAAA,CAAc,aAAa,EAAE,SAAA,EAAW,CAAC,GAAG,gBAAgB,GAAG,CAAA;AAAA,YACjE;AACA,YAAA;AAAA,UAEF,KAAK,aAAA;AACH,YAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,gBAAA,CAAiB,MAAA,GAAS,CAAA,EAAG;AAC7C,cAAA,MAAM,YAAY,gBAAA,CAAiB,SAAA;AAAA,gBACjC,QAAM,EAAA,CAAG,IAAA,KAAS,KAAA,CAAM,IAAA,IAAQ,GAAG,MAAA,KAAW;AAAA,eAChD;AACA,cAAA,IAAI,aAAa,CAAA,EAAG;AAClB,gBAAA,gBAAA,CAAiB,SAAS,CAAA,GAAI;AAAA,kBAC5B,GAAG,iBAAiB,SAAS,CAAA;AAAA,kBAC7B,QAAQ,KAAA,CAAM,MAAA;AAAA,kBACd,MAAA,EAAQ,UAAA;AAAA,kBACR,OAAA,EAAS,KAAK,GAAA;AAAI,iBACpB;AACA,gBAAA,YAAA,CAAa,CAAC,GAAG,gBAAgB,CAAC,CAAA;AAClC,gBAAA,aAAA,CAAc,aAAa,EAAE,SAAA,EAAW,CAAC,GAAG,gBAAgB,GAAG,CAAA;AAAA,cACjE;AAAA,YACF;AACA,YAAA;AAAA,UAEF,KAAK,eAAA;AACH,YAAA,IAAI,MAAM,IAAA,EAAM;AACd,cAAA,MAAM,MAAM,KAAA,CAAM,IAAA;AAClB,cAAA,qBAAA,CAAsB,KAAK,GAAG,CAAA;AAC9B,cAAA,gBAAA,CAAiB,GAAG,CAAA;AACpB,cAAA,aAAA,CAAc,aAAa,EAAE,cAAA,EAAgB,CAAC,GAAG,qBAAqB,GAAG,CAAA;AAAA,YAC3E;AACA,YAAA;AAAA,UAEF,KAAK,OAAA;AACH,YAAA,QAAA,CAAS,KAAA,CAAM,SAAS,cAAc,CAAA;AACtC,YAAA;AAAA,UAEF,KAAK,MAAA;AAAA,UACL,KAAK,UAAA;AAEH,YAAA;AAAA;AACJ,MACF;AAGA,MAAA,aAAA,CAAc,WAAA,EAAa;AAAA,QACzB,OAAA,EAAS,WAAA;AAAA,QACT,WAAA,EAAa,KAAA;AAAA,QACb,SAAA,EAAW,gBAAA;AAAA,QACX,cAAA,EAAgB;AAAA,OACjB,CAAA;AAGD,MAAA,OAAA,CAAQ,gBAAA,CAAiB,MAAM,EAAE,CAAA;AAGjC,MAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,QAAA,MAAM,QAAQ,GAAA,CAAI;AAAA,UAChB,eAAA,EAAgB;AAAA,UAChB,qBAAA;AAAsB,SACvB,CAAA;AAAA,MACH;AAAA,IAEF,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,cAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAEhB,MAAA,aAAA,CAAc,WAAA,EAAa;AAAA,QACzB,OAAA,EAAS,WAAA,IAAe,CAAA,OAAA,EAAU,OAAO,CAAA,CAAA;AAAA,QACzC,WAAA,EAAa;AAAA,OACd,CAAA;AAAA,IACH,CAAA,SAAE;AACA,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,MAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,MAAA,mBAAA,CAAoB,OAAA,GAAU,IAAA;AAC9B,MAAA,kBAAA,CAAmB,OAAA,GAAU,IAAA;AAAA,IAC/B;AAAA,EACF,CAAA,EAAG;AAAA,IACD,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA;AAAA,IACA,iBAAA;AAAA,IACA,gBAAA;AAAA,IACA,eAAA;AAAA,IACA,qBAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AAKD,EAAA,MAAM,KAAA,GAAQf,kBAAY,MAAM;AAE9B,IAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,MAAA,kBAAA,CAAmB,QAAQ,KAAA,EAAM;AAAA,IACnC;AAEA,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,YAAA,CAAa,EAAE,CAAA;AACf,IAAA,cAAA,CAAe,KAAK,CAAA;AACpB,IAAA,aAAA,CAAc,KAAK,CAAA;AACnB,IAAA,YAAA,EAAa;AAAA,EACf,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAKjB,EAAA,MAAMgB,WAAAA,GAAahB,kBAAY,MAAyB;AACtD,IAAA,OAAO,QAAQ,UAAA,EAAW;AAAA,EAC5B,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAKZ,EAAA,MAAM,kBAAA,GAAqBA,iBAAAA,CAAY,CAAC,OAAA,KAAoB;AAC1D,IAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA;AAChD,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,QAAA,CAAS,eAAe,CAAA;AACxB,MAAA,OAAA,CAAQ,iBAAiB,OAAO,CAAA;AAChC,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,CAAA,MAAA,EAAS,OAAO,CAAA,UAAA,CAAY,CAAA;AAAA,IACvC;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAKZ,EAAA,MAAM,WAAA,GAAcA,iBAAAA,CAAY,CAAC,OAAA,KAA6B;AAC5D,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,WAAA,CAAY,OAAO,CAAA;AAG3C,IAAA,IAAI,OAAA,IAAW,KAAA,EAAO,EAAA,KAAO,OAAA,EAAS;AACpC,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf;AAEA,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,EAAG,CAAC,OAAA,EAAS,KAAK,CAAC,CAAA;AAEnB,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA,EAAAgB,WAAAA;AAAA,IACA,QAAA,EAAU,kBAAA;AAAA,IACV;AAAA,GACF;AACF;ACpYO,SAAS,YAAA,CAAa,OAAA,GAA4B,EAAC,EAAuB;AAC/E,EAAA,MAAM;AAAA,IACJ,WAAA,GAAc,IAAA;AAAA,IACd,gBAAA,GAAmB,KAAA;AAAA,IACnB;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM;AAAA,IACJ,eAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,MACE,YAAA,EAAa;AAEjB,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIlB,eAAS,KAAK,CAAA;AAE1D,EAAA,MAAM,eAAe,iBAAA,KAAsB,IAAA;AAC3C,EAAA,MAAM,YAAY,CAAC,aAAA;AAGnB,EAAA,MAAM,SAAA,GAAYU,cAAQ,MAAM;AAC9B,IAAA,IAAI,CAAC,eAAe,OAAO,KAAA;AAC3B,IAAA,IAAI,WAAA,IAAe,CAAC,eAAA,EAAiB,OAAO,KAAA;AAC5C,IAAA,IAAI,gBAAA,IAAoB,CAAC,YAAA,EAAc,OAAO,KAAA;AAC9C,IAAA,OAAO,IAAA;AAAA,EACT,GAAG,CAAC,aAAA,EAAe,aAAa,eAAA,EAAiB,gBAAA,EAAkB,YAAY,CAAC,CAAA;AAGhF,EAAAT,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,aAAA,EAAe;AAEpB,IAAA,IAAI,WAAA,IAAe,CAAC,eAAA,IAAmB,UAAA,EAAY;AACjD,MAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,aAAA,EAAe,WAAA,EAAa,eAAA,EAAiB,UAAU,CAAC,CAAA;AAE5D,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAA;AAAA,IACA,UAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF;AACF;ACjDO,SAAS,kBAAA,CAAmB,OAAA,GAAqC,EAAC,EAA6B;AACpG,EAAA,MAAM;AAAA,IACJ,YAAA,GAAe,GAAA;AAAA,IACf,QAAA,GAAW,IAAA;AAAA,IACX,YAAA,GAAe;AAAA,GACjB,GAAI,OAAA;AAEJ,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,YAAA,EAAa;AAEhC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAID,eAA2B,SAAS,CAAA;AAChE,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAC1D,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAsB,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,OAAA,GAAU,OAAO,OAAA,IAAW,gCAAA;AAElC,EAAA,MAAM,eAAA,GAAkBE,kBAAY,YAAY;AAC9C,IAAA,IAAI,UAAA,EAAY;AAEhB,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,SAAA,CAAU,YAAY,CAAA;AACtB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AAEvB,IAAA,IAAI;AAEF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,OAAA,CAAA,EAAW;AAAA,QAChD,MAAA,EAAQ,KAAA;AAAA,QACR,IAAA,EAAM,MAAA;AAAA,QACN,KAAA,EAAO;AAAA,OACR,CAAA;AAED,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAC7B,MAAA,UAAA,CAAW,OAAO,CAAA;AAElB,MAAA,IAAI,SAAS,EAAA,EAAI;AACf,QAAA,SAAA,CAAU,WAAW,CAAA;AACrB,QAAA,gBAAA,iBAAiB,IAAI,MAAM,CAAA;AAC3B,QAAA,QAAA,CAAS,IAAI,CAAA;AAAA,MACf,CAAA,MAAO;AACL,QAAA,SAAA,CAAU,OAAO,CAAA;AACjB,QAAA,QAAA,CAAS,CAAA,gBAAA,EAAmB,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,MAC/C;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,SAAA,CAAU,cAAc,CAAA;AACxB,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,mBAAmB,CAAA;AAAA,IACnE,CAAA,SAAE;AACA,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,UAAU,CAAC,CAAA;AAGxB,EAAAD,gBAAU,MAAM;AACd,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,eAAA,EAAgB;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAGjB,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,IAAY,YAAA,IAAgB,CAAA,EAAG;AAEpC,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,eAAA,EAAiB,YAAY,CAAA;AAC1D,IAAA,OAAO,MAAM,cAAc,QAAQ,CAAA;AAAA,EACrC,CAAA,EAAG,CAAC,QAAA,EAAU,YAAA,EAAc,eAAe,CAAC,CAAA;AAE5C,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,aAAa,MAAA,KAAW,WAAA;AAAA,IACxB,UAAA;AAAA,IACA,OAAA;AAAA,IACA,aAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;AC5EO,SAAS,iBAAA,GAA6C;AAC3D,EAAA,MAAM,EAAE,WAAA,EAAa,MAAA,EAAO,GAAI,YAAA,EAAa;AAE7C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAID,cAAAA,CAAwB,EAAE,CAAA;AACpD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAA2B,IAAI,CAAA;AACzD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,cAAAA,CAAS;AAAA,IAC3C,IAAA,EAAM,CAAA;AAAA,IACN,KAAA,EAAO,EAAA;AAAA,IACP,UAAA,EAAY,CAAA;AAAA,IACZ,OAAA,EAAS;AAAA,GACV,CAAA;AAGD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAS,EAAE,CAAA;AACvC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAA0B,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAA4B,IAAI,CAAA;AAExE,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,UAAU,MAAA,CAAO;AAAA,GACnB;AAEA,EAAA,MAAM,UAAA,GAAa,OAAO,IAAA,KAAS,MAAA;AAKnC,EAAAC,gBAAU,MAAM;AACd,IAAA,MAAM,mBAAmB,YAAY;AACnC,MAAA,IAAI,CAAC,WAAA,IAAe,CAAC,UAAA,EAAY;AAC/B,QAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,UAAA,EAAY;AAEd,QAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,GAAW,MAAM,qBAAA,CAAyB,WAAA,EAAc,YAAY,CAAA;AAC1E,QAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAChC,UAAA,iBAAA,CAAkB,QAAA,CAAS,KAAK,cAAc,CAAA;AAAA,QAChD;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,MACzB;AAAA,IACF,CAAA;AAEA,IAAA,gBAAA,EAAiB;AAAA,EACnB,CAAA,EAAG,CAAC,WAAA,EAAa,UAAA,EAAY,YAAY,CAAC,CAAA;AAK1C,EAAA,MAAM,YAAA,GAAeC,iBAAAA,CAAY,OAAO,MAAA,KAA2C;AACjF,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,YAAA,CAAa,IAAI,CAAA;AAEjB,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,UAAA,EAAY;AAC/B,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAC5B,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,CAAU,KAAK,GAAG,CAAA;AAGxB,QAAA,IAAI,QAAA,GAAW,CAAC,GAAG,gBAAgB,CAAA;AAEnC,QAAA,MAAM,UAAA,GAAa,QAAQ,MAAA,IAAU,MAAA;AACrC,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,MAAM,KAAA,GAAQ,WAAW,WAAA,EAAY;AACrC,UAAA,QAAA,GAAW,QAAA,CAAS,MAAA;AAAA,YAAO,CAAA,CAAA,KACzB,CAAA,CAAE,KAAA,CAAM,WAAA,EAAY,CAAE,QAAA,CAAS,KAAK,CAAA,IACpC,CAAA,CAAE,IAAA,EAAM,WAAA,EAAY,CAAE,SAAS,KAAK;AAAA,WACtC;AAAA,QACF;AAEA,QAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,UAAA;AAC7B,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,IAAI,CAAA;AAAA,QACjD;AAEA,QAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,YAAA;AACjC,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,MAAM,CAAA;AAAA,QACrD;AAEA,QAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,QAAA,aAAA,CAAc,CAAA,IAAA,MAAS;AAAA,UACrB,GAAG,IAAA;AAAA,UACH,IAAA,EAAM,MAAA,EAAQ,IAAA,IAAQ,IAAA,CAAK,IAAA;AAAA,UAC3B,KAAA,EAAO,MAAA,EAAQ,KAAA,IAAS,IAAA,CAAK,KAAA;AAAA,UAC7B,YAAY,QAAA,CAAS,MAAA;AAAA,UACrB,OAAA,EAAS;AAAA,SACX,CAAE,CAAA;AACF,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAa,WAAA,EAAc;AAAA,QAChD,IAAA,EAAM,MAAA,EAAQ,IAAA,IAAQ,UAAA,CAAW,IAAA;AAAA,QACjC,KAAA,EAAO,MAAA,EAAQ,KAAA,IAAS,UAAA,CAAW,KAAA;AAAA,QACnC,MAAA,EAAQ,QAAQ,MAAA,IAAU,MAAA;AAAA,QAC1B,IAAA,EAAM,MAAA,EAAQ,IAAA,IAAQ,UAAA,IAAc,KAAA,CAAA;AAAA,QACpC,MAAA,EAAQ,MAAA,EAAQ,MAAA,IAAU,YAAA,IAAgB,KAAA,CAAA;AAAA,QAC1C,QAAQ,MAAA,EAAQ,MAAA;AAAA,QAChB,WAAW,MAAA,EAAQ;AAAA,SAClB,YAAY,CAAA;AAEf,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAChC,QAAA,QAAA,CAAS,QAAA,CAAS,KAAK,KAAK,CAAA;AAC5B,QAAA,aAAA,CAAc;AAAA,UACZ,IAAA,EAAM,SAAS,IAAA,CAAK,IAAA;AAAA,UACpB,KAAA,EAAO,SAAS,IAAA,CAAK,KAAA;AAAA,UACrB,UAAA,EAAY,SAAS,IAAA,CAAK,UAAA;AAAA,UAC1B,OAAA,EAAS,SAAS,IAAA,CAAK;AAAA,SACxB,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,QAAA,CAAS,SAAS,sBAAsB,CAAA;AAAA,MACnD;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,sBAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAAA,IAClB,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,UAAA,EAAY,YAAA,EAAc,UAAA,CAAW,IAAA,EAAM,UAAA,CAAW,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAY,YAAY,CAAC,CAAA;AAK/G,EAAA,MAAMiB,QAAAA,GAAUjB,iBAAAA,CAAY,OAAO,MAAA,KAAgD;AACjF,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,UAAA,EAAY;AAC/B,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAC5B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,CAAU,KAAK,GAAG,CAAA;AACxB,QAAA,OAAO,iBAAiB,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,EAAA,KAAO,MAAM,CAAA,IAAK,IAAA;AAAA,MACxD;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAW,WAAA,EAAc,QAAQ,YAAY,CAAA;AACpE,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAChC,QAAA,OAAO,SAAS,IAAA,CAAK,IAAA;AAAA,MACvB;AAEA,MAAA,QAAA,CAAS,QAAA,CAAS,SAAS,gBAAgB,CAAA;AAC3C,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,oBAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,UAAA,EAAY,YAAY,CAAC,CAAA;AAK1C,EAAA,MAAMkB,WAAAA,GAAalB,iBAAAA,CAAY,OAC7B,MAAA,EACA,OAAA,KACqB;AACrB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,UAAA,EAAY;AAC/B,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAC5B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,CAAU,KAAK,GAAG,CAAA;AAExB,QAAA,QAAA,CAAS,UAAQ,IAAA,CAAK,GAAA;AAAA,UAAI,CAAA,CAAA,KACxB,EAAE,EAAA,KAAO,MAAA,GAAS,EAAE,GAAG,CAAA,EAAG,GAAG,OAAA,EAAQ,GAAI;AAAA,SAC1C,CAAA;AACD,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,WAAW,MAAM,UAAA,CAAc,WAAA,EAAc,MAAA,EAAQ,SAAS,YAAY,CAAA;AAChF,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAEhC,QAAA,QAAA,CAAS,UAAQ,IAAA,CAAK,GAAA;AAAA,UAAI,OACxB,CAAA,CAAE,EAAA,KAAO,MAAA,GAAS,QAAA,CAAS,KAAM,IAAA,GAAO;AAAA,SACzC,CAAA;AACD,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,QAAA,CAAS,QAAA,CAAS,SAAS,uBAAuB,CAAA;AAClD,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,uBAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAChB,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,UAAA,EAAY,YAAY,CAAC,CAAA;AAK1C,EAAA,MAAMmB,YAAAA,GAAcnB,iBAAAA,CAAY,OAC9B,MAAA,EACA,MAAA,KACqB;AACrB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,UAAA,EAAY;AAC/B,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAC5B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,CAAU,KAAK,GAAG,CAAA;AACxB,QAAA,QAAA,CAAS,UAAQ,IAAA,CAAK,GAAA;AAAA,UAAI,CAAA,CAAA,KACxB,EAAE,EAAA,KAAO,MAAA,GAAS,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,WAAA,EAA0B,GAAI;AAAA,SACjE,CAAA;AACD,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,WAAW,MAAM,WAAA,CAAe,WAAA,EAAc,MAAA,EAAQ,QAAQ,YAAY,CAAA;AAChF,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAChC,QAAA,QAAA,CAAS,UAAQ,IAAA,CAAK,GAAA;AAAA,UAAI,OACxB,CAAA,CAAE,EAAA,KAAO,MAAA,GAAS,QAAA,CAAS,KAAM,IAAA,GAAO;AAAA,SACzC,CAAA;AACD,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,QAAA,CAAS,QAAA,CAAS,SAAS,wBAAwB,CAAA;AACnD,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,wBAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAChB,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,UAAA,EAAY,YAAY,CAAC,CAAA;AAK1C,EAAA,MAAMoB,eAAAA,GAAiBpB,iBAAAA,CAAY,OAAO,MAAA,KAAqC;AAC7E,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,UAAA,EAAY;AAC/B,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAC5B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,CAAU,KAAK,GAAG,CAAA;AACxB,QAAA,QAAA,CAAS,UAAQ,IAAA,CAAK,GAAA;AAAA,UAAI,CAAA,CAAA,KACxB,EAAE,EAAA,KAAO,MAAA,GAAS,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,QAAA,EAAuB,GAAI;AAAA,SAC9D,CAAA;AACD,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,cAAA,CAAkB,WAAA,EAAc,QAAQ,YAAY,CAAA;AAC3E,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAChC,QAAA,QAAA,CAAS,UAAQ,IAAA,CAAK,GAAA;AAAA,UAAI,OACxB,CAAA,CAAE,EAAA,KAAO,MAAA,GAAS,QAAA,CAAS,KAAM,IAAA,GAAO;AAAA,SACzC,CAAA;AACD,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,QAAA,CAAS,QAAA,CAAS,SAAS,2BAA2B,CAAA;AACtD,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,2BAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAChB,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,UAAA,EAAY,YAAY,CAAC,CAAA;AAK1C,EAAA,MAAMqB,WAAAA,GAAarB,iBAAAA,CAAY,OAAO,MAAA,KAAqC;AACzE,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,UAAA,EAAY;AAC/B,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAC5B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,CAAU,KAAK,GAAG,CAAA;AACxB,QAAA,QAAA,CAAS,UAAQ,IAAA,CAAK,MAAA,CAAO,OAAK,CAAA,CAAE,EAAA,KAAO,MAAM,CAAC,CAAA;AAClD,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,UAAA,CAAc,WAAA,EAAc,QAAQ,YAAY,CAAA;AACvE,MAAA,IAAI,SAAS,EAAA,EAAI;AACf,QAAA,QAAA,CAAS,UAAQ,IAAA,CAAK,MAAA,CAAO,OAAK,CAAA,CAAE,EAAA,KAAO,MAAM,CAAC,CAAA;AAClD,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,QAAA,CAAS,QAAA,CAAS,SAAS,uBAAuB,CAAA;AAClD,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,uBAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAChB,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,UAAA,EAAY,YAAY,CAAC,CAAA;AAK1C,EAAA,MAAMsB,gBAAAA,GAAkBtB,iBAAAA,CAAY,OAClC,MAAA,EACA,QAAgB,EAAA,KACe;AAC/B,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,UAAA,EAAY;AAC/B,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAC5B,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,CAAU,KAAK,GAAG,CAAA;AACxB,QAAA,OAAO,gBAAA,CAAiB,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,MAAM,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAAA,MACzE;AAEA,MAAA,MAAM,WAAW,MAAM,eAAA,CAAmB,WAAA,EAAc,MAAA,EAAQ,OAAO,YAAY,CAAA;AACnF,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAChC,QAAA,OAAO,SAAS,IAAA,CAAK,UAAA;AAAA,MACvB;AAEA,MAAA,QAAA,CAAS,QAAA,CAAS,SAAS,wBAAwB,CAAA;AACnD,MAAA,OAAO,EAAC;AAAA,IACV,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,wBAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAChB,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,UAAA,EAAY,YAAY,CAAC,CAAA;AAK1C,EAAA,MAAM,YAAA,GAAeA,kBAAY,YAA2B;AAC1D,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,UAAA,EAAY;AAC/B,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAC5B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,SAAA,CAAU,KAAK,GAAG,CAAA;AACxB,QAAA,QAAA,CAAS,aAAa,CAAA;AACtB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAgB,WAAA,EAAc,YAAY,CAAA;AACjE,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAChC,QAAA,QAAA,CAAS,SAAS,IAAI,CAAA;AAAA,MACxB,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,QAAA,CAAS,SAAS,sBAAsB,CAAA;AAAA,MACnD;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,sBAAA;AACrD,MAAA,QAAA,CAAS,OAAO,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,UAAA,EAAY,YAAY,CAAC,CAAA;AAK1C,EAAA,MAAM,OAAA,GAAUA,iBAAAA,CAAY,CAAC,IAAA,KAAiB;AAC5C,IAAA,aAAA,CAAc,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,MAAK,CAAE,CAAA;AAAA,EAC3C,CAAA,EAAG,EAAE,CAAA;AAKL,EAAA,MAAM,qBAAA,GAAwBA,iBAAAA,CAAY,CAAC,IAAA,KAA0B;AACnE,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,aAAA,CAAc,WAAS,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,GAAE,CAAE,CAAA;AAAA,EAC9C,CAAA,EAAG,EAAE,CAAA;AAKL,EAAA,MAAM,uBAAA,GAA0BA,iBAAAA,CAAY,CAAC,MAAA,KAA8B;AACzE,IAAA,eAAA,CAAgB,MAAM,CAAA;AACtB,IAAA,aAAA,CAAc,WAAS,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,GAAE,CAAE,CAAA;AAAA,EAC9C,CAAA,EAAG,EAAE,CAAA;AAKL,EAAA,MAAM,iBAAA,GAAoBA,iBAAAA,CAAY,CAAC,UAAA,KAAuB;AAC5D,IAAA,SAAA,CAAU,UAAU,CAAA;AACpB,IAAA,aAAA,CAAc,WAAS,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,GAAE,CAAE,CAAA;AAAA,EAC9C,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAD,gBAAU,MAAM;AACd,IAAA,IAAI,eAAe,UAAA,EAAY;AAC7B,MAAA,YAAA,EAAa;AACb,MAAA,YAAA,EAAa;AAAA,IACf;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,UAAU,CAAC,CAAA;AAE5B,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA,EAAAkB,QAAAA;AAAA,IACA,UAAA,EAAAC,WAAAA;AAAA,IACA,WAAA,EAAAC,YAAAA;AAAA,IACA,cAAA,EAAAC,eAAAA;AAAA,IACA,UAAA,EAAAC,WAAAA;AAAA,IACA,eAAA,EAAAC,gBAAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA,EAAW,iBAAA;AAAA,IACX,aAAA,EAAe,qBAAA;AAAA,IACf,eAAA,EAAiB,uBAAA;AAAA,IACjB;AAAA,GACF;AACF;ACrcO,SAAS,QAAA,GAA2B;AACzC,EAAA,MAAM,EAAE,WAAA,EAAa,MAAA,EAAO,GAAI,YAAA,EAAa;AAE7C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIxB,cAAAA,CAA8B,EAAE,CAAA;AAC1D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,UAAA,GAAa,OAAO,IAAA,KAAS,MAAA;AACnC,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,UAAU,MAAA,CAAO;AAAA,GACnB;AAKA,EAAA,MAAM,aAAA,GAAgB,CAAC,GAAA,MAAqD;AAAA,IAC1E,EAAA,EAAK,GAAA,CAAI,OAAA,IAAW,GAAA,CAAI,EAAA,IAAM,EAAA;AAAA,IAC9B,IAAA,EAAO,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,IAAA,IAAQ,EAAA;AAAA,IACpC,GAAA,EAAM,IAAI,GAAA,IAAO,EAAA;AAAA,IACjB,QAAA,EAAW,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,QAAA;AAAA,IAChC,QAAA,EAAW,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,QAAA,IAAY,WAAA;AAAA,IAC5C,SAAA,EAAY,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,SAAA,IAAa,CAAA;AAAA,IAC/C,UAAA,EAAa,GAAA,CAAI,WAAA,IAAe,GAAA,CAAI,UAAA;AAAA,IACpC,SAAA,EAAY,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,SAAA,IAAa,EAAA;AAAA,IAC/C,aAAc,GAAA,CAAI,WAAA;AAAA,IAClB,UAAW,GAAA,CAAI,QAAA;AAAA,IACf,cAAA,EAAiB,GAAA,CAAI,eAAA,IAAmB,GAAA,CAAI,cAAA;AAAA,IAC5C,WAAA,EAAc,GAAA,CAAI,YAAA,IAAgB,GAAA,CAAI,WAAA;AAAA,IACtC,YAAA,EAAe,GAAA,CAAI,aAAA,IAAiB,GAAA,CAAI,YAAA;AAAA,IACxC,KAAA,EAAQ,IAAI,KAAA,IAAS;AAAA,GACvB,CAAA;AAKA,EAAA,MAAM,YAAA,GAAeE,kBAAY,YAAY;AAC3C,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,UAAA,EAAY;AACjC,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,QAAA,CAAS,EAAE,CAAA;AACX,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,SAAA,CAAa,WAAA,EAAc,YAAY,CAAA;AAC9D,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAChC,QAAA,MAAM,QAAA,GAAY,SAAS,IAAA,CAAiC,KAAA;AAC5D,QAAA,QAAA,CAAA,CAAU,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,aAAa,CAAC,CAAA;AAAA,MAC9C,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,QAAA,CAAS,SAAS,sBAAsB,CAAA;AAAA,MACnD;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,sBAAsB,CAAA;AAAA,IACtE,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,WAAA,EAAa,UAAA,EAAY,MAAA,CAAO,OAAO,CAAC,CAAA;AAG5C,EAAAD,gBAAU,MAAM;AACd,IAAA,YAAA,EAAa;AAAA,EACf,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAKjB,EAAA,MAAMwB,WAAAA,GAAavB,iBAAAA,CAAY,OAAO,MAAA,KAAgE;AACpG,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,UAAA,EAAY;AAC/B,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAC5B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,UAAA,CAAc,WAAA,EAAc,QAAQ,YAAY,CAAA;AACvE,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAChC,QAAA,MAAM,OAAO,QAAA,CAAS,IAAA;AACtB,QAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,MAAM,UAAA,GAAa,cAAc,IAAI,CAAA;AACrC,UAAA,QAAA,CAAS,CAAA,IAAA,KAAQ,CAAC,UAAA,EAAY,GAAG,IAAI,CAAC,CAAA;AACtC,UAAA,OAAO,UAAA;AAAA,QACT;AAEA,QAAA,OAAO;AAAA,UACL,IAAI,IAAA,CAAK,OAAA;AAAA,UACT,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,GAAA,EAAK,EAAA;AAAA,UACL,QAAA,EAAU,OAAO,QAAA,IAAY,WAAA;AAAA,UAC7B,SAAA,EAAW,CAAA;AAAA,UACX,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,SACpC;AAAA,MACF;AACA,MAAA,QAAA,CAAS,QAAA,CAAS,SAAS,uBAAuB,CAAA;AAClD,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,uBAAuB,CAAA;AACrE,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,GAAG,CAAC,WAAA,EAAa,UAAA,EAAY,MAAA,CAAO,OAAO,CAAC,CAAA;AAK5C,EAAA,MAAM,OAAA,GAAUA,iBAAAA,CAAY,OAAO,MAAA,EAAgB,MAAc,OAAA,KAAsC;AACrG,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAC5B,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,WAAA,CAAe,aAAa,MAAA,EAAQ,IAAA,EAAM,SAAS,YAAY,CAAA;AACtF,MAAA,OAAO,QAAA,CAAS,EAAA;AAAA,IAClB,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,oBAAoB,CAAA;AAClE,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,MAAA,CAAO,OAAO,CAAC,CAAA;AAKhC,EAAA,MAAM,WAAA,GAAcA,iBAAAA,CAAY,OAAO,MAAA,KAAsD;AAC3F,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAC5B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,iBAAA,CAAqB,WAAA,EAAa,QAAQ,YAAY,CAAA;AAC7E,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAChC,QAAA,MAAM,IAAA,GAAQ,SAAS,IAAA,CAAiC,IAAA;AACxD,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,MAAM,UAAA,GAAa,cAAc,IAAI,CAAA;AACrC,UAAA,MAAM,YAAA,EAAa;AACnB,UAAA,OAAO,UAAA;AAAA,QACT;AAAA,MACF;AACA,MAAA,QAAA,CAAS,QAAA,CAAS,SAAS,wBAAwB,CAAA;AACnD,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,wBAAwB,CAAA;AACtE,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,GAAG,CAAC,WAAA,EAAa,MAAA,CAAO,OAAA,EAAS,YAAY,CAAC,CAAA;AAK9C,EAAA,MAAMwB,WAAAA,GAAaxB,iBAAAA,CAAY,OAAO,MAAA,KAAqC;AACzE,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,QAAA,CAAS,mBAAmB,CAAA;AAC5B,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,UAAA,CAAc,WAAA,EAAa,QAAQ,YAAY,CAAA;AACtE,MAAA,IAAI,SAAS,EAAA,EAAI;AACf,QAAA,QAAA,CAAS,UAAQ,IAAA,CAAK,MAAA,CAAO,OAAK,CAAA,CAAE,EAAA,KAAO,MAAM,CAAC,CAAA;AAClD,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,QAAA,CAAS,QAAA,CAAS,SAAS,uBAAuB,CAAA;AAClD,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,uBAAuB,CAAA;AACrE,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,MAAA,CAAO,OAAO,CAAC,CAAA;AAEhC,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA,EAAAuB,WAAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA,EAAAC,WAAAA;AAAA,IACA;AAAA,GACF;AACF;ACxMO,SAAS,SAAA,GAA6B;AAC3C,EAAA,MAAM,YAAY,oBAAA,EAAqB;AAEvC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI1B,cAAAA,CAAsB,EAAE,CAAA;AACpD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,OAAA,EAAS,WAAW,MAAA,EAAQ,OAAA;AAAA,IAC5B,QAAA,EAAU,WAAW,MAAA,EAAQ;AAAA,GAC/B;AAEA,EAAA,MAAM,aAAA,GAAgBE,kBAAY,YAAY;AAC5C,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAc,YAAY,CAAA;AAC/C,MAAA,IAAI,MAAA,CAAO,EAAA,IAAM,MAAA,CAAO,IAAA,EAAM;AAE5B,QAAA,MAAM,aAAa,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAY;AAAA,UACrD,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,WAAA,EAAa,EAAE,WAAA,IAAe,EAAA;AAAA,UAC9B,KAAA,EAAO,CAAA,CAAE,KAAA,IAAS,EAAC;AAAA,UACnB,cAAA,EAAgB,CAAA,CAAE,eAAA,IAAmB,CAAA,CAAE,kBAAkB,EAAC;AAAA,UAC1D,MAAA,EAAQ,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,UAAU,EAAC;AAAA,UAClC,UAAA,EAAY,CAAA,CAAE,WAAA,IAAe,CAAA,CAAE,UAAA,IAAc;AAAA,SAC/C,CAAE,CAAA;AACF,QAAA,SAAA,CAAU,UAAU,CAAA;AAAA,MACtB,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,MAAA,CAAO,SAAS,wBAAwB,CAAA;AAAA,MACnD;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,QAAA,CAAS,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,wBAAwB,CAAA;AAAA,IACpE,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,MAAA,EAAQ,OAAO,CAAC,CAAA;AAE/B,EAAAD,gBAAU,MAAM;AACd,IAAA,aAAA,EAAc;AAAA,EAChB,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,KAAA,EAAO,aAAA,EAAc;AACnD;ACAO,SAAS,kBACd,OAAA,EAC4B;AAC5B,EAAA,MAAM,EAAE,SAAA,EAAW,QAAA,EAAS,GAAI,OAAA;AAChC,EAAA,MAAM,EAAE,WAAA,EAAa,MAAA,EAAO,GAAI,YAAA,EAAa;AAE7C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAID,eAAmB,IAAI,CAAA;AACnD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAGtD,EAAA,MAAM,WAAA,GAAce,aAAO,KAAK,CAAA;AAEhC,EAAA,MAAM,MAAA,GAASb,iBAAAA;AAAA,IACb,OAAO,MAAA,GAA8B,EAAC,KAAyB;AAC7D,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,MAAM,GAAA,GAAM,6CAAA;AACZ,QAAA,QAAA,CAAS,GAAG,CAAA;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oBAAA,EAAuB,GAAG,CAAA,CAAE,CAAA;AAC1C,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,IAAI,YAAY,OAAA,EAAS;AACvB,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,oBAAA,EAAuB,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,kCAAA,CAA+B,CAAA;AACxF,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,QAAA,CAAS,IAAI,CAAA;AAEb,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,MAAM,UAAA;AAAA,UACrB,WAAA;AAAA,UACA,SAAA;AAAA,UACA,QAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,UAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,IAAS,CAAA,wBAAA,EAA2B,SAAS,MAAM,CAAA,CAAA,CAAA;AAC3E,UAAA,QAAA,CAAS,MAAM,CAAA;AACf,UAAA,OAAA,CAAQ,MAAM,CAAA,oBAAA,EAAuB,SAAS,CAAA,CAAA,EAAI,QAAQ,YAAY,MAAM,CAAA;AAC5E,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,UAAA,GAAa,QAAA,CAAS,IAAA,EAAM,MAAA,IAAW,QAAA,CAAS,IAAA;AACtD,QAAA,SAAA,CAAU,UAAU,CAAA;AACpB,QAAA,OAAO,UAAA;AAAA,MACT,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,MAAA,GAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,wBAAA;AACpD,QAAA,QAAA,CAAS,MAAM,CAAA;AACf,QAAA,OAAA,CAAQ,MAAM,CAAA,oBAAA,EAAuB,SAAS,CAAA,CAAA,EAAI,QAAQ,WAAW,GAAG,CAAA;AACxE,QAAA,OAAO,IAAA;AAAA,MACT,CAAA,SAAE;AACA,QAAA,WAAA,CAAY,OAAA,GAAU,KAAA;AACtB,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,WAAA,EAAa,MAAA,EAAQ,SAAA,EAAW,QAAQ;AAAA,GAC3C;AAEA,EAAA,MAAM,KAAA,GAAQA,kBAAY,MAAM;AAC9B,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,OAAO,KAAA,EAAM;AACnD;ACjEA,IAAM,aAAA,GAAkC;AAAA,EACtC,MAAA,EAAQ,EAAE,SAAA,EAAW,KAAA,EAAM;AAAA,EAC3B,MAAA,EAAQ,EAAE,SAAA,EAAW,KAAA,EAAM;AAAA,EAC3B,MAAA,EAAQ,EAAE,SAAA,EAAW,KAAA,EAAM;AAAA,EAC3B,OAAA,EAAS,EAAE,SAAA,EAAW,KAAA,EAAM;AAAA,EAC5B,MAAA,EAAQ,EAAE,SAAA,EAAW,KAAA;AACvB,CAAA;AAMO,SAAS,cAAA,GAAuC;AACrD,EAAA,MAAM,EAAE,WAAA,EAAa,MAAA,EAAO,GAAI,YAAA,EAAa;AAC7C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIF,eAA2B,aAAa,CAAA;AAC9E,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,eAAe,EAAE,OAAA,EAAS,OAAO,OAAA,EAAS,QAAA,EAAU,OAAO,QAAA,EAAS;AAG1E,EAAA,MAAM,OAAA,GAAUE,kBAAY,YAAY;AACtC,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,CAAC,WAAW,SAAA,EAAW,SAAA,EAAW,YAAY,SAAS,CAAA,GAAI,MAAM,OAAA,CAAQ,UAAA,CAAW;AAAA,QACxF,cAAA,CAAoB,qBAAA,EAAuB,EAAE,WAAA,IAAe,YAAY,CAAA;AAAA,QACxE,cAAA,CAAoB,qBAAA,EAAuB,EAAE,WAAA,IAAe,YAAY,CAAA;AAAA,QACxE,cAAA,CAAoB,qBAAA,EAAuB,EAAE,WAAA,IAAe,YAAY,CAAA;AAAA,QACxE,cAAA,CAAoB,sBAAA,EAAwB,EAAE,WAAA,IAAe,YAAY,CAAA;AAAA,QACzE,cAAA,CAAoB,qBAAA,EAAuB,EAAE,WAAA,IAAe,YAAY;AAAA,OACzE,CAAA;AAED,MAAA,MAAM,aAAA,GAAgB,CAAC,GAAA,KACrB,GAAA,CAAI,WAAW,WAAA,IAAe,GAAA,CAAI,KAAA,CAAM,EAAA,GAAK,GAAA,CAAI,KAAA,CAAM,IAAA,GAAO,EAAE,WAAW,KAAA,EAAM;AAEnF,MAAA,cAAA,CAAe;AAAA,QACb,MAAA,EAAQ,cAAc,SAAS,CAAA;AAAA,QAC/B,MAAA,EAAQ,cAAc,SAAS,CAAA;AAAA,QAC/B,MAAA,EAAQ,cAAc,SAAS,CAAA;AAAA,QAC/B,OAAA,EAAS,cAAc,UAAU,CAAA;AAAA,QACjC,MAAA,EAAQ,cAAc,SAAS;AAAA,OAChC,CAAA;AAAA,IACH,SAAS,GAAA,EAAU;AACjB,MAAA,QAAA,CAAS,GAAA,CAAI,WAAW,mCAAmC,CAAA;AAAA,IAC7D,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,WAAA,EAAa,OAAO,OAAA,EAAS,MAAA,CAAO,QAAQ,CAAC,CAAA;AAGjD,EAAAD,gBAAU,MAAM;AACd,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,MAAM,OAAA,GAAUC,iBAAAA,CAAY,OAAO,QAAA,EAA2B,QAAA,KAA+B;AAC3F,IAAA,IAAI,CAAC,WAAA,EAAa,MAAM,IAAI,MAAM,mBAAmB,CAAA;AACrD,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,IAAI,QAAA;AAEJ,MAAA,IAAI,aAAa,QAAA,EAAU;AACzB,QAAA,MAAM,MAAA,GAAS,QAAA,EAAU,IAAA,CAAK,GAAG,CAAA,IAAK,KAAA;AAKtC,QAAA,MAAM,YAAY,MAAM;AACtB,UAAA,MAAM,CAAA,GAAI,IAAI,GAAA,CAAI,MAAA,CAAO,SAAS,IAAI,CAAA;AACtC,UAAA,CAAC,cAAA,EAAgB,OAAA,EAAS,SAAS,CAAA,CAAE,OAAA,CAAQ,OAAK,CAAA,CAAE,YAAA,CAAa,MAAA,CAAO,CAAC,CAAC,CAAA;AAC1E,UAAA,OAAO,EAAE,QAAA,EAAS;AAAA,QACpB,CAAA,GAAG;AACH,QAAA,MAAM,SAAA,GAAY,mBAAmB,QAAQ,CAAA;AAC7C,QAAA,MAAM,MAAM,MAAM,cAAA;AAAA,UAChB,CAAA,0BAAA,EAA6B,MAAM,CAAA,cAAA,EAAiB,SAAS,CAAA,CAAA;AAAA,UAC7D,EAAE,WAAA,EAAY;AAAA,UACd;AAAA,SACF;AACA,QAAA,IAAI,CAAC,GAAA,CAAI,EAAA,IAAM,CAAC,GAAA,CAAI,MAAM,QAAA,EAAU,MAAM,IAAI,KAAA,CAAM,8BAA8B,CAAA;AAClF,QAAA,QAAA,GAAW,IAAI,IAAA,CAAK,QAAA;AAAA,MACtB,CAAA,MAAO;AACL,QAAA,MAAM,YAAY,MAAM;AACtB,UAAA,MAAM,CAAA,GAAI,IAAI,GAAA,CAAI,MAAA,CAAO,SAAS,IAAI,CAAA;AACtC,UAAA,CAAC,cAAA,EAAgB,OAAA,EAAS,SAAS,CAAA,CAAE,OAAA,CAAQ,OAAK,CAAA,CAAE,YAAA,CAAa,MAAA,CAAO,CAAC,CAAC,CAAA;AAC1E,UAAA,OAAO,EAAE,QAAA,EAAS;AAAA,QACpB,CAAA,GAAG;AACH,QAAA,MAAM,SAAA,GAAY,mBAAmB,QAAQ,CAAA;AAC7C,QAAA,MAAM,MAAM,MAAM,cAAA;AAAA,UAChB,CAAA,MAAA,EAAS,QAAQ,CAAA,oBAAA,EAAuB,SAAS,CAAA,CAAA;AAAA,UACjD,EAAE,WAAA,EAAY;AAAA,UACd;AAAA,SACF;AACA,QAAA,IAAI,CAAC,GAAA,CAAI,EAAA,IAAM,CAAC,GAAA,CAAI,IAAA,EAAM,QAAA,EAAU,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,QAAQ,CAAA,MAAA,CAAQ,CAAA;AACvF,QAAA,QAAA,GAAW,IAAI,IAAA,CAAK,QAAA;AAAA,MACtB;AAKA,MAAA,MAAM,QAAQ,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,EAAG,QAAQ,UAAU,qCAAqC,CAAA;AAC9F,MAAA,IAAI,KAAA,EAAO;AAET,QAAA,MAAM,SAAA,GAAY,CAAC,KAAA,KAAwB;AACzC,UAAA,IACE,KAAA,CAAM,MAAM,IAAA,KAAS,wBAAA,IACrB,MAAM,IAAA,EAAM,IAAA,KAAS,CAAA,UAAA,EAAa,QAAQ,CAAA,MAAA,CAAA,EAC1C;AACA,YAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAC/C,YAAA,aAAA,CAAc,aAAa,CAAA;AAC3B,YAAA,OAAA,EAAQ;AAAA,UACV;AAAA,QACF,CAAA;AACA,QAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAG5C,QAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AACtC,UAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,YAAA,aAAA,CAAc,aAAa,CAAA;AAC3B,YAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAC/C,YAAA,OAAA,EAAQ;AAAA,UACV;AAAA,QACF,GAAG,GAAG,CAAA;AAAA,MACR,CAAA,MAAO;AAEL,QAAA,MAAA,CAAO,SAAS,IAAA,GAAO,QAAA;AAAA,MACzB;AAAA,IACF,SAAS,GAAA,EAAU;AACjB,MAAA,QAAA,CAAS,GAAA,CAAI,OAAA,IAAW,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAE,CAAA;AAAA,IACzD;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,MAAA,CAAO,SAAS,MAAA,CAAO,QAAA,EAAU,OAAO,CAAC,CAAA;AAG1D,EAAA,MAAM,UAAA,GAAaA,iBAAAA,CAAY,OAAO,QAAA,KAA8B;AAClE,IAAA,IAAI,CAAC,WAAA,EAAa,MAAM,IAAI,MAAM,mBAAmB,CAAA;AACrD,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,IAAI,aAAa,QAAA,EAAU;AACzB,QAAA,MAAM,eAAe,qBAAA,EAAuB,EAAE,QAAQ,MAAA,EAAQ,WAAA,IAAe,YAAY,CAAA;AAAA,MAC3F,CAAA,MAAO;AACL,QAAA,MAAM,cAAA,CAAe,SAAS,QAAQ,CAAA,WAAA,CAAA,EAAe,EAAE,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAY,EAAG,YAAY,CAAA;AAAA,MACpG;AACA,MAAA,MAAM,OAAA,EAAQ;AAAA,IAChB,SAAS,GAAA,EAAU;AACjB,MAAA,QAAA,CAAS,GAAA,CAAI,OAAA,IAAW,CAAA,qBAAA,EAAwB,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC5D;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,MAAA,CAAO,SAAS,MAAA,CAAO,QAAA,EAAU,OAAO,CAAC,CAAA;AAE1D,EAAA,OAAO,EAAE,WAAA,EAAa,SAAA,EAAW,KAAA,EAAO,OAAA,EAAS,YAAY,OAAA,EAAQ;AACvE;AC/LO,SAAS,WAAW,OAAA,EAA+C;AACxE,EAAA,MAAM,EAAE,WAAA,EAAa,MAAA,EAAO,GAAI,YAAA,EAAa;AAC7C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIF,cAAAA,CAAqB,EAAE,CAAA;AACrD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,OAAA,GAAU,SAAS,OAAA,KAAY,KAAA;AACrC,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,UAAU,MAAA,CAAO;AAAA,GACnB;AAEA,EAAA,MAAM,OAAA,GAAUE,kBAAY,YAAY;AACtC,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,OAAA,EAAS;AAC9B,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,WAAA,CAAY,WAAA,EAAa,YAAY,CAAA;AACvD,MAAA,IAAI,GAAA,CAAI,EAAA,IAAM,GAAA,CAAI,IAAA,EAAM;AACtB,QAAA,UAAA,CAAW,GAAA,CAAI,KAAK,OAAO,CAAA;AAAA,MAC7B,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,GAAA,CAAI,SAAS,wBAAwB,CAAA;AAAA,MAChD;AAAA,IACF,SAAS,GAAA,EAAU;AACjB,MAAA,QAAA,CAAS,GAAA,EAAK,WAAW,wBAAwB,CAAA;AAAA,IACnD,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EAEF,CAAA,EAAG,CAAC,WAAA,EAAa,MAAA,CAAO,OAAA,EAAS,OAAO,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU,OAAO,CAAC,CAAA;AAE3E,EAAAD,gBAAU,MAAM;AACd,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,MAAM,WAAA,GAAcc,aAA8C,IAAI,CAAA;AACtE,EAAAd,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS,eAAA,IAAmB,CAAC,OAAA,EAAS;AAC3C,IAAA,WAAA,CAAY,OAAA,GAAU,WAAA,CAAY,OAAA,EAAS,OAAA,CAAQ,eAAe,CAAA;AAClE,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,WAAA,CAAY,OAAA,EAAS,aAAA,CAAc,WAAA,CAAY,OAAO,CAAA;AAAA,IAC5D,CAAA;AAAA,EACF,GAAG,CAAC,OAAA,EAAS,eAAA,EAAiB,OAAA,EAAS,OAAO,CAAC,CAAA;AAE/C,EAAA,MAAM0B,WAAAA,GAAazB,iBAAAA;AAAA,IACjB,OAAO,WAAA,KAA4D;AACjE,MAAA,IAAI,CAAC,WAAA,IAAe,CAAC,WAAA,EAAa,OAAO,IAAA;AACzC,MAAA,MAAM,GAAA,GAAM,MAAM,UAAA,CAAc,WAAA,EAAa,aAAa,YAAY,CAAA;AACtE,MAAA,IAAI,GAAA,CAAI,EAAA,IAAM,GAAA,CAAI,IAAA,EAAM;AACtB,QAAA,MAAM,OAAA,EAAQ;AACd,QAAA,OAAO,IAAI,IAAA,CAAK,MAAA;AAAA,MAClB;AACA,MAAA,QAAA,CAAS,GAAA,CAAI,SAAS,uBAAuB,CAAA;AAC7C,MAAA,OAAO,IAAA;AAAA,IACT,CAAA;AAAA;AAAA,IAEA,CAAC,aAAa,MAAA,CAAO,OAAA,EAAS,OAAO,QAAA,EAAU,MAAA,CAAO,UAAU,OAAO;AAAA,GACzE;AAEA,EAAA,OAAO,EAAE,OAAA,EAAS,SAAA,EAAW,KAAA,EAAO,OAAA,EAAS,YAAAyB,WAAAA,EAAW;AAC1D;AC5DO,SAAS,WAAA,CACd,aACA,OAAA,EACmB;AACnB,EAAA,MAAM,EAAE,WAAA,EAAa,MAAA,EAAO,GAAI,YAAA,EAAa;AAC7C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI3B,cAAAA,CAAsB,EAAE,CAAA;AACxD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,OAAA,GAAU,OAAA,EAAS,OAAA,KAAY,KAAA,IAAS,CAAC,CAAC,WAAA;AAChD,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,UAAU,MAAA,CAAO;AAAA,GACnB;AAEA,EAAA,MAAM,OAAA,GAAUE,kBAAY,YAAY;AACtC,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,WAAA,IAAe,CAAC,OAAA,EAAS;AAC9C,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,YAAA;AAAA,QAChB,WAAA;AAAA,QACA,WAAA;AAAA,QACA,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAM;AAAA,QACxB;AAAA,OACF;AACA,MAAA,IAAI,GAAA,CAAI,EAAA,IAAM,GAAA,CAAI,IAAA,EAAM;AACtB,QAAA,WAAA,CAAY,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,MAC/B,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,GAAA,CAAI,SAAS,yBAAyB,CAAA;AAAA,MACjD;AAAA,IACF,SAAS,GAAA,EAAU;AACjB,MAAA,QAAA,CAAS,GAAA,EAAK,WAAW,yBAAyB,CAAA;AAAA,IACpD,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EAEF,CAAA,EAAG,CAAC,WAAA,EAAa,WAAA,EAAa,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU,OAAA,EAAS,OAAA,EAAS,KAAK,CAAC,CAAA;AAExG,EAAAD,gBAAU,MAAM;AACd,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,MAAM,WAAA,GAAcc,aAA8C,IAAI,CAAA;AACtE,EAAAd,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS,eAAA,IAAmB,CAAC,OAAA,EAAS;AAC3C,IAAA,WAAA,CAAY,OAAA,GAAU,WAAA,CAAY,OAAA,EAAS,OAAA,CAAQ,eAAe,CAAA;AAClE,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,WAAA,CAAY,OAAA,EAAS,aAAA,CAAc,WAAA,CAAY,OAAO,CAAA;AAAA,IAC5D,CAAA;AAAA,EACF,GAAG,CAAC,OAAA,EAAS,eAAA,EAAiB,OAAA,EAAS,OAAO,CAAC,CAAA;AAE/C,EAAA,MAAM,IAAA,GAAOC,iBAAAA;AAAA,IACX,OAAO,IAAA,KAAiB;AACtB,MAAA,IAAI,CAAC,WAAA,EAAa,MAAM,IAAI,MAAM,mBAAmB,CAAA;AACrD,MAAA,IAAI,CAAC,WAAA,EAAa,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAC3D,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,MAAK,EAAG;AAC3B,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,MAAM,MAAM,MAAM,WAAA,CAAY,WAAA,EAAa,WAAA,EAAa,MAAM,YAAY,CAAA;AAC1E,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,QAAA,MAAM,GAAA,GAAM,IAAI,KAAA,IAAS,wBAAA;AACzB,QAAA,QAAA,CAAS,GAAG,CAAA;AACZ,QAAA,MAAM,IAAI,MAAM,GAAG,CAAA;AAAA,MACrB;AACA,MAAA,MAAM,OAAA,EAAQ;AAAA,IAChB,CAAA;AAAA;AAAA,IAEA,CAAC,aAAa,WAAA,EAAa,MAAA,CAAO,SAAS,MAAA,CAAO,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU,OAAO;AAAA,GACtF;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,MAAM,OAAA,EAAQ;AACrD;ACzGA,SAAS,iBAAiB,GAAA,EAA2C;AACnE,EAAA,OAAO;AAAA,IACL,OAAA,EAAU,IAAI,OAAA,IAAW,CAAA;AAAA,IACzB,IAAA,EAAO,IAAI,IAAA,IAAQ,OAAA;AAAA,IACnB,SAAA,EAAY,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,SAAA,IAAa,EAAA;AAAA,IAC/C,aAAc,GAAA,CAAI,WAAA;AAAA,IAClB,SAAA,EAAY,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,SAAA,IAAa,CAAA;AAAA,IAC/C,UAAA,EAAa,GAAA,CAAI,WAAA,IAAe,GAAA,CAAI,UAAA,IAAc,CAAA;AAAA,IAClD,GAAA,EAAM,IAAI,GAAA,IAAO;AAAA,GACnB;AACF;AAEA,SAAS,kBAAkB,GAAA,EAAmD;AAC5E,EAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AACrB,EAAA,OAAO;AAAA,IACL,MAAA,EAAS,GAAA,CAAI,OAAA,IAAW,GAAA,CAAI,MAAA,IAAU,EAAA;AAAA,IACtC,IAAA,EAAO,IAAI,IAAA,IAAQ,EAAA;AAAA,IACnB,WAAA,EAAc,GAAA,CAAI,YAAA,IAAgB,GAAA,CAAI,WAAA,IAAe,CAAA;AAAA,IACrD,QAAA,EAAA,CAAW,QAAA,IAAY,EAAC,EAAG,IAAI,gBAAgB,CAAA;AAAA,IAC/C,KAAA,EAAQ,IAAI,KAAA,IAAS,IAAA;AAAA,IACrB,UAAA,EAAa,GAAA,CAAI,WAAA,IAAe,GAAA,CAAI,UAAA,IAAc;AAAA,GACpD;AACF;AAEO,SAAS,gBAAgB,MAAA,EAA8C;AAC5E,EAAA,MAAM,EAAE,WAAA,EAAa,MAAA,EAAO,GAAI,YAAA,EAAa;AAE7C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIF,cAAAA,CAAwB,EAAE,CAAA;AAC1D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,UAAU,MAAA,CAAO;AAAA,GACnB;AAEA,EAAA,MAAM,OAAA,GAAUE,kBAAY,YAAY;AACtC,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,WAAA,EAAa;AAC7B,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,eAAA,CAAe,WAAA,EAAa,QAAQ,YAAY,CAAA;AACvE,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAChC,QAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,QAAA,CAAS,IAA0C,CAAA;AACtF,QAAA,WAAA,CAAY,SAAS,QAAQ,CAAA;AAC7B,QAAA,cAAA,CAAe,SAAS,WAAW,CAAA;AAAA,MACrC,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,QAAA,CAAS,SAAS,yBAAyB,CAAA;AAAA,MACtD;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,yBAAyB,CAAA;AAAA,IACzE,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,MAAA,EAAQ,WAAA,EAAa,MAAA,CAAO,OAAO,CAAC,CAAA;AAExC,EAAAD,gBAAU,MAAM;AACd,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA,MAAO;AACL,MAAA,WAAA,CAAY,EAAE,CAAA;AACd,MAAA,cAAA,CAAe,IAAI,CAAA;AACnB,MAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACf;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAO,CAAC,CAAA;AAEpB,EAAA,MAAM,OAAA,GAAUC,iBAAAA,CAAY,OAAO,OAAA,KAAsC;AACvE,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,WAAA,EAAa,OAAO,KAAA;AACpC,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,kBAAA,CAAW,WAAA,EAAa,MAAA,EAAQ,SAAS,YAAY,CAAA;AAC5E,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAChC,QAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,QAAA,CAAS,IAA0C,CAAA;AACtF,QAAA,WAAA,CAAY,SAAS,QAAQ,CAAA;AAC7B,QAAA,cAAA,CAAe,SAAS,WAAW,CAAA;AACnC,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,QAAA,CAAS,QAAA,CAAS,SAAS,2BAA2B,CAAA;AACtD,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,2BAA2B,CAAA;AACzE,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,GAAG,CAAC,MAAA,EAAQ,WAAA,EAAa,MAAA,CAAO,OAAO,CAAC,CAAA;AAExC,EAAA,MAAM,aAAA,GAAgBA,iBAAAA,CAAY,OAAO,OAAA,KAAsC;AAC7E,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,WAAA,EAAa,OAAO,KAAA;AACpC,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,iBAAA,CAAiB,WAAA,EAAa,MAAA,EAAQ,SAAS,YAAY,CAAA;AAClF,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAChC,QAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,QAAA,CAAS,IAA0C,CAAA;AACtF,QAAA,WAAA,CAAY,SAAS,QAAQ,CAAA;AAC7B,QAAA,cAAA,CAAe,SAAS,WAAW,CAAA;AACnC,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,QAAA,CAAS,QAAA,CAAS,SAAS,0BAA0B,CAAA;AACrD,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,0BAA0B,CAAA;AACxE,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,GAAG,CAAC,MAAA,EAAQ,WAAA,EAAa,MAAA,CAAO,OAAO,CAAC,CAAA;AAExC,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;ACpFA,IAAM,SAAA,GAAY,mCAAA;AAEX,SAAS,sBAAA,GAAuD;AACrE,EAAA,MAAM,EAAE,WAAA,EAAa,eAAA,EAAiB,MAAA,KAAW,YAAA,EAAa;AAC9D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIF,cAAAA,CAA+B,EAAE,CAAA;AACvE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,cAAAA,CAAwB,EAAE,CAAA;AAC1D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,eAAe,EAAE,OAAA,EAAS,OAAO,OAAA,EAAS,QAAA,EAAU,OAAO,QAAA,EAAS;AAE1E,EAAA,MAAM,gBAAA,GAAmBE,kBAAY,YAAY;AAC/C,IAAA,IAAI,CAAC,eAAA,EAAiB;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,cAAA;AAAA,QAChB,SAAA;AAAA,QACA,EAAE,aAAa,eAAA,EAAgB;AAAA,QAC/B;AAAA,OACF;AACA,MAAA,IAAI,GAAA,CAAI,EAAA,IAAM,GAAA,CAAI,IAAA,EAAM;AACtB,QAAA,cAAA,CAAe,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAI,IAAI,GAAA,CAAI,IAAA,GAAO,EAAE,CAAA;AAAA,MACxD;AAAA,IACF,SAAS,GAAA,EAAU;AACjB,MAAA,QAAA,CAAS,IAAI,OAAO,CAAA;AAAA,IACtB;AAAA,EACF,CAAA,EAAG,CAAC,eAAA,EAAiB,YAAA,CAAa,OAAO,CAAC,CAAA;AAE1C,EAAA,MAAM,aAAA,GAAgBA,kBAAY,YAAY;AAC5C,IAAA,IAAI,CAAC,eAAA,EAAiB;AACtB,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,cAAA;AAAA,QAChB,GAAG,SAAS,CAAA,SAAA,CAAA;AAAA,QACZ,EAAE,aAAa,eAAA,EAAgB;AAAA,QAC/B;AAAA,OACF;AACA,MAAA,IAAI,GAAA,CAAI,EAAA,IAAM,GAAA,CAAI,IAAA,EAAM;AACtB,QAAA,WAAA,CAAY,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAI,IAAI,GAAA,CAAI,IAAA,GAAO,EAAE,CAAA;AAAA,MACrD;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA,EAAG,CAAC,eAAA,EAAiB,YAAA,CAAa,OAAO,CAAC,CAAA;AAE1C,EAAA,MAAM,OAAA,GAAUA,kBAAY,YAAY;AACtC,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,MAAM,QAAQ,GAAA,CAAI,CAAC,kBAAiB,EAAG,aAAA,EAAe,CAAC,CAAA;AACvD,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB,CAAA,EAAG,CAAC,gBAAA,EAAkB,aAAa,CAAC,CAAA;AAEpC,EAAAD,gBAAU,MAAM;AACd,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,gBAAA,GAAmBC,iBAAAA,CAAY,OAAO,MAAA,KAAgE;AAC1G,IAAA,IAAI,CAAC,eAAA,EAAiB,MAAM,IAAI,MAAM,mBAAmB,CAAA;AACzD,IAAA,MAAM,MAAM,MAAM,cAAA;AAAA,MAChB,SAAA;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,MAAA;AAAA,QACR,WAAA,EAAa,eAAA;AAAA,QACb,IAAA,EAAM;AAAA,OACR;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA,6BAAA,EAAgC,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAAA,IAC3E;AACA,IAAA,MAAM,gBAAA,EAAiB;AACvB,IAAA,OAAO,GAAA,CAAI,IAAA;AAAA,EACb,GAAG,CAAC,eAAA,EAAiB,YAAA,CAAa,OAAA,EAAS,gBAAgB,CAAC,CAAA;AAE5D,EAAA,MAAM,gBAAA,GAAmBA,iBAAAA,CAAY,OAAO,YAAA,KAAwC;AAClF,IAAA,IAAI,CAAC,eAAA,EAAiB,MAAM,IAAI,MAAM,mBAAmB,CAAA;AACzD,IAAA,MAAM,MAAM,MAAM,cAAA;AAAA,MAChB,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA;AAAA,MAC5B;AAAA,QACE,MAAA,EAAQ,QAAA;AAAA,QACR,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA,6BAAA,EAAgC,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAAA,IAC3E;AACA,IAAA,MAAM,gBAAA,EAAiB;AAAA,EACzB,GAAG,CAAC,eAAA,EAAiB,YAAA,CAAa,OAAA,EAAS,gBAAgB,CAAC,CAAA;AAE5D,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,QAAA;AAAA,IACA,gBAAA;AAAA,IACA,gBAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF;AC5HA,IAAM,YAAA,GAAe,wBAAA;AACrB,IAAM,oBAAA,GAAuB,GAAA;AAWtB,SAAS,kBAAA,CAAmB,cAAc,YAAA,EAAwC;AACvF,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIF,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,cAAAA,CAA6B,EAAE,CAAA;AAC3D,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAAS,WAAW,CAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AAEpD,EAAA,MAAM,MAAA,GAASE,iBAAAA,CAAY,OAAO,UAAA,KAA+C;AAC/E,IAAA,MAAM,IAAI,UAAA,IAAc,IAAA;AACxB,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,MAAA,MAAM,UAAU,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,oBAAoB,CAAA;AAEzE,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,SAAA,CAAA,EAAa;AAAA,QACvC,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AACD,MAAA,YAAA,CAAa,OAAO,CAAA;AAEpB,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAAA,MACjD;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,MAAM,gBAAoC,IAAA,CAAK,MAAA,IAAU,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAY;AAAA,QAC5E,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,IAAA,EAAM,EAAE,IAAA,IAAQ,CAAA;AAAA,QAChB,WAAA,EAAa,EAAE,WAAA,IAAe,EAAA;AAAA,QAC9B,QAAQ,CAAA,CAAE;AAAA,OACZ,CAAE,CAAA;AAEF,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,SAAA,CAAU,YAAY,CAAA;AACtB,MAAA,IAAI,UAAA,UAAoB,UAAU,CAAA;AAElC,MAAA,OAAO,EAAE,SAAA,EAAW,IAAA,EAAM,IAAA,EAAM,CAAA,EAAG,QAAQ,YAAA,EAAa;AAAA,IAC1D,SAAS,GAAA,EAAU;AACjB,MAAA,MAAM,MAAM,GAAA,CAAI,IAAA,KAAS,YAAA,GACrB,sBAAA,GACA,IAAI,OAAA,EAAS,QAAA,CAAS,iBAAiB,CAAA,IAAK,IAAI,OAAA,EAAS,QAAA,CAAS,cAAc,CAAA,GAC9E,4EACA,GAAA,CAAI,OAAA;AAEV,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,SAAA,CAAU,EAAE,CAAA;AACZ,MAAA,QAAA,CAAS,GAAG,CAAA;AACZ,MAAA,OAAO,EAAE,WAAW,KAAA,EAAO,IAAA,EAAM,GAAG,MAAA,EAAQ,EAAC,EAAG,KAAA,EAAO,GAAA,EAAI;AAAA,IAC7D,CAAA,SAAE;AACA,MAAA,cAAA,CAAe,KAAK,CAAA;AAAA,IACtB;AAAA,EACF,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAGT,EAAAD,gBAAU,MAAM;AACd,IAAA,MAAA,EAAO;AAAA,EACT,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,aAAa,MAAA,EAAO;AAC/D;ACtEO,SAAS,eAAA,GAAyC;AACvD,EAAA,MAAM,EAAE,WAAA,EAAa,MAAA,EAAO,GAAI,YAAA,EAAa;AAC7C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAID,eAAkC,IAAI,CAAA;AACtE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,eAAe,EAAE,OAAA,EAAS,OAAO,OAAA,EAAS,QAAA,EAAU,OAAO,QAAA,EAAS;AAE1E,EAAA,MAAM,OAAA,GAAUE,kBAAY,YAAY;AAItC,IAAA,IAAI,CAAC,WAAA,EAAa;AAAE,MAAA,YAAA,CAAa,KAAK,CAAA;AAAG,MAAA;AAAA,IAAQ;AACjD,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,mBAAA,CAAoB,WAAA,EAAa,YAAY,CAAA;AAC/D,MAAA,IAAI,GAAA,CAAI,EAAA,IAAM,GAAA,CAAI,IAAA,EAAM;AACtB,QAAA,WAAA,CAAY,IAAI,IAAI,CAAA;AAAA,MACtB,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,GAAA,CAAI,SAAS,8BAA8B,CAAA;AAAA,MACtD;AAAA,IACF,SAAS,GAAA,EAAU;AACjB,MAAA,QAAA,CAAS,IAAI,OAAO,CAAA;AAAA,IACtB,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,YAAA,CAAa,OAAO,CAAC,CAAA;AAEtC,EAAAD,gBAAU,MAAM;AACd,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO,EAAE,QAAA,EAAU,SAAA,EAAW,KAAA,EAAO,OAAA,EAAQ;AAC/C;AC3BO,SAAS,mBAAmB,OAAA,EAA+D;AAChG,EAAA,MAAM,EAAE,WAAA,EAAa,MAAA,EAAO,GAAI,YAAA,EAAa;AAC7C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAID,cAAAA,CAA+B,EAAE,CAAA;AACvE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,cAAAA,CAA+C,EAAE,CAAA;AAC3F,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,eAAe,EAAE,OAAA,EAAS,OAAO,OAAA,EAAS,QAAA,EAAU,OAAO,QAAA,EAAS;AAE1E,EAAA,MAAM,OAAA,GAAUE,kBAAY,YAAY;AACtC,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,kBAAA;AAAA,QAChB,WAAA;AAAA,QACA,EAAE,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,aAAA,EAAe,SAAS,aAAA,EAAc;AAAA,QACjE;AAAA,OACF;AACA,MAAA,IAAI,GAAA,CAAI,EAAA,IAAM,GAAA,CAAI,IAAA,EAAM;AACtB,QAAA,cAAA,CAAe,GAAA,CAAI,IAAA,CAAK,WAAA,IAAe,EAAE,CAAA;AACzC,QAAA,gBAAA,CAAiB,GAAA,CAAI,IAAA,CAAK,eAAA,IAAmB,EAAE,CAAA;AAAA,MACjD,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,GAAA,CAAI,SAAS,4BAA4B,CAAA;AAAA,MACpD;AAAA,IACF,SAAS,GAAA,EAAU;AACjB,MAAA,QAAA,CAAS,IAAI,OAAO,CAAA;AAAA,IACtB,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,OAAA,EAAS,QAAQ,OAAA,EAAS,aAAA,EAAe,YAAA,CAAa,OAAO,CAAC,CAAA;AAE/E,EAAAD,gBAAU,MAAM;AACd,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,YAAA,GAAeC,iBAAAA,CAAY,OAAO,QAAA,KAAuC;AAC7E,IAAA,IAAI,CAAC,aAAa,OAAO,KAAA;AACzB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,oBAAA,CAAqB,WAAA,EAAa,UAAU,YAAY,CAAA;AAC1E,MAAA,IAAI,IAAI,EAAA,EAAI;AACV,QAAA,MAAM,OAAA,EAAQ;AACd,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,GAAG,CAAC,WAAA,EAAa,YAAA,CAAa,OAAA,EAAS,OAAO,CAAC,CAAA;AAE/C,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,aAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,gBAAA,EAAkB;AAAA,GACpB;AACF;AC7CO,SAAS,qBAAA,CACd,YACA,OAAA,EACgC;AAChC,EAAA,MAAM,EAAE,WAAA,EAAa,MAAA,EAAO,GAAI,YAAA,EAAa;AAC7C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIF,cAAAA,CAAc,EAAE,CAAA;AAClD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAS,CAAC,CAAA;AACpC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAsC,IAAI,CAAA;AACtE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAAS,CAAC,CAAA;AAClC,EAAA,MAAM,QAAA,GAAW,SAAS,KAAA,IAAS,EAAA;AAEnC,EAAA,MAAM,eAAe,EAAE,OAAA,EAAS,OAAO,OAAA,EAAS,QAAA,EAAU,OAAO,QAAA,EAAS;AAE1E,EAAA,MAAM,cAAA,GAAiBE,kBAAY,YAAY;AAC7C,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,UAAA,EAAY;AACjC,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,0BAAA;AAAA,QAChB,WAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,UACE,QAAQ,OAAA,EAAS,MAAA;AAAA,UACjB,KAAA,EAAO,QAAA;AAAA,UACP,MAAM,IAAA,GAAO,QAAA;AAAA,UACb,MAAM,OAAA,EAAS,IAAA;AAAA,UACf,UAAU,OAAA,EAAS;AAAA,SACrB;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAI,GAAA,CAAI,EAAA,IAAM,GAAA,CAAI,IAAA,EAAM;AACtB,QAAA,YAAA,CAAa,GAAA,CAAI,IAAA,CAAK,SAAA,IAAa,EAAE,CAAA;AACrC,QAAA,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,KAAA,IAAS,CAAC,CAAA;AAAA,MAC9B,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,GAAA,CAAI,SAAS,0BAA0B,CAAA;AAAA,MAClD;AAAA,IACF,SAAS,GAAA,EAAU;AACjB,MAAA,QAAA,CAAS,IAAI,OAAO,CAAA;AAAA,IACtB,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,UAAA,EAAY,MAAM,QAAA,EAAU,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,YAAA,CAAa,OAAO,CAAC,CAAA;AAErH,EAAA,MAAM,WAAA,GAAcA,kBAAY,YAAY;AAC1C,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,UAAA,EAAY;AACjC,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,uBAAA;AAAA,QAChB,WAAA;AAAA,QAAa,UAAA;AAAA,QACb,EAAE,QAAA,EAAU,OAAA,EAAS,QAAA,EAAS;AAAA,QAC9B;AAAA,OACF;AACA,MAAA,IAAI,GAAA,CAAI,EAAA,IAAM,GAAA,CAAI,IAAA,EAAM;AACtB,QAAA,SAAA,CAAU,IAAI,IAAI,CAAA;AAAA,MACpB;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,UAAA,EAAY,SAAS,QAAA,EAAU,YAAA,CAAa,OAAO,CAAC,CAAA;AAErE,EAAAD,gBAAU,MAAM;AACd,IAAA,cAAA,EAAe;AAAA,EACjB,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,EAAAA,gBAAU,MAAM;AACd,IAAA,WAAA,EAAY;AAAA,EACd,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,OAAA,GAAUC,kBAAY,YAAY;AACtC,IAAA,MAAM,QAAQ,GAAA,CAAI,CAAC,gBAAe,EAAG,WAAA,EAAa,CAAC,CAAA;AAAA,EACrD,CAAA,EAAG,CAAC,cAAA,EAAgB,WAAW,CAAC,CAAA;AAEhC,EAAA,MAAM,QAAA,GAAWA,iBAAAA,CAAY,OAAO,MAAA,KAA2B;AAC7D,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,oBAAA;AAAA,QAChB,WAAA;AAAA,QAAa,UAAA;AAAA,QACb,EAAE,MAAA,EAAQ,MAAA,EAAQ,SAAS,MAAA,EAAQ,QAAA,EAAU,SAAS,QAAA,EAAS;AAAA,QAC/D;AAAA,OACF;AACA,MAAA,IAAI,GAAA,CAAI,EAAA,IAAM,GAAA,CAAI,IAAA,EAAM;AAEtB,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,YAAgB,IAAA,GAAO,IAAI,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAC,CAAC,CAAA;AACtF,QAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,QAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,QAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,QAAA,CAAA,CAAE,QAAA,GAAW,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AACpC,QAAA,CAAA,CAAE,KAAA,EAAM;AACR,QAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,MACzB;AAAA,IACF,SAAS,GAAA,EAAU;AACjB,MAAA,QAAA,CAAS,CAAA,eAAA,EAAkB,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AAAA,IAC1C;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,UAAA,EAAY,OAAA,EAAS,QAAQ,OAAA,EAAS,QAAA,EAAU,YAAA,CAAa,OAAO,CAAC,CAAA;AAEtF,EAAA,MAAM,YAAA,GAAeA,kBAAY,YAA8B;AAC7D,IAAA,IAAI,CAAC,aAAa,OAAO,KAAA;AACzB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,oBAAA,CAAqB,WAAA,EAAa,YAAY,YAAY,CAAA;AAC5E,MAAA,OAAO,IAAI,EAAA,KAAO,IAAA;AAAA,IACpB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,GAAG,CAAC,WAAA,EAAa,UAAA,EAAY,YAAA,CAAa,OAAO,CAAC,CAAA;AAElD,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,gBAAA,EAAkB;AAAA,GACpB;AACF;ACrIA,IAAM,cAAA,GACJ,mKAAA;AAmCK,SAAS,mBAAA,CACd,YACA,OAAA,EAC8B;AAC9B,EAAA,MAAM,YAAY,oBAAA,EAAqB;AAEvC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIF,cAAAA,CAAc,EAAE,CAAA;AAClD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAS,CAAC,CAAA;AACpC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAS,CAAC,CAAA;AACpC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,UAAA,GAAae,aAAO,IAAI,CAAA;AAC9B,EAAAd,gBAAU,MAAM;AACd,IAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AACrB,IAAA,OAAO,MAAM;AAAE,MAAA,UAAA,CAAW,OAAA,GAAU,KAAA;AAAA,IAAO,CAAA;AAAA,EAC7C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAU,SAAA,EAAW,MAAA,EAAQ,OAAA,IAAW,gCAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,SAAA,EAAW,MAAA,EAAQ,QAAA,IAAY,EAAA;AAIhD,EAAA,MAAM,WAAW,SAAA,EAAW,WAAA,EAAa,QAAA,IAAY,SAAA,EAAW,QAAQ,QAAA,IAAY,EAAA;AACpF,EAAA,MAAM,OAAA,GAAU,SAAS,OAAA,KAAY,KAAA;AAErC,EAAA,MAAM,SAAA,GAAYC,kBAAY,YAAY;AACxC,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,OAAA,EAAS;AAC3B,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,QAAA,CAAS,cAAc,CAAA;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,MAAA,IAAI,OAAA,EAAS,UAAU,KAAA,CAAA,EAAW,MAAA,CAAO,IAAI,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA;AAC3E,MAAA,IAAI,OAAA,EAAS,SAAS,KAAA,CAAA,EAAW,MAAA,CAAO,IAAI,MAAA,EAAQ,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAC,CAAA;AACxE,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,MAAM,CAAC,KAAA,EAAO,GAAG,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAC,CAAA,IAAK,EAAC;AACzD,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAA,CAAO,GAAA,CAAI,cAAc,KAAK,CAAA;AAC9B,UAAA,MAAA,CAAO,GAAA,CAAI,UAAA,EAAY,MAAA,CAAO,GAAA,IAAO,EAAE,CAAC,CAAA;AAAA,QAC1C;AAAA,MACF;AACA,MAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,QAAA,MAAA,CAAO,IAAI,aAAA,EAAe,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,MAC1D;AAEA,MAAA,MAAM,GAAA,GAAM,CAAA,EAAG,OAAO,CAAA,oBAAA,EAAuB,kBAAA,CAAmB,UAAU,CAAC,CAAA,WAAA,EAAc,MAAA,CAAO,QAAA,EAAU,CAAA,CAAA;AAC1G,MAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAC5B,OAAA,EAAS;AAAA,UACP,aAAA,EAAe,QAAA;AAAA,UACf,aAAA,EAAe;AAAA;AACjB,OACD,CAAA;AAED,MAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AAEzB,MAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACZ,QAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAC/C,QAAA,QAAA,CAAS,IAAA,CAAK,MAAA,IAAU,CAAA,cAAA,EAAiB,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AACtD,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,EAAK;AAC7B,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,YAAA,CAAa,IAAA,CAAK,SAAA,IAAa,EAAE,CAAA;AACjC,QAAA,QAAA,CAAS,IAAA,CAAK,SAAS,CAAC,CAAA;AACxB,QAAA,QAAA,CAAS,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,MAC1B;AAAA,IACF,SAAS,GAAA,EAAU;AACjB,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,QAAA,CAAS,GAAA,CAAI,WAAW,eAAe,CAAA;AAAA,MACzC;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAA,EAAG;AAAA,IACD,OAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,MAAM,CAAA;AAAA,IAC9B,OAAA,EAAS,KAAA;AAAA,IACT,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAI;AAAA,GAC7B,CAAA;AAED,EAAAD,gBAAU,MAAM;AACd,IAAA,SAAA,EAAU;AAAA,EACZ,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS,eAAA,IAAmB,CAAC,OAAA,EAAS;AAC3C,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,SAAA,EAAW,OAAA,CAAQ,eAAe,CAAA;AAC/D,IAAA,OAAO,MAAM,cAAc,QAAQ,CAAA;AAAA,EACrC,GAAG,CAAC,SAAA,EAAW,OAAA,EAAS,eAAA,EAAiB,OAAO,CAAC,CAAA;AAEjD,EAAA,MAAM,MAAA,GAASC,iBAAAA,CAAY,OAAO,GAAA,KAAsD;AACtF,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,4EAAuE,CAAA;AACtG,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,cAAc,CAAA;AAE7C,IAAA,MAAM,MAAM,CAAA,EAAG,OAAO,CAAA,oBAAA,EAAuB,kBAAA,CAAmB,UAAU,CAAC,CAAA,OAAA,CAAA;AAC3E,IAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAC5B,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,aAAA,EAAe,QAAA;AAAA,QACf,aAAA,EAAe;AAAA,OACjB;AAAA,MACA,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,QAAA,EAAU,KAAK;AAAA,KACvC,CAAA;AAED,IAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACZ,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAC/C,MAAA,MAAM,IAAI,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA,eAAA,EAAkB,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AAAA,IAChE;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,EAAK;AAE7B,IAAA,SAAA,EAAU;AACV,IAAA,OAAO,EAAE,WAAA,EAAa,IAAA,CAAK,WAAA,EAAY;AAAA,EACzC,GAAG,CAAC,OAAA,EAAS,UAAU,QAAA,EAAU,UAAA,EAAY,SAAS,CAAC,CAAA;AAEvD,EAAA,OAAO,EAAE,WAAW,KAAA,EAAO,KAAA,EAAO,WAAW,KAAA,EAAO,MAAA,EAAQ,SAAS,SAAA,EAAU;AACjF;AChKO,SAAS,iBAAiB,OAAA,EAA2D;AAC1F,EAAA,MAAM,EAAE,WAAA,EAAa,MAAA,EAAO,GAAI,YAAA,EAAa;AAE7C,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIF,cAAAA,CAAgC,EAAE,CAAA;AAC5E,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,gCAAA;AACnC,EAAA,MAAM,SAAS,WAAA,EAAa,MAAA;AAC5B,EAAA,MAAM,KAAA,GAAQ,SAAS,KAAA,IAAS,EAAA;AAEhC,EAAA,MAAM,OAAA,GAAUE,kBAAY,YAA2B;AACrD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,KAAA,CAAM,GAAG,OAAO,CAAA,6BAAA,EAAgC,KAAK,CAAA,CAAA,EAAI;AAAA,QACzE,OAAA,EAAS,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA;AAAG,OAC9C,CAAA;AACD,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAC5C,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,MAAM,KAAA,GAAA,CAAgC,KAAK,KAAA,IAAS,IAAA,CAAK,iBAAiB,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAW;AAG5F,QAAA,MAAM,QAAA,GAAW,CAAA,CAAE,KAAA,EAAO,IAAA,EAAK;AAC/B,QAAA,MAAM,cAAc,CAAA,CAAE,qBAAA,IAAyB,CAAA,CAAE,YAAA,IAAgB,IAAI,IAAA,EAAK;AAC1E,QAAA,MAAM,QAAQ,QAAA,KAAa,UAAA,GAAa,WAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,UAAA,CAAA;AAClE,QAAA,OAAO;AAAA,UACL,IAAI,CAAA,CAAE,eAAA,IAAmB,CAAA,CAAE,EAAA,IAAM,EAAE,UAAA,IAAc,EAAA;AAAA,UACjD,KAAA;AAAA;AAAA,UAEA,OAAA,EAAS,cAAc,UAAA,KAAe,KAAA,GAAQ,WAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,EAAA;AAAA,UACxE,eAAA,EAAiB,CAAA,CAAE,gBAAA,IAAoB,CAAA,CAAE,mBAAmB,CAAA,CAAE,UAAA;AAAA,UAC9D,eAAe,CAAA,CAAE,aAAA;AAAA,UACjB,SAAS,CAAA,CAAE;AAAA,SACb;AAAA,MACF,CAAC,CAAA;AACD,MAAA,gBAAA,CAAiB,KAAK,CAAA;AAAA,IACxB,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,eAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,IAC3D,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAA,EAAS,KAAK,CAAC,CAAA;AAE3B,EAAAD,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,OAAA,EAAQ;AACR,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,EAAQ;AAC9B,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,OAAO,CAAA;AACxC,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AAAA,EAC1D,CAAA,EAAG,CAAC,WAAA,EAAa,OAAO,CAAC,CAAA;AAEzB,EAAAA,gBAAU,MAAM;AACd,IAAA,MAAM,QAAA,GAAW,SAAS,iBAAA,IAAqB,CAAA;AAC/C,IAAA,IAAI,CAAC,QAAA,IAAY,QAAA,GAAW,GAAA,IAAQ,CAAC,WAAA,EAAa;AAClD,IAAA,MAAM,MAAA,GAAS,WAAA,CAAY,OAAA,EAAS,QAAQ,CAAA;AAC5C,IAAA,OAAO,MAAM,cAAc,MAAM,CAAA;AAAA,EACnC,GAAG,CAAC,WAAA,EAAa,OAAA,EAAS,OAAA,EAAS,iBAAiB,CAAC,CAAA;AAErD,EAAA,MAAM,kBAAA,GAAqBC,iBAAAA,CAAY,OAAO,SAAA,KAAwC;AACpF,IAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,KAAA,CAAM,GAAG,OAAO,CAAA,uBAAA,EAA0B,SAAS,CAAA,CAAA,EAAI;AAAA,QACvE,MAAA,EAAQ,QAAA;AAAA,QACR,OAAA,EAAS,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA;AAAG,OAC9C,CAAA;AACD,MAAA,IAAI,IAAI,EAAA,EAAI;AACV,QAAA,gBAAA,CAAiB,UAAQ,IAAA,CAAK,MAAA,CAAO,OAAK,CAAA,CAAE,EAAA,KAAO,SAAS,CAAC,CAAA;AAC7D,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AAAE,MAAA,OAAO,KAAA;AAAA,IAAO;AAAA,EAC1B,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAO,CAAC,CAAA;AAEpB,EAAA,MAAM,kBAAA,GAAqBA,iBAAAA,CAAY,OAAO,SAAA,EAAmB,KAAA,KAAoC;AACnG,IAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,KAAA,CAAM,GAAG,OAAO,CAAA,uBAAA,EAA0B,SAAS,CAAA,CAAA,EAAI;AAAA,QACvE,MAAA,EAAQ,OAAA;AAAA,QACR,SAAS,EAAE,aAAA,EAAe,UAAU,MAAM,CAAA,CAAA,EAAI,gBAAgB,kBAAA,EAAmB;AAAA,QACjF,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAO;AAAA,OAC/B,CAAA;AACD,MAAA,IAAI,IAAI,EAAA,EAAI;AACV,QAAA,gBAAA,CAAiB,CAAA,IAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,EAAA,KAAO,SAAA,GAAY,EAAE,GAAG,CAAA,EAAG,KAAA,EAAM,GAAI,CAAC,CAAC,CAAA;AAChF,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AAAE,MAAA,OAAO,KAAA;AAAA,IAAO;AAAA,EAC1B,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAO,CAAC,CAAA;AAEpB,EAAA,OAAO,EAAE,aAAA,EAAe,SAAA,EAAW,KAAA,EAAO,OAAA,EAAS,oBAAoB,kBAAA,EAAmB;AAC5F;ACpBO,SAAS,eAAA,GAAyC;AACvD,EAAA,MAAM,EAAE,WAAA,EAAa,MAAA,EAAO,GAAI,YAAA,EAAa;AAC7C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIF,cAAAA,CAAwB,EAAE,CAAA;AAClE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,IAAA,GAAQ,QAAgB,OAAA,IAAW,gCAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,WAAA;AAEd,EAAA,MAAM,UAAU,OAA+B;AAAA,IAC7C,aAAA,EAAe,CAAA,OAAA,EAAU,KAAA,EAAO,MAAA,IAAU,EAAE,CAAA,CAAA;AAAA,IAC5C,aAAA,EAAe,KAAA,EAAO,QAAA,IAAa,MAAA,EAAgB,QAAA,IAAY,EAAA;AAAA,IAC/D,cAAA,EAAgB;AAAA,GAClB,CAAA;AAEA,EAAA,MAAM,OAAA,GAAUE,kBAAY,YAAY;AACtC,IAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AACpB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,IAAI,iBAAiB,EAAE,OAAA,EAAS,OAAA,EAAQ,EAAG,CAAA;AACtE,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AAAE,QAAA,QAAA,CAAS,CAAA,6BAAA,EAAgC,GAAA,CAAI,MAAM,CAAA,CAAA,CAAG,CAAA;AAAG,QAAA;AAAA,MAAQ;AAChF,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,eAAA,CAAgB,IAAA,CAAK,YAAA,IAAgB,EAAE,CAAA;AAAA,IACzC,SAAS,CAAA,EAAQ;AACf,MAAA,QAAA,CAAS,CAAA,CAAE,WAAW,6BAA6B,CAAA;AAAA,IACrD,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,KAAA,EAAO,QAAQ,KAAA,EAAO,QAAA,EAAU,IAAI,CAAC,CAAA;AAEzC,EAAAD,gBAAU,MAAM;AAAE,IAAA,OAAA,EAAQ;AAAA,EAAG,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEzC,EAAA,MAAM,MAAA,GAASC,iBAAAA,CAAY,OAAO,KAAA,KAA+D;AAC/F,IAAA,IAAI,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,IAAA;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,aAAA,CAAA,EAAiB;AAAA,QAC9C,MAAA,EAAQ,MAAA;AAAA,QACR,SAAS,OAAA,EAAQ;AAAA,QACjB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,OAC3B,CAAA;AACD,MAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,IAAA;AACpB,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,MAAM,OAAA,EAAQ;AACd,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AAAE,MAAA,OAAO,IAAA;AAAA,IAAM;AAAA,EACzB,GAAG,CAAC,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAC,CAAA;AAEjC,EAAA,MAAM,MAAA,GAASA,iBAAAA,CAAY,OAAO,EAAA,EAAY,KAAA,KAAoD;AAChG,IAAA,IAAI,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,KAAA;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,cAAA,EAAiB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,QACxE,MAAA,EAAQ,KAAA;AAAA,QACR,SAAS,OAAA,EAAQ;AAAA,QACjB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,OAC3B,CAAA;AACD,MAAA,IAAI,GAAA,CAAI,EAAA,EAAI,MAAM,OAAA,EAAQ;AAC1B,MAAA,OAAO,GAAA,CAAI,EAAA;AAAA,IACb,CAAA,CAAA,MAAQ;AAAE,MAAA,OAAO,KAAA;AAAA,IAAO;AAAA,EAC1B,GAAG,CAAC,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAC,CAAA;AAEjC,EAAA,MAAM,MAAA,GAASA,iBAAAA,CAAY,OAAO,EAAA,KAAiC;AACjE,IAAA,IAAI,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,KAAA;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,cAAA,EAAiB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,QACxE,MAAA,EAAQ,QAAA;AAAA,QACR,SAAS,OAAA;AAAQ,OAClB,CAAA;AACD,MAAA,IAAI,GAAA,CAAI,EAAA,EAAI,MAAM,OAAA,EAAQ;AAC1B,MAAA,OAAO,GAAA,CAAI,EAAA;AAAA,IACb,CAAA,CAAA,MAAQ;AAAE,MAAA,OAAO,KAAA;AAAA,IAAO;AAAA,EAC1B,GAAG,CAAC,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAC,CAAA;AAEjC,EAAA,MAAM,GAAA,GAAMA,iBAAAA,CAAY,OAAO,EAAA,KAA4C;AACzE,IAAA,IAAI,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,IAAA;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,cAAA,EAAiB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI,EAAE,OAAA,EAAS,OAAA,IAAW,CAAA;AAChG,MAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,IAAA;AACpB,MAAA,OAAO,MAAM,IAAI,IAAA,EAAK;AAAA,IACxB,CAAA,CAAA,MAAQ;AAAE,MAAA,OAAO,IAAA;AAAA,IAAM;AAAA,EACzB,CAAA,EAAG,CAAC,KAAA,EAAO,MAAA,EAAQ,IAAI,CAAC,CAAA;AAExB,EAAA,OAAO,EAAE,cAAc,SAAA,EAAW,KAAA,EAAO,QAAQ,MAAA,EAAQ,MAAA,EAAQ,KAAK,OAAA,EAAQ;AAChF;AC5CO,SAAS,cAAA,GAAuC;AACrD,EAAA,MAAM,EAAE,WAAA,EAAa,MAAA,EAAO,GAAI,YAAA,EAAa;AAC7C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIF,cAAAA,CAAuB,EAAE,CAAA;AAC/D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,IAAA,GAAQ,QAAgB,OAAA,IAAW,gCAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,WAAA;AAEd,EAAA,MAAM,UAAU,OAA+B;AAAA,IAC7C,aAAA,EAAe,CAAA,OAAA,EAAU,KAAA,EAAO,MAAA,IAAU,EAAE,CAAA,CAAA;AAAA,IAC5C,aAAA,EAAe,KAAA,EAAO,QAAA,IAAa,MAAA,EAAgB,QAAA,IAAY,EAAA;AAAA,IAC/D,cAAA,EAAgB;AAAA,GAClB,CAAA;AAEA,EAAA,MAAM,OAAA,GAAUE,kBAAY,YAAY;AACtC,IAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AACpB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,IAAI,gBAAgB,EAAE,OAAA,EAAS,OAAA,EAAQ,EAAG,CAAA;AACrE,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AAAE,QAAA,QAAA,CAAS,CAAA,4BAAA,EAA+B,GAAA,CAAI,MAAM,CAAA,CAAA,CAAG,CAAA;AAAG,QAAA;AAAA,MAAQ;AAC/E,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAG5B,MAAA,cAAA,CAAe,KAAA,CAAM,QAAQ,IAAI,CAAA,GAAI,OAAQ,IAAA,CAAK,WAAA,IAAe,EAAG,CAAA;AAAA,IACtE,SAAS,CAAA,EAAQ;AACf,MAAA,QAAA,CAAS,CAAA,CAAE,WAAW,4BAA4B,CAAA;AAAA,IACpD,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,KAAA,EAAO,QAAQ,KAAA,EAAO,QAAA,EAAU,IAAI,CAAC,CAAA;AAEzC,EAAAD,gBAAU,MAAM;AAAE,IAAA,OAAA,EAAQ;AAAA,EAAG,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEzC,EAAA,MAAM,MAAA,GAASC,iBAAAA,CAAY,OAAO,KAAA,KAA6D;AAC7F,IAAA,IAAI,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,IAAA;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,YAAA,CAAA,EAAgB;AAAA,QAC7C,MAAA,EAAQ,MAAA;AAAA,QACR,SAAS,OAAA,EAAQ;AAAA,QACjB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,OAC3B,CAAA;AACD,MAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,IAAA;AACpB,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,MAAM,OAAA,EAAQ;AACd,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AAAE,MAAA,OAAO,IAAA;AAAA,IAAM;AAAA,EACzB,GAAG,CAAC,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAC,CAAA;AAEjC,EAAA,MAAM,MAAA,GAASA,iBAAAA,CAAY,OAAO,EAAA,EAAY,KAAA,KAAmD;AAC/F,IAAA,IAAI,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,KAAA;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,aAAA,EAAgB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,QACvE,MAAA,EAAQ,KAAA;AAAA,QACR,SAAS,OAAA,EAAQ;AAAA,QACjB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,OAC3B,CAAA;AACD,MAAA,IAAI,GAAA,CAAI,EAAA,EAAI,MAAM,OAAA,EAAQ;AAC1B,MAAA,OAAO,GAAA,CAAI,EAAA;AAAA,IACb,CAAA,CAAA,MAAQ;AAAE,MAAA,OAAO,KAAA;AAAA,IAAO;AAAA,EAC1B,GAAG,CAAC,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAC,CAAA;AAEjC,EAAA,MAAM,MAAA,GAASA,iBAAAA,CAAY,OAAO,EAAA,KAAiC;AACjE,IAAA,IAAI,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,KAAA;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,aAAA,EAAgB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,QACvE,MAAA,EAAQ,QAAA;AAAA,QACR,SAAS,OAAA;AAAQ,OAClB,CAAA;AACD,MAAA,IAAI,GAAA,CAAI,EAAA,EAAI,MAAM,OAAA,EAAQ;AAC1B,MAAA,OAAO,GAAA,CAAI,EAAA;AAAA,IACb,CAAA,CAAA,MAAQ;AAAE,MAAA,OAAO,KAAA;AAAA,IAAO;AAAA,EAC1B,GAAG,CAAC,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAC,CAAA;AAEjC,EAAA,MAAM,KAAA,GAAQA,iBAAAA,CAAY,OAAO,EAAA,KAAiC;AAChE,IAAA,IAAI,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,KAAA;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,aAAA,EAAgB,kBAAA,CAAmB,EAAE,CAAC,CAAA,MAAA,CAAA,EAAU;AAAA,QAC7E,MAAA,EAAQ,MAAA;AAAA,QACR,SAAS,OAAA;AAAQ,OAClB,CAAA;AACD,MAAA,IAAI,GAAA,CAAI,EAAA,EAAI,MAAM,OAAA,EAAQ;AAC1B,MAAA,OAAO,GAAA,CAAI,EAAA;AAAA,IACb,CAAA,CAAA,MAAQ;AAAE,MAAA,OAAO,KAAA;AAAA,IAAO;AAAA,EAC1B,GAAG,CAAC,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAC,CAAA;AAEjC,EAAA,MAAM,MAAA,GAASA,iBAAAA,CAAY,OAAO,EAAA,KAAiC;AACjE,IAAA,IAAI,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,KAAA;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,aAAA,EAAgB,kBAAA,CAAmB,EAAE,CAAC,CAAA,OAAA,CAAA,EAAW;AAAA,QAC9E,MAAA,EAAQ,MAAA;AAAA,QACR,SAAS,OAAA;AAAQ,OAClB,CAAA;AACD,MAAA,IAAI,GAAA,CAAI,EAAA,EAAI,MAAM,OAAA,EAAQ;AAC1B,MAAA,OAAO,GAAA,CAAI,EAAA;AAAA,IACb,CAAA,CAAA,MAAQ;AAAE,MAAA,OAAO,KAAA;AAAA,IAAO;AAAA,EAC1B,GAAG,CAAC,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAC,CAAA;AAEjC,EAAA,MAAM,MAAA,GAASA,iBAAAA,CAAY,OAAO,EAAA,KAAe;AAC/C,IAAA,IAAI,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,IAAA;AAC3B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,aAAA,EAAgB,kBAAA,CAAmB,EAAE,CAAC,CAAA,IAAA,CAAA,EAAQ;AAAA,QAC3E,MAAA,EAAQ,MAAA;AAAA,QACR,SAAS,OAAA;AAAQ,OAClB,CAAA;AACD,MAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,IAAA;AACpB,MAAA,OAAO,MAAM,IAAI,IAAA,EAAK;AAAA,IACxB,CAAA,CAAA,MAAQ;AAAE,MAAA,OAAO,IAAA;AAAA,IAAM;AAAA,EACzB,CAAA,EAAG,CAAC,KAAA,EAAO,MAAA,EAAQ,IAAI,CAAC,CAAA;AAExB,EAAA,MAAM,OAAA,GAAUA,iBAAAA,CAAY,OAAO,EAAA,EAAY,QAAQ,EAAA,KAAiC;AACtF,IAAA,IAAI,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,EAAC;AAC5B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,GAAG,IAAI,CAAA,aAAA,EAAgB,mBAAmB,EAAE,CAAC,eAAe,KAAK,CAAA,CAAA;AAC7E,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK,EAAE,OAAA,EAAS,OAAA,IAAW,CAAA;AACnD,MAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,EAAC;AACrB,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAE5B,MAAA,OAAO,MAAM,OAAA,CAAQ,IAAI,IAAI,IAAA,GAAQ,IAAA,CAAK,QAAQ,EAAC;AAAA,IACrD,CAAA,CAAA,MAAQ;AAAE,MAAA,OAAO,EAAC;AAAA,IAAG;AAAA,EACvB,CAAA,EAAG,CAAC,KAAA,EAAO,MAAA,EAAQ,IAAI,CAAC,CAAA;AAExB,EAAA,OAAO,EAAE,WAAA,EAAa,SAAA,EAAW,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAQ;AAC1G;ACtNO,SAAS,SAAA,CAAU;AAAA,EACxB,SAAA;AAAA,EACA,OAAA;AAAA,EACA,gBAAA,GAAmB,KAAA;AAAA,EACnB,YAAA,GAAe,WAAA;AAAA,EACf,SAAA,GAAY,EAAA;AAAA,EACZ,cAAA,GAAiB,EAAA;AAAA,EACjB,eAAA,GAAkB,EAAA;AAAA,EAClB,SAAS;AACX,CAAA,EAAmB;AACjB,EAAA,MAAM,EAAE,KAAA,EAAAM,MAAAA,EAAO,WAAW,KAAA,EAAO,SAAA,KAAc,OAAA,EAAQ;AAEvD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIR,eAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,YAAA,GAAe,OAAO,CAAA,KAAiB;AAC3C,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,QAAA,EAAU;AACvB,MAAA,QAAA,CAAS,2BAA2B,CAAA;AACpC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAMQ,MAAAA,CAAM,KAAA,EAAO,QAAQ,CAAA;AAC3C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,SAAA,IAAY;AAAA,MACd,CAAA,MAAO;AACL,QAAA,MAAM,WAAW,SAAA,IAAa,cAAA;AAC9B,QAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,QAAA,OAAA,GAAU,QAAQ,CAAA;AAAA,MACpB;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,QAAA,GAAW,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,cAAA;AACtD,MAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,MAAA,OAAA,GAAU,QAAQ,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,eAAe,KAAA,IAAS,SAAA;AAE9B,EAAA,uCACG,MAAA,EAAA,EAAK,QAAA,EAAU,cAAc,SAAA,EAAW,CAAA,qBAAA,EAAwB,SAAS,CAAA,CAAA,EACxE,QAAA,EAAA;AAAA,oBAAAF,eAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uBAAA,EACX,QAAA,EAAA,MAAA,CAAO,SAAS,SAAA,EACnB,CAAA;AAAA,IAEC,YAAA,oBACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uBAAA,EAAwB,IAAA,EAAK,SACzC,QAAA,EAAA,YAAA,EACH,CAAA;AAAA,oBAGFsB,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,sBAAAtB,eAAC,OAAA,EAAA,EAAM,OAAA,EAAQ,iBAAA,EACZ,QAAA,EAAA,MAAA,CAAO,SAAS,OAAA,EACnB,CAAA;AAAA,sBACAA,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAG,iBAAA;AAAA,UACH,IAAA,EAAK,OAAA;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACxC,WAAA,EAAY,iBAAA;AAAA,UACZ,QAAA,EAAU,SAAA;AAAA,UACV,QAAA,EAAQ,IAAA;AAAA,UACR,YAAA,EAAa,OAAA;AAAA,UACb,SAAA,EAAW;AAAA;AAAA;AACb,KAAA,EACF,CAAA;AAAA,oBAEAsB,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,sBAAAtB,eAAC,OAAA,EAAA,EAAM,OAAA,EAAQ,oBAAA,EACZ,QAAA,EAAA,MAAA,CAAO,YAAY,UAAA,EACtB,CAAA;AAAA,sBACAA,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAG,oBAAA;AAAA,UACH,IAAA,EAAK,UAAA;AAAA,UACL,KAAA,EAAO,QAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UAC3C,WAAA,EAAY,gBAAA;AAAA,UACZ,QAAA,EAAU,SAAA;AAAA,UACV,QAAA,EAAQ,IAAA;AAAA,UACR,YAAA,EAAa,kBAAA;AAAA,UACb,SAAA,EAAW;AAAA;AAAA;AACb,KAAA,EACF,CAAA;AAAA,oBAEAA,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,QAAA,EAAU,SAAA;AAAA,QACV,SAAA,EAAW,0BAA0B,eAAe,CAAA,CAAA;AAAA,QAEnD,QAAA,EAAA,SAAA,GAAa,MAAA,CAAO,OAAA,IAAW,eAAA,GAAoB,OAAO,MAAA,IAAU;AAAA;AAAA,KACvE;AAAA,IAEC,gBAAA,oBACCsB,eAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0BAAA,EAA2B,QAAA,EAAA;AAAA,MAAA,wBAAA;AAAA,MACV,GAAA;AAAA,sBAC5BtB,cAAAA,CAAC,GAAA,EAAA,EAAE,MAAM,YAAA,EACN,QAAA,EAAA,MAAA,CAAO,YAAY,UAAA,EACtB;AAAA,KAAA,EACF,CAAA;AAAA,oBAGFA,eAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,EA0EN;AAAA,GAAA,EACJ,CAAA;AAEJ;ACpLO,SAAS,YAAA,CAAa;AAAA,EAC3B,SAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA,GAAgB,KAAA;AAAA,EAChB,SAAA,GAAY,QAAA;AAAA,EACZ,iBAAA,GAAoB,CAAA;AAAA,EACpB,SAAA,GAAY,EAAA;AAAA,EACZ,cAAA,GAAiB,EAAA;AAAA,EACjB,eAAA,GAAkB,EAAA;AAAA,EAClB,SAAS;AACX,CAAA,EAAsB;AACpB,EAAA,MAAM,EAAE,QAAA,EAAAG,SAAAA,EAAU,WAAW,KAAA,EAAO,SAAA,KAAc,OAAA,EAAQ;AAE1D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIT,eAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,eAAS,EAAE,CAAA;AACzD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,YAAA,GAAe,OAAO,CAAA,KAAiB;AAC3C,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,QAAA,IAAY,CAAC,eAAA,EAAiB;AAC3C,MAAA,QAAA,CAAS,2BAA2B,CAAA;AACpC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,CAAS,SAAS,iBAAA,EAAmB;AACvC,MAAA,QAAA,CAAS,CAAA,0BAAA,EAA6B,iBAAiB,CAAA,WAAA,CAAa,CAAA;AACpE,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,aAAa,eAAA,EAAiB;AAChC,MAAA,QAAA,CAAS,wBAAwB,CAAA;AACjC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAMS,SAAAA,CAAS,KAAA,EAAO,QAAQ,CAAA;AAC9C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,SAAA,IAAY;AAAA,MACd,CAAA,MAAO;AACL,QAAA,MAAM,WAAW,SAAA,IAAa,qBAAA;AAC9B,QAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,QAAA,OAAA,GAAU,QAAQ,CAAA;AAAA,MACpB;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,QAAA,GAAW,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,qBAAA;AACtD,MAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,MAAA,OAAA,GAAU,QAAQ,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,eAAe,KAAA,IAAS,SAAA;AAE9B,EAAA,uBACEmB,gBAAC,MAAA,EAAA,EAAK,QAAA,EAAU,cAAc,SAAA,EAAW,CAAA,wBAAA,EAA2B,SAAS,CAAA,CAAA,EAC3E,QAAA,EAAA;AAAA,oBAAAtB,eAAC,IAAA,EAAA,EAAG,SAAA,EAAU,0BAAA,EACX,QAAA,EAAA,MAAA,CAAO,SAAS,gBAAA,EACnB,CAAA;AAAA,IAEC,YAAA,oBACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0BAAA,EAA2B,IAAA,EAAK,SAC5C,QAAA,EAAA,YAAA,EACH,CAAA;AAAA,oBAGFsB,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACb,QAAA,EAAA;AAAA,sBAAAtB,eAAC,OAAA,EAAA,EAAM,OAAA,EAAQ,qBAAA,EACZ,QAAA,EAAA,MAAA,CAAO,SAAS,OAAA,EACnB,CAAA;AAAA,sBACAA,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAG,qBAAA;AAAA,UACH,IAAA,EAAK,OAAA;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACxC,WAAA,EAAY,iBAAA;AAAA,UACZ,QAAA,EAAU,SAAA;AAAA,UACV,QAAA,EAAQ,IAAA;AAAA,UACR,YAAA,EAAa,OAAA;AAAA,UACb,SAAA,EAAW;AAAA;AAAA;AACb,KAAA,EACF,CAAA;AAAA,oBAEAsB,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACb,QAAA,EAAA;AAAA,sBAAAtB,eAAC,OAAA,EAAA,EAAM,OAAA,EAAQ,wBAAA,EACZ,QAAA,EAAA,MAAA,CAAO,YAAY,UAAA,EACtB,CAAA;AAAA,sBACAA,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAG,wBAAA;AAAA,UACH,IAAA,EAAK,UAAA;AAAA,UACL,KAAA,EAAO,QAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UAC3C,WAAA,EAAa,YAAY,iBAAiB,CAAA,WAAA,CAAA;AAAA,UAC1C,QAAA,EAAU,SAAA;AAAA,UACV,QAAA,EAAQ,IAAA;AAAA,UACR,YAAA,EAAa,cAAA;AAAA,UACb,SAAA,EAAW;AAAA;AAAA;AACb,KAAA,EACF,CAAA;AAAA,oBAEAsB,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACb,QAAA,EAAA;AAAA,sBAAAtB,eAAC,OAAA,EAAA,EAAM,OAAA,EAAQ,uBAAA,EACZ,QAAA,EAAA,MAAA,CAAO,mBAAmB,kBAAA,EAC7B,CAAA;AAAA,sBACAA,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAG,uBAAA;AAAA,UACH,IAAA,EAAK,UAAA;AAAA,UACL,KAAA,EAAO,eAAA;AAAA,UACP,UAAU,CAAC,CAAA,KAAM,kBAAA,CAAmB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UAClD,WAAA,EAAY,uBAAA;AAAA,UACZ,QAAA,EAAU,SAAA;AAAA,UACV,QAAA,EAAQ,IAAA;AAAA,UACR,YAAA,EAAa,cAAA;AAAA,UACb,SAAA,EAAW;AAAA;AAAA;AACb,KAAA,EACF,CAAA;AAAA,oBAEAA,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,QAAA,EAAU,SAAA;AAAA,QACV,SAAA,EAAW,6BAA6B,eAAe,CAAA,CAAA;AAAA,QAEtD,QAAA,EAAA,SAAA,GAAa,MAAA,CAAO,OAAA,IAAW,qBAAA,GAA0B,OAAO,MAAA,IAAU;AAAA;AAAA,KAC7E;AAAA,IAEC,aAAA,oBACCsB,eAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,0BAAA,EAA2B,QAAA,EAAA;AAAA,MAAA,0BAAA;AAAA,MACb,GAAA;AAAA,sBACzBtB,cAAAA,CAAC,GAAA,EAAA,EAAE,MAAM,SAAA,EACN,QAAA,EAAA,MAAA,CAAO,SAAS,SAAA,EACnB;AAAA,KAAA,EACF,CAAA;AAAA,oBAGFA,eAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,EA0EN;AAAA,GAAA,EACJ,CAAA;AAEJ;ACvOO,SAAS,YAAA,CAAa;AAAA,EAC3B,SAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,KAAA,GAAQ;AACV,CAAA,EAAsB;AACpB,EAAA,MAAM,EAAE,YAAA,EAAc,SAAA,EAAW,KAAA,KAAU,OAAA,EAAQ;AAEnD,EAAA,MAAM,cAAc,YAAY;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,EAAa;AAEnB,MAAA,SAAA,IAAY;AAAA,IACd,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,QAAA,GAAW,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,uBAAA;AACtD,MAAA,OAAA,GAAU,QAAQ,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEsB,eAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,WAAA;AAAA,MACT,QAAA,EAAU,SAAA;AAAA,MACV,SAAA,EAAW,2BAA2B,SAAS,CAAA,CAAA;AAAA,MAE/C,QAAA,EAAA;AAAA,wBAAAA,eAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,uBAAA;AAAA,YACV,OAAA,EAAQ,WAAA;AAAA,YACR,KAAA,EAAM,IAAA;AAAA,YACN,MAAA,EAAO,IAAA;AAAA,YAEP,QAAA,EAAA;AAAA,8BAAAtB,cAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,SAAA;AAAA,kBACL,CAAA,EAAE;AAAA;AAAA,eACJ;AAAA,8BACAA,cAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,SAAA;AAAA,kBACL,CAAA,EAAE;AAAA;AAAA,eACJ;AAAA,8BACAA,cAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,SAAA;AAAA,kBACL,CAAA,EAAE;AAAA;AAAA,eACJ;AAAA,8BACAA,cAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,SAAA;AAAA,kBACL,CAAA,EAAE;AAAA;AAAA;AACJ;AAAA;AAAA,SACF;AAAA,wBACAA,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,SAAA,GAAY,eAAe,KAAA,EAAM,CAAA;AAAA,QAEvC,yBACCA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAA0B,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBAGlDA,eAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,EAmCN;AAAA;AAAA;AAAA,GACJ;AAEJ;ACpGA,IAAM,kBAAA,GAAqB,iDAAA;AAI3B,IAAM,sBAAA,GAAyB,qCAAA;AAK/B,SAAS,qBAAqB,SAAA,EAA2B;AACvD,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,SAAS,CAAA;AAC7B,IAAA,OAAO,GAAA,CAAI,MAAA;AAAA,EACb,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,sBAAA;AAAA,EACT;AACF;AAmBA,SAAS,gBAAgB,IAAA,EAAsC;AAC7D,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,KAAA;AAC9C,EAAA,MAAM,CAAA,GAAI,IAAA;AACV,EAAA,OAAO,CAAA,CAAE,SAAS,wBAAA,IAA4B,OAAO,EAAE,KAAA,KAAU,QAAA,IAAY,CAAC,CAAC,CAAA,CAAE,WAAA;AACnF;AAEO,SAAS,mBAAA,CAAoB;AAAA,EAClC,SAAA,GAAY,kBAAA;AAAA,EACZ,KAAA,GAAQ,yBAAA;AAAA,EACR,SAAA,GAAY,EAAA;AAAA,EACZ;AACF,CAAA,EAA6B;AAC3B,EAAA,MAAM,EAAE,cAAA,EAAgB,MAAA,EAAO,GAAI,YAAA,EAAa;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIN,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,QAAA,GAAWe,aAAsB,IAAI,CAAA;AAC3C,EAAA,MAAM,QAAA,GAAWA,aAAe,EAAE,CAAA;AAClC,EAAA,MAAM,iBAAA,GAAoBA,YAAAA,CAAe,oBAAA,CAAqB,SAAS,CAAC,CAAA;AAExE,EAAAd,gBAAU,MAAM;AACd,IAAA,iBAAA,CAAkB,OAAA,GAAU,qBAAqB,SAAS,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAGd,EAAAA,gBAAU,MAAM;AACd,IAAA,MAAM,QAAA,GAAW,CAAC,KAAA,KAAwB;AAExC,MAAA,IAAI,KAAA,CAAM,MAAA,KAAW,iBAAA,CAAkB,OAAA,EAAS;AAMhD,MAAA,IACE,QAAA,CAAS,WACT,KAAA,CAAM,MAAA,KAAW,QACjB,KAAA,CAAM,MAAA,KAAW,SAAS,OAAA,EAC1B;AAEF,MAAA,IAAI,CAAC,eAAA,CAAgB,KAAA,CAAM,IAAI,CAAA,EAAG;AAElC,MAAA,IAAI,KAAA,CAAM,IAAA,CAAK,KAAA,KAAU,QAAA,CAAS,OAAA,EAAS;AACzC,QAAA,QAAA,CAAS,kDAAkD,CAAA;AAC3D,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,CAAA,GAAI,MAAM,IAAA,CAAK,WAAA;AACrB,MAAA,IAAI,CAAC,CAAA,CAAE,MAAA,IAAU,CAAC,EAAE,QAAA,EAAU;AAC5B,QAAA,QAAA,CAAS,yCAAyC,CAAA;AAClD,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAA8B;AAAA,QAClC,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,WAAW,CAAA,CAAE;AAAA,OACf;AACA,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,SAAA,GAAY,KAAK,CAAA;AAAA,IACnB,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,QAAQ,CAAA;AAC3C,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,QAAQ,CAAA;AAAA,EAC7D,CAAA,EAAG,CAAC,cAAA,EAAgB,SAAS,CAAC,CAAA;AAE9B,EAAA,MAAM,WAAA,GAAcC,kBAAY,MAAM;AACpC,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,YAAA,CAAa,IAAI,CAAA;AAGjB,IAAA,MAAM,KAAA,GACJ,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAA;AAC9D,IAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AAMnB,IAAA,IAAI,YAAA,GAAe,KAAA;AACnB,IAAA,IAAI;AACF,MAAA,YAAA,GAAe,OAAO,MAAA,KAAW,WAAA,IAC5B,OAAO,YAAA,CAAa,OAAA,CAAQ,yBAAyB,CAAA,KAAM,GAAA;AAChE,MAAA,IAAI,YAAA,EAAc,MAAA,CAAO,YAAA,CAAa,UAAA,CAAW,yBAAyB,CAAA;AAAA,IAC5E,CAAA,CAAA,MAAQ;AAAA,IAAyD;AAEjE,IAAA,MAAM,GAAA,GACJ,CAAA,EAAG,SAAS,CAAA,QAAA,EAAW,kBAAA,CAAmB,OAAO,QAAA,CAAS,MAAM,CAAC,CAAA,OAAA,EACvD,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA,IAClC,MAAA,CAAO,QAAA,GAAW,CAAA,WAAA,EAAc,kBAAA,CAAmB,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA,GAAK,EAAA,CAAA,IACxE,YAAA,GAAe,gBAAA,GAAmB,EAAA,CAAA;AAErC,IAAA,MAAM,QAAQ,MAAA,CAAO,IAAA;AAAA,MACnB,GAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,QAAA,CAAS,oEAAoE,CAAA;AAC7E,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA;AAAA,IACF;AACA,IAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AAGnB,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,WAAA,CAAY,MAAM;AACxC,MAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,QAAA,MAAA,CAAO,cAAc,QAAQ,CAAA;AAG7B,QAAA,YAAA,CAAa,CAAC,IAAA,KAAU,IAAA,GAAO,KAAA,GAAQ,IAAK,CAAA;AAAA,MAC9C;AAAA,IACF,GAAG,GAAG,CAAA;AAAA,EACR,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,uBACE0B,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EACH,QAAA,EAAA;AAAA,oBAAAtB,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,WAAA;AAAA,QACT,QAAA,EAAU,SAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,KAAA,EAAO,MAAA;AAAA,UACP,OAAA,EAAS,WAAA;AAAA,UACT,UAAA,EAAY,SAAA;AAAA,UACZ,KAAA,EAAO,SAAA;AAAA,UACP,MAAA,EAAQ,MAAA;AAAA,UACR,YAAA,EAAc,MAAA;AAAA,UACd,QAAA,EAAU,MAAA;AAAA,UACV,UAAA,EAAY,GAAA;AAAA,UACZ,MAAA,EAAQ,YAAY,SAAA,GAAY,SAAA;AAAA,UAChC,OAAA,EAAS,YAAY,GAAA,GAAM,CAAA;AAAA,UAC3B,UAAA,EAAY;AAAA,SACd;AAAA,QAEC,sBAAY,kBAAA,GAAgB;AAAA;AAAA,KAC/B;AAAA,IACC,yBACCA,cAAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO;AAAA,UACL,SAAA,EAAW,KAAA;AAAA,UACX,KAAA,EAAO,SAAA;AAAA,UACP,QAAA,EAAU,MAAA;AAAA,UACV,UAAA,EAAY;AAAA,SACd;AAAA,QAEC,QAAA,EAAA;AAAA;AAAA;AACH,GAAA,EAEJ,CAAA;AAEJ;AC5KA,IAAM,UAAU,sBACdsB,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wBAAA,EACb,QAAA,EAAA;AAAA,kBAAAtB,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAAyB,CAAA;AAAA,kBACxCA,eAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA,EAIN;AAAA,CAAA,EACJ,CAAA;AAMK,SAAS,SAAA,CAAU;AAAA,EACxB,QAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,gBAAA;AAAA,EACA,gBAAA,GAAmB,KAAA;AAAA,EACnB,UAAA,GAAa;AACf,CAAA,EAAmB;AACjB,EAAA,MAAM;AAAA,IACJ,eAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,MACE,YAAA,EAAa;AAGjB,EAAA,MAAM,WAAY,MAAA,EAAgB,QAAA;AAClC,EAAA,MAAM,OAAA,GAAY,QAAgB,OAAA,IAAkC,gCAAA;AACpE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIN,eAAgD,MAAM,CAAA;AAC5F,EAAA,MAAM,eAAA,GAAkBe,aAAO,KAAK,CAAA;AAEpC,EAAAd,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,cAAc,CAAC,aAAA,IAAiB,mBAAmB,CAAC,QAAA,IAAY,gBAAgB,OAAA,EAAS;AAC5F,MAAA;AAAA,IACF;AAKA,IAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAC1B,IAAA,cAAA,CAAe,QAAQ,CAAA;AACvB,IAAA,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,WAAA,CAAA,EAAe;AAAA,MAC7B,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,UAAU;AAAA,KAC3C,CAAA,CACE,IAAA,CAAK,CAAC,CAAA,KAAO,CAAA,CAAE,KAAK,CAAA,CAAE,IAAA,EAAK,GAAI,OAAA,CAAQ,OAAO,CAAA,CAAE,MAAM,CAAE,CAAA,CACxD,IAAA,CAAK,CAAC,IAAA,KAAS;AACd,MAAA,IAAI,MAAM,KAAA,EAAO;AAIf,QAAA,cAAA,CAAe,MAAM,CAAA;AACrB,QAAA,cAAA,CAAe,EAAE,MAAA,EAAQ,IAAA,CAAK,KAAA,EAAO,QAAA,EAAU,KAAK,SAAA,EAAW,MAAA,EAAQ,IAAA,CAAK,OAAA,EAAS,CAAA;AAAA,MACvF,CAAA,MAAO;AACL,QAAA,cAAA,CAAe,QAAQ,CAAA;AAAA,MACzB;AAAA,IACF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAEX,MAAA,cAAA,CAAe,QAAQ,CAAA;AAAA,IACzB,CAAC,CAAA;AAAA,EAEL,CAAA,EAAG,CAAC,UAAA,EAAY,aAAA,EAAe,iBAAiB,QAAA,EAAU,OAAA,EAAS,cAAc,CAAC,CAAA;AAOlF,EAAAA,gBAAU,MAAM;AAAA,EAGhB,CAAA,EAAG,CAAC,aAAA,EAAe,eAAA,EAAiB,UAAU,CAAC,CAAA;AAG/C,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,gBAAA,mBAAmBK,cAAAA,CAAAuB,mBAAA,EAAA,EAAG,4BAAiB,CAAA,mBAAMvB,eAAC,OAAA,EAAA,EAAQ,CAAA;AAAA,EAC/D;AAIA,EAAA,IAAI,CAAC,eAAA,IAAmB,UAAA,IAAc,QAAA,IAAY,gBAAgB,QAAA,EAAU;AAC1E,IAAA,OAAO,gBAAA,mBAAmBA,cAAAA,CAAAuB,mBAAA,EAAA,EAAG,4BAAiB,CAAA,mBAAMvB,eAAC,OAAA,EAAA,EAAQ,CAAA;AAAA,EAC/D;AAMA,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,IAAI,QAAA,EAAU,uBAAOA,cAAAA,CAAAuB,uBAAG,QAAA,EAAA,QAAA,EAAS,CAAA;AACjC,IAAA,uBACED,eAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,EAAE,OAAA,EAAS,QAAQ,aAAA,EAAe,QAAA,EAAU,YAAY,QAAA,EAAU,cAAA,EAAgB,UAAU,SAAA,EAAW,QAAA,EAAU,KAAK,MAAA,EAAQ,OAAA,EAAS,QAAO,EACxJ,QAAA,EAAA;AAAA,sBAAAtB,cAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAS,EAAG,QAAA,EAAA,qBAAA,EAAmB,CAAA;AAAA,sBAC1FA,eAAC,mBAAA,EAAA,EAAoB;AAAA,KAAA,EACvB,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,gBAAA,IAAoB,CAAC,iBAAA,EAAmB;AAC1C,IAAA,uBACEsB,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,sBAAAtB,cAAAA,CAAC,OAAE,QAAA,EAAA,wCAAA,EAAsC,CAAA;AAAA,sBACzCA,eAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA,EAQN;AAAA,KAAA,EACJ,CAAA;AAAA,EAEJ;AAGA,EAAA,uBAAOA,cAAAA,CAAAuB,mBAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AACrB;ACtJO,SAAS,SAAA,CAAU;AAAA,EACxB,QAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA,GAAa;AACf,CAAA,EAAmB;AACjB,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI7B,eAAS,MAAM;AAC3C,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAC1C,IAAA,OAAO,YAAA,CAAa,OAAA,CAAQ,UAAU,CAAA,KAAM,MAAA;AAAA,EAC9C,CAAC,CAAA;AACD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAS,EAAE,CAAA;AAErC,EAAA,MAAM,YAAA,GAAeE,iBAAAA;AAAA,IACnB,OAAO,CAAA,KAAuB;AAC5B,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,IAAI,CAAC,QAAA,CAAS,IAAA,EAAK,EAAG;AAEtB,MAAA,IAAI,CAAC,YAAA,EAAc;AAEjB,QAAA,YAAA,CAAa,OAAA,CAAQ,YAAY,MAAM,CAAA;AACvC,QAAA,UAAA,CAAW,IAAI,CAAA;AACf,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAO,IAAI,WAAA,EAAY,CAAE,OAAO,QAAQ,CAAA;AAC9C,MAAA,MAAM,aAAa,MAAM,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,WAAW,IAAI,CAAA;AAC7D,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,IAAI,WAAW,UAAU,CAAC,EAClD,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAC,CAAA,CAC1C,IAAA,CAAK,EAAE,CAAA;AAEV,MAAA,IAAI,YAAY,YAAA,EAAc;AAC5B,QAAA,YAAA,CAAa,OAAA,CAAQ,YAAY,MAAM,CAAA;AACvC,QAAA,UAAA,CAAW,IAAI,CAAA;AAAA,MACjB,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,wBAAwB,CAAA;AAAA,MACnC;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAA,EAAU,YAAA,EAAc,UAAU;AAAA,GACrC;AAEA,EAAA,IAAI,SAAS,uBAAOI,cAAAA,CAAAuB,mBAAAA,EAAA,EAAG,QAAA,EAAS,CAAA;AAChC,EAAA,IAAI,UAAU,uBAAOvB,cAAAA,CAAAuB,mBAAAA,EAAA,EAAG,QAAA,EAAA,QAAA,EAAS,CAAA;AAEjC,EAAA,uBACEvB,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,cAAA,EAAgB,QAAA;AAAA,QAChB,UAAA,EAAY,QAAA;AAAA,QACZ,SAAA,EAAW;AAAA,OACb;AAAA,MAEA,QAAA,kBAAAsB,gBAAC,MAAA,EAAA,EAAK,QAAA,EAAU,cAAc,KAAA,EAAO,EAAE,SAAA,EAAW,QAAA,EAAS,EACzD,QAAA,EAAA;AAAA,wBAAAtB,cAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,YAAA,EAAc,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAU,EAAG,QAAA,EAAA,uBAAA,EAEvE,CAAA;AAAA,wBACAA,cAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,UAAA;AAAA,YACL,KAAA,EAAO,QAAA;AAAA,YACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,cAAA,WAAA,CAAY,CAAA,CAAE,OAAO,KAAK,CAAA;AAC1B,cAAA,QAAA,CAAS,EAAE,CAAA;AAAA,YACb,CAAA;AAAA,YACA,WAAA,EAAY,sBAAA;AAAA,YACZ,KAAA,EAAO;AAAA,cACL,OAAA,EAAS,UAAA;AAAA,cACT,MAAA,EAAQ,mBAAA;AAAA,cACR,YAAA,EAAc,KAAA;AAAA,cACd,WAAA,EAAa,KAAA;AAAA,cACb,QAAA,EAAU;AAAA;AACZ;AAAA,SACF;AAAA,wBACAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,KAAA,EAAO;AAAA,cACL,OAAA,EAAS,UAAA;AAAA,cACT,UAAA,EAAY,SAAA;AAAA,cACZ,KAAA,EAAO,MAAA;AAAA,cACP,MAAA,EAAQ,MAAA;AAAA,cACR,YAAA,EAAc,KAAA;AAAA,cACd,MAAA,EAAQ,SAAA;AAAA,cACR,QAAA,EAAU;AAAA,aACZ;AAAA,YACD,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,QACC,KAAA,oBACCA,cAAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,MAAA,EAAQ,SAAA,EAAW,KAAA,IACxD,QAAA,EAAA,KAAA,EACH;AAAA,OAAA,EAEJ;AAAA;AAAA,GACF;AAEJ;ACvEO,SAAS,iBAAA,CAAkB;AAAA,EAChC,UAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,SAAA,GAAY,EAAA;AAAA,EACZ,WAAA,GAAc;AAChB,CAAA,EAA2B;AACzB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIN,eAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,YAAA,GAAee,aAAuB,IAAI,CAAA;AAGhD,EAAAd,gBAAU,MAAM;AACd,IAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAAsB;AAChD,MAAA,IAAI,YAAA,CAAa,WAAW,CAAC,YAAA,CAAa,QAAQ,QAAA,CAAS,KAAA,CAAM,MAAc,CAAA,EAAG;AAChF,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,kBAAkB,CAAA;AACzD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,kBAAkB,CAAA;AAAA,EAC3E,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAe,CAAC,SAAA,KAA6B;AACjD,IAAA,QAAA,CAAS,SAAS,CAAA;AAClB,IAAA,SAAA,CAAU,KAAK,CAAA;AAAA,EACjB,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,OAAA,KAAoB;AACtC,IAAA,IAAI;AACF,MAAA,OAAO,IAAI,IAAA,CAAK,OAAO,CAAA,CAAE,kBAAA,EAAmB;AAAA,IAC9C,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAA;AAAA,IACT;AAAA,EACF,CAAA;AAEA,EAAA,uBACE2B,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,YAAA;AAAA,MACL,SAAA,EAAW,gCAAgC,SAAS,CAAA,CAAA;AAAA,MAEpD,QAAA,EAAA;AAAA,wBAAAA,eAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,SAAA,CAAU,CAAC,MAAM,CAAA;AAAA,YAChC,QAAA,EAAU,SAAA;AAAA,YACV,SAAA,EAAU,6BAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAAtB,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA,QAAA,EAAU,QAAQ,WAAA,EACrB,CAAA;AAAA,8BACAA,cAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAW,CAAA,4BAAA,EAA+B,MAAA,GAAS,MAAA,GAAS,EAAE,CAAA,CAAA;AAAA,kBAC9D,KAAA,EAAM,IAAA;AAAA,kBACN,MAAA,EAAO,IAAA;AAAA,kBACP,OAAA,EAAQ,WAAA;AAAA,kBACR,IAAA,EAAK,MAAA;AAAA,kBAEL,QAAA,kBAAAA,cAAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBACC,CAAA,EAAE,gBAAA;AAAA,sBACF,MAAA,EAAO,cAAA;AAAA,sBACP,WAAA,EAAY,KAAA;AAAA,sBACZ,aAAA,EAAc,OAAA;AAAA,sBACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA;AACF;AAAA;AAAA,SACF;AAAA,QAEC,MAAA,oBACCsB,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8BAAA,EACZ,QAAA,EAAA;AAAA,UAAA,UAAA,CAAW,MAAA,KAAW,oBACrBtB,cAAAA,CAAC,SAAI,SAAA,EAAU,2BAAA,EAA4B,iCAE3C,CAAA,mBAEAA,eAAC,IAAA,EAAA,EAAG,SAAA,EAAU,4BACX,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,+BACdA,cAAAA,CAAC,QACC,QAAA,kBAAAsB,eAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,MAAM,YAAA,CAAa,SAAS,CAAA;AAAA,cACrC,WAAW,CAAA,yBAAA,EACT,QAAA,EAAU,gBAAgB,SAAA,CAAU,WAAA,GAAc,aAAa,EACjE,CAAA,CAAA;AAAA,cAEA,QAAA,EAAA;AAAA,gCAAAtB,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAAA,EACb,oBAAU,IAAA,EACb,CAAA;AAAA,gCACAsB,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAAA,EACb,QAAA,EAAA;AAAA,kBAAA,SAAA,CAAU,YAAA;AAAA,kBAAa,WAAA;AAAA,kBACvB,UAAU,YAAA,IAAgB,CAAA,QAAA,EAAM,UAAA,CAAW,SAAA,CAAU,YAAY,CAAC,CAAA;AAAA,iBAAA,EACrE;AAAA;AAAA;AAAA,WACF,EAAA,EAfO,SAAA,CAAU,WAgBnB,CACD,CAAA,EACH,CAAA;AAAA,UAGD,+BACCA,eAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAS,MAAM;AACb,gBAAA,SAAA,CAAU,KAAK,CAAA;AACf,gBAAA,WAAA,EAAY;AAAA,cACd,CAAA;AAAA,cACA,SAAA,EAAU,4BAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAAtB,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EACnD,QAAA,kBAAAA,cAAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,CAAA,EAAE,gBAAA;AAAA,oBACF,MAAA,EAAO,cAAA;AAAA,oBACP,WAAA,EAAY,KAAA;AAAA,oBACZ,aAAA,EAAc;AAAA;AAAA,iBAChB,EACF,CAAA;AAAA,gBAAM;AAAA;AAAA;AAAA;AAER,SAAA,EAEJ,CAAA;AAAA,wBAGFA,eAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,EA2GN;AAAA;AAAA;AAAA,GACJ;AAEJ;AC1OO,SAAS,oBAAA,CAAqB;AAAA,EACnC,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,EAA8B;AAC5B,EAAA,MAAM,EAAE,eAAA,EAAAH,gBAAAA,EAAiB,WAAW,KAAA,EAAO,SAAA,KAAc,YAAA,EAAa;AAEtE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIH,eAAS,EAAE,CAAA;AACnC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,QAAA,GAAWe,aAAyB,IAAI,CAAA;AAG9C,EAAAd,gBAAU,MAAM;AACd,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAA,CAAQ,EAAE,CAAA;AACV,MAAA,cAAA,CAAe,EAAE,CAAA;AACjB,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,UAAA,CAAW,MAAM,QAAA,CAAS,OAAA,EAAS,KAAA,IAAS,GAAG,CAAA;AAAA,IACjD;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,EAAAA,gBAAU,MAAM;AACd,IAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAqB;AACzC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,MAAA,EAAQ;AAChC,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF,CAAA;AAEA,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,YAAY,CAAA;AACjD,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,YAAY,CAAA;AAAA,EACnE,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAO,CAAC,CAAA;AAEpB,EAAA,MAAM,YAAA,GAAe,OAAO,CAAA,KAAiB;AAC3C,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAChB,MAAA,QAAA,CAAS,4BAA4B,CAAA;AACrC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,MAAME,gBAAAA,CAAgB,IAAA,CAAK,MAAK,EAAG,WAAA,CAAY,IAAA,EAAK,IAAK,KAAA,CAAS,CAAA;AACpF,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,SAAA,GAAY,SAAS,CAAA;AACrB,QAAA,OAAA,EAAQ;AAAA,MACV,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,aAAa,4BAA4B,CAAA;AAAA,MACpD;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,4BAA4B,CAAA;AAAA,IAC5E;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,MAAM,eAAe,KAAA,IAAS,SAAA;AAE9B,EAAA,uBACEyB,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAW,2BAA2B,SAAS,CAAA,CAAA,EAAI,SAAS,OAAA,EAC/D,QAAA,EAAA;AAAA,oBAAAA,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,yBAAA;AAAA,QACV,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,QAClC,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAW,MAAA;AAAA,QACX,iBAAA,EAAgB,uBAAA;AAAA,QAEhB,QAAA,EAAA;AAAA,0BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,4BAAAtB,cAAAA,CAAC,IAAA,EAAA,EAAG,EAAA,EAAG,uBAAA,EAAwB,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,4BAC/CA,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,OAAA;AAAA,gBACT,SAAA,EAAU,uBAAA;AAAA,gBACV,YAAA,EAAW,OAAA;AAAA,gBAEX,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EACnD,QAAA,kBAAAA,cAAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,CAAA,EAAE,sBAAA;AAAA,oBACF,MAAA,EAAO,cAAA;AAAA,oBACP,WAAA,EAAY,KAAA;AAAA,oBACZ,aAAA,EAAc;AAAA;AAAA,iBAChB,EACF;AAAA;AAAA;AACF,WAAA,EACF,CAAA;AAAA,0BAEAsB,eAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,YAAA,YAAA,oBACCtB,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uBAAA,EAAwB,IAAA,EAAK,SACzC,QAAA,EAAA,YAAA,EACH,CAAA;AAAA,4BAGFsB,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,8BAAAtB,cAAAA,CAAC,OAAA,EAAA,EAAM,OAAA,EAAQ,mBAAA,EAAoB,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,8BACzCA,cAAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,GAAA,EAAK,QAAA;AAAA,kBACL,EAAA,EAAG,mBAAA;AAAA,kBACH,IAAA,EAAK,MAAA;AAAA,kBACL,KAAA,EAAO,IAAA;AAAA,kBACP,UAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,kBACvC,WAAA,EAAY,YAAA;AAAA,kBACZ,QAAA,EAAU,SAAA;AAAA,kBACV,QAAA,EAAQ;AAAA;AAAA;AACV,aAAA,EACF,CAAA;AAAA,4BAEAsB,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,8BAAAtB,cAAAA,CAAC,OAAA,EAAA,EAAM,OAAA,EAAQ,mBAAA,EAAoB,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,8BAC9CA,cAAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACC,EAAA,EAAG,mBAAA;AAAA,kBACH,KAAA,EAAO,WAAA;AAAA,kBACP,UAAU,CAAC,CAAA,KAAM,cAAA,CAAe,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,kBAC9C,WAAA,EAAY,yBAAA;AAAA,kBACZ,QAAA,EAAU,SAAA;AAAA,kBACV,IAAA,EAAM;AAAA;AAAA;AACR,aAAA,EACF,CAAA;AAAA,4BAEAsB,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,8BAAAtB,cAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,OAAA;AAAA,kBACT,QAAA,EAAU,SAAA;AAAA,kBACV,SAAA,EAAU,wBAAA;AAAA,kBACX,QAAA,EAAA;AAAA;AAAA,eAED;AAAA,8BACAA,cAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,QAAA,EAAU,SAAA,IAAa,CAAC,IAAA,CAAK,IAAA,EAAK;AAAA,kBAClC,SAAA,EAAU,wBAAA;AAAA,kBAET,sBAAY,aAAA,GAAgB;AAAA;AAAA;AAC/B,aAAA,EACF;AAAA,WAAA,EACF;AAAA;AAAA;AAAA,KACF;AAAA,oBAEAA,eAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,EAoHN;AAAA,GAAA,EACJ,CAAA;AAEJ;ACvQO,SAAS,eAAA,CAAgB;AAAA,EAC9B,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA,GAAS,gCAAA;AAAA,EACT,SAAA,GAAY,GAAA;AAAA,EACZ,SAAA,GAAY;AACd,CAAA,EAAyB;AACvB,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIN,eAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,CAAC,CAAA;AAC1C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,QAAA,GAAWe,aAAyB,IAAI,CAAA;AAE9C,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAAiB;AACvC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,EACpB,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAAiB;AACxC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAiB;AACnC,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,aAAA,CAAc,KAAK,CAAA;AAEnB,IAAA,MAAM,KAAA,GAAQ,EAAE,YAAA,CAAa,KAAA;AAC7B,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IACrB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAqC;AACzD,IAAA,MAAM,KAAA,GAAQ,EAAE,MAAA,CAAO,KAAA;AACvB,IAAA,IAAI,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC7B,MAAA,UAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IACrB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,OAAO,IAAA,KAAe;AACvC,IAAA,QAAA,CAAS,IAAI,CAAA;AAGb,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,IAAQ,IAAA,GAAO,IAAA,CAAA;AACnC,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,MAAM,MAAA,GAAS,+BAA+B,SAAS,CAAA,EAAA,CAAA;AACvD,MAAA,QAAA,CAAS,MAAM,CAAA;AACf,MAAA,OAAA,GAAU,MAAM,CAAA;AAChB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,GAAA,GAAM,KAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,IAAO,WAAA,EAAY;AACpD,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA,CAAE,MAAM,CAAA;AACzE,IAAA,IAAI,GAAA,IAAO,CAAC,YAAA,CAAa,QAAA,CAAS,GAAG,CAAA,EAAG;AACtC,MAAA,MAAM,MAAA,GAAS,gCAAgC,MAAM,CAAA,CAAA;AACrD,MAAA,QAAA,CAAS,MAAM,CAAA;AACf,MAAA,OAAA,GAAU,MAAM,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,WAAA,CAAY,CAAC,CAAA;AAGb,IAAA,MAAM,gBAAA,GAAmB,YAAY,MAAM;AACzC,MAAA,WAAA,CAAY,UAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,EAAA,EAAI,EAAE,CAAC,CAAA;AAAA,IAC7C,GAAG,GAAG,CAAA;AAEN,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,IAAI,CAAA;AACnC,MAAA,aAAA,CAAc,gBAAgB,CAAA;AAC9B,MAAA,WAAA,CAAY,GAAG,CAAA;AAEf,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,gBAAA,GAAmB,OAAO,CAAA;AAAA,MAC5B,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,MAAM,eAAe,CAAA;AAAA,MACjC;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,aAAA,CAAc,gBAAgB,CAAA;AAC9B,MAAA,MAAM,MAAA,GAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,eAAA;AACpD,MAAA,QAAA,CAAS,MAAM,CAAA;AACf,MAAA,OAAA,GAAU,MAAM,CAAA;AAAA,IAClB,CAAA,SAAE;AACA,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA,WAAA,CAAY,CAAC,CAAA;AACb,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,QAAA,CAAS,QAAQ,KAAA,GAAQ,EAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,uBACEa,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,mBAAA,EAAsB,SAAS,CAAA,CAAA,EAC7C,QAAA,EAAA;AAAA,oBAAAA,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,2BAA2B,UAAA,GAAa,UAAA,GAAa,EAAE,CAAA,CAAA,EAAI,WAAA,GAAc,cAAc,EAAE,CAAA,CAAA;AAAA,QACpG,UAAA,EAAY,cAAA;AAAA,QACZ,WAAA,EAAa,eAAA;AAAA,QACb,MAAA,EAAQ,UAAA;AAAA,QACR,OAAA,EAAS,MAAM,QAAA,CAAS,OAAA,EAAS,KAAA,EAAM;AAAA,QAEvC,QAAA,EAAA;AAAA,0BAAAtB,cAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,QAAA;AAAA,cACL,IAAA,EAAK,MAAA;AAAA,cACL,MAAA;AAAA,cACA,QAAA,EAAU,YAAA;AAAA,cACV,QAAA,EAAU,WAAA;AAAA,cACV,MAAA,EAAM;AAAA;AAAA,WACR;AAAA,UAEC,WAAA,mBACCsB,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6BAAA,EACb,QAAA,EAAA;AAAA,4BAAAtB,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,4BAC5CsB,gBAAC,GAAA,EAAA,EAAE,QAAA,EAAA;AAAA,cAAA,eAAA;AAAA,cAAc,QAAA;AAAA,cAAS;AAAA,aAAA,EAAC,CAAA;AAAA,4BAC3BtB,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BACb,QAAA,kBAAAA,cAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,yBAAA;AAAA,gBACV,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAA;AAAI;AAAA,aACjC,EACF;AAAA,WAAA,EACF,CAAA,mBAEAsB,eAAAA,CAAAC,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAvB,cAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,yBAAA;AAAA,gBACV,KAAA,EAAM,IAAA;AAAA,gBACN,MAAA,EAAO,IAAA;AAAA,gBACP,OAAA,EAAQ,WAAA;AAAA,gBACR,IAAA,EAAK,MAAA;AAAA,gBAEL,QAAA,kBAAAA,cAAAA;AAAA,kBAAC,MAAA;AAAA,kBAAA;AAAA,oBACC,CAAA,EAAE,uGAAA;AAAA,oBACF,MAAA,EAAO,cAAA;AAAA,oBACP,WAAA,EAAY,GAAA;AAAA,oBACZ,aAAA,EAAc,OAAA;AAAA,oBACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA,aACF;AAAA,4BACAsB,eAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yBAAA,EACX,QAAA,EAAA;AAAA,8BAAAtB,cAAAA,CAAC,YAAO,QAAA,EAAA,iBAAA,EAAe,CAAA;AAAA,cAAS;AAAA,aAAA,EAClC,CAAA;AAAA,4BACAsB,eAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA;AAAA,cAAA,oCAAA;AAAA,cACF,SAAA;AAAA,cAAU;AAAA,aAAA,EAC/C;AAAA,WAAA,EACF;AAAA;AAAA;AAAA,KAEJ;AAAA,IAEC,KAAA,oBACCtB,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0BAAA,EAA2B,IAAA,EAAK,SAC5C,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,oBAGFA,eAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,EAkFN;AAAA,GAAA,EACJ,CAAA;AAEJ;;;ACvRA,IAAM,mBAAA,GAAsB;AAAA,EAC1B,OAAA;AAAA,EAAS,WAAA;AAAA,EAAa,iBAAA;AAAA,EAAmB,cAAA;AAAA,EACzC,cAAA;AAAA,EAAgB,WAAA;AAAA,EAAa,OAAA;AAAA,EAAS,KAAA;AAAA,EAAO,UAAA;AAAA,EAC7C,SAAA;AAAA,EAAW,UAAA;AAAA,EAAY,QAAA;AAAA,EAAU,SAAA;AAAA,EAAW;AAC9C,CAAA;AAOO,SAAS,oBAAoB,IAAA,EAAsB;AACxD,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,IAAA,IAAQ,OAAO,IAAA;AAElC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA,EAAG,IAAA,EAAK,CAAE,WAAA,EAAY,IAAK,EAAA;AAGzE,EAAA,IAAI,CAAC,oBAAoB,IAAA,CAAK,CAAA,CAAA,KAAK,cAAc,UAAA,CAAW,CAAC,CAAC,CAAA,EAAG;AAC/D,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,GAAS,IAAA;AAGb,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,6BAAA,EAA+B,GAAG,CAAA;AAI1D,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,eAAA,EAAiB,CAAC,QAAQ,KAAA,KAAkB;AAClE,IAAA,MAAM,OAAA,GAAU,KAAA,CACb,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,0BAAA,EAA4B,KAAK,CAAA;AAC5C,IAAA,OAAO,IAAI,OAAO,CAAA,CAAA,CAAA;AAAA,EACpB,CAAC,CAAA;AAGD,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,cAAA,EAAgB,CAAC,QAAQ,KAAA,KAAkB;AACjE,IAAA,MAAM,OAAA,GAAU,KAAA,CACb,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAClB,OAAA,CAAQ,0BAAA,EAA4B,KAAK,CAAA;AAC5C,IAAA,OAAO,IAAI,OAAO,CAAA,CAAA,CAAA;AAAA,EACpB,CAAC,CAAA;AAGD,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA,CAAE,OAAA,CAAQ,WAAW,IAAI,CAAA;AAI9D,EAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,uBAAA,EAAyB,QAAQ,CAAA;AAEzD,EAAA,OAAO,MAAA;AACT;AAWA,IAAM,gBAAA,GAAmB,4BAAA;AAOlB,SAAS,qBAAqB,IAAA,EAAgC;AACnE,EAAA,IAAI,CAAC,IAAA,EAAM,OAAO,CAAC,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,IAAA,IAAQ,EAAA,EAAI,CAAA;AAExD,EAAA,MAAM,WAA6B,EAAC;AACpC,EAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,EAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,QAAA,CAAS,gBAAgB,CAAA,EAAG;AACnD,IAAA,MAAM,aAAa,KAAA,CAAM,KAAA;AAEzB,IAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,SAAA,EAAW,UAAU,CAAA;AAC/C,MAAA,IAAI,MAAA,CAAO,IAAA,EAAK,EAAG,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,CAAA;AAAA,IACpE;AAEA,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,MAAM,CAAC,CAAA,CAAE,IAAA,EAAK,EAAG,CAAA;AAC3D,IAAA,SAAA,GAAY,UAAA,GAAa,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA;AAAA,EACpC;AAGA,EAAA,IAAI,SAAA,GAAY,KAAK,MAAA,EAAQ;AAC3B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAClC,IAAA,IAAI,KAAA,CAAM,IAAA,EAAK,EAAG,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,EAClE;AAGA,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAA;AAAA,EACzC;AAEA,EAAA,OAAO,QAAA;AACT;AC3FA,IAAI,kBAAA,GAAqB,KAAA;AAElB,SAAS,cAAA,CAAe,EAAE,IAAA,EAAK,EAAwB;AAC5D,EAAA,MAAM,YAAA,GAAeS,aAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIf,eAAS,KAAK,CAAA;AACxC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,KAAK,CAAA;AAE9C,EAAAC,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,YAAA,CAAa,OAAA,IAAW,CAAC,IAAA,CAAK,MAAK,EAAG;AAE3C,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,eAAe,MAAA,GAAS;AACtB,MAAA,IAAI;AAQF,QAAA,MAAM,UAAA,GAAa,SAAA;AACnB,QAAA,MAAM,WAAW,MAAM;AAAA;AAAA,UAA0B;AAAA,SAAA,EAAa,OAAA;AAE9D,QAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,UAAA,OAAA,CAAQ,UAAA,CAAW;AAAA,YACjB,WAAA,EAAa,KAAA;AAAA,YACb,KAAA,EAAO,SAAA;AAAA,YACP,aAAA,EAAe,QAAA;AAAA,YACf,UAAA,EAAY;AAAA,WACb,CAAA;AACD,UAAA,kBAAA,GAAqB,IAAA;AAAA,QACvB;AAEA,QAAA,MAAM,SAAA,GAAY,mBAAA,CAAoB,IAAA,CAAK,IAAA,EAAM,CAAA;AACjD,QAAA,MAAM,EAAA,GAAK,CAAA,QAAA,EAAW,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACzD,QAAA,MAAM,EAAE,GAAA,EAAI,GAAI,MAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,SAAS,CAAA;AAElD,QAAA,IAAI,CAAC,SAAA,IAAa,YAAA,CAAa,OAAA,EAAS;AACtC,UAAA,YAAA,CAAa,QAAQ,SAAA,GAAY,GAAA;AACjC,UAAA,QAAA,CAAS,KAAK,CAAA;AAAA,QAChB;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,IAAI,CAAC,SAAA,EAAW,QAAA,CAAS,IAAI,CAAA;AAAA,MAC/B;AAAA,IACF;AAEA,IAAA,MAAA,EAAO;AACP,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAM,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,uBACE2B,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,KAAA,EAAM,4BAAA,EAChE,QAAA,EAAA;AAAA,0BAAAtB,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAM,CAAA;AAAA,0BACpEA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,QAAA,EAAS,QAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAM,aAAA,EAAc,OAAA,EAAQ,CAAA;AAAA,0BAC/EA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,IAAG,KAAA,EAAM,CAAA,EAAE,MAAA,EAAO,IAAA,EAAK,cAAA,EAAe;AAAA,SAAA,EACvD,CAAA;AAAA,wBACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,0BAAA,EAAwB;AAAA,OAAA,EAChC,CAAA;AAAA,sBACAA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,0BAAA;AAAA,UACV,OAAA,EAAS,MAAM,WAAA,CAAY,CAAC,QAAQ,CAAA;AAAA,UAEnC,qBAAW,WAAA,GAAc;AAAA;AAAA,OAC5B;AAAA,MACC,4BACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAA0B,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,sBAEhDA,eAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA,EAuCN;AAAA,KAAA,EACJ,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEsB,eAAAA,CAAAC,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAvB,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,YAAA;AAAA,QACL,SAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBACAA,eAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,EAYN;AAAA,GAAA,EACJ,CAAA;AAEJ;ACnHO,SAAS,WAAA,CAAY;AAAA,EAC1B,QAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,SAAA,GAAY,EAAA;AAAA,EACZ,aAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,EAAqB;AACnB,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAe;AACjC,IAAA,OAAO,IAAI,IAAA,CAAK,IAAI,CAAA,CAAE,kBAAA,CAAmB,EAAC,EAAG;AAAA,MAC3C,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,wBAAwB,CAAC,QAAA,qBAC7BsB,eAAAA,CAAC,KAAA,EAAA,EAAsB,WAAU,wBAAA,EAC/B,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,sBAAAtB,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAuB,mBAAS,IAAA,EAAK,CAAA;AAAA,sBACrDsB,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAW,CAAA,sBAAA,EAAyB,QAAA,CAAS,MAAM,CAAA,CAAA,EACtD,QAAA,EAAA;AAAA,QAAA,QAAA,CAAS,WAAW,SAAA,oBACnBtB,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wBAAA,EAAyB,CAAA;AAAA,QAE1C,QAAA,CAAS;AAAA,OAAA,EACZ;AAAA,KAAA,EACF,CAAA;AAAA,IACC,QAAA,CAAS,WAAW,MAAA,IAAa,QAAA,CAAS,WAAW,IAAA,oBACpDA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACZ,iBAAO,QAAA,CAAS,MAAA,KAAW,QAAA,GACxB,QAAA,CAAS,MAAA,GACT,IAAA,CAAK,UAAU,QAAA,CAAS,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAC7C;AAAA,GAAA,EAAA,EAfM,SAAS,EAiBnB,CAAA;AAGF,EAAA,MAAM,6BAA6B,CAAC,GAAA,qBAClCsB,eAAAA,CAAC,KAAA,EAAA,EAAmB,WAAU,uBAAA,EAC3B,QAAA,EAAA;AAAA,IAAA,GAAA,CAAI,QAAA,mBACHtB,cAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,GAAA,CAAI,QAAA,EAAU,GAAA,EAAK,GAAA,CAAI,IAAA,EAAM,CAAA,GACrC,GAAA,CAAI,8BACNA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAK,CAAA,WAAA,EAAc,GAAA,CAAI,UAAU,KAAK,CAAA,QAAA,EAAW,IAAI,WAAW,CAAA,CAAA;AAAA,QAChE,KAAK,GAAA,CAAI;AAAA;AAAA,KACX,GACE,IAAA;AAAA,oBACJA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAsB,cAAI,IAAA,EAAK;AAAA,GAAA,EAAA,EATvC,IAAI,IAUd,CAAA;AAGF,EAAA,MAAM,oBAAA,GAAuB,CAAC,OAAA,qBAC5BsB,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MAEC,SAAA,EAAW,qBAAqB,OAAA,CAAQ,IAAI,IAAI,OAAA,CAAQ,WAAA,GAAc,cAAc,EAAE,CAAA,CAAA;AAAA,MAEtF,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACb,QAAA,EAAA;AAAA,0BAAAtB,cAAAA,CAAC,UAAK,SAAA,EAAU,wBAAA,EACb,kBAAQ,IAAA,KAAS,MAAA,GAAS,QAAQ,WAAA,EACrC,CAAA;AAAA,0BACAA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BACb,QAAA,EAAA,UAAA,CAAW,OAAA,CAAQ,SAAS,CAAA,EAC/B;AAAA,SAAA,EACF,CAAA;AAAA,wBAEAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACZ,WAAC,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,WAAA,mBAC3BA,cAAAA,CAAC,UAAK,SAAA,EAAU,4BAAA,EAA6B,QAAA,EAAA,aAAA,EAAW,CAAA,GACtD,OAAA,CAAQ,WAAA,GACV,OAAA,CAAQ,OAAA,GAER,oBAAA,CAAqB,OAAA,CAAQ,OAAA,IAAW,EAAE,CAAA,CAAE,GAAA;AAAA,UAAI,CAAC,KAAK,CAAA,KACpD,GAAA,CAAI,SAAS,SAAA,mBACTA,cAAAA,CAAC,cAAA,EAAA,EAA8B,IAAA,EAAM,GAAA,CAAI,WAApB,CAAA,EAAA,EAAK,CAAC,CAAA,CAAuB,CAAA,mBAClDA,cAAAA,CAAC,UAAqB,QAAA,EAAA,GAAA,CAAI,OAAA,EAAA,EAAf,CAAA,EAAA,EAAK,CAAC,CAAA,CAAiB;AAAA,SACxC,EAEJ,CAAA;AAAA,QAEC,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,SAAA,CAAU,MAAA,GAAS,CAAA,oBAC/CA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA,OAAA,CAAQ,SAAA,CAAU,GAAA;AAAA,UAAI,QACrB,cAAA,GAAiB,cAAA,CAAe,EAAE,CAAA,GAAI,sBAAsB,EAAE;AAAA,SAChE,EACF,CAAA;AAAA,QAGD,OAAA,CAAQ,cAAA,IAAkB,OAAA,CAAQ,cAAA,CAAe,MAAA,GAAS,CAAA,oBACzDA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EACZ,QAAA,EAAA,OAAA,CAAQ,cAAA,CAAe,GAAA;AAAA,UAAI,SAC1B,mBAAA,GAAsB,mBAAA,CAAoB,GAAG,CAAA,GAAI,2BAA2B,GAAG;AAAA,SACjF,EACF;AAAA;AAAA,KAAA;AAAA,IAvCG,OAAA,CAAQ;AAAA,GAyCf;AAGF,EAAA,uBACEsB,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,uBAAA,EAA0B,SAAS,CAAA,CAAA,EAChD,QAAA,EAAA;AAAA,IAAA,QAAA,CAAS,MAAA,KAAW,CAAA,mBACnBtB,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,wCAAA,EAAsC,CAAA,EAC3C,IAEA,QAAA,CAAS,GAAA;AAAA,MAAI,aACX,aAAA,GAAgB,aAAA,CAAc,OAAO,CAAA,GAAI,qBAAqB,OAAO;AAAA,KACvE;AAAA,IAGD,WAAA,IAAe,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,EAAG,IAAA,KAAS,MAAA,oBACtDsB,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EACb,QAAA,EAAA;AAAA,sBAAAtB,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACb,QAAA,kBAAAA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAAyB,QAAA,EAAA,WAAA,EAAS,CAAA,EACpD,CAAA;AAAA,sBACAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BACb,QAAA,kBAAAsB,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EACd,QAAA,EAAA;AAAA,wBAAAtB,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAAyB,CAAA;AAAA,wBACzCA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAAyB,CAAA;AAAA,wBACzCA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAAyB;AAAA,OAAA,EAC3C,CAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAGFA,eAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,EA8IN;AAAA,GAAA,EACJ,CAAA;AAEJ;AC7PO,SAAS,aAAA,CAAc;AAAA,EAC5B,QAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,MAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA,GAAc,mBAAA;AAAA,EACd,SAAA,GAAY,EAAA;AAAA,EACZ,eAAA,GAAkB,IAAA;AAAA,EAClB,QAAA,GAAW;AACb,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIN,eAAS,EAAE,CAAA;AACrC,EAAA,MAAM,QAAA,GAAWe,aAA4B,IAAI,CAAA;AACjD,EAAA,MAAM,cAAA,GAAiBA,aAAuB,IAAI,CAAA;AAGlD,EAAAd,gBAAU,MAAM;AACd,IAAA,cAAA,CAAe,OAAA,EAAS,cAAA,CAAe,EAAE,QAAA,EAAU,UAAU,CAAA;AAAA,EAC/D,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,QAAA,CAAS,OAAA,CAAQ,MAAM,MAAA,GAAS,MAAA;AAChC,MAAA,QAAA,CAAS,OAAA,CAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,IAAI,QAAA,CAAS,OAAA,CAAQ,YAAA,EAAc,GAAG,CAAC,CAAA,EAAA,CAAA;AAAA,IACjF;AAAA,EACF,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAkB;AACtC,IAAA,CAAA,EAAG,cAAA,EAAe;AAElB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,IAAI,CAAC,OAAA,IAAW,WAAA,IAAe,QAAA,EAAU;AAEzC,IAAA,MAAA,CAAO,OAAO,CAAA;AACd,IAAA,QAAA,CAAS,EAAE,CAAA;AAAA,EACb,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAA0C;AAC/D,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,EAAE,QAAA,EAAU;AACpC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,YAAA,EAAa;AAAA,IACf;AAAA,EACF,CAAA;AAEA,EAAA,uBACE2B,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,eAAA,EAAkB,SAAS,CAAA,CAAA,EACzC,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,sBAAAtB,cAAAA,CAAC,WAAA,EAAA,EAAY,QAAA,EAAoB,WAAA,EAA0B,CAAA;AAAA,sBAC3DA,cAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,cAAA,EAAgB;AAAA,KAAA,EAC5B,CAAA;AAAA,IAEC,eAAe,WAAA,CAAY,MAAA,GAAS,CAAA,oBACnCA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACZ,QAAA,EAAA,WAAA,CAAY,IAAI,CAAC,EAAA,qBAChBsB,eAAAA,CAAC,MAAA,EAAA,EAAwB,WAAU,4BAAA,EACjC,QAAA,EAAA;AAAA,sBAAAtB,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAAA,EAA2B,CAAA;AAAA,MAC1C,EAAA,CAAG,IAAA;AAAA,sBACJA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA6B,aAAG,IAAA,EAAK;AAAA,KAAA,EAAA,EAH5C,EAAA,CAAG,SAId,CACD,CAAA,EACH,CAAA;AAAA,oBAGFsB,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACZ,QAAA,EAAA;AAAA,MAAA,eAAA,IAAmB,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,OAAA,oBACzCtB,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,OAAA;AAAA,UACT,SAAA,EAAU,sBAAA;AAAA,UACV,KAAA,EAAM,gBAAA;AAAA,UAEN,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EACnD,QAAA,kBAAAA,cAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,CAAA,EAAE,4IAAA;AAAA,cACF,MAAA,EAAO,cAAA;AAAA,cACP,WAAA,EAAY,KAAA;AAAA,cACZ,aAAA,EAAc,OAAA;AAAA,cACd,cAAA,EAAe;AAAA;AAAA,WACjB,EACF;AAAA;AAAA,OACF;AAAA,sBAGFsB,eAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAU,YAAA,EAAc,WAAU,qBAAA,EACtC,QAAA,EAAA;AAAA,wBAAAtB,cAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,QAAA;AAAA,YACL,KAAA,EAAO,KAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACxC,SAAA,EAAW,aAAA;AAAA,YACX,WAAA;AAAA,YACA,UAAU,WAAA,IAAe,QAAA;AAAA,YACzB,IAAA,EAAM,CAAA;AAAA,YACN,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,QAEC,8BACCA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,QAAA;AAAA,YACT,SAAA,EAAU,uBAAA;AAAA,YACV,KAAA,EAAM,QAAA;AAAA,YAEN,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EACnD,QAAA,kBAAAA,cAAAA,CAAC,UAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAA,EAAK,cAAA,EAAe,CAAA,EACtE;AAAA;AAAA,4BAGFA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,QAAA,EAAU,CAAC,KAAA,CAAM,IAAA,EAAK,IAAK,QAAA;AAAA,YAC3B,SAAA,EAAU,qBAAA;AAAA,YACV,KAAA,EAAM,MAAA;AAAA,YAEN,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EACnD,QAAA,kBAAAA,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,CAAA,EAAE,6BAAA;AAAA,gBACF,MAAA,EAAO,cAAA;AAAA,gBACP,WAAA,EAAY,KAAA;AAAA,gBACZ,aAAA,EAAc,OAAA;AAAA,gBACd,cAAA,EAAe;AAAA;AAAA,aACjB,EACF;AAAA;AAAA;AACF,OAAA,EAEJ;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAA,eAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,EA8GN;AAAA,GAAA,EACJ,CAAA;AAEJ;AC3RO,SAAS,gBAAA,CAAiB,EAAE,OAAA,EAAS,SAAA,EAAU,EAA0B;AAC9E,EAAA,MAAM,SAAA,GAAY,uBAAA,CAAwB,OAAA,IAAW,EAAE,CAAA;AAEvD,EAAA,uBACEA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAsB,OAAO,EAAE,UAAA,EAAY,GAAA,EAAI,EAClD,QAAA,kBAAAA,cAAAA;AAAA,IAACwB,8BAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAe,CAACC,0BAAS,CAAA;AAAA,MACzB,UAAA,EAAY;AAAA,QACV,KAAA,EAAO,CAAC,EAAE,QAAA,EAAS,qBACjBzB,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAA,EAAW,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAQ,EAC/C,QAAA,kBAAAA,cAAAA,CAAC,OAAA,EAAA,EAAM,KAAA,EAAO,EAAE,cAAA,EAAgB,UAAA,EAAY,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,UAAA,EAAW,EAC7E,QAAA,EACH,CAAA,EACF,CAAA;AAAA,QAEF,IAAI,CAAC,EAAE,UAAS,qBACdA,eAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,OAAA,EAAS,UAAA,EAAY,cAAc,wBAAA,EAA0B,SAAA,EAAW,QAAQ,OAAA,EAAS,GAAA,IACnG,QAAA,EACH,CAAA;AAAA,QAEF,IAAI,CAAC,EAAE,QAAA,EAAS,qBACdA,cAAAA,CAAC,IAAA,EAAA,EAAG,KAAA,EAAO,EAAE,SAAS,UAAA,EAAY,YAAA,EAAc,mCAAmC,aAAA,EAAe,KAAA,IAC/F,QAAA,EACH,CAAA;AAAA,QAEF,IAAA,EAAM,CAAC,EAAE,MAAA,EAAQ,QAAA,EAAU,GAAG,KAAA,EAAM,KAClC,MAAA,mBACEA,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,wBAAA,EAA0B,YAAA,EAAc,CAAA,EAAG,OAAA,EAAS,SAAA,EAAW,UAAA,EAAY,WAAA,EAAa,QAAA,EAAU,QAAA,EAAS,EAAI,GAAG,KAAA,EAC1I,QAAA,EACH,CAAA,mBAEAA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,UAAA,EAAY,kBAAA,EAAoB,YAAA,EAAc,CAAA,EAAG,OAAA,EAAS,EAAA,EAAI,SAAA,EAAW,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAQ,EAC7G,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,WAAA,EAAa,QAAA,EAAU,QAAA,EAAS,EAAI,GAAG,KAAA,EAAQ,QAAA,EAAS,CAAA,EACrF;AAAA,OAEN;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;ACSO,SAAS,QAAA,CAAS;AAAA,EACvB,UAAA,GAAa,OAAA;AAAA,EACb,SAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,mBAAA,GAAsB,IAAA;AAAA,EACtB,SAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,kBAAA,GAAqB,EAAA;AAAA,EACrB,aAAA,GAAgB;AAClB,CAAA,EAAkB;AAChB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIN,eAA+B,UAAU,CAAA;AAC3E,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,YAAA,EAAa;AAEhC,EAAA,MAAM,YAAY,UAAA,IAAc,MAAA,CAAO,IAAA,EAAM,SAAA,EAAW,SAAS,QAAQ,CAAA;AAEzE,EAAA,uBACE4B,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,oBAAA,EAAuB,SAAS,CAAA,CAAA,EAC9C,QAAA,EAAA;AAAA,oBAAAtB,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,yBAAA,EAA4B,kBAAkB,CAAA,CAAA,EAC5D,QAAA,kBAAAsB,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,oBAAA,EAAuB,aAAa,CAAA,CAAA,EAEjD,QAAA,EAAA;AAAA,MAAA,IAAA,oBAAQtB,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAuB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,sBAGpDA,eAAC,IAAA,EAAA,EAAG,SAAA,EAAU,wBACX,QAAA,EAAA,KAAA,KAAU,SAAA,KAAc,OAAA,GAAU,cAAA,GAAiB,gBAAA,CAAA,EACtD,CAAA;AAAA,MAIC,mBAAA,oBACCsB,eAAAA,CAAAC,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAvB,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,kBAAAA,cAAAA;AAAA,UAAC,mBAAA;AAAA,UAAA;AAAA,YACC,SAAA;AAAA,YACA,SAAA,EAAW,MAAM,SAAA;AAAY;AAAA,SAC/B,EACF,CAAA;AAAA,wBACAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BACb,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,uBAAA,EAAqB,CAAA,EAC7B;AAAA,OAAA,EACF,CAAA;AAAA,sBAIFsB,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,wBAAAtB,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAW,CAAA,mBAAA,EAAsB,SAAA,KAAc,OAAA,GAAU,WAAW,EAAE,CAAA,CAAA;AAAA,YACtE,OAAA,EAAS,MAAM,YAAA,CAAa,OAAO,CAAA;AAAA,YACpC,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,wBACAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAW,CAAA,mBAAA,EAAsB,SAAA,KAAc,UAAA,GAAa,WAAW,EAAE,CAAA,CAAA;AAAA,YACzE,OAAA,EAAS,MAAM,YAAA,CAAa,UAAU,CAAA;AAAA,YACvC,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF,CAAA;AAAA,sBAGAA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+BAAA,EACZ,QAAA,EAAA,SAAA,KAAc,0BACbA,cAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,SAAA;AAAA,UACA,OAAA;AAAA,UACA,gBAAA,EAAkB;AAAA;AAAA,0BAGpBA,cAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,SAAA;AAAA,UACA,OAAA;AAAA,UACA,aAAA,EAAe;AAAA;AAAA,OACjB,EAEJ,CAAA;AAAA,MAGC,SAAA,oBACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BACb,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,IAAA,EAAE,CAAA,EACV,CAAA;AAAA,MAID,SAAA,oBACCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAsB,OAAA,EAAkB,CAAA,EACxD,CAAA;AAAA,MAID,0BAAUA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAyB,QAAA,EAAA,MAAA,EAAO;AAAA,KAAA,EAC5D,CAAA,EACF,CAAA;AAAA,oBAEAA,eAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,EAiHN;AAAA,GAAA,EACJ,CAAA;AAEJ;ACrOO,SAAS,eAAA,CAAgB;AAAA,EAC9B,QAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,qBAAA,GAAwB,IAAA;AAAA,EACxB,YAAA,GAAe,IAAA;AAAA,EACf,gBAAA,GAAmB,KAAA;AAAA,EACnB,YAAA,GAAe,GAAA;AAAA,EACf,YAAA,GAAe,EAAA;AAAA,EACf,SAAA,GAAY;AACd,CAAA,EAAyB;AACvB,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIN,eAAS,gBAAgB,CAAA;AAC/D,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAE9D,EAAA,MAAM,EAAE,WAAA,EAAa,iBAAA,EAAmB,UAAA,EAAY,MAAA,KAAW,YAAA,EAAa;AAE5E,EAAA,MAAM,aAAA,GAAgB,MAAM,cAAA,CAAe,CAAC,WAAW,CAAA;AACvD,EAAA,MAAM,gBAAA,GAAmB,MAAM,mBAAA,CAAoB,CAAC,gBAAgB,CAAA;AAEpE,EAAA,uBACE4B,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,oBAAA,EAAuB,SAAS,CAAA,CAAA,EAE7C,QAAA,EAAA;AAAA,IAAA,OAAA,oBACCA,eAAAA,CAAAC,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAD,eAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,qBAAqB,WAAA,GAAc,WAAA,GAAc,EAAE,CAAA,CAAA,EAAI,gBAAA,GAAmB,gBAAgB,EAAE,CAAA,CAAA;AAAA,UACvG,KAAA,EAAO,EAAE,KAAA,EAAO,WAAA,GAAc,KAAK,YAAA,EAAa;AAAA,UAEhD,QAAA,EAAA;AAAA,4BAAAtB,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAA6B,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,4BACpDA,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,0BAAA;AAAA,gBACV,OAAA,EAAS,aAAA;AAAA,gBACT,YAAA,EAAY,cAAc,gBAAA,GAAmB,kBAAA;AAAA,gBAE5C,wBAAc,GAAA,GAAM;AAAA;AAAA;AACvB;AAAA;AAAA,OACF;AAAA,MACC,oCACCA,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,2BAAA;AAAA,UACV,OAAA,EAAS;AAAA;AAAA;AACX,KAAA,EAEJ,CAAA;AAAA,oBAIFsB,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,wBAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,UAAA,EAAY,OAAA,GAAW,WAAA,GAAc,EAAA,GAAK,YAAA,GAAgB;AAAA,SAC5D;AAAA,QAGA,QAAA,EAAA;AAAA,0BAAAA,eAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,kBAAA;AAAA,cACV,KAAA,EAAO,EAAE,MAAA,EAAQ,YAAA,EAAa;AAAA,cAE7B,QAAA,EAAA;AAAA,gBAAA,OAAA,oBACCA,eAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAU,8BAAA;AAAA,oBACV,OAAA,EAAS,gBAAA;AAAA,oBACT,YAAA,EAAW,aAAA;AAAA,oBAEX,QAAA,EAAA;AAAA,sCAAAtB,eAAC,MAAA,EAAA,EAAK,CAAA;AAAA,sCACNA,eAAC,MAAA,EAAA,EAAK,CAAA;AAAA,sCACNA,eAAC,MAAA,EAAA,EAAK;AAAA;AAAA;AAAA,iBACR;AAAA,gBAGD,MAAA,oBACCsB,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0BAAA,EACZ,QAAA,EAAA;AAAA,kBAAA,qBAAA,IAAyB,iBAAA,oBACxBA,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2BAAA,EACb,QAAA,EAAA;AAAA,oCAAAtB,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA4B,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,oCACtDA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAAA,EACb,4BAAkB,IAAA,EACrB;AAAA,mBAAA,EACF,CAAA;AAAA,kCAGFA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAA0B,CAAA;AAAA,kBAExC,gBAAgB,WAAA,oBACfsB,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EACb,QAAA,EAAA;AAAA,oCAAAtB,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAA,EACb,sBAAY,KAAA,EACf,CAAA;AAAA,oCACAA,cAAAA;AAAA,sBAAC,QAAA;AAAA,sBAAA;AAAA,wBACC,SAAA,EAAU,sBAAA;AAAA,wBACV,OAAA,EAAS,MAAM,MAAA,EAAO;AAAA,wBACvB,QAAA,EAAA;AAAA;AAAA;AAED,mBAAA,EACF;AAAA,iBAAA,EAEJ;AAAA;AAAA;AAAA,WAEJ;AAAA,0BAGAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BACb,QAAA,EACH,CAAA;AAAA,UAGC,0BAAUA,cAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,oBAAoB,QAAA,EAAA,MAAA,EAAO;AAAA;AAAA;AAAA,KAC1D;AAAA,oBAEAA,eAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,EA2LN;AAAA,GAAA,EACJ,CAAA;AAEJ;AC7SO,SAAS,QAAA,CAAS;AAAA,EACvB,KAAA,GAAQ,SAAA;AAAA,EACR,WAAA,GAAc,sBAAA;AAAA,EACd,cAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA,GAAkB,IAAA;AAAA,EAClB,gBAAA,GAAmB,IAAA;AAAA,EACnB,SAAA,GAAY,EAAA;AAAA,EACZ,aAAA;AAAA,EACA;AACF,CAAA,EAAkB;AAChB,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,aAAA,EAAAF,cAAAA;AAAA,IACA;AAAA,GACF,GAAI,QAAA,CAAS,cAAA,EAAgB,EAAE,KAAA,EAAO,CAAC,kBAAA,EAAoB,eAAA,EAAiB,eAAe,CAAA,EAAG,CAAA;AAE9F,EAAA,MAAM,cAAA,GAAiBW,aAAuB,IAAI,CAAA;AAGlD,EAAAd,gBAAU,MAAM;AACd,IAAA,cAAA,CAAe,OAAA,EAAS,cAAA,CAAe,EAAE,QAAA,EAAU,UAAU,CAAA;AAAA,EAC/D,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAAA,gBAAU,MAAM;AACd,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,OAAO,CAAC,CAAA;AAEnB,EAAA,MAAM,UAAA,GAAa,OAAO,OAAA,KAAoB;AAC5C,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,aAAA,CAAc,OAAO,CAAA;AAAA,IACvB;AACA,IAAA,MAAM,MAAM,OAAO,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,MAAA,KAAW,CAAA,IAAK,CAAC,SAAA;AAE9C,EAAA,uBACE2B,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,oBAAA,EAAuB,SAAS,CAAA,CAAA,EAE7C,QAAA,EAAA;AAAA,IAAA,OAAA,oBAAWtB,cAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,0BAA0B,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,oBAG/DsB,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAEb,QAAA,EAAA;AAAA,sBAAAtB,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACZ,QAAA,EAAA,MAAA,oBAAUA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,sBAAA,EAAwB,QAAA,EAAA,KAAA,EAAM,CAAA,EACzD,CAAA;AAAA,sBAGAsB,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACZ,QAAA,EAAA;AAAA,QAAA,WAAA,IAAe,kCACdtB,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAA0B,QAAA,EAAA,cAAA,EAAe,CAAA;AAAA,QAGzD,eAAe,CAAC,cAAA,oBACfsB,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wBAAA,EACb,QAAA,EAAA;AAAA,0BAAAtB,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EAA8B,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,0BAC/CA,cAAAA,CAAC,IAAA,EAAA,EAAG,QAAA,EAAA,2BAAA,EAAyB,CAAA;AAAA,0BAC7BA,cAAAA,CAAC,GAAA,EAAA,EAAE,QAAA,EAAA,sDAAA,EAAoD;AAAA,SAAA,EACzD,CAAA;AAAA,wBAGFA,cAAAA,CAAC,WAAA,EAAA,EAAY,QAAA,EAAoB,CAAA;AAAA,wBACjCA,cAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,cAAA,EAAgB;AAAA,OAAA,EAC5B,CAAA;AAAA,MAGC,KAAA,oBACCsB,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sBAAA,EACb,QAAA,EAAA;AAAA,wBAAAtB,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAAA,EAA4B,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,QAC5C;AAAA,OAAA,EACH,CAAA;AAAA,sBAIFA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BACb,QAAA,kBAAAA,cAAAA;AAAA,QAAC,aAAA;AAAA,QAAA;AAAA,UACC,QAAA;AAAA,UACA,WAAA;AAAA,UACA,MAAA,EAAQ,UAAA;AAAA,UACR,OAAA,EAAS,kBAAkBF,cAAAA,GAAgB,MAAA;AAAA,UAC3C,QAAA,EAAU,mBAAmB,WAAA,GAAc,MAAA;AAAA,UAC3C,WAAA;AAAA,UACA,QAAA,EAAU,SAAA;AAAA,UACV,eAAA,EAAiB,eAAA,IAAmB,QAAA,CAAS,MAAA,GAAS;AAAA;AAAA,OACxD,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAE,eAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,EA0HN;AAAA,GAAA,EACJ,CAAA;AAEJ;;;ACuoBO,IAAM,gBAAgB,CAAC,WAAA,EAAa,UAAU,QAAA,EAAU,UAAA,EAAY,OAAO,QAAQ;AAwEnF,IAAM,mBAAA,GAAsB;AAAA,EACjC,SAAA;AAAA,EACA,cAAA;AAAA;AAAA,EAEA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,sBAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF;AAuBO,IAAM,+BAAA,GAAyD;AAAA,EACpE,WAAA,EAAa,GAAA;AAAA,EACb,UAAA,EAAY,IAAA;AAAA,EACZ,KAAA,EAAO;AACT;AAGO,SAAS,qBAAqB,KAAA,EAA6C;AAChF,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,MAAM,OAAO,KAAA;AACxD,EAAA,MAAM,GAAA,GAAM,KAAA;AACZ,EAAA,OACE,OAAO,GAAA,CAAI,aAAA,KAAkB,YAC7B,OAAO,GAAA,CAAI,aAAa,QAAA,IACxB,OAAO,GAAA,CAAI,QAAA,KAAa,YACxB,OAAO,GAAA,CAAI,YAAY,QAAA,IACvB,OAAO,IAAI,UAAA,KAAe,SAAA;AAE9B;AAMO,IAAM,iBAAA,GAAoB,CAAC,QAAA,EAAU,MAAA,EAAQ,MAAM;;;ACxhCnD,IAAM,SAAA,GAAY;AAAA,EACvB,UAAA,EAAY,GAAA;AAAA;AAAA,EACZ,QAAA,EAAU,EAAA;AAAA;AAAA,EACV,cAAA,EAAgB,EAAA;AAAA;AAAA,EAChB,OAAA,EAAS,EAAA;AAAA;AAAA,EACT,KAAA,EAAO,GAAA;AAAA;AAAA,EACP,QAAA,EAAU,CAAA;AAAA;AAAA,EACV,OAAA,EAAS;AAAA;AACX;AAGA,IAAM,SAAA,GAAY,WAAA;AAalB,SAAS,kBAAkB,MAAA,EAAqB;AAC9C,EAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAM,GAAI,MAAA;AAEvB,EAAA,OAAO;AAAA,IACL,MAAM,IAAO,GAAA,EAAgC;AAC3C,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,GAAG,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA,EAAI;AAAA,UAChD,OAAA,EAAS,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAAG,SAC7C,CAAA;AACD,QAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,IAAA;AACzB,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,QAAA,OAAO,KAAK,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,GAAI,IAAA;AAAA,MACjD,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,GAAA,CAAI,GAAA,EAAa,KAAA,EAAgB,GAAA,EAAgC;AACrE,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MACT,CAAC,KAAA,EAAO,KAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,EAAG,IAAA,EAAM,IAAI,QAAA,EAAU,IACxD,CAAC,KAAA,EAAO,KAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAEtC,QAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,UAChC,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,aAAA,EAAe,UAAU,KAAK,CAAA,CAAA;AAAA,YAC9B,cAAA,EAAgB;AAAA,WAClB;AAAA,UACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,SAC1B,CAAA;AACD,QAAA,OAAO,QAAA,CAAS,EAAA;AAAA,MAClB,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,IAAI,GAAA,EAA+B;AACvC,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,GAAG,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA,EAAI;AAAA,UAChD,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAAG,SAC7C,CAAA;AACD,QAAA,OAAO,QAAA,CAAS,EAAA;AAAA,MAClB,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,KAAK,OAAA,EAAoC;AAC7C,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,GAAG,CAAA,MAAA,EAAS,OAAO,CAAA,CAAA,EAAI;AAAA,UACrD,OAAA,EAAS,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAAG,SAC7C,CAAA;AACD,QAAA,IAAI,CAAC,QAAA,CAAS,EAAA,EAAI,OAAO,EAAC;AAC1B,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,QAAA,OAAO,IAAA,CAAK,UAAU,EAAC;AAAA,MACzB,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,EAAC;AAAA,MACV;AAAA,IACF;AAAA,GACF;AACF;AAKA,SAAS,WAAA,CACP,IAAA,EACA,WAAA,EAAA,GACG,KAAA,EACK;AACR,EAAA,MAAM,MAAA,GAAS,YAAY,MAAA,IAAU,WAAA;AACrC,EAAA,MAAM,WAAW,WAAA,CAAY,QAAA;AAC7B,EAAA,MAAM,GAAA,GAAM,CAAC,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,GAAG,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAClF,EAAA,OAAO,GAAA;AACT;AAMA,eAAsB,mBAAA,CACpB,aACA,MAAA,EACiC;AACjC,EAAA,MAAM,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,YAAA,EAAc,WAAW,CAAA;AACjD,EAAA,OAAO,MAAA,CAAO,IAAqB,GAAG,CAAA;AACxC;AAEA,eAAsB,mBAAA,CACpB,WAAA,EACA,UAAA,EACA,MAAA,EACkB;AAClB,EAAA,MAAM,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,YAAA,EAAc,WAAW,CAAA;AACjD,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,UAAA,EAAY,UAAU,UAAU,CAAA;AACzD;AAEA,eAAsB,yBAAA,CACpB,aACA,MAAA,EACkB;AAClB,EAAA,MAAM,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,YAAA,EAAc,WAAW,CAAA;AACjD,EAAA,OAAO,MAAA,CAAO,IAAI,GAAG,CAAA;AACvB;AAMA,eAAsB,iBAAA,CACpB,WAAA,EACA,WAAA,EACA,MAAA,EAC+B;AAC/B,EAAA,MAAM,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,UAAA,EAAY,WAAA,EAAa,WAAW,CAAA;AAC5D,EAAA,OAAO,MAAA,CAAO,IAAmB,GAAG,CAAA;AACtC;AAEA,eAAsB,iBAAA,CACpB,WAAA,EACA,WAAA,EACA,QAAA,EACA,MAAA,EACkB;AAClB,EAAA,MAAM,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,UAAA,EAAY,WAAA,EAAa,WAAW,CAAA;AAC5D,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,QAAA,EAAU,UAAU,QAAQ,CAAA;AACrD;AAEA,eAAsB,uBAAA,CACpB,WAAA,EACA,WAAA,EACA,MAAA,EACkB;AAClB,EAAA,MAAM,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,UAAA,EAAY,WAAA,EAAa,WAAW,CAAA;AAC5D,EAAA,OAAO,MAAA,CAAO,IAAI,GAAG,CAAA;AACvB;AAMA,eAAsB,uBAAA,CACpB,WAAA,EACA,WAAA,EACA,MAAA,EACqC;AACrC,EAAA,MAAM,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,gBAAA,EAAkB,WAAA,EAAa,WAAW,CAAA;AAClE,EAAA,OAAO,MAAA,CAAO,IAAyB,GAAG,CAAA;AAC5C;AAEA,eAAsB,uBAAA,CACpB,WAAA,EACA,WAAA,EACA,cAAA,EACA,MAAA,EACkB;AAClB,EAAA,MAAM,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,gBAAA,EAAkB,WAAA,EAAa,WAAW,CAAA;AAClE,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,cAAA,EAAgB,UAAU,cAAc,CAAA;AACjE;AAEA,eAAsB,6BAAA,CACpB,WAAA,EACA,WAAA,EACA,MAAA,EACkB;AAClB,EAAA,MAAM,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,gBAAA,EAAkB,WAAA,EAAa,WAAW,CAAA;AAClE,EAAA,OAAO,MAAA,CAAO,IAAI,GAAG,CAAA;AACvB;AAMA,eAAsB,gBAAA,CACpB,WAAA,EACA,WAAA,EACA,MAAA,EAC8B;AAC9B,EAAA,MAAM,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AAC3D,EAAA,OAAO,MAAA,CAAO,IAAkB,GAAG,CAAA;AACrC;AAEA,eAAsB,gBAAA,CACpB,WAAA,EACA,WAAA,EACA,OAAA,EACA,MAAA,EACkB;AAClB,EAAA,MAAM,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AAC3D,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,OAAA,EAAS,UAAU,OAAO,CAAA;AACnD;AAEA,eAAsB,sBAAA,CACpB,WAAA,EACA,WAAA,EACA,MAAA,EACkB;AAClB,EAAA,MAAM,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AAC3D,EAAA,OAAO,MAAA,CAAO,IAAI,GAAG,CAAA;AACvB;AASA,eAAsB,4BAAA,CACpB,WAAA,EACA,WAAA,EACA,MAAA,EACe;AACf,EAAA,MAAM,QAAQ,GAAA,CAAI;AAAA,IAChB,uBAAA,CAAwB,WAAA,EAAa,WAAA,EAAa,MAAM,CAAA;AAAA,IACxD,6BAAA,CAA8B,WAAA,EAAa,WAAA,EAAa,MAAM,CAAA;AAAA,IAC9D,sBAAA,CAAuB,WAAA,EAAa,WAAA,EAAa,MAAM;AAAA,GACxD,CAAA;AACH;AAKA,eAAsB,sBAAA,CACpB,aACA,MAAA,EACe;AACf,EAAA,MAAM,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACvC,EAAA,MAAM,MAAA,GAAS,YAAY,MAAA,IAAU,WAAA;AACrC,EAAA,MAAM,WAAW,WAAA,CAAY,QAAA;AAC7B,EAAA,MAAM,UAAU,CAAA,EAAG,SAAS,CAAA,GAAA,EAAM,QAAQ,IAAI,MAAM,CAAA,EAAA,CAAA;AAEpD,EAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AACtC,EAAA,MAAM,OAAA,CAAQ,IAAI,IAAA,CAAK,GAAA,CAAI,SAAO,MAAA,CAAO,GAAA,CAAI,GAAG,CAAC,CAAC,CAAA;AACpD;AASA,eAAsB,SAAA,CACpB,KACA,MAAA,EACmB;AACnB,EAAA,MAAM,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACvC,EAAA,OAAO,OAAO,GAAA,CAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA;AAC5C;AAKA,eAAsB,SAAA,CACpB,GAAA,EACA,KAAA,EACA,GAAA,EACA,MAAA,EACkB;AAClB,EAAA,MAAM,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACvC,EAAA,OAAO,MAAA,CAAO,IAAI,CAAA,EAAG,SAAS,IAAI,GAAG,CAAA,CAAA,EAAI,OAAO,GAAG,CAAA;AACrD;AAKA,eAAsB,YAAA,CACpB,KACA,MAAA,EACkB;AAClB,EAAA,MAAM,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACvC,EAAA,OAAO,OAAO,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA;AACzC;AAMA,eAAsB,cAAA,CACpB,aACA,MAAA,EACqC;AACrC,EAAA,MAAM,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,OAAA,EAAS,WAAW,CAAA;AAC5C,EAAA,OAAO,MAAA,CAAO,IAAyB,GAAG,CAAA;AAC5C;AAEA,eAAsB,cAAA,CACpB,WAAA,EACA,KAAA,EACA,MAAA,EACkB;AAClB,EAAA,MAAM,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,OAAA,EAAS,WAAW,CAAA;AAC5C,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,KAAA,EAAO,UAAU,KAAK,CAAA;AAC/C;AAEA,eAAsB,oBAAA,CACpB,aACA,MAAA,EACkB;AAClB,EAAA,MAAM,MAAA,GAAS,kBAAkB,MAAM,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,OAAA,EAAS,WAAW,CAAA;AAC5C,EAAA,OAAO,MAAA,CAAO,IAAI,GAAG,CAAA;AACvB;;;ACnVO,IAAM,mBAAA,GAAmC;AAAA,EAC9C,QAAA,EAAU,cAAA;AAAA,EACV,SAAA,EAAW,IAAA;AAAA,EACX,WAAA,EAAa;AACf;AAMO,IAAM,iBAAA,GAAiC;AAAA,EAC5C,QAAA,EAAU,WAAA;AAAA,EACV,SAAA,EAAW,IAAA;AAAA,EACX,WAAA,EAAa;AACf;AAMO,IAAM,eAAA,GAA+B;AAAA,EAC1C,QAAA,EAAU,SAAA;AAAA,EACV,SAAA,EAAW,IAAA;AAAA,EACX,WAAA,EAAa;AACf;AAKO,SAAS,qBAAqB,MAAA,EAA2C;AAC9E,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,QAAA;AAAA,IACV,SAAA,EAAW,IAAA;AAAA,IACX,WAAA,EAAa,SAAA;AAAA,IACb,GAAG;AAAA,GACL;AACF;AAKO,SAAS,iBAAiB,IAAA,EAAkC;AACjE,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,cAAA;AACH,MAAA,OAAO,mBAAA;AAAA,IACT,KAAK,WAAA;AACH,MAAA,OAAO,iBAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,eAAA;AAAA,IACT,KAAK,QAAA;AAAA,IACL;AACE,MAAA,OAAO,oBAAA,CAAqB,EAAE,CAAA;AAAA;AAEpC;ACtCA,IAAM,SAAA,GAAY,wBAAA;AAEX,SAAS,kBAAA,GAA+C;AAC7D,EAAA,MAAM,EAAE,WAAA,EAAa,eAAA,EAAiB,MAAA,KAAW,YAAA,EAAa;AAC9D,EAAA,MAAM,CAAC,UAAA,EAAY,OAAO,CAAA,GAAIN,eAAsC,IAAI,CAAA;AACxE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,cAAAA,CAAwB,EAAE,CAAA;AACxD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,eAAe,EAAE,OAAA,EAAS,OAAO,OAAA,EAAS,QAAA,EAAU,OAAO,QAAA,EAAS;AAE1E,EAAA,MAAM,QAAA,GAAWE,kBAAY,YAAY;AACvC,IAAA,IAAI,CAAC,eAAA,EAAiB;AACtB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,CAAC,OAAA,EAAS,OAAO,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,QAC3C,cAAA;AAAA,UACE,SAAA;AAAA,UACA,EAAE,aAAa,eAAA,EAAgB;AAAA,UAC/B;AAAA,SACF;AAAA,QACA,cAAA;AAAA,UACE,GAAG,SAAS,CAAA,QAAA,CAAA;AAAA,UACZ,EAAE,aAAa,eAAA,EAAgB;AAAA,UAC/B;AAAA;AACF,OACD,CAAA;AACD,MAAA,IAAI,QAAQ,EAAA,IAAM,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,QAAQ,IAAI,CAAA;AACpD,MAAA,IAAI,OAAA,CAAQ,EAAA,IAAM,OAAA,CAAQ,IAAA,EAAM,UAAA,CAAW,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA,GAAI,OAAA,CAAQ,IAAA,GAAO,EAAE,CAAA;AAC1F,MAAA,IAAI,CAAC,OAAA,CAAQ,EAAA,IAAM,CAAC,QAAQ,EAAA,EAAI;AAC9B,QAAA,QAAA,CAAS,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,KAAA,IAAS,iCAAiC,CAAA;AAAA,MAC9E;AAAA,IACF,SAAS,GAAA,EAAU;AACjB,MAAA,QAAA,CAAS,GAAA,EAAK,WAAW,iCAAiC,CAAA;AAAA,IAC5D;AAAA,EAIF,GAAG,CAAC,eAAA,EAAiB,aAAa,OAAA,EAAS,YAAA,CAAa,QAAQ,CAAC,CAAA;AAEjE,EAAA,MAAM,OAAA,GAAUA,kBAAY,YAAY;AACtC,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,MAAM,QAAA,EAAS;AACf,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAAD,gBAAU,MAAM;AACd,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,aAAA,GAAgBC,iBAAAA;AAAA,IACpB,OAAO,YAAA,KAAkD;AACvD,MAAA,IAAI,CAAC,iBAAiB,OAAO,KAAA;AAC7B,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI;AACF,QAAA,MAAM,MAAM,MAAM,cAAA;AAAA,UAChB,SAAA;AAAA,UACA;AAAA,YACE,MAAA,EAAQ,KAAA;AAAA,YACR,WAAA,EAAa,eAAA;AAAA,YACb,IAAA,EAAM,EAAE,aAAA,EAAe,YAAA;AAAa,WACtC;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,UAAA,QAAA,CAAS,GAAA,CAAI,KAAA,IAAS,CAAA,0BAAA,EAA6B,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAC/D,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,IAAI,GAAA,CAAI,IAAA,EAAM,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAC9B,QAAA,OAAO,IAAA;AAAA,MACT,SAAS,GAAA,EAAU;AACjB,QAAA,QAAA,CAAS,GAAA,EAAK,WAAW,0BAA0B,CAAA;AACnD,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IAEF,CAAA;AAAA,IACA,CAAC,eAAA,EAAiB,YAAA,CAAa,OAAA,EAAS,aAAa,QAAQ;AAAA,GAC/D;AAEA,EAAA,OAAO,EAAE,UAAA,EAAY,OAAA,EAAS,SAAA,EAAW,KAAA,EAAO,eAAe,OAAA,EAAQ;AACzE;ACpEA,IAAM,UAAA,GAAa,6BAAA;AAQZ,SAAS,2BAAA,GAAiE;AAC/E,EAAA,MAAM,EAAE,WAAA,EAAa,eAAA,EAAiB,MAAA,KAAW,YAAA,EAAa;AAC9D,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIF,eAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,cAAAA,CAAoC,EAAE,CAAA;AAC5E,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,cAAAA,CAAuC,EAAE,CAAA;AACzE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,eAAe,EAAE,OAAA,EAAS,OAAO,OAAA,EAAS,QAAA,EAAU,OAAO,QAAA,EAAS;AAE1E,EAAA,MAAM,QAAA,GAAWE,kBAAY,YAAY;AACvC,IAAA,IAAI,CAAC,eAAA,EAAiB;AACtB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AAGF,MAAA,MAAM,WAAW,MAAM,cAAA;AAAA,QACrB,GAAG,UAAU,CAAA,WAAA,CAAA;AAAA,QACb,EAAE,aAAa,eAAA,EAAgB;AAAA,QAC/B;AAAA,OACF;AACA,MAAA,MAAM,QAAQ,CAAC,EAAE,QAAA,CAAS,EAAA,IAAM,SAAS,IAAA,EAAM,QAAA,CAAA;AAC/C,MAAA,UAAA,CAAW,KAAK,CAAA;AAEhB,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,cAAA,CAAe,EAAE,CAAA;AACjB,QAAA,WAAA,CAAY,EAAE,CAAA;AACd,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,CAAC,OAAA,EAAS,QAAQ,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,QAC5C,cAAA;AAAA,UACE,UAAA;AAAA,UACA,EAAE,aAAa,eAAA,EAAgB;AAAA,UAC/B;AAAA,SACF;AAAA,QACA,cAAA;AAAA,UACE,GAAG,UAAU,CAAA,SAAA,CAAA;AAAA,UACb,EAAE,aAAa,eAAA,EAAgB;AAAA,UAC/B;AAAA;AACF,OACD,CAAA;AACD,MAAA,IAAI,OAAA,CAAQ,EAAA,IAAM,OAAA,CAAQ,IAAA,EAAM;AAC9B,QAAA,cAAA,CAAe,KAAA,CAAM,QAAQ,OAAA,CAAQ,IAAI,IAAI,OAAA,CAAQ,IAAA,GAAO,EAAE,CAAA;AAAA,MAChE;AACA,MAAA,IAAI,QAAA,CAAS,EAAA,IAAM,QAAA,CAAS,IAAA,EAAM;AAChC,QAAA,WAAA,CAAY,KAAA,CAAM,QAAQ,QAAA,CAAS,IAAI,IAAI,QAAA,CAAS,IAAA,GAAO,EAAE,CAAA;AAAA,MAC/D;AAAA,IAEF,SAAS,GAAA,EAAU;AACjB,MAAA,QAAA,CAAS,GAAA,EAAK,WAAW,kCAAkC,CAAA;AAAA,IAC7D;AAAA,EAEF,GAAG,CAAC,eAAA,EAAiB,aAAa,OAAA,EAAS,YAAA,CAAa,QAAQ,CAAC,CAAA;AAEjE,EAAA,MAAM,OAAA,GAAUA,kBAAY,YAAY;AACtC,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,MAAM,QAAA,EAAS;AACf,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAAD,gBAAU,MAAM;AACd,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,MAAA,GAASC,iBAAAA;AAAA,IACb,OAAO,KAAA,KAAgE;AACrE,MAAA,IAAI,CAAC,iBAAiB,OAAO,KAAA;AAC7B,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI;AACF,QAAA,MAAM,MAAM,MAAM,cAAA;AAAA,UAChB,UAAA;AAAA,UACA;AAAA,YACE,MAAA,EAAQ,MAAA;AAAA,YACR,WAAA,EAAa,eAAA;AAAA,YACb,IAAA,EAAM;AAAA,WACR;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,UAAA,QAAA,CAAS,GAAA,CAAI,KAAA,IAAS,CAAA,6BAAA,EAAgC,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AAClE,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,MAAM,QAAA,EAAS;AACf,QAAA,OAAO,IAAA;AAAA,MACT,SAAS,GAAA,EAAU;AACjB,QAAA,QAAA,CAAS,GAAA,EAAK,WAAW,6BAA6B,CAAA;AACtD,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IAEF,CAAA;AAAA,IACA,CAAC,eAAA,EAAiB,YAAA,CAAa,OAAA,EAAS,YAAA,CAAa,UAAU,QAAQ;AAAA,GACzE;AAEA,EAAA,MAAM,OAAA,GAAUA,iBAAAA;AAAA,IACd,OAAO,iBAAyB,YAAA,KAA2C;AACzE,MAAA,IAAI,CAAC,iBAAiB,OAAO,KAAA;AAC7B,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI;AACF,QAAA,MAAM,MAAM,MAAM,cAAA;AAAA,UAChB,GAAG,UAAU,CAAA,QAAA,CAAA;AAAA,UACb;AAAA,YACE,MAAA,EAAQ,MAAA;AAAA,YACR,WAAA,EAAa,eAAA;AAAA,YACb,IAAA,EAAM,EAAE,aAAA,EAAe,YAAA,EAAc,YAAY,IAAA;AAAK,WACxD;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,UAAA,QAAA,CAAS,GAAA,CAAI,KAAA,IAAS,CAAA,8BAAA,EAAiC,GAAA,CAAI,MAAM,CAAA,CAAE,CAAA;AACnE,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,MAAM,QAAA,EAAS;AACf,QAAA,OAAO,IAAA;AAAA,MACT,SAAS,GAAA,EAAU;AACjB,QAAA,QAAA,CAAS,GAAA,EAAK,WAAW,8BAA8B,CAAA;AACvD,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IAEF,CAAA;AAAA,IACA,CAAC,eAAA,EAAiB,YAAA,CAAa,OAAA,EAAS,YAAA,CAAa,UAAU,QAAQ;AAAA,GACzE;AAEA,EAAA,OAAO,EAAE,SAAS,SAAA,EAAW,KAAA,EAAO,aAAa,QAAA,EAAU,MAAA,EAAQ,SAAS,OAAA,EAAQ;AACtF;AC3IA,IAAM,SAAA,GAAoC;AAAA,EACxC,OAAA,EAAS,UAAA;AAAA,EACT,aAAA,EAAe,gBAAA;AAAA,EACf,IAAA,EAAM,MAAA;AAAA,EACN,QAAA,EAAU,WAAA;AAAA,EACV,MAAA,EAAQ,SAAA;AAAA,EACR,KAAA,EAAO;AACT,CAAA;AAEA,eAAe,YAAA,CACb,MAAA,EACA,GAAA,EAEA,WAAA,EACmB;AACnB,EAAA,OAAO,MAAM,GAAA,EAAK;AAAA,IAChB,MAAA;AAAA,IACA,OAAA,EAAS;AAAA,MACP,aAAA,EAAe,CAAA,OAAA,EAAU,WAAA,CAAY,MAAM,CAAA,CAAA;AAAA,MAC3C,eAAe,WAAA,CAAY,QAAA;AAAA,MAC3B,aAAa,WAAA,CAAY;AAAA;AAC3B,GACD,CAAA;AACH;AAEO,SAAS,WAAW,IAAA,EAAyC;AAClE,EAAA,MAAM,MAAM,oBAAA,EAAqB;AACjC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIF,cAAAA,CAAoC,EAAE,CAAA;AAChE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACxD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,KAAA,GAAQU,cAAQ,OAAO;AAAA,IAC3B,MAAA,EAAS,GAAA,EAAK,WAAA,EAAqB,MAAA,IAAU,EAAA;AAAA,IAC7C,UAAW,GAAA,EAAK,WAAA,EAAqB,QAAA,IAAY,GAAA,EAAK,QAAQ,QAAA,IAAY,EAAA;AAAA,IAC1E,MAAA,EAAS,GAAA,EAAK,WAAA,EAAqB,MAAA,IAAU;AAAA,MAC3C,CAAC,GAAA,EAAK,aAAa,GAAA,EAAK,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAE7C,EAAA,MAAM,OAAA,GAAU,GAAA,EAAK,MAAA,EAAQ,OAAA,IAAW,gCAAA;AACxC,EAAA,MAAM,OAAA,GAAU,UAAU,IAAI,CAAA;AAE9B,EAAA,MAAM,UAAA,GAAaR,iBAAAA,CAAY,OAAO,IAAA,KAA0E;AAC9G,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,CAAC,OAAA,EAAS;AAC/B,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAI,IAAA,EAAM,OAAA,KAAY,KAAA,EAAO,QAAA,CAAS,IAAI,CAAA;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,IAAI,GAAA,CAAI,GAAG,OAAO,CAAA,SAAA,EAAY,OAAO,CAAA,CAAE,CAAA;AACnD,MAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,SAAA,EAAW,KAAA,CAAM,MAAM,CAAA;AAC5C,MAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,IAAI,CAAA;AAClC,MAAA,IAAI,MAAM,MAAA,EAAQ,GAAA,CAAI,aAAa,GAAA,CAAI,QAAA,EAAU,KAAK,MAAM,CAAA;AAC5D,MAAA,IAAI,MAAM,MAAA,EAAQ,GAAA,CAAI,aAAa,GAAA,CAAI,QAAA,EAAU,KAAK,MAAM,CAAA;AAE5D,MAAA,MAAM,OAAO,MAAM,YAAA,CAAa,OAAO,GAAA,CAAI,QAAA,IAAY,KAAK,CAAA;AAC5D,MAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACZ,QAAA,QAAA,CAAS,CAAA,eAAA,EAAkB,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,MAAM,CAAA,CAAA,CAAG,CAAA;AAClD,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,EAAK;AAC7B,MAAA,MAAM,QAAA,GAAsC,IAAA,CAAK,KAAA,IAAS,EAAC;AAC3D,MAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,QAAA,QAAA,CAAS,UAAQ,CAAC,GAAG,IAAA,EAAM,GAAG,QAAQ,CAAC,CAAA;AAAA,MACzC,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,QAAQ,CAAA;AAAA,MACnB;AACA,MAAA,UAAA,CAAW,IAAA,CAAK,YAAY,KAAK,CAAA;AACjC,MAAA,SAAA,CAAU,IAAA,CAAK,eAAe,IAAI,CAAA;AAClC,MAAA,IAAI,IAAA,CAAK,KAAA,IAAS,IAAA,EAAM,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,IAC7C,SAAS,CAAA,EAAQ;AACf,MAAA,QAAA,CAAS,CAAA,CAAE,OAAA,IAAW,CAAA,eAAA,EAAkB,IAAI,CAAA,CAAE,CAAA;AAAA,IAChD,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,CAAM,MAAA,EAAQ,KAAA,CAAM,QAAA,EAAU,KAAA,CAAM,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,IAAI,CAAC,CAAA;AAEvE,EAAAD,gBAAU,MAAM;AACd,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,UAAA,CAAW,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,QAAA,GAAWC,kBAAY,MAAM;AACjC,IAAA,IAAI,CAAC,SAAA,IAAa,OAAA,IAAW,MAAA,EAAQ;AACnC,MAAA,UAAA,CAAW,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,UAAA,EAAY,SAAA,EAAW,OAAA,EAAS,MAAM,CAAC,CAAA;AAE3C,EAAA,MAAM,OAAA,GAAUA,iBAAAA,CAAY,CAAC,MAAA,KAAoB;AAC/C,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,UAAA,CAAW,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,EACtC,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,UAAA,GAAaA,iBAAAA,CAAY,OAAO,IAAA,KAAmC;AACvE,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,OAAO,KAAA;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,OAAO,CAAA,SAAA,EAAY,OAAO,CAAA,CAAA,EAAI,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAE,CAAA;AAC/E,MAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,SAAA,EAAW,KAAA,CAAM,MAAM,CAAA;AAC5C,MAAA,MAAM,OAAO,MAAM,YAAA,CAAa,UAAU,GAAA,CAAI,QAAA,IAAY,KAAK,CAAA;AAC/D,MAAA,IAAI,IAAA,CAAK,IAAI,OAAA,EAAQ;AACrB,MAAA,OAAO,IAAA,CAAK,EAAA;AAAA,IACd,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,CAAM,MAAA,EAAQ,KAAA,CAAM,QAAA,EAAU,KAAA,CAAM,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,OAAO,CAAC,CAAA;AAE1E,EAAA,MAAM,SAAA,GAAYA,iBAAAA,CAAY,OAAO,IAAA,KAA0D;AAC7F,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,IAAU,CAAC,SAAS,OAAO,IAAA;AACtC,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,OAAO,CAAA,SAAA,EAAY,OAAO,CAAA,CAAA,EAAI,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAE,CAAA;AAC/E,MAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,SAAA,EAAW,KAAA,CAAM,MAAM,CAAA;AAC5C,MAAA,MAAM,OAAO,MAAM,YAAA,CAAa,OAAO,GAAA,CAAI,QAAA,IAAY,KAAK,CAAA;AAC5D,MAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA;AACrB,MAAA,OAAO,MAAM,KAAK,IAAA,EAAK;AAAA,IACzB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,CAAM,MAAA,EAAQ,KAAA,CAAM,UAAU,KAAA,CAAM,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAC,CAAA;AAEjE,EAAA,OAAO,EAAE,OAAO,SAAA,EAAW,KAAA,EAAO,SAAS,KAAA,EAAO,QAAA,EAAU,OAAA,EAAS,UAAA,EAAY,SAAA,EAAU;AAC7F;AC1GA,eAAe8B,aAAAA,CACb,MAAA,EACA,IAAA,EACA,WAAA,EACA,QACA,IAAA,EACmB;AACnB,EAAA,MAAM,IAAA,GAAO,OAAO,OAAA,IAAW,gCAAA;AAC/B,EAAA,MAAM,MAAM,IAAI,GAAA,CAAI,GAAG,IAAI,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA;AACpC,EAAA,IAAI,MAAA,KAAW,KAAA,IAAS,WAAA,CAAY,MAAA,EAAQ;AAC1C,IAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,SAAA,EAAW,WAAA,CAAY,MAAM,CAAA;AAAA,EACpD;AACA,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,QAAA,EAAS,EAAG;AAAA,IAC3B,MAAA;AAAA,IACA,OAAA,EAAS;AAAA,MACP,aAAA,EAAe,CAAA,OAAA,EAAU,WAAA,CAAY,MAAM,CAAA,CAAA;AAAA,MAC3C,aAAA,EAAe,MAAA,CAAO,WAAA,CAAY,QAAA,IAAY,EAAE,CAAA;AAAA,MAChD,WAAA,EAAa,MAAA,CAAO,WAAA,CAAY,MAAA,IAAU,EAAE,CAAA;AAAA,MAC5C,GAAoD;AAAC,KACvD;AAAA,IACA,GAA4C;AAAC,GAC9C,CAAA;AACH;AAEO,SAAS,YAAA,GAAmC;AACjD,EAAA,MAAM,MAAM,oBAAA,EAAqB;AACjC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIhC,cAAAA,CAA4B,EAAE,CAAA;AAChE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,KAAA,GAAQU,cAAQ,OAAO;AAAA,IAC3B,MAAA,EAAS,GAAA,EAAK,WAAA,EAAqB,MAAA,IAAU,EAAA;AAAA,IAC7C,UAAW,GAAA,EAAK,WAAA,EAAqB,QAAA,IAAY,GAAA,EAAK,QAAQ,QAAA,IAAY,EAAA;AAAA,IAC1E,MAAA,EAAS,GAAA,EAAK,WAAA,EAAqB,MAAA,IAAU;AAAA,MAC3C,CAAC,GAAA,EAAK,aAAa,GAAA,EAAK,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAE7C,EAAA,MAAM,YAAA,GAAeA,aAAAA;AAAA,IACnB,OAAO,EAAE,OAAA,EAAS,GAAA,EAAK,QAAQ,OAAA,EAAS,QAAA,EAAU,GAAA,EAAK,MAAA,EAAQ,QAAA,EAAS,CAAA;AAAA,IACxE,CAAC,GAAA,EAAK,MAAA,EAAQ,OAAA,EAAS,GAAA,EAAK,QAAQ,QAAQ;AAAA,GAC9C;AAEA,EAAA,MAAM,MAAA,GAASR,kBAAY,YAAY;AACrC,IAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACnB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,MAAM8B,aAAAA,CAAa,KAAA,EAAO,iBAAA,EAAmB,OAAO,YAAY,CAAA;AAC7E,MAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACZ,QAAA,QAAA,CAAS,CAAA,uBAAA,EAA0B,IAAA,CAAK,MAAM,CAAA,CAAA,CAAG,CAAA;AACjD,QAAA;AAAA,MACF;AACA,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,EAAK;AAC7B,MAAA,YAAA,CAAa,IAAA,CAAK,MAAA,IAAU,EAAE,CAAA;AAAA,IAChC,SAAS,CAAA,EAAQ;AACf,MAAA,QAAA,CAAS,CAAA,CAAE,WAAW,uBAAuB,CAAA;AAAA,IAC/C,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,CAAM,MAAA,EAAQ,KAAA,CAAM,UAAU,KAAA,CAAM,MAAA,EAAQ,YAAA,CAAa,OAAO,CAAC,CAAA;AAErE,EAAA/B,gBAAU,MAAM;AAAE,IAAA,MAAA,EAAO;AAAA,EAAG,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEvC,EAAA,MAAM,cAAA,GAAiBC,iBAAAA,CAAY,OAAO,IAAA,KAAmD;AAC3F,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,OAAO,IAAA;AAC1B,IAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAC9B,IAAA,QAAA,CAAS,MAAA,CAAO,QAAQ,IAAI,CAAA;AAC5B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,aAAa,OAAA,IAAW,gCAAA;AACrC,MAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,sBAAA,CAAA,EAA0B;AAAA,QACxD,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,aAAA,EAAe,CAAA,OAAA,EAAU,KAAA,CAAM,MAAM,CAAA,CAAA;AAAA,UACrC,eAAe,KAAA,CAAM,QAAA;AAAA,UACrB,aAAa,KAAA,CAAM;AAAA,SACrB;AAAA,QACA,IAAA,EAAM;AAAA,OACP,CAAA;AACD,MAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,IAAA;AACrB,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,EAAK;AAC/B,MAAA,MAAA,EAAO;AACP,MAAA,OAAO,MAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,CAAM,MAAA,EAAQ,KAAA,CAAM,QAAA,EAAU,KAAA,CAAM,MAAA,EAAQ,YAAA,CAAa,OAAA,EAAS,MAAM,CAAC,CAAA;AAE7E,EAAA,MAAM,cAAA,GAAiBA,iBAAAA,CAAY,OAAO,IAAA,KAAmC;AAC3E,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,OAAO,KAAA;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM8B,aAAAA,CAAa,QAAA,EAAU,CAAA,gBAAA,EAAmB,mBAAmB,IAAI,CAAC,CAAA,CAAA,EAAI,KAAA,EAAO,YAAY,CAAA;AAC5G,MAAA,IAAI,IAAA,CAAK,IAAI,MAAA,EAAO;AACpB,MAAA,OAAO,IAAA,CAAK,EAAA;AAAA,IACd,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,CAAM,MAAA,EAAQ,KAAA,CAAM,QAAA,EAAU,KAAA,CAAM,MAAA,EAAQ,YAAA,CAAa,OAAA,EAAS,MAAM,CAAC,CAAA;AAE7E,EAAA,MAAM,OAAA,GAAUtB,aAAAA;AAAA,IACd,MAAM,SAAA,CAAU,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,SAAS,CAAA;AAAA,IAClD,CAAC,SAAS;AAAA,GACZ;AACA,EAAA,MAAM,WAAA,GAAcA,aAAAA;AAAA,IAClB,MAAM,SAAA,CAAU,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,SAAS,CAAA;AAAA,IAClD,CAAC,SAAS;AAAA,GACZ;AAEA,EAAA,OAAO,EAAE,WAAW,OAAA,EAAS,WAAA,EAAa,WAAW,KAAA,EAAO,OAAA,EAAS,MAAA,EAAQ,cAAA,EAAgB,cAAA,EAAe;AAC9G;AAIA,eAAsB,WAAA,CACpB,WAAA,EACA,IAAA,EACA,MAAA,EACqE;AACrE,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAMsB,aAAAA,CAAa,KAAA,EAAO,CAAA,gBAAA,EAAmB,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI,WAAA,EAAa,MAAA,IAAU,EAAE,CAAA;AAC/G,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,CAAA,EAAG;AAC1D,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,EAAK;AAC7B,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,IAAA,EAAK;AAAA,EAC1B,SAAS,CAAA,EAAQ;AACf,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,EAAE,OAAA,EAAQ;AAAA,EACvC;AACF;ACxJA,eAAe,cAAA,CACb,WAAA,EACA,SAAA,EACA,IAAA,EACA,MAAA,EACsF;AACtF,EAAA,MAAM,IAAA,GAAO,OAAO,OAAA,IAAW,gCAAA;AAC/B,EAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,eAAA,EAAkB,kBAAA,CAAmB,SAAS,CAAC,CAAA,SAAA,CAAW,CAAA;AACrF,EAAA,GAAA,CAAI,aAAa,GAAA,CAAI,OAAA,EAAS,OAAO,IAAA,CAAK,KAAY,CAAC,CAAA;AACvD,EAAA,IAAI,KAAK,QAAA,EAAU,GAAA,CAAI,aAAa,GAAA,CAAI,WAAA,EAAa,KAAK,QAAQ,CAAA;AAClE,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,GAAA,CAAI,UAAS,EAAG;AAAA,MACvC,OAAA,EAAS;AAAA,QACP,aAAA,EAAe,CAAA,OAAA,EAAU,WAAA,CAAY,MAAM,CAAA,CAAA;AAAA,QAC3C,eAAe,MAAA,CAAQ,WAAA,CAAoB,QAAA,IAAY,MAAA,CAAO,YAAY,EAAE,CAAA;AAAA,QAC5E,WAAA,EAAa,MAAA,CAAQ,WAAA,CAAoB,MAAA,IAAU,EAAE;AAAA;AACvD,KACD,CAAA;AACD,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,CAAA,EAAG;AAC1D,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,EAAK;AAC7B,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,KAAA,IAAS,EAAC,EAAE,EAAE;AAAA,EAC3E,SAAS,CAAA,EAAQ;AACf,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,EAAE,OAAA,EAAQ;AAAA,EACvC;AACF;AAYO,SAAS,gBAAgB,SAAA,EAA6D;AAC3F,EAAA,MAAM,EAAE,WAAA,EAAa,MAAA,EAAO,GAAI,YAAA,EAAa;AAC7C,EAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AAGxB,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIhC,cAAAA,CAAgB,EAAE,CAAA;AAClD,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIA,eAAoC,MAAS,CAAA;AAC/F,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AAEtD,EAAA,MAAM,OAAA,GAAUE,kBAAY,YAA2B;AACrD,IAAA,IAAI,CAAC,WAAA,IAAe,CAAC,SAAA,EAAW;AAC9B,MAAA,WAAA,CAAY,EAAE,CAAA;AACd,MAAA;AAAA,IACF;AACA,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,MAAM,cAAA;AAAA,QACjB,WAAA;AAAA,QACA,SAAA;AAAA,QACA,EAAE,QAAA,EAAU,KAAA,EAAO,GAAA,EAAI;AAAA,QACvB,EAAE,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,QAAA,EAAU,OAAO,QAAA;AAAS,OACvD;AACA,MAAA,IAAI,IAAA,CAAK,EAAA,IAAM,IAAA,CAAK,IAAA,EAAM;AACxB,QAAA,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,QAAA,IAAY,EAAE,CAAA;AACpC,QAAA,oBAAA,CAAqB,SAAS,CAAA;AAAA,MAChC,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,IAAA,CAAK,SAAS,6BAA6B,CAAA;AACpD,QAAA,WAAA,CAAY,EAAE,CAAA;AACd,QAAA,oBAAA,CAAqB,SAAS,CAAA;AAAA,MAChC;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,QAAA,CAAS,eAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AACzD,MAAA,WAAA,CAAY,EAAE,CAAA;AAAA,IAChB,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,WAAA,EAAa,SAAA,EAAW,UAAU,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,QAAQ,CAAC,CAAA;AAEtE,EAAAD,gBAAU,MAAM;AAGd,IAAA,oBAAA,CAAqB,MAAS,CAAA;AAC9B,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO,EAAE,QAAA,EAAU,YAAA,EAAc,iBAAA,EAAmB,SAAA,EAAW,OAAO,OAAA,EAAQ;AAChF;;;AC2bO,SAAS,iBAAA,GAAoB;AAClC,EAAA,OAAO;AAAA,IACL,cAAA,EAAgB,IAAA;AAAA,IAChB,UAAA,EAAY,WAAA;AAAA,IACZ,OAAO,YAAY;AAAA,IAAC,CAAA;AAAA,IACpB,SAAS,YAAY;AAAA,IAAC;AAAA,GACxB;AACF;AA+BO,SAAS,uBAAA,GAA0B;AACxC,EAAA,OAAO;AAAA,IACL,eAAe,EAAC;AAAA,IAChB,SAAA,EAAW,KAAA;AAAA,IACX,KAAA,EAAO,IAAA;AAAA,IACP,SAAS,MAAM;AAAA,IAAC,CAAA;AAAA,IAChB,IAAA,EAAM,OAAO,GAAA,KAAgB;AAAA,IAAC,CAAA;AAAA,IAC9B,MAAA,EAAQ,OAAO,GAAA,KAAgB;AAAA,IAAC,CAAA;AAAA,IAChC,kBAAA,EAAoB,OAAO,GAAA,KAAgB;AAAA,IAAC;AAAA,GAC9C;AACF;AAEO,SAAS,8BAA8B,MAAA,EAAiB;AAC7D,EAAA,OAAO;AAAA,IACL,OAAO,EAAC;AAAA,IACR,eAAe,EAAC;AAAA,IAChB,SAAA,EAAW,KAAA;AAAA,IACX,KAAA,EAAO,IAAA;AAAA,IACP,SAAS,MAAM;AAAA,IAAC;AAAA,GAClB;AACF;AAEO,SAAS,iBAAiB,QAAA,EAAwC;AACvE,EAAA,OAAO;AAAA,IACL,SAAS,EAAC;AAAA,IACV,SAAA,EAAW,KAAA;AAAA,IACX,KAAA,EAAO,EAAA;AAAA,IACP,QAAA,EAAU,CAAC,EAAA,KAAe;AAAA,IAAC,CAAA;AAAA,IAC3B,KAAA,EAAO,IAAA;AAAA,IACP,OAAO,MAAM;AAAA,IAAC;AAAA,GAChB;AACF;AAEO,SAAS,eAAA,GAAkB;AAChC,EAAA,OAAO;AAAA,IACL,OAAO,EAAC;AAAA,IACR,SAAA,EAAW,KAAA;AAAA,IACX,OAAA,EAAS,OAAO,GAAA,KAAgB;AAAA,IAAC,CAAA;AAAA,IACjC,iBAAA,EAAmB,OAAO,GAAA,KAAgB;AAAA,IAAC,CAAA;AAAA,IAC3C,SAAS,MAAM;AAAA,IAAC;AAAA,GAClB;AACF;AAIO,SAAS,iBAAA,GAAoB;AAClC,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,OAAO,GAAA,EAAa,MAAA,MAAiE;AAAA,MAC3F,KAAA,EAAO,EAAA;AAAA,MACP,MAAA,EAAQ,SAAA;AAAA,MACR,MAAA,EAAQ;AAAA,KACV,CAAA;AAAA,IACA,SAAA,EAAW,KAAA;AAAA,IACX,KAAA,EAAO;AAAA,GACT;AACF;AAIA,eAAsB,gBAAA,CACpB,WAAA,EACA,IAAA,EACA,QAAA,EACA,MAAA,EAC6F;AAC7F,EAAA,MAAMgC,UAAAA,GAAoC;AAAA,IACxC,OAAA,EAAS,UAAA;AAAA,IAAY,aAAA,EAAe,gBAAA;AAAA,IAAkB,IAAA,EAAM,MAAA;AAAA,IAC5D,QAAA,EAAU,WAAA;AAAA,IAAa,MAAA,EAAQ,SAAA;AAAA,IAAW,KAAA,EAAO;AAAA,GACnD;AACA,EAAA,MAAM,GAAA,GAAMA,WAAU,IAAI,CAAA;AAC1B,EAAA,IAAI,CAAC,OAAO,CAAC,WAAA,EAAa,QAAQ,OAAO,EAAE,IAAI,KAAA,EAAM;AACrD,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,QAAQ,OAAA,IAAW,gCAAA;AAChC,IAAA,MAAM,MAAM,IAAI,GAAA,CAAI,GAAG,IAAI,CAAA,SAAA,EAAY,GAAG,CAAA,CAAE,CAAA;AAC5C,IAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,SAAA,EAAW,WAAA,CAAY,MAAM,CAAA;AAClD,IAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,OAAA,EAAS,GAAG,CAAA;AACjC,IAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,GAAA,CAAI,UAAS,EAAG;AAAA,MACvC,OAAA,EAAS;AAAA,QACP,aAAA,EAAe,CAAA,OAAA,EAAU,WAAA,CAAY,MAAM,CAAA,CAAA;AAAA,QAC3C,eAAe,WAAA,CAAY,QAAA;AAAA,QAC3B,aAAa,WAAA,CAAY;AAAA;AAC3B,KACD,CAAA;AACD,IAAA,IAAI,CAAC,IAAA,CAAK,EAAA,EAAI,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,CAAA,EAAG;AAC1D,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,EAAK;AAC7B,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,IAAG,EAAE;AAAA,EAClF,SAAS,CAAA,EAAQ;AACf,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,EAAE,OAAA,EAAQ;AAAA,EACvC;AACF","file":"index.js","sourcesContent":["/**\n * Flowstack API Client\n *\n * CRITICAL: This enforces user-level isolation for the shared tenant architecture.\n * ALL API requests MUST go through this client to prevent data leakage.\n *\n * Architecture:\n * - Flowstack: Multi-user, single-tenant system\n * - Backend: Multi-tenant system\n * - Isolation: By user_id within shared tenant\n */\n\nimport type {\n ApiResponse,\n FlowstackCredentials,\n WorkspaceInfo,\n DatasetInfo,\n VisualizationData,\n ReportInfo,\n ModelInfo,\n DataSource,\n DataSourceConfig,\n ConnectionTestResult,\n ManagedUser,\n UserStats,\n UserActivityLog,\n UserListParams,\n UserListResponse,\n UpdateUserRequest,\n DatasetPreview,\n GitHubRepo,\n PiiSettings,\n PiiRedactedEntity,\n PublishedSiteInfo,\n ScriptInfo,\n AgentInfo,\n SiteVersionManifest,\n PublishToGitHubParams,\n PublishToGitHubResult,\n CollectionLayer,\n UserDataOverview,\n UserCollectionInfo,\n CollectionSchemaInfo,\n} from '../types';\n\n// Default API URL\nconst DEFAULT_BASE_URL = 'https://sage-api.flowstack.fun';\n// No real default tenant: every function here is authenticated (takes `credentials`),\n// so the backend derives tenant_id from the JWT/API key and ignores the X-Tenant-ID\n// header. Falling back to '' avoids silently tagging requests with a platform tenant.\nconst DEFAULT_TENANT_ID = '';\n\n// Client configuration\nexport interface FlowstackClientConfig {\n baseUrl?: string;\n tenantId?: string;\n enforceUserScope?: boolean;\n /** App scope (site_id) — embedded in JWT for built-app users */\n appScope?: string;\n}\n\n/**\n * Request options for API calls\n */\nexport interface RequestOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n body?: unknown;\n headers?: Record<string, string>;\n credentials: FlowstackCredentials;\n}\n\n/**\n * Make a request to the Flowstack API with user-level isolation\n */\nexport async function flowstackFetch<T = unknown>(\n endpoint: string,\n options: RequestOptions,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<T>> {\n const { method = 'GET', body, headers = {}, credentials } = options;\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n const enforceUserScope = config?.enforceUserScope !== false;\n\n const { apiKey, tenantId, userId } = credentials;\n\n // CRITICAL: Enforce user ID requirement\n if (enforceUserScope && !userId) {\n console.error('[FlowstackClient] CRITICAL: No user ID provided!');\n throw new Error('SECURITY: User ID is required for all API requests.');\n }\n\n // Build full URL\n const url = new URL(`${baseUrl}${endpoint}`);\n\n // Add user_id as query parameter for GET requests\n if (method === 'GET' && userId) {\n url.searchParams.set('user_id', userId);\n }\n\n // Build request headers\n const requestHeaders: HeadersInit = {\n 'Authorization': `Bearer ${apiKey}`,\n 'X-Tenant-ID': tenantId || config?.tenantId || DEFAULT_TENANT_ID,\n 'X-User-ID': userId || '',\n ...headers,\n };\n\n // Add Content-Type for POST/PUT/PATCH\n if (body && !requestHeaders['Content-Type']) {\n requestHeaders['Content-Type'] = 'application/json';\n }\n\n try {\n const response = await fetch(url.toString(), {\n method,\n headers: requestHeaders,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n console.error(`[FlowstackClient] Error ${response.status}:`, errorText);\n return {\n ok: false,\n status: response.status,\n error: errorText,\n };\n }\n\n const data = await response.json();\n return {\n ok: true,\n status: response.status,\n data: data as T,\n };\n } catch (error) {\n console.error('[FlowstackClient] Request failed:', error);\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Unknown error',\n };\n }\n}\n\n// =============================================================================\n// Workspace Operations\n// =============================================================================\n\n/**\n * List workspaces for the current user\n */\nexport async function listWorkspaces(\n credentials: FlowstackCredentials,\n limit: number = 50,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ workspaces: WorkspaceInfo[]; total_count: number; has_more: boolean }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/workspaces?limit=${limit}`, {\n credentials,\n }, config);\n}\n\n/**\n * Create a new workspace\n */\nexport async function createWorkspace(\n credentials: FlowstackCredentials,\n name: string,\n description?: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ workspace: WorkspaceInfo }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/workspaces`, {\n method: 'POST',\n credentials,\n body: {\n name,\n workspace_name: name,\n description,\n user_id: credentials.userId,\n },\n }, config);\n}\n\n/**\n * Get a single workspace\n */\nexport async function getWorkspace(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ workspace: WorkspaceInfo }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/workspaces/${workspaceId}`, {\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Dataset Operations\n// =============================================================================\n\n/**\n * List datasets for a tenant (optionally filtered by workspace)\n */\nexport async function listDatasets(\n credentials: FlowstackCredentials,\n workspaceId?: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ datasets: DatasetInfo[] }>> {\n // Use workspace-scoped endpoint (non-tenant-prefixed) — demo users lack admin:read\n const query = workspaceId\n ? `?workspace_id=${workspaceId}&session_id=${workspaceId}`\n : '';\n return flowstackFetch(`/datasets${query}`, {\n credentials,\n }, config);\n}\n\n/**\n * Get dataset details\n */\nexport async function getDataset(\n credentials: FlowstackCredentials,\n datasetName: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ dataset: DatasetInfo }>> {\n // API provides dataset info through the download endpoint\n return flowstackFetch(`/datasets/${datasetName}/download`, {\n credentials,\n }, config);\n}\n\n/**\n * Get a preview of dataset rows and columns\n */\nexport async function getDatasetPreview(\n credentials: FlowstackCredentials,\n datasetName: string,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<DatasetPreview>> {\n return flowstackFetch(`/datasets/${datasetName}/preview?workspace_id=${workspaceId}&session_id=${workspaceId}&limit=50`, {\n credentials,\n }, config);\n}\n\n/**\n * Delete a dataset\n * Note: Dataset deletion must be done through the agent chat interface\n */\nexport async function deleteDataset(\n _credentials: FlowstackCredentials,\n _datasetName: string,\n _config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n // Dataset deletion is handled through agent interactions, not a direct API call\n return {\n ok: false,\n status: 501,\n error: 'Dataset deletion is handled through the agent chat interface. Use the /stream endpoint to request deletion.',\n };\n}\n\n// =============================================================================\n// Visualization Operations\n// =============================================================================\n\n/**\n * List visualizations in a workspace\n */\nexport async function listVisualizations(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ visualizations: VisualizationData[] }>> {\n return flowstackFetch(`/visualizations?workspace_id=${workspaceId}&session_id=${workspaceId}`, {\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Report Operations\n// =============================================================================\n\n/**\n * List reports in a workspace\n */\nexport async function listReports(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ reports: ReportInfo[] }>> {\n return flowstackFetch(`/reports?workspace_id=${workspaceId}&session_id=${workspaceId}`, {\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Model Operations\n// =============================================================================\n\n/**\n * List ML models in a workspace\n */\nexport async function listModels(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ models: ModelInfo[] }>> {\n return flowstackFetch(`/models?workspace_id=${workspaceId}&session_id=${workspaceId}`, {\n credentials,\n }, config);\n}\n\n/**\n * Get model details\n */\nexport async function getModel(\n credentials: FlowstackCredentials,\n workspaceId: string,\n modelName: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ model: ModelInfo }>> {\n return flowstackFetch(`/models/${modelName}?workspace_id=${workspaceId}&session_id=${workspaceId}`, {\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Script Operations\n// =============================================================================\n\n/**\n * List scripts in a workspace\n */\nexport async function listScripts(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ scripts: ScriptInfo[] }>> {\n return flowstackFetch(`/scripts/detailed?workspace_id=${workspaceId}&session_id=${workspaceId}`, {\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Data Source Operations\n// =============================================================================\n\n/**\n * List data sources\n */\nexport async function listDataSources(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig,\n options?: {\n /**\n * P0-69: when true, appends `include_provenance=true` so the backend\n * returns the `_flowstack` workspace attribution envelope on every\n * data source. Required for built apps that need to know which\n * workspace a shared data source belongs to.\n */\n includeProvenance?: boolean;\n },\n): Promise<ApiResponse<{ datasources: DataSource[] }>> {\n const qs = options?.includeProvenance ? '?include_provenance=true' : '';\n return flowstackFetch(`/data-sources${qs}`, {\n credentials,\n }, config);\n}\n\n/**\n * Create a data source\n */\nexport async function createDataSource(\n credentials: FlowstackCredentials,\n sourceConfig: DataSourceConfig,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<DataSource>> {\n return flowstackFetch('/data-sources', {\n method: 'POST',\n credentials,\n body: {\n source_type: sourceConfig.type,\n name: sourceConfig.name,\n auth_method: sourceConfig.auth_method || 'connection_string',\n credentials: sourceConfig.credentials || {\n connection_string: sourceConfig.connectionString,\n },\n metadata: sourceConfig.metadata,\n is_tenant_wide: sourceConfig.is_tenant_wide || false,\n },\n }, config);\n}\n\n/**\n * Test a data source connection\n */\nexport async function testDataSource(\n credentials: FlowstackCredentials,\n sourceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<ConnectionTestResult>> {\n return flowstackFetch(`/data-sources/${sourceId}/test`, {\n method: 'POST',\n credentials,\n }, config);\n}\n\n/**\n * Delete a data source\n */\nexport async function deleteDataSource(\n credentials: FlowstackCredentials,\n sourceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n return flowstackFetch(`/data-sources/${sourceId}`, {\n method: 'DELETE',\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Agent Discovery\n// =============================================================================\n\n/**\n * List available agents with descriptions and capabilities.\n * No credentials required — this is a public capability catalog.\n */\nexport async function listAgents(\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ agents: AgentInfo[]; count: number; workflows: any[] }>> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n\n try {\n const response = await fetch(`${baseUrl}/agents`, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return { ok: false, status: response.status, error: errorText };\n }\n\n const data = await response.json();\n return { ok: true, status: response.status, data };\n } catch (error) {\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Failed to fetch agents',\n };\n }\n}\n\n// =============================================================================\n// Query Execution\n// =============================================================================\n\n/**\n * Execute a streaming query\n * Returns the Response object for SSE streaming\n */\nexport async function executeQuery(\n credentials: FlowstackCredentials,\n query: string,\n workspaceId: string,\n options?: {\n networkMode?: 'SANDBOX' | 'PUBLIC';\n tools?: string[];\n /** @deprecated P0-73: Strands swarm removed. Use `capabilities` instead. */\n targetAgent?: string;\n /** @deprecated P0-73: Strands swarm removed. Use `capabilities` instead. */\n targetAgents?: string[];\n /** P0-80: meta-tool categories to pre-load on the server so the agent\n * has the right tools available from turn 1. Values: 'site_operations',\n * 'data_access', 'external_integration', 'code_execution',\n * 'domain_task', 'workspace_management'. */\n capabilities?: string[];\n /** Session ID for conversation continuity */\n sessionId?: string;\n /**\n * When true, backend generates a new session key (appends timestamp to\n * the deterministic hash) so end-users of built apps get a fresh\n * conversation on the backend, not just cleared frontend state.\n */\n forceNewSession?: boolean;\n },\n config?: FlowstackClientConfig\n): Promise<Response> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n\n const response = await fetch(`${baseUrl}/stream`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': tenantId,\n 'X-User-ID': credentials.userId || '',\n 'Accept': 'text/event-stream',\n },\n body: JSON.stringify({\n query,\n workspace_id: workspaceId,\n session_id: options?.sessionId || undefined,\n force_new_session: options?.forceNewSession || undefined,\n tenant_id: tenantId,\n user_id: credentials.userId,\n code_interpreter_network_mode: options?.networkMode || 'SANDBOX',\n // P0-80: capabilities replaces target_agents on the wire. Deprecated\n // target_agents/target_agent are intentionally NOT forwarded — they\n // were no-ops post-P0-73 and forwarding them just added noise to logs.\n capabilities: options?.capabilities && options.capabilities.length > 0\n ? options.capabilities\n : undefined,\n }),\n });\n\n if (!response.ok) {\n // 402 Payment Required → out of credits. Throw a typed error that Casino's\n // useAgent hook can catch and surface via the CreditGate modal.\n if (response.status === 402) {\n let body: any = {};\n try { body = await response.json(); } catch {}\n const err = new Error(body?.message || 'Out of credits — top up to continue');\n (err as any).status = 402;\n (err as any).code = 'INSUFFICIENT_CREDITS';\n (err as any).body = body;\n throw err;\n }\n // Other failures — try to parse the body for a meaningful message\n let detail = response.statusText;\n try {\n const body = await response.json();\n detail = body?.detail || body?.error || body?.message || detail;\n } catch {}\n throw new Error(`Query failed: ${detail}`);\n }\n\n return response;\n}\n\n/**\n * Execute a streaming query with custom agent configuration\n *\n * Extends executeQuery to support system prompt overrides, tool whitelists,\n * and direct agent targeting.\n */\nexport async function executeQueryWithConfig(\n credentials: FlowstackCredentials,\n query: string,\n workspaceId: string,\n options?: {\n networkMode?: 'SANDBOX' | 'PUBLIC';\n systemPrompt?: string;\n tools?: string[];\n /** @deprecated P0-73: Strands swarm removed. Use `capabilities` instead. */\n targetAgent?: string;\n /** @deprecated P0-73: Strands swarm removed. Use `capabilities` instead. */\n targetAgents?: string[];\n /** P0-80: meta-tool categories to pre-load on the server. */\n capabilities?: string[];\n /** P0-132 (G4): target a specific registered persona/subagent by name. Sent\n * as `target_agents` on the wire so multi-persona apps can pick a persona\n * instead of always hitting the auto-selected first subagent. This is the\n * supported persona-selection path — distinct from the deprecated Strands\n * swarm `targetAgent(s)` fields above. */\n persona?: string;\n /** Session ID for conversation continuity */\n sessionId?: string;\n /** P0-57: Per-request PII allowlist — terms the user explicitly allowed */\n allowedTerms?: string[];\n /** Force backend to create a new conversation (appends timestamp to session hash) */\n forceNewSession?: boolean;\n },\n config?: FlowstackClientConfig\n): Promise<Response> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n\n const response = await fetch(`${baseUrl}/stream`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': tenantId,\n 'X-User-ID': credentials.userId || '',\n 'Accept': 'text/event-stream',\n },\n body: JSON.stringify({\n query,\n workspace_id: workspaceId,\n session_id: options?.sessionId || undefined,\n force_new_session: options?.forceNewSession || undefined,\n tenant_id: tenantId,\n user_id: credentials.userId,\n code_interpreter_network_mode: options?.networkMode || 'SANDBOX',\n // P0-80: capabilities replaces target_agents on the wire.\n capabilities: options?.capabilities && options.capabilities.length > 0\n ? options.capabilities\n : undefined,\n system_prompt_override: options?.systemPrompt,\n tool_whitelist: options?.tools,\n allowed_terms: options?.allowedTerms || undefined,\n // P0-132 (G4): persona selection → target_agents. The backend persona\n // resolver honors request.target_agents and otherwise auto-selects the\n // first registered subagent. Only sent when a persona is requested.\n target_agents: options?.persona ? [options.persona] : undefined,\n }),\n });\n\n if (!response.ok) {\n // Surface the structured error body instead of discarding it. The credit\n // gate (402) returns { code, error, deposited_wei, wallet_wei, needs_deposit,\n // required_wei, credit_cost, ... }; FastAPI validation/other errors return\n // { detail: ... }. Attach code/status/fields so callers can react (e.g. show\n // a deposit shortcut) rather than rendering a bare \"Query failed\".\n let message = response.statusText || 'request failed';\n let code: string | undefined;\n let body: any;\n try {\n body = await response.clone().json();\n const payload = (body && typeof body === 'object' && 'detail' in body && typeof body.detail === 'object')\n ? body.detail\n : body;\n if (payload && typeof payload === 'object') {\n code = payload.code;\n message = payload.error || payload.message || payload.detail || message;\n } else if (typeof payload === 'string') {\n message = payload;\n }\n } catch {\n /* non-JSON error body — keep statusText */\n }\n const err = new Error(`Query failed: ${message}`) as Error & {\n status?: number;\n code?: string;\n body?: unknown;\n };\n err.status = response.status;\n err.code = code;\n err.body = body;\n throw err;\n }\n\n return response;\n}\n\n// =============================================================================\n// Collections — Direct MongoDB Read Access\n// =============================================================================\n\n/**\n * Query a MongoDB collection directly (for useCollection hook).\n *\n * Requires app_scope in JWT — only built-app users can use this.\n * Collection name is auto-prefixed with app_scope by the backend.\n */\nexport async function queryCollection<T = Record<string, any>>(\n credentials: FlowstackCredentials,\n collection: string,\n options?: {\n filter?: Record<string, any>;\n limit?: number;\n skip?: number;\n sort?: Record<string, 1 | -1>;\n projection?: Record<string, 0 | 1>;\n layer?: CollectionLayer;\n /**\n * P0-69: when true, appends `include_provenance=true` so the backend\n * returns the `_flowstack` workspace attribution envelope on every\n * document. Backend strips the envelope when this param is absent.\n */\n includeProvenance?: boolean;\n },\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ documents: T[]; count: number; total: number }>> {\n const params = new URLSearchParams();\n params.set('collection', collection);\n if (options?.filter) params.set('filter', JSON.stringify(options.filter));\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.skip) params.set('skip', String(options.skip));\n if (options?.sort) params.set('sort', JSON.stringify(options.sort));\n if (options?.projection) params.set('projection', JSON.stringify(options.projection));\n if (options?.layer) params.set('layer', options.layer);\n if (options?.includeProvenance) params.set('include_provenance', 'true');\n\n return flowstackFetch<{ documents: T[]; count: number; total: number }>(\n `/collections/query?${params.toString()}`,\n { credentials },\n config,\n );\n}\n\n/**\n * Insert one or more documents into a MongoDB collection.\n *\n * Requires app_scope in JWT — only built-app users can use this.\n * Collection name is auto-prefixed with app_scope by the backend.\n */\nexport async function insertDocuments(\n credentials: FlowstackCredentials,\n collection: string,\n documents: Record<string, any> | Record<string, any>[],\n config?: FlowstackClientConfig,\n layer?: CollectionLayer,\n): Promise<ApiResponse<{ inserted_count: number; inserted_ids: string[]; collection: string }>> {\n const isArray = Array.isArray(documents);\n return flowstackFetch<{ inserted_count: number; inserted_ids: string[]; collection: string }>(\n '/collections/insert',\n {\n method: 'POST',\n credentials,\n body: {\n collection,\n ...(isArray ? { documents } : { document: documents }),\n ...(layer ? { layer } : {}),\n },\n },\n config,\n );\n}\n\n/**\n * Update documents in a MongoDB collection matching the filter.\n *\n * Requires app_scope in JWT — only built-app users can use this.\n * Collection name is auto-prefixed with app_scope by the backend.\n */\nexport async function updateDocuments(\n credentials: FlowstackCredentials,\n collection: string,\n filter: Record<string, any>,\n update: Record<string, any>,\n options?: { upsert?: boolean },\n config?: FlowstackClientConfig,\n layer?: CollectionLayer,\n): Promise<ApiResponse<{ matched_count: number; modified_count: number; collection: string }>> {\n return flowstackFetch<{ matched_count: number; modified_count: number; collection: string }>(\n '/collections/update',\n {\n method: 'POST',\n credentials,\n body: {\n collection,\n filter,\n update,\n upsert: options?.upsert ?? false,\n ...(layer ? { layer } : {}),\n },\n },\n config,\n );\n}\n\n/**\n * Delete documents from a MongoDB collection matching the filter.\n *\n * Requires app_scope in JWT — only built-app users can use this.\n * Collection name is auto-prefixed with app_scope by the backend.\n */\nexport async function deleteDocuments(\n credentials: FlowstackCredentials,\n collection: string,\n filter: Record<string, any>,\n config?: FlowstackClientConfig,\n layer?: CollectionLayer,\n): Promise<ApiResponse<{ deleted_count: number; collection: string }>> {\n return flowstackFetch<{ deleted_count: number; collection: string }>(\n '/collections/delete',\n {\n method: 'POST',\n credentials,\n body: {\n collection,\n filter,\n ...(layer ? { layer } : {}),\n },\n },\n config,\n );\n}\n\n// =============================================================================\n// Private Messaging (P0-138)\n// =============================================================================\n//\n// Server-mediated, ACL'd, key-addressed direct messages between two app users.\n// The backend pins `from` to the caller's JWT identity, gates sends on a\n// mutually-consented thread, and ACLs reads to thread participants — neither\n// party ever learns the other's contact.\n//\n// Message bodies are UNTRUSTED user input. Render them as plain text / sanitized\n// markdown only — never as raw HTML (no dangerouslySetInnerHTML). If a body is\n// ever passed to an agent, treat it as data, not instructions.\n\nexport interface DmMessage {\n message_id: string;\n from: string;\n to: string;\n /** UNTRUSTED user input — render as text, never raw HTML. */\n body: string;\n created_at: string;\n read_at: string | null;\n}\n\nexport interface DmThread {\n pair_key: string;\n with_user_key: string;\n status: 'pending' | 'open';\n last_message: DmMessage | null;\n unread_count: number;\n updated_at: string | null;\n}\n\n/**\n * Deterministic, order-independent thread key for a pair of user keys.\n * Mirrors the backend's `pair_key` (sorted, '::'-joined).\n */\nexport function dmPairKey(a: string, b: string): string {\n return [a, b].sort().join('::');\n}\n\nfunction requireAppScope(config?: FlowstackClientConfig): string {\n const scope = config?.appScope;\n if (!scope) {\n throw new Error('Private messaging requires an app scope (built-app context).');\n }\n return scope;\n}\n\n/** List the caller's threads (counterpart key, last message, unread count). */\nexport async function listThreads(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ threads: DmThread[]; count: number }>> {\n const scope = requireAppScope(config);\n return flowstackFetch<{ threads: DmThread[]; count: number }>(\n `/apps/${encodeURIComponent(scope)}/threads`,\n { credentials },\n config,\n );\n}\n\n/** List messages in the caller's thread with `withUserKey`. ACL'd server-side. */\nexport async function listMessages(\n credentials: FlowstackCredentials,\n withUserKey: string,\n options?: { limit?: number; before?: string },\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ messages: DmMessage[]; count: number }>> {\n const scope = requireAppScope(config);\n const params = new URLSearchParams();\n params.set('with', withUserKey);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.before) params.set('before', options.before);\n return flowstackFetch<{ messages: DmMessage[]; count: number }>(\n `/apps/${encodeURIComponent(scope)}/messages?${params.toString()}`,\n { credentials },\n config,\n );\n}\n\n/** Send a message to `toUserKey`. 403 unless the thread is mutually open. */\nexport async function sendMessage(\n credentials: FlowstackCredentials,\n toUserKey: string,\n body: string,\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ message_id: string; created_at: string }>> {\n const scope = requireAppScope(config);\n return flowstackFetch<{ message_id: string; created_at: string }>(\n `/apps/${encodeURIComponent(scope)}/messages`,\n { method: 'POST', credentials, body: { to_user_key: toUserKey, body } },\n config,\n );\n}\n\n/**\n * Record the caller's consent to open a thread with `withUserKey`.\n * The thread becomes `open` (sendable) only once BOTH parties have consented.\n */\nexport async function openThread(\n credentials: FlowstackCredentials,\n withUserKey: string,\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ pair_key: string; status: string }>> {\n const scope = requireAppScope(config);\n const me = credentials.userId;\n if (!me) throw new Error('openThread requires an authenticated user.');\n const pk = dmPairKey(me, withUserKey);\n return flowstackFetch<{ pair_key: string; status: string }>(\n `/apps/${encodeURIComponent(scope)}/threads/${encodeURIComponent(pk)}/consent`,\n { method: 'POST', credentials },\n config,\n );\n}\n\n/** Mark a received message as read (recipient only). */\nexport async function markMessageRead(\n credentials: FlowstackCredentials,\n messageId: string,\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ message_id: string; read: boolean }>> {\n const scope = requireAppScope(config);\n return flowstackFetch<{ message_id: string; read: boolean }>(\n `/apps/${encodeURIComponent(scope)}/messages/${encodeURIComponent(messageId)}/read`,\n { method: 'POST', credentials },\n config,\n );\n}\n\n// =============================================================================\n// Direct Tool Invocation\n// =============================================================================\n\n/**\n * Invoke an agent tool directly (bypasses LLM orchestration).\n */\nexport async function invokeTool<T = any>(\n credentials: FlowstackCredentials,\n agentName: string,\n toolName: string,\n kwargs: Record<string, any> = {},\n config?: FlowstackClientConfig,\n): Promise<ApiResponse<{ status: string; result: T }>> {\n return flowstackFetch<{ status: string; result: T }>(\n '/tool/invoke',\n {\n method: 'POST',\n credentials,\n body: {\n agent_name: agentName,\n tool_name: toolName,\n kwargs,\n },\n },\n config,\n );\n}\n\n// =============================================================================\n// File Upload\n// =============================================================================\n\n/**\n * Upload a file to a workspace\n */\nexport async function uploadFile(\n credentials: FlowstackCredentials,\n workspaceId: string,\n file: File,\n name?: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ dataset?: DatasetInfo; report?: ReportInfo }>> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n\n const formData = new FormData();\n formData.append('file', file);\n formData.append('workspace_id', workspaceId);\n if (name) {\n formData.append('name', name);\n formData.append('dataset_name', name);\n }\n\n try {\n const response = await fetch(`${baseUrl}/upload`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': tenantId,\n 'X-User-ID': credentials.userId || '',\n 'X-Session-ID': workspaceId,\n },\n body: formData,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n ok: false,\n status: response.status,\n error: errorText,\n };\n }\n\n const data = await response.json();\n return {\n ok: true,\n status: response.status,\n data,\n };\n } catch (error) {\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Upload failed',\n };\n }\n}\n\n/**\n * Upload a document (PDF/DOCX/image/etc.) to a workspace's uploads/ prefix.\n *\n * The two upload routes split by intent: `/upload` parses tabular formats into\n * a queryable DataFrame (dataset); `/upload-document` stores raw bytes for the\n * agent's `ingest_document` / `search_documents` tools. The chat input\n * accepts both kinds of file, so useAgent.query() must pick the right route\n * by extension or the backend 400s with \"Unsupported file type\".\n */\nexport async function uploadDocument(\n credentials: FlowstackCredentials,\n workspaceId: string,\n file: File,\n documentName?: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ document_name?: string; filename?: string; format?: string; size_bytes?: number; s3_key?: string }>> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n\n const formData = new FormData();\n formData.append('file', file);\n formData.append('workspace_id', workspaceId);\n if (documentName) formData.append('document_name', documentName);\n\n try {\n const response = await fetch(`${baseUrl}/upload-document`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': tenantId,\n 'X-User-ID': credentials.userId || '',\n 'X-Session-ID': workspaceId,\n },\n body: formData,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return { ok: false, status: response.status, error: errorText };\n }\n\n const data = await response.json();\n return { ok: true, status: response.status, data };\n } catch (error) {\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Document upload failed',\n };\n }\n}\n\n// =============================================================================\n// Authentication\n// =============================================================================\n\n/**\n * Login to get session token\n */\nexport async function login(\n email: string,\n password: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{\n session_token: string;\n user_id: string;\n access_token?: string;\n}>> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n\n try {\n const response = await fetch(`${baseUrl}/auth/user/login`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(config?.tenantId ? { 'X-Tenant-ID': config.tenantId } : {}),\n },\n body: JSON.stringify({\n email,\n password,\n ...(config?.appScope ? { app_scope: config.appScope } : {}),\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n ok: false,\n status: response.status,\n error: errorText,\n };\n }\n\n const data = await response.json();\n return {\n ok: true,\n status: response.status,\n data,\n };\n } catch (error) {\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Login failed',\n };\n }\n}\n\n/**\n * Register a new user\n */\nexport async function register(\n email: string,\n password: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ user_id: string; message?: string; session_token?: string; tenant_id?: string }>> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n\n try {\n const response = await fetch(`${baseUrl}/auth/user/register`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(config?.tenantId ? { 'X-Tenant-ID': config.tenantId } : {}),\n },\n body: JSON.stringify({\n email,\n password,\n skip_email_verification: true,\n ...(config?.appScope ? { app_scope: config.appScope } : {}),\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n ok: false,\n status: response.status,\n error: errorText,\n };\n }\n\n const data = await response.json();\n return {\n ok: true,\n status: response.status,\n data,\n };\n } catch (error) {\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Registration failed',\n };\n }\n}\n\n/**\n * Authenticate via Google OAuth authorization code.\n * Call this from the /api/auth/google/callback route after receiving the code from Google.\n */\nexport async function googleLogin(\n code: string,\n redirectUri: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ session_token: string; user_id: string; tenant_id?: string; expires_at?: string }>> {\n const baseUrl = config?.baseUrl || DEFAULT_BASE_URL;\n\n try {\n const response = await fetch(`${baseUrl}/auth/google/login`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(config?.tenantId ? { 'X-Tenant-ID': config.tenantId } : {}),\n },\n body: JSON.stringify({ code, redirect_uri: redirectUri }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n return {\n ok: false,\n status: response.status,\n error: errorText,\n };\n }\n\n const data = await response.json();\n return {\n ok: true,\n status: response.status,\n data,\n };\n } catch (error) {\n return {\n ok: false,\n status: 500,\n error: error instanceof Error ? error.message : 'Google login failed',\n };\n }\n}\n\n// =============================================================================\n// User Management Operations\n// =============================================================================\n\n/**\n * List users in the tenant with pagination and filtering\n */\nexport async function listUsers(\n credentials: FlowstackCredentials,\n params?: UserListParams,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<UserListResponse>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n\n // Build query string\n const queryParams = new URLSearchParams();\n if (params?.page) queryParams.set('page', String(params.page));\n if (params?.limit) queryParams.set('limit', String(params.limit));\n if (params?.search) queryParams.set('search', params.search);\n if (params?.role) queryParams.set('role', params.role);\n if (params?.status) queryParams.set('status', params.status);\n if (params?.sortBy) queryParams.set('sort_by', params.sortBy);\n if (params?.sortOrder) queryParams.set('sort_order', params.sortOrder);\n\n const queryString = queryParams.toString();\n const endpoint = `/tenants/${tenantId}/users${queryString ? `?${queryString}` : ''}`;\n\n return flowstackFetch<UserListResponse>(endpoint, { credentials }, config);\n}\n\n/**\n * Get a single user by ID\n */\nexport async function getUser(\n credentials: FlowstackCredentials,\n userId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ user: ManagedUser }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/${userId}`, { credentials }, config);\n}\n\n/**\n * Update a user's profile or role\n */\nexport async function updateUser(\n credentials: FlowstackCredentials,\n userId: string,\n updates: UpdateUserRequest,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ user: ManagedUser }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/${userId}`, {\n method: 'PATCH',\n credentials,\n body: updates,\n }, config);\n}\n\n/**\n * Delete a user permanently\n */\nexport async function deleteUser(\n credentials: FlowstackCredentials,\n userId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/${userId}`, {\n method: 'DELETE',\n credentials,\n }, config);\n}\n\n/**\n * Suspend a user account\n */\nexport async function suspendUser(\n credentials: FlowstackCredentials,\n userId: string,\n reason?: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ user: ManagedUser }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/${userId}/suspend`, {\n method: 'POST',\n credentials,\n body: reason ? { reason } : undefined,\n }, config);\n}\n\n/**\n * Reactivate a suspended user account\n */\nexport async function reactivateUser(\n credentials: FlowstackCredentials,\n userId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ user: ManagedUser }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/${userId}/reactivate`, {\n method: 'POST',\n credentials,\n }, config);\n}\n\n/**\n * Get user activity logs\n */\nexport async function getUserActivity(\n credentials: FlowstackCredentials,\n userId: string,\n limit: number = 50,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ activities: UserActivityLog[] }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/${userId}/activity?limit=${limit}`, {\n credentials,\n }, config);\n}\n\n/**\n * Get user statistics for the tenant\n */\nexport async function getUserStats(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<UserStats>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/stats`, { credentials }, config);\n}\n\n/**\n * Check if the current user has admin permissions to manage users\n */\nexport async function checkAdminPermissions(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ canManageUsers: boolean; role: string }>> {\n const tenantId = credentials.tenantId || config?.tenantId || DEFAULT_TENANT_ID;\n return flowstackFetch(`/tenants/${tenantId}/users/me/permissions`, { credentials }, config);\n}\n\n// =============================================================================\n// Conversation History\n// =============================================================================\n\n/**\n * Get conversation history for a workspace/session\n */\nexport async function getConversationHistory(\n credentials: FlowstackCredentials,\n workspaceId: string,\n options?: { limit?: number; offset?: number },\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ messages: Array<{ role: string; content: string; timestamp: string }> }>> {\n const params = new URLSearchParams();\n params.set('session_id', workspaceId);\n if (options?.limit) params.set('limit', String(options.limit));\n if (options?.offset) params.set('offset', String(options.offset));\n\n return flowstackFetch(\n `/conversations?${params.toString()}`,\n { method: 'GET', credentials },\n config\n );\n}\n\n// =============================================================================\n// Sites — Published websites and CDN management\n// =============================================================================\n\nexport interface CreateSiteParams {\n name: string;\n siteType?: 'on_demand' | 'daily' | 'js_build';\n description?: string;\n files?: Record<string, string>;\n}\n\n/**\n * List all published sites for the current user\n */\nexport async function listSites(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ sites: PublishedSiteInfo[]; count: number }>> {\n return flowstackFetch('/api/v1/sites', { method: 'GET', credentials }, config);\n}\n\n/**\n * Get a single published site by ID\n */\nexport async function getSite(\n credentials: FlowstackCredentials,\n siteId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ site: PublishedSiteInfo }>> {\n return flowstackFetch(`/api/v1/sites/${siteId}`, { method: 'GET', credentials }, config);\n}\n\n/**\n * Create a new site. If files are provided, publishes immediately.\n * Otherwise creates a staging area for incremental file uploads.\n */\nexport async function createSite(\n credentials: FlowstackCredentials,\n params: CreateSiteParams,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ site?: PublishedSiteInfo; site_id?: string; mode?: string }>> {\n return flowstackFetch('/api/v1/sites', {\n method: 'POST',\n credentials,\n body: {\n site_name: params.name,\n site_type: params.siteType || 'on_demand',\n description: params.description,\n files: params.files,\n },\n }, config);\n}\n\n/**\n * Add or update a single file in a site's staging area.\n * Call this for each file, then publishStagedSite() to deploy.\n */\nexport async function addSiteFile(\n credentials: FlowstackCredentials,\n siteId: string,\n filePath: string,\n content: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/files/${filePath}`, {\n method: 'PUT',\n credentials,\n body: { content },\n }, config);\n}\n\n/**\n * Publish a staged site to CDN. Call after adding all files with addSiteFile().\n */\nexport async function publishStagedSite(\n credentials: FlowstackCredentials,\n siteId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ site: PublishedSiteInfo }>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/publish`, {\n method: 'POST',\n credentials,\n }, config);\n}\n\n/**\n * Delete a published site and all its files from CDN\n */\nexport async function deleteSite(\n credentials: FlowstackCredentials,\n siteId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n return flowstackFetch(`/api/v1/sites/${siteId}`, {\n method: 'DELETE',\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Site Versioning\n// =============================================================================\n\nexport async function getSiteVersions(\n credentials: FlowstackCredentials,\n siteId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<SiteVersionManifest>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/versions`, {\n method: 'GET',\n credentials,\n }, config);\n}\n\nexport async function promoteSiteVersion(\n credentials: FlowstackCredentials,\n siteId: string,\n version: number,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<SiteVersionManifest>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/promote`, {\n method: 'POST',\n credentials,\n body: { version },\n }, config);\n}\n\nexport async function deleteSiteVersion(\n credentials: FlowstackCredentials,\n siteId: string,\n version: number,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<SiteVersionManifest>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/versions/${version}`, {\n method: 'DELETE',\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Site Aliases\n// =============================================================================\n\nexport async function setSiteAlias(\n credentials: FlowstackCredentials,\n siteId: string,\n alias: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ alias: string; url: string }>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/alias`, {\n method: 'POST',\n credentials,\n body: { alias },\n }, config);\n}\n\nexport async function removeSiteAlias(\n credentials: FlowstackCredentials,\n siteId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/alias`, {\n method: 'DELETE',\n credentials,\n }, config);\n}\n\n// =============================================================================\n// Publish to GitHub\n// =============================================================================\n\nexport async function publishToGitHub(\n credentials: FlowstackCredentials,\n siteId: string,\n params: PublishToGitHubParams,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<PublishToGitHubResult>> {\n return flowstackFetch(`/api/v1/sites/${siteId}/publish-github`, {\n method: 'POST',\n credentials,\n body: {\n repo_name: params.repoName,\n private: params.isPrivate ?? true,\n ...(params.version != null ? { version: params.version } : {}),\n },\n }, config);\n}\n\n// =============================================================================\n// GitHub Repository Import\n// =============================================================================\n\nexport async function listGitHubRepos(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ repos: GitHubRepo[] }>> {\n return flowstackFetch('/api/v1/github/repos', {\n credentials,\n }, config);\n}\n\nexport async function importFromGitHub(\n credentials: FlowstackCredentials,\n params: { repoFullName: string; branch?: string; workspaceId?: string },\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ files_imported: number }>> {\n return flowstackFetch('/api/v1/github/import', {\n method: 'POST',\n credentials,\n body: params,\n }, config);\n}\n\n// =============================================================================\n// PII Settings\n// =============================================================================\n\nexport async function getPiiSettings(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ settings: PiiSettings }>> {\n return flowstackFetch(`/api/v1/workspaces/${workspaceId}/pii-settings`, {\n credentials,\n }, config);\n}\n\nexport async function updatePiiSettings(\n credentials: FlowstackCredentials,\n workspaceId: string,\n settings: PiiSettings,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean }>> {\n return flowstackFetch(`/api/v1/workspaces/${workspaceId}/pii-settings`, {\n method: 'PUT',\n credentials,\n body: settings,\n }, config);\n}\n\n// P0-57: PII preview — detect entities without masking\nexport async function previewPiiMasking(\n credentials: FlowstackCredentials,\n query: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ entities: PiiRedactedEntity[] }>> {\n // Guard: skip if credentials not yet loaded (prevents \"Not enough segments\" 401 spam\n // when built apps call this on mount before Privy has issued a valid token)\n if (!credentials?.apiKey || credentials.apiKey.split('.').length !== 3) {\n return { ok: false, error: 'Not authenticated', status: 401 };\n }\n return flowstackFetch('/stream/pii-preview', {\n method: 'POST',\n credentials,\n body: { query },\n }, config);\n}\n\n// P0-57: PII allowlist CRUD\nexport async function getPiiAllowlist(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ allowlist: Array<{ term: string; entity_type: string }> }>> {\n return flowstackFetch(`/api/v1/workspaces/${workspaceId}/pii-allowlist`, {\n credentials,\n }, config);\n}\n\nexport async function addPiiAllowlistTerm(\n credentials: FlowstackCredentials,\n workspaceId: string,\n term: string,\n entityType: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean; allowlist: Array<{ term: string; entity_type: string }> }>> {\n return flowstackFetch(`/api/v1/workspaces/${workspaceId}/pii-allowlist`, {\n method: 'POST',\n credentials,\n body: { term, entity_type: entityType },\n }, config);\n}\n\nexport async function removePiiAllowlistTerm(\n credentials: FlowstackCredentials,\n workspaceId: string,\n term: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ success: boolean; allowlist: Array<{ term: string; entity_type: string }> }>> {\n return flowstackFetch(`/api/v1/workspaces/${workspaceId}/pii-allowlist`, {\n method: 'DELETE',\n credentials,\n body: { term },\n }, config);\n}\n\n// =============================================================================\n// User Data Explorer\n// =============================================================================\n\nexport async function getUserDataOverview(\n credentials: FlowstackCredentials,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<UserDataOverview>> {\n return flowstackFetch('/api/v1/user/data-overview', {\n credentials,\n }, config);\n}\n\nexport async function getUserCollections(\n credentials: FlowstackCredentials,\n params?: { siteId?: string; includeSchema?: boolean },\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ collections: UserCollectionInfo[]; grouped_by_site: Record<string, UserCollectionInfo[]> }>> {\n const query = new URLSearchParams();\n if (params?.siteId) query.set('site_id', params.siteId);\n if (params?.includeSchema) query.set('include_schema', 'true');\n const qs = query.toString();\n return flowstackFetch(`/api/v1/user/collections${qs ? `?${qs}` : ''}`, {\n credentials,\n }, config);\n}\n\nexport async function getUserCollectionDocuments<T = Record<string, any>>(\n credentials: FlowstackCredentials,\n collection: string,\n params?: { filter?: Record<string, any>; limit?: number; skip?: number; sort?: Record<string, 1 | -1>; database?: string },\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ documents: T[]; total: number }>> {\n const query = new URLSearchParams();\n if (params?.filter) query.set('filter', JSON.stringify(params.filter));\n if (params?.limit != null) query.set('limit', String(params.limit));\n if (params?.skip != null) query.set('skip', String(params.skip));\n if (params?.sort) query.set('sort', JSON.stringify(params.sort));\n if (params?.database) query.set('database', params.database);\n const qs = query.toString();\n return flowstackFetch(`/api/v1/user/collections/${encodeURIComponent(collection)}/documents${qs ? `?${qs}` : ''}`, {\n credentials,\n }, config);\n}\n\nexport async function getUserCollectionSchema(\n credentials: FlowstackCredentials,\n collection: string,\n params?: { database?: string; sampleSize?: number },\n config?: FlowstackClientConfig\n): Promise<ApiResponse<CollectionSchemaInfo>> {\n const query = new URLSearchParams();\n if (params?.database) query.set('database', params.database);\n if (params?.sampleSize != null) query.set('sample_size', String(params.sampleSize));\n const qs = query.toString();\n return flowstackFetch(`/api/v1/user/collections/${encodeURIComponent(collection)}/schema${qs ? `?${qs}` : ''}`, {\n credentials,\n }, config);\n}\n\nexport async function deleteUserCollection(\n credentials: FlowstackCredentials,\n collection: string,\n config?: FlowstackClientConfig\n): Promise<ApiResponse<{ deleted: boolean; collection: string }>> {\n return flowstackFetch(`/api/v1/user/collections/${encodeURIComponent(collection)}?confirm=true`, {\n method: 'DELETE',\n credentials,\n }, config);\n}\n\nexport async function exportUserCollection(\n credentials: FlowstackCredentials,\n collection: string,\n params?: { format?: 'json' | 'csv'; filter?: Record<string, any>; database?: string },\n config?: FlowstackClientConfig\n): Promise<ApiResponse<Blob>> {\n const query = new URLSearchParams();\n if (params?.database) query.set('database', params.database);\n const qs = query.toString();\n return flowstackFetch(`/api/v1/user/collections/${encodeURIComponent(collection)}/export${qs ? `?${qs}` : ''}`, {\n method: 'POST',\n credentials,\n body: {\n format: params?.format || 'json',\n filter: params?.filter || null,\n },\n }, config);\n}\n","/**\n * Storage utilities for credential and state persistence\n * Supports both localStorage and sessionStorage with user-scoped isolation\n */\n\nimport type { FlowstackCredentials } from '../types';\n\n// Storage key constants\nconst CREDENTIALS_KEY = 'flowstack_credentials';\nconst WORKSPACE_KEY = 'flowstack_workspace';\nconst MESSAGES_KEY = 'flowstack_messages';\n\n/**\n * Get the storage adapter (localStorage or sessionStorage)\n * @param type - Storage type ('local' or 'session')\n * @returns Storage object or null if not available\n */\nfunction getStorage(type: 'local' | 'session' = 'local'): Storage | null {\n if (typeof window === 'undefined') return null;\n\n try {\n const storage = type === 'local' ? window.localStorage : window.sessionStorage;\n // Test if storage is accessible\n storage.setItem('__test__', '__test__');\n storage.removeItem('__test__');\n return storage;\n } catch {\n console.warn(`[Storage] ${type}Storage not available`);\n return null;\n }\n}\n\n/**\n * Extract user ID from credentials for storage isolation\n * @param credentials - User credentials\n * @returns User-specific storage key prefix\n */\nfunction getUserPrefix(credentials: FlowstackCredentials | null): string {\n if (!credentials?.userId) return '';\n return `${credentials.userId.substring(0, 16)}:`;\n}\n\n/**\n * Get user-scoped storage key\n * @param baseKey - Base key name\n * @param credentials - User credentials for scoping\n * @returns Scoped storage key\n */\nfunction getScopedKey(baseKey: string, credentials: FlowstackCredentials | null): string {\n return `${getUserPrefix(credentials)}${baseKey}`;\n}\n\n// =============================================================================\n// Credentials Storage\n// =============================================================================\n\n/**\n * Save credentials to storage\n * @param credentials - Credentials to save\n * @param storageType - Storage type ('local' or 'session')\n */\nexport function saveCredentials(\n credentials: FlowstackCredentials,\n storageType: 'local' | 'session' = 'local'\n): void {\n const storage = getStorage(storageType);\n if (!storage) return;\n\n try {\n storage.setItem(CREDENTIALS_KEY, JSON.stringify(credentials));\n } catch (error) {\n console.error('[Storage] Failed to save credentials:', error);\n }\n}\n\n/**\n * Load credentials from storage\n * @param storageType - Storage type ('local' or 'session')\n * @returns Stored credentials or null\n */\nexport function loadCredentials(\n storageType: 'local' | 'session' = 'local'\n): FlowstackCredentials | null {\n const storage = getStorage(storageType);\n if (!storage) return null;\n\n try {\n const stored = storage.getItem(CREDENTIALS_KEY);\n if (!stored) return null;\n\n const credentials = JSON.parse(stored) as FlowstackCredentials;\n\n // Check if expired\n if (credentials.expiresAt) {\n const expiresAt = new Date(credentials.expiresAt);\n if (expiresAt < new Date()) {\n console.log('[Storage] Credentials expired, clearing');\n clearCredentials(storageType);\n return null;\n }\n }\n\n return credentials;\n } catch (error) {\n console.error('[Storage] Failed to load credentials:', error);\n return null;\n }\n}\n\n/**\n * Clear credentials from storage\n * @param storageType - Storage type ('local' or 'session')\n */\nexport function clearCredentials(storageType: 'local' | 'session' = 'local'): void {\n const storage = getStorage(storageType);\n if (!storage) return;\n\n try {\n storage.removeItem(CREDENTIALS_KEY);\n } catch (error) {\n console.error('[Storage] Failed to clear credentials:', error);\n }\n}\n\n// =============================================================================\n// Workspace Storage\n// =============================================================================\n\n/**\n * Save selected workspace ID to storage\n * @param workspaceId - Workspace ID to save\n * @param credentials - User credentials for scoping\n * @param storageType - Storage type\n */\nexport function saveSelectedWorkspace(\n workspaceId: string,\n credentials: FlowstackCredentials | null,\n storageType: 'local' | 'session' = 'local'\n): void {\n const storage = getStorage(storageType);\n if (!storage) return;\n\n try {\n const key = getScopedKey(WORKSPACE_KEY, credentials);\n storage.setItem(key, workspaceId);\n } catch (error) {\n console.error('[Storage] Failed to save workspace:', error);\n }\n}\n\n/**\n * Load selected workspace ID from storage\n * @param credentials - User credentials for scoping\n * @param storageType - Storage type\n * @returns Workspace ID or null\n */\nexport function loadSelectedWorkspace(\n credentials: FlowstackCredentials | null,\n storageType: 'local' | 'session' = 'local'\n): string | null {\n const storage = getStorage(storageType);\n if (!storage) return null;\n\n try {\n const key = getScopedKey(WORKSPACE_KEY, credentials);\n return storage.getItem(key);\n } catch (error) {\n console.error('[Storage] Failed to load workspace:', error);\n return null;\n }\n}\n\n/**\n * Clear selected workspace from storage\n * @param credentials - User credentials for scoping\n * @param storageType - Storage type\n */\nexport function clearSelectedWorkspace(\n credentials: FlowstackCredentials | null,\n storageType: 'local' | 'session' = 'local'\n): void {\n const storage = getStorage(storageType);\n if (!storage) return;\n\n try {\n const key = getScopedKey(WORKSPACE_KEY, credentials);\n storage.removeItem(key);\n } catch (error) {\n console.error('[Storage] Failed to clear workspace:', error);\n }\n}\n\n// =============================================================================\n// Messages Storage (optional persistence)\n// =============================================================================\n\n/**\n * Save chat messages to storage\n * @param messages - Messages to save\n * @param workspaceId - Workspace ID for scoping\n * @param credentials - User credentials for scoping\n * @param storageType - Storage type\n */\nexport function saveMessages<T>(\n messages: T[],\n workspaceId: string,\n credentials: FlowstackCredentials | null,\n storageType: 'local' | 'session' = 'session'\n): void {\n const storage = getStorage(storageType);\n if (!storage) return;\n\n try {\n const key = getScopedKey(`${MESSAGES_KEY}:${workspaceId}`, credentials);\n const data = JSON.stringify(messages);\n try {\n storage.setItem(key, data);\n } catch (quotaError) {\n // Storage full — keep only the last 20 messages and retry\n if (messages.length > 20) {\n const trimmed = messages.slice(-20);\n storage.setItem(key, JSON.stringify(trimmed));\n } else {\n // Can't trim further — clear all flowstack storage and retry\n for (let i = storage.length - 1; i >= 0; i--) {\n const k = storage.key(i);\n if (k && k.includes('flowstack')) storage.removeItem(k);\n }\n storage.setItem(key, data);\n }\n }\n } catch (error) {\n // Silently fail — storage is best-effort for the web demo\n }\n}\n\n/**\n * Load chat messages from storage\n * @param workspaceId - Workspace ID for scoping\n * @param credentials - User credentials for scoping\n * @param storageType - Storage type\n * @returns Messages array or empty array\n */\nexport function loadMessages<T>(\n workspaceId: string,\n credentials: FlowstackCredentials | null,\n storageType: 'local' | 'session' = 'session'\n): T[] {\n const storage = getStorage(storageType);\n if (!storage) return [];\n\n try {\n const key = getScopedKey(`${MESSAGES_KEY}:${workspaceId}`, credentials);\n const stored = storage.getItem(key);\n return stored ? JSON.parse(stored) : [];\n } catch (error) {\n console.error('[Storage] Failed to load messages:', error);\n return [];\n }\n}\n\n/**\n * Clear chat messages from storage\n * @param workspaceId - Workspace ID for scoping\n * @param credentials - User credentials for scoping\n * @param storageType - Storage type\n */\nexport function clearMessages(\n workspaceId: string,\n credentials: FlowstackCredentials | null,\n storageType: 'local' | 'session' = 'session'\n): void {\n const storage = getStorage(storageType);\n if (!storage) return;\n\n try {\n const key = getScopedKey(`${MESSAGES_KEY}:${workspaceId}`, credentials);\n storage.removeItem(key);\n } catch (error) {\n console.error('[Storage] Failed to clear messages:', error);\n }\n}\n\n// =============================================================================\n// Generic Storage Utilities\n// =============================================================================\n\n/**\n * Set an item in storage with optional expiry\n * @param key - Storage key\n * @param value - Value to store\n * @param ttlMs - Time to live in milliseconds (optional)\n * @param storageType - Storage type\n */\nexport function setItem<T>(\n key: string,\n value: T,\n ttlMs?: number,\n storageType: 'local' | 'session' = 'local'\n): void {\n const storage = getStorage(storageType);\n if (!storage) return;\n\n try {\n const item = ttlMs\n ? { value, expiresAt: Date.now() + ttlMs }\n : { value };\n storage.setItem(key, JSON.stringify(item));\n } catch (error) {\n console.error(`[Storage] Failed to set ${key}:`, error);\n }\n}\n\n/**\n * Get an item from storage\n * @param key - Storage key\n * @param storageType - Storage type\n * @returns Stored value or null\n */\nexport function getItem<T>(\n key: string,\n storageType: 'local' | 'session' = 'local'\n): T | null {\n const storage = getStorage(storageType);\n if (!storage) return null;\n\n try {\n const stored = storage.getItem(key);\n if (!stored) return null;\n\n const item = JSON.parse(stored) as { value: T; expiresAt?: number };\n\n // Check expiry\n if (item.expiresAt && Date.now() > item.expiresAt) {\n storage.removeItem(key);\n return null;\n }\n\n return item.value;\n } catch (error) {\n console.error(`[Storage] Failed to get ${key}:`, error);\n return null;\n }\n}\n\n/**\n * Remove an item from storage\n * @param key - Storage key\n * @param storageType - Storage type\n */\nexport function removeItem(key: string, storageType: 'local' | 'session' = 'local'): void {\n const storage = getStorage(storageType);\n if (!storage) return;\n\n try {\n storage.removeItem(key);\n } catch (error) {\n console.error(`[Storage] Failed to remove ${key}:`, error);\n }\n}\n\n/**\n * Clear all Flowstack-related items from storage. P0-72: also clears\n * `privy:*` keys as a belt-and-suspenders sweep so a logout always leaves\n * a clean slate for the next login attempt — even if Privy's own\n * `logout()` call missed a key. Without this, a Flowstack-only clear\n * left Privy's sticky session in place and silently re-authed the\n * same wallet on the next click.\n * @param storageType - Storage type\n */\nexport function clearAllFlowstackData(storageType: 'local' | 'session' = 'local'): void {\n const storage = getStorage(storageType);\n if (!storage) return;\n\n try {\n const keysToRemove: string[] = [];\n for (let i = 0; i < storage.length; i++) {\n const key = storage.key(i);\n if (key?.startsWith('flowstack_') || key?.startsWith('privy:')) {\n keysToRemove.push(key);\n }\n }\n keysToRemove.forEach(key => storage.removeItem(key));\n } catch (error) {\n console.error('[Storage] Failed to clear all data:', error);\n }\n}\n","/**\n * Mock Fixtures for Development Mode\n *\n * Provides realistic test data for development without a backend.\n */\n\nimport type {\n FlowstackCredentials,\n WorkspaceInfo,\n DatasetInfo,\n VisualizationData,\n ChatMessage,\n DataSource,\n User,\n ManagedUser,\n UserStats,\n UserActivityLog,\n} from '../types';\n\n/**\n * Mock user credentials\n */\nexport const mockCredentials: FlowstackCredentials = {\n apiKey: 'mock_session_token_abc123',\n tenantId: 't_mock_tenant',\n userId: 'user_mock_123',\n email: 'demo@example.com',\n expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),\n};\n\n/**\n * Mock user derived from credentials\n */\nexport const mockUser: User = {\n id: 'user_mock_123',\n email: 'demo@example.com',\n tenantId: 't_mock_tenant',\n expiresAt: mockCredentials.expiresAt,\n};\n\n/**\n * Mock workspaces\n */\nexport const mockWorkspaces: WorkspaceInfo[] = [\n {\n workspaceId: 'ws_demo_1',\n name: 'Demo Workspace',\n description: 'A demo workspace for testing',\n datasetCount: 3,\n visualizationCount: 5,\n modelCount: 1,\n createdAt: '2024-01-15T10:00:00Z',\n lastAccessed: new Date().toISOString(),\n },\n {\n workspaceId: 'ws_analytics',\n name: 'Analytics Project',\n description: 'Customer analytics and insights',\n datasetCount: 7,\n visualizationCount: 12,\n modelCount: 2,\n createdAt: '2024-02-20T14:30:00Z',\n lastAccessed: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString(),\n },\n {\n workspaceId: 'ws_ml_project',\n name: 'ML Experiments',\n description: 'Machine learning model experiments',\n datasetCount: 5,\n visualizationCount: 8,\n modelCount: 4,\n createdAt: '2024-03-10T09:15:00Z',\n lastAccessed: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(),\n },\n];\n\n/**\n * Mock datasets\n */\nexport const mockDatasets: DatasetInfo[] = [\n {\n id: 'ds_customers',\n name: 'customers',\n rows: 10000,\n columns: 12,\n columnNames: ['id', 'name', 'email', 'created_at', 'country', 'segment', 'revenue', 'orders', 'last_order', 'lifetime_value', 'churn_risk', 'status'],\n schema: {\n id: { type: 'string', nullable: false, unique: true },\n name: { type: 'string', nullable: false },\n email: { type: 'string', nullable: false },\n created_at: { type: 'date', nullable: false },\n country: { type: 'string', nullable: true },\n segment: { type: 'string', nullable: true },\n revenue: { type: 'number', nullable: false },\n orders: { type: 'number', nullable: false },\n last_order: { type: 'date', nullable: true },\n lifetime_value: { type: 'number', nullable: false },\n churn_risk: { type: 'number', nullable: true },\n status: { type: 'string', nullable: false },\n },\n createdAt: '2024-01-15T10:30:00Z',\n updatedAt: '2024-03-15T08:00:00Z',\n },\n {\n id: 'ds_orders',\n name: 'orders',\n rows: 50000,\n columns: 8,\n columnNames: ['order_id', 'customer_id', 'order_date', 'total', 'status', 'items', 'shipping_country', 'payment_method'],\n createdAt: '2024-01-20T11:00:00Z',\n updatedAt: '2024-03-14T16:45:00Z',\n },\n {\n id: 'ds_products',\n name: 'products',\n rows: 500,\n columns: 10,\n columnNames: ['product_id', 'name', 'category', 'price', 'cost', 'stock', 'rating', 'reviews', 'created_at', 'is_active'],\n createdAt: '2024-02-01T09:00:00Z',\n updatedAt: '2024-03-10T14:20:00Z',\n },\n];\n\n/**\n * Mock visualizations\n */\nexport const mockVisualizations: VisualizationData[] = [\n {\n name: 'Revenue by Month',\n type: 'line_chart',\n format: 'png',\n createdAt: '2024-03-15T10:00:00Z',\n metadata: { xAxis: 'month', yAxis: 'revenue' },\n },\n {\n name: 'Customer Segments',\n type: 'pie_chart',\n format: 'png',\n createdAt: '2024-03-14T15:30:00Z',\n metadata: { dimension: 'segment', measure: 'count' },\n },\n {\n name: 'Orders Heatmap',\n type: 'heatmap',\n format: 'png',\n createdAt: '2024-03-13T11:45:00Z',\n metadata: { xAxis: 'day_of_week', yAxis: 'hour' },\n },\n];\n\n/**\n * Mock data sources\n */\nexport const mockDataSources: DataSource[] = [\n {\n source_id: 'src_mongodb_1',\n tenant_id: 't_mock_tenant',\n source_type: 'mongodb',\n name: 'Production MongoDB',\n auth_method: 'connection_string',\n is_tenant_wide: true,\n created_at: Date.now() - 30 * 24 * 60 * 60 * 1000,\n credentials_preview: { host: 'mongodb.example.com', database: 'production' },\n },\n {\n source_id: 'src_postgres_1',\n tenant_id: 't_mock_tenant',\n source_type: 'postgresql',\n name: 'Analytics Database',\n auth_method: 'connection_string',\n is_tenant_wide: false,\n user_id: 'user_mock_123',\n created_at: Date.now() - 14 * 24 * 60 * 60 * 1000,\n credentials_preview: { host: 'pg.example.com', database: 'analytics' },\n },\n];\n\n/**\n * Mock chat messages (for demo)\n */\nexport const mockChatHistory: ChatMessage[] = [\n {\n id: 'msg_1',\n role: 'user',\n content: 'What are my top customers by revenue?',\n timestamp: new Date(Date.now() - 5 * 60 * 1000),\n },\n {\n id: 'msg_2',\n role: 'assistant',\n content: 'I analyzed the customers dataset and found your top 10 customers by revenue. Here are the results:\\n\\n1. Acme Corp - $125,000\\n2. TechStart Inc - $98,500\\n3. Global Retail - $87,200\\n...',\n timestamp: new Date(Date.now() - 4 * 60 * 1000),\n toolCalls: [\n {\n id: 'tool_1',\n name: 'query_dataset',\n args: { dataset: 'customers', query: 'SELECT * FROM customers ORDER BY revenue DESC LIMIT 10' },\n result: { rows: 10 },\n status: 'complete',\n },\n ],\n },\n];\n\n/**\n * Generate a unique ID for mock data\n */\nexport function generateMockId(prefix: string = 'mock'): string {\n return `${prefix}_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Simulate network delay for realistic mock responses\n */\nexport function mockDelay(minMs: number = 100, maxMs: number = 500): Promise<void> {\n const delay = Math.random() * (maxMs - minMs) + minMs;\n return new Promise((resolve) => setTimeout(resolve, delay));\n}\n\n// =============================================================================\n// User Management Mock Data\n// =============================================================================\n\n/**\n * Mock managed users for admin dashboard\n */\nexport const mockManagedUsers: ManagedUser[] = [\n {\n id: 'user_mock_123',\n email: 'demo@example.com',\n name: 'Demo User',\n role: 'owner',\n status: 'active',\n tenantId: 't_mock_tenant',\n createdAt: '2024-01-01T10:00:00Z',\n lastLoginAt: new Date().toISOString(),\n lastActivityAt: new Date().toISOString(),\n metadata: { plan: 'pro', company: 'Demo Inc' },\n },\n {\n id: 'user_admin_456',\n email: 'admin@example.com',\n name: 'Admin User',\n role: 'admin',\n status: 'active',\n tenantId: 't_mock_tenant',\n createdAt: '2024-01-15T14:30:00Z',\n lastLoginAt: new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString(),\n lastActivityAt: new Date(Date.now() - 30 * 60 * 1000).toISOString(),\n },\n {\n id: 'user_member_789',\n email: 'member@example.com',\n name: 'Team Member',\n role: 'member',\n status: 'active',\n tenantId: 't_mock_tenant',\n createdAt: '2024-02-10T09:00:00Z',\n lastLoginAt: new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString(),\n lastActivityAt: new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString(),\n },\n {\n id: 'user_suspended_101',\n email: 'suspended@example.com',\n name: 'Suspended User',\n role: 'member',\n status: 'suspended',\n tenantId: 't_mock_tenant',\n createdAt: '2024-02-20T11:00:00Z',\n lastLoginAt: '2024-03-01T08:00:00Z',\n metadata: { suspendReason: 'Policy violation' },\n },\n {\n id: 'user_pending_102',\n email: 'pending@example.com',\n name: 'New User',\n role: 'viewer',\n status: 'pending_verification',\n tenantId: 't_mock_tenant',\n createdAt: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString(),\n },\n];\n\n/**\n * Mock user statistics\n */\nexport const mockUserStats: UserStats = {\n totalUsers: 127,\n activeUsers: 98,\n usersByRole: {\n owner: 1,\n admin: 5,\n member: 85,\n viewer: 36,\n },\n usersByStatus: {\n active: 98,\n suspended: 8,\n pending_verification: 15,\n deactivated: 6,\n },\n newUsersThisMonth: 23,\n dailyActiveUsers: [45, 52, 48, 61, 55, 43, 38, 67, 72, 58, 63, 71, 65, 54],\n};\n\n/**\n * Mock user activity logs\n */\nexport const mockUserActivity: UserActivityLog[] = [\n {\n id: 'act_1',\n userId: 'user_mock_123',\n activityType: 'login',\n description: 'Logged in from Chrome on macOS',\n timestamp: new Date().toISOString(),\n },\n {\n id: 'act_2',\n userId: 'user_mock_123',\n activityType: 'query_execute',\n description: 'Executed query: \"Show top customers\"',\n timestamp: new Date(Date.now() - 30 * 60 * 1000).toISOString(),\n resourceType: 'workspace',\n resourceId: 'ws_demo_1',\n },\n {\n id: 'act_3',\n userId: 'user_mock_123',\n activityType: 'dataset_upload',\n description: 'Uploaded dataset: sales_data.csv',\n timestamp: new Date(Date.now() - 60 * 60 * 1000).toISOString(),\n resourceType: 'dataset',\n resourceId: 'ds_sales',\n },\n {\n id: 'act_4',\n userId: 'user_mock_123',\n activityType: 'workspace_create',\n description: 'Created workspace: Analytics Project',\n timestamp: new Date(Date.now() - 2 * 60 * 60 * 1000).toISOString(),\n resourceType: 'workspace',\n resourceId: 'ws_analytics',\n },\n {\n id: 'act_5',\n userId: 'user_mock_123',\n activityType: 'logout',\n description: 'Logged out',\n timestamp: new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString(),\n },\n];\n","'use client';\n\n/**\n * Flowstack SDK Provider\n *\n * Main context provider that manages all SDK state including:\n * - Authentication (credentials, session)\n * - Workspaces (list, selection, creation)\n * - Chat messages with persistence\n * - Datasets, visualizations, reports, models\n * - Query execution state\n */\n\nimport React, {\n createContext,\n useContext,\n useState,\n useCallback,\n useEffect,\n ReactNode,\n} from 'react';\n\nimport type {\n FlowstackConfig,\n FlowstackCredentials,\n FlowstackContextValue,\n ChatMessage,\n WorkspaceInfo,\n DatasetInfo,\n VisualizationData,\n ReportInfo,\n ModelInfo,\n ScriptInfo,\n SessionState,\n} from '../types';\n\nimport {\n listWorkspaces,\n createWorkspace as apiCreateWorkspace,\n listDatasets,\n listVisualizations,\n listReports,\n listModels,\n listScripts,\n} from '../api/client';\n\nimport {\n saveCredentials,\n loadCredentials,\n clearCredentials,\n saveSelectedWorkspace,\n loadSelectedWorkspace,\n clearSelectedWorkspace,\n saveMessages,\n loadMessages,\n clearMessages as clearStoredMessages,\n clearAllFlowstackData,\n} from '../utils/storage';\n\nimport {\n mockCredentials,\n mockWorkspaces,\n mockDatasets,\n mockVisualizations,\n mockDelay,\n generateMockId,\n} from '../mock/fixtures';\n\n// Default configuration\nconst DEFAULT_BASE_URL = 'https://sage-api.flowstack.fun';\n// NOTE: there is intentionally no DEFAULT_TENANT_ID. For authenticated calls the\n// backend derives tenant_id from the JWT/API key and ignores any client-sent\n// X-Tenant-ID, so a default is pointless there. The only case that needs an\n// explicit tenant is anonymous access (usePublicCollection) — and silently\n// defaulting that to a real platform tenant would route a misconfigured app's\n// public data into the wrong pool. So tenant is JWT-derived or explicitly set.\n\n/**\n * Normalize workspace object from backend (snake_case) to SDK (camelCase).\n * The backend returns workspace_id, dataset_count, etc. but the SDK type expects camelCase.\n */\nfunction normalizeWorkspace(ws: any): WorkspaceInfo {\n return {\n workspaceId: ws.workspaceId || ws.workspace_id || ws.id || '',\n name: ws.name || '',\n description: ws.description,\n datasetCount: ws.datasetCount ?? ws.dataset_count ?? 0,\n visualizationCount: ws.visualizationCount ?? ws.visualization_count ?? 0,\n modelCount: ws.modelCount ?? ws.model_count ?? 0,\n createdAt: ws.createdAt || ws.created_at || '',\n lastAccessed: ws.lastAccessed || ws.last_accessed || '',\n };\n}\n\n/** Check if a URL is a valid presigned S3 URL (not raw/unsigned). */\nfunction isPresignedUrl(url?: string): boolean {\n return !!url && url.includes('X-Amz-');\n}\n\n/** Normalize visualization object from backend snake_case to SDK camelCase. */\nfunction normalizeVisualization(v: any): VisualizationData {\n const meta = v.metadata || {};\n // Presigned URLs first — they have auth. Unsigned S3 URLs will AccessDenied.\n const imageUrl =\n v.presigned_url || meta.presigned_url ||\n v.imageUrl || v.image_url ||\n (v.url && !v.url.includes('s3.amazonaws.com') ? v.url : undefined) ||\n (meta.url && !meta.url.includes('s3.amazonaws.com') ? meta.url : undefined) ||\n meta.image_url ||\n undefined;\n return {\n name: v.name || '',\n type: v.type || v.visualization_type || v.chart_type || meta.chart_type,\n imageUrl,\n imageBase64: v.imageBase64 || v.image_base64 || meta.image_base64,\n format: v.format || meta.format,\n createdAt: v.createdAt || v.created_at || meta.created_at,\n metadata: v.metadata,\n };\n}\n\n/** Normalize dataset object from backend to SDK format. */\nfunction normalizeDataset(d: any): DatasetInfo {\n // Backend returns shape: [rows, cols] and columns: [\"col1\", \"col2\", ...]\n const shape = d.shape || [];\n const colArray = Array.isArray(d.columns) ? d.columns : d.column_names || d.columns_list || [];\n const rowCount = d.rows ?? d.row_count ?? d.num_rows ?? d.size ?? (shape[0] || 0);\n const colCount = typeof d.columns === 'number' ? d.columns : (d.column_count ?? d.num_columns ?? shape[1] ?? colArray.length ?? 0);\n return {\n ...d,\n id: d.id || d.dataset_id,\n name: d.name || d.dataset_name || '',\n rows: rowCount,\n columns: colCount,\n columnNames: colArray,\n createdAt: d.createdAt || d.created_at,\n fileSize: d.fileSize || d.file_size || d.size,\n schema: d.schema || d.dtypes,\n };\n}\n\n// Context instance\nconst FlowstackContext = createContext<FlowstackContextValue | null>(null);\n\n/**\n * Extract user ID from JWT or API key\n */\nfunction extractUserId(apiKey: string): string {\n try {\n // JWT token - extract from payload\n if (apiKey.includes('.')) {\n const parts = apiKey.split('.');\n if (parts.length === 3) {\n try {\n const payload = JSON.parse(atob(parts[1]));\n if (payload.user_id) return String(payload.user_id);\n } catch {\n // JWT decode failed\n }\n }\n }\n\n // Legacy API key format\n if (apiKey.startsWith('sage_t_')) {\n return apiKey.substring(7, 23);\n } else if (apiKey.startsWith('sage_')) {\n return apiKey.substring(5, 21);\n }\n\n // Fallback\n return apiKey.substring(0, 16);\n } catch {\n return apiKey.substring(0, 16);\n }\n}\n\n/**\n * Derive tenant_id from a JWT's payload (browser-safe, no jsonwebtoken dep).\n * Returns undefined when it can't be derived — callers fall back to an explicitly\n * configured tenantId, never to a hardcoded platform tenant.\n */\nfunction extractTenantId(apiKey?: string | null): string | undefined {\n if (!apiKey || !apiKey.includes('.')) return undefined;\n try {\n const parts = apiKey.split('.');\n if (parts.length === 3) {\n const payload = JSON.parse(atob(parts[1]));\n if (payload.tenant_id) return String(payload.tenant_id);\n }\n } catch {\n // not a decodable JWT — caller falls back to configured tenantId\n }\n return undefined;\n}\n\n/**\n * Check if credentials are expired\n */\nfunction isExpired(credentials: FlowstackCredentials): boolean {\n if (!credentials.expiresAt) {\n // Try to extract from JWT\n if (credentials.apiKey.includes('.')) {\n try {\n const parts = credentials.apiKey.split('.');\n const payload = JSON.parse(atob(parts[1]));\n if (payload.exp) {\n return Date.now() > payload.exp * 1000;\n }\n } catch {\n return false;\n }\n }\n return false;\n }\n\n const expiresAt = new Date(credentials.expiresAt);\n return expiresAt < new Date();\n}\n\n/**\n * FlowstackProvider Props\n */\ninterface FlowstackProviderProps {\n children: ReactNode;\n config: FlowstackConfig;\n /**\n * P0-72: Optional Privy auth state passed from the parent. When provided,\n * FlowstackProvider cross-validates stored credentials against Privy on\n * mount — if Privy says \"not authenticated\", stale Flowstack creds are\n * cleared instead of blindly hydrated. This eliminates the 4-minute 401\n * request storm on cold load when Privy's session is absent but\n * sessionStorage still has `flowstack_credentials`.\n *\n * When omitted (e.g., SIWE-only mode, tests), the provider falls back\n * to the legacy behavior of trusting sessionStorage.\n */\n privyAuthState?: {\n ready: boolean;\n authenticated: boolean;\n };\n}\n\n/**\n * Flowstack Provider Component\n *\n * Wrap your app with this provider to enable all Flowstack SDK features.\n *\n * @example\n * ```tsx\n * <FlowstackProvider config={{ jwtSecret: process.env.JWT_SECRET! }}>\n * <App />\n * </FlowstackProvider>\n * ```\n */\nexport function FlowstackProvider({\n children,\n config,\n privyAuthState,\n}: FlowstackProviderProps) {\n // Configuration\n const baseUrl = config.baseUrl || DEFAULT_BASE_URL;\n // Empty string (not a real tenant) when unset — authenticated calls ignore the\n // X-Tenant-ID header (backend uses the JWT), and usePublicCollection hard-errors\n // on an empty tenant rather than silently using a platform default.\n const tenantId = config.tenantId || '';\n const isMockMode = config.mode === 'mock';\n\n // Auth state\n const [credentials, setCredentialsState] = useState<FlowstackCredentials | null>(null);\n const [isInitialized, setIsInitialized] = useState(false);\n\n // Session state\n const [session, setSession] = useState<SessionState>({\n sessionId: null,\n workspaceId: null,\n isConnected: false,\n lastActivity: null,\n });\n\n // Workspaces state\n const [workspaces, setWorkspaces] = useState<WorkspaceInfo[]>([]);\n const [selectedWorkspace, setSelectedWorkspaceState] = useState<WorkspaceInfo | null>(null);\n const [isLoadingWorkspaces, setIsLoadingWorkspaces] = useState(false);\n\n // Chat state\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n\n // Query state\n const [isQueryRunning, setIsQueryRunning] = useState(false);\n const [queryStartTime, setQueryStartTime] = useState<number | null>(null);\n\n // Data state\n const [datasets, setDatasetsState] = useState<DatasetInfo[]>([]);\n const [isLoadingDatasets, setIsLoadingDatasets] = useState(false);\n\n const [visualizations, setVisualizationsState] = useState<VisualizationData[]>([]);\n const [isLoadingVisualizations, setIsLoadingVisualizations] = useState(false);\n\n const [reports, setReportsState] = useState<ReportInfo[]>([]);\n const [isLoadingReports, setIsLoadingReports] = useState(false);\n\n const [models, setModelsState] = useState<ModelInfo[]>([]);\n const [isLoadingModels, setIsLoadingModels] = useState(false);\n\n const [scripts, setScriptsState] = useState<ScriptInfo[]>([]);\n const [isLoadingScripts, setIsLoadingScripts] = useState(false);\n\n // UI state\n const [isSidebarOpen, setSidebarOpen] = useState(true);\n const [activeTab, setActiveTab] = useState<'chat' | 'datasets' | 'visualizations' | 'reports' | 'models'>('chat');\n\n // Build client config for API calls\n const clientConfig = { baseUrl, tenantId };\n\n // =============================================================================\n // Authentication\n // =============================================================================\n\n // Load credentials on mount — with P0-72 Privy cross-validation.\n //\n // Legacy behavior (no privyAuthState prop):\n // Trust sessionStorage. Hydrate whatever's there if not expired.\n //\n // P0-72 behavior (privyAuthState passed):\n // Wait for `ready`, then hydrate only if Privy agrees the user is\n // authenticated. If sessionStorage has creds but Privy says no,\n // clear the stale creds instead of firing authenticated API\n // requests into a 401 storm.\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n // Gate on Privy being ready when caller opted into cross-validation.\n if (privyAuthState && !privyAuthState.ready) {\n return;\n }\n\n const stored = loadCredentials('session');\n if (!stored) {\n setIsInitialized(true);\n return;\n }\n\n if (isExpired(stored)) {\n clearCredentials('session');\n setIsInitialized(true);\n return;\n }\n\n // app_scope cross-check: if this provider is configured with an appScope\n // (a built app), the stored JWT must carry a matching claim. A JWT issued\n // from the main Casino login (app_scope=null) silently bypasses all\n // collection guards and loads the full platform orchestrator instead of\n // the app's custom agent. Same logic as the broker fix for the Privy path.\n if (config.appScope) {\n try {\n const _parts = stored.apiKey.split('.');\n const _payload = JSON.parse(atob(_parts[1]));\n const _tokenScope: string | null = _payload.app_scope ?? null;\n if (_tokenScope !== config.appScope) {\n clearCredentials('session');\n clearAllFlowstackData('session');\n setIsInitialized(true);\n return;\n }\n } catch {\n // Malformed JWT — clear and force re-auth.\n clearCredentials('session');\n setIsInitialized(true);\n return;\n }\n }\n\n // P0-72 cross-check: Privy is the source of truth for \"is this user\n // authenticated.\" If sessionStorage disagrees, trust Privy and clear\n // the stale Flowstack creds.\n if (privyAuthState && !privyAuthState.authenticated) {\n console.log('[FlowstackProvider] Privy session absent, clearing stale credentials');\n clearCredentials('session');\n clearAllFlowstackData('session');\n setIsInitialized(true);\n return;\n }\n\n // Both storage and (optionally) Privy agree — hydrate.\n setCredentialsState(stored);\n const workspaceId = loadSelectedWorkspace(stored, 'local');\n if (workspaceId) {\n setSession(prev => ({\n ...prev,\n sessionId: workspaceId,\n workspaceId,\n isConnected: true,\n }));\n }\n setIsInitialized(true);\n }, [privyAuthState?.ready, privyAuthState?.authenticated]);\n\n // Set credentials handler\n const setCredentials = useCallback((creds: FlowstackCredentials | null) => {\n setCredentialsState(creds);\n if (creds) {\n // Resolve tenant: explicit on the creds, else derive from the JWT, else the\n // configured tenantId. No hardcoded platform default.\n const credsWithTenant = {\n ...creds,\n tenantId: creds.tenantId || extractTenantId(creds.apiKey) || tenantId,\n };\n saveCredentials(credsWithTenant, 'session');\n } else {\n clearCredentials('session');\n }\n }, [tenantId]);\n\n // Logout handler\n const logout = useCallback(() => {\n if (credentials) {\n // Clear workspace selection\n clearSelectedWorkspace(credentials, 'local');\n\n // Clear messages for current workspace\n if (session.workspaceId) {\n clearStoredMessages(session.workspaceId, credentials, 'session');\n }\n }\n\n // Clear all Flowstack data\n clearAllFlowstackData('local');\n clearAllFlowstackData('session');\n\n // One-shot marker (set AFTER the clears so it survives): tells the next\n // BrokeredLoginButton click to pass force_login=1, so the broker purges its\n // sticky Privy/Casino session and the user can sign in with a DIFFERENT\n // account. Without this, brokered re-login silently returns the same identity.\n try {\n if (typeof window !== 'undefined') {\n window.localStorage.setItem('flowstack:force_relogin', '1');\n }\n } catch { /* storage unavailable — non-fatal */ }\n\n // Reset state\n setCredentialsState(null);\n setWorkspaces([]);\n setSelectedWorkspaceState(null);\n setMessages([]);\n setDatasetsState([]);\n setVisualizationsState([]);\n setReportsState([]);\n setModelsState([]);\n setSession({\n sessionId: null,\n workspaceId: null,\n isConnected: false,\n lastActivity: null,\n });\n }, [credentials, session.workspaceId]);\n\n // =============================================================================\n // Workspace Management\n // =============================================================================\n\n // Refresh workspaces\n const refreshWorkspaces = useCallback(async () => {\n if (!credentials && !isMockMode) return;\n\n setIsLoadingWorkspaces(true);\n try {\n if (isMockMode) {\n await mockDelay();\n setWorkspaces(mockWorkspaces);\n return;\n }\n\n const response = await listWorkspaces(credentials!, 50, clientConfig);\n if (response.ok && response.data) {\n setWorkspaces(response.data.workspaces.map(normalizeWorkspace));\n }\n } catch (error) {\n console.error('[Flowstack] Failed to refresh workspaces:', error);\n } finally {\n setIsLoadingWorkspaces(false);\n }\n }, [credentials, clientConfig, isMockMode]);\n\n // Create workspace\n const createWorkspace = useCallback(async (name: string, description?: string): Promise<WorkspaceInfo | null> => {\n if (!credentials && !isMockMode) return null;\n\n try {\n if (isMockMode) {\n await mockDelay();\n const newWorkspace: WorkspaceInfo = {\n workspaceId: generateMockId('ws'),\n name,\n description,\n datasetCount: 0,\n visualizationCount: 0,\n modelCount: 0,\n createdAt: new Date().toISOString(),\n lastAccessed: new Date().toISOString(),\n };\n setWorkspaces(prev => [newWorkspace, ...prev]);\n return newWorkspace;\n }\n\n const response = await apiCreateWorkspace(credentials!, name, description, clientConfig);\n if (response.ok && response.data) {\n const newWorkspace = normalizeWorkspace(response.data.workspace);\n setWorkspaces(prev => [newWorkspace, ...prev]);\n return newWorkspace;\n }\n return null;\n } catch (error) {\n console.error('[Flowstack] Failed to create workspace:', error);\n return null;\n }\n }, [credentials, clientConfig, isMockMode]);\n\n // Select workspace\n const setSelectedWorkspace = useCallback((workspace: WorkspaceInfo | null) => {\n setSelectedWorkspaceState(workspace);\n\n if (workspace && credentials) {\n // Update session\n setSession(prev => ({\n ...prev,\n sessionId: workspace.workspaceId,\n workspaceId: workspace.workspaceId,\n isConnected: true,\n lastActivity: new Date(),\n }));\n\n // Persist selection\n saveSelectedWorkspace(workspace.workspaceId, credentials, 'local');\n\n // Load messages for this workspace\n const storedMessages = loadMessages<ChatMessage>(\n workspace.workspaceId,\n credentials,\n 'session'\n );\n\n // Fix any interrupted streaming messages\n const fixedMessages = storedMessages.map(m => ({\n ...m,\n timestamp: new Date(m.timestamp),\n isStreaming: false,\n content: m.isStreaming && !m.content?.trim()\n ? '*(Response interrupted)*'\n : m.content,\n }));\n setMessages(fixedMessages);\n\n // Clear data - will be refreshed\n setDatasetsState([]);\n setVisualizationsState([]);\n setReportsState([]);\n setModelsState([]);\n } else {\n setSession(prev => ({\n ...prev,\n sessionId: null,\n workspaceId: null,\n isConnected: false,\n }));\n setMessages([]);\n }\n }, [credentials]);\n\n // Auto-load workspaces when authenticated (or in mock mode)\n useEffect(() => {\n if ((credentials || isMockMode) && workspaces.length === 0 && isInitialized) {\n refreshWorkspaces();\n }\n }, [credentials, isInitialized, isMockMode]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Auto-select or auto-create workspace when workspaces load\n useEffect(() => {\n if (!credentials && !isMockMode) return;\n if (selectedWorkspace) return;\n\n if (workspaces.length > 0) {\n // If a session workspace exists, select it; otherwise select the first one\n const found = session.workspaceId\n ? workspaces.find(ws => ws.workspaceId === session.workspaceId)\n : null;\n // Use setSelectedWorkspace (not raw state setter) to trigger message restoration\n setSelectedWorkspace(found || workspaces[0]);\n } else if (workspaces.length === 0 && isInitialized && !isLoadingWorkspaces) {\n // No workspaces — auto-create a default one\n createWorkspace('My Workspace', 'Default workspace').then(ws => {\n if (ws) setSelectedWorkspace(ws);\n });\n }\n }, [workspaces, session.workspaceId, selectedWorkspace, credentials, isMockMode, isInitialized, isLoadingWorkspaces]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // =============================================================================\n // Message Management\n // =============================================================================\n\n const addMessage = useCallback((message: ChatMessage) => {\n setMessages(prev => {\n const updated = [...prev, message];\n\n // Persist non-streaming messages\n if (!message.isStreaming && credentials && session.workspaceId) {\n saveMessages(updated, session.workspaceId, credentials, 'session');\n }\n\n return updated;\n });\n }, [credentials, session.workspaceId]);\n\n const updateMessage = useCallback((id: string, updates: Partial<ChatMessage>) => {\n setMessages(prev => {\n const updated = prev.map(msg =>\n msg.id === id ? { ...msg, ...updates } : msg\n );\n\n // Persist when streaming completes\n if (updates.isStreaming === false && credentials && session.workspaceId) {\n saveMessages(updated, session.workspaceId, credentials, 'session');\n }\n\n return updated;\n });\n }, [credentials, session.workspaceId]);\n\n const clearMessages = useCallback(() => {\n setMessages([]);\n if (credentials && session.workspaceId) {\n clearStoredMessages(session.workspaceId, credentials, 'session');\n }\n }, [credentials, session.workspaceId]);\n\n // =============================================================================\n // Dataset Management\n // =============================================================================\n\n const setDatasets = useCallback((datasets: DatasetInfo[]) => {\n setDatasetsState(datasets);\n }, []);\n\n const refreshDatasets = useCallback(async () => {\n if ((!credentials || !selectedWorkspace) && !isMockMode) return;\n\n setIsLoadingDatasets(true);\n try {\n if (isMockMode) {\n await mockDelay();\n setDatasetsState(mockDatasets);\n return;\n }\n\n const response = await listDatasets(\n credentials!,\n selectedWorkspace!.workspaceId,\n clientConfig\n );\n if (response.ok && response.data) {\n setDatasetsState(response.data.datasets.map(normalizeDataset));\n }\n } catch (error) {\n console.error('[Flowstack] Failed to refresh datasets:', error);\n } finally {\n setIsLoadingDatasets(false);\n }\n }, [credentials, selectedWorkspace, clientConfig, isMockMode]);\n\n // =============================================================================\n // Visualization Management\n // =============================================================================\n\n const setVisualizations = useCallback((vizs: VisualizationData[]) => {\n setVisualizationsState(vizs);\n }, []);\n\n const addVisualization = useCallback((viz: VisualizationData) => {\n setVisualizationsState(prev => {\n const exists = prev.some(v => v.name === viz.name);\n if (exists) {\n return prev.map(v => v.name === viz.name ? viz : v);\n }\n return [...prev, viz];\n });\n }, []);\n\n const refreshVisualizations = useCallback(async () => {\n if ((!credentials || !selectedWorkspace) && !isMockMode) return;\n\n setIsLoadingVisualizations(true);\n try {\n if (isMockMode) {\n await mockDelay();\n setVisualizationsState(mockVisualizations);\n return;\n }\n\n const response = await listVisualizations(\n credentials!,\n selectedWorkspace!.workspaceId,\n clientConfig\n );\n if (response.ok && response.data) {\n const apiVizs = response.data.visualizations.map(normalizeVisualization);\n // Merge: preserve image data from streaming visualizations (SSE events\n // include imageBase64/imageUrl but the list API does not)\n setVisualizationsState(prev => {\n const streamMap = new Map(prev.filter(v => v.imageUrl || v.imageBase64).map(v => [v.name, v]));\n return apiVizs.map(v => {\n const streamed = streamMap.get(v.name);\n if (streamed && !v.imageUrl && !v.imageBase64) {\n return { ...v, imageUrl: streamed.imageUrl, imageBase64: streamed.imageBase64, format: streamed.format || v.format };\n }\n return v;\n });\n });\n }\n } catch (error) {\n console.error('[Flowstack] Failed to refresh visualizations:', error);\n } finally {\n setIsLoadingVisualizations(false);\n }\n }, [credentials, selectedWorkspace, clientConfig, isMockMode]);\n\n const clearVisualizations = useCallback(() => {\n setVisualizationsState([]);\n }, []);\n\n // =============================================================================\n // Report Management\n // =============================================================================\n\n const refreshReports = useCallback(async () => {\n if ((!credentials || !selectedWorkspace) && !isMockMode) return;\n\n setIsLoadingReports(true);\n try {\n if (isMockMode) {\n await mockDelay();\n setReportsState([]); // No mock reports by default\n return;\n }\n\n const response = await listReports(\n credentials!,\n selectedWorkspace!.workspaceId,\n clientConfig\n );\n if (response.ok && response.data) {\n setReportsState(response.data.reports);\n }\n } catch (error) {\n console.error('[Flowstack] Failed to refresh reports:', error);\n } finally {\n setIsLoadingReports(false);\n }\n }, [credentials, selectedWorkspace, clientConfig, isMockMode]);\n\n // =============================================================================\n // Model Management\n // =============================================================================\n\n const refreshModels = useCallback(async () => {\n if ((!credentials || !selectedWorkspace) && !isMockMode) return;\n\n setIsLoadingModels(true);\n try {\n if (isMockMode) {\n await mockDelay();\n setModelsState([]); // No mock models by default\n return;\n }\n\n const response = await listModels(\n credentials!,\n selectedWorkspace!.workspaceId,\n clientConfig\n );\n if (response.ok && response.data) {\n setModelsState(response.data.models);\n }\n } catch (error) {\n console.error('[Flowstack] Failed to refresh models:', error);\n } finally {\n setIsLoadingModels(false);\n }\n }, [credentials, selectedWorkspace, clientConfig, isMockMode]);\n\n // =============================================================================\n // Script Management\n // =============================================================================\n\n const refreshScripts = useCallback(async () => {\n if ((!credentials || !selectedWorkspace) && !isMockMode) return;\n\n setIsLoadingScripts(true);\n try {\n if (isMockMode) {\n await mockDelay();\n setScriptsState([]);\n return;\n }\n\n const response = await listScripts(\n credentials!,\n selectedWorkspace!.workspaceId,\n clientConfig\n );\n if (response.ok && response.data) {\n setScriptsState(response.data.scripts);\n }\n } catch (error) {\n console.error('[Flowstack] Failed to refresh scripts:', error);\n } finally {\n setIsLoadingScripts(false);\n }\n }, [credentials, selectedWorkspace, clientConfig, isMockMode]);\n\n // =============================================================================\n // Auto-refresh on workspace change\n // =============================================================================\n\n useEffect(() => {\n if ((credentials || isMockMode) && selectedWorkspace) {\n const timer = setTimeout(() => {\n refreshDatasets();\n refreshVisualizations();\n refreshReports();\n refreshModels();\n refreshScripts();\n }, 100);\n return () => clearTimeout(timer);\n }\n }, [selectedWorkspace?.workspaceId, isMockMode]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // =============================================================================\n // Context Value\n // =============================================================================\n\n const value: FlowstackContextValue = {\n // Config\n config,\n\n // Auth\n credentials,\n setCredentials,\n isAuthenticated: !!credentials,\n isInitialized,\n logout,\n\n // Session\n session,\n\n // Workspaces\n workspaces,\n selectedWorkspace,\n setSelectedWorkspace,\n refreshWorkspaces,\n createWorkspace,\n isLoadingWorkspaces,\n\n // Messages\n messages,\n addMessage,\n updateMessage,\n clearMessages,\n\n // Query state\n isQueryRunning,\n setIsQueryRunning,\n queryStartTime,\n setQueryStartTime,\n\n // Datasets\n datasets,\n setDatasets,\n refreshDatasets,\n isLoadingDatasets,\n\n // Visualizations\n visualizations,\n setVisualizations,\n addVisualization,\n refreshVisualizations,\n isLoadingVisualizations,\n clearVisualizations,\n\n // Reports\n reports,\n refreshReports,\n isLoadingReports,\n\n // Models\n models,\n refreshModels,\n isLoadingModels,\n\n // Scripts\n scripts,\n refreshScripts,\n isLoadingScripts,\n\n // UI\n isSidebarOpen,\n setSidebarOpen,\n activeTab,\n setActiveTab,\n };\n\n return (\n <FlowstackContext.Provider value={value}>\n {children}\n </FlowstackContext.Provider>\n );\n}\n\n/**\n * Hook to access Flowstack context\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { isAuthenticated, credentials } = useFlowstack();\n * // ...\n * }\n * ```\n */\nexport function useFlowstack(): FlowstackContextValue {\n const context = useContext(FlowstackContext);\n if (!context) {\n throw new Error('useFlowstack must be used within a FlowstackProvider');\n }\n return context;\n}\n\n/**\n * Optional hook - returns null if not in provider (for conditional usage)\n */\nexport function useFlowstackOptional(): FlowstackContextValue | null {\n return useContext(FlowstackContext);\n}\n","/**\n * Flowstack SDK Error Codes\n *\n * Standardized error codes for programmatic error handling.\n */\n\nexport const ErrorCodes = {\n // Configuration errors\n CONFIG_INVALID: 'CONFIG_INVALID',\n CONFIG_MISSING_JWT_SECRET: 'CONFIG_MISSING_JWT_SECRET',\n CONFIG_MISSING_PASSWORD_SECRET: 'CONFIG_MISSING_PASSWORD_SECRET',\n\n // Network errors\n NETWORK_ERROR: 'NETWORK_ERROR',\n NETWORK_TIMEOUT: 'NETWORK_TIMEOUT',\n NETWORK_OFFLINE: 'NETWORK_OFFLINE',\n\n // Authentication errors\n AUTHENTICATION_FAILED: 'AUTHENTICATION_FAILED',\n AUTHENTICATION_EXPIRED: 'AUTHENTICATION_EXPIRED',\n INVALID_CREDENTIALS: 'INVALID_CREDENTIALS',\n ACCOUNT_NOT_ACTIVE: 'ACCOUNT_NOT_ACTIVE',\n ACCOUNT_LOCKED: 'ACCOUNT_LOCKED',\n EMAIL_NOT_VERIFIED: 'EMAIL_NOT_VERIFIED',\n\n // Authorization errors\n UNAUTHORIZED: 'UNAUTHORIZED',\n FORBIDDEN: 'FORBIDDEN',\n INSUFFICIENT_PERMISSIONS: 'INSUFFICIENT_PERMISSIONS',\n\n // Workspace errors\n WORKSPACE_NOT_FOUND: 'WORKSPACE_NOT_FOUND',\n WORKSPACE_REQUIRED: 'WORKSPACE_REQUIRED',\n WORKSPACE_CREATE_FAILED: 'WORKSPACE_CREATE_FAILED',\n\n // Dataset errors\n DATASET_NOT_FOUND: 'DATASET_NOT_FOUND',\n DATASET_UPLOAD_FAILED: 'DATASET_UPLOAD_FAILED',\n DATASET_DOWNLOAD_FAILED: 'DATASET_DOWNLOAD_FAILED',\n DATASET_DELETE_FAILED: 'DATASET_DELETE_FAILED',\n DATASET_TOO_LARGE: 'DATASET_TOO_LARGE',\n INVALID_FILE_TYPE: 'INVALID_FILE_TYPE',\n\n // Query/Agent errors\n QUERY_FAILED: 'QUERY_FAILED',\n QUERY_TIMEOUT: 'QUERY_TIMEOUT',\n QUERY_CANCELLED: 'QUERY_CANCELLED',\n AGENT_ERROR: 'AGENT_ERROR',\n STREAMING_ERROR: 'STREAMING_ERROR',\n\n // Data source errors\n DATA_SOURCE_NOT_FOUND: 'DATA_SOURCE_NOT_FOUND',\n DATA_SOURCE_CONNECTION_FAILED: 'DATA_SOURCE_CONNECTION_FAILED',\n DATA_SOURCE_AUTH_FAILED: 'DATA_SOURCE_AUTH_FAILED',\n\n // Rate limiting\n RATE_LIMITED: 'RATE_LIMITED',\n CREDITS_EXHAUSTED: 'CREDITS_EXHAUSTED',\n\n // Server errors\n SERVER_ERROR: 'SERVER_ERROR',\n SERVICE_UNAVAILABLE: 'SERVICE_UNAVAILABLE',\n MAINTENANCE_MODE: 'MAINTENANCE_MODE',\n\n // Validation errors\n VALIDATION_ERROR: 'VALIDATION_ERROR',\n INVALID_EMAIL: 'INVALID_EMAIL',\n PASSWORD_TOO_SHORT: 'PASSWORD_TOO_SHORT',\n MISSING_REQUIRED_FIELD: 'MISSING_REQUIRED_FIELD',\n\n // Unknown\n UNKNOWN_ERROR: 'UNKNOWN_ERROR',\n} as const;\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];\n\n/**\n * User-friendly messages for each error code\n */\nexport const ErrorMessages: Record<ErrorCode, string> = {\n [ErrorCodes.CONFIG_INVALID]: 'Invalid SDK configuration',\n [ErrorCodes.CONFIG_MISSING_JWT_SECRET]: 'JWT secret is required in configuration',\n [ErrorCodes.CONFIG_MISSING_PASSWORD_SECRET]: 'Password secret is required in configuration',\n\n [ErrorCodes.NETWORK_ERROR]: 'Unable to connect to the server',\n [ErrorCodes.NETWORK_TIMEOUT]: 'Request timed out. Please try again',\n [ErrorCodes.NETWORK_OFFLINE]: 'No internet connection',\n\n [ErrorCodes.AUTHENTICATION_FAILED]: 'Authentication failed',\n [ErrorCodes.AUTHENTICATION_EXPIRED]: 'Your session has expired. Please log in again',\n [ErrorCodes.INVALID_CREDENTIALS]: 'Invalid email or password',\n [ErrorCodes.ACCOUNT_NOT_ACTIVE]: 'Your account is not active. Please check your email for activation instructions',\n [ErrorCodes.ACCOUNT_LOCKED]: 'Your account has been locked. Please contact support',\n [ErrorCodes.EMAIL_NOT_VERIFIED]: 'Please verify your email address to continue',\n\n [ErrorCodes.UNAUTHORIZED]: 'You are not authorized to perform this action',\n [ErrorCodes.FORBIDDEN]: 'Access denied',\n [ErrorCodes.INSUFFICIENT_PERMISSIONS]: 'You do not have permission to access this resource',\n\n [ErrorCodes.WORKSPACE_NOT_FOUND]: 'Workspace not found',\n [ErrorCodes.WORKSPACE_REQUIRED]: 'Please select a workspace to continue',\n [ErrorCodes.WORKSPACE_CREATE_FAILED]: 'Failed to create workspace',\n\n [ErrorCodes.DATASET_NOT_FOUND]: 'Dataset not found',\n [ErrorCodes.DATASET_UPLOAD_FAILED]: 'Failed to upload dataset',\n [ErrorCodes.DATASET_DOWNLOAD_FAILED]: 'Failed to download dataset',\n [ErrorCodes.DATASET_DELETE_FAILED]: 'Failed to delete dataset',\n [ErrorCodes.DATASET_TOO_LARGE]: 'Dataset exceeds maximum size limit',\n [ErrorCodes.INVALID_FILE_TYPE]: 'Invalid file type',\n\n [ErrorCodes.QUERY_FAILED]: 'Query failed',\n [ErrorCodes.QUERY_TIMEOUT]: 'Query timed out. Please try a simpler request',\n [ErrorCodes.QUERY_CANCELLED]: 'Query was cancelled',\n [ErrorCodes.AGENT_ERROR]: 'AI agent encountered an error',\n [ErrorCodes.STREAMING_ERROR]: 'Error in streaming response',\n\n [ErrorCodes.DATA_SOURCE_NOT_FOUND]: 'Data source not found',\n [ErrorCodes.DATA_SOURCE_CONNECTION_FAILED]: 'Failed to connect to data source',\n [ErrorCodes.DATA_SOURCE_AUTH_FAILED]: 'Data source authentication failed',\n\n [ErrorCodes.RATE_LIMITED]: 'Too many requests. Please slow down',\n [ErrorCodes.CREDITS_EXHAUSTED]: 'You have run out of credits',\n\n [ErrorCodes.SERVER_ERROR]: 'An unexpected server error occurred',\n [ErrorCodes.SERVICE_UNAVAILABLE]: 'Service is temporarily unavailable',\n [ErrorCodes.MAINTENANCE_MODE]: 'Service is under maintenance',\n\n [ErrorCodes.VALIDATION_ERROR]: 'Validation error',\n [ErrorCodes.INVALID_EMAIL]: 'Please enter a valid email address',\n [ErrorCodes.PASSWORD_TOO_SHORT]: 'Password is too short',\n [ErrorCodes.MISSING_REQUIRED_FIELD]: 'Required field is missing',\n\n [ErrorCodes.UNKNOWN_ERROR]: 'An unexpected error occurred',\n};\n\n/**\n * Recovery actions for each error code\n */\nexport const RecoveryActions: Partial<Record<ErrorCode, string>> = {\n [ErrorCodes.NETWORK_ERROR]: 'Check your internet connection and try again',\n [ErrorCodes.NETWORK_OFFLINE]: 'Connect to the internet and try again',\n [ErrorCodes.AUTHENTICATION_EXPIRED]: 'Log in again to continue',\n [ErrorCodes.ACCOUNT_NOT_ACTIVE]: 'Check your email for the activation link',\n [ErrorCodes.EMAIL_NOT_VERIFIED]: 'Check your email for the verification link',\n [ErrorCodes.WORKSPACE_REQUIRED]: 'Select or create a workspace',\n [ErrorCodes.RATE_LIMITED]: 'Wait a moment and try again',\n [ErrorCodes.CREDITS_EXHAUSTED]: 'Upgrade your plan or wait for credits to reset',\n};\n","/**\n * Flowstack SDK Error Handling\n *\n * Provides structured error handling with error codes, user-friendly messages,\n * and recovery actions.\n *\n * @example\n * ```tsx\n * import { FlowstackError, ErrorCodes } from 'flowstack-sdk';\n *\n * try {\n * await login(email, password);\n * } catch (error) {\n * if (error instanceof FlowstackError) {\n * if (error.code === ErrorCodes.ACCOUNT_NOT_ACTIVE) {\n * showActivationPrompt();\n * }\n * showError(error.userMessage);\n * }\n * }\n * ```\n */\n\nimport { ErrorCode, ErrorCodes, ErrorMessages, RecoveryActions } from './codes';\n\nexport { ErrorCodes, ErrorMessages, RecoveryActions } from './codes';\nexport type { ErrorCode } from './codes';\n\nexport interface FlowstackErrorOptions {\n /** User-friendly error message */\n userMessage?: string;\n /** Suggested recovery action */\n recoveryAction?: string;\n /** Additional error details */\n details?: Record<string, unknown>;\n /** HTTP status code if from API */\n status?: number;\n /** Original error that caused this error */\n cause?: Error;\n}\n\n/**\n * Structured error class for Flowstack SDK\n *\n * Provides:\n * - Error code for programmatic handling\n * - User-friendly message for display\n * - Recovery action suggestions\n * - Additional details for debugging\n */\nexport class FlowstackError extends Error {\n /** Error code for programmatic handling */\n readonly code: ErrorCode;\n\n /** User-friendly message safe to display */\n readonly userMessage: string;\n\n /** Suggested action to recover from the error */\n readonly recoveryAction?: string;\n\n /** Additional error details */\n details?: Record<string, unknown>;\n\n /** HTTP status code if from API response */\n readonly status?: number;\n\n /** Original error that caused this error */\n readonly originalCause?: Error;\n\n constructor(code: ErrorCode, message?: string, options?: FlowstackErrorOptions) {\n const finalMessage = message || ErrorMessages[code] || 'An error occurred';\n super(finalMessage);\n\n this.name = 'FlowstackError';\n this.code = code;\n this.userMessage = options?.userMessage || ErrorMessages[code] || finalMessage;\n this.recoveryAction = options?.recoveryAction || RecoveryActions[code];\n this.details = options?.details;\n this.status = options?.status;\n this.originalCause = options?.cause;\n\n // Maintain proper prototype chain\n Object.setPrototypeOf(this, FlowstackError.prototype);\n }\n\n /**\n * Create a FlowstackError from an API response\n */\n static fromApiError(status: number, body: string | Record<string, unknown>): FlowstackError {\n const parsed = typeof body === 'string' ? tryParseJSON(body) : body;\n const detail = parsed?.detail || parsed?.error || parsed?.message || 'Request failed';\n\n // Map common API errors to error codes\n const code = mapStatusToErrorCode(status, String(detail));\n\n return new FlowstackError(code, String(detail), {\n status,\n details: typeof parsed === 'object' && parsed !== null ? parsed : { raw: body },\n });\n }\n\n /**\n * Create a FlowstackError from a network error\n */\n static fromNetworkError(error: Error): FlowstackError {\n // Check for common network error patterns\n if (error.message.includes('Failed to fetch') || error.message.includes('NetworkError')) {\n return new FlowstackError(ErrorCodes.NETWORK_ERROR, 'Failed to connect to server', {\n cause: error,\n });\n }\n\n if (error.message.includes('timeout') || error.name === 'AbortError') {\n return new FlowstackError(ErrorCodes.NETWORK_TIMEOUT, 'Request timed out', {\n cause: error,\n });\n }\n\n return new FlowstackError(ErrorCodes.NETWORK_ERROR, error.message, {\n cause: error,\n });\n }\n\n /**\n * Create a FlowstackError from any error\n */\n static from(error: unknown): FlowstackError {\n if (error instanceof FlowstackError) {\n return error;\n }\n\n if (error instanceof Error) {\n // Check if it's a network error\n if (\n error.message.includes('fetch') ||\n error.message.includes('network') ||\n error.message.includes('ECONNREFUSED')\n ) {\n return FlowstackError.fromNetworkError(error);\n }\n\n return new FlowstackError(ErrorCodes.UNKNOWN_ERROR, error.message, {\n cause: error,\n });\n }\n\n // Handle non-Error values\n const message = typeof error === 'string' ? error : 'An unexpected error occurred';\n return new FlowstackError(ErrorCodes.UNKNOWN_ERROR, message);\n }\n\n /**\n * Check if this error is retryable\n */\n isRetryable(): boolean {\n const retryableCodes: ErrorCode[] = [\n ErrorCodes.NETWORK_ERROR,\n ErrorCodes.NETWORK_TIMEOUT,\n ErrorCodes.SERVER_ERROR,\n ErrorCodes.SERVICE_UNAVAILABLE,\n ErrorCodes.RATE_LIMITED,\n ];\n return retryableCodes.includes(this.code);\n }\n\n /**\n * Check if this error requires re-authentication\n */\n requiresReauth(): boolean {\n const reauthCodes: ErrorCode[] = [\n ErrorCodes.AUTHENTICATION_EXPIRED,\n ErrorCodes.UNAUTHORIZED,\n ErrorCodes.INVALID_CREDENTIALS,\n ];\n return reauthCodes.includes(this.code);\n }\n\n /**\n * Get a serializable representation of the error\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n userMessage: this.userMessage,\n recoveryAction: this.recoveryAction,\n details: this.details,\n status: this.status,\n };\n }\n}\n\n/**\n * Helper to try parsing JSON, returning null on failure\n */\nfunction tryParseJSON(str: string): Record<string, unknown> | null {\n try {\n return JSON.parse(str);\n } catch {\n return null;\n }\n}\n\n/**\n * Map HTTP status codes to error codes\n */\nfunction mapStatusToErrorCode(status: number, detail: string): ErrorCode {\n // Check for specific error patterns in the detail\n const lowerDetail = detail.toLowerCase();\n\n if (lowerDetail.includes('not active') || lowerDetail.includes('account not active')) {\n return ErrorCodes.ACCOUNT_NOT_ACTIVE;\n }\n if (lowerDetail.includes('not verified') || lowerDetail.includes('verify')) {\n return ErrorCodes.EMAIL_NOT_VERIFIED;\n }\n if (lowerDetail.includes('locked')) {\n return ErrorCodes.ACCOUNT_LOCKED;\n }\n if (lowerDetail.includes('rate limit') || lowerDetail.includes('too many')) {\n return ErrorCodes.RATE_LIMITED;\n }\n if (lowerDetail.includes('credit') || lowerDetail.includes('quota')) {\n return ErrorCodes.CREDITS_EXHAUSTED;\n }\n\n // Map by status code\n switch (status) {\n case 400:\n return ErrorCodes.VALIDATION_ERROR;\n case 401:\n return ErrorCodes.AUTHENTICATION_FAILED;\n case 403:\n return ErrorCodes.FORBIDDEN;\n case 404:\n return ErrorCodes.WORKSPACE_NOT_FOUND;\n case 408:\n return ErrorCodes.NETWORK_TIMEOUT;\n case 409:\n return ErrorCodes.VALIDATION_ERROR;\n case 429:\n return ErrorCodes.RATE_LIMITED;\n case 500:\n return ErrorCodes.SERVER_ERROR;\n case 502:\n case 503:\n return ErrorCodes.SERVICE_UNAVAILABLE;\n case 504:\n return ErrorCodes.NETWORK_TIMEOUT;\n default:\n return status >= 500 ? ErrorCodes.SERVER_ERROR : ErrorCodes.UNKNOWN_ERROR;\n }\n}\n\n/**\n * Type guard to check if an error is a FlowstackError\n */\nexport function isFlowstackError(error: unknown): error is FlowstackError {\n return error instanceof FlowstackError;\n}\n\n/**\n * Utility to wrap async functions with error handling\n */\nexport async function withErrorHandling<T>(\n fn: () => Promise<T>,\n context?: string\n): Promise<T> {\n try {\n return await fn();\n } catch (error) {\n const flowstackError = FlowstackError.from(error);\n if (context) {\n flowstackError.details = { ...flowstackError.details, context };\n }\n throw flowstackError;\n }\n}\n","/**\n * Configuration Validator\n *\n * Validates FlowstackConfig on startup and provides helpful error messages.\n */\n\nimport type { FlowstackConfig } from '../types';\nimport { FlowstackError, ErrorCodes } from '../errors';\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n}\n\n/**\n * Validate the SDK configuration\n *\n * @param config - FlowstackConfig to validate\n * @returns ValidationResult with errors and warnings\n *\n * @example\n * ```ts\n * const result = validateConfig(config);\n * if (!result.valid) {\n * console.error('Config errors:', result.errors);\n * }\n * result.warnings.forEach(w => console.warn(w));\n * ```\n */\nexport function validateConfig(config: FlowstackConfig): ValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // Required fields\n if (!config.jwtSecret) {\n errors.push(\n 'Missing required: jwtSecret. This is needed to verify session tokens. ' +\n 'Get your JWT secret from your dashboard or set via FLOWSTACK_JWT_SECRET env var.'\n );\n } else if (config.jwtSecret.length < 32) {\n warnings.push(\n 'jwtSecret is shorter than 32 characters. Consider using a longer secret for security.'\n );\n }\n\n if (!config.passwordSecret) {\n errors.push(\n 'Missing required: passwordSecret. This is needed for secure password hashing. ' +\n 'Generate a unique secret or set via FLOWSTACK_PASSWORD_SECRET env var.'\n );\n } else if (config.passwordSecret.length < 32) {\n warnings.push(\n 'passwordSecret is shorter than 32 characters. Consider using a longer secret for security.'\n );\n }\n\n // tenantId is optional: for authenticated calls the backend derives it from the\n // JWT/API key (the X-Tenant-ID header is ignored), so most apps never set it.\n // It is only required for anonymous access (usePublicCollection), where there is\n // no token — usePublicCollection raises a clear error if it's missing.\n if (!config.tenantId) {\n warnings.push(\n 'No tenantId set. Fine for authenticated apps (tenant comes from the JWT). ' +\n 'Required only if you use usePublicCollection (anonymous access).'\n );\n }\n\n if (!config.baseUrl) {\n warnings.push('No baseUrl provided. Using default Flowstack API URL.');\n }\n\n // Auth configuration\n if (config.auth) {\n if (config.auth.providers.includes('google')) {\n if (!config.auth.googleClientId) {\n errors.push(\n 'Google OAuth is enabled but googleClientId is missing. ' +\n 'Get your client ID from the Google Cloud Console.'\n );\n }\n }\n\n if (config.auth.passwordMinLength && config.auth.passwordMinLength < 8) {\n warnings.push(\n 'passwordMinLength is less than 8. Consider requiring stronger passwords.'\n );\n }\n }\n\n // Redis configuration\n if (config.redis) {\n if (!config.redis.url) {\n errors.push('Redis config provided but url is missing.');\n }\n if (!config.redis.token) {\n errors.push('Redis config provided but token is missing.');\n }\n }\n\n // Database configuration\n if (config.database) {\n if (!config.database.supabaseUrl) {\n errors.push('Database config provided but supabaseUrl is missing.');\n }\n if (!config.database.supabaseKey) {\n errors.push('Database config provided but supabaseKey is missing.');\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n/**\n * Validate config and throw FlowstackError if invalid\n *\n * @param config - FlowstackConfig to validate\n * @throws FlowstackError if configuration is invalid\n */\nexport function validateConfigOrThrow(config: FlowstackConfig): void {\n const result = validateConfig(config);\n\n if (!result.valid) {\n throw new FlowstackError(ErrorCodes.CONFIG_INVALID, result.errors.join('\\n'), {\n userMessage: 'SDK configuration is invalid. Check the console for details.',\n details: { errors: result.errors, warnings: result.warnings },\n });\n }\n\n // Log warnings\n result.warnings.forEach((warning) => {\n console.warn('[Flowstack]', warning);\n });\n}\n\n/**\n * Check if config is for development/testing (relaxed validation)\n */\nexport function isDevelopmentConfig(config: FlowstackConfig): boolean {\n return (\n config.mode === 'development' ||\n config.mode === 'mock' ||\n (typeof process !== 'undefined' && process.env?.NODE_ENV === 'development')\n );\n}\n\n/**\n * Get a summary of the config for debugging\n */\nexport function getConfigSummary(config: FlowstackConfig): Record<string, unknown> {\n return {\n mode: config.mode || 'production',\n hasJwtSecret: !!config.jwtSecret,\n hasPasswordSecret: !!config.passwordSecret,\n tenantId: config.tenantId || '(from token)',\n baseUrl: config.baseUrl || '(default)',\n authProviders: config.auth?.providers || ['email'],\n hasRedis: !!config.redis,\n hasDatabase: !!config.database,\n storage: config.storage || 'local',\n };\n}\n","'use client';\n\n/**\n * useAuth Hook\n *\n * Provides authentication functionality including login, register, and Google OAuth.\n *\n * @example\n * ```tsx\n * function LoginPage() {\n * const { login, isLoading, error } = useAuth();\n *\n * const handleLogin = async (email: string, password: string) => {\n * const success = await login(email, password);\n * if (success) router.push('/dashboard');\n * };\n * }\n * ```\n */\n\nimport { useState, useCallback, useMemo } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport type { UseAuthReturn, FlowstackCredentials, User } from '../types';\nimport { login as apiLogin, register as apiRegister } from '../api/client';\nimport { mockCredentials, mockDelay } from '../mock/fixtures';\n\n/**\n * Hook for authentication operations\n */\nexport function useAuth(): UseAuthReturn {\n const {\n credentials,\n setCredentials,\n isAuthenticated,\n logout: contextLogout,\n config,\n } = useFlowstack();\n\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const clientConfig = {\n baseUrl: config.baseUrl,\n tenantId: config.tenantId,\n appScope: config.appScope,\n };\n\n const isMockMode = config.mode === 'mock';\n\n /**\n * Login with email and password\n */\n const login = useCallback(async (email: string, password: string): Promise<boolean> => {\n setIsLoading(true);\n setError(null);\n\n try {\n // Mock mode - return mock credentials without API call\n if (isMockMode) {\n await mockDelay(200, 600);\n const newCredentials: FlowstackCredentials = {\n ...mockCredentials,\n email,\n expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),\n };\n setCredentials(newCredentials);\n return true;\n }\n\n const response = await apiLogin(email, password, clientConfig);\n\n if (response.ok && response.data) {\n const { session_token, user_id, access_token } = response.data;\n\n const newCredentials: FlowstackCredentials = {\n apiKey: access_token || session_token,\n // setCredentials derives tenant from the JWT; config is just a fallback.\n tenantId: config.tenantId || '',\n userId: user_id,\n email,\n };\n\n setCredentials(newCredentials);\n return true;\n }\n\n setError(response.error || 'Login failed');\n return false;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Login failed';\n setError(message);\n return false;\n } finally {\n setIsLoading(false);\n }\n }, [config.tenantId, setCredentials, clientConfig, isMockMode]);\n\n /**\n * Register a new user\n */\n const register = useCallback(async (\n email: string,\n password: string,\n _name?: string\n ): Promise<boolean> => {\n setIsLoading(true);\n setError(null);\n\n try {\n // Mock mode - simulate registration then auto-login\n if (isMockMode) {\n await mockDelay(300, 800);\n // Auto-login after mock registration\n return await login(email, password);\n }\n\n const response = await apiRegister(email, password, clientConfig);\n\n if (response.ok && response.data) {\n // Use session token from registration directly if available\n if (response.data.session_token) {\n const newCredentials: FlowstackCredentials = {\n apiKey: response.data.session_token,\n // setCredentials derives tenant from the JWT; server/config are fallbacks.\n tenantId: response.data.tenant_id || config.tenantId || '',\n userId: response.data.user_id,\n email,\n };\n setCredentials(newCredentials);\n return true;\n }\n // Fall back to login if registration didn't return a token\n if (response.data.user_id) {\n return await login(email, password);\n }\n return true;\n }\n\n setError(response.error || 'Registration failed');\n return false;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Registration failed';\n setError(message);\n return false;\n } finally {\n setIsLoading(false);\n }\n }, [login, clientConfig, isMockMode]);\n\n /**\n * Initiate Google OAuth sign-in\n */\n const googleSignIn = useCallback(async (): Promise<void> => {\n setIsLoading(true);\n setError(null);\n\n try {\n // Redirect to Google OAuth endpoint\n // The actual implementation depends on server-side route\n const googleClientId = config.auth?.googleClientId;\n if (!googleClientId) {\n throw new Error('Google OAuth not configured');\n }\n\n const redirectUri = `${window.location.origin}/api/auth/google/callback`;\n const scope = 'openid email profile';\n const state = crypto.randomUUID();\n\n // Store state for CSRF protection\n sessionStorage.setItem('google_oauth_state', state);\n\n const params = new URLSearchParams({\n client_id: googleClientId,\n redirect_uri: redirectUri,\n response_type: 'code',\n scope,\n state,\n access_type: 'offline',\n prompt: 'consent',\n });\n\n window.location.href = `https://accounts.google.com/o/oauth2/v2/auth?${params}`;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Google sign-in failed';\n setError(message);\n setIsLoading(false);\n }\n }, [config.auth?.googleClientId]);\n\n /**\n * Logout and clear credentials\n */\n const logout = useCallback(() => {\n setError(null);\n contextLogout();\n }, [contextLogout]);\n\n /**\n * Refresh token if needed\n */\n const refreshToken = useCallback(async (): Promise<boolean> => {\n if (!credentials) return false;\n\n // Check if token is expired or expiring soon\n if (credentials.expiresAt) {\n const expiresAt = new Date(credentials.expiresAt).getTime();\n const now = Date.now();\n const fiveMinutes = 5 * 60 * 1000;\n\n if (now < expiresAt - fiveMinutes) {\n // Token still valid\n return true;\n }\n }\n\n // Token refresh would require server-side session refresh endpoint\n // For now, return true if we have valid credentials\n return !!credentials.apiKey;\n }, [credentials]);\n\n // Derive user from credentials\n const user: User | null = useMemo(() => {\n if (!credentials) return null;\n return {\n id: credentials.userId || '',\n email: credentials.email || '',\n tenantId: credentials.tenantId,\n expiresAt: credentials.expiresAt,\n };\n }, [credentials]);\n\n return {\n user,\n credentials,\n isAuthenticated,\n isLoading,\n error,\n login,\n register,\n googleSignIn,\n logout,\n refreshToken,\n };\n}\n","'use client';\n\n/**\n * useWorkspace Hook\n *\n * Provides workspace management functionality.\n *\n * @example\n * ```tsx\n * function WorkspaceManager() {\n * const { workspaces, selectedWorkspace, createWorkspace, selectWorkspace } = useWorkspace();\n *\n * return (\n * <div>\n * <select onChange={(e) => {\n * const ws = workspaces.find(w => w.workspaceId === e.target.value);\n * if (ws) selectWorkspace(ws);\n * }}>\n * {workspaces.map(ws => (\n * <option key={ws.workspaceId} value={ws.workspaceId}>{ws.name}</option>\n * ))}\n * </select>\n * <button onClick={() => createWorkspace('New Project')}>New Workspace</button>\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport type { UseWorkspaceReturn, WorkspaceInfo } from '../types';\n\n/**\n * Hook for workspace management\n */\nexport function useWorkspace(): UseWorkspaceReturn {\n const {\n workspaces,\n selectedWorkspace,\n setSelectedWorkspace,\n refreshWorkspaces: contextRefresh,\n createWorkspace: contextCreate,\n isLoadingWorkspaces,\n } = useFlowstack();\n\n const [error, setError] = useState<string | null>(null);\n\n /**\n * Create a new workspace\n */\n const createWorkspace = useCallback(async (\n name: string,\n description?: string\n ): Promise<WorkspaceInfo | null> => {\n setError(null);\n\n try {\n const workspace = await contextCreate(name, description);\n if (!workspace) {\n setError('Failed to create workspace');\n }\n return workspace;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to create workspace';\n setError(message);\n return null;\n }\n }, [contextCreate]);\n\n /**\n * Select a workspace\n */\n const selectWorkspace = useCallback((workspace: WorkspaceInfo) => {\n setError(null);\n setSelectedWorkspace(workspace);\n }, [setSelectedWorkspace]);\n\n /**\n * Refresh workspaces list\n */\n const refreshWorkspaces = useCallback(async () => {\n setError(null);\n try {\n await contextRefresh();\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to refresh workspaces';\n setError(message);\n }\n }, [contextRefresh]);\n\n return {\n workspaces,\n selectedWorkspace,\n isLoading: isLoadingWorkspaces,\n error,\n createWorkspace,\n selectWorkspace,\n refreshWorkspaces,\n };\n}\n","'use client';\n\n/**\n * useDatasets Hook\n *\n * Provides dataset management functionality including upload, download, and deletion.\n *\n * @example\n * ```tsx\n * function DatasetManager() {\n * const { datasets, uploadDataset, deleteDataset, isLoading } = useDatasets();\n *\n * const handleUpload = async (file: File) => {\n * const dataset = await uploadDataset(file);\n * if (dataset) console.log('Uploaded:', dataset.name);\n * };\n *\n * return (\n * <div>\n * <input type=\"file\" onChange={(e) => handleUpload(e.target.files[0])} />\n * <ul>\n * {datasets.map(ds => (\n * <li key={ds.id}>\n * {ds.name} ({ds.rows} rows)\n * <button onClick={() => deleteDataset(ds.name)}>Delete</button>\n * </li>\n * ))}\n * </ul>\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport type { UseDatasetsReturn, DatasetInfo } from '../types';\nimport { uploadFile, deleteDataset as apiDeleteDataset, flowstackFetch } from '../api/client';\nimport { mockDelay, generateMockId } from '../mock/fixtures';\n\n/**\n * Hook for dataset operations\n */\nexport function useDatasets(): UseDatasetsReturn {\n const {\n credentials,\n selectedWorkspace,\n datasets,\n refreshDatasets: contextRefresh,\n isLoadingDatasets,\n config,\n } = useFlowstack();\n\n const [error, setError] = useState<string | null>(null);\n\n const clientConfig = {\n baseUrl: config.baseUrl,\n tenantId: config.tenantId,\n };\n\n const isMockMode = config.mode === 'mock';\n\n /**\n * Upload a dataset file\n */\n const uploadDataset = useCallback(async (\n file: File,\n name?: string\n ): Promise<DatasetInfo | null> => {\n setError(null);\n\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n return null;\n }\n\n if (!selectedWorkspace && !isMockMode) {\n setError('No workspace selected');\n return null;\n }\n\n try {\n // Mock mode - create mock dataset\n if (isMockMode) {\n await mockDelay(500, 1500);\n const mockDataset: DatasetInfo = {\n id: generateMockId('ds'),\n name: name || file.name.replace(/\\.[^/.]+$/, ''),\n rows: Math.floor(Math.random() * 10000) + 100,\n columns: Math.floor(Math.random() * 20) + 3,\n columnNames: ['col1', 'col2', 'col3'],\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n await contextRefresh();\n return mockDataset;\n }\n\n const response = await uploadFile(\n credentials!,\n selectedWorkspace!.workspaceId,\n file,\n name,\n clientConfig\n );\n\n if (response.ok && response.data?.dataset) {\n // Refresh datasets list\n await contextRefresh();\n return response.data.dataset;\n }\n\n setError(response.error || 'Upload failed');\n return null;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Upload failed';\n setError(message);\n return null;\n }\n }, [credentials, selectedWorkspace, clientConfig, contextRefresh, isMockMode]);\n\n /**\n * Download a dataset\n */\n const downloadDataset = useCallback(async (name: string): Promise<Blob | null> => {\n setError(null);\n\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n return null;\n }\n\n if (!selectedWorkspace && !isMockMode) {\n setError('No workspace selected');\n return null;\n }\n\n try {\n // Mock mode - return mock CSV blob\n if (isMockMode) {\n await mockDelay(200, 500);\n const mockCsv = 'id,name,value\\n1,Item A,100\\n2,Item B,200\\n3,Item C,300';\n return new Blob([mockCsv], { type: 'text/csv' });\n }\n\n const baseUrl = config.baseUrl || 'https://sage-api.flowstack.fun';\n const tenantId = credentials!.tenantId || config.tenantId || '';\n\n // API uses /datasets/{name}/download (not workspace-scoped)\n const url = `${baseUrl}/datasets/${name}/download`;\n\n const response = await fetch(url, {\n headers: {\n 'Authorization': `Bearer ${credentials!.apiKey}`,\n 'X-Tenant-ID': tenantId,\n 'X-User-ID': credentials!.userId || '',\n },\n });\n\n if (!response.ok) {\n setError(`Download failed: ${response.statusText}`);\n return null;\n }\n\n return await response.blob();\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Download failed';\n setError(message);\n return null;\n }\n }, [credentials, selectedWorkspace, config, isMockMode]);\n\n /**\n * Delete a dataset\n */\n const deleteDataset = useCallback(async (name: string): Promise<boolean> => {\n setError(null);\n\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n return false;\n }\n\n if (!selectedWorkspace && !isMockMode) {\n setError('No workspace selected');\n return false;\n }\n\n try {\n // Mock mode - just refresh to simulate delete\n if (isMockMode) {\n await mockDelay(200, 500);\n await contextRefresh();\n return true;\n }\n\n const response = await apiDeleteDataset(\n credentials!,\n name,\n clientConfig\n );\n\n if (response.ok) {\n // Refresh datasets list\n await contextRefresh();\n return true;\n }\n\n setError(response.error || 'Delete failed');\n return false;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Delete failed';\n setError(message);\n return false;\n }\n }, [credentials, selectedWorkspace, clientConfig, contextRefresh, isMockMode]);\n\n /**\n * Refresh datasets list\n */\n const refreshDatasets = useCallback(async () => {\n setError(null);\n try {\n await contextRefresh();\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Refresh failed';\n setError(message);\n }\n }, [contextRefresh]);\n\n return {\n datasets,\n isLoading: isLoadingDatasets,\n error,\n uploadDataset,\n downloadDataset,\n deleteDataset,\n refreshDatasets,\n };\n}\n","'use client';\n\n/**\n * useVisualizations Hook\n *\n * Provides access to workspace visualizations.\n *\n * @example\n * ```tsx\n * function VizGallery() {\n * const { visualizations, isLoading } = useVisualizations();\n *\n * return (\n * <div className=\"grid\">\n * {visualizations.map(viz => (\n * <img key={viz.name} src={viz.imageUrl} alt={viz.name} />\n * ))}\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport type { UseVisualizationsReturn } from '../types';\n\n/**\n * Hook for visualization operations\n */\nexport function useVisualizations(): UseVisualizationsReturn {\n const {\n visualizations,\n refreshVisualizations: contextRefresh,\n isLoadingVisualizations,\n } = useFlowstack();\n\n const [error, setError] = useState<string | null>(null);\n\n /**\n * Refresh visualizations list\n */\n const refreshVisualizations = useCallback(async () => {\n setError(null);\n try {\n await contextRefresh();\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Refresh failed';\n setError(message);\n }\n }, [contextRefresh]);\n\n return {\n visualizations,\n isLoading: isLoadingVisualizations,\n error,\n refreshVisualizations,\n };\n}\n","'use client';\n\n/**\n * useReports Hook\n *\n * Provides report management functionality.\n *\n * @example\n * ```tsx\n * function ReportsList() {\n * const { reports, downloadReport, isLoading } = useReports();\n *\n * const handleDownload = async (report) => {\n * const blob = await downloadReport(report.url, report.name, report.format);\n * if (blob) {\n * const url = URL.createObjectURL(blob);\n * window.open(url, '_blank');\n * }\n * };\n *\n * return (\n * <ul>\n * {reports.map(r => (\n * <li key={r.id}>\n * {r.name}\n * <button onClick={() => handleDownload(r)}>Download</button>\n * </li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport type { UseReportsReturn, ReportInfo } from '../types';\n\n/**\n * Hook for report operations\n */\nexport function useReports(): UseReportsReturn {\n const {\n credentials,\n reports,\n refreshReports: contextRefresh,\n isLoadingReports,\n config,\n } = useFlowstack();\n\n const [error, setError] = useState<string | null>(null);\n\n /**\n * Upload a report file\n */\n const uploadReport = useCallback(async (\n _file: File,\n _name?: string\n ): Promise<ReportInfo | null> => {\n setError(null);\n\n // Report upload would go through the same upload endpoint\n // Implementation depends on backend support\n setError('Report upload not implemented');\n return null;\n }, []);\n\n /**\n * Download a report\n */\n const downloadReport = useCallback(async (\n url: string,\n _name: string,\n _format: string\n ): Promise<Blob | null> => {\n setError(null);\n\n if (!credentials) {\n setError('Not authenticated');\n return null;\n }\n\n try {\n const response = await fetch(url, {\n headers: {\n 'Authorization': `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': credentials.tenantId,\n 'X-User-ID': credentials.userId || '',\n },\n });\n\n if (!response.ok) {\n setError(`Download failed: ${response.statusText}`);\n return null;\n }\n\n return await response.blob();\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Download failed';\n setError(message);\n return null;\n }\n }, [credentials]);\n\n /**\n * Refresh reports list\n */\n const refreshReports = useCallback(async () => {\n setError(null);\n try {\n await contextRefresh();\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Refresh failed';\n setError(message);\n }\n }, [contextRefresh]);\n\n return {\n reports,\n isLoading: isLoadingReports,\n error,\n uploadReport,\n downloadReport,\n refreshReports,\n };\n}\n","'use client';\n\n/**\n * useModels Hook\n *\n * Provides ML model management functionality.\n *\n * @example\n * ```tsx\n * function ModelsList() {\n * const { models, downloadModel, isLoading } = useModels();\n *\n * const handleDownload = async (name: string) => {\n * const blob = await downloadModel(name);\n * if (blob) {\n * const url = URL.createObjectURL(blob);\n * const a = document.createElement('a');\n * a.href = url;\n * a.download = name;\n * a.click();\n * }\n * };\n *\n * return (\n * <ul>\n * {models.map(m => (\n * <li key={m.id}>\n * {m.name} ({m.format})\n * <button onClick={() => handleDownload(m.name)}>Download</button>\n * </li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport type { UseModelsReturn } from '../types';\n\n/**\n * Hook for ML model operations\n */\nexport function useModels(): UseModelsReturn {\n const {\n credentials,\n selectedWorkspace,\n models,\n refreshModels: contextRefresh,\n isLoadingModels,\n config,\n } = useFlowstack();\n\n const [error, setError] = useState<string | null>(null);\n\n /**\n * Download a model\n */\n const downloadModel = useCallback(async (name: string): Promise<Blob | null> => {\n setError(null);\n\n if (!credentials) {\n setError('Not authenticated');\n return null;\n }\n\n if (!selectedWorkspace) {\n setError('No workspace selected');\n return null;\n }\n\n try {\n // Find model to get download URL\n const model = models.find(m => m.name === name);\n if (!model?.download_url) {\n setError('Model download URL not available');\n return null;\n }\n\n const response = await fetch(model.download_url, {\n headers: {\n 'Authorization': `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': credentials.tenantId,\n 'X-User-ID': credentials.userId || '',\n },\n });\n\n if (!response.ok) {\n setError(`Download failed: ${response.statusText}`);\n return null;\n }\n\n return await response.blob();\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Download failed';\n setError(message);\n return null;\n }\n }, [credentials, selectedWorkspace, models]);\n\n /**\n * Refresh models list\n */\n const refreshModels = useCallback(async () => {\n setError(null);\n try {\n await contextRefresh();\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Refresh failed';\n setError(message);\n }\n }, [contextRefresh]);\n\n return {\n models,\n isLoading: isLoadingModels,\n error,\n downloadModel,\n refreshModels,\n };\n}\n","'use client';\n\n/**\n * useDataSources Hook\n *\n * Provides data source management for connecting to external databases.\n *\n * @example\n * ```tsx\n * function ConnectDB() {\n * const { dataSources, createDataSource, testConnection, isLoading } = useDataSources();\n *\n * const connect = async () => {\n * const source = await createDataSource({\n * type: 'mongodb',\n * name: 'Production DB',\n * connectionString: 'mongodb://...'\n * });\n *\n * if (source) {\n * const result = await testConnection(source.source_id);\n * console.log(result.success ? 'Connected!' : result.message);\n * }\n * };\n *\n * return (\n * <div>\n * <button onClick={connect}>Connect MongoDB</button>\n * <ul>\n * {dataSources.map(ds => (\n * <li key={ds.source_id}>{ds.name} ({ds.source_type})</li>\n * ))}\n * </ul>\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback, useEffect } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport type { UseDataSourcesReturn, DataSource, DataSourceConfig, ConnectionTestResult } from '../types';\nimport {\n listDataSources,\n createDataSource as apiCreateDataSource,\n testDataSource,\n deleteDataSource as apiDeleteDataSource,\n} from '../api/client';\n\n/**\n * Hook options for {@link useDataSources}.\n */\nexport interface UseDataSourcesOptions {\n /**\n * P0-69: when true, appends `include_provenance=true` to the list\n * request so each data source comes back with a `_flowstack`\n * workspace attribution envelope. Useful for built apps that need to\n * know which workspace a shared data source belongs to.\n */\n includeProvenance?: boolean;\n}\n\n/**\n * Hook for data source management\n */\nexport function useDataSources(options?: UseDataSourcesOptions): UseDataSourcesReturn {\n const {\n credentials,\n config,\n } = useFlowstack();\n\n const [dataSources, setDataSources] = useState<DataSource[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const clientConfig = {\n baseUrl: config.baseUrl,\n tenantId: config.tenantId,\n };\n const includeProvenance = options?.includeProvenance;\n\n /**\n * Refresh data sources list\n */\n const refreshDataSources = useCallback(async () => {\n if (!credentials) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await listDataSources(credentials, clientConfig, { includeProvenance });\n\n if (response.ok && response.data) {\n setDataSources(response.data.datasources || []);\n } else {\n setError(response.error || 'Failed to load data sources');\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to load data sources';\n setError(message);\n } finally {\n setIsLoading(false);\n }\n }, [credentials, clientConfig, includeProvenance]);\n\n // Load data sources on mount\n useEffect(() => {\n if (credentials) {\n refreshDataSources();\n }\n }, [credentials]); // eslint-disable-line react-hooks/exhaustive-deps\n\n /**\n * Create a new data source\n */\n const createDataSource = useCallback(async (\n sourceConfig: DataSourceConfig\n ): Promise<DataSource | null> => {\n setError(null);\n\n if (!credentials) {\n setError('Not authenticated');\n return null;\n }\n\n try {\n const response = await apiCreateDataSource(credentials, sourceConfig, clientConfig);\n\n if (response.ok && response.data) {\n // Refresh list\n await refreshDataSources();\n return response.data;\n }\n\n setError(response.error || 'Failed to create data source');\n return null;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to create data source';\n setError(message);\n return null;\n }\n }, [credentials, clientConfig, refreshDataSources]);\n\n /**\n * Test a data source connection\n */\n const testConnection = useCallback(async (id: string): Promise<ConnectionTestResult> => {\n setError(null);\n\n if (!credentials) {\n return { success: false, message: 'Not authenticated' };\n }\n\n try {\n const response = await testDataSource(credentials, id, clientConfig);\n\n if (response.ok && response.data) {\n return response.data;\n }\n\n return { success: false, message: response.error || 'Connection test failed' };\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Connection test failed';\n return { success: false, message };\n }\n }, [credentials, clientConfig]);\n\n /**\n * Delete a data source\n */\n const deleteDataSource = useCallback(async (id: string): Promise<boolean> => {\n setError(null);\n\n if (!credentials) {\n setError('Not authenticated');\n return false;\n }\n\n try {\n const response = await apiDeleteDataSource(credentials, id, clientConfig);\n\n if (response.ok) {\n // Refresh list\n await refreshDataSources();\n return true;\n }\n\n setError(response.error || 'Failed to delete data source');\n return false;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to delete data source';\n setError(message);\n return false;\n }\n }, [credentials, clientConfig, refreshDataSources]);\n\n return {\n dataSources,\n isLoading,\n error,\n createDataSource,\n testConnection,\n deleteDataSource,\n refreshDataSources,\n };\n}\n","/**\n * Server-Sent Events (SSE) parser for streaming responses.\n *\n * ─── ARCHITECTURE ───────────────────────────────────────────────────────\n *\n * The backend (streaming_v2.py) emits SSE in standard two-line format:\n *\n * event: delta\n * data: {\"delta\": {\"text\": \"Hello\"}}\n *\n * event: tool_call\n * data: {\"name\": \"execute_python\", \"id\": \"toolu_01...\", \"args\": {...}}\n *\n * event: tool_result\n * data: {\"tool_use_id\": \"toolu_01...\", \"content\": \"...\", \"status\": \"success\"}\n *\n * event: complete\n * data: {\"event_count\": 483, \"execution_ms\": 12340}\n *\n * This parser:\n * 1. Pairs `event:` lines with the next `data:` line (pendingEventType)\n * 2. Normalizes the JSON payload into a consistent StreamEvent shape\n * 3. Yields events for consumption by useAgent() hook\n *\n * ─── V2 BACKEND EVENT FORMATS ──────────────────────────────────────────\n *\n * Text deltas: event: delta → data: {\"delta\": {\"text\": \"token\"}}\n * Tool calls: event: tool_call → data: {\"name\": \"...\", \"id\": \"...\", \"args\": {...}}\n * Tool results: event: tool_result → data: {\"tool_use_id\": \"...\", \"content\": \"...\"}\n * Final text: event: text → data: {\"content\": \"full response\", \"accumulated\": true}\n * Stream end: event: complete → data: {\"event_count\": N, \"execution_ms\": N}\n * Errors: event: error → data: {\"error\": \"message\"}\n *\n * ────────────────────────────────────────────────────────────────────────\n */\n\nimport type { StreamEvent, StreamEventType } from '../types';\n\n/**\n * Parse a single SSE line into a StreamEvent.\n *\n * Handles three line types:\n * - \"data: {...}\" → Parse JSON, normalize to StreamEvent\n * - \"data: [DONE]\" → Return done event\n * - \"event: type\" → Return bare type (used by parseSSEStream for pairing)\n *\n * @param line - Raw SSE line (e.g., \"data: {...}\")\n * @returns Parsed StreamEvent or null\n */\nexport function parseSSELine(line: string): StreamEvent | null {\n // Skip empty lines and comments (SSE spec: lines starting with \":\" are comments)\n if (!line || line.startsWith(':')) {\n return null;\n }\n\n // Parse \"data: \" prefix — this is where the actual payload lives\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n\n // Handle [DONE] signal (OpenAI-style stream termination)\n if (data === '[DONE]') {\n return { type: 'done' };\n }\n\n try {\n const parsed = JSON.parse(data);\n return normalizeEvent(parsed);\n } catch {\n // Non-JSON data: treat as plain text content\n return { type: 'content', content: data };\n }\n }\n\n // Parse \"event: \" prefix — bare event type, no payload.\n // In parseSSEStream, this is captured as pendingEventType and applied\n // to the NEXT data: line. We still return it here for standalone use.\n if (line.startsWith('event: ')) {\n const eventType = line.slice(7) as StreamEventType;\n return { type: eventType };\n }\n\n return null;\n}\n\n/**\n * Normalize a parsed JSON payload into a consistent StreamEvent.\n *\n * ─── WHY THIS EXISTS ────────────────────────────────────────────────────\n *\n * Different backends and API versions emit events in different JSON shapes.\n * This function maps ALL of them to a single StreamEvent interface so\n * the useAgent() hook doesn't need to know about format differences.\n *\n * ─── FORMAT PRIORITY ────────────────────────────────────────────────────\n *\n * Formats are checked in this order (first match wins):\n *\n * 1. Standard {type: \"...\"} — has explicit type field (e.g., v2 metadata/text/complete)\n * 2. Delta {delta: {text: \"...\"}} — v2 incremental text tokens\n * 3. Content block {content_block: {...}} — Anthropic raw format\n * 4. Tool format {name: \"...\", args: {...}} — v2 tool_call/tool_result events\n * 5. Text {text: \"...\" | content: \"...\"} — simple text payloads\n * 6. Error {error: \"...\"} — error events\n * 7. Visualization {visualization: {...}} — chart/image data\n * 8. Credit status {credits: N} — billing events\n * 9. Progress {step: \"...\" | percentage: N} — progress updates\n * 10. Fallback — generic content event\n *\n * ────────────────────────────────────────────────────────────────────────\n */\nfunction normalizeEvent(data: Record<string, unknown>): StreamEvent {\n\n // ── 1. STANDARD FORMAT: {type: \"...\", ...} ──────────────────────────\n // Events that already declare their type. Most v2 events with explicit\n // type fields hit this path (metadata, text, complete, error).\n // Also handles tool_call when type is present — note we check data.name\n // as a fallback for tool since v2 emits \"name\" not \"tool\".\n if (data.type) {\n return {\n type: normalizeEventType(String(data.type)),\n content: data.content as string | undefined,\n tool: (data.tool || data.name) as string | undefined,\n toolUseId: (data.tool_use_id || data.toolUseId || data.id) as string | undefined,\n args: (data.args || data.input) as Record<string, unknown> | undefined,\n result: data.result,\n // P0-132 (G1): preserve the tool_result error flag (backend key: `is_error`).\n isError: (data.is_error ?? data.isError) as boolean | undefined,\n error: data.error as string | undefined,\n data: data.data,\n message: data.message as string | undefined,\n percentage: data.percentage as number | undefined,\n };\n }\n\n // ── 2. DELTA FORMAT: {delta: {text: \"...\"}} ─────────────────────────\n // V2 backend emits incremental text tokens as:\n // event: delta\n // data: {\"delta\": {\"text\": \"Hello\"}}\n //\n // The delta object may or may not have a \"type\" field:\n // - Anthropic raw: {type: \"text_delta\", text: \"...\"}\n // - V2 backend: {text: \"...\"} (no type field)\n // - Tool input: {type: \"input_json_delta\", partial_json: \"...\"}\n if (data.delta) {\n const delta = data.delta as Record<string, unknown>;\n // Anthropic raw text_delta format\n if (delta.type === 'text_delta') {\n return { type: 'text', content: delta.text as string };\n }\n // Anthropic raw tool input streaming\n if (delta.type === 'input_json_delta') {\n return { type: 'tool_use', args: { partial: delta.partial_json } };\n }\n // V2 backend delta format: {\"delta\": {\"text\": \"...\"}} — no type field.\n // This is the PRIMARY text streaming path for v2.\n if (delta.text) {\n return { type: 'delta', content: delta.text as string };\n }\n }\n\n // ── 3. CONTENT BLOCK FORMAT: {content_block: {...}} ─────────────────\n // Anthropic raw content_block_start events (not commonly seen with v2)\n if (data.content_block) {\n const block = data.content_block as Record<string, unknown>;\n if (block.type === 'text') {\n return { type: 'text', content: block.text as string };\n }\n if (block.type === 'tool_use') {\n return {\n type: 'tool_use',\n tool: block.name as string,\n args: block.input as Record<string, unknown>,\n };\n }\n }\n\n // ── 4. TOOL FORMAT: {name: \"...\", id: \"...\", args: {...}} ───────────\n // V2 tool_call events: {\"name\": \"execute_python\", \"id\": \"toolu_...\", \"args\": {...}}\n // V2 tool_result events: {\"tool_use_id\": \"toolu_...\", \"content\": \"...\", \"status\": \"success\"}\n //\n // Detection: any of tool_use_id, tool_name, or name present.\n // Disambiguation: if content/output exists → tool_result, else → tool_use.\n //\n // NOTE: checks both data.input (Anthropic format) and data.args (v2 format)\n if (data.tool_use_id || data.tool_name || data.name) {\n return {\n type: data.content || data.output ? 'tool_result' : 'tool_use',\n tool: (data.tool_name || data.name) as string | undefined,\n toolUseId: (data.tool_use_id || data.id) as string | undefined,\n args: (data.input || data.args) as Record<string, unknown> | undefined,\n result: data.content || data.output,\n // P0-132 (G1): preserve the tool_result error flag (backend key: `is_error`).\n isError: (data.is_error ?? data.isError) as boolean | undefined,\n };\n }\n\n // ── 5. PLAIN TEXT: {text: \"...\" | content: \"...\"} ───────────────────\n if (data.text || data.content) {\n return { type: 'text', content: (data.text || data.content) as string };\n }\n\n // ── 6. ERROR: {error: \"...\"} ────────────────────────────────────────\n if (data.error) {\n return { type: 'error', error: data.error as string };\n }\n\n // ── 7. VISUALIZATION: {visualization: {...}} ────────────────────────\n if (data.visualization || data.image_url || data.imageUrl) {\n return {\n type: 'visualization',\n data: data.visualization || {\n imageUrl: data.image_url || data.imageUrl,\n name: data.name,\n format: data.format,\n },\n };\n }\n\n // ── 8. CREDIT STATUS: {credits: N | remaining: N} ──────────────────\n if (data.credits !== undefined || data.remaining !== undefined) {\n return {\n type: 'credit_status',\n data: {\n remaining: data.credits ?? data.remaining,\n used: data.used,\n },\n };\n }\n\n // ── 9. PROGRESS: {step: \"...\" | percentage: N} ─────────────────────\n if (data.step || data.progress || data.percentage !== undefined) {\n return {\n type: 'progress',\n message: (data.step || data.progress) as string | undefined,\n percentage: data.percentage as number | undefined,\n };\n }\n\n // ── 10. FALLBACK ────────────────────────────────────────────────────\n // Unknown format — wrap as generic content event for debugging\n return { type: 'content', data };\n}\n\n/**\n * Normalize event type strings to standard StreamEventType values.\n *\n * Maps backend-specific type names to the canonical types that useAgent()\n * switches on. This is where aliases collapse:\n * \"content_block_delta\" → \"delta\"\n * \"viz\" → \"visualization\"\n * \"message_stop\" → \"done\"\n */\nfunction normalizeEventType(type: string): StreamEventType {\n const typeMap: Record<string, StreamEventType> = {\n // Text streaming\n 'text': 'text', // Final accumulated text (v2: event: text)\n 'delta': 'delta', // Incremental token (v2: event: delta)\n 'content': 'content', // Generic content\n 'content_block_delta': 'delta', // Anthropic raw format → delta\n\n // Tool lifecycle\n 'tool_use': 'tool_use', // Tool invocation start\n 'tool_call': 'tool_call', // V2 tool call with name + args\n 'tool_result': 'tool_result', // Tool execution result\n\n // Data events\n 'visualization': 'visualization',\n 'viz': 'visualization', // Shorthand alias\n\n // Progress\n 'progress': 'progress',\n 'step': 'progress', // Step-based progress alias\n\n // Billing\n 'credit_status': 'credit_status',\n 'credits': 'credit_status', // Shorthand alias\n\n // P0-66: per-query execution budget snapshot (time/tool/cost)\n 'budget_update': 'budget_update',\n\n // Stream lifecycle\n 'metadata': 'metadata', // V2 metadata with session info + data sources\n 'complete': 'complete', // V2 stream end event\n 'done': 'done', // OpenAI-style stream end\n 'message_stop': 'done', // Anthropic raw format → done\n\n // Interrupt\n 'interrupt': 'interrupt',\n\n // Errors\n 'error': 'error',\n };\n\n return typeMap[type.toLowerCase()] || 'content';\n}\n\n/**\n * Async generator that reads a ReadableStream and yields parsed StreamEvents.\n *\n * ─── SSE WIRE FORMAT ────────────────────────────────────────────────────\n *\n * The backend sends events as two-line pairs separated by blank lines:\n *\n * event: delta\\n ← event type (optional but v2 always sends it)\n * data: {\"delta\":...}\\n ← JSON payload\n * \\n ← blank line = end of event\n *\n * This generator:\n * 1. Buffers incoming bytes and splits on newlines\n * 2. When it sees \"event: X\", stores X as pendingEventType\n * 3. When it sees \"data: {...}\", parses the JSON via normalizeEvent()\n * 4. Applies the pending event type (overrides whatever normalizeEvent guessed)\n * 5. Yields the final StreamEvent\n *\n * This pairing is critical because normalizeEvent may guess wrong\n * (e.g., a tool_call payload with \"name\" field could be mistaken for\n * tool_use), but the explicit \"event: tool_call\" line corrects it.\n *\n * ────────────────────────────────────────────────────────────────────────\n *\n * @param reader - ReadableStreamDefaultReader from fetch response\n * @returns AsyncGenerator yielding StreamEvents\n */\nexport async function* parseSSEStream(\n reader: ReadableStreamDefaultReader<Uint8Array>\n): AsyncGenerator<StreamEvent, void, unknown> {\n const decoder = new TextDecoder();\n let buffer = '';\n // Stores the event type from an \"event: X\" line until the next \"data: \" line\n let pendingEventType: string | null = null;\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n // Append decoded chunk to buffer, split into complete lines\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n // Last element is incomplete (no trailing newline yet) — keep in buffer\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n\n // \"event: delta\" → store type, DON'T yield yet.\n // The actual payload comes on the next \"data: \" line.\n if (trimmed.startsWith('event: ')) {\n pendingEventType = trimmed.slice(7);\n continue;\n }\n\n // \"data: {...}\" → parse JSON and yield as StreamEvent\n const event = parseSSELine(trimmed);\n if (event) {\n // Override the type that normalizeEvent() guessed with the\n // explicit type from the preceding \"event: \" line.\n // This ensures \"event: tool_call\" + \"data: {name: ...}\"\n // correctly yields {type: 'tool_call'} not {type: 'tool_use'}.\n if (pendingEventType) {\n event.type = normalizeEventType(pendingEventType);\n pendingEventType = null;\n }\n\n yield event;\n\n // Stream termination — stop reading after done/complete\n if (event.type === 'done' || event.type === 'complete') {\n return;\n }\n }\n }\n }\n\n // Process any remaining bytes in the buffer after stream closes\n if (buffer.trim()) {\n const event = parseSSELine(buffer.trim());\n if (event) {\n yield event;\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Convenience wrapper: process an SSE stream with callbacks instead of async iteration.\n * Used when you prefer callback-style over for-await-of.\n *\n * @param response - Fetch Response with SSE body\n * @param onEvent - Called for each parsed StreamEvent\n * @param onError - Called if the stream throws (optional)\n */\nexport async function processSSEStream(\n response: Response,\n onEvent: (event: StreamEvent) => void,\n onError?: (error: Error) => void\n): Promise<void> {\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Response body is not readable');\n }\n\n try {\n for await (const event of parseSSEStream(reader)) {\n onEvent(event);\n }\n } catch (error) {\n if (onError && error instanceof Error) {\n onError(error);\n } else {\n throw error;\n }\n }\n}\n","/**\n * Stream content utilities — ported from mobile casino-utils.ts + error-utils.ts\n * Handles JSON blob filtering, content deduplication, table repair, and cleaning.\n */\n\n/** Check if a string looks like raw JSON (object or array). */\nexport function isJsonBlob(s: string): boolean {\n const t = s.trimStart();\n return t.startsWith('{\"') || t.startsWith('[{') || t.startsWith('[\"');\n}\n\n/** Extract a human-readable summary from a JSON event blob. */\nexport function summarizeJsonEvent(raw: string, tool?: string): string | null {\n try {\n const d = JSON.parse(raw);\n if (d.status === 'success' && d.count !== undefined) {\n return `Found ${d.count} dataset${d.count !== 1 ? 's' : ''}${d.query ? ` for \"${d.query}\"` : ''}`;\n }\n if (d.status === 'progress' && d.message) {\n return typeof d.message === 'string' ? d.message : null;\n }\n const msg = d.message || d.description || d.status;\n if (typeof msg === 'string' && msg.length < 120) {\n return tool ? `${tool}: ${msg}` : msg;\n }\n if (Array.isArray(d) && d.length > 0) {\n return `Received ${d.length} result${d.length !== 1 ? 's' : ''}`;\n }\n return tool ? `${tool} processing...` : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Detect and strip doubled content from streaming responses.\n * The backend sometimes sends the full response twice.\n */\nexport function dedupeContent(text: string): string {\n if (!text || text.length < 100) return text;\n\n const len = text.length;\n const mid = Math.floor(len / 2);\n\n for (let offset = 0; offset <= Math.floor(len * 0.05); offset++) {\n for (const m of [mid + offset, mid - offset]) {\n if (m < 50 || m > len - 50) continue;\n\n const a = text.slice(0, m);\n const b = text.slice(m);\n\n if (Math.abs(a.length - b.length) > Math.min(a.length, b.length) * 0.15) continue;\n\n const norm = (s: string) =>\n s.toLowerCase().replace(/\\s+/g, ' ').replace(/[*#_`\\-|>]/g, '').trim();\n\n const na = norm(a);\n const nb = norm(b);\n\n const cmpLen = 60;\n if (na.length < cmpLen || nb.length < cmpLen) continue;\n\n const prefixMatch = na.slice(0, cmpLen) === nb.slice(0, cmpLen);\n const suffixMatch = na.slice(-cmpLen) === nb.slice(-cmpLen);\n\n const midSample = Math.floor(Math.min(na.length, nb.length) / 2);\n const midMatch = na.slice(midSample, midSample + 30) === nb.slice(midSample, midSample + 30);\n\n if (prefixMatch && suffixMatch && midMatch) {\n return b.trim();\n }\n }\n }\n\n return text;\n}\n\n/** Check if a line is a markdown table separator row. */\nfunction isSeparatorRow(line: string): boolean {\n return /^\\|[\\s:-]*-{2,}[\\s|:-]*\\|?$/.test(line.trim());\n}\n\n/** Repair markdown tables broken by streaming concatenation. */\nfunction repairTables(text: string): string {\n if (!text.includes('|')) return text;\n\n let s = text;\n\n // Handle entire table on a single line\n s = s.replace(/^(\\|[^\\n]*\\|)$/gm, (line) => {\n const cells = line.split('|').slice(1);\n if (cells.length > 0 && !cells[cells.length - 1].trim()) cells.pop();\n if (cells.length < 6) return line;\n\n const isSep = cells.map(c => /^\\s*:?-{2,}:?\\s*$/.test(c));\n let sepStart = -1;\n let sepLen = 0;\n for (let i = 0; i < isSep.length; i++) {\n if (isSep[i]) {\n if (sepStart === -1) sepStart = i;\n sepLen++;\n } else if (sepStart !== -1) break;\n }\n if (sepLen < 2 || sepStart < sepLen) return line;\n const cols = sepLen;\n if (sepStart !== cols) return line;\n const dataCells = cells.slice(sepStart + cols);\n if (dataCells.length < cols) return line;\n\n const header = '| ' + cells.slice(0, cols).map(c => c.trim()).join(' | ') + ' |';\n const sep = '| ' + cells.slice(sepStart, sepStart + cols).map(c => c.trim()).join(' | ') + ' |';\n const rows: string[] = [];\n for (let i = 0; i < dataCells.length; i += cols) {\n const chunk = dataCells.slice(i, i + cols);\n if (chunk.length === cols) {\n rows.push('| ' + chunk.map(c => c.trim()).join(' | ') + ' |');\n } else if (chunk.some(c => c.trim())) {\n while (chunk.length < cols) chunk.push(' ');\n rows.push('| ' + chunk.map(c => c.trim()).join(' | ') + ' |');\n }\n }\n return [header, sep, ...rows].join('\\n');\n });\n\n // Strip separator fragments glued to header row end\n s = s.replace(\n /^(\\|[^|\\n]+(?:\\|[^|\\n]+)*\\|)\\s*---[-|\\s]*$/gm,\n (match, captured) => {\n const cells = captured.split('|').filter((c: string) => c.trim());\n if (cells.every((c: string) => /^[\\s:-]*-{2,}[\\s:-]*$/.test(c))) return match;\n return captured;\n }\n );\n\n // Fix fragmented separator rows\n s = s.replace(\n /^(\\|[^|\\n]+(?:\\|[^|\\n]+)*)\\|\\s*\\|---\\n(?:[-|\\s]*\\n)*/gm,\n (match, headerPart) => {\n const cols = (headerPart.match(/\\|/g) || []).length;\n if (cols < 1) return match;\n return headerPart + '|\\n|' + Array(cols).fill(' --- ').join('|') + '|\\n';\n }\n );\n\n // Split concatenated table rows\n s = s.replace(/\\|\\s*\\|(?=\\s*[^\\s|])/g, '|\\n|');\n\n // Clean orphaned separator debris\n s = s.replace(/^-+\\|[-|\\s]*$/gm, '');\n s = s.replace(/^[-|\\s]*\\|---[-|\\s]*$/gm, '');\n s = s.replace(/^\\|\\s*$/gm, '');\n s = s.replace(/\\n{3,}/g, '\\n\\n');\n\n // Find table blocks and ensure separator + split over-long rows\n const lines = s.split('\\n');\n const result: string[] = [];\n let i = 0;\n while (i < lines.length) {\n const line = lines[i];\n if ((line.match(/\\|/g) || []).length >= 2 && !isSeparatorRow(line)) {\n const tableLines: string[] = [line];\n let hasSeparator = false;\n let j = i + 1;\n while (j < lines.length) {\n const next = lines[j];\n if ((next.match(/\\|/g) || []).length >= 2 || isSeparatorRow(next)) {\n if (isSeparatorRow(next)) hasSeparator = true;\n tableLines.push(next);\n j++;\n } else if (next.trim() === '') {\n if (j + 1 < lines.length && (lines[j + 1].match(/\\|/g) || []).length >= 2) {\n tableLines.push(next);\n j++;\n } else break;\n } else break;\n }\n const headerCols = (tableLines[0].match(/\\|/g) || []).length - 1;\n\n const expanded: string[] = [];\n for (const tl of tableLines) {\n if (tl.trim() === '') continue;\n if (isSeparatorRow(tl) || headerCols < 2) {\n expanded.push(tl);\n continue;\n }\n const rowPipes = (tl.match(/\\|/g) || []).length - 1;\n if (rowPipes > headerCols && rowPipes >= headerCols * 2) {\n const cells = tl.split('|');\n const inner = cells.slice(1, -1);\n for (let c = 0; c < inner.length; c += headerCols) {\n const chunk = inner.slice(c, c + headerCols);\n if (chunk.length === headerCols) {\n expanded.push('|' + chunk.join('|') + '|');\n } else if (chunk.some(cell => cell.trim())) {\n while (chunk.length < headerCols) chunk.push(' ');\n expanded.push('|' + chunk.join('|') + '|');\n }\n }\n } else {\n expanded.push(tl);\n }\n }\n\n if (!hasSeparator && expanded.length >= 2 && headerCols >= 2) {\n const sep = '|' + Array(headerCols).fill(' --- ').join('|') + '|';\n result.push(expanded[0], sep);\n for (let k = 1; k < expanded.length; k++) result.push(expanded[k]);\n } else if (hasSeparator && headerCols >= 2) {\n for (const tl of expanded) {\n if (isSeparatorRow(tl)) {\n const sepCols = (tl.match(/\\|/g) || []).length - 1;\n result.push(sepCols !== headerCols\n ? '|' + Array(headerCols).fill(' --- ').join('|') + '|'\n : tl);\n } else {\n result.push(tl);\n }\n }\n } else {\n result.push(...expanded);\n }\n i = j;\n } else {\n result.push(line);\n i++;\n }\n }\n s = result.join('\\n');\n\n // Ensure table blocks have blank line before them\n s = s.replace(/([^\\n])\\n(\\|[^\\n]*\\|[^\\n]*\\n\\|[\\s|:-]+\\|)/g, '$1\\n\\n$2');\n\n return s;\n}\n\n/**\n * Detect markdown tables that streaming concatenation collapsed onto one line\n * and re-insert row boundaries so remarkGfm can parse them.\n *\n * Ported from casino/components/workspace/ChatMessage.tsx (lines 106-137).\n */\nexport function unflattenMarkdownTables(content: string): string {\n if (!content) return content;\n if (!content.includes('|')) return content;\n if (!/\\|\\s*:?-{3,}:?\\s*\\|/.test(content)) return content;\n\n const lines = content.split('\\n');\n const rewritten = lines.map((line) => {\n if (!/\\|\\s*:?-{3,}:?\\s*\\|/.test(line)) return line;\n const rebuilt = line.replace(/ \\| \\| /g, ' |\\n| ');\n if (rebuilt === line) return line;\n const firstPipe = rebuilt.indexOf('|');\n if (firstPipe > 0) {\n const lead = rebuilt.slice(0, firstPipe).trimEnd();\n const table = rebuilt.slice(firstPipe);\n return lead ? `${lead}\\n\\n${table}` : table;\n }\n return rebuilt;\n });\n return rewritten.join('\\n');\n}\n\n/**\n * Clean assistant message content before rendering as Markdown.\n */\nexport function cleanContent(text: string): string {\n if (!text) return text;\n\n let cleaned = text;\n\n // Strip S3 URLs — both clean and tokenizer-broken (streaming inserts spaces within URLs)\n cleaned = cleaned.replace(/Visualization URL:\\s*https?:\\/\\/[^\\s)]+/gi, '');\n // Strip markdown links containing S3 URLs (clean or broken)\n cleaned = cleaned.replace(/\\[([^\\]]*)\\]\\([^)]*s3\\.amazonaws\\.com[^)]*\\)/g, '$1');\n cleaned = cleaned.replace(/\\[([^\\]]*)\\]\\([^)]*X-Amz[^)]*\\)/g, '$1');\n // Strip clean S3 presigned URLs\n cleaned = cleaned.replace(/https?:\\/\\/[^\\s)]*\\.s3\\.amazonaws\\.com\\/[^\\s)]*\\?X-Amz[^\\s)]*/g, '');\n // Strip tokenizer-broken S3 URLs (spaces within URL) — match from https to closing paren or end of line\n cleaned = cleaned.replace(/https?\\s*:\\s*\\/\\s*\\/[^)]*s\\s*3\\s*\\.\\s*amazonaws\\s*\\.\\s*com[^)\\n]*(?:\\)|$)/gm, '');\n // Strip standalone lines that are purely X-Amz credential debris (no meaningful content)\n cleaned = cleaned.replace(/^\\s*(?:&?X\\s*-\\s*Amz\\s*-\\s*\\w+=[^\\n]*)+\\s*$/gm, '');\n // Strip lines that are just continuation of broken presigned URL tokens (>85% encoded chars, no pipe/table)\n cleaned = cleaned.replace(/^[A-Za-z0-9%+/=\\s]{20,}$/gm, (line) => {\n if (line.includes('|')) return line; // Preserve table rows\n const alphaPercent = (line.match(/[A-Za-z0-9%+/=]/g) || []).length;\n return alphaPercent / line.length > 0.85 ? '' : line;\n });\n\n // Strip JSON blobs that leak from tool results\n cleaned = cleaned.replace(/\\{\"status\"\\s*:\\s*\"[^\"]*\"[^{}]*(?:\\{[^{}]*(?:\\{[^{}]*\\}[^{}]*)*\\}[^{}]*)*\\}/g, '');\n cleaned = cleaned.replace(/(?:complete|success|error)\\s*\\{[^}]*(?:\\{[^}]*\\}[^}]*)*\\}/g, '');\n cleaned = cleaned.replace(/\\[\\s*\\{[^[\\]]*(?:\\[[^\\]]*\\][^[\\]]*)*\\}\\s*(?:,\\s*\\{[^[\\]]*\\}\\s*)*\\]/g, '');\n cleaned = cleaned.replace(/\\[?\\d+ rows? x \\d+ columns?\\]?\\s*/g, '');\n cleaned = cleaned.replace(/^.*(?:NaN\\s+){3,}.*$/gm, '');\n cleaned = cleaned.replace(/[\\d.]+ MB \\(streaming[^)]*\\)/g, '');\n cleaned = cleaned.replace(/,\"?error\"?\\s*:\\s*null[^}\\n]*/g, '');\n\n // Strip orchestrator self-talk\n cleaned = cleaned.replace(/(?:Let me|Now let me|I'll|I will)\\s+(?:start|begin|continue|retrieve|get|run|perform|compile|hand off|create|check|explore)[^.:\\n]*[.:]\\s*/gi, '');\n cleaned = cleaned.replace(/(?:Great|Perfect|Excellent|Wonderful)!\\s*/g, '');\n cleaned = cleaned.replace(/Now\\s+[a-z][^.:]*[.:]\\s*/g, '');\n\n // Fix streaming-broken tables\n cleaned = repairTables(cleaned);\n\n // Clean up excessive whitespace\n cleaned = cleaned.replace(/\\n{4,}/g, '\\n\\n\\n');\n\n return cleaned.trim();\n}\n\n/**\n * Parse error messages from the backend into user-friendly format.\n */\nexport function parseErrorMessage(raw: string): {\n message: string;\n isAuth: boolean;\n isContextLimit: boolean;\n} {\n let msg = raw;\n let isAuth = false;\n let isContextLimit = false;\n\n // Try to extract from JSON\n try {\n const parsed = JSON.parse(raw);\n msg = parsed.error || parsed.detail || parsed.message || raw;\n } catch {\n // Not JSON — use as-is\n }\n\n // Detect auth errors\n if (/token.*expired|unauthorized|401|403|permission denied|invalid.*token|auth.*required/i.test(msg)) {\n isAuth = true;\n msg = 'Session expired — tap Reconnect to continue.';\n }\n\n // Detect context limit\n if (/context.*limit|too many tokens|max.*context|prompt.*too.*long/i.test(msg)) {\n isContextLimit = true;\n msg = 'Conversation got too long. Starting fresh on next message.';\n }\n\n // Truncate overly long messages\n if (msg.length > 200) {\n msg = msg.substring(0, 197) + '...';\n }\n\n return { message: msg, isAuth, isContextLimit };\n}\n","/**\n * useCollection — Direct MongoDB access for built-app components.\n *\n * Provides reactive read access and direct write mutations (insert, update, remove)\n * to MongoDB collections. The agent is NOT involved in data operations.\n *\n * Collection names are auto-prefixed with app_scope by the backend —\n * just pass the short name (e.g. 'transactions', not 'site_abc__transactions').\n *\n * Usage:\n * const { documents, isLoading, insert, update, remove } = useCollection<Transaction>('transactions', {\n * sort: { date: -1 },\n * limit: 50,\n * refreshOnAgentComplete: true,\n * });\n *\n * // Insert a document — auto-refetches all useCollection('transactions') instances\n * await insert({ date: '2026-04-02', amount: 42.50, category: 'Groceries' });\n *\n * // Update a document\n * await update({ _id: docId }, { $set: { category: 'Dining' } });\n *\n * // Delete a document\n * await remove({ _id: docId });\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport { queryCollection, insertDocuments, updateDocuments, deleteDocuments } from '../api/client';\nimport type { CollectionLayer } from '../types';\n\nexport interface UseCollectionOptions {\n /** MongoDB query filter (e.g. { status: 'pending' }) */\n filter?: Record<string, any>;\n /** Max documents to return (default 50, max 500) */\n limit?: number;\n /** Skip N documents for pagination */\n skip?: number;\n /** Sort spec (e.g. { date: -1 } for newest first) */\n sort?: Record<string, 1 | -1>;\n /** Field projection (e.g. { _id: 0, amount: 1 }) */\n projection?: Record<string, 0 | 1>;\n /** Auto-poll interval in ms (optional — no polling by default) */\n refreshInterval?: number;\n /** Auto-refresh when agent completes a MongoDB write (default false) */\n refreshOnAgentComplete?: boolean;\n /** Skip initial fetch (useful for conditional rendering) */\n enabled?: boolean;\n /** Data layer override: 'shared' | 'user' | 'auto' (default: backend decides via app_config) */\n layer?: CollectionLayer;\n /**\n * P0-69: include workspace provenance envelope (`_flowstack`) on every\n * document in the response. Sends `include_provenance=true` on the\n * query string. When true, each document will have a `_flowstack`\n * field with workspace attribution metadata. Default false.\n */\n includeProvenance?: boolean;\n}\n\nexport interface UseCollectionReturn<T> {\n /** Array of documents from the collection */\n documents: T[];\n /** Number of documents returned (≤ limit) */\n count: number;\n /** Total documents matching the filter (for pagination) */\n total: number;\n /** Loading state */\n isLoading: boolean;\n /** Error message if query failed */\n error: string | null;\n /** Manual refresh — re-fetches with current options */\n refresh: () => Promise<void>;\n /** Insert one or more documents. Auto-refetches after success. */\n insert: (doc: Partial<T> | Partial<T>[]) => Promise<{ inserted_ids: string[] }>;\n /** Update documents matching filter. Auto-refetches after success. */\n update: (filter: Record<string, any>, update: Record<string, any>, opts?: { upsert?: boolean }) => Promise<{ modified_count: number }>;\n /** Delete documents matching filter. Auto-refetches after success. */\n remove: (filter: Record<string, any>) => Promise<{ deleted_count: number }>;\n}\n\n// Global event name for collection mutations (from useCollection or agent writes)\nexport const COLLECTION_CHANGED_EVENT = 'flowstack:collection-changed';\n\n/** Dispatch a collection changed event for cross-component sync. */\nfunction dispatchCollectionChanged(collection: string) {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent(COLLECTION_CHANGED_EVENT, { detail: { collection } }),\n );\n }\n}\n\nexport function useCollection<T = Record<string, any>>(\n collection: string,\n options?: UseCollectionOptions,\n): UseCollectionReturn<T> {\n const { credentials, config } = useFlowstack();\n\n const [documents, setDocuments] = useState<T[]>([]);\n const [count, setCount] = useState(0);\n const [total, setTotal] = useState(0);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Track mounted state to prevent state updates after unmount\n const mountedRef = useRef(true);\n useEffect(() => {\n mountedRef.current = true;\n return () => { mountedRef.current = false; };\n }, []);\n\n const enabled = options?.enabled !== false;\n\n const fetchData = useCallback(async () => {\n if (!credentials || !enabled) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await queryCollection<T>(\n credentials,\n collection,\n {\n filter: options?.filter,\n limit: options?.limit,\n skip: options?.skip,\n sort: options?.sort,\n projection: options?.projection,\n layer: options?.layer,\n includeProvenance: options?.includeProvenance,\n },\n { baseUrl: config.baseUrl, tenantId: config.tenantId },\n );\n\n if (!mountedRef.current) return;\n\n if (result.ok && result.data) {\n setDocuments(result.data.documents);\n setCount(result.data.count);\n setTotal(result.data.total);\n } else {\n setError(result.error || 'Failed to fetch collection');\n }\n } catch (err: any) {\n if (mountedRef.current) {\n setError(err.message || 'Network error');\n }\n } finally {\n if (mountedRef.current) {\n setIsLoading(false);\n }\n }\n }, [\n credentials,\n config.baseUrl,\n config.tenantId,\n collection,\n enabled,\n // Serialize options for dependency comparison\n JSON.stringify(options?.filter),\n options?.limit,\n options?.skip,\n JSON.stringify(options?.sort),\n JSON.stringify(options?.projection),\n options?.layer,\n ]);\n\n // Initial fetch + re-fetch on option changes\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n // Optional polling\n useEffect(() => {\n if (!options?.refreshInterval || !enabled) return;\n const interval = setInterval(fetchData, options.refreshInterval);\n return () => clearInterval(interval);\n }, [fetchData, options?.refreshInterval, enabled]);\n\n // Auto-refresh on collection change events (from mutations or agent writes)\n useEffect(() => {\n if (!options?.refreshOnAgentComplete) return;\n const handler = (e: Event) => {\n const detail = (e as CustomEvent)?.detail;\n // Refetch if event targets this collection or is a generic event (no collection specified)\n if (!detail?.collection || detail.collection === collection) {\n fetchData();\n }\n };\n window.addEventListener(COLLECTION_CHANGED_EVENT, handler);\n return () => window.removeEventListener(COLLECTION_CHANGED_EVENT, handler);\n }, [fetchData, options?.refreshOnAgentComplete, collection]);\n\n // --- Mutations ---\n\n const insert = useCallback(async (doc: Partial<T> | Partial<T>[]): Promise<{ inserted_ids: string[] }> => {\n if (!credentials) throw new Error('Not authenticated');\n\n const result = await insertDocuments(\n credentials,\n collection,\n doc as Record<string, any> | Record<string, any>[],\n { baseUrl: config.baseUrl, tenantId: config.tenantId },\n options?.layer,\n );\n\n if (!result.ok) {\n throw new Error(result.error || 'Insert failed');\n }\n\n // Notify other useCollection instances and refetch\n dispatchCollectionChanged(collection);\n await fetchData();\n\n return { inserted_ids: result.data!.inserted_ids };\n }, [credentials, config.baseUrl, config.tenantId, collection, fetchData, options?.layer]);\n\n const update = useCallback(async (\n filter: Record<string, any>,\n updateSpec: Record<string, any>,\n opts?: { upsert?: boolean },\n ): Promise<{ modified_count: number }> => {\n if (!credentials) throw new Error('Not authenticated');\n\n const result = await updateDocuments(\n credentials,\n collection,\n filter,\n updateSpec,\n opts,\n { baseUrl: config.baseUrl, tenantId: config.tenantId },\n options?.layer,\n );\n\n if (!result.ok) {\n throw new Error(result.error || 'Update failed');\n }\n\n dispatchCollectionChanged(collection);\n await fetchData();\n\n return { modified_count: result.data!.modified_count };\n }, [credentials, config.baseUrl, config.tenantId, collection, fetchData, options?.layer]);\n\n const remove = useCallback(async (filter: Record<string, any>): Promise<{ deleted_count: number }> => {\n if (!credentials) throw new Error('Not authenticated');\n\n const result = await deleteDocuments(\n credentials,\n collection,\n filter,\n { baseUrl: config.baseUrl, tenantId: config.tenantId },\n options?.layer,\n );\n\n if (!result.ok) {\n throw new Error(result.error || 'Delete failed');\n }\n\n dispatchCollectionChanged(collection);\n await fetchData();\n\n return { deleted_count: result.data!.deleted_count };\n }, [credentials, config.baseUrl, config.tenantId, collection, fetchData, options?.layer]);\n\n return {\n documents,\n count,\n total,\n isLoading,\n error,\n refresh: fetchData,\n insert,\n update,\n remove,\n };\n}\n","'use client';\n\n/**\n * useAgent Hook\n *\n * The main hook for interacting with AI agents. Supports pre-configured templates\n * and streaming responses with tool calls.\n *\n * @example\n * ```tsx\n * function ChatApp() {\n * const { query, messages, isStreaming, toolCalls, clearMessages } = useAgent('data-science');\n *\n * const handleSend = async (input: string) => {\n * await query(input);\n * };\n *\n * return (\n * <div>\n * {messages.map(m => (\n * <div key={m.id} className={m.role}>\n * {m.content}\n * </div>\n * ))}\n * {isStreaming && <div>Thinking...</div>}\n * <input onKeyDown={(e) => e.key === 'Enter' && handleSend(e.currentTarget.value)} />\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback, useRef, useEffect, useMemo } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport type { UseAgentReturn, UseAgentOptions, ChatMessage, ToolCall, AgentTemplate, VisualizationData, InterruptInfo, DataSourceBadgeInfo, PiiRedactedEntity, AttachmentInput } from '../types';\nimport { executeQueryWithConfig, uploadFile, uploadDocument } from '../api/client';\nimport { parseSSEStream } from '../utils/sse-parser';\nimport { mockDelay, mockChatHistory } from '../mock/fixtures';\nimport { isJsonBlob, summarizeJsonEvent, dedupeContent, cleanContent, parseErrorMessage, unflattenMarkdownTables } from '../utils/stream-utils';\nimport { COLLECTION_CHANGED_EVENT } from './useCollection';\n\n// P0-132 (G3): tool names whose completion should trigger a useCollection\n// refresh (refreshOnAgentComplete). The old gate only matched the legacy\n// mongodb_insert/update/delete names, but the real backend write tools are the\n// document/app-data tools below — so reactive refresh silently never fired and\n// apps had to call collection.refresh() manually. The legacy names are kept for\n// back-compat with any older backend build.\nconst COLLECTION_WRITE_TOOLS = new Set<string>([\n 'insert_documents',\n 'update_documents',\n 'delete_documents',\n 'insert_app_data',\n 'update_app_data',\n 'delete_app_data',\n // legacy aliases\n 'mongodb_insert',\n 'mongodb_update',\n 'mongodb_delete',\n]);\n\n// =============================================================================\n// Standalone Agent Service (mock mode → real GPT-4o-mini)\n// =============================================================================\n\n/**\n * Template system prompts for auto-provisioning agents.\n * Extracted from intent-analyzer DEFAULT_PATTERNS.\n */\nconst TEMPLATE_SYSTEM_PROMPTS: Record<string, string> = {\n 'data-science': `You are a data analyst specializing in exploratory data analysis.\nFocus on:\n- Statistical summaries and distributions\n- Identifying patterns, correlations, and anomalies\n- Providing actionable insights with supporting evidence\n- Creating clear visualizations when helpful\n\nAlways explain your methodology and confidence levels.`,\n 'marketing': `You are a content strategist and copywriter.\nFocus on:\n- Clear, engaging writing tailored to the audience\n- SEO optimization where appropriate\n- Consistent brand voice and messaging\n- Actionable calls-to-action\n\nAlways ask about target audience if unclear.`,\n 'support': `You are a customer support specialist.\nFocus on:\n- Understanding the customer's problem quickly\n- Providing clear, step-by-step solutions\n- Escalating when necessary\n- Being empathetic and professional\n\nAlways verify the solution works before closing.`,\n 'custom': 'You are a helpful AI assistant.',\n};\n\n/**\n * In-memory credentials for auto-provisioned agent sessions.\n * Intentionally NOT persisted to localStorage — every browser session\n * auto-provisions fresh. This avoids exposing API keys to XSS attacks\n * at the cost of a sub-cent auto-provision call per page load.\n */\ninterface AgentCredentials {\n api_key: string;\n tenant_id: string;\n thread_id?: string;\n}\n\n/** Module-level store — lives for the lifetime of the JS context only */\nlet agentCredentialsCache: AgentCredentials | null = null;\n\n/**\n * Generate unique ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Generate mock response based on prompt keywords\n */\nfunction getMockResponse(prompt: string): string {\n const lowerPrompt = prompt.toLowerCase();\n\n if (lowerPrompt.includes('customer') || lowerPrompt.includes('revenue')) {\n return `I analyzed your customer data and found some interesting insights:\n\n**Top Findings:**\n1. Your top 10 customers account for 45% of total revenue\n2. Customer retention rate is 78% (above industry average)\n3. Average order value has increased 12% this quarter\n\n**Recommendations:**\n- Consider implementing a loyalty program for high-value customers\n- Focus marketing efforts on the 25-34 age demographic\n- Investigate churn patterns in the \"Enterprise\" segment\n\nWould you like me to create a visualization of these trends?`;\n }\n\n if (lowerPrompt.includes('analyze') || lowerPrompt.includes('analysis')) {\n return `I've completed the analysis of your data. Here's what I found:\n\n**Summary Statistics:**\n- Total records: 10,432\n- Time period: Jan 2024 - Dec 2024\n- Completeness: 98.5%\n\n**Key Insights:**\n- Significant growth trend detected (r² = 0.87)\n- Seasonal patterns observed in Q4\n- 3 potential outliers identified for review\n\nWould you like me to dive deeper into any specific area?`;\n }\n\n if (lowerPrompt.includes('chart') || lowerPrompt.includes('visual') || lowerPrompt.includes('plot')) {\n return `I've created a visualization based on your request. The chart shows the distribution of your data over time.\n\n**Chart Details:**\n- Type: Line chart with trend overlay\n- X-axis: Time period (monthly)\n- Y-axis: Values (normalized)\n\nThe visualization has been saved to your workspace. You can find it in the Visualizations tab.\n\nWould you like me to create additional views or modify this chart?`;\n }\n\n // Default response\n return `I understand you're asking about: \"${prompt}\"\n\nIn **mock mode**, I'm simulating a response without connecting to the backend. This helps you:\n- Test your UI components\n- Develop without network dependencies\n- Validate user flows\n\nTo connect to a real AI agent, change your config:\n\\`\\`\\`tsx\n<FlowstackProvider config={{ ...config, mode: 'production' }}>\n\\`\\`\\`\n\nIs there anything specific you'd like to test?`;\n}\n\n/**\n * Reconstruct a `File` from the base64 wire format. Browser-only — `atob` and\n * `File` are window globals. We accept the encoded form because that's what\n * existing chat-input components produce; native `File` callers skip this.\n */\nfunction decodeAttachment(att: { filename: string; content_type: string; data: string }): File {\n const binary = atob(att.data);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return new File([bytes], att.filename, { type: att.content_type });\n}\n\n/**\n * Extensions the backend's /upload route parses into a queryable DataFrame.\n * Anything else routes through /upload-document, which stores raw bytes for\n * the agent's ingest_document / search_documents tools. Without this split,\n * a PDF/PNG/DOCX attachment 400s with \"Unsupported file type\" because /upload\n * is dataset-only. Set is intentionally narrow: .txt and .md fall through to\n * /upload-document since chat users typically attach those to discuss, not to\n * query as tab-separated tables.\n */\nconst TABULAR_EXTS = new Set([\n 'csv', 'tsv', 'xlsx', 'xls', 'parquet', 'json', 'jsonl', 'avro', 'h5', 'hdf5', 'pkl',\n]);\n\nfunction _fileExt(filename: string): string {\n const i = filename.lastIndexOf('.');\n return i === -1 ? '' : filename.slice(i + 1).toLowerCase();\n}\n\n/**\n * Hook for AI agent interactions\n * @param template - Agent template to use (default: 'data-science'). NOTE\n * (P0-132 / G6): for apps whose brain is a registered persona, this template\n * only sets a fallback agent_name + default instructions that the persona\n * overrides — it does NOT mean the app runs on a \"data-science parent agent\".\n * Pass a persona via `options.persona` (G4) to target it explicitly, or\n * `options.systemPrompt` (G5) for an inline prompt. The default is fine for\n * persona-backed apps; 'custom' is the honest label when no template applies.\n */\nexport function useAgent(template: AgentTemplate = 'data-science', options?: UseAgentOptions): UseAgentReturn {\n const {\n credentials,\n selectedWorkspace,\n messages,\n addMessage,\n updateMessage,\n clearMessages: contextClear,\n setIsQueryRunning,\n setQueryStartTime,\n addVisualization,\n refreshDatasets,\n refreshVisualizations,\n config,\n } = useFlowstack();\n\n const [isStreaming, setIsStreaming] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [toolCalls, setToolCalls] = useState<ToolCall[]>([]);\n const [error, setError] = useState<string | null>(null);\n const [pendingInterrupts, setPendingInterrupts] = useState<InterruptInfo[] | null>(null);\n const [connectedDataSources, setConnectedDataSources] = useState<DataSourceBadgeInfo[]>([]);\n\n const abortControllerRef = useRef<AbortController | null>(null);\n const currentMessageIdRef = useRef<string | null>(null);\n const pendingPromptRef = useRef<string | null>(null);\n // When true, the NEXT query() call sends force_new_session=true so the\n // backend creates a new conversation on its end (not just cleared frontend state).\n const forceNewSessionRef = useRef<boolean>(false);\n // Persist session_id to sessionStorage so the backend can reload conversation\n // history after a page refresh. Without this, each refresh creates a new session.\n // P0-132 (G8): namespace the key by an optional per-instance sessionKey so two\n // useAgent instances in the same app (e.g. an interview chat and a matchmaker)\n // hold independent conversations instead of sharing one tenant-wide session\n // (which caused replies to bleed across surfaces). Omitting sessionKey keeps the\n // legacy tenant-shared key, so existing single-surface apps are unaffected.\n const sessionStorageKey = `flowstack:session_id:${config.tenantId || 'default'}${\n options?.sessionKey ? `:${options.sessionKey}` : ''\n }`;\n const sessionIdRef = useRef<string | null>(\n typeof window !== 'undefined' ? sessionStorage.getItem(sessionStorageKey) : null\n );\n\n const clientConfig = useMemo(() => ({\n baseUrl: config.baseUrl,\n tenantId: config.tenantId,\n }), [config.baseUrl, config.tenantId]);\n\n const isMockMode = config.mode === 'mock';\n\n /**\n * Execute a query to the agent\n */\n const query = useCallback(async (prompt: string, attachments?: AttachmentInput[], allowedTerms?: string[]): Promise<void> => {\n if (isStreaming) {\n console.warn('[useAgent] Query already in progress, ignoring');\n return;\n }\n\n setError(null);\n\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n return;\n }\n\n if (!selectedWorkspace && !isMockMode) {\n // Workspace auto-create may still be in flight — queue and retry once it resolves\n pendingPromptRef.current = prompt;\n return;\n }\n\n // Upload attachments BEFORE streaming. The `/stream` endpoint has no\n // attachment field on the wire — files have to land as workspace\n // datasets first, then the agent picks them up via list_datasets/get_dataset.\n // We bail out (rather than silently sending the prompt without the file)\n // because the alternative is the agent hallucinating a substitute dataset\n // from the user's library.\n let finalPrompt = prompt;\n let attachmentNames: string[] | undefined;\n if (attachments && attachments.length > 0 && !isMockMode && credentials && selectedWorkspace) {\n const uploaded: string[] = [];\n const datasetNames: string[] = [];\n const documentNames: string[] = [];\n for (const att of attachments) {\n const file = att instanceof File ? att : decodeAttachment(att);\n const ext = _fileExt(file.name);\n const isTabular = TABULAR_EXTS.has(ext);\n const res = isTabular\n ? await uploadFile(credentials, selectedWorkspace.workspaceId, file, file.name, clientConfig)\n : await uploadDocument(credentials, selectedWorkspace.workspaceId, file, file.name, clientConfig);\n if (!res.ok) {\n setError(`Failed to upload ${file.name}: ${res.error || 'unknown error'}`);\n return;\n }\n const resolvedName = isTabular\n ? ((res.data as any)?.dataset?.name || (res.data as any)?.report?.name || file.name)\n : ((res.data as any)?.document_name || file.name);\n uploaded.push(resolvedName);\n (isTabular ? datasetNames : documentNames).push(resolvedName);\n }\n attachmentNames = uploaded;\n // Type-tagged hints route the agent to the right tool. Without these,\n // Gemini wrote PdfReader(\"X.pdf\") in a Daytona sandbox for a PDF — the\n // attached file existed but the agent had to guess the tool from the\n // extension alone. With explicit tool hints, datasets go through the\n // SQL/dataframe path and documents go through ingest/search, sidestepping\n // Daytona entirely for non-tabular files.\n const hints: string[] = [];\n if (datasetNames.length > 0) {\n hints.push(`[Attached dataset${datasetNames.length > 1 ? 's' : ''}: ${datasetNames.join(', ')} — use list_datasets / get_dataset / query_dataset_sql]`);\n }\n if (documentNames.length > 0) {\n hints.push(`[Attached document${documentNames.length > 1 ? 's' : ''}: ${documentNames.join(', ')} — use ingest_document / search_documents]`);\n }\n finalPrompt = `${hints.join('\\n')}\\n${prompt}`;\n // Refresh the dataset list in context so any panels that read it\n // see the new file without waiting for a manual refresh.\n try { await refreshDatasets?.(); } catch {}\n }\n\n // Add user message — use the original prompt so the chat UI shows what\n // the user typed, not the attachment-prefixed wire form.\n const userMessage: ChatMessage = {\n id: generateId(),\n role: 'user',\n content: prompt,\n timestamp: new Date(),\n attachmentNames,\n };\n addMessage(userMessage);\n const userMessageId = userMessage.id; // P0-57: capture for PII metadata attachment\n\n // Create assistant message placeholder\n const assistantId = generateId();\n currentMessageIdRef.current = assistantId;\n const assistantMessage: ChatMessage = {\n id: assistantId,\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n isStreaming: true,\n toolCalls: [],\n visualizations: [],\n };\n addMessage(assistantMessage);\n\n // Set loading state\n setIsStreaming(true);\n setIsLoading(true);\n setIsQueryRunning(true);\n setQueryStartTime(Date.now());\n setToolCalls([]);\n\n // Mock mode — route to standalone agent service if configured,\n // otherwise fall back to canned keyword-matched responses.\n if (isMockMode) {\n if (config.agentServiceUrl) {\n // ── Standalone agent service path (real GPT-4o-mini) ──────────\n abortControllerRef.current = new AbortController();\n let fullContent = '';\n\n try {\n // Bootstrap: auto-provision agent on first query per session\n if (!agentCredentialsCache) {\n const provisionRes = await fetch(`${config.agentServiceUrl}/openai/auto-provision`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n template: template || config.agentTemplate || 'data-science',\n agent_name: `${template || config.agentTemplate || 'data-science'}-agent`,\n instructions: TEMPLATE_SYSTEM_PROMPTS[template || config.agentTemplate || 'data-science'] || TEMPLATE_SYSTEM_PROMPTS['custom'],\n model: 'gpt-4o-mini',\n }),\n });\n\n if (!provisionRes.ok) {\n throw new Error(`Auto-provision failed: ${provisionRes.status}`);\n }\n\n const provisionData = await provisionRes.json();\n agentCredentialsCache = {\n api_key: provisionData.api_key,\n tenant_id: provisionData.tenant_id,\n };\n }\n\n // Chat call — SSE stream from /openai/chat\n const chatRes = await fetch(`${config.agentServiceUrl}/openai/chat`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${agentCredentialsCache.api_key}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n message: prompt,\n thread_id: agentCredentialsCache.thread_id,\n }),\n signal: abortControllerRef.current.signal,\n });\n\n if (!chatRes.ok) {\n throw new Error(`Agent chat failed: ${chatRes.status}`);\n }\n\n if (!chatRes.body) {\n throw new Error('No response body from agent service');\n }\n\n const reader = chatRes.body.getReader();\n\n // Reuse the same SSE parser + event switch as production.\n // The openai-agent backend now emits event:delta + {\"delta\":{\"text\":\"...\"}}\n // which parseSSEStream normalizes into StreamEvent with type='delta'.\n for await (const event of parseSSEStream(reader)) {\n if (abortControllerRef.current?.signal.aborted) break;\n\n switch (event.type) {\n case 'text':\n case 'content':\n case 'delta':\n if (event.content) {\n fullContent += event.content;\n updateMessage(assistantId, { content: fullContent });\n }\n break;\n\n case 'error':\n setError(event.error || 'Agent query failed');\n break;\n\n case 'done':\n case 'complete': {\n // Extract thread_id for multi-turn conversation\n const completeData = event.data as Record<string, unknown> | undefined;\n if (completeData?.thread_id) {\n agentCredentialsCache!.thread_id = completeData.thread_id as string;\n }\n break;\n }\n }\n }\n\n updateMessage(assistantId, {\n content: fullContent,\n isStreaming: false,\n });\n } catch (err) {\n // Network error → fall back to canned mock responses\n const isFetchError = err instanceof TypeError || (err instanceof Error && err.message.includes('fetch'));\n if (isFetchError) {\n console.warn('[useAgent] Agent service unreachable, falling back to mock responses');\n const mockResponse = getMockResponse(prompt);\n updateMessage(assistantId, {\n content: mockResponse,\n isStreaming: false,\n });\n } else {\n const message = err instanceof Error ? err.message : 'Agent query failed';\n setError(message);\n updateMessage(assistantId, {\n content: fullContent || `Error: ${message}`,\n isStreaming: false,\n });\n }\n } finally {\n setIsStreaming(false);\n setIsLoading(false);\n setIsQueryRunning(false);\n setQueryStartTime(null);\n currentMessageIdRef.current = null;\n abortControllerRef.current = null;\n }\n return;\n }\n\n // ── Canned mock responses (no agentServiceUrl configured) ────────\n try {\n await mockDelay(500, 1000);\n\n const mockResponse = getMockResponse(prompt);\n let streamedContent = '';\n\n for (let i = 0; i < mockResponse.length; i += 3) {\n if (abortControllerRef.current?.signal.aborted) break;\n streamedContent += mockResponse.slice(i, i + 3);\n updateMessage(assistantId, { content: streamedContent });\n await mockDelay(10, 30);\n }\n\n updateMessage(assistantId, {\n content: mockResponse,\n isStreaming: false,\n });\n } finally {\n setIsStreaming(false);\n setIsLoading(false);\n setIsQueryRunning(false);\n setQueryStartTime(null);\n currentMessageIdRef.current = null;\n }\n return;\n }\n\n // Create abort controller for cancellation\n abortControllerRef.current = new AbortController();\n\n // Track content outside try block for error handling\n let fullContent = '';\n\n try {\n const networkMode = config.agentTemplate === 'marketing' ? 'PUBLIC' : 'SANDBOX';\n const response = await executeQueryWithConfig(\n credentials!,\n finalPrompt,\n selectedWorkspace!.workspaceId,\n {\n networkMode,\n tools: options?.tools,\n capabilities: options?.capabilities,\n sessionId: sessionIdRef.current || undefined,\n forceNewSession: forceNewSessionRef.current || undefined,\n allowedTerms,\n // P0-132 (G5): forward an inline system-prompt override (was dropped).\n systemPrompt: options?.systemPrompt,\n // P0-132 (G4): target a specific registered persona (maps to\n // target_agents on the wire). persona wins over the agentName alias.\n persona: options?.persona ?? options?.agentName,\n },\n clientConfig\n );\n\n if (!response.body) {\n throw new Error('No response body');\n }\n\n const reader = response.body.getReader();\n const currentToolCalls: ToolCall[] = [];\n const currentVisualizations: VisualizationData[] = [];\n\n // ── Process SSE stream ────────────────────────────────────────────\n //\n // V2 BACKEND EVENT FLOW:\n //\n // 1. metadata → session/workspace/tenant IDs (ignored here)\n // 2. delta → incremental text tokens: {content: \"token\"}\n // Appended to fullContent for real-time display.\n // 3. tool_call → tool invocation: {tool: \"name\", args: {...}}\n // Added to currentToolCalls, shown as \"running\".\n // 4. tool_result → tool output: {result: \"...\", tool: undefined}\n // Matched to running tool call, status → \"complete\".\n // 5. text → final accumulated text: {content: \"full response\"}\n // Appended like any other text event.\n // 6. complete → stream end: {event_count: N, execution_ms: N}\n // Terminates the loop.\n //\n // The SSE parser (sse-parser.ts) normalizes all backend formats\n // into StreamEvent objects before they reach this switch.\n // ────────────────────────────────────────────────────────────────\n for await (const event of parseSSEStream(reader)) {\n // Check if user cancelled the query\n if (abortControllerRef.current?.signal.aborted) {\n break;\n }\n\n switch (event.type) {\n // ── METADATA ───────────────────────────────────────────────\n // First event from v2 backend with session info + data sources.\n // Extract connected data sources for badge display.\n case 'metadata': {\n const metaData = event.data as Record<string, unknown> | undefined;\n if (metaData?.session_id && typeof metaData.session_id === 'string') {\n // Backend assigned a new session_id — store it and clear the\n // force_new_session flag so subsequent turns continue this session.\n sessionIdRef.current = metaData.session_id;\n forceNewSessionRef.current = false;\n if (typeof window !== 'undefined') {\n sessionStorage.setItem(sessionStorageKey, metaData.session_id);\n }\n }\n if (metaData?.data_sources && Array.isArray(metaData.data_sources)) {\n setConnectedDataSources(metaData.data_sources as DataSourceBadgeInfo[]);\n }\n // P0-57: Attach PII masking report to the user message\n if (metaData?.pii_redacted && Array.isArray(metaData.pii_redacted) && metaData.pii_redacted.length > 0) {\n updateMessage(userMessageId, {\n piiRedacted: metaData.pii_redacted as PiiRedactedEntity[],\n });\n }\n break;\n }\n\n // ── TEXT STREAMING ─────────────────────────────────────────\n // 'delta' = incremental token from v2 backend\n // 'text' = final accumulated text from v2, or Anthropic raw\n // 'content' = generic text fallback\n // All append to fullContent for progressive UI rendering.\n case 'text':\n case 'content':\n case 'delta':\n if (event.content) {\n // Filter raw JSON blobs — show summary in statusLine instead\n if (isJsonBlob(event.content)) {\n const summary = summarizeJsonEvent(event.content);\n if (summary) {\n updateMessage(assistantId, { statusLine: summary });\n }\n break;\n }\n\n // MonoSage backend emits {\"type\": \"text\", \"content\": chunk} for EVERY\n // streaming token — there is no separate \"delta\" type in this path.\n // Both 'text' and 'delta' events are incremental chunks: always append.\n // Never replace, never skip based on length — all chunks must accumulate.\n fullContent += event.content;\n const displayContent = unflattenMarkdownTables(fullContent);\n updateMessage(assistantId, { content: displayContent, statusLine: undefined });\n }\n break;\n\n // ── TOOL CALLS ─────────────────────────────────────────────\n // V2 emits: event.tool = tool name (from data.name),\n // event.args = tool arguments (from data.args)\n // Parsed by normalizeEvent's tool format branch (section 4).\n case 'tool_call':\n case 'tool_use':\n if (event.tool) {\n // Deduplicate: if this tool is already running, don't add another entry.\n // The swarm re-broadcasts inner pipeline tool_call events, causing\n // the same tool to appear many times in the stream.\n const alreadyRunning = currentToolCalls.some(\n tc => tc.name === event.tool && tc.status === 'running'\n );\n if (alreadyRunning) break;\n\n const toolCall: ToolCall = {\n id: generateId(),\n toolUseId: event.args?.tool_use_id as string,\n name: event.tool,\n args: event.args,\n status: 'running',\n startTime: Date.now(),\n };\n currentToolCalls.push(toolCall);\n setToolCalls([...currentToolCalls]);\n updateMessage(assistantId, { toolCalls: [...currentToolCalls] });\n }\n break;\n\n // ── TOOL RESULTS ───────────────────────────────────────────\n // V2 emits: tool_use_id, content, status\n // event.tool may be undefined (v2 doesn't include tool name\n // in results), so we fall back to finding the first running\n // tool call in the list.\n case 'tool_result':\n if (event.tool || event.toolUseId || currentToolCalls.length > 0) {\n // Match by toolUseId first, then name, then first running tool\n let toolIndex = -1;\n if (event.toolUseId) {\n toolIndex = currentToolCalls.findIndex(tc => tc.toolUseId === event.toolUseId);\n }\n if (toolIndex < 0 && event.tool) {\n toolIndex = currentToolCalls.findIndex(tc => tc.name === event.tool && tc.status === 'running');\n }\n if (toolIndex < 0) {\n toolIndex = currentToolCalls.findIndex(tc => tc.status === 'running');\n }\n if (toolIndex >= 0) {\n const completedTool = currentToolCalls[toolIndex];\n currentToolCalls[toolIndex] = {\n ...completedTool,\n // P0-132 (G1): the backend emits the tool's return value under\n // `content` (normalized to event.content); `event.result` is only\n // populated by legacy/alternate event shapes. Reading content first\n // makes structured tool output actually reach toolCalls[].result —\n // previously it was always undefined.\n result: event.content ?? event.result,\n // P0-132 (G1): mark a failed tool call as 'error' (backend\n // is_error flag) instead of silently reporting 'complete'.\n status: event.isError ? 'error' : 'complete',\n endTime: Date.now(),\n };\n setToolCalls([...currentToolCalls]);\n updateMessage(assistantId, { toolCalls: [...currentToolCalls] });\n\n // Emit collection-changed event for useCollection reactive updates.\n // P0-132 (G3): match the real backend write tools (see\n // COLLECTION_WRITE_TOOLS) so refreshOnAgentComplete fires. A failed\n // write (is_error) must NOT trigger a refresh.\n const toolName = completedTool.name || '';\n if (COLLECTION_WRITE_TOOLS.has(toolName) && !event.isError) {\n window.dispatchEvent(new CustomEvent(COLLECTION_CHANGED_EVENT, {\n detail: { tool: toolName },\n }));\n }\n }\n }\n break;\n\n // ── PROGRESS (swarm agent text) ──────────────────────────────\n // During swarm execution, specialist agents stream text as\n // 'progress' events. Append to main content AND to the matching\n // tool call's agentResponse so CasinoDemo can render it.\n case 'progress':\n if (event.message) {\n // Skip heartbeat keepalive events — they're for connection stability only\n const progressData = event.data as Record<string, unknown> | undefined;\n if (progressData?.progressType === 'heartbeat') break;\n\n // Filter JSON progress events — show summary instead\n if (isJsonBlob(event.message)) {\n const summary = summarizeJsonEvent(event.message, event.tool);\n if (summary) {\n updateMessage(assistantId, { statusLine: summary });\n }\n break;\n }\n\n // Progress events show tool activity in the status line.\n // They do NOT append to fullContent — the backend's final 'text' event\n // is the authoritative complete response. Mixing progress text into\n // fullContent caused doubled/garbled content when the 'text' event arrived.\n updateMessage(assistantId, {\n statusLine: event.tool\n ? `${event.tool}: ${event.message.substring(0, 80)}`\n : event.message.substring(0, 100),\n });\n\n // Track progress text on the matching tool call's agentResponse\n // (used by tool call UI to show what the agent said during the tool run)\n if (currentToolCalls.length > 0) {\n let idx = -1;\n if (event.tool) {\n for (let i = currentToolCalls.length - 1; i >= 0; i--) {\n if (currentToolCalls[i].name === event.tool) { idx = i; break; }\n }\n }\n if (idx < 0) {\n for (let i = currentToolCalls.length - 1; i >= 0; i--) {\n if (currentToolCalls[i].status === 'running') { idx = i; break; }\n }\n }\n if (idx >= 0) {\n const prev = currentToolCalls[idx].agentResponse || '';\n const sep = prev.length > 0 && !prev.endsWith(' ') && !prev.endsWith('\\n') ? ' ' : '';\n currentToolCalls[idx] = {\n ...currentToolCalls[idx],\n agentResponse: prev + sep + event.message,\n };\n setToolCalls([...currentToolCalls]);\n updateMessage(assistantId, { toolCalls: [...currentToolCalls] });\n }\n }\n }\n break;\n\n // ── VISUALIZATIONS ─────────────────────────────────────────\n case 'visualization':\n if (event.data) {\n const viz = event.data as VisualizationData;\n currentVisualizations.push(viz);\n addVisualization(viz);\n updateMessage(assistantId, { visualizations: [...currentVisualizations] });\n }\n break;\n\n // ── INTERRUPT ─────────────────────────────────────────────\n case 'interrupt':\n if (event.data) {\n setPendingInterrupts([event.data as InterruptInfo]);\n }\n break;\n\n // ── ERRORS ─────────────────────────────────────────────────\n case 'error': {\n const parsed = parseErrorMessage(event.error || 'Query failed');\n setError(parsed.message);\n break;\n }\n\n // ── STREAM END ─────────────────────────────────────────────\n // 'complete' = v2 stream termination (with event_count, execution_ms)\n // 'done' = OpenAI-style [DONE] signal\n case 'done':\n case 'complete': {\n const completeData = event.data as Record<string, unknown> | undefined;\n if (completeData?.stop_reason === 'interrupt') {\n // Keep pendingInterrupts set — agent was interrupted\n }\n break;\n }\n }\n }\n\n // Finalize any tool calls still marked as 'running'\n const now = Date.now();\n for (let i = 0; i < currentToolCalls.length; i++) {\n if (currentToolCalls[i].status === 'running') {\n currentToolCalls[i] = { ...currentToolCalls[i], status: 'complete', endTime: now };\n }\n }\n\n // Apply content cleaning pipeline (table repair only).\n // dedupeContent is intentionally removed — it used heuristic half-split\n // detection that triggered false positives on structured responses (numbered\n // lists, repeated headers) and truncated valid content to its second half.\n const cleanedContent = cleanContent(fullContent);\n\n // Mark message as complete\n updateMessage(assistantId, {\n content: cleanedContent,\n isStreaming: false,\n toolCalls: currentToolCalls,\n visualizations: currentVisualizations,\n statusLine: undefined,\n });\n\n // Refresh artifacts if tools were used\n if (currentToolCalls.length > 0) {\n await Promise.all([\n refreshDatasets(),\n refreshVisualizations(),\n ]);\n }\n\n } catch (err) {\n const raw = err instanceof Error ? err.message : 'Query failed';\n const parsed = parseErrorMessage(raw);\n setError(parsed.message);\n\n // Update message with error\n updateMessage(assistantId, {\n content: fullContent || `Error: ${parsed.message}`,\n isStreaming: false,\n });\n } finally {\n setIsStreaming(false);\n setIsLoading(false);\n setIsQueryRunning(false);\n setQueryStartTime(null);\n currentMessageIdRef.current = null;\n abortControllerRef.current = null;\n }\n }, [\n isStreaming,\n credentials,\n selectedWorkspace,\n addMessage,\n updateMessage,\n setIsQueryRunning,\n setQueryStartTime,\n addVisualization,\n refreshDatasets,\n refreshVisualizations,\n config,\n clientConfig,\n isMockMode,\n template,\n ]);\n\n // Flush pending prompt once workspace is available\n useEffect(() => {\n if (selectedWorkspace && pendingPromptRef.current) {\n const pending = pendingPromptRef.current;\n pendingPromptRef.current = null;\n query(pending);\n }\n }, [selectedWorkspace, query]);\n\n /**\n * Clear all messages\n */\n const clearMessages = useCallback(() => {\n setError(null);\n setToolCalls([]);\n sessionIdRef.current = null;\n if (typeof window !== 'undefined') {\n sessionStorage.removeItem(sessionStorageKey);\n }\n contextClear();\n }, [contextClear, sessionStorageKey]);\n\n /**\n * Start a genuinely new backend conversation.\n *\n * Unlike `clearMessages()` which only clears frontend state, this also\n * tells the backend to create a new session on the next `query()` call via\n * `force_new_session=true`. The backend derives app session IDs\n * deterministically from (tenant, user, app_scope) — without this flag,\n * the old conversation history is always reloaded regardless of what the\n * frontend cleared.\n *\n * Usage in a built app:\n * ```tsx\n * const { startNewSession } = useAgent(undefined, { targetAgents: ['my_agent'] });\n * <button onClick={startNewSession}>New conversation</button>\n * ```\n */\n const startNewSession = useCallback(() => {\n setError(null);\n setToolCalls([]);\n sessionIdRef.current = null;\n forceNewSessionRef.current = true; // ← tells backend to create new session\n if (typeof window !== 'undefined') {\n sessionStorage.removeItem(sessionStorageKey);\n }\n contextClear();\n }, [contextClear, sessionStorageKey]);\n\n /**\n * Cancel the current query\n */\n const cancelQuery = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n // Mark current message as cancelled\n if (currentMessageIdRef.current) {\n updateMessage(currentMessageIdRef.current, {\n content: '*(Query cancelled)*',\n isStreaming: false,\n });\n }\n\n setIsStreaming(false);\n setIsLoading(false);\n setIsQueryRunning(false);\n setQueryStartTime(null);\n setPendingInterrupts(null);\n }, [updateMessage, setIsQueryRunning, setQueryStartTime]);\n\n /**\n * Interrupt the currently running agent\n */\n const interruptAgent = useCallback(async () => {\n if (!credentials || !selectedWorkspace) return;\n\n const baseUrl = clientConfig.baseUrl || 'https://sage-api.flowstack.fun';\n const tenantId = credentials.tenantId || clientConfig.tenantId || '';\n\n await fetch(`${baseUrl}/stream/interrupt`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': tenantId,\n 'X-User-ID': credentials.userId || '',\n },\n body: JSON.stringify({\n workspace_id: selectedWorkspace.workspaceId,\n reason: '',\n }),\n });\n }, [credentials, selectedWorkspace, clientConfig]);\n\n /**\n * Respond to a pending interrupt by clearing the interrupt state and sending a new query\n */\n const respondToInterrupt = useCallback(async (message: string) => {\n setPendingInterrupts(null);\n await query(message);\n }, [query]);\n\n return {\n query,\n messages,\n isStreaming,\n isLoading,\n toolCalls,\n error,\n pendingInterrupts,\n connectedDataSources,\n clearMessages,\n startNewSession,\n cancelQuery,\n interruptAgent,\n respondToInterrupt,\n };\n}\n","'use client';\n\n/**\n * useQuery Hook\n *\n * A lower-level hook for executing queries without managing chat history.\n * Use this when you need direct control over query execution.\n *\n * @example\n * ```tsx\n * function AnalysisRunner() {\n * const { execute, isStreaming, result, toolCalls, visualizations } = useQuery();\n *\n * const analyze = async () => {\n * await execute('analyze sales data and create a chart');\n * };\n *\n * return (\n * <div>\n * <button onClick={analyze} disabled={isStreaming}>Run Analysis</button>\n * {result && <div>{result}</div>}\n * {visualizations.map(v => <img key={v.name} src={v.imageUrl} />)}\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback, useRef } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport type { UseQueryReturn, ToolCall, VisualizationData, QueryOptions } from '../types';\nimport { executeQueryWithConfig } from '../api/client';\nimport { parseSSEStream } from '../utils/sse-parser';\n\n/**\n * Generate unique ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Hook for direct query execution\n */\nexport function useQuery(): UseQueryReturn {\n const {\n credentials,\n selectedWorkspace,\n addVisualization,\n config,\n } = useFlowstack();\n\n const [isStreaming, setIsStreaming] = useState(false);\n const [result, setResult] = useState<string | null>(null);\n const [toolCalls, setToolCalls] = useState<ToolCall[]>([]);\n const [visualizations, setVisualizations] = useState<VisualizationData[]>([]);\n const [error, setError] = useState<string | null>(null);\n\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const clientConfig = {\n baseUrl: config.baseUrl,\n tenantId: config.tenantId,\n };\n\n /**\n * Execute a query\n */\n const execute = useCallback(async (\n prompt: string,\n options?: QueryOptions\n ): Promise<void> => {\n setError(null);\n setResult(null);\n setToolCalls([]);\n setVisualizations([]);\n\n if (!credentials) {\n setError('Not authenticated');\n return;\n }\n\n const workspaceId = options?.workspaceId || selectedWorkspace?.workspaceId;\n if (!workspaceId) {\n setError('No workspace selected');\n return;\n }\n\n setIsStreaming(true);\n abortControllerRef.current = new AbortController();\n\n try {\n const response = await executeQueryWithConfig(\n credentials,\n prompt,\n workspaceId,\n { networkMode: options?.networkMode || 'SANDBOX', tools: options?.tools },\n clientConfig\n );\n\n if (!response.body) {\n throw new Error('No response body');\n }\n\n const reader = response.body.getReader();\n let fullContent = '';\n const currentToolCalls: ToolCall[] = [];\n const currentVisualizations: VisualizationData[] = [];\n\n // Process SSE stream\n for await (const event of parseSSEStream(reader)) {\n // Check if cancelled\n if (abortControllerRef.current?.signal.aborted) {\n break;\n }\n\n switch (event.type) {\n case 'text':\n case 'content':\n case 'delta':\n if (event.content) {\n fullContent += event.content;\n setResult(fullContent);\n }\n break;\n\n case 'tool_call':\n case 'tool_use':\n if (event.tool) {\n const toolCall: ToolCall = {\n id: generateId(),\n toolUseId: event.args?.tool_use_id as string,\n name: event.tool,\n args: event.args,\n status: 'running',\n startTime: Date.now(),\n };\n currentToolCalls.push(toolCall);\n setToolCalls([...currentToolCalls]);\n }\n break;\n\n case 'tool_result':\n if (event.tool || currentToolCalls.length > 0) {\n const toolIndex = currentToolCalls.findIndex(\n tc => tc.name === event.tool || tc.status === 'running'\n );\n if (toolIndex >= 0) {\n currentToolCalls[toolIndex] = {\n ...currentToolCalls[toolIndex],\n result: event.result,\n status: 'complete',\n endTime: Date.now(),\n };\n setToolCalls([...currentToolCalls]);\n }\n }\n break;\n\n case 'visualization':\n if (event.data) {\n const viz = event.data as VisualizationData;\n currentVisualizations.push(viz);\n setVisualizations([...currentVisualizations]);\n addVisualization(viz);\n }\n break;\n\n case 'error':\n setError(event.error || 'Query failed');\n break;\n }\n }\n\n setResult(fullContent);\n\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Query failed';\n setError(message);\n } finally {\n setIsStreaming(false);\n abortControllerRef.current = null;\n }\n }, [credentials, selectedWorkspace, addVisualization, config, clientConfig]);\n\n /**\n * Cancel the current query\n */\n const cancel = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n setIsStreaming(false);\n }, []);\n\n return {\n execute,\n isStreaming,\n result,\n toolCalls,\n visualizations,\n error,\n cancel,\n };\n}\n","/**\n * Intent Analyzer\n *\n * Analyzes user intent and returns structured analysis with suggested config.\n * Uses rule-based matching first, falls back to LLM for ambiguous cases.\n */\n\nimport type {\n IntentAnalysis,\n IntentCategory,\n IntentPattern,\n IntentEntity,\n DynamicAgentConfig,\n IntentAnalyzerOptions,\n LLMExecutor,\n} from './types';\n\n// =============================================================================\n// Default Intent Patterns\n// =============================================================================\n\n/**\n * Pre-configured patterns for common intent categories\n */\nexport const DEFAULT_PATTERNS: IntentPattern[] = [\n {\n id: 'data-analysis',\n category: 'data_analysis',\n patterns: [\n /analyz[es]?\\s+(the\\s+)?data/i,\n /data\\s+analysis/i,\n /explore\\s+(my\\s+)?dataset/i,\n /statistical\\s+analysis/i,\n /find\\s+patterns?\\s+in/i,\n /correlat(e|ion)/i,\n /summarize\\s+(the\\s+)?data/i,\n /describe\\s+(the\\s+)?dataset/i,\n ],\n keywords: ['analyze', 'analysis', 'explore', 'statistics', 'patterns', 'insights', 'trends', 'summary', 'describe'],\n suggestedConfig: {\n template: 'data-science',\n systemPrompt: `You are a data analyst specializing in exploratory data analysis.\nFocus on:\n- Statistical summaries and distributions\n- Identifying patterns, correlations, and anomalies\n- Providing actionable insights with supporting evidence\n- Creating clear visualizations when helpful\n\nAlways explain your methodology and confidence levels.`,\n networkMode: 'SANDBOX',\n },\n priority: 10,\n },\n {\n id: 'visualization',\n category: 'visualization',\n patterns: [\n /create\\s+(a\\s+)?chart/i,\n /visualiz[es]/i,\n /plot\\s+(the\\s+)?data/i,\n /show\\s+(me\\s+)?(a\\s+)?graph/i,\n /dashboard/i,\n /make\\s+(a\\s+)?(bar|line|pie|scatter)/i,\n /draw\\s+(a\\s+)?diagram/i,\n ],\n keywords: ['chart', 'graph', 'plot', 'visualize', 'visualization', 'dashboard', 'diagram', 'bar', 'line', 'pie', 'scatter'],\n suggestedConfig: {\n template: 'data-science',\n systemPrompt: `You are a data visualization expert.\nFocus on:\n- Creating clear, informative visualizations\n- Choosing appropriate chart types for the data\n- Using effective color schemes and layouts\n- Adding meaningful labels and annotations\n\nAlways save visualizations and explain what they show.`,\n networkMode: 'SANDBOX',\n },\n priority: 9,\n },\n {\n id: 'machine-learning',\n category: 'machine_learning',\n patterns: [\n /train\\s+(a\\s+)?model/i,\n /machine\\s+learning/i,\n /predict(ion)?s?/i,\n /classif(y|ication)/i,\n /regression/i,\n /clustering/i,\n /build\\s+(a\\s+)?model/i,\n /deep\\s+learning/i,\n /neural\\s+network/i,\n ],\n keywords: ['model', 'predict', 'train', 'machine learning', 'ML', 'classification', 'regression', 'clustering', 'neural', 'AI'],\n suggestedConfig: {\n template: 'data-science',\n systemPrompt: `You are a machine learning engineer.\nFocus on:\n- Selecting appropriate ML algorithms for the task\n- Proper data preparation and feature engineering\n- Model training, validation, and evaluation\n- Clear explanation of model performance and limitations\n\nAlways split data properly and report metrics.`,\n networkMode: 'SANDBOX',\n },\n priority: 8,\n },\n {\n id: 'data-transformation',\n category: 'data_transformation',\n patterns: [\n /transform\\s+(the\\s+)?data/i,\n /clean\\s+(the\\s+)?data/i,\n /filter\\s+(the\\s+)?rows/i,\n /merge\\s+(the\\s+)?datasets/i,\n /join\\s+(the\\s+)?tables/i,\n /pivot\\s+(the\\s+)?data/i,\n /reshape/i,\n ],\n keywords: ['transform', 'clean', 'filter', 'merge', 'join', 'pivot', 'reshape', 'aggregate', 'group'],\n suggestedConfig: {\n template: 'data-science',\n systemPrompt: `You are a data engineer specializing in data transformation.\nFocus on:\n- Cleaning and preprocessing data\n- Efficient transformations and aggregations\n- Data quality validation\n- Clear documentation of transformations applied\n\nAlways verify data integrity after transformations.`,\n networkMode: 'SANDBOX',\n },\n priority: 7,\n },\n {\n id: 'content-creation',\n category: 'content_creation',\n patterns: [\n /write\\s+(a\\s+)?blog/i,\n /create\\s+content/i,\n /marketing\\s+copy/i,\n /social\\s+media\\s+post/i,\n /draft\\s+(an?\\s+)?email/i,\n /write\\s+(an?\\s+)?article/i,\n /generate\\s+copy/i,\n ],\n keywords: ['write', 'content', 'blog', 'marketing', 'copy', 'email', 'social media', 'article', 'draft'],\n suggestedConfig: {\n template: 'marketing',\n systemPrompt: `You are a content strategist and copywriter.\nFocus on:\n- Clear, engaging writing tailored to the audience\n- SEO optimization where appropriate\n- Consistent brand voice and messaging\n- Actionable calls-to-action\n\nAlways ask about target audience if unclear.`,\n networkMode: 'PUBLIC',\n },\n priority: 6,\n },\n {\n id: 'customer-support',\n category: 'customer_support',\n patterns: [\n /customer\\s+support/i,\n /help\\s+desk/i,\n /answer\\s+questions/i,\n /FAQ/i,\n /troubleshoot/i,\n /resolve\\s+issues/i,\n /support\\s+agent/i,\n ],\n keywords: ['support', 'help', 'troubleshoot', 'FAQ', 'questions', 'issues', 'resolve', 'assist'],\n suggestedConfig: {\n template: 'support',\n systemPrompt: `You are a customer support specialist.\nFocus on:\n- Understanding the customer's problem quickly\n- Providing clear, step-by-step solutions\n- Escalating when necessary\n- Being empathetic and professional\n\nAlways verify the solution works before closing.`,\n networkMode: 'SANDBOX',\n },\n priority: 5,\n },\n {\n id: 'code-generation',\n category: 'code_generation',\n patterns: [\n /write\\s+(some\\s+)?code/i,\n /generate\\s+(a\\s+)?script/i,\n /create\\s+(a\\s+)?function/i,\n /implement\\s+(a\\s+)?feature/i,\n /code\\s+to\\s+/i,\n /python\\s+(script|code)/i,\n ],\n keywords: ['code', 'script', 'function', 'implement', 'program', 'python', 'javascript'],\n suggestedConfig: {\n template: 'data-science',\n systemPrompt: `You are a software developer.\nFocus on:\n- Writing clean, well-documented code\n- Following best practices and conventions\n- Error handling and edge cases\n- Testing and validation\n\nAlways explain your implementation decisions.`,\n networkMode: 'SANDBOX',\n },\n priority: 4,\n },\n {\n id: 'research',\n category: 'research',\n patterns: [\n /research\\s+/i,\n /find\\s+information/i,\n /look\\s+up/i,\n /search\\s+for/i,\n /investigate/i,\n ],\n keywords: ['research', 'find', 'search', 'investigate', 'look up', 'discover'],\n suggestedConfig: {\n template: 'data-science',\n systemPrompt: `You are a research assistant.\nFocus on:\n- Thorough information gathering\n- Source verification and credibility\n- Clear summarization of findings\n- Identifying knowledge gaps\n\nAlways cite your sources when possible.`,\n networkMode: 'PUBLIC',\n },\n priority: 3,\n },\n];\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Extract entities from intent string\n */\nexport function extractEntities(intent: string): IntentEntity[] {\n const entities: IntentEntity[] = [];\n\n // Data source patterns\n const dataSourceMatch = intent.match(/(?:from|using|with)\\s+(?:the\\s+)?(\\w+)\\s+(?:data|dataset|file|table)/i);\n if (dataSourceMatch) {\n entities.push({\n type: 'data_source',\n value: dataSourceMatch[1],\n position: dataSourceMatch.index || 0,\n });\n }\n\n // Output format patterns\n const formatMatch = intent.match(/(?:as|in|to)\\s+(?:a\\s+)?(\\w+)\\s+(?:format|file|chart|graph)/i);\n if (formatMatch) {\n entities.push({\n type: 'output_format',\n value: formatMatch[1],\n position: formatMatch.index || 0,\n });\n }\n\n // Domain patterns\n const domainPatterns = [\n { regex: /(?:sales|revenue|financial)/i, domain: 'finance' },\n { regex: /(?:customer|user|client)/i, domain: 'customer' },\n { regex: /(?:marketing|campaign|ad)/i, domain: 'marketing' },\n { regex: /(?:product|inventory|stock)/i, domain: 'product' },\n { regex: /(?:health|medical|patient)/i, domain: 'healthcare' },\n ];\n\n for (const { regex, domain } of domainPatterns) {\n const match = intent.match(regex);\n if (match) {\n entities.push({\n type: 'domain',\n value: domain,\n position: match.index || 0,\n });\n break;\n }\n }\n\n // Action patterns\n const actionPatterns = ['analyze', 'visualize', 'predict', 'classify', 'train', 'create', 'generate', 'transform', 'clean'];\n for (const action of actionPatterns) {\n const actionIndex = intent.toLowerCase().indexOf(action);\n if (actionIndex !== -1) {\n entities.push({\n type: 'action',\n value: action,\n position: actionIndex,\n });\n break;\n }\n }\n\n return entities;\n}\n\n/**\n * Analyze intent using rule-based matching\n */\nexport function analyzeWithRules(\n intent: string,\n customPatterns: IntentPattern[] = []\n): IntentAnalysis | null {\n const allPatterns = [...customPatterns, ...DEFAULT_PATTERNS]\n .sort((a, b) => (b.priority || 0) - (a.priority || 0));\n\n const normalizedIntent = intent.toLowerCase().trim();\n let bestMatch: { pattern: IntentPattern; score: number } | null = null;\n\n for (const pattern of allPatterns) {\n let score = 0;\n\n // Check regex patterns (weighted at 40%)\n for (const regex of pattern.patterns) {\n if (regex.test(normalizedIntent)) {\n score += 0.4;\n break;\n }\n }\n\n // Check keywords (weighted at 60%)\n const matchedKeywords = pattern.keywords.filter(kw =>\n normalizedIntent.includes(kw.toLowerCase())\n );\n score += (matchedKeywords.length / pattern.keywords.length) * 0.6;\n\n if (score > (bestMatch?.score || 0)) {\n bestMatch = { pattern, score };\n }\n }\n\n if (!bestMatch || bestMatch.score < 0.3) {\n return null;\n }\n\n const entities = extractEntities(intent);\n\n return {\n category: bestMatch.pattern.category,\n confidence: Math.min(bestMatch.score, 1),\n entities,\n suggestedConfig: bestMatch.pattern.suggestedConfig,\n originalIntent: intent,\n method: 'rule',\n };\n}\n\n/**\n * Analyze intent using LLM (fallback for ambiguous cases)\n */\nexport async function analyzeWithLLM(\n intent: string,\n llmExecute: LLMExecutor\n): Promise<IntentAnalysis> {\n const analysisPrompt = `Analyze this user intent and respond with JSON only:\nIntent: \"${intent}\"\n\nRespond with this exact JSON structure (no markdown, just JSON):\n{\n \"category\": \"data_analysis|visualization|machine_learning|data_transformation|content_creation|customer_support|code_generation|research|general_assistant\",\n \"confidence\": 0.0-1.0,\n \"suggestedSystemPrompt\": \"A brief system prompt for an AI agent to handle this intent\",\n \"template\": \"data-science|marketing|support|custom\"\n}`;\n\n try {\n const response = await llmExecute(analysisPrompt);\n const jsonMatch = response.match(/\\{[\\s\\S]*\\}/);\n\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0]);\n return {\n category: parsed.category as IntentCategory,\n confidence: typeof parsed.confidence === 'number' ? parsed.confidence : 0.7,\n entities: extractEntities(intent),\n suggestedConfig: {\n template: parsed.template || 'custom',\n systemPrompt: parsed.suggestedSystemPrompt,\n },\n originalIntent: intent,\n method: 'llm',\n };\n }\n } catch (error) {\n console.error('LLM intent analysis failed:', error);\n }\n\n // Fallback to general assistant\n return {\n category: 'general_assistant',\n confidence: 0.5,\n entities: extractEntities(intent),\n suggestedConfig: {\n template: 'custom',\n systemPrompt: `You are a helpful AI assistant. The user wants: ${intent}`,\n },\n originalIntent: intent,\n method: 'llm',\n };\n}\n\n// =============================================================================\n// Intent Analyzer Class\n// =============================================================================\n\n/**\n * Intent Analyzer\n *\n * Analyzes user intent strings and produces structured analysis\n * with suggested agent configurations.\n */\nexport class IntentAnalyzer {\n private customPatterns: IntentPattern[];\n private confidenceThreshold: number;\n private useLLMFallback: boolean;\n\n constructor(options: IntentAnalyzerOptions = {}) {\n this.customPatterns = options.customPatterns || [];\n this.confidenceThreshold = options.confidenceThreshold || 0.7;\n this.useLLMFallback = options.useLLMFallback !== false;\n }\n\n /**\n * Analyze intent and return structured analysis\n */\n async analyze(\n intent: string,\n llmExecutor?: LLMExecutor\n ): Promise<IntentAnalysis> {\n // Try rule-based first\n const ruleAnalysis = analyzeWithRules(intent, this.customPatterns);\n\n if (ruleAnalysis && ruleAnalysis.confidence >= this.confidenceThreshold) {\n return ruleAnalysis;\n }\n\n // Fall back to LLM if enabled and executor provided\n if (this.useLLMFallback && llmExecutor) {\n const llmAnalysis = await analyzeWithLLM(intent, llmExecutor);\n\n // Merge with rule analysis if available and has higher confidence\n if (ruleAnalysis && llmAnalysis.confidence < ruleAnalysis.confidence) {\n return { ...ruleAnalysis, method: 'hybrid' };\n }\n\n return { ...llmAnalysis, method: 'hybrid' };\n }\n\n // Return rule analysis even if below threshold\n if (ruleAnalysis) {\n return ruleAnalysis;\n }\n\n // Last resort - general assistant\n return {\n category: 'general_assistant',\n confidence: 0.3,\n entities: extractEntities(intent),\n suggestedConfig: {\n template: 'custom',\n systemPrompt: `You are a helpful AI assistant. The user wants: ${intent}`,\n },\n originalIntent: intent,\n method: 'rule',\n };\n }\n\n /**\n * Register a custom intent pattern\n */\n addPattern(pattern: IntentPattern): void {\n this.customPatterns.push(pattern);\n }\n\n /**\n * Remove a custom pattern by ID\n */\n removePattern(patternId: string): boolean {\n const index = this.customPatterns.findIndex(p => p.id === patternId);\n if (index >= 0) {\n this.customPatterns.splice(index, 1);\n return true;\n }\n return false;\n }\n\n /**\n * Get all registered patterns (custom + defaults)\n */\n getPatterns(): IntentPattern[] {\n return [...this.customPatterns, ...DEFAULT_PATTERNS];\n }\n\n /**\n * Get only custom patterns\n */\n getCustomPatterns(): IntentPattern[] {\n return [...this.customPatterns];\n }\n\n /**\n * Update confidence threshold\n */\n setConfidenceThreshold(threshold: number): void {\n this.confidenceThreshold = Math.max(0, Math.min(1, threshold));\n }\n\n /**\n * Enable or disable LLM fallback\n */\n setLLMFallback(enabled: boolean): void {\n this.useLLMFallback = enabled;\n }\n}\n","/**\n * Agent Registry\n *\n * Stores and manages registered agents with caching support.\n * Supports fuzzy intent matching to reuse similar agent configurations.\n */\n\nimport type { RegisteredAgent, AgentRegistryOptions } from './types';\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Calculate similarity between two intent strings using Jaccard similarity\n */\nfunction intentSimilarity(a: string, b: string): number {\n const wordsA = new Set(a.toLowerCase().split(/\\s+/).filter(w => w.length > 2));\n const wordsB = new Set(b.toLowerCase().split(/\\s+/).filter(w => w.length > 2));\n\n if (wordsA.size === 0 && wordsB.size === 0) {\n return 1;\n }\n if (wordsA.size === 0 || wordsB.size === 0) {\n return 0;\n }\n\n const intersection = new Set([...wordsA].filter(w => wordsB.has(w)));\n const union = new Set([...wordsA, ...wordsB]);\n\n return intersection.size / union.size;\n}\n\n/**\n * Normalize intent string for comparison\n */\nfunction normalizeIntent(intent: string): string {\n return intent\n .toLowerCase()\n .trim()\n .replace(/\\s+/g, ' ')\n .replace(/[^\\w\\s]/g, '');\n}\n\n// =============================================================================\n// Agent Registry Class\n// =============================================================================\n\n/**\n * Agent Registry\n *\n * Manages registration, retrieval, and caching of dynamically created agents.\n */\nexport class AgentRegistry {\n private agents: Map<string, RegisteredAgent> = new Map();\n private intentIndex: Map<string, string> = new Map(); // normalized intent -> agentId\n private options: Required<AgentRegistryOptions>;\n\n constructor(options: AgentRegistryOptions = {}) {\n this.options = {\n enableCache: options.enableCache !== false,\n cacheTTL: options.cacheTTL || 30 * 60 * 1000, // 30 minutes default\n };\n }\n\n /**\n * Register a new agent\n */\n register(agent: RegisteredAgent): void {\n this.agents.set(agent.id, agent);\n this.intentIndex.set(normalizeIntent(agent.intent), agent.id);\n }\n\n /**\n * Get agent by ID\n */\n get(id: string): RegisteredAgent | undefined {\n const agent = this.agents.get(id);\n\n if (!agent) {\n return undefined;\n }\n\n // Check if expired (only if caching is enabled)\n if (this.options.enableCache && this.options.cacheTTL > 0) {\n const age = Date.now() - agent.lastUsedAt.getTime();\n if (age > this.options.cacheTTL) {\n this.remove(id);\n return undefined;\n }\n }\n\n return agent;\n }\n\n /**\n * Find agent by exact intent match\n */\n findByExactIntent(intent: string): RegisteredAgent | undefined {\n const normalizedIntent = normalizeIntent(intent);\n const agentId = this.intentIndex.get(normalizedIntent);\n\n if (agentId) {\n return this.get(agentId);\n }\n\n return undefined;\n }\n\n /**\n * Find agent by similar intent (fuzzy matching)\n */\n findByIntent(intent: string, threshold: number = 0.8): RegisteredAgent | undefined {\n // Try exact match first\n const exactMatch = this.findByExactIntent(intent);\n if (exactMatch) {\n return exactMatch;\n }\n\n const normalizedIntent = normalizeIntent(intent);\n\n // Fuzzy match against all registered intents\n let bestMatch: { agent: RegisteredAgent; similarity: number } | null = null;\n\n for (const [registeredIntent, agentId] of this.intentIndex) {\n const similarity = intentSimilarity(normalizedIntent, registeredIntent);\n\n if (similarity >= threshold && similarity > (bestMatch?.similarity || 0)) {\n const agent = this.get(agentId);\n if (agent) {\n bestMatch = { agent, similarity };\n }\n }\n }\n\n return bestMatch?.agent;\n }\n\n /**\n * Record agent usage (updates lastUsedAt and usageCount)\n */\n recordUsage(id: string): void {\n const agent = this.agents.get(id);\n if (agent) {\n agent.lastUsedAt = new Date();\n agent.usageCount++;\n\n if (agent.config.lastUsedAt !== undefined) {\n agent.config.lastUsedAt = new Date();\n }\n }\n }\n\n /**\n * List all registered agents\n */\n listAll(): RegisteredAgent[] {\n // Clean expired entries first if caching is enabled\n if (this.options.enableCache && this.options.cacheTTL > 0) {\n this.cleanExpired();\n }\n\n return Array.from(this.agents.values());\n }\n\n /**\n * List agents sorted by usage count (most used first)\n */\n listByUsage(): RegisteredAgent[] {\n return this.listAll().sort((a, b) => b.usageCount - a.usageCount);\n }\n\n /**\n * List agents sorted by last used (most recent first)\n */\n listByRecent(): RegisteredAgent[] {\n return this.listAll().sort(\n (a, b) => b.lastUsedAt.getTime() - a.lastUsedAt.getTime()\n );\n }\n\n /**\n * Remove agent by ID\n */\n remove(id: string): boolean {\n const agent = this.agents.get(id);\n if (agent) {\n this.intentIndex.delete(normalizeIntent(agent.intent));\n return this.agents.delete(id);\n }\n return false;\n }\n\n /**\n * Clear all registered agents\n */\n clear(): void {\n this.agents.clear();\n this.intentIndex.clear();\n }\n\n /**\n * Get registry size\n */\n size(): number {\n return this.agents.size;\n }\n\n /**\n * Check if agent exists\n */\n has(id: string): boolean {\n return this.agents.has(id);\n }\n\n /**\n * Clean expired agents\n */\n private cleanExpired(): void {\n if (!this.options.enableCache || this.options.cacheTTL <= 0) {\n return;\n }\n\n const now = Date.now();\n const toRemove: string[] = [];\n\n for (const [id, agent] of this.agents) {\n const age = now - agent.lastUsedAt.getTime();\n if (age > this.options.cacheTTL) {\n toRemove.push(id);\n }\n }\n\n for (const id of toRemove) {\n this.remove(id);\n }\n }\n\n /**\n * Update cache TTL\n */\n setCacheTTL(ttl: number): void {\n this.options.cacheTTL = Math.max(0, ttl);\n }\n\n /**\n * Enable or disable caching\n */\n setCacheEnabled(enabled: boolean): void {\n this.options.enableCache = enabled;\n }\n\n /**\n * Export registry state (for persistence)\n */\n export(): RegisteredAgent[] {\n return Array.from(this.agents.values());\n }\n\n /**\n * Import registry state (for restoration)\n */\n import(agents: RegisteredAgent[]): void {\n for (const agent of agents) {\n // Convert date strings back to Date objects if needed\n const normalizedAgent: RegisteredAgent = {\n ...agent,\n createdAt: agent.createdAt instanceof Date ? agent.createdAt : new Date(agent.createdAt),\n lastUsedAt: agent.lastUsedAt instanceof Date ? agent.lastUsedAt : new Date(agent.lastUsedAt),\n };\n this.register(normalizedAgent);\n }\n }\n}\n","/**\n * Agent Factory\n *\n * Creates and manages dynamic agent configurations based on user intent.\n * Combines IntentAnalyzer for intent parsing and AgentRegistry for storage.\n */\n\nimport type {\n DynamicAgentConfig,\n IntentAnalysis,\n RegisteredAgent,\n AgentFactoryOptions,\n IntentCategory,\n LLMExecutor,\n} from './types';\nimport { IntentAnalyzer } from './intent-analyzer';\nimport { AgentRegistry } from './agent-registry';\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Generate unique agent ID\n */\nfunction generateAgentId(): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 11);\n return `agent_${timestamp}_${random}`;\n}\n\n/**\n * Category to human-readable name mapping\n */\nconst CATEGORY_NAMES: Record<IntentCategory, string> = {\n data_analysis: 'Data Analyst',\n visualization: 'Visualization Expert',\n data_transformation: 'Data Engineer',\n machine_learning: 'ML Engineer',\n content_creation: 'Content Creator',\n research: 'Research Assistant',\n customer_support: 'Support Agent',\n code_generation: 'Code Assistant',\n general_assistant: 'General Assistant',\n custom: 'Custom Agent',\n};\n\n// =============================================================================\n// Agent Factory Class\n// =============================================================================\n\n/**\n * Agent Factory\n *\n * Creates agents dynamically based on user intent.\n * Uses rule-based analysis with optional LLM fallback.\n */\nexport class AgentFactory {\n private analyzer: IntentAnalyzer;\n private registry: AgentRegistry;\n private options: Required<AgentFactoryOptions>;\n\n constructor(options: AgentFactoryOptions = {}) {\n this.options = {\n useLLMFallback: options.useLLMFallback !== false,\n ruleConfidenceThreshold: options.ruleConfidenceThreshold || 0.7,\n enableCache: options.enableCache !== false,\n cacheTTL: options.cacheTTL || 30 * 60 * 1000, // 30 minutes\n customPatterns: options.customPatterns || [],\n };\n\n this.analyzer = new IntentAnalyzer({\n customPatterns: this.options.customPatterns,\n confidenceThreshold: this.options.ruleConfidenceThreshold,\n useLLMFallback: this.options.useLLMFallback,\n });\n\n this.registry = new AgentRegistry({\n enableCache: this.options.enableCache,\n cacheTTL: this.options.cacheTTL,\n });\n }\n\n /**\n * Create agent from user intent\n *\n * @param intent - Natural language description of what the user wants\n * @param llmExecutor - Optional function to execute LLM queries for fallback analysis\n * @returns Created or cached RegisteredAgent\n */\n async createFromIntent(\n intent: string,\n llmExecutor?: LLMExecutor\n ): Promise<RegisteredAgent> {\n // Check if similar intent already exists in registry\n const existingAgent = this.registry.findByIntent(intent);\n if (existingAgent) {\n this.registry.recordUsage(existingAgent.id);\n return existingAgent;\n }\n\n // Analyze intent\n const analysis = await this.analyzer.analyze(intent, llmExecutor);\n\n // Build agent config from analysis\n const config = this.buildConfig(analysis);\n\n // Create registered agent entry\n const agent: RegisteredAgent = {\n id: generateAgentId(),\n name: this.generateAgentName(analysis),\n config,\n intent,\n analysis,\n createdAt: new Date(),\n lastUsedAt: new Date(),\n usageCount: 1,\n };\n\n // Register the agent\n this.registry.register(agent);\n\n return agent;\n }\n\n /**\n * Create agent from explicit configuration (bypass intent analysis)\n *\n * @param name - Human-readable agent name\n * @param config - Partial agent configuration\n * @returns Created RegisteredAgent\n */\n createFromConfig(\n name: string,\n config: Partial<DynamicAgentConfig>\n ): RegisteredAgent {\n const fullConfig: DynamicAgentConfig = {\n template: 'custom',\n streaming: true,\n networkMode: 'SANDBOX',\n ...config,\n name,\n createdAt: new Date(),\n lastUsedAt: new Date(),\n };\n\n const agent: RegisteredAgent = {\n id: generateAgentId(),\n name,\n config: fullConfig,\n intent: `Custom: ${name}`,\n analysis: {\n category: 'custom',\n confidence: 1.0,\n entities: [],\n suggestedConfig: config,\n originalIntent: `Custom: ${name}`,\n method: 'rule',\n },\n createdAt: new Date(),\n lastUsedAt: new Date(),\n usageCount: 1,\n };\n\n this.registry.register(agent);\n return agent;\n }\n\n /**\n * Build full config from intent analysis\n */\n private buildConfig(analysis: IntentAnalysis): DynamicAgentConfig {\n const baseConfig: DynamicAgentConfig = {\n template: analysis.suggestedConfig.template || 'custom',\n streaming: true,\n networkMode: 'SANDBOX',\n createdAt: new Date(),\n lastUsedAt: new Date(),\n };\n\n // Merge suggested config from analysis\n return {\n ...baseConfig,\n ...analysis.suggestedConfig,\n metadata: {\n analysisCategory: analysis.category,\n analysisConfidence: analysis.confidence,\n analysisMethod: analysis.method,\n entities: analysis.entities,\n },\n };\n }\n\n /**\n * Generate human-readable agent name from analysis\n */\n private generateAgentName(analysis: IntentAnalysis): string {\n return CATEGORY_NAMES[analysis.category] || 'Custom Agent';\n }\n\n // ===========================================================================\n // Registry Access Methods\n // ===========================================================================\n\n /**\n * Get agent by ID\n */\n getAgent(id: string): RegisteredAgent | undefined {\n return this.registry.get(id);\n }\n\n /**\n * List all registered agents\n */\n listAgents(): RegisteredAgent[] {\n return this.registry.listAll();\n }\n\n /**\n * List agents by usage (most used first)\n */\n listAgentsByUsage(): RegisteredAgent[] {\n return this.registry.listByUsage();\n }\n\n /**\n * List agents by recency (most recent first)\n */\n listAgentsByRecent(): RegisteredAgent[] {\n return this.registry.listByRecent();\n }\n\n /**\n * Remove an agent by ID\n */\n removeAgent(id: string): boolean {\n return this.registry.remove(id);\n }\n\n /**\n * Clear all agents\n */\n clearAll(): void {\n this.registry.clear();\n }\n\n /**\n * Get number of registered agents\n */\n getAgentCount(): number {\n return this.registry.size();\n }\n\n /**\n * Record usage of an agent\n */\n recordAgentUsage(id: string): void {\n this.registry.recordUsage(id);\n }\n\n // ===========================================================================\n // Analyzer Access Methods\n // ===========================================================================\n\n /**\n * Get the analyzer instance for direct access\n */\n getAnalyzer(): IntentAnalyzer {\n return this.analyzer;\n }\n\n /**\n * Get the registry instance for direct access\n */\n getRegistry(): AgentRegistry {\n return this.registry;\n }\n\n // ===========================================================================\n // Persistence Methods\n // ===========================================================================\n\n /**\n * Export factory state for persistence\n */\n exportState(): {\n agents: RegisteredAgent[];\n options: AgentFactoryOptions;\n } {\n return {\n agents: this.registry.export(),\n options: this.options,\n };\n }\n\n /**\n * Import factory state from persistence\n */\n importState(state: { agents: RegisteredAgent[] }): void {\n this.registry.import(state.agents);\n }\n}\n","'use client';\n\n/**\n * useIntentAgent Hook\n *\n * Creates and manages agents dynamically based on user intent.\n * Uses the AgentFactory to analyze intent and generate appropriate configurations.\n *\n * @example\n * ```tsx\n * function SmartChat() {\n * const {\n * createAgent,\n * query,\n * agent,\n * messages,\n * isStreaming,\n * isCreating\n * } = useIntentAgent();\n *\n * useEffect(() => {\n * createAgent(\"Help me analyze sales data and find trends\");\n * }, []);\n *\n * if (isCreating) {\n * return <p>Setting up your AI assistant...</p>;\n * }\n *\n * return (\n * <div>\n * {agent && (\n * <div>\n * <span>{agent.name}</span>\n * <span>Confidence: {Math.round(agent.analysis.confidence * 100)}%</span>\n * </div>\n * )}\n * <ChatInterface\n * messages={messages}\n * isStreaming={isStreaming}\n * onSend={query}\n * />\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback, useRef, useMemo, useEffect } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport { AgentFactory } from '../factory/agent-factory';\nimport { executeQueryWithConfig } from '../api/client';\nimport { parseSSEStream } from '../utils/sse-parser';\nimport type {\n UseIntentAgentReturn,\n UseIntentAgentOptions,\n RegisteredAgent,\n} from '../factory/types';\nimport type { ChatMessage, ToolCall, VisualizationData } from '../types';\n\n/**\n * Generate unique ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n}\n\n/**\n * Hook for intent-based AI agent interactions\n *\n * @param options - Factory configuration options\n */\nexport function useIntentAgent(\n options: UseIntentAgentOptions = {}\n): UseIntentAgentReturn {\n const {\n credentials,\n selectedWorkspace,\n messages,\n addMessage,\n updateMessage,\n clearMessages: contextClear,\n setIsQueryRunning,\n setQueryStartTime,\n addVisualization,\n refreshDatasets,\n refreshVisualizations,\n config,\n } = useFlowstack();\n\n // Factory instance (memoized based on options)\n const factory = useMemo(\n () => new AgentFactory({\n useLLMFallback: options.useLLMFallback,\n ruleConfidenceThreshold: options.ruleConfidenceThreshold,\n enableCache: options.enableCache,\n cacheTTL: options.cacheTTL,\n customPatterns: options.customPatterns,\n }),\n [\n options.useLLMFallback,\n options.ruleConfidenceThreshold,\n options.enableCache,\n options.cacheTTL,\n options.customPatterns,\n ]\n );\n\n // State\n const [agent, setAgent] = useState<RegisteredAgent | null>(null);\n const [isStreaming, setIsStreaming] = useState(false);\n const [isCreating, setIsCreating] = useState(false);\n const [toolCalls, setToolCalls] = useState<ToolCall[]>([]);\n const [error, setError] = useState<string | null>(null);\n\n const abortControllerRef = useRef<AbortController | null>(null);\n const currentMessageIdRef = useRef<string | null>(null);\n\n const clientConfig = useMemo(() => ({\n baseUrl: config.baseUrl,\n tenantId: config.tenantId,\n }), [config.baseUrl, config.tenantId]);\n\n // Handle initial intent if provided\n useEffect(() => {\n if (options.initialIntent && !agent && !isCreating) {\n createAgent(options.initialIntent);\n }\n }, [options.initialIntent]);\n\n /**\n * Create an LLM executor for fallback intent analysis\n */\n const createLLMExecutor = useCallback(() => {\n if (!credentials || !selectedWorkspace) {\n return undefined;\n }\n\n return async (prompt: string): Promise<string> => {\n const response = await executeQueryWithConfig(\n credentials,\n prompt,\n selectedWorkspace.workspaceId,\n { networkMode: 'SANDBOX' },\n clientConfig\n );\n\n if (!response.body) {\n throw new Error('No response body');\n }\n\n const reader = response.body.getReader();\n let result = '';\n\n for await (const event of parseSSEStream(reader)) {\n if (event.type === 'text' || event.type === 'content' || event.type === 'delta') {\n result += event.content || '';\n }\n }\n\n return result;\n };\n }, [credentials, selectedWorkspace, clientConfig]);\n\n /**\n * Create agent from intent\n */\n const createAgent = useCallback(async (intent: string): Promise<RegisteredAgent> => {\n setError(null);\n setIsCreating(true);\n\n try {\n const llmExecutor = createLLMExecutor();\n const newAgent = await factory.createFromIntent(intent, llmExecutor);\n setAgent(newAgent);\n return newAgent;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to create agent';\n setError(message);\n throw err;\n } finally {\n setIsCreating(false);\n }\n }, [factory, createLLMExecutor]);\n\n /**\n * Execute query with current agent\n */\n const query = useCallback(async (prompt: string): Promise<void> => {\n setError(null);\n\n if (!credentials) {\n setError('Not authenticated');\n return;\n }\n\n if (!selectedWorkspace) {\n setError('No workspace selected');\n return;\n }\n\n if (!agent) {\n setError('No agent created. Call createAgent first.');\n return;\n }\n\n // Add user message\n const userMessage: ChatMessage = {\n id: generateId(),\n role: 'user',\n content: prompt,\n timestamp: new Date(),\n };\n addMessage(userMessage);\n\n // Create assistant message placeholder\n const assistantId = generateId();\n currentMessageIdRef.current = assistantId;\n const assistantMessage: ChatMessage = {\n id: assistantId,\n role: 'assistant',\n content: '',\n timestamp: new Date(),\n isStreaming: true,\n toolCalls: [],\n visualizations: [],\n };\n addMessage(assistantMessage);\n\n // Set loading state\n setIsStreaming(true);\n setIsQueryRunning(true);\n setQueryStartTime(Date.now());\n setToolCalls([]);\n\n // Create abort controller for cancellation\n abortControllerRef.current = new AbortController();\n\n let fullContent = '';\n\n try {\n // Execute with agent's custom configuration\n const response = await executeQueryWithConfig(\n credentials,\n prompt,\n selectedWorkspace.workspaceId,\n {\n networkMode: agent.config.networkMode || 'SANDBOX',\n systemPrompt: agent.config.systemPrompt,\n tools: agent.config.tools,\n },\n clientConfig\n );\n\n if (!response.body) {\n throw new Error('No response body');\n }\n\n const reader = response.body.getReader();\n const currentToolCalls: ToolCall[] = [];\n const currentVisualizations: VisualizationData[] = [];\n\n // Process SSE stream\n for await (const event of parseSSEStream(reader)) {\n // Check if cancelled\n if (abortControllerRef.current?.signal.aborted) {\n break;\n }\n\n switch (event.type) {\n case 'text':\n case 'content':\n case 'delta':\n if (event.content) {\n fullContent += event.content;\n updateMessage(assistantId, { content: fullContent });\n }\n break;\n\n case 'tool_call':\n case 'tool_use':\n if (event.tool) {\n const toolCall: ToolCall = {\n id: generateId(),\n toolUseId: event.args?.tool_use_id as string,\n name: event.tool,\n args: event.args,\n status: 'running',\n startTime: Date.now(),\n };\n currentToolCalls.push(toolCall);\n setToolCalls([...currentToolCalls]);\n updateMessage(assistantId, { toolCalls: [...currentToolCalls] });\n }\n break;\n\n case 'tool_result':\n if (event.tool || currentToolCalls.length > 0) {\n const toolIndex = currentToolCalls.findIndex(\n tc => tc.name === event.tool || tc.status === 'running'\n );\n if (toolIndex >= 0) {\n currentToolCalls[toolIndex] = {\n ...currentToolCalls[toolIndex],\n result: event.result,\n status: 'complete',\n endTime: Date.now(),\n };\n setToolCalls([...currentToolCalls]);\n updateMessage(assistantId, { toolCalls: [...currentToolCalls] });\n }\n }\n break;\n\n case 'visualization':\n if (event.data) {\n const viz = event.data as VisualizationData;\n currentVisualizations.push(viz);\n addVisualization(viz);\n updateMessage(assistantId, { visualizations: [...currentVisualizations] });\n }\n break;\n\n case 'error':\n setError(event.error || 'Query failed');\n break;\n\n case 'done':\n case 'complete':\n // Query complete\n break;\n }\n }\n\n // Mark message as complete\n updateMessage(assistantId, {\n content: fullContent,\n isStreaming: false,\n toolCalls: currentToolCalls,\n visualizations: currentVisualizations,\n });\n\n // Record agent usage\n factory.recordAgentUsage(agent.id);\n\n // Refresh artifacts if tools were used\n if (currentToolCalls.length > 0) {\n await Promise.all([\n refreshDatasets(),\n refreshVisualizations(),\n ]);\n }\n\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Query failed';\n setError(message);\n\n updateMessage(assistantId, {\n content: fullContent || `Error: ${message}`,\n isStreaming: false,\n });\n } finally {\n setIsStreaming(false);\n setIsQueryRunning(false);\n setQueryStartTime(null);\n currentMessageIdRef.current = null;\n abortControllerRef.current = null;\n }\n }, [\n credentials,\n selectedWorkspace,\n agent,\n addMessage,\n updateMessage,\n setIsQueryRunning,\n setQueryStartTime,\n addVisualization,\n refreshDatasets,\n refreshVisualizations,\n clientConfig,\n factory,\n ]);\n\n /**\n * Reset agent and messages\n */\n const reset = useCallback(() => {\n // Cancel any ongoing query\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n\n setAgent(null);\n setError(null);\n setToolCalls([]);\n setIsStreaming(false);\n setIsCreating(false);\n contextClear();\n }, [contextClear]);\n\n /**\n * List all registered agents\n */\n const listAgents = useCallback((): RegisteredAgent[] => {\n return factory.listAgents();\n }, [factory]);\n\n /**\n * Switch to a registered agent by ID\n */\n const useRegisteredAgent = useCallback((agentId: string) => {\n const registeredAgent = factory.getAgent(agentId);\n if (registeredAgent) {\n setAgent(registeredAgent);\n factory.recordAgentUsage(agentId);\n setError(null);\n } else {\n setError(`Agent ${agentId} not found`);\n }\n }, [factory]);\n\n /**\n * Remove an agent by ID\n */\n const removeAgent = useCallback((agentId: string): boolean => {\n const removed = factory.removeAgent(agentId);\n\n // If removing current agent, clear it\n if (removed && agent?.id === agentId) {\n setAgent(null);\n }\n\n return removed;\n }, [factory, agent]);\n\n return {\n createAgent,\n query,\n agent,\n messages,\n isStreaming,\n isCreating,\n toolCalls,\n error,\n reset,\n listAgents,\n useAgent: useRegisteredAgent,\n removeAgent,\n };\n}\n","'use client';\n\n/**\n * useAuthGuard Hook\n *\n * Provides auth guard logic without rendering components.\n * Useful for programmatic auth checks in pages/components.\n *\n * @example\n * ```tsx\n * function ProtectedPage() {\n * const { isAllowed, isLoading, shouldRedirect } = useAuthGuard({\n * requireAuth: true,\n * redirectTo: '/login',\n * });\n *\n * useEffect(() => {\n * if (shouldRedirect) {\n * router.push('/login');\n * }\n * }, [shouldRedirect]);\n *\n * if (isLoading) return <Loading />;\n * if (!isAllowed) return null;\n *\n * return <ProtectedContent />;\n * }\n * ```\n */\n\nimport { useState, useEffect, useMemo } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\n\nexport interface AuthGuardOptions {\n /** Require authentication (default: true) */\n requireAuth?: boolean;\n /** Require a workspace to be selected */\n requireWorkspace?: boolean;\n /** URL to redirect to when not authenticated */\n redirectTo?: string;\n}\n\nexport interface UseAuthGuardReturn {\n /** Whether the user is allowed to access the protected content */\n isAllowed: boolean;\n /** Whether auth state is still being determined */\n isLoading: boolean;\n /** Whether a redirect should occur */\n shouldRedirect: boolean;\n /** The URL to redirect to (if shouldRedirect is true) */\n redirectTo?: string;\n /** Whether the user is authenticated */\n isAuthenticated: boolean;\n /** Whether a workspace is selected */\n hasWorkspace: boolean;\n}\n\n/**\n * Hook for programmatic auth guard logic\n */\nexport function useAuthGuard(options: AuthGuardOptions = {}): UseAuthGuardReturn {\n const {\n requireAuth = true,\n requireWorkspace = false,\n redirectTo,\n } = options;\n\n const {\n isAuthenticated,\n isInitialized,\n selectedWorkspace,\n } = useFlowstack();\n\n const [shouldRedirect, setShouldRedirect] = useState(false);\n\n const hasWorkspace = selectedWorkspace !== null;\n const isLoading = !isInitialized;\n\n // Determine if user is allowed\n const isAllowed = useMemo(() => {\n if (!isInitialized) return false;\n if (requireAuth && !isAuthenticated) return false;\n if (requireWorkspace && !hasWorkspace) return false;\n return true;\n }, [isInitialized, requireAuth, isAuthenticated, requireWorkspace, hasWorkspace]);\n\n // Determine if redirect should occur\n useEffect(() => {\n if (!isInitialized) return;\n\n if (requireAuth && !isAuthenticated && redirectTo) {\n setShouldRedirect(true);\n } else {\n setShouldRedirect(false);\n }\n }, [isInitialized, requireAuth, isAuthenticated, redirectTo]);\n\n return {\n isAllowed,\n isLoading,\n shouldRedirect,\n redirectTo,\n isAuthenticated,\n hasWorkspace,\n };\n}\n","'use client';\n\n/**\n * useFlowstackStatus Hook\n *\n * Monitors connection status and health of the Flowstack backend.\n *\n * @example\n * ```tsx\n * function StatusIndicator() {\n * const { isConnected, latency, status } = useFlowstackStatus();\n *\n * return (\n * <div>\n * Status: {status}\n * {latency && ` (${latency}ms)`}\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\n\nexport type ConnectionStatus = 'unknown' | 'connecting' | 'connected' | 'disconnected' | 'error';\n\nexport interface UseFlowstackStatusReturn {\n /** Current connection status */\n status: ConnectionStatus;\n /** Whether connected to backend */\n isConnected: boolean;\n /** Whether currently checking connection */\n isChecking: boolean;\n /** Last measured latency in milliseconds */\n latency: number | null;\n /** Last successful connection time */\n lastConnected: Date | null;\n /** Last error message if any */\n error: string | null;\n /** Manually trigger a connection check */\n checkConnection: () => Promise<void>;\n}\n\nexport interface UseFlowstackStatusOptions {\n /** Polling interval in milliseconds (default: 30000) */\n pollInterval?: number;\n /** Whether to poll automatically (default: true) */\n autoPoll?: boolean;\n /** Whether to check on mount (default: true) */\n checkOnMount?: boolean;\n}\n\n/**\n * Hook for monitoring Flowstack backend status\n */\nexport function useFlowstackStatus(options: UseFlowstackStatusOptions = {}): UseFlowstackStatusReturn {\n const {\n pollInterval = 30000,\n autoPoll = true,\n checkOnMount = true,\n } = options;\n\n const { config } = useFlowstack();\n\n const [status, setStatus] = useState<ConnectionStatus>('unknown');\n const [isChecking, setIsChecking] = useState(false);\n const [latency, setLatency] = useState<number | null>(null);\n const [lastConnected, setLastConnected] = useState<Date | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const baseUrl = config.baseUrl || 'https://sage-api.flowstack.fun';\n\n const checkConnection = useCallback(async () => {\n if (isChecking) return;\n\n setIsChecking(true);\n setStatus('connecting');\n setError(null);\n\n const start = Date.now();\n\n try {\n // Try to reach the health endpoint\n const response = await fetch(`${baseUrl}/health`, {\n method: 'GET',\n mode: 'cors',\n cache: 'no-cache',\n });\n\n const elapsed = Date.now() - start;\n setLatency(elapsed);\n\n if (response.ok) {\n setStatus('connected');\n setLastConnected(new Date());\n setError(null);\n } else {\n setStatus('error');\n setError(`Server returned ${response.status}`);\n }\n } catch (err) {\n setStatus('disconnected');\n setLatency(null);\n setError(err instanceof Error ? err.message : 'Connection failed');\n } finally {\n setIsChecking(false);\n }\n }, [baseUrl, isChecking]);\n\n // Check on mount\n useEffect(() => {\n if (checkOnMount) {\n checkConnection();\n }\n }, [checkOnMount]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Set up polling\n useEffect(() => {\n if (!autoPoll || pollInterval <= 0) return;\n\n const interval = setInterval(checkConnection, pollInterval);\n return () => clearInterval(interval);\n }, [autoPoll, pollInterval, checkConnection]);\n\n return {\n status,\n isConnected: status === 'connected',\n isChecking,\n latency,\n lastConnected,\n error,\n checkConnection,\n };\n}\n","'use client';\n\n/**\n * useUserManagement Hook\n *\n * Provides user management functionality for developers to track and manage\n * users who sign up through their apps.\n *\n * @example\n * ```tsx\n * function AdminDashboard() {\n * const { users, stats, suspendUser, canManageUsers } = useUserManagement();\n *\n * if (!canManageUsers) return <div>Access denied</div>;\n *\n * return (\n * <div>\n * <h2>Total Users: {stats?.totalUsers}</h2>\n * {users.map(user => (\n * <div key={user.id}>\n * {user.email} - {user.role}\n * <button onClick={() => suspendUser(user.id)}>Suspend</button>\n * </div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback, useEffect } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport type {\n UseUserManagementReturn,\n ManagedUser,\n UserStats,\n UserActivityLog,\n UserListParams,\n UpdateUserRequest,\n UserRole,\n UserStatus,\n} from '../types';\nimport {\n listUsers as apiListUsers,\n getUser as apiGetUser,\n updateUser as apiUpdateUser,\n deleteUser as apiDeleteUser,\n suspendUser as apiSuspendUser,\n reactivateUser as apiReactivateUser,\n getUserActivity as apiGetUserActivity,\n getUserStats as apiGetUserStats,\n checkAdminPermissions as apiCheckAdminPermissions,\n} from '../api/client';\nimport { mockDelay, mockManagedUsers, mockUserStats, mockUserActivity } from '../mock/fixtures';\n\n/**\n * Hook for user management operations\n */\nexport function useUserManagement(): UseUserManagementReturn {\n const { credentials, config } = useFlowstack();\n\n const [users, setUsers] = useState<ManagedUser[]>([]);\n const [stats, setStats] = useState<UserStats | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [canManageUsers, setCanManageUsers] = useState(false);\n const [pagination, setPagination] = useState({\n page: 1,\n limit: 20,\n totalCount: 0,\n hasMore: false,\n });\n\n // Filter state\n const [search, setSearch] = useState('');\n const [roleFilter, setRoleFilter] = useState<UserRole | null>(null);\n const [statusFilter, setStatusFilter] = useState<UserStatus | null>(null);\n\n const clientConfig = {\n baseUrl: config.baseUrl,\n tenantId: config.tenantId,\n };\n\n const isMockMode = config.mode === 'mock';\n\n /**\n * Check admin permissions on mount\n */\n useEffect(() => {\n const checkPermissions = async () => {\n if (!credentials && !isMockMode) {\n setCanManageUsers(false);\n return;\n }\n\n if (isMockMode) {\n // In mock mode, assume owner/admin can manage\n setCanManageUsers(true);\n return;\n }\n\n try {\n const response = await apiCheckAdminPermissions(credentials!, clientConfig);\n if (response.ok && response.data) {\n setCanManageUsers(response.data.canManageUsers);\n }\n } catch {\n setCanManageUsers(false);\n }\n };\n\n checkPermissions();\n }, [credentials, isMockMode, clientConfig]);\n\n /**\n * Refresh users list with optional parameters\n */\n const refreshUsers = useCallback(async (params?: UserListParams): Promise<void> => {\n setError(null);\n setIsLoading(true);\n\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n setIsLoading(false);\n return;\n }\n\n try {\n if (isMockMode) {\n await mockDelay(200, 500);\n\n // Apply filters to mock data\n let filtered = [...mockManagedUsers];\n\n const searchTerm = params?.search || search;\n if (searchTerm) {\n const lower = searchTerm.toLowerCase();\n filtered = filtered.filter(u =>\n u.email.toLowerCase().includes(lower) ||\n u.name?.toLowerCase().includes(lower)\n );\n }\n\n const role = params?.role || roleFilter;\n if (role) {\n filtered = filtered.filter(u => u.role === role);\n }\n\n const status = params?.status || statusFilter;\n if (status) {\n filtered = filtered.filter(u => u.status === status);\n }\n\n setUsers(filtered);\n setPagination(prev => ({\n ...prev,\n page: params?.page || prev.page,\n limit: params?.limit || prev.limit,\n totalCount: filtered.length,\n hasMore: false,\n }));\n return;\n }\n\n const response = await apiListUsers(credentials!, {\n page: params?.page || pagination.page,\n limit: params?.limit || pagination.limit,\n search: params?.search || search,\n role: params?.role || roleFilter || undefined,\n status: params?.status || statusFilter || undefined,\n sortBy: params?.sortBy,\n sortOrder: params?.sortOrder,\n }, clientConfig);\n\n if (response.ok && response.data) {\n setUsers(response.data.users);\n setPagination({\n page: response.data.page,\n limit: response.data.limit,\n totalCount: response.data.totalCount,\n hasMore: response.data.hasMore,\n });\n } else {\n setError(response.error || 'Failed to load users');\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to load users';\n setError(message);\n } finally {\n setIsLoading(false);\n }\n }, [credentials, isMockMode, clientConfig, pagination.page, pagination.limit, search, roleFilter, statusFilter]);\n\n /**\n * Get a single user by ID\n */\n const getUser = useCallback(async (userId: string): Promise<ManagedUser | null> => {\n setError(null);\n\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n return null;\n }\n\n try {\n if (isMockMode) {\n await mockDelay(100, 300);\n return mockManagedUsers.find(u => u.id === userId) || null;\n }\n\n const response = await apiGetUser(credentials!, userId, clientConfig);\n if (response.ok && response.data) {\n return response.data.user;\n }\n\n setError(response.error || 'User not found');\n return null;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to get user';\n setError(message);\n return null;\n }\n }, [credentials, isMockMode, clientConfig]);\n\n /**\n * Update a user's profile or role\n */\n const updateUser = useCallback(async (\n userId: string,\n updates: UpdateUserRequest\n ): Promise<boolean> => {\n setError(null);\n\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n return false;\n }\n\n try {\n if (isMockMode) {\n await mockDelay(200, 400);\n // Update local state\n setUsers(prev => prev.map(u =>\n u.id === userId ? { ...u, ...updates } : u\n ));\n return true;\n }\n\n const response = await apiUpdateUser(credentials!, userId, updates, clientConfig);\n if (response.ok && response.data) {\n // Update local state with response\n setUsers(prev => prev.map(u =>\n u.id === userId ? response.data!.user : u\n ));\n return true;\n }\n\n setError(response.error || 'Failed to update user');\n return false;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to update user';\n setError(message);\n return false;\n }\n }, [credentials, isMockMode, clientConfig]);\n\n /**\n * Suspend a user account\n */\n const suspendUser = useCallback(async (\n userId: string,\n reason?: string\n ): Promise<boolean> => {\n setError(null);\n\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n return false;\n }\n\n try {\n if (isMockMode) {\n await mockDelay(200, 400);\n setUsers(prev => prev.map(u =>\n u.id === userId ? { ...u, status: 'suspended' as UserStatus } : u\n ));\n return true;\n }\n\n const response = await apiSuspendUser(credentials!, userId, reason, clientConfig);\n if (response.ok && response.data) {\n setUsers(prev => prev.map(u =>\n u.id === userId ? response.data!.user : u\n ));\n return true;\n }\n\n setError(response.error || 'Failed to suspend user');\n return false;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to suspend user';\n setError(message);\n return false;\n }\n }, [credentials, isMockMode, clientConfig]);\n\n /**\n * Reactivate a suspended user account\n */\n const reactivateUser = useCallback(async (userId: string): Promise<boolean> => {\n setError(null);\n\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n return false;\n }\n\n try {\n if (isMockMode) {\n await mockDelay(200, 400);\n setUsers(prev => prev.map(u =>\n u.id === userId ? { ...u, status: 'active' as UserStatus } : u\n ));\n return true;\n }\n\n const response = await apiReactivateUser(credentials!, userId, clientConfig);\n if (response.ok && response.data) {\n setUsers(prev => prev.map(u =>\n u.id === userId ? response.data!.user : u\n ));\n return true;\n }\n\n setError(response.error || 'Failed to reactivate user');\n return false;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to reactivate user';\n setError(message);\n return false;\n }\n }, [credentials, isMockMode, clientConfig]);\n\n /**\n * Delete a user permanently\n */\n const deleteUser = useCallback(async (userId: string): Promise<boolean> => {\n setError(null);\n\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n return false;\n }\n\n try {\n if (isMockMode) {\n await mockDelay(200, 400);\n setUsers(prev => prev.filter(u => u.id !== userId));\n return true;\n }\n\n const response = await apiDeleteUser(credentials!, userId, clientConfig);\n if (response.ok) {\n setUsers(prev => prev.filter(u => u.id !== userId));\n return true;\n }\n\n setError(response.error || 'Failed to delete user');\n return false;\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to delete user';\n setError(message);\n return false;\n }\n }, [credentials, isMockMode, clientConfig]);\n\n /**\n * Get user activity logs\n */\n const getUserActivity = useCallback(async (\n userId: string,\n limit: number = 50\n ): Promise<UserActivityLog[]> => {\n setError(null);\n\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n return [];\n }\n\n try {\n if (isMockMode) {\n await mockDelay(100, 300);\n return mockUserActivity.filter(a => a.userId === userId).slice(0, limit);\n }\n\n const response = await apiGetUserActivity(credentials!, userId, limit, clientConfig);\n if (response.ok && response.data) {\n return response.data.activities;\n }\n\n setError(response.error || 'Failed to get activity');\n return [];\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to get activity';\n setError(message);\n return [];\n }\n }, [credentials, isMockMode, clientConfig]);\n\n /**\n * Refresh user statistics\n */\n const refreshStats = useCallback(async (): Promise<void> => {\n setError(null);\n\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n return;\n }\n\n try {\n if (isMockMode) {\n await mockDelay(100, 300);\n setStats(mockUserStats);\n return;\n }\n\n const response = await apiGetUserStats(credentials!, clientConfig);\n if (response.ok && response.data) {\n setStats(response.data);\n } else {\n setError(response.error || 'Failed to load stats');\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to load stats';\n setError(message);\n }\n }, [credentials, isMockMode, clientConfig]);\n\n /**\n * Set page for pagination\n */\n const setPage = useCallback((page: number) => {\n setPagination(prev => ({ ...prev, page }));\n }, []);\n\n /**\n * Set role filter\n */\n const setRoleFilterCallback = useCallback((role: UserRole | null) => {\n setRoleFilter(role);\n setPagination(prev => ({ ...prev, page: 1 }));\n }, []);\n\n /**\n * Set status filter\n */\n const setStatusFilterCallback = useCallback((status: UserStatus | null) => {\n setStatusFilter(status);\n setPagination(prev => ({ ...prev, page: 1 }));\n }, []);\n\n /**\n * Set search term\n */\n const setSearchCallback = useCallback((searchTerm: string) => {\n setSearch(searchTerm);\n setPagination(prev => ({ ...prev, page: 1 }));\n }, []);\n\n // Load users and stats on mount if authenticated\n useEffect(() => {\n if (credentials || isMockMode) {\n refreshUsers();\n refreshStats();\n }\n }, [credentials, isMockMode]);\n\n return {\n users,\n stats,\n isLoading,\n error,\n pagination,\n refreshUsers,\n getUser,\n updateUser,\n suspendUser,\n reactivateUser,\n deleteUser,\n getUserActivity,\n refreshStats,\n setPage,\n setSearch: setSearchCallback,\n setRoleFilter: setRoleFilterCallback,\n setStatusFilter: setStatusFilterCallback,\n canManageUsers,\n };\n}\n","'use client';\n\n/**\n * useSites Hook\n *\n * Provides published site management — list, create, stage files, publish to CDN, delete.\n *\n * @example\n * ```tsx\n * function SiteManager() {\n * const { sites, createSite, deleteSite, isLoading } = useSites();\n *\n * return (\n * <div>\n * {sites.map(site => (\n * <div key={site.id}>\n * <a href={site.url}>{site.name}</a>\n * <button onClick={() => deleteSite(site.id)}>Delete</button>\n * </div>\n * ))}\n * <button onClick={() => createSite({\n * name: 'My Site',\n * files: { 'index.html': '<html>Hello</html>' }\n * })}>\n * Quick Publish\n * </button>\n * </div>\n * );\n * }\n * ```\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport type { PublishedSiteInfo, UseSitesReturn, CreateSiteParams } from '../types';\nimport {\n listSites as apiListSites,\n createSite as apiCreateSite,\n addSiteFile as apiAddSiteFile,\n publishStagedSite as apiPublishStagedSite,\n deleteSite as apiDeleteSite,\n} from '../api/client';\n\n/**\n * Hook for published site management\n */\nexport function useSites(): UseSitesReturn {\n const { credentials, config } = useFlowstack();\n\n const [sites, setSites] = useState<PublishedSiteInfo[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const isMockMode = config.mode === 'mock';\n const clientConfig = {\n baseUrl: config.baseUrl,\n tenantId: config.tenantId,\n };\n\n /**\n * Normalize backend response to PublishedSiteInfo\n */\n const normalizeSite = (raw: Record<string, unknown>): PublishedSiteInfo => ({\n id: (raw.site_id || raw.id || '') as string,\n name: (raw.site_name || raw.name || '') as string,\n url: (raw.url || '') as string,\n shortUrl: (raw.short_url || raw.shortUrl) as string | undefined,\n siteType: (raw.site_type || raw.siteType || 'on_demand') as PublishedSiteInfo['siteType'],\n fileCount: (raw.file_count || raw.fileCount || 0) as number,\n totalBytes: (raw.total_bytes || raw.totalBytes) as number | undefined,\n createdAt: (raw.created_at || raw.createdAt || '') as string,\n description: (raw.description) as string | undefined,\n metadata: (raw.metadata) as Record<string, unknown> | undefined,\n currentVersion: (raw.current_version || raw.currentVersion) as number | undefined,\n liveVersion: (raw.live_version || raw.liveVersion) as number | undefined,\n subdomainUrl: (raw.subdomain_url || raw.subdomainUrl) as string | undefined,\n alias: (raw.alias ?? undefined) as string | null | undefined,\n });\n\n /**\n * Refresh the sites list\n */\n const refreshSites = useCallback(async () => {\n if (!credentials && !isMockMode) return;\n setIsLoading(true);\n setError(null);\n\n try {\n if (isMockMode) {\n setSites([]);\n return;\n }\n\n const response = await apiListSites(credentials!, clientConfig);\n if (response.ok && response.data) {\n const rawSites = (response.data as Record<string, unknown>).sites as Record<string, unknown>[];\n setSites((rawSites || []).map(normalizeSite));\n } else {\n setError(response.error || 'Failed to load sites');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load sites');\n } finally {\n setIsLoading(false);\n }\n }, [credentials, isMockMode, config.baseUrl]);\n\n // Auto-load on mount\n useEffect(() => {\n refreshSites();\n }, [refreshSites]);\n\n /**\n * Create a new site. If files provided, publishes immediately.\n */\n const createSite = useCallback(async (params: CreateSiteParams): Promise<PublishedSiteInfo | null> => {\n if (!credentials && !isMockMode) {\n setError('Not authenticated');\n return null;\n }\n setError(null);\n\n try {\n const response = await apiCreateSite(credentials!, params, clientConfig);\n if (response.ok && response.data) {\n const data = response.data as Record<string, unknown>;\n const site = data.site as Record<string, unknown> | undefined;\n if (site) {\n const normalized = normalizeSite(site);\n setSites(prev => [normalized, ...prev]);\n return normalized;\n }\n // Staging mode — return partial info\n return {\n id: data.site_id as string,\n name: params.name,\n url: '',\n siteType: params.siteType || 'on_demand',\n fileCount: 0,\n createdAt: new Date().toISOString(),\n };\n }\n setError(response.error || 'Failed to create site');\n return null;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to create site');\n return null;\n }\n }, [credentials, isMockMode, config.baseUrl]);\n\n /**\n * Add a file to a staged site\n */\n const addFile = useCallback(async (siteId: string, path: string, content: string): Promise<boolean> => {\n if (!credentials) {\n setError('Not authenticated');\n return false;\n }\n setError(null);\n\n try {\n const response = await apiAddSiteFile(credentials, siteId, path, content, clientConfig);\n return response.ok;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to add file');\n return false;\n }\n }, [credentials, config.baseUrl]);\n\n /**\n * Publish a staged site to CDN\n */\n const publishSite = useCallback(async (siteId: string): Promise<PublishedSiteInfo | null> => {\n if (!credentials) {\n setError('Not authenticated');\n return null;\n }\n setError(null);\n\n try {\n const response = await apiPublishStagedSite(credentials, siteId, clientConfig);\n if (response.ok && response.data) {\n const site = (response.data as Record<string, unknown>).site as Record<string, unknown>;\n if (site) {\n const normalized = normalizeSite(site);\n await refreshSites();\n return normalized;\n }\n }\n setError(response.error || 'Failed to publish site');\n return null;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to publish site');\n return null;\n }\n }, [credentials, config.baseUrl, refreshSites]);\n\n /**\n * Delete a published site\n */\n const deleteSite = useCallback(async (siteId: string): Promise<boolean> => {\n if (!credentials) {\n setError('Not authenticated');\n return false;\n }\n setError(null);\n\n try {\n const response = await apiDeleteSite(credentials, siteId, clientConfig);\n if (response.ok) {\n setSites(prev => prev.filter(s => s.id !== siteId));\n return true;\n }\n setError(response.error || 'Failed to delete site');\n return false;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to delete site');\n return false;\n }\n }, [credentials, config.baseUrl]);\n\n return {\n sites,\n isLoading,\n error,\n createSite,\n addFile,\n publishSite,\n deleteSite,\n refreshSites,\n };\n}\n","'use client';\n\n/**\n * useAgents Hook\n *\n * Fetches the catalog of available agents from the backend.\n * Use this to discover which agents can be targeted directly via useAgent's targetAgent option.\n *\n * @example\n * ```tsx\n * function AgentPicker() {\n * const { agents, isLoading } = useAgents();\n *\n * return (\n * <select>\n * {agents.map(agent => (\n * <option key={agent.name} value={agent.name}>\n * {agent.description}\n * </option>\n * ))}\n * </select>\n * );\n * }\n * ```\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstackOptional } from '../context/FlowstackProvider';\nimport { listAgents as apiListAgents } from '../api/client';\nimport type { AgentInfo, UseAgentsReturn } from '../types';\n\nexport function useAgents(): UseAgentsReturn {\n const flowstack = useFlowstackOptional();\n\n const [agents, setAgents] = useState<AgentInfo[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const clientConfig = {\n baseUrl: flowstack?.config?.baseUrl,\n tenantId: flowstack?.config?.tenantId,\n };\n\n const refreshAgents = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await apiListAgents(clientConfig);\n if (result.ok && result.data) {\n // Normalize snake_case from backend to camelCase\n const normalized = result.data.agents.map((a: any) => ({\n name: a.name,\n description: a.description || '',\n tools: a.tools || [],\n triggerPhrases: a.trigger_phrases || a.triggerPhrases || [],\n useFor: a.use_for || a.useFor || [],\n isTerminal: a.is_terminal ?? a.isTerminal ?? false,\n }));\n setAgents(normalized);\n } else {\n setError(result.error || 'Failed to fetch agents');\n }\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Failed to fetch agents');\n } finally {\n setIsLoading(false);\n }\n }, [flowstack?.config?.baseUrl]);\n\n useEffect(() => {\n refreshAgents();\n }, [refreshAgents]);\n\n return { agents, isLoading, error, refreshAgents };\n}\n","'use client';\n\n/**\n * useToolInvocation — Direct tool invocation hook.\n *\n * Calls an agent tool directly, bypassing LLM orchestration. Use for tools\n * marked with invocationPattern: \"direct\" in the agent manifest.\n *\n * Returns structured JSON (not streaming). Ideal for:\n * - Form submissions (mongodb_insert)\n * - Data fetching (mongodb_query)\n * - Single-purpose operations (list, describe, aggregate)\n *\n * For complex workflows requiring LLM reasoning, use useAgent instead.\n *\n * @example\n * ```tsx\n * function TransactionForm() {\n * const { invoke, isLoading } = useToolInvocation({\n * agentName: 'finance_agent',\n * toolName: 'mongodb_insert',\n * });\n *\n * const handleSubmit = async (data: FormData) => {\n * const result = await invoke({\n * collection: 'transactions',\n * document: { date: data.date, amount: data.amount },\n * });\n * };\n * }\n * ```\n *\n * @example\n * ```tsx\n * function TransactionTable() {\n * const { invoke, result, isLoading } = useToolInvocation({\n * agentName: 'finance_agent',\n * toolName: 'mongodb_query',\n * });\n *\n * useEffect(() => {\n * invoke({ collection: 'transactions', sort: { date: -1 }, limit: 50 });\n * }, []);\n *\n * return isLoading ? <Spinner /> : (\n * <table>{result?.map(row => <tr key={row._id}>...</tr>)}</table>\n * );\n * }\n * ```\n */\n\nimport { useState, useCallback, useRef } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport { invokeTool } from '../api/client';\n\nexport interface UseToolInvocationOptions {\n /** Target agent name (e.g. \"finance_agent\") */\n agentName: string;\n /** Tool to invoke (e.g. \"mongodb_query\") */\n toolName: string;\n}\n\nexport interface UseToolInvocationReturn<T = any> {\n /** Call the tool with keyword arguments */\n invoke: (kwargs?: Record<string, any>) => Promise<T | null>;\n /** Last successful result */\n result: T | null;\n /** True while the tool call is in flight */\n isLoading: boolean;\n /** Error message from the last failed call */\n error: string | null;\n /** Reset result and error state */\n reset: () => void;\n}\n\nexport function useToolInvocation<T = any>(\n options: UseToolInvocationOptions\n): UseToolInvocationReturn<T> {\n const { agentName, toolName } = options;\n const { credentials, config } = useFlowstack();\n\n const [result, setResult] = useState<T | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Prevent concurrent calls to the same tool\n const inflightRef = useRef(false);\n\n const invoke = useCallback(\n async (kwargs: Record<string, any> = {}): Promise<T | null> => {\n if (!credentials) {\n const msg = 'Not authenticated — cannot invoke tool';\n setError(msg);\n console.error(`[useToolInvocation] ${msg}`);\n return null;\n }\n\n if (inflightRef.current) {\n console.warn(`[useToolInvocation] ${agentName}.${toolName} already in flight — skipping`);\n return null;\n }\n\n inflightRef.current = true;\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await invokeTool<T>(\n credentials,\n agentName,\n toolName,\n kwargs,\n config,\n );\n\n if (!response.ok) {\n const errMsg = response.error || `Tool invocation failed (${response.status})`;\n setError(errMsg);\n console.error(`[useToolInvocation] ${agentName}.${toolName} failed:`, errMsg);\n return null;\n }\n\n const toolResult = response.data?.result ?? (response.data as any);\n setResult(toolResult);\n return toolResult;\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : 'Tool invocation failed';\n setError(errMsg);\n console.error(`[useToolInvocation] ${agentName}.${toolName} error:`, err);\n return null;\n } finally {\n inflightRef.current = false;\n setIsLoading(false);\n }\n },\n [credentials, config, agentName, toolName]\n );\n\n const reset = useCallback(() => {\n setResult(null);\n setError(null);\n }, []);\n\n return { invoke, result, isLoading, error, reset };\n}\n","/**\n * useConnections — Manage external service connections (Google, Reddit, Strava, Twitter, GitHub).\n *\n * Provides status, connect, and disconnect for all supported OAuth integrations.\n * Built apps should include a Settings page that renders connection cards\n * so users can link their accounts to enable agent capabilities.\n *\n * Usage:\n * const { connections, connect, disconnect, refresh, isLoading } = useConnections();\n *\n * // Check if Google Analytics is connected\n * connections.google?.analytics // true | false\n *\n * // Connect Google services\n * connect('google', ['analytics', 'drive']);\n *\n * // Disconnect Reddit\n * disconnect('reddit');\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport { flowstackFetch } from '../api/client';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface GoogleConnectionStatus {\n connected: boolean;\n email?: string;\n analytics?: boolean;\n ads?: boolean;\n drive?: boolean;\n youtube?: boolean;\n scopes?: string[];\n}\n\nexport interface ServiceConnectionStatus {\n connected: boolean;\n username?: string;\n}\n\nexport interface GitHubConnectionStatus {\n connected: boolean;\n username?: string;\n avatarUrl?: string;\n}\n\nexport interface ConnectionsState {\n google: GoogleConnectionStatus;\n reddit: ServiceConnectionStatus;\n strava: ServiceConnectionStatus;\n twitter: ServiceConnectionStatus;\n github: GitHubConnectionStatus;\n}\n\nexport type GoogleService = 'analytics' | 'ads' | 'drive' | 'youtube' | 'all';\nexport type ServiceProvider = 'google' | 'reddit' | 'strava' | 'twitter' | 'github';\n\nexport interface UseConnectionsReturn {\n /** Current connection status for all services */\n connections: ConnectionsState;\n /** Loading state */\n isLoading: boolean;\n /** Error message */\n error: string | null;\n /** Connect a service — opens OAuth popup/redirect */\n connect: (provider: ServiceProvider, services?: GoogleService[]) => Promise<void>;\n /** Disconnect a service */\n disconnect: (provider: ServiceProvider) => Promise<void>;\n /** Refresh connection status */\n refresh: () => Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// Default state\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_STATE: ConnectionsState = {\n google: { connected: false },\n reddit: { connected: false },\n strava: { connected: false },\n twitter: { connected: false },\n github: { connected: false },\n};\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useConnections(): UseConnectionsReturn {\n const { credentials, config } = useFlowstack();\n const [connections, setConnections] = useState<ConnectionsState>(DEFAULT_STATE);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const clientConfig = { baseUrl: config.baseUrl, tenantId: config.tenantId };\n\n // Fetch status for all services\n const refresh = useCallback(async () => {\n if (!credentials) return;\n setIsLoading(true);\n setError(null);\n\n try {\n const [googleRes, redditRes, stravaRes, twitterRes, githubRes] = await Promise.allSettled([\n flowstackFetch<any>('/auth/google/status', { credentials }, clientConfig),\n flowstackFetch<any>('/auth/reddit/status', { credentials }, clientConfig),\n flowstackFetch<any>('/auth/strava/status', { credentials }, clientConfig),\n flowstackFetch<any>('/auth/twitter/status', { credentials }, clientConfig),\n flowstackFetch<any>('/auth/github/status', { credentials }, clientConfig),\n ]);\n\n const resolveStatus = (res: PromiseSettledResult<any>) =>\n res.status === 'fulfilled' && res.value.ok ? res.value.data : { connected: false };\n\n setConnections({\n google: resolveStatus(googleRes),\n reddit: resolveStatus(redditRes),\n strava: resolveStatus(stravaRes),\n twitter: resolveStatus(twitterRes),\n github: resolveStatus(githubRes),\n });\n } catch (err: any) {\n setError(err.message || 'Failed to fetch connection status');\n } finally {\n setIsLoading(false);\n }\n }, [credentials, config.baseUrl, config.tenantId]);\n\n // Fetch on mount\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n // Connect a service — opens OAuth in a popup or redirects\n const connect = useCallback(async (provider: ServiceProvider, services?: GoogleService[]) => {\n if (!credentials) throw new Error('Not authenticated');\n setError(null);\n\n try {\n let startUrl: string;\n\n if (provider === 'google') {\n const scopes = services?.join(',') || 'all';\n // Strip any leftover google_oauth query params from the URL before using as\n // redirect_uri — a previous failed attempt leaves ?google_oauth=error&... in\n // the URL, which then gets encoded into the next attempt's state, causing the\n // success redirect to append ?google_oauth=success on top of the error params.\n const cleanUrl = (() => {\n const u = new URL(window.location.href);\n ['google_oauth', 'email', 'message'].forEach(p => u.searchParams.delete(p));\n return u.toString();\n })();\n const returnUrl = encodeURIComponent(cleanUrl);\n const res = await flowstackFetch<{ auth_url: string }>(\n `/auth/google/start?scopes=${scopes}&redirect_uri=${returnUrl}`,\n { credentials },\n clientConfig,\n );\n if (!res.ok || !res.data?.auth_url) throw new Error('Failed to start Google OAuth');\n startUrl = res.data.auth_url;\n } else {\n const cleanUrl = (() => {\n const u = new URL(window.location.href);\n ['google_oauth', 'email', 'message'].forEach(p => u.searchParams.delete(p));\n return u.toString();\n })();\n const returnUrl = encodeURIComponent(cleanUrl);\n const res = await flowstackFetch<{ auth_url: string }>(\n `/auth/${provider}/start?redirect_uri=${returnUrl}`,\n { credentials },\n clientConfig,\n );\n if (!res.ok || !res.data?.auth_url) throw new Error(`Failed to start ${provider} OAuth`);\n startUrl = res.data.auth_url;\n }\n\n // Open OAuth in popup.\n // The backend callback returns an HTML page that postMessages the result back here\n // and calls window.close() — no redirect into the popup that would load the full app.\n const popup = window.open(startUrl, `${provider}_oauth`, 'width=600,height=700,scrollbars=yes');\n if (popup) {\n // Listen for the postMessage from the callback page\n const onMessage = (event: MessageEvent) => {\n if (\n event.data?.type === 'flowstack-google-oauth' ||\n event.data?.type === `flowstack-${provider}-oauth`\n ) {\n window.removeEventListener('message', onMessage);\n clearInterval(fallbackTimer);\n refresh();\n }\n };\n window.addEventListener('message', onMessage);\n\n // Fallback: if popup closes without postMessage (user closed it manually)\n const fallbackTimer = setInterval(() => {\n if (popup.closed) {\n clearInterval(fallbackTimer);\n window.removeEventListener('message', onMessage);\n refresh();\n }\n }, 500);\n } else {\n // Popup blocked — fall back to full-page redirect\n window.location.href = startUrl;\n }\n } catch (err: any) {\n setError(err.message || `Failed to connect ${provider}`);\n }\n }, [credentials, config.baseUrl, config.tenantId, refresh]);\n\n // Disconnect a service\n const disconnect = useCallback(async (provider: ServiceProvider) => {\n if (!credentials) throw new Error('Not authenticated');\n setError(null);\n\n try {\n if (provider === 'google') {\n await flowstackFetch('/auth/google/revoke', { method: 'POST', credentials }, clientConfig);\n } else {\n await flowstackFetch(`/auth/${provider}/disconnect`, { method: 'POST', credentials }, clientConfig);\n }\n await refresh();\n } catch (err: any) {\n setError(err.message || `Failed to disconnect ${provider}`);\n }\n }, [credentials, config.baseUrl, config.tenantId, refresh]);\n\n return { connections, isLoading, error, connect, disconnect, refresh };\n}\n","/**\n * useThreads — list a built-app user's private message threads (P0-138).\n *\n * Backed by the server-owned, ACL'd DM store: the backend only ever returns\n * threads the authenticated caller participates in. Each thread carries the\n * counterpart's user key, the last message, and an unread count.\n *\n * Private messaging is a built-app capability — requires an `appScope` on the\n * FlowstackProvider config. In a Casino personal session the backend returns 403\n * and this hook surfaces an error.\n *\n * Usage:\n * const { threads, isLoading, refresh } = useThreads({ refreshInterval: 5000 });\n * threads.map(t => <ThreadRow key={t.pair_key} counterpart={t.with_user_key} ... />)\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport { listThreads, openThread as openThreadApi } from '../api/client';\nimport type { DmThread } from '../api/client';\n\nexport interface UseThreadsOptions {\n /** Auto-poll interval in ms (optional — no polling by default). */\n refreshInterval?: number;\n /** Skip initial fetch. */\n enabled?: boolean;\n}\n\nexport interface UseThreadsReturn {\n threads: DmThread[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n /**\n * Record the caller's consent to open a thread with `withUserKey`. The thread\n * becomes sendable only once BOTH parties have consented. Idempotent per caller;\n * refetches the thread list on success. Returns the resulting status.\n */\n openThread: (withUserKey: string) => Promise<'pending' | 'open' | null>;\n}\n\nexport function useThreads(options?: UseThreadsOptions): UseThreadsReturn {\n const { credentials, config } = useFlowstack();\n const [threads, setThreads] = useState<DmThread[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const enabled = options?.enabled !== false;\n const clientConfig = {\n baseUrl: config.baseUrl,\n tenantId: config.tenantId,\n appScope: config.appScope,\n };\n\n const refresh = useCallback(async () => {\n if (!credentials || !enabled) return;\n setIsLoading(true);\n setError(null);\n try {\n const res = await listThreads(credentials, clientConfig);\n if (res.ok && res.data) {\n setThreads(res.data.threads);\n } else {\n setError(res.error || 'Failed to load threads');\n }\n } catch (err: any) {\n setError(err?.message || 'Failed to load threads');\n } finally {\n setIsLoading(false);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [credentials, config.baseUrl, config.tenantId, config.appScope, enabled]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n // Optional polling\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n useEffect(() => {\n if (!options?.refreshInterval || !enabled) return;\n intervalRef.current = setInterval(refresh, options.refreshInterval);\n return () => {\n if (intervalRef.current) clearInterval(intervalRef.current);\n };\n }, [options?.refreshInterval, enabled, refresh]);\n\n const openThread = useCallback(\n async (withUserKey: string): Promise<'pending' | 'open' | null> => {\n if (!credentials || !withUserKey) return null;\n const res = await openThreadApi(credentials, withUserKey, clientConfig);\n if (res.ok && res.data) {\n await refresh();\n return res.data.status as 'pending' | 'open';\n }\n setError(res.error || 'Failed to open thread');\n return null;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [credentials, config.baseUrl, config.tenantId, config.appScope, refresh],\n );\n\n return { threads, isLoading, error, refresh, openThread };\n}\n","/**\n * useMessages — read + send private messages in one thread (P0-138).\n *\n * Mirrors `useCollection`'s ergonomics but is backed by the server-owned, ACL'd\n * DM endpoints instead of a Mongo collection. The backend pins the sender to the\n * caller's identity and only delivers into a mutually-consented (open) thread, so\n * a `send()` to a not-yet-open thread returns an error.\n *\n * SECURITY: message bodies are UNTRUSTED user input. Render them as plain text or\n * sanitized markdown — never as raw HTML (no dangerouslySetInnerHTML). If a body\n * is ever fed to an agent, treat it as data, not instructions.\n *\n * Usage:\n * const { messages, send, isLoading, refresh } = useMessages(counterpartUserKey, {\n * refreshInterval: 4000,\n * });\n * await send('hey there');\n * messages.map(m => <Bubble key={m.message_id} mine={m.from === myKey}>{m.body}</Bubble>)\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport { listMessages, sendMessage } from '../api/client';\nimport type { DmMessage } from '../api/client';\n\nexport interface UseMessagesOptions {\n /** Max messages to load (default 50, max 200). */\n limit?: number;\n /** Auto-poll interval in ms (optional — no polling by default). */\n refreshInterval?: number;\n /** Skip initial fetch (e.g. before a counterpart is selected). */\n enabled?: boolean;\n}\n\nexport interface UseMessagesReturn {\n messages: DmMessage[];\n isLoading: boolean;\n error: string | null;\n /** Send a message to the counterpart. Refetches on success. */\n send: (body: string) => Promise<void>;\n refresh: () => Promise<void>;\n}\n\nexport function useMessages(\n withUserKey: string | null | undefined,\n options?: UseMessagesOptions,\n): UseMessagesReturn {\n const { credentials, config } = useFlowstack();\n const [messages, setMessages] = useState<DmMessage[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const enabled = options?.enabled !== false && !!withUserKey;\n const clientConfig = {\n baseUrl: config.baseUrl,\n tenantId: config.tenantId,\n appScope: config.appScope,\n };\n\n const refresh = useCallback(async () => {\n if (!credentials || !withUserKey || !enabled) return;\n setIsLoading(true);\n setError(null);\n try {\n const res = await listMessages(\n credentials,\n withUserKey,\n { limit: options?.limit },\n clientConfig,\n );\n if (res.ok && res.data) {\n setMessages(res.data.messages);\n } else {\n setError(res.error || 'Failed to load messages');\n }\n } catch (err: any) {\n setError(err?.message || 'Failed to load messages');\n } finally {\n setIsLoading(false);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [credentials, withUserKey, config.baseUrl, config.tenantId, config.appScope, enabled, options?.limit]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n // Optional polling\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n useEffect(() => {\n if (!options?.refreshInterval || !enabled) return;\n intervalRef.current = setInterval(refresh, options.refreshInterval);\n return () => {\n if (intervalRef.current) clearInterval(intervalRef.current);\n };\n }, [options?.refreshInterval, enabled, refresh]);\n\n const send = useCallback(\n async (body: string) => {\n if (!credentials) throw new Error('Not authenticated');\n if (!withUserKey) throw new Error('No counterpart selected');\n if (!body || !body.trim()) return;\n setError(null);\n const res = await sendMessage(credentials, withUserKey, body, clientConfig);\n if (!res.ok) {\n const msg = res.error || 'Failed to send message';\n setError(msg);\n throw new Error(msg);\n }\n await refresh();\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [credentials, withUserKey, config.baseUrl, config.tenantId, config.appScope, refresh],\n );\n\n return { messages, isLoading, error, send, refresh };\n}\n","'use client';\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport type { SiteVersion, SiteVersionManifest, UseSiteVersionsReturn } from '../types';\nimport {\n getSiteVersions as apiGetVersions,\n promoteSiteVersion as apiPromote,\n deleteSiteVersion as apiDeleteVersion,\n} from '../api/client';\n\nfunction normalizeVersion(raw: Record<string, unknown>): SiteVersion {\n return {\n version: (raw.version || 0) as number,\n type: (raw.type || 'build') as SiteVersion['type'],\n createdAt: (raw.created_at || raw.createdAt || '') as string,\n description: (raw.description) as string | undefined,\n fileCount: (raw.file_count || raw.fileCount || 0) as number,\n totalBytes: (raw.total_bytes || raw.totalBytes || 0) as number,\n url: (raw.url || '') as string,\n };\n}\n\nfunction normalizeManifest(raw: Record<string, unknown>): SiteVersionManifest {\n const versions = raw.versions as Record<string, unknown>[] | undefined;\n return {\n siteId: (raw.site_id || raw.siteId || '') as string,\n name: (raw.name || '') as string,\n liveVersion: (raw.live_version || raw.liveVersion || 1) as number,\n versions: (versions || []).map(normalizeVersion),\n alias: (raw.alias ?? null) as string | null,\n githubRepo: (raw.github_repo || raw.githubRepo || null) as SiteVersionManifest['githubRepo'],\n };\n}\n\nexport function useSiteVersions(siteId: string | null): UseSiteVersionsReturn {\n const { credentials, config } = useFlowstack();\n\n const [versions, setVersions] = useState<SiteVersion[]>([]);\n const [liveVersion, setLiveVersion] = useState<number | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const clientConfig = {\n baseUrl: config.baseUrl,\n tenantId: config.tenantId,\n };\n\n const refresh = useCallback(async () => {\n if (!siteId || !credentials) return;\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await apiGetVersions(credentials, siteId, clientConfig);\n if (response.ok && response.data) {\n const manifest = normalizeManifest(response.data as unknown as Record<string, unknown>);\n setVersions(manifest.versions);\n setLiveVersion(manifest.liveVersion);\n } else {\n setError(response.error || 'Failed to load versions');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load versions');\n } finally {\n setIsLoading(false);\n }\n }, [siteId, credentials, config.baseUrl]);\n\n useEffect(() => {\n if (siteId) {\n refresh();\n } else {\n setVersions([]);\n setLiveVersion(null);\n setError(null);\n }\n }, [siteId, refresh]);\n\n const promote = useCallback(async (version: number): Promise<boolean> => {\n if (!siteId || !credentials) return false;\n setError(null);\n\n try {\n const response = await apiPromote(credentials, siteId, version, clientConfig);\n if (response.ok && response.data) {\n const manifest = normalizeManifest(response.data as unknown as Record<string, unknown>);\n setVersions(manifest.versions);\n setLiveVersion(manifest.liveVersion);\n return true;\n }\n setError(response.error || 'Failed to promote version');\n return false;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to promote version');\n return false;\n }\n }, [siteId, credentials, config.baseUrl]);\n\n const deleteVersion = useCallback(async (version: number): Promise<boolean> => {\n if (!siteId || !credentials) return false;\n setError(null);\n\n try {\n const response = await apiDeleteVersion(credentials, siteId, version, clientConfig);\n if (response.ok && response.data) {\n const manifest = normalizeManifest(response.data as unknown as Record<string, unknown>);\n setVersions(manifest.versions);\n setLiveVersion(manifest.liveVersion);\n return true;\n }\n setError(response.error || 'Failed to delete version');\n return false;\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to delete version');\n return false;\n }\n }, [siteId, credentials, config.baseUrl]);\n\n return {\n versions,\n liveVersion,\n isLoading,\n error,\n promote,\n deleteVersion,\n refresh,\n };\n}\n","/**\n * useProviderCredentials — Manage LLM provider credentials (BYOK + Ollama).\n *\n * Wraps the /api/v1/user/provider-credentials backend endpoints.\n * Used by the Casino \"Models\" settings tab to list, create, and delete\n * provider credentials including Ollama local inference.\n *\n * Usage:\n * const { credentials, purposes, createCredential, deleteCredential, isLoading } = useProviderCredentials();\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport { flowstackFetch } from '../api/client';\nimport type { ProviderCredential, PurposeInfo, LLMProvider, ProviderModelSettings } from '../types';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface CreateCredentialParams {\n provider: LLMProvider;\n api_key?: string;\n host?: string;\n model_id?: string;\n purpose?: string;\n is_default?: boolean;\n model_settings?: ProviderModelSettings;\n}\n\nexport interface UseProviderCredentialsReturn {\n credentials: ProviderCredential[];\n purposes: PurposeInfo[];\n createCredential: (params: CreateCredentialParams) => Promise<ProviderCredential>;\n deleteCredential: (credentialId: string) => Promise<void>;\n refresh: () => Promise<void>;\n isLoading: boolean;\n error: string | null;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nconst CRED_PATH = '/api/v1/user/provider-credentials';\n\nexport function useProviderCredentials(): UseProviderCredentialsReturn {\n const { credentials: authCredentials, config } = useFlowstack();\n const [credentials, setCredentials] = useState<ProviderCredential[]>([]);\n const [purposes, setPurposes] = useState<PurposeInfo[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const clientConfig = { baseUrl: config.baseUrl, tenantId: config.tenantId };\n\n const fetchCredentials = useCallback(async () => {\n if (!authCredentials) return;\n try {\n const res = await flowstackFetch<ProviderCredential[]>(\n CRED_PATH,\n { credentials: authCredentials },\n clientConfig,\n );\n if (res.ok && res.data) {\n setCredentials(Array.isArray(res.data) ? res.data : []);\n }\n } catch (err: any) {\n setError(err.message);\n }\n }, [authCredentials, clientConfig.baseUrl]);\n\n const fetchPurposes = useCallback(async () => {\n if (!authCredentials) return;\n try {\n const res = await flowstackFetch<PurposeInfo[]>(\n `${CRED_PATH}/purposes`,\n { credentials: authCredentials },\n clientConfig,\n );\n if (res.ok && res.data) {\n setPurposes(Array.isArray(res.data) ? res.data : []);\n }\n } catch {\n // Non-critical\n }\n }, [authCredentials, clientConfig.baseUrl]);\n\n const refresh = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n await Promise.all([fetchCredentials(), fetchPurposes()]);\n setIsLoading(false);\n }, [fetchCredentials, fetchPurposes]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n const createCredential = useCallback(async (params: CreateCredentialParams): Promise<ProviderCredential> => {\n if (!authCredentials) throw new Error('Not authenticated');\n const res = await flowstackFetch<ProviderCredential>(\n CRED_PATH,\n {\n method: 'POST',\n credentials: authCredentials,\n body: params,\n },\n clientConfig,\n );\n if (!res.ok) {\n throw new Error(res.error || `Failed to create credential: ${res.status}`);\n }\n await fetchCredentials();\n return res.data!;\n }, [authCredentials, clientConfig.baseUrl, fetchCredentials]);\n\n const deleteCredential = useCallback(async (credentialId: string): Promise<void> => {\n if (!authCredentials) throw new Error('Not authenticated');\n const res = await flowstackFetch(\n `${CRED_PATH}/${credentialId}`,\n {\n method: 'DELETE',\n credentials: authCredentials,\n },\n clientConfig,\n );\n if (!res.ok) {\n throw new Error(res.error || `Failed to delete credential: ${res.status}`);\n }\n await fetchCredentials();\n }, [authCredentials, clientConfig.baseUrl, fetchCredentials]);\n\n return {\n credentials,\n purposes,\n createCredential,\n deleteCredential,\n refresh,\n isLoading,\n error,\n };\n}\n","/**\n * useOllamaDetection — Detect a local Ollama instance and list available models.\n *\n * Probes the Ollama API at the given host (default: http://localhost:11434)\n * via GET /api/tags. If Ollama is running and CORS is enabled, returns the\n * list of locally available models.\n *\n * Note: Users must set OLLAMA_ORIGINS=* (or include the Casino origin) when\n * starting Ollama for browser-side detection to work.\n *\n * Usage:\n * const { available, models, error, detect } = useOllamaDetection();\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport type { OllamaStatus, OllamaLocalModel } from '../types';\n\nconst DEFAULT_HOST = 'http://localhost:11434';\nconst DETECTION_TIMEOUT_MS = 3000;\n\nexport interface UseOllamaDetectionReturn {\n available: boolean;\n models: OllamaLocalModel[];\n host: string;\n error: string | null;\n isDetecting: boolean;\n detect: (host?: string) => Promise<OllamaStatus>;\n}\n\nexport function useOllamaDetection(initialHost = DEFAULT_HOST): UseOllamaDetectionReturn {\n const [available, setAvailable] = useState(false);\n const [models, setModels] = useState<OllamaLocalModel[]>([]);\n const [host, setHost] = useState(initialHost);\n const [error, setError] = useState<string | null>(null);\n const [isDetecting, setIsDetecting] = useState(false);\n\n const detect = useCallback(async (targetHost?: string): Promise<OllamaStatus> => {\n const h = targetHost || host;\n setIsDetecting(true);\n setError(null);\n\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), DETECTION_TIMEOUT_MS);\n\n const res = await fetch(`${h}/api/tags`, {\n signal: controller.signal,\n });\n clearTimeout(timeout);\n\n if (!res.ok) {\n throw new Error(`Ollama returned ${res.status}`);\n }\n\n const data = await res.json();\n const ollamaModels: OllamaLocalModel[] = (data.models || []).map((m: any) => ({\n name: m.name,\n size: m.size || 0,\n modified_at: m.modified_at || '',\n digest: m.digest,\n }));\n\n setAvailable(true);\n setModels(ollamaModels);\n if (targetHost) setHost(targetHost);\n\n return { available: true, host: h, models: ollamaModels };\n } catch (err: any) {\n const msg = err.name === 'AbortError'\n ? 'Connection timed out'\n : err.message?.includes('Failed to fetch') || err.message?.includes('NetworkError')\n ? 'Ollama not reachable. Ensure it is running and OLLAMA_ORIGINS=* is set.'\n : err.message;\n\n setAvailable(false);\n setModels([]);\n setError(msg);\n return { available: false, host: h, models: [], error: msg };\n } finally {\n setIsDetecting(false);\n }\n }, [host]);\n\n // Auto-detect on mount\n useEffect(() => {\n detect();\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return { available, models, host, error, isDetecting, detect };\n}\n","/**\n * useDataOverview — Unified summary of all user-owned data.\n *\n * Fetches workspace artifact counts, site metadata, and MongoDB collection stats.\n * Used by the Casino \"My Data\" view for the top-level summary cards.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport { getUserDataOverview } from '../api/client';\nimport type { UserDataOverview } from '../types';\n\nexport interface UseDataOverviewReturn {\n overview: UserDataOverview | null;\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useDataOverview(): UseDataOverviewReturn {\n const { credentials, config } = useFlowstack();\n const [overview, setOverview] = useState<UserDataOverview | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const clientConfig = { baseUrl: config.baseUrl, tenantId: config.tenantId };\n\n const refresh = useCallback(async () => {\n // Don't leave the skeleton stuck on \"LOADING…\" if credentials aren't ready\n // yet — clear the loading flag and let the effect re-run once they hydrate\n // (deps include credentials). This is the first-mount stuck-load race.\n if (!credentials) { setIsLoading(false); return; }\n setIsLoading(true);\n setError(null);\n try {\n const res = await getUserDataOverview(credentials, clientConfig);\n if (res.ok && res.data) {\n setOverview(res.data);\n } else {\n setError(res.error || 'Failed to load data overview');\n }\n } catch (err: any) {\n setError(err.message);\n } finally {\n setIsLoading(false);\n }\n }, [credentials, clientConfig.baseUrl]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n return { overview, isLoading, error, refresh };\n}\n","/**\n * useUserCollections — List all MongoDB collections the user owns.\n *\n * Returns collections across all sites, grouped by site ID.\n * Supports optional site_id filtering and schema inclusion.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport { getUserCollections, deleteUserCollection } from '../api/client';\nimport type { UserCollectionInfo } from '../types';\n\nexport interface UseUserCollectionsOptions {\n siteId?: string;\n includeSchema?: boolean;\n}\n\nexport interface UseUserCollectionsReturn {\n collections: UserCollectionInfo[];\n groupedBySite: Record<string, UserCollectionInfo[]>;\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n deleteCollection: (fullName: string) => Promise<boolean>;\n}\n\nexport function useUserCollections(options?: UseUserCollectionsOptions): UseUserCollectionsReturn {\n const { credentials, config } = useFlowstack();\n const [collections, setCollections] = useState<UserCollectionInfo[]>([]);\n const [groupedBySite, setGroupedBySite] = useState<Record<string, UserCollectionInfo[]>>({});\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const clientConfig = { baseUrl: config.baseUrl, tenantId: config.tenantId };\n\n const refresh = useCallback(async () => {\n if (!credentials) return;\n setIsLoading(true);\n setError(null);\n try {\n const res = await getUserCollections(\n credentials,\n { siteId: options?.siteId, includeSchema: options?.includeSchema },\n clientConfig,\n );\n if (res.ok && res.data) {\n setCollections(res.data.collections || []);\n setGroupedBySite(res.data.grouped_by_site || {});\n } else {\n setError(res.error || 'Failed to load collections');\n }\n } catch (err: any) {\n setError(err.message);\n } finally {\n setIsLoading(false);\n }\n }, [credentials, options?.siteId, options?.includeSchema, clientConfig.baseUrl]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n const handleDelete = useCallback(async (fullName: string): Promise<boolean> => {\n if (!credentials) return false;\n try {\n const res = await deleteUserCollection(credentials, fullName, clientConfig);\n if (res.ok) {\n await refresh();\n return true;\n }\n return false;\n } catch {\n return false;\n }\n }, [credentials, clientConfig.baseUrl, refresh]);\n\n return {\n collections,\n groupedBySite,\n isLoading,\n error,\n refresh,\n deleteCollection: handleDelete,\n };\n}\n","/**\n * useCollectionExplorer — Browse, query, export, and delete a specific MongoDB collection.\n *\n * Provides paginated document browsing, schema inference, CSV/JSON export,\n * and collection deletion for the Casino data explorer.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport {\n getUserCollectionDocuments,\n getUserCollectionSchema,\n deleteUserCollection,\n exportUserCollection,\n} from '../api/client';\nimport type { CollectionSchemaInfo } from '../types';\n\nexport interface UseCollectionExplorerOptions {\n filter?: Record<string, any>;\n limit?: number;\n skip?: number;\n sort?: Record<string, 1 | -1>;\n database?: string;\n}\n\nexport interface UseCollectionExplorerReturn<T> {\n documents: T[];\n total: number;\n schema: CollectionSchemaInfo | null;\n isLoading: boolean;\n error: string | null;\n page: number;\n pageSize: number;\n setPage: (page: number) => void;\n refresh: () => Promise<void>;\n exportAs: (format: 'json' | 'csv') => Promise<void>;\n deleteCollection: () => Promise<boolean>;\n}\n\nexport function useCollectionExplorer<T = Record<string, any>>(\n collection: string,\n options?: UseCollectionExplorerOptions,\n): UseCollectionExplorerReturn<T> {\n const { credentials, config } = useFlowstack();\n const [documents, setDocuments] = useState<T[]>([]);\n const [total, setTotal] = useState(0);\n const [schema, setSchema] = useState<CollectionSchemaInfo | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [page, setPage] = useState(0);\n const pageSize = options?.limit || 50;\n\n const clientConfig = { baseUrl: config.baseUrl, tenantId: config.tenantId };\n\n const fetchDocuments = useCallback(async () => {\n if (!credentials || !collection) return;\n setIsLoading(true);\n setError(null);\n try {\n const res = await getUserCollectionDocuments<T>(\n credentials,\n collection,\n {\n filter: options?.filter,\n limit: pageSize,\n skip: page * pageSize,\n sort: options?.sort,\n database: options?.database,\n },\n clientConfig,\n );\n if (res.ok && res.data) {\n setDocuments(res.data.documents || []);\n setTotal(res.data.total || 0);\n } else {\n setError(res.error || 'Failed to load documents');\n }\n } catch (err: any) {\n setError(err.message);\n } finally {\n setIsLoading(false);\n }\n }, [credentials, collection, page, pageSize, options?.filter, options?.sort, options?.database, clientConfig.baseUrl]);\n\n const fetchSchema = useCallback(async () => {\n if (!credentials || !collection) return;\n try {\n const res = await getUserCollectionSchema(\n credentials, collection,\n { database: options?.database },\n clientConfig,\n );\n if (res.ok && res.data) {\n setSchema(res.data);\n }\n } catch {\n // Schema is non-critical\n }\n }, [credentials, collection, options?.database, clientConfig.baseUrl]);\n\n useEffect(() => {\n fetchDocuments();\n }, [fetchDocuments]);\n\n useEffect(() => {\n fetchSchema();\n }, [fetchSchema]);\n\n const refresh = useCallback(async () => {\n await Promise.all([fetchDocuments(), fetchSchema()]);\n }, [fetchDocuments, fetchSchema]);\n\n const exportAs = useCallback(async (format: 'json' | 'csv') => {\n if (!credentials) return;\n try {\n const res = await exportUserCollection(\n credentials, collection,\n { format, filter: options?.filter, database: options?.database },\n clientConfig,\n );\n if (res.ok && res.data) {\n // Trigger browser download\n const blob = res.data instanceof Blob ? res.data : new Blob([JSON.stringify(res.data)]);\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${collection}.${format}`;\n a.click();\n URL.revokeObjectURL(url);\n }\n } catch (err: any) {\n setError(`Export failed: ${err.message}`);\n }\n }, [credentials, collection, options?.filter, options?.database, clientConfig.baseUrl]);\n\n const handleDelete = useCallback(async (): Promise<boolean> => {\n if (!credentials) return false;\n try {\n const res = await deleteUserCollection(credentials, collection, clientConfig);\n return res.ok === true;\n } catch {\n return false;\n }\n }, [credentials, collection, clientConfig.baseUrl]);\n\n return {\n documents,\n total,\n schema,\n isLoading,\n error,\n page,\n pageSize,\n setPage,\n refresh,\n exportAs,\n deleteCollection: handleDelete,\n };\n}\n","/**\n * usePublicCollection — anonymous public submissions for built apps.\n *\n * Provides read and insert access to a public collection that requires\n * NO user authentication. Any visitor can read and write documents.\n * The collection must be declared in the app's publicCollections config.\n *\n * Designed for: leaderboards, guestbooks, comment threads, voting, polls.\n *\n * Usage:\n * const { documents, isLoading, insert } = usePublicCollection<HighScore>('high_scores', {\n * sort: { score: -1 },\n * limit: 25,\n * filter: { album: 'yeezus' },\n * });\n *\n * await insert({ album: 'yeezus', name: 'KEON', score: 12500 });\n *\n * No credentials required — the hook reads appScope from FlowstackProvider config.\n * Rate limiting and spam protection are enforced server-side.\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport { useFlowstackOptional } from '../context/FlowstackProvider';\n\nconst MISSING_TENANT =\n 'usePublicCollection requires a tenantId. Set `tenantId` on FlowstackProvider — ' +\n 'anonymous public collections have no token for the backend to derive it from.';\n\nexport interface UsePublicCollectionOptions {\n /** MongoDB query filter (e.g. { album: 'yeezus' }) */\n filter?: Record<string, any>;\n /** Max documents to return (default 25, max 200) */\n limit?: number;\n /** Skip N documents for pagination */\n skip?: number;\n /** Sort spec (e.g. { score: -1 } for highest first) */\n sort?: Record<string, 1 | -1>;\n /** Auto-refresh interval in ms (optional) */\n refreshInterval?: number;\n /** Skip initial fetch (useful for conditional rendering) */\n enabled?: boolean;\n}\n\nexport interface UsePublicCollectionReturn<T> {\n /** Array of documents (submitter_ip_hash stripped server-side) */\n documents: T[];\n /** Count of documents returned (≤ limit) */\n count: number;\n /** Total documents in collection matching the filter */\n total: number;\n /** Loading state */\n isLoading: boolean;\n /** Error message if query failed */\n error: string | null;\n /** Insert a single document — no auth required */\n insert: (doc: Partial<T>) => Promise<{ inserted_id: string }>;\n /** Manual refresh */\n refresh: () => Promise<void>;\n}\n\nexport function usePublicCollection<T = Record<string, any>>(\n collection: string,\n options?: UsePublicCollectionOptions,\n): UsePublicCollectionReturn<T> {\n const flowstack = useFlowstackOptional();\n\n const [documents, setDocuments] = useState<T[]>([]);\n const [count, setCount] = useState(0);\n const [total, setTotal] = useState(0);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const mountedRef = useRef(true);\n useEffect(() => {\n mountedRef.current = true;\n return () => { mountedRef.current = false; };\n }, []);\n\n const baseUrl = flowstack?.config?.baseUrl ?? 'https://sage-api.flowstack.fun';\n const appScope = flowstack?.config?.appScope ?? '';\n // Tenant is required for anonymous access (no token for the backend to derive it\n // from). Prefer a logged-in user's JWT tenant, then an explicitly configured\n // tenantId. There is no platform default — an unset tenant is a hard error below.\n const tenantId = flowstack?.credentials?.tenantId || flowstack?.config?.tenantId || '';\n const enabled = options?.enabled !== false;\n\n const fetchData = useCallback(async () => {\n if (!appScope || !enabled) return;\n if (!tenantId) {\n setError(MISSING_TENANT);\n return;\n }\n\n setIsLoading(true);\n setError(null);\n\n try {\n const params = new URLSearchParams();\n if (options?.limit !== undefined) params.set('limit', String(options.limit));\n if (options?.skip !== undefined) params.set('skip', String(options.skip));\n if (options?.sort) {\n const [field, dir] = Object.entries(options.sort)[0] ?? [];\n if (field) {\n params.set('sort_field', field);\n params.set('sort_dir', String(dir ?? -1));\n }\n }\n if (options?.filter) {\n params.set('filter_json', JSON.stringify(options.filter));\n }\n\n const url = `${baseUrl}/public/collections/${encodeURIComponent(collection)}/documents?${params.toString()}`;\n const resp = await fetch(url, {\n headers: {\n 'X-App-Scope': appScope,\n 'X-Tenant-ID': tenantId,\n },\n });\n\n if (!mountedRef.current) return;\n\n if (!resp.ok) {\n const body = await resp.json().catch(() => ({}));\n setError(body.detail || `Query failed: ${resp.status}`);\n return;\n }\n\n const data = await resp.json();\n if (mountedRef.current) {\n setDocuments(data.documents ?? []);\n setCount(data.count ?? 0);\n setTotal(data.total ?? 0);\n }\n } catch (err: any) {\n if (mountedRef.current) {\n setError(err.message || 'Network error');\n }\n } finally {\n if (mountedRef.current) {\n setIsLoading(false);\n }\n }\n }, [\n baseUrl,\n appScope,\n tenantId,\n collection,\n enabled,\n JSON.stringify(options?.filter),\n options?.limit,\n options?.skip,\n JSON.stringify(options?.sort),\n ]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n useEffect(() => {\n if (!options?.refreshInterval || !enabled) return;\n const interval = setInterval(fetchData, options.refreshInterval);\n return () => clearInterval(interval);\n }, [fetchData, options?.refreshInterval, enabled]);\n\n const insert = useCallback(async (doc: Partial<T>): Promise<{ inserted_id: string }> => {\n if (!appScope) throw new Error('No appScope — FlowstackProvider must be mounted with a valid appScope');\n if (!tenantId) throw new Error(MISSING_TENANT);\n\n const url = `${baseUrl}/public/collections/${encodeURIComponent(collection)}/insert`;\n const resp = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-App-Scope': appScope,\n 'X-Tenant-ID': tenantId,\n },\n body: JSON.stringify({ document: doc }),\n });\n\n if (!resp.ok) {\n const body = await resp.json().catch(() => ({}));\n throw new Error(body.detail || `Insert failed: ${resp.status}`);\n }\n\n const data = await resp.json();\n // Refresh the list after a successful insert\n fetchData();\n return { inserted_id: data.inserted_id };\n }, [baseUrl, appScope, tenantId, collection, fetchData]);\n\n return { documents, count, total, isLoading, error, insert, refresh: fetchData };\n}\n","/**\n * useConversations — fetches the user's past Casino builder conversations\n * from GET /library/conversations. Powers the Sessions sidebar in ChatView.\n */\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\n\nexport interface ConversationSummary {\n id: string;\n title: string;\n preview?: string;\n last_message_at?: string | number;\n message_count?: number;\n starred?: boolean;\n}\n\nexport interface UseConversationsOptions {\n limit?: number;\n includeDeleted?: boolean;\n refreshIntervalMs?: number;\n}\n\nexport interface UseConversationsReturn {\n conversations: ConversationSummary[];\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n deleteConversation: (sessionId: string) => Promise<boolean>;\n renameConversation: (sessionId: string, title: string) => Promise<boolean>;\n}\n\nexport function useConversations(options?: UseConversationsOptions): UseConversationsReturn {\n const { credentials, config } = useFlowstack();\n\n const [conversations, setConversations] = useState<ConversationSummary[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const baseUrl = config?.baseUrl || 'https://sage-api.flowstack.fun';\n const apiKey = credentials?.apiKey;\n const limit = options?.limit ?? 50;\n\n const refresh = useCallback(async (): Promise<void> => {\n if (!apiKey) return;\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetch(`${baseUrl}/library/conversations?limit=${limit}`, {\n headers: { Authorization: `Bearer ${apiKey}` },\n });\n if (!res.ok) throw new Error(`${res.status}`);\n const data = await res.json();\n const items: ConversationSummary[] = (data.items || data.conversations || []).map((c: any) => {\n // Title: prefer explicit title, fall back to first_message_preview\n // (trimmed, capped at 60 chars), then last_snippet, then 'Untitled'.\n const rawTitle = c.title?.trim();\n const rawPreview = (c.first_message_preview || c.last_snippet || '').trim();\n const title = rawTitle || (rawPreview ? rawPreview.slice(0, 60) : 'Untitled');\n return {\n id: c.conversation_id || c.id || c.session_id || '',\n title,\n // show the preview text if it differs from the title\n preview: rawPreview && rawPreview !== title ? rawPreview.slice(0, 80) : '',\n last_message_at: c.last_activity_at || c.last_message_at || c.created_at,\n message_count: c.message_count,\n starred: c.starred,\n };\n });\n setConversations(items);\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setIsLoading(false);\n }\n }, [apiKey, baseUrl, limit]);\n\n useEffect(() => {\n if (!credentials) return;\n refresh();\n const onFocus = () => refresh();\n window.addEventListener('focus', onFocus);\n return () => window.removeEventListener('focus', onFocus);\n }, [credentials, refresh]);\n\n useEffect(() => {\n const interval = options?.refreshIntervalMs ?? 0;\n if (!interval || interval < 1000 || !credentials) return;\n const handle = setInterval(refresh, interval);\n return () => clearInterval(handle);\n }, [credentials, refresh, options?.refreshIntervalMs]);\n\n const deleteConversation = useCallback(async (sessionId: string): Promise<boolean> => {\n if (!apiKey) return false;\n try {\n const res = await fetch(`${baseUrl}/library/conversations/${sessionId}`, {\n method: 'DELETE',\n headers: { Authorization: `Bearer ${apiKey}` },\n });\n if (res.ok) {\n setConversations(prev => prev.filter(c => c.id !== sessionId));\n return true;\n }\n return false;\n } catch { return false; }\n }, [apiKey, baseUrl]);\n\n const renameConversation = useCallback(async (sessionId: string, title: string): Promise<boolean> => {\n if (!apiKey) return false;\n try {\n const res = await fetch(`${baseUrl}/library/conversations/${sessionId}`, {\n method: 'PATCH',\n headers: { Authorization: `Bearer ${apiKey}`, 'Content-Type': 'application/json' },\n body: JSON.stringify({ title }),\n });\n if (res.ok) {\n setConversations(prev => prev.map(c => c.id === sessionId ? { ...c, title } : c));\n return true;\n }\n return false;\n } catch { return false; }\n }, [apiKey, baseUrl]);\n\n return { conversations, isLoading, error, refresh, deleteConversation, renameConversation };\n}\n","'use client';\n\n/**\n * useIntegrations — CRUD for HTTP API integrations (P0-79).\n *\n * Lets built apps register any HTTPS REST API as a named integration that\n * the agent can call as a tool. Credentials are encrypted at rest by the\n * backend; the frontend never receives raw secrets after creation.\n *\n * Usage:\n * const { integrations, create, update, remove, isLoading } = useIntegrations();\n *\n * // Register a new API\n * await create({\n * name: 'Shopify',\n * description: 'Shopify Admin API for order management',\n * base_url: 'https://my-store.myshopify.com/admin/api/2024-01',\n * auth_type: 'bearer',\n * auth_config: { token: 'shpat_xxx' },\n * endpoints: [\n * { name: 'list_orders', method: 'GET', path: '/orders.json' },\n * { name: 'get_order', method: 'GET', path: '/orders/{id}.json' },\n * ],\n * });\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type IntegrationAuthType =\n | 'bearer'\n | 'api_key_header'\n | 'api_key_query'\n | 'basic'\n | 'none';\n\nexport interface IntegrationEndpoint {\n name: string;\n method: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n path: string;\n description?: string;\n parameters?: Record<string, unknown>;\n}\n\nexport interface Integration {\n integration_id: string;\n name: string;\n description: string;\n base_url: string;\n auth_type: IntegrationAuthType;\n /** Redacted preview — raw secrets are never returned after creation */\n auth_preview?: Record<string, unknown>;\n endpoint_count: number;\n endpoints?: IntegrationEndpoint[];\n workspace_id?: string;\n created_at: number;\n updated_at?: number;\n}\n\nexport interface CreateIntegrationInput {\n name: string;\n /** 20–300 chars */\n description: string;\n /** HTTPS base URL, e.g. \"https://api.stripe.com/v1\" */\n base_url: string;\n auth_type?: IntegrationAuthType;\n /** Credentials — encrypted at rest, never returned after save */\n auth_config?: Record<string, unknown>;\n endpoints?: IntegrationEndpoint[];\n workspace_id?: string;\n}\n\nexport interface UpdateIntegrationInput {\n name?: string;\n description?: string;\n base_url?: string;\n auth_config?: Record<string, unknown>;\n endpoints?: IntegrationEndpoint[];\n}\n\nexport interface UseIntegrationsReturn {\n integrations: Integration[];\n isLoading: boolean;\n error: string | null;\n /** Create and register a new HTTP API integration */\n create: (input: CreateIntegrationInput) => Promise<Integration | null>;\n /** Update an existing integration */\n update: (id: string, input: UpdateIntegrationInput) => Promise<boolean>;\n /** Delete an integration */\n remove: (id: string) => Promise<boolean>;\n /** Get a single integration with full endpoint details */\n get: (id: string) => Promise<Integration | null>;\n /** Refresh the list */\n refresh: () => Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useIntegrations(): UseIntegrationsReturn {\n const { credentials, config } = useFlowstack();\n const [integrations, setIntegrations] = useState<Integration[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const base = (config as any)?.baseUrl || 'https://sage-api.flowstack.fun';\n const creds = credentials as any;\n\n const headers = (): Record<string, string> => ({\n Authorization: `Bearer ${creds?.apiKey || ''}`,\n 'X-Tenant-ID': creds?.tenantId || (config as any)?.tenantId || '',\n 'Content-Type': 'application/json',\n });\n\n const refresh = useCallback(async () => {\n if (!creds?.apiKey) return;\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetch(`${base}/integrations`, { headers: headers() });\n if (!res.ok) { setError(`Failed to load integrations (${res.status})`); return; }\n const data = await res.json();\n setIntegrations(data.integrations ?? []);\n } catch (e: any) {\n setError(e.message || 'Failed to load integrations');\n } finally {\n setIsLoading(false);\n }\n }, [creds?.apiKey, creds?.tenantId, base]);\n\n useEffect(() => { refresh(); }, [refresh]);\n\n const create = useCallback(async (input: CreateIntegrationInput): Promise<Integration | null> => {\n if (!creds?.apiKey) return null;\n try {\n const res = await fetch(`${base}/integrations`, {\n method: 'POST',\n headers: headers(),\n body: JSON.stringify(input),\n });\n if (!res.ok) return null;\n const data = await res.json();\n await refresh();\n return data as Integration;\n } catch { return null; }\n }, [creds?.apiKey, base, refresh]);\n\n const update = useCallback(async (id: string, input: UpdateIntegrationInput): Promise<boolean> => {\n if (!creds?.apiKey) return false;\n try {\n const res = await fetch(`${base}/integrations/${encodeURIComponent(id)}`, {\n method: 'PUT',\n headers: headers(),\n body: JSON.stringify(input),\n });\n if (res.ok) await refresh();\n return res.ok;\n } catch { return false; }\n }, [creds?.apiKey, base, refresh]);\n\n const remove = useCallback(async (id: string): Promise<boolean> => {\n if (!creds?.apiKey) return false;\n try {\n const res = await fetch(`${base}/integrations/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n headers: headers(),\n });\n if (res.ok) await refresh();\n return res.ok;\n } catch { return false; }\n }, [creds?.apiKey, base, refresh]);\n\n const get = useCallback(async (id: string): Promise<Integration | null> => {\n if (!creds?.apiKey) return null;\n try {\n const res = await fetch(`${base}/integrations/${encodeURIComponent(id)}`, { headers: headers() });\n if (!res.ok) return null;\n return await res.json() as Integration;\n } catch { return null; }\n }, [creds?.apiKey, base]);\n\n return { integrations, isLoading, error, create, update, remove, get, refresh };\n}\n","'use client';\n\n/**\n * useAutomations — CRUD for agent cron automations (P0-85).\n *\n * Lets built apps create scheduled jobs that run an agent prompt on a\n * cron schedule via AWS EventBridge. Each automation can target specific\n * agent personas, configure output delivery (email, webhook, file, silent),\n * and be paused/resumed without deletion.\n *\n * Schedule format: 5-field Unix cron \"minute hour dom month dow\"\n * \"0 9 * * 1-5\" → weekdays at 9 AM\n * \"0 * * * *\" → every hour\n * \"30 8 1 * *\" → 1st of every month at 8:30 AM\n *\n * Usage:\n * const { automations, create, pause, resume, runNow } = useAutomations();\n *\n * await create({\n * name: 'Daily sales digest',\n * prompt: 'Pull yesterday\\'s sales from Shopify, summarize by region, email me.',\n * schedule: '0 8 * * 1-5',\n * target_agents: ['shopify_analyst'],\n * output_config: { type: 'email', to: 'me@company.com' },\n * });\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type AutomationOutputType = 'silent' | 'email' | 'webhook' | 'file';\nexport type AutomationStatus = 'active' | 'paused' | 'error';\nexport type AutomationRunStatus = 'success' | 'failure' | 'running' | 'timeout';\n\nexport interface AutomationOutputConfig {\n /** Where to send results (default: \"silent\" — stored only) */\n type: AutomationOutputType;\n /** Email address — required when type=\"email\" */\n to?: string;\n /** Webhook URL — required when type=\"webhook\" */\n url?: string;\n /** Custom headers for webhook delivery */\n headers?: Record<string, string>;\n /** Output format for file/email: \"csv\" | \"json\" | \"pdf\" */\n format?: string;\n /** Subject line template for emails */\n subject_template?: string;\n}\n\nexport interface Automation {\n automation_id: string;\n name: string;\n description: string;\n prompt: string;\n /** 5-field Unix cron expression */\n schedule: string;\n timezone: string;\n /** Agent persona names to route this job to */\n target_agents: string[];\n status: AutomationStatus;\n output_config: AutomationOutputConfig;\n max_runtime_seconds: number;\n retry_on_failure: boolean;\n max_retries: number;\n created_at: number;\n updated_at: number;\n last_run_at: number;\n last_run_status: string;\n run_count: number;\n failure_count: number;\n}\n\nexport interface AutomationRun {\n automation_id: string;\n run_id: string;\n status: AutomationRunStatus;\n started_at: number;\n completed_at?: number;\n duration_ms: number;\n credits_used: number;\n output_summary: string;\n output_url?: string;\n error_msg?: string;\n}\n\nexport interface CreateAutomationInput {\n name: string;\n /** What the agent should do each run */\n prompt: string;\n /** 5-field Unix cron, e.g. \"0 9 * * 1-5\" */\n schedule: string;\n timezone?: string;\n target_agents?: string[];\n output_config?: Partial<AutomationOutputConfig>;\n max_runtime_seconds?: number;\n retry_on_failure?: boolean;\n max_retries?: number;\n description?: string;\n}\n\nexport interface UpdateAutomationInput {\n name?: string;\n prompt?: string;\n schedule?: string;\n timezone?: string;\n target_agents?: string[];\n output_config?: Partial<AutomationOutputConfig>;\n max_runtime_seconds?: number;\n retry_on_failure?: boolean;\n max_retries?: number;\n description?: string;\n}\n\nexport interface UseAutomationsReturn {\n automations: Automation[];\n isLoading: boolean;\n error: string | null;\n /** Create a new scheduled automation */\n create: (input: CreateAutomationInput) => Promise<Automation | null>;\n /** Update an existing automation */\n update: (id: string, input: UpdateAutomationInput) => Promise<boolean>;\n /** Delete an automation and its EventBridge rule */\n remove: (id: string) => Promise<boolean>;\n /** Pause scheduling without deleting */\n pause: (id: string) => Promise<boolean>;\n /** Resume a paused automation */\n resume: (id: string) => Promise<boolean>;\n /** Trigger an immediate run (ignores schedule) */\n runNow: (id: string) => Promise<{ invoked: boolean; status_code?: number } | null>;\n /** Get run history for an automation */\n getRuns: (id: string, limit?: number) => Promise<AutomationRun[]>;\n /** Refresh the list */\n refresh: () => Promise<void>;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useAutomations(): UseAutomationsReturn {\n const { credentials, config } = useFlowstack();\n const [automations, setAutomations] = useState<Automation[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const base = (config as any)?.baseUrl || 'https://sage-api.flowstack.fun';\n const creds = credentials as any;\n\n const headers = (): Record<string, string> => ({\n Authorization: `Bearer ${creds?.apiKey || ''}`,\n 'X-Tenant-ID': creds?.tenantId || (config as any)?.tenantId || '',\n 'Content-Type': 'application/json',\n });\n\n const refresh = useCallback(async () => {\n if (!creds?.apiKey) return;\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetch(`${base}/automations`, { headers: headers() });\n if (!res.ok) { setError(`Failed to load automations (${res.status})`); return; }\n const data = await res.json();\n // Backend returns a bare array (response_model=List[AutomationOut]).\n // Tolerate a future `{automations:[...]}` envelope too.\n setAutomations(Array.isArray(data) ? data : (data.automations ?? []));\n } catch (e: any) {\n setError(e.message || 'Failed to load automations');\n } finally {\n setIsLoading(false);\n }\n }, [creds?.apiKey, creds?.tenantId, base]);\n\n useEffect(() => { refresh(); }, [refresh]);\n\n const create = useCallback(async (input: CreateAutomationInput): Promise<Automation | null> => {\n if (!creds?.apiKey) return null;\n try {\n const res = await fetch(`${base}/automations`, {\n method: 'POST',\n headers: headers(),\n body: JSON.stringify(input),\n });\n if (!res.ok) return null;\n const data = await res.json();\n await refresh();\n return data as Automation;\n } catch { return null; }\n }, [creds?.apiKey, base, refresh]);\n\n const update = useCallback(async (id: string, input: UpdateAutomationInput): Promise<boolean> => {\n if (!creds?.apiKey) return false;\n try {\n const res = await fetch(`${base}/automations/${encodeURIComponent(id)}`, {\n method: 'PUT',\n headers: headers(),\n body: JSON.stringify(input),\n });\n if (res.ok) await refresh();\n return res.ok;\n } catch { return false; }\n }, [creds?.apiKey, base, refresh]);\n\n const remove = useCallback(async (id: string): Promise<boolean> => {\n if (!creds?.apiKey) return false;\n try {\n const res = await fetch(`${base}/automations/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n headers: headers(),\n });\n if (res.ok) await refresh();\n return res.ok;\n } catch { return false; }\n }, [creds?.apiKey, base, refresh]);\n\n const pause = useCallback(async (id: string): Promise<boolean> => {\n if (!creds?.apiKey) return false;\n try {\n const res = await fetch(`${base}/automations/${encodeURIComponent(id)}/pause`, {\n method: 'POST',\n headers: headers(),\n });\n if (res.ok) await refresh();\n return res.ok;\n } catch { return false; }\n }, [creds?.apiKey, base, refresh]);\n\n const resume = useCallback(async (id: string): Promise<boolean> => {\n if (!creds?.apiKey) return false;\n try {\n const res = await fetch(`${base}/automations/${encodeURIComponent(id)}/resume`, {\n method: 'POST',\n headers: headers(),\n });\n if (res.ok) await refresh();\n return res.ok;\n } catch { return false; }\n }, [creds?.apiKey, base, refresh]);\n\n const runNow = useCallback(async (id: string) => {\n if (!creds?.apiKey) return null;\n try {\n const res = await fetch(`${base}/automations/${encodeURIComponent(id)}/run`, {\n method: 'POST',\n headers: headers(),\n });\n if (!res.ok) return null;\n return await res.json();\n } catch { return null; }\n }, [creds?.apiKey, base]);\n\n const getRuns = useCallback(async (id: string, limit = 20): Promise<AutomationRun[]> => {\n if (!creds?.apiKey) return [];\n try {\n const url = `${base}/automations/${encodeURIComponent(id)}/runs?limit=${limit}`;\n const res = await fetch(url, { headers: headers() });\n if (!res.ok) return [];\n const data = await res.json();\n // Backend returns a bare array (response_model=List[AutomationRunOut]).\n return Array.isArray(data) ? data : (data.runs ?? []);\n } catch { return []; }\n }, [creds?.apiKey, base]);\n\n return { automations, isLoading, error, create, update, remove, pause, resume, runNow, getRuns, refresh };\n}\n","'use client';\n\n/**\n * LoginForm Component\n *\n * Pre-built login form with email/password support.\n *\n * @example\n * ```tsx\n * function LoginPage() {\n * return (\n * <LoginForm\n * onSuccess={() => router.push('/dashboard')}\n * showRegisterLink\n * registerHref=\"/register\"\n * />\n * );\n * }\n * ```\n */\n\nimport React, { useState, FormEvent } from 'react';\nimport { useAuth } from '../../hooks/useAuth';\n\nexport interface LoginFormProps {\n /** Callback on successful login */\n onSuccess?: () => void;\n /** Callback on login error */\n onError?: (error: string) => void;\n /** Show \"Register\" link */\n showRegisterLink?: boolean;\n /** Register page href */\n registerHref?: string;\n /** Custom className for form container */\n className?: string;\n /** Custom className for inputs */\n inputClassName?: string;\n /** Custom className for button */\n buttonClassName?: string;\n /** Custom labels */\n labels?: {\n title?: string;\n email?: string;\n password?: string;\n submit?: string;\n register?: string;\n loading?: string;\n };\n}\n\n/**\n * Login form component\n */\nexport function LoginForm({\n onSuccess,\n onError,\n showRegisterLink = false,\n registerHref = '/register',\n className = '',\n inputClassName = '',\n buttonClassName = '',\n labels = {},\n}: LoginFormProps) {\n const { login, isLoading, error: authError } = useAuth();\n\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n setError(null);\n\n if (!email || !password) {\n setError('Please fill in all fields');\n return;\n }\n\n try {\n const success = await login(email, password);\n if (success) {\n onSuccess?.();\n } else {\n const errorMsg = authError || 'Login failed';\n setError(errorMsg);\n onError?.(errorMsg);\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'Login failed';\n setError(errorMsg);\n onError?.(errorMsg);\n }\n };\n\n const displayError = error || authError;\n\n return (\n <form onSubmit={handleSubmit} className={`flowstack-login-form ${className}`}>\n <h2 className=\"flowstack-login-title\">\n {labels.title || 'Sign In'}\n </h2>\n\n {displayError && (\n <div className=\"flowstack-login-error\" role=\"alert\">\n {displayError}\n </div>\n )}\n\n <div className=\"flowstack-login-field\">\n <label htmlFor=\"flowstack-email\">\n {labels.email || 'Email'}\n </label>\n <input\n id=\"flowstack-email\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n disabled={isLoading}\n required\n autoComplete=\"email\"\n className={inputClassName}\n />\n </div>\n\n <div className=\"flowstack-login-field\">\n <label htmlFor=\"flowstack-password\">\n {labels.password || 'Password'}\n </label>\n <input\n id=\"flowstack-password\"\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"Enter password\"\n disabled={isLoading}\n required\n autoComplete=\"current-password\"\n className={inputClassName}\n />\n </div>\n\n <button\n type=\"submit\"\n disabled={isLoading}\n className={`flowstack-login-button ${buttonClassName}`}\n >\n {isLoading ? (labels.loading || 'Signing in...') : (labels.submit || 'Sign In')}\n </button>\n\n {showRegisterLink && (\n <p className=\"flowstack-login-register\">\n Don't have an account?{' '}\n <a href={registerHref}>\n {labels.register || 'Register'}\n </a>\n </p>\n )}\n\n <style>{`\n .flowstack-login-form {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n max-width: 400px;\n margin: 0 auto;\n padding: 2rem;\n }\n .flowstack-login-title {\n font-size: 1.5rem;\n font-weight: 600;\n text-align: center;\n margin: 0 0 1rem 0;\n }\n .flowstack-login-error {\n background: #fee2e2;\n border: 1px solid #fecaca;\n color: #dc2626;\n padding: 0.75rem;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n }\n .flowstack-login-field {\n display: flex;\n flex-direction: column;\n gap: 0.375rem;\n }\n .flowstack-login-field label {\n font-size: 0.875rem;\n font-weight: 500;\n }\n .flowstack-login-field input {\n padding: 0.625rem 0.75rem;\n border: 1px solid #d1d5db;\n border-radius: 0.375rem;\n font-size: 1rem;\n }\n .flowstack-login-field input:focus {\n outline: none;\n border-color: #3b82f6;\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);\n }\n .flowstack-login-button {\n padding: 0.75rem 1rem;\n background: #3b82f6;\n color: white;\n border: none;\n border-radius: 0.375rem;\n font-size: 1rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s;\n }\n .flowstack-login-button:hover:not(:disabled) {\n background: #2563eb;\n }\n .flowstack-login-button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n .flowstack-login-register {\n text-align: center;\n font-size: 0.875rem;\n color: #6b7280;\n margin: 0;\n }\n .flowstack-login-register a {\n color: #3b82f6;\n text-decoration: none;\n }\n .flowstack-login-register a:hover {\n text-decoration: underline;\n }\n `}</style>\n </form>\n );\n}\n","'use client';\n\n/**\n * RegisterForm Component\n *\n * Pre-built registration form with email/password support.\n *\n * @example\n * ```tsx\n * function RegisterPage() {\n * return (\n * <RegisterForm\n * onSuccess={() => router.push('/dashboard')}\n * showLoginLink\n * loginHref=\"/login\"\n * />\n * );\n * }\n * ```\n */\n\nimport React, { useState, FormEvent } from 'react';\nimport { useAuth } from '../../hooks/useAuth';\n\nexport interface RegisterFormProps {\n /** Callback on successful registration */\n onSuccess?: () => void;\n /** Callback on registration error */\n onError?: (error: string) => void;\n /** Show \"Login\" link */\n showLoginLink?: boolean;\n /** Login page href */\n loginHref?: string;\n /** Minimum password length */\n minPasswordLength?: number;\n /** Custom className for form container */\n className?: string;\n /** Custom className for inputs */\n inputClassName?: string;\n /** Custom className for button */\n buttonClassName?: string;\n /** Custom labels */\n labels?: {\n title?: string;\n email?: string;\n password?: string;\n confirmPassword?: string;\n submit?: string;\n login?: string;\n loading?: string;\n };\n}\n\n/**\n * Registration form component\n */\nexport function RegisterForm({\n onSuccess,\n onError,\n showLoginLink = false,\n loginHref = '/login',\n minPasswordLength = 8,\n className = '',\n inputClassName = '',\n buttonClassName = '',\n labels = {},\n}: RegisterFormProps) {\n const { register, isLoading, error: authError } = useAuth();\n\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [confirmPassword, setConfirmPassword] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n setError(null);\n\n if (!email || !password || !confirmPassword) {\n setError('Please fill in all fields');\n return;\n }\n\n if (password.length < minPasswordLength) {\n setError(`Password must be at least ${minPasswordLength} characters`);\n return;\n }\n\n if (password !== confirmPassword) {\n setError('Passwords do not match');\n return;\n }\n\n try {\n const success = await register(email, password);\n if (success) {\n onSuccess?.();\n } else {\n const errorMsg = authError || 'Registration failed';\n setError(errorMsg);\n onError?.(errorMsg);\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'Registration failed';\n setError(errorMsg);\n onError?.(errorMsg);\n }\n };\n\n const displayError = error || authError;\n\n return (\n <form onSubmit={handleSubmit} className={`flowstack-register-form ${className}`}>\n <h2 className=\"flowstack-register-title\">\n {labels.title || 'Create Account'}\n </h2>\n\n {displayError && (\n <div className=\"flowstack-register-error\" role=\"alert\">\n {displayError}\n </div>\n )}\n\n <div className=\"flowstack-register-field\">\n <label htmlFor=\"flowstack-reg-email\">\n {labels.email || 'Email'}\n </label>\n <input\n id=\"flowstack-reg-email\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n disabled={isLoading}\n required\n autoComplete=\"email\"\n className={inputClassName}\n />\n </div>\n\n <div className=\"flowstack-register-field\">\n <label htmlFor=\"flowstack-reg-password\">\n {labels.password || 'Password'}\n </label>\n <input\n id=\"flowstack-reg-password\"\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder={`At least ${minPasswordLength} characters`}\n disabled={isLoading}\n required\n autoComplete=\"new-password\"\n className={inputClassName}\n />\n </div>\n\n <div className=\"flowstack-register-field\">\n <label htmlFor=\"flowstack-reg-confirm\">\n {labels.confirmPassword || 'Confirm Password'}\n </label>\n <input\n id=\"flowstack-reg-confirm\"\n type=\"password\"\n value={confirmPassword}\n onChange={(e) => setConfirmPassword(e.target.value)}\n placeholder=\"Confirm your password\"\n disabled={isLoading}\n required\n autoComplete=\"new-password\"\n className={inputClassName}\n />\n </div>\n\n <button\n type=\"submit\"\n disabled={isLoading}\n className={`flowstack-register-button ${buttonClassName}`}\n >\n {isLoading ? (labels.loading || 'Creating account...') : (labels.submit || 'Create Account')}\n </button>\n\n {showLoginLink && (\n <p className=\"flowstack-register-login\">\n Already have an account?{' '}\n <a href={loginHref}>\n {labels.login || 'Sign In'}\n </a>\n </p>\n )}\n\n <style>{`\n .flowstack-register-form {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n max-width: 400px;\n margin: 0 auto;\n padding: 2rem;\n }\n .flowstack-register-title {\n font-size: 1.5rem;\n font-weight: 600;\n text-align: center;\n margin: 0 0 1rem 0;\n }\n .flowstack-register-error {\n background: #fee2e2;\n border: 1px solid #fecaca;\n color: #dc2626;\n padding: 0.75rem;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n }\n .flowstack-register-field {\n display: flex;\n flex-direction: column;\n gap: 0.375rem;\n }\n .flowstack-register-field label {\n font-size: 0.875rem;\n font-weight: 500;\n }\n .flowstack-register-field input {\n padding: 0.625rem 0.75rem;\n border: 1px solid #d1d5db;\n border-radius: 0.375rem;\n font-size: 1rem;\n }\n .flowstack-register-field input:focus {\n outline: none;\n border-color: #3b82f6;\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);\n }\n .flowstack-register-button {\n padding: 0.75rem 1rem;\n background: #3b82f6;\n color: white;\n border: none;\n border-radius: 0.375rem;\n font-size: 1rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s;\n }\n .flowstack-register-button:hover:not(:disabled) {\n background: #2563eb;\n }\n .flowstack-register-button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n .flowstack-register-login {\n text-align: center;\n font-size: 0.875rem;\n color: #6b7280;\n margin: 0;\n }\n .flowstack-register-login a {\n color: #3b82f6;\n text-decoration: none;\n }\n .flowstack-register-login a:hover {\n text-decoration: underline;\n }\n `}</style>\n </form>\n );\n}\n","'use client';\n\n/**\n * GoogleSignIn Component\n *\n * Google OAuth sign-in button.\n *\n * @example\n * ```tsx\n * function LoginPage() {\n * return (\n * <div>\n * <LoginForm />\n * <GoogleSignIn onSuccess={() => router.push('/dashboard')} />\n * </div>\n * );\n * }\n * ```\n */\n\nimport React from 'react';\nimport { useAuth } from '../../hooks/useAuth';\n\nexport interface GoogleSignInProps {\n /** Callback on successful sign-in */\n onSuccess?: () => void;\n /** Callback on error */\n onError?: (error: string) => void;\n /** Custom className */\n className?: string;\n /** Button text */\n label?: string;\n}\n\n/**\n * Google OAuth sign-in button\n */\nexport function GoogleSignIn({\n onSuccess,\n onError,\n className = '',\n label = 'Continue with Google',\n}: GoogleSignInProps) {\n const { googleSignIn, isLoading, error } = useAuth();\n\n const handleClick = async () => {\n try {\n await googleSignIn();\n // Note: actual success happens after OAuth redirect\n onSuccess?.();\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'Google sign-in failed';\n onError?.(errorMsg);\n }\n };\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={isLoading}\n className={`flowstack-google-button ${className}`}\n >\n <svg\n className=\"flowstack-google-icon\"\n viewBox=\"0 0 24 24\"\n width=\"20\"\n height=\"20\"\n >\n <path\n fill=\"#4285F4\"\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n />\n <path\n fill=\"#34A853\"\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n />\n <path\n fill=\"#FBBC05\"\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n />\n <path\n fill=\"#EA4335\"\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n />\n </svg>\n <span>{isLoading ? 'Loading...' : label}</span>\n\n {error && (\n <span className=\"flowstack-google-error\">{error}</span>\n )}\n\n <style>{`\n .flowstack-google-button {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.75rem;\n width: 100%;\n padding: 0.75rem 1rem;\n background: white;\n color: #374151;\n border: 1px solid #d1d5db;\n border-radius: 0.375rem;\n font-size: 1rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s, border-color 0.15s;\n }\n .flowstack-google-button:hover:not(:disabled) {\n background: #f9fafb;\n border-color: #9ca3af;\n }\n .flowstack-google-button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n .flowstack-google-icon {\n flex-shrink: 0;\n }\n .flowstack-google-error {\n display: block;\n width: 100%;\n color: #dc2626;\n font-size: 0.75rem;\n margin-top: 0.25rem;\n }\n `}</style>\n </button>\n );\n}\n","/**\n * BrokeredLoginButton — \"Continue with Flowstack\" SSO button for built apps.\n *\n * Opens the /auth/broker route at openinferencefoundation.org in a popup. That\n * origin runs Privy (it's a registered origin), authenticates the user, and\n * postMessages a Flowstack JWT back to this component. We validate the\n * message (origin + source + CSRF state + shape), then inject the credentials\n * into FlowstackProvider via setCredentials — AuthGuard unblocks on the next\n * render.\n *\n * Why this exists: Privy's Allowed Origins list doesn't support wildcards and\n * every built app lives at its own subdomain. Registering every subdomain\n * manually doesn't scale. The broker pattern keeps Privy registered only on\n * openinferencefoundation.org and lets every built app delegate auth there.\n *\n * Security notes:\n * - event.origin must be https://openinferencefoundation.org (strict match).\n * - event.source must equal the popup we opened (prevents other frames\n * from spoofing the response).\n * - `state` is a per-click CSRF nonce.\n * - On popup blocker we surface a clear error and leave the user free to\n * fall back to the email/password tabs in AuthPage.\n */\n\n'use client';\n\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { useFlowstack } from '../../context/FlowstackProvider';\nimport type { FlowstackCredentials } from '../../types';\n\nconst DEFAULT_BROKER_URL = 'https://openinferencefoundation.org/auth/broker';\n\n// Exact broker origin. We do NOT accept preview subdomains for the broker —\n// built apps in prod should always talk to the prod broker.\nconst EXPECTED_SENDER_ORIGIN = 'https://openinferencefoundation.org';\n\n// For local SDK development, optionally allow localhost. Set via the\n// `brokerUrl` prop; if it points at localhost we derive the allowed origin\n// from it so dev flows work.\nfunction deriveExpectedOrigin(brokerUrl: string): string {\n try {\n const url = new URL(brokerUrl);\n return url.origin;\n } catch {\n return EXPECTED_SENDER_ORIGIN;\n }\n}\n\nexport interface BrokeredLoginButtonProps {\n /** Override broker URL (default https://openinferencefoundation.org/auth/broker). */\n brokerUrl?: string;\n /** Button label (default \"Continue with Flowstack\"). */\n label?: string;\n /** Optional wrapper className. */\n className?: string;\n /** Fired after credentials are successfully injected. */\n onSuccess?: (credentials: FlowstackCredentials) => void;\n}\n\ninterface BrokerMessage {\n type: 'flowstack-auth-success';\n credentials: Partial<FlowstackCredentials>;\n state: string;\n}\n\nfunction isBrokerMessage(data: unknown): data is BrokerMessage {\n if (!data || typeof data !== 'object') return false;\n const d = data as Record<string, unknown>;\n return d.type === 'flowstack-auth-success' && typeof d.state === 'string' && !!d.credentials;\n}\n\nexport function BrokeredLoginButton({\n brokerUrl = DEFAULT_BROKER_URL,\n label = 'Continue with Flowstack',\n className = '',\n onSuccess,\n}: BrokeredLoginButtonProps) {\n const { setCredentials, config } = useFlowstack();\n const [isOpening, setIsOpening] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const popupRef = useRef<Window | null>(null);\n const stateRef = useRef<string>('');\n const expectedOriginRef = useRef<string>(deriveExpectedOrigin(brokerUrl));\n\n useEffect(() => {\n expectedOriginRef.current = deriveExpectedOrigin(brokerUrl);\n }, [brokerUrl]);\n\n // Listen for postMessage responses from the broker popup.\n useEffect(() => {\n const listener = (event: MessageEvent) => {\n // 1. Sender origin must match the broker's origin.\n if (event.origin !== expectedOriginRef.current) return;\n // 2. Source must be the popup we opened — OR null.\n // On mobile Safari, window.open() opens a new tab; after window.close(),\n // the tab is gone before the message is delivered, so event.source arrives\n // as null. We accept null-source messages when origin + CSRF both match\n // (checks 1 + 4 provide sufficient proof of authenticity).\n if (\n popupRef.current &&\n event.source !== null &&\n event.source !== popupRef.current\n ) return;\n // 3. Shape check.\n if (!isBrokerMessage(event.data)) return;\n // 4. CSRF nonce check.\n if (event.data.state !== stateRef.current) {\n setError('Authentication state mismatch. Please try again.');\n setIsOpening(false);\n return;\n }\n // 5. Credentials payload check.\n const c = event.data.credentials;\n if (!c.apiKey || !c.tenantId) {\n setError('Authentication response was incomplete.');\n setIsOpening(false);\n return;\n }\n // 6. Inject into FlowstackProvider. AuthGuard will unblock on next render.\n const creds: FlowstackCredentials = {\n apiKey: c.apiKey,\n tenantId: c.tenantId,\n userId: c.userId,\n email: c.email,\n expiresAt: c.expiresAt,\n };\n setCredentials(creds);\n setIsOpening(false);\n setError(null);\n onSuccess?.(creds);\n };\n window.addEventListener('message', listener);\n return () => window.removeEventListener('message', listener);\n }, [setCredentials, onSuccess]);\n\n const handleClick = useCallback(() => {\n setError(null);\n setIsOpening(true);\n\n // CSRF nonce — random per click, validated on response.\n const nonce =\n Math.random().toString(36).slice(2) + Date.now().toString(36);\n stateRef.current = nonce;\n\n // After an in-app logout, force the broker to purge its sticky Privy/Casino\n // session so the user can pick a DIFFERENT account. Without this, the broker\n // silently re-auths the just-logged-out identity and account-switching is\n // impossible. logout() sets this one-shot marker; we consume it here.\n let forceRelogin = false;\n try {\n forceRelogin = typeof window !== 'undefined'\n && window.localStorage.getItem('flowstack:force_relogin') === '1';\n if (forceRelogin) window.localStorage.removeItem('flowstack:force_relogin');\n } catch { /* storage unavailable — fall through without force */ }\n\n const url =\n `${brokerUrl}?return=${encodeURIComponent(window.location.origin)}` +\n `&state=${encodeURIComponent(nonce)}` +\n (config.appScope ? `&app_scope=${encodeURIComponent(config.appScope)}` : '') +\n (forceRelogin ? '&force_login=1' : '');\n\n const popup = window.open(\n url,\n 'flowstack-auth',\n 'width=480,height=720,left=200,top=100'\n );\n if (!popup) {\n setError('Pop-up blocked. Please allow pop-ups from this site and try again.');\n setIsOpening(false);\n return;\n }\n popupRef.current = popup;\n\n // Watchdog: if the user closes the popup without completing, reset state.\n const watchdog = window.setInterval(() => {\n if (popup.closed) {\n window.clearInterval(watchdog);\n // Only reset if we're still pending — the message handler may have\n // already set isOpening=false on success.\n setIsOpening((prev) => (prev ? false : prev));\n }\n }, 500);\n }, [brokerUrl]);\n\n return (\n <div className={className}>\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={isOpening}\n style={{\n width: '100%',\n padding: '12px 16px',\n background: '#7c3aed',\n color: '#ffffff',\n border: 'none',\n borderRadius: '10px',\n fontSize: '15px',\n fontWeight: 600,\n cursor: isOpening ? 'default' : 'pointer',\n opacity: isOpening ? 0.6 : 1,\n transition: 'opacity 150ms ease',\n }}\n >\n {isOpening ? 'Signing in…' : label}\n </button>\n {error && (\n <p\n style={{\n marginTop: '8px',\n color: '#ef4444',\n fontSize: '13px',\n lineHeight: 1.4,\n }}\n >\n {error}\n </p>\n )}\n </div>\n );\n}\n","'use client';\n\n/**\n * AuthGuard Component\n *\n * Protects routes/components from unauthenticated access.\n *\n * @example\n * ```tsx\n * function DashboardPage() {\n * return (\n * <AuthGuard fallback={<LoginPage />}>\n * <Dashboard />\n * </AuthGuard>\n * );\n * }\n * ```\n */\n\nimport React, { ReactNode, useEffect, useState, useRef } from 'react';\nimport { useFlowstack } from '../../context/FlowstackProvider';\nimport { BrokeredLoginButton } from './BrokeredLoginButton';\n\nexport interface AuthGuardProps {\n /** Protected content */\n children: ReactNode;\n /** Content to show when not authenticated */\n fallback?: ReactNode;\n /** Redirect URL when not authenticated (alternative to fallback) */\n redirectTo?: string;\n /** Show loading state while checking auth */\n loadingComponent?: ReactNode;\n /** Require a specific workspace to be selected */\n requireWorkspace?: boolean;\n /**\n * Opt-in guest chat for built apps (U1). When the app has an `appScope` and\n * the site enabled guest chat server-side (`app_config.allowGuestChat`), an\n * unauthenticated visitor is transparently issued a short-lived guest session\n * (`POST /auth/guest`) instead of being shown the login gate — removing the\n * \"sign up to the desk\" friction. Per-site control lives entirely in the\n * backend flag: if the site hasn't opted in, `/auth/guest` returns 403 and we\n * fall back to the normal login UI. Default true, but it's a no-op unless the\n * app is built with an `appScope` (the Casino dashboard has none, so it is\n * unaffected and always requires real login).\n */\n allowGuest?: boolean;\n}\n\nconst Spinner = () => (\n <div className=\"flowstack-auth-loading\">\n <div className=\"flowstack-auth-spinner\" />\n <style>{`\n .flowstack-auth-loading { display: flex; align-items: center; justify-content: center; min-height: 200px; }\n .flowstack-auth-spinner { width: 32px; height: 32px; border: 3px solid #e5e7eb; border-top-color: #3b82f6; border-radius: 50%; animation: flowstack-spin 0.8s linear infinite; }\n @keyframes flowstack-spin { to { transform: rotate(360deg); } }\n `}</style>\n </div>\n);\n\n/**\n * Auth guard component\n */\nexport function AuthGuard({\n children,\n fallback,\n redirectTo,\n loadingComponent,\n requireWorkspace = false,\n allowGuest = true,\n}: AuthGuardProps) {\n const {\n isAuthenticated,\n isInitialized,\n selectedWorkspace,\n config,\n setCredentials,\n } = useFlowstack();\n\n // U1: transparently obtain a guest session for opted-in built apps.\n const appScope = (config as any)?.appScope as string | undefined;\n const baseUrl = ((config as any)?.baseUrl as string | undefined) || 'https://sage-api.flowstack.fun';\n const [guestStatus, setGuestStatus] = useState<'idle' | 'trying' | 'done' | 'failed'>('idle');\n const guestStartedRef = useRef(false);\n\n useEffect(() => {\n if (!allowGuest || !isInitialized || isAuthenticated || !appScope || guestStartedRef.current) {\n return;\n }\n // Guard with a ref and keep guestStatus OUT of the dep array: calling\n // setGuestStatus('trying') below would otherwise re-run this effect, whose\n // cleanup would cancel the in-flight fetch, so setCredentials never fires and\n // the guard hangs on the loading state. The ref makes this run exactly once.\n guestStartedRef.current = true;\n setGuestStatus('trying');\n fetch(`${baseUrl}/auth/guest`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ site_id: appScope }),\n })\n .then((r) => (r.ok ? r.json() : Promise.reject(r.status)))\n .then((data) => {\n if (data?.token) {\n // Promote the guest token to the active session. The app_scope claim\n // matches config.appScope, so it survives the provider's hydration\n // cross-check and persists across refresh until it expires.\n setGuestStatus('done');\n setCredentials({ apiKey: data.token, tenantId: data.tenant_id, userId: data.user_id });\n } else {\n setGuestStatus('failed');\n }\n })\n .catch(() => {\n // 403 (site not opted in) or network error → fall back to login UI.\n setGuestStatus('failed');\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [allowGuest, isInitialized, isAuthenticated, appScope, baseUrl, setCredentials]);\n\n // Handle redirect — only fires AFTER the user has explicitly dismissed the\n // login UI (or if there is genuinely no fallback). An immediate redirect\n // races the BrokeredLoginButton popup and prevents the user from ever\n // completing auth, which is why built apps redirect to home on first load.\n // We intentionally do NOT redirect here; the fallback below handles login.\n useEffect(() => {\n // Intentionally empty — redirectTo is deprecated for built-app AuthGuard use.\n // Use fallback={<BrokeredLoginButton />} instead.\n }, [isInitialized, isAuthenticated, redirectTo]);\n\n // Show loading while initializing\n if (!isInitialized) {\n return loadingComponent ? <>{loadingComponent}</> : <Spinner />;\n }\n\n // U1: guest session being obtained for an opted-in built app — show loading,\n // not the login gate, so the visitor never sees the sign-up wall.\n if (!isAuthenticated && allowGuest && appScope && guestStatus === 'trying') {\n return loadingComponent ? <>{loadingComponent}</> : <Spinner />;\n }\n\n // Not authenticated — always show a login UI, never redirect immediately.\n // If the caller passed a fallback, use it. If they passed redirectTo (a\n // common LLM-generated pattern), ignore the redirect and show the default\n // BrokeredLoginButton so the user can actually log in.\n if (!isAuthenticated) {\n if (fallback) return <>{fallback}</>;\n return (\n <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', minHeight: '100dvh', gap: '16px', padding: '32px' }}>\n <p style={{ color: '#6b7280', fontSize: '15px', textAlign: 'center' }}>Sign in to continue</p>\n <BrokeredLoginButton />\n </div>\n );\n }\n\n // Check workspace requirement\n if (requireWorkspace && !selectedWorkspace) {\n return (\n <div className=\"flowstack-workspace-required\">\n <p>Please select a workspace to continue.</p>\n <style>{`\n .flowstack-workspace-required {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 200px;\n color: #6b7280;\n }\n `}</style>\n </div>\n );\n }\n\n // Authenticated - render children\n return <>{children}</>;\n}\n","'use client';\n\nimport React, { useState, useCallback, type ReactNode } from 'react';\n\nexport interface AdminGateProps {\n children: ReactNode;\n /** SHA-256 hex hash of the admin password. If omitted, accepts any non-empty password (dev mode). */\n passwordHash?: string;\n /** Fallback content shown when not authenticated as admin */\n fallback?: ReactNode;\n /** localStorage key for session persistence (default: 'flowstack_admin') */\n storageKey?: string;\n}\n\n/**\n * Password-based gate for admin routes in Casino-built apps.\n * Persists admin access in localStorage for session duration.\n *\n * Usage:\n * <AdminGate passwordHash=\"a1b2c3...\">\n * <AdminPanel />\n * </AdminGate>\n */\nexport function AdminGate({\n children,\n passwordHash,\n fallback,\n storageKey = 'flowstack_admin',\n}: AdminGateProps) {\n const [isAdmin, setIsAdmin] = useState(() => {\n if (typeof window === 'undefined') return false;\n return localStorage.getItem(storageKey) === 'true';\n });\n const [password, setPassword] = useState('');\n const [error, setError] = useState('');\n\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault();\n if (!password.trim()) return;\n\n if (!passwordHash) {\n // No hash configured — accept any non-empty password (dev/demo mode)\n localStorage.setItem(storageKey, 'true');\n setIsAdmin(true);\n return;\n }\n\n const data = new TextEncoder().encode(password);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashHex = Array.from(new Uint8Array(hashBuffer))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n\n if (hashHex === passwordHash) {\n localStorage.setItem(storageKey, 'true');\n setIsAdmin(true);\n } else {\n setError('Invalid admin password');\n }\n },\n [password, passwordHash, storageKey],\n );\n\n if (isAdmin) return <>{children}</>;\n if (fallback) return <>{fallback}</>;\n\n return (\n <div\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n minHeight: '200px',\n }}\n >\n <form onSubmit={handleSubmit} style={{ textAlign: 'center' }}>\n <p style={{ marginBottom: '8px', fontSize: '14px', color: '#6b7280' }}>\n Admin access required\n </p>\n <input\n type=\"password\"\n value={password}\n onChange={(e) => {\n setPassword(e.target.value);\n setError('');\n }}\n placeholder=\"Enter admin password\"\n style={{\n padding: '8px 12px',\n border: '1px solid #d1d5db',\n borderRadius: '6px',\n marginRight: '8px',\n fontSize: '16px',\n }}\n />\n <button\n type=\"submit\"\n style={{\n padding: '8px 16px',\n background: '#3b82f6',\n color: '#fff',\n border: 'none',\n borderRadius: '6px',\n cursor: 'pointer',\n fontSize: '14px',\n }}\n >\n Enter\n </button>\n {error && (\n <p style={{ color: '#ef4444', fontSize: '12px', marginTop: '4px' }}>\n {error}\n </p>\n )}\n </form>\n </div>\n );\n}\n","'use client';\n\n/**\n * WorkspaceSelector Component\n *\n * Dropdown selector for workspaces.\n *\n * @example\n * ```tsx\n * function Sidebar() {\n * const { workspaces, selectedWorkspace, selectWorkspace } = useWorkspace();\n *\n * return (\n * <WorkspaceSelector\n * workspaces={workspaces}\n * selected={selectedWorkspace}\n * onSelect={selectWorkspace}\n * onCreateNew={() => setShowCreateModal(true)}\n * />\n * );\n * }\n * ```\n */\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport type { WorkspaceInfo } from '../../types';\n\nexport interface WorkspaceSelectorProps {\n /** List of workspaces */\n workspaces: WorkspaceInfo[];\n /** Currently selected workspace */\n selected: WorkspaceInfo | null;\n /** Callback when workspace is selected */\n onSelect: (workspace: WorkspaceInfo) => void;\n /** Callback to create new workspace */\n onCreateNew?: () => void;\n /** Loading state */\n isLoading?: boolean;\n /** Custom className */\n className?: string;\n /** Placeholder text */\n placeholder?: string;\n}\n\n/**\n * Workspace selector dropdown\n */\nexport function WorkspaceSelector({\n workspaces,\n selected,\n onSelect,\n onCreateNew,\n isLoading = false,\n className = '',\n placeholder = 'Select workspace',\n}: WorkspaceSelectorProps) {\n const [isOpen, setIsOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Close on outside click\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const handleSelect = (workspace: WorkspaceInfo) => {\n onSelect(workspace);\n setIsOpen(false);\n };\n\n const formatDate = (dateStr: string) => {\n try {\n return new Date(dateStr).toLocaleDateString();\n } catch {\n return '';\n }\n };\n\n return (\n <div\n ref={containerRef}\n className={`flowstack-workspace-selector ${className}`}\n >\n <button\n type=\"button\"\n onClick={() => setIsOpen(!isOpen)}\n disabled={isLoading}\n className=\"flowstack-workspace-trigger\"\n >\n <span className=\"flowstack-workspace-value\">\n {selected?.name || placeholder}\n </span>\n <svg\n className={`flowstack-workspace-chevron ${isOpen ? 'open' : ''}`}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n\n {isOpen && (\n <div className=\"flowstack-workspace-dropdown\">\n {workspaces.length === 0 ? (\n <div className=\"flowstack-workspace-empty\">\n No workspaces found\n </div>\n ) : (\n <ul className=\"flowstack-workspace-list\">\n {workspaces.map(workspace => (\n <li key={workspace.workspaceId}>\n <button\n type=\"button\"\n onClick={() => handleSelect(workspace)}\n className={`flowstack-workspace-item ${\n selected?.workspaceId === workspace.workspaceId ? 'selected' : ''\n }`}\n >\n <span className=\"flowstack-workspace-name\">\n {workspace.name}\n </span>\n <span className=\"flowstack-workspace-meta\">\n {workspace.datasetCount} datasets\n {workspace.lastAccessed && ` • ${formatDate(workspace.lastAccessed)}`}\n </span>\n </button>\n </li>\n ))}\n </ul>\n )}\n\n {onCreateNew && (\n <button\n type=\"button\"\n onClick={() => {\n setIsOpen(false);\n onCreateNew();\n }}\n className=\"flowstack-workspace-create\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M8 3V13M3 8H13\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n Create new workspace\n </button>\n )}\n </div>\n )}\n\n <style>{`\n .flowstack-workspace-selector {\n position: relative;\n width: 100%;\n }\n .flowstack-workspace-trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: 0.625rem 0.75rem;\n background: white;\n border: 1px solid #d1d5db;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n cursor: pointer;\n transition: border-color 0.15s;\n }\n .flowstack-workspace-trigger:hover:not(:disabled) {\n border-color: #9ca3af;\n }\n .flowstack-workspace-trigger:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n .flowstack-workspace-value {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .flowstack-workspace-chevron {\n flex-shrink: 0;\n transition: transform 0.15s;\n }\n .flowstack-workspace-chevron.open {\n transform: rotate(180deg);\n }\n .flowstack-workspace-dropdown {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n margin-top: 0.25rem;\n background: white;\n border: 1px solid #d1d5db;\n border-radius: 0.375rem;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);\n z-index: 50;\n max-height: 300px;\n overflow-y: auto;\n }\n .flowstack-workspace-empty {\n padding: 1rem;\n text-align: center;\n color: #6b7280;\n font-size: 0.875rem;\n }\n .flowstack-workspace-list {\n list-style: none;\n margin: 0;\n padding: 0.25rem 0;\n }\n .flowstack-workspace-item {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n width: 100%;\n padding: 0.5rem 0.75rem;\n background: none;\n border: none;\n text-align: left;\n cursor: pointer;\n transition: background 0.15s;\n }\n .flowstack-workspace-item:hover {\n background: #f3f4f6;\n }\n .flowstack-workspace-item.selected {\n background: #eff6ff;\n }\n .flowstack-workspace-name {\n font-size: 0.875rem;\n font-weight: 500;\n color: #111827;\n }\n .flowstack-workspace-meta {\n font-size: 0.75rem;\n color: #6b7280;\n margin-top: 0.125rem;\n }\n .flowstack-workspace-create {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n width: 100%;\n padding: 0.625rem 0.75rem;\n background: none;\n border: none;\n border-top: 1px solid #e5e7eb;\n font-size: 0.875rem;\n color: #3b82f6;\n cursor: pointer;\n transition: background 0.15s;\n }\n .flowstack-workspace-create:hover {\n background: #f3f4f6;\n }\n `}</style>\n </div>\n );\n}\n","'use client';\n\n/**\n * CreateWorkspaceModal Component\n *\n * Modal dialog for creating a new workspace.\n *\n * @example\n * ```tsx\n * function App() {\n * const [showModal, setShowModal] = useState(false);\n *\n * return (\n * <>\n * <button onClick={() => setShowModal(true)}>New Workspace</button>\n * <CreateWorkspaceModal\n * isOpen={showModal}\n * onClose={() => setShowModal(false)}\n * onCreated={(ws) => console.log('Created:', ws.name)}\n * />\n * </>\n * );\n * }\n * ```\n */\n\nimport React, { useState, FormEvent, useEffect, useRef } from 'react';\nimport { useWorkspace } from '../../hooks/useWorkspace';\nimport type { WorkspaceInfo } from '../../types';\n\nexport interface CreateWorkspaceModalProps {\n /** Whether modal is open */\n isOpen: boolean;\n /** Close callback */\n onClose: () => void;\n /** Callback after workspace is created */\n onCreated?: (workspace: WorkspaceInfo) => void;\n /** Custom className */\n className?: string;\n}\n\n/**\n * Create workspace modal\n */\nexport function CreateWorkspaceModal({\n isOpen,\n onClose,\n onCreated,\n className = '',\n}: CreateWorkspaceModalProps) {\n const { createWorkspace, isLoading, error: hookError } = useWorkspace();\n\n const [name, setName] = useState('');\n const [description, setDescription] = useState('');\n const [error, setError] = useState<string | null>(null);\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Focus input when opened\n useEffect(() => {\n if (isOpen) {\n setName('');\n setDescription('');\n setError(null);\n setTimeout(() => inputRef.current?.focus(), 100);\n }\n }, [isOpen]);\n\n // Handle escape key\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isOpen, onClose]);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n setError(null);\n\n if (!name.trim()) {\n setError('Workspace name is required');\n return;\n }\n\n try {\n const workspace = await createWorkspace(name.trim(), description.trim() || undefined);\n if (workspace) {\n onCreated?.(workspace);\n onClose();\n } else {\n setError(hookError || 'Failed to create workspace');\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to create workspace');\n }\n };\n\n if (!isOpen) return null;\n\n const displayError = error || hookError;\n\n return (\n <div className={`flowstack-modal-overlay ${className}`} onClick={onClose}>\n <div\n className=\"flowstack-modal-content\"\n onClick={(e) => e.stopPropagation()}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"flowstack-modal-title\"\n >\n <div className=\"flowstack-modal-header\">\n <h2 id=\"flowstack-modal-title\">Create Workspace</h2>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"flowstack-modal-close\"\n aria-label=\"Close\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M5 5L15 15M15 5L5 15\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n </div>\n\n <form onSubmit={handleSubmit}>\n {displayError && (\n <div className=\"flowstack-modal-error\" role=\"alert\">\n {displayError}\n </div>\n )}\n\n <div className=\"flowstack-modal-field\">\n <label htmlFor=\"flowstack-ws-name\">Name *</label>\n <input\n ref={inputRef}\n id=\"flowstack-ws-name\"\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"My Project\"\n disabled={isLoading}\n required\n />\n </div>\n\n <div className=\"flowstack-modal-field\">\n <label htmlFor=\"flowstack-ws-desc\">Description</label>\n <textarea\n id=\"flowstack-ws-desc\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"Optional description...\"\n disabled={isLoading}\n rows={3}\n />\n </div>\n\n <div className=\"flowstack-modal-actions\">\n <button\n type=\"button\"\n onClick={onClose}\n disabled={isLoading}\n className=\"flowstack-modal-cancel\"\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n disabled={isLoading || !name.trim()}\n className=\"flowstack-modal-submit\"\n >\n {isLoading ? 'Creating...' : 'Create Workspace'}\n </button>\n </div>\n </form>\n </div>\n\n <style>{`\n .flowstack-modal-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 100;\n padding: 1rem;\n }\n .flowstack-modal-content {\n background: white;\n border-radius: 0.5rem;\n width: 100%;\n max-width: 400px;\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1);\n }\n .flowstack-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 1rem 1.5rem;\n border-bottom: 1px solid #e5e7eb;\n }\n .flowstack-modal-header h2 {\n font-size: 1.125rem;\n font-weight: 600;\n margin: 0;\n }\n .flowstack-modal-close {\n padding: 0.25rem;\n background: none;\n border: none;\n color: #6b7280;\n cursor: pointer;\n border-radius: 0.25rem;\n transition: color 0.15s;\n }\n .flowstack-modal-close:hover {\n color: #111827;\n }\n .flowstack-modal-content form {\n padding: 1.5rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n }\n .flowstack-modal-error {\n background: #fee2e2;\n border: 1px solid #fecaca;\n color: #dc2626;\n padding: 0.75rem;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n }\n .flowstack-modal-field {\n display: flex;\n flex-direction: column;\n gap: 0.375rem;\n }\n .flowstack-modal-field label {\n font-size: 0.875rem;\n font-weight: 500;\n }\n .flowstack-modal-field input,\n .flowstack-modal-field textarea {\n padding: 0.625rem 0.75rem;\n border: 1px solid #d1d5db;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n resize: vertical;\n }\n .flowstack-modal-field input:focus,\n .flowstack-modal-field textarea:focus {\n outline: none;\n border-color: #3b82f6;\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);\n }\n .flowstack-modal-actions {\n display: flex;\n gap: 0.75rem;\n justify-content: flex-end;\n margin-top: 0.5rem;\n }\n .flowstack-modal-cancel {\n padding: 0.5rem 1rem;\n background: white;\n border: 1px solid #d1d5db;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n cursor: pointer;\n transition: background 0.15s;\n }\n .flowstack-modal-cancel:hover:not(:disabled) {\n background: #f3f4f6;\n }\n .flowstack-modal-submit {\n padding: 0.5rem 1rem;\n background: #3b82f6;\n color: white;\n border: none;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.15s;\n }\n .flowstack-modal-submit:hover:not(:disabled) {\n background: #2563eb;\n }\n .flowstack-modal-submit:disabled,\n .flowstack-modal-cancel:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n `}</style>\n </div>\n );\n}\n","'use client';\n\n/**\n * DatasetUploader Component\n *\n * Drag-and-drop file uploader for datasets.\n *\n * @example\n * ```tsx\n * function DataPage() {\n * const { uploadDataset } = useDatasets();\n *\n * return (\n * <DatasetUploader\n * onUpload={uploadDataset}\n * onUploadComplete={(dataset) => console.log('Uploaded:', dataset.name)}\n * />\n * );\n * }\n * ```\n */\n\nimport React, { useState, useRef, DragEvent, ChangeEvent } from 'react';\nimport type { DatasetInfo } from '../../types';\n\nexport interface DatasetUploaderProps {\n /** Upload handler */\n onUpload: (file: File, name?: string) => Promise<DatasetInfo | null>;\n /** Callback after successful upload */\n onUploadComplete?: (dataset: DatasetInfo) => void;\n /** Callback on error */\n onError?: (error: string) => void;\n /** Accepted file types */\n accept?: string;\n /** Max file size in MB */\n maxSizeMB?: number;\n /** Custom className */\n className?: string;\n}\n\n/**\n * Dataset uploader component\n */\nexport function DatasetUploader({\n onUpload,\n onUploadComplete,\n onError,\n accept = '.csv,.xlsx,.xls,.json,.parquet',\n maxSizeMB = 100,\n className = '',\n}: DatasetUploaderProps) {\n const [isDragging, setIsDragging] = useState(false);\n const [isUploading, setIsUploading] = useState(false);\n const [progress, setProgress] = useState(0);\n const [error, setError] = useState<string | null>(null);\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleDragOver = (e: DragEvent) => {\n e.preventDefault();\n setIsDragging(true);\n };\n\n const handleDragLeave = (e: DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n };\n\n const handleDrop = (e: DragEvent) => {\n e.preventDefault();\n setIsDragging(false);\n\n const files = e.dataTransfer.files;\n if (files.length > 0) {\n handleFile(files[0]);\n }\n };\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (files && files.length > 0) {\n handleFile(files[0]);\n }\n };\n\n const handleFile = async (file: File) => {\n setError(null);\n\n // Validate file size\n const sizeMB = file.size / (1024 * 1024);\n if (sizeMB > maxSizeMB) {\n const errMsg = `File too large. Max size is ${maxSizeMB}MB`;\n setError(errMsg);\n onError?.(errMsg);\n return;\n }\n\n // Validate file type\n const ext = file.name.split('.').pop()?.toLowerCase();\n const acceptedExts = accept.split(',').map(a => a.replace('.', '').trim());\n if (ext && !acceptedExts.includes(ext)) {\n const errMsg = `Invalid file type. Accepted: ${accept}`;\n setError(errMsg);\n onError?.(errMsg);\n return;\n }\n\n setIsUploading(true);\n setProgress(0);\n\n // Simulate progress (actual progress would require XHR)\n const progressInterval = setInterval(() => {\n setProgress(prev => Math.min(prev + 10, 90));\n }, 200);\n\n try {\n const dataset = await onUpload(file);\n clearInterval(progressInterval);\n setProgress(100);\n\n if (dataset) {\n onUploadComplete?.(dataset);\n } else {\n throw new Error('Upload failed');\n }\n } catch (err) {\n clearInterval(progressInterval);\n const errMsg = err instanceof Error ? err.message : 'Upload failed';\n setError(errMsg);\n onError?.(errMsg);\n } finally {\n setIsUploading(false);\n setProgress(0);\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n }\n };\n\n return (\n <div className={`flowstack-uploader ${className}`}>\n <div\n className={`flowstack-uploader-zone ${isDragging ? 'dragging' : ''} ${isUploading ? 'uploading' : ''}`}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={() => inputRef.current?.click()}\n >\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n onChange={handleChange}\n disabled={isUploading}\n hidden\n />\n\n {isUploading ? (\n <div className=\"flowstack-uploader-progress\">\n <div className=\"flowstack-uploader-spinner\" />\n <p>Uploading... {progress}%</p>\n <div className=\"flowstack-uploader-bar\">\n <div\n className=\"flowstack-uploader-fill\"\n style={{ width: `${progress}%` }}\n />\n </div>\n </div>\n ) : (\n <>\n <svg\n className=\"flowstack-uploader-icon\"\n width=\"48\"\n height=\"48\"\n viewBox=\"0 0 48 48\"\n fill=\"none\"\n >\n <path\n d=\"M8 32L8 36C8 38.2091 9.79086 40 12 40H36C38.2091 40 40 38.2091 40 36V32M32 16L24 8M24 8L16 16M24 8V32\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n <p className=\"flowstack-uploader-text\">\n <strong>Click to upload</strong> or drag and drop\n </p>\n <p className=\"flowstack-uploader-hint\">\n CSV, Excel, JSON, or Parquet (max {maxSizeMB}MB)\n </p>\n </>\n )}\n </div>\n\n {error && (\n <div className=\"flowstack-uploader-error\" role=\"alert\">\n {error}\n </div>\n )}\n\n <style>{`\n .flowstack-uploader {\n width: 100%;\n }\n .flowstack-uploader-zone {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 2rem;\n border: 2px dashed #d1d5db;\n border-radius: 0.5rem;\n background: #fafafa;\n cursor: pointer;\n transition: border-color 0.15s, background 0.15s;\n }\n .flowstack-uploader-zone:hover,\n .flowstack-uploader-zone.dragging {\n border-color: #3b82f6;\n background: #eff6ff;\n }\n .flowstack-uploader-zone.uploading {\n cursor: default;\n border-style: solid;\n }\n .flowstack-uploader-icon {\n color: #9ca3af;\n margin-bottom: 1rem;\n }\n .flowstack-uploader-text {\n font-size: 0.9375rem;\n color: #374151;\n margin: 0 0 0.25rem;\n }\n .flowstack-uploader-hint {\n font-size: 0.8125rem;\n color: #6b7280;\n margin: 0;\n }\n .flowstack-uploader-progress {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 0.75rem;\n }\n .flowstack-uploader-spinner {\n width: 32px;\n height: 32px;\n border: 3px solid #e5e7eb;\n border-top-color: #3b82f6;\n border-radius: 50%;\n animation: flowstack-spin 0.8s linear infinite;\n }\n @keyframes flowstack-spin {\n to { transform: rotate(360deg); }\n }\n .flowstack-uploader-progress p {\n margin: 0;\n font-size: 0.875rem;\n color: #374151;\n }\n .flowstack-uploader-bar {\n width: 200px;\n height: 4px;\n background: #e5e7eb;\n border-radius: 2px;\n overflow: hidden;\n }\n .flowstack-uploader-fill {\n height: 100%;\n background: #3b82f6;\n transition: width 0.2s;\n }\n .flowstack-uploader-error {\n margin-top: 0.75rem;\n padding: 0.75rem;\n background: #fee2e2;\n border: 1px solid #fecaca;\n color: #dc2626;\n border-radius: 0.375rem;\n font-size: 0.875rem;\n }\n `}</style>\n </div>\n );\n}\n","/**\n * Mermaid diagram utilities — sanitization and content parsing.\n *\n * Used by both the SDK's MessageList (built apps) and Casino's ChatMessage\n * to safely render LLM-generated Mermaid code.\n */\n\nconst VALID_DIAGRAM_TYPES = [\n 'graph', 'flowchart', 'sequencediagram', 'classdiagram',\n 'statediagram', 'erdiagram', 'gantt', 'pie', 'gitgraph',\n 'mindmap', 'timeline', 'sankey', 'xychart', 'block',\n];\n\n/**\n * Sanitize LLM-generated Mermaid code before passing to the renderer.\n * Strips HTML tags, replaces special characters in labels, and fixes\n * common structural issues that break the Mermaid parser.\n */\nexport function sanitizeMermaidCode(code: string): string {\n if (!code || !code.trim()) return code;\n\n const lines = code.split('\\n');\n const firstNonEmpty = lines.find(l => l.trim())?.trim().toLowerCase() ?? '';\n\n // Only sanitize if it looks like mermaid (starts with a known diagram type)\n if (!VALID_DIAGRAM_TYPES.some(t => firstNonEmpty.startsWith(t))) {\n return code;\n }\n\n let result = code;\n\n // 1. Strip HTML tags (e.g. <br/>, <b>text</b>) — replace with space\n result = result.replace(/<\\/?[a-z][a-z0-9]*\\s*\\/?>/gi, ' ');\n\n // 2. Replace special characters inside node labels [...] and (\"...\")\n // Match [...] brackets (node labels)\n result = result.replace(/\\[([^\\]]*)\\]/g, (_match, inner: string) => {\n const cleaned = inner\n .replace(/&/g, ' and ')\n .replace(/\\|/g, '/')\n .replace(/#(?![0-9a-fA-F]{3,6}\\b)/g, 'no.'); // preserve hex colors\n return `[${cleaned}]`;\n });\n\n // Match (...) parentheses (round node labels)\n result = result.replace(/\\(([^)]*)\\)/g, (_match, inner: string) => {\n const cleaned = inner\n .replace(/&/g, ' and ')\n .replace(/\\|/g, '/')\n .replace(/#(?![0-9a-fA-F]{3,6}\\b)/g, 'no.');\n return `(${cleaned})`;\n });\n\n // 3. Remove blank lines (mermaid can choke on them in some diagram types)\n result = result.replace(/^\\s*$/gm, '').replace(/\\n{2,}/g, '\\n');\n\n // 4. Fix style declarations appended to edge/node lines\n // e.g. \"A --> B style A fill:#f9f\" → \"A --> B\\nstyle A fill:#f9f\"\n result = result.replace(/(\\S)\\s{2,}(style\\s+)/g, '$1\\n$2');\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Content segment splitting — detect ```mermaid blocks in message text\n// ---------------------------------------------------------------------------\n\nexport interface ContentSegment {\n type: 'text' | 'mermaid';\n content: string;\n}\n\nconst MERMAID_BLOCK_RE = /```mermaid\\n([\\s\\S]*?)```/g;\n\n/**\n * Split message content into alternating text and mermaid segments.\n * Text segments preserve everything outside fenced mermaid blocks.\n * Mermaid segments contain only the code inside the fences (trimmed).\n */\nexport function splitContentSegments(text: string): ContentSegment[] {\n if (!text) return [{ type: 'text', content: text ?? '' }];\n\n const segments: ContentSegment[] = [];\n let lastIndex = 0;\n\n for (const match of text.matchAll(MERMAID_BLOCK_RE)) {\n const matchStart = match.index!;\n // Text before this mermaid block\n if (matchStart > lastIndex) {\n const before = text.slice(lastIndex, matchStart);\n if (before.trim()) segments.push({ type: 'text', content: before });\n }\n // The mermaid code (captured group)\n segments.push({ type: 'mermaid', content: match[1].trim() });\n lastIndex = matchStart + match[0].length;\n }\n\n // Remaining text after last block\n if (lastIndex < text.length) {\n const after = text.slice(lastIndex);\n if (after.trim()) segments.push({ type: 'text', content: after });\n }\n\n // If no mermaid blocks found, return the whole thing as text\n if (segments.length === 0) {\n return [{ type: 'text', content: text }];\n }\n\n return segments;\n}\n","'use client';\n\n/**\n * MermaidDiagram — renders sanitized Mermaid code as an SVG diagram.\n *\n * Used by the SDK's MessageList to give built apps diagram rendering.\n * Applies sanitizeMermaidCode before rendering and shows a graceful\n * fallback on parse errors (never exposes parser internals to users).\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { sanitizeMermaidCode } from '../../utils/mermaid-utils';\n\nexport interface MermaidDiagramProps {\n /** Raw Mermaid code (will be sanitized before rendering) */\n code: string;\n}\n\nlet mermaidInitialized = false;\n\nexport function MermaidDiagram({ code }: MermaidDiagramProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [error, setError] = useState(false);\n const [showCode, setShowCode] = useState(false);\n\n useEffect(() => {\n if (!containerRef.current || !code.trim()) return;\n\n let cancelled = false;\n\n async function render() {\n try {\n // P0-150 FR1: `mermaid` is an OPTIONAL peer dependency (see package.json).\n // Use a non-statically-analyzable specifier so a consumer's Rollup/Vite\n // build does NOT try to resolve `mermaid` at build time — that undeclared\n // static `import('mermaid')` was the root cause of \"Rollup failed to resolve\n // import mermaid\" in every SDK consumer (P0-149 papered over it app-side with\n // `external: ['mermaid']`). Apps that want diagram rendering install `mermaid`;\n // apps that don't fall through to the graceful fallback below via catch.\n const mermaidPkg = 'mermaid';\n const mermaid = (await import(/* @vite-ignore */ mermaidPkg)).default;\n\n if (!mermaidInitialized) {\n mermaid.initialize({\n startOnLoad: false,\n theme: 'neutral',\n securityLevel: 'strict',\n fontFamily: 'inherit',\n });\n mermaidInitialized = true;\n }\n\n const sanitized = sanitizeMermaidCode(code.trim());\n const id = `mermaid-${Math.random().toString(36).slice(2)}`;\n const { svg } = await mermaid.render(id, sanitized);\n\n if (!cancelled && containerRef.current) {\n containerRef.current.innerHTML = svg;\n setError(false);\n }\n } catch {\n if (!cancelled) setError(true);\n }\n }\n\n render();\n return () => { cancelled = true; };\n }, [code]);\n\n if (error) {\n return (\n <div className=\"flowstack-diagram-fallback\">\n <div className=\"flowstack-diagram-fallback-header\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M7 4v3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n <circle cx=\"7\" cy=\"9.5\" r=\"0.75\" fill=\"currentColor\" />\n </svg>\n <span>Diagram could not render</span>\n </div>\n <button\n className=\"flowstack-diagram-toggle\"\n onClick={() => setShowCode(!showCode)}\n >\n {showCode ? 'Hide code' : 'View as code'}\n </button>\n {showCode && (\n <pre className=\"flowstack-diagram-code\">{code}</pre>\n )}\n <style>{`\n .flowstack-diagram-fallback {\n margin: 0.75rem 0;\n padding: 1rem;\n border-radius: 0.5rem;\n border: 1px solid #e5e7eb;\n background: #f9fafb;\n }\n .flowstack-diagram-fallback-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.875rem;\n color: #6b7280;\n }\n .flowstack-diagram-toggle {\n margin-top: 0.5rem;\n font-size: 0.75rem;\n padding: 0.25rem 0.5rem;\n border-radius: 0.25rem;\n border: 1px solid #d1d5db;\n background: white;\n color: #374151;\n cursor: pointer;\n }\n .flowstack-diagram-toggle:hover {\n background: #f3f4f6;\n }\n .flowstack-diagram-code {\n margin-top: 0.5rem;\n font-size: 0.75rem;\n font-family: monospace;\n white-space: pre-wrap;\n overflow-x: auto;\n color: #6b7280;\n background: #f3f4f6;\n padding: 0.5rem;\n border-radius: 0.25rem;\n }\n `}</style>\n </div>\n );\n }\n\n return (\n <>\n <div\n ref={containerRef}\n className=\"flowstack-diagram-container\"\n />\n <style>{`\n .flowstack-diagram-container {\n margin: 0.75rem 0;\n overflow-x: auto;\n border-radius: 0.5rem;\n background: #f9fafb;\n padding: 1rem;\n }\n .flowstack-diagram-container > svg {\n max-width: 100%;\n height: auto;\n }\n `}</style>\n </>\n );\n}\n","'use client';\n\n/**\n * MessageList Component\n *\n * Renders a list of chat messages.\n *\n * @example\n * ```tsx\n * function Chat() {\n * const { messages, isStreaming } = useAgent();\n * return <MessageList messages={messages} isStreaming={isStreaming} />;\n * }\n * ```\n */\n\nimport React from 'react';\nimport type { ChatMessage, ToolCall, VisualizationData } from '../../types';\nimport { splitContentSegments } from '../../utils/mermaid-utils';\nimport { MermaidDiagram } from './MermaidDiagram';\n\nexport interface MessageListProps {\n /** Chat messages */\n messages: ChatMessage[];\n /** Whether agent is streaming */\n isStreaming?: boolean;\n /** Custom className */\n className?: string;\n /** Custom message renderer */\n renderMessage?: (message: ChatMessage) => React.ReactNode;\n /** Custom tool call renderer */\n renderToolCall?: (toolCall: ToolCall) => React.ReactNode;\n /** Custom visualization renderer */\n renderVisualization?: (viz: VisualizationData) => React.ReactNode;\n}\n\n/**\n * Message list component\n */\nexport function MessageList({\n messages,\n isStreaming = false,\n className = '',\n renderMessage,\n renderToolCall,\n renderVisualization,\n}: MessageListProps) {\n const formatTime = (date: Date) => {\n return new Date(date).toLocaleTimeString([], {\n hour: '2-digit',\n minute: '2-digit',\n });\n };\n\n const defaultRenderToolCall = (toolCall: ToolCall) => (\n <div key={toolCall.id} className=\"flowstack-message-tool\">\n <div className=\"flowstack-tool-header\">\n <span className=\"flowstack-tool-name\">{toolCall.name}</span>\n <span className={`flowstack-tool-status ${toolCall.status}`}>\n {toolCall.status === 'running' && (\n <span className=\"flowstack-tool-spinner\" />\n )}\n {toolCall.status}\n </span>\n </div>\n {toolCall.result !== undefined && toolCall.result !== null && (\n <pre className=\"flowstack-tool-result\">\n {typeof toolCall.result === 'string'\n ? toolCall.result\n : JSON.stringify(toolCall.result, null, 2)}\n </pre>\n )}\n </div>\n );\n\n const defaultRenderVisualization = (viz: VisualizationData) => (\n <div key={viz.name} className=\"flowstack-message-viz\">\n {viz.imageUrl ? (\n <img src={viz.imageUrl} alt={viz.name} />\n ) : viz.imageBase64 ? (\n <img\n src={`data:image/${viz.format || 'png'};base64,${viz.imageBase64}`}\n alt={viz.name}\n />\n ) : null}\n <span className=\"flowstack-viz-name\">{viz.name}</span>\n </div>\n );\n\n const defaultRenderMessage = (message: ChatMessage) => (\n <div\n key={message.id}\n className={`flowstack-message ${message.role} ${message.isStreaming ? 'streaming' : ''}`}\n >\n <div className=\"flowstack-message-header\">\n <span className=\"flowstack-message-role\">\n {message.role === 'user' ? 'You' : 'Assistant'}\n </span>\n <span className=\"flowstack-message-time\">\n {formatTime(message.timestamp)}\n </span>\n </div>\n\n <div className=\"flowstack-message-content\">\n {!message.content && message.isStreaming ? (\n <span className=\"flowstack-message-thinking\">Thinking...</span>\n ) : message.isStreaming ? (\n message.content\n ) : (\n splitContentSegments(message.content ?? '').map((seg, i) =>\n seg.type === 'mermaid'\n ? <MermaidDiagram key={`m-${i}`} code={seg.content} />\n : <span key={`t-${i}`}>{seg.content}</span>\n )\n )}\n </div>\n\n {message.toolCalls && message.toolCalls.length > 0 && (\n <div className=\"flowstack-message-tools\">\n {message.toolCalls.map(tc =>\n renderToolCall ? renderToolCall(tc) : defaultRenderToolCall(tc)\n )}\n </div>\n )}\n\n {message.visualizations && message.visualizations.length > 0 && (\n <div className=\"flowstack-message-visualizations\">\n {message.visualizations.map(viz =>\n renderVisualization ? renderVisualization(viz) : defaultRenderVisualization(viz)\n )}\n </div>\n )}\n </div>\n );\n\n return (\n <div className={`flowstack-message-list ${className}`}>\n {messages.length === 0 ? (\n <div className=\"flowstack-message-empty\">\n <p>No messages yet. Start a conversation!</p>\n </div>\n ) : (\n messages.map(message =>\n renderMessage ? renderMessage(message) : defaultRenderMessage(message)\n )\n )}\n\n {isStreaming && messages[messages.length - 1]?.role === 'user' && (\n <div className=\"flowstack-message assistant streaming\">\n <div className=\"flowstack-message-header\">\n <span className=\"flowstack-message-role\">Assistant</span>\n </div>\n <div className=\"flowstack-message-content\">\n <span className=\"flowstack-message-thinking\">\n <span className=\"flowstack-thinking-dot\" />\n <span className=\"flowstack-thinking-dot\" />\n <span className=\"flowstack-thinking-dot\" />\n </span>\n </div>\n </div>\n )}\n\n <style>{`\n .flowstack-message-list {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n }\n .flowstack-message-empty {\n text-align: center;\n color: #6b7280;\n padding: 2rem;\n }\n .flowstack-message {\n max-width: 85%;\n padding: 0.75rem 1rem;\n border-radius: 0.75rem;\n }\n .flowstack-message.user {\n align-self: flex-end;\n background: #3b82f6;\n color: white;\n }\n .flowstack-message.assistant {\n align-self: flex-start;\n background: white;\n border: 1px solid #e5e7eb;\n }\n .flowstack-message-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-bottom: 0.375rem;\n font-size: 0.75rem;\n opacity: 0.7;\n }\n .flowstack-message-role {\n font-weight: 600;\n }\n .flowstack-message-content {\n white-space: pre-wrap;\n word-break: break-word;\n line-height: 1.5;\n }\n .flowstack-message-thinking {\n display: flex;\n gap: 0.25rem;\n }\n .flowstack-thinking-dot {\n width: 6px;\n height: 6px;\n background: #9ca3af;\n border-radius: 50%;\n animation: flowstack-bounce 1.4s ease-in-out infinite both;\n }\n .flowstack-thinking-dot:nth-child(1) { animation-delay: 0s; }\n .flowstack-thinking-dot:nth-child(2) { animation-delay: 0.2s; }\n .flowstack-thinking-dot:nth-child(3) { animation-delay: 0.4s; }\n @keyframes flowstack-bounce {\n 0%, 80%, 100% { transform: scale(0.6); opacity: 0.5; }\n 40% { transform: scale(1); opacity: 1; }\n }\n .flowstack-message-tools {\n margin-top: 0.75rem;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n .flowstack-message-tool {\n background: #f3f4f6;\n border-radius: 0.375rem;\n padding: 0.5rem;\n font-size: 0.8125rem;\n }\n .flowstack-tool-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 0.5rem;\n }\n .flowstack-tool-name {\n font-family: monospace;\n font-weight: 500;\n }\n .flowstack-tool-status {\n display: flex;\n align-items: center;\n gap: 0.25rem;\n font-size: 0.75rem;\n color: #6b7280;\n }\n .flowstack-tool-status.complete {\n color: #059669;\n }\n .flowstack-tool-status.error {\n color: #dc2626;\n }\n .flowstack-tool-spinner {\n width: 12px;\n height: 12px;\n border: 2px solid #e5e7eb;\n border-top-color: #3b82f6;\n border-radius: 50%;\n animation: flowstack-spin 0.8s linear infinite;\n }\n @keyframes flowstack-spin {\n to { transform: rotate(360deg); }\n }\n .flowstack-tool-result {\n margin: 0.5rem 0 0;\n padding: 0.5rem;\n background: #1f2937;\n color: #e5e7eb;\n border-radius: 0.25rem;\n font-size: 0.75rem;\n overflow-x: auto;\n max-height: 150px;\n }\n .flowstack-message-visualizations {\n margin-top: 0.75rem;\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n }\n .flowstack-message-viz {\n display: flex;\n flex-direction: column;\n background: white;\n border: 1px solid #e5e7eb;\n border-radius: 0.375rem;\n overflow: hidden;\n }\n .flowstack-message-viz img {\n max-width: 300px;\n max-height: 200px;\n object-fit: contain;\n }\n .flowstack-viz-name {\n padding: 0.25rem 0.5rem;\n font-size: 0.75rem;\n color: #6b7280;\n background: #f9fafb;\n border-top: 1px solid #e5e7eb;\n }\n `}</style>\n </div>\n );\n}\n","'use client';\n\n/**\n * ChatInterface Component\n *\n * Complete chat UI with message list and input.\n *\n * @example\n * ```tsx\n * function ChatPage() {\n * const { messages, query, isStreaming, clearMessages } = useAgent('data-science');\n *\n * return (\n * <ChatInterface\n * messages={messages}\n * isStreaming={isStreaming}\n * onSend={query}\n * onClear={clearMessages}\n * />\n * );\n * }\n * ```\n */\n\nimport React, { useState, useRef, useEffect, FormEvent, KeyboardEvent } from 'react';\nimport { MessageList } from './MessageList';\nimport type { ChatMessage, DataSourceBadgeInfo } from '../../types';\n\nexport interface ChatInterfaceProps {\n /** Chat messages */\n messages: ChatMessage[];\n /** Whether agent is streaming a response */\n isStreaming?: boolean;\n /** Send message callback */\n onSend: (message: string) => void;\n /** Clear messages callback */\n onClear?: () => void;\n /** Cancel current query */\n onCancel?: () => void;\n /** Connected data sources to display as badges */\n dataSources?: DataSourceBadgeInfo[];\n /** Placeholder text */\n placeholder?: string;\n /** Custom className */\n className?: string;\n /** Show clear button */\n showClearButton?: boolean;\n /** Disable input */\n disabled?: boolean;\n}\n\n/**\n * Chat interface component\n */\nexport function ChatInterface({\n messages,\n isStreaming = false,\n onSend,\n onClear,\n onCancel,\n dataSources,\n placeholder = 'Ask a question...',\n className = '',\n showClearButton = true,\n disabled = false,\n}: ChatInterfaceProps) {\n const [input, setInput] = useState('');\n const inputRef = useRef<HTMLTextAreaElement>(null);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n // Auto-scroll to bottom\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, [messages]);\n\n // Auto-resize textarea\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.style.height = 'auto';\n inputRef.current.style.height = `${Math.min(inputRef.current.scrollHeight, 200)}px`;\n }\n }, [input]);\n\n const handleSubmit = (e?: FormEvent) => {\n e?.preventDefault();\n\n const trimmed = input.trim();\n if (!trimmed || isStreaming || disabled) return;\n\n onSend(trimmed);\n setInput('');\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n return (\n <div className={`flowstack-chat ${className}`}>\n <div className=\"flowstack-chat-messages\">\n <MessageList messages={messages} isStreaming={isStreaming} />\n <div ref={messagesEndRef} />\n </div>\n\n {dataSources && dataSources.length > 0 && (\n <div className=\"flowstack-datasource-bar\">\n {dataSources.map((ds) => (\n <span key={ds.source_id} className=\"flowstack-datasource-badge\">\n <span className=\"flowstack-datasource-dot\" />\n {ds.name}\n <span className=\"flowstack-datasource-type\">{ds.type}</span>\n </span>\n ))}\n </div>\n )}\n\n <div className=\"flowstack-chat-input-container\">\n {showClearButton && messages.length > 0 && onClear && (\n <button\n type=\"button\"\n onClick={onClear}\n className=\"flowstack-chat-clear\"\n title=\"Clear messages\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M2 4H14M5 4V3C5 2.44772 5.44772 2 6 2H10C10.5523 2 11 2.44772 11 3V4M12 4V13C12 13.5523 11.5523 14 11 14H5C4.44772 14 4 13.5523 4 13V4H12Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n\n <form onSubmit={handleSubmit} className=\"flowstack-chat-form\">\n <textarea\n ref={inputRef}\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={isStreaming || disabled}\n rows={1}\n className=\"flowstack-chat-input\"\n />\n\n {isStreaming ? (\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"flowstack-chat-cancel\"\n title=\"Cancel\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <rect x=\"4\" y=\"4\" width=\"12\" height=\"12\" rx=\"2\" fill=\"currentColor\" />\n </svg>\n </button>\n ) : (\n <button\n type=\"submit\"\n disabled={!input.trim() || disabled}\n className=\"flowstack-chat-send\"\n title=\"Send\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"M3 10L18 3L11 18L9 11L3 10Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n </form>\n </div>\n\n <style>{`\n .flowstack-chat {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: #fafafa;\n }\n .flowstack-chat-messages {\n flex: 1;\n overflow-y: auto;\n padding: 1rem;\n }\n .flowstack-chat-input-container {\n display: flex;\n align-items: flex-end;\n gap: 0.5rem;\n padding: 1rem;\n background: white;\n border-top: 1px solid #e5e7eb;\n }\n .flowstack-chat-clear {\n padding: 0.5rem;\n background: none;\n border: none;\n color: #6b7280;\n cursor: pointer;\n border-radius: 0.375rem;\n transition: color 0.15s, background 0.15s;\n }\n .flowstack-chat-clear:hover {\n color: #dc2626;\n background: #fee2e2;\n }\n .flowstack-chat-form {\n flex: 1;\n display: flex;\n align-items: flex-end;\n gap: 0.5rem;\n background: white;\n border: 1px solid #d1d5db;\n border-radius: 0.5rem;\n padding: 0.5rem;\n }\n .flowstack-chat-input {\n flex: 1;\n border: none;\n outline: none;\n resize: none;\n font-size: 0.9375rem;\n line-height: 1.5;\n max-height: 200px;\n padding: 0.25rem;\n }\n .flowstack-chat-input::placeholder {\n color: #9ca3af;\n }\n .flowstack-chat-send,\n .flowstack-chat-cancel {\n padding: 0.5rem;\n background: #3b82f6;\n color: white;\n border: none;\n border-radius: 0.375rem;\n cursor: pointer;\n transition: background 0.15s;\n }\n .flowstack-chat-send:hover:not(:disabled) {\n background: #2563eb;\n }\n .flowstack-chat-send:disabled {\n background: #9ca3af;\n cursor: not-allowed;\n }\n .flowstack-chat-cancel {\n background: #ef4444;\n }\n .flowstack-chat-cancel:hover {\n background: #dc2626;\n }\n .flowstack-datasource-bar {\n display: flex;\n flex-wrap: wrap;\n gap: 0.375rem;\n padding: 0.5rem 1rem 0;\n }\n .flowstack-datasource-badge {\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n padding: 0.25rem 0.625rem;\n background: #f0fdf4;\n border: 1px solid #bbf7d0;\n border-radius: 999px;\n font-size: 0.75rem;\n color: #166534;\n line-height: 1;\n }\n .flowstack-datasource-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: #22c55e;\n flex-shrink: 0;\n }\n .flowstack-datasource-type {\n text-transform: uppercase;\n font-size: 0.625rem;\n font-weight: 600;\n opacity: 0.7;\n }\n `}</style>\n </div>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport { unflattenMarkdownTables } from '../../utils/stream-utils';\n\nexport interface MarkdownRendererProps {\n content: string;\n isStreaming?: boolean;\n className?: string;\n}\n\nexport function MarkdownRenderer({ content, className }: MarkdownRendererProps) {\n const processed = unflattenMarkdownTables(content ?? '');\n\n return (\n <div className={className} style={{ lineHeight: 1.7 }}>\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n components={{\n table: ({ children }) => (\n <div style={{ overflowX: 'auto', margin: '8px 0' }}>\n <table style={{ borderCollapse: 'collapse', width: '100%', fontSize: '0.875rem' }}>\n {children}\n </table>\n </div>\n ),\n th: ({ children }) => (\n <th style={{ padding: '6px 12px', borderBottom: '2px solid currentColor', textAlign: 'left', opacity: 0.7 }}>\n {children}\n </th>\n ),\n td: ({ children }) => (\n <td style={{ padding: '6px 12px', borderBottom: '1px solid rgba(128,128,128,0.2)', verticalAlign: 'top' }}>\n {children}\n </td>\n ),\n code: ({ inline, children, ...props }: any) =>\n inline ? (\n <code style={{ background: 'rgba(128,128,128,0.15)', borderRadius: 3, padding: '1px 5px', fontFamily: 'monospace', fontSize: '0.85em' }} {...props}>\n {children}\n </code>\n ) : (\n <pre style={{ background: 'rgba(0,0,0,0.06)', borderRadius: 6, padding: 12, overflowX: 'auto', margin: '8px 0' }}>\n <code style={{ fontFamily: 'monospace', fontSize: '0.85em' }} {...props}>{children}</code>\n </pre>\n ),\n }}\n >\n {processed}\n </ReactMarkdown>\n </div>\n );\n}\n","'use client';\n\n/**\n * AuthPage Component\n *\n * A complete authentication page with login/register tabs.\n *\n * @example\n * ```tsx\n * function LoginPage() {\n * return (\n * <AuthPage\n * defaultTab=\"login\"\n * onSuccess={() => router.push('/dashboard')}\n * logo={<MyLogo />}\n * />\n * );\n * }\n * ```\n */\n\nimport React, { useState, ReactNode } from 'react';\nimport { LoginForm, RegisterForm, GoogleSignIn, BrokeredLoginButton } from '../auth';\nimport { useFlowstack } from '../../context/FlowstackProvider';\n\nexport interface AuthPageProps {\n /** Default tab to show */\n defaultTab?: 'login' | 'register';\n /** Callback when authentication succeeds */\n onSuccess?: () => void;\n /** Callback when authentication fails */\n onError?: (error: string) => void;\n /** Custom logo component */\n logo?: ReactNode;\n /** Page title */\n title?: string;\n /** Show Google Sign In button */\n showGoogle?: boolean;\n /**\n * Show the \"Continue with Flowstack\" brokered-login button as the primary\n * CTA (P0-60). Defaults to true — this is the unified-login path for built\n * apps. Casino itself should pass `false` to avoid opening a broker popup\n * from the same origin that hosts the broker.\n */\n showFlowstackBroker?: boolean;\n /**\n * Override the broker URL (default https://openinferencefoundation.org/auth/broker).\n * Useful for staging or local development.\n */\n brokerUrl?: string;\n /** Custom footer content */\n footer?: ReactNode;\n /** Additional CSS class */\n className?: string;\n /** Custom styles for the container */\n containerClassName?: string;\n /** Custom styles for the card */\n cardClassName?: string;\n}\n\n/**\n * Complete authentication page component\n */\nexport function AuthPage({\n defaultTab = 'login',\n onSuccess,\n onError,\n logo,\n title,\n showGoogle = false,\n showFlowstackBroker = true,\n brokerUrl,\n footer,\n className = '',\n containerClassName = '',\n cardClassName = '',\n}: AuthPageProps) {\n const [activeTab, setActiveTab] = useState<'login' | 'register'>(defaultTab);\n const { config } = useFlowstack();\n\n const hasGoogle = showGoogle && config.auth?.providers?.includes('google');\n\n return (\n <div className={`flowstack-auth-page ${className}`}>\n <div className={`flowstack-auth-container ${containerClassName}`}>\n <div className={`flowstack-auth-card ${cardClassName}`}>\n {/* Logo */}\n {logo && <div className=\"flowstack-auth-logo\">{logo}</div>}\n\n {/* Title */}\n <h1 className=\"flowstack-auth-title\">\n {title || (activeTab === 'login' ? 'Welcome back' : 'Create account')}\n </h1>\n\n {/* P0-60: Continue with Flowstack (brokered SSO) — primary CTA.\n Lets users reuse their Casino identity + wallet in any built app. */}\n {showFlowstackBroker && (\n <>\n <div className=\"flowstack-auth-broker\">\n <BrokeredLoginButton\n brokerUrl={brokerUrl}\n onSuccess={() => onSuccess?.()}\n />\n </div>\n <div className=\"flowstack-auth-divider\">\n <span>or sign in with email</span>\n </div>\n </>\n )}\n\n {/* Tabs */}\n <div className=\"flowstack-auth-tabs\">\n <button\n type=\"button\"\n className={`flowstack-auth-tab ${activeTab === 'login' ? 'active' : ''}`}\n onClick={() => setActiveTab('login')}\n >\n Sign In\n </button>\n <button\n type=\"button\"\n className={`flowstack-auth-tab ${activeTab === 'register' ? 'active' : ''}`}\n onClick={() => setActiveTab('register')}\n >\n Sign Up\n </button>\n </div>\n\n {/* Forms */}\n <div className=\"flowstack-auth-form-container\">\n {activeTab === 'login' ? (\n <LoginForm\n onSuccess={onSuccess}\n onError={onError}\n showRegisterLink={false}\n />\n ) : (\n <RegisterForm\n onSuccess={onSuccess}\n onError={onError}\n showLoginLink={false}\n />\n )}\n </div>\n\n {/* Divider */}\n {hasGoogle && (\n <div className=\"flowstack-auth-divider\">\n <span>or</span>\n </div>\n )}\n\n {/* Google Sign In */}\n {hasGoogle && (\n <div className=\"flowstack-auth-social\">\n <GoogleSignIn onSuccess={onSuccess} onError={onError} />\n </div>\n )}\n\n {/* Footer */}\n {footer && <div className=\"flowstack-auth-footer\">{footer}</div>}\n </div>\n </div>\n\n <style>{`\n .flowstack-auth-page {\n min-height: 100vh;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #f5f7fa 0%, #e4e8ec 100%);\n padding: 20px;\n }\n\n .flowstack-auth-container {\n width: 100%;\n max-width: 420px;\n }\n\n .flowstack-auth-card {\n background: white;\n border-radius: 12px;\n box-shadow: 0 4px 24px rgba(0, 0, 0, 0.08);\n padding: 40px;\n }\n\n .flowstack-auth-logo {\n display: flex;\n justify-content: center;\n margin-bottom: 24px;\n }\n\n .flowstack-auth-title {\n font-size: 24px;\n font-weight: 600;\n text-align: center;\n color: #1a1a1a;\n margin: 0 0 24px 0;\n }\n\n .flowstack-auth-tabs {\n display: flex;\n gap: 8px;\n margin-bottom: 24px;\n background: #f5f5f5;\n padding: 4px;\n border-radius: 8px;\n }\n\n .flowstack-auth-tab {\n flex: 1;\n padding: 10px 16px;\n border: none;\n background: transparent;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n color: #666;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .flowstack-auth-tab.active {\n background: white;\n color: #1a1a1a;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n }\n\n .flowstack-auth-tab:hover:not(.active) {\n color: #1a1a1a;\n }\n\n .flowstack-auth-form-container {\n margin-bottom: 16px;\n }\n\n .flowstack-auth-broker {\n margin-bottom: 20px;\n }\n\n .flowstack-auth-divider {\n display: flex;\n align-items: center;\n gap: 16px;\n margin: 24px 0;\n color: #999;\n font-size: 14px;\n }\n\n .flowstack-auth-divider::before,\n .flowstack-auth-divider::after {\n content: '';\n flex: 1;\n height: 1px;\n background: #e5e5e5;\n }\n\n .flowstack-auth-social {\n margin-top: 16px;\n }\n\n .flowstack-auth-footer {\n margin-top: 24px;\n text-align: center;\n font-size: 14px;\n color: #666;\n }\n\n @media (max-width: 480px) {\n .flowstack-auth-card {\n padding: 24px;\n }\n\n .flowstack-auth-title {\n font-size: 20px;\n }\n }\n `}</style>\n </div>\n );\n}\n","'use client';\n\n/**\n * DashboardLayout Component\n *\n * A responsive dashboard layout with sidebar, header, and main content area.\n *\n * @example\n * ```tsx\n * function Dashboard() {\n * return (\n * <DashboardLayout\n * sidebar={<Sidebar />}\n * header={<Header />}\n * >\n * <MainContent />\n * </DashboardLayout>\n * );\n * }\n * ```\n */\n\nimport React, { ReactNode, useState } from 'react';\nimport { useFlowstack } from '../../context/FlowstackProvider';\n\nexport interface DashboardLayoutProps {\n /** Main content */\n children: ReactNode;\n /** Sidebar content */\n sidebar?: ReactNode;\n /** Header content */\n header?: ReactNode;\n /** Footer content */\n footer?: ReactNode;\n /** Show workspace selector in header */\n showWorkspaceSelector?: boolean;\n /** Show user menu in header */\n showUserMenu?: boolean;\n /** Sidebar collapsed by default */\n sidebarCollapsed?: boolean;\n /** Sidebar width in pixels */\n sidebarWidth?: number;\n /** Header height in pixels */\n headerHeight?: number;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Dashboard layout component with responsive sidebar\n */\nexport function DashboardLayout({\n children,\n sidebar,\n header,\n footer,\n showWorkspaceSelector = true,\n showUserMenu = true,\n sidebarCollapsed = false,\n sidebarWidth = 260,\n headerHeight = 64,\n className = '',\n}: DashboardLayoutProps) {\n const [isCollapsed, setIsCollapsed] = useState(sidebarCollapsed);\n const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);\n\n const { credentials, selectedWorkspace, workspaces, logout } = useFlowstack();\n\n const toggleSidebar = () => setIsCollapsed(!isCollapsed);\n const toggleMobileMenu = () => setIsMobileMenuOpen(!isMobileMenuOpen);\n\n return (\n <div className={`flowstack-dashboard ${className}`}>\n {/* Sidebar */}\n {sidebar && (\n <>\n <aside\n className={`flowstack-sidebar ${isCollapsed ? 'collapsed' : ''} ${isMobileMenuOpen ? 'mobile-open' : ''}`}\n style={{ width: isCollapsed ? 80 : sidebarWidth }}\n >\n <div className=\"flowstack-sidebar-content\">{sidebar}</div>\n <button\n className=\"flowstack-sidebar-toggle\"\n onClick={toggleSidebar}\n aria-label={isCollapsed ? 'Expand sidebar' : 'Collapse sidebar'}\n >\n {isCollapsed ? '>' : '<'}\n </button>\n </aside>\n {isMobileMenuOpen && (\n <div\n className=\"flowstack-sidebar-overlay\"\n onClick={toggleMobileMenu}\n />\n )}\n </>\n )}\n\n {/* Main content area */}\n <div\n className=\"flowstack-main-wrapper\"\n style={{\n marginLeft: sidebar ? (isCollapsed ? 80 : sidebarWidth) : 0,\n }}\n >\n {/* Header */}\n <header\n className=\"flowstack-header\"\n style={{ height: headerHeight }}\n >\n {sidebar && (\n <button\n className=\"flowstack-mobile-menu-toggle\"\n onClick={toggleMobileMenu}\n aria-label=\"Toggle menu\"\n >\n <span></span>\n <span></span>\n <span></span>\n </button>\n )}\n\n {header || (\n <div className=\"flowstack-header-default\">\n {showWorkspaceSelector && selectedWorkspace && (\n <div className=\"flowstack-workspace-badge\">\n <span className=\"flowstack-workspace-label\">Workspace:</span>\n <span className=\"flowstack-workspace-name\">\n {selectedWorkspace.name}\n </span>\n </div>\n )}\n\n <div className=\"flowstack-header-spacer\" />\n\n {showUserMenu && credentials && (\n <div className=\"flowstack-user-menu\">\n <span className=\"flowstack-user-email\">\n {credentials.email}\n </span>\n <button\n className=\"flowstack-logout-btn\"\n onClick={() => logout()}\n >\n Logout\n </button>\n </div>\n )}\n </div>\n )}\n </header>\n\n {/* Main content */}\n <main className=\"flowstack-main-content\">\n {children}\n </main>\n\n {/* Footer */}\n {footer && <footer className=\"flowstack-footer\">{footer}</footer>}\n </div>\n\n <style>{`\n .flowstack-dashboard {\n min-height: 100vh;\n background: #f8f9fa;\n }\n\n .flowstack-sidebar {\n position: fixed;\n top: 0;\n left: 0;\n height: 100vh;\n background: #1a1a2e;\n color: white;\n transition: width 0.2s ease, transform 0.2s ease;\n z-index: 1000;\n display: flex;\n flex-direction: column;\n }\n\n .flowstack-sidebar-content {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n }\n\n .flowstack-sidebar-toggle {\n position: absolute;\n right: -12px;\n top: 50%;\n transform: translateY(-50%);\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: #1a1a2e;\n border: 2px solid #e5e5e5;\n color: white;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n }\n\n .flowstack-sidebar-toggle:hover {\n background: #2a2a4e;\n }\n\n .flowstack-sidebar-overlay {\n display: none;\n }\n\n .flowstack-main-wrapper {\n min-height: 100vh;\n transition: margin-left 0.2s ease;\n display: flex;\n flex-direction: column;\n }\n\n .flowstack-header {\n position: sticky;\n top: 0;\n background: white;\n border-bottom: 1px solid #e5e5e5;\n display: flex;\n align-items: center;\n padding: 0 24px;\n z-index: 100;\n }\n\n .flowstack-mobile-menu-toggle {\n display: none;\n flex-direction: column;\n gap: 4px;\n background: none;\n border: none;\n padding: 8px;\n cursor: pointer;\n margin-right: 16px;\n }\n\n .flowstack-mobile-menu-toggle span {\n display: block;\n width: 20px;\n height: 2px;\n background: #333;\n }\n\n .flowstack-header-default {\n flex: 1;\n display: flex;\n align-items: center;\n }\n\n .flowstack-workspace-badge {\n display: flex;\n align-items: center;\n gap: 8px;\n background: #f0f0f0;\n padding: 6px 12px;\n border-radius: 6px;\n font-size: 14px;\n }\n\n .flowstack-workspace-label {\n color: #666;\n }\n\n .flowstack-workspace-name {\n font-weight: 500;\n color: #1a1a1a;\n }\n\n .flowstack-header-spacer {\n flex: 1;\n }\n\n .flowstack-user-menu {\n display: flex;\n align-items: center;\n gap: 16px;\n }\n\n .flowstack-user-email {\n font-size: 14px;\n color: #666;\n }\n\n .flowstack-logout-btn {\n background: none;\n border: 1px solid #ddd;\n padding: 6px 12px;\n border-radius: 6px;\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .flowstack-logout-btn:hover {\n background: #f5f5f5;\n border-color: #ccc;\n }\n\n .flowstack-main-content {\n flex: 1;\n padding: 24px;\n }\n\n .flowstack-footer {\n background: white;\n border-top: 1px solid #e5e5e5;\n padding: 16px 24px;\n }\n\n @media (max-width: 768px) {\n .flowstack-sidebar {\n transform: translateX(-100%);\n width: 260px !important;\n }\n\n .flowstack-sidebar.mobile-open {\n transform: translateX(0);\n }\n\n .flowstack-sidebar-toggle {\n display: none;\n }\n\n .flowstack-sidebar-overlay {\n display: block;\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n z-index: 999;\n }\n\n .flowstack-main-wrapper {\n margin-left: 0 !important;\n }\n\n .flowstack-mobile-menu-toggle {\n display: flex;\n }\n\n .flowstack-main-content {\n padding: 16px;\n }\n }\n `}</style>\n </div>\n );\n}\n","'use client';\n\n/**\n * ChatPage Component\n *\n * A complete chat interface page with message history and streaming support.\n *\n * @example\n * ```tsx\n * function AIChat() {\n * return (\n * <ChatPage\n * title=\"AI Assistant\"\n * placeholder=\"Ask me anything...\"\n * />\n * );\n * }\n * ```\n */\n\nimport React, { ReactNode, useEffect, useRef } from 'react';\nimport { useAgent } from '../../hooks/useAgent';\nimport { ChatInterface, MessageList } from '../chat';\n\nexport interface ChatPageProps {\n /** Page title */\n title?: string;\n /** Chat input placeholder */\n placeholder?: string;\n /** Welcome message when no messages */\n welcomeMessage?: ReactNode;\n /** Header content */\n header?: ReactNode;\n /** Sidebar content */\n sidebar?: ReactNode;\n /** Show clear button */\n showClearButton?: boolean;\n /** Show cancel button during streaming */\n showCancelButton?: boolean;\n /** Additional CSS class */\n className?: string;\n /** Callback when a message is sent */\n onMessageSent?: (message: string) => void;\n /** Callback when an error occurs */\n onError?: (error: string) => void;\n}\n\n/**\n * Complete chat page component\n */\nexport function ChatPage({\n title = 'AI Chat',\n placeholder = 'Type your message...',\n welcomeMessage,\n header,\n sidebar,\n showClearButton = true,\n showCancelButton = true,\n className = '',\n onMessageSent,\n onError,\n}: ChatPageProps) {\n const {\n messages,\n isStreaming,\n isLoading,\n error,\n query,\n clearMessages,\n cancelQuery,\n } = useAgent('data-science', { tools: ['code_interpreter', 'data_analysis', 'visualization'] });\n\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n // Auto-scroll to bottom when new messages arrive\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, [messages]);\n\n // Handle error callback\n useEffect(() => {\n if (error && onError) {\n onError(error);\n }\n }, [error, onError]);\n\n const handleSend = async (message: string) => {\n if (onMessageSent) {\n onMessageSent(message);\n }\n await query(message);\n };\n\n const showWelcome = messages.length === 0 && !isLoading;\n\n return (\n <div className={`flowstack-chat-page ${className}`}>\n {/* Sidebar */}\n {sidebar && <aside className=\"flowstack-chat-sidebar\">{sidebar}</aside>}\n\n {/* Main chat area */}\n <div className=\"flowstack-chat-main\">\n {/* Header */}\n <div className=\"flowstack-chat-header\">\n {header || <h1 className=\"flowstack-chat-title\">{title}</h1>}\n </div>\n\n {/* Messages area */}\n <div className=\"flowstack-chat-messages\">\n {showWelcome && welcomeMessage && (\n <div className=\"flowstack-chat-welcome\">{welcomeMessage}</div>\n )}\n\n {showWelcome && !welcomeMessage && (\n <div className=\"flowstack-chat-welcome\">\n <div className=\"flowstack-chat-welcome-icon\">AI</div>\n <h2>How can I help you today?</h2>\n <p>Ask me anything about your data or request analysis.</p>\n </div>\n )}\n\n <MessageList messages={messages} />\n <div ref={messagesEndRef} />\n </div>\n\n {/* Error message */}\n {error && (\n <div className=\"flowstack-chat-error\">\n <span className=\"flowstack-chat-error-icon\">!</span>\n {error}\n </div>\n )}\n\n {/* Input area */}\n <div className=\"flowstack-chat-input-area\">\n <ChatInterface\n messages={messages}\n isStreaming={isStreaming}\n onSend={handleSend}\n onClear={showClearButton ? clearMessages : undefined}\n onCancel={showCancelButton ? cancelQuery : undefined}\n placeholder={placeholder}\n disabled={isLoading}\n showClearButton={showClearButton && messages.length > 0}\n />\n </div>\n </div>\n\n <style>{`\n .flowstack-chat-page {\n display: flex;\n height: 100dvh;\n overflow: hidden;\n background: #f8f9fa;\n }\n\n .flowstack-chat-sidebar {\n width: 280px;\n background: white;\n border-right: 1px solid #e5e5e5;\n flex-shrink: 0;\n }\n\n .flowstack-chat-main {\n flex: 1;\n display: flex;\n flex-direction: column;\n max-width: 900px;\n margin: 0 auto;\n width: 100%;\n }\n\n .flowstack-chat-header {\n padding: 16px 24px;\n background: white;\n border-bottom: 1px solid #e5e5e5;\n }\n\n .flowstack-chat-title {\n font-size: 20px;\n font-weight: 600;\n margin: 0;\n color: #1a1a1a;\n }\n\n .flowstack-chat-messages {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n }\n\n .flowstack-chat-welcome {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 48px 24px;\n color: #666;\n }\n\n .flowstack-chat-welcome-icon {\n width: 64px;\n height: 64px;\n border-radius: 50%;\n background: linear-gradient(135deg, #3b82f6 0%, #8b5cf6 100%);\n color: white;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 24px;\n font-weight: 600;\n margin-bottom: 24px;\n }\n\n .flowstack-chat-welcome h2 {\n font-size: 24px;\n font-weight: 600;\n color: #1a1a1a;\n margin: 0 0 8px 0;\n }\n\n .flowstack-chat-welcome p {\n font-size: 16px;\n margin: 0;\n max-width: 400px;\n }\n\n .flowstack-chat-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 24px;\n background: #fef2f2;\n color: #dc2626;\n font-size: 14px;\n }\n\n .flowstack-chat-error-icon {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: #dc2626;\n color: white;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: bold;\n }\n\n .flowstack-chat-input-area {\n padding: 16px 24px;\n background: white;\n border-top: 1px solid #e5e5e5;\n }\n\n @media (max-width: 768px) {\n .flowstack-chat-sidebar {\n display: none;\n }\n\n .flowstack-chat-messages {\n padding: 16px;\n }\n\n .flowstack-chat-input-area {\n padding: 12px 16px;\n }\n }\n `}</style>\n </div>\n );\n}\n","/**\n * Flowstack SDK Type Definitions\n * Complete Backend-as-a-Service types for AI-powered apps\n */\n\n// =============================================================================\n// Configuration\n// =============================================================================\n\n/**\n * Main SDK configuration\n */\nexport interface FlowstackConfig {\n /** JWT secret for token signing/verification.\n * Optional for built apps using the broker auth flow (BrokeredLoginButton). */\n jwtSecret?: string;\n /** Secret for password hashing.\n * Optional for built apps using the broker auth flow (BrokeredLoginButton). */\n passwordSecret?: string;\n /** Flowstack API base URL (default: https://sage-api.flowstack.fun) */\n baseUrl?: string;\n /** Tenant ID (default: shared tenant) */\n tenantId?: string;\n /** Auth providers configuration */\n auth?: AuthConfig;\n /** Redis cache configuration */\n redis?: RedisConfig;\n /** Database configuration for user accounts */\n database?: DatabaseConfig;\n /** Default agent template */\n agentTemplate?: AgentTemplate;\n /** Base URL for standalone agent service (e.g., openai-agent ALB endpoint) */\n agentServiceUrl?: string;\n /** Credential storage strategy */\n storage?: 'local' | 'session';\n /** SDK mode: production (default), development (relaxed validation), or mock (uses fixtures) */\n mode?: 'production' | 'development' | 'mock';\n /** Privy embedded wallet config (enables email/Google signup with auto-wallet) */\n privyConfig?: { appId: string };\n /** Blockchain chain for INFER token integration */\n chain?: 'arbitrum-sepolia' | 'arbitrum';\n /** MoonPay/Transak fiat on-ramp config */\n onRampConfig?: { apiKey: string; environment: 'sandbox' | 'production' };\n /** App scope (site_id) for built apps — scopes user data to this app's MongoDB collections.\n * Set automatically by the site builder. When present, login/register embeds it in the JWT\n * and all MongoDB operations are scoped to {appScope}__* collections. */\n appScope?: string;\n}\n\nexport interface AuthConfig {\n /** Enabled auth providers */\n providers: ('email' | 'google')[];\n /** Google OAuth client ID */\n googleClientId?: string;\n /** Google OAuth client secret (server-side only) */\n googleClientSecret?: string;\n /** Require email verification */\n emailVerification?: boolean;\n /** Minimum password length (default: 8) */\n passwordMinLength?: number;\n}\n\nexport interface RedisConfig {\n /** Upstash Redis REST URL */\n url: string;\n /** Upstash Redis REST token */\n token: string;\n}\n\nexport interface DatabaseConfig {\n /** Supabase project URL */\n supabaseUrl: string;\n /** Supabase service role key */\n supabaseKey: string;\n}\n\n// =============================================================================\n// Authentication\n// =============================================================================\n\n/**\n * User information for authentication\n */\nexport interface User {\n /** Unique user identifier */\n id: string;\n /** User email address */\n email: string;\n /** Tenant ID the user belongs to */\n tenantId: string;\n /** Token expiration (ISO timestamp) */\n expiresAt?: string;\n}\n\n/**\n * User credentials stored after authentication\n */\nexport interface FlowstackCredentials {\n /** JWT session token */\n apiKey: string;\n /** Tenant ID */\n tenantId: string;\n /** User ID for isolation */\n userId?: string;\n /** User email */\n email?: string;\n /** Token expiration (ISO timestamp) */\n expiresAt?: string;\n}\n\nexport interface LoginRequest {\n email: string;\n password: string;\n}\n\nexport interface LoginResponse {\n success: boolean;\n sessionToken?: string;\n email?: string;\n tenantId?: string;\n userId?: string;\n expiresAt?: string;\n error?: string;\n}\n\nexport interface RegisterRequest {\n email: string;\n password: string;\n name?: string;\n}\n\nexport interface RegisterResponse {\n success: boolean;\n message?: string;\n requiresVerification?: boolean;\n error?: string;\n}\n\nexport interface GoogleAuthResponse {\n success: boolean;\n sessionToken?: string;\n email?: string;\n tenantId?: string;\n userId?: string;\n expiresAt?: string;\n error?: string;\n}\n\n// =============================================================================\n// Session & Workspace\n// =============================================================================\n\nexport interface SessionState {\n sessionId: string | null;\n workspaceId: string | null;\n isConnected: boolean;\n lastActivity: Date | null;\n}\n\nexport interface WorkspaceInfo {\n workspaceId: string;\n name: string;\n description?: string;\n datasetCount: number;\n visualizationCount: number;\n modelCount: number;\n createdAt: string;\n lastAccessed: string;\n}\n\nexport interface CreateWorkspaceRequest {\n name: string;\n description?: string;\n}\n\n// =============================================================================\n// Datasets\n// =============================================================================\n\nexport interface DatasetInfo {\n id: string;\n name: string;\n rows: number;\n columns: number;\n schema?: Record<string, ColumnSchema>;\n columnNames?: string[];\n createdAt?: string;\n updatedAt?: string;\n}\n\nexport interface ColumnSchema {\n type: 'string' | 'number' | 'boolean' | 'date' | 'object';\n nullable: boolean;\n unique?: boolean;\n}\n\nexport interface DatasetRow {\n [key: string]: unknown;\n}\n\nexport type DatasetCellValue = string | number | boolean | null;\n\nexport interface DatasetPreview {\n columns: string[];\n rows: DatasetCellValue[][];\n}\n\nexport interface DatasetStreamOptions {\n limit?: number;\n offset?: number;\n}\n\n// =============================================================================\n// Visualizations\n// =============================================================================\n\nexport interface VisualizationData {\n name: string;\n type?: string;\n imageUrl?: string;\n imageBase64?: string;\n format?: 'png' | 'jpeg' | 'svg' | 'html' | string;\n createdAt?: string;\n metadata?: Record<string, unknown>;\n}\n\n// =============================================================================\n// Reports\n// =============================================================================\n\nexport interface ReportInfo {\n id: string;\n name: string;\n format: string;\n url: string;\n size?: number;\n createdAt?: string;\n}\n\n// =============================================================================\n// Published Sites\n// =============================================================================\n\nexport interface PublishedSiteInfo {\n id: string;\n name: string;\n url: string;\n shortUrl?: string;\n siteType: 'on_demand' | 'daily' | 'js_build';\n fileCount: number;\n totalBytes?: number;\n createdAt: string;\n expiresAt?: string;\n description?: string;\n metadata?: Record<string, unknown>;\n currentVersion?: number;\n liveVersion?: number;\n subdomainUrl?: string;\n alias?: string | null;\n}\n\nexport interface CreateSiteParams {\n name: string;\n siteType?: 'on_demand' | 'daily' | 'js_build';\n description?: string;\n files?: Record<string, string>;\n}\n\nexport interface UseSitesReturn {\n sites: PublishedSiteInfo[];\n isLoading: boolean;\n error: string | null;\n createSite: (params: CreateSiteParams) => Promise<PublishedSiteInfo | null>;\n addFile: (siteId: string, path: string, content: string) => Promise<boolean>;\n publishSite: (siteId: string) => Promise<PublishedSiteInfo | null>;\n deleteSite: (siteId: string) => Promise<boolean>;\n refreshSites: () => Promise<void>;\n}\n\n// =============================================================================\n// Site Versioning\n// =============================================================================\n\nexport interface SiteVersion {\n version: number;\n type: 'build' | 'edit';\n createdAt: string;\n description?: string;\n fileCount: number;\n totalBytes: number;\n url: string;\n}\n\nexport interface SiteVersionManifest {\n siteId: string;\n name: string;\n liveVersion: number;\n versions: SiteVersion[];\n alias?: string | null;\n githubRepo?: {\n owner: string;\n repo: string;\n url: string;\n } | null;\n}\n\nexport interface UseSiteVersionsReturn {\n versions: SiteVersion[];\n liveVersion: number | null;\n isLoading: boolean;\n error: string | null;\n promote: (version: number) => Promise<boolean>;\n deleteVersion: (version: number) => Promise<boolean>;\n refresh: () => Promise<void>;\n}\n\nexport interface PublishToGitHubParams {\n repoName: string;\n isPrivate?: boolean;\n version?: number;\n}\n\nexport interface PublishToGitHubResult {\n repoUrl: string;\n commitSha: string;\n}\n\n// =============================================================================\n// Agent Discovery\n// =============================================================================\n\nexport interface AgentInfo {\n /** Agent identifier (used in targetAgent parameter) */\n name: string;\n /** Human-readable description of what this agent does */\n description: string;\n /** Tools available to this agent */\n tools: string[];\n /** Example phrases that trigger this agent */\n triggerPhrases: string[];\n /** Use cases this agent handles */\n useFor: string[];\n /** Whether this agent owns its full pipeline (never hands off) */\n isTerminal: boolean;\n}\n\nexport interface UseAgentsReturn {\n /** Available agents */\n agents: AgentInfo[];\n /** Loading state */\n isLoading: boolean;\n /** Error message */\n error: string | null;\n /** Refresh the agent list */\n refreshAgents: () => Promise<void>;\n}\n\n// =============================================================================\n// ML Models\n// =============================================================================\n\nexport interface ModelInfo {\n id: string;\n name: string;\n format: string;\n size_bytes: number;\n last_modified?: string;\n download_url?: string;\n metadata?: Record<string, unknown>;\n s3_key?: string;\n}\n\n// =============================================================================\n// Scripts\n// =============================================================================\n\nexport interface ScriptInfo {\n name: string;\n extension: string;\n size_bytes?: number;\n created_at?: string;\n modified_at?: string;\n content?: string;\n metadata?: Record<string, unknown>;\n}\n\n// =============================================================================\n// Data Sources\n// =============================================================================\n\nexport type DataSourceType = 'mongodb' | 'postgresql' | 's3';\n\nexport interface DataSource {\n source_id: string;\n tenant_id: string;\n source_type: DataSourceType;\n name: string;\n auth_method: string;\n is_tenant_wide: boolean;\n user_id?: string;\n credentials_preview?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n created_at: number;\n updated_at?: number;\n}\n\nexport interface DataSourceConfig {\n type: DataSourceType;\n name: string;\n connectionString?: string;\n auth_method?: string;\n credentials?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n is_tenant_wide?: boolean;\n}\n\nexport interface ConnectionTestResult {\n success: boolean;\n message: string;\n details?: Record<string, unknown>;\n}\n\n// =============================================================================\n// Chat & Messages\n// =============================================================================\n\nexport interface ChatMessage {\n id: string;\n role: 'user' | 'assistant';\n content: string;\n timestamp: Date;\n toolCalls?: ToolCall[];\n visualizations?: VisualizationData[];\n searchResults?: SearchResultsData[];\n isStreaming?: boolean;\n /** Live status text shown during streaming (tool progress, agent status) */\n statusLine?: string;\n /** P0-57: PII entities that were masked in this message (user messages only) */\n piiRedacted?: PiiRedactedEntity[];\n /** Filenames the user attached when sending this message (user messages only).\n * Set by useAgent.query() after a successful upload so the chat UI can\n * render an attachment chip on the persisted message. */\n attachmentNames?: string[];\n}\n\n/**\n * Input shape accepted by `useAgent.query()` for file attachments. Either a\n * native `File` (preferred — no double-encode) or an already-base64-encoded\n * payload matching the chat-input wire format. The SDK uploads each one to\n * the workspace via `/upload` before streaming and prepends the resolved\n * dataset names to the prompt so the agent grounds on the right file\n * instead of rummaging the user's library.\n */\nexport type AttachmentInput =\n | File\n | { filename: string; content_type: string; data: string };\n\nexport interface ToolCall {\n id: string;\n toolUseId?: string;\n name: string;\n args?: Record<string, unknown>;\n result?: unknown;\n agentResponse?: string;\n status: 'pending' | 'running' | 'complete' | 'error';\n startTime?: number;\n endTime?: number;\n}\n\nexport interface SearchResult {\n rank: number;\n title: string;\n url: string;\n content: string;\n score: number;\n}\n\nexport interface SearchResultsData {\n search_id: string;\n query: string;\n result_count: number;\n results: SearchResult[];\n answer?: string;\n}\n\n// =============================================================================\n// Streaming Events\n// =============================================================================\n\nexport interface StreamEvent {\n type: StreamEventType;\n content?: string;\n tool?: string;\n toolUseId?: string;\n args?: Record<string, unknown>;\n result?: unknown;\n /** P0-132 (G1): backend emits the tool's return value under `content` and an\n * `is_error` flag on `tool_result` events. Surfaced here so useAgent can mark\n * failed tool calls as 'error' instead of silently 'complete'. */\n isError?: boolean;\n error?: string;\n data?: unknown;\n message?: string;\n percentage?: number;\n}\n\nexport type StreamEventType =\n | 'content'\n | 'text'\n | 'delta'\n | 'metadata'\n | 'tool_call'\n | 'tool_use'\n | 'tool_result'\n | 'visualization'\n | 'progress'\n | 'credit_status'\n | 'budget_update'\n | 'complete'\n | 'done'\n | 'error'\n | 'interrupt';\n\nexport interface InterruptInfo {\n reason: string;\n timestamp?: number;\n}\n\nexport interface DataSourceBadgeInfo {\n source_id: string;\n type: string;\n name: string;\n}\n\n// =============================================================================\n// Agent Templates\n// =============================================================================\n\nexport type AgentTemplate = 'data-science' | 'marketing' | 'support' | 'custom';\n\nexport interface AgentConfig {\n template: AgentTemplate;\n systemPrompt?: string;\n tools?: string[];\n streaming?: boolean;\n networkMode?: 'SANDBOX' | 'PUBLIC';\n}\n\n// =============================================================================\n// Query Execution\n// =============================================================================\n\nexport interface QueryOptions {\n workspaceId?: string;\n networkMode?: 'SANDBOX' | 'PUBLIC';\n tools?: string[];\n}\n\n// =============================================================================\n// Usage & Credits\n// =============================================================================\n\nexport interface UsageStats {\n today: UsagePeriod;\n thisMonth: UsagePeriod;\n allTime: UsagePeriod;\n}\n\nexport interface UsagePeriod {\n analyses: number;\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n}\n\nexport interface CreditStatus {\n remaining: number;\n used: number;\n total: number;\n purchasedRemaining?: number;\n}\n\n// =============================================================================\n// Hook Return Types\n// =============================================================================\n\nexport interface UseAuthReturn {\n /** User information (preferred over credentials) */\n user: User | null;\n /** Raw credentials (maintained for backward compatibility) */\n credentials: FlowstackCredentials | null;\n isAuthenticated: boolean;\n isLoading: boolean;\n error: string | null;\n login: (email: string, password: string) => Promise<boolean>;\n register: (email: string, password: string, name?: string) => Promise<boolean>;\n googleSignIn: () => Promise<void>;\n logout: () => void;\n refreshToken: () => Promise<boolean>;\n}\n\nexport interface UseWorkspaceReturn {\n workspaces: WorkspaceInfo[];\n selectedWorkspace: WorkspaceInfo | null;\n isLoading: boolean;\n error: string | null;\n createWorkspace: (name: string, description?: string) => Promise<WorkspaceInfo | null>;\n selectWorkspace: (workspace: WorkspaceInfo) => void;\n refreshWorkspaces: () => Promise<void>;\n}\n\nexport interface UseDatasetsReturn {\n datasets: DatasetInfo[];\n isLoading: boolean;\n error: string | null;\n uploadDataset: (file: File, name?: string) => Promise<DatasetInfo | null>;\n downloadDataset: (name: string) => Promise<Blob | null>;\n deleteDataset: (name: string) => Promise<boolean>;\n refreshDatasets: () => Promise<void>;\n}\n\nexport interface UseVisualizationsReturn {\n visualizations: VisualizationData[];\n isLoading: boolean;\n error: string | null;\n refreshVisualizations: () => Promise<void>;\n}\n\nexport interface UseReportsReturn {\n reports: ReportInfo[];\n isLoading: boolean;\n error: string | null;\n uploadReport: (file: File, name?: string) => Promise<ReportInfo | null>;\n downloadReport: (url: string, name: string, format: string) => Promise<Blob | null>;\n refreshReports: () => Promise<void>;\n}\n\nexport interface UseModelsReturn {\n models: ModelInfo[];\n isLoading: boolean;\n error: string | null;\n downloadModel: (name: string) => Promise<Blob | null>;\n refreshModels: () => Promise<void>;\n}\n\nexport interface UseDataSourcesReturn {\n dataSources: DataSource[];\n isLoading: boolean;\n error: string | null;\n createDataSource: (config: DataSourceConfig) => Promise<DataSource | null>;\n testConnection: (id: string) => Promise<ConnectionTestResult>;\n deleteDataSource: (id: string) => Promise<boolean>;\n refreshDataSources: () => Promise<void>;\n}\n\nexport interface UseAgentOptions {\n /** Tool whitelist — when provided, only these tools are available to the agent */\n tools?: string[];\n /** @deprecated Strands swarm removed in P0-73. Pass `capabilities` instead\n * to pre-load tool categories for built apps. This field is ignored\n * server-side but kept in the type so older built-app bundles that\n * still pass it continue to compile. */\n targetAgent?: string;\n /** @deprecated Strands swarm removed in P0-73. Use `capabilities` instead.\n * This field is silently ignored by /mono/stream — the SDK no longer\n * forwards it. Kept in the type for back-compat with frozen bundles. */\n targetAgents?: string[];\n /** P0-80: pre-declare the tool categories a built app needs. The SDK forwards\n * these to /mono/stream, and the backend seeds `state.loaded_categories`\n * before the first LLM turn so the agent has the right tools available\n * immediately (no meta-tool discovery step). Values are meta-tool names:\n * 'site_operations' | 'data_access' | 'external_integration'\n * | 'code_execution' | 'domain_task' | 'workspace_management'\n * Omit or pass an empty array to let the agent discover tools on demand. */\n capabilities?: string[];\n /** Query mode hint — \"chat\" forces text-only responses, \"build\" allows the\n * full build/edit pipeline. Defaults to auto-detected from the message\n * content when omitted. Added in P0-66 to unblock MobileChat.tsx and other\n * consumers that want to lock the agent into chat-only behavior. */\n mode?: 'chat' | 'build' | 'edit' | 'auto';\n /** P0-132 (G5): inline system-prompt override forwarded to the backend as\n * `system_prompt_override`. Lets a hook instance run an inline persona prompt\n * without registering a separate agent. Previously dropped by useAgent even\n * though the wire/client already supported it. */\n systemPrompt?: string;\n /** P0-132 (G4): target a specific registered persona/subagent by name. Maps to\n * `target_agents` on the wire. Without this, the backend auto-selects the first\n * registered subagent, so multi-persona apps could only ever reach one. This\n * re-enables persona selection only — it does NOT revive the removed Strands\n * swarm (distinct from the deprecated `targetAgents` field above). */\n persona?: string;\n /** P0-132 (G4): alias for `persona`. Either may be used; `persona` wins if both\n * are set. */\n agentName?: string;\n /** P0-132 (G8): namespaces this hook instance's conversation/session storage so\n * independent surfaces (e.g. an interview chat and a matchmaker) keep separate\n * conversations instead of sharing one tenant-wide session (which caused\n * cross-talk). Pass a STABLE string per surface (e.g. 'interview') to preserve\n * that surface's history across page refreshes. Omit to keep the legacy\n * tenant-shared session (back-compatible default). */\n sessionKey?: string;\n}\n\nexport interface UseAgentReturn {\n query: (prompt: string, attachments?: AttachmentInput[], allowedTerms?: string[]) => Promise<void>;\n messages: ChatMessage[];\n isStreaming: boolean;\n isLoading: boolean;\n toolCalls: ToolCall[];\n error: string | null;\n pendingInterrupts?: InterruptInfo[] | null;\n connectedDataSources: DataSourceBadgeInfo[];\n clearMessages: () => void;\n /** Start a genuinely new backend conversation (sends force_new_session=true). */\n startNewSession: () => void;\n cancelQuery: () => void;\n interruptAgent: () => Promise<void>;\n respondToInterrupt: (message: string) => Promise<void>;\n}\n\nexport interface UseQueryReturn {\n execute: (prompt: string, options?: QueryOptions) => Promise<void>;\n isStreaming: boolean;\n result: string | null;\n toolCalls: ToolCall[];\n visualizations: VisualizationData[];\n error: string | null;\n cancel: () => void;\n}\n\n// =============================================================================\n// User Management (Admin)\n// =============================================================================\n\n/**\n * User role levels for tenant management\n */\nexport type UserRole = 'owner' | 'admin' | 'member' | 'viewer';\n\n/**\n * User account status\n */\nexport type UserStatus = 'active' | 'suspended' | 'pending_verification' | 'deactivated';\n\n/**\n * Activity types for user activity logs\n */\nexport type UserActivityType =\n | 'login'\n | 'logout'\n | 'register'\n | 'password_reset'\n | 'profile_update'\n | 'workspace_create'\n | 'workspace_access'\n | 'dataset_upload'\n | 'query_execute'\n | 'api_call';\n\n/**\n * Managed user - extended user info for admin management\n */\nexport interface ManagedUser {\n /** Unique user identifier */\n id: string;\n /** User email address */\n email: string;\n /** Display name (optional) */\n name?: string;\n /** User's role in the tenant */\n role: UserRole;\n /** Account status */\n status: UserStatus;\n /** Tenant ID the user belongs to */\n tenantId: string;\n /** Account creation timestamp (ISO) */\n createdAt: string;\n /** Last login timestamp (ISO) */\n lastLoginAt?: string;\n /** Last activity timestamp (ISO) */\n lastActivityAt?: string;\n /** Profile image URL */\n avatarUrl?: string;\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * User activity log entry\n */\nexport interface UserActivityLog {\n /** Activity ID */\n id: string;\n /** User who performed the action */\n userId: string;\n /** Type of activity */\n activityType: UserActivityType;\n /** Human-readable description */\n description: string;\n /** Activity timestamp (ISO) */\n timestamp: string;\n /** Related resource (workspace, dataset, etc.) */\n resourceType?: string;\n resourceId?: string;\n /** Additional context */\n metadata?: Record<string, unknown>;\n /** IP address (if available) */\n ipAddress?: string;\n}\n\n/**\n * Request to update a managed user\n */\nexport interface UpdateUserRequest {\n name?: string;\n role?: UserRole;\n status?: UserStatus;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Tenant-level user statistics\n */\nexport interface UserStats {\n /** Total registered users */\n totalUsers: number;\n /** Active users (logged in within 30 days) */\n activeUsers: number;\n /** Users by role */\n usersByRole: Record<UserRole, number>;\n /** Users by status */\n usersByStatus: Record<UserStatus, number>;\n /** New users this month */\n newUsersThisMonth: number;\n /** Daily active users (last 7 days) */\n dailyActiveUsers: number[];\n}\n\n/**\n * Pagination parameters for user lists\n */\nexport interface UserListParams {\n /** Page number (1-indexed) */\n page?: number;\n /** Items per page (default 20, max 100) */\n limit?: number;\n /** Filter by role */\n role?: UserRole;\n /** Filter by status */\n status?: UserStatus;\n /** Search by email or name */\n search?: string;\n /** Sort field */\n sortBy?: 'createdAt' | 'lastLoginAt' | 'email' | 'name';\n /** Sort direction */\n sortOrder?: 'asc' | 'desc';\n}\n\n/**\n * Paginated user list response\n */\nexport interface UserListResponse {\n users: ManagedUser[];\n totalCount: number;\n page: number;\n limit: number;\n hasMore: boolean;\n}\n\n/**\n * Return type for useUserManagement hook\n */\nexport interface UseUserManagementReturn {\n /** List of managed users */\n users: ManagedUser[];\n /** User statistics */\n stats: UserStats | null;\n /** Loading state */\n isLoading: boolean;\n /** Error message */\n error: string | null;\n /** Pagination state */\n pagination: {\n page: number;\n limit: number;\n totalCount: number;\n hasMore: boolean;\n };\n /** Refresh user list */\n refreshUsers: (params?: UserListParams) => Promise<void>;\n /** Get user by ID */\n getUser: (userId: string) => Promise<ManagedUser | null>;\n /** Update user details */\n updateUser: (userId: string, updates: UpdateUserRequest) => Promise<boolean>;\n /** Suspend a user */\n suspendUser: (userId: string, reason?: string) => Promise<boolean>;\n /** Reactivate a suspended user */\n reactivateUser: (userId: string) => Promise<boolean>;\n /** Delete a user (permanent) */\n deleteUser: (userId: string) => Promise<boolean>;\n /** Get user activity logs */\n getUserActivity: (userId: string, limit?: number) => Promise<UserActivityLog[]>;\n /** Refresh statistics */\n refreshStats: () => Promise<void>;\n /** Set current page */\n setPage: (page: number) => void;\n /** Set search query */\n setSearch: (search: string) => void;\n /** Set role filter */\n setRoleFilter: (role: UserRole | null) => void;\n /** Set status filter */\n setStatusFilter: (status: UserStatus | null) => void;\n /** Current admin user has permission */\n canManageUsers: boolean;\n}\n\n// =============================================================================\n// Provider Credentials\n// =============================================================================\n\nexport const LLM_PROVIDERS = ['anthropic', 'openai', 'gemini', 'deepseek', 'xai', 'ollama'] as const;\nexport type LLMProvider = (typeof LLM_PROVIDERS)[number];\n\n/**\n * One platform credential a user can pin via /user/model-preference.\n * Mirrors the backend ModelOption pydantic model in user_preferences.py.\n */\nexport interface ModelOption {\n credential_id: string;\n provider: string;\n model_id: string;\n purpose: string;\n is_default: boolean;\n}\n\n/**\n * The user's resolved model preference state. `is_auto=true` means no\n * pinned cred — runtime resolver falls back to the tenant's purpose default.\n */\nexport interface ModelPreferenceState {\n preferred_credential_id: string | null;\n resolved_provider: string | null;\n resolved_model_id: string | null;\n is_auto: boolean;\n}\n\n/**\n * Tenant-admin platform credential — what `/admin/provider-credentials`\n * lists. `masked_key` is `XXXX…last4` for display.\n */\nexport interface AdminProviderCredential {\n credential_id: string;\n provider: string;\n purpose: string;\n scope: string;\n model_id: string;\n is_default: boolean;\n masked_key: string;\n created_at: number;\n updated_at?: number;\n}\n\n/**\n * Non-platform credential already owned by the tenant — candidate for\n * promotion into the platform pool via `/admin/provider-credentials/promote`.\n */\nexport interface ExistingProviderCredential {\n credential_id: string;\n tenant_id: string;\n provider: string;\n purpose: string;\n scope: string;\n model_id: string;\n is_default: boolean;\n api_key_preview: string;\n created_at?: number;\n}\n\nexport interface CreateAdminProviderCredentialInput {\n provider: LLMProvider | string;\n api_key: string;\n model_id?: string;\n purpose?: string;\n is_default?: boolean;\n}\n\n/**\n * Credential purposes after the P0-68 collapse. Only `default` and\n * `code_sandbox` are actively used by MonoSage. Legacy purposes remain\n * in the union for back-compat — reads resolve them to `default` server-side\n * and writes are still accepted, but new code should target `default`.\n */\nexport const CREDENTIAL_PURPOSES = [\n 'default',\n 'code_sandbox',\n // Legacy — resolved to `default` by the provider_credentials_service shim\n 'llm',\n 'swarm',\n 'thinking',\n 'data_operations',\n 'visualization',\n 'google_marketing',\n 'site_builder',\n 'site_planner',\n 'site_style',\n 'site_data_integrator',\n 'daily_brief',\n 'js_builder',\n 'site_patch',\n 'code_interpreter',\n] as const;\nexport type CredentialPurpose = (typeof CREDENTIAL_PURPOSES)[number];\n\nexport interface ProviderCredential {\n credential_id: string;\n provider: LLMProvider;\n model_id: string;\n purpose: string;\n is_default: boolean;\n api_key?: string;\n host?: string;\n model_settings?: ProviderModelSettings;\n created_at?: string;\n}\n\nexport interface ProviderModelSettings {\n temperature?: number;\n max_tokens?: number;\n top_p?: number;\n [key: string]: unknown;\n}\n\n/** Sensible defaults for model settings. */\nexport const DEFAULT_PROVIDER_MODEL_SETTINGS: ProviderModelSettings = {\n temperature: 0.7,\n max_tokens: 4096,\n top_p: 1.0,\n};\n\n/** Runtime type guard for ProviderCredential objects. */\nexport function isProviderCredential(value: unknown): value is ProviderCredential {\n if (typeof value !== 'object' || value === null) return false;\n const obj = value as Record<string, unknown>;\n return (\n typeof obj.credential_id === 'string' &&\n typeof obj.provider === 'string' &&\n typeof obj.model_id === 'string' &&\n typeof obj.purpose === 'string' &&\n typeof obj.is_default === 'boolean'\n );\n}\n\n// =============================================================================\n// Collection Layers (P0-27)\n// =============================================================================\n\nexport const COLLECTION_LAYERS = ['shared', 'user', 'auto'] as const;\nexport type CollectionLayer = (typeof COLLECTION_LAYERS)[number];\n\nexport interface PurposeInfo {\n purpose: string;\n label: string;\n description: string;\n default_provider?: LLMProvider;\n}\n\n// =============================================================================\n// Ollama Local Inference\n// =============================================================================\n\nexport interface OllamaLocalModel {\n name: string;\n size: number;\n modified_at: string;\n digest?: string;\n}\n\nexport interface OllamaStatus {\n available: boolean;\n host: string;\n models: OllamaLocalModel[];\n error?: string;\n}\n\n// =============================================================================\n// Collection Explorer\n// =============================================================================\n\nexport interface CollectionSchemaInfo {\n fields: { name: string; type: string }[];\n}\n\nexport interface UserCollectionInfo {\n full_name: string;\n name: string;\n database: string;\n doc_count: number;\n site_name?: string;\n data_tier?: string;\n scope?: string;\n}\n\n// =============================================================================\n// API Response Types\n// =============================================================================\n\nexport interface ApiResponse<T = unknown> {\n ok: boolean;\n status: number;\n data?: T;\n error?: string;\n}\n\nexport interface ListResponse<T> {\n items: T[];\n totalCount: number;\n hasMore?: boolean;\n cached?: boolean;\n}\n\n// =============================================================================\n// Context Value\n// =============================================================================\n\n/**\n * Full context value provided by FlowstackProvider\n */\nexport interface FlowstackContextValue {\n // Configuration\n config: FlowstackConfig;\n\n // Authentication\n credentials: FlowstackCredentials | null;\n setCredentials: (creds: FlowstackCredentials | null) => void;\n isAuthenticated: boolean;\n isInitialized: boolean;\n logout: () => void;\n\n // Session\n session: SessionState;\n\n // Workspaces\n workspaces: WorkspaceInfo[];\n selectedWorkspace: WorkspaceInfo | null;\n setSelectedWorkspace: (workspace: WorkspaceInfo | null) => void;\n refreshWorkspaces: () => Promise<void>;\n createWorkspace: (name: string, description?: string) => Promise<WorkspaceInfo | null>;\n isLoadingWorkspaces: boolean;\n\n // Chat Messages\n messages: ChatMessage[];\n addMessage: (message: ChatMessage) => void;\n updateMessage: (id: string, updates: Partial<ChatMessage>) => void;\n clearMessages: () => void;\n\n // Query State\n isQueryRunning: boolean;\n setIsQueryRunning: (running: boolean) => void;\n queryStartTime: number | null;\n setQueryStartTime: (time: number | null) => void;\n\n // Datasets\n datasets: DatasetInfo[];\n setDatasets: (datasets: DatasetInfo[]) => void;\n refreshDatasets: () => Promise<void>;\n isLoadingDatasets: boolean;\n\n // Visualizations\n visualizations: VisualizationData[];\n setVisualizations: (vizs: VisualizationData[]) => void;\n addVisualization: (viz: VisualizationData) => void;\n refreshVisualizations: () => Promise<void>;\n isLoadingVisualizations: boolean;\n clearVisualizations: () => void;\n\n // Reports\n reports: ReportInfo[];\n refreshReports: () => Promise<void>;\n isLoadingReports: boolean;\n\n // Models\n models: ModelInfo[];\n refreshModels: () => Promise<void>;\n isLoadingModels: boolean;\n\n // Scripts\n scripts: ScriptInfo[];\n refreshScripts: () => Promise<void>;\n isLoadingScripts: boolean;\n\n // UI State\n isSidebarOpen: boolean;\n setSidebarOpen: (open: boolean) => void;\n activeTab: 'chat' | 'datasets' | 'visualizations' | 'reports' | 'models';\n setActiveTab: (tab: 'chat' | 'datasets' | 'visualizations' | 'reports' | 'models') => void;\n}\n\n// =============================================================================\n// Data Explorer\n// =============================================================================\n\nexport interface UserDataOverviewWorkspace {\n workspace_id: string;\n name?: string;\n artifact_counts?: Record<string, number>;\n}\n\nexport interface UserDataOverview {\n workspaces: UserDataOverviewWorkspace[];\n sites: { site_id: string; name: string }[];\n mongodb_summary: { total_collections: number; total_documents: number };\n}\n\n// =============================================================================\n// GitHub Integration\n// =============================================================================\n\nexport interface GitHubRepo {\n id: number;\n name: string;\n full_name: string;\n private: boolean;\n html_url: string;\n description?: string;\n language?: string;\n default_branch: string;\n}\n\n// =============================================================================\n// PII Settings\n// =============================================================================\n\nexport interface PiiEntitySettings {\n [entityType: string]: boolean;\n}\n\nexport interface PiiSettings {\n query_masking?: {\n enabled?: boolean;\n entity_types?: PiiEntitySettings;\n };\n file_masking?: {\n enabled?: boolean;\n };\n}\n\n/** P0-57: Detailed report of a single PII entity detected/masked in a query. */\nexport interface PiiRedactedEntity {\n entity_type: string;\n /** Original text that was masked. Partially redacted for ALWAYS_MASK types (SSN, CC). */\n original_text: string;\n start: number;\n end: number;\n score: number;\n is_always_masked: boolean;\n /** Whether this entity will actually be masked given current settings. (Preview only) */\n will_mask?: boolean;\n}\n","/**\n * Redis Cache Layer for Flowstack SDK\n * Uses Upstash Redis for serverless caching\n */\n\nimport type { FlowstackCredentials, WorkspaceInfo, DatasetInfo, VisualizationData, ReportInfo, PublishedSiteInfo } from '../types';\n\n// Cache TTL constants (in seconds)\nexport const CACHE_TTL = {\n WORKSPACES: 300, // 5 minutes\n DATASETS: 60, // 1 minute\n VISUALIZATIONS: 60, // 1 minute\n REPORTS: 60, // 1 minute\n SITES: 120, // 2 minutes\n MESSAGES: 0, // No expiry\n SESSION: 86400, // 24 hours\n} as const;\n\n// Cache key prefix\nconst NAMESPACE = 'flowstack';\n\n/**\n * Redis client configuration\n */\nexport interface RedisConfig {\n url: string;\n token: string;\n}\n\n/**\n * Create a Redis client for Upstash\n */\nfunction createRedisClient(config: RedisConfig) {\n const { url, token } = config;\n\n return {\n async get<T>(key: string): Promise<T | null> {\n try {\n const response = await fetch(`${url}/get/${key}`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n if (!response.ok) return null;\n const data = await response.json();\n return data.result ? JSON.parse(data.result) : null;\n } catch {\n return null;\n }\n },\n\n async set(key: string, value: unknown, ttl?: number): Promise<boolean> {\n try {\n const body = ttl\n ? ['SET', key, JSON.stringify(value), 'EX', ttl.toString()]\n : ['SET', key, JSON.stringify(value)];\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n return response.ok;\n } catch {\n return false;\n }\n },\n\n async del(key: string): Promise<boolean> {\n try {\n const response = await fetch(`${url}/del/${key}`, {\n method: 'POST',\n headers: { Authorization: `Bearer ${token}` },\n });\n return response.ok;\n } catch {\n return false;\n }\n },\n\n async keys(pattern: string): Promise<string[]> {\n try {\n const response = await fetch(`${url}/keys/${pattern}`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n if (!response.ok) return [];\n const data = await response.json();\n return data.result || [];\n } catch {\n return [];\n }\n },\n };\n}\n\n/**\n * Generate user-scoped cache key\n */\nfunction getCacheKey(\n type: string,\n credentials: FlowstackCredentials,\n ...parts: string[]\n): string {\n const userId = credentials.userId || 'anonymous';\n const tenantId = credentials.tenantId;\n const key = [NAMESPACE, type, tenantId, userId, ...parts].filter(Boolean).join(':');\n return key;\n}\n\n// =============================================================================\n// Workspace Cache\n// =============================================================================\n\nexport async function getCachedWorkspaces(\n credentials: FlowstackCredentials,\n config: RedisConfig\n): Promise<WorkspaceInfo[] | null> {\n const client = createRedisClient(config);\n const key = getCacheKey('workspaces', credentials);\n return client.get<WorkspaceInfo[]>(key);\n}\n\nexport async function setCachedWorkspaces(\n credentials: FlowstackCredentials,\n workspaces: WorkspaceInfo[],\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('workspaces', credentials);\n return client.set(key, workspaces, CACHE_TTL.WORKSPACES);\n}\n\nexport async function invalidateWorkspacesCache(\n credentials: FlowstackCredentials,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('workspaces', credentials);\n return client.del(key);\n}\n\n// =============================================================================\n// Dataset Cache\n// =============================================================================\n\nexport async function getCachedDatasets(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<DatasetInfo[] | null> {\n const client = createRedisClient(config);\n const key = getCacheKey('datasets', credentials, workspaceId);\n return client.get<DatasetInfo[]>(key);\n}\n\nexport async function setCachedDatasets(\n credentials: FlowstackCredentials,\n workspaceId: string,\n datasets: DatasetInfo[],\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('datasets', credentials, workspaceId);\n return client.set(key, datasets, CACHE_TTL.DATASETS);\n}\n\nexport async function invalidateDatasetsCache(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('datasets', credentials, workspaceId);\n return client.del(key);\n}\n\n// =============================================================================\n// Visualization Cache\n// =============================================================================\n\nexport async function getCachedVisualizations(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<VisualizationData[] | null> {\n const client = createRedisClient(config);\n const key = getCacheKey('visualizations', credentials, workspaceId);\n return client.get<VisualizationData[]>(key);\n}\n\nexport async function setCachedVisualizations(\n credentials: FlowstackCredentials,\n workspaceId: string,\n visualizations: VisualizationData[],\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('visualizations', credentials, workspaceId);\n return client.set(key, visualizations, CACHE_TTL.VISUALIZATIONS);\n}\n\nexport async function invalidateVisualizationsCache(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('visualizations', credentials, workspaceId);\n return client.del(key);\n}\n\n// =============================================================================\n// Report Cache\n// =============================================================================\n\nexport async function getCachedReports(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<ReportInfo[] | null> {\n const client = createRedisClient(config);\n const key = getCacheKey('reports', credentials, workspaceId);\n return client.get<ReportInfo[]>(key);\n}\n\nexport async function setCachedReports(\n credentials: FlowstackCredentials,\n workspaceId: string,\n reports: ReportInfo[],\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('reports', credentials, workspaceId);\n return client.set(key, reports, CACHE_TTL.REPORTS);\n}\n\nexport async function invalidateReportsCache(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('reports', credentials, workspaceId);\n return client.del(key);\n}\n\n// =============================================================================\n// Bulk Invalidation\n// =============================================================================\n\n/**\n * Invalidate all workspace artifacts (datasets, visualizations, reports)\n */\nexport async function invalidateWorkspaceArtifacts(\n credentials: FlowstackCredentials,\n workspaceId: string,\n config: RedisConfig\n): Promise<void> {\n await Promise.all([\n invalidateDatasetsCache(credentials, workspaceId, config),\n invalidateVisualizationsCache(credentials, workspaceId, config),\n invalidateReportsCache(credentials, workspaceId, config),\n ]);\n}\n\n/**\n * Invalidate all user cache\n */\nexport async function invalidateAllUserCache(\n credentials: FlowstackCredentials,\n config: RedisConfig\n): Promise<void> {\n const client = createRedisClient(config);\n const userId = credentials.userId || 'anonymous';\n const tenantId = credentials.tenantId;\n const pattern = `${NAMESPACE}:*:${tenantId}:${userId}:*`;\n\n const keys = await client.keys(pattern);\n await Promise.all(keys.map(key => client.del(key)));\n}\n\n// =============================================================================\n// Generic Cache Operations\n// =============================================================================\n\n/**\n * Get a cached value\n */\nexport async function getCached<T>(\n key: string,\n config: RedisConfig\n): Promise<T | null> {\n const client = createRedisClient(config);\n return client.get<T>(`${NAMESPACE}:${key}`);\n}\n\n/**\n * Set a cached value\n */\nexport async function setCached<T>(\n key: string,\n value: T,\n ttl: number,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n return client.set(`${NAMESPACE}:${key}`, value, ttl);\n}\n\n/**\n * Delete a cached value\n */\nexport async function deleteCached(\n key: string,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n return client.del(`${NAMESPACE}:${key}`);\n}\n\n// =============================================================================\n// Sites Cache\n// =============================================================================\n\nexport async function getCachedSites(\n credentials: FlowstackCredentials,\n config: RedisConfig\n): Promise<PublishedSiteInfo[] | null> {\n const client = createRedisClient(config);\n const key = getCacheKey('sites', credentials);\n return client.get<PublishedSiteInfo[]>(key);\n}\n\nexport async function setCachedSites(\n credentials: FlowstackCredentials,\n sites: PublishedSiteInfo[],\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('sites', credentials);\n return client.set(key, sites, CACHE_TTL.SITES);\n}\n\nexport async function invalidateSitesCache(\n credentials: FlowstackCredentials,\n config: RedisConfig\n): Promise<boolean> {\n const client = createRedisClient(config);\n const key = getCacheKey('sites', credentials);\n return client.del(key);\n}\n","/**\n * Agent Templates\n *\n * Pre-configured agent templates for different use cases.\n */\n\nimport type { AgentConfig, AgentTemplate } from '../types';\n\n/**\n * Data Science agent template\n * Optimized for data analysis, ML, and visualization\n */\nexport const dataScienceTemplate: AgentConfig = {\n template: 'data-science',\n streaming: true,\n networkMode: 'SANDBOX',\n};\n\n/**\n * Marketing agent template\n * Optimized for content, campaigns, and analytics\n */\nexport const marketingTemplate: AgentConfig = {\n template: 'marketing',\n streaming: true,\n networkMode: 'PUBLIC',\n};\n\n/**\n * Support agent template\n * Optimized for customer support and knowledge base\n */\nexport const supportTemplate: AgentConfig = {\n template: 'support',\n streaming: true,\n networkMode: 'SANDBOX',\n};\n\n/**\n * Custom agent template factory\n */\nexport function createCustomTemplate(config: Partial<AgentConfig>): AgentConfig {\n return {\n template: 'custom',\n streaming: true,\n networkMode: 'SANDBOX',\n ...config,\n };\n}\n\n/**\n * Get agent template by name\n */\nexport function getAgentTemplate(name: AgentTemplate): AgentConfig {\n switch (name) {\n case 'data-science':\n return dataScienceTemplate;\n case 'marketing':\n return marketingTemplate;\n case 'support':\n return supportTemplate;\n case 'custom':\n default:\n return createCustomTemplate({});\n }\n}\n","/**\n * useModelPreference — User-pinned LLM credential resolution.\n *\n * Wraps the backend `/user/model-preference` routes (P0-95 finale):\n * GET /user/model-preference → current resolved state\n * PUT /user/model-preference → set or clear pinned credential_id\n * GET /user/model-preference/options → platform creds available in tenant pool\n *\n * The Casino Settings → Model tab (`ModelSettingsView`) drives off this hook;\n * the previous SDK shim returned the wrong shape and the page error-boundaried\n * to blank.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport { flowstackFetch } from '../api/client';\nimport type { ModelOption, ModelPreferenceState } from '../types';\n\nexport interface UseModelPreferenceReturn {\n preference: ModelPreferenceState | null;\n options: ModelOption[];\n isLoading: boolean;\n error: string | null;\n setPreference: (credentialId: string | null) => Promise<boolean>;\n refresh: () => Promise<void>;\n}\n\nconst PREF_PATH = '/user/model-preference';\n\nexport function useModelPreference(): UseModelPreferenceReturn {\n const { credentials: authCredentials, config } = useFlowstack();\n const [preference, setPref] = useState<ModelPreferenceState | null>(null);\n const [options, setOptions] = useState<ModelOption[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const clientConfig = { baseUrl: config.baseUrl, tenantId: config.tenantId };\n\n const fetchAll = useCallback(async () => {\n if (!authCredentials) return;\n setError(null);\n try {\n const [prefRes, optsRes] = await Promise.all([\n flowstackFetch<ModelPreferenceState>(\n PREF_PATH,\n { credentials: authCredentials },\n clientConfig,\n ),\n flowstackFetch<ModelOption[]>(\n `${PREF_PATH}/options`,\n { credentials: authCredentials },\n clientConfig,\n ),\n ]);\n if (prefRes.ok && prefRes.data) setPref(prefRes.data);\n if (optsRes.ok && optsRes.data) setOptions(Array.isArray(optsRes.data) ? optsRes.data : []);\n if (!prefRes.ok && !optsRes.ok) {\n setError(prefRes.error || optsRes.error || 'Failed to load model preference');\n }\n } catch (err: any) {\n setError(err?.message || 'Failed to load model preference');\n }\n // ESLint exhaustive-deps complains about clientConfig identity, but it\n // changes whenever config does and that's exactly when we want to refetch.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [authCredentials, clientConfig.baseUrl, clientConfig.tenantId]);\n\n const refresh = useCallback(async () => {\n setIsLoading(true);\n await fetchAll();\n setIsLoading(false);\n }, [fetchAll]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n const setPreference = useCallback(\n async (credentialId: string | null): Promise<boolean> => {\n if (!authCredentials) return false;\n setError(null);\n try {\n const res = await flowstackFetch<ModelPreferenceState>(\n PREF_PATH,\n {\n method: 'PUT',\n credentials: authCredentials,\n body: { credential_id: credentialId },\n },\n clientConfig,\n );\n if (!res.ok) {\n setError(res.error || `Failed to set preference: ${res.status}`);\n return false;\n }\n if (res.data) setPref(res.data);\n return true;\n } catch (err: any) {\n setError(err?.message || 'Failed to set preference');\n return false;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n },\n [authCredentials, clientConfig.baseUrl, clientConfig.tenantId],\n );\n\n return { preference, options, isLoading, error, setPreference, refresh };\n}\n","/**\n * useAdminProviderCredentials — Tenant-admin LLM credential pool management.\n *\n * Wraps the backend `/admin/provider-credentials` routes (P0-95 multi-tenant):\n * GET /admin/provider-credentials/am-i-admin → non-throwing isAdmin gate\n * GET /admin/provider-credentials → list tenant's platform pool\n * GET /admin/provider-credentials/existing → non-platform creds (promote candidates)\n * POST /admin/provider-credentials → create new platform credential\n * POST /admin/provider-credentials/promote → clone existing into platform pool\n *\n * Drives the admin-only sections of the Casino Settings → Model tab.\n * For non-admins, am-i-admin returns false and the rest of the requests are\n * skipped — the hook degrades to an empty/no-op state without errors so\n * non-admin users still see their own model picker.\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { useFlowstack } from '../context/FlowstackProvider';\nimport { flowstackFetch } from '../api/client';\nimport type {\n AdminProviderCredential,\n ExistingProviderCredential,\n CreateAdminProviderCredentialInput,\n} from '../types';\n\nexport interface UseAdminProviderCredentialsReturn {\n isAdmin: boolean;\n isLoading: boolean;\n error: string | null;\n credentials: AdminProviderCredential[];\n existing: ExistingProviderCredential[];\n create: (input: CreateAdminProviderCredentialInput) => Promise<boolean>;\n // Signature mirrors the call site: ModelSettingsView passes\n // (src.tenant_id, src.credential_id) for legacy reasons. Backend's promote\n // endpoint is strict-same-tenant — we drop the tenant arg server-side.\n promote: (sourceTenantId: string, credentialId: string) => Promise<boolean>;\n refresh: () => Promise<void>;\n}\n\nconst ADMIN_PATH = '/admin/provider-credentials';\n\ninterface AmIAdminResponse {\n is_admin: boolean;\n user_id?: string | null;\n tenant_id?: string | null;\n}\n\nexport function useAdminProviderCredentials(): UseAdminProviderCredentialsReturn {\n const { credentials: authCredentials, config } = useFlowstack();\n const [isAdmin, setIsAdmin] = useState(false);\n const [credentials, setCredentials] = useState<AdminProviderCredential[]>([]);\n const [existing, setExisting] = useState<ExistingProviderCredential[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const clientConfig = { baseUrl: config.baseUrl, tenantId: config.tenantId };\n\n const fetchAll = useCallback(async () => {\n if (!authCredentials) return;\n setError(null);\n try {\n // am-i-admin first — both other endpoints 403 for non-admins, no point\n // in firing those when we already know the answer.\n const adminRes = await flowstackFetch<AmIAdminResponse>(\n `${ADMIN_PATH}/am-i-admin`,\n { credentials: authCredentials },\n clientConfig,\n );\n const admin = !!(adminRes.ok && adminRes.data?.is_admin);\n setIsAdmin(admin);\n\n if (!admin) {\n setCredentials([]);\n setExisting([]);\n return;\n }\n\n const [listRes, existRes] = await Promise.all([\n flowstackFetch<AdminProviderCredential[]>(\n ADMIN_PATH,\n { credentials: authCredentials },\n clientConfig,\n ),\n flowstackFetch<ExistingProviderCredential[]>(\n `${ADMIN_PATH}/existing`,\n { credentials: authCredentials },\n clientConfig,\n ),\n ]);\n if (listRes.ok && listRes.data) {\n setCredentials(Array.isArray(listRes.data) ? listRes.data : []);\n }\n if (existRes.ok && existRes.data) {\n setExisting(Array.isArray(existRes.data) ? existRes.data : []);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n } catch (err: any) {\n setError(err?.message || 'Failed to load admin credentials');\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [authCredentials, clientConfig.baseUrl, clientConfig.tenantId]);\n\n const refresh = useCallback(async () => {\n setIsLoading(true);\n await fetchAll();\n setIsLoading(false);\n }, [fetchAll]);\n\n useEffect(() => {\n refresh();\n }, [refresh]);\n\n const create = useCallback(\n async (input: CreateAdminProviderCredentialInput): Promise<boolean> => {\n if (!authCredentials) return false;\n setError(null);\n try {\n const res = await flowstackFetch<AdminProviderCredential>(\n ADMIN_PATH,\n {\n method: 'POST',\n credentials: authCredentials,\n body: input,\n },\n clientConfig,\n );\n if (!res.ok) {\n setError(res.error || `Failed to create credential: ${res.status}`);\n return false;\n }\n await fetchAll();\n return true;\n } catch (err: any) {\n setError(err?.message || 'Failed to create credential');\n return false;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n },\n [authCredentials, clientConfig.baseUrl, clientConfig.tenantId, fetchAll],\n );\n\n const promote = useCallback(\n async (_sourceTenantId: string, credentialId: string): Promise<boolean> => {\n if (!authCredentials) return false;\n setError(null);\n try {\n const res = await flowstackFetch<AdminProviderCredential>(\n `${ADMIN_PATH}/promote`,\n {\n method: 'POST',\n credentials: authCredentials,\n body: { credential_id: credentialId, is_default: true },\n },\n clientConfig,\n );\n if (!res.ok) {\n setError(res.error || `Failed to promote credential: ${res.status}`);\n return false;\n }\n await fetchAll();\n return true;\n } catch (err: any) {\n setError(err?.message || 'Failed to promote credential');\n return false;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n },\n [authCredentials, clientConfig.baseUrl, clientConfig.tenantId, fetchAll],\n );\n\n return { isAdmin, isLoading, error, credentials, existing, create, promote, refresh };\n}\n","'use client';\n\n/**\n * useLibrary — paginated library items for a given type.\n *\n * Calls GET /library/{type} with cursor-based pagination.\n * Returns the shape LibraryList.tsx expects:\n * { items, isLoading, error, hasMore, total, loadMore, refresh, deleteItem }\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useFlowstackOptional } from '../context/FlowstackProvider';\nimport type { FlowstackClientConfig } from '../api/client';\n\nexport type LibraryItemType = string;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface UseLibraryReturn {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n items: any[];\n isLoading: boolean;\n error: string | null;\n hasMore: boolean;\n total: number | null;\n loadMore: () => void;\n refresh: (search?: string) => void;\n deleteItem: (name: string) => Promise<boolean>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getDetail: (name: string) => Promise<Record<string, any> | null>;\n}\n\n// Maps SDK type names to backend path segments\nconst TYPE_PATH: Record<string, string> = {\n dataset: 'datasets',\n visualization: 'visualizations',\n code: 'code',\n document: 'documents',\n report: 'reports',\n model: 'models',\n};\n\nasync function _authedFetch(\n method: string,\n url: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n credentials: any,\n): Promise<Response> {\n return fetch(url, {\n method,\n headers: {\n Authorization: `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': credentials.tenantId,\n 'X-User-ID': credentials.userId,\n },\n });\n}\n\nexport function useLibrary(type: LibraryItemType): UseLibraryReturn {\n const ctx = useFlowstackOptional();\n const [items, setItems] = useState<Record<string, unknown>[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [cursor, setCursor] = useState<string | null>(null);\n const [hasMore, setHasMore] = useState(false);\n const [total, setTotal] = useState<number | null>(null);\n\n const creds = useMemo(() => ({\n apiKey: (ctx?.credentials as any)?.apiKey || '',\n tenantId: (ctx?.credentials as any)?.tenantId || ctx?.config?.tenantId || '',\n userId: (ctx?.credentials as any)?.userId || '',\n }), [ctx?.credentials, ctx?.config?.tenantId]);\n\n const baseUrl = ctx?.config?.baseUrl || 'https://sage-api.flowstack.fun';\n const pathSeg = TYPE_PATH[type];\n\n const fetchItems = useCallback(async (opts?: { cursor?: string | null; search?: string; replace?: boolean }) => {\n if (!creds.apiKey || !pathSeg) return;\n setIsLoading(true);\n if (opts?.replace !== false) setError(null);\n try {\n const url = new URL(`${baseUrl}/library/${pathSeg}`);\n url.searchParams.set('user_id', creds.userId);\n url.searchParams.set('limit', '50');\n if (opts?.cursor) url.searchParams.set('cursor', opts.cursor);\n if (opts?.search) url.searchParams.set('search', opts.search);\n\n const resp = await _authedFetch('GET', url.toString(), creds);\n if (!resp.ok) {\n setError(`Failed to load ${type} (${resp.status})`);\n return;\n }\n const data = await resp.json();\n const newItems: Record<string, unknown>[] = data.items ?? [];\n if (opts?.cursor) {\n setItems(prev => [...prev, ...newItems]);\n } else {\n setItems(newItems);\n }\n setHasMore(data.has_more ?? false);\n setCursor(data.next_cursor ?? null);\n if (data.total != null) setTotal(data.total);\n } catch (e: any) {\n setError(e.message || `Failed to load ${type}`);\n } finally {\n setIsLoading(false);\n }\n }, [creds.apiKey, creds.tenantId, creds.userId, baseUrl, pathSeg, type]);\n\n useEffect(() => {\n setItems([]);\n setCursor(null);\n setHasMore(false);\n setTotal(null);\n fetchItems({ replace: true });\n }, [fetchItems]);\n\n const loadMore = useCallback(() => {\n if (!isLoading && hasMore && cursor) {\n fetchItems({ cursor, replace: false });\n }\n }, [fetchItems, isLoading, hasMore, cursor]);\n\n const refresh = useCallback((search?: string) => {\n setItems([]);\n setCursor(null);\n fetchItems({ search, replace: true });\n }, [fetchItems]);\n\n const deleteItem = useCallback(async (name: string): Promise<boolean> => {\n if (!creds.apiKey) return false;\n try {\n const url = new URL(`${baseUrl}/library/${pathSeg}/${encodeURIComponent(name)}`);\n url.searchParams.set('user_id', creds.userId);\n const resp = await _authedFetch('DELETE', url.toString(), creds);\n if (resp.ok) refresh();\n return resp.ok;\n } catch {\n return false;\n }\n }, [creds.apiKey, creds.tenantId, creds.userId, baseUrl, pathSeg, refresh]);\n\n const getDetail = useCallback(async (name: string): Promise<Record<string, unknown> | null> => {\n if (!creds.apiKey || !pathSeg) return null;\n try {\n const url = new URL(`${baseUrl}/library/${pathSeg}/${encodeURIComponent(name)}`);\n url.searchParams.set('user_id', creds.userId);\n const resp = await _authedFetch('GET', url.toString(), creds);\n if (!resp.ok) return null;\n return await resp.json();\n } catch {\n return null;\n }\n }, [creds.apiKey, creds.tenantId, creds.userId, baseUrl, pathSeg]);\n\n return { items, isLoading, error, hasMore, total, loadMore, refresh, deleteItem, getDetail };\n}\n","'use client';\n\n/**\n * useSubagents — fetches the library of user-defined subagent definitions.\n *\n * Calls GET /library/agents on the backend and splits the result into\n * `builtin` (source=builtin) and `userDefined` (source=user or mcp) lists.\n * Also provides uploadSubagent / deleteSubagent for the AgentsTab CRUD UI.\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\nimport { useFlowstackOptional } from '../context/FlowstackProvider';\nimport type { FlowstackClientConfig } from '../api/client';\n\n// Shape returned by GET /library/agents\nexport interface SubagentSummary {\n id: string;\n name: string;\n description: string;\n source?: string;\n /** kept for legacy compat (AgentsTab checks this) */\n created_by?: string;\n created_at?: string;\n site_id?: string;\n}\n\n// Full definition returned by GET /library/agents/{name}\nexport interface SubagentDefinition extends SubagentSummary {\n system_prompt?: string;\n /** @deprecated use system_prompt — kept for compat */\n systemPrompt?: string;\n tools?: string[];\n model?: string;\n max_turns?: number;\n max_cost_usd?: number;\n}\n\nexport interface UseSubagentsReturn {\n subagents: SubagentSummary[];\n builtin: SubagentSummary[];\n userDefined: SubagentSummary[];\n isLoading: boolean;\n error: string | null;\n refresh: () => void;\n uploadSubagent: (file: File) => Promise<SubagentDefinition | null>;\n deleteSubagent: (name: string) => Promise<boolean>;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function _authedFetch(\n method: string,\n path: string,\n credentials: any,\n config: FlowstackClientConfig,\n body?: unknown,\n): Promise<Response> {\n const base = config.baseUrl || 'https://sage-api.flowstack.fun';\n const url = new URL(`${base}${path}`);\n if (method === 'GET' && credentials.userId) {\n url.searchParams.set('user_id', credentials.userId);\n }\n return fetch(url.toString(), {\n method,\n headers: {\n Authorization: `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': String(credentials.tenantId ?? ''),\n 'X-User-ID': String(credentials.userId ?? ''),\n ...(body ? { 'Content-Type': 'application/json' } : {}),\n },\n ...(body ? { body: JSON.stringify(body) } : {}),\n });\n}\n\nexport function useSubagents(): UseSubagentsReturn {\n const ctx = useFlowstackOptional();\n const [subagents, setSubagents] = useState<SubagentSummary[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const creds = useMemo(() => ({\n apiKey: (ctx?.credentials as any)?.apiKey || '',\n tenantId: (ctx?.credentials as any)?.tenantId || ctx?.config?.tenantId || '',\n userId: (ctx?.credentials as any)?.userId || '',\n }), [ctx?.credentials, ctx?.config?.tenantId]);\n\n const clientConfig = useMemo(\n () => ({ baseUrl: ctx?.config?.baseUrl, tenantId: ctx?.config?.tenantId }),\n [ctx?.config?.baseUrl, ctx?.config?.tenantId],\n );\n\n const fetch_ = useCallback(async () => {\n if (!creds.apiKey) return;\n setIsLoading(true);\n setError(null);\n try {\n const resp = await _authedFetch('GET', '/library/agents', creds, clientConfig);\n if (!resp.ok) {\n setError(`Failed to load agents (${resp.status})`);\n return;\n }\n const data = await resp.json();\n setSubagents(data.agents ?? []);\n } catch (e: any) {\n setError(e.message || 'Failed to load agents');\n } finally {\n setIsLoading(false);\n }\n }, [creds.apiKey, creds.tenantId, creds.userId, clientConfig.baseUrl]);\n\n useEffect(() => { fetch_(); }, [fetch_]);\n\n const uploadSubagent = useCallback(async (file: File): Promise<SubagentDefinition | null> => {\n if (!creds.apiKey) return null;\n const formData = new FormData();\n formData.append('file', file);\n try {\n const base = clientConfig.baseUrl || 'https://sage-api.flowstack.fun';\n const resp = await fetch(`${base}/library/agents/upload`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${creds.apiKey}`,\n 'X-Tenant-ID': creds.tenantId,\n 'X-User-ID': creds.userId,\n },\n body: formData,\n });\n if (!resp.ok) return null;\n const result = await resp.json();\n fetch_(); // refresh list\n return result;\n } catch {\n return null;\n }\n }, [creds.apiKey, creds.tenantId, creds.userId, clientConfig.baseUrl, fetch_]);\n\n const deleteSubagent = useCallback(async (name: string): Promise<boolean> => {\n if (!creds.apiKey) return false;\n try {\n const resp = await _authedFetch('DELETE', `/library/agents/${encodeURIComponent(name)}`, creds, clientConfig);\n if (resp.ok) fetch_();\n return resp.ok;\n } catch {\n return false;\n }\n }, [creds.apiKey, creds.tenantId, creds.userId, clientConfig.baseUrl, fetch_]);\n\n const builtin = useMemo(\n () => subagents.filter(a => a.source === 'builtin'),\n [subagents],\n );\n const userDefined = useMemo(\n () => subagents.filter(a => a.source !== 'builtin'),\n [subagents],\n );\n\n return { subagents, builtin, userDefined, isLoading, error, refresh: fetch_, uploadSubagent, deleteSubagent };\n}\n\n/** Fetch full agent definition from GET /library/agents/{name} */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function getSubagent(\n credentials: any,\n name: string,\n config?: FlowstackClientConfig,\n): Promise<{ ok: boolean; data?: SubagentDefinition; error?: string }> {\n try {\n const resp = await _authedFetch('GET', `/library/agents/${encodeURIComponent(name)}`, credentials, config ?? {});\n if (!resp.ok) return { ok: false, error: `${resp.status}` };\n const data = await resp.json();\n return { ok: true, data };\n } catch (e: any) {\n return { ok: false, error: e.message };\n }\n}\n","/**\n * useConversation — fetch the full message history for a specific session.\n *\n * Used by the built-app sidebar when the user clicks a past conversation —\n * we hydrate the chat panel by fetching the S3-backed history via\n * /conversations/{id}/messages and calling restoreConversation on the\n * shared provider so useAgent renders it.\n */\n\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { useFlowstack } from '../context/FlowstackProvider';\n\nexport interface ConversationMessage {\n id?: string;\n role: string;\n content: string | unknown;\n timestamp?: string;\n [key: string]: unknown;\n}\n\nasync function _fetchMessages(\n credentials: { apiKey: string; [k: string]: unknown },\n sessionId: string,\n opts: { appScope?: string; limit?: number },\n config: { baseUrl?: string; tenantId?: string },\n): Promise<{ ok: boolean; data?: { messages: ConversationMessage[] }; error?: string }> {\n const base = config.baseUrl || 'https://sage-api.flowstack.fun';\n const url = new URL(`${base}/conversations/${encodeURIComponent(sessionId)}/messages`);\n url.searchParams.set('limit', String(opts.limit ?? 500));\n if (opts.appScope) url.searchParams.set('app_scope', opts.appScope);\n try {\n const resp = await fetch(url.toString(), {\n headers: {\n Authorization: `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': String((credentials as any).tenantId || config.tenantId || ''),\n 'X-User-ID': String((credentials as any).userId || ''),\n },\n });\n if (!resp.ok) return { ok: false, error: `${resp.status}` };\n const data = await resp.json();\n return { ok: true, data: { messages: data.messages || data.items || [] } };\n } catch (e: any) {\n return { ok: false, error: e.message };\n }\n}\n\nexport interface UseConversationReturn {\n messages: ConversationMessage[];\n /** The sessionId these messages belong to — used by ChatView to guard\n * against painting stale messages from a previous session. */\n forSessionId: string | null | undefined;\n isLoading: boolean;\n error: string | null;\n refresh: () => Promise<void>;\n}\n\nexport function useConversation(sessionId: string | null | undefined): UseConversationReturn {\n const { credentials, config } = useFlowstack();\n const appScope = config.appScope;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [messages, setMessages] = useState<any[]>([]);\n const [resolvedSessionId, setResolvedSessionId] = useState<string | null | undefined>(undefined);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const refresh = useCallback(async (): Promise<void> => {\n if (!credentials || !sessionId) {\n setMessages([]);\n return;\n }\n setIsLoading(true);\n setError(null);\n try {\n const resp = await _fetchMessages(\n credentials as any,\n sessionId,\n { appScope, limit: 500 },\n { baseUrl: config.baseUrl, tenantId: config.tenantId },\n );\n if (resp.ok && resp.data) {\n setMessages(resp.data.messages || []);\n setResolvedSessionId(sessionId); // confirm messages are for THIS session\n } else {\n setError(resp.error || 'Failed to load conversation');\n setMessages([]);\n setResolvedSessionId(sessionId);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n setMessages([]);\n } finally {\n setIsLoading(false);\n }\n }, [credentials, sessionId, appScope, config.baseUrl, config.tenantId]);\n\n useEffect(() => {\n // Reset resolved ID immediately on sessionId change so ChatView's guard\n // never sees a stale match while the new fetch is in-flight.\n setResolvedSessionId(undefined);\n setMessages([]);\n refresh();\n }, [refresh]);\n\n return { messages, forSessionId: resolvedSessionId, isLoading, error, refresh };\n}\n","/**\n * Flowstack SDK\n *\n * Complete Backend-as-a-Service for AI-powered apps.\n *\n * @example\n * ```tsx\n * import { FlowstackProvider, useAuth, useAgent, LoginForm } from 'flowstack-sdk';\n *\n * function App() {\n * return (\n * <FlowstackProvider config={{ jwtSecret: process.env.JWT_SECRET! }}>\n * <MyApp />\n * </FlowstackProvider>\n * );\n * }\n * ```\n *\n * @packageDocumentation\n */\n\n// =============================================================================\n// Core Context\n// =============================================================================\n\nexport {\n FlowstackProvider,\n useFlowstack,\n useFlowstackOptional,\n} from './context';\n\n// =============================================================================\n// Errors\n// =============================================================================\n\nexport {\n FlowstackError,\n ErrorCodes,\n ErrorMessages,\n RecoveryActions,\n isFlowstackError,\n withErrorHandling,\n} from './errors';\n\nexport type {\n ErrorCode,\n FlowstackErrorOptions,\n} from './errors';\n\n// =============================================================================\n// Config Validation\n// =============================================================================\n\nexport {\n validateConfig,\n validateConfigOrThrow,\n isDevelopmentConfig,\n getConfigSummary,\n} from './config';\n\nexport type { ValidationResult } from './config';\n\n// =============================================================================\n// Hooks\n// =============================================================================\n\nexport {\n useAuth,\n useWorkspace,\n useDatasets,\n useVisualizations,\n useReports,\n useModels,\n useDataSources,\n useAgent,\n useQuery,\n useIntentAgent,\n useAuthGuard,\n useFlowstackStatus,\n useUserManagement,\n useSites,\n useAgents,\n useCollection,\n useToolInvocation,\n useConnections,\n useThreads,\n useMessages,\n useSiteVersions,\n useProviderCredentials,\n useOllamaDetection,\n useDataOverview,\n useUserCollections,\n useCollectionExplorer,\n usePublicCollection,\n useConversations,\n COLLECTION_CHANGED_EVENT,\n} from './hooks';\n\nexport type {\n AuthGuardOptions,\n UseAuthGuardReturn,\n ConnectionStatus,\n UseFlowstackStatusReturn,\n UseFlowstackStatusOptions,\n UseToolInvocationOptions,\n UseToolInvocationReturn,\n UseCollectionOptions,\n UseCollectionReturn,\n ConnectionsState,\n GoogleService,\n ServiceProvider,\n UseConnectionsReturn,\n GitHubConnectionStatus,\n CreateCredentialParams,\n UseProviderCredentialsReturn,\n UseDataOverviewReturn,\n UseUserCollectionsOptions,\n UseUserCollectionsReturn,\n UseCollectionExplorerOptions,\n UseCollectionExplorerReturn,\n UsePublicCollectionOptions,\n UsePublicCollectionReturn,\n UseThreadsOptions,\n UseThreadsReturn,\n UseMessagesOptions,\n UseMessagesReturn,\n} from './hooks';\n\n// =============================================================================\n// Mock Mode\n// =============================================================================\n\nexport {\n mockCredentials,\n mockUser,\n mockWorkspaces,\n mockDatasets,\n mockVisualizations,\n mockDataSources,\n mockChatHistory,\n mockManagedUsers,\n mockUserStats,\n mockUserActivity,\n generateMockId,\n mockDelay,\n} from './mock';\n\n// =============================================================================\n// Components\n// =============================================================================\n\nexport {\n // Auth\n LoginForm,\n RegisterForm,\n GoogleSignIn,\n AuthGuard,\n AdminGate,\n BrokeredLoginButton,\n // Workspace\n WorkspaceSelector,\n CreateWorkspaceModal,\n // Datasets\n DatasetUploader,\n // Chat\n ChatInterface,\n MessageList,\n MarkdownRenderer,\n // Pages\n AuthPage,\n DashboardLayout,\n ChatPage,\n} from './components';\n\n// =============================================================================\n// Built-App Monetization (P0-121)\n// =============================================================================\n\n// AppPaywall is intentionally not in the main entry point for tree-shaking.\n// Import from 'flowstack-sdk/wallet':\n// import { AppPaywall, useAppAccess } from 'flowstack-sdk/wallet'\n// Re-exporting type only here for convenience.\nexport type { AppAccessStatus, UseAppAccessReturn, AppPaywallProps } from './wallet/types';\n\n// Component props types\nexport type {\n LoginFormProps,\n RegisterFormProps,\n GoogleSignInProps,\n AuthGuardProps,\n AdminGateProps,\n BrokeredLoginButtonProps,\n WorkspaceSelectorProps,\n CreateWorkspaceModalProps,\n DatasetUploaderProps,\n ChatInterfaceProps,\n MessageListProps,\n MarkdownRendererProps,\n AuthPageProps,\n DashboardLayoutProps,\n ChatPageProps,\n} from './components';\n\n// =============================================================================\n// Types — runtime constants\n// =============================================================================\n\nexport {\n LLM_PROVIDERS,\n CREDENTIAL_PURPOSES,\n DEFAULT_PROVIDER_MODEL_SETTINGS,\n isProviderCredential,\n COLLECTION_LAYERS,\n} from './types';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type {\n // Config\n FlowstackConfig,\n AuthConfig,\n RedisConfig,\n DatabaseConfig,\n // Auth\n User,\n FlowstackCredentials,\n LoginRequest,\n LoginResponse,\n RegisterRequest,\n RegisterResponse,\n GoogleAuthResponse,\n // Session & Workspace\n SessionState,\n WorkspaceInfo,\n CreateWorkspaceRequest,\n // Datasets\n DatasetInfo,\n DatasetPreview,\n ColumnSchema,\n DatasetRow,\n DatasetStreamOptions,\n // Visualizations\n VisualizationData,\n // Reports\n ReportInfo,\n // Models\n ModelInfo,\n // Scripts\n ScriptInfo,\n // Data Sources\n DataSourceType,\n DataSource,\n DataSourceConfig,\n ConnectionTestResult,\n // Chat & Messages\n ChatMessage,\n ToolCall,\n SearchResult,\n SearchResultsData,\n // Streaming\n StreamEvent,\n StreamEventType,\n InterruptInfo,\n DataSourceBadgeInfo,\n // Agent\n AgentTemplate,\n AgentConfig,\n QueryOptions,\n // Usage\n UsageStats,\n UsagePeriod,\n CreditStatus,\n // Hook Returns\n UseAuthReturn,\n UseWorkspaceReturn,\n UseDatasetsReturn,\n UseVisualizationsReturn,\n UseReportsReturn,\n UseModelsReturn,\n UseDataSourcesReturn,\n UseAgentOptions,\n UseAgentReturn,\n UseQueryReturn,\n UseUserManagementReturn,\n // Agents\n AgentInfo,\n UseAgentsReturn,\n // Sites\n PublishedSiteInfo,\n CreateSiteParams,\n UseSitesReturn,\n // Site Versioning\n SiteVersion,\n SiteVersionManifest,\n UseSiteVersionsReturn,\n PublishToGitHubParams,\n PublishToGitHubResult,\n // Provider Credentials\n LLMProvider,\n CredentialPurpose,\n ProviderCredential,\n ProviderModelSettings,\n PurposeInfo,\n // Collection Layers\n CollectionLayer,\n // Ollama\n OllamaLocalModel,\n OllamaStatus,\n // Collection Explorer\n CollectionSchemaInfo,\n UserCollectionInfo,\n // Data Explorer\n UserDataOverview,\n UserDataOverviewWorkspace,\n // GitHub\n GitHubRepo,\n // PII\n PiiSettings,\n PiiEntitySettings,\n PiiRedactedEntity,\n // API\n ApiResponse,\n ListResponse,\n // Context\n FlowstackContextValue,\n // User Management\n UserRole,\n UserStatus,\n UserActivityType,\n ManagedUser,\n UserActivityLog,\n UpdateUserRequest,\n UserStats,\n UserListParams,\n UserListResponse,\n} from './types';\n\n// =============================================================================\n// API Client\n// =============================================================================\n\nexport {\n flowstackFetch,\n listWorkspaces,\n createWorkspace,\n getWorkspace,\n listDatasets,\n getDataset,\n getDatasetPreview,\n deleteDataset,\n listVisualizations,\n listReports,\n listModels,\n listScripts,\n getModel,\n listDataSources,\n createDataSource,\n testDataSource,\n deleteDataSource,\n executeQuery,\n executeQueryWithConfig,\n uploadFile,\n login,\n register,\n googleLogin,\n // User Management\n listUsers,\n getUser,\n updateUser,\n deleteUser,\n suspendUser,\n reactivateUser,\n getUserActivity,\n getUserStats,\n checkAdminPermissions,\n // Conversation History\n getConversationHistory,\n // Agents\n listAgents,\n // Sites\n listSites,\n getSite,\n createSite,\n addSiteFile,\n publishStagedSite,\n deleteSite,\n // Site Versioning\n getSiteVersions,\n promoteSiteVersion,\n deleteSiteVersion,\n // Site Aliases\n setSiteAlias,\n removeSiteAlias,\n // GitHub Publishing\n publishToGitHub,\n // Collections — direct MongoDB CRUD\n insertDocuments,\n updateDocuments,\n deleteDocuments,\n // Private messaging (P0-138)\n listThreads,\n listMessages,\n sendMessage,\n openThread,\n markMessageRead,\n dmPairKey,\n // Direct tool invocation\n invokeTool,\n // GitHub Import\n listGitHubRepos,\n importFromGitHub,\n // PII Settings & Masking\n getPiiSettings,\n updatePiiSettings,\n previewPiiMasking,\n getPiiAllowlist,\n addPiiAllowlistTerm,\n removePiiAllowlistTerm,\n // User Data Explorer\n getUserDataOverview,\n getUserCollections,\n getUserCollectionDocuments,\n getUserCollectionSchema,\n deleteUserCollection,\n exportUserCollection,\n} from './api/client';\n\nexport type {\n FlowstackClientConfig,\n RequestOptions,\n DmMessage,\n DmThread,\n} from './api/client';\n\n// =============================================================================\n// Cache\n// =============================================================================\n\nexport {\n CACHE_TTL,\n getCachedWorkspaces,\n setCachedWorkspaces,\n invalidateWorkspacesCache,\n getCachedDatasets,\n setCachedDatasets,\n invalidateDatasetsCache,\n getCachedVisualizations,\n setCachedVisualizations,\n invalidateVisualizationsCache,\n getCachedReports,\n setCachedReports,\n invalidateReportsCache,\n invalidateWorkspaceArtifacts,\n invalidateAllUserCache,\n getCachedSites,\n setCachedSites,\n invalidateSitesCache,\n getCached,\n setCached,\n deleteCached,\n} from './api/cache';\n\n// =============================================================================\n// Utilities\n// =============================================================================\n\nexport {\n // SSE Parser (browser-safe)\n parseSSELine,\n parseSSEStream,\n processSSEStream,\n // Storage (browser-safe)\n saveCredentials,\n loadCredentials,\n clearCredentials,\n saveSelectedWorkspace,\n loadSelectedWorkspace,\n clearSelectedWorkspace,\n saveMessages,\n loadMessages,\n clearMessages,\n setItem,\n getItem,\n removeItem,\n clearAllFlowstackData,\n // Mermaid utilities (browser-safe)\n sanitizeMermaidCode,\n splitContentSegments,\n} from './utils';\n\nexport type { ContentSegment } from './utils';\n\n// =============================================================================\n// Templates\n// =============================================================================\n\nexport {\n dataScienceTemplate,\n marketingTemplate,\n supportTemplate,\n createCustomTemplate,\n getAgentTemplate,\n} from './templates';\n\n// =============================================================================\n// Agent Factory\n// =============================================================================\n\nexport {\n AgentFactory,\n IntentAnalyzer,\n AgentRegistry,\n DEFAULT_PATTERNS,\n extractEntities,\n analyzeWithRules,\n} from './factory';\n\nexport type {\n DynamicAgentConfig,\n IntentCategory,\n IntentEntity,\n IntentAnalysis,\n IntentPattern,\n RegisteredAgent,\n AgentFactoryOptions,\n IntentAnalyzerOptions,\n AgentRegistryOptions,\n UseIntentAgentOptions,\n UseIntentAgentReturn,\n LLMExecutor,\n} from './factory';\n\n// =============================================================================\n// API Route Generators — SERVER-ONLY\n// =============================================================================\n// createLoginRoute and createRegisterRoute use Node.js crypto + jsonwebtoken.\n// Import them directly: import { createLoginRoute } from 'flowstack-sdk/api/routes'\n// They are NOT exported from the main entry point to keep it browser-safe.\n\nexport type {\n LoginRouteConfig,\n RegisterRouteConfig,\n} from './api/routes';\n\n// =============================================================================\n// Session Locking (P0-75) — stub until full implementation ships\n// =============================================================================\nexport function useCurrentSession() {\n return {\n currentSession: null as { sessionId: string } | null,\n lockStatus: 'available' as 'available' | 'elsewhere' | 'claimed',\n claim: async () => {},\n release: async () => {},\n };\n}\n\n// useConversations is now a real hook — exported from hooks/useConversations.ts via hooks/index.ts\n\n// Real implementations — see hooks/useModelPreference.ts and\n// hooks/useAdminProviderCredentials.ts. Previously these were return-empty\n// stubs whose shape didn't even match what ModelSettingsView consumed, which\n// blanked the Settings → Model page via React's error boundary.\nexport { useModelPreference } from './hooks/useModelPreference';\nexport type { UseModelPreferenceReturn } from './hooks/useModelPreference';\n\nexport { useAdminProviderCredentials } from './hooks/useAdminProviderCredentials';\nexport type { UseAdminProviderCredentialsReturn } from './hooks/useAdminProviderCredentials';\n\nexport type {\n ModelOption,\n ModelPreferenceState,\n AdminProviderCredential,\n ExistingProviderCredential,\n CreateAdminProviderCredentialInput,\n} from './types';\n\nexport { useAutomations } from './hooks/useAutomations';\nexport type { Automation, AutomationRun, CreateAutomationInput, UpdateAutomationInput, UseAutomationsReturn, AutomationOutputConfig, AutomationOutputType, AutomationStatus } from './hooks/useAutomations';\n\nexport { useIntegrations } from './hooks/useIntegrations';\nexport type { Integration, CreateIntegrationInput, UpdateIntegrationInput, UseIntegrationsReturn, IntegrationEndpoint, IntegrationAuthType } from './hooks/useIntegrations';\n\nexport { useLibrary } from './hooks/useLibrary';\nexport type { UseLibraryReturn } from './hooks/useLibrary';\n\nexport function useLibraryConversations() {\n return {\n conversations: [] as LibraryConversationSummary[],\n isLoading: false,\n error: null as string | null,\n refresh: () => {},\n star: async (_id: string) => {},\n unstar: async (_id: string) => {},\n deleteConversation: async (_id: string) => {},\n };\n}\n\nexport function useRecentLibraryConversations(_limit?: number) {\n return {\n items: [] as LibraryConversationSummary[],\n conversations: [] as LibraryConversationSummary[],\n isLoading: false,\n error: null as string | null,\n refresh: () => {},\n };\n}\n\nexport function useLibrarySearch(_options?: string | { limit?: number }) {\n return {\n results: [] as LibraryItem[],\n isLoading: false,\n query: '' as string,\n setQuery: (_q: string) => {},\n error: null as string | null,\n clear: () => {},\n };\n}\n\nexport function useLibraryTrash() {\n return {\n items: [] as TrashedItem[],\n isLoading: false,\n restore: async (_id: string) => {},\n deletePermanently: async (_id: string) => {},\n refresh: () => {},\n };\n}\n\nexport { useSubagents } from './hooks/useSubagents';\n\nexport function useSubagentInvoke() {\n return {\n invoke: async (_id: string, _input: Record<string, unknown>): Promise<SubagentInvokeRun> => ({\n runId: '',\n status: 'pending' as const,\n output: null,\n }),\n isRunning: false,\n error: null as string | null,\n };\n}\n\nexport { getSubagent } from './hooks/useSubagents';\n\nexport async function listLibraryItems(\n credentials: { apiKey: string; tenantId: string; userId: string },\n type: string,\n _options?: { limit?: number },\n config?: { baseUrl?: string },\n): Promise<{ ok: boolean; data?: { total: number | null; items: unknown[] }; error?: string }> {\n const TYPE_PATH: Record<string, string> = {\n dataset: 'datasets', visualization: 'visualizations', code: 'code',\n document: 'documents', report: 'reports', model: 'models',\n };\n const seg = TYPE_PATH[type];\n if (!seg || !credentials?.apiKey) return { ok: false };\n try {\n const base = config?.baseUrl || 'https://sage-api.flowstack.fun';\n const url = new URL(`${base}/library/${seg}`);\n url.searchParams.set('user_id', credentials.userId);\n url.searchParams.set('limit', '1');\n const resp = await fetch(url.toString(), {\n headers: {\n Authorization: `Bearer ${credentials.apiKey}`,\n 'X-Tenant-ID': credentials.tenantId,\n 'X-User-ID': credentials.userId,\n },\n });\n if (!resp.ok) return { ok: false, error: `${resp.status}` };\n const data = await resp.json();\n return { ok: true, data: { total: data.total ?? null, items: data.items ?? [] } };\n } catch (e: any) {\n return { ok: false, error: e.message };\n }\n}\n\n// Automation types now come from ./hooks/useAutomations (real implementation above)\nexport type LibraryItemType = 'dataset' | 'visualization' | 'code' | 'document' | 'report' | 'model' | 'conversation' | 'script';\nexport interface LibraryItem {\n /** Primary display name (from backend \"name\" field) */\n name: string;\n type?: string;\n /** ISO string or Unix epoch (number) */\n created_at?: string | number;\n updated_at?: string | number;\n size_bytes?: number;\n format?: string;\n source_conversation_title_snapshot?: string;\n source?: string;\n // Legacy camelCase aliases kept for compat\n id?: string;\n title?: string;\n createdAt?: string;\n [key: string]: unknown;\n}\nexport type LibraryItemDetail = LibraryItem & { content: string };\nexport type LibraryConversationSummary = {\n id: string;\n conversation_id?: string;\n title: string;\n lastMessageAt?: string;\n last_activity_at?: string;\n first_message_preview?: string;\n last_snippet?: string;\n message_count?: number;\n starred?: boolean;\n};\nexport type TrashedItem = { id: string; type: LibraryItemType; title: string; trashedAt: string };\nexport type SubagentSummary = { id: string; name: string; description: string; source?: string; site_id?: string };\nexport type SubagentDefinition = SubagentSummary & {\n /** snake_case from backend — preferred */\n system_prompt?: string;\n /** camelCase alias — kept for compat */\n systemPrompt?: string;\n tools?: string[];\n model?: string;\n max_turns?: number;\n max_cost_usd?: number;\n created_at?: string;\n};\nexport type SubagentInvokeRun = { runId: string; status: 'pending' | 'running' | 'done' | 'error'; output: string | null };\n\nexport { useConversation } from './hooks/useConversation';\nexport type { UseConversationReturn } from './hooks/useConversation';\n\n// getSubagent is re-exported from hooks/useSubagents above\n"]}
|