@unciatech/file-manager 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../index.ts","../hooks/use-file-handlers.ts","../types/file-manager.ts","../hooks/use-file-state.ts","../context/file-manager-context.tsx","../lib/utils.ts","../components/ui/pagination.tsx","../components/ui/button.tsx","../components/icons/chevron-right.tsx","../components/icons/chevron-left.tsx","../components/layout/footer.tsx","../components/layout/header.tsx","../components/modals/upload-modal.tsx","../components/ui/dialog.tsx","../components/ui/alert.tsx","../components/ui/tooltip.tsx","../lib/file-size.ts","../hooks/use-file-upload.ts","../lib/file-utils.tsx","../components/icons/pdf.tsx","../components/icons/excel.tsx","../components/icons/ppt.tsx","../components/icons/doc.tsx","../components/icons/text.tsx","../components/icons/file.tsx","../components/icons/zip.tsx","../components/icons/json.tsx","../components/icons/music.tsx","../components/icons/rar.tsx","../components/icons/exe.tsx","../components/icons/image.tsx","../components/icons/video.tsx","../components/icons/folder-with-files.tsx","../components/icons/empty-folder.tsx","../components/icons/folder.tsx","../components/icons/home.tsx","../components/icons/search.tsx","../components/icons/move.tsx","../components/icons/upload-file.tsx","../components/icons/upload-folder.tsx","../components/icons/plus.tsx","../components/icons/trash.tsx","../components/icons/cross.tsx","../components/icons/download.tsx","../components/icons/link.tsx","../components/icons/fullscreen.tsx","../components/icons/upload-cloud.tsx","../components/cards/image-card.tsx","../components/cards/video-card.tsx","../components/cards/audio-card.tsx","../components/cards/document-card.tsx","../components/cards/default-card.tsx","../components/grid/file-component-registry.tsx","../components/ui/kbd.tsx","../components/modals/create-folder.tsx","../components/ui/input.tsx","../components/modals/move-modal.tsx","../lib/truncate-name.ts","../hooks/use-intersection-observer.ts","../components/modals/image-modal.tsx","../components/ui/scroll-area.tsx","../components/file-details/details-layout.tsx","../components/file-details/file-action-buttons.tsx","../components/icons/check.tsx","../components/ui/textarea.tsx","../components/ui/label.tsx","../lib/format-utils.ts","../components/ui/field.tsx","../components/ui/separator.tsx","../components/ui/input-group.tsx","../components/modals/video-modal.tsx","../components/modals/audio-modal.tsx","../components/modals/file-modal.tsx","../components/layout/overlays.tsx","../components/file-manager-root.tsx","../components/layout/bulk-actions-bar.tsx","../components/ui/skeleton.tsx","../components/layout/header-navigation.tsx","../components/layout/header-actions-responsive.tsx","../components/ui/dropdown-menu.tsx","../components/modals/search-modal.tsx","../components/ui/command.tsx","../hooks/use-debounced-value.ts","../components/ui/checkbox.tsx","../components/layout/header-actions.tsx","../components/cards/file-card.tsx","../components/cards/card-context-menu.tsx","../components/ui/context-menu.tsx","../components/icons/edit.tsx","../components/icons/select.tsx","../components/cards/folder-card.tsx","../components/grid/unified-grid.tsx","../components/error-boundary.tsx","../components/keyboard-shortcuts.tsx","../components/file-manager.tsx","../components/file-manager-modal.tsx","../data/data.ts","../providers/mock-provider.ts"],"sourcesContent":["// Main components\nexport { FileManager } from './components/file-manager';\nexport { FileManagerModal } from './components/file-manager-modal';\n\n// Types\nexport type {\n FileManagerPageProps,\n FileManagerModalProps,\n FileMetaData,\n Folder,\n FileType,\n ViewMode,\n SelectionMode,\n} from './types/file-manager';\n\n// Provider (if needed for advanced use cases)\nexport { FileManagerProvider, useFileManager } from './context/file-manager-context';\n\n// Providers\nexport { MockProvider } from './providers/mock-provider';\nexport type { IFileManagerProvider } from './types/provider';\n","\"use client\";\n\nimport { useCallback, MouseEvent } from \"react\";\nimport { FileState } from \"./use-file-state\";\nimport { FileMetaData, Folder, FolderId, MODE } from \"@/types/file-manager\";\nimport { FileUploadInput } from \"@/types/provider\";\nimport { useRouter } from \"next/navigation\";\nimport { toast } from \"sonner\";\n\n/**\n * Helper function to toggle files in the selection\n * @param prev - Previous selection array\n * @param filesToToggle - Files to toggle\n * @returns Updated selection array\n */\nconst toggleFilesInSelection = (\n prev: FileMetaData[],\n filesToToggle: FileMetaData[]\n): FileMetaData[] => {\n let updated = [...prev];\n filesToToggle.forEach((file) => {\n const isSelected = updated.some((f) => f.id === file.id);\n if (isSelected) {\n updated = updated.filter((f) => f.id !== file.id);\n } else {\n updated.push(file);\n }\n });\n return updated;\n};\n\n/**\n * Helper function to toggle folders in the selection\n * @param prev - Previous selection array\n * @param foldersToToggle - Folders to toggle\n * @returns Updated selection array\n */\nconst toggleFoldersInSelection = (\n prev: Folder[],\n foldersToToggle: Folder[]\n): Folder[] => {\n let updated = [...prev];\n foldersToToggle.forEach((folder) => {\n const isSelected = updated.some((f) => f.id === folder.id);\n if (isSelected) {\n updated = updated.filter((f) => f.id !== folder.id);\n } else {\n updated.push(folder);\n }\n });\n return updated;\n};\n\nexport function useFileHandlers(state: FileState) {\n const {\n mode,\n selectionMode,\n files,\n folders,\n selectedFiles,\n selectedFolders,\n currentFolder,\n setSelectedFiles,\n setSelectedFolders,\n setCurrentFolder,\n setFiles,\n setFolders,\n setPagination,\n loadData,\n isInSelectionMode,\n provider,\n onFilesSelected,\n onClose,\n basePath,\n setIsLoading,\n setFileDetailsModalFile,\n } = state;\n\n const router = useRouter();\n\n\n /**\n * Handles file click events\n * In modal mode: Selects the file and triggers callback\n * In page mode: Opens preview/details (placeholder)\n * \n * @param file - The file that was clicked\n */\n /**\n * Handles file click/selection events\n * - Checkbox click or Ctrl/Cmd+click: Toggles file in selection\n * - Modal mode: Selects file and returns (single), or toggles (multiple)\n * - Page mode: Opens preview/details\n * \n * @param file - The file that was clicked\n * @param event - Mouse event for detecting modifier keys\n * @param isCheckboxClick - Whether this was explicitly a selection action (checkbox)\n */\n const handleFileClick = useCallback(\n (file: FileMetaData, event?: MouseEvent, isCheckboxClick = false) => {\n const fileArray = [file];\n\n // 1. Explicit Selection Action (Checkbox or Ctrl/Cmd + Click)\n const isExplicitSelection = isCheckboxClick || (event && (event.metaKey || event.ctrlKey));\n\n if (isExplicitSelection) {\n setSelectedFiles((prev) => toggleFilesInSelection(prev, fileArray));\n return;\n }\n\n // 2. Already in Selection Mode -> Toggle behavior\n if (isInSelectionMode() && mode !== MODE.MODAL) {\n // In modal, we might want simple click to select, but for now consistent with page behavior:\n // If \"Selecting...\", click toggles. \n setSelectedFiles((prev) => toggleFilesInSelection(prev, fileArray));\n return;\n }\n\n // 3. Modal Mode specific handling\n if (mode === MODE.MODAL) {\n if (selectionMode === \"single\") {\n setSelectedFiles([file]);\n onFilesSelected?.([file]);\n onClose?.();\n } else {\n // In multiple mode, regular click toggles\n setSelectedFiles((prev) => toggleFilesInSelection(prev, fileArray));\n }\n return;\n }\n\n // 4. Page Mode Regular Click -> Open Details Modal\n setFileDetailsModalFile(file);\n },\n [mode, selectionMode, isInSelectionMode, setSelectedFiles, onFilesSelected, onClose, setFileDetailsModalFile]\n );\n\n\n\n /**\n * Handles folder click/navigation events\n * - Checkbox click or Ctrl/Cmd+click: Toggles folder in selection\n * - Regular click: Navigates to the folder (clearing selections)\n * \n * @param folder - The folder object, or null for Root\n * @param event - Mouse event for detecting modifier keys\n * @param isCheckboxClick - Whether this was explicitly a selection action\n */\n const handleFolderClick = useCallback(\n (folder: Folder | null, event?: MouseEvent, isCheckboxClick = false) => {\n const folderId = folder ? folder.id : null;\n\n // 1. Explicit Selection Action (Checkbox or Ctrl/Cmd + Click)\n // Note: Root (null) cannot be selected\n const isExplicitSelection = isCheckboxClick || (event && (event.metaKey || event.ctrlKey));\n \n if (isExplicitSelection && folder) {\n setSelectedFolders((prev) => toggleFoldersInSelection(prev, [folder]));\n return;\n }\n\n // 2. Already in Selection Mode -> Toggle (if not root)\n if (isInSelectionMode() && folder) {\n setSelectedFolders((prev) => toggleFoldersInSelection(prev, [folder]));\n return;\n }\n\n // 3. Navigation (Regular Click)\n if (mode === MODE.PAGE) {\n // PAGE mode: Navigate via URL - let URL change trigger state updates\n setIsLoading(true);\n const path = basePath ?? '/media';\n const newUrl = folderId === null ? path : `${path}/${folderId}`;\n router.push(newUrl);\n } else {\n // MODAL mode: Update URL with folderId and let state sync from URL\n setIsLoading(true);\n \n // Clear selections when navigating\n setSelectedFiles([]);\n setSelectedFolders([]);\n \n // Update URL with folderId parameter\n const params = new URLSearchParams(window.location.search);\n if (folderId === null) {\n params.delete('folderId');\n } else {\n params.set('folderId', String(folderId));\n }\n // Reset to page 1 when navigating folders\n params.set('page', '1');\n \n const newUrl = `${window.location.pathname}?${params.toString()}`;\n router.push(newUrl, { scroll: false });\n }\n },\n [isInSelectionMode, mode, router, setSelectedFolders, setSelectedFiles, basePath, setIsLoading]\n );\n\n /**\n * Clears all selected files and folders\n */\n const handleClearSelection = useCallback(() => {\n setSelectedFiles([]);\n setSelectedFolders([]);\n }, [setSelectedFiles, setSelectedFolders]);\n\n /**\n * Selects or deselects all items (files and folders)\n * In page mode: Includes folders\n * In modal mode: Only files\n * \n * @param checked - True to select all, false to deselect all\n */\n const handleSelectAllGlobal = useCallback(\n (checked: boolean) => {\n if (checked) {\n setSelectedFiles(files);\n setSelectedFolders(mode === MODE.PAGE ? folders : []);\n } else {\n setSelectedFiles([]);\n setSelectedFolders([]);\n }\n },\n [files, folders, mode, setSelectedFiles, setSelectedFolders]\n );\n\n\n\n\n\n /**\n * Refreshes all data by reloading using the unified data loader\n * @param silent - If true, refreshes in background without showing loading state\n */\n const refreshData = useCallback(async (silent = false) => {\n await loadData(silent);\n }, [loadData]);\n\n /**\n * Uploads files to the current folder\n * Clears selection after successful upload\n * Uses silent refresh to avoid showing loading state for instant feel\n * \n * @param fileUploadInput - Array of file upload data\n */\n const uploadFiles = useCallback(\n async (fileUploadInput: FileUploadInput[]) => {\n try {\n await provider.uploadFiles(fileUploadInput, currentFolder?.id ?? null);\n // Refresh data silently in background (no loading skeleton)\n await refreshData(true);\n setSelectedFiles([]);\n toast.success(\"Upload Successful\", {\n description: `${fileUploadInput.length} file(s) uploaded successfully`,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Failed to upload files\";\n toast.error(\"Upload Failed\", {\n description: message,\n });\n console.error(\"Upload failed:\", error);\n }\n },\n [currentFolder, provider, refreshData, setSelectedFiles]\n );\n\n /**\n * Creates a new folder in the current directory\n * Clears selection after successful creation\n * Uses silent refresh for instant feel\n * \n * @param name - Name of the folder to create\n */\n const createFolder = useCallback(\n async (name: string) => {\n try {\n await provider.createFolder(name, currentFolder?.id ?? null);\n await refreshData(true); // Silent background refresh\n setSelectedFiles([]);\n toast.success(\"Folder Created\", {\n description: `Folder \"${name}\" created successfully`,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Failed to create folder\";\n toast.error(\"Create Folder Failed\", {\n description: message,\n });\n console.error(\"Failed to create folder:\", error);\n }\n },\n [currentFolder, provider, refreshData, setSelectedFiles]\n );\n\n /**\n * Moves selected files and folders to a target folder\n * Clears selection after successful move\n * \n * @param targetFolderId - ID of the destination folder\n */\n const bulkMove = useCallback(\n async (targetFolderId: FolderId) => {\n try {\n if (selectedFiles.length > 0) {\n await provider.moveFiles(\n selectedFiles.map((f) => f.id),\n targetFolderId\n );\n }\n if (selectedFolders.length > 0) {\n await provider.moveFolders(\n selectedFolders.map((f) => f.id),\n targetFolderId\n );\n }\n await refreshData(true); // Silent background refresh\n setSelectedFiles([]);\n setSelectedFolders([]);\n const totalMoved = selectedFiles.length + selectedFolders.length;\n toast.success(\"Move Successful\", {\n description: `${totalMoved} item(s) moved successfully`,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Failed to move items\";\n toast.error(\"Move Failed\", {\n description: message,\n });\n console.error(\"Failed to move items:\", error);\n }\n },\n [\n selectedFiles,\n selectedFolders,\n provider,\n refreshData,\n setSelectedFiles,\n setSelectedFolders,\n ]\n );\n\n /**\n * Renames a folder\n * @param folderId - ID of the folder to rename\n * @param newName - New name for the folder\n */\n const renameFolder = useCallback(\n async (folderId: string | number, newName: string) => {\n try {\n // Optimistic UI update: rename immediately in local state\n setFolders((prev) =>\n prev.map((f) => (f.id === folderId ? { ...f, name: newName } : f))\n );\n \n await provider.renameFolder(folderId, newName);\n await refreshData(true); // Silent background refresh to sync with server\n toast.success(\"Folder Renamed\", {\n description: `Folder renamed to \"${newName}\"`,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Failed to rename folder\";\n toast.error(\"Rename Failed\", {\n description: message,\n });\n console.error(\"Failed to rename folder:\", error);\n }\n },\n [provider, refreshData]\n );\n\n /**\n * Updates metadata for a specific file\n * @param fileId - ID of the file to update\n * @param metadata - Partial metadata to update\n */\n const updateFileMetadata = useCallback(\n async (fileId: string | number, metadata: Partial<FileMetaData>) => {\n try {\n // Optimistic UI update: apply visual metadata changes immediately\n setFiles((prev) =>\n prev.map((f) => {\n if (f.id === fileId) {\n const { metaData, ...rootUpdates } = metadata;\n return {\n ...f,\n ...rootUpdates,\n metaData: metaData ? { ...f.metaData, ...metaData } : f.metaData,\n } as FileMetaData;\n }\n return f;\n })\n );\n \n await provider.updateFileMetaData(fileId, metadata);\n await refreshData(true); // Silent background refresh\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Failed to update metadata\";\n toast.error(\"Update Failed\", {\n description: message,\n });\n console.error(\"Failed to update metadata:\", error);\n }\n },\n [provider, refreshData]\n );\n\n /**\n * Deletes all selected files and folders\n * Clears selection after successful deletion\n */\n const bulkDelete = useCallback(async () => {\n try {\n if (selectedFiles.length > 0) {\n await provider.deleteFiles(selectedFiles.map((f) => f.id));\n }\n if (selectedFolders.length > 0) {\n await provider.deleteFolders(selectedFolders.map((f) => f.id));\n }\n await refreshData(true); // Silent background refresh\n setSelectedFiles([]);\n setSelectedFolders([]);\n const totalDeleted = selectedFiles.length + selectedFolders.length;\n toast.success(\"Delete Successful\", {\n description: `${totalDeleted} item(s) deleted successfully`,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Failed to delete items\";\n toast.error(\"Delete Failed\", {\n description: message,\n });\n console.error(\"Failed to delete items:\", error);\n }\n }, [\n selectedFiles,\n selectedFolders,\n provider,\n refreshData,\n setSelectedFiles,\n setSelectedFolders,\n ]);\n\n\n\n return {\n // Selection handlers\n handleFileClick,\n handleFolderClick,\n handleClearSelection,\n handleSelectAllGlobal,\n\n\n\n // CRUD\n uploadFiles,\n createFolder,\n bulkMove,\n renameFolder,\n updateFileMetadata,\n bulkDelete,\n refreshData,\n };\n}\n\nexport type FileHandlers = ReturnType<typeof useFileHandlers>;\n","import { IFileManagerProvider } from \"./provider\";\n\n// Mode\nexport const MODE = {\n PAGE: \"page\",\n MODAL: \"modal\",\n} as const;\nexport const MODES = Object.values(MODE);\nexport type Mode = (typeof MODE)[keyof typeof MODE];\n\n// File Type\nexport const FILE_TYPE = {\n IMAGE: \"images\",\n VIDEO: \"videos\",\n AUDIO: \"audios\",\n FILE: \"files\",\n} as const;\nexport const FILE_TYPES = Object.values(FILE_TYPE);\nexport type FileType = (typeof FILE_TYPE)[keyof typeof FILE_TYPE];\n\n// Selection Mode\nexport const SELECTION_MODE = {\n SINGLE: \"single\",\n MULTIPLE: \"multiple\",\n} as const;\nexport const SELECTION_MODES = Object.values(SELECTION_MODE);\nexport type SelectionMode = (typeof SELECTION_MODE)[keyof typeof SELECTION_MODE];\n\n// View Mode\nexport const VIEW_MODE = {\n GRID: \"grid\",\n LIST: \"list\",\n} as const;\nexport const VIEW_MODES = Object.values(VIEW_MODE);\nexport type ViewMode = (typeof VIEW_MODE)[keyof typeof VIEW_MODE];\n\n// Video Source\nexport const VIDEO_SOURCE = {\n LOCAL: \"local\",\n REMOTE: \"remote\",\n YOUTUBE: \"youtube\",\n VIMEO: \"vimeo\",\n} as const;\nexport const VIDEO_SOURCES = Object.values(VIDEO_SOURCE);\nexport type VideoSource = (typeof VIDEO_SOURCE)[keyof typeof VIDEO_SOURCE];\n\nexport interface MetaDataType {\n /** Video or Audio duration in seconds. */\n duration?: number;\n /** Provider source for video content (e.g., 'local', 'youtube'). */\n videoSource?: VideoSource;\n /** Audio bitrate in kbps. */\n bitrate?: number;\n /** Total number of pages for document file types. */\n pageCount?: number;\n /** Original creator or author of the document. */\n author?: string;\n /** General description text used across multiple asset types. */\n description?: string;\n}\n\n// Type aliases for ID types\nexport type EntityId = string | number;\nexport type FolderId = string | number | null;\n\nexport interface Folder {\n id: FolderId;\n name: string;\n \n // Path based structure\n pathId: number; // Using number as per Strapi JSON\n path: string; // e.g. \"/329/374\"\n \n // Relations & Counts\n parent?: Folder | null;\n folderCount?: number;\n\n // Legacy/Compatible fields\n parentId: FolderId; \n folderPath?: string; \n color?: string;\n fileCount?: number;\n \n createdAt: Date;\n updatedAt: Date;\n tags?: string[];\n}\n\n\n\n// NEW: Format details for responsive images\nexport interface FormatDetails {\n ext: string;\n url: string;\n hash: string;\n mime: string;\n name: string;\n path: string | null;\n size: number;\n width: number;\n height: number;\n}\n\n\n/**\n * Core interface representing a File entity in the file manager.\n * Supports various formats (images, videos, audio, documents) via common fields\n * and nested metadata structures.\n */\nexport interface FileMetaData{\n /** Unique identifier for the file. */\n id: EntityId;\n /** Human-readable name of the file (including extension). */\n name: string;\n /** ID of the folder containing this file. Null represents the root directory. */\n folderId: FolderId;\n /** Path representation of the file's location (e.g., \"/1/156\"). */\n folderPath?: string; \n \n // Core details\n /** Size of the file in bytes. */\n size: number;\n /** Direct URL path to access or download the full asset. */\n url: string;\n /** URL to an optimized, lightweight thumbnail or preview of the asset. */\n previewUrl?: string;\n /** Content-Type HTTP header representation (e.g., \"image/jpeg\"). */\n mime: string;\n /** File extension including the dot (e.g., \".jpg\"). */\n ext?: string;\n /** Content hash for deduplication and cache busting. */\n hash?: string;\n \n // Additional CMS fields\n /** Accessible alt text for images to display when images are disabled. */\n alternativeText?: string;\n /** Caption text commonly used in images and videos. */\n caption?: string;\n /** Intrinsic width in pixels for image/video assets. */\n width?: number;\n /** Intrinsic height in pixels for image/video assets. */\n height?: number;\n \n // Rich formats (responsive images)\n /** Collection of generated optimized formats for images. */\n formats?: Record<string, FormatDetails>;\n\n /** Dynamic metadata payload containing properties specific to the asset type. */\n metaData: MetaDataType;\n \n /** Timestamp of file creation. */\n createdAt: Date;\n /** Timestamp of last file modification. */\n updatedAt: Date;\n /** Categorization tags for sorting and discovery. */\n tags?: string[];\n}\n\n\n\n\n\nexport interface Tag {\n id: EntityId\n name: string\n color?: string\n}\n\nexport interface PaginationInfo {\n currentPage: number\n totalPages: number\n totalFiles: number\n filesPerPage: number\n}\n\n\n\n// Props for page view (full-page file manager)\nexport interface FileManagerPageProps {\n allowedFileTypes: FileType[];\n viewMode: ViewMode;\n initialFolderId?: FolderId;\n provider: IFileManagerProvider;\n basePath?: string;\n}\n\n// Props for modal view (file picker/selector)\nexport interface FileManagerModalProps {\n // Modal-specific\n open: boolean;\n onClose: () => void;\n onFilesSelected: (files: FileMetaData[]) => void;\n fileSelectionMode?: SelectionMode; // default: \"single\" - how many files can be selected\n \n // File filtering\n allowedFileTypes: FileType[]; // What can be uploaded\n acceptedFileTypes?: FileType[]; // What can be selected/viewed (defaults to allowedFileTypes)\n \n // Common\n viewMode?: ViewMode; // default: \"grid\"\n initialFolderId?: FolderId;\n provider: IFileManagerProvider;\n basePath?: string;\n}\n\n\n// Internal props for FileManagerComposition.Root (used by both FileManager and FileManagerModal)\nexport interface FileManagerRootProps {\n mode: Mode;\n selectionMode: SelectionMode;\n allowedFileTypes: FileType[];\n viewMode: ViewMode;\n initialFolderId?: FolderId;\n acceptedFileTypesForModal?: FileType[];\n provider: IFileManagerProvider;\n basePath?: string;\n onFilesSelected?: (files: FileMetaData[]) => void;\n onClose?: () => void;\n maxUploadFiles?: number; // default: 50\n maxUploadSize?: number; // in bytes, default: 100MB\n}\n\nexport interface FileStateOptions {\n mode: Mode;\n selectionMode: SelectionMode;\n initialFolderId: FolderId;\n acceptedFileTypesForModal?: FileType[];\n allowedFileTypes?: FileType[];\n provider: IFileManagerProvider;\n basePath?: string;\n\n //Modal Callbacks\n onFilesSelected?: (files: FileMetaData[]) => void;\n onClose?: () => void;\n}","\"use client\";\n\nimport {\n FileMetaData,\n FileStateOptions,\n FileType,\n Folder,\n FolderId,\n MODE,\n PaginationInfo,\n} from \"@/types/file-manager\";\nimport { useParams, useSearchParams, useRouter, usePathname } from \"next/navigation\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { toast } from \"sonner\";\n\nexport function useFileState(options: FileStateOptions) {\n const {\n mode,\n selectionMode,\n initialFolderId,\n acceptedFileTypesForModal,\n allowedFileTypes,\n provider,\n onFilesSelected,\n onClose,\n basePath,\n } = options;\n\n\n const params = useParams();\n const searchParams = useSearchParams();\n const router = useRouter();\n const pathname = usePathname();\n \n // Read pagination from URL\n const pageFromUrl = Math.max(1, parseInt(searchParams.get('page') || '1', 10));\n const limitFromUrl = Math.max(1, parseInt(searchParams.get('limit') || '24', 10));\n const queryFromUrl = searchParams.get('query') || '';\n\n\n // Determine folder from URL based on mode\n const folderId = useMemo<FolderId>(() => {\n if (mode === MODE.PAGE && params?.path) {\n // Page mode: Use path params (/media/123)\n const path = Array.isArray(params.path) ? params.path[0] : params.path;\n\n return typeof path === \"string\" && /^\\d+$/.test(path)\n ? Number(path)\n : null;\n }\n\n if (mode === MODE.MODAL) {\n // Modal mode: Use search params (?folderId=123)\n const folderIdParam = searchParams.get('folderId');\n if (folderIdParam && /^\\d+$/.test(folderIdParam)) {\n return Number(folderIdParam);\n }\n }\n\n return initialFolderId ?? null;\n }, [mode, params, searchParams, initialFolderId]);\n\n // Core State\n const [files, setFiles] = useState<FileMetaData[]>([]);\n const [folders, setFolders] = useState<Folder[]>([]);\n const [selectedFiles, setSelectedFiles] = useState<FileMetaData[]>([]);\n const [selectedFolders, setSelectedFolders] = useState<Folder[]>([]);\n const [currentFolder, setCurrentFolder] = useState<Folder | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [pagination, setPagination] = useState<PaginationInfo>({\n currentPage: pageFromUrl,\n totalPages: 1,\n totalFiles: 0,\n filesPerPage: limitFromUrl,\n });\n\n // Use ref to track current folder without triggering re-renders\n const currentFolderRef = useRef<Folder | null>(null);\n currentFolderRef.current = currentFolder;\n \n // Search state\n const [searchQuery, setSearchQuery] = useState(queryFromUrl);\n const [debouncedSearchQuery, setDebouncedSearchQuery] = useState(queryFromUrl);\n\n // Debounce the search query to prevent rapid API calls\n useEffect(() => {\n const handler = setTimeout(() => {\n setDebouncedSearchQuery(searchQuery);\n }, 300);\n return () => clearTimeout(handler);\n }, [searchQuery]);\n \n // Track previous folder to detect changes\n const prevFolderIdRef = useRef<FolderId>(folderId);\n\n\n\n // Update URL params helper\n const updateUrlParams = useCallback((page: number, limit: number) => {\n const params = new URLSearchParams(searchParams.toString());\n params.set('page', page.toString());\n params.set('limit', limit.toString());\n \n router.push(`${pathname}?${params.toString()}`, { scroll: false });\n }, [router, pathname]); // Removed searchParams - it's read fresh on each call\n \n // Sync state when URL changes (browser back/forward)\n useEffect(() => {\n setPagination(prev => ({\n ...prev,\n currentPage: pageFromUrl,\n filesPerPage: limitFromUrl,\n }));\n setSearchQuery(queryFromUrl);\n }, [pageFromUrl, limitFromUrl, queryFromUrl]);\n \n // Reset to page 1 when folder changes\n useEffect(() => {\n if (folderId !== prevFolderIdRef.current) {\n // Only update URL params in PAGE mode, not MODAL mode\n if (mode === MODE.PAGE) {\n updateUrlParams(1, limitFromUrl);\n }\n prevFolderIdRef.current = folderId;\n }\n }, [folderId, limitFromUrl, updateUrlParams, mode]);\n\n // Extract primitive values for dependency array (prevents unnecessary re-renders)\n const currentPage = pagination.currentPage;\n const filesPerPage = pagination.filesPerPage;\n\n // Consolidated useEffect: Sync current folder and load data\n // This replaces 4 separate useEffects to prevent re-render cascades\n useEffect(() => {\n let cancelled = false;\n\n const syncAndLoad = async () => {\n // Step 1: Sync current folder if needed\n if (folderId && (!currentFolderRef.current || currentFolderRef.current.id !== folderId)) {\n try {\n setIsLoading(true);\n const folder = await provider.getFolder(folderId);\n if (cancelled) return;\n setCurrentFolder(folder);\n \n // Load data for the new folder\n await loadDataForFolder(folder);\n } catch (e) {\n const message = e instanceof Error ? e.message : \"Failed to load folder\";\n toast.error(\"Load Folder Failed\", {\n description: message,\n });\n console.error(\"Failed to fetch current folder\", e);\n if (cancelled) return;\n setCurrentFolder(null);\n if (!cancelled) {\n setIsLoading(false);\n }\n }\n } else if (folderId === null && currentFolderRef.current !== null) {\n // Navigate to root\n setCurrentFolder(null);\n await loadDataForFolder(null);\n } else if (currentFolderRef.current) {\n // Folder is already set, just reload data (e.g., pagination changed)\n await loadDataForFolder(currentFolderRef.current);\n } else {\n // Initial load at root\n await loadDataForFolder(null);\n }\n };\n\n const loadDataForFolder = async (folder: Folder | null) => {\n if (cancelled) return;\n \n setIsLoading(true);\n try {\n // Determine file types based on mode\n let fileTypes: FileType[] | undefined = [];\n if (mode === MODE.MODAL) {\n fileTypes = acceptedFileTypesForModal;\n } else {\n fileTypes = allowedFileTypes;\n }\n\n // Use unified getItems method for combined pagination\n const result = await provider.getItems(\n folder?.id ?? null,\n fileTypes,\n currentPage,\n filesPerPage,\n debouncedSearchQuery\n );\n\n if (cancelled) return;\n \n // Update state with combined results\n setFolders(result.folders);\n setFiles(result.files);\n setPagination(result.pagination);\n \n } catch (error) {\n const message = error instanceof Error ? error.message : \"Failed to load data\";\n toast.error(\"Load Data Failed\", {\n description: message,\n });\n console.error(\"Failed to load data:\", error);\n } finally {\n if (!cancelled) {\n setIsLoading(false);\n }\n }\n };\n\n syncAndLoad();\n\n return () => {\n cancelled = true;\n };\n }, [\n folderId,\n provider,\n mode,\n acceptedFileTypesForModal,\n allowedFileTypes,\n currentPage,\n filesPerPage,\n debouncedSearchQuery,\n ]);\n\n // Clear selections when folder changes\n useEffect(() => {\n setSelectedFolders([]);\n setSelectedFiles([]);\n }, [currentFolder]);\n\n // Modal States\n const [isUploadModalOpen, setIsUploadModalOpen] = useState(false);\n const [isCreateFolderModalOpen, setIsCreateFolderModalOpen] = useState(false);\n const [isSearchModalOpen, setIsSearchModalOpen] = useState(false);\n const [isMoveFileModalOpen, setIsMoveFileModalOpen] = useState(false);\n const [isRenameFolderModalOpen, setIsRenameFolderModalOpen] = useState(false);\n const [folderToRename, setFolderToRename] = useState<Folder | null>(null);\n \n // File Details Modal State\n const [fileDetailsModalFile, setFileDetailsModalFile] = useState<FileMetaData | null>(null);\n\n /**\n * Unified data loader that mirrors the main useEffect logic\n * Uses getItems for consistent pagination of files + folders together\n * @param silent - If true, skips showing loading state (for background refreshes)\n */\n const loadData = useCallback(async (silent = false) => {\n if (!silent) {\n setIsLoading(true);\n }\n try {\n // Determine file types based on mode\n let fileTypes: FileType[] | undefined = [];\n if (mode === MODE.MODAL) {\n fileTypes = acceptedFileTypesForModal;\n } else {\n fileTypes = allowedFileTypes;\n }\n\n // Use unified getItems method for combined pagination\n const result = await provider.getItems(\n currentFolder?.id ?? null,\n fileTypes,\n currentPage,\n filesPerPage,\n debouncedSearchQuery\n );\n\n setFolders(result.folders);\n setFiles(result.files);\n setPagination(result.pagination);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Failed to load data\";\n toast.error(\"Load Data Failed\", {\n description: message,\n });\n console.error(\"Failed to load data:\", error);\n } finally {\n if (!silent) {\n setIsLoading(false);\n }\n }\n }, [currentFolder, mode, acceptedFileTypesForModal, allowedFileTypes, provider, currentPage, filesPerPage, debouncedSearchQuery]);\n\n const isInSelectionMode = () => selectedFiles.length > 0 || selectedFolders.length > 0;\n const getCurrentFolder = () => currentFolder;\n\n // Checkbox states - memoized to prevent recalculation on every render\n const getSelectionState = useMemo(() => {\n return () => {\n const totalItems = files.length + (mode === MODE.PAGE ? folders.length : 0);\n const selectedItems = selectedFiles.length + selectedFolders.length;\n if (selectedItems === 0) return false;\n if (selectedItems === totalItems) return true;\n return \"indeterminate\";\n };\n }, [files.length, folders.length, selectedFiles.length, selectedFolders.length, mode]);\n\n\n\n // Pagination change handler\n const handlePageChange = useCallback((newPage: number) => {\n setPagination(prev => ({ ...prev, currentPage: newPage }));\n // Only update URL in PAGE mode, not MODAL mode\n if (mode === MODE.PAGE) {\n updateUrlParams(newPage, filesPerPage);\n }\n }, [updateUrlParams, filesPerPage, mode]);\n \n // Update search query and sync with URL\n const updateSearchQuery = useCallback((newQuery: string) => {\n setSearchQuery(newQuery);\n \n // Update URL param dynamically based on input length\n const params = new URLSearchParams(searchParams.toString());\n if (newQuery.trim()) {\n params.set('query', newQuery);\n params.set('page', '1'); // Reset to page 1 on new search\n } else {\n params.delete('query');\n }\n \n // We intentionally ignore scroll updates for smooth inline typing\n router.push(`${pathname}?${params.toString()}`, { scroll: false });\n }, [router, pathname, searchParams]); // Now searchParams is intentionally tracked\n\n return {\n // State\n files,\n folders,\n selectedFiles,\n selectedFolders,\n currentFolder,\n isLoading,\n pagination,\n isUploadModalOpen,\n isCreateFolderModalOpen,\n isSearchModalOpen,\n isMoveFileModalOpen,\n isRenameFolderModalOpen,\n fileDetailsModalFile,\n folderToRename,\n\n // Setters\n setFiles,\n setFolders,\n setSelectedFiles,\n setSelectedFolders,\n setCurrentFolder,\n setPagination,\n\n //Modal Setters\n setIsUploadModalOpen,\n setIsCreateFolderModalOpen,\n setIsSearchModalOpen,\n setIsMoveFileModalOpen,\n setIsRenameFolderModalOpen,\n setFileDetailsModalFile,\n setFolderToRename,\n\n // Loaders\n loadData,\n setIsLoading,\n\n // Computed\n isInSelectionMode,\n getCurrentFolder,\n getSelectionState,\n \n // Pagination handlers\n handlePageChange,\n \n // Search\n searchQuery,\n updateSearchQuery,\n\n // Config\n mode,\n selectionMode,\n acceptedFileTypesForModal,\n provider,\n onFilesSelected,\n onClose,\n basePath,\n };\n}\n\nexport type FileState = ReturnType<typeof useFileState>;\n","\"use client\";\n\nimport { useFileHandlers } from \"@/hooks/use-file-handlers\";\nimport { useFileState } from \"@/hooks/use-file-state\";\nimport { EntityId, FileManagerRootProps, FileMetaData, FileType, FolderId, Folder, PaginationInfo, Mode, SelectionMode, SELECTION_MODE, MODE } from \"@/types/file-manager\";\nimport { FileUploadInput, IFileManagerProvider } from \"@/types/provider\";\nimport { createContext, useContext, useMemo } from \"react\";\n\nconst FileManagerContext = createContext<FileManagerContextType | undefined>(undefined);\n\n// Context type - combines state and handlers\n\ninterface FileManagerContextType {\n // State\n files: FileMetaData[];\n folders: Folder[];\n selectedFiles: FileMetaData[];\n selectedFolders: Folder[];\n currentFolder: Folder | null;\n isLoading: boolean;\n pagination: PaginationInfo;\n\n //modal\n isUploadModalOpen: boolean;\n isCreateFolderModalOpen: boolean;\n isSearchModalOpen: boolean;\n isMoveFileModalOpen: boolean;\n isRenameFolderModalOpen: boolean;\n fileDetailsModalFile: FileMetaData | null;\n folderToRename: Folder | null;\n\n\n mode: Mode;\n selectionMode: SelectionMode;\n allowedFileTypes: FileType[]; // What file types can be uploaded (both page and modal mode)\n acceptedFileTypesForModal?: FileType[]; // what type of files can be selected/viewed in modal mode\n maxUploadFiles: number; // Maximum number of files that can be uploaded at once\n maxUploadSize: number; // Maximum file size in bytes\n\n // Provider\n provider: IFileManagerProvider;\n basePath?: string;\n\n // Setters\n setSelectedFiles: (files: FileMetaData[]) => void;\n setSelectedFolders: (folders: Folder[]) => void;\n \n //Modals Setters\n setIsUploadModalOpen: (isOpen: boolean) => void;\n setIsCreateFolderModalOpen: (isOpen: boolean) => void;\n setIsSearchModalOpen: (isOpen: boolean) => void;\n setIsMoveFileModalOpen: (isOpen: boolean) => void;\n setIsRenameFolderModalOpen: (isOpen: boolean) => void;\n setFileDetailsModalFile: (file: FileMetaData | null) => void;\n setFolderToRename: (folder: Folder | null) => void;\n\n // Handlers\n handleFileClick: (file: FileMetaData, event?: React.MouseEvent, isCheckboxClick?: boolean) => void;\n handleFolderClick: (folder: Folder | null, event?: React.MouseEvent, isCheckboxClick?: boolean) => void;\n handleClearSelection: () => void;\n handleSelectAllGlobal: (checked: boolean) => void;\n\n handlePageChange: (page: number) => void;\n \n // Search\n searchQuery: string;\n updateSearchQuery: (query: string) => void;\n\n // CRUD\n uploadFiles: (fileUploadInput: FileUploadInput[]) => Promise<void>;\n createFolder: (name: string) => Promise<void>;\n bulkMove: (targetFolderId: FolderId) => Promise<void>;\n renameFolder: (folderId: EntityId, newName: string) => Promise<void>;\n updateFileMetadata: (fileId: EntityId, metadata: Partial<FileMetaData>) => Promise<void>;\n bulkDelete: () => Promise<void>;\n refreshData: () => Promise<void>;\n\n // Computed\n isInSelectionMode: () => boolean;\n getCurrentFolder: () => Folder | null;\n getSelectionState: () => boolean | \"indeterminate\";\n\n\n // Callbacks for modal mode\n onClose?: () => void;\n onFilesSelected?: (files: FileMetaData[]) => void;\n}\n\nexport function FileManagerProvider({\n children,\n mode = MODE.PAGE,\n selectionMode = SELECTION_MODE.SINGLE,\n allowedFileTypes,\n onFilesSelected,\n onClose,\n acceptedFileTypesForModal,\n initialFolderId = null,\n provider,\n basePath = \"/media\",\n maxUploadFiles = 50,\n maxUploadSize = 100 * 1024 * 1024, // 100MB\n}: FileManagerRootProps & { children: React.ReactNode }) {\n \n // Use the state hook\n const state = useFileState({\n mode,\n selectionMode,\n initialFolderId,\n acceptedFileTypesForModal,\n allowedFileTypes,\n provider,\n onFilesSelected,\n onClose,\n basePath,\n });\n\n // Use the handlers hook\n const handlers = useFileHandlers(state);\n\n // Compose context value\n const value = useMemo<FileManagerContextType>(() => ({\n // State\n files: state.files,\n folders: state.folders,\n selectedFiles: state.selectedFiles,\n selectedFolders: state.selectedFolders,\n currentFolder: state.currentFolder,\n isLoading: state.isLoading,\n pagination: state.pagination,\n isUploadModalOpen: state.isUploadModalOpen,\n isCreateFolderModalOpen: state.isCreateFolderModalOpen,\n isSearchModalOpen: state.isSearchModalOpen,\n isMoveFileModalOpen: state.isMoveFileModalOpen,\n isRenameFolderModalOpen: state.isRenameFolderModalOpen,\n fileDetailsModalFile: state.fileDetailsModalFile,\n folderToRename: state.folderToRename,\n mode: state.mode,\n selectionMode: state.selectionMode,\n allowedFileTypes,\n acceptedFileTypesForModal: state.acceptedFileTypesForModal,\n maxUploadFiles,\n maxUploadSize,\n\n // Setters\n setIsUploadModalOpen: state.setIsUploadModalOpen,\n setIsCreateFolderModalOpen: state.setIsCreateFolderModalOpen,\n setIsSearchModalOpen: state.setIsSearchModalOpen,\n setIsMoveFileModalOpen: state.setIsMoveFileModalOpen,\n\n setSelectedFiles: state.setSelectedFiles,\n setSelectedFolders: state.setSelectedFolders,\n setIsRenameFolderModalOpen: state.setIsRenameFolderModalOpen,\n setFileDetailsModalFile: state.setFileDetailsModalFile,\n setFolderToRename: state.setFolderToRename,\n\n // Handlers\n handleFileClick: handlers.handleFileClick,\n handleFolderClick: handlers.handleFolderClick,\n handleClearSelection: handlers.handleClearSelection,\n handleSelectAllGlobal: handlers.handleSelectAllGlobal,\n\n handlePageChange: state.handlePageChange,\n \n // Search\n searchQuery: state.searchQuery,\n updateSearchQuery: state.updateSearchQuery,\n\n\n // CRUD\n uploadFiles: handlers.uploadFiles,\n createFolder: handlers.createFolder,\n bulkMove: handlers.bulkMove,\n renameFolder: handlers.renameFolder,\n updateFileMetadata: handlers.updateFileMetadata,\n bulkDelete: handlers.bulkDelete,\n refreshData: handlers.refreshData,\n\n // Computed\n isInSelectionMode: state.isInSelectionMode,\n getCurrentFolder: state.getCurrentFolder,\n getSelectionState: state.getSelectionState,\n\n\n // Callbacks\n onClose: state.onClose,\n onFilesSelected: state.onFilesSelected,\n provider,\n basePath: state.basePath,\n }), [state, handlers, provider, allowedFileTypes, maxUploadFiles, maxUploadSize]);\n\n return (\n <FileManagerContext.Provider value={value}>\n {children}\n </FileManagerContext.Provider>\n );\n}\n\nexport function useFileManager() {\n const context = useContext(FileManagerContext);\n if (context === undefined) {\n throw new Error(\"useFileManager must be used within a FileManagerProvider\");\n }\n return context;\n}\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * Merges Tailwind class names, resolving any conflicts.\n *\n * @param inputs - An array of class names to merge.\n * @returns A string of merged and optimized class names.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '@/lib/utils';\nimport { MoreHorizontal } from 'lucide-react';\n\nconst Pagination = ({ className, ...props }: React.ComponentProps<'nav'>) => (\n <nav\n data-slot=\"pagination\"\n role=\"navigation\"\n aria-label=\"pagination\"\n className={cn('mx-auto flex w-full justify-center', className)}\n {...props}\n />\n);\n\nfunction PaginationContent({ className, ...props }: React.ComponentProps<'ul'>) {\n return <ul data-slot=\"pagination-content\" className={cn('flex flex-row items-center gap-1', className)} {...props} />;\n}\n\nfunction PaginationItem({ className, ...props }: React.ComponentProps<'li'>) {\n return <li data-slot=\"pagination-item\" className={cn('', className)} {...props} />;\n}\n\nconst PaginationEllipsis = ({ className, ...props }: React.ComponentProps<'span'>) => (\n <span\n data-slot=\"pagination-ellipsis\"\n aria-hidden\n className={cn('flex h-9 w-9 items-center justify-center', className)}\n {...props}\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n);\n\nexport { Pagination, PaginationContent, PaginationEllipsis, PaginationItem };\n","import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { ChevronDown, LucideIcon } from 'lucide-react';\nimport { Slot as SlotPrimitive } from 'radix-ui';\nimport { cn } from '@/lib/utils';\n\nconst buttonVariants = cva(\n 'cursor-pointer group whitespace-nowrap focus-visible:outline-hidden inline-flex items-center justify-center has-data-[arrow=true]:justify-between whitespace-nowrap text-sm font-medium ring-offset-background transition-[color,box-shadow] disabled:pointer-events-none disabled:opacity-60 [&_svg]:shrink-0',\n {\n variants: {\n variant: {\n primary: 'bg-primary text-primary-foreground hover:bg-primary/90 data-[state=open]:bg-primary/90',\n mono: 'bg-zinc-950 text-white dark:bg-zinc-300 dark:text-black hover:bg-zinc-950/90 dark:hover:bg-zinc-300/90 data-[state=open]:bg-zinc-950/90 dark:data-[state=open]:bg-zinc-300/90',\n destructive:\n 'bg-destructive text-destructive-foreground hover:bg-destructive/90 data-[state=open]:bg-destructive/90',\n secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/90 data-[state=open]:bg-secondary/90',\n outline: 'bg-background text-accent-foreground border border-input hover:bg-accent data-[state=open]:bg-accent',\n dashed:\n 'text-accent-foreground border border-input border-dashed bg-background hover:bg-accent hover:text-accent-foreground data-[state=open]:text-accent-foreground',\n ghost:\n 'text-accent-foreground hover:bg-accent hover:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground',\n dim: 'text-muted-foreground hover:text-foreground data-[state=open]:text-foreground',\n foreground: '',\n inverse: '',\n },\n appearance: {\n default: '',\n ghost: '',\n },\n underline: {\n solid: '',\n dashed: '',\n },\n underlined: {\n solid: '',\n dashed: '',\n },\n size: {\n lg: 'h-10 px-4 text-sm gap-1.5 [&_svg:not([class*=size-])]:size-4',\n md: 'h-9 px-3 gap-1.5 text-sm [&_svg:not([class*=size-])]:size-4',\n sm: 'h-8 px-2.5 gap-1.25 text-xs [&_svg:not([class*=size-])]:size-3.5',\n xs: 'h-7 px-2 gap-1 text-xs [&_svg:not([class*=size-])]:size-3.5',\n icon: 'size-9 [&_svg:not([class*=size-])]:size-4 shrink-0',\n },\n autoHeight: {\n true: '',\n false: '',\n },\n radius: {\n md: 'rounded-md',\n full: 'rounded-full',\n },\n mode: {\n default: 'focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n icon: 'focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 shrink-0',\n link: 'text-primary h-auto p-0 bg-transparent rounded-none hover:bg-transparent data-[state=open]:bg-transparent',\n input: `\n justify-start font-normal hover:bg-background [&_svg]:transition-colors [&_svg]:hover:text-foreground data-[state=open]:bg-background \n focus-visible:border-ring focus-visible:outline-hidden focus-visible:ring-[3px] focus-visible:ring-ring/30 \n [[data-state=open]>&]:border-ring [[data-state=open]>&]:outline-hidden [[data-state=open]>&]:ring-[3px] \n [[data-state=open]>&]:ring-ring/30 \n aria-invalid:border-destructive/60 aria-invalid:ring-destructive/10 dark:aria-invalid:border-destructive dark:aria-invalid:ring-destructive/20\n in-data-[invalid=true]:border-destructive/60 in-data-[invalid=true]:ring-destructive/10 dark:in-data-[invalid=true]:border-destructive dark:in-data-[invalid=true]:ring-destructive/20\n `,\n },\n placeholder: {\n true: 'text-muted-foreground',\n false: '',\n },\n },\n compoundVariants: [\n // Icons opacity for default mode\n {\n variant: 'ghost',\n mode: 'default',\n className: '[&_svg:not([role=img]):not([class*=text-]):not([class*=opacity-])]:opacity-60',\n },\n {\n variant: 'outline',\n mode: 'default',\n className: '[&_svg:not([role=img]):not([class*=text-]):not([class*=opacity-])]:opacity-60',\n },\n {\n variant: 'dashed',\n mode: 'default',\n className: '[&_svg:not([role=img]):not([class*=text-]):not([class*=opacity-])]:opacity-60',\n },\n {\n variant: 'secondary',\n mode: 'default',\n className: '[&_svg:not([role=img]):not([class*=text-]):not([class*=opacity-])]:opacity-60',\n },\n\n // Icons opacity for default mode\n {\n variant: 'outline',\n mode: 'input',\n className: '[&_svg:not([role=img]):not([class*=text-]):not([class*=opacity-])]:opacity-60',\n },\n {\n variant: 'outline',\n mode: 'icon',\n className: '[&_svg:not([role=img]):not([class*=text-]):not([class*=opacity-])]:opacity-60',\n },\n\n // Auto height\n {\n size: 'xs',\n autoHeight: true,\n className: 'h-auto min-h-7',\n },\n {\n size: 'md',\n autoHeight: true,\n className: 'h-auto min-h-9',\n },\n {\n size: 'sm',\n autoHeight: true,\n className: 'h-auto min-h-8',\n },\n {\n size: 'lg',\n autoHeight: true,\n className: 'h-auto min-h-10',\n },\n\n // Shadow support\n {\n variant: 'primary',\n mode: 'default',\n appearance: 'default',\n className: 'shadow-xs shadow-black/5',\n },\n {\n variant: 'mono',\n mode: 'default',\n appearance: 'default',\n className: 'shadow-xs shadow-black/5',\n },\n {\n variant: 'secondary',\n mode: 'default',\n appearance: 'default',\n className: 'shadow-xs shadow-black/5',\n },\n {\n variant: 'outline',\n mode: 'default',\n appearance: 'default',\n className: 'shadow-xs shadow-black/5',\n },\n {\n variant: 'dashed',\n mode: 'default',\n appearance: 'default',\n className: 'shadow-xs shadow-black/5',\n },\n {\n variant: 'destructive',\n mode: 'default',\n appearance: 'default',\n className: 'shadow-xs shadow-black/5',\n },\n\n // Shadow support\n {\n variant: 'primary',\n mode: 'icon',\n appearance: 'default',\n className: 'shadow-xs shadow-black/5',\n },\n {\n variant: 'mono',\n mode: 'icon',\n appearance: 'default',\n className: 'shadow-xs shadow-black/5',\n },\n {\n variant: 'secondary',\n mode: 'icon',\n appearance: 'default',\n className: 'shadow-xs shadow-black/5',\n },\n {\n variant: 'outline',\n mode: 'icon',\n appearance: 'default',\n className: 'shadow-xs shadow-black/5',\n },\n {\n variant: 'dashed',\n mode: 'icon',\n appearance: 'default',\n className: 'shadow-xs shadow-black/5',\n },\n {\n variant: 'destructive',\n mode: 'icon',\n appearance: 'default',\n className: 'shadow-xs shadow-black/5',\n },\n\n // Link\n {\n variant: 'primary',\n mode: 'link',\n underline: 'solid',\n className:\n 'font-medium text-primary hover:text-primary/90 [&_svg:not([role=img]):not([class*=text-])]:opacity-60 hover:underline hover:underline-offset-4 hover:decoration-solid',\n },\n {\n variant: 'primary',\n mode: 'link',\n underline: 'dashed',\n className:\n 'font-medium text-primary hover:text-primary/90 [&_svg:not([role=img]):not([class*=text-])]:opacity-60 hover:underline hover:underline-offset-4 hover:decoration-dashed decoration-1',\n },\n {\n variant: 'primary',\n mode: 'link',\n underlined: 'solid',\n className:\n 'font-medium text-primary hover:text-primary/90 [&_svg:not([role=img]):not([class*=text-])]:opacity-60 underline underline-offset-4 decoration-solid',\n },\n {\n variant: 'primary',\n mode: 'link',\n underlined: 'dashed',\n className:\n 'font-medium text-primary hover:text-primary/90 [&_svg]:opacity-60 underline underline-offset-4 decoration-dashed decoration-1',\n },\n\n {\n variant: 'inverse',\n mode: 'link',\n underline: 'solid',\n className:\n 'font-medium text-inherit [&_svg:not([role=img]):not([class*=text-])]:opacity-60 hover:underline hover:underline-offset-4 hover:decoration-solid',\n },\n {\n variant: 'inverse',\n mode: 'link',\n underline: 'dashed',\n className:\n 'font-medium text-inherit [&_svg:not([role=img]):not([class*=text-])]:opacity-60 hover:underline hover:underline-offset-4 hover:decoration-dashed decoration-1',\n },\n {\n variant: 'inverse',\n mode: 'link',\n underlined: 'solid',\n className:\n 'font-medium text-inherit [&_svg:not([role=img]):not([class*=text-])]:opacity-60 underline underline-offset-4 decoration-solid',\n },\n {\n variant: 'inverse',\n mode: 'link',\n underlined: 'dashed',\n className:\n 'font-medium text-inherit [&_svg:not([role=img]):not([class*=text-])]:opacity-60 underline underline-offset-4 decoration-dashed decoration-1',\n },\n\n {\n variant: 'foreground',\n mode: 'link',\n underline: 'solid',\n className:\n 'font-medium text-foreground [&_svg:not([role=img]):not([class*=text-])]:opacity-60 hover:underline hover:underline-offset-4 hover:decoration-solid',\n },\n {\n variant: 'foreground',\n mode: 'link',\n underline: 'dashed',\n className:\n 'font-medium text-foreground [&_svg:not([role=img]):not([class*=text-])]:opacity-60 hover:underline hover:underline-offset-4 hover:decoration-dashed decoration-1',\n },\n {\n variant: 'foreground',\n mode: 'link',\n underlined: 'solid',\n className:\n 'font-medium text-foreground [&_svg:not([role=img]):not([class*=text-])]:opacity-60 underline underline-offset-4 decoration-solid',\n },\n {\n variant: 'foreground',\n mode: 'link',\n underlined: 'dashed',\n className:\n 'font-medium text-foreground [&_svg:not([role=img]):not([class*=text-])]:opacity-60 underline underline-offset-4 decoration-dashed decoration-1',\n },\n\n // Ghost\n {\n variant: 'primary',\n appearance: 'ghost',\n className: 'bg-transparent text-primary/90 hover:bg-primary/5 data-[state=open]:bg-primary/5',\n },\n {\n variant: 'destructive',\n appearance: 'ghost',\n className: 'bg-transparent text-destructive/90 hover:bg-destructive/5 data-[state=open]:bg-destructive/5',\n },\n {\n variant: 'ghost',\n mode: 'icon',\n className: 'text-muted-foreground',\n },\n\n // Size\n {\n size: 'xs',\n mode: 'icon',\n className: 'w-7 h-7 p-0 [[&_svg:not([class*=size-])]:size-3.5',\n },\n {\n size: 'sm',\n mode: 'icon',\n className: 'w-8 h-8 p-0 [[&_svg:not([class*=size-])]:size-3.5',\n },\n {\n size: 'md',\n mode: 'icon',\n className: 'w-9 h-9 p-0 [&_svg:not([class*=size-])]:size-4',\n },\n {\n size: 'icon',\n className: 'w-9 h-9 p-0 [&_svg:not([class*=size-])]:size-4',\n },\n {\n size: 'lg',\n mode: 'icon',\n className: 'w-10 h-10 p-0 [&_svg:not([class*=size-])]:size-4',\n },\n\n // Input mode\n {\n mode: 'input',\n placeholder: true,\n variant: 'outline',\n className: 'font-normal text-muted-foreground',\n },\n {\n mode: 'input',\n variant: 'outline',\n size: 'sm',\n className: 'gap-1.25',\n },\n {\n mode: 'input',\n variant: 'outline',\n size: 'md',\n className: 'gap-1.5',\n },\n {\n mode: 'input',\n variant: 'outline',\n size: 'lg',\n className: 'gap-1.5',\n },\n ],\n defaultVariants: {\n variant: 'primary',\n mode: 'default',\n size: 'md',\n radius: 'md',\n appearance: 'default',\n },\n },\n);\n\nfunction Button({\n className,\n selected,\n variant,\n radius,\n appearance,\n mode,\n size,\n autoHeight,\n underlined,\n underline,\n asChild = false,\n placeholder = false,\n ...props\n}: React.ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & {\n selected?: boolean;\n asChild?: boolean;\n }) {\n const Comp = asChild ? SlotPrimitive.Slot : 'button';\n return (\n <Comp\n data-slot=\"button\"\n className={cn(\n buttonVariants({\n variant,\n size,\n radius,\n appearance,\n mode,\n autoHeight,\n placeholder,\n underlined,\n underline,\n className,\n }),\n asChild && props.disabled && 'pointer-events-none opacity-50',\n )}\n {...(selected && { 'data-state': 'open' })}\n {...props}\n />\n );\n}\n\ninterface ButtonArrowProps extends React.SVGProps<SVGSVGElement> {\n icon?: LucideIcon; // Allows passing any Lucide icon\n}\n\nfunction ButtonArrow({ icon: Icon = ChevronDown, className, ...props }: ButtonArrowProps) {\n return <Icon data-slot=\"button-arrow\" className={cn('ms-auto -me-1', className)} {...props} />;\n}\n\nexport { Button, ButtonArrow, buttonVariants };\n","export default function ChevronRightIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path d=\"M9.00005 6C9.00005 6 15 10.4189 15 12C15 13.5812 9 18 9 18\" stroke=\"#141B34\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n","export default function ChevronLeftIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n {...props}\n >\n <path fill=\"currentColor\" d=\"M16.62 2.99c-.49-.49-1.28-.49-1.77 0L6.54 11.3c-.39.39-.39 1.02 0 1.41l8.31 8.31c.49.49 1.28.49 1.77 0s.49-1.28 0-1.77L9.38 12l7.25-7.25c.48-.48.48-1.28-.01-1.76z\"></path>\n </svg>\n );\n}\n\n\n","\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport { useFileManager } from \"../../context/file-manager-context\";\nimport { Pagination, PaginationContent, PaginationEllipsis, PaginationItem } from \"../ui/pagination\";\nimport { Button } from \"../ui/button\";\n\nimport ChevronRightIcon from \"../icons/chevron-right\";\nimport ChevronLeftIcon from \"../icons/chevron-left\";\n\n\n// Helper to generate page numbers with ellipsis for pagination\nfunction getPageNumbers(current: number, total: number) {\n const pages: (number | 'ellipsis')[] = [];\n if (total <= 7) {\n for (let i = 1; i <= total; i++) pages.push(i);\n } else if (current <= 4) {\n pages.push(1, 2, 3, 4, 5, 'ellipsis', total);\n } else if (current >= total - 3) {\n pages.push(1, 'ellipsis', total - 4, total - 3, total - 2, total - 1, total);\n } else {\n pages.push(1, 'ellipsis', current - 1, current, current + 1, 'ellipsis', total);\n }\n return pages;\n}\n\nexport function FileManagerFooter({ className }: { className?: string }) {\n const { pagination, handlePageChange, files, folders } = useFileManager();\n const { currentPage, totalPages } = pagination;\n \n // Hide pagination if there's only 1 page or no items\n const totalItems = (files?.length || 0) + (folders?.length || 0);\n if (totalPages <= 1 || totalItems === 0) {\n return null;\n }\n \n const pageNumbers = getPageNumbers(currentPage, totalPages);\n\n return (\n <Pagination className={className}>\n <PaginationContent>\n <PaginationItem>\n <Button\n variant=\"ghost\"\n radius={\"full\"}\n asChild\n disabled={currentPage === 1}\n onClick={() => currentPage > 1 && handlePageChange(currentPage - 1)}\n >\n <span>\n <ChevronLeftIcon className=\"rtl:rotate-180\" /> Previous\n </span>\n </Button>\n </PaginationItem>\n {pageNumbers.map((page, idx) =>\n page === 'ellipsis' ? (\n <PaginationItem key={`ellipsis-${currentPage}-${totalPages}-${idx}`}>\n <PaginationEllipsis />\n </PaginationItem>\n ) : (\n <PaginationItem key={page}>\n <Button\n variant={page === currentPage ? 'outline' : 'ghost'}\n mode=\"icon\"\n size=\"icon\"\n radius=\"full\"\n asChild\n onClick={() => handlePageChange(page)}\n disabled={page === currentPage}\n >\n <span>{page}</span>\n </Button>\n </PaginationItem>\n )\n )}\n <PaginationItem>\n <Button\n variant=\"ghost\"\n radius={\"full\"}\n asChild\n disabled={currentPage === totalPages}\n onClick={() => currentPage < totalPages && handlePageChange(currentPage + 1)}\n >\n <span>\n Next <ChevronRightIcon className=\"rtl:rotate-180\" />\n </span>\n </Button>\n </PaginationItem>\n </PaginationContent>\n </Pagination>\n );\n}\n","import { cn } from \"@/lib/utils\";\nimport { ReactNode } from \"react\";\n\nexport function FileManagerHeader({\n children,\n className\n}: {\n children?: ReactNode;\n className?: string;\n}) {\n return (\n <div className={cn('p-4 flex md:flex-row gap-2', className)}>\n {children}\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { useFileManager } from '@/context/file-manager-context';\nimport { FileMetaData } from '@/types/file-manager';\nimport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/dialog';\nimport { Alert, AlertContent, AlertDescription, AlertIcon, AlertTitle } from '@/components/ui/alert';\nimport { Button } from '../ui/button';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';\nimport {\n useFileUpload,\n type EntityId,\n} from '@/hooks/use-file-upload';\nimport { type FileUploadItem } from '@/hooks/use-file-upload';\nimport {\n RefreshCwIcon,\n TriangleAlert,\n} from 'lucide-react';\nimport { cn } from '@/lib/utils';\nimport { getFileSize } from '@/lib/file-size';\nimport { fileTypesToAccept, getFileTypeFromMime, getFileTypesDescription } from '@/lib/file-utils';\nimport { FileUploadInput } from '@/types/provider';\nimport UploadCloudIcon from '../icons/upload-cloud';\nimport { CrossIcon } from '../icons';\nimport { getFileComponents } from '../grid/file-component-registry';\nimport { KbdGroup, Kbd } from \"../ui/kbd\";\n\n\nexport function UploadModal() {\n const {\n isUploadModalOpen,\n setIsUploadModalOpen,\n uploadFiles,\n allowedFileTypes,\n maxUploadFiles,\n maxUploadSize,\n } = useFileManager();\n\n // Use allowedFileTypes for upload restrictions (applies to both page and modal mode)\n const acceptString = fileTypesToAccept(allowedFileTypes);\n const fileTypesDescription = getFileTypesDescription(allowedFileTypes);\n\n // Track upload items (files in UI, immediately marked as completed)\n const [uploadItems, setUploadItems] = useState<FileUploadItem[]>([]);\n\n const [\n { isDragging, errors },\n {\n removeFile,\n clearFiles,\n handleDragEnter,\n handleDragLeave,\n handleDragOver,\n handleDrop,\n openFileDialog,\n getInputProps,\n },\n ] = useFileUpload({\n maxFiles: maxUploadFiles,\n maxSize: maxUploadSize,\n accept: acceptString,\n multiple: true,\n onFilesChange: (newFiles) => {\n // Convert to upload items when files change\n const newUploadItems = newFiles.map((file) => {\n // Check if this file already exists in uploadItems\n const existingFile = uploadItems.find((existing) => existing.id === file.id);\n\n if (existingFile) {\n // Preserve existing file status and progress\n return {\n ...existingFile,\n ...file,\n };\n } else {\n // New file - mark as completed immediately (no simulation)\n return {\n ...file,\n progress: 100,\n status: 'completed' as const,\n };\n }\n });\n\n setUploadItems(newUploadItems);\n },\n });\n\n // Upload simulation removed - files are marked as completed immediately\n\n const removeUploadFile = (fileId: EntityId) => {\n removeFile(fileId);\n };\n\n const retryUpload = (fileId: EntityId) => {\n setUploadItems((prev) =>\n prev.map((file) =>\n file.id === fileId ? { ...file, progress: 0, status: 'uploading' as const, error: undefined } : file,\n ),\n );\n };\n\n const handleUpload = () => {\n // Filter only completed files\n const completedFiles = uploadItems.filter((item) => item.status === 'completed');\n\n if (completedFiles.length > 0) {\n // Convert to FileUploadInput format\n const fileInputs: FileUploadInput[] = completedFiles.map((item) => ({\n name: item.file.name,\n size: item.file.size,\n type: getFileTypeFromMime(item.file.type, item.file.name.split('.').pop()),\n lastModified: item.file instanceof File ? item.file.lastModified : Date.now(),\n file: item.file as File,\n metadata: {}\n }));\n\n uploadFiles(fileInputs);\n handleClose();\n }\n };\n\n const handleClose = () => {\n setIsUploadModalOpen(false);\n clearFiles();\n setUploadItems([]);\n };\n\n const getFilePreviewComponent = (file: File, preview?: string) => {\n // Create a mock FileMetaData object to use with the registry\n const mockFileMetadata: FileMetaData = {\n id: 'temp',\n name: file.name,\n size: file.size,\n mime: file.type,\n ext: file.name.split('.').pop() || '',\n url: preview || '', // Use preview URL for images, empty for others\n createdAt: new Date(file.lastModified),\n updatedAt: new Date(file.lastModified),\n folderId: null,\n metaData: {},\n };\n\n // Get the appropriate component from registry\n const { component: FilePreviewComponent } = getFileComponents(mockFileMetadata);\n return <FilePreviewComponent file={mockFileMetadata} metaData={mockFileMetadata.metaData} />;\n };\n\n const completedCount = uploadItems.filter((item) => item.status === 'completed').length;\n const uploadingCount = uploadItems.filter((item) => item.status === 'uploading').length;\n const canUpload = completedCount > 0 && uploadingCount === 0;\n\n return (\n <Dialog open={isUploadModalOpen} onOpenChange={setIsUploadModalOpen}>\n <DialogContent className=\"p-0 max-w-4xl max-h-[80vh] flex flex-col\" variant=\"default\" showCloseButton={false}>\n <DialogHeader className=\"pt-5 pb-3 m-0 border-b border-border\">\n <DialogTitle className=\"px-6 text-base\">\n <div className=\"flex w-full items-center justify-between gap-2\">\n <span>\n Upload Files\n <KbdGroup className=\"ml-2\">\n <Kbd><span className=\"text-lg\">⌘</span> + U</Kbd>\n </KbdGroup>\n </span>\n <Button\n variant=\"outline\"\n size=\"icon\"\n radius=\"full\"\n onClick={() => setIsUploadModalOpen(false)}\n className=\"border-gray-200 bg-white hover:text-red-600 hover:border-red-200 hover:bg-red-50\"\n >\n <CrossIcon className=\"size-5\" />\n <span className=\"hidden\">Close</span>\n </Button>\n </div>\n </DialogTitle>\n <DialogDescription />\n </DialogHeader>\n\n <div className=\"p-6 overflow-y-auto flex-1\">\n {/* Upload Area */}\n <div\n className={cn(\n 'relative rounded-lg border-dashed border-[2.5px] bg-gray-100 border-gray-300 px-6 py-16 text-center transition-colors mb-4',\n isDragging\n ? 'border-primary bg-primary/5'\n : 'border-muted-foreground/25 hover:border-muted-foreground/50',\n )}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n <input {...getInputProps()} className=\"sr-only\" />\n\n <div className=\"flex flex-col items-center\">\n <div\n className={cn(\n 'flex h-12 w-12 items-center justify-center rounded-full transition-colors',\n isDragging ? 'border-primary bg-primary/10' : 'border-muted-foreground/25',\n )}\n >\n <UploadCloudIcon className='mb-3 text-zinc-400 dark:text-zinc-500' />\n </div>\n\n <div className=\"space-y-2\">\n <p className=\"text-sm font-medium\">\n Drop files here or{' '}\n <button\n type=\"button\"\n onClick={openFileDialog}\n className=\"cursor-pointer text-primary underline-offset-4 hover:underline\"\n >\n browse files\n </button>\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {fileTypesDescription} • Max size: {getFileSize(maxUploadSize)} • Max files: {maxUploadFiles}\n </p>\n </div>\n </div>\n </div>\n\n {/* Files Grid */}\n {uploadItems.length > 0 && (\n <div className=\"space-y-4\">\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-3 lg:grid-cols-4\">\n {uploadItems.map((fileItem) => (\n <div key={fileItem.id} className=\"relative group\">\n {/* Remove button */}\n <Button\n onClick={() => removeUploadFile(fileItem.id)}\n variant=\"outline\"\n size=\"icon\"\n className=\"absolute -end-2 -top-2 z-10 size-6 rounded-full opacity-0 transition-opacity group-hover:opacity-100\"\n >\n <CrossIcon className=\"size-3\" />\n </Button>\n\n {/* Wrapper */}\n <div className=\"relative overflow-hidden rounded-lg border bg-card transition-colors\">\n {/* File preview area - uses component registry */}\n <div className=\"relative aspect-square bg-muted border-b border-border\">\n <div className=\"flex h-full items-center justify-center p-4\">\n <div className=\"w-[75%] h-[75%] flex items-center justify-center\">\n {fileItem.status === 'uploading' ? (\n <div className=\"relative w-full h-full flex items-center justify-center\">\n <svg className=\"size-12 -rotate-90 absolute\" viewBox=\"0 0 48 48\">\n <circle\n cx=\"24\"\n cy=\"24\"\n r=\"20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n className=\"text-muted-foreground/20\"\n />\n <circle\n cx=\"24\"\n cy=\"24\"\n r=\"20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeDasharray={`${2 * Math.PI * 20}`}\n strokeDashoffset={`${2 * Math.PI * 20 * (1 - fileItem.progress / 100)}`}\n className=\"text-primary transition-all duration-300\"\n strokeLinecap=\"round\"\n />\n </svg>\n {fileItem.file instanceof File && getFilePreviewComponent(fileItem.file, fileItem.preview)}\n </div>\n ) : (\n fileItem.file instanceof File && getFilePreviewComponent(fileItem.file, fileItem.preview)\n )}\n </div>\n </div>\n </div>\n\n {/* File info footer */}\n <div className=\"p-3\">\n <div className=\"space-y-1\">\n <p className=\"truncate text-xs font-medium\">{fileItem.file.name}</p>\n <div className=\"relative flex items-center justify-between gap-2\">\n <span className=\"text-[11px] text-blue-600 font-medium tracking-tight\">{getFileSize(fileItem.file.size)}</span>\n\n {fileItem.status === 'error' && fileItem.error && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n onClick={() => retryUpload(fileItem.id)}\n variant=\"ghost\"\n size=\"icon\"\n className=\"absolute end-0 -top-1.25 size-6 text-destructive hover:bg-destructive/10 hover:text-destructive\"\n >\n <RefreshCwIcon className=\"size-3 opacity-100\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Upload failed. Retry</TooltipContent>\n </Tooltip>\n )}\n </div>\n </div>\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Error Messages */}\n {errors.length > 0 && (\n <Alert variant=\"destructive\" appearance=\"light\" className=\"mt-5\">\n <AlertIcon>\n <TriangleAlert />\n </AlertIcon>\n <AlertContent>\n <AlertTitle>File upload error(s)</AlertTitle>\n <AlertDescription>\n {errors.map((error, index) => (\n <p key={index} className=\"last:mb-0\">\n {error}\n </p>\n ))}\n </AlertDescription>\n </AlertContent>\n </Alert>\n )}\n </div>\n\n <DialogFooter className=\"px-6 py-4 border-t border-border w-full sm:justify-between justify-center items-center flex-col sm:flex-row gap-2 \">\n <DialogClose asChild>\n <Button type=\"button\" radius=\"full\" variant=\"outline\" onClick={handleClose} className='w-full md:w-auto'>\n Cancel\n </Button>\n </DialogClose>\n <Button type=\"button\" radius=\"full\" onClick={handleUpload} disabled={!canUpload} className='w-full md:w-auto'>\n Upload {completedCount > 0 && `(${completedCount})`}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}","'use client';\n\nimport * as React from 'react';\nimport { cn } from '@/lib/utils';\nimport { cva, VariantProps } from 'class-variance-authority';\nimport { X } from 'lucide-react';\nimport { Dialog as DialogPrimitive } from 'radix-ui';\n\nconst dialogContentVariants = cva(\n 'flex flex-col fixed outline-0 z-50 border border-border bg-background p-6 shadow-lg shadow-black/5 duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 rounded-2xl',\n {\n variants: {\n variant: {\n default: 'left-[50%] top-[50%] max-w-lg translate-x-[-50%] translate-y-[-50%] w-full',\n fullscreen: 'inset-5',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n);\n\nfunction Dialog({ ...props }: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\nfunction DialogTrigger({ ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nfunction DialogPortal({ ...props }: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\nfunction DialogClose({ ...props }: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogOverlay({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n 'fixed inset-0 z-50 bg-black/30 [backdrop-filter:blur(4px)] data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n overlay = true,\n variant,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> &\n VariantProps<typeof dialogContentVariants> & {\n showCloseButton?: boolean;\n overlay?: boolean;\n }) {\n return (\n <DialogPortal>\n {overlay && <DialogOverlay />}\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(dialogContentVariants({ variant }), className)}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogClose className=\"cursor-pointer outline-0 absolute end-5 top-5 rounded-full opacity-60 ring-offset-background transition-opacity hover:opacity-100 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"size-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogClose>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n}\n\nexport default DialogContent;\n\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n data-slot=\"dialog-header\"\n className={cn('flex flex-col space-y-1 text-center sm:text-start mb-5', className)}\n {...props}\n />\n);\n\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n data-slot=\"dialog-footer\"\n className={cn('flex flex-col-reverse sm:flex-row sm:justify-end pt-5 sm:space-x-2.5', className)}\n {...props}\n />\n);\n\nfunction DialogTitle({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn('text-lg font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n );\n}\n\nconst DialogBody = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div data-slot=\"dialog-body\" className={cn('grow', className)} {...props} />\n);\n\nfunction DialogDescription({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n );\n}\n\nexport {\n Dialog,\n DialogBody,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n};\n","import * as React from 'react';\nimport { cn } from '@/lib/utils';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { X } from 'lucide-react';\n\nconst alertVariants = cva('flex items-stretch w-full gap-2 group-[.toaster]:w-(--width)', {\n variants: {\n variant: {\n secondary: '',\n primary: '',\n destructive: '',\n success: '',\n info: '',\n mono: '',\n warning: '',\n },\n icon: {\n primary: '',\n destructive: '',\n success: '',\n info: '',\n warning: '',\n },\n appearance: {\n solid: '',\n outline: '',\n light: '',\n stroke: 'text-foreground',\n },\n size: {\n lg: 'rounded-lg p-4 gap-3 text-base [&>[data-slot=alert-icon]>svg]:size-6 *:data-slot=alert-icon:mt-0.5 [&_[data-slot=alert-close]]:mt-1',\n md: 'rounded-lg p-3.5 gap-2.5 text-sm [&>[data-slot=alert-icon]>svg]:size-5 *:data-slot=alert-icon:mt-0 [&_[data-slot=alert-close]]:mt-0.5',\n sm: 'rounded-md px-3 py-2.5 gap-2 text-xs [&>[data-slot=alert-icon]>svg]:size-4 *:data-alert-icon:mt-0.5 [&_[data-slot=alert-close]]:mt-0.25 [&_[data-slot=alert-close]_svg]:size-3.5',\n },\n },\n compoundVariants: [\n /* Solid */\n {\n variant: 'secondary',\n appearance: 'solid',\n className: 'bg-muted text-foreground',\n },\n {\n variant: 'primary',\n appearance: 'solid',\n className: 'bg-primary text-primary-foreground',\n },\n {\n variant: 'destructive',\n appearance: 'solid',\n className: 'bg-destructive text-destructive-foreground',\n },\n {\n variant: 'success',\n appearance: 'solid',\n className:\n 'bg-[var(--color-success,var(--color-green-500))] text-[var(--color-success-foreground,var(--color-white))]',\n },\n {\n variant: 'info',\n appearance: 'solid',\n className:\n 'bg-[var(--color-info,var(--color-violet-600))] text-[var(--color-info-foreground,var(--color-white))]',\n },\n {\n variant: 'warning',\n appearance: 'solid',\n className:\n 'bg-[var(--color-warning,var(--color-yellow-500))] text-[var(--color-warning-foreground,var(--color-white))]',\n },\n {\n variant: 'mono',\n appearance: 'solid',\n className: 'bg-zinc-950 text-white dark:bg-zinc-300 dark:text-black *:data-slot-[alert=close]:text-white',\n },\n\n /* Outline */\n {\n variant: 'secondary',\n appearance: 'outline',\n className: 'border border-border bg-background text-foreground [&_[data-slot=alert-close]]:text-foreground',\n },\n {\n variant: 'primary',\n appearance: 'outline',\n className: 'border border-border bg-background text-primary [&_[data-slot=alert-close]]:text-foreground',\n },\n {\n variant: 'destructive',\n appearance: 'outline',\n className: 'border border-border bg-background text-destructive [&_[data-slot=alert-close]]:text-foreground',\n },\n {\n variant: 'success',\n appearance: 'outline',\n className:\n 'border border-border bg-background text-[var(--color-success,var(--color-green-500))] [&_[data-slot=alert-close]]:text-foreground',\n },\n {\n variant: 'info',\n appearance: 'outline',\n className:\n 'border border-border bg-background text-[var(--color-info,var(--color-violet-600))] [&_[data-slot=alert-close]]:text-foreground',\n },\n {\n variant: 'warning',\n appearance: 'outline',\n className:\n 'border border-border bg-background text-[var(--color-warning,var(--color-yellow-500))] [&_[data-slot=alert-close]]:text-foreground',\n },\n {\n variant: 'mono',\n appearance: 'outline',\n className: 'border border-border bg-background text-foreground [&_[data-slot=alert-close]]:text-foreground',\n },\n\n /* Light */\n {\n variant: 'secondary',\n appearance: 'light',\n className: 'bg-muted border border-border text-foreground',\n },\n {\n variant: 'primary',\n appearance: 'light',\n className:\n 'text-foreground bg-[var(--color-primary-soft,var(--color-blue-50))] border border-[var(--color-primary-alpha,var(--color-blue-100))] [&_[data-slot=alert-icon]]:text-primary dark:bg-[var(--color-primary-soft,var(--color-blue-950))] dark:border-[var(--color-primary-alpha,var(--color-blue-900))]',\n },\n {\n variant: 'destructive',\n appearance: 'light',\n className:\n 'bg-[var(--color-destructive-soft,var(--color-red-50))] border border-[var(--color-destructive-alpha,var(--color-red-100))] text-foreground [&_[data-slot=alert-icon]]:text-destructive dark:bg-[var(--color-destructive-soft,var(--color-red-950))] dark:border-[var(--color-destructive-alpha,var(--color-red-900))] ',\n },\n {\n variant: 'success',\n appearance: 'light',\n className:\n 'bg-[var(--color-success-soft,var(--color-green-50))] border border-[var(--color-success-alpha,var(--color-green-200))] text-foreground [&_[data-slot=alert-icon]]:text-[var(--color-success-foreground,var(--color-green-600))] dark:bg-[var(--color-success-soft,var(--color-green-950))] dark:border-[var(--color-success-alpha,var(--color-green-900))]',\n },\n {\n variant: 'info',\n appearance: 'light',\n className:\n 'bg-[var(--color-info-soft,var(--color-violet-50))] border border-[var(--color-info-alpha,var(--color-violet-100))] text-foreground [&_[data-slot=alert-icon]]:text-[var(--color-info-foreground,var(--color-violet-600))] dark:bg-[var(--color-info-soft,var(--color-violet-950))] dark:border-[var(--color-info-alpha,var(--color-violet-900))]',\n },\n {\n variant: 'warning',\n appearance: 'light',\n className:\n 'bg-[var(--color-warning-soft,var(--color-yellow-50))] border border-[var(--color-warning-alpha,var(--color-yellow-200))] text-foreground [&_[data-slot=alert-icon]]:text-[var(--color-warning-foreground,var(--color-yellow-600))] dark:bg-[var(--color-warning-soft,var(--color-yellow-950))] dark:border-[var(--color-warning-alpha,var(--color-yellow-900))]',\n },\n\n /* Mono */\n {\n variant: 'mono',\n icon: 'primary',\n className: '[&_[data-slot=alert-icon]]:text-primary',\n },\n {\n variant: 'mono',\n icon: 'warning',\n className: '[&_[data-slot=alert-icon]]:text-[var(--color-warning-foreground,var(--color-yellow-600))]',\n },\n {\n variant: 'mono',\n icon: 'success',\n className: '[&_[data-slot=alert-icon]]:text-[var(--color-success-foreground,var(--color-green-600))]',\n },\n {\n variant: 'mono',\n icon: 'destructive',\n className: '[&_[data-slot=alert-icon]]:text-destructive',\n },\n {\n variant: 'mono',\n icon: 'info',\n className: '[&_[data-slot=alert-icon]]:text-[var(--color-info-foreground,var(--color-violet-600))]',\n },\n ],\n defaultVariants: {\n variant: 'secondary',\n appearance: 'solid',\n size: 'md',\n },\n});\n\ninterface AlertProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof alertVariants> {\n close?: boolean;\n onClose?: () => void;\n}\n\ninterface AlertIconProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof alertVariants> {}\n\nfunction Alert({ className, variant, size, icon, appearance, close = false, onClose, children, ...props }: AlertProps) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant, size, icon, appearance }), className)}\n {...props}\n >\n {children}\n {close && (\n <button\n onClick={onClose}\n aria-label=\"Dismiss\"\n data-slot=\"alert-close\"\n className={cn('group shrink-0 size-4 cursor-pointer')}\n >\n <X className=\"opacity-60 group-hover:opacity-100 size-4\" />\n </button>\n )}\n </div>\n );\n}\n\nfunction AlertTitle({ className, ...props }: React.HTMLAttributes<HTMLHeadingElement>) {\n return <div data-slot=\"alert-title\" className={cn('grow tracking-tight', className)} {...props} />;\n}\n\nfunction AlertIcon({ children, className, ...props }: AlertIconProps) {\n return (\n <div data-slot=\"alert-icon\" className={cn('shrink-0', className)} {...props}>\n {children}\n </div>\n );\n}\n\nfunction AlertToolbar({ children, className, ...props }: AlertIconProps) {\n return (\n <div data-slot=\"alert-toolbar\" className={cn(className)} {...props}>\n {children}\n </div>\n );\n}\n\nfunction AlertDescription({ className, ...props }: React.HTMLAttributes<HTMLParagraphElement>) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn('text-sm [&_p]:leading-relaxed [&_p]:mb-2', className)}\n {...props}\n />\n );\n}\n\nfunction AlertContent({ className, ...props }: React.HTMLAttributes<HTMLParagraphElement>) {\n return (\n <div\n data-slot=\"alert-content\"\n className={cn('space-y-2 [&_[data-slot=alert-title]]:font-semibold', className)}\n {...props}\n />\n );\n}\n\nexport { Alert, AlertContent, AlertDescription, AlertIcon, AlertTitle, AlertToolbar };\n","'use client';\n\nimport * as React from 'react';\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport { cn } from '@/lib/utils';\n\nfunction TooltipProvider({ delayDuration = 0, ...props }: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return <TooltipPrimitive.Provider data-slot=\"tooltip-provider\" delayDuration={delayDuration} {...props} />;\n}\n\nfunction Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return (\n <TooltipProvider>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n </TooltipProvider>\n );\n}\n\nfunction TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n className,\n sideOffset = 0,\n children,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content>) {\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n 'bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance',\n className,\n )}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow className=\"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\" />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };\n","export function getFileSize(bytes: number) {\n if (bytes === 0) return \"0 Bytes\";\n const k = 1024;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return (\n Number.parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i]\n );\n}","'use client';\n\nimport { getFileSize } from '@/lib/file-size';\nimport { FileMetaData, EntityId as FileEntityId } from '@/types/file-manager';\nimport type React from 'react';\nimport { useCallback, useRef, useState, useEffect, type ChangeEvent, type DragEvent, type InputHTMLAttributes } from 'react';\n\n// Re-export EntityId for convenience\nexport type EntityId = FileEntityId;\n\n// Simplified metadata for upload UI - subset of FileMetaData\nexport type FileMetadata = Pick<FileMetaData, 'id' | 'name' | 'size' | 'url'> & {\n type: string; // mime type\n};\n\nexport type FileWithPreview = {\n file: File | FileMetadata;\n id: EntityId;\n preview?: string;\n};\n\n// File upload item with progress tracking (for UI)\nexport interface FileUploadItem {\n id: string | number;\n file: File | any; // Support both File and FileMetadata\n preview?: string;\n progress: number;\n status: 'uploading' | 'completed' | 'error';\n error?: string;\n}\n\nexport type FileUploadOptions = {\n maxFiles?: number; // Only used when multiple is true, defaults to Infinity\n maxSize?: number; // in bytes\n accept?: string;\n multiple?: boolean; // Defaults to false\n initialFiles?: FileMetadata[];\n onFilesChange?: (files: FileWithPreview[]) => void; // Callback when files change\n onFilesAdded?: (addedFiles: FileWithPreview[]) => void; // Callback when new files are added\n onError?: (errors: string[]) => void;\n};\n\nexport type FileUploadState = {\n files: FileWithPreview[];\n isDragging: boolean;\n errors: string[];\n};\n\nexport type FileUploadActions = {\n addFiles: (files: FileList | File[]) => void;\n removeFile: (id: EntityId) => void;\n clearFiles: () => void;\n clearErrors: () => void;\n handleDragEnter: (e: DragEvent<HTMLElement>) => void;\n handleDragLeave: (e: DragEvent<HTMLElement>) => void;\n handleDragOver: (e: DragEvent<HTMLElement>) => void;\n handleDrop: (e: DragEvent<HTMLElement>) => void;\n handleFileChange: (e: ChangeEvent<HTMLInputElement>) => void;\n openFileDialog: () => void;\n getInputProps: (props?: InputHTMLAttributes<HTMLInputElement>) => InputHTMLAttributes<HTMLInputElement> & {\n ref: React.Ref<HTMLInputElement>;\n };\n};\n\nexport const useFileUpload = (options: FileUploadOptions = {}): [FileUploadState, FileUploadActions] => {\n const {\n maxFiles = Number.POSITIVE_INFINITY,\n maxSize = Number.POSITIVE_INFINITY,\n accept = '*',\n multiple = false,\n initialFiles = [],\n onFilesChange,\n onFilesAdded,\n onError,\n } = options;\n\n const [state, setState] = useState<FileUploadState>({\n files: initialFiles.map((file) => ({\n file,\n id: file.id,\n preview: file.url,\n })),\n isDragging: false,\n errors: [],\n });\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Cleanup object URLs on unmount to prevent memory leaks\n useEffect(() => {\n return () => {\n // Revoke all object URLs when component unmounts\n state.files.forEach(file => {\n if (file.preview && file.file instanceof File) {\n URL.revokeObjectURL(file.preview);\n }\n });\n };\n }, [state.files]);\n\n const validateFile = useCallback(\n (file: File | FileMetadata): string | null => {\n if (file instanceof File) {\n if (file.size > maxSize) {\n return `File \"${file.name}\" exceeds the maximum size of ${getFileSize(maxSize)}.`;\n }\n } else {\n if (file.size > maxSize) {\n return `File \"${file.name}\" exceeds the maximum size of ${getFileSize(maxSize)}.`;\n }\n }\n\n if (accept !== '*') {\n const acceptedTypes = accept.split(',').map((type) => type.trim());\n const fileType = file instanceof File ? file.type || '' : file.type;\n const fileExtension = `.${file instanceof File ? file.name.split('.').pop() : file.name.split('.').pop()}`;\n\n const isAccepted = acceptedTypes.some((type) => {\n if (type.startsWith('.')) {\n return fileExtension.toLowerCase() === type.toLowerCase();\n }\n if (type.endsWith('/*')) {\n const baseType = type.split('/')[0];\n return fileType.startsWith(`${baseType}/`);\n }\n return fileType === type;\n });\n\n if (!isAccepted) {\n return `File \"${file instanceof File ? file.name : file.name}\" is not an accepted file type.`;\n }\n }\n\n return null;\n },\n [accept, maxSize],\n );\n\n const createPreview = useCallback((file: File | FileMetadata): string | undefined => {\n if (file instanceof File) {\n return URL.createObjectURL(file);\n }\n return file.url;\n }, []);\n\n const generateUniqueId = useCallback((file: File | FileMetadata): EntityId => {\n if (file instanceof File) {\n return `${file.name}-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n }\n return file.id.toString();\n }, []);\n\n const clearFiles = useCallback(() => {\n setState((prev) => {\n // Clean up object URLs\n for (const file of prev.files) {\n if (file.preview && file.file instanceof File && file.file.type.startsWith('image/')) {\n URL.revokeObjectURL(file.preview);\n }\n }\n\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n\n const newState = {\n ...prev,\n files: [],\n errors: [],\n };\n\n onFilesChange?.(newState.files);\n return newState;\n });\n }, [onFilesChange]);\n\n const addFiles = useCallback(\n (newFiles: FileList | File[]) => {\n if (!newFiles || newFiles.length === 0) return;\n\n const newFilesArray = Array.from(newFiles);\n const errors: string[] = [];\n\n // Clear existing errors when new files are uploaded\n setState((prev) => ({ ...prev, errors: [] }));\n\n // In single file mode, clear existing files first\n if (!multiple) {\n clearFiles();\n }\n\n setState((prev) => {\n // Check if adding these files would exceed maxFiles (only in multiple mode)\n if (multiple && maxFiles !== Number.POSITIVE_INFINITY && prev.files.length + newFilesArray.length > maxFiles) {\n errors.push(`You can only upload a maximum of ${maxFiles} files.`);\n onError?.(errors);\n return { ...prev, errors };\n }\n\n const validFiles: FileWithPreview[] = [];\n\n for (const file of newFilesArray) {\n // Only check for duplicates if multiple files are allowed\n if (multiple) {\n const isDuplicate = prev.files.some(\n (existingFile) => existingFile.file.name === file.name && existingFile.file.size === file.size,\n );\n\n // Skip duplicate files silently\n if (isDuplicate) {\n continue;\n }\n }\n\n // Check file size\n if (file.size > maxSize) {\n errors.push(\n multiple\n ? `Some files exceed the maximum size of ${getFileSize(maxSize)}.`\n : `File exceeds the maximum size of ${getFileSize(maxSize)}.`,\n );\n continue;\n }\n\n const error = validateFile(file);\n if (error) {\n errors.push(error);\n } else {\n validFiles.push({\n file,\n id: generateUniqueId(file),\n preview: createPreview(file),\n });\n }\n }\n\n // Only update state if we have valid files to add\n if (validFiles.length > 0) {\n // Call the onFilesAdded callback with the newly added valid files\n onFilesAdded?.(validFiles);\n\n const newFiles = !multiple ? validFiles : [...prev.files, ...validFiles];\n onFilesChange?.(newFiles);\n return {\n ...prev,\n files: newFiles,\n errors,\n };\n } else if (errors.length > 0) {\n onError?.(errors);\n return {\n ...prev,\n errors,\n };\n }\n\n return prev;\n });\n\n // Reset input value after handling files\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n },\n [\n maxFiles,\n multiple,\n maxSize,\n validateFile,\n createPreview,\n generateUniqueId,\n clearFiles,\n onFilesChange,\n onFilesAdded,\n onError,\n ],\n );\n\n const removeFile = useCallback(\n (id: EntityId) => {\n setState((prev) => {\n const fileToRemove = prev.files.find((file) => file.id === id);\n if (\n fileToRemove &&\n fileToRemove.preview &&\n fileToRemove.file instanceof File &&\n fileToRemove.file.type.startsWith('image/')\n ) {\n URL.revokeObjectURL(fileToRemove.preview);\n }\n\n const newFiles = prev.files.filter((file) => file.id !== id);\n onFilesChange?.(newFiles);\n\n return {\n ...prev,\n files: newFiles,\n errors: [],\n };\n });\n },\n [onFilesChange],\n );\n\n const clearErrors = useCallback(() => {\n setState((prev) => ({\n ...prev,\n errors: [],\n }));\n }, []);\n\n const handleDragEnter = useCallback((e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setState((prev) => ({ ...prev, isDragging: true }));\n }, []);\n\n const handleDragLeave = useCallback((e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (e.currentTarget.contains(e.relatedTarget as Node)) {\n return;\n }\n\n setState((prev) => ({ ...prev, isDragging: false }));\n }, []);\n\n const handleDragOver = useCallback((e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n const handleDrop = useCallback(\n (e: DragEvent<HTMLElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setState((prev) => ({ ...prev, isDragging: false }));\n\n // Don't process files if the input is disabled\n if (inputRef.current?.disabled) {\n return;\n }\n\n if (e.dataTransfer.files && e.dataTransfer.files.length > 0) {\n // In single file mode, only use the first file\n if (!multiple) {\n const file = e.dataTransfer.files[0];\n addFiles([file]);\n } else {\n addFiles(e.dataTransfer.files);\n }\n }\n },\n [addFiles, multiple],\n );\n\n const handleFileChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n if (e.target.files && e.target.files.length > 0) {\n addFiles(e.target.files);\n }\n },\n [addFiles],\n );\n\n const openFileDialog = useCallback(() => {\n if (inputRef.current) {\n inputRef.current.click();\n }\n }, []);\n\n const getInputProps = useCallback(\n (props: InputHTMLAttributes<HTMLInputElement> = {}) => {\n return {\n ...props,\n type: 'file' as const,\n onChange: handleFileChange,\n accept: props.accept || accept,\n multiple: props.multiple !== undefined ? props.multiple : multiple,\n ref: inputRef,\n };\n },\n [accept, multiple, handleFileChange],\n );\n\n return [\n state,\n {\n addFiles,\n removeFile,\n clearFiles,\n clearErrors,\n handleDragEnter,\n handleDragLeave,\n handleDragOver,\n handleDrop,\n handleFileChange,\n openFileDialog,\n getInputProps,\n },\n ];\n};\n\n","import mime from 'mime';\nimport { FileType, FILE_TYPE } from '@/types/file-manager';\nimport {\n PdfIcon,\n ExcelIcon,\n PptIcon,\n DocIcon,\n TextDocIcon,\n FileIcon,\n ZipIcon,\n JsonIcon,\n MusicIcon,\n RarIcon,\n ExeIcon,\n ImageIcon,\n VideoIcon,\n FolderWithFilesIcon,\n EmptyFolderIcon,\n} from \"@/components/icons\";\n\n/**\n * File Utilities\n * Consolidated module for file type detection, icon selection, and MIME type handling\n */\n\n/**\n * Determines the FileType category based on MIME type and file extension\n * @param mimeType - MIME type of the file (e.g., \"image/jpeg\", \"video/mp4\")\n * @param extension - File extension (e.g., \".jpg\", \"jpg\")\n * @returns The corresponding FileType (IMAGE, VIDEO, AUDIO, or FILE)\n */\nexport function getFileTypeFromMime(mimeType: string, extension?: string): FileType {\n // Defensive check: ensure mimeType is a string\n if (typeof mimeType !== 'string') {\n console.warn('getFileTypeFromMime: mimeType is not a string:', mimeType);\n return FILE_TYPE.FILE;\n }\n\n let effectiveMime = mimeType;\n \n // If extension is provided, use it to get accurate MIME type\n if (extension) {\n const ext = extension.toLowerCase().replace(/^\\./, '');\n const detectedMime = mime.getType(ext);\n if (detectedMime) {\n effectiveMime = detectedMime;\n }\n }\n \n // Check main MIME type categories\n if (effectiveMime.startsWith('image/')) {\n return FILE_TYPE.IMAGE;\n }\n \n if (effectiveMime.startsWith('video/')) {\n return FILE_TYPE.VIDEO;\n }\n \n if (effectiveMime.startsWith('audio/')) {\n return FILE_TYPE.AUDIO;\n }\n \n // Everything else is a file/document\n return FILE_TYPE.FILE;\n}\n\n/**\n * Determines the specific icon type to display based on MIME type and file extension\n * Returns specific types for icon rendering (pdf, excel, zip, etc.)\n * @param mimeType - MIME type of the file\n * @param extension - File extension\n * @returns Icon type string\n */\nexport function getIconType(mimeType: string, extension?: string): string {\n let effectiveMime = mimeType;\n \n // If extension is provided, use mime library to get accurate MIME type\n if (extension) {\n const ext = extension.toLowerCase().replace(/^\\./, '');\n const detectedMime = mime.getType(ext);\n if (detectedMime) {\n effectiveMime = detectedMime;\n }\n }\n \n // Media types (broad categories)\n if (effectiveMime.startsWith('image/')) {\n return 'image';\n }\n \n if (effectiveMime.startsWith('video/')) {\n return 'video';\n }\n \n if (effectiveMime.startsWith('audio/')) {\n return 'audio';\n }\n \n // Specific document types\n switch (effectiveMime) {\n case 'application/pdf':\n return 'pdf';\n \n case 'application/json':\n return 'json';\n \n // Archives\n case 'application/zip':\n case 'application/x-zip-compressed':\n return 'zip';\n \n case 'application/x-rar-compressed':\n case 'application/vnd.rar':\n return 'rar';\n \n // Executables\n case 'application/x-msdownload':\n case 'application/x-executable':\n return 'exe';\n \n // Microsoft Office - Excel\n case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':\n case 'application/vnd.ms-excel':\n case 'text/csv': // CSV files are spreadsheets\n return 'excel';\n \n // Microsoft Office - PowerPoint\n case 'application/vnd.openxmlformats-officedocument.presentationml.presentation':\n case 'application/vnd.ms-powerpoint':\n return 'powerpoint';\n \n // Microsoft Office - Word\n case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document':\n case 'application/msword':\n return 'document';\n }\n \n // Text files\n if (effectiveMime.startsWith('text/')) {\n return 'txt';\n }\n \n // Extension-based fallback for files that mime library doesn't handle well\n if (extension) {\n const ext = extension.toLowerCase().replace(/^\\./, '');\n \n switch (ext) {\n case 'exe':\n case 'msi':\n return 'exe';\n case 'zip':\n return 'zip';\n case 'rar':\n return 'rar';\n case 'pdf':\n return 'pdf';\n case 'csv':\n return 'excel';\n }\n }\n \n // Default fallback\n return 'file';\n}\n\n/**\n * Gets the React icon component for a given icon type\n * @param type - Icon type (e.g., 'pdf', 'image', 'folder')\n * @param className - Optional CSS class name\n * @param props - Additional props to pass to the icon component\n * @returns React icon component\n */\nexport const Icons = ({ type, className, ...props }: { type: string, className?: string }) => {\n switch (type) {\n case \"folder-with-files\":\n return <FolderWithFilesIcon className={className} {...props} />;\n case \"folder\":\n return <EmptyFolderIcon className={className} {...props} />;\n case \"image\":\n return <ImageIcon className={className} {...props} />;\n case \"video\":\n return <VideoIcon className={className} {...props} />;\n case \"audio\":\n return <MusicIcon className={className} {...props} />;\n case \"pdf\":\n return <PdfIcon className={className} {...props} />;\n case \"excel\":\n case \"xlsx\":\n return <ExcelIcon className={className} {...props} />;\n case \"powerpoint\":\n case \"pptx\":\n return <PptIcon className={className} {...props} />;\n case \"document\":\n case \"docx\":\n case \"doc\":\n return <DocIcon className={className} {...props} />;\n case \"txt\":\n return <TextDocIcon className={className} {...props} />;\n case \"json\":\n return <JsonIcon className={className} {...props} />;\n case \"zip\":\n return <ZipIcon className={className} {...props} />;\n case \"rar\":\n return <RarIcon className={className} {...props} />;\n case \"exe\":\n return <ExeIcon className={className} {...props} />;\n default:\n return <FileIcon className={className} {...props} />;\n }\n};\n\n/**\n * Converts FileType array to MIME type accept string for file input\n * @param fileTypes - Array of FileType values\n * @returns Accept string for file input (e.g., \"image/*,video/*\")\n */\nexport function fileTypesToAccept(fileTypes?: FileType[]): string {\n if (!fileTypes || fileTypes.length === 0) {\n return '*/*';\n }\n\n const mimeTypes: string[] = [];\n\n for (const fileType of fileTypes) {\n switch (fileType) {\n case FILE_TYPE.IMAGE:\n mimeTypes.push('image/*');\n break;\n case FILE_TYPE.VIDEO:\n mimeTypes.push('video/*');\n break;\n case FILE_TYPE.AUDIO:\n mimeTypes.push('audio/*');\n break;\n case FILE_TYPE.FILE:\n // Accept common document, text, and archive types\n mimeTypes.push(\n 'application/*', // All application types (PDF, Office, archives, etc.)\n 'text/*' // All text types\n );\n break;\n }\n }\n\n return mimeTypes.join(',');\n}\n\n/**\n * Gets a human-readable description of allowed file types\n * @param fileTypes - Array of FileType values\n * @returns Human-readable string (e.g., \"Images, Videos\")\n */\nexport function getFileTypesDescription(fileTypes?: FileType[]): string {\n if (!fileTypes || fileTypes.length === 0) {\n return 'All files';\n }\n\n const descriptions: string[] = [];\n\n for (const fileType of fileTypes) {\n switch (fileType) {\n case FILE_TYPE.IMAGE:\n descriptions.push('Images');\n break;\n case FILE_TYPE.VIDEO:\n descriptions.push('Videos');\n break;\n case FILE_TYPE.AUDIO:\n descriptions.push('Audio');\n break;\n case FILE_TYPE.FILE:\n descriptions.push('Files');\n break;\n }\n }\n\n return descriptions.join(', ');\n}\n","\n'use client'\nexport default function PdfIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n imageRendering=\"optimizeQuality\"\n shapeRendering=\"geometricPrecision\"\n textRendering=\"geometricPrecision\"\n viewBox=\"0 0 29.93 40.02\"\n width=\"100\"\n height=\"100\"\n {...props}\n >\n <path fill=\"#e5252a\" d=\"M5.21 0l13.38 0 11.34 11.82 0 22.99c0,2.88 -2.33,5.21 -5.2,5.21l-19.52 0c-2.88,0 -5.21,-2.33 -5.21,-5.21l0 -29.6c0,-2.88 2.33,-5.21 5.21,-5.21z\" ></path><polygon fill=\"#fff\" fillOpacity=\".302\" points=\"18.58 0 18.58 11.73 29.93 11.73\"></polygon><path fill=\"#fff\" fillRule=\"nonzero\" d=\"M5.79 29.86l0 -7.31 3.11 0c0.77,0 1.38,0.21 1.84,0.64 0.46,0.42 0.69,0.99 0.69,1.7 0,0.71 -0.23,1.28 -0.69,1.7 -0.46,0.43 -1.07,0.64 -1.84,0.64l-1.24 0 0 2.63 -1.87 0zm1.87 -4.22l1.03 0c0.28,0 0.5,-0.06 0.65,-0.2 0.15,-0.13 0.23,-0.31 0.23,-0.55 0,-0.24 -0.08,-0.42 -0.23,-0.55 -0.15,-0.14 -0.37,-0.2 -0.65,-0.2l-1.03 0 0 1.5zm4.54 4.22l0 -7.31 2.59 0c0.51,0 0.99,0.07 1.44,0.22 0.45,0.15 0.86,0.36 1.22,0.65 0.36,0.28 0.65,0.66 0.86,1.14 0.2,0.48 0.31,1.03 0.31,1.65 0,0.61 -0.11,1.16 -0.31,1.64 -0.21,0.48 -0.5,0.86 -0.86,1.14 -0.36,0.29 -0.77,0.5 -1.22,0.65 -0.45,0.15 -0.93,0.22 -1.44,0.22l-2.59 0zm1.83 -1.59l0.54 0c0.29,0 0.56,-0.03 0.81,-0.1 0.24,-0.07 0.47,-0.18 0.69,-0.33 0.21,-0.15 0.38,-0.36 0.5,-0.64 0.12,-0.28 0.18,-0.61 0.18,-0.99 0,-0.39 -0.06,-0.72 -0.18,-1 -0.12,-0.28 -0.29,-0.49 -0.5,-0.64 -0.22,-0.15 -0.45,-0.26 -0.69,-0.33 -0.25,-0.07 -0.52,-0.1 -0.81,-0.1l-0.54 0 0 4.13zm5.53 1.59l0 -7.31 5.2 0 0 1.59 -3.33 0 0 1.17 2.66 0 0 1.58 -2.66 0 0 2.97 -1.87 0z\" >\n </path>\n </svg>\n\n );\n}\n\n\n\n","'use client'\nexport default function ExcelIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n \n <svg \n xmlns=\"http://www.w3.org/2000/svg\" \n fillRule=\"evenodd\" \n clipRule=\"evenodd\" \n imageRendering=\"optimizeQuality\" \n shapeRendering=\"geometricPrecision\" \n textRendering=\"geometricPrecision\" \n viewBox=\"0 0 17.69 23.65\" \n width=\"100\" \n height=\"100\"\n {...props}\n ><path fill=\"#00733b\" d=\"M3.08 0l7.91 0 6.7 6.99 0 13.58c0,1.7 -1.38,3.08 -3.08,3.08l-11.53 0c-1.7,0 -3.08,-1.38 -3.08,-3.08l0 -17.49c0,-1.7 1.38,-3.08 3.08,-3.08z\" ></path><polygon fill=\"#fff\" fillOpacity=\".302\" points=\"10.98 0 10.98 6.93 17.69 6.93\"></polygon><path fill=\"#fff\" d=\"M5.21 17.35l3.14 0 0 1.19 -3.14 0 0 -1.19zm4.12 -6.08l3.15 0 0 1.18 -3.15 0 0 -1.18zm-4.12 0l3.14 0 0 1.18 -3.14 0 0 -1.18zm4.12 2l3.15 0 0 1.19 -3.15 0 0 -1.19zm-4.12 0l3.14 0 0 1.19 -3.14 0 0 -1.19zm4.12 2.08l3.15 0 0 1.19 -3.15 0 0 -1.19zm-4.12 0l3.14 0 0 1.19 -3.14 0 0 -1.19zm4.12 2l3.15 0 0 1.19 -3.15 0 0 -1.19z\"></path></svg>\n \n );\n}\n\n\n\n","\n\n'use client'\nexport default function PptIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n\n <svg \n xmlns=\"http://www.w3.org/2000/svg\" \n fillRule=\"evenodd\" \n clipRule=\"evenodd\" \n imageRendering=\"optimizeQuality\" \n shapeRendering=\"geometricPrecision\" \n textRendering=\"geometricPrecision\" \n viewBox=\"0 0 24.33 32.53\" \n width=\"100\" \n height=\"100\"\n {...props}\n ><path fill=\"#e03303\" d=\"M4.23 0l10.88 0 9.22 9.61 0 18.69c0,2.33 -1.9,4.23 -4.23,4.23l-15.87 0c-2.34,0 -4.23,-1.9 -4.23,-4.23l0 -24.07c0,-2.34 1.89,-4.23 4.23,-4.23z\" ></path><polygon fill=\"#fff\" fillOpacity=\".302\" points=\"15.1 0 15.1 9.53 24.33 9.53\"></polygon><path fill=\"#fff\" fillRule=\"nonzero\" d=\"M11.76 16.13c-2.44,0.12 -4.38,2.15 -4.35,4.62 0.04,2.46 2.04,4.47 4.5,4.5 2.48,0.04 4.51,-1.9 4.62,-4.34 0.01,-0.12 -0.09,-0.22 -0.21,-0.22l-4.13 0c-0.12,0 -0.22,-0.1 -0.22,-0.21l0 -4.14c0,-0.12 -0.09,-0.21 -0.21,-0.21zm1.1 -0.67l0 4.13c0,0.12 0.09,0.21 0.21,0.21l4.14 0c0.12,0 0.21,-0.1 0.21,-0.22 -0.11,-2.34 -1.99,-4.22 -4.34,-4.33 -0.12,-0.01 -0.22,0.09 -0.22,0.21z\" ></path></svg>\n\n );\n}\n\n\n\n","'use client'\n\nexport default function DocIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n imageRendering=\"optimizeQuality\"\n shapeRendering=\"geometricPrecision\"\n textRendering=\"geometricPrecision\"\n viewBox=\"0 0 38.89 51.99\"\n width=\"100\"\n height=\"100\"\n {...props}\n >\n <path fill=\"#0263d1\" fillRule=\"nonzero\" d=\"M6.76 0l17.4 0 14.73 15.36 0 29.87c0,3.73 -3.03,6.76 -6.77,6.76l-25.36 0c-3.73,0 -6.76,-3.03 -6.76,-6.76l0 -38.47c0,-3.73 3.03,-6.76 6.76,-6.76z\" />\n <polygon fill=\"#fff\" fillOpacity=\".302\" points=\"24.14 0 24.14 15.24 38.89 15.24\"></polygon>\n <path fill=\"#fff\" fillRule=\"nonzero\" d=\"M26.3 27.05l-13.71 0c-0.63,0 -1.15,-0.51 -1.15,-1.14 0,-0.63 0.52,-1.14 1.15,-1.14l13.71 0c0.63,0 1.14,0.51 1.14,1.14 0,0.63 -0.51,1.14 -1.14,1.14l0 0zm-4.57 13.71l-9.14 0c-0.63,0 -1.15,-0.51 -1.15,-1.14 0,-0.63 0.52,-1.14 1.15,-1.14l9.14 0c0.63,0 1.14,0.51 1.14,1.14 0,0.63 -0.51,1.14 -1.14,1.14l0 0zm4.57 -4.57l-13.71 0c-0.63,0 -1.15,-0.51 -1.15,-1.14 0,-0.63 0.52,-1.14 1.15,-1.14l13.71 0c0.63,0 1.14,0.51 1.14,1.14 0,0.63 -0.51,1.14 -1.14,1.14l0 0zm0 -4.57l-13.71 0c-0.63,0 -1.15,-0.51 -1.15,-1.14 0,-0.63 0.52,-1.14 1.15,-1.14l13.71 0c0.63,0 1.14,0.51 1.14,1.14 0,0.63 -0.51,1.14 -1.14,1.14l0 0z\" ></path></svg>\n );\n}\n","'use client'\n\nexport default function TextDocIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n <svg \n xmlns=\"http://www.w3.org/2000/svg\" \n fillRule=\"evenodd\" \n clipRule=\"evenodd\" \n imageRendering=\"optimizeQuality\" \n shapeRendering=\"geometricPrecision\" \n textRendering=\"geometricPrecision\" \n viewBox=\"0 0 24.33 32.53\" \n width=\"100\" \n height=\"100\"\n {...props}\n ><path fill=\"#ffc000\" d=\"M4.23 0l10.88 0 9.22 9.61 0 18.69c0,2.33 -1.9,4.23 -4.23,4.23l-15.87 0c-2.34,0 -4.23,-1.9 -4.23,-4.23l0 -24.07c0,-2.34 1.89,-4.23 4.23,-4.23z\" ></path><polygon fill=\"#ffffff\" fillOpacity=\".302\" points=\"15.1 0 15.1 9.53 24.33 9.53\"></polygon><path fill=\"#ffffff\" fillRule=\"nonzero\" d=\"M16.45 21.21l-8.57 0c-0.4,0 -0.72,0.32 -0.72,0.72 0,0.39 0.32,0.71 0.72,0.71l8.57 0c0.4,0 0.72,-0.32 0.72,-0.71 0,-0.4 -0.32,-0.72 -0.72,-0.72l0 0zm0 2.86l-8.57 0c-0.4,0 -0.72,0.32 -0.72,0.72 0,0.39 0.32,0.71 0.72,0.71l8.57 0c0.4,0 0.72,-0.32 0.72,-0.71 0,-0.4 -0.32,-0.72 -0.72,-0.72l0 0zm-4.36 -8.57l-4.21 0c-0.4,0 -0.72,0.31 -0.72,0.71 0,0.4 0.32,0.71 0.72,0.71l4.21 0c0.4,0 0.72,-0.31 0.72,-0.71 0,-0.4 -0.32,-0.71 -0.72,-0.71l0 0zm4.36 2.85l-8.57 0c-0.4,0 -0.72,0.32 -0.72,0.72 0,0.39 0.32,0.71 0.72,0.71l8.57 0c0.4,0 0.72,-0.32 0.72,-0.71 0,-0.4 -0.32,-0.72 -0.72,-0.72l0 0z\" ></path></svg>\n );\n}\n","'use client'\n\nexport default function FileIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n x=\"0px\"\n y=\"0px\"\n width=\"100\"\n height=\"100\"\n viewBox=\"0 0 48 48\"\n aria-hidden=\"true\"\n {...props}\n >\n <linearGradient id=\"X-uD4Bgl9JIhUIufrZZzja_Pjo0BrMdm974_gr1\" x1=\"37.127\" x2=\"25.868\" y1=\"6.873\" y2=\"18.132\" gradientUnits=\"userSpaceOnUse\">\n <stop offset=\"0\" stopColor=\"#262626\" stopOpacity=\"0\">\n </stop>\n <stop offset=\".913\" stopColor=\"#262626\" stopOpacity=\".8\">\n </stop>\n </linearGradient>\n <path fill=\"url(#X-uD4Bgl9JIhUIufrZZzja_Pjo0BrMdm974_gr1)\" d=\"M28,4v8c0,2.209,1.791,4,4,4h8L28,4z\"> </path>\n <linearGradient id=\"X-uD4Bgl9JIhUIufrZZzjb_Pjo0BrMdm974_gr2\" x1=\"-8.398\" x2=\"74.731\" y1=\"51.185\" y2=\"-18.568\" gradientUnits=\"userSpaceOnUse\">\n <stop offset=\"0\" stopColor=\"#262626\" stopOpacity=\"0\"></stop>\n <stop offset=\"1\" stopColor=\"#262626\" stopOpacity=\".8\"></stop>\n </linearGradient>\n <path fill=\"url(#X-uD4Bgl9JIhUIufrZZzjb_Pjo0BrMdm974_gr2)\" d=\"M40,16v23c0,2.761-2.239,5-5,5H8V9c0-2.761,2.239-5,5-5h15L40,16z\"></path>\n </svg>\n\n\n );\n}\n","'use client'\n\nexport default function ZipIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n imageRendering=\"optimizeQuality\"\n shapeRendering=\"geometricPrecision\"\n textRendering=\"geometricPrecision\"\n viewBox=\"0 0 24.33 32.53\"\n width=\"100\"\n height=\"100\"\n aria-hidden=\"true\"\n {...props}\n >\n <path fill=\"#ffb11f\" d=\"M4.23 0l10.88 0 9.22 9.61 0 18.69c0,2.33 -1.9,4.23 -4.23,4.23l-15.87 0c-2.34,0 -4.23,-1.9 -4.23,-4.23l0 -24.07c0,-2.34 1.89,-4.23 4.23,-4.23z\"></path>\n <polygon fill=\"#fff\" fillOpacity=\".302\" points=\"15.1 0 15.1 9.53 24.33 9.53\"></polygon>\n <path fill=\"#fff\" fillRule=\"nonzero\" d=\"M8.96 16.9l0 -2.22c0,-0.24 -0.19,-0.43 -0.43,-0.43l-1.2 0c-0.24,0 -0.43,0.19 -0.43,0.43l0 2.22 -0.67 1.96c-0.19,0.55 -0.1,1.16 0.24,1.63 0.33,0.47 0.88,0.75 1.46,0.75 0.58,0 1.12,-0.28 1.46,-0.75 0.34,-0.47 0.43,-1.08 0.24,-1.63l-0.67 -1.96zm-0.28 3.08c-0.34,0.49 -1.16,0.49 -1.51,0 -0.17,-0.24 -0.22,-0.56 -0.12,-0.84l0.22 -0.66 1.31 0 0.23 0.66c0.09,0.28 0.05,0.6 -0.13,0.84zm-3.41 -17.65l0 1.22c0,0.24 0.19,0.43 0.43,0.43l1.63 0 0 1.82 -1.63 0c-0.24,0 -0.43,0.19 -0.43,0.43l0 0.94c0,0.24 0.19,0.44 0.43,0.44l1.63 0 0 1.81 -1.63 0c-0.24,0 -0.43,0.19 -0.43,0.43l0 0.95c0,0.24 0.19,0.43 0.43,0.43l1.63 0 0 1.38c0,0.24 0.2,0.43 0.44,0.43l2.39 0c0.23,0 0.43,-0.19 0.43,-0.43l0 -0.95c0,-0.23 -0.2,-0.43 -0.43,-0.43l-1.64 0 0 -1.81 1.64 0c0.23,0 0.43,-0.19 0.43,-0.43l0 -0.95c0,-0.24 -0.2,-0.43 -0.43,-0.43l-1.64 0 0 -1.81 1.64 0c0.23,0 0.43,-0.2 0.43,-0.44l0 -0.94c0,-0.24 -0.2,-0.44 -0.43,-0.44l-1.64 0 0 -1.66c0,0 -3.25,0.01 -3.25,0.01z\">\n </path>\n </svg>\n );\n}\n","\n\n'use client'\n\nexport default function JsonIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n imageRendering=\"optimizeQuality\"\n shapeRendering=\"geometricPrecision\"\n textRendering=\"geometricPrecision\"\n viewBox=\"0 0 20.49 27.4\"\n width=\"100\"\n height=\"100\"\n aria-hidden=\"true\"\n {...props}\n >\n <path fill=\"#00a1e0\" d=\"M3.56 0l9.17 0 7.76 8.1 0 15.73c0,1.97 -1.59,3.57 -3.56,3.57l-13.37 0c-1.96,0 -3.56,-1.6 -3.56,-3.57l0 -20.27c0,-1.96 1.6,-3.56 3.56,-3.56z\"></path>\n <polygon fill=\"#fff\" fillOpacity=\".302\" points=\"12.72 0 12.72 8.03 20.49 8.03\"></polygon>\n <path fill=\"#fff\" fillRule=\"nonzero\" d=\"M12.07 20.44l-0.52 0 0 -0.99 0.11 0c0.26,0 0.39,-0.14 0.39,-0.42l0 -1.45c0,-0.23 0.06,-0.41 0.16,-0.53 0.11,-0.11 0.27,-0.21 0.48,-0.3 -0.2,-0.08 -0.36,-0.18 -0.47,-0.3 -0.11,-0.12 -0.17,-0.29 -0.17,-0.52l0 -1.45c0,-0.28 -0.13,-0.42 -0.39,-0.42l-0.11 0 0 -0.99 0.52 0c0.31,0 0.56,0.1 0.76,0.3 0.2,0.2 0.3,0.45 0.3,0.75l0 1.55c0,0.38 0.21,0.57 0.63,0.57l0 1.03c-0.42,0 -0.63,0.19 -0.63,0.58l0 1.54c0,0.3 -0.1,0.55 -0.3,0.75 -0.2,0.2 -0.45,0.3 -0.76,0.3zm-3.65 0c-0.3,0 -0.56,-0.1 -0.76,-0.3 -0.2,-0.2 -0.3,-0.45 -0.3,-0.75l0 -1.54c0,-0.39 -0.21,-0.58 -0.63,-0.58l0 -1.03c0.42,0 0.63,-0.19 0.63,-0.57l0 -1.55c0,-0.3 0.1,-0.55 0.3,-0.75 0.2,-0.2 0.46,-0.3 0.76,-0.3l0.53 0 0 0.99 -0.12 0c-0.26,0 -0.39,0.14 -0.39,0.42l0 1.45c0,0.23 -0.05,0.4 -0.16,0.52 -0.11,0.12 -0.27,0.22 -0.48,0.3 0.21,0.09 0.37,0.19 0.48,0.3 0.11,0.12 0.16,0.3 0.16,0.53l0 1.45c0,0.28 0.13,0.42 0.39,0.42l0.12 0 0 0.99 -0.53 0z\"></path>\n </svg>\n\n\n );\n}\n","'use client'\nexport default function MusicIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n imageRendering=\"optimizeQuality\"\n shapeRendering=\"geometricPrecision\"\n textRendering=\"geometricPrecision\"\n viewBox=\"0 0 24.33 32.53\"\n width=\"100\"\n height=\"100\"\n {...props}\n ><path fill=\"#90c\" d=\"M4.23 0l10.88 0 9.22 9.61 0 18.69c0,2.33 -1.9,4.23 -4.23,4.23l-15.87 0c-2.34,0 -4.23,-1.9 -4.23,-4.23l0 -24.07c0,-2.34 1.89,-4.23 4.23,-4.23z\" ></path><polygon fill=\"#fff\" fillOpacity=\".302\" points=\"15.1 0 15.1 9.53 24.33 9.53\"></polygon><path fill=\"#fff\" fillRule=\"nonzero\" d=\"M15.07 21.38c0.31,-0.52 0.52,-1.18 0.56,-1.83 0.02,-0.42 -0.07,-0.86 -0.27,-1.27 -0.32,-0.65 -0.86,-1.01 -1.39,-1.37 -0.39,-0.26 -0.76,-0.51 -1.02,-0.86l-0.05 -0.06c-0.15,-0.21 -0.33,-0.45 -0.36,-0.65 -0.02,-0.2 -0.21,-0.34 -0.4,-0.33 -0.21,0.02 -0.36,0.18 -0.36,0.39l0 6.86c-0.32,-0.2 -0.72,-0.32 -1.16,-0.32 -1.06,0 -1.92,0.69 -1.92,1.54 0,0.85 0.86,1.54 1.92,1.54 1.06,0 1.93,-0.69 1.93,-1.54l0 -4.49c0.58,0.23 1.52,0.79 1.78,2.1 -0.05,0.07 -0.09,0.15 -0.15,0.21 -0.14,0.16 -0.12,0.4 0.04,0.55 0.16,0.14 0.4,0.12 0.54,-0.04 0.1,-0.12 0.2,-0.25 0.28,-0.4 0.01,-0.01 0.02,-0.02 0.03,-0.03z\">\n </path>\n </svg>\n )\n}","\n\n'use client'\nexport default function RarIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 64 64\"\n width=\"100\"\n height=\"100\"\n {...props}\n >\n <path fill=\"#188a32\" d=\"M56,35v8c0,1.66-1.34,3-3,3H11c-1.66,0-3-1.34-3-3v-8c0-1.66,1.34-3,3-3h42C54.66,32,56,33.34,56,35z\" ></path>\n <path fill=\"#0082AA\" d=\"M44,29v5c0,1.66-1.34,3-3,3H23c-1.66,0-3-1.34-3-3v-5h4v4h16v-4H44z\" ></path>\n <path fill=\"#4d50c6\" d=\"M53,32H11c-1.657,0-3-1.343-3-3v-8c0-1.657,1.343-3,3-3h42c1.657,0,3,1.343,3,3v8\n\t\t\t\t\tC56,30.657,54.657,32,53,32z\" ></path>\n <path fill=\"#e6275e\" d=\"M53,18H11c-1.657,0-3-1.343-3-3V7c0-1.657,1.343-3,3-3h42c1.657,0,3,1.343,3,3v8\n\t\t\t\t\tC56,16.657,54.657,18,53,18z\" ></path>\n <rect width=\"16\" height=\"42\" x=\"24\" y=\"4\" fill=\"#FAB400\" ></rect>\n <path fill=\"#DC9600\" d=\"M32,46L32,46c-4.418,0-8-3.582-8-8v-4h16v4C40,42.418,36.418,46,32,46z\" ></path>\n <path fill=\"#FAB400\" d=\"M32,44L32,44c-4.418,0-8-3.582-8-8v-4h16v4C40,40.418,36.418,44,32,44z\" ></path>\n <rect width=\"16\" height=\"4\" x=\"24\" y=\"33\" fill=\"#DC9600\" ></rect>\n <path fill=\"#F0F0F0\" d=\"M44,17v16c0,1.66-1.34,3-3,3H23c-1.66,0-3-1.34-3-3V17c0-1.66,1.34-3,3-3h1v18h16V14h1\n\t\t\t\t\tC42.66,14,44,15.34,44,17z\" ></path>\n <path fill=\"#D2D2D2\" d=\"M34,31v2c0,1.1-0.9,2-2,2s-2-0.9-2-2v-2H34z\" ></path>\n <path fill=\"#F0F0F0\" d=\"M32,34L32,34c-1.105,0-2-0.895-2-2v-8c0-1.105,0.895-2,2-2h0c1.105,0,2,0.895,2,2v8\n\t\t\t\t\tC34,33.105,33.105,34,32,34z\" ></path>\n <circle cx=\"32\" cy=\"18\" r=\"2\" fill=\"#C80A50\" ></circle>\n <circle cx=\"32\" cy=\"10\" r=\"2\" fill=\"#00A0C8\" ></circle>\n <path fill=\"#F0F0F0\" d=\"M34,18h-4c0-1.1,0.9-2,2-2S34,16.9,34,18z\" ></path>\n <path fill=\"#0A5078\" d=\"M47,60H17c-1.105,0-2-0.895-2-2V44c0-1.105,0.895-2,2-2h30c1.105,0,2,0.895,2,2v14\n\t\t\t\t\tC49,59.105,48.105,60,47,60z\" ></path>\n <path fill=\"#F0F0F0\" d=\"M35,53h-6c-0.552,0-1-0.448-1-1v-3c0-2.206,1.794-4,4-4s4,1.794,4,4v3C36,52.552,35.552,53,35,53z\n\t\t\t\t\t\t\t M30,51h4v-2c0-1.103-0.897-2-2-2s-2,0.897-2,2V51z\" ></path><path fill=\"#F0F0F0\" d=\"M29 57c-.552 0-1-.448-1-1v-4c0-.552.448-1 1-1s1 .448 1 1v4C30 56.552 29.552 57 29 57zM35 57c-.552 0-1-.448-1-1v-4c0-.552.448-1 1-1s1 .448 1 1v4C36 56.552 35.552 57 35 57zM42 53h-3c-.552 0-1-.448-1-1v-6c0-.552.448-1 1-1h3c2.206 0 4 1.794 4 4S44.206 53 42 53zM40 51h2c1.103 0 2-.897 2-2s-.897-2-2-2h-2V51z\" ></path><path fill=\"#F0F0F0\" d=\"M39 57c-.552 0-1-.448-1-1v-4c0-.552.448-1 1-1s1 .448 1 1v4C40 56.552 39.552 57 39 57zM45.001 57c-.367 0-.72-.202-.896-.553l-2-4c-.247-.494-.047-1.095.447-1.342.495-.248 1.095-.047 1.342.447l2 4c.247.494.047 1.095-.447 1.342C45.304 56.966 45.151 57 45.001 57z\" ></path><g><path fill=\"#F0F0F0\" d=\"M22,53h-3c-0.552,0-1-0.448-1-1v-6c0-0.552,0.448-1,1-1h3c2.206,0,4,1.794,4,4S24.206,53,22,53z\n\t\t\t\t\t\t\t M20,51h2c1.103,0,2-0.897,2-2s-0.897-2-2-2h-2V51z\" ></path>\n <path fill=\"#F0F0F0\" d=\"M19 57c-.552 0-1-.448-1-1v-4c0-.552.448-1 1-1s1 .448 1 1v4C20 56.552 19.552 57 19 57zM25.001 57c-.367 0-.72-.202-.896-.553l-2-4c-.247-.494-.047-1.095.447-1.342.495-.248 1.095-.047 1.342.447l2 4c.247.494.047 1.095-.447 1.342C25.304 56.966 25.151 57 25.001 57z\" ></path></g></svg>\n\n );\n}\n\n\n\n","\n'use client'\nexport default function ExeIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 48 48\"\n width=\"100\"\n height=\"100\"\n {...props}\n >\n <path fill=\"#e8e9ea\" d=\"M8.16,17.51V3.74c0-1.79,1.45-3.24,3.24-3.24h20.53l12.79,12.8v30.96c0,1.79-1.45,3.24-3.24,3.24H11.4\n\t\t\t\tc-1.79,0-3.24-1.45-3.24-3.24v-1.62\" ></path>\n <path fill=\"#697d7f\" d=\"M44.72 13.3h-9.93c-1.58 0-2.86-1.28-2.86-2.86V.5M11.53 25.42c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5H4.78c-.83 0-1.5.67-1.5 1.5v11.53c0 .83.67 1.5 1.5 1.5h6.75c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5H6.28v-2.76h3.98c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5H6.28v-2.76H11.53zM36.33 25.42c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5h-6.75c-.83 0-1.5.67-1.5 1.5v11.53c0 .83.67 1.5 1.5 1.5h6.75c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5h-5.25v-2.76h3.98c.83 0 1.5-.67 1.5-1.5s-.67-1.5-1.5-1.5h-3.98v-2.76H36.33zM15.55 36.67c.26.19.57.28.87.28.47 0 .93-.22 1.22-.63l2.92-4.07 2.92 4.07c.29.41.75.63 1.22.63.3 0 .61-.09.87-.28.67-.48.83-1.42.34-2.09l-3.51-4.89 3.51-4.89c.48-.67.33-1.61-.34-2.09-.67-.48-1.61-.33-2.09.34l-2.92 4.07-2.92-4.07c-.48-.67-1.42-.83-2.09-.34-.67.48-.83 1.42-.34 2.09l3.51 4.89-3.51 4.89C14.72 35.25 14.87 36.19 15.55 36.67z\" ></path>\n </svg>\n\n );\n}\n\n\n\n","\n\n'use client'\n\nexport default function ImageIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n imageRendering=\"optimizeQuality\"\n shapeRendering=\"geometricPrecision\"\n textRendering=\"geometricPrecision\"\n viewBox=\"0 0 17.69 23.65\"\n width=\"100\"\n height=\"100\"\n {...props}\n >\n <path fill=\"#0ac963\" d=\"M3.08 0l7.91 0 6.7 6.99 0 13.58c0,1.7 -1.38,3.08 -3.08,3.08l-11.53 0c-1.7,0 -3.08,-1.38 -3.08,-3.08l0 -17.49c0,-1.7 1.38,-3.08 3.08,-3.08z\">\n </path>\n <polygon fill=\"#fff\" fillOpacity=\".302\" points=\"10.98 0 10.98 6.93 17.69 6.93\"></polygon>\n <path fill=\"#fff\" d=\"M11.85 11.82l-6.01 0c-0.45,0 -0.82,0.37 -0.82,0.82l0 3.82c0,0.45 0.37,0.82 0.82,0.82l6.01 0c0.45,0 0.81,-0.37 0.81,-0.82l0 -3.82c0,-0.45 -0.36,-0.82 -0.81,-0.82zm-4.37 1.03c0.49,0 0.88,0.4 0.88,0.88 0,0.49 -0.39,0.89 -0.88,0.89 -0.49,0 -0.89,-0.4 -0.89,-0.89 0,-0.48 0.4,-0.88 0.89,-0.88zm4.64 3.61c0,0.15 -0.12,0.28 -0.27,0.28l-6.01 0c-0.15,0 -0.27,-0.13 -0.27,-0.28l0 -0.16 1.09 -1.09 0.9 0.9c0.11,0.11 0.28,0.11 0.39,0l2.26 -2.26 1.91 1.91 0 0.7 0 0z\">\n </path>\n </svg>\n );\n}\n","'use client'\n\nexport default function VideoIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n imageRendering=\"optimizeQuality\"\n shapeRendering=\"geometricPrecision\"\n textRendering=\"geometricPrecision\"\n viewBox=\"0 0 29.93 40.02\"\n width=\"100\"\n height=\"100\"\n {...props}\n >\n <path fill=\"#fa0000\" d=\"M5.21 0l13.38 0 11.34 11.82 0 22.99c0,2.88 -2.33,5.21 -5.2,5.21l-19.52 0c-2.88,0 -5.21,-2.33 -5.21,-5.21l0 -29.6c0,-2.88 2.33,-5.21 5.21,-5.21z\" ></path>\n <polygon fill=\"#fff\" fillOpacity=\".302\" points=\"18.58 0 18.58 11.73 29.93 11.73\"></polygon>\n <path fill=\"#fff\" fillRule=\"nonzero\" d=\"M14.97 18.16c-3.57,0 -6.47,2.9 -6.47,6.47 0,3.57 2.9,6.46 6.47,6.46 3.57,0 6.46,-2.89 6.46,-6.46 0,-3.57 -2.9,-6.46 -6.46,-6.47zm2.72 6.67c-0.05,0.09 -0.12,0.16 -0.21,0.21l0 0 -3.69 1.85c-0.23,0.11 -0.51,0.02 -0.62,-0.21 -0.04,-0.06 -0.05,-0.13 -0.05,-0.21l0 -3.69c0,-0.26 0.21,-0.46 0.46,-0.46 0.07,0 0.14,0.01 0.21,0.05l3.69 1.84c0.23,0.12 0.32,0.39 0.21,0.62z\" ></path>\n </svg>\n );\n}\n","'use client'\n\nexport default function FolderWithFilesIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 64 64\"\n width=\"100\"\n height=\"100\"\n {...props}\n >\n <path fill=\"#5a5959\" d=\"M2.1,57.4h57.7c1.1,0,2.1-0.9,2.1-2.1V13.4c0-1.1-0.9-2.1-2.1-2.1H31c-0.8,0-1.5-0.4-1.8-1.1l-1.7-3.4\n\t\tc-0.4-0.7-1.1-1.1-1.8-1.1H2.1C0.9,5.7,0,6.6,0,7.8v47.5C0,56.4,0.9,57.4,2.1,57.4z\" ></path>\n <path fill=\"#504e4e\" d=\"M3,58.3h56.7c1.1,0,2.1-0.9,2.1-2.1V14.3c0-1.1-0.9-2.1-2.1-2.1H31c-0.8,0-1.5-0.4-1.8-1.1l-1.7-3.4\n\t\tc-0.4-0.7-1.1-1.1-1.8-1.1H2.1C0.9,6.6,0,7.6,0,8.7v46.6C0,56.9,1.3,58.3,3,58.3z\" ></path>\n <rect width=\"58.6\" height=\"21.1\" x=\"1.6\" y=\"14.7\" fill=\"#ffffff\" ></rect>\n <rect width=\".8\" height=\"21.1\" x=\"1.6\" y=\"14.7\" fill=\"#f3f3f3\" ></rect>\n <rect width=\"58.6\" height=\".9\" x=\"1.6\" y=\"14.7\" fill=\"#f3f1f1\" ></rect>\n <path fill=\"#676666\" d=\"M64,18.6v35.8c0,1.7-1.3,3-3,3H3c-1.7,0-3-1.3-3-3v-31c0-1.7,1.3-3,3-3h29.2c0.8,0,1.6-0.3,2.1-0.9l3-3\n\t\tc0.6-0.6,1.3-0.9,2.1-0.9H61C62.7,15.6,64,17,64,18.6z\" ></path>\n <path fill=\"#6f6d6d\" d=\"M64,19.5v35.8c0,1.7-1.3,3-3,3H3c-1.7,0-3-1.3-3-3v-31c0-1.7,1.3-3,3-3h29.2c0.8,0,1.6-0.3,2.1-0.9l3-3\n\t\tc0.6-0.6,1.3-0.9,2.1-0.9H61C62.7,16.5,64,17.9,64,19.5z\" ></path>\n </svg>\n\n );\n}\n","'use client'\n\nexport default function EmptyFolderIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 64 64\"\n width=\"100\"\n height=\"100\"\n {...props}\n >\n <path fill=\"#5a5959\" d=\"M2.1,57.4h57.7c1.1,0,2.1-0.9,2.1-2.1V13.4c0-1.1-0.9-2.1-2.1-2.1H31c-0.8,0-1.5-0.4-1.8-1.1l-1.7-3.4\n\t\tc-0.4-0.7-1.1-1.1-1.8-1.1H2.1C0.9,5.7,0,6.6,0,7.8v47.5C0,56.4,0.9,57.4,2.1,57.4z\" ></path>\n <path fill=\"#504e4e\" d=\"M3,58.3h56.7c1.1,0,2.1-0.9,2.1-2.1V14.3c0-1.1-0.9-2.1-2.1-2.1H31c-0.8,0-1.5-0.4-1.8-1.1l-1.7-3.4\n\t\tc-0.4-0.7-1.1-1.1-1.8-1.1H2.1C0.9,6.6,0,7.6,0,8.7v46.6C0,56.9,1.3,58.3,3,58.3z\"></path>\n <path fill=\"#676666\" d=\"M64,18.6v35.8c0,1.7-1.3,3-3,3H3c-1.7,0-3-1.3-3-3v-31c0-1.7,1.3-3,3-3h29.2c0.8,0,1.6-0.3,2.1-0.9l3-3\n\t\tc0.6-0.6,1.3-0.9,2.1-0.9H61C62.7,15.6,64,17,64,18.6z\"></path>\n <path fill=\"#6f6d6d\" d=\"M64,19.5v35.8c0,1.7-1.3,3-3,3H3c-1.7,0-3-1.3-3-3v-31c0-1.7,1.3-3,3-3h29.2c0.8,0,1.6-0.3,2.1-0.9l3-3\n\t\tc0.6-0.6,1.3-0.9,2.1-0.9H61C62.7,16.5,64,17.9,64,19.5z\"></path>\n </svg>\n );\n}\n","'use client'\nexport default function FolderIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n <svg \n xmlns=\"http://www.w3.org/2000/svg\" \n width=\"24\" \n height=\"24\" \n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n {...props} \n >\n <g fill=\"none\">\n <path d=\"M16.2 5C17.8802 5 18.7202 5 19.362 5.32698C19.9265 5.6146 20.3854 6.07354 20.673 6.63803C21 7.27976 21 8.11984 21 9.8V11.2C21 12.8802 21 13.7202 20.673 14.362C20.3854 14.9265 19.9265 15.3854 19.362 15.673C18.7202 16 17.8802 16 16.2 16H7.8C6.11984 16 5.27976 16 4.63803 15.673C4.07354 15.3854 3.6146 14.9265 3.32698 14.362C3 13.7202 3 12.8802 3 11.2L3 6.8C3 5.11984 3 4.27976 3.32698 3.63803C3.6146 3.07354 4.07354 2.6146 4.63803 2.32698C5.27976 2 6.11984 2 7.8 2L9.28741 2C9.91355 2 10.2266 2 10.5108 2.0863C10.7624 2.1627 10.9964 2.28796 11.1996 2.45491C11.429 2.64349 11.6027 2.90398 11.95 3.42496L13 5H16.2Z\" fill=\"url(#1752500502786-6297956_folder_existing_0_ekojck6b3)\" data-glass=\"origin\" mask=\"url(#1752500502786-6297956_folder_mask_2iow0yqdp)\"></path>\n <path d=\"M16.2 5C17.8802 5 18.7202 5 19.362 5.32698C19.9265 5.6146 20.3854 6.07354 20.673 6.63803C21 7.27976 21 8.11984 21 9.8V11.2C21 12.8802 21 13.7202 20.673 14.362C20.3854 14.9265 19.9265 15.3854 19.362 15.673C18.7202 16 17.8802 16 16.2 16H7.8C6.11984 16 5.27976 16 4.63803 15.673C4.07354 15.3854 3.6146 14.9265 3.32698 14.362C3 13.7202 3 12.8802 3 11.2L3 6.8C3 5.11984 3 4.27976 3.32698 3.63803C3.6146 3.07354 4.07354 2.6146 4.63803 2.32698C5.27976 2 6.11984 2 7.8 2L9.28741 2C9.91355 2 10.2266 2 10.5108 2.0863C10.7624 2.1627 10.9964 2.28796 11.1996 2.45491C11.429 2.64349 11.6027 2.90398 11.95 3.42496L13 5H16.2Z\" fill=\"url(#1752500502786-6297956_folder_existing_0_ekojck6b3)\" data-glass=\"clone\" filter=\"url(#1752500502786-6297956_folder_filter_56qas2ark)\" clipPath=\"url(#1752500502786-6297956_folder_clipPath_gygn8e14a)\"></path>\n <path d=\"M17.4051 9C19.3327 9 20.2965 9 20.9861 9.39213C21.5914 9.73631 22.0581 10.2803 22.3062 10.9309C22.5889 11.6721 22.4424 12.6247 22.1492 14.5299L21.6262 17.9299C21.4039 19.3744 21.2928 20.0966 20.9388 20.6393C20.6267 21.1176 20.1846 21.4969 19.6644 21.7326C19.0742 22 18.3435 22 16.882 22L7.11801 22C5.65653 22 4.92579 22 4.33558 21.7326C3.8154 21.4969 3.3733 21.1176 3.06124 20.6393C2.70717 20.0966 2.59606 19.3744 2.37383 17.9299L1.85075 14.5299C1.55764 12.6247 1.41109 11.6721 1.6938 10.9309C1.94194 10.2803 2.40865 9.73631 3.01392 9.39213C3.70353 9 4.66733 9 6.59493 9L17.4051 9Z\" fill=\"url(#1752500502786-6297956_folder_existing_1_v5o9796uz)\" data-glass=\"blur\"></path>\n <path d=\"M18.6807 9.00586C19.7975 9.02423 20.4692 9.09846 20.9864 9.39258C21.5915 9.73676 22.0586 10.2802 22.3067 10.9307C22.5894 11.6719 22.4426 12.6251 22.1495 14.5303L21.626 17.9297C21.4038 19.3742 21.2926 20.097 20.9385 20.6396L20.8155 20.8135C20.5147 21.2098 20.1193 21.5262 19.6641 21.7324C19.074 21.9997 18.3431 22 16.8819 22V21.25C17.624 21.25 18.1389 21.2495 18.543 21.2188C18.9374 21.1887 19.1709 21.133 19.3546 21.0498C19.7447 20.873 20.0766 20.5882 20.3106 20.2295C20.4208 20.0606 20.5119 19.8385 20.6016 19.4531C20.6935 19.0584 20.772 18.5489 20.8848 17.8154L21.4083 14.416C21.5568 13.4504 21.6601 12.7732 21.6954 12.2441C21.7302 11.7223 21.6913 11.4231 21.6055 11.1982C21.4194 10.7103 21.0693 10.3021 20.6153 10.0439C20.4061 9.92506 20.1166 9.84086 19.5958 9.7959C19.0675 9.75031 18.3823 9.75 17.4053 9.75H6.59479C5.61785 9.75 4.93266 9.75032 4.40436 9.7959C3.88353 9.84086 3.59399 9.92504 3.38483 10.0439C2.93088 10.3021 2.5807 10.7103 2.3946 11.1982C2.30885 11.4231 2.26996 11.7223 2.30475 12.2441C2.34005 12.7732 2.44331 13.4504 2.59186 14.416L3.1153 17.8154C3.22814 18.5489 3.30665 19.0584 3.3985 19.4531C3.4882 19.8385 3.5793 20.0606 3.68952 20.2295C3.92357 20.5882 4.25545 20.873 4.64558 21.0498C4.82929 21.133 5.06268 21.1887 5.4571 21.2188C5.86121 21.2495 6.37613 21.25 7.11823 21.25V22L6.14948 21.9961C5.44148 21.9856 4.96108 21.9493 4.56452 21.8213L4.336 21.7324C3.88079 21.5262 3.48544 21.2098 3.18464 20.8135L3.06159 20.6396C2.79608 20.2327 2.66703 19.7244 2.52546 18.8867L2.37409 17.9297L1.85065 14.5303C1.57585 12.744 1.42974 11.7947 1.64558 11.0723L1.6944 10.9307C1.91158 10.3615 2.29578 9.8738 2.79401 9.53027L3.01374 9.39258C3.70332 9.00046 4.66737 9 6.59479 9H17.4053L18.6807 9.00586ZM16.8819 21.25V22H7.11823V21.25H16.8819Z\" fill=\"url(#1752500502786-6297956_folder_existing_2_vhap9347d)\"></path>\n <defs>\n <linearGradient id=\"1752500502786-6297956_folder_existing_0_ekojck6b3\" x1=\"12\" y1=\"2\" x2=\"12\" y2=\"16\" gradientUnits=\"userSpaceOnUse\">\n <stop stopColor=\"#575757\"></stop>\n <stop offset=\"1\" stopColor=\"#151515\"></stop>\n </linearGradient>\n <linearGradient id=\"1752500502786-6297956_folder_existing_1_v5o9796uz\" x1=\"23\" y1=\"15.5\" x2=\"1\" y2=\"15.5\" gradientUnits=\"userSpaceOnUse\">\n <stop stopColor=\"#E3E3E5\" stopOpacity=\".6\"></stop>\n <stop offset=\"1\" stopColor=\"#BBBBC0\" stopOpacity=\".6\"></stop>\n </linearGradient>\n <linearGradient id=\"1752500502786-6297956_folder_existing_2_vhap9347d\" x1=\"12\" y1=\"9\" x2=\"12\" y2=\"16.528\" gradientUnits=\"userSpaceOnUse\">\n <stop stopColor=\"#fff\"></stop>\n <stop offset=\"1\" stopColor=\"#fff\" stopOpacity=\"0\"></stop>\n </linearGradient>\n <filter id=\"1752500502786-6297956_folder_filter_56qas2ark\" x=\"-100%\" y=\"-100%\" width=\"400%\" height=\"400%\" filterUnits=\"objectBoundingBox\" primitiveUnits=\"userSpaceOnUse\">\n <feGaussianBlur stdDeviation=\"2\" x=\"0%\" y=\"0%\" width=\"100%\" height=\"100%\" in=\"SourceGraphic\" edgeMode=\"none\" result=\"blur\"></feGaussianBlur>\n </filter>\n <clipPath id=\"1752500502786-6297956_folder_clipPath_gygn8e14a\">\n <path d=\"M17.4051 9C19.3327 9 20.2965 9 20.9861 9.39213C21.5914 9.73631 22.0581 10.2803 22.3062 10.9309C22.5889 11.6721 22.4424 12.6247 22.1492 14.5299L21.6262 17.9299C21.4039 19.3744 21.2928 20.0966 20.9388 20.6393C20.6267 21.1176 20.1846 21.4969 19.6644 21.7326C19.0742 22 18.3435 22 16.882 22L7.11801 22C5.65653 22 4.92579 22 4.33558 21.7326C3.8154 21.4969 3.3733 21.1176 3.06124 20.6393C2.70717 20.0966 2.59606 19.3744 2.37383 17.9299L1.85075 14.5299C1.55764 12.6247 1.41109 11.6721 1.6938 10.9309C1.94194 10.2803 2.40865 9.73631 3.01392 9.39213C3.70353 9 4.66733 9 6.59493 9L17.4051 9Z\" fill=\"url(#1752500502786-6297956_folder_existing_1_v5o9796uz)\"></path>\n </clipPath>\n <mask id=\"1752500502786-6297956_folder_mask_2iow0yqdp\">\n <rect width=\"100%\" height=\"100%\" fill=\"#FFF\"></rect>\n <path d=\"M17.4051 9C19.3327 9 20.2965 9 20.9861 9.39213C21.5914 9.73631 22.0581 10.2803 22.3062 10.9309C22.5889 11.6721 22.4424 12.6247 22.1492 14.5299L21.6262 17.9299C21.4039 19.3744 21.2928 20.0966 20.9388 20.6393C20.6267 21.1176 20.1846 21.4969 19.6644 21.7326C19.0742 22 18.3435 22 16.882 22L7.11801 22C5.65653 22 4.92579 22 4.33558 21.7326C3.8154 21.4969 3.3733 21.1176 3.06124 20.6393C2.70717 20.0966 2.59606 19.3744 2.37383 17.9299L1.85075 14.5299C1.55764 12.6247 1.41109 11.6721 1.6938 10.9309C1.94194 10.2803 2.40865 9.73631 3.01392 9.39213C3.70353 9 4.66733 9 6.59493 9L17.4051 9Z\" fill=\"#000\"></path>\n </mask>\n </defs>\n </g>\n </svg>\n );\n}\n\n\n","'use client'\nexport default function HomeIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n {...props}\n >\n <path\n opacity=\"0.4\"\n d=\"M13.4919 2.29395C13.0743 1.94268 12.5457 1.75 11.9997 1.75C11.5221 1.75 11.058 1.89775 10.6697 2.16992L10.5085 2.29395L1.5974 9.78906C1.18491 10.1364 1.13178 10.7528 1.47924 11.165C1.78946 11.5327 2.31307 11.6121 2.71557 11.3789V15.9531V15.955C2.71555 17.0543 2.71553 17.9612 2.7976 18.6885C2.88313 19.4463 3.06823 20.1292 3.52318 20.7217L3.68627 20.9199C3.85487 21.1119 4.04268 21.2876 4.24584 21.4434L4.47143 21.6016C5.01004 21.9427 5.61706 22.0932 6.281 22.168C7.00121 22.2491 7.89724 22.249 8.98176 22.249H8.99975H14.9997H15.0178C16.1023 22.249 16.9983 22.2491 17.7185 22.168C18.4771 22.0825 19.1606 21.8977 19.7537 21.4434L19.9529 21.2803C20.145 21.1119 20.3205 20.9245 20.4763 20.7217L20.6345 20.4961C20.976 19.9581 21.127 19.3517 21.2019 18.6885C21.284 17.9612 21.2839 17.0543 21.2839 15.955V15.9531V11.3789C21.6864 11.6121 22.21 11.5327 22.5203 11.165C22.846 10.7785 22.8199 10.2127 22.4753 9.85742L13.4919 2.29395Z\"\n fill=\"#141B34\"\n />\n <path\n d=\"M14.9998 17V22.249H8.99979V17C8.99979 15.5859 9.00002 14.8788 9.43924 14.4395C9.87855 14.0001 10.5857 14 11.9998 14C13.4139 14 14.121 14.0002 14.5603 14.4395C14.9997 14.8788 14.9998 15.5858 14.9998 17Z\"\n fill=\"#141B34\"\n />\n </svg>\n );\n}\n","export default function SearchIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n fill=\"currentColor\"\n viewBox=\"0 0 48 48\"\n aria-hidden=\"true\"\n {...props}\n >\n <path fill=\"currentColor\" d=\"M46.599 46.599a4.498 4.498 0 0 1-6.363 0l-7.941-7.941C29.028 40.749 25.167 42 21 42 9.402 42 0 32.598 0 21S9.402 0 21 0s21 9.402 21 21c0 4.167-1.251 8.028-3.342 11.295l7.941 7.941a4.498 4.498 0 0 1 0 6.363zM21 6C12.717 6 6 12.714 6 21s6.717 15 15 15c8.286 0 15-6.714 15-15S29.286 6 21 6z\"></path>\n </svg>\n );\n}\n","'use client'\nexport default function MoveIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return ( \n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n {...props}\n >\n <path\n fill=\"currentColor\"\n opacity=\"0.4\"\n d=\"M20.4155 3.66085C22.3012 5.52939 19.2842 20.7253 16.1883 20.9931C13.5911 21.2177 12.7819 16.0954 12.2348 14.4719C11.695 12.8696 11.0943 12.2927 9.50513 11.767C5.46811 10.4315 3.4496 9.76374 3.04996 8.70639C1.99171 5.90649 18.0071 1.27438 20.4155 3.66085Z\"\n />\n <path\n fill=\"currentColor\"\n d=\"M3.04996 8.70639C3.4496 9.76374 5.46811 10.4315 9.50513 11.767C10.3308 12.0402 10.8897 12.3271 11.3118 12.7646L20.4155 3.66085C18.0071 1.27438 1.99171 5.90649 3.04996 8.70639Z\"\n />\n </svg>\n );\n}\n","export default function UploadFileIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n {...props}\n >\n <path\n opacity=\"0.4\"\n d=\"M19 11C19 6.58172 15.4183 3 11 3C6.58172 3 3 6.58172 3 11C3 15.4183 6.58172 19 11 19C15.4183 19 19 15.4183 19 11Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M17 17L21 21\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M19 11C19 6.58172 15.4183 3 11 3C6.58172 3 3 6.58172 3 11C3 15.4183 6.58172 19 11 19C15.4183 19 19 15.4183 19 11Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","export default function UploadFolderIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M17.75 11.7499C18.3023 11.7499 18.75 12.1977 18.75 12.7499V15.7499H21.75C22.3023 15.7499 22.75 16.1977 22.75 16.7499C22.75 17.3022 22.3023 17.7499 21.75 17.7499H18.75V20.7499C18.75 21.3022 18.3023 21.7499 17.75 21.7499C17.1977 21.7499 16.75 21.3022 16.75 20.7499V17.7499H13.75C13.1977 17.7499 12.75 17.3022 12.75 16.7499C12.75 16.1977 13.1977 15.7499 13.75 15.7499H16.75V12.7499C16.75 12.1977 17.1977 11.7499 17.75 11.7499Z\"\n fill=\"currentColor\"\n />\n <path\n opacity=\"0.4\"\n d=\"M9.4626 2.48876C8.82373 2.24919 8.11205 2.24951 7.08264 2.24996C6.2039 2.24995 5.32205 2.24999 4.7497 2.30044C4.15996 2.35243 3.64388 2.46238 3.17258 2.7254C2.56533 3.06428 2.06428 3.56534 1.7254 4.17258C1.46238 4.64388 1.35242 5.15996 1.30044 5.7497C1.24999 6.32205 1.24999 7.03077 1.25 7.9095V11.0574C1.24999 13.3658 1.24998 15.1748 1.43975 16.5863C1.63399 18.031 2.03933 19.1711 2.93414 20.0659C3.82895 20.9607 4.96897 21.366 6.41371 21.5603C7.82519 21.75 9.63423 21.75 11.9426 21.75H13.2923C14.1084 21.75 14.8409 21.75 15.5 21.7383V18.9999H13.75C12.5074 18.9999 11.5 17.9926 11.5 16.7499C11.5 15.5073 12.5074 14.4999 13.75 14.4999H15.5V12.7499C15.5 11.5073 16.5074 10.4999 17.75 10.4999C18.9926 10.4999 20 11.5073 20 12.7499V14.4999H22.7383C22.75 13.8408 22.75 13.1084 22.75 12.2923C22.75 11.2733 22.75 10.3688 22.683 9.70949C22.6137 9.02893 22.4669 8.43872 22.118 7.91661C21.8444 7.50715 21.4929 7.15559 21.0834 6.88199C20.5613 6.53313 19.9711 6.38628 19.2905 6.31705C18.6312 6.24998 17.8095 6.24999 16.7905 6.25L13.2361 6.25C12.92 6.25 12.7396 6.24908 12.6064 6.23531C12.5044 6.22817 12.4348 6.15255 12.4128 6.11563C12.3409 6.0027 12.0838 5.48909 11.9425 5.20636C11.4704 4.25121 10.8581 3.01205 9.4626 2.48876Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n","'use client'\nexport default function PlusIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n {...props}\n \n \n >\n <path fill=\"currentColor\" d=\"M19,11H13V5a1,1,0,0,0-2,0v6H5a1,1,0,0,0,0,2h6v6a1,1,0,0,0,2,0V13h6a1,1,0,0,0,0-2Z\"></path>\n </svg>\n )\n}","'use client'\nexport default function TrashIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n <svg \n xmlns=\"http://www.w3.org/2000/svg\" \n width=\"24\" \n height=\"24\" \n viewBox=\"0 0 24 24\"\n {...props}\n >\n <path fill=\"currentColor\" d=\"M3 6.386c0-.484.345-.877.771-.877h2.665c.529-.016.996-.399 1.176-.965l.03-.1l.115-.391c.07-.24.131-.45.217-.637c.338-.739.964-1.252 1.687-1.383c.184-.033.378-.033.6-.033h3.478c.223 0 .417 0 .6.033c.723.131 1.35.644 1.687 1.383c.086.187.147.396.218.637l.114.391l.03.1c.18.566.74.95 1.27.965h2.57c.427 0 .772.393.772.877s-.345.877-.771.877H3.77c-.425 0-.77-.393-.77-.877\"/>\n <path fill=\"currentColor\" fillRule=\"evenodd\" d=\"M9.425 11.482c.413-.044.78.273.821.707l.5 5.263c.041.433-.26.82-.671.864c-.412.043-.78-.273-.821-.707l-.5-5.263c-.041-.434.26-.821.671-.864m5.15 0c.412.043.713.43.671.864l-.5 5.263c-.04.434-.408.75-.82.707c-.413-.044-.713-.43-.672-.864l.5-5.264c.041-.433.409-.75.82-.707\" clipRule=\"evenodd\"/>\n <path fill=\"currentColor\" d=\"M11.596 22h.808c2.783 0 4.174 0 5.08-.886c.904-.886.996-2.339 1.181-5.245l.267-4.188c.1-1.577.15-2.366-.303-2.865c-.454-.5-1.22-.5-2.753-.5H8.124c-1.533 0-2.3 0-2.753.5s-.404 1.288-.303 2.865l.267 4.188c.185 2.906.277 4.36 1.182 5.245c.905.886 2.296.886 5.079.886\" opacity=\"0.5\"/>\n </svg>\n\n )\n}","'use client'\n\nexport default function CrossIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n {...props}\n >\n <path\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M13.41,12l4.3-4.29a1,1,0,1,0-1.42-1.42L12,10.59,7.71,6.29A1,1,0,0,0,6.29,7.71L10.59,12l-4.3,4.29a1,1,0,0,0,0,1.42,1,1,0,0,0,1.42,0L12,13.41l4.29,4.3a1,1,0,0,0,1.42,0,1,1,0,0,0,0-1.42Z\"\n />\n </svg>\n );\n}\n","'use client'\n\nexport default function DownloadIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n <svg \n xmlns=\"http://www.w3.org/2000/svg\" \n width=\"24\" \n height=\"24\" \n viewBox=\"0 0 24 24\" \n fill=\"none\" \n stroke=\"currentColor\" \n strokeWidth=\"2\" \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\" \n {...props}\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/>\n <path d=\"M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2 -2v-2\" />\n <path d=\"M7 11l5 5l5 -5\" />\n <path d=\"M12 4l0 12\" />\n </svg>\n\n );\n}\n","\n'use client'\n\nexport default function LinkIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n <svg \n xmlns=\"http://www.w3.org/2000/svg\" \n width=\"24\" \n height=\"24\" \n viewBox=\"0 0 24 24\" \n fill=\"none\" \n stroke=\"currentColor\" \n strokeWidth=\"2\" \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\"\n {...props}\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"/>\n <path d=\"M9 15l6 -6\" />\n <path d=\"M11 6l.463 -.536a5 5 0 0 1 7.071 7.072l-.534 .464\" />\n <path d=\"M13 18l-.397 .534a5.068 5.068 0 0 1 -7.127 0a4.972 4.972 0 0 1 0 -7.071l.524 -.463\" />\n </svg>\n );\n}\n","'use client'\n\nexport default function FullscreenIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path fill=\"currentColor\" fillRule=\"evenodd\" d=\"M9.944 1.25H10a.75.75 0 0 1 0 1.5c-1.907 0-3.261.002-4.29.14c-1.005.135-1.585.389-2.008.812S3.025 4.705 2.89 5.71c-.138 1.029-.14 2.383-.14 4.29a.75.75 0 0 1-1.5 0v-.056c0-1.838 0-3.294.153-4.433c.158-1.172.49-2.121 1.238-2.87c.749-.748 1.698-1.08 2.87-1.238c1.14-.153 2.595-.153 4.433-.153m8.345 1.64c-1.027-.138-2.382-.14-4.289-.14a.75.75 0 0 1 0-1.5h.056c1.838 0 3.294 0 4.433.153c1.172.158 2.121.49 2.87 1.238c.748.749 1.08 1.698 1.238 2.87c.153 1.14.153 2.595.153 4.433V10a.75.75 0 0 1-1.5 0c0-1.907-.002-3.261-.14-4.29c-.135-1.005-.389-1.585-.812-2.008s-1.003-.677-2.009-.812M2 13.25a.75.75 0 0 1 .75.75c0 1.907.002 3.262.14 4.29c.135 1.005.389 1.585.812 2.008s1.003.677 2.009.812c1.028.138 2.382.14 4.289.14a.75.75 0 0 1 0 1.5h-.056c-1.838 0-3.294 0-4.433-.153c-1.172-.158-2.121-.49-2.87-1.238c-.748-.749-1.08-1.698-1.238-2.87c-.153-1.14-.153-2.595-.153-4.433V14a.75.75 0 0 1 .75-.75m20 0a.75.75 0 0 1 .75.75v.056c0 1.838 0 3.294-.153 4.433c-.158 1.172-.49 2.121-1.238 2.87c-.749.748-1.698 1.08-2.87 1.238c-1.14.153-2.595.153-4.433.153H14a.75.75 0 0 1 0-1.5c1.907 0 3.262-.002 4.29-.14c1.005-.135 1.585-.389 2.008-.812s.677-1.003.812-2.009c.138-1.027.14-2.382.14-4.289a.75.75 0 0 1 .75-.75\" clipRule=\"evenodd\" />\n </svg>\n\n );\n}\n","export default function UploadCloudIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"40\"\n height=\"40\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n color=\"currentColor\"\n {...props}\n >\n <path d=\"M13.0059 21.25C13.0059 21.8023 12.5581 22.25 12.0059 22.25C11.4536 22.25 11.0059 21.8023 11.0059 21.25L11.0059 16.75L10.4116 16.75C10.236 16.7501 10.0203 16.7503 9.84387 16.7282L9.84053 16.7278C9.71408 16.712 9.13804 16.6402 8.86368 16.0746C8.58872 15.5078 8.89065 15.0076 8.95597 14.8994L8.95841 14.8954C9.05062 14.7424 9.18477 14.5715 9.29511 14.4309L9.31885 14.4007C9.61348 14.0249 9.99545 13.5406 10.3759 13.1496C10.5657 12.9545 10.783 12.7533 11.0139 12.5944C11.2191 12.4532 11.5693 12.25 12 12.25C12.4307 12.25 12.7809 12.4532 12.9861 12.5944C13.217 12.7533 13.4343 12.9545 13.6241 13.1496C14.0046 13.5406 14.3865 14.0249 14.6812 14.4007L14.7049 14.4309C14.8152 14.5715 14.9494 14.7424 15.0416 14.8954L15.044 14.8994C15.1093 15.0076 15.4113 15.5078 15.1363 16.0746C14.862 16.6402 14.2859 16.712 14.1595 16.7278L14.1561 16.7282C13.9797 16.7503 13.764 16.7501 13.5884 16.75L13.0059 16.75L13.0059 21.25Z\" fill=\"currentColor\" fillRule=\"evenodd\">\n </path>\n <path d=\"M1.25 12.5C1.25 9.85827 3.03106 7.63322 5.45825 6.9592C5.65424 6.90478 5.75224 6.87756 5.80872 6.81971C5.8652 6.76186 5.88991 6.66386 5.93931 6.46785C6.62272 3.75655 9.07671 1.75002 12 1.75002C15.2149 1.75002 17.8628 4.17733 18.2112 7.29925C18.2385 7.54461 18.2522 7.66731 18.3147 7.7383C18.3772 7.80929 18.4989 7.83881 18.7423 7.89787C21.0422 8.4559 22.75 10.5285 22.75 13C22.75 15.8995 20.3995 18.25 17.5 18.25H16.4006C15.942 18.25 15.7126 18.25 15.6826 18.2119C15.6679 18.1933 15.6641 18.1839 15.6617 18.1604C15.6567 18.1121 15.8519 17.9223 16.2425 17.5427C17.2326 16.5804 17.255 14.9976 16.2927 14.0075C15.6442 13.1982 15.0315 12.3422 14.2379 11.6663C13.6086 11.1303 12.8426 10.75 12 10.75C11.1574 10.75 10.3914 11.1303 9.76209 11.6663C8.96846 12.3422 8.35575 13.1982 7.7073 14.0075C6.74496 14.9976 6.76745 16.5804 7.75753 17.5427C8.14807 17.9223 8.34334 18.1121 8.33832 18.1604C8.33587 18.1839 8.33206 18.1933 8.31739 18.2119C8.28737 18.25 8.05801 18.25 7.59942 18.25H7C3.82436 18.25 1.25 15.6757 1.25 12.5Z\" fill=\"currentColor\">\n </path>\n </svg>\n )\n}\n","'use client';\nimport { FileMetaData } from \"@/types/file-manager\";\nimport ImageIcon from \"../icons/image\";\nimport { useState } from \"react\";\n\n/** Props for the ImageCard component. */\ninterface ImageCardProps {\n /** The image file metadata to display. */\n file: FileMetaData;\n}\n\n/**\n * A grid card item tailored for optimal image display.\n * Falls back to an SVG icon if the image URL or previewUrl fails to load.\n */\nexport function ImageCard({ file }: ImageCardProps) {\n const [hasError, setHasError] = useState(false);\n\n const imageSrc = file.previewUrl || file.url;\n\n if (imageSrc && !hasError) {\n return (\n <img\n src={imageSrc}\n alt={file?.name?.substring(0, 10) || \"image\"}\n className=\"w-full h-full object-contain rounded-md drop-shadow-md\"\n onError={() => setHasError(true)}\n />\n );\n }\n return <ImageIcon />;\n}\n\n/**\n * Renders image-specific metadata in the grid card footer.\n * Displays the intrinsic dimensions (WxH) of the image.\n */\nexport function ImageCardMetadata({ file }: { file: FileMetaData }) {\n if (!file.caption) return null;\n return (\n <p className=\"text-xs text-blue-600 line-clamp-2 mb-2\">\n {file.height} x {file.width}\n </p>\n );\n}","import { FileMetaData } from \"@/types/file-manager\";\nimport { Icons } from \"@/lib/file-utils\";\nimport { Play } from \"lucide-react\";\nimport { useState } from \"react\";\n\n/** Props for the VideoCard component. */\ninterface VideoCardProps {\n /** The video file metadata to display. */\n file: FileMetaData;\n /** Optional CSS class names to apply to the root SVG icon. */\n className?: string;\n}\n\n/**\n * A grid card item representing a playable video file.\n * Prioritizes rendering a lightweight image thumbnail (`previewUrl`), falling back \n * to mounting a muted `<video>` tag for preview if no thumbnail was generated.\n * Provides a play icon overlay to differentiate from static images.\n */\nexport function VideoCard({ file, className }: VideoCardProps) {\n const [hasError, setHasError] = useState(false);\n\n // If we have a previewUrl, prefer it for the thumbnail\n if (file.previewUrl && !hasError) {\n return (\n <div className=\"relative w-full h-full\">\n <img\n src={file.previewUrl}\n className=\"w-full h-full object-contain rounded-md\"\n alt={file.name}\n onError={() => setHasError(true)}\n />\n <div className=\"absolute inset-0 flex items-center justify-center pointer-events-none\">\n <div className=\"bg-black/60 rounded-full p-2 backdrop-blur-xs\">\n <Play className=\"size-5 text-white fill-white\" />\n </div>\n </div>\n </div>\n );\n }\n\n // If we have a video URL and no error, show video preview (fallback if no previewUrl)\n if (file.url && !hasError) {\n return (\n <div className=\"relative w-full h-full\">\n {/* Video element for thumbnail */}\n <video\n src={file.url}\n className=\"w-full h-full object-contain rounded-md\"\n preload=\"metadata\"\n onError={() => setHasError(true)}\n />\n {/* Play button overlay */}\n <div className=\"absolute inset-0 flex items-center justify-center pointer-events-none\">\n <div className=\"bg-black/60 rounded-full p-2 backdrop-blur-xs\">\n <Play className=\"size-5 text-white fill-white\" />\n </div>\n </div>\n </div>\n );\n }\n\n // Fallback to icon if no URL or error\n return (\n <div className=\"w-full h-full flex items-center justify-center bg-transparent\">\n <div className=\"text-center\">\n <div className=\"text-4xl\">\n <Icons type=\"video\" className={className} />\n </div>\n </div>\n </div>\n );\n}\n\n/**\n * Renders video-specific metadata in the grid card footer.\n * Displays the formatted video duration (MM:SS) if available.\n */\nexport function VideoCardMetadata({ file }: { file: FileMetaData }) {\n if (!file.metaData?.duration) return null;\n \n return (\n <p className=\"text-xs text-blue-600 mb-2\">\n Duration: {Math.floor(file.metaData.duration / 60)}:\n {(file.metaData.duration % 60).toString().padStart(2, \"0\")}\n </p>\n );\n}\n","import { FileMetaData } from \"@/types/file-manager\";\nimport { Icons } from \"@/lib/file-utils\";\n\n/** Props for the AudioCard component. */\ninterface AudioCardProps {\n /** The audio file metadata to display. */\n file: FileMetaData;\n /** Optional CSS class names to apply to the root SVG icon. */\n className?: string;\n}\n\n/**\n * A grid card item representing an audio file (e.g., MP3, WAV).\n * Renders a default musical note audio icon centered in the card placeholder.\n */\nexport function AudioCard({ file, className }: AudioCardProps) {\n return (\n <div className=\"w-full h-full flex items-center justify-center bg-transparent\">\n <div className=\"text-center\">\n <div className=\"text-4xl\">\n <Icons type=\"audio\" className={className} />\n </div>\n </div>\n </div>\n );\n}\n\n/**\n * Renders audio-specific metadata in the grid card footer.\n * Displays the formatted audio duration (MM:SS) if available.\n */\nexport function AudioCardMetadata({ file }: { file: FileMetaData }) {\n if (!file.metaData?.duration) return null;\n \n return (\n <p className=\"text-xs text-blue-600 mb-2\">\n Duration: {Math.floor(file.metaData.duration / 60)}:\n {(file.metaData.duration % 60).toString().padStart(2, \"0\")}\n </p>\n );\n}\n","import { FileMetaData } from \"@/types/file-manager\";\nimport { getIconType, Icons } from \"@/lib/file-utils\";\n/** Props for the DocumentCard component. */\ninterface DocumentCardProps {\n /** The document file metadata to display. */\n file: FileMetaData;\n /** Optional CSS class names to apply to the root SVG icon. */\n className?: string;\n}\n\n/**\n * A grid card item representing a document file (e.g., PDF, Word, TXT).\n * Renders a specialized icon based on the document's extension and MIME type.\n * Acts as a visual placeholder when there's no available thumbnail preview.\n */\nexport function DocumentCard({ file, className }: DocumentCardProps) {\n // Use getIconType for proper icon mapping based on MIME type and extension\n const iconType = getIconType(file.mime, file.ext);\n \n return (\n <div className=\"w-full h-full flex items-center justify-center bg-transparent relative\">\n {file.previewUrl ? (\n <img \n src={file.previewUrl} \n alt={file.name} \n className=\"w-full h-full object-contain rounded-md drop-shadow-md\"\n />\n ) : (\n <div className=\"text-center\">\n <div className=\"text-4xl\">\n <Icons type={iconType} className={className} />\n </div>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Renders document-specific metadata in the grid card footer.\n * Displays the total page count if available from the backend.\n */\nexport function DocumentCardMetadata({ file }: { file: FileMetaData }) {\n if (!file.metaData?.pageCount) return null;\n return (\n <p className=\"text-xs text-blue-600 mb-2\">\n Pages: {file.metaData.pageCount}\n </p>\n );\n}\n","import { FileMetaData } from \"@/types/file-manager\";\nimport { getIconType, Icons } from \"@/lib/file-utils\";\n\ninterface DefaultCardProps {\n file: FileMetaData;\n}\n\nexport function DefaultCard({ file }: DefaultCardProps) {\n const iconType = getIconType(file.mime, file.ext);\n return <Icons type={iconType} />;\n}\n","import React from \"react\";\nimport { FileMetaData } from \"@/types/file-manager\";\nimport { getFileTypeFromMime } from \"@/lib/file-utils\";\nimport { ImageCard, ImageCardMetadata } from \"../cards/image-card\";\nimport { VideoCard, VideoCardMetadata } from \"../cards/video-card\";\nimport { AudioCard, AudioCardMetadata } from \"../cards/audio-card\";\nimport { DocumentCard, DocumentCardMetadata } from \"../cards/document-card\";\nimport { DefaultCard } from \"../cards/default-card\";\n\n// Define the interface for the registry values\ninterface FileComponentConfig {\n component: React.ComponentType<{ file: FileMetaData; metaData: any }>;\n metadataComponent?: React.ComponentType<{ file: FileMetaData }>;\n}\n\n// The Registry Object\nexport const FILE_COMPONENT_REGISTRY: Record<string, FileComponentConfig> = {\n images: {\n component: ImageCard,\n metadataComponent: ImageCardMetadata,\n },\n videos: {\n component: VideoCard,\n metadataComponent: VideoCardMetadata,\n },\n files: {\n component: DocumentCard,\n metadataComponent: DocumentCardMetadata,\n },\n audios: {\n component: AudioCard,\n metadataComponent: AudioCardMetadata,\n },\n default: {\n component: DefaultCard,\n },\n};\n\n// Helper to get component safely\nexport function getFileComponents(file: FileMetaData) {\n // Derive type from MIME and extension if not explicitly set\n const type = getFileTypeFromMime(file.mime, file.ext);\n return FILE_COMPONENT_REGISTRY[type] || FILE_COMPONENT_REGISTRY.default;\n}\n","import { cn } from '@/lib/utils';\n\nfunction Kbd({ className, ...props }: React.ComponentProps<'kbd'>) {\n return (\n <kbd\n data-slot=\"kbd\"\n className={cn(\n 'bg-muted text-muted-foreground pointer-events-none inline-flex h-5 w-fit min-w-5 items-center justify-center gap-1 rounded-sm px-1 font-sans text-xs font-medium select-none',\n \"[&_svg:not([class*='size-'])]:size-3\",\n '[[data-slot=tooltip-content]_&]:bg-background/20 [[data-slot=tooltip-content]_&]:text-background dark:[[data-slot=tooltip-content]_&]:bg-background/10',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction KbdGroup({ className, ...props }: React.ComponentProps<'div'>) {\n return <kbd data-slot=\"kbd-group\" className={cn('inline-flex items-center gap-1', className)} {...props} />;\n}\n\nexport { Kbd, KbdGroup };\n","import { useState, useEffect } from \"react\";\nimport { useFileManager } from \"@/context/file-manager-context\";\nimport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { CrossIcon } from \"../icons\";\nimport { KbdGroup, Kbd } from \"../ui/kbd\";\n\nexport function CreateFolderModal() {\n const {\n isCreateFolderModalOpen,\n setIsCreateFolderModalOpen,\n isRenameFolderModalOpen,\n setIsRenameFolderModalOpen,\n createFolder,\n renameFolder,\n folderToRename,\n setFolderToRename\n } = useFileManager();\n\n const [folderName, setFolderName] = useState(\"\");\n\n // Determine if we're in rename mode\n const isRenameMode = isRenameFolderModalOpen;\n const isOpen = isCreateFolderModalOpen || isRenameFolderModalOpen;\n\n // Pre-fill the folder name when in rename mode\n useEffect(() => {\n if (isRenameFolderModalOpen && folderToRename) {\n setFolderName(folderToRename.name);\n } else if (!isCreateFolderModalOpen) {\n setFolderName(\"\");\n }\n }, [isRenameFolderModalOpen, isCreateFolderModalOpen, folderToRename]);\n\n const handleSubmit = async () => {\n if (folderName.trim() !== \"\") {\n if (isRenameMode && folderToRename) {\n const folderId = folderToRename.id;\n if (folderId !== null) {\n await renameFolder(folderId, folderName.trim());\n }\n setIsRenameFolderModalOpen(false);\n setFolderToRename(null); // Clear the folder being renamed\n } else {\n createFolder(folderName.trim());\n setIsCreateFolderModalOpen(false);\n }\n setFolderName(\"\");\n }\n };\n\n const handleClose = () => {\n if (isRenameMode) {\n setIsRenameFolderModalOpen(false);\n setFolderToRename(null); // Clear the folder being renamed\n } else {\n setIsCreateFolderModalOpen(false);\n }\n setFolderName(\"\");\n };\n\n if (!isOpen) return null;\n\n return (\n <Dialog open={isOpen} onOpenChange={handleClose}>\n <DialogContent className=\"p-0 max-w-xl m-auto min-h-fit max-h-[80vh] flex flex-col\" variant=\"fullscreen\" showCloseButton={false}>\n <DialogHeader className=\"pt-5 pb-3 m-0 border-b border-border flex w-full justify-between\">\n <DialogTitle className=\"px-6 text-base\">\n <div className=\"flex w-full items-center justify-between gap-2\">\n <span>{isRenameMode ? \"Rename Folder\" : \"Create New Folder\"}\n\n {!isRenameMode && <span className=\"ml-4\"><KbdGroup>\n <Kbd><span className=\"text-lg\">⌘</span> + F</Kbd>\n </KbdGroup></span>}\n </span>\n \n <Button\n variant=\"outline\"\n size=\"icon\"\n radius=\"full\"\n onClick={handleClose}\n className=\"border-gray-200 bg-white hover:text-red-600 hover:border-red-200 hover:bg-red-50\"\n >\n <CrossIcon className=\"size-5\" />\n <span className=\"hidden\">Close</span>\n </Button>\n </div>\n </DialogTitle>\n </DialogHeader>\n <div className=\"p-6\">\n <label htmlFor=\"folder-name\" className=\"hidden mb-2\">Folder Name:</label>\n <Input\n id=\"folder-name\"\n name=\"folder-name\"\n value={folderName}\n onChange={(e) => setFolderName(e.target.value)}\n placeholder=\"Enter folder name\"\n autoFocus\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && folderName.trim() !== \"\") {\n handleSubmit();\n }\n }}\n />\n </div>\n <DialogFooter className=\"px-6 py-4 border-t border-border w-full sm:justify-between justify-center items-center flex-col sm:flex-row gap-2 \">\n <DialogClose asChild>\n <Button type=\"button\" variant=\"outline\" onClick={handleClose} radius=\"full\" className='w-full md:w-auto'>\n Cancel\n </Button>\n </DialogClose>\n <Button\n type=\"button\"\n disabled={folderName.trim() === \"\"}\n onClick={handleSubmit} radius=\"full\" className='w-full md:w-auto'>\n {isRenameMode ? \"Rename\" : \"Create\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}","import * as React from 'react';\nimport { cn } from '@/lib/utils';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\n// Define input size variants\nconst inputVariants = cva(\n `\n flex w-full bg-background border border-input shadow-xs shadow-black/5 transition-[color,box-shadow] text-foreground placeholder:text-muted-foreground/80 \n focus-visible:ring-ring/30 focus-visible:border-ring focus-visible:outline-none focus-visible:ring-[3px] \n disabled:cursor-not-allowed disabled:opacity-60 \n [&[readonly]]:bg-muted/80 [&[readonly]]:cursor-not-allowed\n file:h-full [&[type=file]]:py-0 file:border-solid file:border-input file:bg-transparent \n file:font-medium file:not-italic file:text-foreground file:p-0 file:border-0 file:border-e\n aria-invalid:border-destructive/60 aria-invalid:ring-destructive/10 dark:aria-invalid:border-destructive dark:aria-invalid:ring-destructive/20\n `,\n {\n variants: {\n variant: {\n lg: 'h-10 px-4 text-sm rounded-md file:pe-4 file:me-4',\n md: 'h-9 px-3 text-sm rounded-md file:pe-3 file:me-3',\n sm: 'h-8 px-2.5 text-xs rounded-md file:pe-2.5 file:me-2.5',\n },\n },\n defaultVariants: {\n variant: 'md',\n },\n },\n);\n\nconst inputAddonVariants = cva(\n 'flex items-center shrink-0 justify-center bg-muted border border-input shadow-xs shadow-[rgba(0,0,0,0.05)] text-secondary-foreground [&_svg]:text-secondary-foreground/60',\n {\n variants: {\n variant: {\n lg: 'rounded-md h-10 min-w-10 px-4 text-sm [&_svg:not([class*=size-])]:size-4.5',\n md: 'rounded-md h-9 min-w-9 px-3 text-sm [&_svg:not([class*=size-])]:size-4.5',\n sm: 'rounded-md h-8 min-w-7 text-xs px-2.5 [&_svg:not([class*=size-])]:size-3.5',\n },\n mode: {\n default: '',\n icon: 'px-0 justify-center',\n },\n },\n defaultVariants: {\n variant: 'md',\n mode: 'default',\n },\n },\n);\n\nconst inputGroupVariants = cva(\n `\n flex items-stretch\n [&_[data-slot=input]]:grow\n [&_[data-slot=input-addon]:has(+[data-slot=input])]:rounded-e-none [&_[data-slot=input-addon]:has(+[data-slot=input])]:border-e-0\n [&_[data-slot=input-addon]:has(+[data-slot=datefield])]:rounded-e-none [&_[data-slot=input-addon]:has(+[data-slot=datefield])]:border-e-0 \n [&_[data-slot=input]+[data-slot=input-addon]]:rounded-s-none [&_[data-slot=input]+[data-slot=input-addon]]:border-s-0\n [&_[data-slot=input-addon]:has(+[data-slot=button])]:rounded-e-none\n [&_[data-slot=input]+[data-slot=button]]:rounded-s-none\n [&_[data-slot=button]+[data-slot=input]]:rounded-s-none\n [&_[data-slot=input-addon]+[data-slot=input]]:rounded-s-none\n [&_[data-slot=input-addon]+[data-slot=datefield]]:[&_[data-slot=input]]:rounded-s-none\n [&_[data-slot=datefield]:has(+[data-slot=input-addon])]:[&_[data-slot=input]]:rounded-e-none\n [&_[data-slot=input]:has(+[data-slot=button])]:rounded-e-none\n [&_[data-slot=input]:has(+[data-slot=input-addon])]:rounded-e-none\n [&_[data-slot=datefield]]:grow\n [&_[data-slot=datefield]+[data-slot=input-addon]]:rounded-s-none \n [&_[data-slot=datefield]+[data-slot=input-addon]]:border-s-0\n [&_[data-slot=datefield]:has(~[data-slot=input-addon])]:[&_[data-slot=input]]:rounded-e-none\n [&_[data-slot=datefield]~[data-slot=input-addon]]:rounded-s-none\n `,\n {\n variants: {},\n defaultVariants: {},\n },\n);\n\nconst inputWrapperVariants = cva(\n `\n flex items-center gap-1.5\n has-[:focus-visible]:ring-ring/30 \n has-[:focus-visible]:border-ring\n has-[:focus-visible]:outline-none \n has-[:focus-visible]:ring-[3px]\n\n [&_[data-slot=datefield]]:grow \n [&_[data-slot=input]]:data-focus-within:ring-transparent \n [&_[data-slot=input]]:data-focus-within:ring-0 \n [&_[data-slot=input]]:data-focus-within:border-0 \n [&_[data-slot=input]]:flex \n [&_[data-slot=input]]:w-full \n [&_[data-slot=input]]:outline-none \n [&_[data-slot=input]]:transition-colors \n [&_[data-slot=input]]:text-foreground\n [&_[data-slot=input]]:placeholder:text-muted-foreground \n [&_[data-slot=input]]:border-0 \n [&_[data-slot=input]]:bg-transparent \n [&_[data-slot=input]]:p-0\n [&_[data-slot=input]]:shadow-none \n [&_[data-slot=input]]:focus-visible:ring-0 \n [&_[data-slot=input]]:h-auto \n [&_[data-slot=input]]:disabled:cursor-not-allowed\n [&_[data-slot=input]]:disabled:opacity-50 \n\n [&_svg]:text-muted-foreground \n [&_svg]:shrink-0\n\n has-[[aria-invalid=true]]:border-destructive/60 \n has-[[aria-invalid=true]]:ring-destructive/10 \n dark:has-[[aria-invalid=true]]:border-destructive \n dark:has-[[aria-invalid=true]]:ring-destructive/20 \n `,\n {\n variants: {\n variant: {\n sm: 'gap-1.25 [&_svg:not([class*=size-])]:size-3.5',\n md: 'gap-1.5 [&_svg:not([class*=size-])]:size-4',\n lg: 'gap-1.5 [&_svg:not([class*=size-])]:size-4',\n },\n },\n defaultVariants: {\n variant: 'md',\n },\n },\n);\n\nfunction Input({\n className,\n type,\n variant,\n ...props\n}: React.ComponentProps<'input'> & VariantProps<typeof inputVariants>) {\n return <input data-slot=\"input\" type={type} className={cn(inputVariants({ variant }), className)} {...props} />;\n}\n\nfunction InputAddon({\n className,\n variant,\n mode,\n ...props\n}: React.ComponentProps<'div'> & VariantProps<typeof inputAddonVariants>) {\n return <div data-slot=\"input-addon\" className={cn(inputAddonVariants({ variant, mode }), className)} {...props} />;\n}\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<'div'> & VariantProps<typeof inputGroupVariants>) {\n return <div data-slot=\"input-group\" className={cn(inputGroupVariants(), className)} {...props} />;\n}\n\nfunction InputWrapper({\n className,\n variant,\n ...props\n}: React.ComponentProps<'div'> & VariantProps<typeof inputWrapperVariants>) {\n return (\n <div\n data-slot=\"input-wrapper\"\n className={cn(inputVariants({ variant }), inputWrapperVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nexport { Input, InputAddon, InputGroup, InputWrapper, inputVariants, inputAddonVariants };\n","'use client';\n\nimport { useState, useEffect } from \"react\";\nimport { useFileManager } from \"@/context/file-manager-context\";\nimport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"@/components/ui/dialog\";\nimport { Button } from \"../ui/button\";\nimport { FolderId, Folder, PaginationInfo } from \"@/types/file-manager\";\nimport { ChevronRight, Loader2 } from 'lucide-react';\nimport FolderIcon from \"../icons/folder\";\nimport { middleTruncate } from \"@/lib/truncate-name\";\nimport { CrossIcon } from \"../icons\";\nimport { useIntersectionObserver } from \"@/hooks/use-intersection-observer\";\n\ntype FolderTreeState = {\n folders: Map<FolderId, Folder[]>; // parentId -> children\n // IDs currently fetching data (including null for root)\n // We can track which page is loading if needed, but simple boolean per folderId is often enough\n loading: Set<FolderId>; \n loaded: Set<FolderId>;\n // Store pagination info per folderId (parentId)\n pagination: Map<FolderId, PaginationInfo>;\n};\n\nfunction FolderTreeItem({\n folder,\n selectedFolderId,\n onSelect,\n onLoadChildren,\n disabledFolderIds = [],\n treeState\n}: {\n folder: Folder;\n selectedFolderId: FolderId | undefined;\n onSelect: (folderId: FolderId) => void;\n onLoadChildren: (folderId: FolderId, page?: number) => Promise<void>;\n disabledFolderIds?: FolderId[];\n treeState: FolderTreeState;\n}) {\n const [isOpen, setIsOpen] = useState(false);\n const hasChildren = (folder.folderCount ?? 0) > 0;\n const isSelected = selectedFolderId === folder.id;\n const isDisabled = disabledFolderIds.includes(folder.id);\n const isLoading = treeState.loading.has(folder.id);\n const isLoaded = treeState.loaded.has(folder.id);\n const children = treeState.folders.get(folder.id) || [];\n const pagination = treeState.pagination.get(folder.id);\n\n // Intersection Observer for infinite scroll\n const { ref: observerRef, entry } = useIntersectionObserver({\n threshold: 0.1,\n rootMargin: '100px',\n });\n\n const hasMore = pagination && pagination.currentPage < pagination.totalPages;\n\n useEffect(() => {\n if (isOpen && entry?.isIntersecting && hasMore && !isLoading) {\n const nextPage = (pagination?.currentPage || 1) + 1;\n onLoadChildren(folder.id, nextPage);\n }\n }, [entry?.isIntersecting, hasMore, isLoading, isOpen, pagination, folder.id, onLoadChildren]);\n\n\n const handleToggle = async () => {\n if (!hasChildren) return;\n\n const newIsOpen = !isOpen;\n setIsOpen(newIsOpen);\n\n // Load children if opening and not yet loaded\n if (newIsOpen && !isLoaded && !isLoading) {\n await onLoadChildren(folder.id, 1);\n }\n };\n\n const handleSelect = () => {\n if (!isDisabled) {\n onSelect(folder.id);\n }\n };\n\n return (\n <li >\n <div className=\"flex items-center gap-1.5 py-1\">\n {hasChildren ? (\n <button\n onClick={handleToggle}\n className=\"p-1 -m-1 hover:bg-gray-100 rounded transition-colors\"\n aria-label={isOpen ? \"Collapse folder\" : \"Expand folder\"}\n >\n <ChevronRight\n className={`size-4 text-gray-500 transition-transform ${!isDisabled && isOpen ? 'rotate-90' : ''}`}\n />\n </button>\n ) : (\n <div className=\"w-4\" />\n )}\n\n <button\n onClick={handleSelect}\n disabled={isDisabled}\n title={folder.name}\n className={`flex items-center gap-1.5 px-2 py-1 rounded-xl flex-1 text-left transition-colors min-w-0 ${isSelected\n ? 'bg-blue-100 text-blue-600 font-semibold'\n : isDisabled\n ? 'opacity-50 cursor-not-allowed'\n : 'hover:bg-gray-100'\n }`}\n >\n <FolderIcon className=\"size-8 text-white shrink-0\" strokeWidth={1.5} />\n <div className=\"flex flex-col gap-1\">\n <span className=\"truncate min-w-0\">{ middleTruncate(folder.name, 15)}</span>\n {isDisabled ? <span className=\"text-[0.6rem] text-left font-medium text-gray-900\">(Already selected)</span> : ''}\n </div>\n </button>\n </div>\n\n {!isDisabled && isOpen && (\n <ul className=\"pl-6\">\n {children.map((childFolder) => (\n <FolderTreeItem\n key={childFolder.id}\n folder={childFolder}\n selectedFolderId={selectedFolderId}\n onSelect={onSelect}\n onLoadChildren={onLoadChildren}\n disabledFolderIds={disabledFolderIds}\n treeState={treeState}\n />\n ))}\n \n {/* Loading Indicator / Sentinel */}\n {(isLoading || hasMore) && (\n <li ref={observerRef} className=\"py-2 pl-6 flex justify-start\">\n <Loader2 className=\"h-4 w-4 animate-spin text-blue-500\" />\n </li>\n )}\n\n {/* Initial loading state specifically when no children loaded yet */}\n {isLoading && children.length === 0 && (\n <li className=\"py-1\">\n <div className=\"flex items-center gap-1.5 px-2\">\n <span className=\"text-sm text-gray-500\">Loading...</span>\n </div>\n </li>\n )}\n </ul>\n )}\n </li>\n );\n}\n\nexport function MoveModal() {\n const {\n isMoveFileModalOpen,\n setIsMoveFileModalOpen,\n selectedFiles,\n selectedFolders,\n bulkMove,\n provider\n } = useFileManager();\n\n const [targetFolderId, setTargetFolderId] = useState<FolderId | undefined>(undefined);\n const [treeState, setTreeState] = useState<FolderTreeState>({\n folders: new Map(),\n loading: new Set(),\n loaded: new Set(),\n pagination: new Map()\n });\n \n // Intersection Observer for Root list infinite scroll\n const { ref: rootObserverRef, entry: rootEntry } = useIntersectionObserver({\n threshold: 0.1,\n rootMargin: '100px',\n });\n\n const rootPagination = treeState.pagination.get(null);\n const rootHasMore = rootPagination && rootPagination.currentPage < rootPagination.totalPages;\n const isRootLoading = treeState.loading.has(null);\n\n // Get list of folder IDs that should be disabled (can't move into themselves or their children)\n const disabledFolderIds = selectedFolders.map(f => f.id);\n\n // Get root folders from tree state\n const rootFolders = treeState.folders.get(null) || [];\n\n // Load root folders when modal opens\n useEffect(() => {\n if (isMoveFileModalOpen && !treeState.loaded.has(null) && !treeState.loading.has(null)) {\n loadFolders(null, 1);\n }\n }, [isMoveFileModalOpen]);\n\n // Trigger load more for root\n useEffect(() => {\n if (isMoveFileModalOpen && rootEntry?.isIntersecting && rootHasMore && !isRootLoading) {\n const nextPage = (rootPagination?.currentPage || 1) + 1;\n loadFolders(null, nextPage);\n }\n }, [rootEntry?.isIntersecting, rootHasMore, isRootLoading, rootPagination, isMoveFileModalOpen]);\n\n\n const loadFolders = async (folderId: FolderId, page: number = 1) => {\n // Prevent duplicate loading\n if (treeState.loading.has(folderId)) return;\n\n // Mark as loading\n setTreeState(prev => ({\n ...prev,\n loading: new Set(prev.loading).add(folderId)\n }));\n\n try {\n // Assuming 20 items per page for the modal list to be performant but substantial\n const result = await provider.getFolders(folderId, page, 20);\n\n setTreeState(prev => {\n const newLoading = new Set(prev.loading);\n newLoading.delete(folderId);\n\n const newLoaded = new Set(prev.loaded);\n newLoaded.add(folderId);\n\n const newFolders = new Map(prev.folders);\n const existingFolders = newFolders.get(folderId) || [];\n \n // Append if page > 1, otherwise replace (shouldn't really happen with this logic but safer)\n if (page > 1) {\n newFolders.set(folderId, [...existingFolders, ...result.folders]);\n } else {\n newFolders.set(folderId, result.folders);\n }\n\n const newPagination = new Map(prev.pagination);\n newPagination.set(folderId, result.pagination);\n\n return {\n folders: newFolders,\n loading: newLoading,\n loaded: newLoaded,\n pagination: newPagination\n };\n });\n } catch (error) {\n console.error(`Failed to load folders for ${folderId}:`, error);\n\n // Reset loading state on error\n setTreeState(prev => {\n const newLoading = new Set(prev.loading);\n newLoading.delete(folderId);\n\n return {\n ...prev,\n loading: newLoading\n };\n });\n }\n };\n\n const handleMove = () => {\n if (targetFolderId !== undefined) {\n bulkMove(targetFolderId);\n setIsMoveFileModalOpen(false);\n setTargetFolderId(undefined);\n setTreeState({\n folders: new Map(),\n loading: new Set(),\n loaded: new Set(),\n pagination: new Map()\n });\n }\n };\n\n const handleOpenChange = (open: boolean) => {\n setIsMoveFileModalOpen(open);\n if (open) {\n loadFolders(null, 1);\n } else {\n setTargetFolderId(undefined);\n setTreeState({\n folders: new Map(),\n loading: new Set(),\n loaded: new Set(),\n pagination: new Map()\n });\n }\n };\n\n if (!isMoveFileModalOpen) return null;\n\n return (\n <Dialog open={isMoveFileModalOpen} onOpenChange={handleOpenChange} >\n <DialogContent className=\"p-0 max-w-3xl max-h-full m-auto md:max-h-[80vh] flex flex-col\" variant=\"fullscreen\" showCloseButton={false}>\n <DialogHeader className=\"pt-5 pb-3 m-0 border-b border-border\">\n <DialogTitle className=\"px-6 text-base\">\n <div className=\"flex w-full items-center justify-between gap-2\">\n <span className=\"w-full text-left\">\n Move Items\n <p className=\"text-gray-400 text-xs\">\n Moving {selectedFiles.length} file\n {selectedFiles.length === 1 ? \"\" : \"s\"} and{\" \"}\n {selectedFolders.length} folder\n {selectedFolders.length === 1 ? \"\" : \"s\"}.\n </p>\n </span>\n\n <Button\n variant=\"outline\"\n size=\"icon\"\n radius=\"full\"\n onClick={() => handleOpenChange(false)}\n className=\"border-gray-200 bg-white hover:text-red-600 hover:border-red-200 hover:bg-red-50\"\n >\n <CrossIcon className=\"size-5\" />\n <span className=\"hidden\">Close</span>\n </Button>\n </div>\n </DialogTitle>\n <DialogDescription />\n </DialogHeader>\n <div className=\"text-sm my-3 px-6 flex-1 flex flex-col min-h-0\">\n <div className=\"space-y-4 flex flex-col flex-1 min-h-0\">\n <div className=\"flex flex-col flex-1 min-h-0\">\n <label className=\"block mb-2 font-medium text-gray-900\">\n Select destination folder:\n </label>\n\n {/* Root List */}\n <ul className=\"border rounded-xl p-2 shadow-inner overflow-y-auto flex-1 min-h-0\">\n {/* Root selection item */}\n <li>\n <div className=\"flex items-center gap-1.5 py-1\">\n <div className=\"w-4\" />\n <button\n onClick={() => setTargetFolderId(null)}\n className={`flex items-center gap-1.5 px-2 py-1 rounded-xl flex-1 text-left transition-colors min-w-0 ${targetFolderId === null\n ? 'bg-blue-100 text-blue-600 font-semibold'\n : 'hover:bg-gray-100'\n }`}\n >\n <FolderIcon className=\"size-8 text-white shrink-0\" strokeWidth={1.5} />\n <div className=\"flex flex-col gap-1\">\n <span className=\"truncate min-w-0\">Root Directory</span>\n </div>\n </button>\n </div>\n </li>\n \n {rootFolders.map((folder) => (\n <FolderTreeItem\n key={folder.id}\n folder={folder}\n selectedFolderId={targetFolderId}\n onSelect={(id) => setTargetFolderId(id)}\n onLoadChildren={loadFolders}\n disabledFolderIds={disabledFolderIds}\n treeState={treeState}\n />\n ))}\n {(isRootLoading || rootHasMore) && (\n <li ref={rootObserverRef} className=\"py-2 pl-6 flex justify-start\">\n <Loader2 className=\"h-5 w-5 animate-spin text-blue-500\" />\n </li>\n )}\n {rootFolders.length === 0 && !isRootLoading && !rootHasMore && (\n <li className=\"text-gray-500 text-sm text-center py-4\">\n No nested folders available\n </li>\n )}\n </ul>\n </div>\n </div>\n </div>\n <DialogFooter className=\"px-6 py-4 border-t border-border w-full sm:justify-between justify-center items-center flex-col sm:flex-row gap-2 \">\n <DialogClose asChild>\n <Button type=\"button\" variant=\"outline\" radius=\"full\" className='w-full md:w-auto'>\n Cancel\n </Button>\n </DialogClose>\n <Button type=\"button\" onClick={handleMove} disabled={targetFolderId === undefined} radius=\"full\" className='w-full md:w-auto'>\n Move\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","export function splitAndTruncate(filename: string, maxLength: number = 28): string {\n if (filename.length <= maxLength) return filename;\n\n const lastDot = filename.lastIndexOf('.');\n const ext = lastDot !== -1 ? filename.slice(lastDot) : '';\n const name = lastDot !== -1 ? filename.slice(0, lastDot) : filename;\n\n const ellipsis = '...';\n const lineLength = Math.floor(maxLength / 2);\n\n // First line: start of the name\n const firstLine = name.slice(0, lineLength);\n\n // Second line: [endChunk1] + ... + [endChunk2] + ext\n const endAvailable = lineLength;\n const chunkLength = Math.floor((endAvailable - ellipsis.length) / 2);\n const endChunk1 = name.slice(-endAvailable, -chunkLength);\n const endChunk2 = name.slice(-chunkLength);\n const wasTruncated = name.length > lineLength + endAvailable;\n const secondLine = endChunk1 + (wasTruncated ? ellipsis : '') + endChunk2 + ext;\n\n return `${firstLine}\\n${secondLine}`;\n}\n\nexport function middleTruncate(text: string, maxLength: number = 30): string {\n if (text.length <= maxLength) return text;\n const start = text.slice(0, Math.ceil(maxLength / 2));\n const end = text.slice(-Math.floor(maxLength / 2));\n return `${start}...${end}`;\n}\n","import { useEffect, useRef, useState } from 'react';\n\ninterface UseIntersectionObserverProps {\n threshold?: number;\n root?: Element | null;\n rootMargin?: string;\n}\n\nexport function useIntersectionObserver({\n threshold = 0,\n root = null,\n rootMargin = '0%',\n}: UseIntersectionObserverProps = {}) {\n const [entry, setEntry] = useState<IntersectionObserverEntry>();\n const [node, setNode] = useState<Element | null>(null);\n\n const observer = useRef<IntersectionObserver | null>(null);\n\n useEffect(() => {\n if (observer.current) {\n observer.current.disconnect();\n }\n\n if (node) {\n if (typeof window !== 'undefined' && 'IntersectionObserver' in window) {\n observer.current = new IntersectionObserver(\n ([newEntry]) => {\n setEntry(newEntry);\n },\n { threshold, root, rootMargin }\n );\n\n observer.current.observe(node);\n }\n }\n\n return () => {\n if (observer.current) {\n observer.current.disconnect();\n }\n };\n }, [node, threshold, root, rootMargin]);\n\n return { ref: setNode, entry };\n}\n","'use client';\n\nimport { useState, ChangeEvent } from 'react';\nimport { Loader2 } from 'lucide-react';\nimport { FileMetaData } from '@/types/file-manager';\nimport { DetailsLayout } from '@/components/file-details/details-layout';\nimport { FileDeleteButton, FileDownloadButton, FileCopyLinkButton, FileFullscreenButton } from '@/components/file-details/file-action-buttons';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Textarea } from '@/components/ui/textarea';\nimport { Label } from '@/components/ui/label';\nimport { getFileSize } from '@/lib/file-size';\nimport { formatDate } from '@/lib/format-utils';\nimport { Field, FieldDescription, FieldGroup, FieldLabel } from '../ui/field';\nimport { InputGroup, InputGroupAddon, InputGroupInput, InputGroupText } from '../ui/input-group';\n\n/**\n * Props for the ImageModal component.\n */\ninterface ImageModalProps {\n /** The image file data object to display and edit. */\n file: FileMetaData;\n /** Callback fired when the modal is closed without saving or after a successful save. */\n onClose: () => void;\n /**\n * Asynchronous callback fired when the user saves their changes.\n * Receives a partial metadata object containing the requested updates.\n */\n onSave?: (updates: Partial<FileMetaData>) => Promise<void> | void;\n /** Optional callback fired when the user chooses to delete the image. */\n onDelete?: () => void;\n}\n\n/**\n * A modal component tailored for viewing and editing image assets.\n * Supports updating the file name, alternative text, and caption.\n * Displays a full-screen preview with the image set as a blurred background.\n */\nexport function ImageModal({ file, onClose, onSave, onDelete }: ImageModalProps) {\n const [isSaving, setIsSaving] = useState(false);\n const [fileName, setFileName] = useState(file.name);\n const [alternativeText, setAlternativeText] = useState(file.alternativeText || '');\n const [caption, setCaption] = useState(file.caption || '');\n\n const handleSave = async () => {\n setIsSaving(true);\n try {\n await onSave?.({\n name: fileName,\n alternativeText,\n caption,\n });\n onClose();\n } finally {\n setIsSaving(false);\n }\n };\n\n const previewSection = (\n <div className=\"flex flex-col h-full\">\n {/* Action Buttons */}\n <div className=\"flex gap-2 mb-4\">\n <FileDeleteButton file={file} />\n <FileDownloadButton file={file} />\n <FileCopyLinkButton file={file} />\n <FileFullscreenButton file={file} onFullscreen={() => window.open(file.url, '_blank')} />\n </div>\n\n {/* Image Preview */}\n <div className=\"flex-1 flex items-center justify-center bg-gray-50 dark:bg-gray-900 rounded-lg overflow-hidden\"\n style={{\n backgroundImage: `\n linear-gradient(45deg, #e5e7eb 25%, transparent 25%),\n linear-gradient(-45deg, #e5e7eb 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #e5e7eb 75%),\n linear-gradient(-45deg, transparent 75%, #e5e7eb 75%)\n `,\n backgroundSize: '20px 20px',\n backgroundPosition: '0 0, 0 10px, 10px -10px, -10px 0px',\n }}\n >\n <img\n src={file.previewUrl || file.url}\n alt={file.alternativeText || file.name}\n className=\"max-w-full max-h-full object-contain\"\n />\n </div>\n </div>\n );\n\n const metadataSection = (\n <div className=\"space-y-6\">\n {/* Metadata Grid */}\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <p className=\"text-xs font-medium text-muted-foreground tracking-wide mb-1\">\n Size\n </p>\n <p className=\"text-xs font-bold text-blue-600\">{getFileSize(file.size)}</p>\n </div>\n\n <div>\n <p className=\"text-xs font-medium text-muted-foreground tracking-wide mb-1\">\n Dimensions\n </p>\n <p className=\"text-xs font-bold text-blue-600\">\n {file.width && file.height ? `${file.width}×${file.height}` : 'N/A'}\n </p>\n </div>\n\n <div>\n <p className=\"text-xs font-medium text-muted-foreground tracking-wide mb-1\">\n Date\n </p>\n <p className=\"text-xs font-bold text-blue-600\">\n {formatDate(file.createdAt)}\n </p>\n </div>\n\n <div>\n <p className=\"text-xs font-medium text-muted-foreground tracking-wide mb-1\">\n Extension\n </p>\n <p className=\"text-xs font-bold text-blue-600\">{file.ext?.replace('.', '') || 'N/A'}</p>\n </div>\n\n\n </div>\n\n {/* Editable Fields */}\n <div className=\"space-y-4 pt-4 border-t\">\n <div className=\"space-y-2\">\n <Field className='gap-0'>\n <FieldLabel htmlFor=\"fileName\">File name</FieldLabel>\n <InputGroup>\n <InputGroupInput id=\"fileName\" placeholder=\"Enter file name\" value={fileName.replace(file.ext || '', '')} onChange={(e: ChangeEvent<HTMLInputElement>) => setFileName(e.target.value)} />\n <InputGroupAddon align=\"inline-end\" className='pr-1'>\n <InputGroupText className='font-bold bg-gray-200 rounded-lg py-1 px-3'>{file.ext}</InputGroupText>\n </InputGroupAddon>\n </InputGroup>\n </Field>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"altText\">Alternative text</Label>\n <Textarea\n id=\"altText\"\n value={alternativeText}\n onChange={(e: ChangeEvent<HTMLTextAreaElement>) => setAlternativeText(e.target.value)}\n placeholder=\"Describe the image for accessibility\"\n rows={3}\n />\n <p className=\"text-xs text-muted-foreground\">\n This text will be displayed if the asset can't be shown.\n </p>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"caption\">Caption</Label>\n <Textarea\n id=\"caption\"\n value={caption}\n onChange={(e: ChangeEvent<HTMLTextAreaElement>) => setCaption(e.target.value)}\n placeholder=\"Add a caption\"\n rows={3}\n />\n </div>\n </div>\n </div>\n );\n\n const footer = (\n <div className=\"flex w-full justify-between items-center flex-col sm:flex-row gap-2 \">\n <Button className='w-full md:w-auto' variant=\"outline\" onClick={onClose} radius=\"full\" disabled={isSaving}>\n Cancel\n </Button>\n <Button className='w-full md:w-auto' onClick={handleSave} radius=\"full\" disabled={isSaving}>\n {isSaving && <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />}\n Finish\n </Button>\n </div>\n );\n\n\n return (\n <DetailsLayout\n title=\"Details\"\n open={true}\n onClose={onClose}\n previewSection={previewSection}\n metadataSection={metadataSection}\n footer={footer}\n />\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '@/lib/utils';\nimport { ScrollArea as ScrollAreaPrimitive } from 'radix-ui';\n\nfunction ScrollArea({\n className,\n viewportClassName,\n children,\n viewportRef,\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.Root> & {\n viewportRef?: React.Ref<HTMLDivElement>;\n viewportClassName?: string;\n}) {\n return (\n <ScrollAreaPrimitive.Root data-slot=\"scroll-area\" className={cn('relative overflow-hidden', className)} {...props}>\n <ScrollAreaPrimitive.Viewport\n ref={viewportRef}\n className={cn('h-full w-full rounded-[inherit]', viewportClassName)}\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n );\n}\n\nfunction ScrollBar({\n className,\n orientation = 'vertical',\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n 'flex touch-none select-none transition-colors',\n orientation === 'vertical' && 'h-full w-2 border-l border-l-transparent p-[1px]',\n orientation === 'horizontal' && 'h-2 flex-col border-t border-t-transparent p-[1px]',\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n );\n}\n\nexport { ScrollArea, ScrollBar };\n","'use client';\n\nimport { ReactNode } from 'react';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/dialog';\nimport { ScrollArea } from '../ui/scroll-area';\nimport { Button } from '../ui/button';\nimport { CrossIcon } from '../icons';\n\ninterface DetailsLayoutProps {\n title: string;\n open: boolean;\n onClose: () => void;\n previewSection: ReactNode;\n metadataSection: ReactNode;\n footer: ReactNode;\n}\n\nexport function DetailsLayout({\n title,\n open,\n onClose,\n previewSection,\n metadataSection,\n footer,\n}: DetailsLayoutProps) {\n return (\n <Dialog open={open} onOpenChange={(isOpen) => !isOpen && onClose()} >\n <DialogContent className=\"p-0 max-w-6xl m-auto xl:min-h-fit max-h-[85vh] flex flex-col\" variant=\"fullscreen\" showCloseButton={false}>\n <DialogHeader className=\"pt-5 pb-3 m-0 border-b border-border\">\n <DialogTitle className=\"px-6 text-base\">\n <div className=\"flex w-full justify-between gap-2\">\n <span>{title}</span>\n <Button\n variant=\"outline\"\n size=\"icon\"\n radius=\"full\"\n onClick={() => onClose()}\n className=\"border-gray-200 bg-white hover:text-red-600 hover:border-red-200 hover:bg-red-50\"\n >\n <CrossIcon className=\"size-5\" />\n <span className=\"hidden\">Close</span>\n </Button>\n </div>\n </DialogTitle>\n <DialogDescription />\n </DialogHeader>\n <ScrollArea className=\"flex-1 min-h-0\">\n {/* Content */}\n <div className=\"grid grid-cols-1 lg:grid-cols-2 min-h-full max-h-[65vh] overflow-scroll\">\n {/* Preview Section - Left side on desktop, top on mobile */}\n <div className=\"p-6 border-b lg:border-b-0 lg:border-r\">\n {previewSection}\n </div>\n\n {/* Metadata Section - Right side on desktop, bottom on mobile */}\n <div className=\"p-6\">\n {metadataSection}\n </div>\n </div>\n </ScrollArea>\n {/* Footer */}\n <DialogFooter className=\"px-6 py-4 border-t border-border\">\n {footer}\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","'use client';\n\nimport { FileMetaData } from '@/types/file-manager';\nimport { Loader2 } from 'lucide-react';\nimport { Button } from '@/components/ui/button';\nimport { toast } from 'sonner';\nimport { DownloadIcon, FullscreenIcon, LinkIcon, TrashIcon } from '../icons';\nimport { useState } from 'react';\nimport { useFileManager } from '@/context/file-manager-context';\nimport CheckIcon from '../icons/check';\nimport { middleTruncate } from '@/lib/truncate-name';\n\n// Individual file action button components - composable and reusable\n\ninterface FileButtonProps {\n file: FileMetaData;\n}\n\nexport function FileDeleteButton({ file }: FileButtonProps) {\n const { provider, setFileDetailsModalFile, refreshData } = useFileManager();\n const [deleting, setDeleting] = useState(false);\n\n const handleDelete = async () => {\n setDeleting(true);\n try {\n // Call provider's delete method directly with this specific file\n await provider.deleteFiles([file.id]);\n \n // Refresh the file list\n await refreshData();\n \n // Close the details modal after successful deletion\n setFileDetailsModalFile(null);\n \n toast.success('File Deleted', {\n description: `${middleTruncate(file.name, 20)} has been deleted`,\n });\n } catch (error) {\n toast.error('Delete failed');\n setDeleting(false);\n }\n };\n\n return (\n <Button\n variant=\"outline\"\n size=\"icon\"\n radius=\"full\"\n title=\"Delete\"\n className='border-gray-200 bg-white hover:text-red-600 hover:border-red-200 hover:bg-red-50 active:scale-95 transition-transform'\n onClick={handleDelete}\n disabled={deleting}\n >\n {deleting ? (\n <Loader2 className=\"size-5 animate-spin\" />\n ) : (\n <TrashIcon className=\"size-5\" />\n )}\n </Button>\n );\n}\n\nexport function FileDownloadButton({ file }: FileButtonProps) {\n const [downloading, setDownloading] = useState(false);\n\n const handleDownload = async () => {\n setDownloading(true);\n try {\n // Default download behavior\n const link = document.createElement('a');\n link.href = file.url;\n link.download = file.name;\n link.click();\n toast.success('Download Started', {\n description: `Downloading ${middleTruncate(file.name, 20)}`,\n });\n } catch (error) {\n toast.error('Download failed');\n } finally {\n setDownloading(false);\n }\n };\n\n return (\n <Button\n variant=\"outline\"\n size=\"icon\"\n radius=\"full\"\n onClick={handleDownload}\n className=\"border-gray-200 bg-white hover:text-blue-600 hover:border-blue-200 hover:bg-blue-50 active:scale-95 transition-transform\"\n title=\"Download\"\n disabled={downloading}\n >\n {downloading ? (\n <Loader2 className=\"size-5 animate-spin\" />\n ) : (\n <DownloadIcon className=\"size-5\" strokeWidth={2.5} />\n )}\n </Button>\n );\n}\n\nexport function FileCopyLinkButton({ file }: FileButtonProps) {\n const [copied, setCopied] = useState(false);\n\n const handleCopyLink = async () => {\n try {\n await navigator.clipboard.writeText(file.url);\n setCopied(true);\n toast.success('Link Copied', {\n description: 'File URL copied to clipboard',\n });\n \n // Reset after 2 seconds\n setTimeout(() => setCopied(false), 2000);\n } catch (error) {\n toast.error('Failed to copy link');\n }\n };\n\n return (\n <Button\n variant=\"outline\"\n size=\"icon\"\n radius=\"full\"\n onClick={handleCopyLink}\n className={`border-gray-200 bg-white active:scale-95 transition-all ${\n copied \n ? 'text-green-700 border-green-400 bg-green-100 font-bold' \n : 'hover:text-orange-600 hover:border-orange-200 hover:bg-orange-50'\n }`}\n title=\"Copy Link\"\n disabled={copied}\n >\n {copied ? (\n <CheckIcon className=\"size-5 animate-in zoom-in duration-200\" strokeWidth={3} />\n ) : (\n <LinkIcon className=\"size-5\" strokeWidth={2.5} />\n )}\n </Button>\n );\n}\n\ninterface FileFullscreenButtonProps {\n file: FileMetaData;\n onFullscreen: () => void;\n}\n\nexport function FileFullscreenButton({ file, onFullscreen }: FileFullscreenButtonProps) {\n return (\n <Button\n variant=\"outline\"\n size=\"icon\"\n radius=\"full\"\n onClick={onFullscreen}\n className=\"border-gray-200 bg-white hover:text-purple-600 hover:border-purple-200 hover:bg-purple-50 active:scale-95 transition-transform\"\n title=\"Fullscreen\"\n >\n <FullscreenIcon className=\"size-5\" strokeWidth={1} />\n </Button>\n );\n}\n","\nexport default function CheckIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...props}\n >\n <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M5 12l5 5l10 -10\" />\n </svg>\n\n );\n}\n\n\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '@/lib/utils';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\n// Define input size variants\nconst textareaVariants = cva(\n `\n w-full bg-background border border-input bg-background text-foreground shadow-xs shadow-black/5 transition-[color,box-shadow] \n text-foreground placeholder:text-muted-foreground/80 focus-visible:border-ring focus-visible:outline-none focus-visible:ring-[3px] \n focus-visible:ring-ring/30 disabled:cursor-not-allowed disabled:opacity-50 [&[readonly]]:opacity-70 \n aria-invalid:border-destructive aria-invalid:border-destructive/60 aria-invalid:ring-destructive/10 dark:aria-invalid:border-destructive dark:aria-invalid:ring-destructive/20\n `,\n {\n variants: {\n variant: {\n sm: 'px-2.5 py-2.5 text-xs rounded-md',\n md: 'px-3 py-3 text-sm rounded-md',\n lg: 'px-4 py-4 text-sm rounded-md',\n },\n },\n defaultVariants: {\n variant: 'md',\n },\n },\n);\n\nfunction Textarea({\n className,\n variant,\n ...props\n}: React.ComponentProps<'textarea'> & VariantProps<typeof textareaVariants>) {\n return <textarea data-slot=\"textarea\" className={cn(textareaVariants({ variant }), className)} {...props} />;\n}\n\nexport { Textarea, textareaVariants };\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '@/lib/utils';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Label as LabelPrimitive } from 'radix-ui';\n\nconst labelVariants = cva(\n 'text-sm leading-none text-foreground peer-disabled:cursor-not-allowed peer-disabled:opacity-50',\n {\n variants: {\n variant: {\n primary: 'font-medium',\n secondary: 'font-normal',\n },\n },\n defaultVariants: {\n variant: 'primary',\n },\n },\n);\n\nfunction Label({\n className,\n variant,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root> & VariantProps<typeof labelVariants>) {\n return <LabelPrimitive.Root data-slot=\"label\" className={cn(labelVariants({ variant }), className)} {...props} />;\n}\n\nexport { Label };\n","/**\n * Formats a date to MM/DD/YYYY format\n */\nexport function formatDate(date: Date | string): string {\n const d = typeof date === 'string' ? new Date(date) : date;\n const month = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n const year = d.getFullYear();\n return `${month}/${day}/${year}`;\n}\n\n/**\n * Formats duration in seconds to MM:SS format\n */\nexport function formatDuration(seconds: number): string {\n const mins = Math.floor(seconds / 60);\n const secs = seconds % 60;\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n}\n","\"use client\"\n\nimport { useMemo } from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Label } from \"@/components/ui/label\"\nimport { Separator } from \"@/components/ui/separator\"\n\nfunction FieldSet({ className, ...props }: React.ComponentProps<\"fieldset\">) {\n return (\n <fieldset\n data-slot=\"field-set\"\n className={cn(\n \"flex flex-col gap-6\",\n \"has-[>[data-slot=checkbox-group]]:gap-3 has-[>[data-slot=radio-group]]:gap-3\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLegend({\n className,\n variant = \"legend\",\n ...props\n}: React.ComponentProps<\"legend\"> & { variant?: \"legend\" | \"label\" }) {\n return (\n <legend\n data-slot=\"field-legend\"\n data-variant={variant}\n className={cn(\n \"mb-3 font-medium\",\n \"data-[variant=legend]:text-base\",\n \"data-[variant=label]:text-sm\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-group\"\n className={cn(\n \"group/field-group @container/field-group flex w-full flex-col gap-7 data-[slot=checkbox-group]:gap-3 [&>[data-slot=field-group]]:gap-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nconst fieldVariants = cva(\n \"group/field flex w-full gap-3 data-[invalid=true]:text-destructive\",\n {\n variants: {\n orientation: {\n vertical: [\"flex-col [&>*]:w-full [&>.sr-only]:w-auto\"],\n horizontal: [\n \"flex-row items-center\",\n \"[&>[data-slot=field-label]]:flex-auto\",\n \"has-[>[data-slot=field-content]]:items-start has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n ],\n responsive: [\n \"flex-col [&>*]:w-full [&>.sr-only]:w-auto @md/field-group:flex-row @md/field-group:items-center @md/field-group:[&>*]:w-auto\",\n \"@md/field-group:[&>[data-slot=field-label]]:flex-auto\",\n \"@md/field-group:has-[>[data-slot=field-content]]:items-start @md/field-group:has-[>[data-slot=field-content]]:[&>[role=checkbox],[role=radio]]:mt-px\",\n ],\n },\n },\n defaultVariants: {\n orientation: \"vertical\",\n },\n }\n)\n\nfunction Field({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof fieldVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"field\"\n data-orientation={orientation}\n className={cn(fieldVariants({ orientation }), className)}\n {...props}\n />\n )\n}\n\nfunction FieldContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-content\"\n className={cn(\n \"group/field-content flex flex-1 flex-col gap-1.5 leading-snug\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldLabel({\n className,\n ...props\n}: React.ComponentProps<typeof Label>) {\n return (\n <Label\n data-slot=\"field-label\"\n className={cn(\n \"group/field-label peer/field-label flex w-fit gap-2 leading-snug group-data-[disabled=true]/field:opacity-50\",\n \"has-[>[data-slot=field]]:w-full has-[>[data-slot=field]]:flex-col has-[>[data-slot=field]]:rounded-md has-[>[data-slot=field]]:border [&>*]:data-[slot=field]:p-4\",\n \"has-data-[state=checked]:bg-primary/5 has-data-[state=checked]:border-primary dark:has-data-[state=checked]:bg-primary/10\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-label\"\n className={cn(\n \"flex w-fit items-center gap-2 text-sm leading-snug font-medium group-data-[disabled=true]/field:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"field-description\"\n className={cn(\n \"text-muted-foreground text-sm leading-normal font-normal group-has-[[data-orientation=horizontal]]/field:text-balance\",\n \"last:mt-0 nth-last-2:-mt-1 [[data-variant=legend]+&]:-mt-1.5\",\n \"[&>a:hover]:text-primary [&>a]:underline [&>a]:underline-offset-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction FieldSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & {\n children?: React.ReactNode\n}) {\n return (\n <div\n data-slot=\"field-separator\"\n data-content={!!children}\n className={cn(\n \"relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2\",\n className\n )}\n {...props}\n >\n <Separator className=\"absolute inset-0 top-1/2\" />\n {children && (\n <span\n className=\"bg-background text-muted-foreground relative mx-auto block w-fit px-2\"\n data-slot=\"field-separator-content\"\n >\n {children}\n </span>\n )}\n </div>\n )\n}\n\nfunction FieldError({\n className,\n children,\n errors,\n ...props\n}: React.ComponentProps<\"div\"> & {\n errors?: Array<{ message?: string } | undefined>\n}) {\n const content = useMemo(() => {\n if (children) {\n return children\n }\n\n if (!errors?.length) {\n return null\n }\n\n const uniqueErrors = [\n ...new Map(errors.map((error) => [error?.message, error])).values(),\n ]\n\n if (uniqueErrors?.length == 1) {\n return uniqueErrors[0]?.message\n }\n\n return (\n <ul className=\"ml-4 flex list-disc flex-col gap-1\">\n {uniqueErrors.map(\n (error, index) =>\n error?.message && <li key={index}>{error.message}</li>\n )}\n </ul>\n )\n }, [children, errors])\n\n if (!content) {\n return null\n }\n\n return (\n <div\n role=\"alert\"\n data-slot=\"field-error\"\n className={cn(\"text-destructive text-sm font-normal\", className)}\n {...props}\n >\n {content}\n </div>\n )\n}\n\nexport {\n Field,\n FieldLabel,\n FieldDescription,\n FieldError,\n FieldGroup,\n FieldLegend,\n FieldSeparator,\n FieldSet,\n FieldContent,\n FieldTitle,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Separator as SeparatorPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Separator({\n className,\n orientation = \"horizontal\",\n decorative = true,\n ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n return (\n <SeparatorPrimitive.Root\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport { Separator }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Textarea } from \"@/components/ui/textarea\"\n\nfunction InputGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(\n \"group/input-group border-input dark:bg-input/30 relative flex w-full items-center rounded-md border shadow-xs transition-[color,box-shadow] outline-none\",\n \"h-9 min-w-0 has-[>textarea]:h-auto\",\n\n // Variants based on alignment.\n \"has-[>[data-align=inline-start]]:[&>input]:pl-2\",\n \"has-[>[data-align=inline-end]]:[&>input]:pr-2\",\n \"has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3\",\n \"has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3\",\n\n // Focus state.\n \"has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot=input-group-control]:focus-visible]:ring-[3px]\",\n\n // Error state.\n \"has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[[data-slot][aria-invalid=true]]:border-destructive dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40\",\n\n className\n )}\n {...props}\n />\n )\n}\n\nconst inputGroupAddonVariants = cva(\n \"text-muted-foreground flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium select-none [&>svg:not([class*='size-'])]:size-4 [&>kbd]:rounded-[calc(var(--radius)-5px)] group-data-[disabled=true]/input-group:opacity-50\",\n {\n variants: {\n align: {\n \"inline-start\":\n \"order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]\",\n \"inline-end\":\n \"order-last pr-3 has-[>button]:mr-[-0.45rem] has-[>kbd]:mr-[-0.35rem]\",\n \"block-start\":\n \"order-first w-full justify-start px-3 pt-3 [.border-b]:pb-3 group-has-[>input]/input-group:pt-2.5\",\n \"block-end\":\n \"order-last w-full justify-start px-3 pb-3 [.border-t]:pt-3 group-has-[>input]/input-group:pb-2.5\",\n },\n },\n defaultVariants: {\n align: \"inline-start\",\n },\n }\n)\n\nfunction InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof inputGroupAddonVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(inputGroupAddonVariants({ align }), className)}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) {\n return\n }\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus()\n }}\n {...props}\n />\n )\n}\n\nconst inputGroupButtonVariants = cva(\n \"text-sm shadow-none flex gap-2 items-center\",\n {\n variants: {\n size: {\n xs: \"h-6 gap-1 px-2 rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-3.5 has-[>svg]:px-2\",\n sm: \"h-8 px-2.5 gap-1.5 rounded-md has-[>svg]:px-2.5\",\n \"icon-xs\":\n \"size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0\",\n \"icon-sm\": \"size-8 p-0 has-[>svg]:p-0\",\n },\n },\n defaultVariants: {\n size: \"xs\",\n },\n }\n)\n\nfunction InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: Omit<React.ComponentProps<typeof Button>, \"size\"> &\n VariantProps<typeof inputGroupButtonVariants>) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(inputGroupButtonVariants({ size }), className)}\n {...props}\n />\n )\n}\n\nfunction InputGroupText({ className, ...props }: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(\n \"text-muted-foreground flex items-center gap-2 text-sm [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupInput({\n className,\n ...props\n}: React.ComponentProps<\"input\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 dark:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(\n \"flex-1 resize-none rounded-none border-0 bg-transparent py-3 shadow-none focus-visible:ring-0 dark:bg-transparent\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n InputGroup,\n InputGroupAddon,\n InputGroupButton,\n InputGroupText,\n InputGroupInput,\n InputGroupTextarea,\n}\n","'use client';\n\nimport { useState, ChangeEvent } from 'react';\nimport { Loader2 } from 'lucide-react';\nimport { FileMetaData } from '@/types/file-manager';\nimport { DetailsLayout } from '@/components/file-details/details-layout';\nimport { FileDeleteButton, FileDownloadButton, FileCopyLinkButton } from '@/components/file-details/file-action-buttons';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Textarea } from '@/components/ui/textarea';\nimport { Label } from '@/components/ui/label';\nimport { getFileSize } from '@/lib/file-size';\nimport { formatDate, formatDuration } from '@/lib/format-utils';\nimport { Field, FieldLabel } from '../ui/field';\nimport { InputGroup, InputGroupAddon, InputGroupInput, InputGroupText } from '../ui/input-group';\n\n/**\n * Props for the VideoModal component.\n */\ninterface VideoModalProps {\n /** The video file data object to display and edit. */\n file: FileMetaData;\n /** Callback fired when the modal is closed without saving or after a successful save. */\n onClose: () => void;\n /**\n * Asynchronous callback fired when the user saves their changes.\n * Receives a partial metadata object containing the requested updates.\n */\n onSave?: (updates: Partial<FileMetaData>) => Promise<void> | void;\n /** Optional callback fired when the user chooses to delete the video file. */\n onDelete?: () => void;\n}\n\n/**\n * A modal component tailored for viewing and editing video assets.\n * Displays a video player along with video-specific metadata (duration, source).\n * Supports updating the file name and caption.\n */\nexport function VideoModal({ file, onClose, onSave, onDelete }: VideoModalProps) {\n const [isSaving, setIsSaving] = useState(false);\n const [fileName, setFileName] = useState(file.name);\n const [caption, setCaption] = useState(file.caption || '');\n\n const handleSave = async () => {\n setIsSaving(true);\n try {\n await onSave?.({\n name: fileName,\n caption,\n });\n onClose();\n } finally {\n setIsSaving(false);\n }\n };\n\n const previewSection = (\n <div className=\"flex flex-col h-full\">\n {/* Action Buttons */}\n <div className=\"flex gap-2 mb-4\">\n <FileDeleteButton file={file} />\n <FileDownloadButton file={file} />\n <FileCopyLinkButton file={file} />\n </div>\n\n {/* Video Preview */}\n <div className=\"flex-1 flex items-center justify-center bg-black rounded-lg overflow-hidden\">\n <video\n src={file.url}\n controls\n className=\"max-w-full max-h-full\"\n style={{ maxHeight: '500px' }}\n >\n Your browser does not support the video tag.\n </video>\n </div>\n </div>\n );\n\n const metadataSection = (\n <div className=\"space-y-6\">\n {/* Metadata Grid */}\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <p className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide mb-1\">\n Size\n </p>\n <p className=\"text-xs font-bold text-blue-600\">{getFileSize(file.size)}</p>\n </div>\n\n <div>\n <p className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide mb-1\">\n Dimensions\n </p>\n <p className=\"text-xs font-bold text-blue-600\">\n {file.width && file.height ? `${file.width}×${file.height}` : 'N/A'}\n </p>\n </div>\n\n <div>\n <p className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide mb-1\">\n Duration\n </p>\n <p className=\"text-xs font-bold text-blue-600\">\n {file.metaData?.duration ? formatDuration(file.metaData.duration) : 'N/A'}\n </p>\n </div>\n\n <div>\n <p className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide mb-1\">\n Date\n </p>\n <p className=\"text-xs font-bold text-blue-600\">\n {formatDate(file.createdAt)}\n </p>\n </div>\n\n <div>\n <p className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide mb-1\">\n Extension\n </p>\n <p className=\"text-xs font-bold text-blue-600\">{file.ext?.replace('.', '') || 'N/A'}</p>\n </div>\n\n <div>\n <p className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide mb-1\">\n Video Source\n </p>\n <p className=\"text-xs font-bold text-blue-600 capitalize\">\n {file.metaData?.videoSource || 'local'}\n </p>\n </div>\n\n\n </div>\n\n {/* Editable Fields */}\n <div className=\"space-y-4 pt-4 border-t\">\n <div className=\"space-y-2\">\n <Field className='gap-0'>\n <FieldLabel htmlFor=\"fileName\">File name</FieldLabel>\n <InputGroup>\n <InputGroupInput id=\"fileName\" placeholder=\"Enter file name\" value={fileName.replace(file.ext || '', '')} onChange={(e: ChangeEvent<HTMLInputElement>) => setFileName(e.target.value)} />\n <InputGroupAddon align=\"inline-end\" className='pr-1'>\n <InputGroupText className='font-bold bg-gray-200 rounded-lg py-1 px-3'>{file.ext}</InputGroupText>\n </InputGroupAddon>\n </InputGroup>\n </Field>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"caption\">Caption</Label>\n <Textarea\n id=\"caption\"\n value={caption}\n onChange={(e: ChangeEvent<HTMLTextAreaElement>) => setCaption(e.target.value)}\n placeholder=\"Add a caption\"\n rows={3}\n />\n </div>\n </div>\n </div>\n );\n\n const footer = (\n <div className=\"flex w-full sm:justify-between justify-center items-center flex-col sm:flex-row gap-2 \">\n <Button variant=\"outline\" onClick={onClose} radius=\"full\" className='w-full md:w-auto' disabled={isSaving}>\n Cancel\n </Button>\n <Button onClick={handleSave} radius=\"full\" className='w-full md:w-auto' disabled={isSaving}>\n {isSaving && <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />}\n Finish\n </Button>\n </div>\n );\n\n return (\n <DetailsLayout\n title=\"Details\"\n open={true}\n onClose={onClose}\n previewSection={previewSection}\n metadataSection={metadataSection}\n footer={footer}\n />\n );\n}\n","'use client';\n\nimport { useState, ChangeEvent } from 'react';\nimport { Loader2 } from 'lucide-react';\nimport { FileMetaData } from '@/types/file-manager';\nimport { DetailsLayout } from '@/components/file-details/details-layout';\nimport { FileDeleteButton, FileDownloadButton, FileCopyLinkButton } from '@/components/file-details/file-action-buttons';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Textarea } from '@/components/ui/textarea';\nimport { Label } from '@/components/ui/label';\nimport { getFileSize } from '@/lib/file-size';\nimport { formatDate, formatDuration } from '@/lib/format-utils';\nimport { Music } from 'lucide-react';\nimport { Field, FieldLabel } from '../ui/field';\nimport { InputGroup, InputGroupAddon, InputGroupInput, InputGroupText } from '../ui/input-group';\n\n/**\n * Props for the AudioModal component.\n */\ninterface AudioModalProps {\n /** The audio file data object to display and edit. */\n file: FileMetaData;\n /** Callback fired when the modal is closed without saving or after a successful save. */\n onClose: () => void;\n /**\n * Asynchronous callback fired when the user saves their changes.\n * Receives a partial metadata object containing the requested updates.\n */\n onSave?: (updates: Partial<FileMetaData>) => Promise<void> | void;\n /** Optional callback fired when the user chooses to delete the audio file. */\n onDelete?: () => void;\n}\n\n/**\n * A modal component tailored for viewing and editing audio assets.\n * Displays an audio player along with audio-specific metadata (duration, bitrate).\n * Supports updating the file name and caption.\n */\nexport function AudioModal({ file, onClose, onSave, onDelete }: AudioModalProps) {\n const [isSaving, setIsSaving] = useState(false);\n const [fileName, setFileName] = useState(file.name);\n const [caption, setCaption] = useState(file.caption || '');\n\n const handleSave = async () => {\n setIsSaving(true);\n try {\n await onSave?.({\n name: fileName,\n caption,\n });\n onClose();\n } finally {\n setIsSaving(false);\n }\n };\n\n const previewSection = (\n <div className=\"flex flex-col h-full\">\n {/* Action Buttons */}\n <div className=\"flex gap-2 mb-4\">\n <FileDeleteButton file={file} />\n <FileDownloadButton file={file} />\n <FileCopyLinkButton file={file} />\n </div>\n\n {/* Audio Preview */}\n <div className=\"flex-1 flex flex-col items-center justify-center bg-linear-to-br from-purple-50 to-blue-50 dark:from-purple-950 dark:to-blue-950 rounded-lg p-8\">\n <div className=\"mb-8\">\n <div className=\"w-32 h-32 rounded-full bg-white dark:bg-gray-800 shadow-lg flex items-center justify-center\">\n <Music className=\"w-16 h-16 text-purple-600 dark:text-purple-400\" />\n </div>\n </div>\n <div className=\"w-full max-w-md\">\n <audio\n src={file.url}\n controls\n className=\"w-full\"\n >\n Your browser does not support the audio tag.\n </audio>\n </div>\n </div>\n </div>\n );\n\n const metadataSection = (\n <div className=\"space-y-6\">\n {/* Metadata Grid */}\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <p className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide mb-1\">\n Size\n </p>\n <p className=\"text-xs font-bold text-blue-600\">{getFileSize(file.size)}</p>\n </div>\n\n <div>\n <p className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide mb-1\">\n Duration\n </p>\n <p className=\"text-xs font-bold text-blue-600\">\n {file.metaData?.duration ? formatDuration(file.metaData.duration) : 'N/A'}\n </p>\n </div>\n\n <div>\n <p className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide mb-1\">\n Bitrate\n </p>\n <p className=\"text-xs font-bold text-blue-600\">\n {file.metaData?.bitrate ? `${file.metaData.bitrate} kbps` : 'N/A'}\n </p>\n </div>\n\n <div>\n <p className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide mb-1\">\n Date\n </p>\n <p className=\"text-xs font-bold text-blue-600\">\n {formatDate(file.createdAt)}\n </p>\n </div>\n\n <div>\n <p className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide mb-1\">\n Extension\n </p>\n <p className=\"text-xs font-bold text-blue-600\">{file.ext?.replace('.', '') || 'N/A'}</p>\n </div>\n\n\n </div>\n\n {/* Editable Fields */}\n <div className=\"space-y-4 pt-4 border-t\">\n <div className=\"space-y-2\">\n <Field className='gap-0'>\n <FieldLabel htmlFor=\"fileName\">File name</FieldLabel>\n <InputGroup>\n <InputGroupInput id=\"fileName\" placeholder=\"Enter file name\" value={fileName.replace(file.ext || '', '')} onChange={(e: ChangeEvent<HTMLInputElement>) => setFileName(e.target.value)} />\n <InputGroupAddon align=\"inline-end\" className='pr-1'>\n <InputGroupText className='font-bold bg-gray-200 rounded-lg py-1 px-3'>{file.ext}</InputGroupText>\n </InputGroupAddon>\n </InputGroup>\n </Field>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"caption\">Caption</Label>\n <Textarea\n id=\"caption\"\n value={caption}\n onChange={(e: ChangeEvent<HTMLTextAreaElement>) => setCaption(e.target.value)}\n placeholder=\"Add a caption\"\n rows={3}\n />\n </div>\n </div>\n </div>\n );\n\n const footer = (\n <div className=\"flex gap-2 w-full sm:justify-between justify-center items-center flex-col sm:flex-row \">\n <Button variant=\"outline\" onClick={onClose} radius=\"full\" className='w-full md:w-auto' disabled={isSaving}>\n Cancel\n </Button>\n <Button onClick={handleSave} radius=\"full\" className='w-full md:w-auto' disabled={isSaving}>\n {isSaving && <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />}\n Finish\n </Button>\n </div>\n );\n\n return (\n <DetailsLayout\n title=\"Details\"\n open={true}\n onClose={onClose}\n previewSection={previewSection}\n metadataSection={metadataSection}\n footer={footer}\n />\n );\n}\n","'use client';\n\nimport { useState, ChangeEvent } from 'react';\nimport { Loader2 } from 'lucide-react';\nimport { FileMetaData } from '@/types/file-manager';\nimport { DetailsLayout } from '@/components/file-details/details-layout';\nimport { FileDeleteButton, FileDownloadButton, FileCopyLinkButton } from '@/components/file-details/file-action-buttons';\nimport { Button } from '@/components/ui/button';\nimport { Input } from '@/components/ui/input';\nimport { Textarea } from '@/components/ui/textarea';\nimport { Label } from '@/components/ui/label';\nimport { getFileSize } from '@/lib/file-size';\nimport { formatDate } from '@/lib/format-utils';\nimport { getFileComponents } from '@/components/grid/file-component-registry';\nimport { Field, FieldLabel } from '../ui/field';\nimport { InputGroup, InputGroupAddon, InputGroupInput, InputGroupText } from '../ui/input-group';\n\ninterface FileModalProps {\n file: FileMetaData;\n onClose: () => void;\n onSave?: (updates: Partial<FileMetaData>) => Promise<void> | void;\n}\n\nexport function FileModal({ file, onClose, onSave }: FileModalProps) {\n const [isSaving, setIsSaving] = useState(false);\n const [fileName, setFileName] = useState(file.name);\n const [description, setDescription] = useState(file.metaData?.description || '');\n\n const handleSave = async () => {\n setIsSaving(true);\n try {\n await onSave?.({\n name: fileName,\n metaData: {\n ...file.metaData,\n description,\n },\n });\n onClose();\n } finally {\n setIsSaving(false);\n }\n };\n\n const ext = file.ext?.replace('.', '') || 'file';\n \n // Resolve components from registry (same as grid view)\n const { component: FilePreviewComponent } = getFileComponents(file);\n\n const previewSection = (\n <div className=\"flex flex-col h-full\">\n {/* Action Buttons */}\n <div className=\"flex gap-2 mb-4\">\n <FileDeleteButton file={file} />\n <FileDownloadButton file={file} />\n <FileCopyLinkButton file={file} />\n </div>\n\n {/* File Icon Preview */}\n <div className=\"flex-1 flex flex-col items-center justify-center bg-linear-to-br from-gray-50 to-gray-100 dark:from-gray-900 dark:to-gray-800 rounded-lg p-8\">\n <div className=\"mb-4 w-32 h-32 flex items-center justify-center\">\n <FilePreviewComponent file={file} metaData={file.metaData} />\n </div>\n <p className=\"text-sm font-medium text-muted-foreground uppercase tracking-wider\">\n {ext} File\n </p>\n </div>\n </div>\n );\n\n const metadataSection = (\n <div className=\"space-y-6\">\n {/* Metadata Grid */}\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <p className=\"text-xs font-medium text-muted-foreground tracking-wide mb-1\">\n Size\n </p>\n <p className=\"text-xs font-bold text-blue-600\">{getFileSize(file.size)}</p>\n </div>\n\n <div>\n <p className=\"text-xs font-medium text-muted-foreground tracking-wide mb-1\">\n Date\n </p>\n <p className=\"text-xs font-bold text-blue-600\">\n {formatDate(file.createdAt)}\n </p>\n </div>\n\n <div>\n <p className=\"text-xs font-medium text-muted-foreground tracking-wide mb-1\">\n Extension\n </p>\n <p className=\"text-xs font-bold text-blue-600\">{ext}</p>\n </div>\n\n {file.metaData?.pageCount && (\n <div>\n <p className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide mb-1\">\n Page Count\n </p>\n <p className=\"text-xs font-bold text-blue-600\">{file.metaData.pageCount}</p>\n </div>\n )}\n\n {file.metaData?.author && (\n <div>\n <p className=\"text-xs font-medium text-muted-foreground uppercase tracking-wide mb-1\">\n Author\n </p>\n <p className=\"text-xs font-bold text-blue-600\">{file.metaData.author}</p>\n </div>\n )}\n\n\n </div>\n\n {/* Editable Fields */}\n <div className=\"space-y-4 pt-4 border-t\">\n <div className=\"space-y-2\">\n <Field className='gap-0'>\n <FieldLabel htmlFor=\"fileName\">File name</FieldLabel>\n <InputGroup>\n <InputGroupInput id=\"fileName\" placeholder=\"Enter file name\" value={fileName.replace(file.ext || '', '')} onChange={(e: ChangeEvent<HTMLInputElement>) => setFileName(e.target.value)} />\n <InputGroupAddon align=\"inline-end\" className='pr-1'>\n <InputGroupText className='font-bold bg-gray-200 rounded-lg py-1 px-3'>{file.ext}</InputGroupText>\n </InputGroupAddon>\n </InputGroup>\n </Field>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"description\">Description</Label>\n <Textarea\n id=\"description\"\n value={description}\n onChange={(e: ChangeEvent<HTMLTextAreaElement>) => setDescription(e.target.value)}\n placeholder=\"Add a description\"\n rows={3}\n />\n </div>\n </div>\n </div>\n );\n\n const footer = (\n <div className=\"flex w-full justify-between items-center flex-col sm:flex-row gap-2 \">\n <Button className='w-full md:w-auto' variant=\"outline\" onClick={onClose} radius=\"full\" disabled={isSaving}>\n Cancel\n </Button>\n <Button className='w-full md:w-auto' onClick={handleSave} radius=\"full\" disabled={isSaving}>\n {isSaving && <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />}\n Save\n </Button>\n </div>\n );\n\n return (\n <DetailsLayout\n title=\"Details\"\n open={true}\n onClose={onClose}\n previewSection={previewSection}\n metadataSection={metadataSection}\n footer={footer}\n />\n );\n}\n","\"use client\";\n\nimport { cn } from \"@/lib/utils\";\nimport { UploadModal } from \"../modals/upload-modal\";\nimport { CreateFolderModal } from \"../modals/create-folder\";\nimport { MoveModal } from \"../modals/move-modal\";\nimport { ImageModal } from \"../modals/image-modal\";\nimport { VideoModal } from \"../modals/video-modal\";\nimport { AudioModal } from \"../modals/audio-modal\";\nimport { FileModal } from \"../modals/file-modal\";\nimport { useFileManager } from \"@/context/file-manager-context\";\nimport { getFileTypeFromMime } from \"@/lib/file-utils\";\nimport { FILE_TYPE, FileMetaData } from \"@/types/file-manager\";\n\nexport function FileManagerOverlays({ className }: { className?: string }) {\n const {\n fileDetailsModalFile,\n setFileDetailsModalFile,\n updateFileMetadata,\n } = useFileManager();\n\n const handleClose = () => {\n setFileDetailsModalFile(null);\n };\n\n const handleSave = async (updates: Partial<FileMetaData>) => {\n if (fileDetailsModalFile) {\n await updateFileMetadata(fileDetailsModalFile.id, updates);\n }\n };\n\n // Determine which modal to show based on file type\n const renderFileDetailsModal = () => {\n if (!fileDetailsModalFile) return null;\n\n const fileType = getFileTypeFromMime(\n fileDetailsModalFile.mime,\n fileDetailsModalFile.ext\n );\n\n switch (fileType) {\n case FILE_TYPE.IMAGE:\n return (\n <ImageModal\n file={fileDetailsModalFile}\n onClose={handleClose}\n onSave={handleSave}\n />\n );\n case FILE_TYPE.VIDEO:\n return (\n <VideoModal\n file={fileDetailsModalFile}\n onClose={handleClose}\n onSave={handleSave}\n />\n );\n case FILE_TYPE.AUDIO:\n return (\n <AudioModal\n file={fileDetailsModalFile}\n onClose={handleClose}\n onSave={handleSave}\n />\n );\n case FILE_TYPE.FILE:\n default:\n return (\n <FileModal\n file={fileDetailsModalFile}\n onClose={handleClose}\n onSave={handleSave}\n />\n );\n }\n };\n\n return (\n <div className={cn('', className)}>\n <UploadModal />\n <CreateFolderModal />\n <MoveModal />\n {renderFileDetailsModal()}\n </div>\n );\n}\n","'use client'\nimport { FileManagerProvider } from \"@/context/file-manager-context\";\nimport { FileManagerFooter } from \"./layout/footer\";\nimport { FileManagerHeader } from \"./layout/header\";\nimport { FileManagerOverlays } from \"./layout/overlays\";\nimport { FileManagerPageProps, FileManagerModalProps, MODE, SELECTION_MODE } from \"@/types/file-manager\";\nimport { ReactNode } from \"react\";\n\n// Page Provider - wraps FileManagerProvider with page-specific defaults\nexport function FileManagerPageProvider({ \n children, \n ...props \n}: FileManagerPageProps & { children: ReactNode }) {\n return (\n <FileManagerProvider\n mode={MODE.PAGE}\n selectionMode={SELECTION_MODE.MULTIPLE}\n {...props}\n >\n {children}\n </FileManagerProvider>\n );\n}\n\n// Modal Provider - wraps FileManagerProvider with modal-specific defaults\nexport function FileManagerModalProvider({ \n children,\n fileSelectionMode = SELECTION_MODE.SINGLE,\n acceptedFileTypes,\n viewMode = \"grid\",\n onFilesSelected,\n onClose,\n ...props \n}: Omit<FileManagerModalProps, 'open'> & { children: ReactNode }) {\n return (\n <FileManagerProvider\n mode={MODE.MODAL}\n selectionMode={fileSelectionMode}\n acceptedFileTypesForModal={acceptedFileTypes || props.allowedFileTypes}\n viewMode={viewMode}\n onFilesSelected={onFilesSelected}\n onClose={onClose}\n {...props}\n >\n {children}\n </FileManagerProvider>\n );\n}\n\nexport const FileManagerComposition = {\n Page: FileManagerPageProvider,\n Modal: FileManagerModalProvider,\n Header: FileManagerHeader,\n Footer: FileManagerFooter,\n Overlays: FileManagerOverlays,\n}","import { useFileManager } from \"@/context/file-manager-context\";\nimport { Button } from \"../ui/button\";\nimport { CrossIcon, MoveIcon, TrashIcon } from \"../icons\";\n\n// Individual button components - composable and reusable\n\nexport function MoveButton() {\n const { setIsMoveFileModalOpen } = useFileManager();\n \n return (\n <Button\n variant=\"outline\"\n size=\"lg\"\n radius=\"full\"\n onClick={() => setIsMoveFileModalOpen(true)}\n className=\"text-md font-medium bg-white hover:bg-blue-50 hover:text-blue-600 hover:border-blue-200 border-gray-200 shadow-sm\"\n >\n <MoveIcon className=\"size-5\" />\n <span className=\"hidden sm:inline\">Move</span>\n </Button>\n );\n}\n\nexport function DeleteButton() {\n const { bulkDelete } = useFileManager();\n \n return (\n <Button\n variant=\"outline\"\n size=\"lg\"\n radius=\"full\"\n onClick={bulkDelete}\n className=\"text-md font-medium bg-white hover:bg-red-50 hover:text-red-600 hover:border-red-200 border-gray-200 shadow-sm\"\n >\n <TrashIcon className=\"size-5\" />\n <span className=\"hidden\">Delete</span>\n </Button>\n );\n}\n\nexport function ClearSelectionButton() {\n const { handleClearSelection } = useFileManager();\n \n return (\n <Button\n variant=\"outline\"\n size=\"lg\"\n onClick={handleClearSelection}\n className=\"rounded-full text-md font-medium text-blue-600 hover:text-blue-700 hover:bg-blue-50 hover:font-bold hover:border-blue-200 transition-all duration-200\"\n >\n <CrossIcon className=\"size-5 text-blue-600\" />\n Clear\n </Button>\n );\n}\n\n// Static variant - no floating behavior (for modals)\nexport function BulkActionsStatic() {\n const {\n selectedFiles,\n selectedFolders,\n } = useFileManager();\n\n const totalSelected = selectedFiles.length + selectedFolders.length;\n\n if (totalSelected === 0) return null;\n\n return (\n <div className=\"w-full\">\n <div className=\"flex flex-wrap items-center gap-2 sm:gap-3\">\n <div className=\"flex items-center gap-2 flex-1 sm:flex-initial\">\n <MoveButton />\n <DeleteButton />\n </div>\n <ClearSelectionButton />\n </div>\n </div>\n );\n}\n\n// Floating variant - fixed at bottom (for page mode)\nexport function BulkActionsFloating({ className }: { className?: string }) {\n const {\n selectedFiles,\n selectedFolders,\n } = useFileManager();\n\n const totalSelected = selectedFiles.length + selectedFolders.length;\n\n if (totalSelected === 0) return null;\n\n return (\n <div className={`fixed bottom-0 left-0 right-0 z-50 bg-white/80 backdrop-blur-sm border-t border-gray-200 shadow-lg ${className || ''}`}>\n <div className=\"px-4 sm:px-6 py-3 mx-auto\">\n <div className=\"flex flex-wrap items-center gap-2 sm:gap-3\">\n <div className=\"flex items-center gap-2 flex-1 sm:flex-initial\">\n <MoveButton />\n <DeleteButton />\n </div>\n <ClearSelectionButton />\n </div>\n </div>\n </div>\n );\n}\n\n","import * as React from 'react';\nimport { cn } from '@/lib/utils';\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"skeleton\" className={cn('animate-pulse rounded-md bg-accent', className)} {...props} />;\n}\n\nexport { Skeleton };\n","import { useFileManager } from \"@/context/file-manager-context\";\nimport { Button } from \"../ui/button\";\nimport { middleTruncate } from \"@/lib/truncate-name\";\nimport { ChevronLeftIcon, HomeIcon } from \"../icons\";\nimport { Skeleton } from \"../ui/skeleton\";\nimport { useRouter } from \"next/navigation\";\n\nexport function HeaderNavigation() {\n const {\n currentFolder,\n handleFolderClick,\n isLoading,\n } = useFileManager();\n\n const router = useRouter();\n\n const handleBackClick = () => {\n router.back();\n };\n\n if(isLoading) {\n //show skeleton\n return (\n <div className=\"flex item-center w-full\">\n <Skeleton className=\"rounded-full size-10 mr-2 shrink-0\" />\n <Skeleton className=\"min-w-32 rounded-md h-full\" />\n </div>\n )\n }\n\n return (\n <>\n {currentFolder ? (\n <div className=\"flex items-center flex-1 min-w-0 max-w-[calc(100%-40px)]\">\n {/* back button */}\n\n <Button\n variant=\"outline\"\n size=\"icon\"\n radius=\"full\"\n disabled={isLoading}\n className=\"border-gray-200 bg-white mr-2\"\n onClick={handleBackClick}>\n <ChevronLeftIcon className=\"size-5\" strokeWidth=\"1\" stroke=\"black\" />\n </Button>\n <h1 className=\"text-lg flex-1 min-w-0 align-middle font-semibold\">{middleTruncate(currentFolder.name, 20)}</h1>\n </div>\n ) : (\n <div className=\"flex items-center flex-1 min-w-0 max-w-[calc(100%-40px)]\">\n {/* home button */}\n <Button className=\"mr-2 shrink-0\" radius=\"full\" variant=\"ghost\" mode=\"icon\" size=\"icon\"\n onClick={() => handleFolderClick(null)}>\n <HomeIcon className=\"size-6\" />\n </Button>\n <h1 className=\"text-lg flex-1 min-w-0 align-middle font-semibold\">Home</h1>\n </div>\n )}\n </>\n );\n}\n","\"use client\";\n\nimport { MoreHorizontal } from \"lucide-react\";\nimport { Button } from \"../ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\";\nimport {\n CreateFolderAction,\n SearchAction,\n UploadFileAction,\n} from \"./header-actions\";\nimport { useFileManager } from \"@/context/file-manager-context\";\nimport { PlusIcon, SearchIcon, UploadFolderIcon } from \"../icons\";\n\n/**\n * Responsive wrapper for header actions that displays:\n * - Individual buttons on desktop (>= 768px)\n * - Dropdown menu on mobile/tablet (< 768px)\n */\nexport function ResponsiveHeaderActions() {\n const { setIsUploadModalOpen, setIsCreateFolderModalOpen, setIsSearchModalOpen } = useFileManager();\n\n return (\n <>\n {/* Desktop: Show individual buttons */}\n <div className=\"hidden md:flex gap-2\">\n <UploadFileAction />\n <CreateFolderAction />\n <SearchAction />\n </div>\n\n {/* Mobile/Tablet: Show dropdown menu */}\n <div className=\"flex md:hidden\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"icon\"\n radius=\"full\"\n className=\"border-gray-200 bg-white\"\n >\n <MoreHorizontal className=\"size-5\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-56 rounded-2xl shadow-xl bg-white/50 backdrop-blur-2xl border-gray-200\">\n <DropdownMenuItem\n onClick={() => setIsUploadModalOpen(true)}\n className=\"cursor-pointer\"\n >\n <PlusIcon className=\"size-5 text-gray-900\" stroke=\"black\" strokeWidth=\"1\" />\n <span className=\"inline\">Upload File</span>\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => setIsCreateFolderModalOpen(true)}\n className=\"cursor-pointer\"\n >\n <UploadFolderIcon className=\"size-5 text-gray-900\" />\n <span className=\"inline\">Create Folder</span>\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => setIsSearchModalOpen(true)}\n className=\"cursor-pointer\"\n >\n <SearchIcon className=\"size-5 text-gray-700\" />\n <span className=\"inline\">Search</span>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </>\n );\n}\n\n\n\nexport function ModalResponsiveHeaderActions({ onSearchClick }: { onSearchClick?: () => void }) {\n const { setIsUploadModalOpen, setIsCreateFolderModalOpen } = useFileManager();\n\n return (\n <>\n {/* Desktop: Show individual buttons */}\n <div className=\"hidden md:flex gap-2\">\n <UploadFileAction />\n <CreateFolderAction />\n {onSearchClick ? (\n <Button\n variant=\"outline\"\n size=\"icon\"\n radius=\"full\"\n className=\"border-gray-200 bg-white\"\n onClick={onSearchClick}\n >\n <SearchIcon className=\"size-5 text-gray-900\" />\n <span className=\"hidden\">Search</span>\n </Button>\n ) : null}\n </div>\n\n {/* Mobile/Tablet: Show dropdown menu */}\n <div className=\"flex md:hidden\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"icon\"\n radius=\"full\"\n className=\"border-gray-200 bg-white\"\n >\n <MoreHorizontal className=\"size-5\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-48\">\n <DropdownMenuItem\n onClick={() => setIsUploadModalOpen(true)}\n className=\"cursor-pointer\"\n >\n <PlusIcon className=\"size-5 text-gray-900\" stroke=\"black\" strokeWidth=\"1\" />\n <span className=\"inline\">Upload File</span>\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => setIsCreateFolderModalOpen(true)}\n className=\"cursor-pointer\"\n >\n <UploadFolderIcon className=\"size-5 text-gray-900\" />\n <span className=\"inline\">Create Folder</span>\n </DropdownMenuItem>\n {onSearchClick ? (\n <DropdownMenuItem\n onClick={onSearchClick}\n className=\"cursor-pointer\"\n >\n <SearchIcon className=\"size-5 text-gray-700\" />\n <span className=\"inline\">Search</span>\n </DropdownMenuItem>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </>\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '@/lib/utils';\nimport { Check, ChevronRight, Circle } from 'lucide-react';\nimport { DropdownMenu as DropdownMenuPrimitive } from 'radix-ui';\n\nfunction DropdownMenu({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />;\n}\n\nfunction DropdownMenuPortal({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />;\n}\n\nfunction DropdownMenuTrigger({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return <DropdownMenuPrimitive.Trigger className=\"select-none\" data-slot=\"dropdown-menu-trigger\" {...props} />;\n}\n\nfunction DropdownMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n}) {\n return (\n <DropdownMenuPrimitive.SubTrigger\n data-slot=\"dropdown-menu-sub-trigger\"\n className={cn(\n 'flex cursor-default gap-2 select-none items-center rounded-md px-2 py-1.5 text-sm outline-hidden',\n 'focus:bg-accent focus:text-foreground',\n 'data-[state=open]:bg-accent data-[state=open]:text-foreground',\n 'data-[here=true]:bg-accent data-[here=true]:text-foreground',\n '[&>svg]:pointer-events-none [&_svg:not([role=img]):not([class*=text-])]:opacity-60 [&>svg]:size-4 [&>svg]:shrink-0',\n inset && 'ps-8',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight data-slot=\"dropdown-menu-sub-trigger-indicator\" className=\"ms-auto size-3.5! rtl:rotate-180\" />\n </DropdownMenuPrimitive.SubTrigger>\n );\n}\n\nfunction DropdownMenuSubContent({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {\n return (\n <DropdownMenuPrimitive.SubContent\n data-slot=\"dropdown-menu-sub-content\"\n className={cn(\n 'space-y-0.5 z-50 min-w-[8rem] overflow-hidden shadow-md shadow-black/5 rounded-md border border-border bg-popover text-popover-foreground p-2 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuContent({\n className,\n sideOffset = 4,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n sideOffset={sideOffset}\n className={cn(\n 'space-y-0.5 z-50 min-w-[8rem] overflow-hidden rounded-md border border-border bg-popover p-2 text-popover-foreground shadow-md shadow-black/5 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n );\n}\n\nfunction DropdownMenuGroup({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return <DropdownMenuPrimitive.Group data-slot=\"dropdown-menu-group\" {...props} />;\n}\n\nfunction DropdownMenuItem({\n className,\n inset,\n variant,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n variant?: 'destructive';\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n className={cn(\n 'text-foreground relative flex cursor-default select-none items-center gap-2 rounded-md px-2 py-1.5 text-sm outline-hidden transition-colors data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([role=img]):not([class*=text-])]:opacity-60 [&_svg:not([class*=size-])]:size-4 [&_svg]:shrink-0',\n 'focus:bg-accent focus:text-foreground',\n 'data-[active=true]:bg-accent data-[active=true]:text-accent-foreground',\n inset && 'ps-8',\n variant === 'destructive' &&\n 'text-destructive hover:text-destructive focus:text-destructive hover:bg-destructive/5 focus:bg-destructive/5 data-[active=true]:bg-destructive/5',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {\n return (\n <DropdownMenuPrimitive.CheckboxItem\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-md py-1.5 ps-8 pe-2 text-sm outline-hidden transition-colors focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50',\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute start-2 flex h-3.5 w-3.5 items-center text-muted-foreground justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4 text-primary\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n );\n}\n\nfunction DropdownMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {\n return (\n <DropdownMenuPrimitive.RadioItem\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-md py-1.5 ps-6 pe-2 text-sm outline-hidden transition-colors focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50',\n className,\n )}\n {...props}\n >\n <span className=\"absolute start-1.5 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-1.5 w-1.5 fill-primary stroke-primary\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n );\n}\n\nfunction DropdownMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n}) {\n return (\n <DropdownMenuPrimitive.Label\n data-slot=\"dropdown-menu-label\"\n className={cn('px-2 py-1.5 text-xs text-muted-foreground font-medium', inset && 'ps-8', className)}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuRadioGroup({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {\n return <DropdownMenuPrimitive.RadioGroup data-slot=\"dropdown-menu-radio-group\" {...props} />;\n}\n\nfunction DropdownMenuSeparator({ className, ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn('-mx-2 my-1.5 h-px bg-muted', className)}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuShortcut({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) {\n return (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn('ms-auto text-xs tracking-widest opacity-60', className)}\n {...props}\n />\n );\n}\n\nfunction DropdownMenuSub({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {\n return <DropdownMenuPrimitive.Sub data-slot=\"dropdown-menu-sub\" {...props} />;\n}\n\nexport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuPortal,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n};\n","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport {\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"@/components/ui/command\";\nimport { Button } from \"@/components/ui/button\";\nimport { useFileManager } from \"@/context/file-manager-context\";\nimport { useDebouncedValue } from \"@/hooks/use-debounced-value\";\nimport { toast } from \"sonner\";\n\nimport { FileMetaData, Folder } from \"@/types/file-manager\";\nimport { middleTruncate } from \"@/lib/truncate-name\";\nimport { FolderIcon, SearchIcon } from \"../icons\";\nimport { KbdGroup, Kbd } from \"../ui/kbd\";\nimport { getFileComponents } from \"../grid/file-component-registry\";\n\nexport default function SearchDialog() {\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [fileResults, setFileResults] = useState<FileMetaData[]>([]);\n const [folderResults, setFolderResults] = useState<Folder[]>([]);\n const [loading, setLoading] = useState(false);\n const { provider, handleFolderClick, handleClearSelection, isSearchModalOpen, setIsSearchModalOpen, setFileDetailsModalFile } = useFileManager();\n\n // Debounce search query to reduce API calls\n const debouncedSearchQuery = useDebouncedValue(searchQuery, 300);\n\n const doSearch = useCallback(async (q: string) => {\n setLoading(true);\n try {\n const [files, folders] = await Promise.all([\n provider.findFiles(q),\n provider.findFolders(q),\n ]);\n setFileResults(files);\n setFolderResults(folders);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Search failed\";\n toast.error(\"Search Failed\", {\n description: message,\n });\n setFileResults([]);\n setFolderResults([]);\n } finally {\n setLoading(false);\n }\n }, [provider]);\n\n // Use debounced value to trigger search\n useEffect(() => {\n if (isSearchModalOpen && debouncedSearchQuery.length > 0) {\n doSearch(debouncedSearchQuery);\n } else {\n setFileResults([]);\n setFolderResults([]);\n }\n }, [debouncedSearchQuery, isSearchModalOpen, doSearch]);\n\n const handleInputChange = (value: string) => {\n setSearchQuery(value);\n };\n\n const handleModalOpenChange = (open: boolean) => {\n setIsSearchModalOpen(open);\n if (!open) {\n // Clear search when closing modal\n setSearchQuery('');\n setFileResults([]);\n setFolderResults([]);\n }\n };\n\n return (\n <>\n <Button\n variant=\"outline\"\n size=\"icon\"\n radius=\"full\"\n className=\"border-gray-200 bg-white\"\n onClick={() => setIsSearchModalOpen(true)}>\n <SearchIcon className=\"size-4 text-gray-700\" />\n <span className=\"hidden\">Search</span>\n </Button>\n \n <CommandDialog className=\"max-w-4xl w-full\" open={isSearchModalOpen} onOpenChange={handleModalOpenChange} shouldFilter={false} >\n <CommandInput\n placeholder=\"Type to search files or folders...\"\n value={searchQuery}\n onValueChange={handleInputChange}\n />\n <CommandList >\n {loading && <CommandEmpty>Searching...</CommandEmpty>}\n {!loading && fileResults.length === 0 && folderResults.length === 0 && !searchQuery && (\n <CommandEmpty>\n <div className=\"flex flex-col items-center justify-center py-8 px-4 text-center\">\n <SearchIcon className=\"size-12 text-gray-300 mb-3\" />\n <p className=\"text-sm font-medium text-gray-900 mb-1\">Search your files and folders</p>\n <p className=\"text-xs text-gray-500\">Start typing to find what you're looking for</p>\n <p className=\"text-xs text-gray-500 mt-2\">\n <KbdGroup>\n <Kbd><span className=\"text-lg\">⌘</span> + K</Kbd>\n </KbdGroup>\n </p>\n </div>\n </CommandEmpty>\n )}\n {!loading && fileResults.length === 0 && folderResults.length === 0 && searchQuery && (\n <CommandEmpty>\n <div className=\"flex flex-col items-center justify-center py-8 px-4 text-center\">\n <SearchIcon className=\"size-12 text-gray-300 mb-3\" />\n <p className=\"text-sm font-medium text-gray-900 mb-1\">No results found</p>\n <p className=\"text-xs text-gray-500\">Try searching with different keywords</p>\n </div>\n </CommandEmpty>\n )}\n {folderResults.length > 0 && (\n <CommandGroup heading=\"Folders\">\n {folderResults.map((folder) => (\n <CommandItem\n key={folder.id}\n onSelect={() => {\n handleClearSelection(); // Critical: prevent phantom selection\n setIsSearchModalOpen(false);\n handleFolderClick(folder);\n }}\n >\n <FolderIcon className=\"size-4 mr-2 shrink-0\" strokeWidth={1.5} />\n <span>{middleTruncate(folder.name, 60)}</span>\n </CommandItem>\n ))}\n </CommandGroup>\n )}\n {fileResults.length > 0 && (\n <CommandGroup heading=\"Files\">\n {fileResults.map((file) => {\n const { component: FilePreviewComponent } = getFileComponents(file);\n return (\n <CommandItem\n key={file.id}\n onSelect={() => {\n handleClearSelection();\n setFileDetailsModalFile(file);\n }}\n >\n <div className=\"size-6 mr-2 shrink-0 flex items-center justify-center\">\n <FilePreviewComponent file={file} metaData={file.metaData} />\n </div>\n <span>{middleTruncate(file.name, 60)}</span>\n </CommandItem>\n );\n })}\n </CommandGroup>\n )}\n </CommandList>\n </CommandDialog>\n \n </>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport { cn } from '@/lib/utils';\nimport { Dialog, DialogContent, DialogTitle } from '@/components/ui/dialog';\nimport { type DialogProps } from '@radix-ui/react-dialog';\nimport { Command as CommandPrimitive } from 'cmdk';\nimport { Check, LucideIcon, Search } from 'lucide-react';\n\nfunction Command({ className, ...props }: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n className={cn(\n 'flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground',\n className,\n )}\n {...props}\n />\n );\n}\n\ntype CommandDialogProps = DialogProps & { className?: string };\n\nconst CommandDialog = ({ children, className, shouldFilter, ...props }: CommandDialogProps & { shouldFilter?: boolean }) => {\n return (\n <Dialog {...props}>\n <DialogContent className={cn('overflow-hidden p-0 shadow-lg', className)}>\n <DialogTitle className=\"hidden\" />\n <Command \n shouldFilter={shouldFilter}\n className=\"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\"\n >\n {children}\n </Command>\n </DialogContent>\n </Dialog>\n );\n};\n\nfunction CommandInput({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div className=\"flex items-center border-border border-b px-3\" cmdk-input-wrapper=\"\" data-slot=\"command-input\">\n <Search className=\"me-2 h-4 w-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n className={cn(\n 'flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-hidden text-foreground placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n </div>\n );\n}\n\nfunction CommandList({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n data-slot=\"command-list\"\n className={cn('max-h-[300px] overflow-y-auto overflow-x-hidden', className)}\n {...props}\n />\n );\n}\n\nfunction CommandEmpty({ ...props }: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return <CommandPrimitive.Empty data-slot=\"command-empty\" className=\"py-6 text-center text-sm\" {...props} />;\n}\n\nfunction CommandGroup({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n data-slot=\"command-group\"\n className={cn(\n 'overflow-hidden p-1.5 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction CommandSeparator({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n data-slot=\"command-separator\"\n className={cn('-mx-1.5 h-px bg-border', className)}\n {...props}\n />\n );\n}\n\nfunction CommandItem({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n data-slot=\"command-item\"\n className={cn(\n 'relative flex text-foreground cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-hidden data-[disabled=true]:pointer-events-none data-[selected=true]:bg-accent data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',\n '[&_svg:not([role=img]):not([class*=text-])]:opacity-60',\n className,\n )}\n {...props}\n />\n );\n}\n\nconst CommandShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n data-slot=\"command-shortcut\"\n className={cn('ms-auto text-xs tracking-widest text-muted-foreground', className)}\n {...props}\n />\n );\n};\n\ninterface ButtonArrowProps extends React.SVGProps<SVGSVGElement> {\n icon?: LucideIcon; // Allows passing any Lucide icon\n}\n\nfunction CommandCheck({ icon: Icon = Check, className, ...props }: ButtonArrowProps) {\n return (\n <Icon\n data-slot=\"command-check\"\n data-check=\"true\"\n className={cn('size-4 ms-auto text-primary', className)}\n {...props}\n />\n );\n}\n\nexport {\n Command,\n CommandCheck,\n CommandDialog,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n CommandShortcut,\n};\n","import { useEffect, useState } from \"react\";\n\n/**\n * Custom hook that debounces a value by delaying its update\n * @param value - The value to debounce\n * @param delay - The delay in milliseconds (default: 500ms)\n * @returns The debounced value\n */\nexport function useDebouncedValue<T>(value: T, delay: number = 500): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n // Set up a timer to update the debounced value after the delay\n const handler = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n // Clean up the timer if value changes before delay expires\n return () => {\n clearTimeout(handler);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '@/lib/utils';\nimport { cva, VariantProps } from 'class-variance-authority';\nimport { Check, Minus } from 'lucide-react';\nimport { Checkbox as CheckboxPrimitive } from 'radix-ui';\n\n// Define the variants for the Checkbox using cva.\nconst checkboxVariants = cva(\n `\n group peer bg-background shrink-0 rounded-md border border-input ring-offset-background focus-visible:outline-none \n focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 \n aria-invalid:border-destructive/60 aria-invalid:ring-destructive/10 dark:aria-invalid:border-destructive dark:aria-invalid:ring-destructive/20\n [[data-invalid=true]_&]:border-destructive/60 [[data-invalid=true]_&]:ring-destructive/10 dark:[[data-invalid=true]_&]:border-destructive dark:[[data-invalid=true]_&]:ring-destructive/20,\n data-[state=checked]:bg-primary data-[state=checked]:border-primary data-[state=checked]:text-primary-foreground data-[state=indeterminate]:bg-primary data-[state=indeterminate]:border-primary data-[state=indeterminate]:text-primary-foreground\n `,\n {\n variants: {\n size: {\n sm: 'size-4.5 [&_svg]:size-3',\n md: 'size-5 [&_svg]:size-3.5',\n lg: 'size-5.5 [&_svg]:size-4',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\nfunction Checkbox({\n className,\n size,\n ...props\n}: React.ComponentProps<typeof CheckboxPrimitive.Root> & VariantProps<typeof checkboxVariants>) {\n return (\n <CheckboxPrimitive.Root data-slot=\"checkbox\" className={cn(checkboxVariants({ size }), className)} {...props}>\n <CheckboxPrimitive.Indicator className={cn('flex items-center justify-center text-current')}>\n <Check className=\"group-data-[state=indeterminate]:hidden\" />\n <Minus className=\"hidden group-data-[state=indeterminate]:block\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n}\n\nexport { Checkbox };\n","import { useFileManager } from \"@/context/file-manager-context\";\nimport { SELECTION_MODE } from \"@/types/file-manager\";\nimport SearchDialog from \"../modals/search-modal\";\nimport { Button } from \"../ui/button\";\nimport { Checkbox } from \"../ui/checkbox\";\nimport UploadFolderIcon from \"../icons/upload-folder\";\nimport MoveIcon from \"../icons/move\";\nimport { PlusIcon, SearchIcon } from \"../icons\";\n\nexport function MoveAction() {\n const {\n selectedFiles,\n selectedFolders,\n setIsMoveFileModalOpen,\n } = useFileManager();\n\n if (selectedFiles.length + selectedFolders.length === 0) {\n return null;\n }\n\n return (\n <Button\n variant=\"outline\"\n size=\"lg\"\n className=\"border-gray-200 bg-white\"\n onClick={() => setIsMoveFileModalOpen(true)}\n >\n <MoveIcon className=\"size-5\" />\n <span className=\"hidden sm:inline\">Move</span>\n </Button>\n );\n}\n\nexport function SearchAction() {\n return <SearchDialog />;\n}\n\nexport function SelectAllAction() {\n const {\n files,\n folders,\n currentFolder,\n handleSelectAllGlobal,\n getSelectionState,\n selectionMode,\n } = useFileManager();\n\n if (selectionMode !== SELECTION_MODE.MULTIPLE) {\n return null;\n }\n\n const currentFolders = folders.filter((f) => {\n if (currentFolder === null) return f.parentId === null;\n return f.parentId === currentFolder.id;\n });\n\n return (\n <div className=\"flex flex-row items-center gap-2\">\n <Checkbox\n checked={getSelectionState()}\n onCheckedChange={handleSelectAllGlobal}\n />\n <span className=\"text-sm text-gray-600\">\n Select All ({files.length + currentFolders.length} items)\n </span>\n </div>\n );\n}\n\nexport function UploadFileAction() {\n const { setIsUploadModalOpen } = useFileManager();\n \n return (\n <Button\n variant=\"outline\"\n size=\"md\"\n radius=\"full\"\n className=\"border-gray-200 bg-white text-md font-medium\"\n onClick={() => setIsUploadModalOpen(true)}\n >\n <PlusIcon className=\"size-5 text-gray-900\" stroke=\"black\" strokeWidth=\"1\" />\n <span className=\"hidden sm:inline\">Upload File</span>\n </Button>\n );\n}\n\nexport function CreateFolderAction() {\n const { setIsCreateFolderModalOpen } = useFileManager();\n\n return (\n <Button\n variant=\"outline\"\n size=\"icon\"\n radius=\"full\"\n className=\"border-gray-200 bg-white\"\n onClick={() => setIsCreateFolderModalOpen(true)}\n >\n <UploadFolderIcon className=\"size-5 text-gray-900\" />\n <span className=\"hidden\">Create Folder</span>\n </Button>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\n\nimport { Move } from \"lucide-react\";\nimport { FileMetaData, MODE, Mode, SELECTION_MODE, SelectionMode } from \"../../types/file-manager\";\n\nimport { Checkbox } from \"../ui/checkbox\";\nimport { CardContextMenu, CardMenuItem } from \"./card-context-menu\";\n\nimport { getFileSize } from \"../../lib/file-size\";\nimport { getFileComponents } from \"../grid/file-component-registry\";\nimport { TrashIcon } from \"../icons\";\nimport EditIcon from \"../icons/edit\";\nimport SelectIcon from \"../icons/select\";\n\n\ninterface FileCardProps {\n file: FileMetaData;\n isSelected: boolean;\n onSelect: (\n file: FileMetaData,\n event?: React.MouseEvent,\n isCheckboxClick?: boolean\n ) => void;\n onRightClick?: (file: FileMetaData, event: React.MouseEvent) => void;\n onDelete: (fileId: string | number) => void;\n onEdit: (file: FileMetaData) => void;\n onMove: (file: FileMetaData) => void;\n selectionMode: SelectionMode;\n showCheckbox?: boolean;\n mode?: Mode;\n isInSelectionMode?: boolean;\n}\n\nexport function FileCard({\n file,\n isSelected,\n onSelect,\n onDelete,\n onEdit,\n onMove,\n selectionMode,\n showCheckbox = false,\n mode = MODE.PAGE,\n isInSelectionMode = false,\n}: FileCardProps) {\n\n const handleDelete = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (confirm(`Are you sure you want to delete \"${file.name}\"?`)) {\n onDelete(file.id);\n }\n };\n\n const handleEdit = (e: React.MouseEvent) => {\n e.stopPropagation();\n onEdit(file);\n };\n\n const handleSelectFile = (e: React.MouseEvent) => {\n e.stopPropagation();\n onSelect(file, undefined, true);\n };\n\n const handleMove = (e: React.MouseEvent) => {\n e.stopPropagation();\n onMove(file);\n };\n\n const handleClick = (e: React.MouseEvent) => {\n onSelect(file, e, false); // false = not checkbox click\n };\n\n const handleCheckboxChange = (checked: boolean | string) => {\n onSelect(file, undefined, true); // true = checkbox click\n };\n\n const handleCheckboxClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n };\n\n // Resolve components from registry\n const { component: FilePreviewComponent, metadataComponent: FileMetadataComponent } = getFileComponents(\n file\n );\n\n const menuItems: CardMenuItem[] = [\n {\n label: \"Edit\",\n icon: <EditIcon className=\"size-6\" />,\n onClick: handleEdit,\n },\n {\n label: \"Select File\",\n icon: <SelectIcon className=\"size-6\" />,\n onClick: handleSelectFile,\n },\n {\n label: \"Move to...\",\n icon: <Move className=\"size-4 mr-2\" />,\n onClick: handleMove,\n },\n {\n label: \"Delete\",\n icon: <TrashIcon className=\"size-5 mr-2 text-red-600\" />,\n onClick: handleDelete,\n variant: \"destructive\",\n },\n ];\n\n return (\n <CardContextMenu\n menuItems={menuItems}\n isInSelectionMode={isInSelectionMode}\n mode={mode}\n >\n <div\n className=\"group relative flex flex-col items-center justify-start transition-all duration-200 cursor-pointer w-full select-none\"\n onDoubleClick={handleClick}\n onClick={handleClick}\n >\n {/* Icon Container: Gray background, rounded, subtle shadow */}\n {/* When selected, often Finder darkens the icon slightly or adds a border. keeping it simple clean. */}\n <div className={`\n relative w-full aspect-square flex items-center justify-center mb-1 overflow-hidden rounded-2xl hover:bg-gray-200/60\n ${isSelected ? \"bg-gray-200/60\" : \"\"}\n `}>\n <div className=\"w-[75%] h-[75%] flex items-center justify-center\">\n <FilePreviewComponent file={file} metaData={file.metaData} />\n </div>\n\n {(selectionMode === SELECTION_MODE.MULTIPLE || showCheckbox) && (\n <div className={`absolute top-2 left-2 z-10 ${isSelected ? \"opacity-100\" : \"opacity-0 group-hover:opacity-100\"} transition-opacity duration-200`} onClick={handleCheckboxClick}>\n <Checkbox\n checked={isSelected}\n onCheckedChange={handleCheckboxChange}\n className=\"bg-white/90 border-gray-300 shadow-sm data-[state=checked]:bg-blue-600 data-[state=checked]:border-blue-600 rounded-full h-5 w-5\"\n />\n </div>\n )}\n </div>\n\n {/* Text Label: Selection highlights background in blue */}\n <div className=\"w-full text-center px-0.5 flex flex-col items-center\">\n <span className={`\n text-[13px] font-medium leading-[1.3] tracking-tight line-clamp-2 px-2.5 py-[2px] rounded-[6px] transition-colors duration-100 wrap-break-word max-w-full\n ${isSelected\n ? \"bg-[#2563EB] text-white antialiased shadow-sm\"\n : \"text-[#374151] group-hover:text-black\"}\n `}>\n {file.name}\n </span>\n\n {/* Metadata: Only visible if not selected or style preference */}\n <div className={`flex flex-col items-center justify-center gap-0.5 mt-1 transition-opacity duration-200 ${isSelected ? \"opacity-60\" : \"opacity-100\"}`}>\n <span className=\"text-[11px] text-blue-600 font-medium tracking-tight\">{getFileSize(file.size)}</span>\n {FileMetadataComponent ? (\n <div className=\"text-[11px] text-gray-400 flex items-center scale-95\">\n <FileMetadataComponent file={file} />\n </div>\n ) : null}\n </div>\n </div>\n </div>\n </CardContextMenu>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { MoreVertical } from \"lucide-react\";\nimport {\n ContextMenu,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuSeparator,\n ContextMenuTrigger,\n} from \"../ui/context-menu\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../ui/dropdown-menu\";\nimport { Button } from \"../ui/button\";\nimport { Mode } from \"../../types/file-manager\";\n\nexport interface CardMenuItem {\n label: string;\n icon: React.ReactNode;\n onClick: (e: React.MouseEvent) => void;\n variant?: \"default\" | \"destructive\";\n className?: string;\n}\n\ninterface CardContextMenuProps {\n children: React.ReactNode;\n menuItems: CardMenuItem[];\n isInSelectionMode?: boolean;\n mode?: Mode;\n}\n\nexport function CardContextMenu({\n children,\n menuItems,\n isInSelectionMode = false,\n mode,\n}: CardContextMenuProps) {\n const shouldShowMenu = !isInSelectionMode && mode !== \"modal\";\n\n const renderMenuItems = (isDropdown: boolean = false) => {\n return menuItems.map((item, index) => {\n const isLast = index === menuItems.length - 1;\n const isDestructive = item.variant === \"destructive\";\n \n const MenuItemComponent = isDropdown ? DropdownMenuItem : ContextMenuItem;\n const SeparatorComponent = isDropdown ? DropdownMenuSeparator : ContextMenuSeparator;\n \n // Check if next item is destructive to add separator before it\n const nextItemIsDestructive = index < menuItems.length - 1 && menuItems[index + 1].variant === \"destructive\";\n \n return (\n <React.Fragment key={index}>\n <MenuItemComponent\n onClick={item.onClick}\n className={\n item.className ||\n `text-sm font-medium ${\n isDestructive\n ? \"text-red-600 focus:text-red-700 focus:bg-red-50\"\n : \"\"\n } ${index === 0 ? \"rounded-t-xl\" : \"\"} ${isLast ? \"rounded-b-xl\" : \"\"}`\n }\n >\n {item.icon}\n {item.label}\n </MenuItemComponent>\n {nextItemIsDestructive && !isLast && (\n <SeparatorComponent className=\"bg-gray-200\" />\n )}\n </React.Fragment>\n );\n });\n };\n\n return (\n <ContextMenu>\n <ContextMenuTrigger>\n <div className=\"relative w-full h-full\">\n {children}\n \n {/* Three-dot menu for mobile/tablet */}\n {shouldShowMenu && (\n <div\n className=\"absolute top-0 right-0 z-10 md:hidden\"\n onClick={(e) => e.stopPropagation()}\n >\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n radius=\"full\"\n className=\"focus-visible:ring-0 focus-visible:ring-offset-0\"\n >\n <MoreVertical className=\"size-4 text-gray-700\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-56 rounded-2xl shadow-xl bg-white/50 backdrop-blur-2xl border-gray-200\">\n {renderMenuItems(true)}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n )}\n </div>\n </ContextMenuTrigger>\n\n {/* Desktop right-click context menu */}\n {shouldShowMenu && (\n <ContextMenuContent className=\"w-56 rounded-2xl shadow-xl bg-white/50 backdrop-blur-2xl border-gray-200\">\n {renderMenuItems(false)}\n </ContextMenuContent>\n )}\n </ContextMenu>\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport * as ContextMenuPrimitive from '@radix-ui/react-context-menu';\nimport { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react';\nimport { cn } from '@/lib/utils';\n\nfunction ContextMenu({ ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Root>) {\n return <ContextMenuPrimitive.Root data-slot=\"context-menu\" {...props} />;\n}\n\nfunction ContextMenuTrigger({ ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Trigger>) {\n return <ContextMenuPrimitive.Trigger data-slot=\"context-menu-trigger\" {...props} />;\n}\n\nfunction ContextMenuGroup({ ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Group>) {\n return <ContextMenuPrimitive.Group data-slot=\"context-menu-group\" {...props} />;\n}\n\nfunction ContextMenuPortal({ ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Portal>) {\n return <ContextMenuPrimitive.Portal data-slot=\"context-menu-portal\" {...props} />;\n}\n\nfunction ContextMenuSub({ ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Sub>) {\n return <ContextMenuPrimitive.Sub data-slot=\"context-menu-sub\" {...props} />;\n}\n\nfunction ContextMenuRadioGroup({ ...props }: React.ComponentProps<typeof ContextMenuPrimitive.RadioGroup>) {\n return <ContextMenuPrimitive.RadioGroup data-slot=\"context-menu-radio-group\" {...props} />;\n}\n\nfunction ContextMenuSubTrigger({\n className,\n inset,\n children,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n}) {\n return (\n <ContextMenuPrimitive.SubTrigger\n data-slot=\"context-menu-sub-trigger\"\n data-inset={inset}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto\" />\n </ContextMenuPrimitive.SubTrigger>\n );\n}\n\nfunction ContextMenuSubContent({ className, ...props }: React.ComponentProps<typeof ContextMenuPrimitive.SubContent>) {\n return (\n <ContextMenuPrimitive.SubContent\n data-slot=\"context-menu-sub-content\"\n className={cn(\n 'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-context-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg',\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ContextMenuContent({ className, ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Content>) {\n return (\n <ContextMenuPrimitive.Portal>\n <ContextMenuPrimitive.Content\n data-slot=\"context-menu-content\"\n className={cn(\n 'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-context-menu-content-available-height) min-w-[8rem] origin-(--radix-context-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md',\n className,\n )}\n {...props}\n />\n </ContextMenuPrimitive.Portal>\n );\n}\n\nfunction ContextMenuItem({\n className,\n inset,\n variant = 'default',\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Item> & {\n inset?: boolean;\n variant?: 'default' | 'destructive';\n}) {\n return (\n <ContextMenuPrimitive.Item\n data-slot=\"context-menu-item\"\n data-inset={inset}\n data-variant={variant}\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ContextMenuCheckboxItem({\n className,\n children,\n checked,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.CheckboxItem>) {\n return (\n <ContextMenuPrimitive.CheckboxItem\n data-slot=\"context-menu-checkbox-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pe-2 ps-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"pointer-events-none absolute start-2 flex size-3.5 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"size-4 text-primary\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.CheckboxItem>\n );\n}\n\nfunction ContextMenuRadioItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.RadioItem>) {\n return (\n <ContextMenuPrimitive.RadioItem\n data-slot=\"context-menu-radio-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pe-2 ps-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute start-2 flex size-3.5 items-center justify-center\">\n <ContextMenuPrimitive.ItemIndicator>\n <CircleIcon className=\"size-1.5 fill-primary\" />\n </ContextMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </ContextMenuPrimitive.RadioItem>\n );\n}\n\nfunction ContextMenuLabel({\n className,\n inset,\n ...props\n}: React.ComponentProps<typeof ContextMenuPrimitive.Label> & {\n inset?: boolean;\n}) {\n return (\n <ContextMenuPrimitive.Label\n data-slot=\"context-menu-label\"\n data-inset={inset}\n className={cn('text-foreground px-2 py-1.5 text-sm font-medium data-[inset]:pl-8', className)}\n {...props}\n />\n );\n}\n\nfunction ContextMenuSeparator({ className, ...props }: React.ComponentProps<typeof ContextMenuPrimitive.Separator>) {\n return (\n <ContextMenuPrimitive.Separator\n data-slot=\"context-menu-separator\"\n className={cn('bg-border -mx-1 my-1 h-px', className)}\n {...props}\n />\n );\n}\n\nfunction ContextMenuShortcut({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n data-slot=\"context-menu-shortcut\"\n className={cn('text-muted-foreground ms-auto text-xs tracking-widest', className)}\n {...props}\n />\n );\n}\n\nexport {\n ContextMenu,\n ContextMenuTrigger,\n ContextMenuContent,\n ContextMenuItem,\n ContextMenuCheckboxItem,\n ContextMenuRadioItem,\n ContextMenuLabel,\n ContextMenuSeparator,\n ContextMenuShortcut,\n ContextMenuGroup,\n ContextMenuPortal,\n ContextMenuSub,\n ContextMenuSubContent,\n ContextMenuSubTrigger,\n ContextMenuRadioGroup,\n};\n","\nexport default function EditIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n x=\"0px\"\n y=\"0px\"\n width=\"100\"\n height=\"100\"\n viewBox=\"0 0 72 72\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M38.406 22.234l11.36 11.36L28.784 54.576l-12.876 4.307c-1.725.577-3.367-1.065-2.791-2.79l4.307-12.876L38.406 22.234zM41.234 19.406l5.234-5.234c1.562-1.562 4.095-1.562 5.657 0l5.703 5.703c1.562 1.562 1.562 4.095 0 5.657l-5.234 5.234L41.234 19.406z\">\n </path>\n </svg>\n );\n}","\n'use client'\n\nexport default function SelectIcon(\n props: Readonly<React.SVGProps<SVGSVGElement>>\n) {\n return (\n <svg \n xmlns=\"http://www.w3.org/2000/svg\" \n width=\"24\" \n height=\"24\" \n viewBox=\"0 0 24 24\"\n {...props}\n >\n <path fill=\"currentColor\" fillRule=\"evenodd\" d=\"M22 12c0 5.523-4.477 10-10 10S2 17.523 2 12S6.477 2 12 2s10 4.477 10 10m-5.97-3.03a.75.75 0 0 1 0 1.06l-5 5a.75.75 0 0 1-1.06 0l-2-2a.75.75 0 1 1 1.06-1.06l1.47 1.47l2.235-2.235L14.97 8.97a.75.75 0 0 1 1.06 0\" clipRule=\"evenodd\"/>\n </svg>\n\n );\n}\n","\"use client\";\n\nimport React from \"react\";\n\nimport { Move } from \"lucide-react\";\nimport { Folder, FolderId, Mode, SELECTION_MODE, SelectionMode } from \"../../types/file-manager\";\n\nimport { Checkbox } from \"../ui/checkbox\";\nimport { CardContextMenu, CardMenuItem } from \"./card-context-menu\";\n\nimport FolderIcon from \"../icons/folder\";\nimport { TrashIcon } from \"../icons\";\nimport EditIcon from \"../icons/edit\";\nimport SelectIcon from \"../icons/select\";\n\n\ninterface FolderCardProps {\n folder: Folder;\n isSelected: boolean;\n onSelect: (\n folder: Folder,\n event?: React.MouseEvent,\n isCheckboxClick?: boolean\n ) => void;\n onRightClick?: (folder: Folder, event: React.MouseEvent) => void;\n onDelete: (folderId: FolderId) => void;\n onRename: (folder: Folder) => void;\n onMove: (folder: Folder) => void;\n selectionMode: SelectionMode;\n showCheckbox?: boolean;\n mode?: Mode;\n isInSelectionMode?: boolean;\n}\n\nexport function FolderCard({\n folder,\n isSelected,\n onSelect,\n onRightClick,\n onDelete,\n onRename,\n onMove,\n selectionMode,\n showCheckbox,\n mode,\n isInSelectionMode\n}: FolderCardProps) {\n\n\n const handleDelete = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (confirm(`Are you sure you want to delete \"${folder.name}\"?\\n\\n⚠️ Warning: This will also delete all ${folder.fileCount} file(s) inside this folder.`)) {\n onDelete(folder.id);\n }\n };\n\n const handleRename = (e: React.MouseEvent) => {\n e.stopPropagation();\n onRename(folder);\n };\n\n const handleMove = (e: React.MouseEvent) => {\n e.stopPropagation();\n onMove(folder);\n };\n\n const handleSelectFolder = (e: React.MouseEvent) => {\n e.stopPropagation();\n onSelect(folder, undefined, true);\n };\n\n const handleClick = (e: React.MouseEvent) => {\n onSelect(folder, e, false); // false = not checkbox click\n };\n\n const handleCheckboxChange = (checked: boolean | string) => {\n onSelect(folder, undefined, true); // true = checkbox click\n };\n\n const handleCheckboxClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n };\n\n const menuItems: CardMenuItem[] = [\n {\n label: \"Rename\",\n icon: <EditIcon className=\"size-6\" />,\n onClick: handleRename,\n },\n {\n label: \"Select Folder\",\n icon: <SelectIcon className=\"size-6\" />,\n onClick: handleSelectFolder,\n },\n {\n label: \"Move to...\",\n icon: <Move className=\"size-5 mr-1\" />,\n onClick: handleMove,\n },\n {\n label: \"Delete\",\n icon: <TrashIcon className=\"size-5 mr-1 text-red-600\" />,\n onClick: handleDelete,\n variant: \"destructive\",\n },\n ];\n\n return (\n <CardContextMenu\n menuItems={menuItems}\n isInSelectionMode={isInSelectionMode}\n mode={mode}\n >\n <div\n className=\"group relative flex flex-col items-center justify-start transition-all duration-200 cursor-pointer w-full select-none\"\n onDoubleClick={handleClick}\n onClick={handleClick}\n >\n {/* Icon Container: Gray background, rounded, subtle shadow */}\n {/* When selected, usually just the label is highlighted in Finder. */}\n <div className={`\n relative w-full aspect-square flex items-center justify-center mb-1 overflow-hidden rounded-2xl hover:bg-gray-200/60\n \n ${isSelected ? \"bg-gray-200/60 \" : \"\"}\n `}>\n <div className=\"w-[75%] h-[75%] flex items-center justify-center transform \">\n <FolderIcon className=\"w-full h-full text-blue-400 fill-blue-400/20 drop-shadow-sm\" strokeWidth={1.5} />\n </div>\n\n {(selectionMode === SELECTION_MODE.MULTIPLE || showCheckbox) && (\n <div className={`absolute top-2 left-2 z-10 ${isSelected ? \"opacity-100\" : \"opacity-0 group-hover:opacity-100\"} transition-opacity duration-200`} onClick={handleCheckboxClick}>\n <Checkbox\n checked={isSelected}\n onCheckedChange={handleCheckboxChange}\n className=\"bg-white/90 border-gray-300 shadow-sm data-[state=checked]:bg-blue-600 data-[state=checked]:border-blue-600 rounded-full h-5 w-5\"\n />\n </div>\n )}\n </div>\n\n {/* Text Label: Selection highlights background in blue */}\n <div className=\"w-full text-center px-0.5 flex flex-col items-center\">\n <span className={`\n text-[13px] font-medium leading-[1.3] tracking-tight line-clamp-2 px-2.5 pb-[2px] rounded-[6px] transition-colors duration-100 break-words max-w-full\n ${isSelected\n ? \"bg-[#2563EB] text-white antialiased shadow-sm\"\n : \"text-[#374151] group-hover:text-black\"}\n `}>\n {folder.name}\n </span>\n\n <div className={`flex items-center justify-center gap-1 mt-1 transition-opacity duration-200 ${isSelected ? \"opacity-60\" : \"opacity-100\"}`}>\n <span className=\"text-[11px] text-blue-600 font-medium tracking-tight px-1.5 rounded-full\">{folder.fileCount} items</span>\n </div>\n </div>\n </div>\n </CardContextMenu>\n );\n}\n","import { useFileManager } from \"@/context/file-manager-context\";\nimport { FileCard } from \"../cards/file-card\";\nimport { FolderCard } from \"../cards/folder-card\";\n\nexport function UnifiedGrid() {\n\n const {\n files,\n folders,\n isLoading,\n handleFileClick,\n handleFolderClick,\n bulkDelete,\n mode,\n selectionMode,\n isInSelectionMode,\n selectedFiles,\n selectedFolders,\n currentFolder,\n setSelectedFiles,\n setSelectedFolders,\n setIsRenameFolderModalOpen,\n setIsMoveFileModalOpen,\n setFileDetailsModalFile,\n setFolderToRename\n } = useFileManager();\n\n // Calculate expected item count for skeleton loading\n // This provides a smoother UX by showing the correct number of skeleton items\n const getSkeletonCount = () => {\n if (!currentFolder) {\n // Root folder - show default skeleton count\n return 18;\n }\n \n // For subfolders, show skeleton for expected folders + files from metadata\n const expectedFolders = currentFolder.folderCount || 0;\n const expectedFiles = currentFolder.fileCount || 0;\n const totalItems = expectedFolders + expectedFiles;\n \n // Use the metadata count, or fallback to 18 if no items expected\n return totalItems > 0 ? totalItems : 18;\n };\n\n const skeletonCount = getSkeletonCount();\n\n if (isLoading) {\n return (\n <div className=\"p-4 grid grid-cols-2 gap-x-4 gap-y-8 sm:grid-cols-3 md:grid-cols-5 lg:grid-cols-6 xl:grid-cols-7 2xl:grid-cols-8 content-start\">\n {Array.from({ length: skeletonCount }).map((_, i) => (\n <div key={i} className=\"flex flex-col items-center justify-start w-full gap-2\">\n <div className=\"w-full aspect-square bg-gray-100 rounded-2xl animate-pulse\" />\n <div className=\"flex flex-col items-center gap-1 w-full\">\n <div className=\"h-4 w-20 bg-gray-100 rounded animate-pulse\" />\n <div className=\"h-3 w-12 bg-gray-100 rounded animate-pulse\" />\n </div>\n </div>\n ))}\n </div>\n )\n }\n\n return (\n <div className=\"p-4 grid grid-cols-2 gap-x-4 gap-y-8 sm:grid-cols-3 md:grid-cols-5 lg:grid-cols-6 xl:grid-cols-7 2xl:grid-cols-8 content-start\">\n {folders.map((folder) => (\n <FolderCard\n key={folder.id}\n folder={folder}\n isSelected={selectedFolders.some(f => f.id === folder.id)}\n onSelect={handleFolderClick}\n onDelete={() => bulkDelete()}\n onRename={(folder) => {\n setFolderToRename(folder);\n setIsRenameFolderModalOpen(true);\n }}\n onMove={(folder) => {\n setSelectedFolders([folder]);\n setSelectedFiles([]);\n setIsMoveFileModalOpen(true);\n }}\n selectionMode={selectionMode}\n mode={mode}\n isInSelectionMode={isInSelectionMode()}\n />\n ))}\n {files.map((file) => (\n <FileCard\n key={file.id}\n file={file}\n isSelected={selectedFiles.some(f => f.id === file.id)}\n onSelect={handleFileClick}\n onDelete={() => bulkDelete()}\n onEdit={(file) => {\n setFileDetailsModalFile(file);\n }}\n onMove={(file) => {\n setSelectedFiles([file]);\n setSelectedFolders([]);\n setIsMoveFileModalOpen(true);\n }}\n selectionMode={selectionMode}\n mode={mode}\n isInSelectionMode={isInSelectionMode()}\n />\n ))}\n </div>\n );\n}","'use client';\n\nimport React, { Component, ReactNode } from 'react';\nimport { Button } from './ui/button';\nimport { AlertCircle, RefreshCw } from 'lucide-react';\n\ninterface ErrorBoundaryProps {\n children: ReactNode;\n fallback?: ReactNode;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\n/**\n * Error Boundary component to catch and handle React component errors gracefully.\n * Provides a fallback UI when an error occurs instead of crashing the entire app.\n */\nexport class FileManagerErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = {\n hasError: false,\n error: null,\n };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n // Update state so the next render will show the fallback UI\n return {\n hasError: true,\n error,\n };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void {\n // Log error details for debugging\n console.error('FileManager Error Boundary caught an error:', error, errorInfo);\n }\n\n handleReset = (): void => {\n // A hard reload is the safest way to clear corrupted React state\n // for an application-level failure boundary.\n window.location.reload();\n };\n\n render(): ReactNode {\n if (this.state.hasError) {\n // Custom fallback UI or use provided fallback\n if (this.props.fallback) {\n return this.props.fallback;\n }\n\n return (\n <div className=\"flex items-center justify-center min-h-[400px] p-8 w-full h-full bg-slate-50/50 rounded-lg border border-dashed border-slate-200\">\n <div className=\"text-center max-w-md flex flex-col items-center\">\n <div className=\"bg-red-100 p-3 rounded-full mb-4\">\n <AlertCircle className=\"size-8 text-red-600\" />\n </div>\n <h2 className=\"text-xl font-semibold text-slate-900 mb-2\">\n Something went wrong\n </h2>\n <p className=\"text-sm text-slate-500 mb-6\">\n The file manager encountered an unexpected error. Refreshing the page usually resolves this issue.\n </p>\n {this.state.error && (\n <details className=\"mb-6 text-left w-full border border-slate-200 rounded-lg overflow-hidden flex-col group\">\n <summary className=\"cursor-pointer text-xs font-mono bg-slate-100 p-2 text-slate-600 hover:bg-slate-200 transition-colors\">\n View Technical Details\n </summary>\n <div className=\"p-3 bg-white\">\n <pre className=\"text-[10px] text-slate-600 font-mono whitespace-pre-wrap word-break-all max-h-40 overflow-auto\">\n {this.state.error.toString()}\n </pre>\n </div>\n </details>\n )}\n <Button onClick={this.handleReset} radius=\"full\" className=\"gap-2\">\n <RefreshCw className=\"size-4\" />\n Reload Application\n </Button>\n </div>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport { useFileManager } from \"@/context/file-manager-context\";\n\n/**\n * Keyboard shortcuts for page mode file manager\n * Must be rendered inside FileManagerProvider\n */\nexport function KeyboardShortcuts() {\n const { \n handleSelectAllGlobal, \n handleClearSelection, \n getSelectionState,\n isCreateFolderModalOpen,\n setIsCreateFolderModalOpen,\n isUploadModalOpen,\n setIsUploadModalOpen,\n isSearchModalOpen,\n setIsSearchModalOpen\n } = useFileManager();\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Cmd/Ctrl+K - Toggle Search Modal\n if (e.key === \"k\" && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n setIsSearchModalOpen(!isSearchModalOpen);\n }\n\n // Cmd/Ctrl+A - Toggle Select All/Unselect All\n if (e.key === \"a\" && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n \n // Toggle selection: if all are selected, unselect; otherwise select all\n const selectionState = getSelectionState();\n if (selectionState === true) {\n // All items are selected, so unselect them\n handleClearSelection();\n } else {\n // Nothing or some items selected, so select all\n handleSelectAllGlobal(true);\n }\n }\n\n // Cmd/Ctrl+F - Toggle Create Folder Modal\n if (e.key === \"f\" && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n setIsCreateFolderModalOpen(!isCreateFolderModalOpen);\n }\n\n // Cmd/Ctrl+U - Toggle Upload Files Modal\n if (e.key === \"u\" && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n setIsUploadModalOpen(!isUploadModalOpen);\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [handleSelectAllGlobal, handleClearSelection, getSelectionState, isCreateFolderModalOpen, setIsCreateFolderModalOpen, isUploadModalOpen, setIsUploadModalOpen, isSearchModalOpen, setIsSearchModalOpen]);\n\n return null;\n}\n","\"use client\";\n\nimport { FileManagerComposition } from \"@/components/file-manager-root\";\nimport { FileManagerPageProps } from \"@/types/file-manager\";\nimport { BulkActionsFloating } from \"./layout/bulk-actions-bar\";\nimport { HeaderNavigation } from \"./layout/header-navigation\";\nimport { ResponsiveHeaderActions } from \"./layout/header-actions-responsive\";\nimport { UnifiedGrid } from \"./grid/unified-grid\";\nimport { FileManagerErrorBoundary } from \"./error-boundary\";\nimport { KeyboardShortcuts } from \"./keyboard-shortcuts\";\n\nexport function FileManager(props: FileManagerPageProps) {\n return (\n <FileManagerErrorBoundary>\n <FileManagerComposition.Page {...props}>\n {/* Keyboard shortcuts - must be inside provider */}\n <KeyboardShortcuts />\n <div className=\"flex h-full relative pb-12 overflow-hidden\">\n {/* Main Content */}\n <div className=\"flex-1 flex w-full flex-col\">\n <FileManagerComposition.Header>\n <div className=\"flex w-full justify-between gap-2\">\n <HeaderNavigation />\n <ResponsiveHeaderActions />\n </div>\n </FileManagerComposition.Header>\n <BulkActionsFloating className=\"-mb-1\" />\n <UnifiedGrid />\n <FileManagerComposition.Footer className=\"pt-6 pb-10\" />\n </div>\n\n <FileManagerComposition.Overlays />\n </div>\n </FileManagerComposition.Page>\n </FileManagerErrorBoundary>\n );\n}\n","\"use client\";\n\nimport { FileManagerComposition } from \"@/components/file-manager-root\";\nimport { Button } from \"@/components/ui/button\";\nimport { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from \"@/components/ui/dialog\";\nimport { FileManagerModalProps } from \"@/types/file-manager\";\nimport { useFileManager } from \"@/context/file-manager-context\";\nimport { BulkActionsStatic } from \"./layout/bulk-actions-bar\";\nimport { HeaderNavigation } from \"./layout/header-navigation\";\nimport { UnifiedGrid } from \"./grid/unified-grid\";\nimport { ModalResponsiveHeaderActions } from \"./layout/header-actions-responsive\";\nimport { CrossIcon, SearchIcon } from \"./icons\";\nimport { useState, useRef, useEffect } from \"react\";\nimport { Input } from \"./ui/input\";\nimport { useDebouncedValue } from \"@/hooks/use-debounced-value\";\n\nexport function FileManagerModal({\n open,\n onClose,\n ...props\n}: FileManagerModalProps) {\n return (\n <FileManagerComposition.Modal {...props} onClose={onClose}>\n <Dialog open={open} onOpenChange={onClose}>\n <ModalContent onClose={onClose} />\n </Dialog>\n </FileManagerComposition.Modal>\n );\n}\n\nfunction ModalContent({ onClose }: { onClose: () => void }) {\n const { updateSearchQuery } = useFileManager();\n const [isSearchActive, setIsSearchActive] = useState(false);\n const [searchInput, setSearchInput] = useState(\"\");\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n // Debounce search input to reduce API calls\n const debouncedSearch = useDebouncedValue(searchInput, 300);\n\n // Update actual search query when debounced value changes\n useEffect(() => {\n updateSearchQuery(debouncedSearch);\n }, [debouncedSearch, updateSearchQuery]);\n\n // Focus search input when search becomes active\n useEffect(() => {\n if (isSearchActive && searchInputRef.current) {\n searchInputRef.current.focus();\n }\n }, [isSearchActive]);\n\n return (\n <DialogContent className=\"p-0\" variant=\"fullscreen\" showCloseButton={false}>\n <DialogHeader className=\"pt-5 pb-3 m-0 border-b border-border\">\n <DialogTitle className=\"px-6 text-base\">\n <div className=\"flex w-full justify-between gap-2\">\n {isSearchActive ? (\n /* Inline Search Mode */\n <div className=\"flex items-center gap-4 flex-1\">\n <SearchIcon className=\"size-5 text-gray-500 shrink-0\" />\n <Input\n ref={searchInputRef}\n type=\"text\"\n placeholder=\"Search files and folders...\"\n className=\"border-none shadow-none focus-visible:ring-0 h-auto p-0 text-base font-semibold\"\n value={searchInput}\n onChange={(e) => setSearchInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n setSearchInput('');\n updateSearchQuery('');\n setIsSearchActive(false);\n }\n }}\n />\n <Button\n variant=\"outline\"\n size=\"icon\"\n radius=\"full\"\n onClick={() => {\n setSearchInput('');\n updateSearchQuery('');\n setIsSearchActive(false);\n }}\n className=\"border-gray-200 bg-white shrink-0\"\n >\n <CrossIcon className=\"size-5\" />\n <span className=\"sr-only\">Cancel Search</span>\n </Button>\n </div>\n ) : (\n /* Normal Header Mode */\n <>\n <HeaderNavigation />\n <ModalResponsiveHeaderActions onSearchClick={() => setIsSearchActive(true)} />\n <Button\n variant=\"outline\"\n size=\"icon\"\n radius=\"full\"\n onClick={onClose}\n className=\"border-gray-200 bg-white\"\n >\n <CrossIcon className=\"size-5\" />\n <span className=\"hidden\">Close</span>\n </Button>\n </>\n )}\n </div>\n </DialogTitle>\n <DialogDescription className=\"sr-only\">\n Browse and select files from your media library\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"overflow-y-auto flex-1 pb-4\">\n <UnifiedGrid />\n <FileManagerComposition.Footer className=\"my-4\" />\n <FileManagerComposition.Overlays />\n </div>\n\n <FileManagerModalFooter onClose={onClose} />\n </DialogContent>\n );\n}\n\nfunction FileManagerModalFooter({ onClose }: { onClose: () => void }) {\n const { \n selectedFiles, \n onFilesSelected, \n setSelectedFiles, \n setSelectedFolders,\n updateSearchQuery,\n handlePageChange \n } = useFileManager();\n\n const handleSelect = () => {\n if (onFilesSelected && selectedFiles.length > 0) {\n onFilesSelected(selectedFiles);\n \n // Clear everything after selection\n setSelectedFiles([]);\n setSelectedFolders([]);\n updateSearchQuery('');\n handlePageChange(1);\n \n onClose();\n }\n };\n\n return (\n <DialogFooter className=\"px-6 py-4 border-t border-border w-full sm:justify-between justify-center items-center flex-col sm:flex-row gap-2\">\n <BulkActionsStatic />\n <DialogClose asChild>\n <Button type=\"button\" variant=\"outline\" onClick={onClose} radius=\"full\" className='w-full md:w-auto mr-0'>\n Cancel\n </Button>\n </DialogClose>\n <Button\n type=\"button\"\n onClick={handleSelect}\n disabled={selectedFiles.length === 0}\n radius=\"full\" className='w-full md:w-auto'\n >\n Select {selectedFiles.length > 0 ? `(${selectedFiles.length})` : ''}\n </Button>\n </DialogFooter>\n );\n}\n","import { Folder, Tag, FileMetaData, FILE_TYPE } from \"@/types/file-manager\";\n\n// Mock data\nexport const mockFolders: Folder[] = [\n {\n id: 1,\n name: \"Documents\",\n pathId: 1,\n path: \"/1\",\n parentId: null,\n fileCount: 20, // Updated: now has 20 files\n folderCount: 0,\n createdAt: new Date(\"2024-01-01\"),\n updatedAt: new Date(\"2024-01-01\"),\n },\n {\n id: 2,\n name: \"Images\",\n pathId: 2,\n path: \"/2\",\n parentId: null,\n fileCount: 10, // Updated: now has 10 image files\n folderCount: 3,\n createdAt: new Date(\"2024-01-01\"),\n updatedAt: new Date(\"2024-01-01\"),\n },\n {\n id: 3,\n name: \"Videos\",\n pathId: 3,\n path: \"/3\",\n parentId: null,\n fileCount: 5, // Updated: now has 5 video files\n folderCount: 0,\n createdAt: new Date(\"2024-01-01\"),\n updatedAt: new Date(\"2024-01-01\"),\n },\n {\n id: 4,\n name: \"Music Some Long Name Streched also so long to fit in the card Music Some Long Name Streched also so long to fit in the card\",\n pathId: 4,\n path: \"/4\",\n parentId: null,\n fileCount: 5, // Updated: now has 5 audio files\n folderCount: 0,\n createdAt: new Date(\"2024-01-01\"),\n updatedAt: new Date(\"2024-01-01\"),\n },\n {\n id: 5,\n name: \"Archives\",\n pathId: 5,\n path: \"/5\",\n parentId: null,\n fileCount: 5, // Updated: now has 5 archive files\n folderCount: 0,\n createdAt: new Date(\"2024-01-01\"),\n updatedAt: new Date(\"2024-01-01\"),\n },\n {\n id: 6,\n name: \"Album 01\",\n pathId: 6,\n path: \"/2/6\",\n parentId: 2,\n fileCount: 0,\n folderCount: 0,\n createdAt: new Date(\"2024-01-01\"),\n updatedAt: new Date(\"2024-01-01\"),\n },\n {\n id: 7,\n name: \"Album 02\",\n pathId: 7,\n path: \"/2/7\",\n parentId: 2,\n fileCount: 0,\n folderCount: 0,\n createdAt: new Date(\"2024-01-01\"),\n updatedAt: new Date(\"2024-01-01\"),\n },\n {\n id: 8,\n name: \"Squirrels\",\n pathId: 8,\n path: \"/2/8\",\n parentId: 2,\n fileCount: 1,\n folderCount: 0,\n createdAt: new Date(\"2024-01-01\"),\n updatedAt: new Date(\"2024-01-01\"),\n },\n];\n\nexport const mockTags: Tag[] = [\n { id: 1, name: \"Important\", color: \"#ef4444\" },\n { id: 2, name: \"Work\", color: \"#3b82f6\" },\n { id: 3, name: \"Personal\", color: \"#10b981\" },\n { id: 4, name: \"Project\", color: \"#8b5cf6\" },\n { id: 5, name: \"Archive\", color: \"#6b7280\" },\n];\n\nexport const mockFiles: FileMetaData[] = [\n // Root level files (folderId: null)\n {\n id: 101,\n name: \"welcome.pdf\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 245000,\n createdAt: new Date(\"2024-05-15T10:00:00Z\"),\n updatedAt: new Date(\"2024-05-15T10:00:00Z\"),\n folderId: null,\n tags: [\"important\"],\n mime: \"application/pdf\",\n ext: \".pdf\",\n metaData: { pageCount: 2, author: \"Admin\" },\n },\n {\n id: 102,\n name: \"desktop_wallpaper.jpg\",\n url: \"https://images.unsplash.com/photo-1557683316-973673baf926\",\n size: 4200000,\n createdAt: new Date(\"2024-05-14T15:30:00Z\"),\n updatedAt: new Date(\"2024-05-14T15:30:00Z\"),\n folderId: null,\n tags: [\"personal\"],\n mime: \"image/jpeg\",\n ext: \".jpg\",\n width: 5000,\n height: 3333,\n formats: {\n thumbnail: {\n ext: \".jpg\",\n url: \"https://images.unsplash.com/photo-1557683316-973673baf926?w=156\",\n hash: \"thumbnail_desktop_wallpaper_abc123\",\n mime: \"image/jpeg\",\n name: \"thumbnail_desktop_wallpaper.jpg\",\n path: null,\n size: 5.57,\n width: 156,\n height: 104\n },\n small: {\n ext: \".jpg\",\n url: \"https://images.unsplash.com/photo-1557683316-973673baf926?w=500\",\n hash: \"small_desktop_wallpaper_abc123\",\n mime: \"image/jpeg\",\n name: \"small_desktop_wallpaper.jpg\",\n path: null,\n size: 47.27,\n width: 500,\n height: 333\n },\n medium: {\n ext: \".jpg\",\n url: \"https://images.unsplash.com/photo-1557683316-973673baf926?w=750\",\n hash: \"medium_desktop_wallpaper_abc123\",\n mime: \"image/jpeg\",\n name: \"medium_desktop_wallpaper.jpg\",\n path: null,\n size: 97.89,\n width: 750,\n height: 500\n },\n large: {\n ext: \".jpg\",\n url: \"https://images.unsplash.com/photo-1557683316-973673baf926?w=1000\",\n hash: \"large_desktop_wallpaper_abc123\",\n mime: \"image/jpeg\",\n name: \"large_desktop_wallpaper.jpg\",\n path: null,\n size: 159.48,\n width: 1000,\n height: 667\n }\n },\n metaData: {},\n },\n {\n id: 103,\n name: \"quick_notes.txt\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 3500,\n createdAt: new Date(\"2024-05-13T09:45:00Z\"),\n updatedAt: new Date(\"2024-05-13T09:45:00Z\"),\n folderId: null,\n tags: [],\n mime: \"text/plain\",\n ext: \".txt\",\n metaData: {},\n },\n {\n id: 104,\n name: \"intro_video.mp4\",\n url: \"https://docs.material-tailwind.com/demo.mp4\",\n size: 12000000,\n createdAt: new Date(\"2024-05-12T14:00:00Z\"),\n updatedAt: new Date(\"2024-05-12T14:00:00Z\"),\n folderId: null,\n tags: [],\n mime: \"video/mp4\",\n ext: \".mp4\",\n width: 1920,\n height: 1080,\n metaData: { duration: 90, videoSource: \"local\" },\n },\n {\n id: 105,\n name: \"profile_photo.png\",\n url: \"https://images.unsplash.com/photo-1535713875002-d1d0cf377fde\",\n size: 850000,\n createdAt: new Date(\"2024-05-11T11:20:00Z\"),\n updatedAt: new Date(\"2024-05-11T11:20:00Z\"),\n folderId: null,\n tags: [\"personal\"],\n mime: \"image/png\",\n ext: \".png\",\n width: 2000,\n height: 2000,\n formats: {\n thumbnail: {\n ext: \".png\",\n url: \"https://images.unsplash.com/photo-1535713875002-d1d0cf377fde?w=156\",\n hash: \"thumbnail_profile_photo_def456\",\n mime: \"image/png\",\n name: \"thumbnail_profile_photo.png\",\n path: null,\n size: 8.2,\n width: 156,\n height: 156\n },\n small: {\n ext: \".png\",\n url: \"https://images.unsplash.com/photo-1535713875002-d1d0cf377fde?w=500\",\n hash: \"small_profile_photo_def456\",\n mime: \"image/png\",\n name: \"small_profile_photo.png\",\n path: null,\n size: 52.3,\n width: 500,\n height: 500\n },\n medium: {\n ext: \".png\",\n url: \"https://images.unsplash.com/photo-1535713875002-d1d0cf377fde?w=750\",\n hash: \"medium_profile_photo_def456\",\n mime: \"image/png\",\n name: \"medium_profile_photo.png\",\n path: null,\n size: 110.5,\n width: 750,\n height: 750\n },\n large: {\n ext: \".png\",\n url: \"https://images.unsplash.com/photo-1535713875002-d1d0cf377fde?w=1000\",\n hash: \"large_profile_photo_def456\",\n mime: \"image/png\",\n name: \"large_profile_photo.png\",\n path: null,\n size: 185.7,\n width: 1000,\n height: 1000\n }\n },\n metaData: {},\n },\n {\n id: 106,\n name: \"todo_list.md\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 6200,\n createdAt: new Date(\"2024-05-10T08:30:00Z\"),\n updatedAt: new Date(\"2024-05-10T08:30:00Z\"),\n folderId: null,\n tags: [\"important\"],\n mime: \"text/markdown\",\n ext: \".md\",\n metaData: {},\n },\n {\n id: 107,\n name: \"app_settings.json\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 4800,\n createdAt: new Date(\"2024-05-09T16:15:00Z\"),\n updatedAt: new Date(\"2024-05-09T16:15:00Z\"),\n folderId: null,\n tags: [],\n mime: \"application/json\",\n ext: \".json\",\n metaData: {},\n },\n {\n id: 108,\n name: \"mountain_landscape.webp\",\n url: \"https://images.unsplash.com/photo-1506905925346-21bda4d32df4\",\n size: 1200000,\n createdAt: new Date(\"2024-05-08T13:00:00Z\"),\n updatedAt: new Date(\"2024-05-08T13:00:00Z\"),\n folderId: null,\n tags: [\"personal\"],\n mime: \"image/webp\",\n ext: \".webp\",\n width: 4000,\n height: 2667,\n metaData: {},\n },\n \n // Files in folders\n {\n id: 1,\n name: \"Key-Monastery-img.avif\",\n url: \"https://unciatrails.com/wp-content/uploads/2024/07/Key-Monastery-img.avif\",\n size: 2621440, // 2.5 MB\n createdAt: new Date(\"2023-10-26T10:30:00Z\"),\n updatedAt: new Date(\"2023-10-26T10:30:00Z\"),\n folderId: 8,\n tags: [\"personal\", \"important\"],\n mime: \"image/avif\",\n ext: \".avif\",\n caption: \"A cute squirrel in the park\",\n alternativeText: \"Gray squirrel sitting on wooden fence\",\n width: 3024,\n height: 4032,\n metaData: {},\n },\n {\n id: 2,\n name: \"project_proposal thoda sa.pdf\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 1048576, // 1 MB\n createdAt: new Date(\"2024-05-10T14:20:00Z\"),\n updatedAt: new Date(\"2024-05-10T14:20:00Z\"),\n folderId: 1,\n tags: [\"work\", \"important\"],\n mime: \"application/pdf\",\n ext: \".pdf\",\n metaData: {\n pageCount: 15,\n author: \"John Doe\",\n },\n },\n {\n id: 3,\n name: \"quarterly_report.xlsx\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 524288, // 512 KB\n createdAt: new Date(\"2024-05-08T09:15:00Z\"),\n updatedAt: new Date(\"2024-05-08T09:15:00Z\"),\n folderId: 1,\n tags: [\"work\"],\n mime: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n ext: \".xlsx\",\n metaData: {\n pageCount: 10,\n },\n },\n {\n id: 4,\n name: \"presentation.pptx\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 2097152, // 2 MB\n createdAt: new Date(\"2024-05-05T16:45:00Z\"),\n updatedAt: new Date(\"2024-05-05T16:45:00Z\"),\n folderId: 1,\n tags: [\"work\", \"project\"],\n mime: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n ext: \".pptx\",\n metaData: {\n pageCount: 20,\n },\n },\n {\n id: 8,\n name: \"documnet.doc\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 2097152, // 2 MB\n createdAt: new Date(\"2024-05-05T16:45:00Z\"),\n updatedAt: new Date(\"2024-05-05T16:45:00Z\"),\n folderId: 1,\n tags: [\"work\", \"project\"],\n mime: \"application/msword\",\n ext: \".doc\",\n metaData: {\n pageCount: 20,\n },\n },\n {\n id: 5,\n name: \"demo_video.mp4\",\n url: \"https://docs.material-tailwind.com/demo.mp4\",\n size: 10485760, // 10 MB\n createdAt: new Date(\"2024-05-03T11:30:00Z\"),\n updatedAt: new Date(\"2024-05-03T11:30:00Z\"),\n folderId: 3,\n tags: [\"project\"],\n mime: \"video/mp4\",\n ext: \".mp4\",\n width: 1920,\n height: 1080,\n metaData: {\n duration: 120, // 2 minutes\n videoSource: \"remote\",\n },\n },\n {\n id: 6,\n name: \"podcast_episode.mp3\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 5242880, // 5 MB\n createdAt: new Date(\"2024-05-02T10:00:00Z\"),\n updatedAt: new Date(\"2024-05-02T10:00:00Z\"),\n folderId: 4,\n tags: [\"personal\"],\n mime: \"audio/mpeg\",\n ext: \".mp3\",\n metaData: {\n duration: 3600, // 1 hour\n },\n },\n {\n id: 7,\n name: \"notes.txt\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 1024, // 1 KB\n createdAt: new Date(\"2024-05-01T09:00:00Z\"),\n updatedAt: new Date(\"2024-05-01T09:00:00Z\"),\n folderId: 1,\n tags: [\"work\"],\n mime: \"text/plain\",\n ext: \".txt\",\n metaData: {\n },\n },\n {\n id: 9,\n name: \"data.json\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 2048, // 2 KB\n createdAt: new Date(\"2024-04-30T15:00:00Z\"),\n updatedAt: new Date(\"2024-04-30T15:00:00Z\"),\n folderId: 1,\n tags: [\"project\"],\n mime: \"application/json\",\n ext: \".json\",\n metaData: {\n },\n },\n {\n id: 10,\n name: \"archive.zip\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 104857600, // 100 MB\n createdAt: new Date(\"2024-04-29T12:00:00Z\"),\n updatedAt: new Date(\"2024-04-29T12:00:00Z\"),\n folderId: 5,\n tags: [\"archive\"],\n mime: \"application/zip\",\n ext: \".zip\",\n metaData: {\n description: \"Project backup\",\n },\n },\n {\n id: 11,\n name: \"setup.exe\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 52428800, // 50 MB\n createdAt: new Date(\"2024-04-28T11:00:00Z\"),\n updatedAt: new Date(\"2024-04-28T11:00:00Z\"),\n folderId: 5,\n tags: [\"software\"],\n mime: \"application/x-msdownload\",\n ext: \".exe\",\n metaData: {\n description: \"Installer\",\n },\n },\n {\n id: 12,\n name: \"old_stuff.rar\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 20971520, // 20 MB\n createdAt: new Date(\"2024-04-27T10:00:00Z\"),\n updatedAt: new Date(\"2024-04-27T10:00:00Z\"),\n folderId: 5,\n tags: [\"archive\"],\n mime: \"application/x-rar-compressed\",\n ext: \".rar\",\n metaData: {\n description: \"Old files\",\n },\n },\n // Additional files for pagination testing\n {\n id: 13,\n name: \"meeting_notes_q1.pdf\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 856000,\n createdAt: new Date(\"2024-03-15T09:00:00Z\"),\n updatedAt: new Date(\"2024-03-15T09:00:00Z\"),\n folderId: 1,\n tags: [\"work\"],\n mime: \"application/pdf\",\n ext: \".pdf\",\n metaData: { pageCount: 8, author: \"Sarah Johnson\" },\n },\n {\n id: 14,\n name: \"budget_2024.xlsx\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 425000,\n createdAt: new Date(\"2024-03-10T14:30:00Z\"),\n updatedAt: new Date(\"2024-03-10T14:30:00Z\"),\n folderId: 1,\n tags: [\"work\", \"important\"],\n mime: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n ext: \".xlsx\",\n metaData: { pageCount: 5 },\n },\n {\n id: 15,\n name: \"team_photo.jpg\",\n url: \"https://images.unsplash.com/photo-1522071820081-009f0129c71c\",\n size: 3200000,\n createdAt: new Date(\"2024-02-28T11:00:00Z\"),\n updatedAt: new Date(\"2024-02-28T11:00:00Z\"),\n folderId: 2,\n tags: [\"work\"],\n mime: \"image/jpeg\",\n ext: \".jpg\",\n width: 4000,\n height: 3000,\n metaData: {},\n },\n {\n id: 16,\n name: \"logo_design.png\",\n url: \"https://images.unsplash.com/photo-1611162617474-5b21e879e113\",\n size: 1500000,\n createdAt: new Date(\"2024-02-20T10:00:00Z\"),\n updatedAt: new Date(\"2024-02-20T10:00:00Z\"),\n folderId: 2,\n tags: [\"project\"],\n mime: \"image/png\",\n ext: \".png\",\n width: 2000,\n height: 2000,\n metaData: {},\n },\n {\n id: 17,\n name: \"product_demo.mp4\",\n url: \"https://docs.material-tailwind.com/demo.mp4\",\n size: 15000000,\n createdAt: new Date(\"2024-02-15T16:00:00Z\"),\n updatedAt: new Date(\"2024-02-15T16:00:00Z\"),\n folderId: 3,\n tags: [\"project\"],\n mime: \"video/mp4\",\n ext: \".mp4\",\n width: 1920,\n height: 1080,\n metaData: { duration: 180, videoSource: \"local\" },\n },\n {\n id: 18,\n name: \"training_video.mp4\",\n url: \"https://docs.material-tailwind.com/demo.mp4\",\n size: 25000000,\n createdAt: new Date(\"2024-02-10T09:30:00Z\"),\n updatedAt: new Date(\"2024-02-10T09:30:00Z\"),\n folderId: 3,\n tags: [\"work\"],\n mime: \"video/mp4\",\n ext: \".mp4\",\n width: 1920,\n height: 1080,\n metaData: { duration: 300, videoSource: \"local\" },\n },\n {\n id: 19,\n name: \"background_music.mp3\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 4500000,\n createdAt: new Date(\"2024-02-05T14:00:00Z\"),\n updatedAt: new Date(\"2024-02-05T14:00:00Z\"),\n folderId: 4,\n tags: [\"personal\"],\n mime: \"audio/mpeg\",\n ext: \".mp3\",\n metaData: { duration: 240 },\n },\n {\n id: 20,\n name: \"contract_template.docx\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 650000,\n createdAt: new Date(\"2024-01-30T11:00:00Z\"),\n updatedAt: new Date(\"2024-01-30T11:00:00Z\"),\n folderId: 1,\n tags: [\"work\"],\n mime: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n ext: \".docx\",\n metaData: { pageCount: 12 },\n },\n {\n id: 21,\n name: \"invoice_jan.pdf\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 320000,\n createdAt: new Date(\"2024-01-25T10:00:00Z\"),\n updatedAt: new Date(\"2024-01-25T10:00:00Z\"),\n folderId: 1,\n tags: [\"work\", \"important\"],\n mime: \"application/pdf\",\n ext: \".pdf\",\n metaData: { pageCount: 3 },\n },\n {\n id: 22,\n name: \"vacation_photo1.jpg\",\n url: \"https://images.unsplash.com/photo-1506905925346-21bda4d32df4\",\n size: 2800000,\n createdAt: new Date(\"2024-01-20T15:00:00Z\"),\n updatedAt: new Date(\"2024-01-20T15:00:00Z\"),\n folderId: 2,\n tags: [\"personal\"],\n mime: \"image/jpeg\",\n ext: \".jpg\",\n width: 3500,\n height: 2500,\n metaData: {},\n },\n {\n id: 23,\n name: \"vacation_photo2.jpg\",\n url: \"https://images.unsplash.com/photo-1469474968028-56623f02e42e\",\n size: 3100000,\n createdAt: new Date(\"2024-01-20T15:05:00Z\"),\n updatedAt: new Date(\"2024-01-20T15:05:00Z\"),\n folderId: 2,\n tags: [\"personal\"],\n mime: \"image/jpeg\",\n ext: \".jpg\",\n width: 4000,\n height: 2800,\n metaData: {},\n },\n {\n id: 24,\n name: \"project_backup.zip\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 85000000,\n createdAt: new Date(\"2024-01-15T12:00:00Z\"),\n updatedAt: new Date(\"2024-01-15T12:00:00Z\"),\n folderId: 5,\n tags: [\"archive\", \"project\"],\n mime: \"application/zip\",\n ext: \".zip\",\n metaData: { description: \"Full project backup\" },\n },\n {\n id: 25,\n name: \"presentation_final.pptx\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 3500000,\n createdAt: new Date(\"2024-01-10T16:00:00Z\"),\n updatedAt: new Date(\"2024-01-10T16:00:00Z\"),\n folderId: 1,\n tags: [\"work\", \"important\"],\n mime: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n ext: \".pptx\",\n metaData: { pageCount: 35 },\n },\n {\n id: 26,\n name: \"screenshot_001.png\",\n url: \"https://images.unsplash.com/photo-1517694712202-14dd9538aa97\",\n size: 1200000,\n createdAt: new Date(\"2024-01-05T09:00:00Z\"),\n updatedAt: new Date(\"2024-01-05T09:00:00Z\"),\n folderId: 2,\n tags: [\"work\"],\n mime: \"image/png\",\n ext: \".png\",\n width: 1920,\n height: 1080,\n metaData: {},\n },\n {\n id: 27,\n name: \"config.json\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 5000,\n createdAt: new Date(\"2023-12-28T14:00:00Z\"),\n updatedAt: new Date(\"2023-12-28T14:00:00Z\"),\n folderId: 1,\n tags: [\"project\"],\n mime: \"application/json\",\n ext: \".json\",\n metaData: {},\n },\n {\n id: 28,\n name: \"readme.md\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 8500,\n createdAt: new Date(\"2023-12-20T10:00:00Z\"),\n updatedAt: new Date(\"2023-12-20T10:00:00Z\"),\n folderId: 1,\n tags: [\"project\"],\n mime: \"text/markdown\",\n ext: \".md\",\n metaData: {},\n },\n {\n id: 29,\n name: \"database_backup.sql\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 12000000,\n createdAt: new Date(\"2023-12-15T11:00:00Z\"),\n updatedAt: new Date(\"2023-12-15T11:00:00Z\"),\n folderId: 5,\n tags: [\"archive\", \"important\"],\n mime: \"application/sql\",\n ext: \".sql\",\n metaData: { description: \"Database backup\" },\n },\n {\n id: 30,\n name: \"tutorial_video.mp4\",\n url: \"https://docs.material-tailwind.com/demo.mp4\",\n size: 18000000,\n createdAt: new Date(\"2023-12-10T13:00:00Z\"),\n updatedAt: new Date(\"2023-12-10T13:00:00Z\"),\n folderId: 3,\n tags: [\"personal\"],\n mime: \"video/mp4\",\n ext: \".mp4\",\n width: 1920,\n height: 1080,\n metaData: { duration: 420, videoSource: \"local\" },\n },\n {\n id: 31,\n name: \"company_logo.svg\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 45000,\n createdAt: new Date(\"2023-12-05T09:00:00Z\"),\n updatedAt: new Date(\"2023-12-05T09:00:00Z\"),\n folderId: 2,\n tags: [\"work\"],\n mime: \"image/svg+xml\",\n ext: \".svg\",\n metaData: {},\n },\n {\n id: 32,\n name: \"report_q4.pdf\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 1800000,\n createdAt: new Date(\"2023-12-01T15:00:00Z\"),\n updatedAt: new Date(\"2023-12-01T15:00:00Z\"),\n folderId: 1,\n tags: [\"work\", \"important\"],\n mime: \"application/pdf\",\n ext: \".pdf\",\n metaData: { pageCount: 25, author: \"Finance Team\" },\n },\n {\n id: 33,\n name: \"nature_photo.webp\",\n url: \"https://images.unsplash.com/photo-1441974231531-c6227db76b6e\",\n size: 950000,\n createdAt: new Date(\"2023-11-25T12:00:00Z\"),\n updatedAt: new Date(\"2023-11-25T12:00:00Z\"),\n folderId: 2,\n tags: [\"personal\"],\n mime: \"image/webp\",\n ext: \".webp\",\n width: 3000,\n height: 2000,\n metaData: {},\n },\n {\n id: 34,\n name: \"podcast_intro.mp3\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 2500000,\n createdAt: new Date(\"2023-11-20T10:00:00Z\"),\n updatedAt: new Date(\"2023-11-20T10:00:00Z\"),\n folderId: 4,\n tags: [\"personal\"],\n mime: \"audio/mpeg\",\n ext: \".mp3\",\n metaData: { duration: 180 },\n },\n {\n id: 35,\n name: \"data_export.csv\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 850000,\n createdAt: new Date(\"2023-11-15T14:00:00Z\"),\n updatedAt: new Date(\"2023-11-15T14:00:00Z\"),\n folderId: 1,\n tags: [\"work\"],\n mime: \"text/csv\",\n ext: \".csv\",\n metaData: {},\n },\n {\n id: 36,\n name: \"wireframes.pdf\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 4200000,\n createdAt: new Date(\"2023-11-10T11:00:00Z\"),\n updatedAt: new Date(\"2023-11-10T11:00:00Z\"),\n folderId: 1,\n tags: [\"project\"],\n mime: \"application/pdf\",\n ext: \".pdf\",\n metaData: { pageCount: 45 },\n },\n {\n id: 37,\n name: \"cityscape.jpg\",\n url: \"https://images.unsplash.com/photo-1449824913935-59a10b8d2000\",\n size: 3800000,\n createdAt: new Date(\"2023-11-05T16:00:00Z\"),\n updatedAt: new Date(\"2023-11-05T16:00:00Z\"),\n folderId: 2,\n tags: [\"personal\"],\n mime: \"image/jpeg\",\n ext: \".jpg\",\n width: 4500,\n height: 3000,\n metaData: {},\n },\n {\n id: 38,\n name: \"interview_recording.mp3\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 8500000,\n createdAt: new Date(\"2023-11-01T09:00:00Z\"),\n updatedAt: new Date(\"2023-11-01T09:00:00Z\"),\n folderId: 4,\n tags: [\"work\"],\n mime: \"audio/mpeg\",\n ext: \".mp3\",\n metaData: { duration: 1800 },\n },\n {\n id: 39,\n name: \"client_files.rar\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 45000000,\n createdAt: new Date(\"2023-10-25T13:00:00Z\"),\n updatedAt: new Date(\"2023-10-25T13:00:00Z\"),\n folderId: 5,\n tags: [\"archive\", \"work\"],\n mime: \"application/x-rar-compressed\",\n ext: \".rar\",\n metaData: { description: \"Client deliverables\" },\n },\n {\n id: 40,\n name: \"marketing_plan.docx\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 1200000,\n createdAt: new Date(\"2023-10-20T10:00:00Z\"),\n updatedAt: new Date(\"2023-10-20T10:00:00Z\"),\n folderId: 1,\n tags: [\"work\"],\n mime: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n ext: \".docx\",\n metaData: { pageCount: 18 },\n },\n {\n id: 41,\n name: \"analytics_data.xlsx\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 2100000,\n createdAt: new Date(\"2023-10-15T15:00:00Z\"),\n updatedAt: new Date(\"2023-10-15T15:00:00Z\"),\n folderId: 1,\n tags: [\"work\"],\n mime: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n ext: \".xlsx\",\n metaData: { pageCount: 8 },\n },\n {\n id: 42,\n name: \"sunset_beach.jpg\",\n url: \"https://images.unsplash.com/photo-1507525428034-b723cf961d3e\",\n size: 3200000,\n createdAt: new Date(\"2023-10-10T17:00:00Z\"),\n updatedAt: new Date(\"2023-10-10T17:00:00Z\"),\n folderId: 2,\n tags: [\"personal\"],\n mime: \"image/jpeg\",\n ext: \".jpg\",\n width: 4000,\n height: 2700,\n metaData: {},\n },\n {\n id: 43,\n name: \"webinar_recording.mp4\",\n url: \"https://docs.material-tailwind.com/demo.mp4\",\n size: 35000000,\n createdAt: new Date(\"2023-10-05T14:00:00Z\"),\n updatedAt: new Date(\"2023-10-05T14:00:00Z\"),\n folderId: 3,\n tags: [\"work\"],\n mime: \"video/mp4\",\n ext: \".mp4\",\n width: 1920,\n height: 1080,\n metaData: { duration: 600, videoSource: \"local\" },\n },\n {\n id: 44,\n name: \"sound_effects.wav\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 15000000,\n createdAt: new Date(\"2023-10-01T11:00:00Z\"),\n updatedAt: new Date(\"2023-10-01T11:00:00Z\"),\n folderId: 4,\n tags: [\"project\"],\n mime: \"audio/wav\",\n ext: \".wav\",\n metaData: { duration: 120 },\n },\n {\n id: 45,\n name: \"legacy_system.zip\",\n url: \"/placeholder.svg?height=400&width=300\",\n size: 125000000,\n createdAt: new Date(\"2023-09-25T09:00:00Z\"),\n updatedAt: new Date(\"2023-09-25T09:00:00Z\"),\n folderId: 5,\n tags: [\"archive\"],\n mime: \"application/zip\",\n ext: \".zip\",\n metaData: { description: \"Old system files\" },\n },\n];","import { mockFiles, mockFolders, mockTags } from \"@/data/data\";\nimport {\n Folder,\n FileType,\n FileMetaData,\n PaginationInfo,\n MetaDataType,\n FILE_TYPE,\n VIDEO_SOURCE,\n VideoSource,\n EntityId,\n FolderId,\n} from \"@/types/file-manager\";\nimport { FileUploadInput, IFileManagerProvider } from \"@/types/provider\";\nimport { getFileTypeFromMime } from \"@/lib/file-utils\";\n\n// Simulate API delay\nconst delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nexport class MockProvider implements IFileManagerProvider {\n\n getFolder(folderId: FolderId): Promise<Folder | null> {\n if (folderId === null) return Promise.resolve(null);\n const folder = mockFolders.find((f) => f.id === folderId);\n \n if (!folder) return Promise.resolve(null);\n\n // Deep copy to avoid mutating the original mock data during population\n const result: Folder = { ...folder };\n \n // Recursively populate parent\n let current = result;\n while (current.parentId !== null) {\n const parent = mockFolders.find((f) => f.id === current.parentId);\n if (parent) {\n current.parent = { ...parent };\n current = current.parent;\n } else {\n break;\n }\n }\n\n return Promise.resolve(result);\n }\n\n async getFolders(\n folderId: FolderId,\n page: number = 1,\n limit: number = 20,\n query: string = ''\n ): Promise<{folders: Folder[], pagination: PaginationInfo}> {\n await delay(300);\n \n // Filter folders by parent\n const filteredFolders = folderId !== null\n ? mockFolders.filter((folder) => folder.parentId === folderId)\n : mockFolders.filter((folder) => folder.parentId === null);\n \n // Filter by search query\n let searchFiltered = filteredFolders;\n if (query && query.trim()) {\n const searchLower = query.toLowerCase().trim();\n searchFiltered = filteredFolders.filter((folder) =>\n folder.name.toLowerCase().includes(searchLower)\n );\n }\n \n // Sort by creation date ascending (oldest first)\n const sortedFolders = searchFiltered.sort((a, b) => \n new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()\n );\n \n // Apply pagination\n const totalFolders = sortedFolders.length;\n const totalPages = Math.ceil(totalFolders / limit);\n const startIndex = (page - 1) * limit;\n const paginatedFolders = sortedFolders.slice(startIndex, startIndex + limit);\n \n return {\n folders: paginatedFolders,\n pagination: {\n currentPage: page,\n totalPages,\n totalFiles: totalFolders,\n filesPerPage: limit\n }\n };\n }\n getTags(): Promise<string[]> {\n return Promise.resolve(mockTags.map((tag) => tag.name));\n }\n async getFiles(\n folderId: FolderId,\n fileTypes?: FileType[],\n page?: number,\n limit?: number,\n query?: string,\n ): Promise<{ files: FileMetaData[]; pagination: PaginationInfo }> {\n await delay(500);\n let filteredFiles = [...mockFiles];\n\n // Filter by folderId\n if (folderId !== null) {\n filteredFiles = filteredFiles.filter(\n (file) => file.folderId === folderId\n );\n }\n\n // Filter by fileTypes (derive type if not set)\n if (fileTypes && fileTypes.length > 0) {\n filteredFiles = filteredFiles.filter((file) => {\n const fileType = getFileTypeFromMime(file.mime, file.ext);\n return fileTypes.includes(fileType);\n });\n }\n\n // Filter by searchQuery\n if (query) {\n const searchLower = query?.toLowerCase();\n filteredFiles = filteredFiles.filter((file) =>\n file.name.toLowerCase().includes(searchLower)\n );\n }\n\n // Sort by creation date ascending (oldest first)\n const sortedFiles = filteredFiles.sort((a, b) => \n new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()\n );\n\n // Pagination\n const currentPage = page ?? 1;\n const filesPerPage = limit ?? 10;\n const totalFiles = sortedFiles.length;\n const totalPages = Math.ceil(totalFiles / filesPerPage);\n const startIndex = (currentPage - 1) * filesPerPage;\n const paginatedFiles = sortedFiles.slice(\n startIndex,\n startIndex + filesPerPage\n );\n\n return Promise.resolve({\n files: paginatedFiles,\n pagination: {\n currentPage,\n totalPages,\n totalFiles,\n filesPerPage,\n },\n });\n }\n \n /**\n * Get files and folders separately (folders always come first)\n * Folders are not paginated (all folders in current directory are returned)\n * Files are paginated after folders\n */\n async getItems(\n folderId: FolderId,\n fileTypes?: FileType[],\n page: number = 1,\n limit: number = 24,\n query: string = ''\n ): Promise<{\n folders: Folder[];\n files: FileMetaData[];\n pagination: PaginationInfo;\n }> {\n await delay(300);\n \n // Fetch all folders in current directory\n let filteredFolders = folderId !== null\n ? mockFolders.filter((folder) => folder.parentId === folderId)\n : mockFolders.filter((folder) => folder.parentId === null);\n \n // Fetch all files in current directory\n let filteredFiles = folderId !== null\n ? mockFiles.filter((file) => file.folderId === folderId)\n : mockFiles.filter((file) => file.folderId === null);\n\n // Filter by file types\n if (fileTypes && fileTypes.length > 0) {\n filteredFiles = filteredFiles.filter((file) => {\n const fileType = getFileTypeFromMime(file.mime, file.ext);\n return fileTypes.includes(fileType);\n });\n }\n \n // Apply search query to both folders and files\n if (query && query.trim()) {\n const searchLower = query.toLowerCase().trim();\n \n filteredFolders = filteredFolders.filter((folder) =>\n folder.name.toLowerCase().includes(searchLower)\n );\n \n filteredFiles = filteredFiles.filter((file) =>\n file.name.toLowerCase().includes(searchLower) ||\n (file.ext?.toLowerCase().includes(searchLower) ?? false)\n );\n }\n \n // Sort folders by createdAt ASC (oldest first)\n const sortedFolders = filteredFolders.sort((a, b) => \n new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()\n );\n \n // Sort files by createdAt ASC (oldest first)\n const sortedFiles = filteredFiles.sort((a, b) => \n new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()\n );\n \n // Pagination is based on total items (folders + files)\n const totalItems = sortedFolders.length + sortedFiles.length;\n const totalPages = Math.ceil(totalItems / limit) || 1;\n const startIndex = (page - 1) * limit;\n const endIndex = startIndex + limit;\n \n // First, take folders from the start\n const foldersToShow = sortedFolders.slice(\n Math.max(0, startIndex),\n Math.min(sortedFolders.length, endIndex)\n );\n \n // Calculate how many file slots remain after folders\n const foldersTaken = foldersToShow.length;\n const fileSlots = limit - foldersTaken;\n \n // Calculate file offset taking into account folders on previous pages\n const foldersOnPreviousPages = Math.min(sortedFolders.length, startIndex);\n const fileStartIndex = Math.max(0, startIndex - sortedFolders.length);\n \n const filesToShow = sortedFiles.slice(fileStartIndex, fileStartIndex + fileSlots);\n \n return {\n folders: foldersToShow,\n files: filesToShow,\n pagination: {\n currentPage: page,\n totalPages: totalPages,\n totalFiles: totalItems,\n filesPerPage: limit\n }\n };\n }\n\n\n async createFolder(\n name: string,\n parentId?: FolderId\n ): Promise<Folder> {\n await delay(300);\n const newFolder: Folder = {\n id: Date.now(), // simple unique id\n name,\n parentId: parentId ?? null,\n pathId: typeof parentId === 'number' ? parentId : 0, // Fallback logic\n path: \"\",\n fileCount: 0,\n folderCount: 0,\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n mockFolders.push(newFolder);\n return newFolder;\n }\n\n private getMetaDataType(file: File, videoSource?: VideoSource): MetaDataType {\n // Basic metadata extraction\n if (file.type.startsWith(\"image/\")) {\n return {\n // Dimensions would normally require reading the image\n // dimensions: { width: 0, height: 0 },\n // altText: \"\",\n // caption: \"\",\n } as any; // Cast to any to avoid partial checks for now\n } else if (file.type.startsWith(\"video/\")) {\n return {\n duration: 0, // Mock\n videoSource: videoSource ?? VIDEO_SOURCE.LOCAL,\n };\n } else if (file.type.startsWith(\"audio/\")) {\n return {\n duration: 0,\n };\n }\n // Default or other\n return {\n description: \"\",\n };\n }\n\n private getFileType(file: File): FileType {\n // Use the centralized utility function\n const ext = \".\" + file.name.split(\".\").pop()?.toLowerCase();\n return getFileTypeFromMime(file.type, ext);\n }\n\n // Note: Static helper removed - use getFileTypeFromMime from lib/file-type-utils instead\n\n async uploadFiles(\n files: FileUploadInput[],\n folderId?: FolderId\n ): Promise<FileMetaData[]> {\n await delay(500);\n\n const uploadedFiles: FileMetaData[] = [];\n\n for (const { file, videoSource } of files) {\n const fileType = this.getFileType(file);\n const ext = \".\" + file.name.split(\".\").pop()?.toLowerCase();\n \n const newFile: FileMetaData = {\n id: Date.now() + Math.random(), // Ensure unique IDs\n name: file.name,\n folderId: folderId ?? null,\n size: file.size,\n url: URL.createObjectURL(file), // Mock URL\n // type field omitted - will be derived from mime/ext using getFileTypeFromMime\n mime: file.type || \"application/octet-stream\",\n ext: ext,\n metaData: this.getMetaDataType(file, videoSource),\n createdAt: new Date(),\n updatedAt: new Date(),\n tags: [],\n // Mock default dims for images if needed, or leave undefined\n width: fileType === FILE_TYPE.IMAGE ? 800 : undefined,\n height: fileType === FILE_TYPE.IMAGE ? 600 : undefined,\n };\n mockFiles.push(newFile);\n uploadedFiles.push(newFile);\n }\n\n return uploadedFiles;\n }\n\n renameFolder(folderId: EntityId, newName: string): Promise<Folder> {\n const folder = mockFolders.find((f) => f.id === folderId);\n if (!folder) {\n return Promise.reject(new Error(\"Folder not found\"));\n }\n folder.name = newName;\n folder.updatedAt = new Date();\n return Promise.resolve(folder);\n }\n\n updateFileMetaData(\n fileId: EntityId,\n updates: Partial<FileMetaData>\n ): Promise<FileMetaData> {\n const file = mockFiles.find((f) => f.id === fileId);\n if (!file) {\n return Promise.reject(new Error(\"File not found\"));\n }\n \n const { metaData, ...rootUpdates } = updates;\n \n // Update root properties like name, caption, altText\n Object.assign(file, rootUpdates);\n \n // Merge nested metadata properties (e.g. description) if present\n if (metaData) {\n file.metaData = { ...file.metaData, ...metaData };\n }\n \n file.updatedAt = new Date();\n return Promise.resolve(file);\n }\n\n deleteFiles(fileIds: EntityId[]): Promise<void> {\n for (const fileId of fileIds) {\n const fileIndex = mockFiles.findIndex((f) => f.id === fileId);\n if (fileIndex !== -1) {\n mockFiles.splice(fileIndex, 1);\n }\n }\n return Promise.resolve();\n }\n\n deleteFolders(folderIds: EntityId[]): Promise<void> {\n for (const folderId of folderIds) {\n const folderIndex = mockFolders.findIndex((f) => f.id === folderId);\n if (folderIndex !== -1) {\n //remove folder\n mockFolders.splice(folderIndex, 1);\n //remove files in the folder\n for (let i = mockFiles.length - 1; i >= 0; i--) {\n if (mockFiles[i].folderId === folderId) {\n mockFiles.splice(i, 1);\n }\n }\n }\n }\n return Promise.resolve();\n }\n\n findFiles(searchQuery: string): Promise<FileMetaData[]> {\n //search tags and file names\n const query = searchQuery?.toLowerCase();\n const foundFiles = mockFiles.filter(\n (file) =>\n file.name.toLowerCase().includes(query) ||\n file.tags?.some((tag) => tag.toLowerCase().includes(query))\n );\n return Promise.resolve(foundFiles);\n }\n \n findFolders(searchQuery: string): Promise<Folder[]> {\n //search folder with names and tags\n const query = searchQuery?.toLowerCase();\n const foundFolders = mockFolders.filter((folder) =>\n folder.name.toLowerCase().includes(query)\n );\n return Promise.resolve(foundFolders);\n }\n\n moveFiles(fileIds: EntityId[], newFolderId: FolderId): Promise<FileMetaData[]> {\n // Move multiple files\n const movedFiles: FileMetaData[] = [];\n for (const fileId of fileIds) {\n const file = mockFiles.find((f) => f.id === fileId);\n if (file) {\n file.folderId = newFolderId;\n file.updatedAt = new Date();\n movedFiles.push(file);\n }\n }\n return Promise.resolve(movedFiles); \n }\n moveFolders(folderIds: FolderId[], newParentId: FolderId): Promise<Folder[]> {\n // Move multiple folders\n const movedFolders: Folder[] = [];\n for (const folderId of folderIds) {\n const folder = mockFolders.find((f) => f.id === folderId);\n if (folder) {\n folder.parentId = newParentId;\n folder.updatedAt = new Date();\n movedFolders.push(folder);\n }\n }\n return Promise.resolve(movedFolders);\n }\n}\n"],"mappings":"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YEC,MAAiB,QACrB,iTACA,CACE,SAAU,CACR,QAAS,CACP,QAAS,yFACT,KAAM,gLACN,YACE,yGACF,UAAW,iGACX,QAAS,uGACT,OACE,+JACF,MACE,2IACF,IAAK,gFACL,WAAY,GACZ,QAAS,EACX,EACA,WAAY,CACV,QAAS,GACT,MAAO,EACT,EACA,UAAW,CACT,MAAO,GACP,OAAQ,EACV,EACA,WAAY,CACV,MAAO,GACP,OAAQ,EACV,EACA,KAAM,CACJ,GAAI,+DACJ,GAAI,8DACJ,GAAI,mEACJ,GAAI,8DACJ,KAAM,oDACR,EACA,WAAY,CACV,KAAM,GACN,MAAO,EACT,EACA,OAAQ,CACN,GAAI,aACJ,KAAM,cACR,EACA,KAAM,CACJ,QAAS,2EACT,KAAM,oFACN,KAAM,4GACN,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAQT,EACA,YAAa,CACX,KAAM,wBACN,MAAO,EACT,CACF,EACA,iBAAkB,CAEhB,CACE,QAAS,QACT,KAAM,UACN,UAAW,+EACb,EACA,CACE,QAAS,UACT,KAAM,UACN,UAAW,+EACb,EACA,CACE,QAAS,SACT,KAAM,UACN,UAAW,+EACb,EACA,CACE,QAAS,YACT,KAAM,UACN,UAAW,+EACb,EAGA,CACE,QAAS,UACT,KAAM,QACN,UAAW,+EACb,EACA,CACE,QAAS,UACT,KAAM,OACN,UAAW,+EACb,EAGA,CACE,KAAM,KACN,WAAY,GACZ,UAAW,gBACb,EACA,CACE,KAAM,KACN,WAAY,GACZ,UAAW,gBACb,EACA,CACE,KAAM,KACN,WAAY,GACZ,UAAW,gBACb,EACA,CACE,KAAM,KACN,WAAY,GACZ,UAAW,iBACb,EAGA,CACE,QAAS,UACT,KAAM,UACN,WAAY,UACZ,UAAW,0BACb,EACA,CACE,QAAS,OACT,KAAM,UACN,WAAY,UACZ,UAAW,0BACb,EACA,CACE,QAAS,YACT,KAAM,UACN,WAAY,UACZ,UAAW,0BACb,EACA,CACE,QAAS,UACT,KAAM,UACN,WAAY,UACZ,UAAW,0BACb,EACA,CACE,QAAS,SACT,KAAM,UACN,WAAY,UACZ,UAAW,0BACb,EACA,CACE,QAAS,cACT,KAAM,UACN,WAAY,UACZ,UAAW,0BACb,EAGA,CACE,QAAS,UACT,KAAM,OACN,WAAY,UACZ,UAAW,0BACb,EACA,CACE,QAAS,OACT,KAAM,OACN,WAAY,UACZ,UAAW,0BACb,EACA,CACE,QAAS,YACT,KAAM,OACN,WAAY,UACZ,UAAW,0BACb,EACA,CACE,QAAS,UACT,KAAM,OACN,WAAY,UACZ,UAAW,0BACb,EACA,CACE,QAAS,SACT,KAAM,OACN,WAAY,UACZ,UAAW,0BACb,EACA,CACE,QAAS,cACT,KAAM,OACN,WAAY,UACZ,UAAW,0BACb,EAGA,CACE,QAAS,UACT,KAAM,OACN,UAAW,QACX,UACE,uKACJ,EACA,CACE,QAAS,UACT,KAAM,OACN,UAAW,SACX,UACE,qLACJ,EACA,CACE,QAAS,UACT,KAAM,OACN,WAAY,QACZ,UACE,qJACJ,EACA,CACE,QAAS,UACT,KAAM,OACN,WAAY,SACZ,UACE,+HACJ,EAEA,CACE,QAAS,UACT,KAAM,OACN,UAAW,QACX,UACE,iJACJ,EACA,CACE,QAAS,UACT,KAAM,OACN,UAAW,SACX,UACE,+JACJ,EACA,CACE,QAAS,UACT,KAAM,OACN,WAAY,QACZ,UACE,+HACJ,EACA,CACE,QAAS,UACT,KAAM,OACN,WAAY,SACZ,UACE,6IACJ,EAEA,CACE,QAAS,aACT,KAAM,OACN,UAAW,QACX,UACE,oJACJ,EACA,CACE,QAAS,aACT,KAAM,OACN,UAAW,SACX,UACE,kKACJ,EACA,CACE,QAAS,aACT,KAAM,OACN,WAAY,QACZ,UACE,kIACJ,EACA,CACE,QAAS,aACT,KAAM,OACN,WAAY,SACZ,UACE,gJACJ,EAGA,CACE,QAAS,UACT,WAAY,QACZ,UAAW,kFACb,EACA,CACE,QAAS,cACT,WAAY,QACZ,UAAW,8FACb,EACA,CACE,QAAS,QACT,KAAM,OACN,UAAW,uBACb,EAGA,CACE,KAAM,KACN,KAAM,OACN,UAAW,mDACb,EACA,CACE,KAAM,KACN,KAAM,OACN,UAAW,mDACb,EACA,CACE,KAAM,KACN,KAAM,OACN,UAAW,gDACb,EACA,CACE,KAAM,OACN,UAAW,gDACb,EACA,CACE,KAAM,KACN,KAAM,OACN,UAAW,kDACb,EAGA,CACE,KAAM,QACN,YAAa,GACb,QAAS,UACT,UAAW,mCACb,EACA,CACE,KAAM,QACN,QAAS,UACT,KAAM,KACN,UAAW,UACb,EACA,CACE,KAAM,QACN,QAAS,UACT,KAAM,KACN,UAAW,SACb,EACA,CACE,KAAM,QACN,QAAS,UACT,KAAM,KACN,UAAW,SACb,CACF,EACA,gBAAiB,CACf,QAAS,UACT,KAAM,UACN,KAAM,KACN,OAAQ,KACR,WAAY,SACd,CACF,CACF,EAEA,SAASC,EAAOC,EAkBX,CAlBW,IAAAC,EAAAD,EACd,WAAAE,EACA,SAAAC,EACA,QAAAC,EACA,OAAAC,EACA,WAAAC,EACA,KAAAC,EACA,KAAAC,EACA,WAAAC,EACA,WAAAC,EACA,UAAAC,EACA,QAAAC,EAAU,GACV,YAAAC,EAAc,EA9XhB,EAkXgBZ,EAaXa,EAAAC,EAbWd,EAaX,CAZH,YACA,WACA,UACA,SACA,aACA,OACA,OACA,aACA,aACA,YACA,UACA,gBAOA,IAAMe,EAAOJ,EAAU,GAAAK,KAAc,KAAO,SAC5C,SACE,QAACD,EAAAE,IAAA,CACC,YAAU,SACV,UAAWC,EACTrB,GAAe,CACb,QAAAM,EACA,KAAAI,EACA,OAAAH,EACA,WAAAC,EACA,KAAAC,EACA,WAAAE,EACA,YAAAI,EACA,WAAAH,EACA,UAAAC,EACA,UAAAT,CACF,CAAC,EACDU,GAAWE,EAAM,UAAY,gCAC/B,GACKX,GAAY,CAAE,aAAc,MAAO,GACpCW,EACN,CAEJ,CChZY,IAAAM,GAAA,6BAZG,SAARC,GACHC,EACF,CACE,SACI,QAAC,MAAAC,EAAAC,EAAA,CACG,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,MAAM,8BACFF,GANP,CAQG,oBAAC,QAAK,EAAE,6DAA6D,OAAO,UAAU,YAAY,MAAM,cAAc,QAAQ,eAAe,QAAQ,GACzJ,CAER,CCJY,IAAAG,GAAA,6BAXG,SAARC,GACHC,EACF,CACE,SACI,QAAC,MAAAC,EAAAC,EAAA,CACG,MAAM,6BACN,MAAM,KACN,OAAO,KACP,QAAQ,aACJF,GALP,CAOG,oBAAC,QAAK,KAAK,eAAe,EAAE,qKAAqK,GACrM,CAER,CCmCY,IAAAG,GAAA,6BArCZ,SAASC,GAAeC,EAAiBC,EAAe,CACtD,IAAMC,EAAiC,CAAC,EACxC,GAAID,GAAS,EACX,QAASE,EAAI,EAAGA,GAAKF,EAAOE,IAAKD,EAAM,KAAKC,CAAC,OACpCH,GAAW,EACpBE,EAAM,KAAK,EAAG,EAAG,EAAG,EAAG,EAAG,WAAYD,CAAK,EAClCD,GAAWC,EAAQ,EAC5BC,EAAM,KAAK,EAAG,WAAYD,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,EAAGA,CAAK,EAE3EC,EAAM,KAAK,EAAG,WAAYF,EAAU,EAAGA,EAASA,EAAU,EAAG,WAAYC,CAAK,EAEhF,OAAOC,CACT,CAEO,SAASE,GAAkB,CAAE,UAAAC,CAAU,EAA2B,CACvE,GAAM,CAAE,WAAAC,EAAY,iBAAAC,EAAkB,MAAAC,EAAO,QAAAC,CAAQ,EAAIC,EAAe,EAClE,CAAE,YAAAC,EAAa,WAAAC,CAAW,EAAIN,EAG9BO,IAAcL,GAAA,YAAAA,EAAO,SAAU,KAAMC,GAAA,YAAAA,EAAS,SAAU,GAC9D,GAAIG,GAAc,GAAKC,IAAe,EACpC,OAAO,KAGT,IAAMC,EAAcf,GAAeY,EAAaC,CAAU,EAE1D,SACE,QAACG,GAAA,CAAW,UAAWV,EACrB,qBAACW,GAAA,CACC,qBAACC,GAAA,CACC,oBAACC,EAAA,CACC,QAAQ,QACR,OAAQ,OACR,QAAO,GACP,SAAUP,IAAgB,EAC1B,QAAS,IAAMA,EAAc,GAAKJ,EAAiBI,EAAc,CAAC,EAElE,qBAAC,QACC,qBAACQ,GAAA,CAAgB,UAAU,iBAAiB,EAAE,aAChD,EACF,EACF,EACCL,EAAY,IAAI,CAACM,EAAMC,IACtBD,IAAS,cACP,QAACH,GAAA,CACC,oBAACK,GAAA,EAAmB,GADD,YAAYX,CAAW,IAAIC,CAAU,IAAIS,CAAG,EAEjE,KAEA,QAACJ,GAAA,CACC,oBAACC,EAAA,CACC,QAASE,IAAST,EAAc,UAAY,QAC5C,KAAK,OACL,KAAK,OACL,OAAO,OACP,QAAO,GACP,QAAS,IAAMJ,EAAiBa,CAAI,EACpC,SAAUA,IAAST,EAEnB,oBAAC,QAAM,SAAAS,EAAK,EACd,GAXmBA,CAYrB,CAEJ,KACA,QAACH,GAAA,CACC,oBAACC,EAAA,CACC,QAAQ,QACR,OAAQ,OACR,QAAO,GACP,SAAUP,IAAgBC,EAC1B,QAAS,IAAMD,EAAcC,GAAcL,EAAiBI,EAAc,CAAC,EAE3E,qBAAC,QAAK,qBACC,QAACY,GAAA,CAAiB,UAAU,iBAAiB,GACpD,EACF,EACF,GACF,EACF,CAEJ,CChFI,IAAAC,GAAA,6BARG,SAASC,GAAkB,CAChC,SAAAC,EACA,UAAAC,CACF,EAGG,CACD,SACE,QAAC,OAAI,UAAWC,EAAG,6BAA8BD,CAAS,EACvD,SAAAD,EACH,CAEJ,CCbA,IAAAG,GAAyB,iBCEzB,IAAAC,GAAkC,oCAClCC,GAAkB,wBAClBC,GAA0C,oBAkBjC,IAAAC,GAAA,6BAhBHC,MAAwB,QAC5B,mTACA,CACE,SAAU,CACR,QAAS,CACP,QAAS,6EACT,WAAY,SACd,CACF,EACA,gBAAiB,CACf,QAAS,SACX,CACF,CACF,EAEA,SAASC,GAAOC,EAAiE,CAAjE,IAAKC,EAAAC,EAALF,EAAK,IACnB,SAAO,QAAC,GAAAG,OAAgB,KAAhBC,EAAA,CAAqB,YAAU,UAAaH,EAAO,CAC7D,CAMA,SAASI,GAAaC,EAAmE,CAAnE,IAAKC,EAAAC,EAALF,EAAK,IACzB,SAAO,QAAC,GAAAG,OAAgB,OAAhBC,EAAA,CAAuB,YAAU,iBAAoBH,EAAO,CACtE,CAEA,SAASI,GAAYL,EAAkE,CAAlE,IAAKC,EAAAC,EAALF,EAAK,IACxB,SAAO,QAAC,GAAAG,OAAgB,MAAhBC,EAAA,CAAsB,YAAU,gBAAmBH,EAAO,CACpE,CAEA,SAASK,GAAcN,EAA+E,CAA/E,IAAAO,EAAAP,EAAE,WAAAQ,CAvCzB,EAuCuBD,EAAgBN,EAAAC,EAAhBK,EAAgB,CAAd,cACvB,SACE,QAAC,GAAAJ,OAAgB,QAAhBC,EAAA,CACC,YAAU,iBACV,UAAWK,EACT,qLACAD,CACF,GACIP,EACN,CAEJ,CAEA,SAASS,GAAcV,EAWlB,CAXkB,IAAAO,EAAAP,EACrB,WAAAQ,EACA,SAAAG,EACA,gBAAAC,EAAkB,GAClB,QAAAC,EAAU,GACV,QAAAC,CAzDF,EAoDuBP,EAMlBN,EAAAC,EANkBK,EAMlB,CALH,YACA,WACA,kBACA,UACA,YAOA,SACE,SAACR,GAAA,CACE,UAAAc,MAAW,QAACP,GAAA,EAAc,KAC3B,SAAC,GAAAH,OAAgB,QAAhBY,EAAAX,EAAA,CACC,YAAU,iBACV,UAAWK,EAAGO,GAAsB,CAAE,QAAAF,CAAQ,CAAC,EAAGN,CAAS,GACvDP,GAHL,CAKE,UAAAU,EACAC,MACC,SAACP,GAAA,CAAY,UAAU,0PACrB,qBAAC,MAAE,UAAU,SAAS,KACtB,QAAC,QAAK,UAAU,UAAU,iBAAK,GACjC,IAEJ,GACF,CAEJ,CAIA,IAAMY,GAAgBC,GAA+D,CAA/D,IAAAC,EAAAD,EAAE,WAAAE,CAtFxB,EAsFsBD,EAAgBE,EAAAC,EAAhBH,EAAgB,CAAd,cACtB,iBAAC,MAAAI,EAAA,CACC,YAAU,gBACV,UAAWC,EAAG,yDAA0DJ,CAAS,GAC7EC,EACN,GAGII,GAAgBP,GAA+D,CAA/D,IAAAC,EAAAD,EAAE,WAAAE,CA9FxB,EA8FsBD,EAAgBE,EAAAC,EAAhBH,EAAgB,CAAd,cACtB,iBAAC,MAAAI,EAAA,CACC,YAAU,gBACV,UAAWC,EAAG,uEAAwEJ,CAAS,GAC3FC,EACN,GAGF,SAASK,GAAYR,EAA6E,CAA7E,IAAAC,EAAAD,EAAE,WAAAE,CAtGvB,EAsGqBD,EAAgBE,EAAAC,EAAhBH,EAAgB,CAAd,cACrB,SACE,QAAC,GAAAQ,OAAgB,MAAhBJ,EAAA,CACC,YAAU,eACV,UAAWC,EAAG,oDAAqDJ,CAAS,GACxEC,EACN,CAEJ,CAMA,SAASO,GAAkBC,EAAmF,CAAnF,IAAAC,EAAAD,EAAE,WAAAE,CApH7B,EAoH2BD,EAAgBE,EAAAC,EAAhBH,EAAgB,CAAd,cAC3B,SACE,QAAC,GAAAI,OAAgB,YAAhBC,EAAA,CACC,YAAU,qBACV,UAAWC,EAAG,gCAAiCL,CAAS,GACpDC,EACN,CAEJ,CC1HA,IAAAK,GAAuC,oCACvCC,GAAkB,wBAiMd,IAAAC,GAAA,6BA/LEC,MAAgB,QAAI,+DAAgE,CACxF,SAAU,CACR,QAAS,CACP,UAAW,GACX,QAAS,GACT,YAAa,GACb,QAAS,GACT,KAAM,GACN,KAAM,GACN,QAAS,EACX,EACA,KAAM,CACJ,QAAS,GACT,YAAa,GACb,QAAS,GACT,KAAM,GACN,QAAS,EACX,EACA,WAAY,CACV,MAAO,GACP,QAAS,GACT,MAAO,GACP,OAAQ,iBACV,EACA,KAAM,CACJ,GAAI,sIACJ,GAAI,wIACJ,GAAI,kLACN,CACF,EACA,iBAAkB,CAEhB,CACE,QAAS,YACT,WAAY,QACZ,UAAW,0BACb,EACA,CACE,QAAS,UACT,WAAY,QACZ,UAAW,oCACb,EACA,CACE,QAAS,cACT,WAAY,QACZ,UAAW,4CACb,EACA,CACE,QAAS,UACT,WAAY,QACZ,UACE,4GACJ,EACA,CACE,QAAS,OACT,WAAY,QACZ,UACE,uGACJ,EACA,CACE,QAAS,UACT,WAAY,QACZ,UACE,6GACJ,EACA,CACE,QAAS,OACT,WAAY,QACZ,UAAW,8FACb,EAGA,CACE,QAAS,YACT,WAAY,UACZ,UAAW,gGACb,EACA,CACE,QAAS,UACT,WAAY,UACZ,UAAW,6FACb,EACA,CACE,QAAS,cACT,WAAY,UACZ,UAAW,iGACb,EACA,CACE,QAAS,UACT,WAAY,UACZ,UACE,mIACJ,EACA,CACE,QAAS,OACT,WAAY,UACZ,UACE,iIACJ,EACA,CACE,QAAS,UACT,WAAY,UACZ,UACE,oIACJ,EACA,CACE,QAAS,OACT,WAAY,UACZ,UAAW,gGACb,EAGA,CACE,QAAS,YACT,WAAY,QACZ,UAAW,+CACb,EACA,CACE,QAAS,UACT,WAAY,QACZ,UACE,uSACJ,EACA,CACE,QAAS,cACT,WAAY,QACZ,UACE,wTACJ,EACA,CACE,QAAS,UACT,WAAY,QACZ,UACE,4VACJ,EACA,CACE,QAAS,OACT,WAAY,QACZ,UACE,kVACJ,EACA,CACE,QAAS,UACT,WAAY,QACZ,UACE,iWACJ,EAGA,CACE,QAAS,OACT,KAAM,UACN,UAAW,yCACb,EACA,CACE,QAAS,OACT,KAAM,UACN,UAAW,2FACb,EACA,CACE,QAAS,OACT,KAAM,UACN,UAAW,0FACb,EACA,CACE,QAAS,OACT,KAAM,cACN,UAAW,6CACb,EACA,CACE,QAAS,OACT,KAAM,OACN,UAAW,wFACb,CACF,EACA,gBAAiB,CACf,QAAS,YACT,WAAY,QACZ,KAAM,IACR,CACF,CAAC,EASD,SAASC,GAAMC,EAAwG,CAAxG,IAAAC,EAAAD,EAAE,WAAAE,EAAW,QAAAC,EAAS,KAAAC,EAAM,KAAAC,EAAM,WAAAC,EAAY,MAAAC,EAAQ,GAAO,QAAAC,EAAS,SAAAC,CAlMrF,EAkMeR,EAAmFS,EAAAC,EAAnFV,EAAmF,CAAjF,YAAW,UAAS,OAAM,OAAM,aAAY,QAAe,UAAS,aACnF,SACE,SAAC,MAAAW,EAAAC,EAAA,CACC,YAAU,QACV,KAAK,QACL,UAAWC,EAAGhB,GAAc,CAAE,QAAAK,EAAS,KAAAC,EAAM,KAAAC,EAAM,WAAAC,CAAW,CAAC,EAAGJ,CAAS,GACvEQ,GAJL,CAME,UAAAD,EACAF,MACC,QAAC,UACC,QAASC,EACT,aAAW,UACX,YAAU,cACV,UAAWM,EAAG,sCAAsC,EAEpD,oBAAC,MAAE,UAAU,4CAA4C,EAC3D,IAEJ,CAEJ,CAEA,SAASC,GAAWf,EAAmE,CAAnE,IAAAC,EAAAD,EAAE,WAAAE,CAzNtB,EAyNoBD,EAAgBS,EAAAC,EAAhBV,EAAgB,CAAd,cACpB,SAAO,QAAC,MAAAY,EAAA,CAAI,YAAU,cAAc,UAAWC,EAAG,sBAAuBZ,CAAS,GAAOQ,EAAO,CAClG,CAEA,SAASM,GAAUhB,EAAmD,CAAnD,IAAAC,EAAAD,EAAE,UAAAS,EAAU,UAAAP,CA7N/B,EA6NmBD,EAA0BS,EAAAC,EAA1BV,EAA0B,CAAxB,WAAU,cAC7B,SACE,QAAC,MAAAW,EAAAC,EAAA,CAAI,YAAU,aAAa,UAAWC,EAAG,WAAYZ,CAAS,GAAOQ,GAArE,CACE,SAAAD,GACH,CAEJ,CAUA,SAASQ,GAAiBC,EAAqE,CAArE,IAAAC,EAAAD,EAAE,WAAAE,CA7O5B,EA6O0BD,EAAgBE,EAAAC,EAAhBH,EAAgB,CAAd,cAC1B,SACE,QAAC,MAAAI,EAAA,CACC,YAAU,oBACV,UAAWC,EAAG,2CAA4CJ,CAAS,GAC/DC,EACN,CAEJ,CAEA,SAASI,GAAaP,EAAqE,CAArE,IAAAC,EAAAD,EAAE,WAAAE,CAvPxB,EAuPsBD,EAAgBE,EAAAC,EAAhBH,EAAgB,CAAd,cACtB,SACE,QAAC,MAAAI,EAAA,CACC,YAAU,gBACV,UAAWC,EAAG,sDAAuDJ,CAAS,GAC1EC,EACN,CAEJ,CC5PA,IAAAK,GAAkC,uCAIzB,IAAAC,GAAA,6BADT,SAASC,GAAgBC,EAAyF,CAAzF,IAAAC,EAAAD,EAAE,eAAAE,EAAgB,CAN3C,EAMyBD,EAAwBE,EAAAC,EAAxBH,EAAwB,CAAtB,kBACzB,SAAO,QAAkB,YAAjBI,EAAA,CAA0B,YAAU,mBAAmB,cAAeH,GAAmBC,EAAO,CAC1G,CAEA,SAASG,GAAQN,EAAkE,CAAlE,IAAKG,EAAAC,EAALJ,EAAK,IACpB,SACE,QAACD,GAAA,CACC,oBAAkB,QAAjBM,EAAA,CAAsB,YAAU,WAAcF,EAAO,EACxD,CAEJ,CAEA,SAASI,GAAeP,EAAqE,CAArE,IAAKG,EAAAC,EAALJ,EAAK,IAC3B,SAAO,QAAkB,WAAjBK,EAAA,CAAyB,YAAU,mBAAsBF,EAAO,CAC1E,CAEA,SAASK,GAAeR,EAKkC,CALlC,IAAAC,EAAAD,EACtB,WAAAS,EACA,WAAAC,EAAa,EACb,SAAAC,CAzBF,EAsBwBV,EAInBE,EAAAC,EAJmBH,EAInB,CAHH,YACA,aACA,aAGA,SACE,QAAkB,UAAjB,CACC,qBAAkB,WAAjBW,EAAAP,EAAA,CACC,YAAU,kBACV,WAAYK,EACZ,UAAWG,EACT,oaACAJ,CACF,GACIN,GAPL,CASE,UAAAQ,KACD,QAAkB,SAAjB,CAAuB,UAAU,qGAAqG,IACzI,EACF,CAEJ,CC5CO,SAASG,GAAYC,EAAe,CACvC,GAAIA,IAAU,EAAG,MAAO,UACxB,IAAMC,EAAI,KACJC,EAAQ,CAAC,QAAS,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAI,EAChEC,EAAI,KAAK,MAAM,KAAK,IAAIH,CAAK,EAAI,KAAK,IAAIC,CAAC,CAAC,EAClD,OACI,OAAO,YAAYD,EAAQ,KAAK,IAAIC,EAAGE,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAI,IAAMD,EAAMC,CAAC,CAE9E,CCHA,IAAAC,GAAqH,iBA2D9G,IAAMC,GAAgB,CAACC,EAA6B,CAAC,IAA4C,CACtG,GAAM,CACJ,SAAAC,EAAW,OAAO,kBAClB,QAAAC,EAAU,OAAO,kBACjB,OAAAC,EAAS,IACT,SAAAC,EAAW,GACX,aAAAC,EAAe,CAAC,EAChB,cAAAC,EACA,aAAAC,EACA,QAAAC,CACF,EAAIR,EAEE,CAACS,EAAOC,CAAQ,KAAI,aAA0B,CAClD,MAAOL,EAAa,IAAKM,IAAU,CACjC,KAAAA,EACA,GAAIA,EAAK,GACT,QAASA,EAAK,GAChB,EAAE,EACF,WAAY,GACZ,OAAQ,CAAC,CACX,CAAC,EAEKC,KAAW,WAAyB,IAAI,KAG9C,cAAU,IACD,IAAM,CAEXH,EAAM,MAAM,QAAQE,GAAQ,CACtBA,EAAK,SAAWA,EAAK,gBAAgB,MACvC,IAAI,gBAAgBA,EAAK,OAAO,CAEpC,CAAC,CACH,EACC,CAACF,EAAM,KAAK,CAAC,EAEhB,IAAMI,KAAe,gBAClBF,GAA6C,CAC5C,GAAIA,aAAgB,MAClB,GAAIA,EAAK,KAAOT,EACd,MAAO,SAASS,EAAK,IAAI,iCAAiCG,GAAYZ,CAAO,CAAC,YAG5ES,EAAK,KAAOT,EACd,MAAO,SAASS,EAAK,IAAI,iCAAiCG,GAAYZ,CAAO,CAAC,IAIlF,GAAIC,IAAW,IAAK,CAClB,IAAMY,EAAgBZ,EAAO,MAAM,GAAG,EAAE,IAAKa,GAASA,EAAK,KAAK,CAAC,EAC3DC,EAAWN,aAAgB,KAAOA,EAAK,MAAQ,GAAKA,EAAK,KACzDO,EAAgB,IAAIP,aAAgB,KAAOA,EAAK,KAAK,MAAM,GAAG,EAAE,IAAI,CAA8B,GAaxG,GAAI,CAXeI,EAAc,KAAMC,GAAS,CAC9C,GAAIA,EAAK,WAAW,GAAG,EACrB,OAAOE,EAAc,YAAY,IAAMF,EAAK,YAAY,EAE1D,GAAIA,EAAK,SAAS,IAAI,EAAG,CACvB,IAAMG,GAAWH,EAAK,MAAM,GAAG,EAAE,CAAC,EAClC,OAAOC,EAAS,WAAW,GAAGE,EAAQ,GAAG,CAC3C,CACA,OAAOF,IAAaD,CACtB,CAAC,EAGC,MAAO,SAASL,aAAgB,KAAOA,EAAK,IAAgB,iCAEhE,CAEA,OAAO,IACT,EACA,CAACR,EAAQD,CAAO,CAClB,EAEMkB,KAAgB,gBAAaT,GAC7BA,aAAgB,KACX,IAAI,gBAAgBA,CAAI,EAE1BA,EAAK,IACX,CAAC,CAAC,EAECU,KAAmB,gBAAaV,GAChCA,aAAgB,KACX,GAAGA,EAAK,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,EAAG,CAAC,CAAC,GAE1EA,EAAK,GAAG,SAAS,EACvB,CAAC,CAAC,EAECW,KAAa,gBAAY,IAAM,CACnCZ,EAAUa,GAAS,CAEjB,QAAWZ,KAAQY,EAAK,MAClBZ,EAAK,SAAWA,EAAK,gBAAgB,MAAQA,EAAK,KAAK,KAAK,WAAW,QAAQ,GACjF,IAAI,gBAAgBA,EAAK,OAAO,EAIhCC,EAAS,UACXA,EAAS,QAAQ,MAAQ,IAG3B,IAAMY,EAAWC,EAAAC,EAAA,GACZH,GADY,CAEf,MAAO,CAAC,EACR,OAAQ,CAAC,CACX,GAEA,OAAAjB,GAAA,MAAAA,EAAgBkB,EAAS,OAClBA,CACT,CAAC,CACH,EAAG,CAAClB,CAAa,CAAC,EAEZqB,KAAW,gBACdC,GAAgC,CAC/B,GAAI,CAACA,GAAYA,EAAS,SAAW,EAAG,OAExC,IAAMC,EAAgB,MAAM,KAAKD,CAAQ,EACnCE,EAAmB,CAAC,EAG1BpB,EAAUa,GAAUE,EAAAC,EAAA,GAAKH,GAAL,CAAW,OAAQ,CAAC,CAAE,EAAE,EAGvCnB,GACHkB,EAAW,EAGbZ,EAAUa,GAAS,CAEjB,GAAInB,GAAYH,IAAa,OAAO,mBAAqBsB,EAAK,MAAM,OAASM,EAAc,OAAS5B,EAClG,OAAA6B,EAAO,KAAK,oCAAoC7B,CAAQ,SAAS,EACjEO,GAAA,MAAAA,EAAUsB,GACHL,EAAAC,EAAA,GAAKH,GAAL,CAAW,OAAAO,CAAO,GAG3B,IAAMC,EAAgC,CAAC,EAEvC,QAAWpB,KAAQkB,EAAe,CAEhC,GAAIzB,GACkBmB,EAAK,MAAM,KAC5BS,GAAiBA,EAAa,KAAK,OAASrB,EAAK,MAAQqB,EAAa,KAAK,OAASrB,EAAK,IAC5F,EAIE,SAKJ,GAAIA,EAAK,KAAOT,EAAS,CACvB4B,EAAO,KACL1B,EACI,yCAAyCU,GAAYZ,CAAO,CAAC,IAC7D,oCAAoCY,GAAYZ,CAAO,CAAC,GAC9D,EACA,QACF,CAEA,IAAM+B,GAAQpB,EAAaF,CAAI,EAC3BsB,GACFH,EAAO,KAAKG,EAAK,EAEjBF,EAAW,KAAK,CACd,KAAApB,EACA,GAAIU,EAAiBV,CAAI,EACzB,QAASS,EAAcT,CAAI,CAC7B,CAAC,CAEL,CAGA,GAAIoB,EAAW,OAAS,EAAG,CAEzBxB,GAAA,MAAAA,EAAewB,GAEf,IAAMH,EAAYxB,EAAwB,CAAC,GAAGmB,EAAK,MAAO,GAAGQ,CAAU,EAA1CA,EAC7B,OAAAzB,GAAA,MAAAA,EAAgBsB,GACTH,EAAAC,EAAA,GACFH,GADE,CAEL,MAAOK,EACP,OAAAE,CACF,EACF,SAAWA,EAAO,OAAS,EACzB,OAAAtB,GAAA,MAAAA,EAAUsB,GACHL,EAAAC,EAAA,GACFH,GADE,CAEL,OAAAO,CACF,GAGF,OAAOP,CACT,CAAC,EAGGX,EAAS,UACXA,EAAS,QAAQ,MAAQ,GAE7B,EACA,CACEX,EACAG,EACAF,EACAW,EACAO,EACAC,EACAC,EACAhB,EACAC,EACAC,CACF,CACF,EAEM0B,KAAa,gBAChBC,GAAiB,CAChBzB,EAAUa,GAAS,CACjB,IAAMa,EAAeb,EAAK,MAAM,KAAMZ,GAASA,EAAK,KAAOwB,CAAE,EAE3DC,GACAA,EAAa,SACbA,EAAa,gBAAgB,MAC7BA,EAAa,KAAK,KAAK,WAAW,QAAQ,GAE1C,IAAI,gBAAgBA,EAAa,OAAO,EAG1C,IAAMR,EAAWL,EAAK,MAAM,OAAQZ,GAASA,EAAK,KAAOwB,CAAE,EAC3D,OAAA7B,GAAA,MAAAA,EAAgBsB,GAETH,EAAAC,EAAA,GACFH,GADE,CAEL,MAAOK,EACP,OAAQ,CAAC,CACX,EACF,CAAC,CACH,EACA,CAACtB,CAAa,CAChB,EAEM+B,KAAc,gBAAY,IAAM,CACpC3B,EAAUa,GAAUE,EAAAC,EAAA,GACfH,GADe,CAElB,OAAQ,CAAC,CACX,EAAE,CACJ,EAAG,CAAC,CAAC,EAECe,KAAkB,gBAAaC,GAA8B,CACjEA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAClB7B,EAAUa,GAAUE,EAAAC,EAAA,GAAKH,GAAL,CAAW,WAAY,EAAK,EAAE,CACpD,EAAG,CAAC,CAAC,EAECiB,KAAkB,gBAAaD,GAA8B,CACjEA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAEd,CAAAA,EAAE,cAAc,SAASA,EAAE,aAAqB,GAIpD7B,EAAUa,GAAUE,EAAAC,EAAA,GAAKH,GAAL,CAAW,WAAY,EAAM,EAAE,CACrD,EAAG,CAAC,CAAC,EAECkB,KAAiB,gBAAaF,GAA8B,CAChEA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,CACpB,EAAG,CAAC,CAAC,EAECG,KAAa,gBAChBH,GAA8B,CA9UnC,IAAAI,EAoVM,GALAJ,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAClB7B,EAAUa,GAAUE,EAAAC,EAAA,GAAKH,GAAL,CAAW,WAAY,EAAM,EAAE,EAG/C,GAAAoB,EAAA/B,EAAS,UAAT,MAAA+B,EAAkB,WAIlBJ,EAAE,aAAa,OAASA,EAAE,aAAa,MAAM,OAAS,EAExD,GAAKnC,EAIHuB,EAASY,EAAE,aAAa,KAAK,MAJhB,CACb,IAAM5B,EAAO4B,EAAE,aAAa,MAAM,CAAC,EACnCZ,EAAS,CAAChB,CAAI,CAAC,CACjB,CAIJ,EACA,CAACgB,EAAUvB,CAAQ,CACrB,EAEMwC,MAAmB,gBACtBL,GAAqC,CAChCA,EAAE,OAAO,OAASA,EAAE,OAAO,MAAM,OAAS,GAC5CZ,EAASY,EAAE,OAAO,KAAK,CAE3B,EACA,CAACZ,CAAQ,CACX,EAEMkB,MAAiB,gBAAY,IAAM,CACnCjC,EAAS,SACXA,EAAS,QAAQ,MAAM,CAE3B,EAAG,CAAC,CAAC,EAECkC,MAAgB,gBACpB,CAACC,EAA+C,CAAC,IACxCtB,EAAAC,EAAA,GACFqB,GADE,CAEL,KAAM,OACN,SAAUH,GACV,OAAQG,EAAM,QAAU5C,EACxB,SAAU4C,EAAM,WAAa,OAAYA,EAAM,SAAW3C,EAC1D,IAAKQ,CACP,GAEF,CAACT,EAAQC,EAAUwC,EAAgB,CACrC,EAEA,MAAO,CACLnC,EACA,CACE,SAAAkB,EACA,WAAAO,EACA,WAAAZ,EACA,YAAAe,EACA,gBAAAC,EACA,gBAAAE,EACA,eAAAC,EACA,WAAAC,EACA,iBAAAE,GACA,eAAAC,GACA,cAAAC,EACF,CACF,CACF,EL5XA,IAAAE,GAGO,wBMzBP,IAAAC,GAAiB,oBCOT,IAAAC,GAAA,6BALO,SAARC,GACHC,EACF,CACE,SAEI,SAAC,MAAAC,EAAAC,EAAA,CACG,MAAM,6BACN,SAAS,UACT,SAAS,UACT,eAAe,kBACf,eAAe,qBACf,cAAc,qBACd,QAAQ,kBACR,MAAM,MACN,OAAO,OACHF,GAVP,CAYG,qBAAC,QAAK,KAAK,UAAU,EAAE,kJAAmJ,KAAO,QAAC,WAAQ,KAAK,OAAO,YAAY,OAAO,OAAO,kCAAkC,KAAU,QAAC,QAAK,KAAK,OAAO,SAAS,UAAU,EAAE,u9BACnT,IACJ,CAGR,CClBQ,IAAAG,GAAA,6BALO,SAARC,GACHC,EACF,CACE,SAEI,SAAC,MAAAC,EAAAC,EAAA,CACD,MAAM,6BACN,SAAS,UACT,SAAS,UACT,eAAe,kBACf,eAAe,qBACf,cAAc,qBACd,QAAQ,kBACR,MAAM,MACN,OAAO,OACHF,GAVH,CAWA,qBAAC,QAAK,KAAK,UAAU,EAAE,6IAA8I,KAAO,QAAC,WAAQ,KAAK,OAAO,YAAY,OAAO,OAAO,gCAAgC,KAAU,QAAC,QAAK,KAAK,OAAO,EAAE,iUAAiU,IAAO,CAG1mB,CCZM,IAAAG,GAAA,6BALS,SAARC,GACHC,EACF,CACE,SAEE,SAAC,MAAAC,EAAAC,EAAA,CACD,MAAM,6BACN,SAAS,UACT,SAAS,UACT,eAAe,kBACf,eAAe,qBACf,cAAc,qBACd,QAAQ,kBACR,MAAM,MACN,OAAO,OACHF,GAVH,CAWA,qBAAC,QAAK,KAAK,UAAU,EAAE,gJAAiJ,KAAO,QAAC,WAAQ,KAAK,OAAO,YAAY,OAAO,OAAO,8BAA8B,KAAU,QAAC,QAAK,KAAK,OAAO,SAAS,UAAU,EAAE,oXAAqX,IAAO,CAGhrB,CChBQ,IAAAG,GAAA,6BAJO,SAARC,GACHC,EACF,CACE,SACI,SAAC,MAAAC,EAAAC,EAAA,CACG,MAAM,6BACN,SAAS,UACT,SAAS,UACT,eAAe,kBACf,eAAe,qBACf,cAAc,qBACd,QAAQ,kBACR,MAAM,MACN,OAAO,OACHF,GAVP,CAYG,qBAAC,QAAK,KAAK,UAAU,SAAS,UAAU,EAAE,mJAAmJ,KAC7L,QAAC,WAAQ,KAAK,OAAO,YAAY,OAAO,OAAO,kCAAkC,KACjF,QAAC,QAAK,KAAK,OAAO,SAAS,UAAU,EAAE,2lBAA4lB,IAAO,CAEtpB,CChBK,IAAAG,GAAA,6BAJU,SAARC,GACHC,EACF,CACE,SACC,SAAC,MAAAC,EAAAC,EAAA,CACD,MAAM,6BACN,SAAS,UACT,SAAS,UACT,eAAe,kBACf,eAAe,qBACf,cAAc,qBACd,QAAQ,kBACR,MAAM,MACN,OAAO,OACHF,GAVH,CAWA,qBAAC,QAAK,KAAK,UAAU,EAAE,gJAAiJ,KAAO,QAAC,WAAQ,KAAK,UAAU,YAAY,OAAO,OAAO,8BAA8B,KAAU,QAAC,QAAK,KAAK,UAAU,SAAS,UAAU,EAAE,ukBAAwkB,IAAO,CAEx4B,CCHY,IAAAG,GAAA,6BAdG,SAARC,GACHC,EACF,CACE,SACI,SAAC,MAAAC,EAAAC,EAAA,CACG,MAAM,6BACN,EAAE,MACF,EAAE,MACF,MAAM,MACN,OAAO,MACP,QAAQ,YACR,cAAY,QACRF,GARP,CAUG,sBAAC,kBAAe,GAAG,0CAA0C,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,cAAc,iBACtH,qBAAC,QAAK,OAAO,IAAI,UAAU,UAAU,YAAY,IACjD,KACA,QAAC,QAAK,OAAO,OAAO,UAAU,UAAU,YAAY,KACpD,GACJ,KACA,QAAC,QAAK,KAAK,gDAAgD,EAAE,sCAAsC,aAAC,KACpG,SAAC,kBAAe,GAAG,0CAA0C,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,cAAc,iBACxH,qBAAC,QAAK,OAAO,IAAI,UAAU,UAAU,YAAY,IAAI,KACrD,QAAC,QAAK,OAAO,IAAI,UAAU,UAAU,YAAY,KAAK,GAC1D,KACA,QAAC,QAAK,KAAK,gDAAgD,EAAE,kEAAkE,IACnI,CAIR,CC1BQ,IAAAG,GAAA,6BAJO,SAARC,GACHC,EACF,CACE,SACI,SAAC,MAAAC,EAAAC,EAAA,CACG,MAAM,6BACN,SAAS,UACT,SAAS,UACT,eAAe,kBACf,eAAe,qBACf,cAAc,qBACd,QAAQ,kBACR,MAAM,MACN,OAAO,MACP,cAAY,QACRF,GAXP,CAaG,qBAAC,QAAK,KAAK,UAAU,EAAE,gJAAgJ,KACvK,QAAC,WAAQ,KAAK,OAAO,YAAY,OAAO,OAAO,8BAA8B,KAC7E,QAAC,QAAK,KAAK,OAAO,SAAS,UAAU,EAAE,06BACvC,IACJ,CAER,CChBQ,IAAAG,GAAA,6BALO,SAARC,GACHC,EACF,CACE,SAEI,SAAC,MAAAC,EAAAC,EAAA,CAAI,MAAM,6BACP,SAAS,UACT,SAAS,UACT,eAAe,kBACf,eAAe,qBACf,cAAc,qBACd,QAAQ,iBACR,MAAM,MACN,OAAO,MACP,cAAY,QACRF,GAVP,CAYG,qBAAC,QAAK,KAAK,UAAU,EAAE,8IAA8I,KACrK,QAAC,WAAQ,KAAK,OAAO,YAAY,OAAO,OAAO,gCAAgC,KAC/E,QAAC,QAAK,KAAK,OAAO,SAAS,UAAU,EAAE,m4BAAm4B,IAC96B,CAIR,CCvBQ,IAAAG,GAAA,6BAJO,SAARC,GACHC,EACF,CACE,SACI,SAAC,MAAAC,EAAAC,EAAA,CACG,MAAM,6BACN,SAAS,UACT,SAAS,UACT,eAAe,kBACf,eAAe,qBACf,cAAc,qBACd,QAAQ,kBACR,MAAM,MACN,OAAO,OACHF,GAVP,CAWA,qBAAC,QAAK,KAAK,OAAO,EAAE,gJAAiJ,KAAO,QAAC,WAAQ,KAAK,OAAO,YAAY,OAAO,OAAO,8BAA8B,KAAU,QAAC,QAAK,KAAK,OAAO,SAAS,UAAU,EAAE,ilBACvS,IACJ,CAER,CCNY,IAAAG,EAAA,6BAXG,SAARC,GACHC,EACF,CACE,SACI,QAAC,MAAAC,EAAAC,EAAA,CACG,MAAM,6BACN,QAAQ,YACR,MAAM,MACN,OAAO,OACHF,GALP,CAOG,oBAAC,QAAK,KAAK,UAAU,EAAE,oGAAqG,KAC5H,OAAC,QAAK,KAAK,UAAU,EAAE,oEAAqE,KAC5F,OAAC,QAAK,KAAK,UAAU,EAAE;AAAA,kCACA,KACvB,OAAC,QAAK,KAAK,UAAU,EAAE;AAAA,kCACA,KACvB,OAAC,QAAK,MAAM,KAAK,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,KAAK,UAAW,KAC1D,OAAC,QAAK,KAAK,UAAU,EAAE,uEAAwE,KAC/F,OAAC,QAAK,KAAK,UAAU,EAAE,uEAAwE,KAC/F,OAAC,QAAK,MAAM,KAAK,OAAO,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,UAAW,KAC1D,OAAC,QAAK,KAAK,UAAU,EAAE;AAAA,gCACF,KACrB,OAAC,QAAK,KAAK,UAAU,EAAE,6CAA8C,KACrE,OAAC,QAAK,KAAK,UAAU,EAAE;AAAA,kCACA,KACvB,OAAC,UAAO,GAAG,KAAK,GAAG,KAAK,EAAE,IAAI,KAAK,UAAW,KAC9C,OAAC,UAAO,GAAG,KAAK,GAAG,KAAK,EAAE,IAAI,KAAK,UAAW,KAC9C,OAAC,QAAK,KAAK,UAAU,EAAE,2CAA4C,KACnE,OAAC,QAAK,KAAK,UAAU,EAAE;AAAA,kCACA,KACvB,OAAC,QAAK,KAAK,UAAU,EAAE;AAAA,0DACwB,KAAO,OAAC,QAAK,KAAK,UAAU,EAAE,kTAAmT,KAAO,OAAC,QAAK,KAAK,UAAU,EAAE,qQAAsQ,KAAO,QAAC,KAAE,oBAAC,QAAK,KAAK,UAAU,EAAE;AAAA,0DACtpB,KAC3C,OAAC,QAAK,KAAK,UAAU,EAAE,qQAAsQ,GAAO,IAAI,CAGxT,CCjCQ,IAAAG,GAAA,6BALO,SAARC,GACHC,EACF,CACE,SAEI,SAAC,MAAAC,EAAAC,EAAA,CACG,MAAM,6BACN,QAAQ,YACR,MAAM,MACN,OAAO,OACHF,GALP,CAOG,qBAAC,QAAK,KAAK,UAAU,EAAE;AAAA,wCACM,KAC7B,QAAC,QAAK,KAAK,UAAU,EAAE,m0BAAo0B,IAC/1B,CAGR,CCXQ,IAAAG,GAAA,6BALO,SAARC,GACHC,EACF,CACE,SAEI,SAAC,MAAAC,EAAAC,EAAA,CACG,MAAM,6BACN,SAAS,UACT,SAAS,UACT,eAAe,kBACf,eAAe,qBACf,cAAc,qBACd,QAAQ,kBACR,MAAM,MACN,OAAO,OACHF,GAVP,CAYG,qBAAC,QAAK,KAAK,UAAU,EAAE,6IACvB,KACA,QAAC,WAAQ,KAAK,OAAO,YAAY,OAAO,OAAO,gCAAgC,KAC/E,QAAC,QAAK,KAAK,OAAO,EAAE,wcACpB,IACJ,CAER,CCrBQ,IAAAG,GAAA,6BALO,SAARC,GACHC,EACF,CACE,SAEI,SAAC,MAAAC,EAAAC,EAAA,CACG,MAAM,6BACN,SAAS,UACT,SAAS,UACT,eAAe,kBACf,eAAe,qBACf,cAAc,qBACd,QAAQ,kBACR,MAAM,MACN,OAAO,OACHF,GAVP,CAYG,qBAAC,QAAK,KAAK,UAAU,EAAE,kJAAmJ,KAC1K,QAAC,WAAQ,KAAK,OAAO,YAAY,OAAO,OAAO,kCAAkC,KACjF,QAAC,QAAK,KAAK,OAAO,SAAS,UAAU,EAAE,6WAA8W,IACzZ,CAER,CClBQ,IAAAG,GAAA,6BAJO,SAARC,GACHC,EACF,CACE,SACI,SAAC,MAAAC,EAAAC,EAAA,CACG,MAAM,6BACN,QAAQ,YACR,MAAM,MACN,OAAO,OACHF,GALP,CAOG,qBAAC,QAAK,KAAK,UAAU,EAAE;AAAA,oFACkD,KACzE,QAAC,QAAK,KAAK,UAAU,EAAE;AAAA,kFACgD,KACvE,QAAC,QAAK,MAAM,OAAO,OAAO,OAAO,EAAE,MAAM,EAAE,OAAO,KAAK,UAAW,KAClE,QAAC,QAAK,MAAM,KAAK,OAAO,OAAO,EAAE,MAAM,EAAE,OAAO,KAAK,UAAW,KAChE,QAAC,QAAK,MAAM,OAAO,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,KAAK,UAAW,KAChE,QAAC,QAAK,KAAK,UAAU,EAAE;AAAA,wDACsB,KAC7C,QAAC,QAAK,KAAK,UAAU,EAAE;AAAA,0DACwB,IACnD,CAGR,CCrBQ,IAAAG,GAAA,6BAJO,SAARC,GACHC,EACF,CACE,SACI,SAAC,MAAAC,EAAAC,EAAA,CACG,MAAM,6BACN,QAAQ,YACR,MAAM,MACN,OAAO,OACHF,GALP,CAOG,qBAAC,QAAK,KAAK,UAAU,EAAE;AAAA,oFACkD,KACzE,QAAC,QAAK,KAAK,UAAU,EAAE;AAAA,kFAC+C,KACtE,QAAC,QAAK,KAAK,UAAU,EAAE;AAAA,wDACqB,KAC5C,QAAC,QAAK,KAAK,UAAU,EAAE;AAAA,0DACuB,IAClD,CAER,CCTgB,IAAAG,EAAA,6BAbD,SAARC,GACHC,EACF,CACE,SACI,OAAC,MAAAC,EAAAC,EAAA,CACD,MAAM,6BACN,MAAM,KACN,OAAO,KACP,QAAQ,YACR,cAAY,QACRF,GANH,CAQG,oBAAC,KAAE,KAAK,OACJ,oBAAC,QAAK,EAAE,qmBAAqmB,KAAK,0DAA0D,aAAW,SAAS,KAAK,oDAAoD,KACzvB,OAAC,QAAK,EAAE,qmBAAqmB,KAAK,0DAA0D,aAAW,QAAQ,OAAO,sDAAsD,SAAS,wDAAwD,KAC7zB,OAAC,QAAK,EAAE,wkBAAwkB,KAAK,0DAA0D,aAAW,OAAO,KACjqB,OAAC,QAAK,EAAE,stDAAstD,KAAK,0DAA0D,KAC7xD,QAAC,QACG,qBAAC,kBAAe,GAAG,oDAAoD,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,cAAc,iBAChH,oBAAC,QAAK,UAAU,UAAU,KAC1B,OAAC,QAAK,OAAO,IAAI,UAAU,UAAU,GACzC,KACA,QAAC,kBAAe,GAAG,oDAAoD,GAAG,KAAK,GAAG,OAAO,GAAG,IAAI,GAAG,OAAO,cAAc,iBACpH,oBAAC,QAAK,UAAU,UAAU,YAAY,KAAK,KAC3C,OAAC,QAAK,OAAO,IAAI,UAAU,UAAU,YAAY,KAAK,GAC1D,KACA,QAAC,kBAAe,GAAG,oDAAoD,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,SAAS,cAAc,iBACpH,oBAAC,QAAK,UAAU,OAAO,KACvB,OAAC,QAAK,OAAO,IAAI,UAAU,OAAO,YAAY,IAAI,GACtD,KACA,OAAC,UAAO,GAAG,gDAAgD,EAAE,QAAQ,EAAE,QAAQ,MAAM,OAAO,OAAO,OAAO,YAAY,oBAAoB,eAAe,iBACrJ,mBAAC,kBAAe,aAAa,IAAI,EAAE,KAAK,EAAE,KAAK,MAAM,OAAO,OAAO,OAAO,GAAG,gBAAgB,SAAS,OAAO,OAAO,OAAO,EAC/H,KACA,OAAC,YAAS,GAAG,kDACT,mBAAC,QAAK,EAAE,wkBAAwkB,KAAK,0DAA0D,EACnpB,KACA,QAAC,QAAK,GAAG,8CACL,oBAAC,QAAK,MAAM,OAAO,OAAO,OAAO,KAAK,OAAO,KAC7C,OAAC,QAAK,EAAE,wkBAAwkB,KAAK,OAAO,GAChmB,GACJ,GACJ,GACJ,CAER,CCxCI,IAAAG,GAAA,6BAJW,SAARC,GACLC,EACA,CACA,SACE,SAAC,MAAAC,EAAAC,EAAA,CACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,MAAM,6BACN,cAAY,QACRF,GAPL,CASC,qBAAC,QACC,QAAQ,MACR,EAAE,85BACF,KAAK,UACP,KACA,QAAC,QACC,EAAE,4MACF,KAAK,UACP,IACF,CAEJ,CCbM,IAAAG,GAAA,6BAZS,SAARC,GACLC,EACA,CACA,SACE,QAAC,MAAAC,EAAAC,EAAA,CAAI,MAAM,6BACT,MAAM,KACN,OAAO,KACP,KAAK,eACL,QAAQ,YACR,cAAY,QACRF,GANL,CAQC,oBAAC,QAAK,KAAK,eAAe,EAAE,kSAAkS,GAChU,CAEJ,CCVI,IAAAG,GAAA,6BAJW,SAARC,GACLC,EACA,CACA,SACE,SAAC,MAAAC,EAAAC,EAAA,CACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,MAAM,6BACN,cAAY,QACRF,GAPL,CASC,qBAAC,QACC,KAAK,eACL,QAAQ,MACR,EAAE,iQACJ,KACA,QAAC,QACC,KAAK,eACL,EAAE,kLACJ,IACF,CAEJ,CCrBI,IAAAG,GAAA,6BCAA,IAAAC,GAAA,6BAJW,SAARC,GACLC,EACA,CACA,SACE,SAAC,MAAAC,EAAAC,EAAA,CACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,MAAM,6BACN,cAAY,QACRF,GAPL,CASC,qBAAC,QACC,SAAS,UACT,SAAS,UACT,EAAE,0aACF,KAAK,eACP,KACA,QAAC,QACC,QAAQ,MACR,EAAE,msCACF,KAAK,eACP,IACF,CAEJ,CCbY,IAAAG,GAAA,6BAZG,SAARC,GACHC,EACF,CACE,SACI,QAAC,MAAAC,EAAAC,EAAA,CACG,MAAM,6BACN,QAAQ,YACR,cAAY,QACRF,GAJP,CAQG,oBAAC,QAAK,KAAK,eAAe,EAAE,oFAAoF,GACpH,CAER,CCXQ,IAAAG,GAAA,6BAJO,SAARC,GACHC,EACF,CACE,SACI,SAAC,MAAAC,EAAAC,EAAA,CACD,MAAM,6BACN,MAAM,KACN,OAAO,KACP,QAAQ,aACJF,GALH,CAOG,qBAAC,QAAK,KAAK,eAAe,EAAE,mXAAkX,KAC9Y,QAAC,QAAK,KAAK,eAAe,SAAS,UAAU,EAAE,iRAAiR,SAAS,UAAS,KAClV,QAAC,QAAK,KAAK,eAAe,EAAE,0QAA0Q,QAAQ,MAAK,IACvT,CAGR,CCPY,IAAAG,GAAA,6BATG,SAARC,GACHC,EACF,CACE,SACI,QAAC,MAAAC,EAAAC,EAAA,CACG,MAAM,6BACN,QAAQ,aACJF,GAHP,CAKG,oBAAC,QACG,OAAO,eACP,cAAc,QACd,eAAe,QACf,EAAE,0LACN,GACJ,CAER,CCbQ,IAAAG,GAAA,6BAJO,SAARC,GACHC,EACF,CACE,SACI,SAAC,MAAAC,EAAAC,EAAA,CACD,MAAM,6BACN,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,OAAO,eACP,YAAY,IACZ,cAAc,QACd,eAAe,SACXF,GAVH,CAYG,qBAAC,QAAK,OAAO,OAAO,EAAE,gBAAgB,KAAK,OAAM,KACjD,QAAC,QAAK,EAAE,6CAA6C,KACrD,QAAC,QAAK,EAAE,iBAAiB,KACzB,QAAC,QAAK,EAAE,aAAa,IACzB,CAGR,CClBO,IAAAG,GAAA,6BAJQ,SAARC,GACHC,EACF,CACE,SACG,SAAC,MAAAC,EAAAC,EAAA,CACD,MAAM,6BACN,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,OAAO,eACP,YAAY,IACZ,cAAc,QACd,eAAe,SACXF,GAVH,CAYA,qBAAC,QAAK,OAAO,OAAO,EAAE,gBAAgB,KAAK,OAAM,KACjD,QAAC,QAAK,EAAE,aAAa,KACrB,QAAC,QAAK,EAAE,oDAAoD,KAC5D,QAAC,QAAK,EAAE,qFAAqF,IAC7F,CAER,CCRY,IAAAG,GAAA,6BAfG,SAARC,GACHC,EACF,CACE,SACI,QAAC,MAAAC,EAAAC,EAAA,CACG,MAAM,6BACN,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,OAAO,eACP,cAAc,QACd,eAAe,SACXF,GATP,CAWG,oBAAC,QAAK,KAAK,eAAe,SAAS,UAAU,EAAE,+qCAA+qC,SAAS,UAAU,GACrvC,CAGR,C3B0Ja,IAAAG,GAAA,6BAhJN,SAASC,GAAoBC,EAAkBC,EAA8B,CAElF,GAAI,OAAOD,GAAa,SACtB,eAAQ,KAAK,iDAAkDA,CAAQ,EAChEE,EAAU,KAGnB,IAAIC,EAAgBH,EAGpB,GAAIC,EAAW,CACb,IAAMG,EAAMH,EAAU,YAAY,EAAE,QAAQ,MAAO,EAAE,EAC/CI,EAAe,GAAAC,QAAK,QAAQF,CAAG,EACjCC,IACFF,EAAgBE,EAEpB,CAGA,OAAIF,EAAc,WAAW,QAAQ,EAC5BD,EAAU,MAGfC,EAAc,WAAW,QAAQ,EAC5BD,EAAU,MAGfC,EAAc,WAAW,QAAQ,EAC5BD,EAAU,MAIZA,EAAU,IACnB,CASO,SAASK,GAAYP,EAAkBC,EAA4B,CACxE,IAAIE,EAAgBH,EAGpB,GAAIC,EAAW,CACb,IAAMG,EAAMH,EAAU,YAAY,EAAE,QAAQ,MAAO,EAAE,EAC/CI,EAAe,GAAAC,QAAK,QAAQF,CAAG,EACjCC,IACFF,EAAgBE,EAEpB,CAGA,GAAIF,EAAc,WAAW,QAAQ,EACnC,MAAO,QAGT,GAAIA,EAAc,WAAW,QAAQ,EACnC,MAAO,QAGT,GAAIA,EAAc,WAAW,QAAQ,EACnC,MAAO,QAIT,OAAQA,EAAe,CACrB,IAAK,kBACH,MAAO,MAET,IAAK,mBACH,MAAO,OAGT,IAAK,kBACL,IAAK,+BACH,MAAO,MAET,IAAK,+BACL,IAAK,sBACH,MAAO,MAGT,IAAK,2BACL,IAAK,2BACH,MAAO,MAGT,IAAK,oEACL,IAAK,2BACL,IAAK,WACH,MAAO,QAGT,IAAK,4EACL,IAAK,gCACH,MAAO,aAGT,IAAK,0EACL,IAAK,qBACH,MAAO,UACX,CAGA,GAAIA,EAAc,WAAW,OAAO,EAClC,MAAO,MAIT,GAAIF,EAGF,OAFYA,EAAU,YAAY,EAAE,QAAQ,MAAO,EAAE,EAExC,CACX,IAAK,MACL,IAAK,MACH,MAAO,MACT,IAAK,MACH,MAAO,MACT,IAAK,MACH,MAAO,MACT,IAAK,MACH,MAAO,MACT,IAAK,MACH,MAAO,OACX,CAIF,MAAO,MACT,CASO,IAAMO,GAASC,GAAwE,CAAxE,IAAAC,EAAAD,EAAE,MAAAE,EAAM,UAAAC,CA5K9B,EA4KsBF,EAAsBG,EAAAC,EAAtBJ,EAAsB,CAApB,OAAM,cAC5B,OAAQC,EAAM,CACZ,IAAK,oBACH,SAAO,QAACI,GAAAC,EAAA,CAAoB,UAAWJ,GAAeC,EAAO,EAC/D,IAAK,SACH,SAAO,QAACI,GAAAD,EAAA,CAAgB,UAAWJ,GAAeC,EAAO,EAC3D,IAAK,QACH,SAAO,QAACK,GAAAF,EAAA,CAAU,UAAWJ,GAAeC,EAAO,EACrD,IAAK,QACH,SAAO,QAACM,GAAAH,EAAA,CAAU,UAAWJ,GAAeC,EAAO,EACrD,IAAK,QACH,SAAO,QAACO,GAAAJ,EAAA,CAAU,UAAWJ,GAAeC,EAAO,EACrD,IAAK,MACH,SAAO,QAACQ,GAAAL,EAAA,CAAQ,UAAWJ,GAAeC,EAAO,EACnD,IAAK,QACL,IAAK,OACH,SAAO,QAACS,GAAAN,EAAA,CAAU,UAAWJ,GAAeC,EAAO,EACrD,IAAK,aACL,IAAK,OACH,SAAO,QAACU,GAAAP,EAAA,CAAQ,UAAWJ,GAAeC,EAAO,EACnD,IAAK,WACL,IAAK,OACL,IAAK,MACH,SAAO,QAACW,GAAAR,EAAA,CAAQ,UAAWJ,GAAeC,EAAO,EACnD,IAAK,MACH,SAAO,QAACY,GAAAT,EAAA,CAAY,UAAWJ,GAAeC,EAAO,EACvD,IAAK,OACH,SAAO,QAACa,GAAAV,EAAA,CAAS,UAAWJ,GAAeC,EAAO,EACpD,IAAK,MACH,SAAO,QAACc,GAAAX,EAAA,CAAQ,UAAWJ,GAAeC,EAAO,EACnD,IAAK,MACH,SAAO,QAACe,GAAAZ,EAAA,CAAQ,UAAWJ,GAAeC,EAAO,EACnD,IAAK,MACH,SAAO,QAACgB,GAAAb,EAAA,CAAQ,UAAWJ,GAAeC,EAAO,EACnD,QACE,SAAO,QAACiB,GAAAd,EAAA,CAAS,UAAWJ,GAAeC,EAAO,CACtD,CACF,EAOO,SAASkB,GAAkBC,EAAgC,CAChE,GAAI,CAACA,GAAaA,EAAU,SAAW,EACrC,MAAO,MAGT,IAAMC,EAAsB,CAAC,EAE7B,QAAWC,KAAYF,EACrB,OAAQE,EAAU,CAChB,KAAKhC,EAAU,MACb+B,EAAU,KAAK,SAAS,EACxB,MACF,KAAK/B,EAAU,MACb+B,EAAU,KAAK,SAAS,EACxB,MACF,KAAK/B,EAAU,MACb+B,EAAU,KAAK,SAAS,EACxB,MACF,KAAK/B,EAAU,KAEb+B,EAAU,KACR,gBACA,QACF,EACA,KACJ,CAGF,OAAOA,EAAU,KAAK,GAAG,CAC3B,CAOO,SAASE,GAAwBH,EAAgC,CACtE,GAAI,CAACA,GAAaA,EAAU,SAAW,EACrC,MAAO,YAGT,IAAMI,EAAyB,CAAC,EAEhC,QAAWF,KAAYF,EACrB,OAAQE,EAAU,CAChB,KAAKhC,EAAU,MACbkC,EAAa,KAAK,QAAQ,EAC1B,MACF,KAAKlC,EAAU,MACbkC,EAAa,KAAK,QAAQ,EAC1B,MACF,KAAKlC,EAAU,MACbkC,EAAa,KAAK,OAAO,EACzB,MACF,KAAKlC,EAAU,KACbkC,EAAa,KAAK,OAAO,EACzB,KACJ,CAGF,OAAOA,EAAa,KAAK,IAAI,CAC/B,C4BjRQ,IAAAC,GAAA,6BAJO,SAARC,GACHC,EACF,CACE,SACI,SAAC,MAAAC,EAAAC,EAAA,CACG,MAAM,6BACN,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,MAAM,gBACFF,GAPP,CASG,qBAAC,QAAK,EAAE,64BAA64B,KAAK,eAAe,SAAS,UACl7B,KACA,QAAC,QAAK,EAAE,u/BAAu/B,KAAK,eACpgC,IACJ,CAER,CChBA,IAAAG,GAAyB,iBAmBbC,GAAA,6BAPL,SAASC,GAAU,CAAE,KAAAC,CAAK,EAAmB,CAfpD,IAAAC,EAgBI,GAAM,CAACC,EAAUC,CAAW,KAAI,aAAS,EAAK,EAExCC,EAAWJ,EAAK,YAAcA,EAAK,IAEzC,OAAII,GAAY,CAACF,KAET,QAAC,OACG,IAAKE,EACL,MAAKH,EAAAD,GAAA,YAAAA,EAAM,OAAN,YAAAC,EAAY,UAAU,EAAG,MAAO,QACrC,UAAU,yDACV,QAAS,IAAME,EAAY,EAAI,EACnC,KAGD,QAACE,GAAA,EAAU,CACtB,CAMO,SAASC,GAAkB,CAAE,KAAAN,CAAK,EAA2B,CAChE,OAAKA,EAAK,WAEN,SAAC,KAAE,UAAU,0CACR,UAAAA,EAAK,OAAO,MAAIA,EAAK,OAC1B,EAJsB,IAM9B,CC1CA,IAAAO,GAAqB,wBACrBC,GAAyB,iBAsBbC,GAAA,6BANL,SAASC,GAAU,CAAE,KAAAC,EAAM,UAAAC,CAAU,EAAmB,CAC3D,GAAM,CAACC,EAAUC,CAAW,KAAI,aAAS,EAAK,EAG9C,OAAIH,EAAK,YAAc,CAACE,KAEhB,SAAC,OAAI,UAAU,yBACX,qBAAC,OACG,IAAKF,EAAK,WACV,UAAU,0CACV,IAAKA,EAAK,KACV,QAAS,IAAMG,EAAY,EAAI,EACnC,KACA,QAAC,OAAI,UAAU,wEACX,oBAAC,OAAI,UAAU,gDACX,oBAAC,SAAK,UAAU,+BAA+B,EACnD,EACJ,GACJ,EAKJH,EAAK,KAAO,CAACE,KAET,SAAC,OAAI,UAAU,yBAEX,qBAAC,SACG,IAAKF,EAAK,IACV,UAAU,0CACV,QAAQ,WACR,QAAS,IAAMG,EAAY,EAAI,EACnC,KAEA,QAAC,OAAI,UAAU,wEACX,oBAAC,OAAI,UAAU,gDACX,oBAAC,SAAK,UAAU,+BAA+B,EACnD,EACJ,GACJ,KAMJ,QAAC,OAAI,UAAU,gEACX,oBAAC,OAAI,UAAU,cACX,oBAAC,OAAI,UAAU,WACX,oBAACC,GAAA,CAAM,KAAK,QAAQ,UAAWH,EAAW,EAC9C,EACJ,EACJ,CAER,CAMO,SAASI,GAAkB,CAAE,KAAAL,CAAK,EAA2B,CA9EpE,IAAAM,EA+EI,OAAKA,EAAAN,EAAK,WAAL,MAAAM,EAAe,YAGhB,SAAC,KAAE,UAAU,6BAA6B,uBAC3B,KAAK,MAAMN,EAAK,SAAS,SAAW,EAAE,EAAE,KACjDA,EAAK,SAAS,SAAW,IAAI,SAAS,EAAE,SAAS,EAAG,GAAG,GAC7D,EANiC,IAQzC,CCnEoB,IAAAO,GAAA,6BALb,SAASC,GAAU,CAAE,KAAAC,EAAM,UAAAC,CAAU,EAAmB,CAC3D,SACI,QAAC,OAAI,UAAU,gEACX,oBAAC,OAAI,UAAU,cACX,oBAAC,OAAI,UAAU,WACX,oBAACC,GAAA,CAAM,KAAK,QAAQ,UAAWD,EAAW,EAC9C,EACJ,EACJ,CAER,CAMO,SAASE,GAAkB,CAAE,KAAAH,CAAK,EAA2B,CA/BpE,IAAAI,EAgCI,OAAKA,EAAAJ,EAAK,WAAL,MAAAI,EAAe,YAGhB,SAAC,KAAE,UAAU,6BAA6B,uBAC3B,KAAK,MAAMJ,EAAK,SAAS,SAAW,EAAE,EAAE,KACjDA,EAAK,SAAS,SAAW,IAAI,SAAS,EAAE,SAAS,EAAG,GAAG,GAC7D,EANiC,IAQzC,CClBgB,IAAAK,GAAA,6BAPT,SAASC,GAAa,CAAE,KAAAC,EAAM,UAAAC,CAAU,EAAsB,CAEjE,IAAMC,EAAWC,GAAYH,EAAK,KAAMA,EAAK,GAAG,EAEhD,SACI,QAAC,OAAI,UAAU,yEACV,SAAAA,EAAK,cACF,QAAC,OACG,IAAKA,EAAK,WACV,IAAKA,EAAK,KACV,UAAU,yDACd,KAEA,QAAC,OAAI,UAAU,cACX,oBAAC,OAAI,UAAU,WACX,oBAACI,GAAA,CAAM,KAAMF,EAAU,UAAWD,EAAW,EACjD,EACJ,EAER,CAER,CAMO,SAASI,GAAqB,CAAE,KAAAL,CAAK,EAA2B,CA1CvE,IAAAM,EA2CI,OAAKA,EAAAN,EAAK,WAAL,MAAAM,EAAe,aAEhB,SAAC,KAAE,UAAU,6BAA6B,oBAC9BN,EAAK,SAAS,WAC1B,EAJkC,IAM1C,CCxCW,IAAAO,GAAA,6BAFJ,SAASC,GAAY,CAAE,KAAAC,CAAK,EAAqB,CACpD,IAAMC,EAAWC,GAAYF,EAAK,KAAMA,EAAK,GAAG,EAChD,SAAO,QAACG,GAAA,CAAM,KAAMF,EAAU,CAClC,CCMO,IAAMG,GAA+D,CACxE,OAAQ,CACJ,UAAWC,GACX,kBAAmBC,EACvB,EACA,OAAQ,CACJ,UAAWC,GACX,kBAAmBC,EACvB,EACA,MAAO,CACH,UAAWC,GACX,kBAAmBC,EACvB,EACA,OAAQ,CACJ,UAAWC,GACX,kBAAmBC,EACvB,EACA,QAAS,CACL,UAAWC,EACf,CACJ,EAGO,SAASC,GAAkBC,EAAoB,CAElD,IAAMC,EAAOC,GAAoBF,EAAK,KAAMA,EAAK,GAAG,EACpD,OAAOX,GAAwBY,CAAI,GAAKZ,GAAwB,OACpE,CCvCI,IAAAc,GAAA,6BAFJ,SAASC,GAAIC,EAAsD,CAAtD,IAAAC,EAAAD,EAAE,WAAAE,CAFf,EAEaD,EAAgBE,EAAAC,EAAhBH,EAAgB,CAAd,cACb,SACE,QAAC,MAAAI,EAAA,CACC,YAAU,MACV,UAAWC,EACT,+KACA,uCACA,yJACAJ,CACF,GACIC,EACN,CAEJ,CAEA,SAASI,GAASP,EAAsD,CAAtD,IAAAC,EAAAD,EAAE,WAAAE,CAjBpB,EAiBkBD,EAAgBE,EAAAC,EAAhBH,EAAgB,CAAd,cAClB,SAAO,QAAC,MAAAI,EAAA,CAAI,YAAU,YAAY,UAAWC,EAAG,iCAAkCJ,CAAS,GAAOC,EAAO,CAC3G,CzCsIW,IAAAK,EAAA,6BArHJ,SAASC,IAAc,CAC5B,GAAM,CACJ,kBAAAC,EACA,qBAAAC,EACA,YAAAC,EACA,iBAAAC,EACA,eAAAC,EACA,cAAAC,CACF,EAAIC,EAAe,EAGbC,EAAeC,GAAkBL,CAAgB,EACjDM,EAAuBC,GAAwBP,CAAgB,EAG/D,CAACQ,EAAaC,CAAc,KAAI,aAA2B,CAAC,CAAC,EAE7D,CACJ,CAAE,WAAAC,EAAY,OAAAC,CAAO,EACrB,CACE,WAAAC,EACA,WAAAC,EACA,gBAAAC,EACA,gBAAAC,EACA,eAAAC,EACA,WAAAC,EACA,eAAAC,EACA,cAAAC,CACF,CACF,EAAIC,GAAc,CAChB,SAAUnB,EACV,QAASC,EACT,OAAQE,EACR,SAAU,GACV,cAAgBiB,GAAa,CAE3B,IAAMC,EAAiBD,EAAS,IAAKE,GAAS,CAE5C,IAAMC,EAAehB,EAAY,KAAMiB,IAAaA,GAAS,KAAOF,EAAK,EAAE,EAE3E,OAAIC,EAEKE,IAAA,GACFF,GACAD,GAIEI,EAAAD,EAAA,GACFH,GADE,CAEL,SAAU,IACV,OAAQ,WACV,EAEJ,CAAC,EAEDd,EAAea,CAAc,CAC/B,CACF,CAAC,EAIKM,EAAoBC,GAAqB,CAC7CjB,EAAWiB,CAAM,CACnB,EAEMC,EAAeD,GAAqB,CACxCpB,EAAgBsB,GACdA,EAAK,IAAKR,GACRA,EAAK,KAAOM,EAASF,EAAAD,EAAA,GAAKH,GAAL,CAAW,SAAU,EAAG,OAAQ,YAAsB,MAAO,MAAU,GAAIA,CAClG,CACF,CACF,EAEMS,EAAe,IAAM,CAEzB,IAAMC,EAAiBzB,EAAY,OAAQ0B,GAASA,EAAK,SAAW,WAAW,EAE/E,GAAID,EAAe,OAAS,EAAG,CAE7B,IAAME,EAAgCF,EAAe,IAAKC,IAAU,CAClE,KAAMA,EAAK,KAAK,KAChB,KAAMA,EAAK,KAAK,KAChB,KAAME,GAAoBF,EAAK,KAAK,KAAMA,EAAK,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,EACzE,aAAcA,EAAK,gBAAgB,KAAOA,EAAK,KAAK,aAAe,KAAK,IAAI,EAC5E,KAAMA,EAAK,KACX,SAAU,CAAC,CACb,EAAE,EAEFnC,EAAYoC,CAAU,EACtBE,GAAY,CACd,CACF,EAEMA,GAAc,IAAM,CACxBvC,EAAqB,EAAK,EAC1Be,EAAW,EACXJ,EAAe,CAAC,CAAC,CACnB,EAEM6B,GAA0B,CAACf,EAAYgB,IAAqB,CAEhE,IAAMC,EAAiC,CACrC,GAAI,OACJ,KAAMjB,EAAK,KACX,KAAMA,EAAK,KACX,KAAMA,EAAK,KACX,IAAKA,EAAK,KAAK,MAAM,GAAG,EAAE,IAAI,GAAK,GACnC,IAAKgB,GAAW,GAChB,UAAW,IAAI,KAAKhB,EAAK,YAAY,EACrC,UAAW,IAAI,KAAKA,EAAK,YAAY,EACrC,SAAU,KACV,SAAU,CAAC,CACb,EAGM,CAAE,UAAWkB,CAAqB,EAAIC,GAAkBF,CAAgB,EAC9E,SAAO,OAACC,EAAA,CAAqB,KAAMD,EAAkB,SAAUA,EAAiB,SAAU,CAC5F,EAEMG,GAAiBnC,EAAY,OAAQ0B,GAASA,EAAK,SAAW,WAAW,EAAE,OAC3EU,EAAiBpC,EAAY,OAAQ0B,GAASA,EAAK,SAAW,WAAW,EAAE,OAC3EW,EAAYF,GAAiB,GAAKC,IAAmB,EAE3D,SACE,OAACE,GAAA,CAAO,KAAMjD,EAAmB,aAAcC,EAC7C,oBAACiD,GAAA,CAAc,UAAU,2CAA2C,QAAQ,UAAU,gBAAiB,GACrG,qBAACC,GAAA,CAAa,UAAU,uCACtB,oBAACC,GAAA,CAAY,UAAU,iBACrB,oBAAC,OAAI,UAAU,iDACb,qBAAC,QAAK,4BAEJ,OAACC,GAAA,CAAS,UAAU,OAClB,oBAACC,GAAA,CAAI,oBAAC,QAAK,UAAU,UAAU,kBAAC,EAAO,QAAI,EAC7C,GACF,KACA,QAACC,EAAA,CACC,QAAQ,UACR,KAAK,OACL,OAAO,OACP,QAAS,IAAMtD,EAAqB,EAAK,EACzC,UAAU,mFAEV,oBAACuD,GAAA,CAAU,UAAU,SAAS,KAC9B,OAAC,QAAK,UAAU,SAAS,iBAAK,GAChC,GACF,EACF,KACA,OAACC,GAAA,EAAkB,GACrB,KAEA,QAAC,OAAI,UAAU,6BAEb,qBAAC,OACC,UAAWC,EACT,8HACA7C,EACI,8BACA,6DACN,EACA,YAAaI,EACb,YAAaC,EACb,WAAYC,EACZ,OAAQC,EAER,oBAAC,QAAAU,EAAAD,EAAA,GAAUP,EAAc,GAAxB,CAA2B,UAAU,WAAU,KAEhD,QAAC,OAAI,UAAU,6BACb,oBAAC,OACC,UAAWoC,EACT,4EACA7C,EAAa,+BAAiC,4BAChD,EAEA,mBAAC8C,GAAA,CAAgB,UAAU,wCAAwC,EACrE,KAEA,QAAC,OAAI,UAAU,YACb,qBAAC,KAAE,UAAU,sBAAsB,+BACd,OACnB,OAAC,UACC,KAAK,SACL,QAAStC,EACT,UAAU,iEACX,wBAED,GACF,KACA,QAAC,KAAE,UAAU,gCACV,UAAAZ,EAAqB,qBAAcmD,GAAYvD,CAAa,EAAE,sBAAeD,GAChF,GACF,GACF,GACF,EAGCO,EAAY,OAAS,MACpB,OAAC,OAAI,UAAU,YAEb,mBAAC,OAAI,UAAU,uDACZ,SAAAA,EAAY,IAAKkD,MAChB,QAAC,OAAsB,UAAU,iBAE/B,oBAACN,EAAA,CACC,QAAS,IAAMxB,EAAiB8B,EAAS,EAAE,EAC3C,QAAQ,UACR,KAAK,OACL,UAAU,uGAEV,mBAACL,GAAA,CAAU,UAAU,SAAS,EAChC,KAGA,QAAC,OAAI,UAAU,uEAEb,oBAAC,OAAI,UAAU,yDACb,mBAAC,OAAI,UAAU,8CACb,mBAAC,OAAI,UAAU,mDACZ,SAAAK,EAAS,SAAW,eACnB,QAAC,OAAI,UAAU,0DACb,qBAAC,OAAI,UAAU,8BAA8B,QAAQ,YACnD,oBAAC,UACC,GAAG,KACH,GAAG,KACH,EAAE,KACF,KAAK,OACL,OAAO,eACP,YAAY,IACZ,UAAU,2BACZ,KACA,OAAC,UACC,GAAG,KACH,GAAG,KACH,EAAE,KACF,KAAK,OACL,OAAO,eACP,YAAY,IACZ,gBAAiB,GAAG,EAAI,KAAK,GAAK,EAAE,GACpC,iBAAkB,GAAG,EAAI,KAAK,GAAK,IAAM,EAAIA,EAAS,SAAW,IAAI,GACrE,UAAU,2CACV,cAAc,QAChB,GACF,EACCA,EAAS,gBAAgB,MAAQpB,GAAwBoB,EAAS,KAAMA,EAAS,OAAO,GAC3F,EAEAA,EAAS,gBAAgB,MAAQpB,GAAwBoB,EAAS,KAAMA,EAAS,OAAO,EAE5F,EACF,EACF,KAGA,OAAC,OAAI,UAAU,MACb,oBAAC,OAAI,UAAU,YACb,oBAAC,KAAE,UAAU,+BAAgC,SAAAA,EAAS,KAAK,KAAK,KAChE,QAAC,OAAI,UAAU,mDACb,oBAAC,QAAK,UAAU,uDAAwD,SAAAD,GAAYC,EAAS,KAAK,IAAI,EAAE,EAEvGA,EAAS,SAAW,SAAWA,EAAS,UACvC,QAACC,GAAA,CACC,oBAACC,GAAA,CAAe,QAAO,GACrB,mBAACR,EAAA,CACC,QAAS,IAAMtB,EAAY4B,EAAS,EAAE,EACtC,QAAQ,QACR,KAAK,OACL,UAAU,kGAEV,mBAAC,kBAAc,UAAU,qBAAqB,EAChD,EACF,KACA,OAACG,GAAA,CAAe,gCAAoB,GACtC,GAEJ,GACF,EACF,GACF,IA5EQH,EAAS,EA6EnB,CACD,EACH,EACF,EAID/C,EAAO,OAAS,MACf,QAACmD,GAAA,CAAM,QAAQ,cAAc,WAAW,QAAQ,UAAU,OACxD,oBAACC,GAAA,CACC,mBAAC,mBAAc,EACjB,KACA,QAACC,GAAA,CACC,oBAACC,GAAA,CAAW,gCAAoB,KAChC,OAACC,GAAA,CACE,SAAAvD,EAAO,IAAI,CAACwD,EAAOC,OAClB,OAAC,KAAc,UAAU,YACtB,SAAAD,GADKC,CAER,CACD,EACH,GACF,GACF,GAEJ,KAEA,QAACC,GAAA,CAAa,UAAU,qHACtB,oBAACC,GAAA,CAAY,QAAO,GAClB,mBAAClB,EAAA,CAAO,KAAK,SAAS,OAAO,OAAO,QAAQ,UAAU,QAASf,GAAa,UAAU,mBAAmB,kBAEzG,EACF,KACA,QAACe,EAAA,CAAO,KAAK,SAAS,OAAO,OAAO,QAASpB,EAAc,SAAU,CAACa,EAAW,UAAU,mBAAmB,oBACpGF,GAAiB,GAAK,IAAIA,EAAc,KAClD,GACF,GACF,EACF,CAEJ,C0CjWA,IAAA4B,GAAoC,iBCEpC,IAAAC,GAAuC,oCAkI9B,IAAAC,GAAA,6BA/HHC,MAAgB,QACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA,CACE,SAAU,CACR,QAAS,CACP,GAAI,mDACJ,GAAI,kDACJ,GAAI,uDACN,CACF,EACA,gBAAiB,CACf,QAAS,IACX,CACF,CACF,EAEMC,MAAqB,QACzB,4KACA,CACE,SAAU,CACR,QAAS,CACP,GAAI,6EACJ,GAAI,2EACJ,GAAI,4EACN,EACA,KAAM,CACJ,QAAS,GACT,KAAM,qBACR,CACF,EACA,gBAAiB,CACf,QAAS,KACT,KAAM,SACR,CACF,CACF,EAEMC,MAAqB,QACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAoBA,CACE,SAAU,CAAC,EACX,gBAAiB,CAAC,CACpB,CACF,EAEMC,MAAuB,QAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAkCA,CACE,SAAU,CACR,QAAS,CACP,GAAI,gDACJ,GAAI,6CACJ,GAAI,4CACN,CACF,EACA,gBAAiB,CACf,QAAS,IACX,CACF,CACF,EAEA,SAASC,GAAMC,EAKwD,CALxD,IAAAC,EAAAD,EACb,WAAAE,EACA,KAAAC,EACA,QAAAC,CAjIF,EA8HeH,EAIVI,EAAAC,EAJUL,EAIV,CAHH,YACA,OACA,YAGA,SAAO,QAAC,QAAAM,EAAA,CAAM,YAAU,QAAQ,KAAMJ,EAAM,UAAWK,EAAGb,GAAc,CAAE,QAAAS,CAAQ,CAAC,EAAGF,CAAS,GAAOG,EAAO,CAC/G,CDrDkB,IAAAI,GAAA,6BAjEX,SAASC,IAAoB,CAClC,GAAM,CACJ,wBAAAC,EACA,2BAAAC,EACA,wBAAAC,EACA,2BAAAC,EACA,aAAAC,EACA,aAAAC,EACA,eAAAC,EACA,kBAAAC,CACF,EAAIC,EAAe,EAEb,CAACC,EAAYC,CAAa,KAAI,aAAS,EAAE,EAGzCC,EAAeT,EACfU,EAASZ,GAA2BE,KAG1C,cAAU,IAAM,CACVA,GAA2BI,EAC7BI,EAAcJ,EAAe,IAAI,EACvBN,GACVU,EAAc,EAAE,CAEpB,EAAG,CAACR,EAAyBF,EAAyBM,CAAc,CAAC,EAErE,IAAMO,EAAe,SAAY,CAC/B,GAAIJ,EAAW,KAAK,IAAM,GAAI,CAC5B,GAAIE,GAAgBL,EAAgB,CAClC,IAAMQ,EAAWR,EAAe,GAC5BQ,IAAa,MACf,MAAMT,EAAaS,EAAUL,EAAW,KAAK,CAAC,EAEhDN,EAA2B,EAAK,EAChCI,EAAkB,IAAI,CACxB,MACEH,EAAaK,EAAW,KAAK,CAAC,EAC9BR,EAA2B,EAAK,EAElCS,EAAc,EAAE,CAClB,CACF,EAEMK,EAAc,IAAM,CACpBJ,GACFR,EAA2B,EAAK,EAChCI,EAAkB,IAAI,GAEtBN,EAA2B,EAAK,EAElCS,EAAc,EAAE,CAClB,EAEA,OAAKE,KAGH,QAACI,GAAA,CAAO,KAAMJ,EAAQ,aAAcG,EAClC,qBAACE,GAAA,CAAc,UAAU,2DAA2D,QAAQ,aAAa,gBAAiB,GACxH,qBAACC,GAAA,CAAa,UAAU,mEACtB,oBAACC,GAAA,CAAY,UAAU,iBACrB,qBAAC,OAAI,UAAU,iDACb,sBAAC,QAAM,UAAAR,EAAe,gBAAkB,oBAErC,CAACA,MAAgB,QAAC,QAAK,UAAU,OAAO,oBAACS,GAAA,CACxC,qBAACC,GAAA,CAAI,qBAAC,QAAK,UAAU,UAAU,kBAAC,EAAO,QAAI,EAC7C,EAAW,GACb,KAEA,SAACC,EAAA,CACC,QAAQ,UACR,KAAK,OACL,OAAO,OACP,QAASP,EACT,UAAU,mFAEV,qBAACQ,GAAA,CAAU,UAAU,SAAS,KAC9B,QAAC,QAAK,UAAU,SAAS,iBAAK,GAChC,GACF,EACF,EACF,KACA,SAAC,OAAI,UAAU,MACb,qBAAC,SAAM,QAAQ,cAAc,UAAU,cAAc,wBAAY,KACjE,QAACC,GAAA,CACC,GAAG,cACH,KAAK,cACL,MAAOf,EACP,SAAWgB,GAAMf,EAAce,EAAE,OAAO,KAAK,EAC7C,YAAY,oBACZ,UAAS,GACT,UAAYA,GAAM,CACZA,EAAE,MAAQ,SAAWhB,EAAW,KAAK,IAAM,IAC7CI,EAAa,CAEjB,EACF,GACF,KACA,SAACa,GAAA,CAAa,UAAU,qHACtB,qBAACC,GAAA,CAAY,QAAO,GAClB,oBAACL,EAAA,CAAO,KAAK,SAAS,QAAQ,UAAU,QAASP,EAAa,OAAO,OAAO,UAAU,mBAAmB,kBAEzG,EACF,KACA,QAACO,EAAA,CACC,KAAK,SACL,SAAUb,EAAW,KAAK,IAAM,GAChC,QAASI,EAAc,OAAO,OAAO,UAAU,mBAC9C,SAAAF,EAAe,SAAW,SAC7B,GACF,GACF,EACF,EA1DkB,IA4DtB,CE/HA,IAAAiB,GAAoC,iBAapC,IAAAC,GAAsC,wBCS/B,SAASC,GAAeC,EAAcC,EAAoB,GAAY,CAC3E,GAAID,EAAK,QAAUC,EAAW,OAAOD,EACrC,IAAME,EAAQF,EAAK,MAAM,EAAG,KAAK,KAAKC,EAAY,CAAC,CAAC,EAC9CE,EAAMH,EAAK,MAAM,CAAC,KAAK,MAAMC,EAAY,CAAC,CAAC,EACjD,MAAO,GAAGC,CAAK,MAAMC,CAAG,EAC1B,CC7BA,IAAAC,GAA4C,iBAQrC,SAASC,GAAwB,CACtC,UAAAC,EAAY,EACZ,KAAAC,EAAO,KACP,WAAAC,EAAa,IACf,EAAkC,CAAC,EAAG,CACpC,GAAM,CAACC,EAAOC,CAAQ,KAAI,aAAoC,EACxD,CAACC,EAAMC,CAAO,KAAI,aAAyB,IAAI,EAE/CC,KAAW,WAAoC,IAAI,EAEzD,uBAAU,KACJA,EAAS,SACXA,EAAS,QAAQ,WAAW,EAG1BF,GACE,OAAO,QAAW,aAAe,yBAA0B,SAC7DE,EAAS,QAAU,IAAI,qBACrB,CAAC,CAACC,CAAQ,IAAM,CACdJ,EAASI,CAAQ,CACnB,EACA,CAAE,UAAAR,EAAW,KAAAC,EAAM,WAAAC,CAAW,CAChC,EAEAK,EAAS,QAAQ,QAAQF,CAAI,GAI1B,IAAM,CACPE,EAAS,SACXA,EAAS,QAAQ,WAAW,CAEhC,GACC,CAACF,EAAML,EAAWC,EAAMC,CAAU,CAAC,EAE/B,CAAE,IAAKI,EAAS,MAAAH,CAAM,CAC/B,CFsDY,IAAAM,EAAA,6BAnEZ,SAASC,GAAe,CACtB,OAAAC,EACA,iBAAAC,EACA,SAAAC,EACA,eAAAC,EACA,kBAAAC,EAAoB,CAAC,EACrB,UAAAC,CACF,EAOG,CA7CH,IAAAC,EA8CE,GAAM,CAACC,EAAQC,CAAS,KAAI,aAAS,EAAK,EACpCC,IAAeH,EAAAN,EAAO,cAAP,KAAAM,EAAsB,GAAK,EAC1CI,EAAaT,IAAqBD,EAAO,GACzCW,EAAaP,EAAkB,SAASJ,EAAO,EAAE,EACjDY,EAAYP,EAAU,QAAQ,IAAIL,EAAO,EAAE,EAC3Ca,EAAWR,EAAU,OAAO,IAAIL,EAAO,EAAE,EACzCc,EAAWT,EAAU,QAAQ,IAAIL,EAAO,EAAE,GAAK,CAAC,EAChDe,EAAaV,EAAU,WAAW,IAAIL,EAAO,EAAE,EAG/C,CAAE,IAAKgB,EAAa,MAAAC,CAAM,EAAIC,GAAwB,CAC1D,UAAW,GACX,WAAY,OACd,CAAC,EAEKC,EAAUJ,GAAcA,EAAW,YAAcA,EAAW,WAElE,uBAAU,IAAM,CACd,GAAIR,IAAUU,GAAA,MAAAA,EAAO,iBAAkBE,GAAW,CAACP,EAAW,CAC5D,IAAMQ,IAAYL,GAAA,YAAAA,EAAY,cAAe,GAAK,EAClDZ,EAAeH,EAAO,GAAIoB,CAAQ,CACpC,CACF,EAAG,CAACH,GAAA,YAAAA,EAAO,eAAgBE,EAASP,EAAWL,EAAQQ,EAAYf,EAAO,GAAIG,CAAc,CAAC,KAsB3F,QAAC,MACC,qBAAC,OAAI,UAAU,iCACZ,UAAAM,KACC,OAAC,UACC,QAvBW,SAAY,CAC/B,GAAI,CAACA,EAAa,OAElB,IAAMY,EAAY,CAACd,EACnBC,EAAUa,CAAS,EAGfA,GAAa,CAACR,GAAY,CAACD,GAC7B,MAAMT,EAAeH,EAAO,GAAI,CAAC,CAErC,EAcU,UAAU,uDACV,aAAYO,EAAS,kBAAoB,gBAEzC,mBAAC,iBACC,UAAW,6CAA6C,CAACI,GAAcJ,EAAS,YAAc,EAAE,GAClG,EACF,KAEA,OAAC,OAAI,UAAU,MAAM,KAGvB,QAAC,UACC,QAxBa,IAAM,CACpBI,GACHT,EAASF,EAAO,EAAE,CAEtB,EAqBQ,SAAUW,EACV,MAAOX,EAAO,KACd,UAAW,6FAA6FU,EAClG,0CACAC,EACE,gCACA,mBACN,GAEF,oBAACW,GAAA,CAAW,UAAU,6BAA6B,YAAa,IAAK,KACrE,QAAC,OAAI,UAAU,sBACb,oBAAC,QAAK,UAAU,mBAAqB,SAAAC,GAAevB,EAAO,KAAM,EAAE,EAAE,EACpEW,KAAa,OAAC,QAAK,UAAU,oDAAoD,8BAAkB,EAAU,IAChH,GACF,GACF,EAEC,CAACA,GAAcJ,MACd,QAAC,MAAG,UAAU,OACX,UAAAO,EAAS,IAAKU,MACX,OAACzB,GAAA,CAEC,OAAQyB,EACR,iBAAkBvB,EAClB,SAAUC,EACV,eAAgBC,EAChB,kBAAmBC,EACnB,UAAWC,GANNmB,EAAY,EAOnB,CACD,GAGCZ,GAAaO,OACb,OAAC,MAAG,IAAKH,EAAa,UAAU,+BAC7B,mBAAC,YAAQ,UAAU,qCAAqC,EAC3D,EAIAJ,GAAaE,EAAS,SAAW,MAC9B,OAAC,MAAG,UAAU,OACb,mBAAC,OAAI,UAAU,iCACb,mBAAC,QAAK,UAAU,wBAAwB,sBAAU,EACpD,EACF,GAER,GAEJ,CAEJ,CAEO,SAASW,IAAY,CAC1B,GAAM,CACJ,oBAAAC,EACA,uBAAAC,EACA,cAAAC,EACA,gBAAAC,EACA,SAAAC,EACA,SAAAC,CACF,EAAIC,EAAe,EAEb,CAACC,EAAgBC,CAAiB,KAAI,aAA+B,MAAS,EAC9E,CAAC7B,EAAW8B,CAAY,KAAI,aAA0B,CAC1D,QAAS,IAAI,IACb,QAAS,IAAI,IACb,OAAQ,IAAI,IACZ,WAAY,IAAI,GAClB,CAAC,EAGK,CAAE,IAAKC,EAAiB,MAAOC,CAAU,EAAInB,GAAwB,CACzE,UAAW,GACX,WAAY,OACd,CAAC,EAEKoB,EAAiBjC,EAAU,WAAW,IAAI,IAAI,EAC9CkC,EAAcD,GAAkBA,EAAe,YAAcA,EAAe,WAC5EE,EAAgBnC,EAAU,QAAQ,IAAI,IAAI,EAG1CD,EAAoByB,EAAgB,IAAIY,GAAKA,EAAE,EAAE,EAGjDC,EAAcrC,EAAU,QAAQ,IAAI,IAAI,GAAK,CAAC,KAGpD,cAAU,IAAM,CACVqB,GAAuB,CAACrB,EAAU,OAAO,IAAI,IAAI,GAAK,CAACA,EAAU,QAAQ,IAAI,IAAI,GACnFsC,EAAY,KAAM,CAAC,CAEvB,EAAG,CAACjB,CAAmB,CAAC,KAGvB,cAAU,IAAM,CACf,GAAIA,IAAuBW,GAAA,MAAAA,EAAW,iBAAkBE,GAAe,CAACC,EAAe,CACnF,IAAMpB,IAAYkB,GAAA,YAAAA,EAAgB,cAAe,GAAK,EACtDK,EAAY,KAAMvB,CAAQ,CAC9B,CACF,EAAG,CAACiB,GAAA,YAAAA,EAAW,eAAgBE,EAAaC,EAAeF,EAAgBZ,CAAmB,CAAC,EAG/F,IAAMiB,EAAc,MAAOC,EAAoBC,EAAe,IAAM,CAElE,GAAI,CAAAxC,EAAU,QAAQ,IAAIuC,CAAQ,EAGlC,CAAAT,EAAaW,GAASC,EAAAC,EAAA,GACjBF,GADiB,CAEpB,QAAS,IAAI,IAAIA,EAAK,OAAO,EAAE,IAAIF,CAAQ,CAC7C,EAAE,EAEF,GAAI,CAEF,IAAMK,EAAS,MAAMlB,EAAS,WAAWa,EAAUC,EAAM,EAAE,EAE3DV,EAAaW,IAAQ,CACnB,IAAMI,GAAa,IAAI,IAAIJ,GAAK,OAAO,EACvCI,GAAW,OAAON,CAAQ,EAE1B,IAAMO,GAAY,IAAI,IAAIL,GAAK,MAAM,EACrCK,GAAU,IAAIP,CAAQ,EAEtB,IAAMQ,EAAa,IAAI,IAAIN,GAAK,OAAO,EACjCO,EAAkBD,EAAW,IAAIR,CAAQ,GAAK,CAAC,EAGjDC,EAAO,EACPO,EAAW,IAAIR,EAAU,CAAC,GAAGS,EAAiB,GAAGJ,EAAO,OAAO,CAAC,EAEhEG,EAAW,IAAIR,EAAUK,EAAO,OAAO,EAG3C,IAAMK,EAAgB,IAAI,IAAIR,GAAK,UAAU,EAC7C,OAAAQ,EAAc,IAAIV,EAAUK,EAAO,UAAU,EAEtC,CACL,QAASG,EACT,QAASF,GACT,OAAQC,GACR,WAAYG,CACd,CACF,CAAC,CACH,OAASC,EAAO,CACd,QAAQ,MAAM,8BAA8BX,CAAQ,IAAKW,CAAK,EAG9DpB,EAAaW,IAAQ,CACnB,IAAMI,GAAa,IAAI,IAAIJ,GAAK,OAAO,EACvC,OAAAI,GAAW,OAAON,CAAQ,EAEnBG,EAAAC,EAAA,GACFF,IADE,CAEL,QAASI,EACX,EACF,CAAC,CACH,EACF,EAEMM,EAAa,IAAM,CACnBvB,IAAmB,SACrBH,EAASG,CAAc,EACvBN,EAAuB,EAAK,EAC5BO,EAAkB,MAAS,EAC3BC,EAAa,CACX,QAAS,IAAI,IACb,QAAS,IAAI,IACb,OAAQ,IAAI,IACZ,WAAY,IAAI,GAClB,CAAC,EAEL,EAEMsB,EAAoBC,GAAkB,CAC1C/B,EAAuB+B,CAAI,EACvBA,EACFf,EAAY,KAAM,CAAC,GAEnBT,EAAkB,MAAS,EAC3BC,EAAa,CACX,QAAS,IAAI,IACb,QAAS,IAAI,IACb,OAAQ,IAAI,IACZ,WAAY,IAAI,GAClB,CAAC,EAEL,EAEA,OAAKT,KAGH,OAACiC,GAAA,CAAO,KAAMjC,EAAqB,aAAc+B,EAC/C,oBAACG,GAAA,CAAc,UAAU,gEAAgE,QAAQ,aAAa,gBAAiB,GAC7H,qBAACC,GAAA,CAAa,UAAU,uCACtB,oBAACC,GAAA,CAAY,UAAU,iBACrB,oBAAC,OAAI,UAAU,iDACf,qBAAC,QAAK,UAAU,mBAAmB,0BAEjC,QAAC,KAAE,UAAU,wBAAwB,oBAC3BlC,EAAc,OAAO,QAC5BA,EAAc,SAAW,EAAI,GAAK,IAAI,OAAK,IAC3CC,EAAgB,OAAO,UACvBA,EAAgB,SAAW,EAAI,GAAK,IAAI,KAC3C,GACA,KAEA,QAACkC,EAAA,CACC,QAAQ,UACR,KAAK,OACL,OAAO,OACP,QAAS,IAAMN,EAAiB,EAAK,EACrC,UAAU,mFAEd,oBAACO,GAAA,CAAU,UAAU,SAAS,KAC9B,OAAC,QAAK,UAAU,SAAS,iBAAK,GAChC,GACF,EACE,KACA,OAACC,GAAA,EAAkB,GACrB,KACA,OAAC,OAAI,UAAU,iDACb,mBAAC,OAAI,UAAU,yCACb,oBAAC,OAAI,UAAU,+BACb,oBAAC,SAAM,UAAU,uCAAuC,sCAExD,KAGC,QAAC,MAAG,UAAU,sEAEX,oBAAC,MACC,oBAAC,OAAI,UAAU,iCACb,oBAAC,OAAI,UAAU,MAAM,KACrB,QAAC,UACC,QAAS,IAAM/B,EAAkB,IAAI,EACrC,UAAW,6FAA6FD,IAAmB,KACrH,0CACA,mBACJ,GAEF,oBAACX,GAAA,CAAW,UAAU,6BAA6B,YAAa,IAAK,KACrE,OAAC,OAAI,UAAU,sBACb,mBAAC,QAAK,UAAU,mBAAmB,0BAAc,EACnD,GACF,GACF,EACF,EAECoB,EAAY,IAAK1C,MAChB,OAACD,GAAA,CAEC,OAAQC,EACR,iBAAkBiC,EAClB,SAAWiC,GAAOhC,EAAkBgC,CAAE,EACtC,eAAgBvB,EAChB,kBAAmBvC,EACnB,UAAWC,GANNL,EAAO,EAOd,CACD,GACCwC,GAAiBD,OACb,OAAC,MAAG,IAAKH,EAAiB,UAAU,+BAClC,mBAAC,YAAQ,UAAU,qCAAqC,EAC5D,EAEHM,EAAY,SAAW,GAAK,CAACF,GAAiB,CAACD,MAC9C,OAAC,MAAG,UAAU,yCAAyC,uCAEvD,GAEJ,GACJ,EACF,EACF,KACA,QAAC4B,GAAA,CAAa,UAAU,qHACtB,oBAACC,GAAA,CAAY,QAAO,GAClB,mBAACL,EAAA,CAAO,KAAK,SAAS,QAAQ,UAAU,OAAO,OAAO,UAAU,mBAAmB,kBAEnF,EACF,KACA,OAACA,EAAA,CAAO,KAAK,SAAS,QAASP,EAAY,SAAUvB,IAAmB,OAAW,OAAO,OAAO,UAAU,mBAAmB,gBAE9H,GACF,GACF,EACF,EAhG+B,IAkGnC,CGxYA,IAAAoC,GAAsC,iBACtCC,GAAwB,wBCCxB,IAAAC,GAAkD,oBAa9C,IAAAC,GAAA,6BAXJ,SAASC,GAAWC,EASjB,CATiB,IAAAC,EAAAD,EAClB,WAAAE,EACA,kBAAAC,EACA,SAAAC,EACA,YAAAC,CAVF,EAMoBJ,EAKfK,EAAAC,EALeN,EAKf,CAJH,YACA,oBACA,WACA,gBAMA,SACE,SAAC,GAAAO,WAAoB,KAApBC,EAAAC,EAAA,CAAyB,YAAU,cAAc,UAAWC,EAAG,2BAA4BT,CAAS,GAAOI,GAA3G,CACC,qBAAC,GAAAE,WAAoB,SAApB,CACC,IAAKH,EACL,UAAWM,EAAG,kCAAmCR,CAAiB,EAEjE,SAAAC,EACH,KACA,QAACQ,GAAA,EAAU,KACX,QAAC,GAAAJ,WAAoB,OAApB,EAA2B,IAC9B,CAEJ,CAEA,SAASI,GAAUZ,EAIsD,CAJtD,IAAAC,EAAAD,EACjB,WAAAE,EACA,YAAAW,EAAc,UAhChB,EA8BmBZ,EAGdK,EAAAC,EAHcN,EAGd,CAFH,YACA,gBAGA,SACE,QAAC,GAAAO,WAAoB,oBAApBC,EAAAC,EAAA,CACC,YAAU,wBACV,YAAaG,EACb,UAAWF,EACT,gDACAE,IAAgB,YAAc,mDAC9BA,IAAgB,cAAgB,qDAChCX,CACF,GACII,GATL,CAWC,oBAAC,GAAAE,WAAoB,gBAApB,CAAoC,UAAU,yCAAyC,GAC1F,CAEJ,CCZc,IAAAM,GAAA,6BAdP,SAASC,GAAc,CAC5B,MAAAC,EACA,KAAAC,EACA,QAAAC,EACA,eAAAC,EACA,gBAAAC,EACA,OAAAC,CACF,EAAuB,CACrB,SACE,QAACC,GAAA,CAAO,KAAML,EAAM,aAAeM,GAAW,CAACA,GAAUL,EAAQ,EAC/D,qBAACM,GAAA,CAAc,UAAU,+DAA+D,QAAQ,aAAa,gBAAiB,GAC5H,sBAACC,GAAA,CAAa,UAAU,uCACtB,qBAACC,GAAA,CAAY,UAAU,iBACrB,qBAAC,OAAI,UAAU,oCACb,qBAAC,QAAM,SAAAV,EAAM,KACb,SAACW,EAAA,CACC,QAAQ,UACR,KAAK,OACL,OAAO,OACP,QAAS,IAAMT,EAAQ,EACvB,UAAU,mFAEV,qBAACU,GAAA,CAAU,UAAU,SAAS,KAC9B,QAAC,QAAK,UAAU,SAAS,iBAAK,GAChC,GACF,EACF,KACA,QAACC,GAAA,EAAkB,GACrB,KACA,QAACC,GAAA,CAAW,UAAU,iBAEpB,qBAAC,OAAI,UAAU,0EAEb,qBAAC,OAAI,UAAU,yCACZ,SAAAX,EACH,KAGA,QAAC,OAAI,UAAU,MACZ,SAAAC,EACH,GACF,EACF,KAEA,QAACW,GAAA,CAAa,UAAU,mCACrB,SAAAV,EACH,GACF,EACF,CAEJ,CCvEA,IAAAW,GAAwB,wBAExB,IAAAC,GAAsB,kBAEtB,IAAAC,GAAyB,iBCFjB,IAAAC,GAAA,6BAJO,SAARC,GACHC,EACF,CACE,SACI,SAAC,MAAAC,EAAAC,EAAA,CACG,MAAM,6BACN,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,OAAO,eACP,YAAY,IACZ,cAAc,QACd,eAAe,SACXF,GAVP,CAYG,qBAAC,QAAK,OAAO,OAAO,EAAE,gBAAgB,KAAK,OAAO,KAClD,QAAC,QAAK,EAAE,mBAAmB,IAC/B,CAGR,CDgCQ,IAAAG,GAAA,6BApCD,SAASC,GAAiB,CAAE,KAAAC,CAAK,EAAoB,CAC1D,GAAM,CAAE,SAAAC,EAAU,wBAAAC,EAAyB,YAAAC,CAAY,EAAIC,EAAe,EACpE,CAACC,EAAUC,CAAW,KAAI,aAAS,EAAK,EAuB9C,SACE,QAACC,EAAA,CACC,QAAQ,UACR,KAAK,OACL,OAAO,OACP,MAAM,SACN,UAAU,wHACV,QA5BiB,SAAY,CAC/BD,EAAY,EAAI,EAChB,GAAI,CAEF,MAAML,EAAS,YAAY,CAACD,EAAK,EAAE,CAAC,EAGpC,MAAMG,EAAY,EAGlBD,EAAwB,IAAI,EAE5B,SAAM,QAAQ,eAAgB,CAC5B,YAAa,GAAGM,GAAeR,EAAK,KAAM,EAAE,CAAC,mBAC/C,CAAC,CACH,OAASS,EAAO,CACd,SAAM,MAAM,eAAe,EAC3BH,EAAY,EAAK,CACnB,CACF,EAUI,SAAUD,EAET,SAAAA,KACC,QAAC,YAAQ,UAAU,sBAAsB,KAEzC,QAACK,GAAA,CAAU,UAAU,SAAS,EAElC,CAEJ,CAEO,SAASC,GAAmB,CAAE,KAAAX,CAAK,EAAoB,CAC5D,GAAM,CAACY,EAAaC,CAAc,KAAI,aAAS,EAAK,EAoBpD,SACE,QAACN,EAAA,CACC,QAAQ,UACR,KAAK,OACL,OAAO,OACP,QAvBmB,SAAY,CACjCM,EAAe,EAAI,EACnB,GAAI,CAEF,IAAMC,EAAO,SAAS,cAAc,GAAG,EACvCA,EAAK,KAAOd,EAAK,IACjBc,EAAK,SAAWd,EAAK,KACrBc,EAAK,MAAM,EACX,SAAM,QAAQ,mBAAoB,CAChC,YAAa,eAAeN,GAAeR,EAAK,KAAM,EAAE,CAAC,EAC3D,CAAC,CACH,OAASS,EAAO,CACd,SAAM,MAAM,iBAAiB,CAC/B,QAAE,CACAI,EAAe,EAAK,CACtB,CACF,EAQI,UAAU,2HACV,MAAM,WACN,SAAUD,EAET,SAAAA,KACC,QAAC,YAAQ,UAAU,sBAAsB,KAEzC,QAACG,GAAA,CAAa,UAAU,SAAS,YAAa,IAAK,EAEvD,CAEJ,CAEO,SAASC,GAAmB,CAAE,KAAAhB,CAAK,EAAoB,CAC5D,GAAM,CAACiB,EAAQC,CAAS,KAAI,aAAS,EAAK,EAiB1C,SACE,QAACX,EAAA,CACC,QAAQ,UACR,KAAK,OACL,OAAO,OACP,QApBmB,SAAY,CACjC,GAAI,CACF,MAAM,UAAU,UAAU,UAAUP,EAAK,GAAG,EAC5CkB,EAAU,EAAI,EACd,SAAM,QAAQ,cAAe,CAC3B,YAAa,8BACf,CAAC,EAGD,WAAW,IAAMA,EAAU,EAAK,EAAG,GAAI,CACzC,OAAST,EAAO,CACd,SAAM,MAAM,qBAAqB,CACnC,CACF,EAQI,UAAW,2DACTQ,EACI,yDACA,kEACN,GACA,MAAM,YACN,SAAUA,EAET,SAAAA,KACC,QAACE,GAAA,CAAU,UAAU,yCAAyC,YAAa,EAAG,KAE9E,QAACC,GAAA,CAAS,UAAU,SAAS,YAAa,IAAK,EAEnD,CAEJ,CAOO,SAASC,GAAqB,CAAE,KAAArB,EAAM,aAAAsB,CAAa,EAA8B,CACtF,SACE,QAACf,EAAA,CACC,QAAQ,UACR,KAAK,OACL,OAAO,OACP,QAASe,EACT,UAAU,iIACV,MAAM,aAEN,oBAACC,GAAA,CAAe,UAAU,SAAS,YAAa,EAAG,EACrD,CAEJ,CE7JA,IAAAC,GAAuC,oCA6B9B,IAAAC,GAAA,6BA1BHC,MAAmB,QACvB;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,CACE,SAAU,CACR,QAAS,CACP,GAAI,mCACJ,GAAI,+BACJ,GAAI,8BACN,CACF,EACA,gBAAiB,CACf,QAAS,IACX,CACF,CACF,EAEA,SAASC,GAASC,EAI2D,CAJ3D,IAAAC,EAAAD,EAChB,WAAAE,EACA,QAAAC,CA9BF,EA4BkBF,EAGbG,EAAAC,EAHaJ,EAGb,CAFH,YACA,YAGA,SAAO,QAAC,WAAAK,EAAA,CAAS,YAAU,WAAW,UAAWC,EAAGT,GAAiB,CAAE,QAAAK,CAAQ,CAAC,EAAGD,CAAS,GAAOE,EAAO,CAC5G,CC9BA,IAAAI,GAAuC,oCACvCC,GAAwC,oBAsB/B,IAAAC,GAAA,6BApBHC,MAAgB,QACpB,iGACA,CACE,SAAU,CACR,QAAS,CACP,QAAS,cACT,UAAW,aACb,CACF,EACA,gBAAiB,CACf,QAAS,SACX,CACF,CACF,EAEA,SAASC,GAAMC,EAI2E,CAJ3E,IAAAC,EAAAD,EACb,WAAAE,EACA,QAAAC,CAxBF,EAsBeF,EAGVG,EAAAC,EAHUJ,EAGV,CAFH,YACA,YAGA,SAAO,QAAC,GAAAK,MAAe,KAAfC,EAAA,CAAoB,YAAU,QAAQ,UAAWC,EAAGV,GAAc,CAAE,QAAAK,CAAQ,CAAC,EAAGD,CAAS,GAAOE,EAAO,CACjH,CCzBO,SAASK,GAAWC,EAA6B,CACtD,IAAMC,EAAI,OAAOD,GAAS,SAAW,IAAI,KAAKA,CAAI,EAAIA,EAChDE,EAAQ,OAAOD,EAAE,SAAS,EAAI,CAAC,EAAE,SAAS,EAAG,GAAG,EAChDE,EAAM,OAAOF,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAG,GAAG,EACzCG,EAAOH,EAAE,YAAY,EAC3B,MAAO,GAAGC,CAAK,IAAIC,CAAG,IAAIC,CAAI,EAChC,CAKO,SAASC,GAAeC,EAAyB,CACtD,IAAMC,EAAO,KAAK,MAAMD,EAAU,EAAE,EAC9BE,EAAOF,EAAU,GACvB,MAAO,GAAGC,CAAI,IAAIC,EAAK,SAAS,EAAE,SAAS,EAAG,GAAG,CAAC,EACpD,CChBA,IAAAC,GAAwB,iBACxBC,GAAuC,oCCAvC,IAAAC,GAAgD,oBAW5C,IAAAC,GAAA,6BDHA,IAAAC,GAAA,6BA6CJ,IAAMC,MAAgB,QACpB,qEACA,CACE,SAAU,CACR,YAAa,CACX,SAAU,CAAC,2CAA2C,EACtD,WAAY,CACV,wBACA,wCACA,sHACF,EACA,WAAY,CACV,+HACA,wDACA,sJACF,CACF,CACF,EACA,gBAAiB,CACf,YAAa,UACf,CACF,CACF,EAEA,SAASC,GAAMC,EAIsD,CAJtD,IAAAC,EAAAD,EACb,WAAAE,EACA,YAAAC,EAAc,UAlFhB,EAgFeF,EAGVG,EAAAC,EAHUJ,EAGV,CAFH,YACA,gBAGA,SACE,QAAC,MAAAK,EAAA,CACC,KAAK,QACL,YAAU,QACV,mBAAkBH,EAClB,UAAWI,EAAGT,GAAc,CAAE,YAAAK,CAAY,CAAC,EAAGD,CAAS,GACnDE,EACN,CAEJ,CAeA,SAASI,GAAWC,EAGmB,CAHnB,IAAAC,EAAAD,EAClB,WAAAE,CA9GF,EA6GoBD,EAEfE,EAAAC,EAFeH,EAEf,CADH,cAGA,SACE,QAACI,GAAAC,EAAA,CACC,YAAU,cACV,UAAWC,EACT,+GACA,oKACA,4HACAL,CACF,GACIC,EACN,CAEJ,CE1HA,IAAAK,GAAuC,oCASnC,IAAAC,GAAA,6BAFJ,SAASC,GAAWC,EAAsD,CAAtD,IAAAC,EAAAD,EAAE,WAAAE,CAVtB,EAUoBD,EAAgBE,EAAAC,EAAhBH,EAAgB,CAAd,cACpB,SACE,QAAC,MAAAI,EAAA,CACC,YAAU,cACV,KAAK,QACL,UAAWC,EACT,2JACA,qCAGA,kDACA,gDACA,iIACA,2HAGA,kMAGA,iLAEAJ,CACF,GACIC,EACN,CAEJ,CAEA,IAAMI,MAA0B,QAC9B,0PACA,CACE,SAAU,CACR,MAAO,CACL,eACE,wEACF,aACE,uEACF,cACE,oGACF,YACE,kGACJ,CACF,EACA,gBAAiB,CACf,MAAO,cACT,CACF,CACF,EAEA,SAASC,GAAgBR,EAIsD,CAJtD,IAAAC,EAAAD,EACvB,WAAAE,EACA,MAAAO,EAAQ,cA7DV,EA2DyBR,EAGpBE,EAAAC,EAHoBH,EAGpB,CAFH,YACA,UAGA,SACE,QAAC,MAAAI,EAAA,CACC,KAAK,QACL,YAAU,oBACV,aAAYI,EACZ,UAAWH,EAAGC,GAAwB,CAAE,MAAAE,CAAM,CAAC,EAAGP,CAAS,EAC3D,QAAUQ,GAAM,CAtEtB,IAAAV,EAAAC,EAuEaS,EAAE,OAAuB,QAAQ,QAAQ,IAG9CT,GAAAD,EAAAU,EAAE,cAAc,gBAAhB,YAAAV,EAA+B,cAAc,WAA7C,MAAAC,EAAuD,OACzD,GACIE,EACN,CAEJ,CAEA,IAAMQ,MAA2B,QAC/B,8CACA,CACE,SAAU,CACR,KAAM,CACJ,GAAI,0GACJ,GAAI,kDACJ,UACE,8DACF,UAAW,2BACb,CACF,EACA,gBAAiB,CACf,KAAM,IACR,CACF,CACF,EAqBA,SAASC,GAAeC,EAAuD,CAAvD,IAAAC,EAAAD,EAAE,WAAAE,CAtH1B,EAsHwBD,EAAgBE,EAAAC,EAAhBH,EAAgB,CAAd,cACxB,SACE,QAAC,OAAAI,EAAA,CACC,UAAWC,EACT,yHACAJ,CACF,GACIC,EACN,CAEJ,CAEA,SAASI,GAAgBP,EAGS,CAHT,IAAAC,EAAAD,EACvB,WAAAE,CAnIF,EAkIyBD,EAEpBE,EAAAC,EAFoBH,EAEpB,CADH,cAGA,SACE,QAACO,GAAAH,EAAA,CACC,YAAU,sBACV,UAAWC,EACT,mGACAJ,CACF,GACIC,EACN,CAEJ,CVnFM,IAAAM,EAAA,6BAvBC,SAASC,GAAW,CAAE,KAAAC,EAAM,QAAAC,EAAS,OAAAC,EAAQ,SAAAC,CAAS,EAAoB,CAtCjF,IAAAC,EAuCE,GAAM,CAACC,EAAUC,CAAW,KAAI,aAAS,EAAK,EACxC,CAACC,EAAUC,CAAW,KAAI,aAASR,EAAK,IAAI,EAC5C,CAACS,EAAiBC,CAAkB,KAAI,aAASV,EAAK,iBAAmB,EAAE,EAC3E,CAACW,EAASC,CAAU,KAAI,aAASZ,EAAK,SAAW,EAAE,EAEnDa,EAAa,SAAY,CAC7BP,EAAY,EAAI,EAChB,GAAI,CACF,MAAMJ,GAAA,YAAAA,EAAS,CACb,KAAMK,EACN,gBAAAE,EACA,QAAAE,CACF,IACAV,EAAQ,CACV,QAAE,CACAK,EAAY,EAAK,CACnB,CACF,EAEMQ,KACJ,QAAC,OAAI,UAAU,uBAEb,qBAAC,OAAI,UAAU,kBACb,oBAACC,GAAA,CAAiB,KAAMf,EAAM,KAC9B,OAACgB,GAAA,CAAmB,KAAMhB,EAAM,KAChC,OAACiB,GAAA,CAAmB,KAAMjB,EAAM,KAChC,OAACkB,GAAA,CAAqB,KAAMlB,EAAM,aAAc,IAAM,OAAO,KAAKA,EAAK,IAAK,QAAQ,EAAG,GACzF,KAGA,OAAC,OAAI,UAAU,iGACb,MAAO,CACL,gBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,YAMjB,eAAgB,YAChB,mBAAoB,oCACtB,EAEA,mBAAC,OACC,IAAKA,EAAK,YAAcA,EAAK,IAC7B,IAAKA,EAAK,iBAAmBA,EAAK,KAClC,UAAU,uCACZ,EACF,GACF,EAGImB,KACJ,QAAC,OAAI,UAAU,YAEb,qBAAC,OAAI,UAAU,yBACb,qBAAC,OACC,oBAAC,KAAE,UAAU,+DAA+D,gBAE5E,KACA,OAAC,KAAE,UAAU,kCAAmC,SAAAC,GAAYpB,EAAK,IAAI,EAAE,GACzE,KAEA,QAAC,OACC,oBAAC,KAAE,UAAU,gEAAgE,sBAE7E,KACA,OAAC,KAAE,UAAU,kCACV,SAAAA,EAAK,OAASA,EAAK,OAAS,GAAGA,EAAK,KAAK,OAAIA,EAAK,MAAM,GAAK,MAChE,GACF,KAEA,QAAC,OACC,oBAAC,KAAE,UAAU,gEAAgE,gBAE7E,KACA,OAAC,KAAE,UAAU,kCACV,SAAAqB,GAAWrB,EAAK,SAAS,EAC5B,GACF,KAEA,QAAC,OACC,oBAAC,KAAE,UAAU,gEAAgE,qBAE7E,KACA,OAAC,KAAE,UAAU,kCAAmC,WAAAI,EAAAJ,EAAK,MAAL,YAAAI,EAAU,QAAQ,IAAK,MAAO,MAAM,GACtF,GAGF,KAGA,QAAC,OAAI,UAAU,0BACb,oBAAC,OAAI,UAAU,YACb,oBAACkB,GAAA,CAAM,UAAU,QACf,oBAACC,GAAA,CAAW,QAAQ,WAAW,qBAAS,KACxC,QAACC,GAAA,CACC,oBAACC,GAAA,CAAgB,GAAG,WAAW,YAAY,kBAAkB,MAAOlB,EAAS,QAAQP,EAAK,KAAO,GAAI,EAAE,EAAG,SAAW0B,GAAqClB,EAAYkB,EAAE,OAAO,KAAK,EAAG,KACvL,OAACC,GAAA,CAAgB,MAAM,aAAa,UAAU,OAC5C,mBAACC,GAAA,CAAe,UAAU,6CAA8C,SAAA5B,EAAK,IAAI,EACnF,GACF,GACF,EACF,KAEA,QAAC,OAAI,UAAU,YACb,oBAAC6B,GAAA,CAAM,QAAQ,UAAU,4BAAgB,KACzC,OAACC,GAAA,CACC,GAAG,UACH,MAAOrB,EACP,SAAWiB,GAAwChB,EAAmBgB,EAAE,OAAO,KAAK,EACpF,YAAY,uCACZ,KAAM,EACR,KACA,OAAC,KAAE,UAAU,gCAAgC,oEAE7C,GACF,KAEA,QAAC,OAAI,UAAU,YACb,oBAACG,GAAA,CAAM,QAAQ,UAAU,mBAAO,KAChC,OAACC,GAAA,CACC,GAAG,UACH,MAAOnB,EACP,SAAWe,GAAwCd,EAAWc,EAAE,OAAO,KAAK,EAC5E,YAAY,gBACZ,KAAM,EACR,GACF,GACF,GACF,EAgBF,SACE,OAACK,GAAA,CACC,MAAM,UACN,KAAM,GACN,QAAS9B,EACT,eAAgBa,EAChB,gBAAiBK,EACjB,UAnBF,QAAC,OAAI,UAAU,uEACb,oBAACa,EAAA,CAAO,UAAU,mBAAmB,QAAQ,UAAU,QAAS/B,EAAS,OAAO,OAAO,SAAUI,EAAU,kBAE3G,KACA,QAAC2B,EAAA,CAAO,UAAU,mBAAmB,QAASnB,EAAY,OAAO,OAAO,SAAUR,EAC/E,UAAAA,MAAY,OAAC,YAAQ,UAAU,4BAA4B,EAAG,UAEjE,GACF,EAYA,CAEJ,CWhMA,IAAA4B,GAAsC,iBACtCC,GAAwB,wBAwDlB,IAAAC,EAAA,6BArBC,SAASC,GAAW,CAAE,KAAAC,EAAM,QAAAC,EAAS,OAAAC,EAAQ,SAAAC,CAAS,EAAoB,CAtCjF,IAAAC,EAAAC,EAAAC,EAuCE,GAAM,CAACC,EAAUC,CAAW,KAAI,aAAS,EAAK,EACxC,CAACC,EAAUC,CAAW,KAAI,aAASV,EAAK,IAAI,EAC5C,CAACW,EAASC,CAAU,KAAI,aAASZ,EAAK,SAAW,EAAE,EAEnDa,EAAa,SAAY,CAC7BL,EAAY,EAAI,EAChB,GAAI,CACF,MAAMN,GAAA,YAAAA,EAAS,CACb,KAAMO,EACN,QAAAE,CACF,IACAV,EAAQ,CACV,QAAE,CACAO,EAAY,EAAK,CACnB,CACF,EAEMM,KACJ,QAAC,OAAI,UAAU,uBAEb,qBAAC,OAAI,UAAU,kBACb,oBAACC,GAAA,CAAiB,KAAMf,EAAM,KAC9B,OAACgB,GAAA,CAAmB,KAAMhB,EAAM,KAChC,OAACiB,GAAA,CAAmB,KAAMjB,EAAM,GAClC,KAGA,OAAC,OAAI,UAAU,8EACb,mBAAC,SACC,IAAKA,EAAK,IACV,SAAQ,GACR,UAAU,wBACV,MAAO,CAAE,UAAW,OAAQ,EAC7B,wDAED,EACF,GACF,EAGIkB,KACJ,QAAC,OAAI,UAAU,YAEb,qBAAC,OAAI,UAAU,yBACb,qBAAC,OACC,oBAAC,KAAE,UAAU,yEAAyE,gBAEtF,KACA,OAAC,KAAE,UAAU,kCAAmC,SAAAC,GAAYnB,EAAK,IAAI,EAAE,GACzE,KAEA,QAAC,OACC,oBAAC,KAAE,UAAU,yEAAyE,sBAEtF,KACA,OAAC,KAAE,UAAU,kCACV,SAAAA,EAAK,OAASA,EAAK,OAAS,GAAGA,EAAK,KAAK,OAAIA,EAAK,MAAM,GAAK,MAChE,GACF,KAEA,QAAC,OACC,oBAAC,KAAE,UAAU,yEAAyE,oBAEtF,KACA,OAAC,KAAE,UAAU,kCACV,UAAAI,EAAAJ,EAAK,WAAL,MAAAI,EAAe,SAAWgB,GAAepB,EAAK,SAAS,QAAQ,EAAI,MACtE,GACF,KAEA,QAAC,OACC,oBAAC,KAAE,UAAU,yEAAyE,gBAEtF,KACA,OAAC,KAAE,UAAU,kCACV,SAAAqB,GAAWrB,EAAK,SAAS,EAC5B,GACF,KAEA,QAAC,OACC,oBAAC,KAAE,UAAU,yEAAyE,qBAEtF,KACA,OAAC,KAAE,UAAU,kCAAmC,WAAAK,EAAAL,EAAK,MAAL,YAAAK,EAAU,QAAQ,IAAK,MAAO,MAAM,GACtF,KAEA,QAAC,OACC,oBAAC,KAAE,UAAU,yEAAyE,wBAEtF,KACA,OAAC,KAAE,UAAU,6CACV,WAAAC,EAAAN,EAAK,WAAL,YAAAM,EAAe,cAAe,QACjC,GACF,GAGF,KAGA,QAAC,OAAI,UAAU,0BACZ,oBAAC,OAAI,UAAU,YACd,oBAACgB,GAAA,CAAM,UAAU,QACf,oBAACC,GAAA,CAAW,QAAQ,WAAW,qBAAS,KACxC,QAACC,GAAA,CACC,oBAACC,GAAA,CAAgB,GAAG,WAAW,YAAY,kBAAkB,MAAOhB,EAAS,QAAQT,EAAK,KAAO,GAAI,EAAE,EAAG,SAAW0B,GAAqChB,EAAYgB,EAAE,OAAO,KAAK,EAAG,KACvL,OAACC,GAAA,CAAgB,MAAM,aAAa,UAAU,OAC5C,mBAACC,GAAA,CAAe,UAAU,6CAA8C,SAAA5B,EAAK,IAAI,EACnF,GACF,GACF,EACF,KAEA,QAAC,OAAI,UAAU,YACb,oBAAC6B,GAAA,CAAM,QAAQ,UAAU,mBAAO,KAChC,OAACC,GAAA,CACC,GAAG,UACH,MAAOnB,EACP,SAAWe,GAAwCd,EAAWc,EAAE,OAAO,KAAK,EAC5E,YAAY,gBACZ,KAAM,EACR,GACF,GACF,GACF,EAeF,SACE,OAACK,GAAA,CACC,MAAM,UACN,KAAM,GACN,QAAS9B,EACT,eAAgBa,EAChB,gBAAiBI,EACjB,UAlBF,QAAC,OAAI,UAAU,yFACb,oBAACc,EAAA,CAAO,QAAQ,UAAU,QAAS/B,EAAS,OAAO,OAAO,UAAU,mBAAmB,SAAUM,EAAU,kBAE3G,KACA,QAACyB,EAAA,CAAO,QAASnB,EAAY,OAAO,OAAO,UAAU,mBAAmB,SAAUN,EAC/E,UAAAA,MAAY,OAAC,YAAQ,UAAU,4BAA4B,EAAG,UAEjE,GACF,EAWA,CAEJ,CCxLA,IAAA0B,GAAsC,iBACtCC,GAAwB,wBAUxB,IAAAC,GAAsB,wBA+ChB,IAAAC,EAAA,6BArBC,SAASC,GAAW,CAAE,KAAAC,EAAM,QAAAC,EAAS,OAAAC,EAAQ,SAAAC,CAAS,EAAoB,CAvCjF,IAAAC,EAAAC,EAAAC,EAwCE,GAAM,CAACC,EAAUC,CAAW,KAAI,aAAS,EAAK,EACxC,CAACC,EAAUC,CAAW,KAAI,aAASV,EAAK,IAAI,EAC5C,CAACW,EAASC,CAAU,KAAI,aAASZ,EAAK,SAAW,EAAE,EAEnDa,EAAa,SAAY,CAC7BL,EAAY,EAAI,EAChB,GAAI,CACF,MAAMN,GAAA,YAAAA,EAAS,CACb,KAAMO,EACN,QAAAE,CACF,IACAV,EAAQ,CACV,QAAE,CACAO,EAAY,EAAK,CACnB,CACF,EAEMM,KACJ,QAAC,OAAI,UAAU,uBAEb,qBAAC,OAAI,UAAU,kBACb,oBAACC,GAAA,CAAiB,KAAMf,EAAM,KAC9B,OAACgB,GAAA,CAAmB,KAAMhB,EAAM,KAChC,OAACiB,GAAA,CAAmB,KAAMjB,EAAM,GAClC,KAGA,QAAC,OAAI,UAAU,kJACb,oBAAC,OAAI,UAAU,OACb,mBAAC,OAAI,UAAU,8FACb,mBAAC,UAAM,UAAU,iDAAiD,EACpE,EACF,KACA,OAAC,OAAI,UAAU,kBACb,mBAAC,SACC,IAAKA,EAAK,IACV,SAAQ,GACR,UAAU,SACX,wDAED,EACF,GACF,GACF,EAGIkB,KACJ,QAAC,OAAI,UAAU,YAEb,qBAAC,OAAI,UAAU,yBACb,qBAAC,OACC,oBAAC,KAAE,UAAU,yEAAyE,gBAEtF,KACA,OAAC,KAAE,UAAU,kCAAmC,SAAAC,GAAYnB,EAAK,IAAI,EAAE,GACzE,KAEA,QAAC,OACC,oBAAC,KAAE,UAAU,yEAAyE,oBAEtF,KACA,OAAC,KAAE,UAAU,kCACV,UAAAI,EAAAJ,EAAK,WAAL,MAAAI,EAAe,SAAWgB,GAAepB,EAAK,SAAS,QAAQ,EAAI,MACtE,GACF,KAEA,QAAC,OACC,oBAAC,KAAE,UAAU,yEAAyE,mBAEtF,KACA,OAAC,KAAE,UAAU,kCACV,UAAAK,EAAAL,EAAK,WAAL,MAAAK,EAAe,QAAU,GAAGL,EAAK,SAAS,OAAO,QAAU,MAC9D,GACF,KAEA,QAAC,OACC,oBAAC,KAAE,UAAU,yEAAyE,gBAEtF,KACA,OAAC,KAAE,UAAU,kCACV,SAAAqB,GAAWrB,EAAK,SAAS,EAC5B,GACF,KAEA,QAAC,OACC,oBAAC,KAAE,UAAU,yEAAyE,qBAEtF,KACA,OAAC,KAAE,UAAU,kCAAmC,WAAAM,EAAAN,EAAK,MAAL,YAAAM,EAAU,QAAQ,IAAK,MAAO,MAAM,GACtF,GAGF,KAGA,QAAC,OAAI,UAAU,0BACb,oBAAC,OAAI,UAAU,YACb,oBAACgB,GAAA,CAAM,UAAU,QACf,oBAACC,GAAA,CAAW,QAAQ,WAAW,qBAAS,KACxC,QAACC,GAAA,CACC,oBAACC,GAAA,CAAgB,GAAG,WAAW,YAAY,kBAAkB,MAAOhB,EAAS,QAAQT,EAAK,KAAO,GAAI,EAAE,EAAG,SAAW0B,GAAqChB,EAAYgB,EAAE,OAAO,KAAK,EAAG,KACvL,OAACC,GAAA,CAAgB,MAAM,aAAa,UAAU,OAC5C,mBAACC,GAAA,CAAe,UAAU,6CAA8C,SAAA5B,EAAK,IAAI,EACnF,GACF,GACF,EACF,KAEA,QAAC,OAAI,UAAU,YACb,oBAAC6B,GAAA,CAAM,QAAQ,UAAU,mBAAO,KAChC,OAACC,GAAA,CACC,GAAG,UACH,MAAOnB,EACP,SAAWe,GAAwCd,EAAWc,EAAE,OAAO,KAAK,EAC5E,YAAY,gBACZ,KAAM,EACR,GACF,GACF,GACF,EAeF,SACE,OAACK,GAAA,CACC,MAAM,UACN,KAAM,GACN,QAAS9B,EACT,eAAgBa,EAChB,gBAAiBI,EACjB,UAlBF,QAAC,OAAI,UAAU,yFACb,oBAACc,EAAA,CAAO,QAAQ,UAAU,QAAS/B,EAAS,OAAO,OAAO,UAAU,mBAAmB,SAAUM,EAAU,kBAE3G,KACA,QAACyB,EAAA,CAAO,QAASnB,EAAY,OAAO,OAAO,UAAU,mBAAmB,SAAUN,EAC/E,UAAAA,MAAY,OAAC,YAAQ,UAAU,4BAA4B,EAAG,UAEjE,GACF,EAWA,CAEJ,CCtLA,IAAA0B,GAAsC,iBACtCC,GAAwB,wBAiDlB,IAAAC,EAAA,6BA7BC,SAASC,GAAU,CAAE,KAAAC,EAAM,QAAAC,EAAS,OAAAC,CAAO,EAAmB,CAvBrE,IAAAC,EAAAC,EAAAC,EAAAC,EAwBE,GAAM,CAACC,EAAUC,CAAW,KAAI,aAAS,EAAK,EACxC,CAACC,EAAUC,CAAW,KAAI,aAASV,EAAK,IAAI,EAC5C,CAACW,EAAaC,CAAc,KAAI,eAAST,EAAAH,EAAK,WAAL,YAAAG,EAAe,cAAe,EAAE,EAEzEU,EAAa,SAAY,CAC7BL,EAAY,EAAI,EAChB,GAAI,CACF,MAAMN,GAAA,YAAAA,EAAS,CACb,KAAMO,EACN,SAAUK,EAAAC,EAAA,GACLf,EAAK,UADA,CAER,YAAAW,CACF,EACF,IACAV,EAAQ,CACV,QAAE,CACAO,EAAY,EAAK,CACnB,CACF,EAEMQ,IAAMZ,EAAAJ,EAAK,MAAL,YAAAI,EAAU,QAAQ,IAAK,MAAO,OAGpC,CAAE,UAAWa,CAAqB,EAAIC,GAAkBlB,CAAI,EAE5DmB,KACJ,QAAC,OAAI,UAAU,uBAEb,qBAAC,OAAI,UAAU,kBACb,oBAACC,GAAA,CAAiB,KAAMpB,EAAM,KAC9B,OAACqB,GAAA,CAAmB,KAAMrB,EAAM,KAChC,OAACsB,GAAA,CAAmB,KAAMtB,EAAM,GAClC,KAGA,QAAC,OAAI,UAAU,+IACb,oBAAC,OAAI,UAAU,kDACb,mBAACiB,EAAA,CAAqB,KAAMjB,EAAM,SAAUA,EAAK,SAAU,EAC7D,KACA,QAAC,KAAE,UAAU,qEACV,UAAAgB,EAAI,SACP,GACF,GACF,EAGIO,KACJ,QAAC,OAAI,UAAU,YAEb,qBAAC,OAAI,UAAU,yBACb,qBAAC,OACC,oBAAC,KAAE,UAAU,+DAA+D,gBAE5E,KACA,OAAC,KAAE,UAAU,kCAAmC,SAAAC,GAAYxB,EAAK,IAAI,EAAE,GACzE,KAEA,QAAC,OACC,oBAAC,KAAE,UAAU,gEAAgE,gBAE7E,KACA,OAAC,KAAE,UAAU,kCACV,SAAAyB,GAAWzB,EAAK,SAAS,EAC5B,GACF,KAEA,QAAC,OACC,oBAAC,KAAE,UAAU,+DAA+D,qBAE5E,KACA,OAAC,KAAE,UAAU,kCAAmC,SAAAgB,EAAI,GACtD,IAECX,EAAAL,EAAK,WAAL,YAAAK,EAAe,eACd,QAAC,OACC,oBAAC,KAAE,UAAU,yEAAyE,sBAEtF,KACA,OAAC,KAAE,UAAU,kCAAmC,SAAAL,EAAK,SAAS,UAAU,GAC1E,IAGDM,EAAAN,EAAK,WAAL,YAAAM,EAAe,YACd,QAAC,OACC,oBAAC,KAAE,UAAU,yEAAyE,kBAEtF,KACA,OAAC,KAAE,UAAU,kCAAmC,SAAAN,EAAK,SAAS,OAAO,GACvE,GAIJ,KAGA,QAAC,OAAI,UAAU,0BACZ,oBAAC,OAAI,UAAU,YACd,oBAAC0B,GAAA,CAAM,UAAU,QACf,oBAACC,GAAA,CAAW,QAAQ,WAAW,qBAAS,KACxC,QAACC,GAAA,CACC,oBAACC,GAAA,CAAgB,GAAG,WAAW,YAAY,kBAAkB,MAAOpB,EAAS,QAAQT,EAAK,KAAO,GAAI,EAAE,EAAG,SAAW8B,GAAqCpB,EAAYoB,EAAE,OAAO,KAAK,EAAG,KACvL,OAACC,GAAA,CAAgB,MAAM,aAAa,UAAU,OAC5C,mBAACC,GAAA,CAAe,UAAU,6CAA8C,SAAAhC,EAAK,IAAI,EACnF,GACF,GACF,EACF,KAEA,QAAC,OAAI,UAAU,YACb,oBAACiC,GAAA,CAAM,QAAQ,cAAc,uBAAW,KACxC,OAACC,GAAA,CACC,GAAG,cACH,MAAOvB,EACP,SAAWmB,GAAwClB,EAAekB,EAAE,OAAO,KAAK,EAChF,YAAY,oBACZ,KAAM,EACR,GACF,GACF,GACF,EAeF,SACE,OAACK,GAAA,CACC,MAAM,UACN,KAAM,GACN,QAASlC,EACT,eAAgBkB,EAChB,gBAAiBI,EACjB,UAlBF,QAAC,OAAI,UAAU,uEACb,oBAACa,EAAA,CAAO,UAAU,mBAAmB,QAAQ,UAAU,QAASnC,EAAS,OAAO,OAAO,SAAUM,EAAU,kBAE3G,KACA,QAAC6B,EAAA,CAAO,UAAU,mBAAmB,QAASvB,EAAY,OAAO,OAAO,SAAUN,EAC/E,UAAAA,MAAY,OAAC,YAAQ,UAAU,4BAA4B,EAAG,QAEjE,GACF,EAWA,CAEJ,CC7HU,IAAA8B,GAAA,6BA7BH,SAASC,GAAoB,CAAE,UAAAC,CAAU,EAA2B,CACzE,GAAM,CACJ,qBAAAC,EACA,wBAAAC,EACA,mBAAAC,CACF,EAAIC,EAAe,EAEbC,EAAc,IAAM,CACxBH,EAAwB,IAAI,CAC9B,EAEMI,EAAa,MAAOC,GAAmC,CACvDN,GACF,MAAME,EAAmBF,EAAqB,GAAIM,CAAO,CAE7D,EAGMC,EAAyB,IAAM,CACnC,GAAI,CAACP,EAAsB,OAAO,KAOlC,OALiBQ,GACfR,EAAqB,KACrBA,EAAqB,GACvB,EAEkB,CAChB,KAAKS,EAAU,MACb,SACE,QAACC,GAAA,CACC,KAAMV,EACN,QAASI,EACT,OAAQC,EACV,EAEJ,KAAKI,EAAU,MACb,SACE,QAACE,GAAA,CACC,KAAMX,EACN,QAASI,EACT,OAAQC,EACV,EAEJ,KAAKI,EAAU,MACb,SACE,QAACG,GAAA,CACC,KAAMZ,EACN,QAASI,EACT,OAAQC,EACV,EAEJ,KAAKI,EAAU,KACf,QACE,SACE,QAACI,GAAA,CACC,KAAMb,EACN,QAASI,EACT,OAAQC,EACV,CAEN,CACF,EAEA,SACE,SAAC,OAAI,UAAWS,EAAG,GAAIf,CAAS,EAC9B,qBAACgB,GAAA,EAAY,KACb,QAACC,GAAA,EAAkB,KACnB,QAACC,GAAA,EAAU,EACVV,EAAuB,GAC1B,CAEJ,CCvEI,IAAAW,GAAA,6BALG,SAASC,GAAwBC,EAGW,CAHX,IAAAC,EAAAD,EACtC,UAAAE,CAVF,EASwCD,EAEnCE,EAAAC,EAFmCH,EAEnC,CADH,aAGA,SACE,QAACI,GAAAC,EAAAC,EAAA,CACC,KAAMC,GAAK,KACX,cAAeC,GAAe,UAC1BN,GAHL,CAKE,SAAAD,GACH,CAEJ,CAGO,SAASQ,GAAyBV,EAQyB,CARzB,IAAAC,EAAAD,EACvC,UAAAE,EACA,kBAAAS,EAAoBF,GAAe,OACnC,kBAAAG,EACA,SAAAC,EAAW,OACX,gBAAAC,EACA,QAAAC,CA/BF,EAyByCd,EAOpCE,EAAAC,EAPoCH,EAOpC,CANH,WACA,oBACA,oBACA,WACA,kBACA,YAGA,SACE,QAACI,GAAAC,EAAAC,EAAA,CACC,KAAMC,GAAK,MACX,cAAeG,EACf,0BAA2BC,GAAqBT,EAAM,iBACtD,SAAUU,EACV,gBAAiBC,EACjB,QAASC,GACLZ,GAPL,CASE,SAAAD,GACH,CAEJ,CAEO,IAAMc,GAAyB,CAClC,KAAMjB,GACN,MAAOW,GACP,OAAQO,GACR,OAAQC,GACR,SAAUC,EACd,EC7CI,IAAAC,GAAA,6BAJG,SAASC,IAAa,CAC3B,GAAM,CAAE,uBAAAC,CAAuB,EAAIC,EAAe,EAElD,SACE,SAACC,EAAA,CACC,QAAQ,UACR,KAAK,KACL,OAAO,OACP,QAAS,IAAMF,EAAuB,EAAI,EAC1C,UAAU,oHAEV,qBAACG,GAAA,CAAS,UAAU,SAAS,KAC7B,QAAC,QAAK,UAAU,mBAAmB,gBAAI,GACzC,CAEJ,CAEO,SAASC,IAAe,CAC7B,GAAM,CAAE,WAAAC,CAAW,EAAIJ,EAAe,EAEtC,SACE,SAACC,EAAA,CACC,QAAQ,UACR,KAAK,KACL,OAAO,OACP,QAASG,EACT,UAAU,iHAEV,qBAACC,GAAA,CAAU,UAAU,SAAS,KAC9B,QAAC,QAAK,UAAU,SAAS,kBAAM,GACjC,CAEJ,CAEO,SAASC,IAAuB,CACrC,GAAM,CAAE,qBAAAC,CAAqB,EAAIP,EAAe,EAEhD,SACE,SAACC,EAAA,CACC,QAAQ,UACR,KAAK,KACL,QAASM,EACT,UAAU,wJAEV,qBAACC,GAAA,CAAU,UAAU,uBAAuB,EAAE,SAEhD,CAEJ,CAGO,SAASC,IAAoB,CAClC,GAAM,CACJ,cAAAC,EACA,gBAAAC,CACF,EAAIX,EAAe,EAInB,OAFsBU,EAAc,OAASC,EAAgB,SAEvC,EAAU,QAG9B,QAAC,OAAI,UAAU,SACb,qBAAC,OAAI,UAAU,6CACb,sBAAC,OAAI,UAAU,iDACb,qBAACb,GAAA,EAAW,KACZ,QAACK,GAAA,EAAa,GAChB,KACA,QAACG,GAAA,EAAqB,GACxB,EACF,CAEJ,CAGO,SAASM,GAAoB,CAAE,UAAAC,CAAU,EAA2B,CACzE,GAAM,CACJ,cAAAH,EACA,gBAAAC,CACF,EAAIX,EAAe,EAInB,OAFsBU,EAAc,OAASC,EAAgB,SAEvC,EAAU,QAG9B,QAAC,OAAI,UAAW,sGAAsGE,GAAa,EAAE,GACnI,oBAAC,OAAI,UAAU,4BACb,qBAAC,OAAI,UAAU,6CACb,sBAAC,OAAI,UAAU,iDACb,qBAACf,GAAA,EAAW,KACZ,QAACK,GAAA,EAAa,GAChB,KACA,QAACG,GAAA,EAAqB,GACxB,EACF,EACF,CAEJ,CCpGS,IAAAQ,GAAA,6BADT,SAASC,GAASC,EAAsD,CAAtD,IAAAC,EAAAD,EAAE,WAAAE,CAHpB,EAGkBD,EAAgBE,EAAAC,EAAhBH,EAAgB,CAAd,cAClB,SAAO,QAAC,MAAAI,EAAA,CAAI,YAAU,WAAW,UAAWC,EAAG,qCAAsCJ,CAAS,GAAOC,EAAO,CAC9G,CCAA,IAAAI,GAA0B,2BAkBpBC,GAAA,6BAhBC,SAASC,IAAmB,CACjC,GAAM,CACJ,cAAAC,EACA,kBAAAC,EACA,UAAAC,CACF,EAAIC,EAAe,EAEbC,KAAS,cAAU,EAEnBC,EAAkB,IAAM,CAC5BD,EAAO,KAAK,CACd,EAEA,OAAGF,KAGC,SAAC,OAAI,UAAU,0BACb,qBAACI,GAAA,CAAS,UAAU,qCAAqC,KACzD,QAACA,GAAA,CAAS,UAAU,6BAA6B,GACnD,KAKF,qBACG,SAAAN,KACC,SAAC,OAAI,UAAU,2DAGb,qBAACO,EAAA,CACC,QAAQ,UACR,KAAK,OACL,OAAO,OACP,SAAUL,EACV,UAAU,gCACV,QAASG,EACT,oBAACG,GAAA,CAAgB,UAAU,SAAS,YAAY,IAAI,OAAO,QAAQ,EACrE,KACA,QAAC,MAAG,UAAU,oDAAqD,SAAAC,GAAeT,EAAc,KAAM,EAAE,EAAE,GAC5G,KAEA,SAAC,OAAI,UAAU,2DAEb,qBAACO,EAAA,CAAO,UAAU,gBAAgB,OAAO,OAAO,QAAQ,QAAQ,KAAK,OAAO,KAAK,OAC/E,QAAS,IAAMN,EAAkB,IAAI,EACrC,oBAACS,GAAA,CAAS,UAAU,SAAS,EAC/B,KACA,QAAC,MAAG,UAAU,oDAAoD,gBAAI,GACxE,EAEJ,CAEJ,CCzDA,IAAAC,GAA+B,wBCE/B,IAAAC,GAA4C,wBAC5CC,GAAsD,oBAG7C,IAAAC,GAAA,6BADT,SAASC,GAAaC,EAAuE,CAAvE,IAAKC,EAAAC,EAALF,EAAK,IACzB,SAAO,QAAC,GAAAG,aAAsB,KAAtBC,EAAA,CAA2B,YAAU,iBAAoBH,EAAO,CAC1E,CAMA,SAASI,GAAoBC,EAA0E,CAA1E,IAAKC,EAAAC,EAALF,EAAK,IAChC,SAAO,QAAC,GAAAG,aAAsB,QAAtBC,EAAA,CAA8B,UAAU,cAAc,YAAU,yBAA4BH,EAAO,CAC7G,CA8CA,SAASI,GAAoBC,EAIkC,CAJlC,IAAAC,EAAAD,EAC3B,WAAAE,EACA,WAAAC,EAAa,CAjEf,EA+D6BF,EAGxBG,EAAAC,EAHwBJ,EAGxB,CAFH,YACA,eAGA,SACE,QAAC,GAAAK,aAAsB,OAAtB,CACC,oBAAC,GAAAA,aAAsB,QAAtBC,EAAA,CACC,YAAU,wBACV,WAAYJ,EACZ,UAAWK,EACT,ieACAN,CACF,GACIE,EACN,EACF,CAEJ,CAMA,SAASK,GAAiBC,EAQvB,CARuB,IAAAC,EAAAD,EACxB,WAAAE,EACA,MAAAC,EACA,QAAAC,CA1FF,EAuF0BH,EAIrBI,EAAAC,EAJqBL,EAIrB,CAHH,YACA,QACA,YAMA,SACE,QAAC,GAAAM,aAAsB,KAAtBC,EAAA,CACC,YAAU,qBACV,UAAWC,EACT,gVACA,wCACA,yEACAN,GAAS,OACTC,IAAY,eACV,mJACFF,CACF,GACIG,EACN,CAEJ,CAwEA,SAASK,GAAsBC,EAAuF,CAAvF,IAAAC,EAAAD,EAAE,WAAAE,CAvLjC,EAuL+BD,EAAgBE,EAAAC,EAAhBH,EAAgB,CAAd,cAC/B,SACE,QAAC,GAAAI,aAAsB,UAAtBC,EAAA,CACC,YAAU,0BACV,UAAWC,EAAG,6BAA8BL,CAAS,GACjDC,EACN,CAEJ,CC7LA,IAAAK,GAAiD,iBCIjD,IAAAC,GAA4C,gBAC5CC,GAA0C,wBAItC,IAAAC,GAAA,6BAFJ,SAASC,GAAQC,EAAwE,CAAxE,IAAAC,EAAAD,EAAE,WAAAE,CATnB,EASiBD,EAAgBE,EAAAC,EAAhBH,EAAgB,CAAd,cACjB,SACE,QAAC,GAAAI,QAAAC,EAAA,CACC,UAAWC,EACT,4FACAL,CACF,GACIC,EACN,CAEJ,CAIA,IAAMK,GAAiBR,GAAqG,CAArG,IAAAC,EAAAD,EAAE,UAAAS,EAAU,UAAAP,EAAW,aAAAQ,CAvB9C,EAuBuBT,EAAwCE,EAAAC,EAAxCH,EAAwC,CAAtC,WAAU,YAAW,iBAC5C,SACE,QAACU,GAAAC,EAAAN,EAAA,GAAWH,GAAX,CACC,qBAACU,GAAA,CAAc,UAAWN,EAAG,gCAAiCL,CAAS,EACrE,qBAACY,GAAA,CAAY,UAAU,SAAS,KAChC,QAACf,GAAA,CACC,aAAcW,EACd,UAAU,8WAET,SAAAD,EACH,GACF,GACF,CAEJ,EAEA,SAASM,GAAaf,EAA8E,CAA9E,IAAAC,EAAAD,EAAE,WAAAE,CAvCxB,EAuCsBD,EAAgBE,EAAAC,EAAhBH,EAAgB,CAAd,cACtB,SACE,SAAC,OAAI,UAAU,gDAAgD,qBAAmB,GAAG,YAAU,gBAC7F,qBAAC,WAAO,UAAU,mCAAmC,KACrD,QAAC,GAAAI,QAAiB,MAAjBC,EAAA,CACC,UAAWC,EACT,2KACAL,CACF,GACIC,EACN,GACF,CAEJ,CAEA,SAASa,GAAYhB,EAA6E,CAA7E,IAAAC,EAAAD,EAAE,WAAAE,CAtDvB,EAsDqBD,EAAgBE,EAAAC,EAAhBH,EAAgB,CAAd,cACrB,SACE,QAAC,GAAAI,QAAiB,KAAjBC,EAAA,CACC,YAAU,eACV,UAAWC,EAAG,kDAAmDL,CAAS,GACtEC,EACN,CAEJ,CAEA,SAASc,GAAajB,EAAmE,CAAnE,IAAKG,EAAAC,EAALJ,EAAK,IACzB,SAAO,QAAC,GAAAK,QAAiB,MAAjBC,EAAA,CAAuB,YAAU,gBAAgB,UAAU,4BAA+BH,EAAO,CAC3G,CAEA,SAASe,GAAalB,EAA8E,CAA9E,IAAAC,EAAAD,EAAE,WAAAE,CApExB,EAoEsBD,EAAgBE,EAAAC,EAAhBH,EAAgB,CAAd,cACtB,SACE,QAAC,GAAAI,QAAiB,MAAjBC,EAAA,CACC,YAAU,gBACV,UAAWC,EACT,2NACAL,CACF,GACIC,EACN,CAEJ,CAYA,SAASgB,GAAYC,EAA6E,CAA7E,IAAAC,EAAAD,EAAE,WAAAE,CA3FvB,EA2FqBD,EAAgBE,EAAAC,EAAhBH,EAAgB,CAAd,cACrB,SACE,QAAC,GAAAI,QAAiB,KAAjBC,EAAA,CACC,YAAU,eACV,UAAWC,EACT,gSACA,yDACAL,CACF,GACIC,EACN,CAEJ,CCvGA,IAAAK,GAAoC,iBAQ7B,SAASC,GAAqBC,EAAUC,EAAgB,IAAQ,CACrE,GAAM,CAACC,EAAgBC,CAAiB,KAAI,aAAYH,CAAK,EAE7D,uBAAU,IAAM,CAEd,IAAMI,EAAU,WAAW,IAAM,CAC/BD,EAAkBH,CAAK,CACzB,EAAGC,CAAK,EAGR,MAAO,IAAM,CACX,aAAaG,CAAO,CACtB,CACF,EAAG,CAACJ,EAAOC,CAAK,CAAC,EAEVC,CACT,CFVA,IAAAG,GAAsB,kBAgElB,IAAAC,EAAA,6BAxDW,SAARC,IAAgC,CACrC,GAAM,CAACC,EAAaC,CAAc,KAAI,aAAS,EAAE,EAC3C,CAACC,EAAaC,CAAc,KAAI,aAAyB,CAAC,CAAC,EAC3D,CAACC,EAAeC,CAAgB,KAAI,aAAmB,CAAC,CAAC,EACzD,CAACC,EAASC,CAAU,KAAI,aAAS,EAAK,EACtC,CAAE,SAAAC,EAAU,kBAAAC,EAAmB,qBAAAC,EAAsB,kBAAAC,EAAmB,qBAAAC,EAAsB,wBAAAC,CAAwB,EAAIC,EAAe,EAGzIC,EAAuBC,GAAkBhB,EAAa,GAAG,EAEzDiB,KAAW,gBAAY,MAAOC,GAAc,CAChDX,EAAW,EAAI,EACf,GAAI,CACF,GAAM,CAACY,EAAOC,CAAO,EAAI,MAAM,QAAQ,IAAI,CACzCZ,EAAS,UAAUU,CAAC,EACpBV,EAAS,YAAYU,CAAC,CACxB,CAAC,EACDf,EAAegB,CAAK,EACpBd,EAAiBe,CAAO,CAC1B,OAASC,EAAO,CACd,IAAMC,EAAUD,aAAiB,MAAQA,EAAM,QAAU,gBACzD,SAAM,MAAM,gBAAiB,CAC3B,YAAaC,CACf,CAAC,EACDnB,EAAe,CAAC,CAAC,EACjBE,EAAiB,CAAC,CAAC,CACrB,QAAE,CACAE,EAAW,EAAK,CAClB,CACF,EAAG,CAACC,CAAQ,CAAC,EAGb,uBAAU,IAAM,CACVG,GAAqBI,EAAqB,OAAS,EACrDE,EAASF,CAAoB,GAE7BZ,EAAe,CAAC,CAAC,EACjBE,EAAiB,CAAC,CAAC,EAEvB,EAAG,CAACU,EAAsBJ,EAAmBM,CAAQ,CAAC,KAiBpD,oBACE,qBAACM,EAAA,CACC,QAAQ,UACR,KAAK,OACL,OAAO,OACP,UAAU,2BACV,QAAS,IAAMX,EAAqB,EAAI,EACxC,oBAACY,GAAA,CAAW,UAAU,uBAAuB,KAC7C,OAAC,QAAK,UAAU,SAAS,kBAAM,GACjC,KAEA,QAACC,GAAA,CAAc,UAAU,mBAAmB,KAAMd,EAAmB,aAtB1Ce,GAAkB,CAC/Cd,EAAqBc,CAAI,EACpBA,IAEHzB,EAAe,EAAE,EACjBE,EAAe,CAAC,CAAC,EACjBE,EAAiB,CAAC,CAAC,EAEvB,EAc8G,aAAc,GACtH,oBAACsB,GAAA,CACC,YAAY,qCACZ,MAAO3B,EACP,cA9BmB4B,GAAkB,CAC3C3B,EAAe2B,CAAK,CACtB,EA6BM,KACA,QAACC,GAAA,CACE,UAAAvB,MAAW,OAACwB,GAAA,CAAa,wBAAY,EACrC,CAACxB,GAAWJ,EAAY,SAAW,GAAKE,EAAc,SAAW,GAAK,CAACJ,MACtE,OAAC8B,GAAA,CACC,oBAAC,OAAI,UAAU,kEACb,oBAACN,GAAA,CAAW,UAAU,6BAA6B,KACnD,OAAC,KAAE,UAAU,yCAAyC,yCAA6B,KACnF,OAAC,KAAE,UAAU,wBAAwB,wDAA4C,KACjF,OAAC,KAAE,UAAU,6BACX,mBAACO,GAAA,CACC,oBAACC,GAAA,CAAI,oBAAC,QAAK,UAAU,UAAU,kBAAC,EAAO,QAAI,EAC7C,EACF,GACF,EACF,EAED,CAAC1B,GAAWJ,EAAY,SAAW,GAAKE,EAAc,SAAW,GAAKJ,MACrE,OAAC8B,GAAA,CACC,oBAAC,OAAI,UAAU,kEACb,oBAACN,GAAA,CAAW,UAAU,6BAA6B,KACnD,OAAC,KAAE,UAAU,yCAAyC,4BAAgB,KACtE,OAAC,KAAE,UAAU,wBAAwB,iDAAqC,GAC5E,EACF,EAEDpB,EAAc,OAAS,MACtB,OAAC6B,GAAA,CAAa,QAAQ,UACnB,SAAA7B,EAAc,IAAK8B,MAClB,QAACC,GAAA,CAEC,SAAU,IAAM,CACdzB,EAAqB,EACrBE,EAAqB,EAAK,EAC1BH,EAAkByB,CAAM,CAC1B,EAEA,oBAACE,GAAA,CAAW,UAAU,wBAAwB,YAAa,IAAK,KAChE,OAAC,QAAM,SAAAC,GAAeH,EAAO,KAAM,EAAE,EAAE,IARlCA,EAAO,EASd,CACD,EACH,EAEDhC,EAAY,OAAS,MACpB,OAAC+B,GAAA,CAAa,QAAQ,QACnB,SAAA/B,EAAY,IAAKoC,GAAS,CACzB,GAAM,CAAE,UAAWC,CAAqB,EAAIC,GAAkBF,CAAI,EAClE,SACE,QAACH,GAAA,CAEC,SAAU,IAAM,CACdzB,EAAqB,EACrBG,EAAwByB,CAAI,CAC9B,EAEA,oBAAC,OAAI,UAAU,wDACb,mBAACC,EAAA,CAAqB,KAAMD,EAAM,SAAUA,EAAK,SAAU,EAC7D,KACA,OAAC,QAAM,SAAAD,GAAeC,EAAK,KAAM,EAAE,EAAE,IAThCA,EAAK,EAUZ,CAEJ,CAAC,EACH,GAEJ,GACF,GAEF,CAEJ,CG/JA,IAAAG,GAAkC,oCAClCC,GAA6B,wBAC7BC,GAA8C,oBAgCxC,IAAAC,GAAA,6BA7BAC,MAAmB,QACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,CACE,SAAU,CACR,KAAM,CACJ,GAAI,0BACJ,GAAI,0BACJ,GAAI,yBACN,CACF,EACA,gBAAiB,CACf,KAAM,IACR,CACF,CACF,EAEA,SAASC,GAASC,EAI8E,CAJ9E,IAAAC,EAAAD,EAChB,WAAAE,EACA,KAAAC,CAjCF,EA+BkBF,EAGbG,EAAAC,EAHaJ,EAGb,CAFH,YACA,SAGA,SACE,QAAC,GAAAK,SAAkB,KAAlBC,EAAAC,EAAA,CAAuB,YAAU,WAAW,UAAWC,EAAGX,GAAiB,CAAE,KAAAK,CAAK,CAAC,EAAGD,CAAS,GAAOE,GAAtG,CACC,qBAAC,GAAAE,SAAkB,UAAlB,CAA4B,UAAWG,EAAG,+CAA+C,EACxF,qBAAC,UAAM,UAAU,0CAA0C,KAC3D,QAAC,UAAM,UAAU,gDAAgD,GACnE,GACF,CAEJ,CCvBI,IAAAC,GAAA,6BAYG,SAASC,IAAe,CAC7B,SAAO,QAACC,GAAA,EAAa,CACvB,CAkCO,SAASC,IAAmB,CACjC,GAAM,CAAE,qBAAAC,CAAqB,EAAIC,EAAe,EAEhD,SACE,SAACC,EAAA,CACC,QAAQ,UACR,KAAK,KACL,OAAO,OACP,UAAU,+CACV,QAAS,IAAMF,EAAqB,EAAI,EAExC,qBAACG,GAAA,CAAS,UAAU,uBAAuB,OAAO,QAAQ,YAAY,IAAI,KAC1E,QAAC,QAAK,UAAU,mBAAmB,uBAAW,GAChD,CAEJ,CAEO,SAASC,IAAqB,CACnC,GAAM,CAAE,2BAAAC,CAA2B,EAAIJ,EAAe,EAEtD,SACE,SAACC,EAAA,CACC,QAAQ,UACR,KAAK,OACL,OAAO,OACP,UAAU,2BACV,QAAS,IAAMG,EAA2B,EAAI,EAE9C,qBAACC,GAAA,CAAiB,UAAU,wBAAwB,KACpD,QAAC,QAAK,UAAU,SAAS,yBAAa,GACxC,CAEJ,CN1EI,IAAAC,EAAA,6BAJG,SAASC,IAA0B,CACxC,GAAM,CAAE,qBAAAC,EAAsB,2BAAAC,EAA4B,qBAAAC,CAAqB,EAAIC,EAAe,EAElG,SACE,oBAEE,qBAAC,OAAI,UAAU,uBACb,oBAACC,GAAA,EAAiB,KAClB,OAACC,GAAA,EAAmB,KACpB,OAACC,GAAA,EAAa,GAChB,KAGA,OAAC,OAAI,UAAU,iBACb,oBAACC,GAAA,CACC,oBAACC,GAAA,CAAoB,QAAO,GAC1B,mBAACC,EAAA,CACC,QAAQ,UACR,KAAK,OACL,OAAO,OACP,UAAU,2BAEV,mBAAC,mBAAe,UAAU,SAAS,EACrC,EACF,KACA,QAACC,GAAA,CAAoB,MAAM,MAAM,UAAU,2EACzC,qBAACC,GAAA,CACC,QAAS,IAAMX,EAAqB,EAAI,EACxC,UAAU,iBAEV,oBAACY,GAAA,CAAS,UAAU,uBAAuB,OAAO,QAAQ,YAAY,IAAI,KAC1E,OAAC,QAAK,UAAU,SAAS,uBAAW,GACtC,KACA,QAACD,GAAA,CACC,QAAS,IAAMV,EAA2B,EAAI,EAC9C,UAAU,iBAEV,oBAACY,GAAA,CAAiB,UAAU,uBAAuB,KACnD,OAAC,QAAK,UAAU,SAAS,yBAAa,GACxC,KACA,QAACF,GAAA,CACC,QAAS,IAAMT,EAAqB,EAAI,EACxC,UAAU,iBAEV,oBAACY,GAAA,CAAW,UAAU,uBAAuB,KAC7C,OAAC,QAAK,UAAU,SAAS,kBAAM,GACjC,GACF,GACF,EACF,GACF,CAEJ,CAIO,SAASC,GAA6B,CAAE,cAAAC,CAAc,EAAmC,CAC9F,GAAM,CAAE,qBAAAhB,EAAsB,2BAAAC,CAA2B,EAAIE,EAAe,EAE5E,SACE,oBAEE,qBAAC,OAAI,UAAU,uBACb,oBAACC,GAAA,EAAiB,KAClB,OAACC,GAAA,EAAmB,EACnBW,KACC,QAACP,EAAA,CACC,QAAQ,UACR,KAAK,OACL,OAAO,OACP,UAAU,2BACV,QAASO,EAET,oBAACF,GAAA,CAAW,UAAU,uBAAuB,KAC7C,OAAC,QAAK,UAAU,SAAS,kBAAM,GACjC,EACE,MACN,KAGA,OAAC,OAAI,UAAU,iBACb,oBAACP,GAAA,CACC,oBAACC,GAAA,CAAoB,QAAO,GAC1B,mBAACC,EAAA,CACC,QAAQ,UACR,KAAK,OACL,OAAO,OACP,UAAU,2BAEV,mBAAC,mBAAe,UAAU,SAAS,EACrC,EACF,KACA,QAACC,GAAA,CAAoB,MAAM,MAAM,UAAU,OACzC,qBAACC,GAAA,CACC,QAAS,IAAMX,EAAqB,EAAI,EACxC,UAAU,iBAEV,oBAACY,GAAA,CAAS,UAAU,uBAAuB,OAAO,QAAQ,YAAY,IAAI,KAC1E,OAAC,QAAK,UAAU,SAAS,uBAAW,GACtC,KACA,QAACD,GAAA,CACC,QAAS,IAAMV,EAA2B,EAAI,EAC9C,UAAU,iBAEV,oBAACY,GAAA,CAAiB,UAAU,uBAAuB,KACnD,OAAC,QAAK,UAAU,SAAS,yBAAa,GACxC,EACCG,KACC,QAACL,GAAA,CACC,QAASK,EACT,UAAU,iBAEV,oBAACF,GAAA,CAAW,UAAU,uBAAuB,KAC7C,OAAC,QAAK,UAAU,SAAS,kBAAM,GACjC,EACE,MACN,GACF,EACF,GACF,CAEJ,CO5IA,IAAAG,GAAqB,wBCFrB,IAAAC,GAAkB,qBAClBC,GAA6B,wBCA7B,IAAAC,GAAsC,4CACtCC,GAAwD,wBAI/C,IAAAC,GAAA,6BADT,SAASC,GAAYC,EAAsE,CAAtE,IAAKC,EAAAC,EAALF,EAAK,IACxB,SAAO,QAAsB,QAArBG,EAAA,CAA0B,YAAU,gBAAmBF,EAAO,CACxE,CAEA,SAASG,GAAmBJ,EAAyE,CAAzE,IAAKC,EAAAC,EAALF,EAAK,IAC/B,SAAO,QAAsB,WAArBG,EAAA,CAA6B,YAAU,wBAA2BF,EAAO,CACnF,CAuDA,SAASI,GAAmBC,EAAoF,CAApF,IAAAC,EAAAD,EAAE,WAAAE,CApE9B,EAoE4BD,EAAgBE,EAAAC,EAAhBH,EAAgB,CAAd,cAC5B,SACE,QAAsB,UAArB,CACC,oBAAsB,WAArBI,EAAA,CACC,YAAU,uBACV,UAAWC,EACT,ujBACAJ,CACF,GACIC,EACN,EACF,CAEJ,CAEA,SAASI,GAAgBP,EAQtB,CARsB,IAAAC,EAAAD,EACvB,WAAAE,EACA,MAAAM,EACA,QAAAC,EAAU,SAtFZ,EAmFyBR,EAIpBE,EAAAC,EAJoBH,EAIpB,CAHH,YACA,QACA,YAMA,SACE,QAAsB,QAArBI,EAAA,CACC,YAAU,oBACV,aAAYG,EACZ,eAAcC,EACd,UAAWH,EACT,8mBACAJ,CACF,GACIC,EACN,CAEJ,CAqEA,SAASO,GAAqBC,EAAsF,CAAtF,IAAAC,EAAAD,EAAE,WAAAE,CA7KhC,EA6K8BD,EAAgBE,EAAAC,EAAhBH,EAAgB,CAAd,cAC9B,SACE,QAAsB,aAArBI,EAAA,CACC,YAAU,yBACV,UAAWC,EAAG,4BAA6BJ,CAAS,GAChDC,EACN,CAEJ,CD5HU,IAAAI,GAAA,6BArBH,SAASC,GAAgB,CAC9B,SAAAC,EACA,UAAAC,EACA,kBAAAC,EAAoB,GACpB,KAAAC,CACF,EAAyB,CACvB,IAAMC,EAAiB,CAACF,GAAqBC,IAAS,QAEhDE,EAAkB,CAACC,EAAsB,KACtCL,EAAU,IAAI,CAACM,EAAMC,IAAU,CACpC,IAAMC,EAASD,IAAUP,EAAU,OAAS,EACtCS,EAAgBH,EAAK,UAAY,cAEjCI,EAAoBL,EAAaM,GAAmBC,GACpDC,EAAqBR,EAAaS,GAAwBC,GAG1DC,EAAwBT,EAAQP,EAAU,OAAS,GAAKA,EAAUO,EAAQ,CAAC,EAAE,UAAY,cAE/F,SACE,SAAC,GAAAU,QAAM,SAAN,CACC,sBAACP,EAAA,CACC,QAASJ,EAAK,QACd,UACEA,EAAK,WACL,uBACEG,EACI,kDACA,EACN,IAAIF,IAAU,EAAI,eAAiB,EAAE,IAAIC,EAAS,eAAiB,EAAE,GAGtE,UAAAF,EAAK,KACLA,EAAK,OACR,EACCU,GAAyB,CAACR,MACzB,QAACK,EAAA,CAAmB,UAAU,cAAc,IAhB3BN,CAkBrB,CAEJ,CAAC,EAGH,SACE,SAACW,GAAA,CACC,qBAACC,GAAA,CACC,qBAAC,OAAI,UAAU,yBACZ,UAAApB,EAGAI,MACC,QAAC,OACC,UAAU,wCACV,QAAUiB,GAAMA,EAAE,gBAAgB,EAElC,qBAACC,GAAA,CACC,qBAACC,GAAA,CAAoB,QAAO,GAC1B,oBAACC,EAAA,CACC,QAAQ,QACR,KAAK,OACL,OAAO,OACP,UAAU,mDAEV,oBAAC,iBAAa,UAAU,uBAAuB,EACjD,EACF,KACA,QAACC,GAAA,CAAoB,UAAU,2EAC5B,SAAApB,EAAgB,EAAI,EACvB,GACF,EACF,GAEJ,EACF,EAGCD,MACC,QAACsB,GAAA,CAAmB,UAAU,2EAC3B,SAAArB,EAAgB,EAAK,EACxB,GAEJ,CAEJ,CExGY,IAAAsB,GAAA,6BAdG,SAARC,GACHC,EACF,CACE,SACI,QAAC,MAAAC,EAAAC,EAAA,CACG,MAAM,6BACN,EAAE,MACF,EAAE,MACF,MAAM,MACN,OAAO,MACP,QAAQ,YACR,KAAK,gBACDF,GARP,CAUG,oBAAC,QAAK,EAAE,yPACR,GACJ,CAER,CCLY,IAAAG,GAAA,6BAXG,SAARC,GACHC,EACF,CACE,SACI,QAAC,MAAAC,EAAAC,EAAA,CACD,MAAM,6BACN,MAAM,KACN,OAAO,KACP,QAAQ,aACJF,GALH,CAOG,oBAAC,QAAK,KAAK,eAAe,SAAS,UAAU,EAAE,mNAAmN,SAAS,UAAS,GACxR,CAGR,CJwEY,IAAAG,GAAA,6BAvDL,SAASC,GAAS,CACvB,KAAAC,EACA,WAAAC,EACA,SAAAC,EACA,SAAAC,EACA,OAAAC,EACA,OAAAC,EACA,cAAAC,EACA,aAAAC,EAAe,GACf,KAAAC,EAAOC,GAAK,KACZ,kBAAAC,EAAoB,EACtB,EAAkB,CAEhB,IAAMC,EAAgBC,GAAwB,CAC5CA,EAAE,gBAAgB,EACd,QAAQ,oCAAoCZ,EAAK,IAAI,IAAI,GAC3DG,EAASH,EAAK,EAAE,CAEpB,EAEMa,EAAcD,GAAwB,CAC1CA,EAAE,gBAAgB,EAClBR,EAAOJ,CAAI,CACb,EAEMc,EAAoBF,GAAwB,CAChDA,EAAE,gBAAgB,EAClBV,EAASF,EAAM,OAAW,EAAI,CAChC,EAEMe,EAAcH,GAAwB,CAC1CA,EAAE,gBAAgB,EAClBP,EAAOL,CAAI,CACb,EAEMgB,EAAeJ,GAAwB,CAC3CV,EAASF,EAAMY,EAAG,EAAK,CACzB,EAEMK,EAAwBC,GAA8B,CAC1DhB,EAASF,EAAM,OAAW,EAAI,CAChC,EAEMmB,EAAuBP,GAAwB,CACnDA,EAAE,gBAAgB,CACpB,EAGM,CAAE,UAAWQ,EAAsB,kBAAmBC,CAAsB,EAAIC,GACpFtB,CACF,EA0BA,SACE,QAACuB,GAAA,CACC,UA1B8B,CAChC,CACE,MAAO,OACP,QAAM,QAACC,GAAA,CAAS,UAAU,SAAS,EACnC,QAASX,CACX,EACA,CACE,MAAO,cACP,QAAM,QAACY,GAAA,CAAW,UAAU,SAAS,EACrC,QAASX,CACX,EACA,CACE,MAAO,aACP,QAAM,QAAC,SAAK,UAAU,cAAc,EACpC,QAASC,CACX,EACA,CACE,MAAO,SACP,QAAM,QAACW,GAAA,CAAU,UAAU,2BAA2B,EACtD,QAASf,EACT,QAAS,aACX,CACF,EAKI,kBAAmBD,EACnB,KAAMF,EAEN,qBAAC,OACC,UAAU,wHACV,cAAeQ,EACf,QAASA,EAIT,sBAAC,OAAI,UAAW;AAAA;AAAA,gBAERf,EAAa,iBAAmB,EAAE;AAAA,YAExC,qBAAC,OAAI,UAAU,mDACb,oBAACmB,EAAA,CAAqB,KAAMpB,EAAM,SAAUA,EAAK,SAAU,EAC7D,GAEEM,IAAkBqB,GAAe,UAAYpB,OAC7C,QAAC,OAAI,UAAW,8BAA8BN,EAAa,cAAgB,mCAAmC,mCAAoC,QAASkB,EACzJ,oBAACS,GAAA,CACC,QAAS3B,EACT,gBAAiBgB,EACjB,UAAU,mIACZ,EACF,GAEJ,KAGA,SAAC,OAAI,UAAU,uDACb,qBAAC,QAAK,UAAW;AAAA;AAAA,oBAEPhB,EACJ,gDACA,uCAAuC;AAAA,gBAE1C,SAAAD,EAAK,KACR,KAGA,SAAC,OAAI,UAAW,0FAA0FC,EAAa,aAAe,aAAa,GACjJ,qBAAC,QAAK,UAAU,uDAAwD,SAAA4B,GAAY7B,EAAK,IAAI,EAAE,EAC9FqB,KACC,QAAC,OAAI,UAAU,uDACb,oBAACA,EAAA,CAAsB,KAAMrB,EAAM,EACrC,EACE,MACN,GACF,GACF,EACF,CAEJ,CKnKA,IAAA8B,GAAqB,wBAkFT,IAAAC,GAAA,6BApDL,SAASC,GAAW,CACzB,OAAAC,EACA,WAAAC,EACA,SAAAC,EACA,aAAAC,EACA,SAAAC,EACA,SAAAC,EACA,OAAAC,EACA,cAAAC,EACA,aAAAC,EACA,KAAAC,EACA,kBAAAC,CACF,EAAoB,CAGlB,IAAMC,EAAgBC,GAAwB,CAC5CA,EAAE,gBAAgB,EACd,QAAQ,oCAAoCZ,EAAO,IAAI;AAAA;AAAA,kDAA+CA,EAAO,SAAS,8BAA8B,GACtJI,EAASJ,EAAO,EAAE,CAEtB,EAEMa,EAAgBD,GAAwB,CAC5CA,EAAE,gBAAgB,EAClBP,EAASL,CAAM,CACjB,EAEMc,EAAcF,GAAwB,CAC1CA,EAAE,gBAAgB,EAClBN,EAAON,CAAM,CACf,EAEMe,EAAsBH,GAAwB,CAClDA,EAAE,gBAAgB,EAClBV,EAASF,EAAQ,OAAW,EAAI,CAClC,EAEMgB,EAAeJ,GAAwB,CAC3CV,EAASF,EAAQY,EAAG,EAAK,CAC3B,EAEMK,EAAwBC,GAA8B,CAC1DhB,EAASF,EAAQ,OAAW,EAAI,CAClC,EAEMmB,EAAuBP,GAAwB,CACnDA,EAAE,gBAAgB,CACpB,EA0BA,SACE,QAACQ,GAAA,CACC,UA1B8B,CAChC,CACE,MAAO,SACP,QAAM,QAACC,GAAA,CAAS,UAAU,SAAS,EACnC,QAASR,CACX,EACA,CACE,MAAO,gBACP,QAAM,QAACS,GAAA,CAAW,UAAU,SAAS,EACrC,QAASP,CACX,EACA,CACE,MAAO,aACP,QAAM,QAAC,SAAK,UAAU,cAAc,EACpC,QAASD,CACX,EACA,CACE,MAAO,SACP,QAAM,QAACS,GAAA,CAAU,UAAU,2BAA2B,EACtD,QAASZ,EACT,QAAS,aACX,CACF,EAKI,kBAAmBD,EACnB,KAAMD,EAEN,qBAAC,OACC,UAAU,wHACV,cAAeO,EACf,QAASA,EAIT,sBAAC,OAAI,UAAW;AAAA;AAAA;AAAA,gBAGRf,EAAa,kBAAoB,EAAE;AAAA,YAEzC,qBAAC,OAAI,UAAU,8DACb,oBAACuB,GAAA,CAAW,UAAU,8DAA8D,YAAa,IAAK,EACxG,GAEEjB,IAAkBkB,GAAe,UAAYjB,OAC7C,QAAC,OAAI,UAAW,8BAA8BP,EAAa,cAAgB,mCAAmC,mCAAoC,QAASkB,EACzJ,oBAACO,GAAA,CACC,QAASzB,EACT,gBAAiBgB,EACjB,UAAU,mIACZ,EACF,GAEJ,KAGA,SAAC,OAAI,UAAU,uDACb,qBAAC,QAAK,UAAW;AAAA;AAAA,oBAEPhB,EACJ,gDACA,uCAAuC;AAAA,gBAE1C,SAAAD,EAAO,KACV,KAEA,QAAC,OAAI,UAAW,+EAA+EC,EAAa,aAAe,aAAa,GACtI,qBAAC,QAAK,UAAU,4EAA6E,UAAAD,EAAO,UAAU,UAAM,EACtH,GACF,GACF,EACF,CAEJ,CC3GwB,IAAA2B,GAAA,6BA/CjB,SAASC,IAAc,CAE1B,GAAM,CACF,MAAAC,EACA,QAAAC,EACA,UAAAC,EACA,gBAAAC,EACA,kBAAAC,EACA,WAAAC,EACA,KAAAC,EACA,cAAAC,EACA,kBAAAC,EACA,cAAAC,EACA,gBAAAC,EACA,cAAAC,EACA,iBAAAC,EACA,mBAAAC,EACA,2BAAAC,EACA,uBAAAC,EACA,wBAAAC,EACA,kBAAAC,CACJ,EAAIC,EAAe,EAmBbC,GAfmB,IAAM,CAC3B,GAAI,CAACR,EAED,MAAO,IAIX,IAAMS,EAAkBT,EAAc,aAAe,EAC/CU,EAAgBV,EAAc,WAAa,EAC3CW,EAAaF,EAAkBC,EAGrC,OAAOC,EAAa,EAAIA,EAAa,EACzC,GAEuC,EAEvC,OAAIpB,KAEI,QAAC,OAAI,UAAU,iIACV,eAAM,KAAK,CAAE,OAAQiB,CAAc,CAAC,EAAE,IAAI,CAACI,EAAGC,OAC3C,SAAC,OAAY,UAAU,wDACnB,qBAAC,OAAI,UAAU,6DAA6D,KAC5E,SAAC,OAAI,UAAU,0CACX,qBAAC,OAAI,UAAU,6CAA6C,KAC5D,QAAC,OAAI,UAAU,6CAA6C,GAChE,IALMA,CAMV,CACH,EACL,KAKJ,SAAC,OAAI,UAAU,iIACV,UAAAvB,EAAQ,IAAKwB,MACV,QAACC,GAAA,CAEG,OAAQD,EACR,WAAYf,EAAgB,KAAKiB,GAAKA,EAAE,KAAOF,EAAO,EAAE,EACxD,SAAUrB,EACV,SAAU,IAAMC,EAAW,EAC3B,SAAWoB,GAAW,CAClBR,EAAkBQ,CAAM,EACxBX,EAA2B,EAAI,CACnC,EACA,OAASW,GAAW,CAChBZ,EAAmB,CAACY,CAAM,CAAC,EAC3Bb,EAAiB,CAAC,CAAC,EACnBG,EAAuB,EAAI,CAC/B,EACA,cAAeR,EACf,KAAMD,EACN,kBAAmBE,EAAkB,GAhBhCiB,EAAO,EAiBhB,CACH,EACAzB,EAAM,IAAK4B,MACR,QAACC,GAAA,CAEG,KAAMD,EACN,WAAYnB,EAAc,KAAKkB,GAAKA,EAAE,KAAOC,EAAK,EAAE,EACpD,SAAUzB,EACV,SAAU,IAAME,EAAW,EAC3B,OAASuB,GAAS,CACdZ,EAAwBY,CAAI,CAChC,EACA,OAASA,GAAS,CACdhB,EAAiB,CAACgB,CAAI,CAAC,EACvBf,EAAmB,CAAC,CAAC,EACrBE,EAAuB,EAAI,CAC/B,EACA,cAAeR,EACf,KAAMD,EACN,kBAAmBE,EAAkB,GAfhCoB,EAAK,EAgBd,CACH,GACL,CAER,CCzGA,IAAAE,GAA4C,iBAE5C,IAAAC,GAAuC,wBAuDzBC,GAAA,6BAvCDC,GAAN,cAAuC,YAAkD,CAC9F,YAAYC,EAA2B,CACrC,MAAMA,CAAK,EAoBb,iBAAc,IAAY,CAGxB,OAAO,SAAS,OAAO,CACzB,EAvBE,KAAK,MAAQ,CACX,SAAU,GACV,MAAO,IACT,CACF,CAEA,OAAO,yBAAyBC,EAAkC,CAEhE,MAAO,CACL,SAAU,GACV,MAAAA,CACF,CACF,CAEA,kBAAkBA,EAAcC,EAAkC,CAEhE,QAAQ,MAAM,8CAA+CD,EAAOC,CAAS,CAC/E,CAQA,QAAoB,CAClB,OAAI,KAAK,MAAM,SAET,KAAK,MAAM,SACN,KAAK,MAAM,YAIlB,QAAC,OAAI,UAAU,mIACb,qBAAC,OAAI,UAAU,kDACb,qBAAC,OAAI,UAAU,mCACb,oBAAC,gBAAY,UAAU,sBAAsB,EAC/C,KACA,QAAC,MAAG,UAAU,4CAA4C,gCAE1D,KACA,QAAC,KAAE,UAAU,8BAA8B,8GAE3C,EACC,KAAK,MAAM,UACV,SAAC,WAAQ,UAAU,0FACjB,qBAAC,WAAQ,UAAU,wGAAwG,kCAE3H,KACA,QAAC,OAAI,UAAU,eACb,oBAAC,OAAI,UAAU,iGACZ,cAAK,MAAM,MAAM,SAAS,EAC7B,EACF,GACF,KAEF,SAACC,EAAA,CAAO,QAAS,KAAK,YAAa,OAAO,OAAO,UAAU,QACzD,qBAAC,cAAU,UAAU,SAAS,EAAE,sBAElC,GACF,EACF,EAIG,KAAK,MAAM,QACpB,CACF,ECxFA,IAAAC,GAA0B,iBAOnB,SAASC,IAAoB,CAClC,GAAM,CACJ,sBAAAC,EACA,qBAAAC,EACA,kBAAAC,EACA,wBAAAC,EACA,2BAAAC,EACA,kBAAAC,EACA,qBAAAC,EACA,kBAAAC,EACA,qBAAAC,CACF,EAAIC,EAAe,EAEnB,uBAAU,IAAM,CACd,IAAMC,EAAiBC,GAAqB,CAEtCA,EAAE,MAAQ,MAAQA,EAAE,SAAWA,EAAE,WACnCA,EAAE,eAAe,EACjBH,EAAqB,CAACD,CAAiB,GAIrCI,EAAE,MAAQ,MAAQA,EAAE,SAAWA,EAAE,WACnCA,EAAE,eAAe,EAGMT,EAAkB,IAClB,GAErBD,EAAqB,EAGrBD,EAAsB,EAAI,GAK1BW,EAAE,MAAQ,MAAQA,EAAE,SAAWA,EAAE,WACnCA,EAAE,eAAe,EACjBP,EAA2B,CAACD,CAAuB,GAIjDQ,EAAE,MAAQ,MAAQA,EAAE,SAAWA,EAAE,WACnCA,EAAE,eAAe,EACjBL,EAAqB,CAACD,CAAiB,EAE3C,EAEA,gBAAS,iBAAiB,UAAWK,CAAa,EAC3C,IAAM,SAAS,oBAAoB,UAAWA,CAAa,CACpE,EAAG,CAACV,EAAuBC,EAAsBC,EAAmBC,EAAyBC,EAA4BC,EAAmBC,EAAsBC,EAAmBC,CAAoB,CAAC,EAEnM,IACT,CC/CQ,IAAAI,GAAA,6BALD,SAASC,GAAYC,EAA6B,CACvD,SACE,QAACC,GAAA,CACC,qBAACC,GAAuB,KAAvBC,EAAAC,EAAA,GAAgCJ,GAAhC,CAEC,qBAACK,GAAA,EAAkB,KACnB,SAAC,OAAI,UAAU,6CAEb,sBAAC,OAAI,UAAU,8BACb,qBAACH,GAAuB,OAAvB,CACC,qBAAC,OAAI,UAAU,oCACb,qBAACI,GAAA,EAAiB,KAClB,QAACC,GAAA,EAAwB,GAC3B,EACF,KACA,QAACC,GAAA,CAAoB,UAAU,QAAQ,KACvC,QAACC,GAAA,EAAY,KACb,QAACP,GAAuB,OAAvB,CAA8B,UAAU,aAAa,GACxD,KAEA,QAACA,GAAuB,SAAvB,EAAgC,GACnC,IACF,EACF,CAEJ,CCxBA,IAAAQ,GAA4C,iBAYpC,IAAAC,EAAA,6BARD,SAASC,GAAiBC,EAIP,CAJO,IAAAC,EAAAD,EAC/B,MAAAE,EACA,QAAAC,CAlBF,EAgBiCF,EAG5BG,EAAAC,EAH4BJ,EAG5B,CAFH,OACA,YAGA,SACE,OAACK,GAAuB,MAAvBC,EAAAC,EAAA,GAAiCJ,GAAjC,CAAwC,QAASD,EAChD,mBAACM,GAAA,CAAO,KAAMP,EAAM,aAAcC,EAChC,mBAACO,GAAA,CAAa,QAASP,EAAS,EAClC,GACF,CAEJ,CAEA,SAASO,GAAa,CAAE,QAAAP,CAAQ,EAA4B,CAC1D,GAAM,CAAE,kBAAAQ,CAAkB,EAAIC,EAAe,EACvC,CAACC,EAAgBC,CAAiB,KAAI,aAAS,EAAK,EACpD,CAACC,EAAaC,CAAc,KAAI,aAAS,EAAE,EAC3CC,KAAiB,WAAyB,IAAI,EAG9CC,EAAkBC,GAAkBJ,EAAa,GAAG,EAG1D,uBAAU,IAAM,CACdJ,EAAkBO,CAAe,CACnC,EAAG,CAACA,EAAiBP,CAAiB,CAAC,KAGvC,cAAU,IAAM,CACVE,GAAkBI,EAAe,SACnCA,EAAe,QAAQ,MAAM,CAEjC,EAAG,CAACJ,CAAc,CAAC,KAGjB,QAACO,GAAA,CAAc,UAAU,MAAM,QAAQ,aAAa,gBAAiB,GACnE,qBAACC,GAAA,CAAa,UAAU,uCACtB,oBAACC,GAAA,CAAY,UAAU,iBACrB,mBAAC,OAAI,UAAU,oCACZ,SAAAT,KAEC,QAAC,OAAI,UAAU,iCACb,oBAACU,GAAA,CAAW,UAAU,gCAAgC,KACtD,OAACC,GAAA,CACC,IAAKP,EACL,KAAK,OACL,YAAY,8BACZ,UAAU,kFACV,MAAOF,EACP,SAAWU,GAAMT,EAAeS,EAAE,OAAO,KAAK,EAC9C,UAAYA,GAAM,CACZA,EAAE,MAAQ,WACZT,EAAe,EAAE,EACjBL,EAAkB,EAAE,EACpBG,EAAkB,EAAK,EAE3B,EACF,KACA,QAACY,EAAA,CACC,QAAQ,UACR,KAAK,OACL,OAAO,OACP,QAAS,IAAM,CACbV,EAAe,EAAE,EACjBL,EAAkB,EAAE,EACpBG,EAAkB,EAAK,CACzB,EACA,UAAU,oCAEV,oBAACa,GAAA,CAAU,UAAU,SAAS,KAC9B,OAAC,QAAK,UAAU,UAAU,yBAAa,GACzC,GACF,KAGA,oBACE,oBAACC,GAAA,EAAiB,KAClB,OAACC,GAAA,CAA6B,cAAe,IAAMf,EAAkB,EAAI,EAAG,KAC5E,QAACY,EAAA,CACC,QAAQ,UACR,KAAK,OACL,OAAO,OACP,QAASvB,EACT,UAAU,2BAEV,oBAACwB,GAAA,CAAU,UAAU,SAAS,KAC9B,OAAC,QAAK,UAAU,SAAS,iBAAK,GAChC,GACF,EAEJ,EACF,KACA,OAACG,GAAA,CAAkB,UAAU,UAAU,2DAEvC,GACF,KAEA,QAAC,OAAI,UAAU,8BACb,oBAACC,GAAA,EAAY,KACb,OAACzB,GAAuB,OAAvB,CAA8B,UAAU,OAAO,KAChD,OAACA,GAAuB,SAAvB,EAAgC,GACnC,KAEA,OAAC0B,GAAA,CAAuB,QAAS7B,EAAS,GAC5C,CAEJ,CAEA,SAAS6B,GAAuB,CAAE,QAAA7B,CAAQ,EAA4B,CACpE,GAAM,CACJ,cAAA8B,EACA,gBAAAC,EACA,iBAAAC,EACA,mBAAAC,EACA,kBAAAzB,EACA,iBAAA0B,CACF,EAAIzB,EAAe,EAgBnB,SACE,QAAC0B,GAAA,CAAa,UAAU,oHACtB,oBAACC,GAAA,EAAkB,KACnB,OAACC,GAAA,CAAY,QAAO,GAClB,mBAACd,EAAA,CAAO,KAAK,SAAS,QAAQ,UAAU,QAASvB,EAAS,OAAO,OAAO,UAAU,wBAAwB,kBAE1G,EACF,KACA,QAACuB,EAAA,CACC,KAAK,SACL,QAxBe,IAAM,CACrBQ,GAAmBD,EAAc,OAAS,IAC5CC,EAAgBD,CAAa,EAG7BE,EAAiB,CAAC,CAAC,EACnBC,EAAmB,CAAC,CAAC,EACrBzB,EAAkB,EAAE,EACpB0B,EAAiB,CAAC,EAElBlC,EAAQ,EAEZ,EAaM,SAAU8B,EAAc,SAAW,EACnC,OAAO,OAAO,UAAU,mBACzB,oBACSA,EAAc,OAAS,EAAI,IAAIA,EAAc,MAAM,IAAM,IACnE,GACF,CAEJ,CCpKO,IAAMQ,GAAwB,CACnC,CACE,GAAI,EACJ,KAAM,YACN,OAAQ,EACR,KAAM,KACN,SAAU,KACV,UAAW,GACX,YAAa,EACb,UAAW,IAAI,KAAK,YAAY,EAChC,UAAW,IAAI,KAAK,YAAY,CAClC,EACA,CACE,GAAI,EACJ,KAAM,SACN,OAAQ,EACR,KAAM,KACN,SAAU,KACV,UAAW,GACX,YAAa,EACb,UAAW,IAAI,KAAK,YAAY,EAChC,UAAW,IAAI,KAAK,YAAY,CAClC,EACA,CACE,GAAI,EACJ,KAAM,SACN,OAAQ,EACR,KAAM,KACN,SAAU,KACV,UAAW,EACX,YAAa,EACb,UAAW,IAAI,KAAK,YAAY,EAChC,UAAW,IAAI,KAAK,YAAY,CAClC,EACA,CACE,GAAI,EACJ,KAAM,8HACN,OAAQ,EACR,KAAM,KACN,SAAU,KACV,UAAW,EACX,YAAa,EACb,UAAW,IAAI,KAAK,YAAY,EAChC,UAAW,IAAI,KAAK,YAAY,CAClC,EACA,CACE,GAAI,EACJ,KAAM,WACN,OAAQ,EACR,KAAM,KACN,SAAU,KACV,UAAW,EACX,YAAa,EACb,UAAW,IAAI,KAAK,YAAY,EAChC,UAAW,IAAI,KAAK,YAAY,CAClC,EACA,CACE,GAAI,EACJ,KAAM,WACN,OAAQ,EACR,KAAM,OACN,SAAU,EACV,UAAW,EACX,YAAa,EACb,UAAW,IAAI,KAAK,YAAY,EAChC,UAAW,IAAI,KAAK,YAAY,CAClC,EACA,CACE,GAAI,EACJ,KAAM,WACN,OAAQ,EACR,KAAM,OACN,SAAU,EACV,UAAW,EACX,YAAa,EACb,UAAW,IAAI,KAAK,YAAY,EAChC,UAAW,IAAI,KAAK,YAAY,CAClC,EACA,CACE,GAAI,EACJ,KAAM,YACN,OAAQ,EACR,KAAM,OACN,SAAU,EACV,UAAW,EACX,YAAa,EACb,UAAW,IAAI,KAAK,YAAY,EAChC,UAAW,IAAI,KAAK,YAAY,CAClC,CACF,EAEaC,GAAkB,CAC7B,CAAE,GAAI,EAAG,KAAM,YAAa,MAAO,SAAU,EAC7C,CAAE,GAAI,EAAG,KAAM,OAAQ,MAAO,SAAU,EACxC,CAAE,GAAI,EAAG,KAAM,WAAY,MAAO,SAAU,EAC5C,CAAE,GAAI,EAAG,KAAM,UAAW,MAAO,SAAU,EAC3C,CAAE,GAAI,EAAG,KAAM,UAAW,MAAO,SAAU,CAC7C,EAEaC,GAA4B,CAEvC,CACE,GAAI,IACJ,KAAM,cACN,IAAK,wCACL,KAAM,MACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,KACV,KAAM,CAAC,WAAW,EAClB,KAAM,kBACN,IAAK,OACL,SAAU,CAAE,UAAW,EAAG,OAAQ,OAAQ,CAC5C,EACA,CACE,GAAI,IACJ,KAAM,wBACN,IAAK,4DACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,KACV,KAAM,CAAC,UAAU,EACjB,KAAM,aACN,IAAK,OACL,MAAO,IACP,OAAQ,KACR,QAAS,CACP,UAAW,CACT,IAAK,OACL,IAAK,kEACL,KAAM,qCACN,KAAM,aACN,KAAM,kCACN,KAAM,KACN,KAAM,KACN,MAAO,IACP,OAAQ,GACV,EACA,MAAO,CACL,IAAK,OACL,IAAK,kEACL,KAAM,iCACN,KAAM,aACN,KAAM,8BACN,KAAM,KACN,KAAM,MACN,MAAO,IACP,OAAQ,GACV,EACA,OAAQ,CACN,IAAK,OACL,IAAK,kEACL,KAAM,kCACN,KAAM,aACN,KAAM,+BACN,KAAM,KACN,KAAM,MACN,MAAO,IACP,OAAQ,GACV,EACA,MAAO,CACL,IAAK,OACL,IAAK,mEACL,KAAM,iCACN,KAAM,aACN,KAAM,8BACN,KAAM,KACN,KAAM,OACN,MAAO,IACP,OAAQ,GACV,CACF,EACA,SAAU,CAAC,CACb,EACA,CACE,GAAI,IACJ,KAAM,kBACN,IAAK,wCACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,KACV,KAAM,CAAC,EACP,KAAM,aACN,IAAK,OACL,SAAU,CAAC,CACb,EACA,CACE,GAAI,IACJ,KAAM,kBACN,IAAK,8CACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,KACV,KAAM,CAAC,EACP,KAAM,YACN,IAAK,OACL,MAAO,KACP,OAAQ,KACR,SAAU,CAAE,SAAU,GAAI,YAAa,OAAQ,CACjD,EACA,CACE,GAAI,IACJ,KAAM,oBACN,IAAK,+DACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,KACV,KAAM,CAAC,UAAU,EACjB,KAAM,YACN,IAAK,OACL,MAAO,IACP,OAAQ,IACR,QAAS,CACP,UAAW,CACT,IAAK,OACL,IAAK,qEACL,KAAM,iCACN,KAAM,YACN,KAAM,8BACN,KAAM,KACN,KAAM,IACN,MAAO,IACP,OAAQ,GACV,EACA,MAAO,CACL,IAAK,OACL,IAAK,qEACL,KAAM,6BACN,KAAM,YACN,KAAM,0BACN,KAAM,KACN,KAAM,KACN,MAAO,IACP,OAAQ,GACV,EACA,OAAQ,CACN,IAAK,OACL,IAAK,qEACL,KAAM,8BACN,KAAM,YACN,KAAM,2BACN,KAAM,KACN,KAAM,MACN,MAAO,IACP,OAAQ,GACV,EACA,MAAO,CACL,IAAK,OACL,IAAK,sEACL,KAAM,6BACN,KAAM,YACN,KAAM,0BACN,KAAM,KACN,KAAM,MACN,MAAO,IACP,OAAQ,GACV,CACF,EACA,SAAU,CAAC,CACb,EACA,CACE,GAAI,IACJ,KAAM,eACN,IAAK,wCACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,KACV,KAAM,CAAC,WAAW,EAClB,KAAM,gBACN,IAAK,MACL,SAAU,CAAC,CACb,EACA,CACE,GAAI,IACJ,KAAM,oBACN,IAAK,wCACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,KACV,KAAM,CAAC,EACP,KAAM,mBACN,IAAK,QACL,SAAU,CAAC,CACb,EACA,CACE,GAAI,IACJ,KAAM,0BACN,IAAK,+DACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,KACV,KAAM,CAAC,UAAU,EACjB,KAAM,aACN,IAAK,QACL,MAAO,IACP,OAAQ,KACR,SAAU,CAAC,CACb,EAGA,CACE,GAAI,EACJ,KAAM,yBACN,IAAK,4EACL,KAAM,QACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,WAAY,WAAW,EAC9B,KAAM,aACN,IAAK,QACL,QAAS,8BACT,gBAAiB,wCACjB,MAAO,KACP,OAAQ,KACR,SAAU,CAAC,CACb,EACA,CACE,GAAI,EACJ,KAAM,gCACN,IAAK,wCACL,KAAM,QACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,OAAQ,WAAW,EAC1B,KAAM,kBACN,IAAK,OACL,SAAU,CACR,UAAW,GACX,OAAQ,UACV,CACF,EACA,CACE,GAAI,EACJ,KAAM,wBACN,IAAK,wCACL,KAAM,OACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,MAAM,EACb,KAAM,oEACN,IAAK,QACL,SAAU,CACR,UAAW,EACb,CACF,EACA,CACE,GAAI,EACJ,KAAM,oBACN,IAAK,wCACL,KAAM,QACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,OAAQ,SAAS,EACxB,KAAM,4EACN,IAAK,QACL,SAAU,CACR,UAAW,EACb,CACF,EACA,CACE,GAAI,EACJ,KAAM,eACN,IAAK,wCACL,KAAM,QACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,OAAQ,SAAS,EACxB,KAAM,qBACN,IAAK,OACL,SAAU,CACR,UAAW,EACb,CACF,EACA,CACE,GAAI,EACJ,KAAM,iBACN,IAAK,8CACL,KAAM,SACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,SAAS,EAChB,KAAM,YACN,IAAK,OACL,MAAO,KACP,OAAQ,KACR,SAAU,CACR,SAAU,IACV,YAAa,QACf,CACF,EACA,CACE,GAAI,EACJ,KAAM,sBACN,IAAK,wCACL,KAAM,QACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,UAAU,EACjB,KAAM,aACN,IAAK,OACL,SAAU,CACR,SAAU,IACZ,CACF,EACA,CACE,GAAI,EACJ,KAAM,YACN,IAAK,wCACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,MAAM,EACb,KAAM,aACN,IAAK,OACL,SAAU,CACV,CACF,EACA,CACE,GAAI,EACJ,KAAM,YACN,IAAK,wCACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,SAAS,EAChB,KAAM,mBACN,IAAK,QACL,SAAU,CACV,CACF,EACA,CACE,GAAI,GACJ,KAAM,cACN,IAAK,wCACL,KAAM,UACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,SAAS,EAChB,KAAM,kBACN,IAAK,OACL,SAAU,CACR,YAAa,gBACf,CACF,EACA,CACE,GAAI,GACJ,KAAM,YACN,IAAK,wCACL,KAAM,SACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,UAAU,EACjB,KAAM,2BACN,IAAK,OACL,SAAU,CACR,YAAa,WACf,CACF,EACA,CACE,GAAI,GACJ,KAAM,gBACN,IAAK,wCACL,KAAM,SACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,SAAS,EAChB,KAAM,+BACN,IAAK,OACL,SAAU,CACR,YAAa,WACf,CACF,EAEA,CACE,GAAI,GACJ,KAAM,uBACN,IAAK,wCACL,KAAM,MACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,MAAM,EACb,KAAM,kBACN,IAAK,OACL,SAAU,CAAE,UAAW,EAAG,OAAQ,eAAgB,CACpD,EACA,CACE,GAAI,GACJ,KAAM,mBACN,IAAK,wCACL,KAAM,MACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,OAAQ,WAAW,EAC1B,KAAM,oEACN,IAAK,QACL,SAAU,CAAE,UAAW,CAAE,CAC3B,EACA,CACE,GAAI,GACJ,KAAM,iBACN,IAAK,+DACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,MAAM,EACb,KAAM,aACN,IAAK,OACL,MAAO,IACP,OAAQ,IACR,SAAU,CAAC,CACb,EACA,CACE,GAAI,GACJ,KAAM,kBACN,IAAK,+DACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,SAAS,EAChB,KAAM,YACN,IAAK,OACL,MAAO,IACP,OAAQ,IACR,SAAU,CAAC,CACb,EACA,CACE,GAAI,GACJ,KAAM,mBACN,IAAK,8CACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,SAAS,EAChB,KAAM,YACN,IAAK,OACL,MAAO,KACP,OAAQ,KACR,SAAU,CAAE,SAAU,IAAK,YAAa,OAAQ,CAClD,EACA,CACE,GAAI,GACJ,KAAM,qBACN,IAAK,8CACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,MAAM,EACb,KAAM,YACN,IAAK,OACL,MAAO,KACP,OAAQ,KACR,SAAU,CAAE,SAAU,IAAK,YAAa,OAAQ,CAClD,EACA,CACE,GAAI,GACJ,KAAM,uBACN,IAAK,wCACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,UAAU,EACjB,KAAM,aACN,IAAK,OACL,SAAU,CAAE,SAAU,GAAI,CAC5B,EACA,CACE,GAAI,GACJ,KAAM,yBACN,IAAK,wCACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,MAAM,EACb,KAAM,0EACN,IAAK,QACL,SAAU,CAAE,UAAW,EAAG,CAC5B,EACA,CACE,GAAI,GACJ,KAAM,kBACN,IAAK,wCACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,OAAQ,WAAW,EAC1B,KAAM,kBACN,IAAK,OACL,SAAU,CAAE,UAAW,CAAE,CAC3B,EACA,CACE,GAAI,GACJ,KAAM,sBACN,IAAK,+DACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,UAAU,EACjB,KAAM,aACN,IAAK,OACL,MAAO,KACP,OAAQ,KACR,SAAU,CAAC,CACb,EACA,CACE,GAAI,GACJ,KAAM,sBACN,IAAK,+DACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,UAAU,EACjB,KAAM,aACN,IAAK,OACL,MAAO,IACP,OAAQ,KACR,SAAU,CAAC,CACb,EACA,CACE,GAAI,GACJ,KAAM,qBACN,IAAK,wCACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,UAAW,SAAS,EAC3B,KAAM,kBACN,IAAK,OACL,SAAU,CAAE,YAAa,qBAAsB,CACjD,EACA,CACE,GAAI,GACJ,KAAM,0BACN,IAAK,wCACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,OAAQ,WAAW,EAC1B,KAAM,4EACN,IAAK,QACL,SAAU,CAAE,UAAW,EAAG,CAC5B,EACA,CACE,GAAI,GACJ,KAAM,qBACN,IAAK,+DACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,MAAM,EACb,KAAM,YACN,IAAK,OACL,MAAO,KACP,OAAQ,KACR,SAAU,CAAC,CACb,EACA,CACE,GAAI,GACJ,KAAM,cACN,IAAK,wCACL,KAAM,IACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,SAAS,EAChB,KAAM,mBACN,IAAK,QACL,SAAU,CAAC,CACb,EACA,CACE,GAAI,GACJ,KAAM,YACN,IAAK,wCACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,SAAS,EAChB,KAAM,gBACN,IAAK,MACL,SAAU,CAAC,CACb,EACA,CACE,GAAI,GACJ,KAAM,sBACN,IAAK,wCACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,UAAW,WAAW,EAC7B,KAAM,kBACN,IAAK,OACL,SAAU,CAAE,YAAa,iBAAkB,CAC7C,EACA,CACE,GAAI,GACJ,KAAM,qBACN,IAAK,8CACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,UAAU,EACjB,KAAM,YACN,IAAK,OACL,MAAO,KACP,OAAQ,KACR,SAAU,CAAE,SAAU,IAAK,YAAa,OAAQ,CAClD,EACA,CACE,GAAI,GACJ,KAAM,mBACN,IAAK,wCACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,MAAM,EACb,KAAM,gBACN,IAAK,OACL,SAAU,CAAC,CACb,EACA,CACE,GAAI,GACJ,KAAM,gBACN,IAAK,wCACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,OAAQ,WAAW,EAC1B,KAAM,kBACN,IAAK,OACL,SAAU,CAAE,UAAW,GAAI,OAAQ,cAAe,CACpD,EACA,CACE,GAAI,GACJ,KAAM,oBACN,IAAK,+DACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,UAAU,EACjB,KAAM,aACN,IAAK,QACL,MAAO,IACP,OAAQ,IACR,SAAU,CAAC,CACb,EACA,CACE,GAAI,GACJ,KAAM,oBACN,IAAK,wCACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,UAAU,EACjB,KAAM,aACN,IAAK,OACL,SAAU,CAAE,SAAU,GAAI,CAC5B,EACA,CACE,GAAI,GACJ,KAAM,kBACN,IAAK,wCACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,MAAM,EACb,KAAM,WACN,IAAK,OACL,SAAU,CAAC,CACb,EACA,CACE,GAAI,GACJ,KAAM,iBACN,IAAK,wCACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,SAAS,EAChB,KAAM,kBACN,IAAK,OACL,SAAU,CAAE,UAAW,EAAG,CAC5B,EACA,CACE,GAAI,GACJ,KAAM,gBACN,IAAK,+DACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,UAAU,EACjB,KAAM,aACN,IAAK,OACL,MAAO,KACP,OAAQ,IACR,SAAU,CAAC,CACb,EACA,CACE,GAAI,GACJ,KAAM,0BACN,IAAK,wCACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,MAAM,EACb,KAAM,aACN,IAAK,OACL,SAAU,CAAE,SAAU,IAAK,CAC7B,EACA,CACE,GAAI,GACJ,KAAM,mBACN,IAAK,wCACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,UAAW,MAAM,EACxB,KAAM,+BACN,IAAK,OACL,SAAU,CAAE,YAAa,qBAAsB,CACjD,EACA,CACE,GAAI,GACJ,KAAM,sBACN,IAAK,wCACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,MAAM,EACb,KAAM,0EACN,IAAK,QACL,SAAU,CAAE,UAAW,EAAG,CAC5B,EACA,CACE,GAAI,GACJ,KAAM,sBACN,IAAK,wCACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,MAAM,EACb,KAAM,oEACN,IAAK,QACL,SAAU,CAAE,UAAW,CAAE,CAC3B,EACA,CACE,GAAI,GACJ,KAAM,mBACN,IAAK,+DACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,UAAU,EACjB,KAAM,aACN,IAAK,OACL,MAAO,IACP,OAAQ,KACR,SAAU,CAAC,CACb,EACA,CACE,GAAI,GACJ,KAAM,wBACN,IAAK,8CACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,MAAM,EACb,KAAM,YACN,IAAK,OACL,MAAO,KACP,OAAQ,KACR,SAAU,CAAE,SAAU,IAAK,YAAa,OAAQ,CAClD,EACA,CACE,GAAI,GACJ,KAAM,oBACN,IAAK,wCACL,KAAM,KACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,SAAS,EAChB,KAAM,YACN,IAAK,OACL,SAAU,CAAE,SAAU,GAAI,CAC5B,EACA,CACE,GAAI,GACJ,KAAM,oBACN,IAAK,wCACL,KAAM,MACN,UAAW,IAAI,KAAK,sBAAsB,EAC1C,UAAW,IAAI,KAAK,sBAAsB,EAC1C,SAAU,EACV,KAAM,CAAC,SAAS,EAChB,KAAM,kBACN,IAAK,OACL,SAAU,CAAE,YAAa,kBAAmB,CAC9C,CACF,ECn6BA,IAAMC,GAASC,GAAe,IAAI,QAASC,GAAY,WAAWA,EAASD,CAAE,CAAC,EAEjEE,GAAN,KAAmD,CAExD,UAAUC,EAA4C,CACpD,GAAIA,IAAa,KAAM,OAAO,QAAQ,QAAQ,IAAI,EAClD,IAAMC,EAASC,GAAY,KAAMC,GAAMA,EAAE,KAAOH,CAAQ,EAExD,GAAI,CAACC,EAAQ,OAAO,QAAQ,QAAQ,IAAI,EAGxC,IAAMG,EAAiBC,EAAA,GAAKJ,GAGxBK,EAAUF,EACd,KAAOE,EAAQ,WAAa,MAAM,CAChC,IAAMC,EAASL,GAAY,KAAMC,GAAMA,EAAE,KAAOG,EAAQ,QAAQ,EAChE,GAAIC,EACFD,EAAQ,OAASD,EAAA,GAAKE,GACtBD,EAAUA,EAAQ,WAElB,MAEJ,CAEA,OAAO,QAAQ,QAAQF,CAAM,CAC/B,CAEA,MAAM,WACJJ,EACAQ,EAAe,EACfC,EAAgB,GAChBC,EAAgB,GAC0C,CAC1D,MAAMd,GAAM,GAAG,EAGf,IAAMe,EAAkBX,IAAa,KACjCE,GAAY,OAAQD,GAAWA,EAAO,WAAaD,CAAQ,EAC3DE,GAAY,OAAQD,GAAWA,EAAO,WAAa,IAAI,EAGvDW,EAAiBD,EACrB,GAAID,GAASA,EAAM,KAAK,EAAG,CACzB,IAAMG,EAAcH,EAAM,YAAY,EAAE,KAAK,EAC7CE,EAAiBD,EAAgB,OAAQV,GACvCA,EAAO,KAAK,YAAY,EAAE,SAASY,CAAW,CAChD,CACF,CAGA,IAAMC,EAAgBF,EAAe,KAAK,CAACG,EAAGC,IAC5C,IAAI,KAAKD,EAAE,SAAS,EAAE,QAAQ,EAAI,IAAI,KAAKC,EAAE,SAAS,EAAE,QAAQ,CAClE,EAGMC,EAAeH,EAAc,OAC7BI,EAAa,KAAK,KAAKD,EAAeR,CAAK,EAC3CU,GAAcX,EAAO,GAAKC,EAGhC,MAAO,CACL,QAHuBK,EAAc,MAAMK,EAAYA,EAAaV,CAAK,EAIzE,WAAY,CACV,YAAaD,EACb,WAAAU,EACA,WAAYD,EACZ,aAAcR,CAChB,CACF,CACF,CACA,SAA6B,CAC3B,OAAO,QAAQ,QAAQW,GAAS,IAAKC,GAAQA,EAAI,IAAI,CAAC,CACxD,CACA,MAAM,SACJrB,EACAsB,EACAd,EACAC,EACAC,EACgE,CAChE,MAAMd,GAAM,GAAG,EACf,IAAI2B,EAAgB,CAAC,GAAGC,EAAS,EAkBjC,GAfIxB,IAAa,OACfuB,EAAgBA,EAAc,OAC3BE,GAASA,EAAK,WAAazB,CAC9B,GAIEsB,GAAaA,EAAU,OAAS,IAClCC,EAAgBA,EAAc,OAAQE,GAAS,CAC7C,IAAMC,EAAYC,GAAoBF,EAAK,KAAMA,EAAK,GAAG,EACzD,OAAOH,EAAU,SAASI,CAAQ,CACpC,CAAC,GAIChB,EAAO,CACT,IAAMG,EAAcH,GAAA,YAAAA,EAAO,cAC3Ba,EAAgBA,EAAc,OAAQE,GACpCA,EAAK,KAAK,YAAY,EAAE,SAASZ,CAAW,CAC9C,CACF,CAGA,IAAMe,EAAcL,EAAc,KAAK,CAACR,EAAGC,IACzC,IAAI,KAAKD,EAAE,SAAS,EAAE,QAAQ,EAAI,IAAI,KAAKC,EAAE,SAAS,EAAE,QAAQ,CAClE,EAGMa,EAAcrB,GAAA,KAAAA,EAAQ,EACtBsB,EAAerB,GAAA,KAAAA,EAAS,GACxBsB,EAAaH,EAAY,OACzBV,EAAa,KAAK,KAAKa,EAAaD,CAAY,EAChDX,GAAcU,EAAc,GAAKC,EACjCE,EAAiBJ,EAAY,MACjCT,EACAA,EAAaW,CACf,EAEA,OAAO,QAAQ,QAAQ,CACrB,MAAOE,EACP,WAAY,CACV,YAAAH,EACA,WAAAX,EACA,WAAAa,EACA,aAAAD,CACF,CACF,CAAC,CACH,CAOA,MAAM,SACJ9B,EACAsB,EACAd,EAAe,EACfC,EAAgB,GAChBC,EAAgB,GAKf,CACD,MAAMd,GAAM,GAAG,EAGf,IAAIe,EAAkBX,IAAa,KAC/BE,GAAY,OAAQD,GAAWA,EAAO,WAAaD,CAAQ,EAC3DE,GAAY,OAAQD,GAAWA,EAAO,WAAa,IAAI,EAGvDsB,EAAgBvB,IAAa,KAC7BwB,GAAU,OAAQC,GAASA,EAAK,WAAazB,CAAQ,EACrDwB,GAAU,OAAQC,GAASA,EAAK,WAAa,IAAI,EAWrD,GARIH,GAAaA,EAAU,OAAS,IAClCC,EAAgBA,EAAc,OAAQE,GAAS,CAC7C,IAAMC,EAAWC,GAAoBF,EAAK,KAAMA,EAAK,GAAG,EACxD,OAAOH,EAAU,SAASI,CAAQ,CACpC,CAAC,GAIChB,GAASA,EAAM,KAAK,EAAG,CACzB,IAAMG,EAAcH,EAAM,YAAY,EAAE,KAAK,EAE7CC,EAAkBA,EAAgB,OAAQV,GACxCA,EAAO,KAAK,YAAY,EAAE,SAASY,CAAW,CAChD,EAEAU,EAAgBA,EAAc,OAAQE,GAAM,CAnMlD,IAAAQ,EAAAC,GAoMQ,OAAAT,EAAK,KAAK,YAAY,EAAE,SAASZ,CAAW,KAC3CqB,IAAAD,EAAAR,EAAK,MAAL,YAAAQ,EAAU,cAAc,SAASpB,KAAjC,KAAAqB,GAAiD,IACpD,CACF,CAGA,IAAMpB,EAAgBH,EAAgB,KAAK,CAACI,EAAGC,IAC7C,IAAI,KAAKD,EAAE,SAAS,EAAE,QAAQ,EAAI,IAAI,KAAKC,EAAE,SAAS,EAAE,QAAQ,CAClE,EAGMY,EAAcL,EAAc,KAAK,CAACR,EAAGC,IACzC,IAAI,KAAKD,EAAE,SAAS,EAAE,QAAQ,EAAI,IAAI,KAAKC,EAAE,SAAS,EAAE,QAAQ,CAClE,EAGMmB,EAAarB,EAAc,OAASc,EAAY,OAChDV,EAAa,KAAK,KAAKiB,EAAa1B,CAAK,GAAK,EAC9CU,GAAcX,EAAO,GAAKC,EAC1B2B,EAAWjB,EAAaV,EAGxB4B,EAAgBvB,EAAc,MAClC,KAAK,IAAI,EAAGK,CAAU,EACtB,KAAK,IAAIL,EAAc,OAAQsB,CAAQ,CACzC,EAGME,EAAeD,EAAc,OAC7BE,EAAY9B,EAAQ6B,EAGpBE,EAAyB,KAAK,IAAI1B,EAAc,OAAQK,CAAU,EAClEsB,EAAiB,KAAK,IAAI,EAAGtB,EAAaL,EAAc,MAAM,EAE9D4B,EAAcd,EAAY,MAAMa,EAAgBA,EAAiBF,CAAS,EAEhF,MAAO,CACL,QAASF,EACT,MAAOK,EACP,WAAY,CACV,YAAalC,EACb,WAAYU,EACZ,WAAYiB,EACZ,aAAc1B,CAChB,CACF,CACF,CAGA,MAAM,aACJkC,EACAC,EACiB,CACjB,MAAMhD,GAAM,GAAG,EACf,IAAMiD,EAAoB,CACxB,GAAI,KAAK,IAAI,EACb,KAAAF,EACA,SAAUC,GAAA,KAAAA,EAAY,KACtB,OAAQ,OAAOA,GAAa,SAAWA,EAAW,EAClD,KAAM,GACN,UAAW,EACX,YAAa,EACb,UAAW,IAAI,KACf,UAAW,IAAI,IACjB,EACA,OAAA1C,GAAY,KAAK2C,CAAS,EACnBA,CACT,CAEQ,gBAAgBpB,EAAYqB,EAAyC,CAE3E,OAAIrB,EAAK,KAAK,WAAW,QAAQ,EACxB,CAKP,EACSA,EAAK,KAAK,WAAW,QAAQ,EAC/B,CACL,SAAU,EACV,YAAaqB,GAAA,KAAAA,EAAeC,GAAa,KAC3C,EACStB,EAAK,KAAK,WAAW,QAAQ,EAC/B,CACL,SAAU,CACZ,EAGK,CACL,YAAa,EACf,CACF,CAEQ,YAAYA,EAAsB,CAnS5C,IAAAQ,EAqSI,IAAMe,EAAM,MAAMf,EAAAR,EAAK,KAAK,MAAM,GAAG,EAAE,IAAI,IAAzB,YAAAQ,EAA4B,eAC9C,OAAON,GAAoBF,EAAK,KAAMuB,CAAG,CAC3C,CAIA,MAAM,YACJC,EACAjD,EACyB,CA9S7B,IAAAiC,EA+SI,MAAMrC,GAAM,GAAG,EAEf,IAAMsD,EAAgC,CAAC,EAEvC,OAAW,CAAE,KAAAzB,EAAM,YAAAqB,CAAY,IAAKG,EAAO,CACzC,IAAMvB,EAAW,KAAK,YAAYD,CAAI,EAChCuB,EAAM,MAAMf,EAAAR,EAAK,KAAK,MAAM,GAAG,EAAE,IAAI,IAAzB,YAAAQ,EAA4B,eAExCkB,EAAwB,CAC5B,GAAI,KAAK,IAAI,EAAI,KAAK,OAAO,EAC7B,KAAM1B,EAAK,KACX,SAAUzB,GAAA,KAAAA,EAAY,KACtB,KAAMyB,EAAK,KACX,IAAK,IAAI,gBAAgBA,CAAI,EAE7B,KAAMA,EAAK,MAAQ,2BACnB,IAAKuB,EACL,SAAU,KAAK,gBAAgBvB,EAAMqB,CAAW,EAChD,UAAW,IAAI,KACf,UAAW,IAAI,KACf,KAAM,CAAC,EAEP,MAAOpB,IAAa0B,EAAU,MAAQ,IAAM,OAC5C,OAAQ1B,IAAa0B,EAAU,MAAQ,IAAM,MAC/C,EACA5B,GAAU,KAAK2B,CAAO,EACtBD,EAAc,KAAKC,CAAO,CAC5B,CAEA,OAAOD,CACT,CAEA,aAAalD,EAAoBqD,EAAkC,CACjE,IAAMpD,EAASC,GAAY,KAAMC,GAAMA,EAAE,KAAOH,CAAQ,EACxD,OAAKC,GAGLA,EAAO,KAAOoD,EACdpD,EAAO,UAAY,IAAI,KAChB,QAAQ,QAAQA,CAAM,GAJpB,QAAQ,OAAO,IAAI,MAAM,kBAAkB,CAAC,CAKvD,CAEA,mBACEqD,EACAC,EACuB,CACvB,IAAM9B,EAAOD,GAAU,KAAMrB,GAAMA,EAAE,KAAOmD,CAAM,EAClD,GAAI,CAAC7B,EACH,OAAO,QAAQ,OAAO,IAAI,MAAM,gBAAgB,CAAC,EAGnD,IAAqCQ,EAAAsB,EAA7B,UAAAC,CAlWZ,EAkWyCvB,EAAhBwB,EAAAC,EAAgBzB,EAAhB,CAAb,aAGR,cAAO,OAAOR,EAAMgC,CAAW,EAG3BD,IACF/B,EAAK,SAAWpB,IAAA,GAAKoB,EAAK,UAAa+B,IAGzC/B,EAAK,UAAY,IAAI,KACd,QAAQ,QAAQA,CAAI,CAC7B,CAEA,YAAYkC,EAAoC,CAC9C,QAAWL,KAAUK,EAAS,CAC5B,IAAMC,EAAYpC,GAAU,UAAWrB,GAAMA,EAAE,KAAOmD,CAAM,EACxDM,IAAc,IAChBpC,GAAU,OAAOoC,EAAW,CAAC,CAEjC,CACA,OAAO,QAAQ,QAAQ,CACzB,CAEA,cAAcC,EAAsC,CAClD,QAAW7D,KAAY6D,EAAW,CAChC,IAAMC,EAAc5D,GAAY,UAAWC,GAAMA,EAAE,KAAOH,CAAQ,EAClE,GAAI8D,IAAgB,GAAI,CAEtB5D,GAAY,OAAO4D,EAAa,CAAC,EAEjC,QAASC,EAAIvC,GAAU,OAAS,EAAGuC,GAAK,EAAGA,IACrCvC,GAAUuC,CAAC,EAAE,WAAa/D,GAC5BwB,GAAU,OAAOuC,EAAG,CAAC,CAG3B,CACF,CACA,OAAO,QAAQ,QAAQ,CACzB,CAEA,UAAUC,EAA8C,CAEtD,IAAMtD,EAAQsD,GAAA,YAAAA,EAAa,cACrBC,EAAazC,GAAU,OAC1BC,GAAM,CA/Yb,IAAAQ,EAgZQ,OAAAR,EAAK,KAAK,YAAY,EAAE,SAASf,CAAK,KACtCuB,EAAAR,EAAK,OAAL,YAAAQ,EAAW,KAAMZ,GAAQA,EAAI,YAAY,EAAE,SAASX,CAAK,IAC7D,EACA,OAAO,QAAQ,QAAQuD,CAAU,CACnC,CAEA,YAAYD,EAAwC,CAElD,IAAMtD,EAAQsD,GAAA,YAAAA,EAAa,cACrBE,EAAehE,GAAY,OAAQD,GACvCA,EAAO,KAAK,YAAY,EAAE,SAASS,CAAK,CAC1C,EACA,OAAO,QAAQ,QAAQwD,CAAY,CACrC,CAEA,UAAUP,EAAqBQ,EAAgD,CAE7E,IAAMC,EAA6B,CAAC,EACpC,QAAWd,KAAUK,EAAS,CAC5B,IAAMlC,EAAOD,GAAU,KAAMrB,GAAMA,EAAE,KAAOmD,CAAM,EAC9C7B,IACFA,EAAK,SAAW0C,EAChB1C,EAAK,UAAY,IAAI,KACrB2C,EAAW,KAAK3C,CAAI,EAExB,CACA,OAAO,QAAQ,QAAQ2C,CAAU,CACnC,CACA,YAAYP,EAAuBQ,EAA0C,CAE3E,IAAMC,EAAyB,CAAC,EAChC,QAAWtE,KAAY6D,EAAW,CAChC,IAAM5D,EAASC,GAAY,KAAMC,GAAMA,EAAE,KAAOH,CAAQ,EACpDC,IACFA,EAAO,SAAWoE,EAClBpE,EAAO,UAAY,IAAI,KACvBqE,EAAa,KAAKrE,CAAM,EAE5B,CACA,OAAO,QAAQ,QAAQqE,CAAY,CACrC,CACF","names":["index_exports","__export","FileManager","FileManagerModal","FileManagerProvider","MockProvider","useFileManager","__toCommonJS","import_react","MODE","MODES","FILE_TYPE","FILE_TYPES","SELECTION_MODE","SELECTION_MODES","VIEW_MODE","VIEW_MODES","VIDEO_SOURCE","VIDEO_SOURCES","import_navigation","import_sonner","toggleFilesInSelection","prev","filesToToggle","updated","file","f","toggleFoldersInSelection","foldersToToggle","folder","useFileHandlers","state","mode","selectionMode","files","folders","selectedFiles","selectedFolders","currentFolder","setSelectedFiles","setSelectedFolders","setCurrentFolder","setFiles","setFolders","setPagination","loadData","isInSelectionMode","provider","onFilesSelected","onClose","basePath","setIsLoading","setFileDetailsModalFile","router","handleFileClick","event","isCheckboxClick","fileArray","MODE","handleFolderClick","folderId","path","newUrl","params","handleClearSelection","handleSelectAllGlobal","checked","refreshData","silent","uploadFiles","fileUploadInput","_a","error","message","createFolder","name","bulkMove","targetFolderId","totalMoved","renameFolder","newName","__spreadProps","__spreadValues","updateFileMetadata","fileId","metadata","metaData","rootUpdates","__objRest","bulkDelete","totalDeleted","import_navigation","import_react","import_sonner","useFileState","options","mode","selectionMode","initialFolderId","acceptedFileTypesForModal","allowedFileTypes","provider","onFilesSelected","onClose","basePath","params","searchParams","router","pathname","pageFromUrl","limitFromUrl","queryFromUrl","folderId","MODE","path","folderIdParam","files","setFiles","folders","setFolders","selectedFiles","setSelectedFiles","selectedFolders","setSelectedFolders","currentFolder","setCurrentFolder","isLoading","setIsLoading","pagination","setPagination","currentFolderRef","searchQuery","setSearchQuery","debouncedSearchQuery","setDebouncedSearchQuery","handler","prevFolderIdRef","updateUrlParams","page","limit","prev","__spreadProps","__spreadValues","currentPage","filesPerPage","cancelled","syncAndLoad","folder","loadDataForFolder","e","message","_a","fileTypes","result","error","isUploadModalOpen","setIsUploadModalOpen","isCreateFolderModalOpen","setIsCreateFolderModalOpen","isSearchModalOpen","setIsSearchModalOpen","isMoveFileModalOpen","setIsMoveFileModalOpen","isRenameFolderModalOpen","setIsRenameFolderModalOpen","folderToRename","setFolderToRename","fileDetailsModalFile","setFileDetailsModalFile","loadData","silent","isInSelectionMode","getCurrentFolder","getSelectionState","totalItems","selectedItems","handlePageChange","newPage","updateSearchQuery","newQuery","import_react","import_jsx_runtime","FileManagerContext","FileManagerProvider","children","mode","MODE","selectionMode","SELECTION_MODE","allowedFileTypes","onFilesSelected","onClose","acceptedFileTypesForModal","initialFolderId","provider","basePath","maxUploadFiles","maxUploadSize","state","useFileState","handlers","useFileHandlers","value","useFileManager","context","import_clsx","import_tailwind_merge","cn","inputs","import_lucide_react","import_jsx_runtime","Pagination","_a","_b","className","props","__objRest","__spreadValues","cn","PaginationContent","PaginationItem","PaginationEllipsis","__spreadProps","import_class_variance_authority","import_lucide_react","import_radix_ui","import_jsx_runtime","buttonVariants","Button","_a","_b","className","selected","variant","radius","appearance","mode","size","autoHeight","underlined","underline","asChild","placeholder","props","__objRest","Comp","SlotPrimitive","__spreadValues","cn","import_jsx_runtime","ChevronRightIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","ChevronLeftIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","getPageNumbers","current","total","pages","i","FileManagerFooter","className","pagination","handlePageChange","files","folders","useFileManager","currentPage","totalPages","totalItems","pageNumbers","Pagination","PaginationContent","PaginationItem","Button","ChevronLeftIcon","page","idx","PaginationEllipsis","ChevronRightIcon","import_jsx_runtime","FileManagerHeader","children","className","cn","import_react","import_class_variance_authority","import_lucide_react","import_radix_ui","import_jsx_runtime","dialogContentVariants","Dialog","_a","props","__objRest","DialogPrimitive","__spreadValues","DialogPortal","_a","props","__objRest","DialogPrimitive","__spreadValues","DialogClose","DialogOverlay","_b","className","cn","DialogContent","children","showCloseButton","overlay","variant","__spreadProps","dialogContentVariants","DialogHeader","_a","_b","className","props","__objRest","__spreadValues","cn","DialogFooter","DialogTitle","DialogPrimitive","DialogDescription","_a","_b","className","props","__objRest","DialogPrimitive","__spreadValues","cn","import_class_variance_authority","import_lucide_react","import_jsx_runtime","alertVariants","Alert","_a","_b","className","variant","size","icon","appearance","close","onClose","children","props","__objRest","__spreadProps","__spreadValues","cn","AlertTitle","AlertIcon","AlertDescription","_a","_b","className","props","__objRest","__spreadValues","cn","AlertContent","TooltipPrimitive","import_jsx_runtime","TooltipProvider","_a","_b","delayDuration","props","__objRest","__spreadValues","Tooltip","TooltipTrigger","TooltipContent","className","sideOffset","children","__spreadProps","cn","getFileSize","bytes","k","sizes","i","import_react","useFileUpload","options","maxFiles","maxSize","accept","multiple","initialFiles","onFilesChange","onFilesAdded","onError","state","setState","file","inputRef","validateFile","getFileSize","acceptedTypes","type","fileType","fileExtension","baseType","createPreview","generateUniqueId","clearFiles","prev","newState","__spreadProps","__spreadValues","addFiles","newFiles","newFilesArray","errors","validFiles","existingFile","error","removeFile","id","fileToRemove","clearErrors","handleDragEnter","e","handleDragLeave","handleDragOver","handleDrop","_a","handleFileChange","openFileDialog","getInputProps","props","import_lucide_react","import_mime","import_jsx_runtime","PdfIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","ExcelIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","PptIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","DocIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","TextDocIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","FileIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","ZipIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","JsonIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","MusicIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","RarIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","ExeIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","ImageIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","VideoIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","FolderWithFilesIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","EmptyFolderIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","FolderIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","HomeIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","SearchIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","MoveIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","import_jsx_runtime","UploadFolderIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","PlusIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","TrashIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","CrossIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","DownloadIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","LinkIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","FullscreenIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","getFileTypeFromMime","mimeType","extension","FILE_TYPE","effectiveMime","ext","detectedMime","mime","getIconType","Icons","_a","_b","type","className","props","__objRest","FolderWithFilesIcon","__spreadValues","EmptyFolderIcon","ImageIcon","VideoIcon","MusicIcon","PdfIcon","ExcelIcon","PptIcon","DocIcon","TextDocIcon","JsonIcon","ZipIcon","RarIcon","ExeIcon","FileIcon","fileTypesToAccept","fileTypes","mimeTypes","fileType","getFileTypesDescription","descriptions","import_jsx_runtime","UploadCloudIcon","props","__spreadProps","__spreadValues","import_react","import_jsx_runtime","ImageCard","file","_a","hasError","setHasError","imageSrc","ImageIcon","ImageCardMetadata","import_lucide_react","import_react","import_jsx_runtime","VideoCard","file","className","hasError","setHasError","Icons","VideoCardMetadata","_a","import_jsx_runtime","AudioCard","file","className","Icons","AudioCardMetadata","_a","import_jsx_runtime","DocumentCard","file","className","iconType","getIconType","Icons","DocumentCardMetadata","_a","import_jsx_runtime","DefaultCard","file","iconType","getIconType","Icons","FILE_COMPONENT_REGISTRY","ImageCard","ImageCardMetadata","VideoCard","VideoCardMetadata","DocumentCard","DocumentCardMetadata","AudioCard","AudioCardMetadata","DefaultCard","getFileComponents","file","type","getFileTypeFromMime","import_jsx_runtime","Kbd","_a","_b","className","props","__objRest","__spreadValues","cn","KbdGroup","import_jsx_runtime","UploadModal","isUploadModalOpen","setIsUploadModalOpen","uploadFiles","allowedFileTypes","maxUploadFiles","maxUploadSize","useFileManager","acceptString","fileTypesToAccept","fileTypesDescription","getFileTypesDescription","uploadItems","setUploadItems","isDragging","errors","removeFile","clearFiles","handleDragEnter","handleDragLeave","handleDragOver","handleDrop","openFileDialog","getInputProps","useFileUpload","newFiles","newUploadItems","file","existingFile","existing","__spreadValues","__spreadProps","removeUploadFile","fileId","retryUpload","prev","handleUpload","completedFiles","item","fileInputs","getFileTypeFromMime","handleClose","getFilePreviewComponent","preview","mockFileMetadata","FilePreviewComponent","getFileComponents","completedCount","uploadingCount","canUpload","Dialog","DialogContent","DialogHeader","DialogTitle","KbdGroup","Kbd","Button","CrossIcon","DialogDescription","cn","UploadCloudIcon","getFileSize","fileItem","Tooltip","TooltipTrigger","TooltipContent","Alert","AlertIcon","AlertContent","AlertTitle","AlertDescription","error","index","DialogFooter","DialogClose","import_react","import_class_variance_authority","import_jsx_runtime","inputVariants","inputAddonVariants","inputGroupVariants","inputWrapperVariants","Input","_a","_b","className","type","variant","props","__objRest","__spreadValues","cn","import_jsx_runtime","CreateFolderModal","isCreateFolderModalOpen","setIsCreateFolderModalOpen","isRenameFolderModalOpen","setIsRenameFolderModalOpen","createFolder","renameFolder","folderToRename","setFolderToRename","useFileManager","folderName","setFolderName","isRenameMode","isOpen","handleSubmit","folderId","handleClose","Dialog","DialogContent","DialogHeader","DialogTitle","KbdGroup","Kbd","Button","CrossIcon","Input","e","DialogFooter","DialogClose","import_react","import_lucide_react","middleTruncate","text","maxLength","start","end","import_react","useIntersectionObserver","threshold","root","rootMargin","entry","setEntry","node","setNode","observer","newEntry","import_jsx_runtime","FolderTreeItem","folder","selectedFolderId","onSelect","onLoadChildren","disabledFolderIds","treeState","_a","isOpen","setIsOpen","hasChildren","isSelected","isDisabled","isLoading","isLoaded","children","pagination","observerRef","entry","useIntersectionObserver","hasMore","nextPage","newIsOpen","FolderIcon","middleTruncate","childFolder","MoveModal","isMoveFileModalOpen","setIsMoveFileModalOpen","selectedFiles","selectedFolders","bulkMove","provider","useFileManager","targetFolderId","setTargetFolderId","setTreeState","rootObserverRef","rootEntry","rootPagination","rootHasMore","isRootLoading","f","rootFolders","loadFolders","folderId","page","prev","__spreadProps","__spreadValues","result","newLoading","newLoaded","newFolders","existingFolders","newPagination","error","handleMove","handleOpenChange","open","Dialog","DialogContent","DialogHeader","DialogTitle","Button","CrossIcon","DialogDescription","id","DialogFooter","DialogClose","import_react","import_lucide_react","import_radix_ui","import_jsx_runtime","ScrollArea","_a","_b","className","viewportClassName","children","viewportRef","props","__objRest","ScrollAreaPrimitive","__spreadProps","__spreadValues","cn","ScrollBar","orientation","import_jsx_runtime","DetailsLayout","title","open","onClose","previewSection","metadataSection","footer","Dialog","isOpen","DialogContent","DialogHeader","DialogTitle","Button","CrossIcon","DialogDescription","ScrollArea","DialogFooter","import_lucide_react","import_sonner","import_react","import_jsx_runtime","CheckIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","FileDeleteButton","file","provider","setFileDetailsModalFile","refreshData","useFileManager","deleting","setDeleting","Button","middleTruncate","error","TrashIcon","FileDownloadButton","downloading","setDownloading","link","DownloadIcon","FileCopyLinkButton","copied","setCopied","CheckIcon","LinkIcon","FileFullscreenButton","onFullscreen","FullscreenIcon","import_class_variance_authority","import_jsx_runtime","textareaVariants","Textarea","_a","_b","className","variant","props","__objRest","__spreadValues","cn","import_class_variance_authority","import_radix_ui","import_jsx_runtime","labelVariants","Label","_a","_b","className","variant","props","__objRest","LabelPrimitive","__spreadValues","cn","formatDate","date","d","month","day","year","formatDuration","seconds","mins","secs","import_react","import_class_variance_authority","import_radix_ui","import_jsx_runtime","import_jsx_runtime","fieldVariants","Field","_a","_b","className","orientation","props","__objRest","__spreadValues","cn","FieldLabel","_a","_b","className","props","__objRest","Label","__spreadValues","cn","import_class_variance_authority","import_jsx_runtime","InputGroup","_a","_b","className","props","__objRest","__spreadValues","cn","inputGroupAddonVariants","InputGroupAddon","align","e","inputGroupButtonVariants","InputGroupText","_a","_b","className","props","__objRest","__spreadValues","cn","InputGroupInput","Input","import_jsx_runtime","ImageModal","file","onClose","onSave","onDelete","_a","isSaving","setIsSaving","fileName","setFileName","alternativeText","setAlternativeText","caption","setCaption","handleSave","previewSection","FileDeleteButton","FileDownloadButton","FileCopyLinkButton","FileFullscreenButton","metadataSection","getFileSize","formatDate","Field","FieldLabel","InputGroup","InputGroupInput","e","InputGroupAddon","InputGroupText","Label","Textarea","DetailsLayout","Button","import_react","import_lucide_react","import_jsx_runtime","VideoModal","file","onClose","onSave","onDelete","_a","_b","_c","isSaving","setIsSaving","fileName","setFileName","caption","setCaption","handleSave","previewSection","FileDeleteButton","FileDownloadButton","FileCopyLinkButton","metadataSection","getFileSize","formatDuration","formatDate","Field","FieldLabel","InputGroup","InputGroupInput","e","InputGroupAddon","InputGroupText","Label","Textarea","DetailsLayout","Button","import_react","import_lucide_react","import_lucide_react","import_jsx_runtime","AudioModal","file","onClose","onSave","onDelete","_a","_b","_c","isSaving","setIsSaving","fileName","setFileName","caption","setCaption","handleSave","previewSection","FileDeleteButton","FileDownloadButton","FileCopyLinkButton","metadataSection","getFileSize","formatDuration","formatDate","Field","FieldLabel","InputGroup","InputGroupInput","e","InputGroupAddon","InputGroupText","Label","Textarea","DetailsLayout","Button","import_react","import_lucide_react","import_jsx_runtime","FileModal","file","onClose","onSave","_a","_b","_c","_d","isSaving","setIsSaving","fileName","setFileName","description","setDescription","handleSave","__spreadProps","__spreadValues","ext","FilePreviewComponent","getFileComponents","previewSection","FileDeleteButton","FileDownloadButton","FileCopyLinkButton","metadataSection","getFileSize","formatDate","Field","FieldLabel","InputGroup","InputGroupInput","e","InputGroupAddon","InputGroupText","Label","Textarea","DetailsLayout","Button","import_jsx_runtime","FileManagerOverlays","className","fileDetailsModalFile","setFileDetailsModalFile","updateFileMetadata","useFileManager","handleClose","handleSave","updates","renderFileDetailsModal","getFileTypeFromMime","FILE_TYPE","ImageModal","VideoModal","AudioModal","FileModal","cn","UploadModal","CreateFolderModal","MoveModal","import_jsx_runtime","FileManagerPageProvider","_a","_b","children","props","__objRest","FileManagerProvider","__spreadProps","__spreadValues","MODE","SELECTION_MODE","FileManagerModalProvider","fileSelectionMode","acceptedFileTypes","viewMode","onFilesSelected","onClose","FileManagerComposition","FileManagerHeader","FileManagerFooter","FileManagerOverlays","import_jsx_runtime","MoveButton","setIsMoveFileModalOpen","useFileManager","Button","MoveIcon","DeleteButton","bulkDelete","TrashIcon","ClearSelectionButton","handleClearSelection","CrossIcon","BulkActionsStatic","selectedFiles","selectedFolders","BulkActionsFloating","className","import_jsx_runtime","Skeleton","_a","_b","className","props","__objRest","__spreadValues","cn","import_navigation","import_jsx_runtime","HeaderNavigation","currentFolder","handleFolderClick","isLoading","useFileManager","router","handleBackClick","Skeleton","Button","ChevronLeftIcon","middleTruncate","HomeIcon","import_lucide_react","import_lucide_react","import_radix_ui","import_jsx_runtime","DropdownMenu","_a","props","__objRest","DropdownMenuPrimitive","__spreadValues","DropdownMenuTrigger","_a","props","__objRest","DropdownMenuPrimitive","__spreadValues","DropdownMenuContent","_a","_b","className","sideOffset","props","__objRest","DropdownMenuPrimitive","__spreadValues","cn","DropdownMenuItem","_a","_b","className","inset","variant","props","__objRest","DropdownMenuPrimitive","__spreadValues","cn","DropdownMenuSeparator","_a","_b","className","props","__objRest","DropdownMenuPrimitive","__spreadValues","cn","import_react","import_cmdk","import_lucide_react","import_jsx_runtime","Command","_a","_b","className","props","__objRest","CommandPrimitive","__spreadValues","cn","CommandDialog","children","shouldFilter","Dialog","__spreadProps","DialogContent","DialogTitle","CommandInput","CommandList","CommandEmpty","CommandGroup","CommandItem","_a","_b","className","props","__objRest","CommandPrimitive","__spreadValues","cn","import_react","useDebouncedValue","value","delay","debouncedValue","setDebouncedValue","handler","import_sonner","import_jsx_runtime","SearchDialog","searchQuery","setSearchQuery","fileResults","setFileResults","folderResults","setFolderResults","loading","setLoading","provider","handleFolderClick","handleClearSelection","isSearchModalOpen","setIsSearchModalOpen","setFileDetailsModalFile","useFileManager","debouncedSearchQuery","useDebouncedValue","doSearch","q","files","folders","error","message","Button","SearchIcon","CommandDialog","open","CommandInput","value","CommandList","CommandEmpty","KbdGroup","Kbd","CommandGroup","folder","CommandItem","FolderIcon","middleTruncate","file","FilePreviewComponent","getFileComponents","import_class_variance_authority","import_lucide_react","import_radix_ui","import_jsx_runtime","checkboxVariants","Checkbox","_a","_b","className","size","props","__objRest","CheckboxPrimitive","__spreadProps","__spreadValues","cn","import_jsx_runtime","SearchAction","SearchDialog","UploadFileAction","setIsUploadModalOpen","useFileManager","Button","PlusIcon","CreateFolderAction","setIsCreateFolderModalOpen","UploadFolderIcon","import_jsx_runtime","ResponsiveHeaderActions","setIsUploadModalOpen","setIsCreateFolderModalOpen","setIsSearchModalOpen","useFileManager","UploadFileAction","CreateFolderAction","SearchAction","DropdownMenu","DropdownMenuTrigger","Button","DropdownMenuContent","DropdownMenuItem","PlusIcon","UploadFolderIcon","SearchIcon","ModalResponsiveHeaderActions","onSearchClick","import_lucide_react","import_react","import_lucide_react","ContextMenuPrimitive","import_lucide_react","import_jsx_runtime","ContextMenu","_a","props","__objRest","__spreadValues","ContextMenuTrigger","ContextMenuContent","_a","_b","className","props","__objRest","__spreadValues","cn","ContextMenuItem","inset","variant","ContextMenuSeparator","_a","_b","className","props","__objRest","__spreadValues","cn","import_jsx_runtime","CardContextMenu","children","menuItems","isInSelectionMode","mode","shouldShowMenu","renderMenuItems","isDropdown","item","index","isLast","isDestructive","MenuItemComponent","DropdownMenuItem","ContextMenuItem","SeparatorComponent","DropdownMenuSeparator","ContextMenuSeparator","nextItemIsDestructive","React","ContextMenu","ContextMenuTrigger","e","DropdownMenu","DropdownMenuTrigger","Button","DropdownMenuContent","ContextMenuContent","import_jsx_runtime","EditIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","SelectIcon","props","__spreadProps","__spreadValues","import_jsx_runtime","FileCard","file","isSelected","onSelect","onDelete","onEdit","onMove","selectionMode","showCheckbox","mode","MODE","isInSelectionMode","handleDelete","e","handleEdit","handleSelectFile","handleMove","handleClick","handleCheckboxChange","checked","handleCheckboxClick","FilePreviewComponent","FileMetadataComponent","getFileComponents","CardContextMenu","EditIcon","SelectIcon","TrashIcon","SELECTION_MODE","Checkbox","getFileSize","import_lucide_react","import_jsx_runtime","FolderCard","folder","isSelected","onSelect","onRightClick","onDelete","onRename","onMove","selectionMode","showCheckbox","mode","isInSelectionMode","handleDelete","e","handleRename","handleMove","handleSelectFolder","handleClick","handleCheckboxChange","checked","handleCheckboxClick","CardContextMenu","EditIcon","SelectIcon","TrashIcon","FolderIcon","SELECTION_MODE","Checkbox","import_jsx_runtime","UnifiedGrid","files","folders","isLoading","handleFileClick","handleFolderClick","bulkDelete","mode","selectionMode","isInSelectionMode","selectedFiles","selectedFolders","currentFolder","setSelectedFiles","setSelectedFolders","setIsRenameFolderModalOpen","setIsMoveFileModalOpen","setFileDetailsModalFile","setFolderToRename","useFileManager","skeletonCount","expectedFolders","expectedFiles","totalItems","_","i","folder","FolderCard","f","file","FileCard","import_react","import_lucide_react","import_jsx_runtime","FileManagerErrorBoundary","props","error","errorInfo","Button","import_react","KeyboardShortcuts","handleSelectAllGlobal","handleClearSelection","getSelectionState","isCreateFolderModalOpen","setIsCreateFolderModalOpen","isUploadModalOpen","setIsUploadModalOpen","isSearchModalOpen","setIsSearchModalOpen","useFileManager","handleKeyDown","e","import_jsx_runtime","FileManager","props","FileManagerErrorBoundary","FileManagerComposition","__spreadProps","__spreadValues","KeyboardShortcuts","HeaderNavigation","ResponsiveHeaderActions","BulkActionsFloating","UnifiedGrid","import_react","import_jsx_runtime","FileManagerModal","_a","_b","open","onClose","props","__objRest","FileManagerComposition","__spreadProps","__spreadValues","Dialog","ModalContent","updateSearchQuery","useFileManager","isSearchActive","setIsSearchActive","searchInput","setSearchInput","searchInputRef","debouncedSearch","useDebouncedValue","DialogContent","DialogHeader","DialogTitle","SearchIcon","Input","e","Button","CrossIcon","HeaderNavigation","ModalResponsiveHeaderActions","DialogDescription","UnifiedGrid","FileManagerModalFooter","selectedFiles","onFilesSelected","setSelectedFiles","setSelectedFolders","handlePageChange","DialogFooter","BulkActionsStatic","DialogClose","mockFolders","mockTags","mockFiles","delay","ms","resolve","MockProvider","folderId","folder","mockFolders","f","result","__spreadValues","current","parent","page","limit","query","filteredFolders","searchFiltered","searchLower","sortedFolders","a","b","totalFolders","totalPages","startIndex","mockTags","tag","fileTypes","filteredFiles","mockFiles","file","fileType","getFileTypeFromMime","sortedFiles","currentPage","filesPerPage","totalFiles","paginatedFiles","_a","_b","totalItems","endIndex","foldersToShow","foldersTaken","fileSlots","foldersOnPreviousPages","fileStartIndex","filesToShow","name","parentId","newFolder","videoSource","VIDEO_SOURCE","ext","files","uploadedFiles","newFile","FILE_TYPE","newName","fileId","updates","metaData","rootUpdates","__objRest","fileIds","fileIndex","folderIds","folderIndex","i","searchQuery","foundFiles","foundFolders","newFolderId","movedFiles","newParentId","movedFolders"]}