@framework-m/desk 0.4.6 → 0.5.1

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/constants.ts","../src/data.ts","../src/auth.ts","../src/live.ts","../src/components/form/templates.tsx","../src/components/form/AutoForm.tsx","../src/components/form/LinkWidget.tsx","../src/components/table/AutoTable.tsx","../src/components/table/EditableCell.tsx","../src/components/feedback/ConfirmDialog.tsx","../src/components/feedback/AlertBanner.tsx","../src/components/table/BulkActionsBar.tsx","../src/components/workflow/StateBadge.tsx","../src/hooks/useWorkflowActions.ts","../src/components/workflow/WorkflowActions.tsx","../src/plugins/registry.ts","../src/plugins/Slot.tsx","../src/components/CommandPalette.tsx","../src/components/menu/index.tsx","../src/components/breadcrumb/index.tsx","../src/components/layout/index.tsx","../src/hooks/useDocTypeMeta.ts","../src/hooks/useDocTypes.ts","../src/hooks/useInlineEdit.ts","../src/hooks/useBulkActions.ts","../src/hooks/useCommandPalette.ts","../src/hooks/useTranslation.ts","../src/hooks/useUIMeta.ts","../src/views/registry.ts","../src/views/KanbanView.tsx","../src/views/CalendarView.tsx","../src/views/GanttView.tsx","../src/views/TreeView.tsx","../src/config/registry.ts","../src/config/useConfig.ts","../src/workspace/WorkspaceSection.tsx","../src/pages/ListView.tsx","../src/pages/FormView.tsx","../src/pages/LoginPage.tsx","../src/authConfig.ts"],"sourcesContent":["/**\n * Framework M Frontend Configuration\n *\n * Configuration is loaded from window.__FRAMEWORK_CONFIG__ if available,\n * otherwise uses same-origin defaults.\n */\n\n// Type definition for global config\ndeclare global {\n interface Window {\n __FRAMEWORK_CONFIG__?: {\n apiBaseUrl?: string;\n metaBaseUrl?: string;\n wsBaseUrl?: string;\n /** Auth configuration */\n auth?: {\n authStrategy?: \"cookie\" | \"oidc\";\n loginUrl?: string;\n oidcConfig?: {\n authority: string;\n clientId: string;\n redirectUri: string;\n };\n oauth?: {\n providers?: string[] | Record<string, unknown>;\n };\n };\n };\n }\n}\n\n/**\n * API endpoints - uses same-origin by default, configurable via window config\n */\nexport const API_URL =\n (typeof globalThis !== \"undefined\" &&\n (globalThis as any).__FRAMEWORK_CONFIG__?.apiBaseUrl) ||\n \"/api/v1\";\n\nexport const META_URL =\n (typeof globalThis !== \"undefined\" &&\n (globalThis as any).__FRAMEWORK_CONFIG__?.metaBaseUrl) ||\n \"/api/meta\";\n\nexport const WS_URL =\n (typeof globalThis !== \"undefined\" &&\n (globalThis as any).__FRAMEWORK_CONFIG__?.wsBaseUrl) ||\n \"/api/v1/stream\";\n","/**\n * Framework M Data Provider for Refine\n *\n * Custom DataProvider implementation that connects to Framework M REST API.\n * Handles CRUD operations, pagination, sorting, and filtering.\n */\n\nimport type {\n BaseRecord,\n CreateParams,\n CreateResponse,\n CustomParams,\n CustomResponse,\n DataProvider,\n DeleteOneParams,\n DeleteOneResponse,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n UpdateParams,\n UpdateResponse,\n} from \"@refinedev/core\";\nimport { API_URL } from \"./constants\";\nimport type { ListResponse } from \"./types\";\n\ninterface ErrorPayload {\n detail?: string;\n message?: string;\n error?: string;\n errors?: unknown;\n}\n\nclass FrameworkApiError extends Error {\n status: number;\n code?: string;\n details?: unknown;\n\n constructor(\n message: string,\n status: number,\n code?: string,\n details?: unknown,\n ) {\n super(message);\n this.name = \"FrameworkApiError\";\n this.status = status;\n this.code = code;\n this.details = details;\n }\n}\n\nfunction buildActionPermissionMessage(\n status: number,\n action: string | undefined,\n resource: string | undefined,\n backendMessage: string | undefined,\n): string {\n const normalizedResource = resource\n ? resource.replace(/_/g, \" \")\n : \"resource\";\n\n if (status === 401) {\n return backendMessage || \"Authentication required. Please log in.\";\n }\n\n if (status === 403) {\n const actionText = action ?? \"perform this action on\";\n const base = `Insufficient permission to ${actionText} ${normalizedResource}.`;\n if (\n backendMessage &&\n !backendMessage.toLowerCase().includes(\"insufficient permission\")\n ) {\n return `${base} ${backendMessage}`;\n }\n return base;\n }\n\n return (\n backendMessage ||\n `Request failed (${status}) while trying to ${action ?? \"access\"} ${normalizedResource}.`\n );\n}\n\n/**\n * Build pagination params\n */\nfunction buildPaginationParams(\n pagination: { current?: number; pageSize?: number } | undefined,\n): URLSearchParams {\n const params = new URLSearchParams();\n if (!pagination) return params;\n\n const current = pagination.current ?? 1;\n const pageSize = pagination.pageSize ?? 20;\n params.set(\"limit\", String(pageSize));\n params.set(\"offset\", String((current - 1) * pageSize));\n return params;\n}\n\n/**\n * Build sorting params\n */\nfunction buildSortingParams(\n sorters: Array<{ field: string; order: string }> | undefined,\n): URLSearchParams {\n const params = new URLSearchParams();\n if (!sorters || sorters.length === 0) return params;\n\n const sorter = sorters[0]; // Framework M supports single sort\n const order = sorter.order === \"desc\" ? \"-\" : \"\";\n params.set(\"order_by\", `${order}${sorter.field}`);\n return params;\n}\n\n/**\n * Convert filter value to string\n */\nfunction filterValueToString(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") return String(value);\n if (typeof value === \"boolean\") return String(value);\n return JSON.stringify(value);\n}\n\n/**\n * Build filter params\n */\nfunction buildFilterParams(\n filters:\n | Array<{ field?: string; operator?: string; value?: unknown }>\n | undefined,\n): URLSearchParams {\n const params = new URLSearchParams();\n if (!filters || filters.length === 0) return params;\n\n for (const filter of filters) {\n if (!(\"field\" in filter) || !filter.field || filter.value === undefined) {\n continue;\n }\n\n const op = filter.operator || \"eq\";\n const valueStr = filterValueToString(filter.value);\n\n if (op === \"eq\") {\n params.set(filter.field, valueStr);\n } else {\n // Framework M uses field[op]=value format\n params.set(`${filter.field}[${op}]`, valueStr);\n }\n }\n return params;\n}\n\n/**\n * Build query string from Refine params\n */\nfunction buildQueryString(params: GetListParams): string {\n const searchParams = new URLSearchParams();\n\n // Pagination\n const paginationParams = buildPaginationParams(\n params.pagination as { current?: number; pageSize?: number } | undefined,\n );\n paginationParams.forEach((value, key) => searchParams.set(key, value));\n\n // Sorting\n const sortingParams = buildSortingParams(params.sorters);\n sortingParams.forEach((value, key) => searchParams.set(key, value));\n\n // Filters\n const filterParams = buildFilterParams(params.filters);\n filterParams.forEach((value, key) => searchParams.set(key, value));\n\n return searchParams.toString();\n}\n\n/**\n * Make a fetch request with credentials (cookies)\n */\nasync function fetchWithCredentials<T>(\n url: string,\n options: RequestInit = {},\n context?: { action?: string; resource?: string },\n): Promise<T> {\n const response = await fetch(url, {\n ...options,\n credentials: \"include\", // Send cookies for auth\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n if (!response.ok) {\n const payload = (await response\n .json()\n .catch(() => ({ detail: response.statusText }))) as ErrorPayload;\n\n const backendMessage =\n (typeof payload.message === \"string\" && payload.message) ||\n (typeof payload.detail === \"string\" && payload.detail) ||\n response.statusText;\n\n const message = buildActionPermissionMessage(\n response.status,\n context?.action,\n context?.resource,\n backendMessage,\n );\n\n throw new FrameworkApiError(\n message,\n response.status,\n typeof payload.error === \"string\" ? payload.error : undefined,\n payload.errors,\n );\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return {} as T;\n }\n\n return response.json();\n}\n\n/**\n * Framework M Data Provider\n */\nexport const frameworkMDataProvider: DataProvider = {\n /**\n * Get a list of resources with pagination, sorting, and filtering\n */\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams,\n ): Promise<GetListResponse<TData>> => {\n const { resource } = params;\n const query = buildQueryString(params);\n const queryString = query ? `?${query}` : \"\";\n const url = `${API_URL}/${resource}${queryString}`;\n\n const response = await fetchWithCredentials<ListResponse<TData>>(\n url,\n {},\n {\n action: \"read\",\n resource,\n },\n );\n\n return {\n data: response.items,\n total: response.total,\n };\n },\n\n /**\n * Get a single resource by ID\n */\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams,\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id } = params;\n const url = `${API_URL}/${resource}/${id}`;\n\n const data = await fetchWithCredentials<TData>(\n url,\n {},\n {\n action: \"read\",\n resource,\n },\n );\n\n return { data };\n },\n\n /**\n * Create a new resource\n */\n create: async <TData extends BaseRecord = BaseRecord, TVariables = object>(\n params: CreateParams<TVariables>,\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables } = params;\n const url = `${API_URL}/${resource}`;\n\n const data = await fetchWithCredentials<TData>(\n url,\n {\n method: \"POST\",\n body: JSON.stringify(variables),\n },\n {\n action: \"create\",\n resource,\n },\n );\n\n return { data };\n },\n\n /**\n * Update an existing resource\n */\n update: async <TData extends BaseRecord = BaseRecord, TVariables = object>(\n params: UpdateParams<TVariables>,\n ): Promise<UpdateResponse<TData>> => {\n const { resource, id, variables } = params;\n const url = `${API_URL}/${resource}/${id}`;\n\n const data = await fetchWithCredentials<TData>(\n url,\n {\n method: \"PUT\",\n body: JSON.stringify(variables),\n },\n {\n action: \"update\",\n resource,\n },\n );\n\n return { data };\n },\n\n /**\n * Delete a resource\n */\n deleteOne: async <TData extends BaseRecord = BaseRecord, TVariables = object>(\n params: DeleteOneParams<TVariables>,\n ): Promise<DeleteOneResponse<TData>> => {\n const { resource, id } = params;\n const url = `${API_URL}/${resource}/${id}`;\n\n await fetchWithCredentials(\n url,\n {\n method: \"DELETE\",\n },\n {\n action: \"delete\",\n resource,\n },\n );\n\n return { data: { id } as TData };\n },\n\n /**\n * Delete multiple resources by IDs\n */\n deleteMany: async <TData extends BaseRecord = BaseRecord>(params: {\n resource: string;\n ids: (string | number)[];\n }): Promise<{ data: TData[] }> => {\n const { resource, ids } = params;\n\n // Delete each item in parallel\n await Promise.all(\n ids.map(\n id =>\n fetchWithCredentials(\n `${API_URL}/${resource}/${id}`,\n {\n method: \"DELETE\",\n },\n {\n action: \"delete\",\n resource,\n },\n ).catch(() => {}), // Ignore individual delete errors\n ),\n );\n\n return { data: ids.map(id => ({ id }) as TData) };\n },\n\n /**\n * Get the API URL (required by Refine)\n */\n getApiUrl: () => API_URL,\n\n /**\n * Custom method for Framework M specific operations\n * e.g., workflow transitions, RPC calls\n */\n custom: async <\n TData extends BaseRecord = BaseRecord,\n TQuery = unknown,\n TPayload = unknown,\n >(\n params: CustomParams<TQuery, TPayload>,\n ): Promise<CustomResponse<TData>> => {\n const { url, method, payload, headers } = params;\n const fullUrl = url.startsWith(\"http\") ? url : `${API_URL}${url}`;\n\n const data = await fetchWithCredentials<TData>(\n fullUrl,\n {\n method: method || \"GET\",\n body: payload ? JSON.stringify(payload) : undefined,\n headers: headers as HeadersInit,\n },\n {\n action: (method || \"GET\").toLowerCase(),\n resource: \"custom endpoint\",\n },\n );\n\n return { data };\n },\n};\n","/**\n * Framework M Auth Provider for Refine\n *\n * Cookie-based authentication that integrates with Framework M's auth endpoints.\n * Uses HttpOnly cookies for secure token storage.\n */\n\nimport type { AuthProvider } from \"@refinedev/core\";\nimport { API_URL } from \"./constants\";\nimport type { UserIdentity } from \"./types\";\n\n/**\n * Framework M Auth Provider\n *\n * Authentication Strategy:\n * - Login: POST /api/v1/auth/login (sets HttpOnly cookie)\n * - Logout: POST /api/v1/auth/logout (clears cookie)\n * - Check: GET /api/v1/auth/me (validates session)\n */\nexport const authProvider: AuthProvider = {\n /**\n * Login with email and password\n */\n login: async ({ email, password }: { email: string; password: string }) => {\n try {\n const response = await fetch(`${API_URL}/auth/login`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\", // Required for cookies\n body: JSON.stringify({ email, password }),\n });\n\n if (response.ok) {\n return {\n success: true,\n redirectTo: \"/\",\n };\n }\n\n const error = await response.json().catch(() => ({\n detail: \"Invalid credentials\",\n }));\n\n const errorMessage =\n error.message || error.detail || \"Invalid email or password\";\n\n return {\n success: false,\n error: {\n name: \"LoginError\",\n message: errorMessage,\n },\n };\n } catch {\n return {\n success: false,\n error: {\n name: \"LoginError\",\n message: \"Network error. Please try again.\",\n },\n };\n }\n },\n\n /**\n * Logout and clear session\n */\n logout: async () => {\n try {\n await fetch(`${API_URL}/auth/logout`, {\n method: \"POST\",\n credentials: \"include\",\n });\n } catch {\n // Ignore logout errors, redirect anyway\n }\n\n return {\n success: true,\n redirectTo: \"/login\",\n };\n },\n\n /**\n * Check if user is authenticated\n */\n check: async () => {\n try {\n const response = await fetch(`${API_URL}/auth/me`, {\n credentials: \"include\",\n });\n\n if (response.ok) {\n return { authenticated: true };\n }\n\n return { authenticated: false, redirectTo: \"/login\" };\n } catch {\n return { authenticated: false, redirectTo: \"/login\" };\n }\n },\n\n /**\n * Get current user identity\n */\n getIdentity: async (): Promise<UserIdentity | null> => {\n try {\n const response = await fetch(`${API_URL}/auth/me`, {\n credentials: \"include\",\n });\n\n if (response.ok) {\n const user: UserIdentity & { authenticated?: boolean } =\n await response.json();\n if (user.authenticated !== true) {\n return null;\n }\n const identityId = String(user.id ?? \"\").toLowerCase();\n const identityName = String(user.name ?? \"\").toLowerCase();\n const identityEmail = String(user.email ?? \"\").toLowerCase();\n if (\n identityId === \"guest\" ||\n identityName === \"guest user\" ||\n identityEmail === \"guest\"\n ) {\n return null;\n }\n return {\n id: user.id,\n email: user.email,\n name: user.name || user.email,\n avatar: user.avatar,\n roles: user.roles || [],\n };\n }\n\n return null;\n } catch {\n return null;\n }\n },\n\n /**\n * Get user permissions (roles)\n */\n getPermissions: async () => {\n try {\n const response = await fetch(`${API_URL}/auth/me`, {\n credentials: \"include\",\n });\n\n if (response.ok) {\n const user: UserIdentity & { authenticated?: boolean } =\n await response.json();\n if (user.authenticated !== true) {\n return null;\n }\n const identityId = String(user.id ?? \"\").toLowerCase();\n const identityName = String(user.name ?? \"\").toLowerCase();\n const identityEmail = String(user.email ?? \"\").toLowerCase();\n if (\n identityId === \"guest\" ||\n identityName === \"guest user\" ||\n identityEmail === \"guest\"\n ) {\n return null;\n }\n return user.roles || [];\n }\n\n return null;\n } catch {\n return null;\n }\n },\n\n /**\n * Handle authentication errors\n */\n onError: async (error: any) => {\n // If 401 Unauthorized, logout and redirect\n if (error.status === 401) {\n return {\n logout: true,\n redirectTo: \"/login\",\n };\n }\n\n // For other errors, just return the error\n return { error };\n },\n};\n","/**\n * Framework M Live Provider for Refine\n *\n * WebSocket-based real-time updates provider.\n * Per checklist 6.1: Refine Live Provider Implementation.\n *\n * Features:\n * - Subscribe to resource changes via WebSocket\n * - Automatic UI updates on created/updated/deleted events\n * - Channel-based pub/sub\n */\n\nimport type { LiveProvider, LiveEvent } from \"@refinedev/core\";\nimport { WS_URL } from \"./constants\";\n\n/**\n * Active WebSocket connections by channel\n */\nconst connections = new Map<string, WebSocket>();\n\n/**\n * Subscription callbacks by channel\n */\nconst subscriptions = new Map<string, Set<(event: LiveEvent) => void>>();\n\n/**\n * Get or create WebSocket connection for a channel\n */\nfunction getConnection(channel: string): WebSocket {\n let ws = connections.get(channel);\n\n if (ws && ws.readyState === WebSocket.OPEN) {\n return ws;\n }\n\n // Create new connection\n let wsUrl = WS_URL;\n if (!WS_URL.startsWith(\"ws\")) {\n const protocol = globalThis.location.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n wsUrl = `${protocol}//${globalThis.location.host}${WS_URL}`;\n }\n\n ws = new WebSocket(`${wsUrl}?channel=${encodeURIComponent(channel)}`);\n\n ws.onopen = () => {\n console.debug(`[LiveProvider] Connected to channel: ${channel}`);\n };\n\n ws.onmessage = event => {\n try {\n const data = JSON.parse(event.data) as LiveEvent;\n\n // Notify all subscribers for this channel\n const callbacks = subscriptions.get(channel);\n if (callbacks) {\n callbacks.forEach(callback => {\n try {\n callback(data);\n } catch (err) {\n console.error(\"[LiveProvider] Callback error:\", err);\n }\n });\n }\n } catch (err) {\n console.error(\"[LiveProvider] Failed to parse message:\", err);\n }\n };\n\n ws.onerror = error => {\n console.error(\n `[LiveProvider] WebSocket error on channel ${channel}:`,\n error,\n );\n };\n\n ws.onclose = () => {\n console.debug(`[LiveProvider] Disconnected from channel: ${channel}`);\n connections.delete(channel);\n };\n\n connections.set(channel, ws);\n return ws;\n}\n\n/**\n * Close connection if no more subscribers\n */\nfunction maybeCloseConnection(channel: string): void {\n const callbacks = subscriptions.get(channel);\n if (!callbacks || callbacks.size === 0) {\n const ws = connections.get(channel);\n if (ws) {\n ws.close();\n connections.delete(channel);\n }\n subscriptions.delete(channel);\n }\n}\n\n/**\n * Framework M Live Provider\n *\n * Implements Refine's LiveProvider interface for real-time updates.\n *\n * @example\n * ```tsx\n * <Refine\n * liveProvider={liveProvider}\n * options={{ liveMode: \"auto\" }}\n * />\n * ```\n */\nexport const liveProvider: LiveProvider = {\n /**\n * Subscribe to resource changes\n */\n subscribe: ({\n channel,\n types,\n callback,\n params,\n }: {\n channel?: string;\n types?: string[];\n callback: (event: LiveEvent) => void;\n params?: { resource?: string };\n }) => {\n // Use resource as channel if not specified\n const channelName = channel ?? params?.resource ?? \"default\";\n\n // Ensure connection exists\n getConnection(channelName);\n\n // Create filtered callback\n const filteredCallback = (event: LiveEvent) => {\n // Filter by types if specified\n if (types && types.length > 0 && !types.includes(event.type)) {\n return;\n }\n\n // Filter by resource if specified\n if (\n params?.resource &&\n event.channel !== params.resource &&\n event.channel !== channelName\n ) {\n return;\n }\n\n callback(event);\n };\n\n // Add to subscriptions\n if (!subscriptions.has(channelName)) {\n subscriptions.set(channelName, new Set());\n }\n subscriptions.get(channelName)!.add(filteredCallback);\n\n // Return unsubscribe function\n return () => {\n const callbacks = subscriptions.get(channelName);\n if (callbacks) {\n callbacks.delete(filteredCallback);\n maybeCloseConnection(channelName);\n }\n };\n },\n\n /**\n * Unsubscribe from resource changes\n */\n unsubscribe: (unsubscribeFn: (() => void) | undefined) => {\n // Call the unsubscribe function returned by subscribe\n if (typeof unsubscribeFn === \"function\") {\n unsubscribeFn();\n }\n },\n\n /**\n * Publish an event (optional, usually server-driven)\n */\n publish: async (event: {\n channel: string;\n type: string;\n payload: unknown;\n }) => {\n const { channel, type, payload } = event;\n\n try {\n // Use REST endpoint to publish (server will broadcast via WebSocket)\n const apiUrl = WS_URL.replace(/^ws/, \"http\").replace(\n \"/stream\",\n \"/live/publish\",\n );\n\n await fetch(apiUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n body: JSON.stringify({ channel, type, payload }),\n });\n } catch (err) {\n console.error(\"[LiveProvider] Failed to publish event:\", err);\n }\n },\n};\n\n/**\n * Close all WebSocket connections\n * Call this on app unmount or logout\n */\nexport function closeAllConnections(): void {\n connections.forEach(ws => {\n ws.close();\n });\n connections.clear();\n subscriptions.clear();\n}\n","/* eslint-disable react-refresh/only-export-components */\n/**\n * Custom RJSF Templates for Framework M\n *\n * Basic templates that can work without shadcn/ui being fully setup.\n * These provide a clean, functional form with native HTML elements.\n * Can be replaced with shadcn/ui components later.\n */\n\nimport type {\n FieldTemplateProps,\n ObjectFieldTemplateProps,\n ArrayFieldTemplateProps,\n BaseInputTemplateProps,\n WidgetProps,\n} from \"@rjsf/utils\";\nimport { isValidElement, useMemo, useState, type ReactNode } from \"react\";\n\ninterface ArrayTemplateItem {\n key: string;\n index: number;\n content: ReactNode;\n canMoveUp: boolean;\n canMoveDown: boolean;\n canRemove: boolean;\n onMove: (targetIndex: number) => void;\n onRemove: () => void;\n}\n\nfunction normalizeArrayItems(\n props: ArrayFieldTemplateProps,\n): ArrayTemplateItem[] {\n return props.items.map((rawItem, fallbackIndex) => {\n const item = rawItem as unknown as {\n key?: string;\n index?: number;\n children?: ReactNode;\n hasMoveUp?: boolean;\n hasMoveDown?: boolean;\n hasRemove?: boolean;\n onReorderClick?: (\n index: number,\n newIndex: number,\n ) => ((event?: { preventDefault?: () => void }) => void) | undefined;\n onDropIndexClick?: (\n index: number,\n ) => ((event?: { preventDefault?: () => void }) => void) | undefined;\n };\n\n const index = item.index ?? fallbackIndex;\n const content =\n item.children ?? (isValidElement(rawItem) ? rawItem : String(rawItem));\n\n return {\n key: item.key ?? String(index),\n index,\n content,\n canMoveUp: Boolean(item.hasMoveUp),\n canMoveDown: Boolean(item.hasMoveDown),\n canRemove: Boolean(item.hasRemove),\n onMove: targetIndex => {\n const handler = item.onReorderClick?.(index, targetIndex);\n if (handler) handler({ preventDefault: () => undefined });\n },\n onRemove: () => {\n const handler = item.onDropIndexClick?.(index);\n if (handler) handler({ preventDefault: () => undefined });\n },\n };\n });\n}\n\n/**\n * Field Template - wraps each field with label and error\n */\nexport function FieldTemplate(props: FieldTemplateProps) {\n const {\n id,\n label,\n required,\n description,\n errors,\n children,\n hidden,\n displayLabel,\n uiSchema,\n formData,\n } = props;\n\n const floatingLabel = Boolean(\n (uiSchema?.[\"ui:options\"] as { floatingLabel?: boolean } | undefined)\n ?.floatingLabel,\n );\n\n const hasValue =\n formData !== null && formData !== undefined && String(formData) !== \"\";\n\n if (hidden) return null;\n\n if (displayLabel && label && floatingLabel) {\n return (\n <div\n className={`form-field form-field-floating${hasValue ? \" is-active\" : \"\"}`}\n style={{ marginBottom: \"1rem\" }}\n >\n {children}\n <label htmlFor={id} className=\"form-floating-label\">\n {label}\n {required && <span style={{ color: \"red\" }}> *</span>}\n </label>\n {description && (\n <div\n style={{\n fontSize: \"0.875rem\",\n color: \"#666\",\n marginTop: \"0.25rem\",\n }}\n >\n {description}\n </div>\n )}\n {errors && (\n <div\n style={{ color: \"red\", fontSize: \"0.875rem\", marginTop: \"0.25rem\" }}\n >\n {errors}\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"form-field\" style={{ marginBottom: \"1rem\" }}>\n {displayLabel && label && (\n <label\n htmlFor={id}\n style={{\n display: \"block\",\n marginBottom: \"0.25rem\",\n fontWeight: 500,\n }}\n >\n {label}\n {required && <span style={{ color: \"red\" }}> *</span>}\n </label>\n )}\n {children}\n {description && (\n <div\n style={{ fontSize: \"0.875rem\", color: \"#666\", marginTop: \"0.25rem\" }}\n >\n {description}\n </div>\n )}\n {errors && (\n <div\n style={{ color: \"red\", fontSize: \"0.875rem\", marginTop: \"0.25rem\" }}\n >\n {errors}\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Object Field Template - renders object properties\n */\nexport function ObjectFieldTemplate(props: ObjectFieldTemplateProps) {\n const { title, description, properties } = props;\n\n return (\n <div className=\"form-object\">\n {title && <h3 style={{ marginBottom: \"1rem\" }}>{title}</h3>}\n {description && (\n <div style={{ marginBottom: \"1rem\", color: \"#666\" }}>{description}</div>\n )}\n <div className=\"form-fields\">{properties.map(prop => prop.content)}</div>\n </div>\n );\n}\n\n/**\n * Array Field Template - renders array items with add/remove\n * Note: RJSF v6 items are ReactElements, not objects with properties\n */\nexport function ArrayFieldTemplate(props: ArrayFieldTemplateProps) {\n const { title, canAdd, onAddClick } = props;\n const extendedProps = props as ArrayFieldTemplateProps & {\n formContext?: {\n replaceArrayField?: (fieldName: string, value: unknown[]) => void;\n };\n name?: string;\n idSchema?: { $id?: string };\n };\n const [detailIndex, setDetailIndex] = useState<number | null>(null);\n const [dragIndex, setDragIndex] = useState<number | null>(null);\n const [pasteText, setPasteText] = useState(\"\");\n const [pasteError, setPasteError] = useState<string | null>(null);\n\n const items = useMemo(() => normalizeArrayItems(props), [props]);\n\n const rawFormData = (props as { formData?: unknown }).formData;\n const rows = Array.isArray(rawFormData) ? rawFormData : [];\n const replaceArray = extendedProps.formContext?.replaceArrayField ?? null;\n const arrayFieldName =\n extendedProps.name ?? extendedProps.idSchema?.$id ?? \"items\";\n\n const applyPaste = () => {\n if (!replaceArray) {\n setPasteError(\n \"Paste requires controlled form data. This form does not expose an array updater.\",\n );\n return;\n }\n\n try {\n const parsed = JSON.parse(pasteText) as unknown;\n if (!Array.isArray(parsed)) {\n setPasteError(\"Pasted value must be a JSON array.\");\n return;\n }\n replaceArray(arrayFieldName, parsed);\n setPasteError(null);\n setPasteText(\"\");\n } catch {\n setPasteError(\n \"Invalid JSON. Paste a JSON array to replace the table rows.\",\n );\n }\n };\n\n return (\n <div className=\"form-array\" style={{ marginBottom: \"1rem\" }}>\n {title && <h4 style={{ marginBottom: \"0.5rem\" }}>{title}</h4>}\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"0.5rem\",\n marginBottom: \"0.75rem\",\n }}\n >\n <button\n type=\"button\"\n onClick={() => {\n void globalThis.navigator.clipboard?.writeText(\n JSON.stringify(rows, null, 2),\n );\n }}\n style={{\n padding: \"0.35rem 0.65rem\",\n borderRadius: \"4px\",\n border: \"1px solid #d0d7de\",\n background: \"#fff\",\n }}\n >\n Copy Rows JSON\n </button>\n <button\n type=\"button\"\n onClick={() => setPasteText(value => (value ? \"\" : \"[]\"))}\n style={{\n padding: \"0.35rem 0.65rem\",\n borderRadius: \"4px\",\n border: \"1px solid #d0d7de\",\n background: \"#fff\",\n }}\n >\n {pasteText ? \"Hide Paste\" : \"Paste Rows JSON\"}\n </button>\n </div>\n\n {pasteText && (\n <div style={{ marginBottom: \"0.75rem\" }}>\n <textarea\n value={pasteText}\n onChange={event => setPasteText(event.target.value)}\n rows={5}\n placeholder='Paste JSON array here, e.g. [{\"item_code\":\"X\"}]'\n style={{ width: \"100%\", marginBottom: \"0.5rem\" }}\n />\n <div style={{ display: \"flex\", gap: \"0.5rem\" }}>\n <button\n type=\"button\"\n onClick={applyPaste}\n style={{\n padding: \"0.35rem 0.65rem\",\n borderRadius: \"4px\",\n border: \"none\",\n background: \"#2563eb\",\n color: \"#fff\",\n }}\n >\n Apply Paste\n </button>\n {pasteError && (\n <span style={{ color: \"#dc2626\", fontSize: \"0.85rem\" }}>\n {pasteError}\n </span>\n )}\n </div>\n </div>\n )}\n\n <div className=\"form-array-items\">\n {items.map((item, index) => (\n <div\n key={item.key}\n style={{\n marginBottom: \"0.5rem\",\n padding: \"0.5rem\",\n border: \"1px solid #ddd\",\n borderRadius: \"4px\",\n }}\n >\n {dragIndex !== null && dragIndex !== index && (\n <button\n type=\"button\"\n onDragOver={event => event.preventDefault()}\n onDrop={() => {\n items[dragIndex]?.onMove(index);\n setDragIndex(null);\n }}\n style={{\n width: \"100%\",\n marginBottom: \"0.5rem\",\n border: \"1px dashed #94a3b8\",\n background: \"#f8fafc\",\n color: \"#334155\",\n borderRadius: \"4px\",\n padding: \"0.35rem\",\n }}\n >\n Drop row here\n </button>\n )}\n\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n marginBottom: \"0.5rem\",\n }}\n >\n <strong style={{ fontSize: \"0.85rem\" }}>Row {index + 1}</strong>\n <div style={{ display: \"flex\", gap: \"0.4rem\" }}>\n <button\n type=\"button\"\n draggable\n aria-label={`Drag row ${index + 1} to reorder`}\n onDragStart={() => setDragIndex(index)}\n >\n Drag\n </button>\n <button\n type=\"button\"\n disabled={!item.canMoveUp}\n onClick={() => item.onMove(index - 1)}\n >\n ↑\n </button>\n <button\n type=\"button\"\n disabled={!item.canMoveDown}\n onClick={() => item.onMove(index + 1)}\n >\n ↓\n </button>\n <button type=\"button\" onClick={() => setDetailIndex(index)}>\n Detail\n </button>\n <button\n type=\"button\"\n disabled={!item.canRemove}\n onClick={item.onRemove}\n >\n Remove\n </button>\n </div>\n </div>\n {detailIndex === index ? (\n <div style={{ color: \"#64748b\", fontSize: \"0.85rem\" }}>\n Row is open in detail mode.\n </div>\n ) : (\n item.content\n )}\n </div>\n ))}\n </div>\n {canAdd && (\n <button\n type=\"button\"\n onClick={onAddClick}\n style={{\n padding: \"0.5rem 1rem\",\n background: \"#4444ff\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n }}\n >\n Add Item\n </button>\n )}\n\n {detailIndex !== null && items[detailIndex] && (\n <div\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 1200,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"1rem\",\n }}\n >\n <button\n type=\"button\"\n aria-label=\"Close detail panel\"\n style={{\n position: \"absolute\",\n inset: 0,\n border: \"none\",\n background: \"rgba(15, 23, 42, 0.45)\",\n padding: 0,\n }}\n onClick={() => setDetailIndex(null)}\n />\n\n <dialog\n open\n style={{\n width: \"min(960px, 100%)\",\n maxHeight: \"90vh\",\n overflow: \"auto\",\n background: \"#fff\",\n borderRadius: \"8px\",\n padding: \"1rem\",\n border: \"1px solid #d0d7de\",\n position: \"relative\",\n margin: 0,\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: \"0.75rem\",\n }}\n >\n <h4 style={{ margin: 0 }}>Row Detail - {detailIndex + 1}</h4>\n <button type=\"button\" onClick={() => setDetailIndex(null)}>\n Close\n </button>\n </div>\n {items[detailIndex].content}\n </dialog>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Base Input Template - standard input wrapper\n */\nexport function BaseInputTemplate(props: BaseInputTemplateProps) {\n const {\n id,\n type,\n value,\n disabled,\n readonly,\n required,\n onChange,\n onBlur,\n onFocus,\n placeholder,\n } = props;\n\n return (\n <input\n id={id}\n type={type || \"text\"}\n value={value ?? \"\"}\n disabled={disabled}\n readOnly={readonly}\n required={required}\n placeholder={placeholder}\n onChange={e => onChange(e.target.value)}\n onBlur={e => onBlur(id, e.target.value)}\n onFocus={e => onFocus(id, e.target.value)}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n fontSize: \"1rem\",\n }}\n />\n );\n}\n\n/**\n * Text Widget - for string fields\n */\nexport function TextWidget(props: WidgetProps) {\n const { id, value, disabled, readonly, onChange, placeholder } = props;\n\n return (\n <input\n id={id}\n type=\"text\"\n value={value ?? \"\"}\n disabled={disabled}\n readOnly={readonly}\n placeholder={placeholder}\n onChange={e => onChange(e.target.value)}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n }}\n />\n );\n}\n\n/**\n * Checkbox Widget - for boolean fields\n */\nexport function CheckboxWidget(props: WidgetProps) {\n const { id, value, disabled, readonly, onChange, label } = props;\n\n return (\n <label style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <input\n id={id}\n type=\"checkbox\"\n checked={value ?? false}\n disabled={disabled || readonly}\n onChange={e => onChange(e.target.checked)}\n style={{ width: \"1rem\", height: \"1rem\" }}\n />\n {label}\n </label>\n );\n}\n\n/**\n * Select Widget - for enum fields\n */\nexport function SelectWidget(props: WidgetProps) {\n const { id, value, disabled, readonly, onChange, options } = props;\n const enumOptions = options.enumOptions || [];\n\n return (\n <select\n id={id}\n value={value ?? \"\"}\n disabled={disabled || readonly}\n onChange={e => onChange(e.target.value)}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n }}\n >\n <option value=\"\">Select...</option>\n {enumOptions.map(opt => (\n <option key={String(opt.value)} value={String(opt.value)}>\n {opt.label}\n </option>\n ))}\n </select>\n );\n}\n\n/**\n * Date Widget - for date fields\n */\nexport function DateWidget(props: WidgetProps) {\n const { id, value, disabled, readonly, onChange } = props;\n\n return (\n <input\n id={id}\n type=\"date\"\n value={value ?? \"\"}\n disabled={disabled}\n readOnly={readonly}\n onChange={e => onChange(e.target.value)}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n }}\n />\n );\n}\n\n/**\n * Textarea Widget - for long text fields\n */\nexport function TextareaWidget(props: WidgetProps) {\n const { id, value, disabled, readonly, onChange, placeholder } = props;\n\n return (\n <textarea\n id={id}\n value={value ?? \"\"}\n disabled={disabled}\n readOnly={readonly}\n placeholder={placeholder}\n onChange={e => onChange(e.target.value)}\n rows={4}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n resize: \"vertical\",\n }}\n />\n );\n}\n\n/**\n * Custom widgets registry\n */\nexport const customWidgets = {\n TextWidget,\n CheckboxWidget,\n SelectWidget,\n DateWidget,\n TextareaWidget,\n};\n\n/**\n * Custom templates registry\n */\nexport const customTemplates = {\n FieldTemplate,\n ObjectFieldTemplate,\n ArrayFieldTemplate,\n BaseInputTemplate,\n};\n","/**\n * AutoForm Component\n *\n * Schema-driven form using RJSF that accepts JSON Schema from\n * /api/meta/{doctype} and renders form fields dynamically.\n *\n * Per checklist section 2.2:\n * - Accepts JSON Schema from GET /api/meta/{doctype}\n * - Generates form fields dynamically\n * - Maps schema types to components\n * - Exported as standalone component (\"Ejection Strategy\")\n */\n\nimport Form from \"@rjsf/core\";\nimport type { FormProps, IChangeEvent } from \"@rjsf/core\";\nimport type { RJSFSchema, UiSchema, ValidatorType } from \"@rjsf/utils\";\nimport validator from \"@rjsf/validator-ajv8\";\nimport { customTemplates, customWidgets } from \"./templates\";\n\ntype JsonObject = Record<string, unknown>;\n\nfunction replaceArrayFieldInData<T>(\n source: T | undefined,\n fieldName: string,\n value: unknown[],\n): T {\n const root = (\n source && typeof source === \"object\"\n ? { ...(source as Record<string, unknown>) }\n : {}\n ) as Record<string, unknown>;\n root[fieldName] = value;\n return root as T;\n}\n\nfunction normalizeNullablePropertySchema(property: JsonObject): JsonObject {\n const normalized: JsonObject = { ...property };\n\n const typeValue = normalized.type;\n if (Array.isArray(typeValue)) {\n const nonNullTypes = typeValue.filter(\n (t): t is string => typeof t === \"string\" && t !== \"null\",\n );\n if (nonNullTypes.length === 1) {\n normalized.type = nonNullTypes[0];\n }\n }\n\n const anyOfValue = normalized.anyOf;\n if (Array.isArray(anyOfValue)) {\n const nonNullSchemas = anyOfValue.filter(item => {\n if (!item || typeof item !== \"object\") return false;\n const schema = item as JsonObject;\n return schema.type !== \"null\";\n });\n\n if (nonNullSchemas.length === 1) {\n const nonNullSchema = nonNullSchemas[0] as JsonObject;\n const merged: JsonObject = {\n ...nonNullSchema,\n ...normalized,\n type: nonNullSchema.type ?? normalized.type,\n };\n delete merged.anyOf;\n return merged;\n }\n }\n\n return normalized;\n}\n\nfunction normalizeNullableObjectSchema(schema: RJSFSchema): RJSFSchema {\n if (!schema || typeof schema !== \"object\") return schema;\n\n const schemaObj = schema as JsonObject;\n const properties = schemaObj.properties;\n if (!properties || typeof properties !== \"object\") {\n return schema;\n }\n\n const normalizedProperties = Object.fromEntries(\n Object.entries(properties as Record<string, unknown>).map(\n ([key, value]) => {\n if (!value || typeof value !== \"object\") return [key, value];\n return [key, normalizeNullablePropertySchema(value as JsonObject)];\n },\n ),\n ) as NonNullable<RJSFSchema[\"properties\"]>;\n\n return {\n ...schema,\n properties: normalizedProperties,\n };\n}\n\n/**\n * AutoForm props\n */\nexport interface AutoFormProps<T = unknown> {\n /** JSON Schema for the form */\n schema: RJSFSchema;\n /** UI Schema for customizing form appearance */\n uiSchema?: UiSchema;\n /** Current form data */\n formData?: T;\n /** Called when form data changes */\n onChange?: (data: T) => void;\n /** Called when form is submitted */\n onSubmit?: (data: T) => void;\n /** Called on validation error */\n onError?: (errors: unknown[]) => void;\n /** Whether form is read-only */\n readonly?: boolean;\n /** Whether form is disabled */\n disabled?: boolean;\n /** Hide submit button */\n hideSubmitButton?: boolean;\n /** Custom submit button text */\n submitText?: string;\n /** Additional className for the form */\n className?: string;\n /** Children to render (e.g., custom buttons) */\n children?: React.ReactNode;\n}\n\n/**\n * AutoForm Component\n *\n * A schema-driven form that accepts JSON Schema and renders fields automatically.\n * Uses RJSF with custom templates.\n *\n * @example\n * ```tsx\n * import { useDocTypeMeta } from \"../hooks\";\n * import { AutoForm } from \"../components/form\";\n *\n * function TaskForm() {\n * const { schema } = useDocTypeMeta(\"Task\");\n * const [data, setData] = useState({});\n *\n * if (!schema) return <Loading />;\n *\n * return (\n * <AutoForm\n * schema={schema}\n * formData={data}\n * onChange={setData}\n * onSubmit={(data) => saveTask(data)}\n * />\n * );\n * }\n * ```\n */\nexport function AutoForm<T = unknown>({\n schema,\n uiSchema,\n formData,\n onChange,\n onSubmit,\n onError,\n readonly = false,\n disabled = false,\n hideSubmitButton = false,\n submitText = \"Submit\",\n className,\n children,\n}: Readonly<AutoFormProps<T>>) {\n const normalizedSchema = normalizeNullableObjectSchema(schema);\n\n // Handle form change\n const handleChange = (e: IChangeEvent<T>) => {\n if (onChange && e.formData !== undefined) {\n onChange(e.formData);\n }\n };\n\n // Handle form submit\n const handleSubmit = (e: IChangeEvent<T>) => {\n if (onSubmit && e.formData !== undefined) {\n onSubmit(e.formData);\n }\n };\n\n const formContext = {\n replaceArrayField: (fieldName: string, value: unknown[]) => {\n if (!onChange) return;\n onChange(replaceArrayFieldInData(formData, fieldName, value));\n },\n };\n\n // Build RJSF props\n const formProps: FormProps<T, RJSFSchema> = {\n schema: normalizedSchema,\n uiSchema: {\n ...uiSchema,\n \"ui:submitButtonOptions\": hideSubmitButton\n ? { norender: true }\n : { submitText },\n },\n formData,\n validator: validator as ValidatorType<T, RJSFSchema>,\n templates: customTemplates,\n widgets: customWidgets,\n formContext,\n readonly,\n disabled,\n onChange: handleChange,\n onSubmit: handleSubmit,\n onError,\n };\n\n return (\n <div className={className}>\n <Form {...formProps}>{children}</Form>\n </div>\n );\n}\n\nexport default AutoForm;\n","/**\n * LinkWidget - Async Search Combobox for Link Fields\n *\n * RJSF widget for \"Link\" type fields that fetches options from API.\n * Implements async search with debouncing.\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport type { WidgetProps } from \"@rjsf/utils\";\nimport { API_URL } from \"../../constants\";\n\n/**\n * Debounce helper\n */\nfunction useDebounce<T>(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n\n return debouncedValue;\n}\n\ninterface LinkOption {\n value: string;\n label: string;\n}\n\n/**\n * LinkWidget - Combobox with async search\n *\n * Uses x-options from schema to determine the linked DocType.\n * Fetches options from /api/v1/{doctype}?q={search}\n *\n * @example\n * Schema:\n * ```json\n * {\n * \"type\": \"string\",\n * \"x-fieldtype\": \"Link\",\n * \"x-options\": \"Customer\"\n * }\n * ```\n */\nexport function LinkWidget(props: WidgetProps) {\n const {\n id,\n value,\n disabled,\n readonly,\n onChange,\n options,\n schema,\n placeholder,\n } = props;\n\n // Get linked DocType from schema options\n const linkedDoctype = (schema as Record<string, unknown>)?.[\"x-options\"] as string \n || (options as Record<string, unknown>)?.options as string \n || \"\";\n\n const [inputValue, setInputValue] = useState(value ?? \"\");\n const [searchResults, setSearchResults] = useState<LinkOption[]>([]);\n const [isOpen, setIsOpen] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n\n const debouncedSearch = useDebounce(inputValue, 300);\n\n // Fetch search results\n const fetchOptions = useCallback(async (search: string) => {\n if (!linkedDoctype) return;\n \n setIsLoading(true);\n try {\n const params = new URLSearchParams();\n if (search) params.set(\"q\", search);\n params.set(\"limit\", \"20\");\n \n const response = await fetch(\n `${API_URL}/${linkedDoctype}?${params}`,\n { credentials: \"include\" }\n );\n \n if (response.ok) {\n const data = await response.json();\n const items = data.items || data;\n setSearchResults(\n items.map((item: Record<string, unknown>) => ({\n value: item.name || item.id,\n label: item.name || item.title || item.id,\n }))\n );\n }\n } catch (error) {\n console.error(\"Link search error:\", error);\n setSearchResults([]);\n } finally {\n setIsLoading(false);\n }\n }, [linkedDoctype]);\n\n // Fetch on debounced search change\n useEffect(() => {\n if (isOpen) {\n fetchOptions(debouncedSearch);\n }\n }, [debouncedSearch, isOpen, fetchOptions]);\n\n // Handle selection\n const handleSelect = (option: LinkOption) => {\n setInputValue(option.label);\n onChange(option.value);\n setIsOpen(false);\n };\n\n // Handle input change\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setInputValue(newValue);\n setIsOpen(true);\n \n // If cleared, clear the value\n if (!newValue) {\n onChange(undefined);\n }\n };\n\n return (\n <div style={{ position: \"relative\" }}>\n <input\n id={id}\n type=\"text\"\n value={inputValue}\n disabled={disabled}\n readOnly={readonly}\n placeholder={placeholder || `Search ${linkedDoctype}...`}\n onChange={handleInputChange}\n onFocus={() => {\n setIsOpen(true);\n fetchOptions(inputValue);\n }}\n onBlur={() => {\n // Delay close to allow click on option\n setTimeout(() => setIsOpen(false), 200);\n }}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n }}\n />\n \n {/* Dropdown */}\n {isOpen && (\n <div\n style={{\n position: \"absolute\",\n top: \"100%\",\n left: 0,\n right: 0,\n zIndex: 1000,\n maxHeight: \"200px\",\n overflowY: \"auto\",\n background: \"white\",\n border: \"1px solid #ccc\",\n borderTop: \"none\",\n borderRadius: \"0 0 4px 4px\",\n boxShadow: \"0 2px 4px rgba(0,0,0,0.1)\",\n }}\n >\n {isLoading ? (\n <div style={{ padding: \"0.5rem\", color: \"#666\" }}>Loading...</div>\n ) : searchResults.length === 0 ? (\n <div style={{ padding: \"0.5rem\", color: \"#666\" }}>No results</div>\n ) : (\n searchResults.map((option) => (\n <div\n key={option.value}\n onClick={() => handleSelect(option)}\n style={{\n padding: \"0.5rem\",\n cursor: \"pointer\",\n background: option.value === value ? \"#e6f2ff\" : \"white\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"#f5f5f5\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \n option.value === value ? \"#e6f2ff\" : \"white\";\n }}\n >\n {option.label}\n </div>\n ))\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport default LinkWidget;\n","/**\n * AutoTable Component\n *\n * Schema-driven table using TanStack Table with Refine's data fetching.\n * Generates columns from metadata with built-in sorting, filtering, pagination.\n *\n * Per checklist section 2.3:\n * - Columns generated from metadata\n * - Sorting, filtering, pagination built-in\n * - Row selection for bulk actions\n */\n\nimport { useMemo, useState } from \"react\";\nimport { useList } from \"@refinedev/core\";\nimport {\n useReactTable,\n getCoreRowModel,\n getSortedRowModel,\n getPaginationRowModel,\n flexRender,\n type ColumnDef,\n type SortingState,\n type RowSelectionState,\n type PaginationState,\n} from \"@tanstack/react-table\";\nimport type { DocTypeSchema, JSONSchemaProperty } from \"../../hooks/types\";\n\n/**\n * AutoTable props\n */\nexport interface AutoTableProps<TData extends object = object> {\n /** Resource name (DocType) */\n resource: string;\n /** Schema for generating columns */\n schema?: DocTypeSchema;\n /** Custom column definitions (overrides schema-generated) */\n columns?: ColumnDef<TData, unknown>[];\n /** Enable row selection */\n enableSelection?: boolean;\n /** Called when selection changes */\n onSelectionChange?: (selectedRows: TData[]) => void;\n /** Called when row is clicked */\n onRowClick?: (row: TData) => void;\n /** Additional className */\n className?: string;\n}\n\n/**\n * Generate column definitions from JSON Schema\n */\nfunction generateColumnsFromSchema<TData extends object>(\n schema: DocTypeSchema,\n): ColumnDef<TData, unknown>[] {\n const columns: ColumnDef<TData, unknown>[] = [];\n\n for (const [key, prop] of Object.entries(schema.properties)) {\n const property: JSONSchemaProperty = prop;\n\n // Skip hidden fields\n if (property[\"x-hidden\"]) continue;\n\n columns.push({\n id: key,\n accessorKey: key,\n header: property.title || key,\n cell: ({ getValue }) => {\n const value = getValue();\n\n // Format based on type\n if (value === null || value === undefined) return \"-\";\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n if (property.format === \"date\" || property.format === \"date-time\") {\n return new Date(value as string).toLocaleDateString();\n }\n return String(value);\n },\n enableSorting: true,\n });\n }\n\n return columns;\n}\n\n/**\n * AutoTable Component\n *\n * Uses Refine's useList for data fetching and TanStack Table for display.\n *\n * @example\n * ```tsx\n * import { useDocTypeMeta } from \"../hooks\";\n * import { AutoTable } from \"../components/table\";\n *\n * function TaskList() {\n * const { schema } = useDocTypeMeta(\"Task\");\n *\n * return (\n * <AutoTable\n * resource=\"Task\"\n * schema={schema}\n * onRowClick={(row) => navigate(`/task/${row.id}`)}\n * />\n * );\n * }\n * ```\n */\nexport function AutoTable<TData extends object = object>({\n resource,\n schema,\n columns: customColumns,\n enableSelection = false,\n onSelectionChange,\n onRowClick,\n className,\n}: Readonly<AutoTableProps<TData>>) {\n // State for table features\n const [sorting, setSorting] = useState<SortingState>([]);\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n const [pagination, setPagination] = useState<PaginationState>({\n pageIndex: 0,\n pageSize: 20,\n });\n\n // Fetch data using Refine's useList\n const { result, query } = useList<TData>({\n resource,\n pagination: {\n pageSize: pagination.pageSize,\n mode: \"server\",\n },\n sorters:\n sorting.length > 0\n ? [{ field: sorting[0].id, order: sorting[0].desc ? \"desc\" : \"asc\" }]\n : undefined,\n });\n\n const tableData = result?.data ?? [];\n const totalCount = result?.total ?? 0;\n const isLoading = query?.isLoading ?? false;\n const queryError = query?.error as Error | null | undefined;\n\n const focusCell = (\n rowIndex: number,\n colIndex: number,\n tableElement: HTMLTableElement,\n ) => {\n const selector = `[data-cell-key=\"${rowIndex}:${colIndex}\"]`;\n const target = tableElement.querySelector<HTMLElement>(selector);\n target?.focus();\n };\n\n const handleCellKeyDown = (\n event: React.KeyboardEvent<HTMLTableCellElement>,\n rowIndex: number,\n colIndex: number,\n ) => {\n const tableElement = event.currentTarget.closest(\"table\");\n if (!tableElement) return;\n\n if (event.key === \"ArrowRight\") {\n event.preventDefault();\n focusCell(rowIndex, colIndex + 1, tableElement);\n }\n\n if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n focusCell(rowIndex, colIndex - 1, tableElement);\n }\n\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n focusCell(rowIndex + 1, colIndex, tableElement);\n }\n\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n focusCell(rowIndex - 1, colIndex, tableElement);\n }\n };\n\n // Generate columns from schema or use custom\n const columns = useMemo(() => {\n if (customColumns) return customColumns;\n if (schema) return generateColumnsFromSchema<TData>(schema);\n return [];\n }, [customColumns, schema]);\n\n // Add selection column if enabled\n const columnsWithSelection = useMemo(() => {\n if (!enableSelection) return columns;\n\n const selectionColumn: ColumnDef<TData, unknown> = {\n id: \"select\",\n header: ({ table }) => (\n <input\n type=\"checkbox\"\n checked={table.getIsAllRowsSelected()}\n onChange={table.getToggleAllRowsSelectedHandler()}\n />\n ),\n cell: ({ row }) => (\n <input\n type=\"checkbox\"\n checked={row.getIsSelected()}\n onChange={row.getToggleSelectedHandler()}\n onClick={e => e.stopPropagation()}\n />\n ),\n enableSorting: false,\n };\n\n return [selectionColumn, ...columns];\n }, [columns, enableSelection]);\n\n // Create TanStack Table instance\n const table = useReactTable({\n data: tableData,\n columns: columnsWithSelection,\n pageCount: Math.ceil(totalCount / pagination.pageSize),\n state: {\n sorting,\n rowSelection,\n pagination,\n },\n // Use 'id' field (UUID) as row identifier, fallback to index\n getRowId: row => {\n const r = row as Record<string, unknown>;\n return String(r.id ?? r.name ?? \"\");\n },\n onSortingChange: setSorting,\n onRowSelectionChange: updater => {\n const newSelection =\n typeof updater === \"function\" ? updater(rowSelection) : updater;\n setRowSelection(newSelection);\n\n // Notify parent of selection change\n // Compute selected rows directly from newSelection and tableData\n // (table.getSelectedRowModel() uses stale state before setRowSelection takes effect)\n if (onSelectionChange) {\n const selectedIds = Object.keys(newSelection).filter(\n key => newSelection[key],\n );\n const selectedRows = tableData.filter(row => {\n const r = row as Record<string, unknown>;\n const rowId = String(r.id ?? r.name ?? \"\");\n return selectedIds.includes(rowId);\n });\n onSelectionChange(selectedRows);\n }\n },\n onPaginationChange: setPagination,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n manualPagination: true,\n manualSorting: true,\n enableRowSelection: enableSelection,\n });\n\n if (isLoading) {\n return <div style={{ padding: \"1rem\" }}>Loading...</div>;\n }\n\n if (queryError) {\n return (\n <div\n style={{\n padding: \"0.75rem 1rem\",\n backgroundColor: \"var(--color-error-bg)\",\n border: \"1px solid var(--color-error-border)\",\n borderRadius: \"4px\",\n color: \"var(--color-error)\",\n }}\n role=\"alert\"\n >\n {queryError.message || `Failed to load ${resource}.`}\n </div>\n );\n }\n\n return (\n <div className={className}>\n {/* Table */}\n <table style={{ width: \"100%\", borderCollapse: \"collapse\" }}>\n <thead>\n {table.getHeaderGroups().map(headerGroup => (\n <tr key={headerGroup.id}>\n {headerGroup.headers.map(header => (\n <th\n key={header.id}\n onClick={\n header.column.getCanSort()\n ? header.column.getToggleSortingHandler()\n : undefined\n }\n style={{\n padding: \"0.75rem\",\n textAlign: \"left\",\n borderBottom: \"2px solid #ddd\",\n cursor: header.column.getCanSort() ? \"pointer\" : \"default\",\n userSelect: \"none\",\n }}\n >\n {flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n {header.column.getIsSorted() && (\n <span style={{ marginLeft: \"0.25rem\" }}>\n {header.column.getIsSorted() === \"asc\" ? \"↑\" : \"↓\"}\n </span>\n )}\n </th>\n ))}\n </tr>\n ))}\n </thead>\n <tbody>\n {table.getRowModel().rows.map((row, rowIndex) => (\n <tr\n key={row.id}\n onClick={() => onRowClick?.(row.original)}\n style={{\n cursor: onRowClick ? \"pointer\" : \"default\",\n borderBottom: \"1px solid #eee\",\n }}\n >\n {row.getVisibleCells().map((cell, colIndex) => (\n <td\n key={cell.id}\n style={{ padding: \"0.75rem\" }}\n tabIndex={0}\n data-cell-key={`${rowIndex}:${colIndex}`}\n onKeyDown={event =>\n handleCellKeyDown(event, rowIndex, colIndex)\n }\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n\n {/* Pagination */}\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginTop: \"1rem\",\n padding: \"0.5rem 0\",\n }}\n >\n <div>\n Page {pagination.pageIndex + 1} of {table.getPageCount() || 1}\n {\" | \"}Total: {totalCount}\n </div>\n <div style={{ display: \"flex\", gap: \"0.5rem\" }}>\n <button\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n style={{\n padding: \"0.5rem 1rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n cursor: table.getCanPreviousPage() ? \"pointer\" : \"not-allowed\",\n opacity: table.getCanPreviousPage() ? 1 : 0.5,\n }}\n >\n Previous\n </button>\n <button\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n style={{\n padding: \"0.5rem 1rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n cursor: table.getCanNextPage() ? \"pointer\" : \"not-allowed\",\n opacity: table.getCanNextPage() ? 1 : 0.5,\n }}\n >\n Next\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nexport default AutoTable;\n","/**\n * Editable Cell Component\n *\n * Inline editable cell for list views.\n * Per checklist 5.2: Inline Editing.\n *\n * Features:\n * - Click cell to edit\n * - Save on blur\n * - Show validation errors\n */\n\nimport { useState, useRef, useEffect, useCallback } from \"react\";\nimport { useUpdate } from \"@refinedev/core\";\n\n/**\n * Editable cell props\n */\nexport interface EditableCellProps {\n /** Resource/DocType name */\n resource: string;\n /** Row ID */\n id: string;\n /** Field name */\n field: string;\n /** Current value */\n value: unknown;\n /** Field type for input */\n type?: \"text\" | \"number\" | \"date\" | \"select\" | \"checkbox\";\n /** Options for select type */\n options?: Array<{ value: string; label: string }>;\n /** Whether editing is disabled */\n disabled?: boolean;\n /** Callback after successful save */\n onSaveSuccess?: () => void;\n /** Custom renderer for display mode */\n renderValue?: (value: unknown) => React.ReactNode;\n}\n\n/**\n * EditableCell Component\n *\n * @example\n * ```tsx\n * <EditableCell\n * resource=\"Customer\"\n * id=\"CUST-001\"\n * field=\"customer_name\"\n * value=\"John Smith\"\n * type=\"text\"\n * />\n * ```\n */\nexport function EditableCell({\n resource,\n id,\n field,\n value,\n type = \"text\",\n options,\n disabled = false,\n onSaveSuccess,\n renderValue,\n}: EditableCellProps) {\n const [isEditing, setIsEditing] = useState(false);\n const [editValue, setEditValue] = useState(value);\n const [error, setError] = useState<string | null>(null);\n\n const inputRef = useRef<HTMLInputElement | HTMLSelectElement>(null);\n const updateMutation = useUpdate();\n\n // Focus input when entering edit mode\n useEffect(() => {\n if (isEditing && inputRef.current) {\n inputRef.current.focus();\n if (inputRef.current instanceof HTMLInputElement) {\n inputRef.current.select();\n }\n }\n }, [isEditing]);\n\n // Reset edit value when prop value changes\n useEffect(() => {\n setEditValue(value);\n }, [value]);\n\n // Enter edit mode\n const handleClick = useCallback(() => {\n if (disabled) return;\n setIsEditing(true);\n setEditValue(value);\n setError(null);\n }, [disabled, value]);\n\n // Cancel edit\n const handleCancel = useCallback(() => {\n setIsEditing(false);\n setEditValue(value);\n setError(null);\n }, [value]);\n\n // Save on blur\n const handleBlur = useCallback(() => {\n if (editValue === value) {\n // No change, just exit edit mode\n setIsEditing(false);\n return;\n }\n\n // Save the value\n updateMutation.mutate(\n {\n resource,\n id,\n values: { [field]: editValue },\n },\n {\n onSuccess: () => {\n setIsEditing(false);\n setError(null);\n onSaveSuccess?.();\n },\n onError: err => {\n setError(err.message || \"Save failed\");\n },\n },\n );\n }, [resource, id, field, editValue, value, updateMutation, onSaveSuccess]);\n\n // Handle key press\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleBlur();\n } else if (e.key === \"Escape\") {\n handleCancel();\n }\n },\n [handleBlur, handleCancel],\n );\n\n // Handle value change\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>) => {\n const newValue =\n type === \"checkbox\"\n ? (e.target as HTMLInputElement).checked\n : type === \"number\"\n ? Number(e.target.value)\n : e.target.value;\n setEditValue(newValue);\n setError(null);\n },\n [type],\n );\n\n const isSaving = updateMutation.mutation.isPending;\n\n // Display mode\n if (!isEditing) {\n return (\n <div\n onClick={handleClick}\n style={{\n padding: \"0.25rem 0.5rem\",\n cursor: disabled ? \"default\" : \"pointer\",\n borderRadius: \"4px\",\n minHeight: \"1.5rem\",\n transition: \"background-color 0.15s\",\n }}\n onMouseEnter={e => {\n if (!disabled) {\n e.currentTarget.style.backgroundColor = \"#f5f5f5\";\n }\n }}\n onMouseLeave={e => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n title={disabled ? undefined : \"Click to edit\"}\n >\n {renderValue\n ? renderValue(value)\n : type === \"checkbox\"\n ? value\n ? \"✓\"\n : \"✗\"\n : String(value ?? \"\")}\n </div>\n );\n }\n\n // Edit mode\n return (\n <div style={{ position: \"relative\" }}>\n {type === \"select\" ? (\n <select\n ref={inputRef as React.RefObject<HTMLSelectElement>}\n value={String(editValue ?? \"\")}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n disabled={isSaving}\n style={{\n width: \"100%\",\n padding: \"0.25rem 0.5rem\",\n border: error\n ? \"1px solid var(--color-error)\"\n : \"1px solid var(--color-primary)\",\n borderRadius: \"4px\",\n outline: \"none\",\n fontSize: \"inherit\",\n backgroundColor: \"var(--color-bg)\",\n color: \"var(--color-text)\",\n }}\n >\n <option value=\"\">-</option>\n {options?.map(opt => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n ) : type === \"checkbox\" ? (\n <input\n ref={inputRef as React.RefObject<HTMLInputElement>}\n type=\"checkbox\"\n checked={Boolean(editValue)}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n disabled={isSaving}\n style={{ cursor: \"pointer\" }}\n />\n ) : (\n <input\n ref={inputRef as React.RefObject<HTMLInputElement>}\n type={type}\n value={String(editValue ?? \"\")}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n disabled={isSaving}\n style={{\n width: \"100%\",\n padding: \"0.25rem 0.5rem\",\n border: error\n ? \"1px solid var(--color-error)\"\n : \"1px solid var(--color-primary)\",\n borderRadius: \"4px\",\n outline: \"none\",\n fontSize: \"inherit\",\n boxSizing: \"border-box\",\n backgroundColor: \"var(--color-bg)\",\n color: \"var(--color-text)\",\n }}\n />\n )}\n\n {/* Error tooltip */}\n {error && (\n <div\n style={{\n position: \"absolute\",\n top: \"100%\",\n left: 0,\n marginTop: \"0.25rem\",\n padding: \"0.25rem 0.5rem\",\n backgroundColor: \"var(--color-error-bg)\",\n border: \"1px solid var(--color-error-border)\",\n borderRadius: \"4px\",\n color: \"var(--color-error)\",\n fontSize: \"0.75rem\",\n whiteSpace: \"nowrap\",\n zIndex: 10,\n }}\n >\n {error}\n </div>\n )}\n\n {/* Saving indicator */}\n {isSaving && (\n <div\n style={{\n position: \"absolute\",\n right: \"0.25rem\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n fontSize: \"0.75rem\",\n color: \"#1890ff\",\n }}\n >\n ...\n </div>\n )}\n </div>\n );\n}\n\nexport default EditableCell;\n","import { useEffect, useMemo } from \"react\";\n\nexport interface ConfirmDialogProps {\n open: boolean;\n title: string;\n message: string;\n confirmLabel?: string;\n cancelLabel?: string;\n destructive?: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport function ConfirmDialog({\n open,\n title,\n message,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n destructive = false,\n onConfirm,\n onCancel,\n}: Readonly<ConfirmDialogProps>) {\n const titleId = useMemo(\n () => `confirm-dialog-title-${title.toLowerCase().replaceAll(\" \", \"-\")}`,\n [title],\n );\n\n useEffect(() => {\n if (!open) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onCancel();\n }\n };\n\n globalThis.addEventListener(\"keydown\", handleKeyDown);\n return () => globalThis.removeEventListener(\"keydown\", handleKeyDown);\n }, [open, onCancel]);\n\n if (!open) return null;\n\n return (\n <dialog\n open\n aria-labelledby={titleId}\n onCancel={event => {\n event.preventDefault();\n onCancel();\n }}\n style={{\n border: \"none\",\n padding: 0,\n background: \"transparent\",\n width: \"100%\",\n maxWidth: \"420px\",\n }}\n >\n <div\n style={{\n width: \"100%\",\n borderRadius: \"8px\",\n border: \"1px solid var(--color-border)\",\n backgroundColor: \"var(--color-bg)\",\n color: \"var(--color-text)\",\n boxShadow: \"0 10px 30px rgba(0, 0, 0, 0.2)\",\n padding: \"1rem\",\n }}\n >\n <h2\n id={titleId}\n style={{ margin: 0, marginBottom: \"0.5rem\", fontSize: \"1.1rem\" }}\n >\n {title}\n </h2>\n <p\n style={{\n margin: 0,\n marginBottom: \"1rem\",\n color: \"var(--color-text-secondary)\",\n }}\n >\n {message}\n </p>\n\n <div\n style={{ display: \"flex\", justifyContent: \"flex-end\", gap: \"0.5rem\" }}\n >\n <button\n type=\"button\"\n onClick={onCancel}\n style={{\n padding: \"0.5rem 0.9rem\",\n borderRadius: \"4px\",\n border: \"1px solid var(--color-border)\",\n backgroundColor: \"var(--color-bg-secondary)\",\n color: \"var(--color-text)\",\n cursor: \"pointer\",\n }}\n >\n {cancelLabel}\n </button>\n <button\n type=\"button\"\n onClick={onConfirm}\n style={{\n padding: \"0.5rem 0.9rem\",\n borderRadius: \"4px\",\n border: \"none\",\n backgroundColor: destructive\n ? \"var(--color-error)\"\n : \"var(--color-primary)\",\n color: \"white\",\n cursor: \"pointer\",\n }}\n >\n {confirmLabel}\n </button>\n </div>\n </div>\n </dialog>\n );\n}\n\nexport default ConfirmDialog;\n","export interface AlertBannerProps {\n message: string;\n variant?: \"info\" | \"error\" | \"success\";\n onDismiss?: () => void;\n}\n\nconst styles: Record<\n NonNullable<AlertBannerProps[\"variant\"]>,\n { border: string; bg: string; text: string }\n> = {\n info: {\n border: \"var(--color-border)\",\n bg: \"var(--color-bg-secondary)\",\n text: \"var(--color-text)\",\n },\n error: {\n border: \"var(--color-error-border)\",\n bg: \"var(--color-error-bg)\",\n text: \"var(--color-error)\",\n },\n success: {\n border: \"var(--color-success-border, var(--color-border))\",\n bg: \"var(--color-success-bg, var(--color-bg-secondary))\",\n text: \"var(--color-success, var(--color-text))\",\n },\n};\n\nexport function AlertBanner({\n message,\n variant = \"info\",\n onDismiss,\n}: Readonly<AlertBannerProps>) {\n const palette = styles[variant];\n const content = (\n <>\n <span>{message}</span>\n {onDismiss && (\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n onClick={onDismiss}\n style={{\n border: \"none\",\n background: \"transparent\",\n color: \"inherit\",\n cursor: \"pointer\",\n fontSize: \"1rem\",\n lineHeight: 1,\n }}\n >\n ×\n </button>\n )}\n </>\n );\n\n const commonStyle = {\n marginBottom: \"1rem\",\n padding: \"0.75rem 1rem\",\n backgroundColor: palette.bg,\n border: `1px solid ${palette.border}`,\n borderRadius: \"4px\",\n color: palette.text,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"0.5rem\",\n } as const;\n\n if (variant === \"error\") {\n return (\n <div role=\"alert\" style={commonStyle}>\n {content}\n </div>\n );\n }\n\n return <output style={commonStyle}>{content}</output>;\n}\n\nexport default AlertBanner;\n","/**\n * BulkActionsBar Component\n *\n * Toolbar for bulk actions when rows are selected.\n * Per checklist 5.3: Bulk Operations.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { ConfirmDialog } from \"../feedback\";\n\n/**\n * BulkActionsBar props\n */\nexport interface BulkActionsBarProps {\n /** Number of selected items */\n selectedCount: number;\n /** Whether action is in progress */\n isLoading?: boolean;\n /** Handle bulk delete */\n onDelete?: () => void;\n /** Handle export as JSON */\n onExportJson?: () => void;\n /** Handle export as CSV */\n onExportCsv?: () => void;\n /** Handle bulk update */\n onBulkUpdate?: (field: string, value: unknown) => void;\n /** Available fields for bulk update */\n updateFields?: Array<{\n name: string;\n label: string;\n options?: Array<{ value: string; label: string }>;\n }>;\n /** Handle clear selection */\n onClear?: () => void;\n}\n\n/**\n * BulkActionsBar Component\n */\nexport function BulkActionsBar({\n selectedCount,\n isLoading = false,\n onDelete,\n onExportJson,\n onExportCsv,\n onBulkUpdate,\n updateFields = [],\n onClear,\n}: Readonly<BulkActionsBarProps>) {\n const [showUpdateMenu, setShowUpdateMenu] = useState(false);\n const [selectedField, setSelectedField] = useState(\"\");\n const [updateValue, setUpdateValue] = useState(\"\");\n const [isDeleteConfirmOpen, setIsDeleteConfirmOpen] = useState(false);\n\n // Handle update submit\n const handleUpdate = useCallback(() => {\n if (selectedField && onBulkUpdate) {\n onBulkUpdate(selectedField, updateValue);\n setShowUpdateMenu(false);\n setSelectedField(\"\");\n setUpdateValue(\"\");\n }\n }, [selectedField, updateValue, onBulkUpdate]);\n\n // Handle delete with confirmation\n const handleDelete = useCallback(() => {\n setIsDeleteConfirmOpen(true);\n }, []);\n\n if (selectedCount === 0) return null;\n\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"1rem\",\n padding: \"0.75rem 1rem\",\n backgroundColor: \"var(--color-bg-secondary)\",\n border: \"1px solid var(--color-border)\",\n borderRadius: \"4px\",\n marginBottom: \"1rem\",\n }}\n >\n {/* Selection count */}\n <span style={{ fontWeight: 500, color: \"var(--color-text)\" }}>\n {selectedCount} selected\n </span>\n\n {/* Actions */}\n <div style={{ display: \"flex\", gap: \"0.5rem\" }}>\n {/* Delete */}\n {onDelete && (\n <button\n onClick={handleDelete}\n disabled={isLoading}\n style={{\n padding: \"0.5rem 1rem\",\n backgroundColor: \"var(--color-error)\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n cursor: isLoading ? \"wait\" : \"pointer\",\n opacity: isLoading ? 0.6 : 1,\n }}\n >\n Delete\n </button>\n )}\n\n {/* Export JSON */}\n {onExportJson && (\n <button\n onClick={onExportJson}\n disabled={isLoading}\n style={buttonStyle}\n >\n Export JSON\n </button>\n )}\n\n {/* Export CSV */}\n {onExportCsv && (\n <button\n onClick={onExportCsv}\n disabled={isLoading}\n style={buttonStyle}\n >\n Export CSV\n </button>\n )}\n\n {/* Bulk Update */}\n {onBulkUpdate && updateFields.length > 0 && (\n <div style={{ position: \"relative\" }}>\n <button\n onClick={() => setShowUpdateMenu(!showUpdateMenu)}\n disabled={isLoading}\n style={buttonStyle}\n >\n Update Field ▼\n </button>\n\n {/* Update dropdown */}\n {showUpdateMenu && (\n <div\n style={{\n position: \"absolute\",\n top: \"100%\",\n left: 0,\n marginTop: \"0.25rem\",\n padding: \"1rem\",\n backgroundColor: \"white\",\n border: \"1px solid #e0e0e0\",\n borderRadius: \"4px\",\n boxShadow: \"0 2px 8px rgba(0,0,0,0.1)\",\n zIndex: 100,\n minWidth: \"200px\",\n }}\n >\n {/* Field select */}\n <select\n value={selectedField}\n onChange={e => setSelectedField(e.target.value)}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n marginBottom: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n }}\n >\n <option value=\"\">Select field...</option>\n {updateFields.map(f => (\n <option key={f.name} value={f.name}>\n {f.label}\n </option>\n ))}\n </select>\n\n {/* Value input */}\n {selectedField && (\n <>\n {updateFields.find(f => f.name === selectedField)\n ?.options ? (\n <select\n value={updateValue}\n onChange={e => setUpdateValue(e.target.value)}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n marginBottom: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n }}\n >\n <option value=\"\">Select value...</option>\n {updateFields\n .find(f => f.name === selectedField)\n ?.options?.map(o => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n ) : (\n <input\n type=\"text\"\n value={updateValue}\n onChange={e => setUpdateValue(e.target.value)}\n placeholder=\"New value\"\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n marginBottom: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n boxSizing: \"border-box\",\n }}\n />\n )}\n\n <button\n onClick={handleUpdate}\n disabled={!updateValue}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n backgroundColor: \"#1890ff\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n cursor: updateValue ? \"pointer\" : \"not-allowed\",\n opacity: updateValue ? 1 : 0.5,\n }}\n >\n Apply\n </button>\n </>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Spacer */}\n <div style={{ flex: 1 }} />\n\n {/* Clear selection */}\n {onClear && (\n <button\n onClick={onClear}\n style={{\n padding: \"0.5rem 1rem\",\n backgroundColor: \"transparent\",\n color: \"#666\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n }}\n >\n Clear\n </button>\n )}\n\n <ConfirmDialog\n open={isDeleteConfirmOpen}\n title=\"Confirm bulk delete\"\n message={`Delete ${selectedCount} selected item(s)? This cannot be undone.`}\n confirmLabel=\"Delete\"\n cancelLabel=\"Cancel\"\n destructive\n onConfirm={() => {\n setIsDeleteConfirmOpen(false);\n onDelete?.();\n }}\n onCancel={() => setIsDeleteConfirmOpen(false)}\n />\n </div>\n );\n}\n\nconst buttonStyle: React.CSSProperties = {\n padding: \"0.5rem 1rem\",\n backgroundColor: \"#f5f5f5\",\n color: \"#333\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n};\n\nexport default BulkActionsBar;\n","/**\n * StateBadge Component\n *\n * Displays the current workflow state as a colored badge.\n * Per checklist 2.4: Show current state badge (e.g., \"Draft\", \"Approved\")\n */\n\nimport type { CSSProperties } from \"react\";\n\n/**\n * State color mapping\n */\nconst STATE_COLORS: Record<string, { bg: string; text: string }> = {\n // Common workflow states\n draft: { bg: \"#e0e0e0\", text: \"#333\" },\n pending: { bg: \"#fff3cd\", text: \"#856404\" },\n submitted: { bg: \"#cce5ff\", text: \"#004085\" },\n approved: { bg: \"#d4edda\", text: \"#155724\" },\n rejected: { bg: \"#f8d7da\", text: \"#721c24\" },\n cancelled: { bg: \"#f5f5f5\", text: \"#666\" },\n completed: { bg: \"#d4edda\", text: \"#155724\" },\n on_hold: { bg: \"#fff3cd\", text: \"#856404\" },\n // Default\n default: { bg: \"#e9ecef\", text: \"#495057\" },\n};\n\n/**\n * Get color for a state\n */\nfunction getStateColor(state: string | undefined): { bg: string; text: string } {\n if (!state) return STATE_COLORS.default;\n \n const normalizedState = state.toLowerCase().replace(/\\s+/g, \"_\");\n return STATE_COLORS[normalizedState] ?? STATE_COLORS.default;\n}\n\n/**\n * StateBadge props\n */\nexport interface StateBadgeProps {\n /** Current workflow state */\n state?: string;\n /** Document status (0=Draft, 1=Submitted, 2=Cancelled) */\n docstatus?: number;\n /** Custom className */\n className?: string;\n /** Custom style */\n style?: CSSProperties;\n}\n\n/**\n * StateBadge Component\n *\n * Displays workflow state as a styled badge.\n *\n * @example\n * ```tsx\n * <StateBadge state=\"Pending Approval\" />\n * <StateBadge state=\"Approved\" />\n * <StateBadge state=\"Draft\" docstatus={0} />\n * ```\n */\nexport function StateBadge({\n state,\n docstatus,\n className,\n style,\n}: StateBadgeProps) {\n // Determine display state\n const displayState = state ?? (docstatus === 0 ? \"Draft\" : docstatus === 1 ? \"Submitted\" : docstatus === 2 ? \"Cancelled\" : undefined);\n \n if (!displayState) return null;\n\n const colors = getStateColor(displayState);\n\n return (\n <span\n className={className}\n style={{\n display: \"inline-block\",\n padding: \"0.25rem 0.75rem\",\n borderRadius: \"9999px\",\n fontSize: \"0.75rem\",\n fontWeight: 500,\n textTransform: \"capitalize\",\n backgroundColor: colors.bg,\n color: colors.text,\n ...style,\n }}\n >\n {displayState}\n </span>\n );\n}\n\nexport default StateBadge;\n","/**\n * useWorkflowActions Hook\n *\n * Fetches available workflow transitions for a document and\n * provides methods to execute transitions.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { API_URL } from \"../constants\";\n\n/**\n * Workflow action (transition) definition\n */\nexport interface WorkflowAction {\n name: string;\n label: string;\n from_state: string;\n to_state: string;\n allowed: boolean;\n reason?: string; // Why not allowed, if applicable\n}\n\n/**\n * Workflow state information\n */\nexport interface WorkflowState {\n current_state: string;\n docstatus: number;\n workflow_name?: string;\n}\n\n/**\n * Workflow actions response from API\n */\ninterface WorkflowActionsResponse {\n state: WorkflowState;\n actions: WorkflowAction[];\n}\n\n/**\n * Return type for useWorkflowActions hook\n */\nexport interface UseWorkflowActionsResult {\n /** Current workflow state */\n state: WorkflowState | undefined;\n /** Available actions for current user */\n actions: WorkflowAction[];\n /** Loading state */\n isLoading: boolean;\n /** Error if fetch failed */\n error: Error | null;\n /** Execute a workflow transition */\n executeAction: (actionName: string) => Promise<void>;\n /** Is an action currently executing */\n isExecuting: boolean;\n /** Refresh actions */\n refetch: () => void;\n}\n\n/**\n * Fetch workflow actions for a document\n */\nasync function fetchWorkflowActions(\n doctype: string,\n id: string\n): Promise<WorkflowActionsResponse> {\n const response = await fetch(\n `${API_URL}/workflow/${doctype}/${id}/actions`,\n { credentials: \"include\" }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch workflow actions: ${response.statusText}`);\n }\n\n return response.json();\n}\n\n/**\n * Execute a workflow transition\n */\nasync function executeTransition(\n doctype: string,\n id: string,\n action: string\n): Promise<void> {\n const response = await fetch(\n `${API_URL}/workflow/${doctype}/${id}/transition`,\n {\n method: \"POST\",\n credentials: \"include\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action }),\n }\n );\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({\n detail: response.statusText,\n }));\n throw new Error(error.detail || `Failed to execute ${action}`);\n }\n}\n\n/**\n * Hook to manage workflow actions for a document\n *\n * @param doctype - The DocType name\n * @param id - The document ID\n * @param options - Additional options\n *\n * @example\n * ```tsx\n * const { state, actions, executeAction, isExecuting } = useWorkflowActions(\"Todo\", todoId);\n *\n * return (\n * <div>\n * <StateBadge state={state?.current_state} />\n * {actions.map(action => (\n * <button\n * key={action.name}\n * onClick={() => executeAction(action.name)}\n * disabled={!action.allowed || isExecuting}\n * >\n * {action.label}\n * </button>\n * ))}\n * </div>\n * );\n * ```\n */\nexport function useWorkflowActions(\n doctype: string,\n id: string | undefined,\n options?: { enabled?: boolean }\n): UseWorkflowActionsResult {\n const queryClient = useQueryClient();\n const [isExecuting, setIsExecuting] = useState(false);\n\n const enabled = Boolean(id) && (options?.enabled ?? true);\n\n const {\n data,\n isLoading,\n error,\n refetch,\n } = useQuery<WorkflowActionsResponse, Error>({\n queryKey: [\"workflow-actions\", doctype, id],\n queryFn: () => fetchWorkflowActions(doctype, id!),\n enabled,\n staleTime: 30 * 1000, // 30 seconds\n });\n\n const executeAction = useCallback(\n async (actionName: string) => {\n if (!id) return;\n\n setIsExecuting(true);\n try {\n await executeTransition(doctype, id, actionName);\n \n // Invalidate queries to refresh state\n await queryClient.invalidateQueries({\n queryKey: [\"workflow-actions\", doctype, id],\n });\n // Also invalidate the document data\n await queryClient.invalidateQueries({\n queryKey: [doctype, id],\n });\n } finally {\n setIsExecuting(false);\n }\n },\n [doctype, id, queryClient]\n );\n\n return {\n state: data?.state,\n actions: data?.actions ?? [],\n isLoading,\n error: error ?? null,\n executeAction,\n isExecuting,\n refetch,\n };\n}\n","/**\n * WorkflowActions Component\n *\n * Renders action buttons for workflow transitions.\n * Per checklist 2.4: Render buttons like \"Submit\", \"Approve\", \"Reject\"\n */\n\nimport type { CSSProperties } from \"react\";\nimport { useWorkflowActions, type WorkflowAction } from \"../../hooks/useWorkflowActions\";\nimport { StateBadge } from \"./StateBadge\";\n\n/**\n * Action button color mapping\n */\nconst ACTION_COLORS: Record<string, { bg: string; text: string; hover: string }> = {\n submit: { bg: \"#007bff\", text: \"white\", hover: \"#0056b3\" },\n approve: { bg: \"#28a745\", text: \"white\", hover: \"#1e7e34\" },\n reject: { bg: \"#dc3545\", text: \"white\", hover: \"#bd2130\" },\n cancel: { bg: \"#6c757d\", text: \"white\", hover: \"#545b62\" },\n hold: { bg: \"#ffc107\", text: \"#212529\", hover: \"#d39e00\" },\n default: { bg: \"#6c757d\", text: \"white\", hover: \"#545b62\" },\n};\n\n/**\n * Get button color for an action\n */\nfunction getActionColor(actionName: string): { bg: string; text: string; hover: string } {\n const normalized = actionName.toLowerCase();\n \n if (normalized.includes(\"submit\")) return ACTION_COLORS.submit;\n if (normalized.includes(\"approve\")) return ACTION_COLORS.approve;\n if (normalized.includes(\"reject\")) return ACTION_COLORS.reject;\n if (normalized.includes(\"cancel\")) return ACTION_COLORS.cancel;\n if (normalized.includes(\"hold\")) return ACTION_COLORS.hold;\n \n return ACTION_COLORS.default;\n}\n\n/**\n * WorkflowActions props\n */\nexport interface WorkflowActionsProps {\n /** DocType name */\n doctype: string;\n /** Document ID */\n id?: string;\n /** Show state badge */\n showState?: boolean;\n /** Callback after successful action */\n onActionComplete?: (action: string) => void;\n /** Custom className */\n className?: string;\n /** Custom style */\n style?: CSSProperties;\n}\n\n/**\n * WorkflowActions Component\n *\n * Fetches and renders workflow action buttons.\n *\n * @example\n * ```tsx\n * // In form header\n * <WorkflowActions\n * doctype=\"Todo\"\n * id={todoId}\n * showState\n * onActionComplete={() => refetch()}\n * />\n * ```\n */\nexport function WorkflowActions({\n doctype,\n id,\n showState = true,\n onActionComplete,\n className,\n style,\n}: WorkflowActionsProps) {\n const {\n state,\n actions,\n isLoading,\n executeAction,\n isExecuting,\n } = useWorkflowActions(doctype, id);\n\n // Handle action click\n const handleAction = async (action: WorkflowAction) => {\n try {\n await executeAction(action.name);\n onActionComplete?.(action.name);\n } catch (error) {\n console.error(\"Workflow action failed:\", error);\n // Could add toast notification here\n }\n };\n\n if (isLoading) {\n return <div style={{ color: \"#666\" }}>Loading workflow...</div>;\n }\n\n // No workflow if no state\n if (!state) {\n return null;\n }\n\n // Filter to only show allowed actions\n const allowedActions = actions.filter((a) => a.allowed);\n\n return (\n <div\n className={className}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n ...style,\n }}\n >\n {/* State Badge */}\n {showState && (\n <StateBadge\n state={state.current_state}\n docstatus={state.docstatus}\n />\n )}\n\n {/* Action Buttons */}\n {allowedActions.map((action) => {\n const colors = getActionColor(action.name);\n \n return (\n <button\n key={action.name}\n onClick={() => handleAction(action)}\n disabled={isExecuting}\n title={action.label}\n style={{\n padding: \"0.5rem 1rem\",\n border: \"none\",\n borderRadius: \"4px\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n cursor: isExecuting ? \"not-allowed\" : \"pointer\",\n opacity: isExecuting ? 0.6 : 1,\n backgroundColor: colors.bg,\n color: colors.text,\n transition: \"background-color 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (!isExecuting) {\n e.currentTarget.style.backgroundColor = colors.hover;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = colors.bg;\n }}\n >\n {isExecuting ? \"...\" : action.label}\n </button>\n );\n })}\n\n {/* Show message if no actions available */}\n {allowedActions.length === 0 && !isLoading && (\n <span style={{ color: \"#666\", fontSize: \"0.875rem\" }}>\n No actions available\n </span>\n )}\n </div>\n );\n}\n\nexport default WorkflowActions;\n","/**\n * Plugin Registry\n *\n * Central registry for Framework M plugins.\n * Per checklist 2.5: No Monkey Patching - Plugins register via app.registerPlugin()\n */\n\nimport type {\n Plugin,\n PluginRegistry,\n FieldRegistration,\n SlotRegistration,\n PageRegistration,\n ResourceRegistration,\n ThemeRegistration,\n} from \"./types\";\n\nfunction isDebugEnabled(): boolean {\n const globalFlag = (globalThis as { __FRAMEWORK_M_DEBUG__?: unknown })\n .__FRAMEWORK_M_DEBUG__;\n if (typeof globalFlag === \"boolean\") {\n return globalFlag;\n }\n if (typeof globalFlag === \"string\") {\n return [\"1\", \"true\", \"yes\", \"on\"].includes(globalFlag.toLowerCase());\n }\n\n const processRef = (\n globalThis as { process?: { env?: Record<string, string | undefined> } }\n ).process;\n const envFlag = processRef?.env?.FRAMEWORK_M_DEBUG;\n if (typeof envFlag === \"string\") {\n return [\"1\", \"true\", \"yes\", \"on\"].includes(envFlag.toLowerCase());\n }\n\n return false;\n}\n\nconst pluginLogger = {\n info(message: string): void {\n if (isDebugEnabled()) {\n console.info(`[DeskPluginRegistry] ${message}`);\n }\n },\n warn(message: string): void {\n if (isDebugEnabled()) {\n console.warn(`[DeskPluginRegistry] ${message}`);\n }\n },\n error(message: string, error?: unknown): void {\n console.error(`[DeskPluginRegistry] ${message}`, error);\n },\n};\n\n/**\n * Global plugin registry instance\n */\nconst registry: PluginRegistry = {\n plugins: new Map(),\n fields: new Map(),\n slots: new Map(),\n pages: new Map(),\n resources: [],\n theme: undefined,\n};\n\n/**\n * Register a plugin with the application\n *\n * @param plugin - Plugin definition\n *\n * @example\n * ```tsx\n * // In custom_app/frontend/index.ts\n * import { registerPlugin } from \"@framework-m/core\";\n * import { StarRating } from \"./components/StarRating\";\n * import { PaymentButton } from \"./components/PaymentButton\";\n *\n * registerPlugin({\n * name: \"custom_app\",\n * version: \"1.0.0\",\n * fields: [\n * { name: \"rating\", component: StarRating, fieldTypes: [\"Rating\"] }\n * ],\n * slots: [\n * { slot: \"form-header\", component: PaymentButton, doctypes: [\"Sales Invoice\"] }\n * ],\n * });\n * ```\n */\nexport function registerPlugin(plugin: Plugin): void {\n // Check for duplicate\n if (registry.plugins.has(plugin.name)) {\n pluginLogger.warn(\n `Plugin \"${plugin.name}\" is already registered. Skipping.`,\n );\n return;\n }\n\n // Register plugin\n registry.plugins.set(plugin.name, plugin);\n\n // Register fields\n if (plugin.fields) {\n for (const field of plugin.fields) {\n registry.fields.set(field.name, field);\n }\n }\n\n // Register slots\n if (plugin.slots) {\n for (const slot of plugin.slots) {\n const existing = registry.slots.get(slot.slot) ?? [];\n existing.push(slot);\n // Sort by priority (higher first)\n existing.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n registry.slots.set(slot.slot, existing);\n }\n }\n\n // Register pages\n if (plugin.pages) {\n for (const page of plugin.pages) {\n const key = `${page.pageType}:${page.doctype}`;\n registry.pages.set(key, page);\n }\n }\n\n // Register resources\n if (plugin.resources) {\n registry.resources.push(...plugin.resources);\n }\n\n // Register theme (last one wins)\n if (plugin.theme) {\n registry.theme = {\n ...registry.theme,\n ...plugin.theme,\n };\n }\n\n // Run init if provided\n if (plugin.init) {\n Promise.resolve(plugin.init()).catch(err => {\n pluginLogger.error(`Plugin \"${plugin.name}\" init failed`, err);\n });\n }\n\n pluginLogger.info(`Plugin \"${plugin.name}\" registered successfully.`);\n}\n\n/**\n * Register a custom field widget\n *\n * @param name - Field name/type\n * @param component - React component for the field\n * @param fieldTypes - Optional field types this widget handles\n *\n * @example\n * ```tsx\n * registerField(\"rating\", StarRating, [\"Rating\"]);\n * ```\n */\nexport function registerField(\n name: string,\n component: FieldRegistration[\"component\"],\n fieldTypes?: string[],\n): void {\n registry.fields.set(name, { name, component, fieldTypes });\n}\n\n/**\n * Register a slot injection\n *\n * @param slot - Slot name\n * @param component - React component to inject\n * @param options - Optional doctypes filter and priority\n *\n * @example\n * ```tsx\n * registerSlot(\"form-header\", PaymentButton, {\n * doctypes: [\"Sales Invoice\"],\n * priority: 10\n * });\n * ```\n */\nexport function registerSlot(\n slot: string,\n component: SlotRegistration[\"component\"],\n options?: { doctypes?: string[]; priority?: number },\n): void {\n const registration: SlotRegistration = {\n slot,\n component,\n ...options,\n };\n\n const existing = registry.slots.get(slot) ?? [];\n existing.push(registration);\n existing.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n registry.slots.set(slot, existing);\n}\n\n/**\n * Register a page override\n *\n * @param pageType - Page type to override\n * @param doctype - DocType or '*' for all\n * @param component - React component for the page\n *\n * @example\n * ```tsx\n * registerPage(\"form\", \"Sales Invoice\", CustomInvoiceForm);\n * ```\n */\nexport function registerPage(\n pageType: PageRegistration[\"pageType\"],\n doctype: string,\n component: PageRegistration[\"component\"],\n): void {\n const key = `${pageType}:${doctype}`;\n registry.pages.set(key, { pageType, doctype, component });\n}\n\n/**\n * Get a registered field widget\n */\nexport function getField(name: string): FieldRegistration | undefined {\n return registry.fields.get(name);\n}\n\n/**\n * Get all slot components for a slot name\n */\nexport function getSlotComponents(\n slotName: string,\n doctype?: string,\n): SlotRegistration[] {\n const slots = registry.slots.get(slotName) ?? [];\n\n // Filter by doctype if specified\n if (doctype) {\n return slots.filter(s => !s.doctypes || s.doctypes.includes(doctype));\n }\n\n return slots;\n}\n\n/**\n * Get a page override\n */\nexport function getPage(\n pageType: string,\n doctype: string,\n): PageRegistration | undefined {\n // Try specific doctype first\n const specific = registry.pages.get(`${pageType}:${doctype}`);\n if (specific) return specific;\n\n // Fall back to wildcard\n return registry.pages.get(`${pageType}:*`);\n}\n\n/**\n * Get all registered resources\n */\nexport function getResources(): ResourceRegistration[] {\n return registry.resources;\n}\n\n/**\n * Get the current theme\n */\nexport function getTheme(): ThemeRegistration | undefined {\n return registry.theme;\n}\n\n/**\n * Get all registered plugins\n */\nexport function getPlugins(): Plugin[] {\n return Array.from(registry.plugins.values());\n}\n\n/**\n * Check if a plugin is registered\n */\nexport function hasPlugin(name: string): boolean {\n return registry.plugins.has(name);\n}\n\n/**\n * Clear all registrations (for testing)\n */\nexport function clearRegistry(): void {\n registry.plugins.clear();\n registry.fields.clear();\n registry.slots.clear();\n registry.pages.clear();\n registry.resources.length = 0;\n registry.theme = undefined;\n}\n","/**\n * Slot Component\n *\n * Renders registered slot components for a named slot.\n * Used for injection points in the UI.\n */\n\nimport { getSlotComponents } from \"./registry\";\nimport type { SlotRegistration, SlotProps } from \"./types\";\n\n/**\n * Slot component props\n */\nexport interface SlotComponentProps extends SlotProps {\n /** Slot name */\n name: string;\n /** Children to render if no slot components */\n children?: React.ReactNode;\n}\n\n/**\n * Slot Component\n *\n * Renders all registered components for a named slot.\n *\n * @example\n * ```tsx\n * // In FormView header\n * <div className=\"form-header\">\n * <h1>{doctype}</h1>\n * <Slot name=\"form-header\" doctype={doctype} data={formData} />\n * </div>\n * ```\n */\nexport function Slot({\n name,\n doctype,\n data,\n id,\n children,\n}: SlotComponentProps) {\n const slotRegistrations = getSlotComponents(name, doctype);\n\n if (slotRegistrations.length === 0) {\n return <>{children}</>;\n }\n\n return (\n <>\n {slotRegistrations.map((registration: SlotRegistration, index: number) => {\n const Component = registration.component;\n return (\n <Component\n key={`${name}-${index}`}\n doctype={doctype}\n data={data}\n id={id}\n />\n );\n })}\n </>\n );\n}\n\nexport default Slot;\n","/**\n * Command Palette Component\n *\n * Global search and command palette with Ctrl+K.\n * Per checklist 6.5: Global Command Palette.\n *\n * Features:\n * - Search DocTypes (navigation)\n * - Search Documents (by title)\n * - Run Commands (e.g., \"New User\")\n */\n\nimport { useState, useEffect, useCallback, useMemo, useRef } from \"react\";\nimport { useGo, useList } from \"@refinedev/core\";\nimport { getResources } from \"../plugins\";\nimport { META_URL } from \"../constants\";\n\n/**\n * Command types\n */\nexport type CommandType = \"doctype\" | \"document\" | \"command\";\n\n/**\n * Command item\n */\nexport interface CommandItem {\n /** Unique ID */\n id: string;\n /** Type of command */\n type: CommandType;\n /** Display label */\n label: string;\n /** Secondary text */\n description?: string;\n /** Icon (emoji) */\n icon?: string;\n /** DocType for document items */\n doctype?: string;\n /** Action to execute */\n action?: () => void;\n}\n\n/**\n * CommandPalette props\n */\nexport interface CommandPaletteProps {\n /** Whether palette is open */\n open: boolean;\n /** Close callback */\n onClose: () => void;\n}\n\n/**\n * Built-in commands\n */\nconst BUILTIN_COMMANDS: CommandItem[] = [\n {\n id: \"cmd-dashboard\",\n type: \"command\",\n label: \"Go to Dashboard\",\n icon: \"🏠\",\n description: \"Open the main dashboard\",\n },\n {\n id: \"cmd-settings\",\n type: \"command\",\n label: \"Settings\",\n icon: \"⚙️\",\n description: \"Open settings\",\n },\n {\n id: \"cmd-logout\",\n type: \"command\",\n label: \"Logout\",\n icon: \"🚪\",\n description: \"Sign out of your account\",\n },\n];\n\n/**\n * CommandPalette Component\n */\nexport function CommandPalette({ open, onClose }: CommandPaletteProps) {\n const [query, setQuery] = useState(\"\");\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [doctypes, setDoctypes] = useState<CommandItem[]>([]);\n const inputRef = useRef<HTMLInputElement>(null);\n const go = useGo();\n\n // Fetch DocTypes for navigation\n useEffect(() => {\n async function fetchDoctypes() {\n try {\n const response = await fetch(`${META_URL}/doctypes`, {\n credentials: \"include\",\n });\n if (response.ok) {\n const data = await response.json();\n const items: CommandItem[] = (data.doctypes ?? [])\n .filter(\n (dt: { api_resource: boolean; show_in_desk: boolean }) =>\n dt.api_resource && dt.show_in_desk,\n )\n .map((dt: { name: string; label?: string }) => ({\n id: `doctype-${dt.name}`,\n type: \"doctype\" as CommandType,\n label: dt.label ?? dt.name,\n description: `Go to ${dt.name}`,\n icon: \"📋\",\n doctype: dt.name,\n }));\n setDoctypes(items);\n }\n } catch {\n // Fallback to registered resources\n const resources = getResources();\n const items: CommandItem[] = resources.map(r => ({\n id: `doctype-${r.name}`,\n type: \"doctype\" as CommandType,\n label: r.label ?? r.name,\n description: `Go to ${r.name}`,\n icon: \"📋\",\n doctype: r.name,\n }));\n setDoctypes(items);\n }\n }\n\n if (open) {\n fetchDoctypes();\n }\n }, [open]);\n\n // Search documents\n const { result: searchResults } = useList({\n resource: \"search\",\n filters:\n query.length >= 2\n ? [{ field: \"q\", operator: \"contains\", value: query }]\n : [],\n pagination: { pageSize: 5 },\n queryOptions: { enabled: open && query.length >= 2 },\n });\n\n // Convert search results to command items\n const documentItems: CommandItem[] = useMemo(() => {\n if (!searchResults?.data) return [];\n return searchResults.data.map(doc => {\n const d = doc as unknown as {\n id?: string;\n name?: string;\n title?: string;\n doctype?: string;\n };\n return {\n id: `doc-${d.id ?? \"unknown\"}`,\n type: \"document\" as CommandType,\n label: d.title ?? d.name ?? String(d.id ?? \"Unknown\"),\n description: d.doctype,\n icon: \"📄\",\n doctype: d.doctype,\n };\n });\n }, [searchResults]);\n\n // \"New X\" commands from DocTypes\n const newCommands: CommandItem[] = useMemo(() => {\n if (query.toLowerCase().startsWith(\"new \")) {\n const searchTerm = query.slice(4).toLowerCase();\n return doctypes\n .filter(dt => dt.label.toLowerCase().includes(searchTerm))\n .slice(0, 5)\n .map(dt => ({\n id: `new-${dt.doctype}`,\n type: \"command\" as CommandType,\n label: `New ${dt.label}`,\n description: `Create a new ${dt.label}`,\n icon: \"➕\",\n doctype: dt.doctype,\n }));\n }\n return [];\n }, [doctypes, query]);\n\n // Filter all items by query\n const filteredItems = useMemo(() => {\n const lowerQuery = query.toLowerCase();\n\n const filtered = [\n ...newCommands,\n ...doctypes.filter(\n dt =>\n dt.label.toLowerCase().includes(lowerQuery) ||\n dt.doctype?.toLowerCase().includes(lowerQuery),\n ),\n ...documentItems,\n ...BUILTIN_COMMANDS.filter(cmd =>\n cmd.label.toLowerCase().includes(lowerQuery),\n ),\n ];\n\n return filtered.slice(0, 10);\n }, [doctypes, documentItems, newCommands, query]);\n\n // Reset selection when results change\n useEffect(() => {\n setSelectedIndex(0);\n }, [filteredItems.length]);\n\n // Focus input when opened\n useEffect(() => {\n if (open && inputRef.current) {\n inputRef.current.focus();\n setQuery(\"\");\n setSelectedIndex(0);\n }\n }, [open]);\n\n // Execute selected command\n const executeCommand = useCallback(\n (item: CommandItem) => {\n onClose();\n\n if (item.type === \"doctype\" && item.doctype) {\n go({ to: `/app/${item.doctype}/list` });\n } else if (item.type === \"document\" && item.doctype) {\n go({\n to: `/app/${item.doctype}/detail/${item.id.replace(\"doc-\", \"\")}`,\n });\n } else if (item.type === \"command\") {\n if (item.id === \"cmd-dashboard\") {\n go({ to: \"/app/dashboard\" });\n } else if (item.id === \"cmd-settings\") {\n go({ to: \"/app/settings\" });\n } else if (item.id === \"cmd-logout\") {\n go({ to: \"/logout\" });\n } else if (item.id.startsWith(\"new-\") && item.doctype) {\n go({ to: `/app/${item.doctype}/new` });\n } else if (item.action) {\n item.action();\n }\n }\n },\n [go, onClose],\n );\n\n // Keyboard navigation\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setSelectedIndex(i => Math.min(i + 1, filteredItems.length - 1));\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setSelectedIndex(i => Math.max(i - 1, 0));\n } else if (e.key === \"Enter\" && filteredItems[selectedIndex]) {\n e.preventDefault();\n executeCommand(filteredItems[selectedIndex]);\n } else if (e.key === \"Escape\") {\n onClose();\n }\n },\n [filteredItems, selectedIndex, executeCommand, onClose],\n );\n\n if (!open) return null;\n\n return (\n <>\n {/* Backdrop */}\n <div\n onClick={onClose}\n style={{\n position: \"fixed\",\n inset: 0,\n backgroundColor: \"rgba(0,0,0,0.7)\",\n zIndex: 1000,\n }}\n />\n\n {/* Palette */}\n <div\n style={{\n position: \"fixed\",\n top: \"15%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: \"100%\",\n maxWidth: \"500px\",\n backgroundColor: \"var(--color-bg)\",\n borderRadius: \"8px\",\n boxShadow: \"var(--shadow-md)\",\n border: \"1px solid var(--color-border)\",\n zIndex: 1001,\n overflow: \"hidden\",\n }}\n >\n {/* Search Input */}\n <div\n style={{\n padding: \"0.75rem\",\n borderBottom: \"1px solid var(--color-border)\",\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n placeholder=\"Search or type a command...\"\n value={query}\n onChange={e => setQuery(e.target.value)}\n onKeyDown={handleKeyDown}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n border: \"none\",\n outline: \"none\",\n fontSize: \"1rem\",\n backgroundColor: \"var(--color-bg)\",\n color: \"var(--color-text)\",\n }}\n />\n </div>\n\n {/* Results */}\n <div style={{ maxHeight: \"300px\", overflow: \"auto\" }}>\n {filteredItems.length === 0 && query && (\n <div\n style={{\n padding: \"1rem\",\n color: \"var(--color-text-secondary)\",\n textAlign: \"center\",\n }}\n >\n No results found\n </div>\n )}\n\n {filteredItems.map((item, idx) => (\n <div\n key={item.id}\n onClick={() => executeCommand(item)}\n onMouseEnter={() => setSelectedIndex(idx)}\n style={{\n padding: \"0.75rem 1rem\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n backgroundColor:\n selectedIndex === idx\n ? \"var(--color-bg-secondary)\"\n : \"var(--color-bg)\",\n }}\n >\n <span style={{ fontSize: \"1.25rem\" }}>{item.icon}</span>\n <div style={{ flex: 1 }}>\n <div style={{ fontWeight: 500, color: \"var(--color-text)\" }}>\n {item.label}\n </div>\n {item.description && (\n <div\n style={{\n fontSize: \"0.75rem\",\n color: \"var(--color-text-secondary)\",\n }}\n >\n {item.description}\n </div>\n )}\n </div>\n <span\n style={{\n fontSize: \"0.65rem\",\n padding: \"0.15rem 0.35rem\",\n backgroundColor: \"var(--color-bg-tertiary)\",\n borderRadius: \"3px\",\n color: \"var(--color-text-secondary)\",\n }}\n >\n {item.type}\n </span>\n </div>\n ))}\n </div>\n\n {/* Footer */}\n <div\n style={{\n padding: \"0.5rem 1rem\",\n borderTop: \"1px solid #e0e0e0\",\n display: \"flex\",\n gap: \"1rem\",\n fontSize: \"0.75rem\",\n color: \"#666\",\n }}\n >\n <span>↑↓ Navigate</span>\n <span>↵ Select</span>\n <span>Esc Close</span>\n </div>\n </div>\n </>\n );\n}\n\nexport default CommandPalette;\n","import { useLogout, useMenu } from \"@refinedev/core\";\nimport { NavLink } from \"react-router\";\n\nexport const Menu = () => {\n const { mutate: logout } = useLogout();\n const { menuItems } = useMenu();\n\n return (\n <nav className=\"menu\">\n <ul>\n {menuItems.map((item) => (\n <li key={item.key}>\n <NavLink to={item.route ?? \"/\"}>{item.label}</NavLink>\n </li>\n ))}\n </ul>\n <button onClick={() => logout()}>Logout</button>\n </nav>\n );\n};\n","import { useBreadcrumb } from \"@refinedev/core\";\nimport { Link } from \"react-router\";\n\nexport const Breadcrumb = () => {\n const { breadcrumbs } = useBreadcrumb();\n\n return (\n <ul className=\"breadcrumb\">\n {breadcrumbs.map((breadcrumb) => {\n return (\n <li key={`breadcrumb-${breadcrumb.label}`}>\n {breadcrumb.href ? (\n <Link to={breadcrumb.href}>{breadcrumb.label}</Link>\n ) : (\n <span>{breadcrumb.label}</span>\n )}\n </li>\n );\n })}\n </ul>\n );\n};\n","import type { PropsWithChildren } from \"react\";\nimport { Breadcrumb } from \"../breadcrumb\";\nimport { Menu } from \"../menu\";\n\nexport const Layout: React.FC<PropsWithChildren> = ({ children }) => {\n return (\n <div className=\"layout\">\n <Menu />\n <div className=\"content\">\n <Breadcrumb />\n <div>{children}</div>\n </div>\n </div>\n );\n};\n","/**\n * useDocTypeMeta Hook\n *\n * Fetches and caches DocType metadata from /api/meta/{doctype}.\n * Uses React Query for aggressive caching.\n */\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { META_URL } from \"../constants\";\nimport type {\n DocTypeMeta,\n DocTypeSchema,\n DocTypePermissions,\n LayoutConfig,\n WorkflowConfig,\n} from \"./types\";\n\n/**\n * Fetch metadata for a DocType\n */\nasync function fetchDocTypeMeta(doctype: string): Promise<DocTypeMeta> {\n const response = await fetch(`${META_URL}/${doctype}`, {\n credentials: \"include\",\n });\n\n if (!response.ok) {\n const payload = (await response\n .json()\n .catch(() => ({ detail: response.statusText }))) as {\n detail?: string;\n message?: string;\n error?: string;\n };\n\n const backendMessage =\n payload.message || payload.detail || response.statusText;\n\n throw new Error(\n `Failed to fetch metadata for ${doctype}: ${backendMessage}`,\n );\n }\n\n return response.json();\n}\n\n/**\n * Return type for useDocTypeMeta hook\n */\nexport interface UseDocTypeMetaResult {\n /** JSON Schema for the DocType */\n schema: DocTypeSchema | undefined;\n /** Layout configuration for form rendering */\n layout: LayoutConfig | undefined;\n /** Permissions for current user */\n permissions: DocTypePermissions | undefined;\n /** Workflow configuration if applicable */\n workflow: WorkflowConfig | undefined;\n /** Full metadata object */\n meta: DocTypeMeta | undefined;\n /** Loading state */\n isLoading: boolean;\n /** Error if fetch failed */\n error: Error | null;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * Hook to fetch and cache DocType metadata\n *\n * @param doctype - Name of the DocType to fetch metadata for\n * @returns Metadata including schema, layout, permissions, and workflow\n *\n * @example\n * ```tsx\n * const { schema, layout, permissions, workflow } = useDocTypeMeta(\"Todo\");\n *\n * if (isLoading) return <Spinner />;\n * if (!permissions?.read) return <AccessDenied />;\n *\n * return <AutoForm schema={schema} layout={layout} />;\n * ```\n */\nexport function useDocTypeMeta(doctype: string): UseDocTypeMetaResult {\n const {\n data: meta,\n isLoading,\n error,\n refetch,\n } = useQuery<DocTypeMeta, Error>({\n queryKey: [\"doctype-meta\", doctype],\n queryFn: () => fetchDocTypeMeta(doctype),\n // Cache metadata aggressively - it rarely changes\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 30 * 60 * 1000, // 30 minutes (formerly cacheTime)\n // Only fetch when doctype is provided\n enabled: Boolean(doctype),\n });\n\n return {\n schema: meta?.schema,\n layout: meta?.layout,\n permissions: meta?.permissions,\n workflow: meta?.workflow,\n meta,\n isLoading,\n error: error ?? null,\n refetch,\n };\n}\n\n/**\n * Hook to prefetch DocType metadata\n *\n * Useful for preloading metadata before navigation\n */\nexport function usePrefetchDocTypeMeta() {\n // Using a dummy query to access the query system\n useQuery({\n queryKey: [\"prefetch-helper\"],\n queryFn: () => null,\n enabled: false,\n });\n\n return {\n prefetch: (doctype: string) => {\n // Access queryClient from context would be better,\n // but this works for simple prefetching\n fetchDocTypeMeta(doctype).catch(() => {\n // Silently fail prefetch\n });\n },\n };\n}\n","/**\n * useDocTypes Hook\n *\n * Fetches DocTypes from the backend API and converts them to Refine resources.\n * Used to dynamically populate the sidebar with available DocTypes.\n */\n\nimport { useState, useEffect } from \"react\";\n\n/**\n * DocType metadata from API\n */\nexport interface DocTypeMeta {\n name: string;\n module: string;\n label: string;\n is_child_table: boolean;\n api_resource: boolean;\n show_in_desk: boolean; // Whether to show in Desk UI\n}\n\n/**\n * Refine resource configuration\n */\nexport interface RefineResource {\n name: string;\n list?: string;\n create?: string;\n edit?: string;\n show?: string;\n meta?: {\n label?: string;\n canDelete?: boolean;\n };\n}\n\n/**\n * Hook return type\n */\nexport interface UseDocTypesResult {\n /** Array of DocType metadata */\n doctypes: DocTypeMeta[];\n /** Array of Refine resources for dynamic routing */\n resources: RefineResource[];\n /** Loading state */\n isLoading: boolean;\n /** Error state */\n error: Error | null;\n /** Refetch function */\n refetch: () => Promise<void>;\n}\n\n/**\n * API response format\n */\ninterface DocTypesResponse {\n doctypes: DocTypeMeta[];\n count: number;\n}\n\n/**\n * Fetch DocTypes from Backend API\n *\n * Fetches all registered DocTypes from /api/meta/doctypes and converts\n * them to Refine resource format for use in the application.\n *\n * @returns Object containing doctypes, resources, loading state, and error\n *\n * @example\n * ```tsx\n * const { resources, isLoading, error } = useDocTypes();\n *\n * if (isLoading) return <Spinner />;\n *\n * return <Refine resources={resources}>...</Refine>;\n * ```\n */\nexport function useDocTypes(): UseDocTypesResult {\n const [doctypes, setDocTypes] = useState<DocTypeMeta[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchDocTypes = async () => {\n try {\n setIsLoading(true);\n setError(null);\n\n const response = await fetch(\"/api/meta/doctypes\");\n\n if (!response.ok) {\n throw new Error(`Failed to fetch DocTypes: ${response.statusText}`);\n }\n\n const data: DocTypesResponse = await response.json();\n setDocTypes(data.doctypes);\n } catch (err) {\n console.error(\"Error fetching DocTypes:\", err);\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setIsLoading(false);\n }\n };\n\n useEffect(() => {\n fetchDocTypes();\n }, []);\n\n // Convert DocTypes to Refine resources\n const resources: RefineResource[] = doctypes\n .filter(dt => dt.api_resource && dt.show_in_desk) // Only visible DocTypes with CRUD APIs\n .map(dt => ({\n name: dt.name,\n list: `/app/${dt.name}/list`,\n create: `/app/${dt.name}/new`,\n edit: `/app/${dt.name}/edit/:id`,\n show: `/app/${dt.name}/detail/:id`,\n meta: {\n label: dt.label,\n canDelete: true,\n },\n }));\n\n return {\n doctypes,\n resources,\n isLoading,\n error,\n refetch: fetchDocTypes,\n };\n}\n\nexport default useDocTypes;\n","/**\n * useInlineEdit Hook\n *\n * Hook for managing inline edit state in tables.\n * Per checklist 5.2: Inline Editing.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { useUpdate } from \"@refinedev/core\";\n\n/**\n * Cell being edited\n */\nexport interface EditingCell {\n rowId: string;\n field: string;\n originalValue: unknown;\n}\n\n/**\n * Hook options\n */\nexport interface UseInlineEditOptions {\n /** Resource/DocType name */\n resource: string;\n /** Callback after successful save */\n onSaveSuccess?: () => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\n/**\n * Hook return type\n */\nexport interface UseInlineEditReturn {\n /** Currently editing cell */\n editingCell: EditingCell | null;\n /** Start editing a cell */\n startEdit: (rowId: string, field: string, value: unknown) => void;\n /** Cancel current edit */\n cancelEdit: () => void;\n /** Save current edit */\n saveEdit: (value: unknown) => Promise<void>;\n /** Check if a cell is being edited */\n isEditing: (rowId: string, field: string) => boolean;\n /** Whether save is in progress */\n isSaving: boolean;\n /** Current error */\n error: string | null;\n}\n\n/**\n * useInlineEdit Hook\n *\n * @example\n * ```tsx\n * const { editingCell, startEdit, saveEdit, isEditing, isSaving } = useInlineEdit({\n * resource: \"Customer\",\n * onSaveSuccess: () => refetch(),\n * });\n *\n * // In table cell\n * {isEditing(row.id, \"name\") ? (\n * <input onBlur={(e) => saveEdit(e.target.value)} />\n * ) : (\n * <div onClick={() => startEdit(row.id, \"name\", row.name)}>{row.name}</div>\n * )}\n * ```\n */\nexport function useInlineEdit({\n resource,\n onSaveSuccess,\n onError,\n}: UseInlineEditOptions): UseInlineEditReturn {\n const [editingCell, setEditingCell] = useState<EditingCell | null>(null);\n const [error, setError] = useState<string | null>(null);\n \n const updateMutation = useUpdate();\n\n const startEdit = useCallback((rowId: string, field: string, value: unknown) => {\n setEditingCell({ rowId, field, originalValue: value });\n setError(null);\n }, []);\n\n const cancelEdit = useCallback(() => {\n setEditingCell(null);\n setError(null);\n }, []);\n\n const saveEdit = useCallback(async (value: unknown) => {\n if (!editingCell) return;\n\n // Skip if value unchanged\n if (value === editingCell.originalValue) {\n setEditingCell(null);\n return;\n }\n\n return new Promise<void>((resolve, reject) => {\n updateMutation.mutate(\n {\n resource,\n id: editingCell.rowId,\n values: { [editingCell.field]: value },\n },\n {\n onSuccess: () => {\n setEditingCell(null);\n setError(null);\n onSaveSuccess?.();\n resolve();\n },\n onError: (err) => {\n const errorMsg = err.message || \"Save failed\";\n setError(errorMsg);\n onError?.(new Error(errorMsg));\n reject(new Error(errorMsg));\n },\n }\n );\n });\n }, [editingCell, resource, updateMutation, onSaveSuccess, onError]);\n\n const isEditing = useCallback((rowId: string, field: string) => {\n return editingCell?.rowId === rowId && editingCell?.field === field;\n }, [editingCell]);\n\n const isSaving = updateMutation.mutation.isPending;\n\n return {\n editingCell,\n startEdit,\n cancelEdit,\n saveEdit,\n isEditing,\n isSaving,\n error,\n };\n}\n","/**\n * useBulkActions Hook\n *\n * Hook for managing bulk operations on table rows.\n * Per checklist 5.3: Bulk Operations.\n */\n\nimport { useState, useCallback, useMemo } from \"react\";\nimport { useDeleteMany, useUpdateMany } from \"@refinedev/core\";\n\n/**\n * Row item type\n */\nexport interface BulkItem {\n id: string;\n [key: string]: unknown;\n}\n\n/**\n * Hook options\n */\nexport interface UseBulkActionsOptions<T extends BulkItem = BulkItem> {\n /** Resource/DocType name */\n resource: string;\n /** All available items */\n items: T[];\n /** Callback after successful bulk action */\n onSuccess?: () => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\n/**\n * Hook return type\n */\nexport interface UseBulkActionsReturn<T extends BulkItem = BulkItem> {\n /** Selected row IDs */\n selectedIds: Set<string>;\n /** Selected items */\n selectedItems: T[];\n /** Number of selected items */\n selectedCount: number;\n /** Whether all items are selected */\n isAllSelected: boolean;\n /** Whether some items are selected */\n isSomeSelected: boolean;\n /** Select a single row */\n selectRow: (id: string) => void;\n /** Deselect a single row */\n deselectRow: (id: string) => void;\n /** Toggle a single row */\n toggleRow: (id: string) => void;\n /** Select all rows */\n selectAll: () => void;\n /** Deselect all rows */\n deselectAll: () => void;\n /** Toggle all rows */\n toggleAll: () => void;\n /** Check if a row is selected */\n isSelected: (id: string) => boolean;\n /** Bulk delete selected rows */\n bulkDelete: () => Promise<void>;\n /** Bulk update selected rows */\n bulkUpdate: (values: Record<string, unknown>) => Promise<void>;\n /** Export selected rows as JSON */\n exportAsJson: () => void;\n /** Export selected rows as CSV */\n exportAsCsv: (fields: string[]) => void;\n /** Whether bulk action is in progress */\n isLoading: boolean;\n}\n\n/**\n * useBulkActions Hook\n *\n * @example\n * ```tsx\n * const {\n * selectedIds, toggleRow, toggleAll, isAllSelected,\n * bulkDelete, bulkUpdate, exportAsCsv\n * } = useBulkActions({\n * resource: \"Customer\",\n * items: data,\n * onSuccess: () => refetch(),\n * });\n * ```\n */\nexport function useBulkActions<T extends BulkItem = BulkItem>({\n resource,\n items,\n onSuccess,\n onError,\n}: UseBulkActionsOptions<T>): UseBulkActionsReturn<T> {\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n\n const deleteMutation = useDeleteMany();\n const updateMutation = useUpdateMany();\n\n // Derived state\n const selectedItems = useMemo(\n () => items.filter((item) => selectedIds.has(item.id)),\n [items, selectedIds]\n );\n\n const selectedCount = selectedIds.size;\n const isAllSelected = items.length > 0 && selectedIds.size === items.length;\n const isSomeSelected = selectedIds.size > 0 && selectedIds.size < items.length;\n\n // Selection actions\n const selectRow = useCallback((id: string) => {\n setSelectedIds((prev) => new Set(prev).add(id));\n }, []);\n\n const deselectRow = useCallback((id: string) => {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n const toggleRow = useCallback((id: string) => {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }, []);\n\n const selectAll = useCallback(() => {\n setSelectedIds(new Set(items.map((item) => item.id)));\n }, [items]);\n\n const deselectAll = useCallback(() => {\n setSelectedIds(new Set());\n }, []);\n\n const toggleAll = useCallback(() => {\n if (isAllSelected) {\n deselectAll();\n } else {\n selectAll();\n }\n }, [isAllSelected, selectAll, deselectAll]);\n\n const isSelected = useCallback((id: string) => selectedIds.has(id), [selectedIds]);\n\n // Bulk delete\n const bulkDelete = useCallback(async () => {\n if (selectedIds.size === 0) return;\n\n return new Promise<void>((resolve, reject) => {\n deleteMutation.mutate(\n {\n resource,\n ids: Array.from(selectedIds),\n },\n {\n onSuccess: () => {\n deselectAll();\n onSuccess?.();\n resolve();\n },\n onError: (err) => {\n onError?.(new Error(err.message || \"Delete failed\"));\n reject(err);\n },\n }\n );\n });\n }, [resource, selectedIds, deleteMutation, deselectAll, onSuccess, onError]);\n\n // Bulk update\n const bulkUpdate = useCallback(async (values: Record<string, unknown>) => {\n if (selectedIds.size === 0) return;\n\n return new Promise<void>((resolve, reject) => {\n updateMutation.mutate(\n {\n resource,\n ids: Array.from(selectedIds),\n values,\n },\n {\n onSuccess: () => {\n deselectAll();\n onSuccess?.();\n resolve();\n },\n onError: (err) => {\n onError?.(new Error(err.message || \"Update failed\"));\n reject(err);\n },\n }\n );\n });\n }, [resource, selectedIds, updateMutation, deselectAll, onSuccess, onError]);\n\n // Export as JSON\n const exportAsJson = useCallback(() => {\n const data = JSON.stringify(selectedItems, null, 2);\n const blob = new Blob([data], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `${resource}_export.json`;\n a.click();\n URL.revokeObjectURL(url);\n }, [resource, selectedItems]);\n\n // Export as CSV\n const exportAsCsv = useCallback((fields: string[]) => {\n const header = fields.join(\",\");\n const rows = selectedItems.map((item) =>\n fields.map((f) => {\n const val = item[f];\n if (val === null || val === undefined) return \"\";\n const str = String(val);\n // Escape quotes and wrap in quotes if contains comma\n if (str.includes(\",\") || str.includes('\"') || str.includes(\"\\n\")) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n return str;\n }).join(\",\")\n );\n const csv = [header, ...rows].join(\"\\n\");\n const blob = new Blob([csv], { type: \"text/csv\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `${resource}_export.csv`;\n a.click();\n URL.revokeObjectURL(url);\n }, [resource, selectedItems]);\n\n const isLoading = deleteMutation.mutation.isPending || updateMutation.mutation.isPending;\n\n return {\n selectedIds,\n selectedItems,\n selectedCount,\n isAllSelected,\n isSomeSelected,\n selectRow,\n deselectRow,\n toggleRow,\n selectAll,\n deselectAll,\n toggleAll,\n isSelected,\n bulkDelete,\n bulkUpdate,\n exportAsJson,\n exportAsCsv,\n isLoading,\n };\n}\n","/**\n * useCommandPalette Hook\n *\n * Hook for managing global command palette state and keyboard shortcut.\n * Per checklist 6.5: Global Command Palette.\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\n\n/**\n * Hook return type\n */\nexport interface UseCommandPaletteReturn {\n /** Whether palette is open */\n isOpen: boolean;\n /** Open the palette */\n open: () => void;\n /** Close the palette */\n close: () => void;\n /** Toggle the palette */\n toggle: () => void;\n}\n\n/**\n * useCommandPalette Hook\n *\n * Listens for Ctrl+K (or Cmd+K on Mac) to toggle command palette.\n *\n * @example\n * ```tsx\n * const { isOpen, close } = useCommandPalette();\n *\n * return <CommandPalette open={isOpen} onClose={close} />;\n * ```\n */\nexport function useCommandPalette(): UseCommandPaletteReturn {\n const [isOpen, setIsOpen] = useState(false);\n\n const open = useCallback(() => setIsOpen(true), []);\n const close = useCallback(() => setIsOpen(false), []);\n const toggle = useCallback(() => setIsOpen((prev) => !prev), []);\n\n // Listen for Ctrl+K / Cmd+K\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Ctrl+K on Windows/Linux, Cmd+K on Mac\n if ((e.ctrlKey || e.metaKey) && e.key === \"k\") {\n e.preventDefault();\n toggle();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [toggle]);\n\n return {\n isOpen,\n open,\n close,\n toggle,\n };\n}\n","import { useTranslation as useI18nTranslation } from \"react-i18next\";\n\n/**\n * Return type for useTranslation hook\n */\nexport interface UseTranslationResult {\n /** Translate a key with optional interpolation values */\n t: (key: string, options?: Record<string, unknown>) => string;\n /** Current language code (e.g., \"en\", \"hi\", \"ta\") */\n language: string;\n /** Change the current language */\n changeLanguage: (lng: string) => Promise<void>;\n /** Available languages */\n languages: readonly string[];\n /** Whether translations are ready/loaded */\n ready: boolean;\n}\n\n/**\n * Custom hook wrapper for react-i18next's useTranslation.\n *\n * Provides translation functions with app-specific defaults and utilities.\n *\n * @param namespace - Translation namespace (default: \"common\")\n * @returns Translation functions and state\n *\n * @example\n * ```tsx\n * const { t } = useTranslation();\n *\n * // Basic translation\n * <h1>{t(\"Welcome\")}</h1>\n *\n * // With interpolation\n * <p>{t(\"Hello, {{name}}!\", { name: \"John\" })}</p>\n * ```\n */\nexport function useTranslation(namespace = \"common\"): UseTranslationResult {\n const { t, i18n, ready } = useI18nTranslation(namespace);\n\n return {\n t: t as (key: string, options?: Record<string, unknown>) => string,\n language: i18n.language,\n changeLanguage: (lng: string) => i18n.changeLanguage(lng) as unknown as Promise<void>,\n languages: i18n.languages,\n ready,\n };\n}\n","/**\n * UIMeta — Unified UI Metadata hook for Framework M.\n *\n * Fetches and caches the UIMeta for a DocType from the backend API.\n * UIMeta is a single object that encapsulates form layout, list columns,\n * and additional view configurations (Kanban, Tree, Calendar) — replacing\n * the old FormMeta/ListMeta split.\n *\n * Defined in line with Phase 14 (ADR: Unified UIMeta Structure, Phase 14 §6.1):\n * - `form`: Layout sections and tabs for the form view.\n * - `list`: Columns, sorting, and row-level styling for the list view.\n * - `additional_views`: Kanban, Tree, Calendar configurations.\n * - Plugin adapters can extend UIMeta with custom namespaces (e.g., WMSMeta).\n *\n * @example\n * ```tsx\n * const { uiMeta, isLoading } = useUIMeta(\"SalesInvoice\");\n * if (uiMeta?.list?.columns) { ... }\n * ```\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\n\n/** A single form section with a label and ordered field names. */\nexport interface FormSection {\n label: string;\n fields: string[];\n collapsible?: boolean;\n columns?: 1 | 2 | 3;\n}\n\n/** A tab containing multiple form sections. */\nexport interface FormTab {\n label: string;\n sections: FormSection[];\n}\n\n/** Form view configuration: tabs and/or flat sections. */\nexport interface FormMeta {\n tabs?: FormTab[];\n sections?: FormSection[];\n}\n\n/** A single column in the list view. */\nexport interface ListColumn {\n field: string;\n label?: string;\n width?: number | string;\n sortable?: boolean;\n visible?: boolean;\n}\n\n/** List view configuration: columns, default sort, row styling. */\nexport interface ListMeta {\n columns: ListColumn[];\n defaultSort?: { field: string; direction: \"asc\" | \"desc\" };\n /** JMESPath expression for row color (e.g. \"status == 'Overdue'\") */\n rowColorExpr?: string;\n rowColorValue?: string;\n}\n\n/** Kanban column definition. */\nexport interface KanbanConfig {\n groupByField: string;\n cardTitleField: string;\n cardSubtitleField?: string;\n swimlaneField?: string;\n}\n\n/** Tree view definition. */\nexport interface TreeConfig {\n parentField: string;\n labelField: string;\n orderField?: string;\n}\n\n/** Calendar view definition. */\nexport interface CalendarConfig {\n startField: string;\n endField?: string;\n titleField: string;\n colorField?: string;\n}\n\n/** Additional (non-standard) views registered by plugins. */\nexport interface AdditionalViews {\n kanban?: KanbanConfig;\n tree?: TreeConfig;\n calendar?: CalendarConfig;\n /** Custom plugin-registered view namespaces (e.g. WMSMeta, MobileMeta) */\n [key: string]: unknown;\n}\n\n/**\n * Unified UI Metadata structure.\n *\n * A single object that all frontend views read from, replacing FormMeta/ListMeta.\n * The `/api/meta/:doctype` endpoint returns this as `ui_meta`.\n */\nexport interface UIMeta {\n doctype: string;\n form?: FormMeta;\n list?: ListMeta;\n additional_views?: AdditionalViews;\n}\n\nexport interface UseUIMetaResult {\n uiMeta: UIMeta | null;\n isLoading: boolean;\n error: string | null;\n refetch: () => void;\n}\n\n/** In-memory cache to avoid duplicate network requests. */\nconst uiMetaCache = new Map<string, UIMeta>();\n\nfunction resolveMetaBaseUrl(baseUrl: string): string {\n const trimmed = baseUrl.trim().replace(/\\/+$/, \"\");\n if (!trimmed) {\n return \"\";\n }\n\n // Refine's useApiUrl often provides \"/api/v1\" or \"https://host/api/v1\".\n // Meta endpoint is served from \"/api/meta\", so strip the API prefix.\n return trimmed.replace(/\\/api\\/v1$/i, \"\");\n}\n\n/**\n * Hook to fetch and cache UIMeta for a given DocType.\n *\n * Reads from `/api/meta/:doctype` (Backend Meta endpoint).\n * Falls back to a minimal UIMeta on error.\n * Plugin adapters may extend the `additional_views` namespace.\n */\nexport function useUIMeta(\n doctype: string,\n baseUrl: string = \"\",\n uiContext?: string,\n): UseUIMetaResult {\n const cacheKey = uiContext ? `${doctype}::${uiContext}` : doctype;\n const [uiMeta, setUiMeta] = useState<UIMeta | null>(\n () => uiMetaCache.get(cacheKey) ?? null,\n );\n const [isLoading, setIsLoading] = useState(!uiMetaCache.has(cacheKey));\n const [error, setError] = useState<string | null>(null);\n\n const fetchMeta = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const params = new URLSearchParams();\n if (uiContext?.trim()) {\n params.set(\"ui_context\", uiContext.trim().toLowerCase());\n }\n\n const queryString = params.toString();\n const metaBaseUrl = resolveMetaBaseUrl(baseUrl);\n const url = `${metaBaseUrl}/api/meta/${encodeURIComponent(doctype)}${queryString ? `?${queryString}` : \"\"}`;\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(\n `Failed to fetch meta for ${doctype}: ${response.status}`,\n );\n }\n const data: { ui_meta?: UIMeta } = await response.json();\n const meta: UIMeta = data.ui_meta ?? { doctype };\n uiMetaCache.set(cacheKey, meta);\n setUiMeta(meta);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Unknown error\");\n // Provide minimal fallback so views don't break\n setUiMeta({ doctype });\n } finally {\n setIsLoading(false);\n }\n }, [baseUrl, cacheKey, doctype, uiContext]);\n\n useEffect(() => {\n if (!uiMetaCache.has(cacheKey)) {\n fetchMeta();\n }\n }, [cacheKey, fetchMeta]);\n\n return { uiMeta, isLoading, error, refetch: fetchMeta };\n}\n","/**\n * View Registry\n *\n * Registry for custom views (Kanban, Calendar, Gantt).\n * Per checklist 5.1: Register custom views in DocType Config.\n */\n\nimport type { ComponentType } from \"react\";\nimport type { ViewType, ViewProps, ViewRegistration } from \"./types\";\n\n// Registry of view components\nconst viewRegistry = new Map<ViewType, ViewRegistration>();\n\n// DocType-specific view configs (which views are enabled per doctype)\nconst doctypeViews = new Map<string, ViewType[]>();\n\n/**\n * Register a view type\n */\nexport function registerView(registration: ViewRegistration): void {\n viewRegistry.set(registration.type, registration);\n}\n\n/**\n * Get a view component by type\n */\nexport function getViewComponent(type: ViewType): ComponentType<ViewProps> | undefined {\n return viewRegistry.get(type)?.component;\n}\n\n/**\n * Get all registered views\n */\nexport function getRegisteredViews(): ViewRegistration[] {\n return Array.from(viewRegistry.values());\n}\n\n/**\n * Get view registration by type\n */\nexport function getViewRegistration(type: ViewType): ViewRegistration | undefined {\n return viewRegistry.get(type);\n}\n\n/**\n * Set available views for a DocType\n */\nexport function setDocTypeViews(doctype: string, views: ViewType[]): void {\n doctypeViews.set(doctype, views);\n}\n\n/**\n * Get available views for a DocType\n * Returns default ['list'] if not configured\n */\nexport function getDocTypeViews(doctype: string): ViewType[] {\n return doctypeViews.get(doctype) ?? [\"list\"];\n}\n\n/**\n * Check if a view type is available for a DocType\n */\nexport function isViewAvailable(doctype: string, viewType: ViewType): boolean {\n const views = getDocTypeViews(doctype);\n return views.includes(viewType);\n}\n","/**\n * KanbanView — Enhanced Kanban board for state-based DocTypes.\n *\n * Improvements over the basic version:\n * - **Quick Edit modal**: Click a card to open inline edit (title + description)\n * - **Dynamic column discovery**: Auto-generates columns from actual data values\n * when no columns are configured in KanbanConfig\n * - **Grouping by any Select/Link field**: `groupField` is fully configurable\n * - Full keyboard accessibility and CSS-variable theming\n */\n\nimport { useState, useMemo, useCallback } from \"react\";\nimport { useList, useUpdate } from \"@refinedev/core\";\nimport type { ViewProps, KanbanConfig, KanbanColumn } from \"./types\";\n\nexport interface KanbanViewProps extends ViewProps {\n config: KanbanConfig;\n}\n\n/** Dragged item state */\ninterface DragState {\n item: KanbanItem;\n sourceColumn: string;\n}\n\ninterface KanbanItem {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/** Quick Edit modal — inline edit of a Kanban card */\nfunction QuickEditModal({\n item,\n resource,\n titleField,\n descField,\n groupField,\n columns,\n onClose,\n onSaved,\n}: {\n item: KanbanItem;\n resource: string;\n titleField: string;\n descField?: string;\n groupField: string;\n columns: KanbanColumn[];\n onClose: () => void;\n onSaved: () => void;\n}) {\n const [title, setTitle] = useState(String(item[titleField] ?? item.name));\n const [desc, setDesc] = useState(\n descField ? String(item[descField] ?? \"\") : \"\",\n );\n const [status, setStatus] = useState(\n String(item[groupField] ?? columns[0]?.id ?? \"\"),\n );\n const [saving, setSaving] = useState(false);\n\n const { mutate: updateItem } = useUpdate();\n\n const handleSave = useCallback(() => {\n setSaving(true);\n const values: Record<string, unknown> = {\n [titleField]: title,\n [groupField]: status,\n };\n if (descField) values[descField] = desc;\n\n updateItem(\n { resource, id: item.id, values },\n {\n onSuccess: () => {\n setSaving(false);\n onSaved();\n onClose();\n },\n onError: () => setSaving(false),\n },\n );\n }, [\n title,\n desc,\n status,\n titleField,\n descField,\n groupField,\n resource,\n item.id,\n updateItem,\n onSaved,\n onClose,\n ]);\n\n // Close on Escape\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n },\n [onClose],\n );\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={`Edit ${String(item[titleField] ?? item.name)}`}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 1000,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(0,0,0,0.45)\",\n }}\n onClick={onClose}\n onKeyDown={handleKeyDown}\n >\n <div\n onClick={e => e.stopPropagation()}\n style={{\n background: \"var(--color-bg)\",\n border: \"1px solid var(--color-border)\",\n borderRadius: \"var(--radius-lg)\",\n padding: \"var(--spacing-lg)\",\n width: 420,\n maxWidth: \"90vw\",\n boxShadow: \"var(--shadow-lg)\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: \"var(--spacing-md)\",\n }}\n >\n <h3 style={{ margin: 0, fontSize: \"1rem\", fontWeight: 600 }}>\n Quick Edit\n </h3>\n <button\n onClick={onClose}\n aria-label=\"Close\"\n className=\"btn btn-ghost\"\n style={{ padding: \"0.25rem 0.5rem\", minHeight: \"unset\" }}\n >\n ✕\n </button>\n </div>\n\n {/* Title field */}\n <label\n style={{\n display: \"block\",\n fontSize: \"0.75rem\",\n fontWeight: 500,\n color: \"var(--color-text-muted)\",\n marginBottom: \"0.25rem\",\n }}\n >\n {titleField}\n </label>\n <input\n value={title}\n onChange={e => setTitle(e.target.value)}\n style={{ width: \"100%\", marginBottom: \"var(--spacing-sm)\" }}\n autoFocus\n />\n\n {/* Status/Group field */}\n <label\n style={{\n display: \"block\",\n fontSize: \"0.75rem\",\n fontWeight: 500,\n color: \"var(--color-text-muted)\",\n marginBottom: \"0.25rem\",\n }}\n >\n {groupField}\n </label>\n <select\n value={status}\n onChange={e => setStatus(e.target.value)}\n style={{ width: \"100%\", marginBottom: \"var(--spacing-sm)\" }}\n >\n {columns.map(col => (\n <option key={col.id} value={col.id}>\n {col.title}\n </option>\n ))}\n </select>\n\n {/* Description field (if configured) */}\n {descField && (\n <>\n <label\n style={{\n display: \"block\",\n fontSize: \"0.75rem\",\n fontWeight: 500,\n color: \"var(--color-text-muted)\",\n marginBottom: \"0.25rem\",\n }}\n >\n {descField}\n </label>\n <textarea\n value={desc}\n onChange={e => setDesc(e.target.value)}\n rows={3}\n style={{\n width: \"100%\",\n marginBottom: \"var(--spacing-md)\",\n resize: \"vertical\",\n }}\n />\n </>\n )}\n\n <div\n style={{\n display: \"flex\",\n gap: \"var(--spacing-sm)\",\n justifyContent: \"flex-end\",\n }}\n >\n <button className=\"btn\" onClick={onClose}>\n Cancel\n </button>\n <button\n className={`btn btn-primary${saving ? \" btn-loading\" : \"\"}`}\n onClick={handleSave}\n disabled={saving}\n >\n {saving ? \"\" : \"Save\"}\n </button>\n </div>\n </div>\n </div>\n );\n}\n\n/**\n * KanbanView — Full-featured Kanban board.\n *\n * Features:\n * - Drag cards between columns to update the group field\n * - Click a card to Quick Edit (title, description, status)\n * - Auto-discover columns from live data if none configured\n * - Group by any Select/Link field via `config.groupField`\n */\nexport function KanbanView({ resource, config }: KanbanViewProps) {\n const groupField = config.groupField ?? \"status\";\n const titleField = config.titleField ?? \"name\";\n const descField = config.descriptionField;\n\n const [dragState, setDragState] = useState<DragState | null>(null);\n const [dragOverColumn, setDragOverColumn] = useState<string | null>(null);\n const [editingItem, setEditingItem] = useState<KanbanItem | null>(null);\n\n // Fetch all items (up to 200 for Kanban)\n const { result, query } = useList<KanbanItem>({\n resource,\n pagination: { pageSize: 200 },\n });\n const items = result?.data ?? [];\n const isLoading = query?.isLoading ?? false;\n\n const { mutate: updateItem } = useUpdate();\n\n // Auto-discover columns from data if none configured\n const columns: KanbanColumn[] = useMemo(() => {\n if (config.columns && config.columns.length > 0) return config.columns;\n // Discover unique values from data\n const seen = new Set<string>();\n const discovered: KanbanColumn[] = [];\n const COLUMN_COLORS = [\n \"#e0e0e0\",\n \"#faad14\",\n \"#52c41a\",\n \"#ff4d4f\",\n \"#1890ff\",\n \"#722ed1\",\n ];\n for (const item of items) {\n const val = String(item[groupField] ?? \"\");\n if (val && !seen.has(val)) {\n seen.add(val);\n discovered.push({\n id: val,\n title: val.charAt(0).toUpperCase() + val.slice(1).replace(/_/g, \" \"),\n color: COLUMN_COLORS[discovered.length % COLUMN_COLORS.length],\n });\n }\n }\n return discovered.length > 0\n ? discovered\n : [\n { id: \"draft\", title: \"Draft\", color: \"#e0e0e0\" },\n { id: \"pending\", title: \"Pending\", color: \"#faad14\" },\n { id: \"approved\", title: \"Approved\", color: \"#52c41a\" },\n { id: \"rejected\", title: \"Rejected\", color: \"#ff4d4f\" },\n ];\n }, [config.columns, items, groupField]);\n\n // Group items by column\n const groupedItems = useMemo(() => {\n const groups: Record<string, KanbanItem[]> = {};\n for (const col of columns) groups[col.id] = [];\n\n for (const item of items) {\n const key = String(item[groupField] ?? \"\");\n if (key in groups) {\n groups[key].push(item);\n } else {\n // Fallback: first column\n const first = columns[0]?.id;\n if (first) groups[first]?.push(item);\n }\n }\n return groups;\n }, [items, columns, groupField]);\n\n const handleDrop = useCallback(\n (targetColumnId: string) => {\n if (!dragState || dragState.sourceColumn === targetColumnId) {\n setDragState(null);\n setDragOverColumn(null);\n return;\n }\n updateItem(\n {\n resource,\n id: dragState.item.id,\n values: { [groupField]: targetColumnId },\n },\n {\n onSuccess: () => {\n void query?.refetch?.();\n },\n },\n );\n setDragState(null);\n setDragOverColumn(null);\n },\n [dragState, resource, groupField, updateItem, query],\n );\n\n if (isLoading) {\n return (\n <div\n style={{\n padding: \"var(--spacing-xl)\",\n textAlign: \"center\",\n color: \"var(--color-text-muted)\",\n }}\n >\n <div\n className=\"skeleton skeleton-heading\"\n style={{ margin: \"0 auto 1rem\", width: 200 }}\n />\n <div style={{ display: \"flex\", gap: \"1rem\", padding: \"1rem\" }}>\n {[1, 2, 3].map(i => (\n <div\n key={i}\n style={{\n flex: \"0 0 280px\",\n background: \"var(--color-bg-tertiary)\",\n borderRadius: \"var(--radius-lg)\",\n padding: \"1rem\",\n }}\n >\n <div\n className=\"skeleton skeleton-heading\"\n style={{ marginBottom: \"0.5rem\" }}\n />\n {[1, 2].map(j => (\n <div\n key={j}\n className=\"skeleton\"\n style={{\n height: 72,\n marginBottom: \"0.5rem\",\n borderRadius: \"var(--radius-md)\",\n }}\n />\n ))}\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <>\n {editingItem && (\n <QuickEditModal\n item={editingItem}\n resource={resource}\n titleField={titleField}\n descField={descField}\n groupField={groupField}\n columns={columns}\n onClose={() => setEditingItem(null)}\n onSaved={() => {\n void query?.refetch?.();\n }}\n />\n )}\n\n <div\n role=\"region\"\n aria-label=\"Kanban board\"\n style={{\n display: \"flex\",\n gap: \"var(--spacing-md)\",\n padding: \"var(--spacing-md)\",\n overflowX: \"auto\",\n minHeight: 400,\n alignItems: \"flex-start\",\n }}\n >\n {columns.map(column => {\n const isOver = dragOverColumn === column.id;\n return (\n <div\n key={column.id}\n role=\"group\"\n aria-label={`${column.title} column`}\n onDragOver={e => {\n e.preventDefault();\n setDragOverColumn(column.id);\n }}\n onDragLeave={() => setDragOverColumn(null)}\n onDrop={() => handleDrop(column.id)}\n style={{\n flex: \"0 0 280px\",\n background: isOver\n ? \"var(--color-bg-tertiary)\"\n : \"var(--color-bg-secondary)\",\n borderRadius: \"var(--radius-lg)\",\n border: `2px solid ${isOver ? \"var(--color-primary)\" : \"transparent\"}`,\n display: \"flex\",\n flexDirection: \"column\",\n transition: \"border-color 0.15s ease, background 0.15s ease\",\n }}\n >\n {/* Column Header */}\n <div\n style={{\n padding: \"0.75rem 1rem\",\n borderBottom: `3px solid ${column.color ?? \"var(--color-primary)\"}`,\n fontWeight: 600,\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n borderRadius: \"var(--radius-lg) var(--radius-lg) 0 0\",\n }}\n >\n <span style={{ color: \"var(--color-text)\" }}>\n {column.title}\n </span>\n <span\n style={{\n fontSize: \"0.75rem\",\n color: \"var(--color-text-muted)\",\n background: \"var(--color-bg-tertiary)\",\n borderRadius: \"var(--radius-full, 9999px)\",\n padding: \"0.1rem 0.5rem\",\n fontWeight: 500,\n }}\n >\n {groupedItems[column.id]?.length ?? 0}\n </span>\n </div>\n\n {/* Cards */}\n <div\n style={{\n flex: 1,\n padding: \"var(--spacing-sm)\",\n overflowY: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"var(--spacing-sm)\",\n minHeight: 80,\n }}\n >\n {groupedItems[column.id]?.map(item => {\n const isDragging = dragState?.item.id === item.id;\n return (\n <div\n key={item.id}\n draggable\n role=\"button\"\n tabIndex={0}\n aria-label={`${String(item[titleField] ?? item.name)} — drag to reorder, press Enter to edit`}\n onDragStart={() =>\n setDragState({ item, sourceColumn: column.id })\n }\n onDragEnd={() => setDragState(null)}\n onClick={() => setEditingItem(item)}\n onKeyDown={e => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setEditingItem(item);\n }\n }}\n style={{\n padding: \"0.75rem\",\n background: \"var(--color-bg)\",\n borderRadius: \"var(--radius-md)\",\n boxShadow: \"var(--shadow-sm)\",\n cursor: \"grab\",\n opacity: isDragging ? 0.4 : 1,\n transform: isDragging ? \"scale(0.98)\" : undefined,\n transition:\n \"opacity 0.15s, box-shadow 0.15s, transform 0.15s\",\n border: \"1px solid var(--color-border)\",\n }}\n onMouseEnter={e => {\n (e.currentTarget as HTMLDivElement).style.boxShadow =\n \"var(--shadow-md)\";\n }}\n onMouseLeave={e => {\n (e.currentTarget as HTMLDivElement).style.boxShadow =\n \"var(--shadow-sm)\";\n }}\n >\n <div\n style={{\n fontWeight: 500,\n color: \"var(--color-text)\",\n fontSize: \"0.875rem\",\n marginBottom: descField ? \"0.25rem\" : 0,\n }}\n >\n {String(item[titleField] ?? item.name)}\n </div>\n {descField &&\n item[descField] !== undefined &&\n item[descField] !== null && (\n <div\n style={{\n fontSize: \"0.75rem\",\n color: \"var(--color-text-muted)\",\n lineHeight: 1.4,\n }}\n >\n {String(item[descField]).slice(0, 80)}\n {String(item[descField]).length > 80 ? \"…\" : \"\"}\n </div>\n )}\n <div\n style={{\n marginTop: \"0.5rem\",\n fontSize: \"0.7rem\",\n color: \"var(--color-text-muted)\",\n textAlign: \"right\",\n opacity: 0,\n transition: \"opacity 0.15s\",\n }}\n className=\"quick-edit-hint\"\n >\n Click to edit\n </div>\n </div>\n );\n })}\n\n {/* Empty column placeholder */}\n {groupedItems[column.id]?.length === 0 && (\n <div\n style={{\n padding: \"var(--spacing-lg)\",\n textAlign: \"center\",\n color: \"var(--color-text-muted)\",\n fontSize: \"0.75rem\",\n border: \"2px dashed var(--color-border)\",\n borderRadius: \"var(--radius-md)\",\n }}\n >\n Drop here\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </>\n );\n}\n\nexport default KanbanView;\n","/**\n * Calendar View Component\n *\n * Calendar view for date-based DocTypes.\n * Per checklist 5.1: Calendar view.\n */\n\nimport { useState, useMemo } from \"react\";\nimport { useList, useGo } from \"@refinedev/core\";\nimport type { ViewProps, CalendarConfig } from \"./types\";\n\n/**\n * Calendar view props\n */\nexport interface CalendarViewProps extends ViewProps {\n /** Calendar configuration */\n config: CalendarConfig;\n}\n\n/**\n * Calendar event item\n */\ninterface CalendarEvent {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/**\n * Get days in month\n */\nfunction getDaysInMonth(year: number, month: number): Date[] {\n const days: Date[] = [];\n const date = new Date(year, month, 1);\n \n while (date.getMonth() === month) {\n days.push(new Date(date));\n date.setDate(date.getDate() + 1);\n }\n \n return days;\n}\n\n/**\n * CalendarView Component\n */\nexport function CalendarView({ resource, config }: CalendarViewProps) {\n const startField = config.startField;\n const titleField = config.titleField;\n const go = useGo();\n\n // Current month state\n const [currentDate, setCurrentDate] = useState(new Date());\n const year = currentDate.getFullYear();\n const month = currentDate.getMonth();\n\n // Fetch events for current month\n const startOfMonth = new Date(year, month, 1).toISOString();\n const endOfMonth = new Date(year, month + 1, 0).toISOString();\n\n const { result: data, query } = useList<CalendarEvent>({\n resource,\n filters: [\n { field: startField, operator: \"gte\", value: startOfMonth },\n { field: startField, operator: \"lte\", value: endOfMonth },\n ],\n pagination: { pageSize: 100 },\n });\n\n // Get days in current month\n const days = useMemo(() => getDaysInMonth(year, month), [year, month]);\n\n // Group events by day\n const eventsByDay = useMemo(() => {\n const groups: Record<string, CalendarEvent[]> = {};\n \n if (data?.data) {\n for (const event of data.data) {\n const dateStr = String(event[startField] ?? \"\").split(\"T\")[0];\n if (dateStr) {\n if (!groups[dateStr]) groups[dateStr] = [];\n groups[dateStr].push(event);\n }\n }\n }\n \n return groups;\n }, [data, startField]);\n\n // Navigation\n const prevMonth = () => setCurrentDate(new Date(year, month - 1));\n const nextMonth = () => setCurrentDate(new Date(year, month + 1));\n const today = () => setCurrentDate(new Date());\n\n // Format month name\n const monthName = currentDate.toLocaleString(\"default\", { month: \"long\", year: \"numeric\" });\n\n // Day of week headers\n const weekDays = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n\n // First day of month offset\n const firstDayOffset = new Date(year, month, 1).getDay();\n\n const isLoading = query?.isLoading;\n\n if (isLoading) {\n return <div style={{ padding: \"2rem\" }}>Loading...</div>;\n }\n\n return (\n <div style={{ padding: \"1rem\" }}>\n {/* Header */}\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: \"1rem\",\n }}\n >\n <div style={{ display: \"flex\", gap: \"0.5rem\" }}>\n <button onClick={prevMonth} style={btnStyle}>← Prev</button>\n <button onClick={today} style={btnStyle}>Today</button>\n <button onClick={nextMonth} style={btnStyle}>Next →</button>\n </div>\n <h2 style={{ margin: 0 }}>{monthName}</h2>\n </div>\n\n {/* Calendar Grid */}\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(7, 1fr)\",\n gap: \"1px\",\n backgroundColor: \"#e0e0e0\",\n border: \"1px solid #e0e0e0\",\n borderRadius: \"4px\",\n overflow: \"hidden\",\n }}\n >\n {/* Day Headers */}\n {weekDays.map((day) => (\n <div\n key={day}\n style={{\n padding: \"0.5rem\",\n backgroundColor: \"#f5f5f5\",\n fontWeight: 600,\n textAlign: \"center\",\n fontSize: \"0.75rem\",\n }}\n >\n {day}\n </div>\n ))}\n\n {/* Empty cells for offset */}\n {Array.from({ length: firstDayOffset }).map((_, i) => (\n <div key={`empty-${i}`} style={{ backgroundColor: \"#fafafa\", minHeight: \"80px\" }} />\n ))}\n\n {/* Days */}\n {days.map((day) => {\n const dateStr = day.toISOString().split(\"T\")[0];\n const events = eventsByDay[dateStr] ?? [];\n const isToday = dateStr === new Date().toISOString().split(\"T\")[0];\n\n return (\n <div\n key={dateStr}\n style={{\n backgroundColor: \"white\",\n minHeight: \"80px\",\n padding: \"0.25rem\",\n }}\n >\n <div\n style={{\n fontSize: \"0.75rem\",\n fontWeight: isToday ? 600 : 400,\n color: isToday ? \"#1890ff\" : \"#333\",\n marginBottom: \"0.25rem\",\n }}\n >\n {day.getDate()}\n </div>\n {events.slice(0, 3).map((event) => (\n <div\n key={event.id}\n onClick={() => go({ to: `/app/${resource}/detail/${event.id}` })}\n style={{\n fontSize: \"0.7rem\",\n padding: \"0.125rem 0.25rem\",\n backgroundColor: \"#e6f7ff\",\n borderRadius: \"2px\",\n marginBottom: \"0.125rem\",\n cursor: \"pointer\",\n overflow: \"hidden\",\n whiteSpace: \"nowrap\",\n textOverflow: \"ellipsis\",\n }}\n >\n {String(event[titleField] ?? event.name)}\n </div>\n ))}\n {events.length > 3 && (\n <div style={{ fontSize: \"0.65rem\", color: \"#666\" }}>\n +{events.length - 3} more\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nconst btnStyle: React.CSSProperties = {\n padding: \"0.25rem 0.5rem\",\n backgroundColor: \"#f5f5f5\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n fontSize: \"0.75rem\",\n};\n\nexport default CalendarView;\n","/**\n * Gantt View Component\n *\n * Gantt chart view for project management.\n * Per checklist 5.1: Gantt view.\n */\n\nimport { useMemo } from \"react\";\nimport { useList, useGo } from \"@refinedev/core\";\nimport type { ViewProps, GanttConfig } from \"./types\";\n\n/**\n * Gantt view props\n */\nexport interface GanttViewProps extends ViewProps {\n /** Gantt configuration */\n config: GanttConfig;\n}\n\n/**\n * Gantt task item\n */\ninterface GanttTask {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/**\n * Calculate date range for Gantt\n */\nfunction getDateRange(tasks: GanttTask[], startField: string, endField: string) {\n let minDate = new Date();\n let maxDate = new Date();\n\n for (const task of tasks) {\n const start = new Date(String(task[startField] ?? \"\"));\n const end = new Date(String(task[endField] ?? \"\"));\n if (!isNaN(start.getTime()) && start < minDate) minDate = start;\n if (!isNaN(end.getTime()) && end > maxDate) maxDate = end;\n }\n\n // Add padding\n minDate.setDate(minDate.getDate() - 7);\n maxDate.setDate(maxDate.getDate() + 7);\n\n return { minDate, maxDate };\n}\n\n/**\n * Get days between two dates\n */\nfunction getDaysBetween(start: Date, end: Date): number {\n return Math.ceil((end.getTime() - start.getTime()) / (1000 * 60 * 60 * 24));\n}\n\n/**\n * GanttView Component\n */\nexport function GanttView({ resource, config }: GanttViewProps) {\n const nameField = config.nameField ?? \"name\";\n const startField = config.startField;\n const endField = config.endField;\n const progressField = config.progressField;\n const go = useGo();\n\n // Fetch tasks\n const { result: data, query } = useList<GanttTask>({\n resource,\n pagination: { pageSize: 100 },\n sorters: [{ field: startField, order: \"asc\" }],\n });\n\n // Calculate date range and tasks\n const { tasks, minDate, maxDate, totalDays } = useMemo(() => {\n const tasks = data?.data ?? [];\n if (tasks.length === 0) {\n return { tasks: [], minDate: new Date(), maxDate: new Date(), totalDays: 30 };\n }\n\n const { minDate, maxDate } = getDateRange(tasks, startField, endField);\n const totalDays = getDaysBetween(minDate, maxDate);\n\n return { tasks, minDate, maxDate, totalDays };\n }, [data, startField, endField]);\n\n // Generate day headers\n const dayHeaders = useMemo(() => {\n const headers: Date[] = [];\n const current = new Date(minDate);\n while (current <= maxDate) {\n headers.push(new Date(current));\n current.setDate(current.getDate() + 1);\n }\n return headers;\n }, [minDate, maxDate]);\n\n const isLoading = query?.isLoading;\n\n if (isLoading) {\n return <div style={{ padding: \"2rem\" }}>Loading...</div>;\n }\n\n if (tasks.length === 0) {\n return <div style={{ padding: \"2rem\", color: \"#666\" }}>No tasks to display</div>;\n }\n\n const rowHeight = 36;\n const dayWidth = 30;\n\n return (\n <div style={{ padding: \"1rem\", overflowX: \"auto\" }}>\n <div style={{ display: \"flex\", minWidth: totalDays * dayWidth + 200 }}>\n {/* Task Names Column */}\n <div style={{ width: \"200px\", flexShrink: 0, borderRight: \"1px solid #e0e0e0\" }}>\n {/* Header */}\n <div\n style={{\n height: \"40px\",\n padding: \"0.5rem\",\n fontWeight: 600,\n borderBottom: \"1px solid #e0e0e0\",\n backgroundColor: \"#f5f5f5\",\n }}\n >\n Task\n </div>\n {/* Task rows */}\n {tasks.map((task) => (\n <div\n key={task.id}\n onClick={() => go({ to: `/app/${resource}/detail/${task.id}` })}\n style={{\n height: `${rowHeight}px`,\n padding: \"0.5rem\",\n borderBottom: \"1px solid #f0f0f0\",\n cursor: \"pointer\",\n overflow: \"hidden\",\n whiteSpace: \"nowrap\",\n textOverflow: \"ellipsis\",\n }}\n >\n {String(task[nameField] ?? task.name)}\n </div>\n ))}\n </div>\n\n {/* Gantt Chart */}\n <div style={{ flex: 1, overflow: \"hidden\" }}>\n {/* Day Headers */}\n <div style={{ display: \"flex\", height: \"40px\", backgroundColor: \"#f5f5f5\" }}>\n {dayHeaders.map((day, i) => (\n <div\n key={i}\n style={{\n width: `${dayWidth}px`,\n flexShrink: 0,\n borderRight: \"1px solid #e0e0e0\",\n borderBottom: \"1px solid #e0e0e0\",\n fontSize: \"0.65rem\",\n textAlign: \"center\",\n padding: \"0.25rem\",\n }}\n >\n {day.getDate()}\n </div>\n ))}\n </div>\n\n {/* Task Bars */}\n {tasks.map((task) => {\n const taskStart = new Date(String(task[startField] ?? \"\"));\n const taskEnd = new Date(String(task[endField] ?? \"\"));\n \n const startOffset = getDaysBetween(minDate, taskStart);\n const duration = getDaysBetween(taskStart, taskEnd);\n const progress = progressField ? Number(task[progressField] ?? 0) : 0;\n\n return (\n <div\n key={task.id}\n style={{\n height: `${rowHeight}px`,\n position: \"relative\",\n borderBottom: \"1px solid #f0f0f0\",\n }}\n >\n {/* Background grid */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n }}\n >\n {dayHeaders.map((_, i) => (\n <div\n key={i}\n style={{\n width: `${dayWidth}px`,\n flexShrink: 0,\n borderRight: \"1px solid #f0f0f0\",\n }}\n />\n ))}\n </div>\n\n {/* Task bar */}\n <div\n style={{\n position: \"absolute\",\n left: `${startOffset * dayWidth}px`,\n width: `${Math.max(duration, 1) * dayWidth}px`,\n top: \"4px\",\n height: `${rowHeight - 8}px`,\n backgroundColor: \"#e6f7ff\",\n border: \"1px solid #1890ff\",\n borderRadius: \"4px\",\n overflow: \"hidden\",\n }}\n >\n {/* Progress fill */}\n {progressField && (\n <div\n style={{\n height: \"100%\",\n width: `${progress}%`,\n backgroundColor: \"#1890ff\",\n opacity: 0.3,\n }}\n />\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n}\n\nexport default GanttView;\n","/**\n * TreeView — Hierarchical nested DocType view.\n *\n * Features:\n * - Renders a full nested tree from flat list data using `parent_field`\n * - Inline **Add Child** — click \"+\" at any node to add a child\n * - Inline **Rename** — double-click a label to rename in-place\n * - **Drag-and-drop reparenting** — drag nodes to a new parent\n * - Uses `/api/tree/:doctype` backend endpoints for data + mutations\n * - Keyboard accessible (arrow keys, Enter, Escape)\n */\n\nimport {\n useState,\n useCallback,\n useRef,\n useEffect,\n type KeyboardEvent,\n} from \"react\";\nimport type { ViewProps, TreeConfig } from \"./types\";\n\nexport interface TreeViewProps extends ViewProps {\n config: TreeConfig;\n}\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\ninterface TreeNode {\n id: string;\n label: string;\n data: Record<string, unknown>;\n children: TreeNode[];\n}\n\ninterface TreeState {\n tree: TreeNode[];\n loading: boolean;\n error: string | null;\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\nconst BASE_URL = import.meta.env?.VITE_BACKEND_URL ?? \"\";\n\nasync function fetchTree(doctype: string): Promise<TreeNode[]> {\n const res = await fetch(\n `${BASE_URL}/api/tree/${encodeURIComponent(doctype)}`,\n );\n if (!res.ok) throw new Error(`Failed to fetch tree: ${res.status}`);\n const json = (await res.json()) as { tree: TreeNode[] };\n return json.tree;\n}\n\nasync function reparentNode(\n doctype: string,\n nodeId: string,\n newParent: string | null,\n): Promise<void> {\n await updateNode(doctype, nodeId, { parent: newParent });\n}\n\nasync function updateNode(\n doctype: string,\n nodeId: string,\n values: { parent?: string | null; label?: string },\n): Promise<void> {\n const res = await fetch(\n `${BASE_URL}/api/tree/${encodeURIComponent(doctype)}/${encodeURIComponent(nodeId)}`,\n {\n method: \"PATCH\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(values),\n },\n );\n if (!res.ok) throw new Error(`Update failed: ${res.status}`);\n}\n\nasync function addChildNode(\n doctype: string,\n parentId: string | null,\n label: string,\n): Promise<void> {\n const res = await fetch(\n `${BASE_URL}/api/tree/${encodeURIComponent(doctype)}/add-child`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ parent: parentId, label }),\n },\n );\n if (!res.ok) throw new Error(`Add child failed: ${res.status}`);\n}\n\n// ── Inline Rename Input ────────────────────────────────────────────────────\n\nfunction InlineInput({\n initialValue,\n onConfirm,\n onCancel,\n}: Readonly<{\n initialValue: string;\n onConfirm: (value: string) => void;\n onCancel: () => void;\n}>) {\n const [value, setValue] = useState(initialValue);\n const ref = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n ref.current?.focus();\n ref.current?.select();\n }, []);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") onConfirm(value.trim() || initialValue);\n if (e.key === \"Escape\") onCancel();\n };\n\n return (\n <input\n ref={ref}\n value={value}\n onChange={e => setValue(e.target.value)}\n onBlur={() => onConfirm(value.trim() || initialValue)}\n onKeyDown={handleKeyDown}\n style={{\n fontSize: \"0.875rem\",\n padding: \"0.125rem 0.375rem\",\n border: \"1px solid var(--color-primary)\",\n borderRadius: \"var(--radius-sm)\",\n background: \"var(--color-bg)\",\n color: \"var(--color-text)\",\n outline: \"none\",\n minWidth: 160,\n }}\n aria-label=\"Rename node\"\n />\n );\n}\n\n// ── Single Tree Node ───────────────────────────────────────────────────────\n\nfunction TreeNodeRow({\n node,\n depth,\n doctype,\n onRefresh,\n dragNodeId,\n onDragStart,\n onDrop,\n}: Readonly<{\n node: TreeNode;\n depth: number;\n doctype: string;\n onRefresh: () => void;\n dragNodeId: string | null;\n onDragStart: (id: string) => void;\n onDrop: (targetId: string | null) => void;\n}>) {\n const [collapsed, setCollapsed] = useState(false);\n const [renaming, setRenaming] = useState(false);\n const [addingChild, setAddingChild] = useState(false);\n const [isDropTarget, setIsDropTarget] = useState(false);\n const isDragging = dragNodeId === node.id;\n\n const handleRename = useCallback(\n async (newLabel: string) => {\n setRenaming(false);\n if (newLabel === node.label) return;\n try {\n await updateNode(doctype, node.id, { label: newLabel });\n onRefresh();\n } catch {\n // Silently revert on error\n }\n },\n [doctype, node.id, node.label, onRefresh],\n );\n\n const handleAddChild = useCallback(\n async (label: string) => {\n setAddingChild(false);\n if (!label.trim()) return;\n try {\n await addChildNode(doctype, node.id, label);\n setCollapsed(false);\n onRefresh();\n } catch {\n // Silently fail — UI remains consistent\n }\n },\n [doctype, node.id, onRefresh],\n );\n\n const hasChildren = node.children.length > 0;\n let toggleGlyph = \"•\";\n if (hasChildren) {\n toggleGlyph = collapsed ? \"▶\" : \"▼\";\n }\n\n return (\n <li\n role=\"treeitem\"\n aria-expanded={hasChildren ? !collapsed : undefined}\n style={{ listStyle: \"none\", margin: 0, padding: 0 }}\n >\n {/* Row */}\n <div\n draggable\n onDragStart={e => {\n e.stopPropagation();\n onDragStart(node.id);\n }}\n onDragEnd={() => setIsDropTarget(false)}\n onDragOver={e => {\n e.preventDefault();\n e.stopPropagation();\n setIsDropTarget(true);\n }}\n onDragLeave={() => setIsDropTarget(false)}\n onDrop={e => {\n e.preventDefault();\n e.stopPropagation();\n setIsDropTarget(false);\n onDrop(node.id);\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.375rem\",\n padding: \"0.3rem 0.5rem\",\n paddingLeft: `${0.5 + depth * 1.25}rem`,\n borderRadius: \"var(--radius-md)\",\n cursor: \"grab\",\n opacity: isDragging ? 0.4 : 1,\n background: isDropTarget ? \"rgba(139, 92, 246, 0.1)\" : \"transparent\",\n border: isDropTarget\n ? \"1px dashed var(--color-primary)\"\n : \"1px solid transparent\",\n transition: \"background 0.15s, border-color 0.15s\",\n userSelect: \"none\",\n }}\n onMouseEnter={e => {\n (e.currentTarget as HTMLDivElement).style.background =\n \"var(--color-bg-secondary)\";\n }}\n onMouseLeave={e => {\n (e.currentTarget as HTMLDivElement).style.background = isDropTarget\n ? \"rgba(139, 92, 246, 0.1)\"\n : \"transparent\";\n }}\n onKeyDown={(e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setCollapsed(c => !c);\n }\n }}\n tabIndex={0}\n aria-label={node.label}\n >\n {/* Expand/Collapse toggle */}\n <button\n onClick={e => {\n e.stopPropagation();\n setCollapsed(c => !c);\n }}\n aria-label={collapsed ? \"Expand\" : \"Collapse\"}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: 0,\n width: \"1rem\",\n color: \"var(--color-text-muted)\",\n fontSize: \"0.75rem\",\n flexShrink: 0,\n minHeight: \"unset\",\n }}\n >\n {toggleGlyph}\n </button>\n\n {/* Label / Rename input */}\n {renaming ? (\n <InlineInput\n initialValue={node.label}\n onConfirm={handleRename}\n onCancel={() => setRenaming(false)}\n />\n ) : (\n <span\n onDoubleClick={() => setRenaming(true)}\n title=\"Double-click to rename\"\n style={{\n flex: 1,\n fontSize: \"0.875rem\",\n color: \"var(--color-text)\",\n lineHeight: 1.4,\n }}\n >\n {node.label}\n </span>\n )}\n\n {/* Action buttons — shown on hover via CSS */}\n <div\n className=\"tree-node-actions\"\n style={{\n display: \"flex\",\n gap: \"0.25rem\",\n opacity: 0,\n transition: \"opacity 0.15s\",\n }}\n >\n <button\n onClick={e => {\n e.stopPropagation();\n setAddingChild(true);\n setCollapsed(false);\n }}\n title=\"Add child\"\n aria-label={`Add child to ${node.label}`}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n color: \"var(--color-primary)\",\n fontSize: \"0.8rem\",\n padding: \"0 0.25rem\",\n borderRadius: \"var(--radius-sm)\",\n minHeight: \"unset\",\n }}\n >\n +\n </button>\n <button\n onClick={e => {\n e.stopPropagation();\n setRenaming(true);\n }}\n title=\"Rename\"\n aria-label={`Rename ${node.label}`}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n color: \"var(--color-text-muted)\",\n fontSize: \"0.75rem\",\n padding: \"0 0.25rem\",\n borderRadius: \"var(--radius-sm)\",\n minHeight: \"unset\",\n }}\n >\n ✎\n </button>\n </div>\n </div>\n\n {/* Inline Add Child input */}\n {addingChild && (\n <div\n style={{\n paddingLeft: `${0.5 + (depth + 1) * 1.25}rem`,\n paddingTop: \"0.25rem\",\n paddingBottom: \"0.25rem\",\n }}\n >\n <InlineInput\n initialValue=\"\"\n onConfirm={handleAddChild}\n onCancel={() => setAddingChild(false)}\n />\n </div>\n )}\n\n {/* Children */}\n {!collapsed && hasChildren && (\n <ul role=\"group\" style={{ margin: 0, padding: 0 }}>\n {node.children.map(child => (\n <TreeNodeRow\n key={child.id}\n node={child}\n depth={depth + 1}\n doctype={doctype}\n onRefresh={onRefresh}\n dragNodeId={dragNodeId}\n onDragStart={onDragStart}\n onDrop={onDrop}\n />\n ))}\n </ul>\n )}\n </li>\n );\n}\n\n// ── TreeView ───────────────────────────────────────────────────────────────\n\n/**\n * TreeView — Hierarchical tree view for DocTypes with a parent field.\n *\n * Reads from `/api/tree/:doctype` and supports:\n * - Inline Add Child (click \"+\")\n * - Inline Rename (double-click)\n * - Drag-and-drop reparenting (PATCH /api/tree/:doctype/:id)\n */\nexport function TreeView({ resource }: Readonly<TreeViewProps>) {\n const [state, setState] = useState<TreeState>({\n tree: [],\n loading: true,\n error: null,\n });\n const [dragNodeId, setDragNodeId] = useState<string | null>(null);\n const [addingRoot, setAddingRoot] = useState(false);\n\n const load = useCallback(async () => {\n setState(s => ({ ...s, loading: true, error: null }));\n try {\n const tree = await fetchTree(resource);\n setState({ tree, loading: false, error: null });\n } catch (err) {\n setState({\n tree: [],\n loading: false,\n error: err instanceof Error ? err.message : \"Failed to load tree\",\n });\n }\n }, [resource]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n const handleDrop = useCallback(\n async (targetId: string | null) => {\n if (!dragNodeId || dragNodeId === targetId) {\n setDragNodeId(null);\n return;\n }\n try {\n await reparentNode(resource, dragNodeId, targetId);\n void load();\n } catch {\n /* silent */\n }\n setDragNodeId(null);\n },\n [dragNodeId, resource, load],\n );\n\n const handleAddRoot = useCallback(\n async (label: string) => {\n setAddingRoot(false);\n if (!label.trim()) return;\n try {\n await addChildNode(resource, null, label);\n void load();\n } catch {\n /* silent */\n }\n },\n [resource, load],\n );\n\n if (state.loading) {\n return (\n <div style={{ padding: \"var(--spacing-lg)\" }}>\n {[1, 2, 3, 4].map(i => (\n <div\n key={i}\n className=\"skeleton skeleton-text\"\n style={{ width: `${60 + i * 10}%`, marginBottom: \"0.5rem\" }}\n />\n ))}\n </div>\n );\n }\n\n if (state.error) {\n return (\n <div\n style={{\n padding: \"var(--spacing-xl)\",\n textAlign: \"center\",\n color: \"var(--color-error)\",\n }}\n >\n {state.error}\n <br />\n <button className=\"btn btn-ghost\" onClick={() => void load()}>\n Retry\n </button>\n </div>\n );\n }\n\n return (\n <div style={{ padding: \"var(--spacing-md)\" }}>\n {/* Toolbar */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"var(--spacing-sm)\",\n marginBottom: \"var(--spacing-sm)\",\n }}\n >\n <span\n style={{\n fontWeight: 600,\n fontSize: \"0.875rem\",\n color: \"var(--color-text-secondary)\",\n }}\n >\n {resource}\n </span>\n <button\n className=\"btn\"\n onClick={() => setAddingRoot(true)}\n style={{ fontSize: \"0.75rem\", padding: \"0.25rem 0.75rem\" }}\n >\n + Add Root Node\n </button>\n <button\n className=\"btn btn-ghost\"\n onClick={() => void load()}\n style={{ fontSize: \"0.75rem\", padding: \"0.25rem 0.5rem\" }}\n aria-label=\"Refresh tree\"\n >\n ↺\n </button>\n </div>\n\n {/* Inline add root node */}\n {addingRoot && (\n <div style={{ marginBottom: \"var(--spacing-sm)\" }}>\n <InlineInput\n initialValue=\"\"\n onConfirm={handleAddRoot}\n onCancel={() => setAddingRoot(false)}\n />\n </div>\n )}\n\n {/* Drop zone for reparenting to root */}\n {dragNodeId && (\n <div\n onDragOver={e => e.preventDefault()}\n onDrop={() => {\n handleDrop(null).catch(() => undefined);\n }}\n style={{\n padding: \"0.5rem\",\n marginBottom: \"0.5rem\",\n border: \"2px dashed var(--color-primary)\",\n borderRadius: \"var(--radius-md)\",\n textAlign: \"center\",\n fontSize: \"0.75rem\",\n color: \"var(--color-primary)\",\n }}\n >\n Drop here to make root-level\n </div>\n )}\n\n {/* Tree */}\n {state.tree.length === 0 ? (\n <div className=\"table-empty-state\">\n <span\n className=\"icon\"\n style={{ fontSize: \"2rem\", marginBottom: \"0.5rem\" }}\n >\n 🌳\n </span>\n <div>No items yet. Click \"+ Add Root Node\" to get started.</div>\n </div>\n ) : (\n <ul\n role=\"tree\"\n aria-label={`${resource} tree`}\n style={{ margin: 0, padding: 0 }}\n >\n {state.tree.map(node => (\n <TreeNodeRow\n key={node.id}\n node={node}\n depth={0}\n doctype={resource}\n onRefresh={() => void load()}\n dragNodeId={dragNodeId}\n onDragStart={setDragNodeId}\n onDrop={targetId => void handleDrop(targetId)}\n />\n ))}\n </ul>\n )}\n\n {/* Style for hover-reveal action buttons */}\n <style>{`\n [draggable]:hover .tree-node-actions {\n opacity: 1 !important;\n }\n `}</style>\n </div>\n );\n}\n\nexport default TreeView;\n","/**\n * Configuration Registry\n *\n * Stores and retrieves Level 1 customization configs.\n * No build step required - configs loaded at runtime.\n */\n\nimport type {\n DocTypeConfig,\n FormConfig,\n ListConfig,\n FieldConfig,\n ClientScript,\n} from \"./types\";\n\nfunction isDebugEnabled(): boolean {\n const globalFlag = (globalThis as { __FRAMEWORK_M_DEBUG__?: unknown })\n .__FRAMEWORK_M_DEBUG__;\n if (typeof globalFlag === \"boolean\") {\n return globalFlag;\n }\n if (typeof globalFlag === \"string\") {\n return [\"1\", \"true\", \"yes\", \"on\"].includes(globalFlag.toLowerCase());\n }\n\n const processRef = (\n globalThis as { process?: { env?: Record<string, string | undefined> } }\n ).process;\n const envFlag = processRef?.env?.FRAMEWORK_M_DEBUG;\n if (typeof envFlag === \"string\") {\n return [\"1\", \"true\", \"yes\", \"on\"].includes(envFlag.toLowerCase());\n }\n\n return false;\n}\n\nconst configLogger = {\n debug(message: string): void {\n if (isDebugEnabled()) {\n console.debug(`[ConfigRegistry] ${message}`);\n }\n },\n error(message: string, error?: unknown): void {\n console.error(`[ConfigRegistry] ${message}`, error);\n },\n};\n\n/**\n * Configuration store\n */\nconst configStore: Map<string, DocTypeConfig> = new Map();\nconst clientScripts: Map<string, ClientScript[]> = new Map();\n\n/**\n * Register a DocType configuration\n *\n * @param config - DocType configuration\n *\n * @example\n * ```typescript\n * registerConfig({\n * doctype: \"Depot\",\n * form: {\n * fields: {\n * capacity: { label: \"Max Capacity (MT)\" },\n * internal_code: { hidden: true }\n * },\n * sections: [\n * { title: \"Location\", fields: [\"location\", \"region\"] }\n * ]\n * },\n * list: {\n * columns: [\"name\", \"location\", \"capacity\"],\n * defaultSort: { field: \"capacity\", order: \"desc\" }\n * }\n * });\n * ```\n */\nexport function registerConfig(config: DocTypeConfig): void {\n const existing = configStore.get(config.doctype);\n\n if (existing) {\n // Merge configs (deep merge for nested objects)\n configStore.set(config.doctype, mergeConfigs(existing, config));\n } else {\n configStore.set(config.doctype, config);\n }\n}\n\n/**\n * Merge two configs (later config wins for conflicts)\n */\nfunction mergeConfigs(\n base: DocTypeConfig,\n override: DocTypeConfig,\n): DocTypeConfig {\n return {\n doctype: override.doctype,\n form: mergeFormConfigs(base.form, override.form),\n list: mergeListConfigs(base.list, override.list),\n };\n}\n\nfunction mergeFormConfigs(\n base?: FormConfig,\n override?: FormConfig,\n): FormConfig | undefined {\n if (!base && !override) return undefined;\n if (!base) return override;\n if (!override) return base;\n\n return {\n ...base,\n ...override,\n fields: {\n ...base.fields,\n ...override.fields,\n },\n sections: override.sections ?? base.sections,\n };\n}\n\nfunction mergeListConfigs(\n base?: ListConfig,\n override?: ListConfig,\n): ListConfig | undefined {\n if (!base && !override) return undefined;\n if (!base) return override;\n if (!override) return base;\n\n return {\n ...base,\n ...override,\n };\n}\n\n/**\n * Get configuration for a DocType\n */\nexport function getConfig(doctype: string): DocTypeConfig | undefined {\n return configStore.get(doctype);\n}\n\n/**\n * Get form configuration for a DocType\n */\nexport function getFormConfig(doctype: string): FormConfig | undefined {\n return configStore.get(doctype)?.form;\n}\n\n/**\n * Get list configuration for a DocType\n */\nexport function getListConfig(doctype: string): ListConfig | undefined {\n return configStore.get(doctype)?.list;\n}\n\n/**\n * Get field configuration override\n */\nexport function getFieldConfig(\n doctype: string,\n fieldName: string,\n): FieldConfig | undefined {\n return configStore.get(doctype)?.form?.fields?.[fieldName];\n}\n\n/**\n * Register a client script\n *\n * @param script - Client script definition\n *\n * @example\n * ```typescript\n * registerClientScript({\n * doctype: \"Sales Invoice\",\n * event: \"onLoad\",\n * handler: (ctx) => {\n * if (ctx.doc.status === \"Draft\") {\n * ctx.setHidden(\"cancel_reason\", true);\n * }\n * }\n * });\n * ```\n */\nexport function registerClientScript(script: ClientScript): void {\n const key = `${script.doctype}:${script.event}`;\n const existing = clientScripts.get(key) ?? [];\n existing.push(script);\n clientScripts.set(key, existing);\n}\n\n/**\n * Get client scripts for a DocType and event\n */\nexport function getClientScripts(\n doctype: string,\n event: ClientScript[\"event\"],\n): ClientScript[] {\n const key = `${doctype}:${event}`;\n return clientScripts.get(key) ?? [];\n}\n\n/**\n * Load configuration from URL (fetches JSON)\n */\nexport async function loadConfigFromUrl(url: string): Promise<void> {\n try {\n configLogger.debug(`Loading config from ${url}`);\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to load config: ${response.statusText}`);\n }\n const config: DocTypeConfig = await response.json();\n registerConfig(config);\n } catch (error) {\n configLogger.error(`Failed to load config from ${url}`, error);\n }\n}\n\n/**\n * Clear all configurations (for testing)\n */\nexport function clearConfigs(): void {\n configStore.clear();\n clientScripts.clear();\n}\n","/**\n * useConfig Hook\n *\n * Hook for accessing DocType configuration in components.\n */\n\nimport { useMemo } from \"react\";\nimport {\n getConfig,\n getFormConfig,\n getListConfig,\n getFieldConfig,\n} from \"./registry\";\nimport type { DocTypeConfig, FormConfig, ListConfig, FieldConfig } from \"./types\";\n\n/**\n * Hook to get complete DocType configuration\n */\nexport function useConfig(doctype: string): DocTypeConfig | undefined {\n return useMemo(() => getConfig(doctype), [doctype]);\n}\n\n/**\n * Hook to get form configuration\n */\nexport function useFormConfig(doctype: string): FormConfig | undefined {\n return useMemo(() => getFormConfig(doctype), [doctype]);\n}\n\n/**\n * Hook to get list configuration\n */\nexport function useListConfig(doctype: string): ListConfig | undefined {\n return useMemo(() => getListConfig(doctype), [doctype]);\n}\n\n/**\n * Hook to get field configuration override\n */\nexport function useFieldConfig(\n doctype: string,\n fieldName: string\n): FieldConfig | undefined {\n return useMemo(\n () => getFieldConfig(doctype, fieldName),\n [doctype, fieldName]\n );\n}\n","/**\n * Workspace Sidebar Section Component\n *\n * Renders a workspace in the sidebar.\n * Per checklist 6.4: Desk Workspace Configuration.\n */\n\nimport { useState } from \"react\";\nimport { useGo } from \"@refinedev/core\";\nimport type { DeskWorkspace, WorkspaceItem } from \"./types\";\n\n/**\n * WorkspaceSection props\n */\nexport interface WorkspaceSectionProps {\n /** Workspace to render */\n workspace: DeskWorkspace;\n /** Whether collapsed */\n collapsed?: boolean;\n}\n\n/**\n * WorkspaceSection Component\n */\nexport function WorkspaceSection({ workspace, collapsed = false }: WorkspaceSectionProps) {\n const [isExpanded, setIsExpanded] = useState(true);\n const go = useGo();\n\n const handleItemClick = (item: WorkspaceItem) => {\n if (item.type === \"shortcut\") {\n go({ to: `/app/${item.doctype}/list` });\n } else if (item.type === \"link\") {\n if (item.newTab) {\n window.open(item.url, \"_blank\");\n } else if (item.url.startsWith(\"/\")) {\n go({ to: item.url });\n } else {\n window.location.href = item.url;\n }\n }\n // Charts are not clickable, they're rendered as widgets\n };\n\n return (\n <div style={{ marginBottom: \"0.5rem\" }}>\n {/* Workspace Header */}\n <button\n onClick={() => setIsExpanded(!isExpanded)}\n style={{\n width: \"100%\",\n padding: collapsed ? \"0.5rem\" : \"0.5rem 1rem\",\n background: \"none\",\n border: \"none\",\n color: \"rgba(255,255,255,0.7)\",\n textAlign: \"left\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n fontSize: \"0.875rem\",\n }}\n >\n <span>{workspace.icon}</span>\n {!collapsed && (\n <>\n <span style={{ flex: 1 }}>{workspace.label}</span>\n <span style={{ fontSize: \"0.65rem\" }}>\n {isExpanded ? \"▼\" : \"▶\"}\n </span>\n </>\n )}\n </button>\n\n {/* Workspace Items */}\n {isExpanded && !collapsed && (\n <div style={{ paddingLeft: \"1rem\" }}>\n {workspace.items\n .filter((item) => item.type !== \"chart\")\n .map((item, idx) => (\n <button\n key={`${item.type}-${idx}`}\n onClick={() => handleItemClick(item)}\n style={{\n width: \"100%\",\n padding: \"0.375rem 0.75rem\",\n background: \"none\",\n border: \"none\",\n color: \"rgba(255,255,255,0.6)\",\n textAlign: \"left\",\n cursor: \"pointer\",\n fontSize: \"0.8rem\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n }}\n >\n {\"icon\" in item && item.icon && <span>{item.icon}</span>}\n <span>{item.label}</span>\n {item.type === \"link\" && item.newTab && (\n <span style={{ fontSize: \"0.6rem\", opacity: 0.5 }}>↗</span>\n )}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport default WorkspaceSection;\n","/**\n * ListView Page Component\n *\n * Generic list view for any DocType.\n * Per checklist 3.1: Route /app/{doctype}/list\n *\n * Features:\n * - Fetches metadata for column generation\n * - Renders AutoTable\n * - New button\n * - Search and filters\n * - Bulk actions\n */\n\nimport { useState, useMemo, useCallback } from \"react\";\nimport { useParams, useNavigate, useLocation } from \"react-router\";\nimport { useDeleteMany, useGetIdentity, useInvalidate } from \"@refinedev/core\";\nimport { useDocTypeMeta, useUIMeta } from \"../hooks\";\nimport { AutoTable } from \"../components/table\";\nimport { ConfirmDialog } from \"../components/feedback\";\nimport { Slot } from \"../plugins\";\nimport { KanbanView, TreeView } from \"../views\";\n\n/**\n * ListView props\n */\nexport interface ListViewProps {\n /** DocType name (overrides route param) */\n doctype?: string;\n /** View override used by explicit routes (/kanban, /tree) */\n view?: \"list\" | \"kanban\" | \"tree\";\n}\n\ntype ViewMode = \"list\" | \"kanban\" | \"tree\";\n\ninterface SchemaField {\n enum?: unknown[];\n type?: string | string[];\n format?: string;\n $ref?: string;\n anyOf?: Array<Record<string, unknown>>;\n allOf?: Array<Record<string, unknown>>;\n oneOf?: Array<Record<string, unknown>>;\n [key: string]: unknown;\n}\n\nfunction toSchemaFields(schema: unknown): Record<string, SchemaField> {\n if (!schema || typeof schema !== \"object\") return {};\n const properties = (schema as { properties?: unknown }).properties;\n if (!properties || typeof properties !== \"object\") return {};\n return properties as Record<string, SchemaField>;\n}\n\nfunction getStringEnums(field: SchemaField | undefined): string[] {\n if (!field?.enum || !Array.isArray(field.enum)) return [];\n return field.enum.filter((v): v is string => typeof v === \"string\");\n}\n\nfunction isSelectOrLinkField(field: SchemaField | undefined): boolean {\n if (!field) return false;\n if (Array.isArray(field.enum) && field.enum.length > 0) return true;\n\n const format = String(field.format ?? \"\").toLowerCase();\n if (format.includes(\"link\") || format.includes(\"reference\")) return true;\n\n const rawFieldType = field[\"x-fieldtype\"];\n const fieldType =\n typeof rawFieldType === \"string\" ? rawFieldType.toLowerCase() : \"\";\n if (fieldType === \"link\" || fieldType === \"select\") return true;\n\n const ref = String(field.$ref ?? \"\").toLowerCase();\n if (ref.includes(\"link\") || ref.includes(\"doctype\")) return true;\n\n return false;\n}\n\nfunction pickFirst(...values: Array<string | undefined>): string | undefined {\n for (const value of values) {\n if (typeof value === \"string\" && value.trim()) return value;\n }\n return undefined;\n}\n\n/**\n * ListView Component\n *\n * Renders a list view for any DocType with search, filters, and bulk actions.\n *\n * @example\n * ```tsx\n * // In routes\n * <Route path=\"/app/:doctype/list\" element={<ListView />} />\n *\n * // Or with explicit doctype\n * <ListView doctype=\"Task\" />\n * ```\n */\nexport function ListView({\n doctype: propDoctype,\n view: propView,\n}: Readonly<ListViewProps>) {\n const params = useParams<{ doctype: string }>();\n const navigate = useNavigate();\n const location = useLocation();\n const { data: identity } = useGetIdentity<{ id?: string }>();\n\n const doctype = propDoctype ?? params.doctype ?? \"\";\n const isAuthenticated =\n Boolean(identity?.id) &&\n String(identity?.id ?? \"\").toLowerCase() !== \"guest\";\n\n // Fetch metadata\n const {\n schema,\n isLoading: metaLoading,\n error: metaError,\n } = useDocTypeMeta(doctype);\n const { uiMeta } = useUIMeta(doctype);\n\n // Search state\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [uiError, setUiError] = useState<string | null>(null);\n const [isDeleteConfirmOpen, setIsDeleteConfirmOpen] = useState(false);\n\n // Selected rows for bulk actions\n const [selectedRows, setSelectedRows] = useState<Record<string, unknown>[]>(\n [],\n );\n\n const schemaFields = useMemo(() => toSchemaFields(schema), [schema]);\n\n const pathView = useMemo<ViewMode | undefined>(() => {\n if (location.pathname.endsWith(\"/kanban\")) return \"kanban\";\n if (location.pathname.endsWith(\"/tree\")) return \"tree\";\n if (location.pathname.endsWith(\"/list\")) return \"list\";\n return undefined;\n }, [location.pathname]);\n\n const detectedParentField = useMemo(() => {\n const fromMeta = uiMeta?.additional_views?.tree as\n | { parentField?: string }\n | undefined;\n if (fromMeta?.parentField) return fromMeta.parentField;\n\n if (schemaFields.parent_doctype) return \"parent_doctype\";\n if (schemaFields.parent) return \"parent\";\n\n const parentLike = Object.keys(schemaFields).find(\n key => key.startsWith(\"parent_\") || key.endsWith(\"_parent\"),\n );\n return parentLike;\n }, [uiMeta, schemaFields]);\n\n const detectedLabelField = useMemo(() => {\n const fromMeta = uiMeta?.additional_views?.tree as\n | { labelField?: string }\n | undefined;\n return (\n pickFirst(\n fromMeta?.labelField,\n schemaFields.title ? \"title\" : undefined,\n schemaFields.subject ? \"subject\" : undefined,\n schemaFields.label ? \"label\" : undefined,\n schemaFields.name ? \"name\" : undefined,\n ) ?? \"name\"\n );\n }, [uiMeta, schemaFields]);\n\n const groupFieldCandidates = useMemo(() => {\n return Object.entries(schemaFields)\n .filter(([, field]) => isSelectOrLinkField(field))\n .map(([name]) => name);\n }, [schemaFields]);\n\n const metaKanban = uiMeta?.additional_views?.kanban as\n | {\n groupByField?: string;\n cardTitleField?: string;\n cardSubtitleField?: string;\n }\n | undefined;\n\n const kanbanGroupField = useMemo(() => {\n const preferred = pickFirst(\n metaKanban?.groupByField,\n schemaFields.status ? \"status\" : undefined,\n schemaFields.workflow_state ? \"workflow_state\" : undefined,\n groupFieldCandidates[0],\n );\n return preferred;\n }, [metaKanban, schemaFields, groupFieldCandidates]);\n\n const kanbanColumns = useMemo(() => {\n if (!kanbanGroupField) return [];\n const enums = getStringEnums(schemaFields[kanbanGroupField]);\n return enums.map(value => ({\n id: value,\n title:\n value.charAt(0).toUpperCase() + value.slice(1).replaceAll(\"_\", \" \"),\n }));\n }, [kanbanGroupField, schemaFields]);\n\n const kanbanTitleField = pickFirst(\n metaKanban?.cardTitleField,\n schemaFields.title ? \"title\" : undefined,\n schemaFields.subject ? \"subject\" : undefined,\n schemaFields.name ? \"name\" : undefined,\n \"name\",\n ) as string;\n\n const kanbanDescriptionField = pickFirst(\n metaKanban?.cardSubtitleField,\n schemaFields.description ? \"description\" : undefined,\n schemaFields.notes ? \"notes\" : undefined,\n );\n\n const canKanban = Boolean(kanbanGroupField);\n const canTree = Boolean(detectedParentField);\n\n const activeView: ViewMode = useMemo(() => {\n const requested = propView ?? pathView ?? \"list\";\n if (requested === \"kanban\" && !canKanban) return \"list\";\n if (requested === \"tree\" && !canTree) return \"list\";\n return requested;\n }, [propView, pathView, canKanban, canTree]);\n\n const setActiveView = useCallback(\n (view: ViewMode) => {\n const target = view === \"list\" ? \"list\" : view;\n navigate(`/app/${doctype}/${target}`);\n },\n [navigate, doctype],\n );\n\n // Handle row click - navigate to detail view\n const handleRowClick = useCallback(\n (row: Record<string, unknown>) => {\n // Prefer id (UUID) as backend routes expect UUID, not name\n const id = row.id ?? row.name;\n if (\n typeof id === \"string\" ||\n typeof id === \"number\" ||\n typeof id === \"bigint\"\n ) {\n navigate(`/app/${doctype}/detail/${id}`);\n }\n },\n [navigate, doctype],\n );\n\n // Handle \"New\" button\n const handleNew = useCallback(() => {\n if (!isAuthenticated) {\n setUiError(\"Authentication required. Please login first.\");\n navigate(\"/login\");\n return;\n }\n setUiError(null);\n navigate(`/app/${doctype}/new`);\n }, [isAuthenticated, navigate, doctype]);\n\n // Delete mutation for bulk delete\n const deleteMutation = useDeleteMany();\n const invalidate = useInvalidate();\n\n // Handle bulk delete\n const handleBulkDelete = useCallback(async () => {\n if (selectedRows.length === 0) return;\n\n setIsDeleteConfirmOpen(true);\n }, [selectedRows]);\n\n const confirmBulkDelete = useCallback(async () => {\n if (selectedRows.length === 0) {\n setIsDeleteConfirmOpen(false);\n return;\n }\n\n // Extract IDs (prefer UUID 'id' field)\n const ids = selectedRows.map(row => String(row.id ?? row.name));\n\n deleteMutation.mutate(\n { resource: doctype, ids },\n {\n onSuccess: () => {\n setUiError(null);\n setSelectedRows([]);\n setIsDeleteConfirmOpen(false);\n // Invalidate list to refresh data\n invalidate({ resource: doctype, invalidates: [\"list\"] });\n },\n onError: err => {\n setUiError(err.message || \"Delete failed.\");\n setIsDeleteConfirmOpen(false);\n },\n },\n );\n }, [selectedRows, doctype, deleteMutation, invalidate]);\n\n // Format title\n const title = useMemo(() => {\n return doctype.replaceAll(\"_\", \" \");\n }, [doctype]);\n\n // Loading state\n if (metaLoading) {\n return (\n <div\n style={{\n padding: \"2rem\",\n backgroundColor: \"var(--color-bg)\",\n minHeight: \"100vh\",\n }}\n >\n <div style={{ color: \"var(--color-text-secondary)\" }}>\n Loading {doctype}...\n </div>\n </div>\n );\n }\n\n // Error state\n if (metaError) {\n return (\n <div\n style={{\n padding: \"2rem\",\n backgroundColor: \"var(--color-bg)\",\n minHeight: \"100vh\",\n }}\n >\n <div style={{ color: \"var(--color-error)\" }}>\n Error loading {doctype}: {metaError.message}\n </div>\n </div>\n );\n }\n\n return (\n <div\n style={{\n padding: \"1.5rem\",\n backgroundColor: \"var(--color-bg)\",\n minHeight: \"100vh\",\n }}\n >\n {/* Header */}\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: \"1.5rem\",\n }}\n >\n <h1\n style={{ margin: 0, fontSize: \"1.5rem\", color: \"var(--color-text)\" }}\n >\n {title}\n </h1>\n\n <div style={{ display: \"flex\", gap: \"0.5rem\", alignItems: \"center\" }}>\n <div\n role=\"tablist\"\n aria-label=\"View switcher\"\n style={{ display: \"flex\", gap: \"0.25rem\", marginRight: \"0.5rem\" }}\n >\n {(\n [\n { key: \"list\", label: \"List\", enabled: true },\n { key: \"kanban\", label: \"Kanban\", enabled: canKanban },\n { key: \"tree\", label: \"Tree\", enabled: canTree },\n ] as const\n ).map(view => (\n <button\n key={view.key}\n type=\"button\"\n role=\"tab\"\n aria-selected={activeView === view.key}\n disabled={!view.enabled}\n onClick={() => setActiveView(view.key)}\n style={{\n padding: \"0.45rem 0.7rem\",\n borderRadius: \"999px\",\n border: \"1px solid var(--color-border)\",\n background:\n activeView === view.key\n ? \"var(--color-primary)\"\n : \"var(--color-bg-secondary)\",\n color:\n activeView === view.key ? \"white\" : \"var(--color-text)\",\n cursor: view.enabled ? \"pointer\" : \"not-allowed\",\n opacity: view.enabled ? 1 : 0.5,\n fontSize: \"0.75rem\",\n fontWeight: 600,\n }}\n >\n {view.label}\n </button>\n ))}\n </div>\n\n {/* Plugin slot for custom header actions */}\n <Slot name=\"list-header-actions\" doctype={doctype} />\n\n {activeView === \"list\" && (\n <button\n onClick={handleNew}\n style={{\n padding: \"0.5rem 1rem\",\n backgroundColor: \"var(--color-primary)\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n fontWeight: 500,\n }}\n >\n + New\n </button>\n )}\n </div>\n </div>\n\n {/* Action Errors */}\n {uiError && (\n <div\n style={{\n marginBottom: \"1rem\",\n padding: \"0.75rem 1rem\",\n backgroundColor: \"var(--color-error-bg)\",\n border: \"1px solid var(--color-error-border)\",\n borderRadius: \"4px\",\n color: \"var(--color-error)\",\n }}\n role=\"alert\"\n >\n {uiError}\n </div>\n )}\n\n {activeView === \"list\" && (\n <>\n {/* Search and Filters */}\n <div\n style={{\n display: \"flex\",\n gap: \"1rem\",\n marginBottom: \"1rem\",\n alignItems: \"center\",\n }}\n >\n {/* Search box */}\n <input\n type=\"search\"\n placeholder={`Search ${title}...`}\n value={searchQuery}\n onChange={e => setSearchQuery(e.target.value)}\n style={{\n padding: \"0.5rem 1rem\",\n border: \"1px solid var(--color-border)\",\n borderRadius: \"4px\",\n width: \"300px\",\n backgroundColor: \"var(--color-bg)\",\n color: \"var(--color-text)\",\n }}\n />\n\n {/* Plugin slot for custom filters */}\n <Slot name=\"list-filters\" doctype={doctype} />\n\n {/* Bulk actions (show when rows selected) */}\n {selectedRows.length > 0 && (\n <div\n style={{\n display: \"flex\",\n gap: \"0.5rem\",\n marginLeft: \"auto\",\n alignItems: \"center\",\n }}\n >\n <span style={{ color: \"var(--color-text-secondary)\" }}>\n {selectedRows.length} selected\n </span>\n <button\n onClick={handleBulkDelete}\n style={{\n padding: \"0.5rem 1rem\",\n backgroundColor: \"var(--color-error)\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n }}\n >\n Delete\n </button>\n <button\n onClick={() => setSelectedRows([])}\n style={{\n padding: \"0.5rem 1rem\",\n backgroundColor: \"var(--color-bg-secondary)\",\n color: \"var(--color-text)\",\n border: \"1px solid var(--color-border)\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n }}\n >\n Clear\n </button>\n </div>\n )}\n </div>\n\n {/* Plugin slot for above table */}\n <Slot name=\"list-above-table\" doctype={doctype} />\n\n {/* Table */}\n <AutoTable\n resource={doctype}\n schema={schema}\n enableSelection\n onSelectionChange={setSelectedRows}\n onRowClick={handleRowClick}\n />\n\n {/* Plugin slot for below table */}\n <Slot name=\"list-below-table\" doctype={doctype} />\n </>\n )}\n\n {activeView === \"kanban\" && canKanban && kanbanGroupField && (\n <KanbanView\n resource={doctype}\n config={{\n groupField: kanbanGroupField,\n columns: kanbanColumns,\n titleField: kanbanTitleField,\n descriptionField: kanbanDescriptionField,\n }}\n />\n )}\n\n {activeView === \"tree\" && canTree && detectedParentField && (\n <TreeView\n resource={doctype}\n config={{\n parentField: detectedParentField,\n labelField: detectedLabelField,\n allowReparent: true,\n allowAddChild: true,\n allowRename: true,\n }}\n />\n )}\n\n <ConfirmDialog\n open={isDeleteConfirmOpen}\n title=\"Confirm bulk delete\"\n message={`Delete ${selectedRows.length} selected item(s)? This cannot be undone.`}\n confirmLabel=\"Delete\"\n cancelLabel=\"Cancel\"\n destructive\n onConfirm={() => {\n confirmBulkDelete().catch(() => undefined);\n }}\n onCancel={() => setIsDeleteConfirmOpen(false)}\n />\n </div>\n );\n}\n\nexport default ListView;\n","/**\n * FormView Page Component\n *\n * Generic form view for any DocType (create/edit).\n * Per checklist 3.2:\n * - Route Create: `/app/{doctype}/new`\n * - Route Edit: `/app/{doctype}/detail/{id}`\n *\n * Features:\n * - Fetches metadata\n * - Fetches document (if editing)\n * - Renders AutoForm\n * - Renders Workflow Actions\n * - Save/Submit/Cancel buttons\n * - Shows validation errors\n */\n\nimport { useState, useCallback, useEffect } from \"react\";\nimport { useParams, useNavigate } from \"react-router\";\nimport { useOne, useCreate, useUpdate, useApiUrl } from \"@refinedev/core\";\nimport { useDocTypeMeta } from \"../hooks\";\nimport { useWorkflowActions } from \"../hooks/useWorkflowActions\";\nimport { AutoForm } from \"../components/form\";\nimport { WorkflowActions } from \"../components/workflow\";\nimport { AlertBanner } from \"../components/feedback\";\nimport { Slot } from \"../plugins\";\nimport { getClientScripts } from \"../config\";\n\n/**\n * FormView props\n */\nexport interface FormViewProps {\n /** DocType name (overrides route param) */\n doctype?: string;\n /** Document ID (overrides route param) */\n id?: string;\n}\n\n/**\n * FormView Component\n *\n * Renders a form for creating or editing any DocType.\n *\n * @example\n * ```tsx\n * // In routes\n * <Route path=\"/app/:doctype/new\" element={<FormView />} />\n * <Route path=\"/app/:doctype/detail/:id\" element={<FormView />} />\n * ```\n */\nexport function FormView({\n doctype: propDoctype,\n id: propId,\n}: Readonly<FormViewProps>) {\n const params = useParams<{ doctype: string; id: string }>();\n const navigate = useNavigate();\n\n const doctype = propDoctype ?? params.doctype ?? \"\";\n const id = propId ?? params.id;\n const isEditing = !!id;\n const apiUrl = useApiUrl();\n\n const getApiOrigin = useCallback((rawApiUrl: string): string => {\n const trimmed = rawApiUrl.trim().replace(/\\/+$/, \"\");\n if (!trimmed) {\n return \"\";\n }\n\n // Refine's API URL is often /api/v1; print endpoint is an absolute\n // backend route under /api/v1/print, so strip trailing /api/v1 if present.\n return trimmed.replace(/\\/api\\/v1$/i, \"\");\n }, []);\n\n // Fetch metadata\n const {\n schema,\n isLoading: metaLoading,\n error: metaError,\n } = useDocTypeMeta(doctype);\n\n // Fetch document if editing\n const { result: existingDoc, query } = useOne({\n resource: doctype,\n id: id ?? \"\",\n queryOptions: { enabled: isEditing },\n });\n const docError = query?.error as Error | null | undefined;\n\n // Mutations\n const createMutation = useCreate();\n const updateMutation = useUpdate();\n\n // Workflow actions\n const { state: workflowState } = useWorkflowActions(doctype, id, {\n enabled: isEditing,\n });\n\n // Form data state\n const [formData, setFormData] = useState<Record<string, unknown>>({});\n const [errors, setErrors] = useState<string[]>([]);\n const [notices, setNotices] = useState<string[]>([]);\n const [printFormatName, setPrintFormatName] = useState(\"\");\n\n const addError = useCallback((message: string) => {\n setErrors(prev => [...prev, message]);\n }, []);\n\n const addNotice = useCallback((message: string) => {\n setNotices(prev => [...prev, message]);\n }, []);\n\n const dismissNotice = useCallback((index: number) => {\n setNotices(prev => prev.filter((_, i) => i !== index));\n }, []);\n\n // Initialize form with existing doc\n useEffect(() => {\n if (existingDoc && Object.keys(formData).length === 0) {\n setFormData(existingDoc as Record<string, unknown>);\n }\n }, [existingDoc, formData]);\n\n // Run onLoad client scripts\n useEffect(() => {\n const scripts = getClientScripts(doctype, \"onLoad\");\n for (const script of scripts) {\n try {\n script.handler({\n doc: formData,\n setValue: (field, value) =>\n setFormData(prev => ({ ...prev, [field]: value })),\n getValue: field => formData[field],\n setRequired: () => {},\n setHidden: () => {},\n setReadOnly: () => {},\n showAlert: (message, type) => {\n if (type === \"error\") {\n addError(message);\n return;\n }\n addNotice(message);\n },\n user: { id: \"\", email: \"\", roles: [] },\n });\n } catch (err) {\n console.error(\"Client script error:\", err);\n }\n }\n }, [addError, addNotice, doctype, formData]);\n\n // Handle form change\n const handleChange = useCallback((data: unknown) => {\n setFormData(data as Record<string, unknown>);\n setErrors([]);\n setNotices([]);\n }, []);\n\n // Handle save\n const handleSave = useCallback(async () => {\n // Run validate scripts\n const validateScripts = getClientScripts(doctype, \"validate\");\n for (const script of validateScripts) {\n try {\n script.handler({\n doc: formData,\n setValue: (field, value) =>\n setFormData(prev => ({ ...prev, [field]: value })),\n getValue: field => formData[field],\n setRequired: () => {},\n setHidden: () => {},\n setReadOnly: () => {},\n showAlert: addError,\n user: { id: \"\", email: \"\", roles: [] },\n });\n } catch (err) {\n setErrors([(err as Error).message]);\n return;\n }\n }\n\n try {\n if (isEditing) {\n updateMutation.mutate(\n { resource: doctype, id: id ?? \"\", values: formData },\n {\n onSuccess: () => {\n // Run afterSave scripts\n const afterScripts = getClientScripts(doctype, \"afterSave\");\n for (const script of afterScripts) {\n script.handler({\n doc: formData,\n setValue: () => {},\n getValue: field => formData[field],\n setRequired: () => {},\n setHidden: () => {},\n setReadOnly: () => {},\n showAlert: addNotice,\n user: { id: \"\", email: \"\", roles: [] },\n });\n }\n // Navigate to list page after successful update\n navigate(`/app/${doctype}/list`);\n },\n onError: err => setErrors([err.message]),\n },\n );\n } else {\n createMutation.mutate(\n { resource: doctype, values: formData },\n {\n onSuccess: () => {\n // Navigate to list page after successful create\n navigate(`/app/${doctype}/list`);\n },\n onError: err => setErrors([err.message]),\n },\n );\n }\n } catch (err) {\n setErrors([(err as Error).message]);\n }\n }, [\n doctype,\n id,\n isEditing,\n formData,\n addError,\n addNotice,\n createMutation,\n updateMutation,\n navigate,\n ]);\n\n // Handle cancel\n const handleCancel = useCallback(() => {\n navigate(`/app/${doctype}/list`);\n }, [navigate, doctype]);\n\n const openPrintPreview = useCallback(() => {\n if (!id) return;\n\n const base = getApiOrigin(apiUrl);\n const params = new URLSearchParams({ format: \"html\" });\n if (printFormatName.trim()) {\n params.set(\"print_format\", printFormatName.trim());\n }\n\n const url = `${base}/api/v1/print/${encodeURIComponent(doctype)}/${encodeURIComponent(id)}?${params.toString()}`;\n globalThis.open(url, \"_blank\", \"noopener,noreferrer\");\n }, [apiUrl, doctype, getApiOrigin, id, printFormatName]);\n\n const downloadPrintPdf = useCallback(async () => {\n if (!id) return;\n\n const base = getApiOrigin(apiUrl);\n const params = new URLSearchParams({\n format: \"pdf\",\n disposition: \"attachment\",\n strict_pdf: \"true\",\n });\n if (printFormatName.trim()) {\n params.set(\"print_format\", printFormatName.trim());\n }\n\n const url = `${base}/api/v1/print/${encodeURIComponent(doctype)}/${encodeURIComponent(id)}?${params.toString()}`;\n\n try {\n const response = await fetch(url, { credentials: \"include\" });\n if (!response.ok) {\n const payload = (await response.json().catch(() => ({}))) as {\n error?: string;\n detail?: string;\n };\n throw new Error(\n payload.detail ||\n payload.error ||\n `Failed to download PDF (${response.status})`,\n );\n }\n\n const contentType = response.headers.get(\"content-type\") || \"\";\n if (!contentType.includes(\"application/pdf\")) {\n throw new Error(\n \"PDF generation unavailable. Please ensure PDF service is running.\",\n );\n }\n\n const blob = await response.blob();\n const downloadUrl = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = downloadUrl;\n anchor.download = `${doctype}_${id}.pdf`;\n document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n URL.revokeObjectURL(downloadUrl);\n } catch (err) {\n setErrors([\n err instanceof Error ? err.message : \"Failed to download PDF\",\n ]);\n }\n }, [apiUrl, doctype, getApiOrigin, id, printFormatName]);\n\n // Format title\n const docNameValue = formData.name;\n const displayName =\n typeof docNameValue === \"string\" || typeof docNameValue === \"number\"\n ? String(docNameValue)\n : (id ?? \"\");\n\n const title = isEditing\n ? `Edit ${doctype.replaceAll(\"_\", \" \")}: ${displayName}`\n : `New ${doctype.replaceAll(\"_\", \" \")}`;\n\n // Loading state\n if (metaLoading || (isEditing && query?.isLoading)) {\n return (\n <div\n style={{\n padding: \"2rem\",\n backgroundColor: \"var(--color-bg)\",\n minHeight: \"100vh\",\n }}\n >\n <div style={{ color: \"var(--color-text-secondary)\" }}>Loading...</div>\n </div>\n );\n }\n\n // Error state\n if (metaError) {\n return (\n <div\n style={{\n padding: \"2rem\",\n backgroundColor: \"var(--color-bg)\",\n minHeight: \"100vh\",\n }}\n >\n <div style={{ color: \"var(--color-error)\" }}>\n Error: {metaError.message}\n </div>\n </div>\n );\n }\n\n if (isEditing && docError) {\n return (\n <div\n style={{\n padding: \"2rem\",\n backgroundColor: \"var(--color-bg)\",\n minHeight: \"100vh\",\n }}\n >\n <div\n style={{\n color: \"var(--color-error)\",\n backgroundColor: \"var(--color-error-bg)\",\n border: \"1px solid var(--color-error-border)\",\n padding: \"0.75rem 1rem\",\n borderRadius: \"4px\",\n }}\n role=\"alert\"\n >\n {docError.message || `Failed to load ${doctype}.`}\n </div>\n </div>\n );\n }\n\n const isSaving =\n createMutation.mutation.isPending || updateMutation.mutation.isPending;\n\n let submitLabel = \"Create\";\n if (isSaving) {\n submitLabel = \"Saving...\";\n } else if (isEditing) {\n submitLabel = \"Save\";\n }\n\n return (\n <div\n style={{\n padding: \"1.5rem\",\n maxWidth: \"900px\",\n backgroundColor: \"var(--color-bg)\",\n minHeight: \"100vh\",\n }}\n >\n {/* Header */}\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: \"1.5rem\",\n }}\n >\n <h1\n style={{ margin: 0, fontSize: \"1.5rem\", color: \"var(--color-text)\" }}\n >\n {title}\n </h1>\n\n {/* Workflow Actions */}\n {isEditing && workflowState && (\n <WorkflowActions\n doctype={doctype}\n id={id}\n showState\n onActionComplete={() => query?.refetch?.()}\n />\n )}\n </div>\n\n {/* Plugin slot for form header */}\n <Slot name=\"form-header\" doctype={doctype} data={formData} id={id} />\n\n {/* Validation Errors */}\n {errors.length > 0 && (\n <div\n style={{\n marginBottom: \"1rem\",\n padding: \"0.75rem 1rem\",\n backgroundColor: \"var(--color-error-bg)\",\n border: \"1px solid var(--color-error-border)\",\n borderRadius: \"4px\",\n }}\n >\n {errors.map((error, i) => (\n <div key={`${error}-${i}`} style={{ color: \"var(--color-error)\" }}>\n {error}\n </div>\n ))}\n </div>\n )}\n\n {notices.length > 0 && (\n <div style={{ marginBottom: \"1rem\" }}>\n {notices.map((notice, index) => (\n <AlertBanner\n key={`${notice}-${index}`}\n message={notice}\n variant=\"info\"\n onDismiss={() => dismissNotice(index)}\n />\n ))}\n </div>\n )}\n\n {/* Form */}\n {schema && (\n <AutoForm\n schema={schema as unknown as import(\"@rjsf/utils\").RJSFSchema}\n formData={formData}\n onChange={handleChange}\n onSubmit={handleSave}\n hideSubmitButton\n />\n )}\n\n {/* Plugin slot for form footer */}\n <Slot name=\"form-footer\" doctype={doctype} data={formData} id={id} />\n\n {/* Actions */}\n <div\n style={{\n marginTop: \"1.5rem\",\n paddingTop: \"1rem\",\n borderTop: \"1px solid var(--color-border)\",\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"0.5rem\",\n }}\n >\n <button\n onClick={handleSave}\n disabled={isSaving}\n style={{\n padding: \"0.75rem 1.5rem\",\n backgroundColor: \"var(--color-primary)\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n cursor: isSaving ? \"wait\" : \"pointer\",\n fontWeight: 500,\n opacity: isSaving ? 0.6 : 1,\n }}\n >\n {submitLabel}\n </button>\n\n <button\n onClick={handleCancel}\n style={{\n padding: \"0.75rem 1.5rem\",\n backgroundColor: \"var(--color-bg-secondary)\",\n color: \"var(--color-text)\",\n border: \"1px solid var(--color-border)\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n }}\n >\n Cancel\n </button>\n\n {isEditing && (\n <>\n <input\n value={printFormatName}\n onChange={event => setPrintFormatName(event.target.value)}\n placeholder=\"Print format (optional)\"\n style={{ minWidth: \"200px\" }}\n />\n <button\n onClick={openPrintPreview}\n style={{\n padding: \"0.75rem 1rem\",\n backgroundColor: \"var(--color-bg-secondary)\",\n color: \"var(--color-text)\",\n border: \"1px solid var(--color-border)\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n }}\n >\n Print Preview\n </button>\n <button\n onClick={downloadPrintPdf}\n style={{\n padding: \"0.75rem 1rem\",\n backgroundColor: \"var(--color-bg-secondary)\",\n color: \"var(--color-text)\",\n border: \"1px solid var(--color-border)\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n }}\n >\n Download PDF\n </button>\n </>\n )}\n\n {/* Plugin slot for custom action buttons */}\n <Slot name=\"form-actions\" doctype={doctype} data={formData} id={id} />\n </div>\n </div>\n );\n}\n\nexport default FormView;\n","/**\n * Login Page Component\n *\n * Login page for Indie/BFF mode (cookie auth).\n * Per checklist 4.4: Route /login with useLogin hook.\n * Supports OAuth social login when providers are configured.\n */\n\nimport { useState, type FormEvent } from \"react\";\nimport { useLogin } from \"@refinedev/core\";\n\n// OAuth provider display config\nconst OAUTH_PROVIDERS: Record<\n string,\n { label: string; bgColor: string; textColor: string; icon: string }\n> = {\n google: {\n label: \"Continue with Google\",\n bgColor: \"#fff\",\n textColor: \"#333\",\n icon: \"G\",\n },\n github: {\n label: \"Continue with GitHub\",\n bgColor: \"#24292e\",\n textColor: \"#fff\",\n icon: \"GH\",\n },\n microsoft: {\n label: \"Continue with Microsoft\",\n bgColor: \"#0078d4\",\n textColor: \"#fff\",\n icon: \"MS\",\n },\n};\n\nfunction getProviderUiConfig(provider: string): {\n label: string;\n bgColor: string;\n textColor: string;\n icon: string;\n border: string;\n} {\n const known = OAUTH_PROVIDERS[provider];\n if (known) {\n return {\n ...known,\n border: provider === \"google\" ? \"1px solid #ccc\" : \"none\",\n };\n }\n\n return {\n label: `Continue with ${provider}`,\n bgColor: \"#f5f5f5\",\n textColor: \"#333\",\n icon: \"ID\",\n border: \"1px solid #ddd\",\n };\n}\n\nfunction resolveConfiguredProviders(): string[] {\n const configGlobal = globalThis as typeof globalThis & {\n __FRAMEWORK_CONFIG__?: {\n auth?: {\n oauth?: {\n providers?: string[] | Record<string, unknown>;\n };\n };\n };\n };\n\n const rawProviders =\n configGlobal.__FRAMEWORK_CONFIG__?.auth?.oauth?.providers;\n\n if (Array.isArray(rawProviders)) {\n return rawProviders.filter(\n (provider): provider is string => typeof provider === \"string\",\n );\n }\n\n if (rawProviders && typeof rawProviders === \"object\") {\n return Object.keys(rawProviders);\n }\n\n return [];\n}\n\n/**\n * LoginPage props\n */\nexport interface LoginPageProps {\n /** Title to display */\n title?: string;\n /** Logo URL or component */\n logo?: string | React.ReactNode;\n /** Redirect URL after login */\n redirectTo?: string;\n}\n\n/**\n * LoginPage Component\n *\n * Simple login form using Refine's useLogin hook.\n * For Indie/BFF cookie-based authentication.\n *\n * @example\n * ```tsx\n * <Route path=\"/login\" element={<LoginPage />} />\n * ```\n */\nexport function LoginPage({\n title = \"Sign In\",\n logo,\n redirectTo,\n}: Readonly<LoginPageProps>) {\n const { mutate: login, status } = useLogin();\n const [error, setError] = useState<string | null>(null);\n\n const isLoading = status === \"pending\";\n\n // Detect configured OAuth providers from server-injected config\n const configuredProviders = resolveConfiguredProviders();\n\n const handleSubmit = (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n setError(null);\n\n const formData = new FormData(e.currentTarget);\n const email = formData.get(\"email\") as string;\n const password = formData.get(\"password\") as string;\n\n login(\n { email, password, redirectTo },\n {\n onSuccess: result => {\n if (result && \"success\" in result && result.success === false) {\n const message =\n result.error?.message ||\n \"Login failed. Please check your credentials.\";\n setError(message);\n }\n },\n onError: err => {\n setError(err.message || \"Login failed. Please try again.\");\n },\n },\n );\n };\n\n const handleOAuthLogin = (provider: string) => {\n globalThis.location.href = `/api/v1/auth/oauth/${provider}/start`;\n };\n\n return (\n <div\n style={{\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n minHeight: \"100vh\",\n backgroundColor: \"#f5f5f5\",\n }}\n >\n <div\n style={{\n width: \"100%\",\n maxWidth: \"400px\",\n padding: \"2rem\",\n backgroundColor: \"white\",\n borderRadius: \"8px\",\n boxShadow: \"0 2px 8px rgba(0,0,0,0.1)\",\n }}\n >\n {/* Logo */}\n {logo && (\n <div style={{ textAlign: \"center\", marginBottom: \"1.5rem\" }}>\n {typeof logo === \"string\" ? (\n <img src={logo} alt=\"Logo\" style={{ maxHeight: \"48px\" }} />\n ) : (\n logo\n )}\n </div>\n )}\n\n {/* Title */}\n <h1\n style={{\n margin: \"0 0 1.5rem\",\n fontSize: \"1.5rem\",\n textAlign: \"center\",\n color: \"#333\",\n }}\n >\n {title}\n </h1>\n\n {/* OAuth Social Login Buttons */}\n {configuredProviders.length > 0 && (\n <div style={{ marginBottom: \"1.5rem\" }}>\n {configuredProviders.map(provider => {\n const cfg = getProviderUiConfig(provider);\n return (\n <button\n key={provider}\n type=\"button\"\n id={`oauth-btn-${provider}`}\n onClick={() => handleOAuthLogin(provider)}\n style={{\n width: \"100%\",\n padding: \"0.75rem\",\n marginBottom: \"0.5rem\",\n backgroundColor: cfg.bgColor,\n color: cfg.textColor,\n border: cfg.border,\n borderRadius: \"4px\",\n fontSize: \"0.95rem\",\n fontWeight: 500,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"0.5rem\",\n }}\n >\n <span style={{ fontWeight: 700, opacity: 0.8 }}>\n {cfg.icon}\n </span>\n {cfg.label}\n </button>\n );\n })}\n\n {/* Divider */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n marginTop: \"1rem\",\n marginBottom: \"0.5rem\",\n }}\n >\n <div\n style={{ flex: 1, height: \"1px\", backgroundColor: \"#e0e0e0\" }}\n />\n <span style={{ color: \"#999\", fontSize: \"0.85rem\" }}>or</span>\n <div\n style={{ flex: 1, height: \"1px\", backgroundColor: \"#e0e0e0\" }}\n />\n </div>\n </div>\n )}\n\n {/* Error message */}\n {error && (\n <div\n style={{\n marginBottom: \"1rem\",\n padding: \"0.75rem\",\n backgroundColor: \"#fff2f0\",\n border: \"1px solid #ffccc7\",\n borderRadius: \"4px\",\n color: \"#ff4d4f\",\n fontSize: \"0.875rem\",\n }}\n >\n {error}\n </div>\n )}\n\n {/* Login Form */}\n <form onSubmit={handleSubmit}>\n <div style={{ marginBottom: \"1rem\" }}>\n <label\n htmlFor=\"email\"\n style={{\n display: \"block\",\n marginBottom: \"0.25rem\",\n fontWeight: 500,\n color: \"#333\",\n }}\n >\n Email\n </label>\n <input\n id=\"email\"\n name=\"email\"\n type=\"email\"\n required\n autoComplete=\"email\"\n placeholder=\"you@example.com\"\n style={{\n width: \"100%\",\n padding: \"0.75rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n fontSize: \"1rem\",\n boxSizing: \"border-box\",\n }}\n />\n </div>\n\n <div style={{ marginBottom: \"1.5rem\" }}>\n <label\n htmlFor=\"password\"\n style={{\n display: \"block\",\n marginBottom: \"0.25rem\",\n fontWeight: 500,\n color: \"#333\",\n }}\n >\n Password\n </label>\n <input\n id=\"password\"\n name=\"password\"\n type=\"password\"\n required\n autoComplete=\"current-password\"\n placeholder=\"••••••••\"\n style={{\n width: \"100%\",\n padding: \"0.75rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n fontSize: \"1rem\",\n boxSizing: \"border-box\",\n }}\n />\n </div>\n\n <button\n type=\"submit\"\n disabled={isLoading}\n style={{\n width: \"100%\",\n padding: \"0.75rem\",\n backgroundColor: \"#1890ff\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n fontSize: \"1rem\",\n fontWeight: 500,\n cursor: isLoading ? \"wait\" : \"pointer\",\n opacity: isLoading ? 0.6 : 1,\n }}\n >\n {isLoading ? \"Signing in...\" : \"Sign In\"}\n </button>\n </form>\n\n {/* Footer */}\n <div\n style={{\n marginTop: \"1.5rem\",\n textAlign: \"center\",\n fontSize: \"0.875rem\",\n color: \"#666\",\n }}\n >\n <a\n href=\"/forgot-password\"\n style={{ color: \"#1890ff\", textDecoration: \"none\" }}\n >\n Forgot password?\n </a>\n </div>\n </div>\n </div>\n );\n}\n\nexport default LoginPage;\n","/**\n * Auth Configuration Types\n *\n * Per checklist 4.1: Auth configuration via window.__FRAMEWORK_CONFIG__\n */\n\n/**\n * OIDC configuration for client-side PKCE flow\n */\nexport interface OIDCConfig {\n /** OIDC authority URL */\n authority: string;\n /** Client ID */\n clientId: string;\n /** Redirect URI after auth */\n redirectUri: string;\n /** Post-logout redirect URI */\n postLogoutRedirectUri?: string;\n /** Scopes to request */\n scope?: string;\n}\n\n/**\n * Auth strategy type\n * - \"cookie\": Indie/BFF mode with HttpOnly cookies\n * - \"oidc\": Client-side PKCE with OIDC provider\n */\nexport type AuthStrategy = \"cookie\" | \"oidc\";\n\n/**\n * Framework auth configuration\n */\nexport interface AuthConfig {\n /** Auth strategy */\n authStrategy: AuthStrategy;\n /** Login URL for cookie mode (redirect on 401) */\n loginUrl?: string;\n /** OIDC config for oidc mode */\n oidcConfig?: OIDCConfig;\n}\n\n/**\n * Get auth config from window or defaults\n */\nexport function getAuthConfig(): AuthConfig {\n const config = (window as unknown as { __FRAMEWORK_CONFIG__?: { auth?: AuthConfig } }).__FRAMEWORK_CONFIG__?.auth;\n \n return {\n authStrategy: config?.authStrategy ?? \"cookie\",\n loginUrl: config?.loginUrl ?? \"/login\",\n oidcConfig: config?.oidcConfig,\n };\n}\n"],"names":["API_URL","_a","META_URL","WS_URL","FrameworkApiError","message","status","code","details","__publicField","buildActionPermissionMessage","action","resource","backendMessage","normalizedResource","base","buildPaginationParams","pagination","params","current","pageSize","buildSortingParams","sorters","sorter","order","filterValueToString","value","buildFilterParams","filters","filter","op","valueStr","buildQueryString","searchParams","key","fetchWithCredentials","url","options","context","response","payload","frameworkMDataProvider","query","queryString","id","variables","ids","method","headers","fullUrl","authProvider","email","password","error","user","identityId","identityName","identityEmail","connections","subscriptions","getConnection","channel","ws","wsUrl","event","data","callbacks","callback","err","maybeCloseConnection","liveProvider","types","channelName","filteredCallback","unsubscribeFn","type","apiUrl","closeAllConnections","normalizeArrayItems","props","rawItem","fallbackIndex","item","index","content","isValidElement","targetIndex","handler","FieldTemplate","label","required","description","errors","children","hidden","displayLabel","uiSchema","formData","floatingLabel","hasValue","jsxs","jsx","ObjectFieldTemplate","title","properties","prop","ArrayFieldTemplate","canAdd","onAddClick","extendedProps","detailIndex","setDetailIndex","useState","dragIndex","setDragIndex","pasteText","setPasteText","pasteError","setPasteError","items","useMemo","rawFormData","rows","replaceArray","arrayFieldName","_b","parsed","BaseInputTemplate","disabled","readonly","onChange","onBlur","onFocus","placeholder","e","TextWidget","CheckboxWidget","SelectWidget","enumOptions","opt","DateWidget","TextareaWidget","customWidgets","customTemplates","replaceArrayFieldInData","source","fieldName","root","normalizeNullablePropertySchema","property","normalized","typeValue","nonNullTypes","t","anyOfValue","nonNullSchemas","nonNullSchema","merged","normalizeNullableObjectSchema","schema","normalizedProperties","AutoForm","onSubmit","onError","hideSubmitButton","submitText","className","normalizedSchema","handleChange","handleSubmit","formContext","formProps","validator","Form","useDebounce","delay","debouncedValue","setDebouncedValue","useEffect","timer","LinkWidget","linkedDoctype","inputValue","setInputValue","searchResults","setSearchResults","isOpen","setIsOpen","isLoading","setIsLoading","debouncedSearch","fetchOptions","useCallback","search","handleSelect","option","handleInputChange","newValue","generateColumnsFromSchema","columns","getValue","AutoTable","customColumns","enableSelection","onSelectionChange","onRowClick","sorting","setSorting","rowSelection","setRowSelection","setPagination","result","useList","tableData","totalCount","queryError","focusCell","rowIndex","colIndex","tableElement","selector","target","handleCellKeyDown","columnsWithSelection","table","row","useReactTable","r","updater","newSelection","selectedIds","selectedRows","rowId","getCoreRowModel","getSortedRowModel","getPaginationRowModel","headerGroup","header","flexRender","cell","EditableCell","field","onSaveSuccess","renderValue","isEditing","setIsEditing","editValue","setEditValue","setError","inputRef","useRef","updateMutation","useUpdate","handleClick","handleCancel","handleBlur","handleKeyDown","isSaving","ConfirmDialog","open","confirmLabel","cancelLabel","destructive","onConfirm","onCancel","titleId","styles","AlertBanner","variant","onDismiss","palette","Fragment","commonStyle","BulkActionsBar","selectedCount","onDelete","onExportJson","onExportCsv","onBulkUpdate","updateFields","onClear","showUpdateMenu","setShowUpdateMenu","selectedField","setSelectedField","updateValue","setUpdateValue","isDeleteConfirmOpen","setIsDeleteConfirmOpen","handleUpdate","handleDelete","buttonStyle","f","_c","o","STATE_COLORS","getStateColor","state","normalizedState","StateBadge","docstatus","style","displayState","colors","fetchWorkflowActions","doctype","executeTransition","useWorkflowActions","queryClient","useQueryClient","isExecuting","setIsExecuting","enabled","refetch","useQuery","executeAction","actionName","ACTION_COLORS","getActionColor","WorkflowActions","showState","onActionComplete","actions","handleAction","allowedActions","a","registry","getSlotComponents","slotName","slots","s","getResources","Slot","name","slotRegistrations","registration","Component","BUILTIN_COMMANDS","CommandPalette","onClose","setQuery","selectedIndex","setSelectedIndex","doctypes","setDoctypes","go","useGo","fetchDoctypes","dt","documentItems","doc","d","newCommands","searchTerm","filteredItems","lowerQuery","cmd","executeCommand","i","idx","Menu","logout","useLogout","menuItems","useMenu","NavLink","Breadcrumb","breadcrumbs","useBreadcrumb","breadcrumb","Link","Layout","fetchDocTypeMeta","useDocTypeMeta","meta","usePrefetchDocTypeMeta","useDocTypes","setDocTypes","fetchDocTypes","resources","useInlineEdit","editingCell","setEditingCell","startEdit","cancelEdit","saveEdit","resolve","reject","errorMsg","useBulkActions","onSuccess","setSelectedIds","deleteMutation","useDeleteMany","useUpdateMany","selectedItems","isAllSelected","isSomeSelected","selectRow","prev","deselectRow","next","toggleRow","selectAll","deselectAll","toggleAll","isSelected","bulkDelete","bulkUpdate","values","exportAsJson","blob","exportAsCsv","fields","val","str","csv","useCommandPalette","close","toggle","useTranslation","namespace","i18n","ready","useI18nTranslation","lng","uiMetaCache","resolveMetaBaseUrl","baseUrl","trimmed","useUIMeta","uiContext","cacheKey","uiMeta","setUiMeta","fetchMeta","viewRegistry","doctypeViews","registerView","getViewComponent","getRegisteredViews","getViewRegistration","setDocTypeViews","views","getDocTypeViews","isViewAvailable","viewType","QuickEditModal","titleField","descField","groupField","onSaved","setTitle","desc","setDesc","setStatus","saving","setSaving","updateItem","handleSave","col","KanbanView","config","dragState","setDragState","dragOverColumn","setDragOverColumn","editingItem","setEditingItem","seen","discovered","COLUMN_COLORS","groupedItems","groups","first","handleDrop","targetColumnId","j","column","isOver","isDragging","getDaysInMonth","year","month","days","date","CalendarView","startField","currentDate","setCurrentDate","startOfMonth","endOfMonth","eventsByDay","dateStr","prevMonth","nextMonth","today","monthName","weekDays","firstDayOffset","btnStyle","day","_","events","isToday","getDateRange","tasks","endField","minDate","maxDate","task","start","end","getDaysBetween","GanttView","nameField","progressField","totalDays","dayHeaders","rowHeight","dayWidth","taskStart","taskEnd","startOffset","duration","progress","BASE_URL","__vite_import_meta_env__","fetchTree","res","reparentNode","nodeId","newParent","updateNode","addChildNode","parentId","InlineInput","initialValue","setValue","ref","TreeNodeRow","node","depth","onRefresh","dragNodeId","onDragStart","onDrop","collapsed","setCollapsed","renaming","setRenaming","addingChild","setAddingChild","isDropTarget","setIsDropTarget","handleRename","newLabel","handleAddChild","hasChildren","toggleGlyph","c","child","TreeView","setState","setDragNodeId","addingRoot","setAddingRoot","load","tree","targetId","handleAddRoot","isDebugEnabled","globalFlag","processRef","envFlag","configLogger","configStore","clientScripts","registerConfig","existing","mergeConfigs","override","mergeFormConfigs","mergeListConfigs","getConfig","getFormConfig","getListConfig","getFieldConfig","registerClientScript","script","getClientScripts","loadConfigFromUrl","clearConfigs","useConfig","useFormConfig","useListConfig","useFieldConfig","WorkspaceSection","workspace","isExpanded","setIsExpanded","handleItemClick","toSchemaFields","getStringEnums","v","isSelectOrLinkField","format","rawFieldType","fieldType","pickFirst","ListView","propDoctype","propView","useParams","navigate","useNavigate","location","useLocation","identity","useGetIdentity","isAuthenticated","metaLoading","metaError","searchQuery","setSearchQuery","uiError","setUiError","setSelectedRows","schemaFields","pathView","detectedParentField","fromMeta","detectedLabelField","groupFieldCandidates","metaKanban","kanbanGroupField","kanbanColumns","kanbanTitleField","kanbanDescriptionField","canKanban","canTree","activeView","requested","setActiveView","view","handleRowClick","handleNew","invalidate","useInvalidate","handleBulkDelete","confirmBulkDelete","FormView","propId","useApiUrl","getApiOrigin","rawApiUrl","existingDoc","useOne","docError","createMutation","useCreate","workflowState","setFormData","setErrors","notices","setNotices","printFormatName","setPrintFormatName","addError","addNotice","dismissNotice","scripts","validateScripts","afterScripts","openPrintPreview","downloadPrintPdf","downloadUrl","anchor","docNameValue","displayName","submitLabel","notice","OAUTH_PROVIDERS","getProviderUiConfig","provider","known","resolveConfiguredProviders","rawProviders","LoginPage","logo","redirectTo","login","useLogin","configuredProviders","handleOAuthLogin","cfg","getAuthConfig"],"mappings":";;;;;;;;;;;;;AAkCO,MAAMA,IACV,OAAO,aAAe,SACpBC,KAAA,WAAmB,yBAAnB,gBAAAA,GAAyC,eAC5C;;AAEK,MAAMC,KACV,OAAO,aAAe,SACpBD,KAAA,WAAmB,yBAAnB,gBAAAA,GAAyC,gBAC5C;;AAEK,MAAME,KACV,OAAO,aAAe,SACpBF,KAAA,WAAmB,yBAAnB,gBAAAA,GAAyC,cAC5C;ACdF,MAAMG,WAA0B,MAAM;AAAA,EAKpC,YACEC,GACAC,GACAC,GACAC,GACA;AACA,UAAMH,CAAO;AAVf,IAAAI,GAAA;AACA,IAAAA,GAAA;AACA,IAAAA,GAAA;AASE,SAAK,OAAO,qBACZ,KAAK,SAASH,GACd,KAAK,OAAOC,GACZ,KAAK,UAAUC;AAAA,EACjB;AACF;AAEA,SAASE,GACPJ,GACAK,GACAC,GACAC,GACQ;AACR,QAAMC,IAAqBF,IACvBA,EAAS,QAAQ,MAAM,GAAG,IAC1B;AAEJ,MAAIN,MAAW;AACb,WAAOO,KAAkB;AAG3B,MAAIP,MAAW,KAAK;AAElB,UAAMS,IAAO,8BADMJ,KAAU,wBACwB,IAAIG,CAAkB;AAC3E,WACED,KACA,CAACA,EAAe,cAAc,SAAS,yBAAyB,IAEzD,GAAGE,CAAI,IAAIF,CAAc,KAE3BE;AAAA,EACT;AAEA,SACEF,KACA,mBAAmBP,CAAM,qBAAqBK,KAAU,QAAQ,IAAIG,CAAkB;AAE1F;AAKA,SAASE,GACPC,GACiB;AACjB,QAAMC,IAAS,IAAI,gBAAA;AACnB,MAAI,CAACD,EAAY,QAAOC;AAExB,QAAMC,IAAUF,EAAW,WAAW,GAChCG,IAAWH,EAAW,YAAY;AACxC,SAAAC,EAAO,IAAI,SAAS,OAAOE,CAAQ,CAAC,GACpCF,EAAO,IAAI,UAAU,QAAQC,IAAU,KAAKC,CAAQ,CAAC,GAC9CF;AACT;AAKA,SAASG,GACPC,GACiB;AACjB,QAAMJ,IAAS,IAAI,gBAAA;AACnB,MAAI,CAACI,KAAWA,EAAQ,WAAW,EAAG,QAAOJ;AAE7C,QAAMK,IAASD,EAAQ,CAAC,GAClBE,IAAQD,EAAO,UAAU,SAAS,MAAM;AAC9C,SAAAL,EAAO,IAAI,YAAY,GAAGM,CAAK,GAAGD,EAAO,KAAK,EAAE,GACzCL;AACT;AAKA,SAASO,GAAoBC,GAAwB;AACnD,SAAIA,KAAU,OAAoC,KAC9C,OAAOA,KAAU,WAAiBA,IAClC,OAAOA,KAAU,YACjB,OAAOA,KAAU,YAAkB,OAAOA,CAAK,IAC5C,KAAK,UAAUA,CAAK;AAC7B;AAKA,SAASC,GACPC,GAGiB;AACjB,QAAMV,IAAS,IAAI,gBAAA;AACnB,MAAI,CAACU,KAAWA,EAAQ,WAAW,EAAG,QAAOV;AAE7C,aAAWW,KAAUD,GAAS;AAC5B,QAAI,EAAE,WAAWC,MAAW,CAACA,EAAO,SAASA,EAAO,UAAU;AAC5D;AAGF,UAAMC,IAAKD,EAAO,YAAY,MACxBE,IAAWN,GAAoBI,EAAO,KAAK;AAEjD,IAAIC,MAAO,OACTZ,EAAO,IAAIW,EAAO,OAAOE,CAAQ,IAGjCb,EAAO,IAAI,GAAGW,EAAO,KAAK,IAAIC,CAAE,KAAKC,CAAQ;AAAA,EAEjD;AACA,SAAOb;AACT;AAKA,SAASc,GAAiBd,GAA+B;AACvD,QAAMe,IAAe,IAAI,gBAAA;AAMzB,SAHyBjB;AAAA,IACvBE,EAAO;AAAA,EAAA,EAEQ,QAAQ,CAACQ,GAAOQ,MAAQD,EAAa,IAAIC,GAAKR,CAAK,CAAC,GAG/CL,GAAmBH,EAAO,OAAO,EACzC,QAAQ,CAACQ,GAAOQ,MAAQD,EAAa,IAAIC,GAAKR,CAAK,CAAC,GAG7CC,GAAkBT,EAAO,OAAO,EACxC,QAAQ,CAACQ,GAAOQ,MAAQD,EAAa,IAAIC,GAAKR,CAAK,CAAC,GAE1DO,EAAa,SAAA;AACtB;AAKA,eAAeE,EACbC,GACAC,IAAuB,CAAA,GACvBC,GACY;AACZ,QAAMC,IAAW,MAAM,MAAMH,GAAK;AAAA,IAChC,GAAGC;AAAA,IACH,aAAa;AAAA;AAAA,IACb,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,GAAGA,EAAQ;AAAA,IAAA;AAAA,EACb,CACD;AAED,MAAI,CAACE,EAAS,IAAI;AAChB,UAAMC,IAAW,MAAMD,EACpB,OACA,MAAM,OAAO,EAAE,QAAQA,EAAS,WAAA,EAAa,GAE1C1B,IACH,OAAO2B,EAAQ,WAAY,YAAYA,EAAQ,WAC/C,OAAOA,EAAQ,UAAW,YAAYA,EAAQ,UAC/CD,EAAS,YAELlC,IAAUK;AAAA,MACd6B,EAAS;AAAA,MACTD,KAAA,gBAAAA,EAAS;AAAA,MACTA,KAAA,gBAAAA,EAAS;AAAA,MACTzB;AAAA,IAAA;AAGF,UAAM,IAAIT;AAAA,MACRC;AAAA,MACAkC,EAAS;AAAA,MACT,OAAOC,EAAQ,SAAU,WAAWA,EAAQ,QAAQ;AAAA,MACpDA,EAAQ;AAAA,IAAA;AAAA,EAEZ;AAGA,SAAID,EAAS,WAAW,MACf,CAAA,IAGFA,EAAS,KAAA;AAClB;AAKO,MAAME,KAAuC;AAAA;AAAA;AAAA;AAAA,EAIlD,SAAS,OACPvB,MACoC;AACpC,UAAM,EAAE,UAAAN,MAAaM,GACfwB,IAAQV,GAAiBd,CAAM,GAC/ByB,IAAcD,IAAQ,IAAIA,CAAK,KAAK,IACpCN,IAAM,GAAGpC,CAAO,IAAIY,CAAQ,GAAG+B,CAAW,IAE1CJ,IAAW,MAAMJ;AAAA,MACrBC;AAAA,MACA,CAAA;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,UAAAxB;AAAA,MAAA;AAAA,IACF;AAGF,WAAO;AAAA,MACL,MAAM2B,EAAS;AAAA,MACf,OAAOA,EAAS;AAAA,IAAA;AAAA,EAEpB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,OACNrB,MACmC;AACnC,UAAM,EAAE,UAAAN,GAAU,IAAAgC,EAAA,IAAO1B,GACnBkB,IAAM,GAAGpC,CAAO,IAAIY,CAAQ,IAAIgC,CAAE;AAWxC,WAAO,EAAE,MATI,MAAMT;AAAA,MACjBC;AAAA,MACA,CAAA;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,UAAAxB;AAAA,MAAA;AAAA,IACF,EAGO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,OACNM,MACmC;AACnC,UAAM,EAAE,UAAAN,GAAU,WAAAiC,EAAA,IAAc3B,GAC1BkB,IAAM,GAAGpC,CAAO,IAAIY,CAAQ;AAclC,WAAO,EAAE,MAZI,MAAMuB;AAAA,MACjBC;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,MAAM,KAAK,UAAUS,CAAS;AAAA,MAAA;AAAA,MAEhC;AAAA,QACE,QAAQ;AAAA,QACR,UAAAjC;AAAA,MAAA;AAAA,IACF,EAGO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,OACNM,MACmC;AACnC,UAAM,EAAE,UAAAN,GAAU,IAAAgC,GAAI,WAAAC,EAAA,IAAc3B,GAC9BkB,IAAM,GAAGpC,CAAO,IAAIY,CAAQ,IAAIgC,CAAE;AAcxC,WAAO,EAAE,MAZI,MAAMT;AAAA,MACjBC;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,MAAM,KAAK,UAAUS,CAAS;AAAA,MAAA;AAAA,MAEhC;AAAA,QACE,QAAQ;AAAA,QACR,UAAAjC;AAAA,MAAA;AAAA,IACF,EAGO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,OACTM,MACsC;AACtC,UAAM,EAAE,UAAAN,GAAU,IAAAgC,EAAA,IAAO1B,GACnBkB,IAAM,GAAGpC,CAAO,IAAIY,CAAQ,IAAIgC,CAAE;AAExC,iBAAMT;AAAA,MACJC;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,MAAA;AAAA,MAEV;AAAA,QACE,QAAQ;AAAA,QACR,UAAAxB;AAAA,MAAA;AAAA,IACF,GAGK,EAAE,MAAM,EAAE,IAAAgC,IAAG;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,OAA8C1B,MAGxB;AAChC,UAAM,EAAE,UAAAN,GAAU,KAAAkC,EAAA,IAAQ5B;AAG1B,iBAAM,QAAQ;AAAA,MACZ4B,EAAI;AAAA,QACF,CAAAF,MACET;AAAA,UACE,GAAGnC,CAAO,IAAIY,CAAQ,IAAIgC,CAAE;AAAA,UAC5B;AAAA,YACE,QAAQ;AAAA,UAAA;AAAA,UAEV;AAAA,YACE,QAAQ;AAAA,YACR,UAAAhC;AAAA,UAAA;AAAA,QACF,EACA,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA;AAAA,MAAA;AAAA,IACpB,GAGK,EAAE,MAAMkC,EAAI,IAAI,QAAO,EAAE,IAAAF,EAAA,EAAc,EAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAM5C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMjB,QAAQ,OAKNkB,MACmC;AACnC,UAAM,EAAE,KAAAkB,GAAK,QAAAW,GAAQ,SAAAP,GAAS,SAAAQ,MAAY9B,GACpC+B,IAAUb,EAAI,WAAW,MAAM,IAAIA,IAAM,GAAGpC,CAAO,GAAGoC,CAAG;AAe/D,WAAO,EAAE,MAbI,MAAMD;AAAA,MACjBc;AAAA,MACA;AAAA,QACE,QAAQF,KAAU;AAAA,QAClB,MAAMP,IAAU,KAAK,UAAUA,CAAO,IAAI;AAAA,QAC1C,SAAAQ;AAAA,MAAA;AAAA,MAEF;AAAA,QACE,SAASD,KAAU,OAAO,YAAA;AAAA,QAC1B,UAAU;AAAA,MAAA;AAAA,IACZ,EAGO;AAAA,EACX;AACF,GC1YaG,KAA6B;AAAA;AAAA;AAAA;AAAA,EAIxC,OAAO,OAAO,EAAE,OAAAC,GAAO,UAAAC,QAAoD;AACzE,QAAI;AACF,YAAMb,IAAW,MAAM,MAAM,GAAGvC,CAAO,eAAe;AAAA,QACpD,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAA;AAAA,QAC3B,aAAa;AAAA;AAAA,QACb,MAAM,KAAK,UAAU,EAAE,OAAAmD,GAAO,UAAAC,GAAU;AAAA,MAAA,CACzC;AAED,UAAIb,EAAS;AACX,eAAO;AAAA,UACL,SAAS;AAAA,UACT,YAAY;AAAA,QAAA;AAIhB,YAAMc,IAAQ,MAAMd,EAAS,KAAA,EAAO,MAAM,OAAO;AAAA,QAC/C,QAAQ;AAAA,MAAA,EACR;AAKF,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SANFc,EAAM,WAAWA,EAAM,UAAU;AAAA,QAMtB;AAAA,MACX;AAAA,IAEJ,QAAQ;AACN,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QAAA;AAAA,MACX;AAAA,IAEJ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,YAAY;AAClB,QAAI;AACF,YAAM,MAAM,GAAGrD,CAAO,gBAAgB;AAAA,QACpC,QAAQ;AAAA,QACR,aAAa;AAAA,MAAA,CACd;AAAA,IACH,QAAQ;AAAA,IAER;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY;AAAA,IAAA;AAAA,EAEhB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,YAAY;AACjB,QAAI;AAKF,cAJiB,MAAM,MAAM,GAAGA,CAAO,YAAY;AAAA,QACjD,aAAa;AAAA,MAAA,CACd,GAEY,KACJ,EAAE,eAAe,GAAA,IAGnB,EAAE,eAAe,IAAO,YAAY,SAAA;AAAA,IAC7C,QAAQ;AACN,aAAO,EAAE,eAAe,IAAO,YAAY,SAAA;AAAA,IAC7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,YAA0C;AACrD,QAAI;AACF,YAAMuC,IAAW,MAAM,MAAM,GAAGvC,CAAO,YAAY;AAAA,QACjD,aAAa;AAAA,MAAA,CACd;AAED,UAAIuC,EAAS,IAAI;AACf,cAAMe,IACJ,MAAMf,EAAS,KAAA;AACjB,YAAIe,EAAK,kBAAkB;AACzB,iBAAO;AAET,cAAMC,IAAa,OAAOD,EAAK,MAAM,EAAE,EAAE,YAAA,GACnCE,IAAe,OAAOF,EAAK,QAAQ,EAAE,EAAE,YAAA,GACvCG,IAAgB,OAAOH,EAAK,SAAS,EAAE,EAAE,YAAA;AAC/C,eACEC,MAAe,WACfC,MAAiB,gBACjBC,MAAkB,UAEX,OAEF;AAAA,UACL,IAAIH,EAAK;AAAA,UACT,OAAOA,EAAK;AAAA,UACZ,MAAMA,EAAK,QAAQA,EAAK;AAAA,UACxB,QAAQA,EAAK;AAAA,UACb,OAAOA,EAAK,SAAS,CAAA;AAAA,QAAC;AAAA,MAE1B;AAEA,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,YAAY;AAC1B,QAAI;AACF,YAAMf,IAAW,MAAM,MAAM,GAAGvC,CAAO,YAAY;AAAA,QACjD,aAAa;AAAA,MAAA,CACd;AAED,UAAIuC,EAAS,IAAI;AACf,cAAMe,IACJ,MAAMf,EAAS,KAAA;AACjB,YAAIe,EAAK,kBAAkB;AACzB,iBAAO;AAET,cAAMC,IAAa,OAAOD,EAAK,MAAM,EAAE,EAAE,YAAA,GACnCE,IAAe,OAAOF,EAAK,QAAQ,EAAE,EAAE,YAAA,GACvCG,IAAgB,OAAOH,EAAK,SAAS,EAAE,EAAE,YAAA;AAC/C,eACEC,MAAe,WACfC,MAAiB,gBACjBC,MAAkB,UAEX,OAEFH,EAAK,SAAS,CAAA;AAAA,MACvB;AAEA,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,OAAOD,MAEVA,EAAM,WAAW,MACZ;AAAA,IACL,QAAQ;AAAA,IACR,YAAY;AAAA,EAAA,IAKT,EAAE,OAAAA,EAAA;AAEb,GC7KMK,wBAAkB,IAAA,GAKlBC,wBAAoB,IAAA;AAK1B,SAASC,GAAcC,GAA4B;AACjD,MAAIC,IAAKJ,EAAY,IAAIG,CAAO;AAEhC,MAAIC,KAAMA,EAAG,eAAe,UAAU;AACpC,WAAOA;AAIT,MAAIC,IAAQ5D;AACZ,SAAKA,GAAO,WAAW,IAAI,MAEzB4D,IAAQ,GADS,WAAW,SAAS,aAAa,WAAW,SAAS,KACnD,KAAK,WAAW,SAAS,IAAI,GAAG5D,EAAM,KAG3D2D,IAAK,IAAI,UAAU,GAAGC,CAAK,YAAY,mBAAmBF,CAAO,CAAC,EAAE,GAEpEC,EAAG,SAAS,MAAM;AAChB,YAAQ,MAAM,wCAAwCD,CAAO,EAAE;AAAA,EACjE,GAEAC,EAAG,YAAY,CAAAE,MAAS;AACtB,QAAI;AACF,YAAMC,IAAO,KAAK,MAAMD,EAAM,IAAI,GAG5BE,IAAYP,EAAc,IAAIE,CAAO;AAC3C,MAAIK,KACFA,EAAU,QAAQ,CAAAC,MAAY;AAC5B,YAAI;AACF,UAAAA,EAASF,CAAI;AAAA,QACf,SAASG,GAAK;AACZ,kBAAQ,MAAM,kCAAkCA,CAAG;AAAA,QACrD;AAAA,MACF,CAAC;AAAA,IAEL,SAASA,GAAK;AACZ,cAAQ,MAAM,2CAA2CA,CAAG;AAAA,IAC9D;AAAA,EACF,GAEAN,EAAG,UAAU,CAAAT,MAAS;AACpB,YAAQ;AAAA,MACN,6CAA6CQ,CAAO;AAAA,MACpDR;AAAA,IAAA;AAAA,EAEJ,GAEAS,EAAG,UAAU,MAAM;AACjB,YAAQ,MAAM,6CAA6CD,CAAO,EAAE,GACpEH,EAAY,OAAOG,CAAO;AAAA,EAC5B,GAEAH,EAAY,IAAIG,GAASC,CAAE,GACpBA;AACT;AAKA,SAASO,GAAqBR,GAAuB;AACnD,QAAMK,IAAYP,EAAc,IAAIE,CAAO;AAC3C,MAAI,CAACK,KAAaA,EAAU,SAAS,GAAG;AACtC,UAAMJ,IAAKJ,EAAY,IAAIG,CAAO;AAClC,IAAIC,MACFA,EAAG,MAAA,GACHJ,EAAY,OAAOG,CAAO,IAE5BF,EAAc,OAAOE,CAAO;AAAA,EAC9B;AACF;AAeO,MAAMS,KAA6B;AAAA;AAAA;AAAA;AAAA,EAIxC,WAAW,CAAC;AAAA,IACV,SAAAT;AAAA,IACA,OAAAU;AAAA,IACA,UAAAJ;AAAA,IACA,QAAAjD;AAAA,EAAA,MAMI;AAEJ,UAAMsD,IAAcX,MAAW3C,KAAA,gBAAAA,EAAQ,aAAY;AAGnD,IAAA0C,GAAcY,CAAW;AAGzB,UAAMC,IAAmB,CAACT,MAAqB;AAE7C,MAAIO,KAASA,EAAM,SAAS,KAAK,CAACA,EAAM,SAASP,EAAM,IAAI,KAMzD9C,KAAA,QAAAA,EAAQ,YACR8C,EAAM,YAAY9C,EAAO,YACzB8C,EAAM,YAAYQ,KAKpBL,EAASH,CAAK;AAAA,IAChB;AAGA,WAAKL,EAAc,IAAIa,CAAW,KAChCb,EAAc,IAAIa,GAAa,oBAAI,IAAA,CAAK,GAE1Cb,EAAc,IAAIa,CAAW,EAAG,IAAIC,CAAgB,GAG7C,MAAM;AACX,YAAMP,IAAYP,EAAc,IAAIa,CAAW;AAC/C,MAAIN,MACFA,EAAU,OAAOO,CAAgB,GACjCJ,GAAqBG,CAAW;AAAA,IAEpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,CAACE,MAA4C;AAExD,IAAI,OAAOA,KAAkB,cAC3BA,EAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,OAAOV,MAIV;AACJ,UAAM,EAAE,SAAAH,GAAS,MAAAc,GAAM,SAAAnC,EAAA,IAAYwB;AAEnC,QAAI;AAEF,YAAMY,IAASzE,GAAO,QAAQ,OAAO,MAAM,EAAE;AAAA,QAC3C;AAAA,QACA;AAAA,MAAA;AAGF,YAAM,MAAMyE,GAAQ;AAAA,QAClB,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAA;AAAA,QAC3B,aAAa;AAAA,QACb,MAAM,KAAK,UAAU,EAAE,SAAAf,GAAS,MAAAc,GAAM,SAAAnC,GAAS;AAAA,MAAA,CAChD;AAAA,IACH,SAAS4B,GAAK;AACZ,cAAQ,MAAM,2CAA2CA,CAAG;AAAA,IAC9D;AAAA,EACF;AACF;AAMO,SAASS,KAA4B;AAC1C,EAAAnB,EAAY,QAAQ,CAAAI,MAAM;AACxB,IAAAA,EAAG,MAAA;AAAA,EACL,CAAC,GACDJ,EAAY,MAAA,GACZC,EAAc,MAAA;AAChB;AC5LA,SAASmB,GACPC,GACqB;AACrB,SAAOA,EAAM,MAAM,IAAI,CAACC,GAASC,MAAkB;AACjD,UAAMC,IAAOF,GAgBPG,IAAQD,EAAK,SAASD,GACtBG,IACJF,EAAK,aAAaG,GAAeL,CAAO,IAAIA,IAAU,OAAOA,CAAO;AAEtE,WAAO;AAAA,MACL,KAAKE,EAAK,OAAO,OAAOC,CAAK;AAAA,MAC7B,OAAAA;AAAA,MACA,SAAAC;AAAA,MACA,WAAW,EAAQF,EAAK;AAAA,MACxB,aAAa,EAAQA,EAAK;AAAA,MAC1B,WAAW,EAAQA,EAAK;AAAA,MACxB,QAAQ,CAAAI,MAAe;;AACrB,cAAMC,KAAUtF,IAAAiF,EAAK,mBAAL,gBAAAjF,EAAA,KAAAiF,GAAsBC,GAAOG;AAC7C,QAAIC,KAASA,EAAQ,EAAE,gBAAgB,MAAA;AAAA,WAAiB;AAAA,MAC1D;AAAA,MACA,UAAU,MAAM;;AACd,cAAMA,KAAUtF,IAAAiF,EAAK,qBAAL,gBAAAjF,EAAA,KAAAiF,GAAwBC;AACxC,QAAII,KAASA,EAAQ,EAAE,gBAAgB,MAAA;AAAA,WAAiB;AAAA,MAC1D;AAAA,IAAA;AAAA,EAEJ,CAAC;AACH;AAKO,SAASC,GAAcT,GAA2B;;AACvD,QAAM;AAAA,IACJ,IAAAnC;AAAA,IACA,OAAA6C;AAAA,IACA,UAAAC;AAAA,IACA,aAAAC;AAAA,IACA,QAAAC;AAAA,IACA,UAAAC;AAAA,IACA,QAAAC;AAAA,IACA,cAAAC;AAAA,IACA,UAAAC;AAAA,IACA,UAAAC;AAAA,EAAA,IACElB,GAEEmB,IAAgB,IACnBjG,IAAA+F,KAAA,gBAAAA,EAAW,kBAAX,QAAA/F,EACG,gBAGAkG,IACJF,KAAa,QAAkC,OAAOA,CAAQ,MAAM;AAEtE,SAAIH,IAAe,OAEfC,KAAgBN,KAASS,IAEzB,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,iCAAiCD,IAAW,eAAe,EAAE;AAAA,MACxE,OAAO,EAAE,cAAc,OAAA;AAAA,MAEtB,UAAA;AAAA,QAAAN;AAAA,QACD,gBAAAO,EAAC,SAAA,EAAM,SAASxD,GAAI,WAAU,uBAC3B,UAAA;AAAA,UAAA6C;AAAA,UACAC,uBAAa,QAAA,EAAK,OAAO,EAAE,OAAO,MAAA,GAAS,UAAA,KAAA,CAAE;AAAA,QAAA,GAChD;AAAA,QACCC,KACC,gBAAAU;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU;AAAA,cACV,OAAO;AAAA,cACP,WAAW;AAAA,YAAA;AAAA,YAGZ,UAAAV;AAAA,UAAA;AAAA,QAAA;AAAA,QAGJC,KACC,gBAAAS;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO,EAAE,OAAO,OAAO,UAAU,YAAY,WAAW,UAAA;AAAA,YAEvD,UAAAT;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAAA,EAAA,IAON,gBAAAQ,EAAC,SAAI,WAAU,cAAa,OAAO,EAAE,cAAc,UAChD,UAAA;AAAA,IAAAL,KAAgBN,KACf,gBAAAW;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAASxD;AAAA,QACT,OAAO;AAAA,UACL,SAAS;AAAA,UACT,cAAc;AAAA,UACd,YAAY;AAAA,QAAA;AAAA,QAGb,UAAA;AAAA,UAAA6C;AAAA,UACAC,uBAAa,QAAA,EAAK,OAAO,EAAE,OAAO,MAAA,GAAS,UAAA,KAAA,CAAE;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGjDG;AAAA,IACAF,KACC,gBAAAU;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO,EAAE,UAAU,YAAY,OAAO,QAAQ,WAAW,UAAA;AAAA,QAExD,UAAAV;AAAA,MAAA;AAAA,IAAA;AAAA,IAGJC,KACC,gBAAAS;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO,EAAE,OAAO,OAAO,UAAU,YAAY,WAAW,UAAA;AAAA,QAEvD,UAAAT;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GAEJ;AAEJ;AAKO,SAASU,GAAoBvB,GAAiC;AACnE,QAAM,EAAE,OAAAwB,GAAO,aAAAZ,GAAa,YAAAa,EAAA,IAAezB;AAE3C,SACE,gBAAAqB,EAAC,OAAA,EAAI,WAAU,eACZ,UAAA;AAAA,IAAAG,uBAAU,MAAA,EAAG,OAAO,EAAE,cAAc,OAAA,GAAW,UAAAA,GAAM;AAAA,IACrDZ,KACC,gBAAAU,EAAC,OAAA,EAAI,OAAO,EAAE,cAAc,QAAQ,OAAO,OAAA,GAAW,UAAAV,EAAA,CAAY;AAAA,IAEpE,gBAAAU,EAAC,SAAI,WAAU,eAAe,YAAW,IAAI,CAAAI,MAAQA,EAAK,OAAO,EAAA,CAAE;AAAA,EAAA,GACrE;AAEJ;AAMO,SAASC,GAAmB3B,GAAgC;;AACjE,QAAM,EAAE,OAAAwB,GAAO,QAAAI,GAAQ,YAAAC,EAAA,IAAe7B,GAChC8B,IAAgB9B,GAOhB,CAAC+B,GAAaC,CAAc,IAAIC,EAAwB,IAAI,GAC5D,CAACC,GAAWC,CAAY,IAAIF,EAAwB,IAAI,GACxD,CAACG,GAAWC,CAAY,IAAIJ,EAAS,EAAE,GACvC,CAACK,GAAYC,CAAa,IAAIN,EAAwB,IAAI,GAE1DO,IAAQC,EAAQ,MAAM1C,GAAoBC,CAAK,GAAG,CAACA,CAAK,CAAC,GAEzD0C,IAAe1C,EAAiC,UAChD2C,IAAO,MAAM,QAAQD,CAAW,IAAIA,IAAc,CAAA,GAClDE,MAAe1H,IAAA4G,EAAc,gBAAd,gBAAA5G,EAA2B,sBAAqB,MAC/D2H,IACJf,EAAc,UAAQgB,IAAAhB,EAAc,aAAd,gBAAAgB,EAAwB,QAAO;AA0BvD,SACE,gBAAAzB,EAAC,SAAI,WAAU,cAAa,OAAO,EAAE,cAAc,UAChD,UAAA;AAAA,IAAAG,uBAAU,MAAA,EAAG,OAAO,EAAE,cAAc,SAAA,GAAa,UAAAA,GAAM;AAAA,IACxD,gBAAAH;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,UACV,KAAK;AAAA,UACL,cAAc;AAAA,QAAA;AAAA,QAGhB,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM;;AACb,iBAAKpG,IAAA,WAAW,UAAU,cAArB,QAAAA,EAAgC;AAAA,kBACnC,KAAK,UAAUyH,GAAM,MAAM,CAAC;AAAA;AAAA,cAEhC;AAAA,cACA,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,cAAc;AAAA,gBACd,QAAQ;AAAA,gBACR,YAAY;AAAA,cAAA;AAAA,cAEf,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAGD,gBAAArB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAMe,EAAa,CAAA1F,MAAUA,IAAQ,KAAK,IAAK;AAAA,cACxD,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,cAAc;AAAA,gBACd,QAAQ;AAAA,gBACR,YAAY;AAAA,cAAA;AAAA,cAGb,cAAY,eAAe;AAAA,YAAA;AAAA,UAAA;AAAA,QAC9B;AAAA,MAAA;AAAA,IAAA;AAAA,IAGDyF,KACC,gBAAAf,EAAC,OAAA,EAAI,OAAO,EAAE,cAAc,aAC1B,UAAA;AAAA,MAAA,gBAAAC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAOc;AAAA,UACP,UAAU,CAAAnD,MAASoD,EAAapD,EAAM,OAAO,KAAK;AAAA,UAClD,MAAM;AAAA,UACN,aAAY;AAAA,UACZ,OAAO,EAAE,OAAO,QAAQ,cAAc,SAAA;AAAA,QAAS;AAAA,MAAA;AAAA,MAEjD,gBAAAoC,EAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,YAClC,UAAA;AAAA,QAAA,gBAAAC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SA7EO,MAAM;AACvB,kBAAI,CAACsB,GAAc;AACjB,gBAAAL;AAAA,kBACE;AAAA,gBAAA;AAEF;AAAA,cACF;AAEA,kBAAI;AACF,sBAAMQ,IAAS,KAAK,MAAMX,CAAS;AACnC,oBAAI,CAAC,MAAM,QAAQW,CAAM,GAAG;AAC1B,kBAAAR,EAAc,oCAAoC;AAClD;AAAA,gBACF;AACA,gBAAAK,EAAaC,GAAgBE,CAAM,GACnCR,EAAc,IAAI,GAClBF,EAAa,EAAE;AAAA,cACjB,QAAQ;AACN,gBAAAE;AAAA,kBACE;AAAA,gBAAA;AAAA,cAEJ;AAAA,YACF;AAAA,YAwDY,OAAO;AAAA,cACL,SAAS;AAAA,cACT,cAAc;AAAA,cACd,QAAQ;AAAA,cACR,YAAY;AAAA,cACZ,OAAO;AAAA,YAAA;AAAA,YAEV,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGAD,KACC,gBAAAhB,EAAC,QAAA,EAAK,OAAO,EAAE,OAAO,WAAW,UAAU,aACxC,UAAAgB,EAAA,CACH;AAAA,MAAA,EAAA,CAEJ;AAAA,IAAA,GACF;AAAA,IAGF,gBAAAhB,EAAC,SAAI,WAAU,oBACZ,YAAM,IAAI,CAACnB,GAAMC,MAChB,gBAAAiB;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,OAAO;AAAA,UACL,cAAc;AAAA,UACd,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,cAAc;AAAA,QAAA;AAAA,QAGf,UAAA;AAAA,UAAAa,MAAc,QAAQA,MAAc9B,KACnC,gBAAAkB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,YAAY,CAAArC,MAASA,EAAM,eAAA;AAAA,cAC3B,QAAQ,MAAM;;AACZ,iBAAA/D,IAAAsH,EAAMN,CAAS,MAAf,QAAAhH,EAAkB,OAAOkF,IACzB+B,EAAa,IAAI;AAAA,cACnB;AAAA,cACA,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,cAAc;AAAA,gBACd,QAAQ;AAAA,gBACR,YAAY;AAAA,gBACZ,OAAO;AAAA,gBACP,cAAc;AAAA,gBACd,SAAS;AAAA,cAAA;AAAA,cAEZ,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAKH,gBAAAd;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,gBAAgB;AAAA,gBAChB,YAAY;AAAA,gBACZ,KAAK;AAAA,gBACL,cAAc;AAAA,cAAA;AAAA,cAGhB,UAAA;AAAA,gBAAA,gBAAAA,EAAC,UAAA,EAAO,OAAO,EAAE,UAAU,aAAa,UAAA;AAAA,kBAAA;AAAA,kBAAKjB,IAAQ;AAAA,gBAAA,GAAE;AAAA,gBACvD,gBAAAiB,EAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,YAClC,UAAA;AAAA,kBAAA,gBAAAC;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,WAAS;AAAA,sBACT,cAAY,YAAYlB,IAAQ,CAAC;AAAA,sBACjC,aAAa,MAAM+B,EAAa/B,CAAK;AAAA,sBACtC,UAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAGD,gBAAAkB;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,UAAU,CAACnB,EAAK;AAAA,sBAChB,SAAS,MAAMA,EAAK,OAAOC,IAAQ,CAAC;AAAA,sBACrC,UAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAGD,gBAAAkB;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,UAAU,CAACnB,EAAK;AAAA,sBAChB,SAAS,MAAMA,EAAK,OAAOC,IAAQ,CAAC;AAAA,sBACrC,UAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAGD,gBAAAkB,EAAC,YAAO,MAAK,UAAS,SAAS,MAAMU,EAAe5B,CAAK,GAAG,UAAA,SAAA,CAE5D;AAAA,kBACA,gBAAAkB;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,UAAU,CAACnB,EAAK;AAAA,sBAChB,SAASA,EAAK;AAAA,sBACf,UAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAED,EAAA,CACF;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAED4B,MAAgB3B,IACf,gBAAAkB,EAAC,OAAA,EAAI,OAAO,EAAE,OAAO,WAAW,UAAU,UAAA,GAAa,UAAA,8BAAA,CAEvD,IAEAnB,EAAK;AAAA,QAAA;AAAA,MAAA;AAAA,MAhFFA,EAAK;AAAA,IAAA,CAmFb,GACH;AAAA,IACCyB,KACC,gBAAAN;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAASO;AAAA,QACT,OAAO;AAAA,UACL,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,QAAQ;AAAA,QAAA;AAAA,QAEX,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAKFE,MAAgB,QAAQS,EAAMT,CAAW,KACxC,gBAAAV;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,SAAS;AAAA,QAAA;AAAA,QAGX,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAW;AAAA,cACX,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,YAAY;AAAA,gBACZ,SAAS;AAAA,cAAA;AAAA,cAEX,SAAS,MAAMU,EAAe,IAAI;AAAA,YAAA;AAAA,UAAA;AAAA,UAGpC,gBAAAX;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAI;AAAA,cACJ,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,WAAW;AAAA,gBACX,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,cAAc;AAAA,gBACd,SAAS;AAAA,gBACT,QAAQ;AAAA,gBACR,UAAU;AAAA,gBACV,QAAQ;AAAA,cAAA;AAAA,cAGV,UAAA;AAAA,gBAAA,gBAAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,gBAAgB;AAAA,sBAChB,YAAY;AAAA,sBACZ,cAAc;AAAA,oBAAA;AAAA,oBAGhB,UAAA;AAAA,sBAAA,gBAAAA,EAAC,MAAA,EAAG,OAAO,EAAE,QAAQ,KAAK,UAAA;AAAA,wBAAA;AAAA,wBAAcU,IAAc;AAAA,sBAAA,GAAE;AAAA,sBACxD,gBAAAT,EAAC,YAAO,MAAK,UAAS,SAAS,MAAMU,EAAe,IAAI,GAAG,UAAA,QAAA,CAE3D;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEDQ,EAAMT,CAAW,EAAE;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACtB;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GAEJ;AAEJ;AAKO,SAASiB,GAAkBhD,GAA+B;AAC/D,QAAM;AAAA,IACJ,IAAAnC;AAAA,IACA,MAAA+B;AAAA,IACA,OAAAjD;AAAA,IACA,UAAAsG;AAAA,IACA,UAAAC;AAAA,IACA,UAAAvC;AAAA,IACA,UAAAwC;AAAA,IACA,QAAAC;AAAA,IACA,SAAAC;AAAA,IACA,aAAAC;AAAA,EAAA,IACEtD;AAEJ,SACE,gBAAAsB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAAzD;AAAA,MACA,MAAM+B,KAAQ;AAAA,MACd,OAAOjD,KAAS;AAAA,MAChB,UAAAsG;AAAA,MACA,UAAUC;AAAA,MACV,UAAAvC;AAAA,MACA,aAAA2C;AAAA,MACA,UAAU,CAAAC,MAAKJ,EAASI,EAAE,OAAO,KAAK;AAAA,MACtC,QAAQ,CAAAA,MAAKH,EAAOvF,GAAI0F,EAAE,OAAO,KAAK;AAAA,MACtC,SAAS,CAAAA,MAAKF,EAAQxF,GAAI0F,EAAE,OAAO,KAAK;AAAA,MACxC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,UAAU;AAAA,MAAA;AAAA,IACZ;AAAA,EAAA;AAGN;AAKO,SAASC,GAAWxD,GAAoB;AAC7C,QAAM,EAAE,IAAAnC,GAAI,OAAAlB,GAAO,UAAAsG,GAAU,UAAAC,GAAU,UAAAC,GAAU,aAAAG,MAAgBtD;AAEjE,SACE,gBAAAsB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAAzD;AAAA,MACA,MAAK;AAAA,MACL,OAAOlB,KAAS;AAAA,MAChB,UAAAsG;AAAA,MACA,UAAUC;AAAA,MACV,aAAAI;AAAA,MACA,UAAU,CAAAC,MAAKJ,EAASI,EAAE,OAAO,KAAK;AAAA,MACtC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,cAAc;AAAA,MAAA;AAAA,IAChB;AAAA,EAAA;AAGN;AAKO,SAASE,GAAezD,GAAoB;AACjD,QAAM,EAAE,IAAAnC,GAAI,OAAAlB,GAAO,UAAAsG,GAAU,UAAAC,GAAU,UAAAC,GAAU,OAAAzC,MAAUV;AAE3D,SACE,gBAAAqB,EAAC,SAAA,EAAM,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,SAAA,GAC1D,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,IAAAzD;AAAA,QACA,MAAK;AAAA,QACL,SAASlB,KAAS;AAAA,QAClB,UAAUsG,KAAYC;AAAA,QACtB,UAAU,CAAAK,MAAKJ,EAASI,EAAE,OAAO,OAAO;AAAA,QACxC,OAAO,EAAE,OAAO,QAAQ,QAAQ,OAAA;AAAA,MAAO;AAAA,IAAA;AAAA,IAExC7C;AAAA,EAAA,GACH;AAEJ;AAKO,SAASgD,GAAa1D,GAAoB;AAC/C,QAAM,EAAE,IAAAnC,GAAI,OAAAlB,GAAO,UAAAsG,GAAU,UAAAC,GAAU,UAAAC,GAAU,SAAA7F,MAAY0C,GACvD2D,IAAcrG,EAAQ,eAAe,CAAA;AAE3C,SACE,gBAAA+D;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAAxD;AAAA,MACA,OAAOlB,KAAS;AAAA,MAChB,UAAUsG,KAAYC;AAAA,MACtB,UAAU,CAAAK,MAAKJ,EAASI,EAAE,OAAO,KAAK;AAAA,MACtC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,cAAc;AAAA,MAAA;AAAA,MAGhB,UAAA;AAAA,QAAA,gBAAAjC,EAAC,UAAA,EAAO,OAAM,IAAG,UAAA,aAAS;AAAA,QACzBqC,EAAY,IAAI,CAAAC,MACf,gBAAAtC,EAAC,UAAA,EAA+B,OAAO,OAAOsC,EAAI,KAAK,GACpD,YAAI,MAAA,GADM,OAAOA,EAAI,KAAK,CAE7B,CACD;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGP;AAKO,SAASC,GAAW7D,GAAoB;AAC7C,QAAM,EAAE,IAAAnC,GAAI,OAAAlB,GAAO,UAAAsG,GAAU,UAAAC,GAAU,UAAAC,MAAanD;AAEpD,SACE,gBAAAsB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAAzD;AAAA,MACA,MAAK;AAAA,MACL,OAAOlB,KAAS;AAAA,MAChB,UAAAsG;AAAA,MACA,UAAUC;AAAA,MACV,UAAU,CAAAK,MAAKJ,EAASI,EAAE,OAAO,KAAK;AAAA,MACtC,OAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,cAAc;AAAA,MAAA;AAAA,IAChB;AAAA,EAAA;AAGN;AAKO,SAASO,GAAe9D,GAAoB;AACjD,QAAM,EAAE,IAAAnC,GAAI,OAAAlB,GAAO,UAAAsG,GAAU,UAAAC,GAAU,UAAAC,GAAU,aAAAG,MAAgBtD;AAEjE,SACE,gBAAAsB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAAzD;AAAA,MACA,OAAOlB,KAAS;AAAA,MAChB,UAAAsG;AAAA,MACA,UAAUC;AAAA,MACV,aAAAI;AAAA,MACA,UAAU,CAAAC,MAAKJ,EAASI,EAAE,OAAO,KAAK;AAAA,MACtC,MAAM;AAAA,MACN,OAAO;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,QAAQ;AAAA,MAAA;AAAA,IACV;AAAA,EAAA;AAGN;AAKO,MAAMQ,KAAgB;AAAA,EAC3B,YAAAP;AAAA,EACA,gBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,YAAAG;AAAA,EACA,gBAAAC;AACF,GAKaE,KAAkB;AAAA,EAC7B,eAAAvD;AAAA,EACA,qBAAAc;AAAA,EACA,oBAAAI;AAAA,EACA,mBAAAqB;AACF;AC3nBA,SAASiB,GACPC,GACAC,GACAxH,GACG;AACH,QAAMyH,IACJF,KAAU,OAAOA,KAAW,WACxB,EAAE,GAAIA,EAAA,IACN,CAAA;AAEN,SAAAE,EAAKD,CAAS,IAAIxH,GACXyH;AACT;AAEA,SAASC,GAAgCC,GAAkC;AACzE,QAAMC,IAAyB,EAAE,GAAGD,EAAA,GAE9BE,IAAYD,EAAW;AAC7B,MAAI,MAAM,QAAQC,CAAS,GAAG;AAC5B,UAAMC,IAAeD,EAAU;AAAA,MAC7B,CAACE,MAAmB,OAAOA,KAAM,YAAYA,MAAM;AAAA,IAAA;AAErD,IAAID,EAAa,WAAW,MAC1BF,EAAW,OAAOE,EAAa,CAAC;AAAA,EAEpC;AAEA,QAAME,IAAaJ,EAAW;AAC9B,MAAI,MAAM,QAAQI,CAAU,GAAG;AAC7B,UAAMC,IAAiBD,EAAW,OAAO,CAAAxE,MACnC,CAACA,KAAQ,OAAOA,KAAS,WAAiB,KAC/BA,EACD,SAAS,MACxB;AAED,QAAIyE,EAAe,WAAW,GAAG;AAC/B,YAAMC,IAAgBD,EAAe,CAAC,GAChCE,IAAqB;AAAA,QACzB,GAAGD;AAAA,QACH,GAAGN;AAAA,QACH,MAAMM,EAAc,QAAQN,EAAW;AAAA,MAAA;AAEzC,oBAAOO,EAAO,OACPA;AAAA,IACT;AAAA,EACF;AAEA,SAAOP;AACT;AAEA,SAASQ,GAA8BC,GAAgC;AACrE,MAAI,CAACA,KAAU,OAAOA,KAAW,SAAU,QAAOA;AAGlD,QAAMvD,IADYuD,EACW;AAC7B,MAAI,CAACvD,KAAc,OAAOA,KAAe;AACvC,WAAOuD;AAGT,QAAMC,IAAuB,OAAO;AAAA,IAClC,OAAO,QAAQxD,CAAqC,EAAE;AAAA,MACpD,CAAC,CAACtE,GAAKR,CAAK,MACN,CAACA,KAAS,OAAOA,KAAU,WAAiB,CAACQ,GAAKR,CAAK,IACpD,CAACQ,GAAKkH,GAAgC1H,CAAmB,CAAC;AAAA,IACnE;AAAA,EACF;AAGF,SAAO;AAAA,IACL,GAAGqI;AAAA,IACH,YAAYC;AAAA,EAAA;AAEhB;AA4DO,SAASC,GAAsB;AAAA,EACpC,QAAAF;AAAA,EACA,UAAA/D;AAAA,EACA,UAAAC;AAAA,EACA,UAAAiC;AAAA,EACA,UAAAgC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAlC,IAAW;AAAA,EACX,UAAAD,IAAW;AAAA,EACX,kBAAAoC,IAAmB;AAAA,EACnB,YAAAC,IAAa;AAAA,EACb,WAAAC;AAAA,EACA,UAAAzE;AACF,GAA+B;AAC7B,QAAM0E,IAAmBT,GAA8BC,CAAM,GAGvDS,IAAe,CAAClC,MAAuB;AAC3C,IAAIJ,KAAYI,EAAE,aAAa,UAC7BJ,EAASI,EAAE,QAAQ;AAAA,EAEvB,GAGMmC,IAAe,CAACnC,MAAuB;AAC3C,IAAI4B,KAAY5B,EAAE,aAAa,UAC7B4B,EAAS5B,EAAE,QAAQ;AAAA,EAEvB,GAEMoC,IAAc;AAAA,IAClB,mBAAmB,CAACxB,GAAmBxH,MAAqB;AAC1D,MAAKwG,KACLA,EAASc,GAAwB/C,GAAUiD,GAAWxH,CAAK,CAAC;AAAA,IAC9D;AAAA,EAAA,GAIIiJ,IAAsC;AAAA,IAC1C,QAAQJ;AAAA,IACR,UAAU;AAAA,MACR,GAAGvE;AAAA,MACH,0BAA0BoE,IACtB,EAAE,UAAU,GAAA,IACZ,EAAE,YAAAC,EAAA;AAAA,IAAW;AAAA,IAEnB,UAAApE;AAAA,IACA,WAAA2E;AAAA,IACA,WAAW7B;AAAA,IACX,SAASD;AAAA,IACT,aAAA4B;AAAA,IACA,UAAAzC;AAAA,IACA,UAAAD;AAAA,IACA,UAAUwC;AAAA,IACV,UAAUC;AAAA,IACV,SAAAN;AAAA,EAAA;AAGF,SACE,gBAAA9D,EAAC,SAAI,WAAAiE,GACH,UAAA,gBAAAjE,EAACwE,MAAM,GAAGF,GAAY,UAAA9E,GAAS,EAAA,CACjC;AAEJ;AC1MA,SAASiF,GAAepJ,GAAUqJ,GAAkB;AAClD,QAAM,CAACC,GAAgBC,CAAiB,IAAIjE,EAAStF,CAAK;AAE1D,SAAAwJ,EAAU,MAAM;AACd,UAAMC,IAAQ,WAAW,MAAMF,EAAkBvJ,CAAK,GAAGqJ,CAAK;AAC9D,WAAO,MAAM,aAAaI,CAAK;AAAA,EACjC,GAAG,CAACzJ,GAAOqJ,CAAK,CAAC,GAEVC;AACT;AAuBO,SAASI,GAAWrG,GAAoB;AAC7C,QAAM;AAAA,IACJ,IAAAnC;AAAA,IACA,OAAAlB;AAAA,IACA,UAAAsG;AAAA,IACA,UAAAC;AAAA,IACA,UAAAC;AAAA,IACA,SAAA7F;AAAA,IACA,QAAA0H;AAAA,IACA,aAAA1B;AAAA,EAAA,IACEtD,GAGEsG,KAAiBtB,KAAA,gBAAAA,EAAqC,kBACtD1H,KAAA,gBAAAA,EAAqC,YACtC,IAEC,CAACiJ,GAAYC,CAAa,IAAIvE,EAAStF,KAAS,EAAE,GAClD,CAAC8J,GAAeC,CAAgB,IAAIzE,EAAuB,CAAA,CAAE,GAC7D,CAAC0E,GAAQC,CAAS,IAAI3E,EAAS,EAAK,GACpC,CAAC4E,GAAWC,CAAY,IAAI7E,EAAS,EAAK,GAE1C8E,IAAkBhB,GAAYQ,GAAY,GAAG,GAG7CS,IAAeC,EAAY,OAAOC,MAAmB;AACzD,QAAKZ,GAEL;AAAA,MAAAQ,EAAa,EAAI;AACjB,UAAI;AACF,cAAM3K,IAAS,IAAI,gBAAA;AACnB,QAAI+K,KAAQ/K,EAAO,IAAI,KAAK+K,CAAM,GAClC/K,EAAO,IAAI,SAAS,IAAI;AAExB,cAAMqB,IAAW,MAAM;AAAA,UACrB,GAAGvC,CAAO,IAAIqL,CAAa,IAAInK,CAAM;AAAA,UACrC,EAAE,aAAa,UAAA;AAAA,QAAU;AAG3B,YAAIqB,EAAS,IAAI;AACf,gBAAM0B,IAAO,MAAM1B,EAAS,KAAA,GACtBgF,IAAQtD,EAAK,SAASA;AAC5B,UAAAwH;AAAA,YACElE,EAAM,IAAI,CAACrC,OAAmC;AAAA,cAC5C,OAAOA,EAAK,QAAQA,EAAK;AAAA,cACzB,OAAOA,EAAK,QAAQA,EAAK,SAASA,EAAK;AAAA,YAAA,EACvC;AAAA,UAAA;AAAA,QAEN;AAAA,MACF,SAAS7B,GAAO;AACd,gBAAQ,MAAM,sBAAsBA,CAAK,GACzCoI,EAAiB,CAAA,CAAE;AAAA,MACrB,UAAA;AACE,QAAAI,EAAa,EAAK;AAAA,MACpB;AAAA;AAAA,EACF,GAAG,CAACR,CAAa,CAAC;AAGlB,EAAAH,EAAU,MAAM;AACd,IAAIQ,KACFK,EAAaD,CAAe;AAAA,EAEhC,GAAG,CAACA,GAAiBJ,GAAQK,CAAY,CAAC;AAG1C,QAAMG,IAAe,CAACC,MAAuB;AAC3C,IAAAZ,EAAcY,EAAO,KAAK,GAC1BjE,EAASiE,EAAO,KAAK,GACrBR,EAAU,EAAK;AAAA,EACjB,GAGMS,IAAoB,CAAC9D,MAA2C;AACpE,UAAM+D,IAAW/D,EAAE,OAAO;AAC1B,IAAAiD,EAAcc,CAAQ,GACtBV,EAAU,EAAI,GAGTU,KACHnE,EAAS,MAAS;AAAA,EAEtB;AAEA,2BACG,OAAA,EAAI,OAAO,EAAE,UAAU,cACtB,UAAA;AAAA,IAAA,gBAAA7B;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,IAAAzD;AAAA,QACA,MAAK;AAAA,QACL,OAAO0I;AAAA,QACP,UAAAtD;AAAA,QACA,UAAUC;AAAA,QACV,aAAaI,KAAe,UAAUgD,CAAa;AAAA,QACnD,UAAUe;AAAA,QACV,SAAS,MAAM;AACb,UAAAT,EAAU,EAAI,GACdI,EAAaT,CAAU;AAAA,QACzB;AAAA,QACA,QAAQ,MAAM;AAEZ,qBAAW,MAAMK,EAAU,EAAK,GAAG,GAAG;AAAA,QACxC;AAAA,QACA,OAAO;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,cAAc;AAAA,QAAA;AAAA,MAChB;AAAA,IAAA;AAAA,IAIDD,KACC,gBAAArF;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,KAAK;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,cAAc;AAAA,UACd,WAAW;AAAA,QAAA;AAAA,QAGZ,UAAAuF,IACC,gBAAAvF,EAAC,OAAA,EAAI,OAAO,EAAE,SAAS,UAAU,OAAO,OAAA,GAAU,UAAA,aAAA,CAAU,IAC1DmF,EAAc,WAAW,IAC3B,gBAAAnF,EAAC,OAAA,EAAI,OAAO,EAAE,SAAS,UAAU,OAAO,OAAA,GAAU,UAAA,aAAA,CAAU,IAE5DmF,EAAc,IAAI,CAACW,MACjB,gBAAA9F;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM6F,EAAaC,CAAM;AAAA,YAClC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,QAAQ;AAAA,cACR,YAAYA,EAAO,UAAUzK,IAAQ,YAAY;AAAA,YAAA;AAAA,YAEnD,cAAc,CAAC4G,MAAM;AACnB,cAAAA,EAAE,cAAc,MAAM,aAAa;AAAA,YACrC;AAAA,YACA,cAAc,CAACA,MAAM;AACnB,cAAAA,EAAE,cAAc,MAAM,aACpB6D,EAAO,UAAUzK,IAAQ,YAAY;AAAA,YACzC;AAAA,YAEC,UAAAyK,EAAO;AAAA,UAAA;AAAA,UAfHA,EAAO;AAAA,QAAA,CAiBf;AAAA,MAAA;AAAA,IAAA;AAAA,EAEL,GAEJ;AAEJ;ACzJA,SAASG,GACPvC,GAC6B;AAC7B,QAAMwC,IAAuC,CAAA;AAE7C,aAAW,CAACrK,GAAKuE,CAAI,KAAK,OAAO,QAAQsD,EAAO,UAAU,GAAG;AAC3D,UAAMV,IAA+B5C;AAGrC,IAAI4C,EAAS,UAAU,KAEvBkD,EAAQ,KAAK;AAAA,MACX,IAAIrK;AAAA,MACJ,aAAaA;AAAA,MACb,QAAQmH,EAAS,SAASnH;AAAA,MAC1B,MAAM,CAAC,EAAE,UAAAsK,QAAe;AACtB,cAAM9K,IAAQ8K,EAAA;AAGd,eAAI9K,KAAU,OAAoC,MAC9C,OAAOA,KAAU,YAAkBA,IAAQ,QAAQ,OACnD2H,EAAS,WAAW,UAAUA,EAAS,WAAW,cAC7C,IAAI,KAAK3H,CAAe,EAAE,mBAAA,IAE5B,OAAOA,CAAK;AAAA,MACrB;AAAA,MACA,eAAe;AAAA,IAAA,CAChB;AAAA,EACH;AAEA,SAAO6K;AACT;AAyBO,SAASE,GAAyC;AAAA,EACvD,UAAA7L;AAAA,EACA,QAAAmJ;AAAA,EACA,SAAS2C;AAAA,EACT,iBAAAC,IAAkB;AAAA,EAClB,mBAAAC;AAAA,EACA,YAAAC;AAAA,EACA,WAAAvC;AACF,GAAoC;AAElC,QAAM,CAACwC,GAASC,CAAU,IAAI/F,EAAuB,CAAA,CAAE,GACjD,CAACgG,GAAcC,CAAe,IAAIjG,EAA4B,CAAA,CAAE,GAChE,CAAC/F,GAAYiM,CAAa,IAAIlG,EAA0B;AAAA,IAC5D,WAAW;AAAA,IACX,UAAU;AAAA,EAAA,CACX,GAGK,EAAE,QAAAmG,GAAQ,OAAAzK,EAAA,IAAU0K,GAAe;AAAA,IACvC,UAAAxM;AAAA,IACA,YAAY;AAAA,MACV,UAAUK,EAAW;AAAA,MACrB,MAAM;AAAA,IAAA;AAAA,IAER,SACE6L,EAAQ,SAAS,IACb,CAAC,EAAE,OAAOA,EAAQ,CAAC,EAAE,IAAI,OAAOA,EAAQ,CAAC,EAAE,OAAO,SAAS,MAAA,CAAO,IAClE;AAAA,EAAA,CACP,GAEKO,KAAYF,KAAA,gBAAAA,EAAQ,SAAQ,CAAA,GAC5BG,KAAaH,KAAA,gBAAAA,EAAQ,UAAS,GAC9BvB,KAAYlJ,KAAA,gBAAAA,EAAO,cAAa,IAChC6K,IAAa7K,KAAA,gBAAAA,EAAO,OAEpB8K,IAAY,CAChBC,GACAC,GACAC,MACG;AACH,UAAMC,IAAW,mBAAmBH,CAAQ,IAAIC,CAAQ,MAClDG,IAASF,EAAa,cAA2BC,CAAQ;AAC/D,IAAAC,KAAA,QAAAA,EAAQ;AAAA,EACV,GAEMC,IAAoB,CACxB9J,GACAyJ,GACAC,MACG;AACH,UAAMC,IAAe3J,EAAM,cAAc,QAAQ,OAAO;AACxD,IAAK2J,MAED3J,EAAM,QAAQ,iBAChBA,EAAM,eAAA,GACNwJ,EAAUC,GAAUC,IAAW,GAAGC,CAAY,IAG5C3J,EAAM,QAAQ,gBAChBA,EAAM,eAAA,GACNwJ,EAAUC,GAAUC,IAAW,GAAGC,CAAY,IAG5C3J,EAAM,QAAQ,gBAChBA,EAAM,eAAA,GACNwJ,EAAUC,IAAW,GAAGC,GAAUC,CAAY,IAG5C3J,EAAM,QAAQ,cAChBA,EAAM,eAAA,GACNwJ,EAAUC,IAAW,GAAGC,GAAUC,CAAY;AAAA,EAElD,GAGMpB,IAAU/E,EAAQ,MAClBkF,MACA3C,IAAeuC,GAAiCvC,CAAM,IACnD,CAAA,IACN,CAAC2C,GAAe3C,CAAM,CAAC,GAGpBgE,IAAuBvG,EAAQ,MAC9BmF,IAsBE,CApB4C;AAAA,IACjD,IAAI;AAAA,IACJ,QAAQ,CAAC,EAAE,OAAAqB,QACT,gBAAA3H;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS2H,EAAM,qBAAA;AAAA,QACf,UAAUA,EAAM,gCAAA;AAAA,MAAgC;AAAA,IAAA;AAAA,IAGpD,MAAM,CAAC,EAAE,KAAAC,EAAA,MACP,gBAAA5H;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAS4H,EAAI,cAAA;AAAA,QACb,UAAUA,EAAI,yBAAA;AAAA,QACd,SAAS,CAAA3F,MAAKA,EAAE,gBAAA;AAAA,MAAgB;AAAA,IAAA;AAAA,IAGpC,eAAe;AAAA,EAAA,GAGQ,GAAGiE,CAAO,IAtBNA,GAuB5B,CAACA,GAASI,CAAe,CAAC,GAGvBqB,IAAQE,GAAc;AAAA,IAC1B,MAAMb;AAAA,IACN,SAASU;AAAA,IACT,WAAW,KAAK,KAAKT,IAAarM,EAAW,QAAQ;AAAA,IACrD,OAAO;AAAA,MACL,SAAA6L;AAAA,MACA,cAAAE;AAAA,MACA,YAAA/L;AAAA,IAAA;AAAA;AAAA,IAGF,UAAU,CAAAgN,MAAO;AACf,YAAME,IAAIF;AACV,aAAO,OAAOE,EAAE,MAAMA,EAAE,QAAQ,EAAE;AAAA,IACpC;AAAA,IACA,iBAAiBpB;AAAA,IACjB,sBAAsB,CAAAqB,MAAW;AAC/B,YAAMC,IACJ,OAAOD,KAAY,aAAaA,EAAQpB,CAAY,IAAIoB;AAM1D,UALAnB,EAAgBoB,CAAY,GAKxBzB,GAAmB;AACrB,cAAM0B,IAAc,OAAO,KAAKD,CAAY,EAAE;AAAA,UAC5C,CAAAnM,MAAOmM,EAAanM,CAAG;AAAA,QAAA,GAEnBqM,IAAelB,EAAU,OAAO,CAAAY,MAAO;AAC3C,gBAAME,IAAIF,GACJO,IAAQ,OAAOL,EAAE,MAAMA,EAAE,QAAQ,EAAE;AACzC,iBAAOG,EAAY,SAASE,CAAK;AAAA,QACnC,CAAC;AACD,QAAA5B,EAAkB2B,CAAY;AAAA,MAChC;AAAA,IACF;AAAA,IACA,oBAAoBrB;AAAA,IACpB,iBAAiBuB,GAAA;AAAA,IACjB,mBAAmBC,GAAA;AAAA,IACnB,uBAAuBC,GAAA;AAAA,IACvB,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,oBAAoBhC;AAAA,EAAA,CACrB;AAED,SAAIf,sBACM,OAAA,EAAI,OAAO,EAAE,SAAS,OAAA,GAAU,UAAA,cAAU,IAGhD2B,IAEA,gBAAAlH;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,OAAO;AAAA,MAAA;AAAA,MAET,MAAK;AAAA,MAEJ,UAAAkH,EAAW,WAAW,kBAAkB3M,CAAQ;AAAA,IAAA;AAAA,EAAA,IAMrD,gBAAAwF,EAAC,SAAI,WAAAkE,GAEH,UAAA;AAAA,IAAA,gBAAAlE,EAAC,WAAM,OAAO,EAAE,OAAO,QAAQ,gBAAgB,cAC7C,UAAA;AAAA,MAAA,gBAAAC,EAAC,SAAA,EACE,UAAA2H,EAAM,gBAAA,EAAkB,IAAI,CAAAY,MAC3B,gBAAAvI,EAAC,MAAA,EACE,UAAAuI,EAAY,QAAQ,IAAI,CAAAC,MACvB,gBAAAzI;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,SACEyI,EAAO,OAAO,WAAA,IACVA,EAAO,OAAO,4BACd;AAAA,UAEN,OAAO;AAAA,YACL,SAAS;AAAA,YACT,WAAW;AAAA,YACX,cAAc;AAAA,YACd,QAAQA,EAAO,OAAO,WAAA,IAAe,YAAY;AAAA,YACjD,YAAY;AAAA,UAAA;AAAA,UAGb,UAAA;AAAA,YAAAC;AAAA,cACCD,EAAO,OAAO,UAAU;AAAA,cACxBA,EAAO,WAAA;AAAA,YAAW;AAAA,YAEnBA,EAAO,OAAO,YAAA,KACb,gBAAAxI,EAAC,UAAK,OAAO,EAAE,YAAY,UAAA,GACxB,UAAAwI,EAAO,OAAO,kBAAkB,QAAQ,MAAM,IAAA,CACjD;AAAA,UAAA;AAAA,QAAA;AAAA,QArBGA,EAAO;AAAA,MAAA,CAwBf,KA3BMD,EAAY,EA4BrB,CACD,EAAA,CACH;AAAA,MACA,gBAAAvI,EAAC,WACE,UAAA2H,EAAM,cAAc,KAAK,IAAI,CAACC,GAAKR,MAClC,gBAAApH;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,SAAS,MAAMwG,KAAA,gBAAAA,EAAaoB,EAAI;AAAA,UAChC,OAAO;AAAA,YACL,QAAQpB,IAAa,YAAY;AAAA,YACjC,cAAc;AAAA,UAAA;AAAA,UAGf,YAAI,gBAAA,EAAkB,IAAI,CAACkC,GAAMrB,MAChC,gBAAArH;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,OAAO,EAAE,SAAS,UAAA;AAAA,cAClB,UAAU;AAAA,cACV,iBAAe,GAAGoH,CAAQ,IAAIC,CAAQ;AAAA,cACtC,WAAW,CAAA1J,MACT8J,EAAkB9J,GAAOyJ,GAAUC,CAAQ;AAAA,cAG5C,aAAWqB,EAAK,OAAO,UAAU,MAAMA,EAAK,YAAY;AAAA,YAAA;AAAA,YARpDA,EAAK;AAAA,UAAA,CAUb;AAAA,QAAA;AAAA,QAnBId,EAAI;AAAA,MAAA,CAqBZ,EAAA,CACH;AAAA,IAAA,GACF;AAAA,IAGA,gBAAA7H;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,gBAAgB;AAAA,UAChB,YAAY;AAAA,UACZ,WAAW;AAAA,UACX,SAAS;AAAA,QAAA;AAAA,QAGX,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EAAI,UAAA;AAAA,YAAA;AAAA,YACGnF,EAAW,YAAY;AAAA,YAAE;AAAA,YAAK+M,EAAM,kBAAkB;AAAA,YAC3D;AAAA,YAAM;AAAA,YAAQV;AAAA,UAAA,GACjB;AAAA,UACA,gBAAAlH,EAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,YAClC,UAAA;AAAA,YAAA,gBAAAC;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS,MAAM2H,EAAM,aAAA;AAAA,gBACrB,UAAU,CAACA,EAAM,mBAAA;AAAA,gBACjB,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,QAAQA,EAAM,mBAAA,IAAuB,YAAY;AAAA,kBACjD,SAASA,EAAM,mBAAA,IAAuB,IAAI;AAAA,gBAAA;AAAA,gBAE7C,UAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAGD,gBAAA3H;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS,MAAM2H,EAAM,SAAA;AAAA,gBACrB,UAAU,CAACA,EAAM,eAAA;AAAA,gBACjB,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,QAAQA,EAAM,eAAA,IAAmB,YAAY;AAAA,kBAC7C,SAASA,EAAM,eAAA,IAAmB,IAAI;AAAA,gBAAA;AAAA,gBAEzC,UAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UAED,EAAA,CACF;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;ACjVO,SAASgB,GAAa;AAAA,EAC3B,UAAApO;AAAA,EACA,IAAAgC;AAAA,EACA,OAAAqM;AAAA,EACA,OAAAvN;AAAA,EACA,MAAAiD,IAAO;AAAA,EACP,SAAAtC;AAAA,EACA,UAAA2F,IAAW;AAAA,EACX,eAAAkH;AAAA,EACA,aAAAC;AACF,GAAsB;AACpB,QAAM,CAACC,GAAWC,CAAY,IAAIrI,EAAS,EAAK,GAC1C,CAACsI,GAAWC,CAAY,IAAIvI,EAAStF,CAAK,GAC1C,CAAC2B,GAAOmM,CAAQ,IAAIxI,EAAwB,IAAI,GAEhDyI,IAAWC,GAA6C,IAAI,GAC5DC,IAAiBC,GAAA;AAGvB,EAAA1E,EAAU,MAAM;AACd,IAAIkE,KAAaK,EAAS,YACxBA,EAAS,QAAQ,MAAA,GACbA,EAAS,mBAAmB,oBAC9BA,EAAS,QAAQ,OAAA;AAAA,EAGvB,GAAG,CAACL,CAAS,CAAC,GAGdlE,EAAU,MAAM;AACd,IAAAqE,EAAa7N,CAAK;AAAA,EACpB,GAAG,CAACA,CAAK,CAAC;AAGV,QAAMmO,IAAc7D,EAAY,MAAM;AACpC,IAAIhE,MACJqH,EAAa,EAAI,GACjBE,EAAa7N,CAAK,GAClB8N,EAAS,IAAI;AAAA,EACf,GAAG,CAACxH,GAAUtG,CAAK,CAAC,GAGdoO,IAAe9D,EAAY,MAAM;AACrC,IAAAqD,EAAa,EAAK,GAClBE,EAAa7N,CAAK,GAClB8N,EAAS,IAAI;AAAA,EACf,GAAG,CAAC9N,CAAK,CAAC,GAGJqO,IAAa/D,EAAY,MAAM;AACnC,QAAIsD,MAAc5N,GAAO;AAEvB,MAAA2N,EAAa,EAAK;AAClB;AAAA,IACF;AAGA,IAAAM,EAAe;AAAA,MACb;AAAA,QACE,UAAA/O;AAAA,QACA,IAAAgC;AAAA,QACA,QAAQ,EAAE,CAACqM,CAAK,GAAGK,EAAA;AAAA,MAAU;AAAA,MAE/B;AAAA,QACE,WAAW,MAAM;AACf,UAAAD,EAAa,EAAK,GAClBG,EAAS,IAAI,GACbN,KAAA,QAAAA;AAAA,QACF;AAAA,QACA,SAAS,CAAA9K,MAAO;AACd,UAAAoL,EAASpL,EAAI,WAAW,aAAa;AAAA,QACvC;AAAA,MAAA;AAAA,IACF;AAAA,EAEJ,GAAG,CAACxD,GAAUgC,GAAIqM,GAAOK,GAAW5N,GAAOiO,GAAgBT,CAAa,CAAC,GAGnEc,IAAgBhE;AAAA,IACpB,CAAC1D,MAA2B;AAC1B,MAAIA,EAAE,QAAQ,WACZA,EAAE,eAAA,GACFyH,EAAA,KACSzH,EAAE,QAAQ,YACnBwH,EAAA;AAAA,IAEJ;AAAA,IACA,CAACC,GAAYD,CAAY;AAAA,EAAA,GAIrBtF,IAAewB;AAAA,IACnB,CAAC1D,MAA+D;AAC9D,YAAM+D,IACJ1H,MAAS,aACJ2D,EAAE,OAA4B,UAC/B3D,MAAS,WACP,OAAO2D,EAAE,OAAO,KAAK,IACrBA,EAAE,OAAO;AACjB,MAAAiH,EAAalD,CAAQ,GACrBmD,EAAS,IAAI;AAAA,IACf;AAAA,IACA,CAAC7K,CAAI;AAAA,EAAA,GAGDsL,IAAWN,EAAe,SAAS;AAGzC,SAAKP,sBAkCF,OAAA,EAAI,OAAO,EAAE,UAAU,cACrB,UAAA;AAAA,IAAAzK,MAAS,WACR,gBAAAyB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKqJ;AAAA,QACL,OAAO,OAAOH,KAAa,EAAE;AAAA,QAC7B,UAAU9E;AAAA,QACV,QAAQuF;AAAA,QACR,WAAWC;AAAA,QACX,UAAUC;AAAA,QACV,OAAO;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,QAAQ5M,IACJ,iCACA;AAAA,UACJ,cAAc;AAAA,UACd,SAAS;AAAA,UACT,UAAU;AAAA,UACV,iBAAiB;AAAA,UACjB,OAAO;AAAA,QAAA;AAAA,QAGT,UAAA;AAAA,UAAA,gBAAAgD,EAAC,UAAA,EAAO,OAAM,IAAG,UAAA,KAAC;AAAA,UACjBhE,KAAA,gBAAAA,EAAS,IAAI,CAAAsG,MACZ,gBAAAtC,EAAC,UAAA,EAAuB,OAAOsC,EAAI,OAChC,UAAAA,EAAI,MAAA,GADMA,EAAI,KAEjB;AAAA,QACD;AAAA,MAAA;AAAA,IAAA,IAEDhE,MAAS,aACX,gBAAA0B;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKoJ;AAAA,QACL,MAAK;AAAA,QACL,SAAS,EAAQH;AAAA,QACjB,UAAU9E;AAAA,QACV,QAAQuF;AAAA,QACR,WAAWC;AAAA,QACX,UAAUC;AAAA,QACV,OAAO,EAAE,QAAQ,UAAA;AAAA,MAAU;AAAA,IAAA,IAG7B,gBAAA5J;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKoJ;AAAA,QACL,MAAA9K;AAAA,QACA,OAAO,OAAO2K,KAAa,EAAE;AAAA,QAC7B,UAAU9E;AAAA,QACV,QAAQuF;AAAA,QACR,WAAWC;AAAA,QACX,UAAUC;AAAA,QACV,OAAO;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,QAAQ5M,IACJ,iCACA;AAAA,UACJ,cAAc;AAAA,UACd,SAAS;AAAA,UACT,UAAU;AAAA,UACV,WAAW;AAAA,UACX,iBAAiB;AAAA,UACjB,OAAO;AAAA,QAAA;AAAA,MACT;AAAA,IAAA;AAAA,IAKHA,KACC,gBAAAgD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,KAAK;AAAA,UACL,MAAM;AAAA,UACN,WAAW;AAAA,UACX,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,OAAO;AAAA,UACP,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,QAAQ;AAAA,QAAA;AAAA,QAGT,UAAAhD;AAAA,MAAA;AAAA,IAAA;AAAA,IAKJ4M,KACC,gBAAA5J;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,OAAO;AAAA,UACP,KAAK;AAAA,UACL,WAAW;AAAA,UACX,UAAU;AAAA,UACV,OAAO;AAAA,QAAA;AAAA,QAEV,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAED,GAEJ,IAtIE,gBAAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,SAASwJ;AAAA,MACT,OAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ7H,IAAW,YAAY;AAAA,QAC/B,cAAc;AAAA,QACd,WAAW;AAAA,QACX,YAAY;AAAA,MAAA;AAAA,MAEd,cAAc,CAAAM,MAAK;AACjB,QAAKN,MACHM,EAAE,cAAc,MAAM,kBAAkB;AAAA,MAE5C;AAAA,MACA,cAAc,CAAAA,MAAK;AACjB,QAAAA,EAAE,cAAc,MAAM,kBAAkB;AAAA,MAC1C;AAAA,MACA,OAAON,IAAW,SAAY;AAAA,MAE7B,UAAAmH,IACGA,EAAYzN,CAAK,IACjBiD,MAAS,aACPjD,IACE,MACA,MACF,OAAOA,KAAS,EAAE;AAAA,IAAA;AAAA,EAAA;AA+GhC;AC7RO,SAASwO,GAAc;AAAA,EAC5B,MAAAC;AAAA,EACA,OAAA5J;AAAA,EACA,SAAAlG;AAAA,EACA,cAAA+P,IAAe;AAAA,EACf,aAAAC,IAAc;AAAA,EACd,aAAAC,IAAc;AAAA,EACd,WAAAC;AAAA,EACA,UAAAC;AACF,GAAiC;AAC/B,QAAMC,IAAUjJ;AAAA,IACd,MAAM,wBAAwBjB,EAAM,YAAA,EAAc,WAAW,KAAK,GAAG,CAAC;AAAA,IACtE,CAACA,CAAK;AAAA,EAAA;AAgBR,SAbA2E,EAAU,MAAM;AACd,QAAI,CAACiF,EAAM;AAEX,UAAMH,IAAgB,CAAChM,MAAyB;AAC9C,MAAIA,EAAM,QAAQ,YAChBwM,EAAA;AAAA,IAEJ;AAEA,sBAAW,iBAAiB,WAAWR,CAAa,GAC7C,MAAM,WAAW,oBAAoB,WAAWA,CAAa;AAAA,EACtE,GAAG,CAACG,GAAMK,CAAQ,CAAC,GAEdL,IAGH,gBAAA9J;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAI;AAAA,MACJ,mBAAiBoK;AAAA,MACjB,UAAU,CAAAzM,MAAS;AACjB,QAAAA,EAAM,eAAA,GACNwM,EAAA;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,UAAU;AAAA,MAAA;AAAA,MAGZ,UAAA,gBAAApK;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAO;AAAA,YACL,OAAO;AAAA,YACP,cAAc;AAAA,YACd,QAAQ;AAAA,YACR,iBAAiB;AAAA,YACjB,OAAO;AAAA,YACP,WAAW;AAAA,YACX,SAAS;AAAA,UAAA;AAAA,UAGX,UAAA;AAAA,YAAA,gBAAAC;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,IAAIoK;AAAA,gBACJ,OAAO,EAAE,QAAQ,GAAG,cAAc,UAAU,UAAU,SAAA;AAAA,gBAErD,UAAAlK;AAAA,cAAA;AAAA,YAAA;AAAA,YAEH,gBAAAF;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,OAAO;AAAA,gBAAA;AAAA,gBAGR,UAAAhG;AAAA,cAAA;AAAA,YAAA;AAAA,YAGH,gBAAA+F;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO,EAAE,SAAS,QAAQ,gBAAgB,YAAY,KAAK,SAAA;AAAA,gBAE3D,UAAA;AAAA,kBAAA,gBAAAC;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAASmK;AAAA,sBACT,OAAO;AAAA,wBACL,SAAS;AAAA,wBACT,cAAc;AAAA,wBACd,QAAQ;AAAA,wBACR,iBAAiB;AAAA,wBACjB,OAAO;AAAA,wBACP,QAAQ;AAAA,sBAAA;AAAA,sBAGT,UAAAH;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAEH,gBAAAhK;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,SAASkK;AAAA,sBACT,OAAO;AAAA,wBACL,SAAS;AAAA,wBACT,cAAc;AAAA,wBACd,QAAQ;AAAA,wBACR,iBAAiBD,IACb,uBACA;AAAA,wBACJ,OAAO;AAAA,wBACP,QAAQ;AAAA,sBAAA;AAAA,sBAGT,UAAAF;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACH;AAAA,cAAA;AAAA,YAAA;AAAA,UACF;AAAA,QAAA;AAAA,MAAA;AAAA,IACF;AAAA,EAAA,IA/Ec;AAkFpB;ACrHA,MAAMM,KAGF;AAAA,EACF,MAAM;AAAA,IACJ,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,EAAA;AAAA,EAER,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,EAAA;AAAA,EAER,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ,MAAM;AAAA,EAAA;AAEV;AAEO,SAASC,GAAY;AAAA,EAC1B,SAAAtQ;AAAA,EACA,SAAAuQ,IAAU;AAAA,EACV,WAAAC;AACF,GAA+B;AAC7B,QAAMC,IAAUJ,GAAOE,CAAO,GACxBxL,IACJ,gBAAAgB,EAAA2K,GAAA,EACE,UAAA;AAAA,IAAA,gBAAA1K,EAAC,UAAM,UAAAhG,EAAA,CAAQ;AAAA,IACdwQ,KACC,gBAAAxK;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAW;AAAA,QACX,SAASwK;AAAA,QACT,OAAO;AAAA,UACL,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,YAAY;AAAA,QAAA;AAAA,QAEf,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAED,GAEJ,GAGIG,IAAc;AAAA,IAClB,cAAc;AAAA,IACd,SAAS;AAAA,IACT,iBAAiBF,EAAQ;AAAA,IACzB,QAAQ,aAAaA,EAAQ,MAAM;AAAA,IACnC,cAAc;AAAA,IACd,OAAOA,EAAQ;AAAA,IACf,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,KAAK;AAAA,EAAA;AAGP,SAAIF,MAAY,4BAEX,OAAA,EAAI,MAAK,SAAQ,OAAOI,GACtB,UAAA5L,GACH,IAIG,gBAAAiB,EAAC,UAAA,EAAO,OAAO2K,GAAc,UAAA5L,GAAQ;AAC9C;ACvCO,SAAS6L,GAAe;AAAA,EAC7B,eAAAC;AAAA,EACA,WAAAtF,IAAY;AAAA,EACZ,UAAAuF;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC,IAAe,CAAA;AAAA,EACf,SAAAC;AACF,GAAkC;;AAChC,QAAM,CAACC,GAAgBC,CAAiB,IAAI1K,EAAS,EAAK,GACpD,CAAC2K,GAAeC,CAAgB,IAAI5K,EAAS,EAAE,GAC/C,CAAC6K,GAAaC,CAAc,IAAI9K,EAAS,EAAE,GAC3C,CAAC+K,GAAqBC,CAAsB,IAAIhL,EAAS,EAAK,GAG9DiL,IAAejG,EAAY,MAAM;AACrC,IAAI2F,KAAiBL,MACnBA,EAAaK,GAAeE,CAAW,GACvCH,EAAkB,EAAK,GACvBE,EAAiB,EAAE,GACnBE,EAAe,EAAE;AAAA,EAErB,GAAG,CAACH,GAAeE,GAAaP,CAAY,CAAC,GAGvCY,IAAelG,EAAY,MAAM;AACrC,IAAAgG,EAAuB,EAAI;AAAA,EAC7B,GAAG,CAAA,CAAE;AAEL,SAAId,MAAkB,IAAU,OAG9B,gBAAA9K;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,cAAc;AAAA,MAAA;AAAA,MAIhB,UAAA;AAAA,QAAA,gBAAAA,EAAC,UAAK,OAAO,EAAE,YAAY,KAAK,OAAO,uBACpC,UAAA;AAAA,UAAA8K;AAAA,UAAc;AAAA,QAAA,GACjB;AAAA,QAGA,gBAAA9K,EAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,YAEjC,UAAA;AAAA,UAAA+K,KACC,gBAAA9K;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS6L;AAAA,cACT,UAAUtG;AAAA,cACV,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,iBAAiB;AAAA,gBACjB,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,cAAc;AAAA,gBACd,QAAQA,IAAY,SAAS;AAAA,gBAC7B,SAASA,IAAY,MAAM;AAAA,cAAA;AAAA,cAE9B,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAMFwF,KACC,gBAAA/K;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS+K;AAAA,cACT,UAAUxF;AAAA,cACV,OAAOuG;AAAA,cACR,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAMFd,KACC,gBAAAhL;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAASgL;AAAA,cACT,UAAUzF;AAAA,cACV,OAAOuG;AAAA,cACR,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAMFb,KAAgBC,EAAa,SAAS,KACrC,gBAAAnL,EAAC,SAAI,OAAO,EAAE,UAAU,WAAA,GACtB,UAAA;AAAA,YAAA,gBAAAC;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,SAAS,MAAMqL,EAAkB,CAACD,CAAc;AAAA,gBAChD,UAAU7F;AAAA,gBACV,OAAOuG;AAAA,gBACR,UAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAKAV,KACC,gBAAArL;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,KAAK;AAAA,kBACL,MAAM;AAAA,kBACN,WAAW;AAAA,kBACX,SAAS;AAAA,kBACT,iBAAiB;AAAA,kBACjB,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,WAAW;AAAA,kBACX,QAAQ;AAAA,kBACR,UAAU;AAAA,gBAAA;AAAA,gBAIZ,UAAA;AAAA,kBAAA,gBAAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,OAAOuL;AAAA,sBACP,UAAU,CAAArJ,MAAKsJ,EAAiBtJ,EAAE,OAAO,KAAK;AAAA,sBAC9C,OAAO;AAAA,wBACL,OAAO;AAAA,wBACP,SAAS;AAAA,wBACT,cAAc;AAAA,wBACd,QAAQ;AAAA,wBACR,cAAc;AAAA,sBAAA;AAAA,sBAGhB,UAAA;AAAA,wBAAA,gBAAAjC,EAAC,UAAA,EAAO,OAAM,IAAG,UAAA,mBAAe;AAAA,wBAC/BkL,EAAa,IAAI,CAAAa,MAChB,gBAAA/L,EAAC,UAAA,EAAoB,OAAO+L,EAAE,MAC3B,UAAAA,EAAE,MAAA,GADQA,EAAE,IAEf,CACD;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAIFT,KACC,gBAAAvL,EAAA2K,GAAA,EACG,UAAA;AAAA,qBAAA9Q,IAAAsR,EAAa,KAAK,CAAAa,MAAKA,EAAE,SAAST,CAAa,MAA/C,QAAA1R,EACG,UACF,gBAAAmG;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,OAAOyL;AAAA,wBACP,UAAU,CAAAvJ,MAAKwJ,EAAexJ,EAAE,OAAO,KAAK;AAAA,wBAC5C,OAAO;AAAA,0BACL,OAAO;AAAA,0BACP,SAAS;AAAA,0BACT,cAAc;AAAA,0BACd,QAAQ;AAAA,0BACR,cAAc;AAAA,wBAAA;AAAA,wBAGhB,UAAA;AAAA,0BAAA,gBAAAjC,EAAC,UAAA,EAAO,OAAM,IAAG,UAAA,mBAAe;AAAA,2BAC/BgM,KAAAxK,IAAA0J,EACE,KAAK,CAAAa,MAAKA,EAAE,SAAST,CAAa,MADpC,gBAAA9J,EAEG,YAFH,gBAAAwK,EAEY,IAAI,OACb,gBAAAhM,EAAC,UAAA,EAAqB,OAAOiM,EAAE,OAC5B,YAAE,MAAA,GADQA,EAAE,KAEf;AAAA,wBACD;AAAA,sBAAA;AAAA,oBAAA,IAGL,gBAAAjM;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,MAAK;AAAA,wBACL,OAAOwL;AAAA,wBACP,UAAU,CAAAvJ,MAAKwJ,EAAexJ,EAAE,OAAO,KAAK;AAAA,wBAC5C,aAAY;AAAA,wBACZ,OAAO;AAAA,0BACL,OAAO;AAAA,0BACP,SAAS;AAAA,0BACT,cAAc;AAAA,0BACd,QAAQ;AAAA,0BACR,cAAc;AAAA,0BACd,WAAW;AAAA,wBAAA;AAAA,sBACb;AAAA,oBAAA;AAAA,oBAIJ,gBAAAjC;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,SAAS4L;AAAA,wBACT,UAAU,CAACJ;AAAA,wBACX,OAAO;AAAA,0BACL,OAAO;AAAA,0BACP,SAAS;AAAA,0BACT,iBAAiB;AAAA,0BACjB,OAAO;AAAA,0BACP,QAAQ;AAAA,0BACR,cAAc;AAAA,0BACd,QAAQA,IAAc,YAAY;AAAA,0BAClC,SAASA,IAAc,IAAI;AAAA,wBAAA;AAAA,wBAE9B,UAAA;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBAED,EAAA,CACF;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UAEJ,EAAA,CAEJ;AAAA,QAAA,GAEJ;AAAA,0BAGC,OAAA,EAAI,OAAO,EAAE,MAAM,KAAK;AAAA,QAGxBL,KACC,gBAAAnL;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAASmL;AAAA,YACT,OAAO;AAAA,cACL,SAAS;AAAA,cACT,iBAAiB;AAAA,cACjB,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,QAAQ;AAAA,YAAA;AAAA,YAEX,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAKH,gBAAAnL;AAAA,UAAC6J;AAAA,UAAA;AAAA,YACC,MAAM6B;AAAA,YACN,OAAM;AAAA,YACN,SAAS,UAAUb,CAAa;AAAA,YAChC,cAAa;AAAA,YACb,aAAY;AAAA,YACZ,aAAW;AAAA,YACX,WAAW,MAAM;AACf,cAAAc,EAAuB,EAAK,GAC5Bb,KAAA,QAAAA;AAAA,YACF;AAAA,YACA,UAAU,MAAMa,EAAuB,EAAK;AAAA,UAAA;AAAA,QAAA;AAAA,MAC9C;AAAA,IAAA;AAAA,EAAA;AAGN;AAEA,MAAMG,KAAmC;AAAA,EACvC,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,QAAQ;AACV,GCtRMI,KAA6D;AAAA;AAAA,EAEjE,OAAO,EAAE,IAAI,WAAW,MAAM,OAAA;AAAA,EAC9B,SAAS,EAAE,IAAI,WAAW,MAAM,UAAA;AAAA,EAChC,WAAW,EAAE,IAAI,WAAW,MAAM,UAAA;AAAA,EAClC,UAAU,EAAE,IAAI,WAAW,MAAM,UAAA;AAAA,EACjC,UAAU,EAAE,IAAI,WAAW,MAAM,UAAA;AAAA,EACjC,WAAW,EAAE,IAAI,WAAW,MAAM,OAAA;AAAA,EAClC,WAAW,EAAE,IAAI,WAAW,MAAM,UAAA;AAAA,EAClC,SAAS,EAAE,IAAI,WAAW,MAAM,UAAA;AAAA;AAAA,EAEhC,SAAS,EAAE,IAAI,WAAW,MAAM,UAAA;AAClC;AAKA,SAASC,GAAcC,GAAyD;AAC9E,MAAI,CAACA,EAAO,QAAOF,GAAa;AAEhC,QAAMG,IAAkBD,EAAM,YAAA,EAAc,QAAQ,QAAQ,GAAG;AAC/D,SAAOF,GAAaG,CAAe,KAAKH,GAAa;AACvD;AA4BO,SAASI,GAAW;AAAA,EACzB,OAAAF;AAAA,EACA,WAAAG;AAAA,EACA,WAAAtI;AAAA,EACA,OAAAuI;AACF,GAAoB;AAElB,QAAMC,IAAeL,MAAUG,MAAc,IAAI,UAAUA,MAAc,IAAI,cAAcA,MAAc,IAAI,cAAc;AAE3H,MAAI,CAACE,EAAc,QAAO;AAE1B,QAAMC,IAASP,GAAcM,CAAY;AAEzC,SACE,gBAAAzM;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAAiE;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS;AAAA,QACT,cAAc;AAAA,QACd,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,eAAe;AAAA,QACf,iBAAiByI,EAAO;AAAA,QACxB,OAAOA,EAAO;AAAA,QACd,GAAGF;AAAA,MAAA;AAAA,MAGJ,UAAAC;AAAA,IAAA;AAAA,EAAA;AAGP;AC9BA,eAAeE,GACbC,GACArQ,GACkC;AAClC,QAAML,IAAW,MAAM;AAAA,IACrB,GAAGvC,CAAO,aAAaiT,CAAO,IAAIrQ,CAAE;AAAA,IACpC,EAAE,aAAa,UAAA;AAAA,EAAU;AAG3B,MAAI,CAACL,EAAS;AACZ,UAAM,IAAI,MAAM,qCAAqCA,EAAS,UAAU,EAAE;AAG5E,SAAOA,EAAS,KAAA;AAClB;AAKA,eAAe2Q,GACbD,GACArQ,GACAjC,GACe;AACf,QAAM4B,IAAW,MAAM;AAAA,IACrB,GAAGvC,CAAO,aAAaiT,CAAO,IAAIrQ,CAAE;AAAA,IACpC;AAAA,MACE,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,SAAS,EAAE,gBAAgB,mBAAA;AAAA,MAC3B,MAAM,KAAK,UAAU,EAAE,QAAAjC,GAAQ;AAAA,IAAA;AAAA,EACjC;AAGF,MAAI,CAAC4B,EAAS,IAAI;AAChB,UAAMc,IAAQ,MAAMd,EAAS,KAAA,EAAO,MAAM,OAAO;AAAA,MAC/C,QAAQA,EAAS;AAAA,IAAA,EACjB;AACF,UAAM,IAAI,MAAMc,EAAM,UAAU,qBAAqB1C,CAAM,EAAE;AAAA,EAC/D;AACF;AA6BO,SAASwS,GACdF,GACArQ,GACAP,GAC0B;AAC1B,QAAM+Q,IAAcC,GAAA,GACd,CAACC,GAAaC,CAAc,IAAIvM,EAAS,EAAK,GAE9CwM,IAAU,EAAQ5Q,OAAQP,KAAA,gBAAAA,EAAS,YAAW,KAE9C;AAAA,IACJ,MAAA4B;AAAA,IACA,WAAA2H;AAAA,IACA,OAAAvI;AAAA,IACA,SAAAoQ;AAAA,EAAA,IACEC,GAAyC;AAAA,IAC3C,UAAU,CAAC,oBAAoBT,GAASrQ,CAAE;AAAA,IAC1C,SAAS,MAAMoQ,GAAqBC,GAASrQ,CAAG;AAAA,IAChD,SAAA4Q;AAAA,IACA,WAAW,KAAK;AAAA;AAAA,EAAA,CACjB,GAEKG,IAAgB3H;AAAA,IACpB,OAAO4H,MAAuB;AAC5B,UAAKhR,GAEL;AAAA,QAAA2Q,EAAe,EAAI;AACnB,YAAI;AACF,gBAAML,GAAkBD,GAASrQ,GAAIgR,CAAU,GAG/C,MAAMR,EAAY,kBAAkB;AAAA,YAClC,UAAU,CAAC,oBAAoBH,GAASrQ,CAAE;AAAA,UAAA,CAC3C,GAED,MAAMwQ,EAAY,kBAAkB;AAAA,YAClC,UAAU,CAACH,GAASrQ,CAAE;AAAA,UAAA,CACvB;AAAA,QACH,UAAA;AACE,UAAA2Q,EAAe,EAAK;AAAA,QACtB;AAAA;AAAA,IACF;AAAA,IACA,CAACN,GAASrQ,GAAIwQ,CAAW;AAAA,EAAA;AAG3B,SAAO;AAAA,IACL,OAAOnP,KAAA,gBAAAA,EAAM;AAAA,IACb,UAASA,KAAA,gBAAAA,EAAM,YAAW,CAAA;AAAA,IAC1B,WAAA2H;AAAA,IACA,OAAOvI,KAAS;AAAA,IAChB,eAAAsQ;AAAA,IACA,aAAAL;AAAA,IACA,SAAAG;AAAA,EAAA;AAEJ;AC5KA,MAAMI,KAA6E;AAAA,EACjF,QAAQ,EAAE,IAAI,WAAW,MAAM,SAAS,OAAO,UAAA;AAAA,EAC/C,SAAS,EAAE,IAAI,WAAW,MAAM,SAAS,OAAO,UAAA;AAAA,EAChD,QAAQ,EAAE,IAAI,WAAW,MAAM,SAAS,OAAO,UAAA;AAAA,EAC/C,QAAQ,EAAE,IAAI,WAAW,MAAM,SAAS,OAAO,UAAA;AAAA,EAC/C,MAAM,EAAE,IAAI,WAAW,MAAM,WAAW,OAAO,UAAA;AAAA,EAC/C,SAAS,EAAE,IAAI,WAAW,MAAM,SAAS,OAAO,UAAA;AAClD;AAKA,SAASC,GAAeF,GAAiE;AACvF,QAAMtK,IAAasK,EAAW,YAAA;AAE9B,SAAItK,EAAW,SAAS,QAAQ,IAAUuK,GAAc,SACpDvK,EAAW,SAAS,SAAS,IAAUuK,GAAc,UACrDvK,EAAW,SAAS,QAAQ,IAAUuK,GAAc,SACpDvK,EAAW,SAAS,QAAQ,IAAUuK,GAAc,SACpDvK,EAAW,SAAS,MAAM,IAAUuK,GAAc,OAE/CA,GAAc;AACvB;AAoCO,SAASE,GAAgB;AAAA,EAC9B,SAAAd;AAAA,EACA,IAAArQ;AAAA,EACA,WAAAoR,IAAY;AAAA,EACZ,kBAAAC;AAAA,EACA,WAAA3J;AAAA,EACA,OAAAuI;AACF,GAAyB;AACvB,QAAM;AAAA,IACJ,OAAAJ;AAAA,IACA,SAAAyB;AAAA,IACA,WAAAtI;AAAA,IACA,eAAA+H;AAAA,IACA,aAAAL;AAAA,EAAA,IACEH,GAAmBF,GAASrQ,CAAE,GAG5BuR,IAAe,OAAOxT,MAA2B;AACrD,QAAI;AACF,YAAMgT,EAAchT,EAAO,IAAI,GAC/BsT,KAAA,QAAAA,EAAmBtT,EAAO;AAAA,IAC5B,SAAS0C,GAAO;AACd,cAAQ,MAAM,2BAA2BA,CAAK;AAAA,IAEhD;AAAA,EACF;AAEA,MAAIuI;AACF,6BAAQ,OAAA,EAAI,OAAO,EAAE,OAAO,OAAA,GAAU,UAAA,uBAAmB;AAI3D,MAAI,CAAC6G;AACH,WAAO;AAIT,QAAM2B,IAAiBF,EAAQ,OAAO,CAACG,MAAMA,EAAE,OAAO;AAEtD,SACE,gBAAAjO;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAAkE;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,GAAGuI;AAAA,MAAA;AAAA,MAIJ,UAAA;AAAA,QAAAmB,KACC,gBAAA3N;AAAA,UAACsM;AAAA,UAAA;AAAA,YACC,OAAOF,EAAM;AAAA,YACb,WAAWA,EAAM;AAAA,UAAA;AAAA,QAAA;AAAA,QAKpB2B,EAAe,IAAI,CAACzT,MAAW;AAC9B,gBAAMoS,IAASe,GAAenT,EAAO,IAAI;AAEzC,iBACE,gBAAA0F;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,SAAS,MAAM8N,EAAaxT,CAAM;AAAA,cAClC,UAAU2S;AAAA,cACV,OAAO3S,EAAO;AAAA,cACd,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,QAAQ;AAAA,gBACR,cAAc;AAAA,gBACd,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,QAAQ2S,IAAc,gBAAgB;AAAA,gBACtC,SAASA,IAAc,MAAM;AAAA,gBAC7B,iBAAiBP,EAAO;AAAA,gBACxB,OAAOA,EAAO;AAAA,gBACd,YAAY;AAAA,cAAA;AAAA,cAEd,cAAc,CAACzK,MAAM;AACnB,gBAAKgL,MACHhL,EAAE,cAAc,MAAM,kBAAkByK,EAAO;AAAA,cAEnD;AAAA,cACA,cAAc,CAACzK,MAAM;AACnB,gBAAAA,EAAE,cAAc,MAAM,kBAAkByK,EAAO;AAAA,cACjD;AAAA,cAEC,UAAAO,IAAc,QAAQ3S,EAAO;AAAA,YAAA;AAAA,YAzBzBA,EAAO;AAAA,UAAA;AAAA,QA4BlB,CAAC;AAAA,QAGAyT,EAAe,WAAW,KAAK,CAACxI,KAC/B,gBAAAvF,EAAC,QAAA,EAAK,OAAO,EAAE,OAAO,QAAQ,UAAU,WAAA,GAAc,UAAA,uBAAA,CAEtD;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;ACpHA,MAAMiO,KAA2B;AAAA,EAG/B,2BAAW,IAAA;AAAA,EAEX,WAAW,CAAA;AAEb;AA0KO,SAASC,GACdC,GACAvB,GACoB;AACpB,QAAMwB,IAAQH,GAAS,MAAM,IAAIE,CAAQ,KAAK,CAAA;AAG9C,SAAIvB,IACKwB,EAAM,OAAO,CAAAC,MAAK,CAACA,EAAE,YAAYA,EAAE,SAAS,SAASzB,CAAO,CAAC,IAG/DwB;AACT;AAoBO,SAASE,KAAuC;AACrD,SAAOL,GAAS;AAClB;AC1OO,SAASM,EAAK;AAAA,EACnB,MAAAC;AAAA,EACA,SAAA5B;AAAA,EACA,MAAAhP;AAAA,EACA,IAAArB;AAAA,EACA,UAAAiD;AACF,GAAuB;AACrB,QAAMiP,IAAoBP,GAAkBM,GAAM5B,CAAO;AAEzD,SAAI6B,EAAkB,WAAW,2BACrB,UAAAjP,GAAS,IAInB,gBAAAQ,EAAA0K,GAAA,EACG,UAAA+D,EAAkB,IAAI,CAACC,GAAgC5P,MAAkB;AACxE,UAAM6P,IAAYD,EAAa;AAC/B,WACE,gBAAA1O;AAAA,MAAC2O;AAAA,MAAA;AAAA,QAEC,SAAA/B;AAAA,QACA,MAAAhP;AAAA,QACA,IAAArB;AAAA,MAAA;AAAA,MAHK,GAAGiS,CAAI,IAAI1P,CAAK;AAAA,IAAA;AAAA,EAM3B,CAAC,EAAA,CACH;AAEJ;ACPA,MAAM8P,KAAkC;AAAA,EACtC;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,aAAa;AAAA,EAAA;AAAA,EAEf;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,aAAa;AAAA,EAAA;AAAA,EAEf;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,aAAa;AAAA,EAAA;AAEjB;AAKO,SAASC,GAAe,EAAE,MAAA/E,GAAM,SAAAgF,KAAgC;AACrE,QAAM,CAACzS,GAAO0S,CAAQ,IAAIpO,EAAS,EAAE,GAC/B,CAACqO,GAAeC,CAAgB,IAAItO,EAAS,CAAC,GAC9C,CAACuO,GAAUC,CAAW,IAAIxO,EAAwB,CAAA,CAAE,GACpDyI,IAAWC,GAAyB,IAAI,GACxC+F,IAAKC,GAAA;AAGX,EAAAxK,EAAU,MAAM;AACd,mBAAeyK,IAAgB;AAC7B,UAAI;AACF,cAAMpT,IAAW,MAAM,MAAM,GAAGrC,EAAQ,aAAa;AAAA,UACnD,aAAa;AAAA,QAAA,CACd;AACD,YAAIqC,EAAS,IAAI;AAEf,gBAAMgF,MADO,MAAMhF,EAAS,KAAA,GACO,YAAY,CAAA,GAC5C;AAAA,YACC,CAACqT,MACCA,EAAG,gBAAgBA,EAAG;AAAA,UAAA,EAEzB,IAAI,CAACA,OAA0C;AAAA,YAC9C,IAAI,WAAWA,EAAG,IAAI;AAAA,YACtB,MAAM;AAAA,YACN,OAAOA,EAAG,SAASA,EAAG;AAAA,YACtB,aAAa,SAASA,EAAG,IAAI;AAAA,YAC7B,MAAM;AAAA,YACN,SAASA,EAAG;AAAA,UAAA,EACZ;AACJ,UAAAJ,EAAYjO,CAAK;AAAA,QACnB;AAAA,MACF,QAAQ;AAGN,cAAMA,IADYoN,GAAA,EACqB,IAAI,CAAAxG,OAAM;AAAA,UAC/C,IAAI,WAAWA,EAAE,IAAI;AAAA,UACrB,MAAM;AAAA,UACN,OAAOA,EAAE,SAASA,EAAE;AAAA,UACpB,aAAa,SAASA,EAAE,IAAI;AAAA,UAC5B,MAAM;AAAA,UACN,SAASA,EAAE;AAAA,QAAA,EACX;AACF,QAAAqH,EAAYjO,CAAK;AAAA,MACnB;AAAA,IACF;AAEA,IAAI4I,KACFwF,EAAA;AAAA,EAEJ,GAAG,CAACxF,CAAI,CAAC;AAGT,QAAM,EAAE,QAAQ3E,EAAA,IAAkB4B,GAAQ;AAAA,IACxC,UAAU;AAAA,IACV,SACE1K,EAAM,UAAU,IACZ,CAAC,EAAE,OAAO,KAAK,UAAU,YAAY,OAAOA,EAAA,CAAO,IACnD,CAAA;AAAA,IACN,YAAY,EAAE,UAAU,EAAA;AAAA,IACxB,cAAc,EAAE,SAASyN,KAAQzN,EAAM,UAAU,EAAA;AAAA,EAAE,CACpD,GAGKmT,IAA+BrO,EAAQ,MACtCgE,KAAA,QAAAA,EAAe,OACbA,EAAc,KAAK,IAAI,CAAAsK,MAAO;AACnC,UAAMC,IAAID;AAMV,WAAO;AAAA,MACL,IAAI,OAAOC,EAAE,MAAM,SAAS;AAAA,MAC5B,MAAM;AAAA,MACN,OAAOA,EAAE,SAASA,EAAE,QAAQ,OAAOA,EAAE,MAAM,SAAS;AAAA,MACpD,aAAaA,EAAE;AAAA,MACf,MAAM;AAAA,MACN,SAASA,EAAE;AAAA,IAAA;AAAA,EAEf,CAAC,IAhBgC,CAAA,GAiBhC,CAACvK,CAAa,CAAC,GAGZwK,IAA6BxO,EAAQ,MAAM;AAC/C,QAAI9E,EAAM,YAAA,EAAc,WAAW,MAAM,GAAG;AAC1C,YAAMuT,IAAavT,EAAM,MAAM,CAAC,EAAE,YAAA;AAClC,aAAO6S,EACJ,OAAO,CAAAK,MAAMA,EAAG,MAAM,cAAc,SAASK,CAAU,CAAC,EACxD,MAAM,GAAG,CAAC,EACV,IAAI,CAAAL,OAAO;AAAA,QACV,IAAI,OAAOA,EAAG,OAAO;AAAA,QACrB,MAAM;AAAA,QACN,OAAO,OAAOA,EAAG,KAAK;AAAA,QACtB,aAAa,gBAAgBA,EAAG,KAAK;AAAA,QACrC,MAAM;AAAA,QACN,SAASA,EAAG;AAAA,MAAA,EACZ;AAAA,IACN;AACA,WAAO,CAAA;AAAA,EACT,GAAG,CAACL,GAAU7S,CAAK,CAAC,GAGdwT,IAAgB1O,EAAQ,MAAM;AAClC,UAAM2O,IAAazT,EAAM,YAAA;AAezB,WAbiB;AAAA,MACf,GAAGsT;AAAA,MACH,GAAGT,EAAS;AAAA,QACV,CAAAK,MAAA;;AACE,iBAAAA,EAAG,MAAM,YAAA,EAAc,SAASO,CAAU,OAC1ClW,IAAA2V,EAAG,YAAH,gBAAA3V,EAAY,cAAc,SAASkW;AAAA;AAAA,MAAU;AAAA,MAEjD,GAAGN;AAAA,MACH,GAAGZ,GAAiB;AAAA,QAAO,OACzBmB,EAAI,MAAM,YAAA,EAAc,SAASD,CAAU;AAAA,MAAA;AAAA,IAC7C,EAGc,MAAM,GAAG,EAAE;AAAA,EAC7B,GAAG,CAACZ,GAAUM,GAAeG,GAAatT,CAAK,CAAC;AAGhD,EAAAwI,EAAU,MAAM;AACd,IAAAoK,EAAiB,CAAC;AAAA,EACpB,GAAG,CAACY,EAAc,MAAM,CAAC,GAGzBhL,EAAU,MAAM;AACd,IAAIiF,KAAQV,EAAS,YACnBA,EAAS,QAAQ,MAAA,GACjB2F,EAAS,EAAE,GACXE,EAAiB,CAAC;AAAA,EAEtB,GAAG,CAACnF,CAAI,CAAC;AAGT,QAAMkG,IAAiBrK;AAAA,IACrB,CAAC9G,MAAsB;AACrB,MAAAiQ,EAAA,GAEIjQ,EAAK,SAAS,aAAaA,EAAK,UAClCuQ,EAAG,EAAE,IAAI,QAAQvQ,EAAK,OAAO,SAAS,IAC7BA,EAAK,SAAS,cAAcA,EAAK,UAC1CuQ,EAAG;AAAA,QACD,IAAI,QAAQvQ,EAAK,OAAO,WAAWA,EAAK,GAAG,QAAQ,QAAQ,EAAE,CAAC;AAAA,MAAA,CAC/D,IACQA,EAAK,SAAS,cACnBA,EAAK,OAAO,kBACduQ,EAAG,EAAE,IAAI,kBAAkB,IAClBvQ,EAAK,OAAO,iBACrBuQ,EAAG,EAAE,IAAI,iBAAiB,IACjBvQ,EAAK,OAAO,eACrBuQ,EAAG,EAAE,IAAI,WAAW,IACXvQ,EAAK,GAAG,WAAW,MAAM,KAAKA,EAAK,UAC5CuQ,EAAG,EAAE,IAAI,QAAQvQ,EAAK,OAAO,QAAQ,IAC5BA,EAAK,UACdA,EAAK,OAAA;AAAA,IAGX;AAAA,IACA,CAACuQ,GAAIN,CAAO;AAAA,EAAA,GAIRnF,IAAgBhE;AAAA,IACpB,CAAC1D,MAA2B;AAC1B,MAAIA,EAAE,QAAQ,eACZA,EAAE,eAAA,GACFgN,EAAiB,CAAAgB,MAAK,KAAK,IAAIA,IAAI,GAAGJ,EAAc,SAAS,CAAC,CAAC,KACtD5N,EAAE,QAAQ,aACnBA,EAAE,eAAA,GACFgN,EAAiB,OAAK,KAAK,IAAIgB,IAAI,GAAG,CAAC,CAAC,KAC/BhO,EAAE,QAAQ,WAAW4N,EAAcb,CAAa,KACzD/M,EAAE,eAAA,GACF+N,EAAeH,EAAcb,CAAa,CAAC,KAClC/M,EAAE,QAAQ,YACnB6M,EAAA;AAAA,IAEJ;AAAA,IACA,CAACe,GAAeb,GAAegB,GAAgBlB,CAAO;AAAA,EAAA;AAGxD,SAAKhF,IAGH,gBAAA/J,EAAA2K,GAAA,EAEE,UAAA;AAAA,IAAA,gBAAA1K;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAS8O;AAAA,QACT,OAAO;AAAA,UACL,UAAU;AAAA,UACV,OAAO;AAAA,UACP,iBAAiB;AAAA,UACjB,QAAQ;AAAA,QAAA;AAAA,MACV;AAAA,IAAA;AAAA,IAIF,gBAAA/O;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,KAAK;AAAA,UACL,MAAM;AAAA,UACN,WAAW;AAAA,UACX,OAAO;AAAA,UACP,UAAU;AAAA,UACV,iBAAiB;AAAA,UACjB,cAAc;AAAA,UACd,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,UAAU;AAAA,QAAA;AAAA,QAIZ,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,cAAc;AAAA,cAAA;AAAA,cAGhB,UAAA,gBAAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,KAAKoJ;AAAA,kBACL,MAAK;AAAA,kBACL,aAAY;AAAA,kBACZ,OAAO/M;AAAA,kBACP,UAAU,CAAA4F,MAAK8M,EAAS9M,EAAE,OAAO,KAAK;AAAA,kBACtC,WAAW0H;AAAA,kBACX,OAAO;AAAA,oBACL,OAAO;AAAA,oBACP,SAAS;AAAA,oBACT,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,iBAAiB;AAAA,oBACjB,OAAO;AAAA,kBAAA;AAAA,gBACT;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,UAIF,gBAAA5J,EAAC,SAAI,OAAO,EAAE,WAAW,SAAS,UAAU,UACzC,UAAA;AAAA,YAAA8P,EAAc,WAAW,KAAKxT,KAC7B,gBAAA2D;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,OAAO;AAAA,kBACP,WAAW;AAAA,gBAAA;AAAA,gBAEd,UAAA;AAAA,cAAA;AAAA,YAAA;AAAA,YAKF6P,EAAc,IAAI,CAAChR,GAAMqR,MACxB,gBAAAnQ;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,SAAS,MAAMiQ,EAAenR,CAAI;AAAA,gBAClC,cAAc,MAAMoQ,EAAiBiB,CAAG;AAAA,gBACxC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,KAAK;AAAA,kBACL,iBACElB,MAAkBkB,IACd,8BACA;AAAA,gBAAA;AAAA,gBAGR,UAAA;AAAA,kBAAA,gBAAAlQ,EAAC,UAAK,OAAO,EAAE,UAAU,UAAA,GAAc,YAAK,MAAK;AAAA,oCAChD,OAAA,EAAI,OAAO,EAAE,MAAM,KAClB,UAAA;AAAA,oBAAA,gBAAAA,EAAC,OAAA,EAAI,OAAO,EAAE,YAAY,KAAK,OAAO,oBAAA,GACnC,UAAAnB,EAAK,MAAA,CACR;AAAA,oBACCA,EAAK,eACJ,gBAAAmB;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,OAAO;AAAA,0BACL,UAAU;AAAA,0BACV,OAAO;AAAA,wBAAA;AAAA,wBAGR,UAAAnB,EAAK;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBACR,GAEJ;AAAA,kBACA,gBAAAmB;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,OAAO;AAAA,wBACL,UAAU;AAAA,wBACV,SAAS;AAAA,wBACT,iBAAiB;AAAA,wBACjB,cAAc;AAAA,wBACd,OAAO;AAAA,sBAAA;AAAA,sBAGR,UAAAnB,EAAK;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACR;AAAA,cAAA;AAAA,cAzCKA,EAAK;AAAA,YAAA,CA2Cb;AAAA,UAAA,GACH;AAAA,UAGA,gBAAAkB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,WAAW;AAAA,gBACX,SAAS;AAAA,gBACT,KAAK;AAAA,gBACL,UAAU;AAAA,gBACV,OAAO;AAAA,cAAA;AAAA,cAGT,UAAA;AAAA,gBAAA,gBAAAC,EAAC,UAAK,UAAA,cAAA,CAAW;AAAA,gBACjB,gBAAAA,EAAC,UAAK,UAAA,WAAA,CAAQ;AAAA,gBACd,gBAAAA,EAAC,UAAK,UAAA,YAAA,CAAS;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACjB;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF,IAxIgB;AA0IpB;AChZO,MAAMmQ,KAAO,MAAM;AACxB,QAAM,EAAE,QAAQC,EAAA,IAAWC,GAAA,GACrB,EAAE,WAAAC,EAAA,IAAcC,GAAA;AAEtB,SACE,gBAAAxQ,EAAC,OAAA,EAAI,WAAU,QACb,UAAA;AAAA,IAAA,gBAAAC,EAAC,QACE,UAAAsQ,EAAU,IAAI,CAACzR,MACd,gBAAAmB,EAAC,QACC,UAAA,gBAAAA,EAACwQ,IAAA,EAAQ,IAAI3R,EAAK,SAAS,KAAM,UAAAA,EAAK,MAAA,CAAM,KADrCA,EAAK,GAEd,CACD,EAAA,CACH;AAAA,sBACC,UAAA,EAAO,SAAS,MAAMuR,EAAA,GAAU,UAAA,SAAA,CAAM;AAAA,EAAA,GACzC;AAEJ,GChBaK,KAAa,MAAM;AAC9B,QAAM,EAAE,aAAAC,EAAA,IAAgBC,GAAA;AAExB,2BACG,MAAA,EAAG,WAAU,cACX,UAAAD,EAAY,IAAI,CAACE,MAEd,gBAAA5Q,EAAC,QACE,UAAA4Q,EAAW,yBACTC,IAAA,EAAK,IAAID,EAAW,MAAO,UAAAA,EAAW,OAAM,IAE7C,gBAAA5Q,EAAC,UAAM,UAAA4Q,EAAW,MAAA,CAAM,KAJnB,cAAcA,EAAW,KAAK,EAMvC,CAEH,EAAA,CACH;AAEJ,GCjBaE,KAAsC,CAAC,EAAE,UAAAtR,QAElD,gBAAAO,EAAC,OAAA,EAAI,WAAU,UACb,UAAA;AAAA,EAAA,gBAAAC,EAACmQ,IAAA,EAAK;AAAA,EACN,gBAAApQ,EAAC,OAAA,EAAI,WAAU,WACb,UAAA;AAAA,IAAA,gBAAAC,EAACyQ,IAAA,EAAW;AAAA,IACZ,gBAAAzQ,EAAC,SAAK,UAAAR,EAAA,CAAS;AAAA,EAAA,EAAA,CACjB;AAAA,GACF;ACQJ,eAAeuR,GAAiBnE,GAAuC;AACrE,QAAM1Q,IAAW,MAAM,MAAM,GAAGrC,EAAQ,IAAI+S,CAAO,IAAI;AAAA,IACrD,aAAa;AAAA,EAAA,CACd;AAED,MAAI,CAAC1Q,EAAS,IAAI;AAChB,UAAMC,IAAW,MAAMD,EACpB,OACA,MAAM,OAAO,EAAE,QAAQA,EAAS,WAAA,EAAa,GAM1C1B,IACJ2B,EAAQ,WAAWA,EAAQ,UAAUD,EAAS;AAEhD,UAAM,IAAI;AAAA,MACR,gCAAgC0Q,CAAO,KAAKpS,CAAc;AAAA,IAAA;AAAA,EAE9D;AAEA,SAAO0B,EAAS,KAAA;AAClB;AAwCO,SAAS8U,GAAepE,GAAuC;AACpE,QAAM;AAAA,IACJ,MAAMqE;AAAA,IACN,WAAA1L;AAAA,IACA,OAAAvI;AAAA,IACA,SAAAoQ;AAAA,EAAA,IACEC,GAA6B;AAAA,IAC/B,UAAU,CAAC,gBAAgBT,CAAO;AAAA,IAClC,SAAS,MAAMmE,GAAiBnE,CAAO;AAAA;AAAA,IAEvC,WAAW;AAAA;AAAA,IACX,QAAQ;AAAA;AAAA;AAAA,IAER,SAAS,EAAQA;AAAA,EAAO,CACzB;AAED,SAAO;AAAA,IACL,QAAQqE,KAAA,gBAAAA,EAAM;AAAA,IACd,QAAQA,KAAA,gBAAAA,EAAM;AAAA,IACd,aAAaA,KAAA,gBAAAA,EAAM;AAAA,IACnB,UAAUA,KAAA,gBAAAA,EAAM;AAAA,IAChB,MAAAA;AAAA,IACA,WAAA1L;AAAA,IACA,OAAOvI,KAAS;AAAA,IAChB,SAAAoQ;AAAA,EAAA;AAEJ;AAOO,SAAS8D,KAAyB;AAEvC,SAAA7D,GAAS;AAAA,IACP,UAAU,CAAC,iBAAiB;AAAA,IAC5B,SAAS,MAAM;AAAA,IACf,SAAS;AAAA,EAAA,CACV,GAEM;AAAA,IACL,UAAU,CAACT,MAAoB;AAG7B,MAAAmE,GAAiBnE,CAAO,EAAE,MAAM,MAAM;AAAA,MAEtC,CAAC;AAAA,IACH;AAAA,EAAA;AAEJ;ACxDO,SAASuE,KAAiC;AAC/C,QAAM,CAACjC,GAAUkC,CAAW,IAAIzQ,EAAwB,CAAA,CAAE,GACpD,CAAC4E,GAAWC,CAAY,IAAI7E,EAAS,EAAI,GACzC,CAAC3D,GAAOmM,CAAQ,IAAIxI,EAAuB,IAAI,GAE/C0Q,IAAgB,YAAY;AAChC,QAAI;AACF,MAAA7L,EAAa,EAAI,GACjB2D,EAAS,IAAI;AAEb,YAAMjN,IAAW,MAAM,MAAM,oBAAoB;AAEjD,UAAI,CAACA,EAAS;AACZ,cAAM,IAAI,MAAM,6BAA6BA,EAAS,UAAU,EAAE;AAGpE,YAAM0B,IAAyB,MAAM1B,EAAS,KAAA;AAC9C,MAAAkV,EAAYxT,EAAK,QAAQ;AAAA,IAC3B,SAASG,GAAK;AACZ,cAAQ,MAAM,4BAA4BA,CAAG,GAC7CoL,EAASpL,aAAe,QAAQA,IAAM,IAAI,MAAM,OAAOA,CAAG,CAAC,CAAC;AAAA,IAC9D,UAAA;AACE,MAAAyH,EAAa,EAAK;AAAA,IACpB;AAAA,EACF;AAEA,EAAAX,EAAU,MAAM;AACd,IAAAwM,EAAA;AAAA,EACF,GAAG,CAAA,CAAE;AAGL,QAAMC,IAA8BpC,EACjC,OAAO,CAAAK,MAAMA,EAAG,gBAAgBA,EAAG,YAAY,EAC/C,IAAI,CAAAA,OAAO;AAAA,IACV,MAAMA,EAAG;AAAA,IACT,MAAM,QAAQA,EAAG,IAAI;AAAA,IACrB,QAAQ,QAAQA,EAAG,IAAI;AAAA,IACvB,MAAM,QAAQA,EAAG,IAAI;AAAA,IACrB,MAAM,QAAQA,EAAG,IAAI;AAAA,IACrB,MAAM;AAAA,MACJ,OAAOA,EAAG;AAAA,MACV,WAAW;AAAA,IAAA;AAAA,EACb,EACA;AAEJ,SAAO;AAAA,IACL,UAAAL;AAAA,IACA,WAAAoC;AAAA,IACA,WAAA/L;AAAA,IACA,OAAAvI;AAAA,IACA,SAASqU;AAAA,EAAA;AAEb;AC5DO,SAASE,GAAc;AAAA,EAC5B,UAAAhX;AAAA,EACA,eAAAsO;AAAA,EACA,SAAA/E;AACF,GAA8C;AAC5C,QAAM,CAAC0N,GAAaC,CAAc,IAAI9Q,EAA6B,IAAI,GACjE,CAAC3D,GAAOmM,CAAQ,IAAIxI,EAAwB,IAAI,GAEhD2I,IAAiBC,GAAA,GAEjBmI,IAAY/L,EAAY,CAACwC,GAAeS,GAAevN,MAAmB;AAC9E,IAAAoW,EAAe,EAAE,OAAAtJ,GAAO,OAAAS,GAAO,eAAevN,GAAO,GACrD8N,EAAS,IAAI;AAAA,EACf,GAAG,CAAA,CAAE,GAECwI,IAAahM,EAAY,MAAM;AACnC,IAAA8L,EAAe,IAAI,GACnBtI,EAAS,IAAI;AAAA,EACf,GAAG,CAAA,CAAE,GAECyI,IAAWjM,EAAY,OAAOtK,MAAmB;AACrD,QAAKmW,GAGL;AAAA,UAAInW,MAAUmW,EAAY,eAAe;AACvC,QAAAC,EAAe,IAAI;AACnB;AAAA,MACF;AAEA,aAAO,IAAI,QAAc,CAACI,GAASC,MAAW;AAC5C,QAAAxI,EAAe;AAAA,UACb;AAAA,YACE,UAAA/O;AAAA,YACA,IAAIiX,EAAY;AAAA,YAChB,QAAQ,EAAE,CAACA,EAAY,KAAK,GAAGnW,EAAA;AAAA,UAAM;AAAA,UAEvC;AAAA,YACE,WAAW,MAAM;AACf,cAAAoW,EAAe,IAAI,GACnBtI,EAAS,IAAI,GACbN,KAAA,QAAAA,KACAgJ,EAAA;AAAA,YACF;AAAA,YACA,SAAS,CAAC9T,MAAQ;AAChB,oBAAMgU,IAAWhU,EAAI,WAAW;AAChC,cAAAoL,EAAS4I,CAAQ,GACjBjO,KAAA,QAAAA,EAAU,IAAI,MAAMiO,CAAQ,IAC5BD,EAAO,IAAI,MAAMC,CAAQ,CAAC;AAAA,YAC5B;AAAA,UAAA;AAAA,QACF;AAAA,MAEJ,CAAC;AAAA;AAAA,EACH,GAAG,CAACP,GAAajX,GAAU+O,GAAgBT,GAAe/E,CAAO,CAAC,GAE5DiF,IAAYpD,EAAY,CAACwC,GAAeS,OACrC4I,KAAA,gBAAAA,EAAa,WAAUrJ,MAASqJ,KAAA,gBAAAA,EAAa,WAAU5I,GAC7D,CAAC4I,CAAW,CAAC,GAEV5H,IAAWN,EAAe,SAAS;AAEzC,SAAO;AAAA,IACL,aAAAkI;AAAA,IACA,WAAAE;AAAA,IACA,YAAAC;AAAA,IACA,UAAAC;AAAA,IACA,WAAA7I;AAAA,IACA,UAAAa;AAAA,IACA,OAAA5M;AAAA,EAAA;AAEJ;ACnDO,SAASgV,GAA8C;AAAA,EAC5D,UAAAzX;AAAA,EACA,OAAA2G;AAAA,EACA,WAAA+Q;AAAA,EACA,SAAAnO;AACF,GAAsD;AACpD,QAAM,CAACmE,GAAaiK,CAAc,IAAIvR,EAAsB,oBAAI,KAAK,GAE/DwR,IAAiBC,GAAA,GACjB9I,IAAiB+I,GAAA,GAGjBC,IAAgBnR;AAAA,IACpB,MAAMD,EAAM,OAAO,CAACrC,MAASoJ,EAAY,IAAIpJ,EAAK,EAAE,CAAC;AAAA,IACrD,CAACqC,GAAO+G,CAAW;AAAA,EAAA,GAGf4C,IAAgB5C,EAAY,MAC5BsK,IAAgBrR,EAAM,SAAS,KAAK+G,EAAY,SAAS/G,EAAM,QAC/DsR,IAAiBvK,EAAY,OAAO,KAAKA,EAAY,OAAO/G,EAAM,QAGlEuR,IAAY9M,EAAY,CAACpJ,MAAe;AAC5C,IAAA2V,EAAe,CAACQ,MAAS,IAAI,IAAIA,CAAI,EAAE,IAAInW,CAAE,CAAC;AAAA,EAChD,GAAG,CAAA,CAAE,GAECoW,IAAchN,EAAY,CAACpJ,MAAe;AAC9C,IAAA2V,EAAe,CAACQ,MAAS;AACvB,YAAME,IAAO,IAAI,IAAIF,CAAI;AACzB,aAAAE,EAAK,OAAOrW,CAAE,GACPqW;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAA,CAAE,GAECC,IAAYlN,EAAY,CAACpJ,MAAe;AAC5C,IAAA2V,EAAe,CAACQ,MAAS;AACvB,YAAME,IAAO,IAAI,IAAIF,CAAI;AACzB,aAAIE,EAAK,IAAIrW,CAAE,IACbqW,EAAK,OAAOrW,CAAE,IAEdqW,EAAK,IAAIrW,CAAE,GAENqW;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAA,CAAE,GAECE,IAAYnN,EAAY,MAAM;AAClC,IAAAuM,EAAe,IAAI,IAAIhR,EAAM,IAAI,CAACrC,MAASA,EAAK,EAAE,CAAC,CAAC;AAAA,EACtD,GAAG,CAACqC,CAAK,CAAC,GAEJ6R,IAAcpN,EAAY,MAAM;AACpC,IAAAuM,EAAe,oBAAI,KAAK;AAAA,EAC1B,GAAG,CAAA,CAAE,GAECc,IAAYrN,EAAY,MAAM;AAClC,IAAI4M,IACFQ,EAAA,IAEAD,EAAA;AAAA,EAEJ,GAAG,CAACP,GAAeO,GAAWC,CAAW,CAAC,GAEpCE,IAAatN,EAAY,CAACpJ,MAAe0L,EAAY,IAAI1L,CAAE,GAAG,CAAC0L,CAAW,CAAC,GAG3EiL,IAAavN,EAAY,YAAY;AACzC,QAAIsC,EAAY,SAAS;AAEzB,aAAO,IAAI,QAAc,CAAC4J,GAASC,MAAW;AAC5C,QAAAK,EAAe;AAAA,UACb;AAAA,YACE,UAAA5X;AAAA,YACA,KAAK,MAAM,KAAK0N,CAAW;AAAA,UAAA;AAAA,UAE7B;AAAA,YACE,WAAW,MAAM;AACf,cAAA8K,EAAA,GACAd,KAAA,QAAAA,KACAJ,EAAA;AAAA,YACF;AAAA,YACA,SAAS,CAAC9T,MAAQ;AAChB,cAAA+F,KAAA,QAAAA,EAAU,IAAI,MAAM/F,EAAI,WAAW,eAAe,IAClD+T,EAAO/T,CAAG;AAAA,YACZ;AAAA,UAAA;AAAA,QACF;AAAA,MAEJ,CAAC;AAAA,EACH,GAAG,CAACxD,GAAU0N,GAAakK,GAAgBY,GAAad,GAAWnO,CAAO,CAAC,GAGrEqP,IAAaxN,EAAY,OAAOyN,MAAoC;AACxE,QAAInL,EAAY,SAAS;AAEzB,aAAO,IAAI,QAAc,CAAC4J,GAASC,MAAW;AAC5C,QAAAxI,EAAe;AAAA,UACb;AAAA,YACE,UAAA/O;AAAA,YACA,KAAK,MAAM,KAAK0N,CAAW;AAAA,YAC3B,QAAAmL;AAAA,UAAA;AAAA,UAEF;AAAA,YACE,WAAW,MAAM;AACf,cAAAL,EAAA,GACAd,KAAA,QAAAA,KACAJ,EAAA;AAAA,YACF;AAAA,YACA,SAAS,CAAC9T,MAAQ;AAChB,cAAA+F,KAAA,QAAAA,EAAU,IAAI,MAAM/F,EAAI,WAAW,eAAe,IAClD+T,EAAO/T,CAAG;AAAA,YACZ;AAAA,UAAA;AAAA,QACF;AAAA,MAEJ,CAAC;AAAA,EACH,GAAG,CAACxD,GAAU0N,GAAaqB,GAAgByJ,GAAad,GAAWnO,CAAO,CAAC,GAGrEuP,IAAe1N,EAAY,MAAM;AACrC,UAAM/H,IAAO,KAAK,UAAU0U,GAAe,MAAM,CAAC,GAC5CgB,IAAO,IAAI,KAAK,CAAC1V,CAAI,GAAG,EAAE,MAAM,oBAAoB,GACpD7B,IAAM,IAAI,gBAAgBuX,CAAI,GAC9BtF,IAAI,SAAS,cAAc,GAAG;AACpC,IAAAA,EAAE,OAAOjS,GACTiS,EAAE,WAAW,GAAGzT,CAAQ,gBACxByT,EAAE,MAAA,GACF,IAAI,gBAAgBjS,CAAG;AAAA,EACzB,GAAG,CAACxB,GAAU+X,CAAa,CAAC,GAGtBiB,IAAc5N,EAAY,CAAC6N,MAAqB;AACpD,UAAMhL,IAASgL,EAAO,KAAK,GAAG,GACxBnS,IAAOiR,EAAc;AAAA,MAAI,CAACzT,MAC9B2U,EAAO,IAAI,CAACzH,MAAM;AAChB,cAAM0H,IAAM5U,EAAKkN,CAAC;AAClB,YAAI0H,KAAQ,KAA2B,QAAO;AAC9C,cAAMC,IAAM,OAAOD,CAAG;AAEtB,eAAIC,EAAI,SAAS,GAAG,KAAKA,EAAI,SAAS,GAAG,KAAKA,EAAI,SAAS;AAAA,CAAI,IACtD,IAAIA,EAAI,QAAQ,MAAM,IAAI,CAAC,MAE7BA;AAAA,MACT,CAAC,EAAE,KAAK,GAAG;AAAA,IAAA,GAEPC,IAAM,CAACnL,GAAQ,GAAGnH,CAAI,EAAE,KAAK;AAAA,CAAI,GACjCiS,IAAO,IAAI,KAAK,CAACK,CAAG,GAAG,EAAE,MAAM,YAAY,GAC3C5X,IAAM,IAAI,gBAAgBuX,CAAI,GAC9BtF,IAAI,SAAS,cAAc,GAAG;AACpC,IAAAA,EAAE,OAAOjS,GACTiS,EAAE,WAAW,GAAGzT,CAAQ,eACxByT,EAAE,MAAA,GACF,IAAI,gBAAgBjS,CAAG;AAAA,EACzB,GAAG,CAACxB,GAAU+X,CAAa,CAAC,GAEtB/M,IAAY4M,EAAe,SAAS,aAAa7I,EAAe,SAAS;AAE/E,SAAO;AAAA,IACL,aAAArB;AAAA,IACA,eAAAqK;AAAA,IACA,eAAAzH;AAAA,IACA,eAAA0H;AAAA,IACA,gBAAAC;AAAA,IACA,WAAAC;AAAA,IACA,aAAAE;AAAA,IACA,WAAAE;AAAA,IACA,WAAAC;AAAA,IACA,aAAAC;AAAA,IACA,WAAAC;AAAA,IACA,YAAAC;AAAA,IACA,YAAAC;AAAA,IACA,YAAAC;AAAA,IACA,cAAAE;AAAA,IACA,aAAAE;AAAA,IACA,WAAAhO;AAAA,EAAA;AAEJ;ACjOO,SAASqO,KAA6C;AAC3D,QAAM,CAACvO,GAAQC,CAAS,IAAI3E,EAAS,EAAK,GAEpCmJ,IAAOnE,EAAY,MAAML,EAAU,EAAI,GAAG,CAAA,CAAE,GAC5CuO,IAAQlO,EAAY,MAAML,EAAU,EAAK,GAAG,CAAA,CAAE,GAC9CwO,IAASnO,EAAY,MAAML,EAAU,CAACoN,MAAS,CAACA,CAAI,GAAG,EAAE;AAG/D,SAAA7N,EAAU,MAAM;AACd,UAAM8E,IAAgB,CAAC1H,MAAqB;AAE1C,OAAKA,EAAE,WAAWA,EAAE,YAAYA,EAAE,QAAQ,QACxCA,EAAE,eAAA,GACF6R,EAAA;AAAA,IAEJ;AAEA,kBAAO,iBAAiB,WAAWnK,CAAa,GACzC,MAAM,OAAO,oBAAoB,WAAWA,CAAa;AAAA,EAClE,GAAG,CAACmK,CAAM,CAAC,GAEJ;AAAA,IACL,QAAAzO;AAAA,IACA,MAAAyE;AAAA,IACA,OAAA+J;AAAA,IACA,QAAAC;AAAA,EAAA;AAEJ;ACzBO,SAASC,GAAeC,IAAY,UAAgC;AACzE,QAAM,EAAE,GAAG,MAAAC,GAAM,OAAAC,EAAA,IAAUC,GAAmBH,CAAS;AAEvD,SAAO;AAAA,IACL;AAAA,IACA,UAAUC,EAAK;AAAA,IACf,gBAAgB,CAACG,MAAgBH,EAAK,eAAeG,CAAG;AAAA,IACxD,WAAWH,EAAK;AAAA,IAChB,OAAAC;AAAA,EAAA;AAEJ;ACmEA,MAAMG,yBAAkB,IAAA;AAExB,SAASC,GAAmBC,GAAyB;AACnD,QAAMC,IAAUD,EAAQ,KAAA,EAAO,QAAQ,QAAQ,EAAE;AACjD,SAAKC,IAMEA,EAAQ,QAAQ,eAAe,EAAE,IAL/B;AAMX;AASO,SAASC,GACd7H,GACA2H,IAAkB,IAClBG,GACiB;AACjB,QAAMC,IAAoD/H,GACpD,CAACgI,GAAQC,CAAS,IAAIlU;AAAA,IAC1B,MAAM0T,GAAY,IAAIM,CAAQ,KAAK;AAAA,EAAA,GAE/B,CAACpP,GAAWC,CAAY,IAAI7E,EAAS,CAAC0T,GAAY,IAAIM,CAAQ,CAAC,GAC/D,CAAC3X,GAAOmM,CAAQ,IAAIxI,EAAwB,IAAI,GAEhDmU,IAAYnP,EAAY,YAAY;AACxC,IAAAH,EAAa,EAAI,GACjB2D,EAAS,IAAI;AACb,QAAI;AACF,YAAMtO,IAAS,IAAI,gBAAA;AACnB,MAAI6Z,KAAA,QAAAA,EAAW;AAIf,YAAMpY,IAAczB,EAAO,SAAA,GAErBkB,IAAM,GADQuY,GAAmBC,CAAO,CACpB,aAAa,mBAAmB3H,CAAO,CAAC,GAAGtQ,IAAc,IAAIA,CAAW,KAAK,EAAE,IACnGJ,IAAW,MAAM,MAAMH,CAAG;AAChC,UAAI,CAACG,EAAS;AACZ,cAAM,IAAI;AAAA,UACR,4BAA4B0Q,CAAO,KAAK1Q,EAAS,MAAM;AAAA,QAAA;AAI3D,YAAM+U,KAD6B,MAAM/U,EAAS,KAAA,GACxB,WAAW,EAAE,SAAA0Q,EAAA;AACvC,MAAAyH,GAAY,IAAIM,GAAU1D,CAAI,GAC9B4D,EAAU5D,CAAI;AAAA,IAChB,SAASlT,GAAK;AACZ,MAAAoL,EAASpL,aAAe,QAAQA,EAAI,UAAU,eAAe,GAE7D8W,EAAU,EAAE,SAAAjI,GAAS;AAAA,IACvB,UAAA;AACE,MAAApH,EAAa,EAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC+O,GAASI,GAAU/H,GAAS8H,CAAS,CAAC;AAE1C,SAAA7P,EAAU,MAAM;AACd,IAAKwP,GAAY,IAAIM,CAAQ,KAC3BG,EAAA;AAAA,EAEJ,GAAG,CAACH,GAAUG,CAAS,CAAC,GAEjB,EAAE,QAAAF,GAAQ,WAAArP,GAAW,OAAAvI,GAAO,SAAS8X,EAAA;AAC9C;AC7KA,MAAMC,yBAAmB,IAAA,GAGnBC,yBAAmB,IAAA;AAKlB,SAASC,GAAavG,GAAsC;AACjE,EAAAqG,GAAa,IAAIrG,EAAa,MAAMA,CAAY;AAClD;AAKO,SAASwG,GAAiB5W,GAAsD;;AACrF,UAAO1E,IAAAmb,GAAa,IAAIzW,CAAI,MAArB,gBAAA1E,EAAwB;AACjC;AAKO,SAASub,KAAyC;AACvD,SAAO,MAAM,KAAKJ,GAAa,OAAA,CAAQ;AACzC;AAKO,SAASK,GAAoB9W,GAA8C;AAChF,SAAOyW,GAAa,IAAIzW,CAAI;AAC9B;AAKO,SAAS+W,GAAgBzI,GAAiB0I,GAAyB;AACxE,EAAAN,GAAa,IAAIpI,GAAS0I,CAAK;AACjC;AAMO,SAASC,GAAgB3I,GAA6B;AAC3D,SAAOoI,GAAa,IAAIpI,CAAO,KAAK,CAAC,MAAM;AAC7C;AAKO,SAAS4I,GAAgB5I,GAAiB6I,GAA6B;AAE5E,SADcF,GAAgB3I,CAAO,EACxB,SAAS6I,CAAQ;AAChC;ACjCA,SAASC,GAAe;AAAA,EACtB,MAAA7W;AAAA,EACA,UAAAtE;AAAA,EACA,YAAAob;AAAA,EACA,WAAAC;AAAA,EACA,YAAAC;AAAA,EACA,SAAA3P;AAAA,EACA,SAAA4I;AAAA,EACA,SAAAgH;AACF,GASG;;AACD,QAAM,CAAC5V,GAAO6V,CAAQ,IAAIpV,EAAS,OAAO9B,EAAK8W,CAAU,KAAK9W,EAAK,IAAI,CAAC,GAClE,CAACmX,GAAMC,CAAO,IAAItV;AAAA,IACtBiV,IAAY,OAAO/W,EAAK+W,CAAS,KAAK,EAAE,IAAI;AAAA,EAAA,GAExC,CAAC3b,GAAQic,CAAS,IAAIvV;AAAA,IAC1B,OAAO9B,EAAKgX,CAAU,OAAKjc,IAAAsM,EAAQ,CAAC,MAAT,gBAAAtM,EAAY,OAAM,EAAE;AAAA,EAAA,GAE3C,CAACuc,GAAQC,CAAS,IAAIzV,EAAS,EAAK,GAEpC,EAAE,QAAQ0V,EAAA,IAAe9M,GAAA,GAEzB+M,IAAa3Q,EAAY,MAAM;AACnC,IAAAyQ,EAAU,EAAI;AACd,UAAMhD,IAAkC;AAAA,MACtC,CAACuC,CAAU,GAAGzV;AAAA,MACd,CAAC2V,CAAU,GAAG5b;AAAA,IAAA;AAEhB,IAAI2b,MAAWxC,EAAOwC,CAAS,IAAII,IAEnCK;AAAA,MACE,EAAE,UAAA9b,GAAU,IAAIsE,EAAK,IAAI,QAAAuU,EAAA;AAAA,MACzB;AAAA,QACE,WAAW,MAAM;AACf,UAAAgD,EAAU,EAAK,GACfN,EAAA,GACAhH,EAAA;AAAA,QACF;AAAA,QACA,SAAS,MAAMsH,EAAU,EAAK;AAAA,MAAA;AAAA,IAChC;AAAA,EAEJ,GAAG;AAAA,IACDlW;AAAA,IACA8V;AAAA,IACA/b;AAAA,IACA0b;AAAA,IACAC;AAAA,IACAC;AAAA,IACAtb;AAAA,IACAsE,EAAK;AAAA,IACLwX;AAAA,IACAP;AAAA,IACAhH;AAAA,EAAA,CACD,GAGKnF,IAAgBhE;AAAA,IACpB,CAAC1D,MAA2B;AAC1B,MAAIA,EAAE,QAAQ,YAAU6M,EAAA;AAAA,IAC1B;AAAA,IACA,CAACA,CAAO;AAAA,EAAA;AAGV,SACE,gBAAA9O;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAW;AAAA,MACX,cAAY,QAAQ,OAAOnB,EAAK8W,CAAU,KAAK9W,EAAK,IAAI,CAAC;AAAA,MACzD,OAAO;AAAA,QACL,UAAU;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,YAAY;AAAA,MAAA;AAAA,MAEd,SAASiQ;AAAA,MACT,WAAWnF;AAAA,MAEX,UAAA,gBAAA5J;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAAS,CAAAkC,MAAKA,EAAE,gBAAA;AAAA,UAChB,OAAO;AAAA,YACL,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,SAAS;AAAA,YACT,OAAO;AAAA,YACP,UAAU;AAAA,YACV,WAAW;AAAA,UAAA;AAAA,UAGb,UAAA;AAAA,YAAA,gBAAAlC;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,gBAAgB;AAAA,kBAChB,YAAY;AAAA,kBACZ,cAAc;AAAA,gBAAA;AAAA,gBAGhB,UAAA;AAAA,kBAAA,gBAAAC,EAAC,MAAA,EAAG,OAAO,EAAE,QAAQ,GAAG,UAAU,QAAQ,YAAY,IAAA,GAAO,UAAA,aAAA,CAE7D;AAAA,kBACA,gBAAAA;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,SAAS8O;AAAA,sBACT,cAAW;AAAA,sBACX,WAAU;AAAA,sBACV,OAAO,EAAE,SAAS,kBAAkB,WAAW,QAAA;AAAA,sBAChD,UAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAED;AAAA,cAAA;AAAA,YAAA;AAAA,YAIF,gBAAA9O;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,OAAO;AAAA,kBACP,cAAc;AAAA,gBAAA;AAAA,gBAGf,UAAA2V;AAAA,cAAA;AAAA,YAAA;AAAA,YAEH,gBAAA3V;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAOE;AAAA,gBACP,UAAU,CAAA+B,MAAK8T,EAAS9T,EAAE,OAAO,KAAK;AAAA,gBACtC,OAAO,EAAE,OAAO,QAAQ,cAAc,oBAAA;AAAA,gBACtC,WAAS;AAAA,cAAA;AAAA,YAAA;AAAA,YAIX,gBAAAjC;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,OAAO;AAAA,kBACP,cAAc;AAAA,gBAAA;AAAA,gBAGf,UAAA6V;AAAA,cAAA;AAAA,YAAA;AAAA,YAEH,gBAAA7V;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO/F;AAAA,gBACP,UAAU,CAAAgI,MAAKiU,EAAUjU,EAAE,OAAO,KAAK;AAAA,gBACvC,OAAO,EAAE,OAAO,QAAQ,cAAc,oBAAA;AAAA,gBAErC,UAAAiE,EAAQ,IAAI,CAAAqQ,MACX,gBAAAvW,EAAC,UAAA,EAAoB,OAAOuW,EAAI,IAC7B,UAAAA,EAAI,MAAA,GADMA,EAAI,EAEjB,CACD;AAAA,cAAA;AAAA,YAAA;AAAA,YAIFX,KACC,gBAAA7V,EAAA2K,GAAA,EACE,UAAA;AAAA,cAAA,gBAAA1K;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,OAAO;AAAA,oBACP,cAAc;AAAA,kBAAA;AAAA,kBAGf,UAAA4V;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEH,gBAAA5V;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAOgW;AAAA,kBACP,UAAU,CAAA/T,MAAKgU,EAAQhU,EAAE,OAAO,KAAK;AAAA,kBACrC,MAAM;AAAA,kBACN,OAAO;AAAA,oBACL,OAAO;AAAA,oBACP,cAAc;AAAA,oBACd,QAAQ;AAAA,kBAAA;AAAA,gBACV;AAAA,cAAA;AAAA,YACF,GACF;AAAA,YAGF,gBAAAlC;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,SAAS;AAAA,kBACT,KAAK;AAAA,kBACL,gBAAgB;AAAA,gBAAA;AAAA,gBAGlB,UAAA;AAAA,kBAAA,gBAAAC,EAAC,UAAA,EAAO,WAAU,OAAM,SAAS8O,GAAS,UAAA,UAE1C;AAAA,kBACA,gBAAA9O;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,WAAW,kBAAkBmW,IAAS,iBAAiB,EAAE;AAAA,sBACzD,SAASG;AAAA,sBACT,UAAUH;AAAA,sBAET,cAAS,KAAK;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACjB;AAAA,cAAA;AAAA,YAAA;AAAA,UACF;AAAA,QAAA;AAAA,MAAA;AAAA,IACF;AAAA,EAAA;AAGN;AAWO,SAASK,GAAW,EAAE,UAAAjc,GAAU,QAAAkc,KAA2B;AAChE,QAAMZ,IAAaY,EAAO,cAAc,UAClCd,IAAac,EAAO,cAAc,QAClCb,IAAYa,EAAO,kBAEnB,CAACC,GAAWC,CAAY,IAAIhW,EAA2B,IAAI,GAC3D,CAACiW,GAAgBC,CAAiB,IAAIlW,EAAwB,IAAI,GAClE,CAACmW,GAAaC,CAAc,IAAIpW,EAA4B,IAAI,GAGhE,EAAE,QAAAmG,GAAQ,OAAAzK,EAAA,IAAU0K,GAAoB;AAAA,IAC5C,UAAAxM;AAAA,IACA,YAAY,EAAE,UAAU,IAAA;AAAA,EAAI,CAC7B,GACK2G,KAAQ4F,KAAA,gBAAAA,EAAQ,SAAQ,CAAA,GACxBvB,KAAYlJ,KAAA,gBAAAA,EAAO,cAAa,IAEhC,EAAE,QAAQga,EAAA,IAAe9M,GAAA,GAGzBrD,IAA0B/E,EAAQ,MAAM;AAC5C,QAAIsV,EAAO,WAAWA,EAAO,QAAQ,SAAS,UAAUA,EAAO;AAE/D,UAAMO,wBAAW,IAAA,GACXC,IAA6B,CAAA,GAC7BC,IAAgB;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEF,eAAWrY,KAAQqC,GAAO;AACxB,YAAMuS,IAAM,OAAO5U,EAAKgX,CAAU,KAAK,EAAE;AACzC,MAAIpC,KAAO,CAACuD,EAAK,IAAIvD,CAAG,MACtBuD,EAAK,IAAIvD,CAAG,GACZwD,EAAW,KAAK;AAAA,QACd,IAAIxD;AAAA,QACJ,OAAOA,EAAI,OAAO,CAAC,EAAE,YAAA,IAAgBA,EAAI,MAAM,CAAC,EAAE,QAAQ,MAAM,GAAG;AAAA,QACnE,OAAOyD,EAAcD,EAAW,SAASC,EAAc,MAAM;AAAA,MAAA,CAC9D;AAAA,IAEL;AACA,WAAOD,EAAW,SAAS,IACvBA,IACA;AAAA,MACE,EAAE,IAAI,SAAS,OAAO,SAAS,OAAO,UAAA;AAAA,MACtC,EAAE,IAAI,WAAW,OAAO,WAAW,OAAO,UAAA;AAAA,MAC1C,EAAE,IAAI,YAAY,OAAO,YAAY,OAAO,UAAA;AAAA,MAC5C,EAAE,IAAI,YAAY,OAAO,YAAY,OAAO,UAAA;AAAA,IAAU;AAAA,EAE9D,GAAG,CAACR,EAAO,SAASvV,GAAO2U,CAAU,CAAC,GAGhCsB,IAAehW,EAAQ,MAAM;;AACjC,UAAMiW,IAAuC,CAAA;AAC7C,eAAWb,KAAOrQ,EAAS,CAAAkR,EAAOb,EAAI,EAAE,IAAI,CAAA;AAE5C,eAAW1X,KAAQqC,GAAO;AACxB,YAAMrF,IAAM,OAAOgD,EAAKgX,CAAU,KAAK,EAAE;AACzC,UAAIha,KAAOub;AACT,QAAAA,EAAOvb,CAAG,EAAE,KAAKgD,CAAI;AAAA,WAChB;AAEL,cAAMwY,KAAQzd,IAAAsM,EAAQ,CAAC,MAAT,gBAAAtM,EAAY;AAC1B,QAAIyd,OAAO7V,IAAA4V,EAAOC,CAAK,MAAZ,QAAA7V,EAAe,KAAK3C;AAAA,MACjC;AAAA,IACF;AACA,WAAOuY;AAAA,EACT,GAAG,CAAClW,GAAOgF,GAAS2P,CAAU,CAAC,GAEzByB,IAAa3R;AAAA,IACjB,CAAC4R,MAA2B;AAC1B,UAAI,CAACb,KAAaA,EAAU,iBAAiBa,GAAgB;AAC3D,QAAAZ,EAAa,IAAI,GACjBE,EAAkB,IAAI;AACtB;AAAA,MACF;AACA,MAAAR;AAAA,QACE;AAAA,UACE,UAAA9b;AAAA,UACA,IAAImc,EAAU,KAAK;AAAA,UACnB,QAAQ,EAAE,CAACb,CAAU,GAAG0B,EAAA;AAAA,QAAe;AAAA,QAEzC;AAAA,UACE,WAAW,MAAM;;AACf,aAAK3d,IAAAyC,KAAA,gBAAAA,EAAO,YAAP,QAAAzC,EAAA,KAAAyC;AAAA,UACP;AAAA,QAAA;AAAA,MACF,GAEFsa,EAAa,IAAI,GACjBE,EAAkB,IAAI;AAAA,IACxB;AAAA,IACA,CAACH,GAAWnc,GAAUsb,GAAYQ,GAAYha,CAAK;AAAA,EAAA;AAGrD,SAAIkJ,IAEA,gBAAAxF;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO;AAAA,MAAA;AAAA,MAGT,UAAA;AAAA,QAAA,gBAAAC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,QAAQ,eAAe,OAAO,IAAA;AAAA,UAAI;AAAA,QAAA;AAAA,0BAE5C,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,QAAQ,SAAS,OAAA,GAClD,UAAA,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAAiQ,MACb,gBAAAlQ;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,OAAO;AAAA,cACL,MAAM;AAAA,cACN,YAAY;AAAA,cACZ,cAAc;AAAA,cACd,SAAS;AAAA,YAAA;AAAA,YAGX,UAAA;AAAA,cAAA,gBAAAC;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAU;AAAA,kBACV,OAAO,EAAE,cAAc,SAAA;AAAA,gBAAS;AAAA,cAAA;AAAA,cAEjC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAAwX,MACV,gBAAAxX;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,WAAU;AAAA,kBACV,OAAO;AAAA,oBACL,QAAQ;AAAA,oBACR,cAAc;AAAA,oBACd,cAAc;AAAA,kBAAA;AAAA,gBAChB;AAAA,gBANKwX;AAAA,cAAA,CAQR;AAAA,YAAA;AAAA,UAAA;AAAA,UAtBIvH;AAAA,QAAA,CAwBR,EAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,IAMJ,gBAAAlQ,EAAA2K,GAAA,EACG,UAAA;AAAA,IAAAoM,KACC,gBAAA9W;AAAA,MAAC0V;AAAA,MAAA;AAAA,QACC,MAAMoB;AAAA,QACN,UAAAvc;AAAA,QACA,YAAAob;AAAA,QACA,WAAAC;AAAA,QACA,YAAAC;AAAA,QACA,SAAA3P;AAAA,QACA,SAAS,MAAM6Q,EAAe,IAAI;AAAA,QAClC,SAAS,MAAM;;AACb,WAAKnd,IAAAyC,KAAA,gBAAAA,EAAO,YAAP,QAAAzC,EAAA,KAAAyC;AAAA,QACP;AAAA,MAAA;AAAA,IAAA;AAAA,IAIJ,gBAAA2D;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAW;AAAA,QACX,OAAO;AAAA,UACL,SAAS;AAAA,UACT,KAAK;AAAA,UACL,SAAS;AAAA,UACT,WAAW;AAAA,UACX,WAAW;AAAA,UACX,YAAY;AAAA,QAAA;AAAA,QAGb,UAAAkG,EAAQ,IAAI,CAAAuR,MAAU;;AACrB,gBAAMC,IAASd,MAAmBa,EAAO;AACzC,iBACE,gBAAA1X;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,MAAK;AAAA,cACL,cAAY,GAAG0X,EAAO,KAAK;AAAA,cAC3B,YAAY,CAAAxV,MAAK;AACf,gBAAAA,EAAE,eAAA,GACF4U,EAAkBY,EAAO,EAAE;AAAA,cAC7B;AAAA,cACA,aAAa,MAAMZ,EAAkB,IAAI;AAAA,cACzC,QAAQ,MAAMS,EAAWG,EAAO,EAAE;AAAA,cAClC,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,YAAYC,IACR,6BACA;AAAA,gBACJ,cAAc;AAAA,gBACd,QAAQ,aAAaA,IAAS,yBAAyB,aAAa;AAAA,gBACpE,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,YAAY;AAAA,cAAA;AAAA,cAId,UAAA;AAAA,gBAAA,gBAAA3X;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,cAAc,aAAa0X,EAAO,SAAS,sBAAsB;AAAA,sBACjE,YAAY;AAAA,sBACZ,SAAS;AAAA,sBACT,gBAAgB;AAAA,sBAChB,YAAY;AAAA,sBACZ,cAAc;AAAA,oBAAA;AAAA,oBAGhB,UAAA;AAAA,sBAAA,gBAAAzX,EAAC,UAAK,OAAO,EAAE,OAAO,oBAAA,GACnB,YAAO,OACV;AAAA,sBACA,gBAAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,OAAO;AAAA,4BACL,UAAU;AAAA,4BACV,OAAO;AAAA,4BACP,YAAY;AAAA,4BACZ,cAAc;AAAA,4BACd,SAAS;AAAA,4BACT,YAAY;AAAA,0BAAA;AAAA,0BAGb,YAAApG,IAAAud,EAAaM,EAAO,EAAE,MAAtB,gBAAA7d,EAAyB,WAAU;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBACtC;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAIF,gBAAAmG;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAO;AAAA,sBACL,MAAM;AAAA,sBACN,SAAS;AAAA,sBACT,WAAW;AAAA,sBACX,SAAS;AAAA,sBACT,eAAe;AAAA,sBACf,KAAK;AAAA,sBACL,WAAW;AAAA,oBAAA;AAAA,oBAGZ,UAAA;AAAA,uBAAAyB,IAAA2V,EAAaM,EAAO,EAAE,MAAtB,gBAAAjW,EAAyB,IAAI,CAAA3C,MAAQ;AACpC,8BAAM8Y,KAAajB,KAAA,gBAAAA,EAAW,KAAK,QAAO7X,EAAK;AAC/C,+BACE,gBAAAkB;AAAA,0BAAC;AAAA,0BAAA;AAAA,4BAEC,WAAS;AAAA,4BACT,MAAK;AAAA,4BACL,UAAU;AAAA,4BACV,cAAY,GAAG,OAAOlB,EAAK8W,CAAU,KAAK9W,EAAK,IAAI,CAAC;AAAA,4BACpD,aAAa,MACX8X,EAAa,EAAE,MAAA9X,GAAM,cAAc4Y,EAAO,IAAI;AAAA,4BAEhD,WAAW,MAAMd,EAAa,IAAI;AAAA,4BAClC,SAAS,MAAMI,EAAelY,CAAI;AAAA,4BAClC,WAAW,CAAAoD,MAAK;AACd,+BAAIA,EAAE,QAAQ,WAAWA,EAAE,QAAQ,SACjCA,EAAE,eAAA,GACF8U,EAAelY,CAAI;AAAA,4BAEvB;AAAA,4BACA,OAAO;AAAA,8BACL,SAAS;AAAA,8BACT,YAAY;AAAA,8BACZ,cAAc;AAAA,8BACd,WAAW;AAAA,8BACX,QAAQ;AAAA,8BACR,SAAS8Y,IAAa,MAAM;AAAA,8BAC5B,WAAWA,IAAa,gBAAgB;AAAA,8BACxC,YACE;AAAA,8BACF,QAAQ;AAAA,4BAAA;AAAA,4BAEV,cAAc,CAAA1V,MAAK;AAChB,8BAAAA,EAAE,cAAiC,MAAM,YACxC;AAAA,4BACJ;AAAA,4BACA,cAAc,CAAAA,MAAK;AAChB,8BAAAA,EAAE,cAAiC,MAAM,YACxC;AAAA,4BACJ;AAAA,4BAEA,UAAA;AAAA,8BAAA,gBAAAjC;AAAA,gCAAC;AAAA,gCAAA;AAAA,kCACC,OAAO;AAAA,oCACL,YAAY;AAAA,oCACZ,OAAO;AAAA,oCACP,UAAU;AAAA,oCACV,cAAc4V,IAAY,YAAY;AAAA,kCAAA;AAAA,kCAGvC,UAAA,OAAO/W,EAAK8W,CAAU,KAAK9W,EAAK,IAAI;AAAA,gCAAA;AAAA,8BAAA;AAAA,8BAEtC+W,KACC/W,EAAK+W,CAAS,MAAM,UACpB/W,EAAK+W,CAAS,MAAM,QAClB,gBAAA7V;AAAA,gCAAC;AAAA,gCAAA;AAAA,kCACC,OAAO;AAAA,oCACL,UAAU;AAAA,oCACV,OAAO;AAAA,oCACP,YAAY;AAAA,kCAAA;AAAA,kCAGb,UAAA;AAAA,oCAAA,OAAOlB,EAAK+W,CAAS,CAAC,EAAE,MAAM,GAAG,EAAE;AAAA,oCACnC,OAAO/W,EAAK+W,CAAS,CAAC,EAAE,SAAS,KAAK,MAAM;AAAA,kCAAA;AAAA,gCAAA;AAAA,8BAAA;AAAA,8BAGnD,gBAAA5V;AAAA,gCAAC;AAAA,gCAAA;AAAA,kCACC,OAAO;AAAA,oCACL,WAAW;AAAA,oCACX,UAAU;AAAA,oCACV,OAAO;AAAA,oCACP,WAAW;AAAA,oCACX,SAAS;AAAA,oCACT,YAAY;AAAA,kCAAA;AAAA,kCAEd,WAAU;AAAA,kCACX,UAAA;AAAA,gCAAA;AAAA,8BAAA;AAAA,4BAED;AAAA,0BAAA;AAAA,0BAzEKnB,EAAK;AAAA,wBAAA;AAAA,sBA4EhB;AAAA,wBAGCmN,IAAAmL,EAAaM,EAAO,EAAE,MAAtB,gBAAAzL,EAAyB,YAAW,KACnC,gBAAAhM;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,OAAO;AAAA,4BACL,SAAS;AAAA,4BACT,WAAW;AAAA,4BACX,OAAO;AAAA,4BACP,UAAU;AAAA,4BACV,QAAQ;AAAA,4BACR,cAAc;AAAA,0BAAA;AAAA,0BAEjB,UAAA;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBAED;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAEJ;AAAA,YAAA;AAAA,YA/JKyX,EAAO;AAAA,UAAA;AAAA,QAkKlB,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GACF;AAEJ;ACtjBA,SAASG,GAAeC,GAAcC,GAAuB;AAC3D,QAAMC,IAAe,CAAA,GACfC,IAAO,IAAI,KAAKH,GAAMC,GAAO,CAAC;AAEpC,SAAOE,EAAK,SAAA,MAAeF;AACzB,IAAAC,EAAK,KAAK,IAAI,KAAKC,CAAI,CAAC,GACxBA,EAAK,QAAQA,EAAK,QAAA,IAAY,CAAC;AAGjC,SAAOD;AACT;AAKO,SAASE,GAAa,EAAE,UAAA1d,GAAU,QAAAkc,KAA6B;AACpE,QAAMyB,IAAazB,EAAO,YACpBd,IAAac,EAAO,YACpBrH,IAAKC,GAAA,GAGL,CAAC8I,GAAaC,CAAc,IAAIzX,EAAS,oBAAI,MAAM,GACnDkX,IAAOM,EAAY,YAAA,GACnBL,IAAQK,EAAY,SAAA,GAGpBE,IAAe,IAAI,KAAKR,GAAMC,GAAO,CAAC,EAAE,YAAA,GACxCQ,IAAa,IAAI,KAAKT,GAAMC,IAAQ,GAAG,CAAC,EAAE,YAAA,GAE1C,EAAE,QAAQla,GAAM,OAAAvB,EAAA,IAAU0K,GAAuB;AAAA,IACrD,UAAAxM;AAAA,IACA,SAAS;AAAA,MACP,EAAE,OAAO2d,GAAY,UAAU,OAAO,OAAOG,EAAA;AAAA,MAC7C,EAAE,OAAOH,GAAY,UAAU,OAAO,OAAOI,EAAA;AAAA,IAAW;AAAA,IAE1D,YAAY,EAAE,UAAU,IAAA;AAAA,EAAI,CAC7B,GAGKP,IAAO5W,EAAQ,MAAMyW,GAAeC,GAAMC,CAAK,GAAG,CAACD,GAAMC,CAAK,CAAC,GAG/DS,IAAcpX,EAAQ,MAAM;AAChC,UAAMiW,IAA0C,CAAA;AAEhD,QAAIxZ,KAAA,QAAAA,EAAM;AACR,iBAAWD,KAASC,EAAK,MAAM;AAC7B,cAAM4a,IAAU,OAAO7a,EAAMua,CAAU,KAAK,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAC5D,QAAIM,MACGpB,EAAOoB,CAAO,MAAGpB,EAAOoB,CAAO,IAAI,CAAA,IACxCpB,EAAOoB,CAAO,EAAE,KAAK7a,CAAK;AAAA,MAE9B;AAGF,WAAOyZ;AAAA,EACT,GAAG,CAACxZ,GAAMsa,CAAU,CAAC,GAGfO,IAAY,MAAML,EAAe,IAAI,KAAKP,GAAMC,IAAQ,CAAC,CAAC,GAC1DY,IAAY,MAAMN,EAAe,IAAI,KAAKP,GAAMC,IAAQ,CAAC,CAAC,GAC1Da,IAAQ,MAAMP,EAAe,oBAAI,MAAM,GAGvCQ,IAAYT,EAAY,eAAe,WAAW,EAAE,OAAO,QAAQ,MAAM,WAAW,GAGpFU,IAAW,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,GAG3DC,IAAiB,IAAI,KAAKjB,GAAMC,GAAO,CAAC,EAAE,OAAA;AAIhD,UAFkBzb,KAAA,gBAAAA,EAAO,+BAGf,OAAA,EAAI,OAAO,EAAE,SAAS,OAAA,GAAU,UAAA,cAAU,sBAIjD,OAAA,EAAI,OAAO,EAAE,SAAS,UAErB,UAAA;AAAA,IAAA,gBAAA0D;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,gBAAgB;AAAA,UAChB,YAAY;AAAA,UACZ,cAAc;AAAA,QAAA;AAAA,QAGhB,UAAA;AAAA,UAAA,gBAAAA,EAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,YAClC,UAAA;AAAA,YAAA,gBAAAC,EAAC,UAAA,EAAO,SAASyY,GAAW,OAAOM,IAAU,UAAA,UAAM;AAAA,8BAClD,UAAA,EAAO,SAASJ,GAAO,OAAOI,IAAU,UAAA,SAAK;AAAA,8BAC7C,UAAA,EAAO,SAASL,GAAW,OAAOK,IAAU,UAAA,SAAA,CAAM;AAAA,UAAA,GACrD;AAAA,4BACC,MAAA,EAAG,OAAO,EAAE,QAAQ,EAAA,GAAM,UAAAH,EAAA,CAAU;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAIvC,gBAAA7Y;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,qBAAqB;AAAA,UACrB,KAAK;AAAA,UACL,iBAAiB;AAAA,UACjB,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,UAAU;AAAA,QAAA;AAAA,QAIX,UAAA;AAAA,UAAA8Y,EAAS,IAAI,CAACG,MACb,gBAAAhZ;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,iBAAiB;AAAA,gBACjB,YAAY;AAAA,gBACZ,WAAW;AAAA,gBACX,UAAU;AAAA,cAAA;AAAA,cAGX,UAAAgZ;AAAA,YAAA;AAAA,YATIA;AAAA,UAAA,CAWR;AAAA,UAGA,MAAM,KAAK,EAAE,QAAQF,GAAgB,EAAE,IAAI,CAACG,GAAGhJ,wBAC7C,OAAA,EAAuB,OAAO,EAAE,iBAAiB,WAAW,WAAW,SAAO,GAArE,SAASA,CAAC,EAA8D,CACnF;AAAA,UAGA8H,EAAK,IAAI,CAACiB,MAAQ;AACjB,kBAAMR,IAAUQ,EAAI,YAAA,EAAc,MAAM,GAAG,EAAE,CAAC,GACxCE,IAASX,EAAYC,CAAO,KAAK,CAAA,GACjCW,IAAUX,OAAY,oBAAI,KAAA,GAAO,cAAc,MAAM,GAAG,EAAE,CAAC;AAEjE,mBACE,gBAAAzY;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,OAAO;AAAA,kBACL,iBAAiB;AAAA,kBACjB,WAAW;AAAA,kBACX,SAAS;AAAA,gBAAA;AAAA,gBAGX,UAAA;AAAA,kBAAA,gBAAAC;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,OAAO;AAAA,wBACL,UAAU;AAAA,wBACV,YAAYmZ,IAAU,MAAM;AAAA,wBAC5B,OAAOA,IAAU,YAAY;AAAA,wBAC7B,cAAc;AAAA,sBAAA;AAAA,sBAGf,YAAI,QAAA;AAAA,oBAAQ;AAAA,kBAAA;AAAA,kBAEdD,EAAO,MAAM,GAAG,CAAC,EAAE,IAAI,CAACvb,MACvB,gBAAAqC;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBAEC,SAAS,MAAMoP,EAAG,EAAE,IAAI,QAAQ7U,CAAQ,WAAWoD,EAAM,EAAE,GAAA,CAAI;AAAA,sBAC/D,OAAO;AAAA,wBACL,UAAU;AAAA,wBACV,SAAS;AAAA,wBACT,iBAAiB;AAAA,wBACjB,cAAc;AAAA,wBACd,cAAc;AAAA,wBACd,QAAQ;AAAA,wBACR,UAAU;AAAA,wBACV,YAAY;AAAA,wBACZ,cAAc;AAAA,sBAAA;AAAA,sBAGf,UAAA,OAAOA,EAAMgY,CAAU,KAAKhY,EAAM,IAAI;AAAA,oBAAA;AAAA,oBAdlCA,EAAM;AAAA,kBAAA,CAgBd;AAAA,kBACAub,EAAO,SAAS,KACf,gBAAAnZ,EAAC,OAAA,EAAI,OAAO,EAAE,UAAU,WAAW,OAAO,OAAA,GAAU,UAAA;AAAA,oBAAA;AAAA,oBAChDmZ,EAAO,SAAS;AAAA,oBAAE;AAAA,kBAAA,EAAA,CACtB;AAAA,gBAAA;AAAA,cAAA;AAAA,cAvCGV;AAAA,YAAA;AAAA,UA2CX,CAAC;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GACF;AAEJ;AAEA,MAAMO,KAAgC;AAAA,EACpC,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,UAAU;AACZ;AClMA,SAASK,GAAaC,GAAoBnB,GAAoBoB,GAAkB;AAC9E,MAAIC,wBAAc,KAAA,GACdC,wBAAc,KAAA;AAElB,aAAWC,KAAQJ,GAAO;AACxB,UAAMK,IAAQ,IAAI,KAAK,OAAOD,EAAKvB,CAAU,KAAK,EAAE,CAAC,GAC/CyB,IAAM,IAAI,KAAK,OAAOF,EAAKH,CAAQ,KAAK,EAAE,CAAC;AACjD,IAAI,CAAC,MAAMI,EAAM,QAAA,CAAS,KAAKA,IAAQH,MAASA,IAAUG,IACtD,CAAC,MAAMC,EAAI,QAAA,CAAS,KAAKA,IAAMH,MAASA,IAAUG;AAAA,EACxD;AAGA,SAAAJ,EAAQ,QAAQA,EAAQ,QAAA,IAAY,CAAC,GACrCC,EAAQ,QAAQA,EAAQ,QAAA,IAAY,CAAC,GAE9B,EAAE,SAAAD,GAAS,SAAAC,EAAA;AACpB;AAKA,SAASI,GAAeF,GAAaC,GAAmB;AACtD,SAAO,KAAK,MAAMA,EAAI,QAAA,IAAYD,EAAM,QAAA,MAAc,MAAO,KAAK,KAAK,GAAG;AAC5E;AAKO,SAASG,GAAU,EAAE,UAAAtf,GAAU,QAAAkc,KAA0B;AAC9D,QAAMqD,IAAYrD,EAAO,aAAa,QAChCyB,IAAazB,EAAO,YACpB6C,IAAW7C,EAAO,UAClBsD,IAAgBtD,EAAO,eACvBrH,IAAKC,GAAA,GAGL,EAAE,QAAQzR,GAAM,OAAAvB,EAAA,IAAU0K,GAAmB;AAAA,IACjD,UAAAxM;AAAA,IACA,YAAY,EAAE,UAAU,IAAA;AAAA,IACxB,SAAS,CAAC,EAAE,OAAO2d,GAAY,OAAO,OAAO;AAAA,EAAA,CAC9C,GAGK,EAAE,OAAAmB,GAAO,SAAAE,GAAS,SAAAC,GAAS,WAAAQ,EAAA,IAAc7Y,EAAQ,MAAM;AAC3D,UAAMkY,KAAQzb,KAAA,gBAAAA,EAAM,SAAQ,CAAA;AAC5B,QAAIyb,EAAM,WAAW;AACnB,aAAO,EAAE,OAAO,IAAI,SAAS,oBAAI,QAAQ,SAAS,oBAAI,QAAQ,WAAW,GAAA;AAG3E,UAAM,EAAE,SAAAE,GAAS,SAAAC,MAAYJ,GAAaC,GAAOnB,GAAYoB,CAAQ,GAC/DU,IAAYJ,GAAeL,GAASC,CAAO;AAEjD,WAAO,EAAE,OAAAH,GAAO,SAAAE,GAAS,SAAAC,GAAS,WAAAQ,EAAAA;AAAAA,EACpC,GAAG,CAACpc,GAAMsa,GAAYoB,CAAQ,CAAC,GAGzBW,IAAa9Y,EAAQ,MAAM;AAC/B,UAAMxE,IAAkB,CAAA,GAClB7B,IAAU,IAAI,KAAKye,CAAO;AAChC,WAAOze,KAAW0e;AAChB,MAAA7c,EAAQ,KAAK,IAAI,KAAK7B,CAAO,CAAC,GAC9BA,EAAQ,QAAQA,EAAQ,QAAA,IAAY,CAAC;AAEvC,WAAO6B;AAAA,EACT,GAAG,CAAC4c,GAASC,CAAO,CAAC;AAIrB,MAFkBnd,KAAA,gBAAAA,EAAO;AAGvB,6BAAQ,OAAA,EAAI,OAAO,EAAE,SAAS,OAAA,GAAU,UAAA,cAAU;AAGpD,MAAIgd,EAAM,WAAW;AACnB,WAAO,gBAAArZ,EAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,OAAO,OAAA,GAAU,UAAA,sBAAA,CAAmB;AAG5E,QAAMka,IAAY,IACZC,IAAW;AAEjB,2BACG,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,WAAW,OAAA,GACxC,4BAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,UAAUH,IAAYG,IAAW,OAE9D,UAAA;AAAA,IAAA,gBAAApa,EAAC,OAAA,EAAI,OAAO,EAAE,OAAO,SAAS,YAAY,GAAG,aAAa,oBAAA,GAExD,UAAA;AAAA,MAAA,gBAAAC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAO;AAAA,YACL,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,cAAc;AAAA,YACd,iBAAiB;AAAA,UAAA;AAAA,UAEpB,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAIAqZ,EAAM,IAAI,CAACI,MACV,gBAAAzZ;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,SAAS,MAAMoP,EAAG,EAAE,IAAI,QAAQ7U,CAAQ,WAAWkf,EAAK,EAAE,GAAA,CAAI;AAAA,UAC9D,OAAO;AAAA,YACL,QAAQ,GAAGS,CAAS;AAAA,YACpB,SAAS;AAAA,YACT,cAAc;AAAA,YACd,QAAQ;AAAA,YACR,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,cAAc;AAAA,UAAA;AAAA,UAGf,UAAA,OAAOT,EAAKK,CAAS,KAAKL,EAAK,IAAI;AAAA,QAAA;AAAA,QAZ/BA,EAAK;AAAA,MAAA,CAcb;AAAA,IAAA,GACH;AAAA,IAGA,gBAAA1Z,EAAC,SAAI,OAAO,EAAE,MAAM,GAAG,UAAU,YAE/B,UAAA;AAAA,MAAA,gBAAAC,EAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,QAAQ,QAAQ,iBAAiB,UAAA,GAC7D,UAAAia,EAAW,IAAI,CAACjB,GAAK/I,MACpB,gBAAAjQ;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,OAAO;AAAA,YACL,OAAO,GAAGma,CAAQ;AAAA,YAClB,YAAY;AAAA,YACZ,aAAa;AAAA,YACb,cAAc;AAAA,YACd,UAAU;AAAA,YACV,WAAW;AAAA,YACX,SAAS;AAAA,UAAA;AAAA,UAGV,YAAI,QAAA;AAAA,QAAQ;AAAA,QAXRlK;AAAA,MAAA,CAaR,GACH;AAAA,MAGCoJ,EAAM,IAAI,CAACI,MAAS;AACnB,cAAMW,IAAY,IAAI,KAAK,OAAOX,EAAKvB,CAAU,KAAK,EAAE,CAAC,GACnDmC,IAAU,IAAI,KAAK,OAAOZ,EAAKH,CAAQ,KAAK,EAAE,CAAC,GAE/CgB,IAAcV,GAAeL,GAASa,CAAS,GAC/CG,IAAWX,GAAeQ,GAAWC,CAAO,GAC5CG,IAAWT,IAAgB,OAAON,EAAKM,CAAa,KAAK,CAAC,IAAI;AAEpE,eACE,gBAAAha;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,OAAO;AAAA,cACL,QAAQ,GAAGma,CAAS;AAAA,cACpB,UAAU;AAAA,cACV,cAAc;AAAA,YAAA;AAAA,YAIhB,UAAA;AAAA,cAAA,gBAAAla;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAO;AAAA,oBACL,UAAU;AAAA,oBACV,OAAO;AAAA,oBACP,SAAS;AAAA,kBAAA;AAAA,kBAGV,UAAAia,EAAW,IAAI,CAAChB,GAAGhJ,MAClB,gBAAAjQ;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBAEC,OAAO;AAAA,wBACL,OAAO,GAAGma,CAAQ;AAAA,wBAClB,YAAY;AAAA,wBACZ,aAAa;AAAA,sBAAA;AAAA,oBACf;AAAA,oBALKlK;AAAA,kBAAA,CAOR;AAAA,gBAAA;AAAA,cAAA;AAAA,cAIH,gBAAAjQ;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAO;AAAA,oBACL,UAAU;AAAA,oBACV,MAAM,GAAGsa,IAAcH,CAAQ;AAAA,oBAC/B,OAAO,GAAG,KAAK,IAAII,GAAU,CAAC,IAAIJ,CAAQ;AAAA,oBAC1C,KAAK;AAAA,oBACL,QAAQ,GAAGD,IAAY,CAAC;AAAA,oBACxB,iBAAiB;AAAA,oBACjB,QAAQ;AAAA,oBACR,cAAc;AAAA,oBACd,UAAU;AAAA,kBAAA;AAAA,kBAIX,UAAAH,KACC,gBAAA/Z;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,OAAO;AAAA,wBACL,QAAQ;AAAA,wBACR,OAAO,GAAGwa,CAAQ;AAAA,wBAClB,iBAAiB;AAAA,wBACjB,SAAS;AAAA,sBAAA;AAAA,oBACX;AAAA,kBAAA;AAAA,gBACF;AAAA,cAAA;AAAA,YAEJ;AAAA,UAAA;AAAA,UApDKf,EAAK;AAAA,QAAA;AAAA,MAuDhB,CAAC;AAAA,IAAA,EAAA,CACH;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;eCtMMgB,MAAWC,MAAA,gBAAAA,GAAiB,qBAAoB;AAEtD,eAAeC,GAAU/N,GAAsC;AAC7D,QAAMgO,IAAM,MAAM;AAAA,IAChB,GAAGH,EAAQ,aAAa,mBAAmB7N,CAAO,CAAC;AAAA,EAAA;AAErD,MAAI,CAACgO,EAAI,GAAI,OAAM,IAAI,MAAM,yBAAyBA,EAAI,MAAM,EAAE;AAElE,UADc,MAAMA,EAAI,KAAA,GACZ;AACd;AAEA,eAAeC,GACbjO,GACAkO,GACAC,GACe;AACf,QAAMC,GAAWpO,GAASkO,GAAQ,EAAE,QAAQC,GAAW;AACzD;AAEA,eAAeC,GACbpO,GACAkO,GACA1H,GACe;AACf,QAAMwH,IAAM,MAAM;AAAA,IAChB,GAAGH,EAAQ,aAAa,mBAAmB7N,CAAO,CAAC,IAAI,mBAAmBkO,CAAM,CAAC;AAAA,IACjF;AAAA,MACE,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAA;AAAA,MAC3B,MAAM,KAAK,UAAU1H,CAAM;AAAA,IAAA;AAAA,EAC7B;AAEF,MAAI,CAACwH,EAAI,GAAI,OAAM,IAAI,MAAM,kBAAkBA,EAAI,MAAM,EAAE;AAC7D;AAEA,eAAeK,GACbrO,GACAsO,GACA9b,GACe;AACf,QAAMwb,IAAM,MAAM;AAAA,IAChB,GAAGH,EAAQ,aAAa,mBAAmB7N,CAAO,CAAC;AAAA,IACnD;AAAA,MACE,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAA;AAAA,MAC3B,MAAM,KAAK,UAAU,EAAE,QAAQsO,GAAU,OAAA9b,GAAO;AAAA,IAAA;AAAA,EAClD;AAEF,MAAI,CAACwb,EAAI,GAAI,OAAM,IAAI,MAAM,qBAAqBA,EAAI,MAAM,EAAE;AAChE;AAIA,SAASO,GAAY;AAAA,EACnB,cAAAC;AAAA,EACA,WAAAlR;AAAA,EACA,UAAAC;AACF,GAII;AACF,QAAM,CAAC9O,GAAOggB,CAAQ,IAAI1a,EAASya,CAAY,GACzCE,IAAMjS,GAAyB,IAAI;AAEzC,SAAAxE,EAAU,MAAM;;AACd,KAAAjL,IAAA0hB,EAAI,YAAJ,QAAA1hB,EAAa,UACb4H,IAAA8Z,EAAI,YAAJ,QAAA9Z,EAAa;AAAA,EACf,GAAG,CAAA,CAAE,GAQH,gBAAAxB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAsb;AAAA,MACA,OAAAjgB;AAAA,MACA,UAAU,CAAA4G,MAAKoZ,EAASpZ,EAAE,OAAO,KAAK;AAAA,MACtC,QAAQ,MAAMiI,EAAU7O,EAAM,KAAA,KAAU+f,CAAY;AAAA,MACpD,WAXkB,CAACnZ,MAAuC;AAC5D,QAAIA,EAAE,QAAQ,aAAmB5G,EAAM,KAAA,KAAU+f,CAAY,GACzDnZ,EAAE,QAAQ,YAAUkI,EAAA;AAAA,MAC1B;AAAA,MASI,OAAO;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,SAAS;AAAA,QACT,UAAU;AAAA,MAAA;AAAA,MAEZ,cAAW;AAAA,IAAA;AAAA,EAAA;AAGjB;AAIA,SAASoR,GAAY;AAAA,EACnB,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,SAAA7O;AAAA,EACA,WAAA8O;AAAA,EACA,YAAAC;AAAA,EACA,aAAAC;AAAA,EACA,QAAAC;AACF,GAQI;AACF,QAAM,CAACC,GAAWC,CAAY,IAAIpb,EAAS,EAAK,GAC1C,CAACqb,GAAUC,CAAW,IAAItb,EAAS,EAAK,GACxC,CAACub,GAAaC,CAAc,IAAIxb,EAAS,EAAK,GAC9C,CAACyb,GAAcC,CAAe,IAAI1b,EAAS,EAAK,GAChDgX,IAAagE,MAAeH,EAAK,IAEjCc,IAAe3W;AAAA,IACnB,OAAO4W,MAAqB;AAE1B,UADAN,EAAY,EAAK,GACbM,MAAaf,EAAK;AACtB,YAAI;AACF,gBAAMR,GAAWpO,GAAS4O,EAAK,IAAI,EAAE,OAAOe,GAAU,GACtDb,EAAA;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,IACF;AAAA,IACA,CAAC9O,GAAS4O,EAAK,IAAIA,EAAK,OAAOE,CAAS;AAAA,EAAA,GAGpCc,IAAiB7W;AAAA,IACrB,OAAOvG,MAAkB;AAEvB,UADA+c,EAAe,EAAK,GAChB,EAAC/c,EAAM;AACX,YAAI;AACF,gBAAM6b,GAAarO,GAAS4O,EAAK,IAAIpc,CAAK,GAC1C2c,EAAa,EAAK,GAClBL,EAAA;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,IACF;AAAA,IACA,CAAC9O,GAAS4O,EAAK,IAAIE,CAAS;AAAA,EAAA,GAGxBe,IAAcjB,EAAK,SAAS,SAAS;AAC3C,MAAIkB,IAAc;AAClB,SAAID,MACFC,IAAcZ,IAAY,MAAM,MAIhC,gBAAA/b;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,iBAAe0c,IAAc,CAACX,IAAY;AAAA,MAC1C,OAAO,EAAE,WAAW,QAAQ,QAAQ,GAAG,SAAS,EAAA;AAAA,MAGhD,UAAA;AAAA,QAAA,gBAAA/b;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAS;AAAA,YACT,aAAa,CAAAkC,MAAK;AAChB,cAAAA,EAAE,gBAAA,GACF2Z,EAAYJ,EAAK,EAAE;AAAA,YACrB;AAAA,YACA,WAAW,MAAMa,EAAgB,EAAK;AAAA,YACtC,YAAY,CAAApa,MAAK;AACf,cAAAA,EAAE,eAAA,GACFA,EAAE,gBAAA,GACFoa,EAAgB,EAAI;AAAA,YACtB;AAAA,YACA,aAAa,MAAMA,EAAgB,EAAK;AAAA,YACxC,QAAQ,CAAApa,MAAK;AACX,cAAAA,EAAE,eAAA,GACFA,EAAE,gBAAA,GACFoa,EAAgB,EAAK,GACrBR,EAAOL,EAAK,EAAE;AAAA,YAChB;AAAA,YACA,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,KAAK;AAAA,cACL,SAAS;AAAA,cACT,aAAa,GAAG,MAAMC,IAAQ,IAAI;AAAA,cAClC,cAAc;AAAA,cACd,QAAQ;AAAA,cACR,SAAS9D,IAAa,MAAM;AAAA,cAC5B,YAAYyE,IAAe,4BAA4B;AAAA,cACvD,QAAQA,IACJ,oCACA;AAAA,cACJ,YAAY;AAAA,cACZ,YAAY;AAAA,YAAA;AAAA,YAEd,cAAc,CAAAna,MAAK;AAChB,cAAAA,EAAE,cAAiC,MAAM,aACxC;AAAA,YACJ;AAAA,YACA,cAAc,CAAAA,MAAK;AAChB,cAAAA,EAAE,cAAiC,MAAM,aAAama,IACnD,4BACA;AAAA,YACN;AAAA,YACA,WAAW,CAACna,MAAqC;AAC/C,eAAIA,EAAE,QAAQ,WAAWA,EAAE,QAAQ,SACjCA,EAAE,eAAA,GACF8Z,EAAa,CAAAY,MAAK,CAACA,CAAC;AAAA,YAExB;AAAA,YACA,UAAU;AAAA,YACV,cAAYnB,EAAK;AAAA,YAGjB,UAAA;AAAA,cAAA,gBAAAxb;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,SAAS,CAAAiC,MAAK;AACZ,oBAAAA,EAAE,gBAAA,GACF8Z,EAAa,CAAAY,MAAK,CAACA,CAAC;AAAA,kBACtB;AAAA,kBACA,cAAYb,IAAY,WAAW;AAAA,kBACnC,OAAO;AAAA,oBACL,YAAY;AAAA,oBACZ,QAAQ;AAAA,oBACR,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,OAAO;AAAA,oBACP,OAAO;AAAA,oBACP,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,WAAW;AAAA,kBAAA;AAAA,kBAGZ,UAAAY;AAAA,gBAAA;AAAA,cAAA;AAAA,cAIFV,IACC,gBAAAhc;AAAA,gBAACmb;AAAA,gBAAA;AAAA,kBACC,cAAcK,EAAK;AAAA,kBACnB,WAAWc;AAAA,kBACX,UAAU,MAAML,EAAY,EAAK;AAAA,gBAAA;AAAA,cAAA,IAGnC,gBAAAjc;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,eAAe,MAAMic,EAAY,EAAI;AAAA,kBACrC,OAAM;AAAA,kBACN,OAAO;AAAA,oBACL,MAAM;AAAA,oBACN,UAAU;AAAA,oBACV,OAAO;AAAA,oBACP,YAAY;AAAA,kBAAA;AAAA,kBAGb,UAAAT,EAAK;AAAA,gBAAA;AAAA,cAAA;AAAA,cAKV,gBAAAzb;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAU;AAAA,kBACV,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,KAAK;AAAA,oBACL,SAAS;AAAA,oBACT,YAAY;AAAA,kBAAA;AAAA,kBAGd,UAAA;AAAA,oBAAA,gBAAAC;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,SAAS,CAAAiC,MAAK;AACZ,0BAAAA,EAAE,gBAAA,GACFka,EAAe,EAAI,GACnBJ,EAAa,EAAK;AAAA,wBACpB;AAAA,wBACA,OAAM;AAAA,wBACN,cAAY,gBAAgBP,EAAK,KAAK;AAAA,wBACtC,OAAO;AAAA,0BACL,YAAY;AAAA,0BACZ,QAAQ;AAAA,0BACR,QAAQ;AAAA,0BACR,OAAO;AAAA,0BACP,UAAU;AAAA,0BACV,SAAS;AAAA,0BACT,cAAc;AAAA,0BACd,WAAW;AAAA,wBAAA;AAAA,wBAEd,UAAA;AAAA,sBAAA;AAAA,oBAAA;AAAA,oBAGD,gBAAAxb;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,SAAS,CAAAiC,MAAK;AACZ,0BAAAA,EAAE,gBAAA,GACFga,EAAY,EAAI;AAAA,wBAClB;AAAA,wBACA,OAAM;AAAA,wBACN,cAAY,UAAUT,EAAK,KAAK;AAAA,wBAChC,OAAO;AAAA,0BACL,YAAY;AAAA,0BACZ,QAAQ;AAAA,0BACR,QAAQ;AAAA,0BACR,OAAO;AAAA,0BACP,UAAU;AAAA,0BACV,SAAS;AAAA,0BACT,cAAc;AAAA,0BACd,WAAW;AAAA,wBAAA;AAAA,wBAEd,UAAA;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBAED;AAAA,gBAAA;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,QAAA;AAAA,QAIDU,KACC,gBAAAlc;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,cACL,aAAa,GAAG,OAAOyb,IAAQ,KAAK,IAAI;AAAA,cACxC,YAAY;AAAA,cACZ,eAAe;AAAA,YAAA;AAAA,YAGjB,UAAA,gBAAAzb;AAAA,cAACmb;AAAA,cAAA;AAAA,gBACC,cAAa;AAAA,gBACb,WAAWqB;AAAA,gBACX,UAAU,MAAML,EAAe,EAAK;AAAA,cAAA;AAAA,YAAA;AAAA,UACtC;AAAA,QAAA;AAAA,QAKH,CAACL,KAAaW,KACb,gBAAAzc,EAAC,MAAA,EAAG,MAAK,SAAQ,OAAO,EAAE,QAAQ,GAAG,SAAS,KAC3C,UAAAwb,EAAK,SAAS,IAAI,CAAAoB,MACjB,gBAAA5c;AAAA,UAACub;AAAA,UAAA;AAAA,YAEC,MAAMqB;AAAA,YACN,OAAOnB,IAAQ;AAAA,YACf,SAAA7O;AAAA,YACA,WAAA8O;AAAA,YACA,YAAAC;AAAA,YACA,aAAAC;AAAA,YACA,QAAAC;AAAA,UAAA;AAAA,UAPKe,EAAM;AAAA,QAAA,CASd,GACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;AAYO,SAASC,GAAS,EAAE,UAAAtiB,KAAqC;AAC9D,QAAM,CAAC6R,GAAO0Q,CAAQ,IAAInc,EAAoB;AAAA,IAC5C,MAAM,CAAA;AAAA,IACN,SAAS;AAAA,IACT,OAAO;AAAA,EAAA,CACR,GACK,CAACgb,GAAYoB,CAAa,IAAIpc,EAAwB,IAAI,GAC1D,CAACqc,GAAYC,CAAa,IAAItc,EAAS,EAAK,GAE5Cuc,IAAOvX,EAAY,YAAY;AACnC,IAAAmX,EAAS,CAAAzO,OAAM,EAAE,GAAGA,GAAG,SAAS,IAAM,OAAO,KAAA,EAAO;AACpD,QAAI;AACF,YAAM8O,IAAO,MAAMxC,GAAUpgB,CAAQ;AACrC,MAAAuiB,EAAS,EAAE,MAAAK,GAAM,SAAS,IAAO,OAAO,MAAM;AAAA,IAChD,SAASpf,GAAK;AACZ,MAAA+e,EAAS;AAAA,QACP,MAAM,CAAA;AAAA,QACN,SAAS;AAAA,QACT,OAAO/e,aAAe,QAAQA,EAAI,UAAU;AAAA,MAAA,CAC7C;AAAA,IACH;AAAA,EACF,GAAG,CAACxD,CAAQ,CAAC;AAEb,EAAAsK,EAAU,MAAM;AACd,IAAKqY,EAAA;AAAA,EACP,GAAG,CAACA,CAAI,CAAC;AAET,QAAM5F,IAAa3R;AAAA,IACjB,OAAOyX,MAA4B;AACjC,UAAI,CAACzB,KAAcA,MAAeyB,GAAU;AAC1C,QAAAL,EAAc,IAAI;AAClB;AAAA,MACF;AACA,UAAI;AACF,cAAMlC,GAAatgB,GAAUohB,GAAYyB,CAAQ,GAC5CF,EAAA;AAAA,MACP,QAAQ;AAAA,MAER;AACA,MAAAH,EAAc,IAAI;AAAA,IACpB;AAAA,IACA,CAACpB,GAAYphB,GAAU2iB,CAAI;AAAA,EAAA,GAGvBG,IAAgB1X;AAAA,IACpB,OAAOvG,MAAkB;AAEvB,UADA6d,EAAc,EAAK,GACf,EAAC7d,EAAM;AACX,YAAI;AACF,gBAAM6b,GAAa1gB,GAAU,MAAM6E,CAAK,GACnC8d,EAAA;AAAA,QACP,QAAQ;AAAA,QAER;AAAA,IACF;AAAA,IACA,CAAC3iB,GAAU2iB,CAAI;AAAA,EAAA;AAGjB,SAAI9Q,EAAM,4BAEL,OAAA,EAAI,OAAO,EAAE,SAAS,uBACpB,UAAA,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,IAAI,CAAA6D,MAChB,gBAAAjQ;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC,WAAU;AAAA,MACV,OAAO,EAAE,OAAO,GAAG,KAAKiQ,IAAI,EAAE,KAAK,cAAc,SAAA;AAAA,IAAS;AAAA,IAFrDA;AAAA,EAAA,CAIR,GACH,IAIA7D,EAAM,QAEN,gBAAArM;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAO;AAAA,MAAA;AAAA,MAGR,UAAA;AAAA,QAAAqM,EAAM;AAAA,0BACN,MAAA,EAAG;AAAA,QACJ,gBAAApM,EAAC,YAAO,WAAU,iBAAgB,SAAS,MAAM,KAAKkd,EAAA,GAAQ,UAAA,QAAA,CAE9D;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,sBAMH,OAAA,EAAI,OAAO,EAAE,SAAS,oBAAA,GAErB,UAAA;AAAA,IAAA,gBAAAnd;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,KAAK;AAAA,UACL,cAAc;AAAA,QAAA;AAAA,QAGhB,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO;AAAA,gBACL,YAAY;AAAA,gBACZ,UAAU;AAAA,gBACV,OAAO;AAAA,cAAA;AAAA,cAGR,UAAAzF;AAAA,YAAA;AAAA,UAAA;AAAA,UAEH,gBAAAyF;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,SAAS,MAAMid,EAAc,EAAI;AAAA,cACjC,OAAO,EAAE,UAAU,WAAW,SAAS,kBAAA;AAAA,cACxC,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAGD,gBAAAjd;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,SAAS,MAAM,KAAKkd,EAAA;AAAA,cACpB,OAAO,EAAE,UAAU,WAAW,SAAS,iBAAA;AAAA,cACvC,cAAW;AAAA,cACZ,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAED;AAAA,MAAA;AAAA,IAAA;AAAA,IAIDF,uBACE,OAAA,EAAI,OAAO,EAAE,cAAc,uBAC1B,UAAA,gBAAAhd;AAAA,MAACmb;AAAA,MAAA;AAAA,QACC,cAAa;AAAA,QACb,WAAWkC;AAAA,QACX,UAAU,MAAMJ,EAAc,EAAK;AAAA,MAAA;AAAA,IAAA,GAEvC;AAAA,IAIDtB,KACC,gBAAA3b;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,YAAY,CAAAiC,MAAKA,EAAE,eAAA;AAAA,QACnB,QAAQ,MAAM;AACZ,UAAAqV,EAAW,IAAI,EAAE,MAAM,MAAA;AAAA,WAAe;AAAA,QACxC;AAAA,QACA,OAAO;AAAA,UACL,SAAS;AAAA,UACT,cAAc;AAAA,UACd,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,WAAW;AAAA,UACX,UAAU;AAAA,UACV,OAAO;AAAA,QAAA;AAAA,QAEV,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAMFlL,EAAM,KAAK,WAAW,sBACpB,OAAA,EAAI,WAAU,qBACb,UAAA;AAAA,MAAA,gBAAApM;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,UAAU,QAAQ,cAAc,SAAA;AAAA,UAC1C,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGD,gBAAAA,EAAC,SAAI,UAAA,yDAAqD;AAAA,IAAA,EAAA,CAC5D,IAEA,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAY,GAAGzF,CAAQ;AAAA,QACvB,OAAO,EAAE,QAAQ,GAAG,SAAS,EAAA;AAAA,QAE5B,UAAA6R,EAAM,KAAK,IAAI,CAAAoP,MACd,gBAAAxb;AAAA,UAACub;AAAA,UAAA;AAAA,YAEC,MAAAC;AAAA,YACA,OAAO;AAAA,YACP,SAASjhB;AAAA,YACT,WAAW,MAAM,KAAK2iB,EAAA;AAAA,YACtB,YAAAvB;AAAA,YACA,aAAaoB;AAAA,YACb,QAAQ,CAAAK,MAAY,KAAK9F,EAAW8F,CAAQ;AAAA,UAAA;AAAA,UAPvC5B,EAAK;AAAA,QAAA,CASb;AAAA,MAAA;AAAA,IAAA;AAAA,sBAKJ,SAAA,EAAO,UAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAIN;AAAA,EAAA,GACJ;AAEJ;AC7kBA,SAAS8B,KAA0B;;AACjC,QAAMC,IAAc,WACjB;AACH,MAAI,OAAOA,KAAe;AACxB,WAAOA;AAET,MAAI,OAAOA,KAAe;AACxB,WAAO,CAAC,KAAK,QAAQ,OAAO,IAAI,EAAE,SAASA,EAAW,aAAa;AAGrE,QAAMC,IACJ,WACA,SACIC,KAAU7jB,IAAA4jB,KAAA,gBAAAA,EAAY,QAAZ,gBAAA5jB,EAAiB;AACjC,SAAI,OAAO6jB,KAAY,WACd,CAAC,KAAK,QAAQ,OAAO,IAAI,EAAE,SAASA,EAAQ,aAAa,IAG3D;AACT;AAEA,MAAMC,KAAe;AAAA,EACnB,MAAM1jB,GAAuB;AAC3B,IAAIsjB,QACF,QAAQ,MAAM,oBAAoBtjB,CAAO,EAAE;AAAA,EAE/C;AAAA,EACA,MAAMA,GAAiBgD,GAAuB;AAC5C,YAAQ,MAAM,oBAAoBhD,CAAO,IAAIgD,CAAK;AAAA,EACpD;AACF,GAKM2gB,wBAA8C,IAAA,GAC9CC,yBAAiD,IAAA;AA2BhD,SAASC,GAAepH,GAA6B;AAC1D,QAAMqH,IAAWH,EAAY,IAAIlH,EAAO,OAAO;AAE/C,EAAIqH,IAEFH,EAAY,IAAIlH,EAAO,SAASsH,GAAaD,GAAUrH,CAAM,CAAC,IAE9DkH,EAAY,IAAIlH,EAAO,SAASA,CAAM;AAE1C;AAKA,SAASsH,GACPrjB,GACAsjB,GACe;AACf,SAAO;AAAA,IACL,SAASA,EAAS;AAAA,IAClB,MAAMC,GAAiBvjB,EAAK,MAAMsjB,EAAS,IAAI;AAAA,IAC/C,MAAME,GAAiBxjB,EAAK,MAAMsjB,EAAS,IAAI;AAAA,EAAA;AAEnD;AAEA,SAASC,GACPvjB,GACAsjB,GACwB;AACxB,MAAI,GAACtjB,KAAQ,CAACsjB;AACd,WAAKtjB,IACAsjB,IAEE;AAAA,MACL,GAAGtjB;AAAA,MACH,GAAGsjB;AAAA,MACH,QAAQ;AAAA,QACN,GAAGtjB,EAAK;AAAA,QACR,GAAGsjB,EAAS;AAAA,MAAA;AAAA,MAEd,UAAUA,EAAS,YAAYtjB,EAAK;AAAA,IAAA,IAThBA,IADJsjB;AAYpB;AAEA,SAASE,GACPxjB,GACAsjB,GACwB;AACxB,MAAI,GAACtjB,KAAQ,CAACsjB;AACd,WAAKtjB,IACAsjB,IAEE;AAAA,MACL,GAAGtjB;AAAA,MACH,GAAGsjB;AAAA,IAAA,IAJiBtjB,IADJsjB;AAOpB;AAKO,SAASG,GAAUvR,GAA4C;AACpE,SAAO+Q,EAAY,IAAI/Q,CAAO;AAChC;AAKO,SAASwR,GAAcxR,GAAyC;;AACrE,UAAOhT,IAAA+jB,EAAY,IAAI/Q,CAAO,MAAvB,gBAAAhT,EAA0B;AACnC;AAKO,SAASykB,GAAczR,GAAyC;;AACrE,UAAOhT,IAAA+jB,EAAY,IAAI/Q,CAAO,MAAvB,gBAAAhT,EAA0B;AACnC;AAKO,SAAS0kB,GACd1R,GACA/J,GACyB;;AACzB,UAAOmJ,KAAAxK,KAAA5H,IAAA+jB,EAAY,IAAI/Q,CAAO,MAAvB,gBAAAhT,EAA0B,SAA1B,gBAAA4H,EAAgC,WAAhC,gBAAAwK,EAAyCnJ;AAClD;AAoBO,SAAS0b,GAAqBC,GAA4B;AAC/D,QAAM3iB,IAAM,GAAG2iB,EAAO,OAAO,IAAIA,EAAO,KAAK,IACvCV,IAAWF,GAAc,IAAI/hB,CAAG,KAAK,CAAA;AAC3C,EAAAiiB,EAAS,KAAKU,CAAM,GACpBZ,GAAc,IAAI/hB,GAAKiiB,CAAQ;AACjC;AAKO,SAASW,GACd7R,GACAjP,GACgB;AAChB,QAAM9B,IAAM,GAAG+Q,CAAO,IAAIjP,CAAK;AAC/B,SAAOigB,GAAc,IAAI/hB,CAAG,KAAK,CAAA;AACnC;AAKA,eAAsB6iB,GAAkB3iB,GAA4B;AAClE,MAAI;AACF,IAAA2hB,GAAa,MAAM,uBAAuB3hB,CAAG,EAAE;AAC/C,UAAMG,IAAW,MAAM,MAAMH,CAAG;AAChC,QAAI,CAACG,EAAS;AACZ,YAAM,IAAI,MAAM,0BAA0BA,EAAS,UAAU,EAAE;AAEjE,UAAMua,IAAwB,MAAMva,EAAS,KAAA;AAC7C,IAAA2hB,GAAepH,CAAM;AAAA,EACvB,SAASzZ,GAAO;AACd,IAAA0gB,GAAa,MAAM,8BAA8B3hB,CAAG,IAAIiB,CAAK;AAAA,EAC/D;AACF;AAKO,SAAS2hB,KAAqB;AACnC,EAAAhB,EAAY,MAAA,GACZC,GAAc,MAAA;AAChB;AChNO,SAASgB,GAAUhS,GAA4C;AACpE,SAAOzL,EAAQ,MAAMgd,GAAUvR,CAAO,GAAG,CAACA,CAAO,CAAC;AACpD;AAKO,SAASiS,GAAcjS,GAAyC;AACrE,SAAOzL,EAAQ,MAAMid,GAAcxR,CAAO,GAAG,CAACA,CAAO,CAAC;AACxD;AAKO,SAASkS,GAAclS,GAAyC;AACrE,SAAOzL,EAAQ,MAAMkd,GAAczR,CAAO,GAAG,CAACA,CAAO,CAAC;AACxD;AAKO,SAASmS,GACdnS,GACA/J,GACyB;AACzB,SAAO1B;AAAA,IACL,MAAMmd,GAAe1R,GAAS/J,CAAS;AAAA,IACvC,CAAC+J,GAAS/J,CAAS;AAAA,EAAA;AAEvB;ACvBO,SAASmc,GAAiB,EAAE,WAAAC,GAAW,WAAAnD,IAAY,MAAgC;AACxF,QAAM,CAACoD,GAAYC,CAAa,IAAIxe,EAAS,EAAI,GAC3CyO,IAAKC,GAAA,GAEL+P,IAAkB,CAACvgB,MAAwB;AAC/C,IAAIA,EAAK,SAAS,aAChBuQ,EAAG,EAAE,IAAI,QAAQvQ,EAAK,OAAO,SAAS,IAC7BA,EAAK,SAAS,WACnBA,EAAK,SACP,OAAO,KAAKA,EAAK,KAAK,QAAQ,IACrBA,EAAK,IAAI,WAAW,GAAG,IAChCuQ,EAAG,EAAE,IAAIvQ,EAAK,IAAA,CAAK,IAEnB,OAAO,SAAS,OAAOA,EAAK;AAAA,EAIlC;AAEA,2BACG,OAAA,EAAI,OAAO,EAAE,cAAc,YAE1B,UAAA;AAAA,IAAA,gBAAAkB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAS,MAAMof,EAAc,CAACD,CAAU;AAAA,QACxC,OAAO;AAAA,UACL,OAAO;AAAA,UACP,SAASpD,IAAY,WAAW;AAAA,UAChC,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,KAAK;AAAA,UACL,UAAU;AAAA,QAAA;AAAA,QAGZ,UAAA;AAAA,UAAA,gBAAA9b,EAAC,QAAA,EAAM,YAAU,KAAA,CAAK;AAAA,UACrB,CAAC8b,KACA,gBAAA/b,EAAA2K,GAAA,EACE,UAAA;AAAA,YAAA,gBAAA1K,EAAC,UAAK,OAAO,EAAE,MAAM,EAAA,GAAM,YAAU,OAAM;AAAA,YAC3C,gBAAAA,EAAC,UAAK,OAAO,EAAE,UAAU,UAAA,GACtB,UAAAkf,IAAa,MAAM,IAAA,CACtB;AAAA,UAAA,EAAA,CACF;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAKHA,KAAc,CAACpD,KACd,gBAAA9b,EAAC,SAAI,OAAO,EAAE,aAAa,OAAA,GACxB,UAAAif,EAAU,MACR,OAAO,CAACpgB,MAASA,EAAK,SAAS,OAAO,EACtC,IAAI,CAACA,GAAMqR,MACV,gBAAAnQ;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,SAAS,MAAMqf,EAAgBvgB,CAAI;AAAA,QACnC,OAAO;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,KAAK;AAAA,QAAA;AAAA,QAGN,UAAA;AAAA,UAAA,UAAUA,KAAQA,EAAK,QAAQ,gBAAAmB,EAAC,QAAA,EAAM,YAAK,MAAK;AAAA,UACjD,gBAAAA,EAAC,QAAA,EAAM,UAAAnB,EAAK,MAAA,CAAM;AAAA,UACjBA,EAAK,SAAS,UAAUA,EAAK,UAC5B,gBAAAmB,EAAC,QAAA,EAAK,OAAO,EAAE,UAAU,UAAU,SAAS,IAAA,GAAO,UAAA,IAAA,CAAC;AAAA,QAAA;AAAA,MAAA;AAAA,MAnBjD,GAAGnB,EAAK,IAAI,IAAIqR,CAAG;AAAA,IAAA,CAsB3B,EAAA,CACL;AAAA,EAAA,GAEJ;AAEJ;AC7DA,SAASmP,GAAe3b,GAA8C;AACpE,MAAI,CAACA,KAAU,OAAOA,KAAW,iBAAiB,CAAA;AAClD,QAAMvD,IAAcuD,EAAoC;AACxD,SAAI,CAACvD,KAAc,OAAOA,KAAe,WAAiB,CAAA,IACnDA;AACT;AAEA,SAASmf,GAAe1W,GAA0C;AAChE,SAAI,EAACA,KAAA,QAAAA,EAAO,SAAQ,CAAC,MAAM,QAAQA,EAAM,IAAI,IAAU,CAAA,IAChDA,EAAM,KAAK,OAAO,CAAC2W,MAAmB,OAAOA,KAAM,QAAQ;AACpE;AAEA,SAASC,GAAoB5W,GAAyC;AACpE,MAAI,CAACA,EAAO,QAAO;AACnB,MAAI,MAAM,QAAQA,EAAM,IAAI,KAAKA,EAAM,KAAK,SAAS,EAAG,QAAO;AAE/D,QAAM6W,IAAS,OAAO7W,EAAM,UAAU,EAAE,EAAE,YAAA;AAC1C,MAAI6W,EAAO,SAAS,MAAM,KAAKA,EAAO,SAAS,WAAW,EAAG,QAAO;AAEpE,QAAMC,IAAe9W,EAAM,aAAa,GAClC+W,IACJ,OAAOD,KAAiB,WAAWA,EAAa,gBAAgB;AAClE,MAAIC,MAAc,UAAUA,MAAc,SAAU,QAAO;AAE3D,QAAMrE,IAAM,OAAO1S,EAAM,QAAQ,EAAE,EAAE,YAAA;AACrC,SAAI,GAAA0S,EAAI,SAAS,MAAM,KAAKA,EAAI,SAAS,SAAS;AAGpD;AAEA,SAASsE,MAAaxM,GAAuD;AAC3E,aAAW/X,KAAS+X;AAClB,QAAI,OAAO/X,KAAU,YAAYA,EAAM,KAAA,EAAQ,QAAOA;AAG1D;AAgBO,SAASwkB,GAAS;AAAA,EACvB,SAASC;AAAA,EACT,MAAMC;AACR,GAA4B;;AAC1B,QAAMllB,IAASmlB,GAAA,GACTC,IAAWC,GAAA,GACXC,IAAWC,GAAA,GACX,EAAE,MAAMC,EAAA,IAAaC,GAAA,GAErB1T,IAAUkT,KAAejlB,EAAO,WAAW,IAC3C0lB,IACJ,GAAQF,KAAA,QAAAA,EAAU,OAClB,QAAOA,KAAA,gBAAAA,EAAU,OAAM,EAAE,EAAE,YAAA,MAAkB,SAGzC;AAAA,IACJ,QAAA3c;AAAA,IACA,WAAW8c;AAAA,IACX,OAAOC;AAAA,EAAA,IACLzP,GAAepE,CAAO,GACpB,EAAE,QAAAgI,EAAA,IAAWH,GAAU7H,CAAO,GAG9B,CAAC8T,GAAaC,CAAc,IAAIhgB,EAAS,EAAE,GAC3C,CAACigB,GAASC,CAAU,IAAIlgB,EAAwB,IAAI,GACpD,CAAC+K,GAAqBC,CAAsB,IAAIhL,EAAS,EAAK,GAG9D,CAACuH,GAAc4Y,CAAe,IAAIngB;AAAA,IACtC,CAAA;AAAA,EAAC,GAGGogB,IAAe5f,EAAQ,MAAMke,GAAe3b,CAAM,GAAG,CAACA,CAAM,CAAC,GAE7Dsd,IAAW7f,EAA8B,MAAM;AACnD,QAAIgf,EAAS,SAAS,SAAS,SAAS,EAAG,QAAO;AAClD,QAAIA,EAAS,SAAS,SAAS,OAAO,EAAG,QAAO;AAChD,QAAIA,EAAS,SAAS,SAAS,OAAO,EAAG,QAAO;AAAA,EAElD,GAAG,CAACA,EAAS,QAAQ,CAAC,GAEhBc,IAAsB9f,EAAQ,MAAM;;AACxC,UAAM+f,KAAWtnB,KAAAgb,KAAA,gBAAAA,EAAQ,qBAAR,gBAAAhb,GAA0B;AAG3C,WAAIsnB,KAAA,QAAAA,EAAU,cAAoBA,EAAS,cAEvCH,EAAa,iBAAuB,mBACpCA,EAAa,SAAe,WAEb,OAAO,KAAKA,CAAY,EAAE;AAAA,MAC3C,QAAOllB,GAAI,WAAW,SAAS,KAAKA,GAAI,SAAS,SAAS;AAAA,IAAA;AAAA,EAG9D,GAAG,CAAC+Y,GAAQmM,CAAY,CAAC,GAEnBI,IAAqBhgB,EAAQ,MAAM;;AACvC,UAAM+f,KAAWtnB,IAAAgb,KAAA,gBAAAA,EAAQ,qBAAR,gBAAAhb,EAA0B;AAG3C,WACEgmB;AAAA,MACEsB,KAAA,gBAAAA,EAAU;AAAA,MACVH,EAAa,QAAQ,UAAU;AAAA,MAC/BA,EAAa,UAAU,YAAY;AAAA,MACnCA,EAAa,QAAQ,UAAU;AAAA,MAC/BA,EAAa,OAAO,SAAS;AAAA,IAAA,KAC1B;AAAA,EAET,GAAG,CAACnM,GAAQmM,CAAY,CAAC,GAEnBK,IAAuBjgB,EAAQ,MAC5B,OAAO,QAAQ4f,CAAY,EAC/B,OAAO,CAAC,CAAA,EAAGnY,CAAK,MAAM4W,GAAoB5W,CAAK,CAAC,EAChD,IAAI,CAAC,CAAC4F,CAAI,MAAMA,CAAI,GACtB,CAACuS,CAAY,CAAC,GAEXM,KAAaznB,IAAAgb,KAAA,gBAAAA,EAAQ,qBAAR,gBAAAhb,EAA0B,QAQvC0nB,IAAmBngB,EAAQ,MACbye;AAAA,IAChByB,KAAA,gBAAAA,EAAY;AAAA,IACZN,EAAa,SAAS,WAAW;AAAA,IACjCA,EAAa,iBAAiB,mBAAmB;AAAA,IACjDK,EAAqB,CAAC;AAAA,EAAA,GAGvB,CAACC,GAAYN,GAAcK,CAAoB,CAAC,GAE7CG,IAAgBpgB,EAAQ,MACvBmgB,IACShC,GAAeyB,EAAaO,CAAgB,CAAC,EAC9C,IAAI,CAAAjmB,OAAU;AAAA,IACzB,IAAIA;AAAA,IACJ,OACEA,EAAM,OAAO,CAAC,EAAE,YAAA,IAAgBA,EAAM,MAAM,CAAC,EAAE,WAAW,KAAK,GAAG;AAAA,EAAA,EACpE,IAN4B,CAAA,GAO7B,CAACimB,GAAkBP,CAAY,CAAC,GAE7BS,IAAmB5B;AAAA,IACvByB,KAAA,gBAAAA,EAAY;AAAA,IACZN,EAAa,QAAQ,UAAU;AAAA,IAC/BA,EAAa,UAAU,YAAY;AAAA,IACnCA,EAAa,OAAO,SAAS;AAAA,IAC7B;AAAA,EAAA,GAGIU,IAAyB7B;AAAA,IAC7ByB,KAAA,gBAAAA,EAAY;AAAA,IACZN,EAAa,cAAc,gBAAgB;AAAA,IAC3CA,EAAa,QAAQ,UAAU;AAAA,EAAA,GAG3BW,IAAY,EAAQJ,GACpBK,IAAU,EAAQV,GAElBW,IAAuBzgB,EAAQ,MAAM;AACzC,UAAM0gB,IAAY9B,KAAYiB,KAAY;AAE1C,WADIa,MAAc,YAAY,CAACH,KAC3BG,MAAc,UAAU,CAACF,IAAgB,SACtCE;AAAA,EACT,GAAG,CAAC9B,GAAUiB,GAAUU,GAAWC,CAAO,CAAC,GAErCG,IAAgBnc;AAAA,IACpB,CAACoc,MAAmB;AAElB,MAAA9B,EAAS,QAAQrT,CAAO,IADTmV,MAAS,SAAS,SAASA,CACR,EAAE;AAAA,IACtC;AAAA,IACA,CAAC9B,GAAUrT,CAAO;AAAA,EAAA,GAIdoV,IAAiBrc;AAAA,IACrB,CAACiC,MAAiC;AAEhC,YAAMrL,IAAKqL,EAAI,MAAMA,EAAI;AACzB,OACE,OAAOrL,KAAO,YACd,OAAOA,KAAO,YACd,OAAOA,KAAO,aAEd0jB,EAAS,QAAQrT,CAAO,WAAWrQ,CAAE,EAAE;AAAA,IAE3C;AAAA,IACA,CAAC0jB,GAAUrT,CAAO;AAAA,EAAA,GAIdqV,KAAYtc,EAAY,MAAM;AAClC,QAAI,CAAC4a,GAAiB;AACpB,MAAAM,EAAW,8CAA8C,GACzDZ,EAAS,QAAQ;AACjB;AAAA,IACF;AACA,IAAAY,EAAW,IAAI,GACfZ,EAAS,QAAQrT,CAAO,MAAM;AAAA,EAChC,GAAG,CAAC2T,GAAiBN,GAAUrT,CAAO,CAAC,GAGjCuF,KAAiBC,GAAA,GACjB8P,IAAaC,GAAA,GAGbC,KAAmBzc,EAAY,YAAY;AAC/C,IAAIuC,EAAa,WAAW,KAE5ByD,EAAuB,EAAI;AAAA,EAC7B,GAAG,CAACzD,CAAY,CAAC,GAEXma,IAAoB1c,EAAY,YAAY;AAChD,QAAIuC,EAAa,WAAW,GAAG;AAC7B,MAAAyD,EAAuB,EAAK;AAC5B;AAAA,IACF;AAGA,UAAMlP,IAAMyL,EAAa,IAAI,CAAAN,MAAO,OAAOA,EAAI,MAAMA,EAAI,IAAI,CAAC;AAE9D,IAAAuK,GAAe;AAAA,MACb,EAAE,UAAUvF,GAAS,KAAAnQ,EAAA;AAAA,MACrB;AAAA,QACE,WAAW,MAAM;AACf,UAAAokB,EAAW,IAAI,GACfC,EAAgB,CAAA,CAAE,GAClBnV,EAAuB,EAAK,GAE5BuW,EAAW,EAAE,UAAUtV,GAAS,aAAa,CAAC,MAAM,GAAG;AAAA,QACzD;AAAA,QACA,SAAS,CAAA7O,MAAO;AACd,UAAA8iB,EAAW9iB,EAAI,WAAW,gBAAgB,GAC1C4N,EAAuB,EAAK;AAAA,QAC9B;AAAA,MAAA;AAAA,IACF;AAAA,EAEJ,GAAG,CAACzD,GAAc0E,GAASuF,IAAgB+P,CAAU,CAAC,GAGhDhiB,IAAQiB,EAAQ,MACbyL,EAAQ,WAAW,KAAK,GAAG,GACjC,CAACA,CAAO,CAAC;AAGZ,SAAI4T,IAEA,gBAAAxgB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,WAAW;AAAA,MAAA;AAAA,MAGb,4BAAC,OAAA,EAAI,OAAO,EAAE,OAAO,iCAAiC,UAAA;AAAA,QAAA;AAAA,QAC3C4M;AAAA,QAAQ;AAAA,MAAA,EAAA,CACnB;AAAA,IAAA;AAAA,EAAA,IAMF6T,IAEA,gBAAAzgB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,WAAW;AAAA,MAAA;AAAA,MAGb,4BAAC,OAAA,EAAI,OAAO,EAAE,OAAO,wBAAwB,UAAA;AAAA,QAAA;AAAA,QAC5B4M;AAAA,QAAQ;AAAA,QAAG6T,EAAU;AAAA,MAAA,EAAA,CACtC;AAAA,IAAA;AAAA,EAAA,IAMJ,gBAAA1gB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,WAAW;AAAA,MAAA;AAAA,MAIb,UAAA;AAAA,QAAA,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,gBAAgB;AAAA,cAChB,YAAY;AAAA,cACZ,cAAc;AAAA,YAAA;AAAA,YAGhB,UAAA;AAAA,cAAA,gBAAAC;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAO,EAAE,QAAQ,GAAG,UAAU,UAAU,OAAO,oBAAA;AAAA,kBAE9C,UAAAE;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGH,gBAAAH,EAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,UAAU,YAAY,SAAA,GACxD,UAAA;AAAA,gBAAA,gBAAAC;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,cAAW;AAAA,oBACX,OAAO,EAAE,SAAS,QAAQ,KAAK,WAAW,aAAa,SAAA;AAAA,oBAGrD,UAAA;AAAA,sBACE,EAAE,KAAK,QAAQ,OAAO,QAAQ,SAAS,GAAA;AAAA,sBACvC,EAAE,KAAK,UAAU,OAAO,UAAU,SAAS0hB,EAAA;AAAA,sBAC3C,EAAE,KAAK,QAAQ,OAAO,QAAQ,SAASC,EAAA;AAAA,oBAAQ,EAEjD,IAAI,CAAAI,MACJ,gBAAA/hB;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBAEC,MAAK;AAAA,wBACL,MAAK;AAAA,wBACL,iBAAe4hB,MAAeG,EAAK;AAAA,wBACnC,UAAU,CAACA,EAAK;AAAA,wBAChB,SAAS,MAAMD,EAAcC,EAAK,GAAG;AAAA,wBACrC,OAAO;AAAA,0BACL,SAAS;AAAA,0BACT,cAAc;AAAA,0BACd,QAAQ;AAAA,0BACR,YACEH,MAAeG,EAAK,MAChB,yBACA;AAAA,0BACN,OACEH,MAAeG,EAAK,MAAM,UAAU;AAAA,0BACtC,QAAQA,EAAK,UAAU,YAAY;AAAA,0BACnC,SAASA,EAAK,UAAU,IAAI;AAAA,0BAC5B,UAAU;AAAA,0BACV,YAAY;AAAA,wBAAA;AAAA,wBAGb,UAAAA,EAAK;AAAA,sBAAA;AAAA,sBAtBDA,EAAK;AAAA,oBAAA,CAwBb;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAIH,gBAAA/hB,EAACuO,GAAA,EAAK,MAAK,uBAAsB,SAAA3B,EAAA,CAAkB;AAAA,gBAElDgV,MAAe,UACd,gBAAA5hB;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,SAASiiB;AAAA,oBACT,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,iBAAiB;AAAA,sBACjB,OAAO;AAAA,sBACP,QAAQ;AAAA,sBACR,cAAc;AAAA,sBACd,QAAQ;AAAA,sBACR,YAAY;AAAA,oBAAA;AAAA,oBAEf,UAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAED,EAAA,CAEJ;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAIDrB,KACC,gBAAA5gB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,cACL,cAAc;AAAA,cACd,SAAS;AAAA,cACT,iBAAiB;AAAA,cACjB,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,OAAO;AAAA,YAAA;AAAA,YAET,MAAK;AAAA,YAEJ,UAAA4gB;AAAA,UAAA;AAAA,QAAA;AAAA,QAIJgB,MAAe,UACd,gBAAA7hB,EAAA2K,GAAA,EAEE,UAAA;AAAA,UAAA,gBAAA3K;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,KAAK;AAAA,gBACL,cAAc;AAAA,gBACd,YAAY;AAAA,cAAA;AAAA,cAId,UAAA;AAAA,gBAAA,gBAAAC;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,aAAa,UAAUE,CAAK;AAAA,oBAC5B,OAAOwgB;AAAA,oBACP,UAAU,CAAAze,MAAK0e,EAAe1e,EAAE,OAAO,KAAK;AAAA,oBAC5C,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,QAAQ;AAAA,sBACR,cAAc;AAAA,sBACd,OAAO;AAAA,sBACP,iBAAiB;AAAA,sBACjB,OAAO;AAAA,oBAAA;AAAA,kBACT;AAAA,gBAAA;AAAA,gBAIF,gBAAAjC,EAACuO,GAAA,EAAK,MAAK,gBAAe,SAAA3B,EAAA,CAAkB;AAAA,gBAG3C1E,EAAa,SAAS,KACrB,gBAAAnI;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,KAAK;AAAA,sBACL,YAAY;AAAA,sBACZ,YAAY;AAAA,oBAAA;AAAA,oBAGd,UAAA;AAAA,sBAAA,gBAAAA,EAAC,QAAA,EAAK,OAAO,EAAE,OAAO,iCACnB,UAAA;AAAA,wBAAAmI,EAAa;AAAA,wBAAO;AAAA,sBAAA,GACvB;AAAA,sBACA,gBAAAlI;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,SAASoiB;AAAA,0BACT,OAAO;AAAA,4BACL,SAAS;AAAA,4BACT,iBAAiB;AAAA,4BACjB,OAAO;AAAA,4BACP,QAAQ;AAAA,4BACR,cAAc;AAAA,4BACd,QAAQ;AAAA,0BAAA;AAAA,0BAEX,UAAA;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAGD,gBAAApiB;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,SAAS,MAAM8gB,EAAgB,EAAE;AAAA,0BACjC,OAAO;AAAA,4BACL,SAAS;AAAA,4BACT,iBAAiB;AAAA,4BACjB,OAAO;AAAA,4BACP,QAAQ;AAAA,4BACR,cAAc;AAAA,4BACd,QAAQ;AAAA,0BAAA;AAAA,0BAEX,UAAA;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBAED;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACF;AAAA,YAAA;AAAA,UAAA;AAAA,UAKJ,gBAAA9gB,EAACuO,GAAA,EAAK,MAAK,oBAAmB,SAAA3B,EAAA,CAAkB;AAAA,UAGhD,gBAAA5M;AAAA,YAACoG;AAAA,YAAA;AAAA,cACC,UAAUwG;AAAA,cACV,QAAAlJ;AAAA,cACA,iBAAe;AAAA,cACf,mBAAmBod;AAAA,cACnB,YAAYkB;AAAA,YAAA;AAAA,UAAA;AAAA,UAId,gBAAAhiB,EAACuO,GAAA,EAAK,MAAK,oBAAmB,SAAA3B,EAAA,CAAkB;AAAA,QAAA,GAClD;AAAA,QAGDgV,MAAe,YAAYF,KAAaJ,KACvC,gBAAAthB;AAAA,UAACwW;AAAA,UAAA;AAAA,YACC,UAAU5J;AAAA,YACV,QAAQ;AAAA,cACN,YAAY0U;AAAA,cACZ,SAASC;AAAA,cACT,YAAYC;AAAA,cACZ,kBAAkBC;AAAA,YAAA;AAAA,UACpB;AAAA,QAAA;AAAA,QAIHG,MAAe,UAAUD,KAAWV,KACnC,gBAAAjhB;AAAA,UAAC6c;AAAA,UAAA;AAAA,YACC,UAAUjQ;AAAA,YACV,QAAQ;AAAA,cACN,aAAaqU;AAAA,cACb,YAAYE;AAAA,cACZ,eAAe;AAAA,cACf,eAAe;AAAA,cACf,aAAa;AAAA,YAAA;AAAA,UACf;AAAA,QAAA;AAAA,QAIJ,gBAAAnhB;AAAA,UAAC6J;AAAA,UAAA;AAAA,YACC,MAAM6B;AAAA,YACN,OAAM;AAAA,YACN,SAAS,UAAUxD,EAAa,MAAM;AAAA,YACtC,cAAa;AAAA,YACb,aAAY;AAAA,YACZ,aAAW;AAAA,YACX,WAAW,MAAM;AACf,cAAAma,EAAA,EAAoB,MAAM,MAAA;AAAA,eAAe;AAAA,YAC3C;AAAA,YACA,UAAU,MAAM1W,EAAuB,EAAK;AAAA,UAAA;AAAA,QAAA;AAAA,MAC9C;AAAA,IAAA;AAAA,EAAA;AAGN;ACxgBO,SAAS2W,GAAS;AAAA,EACvB,SAASxC;AAAA,EACT,IAAIyC;AACN,GAA4B;AAC1B,QAAM1nB,IAASmlB,GAAA,GACTC,IAAWC,GAAA,GAEXtT,IAAUkT,KAAejlB,EAAO,WAAW,IAC3C0B,IAAKgmB,KAAU1nB,EAAO,IACtBkO,IAAY,CAAC,CAACxM,GACdgC,IAASikB,GAAA,GAETC,IAAe9c,EAAY,CAAC+c,MAA8B;AAC9D,UAAMlO,IAAUkO,EAAU,KAAA,EAAO,QAAQ,QAAQ,EAAE;AACnD,WAAKlO,IAMEA,EAAQ,QAAQ,eAAe,EAAE,IAL/B;AAAA,EAMX,GAAG,CAAA,CAAE,GAGC;AAAA,IACJ,QAAA9Q;AAAA,IACA,WAAW8c;AAAA,IACX,OAAOC;AAAA,EAAA,IACLzP,GAAepE,CAAO,GAGpB,EAAE,QAAQ+V,GAAa,OAAAtmB,EAAA,IAAUumB,GAAO;AAAA,IAC5C,UAAUhW;AAAA,IACV,IAAIrQ,KAAM;AAAA,IACV,cAAc,EAAE,SAASwM,EAAA;AAAA,EAAU,CACpC,GACK8Z,IAAWxmB,KAAA,gBAAAA,EAAO,OAGlBymB,IAAiBC,GAAA,GACjBzZ,IAAiBC,GAAA,GAGjB,EAAE,OAAOyZ,EAAA,IAAkBlW,GAAmBF,GAASrQ,GAAI;AAAA,IAC/D,SAASwM;AAAA,EAAA,CACV,GAGK,CAACnJ,GAAUqjB,CAAW,IAAItiB,EAAkC,CAAA,CAAE,GAC9D,CAACpB,GAAQ2jB,CAAS,IAAIviB,EAAmB,CAAA,CAAE,GAC3C,CAACwiB,GAASC,CAAU,IAAIziB,EAAmB,CAAA,CAAE,GAC7C,CAAC0iB,GAAiBC,CAAkB,IAAI3iB,EAAS,EAAE,GAEnD4iB,IAAW5d,EAAY,CAAC3L,MAAoB;AAChD,IAAAkpB,EAAU,CAAAxQ,MAAQ,CAAC,GAAGA,GAAM1Y,CAAO,CAAC;AAAA,EACtC,GAAG,CAAA,CAAE,GAECwpB,IAAY7d,EAAY,CAAC3L,MAAoB;AACjD,IAAAopB,EAAW,CAAA1Q,MAAQ,CAAC,GAAGA,GAAM1Y,CAAO,CAAC;AAAA,EACvC,GAAG,CAAA,CAAE,GAECypB,IAAgB9d,EAAY,CAAC7G,MAAkB;AACnD,IAAAskB,EAAW,CAAA1Q,MAAQA,EAAK,OAAO,CAACuG,GAAGhJ,MAAMA,MAAMnR,CAAK,CAAC;AAAA,EACvD,GAAG,CAAA,CAAE;AAGL,EAAA+F,EAAU,MAAM;AACd,IAAI8d,KAAe,OAAO,KAAK/iB,CAAQ,EAAE,WAAW,KAClDqjB,EAAYN,CAAsC;AAAA,EAEtD,GAAG,CAACA,GAAa/iB,CAAQ,CAAC,GAG1BiF,EAAU,MAAM;AACd,UAAM6e,IAAUjF,GAAiB7R,GAAS,QAAQ;AAClD,eAAW4R,KAAUkF;AACnB,UAAI;AACF,QAAAlF,EAAO,QAAQ;AAAA,UACb,KAAK5e;AAAA,UACL,UAAU,CAACgJ,GAAOvN,MAChB4nB,EAAY,CAAAvQ,OAAS,EAAE,GAAGA,GAAM,CAAC9J,CAAK,GAAGvN,IAAQ;AAAA,UACnD,UAAU,CAAAuN,MAAShJ,EAASgJ,CAAK;AAAA,UACjC,aAAa,MAAM;AAAA,UAAC;AAAA,UACpB,WAAW,MAAM;AAAA,UAAC;AAAA,UAClB,aAAa,MAAM;AAAA,UAAC;AAAA,UACpB,WAAW,CAAC5O,GAASsE,MAAS;AAC5B,gBAAIA,MAAS,SAAS;AACpB,cAAAilB,EAASvpB,CAAO;AAChB;AAAA,YACF;AACA,YAAAwpB,EAAUxpB,CAAO;AAAA,UACnB;AAAA,UACA,MAAM,EAAE,IAAI,IAAI,OAAO,IAAI,OAAO,CAAA,EAAC;AAAA,QAAE,CACtC;AAAA,MACH,SAAS+D,GAAK;AACZ,gBAAQ,MAAM,wBAAwBA,CAAG;AAAA,MAC3C;AAAA,EAEJ,GAAG,CAACwlB,GAAUC,GAAW5W,GAAShN,CAAQ,CAAC;AAG3C,QAAMuE,IAAewB,EAAY,CAAC/H,MAAkB;AAClD,IAAAqlB,EAAYrlB,CAA+B,GAC3CslB,EAAU,CAAA,CAAE,GACZE,EAAW,CAAA,CAAE;AAAA,EACf,GAAG,CAAA,CAAE,GAGC9M,IAAa3Q,EAAY,YAAY;AAEzC,UAAMge,IAAkBlF,GAAiB7R,GAAS,UAAU;AAC5D,eAAW4R,KAAUmF;AACnB,UAAI;AACF,QAAAnF,EAAO,QAAQ;AAAA,UACb,KAAK5e;AAAA,UACL,UAAU,CAACgJ,GAAOvN,MAChB4nB,EAAY,CAAAvQ,OAAS,EAAE,GAAGA,GAAM,CAAC9J,CAAK,GAAGvN,IAAQ;AAAA,UACnD,UAAU,CAAAuN,MAAShJ,EAASgJ,CAAK;AAAA,UACjC,aAAa,MAAM;AAAA,UAAC;AAAA,UACpB,WAAW,MAAM;AAAA,UAAC;AAAA,UAClB,aAAa,MAAM;AAAA,UAAC;AAAA,UACpB,WAAW2a;AAAA,UACX,MAAM,EAAE,IAAI,IAAI,OAAO,IAAI,OAAO,CAAA,EAAC;AAAA,QAAE,CACtC;AAAA,MACH,SAASxlB,GAAK;AACZ,QAAAmlB,EAAU,CAAEnlB,EAAc,OAAO,CAAC;AAClC;AAAA,MACF;AAGF,QAAI;AACF,MAAIgL,IACFO,EAAe;AAAA,QACb,EAAE,UAAUsD,GAAS,IAAIrQ,KAAM,IAAI,QAAQqD,EAAA;AAAA,QAC3C;AAAA,UACE,WAAW,MAAM;AAEf,kBAAMgkB,IAAenF,GAAiB7R,GAAS,WAAW;AAC1D,uBAAW4R,KAAUoF;AACnB,cAAApF,EAAO,QAAQ;AAAA,gBACb,KAAK5e;AAAA,gBACL,UAAU,MAAM;AAAA,gBAAC;AAAA,gBACjB,UAAU,CAAAgJ,MAAShJ,EAASgJ,CAAK;AAAA,gBACjC,aAAa,MAAM;AAAA,gBAAC;AAAA,gBACpB,WAAW,MAAM;AAAA,gBAAC;AAAA,gBAClB,aAAa,MAAM;AAAA,gBAAC;AAAA,gBACpB,WAAW4a;AAAA,gBACX,MAAM,EAAE,IAAI,IAAI,OAAO,IAAI,OAAO,CAAA,EAAC;AAAA,cAAE,CACtC;AAGH,YAAAvD,EAAS,QAAQrT,CAAO,OAAO;AAAA,UACjC;AAAA,UACA,SAAS,CAAA7O,MAAOmlB,EAAU,CAACnlB,EAAI,OAAO,CAAC;AAAA,QAAA;AAAA,MACzC,IAGF+kB,EAAe;AAAA,QACb,EAAE,UAAUlW,GAAS,QAAQhN,EAAA;AAAA,QAC7B;AAAA,UACE,WAAW,MAAM;AAEf,YAAAqgB,EAAS,QAAQrT,CAAO,OAAO;AAAA,UACjC;AAAA,UACA,SAAS,CAAA7O,MAAOmlB,EAAU,CAACnlB,EAAI,OAAO,CAAC;AAAA,QAAA;AAAA,MACzC;AAAA,IAGN,SAASA,GAAK;AACZ,MAAAmlB,EAAU,CAAEnlB,EAAc,OAAO,CAAC;AAAA,IACpC;AAAA,EACF,GAAG;AAAA,IACD6O;AAAA,IACArQ;AAAA,IACAwM;AAAA,IACAnJ;AAAA,IACA2jB;AAAA,IACAC;AAAA,IACAV;AAAA,IACAxZ;AAAA,IACA2W;AAAA,EAAA,CACD,GAGKxW,IAAe9D,EAAY,MAAM;AACrC,IAAAsa,EAAS,QAAQrT,CAAO,OAAO;AAAA,EACjC,GAAG,CAACqT,GAAUrT,CAAO,CAAC,GAEhBiX,IAAmBle,EAAY,MAAM;AACzC,QAAI,CAACpJ,EAAI;AAET,UAAM7B,IAAO+nB,EAAalkB,CAAM,GAC1B1D,IAAS,IAAI,gBAAgB,EAAE,QAAQ,QAAQ;AACrD,IAAIwoB,EAAgB,UAClBxoB,EAAO,IAAI,gBAAgBwoB,EAAgB,MAAM;AAGnD,UAAMtnB,IAAM,GAAGrB,CAAI,iBAAiB,mBAAmBkS,CAAO,CAAC,IAAI,mBAAmBrQ,CAAE,CAAC,IAAI1B,EAAO,UAAU;AAC9G,eAAW,KAAKkB,GAAK,UAAU,qBAAqB;AAAA,EACtD,GAAG,CAACwC,GAAQqO,GAAS6V,GAAclmB,GAAI8mB,CAAe,CAAC,GAEjDS,IAAmBne,EAAY,YAAY;AAC/C,QAAI,CAACpJ,EAAI;AAET,UAAM7B,IAAO+nB,EAAalkB,CAAM,GAC1B1D,IAAS,IAAI,gBAAgB;AAAA,MACjC,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,YAAY;AAAA,IAAA,CACb;AACD,IAAIwoB,EAAgB,UAClBxoB,EAAO,IAAI,gBAAgBwoB,EAAgB,MAAM;AAGnD,UAAMtnB,IAAM,GAAGrB,CAAI,iBAAiB,mBAAmBkS,CAAO,CAAC,IAAI,mBAAmBrQ,CAAE,CAAC,IAAI1B,EAAO,UAAU;AAE9G,QAAI;AACF,YAAMqB,IAAW,MAAM,MAAMH,GAAK,EAAE,aAAa,WAAW;AAC5D,UAAI,CAACG,EAAS,IAAI;AAChB,cAAMC,KAAW,MAAMD,EAAS,KAAA,EAAO,MAAM,OAAO,CAAA,EAAG;AAIvD,cAAM,IAAI;AAAA,UACRC,GAAQ,UACNA,GAAQ,SACR,2BAA2BD,EAAS,MAAM;AAAA,QAAA;AAAA,MAEhD;AAGA,UAAI,EADgBA,EAAS,QAAQ,IAAI,cAAc,KAAK,IAC3C,SAAS,iBAAiB;AACzC,cAAM,IAAI;AAAA,UACR;AAAA,QAAA;AAIJ,YAAMoX,KAAO,MAAMpX,EAAS,KAAA,GACtB6nB,KAAc,IAAI,gBAAgBzQ,EAAI,GACtC0Q,KAAS,SAAS,cAAc,GAAG;AACzC,MAAAA,GAAO,OAAOD,IACdC,GAAO,WAAW,GAAGpX,CAAO,IAAIrQ,CAAE,QAClC,SAAS,KAAK,YAAYynB,EAAM,GAChCA,GAAO,MAAA,GACPA,GAAO,OAAA,GACP,IAAI,gBAAgBD,EAAW;AAAA,IACjC,SAAShmB,GAAK;AACZ,MAAAmlB,EAAU;AAAA,QACRnlB,aAAe,QAAQA,EAAI,UAAU;AAAA,MAAA,CACtC;AAAA,IACH;AAAA,EACF,GAAG,CAACQ,GAAQqO,GAAS6V,GAAclmB,GAAI8mB,CAAe,CAAC,GAGjDY,IAAerkB,EAAS,MACxBskB,KACJ,OAAOD,KAAiB,YAAY,OAAOA,KAAiB,WACxD,OAAOA,CAAY,IAClB1nB,KAAM,IAEP2D,KAAQ6I,IACV,QAAQ6D,EAAQ,WAAW,KAAK,GAAG,CAAC,KAAKsX,EAAW,KACpD,OAAOtX,EAAQ,WAAW,KAAK,GAAG,CAAC;AAGvC,MAAI4T,KAAgBzX,MAAa1M,KAAA,QAAAA,EAAO;AACtC,WACE,gBAAA2D;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,WAAW;AAAA,QAAA;AAAA,QAGb,4BAAC,OAAA,EAAI,OAAO,EAAE,OAAO,8BAAA,GAAiC,UAAA,aAAA,CAAU;AAAA,MAAA;AAAA,IAAA;AAMtE,MAAIygB;AACF,WACE,gBAAAzgB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,WAAW;AAAA,QAAA;AAAA,QAGb,4BAAC,OAAA,EAAI,OAAO,EAAE,OAAO,wBAAwB,UAAA;AAAA,UAAA;AAAA,UACnCygB,EAAU;AAAA,QAAA,EAAA,CACpB;AAAA,MAAA;AAAA,IAAA;AAKN,MAAI1X,KAAa8Z;AACf,WACE,gBAAA7iB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,SAAS;AAAA,UACT,iBAAiB;AAAA,UACjB,WAAW;AAAA,QAAA;AAAA,QAGb,UAAA,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,cACL,OAAO;AAAA,cACP,iBAAiB;AAAA,cACjB,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,cAAc;AAAA,YAAA;AAAA,YAEhB,MAAK;AAAA,YAEJ,UAAA6iB,EAAS,WAAW,kBAAkBjW,CAAO;AAAA,UAAA;AAAA,QAAA;AAAA,MAChD;AAAA,IAAA;AAKN,QAAMhD,IACJkZ,EAAe,SAAS,aAAaxZ,EAAe,SAAS;AAE/D,MAAI6a,KAAc;AAClB,SAAIva,IACFua,KAAc,cACLpb,MACTob,KAAc,SAId,gBAAApkB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,iBAAiB;AAAA,QACjB,WAAW;AAAA,MAAA;AAAA,MAIb,UAAA;AAAA,QAAA,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,gBAAgB;AAAA,cAChB,YAAY;AAAA,cACZ,cAAc;AAAA,YAAA;AAAA,YAGhB,UAAA;AAAA,cAAA,gBAAAC;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAO,EAAE,QAAQ,GAAG,UAAU,UAAU,OAAO,oBAAA;AAAA,kBAE9C,UAAAE;AAAA,gBAAA;AAAA,cAAA;AAAA,cAIF6I,KAAaia,KACZ,gBAAAhjB;AAAA,gBAAC0N;AAAA,gBAAA;AAAA,kBACC,SAAAd;AAAA,kBACA,IAAArQ;AAAA,kBACA,WAAS;AAAA,kBACT,kBAAkB,MAAA;;AAAM,4BAAA3C,IAAAyC,KAAA,gBAAAA,EAAO,YAAP,gBAAAzC,EAAA,KAAAyC;AAAA;AAAA,gBAAiB;AAAA,cAAA;AAAA,YAC3C;AAAA,UAAA;AAAA,QAAA;AAAA,0BAKHkS,GAAA,EAAK,MAAK,eAAc,SAAA3B,GAAkB,MAAMhN,GAAU,IAAArD,GAAQ;AAAA,QAGlEgD,EAAO,SAAS,KACf,gBAAAS;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,cACL,cAAc;AAAA,cACd,SAAS;AAAA,cACT,iBAAiB;AAAA,cACjB,QAAQ;AAAA,cACR,cAAc;AAAA,YAAA;AAAA,YAGf,YAAO,IAAI,CAAChD,GAAOiT,MAClB,gBAAAjQ,EAAC,SAA0B,OAAO,EAAE,OAAO,qBAAA,GACxC,UAAAhD,EAAA,GADO,GAAGA,CAAK,IAAIiT,CAAC,EAEvB,CACD;AAAA,UAAA;AAAA,QAAA;AAAA,QAIJkT,EAAQ,SAAS,KAChB,gBAAAnjB,EAAC,SAAI,OAAO,EAAE,cAAc,OAAA,GACzB,UAAAmjB,EAAQ,IAAI,CAACiB,GAAQtlB,MACpB,gBAAAkB;AAAA,UAACsK;AAAA,UAAA;AAAA,YAEC,SAAS8Z;AAAA,YACT,SAAQ;AAAA,YACR,WAAW,MAAMX,EAAc3kB,CAAK;AAAA,UAAA;AAAA,UAH/B,GAAGslB,CAAM,IAAItlB,CAAK;AAAA,QAAA,CAK1B,GACH;AAAA,QAID4E,KACC,gBAAA1D;AAAA,UAAC4D;AAAA,UAAA;AAAA,YACC,QAAAF;AAAA,YACA,UAAA9D;AAAA,YACA,UAAUuE;AAAA,YACV,UAAUmS;AAAA,YACV,kBAAgB;AAAA,UAAA;AAAA,QAAA;AAAA,0BAKnB/H,GAAA,EAAK,MAAK,eAAc,SAAA3B,GAAkB,MAAMhN,GAAU,IAAArD,GAAQ;AAAA,QAGnE,gBAAAwD;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,cACL,WAAW;AAAA,cACX,YAAY;AAAA,cACZ,WAAW;AAAA,cACX,SAAS;AAAA,cACT,UAAU;AAAA,cACV,KAAK;AAAA,YAAA;AAAA,YAGP,UAAA;AAAA,cAAA,gBAAAC;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,SAASsW;AAAA,kBACT,UAAU1M;AAAA,kBACV,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,iBAAiB;AAAA,oBACjB,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,cAAc;AAAA,oBACd,QAAQA,IAAW,SAAS;AAAA,oBAC5B,YAAY;AAAA,oBACZ,SAASA,IAAW,MAAM;AAAA,kBAAA;AAAA,kBAG3B,UAAAua;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGH,gBAAAnkB;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,SAASyJ;AAAA,kBACT,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,iBAAiB;AAAA,oBACjB,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,cAAc;AAAA,oBACd,QAAQ;AAAA,kBAAA;AAAA,kBAEX,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAIAV,KACC,gBAAAhJ,EAAA2K,GAAA,EACE,UAAA;AAAA,gBAAA,gBAAA1K;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAOqjB;AAAA,oBACP,UAAU,CAAA1lB,MAAS2lB,EAAmB3lB,EAAM,OAAO,KAAK;AAAA,oBACxD,aAAY;AAAA,oBACZ,OAAO,EAAE,UAAU,QAAA;AAAA,kBAAQ;AAAA,gBAAA;AAAA,gBAE7B,gBAAAqC;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,SAAS6jB;AAAA,oBACT,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,iBAAiB;AAAA,sBACjB,OAAO;AAAA,sBACP,QAAQ;AAAA,sBACR,cAAc;AAAA,sBACd,QAAQ;AAAA,oBAAA;AAAA,oBAEX,UAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAGD,gBAAA7jB;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,SAAS8jB;AAAA,oBACT,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,iBAAiB;AAAA,sBACjB,OAAO;AAAA,sBACP,QAAQ;AAAA,sBACR,cAAc;AAAA,sBACd,QAAQ;AAAA,oBAAA;AAAA,oBAEX,UAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAED,GACF;AAAA,gCAIDvV,GAAA,EAAK,MAAK,gBAAe,SAAA3B,GAAkB,MAAMhN,GAAU,IAAArD,EAAA,CAAQ;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACtE;AAAA,IAAA;AAAA,EAAA;AAGN;ACzhBA,MAAM8nB,KAGF;AAAA,EACF,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,WAAW;AAAA,IACX,MAAM;AAAA,EAAA;AAAA,EAER,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,SAAS;AAAA,IACT,WAAW;AAAA,IACX,MAAM;AAAA,EAAA;AAAA,EAER,WAAW;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,WAAW;AAAA,IACX,MAAM;AAAA,EAAA;AAEV;AAEA,SAASC,GAAoBC,GAM3B;AACA,QAAMC,IAAQH,GAAgBE,CAAQ;AACtC,SAAIC,IACK;AAAA,IACL,GAAGA;AAAA,IACH,QAAQD,MAAa,WAAW,mBAAmB;AAAA,EAAA,IAIhD;AAAA,IACL,OAAO,iBAAiBA,CAAQ;AAAA,IAChC,SAAS;AAAA,IACT,WAAW;AAAA,IACX,MAAM;AAAA,IACN,QAAQ;AAAA,EAAA;AAEZ;AAEA,SAASE,KAAuC;;AAW9C,QAAMC,KACJ1Y,KAAAxK,KAAA5H,IAXmB,WAWN,yBAAb,gBAAAA,EAAmC,SAAnC,gBAAA4H,EAAyC,UAAzC,gBAAAwK,EAAgD;AAElD,SAAI,MAAM,QAAQ0Y,CAAY,IACrBA,EAAa;AAAA,IAClB,CAACH,MAAiC,OAAOA,KAAa;AAAA,EAAA,IAItDG,KAAgB,OAAOA,KAAiB,WACnC,OAAO,KAAKA,CAAY,IAG1B,CAAA;AACT;AAyBO,SAASC,GAAU;AAAA,EACxB,OAAAzkB,IAAQ;AAAA,EACR,MAAA0kB;AAAA,EACA,YAAAC;AACF,GAA6B;AAC3B,QAAM,EAAE,QAAQC,GAAO,QAAA7qB,EAAA,IAAW8qB,GAAA,GAC5B,CAAC/nB,GAAOmM,CAAQ,IAAIxI,EAAwB,IAAI,GAEhD4E,IAAYtL,MAAW,WAGvB+qB,IAAsBP,GAAA,GAEtBrgB,IAAe,CAACnC,MAAkC;AACtD,IAAAA,EAAE,eAAA,GACFkH,EAAS,IAAI;AAEb,UAAMvJ,IAAW,IAAI,SAASqC,EAAE,aAAa,GACvCnF,IAAQ8C,EAAS,IAAI,OAAO,GAC5B7C,IAAW6C,EAAS,IAAI,UAAU;AAExC,IAAAklB;AAAA,MACE,EAAE,OAAAhoB,GAAO,UAAAC,GAAU,YAAA8nB,EAAA;AAAA,MACnB;AAAA,QACE,WAAW,CAAA/d,MAAU;;AACnB,cAAIA,KAAU,aAAaA,KAAUA,EAAO,YAAY,IAAO;AAC7D,kBAAM9M,MACJJ,IAAAkN,EAAO,UAAP,gBAAAlN,EAAc,YACd;AACF,YAAAuP,EAASnP,CAAO;AAAA,UAClB;AAAA,QACF;AAAA,QACA,SAAS,CAAA+D,MAAO;AACd,UAAAoL,EAASpL,EAAI,WAAW,iCAAiC;AAAA,QAC3D;AAAA,MAAA;AAAA,IACF;AAAA,EAEJ,GAEMknB,IAAmB,CAACV,MAAqB;AAC7C,eAAW,SAAS,OAAO,sBAAsBA,CAAQ;AAAA,EAC3D;AAEA,SACE,gBAAAvkB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,gBAAgB;AAAA,QAChB,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,iBAAiB;AAAA,MAAA;AAAA,MAGnB,UAAA,gBAAAD;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAO;AAAA,YACL,OAAO;AAAA,YACP,UAAU;AAAA,YACV,SAAS;AAAA,YACT,iBAAiB;AAAA,YACjB,cAAc;AAAA,YACd,WAAW;AAAA,UAAA;AAAA,UAIZ,UAAA;AAAA,YAAA6kB,KACC,gBAAA5kB,EAAC,OAAA,EAAI,OAAO,EAAE,WAAW,UAAU,cAAc,SAAA,GAC9C,UAAA,OAAO4kB,KAAS,6BACd,OAAA,EAAI,KAAKA,GAAM,KAAI,QAAO,OAAO,EAAE,WAAW,OAAA,GAAU,IAEzDA,EAAA,CAEJ;AAAA,YAIF,gBAAA5kB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,QAAQ;AAAA,kBACR,UAAU;AAAA,kBACV,WAAW;AAAA,kBACX,OAAO;AAAA,gBAAA;AAAA,gBAGR,UAAAE;AAAA,cAAA;AAAA,YAAA;AAAA,YAIF8kB,EAAoB,SAAS,KAC5B,gBAAAjlB,EAAC,SAAI,OAAO,EAAE,cAAc,SAAA,GACzB,UAAA;AAAA,cAAAilB,EAAoB,IAAI,CAAAT,MAAY;AACnC,sBAAMW,IAAMZ,GAAoBC,CAAQ;AACxC,uBACE,gBAAAxkB;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBAEC,MAAK;AAAA,oBACL,IAAI,aAAawkB,CAAQ;AAAA,oBACzB,SAAS,MAAMU,EAAiBV,CAAQ;AAAA,oBACxC,OAAO;AAAA,sBACL,OAAO;AAAA,sBACP,SAAS;AAAA,sBACT,cAAc;AAAA,sBACd,iBAAiBW,EAAI;AAAA,sBACrB,OAAOA,EAAI;AAAA,sBACX,QAAQA,EAAI;AAAA,sBACZ,cAAc;AAAA,sBACd,UAAU;AAAA,sBACV,YAAY;AAAA,sBACZ,QAAQ;AAAA,sBACR,SAAS;AAAA,sBACT,YAAY;AAAA,sBACZ,gBAAgB;AAAA,sBAChB,KAAK;AAAA,oBAAA;AAAA,oBAGP,UAAA;AAAA,sBAAA,gBAAAllB,EAAC,QAAA,EAAK,OAAO,EAAE,YAAY,KAAK,SAAS,IAAA,GACtC,UAAAklB,EAAI,KAAA,CACP;AAAA,sBACCA,EAAI;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAxBAX;AAAA,gBAAA;AAAA,cA2BX,CAAC;AAAA,cAGD,gBAAAxkB;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,KAAK;AAAA,oBACL,WAAW;AAAA,oBACX,cAAc;AAAA,kBAAA;AAAA,kBAGhB,UAAA;AAAA,oBAAA,gBAAAC;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,OAAO,EAAE,MAAM,GAAG,QAAQ,OAAO,iBAAiB,UAAA;AAAA,sBAAU;AAAA,oBAAA;AAAA,oBAE9D,gBAAAA,EAAC,UAAK,OAAO,EAAE,OAAO,QAAQ,UAAU,UAAA,GAAa,UAAA,KAAA,CAAE;AAAA,oBACvD,gBAAAA;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,OAAO,EAAE,MAAM,GAAG,QAAQ,OAAO,iBAAiB,UAAA;AAAA,sBAAU;AAAA,oBAAA;AAAA,kBAC9D;AAAA,gBAAA;AAAA,cAAA;AAAA,YACF,GACF;AAAA,YAIDhD,KACC,gBAAAgD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,cAAc;AAAA,kBACd,SAAS;AAAA,kBACT,iBAAiB;AAAA,kBACjB,QAAQ;AAAA,kBACR,cAAc;AAAA,kBACd,OAAO;AAAA,kBACP,UAAU;AAAA,gBAAA;AAAA,gBAGX,UAAAhD;AAAA,cAAA;AAAA,YAAA;AAAA,YAKL,gBAAA+C,EAAC,QAAA,EAAK,UAAUqE,GACd,UAAA;AAAA,cAAA,gBAAArE,EAAC,OAAA,EAAI,OAAO,EAAE,cAAc,UAC1B,UAAA;AAAA,gBAAA,gBAAAC;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,cAAc;AAAA,sBACd,YAAY;AAAA,sBACZ,OAAO;AAAA,oBAAA;AAAA,oBAEV,UAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAGD,gBAAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,IAAG;AAAA,oBACH,MAAK;AAAA,oBACL,MAAK;AAAA,oBACL,UAAQ;AAAA,oBACR,cAAa;AAAA,oBACb,aAAY;AAAA,oBACZ,OAAO;AAAA,sBACL,OAAO;AAAA,sBACP,SAAS;AAAA,sBACT,QAAQ;AAAA,sBACR,cAAc;AAAA,sBACd,UAAU;AAAA,sBACV,WAAW;AAAA,oBAAA;AAAA,kBACb;AAAA,gBAAA;AAAA,cACF,GACF;AAAA,gCAEC,OAAA,EAAI,OAAO,EAAE,cAAc,YAC1B,UAAA;AAAA,gBAAA,gBAAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,OAAO;AAAA,sBACL,SAAS;AAAA,sBACT,cAAc;AAAA,sBACd,YAAY;AAAA,sBACZ,OAAO;AAAA,oBAAA;AAAA,oBAEV,UAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAGD,gBAAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,IAAG;AAAA,oBACH,MAAK;AAAA,oBACL,MAAK;AAAA,oBACL,UAAQ;AAAA,oBACR,cAAa;AAAA,oBACb,aAAY;AAAA,oBACZ,OAAO;AAAA,sBACL,OAAO;AAAA,sBACP,SAAS;AAAA,sBACT,QAAQ;AAAA,sBACR,cAAc;AAAA,sBACd,UAAU;AAAA,sBACV,WAAW;AAAA,oBAAA;AAAA,kBACb;AAAA,gBAAA;AAAA,cACF,GACF;AAAA,cAEA,gBAAAA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,UAAUuF;AAAA,kBACV,OAAO;AAAA,oBACL,OAAO;AAAA,oBACP,SAAS;AAAA,oBACT,iBAAiB;AAAA,oBACjB,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,cAAc;AAAA,oBACd,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,QAAQA,IAAY,SAAS;AAAA,oBAC7B,SAASA,IAAY,MAAM;AAAA,kBAAA;AAAA,kBAG5B,cAAY,kBAAkB;AAAA,gBAAA;AAAA,cAAA;AAAA,YACjC,GACF;AAAA,YAGA,gBAAAvF;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,WAAW;AAAA,kBACX,WAAW;AAAA,kBACX,UAAU;AAAA,kBACV,OAAO;AAAA,gBAAA;AAAA,gBAGT,UAAA,gBAAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO,EAAE,OAAO,WAAW,gBAAgB,OAAA;AAAA,oBAC5C,UAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAED;AAAA,YAAA;AAAA,UACF;AAAA,QAAA;AAAA,MAAA;AAAA,IACF;AAAA,EAAA;AAGN;ACvUO,SAASmlB,KAA4B;;AAC1C,QAAM1O,KAAU7c,IAAA,OAAuE,yBAAvE,gBAAAA,EAA6F;AAE7G,SAAO;AAAA,IACL,eAAc6c,KAAA,gBAAAA,EAAQ,iBAAgB;AAAA,IACtC,WAAUA,KAAA,gBAAAA,EAAQ,aAAY;AAAA,IAC9B,YAAYA,KAAA,gBAAAA,EAAQ;AAAA,EAAA;AAExB;"}
1
+ {"version":3,"file":"index.js","sources":["../src/constants.ts","../src/data.ts","../src/auth.ts","../src/live.ts","../src/components/form/templates.tsx","../src/components/form/AutoForm.tsx","../src/components/form/LinkWidget.tsx","../src/components/table/AutoTable.tsx","../src/components/table/EditableCell.tsx","../src/components/feedback/ConfirmDialog.tsx","../src/components/feedback/AlertBanner.tsx","../src/components/table/BulkActionsBar.tsx","../src/components/workflow/StateBadge.tsx","../src/hooks/useWorkflowActions.ts","../src/components/workflow/WorkflowActions.tsx","../src/plugins/registry.ts","../src/plugins/Slot.tsx","../src/components/CommandPalette.tsx","../src/components/menu/index.tsx","../src/components/breadcrumb/index.tsx","../src/components/layout/index.tsx","../src/hooks/useDocTypeMeta.ts","../src/hooks/useDocTypes.ts","../src/hooks/useInlineEdit.ts","../src/hooks/useBulkActions.ts","../src/hooks/useCommandPalette.ts","../src/hooks/useTranslation.ts","../src/hooks/useUIMeta.ts","../src/views/registry.ts","../src/views/KanbanView.tsx","../src/views/CalendarView.tsx","../src/views/GanttView.tsx","../src/views/TreeView.tsx","../src/config/registry.ts","../src/config/useConfig.ts","../src/workspace/WorkspaceSection.tsx","../src/pages/ListView.tsx","../src/pages/FormView.tsx","../src/pages/LoginPage.tsx","../src/authConfig.ts","../src/shell/context.ts","../src/shell/ShellProvider.tsx","../src/shell/realtime.ts","../src/hooks/useShell.ts","../src/components/layout/Sidebar/Sidebar.tsx","../src/components/layout/Navbar/Navbar.tsx","../../../node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/type.js","../__vite-browser-external","../../../node_modules/.pnpm/object-inspect@1.13.4/node_modules/object-inspect/index.js","../../../node_modules/.pnpm/side-channel-list@1.0.0/node_modules/side-channel-list/index.js","../../../node_modules/.pnpm/es-object-atoms@1.1.1/node_modules/es-object-atoms/index.js","../../../node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/index.js","../../../node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/eval.js","../../../node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/range.js","../../../node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/ref.js","../../../node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/syntax.js","../../../node_modules/.pnpm/es-errors@1.3.0/node_modules/es-errors/uri.js","../../../node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/abs.js","../../../node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/floor.js","../../../node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/max.js","../../../node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/min.js","../../../node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/pow.js","../../../node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/round.js","../../../node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/isNaN.js","../../../node_modules/.pnpm/math-intrinsics@1.1.0/node_modules/math-intrinsics/sign.js","../../../node_modules/.pnpm/gopd@1.2.0/node_modules/gopd/gOPD.js","../../../node_modules/.pnpm/gopd@1.2.0/node_modules/gopd/index.js","../../../node_modules/.pnpm/es-define-property@1.0.1/node_modules/es-define-property/index.js","../../../node_modules/.pnpm/has-symbols@1.1.0/node_modules/has-symbols/shams.js","../../../node_modules/.pnpm/has-symbols@1.1.0/node_modules/has-symbols/index.js","../../../node_modules/.pnpm/get-proto@1.0.1/node_modules/get-proto/Reflect.getPrototypeOf.js","../../../node_modules/.pnpm/get-proto@1.0.1/node_modules/get-proto/Object.getPrototypeOf.js","../../../node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/implementation.js","../../../node_modules/.pnpm/function-bind@1.1.2/node_modules/function-bind/index.js","../../../node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/functionCall.js","../../../node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/functionApply.js","../../../node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/reflectApply.js","../../../node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/actualApply.js","../../../node_modules/.pnpm/call-bind-apply-helpers@1.0.2/node_modules/call-bind-apply-helpers/index.js","../../../node_modules/.pnpm/dunder-proto@1.0.1/node_modules/dunder-proto/get.js","../../../node_modules/.pnpm/get-proto@1.0.1/node_modules/get-proto/index.js","../../../node_modules/.pnpm/hasown@2.0.2/node_modules/hasown/index.js","../../../node_modules/.pnpm/get-intrinsic@1.3.0/node_modules/get-intrinsic/index.js","../../../node_modules/.pnpm/call-bound@1.0.4/node_modules/call-bound/index.js","../../../node_modules/.pnpm/side-channel-map@1.0.1/node_modules/side-channel-map/index.js","../../../node_modules/.pnpm/side-channel-weakmap@1.0.2/node_modules/side-channel-weakmap/index.js","../../../node_modules/.pnpm/side-channel@1.1.0/node_modules/side-channel/index.js","../../../node_modules/.pnpm/qs@6.15.0/node_modules/qs/lib/formats.js","../../../node_modules/.pnpm/qs@6.15.0/node_modules/qs/lib/utils.js","../../../node_modules/.pnpm/qs@6.15.0/node_modules/qs/lib/stringify.js","../../../node_modules/.pnpm/qs@6.15.0/node_modules/qs/lib/parse.js","../../../node_modules/.pnpm/qs@6.15.0/node_modules/qs/lib/index.js","../../../node_modules/.pnpm/@refinedev+react-router@2.0.4_@refinedev+core@5.0.11_@tanstack+react-query@5.95.2_react_edeed653b32ab2a7e59e7d3cbaf7909a/node_modules/@refinedev/react-router/dist/index.mjs","../../framework-m-plugin-sdk/dist/index.js","../src/config/i18n.ts","../src/components/layout/FrameworkMShell.tsx"],"sourcesContent":["/**\n * Framework M Frontend Configuration\n *\n * Configuration is loaded from window.__FRAMEWORK_CONFIG__ if available,\n * otherwise uses same-origin defaults.\n */\n\n// Type definition for global config\ndeclare global {\n interface Window {\n __FRAMEWORK_CONFIG__?: {\n apiBaseUrl?: string;\n metaBaseUrl?: string;\n wsBaseUrl?: string;\n /** Auth configuration */\n auth?: {\n authStrategy?: \"cookie\" | \"oidc\";\n loginUrl?: string;\n oidcConfig?: {\n authority: string;\n clientId: string;\n redirectUri: string;\n };\n oauth?: {\n providers?: string[] | Record<string, unknown>;\n };\n };\n };\n }\n}\n\n/**\n * API endpoints - uses same-origin by default, configurable via window config\n */\nexport const API_URL =\n (typeof globalThis !== \"undefined\" &&\n (globalThis as any).__FRAMEWORK_CONFIG__?.apiBaseUrl) ||\n \"/api/v1\";\n\nexport const META_URL =\n (typeof globalThis !== \"undefined\" &&\n (globalThis as any).__FRAMEWORK_CONFIG__?.metaBaseUrl) ||\n \"/api/meta\";\n\nexport const WS_URL =\n (typeof globalThis !== \"undefined\" &&\n (globalThis as any).__FRAMEWORK_CONFIG__?.wsBaseUrl) ||\n \"/api/v1/stream\";\n","/**\n * Framework M Data Provider for Refine\n *\n * Custom DataProvider implementation that connects to Framework M REST API.\n * Handles CRUD operations, pagination, sorting, and filtering.\n */\n\nimport type {\n BaseRecord,\n CreateParams,\n CreateResponse,\n CustomParams,\n CustomResponse,\n DataProvider,\n DeleteOneParams,\n DeleteOneResponse,\n GetListParams,\n GetListResponse,\n GetOneParams,\n GetOneResponse,\n UpdateParams,\n UpdateResponse,\n} from \"@refinedev/core\";\nimport { API_URL } from \"./constants\";\nimport type { ListResponse } from \"./types\";\n\ninterface ErrorPayload {\n detail?: string;\n message?: string;\n error?: string;\n errors?: unknown;\n}\n\nclass FrameworkApiError extends Error {\n status: number;\n code?: string;\n details?: unknown;\n\n constructor(\n message: string,\n status: number,\n code?: string,\n details?: unknown,\n ) {\n super(message);\n this.name = \"FrameworkApiError\";\n this.status = status;\n this.code = code;\n this.details = details;\n }\n}\n\nfunction buildActionPermissionMessage(\n status: number,\n action: string | undefined,\n resource: string | undefined,\n backendMessage: string | undefined,\n): string {\n const normalizedResource = resource\n ? resource.replace(/_/g, \" \")\n : \"resource\";\n\n if (status === 401) {\n return backendMessage || \"Authentication required. Please log in.\";\n }\n\n if (status === 403) {\n const actionText = action ?? \"perform this action on\";\n const base = `Insufficient permission to ${actionText} ${normalizedResource}.`;\n if (\n backendMessage &&\n !backendMessage.toLowerCase().includes(\"insufficient permission\")\n ) {\n return `${base} ${backendMessage}`;\n }\n return base;\n }\n\n return (\n backendMessage ||\n `Request failed (${status}) while trying to ${action ?? \"access\"} ${normalizedResource}.`\n );\n}\n\n/**\n * Build pagination params\n */\nfunction buildPaginationParams(\n pagination: { current?: number; pageSize?: number } | undefined,\n): URLSearchParams {\n const params = new URLSearchParams();\n if (!pagination) return params;\n\n const current = pagination.current ?? 1;\n const pageSize = pagination.pageSize ?? 20;\n params.set(\"limit\", String(pageSize));\n params.set(\"offset\", String((current - 1) * pageSize));\n return params;\n}\n\n/**\n * Build sorting params\n */\nfunction buildSortingParams(\n sorters: Array<{ field: string; order: string }> | undefined,\n): URLSearchParams {\n const params = new URLSearchParams();\n if (!sorters || sorters.length === 0) return params;\n\n const sorter = sorters[0]; // Framework M supports single sort\n const order = sorter.order === \"desc\" ? \"-\" : \"\";\n params.set(\"order_by\", `${order}${sorter.field}`);\n return params;\n}\n\n/**\n * Convert filter value to string\n */\nfunction filterValueToString(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") return String(value);\n if (typeof value === \"boolean\") return String(value);\n return JSON.stringify(value);\n}\n\n/**\n * Build filter params\n */\nfunction buildFilterParams(\n filters:\n | Array<{ field?: string; operator?: string; value?: unknown }>\n | undefined,\n): URLSearchParams {\n const params = new URLSearchParams();\n if (!filters || filters.length === 0) return params;\n\n for (const filter of filters) {\n if (!(\"field\" in filter) || !filter.field || filter.value === undefined) {\n continue;\n }\n\n const op = filter.operator || \"eq\";\n const valueStr = filterValueToString(filter.value);\n\n if (op === \"eq\") {\n params.set(filter.field, valueStr);\n } else {\n // Framework M uses field[op]=value format\n params.set(`${filter.field}[${op}]`, valueStr);\n }\n }\n return params;\n}\n\n/**\n * Build query string from Refine params\n */\nfunction buildQueryString(params: GetListParams): string {\n const searchParams = new URLSearchParams();\n\n // Pagination\n const paginationParams = buildPaginationParams(\n params.pagination as { current?: number; pageSize?: number } | undefined,\n );\n paginationParams.forEach((value, key) => searchParams.set(key, value));\n\n // Sorting\n const sortingParams = buildSortingParams(params.sorters);\n sortingParams.forEach((value, key) => searchParams.set(key, value));\n\n // Filters\n const filterParams = buildFilterParams(params.filters);\n filterParams.forEach((value, key) => searchParams.set(key, value));\n\n return searchParams.toString();\n}\n\n/**\n * Make a fetch request with credentials (cookies)\n */\nasync function fetchWithCredentials<T>(\n url: string,\n options: RequestInit = {},\n context?: { action?: string; resource?: string },\n): Promise<T> {\n const response = await fetch(url, {\n ...options,\n credentials: \"include\", // Send cookies for auth\n headers: {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n },\n });\n\n if (!response.ok) {\n const payload = (await response\n .json()\n .catch(() => ({ detail: response.statusText }))) as ErrorPayload;\n\n const backendMessage =\n (typeof payload.message === \"string\" && payload.message) ||\n (typeof payload.detail === \"string\" && payload.detail) ||\n response.statusText;\n\n const message = buildActionPermissionMessage(\n response.status,\n context?.action,\n context?.resource,\n backendMessage,\n );\n\n throw new FrameworkApiError(\n message,\n response.status,\n typeof payload.error === \"string\" ? payload.error : undefined,\n payload.errors,\n );\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return {} as T;\n }\n\n return response.json();\n}\n\n/**\n * Framework M Data Provider\n */\nexport const frameworkMDataProvider: DataProvider = {\n /**\n * Get a list of resources with pagination, sorting, and filtering\n */\n getList: async <TData extends BaseRecord = BaseRecord>(\n params: GetListParams,\n ): Promise<GetListResponse<TData>> => {\n const { resource } = params;\n const query = buildQueryString(params);\n const queryString = query ? `?${query}` : \"\";\n const url = `${API_URL}/${resource}${queryString}`;\n\n const response = await fetchWithCredentials<ListResponse<TData>>(\n url,\n {},\n {\n action: \"read\",\n resource,\n },\n );\n\n return {\n data: response.items,\n total: response.total,\n };\n },\n\n /**\n * Get a single resource by ID\n */\n getOne: async <TData extends BaseRecord = BaseRecord>(\n params: GetOneParams,\n ): Promise<GetOneResponse<TData>> => {\n const { resource, id } = params;\n const url = `${API_URL}/${resource}/${id}`;\n\n const data = await fetchWithCredentials<TData>(\n url,\n {},\n {\n action: \"read\",\n resource,\n },\n );\n\n return { data };\n },\n\n /**\n * Create a new resource\n */\n create: async <TData extends BaseRecord = BaseRecord, TVariables = object>(\n params: CreateParams<TVariables>,\n ): Promise<CreateResponse<TData>> => {\n const { resource, variables } = params;\n const url = `${API_URL}/${resource}`;\n\n const data = await fetchWithCredentials<TData>(\n url,\n {\n method: \"POST\",\n body: JSON.stringify(variables),\n },\n {\n action: \"create\",\n resource,\n },\n );\n\n return { data };\n },\n\n /**\n * Update an existing resource\n */\n update: async <TData extends BaseRecord = BaseRecord, TVariables = object>(\n params: UpdateParams<TVariables>,\n ): Promise<UpdateResponse<TData>> => {\n const { resource, id, variables } = params;\n const url = `${API_URL}/${resource}/${id}`;\n\n const data = await fetchWithCredentials<TData>(\n url,\n {\n method: \"PUT\",\n body: JSON.stringify(variables),\n },\n {\n action: \"update\",\n resource,\n },\n );\n\n return { data };\n },\n\n /**\n * Delete a resource\n */\n deleteOne: async <TData extends BaseRecord = BaseRecord, TVariables = object>(\n params: DeleteOneParams<TVariables>,\n ): Promise<DeleteOneResponse<TData>> => {\n const { resource, id } = params;\n const url = `${API_URL}/${resource}/${id}`;\n\n await fetchWithCredentials(\n url,\n {\n method: \"DELETE\",\n },\n {\n action: \"delete\",\n resource,\n },\n );\n\n return { data: { id } as TData };\n },\n\n /**\n * Delete multiple resources by IDs\n */\n deleteMany: async <TData extends BaseRecord = BaseRecord>(params: {\n resource: string;\n ids: (string | number)[];\n }): Promise<{ data: TData[] }> => {\n const { resource, ids } = params;\n\n // Delete each item in parallel\n await Promise.all(\n ids.map(\n id =>\n fetchWithCredentials(\n `${API_URL}/${resource}/${id}`,\n {\n method: \"DELETE\",\n },\n {\n action: \"delete\",\n resource,\n },\n ).catch(() => {}), // Ignore individual delete errors\n ),\n );\n\n return { data: ids.map(id => ({ id }) as TData) };\n },\n\n /**\n * Get the API URL (required by Refine)\n */\n getApiUrl: () => API_URL,\n\n /**\n * Custom method for Framework M specific operations\n * e.g., workflow transitions, RPC calls\n */\n custom: async <\n TData extends BaseRecord = BaseRecord,\n TQuery = unknown,\n TPayload = unknown,\n >(\n params: CustomParams<TQuery, TPayload>,\n ): Promise<CustomResponse<TData>> => {\n const { url, method, payload, headers } = params;\n const fullUrl = url.startsWith(\"http\") ? url : `${API_URL}${url}`;\n\n const data = await fetchWithCredentials<TData>(\n fullUrl,\n {\n method: method || \"GET\",\n body: payload ? JSON.stringify(payload) : undefined,\n headers: headers as HeadersInit,\n },\n {\n action: (method || \"GET\").toLowerCase(),\n resource: \"custom endpoint\",\n },\n );\n\n return { data };\n },\n};\n","/**\n * Framework M Auth Provider for Refine\n *\n * Cookie-based authentication that integrates with Framework M's auth endpoints.\n * Uses HttpOnly cookies for secure token storage.\n */\n\nimport type { AuthProvider } from \"@refinedev/core\";\nimport { API_URL } from \"./constants\";\nimport type { UserIdentity } from \"./types\";\n\n/**\n * Framework M Auth Provider\n *\n * Authentication Strategy:\n * - Login: POST /api/v1/auth/login (sets HttpOnly cookie)\n * - Logout: POST /api/v1/auth/logout (clears cookie)\n * - Check: GET /api/v1/auth/me (validates session)\n */\nexport const authProvider: AuthProvider = {\n /**\n * Login with email and password\n */\n login: async ({ email, password }: { email: string; password: string }) => {\n try {\n const response = await fetch(`${API_URL}/auth/login`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\", // Required for cookies\n body: JSON.stringify({ email, password }),\n });\n\n if (response.ok) {\n return {\n success: true,\n redirectTo: \"/\",\n };\n }\n\n const error = await response.json().catch(() => ({\n detail: \"Invalid credentials\",\n }));\n\n const errorMessage =\n error.message || error.detail || \"Invalid email or password\";\n\n return {\n success: false,\n error: {\n name: \"LoginError\",\n message: errorMessage,\n },\n };\n } catch {\n return {\n success: false,\n error: {\n name: \"LoginError\",\n message: \"Network error. Please try again.\",\n },\n };\n }\n },\n\n /**\n * Logout and clear session\n */\n logout: async () => {\n try {\n await fetch(`${API_URL}/auth/logout`, {\n method: \"POST\",\n credentials: \"include\",\n });\n } catch {\n // Ignore logout errors, redirect anyway\n }\n\n return {\n success: true,\n redirectTo: \"/login\",\n };\n },\n\n /**\n * Check if user is authenticated\n */\n check: async () => {\n try {\n const response = await fetch(`${API_URL}/auth/me`, {\n credentials: \"include\",\n });\n\n if (response.ok) {\n return { authenticated: true };\n }\n\n return { authenticated: false, redirectTo: \"/login\" };\n } catch {\n return { authenticated: false, redirectTo: \"/login\" };\n }\n },\n\n /**\n * Get current user identity\n */\n getIdentity: async (): Promise<UserIdentity | null> => {\n try {\n const response = await fetch(`${API_URL}/auth/me`, {\n credentials: \"include\",\n });\n\n if (response.ok) {\n const user: UserIdentity & { authenticated?: boolean } =\n await response.json();\n if (user.authenticated !== true) {\n return null;\n }\n const identityId = String(user.id ?? \"\").toLowerCase();\n const identityName = String(user.name ?? \"\").toLowerCase();\n const identityEmail = String(user.email ?? \"\").toLowerCase();\n if (\n identityId === \"guest\" ||\n identityName === \"guest user\" ||\n identityEmail === \"guest\"\n ) {\n return null;\n }\n return {\n id: user.id,\n email: user.email,\n name: user.name || user.email,\n avatar: user.avatar,\n roles: user.roles || [],\n };\n }\n\n return null;\n } catch {\n return null;\n }\n },\n\n /**\n * Get user permissions (roles)\n */\n getPermissions: async () => {\n try {\n const response = await fetch(`${API_URL}/auth/me`, {\n credentials: \"include\",\n });\n\n if (response.ok) {\n const user: UserIdentity & { authenticated?: boolean } =\n await response.json();\n if (user.authenticated !== true) {\n return null;\n }\n const identityId = String(user.id ?? \"\").toLowerCase();\n const identityName = String(user.name ?? \"\").toLowerCase();\n const identityEmail = String(user.email ?? \"\").toLowerCase();\n if (\n identityId === \"guest\" ||\n identityName === \"guest user\" ||\n identityEmail === \"guest\"\n ) {\n return null;\n }\n return user.roles || [];\n }\n\n return null;\n } catch {\n return null;\n }\n },\n\n /**\n * Handle authentication errors\n */\n onError: async (error: any) => {\n // If 401 Unauthorized, logout and redirect\n if (error.status === 401) {\n return {\n logout: true,\n redirectTo: \"/login\",\n };\n }\n\n // For other errors, just return the error\n return { error };\n },\n};\n","/**\n * Framework M Live Provider for Refine\n *\n * WebSocket-based real-time updates provider.\n * Per checklist 6.1: Refine Live Provider Implementation.\n *\n * Features:\n * - Subscribe to resource changes via WebSocket\n * - Automatic UI updates on created/updated/deleted events\n * - Channel-based pub/sub\n */\n\nimport type { LiveProvider, LiveEvent } from \"@refinedev/core\";\nimport { WS_URL } from \"./constants\";\n\n/**\n * Active WebSocket connections by channel\n */\nconst connections = new Map<string, WebSocket>();\n\n/**\n * Subscription callbacks by channel\n */\nconst subscriptions = new Map<string, Set<(event: LiveEvent) => void>>();\n\n/**\n * Get or create WebSocket connection for a channel\n */\nfunction getConnection(channel: string): WebSocket {\n let ws = connections.get(channel);\n\n if (ws && ws.readyState === WebSocket.OPEN) {\n return ws;\n }\n\n // Create new connection\n let wsUrl = WS_URL;\n if (!WS_URL.startsWith(\"ws\")) {\n const protocol = globalThis.location.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n wsUrl = `${protocol}//${globalThis.location.host}${WS_URL}`;\n }\n\n ws = new WebSocket(`${wsUrl}?channel=${encodeURIComponent(channel)}`);\n\n ws.onopen = () => {\n console.debug(`[LiveProvider] Connected to channel: ${channel}`);\n };\n\n ws.onmessage = event => {\n try {\n const data = JSON.parse(event.data) as LiveEvent;\n\n // Notify all subscribers for this channel\n const callbacks = subscriptions.get(channel);\n if (callbacks) {\n callbacks.forEach(callback => {\n try {\n callback(data);\n } catch (err) {\n console.error(\"[LiveProvider] Callback error:\", err);\n }\n });\n }\n } catch (err) {\n console.error(\"[LiveProvider] Failed to parse message:\", err);\n }\n };\n\n ws.onerror = error => {\n console.error(\n `[LiveProvider] WebSocket error on channel ${channel}:`,\n error,\n );\n };\n\n ws.onclose = () => {\n console.debug(`[LiveProvider] Disconnected from channel: ${channel}`);\n connections.delete(channel);\n };\n\n connections.set(channel, ws);\n return ws;\n}\n\n/**\n * Close connection if no more subscribers\n */\nfunction maybeCloseConnection(channel: string): void {\n const callbacks = subscriptions.get(channel);\n if (!callbacks || callbacks.size === 0) {\n const ws = connections.get(channel);\n if (ws) {\n ws.close();\n connections.delete(channel);\n }\n subscriptions.delete(channel);\n }\n}\n\n/**\n * Framework M Live Provider\n *\n * Implements Refine's LiveProvider interface for real-time updates.\n *\n * @example\n * ```tsx\n * <Refine\n * liveProvider={liveProvider}\n * options={{ liveMode: \"auto\" }}\n * />\n * ```\n */\nexport const liveProvider: LiveProvider = {\n /**\n * Subscribe to resource changes\n */\n subscribe: ({\n channel,\n types,\n callback,\n params,\n }: {\n channel?: string;\n types?: string[];\n callback: (event: LiveEvent) => void;\n params?: { resource?: string };\n }) => {\n // Use resource as channel if not specified\n const channelName = channel ?? params?.resource ?? \"default\";\n\n // Ensure connection exists\n getConnection(channelName);\n\n // Create filtered callback\n const filteredCallback = (event: LiveEvent) => {\n // Filter by types if specified\n if (types && types.length > 0 && !types.includes(event.type)) {\n return;\n }\n\n // Filter by resource if specified\n if (\n params?.resource &&\n event.channel !== params.resource &&\n event.channel !== channelName\n ) {\n return;\n }\n\n callback(event);\n };\n\n // Add to subscriptions\n if (!subscriptions.has(channelName)) {\n subscriptions.set(channelName, new Set());\n }\n subscriptions.get(channelName)!.add(filteredCallback);\n\n // Return unsubscribe function\n return () => {\n const callbacks = subscriptions.get(channelName);\n if (callbacks) {\n callbacks.delete(filteredCallback);\n maybeCloseConnection(channelName);\n }\n };\n },\n\n /**\n * Unsubscribe from resource changes\n */\n unsubscribe: (unsubscribeFn: (() => void) | undefined) => {\n // Call the unsubscribe function returned by subscribe\n if (typeof unsubscribeFn === \"function\") {\n unsubscribeFn();\n }\n },\n\n /**\n * Publish an event (optional, usually server-driven)\n */\n publish: async (event: {\n channel: string;\n type: string;\n payload: unknown;\n }) => {\n const { channel, type, payload } = event;\n\n try {\n // Use REST endpoint to publish (server will broadcast via WebSocket)\n const apiUrl = WS_URL.replace(/^ws/, \"http\").replace(\n \"/stream\",\n \"/live/publish\",\n );\n\n await fetch(apiUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n credentials: \"include\",\n body: JSON.stringify({ channel, type, payload }),\n });\n } catch (err) {\n console.error(\"[LiveProvider] Failed to publish event:\", err);\n }\n },\n};\n\n/**\n * Close all WebSocket connections\n * Call this on app unmount or logout\n */\nexport function closeAllConnections(): void {\n connections.forEach(ws => {\n ws.close();\n });\n connections.clear();\n subscriptions.clear();\n}\n","/* eslint-disable react-refresh/only-export-components */\n/**\n * Custom RJSF Templates for Framework M\n *\n * Basic templates that can work without shadcn/ui being fully setup.\n * These provide a clean, functional form with native HTML elements.\n * Can be replaced with shadcn/ui components later.\n */\n\nimport type {\n FieldTemplateProps,\n ObjectFieldTemplateProps,\n ArrayFieldTemplateProps,\n BaseInputTemplateProps,\n WidgetProps,\n} from \"@rjsf/utils\";\nimport { isValidElement, useMemo, useState, type ReactNode } from \"react\";\n\ninterface ArrayTemplateItem {\n key: string;\n index: number;\n content: ReactNode;\n canMoveUp: boolean;\n canMoveDown: boolean;\n canRemove: boolean;\n onMove: (targetIndex: number) => void;\n onRemove: () => void;\n}\n\nfunction normalizeArrayItems(\n props: ArrayFieldTemplateProps,\n): ArrayTemplateItem[] {\n return props.items.map((rawItem, fallbackIndex) => {\n const item = rawItem as unknown as {\n key?: string;\n index?: number;\n children?: ReactNode;\n hasMoveUp?: boolean;\n hasMoveDown?: boolean;\n hasRemove?: boolean;\n onReorderClick?: (\n index: number,\n newIndex: number,\n ) => ((event?: { preventDefault?: () => void }) => void) | undefined;\n onDropIndexClick?: (\n index: number,\n ) => ((event?: { preventDefault?: () => void }) => void) | undefined;\n };\n\n const index = item.index ?? fallbackIndex;\n const content =\n item.children ?? (isValidElement(rawItem) ? rawItem : String(rawItem));\n\n return {\n key: item.key ?? String(index),\n index,\n content,\n canMoveUp: Boolean(item.hasMoveUp),\n canMoveDown: Boolean(item.hasMoveDown),\n canRemove: Boolean(item.hasRemove),\n onMove: targetIndex => {\n const handler = item.onReorderClick?.(index, targetIndex);\n if (handler) handler({ preventDefault: () => undefined });\n },\n onRemove: () => {\n const handler = item.onDropIndexClick?.(index);\n if (handler) handler({ preventDefault: () => undefined });\n },\n };\n });\n}\n\n/**\n * Field Template - wraps each field with label and error\n */\nexport function FieldTemplate(props: FieldTemplateProps) {\n const {\n id,\n label,\n required,\n description,\n errors,\n children,\n hidden,\n displayLabel,\n uiSchema,\n formData,\n } = props;\n\n const floatingLabel = Boolean(\n (uiSchema?.[\"ui:options\"] as { floatingLabel?: boolean } | undefined)\n ?.floatingLabel,\n );\n\n const hasValue =\n formData !== null && formData !== undefined && String(formData) !== \"\";\n\n if (hidden) return null;\n\n if (displayLabel && label && floatingLabel) {\n return (\n <div\n className={`form-field form-field-floating${hasValue ? \" is-active\" : \"\"}`}\n style={{ marginBottom: \"1rem\" }}\n >\n {children}\n <label htmlFor={id} className=\"form-floating-label\">\n {label}\n {required && <span style={{ color: \"red\" }}> *</span>}\n </label>\n {description && (\n <div\n style={{\n fontSize: \"0.875rem\",\n color: \"#666\",\n marginTop: \"0.25rem\",\n }}\n >\n {description}\n </div>\n )}\n {errors && (\n <div\n style={{ color: \"red\", fontSize: \"0.875rem\", marginTop: \"0.25rem\" }}\n >\n {errors}\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"form-field\" style={{ marginBottom: \"1rem\" }}>\n {displayLabel && label && (\n <label\n htmlFor={id}\n style={{\n display: \"block\",\n marginBottom: \"0.25rem\",\n fontWeight: 500,\n }}\n >\n {label}\n {required && <span style={{ color: \"red\" }}> *</span>}\n </label>\n )}\n {children}\n {description && (\n <div\n style={{ fontSize: \"0.875rem\", color: \"#666\", marginTop: \"0.25rem\" }}\n >\n {description}\n </div>\n )}\n {errors && (\n <div\n style={{ color: \"red\", fontSize: \"0.875rem\", marginTop: \"0.25rem\" }}\n >\n {errors}\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Object Field Template - renders object properties\n */\nexport function ObjectFieldTemplate(props: ObjectFieldTemplateProps) {\n const { title, description, properties } = props;\n\n return (\n <div className=\"form-object\">\n {title && <h3 style={{ marginBottom: \"1rem\" }}>{title}</h3>}\n {description && (\n <div style={{ marginBottom: \"1rem\", color: \"#666\" }}>{description}</div>\n )}\n <div className=\"form-fields\">{properties.map(prop => prop.content)}</div>\n </div>\n );\n}\n\n/**\n * Array Field Template - renders array items with add/remove\n * Note: RJSF v6 items are ReactElements, not objects with properties\n */\nexport function ArrayFieldTemplate(props: ArrayFieldTemplateProps) {\n const { title, canAdd, onAddClick } = props;\n const extendedProps = props as ArrayFieldTemplateProps & {\n formContext?: {\n replaceArrayField?: (fieldName: string, value: unknown[]) => void;\n };\n name?: string;\n idSchema?: { $id?: string };\n };\n const [detailIndex, setDetailIndex] = useState<number | null>(null);\n const [dragIndex, setDragIndex] = useState<number | null>(null);\n const [pasteText, setPasteText] = useState(\"\");\n const [pasteError, setPasteError] = useState<string | null>(null);\n\n const items = useMemo(() => normalizeArrayItems(props), [props]);\n\n const rawFormData = (props as { formData?: unknown }).formData;\n const rows = Array.isArray(rawFormData) ? rawFormData : [];\n const replaceArray = extendedProps.formContext?.replaceArrayField ?? null;\n const arrayFieldName =\n extendedProps.name ?? extendedProps.idSchema?.$id ?? \"items\";\n\n const applyPaste = () => {\n if (!replaceArray) {\n setPasteError(\n \"Paste requires controlled form data. This form does not expose an array updater.\",\n );\n return;\n }\n\n try {\n const parsed = JSON.parse(pasteText) as unknown;\n if (!Array.isArray(parsed)) {\n setPasteError(\"Pasted value must be a JSON array.\");\n return;\n }\n replaceArray(arrayFieldName, parsed);\n setPasteError(null);\n setPasteText(\"\");\n } catch {\n setPasteError(\n \"Invalid JSON. Paste a JSON array to replace the table rows.\",\n );\n }\n };\n\n return (\n <div className=\"form-array\" style={{ marginBottom: \"1rem\" }}>\n {title && <h4 style={{ marginBottom: \"0.5rem\" }}>{title}</h4>}\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"0.5rem\",\n marginBottom: \"0.75rem\",\n }}\n >\n <button\n type=\"button\"\n onClick={() => {\n void globalThis.navigator.clipboard?.writeText(\n JSON.stringify(rows, null, 2),\n );\n }}\n style={{\n padding: \"0.35rem 0.65rem\",\n borderRadius: \"4px\",\n border: \"1px solid #d0d7de\",\n background: \"#fff\",\n }}\n >\n Copy Rows JSON\n </button>\n <button\n type=\"button\"\n onClick={() => setPasteText(value => (value ? \"\" : \"[]\"))}\n style={{\n padding: \"0.35rem 0.65rem\",\n borderRadius: \"4px\",\n border: \"1px solid #d0d7de\",\n background: \"#fff\",\n }}\n >\n {pasteText ? \"Hide Paste\" : \"Paste Rows JSON\"}\n </button>\n </div>\n\n {pasteText && (\n <div style={{ marginBottom: \"0.75rem\" }}>\n <textarea\n value={pasteText}\n onChange={event => setPasteText(event.target.value)}\n rows={5}\n placeholder='Paste JSON array here, e.g. [{\"item_code\":\"X\"}]'\n style={{ width: \"100%\", marginBottom: \"0.5rem\" }}\n />\n <div style={{ display: \"flex\", gap: \"0.5rem\" }}>\n <button\n type=\"button\"\n onClick={applyPaste}\n style={{\n padding: \"0.35rem 0.65rem\",\n borderRadius: \"4px\",\n border: \"none\",\n background: \"#2563eb\",\n color: \"#fff\",\n }}\n >\n Apply Paste\n </button>\n {pasteError && (\n <span style={{ color: \"#dc2626\", fontSize: \"0.85rem\" }}>\n {pasteError}\n </span>\n )}\n </div>\n </div>\n )}\n\n <div className=\"form-array-items\">\n {items.map((item, index) => (\n <div\n key={item.key}\n style={{\n marginBottom: \"0.5rem\",\n padding: \"0.5rem\",\n border: \"1px solid #ddd\",\n borderRadius: \"4px\",\n }}\n >\n {dragIndex !== null && dragIndex !== index && (\n <button\n type=\"button\"\n onDragOver={event => event.preventDefault()}\n onDrop={() => {\n items[dragIndex]?.onMove(index);\n setDragIndex(null);\n }}\n style={{\n width: \"100%\",\n marginBottom: \"0.5rem\",\n border: \"1px dashed #94a3b8\",\n background: \"#f8fafc\",\n color: \"#334155\",\n borderRadius: \"4px\",\n padding: \"0.35rem\",\n }}\n >\n Drop row here\n </button>\n )}\n\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n marginBottom: \"0.5rem\",\n }}\n >\n <strong style={{ fontSize: \"0.85rem\" }}>Row {index + 1}</strong>\n <div style={{ display: \"flex\", gap: \"0.4rem\" }}>\n <button\n type=\"button\"\n draggable\n aria-label={`Drag row ${index + 1} to reorder`}\n onDragStart={() => setDragIndex(index)}\n >\n Drag\n </button>\n <button\n type=\"button\"\n disabled={!item.canMoveUp}\n onClick={() => item.onMove(index - 1)}\n >\n ↑\n </button>\n <button\n type=\"button\"\n disabled={!item.canMoveDown}\n onClick={() => item.onMove(index + 1)}\n >\n ↓\n </button>\n <button type=\"button\" onClick={() => setDetailIndex(index)}>\n Detail\n </button>\n <button\n type=\"button\"\n disabled={!item.canRemove}\n onClick={item.onRemove}\n >\n Remove\n </button>\n </div>\n </div>\n {detailIndex === index ? (\n <div style={{ color: \"#64748b\", fontSize: \"0.85rem\" }}>\n Row is open in detail mode.\n </div>\n ) : (\n item.content\n )}\n </div>\n ))}\n </div>\n {canAdd && (\n <button\n type=\"button\"\n onClick={onAddClick}\n style={{\n padding: \"0.5rem 1rem\",\n background: \"#4444ff\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n }}\n >\n Add Item\n </button>\n )}\n\n {detailIndex !== null && items[detailIndex] && (\n <div\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 1200,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"1rem\",\n }}\n >\n <button\n type=\"button\"\n aria-label=\"Close detail panel\"\n style={{\n position: \"absolute\",\n inset: 0,\n border: \"none\",\n background: \"rgba(15, 23, 42, 0.45)\",\n padding: 0,\n }}\n onClick={() => setDetailIndex(null)}\n />\n\n <dialog\n open\n style={{\n width: \"min(960px, 100%)\",\n maxHeight: \"90vh\",\n overflow: \"auto\",\n background: \"#fff\",\n borderRadius: \"8px\",\n padding: \"1rem\",\n border: \"1px solid #d0d7de\",\n position: \"relative\",\n margin: 0,\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: \"0.75rem\",\n }}\n >\n <h4 style={{ margin: 0 }}>Row Detail - {detailIndex + 1}</h4>\n <button type=\"button\" onClick={() => setDetailIndex(null)}>\n Close\n </button>\n </div>\n {items[detailIndex].content}\n </dialog>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Base Input Template - standard input wrapper\n */\nexport function BaseInputTemplate(props: BaseInputTemplateProps) {\n const {\n id,\n type,\n value,\n disabled,\n readonly,\n required,\n onChange,\n onBlur,\n onFocus,\n placeholder,\n } = props;\n\n return (\n <input\n id={id}\n type={type || \"text\"}\n value={value ?? \"\"}\n disabled={disabled}\n readOnly={readonly}\n required={required}\n placeholder={placeholder}\n onChange={e => onChange(e.target.value)}\n onBlur={e => onBlur(id, e.target.value)}\n onFocus={e => onFocus(id, e.target.value)}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n fontSize: \"1rem\",\n }}\n />\n );\n}\n\n/**\n * Text Widget - for string fields\n */\nexport function TextWidget(props: WidgetProps) {\n const { id, value, disabled, readonly, onChange, placeholder } = props;\n\n return (\n <input\n id={id}\n type=\"text\"\n value={value ?? \"\"}\n disabled={disabled}\n readOnly={readonly}\n placeholder={placeholder}\n onChange={e => onChange(e.target.value)}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n }}\n />\n );\n}\n\n/**\n * Checkbox Widget - for boolean fields\n */\nexport function CheckboxWidget(props: WidgetProps) {\n const { id, value, disabled, readonly, onChange, label } = props;\n\n return (\n <label style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <input\n id={id}\n type=\"checkbox\"\n checked={value ?? false}\n disabled={disabled || readonly}\n onChange={e => onChange(e.target.checked)}\n style={{ width: \"1rem\", height: \"1rem\" }}\n />\n {label}\n </label>\n );\n}\n\n/**\n * Select Widget - for enum fields\n */\nexport function SelectWidget(props: WidgetProps) {\n const { id, value, disabled, readonly, onChange, options } = props;\n const enumOptions = options.enumOptions || [];\n\n return (\n <select\n id={id}\n value={value ?? \"\"}\n disabled={disabled || readonly}\n onChange={e => onChange(e.target.value)}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n }}\n >\n <option value=\"\">Select...</option>\n {enumOptions.map(opt => (\n <option key={String(opt.value)} value={String(opt.value)}>\n {opt.label}\n </option>\n ))}\n </select>\n );\n}\n\n/**\n * Date Widget - for date fields\n */\nexport function DateWidget(props: WidgetProps) {\n const { id, value, disabled, readonly, onChange } = props;\n\n return (\n <input\n id={id}\n type=\"date\"\n value={value ?? \"\"}\n disabled={disabled}\n readOnly={readonly}\n onChange={e => onChange(e.target.value)}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n }}\n />\n );\n}\n\n/**\n * Textarea Widget - for long text fields\n */\nexport function TextareaWidget(props: WidgetProps) {\n const { id, value, disabled, readonly, onChange, placeholder } = props;\n\n return (\n <textarea\n id={id}\n value={value ?? \"\"}\n disabled={disabled}\n readOnly={readonly}\n placeholder={placeholder}\n onChange={e => onChange(e.target.value)}\n rows={4}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n resize: \"vertical\",\n }}\n />\n );\n}\n\n/**\n * Custom widgets registry\n */\nexport const customWidgets = {\n TextWidget,\n CheckboxWidget,\n SelectWidget,\n DateWidget,\n TextareaWidget,\n};\n\n/**\n * Custom templates registry\n */\nexport const customTemplates = {\n FieldTemplate,\n ObjectFieldTemplate,\n ArrayFieldTemplate,\n BaseInputTemplate,\n};\n","/**\n * AutoForm Component\n *\n * Schema-driven form using RJSF that accepts JSON Schema from\n * /api/meta/{doctype} and renders form fields dynamically.\n *\n * Per checklist section 2.2:\n * - Accepts JSON Schema from GET /api/meta/{doctype}\n * - Generates form fields dynamically\n * - Maps schema types to components\n * - Exported as standalone component (\"Ejection Strategy\")\n */\n\nimport Form from \"@rjsf/core\";\nimport type { FormProps, IChangeEvent } from \"@rjsf/core\";\nimport type { RJSFSchema, UiSchema, ValidatorType } from \"@rjsf/utils\";\nimport validator from \"@rjsf/validator-ajv8\";\nimport { customTemplates, customWidgets } from \"./templates\";\n\ntype JsonObject = Record<string, unknown>;\n\nfunction replaceArrayFieldInData<T>(\n source: T | undefined,\n fieldName: string,\n value: unknown[],\n): T {\n const root = (\n source && typeof source === \"object\"\n ? { ...(source as Record<string, unknown>) }\n : {}\n ) as Record<string, unknown>;\n root[fieldName] = value;\n return root as T;\n}\n\nfunction normalizeNullablePropertySchema(property: JsonObject): JsonObject {\n const normalized: JsonObject = { ...property };\n\n const typeValue = normalized.type;\n if (Array.isArray(typeValue)) {\n const nonNullTypes = typeValue.filter(\n (t): t is string => typeof t === \"string\" && t !== \"null\",\n );\n if (nonNullTypes.length === 1) {\n normalized.type = nonNullTypes[0];\n }\n }\n\n const anyOfValue = normalized.anyOf;\n if (Array.isArray(anyOfValue)) {\n const nonNullSchemas = anyOfValue.filter(item => {\n if (!item || typeof item !== \"object\") return false;\n const schema = item as JsonObject;\n return schema.type !== \"null\";\n });\n\n if (nonNullSchemas.length === 1) {\n const nonNullSchema = nonNullSchemas[0] as JsonObject;\n const merged: JsonObject = {\n ...nonNullSchema,\n ...normalized,\n type: nonNullSchema.type ?? normalized.type,\n };\n delete merged.anyOf;\n return merged;\n }\n }\n\n return normalized;\n}\n\nfunction normalizeNullableObjectSchema(schema: RJSFSchema): RJSFSchema {\n if (!schema || typeof schema !== \"object\") return schema;\n\n const schemaObj = schema as JsonObject;\n const properties = schemaObj.properties;\n if (!properties || typeof properties !== \"object\") {\n return schema;\n }\n\n const normalizedProperties = Object.fromEntries(\n Object.entries(properties as Record<string, unknown>).map(\n ([key, value]) => {\n if (!value || typeof value !== \"object\") return [key, value];\n return [key, normalizeNullablePropertySchema(value as JsonObject)];\n },\n ),\n ) as NonNullable<RJSFSchema[\"properties\"]>;\n\n return {\n ...schema,\n properties: normalizedProperties,\n };\n}\n\n/**\n * AutoForm props\n */\nexport interface AutoFormProps<T = unknown> {\n /** JSON Schema for the form */\n schema: RJSFSchema;\n /** UI Schema for customizing form appearance */\n uiSchema?: UiSchema;\n /** Current form data */\n formData?: T;\n /** Called when form data changes */\n onChange?: (data: T) => void;\n /** Called when form is submitted */\n onSubmit?: (data: T) => void;\n /** Called on validation error */\n onError?: (errors: unknown[]) => void;\n /** Whether form is read-only */\n readonly?: boolean;\n /** Whether form is disabled */\n disabled?: boolean;\n /** Hide submit button */\n hideSubmitButton?: boolean;\n /** Custom submit button text */\n submitText?: string;\n /** Additional className for the form */\n className?: string;\n /** Children to render (e.g., custom buttons) */\n children?: React.ReactNode;\n}\n\n/**\n * AutoForm Component\n *\n * A schema-driven form that accepts JSON Schema and renders fields automatically.\n * Uses RJSF with custom templates.\n *\n * @example\n * ```tsx\n * import { useDocTypeMeta } from \"../hooks\";\n * import { AutoForm } from \"../components/form\";\n *\n * function TaskForm() {\n * const { schema } = useDocTypeMeta(\"Task\");\n * const [data, setData] = useState({});\n *\n * if (!schema) return <Loading />;\n *\n * return (\n * <AutoForm\n * schema={schema}\n * formData={data}\n * onChange={setData}\n * onSubmit={(data) => saveTask(data)}\n * />\n * );\n * }\n * ```\n */\nexport function AutoForm<T = unknown>({\n schema,\n uiSchema,\n formData,\n onChange,\n onSubmit,\n onError,\n readonly = false,\n disabled = false,\n hideSubmitButton = false,\n submitText = \"Submit\",\n className,\n children,\n}: Readonly<AutoFormProps<T>>) {\n const normalizedSchema = normalizeNullableObjectSchema(schema);\n\n // Handle form change\n const handleChange = (e: IChangeEvent<T>) => {\n if (onChange && e.formData !== undefined) {\n onChange(e.formData);\n }\n };\n\n // Handle form submit\n const handleSubmit = (e: IChangeEvent<T>) => {\n if (onSubmit && e.formData !== undefined) {\n onSubmit(e.formData);\n }\n };\n\n const formContext = {\n replaceArrayField: (fieldName: string, value: unknown[]) => {\n if (!onChange) return;\n onChange(replaceArrayFieldInData(formData, fieldName, value));\n },\n };\n\n // Build RJSF props\n const formProps: FormProps<T, RJSFSchema> = {\n schema: normalizedSchema,\n uiSchema: {\n ...uiSchema,\n \"ui:submitButtonOptions\": hideSubmitButton\n ? { norender: true }\n : { submitText },\n },\n formData,\n validator: validator as ValidatorType<T, RJSFSchema>,\n templates: customTemplates,\n widgets: customWidgets,\n formContext,\n readonly,\n disabled,\n onChange: handleChange,\n onSubmit: handleSubmit,\n onError,\n };\n\n return (\n <div className={className}>\n <Form {...formProps}>{children}</Form>\n </div>\n );\n}\n\nexport default AutoForm;\n","/**\n * LinkWidget - Async Search Combobox for Link Fields\n *\n * RJSF widget for \"Link\" type fields that fetches options from API.\n * Implements async search with debouncing.\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport type { WidgetProps } from \"@rjsf/utils\";\nimport { API_URL } from \"../../constants\";\n\n/**\n * Debounce helper\n */\nfunction useDebounce<T>(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n\n return debouncedValue;\n}\n\ninterface LinkOption {\n value: string;\n label: string;\n}\n\n/**\n * LinkWidget - Combobox with async search\n *\n * Uses x-options from schema to determine the linked DocType.\n * Fetches options from /api/v1/{doctype}?q={search}\n *\n * @example\n * Schema:\n * ```json\n * {\n * \"type\": \"string\",\n * \"x-fieldtype\": \"Link\",\n * \"x-options\": \"Customer\"\n * }\n * ```\n */\nexport function LinkWidget(props: WidgetProps) {\n const {\n id,\n value,\n disabled,\n readonly,\n onChange,\n options,\n schema,\n placeholder,\n } = props;\n\n // Get linked DocType from schema options\n const linkedDoctype = (schema as Record<string, unknown>)?.[\"x-options\"] as string \n || (options as Record<string, unknown>)?.options as string \n || \"\";\n\n const [inputValue, setInputValue] = useState(value ?? \"\");\n const [searchResults, setSearchResults] = useState<LinkOption[]>([]);\n const [isOpen, setIsOpen] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n\n const debouncedSearch = useDebounce(inputValue, 300);\n\n // Fetch search results\n const fetchOptions = useCallback(async (search: string) => {\n if (!linkedDoctype) return;\n \n setIsLoading(true);\n try {\n const params = new URLSearchParams();\n if (search) params.set(\"q\", search);\n params.set(\"limit\", \"20\");\n \n const response = await fetch(\n `${API_URL}/${linkedDoctype}?${params}`,\n { credentials: \"include\" }\n );\n \n if (response.ok) {\n const data = await response.json();\n const items = data.items || data;\n setSearchResults(\n items.map((item: Record<string, unknown>) => ({\n value: item.name || item.id,\n label: item.name || item.title || item.id,\n }))\n );\n }\n } catch (error) {\n console.error(\"Link search error:\", error);\n setSearchResults([]);\n } finally {\n setIsLoading(false);\n }\n }, [linkedDoctype]);\n\n // Fetch on debounced search change\n useEffect(() => {\n if (isOpen) {\n fetchOptions(debouncedSearch);\n }\n }, [debouncedSearch, isOpen, fetchOptions]);\n\n // Handle selection\n const handleSelect = (option: LinkOption) => {\n setInputValue(option.label);\n onChange(option.value);\n setIsOpen(false);\n };\n\n // Handle input change\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setInputValue(newValue);\n setIsOpen(true);\n \n // If cleared, clear the value\n if (!newValue) {\n onChange(undefined);\n }\n };\n\n return (\n <div style={{ position: \"relative\" }}>\n <input\n id={id}\n type=\"text\"\n value={inputValue}\n disabled={disabled}\n readOnly={readonly}\n placeholder={placeholder || `Search ${linkedDoctype}...`}\n onChange={handleInputChange}\n onFocus={() => {\n setIsOpen(true);\n fetchOptions(inputValue);\n }}\n onBlur={() => {\n // Delay close to allow click on option\n setTimeout(() => setIsOpen(false), 200);\n }}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n }}\n />\n \n {/* Dropdown */}\n {isOpen && (\n <div\n style={{\n position: \"absolute\",\n top: \"100%\",\n left: 0,\n right: 0,\n zIndex: 1000,\n maxHeight: \"200px\",\n overflowY: \"auto\",\n background: \"white\",\n border: \"1px solid #ccc\",\n borderTop: \"none\",\n borderRadius: \"0 0 4px 4px\",\n boxShadow: \"0 2px 4px rgba(0,0,0,0.1)\",\n }}\n >\n {isLoading ? (\n <div style={{ padding: \"0.5rem\", color: \"#666\" }}>Loading...</div>\n ) : searchResults.length === 0 ? (\n <div style={{ padding: \"0.5rem\", color: \"#666\" }}>No results</div>\n ) : (\n searchResults.map((option) => (\n <div\n key={option.value}\n onClick={() => handleSelect(option)}\n style={{\n padding: \"0.5rem\",\n cursor: \"pointer\",\n background: option.value === value ? \"#e6f2ff\" : \"white\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"#f5f5f5\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \n option.value === value ? \"#e6f2ff\" : \"white\";\n }}\n >\n {option.label}\n </div>\n ))\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport default LinkWidget;\n","/**\n * AutoTable Component\n *\n * Schema-driven table using TanStack Table with Refine's data fetching.\n * Generates columns from metadata with built-in sorting, filtering, pagination.\n *\n * Per checklist section 2.3:\n * - Columns generated from metadata\n * - Sorting, filtering, pagination built-in\n * - Row selection for bulk actions\n */\n\nimport { useMemo, useState } from \"react\";\nimport { useList } from \"@refinedev/core\";\nimport {\n useReactTable,\n getCoreRowModel,\n getSortedRowModel,\n getPaginationRowModel,\n flexRender,\n type ColumnDef,\n type SortingState,\n type RowSelectionState,\n type PaginationState,\n} from \"@tanstack/react-table\";\nimport type { DocTypeSchema, JSONSchemaProperty } from \"../../hooks/types\";\n\n/**\n * AutoTable props\n */\nexport interface AutoTableProps<TData extends object = object> {\n /** Resource name (DocType) */\n resource: string;\n /** Schema for generating columns */\n schema?: DocTypeSchema;\n /** Custom column definitions (overrides schema-generated) */\n columns?: ColumnDef<TData, unknown>[];\n /** Enable row selection */\n enableSelection?: boolean;\n /** Called when selection changes */\n onSelectionChange?: (selectedRows: TData[]) => void;\n /** Called when row is clicked */\n onRowClick?: (row: TData) => void;\n /** Additional className */\n className?: string;\n}\n\n/**\n * Generate column definitions from JSON Schema\n */\nfunction generateColumnsFromSchema<TData extends object>(\n schema: DocTypeSchema,\n): ColumnDef<TData, unknown>[] {\n const columns: ColumnDef<TData, unknown>[] = [];\n\n for (const [key, prop] of Object.entries(schema.properties)) {\n const property: JSONSchemaProperty = prop;\n\n // Skip hidden fields\n if (property[\"x-hidden\"]) continue;\n\n columns.push({\n id: key,\n accessorKey: key,\n header: property.title || key,\n cell: ({ getValue }) => {\n const value = getValue();\n\n // Format based on type\n if (value === null || value === undefined) return \"-\";\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n if (property.format === \"date\" || property.format === \"date-time\") {\n return new Date(value as string).toLocaleDateString();\n }\n return String(value);\n },\n enableSorting: true,\n });\n }\n\n return columns;\n}\n\n/**\n * AutoTable Component\n *\n * Uses Refine's useList for data fetching and TanStack Table for display.\n *\n * @example\n * ```tsx\n * import { useDocTypeMeta } from \"../hooks\";\n * import { AutoTable } from \"../components/table\";\n *\n * function TaskList() {\n * const { schema } = useDocTypeMeta(\"Task\");\n *\n * return (\n * <AutoTable\n * resource=\"Task\"\n * schema={schema}\n * onRowClick={(row) => navigate(`/task/${row.id}`)}\n * />\n * );\n * }\n * ```\n */\nexport function AutoTable<TData extends object = object>({\n resource,\n schema,\n columns: customColumns,\n enableSelection = false,\n onSelectionChange,\n onRowClick,\n className,\n}: Readonly<AutoTableProps<TData>>) {\n // State for table features\n const [sorting, setSorting] = useState<SortingState>([]);\n const [rowSelection, setRowSelection] = useState<RowSelectionState>({});\n const [pagination, setPagination] = useState<PaginationState>({\n pageIndex: 0,\n pageSize: 20,\n });\n\n // Fetch data using Refine's useList\n const { result, query } = useList<TData>({\n resource,\n pagination: {\n pageSize: pagination.pageSize,\n mode: \"server\",\n },\n sorters:\n sorting.length > 0\n ? [{ field: sorting[0].id, order: sorting[0].desc ? \"desc\" : \"asc\" }]\n : undefined,\n });\n\n const tableData = result?.data ?? [];\n const totalCount = result?.total ?? 0;\n const isLoading = query?.isLoading ?? false;\n const queryError = query?.error as Error | null | undefined;\n\n const focusCell = (\n rowIndex: number,\n colIndex: number,\n tableElement: HTMLTableElement,\n ) => {\n const selector = `[data-cell-key=\"${rowIndex}:${colIndex}\"]`;\n const target = tableElement.querySelector<HTMLElement>(selector);\n target?.focus();\n };\n\n const handleCellKeyDown = (\n event: React.KeyboardEvent<HTMLTableCellElement>,\n rowIndex: number,\n colIndex: number,\n ) => {\n const tableElement = event.currentTarget.closest(\"table\");\n if (!tableElement) return;\n\n if (event.key === \"ArrowRight\") {\n event.preventDefault();\n focusCell(rowIndex, colIndex + 1, tableElement);\n }\n\n if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n focusCell(rowIndex, colIndex - 1, tableElement);\n }\n\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n focusCell(rowIndex + 1, colIndex, tableElement);\n }\n\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n focusCell(rowIndex - 1, colIndex, tableElement);\n }\n };\n\n // Generate columns from schema or use custom\n const columns = useMemo(() => {\n if (customColumns) return customColumns;\n if (schema) return generateColumnsFromSchema<TData>(schema);\n return [];\n }, [customColumns, schema]);\n\n // Add selection column if enabled\n const columnsWithSelection = useMemo(() => {\n if (!enableSelection) return columns;\n\n const selectionColumn: ColumnDef<TData, unknown> = {\n id: \"select\",\n header: ({ table }) => (\n <input\n type=\"checkbox\"\n checked={table.getIsAllRowsSelected()}\n onChange={table.getToggleAllRowsSelectedHandler()}\n />\n ),\n cell: ({ row }) => (\n <input\n type=\"checkbox\"\n checked={row.getIsSelected()}\n onChange={row.getToggleSelectedHandler()}\n onClick={e => e.stopPropagation()}\n />\n ),\n enableSorting: false,\n };\n\n return [selectionColumn, ...columns];\n }, [columns, enableSelection]);\n\n // Create TanStack Table instance\n const table = useReactTable({\n data: tableData,\n columns: columnsWithSelection,\n pageCount: Math.ceil(totalCount / pagination.pageSize),\n state: {\n sorting,\n rowSelection,\n pagination,\n },\n // Use 'id' field (UUID) as row identifier, fallback to index\n getRowId: row => {\n const r = row as Record<string, unknown>;\n return String(r.id ?? r.name ?? \"\");\n },\n onSortingChange: setSorting,\n onRowSelectionChange: updater => {\n const newSelection =\n typeof updater === \"function\" ? updater(rowSelection) : updater;\n setRowSelection(newSelection);\n\n // Notify parent of selection change\n // Compute selected rows directly from newSelection and tableData\n // (table.getSelectedRowModel() uses stale state before setRowSelection takes effect)\n if (onSelectionChange) {\n const selectedIds = Object.keys(newSelection).filter(\n key => newSelection[key],\n );\n const selectedRows = tableData.filter(row => {\n const r = row as Record<string, unknown>;\n const rowId = String(r.id ?? r.name ?? \"\");\n return selectedIds.includes(rowId);\n });\n onSelectionChange(selectedRows);\n }\n },\n onPaginationChange: setPagination,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n manualPagination: true,\n manualSorting: true,\n enableRowSelection: enableSelection,\n });\n\n if (isLoading) {\n return <div style={{ padding: \"1rem\" }}>Loading...</div>;\n }\n\n if (queryError) {\n return (\n <div\n style={{\n padding: \"0.75rem 1rem\",\n backgroundColor: \"var(--color-error-bg)\",\n border: \"1px solid var(--color-error-border)\",\n borderRadius: \"4px\",\n color: \"var(--color-error)\",\n }}\n role=\"alert\"\n >\n {queryError.message || `Failed to load ${resource}.`}\n </div>\n );\n }\n\n return (\n <div className={className}>\n {/* Table */}\n <table style={{ width: \"100%\", borderCollapse: \"collapse\" }}>\n <thead>\n {table.getHeaderGroups().map(headerGroup => (\n <tr key={headerGroup.id}>\n {headerGroup.headers.map(header => (\n <th\n key={header.id}\n onClick={\n header.column.getCanSort()\n ? header.column.getToggleSortingHandler()\n : undefined\n }\n style={{\n padding: \"0.75rem\",\n textAlign: \"left\",\n borderBottom: \"2px solid #ddd\",\n cursor: header.column.getCanSort() ? \"pointer\" : \"default\",\n userSelect: \"none\",\n }}\n >\n {flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n {header.column.getIsSorted() && (\n <span style={{ marginLeft: \"0.25rem\" }}>\n {header.column.getIsSorted() === \"asc\" ? \"↑\" : \"↓\"}\n </span>\n )}\n </th>\n ))}\n </tr>\n ))}\n </thead>\n <tbody>\n {table.getRowModel().rows.map((row, rowIndex) => (\n <tr\n key={row.id}\n onClick={() => onRowClick?.(row.original)}\n style={{\n cursor: onRowClick ? \"pointer\" : \"default\",\n borderBottom: \"1px solid #eee\",\n }}\n >\n {row.getVisibleCells().map((cell, colIndex) => (\n <td\n key={cell.id}\n style={{ padding: \"0.75rem\" }}\n tabIndex={0}\n data-cell-key={`${rowIndex}:${colIndex}`}\n onKeyDown={event =>\n handleCellKeyDown(event, rowIndex, colIndex)\n }\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n\n {/* Pagination */}\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginTop: \"1rem\",\n padding: \"0.5rem 0\",\n }}\n >\n <div>\n Page {pagination.pageIndex + 1} of {table.getPageCount() || 1}\n {\" | \"}Total: {totalCount}\n </div>\n <div style={{ display: \"flex\", gap: \"0.5rem\" }}>\n <button\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n style={{\n padding: \"0.5rem 1rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n cursor: table.getCanPreviousPage() ? \"pointer\" : \"not-allowed\",\n opacity: table.getCanPreviousPage() ? 1 : 0.5,\n }}\n >\n Previous\n </button>\n <button\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n style={{\n padding: \"0.5rem 1rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n cursor: table.getCanNextPage() ? \"pointer\" : \"not-allowed\",\n opacity: table.getCanNextPage() ? 1 : 0.5,\n }}\n >\n Next\n </button>\n </div>\n </div>\n </div>\n );\n}\n\nexport default AutoTable;\n","/**\n * Editable Cell Component\n *\n * Inline editable cell for list views.\n * Per checklist 5.2: Inline Editing.\n *\n * Features:\n * - Click cell to edit\n * - Save on blur\n * - Show validation errors\n */\n\nimport { useState, useRef, useEffect, useCallback } from \"react\";\nimport { useUpdate } from \"@refinedev/core\";\n\n/**\n * Editable cell props\n */\nexport interface EditableCellProps {\n /** Resource/DocType name */\n resource: string;\n /** Row ID */\n id: string;\n /** Field name */\n field: string;\n /** Current value */\n value: unknown;\n /** Field type for input */\n type?: \"text\" | \"number\" | \"date\" | \"select\" | \"checkbox\";\n /** Options for select type */\n options?: Array<{ value: string; label: string }>;\n /** Whether editing is disabled */\n disabled?: boolean;\n /** Callback after successful save */\n onSaveSuccess?: () => void;\n /** Custom renderer for display mode */\n renderValue?: (value: unknown) => React.ReactNode;\n}\n\n/**\n * EditableCell Component\n *\n * @example\n * ```tsx\n * <EditableCell\n * resource=\"Customer\"\n * id=\"CUST-001\"\n * field=\"customer_name\"\n * value=\"John Smith\"\n * type=\"text\"\n * />\n * ```\n */\nexport function EditableCell({\n resource,\n id,\n field,\n value,\n type = \"text\",\n options,\n disabled = false,\n onSaveSuccess,\n renderValue,\n}: EditableCellProps) {\n const [isEditing, setIsEditing] = useState(false);\n const [editValue, setEditValue] = useState(value);\n const [error, setError] = useState<string | null>(null);\n\n const inputRef = useRef<HTMLInputElement | HTMLSelectElement>(null);\n const updateMutation = useUpdate();\n\n // Focus input when entering edit mode\n useEffect(() => {\n if (isEditing && inputRef.current) {\n inputRef.current.focus();\n if (inputRef.current instanceof HTMLInputElement) {\n inputRef.current.select();\n }\n }\n }, [isEditing]);\n\n // Reset edit value when prop value changes\n useEffect(() => {\n setEditValue(value);\n }, [value]);\n\n // Enter edit mode\n const handleClick = useCallback(() => {\n if (disabled) return;\n setIsEditing(true);\n setEditValue(value);\n setError(null);\n }, [disabled, value]);\n\n // Cancel edit\n const handleCancel = useCallback(() => {\n setIsEditing(false);\n setEditValue(value);\n setError(null);\n }, [value]);\n\n // Save on blur\n const handleBlur = useCallback(() => {\n if (editValue === value) {\n // No change, just exit edit mode\n setIsEditing(false);\n return;\n }\n\n // Save the value\n updateMutation.mutate(\n {\n resource,\n id,\n values: { [field]: editValue },\n },\n {\n onSuccess: () => {\n setIsEditing(false);\n setError(null);\n onSaveSuccess?.();\n },\n onError: err => {\n setError(err.message || \"Save failed\");\n },\n },\n );\n }, [resource, id, field, editValue, value, updateMutation, onSaveSuccess]);\n\n // Handle key press\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleBlur();\n } else if (e.key === \"Escape\") {\n handleCancel();\n }\n },\n [handleBlur, handleCancel],\n );\n\n // Handle value change\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement>) => {\n const newValue =\n type === \"checkbox\"\n ? (e.target as HTMLInputElement).checked\n : type === \"number\"\n ? Number(e.target.value)\n : e.target.value;\n setEditValue(newValue);\n setError(null);\n },\n [type],\n );\n\n const isSaving = updateMutation.mutation.isPending;\n\n // Display mode\n if (!isEditing) {\n return (\n <div\n onClick={handleClick}\n style={{\n padding: \"0.25rem 0.5rem\",\n cursor: disabled ? \"default\" : \"pointer\",\n borderRadius: \"4px\",\n minHeight: \"1.5rem\",\n transition: \"background-color 0.15s\",\n }}\n onMouseEnter={e => {\n if (!disabled) {\n e.currentTarget.style.backgroundColor = \"#f5f5f5\";\n }\n }}\n onMouseLeave={e => {\n e.currentTarget.style.backgroundColor = \"transparent\";\n }}\n title={disabled ? undefined : \"Click to edit\"}\n >\n {renderValue\n ? renderValue(value)\n : type === \"checkbox\"\n ? value\n ? \"✓\"\n : \"✗\"\n : String(value ?? \"\")}\n </div>\n );\n }\n\n // Edit mode\n return (\n <div style={{ position: \"relative\" }}>\n {type === \"select\" ? (\n <select\n ref={inputRef as React.RefObject<HTMLSelectElement>}\n value={String(editValue ?? \"\")}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n disabled={isSaving}\n style={{\n width: \"100%\",\n padding: \"0.25rem 0.5rem\",\n border: error\n ? \"1px solid var(--color-error)\"\n : \"1px solid var(--color-primary)\",\n borderRadius: \"4px\",\n outline: \"none\",\n fontSize: \"inherit\",\n backgroundColor: \"var(--color-bg)\",\n color: \"var(--color-text)\",\n }}\n >\n <option value=\"\">-</option>\n {options?.map(opt => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n ) : type === \"checkbox\" ? (\n <input\n ref={inputRef as React.RefObject<HTMLInputElement>}\n type=\"checkbox\"\n checked={Boolean(editValue)}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n disabled={isSaving}\n style={{ cursor: \"pointer\" }}\n />\n ) : (\n <input\n ref={inputRef as React.RefObject<HTMLInputElement>}\n type={type}\n value={String(editValue ?? \"\")}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n disabled={isSaving}\n style={{\n width: \"100%\",\n padding: \"0.25rem 0.5rem\",\n border: error\n ? \"1px solid var(--color-error)\"\n : \"1px solid var(--color-primary)\",\n borderRadius: \"4px\",\n outline: \"none\",\n fontSize: \"inherit\",\n boxSizing: \"border-box\",\n backgroundColor: \"var(--color-bg)\",\n color: \"var(--color-text)\",\n }}\n />\n )}\n\n {/* Error tooltip */}\n {error && (\n <div\n style={{\n position: \"absolute\",\n top: \"100%\",\n left: 0,\n marginTop: \"0.25rem\",\n padding: \"0.25rem 0.5rem\",\n backgroundColor: \"var(--color-error-bg)\",\n border: \"1px solid var(--color-error-border)\",\n borderRadius: \"4px\",\n color: \"var(--color-error)\",\n fontSize: \"0.75rem\",\n whiteSpace: \"nowrap\",\n zIndex: 10,\n }}\n >\n {error}\n </div>\n )}\n\n {/* Saving indicator */}\n {isSaving && (\n <div\n style={{\n position: \"absolute\",\n right: \"0.25rem\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n fontSize: \"0.75rem\",\n color: \"#1890ff\",\n }}\n >\n ...\n </div>\n )}\n </div>\n );\n}\n\nexport default EditableCell;\n","import { useEffect, useMemo } from \"react\";\n\nexport interface ConfirmDialogProps {\n open: boolean;\n title: string;\n message: string;\n confirmLabel?: string;\n cancelLabel?: string;\n destructive?: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n}\n\nexport function ConfirmDialog({\n open,\n title,\n message,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n destructive = false,\n onConfirm,\n onCancel,\n}: Readonly<ConfirmDialogProps>) {\n const titleId = useMemo(\n () => `confirm-dialog-title-${title.toLowerCase().replaceAll(\" \", \"-\")}`,\n [title],\n );\n\n useEffect(() => {\n if (!open) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onCancel();\n }\n };\n\n globalThis.addEventListener(\"keydown\", handleKeyDown);\n return () => globalThis.removeEventListener(\"keydown\", handleKeyDown);\n }, [open, onCancel]);\n\n if (!open) return null;\n\n return (\n <dialog\n open\n aria-labelledby={titleId}\n onCancel={event => {\n event.preventDefault();\n onCancel();\n }}\n style={{\n border: \"none\",\n padding: 0,\n background: \"transparent\",\n width: \"100%\",\n maxWidth: \"420px\",\n }}\n >\n <div\n style={{\n width: \"100%\",\n borderRadius: \"8px\",\n border: \"1px solid var(--color-border)\",\n backgroundColor: \"var(--color-bg)\",\n color: \"var(--color-text)\",\n boxShadow: \"0 10px 30px rgba(0, 0, 0, 0.2)\",\n padding: \"1rem\",\n }}\n >\n <h2\n id={titleId}\n style={{ margin: 0, marginBottom: \"0.5rem\", fontSize: \"1.1rem\" }}\n >\n {title}\n </h2>\n <p\n style={{\n margin: 0,\n marginBottom: \"1rem\",\n color: \"var(--color-text-secondary)\",\n }}\n >\n {message}\n </p>\n\n <div\n style={{ display: \"flex\", justifyContent: \"flex-end\", gap: \"0.5rem\" }}\n >\n <button\n type=\"button\"\n onClick={onCancel}\n style={{\n padding: \"0.5rem 0.9rem\",\n borderRadius: \"4px\",\n border: \"1px solid var(--color-border)\",\n backgroundColor: \"var(--color-bg-secondary)\",\n color: \"var(--color-text)\",\n cursor: \"pointer\",\n }}\n >\n {cancelLabel}\n </button>\n <button\n type=\"button\"\n onClick={onConfirm}\n style={{\n padding: \"0.5rem 0.9rem\",\n borderRadius: \"4px\",\n border: \"none\",\n backgroundColor: destructive\n ? \"var(--color-error)\"\n : \"var(--color-primary)\",\n color: \"white\",\n cursor: \"pointer\",\n }}\n >\n {confirmLabel}\n </button>\n </div>\n </div>\n </dialog>\n );\n}\n\nexport default ConfirmDialog;\n","export interface AlertBannerProps {\n message: string;\n variant?: \"info\" | \"error\" | \"success\";\n onDismiss?: () => void;\n}\n\nconst styles: Record<\n NonNullable<AlertBannerProps[\"variant\"]>,\n { border: string; bg: string; text: string }\n> = {\n info: {\n border: \"var(--color-border)\",\n bg: \"var(--color-bg-secondary)\",\n text: \"var(--color-text)\",\n },\n error: {\n border: \"var(--color-error-border)\",\n bg: \"var(--color-error-bg)\",\n text: \"var(--color-error)\",\n },\n success: {\n border: \"var(--color-success-border, var(--color-border))\",\n bg: \"var(--color-success-bg, var(--color-bg-secondary))\",\n text: \"var(--color-success, var(--color-text))\",\n },\n};\n\nexport function AlertBanner({\n message,\n variant = \"info\",\n onDismiss,\n}: Readonly<AlertBannerProps>) {\n const palette = styles[variant];\n const content = (\n <>\n <span>{message}</span>\n {onDismiss && (\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n onClick={onDismiss}\n style={{\n border: \"none\",\n background: \"transparent\",\n color: \"inherit\",\n cursor: \"pointer\",\n fontSize: \"1rem\",\n lineHeight: 1,\n }}\n >\n ×\n </button>\n )}\n </>\n );\n\n const commonStyle = {\n marginBottom: \"1rem\",\n padding: \"0.75rem 1rem\",\n backgroundColor: palette.bg,\n border: `1px solid ${palette.border}`,\n borderRadius: \"4px\",\n color: palette.text,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: \"0.5rem\",\n } as const;\n\n if (variant === \"error\") {\n return (\n <div role=\"alert\" style={commonStyle}>\n {content}\n </div>\n );\n }\n\n return <output style={commonStyle}>{content}</output>;\n}\n\nexport default AlertBanner;\n","/**\n * BulkActionsBar Component\n *\n * Toolbar for bulk actions when rows are selected.\n * Per checklist 5.3: Bulk Operations.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { ConfirmDialog } from \"../feedback\";\n\n/**\n * BulkActionsBar props\n */\nexport interface BulkActionsBarProps {\n /** Number of selected items */\n selectedCount: number;\n /** Whether action is in progress */\n isLoading?: boolean;\n /** Handle bulk delete */\n onDelete?: () => void;\n /** Handle export as JSON */\n onExportJson?: () => void;\n /** Handle export as CSV */\n onExportCsv?: () => void;\n /** Handle bulk update */\n onBulkUpdate?: (field: string, value: unknown) => void;\n /** Available fields for bulk update */\n updateFields?: Array<{\n name: string;\n label: string;\n options?: Array<{ value: string; label: string }>;\n }>;\n /** Handle clear selection */\n onClear?: () => void;\n}\n\n/**\n * BulkActionsBar Component\n */\nexport function BulkActionsBar({\n selectedCount,\n isLoading = false,\n onDelete,\n onExportJson,\n onExportCsv,\n onBulkUpdate,\n updateFields = [],\n onClear,\n}: Readonly<BulkActionsBarProps>) {\n const [showUpdateMenu, setShowUpdateMenu] = useState(false);\n const [selectedField, setSelectedField] = useState(\"\");\n const [updateValue, setUpdateValue] = useState(\"\");\n const [isDeleteConfirmOpen, setIsDeleteConfirmOpen] = useState(false);\n\n // Handle update submit\n const handleUpdate = useCallback(() => {\n if (selectedField && onBulkUpdate) {\n onBulkUpdate(selectedField, updateValue);\n setShowUpdateMenu(false);\n setSelectedField(\"\");\n setUpdateValue(\"\");\n }\n }, [selectedField, updateValue, onBulkUpdate]);\n\n // Handle delete with confirmation\n const handleDelete = useCallback(() => {\n setIsDeleteConfirmOpen(true);\n }, []);\n\n if (selectedCount === 0) return null;\n\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"1rem\",\n padding: \"0.75rem 1rem\",\n backgroundColor: \"var(--color-bg-secondary)\",\n border: \"1px solid var(--color-border)\",\n borderRadius: \"4px\",\n marginBottom: \"1rem\",\n }}\n >\n {/* Selection count */}\n <span style={{ fontWeight: 500, color: \"var(--color-text)\" }}>\n {selectedCount} selected\n </span>\n\n {/* Actions */}\n <div style={{ display: \"flex\", gap: \"0.5rem\" }}>\n {/* Delete */}\n {onDelete && (\n <button\n onClick={handleDelete}\n disabled={isLoading}\n style={{\n padding: \"0.5rem 1rem\",\n backgroundColor: \"var(--color-error)\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n cursor: isLoading ? \"wait\" : \"pointer\",\n opacity: isLoading ? 0.6 : 1,\n }}\n >\n Delete\n </button>\n )}\n\n {/* Export JSON */}\n {onExportJson && (\n <button\n onClick={onExportJson}\n disabled={isLoading}\n style={buttonStyle}\n >\n Export JSON\n </button>\n )}\n\n {/* Export CSV */}\n {onExportCsv && (\n <button\n onClick={onExportCsv}\n disabled={isLoading}\n style={buttonStyle}\n >\n Export CSV\n </button>\n )}\n\n {/* Bulk Update */}\n {onBulkUpdate && updateFields.length > 0 && (\n <div style={{ position: \"relative\" }}>\n <button\n onClick={() => setShowUpdateMenu(!showUpdateMenu)}\n disabled={isLoading}\n style={buttonStyle}\n >\n Update Field ▼\n </button>\n\n {/* Update dropdown */}\n {showUpdateMenu && (\n <div\n style={{\n position: \"absolute\",\n top: \"100%\",\n left: 0,\n marginTop: \"0.25rem\",\n padding: \"1rem\",\n backgroundColor: \"white\",\n border: \"1px solid #e0e0e0\",\n borderRadius: \"4px\",\n boxShadow: \"0 2px 8px rgba(0,0,0,0.1)\",\n zIndex: 100,\n minWidth: \"200px\",\n }}\n >\n {/* Field select */}\n <select\n value={selectedField}\n onChange={e => setSelectedField(e.target.value)}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n marginBottom: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n }}\n >\n <option value=\"\">Select field...</option>\n {updateFields.map(f => (\n <option key={f.name} value={f.name}>\n {f.label}\n </option>\n ))}\n </select>\n\n {/* Value input */}\n {selectedField && (\n <>\n {updateFields.find(f => f.name === selectedField)\n ?.options ? (\n <select\n value={updateValue}\n onChange={e => setUpdateValue(e.target.value)}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n marginBottom: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n }}\n >\n <option value=\"\">Select value...</option>\n {updateFields\n .find(f => f.name === selectedField)\n ?.options?.map(o => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </select>\n ) : (\n <input\n type=\"text\"\n value={updateValue}\n onChange={e => setUpdateValue(e.target.value)}\n placeholder=\"New value\"\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n marginBottom: \"0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n boxSizing: \"border-box\",\n }}\n />\n )}\n\n <button\n onClick={handleUpdate}\n disabled={!updateValue}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n backgroundColor: \"#1890ff\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n cursor: updateValue ? \"pointer\" : \"not-allowed\",\n opacity: updateValue ? 1 : 0.5,\n }}\n >\n Apply\n </button>\n </>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Spacer */}\n <div style={{ flex: 1 }} />\n\n {/* Clear selection */}\n {onClear && (\n <button\n onClick={onClear}\n style={{\n padding: \"0.5rem 1rem\",\n backgroundColor: \"transparent\",\n color: \"#666\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n }}\n >\n Clear\n </button>\n )}\n\n <ConfirmDialog\n open={isDeleteConfirmOpen}\n title=\"Confirm bulk delete\"\n message={`Delete ${selectedCount} selected item(s)? This cannot be undone.`}\n confirmLabel=\"Delete\"\n cancelLabel=\"Cancel\"\n destructive\n onConfirm={() => {\n setIsDeleteConfirmOpen(false);\n onDelete?.();\n }}\n onCancel={() => setIsDeleteConfirmOpen(false)}\n />\n </div>\n );\n}\n\nconst buttonStyle: React.CSSProperties = {\n padding: \"0.5rem 1rem\",\n backgroundColor: \"#f5f5f5\",\n color: \"#333\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n};\n\nexport default BulkActionsBar;\n","/**\n * StateBadge Component\n *\n * Displays the current workflow state as a colored badge.\n * Per checklist 2.4: Show current state badge (e.g., \"Draft\", \"Approved\")\n */\n\nimport type { CSSProperties } from \"react\";\n\n/**\n * State color mapping\n */\nconst STATE_COLORS: Record<string, { bg: string; text: string }> = {\n // Common workflow states\n draft: { bg: \"#e0e0e0\", text: \"#333\" },\n pending: { bg: \"#fff3cd\", text: \"#856404\" },\n submitted: { bg: \"#cce5ff\", text: \"#004085\" },\n approved: { bg: \"#d4edda\", text: \"#155724\" },\n rejected: { bg: \"#f8d7da\", text: \"#721c24\" },\n cancelled: { bg: \"#f5f5f5\", text: \"#666\" },\n completed: { bg: \"#d4edda\", text: \"#155724\" },\n on_hold: { bg: \"#fff3cd\", text: \"#856404\" },\n // Default\n default: { bg: \"#e9ecef\", text: \"#495057\" },\n};\n\n/**\n * Get color for a state\n */\nfunction getStateColor(state: string | undefined): { bg: string; text: string } {\n if (!state) return STATE_COLORS.default;\n \n const normalizedState = state.toLowerCase().replace(/\\s+/g, \"_\");\n return STATE_COLORS[normalizedState] ?? STATE_COLORS.default;\n}\n\n/**\n * StateBadge props\n */\nexport interface StateBadgeProps {\n /** Current workflow state */\n state?: string;\n /** Document status (0=Draft, 1=Submitted, 2=Cancelled) */\n docstatus?: number;\n /** Custom className */\n className?: string;\n /** Custom style */\n style?: CSSProperties;\n}\n\n/**\n * StateBadge Component\n *\n * Displays workflow state as a styled badge.\n *\n * @example\n * ```tsx\n * <StateBadge state=\"Pending Approval\" />\n * <StateBadge state=\"Approved\" />\n * <StateBadge state=\"Draft\" docstatus={0} />\n * ```\n */\nexport function StateBadge({\n state,\n docstatus,\n className,\n style,\n}: StateBadgeProps) {\n // Determine display state\n const displayState = state ?? (docstatus === 0 ? \"Draft\" : docstatus === 1 ? \"Submitted\" : docstatus === 2 ? \"Cancelled\" : undefined);\n \n if (!displayState) return null;\n\n const colors = getStateColor(displayState);\n\n return (\n <span\n className={className}\n style={{\n display: \"inline-block\",\n padding: \"0.25rem 0.75rem\",\n borderRadius: \"9999px\",\n fontSize: \"0.75rem\",\n fontWeight: 500,\n textTransform: \"capitalize\",\n backgroundColor: colors.bg,\n color: colors.text,\n ...style,\n }}\n >\n {displayState}\n </span>\n );\n}\n\nexport default StateBadge;\n","/**\n * useWorkflowActions Hook\n *\n * Fetches available workflow transitions for a document and\n * provides methods to execute transitions.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { API_URL } from \"../constants\";\n\n/**\n * Workflow action (transition) definition\n */\nexport interface WorkflowAction {\n name: string;\n label: string;\n from_state: string;\n to_state: string;\n allowed: boolean;\n reason?: string; // Why not allowed, if applicable\n}\n\n/**\n * Workflow state information\n */\nexport interface WorkflowState {\n current_state: string;\n docstatus: number;\n workflow_name?: string;\n}\n\n/**\n * Workflow actions response from API\n */\ninterface WorkflowActionsResponse {\n state: WorkflowState;\n actions: WorkflowAction[];\n}\n\n/**\n * Return type for useWorkflowActions hook\n */\nexport interface UseWorkflowActionsResult {\n /** Current workflow state */\n state: WorkflowState | undefined;\n /** Available actions for current user */\n actions: WorkflowAction[];\n /** Loading state */\n isLoading: boolean;\n /** Error if fetch failed */\n error: Error | null;\n /** Execute a workflow transition */\n executeAction: (actionName: string) => Promise<void>;\n /** Is an action currently executing */\n isExecuting: boolean;\n /** Refresh actions */\n refetch: () => void;\n}\n\n/**\n * Fetch workflow actions for a document\n */\nasync function fetchWorkflowActions(\n doctype: string,\n id: string\n): Promise<WorkflowActionsResponse> {\n const response = await fetch(\n `${API_URL}/workflow/${doctype}/${id}/actions`,\n { credentials: \"include\" }\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch workflow actions: ${response.statusText}`);\n }\n\n return response.json();\n}\n\n/**\n * Execute a workflow transition\n */\nasync function executeTransition(\n doctype: string,\n id: string,\n action: string\n): Promise<void> {\n const response = await fetch(\n `${API_URL}/workflow/${doctype}/${id}/transition`,\n {\n method: \"POST\",\n credentials: \"include\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action }),\n }\n );\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({\n detail: response.statusText,\n }));\n throw new Error(error.detail || `Failed to execute ${action}`);\n }\n}\n\n/**\n * Hook to manage workflow actions for a document\n *\n * @param doctype - The DocType name\n * @param id - The document ID\n * @param options - Additional options\n *\n * @example\n * ```tsx\n * const { state, actions, executeAction, isExecuting } = useWorkflowActions(\"Todo\", todoId);\n *\n * return (\n * <div>\n * <StateBadge state={state?.current_state} />\n * {actions.map(action => (\n * <button\n * key={action.name}\n * onClick={() => executeAction(action.name)}\n * disabled={!action.allowed || isExecuting}\n * >\n * {action.label}\n * </button>\n * ))}\n * </div>\n * );\n * ```\n */\nexport function useWorkflowActions(\n doctype: string,\n id: string | undefined,\n options?: { enabled?: boolean }\n): UseWorkflowActionsResult {\n const queryClient = useQueryClient();\n const [isExecuting, setIsExecuting] = useState(false);\n\n const enabled = Boolean(id) && (options?.enabled ?? true);\n\n const {\n data,\n isLoading,\n error,\n refetch,\n } = useQuery<WorkflowActionsResponse, Error>({\n queryKey: [\"workflow-actions\", doctype, id],\n queryFn: () => fetchWorkflowActions(doctype, id!),\n enabled,\n staleTime: 30 * 1000, // 30 seconds\n });\n\n const executeAction = useCallback(\n async (actionName: string) => {\n if (!id) return;\n\n setIsExecuting(true);\n try {\n await executeTransition(doctype, id, actionName);\n \n // Invalidate queries to refresh state\n await queryClient.invalidateQueries({\n queryKey: [\"workflow-actions\", doctype, id],\n });\n // Also invalidate the document data\n await queryClient.invalidateQueries({\n queryKey: [doctype, id],\n });\n } finally {\n setIsExecuting(false);\n }\n },\n [doctype, id, queryClient]\n );\n\n return {\n state: data?.state,\n actions: data?.actions ?? [],\n isLoading,\n error: error ?? null,\n executeAction,\n isExecuting,\n refetch,\n };\n}\n","/**\n * WorkflowActions Component\n *\n * Renders action buttons for workflow transitions.\n * Per checklist 2.4: Render buttons like \"Submit\", \"Approve\", \"Reject\"\n */\n\nimport type { CSSProperties } from \"react\";\nimport { useWorkflowActions, type WorkflowAction } from \"../../hooks/useWorkflowActions\";\nimport { StateBadge } from \"./StateBadge\";\n\n/**\n * Action button color mapping\n */\nconst ACTION_COLORS: Record<string, { bg: string; text: string; hover: string }> = {\n submit: { bg: \"#007bff\", text: \"white\", hover: \"#0056b3\" },\n approve: { bg: \"#28a745\", text: \"white\", hover: \"#1e7e34\" },\n reject: { bg: \"#dc3545\", text: \"white\", hover: \"#bd2130\" },\n cancel: { bg: \"#6c757d\", text: \"white\", hover: \"#545b62\" },\n hold: { bg: \"#ffc107\", text: \"#212529\", hover: \"#d39e00\" },\n default: { bg: \"#6c757d\", text: \"white\", hover: \"#545b62\" },\n};\n\n/**\n * Get button color for an action\n */\nfunction getActionColor(actionName: string): { bg: string; text: string; hover: string } {\n const normalized = actionName.toLowerCase();\n \n if (normalized.includes(\"submit\")) return ACTION_COLORS.submit;\n if (normalized.includes(\"approve\")) return ACTION_COLORS.approve;\n if (normalized.includes(\"reject\")) return ACTION_COLORS.reject;\n if (normalized.includes(\"cancel\")) return ACTION_COLORS.cancel;\n if (normalized.includes(\"hold\")) return ACTION_COLORS.hold;\n \n return ACTION_COLORS.default;\n}\n\n/**\n * WorkflowActions props\n */\nexport interface WorkflowActionsProps {\n /** DocType name */\n doctype: string;\n /** Document ID */\n id?: string;\n /** Show state badge */\n showState?: boolean;\n /** Callback after successful action */\n onActionComplete?: (action: string) => void;\n /** Custom className */\n className?: string;\n /** Custom style */\n style?: CSSProperties;\n}\n\n/**\n * WorkflowActions Component\n *\n * Fetches and renders workflow action buttons.\n *\n * @example\n * ```tsx\n * // In form header\n * <WorkflowActions\n * doctype=\"Todo\"\n * id={todoId}\n * showState\n * onActionComplete={() => refetch()}\n * />\n * ```\n */\nexport function WorkflowActions({\n doctype,\n id,\n showState = true,\n onActionComplete,\n className,\n style,\n}: WorkflowActionsProps) {\n const {\n state,\n actions,\n isLoading,\n executeAction,\n isExecuting,\n } = useWorkflowActions(doctype, id);\n\n // Handle action click\n const handleAction = async (action: WorkflowAction) => {\n try {\n await executeAction(action.name);\n onActionComplete?.(action.name);\n } catch (error) {\n console.error(\"Workflow action failed:\", error);\n // Could add toast notification here\n }\n };\n\n if (isLoading) {\n return <div style={{ color: \"#666\" }}>Loading workflow...</div>;\n }\n\n // No workflow if no state\n if (!state) {\n return null;\n }\n\n // Filter to only show allowed actions\n const allowedActions = actions.filter((a) => a.allowed);\n\n return (\n <div\n className={className}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n ...style,\n }}\n >\n {/* State Badge */}\n {showState && (\n <StateBadge\n state={state.current_state}\n docstatus={state.docstatus}\n />\n )}\n\n {/* Action Buttons */}\n {allowedActions.map((action) => {\n const colors = getActionColor(action.name);\n \n return (\n <button\n key={action.name}\n onClick={() => handleAction(action)}\n disabled={isExecuting}\n title={action.label}\n style={{\n padding: \"0.5rem 1rem\",\n border: \"none\",\n borderRadius: \"4px\",\n fontSize: \"0.875rem\",\n fontWeight: 500,\n cursor: isExecuting ? \"not-allowed\" : \"pointer\",\n opacity: isExecuting ? 0.6 : 1,\n backgroundColor: colors.bg,\n color: colors.text,\n transition: \"background-color 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (!isExecuting) {\n e.currentTarget.style.backgroundColor = colors.hover;\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = colors.bg;\n }}\n >\n {isExecuting ? \"...\" : action.label}\n </button>\n );\n })}\n\n {/* Show message if no actions available */}\n {allowedActions.length === 0 && !isLoading && (\n <span style={{ color: \"#666\", fontSize: \"0.875rem\" }}>\n No actions available\n </span>\n )}\n </div>\n );\n}\n\nexport default WorkflowActions;\n","/**\n * Plugin Registry\n *\n * Central registry for Framework M plugins.\n * Per checklist 2.5: No Monkey Patching - Plugins register via app.registerPlugin()\n */\n\nimport type {\n Plugin,\n PluginRegistry,\n FieldRegistration,\n SlotRegistration,\n PageRegistration,\n ResourceRegistration,\n ThemeRegistration,\n} from \"./types\";\n\nfunction isDebugEnabled(): boolean {\n const globalFlag = (globalThis as { __FRAMEWORK_M_DEBUG__?: unknown })\n .__FRAMEWORK_M_DEBUG__;\n if (typeof globalFlag === \"boolean\") {\n return globalFlag;\n }\n if (typeof globalFlag === \"string\") {\n return [\"1\", \"true\", \"yes\", \"on\"].includes(globalFlag.toLowerCase());\n }\n\n const processRef = (\n globalThis as { process?: { env?: Record<string, string | undefined> } }\n ).process;\n const envFlag = processRef?.env?.FRAMEWORK_M_DEBUG;\n if (typeof envFlag === \"string\") {\n return [\"1\", \"true\", \"yes\", \"on\"].includes(envFlag.toLowerCase());\n }\n\n return false;\n}\n\nconst pluginLogger = {\n info(message: string): void {\n if (isDebugEnabled()) {\n console.info(`[DeskPluginRegistry] ${message}`);\n }\n },\n warn(message: string): void {\n if (isDebugEnabled()) {\n console.warn(`[DeskPluginRegistry] ${message}`);\n }\n },\n error(message: string, error?: unknown): void {\n console.error(`[DeskPluginRegistry] ${message}`, error);\n },\n};\n\n/**\n * Global plugin registry instance\n */\nconst registry: PluginRegistry = {\n plugins: new Map(),\n fields: new Map(),\n slots: new Map(),\n pages: new Map(),\n resources: [],\n theme: undefined,\n};\n\n/**\n * Register a plugin with the application\n *\n * @param plugin - Plugin definition\n *\n * @example\n * ```tsx\n * // In custom_app/frontend/index.ts\n * import { registerPlugin } from \"@framework-m/core\";\n * import { StarRating } from \"./components/StarRating\";\n * import { PaymentButton } from \"./components/PaymentButton\";\n *\n * registerPlugin({\n * name: \"custom_app\",\n * version: \"1.0.0\",\n * fields: [\n * { name: \"rating\", component: StarRating, fieldTypes: [\"Rating\"] }\n * ],\n * slots: [\n * { slot: \"form-header\", component: PaymentButton, doctypes: [\"Sales Invoice\"] }\n * ],\n * });\n * ```\n */\nexport function registerPlugin(plugin: Plugin): void {\n // Check for duplicate\n if (registry.plugins.has(plugin.name)) {\n pluginLogger.warn(\n `Plugin \"${plugin.name}\" is already registered. Skipping.`,\n );\n return;\n }\n\n // Register plugin\n registry.plugins.set(plugin.name, plugin);\n\n // Register fields\n if (plugin.fields) {\n for (const field of plugin.fields) {\n registry.fields.set(field.name, field);\n }\n }\n\n // Register slots\n if (plugin.slots) {\n for (const slot of plugin.slots) {\n const existing = registry.slots.get(slot.slot) ?? [];\n existing.push(slot);\n // Sort by priority (higher first)\n existing.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n registry.slots.set(slot.slot, existing);\n }\n }\n\n // Register pages\n if (plugin.pages) {\n for (const page of plugin.pages) {\n const key = `${page.pageType}:${page.doctype}`;\n registry.pages.set(key, page);\n }\n }\n\n // Register resources\n if (plugin.resources) {\n registry.resources.push(...plugin.resources);\n }\n\n // Register theme (last one wins)\n if (plugin.theme) {\n registry.theme = {\n ...registry.theme,\n ...plugin.theme,\n };\n }\n\n // Run init if provided\n if (plugin.init) {\n Promise.resolve(plugin.init()).catch(err => {\n pluginLogger.error(`Plugin \"${plugin.name}\" init failed`, err);\n });\n }\n\n pluginLogger.info(`Plugin \"${plugin.name}\" registered successfully.`);\n}\n\n/**\n * Register a custom field widget\n *\n * @param name - Field name/type\n * @param component - React component for the field\n * @param fieldTypes - Optional field types this widget handles\n *\n * @example\n * ```tsx\n * registerField(\"rating\", StarRating, [\"Rating\"]);\n * ```\n */\nexport function registerField(\n name: string,\n component: FieldRegistration[\"component\"],\n fieldTypes?: string[],\n): void {\n registry.fields.set(name, { name, component, fieldTypes });\n}\n\n/**\n * Register a slot injection\n *\n * @param slot - Slot name\n * @param component - React component to inject\n * @param options - Optional doctypes filter and priority\n *\n * @example\n * ```tsx\n * registerSlot(\"form-header\", PaymentButton, {\n * doctypes: [\"Sales Invoice\"],\n * priority: 10\n * });\n * ```\n */\nexport function registerSlot(\n slot: string,\n component: SlotRegistration[\"component\"],\n options?: { doctypes?: string[]; priority?: number },\n): void {\n const registration: SlotRegistration = {\n slot,\n component,\n ...options,\n };\n\n const existing = registry.slots.get(slot) ?? [];\n existing.push(registration);\n existing.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n registry.slots.set(slot, existing);\n}\n\n/**\n * Register a page override\n *\n * @param pageType - Page type to override\n * @param doctype - DocType or '*' for all\n * @param component - React component for the page\n *\n * @example\n * ```tsx\n * registerPage(\"form\", \"Sales Invoice\", CustomInvoiceForm);\n * ```\n */\nexport function registerPage(\n pageType: PageRegistration[\"pageType\"],\n doctype: string,\n component: PageRegistration[\"component\"],\n): void {\n const key = `${pageType}:${doctype}`;\n registry.pages.set(key, { pageType, doctype, component });\n}\n\n/**\n * Get a registered field widget\n */\nexport function getField(name: string): FieldRegistration | undefined {\n return registry.fields.get(name);\n}\n\n/**\n * Get all slot components for a slot name\n */\nexport function getSlotComponents(\n slotName: string,\n doctype?: string,\n): SlotRegistration[] {\n const slots = registry.slots.get(slotName) ?? [];\n\n // Filter by doctype if specified\n if (doctype) {\n return slots.filter(s => !s.doctypes || s.doctypes.includes(doctype));\n }\n\n return slots;\n}\n\n/**\n * Get a page override\n */\nexport function getPage(\n pageType: string,\n doctype: string,\n): PageRegistration | undefined {\n // Try specific doctype first\n const specific = registry.pages.get(`${pageType}:${doctype}`);\n if (specific) return specific;\n\n // Fall back to wildcard\n return registry.pages.get(`${pageType}:*`);\n}\n\n/**\n * Get all registered resources\n */\nexport function getResources(): ResourceRegistration[] {\n return registry.resources;\n}\n\n/**\n * Get the current theme\n */\nexport function getTheme(): ThemeRegistration | undefined {\n return registry.theme;\n}\n\n/**\n * Get all registered plugins\n */\nexport function getPlugins(): Plugin[] {\n return Array.from(registry.plugins.values());\n}\n\n/**\n * Check if a plugin is registered\n */\nexport function hasPlugin(name: string): boolean {\n return registry.plugins.has(name);\n}\n\n/**\n * Clear all registrations (for testing)\n */\nexport function clearRegistry(): void {\n registry.plugins.clear();\n registry.fields.clear();\n registry.slots.clear();\n registry.pages.clear();\n registry.resources.length = 0;\n registry.theme = undefined;\n}\n","/**\n * Slot Component\n *\n * Renders registered slot components for a named slot.\n * Used for injection points in the UI.\n */\n\nimport { getSlotComponents } from \"./registry\";\nimport type { SlotRegistration, SlotProps } from \"./types\";\n\n/**\n * Slot component props\n */\nexport interface SlotComponentProps extends SlotProps {\n /** Slot name */\n name: string;\n /** Children to render if no slot components */\n children?: React.ReactNode;\n}\n\n/**\n * Slot Component\n *\n * Renders all registered components for a named slot.\n *\n * @example\n * ```tsx\n * // In FormView header\n * <div className=\"form-header\">\n * <h1>{doctype}</h1>\n * <Slot name=\"form-header\" doctype={doctype} data={formData} />\n * </div>\n * ```\n */\nexport function Slot({\n name,\n doctype,\n data,\n id,\n children,\n}: SlotComponentProps) {\n const slotRegistrations = getSlotComponents(name, doctype);\n\n if (slotRegistrations.length === 0) {\n return <>{children}</>;\n }\n\n return (\n <>\n {slotRegistrations.map((registration: SlotRegistration, index: number) => {\n const Component = registration.component;\n return (\n <Component\n key={`${name}-${index}`}\n doctype={doctype}\n data={data}\n id={id}\n />\n );\n })}\n </>\n );\n}\n\nexport default Slot;\n","/**\n * Command Palette Component\n *\n * Global search and command palette with Ctrl+K.\n * Per checklist 6.5: Global Command Palette.\n *\n * Features:\n * - Search DocTypes (navigation)\n * - Search Documents (by title)\n * - Run Commands (e.g., \"New User\")\n */\n\nimport { useState, useEffect, useCallback, useMemo, useRef } from \"react\";\nimport { useGo, useList } from \"@refinedev/core\";\nimport { getResources } from \"../plugins\";\nimport { META_URL } from \"../constants\";\n\n/**\n * Command types\n */\nexport type CommandType = \"doctype\" | \"document\" | \"command\";\n\n/**\n * Command item\n */\nexport interface CommandItem {\n /** Unique ID */\n id: string;\n /** Type of command */\n type: CommandType;\n /** Display label */\n label: string;\n /** Secondary text */\n description?: string;\n /** Icon (emoji) */\n icon?: string;\n /** DocType for document items */\n doctype?: string;\n /** Action to execute */\n action?: () => void;\n}\n\n/**\n * CommandPalette props\n */\nexport interface CommandPaletteProps {\n /** Whether palette is open */\n open: boolean;\n /** Close callback */\n onClose: () => void;\n}\n\n/**\n * Built-in commands\n */\nconst BUILTIN_COMMANDS: CommandItem[] = [\n {\n id: \"cmd-dashboard\",\n type: \"command\",\n label: \"Go to Dashboard\",\n icon: \"🏠\",\n description: \"Open the main dashboard\",\n },\n {\n id: \"cmd-settings\",\n type: \"command\",\n label: \"Settings\",\n icon: \"⚙️\",\n description: \"Open settings\",\n },\n {\n id: \"cmd-logout\",\n type: \"command\",\n label: \"Logout\",\n icon: \"🚪\",\n description: \"Sign out of your account\",\n },\n];\n\n/**\n * CommandPalette Component\n */\nexport function CommandPalette({ open, onClose }: CommandPaletteProps) {\n const [query, setQuery] = useState(\"\");\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [doctypes, setDoctypes] = useState<CommandItem[]>([]);\n const inputRef = useRef<HTMLInputElement>(null);\n const go = useGo();\n\n // Fetch DocTypes for navigation\n useEffect(() => {\n async function fetchDoctypes() {\n try {\n const response = await fetch(`${META_URL}/doctypes`, {\n credentials: \"include\",\n });\n if (response.ok) {\n const data = await response.json();\n const items: CommandItem[] = (data.doctypes ?? [])\n .filter(\n (dt: { api_resource: boolean; show_in_desk: boolean }) =>\n dt.api_resource && dt.show_in_desk,\n )\n .map((dt: { name: string; label?: string }) => ({\n id: `doctype-${dt.name}`,\n type: \"doctype\" as CommandType,\n label: dt.label ?? dt.name,\n description: `Go to ${dt.name}`,\n icon: \"📋\",\n doctype: dt.name,\n }));\n setDoctypes(items);\n }\n } catch {\n // Fallback to registered resources\n const resources = getResources();\n const items: CommandItem[] = resources.map(r => ({\n id: `doctype-${r.name}`,\n type: \"doctype\" as CommandType,\n label: r.label ?? r.name,\n description: `Go to ${r.name}`,\n icon: \"📋\",\n doctype: r.name,\n }));\n setDoctypes(items);\n }\n }\n\n if (open) {\n fetchDoctypes();\n }\n }, [open]);\n\n // Search documents\n const { result: searchResults } = useList({\n resource: \"search\",\n filters:\n query.length >= 2\n ? [{ field: \"q\", operator: \"contains\", value: query }]\n : [],\n pagination: { pageSize: 5 },\n queryOptions: { enabled: open && query.length >= 2 },\n });\n\n // Convert search results to command items\n const documentItems: CommandItem[] = useMemo(() => {\n if (!searchResults?.data) return [];\n return searchResults.data.map(doc => {\n const d = doc as unknown as {\n id?: string;\n name?: string;\n title?: string;\n doctype?: string;\n };\n return {\n id: `doc-${d.id ?? \"unknown\"}`,\n type: \"document\" as CommandType,\n label: d.title ?? d.name ?? String(d.id ?? \"Unknown\"),\n description: d.doctype,\n icon: \"📄\",\n doctype: d.doctype,\n };\n });\n }, [searchResults]);\n\n // \"New X\" commands from DocTypes\n const newCommands: CommandItem[] = useMemo(() => {\n if (query.toLowerCase().startsWith(\"new \")) {\n const searchTerm = query.slice(4).toLowerCase();\n return doctypes\n .filter(dt => dt.label.toLowerCase().includes(searchTerm))\n .slice(0, 5)\n .map(dt => ({\n id: `new-${dt.doctype}`,\n type: \"command\" as CommandType,\n label: `New ${dt.label}`,\n description: `Create a new ${dt.label}`,\n icon: \"➕\",\n doctype: dt.doctype,\n }));\n }\n return [];\n }, [doctypes, query]);\n\n // Filter all items by query\n const filteredItems = useMemo(() => {\n const lowerQuery = query.toLowerCase();\n\n const filtered = [\n ...newCommands,\n ...doctypes.filter(\n dt =>\n dt.label.toLowerCase().includes(lowerQuery) ||\n dt.doctype?.toLowerCase().includes(lowerQuery),\n ),\n ...documentItems,\n ...BUILTIN_COMMANDS.filter(cmd =>\n cmd.label.toLowerCase().includes(lowerQuery),\n ),\n ];\n\n return filtered.slice(0, 10);\n }, [doctypes, documentItems, newCommands, query]);\n\n // Reset selection when results change\n useEffect(() => {\n setSelectedIndex(0);\n }, [filteredItems.length]);\n\n // Focus input when opened\n useEffect(() => {\n if (open && inputRef.current) {\n inputRef.current.focus();\n setQuery(\"\");\n setSelectedIndex(0);\n }\n }, [open]);\n\n // Execute selected command\n const executeCommand = useCallback(\n (item: CommandItem) => {\n onClose();\n\n if (item.type === \"doctype\" && item.doctype) {\n go({ to: `/app/${item.doctype}/list` });\n } else if (item.type === \"document\" && item.doctype) {\n go({\n to: `/app/${item.doctype}/detail/${item.id.replace(\"doc-\", \"\")}`,\n });\n } else if (item.type === \"command\") {\n if (item.id === \"cmd-dashboard\") {\n go({ to: \"/app/dashboard\" });\n } else if (item.id === \"cmd-settings\") {\n go({ to: \"/app/settings\" });\n } else if (item.id === \"cmd-logout\") {\n go({ to: \"/logout\" });\n } else if (item.id.startsWith(\"new-\") && item.doctype) {\n go({ to: `/app/${item.doctype}/new` });\n } else if (item.action) {\n item.action();\n }\n }\n },\n [go, onClose],\n );\n\n // Keyboard navigation\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setSelectedIndex(i => Math.min(i + 1, filteredItems.length - 1));\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setSelectedIndex(i => Math.max(i - 1, 0));\n } else if (e.key === \"Enter\" && filteredItems[selectedIndex]) {\n e.preventDefault();\n executeCommand(filteredItems[selectedIndex]);\n } else if (e.key === \"Escape\") {\n onClose();\n }\n },\n [filteredItems, selectedIndex, executeCommand, onClose],\n );\n\n if (!open) return null;\n\n return (\n <>\n {/* Backdrop */}\n <div\n onClick={onClose}\n style={{\n position: \"fixed\",\n inset: 0,\n backgroundColor: \"rgba(0,0,0,0.7)\",\n zIndex: 1000,\n }}\n />\n\n {/* Palette */}\n <div\n style={{\n position: \"fixed\",\n top: \"15%\",\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: \"100%\",\n maxWidth: \"500px\",\n backgroundColor: \"var(--color-bg)\",\n borderRadius: \"8px\",\n boxShadow: \"var(--shadow-md)\",\n border: \"1px solid var(--color-border)\",\n zIndex: 1001,\n overflow: \"hidden\",\n }}\n >\n {/* Search Input */}\n <div\n style={{\n padding: \"0.75rem\",\n borderBottom: \"1px solid var(--color-border)\",\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n placeholder=\"Search or type a command...\"\n value={query}\n onChange={e => setQuery(e.target.value)}\n onKeyDown={handleKeyDown}\n style={{\n width: \"100%\",\n padding: \"0.5rem\",\n border: \"none\",\n outline: \"none\",\n fontSize: \"1rem\",\n backgroundColor: \"var(--color-bg)\",\n color: \"var(--color-text)\",\n }}\n />\n </div>\n\n {/* Results */}\n <div style={{ maxHeight: \"300px\", overflow: \"auto\" }}>\n {filteredItems.length === 0 && query && (\n <div\n style={{\n padding: \"1rem\",\n color: \"var(--color-text-secondary)\",\n textAlign: \"center\",\n }}\n >\n No results found\n </div>\n )}\n\n {filteredItems.map((item, idx) => (\n <div\n key={item.id}\n onClick={() => executeCommand(item)}\n onMouseEnter={() => setSelectedIndex(idx)}\n style={{\n padding: \"0.75rem 1rem\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n backgroundColor:\n selectedIndex === idx\n ? \"var(--color-bg-secondary)\"\n : \"var(--color-bg)\",\n }}\n >\n <span style={{ fontSize: \"1.25rem\" }}>{item.icon}</span>\n <div style={{ flex: 1 }}>\n <div style={{ fontWeight: 500, color: \"var(--color-text)\" }}>\n {item.label}\n </div>\n {item.description && (\n <div\n style={{\n fontSize: \"0.75rem\",\n color: \"var(--color-text-secondary)\",\n }}\n >\n {item.description}\n </div>\n )}\n </div>\n <span\n style={{\n fontSize: \"0.65rem\",\n padding: \"0.15rem 0.35rem\",\n backgroundColor: \"var(--color-bg-tertiary)\",\n borderRadius: \"3px\",\n color: \"var(--color-text-secondary)\",\n }}\n >\n {item.type}\n </span>\n </div>\n ))}\n </div>\n\n {/* Footer */}\n <div\n style={{\n padding: \"0.5rem 1rem\",\n borderTop: \"1px solid #e0e0e0\",\n display: \"flex\",\n gap: \"1rem\",\n fontSize: \"0.75rem\",\n color: \"#666\",\n }}\n >\n <span>↑↓ Navigate</span>\n <span>↵ Select</span>\n <span>Esc Close</span>\n </div>\n </div>\n </>\n );\n}\n\nexport default CommandPalette;\n","import { useLogout, useMenu } from \"@refinedev/core\";\nimport { NavLink } from \"react-router\";\n\nexport const Menu = () => {\n const { mutate: logout } = useLogout();\n const { menuItems } = useMenu();\n\n return (\n <nav className=\"menu\">\n <ul>\n {menuItems.map((item) => (\n <li key={item.key}>\n <NavLink to={item.route ?? \"/\"}>{item.label}</NavLink>\n </li>\n ))}\n </ul>\n <button onClick={() => logout()}>Logout</button>\n </nav>\n );\n};\n","import { useBreadcrumb } from \"@refinedev/core\";\nimport { Link } from \"react-router\";\n\nexport const Breadcrumb = () => {\n const { breadcrumbs } = useBreadcrumb();\n\n return (\n <ul className=\"breadcrumb\">\n {breadcrumbs.map((breadcrumb) => {\n return (\n <li key={`breadcrumb-${breadcrumb.label}`}>\n {breadcrumb.href ? (\n <Link to={breadcrumb.href}>{breadcrumb.label}</Link>\n ) : (\n <span>{breadcrumb.label}</span>\n )}\n </li>\n );\n })}\n </ul>\n );\n};\n","import React, { ReactNode } from \"react\";\n\nexport interface LayoutProps {\n /** Sidebar component or slot */\n sidebar: ReactNode;\n /** Navbar component or slot */\n navbar: ReactNode;\n /** Primary content */\n children: ReactNode;\n}\n\n/**\n * Standard Framework M Desk Layout\n * \n * Provides a responsive structure for the sidebar, navbar, and main content area.\n */\nexport const Layout: React.FC<LayoutProps> = ({ \n sidebar, \n navbar, \n children \n}) => {\n return (\n <div className=\"shell-layout\" style={{ display: \"flex\", height: \"100vh\", width: \"100%\", maxWidth: \"100vw\", overflow: \"hidden\" }}>\n {sidebar}\n <div className=\"shell-main\" style={{ flex: 1, display: \"flex\", flexDirection: \"column\", minWidth: 0 }}>\n {navbar}\n <main className=\"shell-content\" style={{ flex: 1, overflowY: \"auto\", padding: \"24px\" }}>\n {children}\n </main>\n </div>\n </div>\n );\n};\n","/**\n * useDocTypeMeta Hook\n *\n * Fetches and caches DocType metadata from /api/meta/{doctype}.\n * Uses React Query for aggressive caching.\n */\n\nimport { useQuery } from \"@tanstack/react-query\";\nimport { META_URL } from \"../constants\";\nimport type {\n DocTypeMeta,\n DocTypeSchema,\n DocTypePermissions,\n LayoutConfig,\n WorkflowConfig,\n} from \"./types\";\n\n/**\n * Fetch metadata for a DocType\n */\nasync function fetchDocTypeMeta(doctype: string): Promise<DocTypeMeta> {\n const response = await fetch(`${META_URL}/${doctype}`, {\n credentials: \"include\",\n });\n\n if (!response.ok) {\n const payload = (await response\n .json()\n .catch(() => ({ detail: response.statusText }))) as {\n detail?: string;\n message?: string;\n error?: string;\n };\n\n const backendMessage =\n payload.message || payload.detail || response.statusText;\n\n throw new Error(\n `Failed to fetch metadata for ${doctype}: ${backendMessage}`,\n );\n }\n\n return response.json();\n}\n\n/**\n * Return type for useDocTypeMeta hook\n */\nexport interface UseDocTypeMetaResult {\n /** JSON Schema for the DocType */\n schema: DocTypeSchema | undefined;\n /** Layout configuration for form rendering */\n layout: LayoutConfig | undefined;\n /** Permissions for current user */\n permissions: DocTypePermissions | undefined;\n /** Workflow configuration if applicable */\n workflow: WorkflowConfig | undefined;\n /** Full metadata object */\n meta: DocTypeMeta | undefined;\n /** Loading state */\n isLoading: boolean;\n /** Error if fetch failed */\n error: Error | null;\n /** Refetch function */\n refetch: () => void;\n}\n\n/**\n * Hook to fetch and cache DocType metadata\n *\n * @param doctype - Name of the DocType to fetch metadata for\n * @returns Metadata including schema, layout, permissions, and workflow\n *\n * @example\n * ```tsx\n * const { schema, layout, permissions, workflow } = useDocTypeMeta(\"Todo\");\n *\n * if (isLoading) return <Spinner />;\n * if (!permissions?.read) return <AccessDenied />;\n *\n * return <AutoForm schema={schema} layout={layout} />;\n * ```\n */\nexport function useDocTypeMeta(doctype: string): UseDocTypeMetaResult {\n const {\n data: meta,\n isLoading,\n error,\n refetch,\n } = useQuery<DocTypeMeta, Error>({\n queryKey: [\"doctype-meta\", doctype],\n queryFn: () => fetchDocTypeMeta(doctype),\n // Cache metadata aggressively - it rarely changes\n staleTime: 5 * 60 * 1000, // 5 minutes\n gcTime: 30 * 60 * 1000, // 30 minutes (formerly cacheTime)\n // Only fetch when doctype is provided\n enabled: Boolean(doctype),\n });\n\n return {\n schema: meta?.schema,\n layout: meta?.layout,\n permissions: meta?.permissions,\n workflow: meta?.workflow,\n meta,\n isLoading,\n error: error ?? null,\n refetch,\n };\n}\n\n/**\n * Hook to prefetch DocType metadata\n *\n * Useful for preloading metadata before navigation\n */\nexport function usePrefetchDocTypeMeta() {\n // Using a dummy query to access the query system\n useQuery({\n queryKey: [\"prefetch-helper\"],\n queryFn: () => null,\n enabled: false,\n });\n\n return {\n prefetch: (doctype: string) => {\n // Access queryClient from context would be better,\n // but this works for simple prefetching\n fetchDocTypeMeta(doctype).catch(() => {\n // Silently fail prefetch\n });\n },\n };\n}\n","/**\n * useDocTypes Hook\n *\n * Fetches DocTypes from the backend API and converts them to Refine resources.\n * Used to dynamically populate the sidebar with available DocTypes.\n */\n\nimport { useState, useEffect } from \"react\";\n\n/**\n * DocType metadata from API\n */\nexport interface DocTypeMeta {\n name: string;\n module: string;\n label: string;\n is_child_table: boolean;\n api_resource: boolean;\n show_in_desk: boolean; // Whether to show in Desk UI\n}\n\n/**\n * Refine resource configuration\n */\nexport interface RefineResource {\n name: string;\n list?: string;\n create?: string;\n edit?: string;\n show?: string;\n meta?: {\n label?: string;\n canDelete?: boolean;\n };\n}\n\n/**\n * Hook return type\n */\nexport interface UseDocTypesResult {\n /** Array of DocType metadata */\n doctypes: DocTypeMeta[];\n /** Array of Refine resources for dynamic routing */\n resources: RefineResource[];\n /** Loading state */\n isLoading: boolean;\n /** Error state */\n error: Error | null;\n /** Refetch function */\n refetch: () => Promise<void>;\n}\n\n/**\n * API response format\n */\ninterface DocTypesResponse {\n doctypes: DocTypeMeta[];\n count: number;\n}\n\n/**\n * Fetch DocTypes from Backend API\n *\n * Fetches all registered DocTypes from /api/meta/doctypes and converts\n * them to Refine resource format for use in the application.\n *\n * @returns Object containing doctypes, resources, loading state, and error\n *\n * @example\n * ```tsx\n * const { resources, isLoading, error } = useDocTypes();\n *\n * if (isLoading) return <Spinner />;\n *\n * return <Refine resources={resources}>...</Refine>;\n * ```\n */\nexport function useDocTypes(): UseDocTypesResult {\n const [doctypes, setDocTypes] = useState<DocTypeMeta[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchDocTypes = async () => {\n try {\n setIsLoading(true);\n setError(null);\n\n const response = await fetch(\"/api/meta/doctypes\");\n\n if (!response.ok) {\n throw new Error(`Failed to fetch DocTypes: ${response.statusText}`);\n }\n\n const data: DocTypesResponse = await response.json();\n setDocTypes(data.doctypes);\n } catch (err) {\n console.error(\"Error fetching DocTypes:\", err);\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n setIsLoading(false);\n }\n };\n\n useEffect(() => {\n fetchDocTypes();\n }, []);\n\n // Convert DocTypes to Refine resources\n const resources: RefineResource[] = doctypes\n .filter(dt => dt.api_resource && dt.show_in_desk) // Only visible DocTypes with CRUD APIs\n .map(dt => ({\n name: dt.name,\n list: `/app/${dt.name}/list`,\n create: `/app/${dt.name}/new`,\n edit: `/app/${dt.name}/edit/:id`,\n show: `/app/${dt.name}/detail/:id`,\n meta: {\n label: dt.label,\n canDelete: true,\n },\n }));\n\n return {\n doctypes,\n resources,\n isLoading,\n error,\n refetch: fetchDocTypes,\n };\n}\n\nexport default useDocTypes;\n","/**\n * useInlineEdit Hook\n *\n * Hook for managing inline edit state in tables.\n * Per checklist 5.2: Inline Editing.\n */\n\nimport { useState, useCallback } from \"react\";\nimport { useUpdate } from \"@refinedev/core\";\n\n/**\n * Cell being edited\n */\nexport interface EditingCell {\n rowId: string;\n field: string;\n originalValue: unknown;\n}\n\n/**\n * Hook options\n */\nexport interface UseInlineEditOptions {\n /** Resource/DocType name */\n resource: string;\n /** Callback after successful save */\n onSaveSuccess?: () => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\n/**\n * Hook return type\n */\nexport interface UseInlineEditReturn {\n /** Currently editing cell */\n editingCell: EditingCell | null;\n /** Start editing a cell */\n startEdit: (rowId: string, field: string, value: unknown) => void;\n /** Cancel current edit */\n cancelEdit: () => void;\n /** Save current edit */\n saveEdit: (value: unknown) => Promise<void>;\n /** Check if a cell is being edited */\n isEditing: (rowId: string, field: string) => boolean;\n /** Whether save is in progress */\n isSaving: boolean;\n /** Current error */\n error: string | null;\n}\n\n/**\n * useInlineEdit Hook\n *\n * @example\n * ```tsx\n * const { editingCell, startEdit, saveEdit, isEditing, isSaving } = useInlineEdit({\n * resource: \"Customer\",\n * onSaveSuccess: () => refetch(),\n * });\n *\n * // In table cell\n * {isEditing(row.id, \"name\") ? (\n * <input onBlur={(e) => saveEdit(e.target.value)} />\n * ) : (\n * <div onClick={() => startEdit(row.id, \"name\", row.name)}>{row.name}</div>\n * )}\n * ```\n */\nexport function useInlineEdit({\n resource,\n onSaveSuccess,\n onError,\n}: UseInlineEditOptions): UseInlineEditReturn {\n const [editingCell, setEditingCell] = useState<EditingCell | null>(null);\n const [error, setError] = useState<string | null>(null);\n \n const updateMutation = useUpdate();\n\n const startEdit = useCallback((rowId: string, field: string, value: unknown) => {\n setEditingCell({ rowId, field, originalValue: value });\n setError(null);\n }, []);\n\n const cancelEdit = useCallback(() => {\n setEditingCell(null);\n setError(null);\n }, []);\n\n const saveEdit = useCallback(async (value: unknown) => {\n if (!editingCell) return;\n\n // Skip if value unchanged\n if (value === editingCell.originalValue) {\n setEditingCell(null);\n return;\n }\n\n return new Promise<void>((resolve, reject) => {\n updateMutation.mutate(\n {\n resource,\n id: editingCell.rowId,\n values: { [editingCell.field]: value },\n },\n {\n onSuccess: () => {\n setEditingCell(null);\n setError(null);\n onSaveSuccess?.();\n resolve();\n },\n onError: (err) => {\n const errorMsg = err.message || \"Save failed\";\n setError(errorMsg);\n onError?.(new Error(errorMsg));\n reject(new Error(errorMsg));\n },\n }\n );\n });\n }, [editingCell, resource, updateMutation, onSaveSuccess, onError]);\n\n const isEditing = useCallback((rowId: string, field: string) => {\n return editingCell?.rowId === rowId && editingCell?.field === field;\n }, [editingCell]);\n\n const isSaving = updateMutation.mutation.isPending;\n\n return {\n editingCell,\n startEdit,\n cancelEdit,\n saveEdit,\n isEditing,\n isSaving,\n error,\n };\n}\n","/**\n * useBulkActions Hook\n *\n * Hook for managing bulk operations on table rows.\n * Per checklist 5.3: Bulk Operations.\n */\n\nimport { useState, useCallback, useMemo } from \"react\";\nimport { useDeleteMany, useUpdateMany } from \"@refinedev/core\";\n\n/**\n * Row item type\n */\nexport interface BulkItem {\n id: string;\n [key: string]: unknown;\n}\n\n/**\n * Hook options\n */\nexport interface UseBulkActionsOptions<T extends BulkItem = BulkItem> {\n /** Resource/DocType name */\n resource: string;\n /** All available items */\n items: T[];\n /** Callback after successful bulk action */\n onSuccess?: () => void;\n /** Callback on error */\n onError?: (error: Error) => void;\n}\n\n/**\n * Hook return type\n */\nexport interface UseBulkActionsReturn<T extends BulkItem = BulkItem> {\n /** Selected row IDs */\n selectedIds: Set<string>;\n /** Selected items */\n selectedItems: T[];\n /** Number of selected items */\n selectedCount: number;\n /** Whether all items are selected */\n isAllSelected: boolean;\n /** Whether some items are selected */\n isSomeSelected: boolean;\n /** Select a single row */\n selectRow: (id: string) => void;\n /** Deselect a single row */\n deselectRow: (id: string) => void;\n /** Toggle a single row */\n toggleRow: (id: string) => void;\n /** Select all rows */\n selectAll: () => void;\n /** Deselect all rows */\n deselectAll: () => void;\n /** Toggle all rows */\n toggleAll: () => void;\n /** Check if a row is selected */\n isSelected: (id: string) => boolean;\n /** Bulk delete selected rows */\n bulkDelete: () => Promise<void>;\n /** Bulk update selected rows */\n bulkUpdate: (values: Record<string, unknown>) => Promise<void>;\n /** Export selected rows as JSON */\n exportAsJson: () => void;\n /** Export selected rows as CSV */\n exportAsCsv: (fields: string[]) => void;\n /** Whether bulk action is in progress */\n isLoading: boolean;\n}\n\n/**\n * useBulkActions Hook\n *\n * @example\n * ```tsx\n * const {\n * selectedIds, toggleRow, toggleAll, isAllSelected,\n * bulkDelete, bulkUpdate, exportAsCsv\n * } = useBulkActions({\n * resource: \"Customer\",\n * items: data,\n * onSuccess: () => refetch(),\n * });\n * ```\n */\nexport function useBulkActions<T extends BulkItem = BulkItem>({\n resource,\n items,\n onSuccess,\n onError,\n}: UseBulkActionsOptions<T>): UseBulkActionsReturn<T> {\n const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set());\n\n const deleteMutation = useDeleteMany();\n const updateMutation = useUpdateMany();\n\n // Derived state\n const selectedItems = useMemo(\n () => items.filter((item) => selectedIds.has(item.id)),\n [items, selectedIds]\n );\n\n const selectedCount = selectedIds.size;\n const isAllSelected = items.length > 0 && selectedIds.size === items.length;\n const isSomeSelected = selectedIds.size > 0 && selectedIds.size < items.length;\n\n // Selection actions\n const selectRow = useCallback((id: string) => {\n setSelectedIds((prev) => new Set(prev).add(id));\n }, []);\n\n const deselectRow = useCallback((id: string) => {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n next.delete(id);\n return next;\n });\n }, []);\n\n const toggleRow = useCallback((id: string) => {\n setSelectedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }, []);\n\n const selectAll = useCallback(() => {\n setSelectedIds(new Set(items.map((item) => item.id)));\n }, [items]);\n\n const deselectAll = useCallback(() => {\n setSelectedIds(new Set());\n }, []);\n\n const toggleAll = useCallback(() => {\n if (isAllSelected) {\n deselectAll();\n } else {\n selectAll();\n }\n }, [isAllSelected, selectAll, deselectAll]);\n\n const isSelected = useCallback((id: string) => selectedIds.has(id), [selectedIds]);\n\n // Bulk delete\n const bulkDelete = useCallback(async () => {\n if (selectedIds.size === 0) return;\n\n return new Promise<void>((resolve, reject) => {\n deleteMutation.mutate(\n {\n resource,\n ids: Array.from(selectedIds),\n },\n {\n onSuccess: () => {\n deselectAll();\n onSuccess?.();\n resolve();\n },\n onError: (err) => {\n onError?.(new Error(err.message || \"Delete failed\"));\n reject(err);\n },\n }\n );\n });\n }, [resource, selectedIds, deleteMutation, deselectAll, onSuccess, onError]);\n\n // Bulk update\n const bulkUpdate = useCallback(async (values: Record<string, unknown>) => {\n if (selectedIds.size === 0) return;\n\n return new Promise<void>((resolve, reject) => {\n updateMutation.mutate(\n {\n resource,\n ids: Array.from(selectedIds),\n values,\n },\n {\n onSuccess: () => {\n deselectAll();\n onSuccess?.();\n resolve();\n },\n onError: (err) => {\n onError?.(new Error(err.message || \"Update failed\"));\n reject(err);\n },\n }\n );\n });\n }, [resource, selectedIds, updateMutation, deselectAll, onSuccess, onError]);\n\n // Export as JSON\n const exportAsJson = useCallback(() => {\n const data = JSON.stringify(selectedItems, null, 2);\n const blob = new Blob([data], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `${resource}_export.json`;\n a.click();\n URL.revokeObjectURL(url);\n }, [resource, selectedItems]);\n\n // Export as CSV\n const exportAsCsv = useCallback((fields: string[]) => {\n const header = fields.join(\",\");\n const rows = selectedItems.map((item) =>\n fields.map((f) => {\n const val = item[f];\n if (val === null || val === undefined) return \"\";\n const str = String(val);\n // Escape quotes and wrap in quotes if contains comma\n if (str.includes(\",\") || str.includes('\"') || str.includes(\"\\n\")) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n return str;\n }).join(\",\")\n );\n const csv = [header, ...rows].join(\"\\n\");\n const blob = new Blob([csv], { type: \"text/csv\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `${resource}_export.csv`;\n a.click();\n URL.revokeObjectURL(url);\n }, [resource, selectedItems]);\n\n const isLoading = deleteMutation.mutation.isPending || updateMutation.mutation.isPending;\n\n return {\n selectedIds,\n selectedItems,\n selectedCount,\n isAllSelected,\n isSomeSelected,\n selectRow,\n deselectRow,\n toggleRow,\n selectAll,\n deselectAll,\n toggleAll,\n isSelected,\n bulkDelete,\n bulkUpdate,\n exportAsJson,\n exportAsCsv,\n isLoading,\n };\n}\n","/**\n * useCommandPalette Hook\n *\n * Hook for managing global command palette state and keyboard shortcut.\n * Per checklist 6.5: Global Command Palette.\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\n\n/**\n * Hook return type\n */\nexport interface UseCommandPaletteReturn {\n /** Whether palette is open */\n isOpen: boolean;\n /** Open the palette */\n open: () => void;\n /** Close the palette */\n close: () => void;\n /** Toggle the palette */\n toggle: () => void;\n}\n\n/**\n * useCommandPalette Hook\n *\n * Listens for Ctrl+K (or Cmd+K on Mac) to toggle command palette.\n *\n * @example\n * ```tsx\n * const { isOpen, close } = useCommandPalette();\n *\n * return <CommandPalette open={isOpen} onClose={close} />;\n * ```\n */\nexport function useCommandPalette(): UseCommandPaletteReturn {\n const [isOpen, setIsOpen] = useState(false);\n\n const open = useCallback(() => setIsOpen(true), []);\n const close = useCallback(() => setIsOpen(false), []);\n const toggle = useCallback(() => setIsOpen((prev) => !prev), []);\n\n // Listen for Ctrl+K / Cmd+K\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Ctrl+K on Windows/Linux, Cmd+K on Mac\n if ((e.ctrlKey || e.metaKey) && e.key === \"k\") {\n e.preventDefault();\n toggle();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [toggle]);\n\n return {\n isOpen,\n open,\n close,\n toggle,\n };\n}\n","import { useTranslation as useI18nTranslation } from \"react-i18next\";\n\n/**\n * Return type for useTranslation hook\n */\nexport interface UseTranslationResult {\n /** Translate a key with optional interpolation values */\n t: (key: string, options?: Record<string, unknown>) => string;\n /** Current language code (e.g., \"en\", \"hi\", \"ta\") */\n language: string;\n /** Change the current language */\n changeLanguage: (lng: string) => Promise<void>;\n /** Available languages */\n languages: readonly string[];\n /** Whether translations are ready/loaded */\n ready: boolean;\n}\n\n/**\n * Custom hook wrapper for react-i18next's useTranslation.\n *\n * Provides translation functions with app-specific defaults and utilities.\n *\n * @param namespace - Translation namespace (default: \"common\")\n * @returns Translation functions and state\n *\n * @example\n * ```tsx\n * const { t } = useTranslation();\n *\n * // Basic translation\n * <h1>{t(\"Welcome\")}</h1>\n *\n * // With interpolation\n * <p>{t(\"Hello, {{name}}!\", { name: \"John\" })}</p>\n * ```\n */\nexport function useTranslation(namespace = \"common\"): UseTranslationResult {\n const { t, i18n, ready } = useI18nTranslation(namespace);\n\n return {\n t: t as (key: string, options?: Record<string, unknown>) => string,\n language: i18n.language,\n changeLanguage: (lng: string) => i18n.changeLanguage(lng) as unknown as Promise<void>,\n languages: i18n.languages,\n ready,\n };\n}\n","/**\n * UIMeta — Unified UI Metadata hook for Framework M.\n *\n * Fetches and caches the UIMeta for a DocType from the backend API.\n * UIMeta is a single object that encapsulates form layout, list columns,\n * and additional view configurations (Kanban, Tree, Calendar) — replacing\n * the old FormMeta/ListMeta split.\n *\n * Defined in line with Phase 14 (ADR: Unified UIMeta Structure, Phase 14 §6.1):\n * - `form`: Layout sections and tabs for the form view.\n * - `list`: Columns, sorting, and row-level styling for the list view.\n * - `additional_views`: Kanban, Tree, Calendar configurations.\n * - Plugin adapters can extend UIMeta with custom namespaces (e.g., WMSMeta).\n *\n * @example\n * ```tsx\n * const { uiMeta, isLoading } = useUIMeta(\"SalesInvoice\");\n * if (uiMeta?.list?.columns) { ... }\n * ```\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\n\n/** A single form section with a label and ordered field names. */\nexport interface FormSection {\n label: string;\n fields: string[];\n collapsible?: boolean;\n columns?: 1 | 2 | 3;\n}\n\n/** A tab containing multiple form sections. */\nexport interface FormTab {\n label: string;\n sections: FormSection[];\n}\n\n/** Form view configuration: tabs and/or flat sections. */\nexport interface FormMeta {\n tabs?: FormTab[];\n sections?: FormSection[];\n}\n\n/** A single column in the list view. */\nexport interface ListColumn {\n field: string;\n label?: string;\n width?: number | string;\n sortable?: boolean;\n visible?: boolean;\n}\n\n/** List view configuration: columns, default sort, row styling. */\nexport interface ListMeta {\n columns: ListColumn[];\n defaultSort?: { field: string; direction: \"asc\" | \"desc\" };\n /** JMESPath expression for row color (e.g. \"status == 'Overdue'\") */\n rowColorExpr?: string;\n rowColorValue?: string;\n}\n\n/** Kanban column definition. */\nexport interface KanbanConfig {\n groupByField: string;\n cardTitleField: string;\n cardSubtitleField?: string;\n swimlaneField?: string;\n}\n\n/** Tree view definition. */\nexport interface TreeConfig {\n parentField: string;\n labelField: string;\n orderField?: string;\n}\n\n/** Calendar view definition. */\nexport interface CalendarConfig {\n startField: string;\n endField?: string;\n titleField: string;\n colorField?: string;\n}\n\n/** Additional (non-standard) views registered by plugins. */\nexport interface AdditionalViews {\n kanban?: KanbanConfig;\n tree?: TreeConfig;\n calendar?: CalendarConfig;\n /** Custom plugin-registered view namespaces (e.g. WMSMeta, MobileMeta) */\n [key: string]: unknown;\n}\n\n/**\n * Unified UI Metadata structure.\n *\n * A single object that all frontend views read from, replacing FormMeta/ListMeta.\n * The `/api/meta/:doctype` endpoint returns this as `ui_meta`.\n */\nexport interface UIMeta {\n doctype: string;\n form?: FormMeta;\n list?: ListMeta;\n additional_views?: AdditionalViews;\n}\n\nexport interface UseUIMetaResult {\n uiMeta: UIMeta | null;\n isLoading: boolean;\n error: string | null;\n refetch: () => void;\n}\n\n/** In-memory cache to avoid duplicate network requests. */\nconst uiMetaCache = new Map<string, UIMeta>();\n\nfunction resolveMetaBaseUrl(baseUrl: string): string {\n const trimmed = baseUrl.trim().replace(/\\/+$/, \"\");\n if (!trimmed) {\n return \"\";\n }\n\n // Refine's useApiUrl often provides \"/api/v1\" or \"https://host/api/v1\".\n // Meta endpoint is served from \"/api/meta\", so strip the API prefix.\n return trimmed.replace(/\\/api\\/v1$/i, \"\");\n}\n\n/**\n * Hook to fetch and cache UIMeta for a given DocType.\n *\n * Reads from `/api/meta/:doctype` (Backend Meta endpoint).\n * Falls back to a minimal UIMeta on error.\n * Plugin adapters may extend the `additional_views` namespace.\n */\nexport function useUIMeta(\n doctype: string,\n baseUrl: string = \"\",\n uiContext?: string,\n): UseUIMetaResult {\n const cacheKey = uiContext ? `${doctype}::${uiContext}` : doctype;\n const [uiMeta, setUiMeta] = useState<UIMeta | null>(\n () => uiMetaCache.get(cacheKey) ?? null,\n );\n const [isLoading, setIsLoading] = useState(!uiMetaCache.has(cacheKey));\n const [error, setError] = useState<string | null>(null);\n\n const fetchMeta = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const params = new URLSearchParams();\n if (uiContext?.trim()) {\n params.set(\"ui_context\", uiContext.trim().toLowerCase());\n }\n\n const queryString = params.toString();\n const metaBaseUrl = resolveMetaBaseUrl(baseUrl);\n const url = `${metaBaseUrl}/api/meta/${encodeURIComponent(doctype)}${queryString ? `?${queryString}` : \"\"}`;\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(\n `Failed to fetch meta for ${doctype}: ${response.status}`,\n );\n }\n const data: { ui_meta?: UIMeta } = await response.json();\n const meta: UIMeta = data.ui_meta ?? { doctype };\n uiMetaCache.set(cacheKey, meta);\n setUiMeta(meta);\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Unknown error\");\n // Provide minimal fallback so views don't break\n setUiMeta({ doctype });\n } finally {\n setIsLoading(false);\n }\n }, [baseUrl, cacheKey, doctype, uiContext]);\n\n useEffect(() => {\n if (!uiMetaCache.has(cacheKey)) {\n fetchMeta();\n }\n }, [cacheKey, fetchMeta]);\n\n return { uiMeta, isLoading, error, refetch: fetchMeta };\n}\n","/**\n * View Registry\n *\n * Registry for custom views (Kanban, Calendar, Gantt).\n * Per checklist 5.1: Register custom views in DocType Config.\n */\n\nimport type { ComponentType } from \"react\";\nimport type { ViewType, ViewProps, ViewRegistration } from \"./types\";\n\n// Registry of view components\nconst viewRegistry = new Map<ViewType, ViewRegistration>();\n\n// DocType-specific view configs (which views are enabled per doctype)\nconst doctypeViews = new Map<string, ViewType[]>();\n\n/**\n * Register a view type\n */\nexport function registerView(registration: ViewRegistration): void {\n viewRegistry.set(registration.type, registration);\n}\n\n/**\n * Get a view component by type\n */\nexport function getViewComponent(type: ViewType): ComponentType<ViewProps> | undefined {\n return viewRegistry.get(type)?.component;\n}\n\n/**\n * Get all registered views\n */\nexport function getRegisteredViews(): ViewRegistration[] {\n return Array.from(viewRegistry.values());\n}\n\n/**\n * Get view registration by type\n */\nexport function getViewRegistration(type: ViewType): ViewRegistration | undefined {\n return viewRegistry.get(type);\n}\n\n/**\n * Set available views for a DocType\n */\nexport function setDocTypeViews(doctype: string, views: ViewType[]): void {\n doctypeViews.set(doctype, views);\n}\n\n/**\n * Get available views for a DocType\n * Returns default ['list'] if not configured\n */\nexport function getDocTypeViews(doctype: string): ViewType[] {\n return doctypeViews.get(doctype) ?? [\"list\"];\n}\n\n/**\n * Check if a view type is available for a DocType\n */\nexport function isViewAvailable(doctype: string, viewType: ViewType): boolean {\n const views = getDocTypeViews(doctype);\n return views.includes(viewType);\n}\n","/**\n * KanbanView — Enhanced Kanban board for state-based DocTypes.\n *\n * Improvements over the basic version:\n * - **Quick Edit modal**: Click a card to open inline edit (title + description)\n * - **Dynamic column discovery**: Auto-generates columns from actual data values\n * when no columns are configured in KanbanConfig\n * - **Grouping by any Select/Link field**: `groupField` is fully configurable\n * - Full keyboard accessibility and CSS-variable theming\n */\n\nimport { useState, useMemo, useCallback } from \"react\";\nimport { useList, useUpdate } from \"@refinedev/core\";\nimport type { ViewProps, KanbanConfig, KanbanColumn } from \"./types\";\n\nexport interface KanbanViewProps extends ViewProps {\n config: KanbanConfig;\n}\n\n/** Dragged item state */\ninterface DragState {\n item: KanbanItem;\n sourceColumn: string;\n}\n\ninterface KanbanItem {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/** Quick Edit modal — inline edit of a Kanban card */\nfunction QuickEditModal({\n item,\n resource,\n titleField,\n descField,\n groupField,\n columns,\n onClose,\n onSaved,\n}: {\n item: KanbanItem;\n resource: string;\n titleField: string;\n descField?: string;\n groupField: string;\n columns: KanbanColumn[];\n onClose: () => void;\n onSaved: () => void;\n}) {\n const [title, setTitle] = useState(String(item[titleField] ?? item.name));\n const [desc, setDesc] = useState(\n descField ? String(item[descField] ?? \"\") : \"\",\n );\n const [status, setStatus] = useState(\n String(item[groupField] ?? columns[0]?.id ?? \"\"),\n );\n const [saving, setSaving] = useState(false);\n\n const { mutate: updateItem } = useUpdate();\n\n const handleSave = useCallback(() => {\n setSaving(true);\n const values: Record<string, unknown> = {\n [titleField]: title,\n [groupField]: status,\n };\n if (descField) values[descField] = desc;\n\n updateItem(\n { resource, id: item.id, values },\n {\n onSuccess: () => {\n setSaving(false);\n onSaved();\n onClose();\n },\n onError: () => setSaving(false),\n },\n );\n }, [\n title,\n desc,\n status,\n titleField,\n descField,\n groupField,\n resource,\n item.id,\n updateItem,\n onSaved,\n onClose,\n ]);\n\n // Close on Escape\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n },\n [onClose],\n );\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={`Edit ${String(item[titleField] ?? item.name)}`}\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 1000,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(0,0,0,0.45)\",\n }}\n onClick={onClose}\n onKeyDown={handleKeyDown}\n >\n <div\n onClick={e => e.stopPropagation()}\n style={{\n background: \"var(--color-bg)\",\n border: \"1px solid var(--color-border)\",\n borderRadius: \"var(--radius-lg)\",\n padding: \"var(--spacing-lg)\",\n width: 420,\n maxWidth: \"90vw\",\n boxShadow: \"var(--shadow-lg)\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: \"var(--spacing-md)\",\n }}\n >\n <h3 style={{ margin: 0, fontSize: \"1rem\", fontWeight: 600 }}>\n Quick Edit\n </h3>\n <button\n onClick={onClose}\n aria-label=\"Close\"\n className=\"btn btn-ghost\"\n style={{ padding: \"0.25rem 0.5rem\", minHeight: \"unset\" }}\n >\n ✕\n </button>\n </div>\n\n {/* Title field */}\n <label\n style={{\n display: \"block\",\n fontSize: \"0.75rem\",\n fontWeight: 500,\n color: \"var(--color-text-muted)\",\n marginBottom: \"0.25rem\",\n }}\n >\n {titleField}\n </label>\n <input\n value={title}\n onChange={e => setTitle(e.target.value)}\n style={{ width: \"100%\", marginBottom: \"var(--spacing-sm)\" }}\n autoFocus\n />\n\n {/* Status/Group field */}\n <label\n style={{\n display: \"block\",\n fontSize: \"0.75rem\",\n fontWeight: 500,\n color: \"var(--color-text-muted)\",\n marginBottom: \"0.25rem\",\n }}\n >\n {groupField}\n </label>\n <select\n value={status}\n onChange={e => setStatus(e.target.value)}\n style={{ width: \"100%\", marginBottom: \"var(--spacing-sm)\" }}\n >\n {columns.map(col => (\n <option key={col.id} value={col.id}>\n {col.title}\n </option>\n ))}\n </select>\n\n {/* Description field (if configured) */}\n {descField && (\n <>\n <label\n style={{\n display: \"block\",\n fontSize: \"0.75rem\",\n fontWeight: 500,\n color: \"var(--color-text-muted)\",\n marginBottom: \"0.25rem\",\n }}\n >\n {descField}\n </label>\n <textarea\n value={desc}\n onChange={e => setDesc(e.target.value)}\n rows={3}\n style={{\n width: \"100%\",\n marginBottom: \"var(--spacing-md)\",\n resize: \"vertical\",\n }}\n />\n </>\n )}\n\n <div\n style={{\n display: \"flex\",\n gap: \"var(--spacing-sm)\",\n justifyContent: \"flex-end\",\n }}\n >\n <button className=\"btn\" onClick={onClose}>\n Cancel\n </button>\n <button\n className={`btn btn-primary${saving ? \" btn-loading\" : \"\"}`}\n onClick={handleSave}\n disabled={saving}\n >\n {saving ? \"\" : \"Save\"}\n </button>\n </div>\n </div>\n </div>\n );\n}\n\n/**\n * KanbanView — Full-featured Kanban board.\n *\n * Features:\n * - Drag cards between columns to update the group field\n * - Click a card to Quick Edit (title, description, status)\n * - Auto-discover columns from live data if none configured\n * - Group by any Select/Link field via `config.groupField`\n */\nexport function KanbanView({ resource, config }: KanbanViewProps) {\n const groupField = config.groupField ?? \"status\";\n const titleField = config.titleField ?? \"name\";\n const descField = config.descriptionField;\n\n const [dragState, setDragState] = useState<DragState | null>(null);\n const [dragOverColumn, setDragOverColumn] = useState<string | null>(null);\n const [editingItem, setEditingItem] = useState<KanbanItem | null>(null);\n\n // Fetch all items (up to 200 for Kanban)\n const { result, query } = useList<KanbanItem>({\n resource,\n pagination: { pageSize: 200 },\n });\n const items = result?.data ?? [];\n const isLoading = query?.isLoading ?? false;\n\n const { mutate: updateItem } = useUpdate();\n\n // Auto-discover columns from data if none configured\n const columns: KanbanColumn[] = useMemo(() => {\n if (config.columns && config.columns.length > 0) return config.columns;\n // Discover unique values from data\n const seen = new Set<string>();\n const discovered: KanbanColumn[] = [];\n const COLUMN_COLORS = [\n \"#e0e0e0\",\n \"#faad14\",\n \"#52c41a\",\n \"#ff4d4f\",\n \"#1890ff\",\n \"#722ed1\",\n ];\n for (const item of items) {\n const val = String(item[groupField] ?? \"\");\n if (val && !seen.has(val)) {\n seen.add(val);\n discovered.push({\n id: val,\n title: val.charAt(0).toUpperCase() + val.slice(1).replace(/_/g, \" \"),\n color: COLUMN_COLORS[discovered.length % COLUMN_COLORS.length],\n });\n }\n }\n return discovered.length > 0\n ? discovered\n : [\n { id: \"draft\", title: \"Draft\", color: \"#e0e0e0\" },\n { id: \"pending\", title: \"Pending\", color: \"#faad14\" },\n { id: \"approved\", title: \"Approved\", color: \"#52c41a\" },\n { id: \"rejected\", title: \"Rejected\", color: \"#ff4d4f\" },\n ];\n }, [config.columns, items, groupField]);\n\n // Group items by column\n const groupedItems = useMemo(() => {\n const groups: Record<string, KanbanItem[]> = {};\n for (const col of columns) groups[col.id] = [];\n\n for (const item of items) {\n const key = String(item[groupField] ?? \"\");\n if (key in groups) {\n groups[key].push(item);\n } else {\n // Fallback: first column\n const first = columns[0]?.id;\n if (first) groups[first]?.push(item);\n }\n }\n return groups;\n }, [items, columns, groupField]);\n\n const handleDrop = useCallback(\n (targetColumnId: string) => {\n if (!dragState || dragState.sourceColumn === targetColumnId) {\n setDragState(null);\n setDragOverColumn(null);\n return;\n }\n updateItem(\n {\n resource,\n id: dragState.item.id,\n values: { [groupField]: targetColumnId },\n },\n {\n onSuccess: () => {\n void query?.refetch?.();\n },\n },\n );\n setDragState(null);\n setDragOverColumn(null);\n },\n [dragState, resource, groupField, updateItem, query],\n );\n\n if (isLoading) {\n return (\n <div\n style={{\n padding: \"var(--spacing-xl)\",\n textAlign: \"center\",\n color: \"var(--color-text-muted)\",\n }}\n >\n <div\n className=\"skeleton skeleton-heading\"\n style={{ margin: \"0 auto 1rem\", width: 200 }}\n />\n <div style={{ display: \"flex\", gap: \"1rem\", padding: \"1rem\" }}>\n {[1, 2, 3].map(i => (\n <div\n key={i}\n style={{\n flex: \"0 0 280px\",\n background: \"var(--color-bg-tertiary)\",\n borderRadius: \"var(--radius-lg)\",\n padding: \"1rem\",\n }}\n >\n <div\n className=\"skeleton skeleton-heading\"\n style={{ marginBottom: \"0.5rem\" }}\n />\n {[1, 2].map(j => (\n <div\n key={j}\n className=\"skeleton\"\n style={{\n height: 72,\n marginBottom: \"0.5rem\",\n borderRadius: \"var(--radius-md)\",\n }}\n />\n ))}\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <>\n {editingItem && (\n <QuickEditModal\n item={editingItem}\n resource={resource}\n titleField={titleField}\n descField={descField}\n groupField={groupField}\n columns={columns}\n onClose={() => setEditingItem(null)}\n onSaved={() => {\n void query?.refetch?.();\n }}\n />\n )}\n\n <div\n role=\"region\"\n aria-label=\"Kanban board\"\n style={{\n display: \"flex\",\n gap: \"var(--spacing-md)\",\n padding: \"var(--spacing-md)\",\n overflowX: \"auto\",\n minHeight: 400,\n alignItems: \"flex-start\",\n }}\n >\n {columns.map(column => {\n const isOver = dragOverColumn === column.id;\n return (\n <div\n key={column.id}\n role=\"group\"\n aria-label={`${column.title} column`}\n onDragOver={e => {\n e.preventDefault();\n setDragOverColumn(column.id);\n }}\n onDragLeave={() => setDragOverColumn(null)}\n onDrop={() => handleDrop(column.id)}\n style={{\n flex: \"0 0 280px\",\n background: isOver\n ? \"var(--color-bg-tertiary)\"\n : \"var(--color-bg-secondary)\",\n borderRadius: \"var(--radius-lg)\",\n border: `2px solid ${isOver ? \"var(--color-primary)\" : \"transparent\"}`,\n display: \"flex\",\n flexDirection: \"column\",\n transition: \"border-color 0.15s ease, background 0.15s ease\",\n }}\n >\n {/* Column Header */}\n <div\n style={{\n padding: \"0.75rem 1rem\",\n borderBottom: `3px solid ${column.color ?? \"var(--color-primary)\"}`,\n fontWeight: 600,\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n borderRadius: \"var(--radius-lg) var(--radius-lg) 0 0\",\n }}\n >\n <span style={{ color: \"var(--color-text)\" }}>\n {column.title}\n </span>\n <span\n style={{\n fontSize: \"0.75rem\",\n color: \"var(--color-text-muted)\",\n background: \"var(--color-bg-tertiary)\",\n borderRadius: \"var(--radius-full, 9999px)\",\n padding: \"0.1rem 0.5rem\",\n fontWeight: 500,\n }}\n >\n {groupedItems[column.id]?.length ?? 0}\n </span>\n </div>\n\n {/* Cards */}\n <div\n style={{\n flex: 1,\n padding: \"var(--spacing-sm)\",\n overflowY: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"var(--spacing-sm)\",\n minHeight: 80,\n }}\n >\n {groupedItems[column.id]?.map(item => {\n const isDragging = dragState?.item.id === item.id;\n return (\n <div\n key={item.id}\n draggable\n role=\"button\"\n tabIndex={0}\n aria-label={`${String(item[titleField] ?? item.name)} — drag to reorder, press Enter to edit`}\n onDragStart={() =>\n setDragState({ item, sourceColumn: column.id })\n }\n onDragEnd={() => setDragState(null)}\n onClick={() => setEditingItem(item)}\n onKeyDown={e => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setEditingItem(item);\n }\n }}\n style={{\n padding: \"0.75rem\",\n background: \"var(--color-bg)\",\n borderRadius: \"var(--radius-md)\",\n boxShadow: \"var(--shadow-sm)\",\n cursor: \"grab\",\n opacity: isDragging ? 0.4 : 1,\n transform: isDragging ? \"scale(0.98)\" : undefined,\n transition:\n \"opacity 0.15s, box-shadow 0.15s, transform 0.15s\",\n border: \"1px solid var(--color-border)\",\n }}\n onMouseEnter={e => {\n (e.currentTarget as HTMLDivElement).style.boxShadow =\n \"var(--shadow-md)\";\n }}\n onMouseLeave={e => {\n (e.currentTarget as HTMLDivElement).style.boxShadow =\n \"var(--shadow-sm)\";\n }}\n >\n <div\n style={{\n fontWeight: 500,\n color: \"var(--color-text)\",\n fontSize: \"0.875rem\",\n marginBottom: descField ? \"0.25rem\" : 0,\n }}\n >\n {String(item[titleField] ?? item.name)}\n </div>\n {descField &&\n item[descField] !== undefined &&\n item[descField] !== null && (\n <div\n style={{\n fontSize: \"0.75rem\",\n color: \"var(--color-text-muted)\",\n lineHeight: 1.4,\n }}\n >\n {String(item[descField]).slice(0, 80)}\n {String(item[descField]).length > 80 ? \"…\" : \"\"}\n </div>\n )}\n <div\n style={{\n marginTop: \"0.5rem\",\n fontSize: \"0.7rem\",\n color: \"var(--color-text-muted)\",\n textAlign: \"right\",\n opacity: 0,\n transition: \"opacity 0.15s\",\n }}\n className=\"quick-edit-hint\"\n >\n Click to edit\n </div>\n </div>\n );\n })}\n\n {/* Empty column placeholder */}\n {groupedItems[column.id]?.length === 0 && (\n <div\n style={{\n padding: \"var(--spacing-lg)\",\n textAlign: \"center\",\n color: \"var(--color-text-muted)\",\n fontSize: \"0.75rem\",\n border: \"2px dashed var(--color-border)\",\n borderRadius: \"var(--radius-md)\",\n }}\n >\n Drop here\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </>\n );\n}\n\nexport default KanbanView;\n","/**\n * Calendar View Component\n *\n * Calendar view for date-based DocTypes.\n * Per checklist 5.1: Calendar view.\n */\n\nimport { useState, useMemo } from \"react\";\nimport { useList, useGo } from \"@refinedev/core\";\nimport type { ViewProps, CalendarConfig } from \"./types\";\n\n/**\n * Calendar view props\n */\nexport interface CalendarViewProps extends ViewProps {\n /** Calendar configuration */\n config: CalendarConfig;\n}\n\n/**\n * Calendar event item\n */\ninterface CalendarEvent {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/**\n * Get days in month\n */\nfunction getDaysInMonth(year: number, month: number): Date[] {\n const days: Date[] = [];\n const date = new Date(year, month, 1);\n \n while (date.getMonth() === month) {\n days.push(new Date(date));\n date.setDate(date.getDate() + 1);\n }\n \n return days;\n}\n\n/**\n * CalendarView Component\n */\nexport function CalendarView({ resource, config }: CalendarViewProps) {\n const startField = config.startField;\n const titleField = config.titleField;\n const go = useGo();\n\n // Current month state\n const [currentDate, setCurrentDate] = useState(new Date());\n const year = currentDate.getFullYear();\n const month = currentDate.getMonth();\n\n // Fetch events for current month\n const startOfMonth = new Date(year, month, 1).toISOString();\n const endOfMonth = new Date(year, month + 1, 0).toISOString();\n\n const { result: data, query } = useList<CalendarEvent>({\n resource,\n filters: [\n { field: startField, operator: \"gte\", value: startOfMonth },\n { field: startField, operator: \"lte\", value: endOfMonth },\n ],\n pagination: { pageSize: 100 },\n });\n\n // Get days in current month\n const days = useMemo(() => getDaysInMonth(year, month), [year, month]);\n\n // Group events by day\n const eventsByDay = useMemo(() => {\n const groups: Record<string, CalendarEvent[]> = {};\n \n if (data?.data) {\n for (const event of data.data) {\n const dateStr = String(event[startField] ?? \"\").split(\"T\")[0];\n if (dateStr) {\n if (!groups[dateStr]) groups[dateStr] = [];\n groups[dateStr].push(event);\n }\n }\n }\n \n return groups;\n }, [data, startField]);\n\n // Navigation\n const prevMonth = () => setCurrentDate(new Date(year, month - 1));\n const nextMonth = () => setCurrentDate(new Date(year, month + 1));\n const today = () => setCurrentDate(new Date());\n\n // Format month name\n const monthName = currentDate.toLocaleString(\"default\", { month: \"long\", year: \"numeric\" });\n\n // Day of week headers\n const weekDays = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n\n // First day of month offset\n const firstDayOffset = new Date(year, month, 1).getDay();\n\n const isLoading = query?.isLoading;\n\n if (isLoading) {\n return <div style={{ padding: \"2rem\" }}>Loading...</div>;\n }\n\n return (\n <div style={{ padding: \"1rem\" }}>\n {/* Header */}\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: \"1rem\",\n }}\n >\n <div style={{ display: \"flex\", gap: \"0.5rem\" }}>\n <button onClick={prevMonth} style={btnStyle}>← Prev</button>\n <button onClick={today} style={btnStyle}>Today</button>\n <button onClick={nextMonth} style={btnStyle}>Next →</button>\n </div>\n <h2 style={{ margin: 0 }}>{monthName}</h2>\n </div>\n\n {/* Calendar Grid */}\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(7, 1fr)\",\n gap: \"1px\",\n backgroundColor: \"#e0e0e0\",\n border: \"1px solid #e0e0e0\",\n borderRadius: \"4px\",\n overflow: \"hidden\",\n }}\n >\n {/* Day Headers */}\n {weekDays.map((day) => (\n <div\n key={day}\n style={{\n padding: \"0.5rem\",\n backgroundColor: \"#f5f5f5\",\n fontWeight: 600,\n textAlign: \"center\",\n fontSize: \"0.75rem\",\n }}\n >\n {day}\n </div>\n ))}\n\n {/* Empty cells for offset */}\n {Array.from({ length: firstDayOffset }).map((_, i) => (\n <div key={`empty-${i}`} style={{ backgroundColor: \"#fafafa\", minHeight: \"80px\" }} />\n ))}\n\n {/* Days */}\n {days.map((day) => {\n const dateStr = day.toISOString().split(\"T\")[0];\n const events = eventsByDay[dateStr] ?? [];\n const isToday = dateStr === new Date().toISOString().split(\"T\")[0];\n\n return (\n <div\n key={dateStr}\n style={{\n backgroundColor: \"white\",\n minHeight: \"80px\",\n padding: \"0.25rem\",\n }}\n >\n <div\n style={{\n fontSize: \"0.75rem\",\n fontWeight: isToday ? 600 : 400,\n color: isToday ? \"#1890ff\" : \"#333\",\n marginBottom: \"0.25rem\",\n }}\n >\n {day.getDate()}\n </div>\n {events.slice(0, 3).map((event) => (\n <div\n key={event.id}\n onClick={() => go({ to: `/app/${resource}/detail/${event.id}` })}\n style={{\n fontSize: \"0.7rem\",\n padding: \"0.125rem 0.25rem\",\n backgroundColor: \"#e6f7ff\",\n borderRadius: \"2px\",\n marginBottom: \"0.125rem\",\n cursor: \"pointer\",\n overflow: \"hidden\",\n whiteSpace: \"nowrap\",\n textOverflow: \"ellipsis\",\n }}\n >\n {String(event[titleField] ?? event.name)}\n </div>\n ))}\n {events.length > 3 && (\n <div style={{ fontSize: \"0.65rem\", color: \"#666\" }}>\n +{events.length - 3} more\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nconst btnStyle: React.CSSProperties = {\n padding: \"0.25rem 0.5rem\",\n backgroundColor: \"#f5f5f5\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n fontSize: \"0.75rem\",\n};\n\nexport default CalendarView;\n","/**\n * Gantt View Component\n *\n * Gantt chart view for project management.\n * Per checklist 5.1: Gantt view.\n */\n\nimport { useMemo } from \"react\";\nimport { useList, useGo } from \"@refinedev/core\";\nimport type { ViewProps, GanttConfig } from \"./types\";\n\n/**\n * Gantt view props\n */\nexport interface GanttViewProps extends ViewProps {\n /** Gantt configuration */\n config: GanttConfig;\n}\n\n/**\n * Gantt task item\n */\ninterface GanttTask {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n/**\n * Calculate date range for Gantt\n */\nfunction getDateRange(tasks: GanttTask[], startField: string, endField: string) {\n let minDate = new Date();\n let maxDate = new Date();\n\n for (const task of tasks) {\n const start = new Date(String(task[startField] ?? \"\"));\n const end = new Date(String(task[endField] ?? \"\"));\n if (!isNaN(start.getTime()) && start < minDate) minDate = start;\n if (!isNaN(end.getTime()) && end > maxDate) maxDate = end;\n }\n\n // Add padding\n minDate.setDate(minDate.getDate() - 7);\n maxDate.setDate(maxDate.getDate() + 7);\n\n return { minDate, maxDate };\n}\n\n/**\n * Get days between two dates\n */\nfunction getDaysBetween(start: Date, end: Date): number {\n return Math.ceil((end.getTime() - start.getTime()) / (1000 * 60 * 60 * 24));\n}\n\n/**\n * GanttView Component\n */\nexport function GanttView({ resource, config }: GanttViewProps) {\n const nameField = config.nameField ?? \"name\";\n const startField = config.startField;\n const endField = config.endField;\n const progressField = config.progressField;\n const go = useGo();\n\n // Fetch tasks\n const { result: data, query } = useList<GanttTask>({\n resource,\n pagination: { pageSize: 100 },\n sorters: [{ field: startField, order: \"asc\" }],\n });\n\n // Calculate date range and tasks\n const { tasks, minDate, maxDate, totalDays } = useMemo(() => {\n const tasks = data?.data ?? [];\n if (tasks.length === 0) {\n return { tasks: [], minDate: new Date(), maxDate: new Date(), totalDays: 30 };\n }\n\n const { minDate, maxDate } = getDateRange(tasks, startField, endField);\n const totalDays = getDaysBetween(minDate, maxDate);\n\n return { tasks, minDate, maxDate, totalDays };\n }, [data, startField, endField]);\n\n // Generate day headers\n const dayHeaders = useMemo(() => {\n const headers: Date[] = [];\n const current = new Date(minDate);\n while (current <= maxDate) {\n headers.push(new Date(current));\n current.setDate(current.getDate() + 1);\n }\n return headers;\n }, [minDate, maxDate]);\n\n const isLoading = query?.isLoading;\n\n if (isLoading) {\n return <div style={{ padding: \"2rem\" }}>Loading...</div>;\n }\n\n if (tasks.length === 0) {\n return <div style={{ padding: \"2rem\", color: \"#666\" }}>No tasks to display</div>;\n }\n\n const rowHeight = 36;\n const dayWidth = 30;\n\n return (\n <div style={{ padding: \"1rem\", overflowX: \"auto\" }}>\n <div style={{ display: \"flex\", minWidth: totalDays * dayWidth + 200 }}>\n {/* Task Names Column */}\n <div style={{ width: \"200px\", flexShrink: 0, borderRight: \"1px solid #e0e0e0\" }}>\n {/* Header */}\n <div\n style={{\n height: \"40px\",\n padding: \"0.5rem\",\n fontWeight: 600,\n borderBottom: \"1px solid #e0e0e0\",\n backgroundColor: \"#f5f5f5\",\n }}\n >\n Task\n </div>\n {/* Task rows */}\n {tasks.map((task) => (\n <div\n key={task.id}\n onClick={() => go({ to: `/app/${resource}/detail/${task.id}` })}\n style={{\n height: `${rowHeight}px`,\n padding: \"0.5rem\",\n borderBottom: \"1px solid #f0f0f0\",\n cursor: \"pointer\",\n overflow: \"hidden\",\n whiteSpace: \"nowrap\",\n textOverflow: \"ellipsis\",\n }}\n >\n {String(task[nameField] ?? task.name)}\n </div>\n ))}\n </div>\n\n {/* Gantt Chart */}\n <div style={{ flex: 1, overflow: \"hidden\" }}>\n {/* Day Headers */}\n <div style={{ display: \"flex\", height: \"40px\", backgroundColor: \"#f5f5f5\" }}>\n {dayHeaders.map((day, i) => (\n <div\n key={i}\n style={{\n width: `${dayWidth}px`,\n flexShrink: 0,\n borderRight: \"1px solid #e0e0e0\",\n borderBottom: \"1px solid #e0e0e0\",\n fontSize: \"0.65rem\",\n textAlign: \"center\",\n padding: \"0.25rem\",\n }}\n >\n {day.getDate()}\n </div>\n ))}\n </div>\n\n {/* Task Bars */}\n {tasks.map((task) => {\n const taskStart = new Date(String(task[startField] ?? \"\"));\n const taskEnd = new Date(String(task[endField] ?? \"\"));\n \n const startOffset = getDaysBetween(minDate, taskStart);\n const duration = getDaysBetween(taskStart, taskEnd);\n const progress = progressField ? Number(task[progressField] ?? 0) : 0;\n\n return (\n <div\n key={task.id}\n style={{\n height: `${rowHeight}px`,\n position: \"relative\",\n borderBottom: \"1px solid #f0f0f0\",\n }}\n >\n {/* Background grid */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n display: \"flex\",\n }}\n >\n {dayHeaders.map((_, i) => (\n <div\n key={i}\n style={{\n width: `${dayWidth}px`,\n flexShrink: 0,\n borderRight: \"1px solid #f0f0f0\",\n }}\n />\n ))}\n </div>\n\n {/* Task bar */}\n <div\n style={{\n position: \"absolute\",\n left: `${startOffset * dayWidth}px`,\n width: `${Math.max(duration, 1) * dayWidth}px`,\n top: \"4px\",\n height: `${rowHeight - 8}px`,\n backgroundColor: \"#e6f7ff\",\n border: \"1px solid #1890ff\",\n borderRadius: \"4px\",\n overflow: \"hidden\",\n }}\n >\n {/* Progress fill */}\n {progressField && (\n <div\n style={{\n height: \"100%\",\n width: `${progress}%`,\n backgroundColor: \"#1890ff\",\n opacity: 0.3,\n }}\n />\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n}\n\nexport default GanttView;\n","/**\n * TreeView — Hierarchical nested DocType view.\n *\n * Features:\n * - Renders a full nested tree from flat list data using `parent_field`\n * - Inline **Add Child** — click \"+\" at any node to add a child\n * - Inline **Rename** — double-click a label to rename in-place\n * - **Drag-and-drop reparenting** — drag nodes to a new parent\n * - Uses `/api/tree/:doctype` backend endpoints for data + mutations\n * - Keyboard accessible (arrow keys, Enter, Escape)\n */\n\nimport {\n useState,\n useCallback,\n useRef,\n useEffect,\n type KeyboardEvent,\n} from \"react\";\nimport type { ViewProps, TreeConfig } from \"./types\";\n\nexport interface TreeViewProps extends ViewProps {\n config: TreeConfig;\n}\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\ninterface TreeNode {\n id: string;\n label: string;\n data: Record<string, unknown>;\n children: TreeNode[];\n}\n\ninterface TreeState {\n tree: TreeNode[];\n loading: boolean;\n error: string | null;\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\nconst BASE_URL = import.meta.env?.VITE_BACKEND_URL ?? \"\";\n\nasync function fetchTree(doctype: string): Promise<TreeNode[]> {\n const res = await fetch(\n `${BASE_URL}/api/tree/${encodeURIComponent(doctype)}`,\n );\n if (!res.ok) throw new Error(`Failed to fetch tree: ${res.status}`);\n const json = (await res.json()) as { tree: TreeNode[] };\n return json.tree;\n}\n\nasync function reparentNode(\n doctype: string,\n nodeId: string,\n newParent: string | null,\n): Promise<void> {\n await updateNode(doctype, nodeId, { parent: newParent });\n}\n\nasync function updateNode(\n doctype: string,\n nodeId: string,\n values: { parent?: string | null; label?: string },\n): Promise<void> {\n const res = await fetch(\n `${BASE_URL}/api/tree/${encodeURIComponent(doctype)}/${encodeURIComponent(nodeId)}`,\n {\n method: \"PATCH\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(values),\n },\n );\n if (!res.ok) throw new Error(`Update failed: ${res.status}`);\n}\n\nasync function addChildNode(\n doctype: string,\n parentId: string | null,\n label: string,\n): Promise<void> {\n const res = await fetch(\n `${BASE_URL}/api/tree/${encodeURIComponent(doctype)}/add-child`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ parent: parentId, label }),\n },\n );\n if (!res.ok) throw new Error(`Add child failed: ${res.status}`);\n}\n\n// ── Inline Rename Input ────────────────────────────────────────────────────\n\nfunction InlineInput({\n initialValue,\n onConfirm,\n onCancel,\n}: Readonly<{\n initialValue: string;\n onConfirm: (value: string) => void;\n onCancel: () => void;\n}>) {\n const [value, setValue] = useState(initialValue);\n const ref = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n ref.current?.focus();\n ref.current?.select();\n }, []);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") onConfirm(value.trim() || initialValue);\n if (e.key === \"Escape\") onCancel();\n };\n\n return (\n <input\n ref={ref}\n value={value}\n onChange={e => setValue(e.target.value)}\n onBlur={() => onConfirm(value.trim() || initialValue)}\n onKeyDown={handleKeyDown}\n style={{\n fontSize: \"0.875rem\",\n padding: \"0.125rem 0.375rem\",\n border: \"1px solid var(--color-primary)\",\n borderRadius: \"var(--radius-sm)\",\n background: \"var(--color-bg)\",\n color: \"var(--color-text)\",\n outline: \"none\",\n minWidth: 160,\n }}\n aria-label=\"Rename node\"\n />\n );\n}\n\n// ── Single Tree Node ───────────────────────────────────────────────────────\n\nfunction TreeNodeRow({\n node,\n depth,\n doctype,\n onRefresh,\n dragNodeId,\n onDragStart,\n onDrop,\n}: Readonly<{\n node: TreeNode;\n depth: number;\n doctype: string;\n onRefresh: () => void;\n dragNodeId: string | null;\n onDragStart: (id: string) => void;\n onDrop: (targetId: string | null) => void;\n}>) {\n const [collapsed, setCollapsed] = useState(false);\n const [renaming, setRenaming] = useState(false);\n const [addingChild, setAddingChild] = useState(false);\n const [isDropTarget, setIsDropTarget] = useState(false);\n const isDragging = dragNodeId === node.id;\n\n const handleRename = useCallback(\n async (newLabel: string) => {\n setRenaming(false);\n if (newLabel === node.label) return;\n try {\n await updateNode(doctype, node.id, { label: newLabel });\n onRefresh();\n } catch {\n // Silently revert on error\n }\n },\n [doctype, node.id, node.label, onRefresh],\n );\n\n const handleAddChild = useCallback(\n async (label: string) => {\n setAddingChild(false);\n if (!label.trim()) return;\n try {\n await addChildNode(doctype, node.id, label);\n setCollapsed(false);\n onRefresh();\n } catch {\n // Silently fail — UI remains consistent\n }\n },\n [doctype, node.id, onRefresh],\n );\n\n const hasChildren = node.children.length > 0;\n let toggleGlyph = \"•\";\n if (hasChildren) {\n toggleGlyph = collapsed ? \"▶\" : \"▼\";\n }\n\n return (\n <li\n role=\"treeitem\"\n aria-expanded={hasChildren ? !collapsed : undefined}\n style={{ listStyle: \"none\", margin: 0, padding: 0 }}\n >\n {/* Row */}\n <div\n draggable\n onDragStart={e => {\n e.stopPropagation();\n onDragStart(node.id);\n }}\n onDragEnd={() => setIsDropTarget(false)}\n onDragOver={e => {\n e.preventDefault();\n e.stopPropagation();\n setIsDropTarget(true);\n }}\n onDragLeave={() => setIsDropTarget(false)}\n onDrop={e => {\n e.preventDefault();\n e.stopPropagation();\n setIsDropTarget(false);\n onDrop(node.id);\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.375rem\",\n padding: \"0.3rem 0.5rem\",\n paddingLeft: `${0.5 + depth * 1.25}rem`,\n borderRadius: \"var(--radius-md)\",\n cursor: \"grab\",\n opacity: isDragging ? 0.4 : 1,\n background: isDropTarget ? \"rgba(139, 92, 246, 0.1)\" : \"transparent\",\n border: isDropTarget\n ? \"1px dashed var(--color-primary)\"\n : \"1px solid transparent\",\n transition: \"background 0.15s, border-color 0.15s\",\n userSelect: \"none\",\n }}\n onMouseEnter={e => {\n (e.currentTarget as HTMLDivElement).style.background =\n \"var(--color-bg-secondary)\";\n }}\n onMouseLeave={e => {\n (e.currentTarget as HTMLDivElement).style.background = isDropTarget\n ? \"rgba(139, 92, 246, 0.1)\"\n : \"transparent\";\n }}\n onKeyDown={(e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setCollapsed(c => !c);\n }\n }}\n tabIndex={0}\n aria-label={node.label}\n >\n {/* Expand/Collapse toggle */}\n <button\n onClick={e => {\n e.stopPropagation();\n setCollapsed(c => !c);\n }}\n aria-label={collapsed ? \"Expand\" : \"Collapse\"}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: 0,\n width: \"1rem\",\n color: \"var(--color-text-muted)\",\n fontSize: \"0.75rem\",\n flexShrink: 0,\n minHeight: \"unset\",\n }}\n >\n {toggleGlyph}\n </button>\n\n {/* Label / Rename input */}\n {renaming ? (\n <InlineInput\n initialValue={node.label}\n onConfirm={handleRename}\n onCancel={() => setRenaming(false)}\n />\n ) : (\n <span\n onDoubleClick={() => setRenaming(true)}\n title=\"Double-click to rename\"\n style={{\n flex: 1,\n fontSize: \"0.875rem\",\n color: \"var(--color-text)\",\n lineHeight: 1.4,\n }}\n >\n {node.label}\n </span>\n )}\n\n {/* Action buttons — shown on hover via CSS */}\n <div\n className=\"tree-node-actions\"\n style={{\n display: \"flex\",\n gap: \"0.25rem\",\n opacity: 0,\n transition: \"opacity 0.15s\",\n }}\n >\n <button\n onClick={e => {\n e.stopPropagation();\n setAddingChild(true);\n setCollapsed(false);\n }}\n title=\"Add child\"\n aria-label={`Add child to ${node.label}`}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n color: \"var(--color-primary)\",\n fontSize: \"0.8rem\",\n padding: \"0 0.25rem\",\n borderRadius: \"var(--radius-sm)\",\n minHeight: \"unset\",\n }}\n >\n +\n </button>\n <button\n onClick={e => {\n e.stopPropagation();\n setRenaming(true);\n }}\n title=\"Rename\"\n aria-label={`Rename ${node.label}`}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n color: \"var(--color-text-muted)\",\n fontSize: \"0.75rem\",\n padding: \"0 0.25rem\",\n borderRadius: \"var(--radius-sm)\",\n minHeight: \"unset\",\n }}\n >\n ✎\n </button>\n </div>\n </div>\n\n {/* Inline Add Child input */}\n {addingChild && (\n <div\n style={{\n paddingLeft: `${0.5 + (depth + 1) * 1.25}rem`,\n paddingTop: \"0.25rem\",\n paddingBottom: \"0.25rem\",\n }}\n >\n <InlineInput\n initialValue=\"\"\n onConfirm={handleAddChild}\n onCancel={() => setAddingChild(false)}\n />\n </div>\n )}\n\n {/* Children */}\n {!collapsed && hasChildren && (\n <ul role=\"group\" style={{ margin: 0, padding: 0 }}>\n {node.children.map(child => (\n <TreeNodeRow\n key={child.id}\n node={child}\n depth={depth + 1}\n doctype={doctype}\n onRefresh={onRefresh}\n dragNodeId={dragNodeId}\n onDragStart={onDragStart}\n onDrop={onDrop}\n />\n ))}\n </ul>\n )}\n </li>\n );\n}\n\n// ── TreeView ───────────────────────────────────────────────────────────────\n\n/**\n * TreeView — Hierarchical tree view for DocTypes with a parent field.\n *\n * Reads from `/api/tree/:doctype` and supports:\n * - Inline Add Child (click \"+\")\n * - Inline Rename (double-click)\n * - Drag-and-drop reparenting (PATCH /api/tree/:doctype/:id)\n */\nexport function TreeView({ resource }: Readonly<TreeViewProps>) {\n const [state, setState] = useState<TreeState>({\n tree: [],\n loading: true,\n error: null,\n });\n const [dragNodeId, setDragNodeId] = useState<string | null>(null);\n const [addingRoot, setAddingRoot] = useState(false);\n\n const load = useCallback(async () => {\n setState(s => ({ ...s, loading: true, error: null }));\n try {\n const tree = await fetchTree(resource);\n setState({ tree, loading: false, error: null });\n } catch (err) {\n setState({\n tree: [],\n loading: false,\n error: err instanceof Error ? err.message : \"Failed to load tree\",\n });\n }\n }, [resource]);\n\n useEffect(() => {\n void load();\n }, [load]);\n\n const handleDrop = useCallback(\n async (targetId: string | null) => {\n if (!dragNodeId || dragNodeId === targetId) {\n setDragNodeId(null);\n return;\n }\n try {\n await reparentNode(resource, dragNodeId, targetId);\n void load();\n } catch {\n /* silent */\n }\n setDragNodeId(null);\n },\n [dragNodeId, resource, load],\n );\n\n const handleAddRoot = useCallback(\n async (label: string) => {\n setAddingRoot(false);\n if (!label.trim()) return;\n try {\n await addChildNode(resource, null, label);\n void load();\n } catch {\n /* silent */\n }\n },\n [resource, load],\n );\n\n if (state.loading) {\n return (\n <div style={{ padding: \"var(--spacing-lg)\" }}>\n {[1, 2, 3, 4].map(i => (\n <div\n key={i}\n className=\"skeleton skeleton-text\"\n style={{ width: `${60 + i * 10}%`, marginBottom: \"0.5rem\" }}\n />\n ))}\n </div>\n );\n }\n\n if (state.error) {\n return (\n <div\n style={{\n padding: \"var(--spacing-xl)\",\n textAlign: \"center\",\n color: \"var(--color-error)\",\n }}\n >\n {state.error}\n <br />\n <button className=\"btn btn-ghost\" onClick={() => void load()}>\n Retry\n </button>\n </div>\n );\n }\n\n return (\n <div style={{ padding: \"var(--spacing-md)\" }}>\n {/* Toolbar */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"var(--spacing-sm)\",\n marginBottom: \"var(--spacing-sm)\",\n }}\n >\n <span\n style={{\n fontWeight: 600,\n fontSize: \"0.875rem\",\n color: \"var(--color-text-secondary)\",\n }}\n >\n {resource}\n </span>\n <button\n className=\"btn\"\n onClick={() => setAddingRoot(true)}\n style={{ fontSize: \"0.75rem\", padding: \"0.25rem 0.75rem\" }}\n >\n + Add Root Node\n </button>\n <button\n className=\"btn btn-ghost\"\n onClick={() => void load()}\n style={{ fontSize: \"0.75rem\", padding: \"0.25rem 0.5rem\" }}\n aria-label=\"Refresh tree\"\n >\n ↺\n </button>\n </div>\n\n {/* Inline add root node */}\n {addingRoot && (\n <div style={{ marginBottom: \"var(--spacing-sm)\" }}>\n <InlineInput\n initialValue=\"\"\n onConfirm={handleAddRoot}\n onCancel={() => setAddingRoot(false)}\n />\n </div>\n )}\n\n {/* Drop zone for reparenting to root */}\n {dragNodeId && (\n <div\n onDragOver={e => e.preventDefault()}\n onDrop={() => {\n handleDrop(null).catch(() => undefined);\n }}\n style={{\n padding: \"0.5rem\",\n marginBottom: \"0.5rem\",\n border: \"2px dashed var(--color-primary)\",\n borderRadius: \"var(--radius-md)\",\n textAlign: \"center\",\n fontSize: \"0.75rem\",\n color: \"var(--color-primary)\",\n }}\n >\n Drop here to make root-level\n </div>\n )}\n\n {/* Tree */}\n {state.tree.length === 0 ? (\n <div className=\"table-empty-state\">\n <span\n className=\"icon\"\n style={{ fontSize: \"2rem\", marginBottom: \"0.5rem\" }}\n >\n 🌳\n </span>\n <div>No items yet. Click \"+ Add Root Node\" to get started.</div>\n </div>\n ) : (\n <ul\n role=\"tree\"\n aria-label={`${resource} tree`}\n style={{ margin: 0, padding: 0 }}\n >\n {state.tree.map(node => (\n <TreeNodeRow\n key={node.id}\n node={node}\n depth={0}\n doctype={resource}\n onRefresh={() => void load()}\n dragNodeId={dragNodeId}\n onDragStart={setDragNodeId}\n onDrop={targetId => void handleDrop(targetId)}\n />\n ))}\n </ul>\n )}\n\n {/* Style for hover-reveal action buttons */}\n <style>{`\n [draggable]:hover .tree-node-actions {\n opacity: 1 !important;\n }\n `}</style>\n </div>\n );\n}\n\nexport default TreeView;\n","/**\n * Configuration Registry\n *\n * Stores and retrieves Level 1 customization configs.\n * No build step required - configs loaded at runtime.\n */\n\nimport type {\n DocTypeConfig,\n FormConfig,\n ListConfig,\n FieldConfig,\n ClientScript,\n} from \"./types\";\n\nfunction isDebugEnabled(): boolean {\n const globalFlag = (globalThis as { __FRAMEWORK_M_DEBUG__?: unknown })\n .__FRAMEWORK_M_DEBUG__;\n if (typeof globalFlag === \"boolean\") {\n return globalFlag;\n }\n if (typeof globalFlag === \"string\") {\n return [\"1\", \"true\", \"yes\", \"on\"].includes(globalFlag.toLowerCase());\n }\n\n const processRef = (\n globalThis as { process?: { env?: Record<string, string | undefined> } }\n ).process;\n const envFlag = processRef?.env?.FRAMEWORK_M_DEBUG;\n if (typeof envFlag === \"string\") {\n return [\"1\", \"true\", \"yes\", \"on\"].includes(envFlag.toLowerCase());\n }\n\n return false;\n}\n\nconst configLogger = {\n debug(message: string): void {\n if (isDebugEnabled()) {\n console.debug(`[ConfigRegistry] ${message}`);\n }\n },\n error(message: string, error?: unknown): void {\n console.error(`[ConfigRegistry] ${message}`, error);\n },\n};\n\n/**\n * Configuration store\n */\nconst configStore: Map<string, DocTypeConfig> = new Map();\nconst clientScripts: Map<string, ClientScript[]> = new Map();\n\n/**\n * Register a DocType configuration\n *\n * @param config - DocType configuration\n *\n * @example\n * ```typescript\n * registerConfig({\n * doctype: \"Depot\",\n * form: {\n * fields: {\n * capacity: { label: \"Max Capacity (MT)\" },\n * internal_code: { hidden: true }\n * },\n * sections: [\n * { title: \"Location\", fields: [\"location\", \"region\"] }\n * ]\n * },\n * list: {\n * columns: [\"name\", \"location\", \"capacity\"],\n * defaultSort: { field: \"capacity\", order: \"desc\" }\n * }\n * });\n * ```\n */\nexport function registerConfig(config: DocTypeConfig): void {\n const existing = configStore.get(config.doctype);\n\n if (existing) {\n // Merge configs (deep merge for nested objects)\n configStore.set(config.doctype, mergeConfigs(existing, config));\n } else {\n configStore.set(config.doctype, config);\n }\n}\n\n/**\n * Merge two configs (later config wins for conflicts)\n */\nfunction mergeConfigs(\n base: DocTypeConfig,\n override: DocTypeConfig,\n): DocTypeConfig {\n return {\n doctype: override.doctype,\n form: mergeFormConfigs(base.form, override.form),\n list: mergeListConfigs(base.list, override.list),\n };\n}\n\nfunction mergeFormConfigs(\n base?: FormConfig,\n override?: FormConfig,\n): FormConfig | undefined {\n if (!base && !override) return undefined;\n if (!base) return override;\n if (!override) return base;\n\n return {\n ...base,\n ...override,\n fields: {\n ...base.fields,\n ...override.fields,\n },\n sections: override.sections ?? base.sections,\n };\n}\n\nfunction mergeListConfigs(\n base?: ListConfig,\n override?: ListConfig,\n): ListConfig | undefined {\n if (!base && !override) return undefined;\n if (!base) return override;\n if (!override) return base;\n\n return {\n ...base,\n ...override,\n };\n}\n\n/**\n * Get configuration for a DocType\n */\nexport function getConfig(doctype: string): DocTypeConfig | undefined {\n return configStore.get(doctype);\n}\n\n/**\n * Get form configuration for a DocType\n */\nexport function getFormConfig(doctype: string): FormConfig | undefined {\n return configStore.get(doctype)?.form;\n}\n\n/**\n * Get list configuration for a DocType\n */\nexport function getListConfig(doctype: string): ListConfig | undefined {\n return configStore.get(doctype)?.list;\n}\n\n/**\n * Get field configuration override\n */\nexport function getFieldConfig(\n doctype: string,\n fieldName: string,\n): FieldConfig | undefined {\n return configStore.get(doctype)?.form?.fields?.[fieldName];\n}\n\n/**\n * Register a client script\n *\n * @param script - Client script definition\n *\n * @example\n * ```typescript\n * registerClientScript({\n * doctype: \"Sales Invoice\",\n * event: \"onLoad\",\n * handler: (ctx) => {\n * if (ctx.doc.status === \"Draft\") {\n * ctx.setHidden(\"cancel_reason\", true);\n * }\n * }\n * });\n * ```\n */\nexport function registerClientScript(script: ClientScript): void {\n const key = `${script.doctype}:${script.event}`;\n const existing = clientScripts.get(key) ?? [];\n existing.push(script);\n clientScripts.set(key, existing);\n}\n\n/**\n * Get client scripts for a DocType and event\n */\nexport function getClientScripts(\n doctype: string,\n event: ClientScript[\"event\"],\n): ClientScript[] {\n const key = `${doctype}:${event}`;\n return clientScripts.get(key) ?? [];\n}\n\n/**\n * Load configuration from URL (fetches JSON)\n */\nexport async function loadConfigFromUrl(url: string): Promise<void> {\n try {\n configLogger.debug(`Loading config from ${url}`);\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to load config: ${response.statusText}`);\n }\n const config: DocTypeConfig = await response.json();\n registerConfig(config);\n } catch (error) {\n configLogger.error(`Failed to load config from ${url}`, error);\n }\n}\n\n/**\n * Clear all configurations (for testing)\n */\nexport function clearConfigs(): void {\n configStore.clear();\n clientScripts.clear();\n}\n","/**\n * useConfig Hook\n *\n * Hook for accessing DocType configuration in components.\n */\n\nimport { useMemo } from \"react\";\nimport {\n getConfig,\n getFormConfig,\n getListConfig,\n getFieldConfig,\n} from \"./registry\";\nimport type { DocTypeConfig, FormConfig, ListConfig, FieldConfig } from \"./types\";\n\n/**\n * Hook to get complete DocType configuration\n */\nexport function useConfig(doctype: string): DocTypeConfig | undefined {\n return useMemo(() => getConfig(doctype), [doctype]);\n}\n\n/**\n * Hook to get form configuration\n */\nexport function useFormConfig(doctype: string): FormConfig | undefined {\n return useMemo(() => getFormConfig(doctype), [doctype]);\n}\n\n/**\n * Hook to get list configuration\n */\nexport function useListConfig(doctype: string): ListConfig | undefined {\n return useMemo(() => getListConfig(doctype), [doctype]);\n}\n\n/**\n * Hook to get field configuration override\n */\nexport function useFieldConfig(\n doctype: string,\n fieldName: string\n): FieldConfig | undefined {\n return useMemo(\n () => getFieldConfig(doctype, fieldName),\n [doctype, fieldName]\n );\n}\n","/**\n * Workspace Sidebar Section Component\n *\n * Renders a workspace in the sidebar.\n * Per checklist 6.4: Desk Workspace Configuration.\n */\n\nimport { useState } from \"react\";\nimport { useGo } from \"@refinedev/core\";\nimport type { DeskWorkspace, WorkspaceItem } from \"./types\";\n\n/**\n * WorkspaceSection props\n */\nexport interface WorkspaceSectionProps {\n /** Workspace to render */\n workspace: DeskWorkspace;\n /** Whether collapsed */\n collapsed?: boolean;\n}\n\n/**\n * WorkspaceSection Component\n */\nexport function WorkspaceSection({ workspace, collapsed = false }: WorkspaceSectionProps) {\n const [isExpanded, setIsExpanded] = useState(true);\n const go = useGo();\n\n const handleItemClick = (item: WorkspaceItem) => {\n if (item.type === \"shortcut\") {\n go({ to: `/app/${item.doctype}/list` });\n } else if (item.type === \"link\") {\n if (item.newTab) {\n window.open(item.url, \"_blank\");\n } else if (item.url.startsWith(\"/\")) {\n go({ to: item.url });\n } else {\n window.location.href = item.url;\n }\n }\n // Charts are not clickable, they're rendered as widgets\n };\n\n return (\n <div style={{ marginBottom: \"0.5rem\" }}>\n {/* Workspace Header */}\n <button\n onClick={() => setIsExpanded(!isExpanded)}\n style={{\n width: \"100%\",\n padding: collapsed ? \"0.5rem\" : \"0.5rem 1rem\",\n background: \"none\",\n border: \"none\",\n color: \"rgba(255,255,255,0.7)\",\n textAlign: \"left\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n fontSize: \"0.875rem\",\n }}\n >\n <span>{workspace.icon}</span>\n {!collapsed && (\n <>\n <span style={{ flex: 1 }}>{workspace.label}</span>\n <span style={{ fontSize: \"0.65rem\" }}>\n {isExpanded ? \"▼\" : \"▶\"}\n </span>\n </>\n )}\n </button>\n\n {/* Workspace Items */}\n {isExpanded && !collapsed && (\n <div style={{ paddingLeft: \"1rem\" }}>\n {workspace.items\n .filter((item) => item.type !== \"chart\")\n .map((item, idx) => (\n <button\n key={`${item.type}-${idx}`}\n onClick={() => handleItemClick(item)}\n style={{\n width: \"100%\",\n padding: \"0.375rem 0.75rem\",\n background: \"none\",\n border: \"none\",\n color: \"rgba(255,255,255,0.6)\",\n textAlign: \"left\",\n cursor: \"pointer\",\n fontSize: \"0.8rem\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n }}\n >\n {\"icon\" in item && item.icon && <span>{item.icon}</span>}\n <span>{item.label}</span>\n {item.type === \"link\" && item.newTab && (\n <span style={{ fontSize: \"0.6rem\", opacity: 0.5 }}>↗</span>\n )}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport default WorkspaceSection;\n","/**\n * ListView Page Component\n *\n * Generic list view for any DocType.\n * Per checklist 3.1: Route /app/{doctype}/list\n *\n * Features:\n * - Fetches metadata for column generation\n * - Renders AutoTable\n * - New button\n * - Search and filters\n * - Bulk actions\n */\n\nimport { useState, useMemo, useCallback } from \"react\";\nimport { useParams, useNavigate, useLocation } from \"react-router\";\nimport { useDeleteMany, useGetIdentity, useInvalidate } from \"@refinedev/core\";\nimport { useDocTypeMeta, useUIMeta } from \"../hooks\";\nimport { AutoTable } from \"../components/table\";\nimport { ConfirmDialog } from \"../components/feedback\";\nimport { Slot } from \"../plugins\";\nimport { KanbanView, TreeView } from \"../views\";\n\n/**\n * ListView props\n */\nexport interface ListViewProps {\n /** DocType name (overrides route param) */\n doctype?: string;\n /** View override used by explicit routes (/kanban, /tree) */\n view?: \"list\" | \"kanban\" | \"tree\";\n}\n\ntype ViewMode = \"list\" | \"kanban\" | \"tree\";\n\ninterface SchemaField {\n enum?: unknown[];\n type?: string | string[];\n format?: string;\n $ref?: string;\n anyOf?: Array<Record<string, unknown>>;\n allOf?: Array<Record<string, unknown>>;\n oneOf?: Array<Record<string, unknown>>;\n [key: string]: unknown;\n}\n\nfunction toSchemaFields(schema: unknown): Record<string, SchemaField> {\n if (!schema || typeof schema !== \"object\") return {};\n const properties = (schema as { properties?: unknown }).properties;\n if (!properties || typeof properties !== \"object\") return {};\n return properties as Record<string, SchemaField>;\n}\n\nfunction getStringEnums(field: SchemaField | undefined): string[] {\n if (!field?.enum || !Array.isArray(field.enum)) return [];\n return field.enum.filter((v): v is string => typeof v === \"string\");\n}\n\nfunction isSelectOrLinkField(field: SchemaField | undefined): boolean {\n if (!field) return false;\n if (Array.isArray(field.enum) && field.enum.length > 0) return true;\n\n const format = String(field.format ?? \"\").toLowerCase();\n if (format.includes(\"link\") || format.includes(\"reference\")) return true;\n\n const rawFieldType = field[\"x-fieldtype\"];\n const fieldType =\n typeof rawFieldType === \"string\" ? rawFieldType.toLowerCase() : \"\";\n if (fieldType === \"link\" || fieldType === \"select\") return true;\n\n const ref = String(field.$ref ?? \"\").toLowerCase();\n if (ref.includes(\"link\") || ref.includes(\"doctype\")) return true;\n\n return false;\n}\n\nfunction pickFirst(...values: Array<string | undefined>): string | undefined {\n for (const value of values) {\n if (typeof value === \"string\" && value.trim()) return value;\n }\n return undefined;\n}\n\n/**\n * ListView Component\n *\n * Renders a list view for any DocType with search, filters, and bulk actions.\n *\n * @example\n * ```tsx\n * // In routes\n * <Route path=\"/app/:doctype/list\" element={<ListView />} />\n *\n * // Or with explicit doctype\n * <ListView doctype=\"Task\" />\n * ```\n */\nexport function ListView({\n doctype: propDoctype,\n view: propView,\n}: Readonly<ListViewProps>) {\n const params = useParams<{ doctype: string }>();\n const navigate = useNavigate();\n const location = useLocation();\n const { data: identity } = useGetIdentity<{ id?: string }>();\n\n const doctype = propDoctype ?? params.doctype ?? \"\";\n const isAuthenticated =\n Boolean(identity?.id) &&\n String(identity?.id ?? \"\").toLowerCase() !== \"guest\";\n\n // Fetch metadata\n const {\n schema,\n isLoading: metaLoading,\n error: metaError,\n } = useDocTypeMeta(doctype);\n const { uiMeta } = useUIMeta(doctype);\n\n // Search state\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [uiError, setUiError] = useState<string | null>(null);\n const [isDeleteConfirmOpen, setIsDeleteConfirmOpen] = useState(false);\n\n // Selected rows for bulk actions\n const [selectedRows, setSelectedRows] = useState<Record<string, unknown>[]>(\n [],\n );\n\n const schemaFields = useMemo(() => toSchemaFields(schema), [schema]);\n\n const pathView = useMemo<ViewMode | undefined>(() => {\n if (location.pathname.endsWith(\"/kanban\")) return \"kanban\";\n if (location.pathname.endsWith(\"/tree\")) return \"tree\";\n if (location.pathname.endsWith(\"/list\")) return \"list\";\n return undefined;\n }, [location.pathname]);\n\n const detectedParentField = useMemo(() => {\n const fromMeta = uiMeta?.additional_views?.tree as\n | { parentField?: string }\n | undefined;\n if (fromMeta?.parentField) return fromMeta.parentField;\n\n if (schemaFields.parent_doctype) return \"parent_doctype\";\n if (schemaFields.parent) return \"parent\";\n\n const parentLike = Object.keys(schemaFields).find(\n key => key.startsWith(\"parent_\") || key.endsWith(\"_parent\"),\n );\n return parentLike;\n }, [uiMeta, schemaFields]);\n\n const detectedLabelField = useMemo(() => {\n const fromMeta = uiMeta?.additional_views?.tree as\n | { labelField?: string }\n | undefined;\n return (\n pickFirst(\n fromMeta?.labelField,\n schemaFields.title ? \"title\" : undefined,\n schemaFields.subject ? \"subject\" : undefined,\n schemaFields.label ? \"label\" : undefined,\n schemaFields.name ? \"name\" : undefined,\n ) ?? \"name\"\n );\n }, [uiMeta, schemaFields]);\n\n const groupFieldCandidates = useMemo(() => {\n return Object.entries(schemaFields)\n .filter(([, field]) => isSelectOrLinkField(field))\n .map(([name]) => name);\n }, [schemaFields]);\n\n const metaKanban = uiMeta?.additional_views?.kanban as\n | {\n groupByField?: string;\n cardTitleField?: string;\n cardSubtitleField?: string;\n }\n | undefined;\n\n const kanbanGroupField = useMemo(() => {\n const preferred = pickFirst(\n metaKanban?.groupByField,\n schemaFields.status ? \"status\" : undefined,\n schemaFields.workflow_state ? \"workflow_state\" : undefined,\n groupFieldCandidates[0],\n );\n return preferred;\n }, [metaKanban, schemaFields, groupFieldCandidates]);\n\n const kanbanColumns = useMemo(() => {\n if (!kanbanGroupField) return [];\n const enums = getStringEnums(schemaFields[kanbanGroupField]);\n return enums.map(value => ({\n id: value,\n title:\n value.charAt(0).toUpperCase() + value.slice(1).replaceAll(\"_\", \" \"),\n }));\n }, [kanbanGroupField, schemaFields]);\n\n const kanbanTitleField = pickFirst(\n metaKanban?.cardTitleField,\n schemaFields.title ? \"title\" : undefined,\n schemaFields.subject ? \"subject\" : undefined,\n schemaFields.name ? \"name\" : undefined,\n \"name\",\n ) as string;\n\n const kanbanDescriptionField = pickFirst(\n metaKanban?.cardSubtitleField,\n schemaFields.description ? \"description\" : undefined,\n schemaFields.notes ? \"notes\" : undefined,\n );\n\n const canKanban = Boolean(kanbanGroupField);\n const canTree = Boolean(detectedParentField);\n\n const activeView: ViewMode = useMemo(() => {\n const requested = propView ?? pathView ?? \"list\";\n if (requested === \"kanban\" && !canKanban) return \"list\";\n if (requested === \"tree\" && !canTree) return \"list\";\n return requested;\n }, [propView, pathView, canKanban, canTree]);\n\n const setActiveView = useCallback(\n (view: ViewMode) => {\n const target = view === \"list\" ? \"list\" : view;\n navigate(`/app/${doctype}/${target}`);\n },\n [navigate, doctype],\n );\n\n const [isMobile, setIsMobile] = useState(\n globalThis.window?.innerWidth ? globalThis.window.innerWidth < 1024 : false,\n );\n\n useMemo(() => {\n if (typeof window === \"undefined\") return;\n const onResize = () => setIsMobile(window.innerWidth < 1024);\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n // Handle row click - navigate to detail view\n const handleRowClick = useCallback(\n (row: Record<string, unknown>) => {\n // Prefer id (UUID) as backend routes expect UUID, not name\n const id = row.id ?? row.name;\n if (\n typeof id === \"string\" ||\n typeof id === \"number\" ||\n typeof id === \"bigint\"\n ) {\n navigate(`/app/${doctype}/detail/${id}`);\n }\n },\n [navigate, doctype],\n );\n\n // Handle \"New\" button\n const handleNew = useCallback(() => {\n if (!isAuthenticated) {\n setUiError(\"Authentication required. Please login first.\");\n navigate(\"/login\");\n return;\n }\n setUiError(null);\n navigate(`/app/${doctype}/new`);\n }, [isAuthenticated, navigate, doctype]);\n\n // Delete mutation for bulk delete\n const deleteMutation = useDeleteMany();\n const invalidate = useInvalidate();\n\n // Handle bulk delete\n const handleBulkDelete = useCallback(async () => {\n if (selectedRows.length === 0) return;\n\n setIsDeleteConfirmOpen(true);\n }, [selectedRows]);\n\n const confirmBulkDelete = useCallback(async () => {\n if (selectedRows.length === 0) {\n setIsDeleteConfirmOpen(false);\n return;\n }\n\n // Extract IDs (prefer UUID 'id' field)\n const ids = selectedRows.map(row => String(row.id ?? row.name));\n\n deleteMutation.mutate(\n { resource: doctype, ids },\n {\n onSuccess: () => {\n setUiError(null);\n setSelectedRows([]);\n setIsDeleteConfirmOpen(false);\n // Invalidate list to refresh data\n invalidate({ resource: doctype, invalidates: [\"list\"] });\n },\n onError: err => {\n setUiError(err.message || \"Delete failed.\");\n setIsDeleteConfirmOpen(false);\n },\n },\n );\n }, [selectedRows, doctype, deleteMutation, invalidate]);\n\n // Format title\n const title = useMemo(() => {\n return doctype.replaceAll(\"_\", \" \");\n }, [doctype]);\n\n // Loading state\n if (metaLoading) {\n return (\n <div\n style={{\n padding: \"2rem\",\n backgroundColor: \"var(--color-bg)\",\n minHeight: \"100vh\",\n }}\n >\n <div style={{ color: \"var(--color-text-secondary)\" }}>\n Loading {doctype}...\n </div>\n </div>\n );\n }\n\n // Error state\n if (metaError) {\n return (\n <div\n style={{\n padding: \"2rem\",\n backgroundColor: \"var(--color-bg)\",\n minHeight: \"100vh\",\n }}\n >\n <div style={{ color: \"var(--color-error)\" }}>\n Error loading {doctype}: {metaError.message}\n </div>\n </div>\n );\n }\n\n return (\n <div\n style={{\n padding: isMobile ? \"0.75rem\" : \"1.5rem\",\n backgroundColor: \"var(--color-bg)\",\n minHeight: \"100vh\",\n }}\n >\n {/* Header */}\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: isMobile ? \"1rem\" : \"1.5rem\",\n flexDirection: isMobile ? \"column\" : \"row\",\n gap: isMobile ? \"1rem\" : \"0.5rem\",\n }}\n >\n <h1\n style={{ margin: 0, fontSize: \"1.5rem\", color: \"var(--color-text)\" }}\n >\n {title}\n </h1>\n\n <div style={{ display: \"flex\", gap: \"0.5rem\", alignItems: \"center\" }}>\n <div\n role=\"tablist\"\n aria-label=\"View switcher\"\n style={{ display: \"flex\", gap: \"0.25rem\", marginRight: \"0.5rem\" }}\n >\n {(\n [\n { key: \"list\", label: \"List\", enabled: true },\n { key: \"kanban\", label: \"Kanban\", enabled: canKanban },\n { key: \"tree\", label: \"Tree\", enabled: canTree },\n ] as const\n ).map(view => (\n <button\n key={view.key}\n type=\"button\"\n role=\"tab\"\n aria-selected={activeView === view.key}\n disabled={!view.enabled}\n onClick={() => setActiveView(view.key)}\n style={{\n padding: isMobile ? \"0.35rem 0.6rem\" : \"0.45rem 0.7rem\",\n borderRadius: \"8px\",\n border: \"1px solid var(--color-border)\",\n background:\n activeView === view.key\n ? \"var(--color-primary)\"\n : \"var(--color-bg-secondary)\",\n color:\n activeView === view.key ? \"white\" : \"var(--color-text)\",\n cursor: view.enabled ? \"pointer\" : \"not-allowed\",\n opacity: view.enabled ? 1 : 0.5,\n fontSize: \"0.75rem\",\n fontWeight: 600,\n }}\n >\n {view.label}\n </button>\n ))}\n </div>\n\n {/* Plugin slot for custom header actions */}\n <Slot name=\"list-header-actions\" doctype={doctype} />\n\n {activeView === \"list\" && (\n <button\n onClick={handleNew}\n style={{\n padding: isMobile ? \"0.4rem 0.8rem\" : \"0.5rem 1rem\",\n backgroundColor: \"var(--color-primary)\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n fontWeight: 600,\n fontSize: isMobile ? \"0.85rem\" : \"0.9rem\",\n }}\n >\n + New\n </button>\n )}\n </div>\n </div>\n\n {/* Action Errors */}\n {uiError && (\n <div\n style={{\n marginBottom: \"1rem\",\n padding: \"0.75rem 1rem\",\n backgroundColor: \"var(--color-error-bg)\",\n border: \"1px solid var(--color-error-border)\",\n borderRadius: \"4px\",\n color: \"var(--color-error)\",\n }}\n role=\"alert\"\n >\n {uiError}\n </div>\n )}\n\n {activeView === \"list\" && (\n <>\n {/* Search and Filters */}\n <div\n style={{\n display: \"flex\",\n gap: isMobile ? \"0.5rem\" : \"1rem\",\n marginBottom: \"1rem\",\n alignItems: \"center\",\n flexDirection: isMobile ? \"column\" : \"row\",\n }}\n >\n {/* Search box */}\n <input\n type=\"search\"\n placeholder={`Search ${title}...`}\n value={searchQuery}\n onChange={e => setSearchQuery(e.target.value)}\n style={{\n padding: \"0.5rem 1rem\",\n border: \"1px solid var(--color-border)\",\n borderRadius: \"4px\",\n width: isMobile ? \"100%\" : \"300px\",\n backgroundColor: \"var(--color-bg)\",\n color: \"var(--color-text)\",\n }}\n />\n\n {/* Plugin slot for custom filters */}\n <Slot name=\"list-filters\" doctype={doctype} />\n\n {/* Bulk actions (show when rows selected) */}\n {selectedRows.length > 0 && (\n <div\n style={{\n display: \"flex\",\n gap: \"0.5rem\",\n marginLeft: \"auto\",\n alignItems: \"center\",\n }}\n >\n <span style={{ color: \"var(--color-text-secondary)\" }}>\n {selectedRows.length} selected\n </span>\n <button\n onClick={handleBulkDelete}\n style={{\n padding: \"0.5rem 1rem\",\n backgroundColor: \"var(--color-error)\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n }}\n >\n Delete\n </button>\n <button\n onClick={() => setSelectedRows([])}\n style={{\n padding: \"0.5rem 1rem\",\n backgroundColor: \"var(--color-bg-secondary)\",\n color: \"var(--color-text)\",\n border: \"1px solid var(--color-border)\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n }}\n >\n Clear\n </button>\n </div>\n )}\n </div>\n\n {/* Plugin slot for above table */}\n <Slot name=\"list-above-table\" doctype={doctype} />\n\n {/* Table with Scroll Isolation */}\n <div style={{ width: \"100%\", overflowX: \"auto\", overflowY: \"hidden\", WebkitOverflowScrolling: \"touch\" }}>\n <AutoTable\n resource={doctype}\n schema={schema}\n enableSelection\n onSelectionChange={setSelectedRows}\n onRowClick={handleRowClick}\n />\n </div>\n\n {/* Plugin slot for below table */}\n <Slot name=\"list-below-table\" doctype={doctype} />\n </>\n )}\n\n {activeView === \"kanban\" && canKanban && kanbanGroupField && (\n <KanbanView\n resource={doctype}\n config={{\n groupField: kanbanGroupField,\n columns: kanbanColumns,\n titleField: kanbanTitleField,\n descriptionField: kanbanDescriptionField,\n }}\n />\n )}\n\n {activeView === \"tree\" && canTree && detectedParentField && (\n <TreeView\n resource={doctype}\n config={{\n parentField: detectedParentField,\n labelField: detectedLabelField,\n allowReparent: true,\n allowAddChild: true,\n allowRename: true,\n }}\n />\n )}\n\n <ConfirmDialog\n open={isDeleteConfirmOpen}\n title=\"Confirm bulk delete\"\n message={`Delete ${selectedRows.length} selected item(s)? This cannot be undone.`}\n confirmLabel=\"Delete\"\n cancelLabel=\"Cancel\"\n destructive\n onConfirm={() => {\n confirmBulkDelete().catch(() => undefined);\n }}\n onCancel={() => setIsDeleteConfirmOpen(false)}\n />\n </div>\n );\n}\n\nexport default ListView;\n","/**\n * FormView Page Component\n *\n * Generic form view for any DocType (create/edit).\n * Per checklist 3.2:\n * - Route Create: `/app/{doctype}/new`\n * - Route Edit: `/app/{doctype}/detail/{id}`\n *\n * Features:\n * - Fetches metadata\n * - Fetches document (if editing)\n * - Renders AutoForm\n * - Renders Workflow Actions\n * - Save/Submit/Cancel buttons\n * - Shows validation errors\n */\n\nimport { useState, useCallback, useEffect } from \"react\";\nimport { useParams, useNavigate } from \"react-router\";\nimport { useOne, useCreate, useUpdate, useApiUrl } from \"@refinedev/core\";\nimport { useDocTypeMeta } from \"../hooks\";\nimport { useWorkflowActions } from \"../hooks/useWorkflowActions\";\nimport { AutoForm } from \"../components/form\";\nimport { WorkflowActions } from \"../components/workflow\";\nimport { AlertBanner } from \"../components/feedback\";\nimport { Slot } from \"../plugins\";\nimport { getClientScripts } from \"../config\";\n\n/**\n * FormView props\n */\nexport interface FormViewProps {\n /** DocType name (overrides route param) */\n doctype?: string;\n /** Document ID (overrides route param) */\n id?: string;\n}\n\n/**\n * FormView Component\n *\n * Renders a form for creating or editing any DocType.\n *\n * @example\n * ```tsx\n * // In routes\n * <Route path=\"/app/:doctype/new\" element={<FormView />} />\n * <Route path=\"/app/:doctype/detail/:id\" element={<FormView />} />\n * ```\n */\nexport function FormView({\n doctype: propDoctype,\n id: propId,\n}: Readonly<FormViewProps>) {\n const params = useParams<{ doctype: string; id: string }>();\n const navigate = useNavigate();\n\n const doctype = propDoctype ?? params.doctype ?? \"\";\n const id = propId ?? params.id;\n const isEditing = !!id;\n const apiUrl = useApiUrl();\n\n const getApiOrigin = useCallback((rawApiUrl: string): string => {\n const trimmed = rawApiUrl.trim().replace(/\\/+$/, \"\");\n if (!trimmed) {\n return \"\";\n }\n\n // Refine's API URL is often /api/v1; print endpoint is an absolute\n // backend route under /api/v1/print, so strip trailing /api/v1 if present.\n return trimmed.replace(/\\/api\\/v1$/i, \"\");\n }, []);\n\n // Fetch metadata\n const {\n schema,\n isLoading: metaLoading,\n error: metaError,\n } = useDocTypeMeta(doctype);\n\n // Fetch document if editing\n const { result: existingDoc, query } = useOne({\n resource: doctype,\n id: id ?? \"\",\n queryOptions: { enabled: isEditing },\n });\n const docError = query?.error as Error | null | undefined;\n\n // Mutations\n const createMutation = useCreate();\n const updateMutation = useUpdate();\n\n // Workflow actions\n const { state: workflowState } = useWorkflowActions(doctype, id, {\n enabled: isEditing,\n });\n\n // Form data state\n const [formData, setFormData] = useState<Record<string, unknown>>({});\n const [errors, setErrors] = useState<string[]>([]);\n const [notices, setNotices] = useState<string[]>([]);\n const [printFormatName, setPrintFormatName] = useState(\"\");\n\n const addError = useCallback((message: string) => {\n setErrors(prev => [...prev, message]);\n }, []);\n\n const addNotice = useCallback((message: string) => {\n setNotices(prev => [...prev, message]);\n }, []);\n\n const dismissNotice = useCallback((index: number) => {\n setNotices(prev => prev.filter((_, i) => i !== index));\n }, []);\n\n // Initialize form with existing doc\n useEffect(() => {\n if (existingDoc && Object.keys(formData).length === 0) {\n setFormData(existingDoc as Record<string, unknown>);\n }\n }, [existingDoc, formData]);\n\n // Run onLoad client scripts\n useEffect(() => {\n const scripts = getClientScripts(doctype, \"onLoad\");\n for (const script of scripts) {\n try {\n script.handler({\n doc: formData,\n setValue: (field, value) =>\n setFormData(prev => ({ ...prev, [field]: value })),\n getValue: field => formData[field],\n setRequired: () => {},\n setHidden: () => {},\n setReadOnly: () => {},\n showAlert: (message, type) => {\n if (type === \"error\") {\n addError(message);\n return;\n }\n addNotice(message);\n },\n user: { id: \"\", email: \"\", roles: [] },\n });\n } catch (err) {\n console.error(\"Client script error:\", err);\n }\n }\n }, [addError, addNotice, doctype, formData]);\n\n // Handle form change\n const handleChange = useCallback((data: unknown) => {\n setFormData(data as Record<string, unknown>);\n setErrors([]);\n setNotices([]);\n }, []);\n\n // Handle save\n const handleSave = useCallback(async () => {\n // Run validate scripts\n const validateScripts = getClientScripts(doctype, \"validate\");\n for (const script of validateScripts) {\n try {\n script.handler({\n doc: formData,\n setValue: (field, value) =>\n setFormData(prev => ({ ...prev, [field]: value })),\n getValue: field => formData[field],\n setRequired: () => {},\n setHidden: () => {},\n setReadOnly: () => {},\n showAlert: addError,\n user: { id: \"\", email: \"\", roles: [] },\n });\n } catch (err) {\n setErrors([(err as Error).message]);\n return;\n }\n }\n\n try {\n if (isEditing) {\n updateMutation.mutate(\n { resource: doctype, id: id ?? \"\", values: formData },\n {\n onSuccess: () => {\n // Run afterSave scripts\n const afterScripts = getClientScripts(doctype, \"afterSave\");\n for (const script of afterScripts) {\n script.handler({\n doc: formData,\n setValue: () => {},\n getValue: field => formData[field],\n setRequired: () => {},\n setHidden: () => {},\n setReadOnly: () => {},\n showAlert: addNotice,\n user: { id: \"\", email: \"\", roles: [] },\n });\n }\n // Navigate to list page after successful update\n navigate(`/app/${doctype}/list`);\n },\n onError: err => setErrors([err.message]),\n },\n );\n } else {\n createMutation.mutate(\n { resource: doctype, values: formData },\n {\n onSuccess: () => {\n // Navigate to list page after successful create\n navigate(`/app/${doctype}/list`);\n },\n onError: err => setErrors([err.message]),\n },\n );\n }\n } catch (err) {\n setErrors([(err as Error).message]);\n }\n }, [\n doctype,\n id,\n isEditing,\n formData,\n addError,\n addNotice,\n createMutation,\n updateMutation,\n navigate,\n ]);\n\n // Handle cancel\n const handleCancel = useCallback(() => {\n navigate(`/app/${doctype}/list`);\n }, [navigate, doctype]);\n\n const openPrintPreview = useCallback(() => {\n if (!id) return;\n\n const base = getApiOrigin(apiUrl);\n const params = new URLSearchParams({ format: \"html\" });\n if (printFormatName.trim()) {\n params.set(\"print_format\", printFormatName.trim());\n }\n\n const url = `${base}/api/v1/print/${encodeURIComponent(doctype)}/${encodeURIComponent(id)}?${params.toString()}`;\n globalThis.open(url, \"_blank\", \"noopener,noreferrer\");\n }, [apiUrl, doctype, getApiOrigin, id, printFormatName]);\n\n const downloadPrintPdf = useCallback(async () => {\n if (!id) return;\n\n const base = getApiOrigin(apiUrl);\n const params = new URLSearchParams({\n format: \"pdf\",\n disposition: \"attachment\",\n strict_pdf: \"true\",\n });\n if (printFormatName.trim()) {\n params.set(\"print_format\", printFormatName.trim());\n }\n\n const url = `${base}/api/v1/print/${encodeURIComponent(doctype)}/${encodeURIComponent(id)}?${params.toString()}`;\n\n try {\n const response = await fetch(url, { credentials: \"include\" });\n if (!response.ok) {\n const payload = (await response.json().catch(() => ({}))) as {\n error?: string;\n detail?: string;\n };\n throw new Error(\n payload.detail ||\n payload.error ||\n `Failed to download PDF (${response.status})`,\n );\n }\n\n const contentType = response.headers.get(\"content-type\") || \"\";\n if (!contentType.includes(\"application/pdf\")) {\n throw new Error(\n \"PDF generation unavailable. Please ensure PDF service is running.\",\n );\n }\n\n const blob = await response.blob();\n const downloadUrl = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = downloadUrl;\n anchor.download = `${doctype}_${id}.pdf`;\n document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n URL.revokeObjectURL(downloadUrl);\n } catch (err) {\n setErrors([\n err instanceof Error ? err.message : \"Failed to download PDF\",\n ]);\n }\n }, [apiUrl, doctype, getApiOrigin, id, printFormatName]);\n\n // Format title\n const docNameValue = formData.name;\n const displayName =\n typeof docNameValue === \"string\" || typeof docNameValue === \"number\"\n ? String(docNameValue)\n : (id ?? \"\");\n\n const title = isEditing\n ? `Edit ${doctype.replaceAll(\"_\", \" \")}: ${displayName}`\n : `New ${doctype.replaceAll(\"_\", \" \")}`;\n\n // Loading state\n if (metaLoading || (isEditing && query?.isLoading)) {\n return (\n <div\n style={{\n padding: \"2rem\",\n backgroundColor: \"var(--color-bg)\",\n minHeight: \"100vh\",\n }}\n >\n <div style={{ color: \"var(--color-text-secondary)\" }}>Loading...</div>\n </div>\n );\n }\n\n // Error state\n if (metaError) {\n return (\n <div\n style={{\n padding: \"2rem\",\n backgroundColor: \"var(--color-bg)\",\n minHeight: \"100vh\",\n }}\n >\n <div style={{ color: \"var(--color-error)\" }}>\n Error: {metaError.message}\n </div>\n </div>\n );\n }\n\n if (isEditing && docError) {\n return (\n <div\n style={{\n padding: \"2rem\",\n backgroundColor: \"var(--color-bg)\",\n minHeight: \"100vh\",\n }}\n >\n <div\n style={{\n color: \"var(--color-error)\",\n backgroundColor: \"var(--color-error-bg)\",\n border: \"1px solid var(--color-error-border)\",\n padding: \"0.75rem 1rem\",\n borderRadius: \"4px\",\n }}\n role=\"alert\"\n >\n {docError.message || `Failed to load ${doctype}.`}\n </div>\n </div>\n );\n }\n\n const isSaving =\n createMutation.mutation.isPending || updateMutation.mutation.isPending;\n\n let submitLabel = \"Create\";\n if (isSaving) {\n submitLabel = \"Saving...\";\n } else if (isEditing) {\n submitLabel = \"Save\";\n }\n\n return (\n <div\n style={{\n padding: \"1.5rem\",\n maxWidth: \"900px\",\n backgroundColor: \"var(--color-bg)\",\n minHeight: \"100vh\",\n }}\n >\n {/* Header */}\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: \"1.5rem\",\n }}\n >\n <h1\n style={{ margin: 0, fontSize: \"1.5rem\", color: \"var(--color-text)\" }}\n >\n {title}\n </h1>\n\n {/* Workflow Actions */}\n {isEditing && workflowState && (\n <WorkflowActions\n doctype={doctype}\n id={id}\n showState\n onActionComplete={() => query?.refetch?.()}\n />\n )}\n </div>\n\n {/* Plugin slot for form header */}\n <Slot name=\"form-header\" doctype={doctype} data={formData} id={id} />\n\n {/* Validation Errors */}\n {errors.length > 0 && (\n <div\n style={{\n marginBottom: \"1rem\",\n padding: \"0.75rem 1rem\",\n backgroundColor: \"var(--color-error-bg)\",\n border: \"1px solid var(--color-error-border)\",\n borderRadius: \"4px\",\n }}\n >\n {errors.map((error, i) => (\n <div key={`${error}-${i}`} style={{ color: \"var(--color-error)\" }}>\n {error}\n </div>\n ))}\n </div>\n )}\n\n {notices.length > 0 && (\n <div style={{ marginBottom: \"1rem\" }}>\n {notices.map((notice, index) => (\n <AlertBanner\n key={`${notice}-${index}`}\n message={notice}\n variant=\"info\"\n onDismiss={() => dismissNotice(index)}\n />\n ))}\n </div>\n )}\n\n {/* Form */}\n {schema && (\n <AutoForm\n schema={schema as unknown as import(\"@rjsf/utils\").RJSFSchema}\n formData={formData}\n onChange={handleChange}\n onSubmit={handleSave}\n hideSubmitButton\n />\n )}\n\n {/* Plugin slot for form footer */}\n <Slot name=\"form-footer\" doctype={doctype} data={formData} id={id} />\n\n {/* Actions */}\n <div\n style={{\n marginTop: \"1.5rem\",\n paddingTop: \"1rem\",\n borderTop: \"1px solid var(--color-border)\",\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"0.5rem\",\n }}\n >\n <button\n onClick={handleSave}\n disabled={isSaving}\n style={{\n padding: \"0.75rem 1.5rem\",\n backgroundColor: \"var(--color-primary)\",\n color: \"white\",\n border: \"none\",\n borderRadius: \"4px\",\n cursor: isSaving ? \"wait\" : \"pointer\",\n fontWeight: 500,\n opacity: isSaving ? 0.6 : 1,\n }}\n >\n {submitLabel}\n </button>\n\n <button\n onClick={handleCancel}\n style={{\n padding: \"0.75rem 1.5rem\",\n backgroundColor: \"var(--color-bg-secondary)\",\n color: \"var(--color-text)\",\n border: \"1px solid var(--color-border)\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n }}\n >\n Cancel\n </button>\n\n {isEditing && (\n <>\n <input\n value={printFormatName}\n onChange={event => setPrintFormatName(event.target.value)}\n placeholder=\"Print format (optional)\"\n style={{ minWidth: \"200px\" }}\n />\n <button\n onClick={openPrintPreview}\n style={{\n padding: \"0.75rem 1rem\",\n backgroundColor: \"var(--color-bg-secondary)\",\n color: \"var(--color-text)\",\n border: \"1px solid var(--color-border)\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n }}\n >\n Print Preview\n </button>\n <button\n onClick={downloadPrintPdf}\n style={{\n padding: \"0.75rem 1rem\",\n backgroundColor: \"var(--color-bg-secondary)\",\n color: \"var(--color-text)\",\n border: \"1px solid var(--color-border)\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n }}\n >\n Download PDF\n </button>\n </>\n )}\n\n {/* Plugin slot for custom action buttons */}\n <Slot name=\"form-actions\" doctype={doctype} data={formData} id={id} />\n </div>\n </div>\n );\n}\n\nexport default FormView;\n","import { useState, type FormEvent } from \"react\";\nimport { useLogin } from \"@refinedev/core\";\nimport {\n YStack,\n XStack,\n Card,\n Input,\n Button,\n Heading,\n Paragraph,\n} from \"@framework-m/ui\";\n\n// OAuth provider display config\nconst OAUTH_PROVIDERS: Record<string, { label: string; icon: string }> = {\n google: {\n label: \"Continue with Google\",\n icon: \"G\",\n },\n github: {\n label: \"Continue with GitHub\",\n icon: \"GH\",\n },\n microsoft: {\n label: \"Continue with Microsoft\",\n icon: \"MS\",\n },\n};\n\nfunction resolveConfiguredProviders(): string[] {\n const configGlobal = globalThis as typeof globalThis & {\n __FRAMEWORK_CONFIG__?: {\n auth?: {\n oauth?: {\n providers?: string[] | Record<string, unknown>;\n };\n };\n };\n };\n\n const rawProviders =\n configGlobal.__FRAMEWORK_CONFIG__?.auth?.oauth?.providers;\n\n if (Array.isArray(rawProviders)) {\n return rawProviders.filter(\n (provider): provider is string => typeof provider === \"string\",\n );\n }\n\n if (rawProviders && typeof rawProviders === \"object\") {\n return Object.keys(rawProviders);\n }\n\n return [];\n}\n\nexport interface LoginPageProps {\n /** Title to display */\n title?: string;\n /** Logo URL or component */\n logo?: string | React.ReactNode;\n /** Redirect URL after login */\n redirectTo?: string;\n}\n\n/**\n * LoginPage Component\n *\n * Refactored using Tamagui for premium aesthetics and cross-platform readiness.\n */\nexport function LoginPage({\n title = \"Welcome back\",\n logo,\n redirectTo,\n}: Readonly<LoginPageProps>) {\n const { mutate: login, status } = useLogin();\n const [error, setError] = useState<string | null>(null);\n\n const isLoading = status === \"pending\";\n const configuredProviders = resolveConfiguredProviders();\n\n const handleSubmit = (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n setError(null);\n\n const formData = new FormData(e.currentTarget);\n const email = formData.get(\"email\") as string;\n const password = formData.get(\"password\") as string;\n\n login(\n { email, password, redirectTo },\n {\n onSuccess: (result) => {\n if (result && \"success\" in result && result.success === false) {\n setError(result.error?.message || \"Invalid credentials\");\n }\n },\n onError: (err) => {\n setError(err.message || \"Login failed. Please try again.\");\n },\n },\n );\n };\n\n return (\n <YStack\n fullscreen\n justifyContent=\"center\"\n alignItems=\"center\"\n backgroundColor=\"$bg-secondary\"\n padding=\"$md\"\n className=\"shell-login-container\"\n style={{\n background:\n \"radial-gradient(circle at top right, var(--color-sidebar-hover), transparent), radial-gradient(circle at bottom left, var(--color-focus-ring), transparent)\",\n }}\n >\n <Card\n width=\"100%\"\n maxWidth={400}\n padding=\"$xl\"\n borderRadius=\"$xl\"\n elevated\n backgroundColor=\"$bg\"\n >\n <YStack alignItems=\"center\" marginBottom=\"$xl\" gap=\"$md\">\n {logo ? (\n <YStack>{typeof logo === \"string\" ? <img src={logo} alt=\"Logo\" style={{ maxHeight: 48 }} /> : logo}</YStack>\n ) : (\n <YStack\n width={48}\n height={48}\n borderRadius=\"$lg\"\n backgroundColor=\"$primary\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Heading color=\"#fff\" fontSize=\"$lg\">\n M\n </Heading>\n </YStack>\n )}\n <YStack alignItems=\"center\" gap=\"$xs\">\n <Heading size=\"$lg\">{title}</Heading>\n <Paragraph color=\"$text-secondary\" fontSize=\"$sm\">\n Sign in to your account\n </Paragraph>\n </YStack>\n </YStack>\n\n {configuredProviders.length > 0 && (\n <YStack gap=\"$sm\" marginBottom=\"$lg\">\n {configuredProviders.map((provider) => (\n <Button\n key={provider}\n variant=\"default\"\n onClick={() => (globalThis.location.href = `/api/v1/auth/oauth/${provider}/start`)}\n width=\"100%\"\n >\n <XStack gap=\"$sm\" alignItems=\"center\">\n <Heading fontSize=\"$sm\" opacity={0.7}>\n {OAUTH_PROVIDERS[provider]?.icon || \"ID\"}\n </Heading>\n <Paragraph fontSize=\"$sm\">\n {OAUTH_PROVIDERS[provider]?.label || `Continue with ${provider}`}\n </Paragraph>\n </XStack>\n </Button>\n ))}\n\n <XStack alignItems=\"center\" gap=\"$sm\" marginVertical=\"$sm\">\n <YStack height={1} flex={1} backgroundColor=\"$border\" />\n <Paragraph fontSize=\"$xs\" color=\"$text-muted\">\n or\n </Paragraph>\n <YStack height={1} flex={1} backgroundColor=\"$border\" />\n </XStack>\n </YStack>\n )}\n\n {error && (\n <YStack\n backgroundColor=\"$error-bg\"\n borderColor=\"$error\"\n borderWidth={1}\n borderRadius=\"$md\"\n padding=\"$sm\"\n marginBottom=\"$lg\"\n >\n <Paragraph color=\"$error\" fontSize=\"$sm\">\n {error}\n </Paragraph>\n </YStack>\n )}\n\n <form onSubmit={handleSubmit}>\n <YStack gap=\"$lg\">\n <YStack gap=\"$xs\">\n <Paragraph fontSize=\"$xs\" fontWeight=\"500\">\n Email\n </Paragraph>\n <Input\n name=\"email\"\n type=\"email\"\n required\n autoComplete=\"email\"\n placeholder=\"you@example.com\"\n />\n </YStack>\n\n <YStack gap=\"$xs\">\n <Paragraph fontSize=\"$xs\" fontWeight=\"500\">\n Password\n </Paragraph>\n <Input\n name=\"password\"\n type=\"password\"\n required\n autoComplete=\"current-password\"\n placeholder=\"••••••••\"\n />\n </YStack>\n\n <Button type=\"submit\" variant=\"primary\" loading={isLoading} size=\"lg\">\n {isLoading ? \"Signing in...\" : \"Sign In\"}\n </Button>\n </YStack>\n </form>\n\n <YStack marginTop=\"$xl\" alignItems=\"center\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n globalThis.location.href = \"/forgot-password\";\n }}\n >\n Forgot password?\n </Button>\n </YStack>\n </Card>\n </YStack>\n );\n}\n\nexport default LoginPage;\n","/**\n * Auth Configuration Types\n *\n * Per checklist 4.1: Auth configuration via window.__FRAMEWORK_CONFIG__\n */\n\n/**\n * OIDC configuration for client-side PKCE flow\n */\nexport interface OIDCConfig {\n /** OIDC authority URL */\n authority: string;\n /** Client ID */\n clientId: string;\n /** Redirect URI after auth */\n redirectUri: string;\n /** Post-logout redirect URI */\n postLogoutRedirectUri?: string;\n /** Scopes to request */\n scope?: string;\n}\n\n/**\n * Auth strategy type\n * - \"cookie\": Indie/BFF mode with HttpOnly cookies\n * - \"oidc\": Client-side PKCE with OIDC provider\n */\nexport type AuthStrategy = \"cookie\" | \"oidc\";\n\n/**\n * Framework auth configuration\n */\nexport interface AuthConfig {\n /** Auth strategy */\n authStrategy: AuthStrategy;\n /** Login URL for cookie mode (redirect on 401) */\n loginUrl?: string;\n /** OIDC config for oidc mode */\n oidcConfig?: OIDCConfig;\n}\n\n/**\n * Get auth config from window or defaults\n */\nexport function getAuthConfig(): AuthConfig {\n const config = (window as unknown as { __FRAMEWORK_CONFIG__?: { auth?: AuthConfig } }).__FRAMEWORK_CONFIG__?.auth;\n \n return {\n authStrategy: config?.authStrategy ?? \"cookie\",\n loginUrl: config?.loginUrl ?? \"/login\",\n oidcConfig: config?.oidcConfig,\n };\n}\n","import { createContext } from \"react\";\nimport type { ShellContextValue } from \"./types\";\n\nexport const ShellContext = createContext<ShellContextValue | null>(null);\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { ShellContext } from \"./context\";\nimport type {\n ShellSection,\n OmniSearchResult,\n OmniSearchProvider,\n RealtimeMessage,\n RealtimeSubscriber,\n RealtimeAdapter,\n ShellContextValue,\n} from \"./types\";\nimport type { FrameworkMPlugin } from \"@framework-m/plugin-sdk\";\n\nfunction upsertSection(\n current: ShellSection[],\n incoming: ShellSection,\n): ShellSection[] {\n const next: ShellSection[] = [];\n for (const item of current) {\n if (item.id !== incoming.id) {\n next.push(item);\n }\n }\n next.push(incoming);\n return next;\n}\n\nfunction removeSectionById(\n current: ShellSection[],\n sectionId: string,\n): ShellSection[] {\n const next: ShellSection[] = [];\n for (const item of current) {\n if (item.id !== sectionId) {\n next.push(item);\n }\n }\n return next;\n}\n\nfunction removeProvider(\n current: OmniSearchProvider[],\n provider: OmniSearchProvider,\n): OmniSearchProvider[] {\n const next: OmniSearchProvider[] = [];\n for (const item of current) {\n if (item !== provider) {\n next.push(item);\n }\n }\n return next;\n}\n\nfunction removeRoomSubscriber(\n state: Record<string, RealtimeSubscriber[]>,\n room: string,\n listener: RealtimeSubscriber,\n): Record<string, RealtimeSubscriber[]> {\n const next = [...(state[room] ?? [])].filter((item) => item !== listener);\n if (next.length > 0) {\n return { ...state, [room]: next };\n }\n\n const clone = { ...state };\n delete clone[room];\n return clone;\n}\n\nfunction localRealtimeAdapter(): RealtimeAdapter {\n const channelName = \"frameworkm-realtime\";\n return {\n connect: (onMessage) => {\n if (globalThis.BroadcastChannel === undefined) {\n return undefined;\n }\n\n const channel = new BroadcastChannel(channelName);\n const handler = (event: MessageEvent<RealtimeMessage>) => {\n if (event.data) {\n onMessage(event.data);\n }\n };\n\n channel.addEventListener(\"message\", handler);\n return () => {\n channel.removeEventListener(\"message\", handler);\n channel.close();\n };\n },\n publish: (message) => {\n if (globalThis.BroadcastChannel === undefined) {\n return;\n }\n const channel = new BroadcastChannel(channelName);\n channel.postMessage(message);\n channel.close();\n },\n };\n}\n\nexport function ShellProvider({\n children,\n focusMode,\n setFocusMode,\n realtimeAdapter,\n initialPlugins = [],\n}: Readonly<{\n children: ReactNode;\n focusMode: boolean;\n setFocusMode: (value: boolean) => void;\n realtimeAdapter?: RealtimeAdapter;\n initialPlugins?: FrameworkMPlugin[];\n}>) {\n const [sections, setSections] = useState<ShellSection[]>([]);\n const [searchProviders, setSearchProviders] = useState<OmniSearchProvider[]>(\n [],\n );\n const realtimeAdapterRef = useRef<RealtimeAdapter>(\n realtimeAdapter ?? localRealtimeAdapter()\n );\n const disconnectAdapterRef = useRef<(() => void) | null>(null);\n const roomSubscribersRef = useRef<Record<string, RealtimeSubscriber[]>>({});\n\n const dispatchRealtimeMessage = useCallback((message: RealtimeMessage) => {\n const currentSubscribers = roomSubscribersRef.current;\n const roomListeners = currentSubscribers[message.room] ?? [];\n const wildcardListeners = currentSubscribers[\"*\"] ?? [];\n const listeners = [...roomListeners, ...wildcardListeners];\n for (const listener of listeners) {\n listener(message);\n }\n }, []);\n\n const registerSection = useCallback((section: ShellSection) => {\n setSections((prev) => upsertSection(prev, section));\n\n function cleanupSection(): void {\n setSections((prev) => removeSectionById(prev, section.id));\n }\n\n return cleanupSection;\n }, []);\n\n const getSections = useCallback(\n (slot: ShellSection[\"slot\"]) =>\n sections\n .filter((section) => section.slot === slot)\n .sort((a, b) => (a.order ?? 999) - (b.order ?? 999)),\n [sections],\n );\n\n const registerOmniSearchProvider = useCallback(\n (provider: OmniSearchProvider) => {\n setSearchProviders((prev) => [...prev, provider]);\n\n function cleanupProvider(): void {\n setSearchProviders((prev) => removeProvider(prev, provider));\n }\n\n return cleanupProvider;\n },\n [],\n );\n\n const searchOmni = useCallback(\n async (query: string) => {\n const trimmed = query.trim();\n if (!trimmed || searchProviders.length === 0) return [];\n\n const resolved = await Promise.all(\n searchProviders.map((provider) => Promise.resolve(provider(trimmed))),\n );\n\n const seen = new Set<string>();\n const merged: OmniSearchResult[] = [];\n for (const providerResults of resolved) {\n for (const result of providerResults) {\n if (seen.has(result.id)) continue;\n seen.add(result.id);\n merged.push(result);\n }\n }\n return merged;\n },\n [searchProviders],\n );\n\n const setRealtimeAdapter = useCallback(\n async (adapter: RealtimeAdapter | null) => {\n if (disconnectAdapterRef.current) {\n disconnectAdapterRef.current();\n }\n\n const nextAdapter = adapter ?? localRealtimeAdapter();\n const maybeDisconnect = await nextAdapter.connect(dispatchRealtimeMessage);\n disconnectAdapterRef.current = maybeDisconnect ?? null;\n realtimeAdapterRef.current = nextAdapter;\n },\n [dispatchRealtimeMessage],\n );\n\n const subscribeRealtime = useCallback(\n (room: string, listener: RealtimeSubscriber) => {\n const current = roomSubscribersRef.current;\n roomSubscribersRef.current = {\n ...current,\n [room]: [...(current[room] ?? []), listener],\n };\n\n function cleanupRealtime(): void {\n roomSubscribersRef.current = removeRoomSubscriber(\n roomSubscribersRef.current,\n room,\n listener,\n );\n }\n\n return cleanupRealtime;\n },\n [],\n );\n\n const publishRealtime = useCallback(\n async (room: string, type: string, payload: Record<string, unknown>) => {\n const message: RealtimeMessage = {\n room,\n type,\n payload,\n timestamp: Date.now(),\n };\n dispatchRealtimeMessage(message);\n await Promise.resolve(realtimeAdapterRef.current.publish(message));\n },\n [dispatchRealtimeMessage],\n );\n\n const value = useMemo<ShellContextValue>(\n () => ({\n focusMode,\n setFocusMode,\n toggleFocusMode: () => setFocusMode(!focusMode),\n registerSection,\n getSections,\n registerOmniSearchProvider,\n searchOmni,\n setRealtimeAdapter,\n subscribeRealtime,\n publishRealtime,\n }),\n [\n focusMode,\n setFocusMode,\n registerSection,\n getSections,\n registerOmniSearchProvider,\n searchOmni,\n setRealtimeAdapter,\n subscribeRealtime,\n publishRealtime,\n ],\n );\n\n useEffect(() => {\n const cleanups: (() => void)[] = [];\n \n // 1. Fetch Dynamic Navigation from Backend (Metadata Driven)\n const fetchBackendMenu = async () => {\n try {\n const resp = await fetch(\"/api/meta/doctypes\");\n if (resp.ok) {\n const data = await resp.json();\n for (const item of data.doctypes || []) {\n if (!item.show_in_desk) continue;\n \n // Clean up module name (e.g. framework_m_core.doctypes -> Core)\n let moduleName = item.module || \"Personnel\";\n if (moduleName.includes(\"core\")) moduleName = \"Core\";\n else if (moduleName.includes(\"standard\")) moduleName = \"Standard\";\n else if (moduleName.includes(\".\")) {\n moduleName = moduleName.split(\".\")[0].replace(\"framework_m_\", \"\").charAt(0).toUpperCase() + \n moduleName.split(\".\")[0].replace(\"framework_m_\", \"\").slice(1);\n }\n\n const cleanup = registerSection({\n id: item.name,\n label: item.label || item.name,\n route: `/app/${item.name}/list`,\n slot: \"sidebar\",\n module: moduleName,\n order: 1000,\n });\n cleanups.push(cleanup);\n }\n }\n } catch (e) {\n console.error(\"Shell: Failed to fetch backend menu\", e);\n }\n };\n fetchBackendMenu();\n\n // 2. Register local plugin-based navigation\n for (const plugin of initialPlugins) {\n if (plugin.menu) {\n for (const item of plugin.menu) {\n const cleanup = registerSection({\n id: item.name,\n label: item.label,\n route: item.route,\n slot: \"sidebar\",\n module: item.module,\n order: item.order,\n });\n cleanups.push(cleanup);\n }\n }\n }\n \n return () => {\n for (const cleanup of cleanups) {\n cleanup();\n }\n };\n }, [initialPlugins, registerSection]);\n\n useEffect(() => {\n return () => {\n if (disconnectAdapterRef.current) {\n disconnectAdapterRef.current();\n }\n };\n }, []);\n\n return (\n <ShellContext.Provider value={value}>{children}</ShellContext.Provider>\n );\n}\n","import type { RealtimeAdapter, RealtimeMessage } from \"./types\";\n\n/**\n * Creates a WebSocket-based realtime adapter for the Shell.\n * \n * @param url The WebSocket server URL\n * @returns A RealtimeAdapter instance\n */\nexport function createWebSocketRealtimeAdapter(url: string): RealtimeAdapter {\n let socket: WebSocket | null = null;\n\n return {\n connect: (onMessage) => {\n socket = new WebSocket(url);\n const handleMessage = (event: MessageEvent<string>) => {\n try {\n const parsed = JSON.parse(event.data) as RealtimeMessage;\n if (parsed.room && parsed.type) {\n onMessage(parsed);\n }\n } catch {\n // Ignore malformed realtime payloads\n }\n };\n\n socket.addEventListener(\"message\", handleMessage);\n\n return () => {\n if (!socket) return;\n socket.removeEventListener(\"message\", handleMessage);\n socket.close();\n socket = null;\n };\n },\n publish: (message) => {\n if (socket?.readyState !== WebSocket.OPEN) {\n return;\n }\n socket.send(JSON.stringify(message));\n },\n };\n}\n","import { useContext } from \"react\";\nimport { ShellContext } from \"../shell/context\";\nimport type { ShellContextValue } from \"../shell/types\";\n\nexport function useShell(): ShellContextValue {\n const context = useContext(ShellContext);\n if (!context) {\n throw new Error(\"useShell must be used within a ShellProvider\");\n }\n return context;\n}\n","import { useState, useMemo, useCallback, useEffect } from \"react\";\nimport { useNavigate, useLocation } from \"react-router\";\nimport {\n YStack,\n XStack,\n Button,\n Heading,\n Paragraph,\n Input,\n} from \"@framework-m/ui\";\nimport { Slot } from \"../../../plugins\";\nimport { useShell } from \"../../../hooks/useShell\";\n\ninterface MenuSourceItem {\n name: string;\n label?: string;\n icon?: string;\n route?: string;\n module?: string;\n parent?: string;\n}\n\ninterface MenuItem extends MenuSourceItem {\n children?: MenuItem[];\n}\n\ninterface SidebarNavItem {\n key: string;\n name: string;\n label: string;\n route: string;\n breadcrumb: string;\n selected: boolean;\n}\n\nfunction resolveKey(name: string, route: string): string {\n return `${name}:${route}`;\n}\n\nfunction normalizeMenuItem(\n item: MenuSourceItem,\n moduleName: string,\n selectedKey: string,\n): SidebarNavItem {\n const route = item.route ?? `/app/${item.name}/list`;\n return {\n key: `${item.name}:${route}`,\n name: item.name,\n label: item.label ?? item.name,\n route,\n breadcrumb: moduleName ? `${moduleName} / ${item.name}` : item.name,\n selected: selectedKey === resolveKey(item.name, route),\n };\n}\n\nexport interface SidebarProps {\n collapsed?: boolean;\n onCollapse?: (collapsed: boolean) => void;\n menuItems?: MenuItem[];\n /** Whether the current viewport is mobile */\n isMobile?: boolean;\n /** Whether the mobile drawer is open */\n mobileOpen?: boolean;\n /** Callback to close the mobile drawer */\n onCloseMobile?: () => void;\n}\n\nexport function Sidebar({\n collapsed = false,\n onCollapse,\n isMobile = false,\n mobileOpen = false,\n onCloseMobile,\n}: Readonly<SidebarProps>) {\n const navigate = useNavigate();\n const location = useLocation();\n const shell = useShell();\n const [search, setSearch] = useState(\"\");\n const [favorites, setFavorites] = useState<Set<string>>(new Set());\n const [collapsedGroups, setCollapsedGroups] = useState<Record<string, boolean>>(\n {},\n );\n const [recent, setRecent] = useState<any[]>([]);\n\n const selectedKey = useMemo(() => {\n const segments = location.pathname.split(\"/\").filter(Boolean);\n const appIndex = segments.indexOf(\"app\");\n if (appIndex < 0 || appIndex + 1 >= segments.length) return \"\";\n const doctype = segments[appIndex + 1];\n return resolveKey(doctype, location.pathname);\n }, [location.pathname]);\n\n const menuSections = useMemo(() => {\n return shell.getSections(\"sidebar\");\n }, [shell]);\n\n useEffect(() => {\n const storedRecent = localStorage.getItem(\"frameworkm:recent\");\n if (storedRecent) {\n try {\n setRecent(JSON.parse(storedRecent));\n } catch (e) {\n console.error(\"Failed to parse recent items\", e);\n }\n }\n }, []);\n\n useEffect(() => {\n if (!location.pathname.startsWith(\"/app/\")) return;\n const currentItem = menuSections.find(item => item.route === location.pathname);\n if (!currentItem) return;\n\n setRecent(prev => {\n const next = [currentItem, ...prev.filter(i => i.id !== currentItem.id)].slice(0, 5);\n localStorage.setItem(\"frameworkm:recent\", JSON.stringify(next));\n return next;\n });\n }, [location.pathname, menuSections]);\n\n const favoritesList = useMemo(() => {\n return menuSections\n .filter((item) => favorites.has(item.id))\n .map((item) => normalizeMenuItem(item as any, item.module ?? \"\", selectedKey));\n }, [menuSections, favorites, selectedKey]);\n\n const recentList = useMemo(() => {\n return recent.map((item) => normalizeMenuItem(item as any, item.module ?? \"\", selectedKey));\n }, [recent, selectedKey]);\n\n const filteredPluginMenu = useMemo(() => {\n const lowerSearch = search.toLowerCase();\n const groups: Record<string, any[]> = {};\n\n menuSections.forEach((item) => {\n const moduleName = item.module ?? \"Personnel\";\n if (!groups[moduleName]) groups[moduleName] = [];\n if (\n !search ||\n item.id.toLowerCase().includes(lowerSearch) ||\n item.label?.toLowerCase().includes(lowerSearch)\n ) {\n groups[moduleName].push(item);\n }\n });\n\n return Object.entries(groups)\n .filter(([_, items]) => items.length > 0)\n .map(([name, items]) => ({ name, items }));\n }, [menuSections, search]);\n\n const toggleFavorite = useCallback((id: string) => {\n setFavorites((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n }, []);\n\n const toggleGroup = useCallback((name: string) => {\n setCollapsedGroups((prev) => ({\n ...prev,\n [name]: !prev[name],\n }));\n }, []);\n\n const navigateTo = useCallback(\n (item: { route: string }) => {\n navigate(item.route);\n },\n [navigate],\n );\n\n return (\n <>\n {isMobile && mobileOpen && (\n <YStack\n position=\"fixed\"\n inset={0}\n backgroundColor=\"rgba(2, 6, 23, 0.45)\"\n zIndex={1150}\n onPress={onCloseMobile}\n style={{ transition: \"opacity 0.2s ease\" }}\n />\n )}\n <YStack\n tag=\"aside\"\n width={isMobile ? 280 : (collapsed ? 64 : 260)}\n backgroundColor=\"$sidebar-bg\"\n height=\"100%\"\n minHeight=\"100vh\"\n position={isMobile ? \"fixed\" : \"sticky\"}\n left={isMobile ? (mobileOpen ? 0 : -280) : 0}\n zIndex={isMobile ? 1200 : 100}\n top={0}\n flexShrink={0}\n overflow=\"hidden\"\n style={{ transition: \"width 0.2s ease, left 0.2s ease\" }}\n >\n <XStack\n padding=\"$lg\"\n alignItems=\"center\"\n justifyContent={(collapsed && !isMobile) ? \"center\" : \"space-between\"}\n borderBottomWidth={1}\n borderBottomColor=\"$borderColorMuted\"\n >\n {(!collapsed || isMobile) && (\n <Heading size=\"$xs\" color=\"$sidebar-text\" fontWeight=\"700\" letterSpacing={1} opacity={0.6}>\n NAVIGATION\n </Heading>\n )}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={isMobile ? onCloseMobile : () => onCollapse?.(!collapsed)}\n style={{ padding: 0, width: 28, height: 28 }}\n >\n <Paragraph size=\"$xs\" color=\"$sidebar-text\">\n {isMobile ? \"✕\" : (collapsed ? \"→\" : \"←\")}\n </Paragraph>\n </Button>\n </XStack>\n\n {(!collapsed || isMobile) && (\n <YStack paddingHorizontal=\"$lg\" paddingVertical=\"$md\">\n <Input\n placeholder=\"Search...\"\n value={search}\n onChange={(e: any) => setSearch(e.target.value)}\n size=\"sm\"\n backgroundColor=\"rgba(255,255,255,0.05)\"\n color=\"#fff\"\n borderWidth={0}\n />\n </YStack>\n )}\n\n <YStack flex={1} overflowY=\"auto\" paddingVertical=\"$sm\">\n <Slot name=\"sidebar-top\" />\n\n {favoritesList.length > 0 && (\n <>\n {!collapsed && (\n <XStack paddingHorizontal=\"$lg\" paddingVertical=\"$xs\">\n <Paragraph fontSize={10} fontWeight=\"800\" color=\"$sidebar-text-muted\" letterSpacing={1}>\n FAVORITES\n </Paragraph>\n </XStack>\n )}\n {favoritesList.map((item) => (\n <SidebarItem\n key={item.key}\n item={item}\n collapsed={collapsed}\n onNavigate={() => navigateTo(item)}\n favoriteAction={() => toggleFavorite(item.name)}\n isFavorite={true}\n />\n ))}\n <YStack height={1} backgroundColor=\"rgba(255,255,255,0.05)\" marginVertical=\"$sm\" />\n </>\n )}\n\n {recentList.length > 0 && !collapsed && (\n <>\n <XStack paddingHorizontal=\"$lg\" paddingVertical=\"$xs\">\n <Paragraph fontSize={10} fontWeight=\"800\" color=\"$sidebar-text-muted\" letterSpacing={1}>\n RECENT\n </Paragraph>\n </XStack>\n {recentList.map((item) => (\n <SidebarItem\n key={`recent-${item.key}`}\n item={item}\n collapsed={collapsed}\n onNavigate={() => navigateTo(item)}\n favoriteAction={() => toggleFavorite(item.name)}\n isFavorite={favorites.has(item.name)}\n />\n ))}\n <YStack height={1} backgroundColor=\"rgba(255,255,255,0.05)\" marginVertical=\"$sm\" />\n </>\n )}\n\n {filteredPluginMenu.map((group) => (\n <YStack key={group.name}>\n {!collapsed && (\n <XStack\n paddingHorizontal=\"$lg\"\n paddingVertical=\"$xs\"\n cursor=\"pointer\"\n hoverStyle={{ opacity: 0.8 }}\n onPress={() => toggleGroup(group.name)}\n justifyContent=\"space-between\"\n alignItems=\"center\"\n marginTop=\"$sm\"\n >\n <Paragraph fontSize={10} fontWeight=\"800\" color=\"$sidebar-text-muted\" letterSpacing={1}>\n {group.name.toUpperCase()}\n </Paragraph>\n <Paragraph fontSize={10} color=\"$sidebar-text-muted\">\n {collapsedGroups[group.name] ? \"▼\" : \"▲\"}\n </Paragraph>\n </XStack>\n )}\n {!collapsedGroups[group.name] &&\n group.items.map((item: any) => {\n const navItem = normalizeMenuItem(item, group.name, selectedKey);\n return (\n <SidebarItem\n key={navItem.key}\n item={navItem}\n collapsed={collapsed}\n onNavigate={() => navigateTo(navItem)}\n favoriteAction={() => toggleFavorite(item.id)}\n isFavorite={favorites.has(item.id)}\n />\n );\n })}\n </YStack>\n ))}\n </YStack>\n\n <Slot name=\"sidebar-bottom\" />\n </YStack>\n </>\n );\n}\n\ninterface SidebarItemProps {\n item: SidebarNavItem;\n collapsed: boolean;\n onNavigate: (item: SidebarNavItem) => void;\n favoriteAction: () => void;\n isFavorite: boolean;\n}\n\nfunction SidebarItem({\n item,\n collapsed,\n onNavigate,\n favoriteAction,\n isFavorite,\n}: SidebarItemProps) {\n return (\n <XStack\n paddingHorizontal={collapsed ? \"$xs\" : \"$md\"}\n paddingVertical=\"$xs\"\n alignItems=\"center\"\n gap=\"$sm\"\n cursor=\"pointer\"\n backgroundColor={item.selected ? \"rgba(255,255,255,0.1)\" : \"transparent\"}\n hoverStyle={{ backgroundColor: \"rgba(255,255,255,0.05)\" }}\n onPress={() => onNavigate(item)}\n flexDirection=\"row\"\n style={{ display: \"flex\", flexDirection: \"row\" }}\n >\n <YStack\n width={32}\n height={32}\n alignItems=\"center\"\n justifyContent=\"center\"\n borderRadius=\"$round\"\n backgroundColor={item.selected ? \"$primary\" : \"rgba(255,255,255,0.05)\"}\n shadowColor=\"$shadowColor\"\n shadowRadius={2}\n >\n <Paragraph color={item.selected ? \"#fff\" : \"$sidebar-text\"} fontSize=\"$xs\" fontWeight=\"700\">\n {item.label.charAt(0).toUpperCase()}\n </Paragraph>\n </YStack>\n\n {!collapsed && (\n <XStack flex={1} justifyContent=\"space-between\" alignItems=\"center\">\n <Paragraph color={item.selected ? \"#fff\" : \"$sidebar-text\"} fontSize=\"$sm\" fontWeight={item.selected ? \"600\" : \"500\"}>\n {item.label}\n </Paragraph>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`toggle-favorite-${item.name}`}\n onPress={(e: any) => {\n e.stopPropagation();\n favoriteAction();\n }}\n style={{ padding: 0, width: 24, height: 24, opacity: isFavorite ? 1 : 0 }}\n hoverStyle={{ opacity: 1 }}\n >\n <Paragraph color={isFavorite ? \"#fbbf24\" : \"$sidebar-text-muted\"}>\n {isFavorite ? \"★\" : \"☆\"}\n </Paragraph>\n </Button>\n </XStack>\n )}\n </XStack>\n );\n}\n","import { useState, useCallback, useEffect } from \"react\";\nimport { useGetIdentity, useLogout } from \"@refinedev/core\";\nimport { useNavigate } from \"react-router\";\nimport {\n XStack,\n YStack,\n ZStack,\n Button,\n Heading,\n Paragraph,\n Card,\n Input,\n LocaleSwitcher,\n useTheme,\n} from \"@framework-m/ui\";\nimport { Slot } from \"../../../plugins\";\nimport { useTranslation } from \"../../../hooks/useTranslation\";\nimport { createWebSocketRealtimeAdapter } from \"../../../shell/realtime\";\nimport { useShell } from \"../../../hooks/useShell\";\n\n/**\n * Navbar props\n */\nexport interface NavbarProps {\n /** App title */\n title?: string;\n /** Logo URL */\n logo?: string;\n /** Whether to show global search */\n showSearch?: boolean;\n /** Optional callback to toggle mobile menu */\n onMenuToggle?: () => void;\n}\n\n/**\n * User identity type\n */\ninterface UserIdentity {\n id: string;\n name?: string;\n email?: string;\n avatar?: string;\n}\n\ntype ShellView = \"list\" | \"kanban\" | \"tree\" | \"calendar\";\n\ninterface BreadcrumbItem {\n label: string;\n to?: string;\n}\n\ninterface CollaboratorPresence {\n id: string;\n name: string;\n avatar?: string;\n color: string;\n lastSeen: number;\n}\n\nconst AVATAR_COLORS = [\n \"#2563eb\",\n \"#0f766e\",\n \"#9333ea\",\n \"#b45309\",\n \"#be185d\",\n \"#1d4ed8\",\n];\n\nfunction avatarColorFor(id: string): string {\n let hash = 0;\n for (let i = 0; i < id.length; i += 1) {\n hash = Math.trunc((hash << 5) - hash + (id.codePointAt(i) ?? 0));\n }\n const index = Math.abs(hash) % AVATAR_COLORS.length;\n return AVATAR_COLORS[index];\n}\n\nfunction mergeCollaboratorPresence(\n previous: CollaboratorPresence[],\n incomingId: string,\n incomingName: string,\n incomingAvatar: string | undefined,\n phase: string,\n): CollaboratorPresence[] {\n const next = [...previous];\n const currentIndex = next.findIndex((item) => item.id === incomingId);\n\n if (phase === \"leave\") {\n if (currentIndex >= 0) next.splice(currentIndex, 1);\n return next;\n }\n\n const merged: CollaboratorPresence = {\n id: incomingId,\n name: incomingName,\n avatar: incomingAvatar,\n color: avatarColorFor(incomingId),\n lastSeen: Date.now(),\n };\n\n if (currentIndex >= 0) {\n next[currentIndex] = merged;\n return next;\n }\n\n next.push(merged);\n return next;\n}\n\nfunction keepRecentCollaborators(\n collaborators: CollaboratorPresence[],\n): CollaboratorPresence[] {\n const now = Date.now();\n return collaborators.filter((item) => now - item.lastSeen < 30000);\n}\n\nfunction splitPath(pathname: string): string[] {\n return pathname.split(\"/\").filter(Boolean);\n}\n\nfunction getAppSegments(pathname: string): string[] {\n const segments = splitPath(pathname);\n const appIndex = segments.indexOf(\"app\");\n if (appIndex < 0) return [];\n return segments.slice(appIndex + 1);\n}\n\nfunction normalizeLabel(value: string): string {\n const words = value\n .replaceAll(\"_\", \" \")\n .replaceAll(\"-\", \" \")\n .split(\" \")\n .filter(Boolean);\n\n return words\n .map((word) => {\n const first = word.slice(0, 1).toUpperCase();\n const rest = word.slice(1);\n return `${first}${rest}`;\n })\n .join(\" \");\n}\n\nfunction getShellRouteInfo(pathname: string): {\n doctype?: string;\n view?: ShellView;\n documentId?: string;\n breadcrumbs: BreadcrumbItem[];\n} {\n const appSegments = getAppSegments(pathname);\n const breadcrumbs: BreadcrumbItem[] = [\n { label: \"Home\", to: \"/app/dashboard\" },\n ];\n\n if (appSegments.length === 0) {\n return { breadcrumbs };\n }\n\n if (appSegments[0] === \"dashboard\") {\n breadcrumbs.push({ label: \"Dashboard\" });\n return { breadcrumbs };\n }\n\n const doctype = appSegments[0];\n const mode = appSegments[1];\n const documentId = appSegments[2];\n\n breadcrumbs.push({\n label: normalizeLabel(doctype),\n to: `/app/${doctype}/list`,\n });\n\n if (mode === \"new\") {\n breadcrumbs.push({ label: \"New\" });\n return { doctype, view: \"list\", breadcrumbs };\n }\n\n if (mode === \"edit\" || mode === \"detail\") {\n breadcrumbs.push({ label: documentId ? String(documentId) : \"Document\" });\n return { doctype, view: \"list\", documentId, breadcrumbs };\n }\n\n if (\n mode === \"list\" ||\n mode === \"kanban\" ||\n mode === \"tree\" ||\n mode === \"calendar\"\n ) {\n breadcrumbs.push({ label: normalizeLabel(mode) });\n return {\n doctype,\n view: mode,\n documentId,\n breadcrumbs,\n };\n }\n\n return { doctype, view: \"list\", documentId, breadcrumbs };\n}\n\nexport function Navbar({\n title = \"Framework M\",\n logo,\n showSearch = true,\n onMenuToggle,\n}: Readonly<NavbarProps>) {\n const { data: identity } = useGetIdentity<UserIdentity>();\n const { mutate: logout, status: logoutStatus } = useLogout();\n const navigate = useNavigate();\n const { theme, toggleTheme } = useTheme();\n const { language, changeLanguage } = useTranslation();\n const shell = useShell();\n const routeInfo = getShellRouteInfo(globalThis.location?.pathname ?? \"\");\n const leftSections = shell.getSections(\"navbar-left\");\n const rightSections = shell.getSections(\"navbar-right\");\n const [collaborators, setCollaborators] = useState<CollaboratorPresence[]>(\n [],\n );\n const [unreadNotifications, setUnreadNotifications] = useState(0);\n\n const [search, setSearch] = useState(\"\");\n const [showUserMenu, setShowUserMenu] = useState(false);\n const [isMobile, setIsMobile] = useState(\n globalThis.window?.innerWidth ? globalThis.window.innerWidth < 1024 : false,\n );\n\n useEffect(() => {\n const onResize = () => setIsMobile(window.innerWidth < 1024);\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n const handleSearch = useCallback(\n (e: React.FormEvent) => {\n e.preventDefault();\n if (search.trim()) {\n shell.searchOmni(search.trim()).then((omniResults) => {\n if (omniResults.length > 0) {\n navigate(omniResults[0].route);\n return;\n }\n navigate(`/app/search?q=${encodeURIComponent(search.trim())}`);\n });\n }\n },\n [search, navigate, shell],\n );\n\n const handleLogout = useCallback(() => {\n logout();\n setShowUserMenu(false);\n }, [logout]);\n\n const isLoggingOut = logoutStatus === \"pending\";\n const identityId = String(identity?.id ?? \"\").toLowerCase();\n const identityName = String(identity?.name ?? \"\").toLowerCase();\n const identityEmail = String(identity?.email ?? \"\").toLowerCase();\n const isGuestIdentity =\n identityId === \"guest\" ||\n identityName === \"guest user\" ||\n identityEmail === \"guest\";\n const isAuthenticated = Boolean(identity?.id) && !isGuestIdentity;\n const roomId = routeInfo.doctype\n ? `doctype:${routeInfo.doctype}:${routeInfo.documentId ?? routeInfo.view ?? \"list\"}`\n : \"workspace:global\";\n\n useEffect(() => {\n const wsUrl = (import.meta.env?.VITE_FRAMEWORKM_WS_URL as string) || \"\";\n if (!wsUrl) return;\n shell\n .setRealtimeAdapter(createWebSocketRealtimeAdapter(wsUrl))\n .catch(() => undefined);\n }, [shell]);\n\n useEffect(() => {\n if (!isAuthenticated) {\n setCollaborators([]);\n return;\n }\n\n const selfId = String(identity?.id ?? \"\");\n const selfName = String(identity?.name ?? identity?.email ?? \"User\");\n const selfAvatar = identity?.avatar;\n\n const publishPresence = (phase: \"join\" | \"heartbeat\" | \"leave\") => {\n shell\n .publishRealtime(roomId, \"presence\", {\n phase,\n id: selfId,\n name: selfName,\n avatar: selfAvatar,\n })\n .catch(() => undefined);\n };\n\n const unsubscribe = shell.subscribeRealtime(roomId, (message) => {\n if (message.type !== \"presence\") return;\n\n const payload = message.payload;\n const incomingId = String(payload.id ?? \"\");\n const incomingName = String(payload.name ?? \"User\");\n const incomingAvatar =\n typeof payload.avatar === \"string\" ? payload.avatar : undefined;\n const phase = String(payload.phase ?? \"heartbeat\");\n\n if (!incomingId) return;\n\n setCollaborators((prev) =>\n mergeCollaboratorPresence(\n prev,\n incomingId,\n incomingName,\n incomingAvatar,\n phase,\n ),\n );\n });\n\n publishPresence(\"join\");\n\n const heartbeatTimer = globalThis.setInterval(() => {\n publishPresence(\"heartbeat\");\n setCollaborators(keepRecentCollaborators);\n }, 12000);\n\n return () => {\n globalThis.clearInterval(heartbeatTimer);\n publishPresence(\"leave\");\n unsubscribe();\n };\n }, [\n identity?.avatar,\n identity?.email,\n identity?.id,\n identity?.name,\n isAuthenticated,\n roomId,\n shell,\n ]);\n\n useEffect(() => {\n if (!isAuthenticated) {\n setUnreadNotifications(0);\n return;\n }\n\n const unsubscribe = shell.subscribeRealtime(\n \"workspace:notifications\",\n (message) => {\n if (message.type === \"notification\") {\n setUnreadNotifications((previous) => previous + 1);\n }\n },\n );\n\n return () => unsubscribe();\n }, [isAuthenticated, shell]);\n\n\n const quickAdd = () => {\n if (!routeInfo.doctype) return;\n navigate(`/app/${routeInfo.doctype}/new`);\n };\n\n return (\n <XStack\n tag=\"header\"\n height={64}\n backgroundColor=\"$background\"\n borderBottomWidth={1}\n borderBottomColor=\"$borderColorMuted\"\n alignItems=\"center\"\n paddingHorizontal=\"$lg\"\n gap=\"$lg\"\n zIndex={50}\n position=\"sticky\"\n top={0}\n className=\"shell-header\"\n style={{\n backdropFilter: \"blur(12px)\",\n display: \"flex\",\n flexDirection: \"row\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n gap: \"24px\",\n padding: \"0 24px\",\n height: \"56px\",\n }}\n >\n <XStack alignItems=\"center\" gap=\"$md\">\n {onMenuToggle && isMobile && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={onMenuToggle}\n aria-label=\"Toggle mobile menu\"\n style={{ padding: 0, width: 32, height: 32 }}\n >\n <Paragraph fontSize={20} color=\"$color\">☰</Paragraph>\n </Button>\n )}\n <XStack\n cursor=\"pointer\"\n hoverStyle={{ opacity: 0.8 }}\n alignItems=\"center\"\n gap=\"$sm\"\n onPress={() => navigate(\"/app/dashboard\")}\n >\n {logo && <img src={logo} alt=\"Logo\" style={{ height: 28 }} />}\n <Heading size=\"$xs\" fontWeight=\"700\">\n {title}\n </Heading>\n </XStack>\n </XStack>\n\n {!isMobile && (\n <XStack \n tag=\"nav\"\n aria-label=\"Breadcrumb\"\n alignItems=\"center\" \n gap=\"$sm\" \n flexDirection=\"row\"\n className=\"shell-breadcrumbs\"\n style={{ display: \"flex\", flexDirection: \"row\" }}\n >\n {routeInfo.breadcrumbs.map((item, index) => {\n const isLast = index === routeInfo.breadcrumbs.length - 1;\n return (\n <XStack \n key={`${item.label}-${index}`} \n alignItems=\"center\" \n gap=\"$xs\"\n flexDirection=\"row\"\n className=\"shell-breadcrumb-item\"\n style={{ display: \"flex\", flexDirection: \"row\" }}\n >\n {item.to && !isLast ? (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => navigate(item.to!)}\n paddingHorizontal=\"$xs\"\n height=\"auto\"\n >\n <Paragraph fontSize=\"$sm\" color=\"$colorSecondary\">\n {item.label}\n </Paragraph>\n </Button>\n ) : (\n <Paragraph fontSize=\"$sm\" fontWeight=\"600\" color=\"$color\">\n {item.label}\n </Paragraph>\n )}\n {!isLast && (\n <Paragraph fontSize=\"$xs\" color=\"$colorMuted\" opacity={0.4}>\n /\n </Paragraph>\n )}\n </XStack>\n );\n })}\n </XStack>\n )}\n\n {leftSections.map((section) => (\n <XStack key={section.id}>{section.render?.()}</XStack>\n ))}\n\n {showSearch && (\n <XStack flex={2} maxWidth={400} marginHorizontal=\"$lg\" minWidth={150}>\n <form\n onSubmit={handleSearch}\n style={{ width: \"100%\" }}\n >\n <Input\n type=\"search\"\n placeholder=\"Search...\"\n value={search}\n onChange={(e: any) => setSearch(e.target.value)}\n width=\"100%\"\n size=\"sm\"\n />\n </form>\n </XStack>\n )}\n\n <XStack flex={1} />\n\n {routeInfo.doctype && !globalThis.location.pathname.endsWith(\"/new\") && (\n <Button variant=\"ghost\" size=\"sm\" onClick={quickAdd}>\n <Paragraph fontSize=\"$sm\" color=\"$colorSecondary\">+ New</Paragraph>\n </Button>\n )}\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => shell.toggleFocusMode()}\n title=\"Toggle Focus Mode\"\n >\n <Paragraph fontSize=\"$sm\" color=\"$colorSecondary\">\n {shell.focusMode ? \"Exit Focus\" : \"Focus Mode\"}\n </Paragraph>\n </Button>\n\n <XStack gap=\"$sm\" alignItems=\"center\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => toggleTheme()}\n style={{ width: 32, height: 32, padding: 0 }}\n >\n <Paragraph fontSize=\"$sm\">\n {theme === \"dark\" ? \"☀️\" : \"🌙\"}\n </Paragraph>\n </Button>\n {rightSections.map((section) => (\n <XStack key={section.id}>{section.render?.()}</XStack>\n ))}\n </XStack>\n\n <Slot name=\"navbar-actions\" />\n\n <LocaleSwitcher language={language} onChangeLanguage={changeLanguage} />\n\n {collaborators.length > 0 && (\n <XStack\n gap={-8}\n alignItems=\"center\"\n marginRight=\"$sm\"\n title={`Active in this view: ${collaborators.length}`}\n >\n {collaborators.slice(0, 4).map((collaborator) => {\n const initials = collaborator.name\n .split(\" \")\n .filter(Boolean)\n .slice(0, 2)\n .map((part) => part.charAt(0).toUpperCase())\n .join(\"\");\n\n return (\n <YStack\n key={collaborator.id}\n width={28}\n height={28}\n borderRadius=\"$full\"\n borderWidth={2}\n borderColor=\"$bg\"\n backgroundColor={collaborator.color}\n alignItems=\"center\"\n justifyContent=\"center\"\n overflow=\"hidden\"\n shadowColor=\"$shadow\"\n shadowRadius={4}\n elevation={2}\n >\n {collaborator.avatar ? (\n <img src={collaborator.avatar} alt=\"\" style={{ width: \"100%\" }} />\n ) : (\n <Paragraph fontSize=\"$xs\" fontWeight=\"700\" color=\"#fff\">\n {initials || \"U\"}\n </Paragraph>\n )}\n </YStack>\n );\n })}\n </XStack>\n )}\n\n <Button\n onClick={() => {\n setUnreadNotifications(0);\n navigate(\"/app/notifications\");\n }}\n variant=\"ghost\"\n size=\"sm\"\n style={{ position: \"relative\" }}\n >\n 🔔\n {unreadNotifications > 0 && (\n <YStack\n position=\"absolute\"\n top={-4}\n right={-4}\n backgroundColor=\"$error\"\n width={16}\n height={16}\n borderRadius=\"$full\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Paragraph fontSize={10} color=\"#fff\" fontWeight=\"700\">\n {unreadNotifications > 99 ? \"99+\" : unreadNotifications}\n </Paragraph>\n </YStack>\n )}\n </Button>\n\n {isAuthenticated ? (\n <ZStack>\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={() => setShowUserMenu(!showUserMenu)}\n paddingHorizontal=\"$sm\"\n gap=\"$sm\"\n flexDirection=\"row\"\n >\n <YStack\n width={24}\n height={24}\n borderRadius=\"$full\"\n backgroundColor=\"$primary\"\n alignItems=\"center\"\n justifyContent=\"center\"\n overflow=\"hidden\"\n >\n {identity?.avatar ? (\n <img src={identity.avatar} alt=\"\" style={{ width: \"100%\" }} />\n ) : (\n <Paragraph fontSize=\"$xs\" color=\"#fff\" fontWeight=\"700\">\n {(identity?.name ?? identity?.email ?? \"U\").charAt(0).toUpperCase()}\n </Paragraph>\n )}\n </YStack>\n <Paragraph fontSize=\"$sm\">{identity?.name ?? identity?.email ?? \"User\"}</Paragraph>\n <Paragraph fontSize={10} opacity={0.5}>▼</Paragraph>\n </Button>\n\n {showUserMenu && (\n <Card\n position=\"absolute\"\n top=\"100%\"\n right={0}\n marginTop=\"$xs\"\n minWidth={200}\n padding=\"$sm\"\n elevated\n zIndex={100}\n >\n <YStack padding=\"$sm\" borderBottomWidth={1} borderBottomColor=\"$border\">\n <Paragraph fontWeight=\"600\">{identity?.name ?? \"User\"}</Paragraph>\n <Paragraph fontSize=\"$xs\" color=\"$text-secondary\">{identity?.email}</Paragraph>\n </YStack>\n\n <YStack paddingVertical=\"$xs\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n navigate(\"/app/settings\");\n setShowUserMenu(false);\n }}\n style={{ justifyContent: \"flex-start\" }}\n >\n ⚙️ Settings\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={toggleTheme}\n style={{ justifyContent: \"flex-start\" }}\n >\n {theme === \"dark\" ? \"☀️ Light\" : \"🌙 Dark\"} Mode\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleLogout}\n disabled={isLoggingOut}\n style={{ justifyContent: \"flex-start\" }}\n >\n <Paragraph color=\"$error\">\n {isLoggingOut ? \"Logging out...\" : \"🚪 Logout\"}\n </Paragraph>\n </Button>\n </YStack>\n </Card>\n )}\n </ZStack>\n ) : (\n <Button \n variant=\"primary\" \n size=\"sm\" \n onClick={() => navigate(\"/login\")}\n >\n Login\n </Button>\n )}\n </XStack>\n );\n}\n\nexport default Navbar;\n","'use strict';\n\n/** @type {import('./type')} */\nmodule.exports = TypeError;\n","export default {}","var hasMap = typeof Map === 'function' && Map.prototype;\nvar mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null;\nvar mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null;\nvar mapForEach = hasMap && Map.prototype.forEach;\nvar hasSet = typeof Set === 'function' && Set.prototype;\nvar setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, 'size') : null;\nvar setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === 'function' ? setSizeDescriptor.get : null;\nvar setForEach = hasSet && Set.prototype.forEach;\nvar hasWeakMap = typeof WeakMap === 'function' && WeakMap.prototype;\nvar weakMapHas = hasWeakMap ? WeakMap.prototype.has : null;\nvar hasWeakSet = typeof WeakSet === 'function' && WeakSet.prototype;\nvar weakSetHas = hasWeakSet ? WeakSet.prototype.has : null;\nvar hasWeakRef = typeof WeakRef === 'function' && WeakRef.prototype;\nvar weakRefDeref = hasWeakRef ? WeakRef.prototype.deref : null;\nvar booleanValueOf = Boolean.prototype.valueOf;\nvar objectToString = Object.prototype.toString;\nvar functionToString = Function.prototype.toString;\nvar $match = String.prototype.match;\nvar $slice = String.prototype.slice;\nvar $replace = String.prototype.replace;\nvar $toUpperCase = String.prototype.toUpperCase;\nvar $toLowerCase = String.prototype.toLowerCase;\nvar $test = RegExp.prototype.test;\nvar $concat = Array.prototype.concat;\nvar $join = Array.prototype.join;\nvar $arrSlice = Array.prototype.slice;\nvar $floor = Math.floor;\nvar bigIntValueOf = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null;\nvar gOPS = Object.getOwnPropertySymbols;\nvar symToString = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? Symbol.prototype.toString : null;\nvar hasShammedSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'object';\n// ie, `has-tostringtag/shams\nvar toStringTag = typeof Symbol === 'function' && Symbol.toStringTag && (typeof Symbol.toStringTag === hasShammedSymbols ? 'object' : 'symbol')\n ? Symbol.toStringTag\n : null;\nvar isEnumerable = Object.prototype.propertyIsEnumerable;\n\nvar gPO = (typeof Reflect === 'function' ? Reflect.getPrototypeOf : Object.getPrototypeOf) || (\n [].__proto__ === Array.prototype // eslint-disable-line no-proto\n ? function (O) {\n return O.__proto__; // eslint-disable-line no-proto\n }\n : null\n);\n\nfunction addNumericSeparator(num, str) {\n if (\n num === Infinity\n || num === -Infinity\n || num !== num\n || (num && num > -1000 && num < 1000)\n || $test.call(/e/, str)\n ) {\n return str;\n }\n var sepRegex = /[0-9](?=(?:[0-9]{3})+(?![0-9]))/g;\n if (typeof num === 'number') {\n var int = num < 0 ? -$floor(-num) : $floor(num); // trunc(num)\n if (int !== num) {\n var intStr = String(int);\n var dec = $slice.call(str, intStr.length + 1);\n return $replace.call(intStr, sepRegex, '$&_') + '.' + $replace.call($replace.call(dec, /([0-9]{3})/g, '$&_'), /_$/, '');\n }\n }\n return $replace.call(str, sepRegex, '$&_');\n}\n\nvar utilInspect = require('./util.inspect');\nvar inspectCustom = utilInspect.custom;\nvar inspectSymbol = isSymbol(inspectCustom) ? inspectCustom : null;\n\nvar quotes = {\n __proto__: null,\n 'double': '\"',\n single: \"'\"\n};\nvar quoteREs = {\n __proto__: null,\n 'double': /([\"\\\\])/g,\n single: /(['\\\\])/g\n};\n\nmodule.exports = function inspect_(obj, options, depth, seen) {\n var opts = options || {};\n\n if (has(opts, 'quoteStyle') && !has(quotes, opts.quoteStyle)) {\n throw new TypeError('option \"quoteStyle\" must be \"single\" or \"double\"');\n }\n if (\n has(opts, 'maxStringLength') && (typeof opts.maxStringLength === 'number'\n ? opts.maxStringLength < 0 && opts.maxStringLength !== Infinity\n : opts.maxStringLength !== null\n )\n ) {\n throw new TypeError('option \"maxStringLength\", if provided, must be a positive integer, Infinity, or `null`');\n }\n var customInspect = has(opts, 'customInspect') ? opts.customInspect : true;\n if (typeof customInspect !== 'boolean' && customInspect !== 'symbol') {\n throw new TypeError('option \"customInspect\", if provided, must be `true`, `false`, or `\\'symbol\\'`');\n }\n\n if (\n has(opts, 'indent')\n && opts.indent !== null\n && opts.indent !== '\\t'\n && !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0)\n ) {\n throw new TypeError('option \"indent\" must be \"\\\\t\", an integer > 0, or `null`');\n }\n if (has(opts, 'numericSeparator') && typeof opts.numericSeparator !== 'boolean') {\n throw new TypeError('option \"numericSeparator\", if provided, must be `true` or `false`');\n }\n var numericSeparator = opts.numericSeparator;\n\n if (typeof obj === 'undefined') {\n return 'undefined';\n }\n if (obj === null) {\n return 'null';\n }\n if (typeof obj === 'boolean') {\n return obj ? 'true' : 'false';\n }\n\n if (typeof obj === 'string') {\n return inspectString(obj, opts);\n }\n if (typeof obj === 'number') {\n if (obj === 0) {\n return Infinity / obj > 0 ? '0' : '-0';\n }\n var str = String(obj);\n return numericSeparator ? addNumericSeparator(obj, str) : str;\n }\n if (typeof obj === 'bigint') {\n var bigIntStr = String(obj) + 'n';\n return numericSeparator ? addNumericSeparator(obj, bigIntStr) : bigIntStr;\n }\n\n var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth;\n if (typeof depth === 'undefined') { depth = 0; }\n if (depth >= maxDepth && maxDepth > 0 && typeof obj === 'object') {\n return isArray(obj) ? '[Array]' : '[Object]';\n }\n\n var indent = getIndent(opts, depth);\n\n if (typeof seen === 'undefined') {\n seen = [];\n } else if (indexOf(seen, obj) >= 0) {\n return '[Circular]';\n }\n\n function inspect(value, from, noIndent) {\n if (from) {\n seen = $arrSlice.call(seen);\n seen.push(from);\n }\n if (noIndent) {\n var newOpts = {\n depth: opts.depth\n };\n if (has(opts, 'quoteStyle')) {\n newOpts.quoteStyle = opts.quoteStyle;\n }\n return inspect_(value, newOpts, depth + 1, seen);\n }\n return inspect_(value, opts, depth + 1, seen);\n }\n\n if (typeof obj === 'function' && !isRegExp(obj)) { // in older engines, regexes are callable\n var name = nameOf(obj);\n var keys = arrObjKeys(obj, inspect);\n return '[Function' + (name ? ': ' + name : ' (anonymous)') + ']' + (keys.length > 0 ? ' { ' + $join.call(keys, ', ') + ' }' : '');\n }\n if (isSymbol(obj)) {\n var symString = hasShammedSymbols ? $replace.call(String(obj), /^(Symbol\\(.*\\))_[^)]*$/, '$1') : symToString.call(obj);\n return typeof obj === 'object' && !hasShammedSymbols ? markBoxed(symString) : symString;\n }\n if (isElement(obj)) {\n var s = '<' + $toLowerCase.call(String(obj.nodeName));\n var attrs = obj.attributes || [];\n for (var i = 0; i < attrs.length; i++) {\n s += ' ' + attrs[i].name + '=' + wrapQuotes(quote(attrs[i].value), 'double', opts);\n }\n s += '>';\n if (obj.childNodes && obj.childNodes.length) { s += '...'; }\n s += '</' + $toLowerCase.call(String(obj.nodeName)) + '>';\n return s;\n }\n if (isArray(obj)) {\n if (obj.length === 0) { return '[]'; }\n var xs = arrObjKeys(obj, inspect);\n if (indent && !singleLineValues(xs)) {\n return '[' + indentedJoin(xs, indent) + ']';\n }\n return '[ ' + $join.call(xs, ', ') + ' ]';\n }\n if (isError(obj)) {\n var parts = arrObjKeys(obj, inspect);\n if (!('cause' in Error.prototype) && 'cause' in obj && !isEnumerable.call(obj, 'cause')) {\n return '{ [' + String(obj) + '] ' + $join.call($concat.call('[cause]: ' + inspect(obj.cause), parts), ', ') + ' }';\n }\n if (parts.length === 0) { return '[' + String(obj) + ']'; }\n return '{ [' + String(obj) + '] ' + $join.call(parts, ', ') + ' }';\n }\n if (typeof obj === 'object' && customInspect) {\n if (inspectSymbol && typeof obj[inspectSymbol] === 'function' && utilInspect) {\n return utilInspect(obj, { depth: maxDepth - depth });\n } else if (customInspect !== 'symbol' && typeof obj.inspect === 'function') {\n return obj.inspect();\n }\n }\n if (isMap(obj)) {\n var mapParts = [];\n if (mapForEach) {\n mapForEach.call(obj, function (value, key) {\n mapParts.push(inspect(key, obj, true) + ' => ' + inspect(value, obj));\n });\n }\n return collectionOf('Map', mapSize.call(obj), mapParts, indent);\n }\n if (isSet(obj)) {\n var setParts = [];\n if (setForEach) {\n setForEach.call(obj, function (value) {\n setParts.push(inspect(value, obj));\n });\n }\n return collectionOf('Set', setSize.call(obj), setParts, indent);\n }\n if (isWeakMap(obj)) {\n return weakCollectionOf('WeakMap');\n }\n if (isWeakSet(obj)) {\n return weakCollectionOf('WeakSet');\n }\n if (isWeakRef(obj)) {\n return weakCollectionOf('WeakRef');\n }\n if (isNumber(obj)) {\n return markBoxed(inspect(Number(obj)));\n }\n if (isBigInt(obj)) {\n return markBoxed(inspect(bigIntValueOf.call(obj)));\n }\n if (isBoolean(obj)) {\n return markBoxed(booleanValueOf.call(obj));\n }\n if (isString(obj)) {\n return markBoxed(inspect(String(obj)));\n }\n // note: in IE 8, sometimes `global !== window` but both are the prototypes of each other\n /* eslint-env browser */\n if (typeof window !== 'undefined' && obj === window) {\n return '{ [object Window] }';\n }\n if (\n (typeof globalThis !== 'undefined' && obj === globalThis)\n || (typeof global !== 'undefined' && obj === global)\n ) {\n return '{ [object globalThis] }';\n }\n if (!isDate(obj) && !isRegExp(obj)) {\n var ys = arrObjKeys(obj, inspect);\n var isPlainObject = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object;\n var protoTag = obj instanceof Object ? '' : 'null prototype';\n var stringTag = !isPlainObject && toStringTag && Object(obj) === obj && toStringTag in obj ? $slice.call(toStr(obj), 8, -1) : protoTag ? 'Object' : '';\n var constructorTag = isPlainObject || typeof obj.constructor !== 'function' ? '' : obj.constructor.name ? obj.constructor.name + ' ' : '';\n var tag = constructorTag + (stringTag || protoTag ? '[' + $join.call($concat.call([], stringTag || [], protoTag || []), ': ') + '] ' : '');\n if (ys.length === 0) { return tag + '{}'; }\n if (indent) {\n return tag + '{' + indentedJoin(ys, indent) + '}';\n }\n return tag + '{ ' + $join.call(ys, ', ') + ' }';\n }\n return String(obj);\n};\n\nfunction wrapQuotes(s, defaultStyle, opts) {\n var style = opts.quoteStyle || defaultStyle;\n var quoteChar = quotes[style];\n return quoteChar + s + quoteChar;\n}\n\nfunction quote(s) {\n return $replace.call(String(s), /\"/g, '&quot;');\n}\n\nfunction canTrustToString(obj) {\n return !toStringTag || !(typeof obj === 'object' && (toStringTag in obj || typeof obj[toStringTag] !== 'undefined'));\n}\nfunction isArray(obj) { return toStr(obj) === '[object Array]' && canTrustToString(obj); }\nfunction isDate(obj) { return toStr(obj) === '[object Date]' && canTrustToString(obj); }\nfunction isRegExp(obj) { return toStr(obj) === '[object RegExp]' && canTrustToString(obj); }\nfunction isError(obj) { return toStr(obj) === '[object Error]' && canTrustToString(obj); }\nfunction isString(obj) { return toStr(obj) === '[object String]' && canTrustToString(obj); }\nfunction isNumber(obj) { return toStr(obj) === '[object Number]' && canTrustToString(obj); }\nfunction isBoolean(obj) { return toStr(obj) === '[object Boolean]' && canTrustToString(obj); }\n\n// Symbol and BigInt do have Symbol.toStringTag by spec, so that can't be used to eliminate false positives\nfunction isSymbol(obj) {\n if (hasShammedSymbols) {\n return obj && typeof obj === 'object' && obj instanceof Symbol;\n }\n if (typeof obj === 'symbol') {\n return true;\n }\n if (!obj || typeof obj !== 'object' || !symToString) {\n return false;\n }\n try {\n symToString.call(obj);\n return true;\n } catch (e) {}\n return false;\n}\n\nfunction isBigInt(obj) {\n if (!obj || typeof obj !== 'object' || !bigIntValueOf) {\n return false;\n }\n try {\n bigIntValueOf.call(obj);\n return true;\n } catch (e) {}\n return false;\n}\n\nvar hasOwn = Object.prototype.hasOwnProperty || function (key) { return key in this; };\nfunction has(obj, key) {\n return hasOwn.call(obj, key);\n}\n\nfunction toStr(obj) {\n return objectToString.call(obj);\n}\n\nfunction nameOf(f) {\n if (f.name) { return f.name; }\n var m = $match.call(functionToString.call(f), /^function\\s*([\\w$]+)/);\n if (m) { return m[1]; }\n return null;\n}\n\nfunction indexOf(xs, x) {\n if (xs.indexOf) { return xs.indexOf(x); }\n for (var i = 0, l = xs.length; i < l; i++) {\n if (xs[i] === x) { return i; }\n }\n return -1;\n}\n\nfunction isMap(x) {\n if (!mapSize || !x || typeof x !== 'object') {\n return false;\n }\n try {\n mapSize.call(x);\n try {\n setSize.call(x);\n } catch (s) {\n return true;\n }\n return x instanceof Map; // core-js workaround, pre-v2.5.0\n } catch (e) {}\n return false;\n}\n\nfunction isWeakMap(x) {\n if (!weakMapHas || !x || typeof x !== 'object') {\n return false;\n }\n try {\n weakMapHas.call(x, weakMapHas);\n try {\n weakSetHas.call(x, weakSetHas);\n } catch (s) {\n return true;\n }\n return x instanceof WeakMap; // core-js workaround, pre-v2.5.0\n } catch (e) {}\n return false;\n}\n\nfunction isWeakRef(x) {\n if (!weakRefDeref || !x || typeof x !== 'object') {\n return false;\n }\n try {\n weakRefDeref.call(x);\n return true;\n } catch (e) {}\n return false;\n}\n\nfunction isSet(x) {\n if (!setSize || !x || typeof x !== 'object') {\n return false;\n }\n try {\n setSize.call(x);\n try {\n mapSize.call(x);\n } catch (m) {\n return true;\n }\n return x instanceof Set; // core-js workaround, pre-v2.5.0\n } catch (e) {}\n return false;\n}\n\nfunction isWeakSet(x) {\n if (!weakSetHas || !x || typeof x !== 'object') {\n return false;\n }\n try {\n weakSetHas.call(x, weakSetHas);\n try {\n weakMapHas.call(x, weakMapHas);\n } catch (s) {\n return true;\n }\n return x instanceof WeakSet; // core-js workaround, pre-v2.5.0\n } catch (e) {}\n return false;\n}\n\nfunction isElement(x) {\n if (!x || typeof x !== 'object') { return false; }\n if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) {\n return true;\n }\n return typeof x.nodeName === 'string' && typeof x.getAttribute === 'function';\n}\n\nfunction inspectString(str, opts) {\n if (str.length > opts.maxStringLength) {\n var remaining = str.length - opts.maxStringLength;\n var trailer = '... ' + remaining + ' more character' + (remaining > 1 ? 's' : '');\n return inspectString($slice.call(str, 0, opts.maxStringLength), opts) + trailer;\n }\n var quoteRE = quoteREs[opts.quoteStyle || 'single'];\n quoteRE.lastIndex = 0;\n // eslint-disable-next-line no-control-regex\n var s = $replace.call($replace.call(str, quoteRE, '\\\\$1'), /[\\x00-\\x1f]/g, lowbyte);\n return wrapQuotes(s, 'single', opts);\n}\n\nfunction lowbyte(c) {\n var n = c.charCodeAt(0);\n var x = {\n 8: 'b',\n 9: 't',\n 10: 'n',\n 12: 'f',\n 13: 'r'\n }[n];\n if (x) { return '\\\\' + x; }\n return '\\\\x' + (n < 0x10 ? '0' : '') + $toUpperCase.call(n.toString(16));\n}\n\nfunction markBoxed(str) {\n return 'Object(' + str + ')';\n}\n\nfunction weakCollectionOf(type) {\n return type + ' { ? }';\n}\n\nfunction collectionOf(type, size, entries, indent) {\n var joinedEntries = indent ? indentedJoin(entries, indent) : $join.call(entries, ', ');\n return type + ' (' + size + ') {' + joinedEntries + '}';\n}\n\nfunction singleLineValues(xs) {\n for (var i = 0; i < xs.length; i++) {\n if (indexOf(xs[i], '\\n') >= 0) {\n return false;\n }\n }\n return true;\n}\n\nfunction getIndent(opts, depth) {\n var baseIndent;\n if (opts.indent === '\\t') {\n baseIndent = '\\t';\n } else if (typeof opts.indent === 'number' && opts.indent > 0) {\n baseIndent = $join.call(Array(opts.indent + 1), ' ');\n } else {\n return null;\n }\n return {\n base: baseIndent,\n prev: $join.call(Array(depth + 1), baseIndent)\n };\n}\n\nfunction indentedJoin(xs, indent) {\n if (xs.length === 0) { return ''; }\n var lineJoiner = '\\n' + indent.prev + indent.base;\n return lineJoiner + $join.call(xs, ',' + lineJoiner) + '\\n' + indent.prev;\n}\n\nfunction arrObjKeys(obj, inspect) {\n var isArr = isArray(obj);\n var xs = [];\n if (isArr) {\n xs.length = obj.length;\n for (var i = 0; i < obj.length; i++) {\n xs[i] = has(obj, i) ? inspect(obj[i], obj) : '';\n }\n }\n var syms = typeof gOPS === 'function' ? gOPS(obj) : [];\n var symMap;\n if (hasShammedSymbols) {\n symMap = {};\n for (var k = 0; k < syms.length; k++) {\n symMap['$' + syms[k]] = syms[k];\n }\n }\n\n for (var key in obj) { // eslint-disable-line no-restricted-syntax\n if (!has(obj, key)) { continue; } // eslint-disable-line no-restricted-syntax, no-continue\n if (isArr && String(Number(key)) === key && key < obj.length) { continue; } // eslint-disable-line no-restricted-syntax, no-continue\n if (hasShammedSymbols && symMap['$' + key] instanceof Symbol) {\n // this is to prevent shammed Symbols, which are stored as strings, from being included in the string key section\n continue; // eslint-disable-line no-restricted-syntax, no-continue\n } else if ($test.call(/[^\\w$]/, key)) {\n xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj));\n } else {\n xs.push(key + ': ' + inspect(obj[key], obj));\n }\n }\n if (typeof gOPS === 'function') {\n for (var j = 0; j < syms.length; j++) {\n if (isEnumerable.call(obj, syms[j])) {\n xs.push('[' + inspect(syms[j]) + ']: ' + inspect(obj[syms[j]], obj));\n }\n }\n }\n return xs;\n}\n","'use strict';\n\nvar inspect = require('object-inspect');\n\nvar $TypeError = require('es-errors/type');\n\n/*\n* This function traverses the list returning the node corresponding to the given key.\n*\n* That node is also moved to the head of the list, so that if it's accessed again we don't need to traverse the whole list.\n* By doing so, all the recently used nodes can be accessed relatively quickly.\n*/\n/** @type {import('./list.d.ts').listGetNode} */\n// eslint-disable-next-line consistent-return\nvar listGetNode = function (list, key, isDelete) {\n\t/** @type {typeof list | NonNullable<(typeof list)['next']>} */\n\tvar prev = list;\n\t/** @type {(typeof list)['next']} */\n\tvar curr;\n\t// eslint-disable-next-line eqeqeq\n\tfor (; (curr = prev.next) != null; prev = curr) {\n\t\tif (curr.key === key) {\n\t\t\tprev.next = curr.next;\n\t\t\tif (!isDelete) {\n\t\t\t\t// eslint-disable-next-line no-extra-parens\n\t\t\t\tcurr.next = /** @type {NonNullable<typeof list.next>} */ (list.next);\n\t\t\t\tlist.next = curr; // eslint-disable-line no-param-reassign\n\t\t\t}\n\t\t\treturn curr;\n\t\t}\n\t}\n};\n\n/** @type {import('./list.d.ts').listGet} */\nvar listGet = function (objects, key) {\n\tif (!objects) {\n\t\treturn void undefined;\n\t}\n\tvar node = listGetNode(objects, key);\n\treturn node && node.value;\n};\n/** @type {import('./list.d.ts').listSet} */\nvar listSet = function (objects, key, value) {\n\tvar node = listGetNode(objects, key);\n\tif (node) {\n\t\tnode.value = value;\n\t} else {\n\t\t// Prepend the new node to the beginning of the list\n\t\tobjects.next = /** @type {import('./list.d.ts').ListNode<typeof value, typeof key>} */ ({ // eslint-disable-line no-param-reassign, no-extra-parens\n\t\t\tkey: key,\n\t\t\tnext: objects.next,\n\t\t\tvalue: value\n\t\t});\n\t}\n};\n/** @type {import('./list.d.ts').listHas} */\nvar listHas = function (objects, key) {\n\tif (!objects) {\n\t\treturn false;\n\t}\n\treturn !!listGetNode(objects, key);\n};\n/** @type {import('./list.d.ts').listDelete} */\n// eslint-disable-next-line consistent-return\nvar listDelete = function (objects, key) {\n\tif (objects) {\n\t\treturn listGetNode(objects, key, true);\n\t}\n};\n\n/** @type {import('.')} */\nmodule.exports = function getSideChannelList() {\n\t/** @typedef {ReturnType<typeof getSideChannelList>} Channel */\n\t/** @typedef {Parameters<Channel['get']>[0]} K */\n\t/** @typedef {Parameters<Channel['set']>[1]} V */\n\n\t/** @type {import('./list.d.ts').RootNode<V, K> | undefined} */ var $o;\n\n\t/** @type {Channel} */\n\tvar channel = {\n\t\tassert: function (key) {\n\t\t\tif (!channel.has(key)) {\n\t\t\t\tthrow new $TypeError('Side channel does not contain ' + inspect(key));\n\t\t\t}\n\t\t},\n\t\t'delete': function (key) {\n\t\t\tvar root = $o && $o.next;\n\t\t\tvar deletedNode = listDelete($o, key);\n\t\t\tif (deletedNode && root && root === deletedNode) {\n\t\t\t\t$o = void undefined;\n\t\t\t}\n\t\t\treturn !!deletedNode;\n\t\t},\n\t\tget: function (key) {\n\t\t\treturn listGet($o, key);\n\t\t},\n\t\thas: function (key) {\n\t\t\treturn listHas($o, key);\n\t\t},\n\t\tset: function (key, value) {\n\t\t\tif (!$o) {\n\t\t\t\t// Initialize the linked list as an empty node, so that we don't have to special-case handling of the first node: we can always refer to it as (previous node).next, instead of something like (list).head\n\t\t\t\t$o = {\n\t\t\t\t\tnext: void undefined\n\t\t\t\t};\n\t\t\t}\n\t\t\t// eslint-disable-next-line no-extra-parens\n\t\t\tlistSet(/** @type {NonNullable<typeof $o>} */ ($o), key, value);\n\t\t}\n\t};\n\t// @ts-expect-error TODO: figure out why this is erroring\n\treturn channel;\n};\n","'use strict';\n\n/** @type {import('.')} */\nmodule.exports = Object;\n","'use strict';\n\n/** @type {import('.')} */\nmodule.exports = Error;\n","'use strict';\n\n/** @type {import('./eval')} */\nmodule.exports = EvalError;\n","'use strict';\n\n/** @type {import('./range')} */\nmodule.exports = RangeError;\n","'use strict';\n\n/** @type {import('./ref')} */\nmodule.exports = ReferenceError;\n","'use strict';\n\n/** @type {import('./syntax')} */\nmodule.exports = SyntaxError;\n","'use strict';\n\n/** @type {import('./uri')} */\nmodule.exports = URIError;\n","'use strict';\n\n/** @type {import('./abs')} */\nmodule.exports = Math.abs;\n","'use strict';\n\n/** @type {import('./floor')} */\nmodule.exports = Math.floor;\n","'use strict';\n\n/** @type {import('./max')} */\nmodule.exports = Math.max;\n","'use strict';\n\n/** @type {import('./min')} */\nmodule.exports = Math.min;\n","'use strict';\n\n/** @type {import('./pow')} */\nmodule.exports = Math.pow;\n","'use strict';\n\n/** @type {import('./round')} */\nmodule.exports = Math.round;\n","'use strict';\n\n/** @type {import('./isNaN')} */\nmodule.exports = Number.isNaN || function isNaN(a) {\n\treturn a !== a;\n};\n","'use strict';\n\nvar $isNaN = require('./isNaN');\n\n/** @type {import('./sign')} */\nmodule.exports = function sign(number) {\n\tif ($isNaN(number) || number === 0) {\n\t\treturn number;\n\t}\n\treturn number < 0 ? -1 : +1;\n};\n","'use strict';\n\n/** @type {import('./gOPD')} */\nmodule.exports = Object.getOwnPropertyDescriptor;\n","'use strict';\n\n/** @type {import('.')} */\nvar $gOPD = require('./gOPD');\n\nif ($gOPD) {\n\ttry {\n\t\t$gOPD([], 'length');\n\t} catch (e) {\n\t\t// IE 8 has a broken gOPD\n\t\t$gOPD = null;\n\t}\n}\n\nmodule.exports = $gOPD;\n","'use strict';\n\n/** @type {import('.')} */\nvar $defineProperty = Object.defineProperty || false;\nif ($defineProperty) {\n\ttry {\n\t\t$defineProperty({}, 'a', { value: 1 });\n\t} catch (e) {\n\t\t// IE 8 has a broken defineProperty\n\t\t$defineProperty = false;\n\t}\n}\n\nmodule.exports = $defineProperty;\n","'use strict';\n\n/** @type {import('./shams')} */\n/* eslint complexity: [2, 18], max-statements: [2, 33] */\nmodule.exports = function hasSymbols() {\n\tif (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }\n\tif (typeof Symbol.iterator === 'symbol') { return true; }\n\n\t/** @type {{ [k in symbol]?: unknown }} */\n\tvar obj = {};\n\tvar sym = Symbol('test');\n\tvar symObj = Object(sym);\n\tif (typeof sym === 'string') { return false; }\n\n\tif (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }\n\tif (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }\n\n\t// temp disabled per https://github.com/ljharb/object.assign/issues/17\n\t// if (sym instanceof Symbol) { return false; }\n\t// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4\n\t// if (!(symObj instanceof Symbol)) { return false; }\n\n\t// if (typeof Symbol.prototype.toString !== 'function') { return false; }\n\t// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }\n\n\tvar symVal = 42;\n\tobj[sym] = symVal;\n\tfor (var _ in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop\n\tif (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }\n\n\tif (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }\n\n\tvar syms = Object.getOwnPropertySymbols(obj);\n\tif (syms.length !== 1 || syms[0] !== sym) { return false; }\n\n\tif (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }\n\n\tif (typeof Object.getOwnPropertyDescriptor === 'function') {\n\t\t// eslint-disable-next-line no-extra-parens\n\t\tvar descriptor = /** @type {PropertyDescriptor} */ (Object.getOwnPropertyDescriptor(obj, sym));\n\t\tif (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }\n\t}\n\n\treturn true;\n};\n","'use strict';\n\nvar origSymbol = typeof Symbol !== 'undefined' && Symbol;\nvar hasSymbolSham = require('./shams');\n\n/** @type {import('.')} */\nmodule.exports = function hasNativeSymbols() {\n\tif (typeof origSymbol !== 'function') { return false; }\n\tif (typeof Symbol !== 'function') { return false; }\n\tif (typeof origSymbol('foo') !== 'symbol') { return false; }\n\tif (typeof Symbol('bar') !== 'symbol') { return false; }\n\n\treturn hasSymbolSham();\n};\n","'use strict';\n\n/** @type {import('./Reflect.getPrototypeOf')} */\nmodule.exports = (typeof Reflect !== 'undefined' && Reflect.getPrototypeOf) || null;\n","'use strict';\n\nvar $Object = require('es-object-atoms');\n\n/** @type {import('./Object.getPrototypeOf')} */\nmodule.exports = $Object.getPrototypeOf || null;\n","'use strict';\n\n/* eslint no-invalid-this: 1 */\n\nvar ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';\nvar toStr = Object.prototype.toString;\nvar max = Math.max;\nvar funcType = '[object Function]';\n\nvar concatty = function concatty(a, b) {\n var arr = [];\n\n for (var i = 0; i < a.length; i += 1) {\n arr[i] = a[i];\n }\n for (var j = 0; j < b.length; j += 1) {\n arr[j + a.length] = b[j];\n }\n\n return arr;\n};\n\nvar slicy = function slicy(arrLike, offset) {\n var arr = [];\n for (var i = offset || 0, j = 0; i < arrLike.length; i += 1, j += 1) {\n arr[j] = arrLike[i];\n }\n return arr;\n};\n\nvar joiny = function (arr, joiner) {\n var str = '';\n for (var i = 0; i < arr.length; i += 1) {\n str += arr[i];\n if (i + 1 < arr.length) {\n str += joiner;\n }\n }\n return str;\n};\n\nmodule.exports = function bind(that) {\n var target = this;\n if (typeof target !== 'function' || toStr.apply(target) !== funcType) {\n throw new TypeError(ERROR_MESSAGE + target);\n }\n var args = slicy(arguments, 1);\n\n var bound;\n var binder = function () {\n if (this instanceof bound) {\n var result = target.apply(\n this,\n concatty(args, arguments)\n );\n if (Object(result) === result) {\n return result;\n }\n return this;\n }\n return target.apply(\n that,\n concatty(args, arguments)\n );\n\n };\n\n var boundLength = max(0, target.length - args.length);\n var boundArgs = [];\n for (var i = 0; i < boundLength; i++) {\n boundArgs[i] = '$' + i;\n }\n\n bound = Function('binder', 'return function (' + joiny(boundArgs, ',') + '){ return binder.apply(this,arguments); }')(binder);\n\n if (target.prototype) {\n var Empty = function Empty() {};\n Empty.prototype = target.prototype;\n bound.prototype = new Empty();\n Empty.prototype = null;\n }\n\n return bound;\n};\n","'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = Function.prototype.bind || implementation;\n","'use strict';\n\n/** @type {import('./functionCall')} */\nmodule.exports = Function.prototype.call;\n","'use strict';\n\n/** @type {import('./functionApply')} */\nmodule.exports = Function.prototype.apply;\n","'use strict';\n\n/** @type {import('./reflectApply')} */\nmodule.exports = typeof Reflect !== 'undefined' && Reflect && Reflect.apply;\n","'use strict';\n\nvar bind = require('function-bind');\n\nvar $apply = require('./functionApply');\nvar $call = require('./functionCall');\nvar $reflectApply = require('./reflectApply');\n\n/** @type {import('./actualApply')} */\nmodule.exports = $reflectApply || bind.call($call, $apply);\n","'use strict';\n\nvar bind = require('function-bind');\nvar $TypeError = require('es-errors/type');\n\nvar $call = require('./functionCall');\nvar $actualApply = require('./actualApply');\n\n/** @type {(args: [Function, thisArg?: unknown, ...args: unknown[]]) => Function} TODO FIXME, find a way to use import('.') */\nmodule.exports = function callBindBasic(args) {\n\tif (args.length < 1 || typeof args[0] !== 'function') {\n\t\tthrow new $TypeError('a function is required');\n\t}\n\treturn $actualApply(bind, $call, args);\n};\n","'use strict';\n\nvar callBind = require('call-bind-apply-helpers');\nvar gOPD = require('gopd');\n\nvar hasProtoAccessor;\ntry {\n\t// eslint-disable-next-line no-extra-parens, no-proto\n\thasProtoAccessor = /** @type {{ __proto__?: typeof Array.prototype }} */ ([]).__proto__ === Array.prototype;\n} catch (e) {\n\tif (!e || typeof e !== 'object' || !('code' in e) || e.code !== 'ERR_PROTO_ACCESS') {\n\t\tthrow e;\n\t}\n}\n\n// eslint-disable-next-line no-extra-parens\nvar desc = !!hasProtoAccessor && gOPD && gOPD(Object.prototype, /** @type {keyof typeof Object.prototype} */ ('__proto__'));\n\nvar $Object = Object;\nvar $getPrototypeOf = $Object.getPrototypeOf;\n\n/** @type {import('./get')} */\nmodule.exports = desc && typeof desc.get === 'function'\n\t? callBind([desc.get])\n\t: typeof $getPrototypeOf === 'function'\n\t\t? /** @type {import('./get')} */ function getDunder(value) {\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\treturn $getPrototypeOf(value == null ? value : $Object(value));\n\t\t}\n\t\t: false;\n","'use strict';\n\nvar reflectGetProto = require('./Reflect.getPrototypeOf');\nvar originalGetProto = require('./Object.getPrototypeOf');\n\nvar getDunderProto = require('dunder-proto/get');\n\n/** @type {import('.')} */\nmodule.exports = reflectGetProto\n\t? function getProto(O) {\n\t\t// @ts-expect-error TS can't narrow inside a closure, for some reason\n\t\treturn reflectGetProto(O);\n\t}\n\t: originalGetProto\n\t\t? function getProto(O) {\n\t\t\tif (!O || (typeof O !== 'object' && typeof O !== 'function')) {\n\t\t\t\tthrow new TypeError('getProto: not an object');\n\t\t\t}\n\t\t\t// @ts-expect-error TS can't narrow inside a closure, for some reason\n\t\t\treturn originalGetProto(O);\n\t\t}\n\t\t: getDunderProto\n\t\t\t? function getProto(O) {\n\t\t\t\t// @ts-expect-error TS can't narrow inside a closure, for some reason\n\t\t\t\treturn getDunderProto(O);\n\t\t\t}\n\t\t\t: null;\n","'use strict';\n\nvar call = Function.prototype.call;\nvar $hasOwn = Object.prototype.hasOwnProperty;\nvar bind = require('function-bind');\n\n/** @type {import('.')} */\nmodule.exports = bind.call(call, $hasOwn);\n","'use strict';\n\nvar undefined;\n\nvar $Object = require('es-object-atoms');\n\nvar $Error = require('es-errors');\nvar $EvalError = require('es-errors/eval');\nvar $RangeError = require('es-errors/range');\nvar $ReferenceError = require('es-errors/ref');\nvar $SyntaxError = require('es-errors/syntax');\nvar $TypeError = require('es-errors/type');\nvar $URIError = require('es-errors/uri');\n\nvar abs = require('math-intrinsics/abs');\nvar floor = require('math-intrinsics/floor');\nvar max = require('math-intrinsics/max');\nvar min = require('math-intrinsics/min');\nvar pow = require('math-intrinsics/pow');\nvar round = require('math-intrinsics/round');\nvar sign = require('math-intrinsics/sign');\n\nvar $Function = Function;\n\n// eslint-disable-next-line consistent-return\nvar getEvalledConstructor = function (expressionSyntax) {\n\ttry {\n\t\treturn $Function('\"use strict\"; return (' + expressionSyntax + ').constructor;')();\n\t} catch (e) {}\n};\n\nvar $gOPD = require('gopd');\nvar $defineProperty = require('es-define-property');\n\nvar throwTypeError = function () {\n\tthrow new $TypeError();\n};\nvar ThrowTypeError = $gOPD\n\t? (function () {\n\t\ttry {\n\t\t\t// eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties\n\t\t\targuments.callee; // IE 8 does not throw here\n\t\t\treturn throwTypeError;\n\t\t} catch (calleeThrows) {\n\t\t\ttry {\n\t\t\t\t// IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')\n\t\t\t\treturn $gOPD(arguments, 'callee').get;\n\t\t\t} catch (gOPDthrows) {\n\t\t\t\treturn throwTypeError;\n\t\t\t}\n\t\t}\n\t}())\n\t: throwTypeError;\n\nvar hasSymbols = require('has-symbols')();\n\nvar getProto = require('get-proto');\nvar $ObjectGPO = require('get-proto/Object.getPrototypeOf');\nvar $ReflectGPO = require('get-proto/Reflect.getPrototypeOf');\n\nvar $apply = require('call-bind-apply-helpers/functionApply');\nvar $call = require('call-bind-apply-helpers/functionCall');\n\nvar needsEval = {};\n\nvar TypedArray = typeof Uint8Array === 'undefined' || !getProto ? undefined : getProto(Uint8Array);\n\nvar INTRINSICS = {\n\t__proto__: null,\n\t'%AggregateError%': typeof AggregateError === 'undefined' ? undefined : AggregateError,\n\t'%Array%': Array,\n\t'%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,\n\t'%ArrayIteratorPrototype%': hasSymbols && getProto ? getProto([][Symbol.iterator]()) : undefined,\n\t'%AsyncFromSyncIteratorPrototype%': undefined,\n\t'%AsyncFunction%': needsEval,\n\t'%AsyncGenerator%': needsEval,\n\t'%AsyncGeneratorFunction%': needsEval,\n\t'%AsyncIteratorPrototype%': needsEval,\n\t'%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,\n\t'%BigInt%': typeof BigInt === 'undefined' ? undefined : BigInt,\n\t'%BigInt64Array%': typeof BigInt64Array === 'undefined' ? undefined : BigInt64Array,\n\t'%BigUint64Array%': typeof BigUint64Array === 'undefined' ? undefined : BigUint64Array,\n\t'%Boolean%': Boolean,\n\t'%DataView%': typeof DataView === 'undefined' ? undefined : DataView,\n\t'%Date%': Date,\n\t'%decodeURI%': decodeURI,\n\t'%decodeURIComponent%': decodeURIComponent,\n\t'%encodeURI%': encodeURI,\n\t'%encodeURIComponent%': encodeURIComponent,\n\t'%Error%': $Error,\n\t'%eval%': eval, // eslint-disable-line no-eval\n\t'%EvalError%': $EvalError,\n\t'%Float16Array%': typeof Float16Array === 'undefined' ? undefined : Float16Array,\n\t'%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,\n\t'%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,\n\t'%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined : FinalizationRegistry,\n\t'%Function%': $Function,\n\t'%GeneratorFunction%': needsEval,\n\t'%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,\n\t'%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,\n\t'%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,\n\t'%isFinite%': isFinite,\n\t'%isNaN%': isNaN,\n\t'%IteratorPrototype%': hasSymbols && getProto ? getProto(getProto([][Symbol.iterator]())) : undefined,\n\t'%JSON%': typeof JSON === 'object' ? JSON : undefined,\n\t'%Map%': typeof Map === 'undefined' ? undefined : Map,\n\t'%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Map()[Symbol.iterator]()),\n\t'%Math%': Math,\n\t'%Number%': Number,\n\t'%Object%': $Object,\n\t'%Object.getOwnPropertyDescriptor%': $gOPD,\n\t'%parseFloat%': parseFloat,\n\t'%parseInt%': parseInt,\n\t'%Promise%': typeof Promise === 'undefined' ? undefined : Promise,\n\t'%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,\n\t'%RangeError%': $RangeError,\n\t'%ReferenceError%': $ReferenceError,\n\t'%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,\n\t'%RegExp%': RegExp,\n\t'%Set%': typeof Set === 'undefined' ? undefined : Set,\n\t'%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols || !getProto ? undefined : getProto(new Set()[Symbol.iterator]()),\n\t'%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,\n\t'%String%': String,\n\t'%StringIteratorPrototype%': hasSymbols && getProto ? getProto(''[Symbol.iterator]()) : undefined,\n\t'%Symbol%': hasSymbols ? Symbol : undefined,\n\t'%SyntaxError%': $SyntaxError,\n\t'%ThrowTypeError%': ThrowTypeError,\n\t'%TypedArray%': TypedArray,\n\t'%TypeError%': $TypeError,\n\t'%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,\n\t'%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,\n\t'%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,\n\t'%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,\n\t'%URIError%': $URIError,\n\t'%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,\n\t'%WeakRef%': typeof WeakRef === 'undefined' ? undefined : WeakRef,\n\t'%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet,\n\n\t'%Function.prototype.call%': $call,\n\t'%Function.prototype.apply%': $apply,\n\t'%Object.defineProperty%': $defineProperty,\n\t'%Object.getPrototypeOf%': $ObjectGPO,\n\t'%Math.abs%': abs,\n\t'%Math.floor%': floor,\n\t'%Math.max%': max,\n\t'%Math.min%': min,\n\t'%Math.pow%': pow,\n\t'%Math.round%': round,\n\t'%Math.sign%': sign,\n\t'%Reflect.getPrototypeOf%': $ReflectGPO\n};\n\nif (getProto) {\n\ttry {\n\t\tnull.error; // eslint-disable-line no-unused-expressions\n\t} catch (e) {\n\t\t// https://github.com/tc39/proposal-shadowrealm/pull/384#issuecomment-1364264229\n\t\tvar errorProto = getProto(getProto(e));\n\t\tINTRINSICS['%Error.prototype%'] = errorProto;\n\t}\n}\n\nvar doEval = function doEval(name) {\n\tvar value;\n\tif (name === '%AsyncFunction%') {\n\t\tvalue = getEvalledConstructor('async function () {}');\n\t} else if (name === '%GeneratorFunction%') {\n\t\tvalue = getEvalledConstructor('function* () {}');\n\t} else if (name === '%AsyncGeneratorFunction%') {\n\t\tvalue = getEvalledConstructor('async function* () {}');\n\t} else if (name === '%AsyncGenerator%') {\n\t\tvar fn = doEval('%AsyncGeneratorFunction%');\n\t\tif (fn) {\n\t\t\tvalue = fn.prototype;\n\t\t}\n\t} else if (name === '%AsyncIteratorPrototype%') {\n\t\tvar gen = doEval('%AsyncGenerator%');\n\t\tif (gen && getProto) {\n\t\t\tvalue = getProto(gen.prototype);\n\t\t}\n\t}\n\n\tINTRINSICS[name] = value;\n\n\treturn value;\n};\n\nvar LEGACY_ALIASES = {\n\t__proto__: null,\n\t'%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'],\n\t'%ArrayPrototype%': ['Array', 'prototype'],\n\t'%ArrayProto_entries%': ['Array', 'prototype', 'entries'],\n\t'%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'],\n\t'%ArrayProto_keys%': ['Array', 'prototype', 'keys'],\n\t'%ArrayProto_values%': ['Array', 'prototype', 'values'],\n\t'%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'],\n\t'%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'],\n\t'%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'],\n\t'%BooleanPrototype%': ['Boolean', 'prototype'],\n\t'%DataViewPrototype%': ['DataView', 'prototype'],\n\t'%DatePrototype%': ['Date', 'prototype'],\n\t'%ErrorPrototype%': ['Error', 'prototype'],\n\t'%EvalErrorPrototype%': ['EvalError', 'prototype'],\n\t'%Float32ArrayPrototype%': ['Float32Array', 'prototype'],\n\t'%Float64ArrayPrototype%': ['Float64Array', 'prototype'],\n\t'%FunctionPrototype%': ['Function', 'prototype'],\n\t'%Generator%': ['GeneratorFunction', 'prototype'],\n\t'%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'],\n\t'%Int8ArrayPrototype%': ['Int8Array', 'prototype'],\n\t'%Int16ArrayPrototype%': ['Int16Array', 'prototype'],\n\t'%Int32ArrayPrototype%': ['Int32Array', 'prototype'],\n\t'%JSONParse%': ['JSON', 'parse'],\n\t'%JSONStringify%': ['JSON', 'stringify'],\n\t'%MapPrototype%': ['Map', 'prototype'],\n\t'%NumberPrototype%': ['Number', 'prototype'],\n\t'%ObjectPrototype%': ['Object', 'prototype'],\n\t'%ObjProto_toString%': ['Object', 'prototype', 'toString'],\n\t'%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'],\n\t'%PromisePrototype%': ['Promise', 'prototype'],\n\t'%PromiseProto_then%': ['Promise', 'prototype', 'then'],\n\t'%Promise_all%': ['Promise', 'all'],\n\t'%Promise_reject%': ['Promise', 'reject'],\n\t'%Promise_resolve%': ['Promise', 'resolve'],\n\t'%RangeErrorPrototype%': ['RangeError', 'prototype'],\n\t'%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'],\n\t'%RegExpPrototype%': ['RegExp', 'prototype'],\n\t'%SetPrototype%': ['Set', 'prototype'],\n\t'%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'],\n\t'%StringPrototype%': ['String', 'prototype'],\n\t'%SymbolPrototype%': ['Symbol', 'prototype'],\n\t'%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'],\n\t'%TypedArrayPrototype%': ['TypedArray', 'prototype'],\n\t'%TypeErrorPrototype%': ['TypeError', 'prototype'],\n\t'%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'],\n\t'%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'],\n\t'%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'],\n\t'%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'],\n\t'%URIErrorPrototype%': ['URIError', 'prototype'],\n\t'%WeakMapPrototype%': ['WeakMap', 'prototype'],\n\t'%WeakSetPrototype%': ['WeakSet', 'prototype']\n};\n\nvar bind = require('function-bind');\nvar hasOwn = require('hasown');\nvar $concat = bind.call($call, Array.prototype.concat);\nvar $spliceApply = bind.call($apply, Array.prototype.splice);\nvar $replace = bind.call($call, String.prototype.replace);\nvar $strSlice = bind.call($call, String.prototype.slice);\nvar $exec = bind.call($call, RegExp.prototype.exec);\n\n/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */\nvar rePropName = /[^%.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|%$))/g;\nvar reEscapeChar = /\\\\(\\\\)?/g; /** Used to match backslashes in property paths. */\nvar stringToPath = function stringToPath(string) {\n\tvar first = $strSlice(string, 0, 1);\n\tvar last = $strSlice(string, -1);\n\tif (first === '%' && last !== '%') {\n\t\tthrow new $SyntaxError('invalid intrinsic syntax, expected closing `%`');\n\t} else if (last === '%' && first !== '%') {\n\t\tthrow new $SyntaxError('invalid intrinsic syntax, expected opening `%`');\n\t}\n\tvar result = [];\n\t$replace(string, rePropName, function (match, number, quote, subString) {\n\t\tresult[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : number || match;\n\t});\n\treturn result;\n};\n/* end adaptation */\n\nvar getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {\n\tvar intrinsicName = name;\n\tvar alias;\n\tif (hasOwn(LEGACY_ALIASES, intrinsicName)) {\n\t\talias = LEGACY_ALIASES[intrinsicName];\n\t\tintrinsicName = '%' + alias[0] + '%';\n\t}\n\n\tif (hasOwn(INTRINSICS, intrinsicName)) {\n\t\tvar value = INTRINSICS[intrinsicName];\n\t\tif (value === needsEval) {\n\t\t\tvalue = doEval(intrinsicName);\n\t\t}\n\t\tif (typeof value === 'undefined' && !allowMissing) {\n\t\t\tthrow new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');\n\t\t}\n\n\t\treturn {\n\t\t\talias: alias,\n\t\t\tname: intrinsicName,\n\t\t\tvalue: value\n\t\t};\n\t}\n\n\tthrow new $SyntaxError('intrinsic ' + name + ' does not exist!');\n};\n\nmodule.exports = function GetIntrinsic(name, allowMissing) {\n\tif (typeof name !== 'string' || name.length === 0) {\n\t\tthrow new $TypeError('intrinsic name must be a non-empty string');\n\t}\n\tif (arguments.length > 1 && typeof allowMissing !== 'boolean') {\n\t\tthrow new $TypeError('\"allowMissing\" argument must be a boolean');\n\t}\n\n\tif ($exec(/^%?[^%]*%?$/, name) === null) {\n\t\tthrow new $SyntaxError('`%` may not be present anywhere but at the beginning and end of the intrinsic name');\n\t}\n\tvar parts = stringToPath(name);\n\tvar intrinsicBaseName = parts.length > 0 ? parts[0] : '';\n\n\tvar intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing);\n\tvar intrinsicRealName = intrinsic.name;\n\tvar value = intrinsic.value;\n\tvar skipFurtherCaching = false;\n\n\tvar alias = intrinsic.alias;\n\tif (alias) {\n\t\tintrinsicBaseName = alias[0];\n\t\t$spliceApply(parts, $concat([0, 1], alias));\n\t}\n\n\tfor (var i = 1, isOwn = true; i < parts.length; i += 1) {\n\t\tvar part = parts[i];\n\t\tvar first = $strSlice(part, 0, 1);\n\t\tvar last = $strSlice(part, -1);\n\t\tif (\n\t\t\t(\n\t\t\t\t(first === '\"' || first === \"'\" || first === '`')\n\t\t\t\t|| (last === '\"' || last === \"'\" || last === '`')\n\t\t\t)\n\t\t\t&& first !== last\n\t\t) {\n\t\t\tthrow new $SyntaxError('property names with quotes must have matching quotes');\n\t\t}\n\t\tif (part === 'constructor' || !isOwn) {\n\t\t\tskipFurtherCaching = true;\n\t\t}\n\n\t\tintrinsicBaseName += '.' + part;\n\t\tintrinsicRealName = '%' + intrinsicBaseName + '%';\n\n\t\tif (hasOwn(INTRINSICS, intrinsicRealName)) {\n\t\t\tvalue = INTRINSICS[intrinsicRealName];\n\t\t} else if (value != null) {\n\t\t\tif (!(part in value)) {\n\t\t\t\tif (!allowMissing) {\n\t\t\t\t\tthrow new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');\n\t\t\t\t}\n\t\t\t\treturn void undefined;\n\t\t\t}\n\t\t\tif ($gOPD && (i + 1) >= parts.length) {\n\t\t\t\tvar desc = $gOPD(value, part);\n\t\t\t\tisOwn = !!desc;\n\n\t\t\t\t// By convention, when a data property is converted to an accessor\n\t\t\t\t// property to emulate a data property that does not suffer from\n\t\t\t\t// the override mistake, that accessor's getter is marked with\n\t\t\t\t// an `originalValue` property. Here, when we detect this, we\n\t\t\t\t// uphold the illusion by pretending to see that original data\n\t\t\t\t// property, i.e., returning the value rather than the getter\n\t\t\t\t// itself.\n\t\t\t\tif (isOwn && 'get' in desc && !('originalValue' in desc.get)) {\n\t\t\t\t\tvalue = desc.get;\n\t\t\t\t} else {\n\t\t\t\t\tvalue = value[part];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tisOwn = hasOwn(value, part);\n\t\t\t\tvalue = value[part];\n\t\t\t}\n\n\t\t\tif (isOwn && !skipFurtherCaching) {\n\t\t\t\tINTRINSICS[intrinsicRealName] = value;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n","'use strict';\n\nvar GetIntrinsic = require('get-intrinsic');\n\nvar callBindBasic = require('call-bind-apply-helpers');\n\n/** @type {(thisArg: string, searchString: string, position?: number) => number} */\nvar $indexOf = callBindBasic([GetIntrinsic('%String.prototype.indexOf%')]);\n\n/** @type {import('.')} */\nmodule.exports = function callBoundIntrinsic(name, allowMissing) {\n\t/* eslint no-extra-parens: 0 */\n\n\tvar intrinsic = /** @type {(this: unknown, ...args: unknown[]) => unknown} */ (GetIntrinsic(name, !!allowMissing));\n\tif (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) {\n\t\treturn callBindBasic(/** @type {const} */ ([intrinsic]));\n\t}\n\treturn intrinsic;\n};\n","'use strict';\n\nvar GetIntrinsic = require('get-intrinsic');\nvar callBound = require('call-bound');\nvar inspect = require('object-inspect');\n\nvar $TypeError = require('es-errors/type');\nvar $Map = GetIntrinsic('%Map%', true);\n\n/** @type {<K, V>(thisArg: Map<K, V>, key: K) => V} */\nvar $mapGet = callBound('Map.prototype.get', true);\n/** @type {<K, V>(thisArg: Map<K, V>, key: K, value: V) => void} */\nvar $mapSet = callBound('Map.prototype.set', true);\n/** @type {<K, V>(thisArg: Map<K, V>, key: K) => boolean} */\nvar $mapHas = callBound('Map.prototype.has', true);\n/** @type {<K, V>(thisArg: Map<K, V>, key: K) => boolean} */\nvar $mapDelete = callBound('Map.prototype.delete', true);\n/** @type {<K, V>(thisArg: Map<K, V>) => number} */\nvar $mapSize = callBound('Map.prototype.size', true);\n\n/** @type {import('.')} */\nmodule.exports = !!$Map && /** @type {Exclude<import('.'), false>} */ function getSideChannelMap() {\n\t/** @typedef {ReturnType<typeof getSideChannelMap>} Channel */\n\t/** @typedef {Parameters<Channel['get']>[0]} K */\n\t/** @typedef {Parameters<Channel['set']>[1]} V */\n\n\t/** @type {Map<K, V> | undefined} */ var $m;\n\n\t/** @type {Channel} */\n\tvar channel = {\n\t\tassert: function (key) {\n\t\t\tif (!channel.has(key)) {\n\t\t\t\tthrow new $TypeError('Side channel does not contain ' + inspect(key));\n\t\t\t}\n\t\t},\n\t\t'delete': function (key) {\n\t\t\tif ($m) {\n\t\t\t\tvar result = $mapDelete($m, key);\n\t\t\t\tif ($mapSize($m) === 0) {\n\t\t\t\t\t$m = void undefined;\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tget: function (key) { // eslint-disable-line consistent-return\n\t\t\tif ($m) {\n\t\t\t\treturn $mapGet($m, key);\n\t\t\t}\n\t\t},\n\t\thas: function (key) {\n\t\t\tif ($m) {\n\t\t\t\treturn $mapHas($m, key);\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tset: function (key, value) {\n\t\t\tif (!$m) {\n\t\t\t\t// @ts-expect-error TS can't handle narrowing a variable inside a closure\n\t\t\t\t$m = new $Map();\n\t\t\t}\n\t\t\t$mapSet($m, key, value);\n\t\t}\n\t};\n\n\t// @ts-expect-error TODO: figure out why TS is erroring here\n\treturn channel;\n};\n","'use strict';\n\nvar GetIntrinsic = require('get-intrinsic');\nvar callBound = require('call-bound');\nvar inspect = require('object-inspect');\nvar getSideChannelMap = require('side-channel-map');\n\nvar $TypeError = require('es-errors/type');\nvar $WeakMap = GetIntrinsic('%WeakMap%', true);\n\n/** @type {<K extends object, V>(thisArg: WeakMap<K, V>, key: K) => V} */\nvar $weakMapGet = callBound('WeakMap.prototype.get', true);\n/** @type {<K extends object, V>(thisArg: WeakMap<K, V>, key: K, value: V) => void} */\nvar $weakMapSet = callBound('WeakMap.prototype.set', true);\n/** @type {<K extends object, V>(thisArg: WeakMap<K, V>, key: K) => boolean} */\nvar $weakMapHas = callBound('WeakMap.prototype.has', true);\n/** @type {<K extends object, V>(thisArg: WeakMap<K, V>, key: K) => boolean} */\nvar $weakMapDelete = callBound('WeakMap.prototype.delete', true);\n\n/** @type {import('.')} */\nmodule.exports = $WeakMap\n\t? /** @type {Exclude<import('.'), false>} */ function getSideChannelWeakMap() {\n\t\t/** @typedef {ReturnType<typeof getSideChannelWeakMap>} Channel */\n\t\t/** @typedef {Parameters<Channel['get']>[0]} K */\n\t\t/** @typedef {Parameters<Channel['set']>[1]} V */\n\n\t\t/** @type {WeakMap<K & object, V> | undefined} */ var $wm;\n\t\t/** @type {Channel | undefined} */ var $m;\n\n\t\t/** @type {Channel} */\n\t\tvar channel = {\n\t\t\tassert: function (key) {\n\t\t\t\tif (!channel.has(key)) {\n\t\t\t\t\tthrow new $TypeError('Side channel does not contain ' + inspect(key));\n\t\t\t\t}\n\t\t\t},\n\t\t\t'delete': function (key) {\n\t\t\t\tif ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {\n\t\t\t\t\tif ($wm) {\n\t\t\t\t\t\treturn $weakMapDelete($wm, key);\n\t\t\t\t\t}\n\t\t\t\t} else if (getSideChannelMap) {\n\t\t\t\t\tif ($m) {\n\t\t\t\t\t\treturn $m['delete'](key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tget: function (key) {\n\t\t\t\tif ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {\n\t\t\t\t\tif ($wm) {\n\t\t\t\t\t\treturn $weakMapGet($wm, key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn $m && $m.get(key);\n\t\t\t},\n\t\t\thas: function (key) {\n\t\t\t\tif ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {\n\t\t\t\t\tif ($wm) {\n\t\t\t\t\t\treturn $weakMapHas($wm, key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn !!$m && $m.has(key);\n\t\t\t},\n\t\t\tset: function (key, value) {\n\t\t\t\tif ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) {\n\t\t\t\t\tif (!$wm) {\n\t\t\t\t\t\t$wm = new $WeakMap();\n\t\t\t\t\t}\n\t\t\t\t\t$weakMapSet($wm, key, value);\n\t\t\t\t} else if (getSideChannelMap) {\n\t\t\t\t\tif (!$m) {\n\t\t\t\t\t\t$m = getSideChannelMap();\n\t\t\t\t\t}\n\t\t\t\t\t// eslint-disable-next-line no-extra-parens\n\t\t\t\t\t/** @type {NonNullable<typeof $m>} */ ($m).set(key, value);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// @ts-expect-error TODO: figure out why this is erroring\n\t\treturn channel;\n\t}\n\t: getSideChannelMap;\n","'use strict';\n\nvar $TypeError = require('es-errors/type');\nvar inspect = require('object-inspect');\nvar getSideChannelList = require('side-channel-list');\nvar getSideChannelMap = require('side-channel-map');\nvar getSideChannelWeakMap = require('side-channel-weakmap');\n\nvar makeChannel = getSideChannelWeakMap || getSideChannelMap || getSideChannelList;\n\n/** @type {import('.')} */\nmodule.exports = function getSideChannel() {\n\t/** @typedef {ReturnType<typeof getSideChannel>} Channel */\n\n\t/** @type {Channel | undefined} */ var $channelData;\n\n\t/** @type {Channel} */\n\tvar channel = {\n\t\tassert: function (key) {\n\t\t\tif (!channel.has(key)) {\n\t\t\t\tthrow new $TypeError('Side channel does not contain ' + inspect(key));\n\t\t\t}\n\t\t},\n\t\t'delete': function (key) {\n\t\t\treturn !!$channelData && $channelData['delete'](key);\n\t\t},\n\t\tget: function (key) {\n\t\t\treturn $channelData && $channelData.get(key);\n\t\t},\n\t\thas: function (key) {\n\t\t\treturn !!$channelData && $channelData.has(key);\n\t\t},\n\t\tset: function (key, value) {\n\t\t\tif (!$channelData) {\n\t\t\t\t$channelData = makeChannel();\n\t\t\t}\n\n\t\t\t$channelData.set(key, value);\n\t\t}\n\t};\n\t// @ts-expect-error TODO: figure out why this is erroring\n\treturn channel;\n};\n","'use strict';\n\nvar replace = String.prototype.replace;\nvar percentTwenties = /%20/g;\n\nvar Format = {\n RFC1738: 'RFC1738',\n RFC3986: 'RFC3986'\n};\n\nmodule.exports = {\n 'default': Format.RFC3986,\n formatters: {\n RFC1738: function (value) {\n return replace.call(value, percentTwenties, '+');\n },\n RFC3986: function (value) {\n return String(value);\n }\n },\n RFC1738: Format.RFC1738,\n RFC3986: Format.RFC3986\n};\n","'use strict';\n\nvar formats = require('./formats');\nvar getSideChannel = require('side-channel');\n\nvar has = Object.prototype.hasOwnProperty;\nvar isArray = Array.isArray;\n\n// Track objects created from arrayLimit overflow using side-channel\n// Stores the current max numeric index for O(1) lookup\nvar overflowChannel = getSideChannel();\n\nvar markOverflow = function markOverflow(obj, maxIndex) {\n overflowChannel.set(obj, maxIndex);\n return obj;\n};\n\nvar isOverflow = function isOverflow(obj) {\n return overflowChannel.has(obj);\n};\n\nvar getMaxIndex = function getMaxIndex(obj) {\n return overflowChannel.get(obj);\n};\n\nvar setMaxIndex = function setMaxIndex(obj, maxIndex) {\n overflowChannel.set(obj, maxIndex);\n};\n\nvar hexTable = (function () {\n var array = [];\n for (var i = 0; i < 256; ++i) {\n array[array.length] = '%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase();\n }\n\n return array;\n}());\n\nvar compactQueue = function compactQueue(queue) {\n while (queue.length > 1) {\n var item = queue.pop();\n var obj = item.obj[item.prop];\n\n if (isArray(obj)) {\n var compacted = [];\n\n for (var j = 0; j < obj.length; ++j) {\n if (typeof obj[j] !== 'undefined') {\n compacted[compacted.length] = obj[j];\n }\n }\n\n item.obj[item.prop] = compacted;\n }\n }\n};\n\nvar arrayToObject = function arrayToObject(source, options) {\n var obj = options && options.plainObjects ? { __proto__: null } : {};\n for (var i = 0; i < source.length; ++i) {\n if (typeof source[i] !== 'undefined') {\n obj[i] = source[i];\n }\n }\n\n return obj;\n};\n\nvar merge = function merge(target, source, options) {\n /* eslint no-param-reassign: 0 */\n if (!source) {\n return target;\n }\n\n if (typeof source !== 'object' && typeof source !== 'function') {\n if (isArray(target)) {\n var nextIndex = target.length;\n if (options && typeof options.arrayLimit === 'number' && nextIndex > options.arrayLimit) {\n return markOverflow(arrayToObject(target.concat(source), options), nextIndex);\n }\n target[nextIndex] = source;\n } else if (target && typeof target === 'object') {\n if (isOverflow(target)) {\n // Add at next numeric index for overflow objects\n var newIndex = getMaxIndex(target) + 1;\n target[newIndex] = source;\n setMaxIndex(target, newIndex);\n } else if (options && options.strictMerge) {\n return [target, source];\n } else if (\n (options && (options.plainObjects || options.allowPrototypes))\n || !has.call(Object.prototype, source)\n ) {\n target[source] = true;\n }\n } else {\n return [target, source];\n }\n\n return target;\n }\n\n if (!target || typeof target !== 'object') {\n if (isOverflow(source)) {\n // Create new object with target at 0, source values shifted by 1\n var sourceKeys = Object.keys(source);\n var result = options && options.plainObjects\n ? { __proto__: null, 0: target }\n : { 0: target };\n for (var m = 0; m < sourceKeys.length; m++) {\n var oldKey = parseInt(sourceKeys[m], 10);\n result[oldKey + 1] = source[sourceKeys[m]];\n }\n return markOverflow(result, getMaxIndex(source) + 1);\n }\n var combined = [target].concat(source);\n if (options && typeof options.arrayLimit === 'number' && combined.length > options.arrayLimit) {\n return markOverflow(arrayToObject(combined, options), combined.length - 1);\n }\n return combined;\n }\n\n var mergeTarget = target;\n if (isArray(target) && !isArray(source)) {\n mergeTarget = arrayToObject(target, options);\n }\n\n if (isArray(target) && isArray(source)) {\n source.forEach(function (item, i) {\n if (has.call(target, i)) {\n var targetItem = target[i];\n if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') {\n target[i] = merge(targetItem, item, options);\n } else {\n target[target.length] = item;\n }\n } else {\n target[i] = item;\n }\n });\n return target;\n }\n\n return Object.keys(source).reduce(function (acc, key) {\n var value = source[key];\n\n if (has.call(acc, key)) {\n acc[key] = merge(acc[key], value, options);\n } else {\n acc[key] = value;\n }\n\n if (isOverflow(source) && !isOverflow(acc)) {\n markOverflow(acc, getMaxIndex(source));\n }\n if (isOverflow(acc)) {\n var keyNum = parseInt(key, 10);\n if (String(keyNum) === key && keyNum >= 0 && keyNum > getMaxIndex(acc)) {\n setMaxIndex(acc, keyNum);\n }\n }\n\n return acc;\n }, mergeTarget);\n};\n\nvar assign = function assignSingleSource(target, source) {\n return Object.keys(source).reduce(function (acc, key) {\n acc[key] = source[key];\n return acc;\n }, target);\n};\n\nvar decode = function (str, defaultDecoder, charset) {\n var strWithoutPlus = str.replace(/\\+/g, ' ');\n if (charset === 'iso-8859-1') {\n // unescape never throws, no try...catch needed:\n return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);\n }\n // utf-8\n try {\n return decodeURIComponent(strWithoutPlus);\n } catch (e) {\n return strWithoutPlus;\n }\n};\n\nvar limit = 1024;\n\n/* eslint operator-linebreak: [2, \"before\"] */\n\nvar encode = function encode(str, defaultEncoder, charset, kind, format) {\n // This code was originally written by Brian White (mscdex) for the io.js core querystring library.\n // It has been adapted here for stricter adherence to RFC 3986\n if (str.length === 0) {\n return str;\n }\n\n var string = str;\n if (typeof str === 'symbol') {\n string = Symbol.prototype.toString.call(str);\n } else if (typeof str !== 'string') {\n string = String(str);\n }\n\n if (charset === 'iso-8859-1') {\n return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) {\n return '%26%23' + parseInt($0.slice(2), 16) + '%3B';\n });\n }\n\n var out = '';\n for (var j = 0; j < string.length; j += limit) {\n var segment = string.length >= limit ? string.slice(j, j + limit) : string;\n var arr = [];\n\n for (var i = 0; i < segment.length; ++i) {\n var c = segment.charCodeAt(i);\n if (\n c === 0x2D // -\n || c === 0x2E // .\n || c === 0x5F // _\n || c === 0x7E // ~\n || (c >= 0x30 && c <= 0x39) // 0-9\n || (c >= 0x41 && c <= 0x5A) // a-z\n || (c >= 0x61 && c <= 0x7A) // A-Z\n || (format === formats.RFC1738 && (c === 0x28 || c === 0x29)) // ( )\n ) {\n arr[arr.length] = segment.charAt(i);\n continue;\n }\n\n if (c < 0x80) {\n arr[arr.length] = hexTable[c];\n continue;\n }\n\n if (c < 0x800) {\n arr[arr.length] = hexTable[0xC0 | (c >> 6)]\n + hexTable[0x80 | (c & 0x3F)];\n continue;\n }\n\n if (c < 0xD800 || c >= 0xE000) {\n arr[arr.length] = hexTable[0xE0 | (c >> 12)]\n + hexTable[0x80 | ((c >> 6) & 0x3F)]\n + hexTable[0x80 | (c & 0x3F)];\n continue;\n }\n\n i += 1;\n c = 0x10000 + (((c & 0x3FF) << 10) | (segment.charCodeAt(i) & 0x3FF));\n\n arr[arr.length] = hexTable[0xF0 | (c >> 18)]\n + hexTable[0x80 | ((c >> 12) & 0x3F)]\n + hexTable[0x80 | ((c >> 6) & 0x3F)]\n + hexTable[0x80 | (c & 0x3F)];\n }\n\n out += arr.join('');\n }\n\n return out;\n};\n\nvar compact = function compact(value) {\n var queue = [{ obj: { o: value }, prop: 'o' }];\n var refs = [];\n\n for (var i = 0; i < queue.length; ++i) {\n var item = queue[i];\n var obj = item.obj[item.prop];\n\n var keys = Object.keys(obj);\n for (var j = 0; j < keys.length; ++j) {\n var key = keys[j];\n var val = obj[key];\n if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {\n queue[queue.length] = { obj: obj, prop: key };\n refs[refs.length] = val;\n }\n }\n }\n\n compactQueue(queue);\n\n return value;\n};\n\nvar isRegExp = function isRegExp(obj) {\n return Object.prototype.toString.call(obj) === '[object RegExp]';\n};\n\nvar isBuffer = function isBuffer(obj) {\n if (!obj || typeof obj !== 'object') {\n return false;\n }\n\n return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));\n};\n\nvar combine = function combine(a, b, arrayLimit, plainObjects) {\n // If 'a' is already an overflow object, add to it\n if (isOverflow(a)) {\n var newIndex = getMaxIndex(a) + 1;\n a[newIndex] = b;\n setMaxIndex(a, newIndex);\n return a;\n }\n\n var result = [].concat(a, b);\n if (result.length > arrayLimit) {\n return markOverflow(arrayToObject(result, { plainObjects: plainObjects }), result.length - 1);\n }\n return result;\n};\n\nvar maybeMap = function maybeMap(val, fn) {\n if (isArray(val)) {\n var mapped = [];\n for (var i = 0; i < val.length; i += 1) {\n mapped[mapped.length] = fn(val[i]);\n }\n return mapped;\n }\n return fn(val);\n};\n\nmodule.exports = {\n arrayToObject: arrayToObject,\n assign: assign,\n combine: combine,\n compact: compact,\n decode: decode,\n encode: encode,\n isBuffer: isBuffer,\n isOverflow: isOverflow,\n isRegExp: isRegExp,\n markOverflow: markOverflow,\n maybeMap: maybeMap,\n merge: merge\n};\n","'use strict';\n\nvar getSideChannel = require('side-channel');\nvar utils = require('./utils');\nvar formats = require('./formats');\nvar has = Object.prototype.hasOwnProperty;\n\nvar arrayPrefixGenerators = {\n brackets: function brackets(prefix) {\n return prefix + '[]';\n },\n comma: 'comma',\n indices: function indices(prefix, key) {\n return prefix + '[' + key + ']';\n },\n repeat: function repeat(prefix) {\n return prefix;\n }\n};\n\nvar isArray = Array.isArray;\nvar push = Array.prototype.push;\nvar pushToArray = function (arr, valueOrArray) {\n push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]);\n};\n\nvar toISO = Date.prototype.toISOString;\n\nvar defaultFormat = formats['default'];\nvar defaults = {\n addQueryPrefix: false,\n allowDots: false,\n allowEmptyArrays: false,\n arrayFormat: 'indices',\n charset: 'utf-8',\n charsetSentinel: false,\n commaRoundTrip: false,\n delimiter: '&',\n encode: true,\n encodeDotInKeys: false,\n encoder: utils.encode,\n encodeValuesOnly: false,\n filter: void undefined,\n format: defaultFormat,\n formatter: formats.formatters[defaultFormat],\n // deprecated\n indices: false,\n serializeDate: function serializeDate(date) {\n return toISO.call(date);\n },\n skipNulls: false,\n strictNullHandling: false\n};\n\nvar isNonNullishPrimitive = function isNonNullishPrimitive(v) {\n return typeof v === 'string'\n || typeof v === 'number'\n || typeof v === 'boolean'\n || typeof v === 'symbol'\n || typeof v === 'bigint';\n};\n\nvar sentinel = {};\n\nvar stringify = function stringify(\n object,\n prefix,\n generateArrayPrefix,\n commaRoundTrip,\n allowEmptyArrays,\n strictNullHandling,\n skipNulls,\n encodeDotInKeys,\n encoder,\n filter,\n sort,\n allowDots,\n serializeDate,\n format,\n formatter,\n encodeValuesOnly,\n charset,\n sideChannel\n) {\n var obj = object;\n\n var tmpSc = sideChannel;\n var step = 0;\n var findFlag = false;\n while ((tmpSc = tmpSc.get(sentinel)) !== void undefined && !findFlag) {\n // Where object last appeared in the ref tree\n var pos = tmpSc.get(object);\n step += 1;\n if (typeof pos !== 'undefined') {\n if (pos === step) {\n throw new RangeError('Cyclic object value');\n } else {\n findFlag = true; // Break while\n }\n }\n if (typeof tmpSc.get(sentinel) === 'undefined') {\n step = 0;\n }\n }\n\n if (typeof filter === 'function') {\n obj = filter(prefix, obj);\n } else if (obj instanceof Date) {\n obj = serializeDate(obj);\n } else if (generateArrayPrefix === 'comma' && isArray(obj)) {\n obj = utils.maybeMap(obj, function (value) {\n if (value instanceof Date) {\n return serializeDate(value);\n }\n return value;\n });\n }\n\n if (obj === null) {\n if (strictNullHandling) {\n return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix;\n }\n\n obj = '';\n }\n\n if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) {\n if (encoder) {\n var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset, 'key', format);\n return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset, 'value', format))];\n }\n return [formatter(prefix) + '=' + formatter(String(obj))];\n }\n\n var values = [];\n\n if (typeof obj === 'undefined') {\n return values;\n }\n\n var objKeys;\n if (generateArrayPrefix === 'comma' && isArray(obj)) {\n // we need to join elements in\n if (encodeValuesOnly && encoder) {\n obj = utils.maybeMap(obj, encoder);\n }\n objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }];\n } else if (isArray(filter)) {\n objKeys = filter;\n } else {\n var keys = Object.keys(obj);\n objKeys = sort ? keys.sort(sort) : keys;\n }\n\n var encodedPrefix = encodeDotInKeys ? String(prefix).replace(/\\./g, '%2E') : String(prefix);\n\n var adjustedPrefix = commaRoundTrip && isArray(obj) && obj.length === 1 ? encodedPrefix + '[]' : encodedPrefix;\n\n if (allowEmptyArrays && isArray(obj) && obj.length === 0) {\n return adjustedPrefix + '[]';\n }\n\n for (var j = 0; j < objKeys.length; ++j) {\n var key = objKeys[j];\n var value = typeof key === 'object' && key && typeof key.value !== 'undefined'\n ? key.value\n : obj[key];\n\n if (skipNulls && value === null) {\n continue;\n }\n\n var encodedKey = allowDots && encodeDotInKeys ? String(key).replace(/\\./g, '%2E') : String(key);\n var keyPrefix = isArray(obj)\n ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(adjustedPrefix, encodedKey) : adjustedPrefix\n : adjustedPrefix + (allowDots ? '.' + encodedKey : '[' + encodedKey + ']');\n\n sideChannel.set(object, step);\n var valueSideChannel = getSideChannel();\n valueSideChannel.set(sentinel, sideChannel);\n pushToArray(values, stringify(\n value,\n keyPrefix,\n generateArrayPrefix,\n commaRoundTrip,\n allowEmptyArrays,\n strictNullHandling,\n skipNulls,\n encodeDotInKeys,\n generateArrayPrefix === 'comma' && encodeValuesOnly && isArray(obj) ? null : encoder,\n filter,\n sort,\n allowDots,\n serializeDate,\n format,\n formatter,\n encodeValuesOnly,\n charset,\n valueSideChannel\n ));\n }\n\n return values;\n};\n\nvar normalizeStringifyOptions = function normalizeStringifyOptions(opts) {\n if (!opts) {\n return defaults;\n }\n\n if (typeof opts.allowEmptyArrays !== 'undefined' && typeof opts.allowEmptyArrays !== 'boolean') {\n throw new TypeError('`allowEmptyArrays` option can only be `true` or `false`, when provided');\n }\n\n if (typeof opts.encodeDotInKeys !== 'undefined' && typeof opts.encodeDotInKeys !== 'boolean') {\n throw new TypeError('`encodeDotInKeys` option can only be `true` or `false`, when provided');\n }\n\n if (opts.encoder !== null && typeof opts.encoder !== 'undefined' && typeof opts.encoder !== 'function') {\n throw new TypeError('Encoder has to be a function.');\n }\n\n var charset = opts.charset || defaults.charset;\n if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {\n throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');\n }\n\n var format = formats['default'];\n if (typeof opts.format !== 'undefined') {\n if (!has.call(formats.formatters, opts.format)) {\n throw new TypeError('Unknown format option provided.');\n }\n format = opts.format;\n }\n var formatter = formats.formatters[format];\n\n var filter = defaults.filter;\n if (typeof opts.filter === 'function' || isArray(opts.filter)) {\n filter = opts.filter;\n }\n\n var arrayFormat;\n if (opts.arrayFormat in arrayPrefixGenerators) {\n arrayFormat = opts.arrayFormat;\n } else if ('indices' in opts) {\n arrayFormat = opts.indices ? 'indices' : 'repeat';\n } else {\n arrayFormat = defaults.arrayFormat;\n }\n\n if ('commaRoundTrip' in opts && typeof opts.commaRoundTrip !== 'boolean') {\n throw new TypeError('`commaRoundTrip` must be a boolean, or absent');\n }\n\n var allowDots = typeof opts.allowDots === 'undefined' ? opts.encodeDotInKeys === true ? true : defaults.allowDots : !!opts.allowDots;\n\n return {\n addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix,\n allowDots: allowDots,\n allowEmptyArrays: typeof opts.allowEmptyArrays === 'boolean' ? !!opts.allowEmptyArrays : defaults.allowEmptyArrays,\n arrayFormat: arrayFormat,\n charset: charset,\n charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,\n commaRoundTrip: !!opts.commaRoundTrip,\n delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter,\n encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode,\n encodeDotInKeys: typeof opts.encodeDotInKeys === 'boolean' ? opts.encodeDotInKeys : defaults.encodeDotInKeys,\n encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder,\n encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly,\n filter: filter,\n format: format,\n formatter: formatter,\n serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate,\n skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls,\n sort: typeof opts.sort === 'function' ? opts.sort : null,\n strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling\n };\n};\n\nmodule.exports = function (object, opts) {\n var obj = object;\n var options = normalizeStringifyOptions(opts);\n\n var objKeys;\n var filter;\n\n if (typeof options.filter === 'function') {\n filter = options.filter;\n obj = filter('', obj);\n } else if (isArray(options.filter)) {\n filter = options.filter;\n objKeys = filter;\n }\n\n var keys = [];\n\n if (typeof obj !== 'object' || obj === null) {\n return '';\n }\n\n var generateArrayPrefix = arrayPrefixGenerators[options.arrayFormat];\n var commaRoundTrip = generateArrayPrefix === 'comma' && options.commaRoundTrip;\n\n if (!objKeys) {\n objKeys = Object.keys(obj);\n }\n\n if (options.sort) {\n objKeys.sort(options.sort);\n }\n\n var sideChannel = getSideChannel();\n for (var i = 0; i < objKeys.length; ++i) {\n var key = objKeys[i];\n var value = obj[key];\n\n if (options.skipNulls && value === null) {\n continue;\n }\n pushToArray(keys, stringify(\n value,\n key,\n generateArrayPrefix,\n commaRoundTrip,\n options.allowEmptyArrays,\n options.strictNullHandling,\n options.skipNulls,\n options.encodeDotInKeys,\n options.encode ? options.encoder : null,\n options.filter,\n options.sort,\n options.allowDots,\n options.serializeDate,\n options.format,\n options.formatter,\n options.encodeValuesOnly,\n options.charset,\n sideChannel\n ));\n }\n\n var joined = keys.join(options.delimiter);\n var prefix = options.addQueryPrefix === true ? '?' : '';\n\n if (options.charsetSentinel) {\n if (options.charset === 'iso-8859-1') {\n // encodeURIComponent('&#10003;'), the \"numeric entity\" representation of a checkmark\n prefix += 'utf8=%26%2310003%3B&';\n } else {\n // encodeURIComponent('✓')\n prefix += 'utf8=%E2%9C%93&';\n }\n }\n\n return joined.length > 0 ? prefix + joined : '';\n};\n","'use strict';\n\nvar utils = require('./utils');\n\nvar has = Object.prototype.hasOwnProperty;\nvar isArray = Array.isArray;\n\nvar defaults = {\n allowDots: false,\n allowEmptyArrays: false,\n allowPrototypes: false,\n allowSparse: false,\n arrayLimit: 20,\n charset: 'utf-8',\n charsetSentinel: false,\n comma: false,\n decodeDotInKeys: false,\n decoder: utils.decode,\n delimiter: '&',\n depth: 5,\n duplicates: 'combine',\n ignoreQueryPrefix: false,\n interpretNumericEntities: false,\n parameterLimit: 1000,\n parseArrays: true,\n plainObjects: false,\n strictDepth: false,\n strictMerge: true,\n strictNullHandling: false,\n throwOnLimitExceeded: false\n};\n\nvar interpretNumericEntities = function (str) {\n return str.replace(/&#(\\d+);/g, function ($0, numberStr) {\n return String.fromCharCode(parseInt(numberStr, 10));\n });\n};\n\nvar parseArrayValue = function (val, options, currentArrayLength) {\n if (val && typeof val === 'string' && options.comma && val.indexOf(',') > -1) {\n return val.split(',');\n }\n\n if (options.throwOnLimitExceeded && currentArrayLength >= options.arrayLimit) {\n throw new RangeError('Array limit exceeded. Only ' + options.arrayLimit + ' element' + (options.arrayLimit === 1 ? '' : 's') + ' allowed in an array.');\n }\n\n return val;\n};\n\n// This is what browsers will submit when the ✓ character occurs in an\n// application/x-www-form-urlencoded body and the encoding of the page containing\n// the form is iso-8859-1, or when the submitted form has an accept-charset\n// attribute of iso-8859-1. Presumably also with other charsets that do not contain\n// the ✓ character, such as us-ascii.\nvar isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('&#10003;')\n\n// These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded.\nvar charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓')\n\nvar parseValues = function parseQueryStringValues(str, options) {\n var obj = { __proto__: null };\n\n var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\\?/, '') : str;\n cleanStr = cleanStr.replace(/%5B/gi, '[').replace(/%5D/gi, ']');\n\n var limit = options.parameterLimit === Infinity ? void undefined : options.parameterLimit;\n var parts = cleanStr.split(\n options.delimiter,\n options.throwOnLimitExceeded ? limit + 1 : limit\n );\n\n if (options.throwOnLimitExceeded && parts.length > limit) {\n throw new RangeError('Parameter limit exceeded. Only ' + limit + ' parameter' + (limit === 1 ? '' : 's') + ' allowed.');\n }\n\n var skipIndex = -1; // Keep track of where the utf8 sentinel was found\n var i;\n\n var charset = options.charset;\n if (options.charsetSentinel) {\n for (i = 0; i < parts.length; ++i) {\n if (parts[i].indexOf('utf8=') === 0) {\n if (parts[i] === charsetSentinel) {\n charset = 'utf-8';\n } else if (parts[i] === isoSentinel) {\n charset = 'iso-8859-1';\n }\n skipIndex = i;\n i = parts.length; // The eslint settings do not allow break;\n }\n }\n }\n\n for (i = 0; i < parts.length; ++i) {\n if (i === skipIndex) {\n continue;\n }\n var part = parts[i];\n\n var bracketEqualsPos = part.indexOf(']=');\n var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;\n\n var key;\n var val;\n if (pos === -1) {\n key = options.decoder(part, defaults.decoder, charset, 'key');\n val = options.strictNullHandling ? null : '';\n } else {\n key = options.decoder(part.slice(0, pos), defaults.decoder, charset, 'key');\n\n if (key !== null) {\n val = utils.maybeMap(\n parseArrayValue(\n part.slice(pos + 1),\n options,\n isArray(obj[key]) ? obj[key].length : 0\n ),\n function (encodedVal) {\n return options.decoder(encodedVal, defaults.decoder, charset, 'value');\n }\n );\n }\n }\n\n if (val && options.interpretNumericEntities && charset === 'iso-8859-1') {\n val = interpretNumericEntities(String(val));\n }\n\n if (part.indexOf('[]=') > -1) {\n val = isArray(val) ? [val] : val;\n }\n\n if (options.comma && isArray(val) && val.length > options.arrayLimit) {\n if (options.throwOnLimitExceeded) {\n throw new RangeError('Array limit exceeded. Only ' + options.arrayLimit + ' element' + (options.arrayLimit === 1 ? '' : 's') + ' allowed in an array.');\n }\n val = utils.combine([], val, options.arrayLimit, options.plainObjects);\n }\n\n if (key !== null) {\n var existing = has.call(obj, key);\n if (existing && (options.duplicates === 'combine' || part.indexOf('[]=') > -1)) {\n obj[key] = utils.combine(\n obj[key],\n val,\n options.arrayLimit,\n options.plainObjects\n );\n } else if (!existing || options.duplicates === 'last') {\n obj[key] = val;\n }\n }\n }\n\n return obj;\n};\n\nvar parseObject = function (chain, val, options, valuesParsed) {\n var currentArrayLength = 0;\n if (chain.length > 0 && chain[chain.length - 1] === '[]') {\n var parentKey = chain.slice(0, -1).join('');\n currentArrayLength = Array.isArray(val) && val[parentKey] ? val[parentKey].length : 0;\n }\n\n var leaf = valuesParsed ? val : parseArrayValue(val, options, currentArrayLength);\n\n for (var i = chain.length - 1; i >= 0; --i) {\n var obj;\n var root = chain[i];\n\n if (root === '[]' && options.parseArrays) {\n if (utils.isOverflow(leaf)) {\n // leaf is already an overflow object, preserve it\n obj = leaf;\n } else {\n obj = options.allowEmptyArrays && (leaf === '' || (options.strictNullHandling && leaf === null))\n ? []\n : utils.combine(\n [],\n leaf,\n options.arrayLimit,\n options.plainObjects\n );\n }\n } else {\n obj = options.plainObjects ? { __proto__: null } : {};\n var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;\n var decodedRoot = options.decodeDotInKeys ? cleanRoot.replace(/%2E/g, '.') : cleanRoot;\n var index = parseInt(decodedRoot, 10);\n var isValidArrayIndex = !isNaN(index)\n && root !== decodedRoot\n && String(index) === decodedRoot\n && index >= 0\n && options.parseArrays;\n if (!options.parseArrays && decodedRoot === '') {\n obj = { 0: leaf };\n } else if (isValidArrayIndex && index < options.arrayLimit) {\n obj = [];\n obj[index] = leaf;\n } else if (isValidArrayIndex && options.throwOnLimitExceeded) {\n throw new RangeError('Array limit exceeded. Only ' + options.arrayLimit + ' element' + (options.arrayLimit === 1 ? '' : 's') + ' allowed in an array.');\n } else if (isValidArrayIndex) {\n obj[index] = leaf;\n utils.markOverflow(obj, index);\n } else if (decodedRoot !== '__proto__') {\n obj[decodedRoot] = leaf;\n }\n }\n\n leaf = obj;\n }\n\n return leaf;\n};\n\nvar splitKeyIntoSegments = function splitKeyIntoSegments(givenKey, options) {\n var key = options.allowDots ? givenKey.replace(/\\.([^.[]+)/g, '[$1]') : givenKey;\n\n if (options.depth <= 0) {\n if (!options.plainObjects && has.call(Object.prototype, key)) {\n if (!options.allowPrototypes) {\n return;\n }\n }\n\n return [key];\n }\n\n var brackets = /(\\[[^[\\]]*])/;\n var child = /(\\[[^[\\]]*])/g;\n\n var segment = brackets.exec(key);\n var parent = segment ? key.slice(0, segment.index) : key;\n\n var keys = [];\n\n if (parent) {\n if (!options.plainObjects && has.call(Object.prototype, parent)) {\n if (!options.allowPrototypes) {\n return;\n }\n }\n\n keys[keys.length] = parent;\n }\n\n var i = 0;\n while ((segment = child.exec(key)) !== null && i < options.depth) {\n i += 1;\n\n var segmentContent = segment[1].slice(1, -1);\n if (!options.plainObjects && has.call(Object.prototype, segmentContent)) {\n if (!options.allowPrototypes) {\n return;\n }\n }\n\n keys[keys.length] = segment[1];\n }\n\n if (segment) {\n if (options.strictDepth === true) {\n throw new RangeError('Input depth exceeded depth option of ' + options.depth + ' and strictDepth is true');\n }\n\n keys[keys.length] = '[' + key.slice(segment.index) + ']';\n }\n\n return keys;\n};\n\nvar parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) {\n if (!givenKey) {\n return;\n }\n\n var keys = splitKeyIntoSegments(givenKey, options);\n\n if (!keys) {\n return;\n }\n\n return parseObject(keys, val, options, valuesParsed);\n};\n\nvar normalizeParseOptions = function normalizeParseOptions(opts) {\n if (!opts) {\n return defaults;\n }\n\n if (typeof opts.allowEmptyArrays !== 'undefined' && typeof opts.allowEmptyArrays !== 'boolean') {\n throw new TypeError('`allowEmptyArrays` option can only be `true` or `false`, when provided');\n }\n\n if (typeof opts.decodeDotInKeys !== 'undefined' && typeof opts.decodeDotInKeys !== 'boolean') {\n throw new TypeError('`decodeDotInKeys` option can only be `true` or `false`, when provided');\n }\n\n if (opts.decoder !== null && typeof opts.decoder !== 'undefined' && typeof opts.decoder !== 'function') {\n throw new TypeError('Decoder has to be a function.');\n }\n\n if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {\n throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');\n }\n\n if (typeof opts.throwOnLimitExceeded !== 'undefined' && typeof opts.throwOnLimitExceeded !== 'boolean') {\n throw new TypeError('`throwOnLimitExceeded` option must be a boolean');\n }\n\n var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset;\n\n var duplicates = typeof opts.duplicates === 'undefined' ? defaults.duplicates : opts.duplicates;\n\n if (duplicates !== 'combine' && duplicates !== 'first' && duplicates !== 'last') {\n throw new TypeError('The duplicates option must be either combine, first, or last');\n }\n\n var allowDots = typeof opts.allowDots === 'undefined' ? opts.decodeDotInKeys === true ? true : defaults.allowDots : !!opts.allowDots;\n\n return {\n allowDots: allowDots,\n allowEmptyArrays: typeof opts.allowEmptyArrays === 'boolean' ? !!opts.allowEmptyArrays : defaults.allowEmptyArrays,\n allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes,\n allowSparse: typeof opts.allowSparse === 'boolean' ? opts.allowSparse : defaults.allowSparse,\n arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit,\n charset: charset,\n charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,\n comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma,\n decodeDotInKeys: typeof opts.decodeDotInKeys === 'boolean' ? opts.decodeDotInKeys : defaults.decodeDotInKeys,\n decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder,\n delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter,\n // eslint-disable-next-line no-implicit-coercion, no-extra-parens\n depth: (typeof opts.depth === 'number' || opts.depth === false) ? +opts.depth : defaults.depth,\n duplicates: duplicates,\n ignoreQueryPrefix: opts.ignoreQueryPrefix === true,\n interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities,\n parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit,\n parseArrays: opts.parseArrays !== false,\n plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects,\n strictDepth: typeof opts.strictDepth === 'boolean' ? !!opts.strictDepth : defaults.strictDepth,\n strictMerge: typeof opts.strictMerge === 'boolean' ? !!opts.strictMerge : defaults.strictMerge,\n strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling,\n throwOnLimitExceeded: typeof opts.throwOnLimitExceeded === 'boolean' ? opts.throwOnLimitExceeded : false\n };\n};\n\nmodule.exports = function (str, opts) {\n var options = normalizeParseOptions(opts);\n\n if (str === '' || str === null || typeof str === 'undefined') {\n return options.plainObjects ? { __proto__: null } : {};\n }\n\n var tempObj = typeof str === 'string' ? parseValues(str, options) : str;\n var obj = options.plainObjects ? { __proto__: null } : {};\n\n // Iterate over the keys and setup the new object\n\n var keys = Object.keys(tempObj);\n for (var i = 0; i < keys.length; ++i) {\n var key = keys[i];\n var newObj = parseKeys(key, tempObj[key], options, typeof str === 'string');\n obj = utils.merge(obj, newObj, options);\n }\n\n if (options.allowSparse === true) {\n return obj;\n }\n\n return utils.compact(obj);\n};\n","'use strict';\n\nvar stringify = require('./stringify');\nvar parse = require('./parse');\nvar formats = require('./formats');\n\nmodule.exports = {\n formats: formats,\n parse: parse,\n stringify: stringify\n};\n","// src/bindings.tsx\nimport React from \"react\";\nimport {\n matchResourceFromRoute,\n ResourceContext,\n QS_PARSE_DEPTH\n} from \"@refinedev/core\";\nimport { useCallback, useContext } from \"react\";\nimport qs from \"qs\";\nimport {\n useNavigate,\n useLocation,\n Link,\n matchPath,\n useParams\n} from \"react-router\";\n\n// src/convert-to-number-if-possible.ts\nvar convertToNumberIfPossible = (value) => {\n if (typeof value === \"undefined\") {\n return value;\n }\n const num = Number(value);\n if (`${num}` === value) {\n return num;\n }\n return value;\n};\n\n// src/bindings.tsx\nvar stringifyConfig = {\n addQueryPrefix: true,\n skipNulls: true,\n arrayFormat: \"indices\",\n encode: false,\n encodeValuesOnly: true\n};\nvar routerProvider = {\n go: () => {\n const { search: existingSearch, hash: existingHash } = useLocation();\n const navigate = useNavigate();\n const fn = useCallback(\n ({\n to,\n type,\n query,\n hash,\n options: { keepQuery, keepHash } = {}\n }) => {\n const urlQuery = {\n ...keepQuery && existingSearch && qs.parse(existingSearch, {\n ignoreQueryPrefix: true,\n depth: QS_PARSE_DEPTH\n }),\n ...query\n };\n if (urlQuery.to) {\n urlQuery.to = encodeURIComponent(`${urlQuery.to}`);\n }\n const hasUrlQuery = Object.keys(urlQuery).length > 0;\n const urlHash = `#${(hash || keepHash && existingHash || \"\").replace(\n /^#/,\n \"\"\n )}`;\n const hasUrlHash = urlHash.length > 1;\n const urlTo = to || \"\";\n const fullPath = `${urlTo}${hasUrlQuery ? qs.stringify(urlQuery, stringifyConfig) : \"\"}${hasUrlHash ? urlHash : \"\"}`;\n if (type === \"path\") {\n return fullPath;\n }\n navigate(fullPath, {\n replace: type === \"replace\"\n });\n return;\n },\n [existingHash, existingSearch, navigate]\n );\n return fn;\n },\n back: () => {\n const navigate = useNavigate();\n const fn = useCallback(() => {\n navigate(-1);\n }, [navigate]);\n return fn;\n },\n parse: () => {\n var _a;\n let params = useParams();\n const { pathname, search } = useLocation();\n const { resources } = useContext(ResourceContext);\n const { resource, action, matchedRoute } = React.useMemo(() => {\n return matchResourceFromRoute(pathname, resources);\n }, [resources, pathname]);\n if (Object.entries(params).length === 0 && matchedRoute) {\n params = ((_a = matchPath(matchedRoute, pathname)) == null ? void 0 : _a.params) || {};\n }\n const fn = useCallback(() => {\n const parsedSearch = qs.parse(search, {\n ignoreQueryPrefix: true,\n depth: QS_PARSE_DEPTH\n });\n const combinedParams = {\n ...params,\n ...parsedSearch\n };\n const response = {\n ...resource && { resource },\n ...action && { action },\n ...(params == null ? void 0 : params.id) && { id: decodeURIComponent(params.id) },\n // ...(params?.action && { action: params.action }), // lets see if there is a need for this\n pathname,\n params: {\n ...combinedParams,\n currentPage: convertToNumberIfPossible(\n combinedParams.currentPage\n ),\n pageSize: convertToNumberIfPossible(\n combinedParams.pageSize\n ),\n to: combinedParams.to ? decodeURIComponent(combinedParams.to) : void 0\n }\n };\n return response;\n }, [pathname, search, params, resource, action]);\n return fn;\n },\n Link: React.forwardRef(function RefineLink(props, ref) {\n return /* @__PURE__ */ React.createElement(Link, { to: props.to, ...props, ref });\n })\n};\n\n// src/navigate-to-resource.tsx\nimport { useResourceParams, useGetToPath } from \"@refinedev/core\";\nimport React2 from \"react\";\nimport { Navigate } from \"react-router\";\nvar NavigateToResource = ({\n resource: resourceProp,\n fallbackTo,\n meta\n}) => {\n const getToPath = useGetToPath();\n const { resource, resources } = useResourceParams({\n resource: resourceProp\n });\n const toResource = resource || resources.find((r) => r.list);\n if (toResource) {\n const path = getToPath({\n resource: toResource,\n action: \"list\",\n meta\n });\n if (path) {\n return /* @__PURE__ */ React2.createElement(Navigate, { to: path });\n }\n return null;\n }\n if (fallbackTo) {\n console.warn(`No resource is found. navigation to ${fallbackTo}.`);\n return /* @__PURE__ */ React2.createElement(Navigate, { to: fallbackTo });\n }\n console.warn(\n 'No resource and \"fallbackTo\" is found. No navigation will be made.'\n );\n return null;\n};\n\n// src/unsaved-changes-notifier.tsx\nimport React4 from \"react\";\nimport { useTranslate, useWarnAboutChange } from \"@refinedev/core\";\n\n// src/use-prompt-workaround.ts\nimport React3 from \"react\";\nimport { UNSAFE_NavigationContext as NavigationContext } from \"react-router\";\nfunction useConfirmExit(confirmExit, when = true) {\n const { navigator } = React3.useContext(NavigationContext);\n React3.useEffect(() => {\n if (!when) {\n return;\n }\n const go = navigator.go;\n const push = navigator.push;\n navigator.push = (...args) => {\n const result = confirmExit();\n if (result !== false) {\n push(...args);\n }\n };\n navigator.go = (...args) => {\n const result = confirmExit();\n if (result !== false) {\n go(...args);\n }\n };\n return () => {\n navigator.push = push;\n navigator.go = go;\n };\n }, [navigator, confirmExit, when]);\n}\nfunction usePrompt(message, when = true, onConfirm) {\n const warnWhenListener = React3.useCallback(\n (e) => {\n e.preventDefault();\n e.returnValue = message;\n return e.returnValue;\n },\n [message]\n );\n React3.useEffect(() => {\n if (when) {\n window.addEventListener(\"beforeunload\", warnWhenListener);\n }\n return () => {\n window.removeEventListener(\"beforeunload\", warnWhenListener);\n };\n }, [warnWhenListener, when]);\n const confirmExit = React3.useCallback(() => {\n const confirm = window.confirm(message);\n if (confirm && onConfirm) {\n onConfirm();\n }\n return confirm;\n }, [message]);\n useConfirmExit(confirmExit, when);\n}\n\n// src/unsaved-changes-notifier.tsx\nimport { useLocation as useLocation2 } from \"react-router\";\nvar UnsavedChangesNotifier = ({\n translationKey = \"warnWhenUnsavedChanges\",\n message = \"Are you sure you want to leave? You have unsaved changes.\"\n}) => {\n const translate = useTranslate();\n const { pathname } = useLocation2();\n const { warnWhen, setWarnWhen } = useWarnAboutChange();\n React4.useEffect(() => {\n return () => setWarnWhen == null ? void 0 : setWarnWhen(false);\n }, [pathname]);\n const warnMessage = React4.useMemo(() => {\n return translate(translationKey, message);\n }, [translationKey, message, translate]);\n usePrompt(warnMessage, warnWhen, () => {\n setWarnWhen == null ? void 0 : setWarnWhen(false);\n });\n return null;\n};\n\n// src/catch-all-navigate.tsx\nimport React5 from \"react\";\nimport { Navigate as Navigate2, useLocation as useLocation3 } from \"react-router\";\nvar CatchAllNavigate = ({ to }) => {\n const { pathname, search } = useLocation3();\n const queryValue = `${pathname}${search}`;\n const query = queryValue.length > 1 ? `?to=${encodeURIComponent(queryValue)}` : \"\";\n return /* @__PURE__ */ React5.createElement(Navigate2, { to: `${to}${query}` });\n};\n\n// src/document-title-handler.tsx\nimport {\n useParsed,\n useTranslate as useTranslate2,\n generateDefaultDocumentTitle,\n useUserFriendlyName\n} from \"@refinedev/core\";\nimport React6, { useLayoutEffect } from \"react\";\nimport { useLocation as useLocation4 } from \"react-router\";\nfunction DocumentTitleHandler({ handler }) {\n var _a;\n const location = useLocation4();\n const { action, id, params, pathname, resource } = useParsed();\n const translate = useTranslate2();\n const getUserFriendlyName = useUserFriendlyName();\n const identifier = (resource == null ? void 0 : resource.identifier) ?? (resource == null ? void 0 : resource.name);\n const preferredLabel = (_a = resource == null ? void 0 : resource.meta) == null ? void 0 : _a.label;\n const resourceName = preferredLabel ?? getUserFriendlyName(identifier, action === \"list\" ? \"plural\" : \"singular\");\n const populatedLabel = translate(\n `${resource == null ? void 0 : resource.name}.${resource == null ? void 0 : resource.name}`,\n resourceName\n );\n useLayoutEffect(() => {\n const autoGeneratedTitle = generateDefaultDocumentTitle(\n translate,\n resource,\n action,\n `${id}`,\n resourceName,\n getUserFriendlyName\n );\n if (handler) {\n document.title = handler({\n action,\n resource: {\n ...resource ?? {},\n meta: {\n ...resource == null ? void 0 : resource.meta,\n label: populatedLabel\n }\n },\n params,\n pathname,\n autoGeneratedTitle\n });\n } else {\n document.title = autoGeneratedTitle;\n }\n }, [location]);\n return /* @__PURE__ */ React6.createElement(React6.Fragment, null);\n}\n\n// src/use-document-title.ts\nimport { useTranslate as useTranslate3 } from \"@refinedev/core\";\nimport { useEffect } from \"react\";\nvar useDocumentTitle = (title) => {\n const translate = useTranslate3();\n useEffect(() => {\n if (!title)\n return;\n if (typeof title === \"string\") {\n document.title = translate(title);\n } else {\n document.title = translate(title.i18nKey);\n }\n }, [title]);\n return (title2) => {\n if (typeof title2 === \"string\") {\n document.title = translate(title2);\n } else {\n document.title = translate(title2.i18nKey);\n }\n };\n};\nexport {\n CatchAllNavigate,\n DocumentTitleHandler,\n NavigateToResource,\n UnsavedChangesNotifier,\n routerProvider as default,\n stringifyConfig,\n useDocumentTitle\n};\n//# sourceMappingURL=index.mjs.map","var P = Object.defineProperty;\nvar C = (r, e, t) => e in r ? P(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[e] = t;\nvar c = (r, e, t) => C(r, typeof e != \"symbol\" ? e + \"\" : e, t);\nimport { jsx as S } from \"react/jsx-runtime\";\nimport { createContext as O, useState as l, useEffect as d, useContext as f, useMemo as p } from \"react\";\nclass N {\n constructor() {\n c(this, \"factories\", /* @__PURE__ */ new Map());\n c(this, \"instances\", /* @__PURE__ */ new Map());\n }\n /**\n * Register a service factory.\n *\n * @param name — unique service name\n * @param factory — factory function (sync or async)\n */\n register(e, t) {\n this.factories.set(e, t), this.instances.delete(e);\n }\n /**\n * Get a service by name. Lazily instantiates on first call (singleton).\n *\n * @throws Error if service is not registered\n */\n async get(e) {\n if (this.instances.has(e))\n return this.instances.get(e);\n const t = this.factories.get(e);\n if (!t)\n throw new Error(`Service \"${e}\" is not registered`);\n const i = await Promise.resolve(t());\n return this.instances.set(e, i), i;\n }\n /**\n * Check if a service is registered.\n */\n has(e) {\n return this.factories.has(e);\n }\n /**\n * Get all registered service names.\n */\n getAll() {\n return Array.from(this.factories.keys());\n }\n /**\n * Clear all registered factories and cached instances.\n */\n clear() {\n this.factories.clear(), this.instances.clear();\n }\n}\nconst v = \"0.1.0\", w = {\n Sales: \"shopping-cart\",\n Inventory: \"package\",\n HR: \"users\",\n Finance: \"dollar-sign\",\n Core: \"settings\",\n Other: \"folder\"\n};\nfunction M() {\n const r = globalThis.__FRAMEWORK_M_PLUGIN_DEBUG__;\n if (typeof r == \"boolean\")\n return r;\n if (typeof r == \"string\")\n return [\"1\", \"true\", \"yes\", \"on\"].includes(r.toLowerCase());\n const e = globalThis.process;\n if (e != null && e.env) {\n const t = e.env.FRAMEWORK_M_PLUGIN_DEBUG;\n if (typeof t == \"string\")\n return [\"1\", \"true\", \"yes\", \"on\"].includes(t.toLowerCase());\n }\n return !1;\n}\nconst I = {\n debug(r, ...e) {\n M() && console.debug(`[PluginRegistry] ${r}`, ...e);\n }\n};\nclass R {\n constructor() {\n c(this, \"plugins\", /* @__PURE__ */ new Map());\n c(this, \"menuCache\", null);\n c(this, \"serviceContainer\", new N());\n c(this, \"routeOwners\", /* @__PURE__ */ new Map());\n c(this, \"menuNameOwners\", /* @__PURE__ */ new Map());\n c(this, \"menuRouteOwners\", /* @__PURE__ */ new Map());\n c(this, \"serviceOwners\", /* @__PURE__ */ new Map());\n c(this, \"diagnostics\", []);\n c(this, \"permissionChecker\", null);\n c(this, \"eventListeners\", {\n \"plugin:registered\": /* @__PURE__ */ new Set(),\n \"plugin:error\": /* @__PURE__ */ new Set()\n });\n }\n /**\n * Register a plugin with the registry.\n *\n * validates that the plugin has name and version, checks collisions,\n * stores it, registers any services into the ServiceContainer,\n * and invalidates the menu cache.\n *\n * @throws Error if plugin has no name or version\n */\n async register(e) {\n if (!e.name || !e.version)\n throw new Error(\"Plugin must have name and version\");\n const t = this.validateRegistration(e), i = t.filter((o) => o.severity === \"error\");\n if (i.length > 0) {\n const o = new Error(\n `Plugin \"${e.name}\" registration failed: ${i.map((a) => a.message).join(\"; \")}`\n );\n throw this.emit(\"plugin:error\", { plugin: e, error: o }), o;\n }\n const s = this.plugins.get(e.name);\n this.plugins.set(e.name, e), this.rebuildIndexesAndServices(), this.menuCache = null;\n try {\n e.onInit && await Promise.resolve(e.onInit());\n } catch (o) {\n throw s ? this.plugins.set(e.name, s) : this.plugins.delete(e.name), this.rebuildIndexesAndServices(), this.menuCache = null, this.emit(\"plugin:error\", { plugin: e, error: o }), o;\n }\n s != null && s.onDestroy && s !== e && await Promise.resolve(s.onDestroy()), this.emit(\"plugin:registered\", { plugin: e });\n const n = t.filter((o) => o.severity === \"warning\");\n n.length > 0 && I.debug(\n `Registered plugin \"${e.name}\" with warnings`,\n n\n );\n }\n /**\n * Get merged menu tree from all plugins.\n *\n * Collects all MenuItem entries, groups them by `module` (default: \"Other\"),\n * optionally sub-groups by `category`, and sorts by `order`.\n * Result is cached until a new plugin is registered.\n */\n getMenu() {\n if (this.menuCache) return this.menuCache;\n const e = [];\n for (const t of this.plugins.values())\n t.menu && e.push(...t.menu);\n return e.length === 0 ? (this.menuCache = [], this.menuCache) : (this.menuCache = this.mergeMenus(e), this.menuCache);\n }\n /**\n * Get aggregated routes from all plugins.\n */\n getRoutes() {\n const e = [];\n for (const t of this.plugins.values())\n t.routes && e.push(...t.routes);\n return e;\n }\n /**\n * Get a specific plugin by name.\n */\n getPlugin(e) {\n return this.plugins.get(e);\n }\n /**\n * Get all registered plugins.\n */\n getAllPlugins() {\n return Array.from(this.plugins.values());\n }\n /**\n * Get the service container for DI.\n */\n getServiceContainer() {\n return this.serviceContainer;\n }\n /**\n * Unregister a plugin by name and run cleanup lifecycle if provided.\n */\n async unregister(e) {\n const t = this.plugins.get(e);\n return t ? (this.plugins.delete(e), this.rebuildIndexesAndServices(), this.menuCache = null, t.onDestroy && await Promise.resolve(t.onDestroy()), !0) : !1;\n }\n /**\n * Resolve a service instance from the registry-level DI container.\n */\n async getService(e) {\n return this.serviceContainer.get(e);\n }\n /**\n * Aggregate all widgets contributed by registered plugins.\n */\n getWidgets() {\n const e = [];\n for (const t of this.plugins.values())\n t.widgets && e.push(...t.widgets);\n return e;\n }\n /**\n * Configure a permission checker used by consumer hooks.\n */\n setPermissionChecker(e) {\n this.permissionChecker = e;\n }\n /**\n * Get the configured permission checker.\n */\n getPermissionChecker() {\n return this.permissionChecker;\n }\n /**\n * Subscribe to plugin lifecycle events.\n */\n on(e, t) {\n return this.eventListeners[e].add(\n t\n ), () => {\n this.eventListeners[e].delete(\n t\n );\n };\n }\n /**\n * Get emitted diagnostics.\n */\n getDiagnostics(e) {\n return e ? this.diagnostics.filter((t) => t.severity === e) : [...this.diagnostics];\n }\n /**\n * Clear diagnostics.\n */\n clearDiagnostics() {\n this.diagnostics = [];\n }\n // -------------------------------------------------------------------------\n // Version Compatibility\n // -------------------------------------------------------------------------\n /**\n * Check compatibility of all registered plugins.\n *\n * Returns a report of all plugins with their compatibility status:\n * - SDK version compatibility\n * - Peer plugin dependency satisfaction\n */\n checkCompatibility() {\n const e = [];\n for (const t of this.plugins.values()) {\n const i = {\n name: t.name,\n version: t.version,\n sdkCompatible: !0,\n missingPeerPlugins: []\n };\n if (t.minSdkVersion && (i.sdkCompatible = this.checkSemverCompat(\n v,\n t.minSdkVersion\n )), t.peerPlugins)\n for (const s of t.peerPlugins)\n this.plugins.has(s) || i.missingPeerPlugins.push(s);\n e.push(i);\n }\n return e;\n }\n // -------------------------------------------------------------------------\n // Private helpers\n // -------------------------------------------------------------------------\n /**\n * Simple semver compatibility check.\n * Checks if `current` satisfies `>=required`.\n */\n checkSemverCompat(e, t) {\n const i = t.replace(/^>=?/, \"\"), [s, n = 0, o = 0] = e.split(\".\").map(Number), [a, u = 0, m = 0] = i.split(\".\").map(Number);\n return s !== a ? s > a : n !== u ? n > u : o >= m;\n }\n validateRegistration(e) {\n return [\n ...this.validateSdkCompatibility(e),\n ...this.validateDuplicatePlugin(e),\n ...this.validateRouteCollisions(e),\n ...this.validateMenuCollisions(e),\n ...this.validateServiceCollisions(e)\n ];\n }\n validateSdkCompatibility(e) {\n const t = [];\n return e.minSdkVersion && (this.checkSemverCompat(\n v,\n e.minSdkVersion\n ) || t.push(\n this.addDiagnostic({\n code: \"SDK_INCOMPATIBLE\",\n severity: \"warning\",\n message: `Plugin ${e.name} requires SDK >=${e.minSdkVersion}, current SDK is ${v}. Plugin may not work correctly.`,\n pluginName: e.name,\n key: e.minSdkVersion\n })\n )), t;\n }\n validateDuplicatePlugin(e) {\n const t = [];\n return this.plugins.has(e.name) && t.push(\n this.addDiagnostic({\n code: \"PLUGIN_DUPLICATE\",\n severity: \"warning\",\n message: `Plugin ${e.name} is already registered and will be replaced`,\n pluginName: e.name,\n conflictingPluginName: e.name,\n key: e.name\n })\n ), t;\n }\n validateRouteCollisions(e) {\n const t = [], i = /* @__PURE__ */ new Set();\n for (const s of e.routes ?? []) {\n if (i.has(s.path)) {\n t.push(\n this.addDiagnostic({\n code: \"ROUTE_COLLISION\",\n severity: \"error\",\n message: `Duplicate route path \"${s.path}\" inside plugin ${e.name}`,\n pluginName: e.name,\n conflictingPluginName: e.name,\n key: s.path\n })\n );\n continue;\n }\n i.add(s.path);\n const n = this.routeOwners.get(s.path);\n n && n !== e.name && t.push(\n this.addDiagnostic({\n code: \"ROUTE_COLLISION\",\n severity: \"error\",\n message: `Route path \"${s.path}\" from plugin ${e.name} conflicts with plugin ${n}`,\n pluginName: e.name,\n conflictingPluginName: n,\n key: s.path\n })\n );\n }\n return t;\n }\n validateMenuCollisions(e) {\n const t = [], i = /* @__PURE__ */ new Set(), s = /* @__PURE__ */ new Set();\n for (const n of e.menu ?? []) {\n if (i.has(n.name))\n t.push(\n this.addDiagnostic({\n code: \"MENU_NAME_COLLISION\",\n severity: \"error\",\n message: `Duplicate menu name \"${n.name}\" inside plugin ${e.name}`,\n pluginName: e.name,\n conflictingPluginName: e.name,\n key: n.name\n })\n );\n else {\n i.add(n.name);\n const o = this.menuNameOwners.get(n.name);\n o && o !== e.name && t.push(\n this.addDiagnostic({\n code: \"MENU_NAME_COLLISION\",\n severity: \"error\",\n message: `Menu name \"${n.name}\" from plugin ${e.name} conflicts with plugin ${o}`,\n pluginName: e.name,\n conflictingPluginName: o,\n key: n.name\n })\n );\n }\n if (s.has(n.route))\n t.push(\n this.addDiagnostic({\n code: \"MENU_ROUTE_COLLISION\",\n severity: \"error\",\n message: `Duplicate menu route \"${n.route}\" inside plugin ${e.name}`,\n pluginName: e.name,\n conflictingPluginName: e.name,\n key: n.route\n })\n );\n else {\n s.add(n.route);\n const o = this.menuRouteOwners.get(n.route);\n o && o !== e.name && t.push(\n this.addDiagnostic({\n code: \"MENU_ROUTE_COLLISION\",\n severity: \"error\",\n message: `Menu route \"${n.route}\" from plugin ${e.name} conflicts with plugin ${o}`,\n pluginName: e.name,\n conflictingPluginName: o,\n key: n.route\n })\n );\n }\n }\n return t;\n }\n validateServiceCollisions(e) {\n const t = [], i = /* @__PURE__ */ new Set();\n for (const s of Object.keys(e.services ?? {})) {\n if (i.has(s)) {\n t.push(\n this.addDiagnostic({\n code: \"SERVICE_COLLISION\",\n severity: \"error\",\n message: `Duplicate service \"${s}\" inside plugin ${e.name}`,\n pluginName: e.name,\n conflictingPluginName: e.name,\n key: s\n })\n );\n continue;\n }\n i.add(s);\n const n = this.serviceOwners.get(s);\n n && n !== e.name && t.push(\n this.addDiagnostic({\n code: \"SERVICE_COLLISION\",\n severity: \"error\",\n message: `Service \"${s}\" from plugin ${e.name} conflicts with plugin ${n}`,\n pluginName: e.name,\n conflictingPluginName: n,\n key: s\n })\n );\n }\n return t;\n }\n addDiagnostic(e) {\n const t = {\n ...e,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n };\n return this.diagnostics.push(t), t;\n }\n /**\n * Merge flat menu items into a grouped tree:\n * Module → (optional) Category → Items\n *\n * Items without a `module` are placed under \"Other\".\n */\n mergeMenus(e) {\n var i;\n const t = /* @__PURE__ */ new Map();\n for (const s of e) {\n const n = s.module || \"Other\";\n t.has(n) || t.set(n, {\n name: n.toLowerCase(),\n label: n,\n route: `/${n.toLowerCase()}`,\n icon: this.getModuleIcon(n),\n order: s.order,\n children: []\n });\n const o = t.get(n);\n if (s.order !== void 0 && (o.order === void 0 || s.order < o.order) && (o.order = s.order), s.category) {\n let a = (i = o.children) == null ? void 0 : i.find(\n (u) => u.label === s.category\n );\n a || (a = {\n name: s.category.toLowerCase(),\n label: s.category,\n route: `/${n.toLowerCase()}/${s.category.toLowerCase()}`,\n children: []\n }, o.children.push(a)), a.children.push(s);\n } else\n o.children.push(s);\n }\n return Array.from(t.values()).sort(\n (s, n) => (s.order ?? 999) - (n.order ?? 999)\n );\n }\n getModuleIcon(e) {\n return w[e] || w.Other;\n }\n rebuildIndexesAndServices() {\n this.routeOwners.clear(), this.menuNameOwners.clear(), this.menuRouteOwners.clear(), this.serviceOwners.clear(), this.serviceContainer.clear();\n for (const e of this.plugins.values())\n this.registerPluginServices(e), this.registerPluginRoutes(e), this.registerPluginMenuItems(e);\n }\n registerPluginServices(e) {\n for (const [t, i] of Object.entries(e.services ?? {}))\n this.serviceContainer.register(t, i), this.serviceOwners.set(t, e.name);\n }\n registerPluginRoutes(e) {\n for (const t of e.routes ?? [])\n this.routeOwners.set(t.path, e.name);\n }\n registerPluginMenuItems(e) {\n for (const t of e.menu ?? [])\n this.menuNameOwners.set(t.name, e.name), this.menuRouteOwners.set(t.route, e.name);\n }\n emit(e, t) {\n for (const i of this.eventListeners[e])\n i(t);\n }\n}\nconst h = O(null);\nfunction b({\n children: r,\n registry: e\n}) {\n const [t] = l(\n () => e ?? new R()\n ), [i, s] = l(!1);\n return d(() => {\n s(!0);\n }, []), i ? /* @__PURE__ */ S(h.Provider, { value: t, children: r }) : null;\n}\nasync function y(r, e) {\n const t = [];\n for (const i of r) {\n if (i.hidden || i.permissions && i.permissions.length > 0 && !await Promise.resolve(e(i.permissions)))\n continue;\n const s = i.children ? await y(i.children, e) : void 0;\n i.children && ((s == null ? void 0 : s.length) ?? 0) === 0 || t.push({ ...i, children: s });\n }\n return t;\n}\nfunction $() {\n const r = f(h), [e, t] = l([]);\n if (!r)\n throw new Error(\"usePluginMenu must be used within PluginRegistryProvider\");\n return d(() => {\n let i = !1;\n return (async () => {\n const n = r.getMenu(), o = r.getPermissionChecker();\n if (!o) {\n i || t(n.filter((u) => !u.hidden));\n return;\n }\n const a = await y(n, o);\n i || t(a);\n })(), () => {\n i = !0;\n };\n }, [r]), e;\n}\nfunction _(r) {\n const e = f(h);\n if (!e)\n throw new Error(\"usePlugin must be used within PluginRegistryProvider\");\n return p(() => e.getPlugin(r), [e, r]);\n}\nfunction A(r) {\n const e = f(h);\n if (!e)\n throw new Error(\"useService must be used within PluginRegistryProvider\");\n const [t, i] = l(null), [s, n] = l(!0), [o, a] = l(null), u = p(\n () => e.getService(r),\n [e, r]\n );\n return d(() => {\n let m = !1;\n return n(!0), a(null), u.then((g) => {\n m || (i(g), n(!1));\n }).catch((g) => {\n m || (a(g instanceof Error ? g : new Error(String(g))), n(!1));\n }), () => {\n m = !0;\n };\n }, [u]), { service: t, isLoading: s, error: o };\n}\nasync function k(r, e) {\n const t = [];\n for (const i of r)\n i.permissions && i.permissions.length > 0 && !await Promise.resolve(e(i.permissions)) || t.push(i);\n return t;\n}\nfunction U() {\n const r = f(h), [e, t] = l([]);\n if (!r)\n throw new Error(\"useWidgets must be used within PluginRegistryProvider\");\n return d(() => {\n let i = !1;\n return (async () => {\n const n = r.getWidgets(), o = r.getPermissionChecker();\n if (!o) {\n i || t(n);\n return;\n }\n const a = await k(n, o);\n i || t(a);\n })(), () => {\n i = !0;\n };\n }, [r]), e;\n}\nexport {\n R as PluginRegistry,\n h as PluginRegistryContext,\n b as PluginRegistryProvider,\n v as SDK_VERSION,\n N as ServiceContainer,\n _ as usePlugin,\n $ as usePluginMenu,\n A as useService,\n U as useWidgets\n};\n//# sourceMappingURL=index.js.map\n","/// <reference types=\"vite/client\" />\nimport i18n from \"i18next\";\nimport { initReactI18next } from \"react-i18next\";\nimport HttpBackend from \"i18next-http-backend\";\nimport LanguageDetector from \"i18next-browser-languagedetector\";\n\ni18n\n // Load translations from backend\n .use(HttpBackend)\n // Detect user language\n .use(LanguageDetector)\n // Pass i18n instance to react-i18next\n .use(initReactI18next)\n // Initialize i18next\n .init({\n // Fallback language if translation not found\n fallbackLng: \"en\",\n\n // Default namespace\n defaultNS: \"common\",\n\n // Debug mode (disable in production)\n debug: import.meta.env.DEV,\n\n // Language detection options\n detection: {\n // Order of detection methods\n order: [\"localStorage\", \"navigator\"],\n\n // Cache user language\n caches: [\"localStorage\"],\n\n // localStorage key\n lookupLocalStorage: \"i18nextLng\",\n },\n\n // Backend options for loading translations\n backend: {\n // Load translations from backend API (use relative URL for any port)\n loadPath: \"/api/v1/Translation?locale={{lng}}\",\n\n // Parse backend response\n parse: (data: string) => {\n try {\n const response = JSON.parse(data);\n\n // Transform Translation DocType list to i18next format\n // Backend returns: { items: [{ source_text, translated_text, locale, context }] }\n // i18next expects: { [key]: value }\n const translations: Record<string, string> = {};\n\n if (response.items && Array.isArray(response.items)) {\n for (const item of response.items) {\n // Use context as prefix if present (e.g., \"button.Save\")\n const key = item.context\n ? `${item.context}.${item.source_text}`\n : item.source_text;\n\n translations[key] = item.translated_text;\n }\n }\n\n return translations;\n } catch (error) {\n console.error(\"Failed to parse translations:\", error);\n return {};\n }\n },\n\n // Custom request function to add authentication\n request: (\n _options: unknown,\n url: string,\n _payload: unknown,\n callback: (\n error: Error | null,\n response: { status: number; data: string },\n ) => void,\n ) => {\n fetch(url, {\n headers: {\n \"Content-Type\": \"application/json\",\n // Add authorization header if user is logged in\n ...(localStorage.getItem(\"token\") && {\n Authorization: `Bearer ${localStorage.getItem(\"token\")}`,\n }),\n },\n })\n .then(response => {\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n return response.text();\n })\n .then(data => {\n callback(null, {\n status: 200,\n data,\n });\n })\n .catch(error => {\n console.error(\"Translation loading error:\", error);\n callback(error, {\n status: 500,\n data: \"{}\",\n });\n });\n },\n },\n\n // Interpolation options\n interpolation: {\n // React already escapes values\n escapeValue: false,\n },\n\n // React options\n react: {\n // Use React Suspense for async loading\n useSuspense: true,\n },\n });\n\nexport default i18n;\n","import React, { ReactNode, useState } from \"react\";\nimport { BrowserRouter, Routes, Route, Navigate, Outlet } from \"react-router\";\nimport { Refine, Authenticated } from \"@refinedev/core\";\nimport routerProvider from \"@refinedev/react-router\";\nimport { ShellProvider } from \"../../shell/ShellProvider\";\nimport { Layout } from \"./index\";\nimport { Sidebar } from \"./Sidebar/Sidebar\";\nimport { Navbar } from \"./Navbar/Navbar\";\nimport { createWebSocketRealtimeAdapter } from \"../../shell/realtime\";\nimport { FrameworkMPlugin } from \"@framework-m/plugin-sdk\";\nimport { authProvider } from \"../../auth\";\nimport { frameworkMDataProvider } from \"../../data\";\nimport { liveProvider } from \"../../live\";\nimport { LoginPage } from \"../../pages/LoginPage\";\nimport { ListView } from \"../../pages/ListView\";\nimport { FormView } from \"../../pages/FormView\";\nimport { PluginRegistry, PluginRegistryProvider } from \"@framework-m/plugin-sdk\";\nimport { ThemeProvider, MProvider } from \"@framework-m/ui\";\nimport { I18nextProvider } from \"react-i18next\";\nimport i18n from \"../../config/i18n\";\n\nexport interface FrameworkMShellProps {\n /** Application title for the Navbar */\n title: string;\n /** Primary content to render inside the main layout */\n children?: ReactNode;\n /** Optional plugins to initialize the shell with */\n initialPlugins?: FrameworkMPlugin[];\n /** Optional custom Sidebar component */\n sidebar?: ReactNode;\n /** Optional custom Navbar component */\n navbar?: ReactNode;\n /** Whether focus mode is enabled by default */\n defaultFocusMode?: boolean;\n /** Optional custom login page */\n loginPage?: ReactNode;\n}\n\n/**\n * ShellLayout\n * \n * Internal component to handle the authenticated layout structure.\n */\nconst ShellLayout: React.FC<{ \n title: string; \n sidebar?: ReactNode; \n navbar?: ReactNode;\n collapsed: boolean;\n onCollapse: (collapsed: boolean) => void;\n isMobile: boolean;\n mobileOpen: boolean;\n onCloseMobile: () => void;\n onMenuToggle: () => void;\n}> = ({ \n title, \n sidebar, \n navbar, \n collapsed, \n onCollapse,\n isMobile,\n mobileOpen,\n onCloseMobile,\n onMenuToggle\n}) => {\n return (\n <Layout \n sidebar={sidebar ?? (\n <Sidebar \n collapsed={collapsed} \n onCollapse={onCollapse} \n isMobile={isMobile}\n mobileOpen={mobileOpen}\n onCloseMobile={onCloseMobile}\n />\n )}\n navbar={navbar ?? (\n <Navbar \n title={title} \n onMenuToggle={onMenuToggle}\n />\n )}\n >\n <Outlet />\n </Layout>\n );\n};\n\n/**\n * FrameworkMShell\n * \n * The standard high-level container for Framework M applications.\n */\nexport const FrameworkMShell: React.FC<FrameworkMShellProps> = ({\n title,\n children,\n initialPlugins = [],\n sidebar,\n navbar,\n defaultFocusMode = false,\n loginPage,\n}) => {\n const [focusMode, setFocusMode] = useState(defaultFocusMode);\n const [collapsed, setCollapsed] = useState(false);\n const [isMobile, setIsMobile] = useState(\n globalThis.window?.innerWidth ? globalThis.window.innerWidth < 1024 : false,\n );\n const [mobileOpen, setMobileOpen] = useState(false);\n\n React.useEffect(() => {\n const onResize = () => {\n const mobile = window.innerWidth < 1024;\n setIsMobile(mobile);\n if (!mobile) setMobileOpen(false);\n };\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, []);\n\n const handleMenuToggle = React.useCallback(() => {\n setMobileOpen((prev) => !prev);\n }, []);\n\n const handleCloseMobile = React.useCallback(() => {\n setMobileOpen(false);\n }, []);\n \n // Initialize Plugin Registry\n const registry = React.useMemo(() => new PluginRegistry(), []);\n \n // Register initial plugins and set permission checker\n React.useEffect(() => {\n // Bridge permission checker to Refine authProvider\n const authzProvider = authProvider as {\n can?: (params: { resource: string; action: string }) => Promise<{ can?: boolean }>;\n };\n\n registry.setPermissionChecker(async (permissions) => {\n if (permissions.length === 0 || !authzProvider.can) {\n return true;\n }\n\n for (const permission of permissions) {\n const result = await authzProvider.can({\n resource: permission,\n action: \"read\",\n });\n if (!result?.can) {\n return false;\n }\n }\n\n return true;\n });\n\n for (const plugin of initialPlugins) {\n void registry.register(plugin);\n }\n }, [registry, initialPlugins]);\n\n // Memoize plugin routes to prevent router remounting on layout state changes\n const pluginRoutes = React.useMemo(() => {\n return initialPlugins.map(plugin => \n (plugin.routes || []).map(route => {\n const LazyComponent = typeof route.element === 'function' && !((route.element as any).$$typeof) \n ? React.lazy(route.element as any) \n : null;\n \n const element = LazyComponent \n ? <LazyComponent /> \n : (typeof route.element === 'function' ? (route.element as any)() : route.element);\n \n return (\n <Route \n key={`${plugin.name}-${route.path}`} \n path={route.path.startsWith('/') ? route.path : `/${route.path}`} \n element={element} \n />\n );\n })\n );\n }, [initialPlugins]);\n\n // Using location.host for standard dev/prod behavior\n const wsUrl = `ws://${globalThis.location?.host}/api/v1/stream`;\n\n return (\n <BrowserRouter>\n <I18nextProvider i18n={i18n}>\n <PluginRegistryProvider registry={registry}>\n <ThemeProvider>\n <MProvider>\n <React.Suspense fallback={<div>Loading...</div>}>\n <ShellProvider \n realtimeAdapter={createWebSocketRealtimeAdapter(wsUrl)}\n initialPlugins={initialPlugins}\n focusMode={focusMode}\n setFocusMode={setFocusMode}\n >\n <Refine\n dataProvider={frameworkMDataProvider}\n authProvider={authProvider}\n routerProvider={routerProvider}\n liveProvider={liveProvider}\n options={{\n syncWithLocation: true,\n warnWhenUnsavedChanges: true,\n }}\n >\n <Routes>\n {/* Public Routes */}\n <Route path=\"/login\" element={loginPage ?? <LoginPage title={title} />} />\n\n {/* Authenticated Application Routes */}\n <Route\n element={\n <Authenticated key=\"authenticated-routes\" fallback={<Navigate to=\"/login\" />}>\n <ShellLayout \n title={title} \n sidebar={sidebar} \n navbar={navbar} \n collapsed={collapsed}\n onCollapse={setCollapsed}\n isMobile={isMobile}\n mobileOpen={mobileOpen}\n onCloseMobile={handleCloseMobile}\n onMenuToggle={handleMenuToggle}\n />\n </Authenticated>\n }\n >\n <Route index element={<Navigate to=\"/app/dashboard\" />} />\n \n {/* Plugin Routes */}\n {pluginRoutes}\n\n <Route path=\"/app\">\n <Route index element={<Navigate to=\"/app/dashboard\" />} />\n <Route path=\"dashboard\" element={children} />\n \n {/* Generic DocType Routes */}\n <Route path=\":doctype\">\n <Route index element={<Navigate to=\"list\" />} />\n <Route path=\"list\" element={<ListView />} />\n <Route path=\"kanban\" element={<ListView view=\"kanban\" />} />\n <Route path=\"tree\" element={<ListView view=\"tree\" />} />\n <Route path=\"new\" element={<FormView />} />\n <Route path=\"detail/:id\" element={<FormView />} />\n <Route path=\"edit/:id\" element={<FormView />} />\n </Route>\n </Route>\n </Route>\n\n {/* Fallback */}\n <Route path=\"*\" element={<Navigate to=\"/\" />} />\n </Routes>\n </Refine>\n </ShellProvider>\n </React.Suspense>\n </MProvider>\n </ThemeProvider>\n </PluginRegistryProvider>\n </I18nextProvider>\n </BrowserRouter>\n );\n};\n"],"names":["API_URL","_a","META_URL","WS_URL","FrameworkApiError","message","status","code","details","__publicField","buildActionPermissionMessage","action","resource","backendMessage","normalizedResource","base","buildPaginationParams","pagination","params","current","pageSize","buildSortingParams","sorters","sorter","order","filterValueToString","value","buildFilterParams","filters","filter","op","valueStr","buildQueryString","searchParams","key","fetchWithCredentials","url","options","context","response","payload","frameworkMDataProvider","query","queryString","id","variables","ids","method","headers","fullUrl","authProvider","email","password","error","user","identityId","identityName","identityEmail","connections","subscriptions","getConnection","channel","ws","wsUrl","event","data","callbacks","callback","err","maybeCloseConnection","liveProvider","types","channelName","filteredCallback","unsubscribeFn","type","apiUrl","closeAllConnections","normalizeArrayItems","props","rawItem","fallbackIndex","item","index","content","isValidElement","targetIndex","handler","FieldTemplate","label","required","description","errors","children","hidden","displayLabel","uiSchema","formData","floatingLabel","hasValue","jsxs","jsx","ObjectFieldTemplate","title","properties","prop","ArrayFieldTemplate","canAdd","onAddClick","extendedProps","detailIndex","setDetailIndex","useState","dragIndex","setDragIndex","pasteText","setPasteText","pasteError","setPasteError","items","useMemo","rawFormData","rows","replaceArray","arrayFieldName","_b","parsed","BaseInputTemplate","disabled","readonly","onChange","onBlur","onFocus","placeholder","e","TextWidget","CheckboxWidget","SelectWidget","enumOptions","opt","DateWidget","TextareaWidget","customWidgets","customTemplates","replaceArrayFieldInData","source","fieldName","root","normalizeNullablePropertySchema","property","normalized","typeValue","nonNullTypes","t","anyOfValue","nonNullSchemas","nonNullSchema","merged","normalizeNullableObjectSchema","schema","normalizedProperties","AutoForm","onSubmit","onError","hideSubmitButton","submitText","className","normalizedSchema","handleChange","handleSubmit","formContext","formProps","validator","Form","useDebounce","delay","debouncedValue","setDebouncedValue","useEffect","timer","LinkWidget","linkedDoctype","inputValue","setInputValue","searchResults","setSearchResults","isOpen","setIsOpen","isLoading","setIsLoading","debouncedSearch","fetchOptions","useCallback","search","handleSelect","option","handleInputChange","newValue","generateColumnsFromSchema","columns","getValue","AutoTable","customColumns","enableSelection","onSelectionChange","onRowClick","sorting","setSorting","rowSelection","setRowSelection","setPagination","result","useList","tableData","totalCount","queryError","focusCell","rowIndex","colIndex","tableElement","selector","target","handleCellKeyDown","columnsWithSelection","table","row","useReactTable","r","updater","newSelection","selectedIds","selectedRows","rowId","getCoreRowModel","getSortedRowModel","getPaginationRowModel","headerGroup","header","flexRender","cell","EditableCell","field","onSaveSuccess","renderValue","isEditing","setIsEditing","editValue","setEditValue","setError","inputRef","useRef","updateMutation","useUpdate","handleClick","handleCancel","handleBlur","handleKeyDown","isSaving","ConfirmDialog","open","confirmLabel","cancelLabel","destructive","onConfirm","onCancel","titleId","styles","AlertBanner","variant","onDismiss","palette","Fragment","commonStyle","BulkActionsBar","selectedCount","onDelete","onExportJson","onExportCsv","onBulkUpdate","updateFields","onClear","showUpdateMenu","setShowUpdateMenu","selectedField","setSelectedField","updateValue","setUpdateValue","isDeleteConfirmOpen","setIsDeleteConfirmOpen","handleUpdate","handleDelete","buttonStyle","f","_c","o","STATE_COLORS","getStateColor","state","normalizedState","StateBadge","docstatus","style","displayState","colors","fetchWorkflowActions","doctype","executeTransition","useWorkflowActions","queryClient","useQueryClient","isExecuting","setIsExecuting","enabled","refetch","useQuery","executeAction","actionName","ACTION_COLORS","getActionColor","WorkflowActions","showState","onActionComplete","actions","handleAction","allowedActions","a","registry","getSlotComponents","slotName","slots","s","getResources","Slot","name","slotRegistrations","registration","Component","BUILTIN_COMMANDS","CommandPalette","onClose","setQuery","selectedIndex","setSelectedIndex","doctypes","setDoctypes","go","useGo","fetchDoctypes","dt","documentItems","doc","d","newCommands","searchTerm","filteredItems","lowerQuery","cmd","executeCommand","i","idx","Menu","logout","useLogout","menuItems","useMenu","NavLink","Breadcrumb","breadcrumbs","useBreadcrumb","breadcrumb","Link","Layout","sidebar","navbar","fetchDocTypeMeta","useDocTypeMeta","meta","usePrefetchDocTypeMeta","useDocTypes","setDocTypes","fetchDocTypes","resources","useInlineEdit","editingCell","setEditingCell","startEdit","cancelEdit","saveEdit","resolve","reject","errorMsg","useBulkActions","onSuccess","setSelectedIds","deleteMutation","useDeleteMany","useUpdateMany","selectedItems","isAllSelected","isSomeSelected","selectRow","prev","deselectRow","next","toggleRow","selectAll","deselectAll","toggleAll","isSelected","bulkDelete","bulkUpdate","values","exportAsJson","blob","exportAsCsv","fields","val","str","csv","useCommandPalette","close","toggle","useTranslation","namespace","i18n","ready","useI18nTranslation","lng","uiMetaCache","resolveMetaBaseUrl","baseUrl","trimmed","useUIMeta","uiContext","cacheKey","uiMeta","setUiMeta","fetchMeta","viewRegistry","doctypeViews","registerView","getViewComponent","getRegisteredViews","getViewRegistration","setDocTypeViews","views","getDocTypeViews","isViewAvailable","viewType","QuickEditModal","titleField","descField","groupField","onSaved","setTitle","desc","setDesc","setStatus","saving","setSaving","updateItem","handleSave","col","KanbanView","config","dragState","setDragState","dragOverColumn","setDragOverColumn","editingItem","setEditingItem","seen","discovered","COLUMN_COLORS","groupedItems","groups","first","handleDrop","targetColumnId","j","column","isOver","isDragging","getDaysInMonth","year","month","days","date","CalendarView","startField","currentDate","setCurrentDate","startOfMonth","endOfMonth","eventsByDay","dateStr","prevMonth","nextMonth","today","monthName","weekDays","firstDayOffset","btnStyle","day","_","events","isToday","getDateRange","tasks","endField","minDate","maxDate","task","start","end","getDaysBetween","GanttView","nameField","progressField","totalDays","dayHeaders","rowHeight","dayWidth","taskStart","taskEnd","startOffset","duration","progress","BASE_URL","__vite_import_meta_env__","fetchTree","res","reparentNode","nodeId","newParent","updateNode","addChildNode","parentId","InlineInput","initialValue","setValue","ref","TreeNodeRow","node","depth","onRefresh","dragNodeId","onDragStart","onDrop","collapsed","setCollapsed","renaming","setRenaming","addingChild","setAddingChild","isDropTarget","setIsDropTarget","handleRename","newLabel","handleAddChild","hasChildren","toggleGlyph","c","child","TreeView","setState","setDragNodeId","addingRoot","setAddingRoot","load","tree","targetId","handleAddRoot","isDebugEnabled","globalFlag","processRef","envFlag","configLogger","configStore","clientScripts","registerConfig","existing","mergeConfigs","override","mergeFormConfigs","mergeListConfigs","getConfig","getFormConfig","getListConfig","getFieldConfig","registerClientScript","script","getClientScripts","loadConfigFromUrl","clearConfigs","useConfig","useFormConfig","useListConfig","useFieldConfig","WorkspaceSection","workspace","isExpanded","setIsExpanded","handleItemClick","toSchemaFields","getStringEnums","v","isSelectOrLinkField","format","rawFieldType","fieldType","pickFirst","ListView","propDoctype","propView","useParams","navigate","useNavigate","location","useLocation","identity","useGetIdentity","isAuthenticated","metaLoading","metaError","searchQuery","setSearchQuery","uiError","setUiError","setSelectedRows","schemaFields","pathView","detectedParentField","fromMeta","detectedLabelField","groupFieldCandidates","metaKanban","kanbanGroupField","kanbanColumns","kanbanTitleField","kanbanDescriptionField","canKanban","canTree","activeView","requested","setActiveView","view","isMobile","setIsMobile","onResize","handleRowClick","handleNew","invalidate","useInvalidate","handleBulkDelete","confirmBulkDelete","FormView","propId","useApiUrl","getApiOrigin","rawApiUrl","existingDoc","useOne","docError","createMutation","useCreate","workflowState","setFormData","setErrors","notices","setNotices","printFormatName","setPrintFormatName","addError","addNotice","dismissNotice","scripts","validateScripts","afterScripts","openPrintPreview","downloadPrintPdf","downloadUrl","anchor","docNameValue","displayName","submitLabel","notice","OAUTH_PROVIDERS","resolveConfiguredProviders","rawProviders","provider","LoginPage","logo","redirectTo","login","useLogin","configuredProviders","YStack","Card","Heading","Paragraph","Button","XStack","Input","getAuthConfig","ShellContext","createContext","upsertSection","incoming","removeSectionById","sectionId","removeProvider","removeRoomSubscriber","room","listener","clone","localRealtimeAdapter","onMessage","ShellProvider","focusMode","setFocusMode","realtimeAdapter","initialPlugins","sections","setSections","searchProviders","setSearchProviders","realtimeAdapterRef","disconnectAdapterRef","roomSubscribersRef","dispatchRealtimeMessage","currentSubscribers","roomListeners","wildcardListeners","listeners","registerSection","section","cleanupSection","getSections","slot","b","registerOmniSearchProvider","cleanupProvider","searchOmni","resolved","providerResults","setRealtimeAdapter","adapter","nextAdapter","maybeDisconnect","subscribeRealtime","cleanupRealtime","publishRealtime","cleanups","resp","moduleName","cleanup","plugin","createWebSocketRealtimeAdapter","socket","handleMessage","useShell","useContext","resolveKey","route","normalizeMenuItem","selectedKey","Sidebar","onCollapse","mobileOpen","onCloseMobile","shell","setSearch","favorites","setFavorites","collapsedGroups","setCollapsedGroups","recent","setRecent","segments","appIndex","menuSections","storedRecent","currentItem","favoritesList","recentList","filteredPluginMenu","lowerSearch","toggleFavorite","toggleGroup","navigateTo","SidebarItem","group","navItem","onNavigate","favoriteAction","isFavorite","AVATAR_COLORS","avatarColorFor","hash","mergeCollaboratorPresence","previous","incomingId","incomingName","incomingAvatar","phase","currentIndex","keepRecentCollaborators","collaborators","now","splitPath","pathname","getAppSegments","normalizeLabel","word","rest","getShellRouteInfo","appSegments","mode","documentId","Navbar","showSearch","onMenuToggle","logoutStatus","theme","toggleTheme","useTheme","language","changeLanguage","routeInfo","leftSections","rightSections","setCollaborators","unreadNotifications","setUnreadNotifications","showUserMenu","setShowUserMenu","handleSearch","omniResults","handleLogout","isLoggingOut","isGuestIdentity","roomId","selfId","selfName","selfAvatar","publishPresence","unsubscribe","heartbeatTimer","quickAdd","isLast","LocaleSwitcher","collaborator","initials","part","ZStack","__viteBrowserExternal","hasMap","mapSizeDescriptor","mapSize","mapForEach","hasSet","setSizeDescriptor","setSize","setForEach","hasWeakMap","weakMapHas","hasWeakSet","weakSetHas","hasWeakRef","weakRefDeref","booleanValueOf","objectToString","functionToString","$match","$slice","$replace","$toUpperCase","$toLowerCase","$test","$concat","$join","$arrSlice","$floor","bigIntValueOf","gOPS","symToString","hasShammedSymbols","toStringTag","isEnumerable","gPO","addNumericSeparator","num","sepRegex","int","intStr","dec","utilInspect","require$$0","inspectCustom","inspectSymbol","isSymbol","quotes","quoteREs","objectInspect","inspect_","obj","opts","has","customInspect","numericSeparator","inspectString","bigIntStr","maxDepth","isArray","indent","getIndent","indexOf","inspect","from","noIndent","newOpts","isRegExp","nameOf","keys","arrObjKeys","symString","markBoxed","isElement","attrs","wrapQuotes","quote","xs","singleLineValues","indentedJoin","isError","parts","isMap","mapParts","collectionOf","isSet","setParts","isWeakMap","weakCollectionOf","isWeakSet","isWeakRef","isNumber","isBigInt","isBoolean","isString","global","isDate","ys","isPlainObject","protoTag","stringTag","toStr","constructorTag","tag","defaultStyle","quoteChar","canTrustToString","hasOwn","m","x","l","remaining","trailer","quoteRE","lowbyte","n","size","entries","joinedEntries","baseIndent","lineJoiner","isArr","syms","symMap","k","$TypeError","require$$1","listGetNode","list","isDelete","curr","listGet","objects","listSet","listHas","listDelete","sideChannelList","$o","deletedNode","esObjectAtoms","esErrors","_eval","range","syntax","uri","abs","floor","max","min","pow","round","_isNaN","$isNaN","sign","number","gOPD","$gOPD","gopd","$defineProperty","esDefineProperty","shams","sym","symObj","symVal","descriptor","origSymbol","hasSymbolSham","hasSymbols","Reflect_getPrototypeOf","$Object","Object_getPrototypeOf","ERROR_MESSAGE","funcType","concatty","arr","slicy","arrLike","offset","joiny","joiner","implementation","that","args","bound","binder","boundLength","boundArgs","Empty","functionBind","functionCall","functionApply","reflectApply","bind","$apply","$call","require$$2","$reflectApply","require$$3","actualApply","$actualApply","callBindApplyHelpers","callBind","hasProtoAccessor","$getPrototypeOf","get","reflectGetProto","originalGetProto","getDunderProto","getProto","O","call","$hasOwn","hasown","undefined","$Error","$EvalError","$RangeError","$ReferenceError","require$$4","$SyntaxError","require$$5","require$$6","$URIError","require$$7","require$$8","require$$9","require$$10","require$$11","require$$12","require$$13","require$$14","$Function","getEvalledConstructor","expressionSyntax","require$$15","require$$16","throwTypeError","ThrowTypeError","require$$17","require$$18","$ObjectGPO","require$$19","$ReflectGPO","require$$20","require$$21","require$$22","needsEval","TypedArray","INTRINSICS","errorProto","doEval","fn","gen","LEGACY_ALIASES","require$$23","require$$24","$spliceApply","$strSlice","$exec","rePropName","reEscapeChar","stringToPath","string","last","match","subString","getBaseIntrinsic","allowMissing","intrinsicName","alias","getIntrinsic","intrinsicBaseName","intrinsic","intrinsicRealName","skipFurtherCaching","isOwn","GetIntrinsic","callBindBasic","$indexOf","callBound","$Map","$mapGet","$mapSet","$mapHas","$mapDelete","$mapSize","sideChannelMap","$m","getSideChannelMap","$WeakMap","$weakMapGet","$weakMapSet","$weakMapHas","$weakMapDelete","sideChannelWeakmap","$wm","getSideChannelList","getSideChannelWeakMap","makeChannel","sideChannel","$channelData","replace","percentTwenties","Format","formats","getSideChannel","overflowChannel","markOverflow","maxIndex","isOverflow","getMaxIndex","setMaxIndex","hexTable","array","compactQueue","queue","compacted","arrayToObject","merge","nextIndex","newIndex","sourceKeys","oldKey","combined","mergeTarget","targetItem","acc","keyNum","assign","decode","defaultDecoder","charset","strWithoutPlus","limit","encode","defaultEncoder","kind","$0","out","segment","compact","refs","isBuffer","combine","arrayLimit","plainObjects","maybeMap","mapped","utils","arrayPrefixGenerators","prefix","push","pushToArray","valueOrArray","toISO","defaultFormat","defaults","isNonNullishPrimitive","sentinel","stringify","object","generateArrayPrefix","commaRoundTrip","allowEmptyArrays","strictNullHandling","skipNulls","encodeDotInKeys","encoder","sort","allowDots","serializeDate","formatter","encodeValuesOnly","tmpSc","step","findFlag","pos","keyValue","objKeys","encodedPrefix","adjustedPrefix","encodedKey","keyPrefix","valueSideChannel","normalizeStringifyOptions","arrayFormat","stringify_1","joined","interpretNumericEntities","numberStr","parseArrayValue","currentArrayLength","isoSentinel","charsetSentinel","parseValues","cleanStr","skipIndex","bracketEqualsPos","encodedVal","parseObject","chain","valuesParsed","parentKey","leaf","cleanRoot","decodedRoot","isValidArrayIndex","splitKeyIntoSegments","givenKey","brackets","parent","segmentContent","parseKeys","normalizeParseOptions","duplicates","parse","tempObj","newObj","lib","convertToNumberIfPossible","stringifyConfig","routerProvider","existingSearch","existingHash","to","keepQuery","keepHash","urlQuery","qs","QS_PARSE_DEPTH","hasUrlQuery","urlHash","hasUrlHash","fullPath","ResourceContext","matchedRoute","React","matchResourceFromRoute","matchPath","parsedSearch","combinedParams","P","C","N","w","M","I","R","u","h","S","HttpBackend","LanguageDetector","initReactI18next","translations","_options","_payload","ShellLayout","Outlet","FrameworkMShell","defaultFocusMode","loginPage","setMobileOpen","mobile","handleMenuToggle","handleCloseMobile","PluginRegistry","authzProvider","permissions","permission","pluginRoutes","LazyComponent","element","Route","BrowserRouter","I18nextProvider","PluginRegistryProvider","ThemeProvider","MProvider","Refine","Routes","Authenticated","Navigate"],"mappings":"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","x_google_ignoreList":[46,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92]}