@plumile/ui 0.1.81 → 0.1.83

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.
Files changed (66) hide show
  1. package/README.md +1 -0
  2. package/lib/esm/BackofficeJsonViewerAsync-Czd9VhUz.js +10 -0
  3. package/lib/esm/{BackofficeJsonViewerAsync-B8Zm-apc.js.map → BackofficeJsonViewerAsync-Czd9VhUz.js.map} +1 -1
  4. package/lib/esm/{HighlightCode-C-xPmbUz.js → HighlightCode-KpWSo7Zx.js} +3 -3
  5. package/lib/esm/{HighlightCode-C-xPmbUz.js.map → HighlightCode-KpWSo7Zx.js.map} +1 -1
  6. package/lib/esm/{MarkdownCodeBlock-x4jjzmDF.js → MarkdownCodeBlock-B3PblX3D.js} +9 -4
  7. package/lib/esm/MarkdownCodeBlock-B3PblX3D.js.map +1 -0
  8. package/lib/esm/{MarkdownRenderer-Cc-CjEOF.js → MarkdownRenderer-RgELUK6t.js} +30 -30
  9. package/lib/esm/{MarkdownRenderer-Cc-CjEOF.js.map → MarkdownRenderer-RgELUK6t.js.map} +1 -1
  10. package/lib/esm/{MarkdownShikiCodeBlock-Dj-585Pp.js → MarkdownShikiCodeBlock-Dv7ONFFy.js} +2 -2
  11. package/lib/esm/{MarkdownShikiCodeBlock-Dj-585Pp.js.map → MarkdownShikiCodeBlock-Dv7ONFFy.js.map} +1 -1
  12. package/lib/esm/src-D6nEpsqe.js +78938 -0
  13. package/lib/esm/src-D6nEpsqe.js.map +1 -0
  14. package/lib/esm/style.css +1 -1
  15. package/lib/esm/ui.js +5 -5
  16. package/lib/types/backoffice/molecules/backoffice_detail_layout/backofficeDetailLayout.css.d.ts.map +1 -1
  17. package/lib/types/backoffice/molecules/backoffice_empty_state/backofficeEmptyState.css.d.ts.map +1 -1
  18. package/lib/types/backoffice/molecules/backoffice_filter_field/backofficeFilterField.css.d.ts.map +1 -1
  19. package/lib/types/backoffice/molecules/backoffice_filters_bar/backofficeFiltersBar.css.d.ts.map +1 -1
  20. package/lib/types/backoffice/molecules/backoffice_form_section/backofficeFormSection.css.d.ts.map +1 -1
  21. package/lib/types/backoffice/molecules/backoffice_key_value_list/backofficeKeyValueList.css.d.ts.map +1 -1
  22. package/lib/types/backoffice/molecules/backoffice_page_header/backofficePageHeader.css.d.ts.map +1 -1
  23. package/lib/types/backoffice/molecules/backoffice_relations_menu/backofficeRelationsMenu.css.d.ts.map +1 -1
  24. package/lib/types/backoffice/molecules/backoffice_table_toolbar/backofficeTableToolbar.css.d.ts.map +1 -1
  25. package/lib/types/backoffice/molecules/backoffice_tabs/backofficeTabs.css.d.ts.map +1 -1
  26. package/lib/types/backoffice/molecules/sidebar_nav_item/sidebarNavItem.css.d.ts.map +1 -1
  27. package/lib/types/backoffice/templates/detail_page_template/detailPageTemplate.css.d.ts.map +1 -1
  28. package/lib/types/components/charts/timeSeriesLineChart.css.d.ts.map +1 -1
  29. package/lib/types/components/dashboard/dashboard_grid/DashboardGrid.css.d.ts +7 -1
  30. package/lib/types/components/dashboard/dashboard_grid/DashboardGrid.css.d.ts.map +1 -1
  31. package/lib/types/components/dashboard/metadata_strip/MetadataStrip.css.d.ts.map +1 -1
  32. package/lib/types/components/dashboard/metric_tile_group/MetricTileGroup.css.d.ts.map +1 -1
  33. package/lib/types/components/dashboard/section_nav/SectionNav.css.d.ts.map +1 -1
  34. package/lib/types/components/dashboard/segmented_nav/SegmentedNav.css.d.ts.map +1 -1
  35. package/lib/types/components/dashboard/selectable_card/SelectableCard.css.d.ts.map +1 -1
  36. package/lib/types/components/layout/ActionPanel.css.d.ts +8 -0
  37. package/lib/types/components/layout/ActionPanel.css.d.ts.map +1 -0
  38. package/lib/types/components/layout/ActionPanel.d.ts +12 -0
  39. package/lib/types/components/layout/ActionPanel.d.ts.map +1 -0
  40. package/lib/types/components/layout/DetailSummaryHeader.css.d.ts +7 -0
  41. package/lib/types/components/layout/DetailSummaryHeader.css.d.ts.map +1 -0
  42. package/lib/types/components/layout/DetailSummaryHeader.d.ts +11 -0
  43. package/lib/types/components/layout/DetailSummaryHeader.d.ts.map +1 -0
  44. package/lib/types/components/layout/PageShell.css.d.ts.map +1 -1
  45. package/lib/types/components/tile/InfoTile.css.d.ts.map +1 -1
  46. package/lib/types/index.d.ts +2 -0
  47. package/lib/types/index.d.ts.map +1 -1
  48. package/lib/types/theme/ThemeProvider.d.ts +8 -7
  49. package/lib/types/theme/ThemeProvider.d.ts.map +1 -1
  50. package/lib/types/theme/index.d.ts +1 -0
  51. package/lib/types/theme/index.d.ts.map +1 -1
  52. package/lib/types/theme/sprinkles.css.d.ts +65 -31
  53. package/lib/types/theme/sprinkles.css.d.ts.map +1 -1
  54. package/lib/types/theme/theme-dark.css.d.ts +2 -0
  55. package/lib/types/theme/theme-dark.css.d.ts.map +1 -0
  56. package/lib/types/theme/theme-light.css.d.ts +2125 -0
  57. package/lib/types/theme/theme-light.css.d.ts.map +1 -0
  58. package/lib/types/theme/theme.css.d.ts +3 -1
  59. package/lib/types/theme/theme.css.d.ts.map +1 -1
  60. package/lib/types/theme/themeContract.d.ts +5 -0
  61. package/lib/types/theme/themeContract.d.ts.map +1 -1
  62. package/package.json +2 -2
  63. package/lib/esm/BackofficeJsonViewerAsync-B8Zm-apc.js +0 -10
  64. package/lib/esm/MarkdownCodeBlock-x4jjzmDF.js.map +0 -1
  65. package/lib/esm/src-CIl48Z7Y.js +0 -74961
  66. package/lib/esm/src-CIl48Z7Y.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"src-D6nEpsqe.js","names":[],"sources":["../../src/theme/accessibility.css.ts","../../src/theme/theme.css.ts","../../src/theme/ThemeProvider.tsx","../../src/theme/VisuallyHidden.tsx","../../src/theme/containerQueries.ts","../../src/theme/sprinkles.css.ts","../../src/theme/common.ts","../../src/atomic/atoms/badge/badge.css.ts","../../src/atomic/atoms/badge/Badge.tsx","../../src/icons/ButtonLoadingSpinnerSvg.tsx","../../src/i18n/useUiTranslation.ts","../../src/atomic/atoms/button/button.css.ts","../../src/atomic/atoms/button/Button.tsx","../../src/atomic/atoms/button/LinkButton.tsx","../../src/atomic/atoms/checkbox/checkbox.css.ts","../../src/atomic/atoms/input/input.css.ts","../../src/atomic/atoms/input/Input.tsx","../../src/atomic/atoms/label/label.css.ts","../../src/atomic/atoms/label/Label.tsx","../../src/atomic/atoms/checkbox/Checkbox.tsx","../../src/atomic/atoms/error_message/errorMessage.css.ts","../../src/atomic/atoms/error_message/ErrorMessage.tsx","../../src/atomic/atoms/formatted-date/FormattedDate.tsx","../../src/atomic/atoms/relative-time-text/RelativeTimeText.tsx","../../src/atomic/atoms/icon-button/IconMenuButton.tsx","../../src/icons/ModalCloseSvg.tsx","../../src/atomic/atoms/overlay/overlay.css.ts","../../src/atomic/atoms/overlay/Overlay.tsx","../../src/atomic/atoms/modal/modal.css.ts","../../src/atomic/atoms/modal/Modal.tsx","../../src/atomic/atoms/textarea/textarea.css.ts","../../src/atomic/atoms/textarea/Textarea.tsx","../../src/atomic/molecules/card/Card.css.ts","../../src/atomic/molecules/card/Card.tsx","../../src/icons/SidebarHomeSvg.tsx","../../src/atomic/molecules/breadcrumb_navigation/breadcrumbNavigation.css.ts","../../src/icons/ChevronDownSvg.tsx","../../src/atomic/molecules/dropdown/dropdown.css.ts","../../src/atomic/molecules/dropdown/Dropdown.tsx","../../src/atomic/molecules/breadcrumb_navigation/BreadcrumbMenuPopover.tsx","../../src/atomic/molecules/breadcrumb_navigation/BreadcrumbMenuDropdown.tsx","../../src/atomic/molecules/breadcrumb_navigation/BreadcrumbNavigation.tsx","../../src/atomic/molecules/form-actions/FormActions.tsx","../../src/atomic/molecules/checkbox_field/checkboxField.css.ts","../../src/atomic/molecules/checkbox_field/CheckboxField.tsx","../../src/icons/FormErrorAlertSvg.tsx","../../src/atomic/molecules/form_error/formError.css.ts","../../src/atomic/molecules/form_error/FormError.tsx","../../src/atomic/molecules/form_field/formField.css.ts","../../src/atomic/molecules/form_field/FormField.tsx","../../src/atomic/molecules/form/formStyles.css.ts","../../src/atomic/molecules/form/Form.tsx","../../src/atomic/molecules/form/FormErrorBanner.css.ts","../../src/atomic/molecules/form/FormErrorBanner.tsx","../../src/atomic/molecules/form/FormGroup.tsx","../../src/atomic/molecules/markdown/components/LazyMarkdownCodeBlock.tsx","../../src/atomic/molecules/markdown/LazyMarkdownRenderer.css.ts","../../src/atomic/molecules/markdown/LazyMarkdownRenderer.tsx","../../src/atomic/molecules/markdown/markdownVars.css.ts","../../src/atomic/molecules/empty-state/EmptyState.css.ts","../../src/atomic/molecules/empty-state/EmptyState.tsx","../../src/atomic/molecules/tabs/tabs.css.ts","../../src/atomic/molecules/tabs/Tabs.tsx","../../src/atomic/molecules/toast/toast.css.ts","../../src/atomic/molecules/toast/constants.ts","../../src/atomic/molecules/toast/ToastViewport.tsx","../../src/atomic/molecules/toast/ToastProvider.tsx","../../src/atomic/organisms/login_form/useLoginForm.ts","../../src/atomic/organisms/login_form/loginForm.css.ts","../../src/atomic/organisms/login_form/LoginForm.tsx","../../src/atomic/organisms/sidebar/sidebar.css.ts","../../src/atomic/organisms/sidebar/SidebarContainer.tsx","../../src/icons/ChevronLeftSvg.tsx","../../src/icons/ChevronRightSvg.tsx","../../src/icons/GlobeSvg.tsx","../../src/icons/ProjectsFolderSvg.tsx","../../src/icons/SidebarInitiativesSvg.tsx","../../src/icons/SidebarPlusSvg.tsx","../../src/icons/SidebarSearchSvg.tsx","../../src/icons/SidebarSettingsSvg.tsx","../../src/icons/SidebarTasksSvg.tsx","../../src/icons/SidebarTeamSvg.tsx","../../src/atomic/organisms/sidebar/icons.tsx","../../src/atomic/organisms/sidebar/navigationSidebar.css.ts","../../src/atomic/organisms/sidebar/NavigationSidebar.tsx","../../src/atomic/templates/auth_layout/authLayout.css.ts","../../src/atomic/templates/auth_layout/AuthLayout.tsx","../../src/backoffice/molecules/backoffice_page_header/backofficePageHeader.css.ts","../../src/backoffice/molecules/backoffice_page_header/BackofficePageHeader.tsx","../../src/atomic/templates/page-container/pageContainer.css.ts","../../src/atomic/templates/page-container/PageContainer.tsx","../../src/atomic/templates/detail-page/detailPage.css.ts","../../src/atomic/templates/detail-page/DetailPage.tsx","../../src/components/charts/timeSeriesLineChart.css.ts","../../src/components/charts/TimeSeriesLineChart.tsx","../../src/components/data-table/DataTable.css.ts","../../src/components/data-table/DataTable.tsx","../../src/components/data-table/TableCell.css.ts","../../src/components/data-table/TableCellBase.tsx","../../src/components/data-table/TableCell.tsx","../../src/components/layout/PanelShell.tsx","../../src/components/layout/ActionPanel.css.ts","../../src/components/layout/ActionPanel.tsx","../../src/components/layout/AppHeader.css.ts","../../src/components/layout/AppHeader.tsx","../../src/components/layout/ContentLayout.css.ts","../../src/components/layout/ContentLayout.tsx","../../src/components/layout/DetailSummaryHeader.css.ts","../../src/components/layout/DetailSummaryHeader.tsx","../../src/components/layout/PageShell.css.ts","../../src/components/layout/PageShell.tsx","../../src/components/layout/AppShell.tsx","../../src/backoffice/atoms/status_badge/statusBadge.css.ts","../../src/backoffice/atoms/status_badge/StatusBadge.tsx","../../src/components/dashboard/activity_card/ActivityCard.css.ts","../../src/components/dashboard/activity_card/ActivityCard.tsx","../../src/components/dashboard/activity_feed/ActivityFeed.css.ts","../../src/components/dashboard/activity_feed/ActivityFeed.tsx","../../src/components/dashboard/dashboard_grid/DashboardGrid.css.ts","../../src/components/dashboard/dashboard_grid/DashboardGrid.tsx","../../src/components/dashboard/metadata_strip/MetadataStrip.css.ts","../../src/components/dashboard/metadata_strip/MetadataStrip.tsx","../../src/components/dashboard/metric_card/MetricCard.css.ts","../../src/components/dashboard/metric_card/MetricCard.tsx","../../src/components/dashboard/metric_tile_group/MetricTileGroup.css.ts","../../src/components/dashboard/metric_tile_group/MetricTileGroup.tsx","../../src/components/dashboard/page_hero/PageHero.css.ts","../../src/components/dashboard/page_hero/PageHero.tsx","../../src/components/dashboard/segmented_nav/SegmentedNav.css.ts","../../src/components/dashboard/segmented_nav/SegmentedNav.tsx","../../src/components/dashboard/section_nav/SectionNav.css.ts","../../src/components/dashboard/section_nav/SectionNav.tsx","../../src/components/dashboard/selectable_card/SelectableCard.css.ts","../../src/components/dashboard/selectable_card/SelectableCard.tsx","../../src/components/layout/SidebarPageLayout.tsx","../../src/components/layout/SettingsLayout.css.ts","../../src/components/layout/SettingsLayout.tsx","../../src/backoffice/molecules/backoffice_key_value_list/backofficeKeyValueList.css.ts","../../src/backoffice/molecules/backoffice_key_value_list/BackofficeKeyValueList.tsx","../../src/components/dashboard/status_summary_panel/StatusSummaryPanel.css.ts","../../src/components/dashboard/status_summary_panel/StatusSummaryPanel.tsx","../../src/components/dashboard/timeline_event_row/TimelineEventRow.css.ts","../../src/components/dashboard/timeline_event_row/TimelineEventRow.tsx","../../src/components/layout/SplitViewLayout.css.ts","../../src/components/layout/SplitViewLayout.tsx","../../src/components/layout/ToolbarRow.css.ts","../../src/components/layout/ToolbarRow.tsx","../../src/shared/agentText.ts","../../src/components/agent/AgentMarkdownCard.css.ts","../../src/components/agent/AgentMarkdownCard.tsx","../../src/components/select/SimpleSelect.css.ts","../../src/components/select/SimpleSelect.tsx","../../src/components/subscriptions/RefetchNeededBanner.css.ts","../../src/components/subscriptions/RefetchNeededBanner.tsx","../../src/components/layout/TabsContentLayout.css.ts","../../src/components/layout/TabsContentLayout.tsx","../../src/components/tile/InfoTile.css.ts","../../src/components/tile/InfoTile.tsx","../../src/components/data-table/VirtualizedConnectionTable.css.ts","../../src/components/data-table/VirtualizedConnectionTable.tsx","../../src/backoffice/atoms/copyable_text/copyableText.css.ts","../../src/backoffice/atoms/copyable_text/CopyableText.tsx","../../src/backoffice/atoms/backoffice_id_badge/backofficeIdBadge.css.ts","../../src/backoffice/atoms/backoffice_id_badge/BackofficeIdBadge.tsx","../../src/backoffice/atoms/environment_badge/environmentBadge.css.ts","../../src/backoffice/atoms/environment_badge/EnvironmentBadge.tsx","../../src/backoffice/atoms/shortcut_hint/shortcutHint.css.ts","../../src/backoffice/atoms/shortcut_hint/ShortcutHint.tsx","../../src/backoffice/atoms/skeleton/skeleton.css.ts","../../src/backoffice/atoms/skeleton/Skeleton.tsx","../../src/backoffice/atoms/spinner/spinner.css.ts","../../src/backoffice/atoms/spinner/Spinner.tsx","../../src/backoffice/atoms/tag/tag.css.ts","../../src/backoffice/atoms/tag/Tag.tsx","../../src/backoffice/molecules/backoffice_detail_layout/backofficeDetailLayout.css.ts","../../src/backoffice/molecules/backoffice_detail_layout/BackofficeDetailLayout.tsx","../../src/backoffice/molecules/backoffice_empty_state/backofficeEmptyState.css.ts","../../src/backoffice/molecules/backoffice_empty_state/BackofficeEmptyState.tsx","../../src/backoffice/molecules/backoffice_filter_drawer/backofficeFilterDrawer.css.ts","../../src/backoffice/molecules/backoffice_filter_drawer/BackofficeFilterDrawer.tsx","../../src/backoffice/molecules/backoffice_filter_field/backofficeFilterField.css.ts","../../src/backoffice/molecules/backoffice_filter_field/BackofficeFilterField.tsx","../../src/backoffice/molecules/backoffice_filters_bar/backofficeFiltersBar.css.ts","../../src/backoffice/molecules/backoffice_filters_bar/BackofficeFiltersBar.tsx","../../src/backoffice/molecules/backoffice_form_section/backofficeFormSection.css.ts","../../src/backoffice/molecules/backoffice_form_section/BackofficeFormSection.tsx","../../src/backoffice/molecules/confirm_dialog/confirmDialog.css.ts","../../src/backoffice/molecules/confirm_dialog/ConfirmDialog.tsx","../../src/backoffice/molecules/backoffice_json_viewer/backofficeJsonViewer.css.ts","../../src/backoffice/molecules/backoffice_json_viewer/BackofficeJsonViewer.tsx","../../src/backoffice/molecules/backoffice_json_viewer/LazyBackofficeJsonViewer.css.ts","../../src/backoffice/molecules/backoffice_json_viewer/LazyBackofficeJsonViewer.tsx","../../src/backoffice/molecules/backoffice_load_more/backofficeLoadMore.css.ts","../../src/backoffice/molecules/backoffice_load_more/BackofficeLoadMore.tsx","../../src/backoffice/molecules/backoffice_relations_menu/backofficeRelationsMenu.css.ts","../../src/backoffice/molecules/backoffice_relations_menu/BackofficeRelationsMenu.tsx","../../src/backoffice/molecules/backoffice_table_skeleton/backofficeTableSkeleton.css.ts","../../src/backoffice/molecules/backoffice_table_skeleton/BackofficeTableSkeleton.tsx","../../src/backoffice/molecules/backoffice_table_toolbar/backofficeTableToolbar.css.ts","../../src/backoffice/molecules/backoffice_table_toolbar/BackofficeTableToolbar.tsx","../../src/backoffice/molecules/backoffice_tabs/backofficeTabs.css.ts","../../src/backoffice/molecules/backoffice_tabs/BackofficeTabs.tsx","../../src/backoffice/molecules/bulk_actions_bar/bulkActionsBar.css.ts","../../src/backoffice/molecules/bulk_actions_bar/BulkActionsBar.tsx","../../src/backoffice/molecules/filter_chip_row/filterChipRow.css.ts","../../src/backoffice/molecules/filter_chip_row/FilterChipRow.tsx","../../src/backoffice/molecules/global_search_input/globalSearchInput.css.ts","../../src/backoffice/molecules/global_search_input/GlobalSearchInput.tsx","../../src/backoffice/molecules/inline_banner/inlineBanner.css.ts","../../src/backoffice/molecules/inline_banner/InlineBanner.tsx","../../src/backoffice/molecules/sidebar_nav_item/sidebarNavItem.css.ts","../../src/backoffice/molecules/sidebar_nav_item/SidebarNavItem.tsx","../../src/backoffice/molecules/sidebar_nav_section/sidebarNavSection.css.ts","../../src/backoffice/molecules/sidebar_nav_section/SidebarNavSection.tsx","../../src/icons/ProfileDropdownLogoutSvg.tsx","../../src/backoffice/molecules/sidebar_profile_menu/sidebarProfileMenu.css.ts","../../src/backoffice/molecules/sidebar_profile_menu/BackofficeSidebarProfileMenu.tsx","../../src/backoffice/molecules/sidebar_collapse_toggle/sidebarCollapseToggle.css.ts","../../src/backoffice/molecules/sidebar_collapse_toggle/SidebarCollapseToggle.tsx","../../src/backoffice/molecules/table_toolbar/tableToolbar.css.ts","../../src/backoffice/molecules/table_toolbar/TableToolbar.tsx","../../src/backoffice/organisms/audit_timeline/auditTimeline.css.ts","../../src/backoffice/organisms/audit_timeline/AuditTimeline.tsx","../../src/backoffice/organisms/backoffice_data_table/backofficeDataTable.css.ts","../../src/backoffice/organisms/backoffice_data_table/BackofficeDataTable.tsx","../../src/backoffice/organisms/backoffice_virtualized_connection_table/BackofficeVirtualizedConnectionTable.tsx","../../src/backoffice/organisms/entity_header/entityHeader.css.ts","../../src/backoffice/organisms/entity_header/EntityHeader.tsx","../../src/backoffice/templates/detail_page_template/detailPageTemplate.css.ts","../../src/backoffice/templates/detail_page_template/DetailPageTemplate.tsx","../../src/backoffice/templates/list_page_template/listPageTemplate.css.ts","../../src/backoffice/templates/list_page_template/ListPageTemplate.tsx","../../src/admin/organisms/admin_sidebar/adminSidebar.css.ts","../../src/admin/organisms/admin_sidebar/AdminSidebar.tsx","../../src/admin/organisms/admin_topbar/adminTopbar.css.ts","../../src/admin/organisms/admin_topbar/AdminTopbar.tsx","../../src/admin/templates/admin_shell_layout/AdminShellLayout.tsx","../../src/admin/theme/adminTheme.css.ts","../../src/admin/theme/AdminThemeProvider.tsx","../../src/shared/agentJobRequestFormatting.ts","../../src/shared/backofficeTableDensity.css.ts","../../src/pages/WrapperPage.tsx","../../src/icons/BanSvg.tsx","../../src/icons/ChatSizeLargeSvg.tsx","../../src/icons/ChatSizeMediumSvg.tsx","../../src/icons/ChatSizeSmallSvg.tsx","../../src/icons/ChatCheckSvg.tsx","../../src/icons/ChatXSvg.tsx","../../src/icons/CheckSvg.tsx","../../src/icons/CoinOffSvg.tsx","../../src/icons/ClockSvg.tsx","../../src/icons/DatabaseCheckSvg.tsx","../../src/icons/DatabaseXSvg.tsx","../../src/icons/DevModeSvg.tsx","../../src/icons/EyeSvg.tsx","../../src/icons/GripDotsSvg.tsx","../../src/icons/HomeActivityAssignUserSvg.tsx","../../src/icons/HomeStatsCheckBadgeSvg.tsx","../../src/icons/HomeStatsClipboardSvg.tsx","../../src/icons/HomeStatsClockSvg.tsx","../../src/icons/KeyOffSvg.tsx","../../src/icons/KeySvg.tsx","../../src/icons/LinkCheckSvg.tsx","../../src/icons/LinkXSvg.tsx","../../src/icons/LockOpenSvg.tsx","../../src/icons/LockSvg.tsx","../../src/icons/MailCheckSvg.tsx","../../src/icons/MailXSvg.tsx","../../src/icons/PencilSvg.tsx","../../src/icons/PinFilledSvg.tsx","../../src/icons/PinSvg.tsx","../../src/icons/ProfileDropdownOrganizationSvg.tsx","../../src/icons/RobotCheckSvg.tsx","../../src/icons/RobotSvg.tsx","../../src/icons/RobotXSvg.tsx","../../src/icons/RocketOffSvg.tsx","../../src/icons/RocketSvg.tsx","../../src/icons/SendCheckSvg.tsx","../../src/icons/SendMessageSvg.tsx","../../src/icons/SendXSvg.tsx","../../src/icons/SettingsCheckSvg.tsx","../../src/icons/SettingsXSvg.tsx","../../src/icons/ShieldLockSvg.tsx","../../src/icons/ShieldOffSvg.tsx","../../src/icons/TaskAttachmentSvg.tsx","../../src/icons/TaskCommentBubbleSvg.tsx","../../src/icons/TaskDependencyBlockedSvg.tsx","../../src/icons/TaskDependencyReadySvg.tsx","../../src/icons/WrenchSvg.tsx","../../src/icons/XBadgeSvg.tsx","../../src/svg/ChevronDownIcon.tsx"],"sourcesContent":["import { keyframes, style } from '@vanilla-extract/css';\n\nimport { sprinkles } from './sprinkles.css.js';\n\nexport const visuallyHidden = sprinkles({\n borderWidth: 0,\n borderStyle: 'none',\n clip: 'hidden',\n height: 'px',\n margin: '-px',\n overflow: 'hidden',\n padding: 0,\n position: 'absolute',\n width: 'px',\n});\n\nexport const spinAnimation = keyframes({\n '0%': { transform: 'rotate(0deg)' },\n '100%': { transform: 'rotate(360deg)' },\n});\n\nexport const spin = style({\n animation: `${spinAnimation} 1s linear infinite`,\n});\n","import { createGlobalTheme } from '@vanilla-extract/css';\n\nimport { lightThemeClass, lightThemeValues } from './theme-light.css.js';\nimport { darkThemeClass } from './theme-dark.css.js';\nimport { vars } from './themeContract.js';\n\ncreateGlobalTheme(':root', vars, lightThemeValues);\n\nexport { darkThemeClass, lightThemeClass, lightThemeValues };\n","import {\n type JSX,\n type ReactNode,\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\n\nimport './accessibility.css.js';\nimport './global.css.js';\nimport { darkThemeClass, lightThemeClass } from './theme.css.js';\n\nexport type ThemeMode = 'system' | 'light' | 'dark';\nexport type ResolvedTheme = 'light' | 'dark';\n\ntype ThemeContextValue = {\n mode: ThemeMode;\n resolvedTheme: ResolvedTheme;\n setMode: (mode: ThemeMode) => void;\n};\n\nconst ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\n\nexport const THEME_MODE_KEY = 'plumile-theme-mode';\n\ntype ThemeProviderProps = {\n children: ReactNode;\n defaultMode?: ThemeMode;\n};\n\nconst getSystemTheme = (): ResolvedTheme => {\n if (\n typeof window === 'undefined' ||\n typeof window.matchMedia !== 'function'\n ) {\n return 'light';\n }\n\n if (window.matchMedia('(prefers-color-scheme: dark)').matches) {\n return 'dark';\n }\n\n return 'light';\n};\n\nconst resolveTheme = (\n mode: ThemeMode,\n systemTheme: ResolvedTheme,\n): ResolvedTheme => {\n if (mode === 'system') {\n return systemTheme;\n }\n\n return mode;\n};\n\nconst readStoredMode = (defaultMode: ThemeMode): ThemeMode => {\n if (typeof window === 'undefined') {\n return defaultMode;\n }\n\n const savedMode = window.localStorage.getItem(THEME_MODE_KEY);\n\n if (savedMode === 'system' || savedMode === 'light' || savedMode === 'dark') {\n return savedMode;\n }\n\n return defaultMode;\n};\n\nexport const ThemeProvider = ({\n children,\n defaultMode = 'system',\n}: ThemeProviderProps): JSX.Element => {\n const [mode, setMode] = useState<ThemeMode>(() => {\n return readStoredMode(defaultMode);\n });\n const [systemTheme, setSystemTheme] = useState<ResolvedTheme>(() => {\n return getSystemTheme();\n });\n const resolvedTheme = resolveTheme(mode, systemTheme);\n\n useEffect(() => {\n if (\n mode === 'system' &&\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function'\n ) {\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\n const updateSystemTheme = (\n event?: MediaQueryList | MediaQueryListEvent,\n ): void => {\n const matchesDarkTheme = event?.matches ?? mediaQuery.matches;\n\n if (matchesDarkTheme) {\n setSystemTheme('dark');\n return;\n }\n\n setSystemTheme('light');\n };\n\n updateSystemTheme(mediaQuery);\n mediaQuery.addEventListener('change', updateSystemTheme);\n\n return () => {\n mediaQuery.removeEventListener('change', updateSystemTheme);\n };\n }\n\n return undefined;\n }, [mode]);\n\n useEffect(() => {\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n window.localStorage.setItem(THEME_MODE_KEY, mode);\n return undefined;\n }, [mode]);\n\n useEffect(() => {\n if (typeof document === 'undefined') {\n return undefined;\n }\n\n const root = document.documentElement;\n let themeClass = lightThemeClass;\n\n if (resolvedTheme === 'dark') {\n themeClass = darkThemeClass;\n }\n\n root.classList.remove(lightThemeClass, darkThemeClass);\n root.classList.add(themeClass);\n\n return () => {\n root.classList.remove(lightThemeClass, darkThemeClass);\n };\n }, [resolvedTheme]);\n\n const value = useMemo(() => {\n return {\n mode,\n resolvedTheme,\n setMode,\n };\n }, [mode, resolvedTheme]);\n\n return (\n <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>\n );\n};\n\nexport const useTheme = (): ThemeContextValue => {\n const context = useContext(ThemeContext);\n\n if (context == null) {\n throw new Error('useTheme must be used within a ThemeProvider');\n }\n\n return context;\n};\n","import { type ComponentPropsWithoutRef, type JSX } from 'react';\n\nimport { visuallyHidden } from './accessibility.css.js';\nimport { cx } from './tools.js';\n\ntype Props = ComponentPropsWithoutRef<'span'>;\n\n/**\n * Accessible helper that keeps the content available to assistive tech\n * while removing it from the visual flow.\n */\nexport const VisuallyHidden = ({ className, ...rest }: Props): JSX.Element => {\n return <span {...rest} className={cx(visuallyHidden, className)} />;\n};\n","export const containerQueries = {\n '3xs': '(min-width: 360px)',\n '2xs': '(min-width: 480px)',\n xs: '(min-width: 640px)',\n sm: '(min-width: 768px)',\n md: '(min-width: 1024px)',\n lg: '(min-width: 1280px)',\n xl: '(min-width: 1440px)',\n xxl: '(min-width: 1680px)',\n} as const;\n\nexport type ContainerQueryKey = keyof typeof containerQueries;\n","import { defineProperties, createSprinkles } from '@vanilla-extract/sprinkles';\nimport { vars } from './themeContract.js';\nimport { screens, spacing } from './common.js';\n\nconst NONE = 'none' as const;\nconst FLEX_START = 'flex-start' as const;\nconst FLEX_END = 'flex-end' as const;\nconst CENTER = 'center' as const;\nconst STRETCH = 'stretch' as const;\nconst BASELINE = 'baseline' as const;\n\nconst otherProperties = defineProperties({\n properties: {\n all: ['inherit', 'initial', 'revert', 'revert-layer', 'unset'],\n appearance: ['auto', 'none'],\n cursor: [\n 'alias',\n 'all-scroll',\n 'auto',\n 'cell',\n 'col-resize',\n 'context-menu',\n 'copy',\n 'crosshair',\n 'default',\n 'e-resize',\n 'ew-resize',\n 'grab',\n 'grabbing',\n 'help',\n 'move',\n 'n-resize',\n 'ne-resize',\n 'nesw-resize',\n 'no-drop',\n 'none',\n 'not-allowed',\n 'ns-resize',\n 'nw-resize',\n 'nwse-resize',\n 'pointer',\n 'progress',\n 'row-resize',\n 's-resize',\n 'se-resize',\n 'sw-resize',\n 'text',\n 'vertical-text',\n 'w-resize',\n 'wait',\n 'zoom-in',\n 'zoom-out',\n ],\n animation: vars.animation,\n arrows: {\n hidden: {\n WebkitAppearance: 'none',\n MozAppearance: 'textfield',\n '&::-webkit-inner-spin-button, &::-webkit-outer-spin-button': {\n WebkitAppearance: 'none',\n margin: 0,\n },\n },\n },\n backgroundSize: {\n auto: 'auto',\n contain: 'contain',\n cover: 'cover',\n skeleton: '300% 100%',\n },\n border: {\n none: 'none',\n spinner: `2px solid color-mix(in srgb, ${vars.colors.white} 30%, transparent)`,\n },\n clip: {\n hidden: 'rect(0 0 0 0)',\n },\n containerType: ['inline-size', 'normal', 'size'],\n fontStyle: ['normal', 'italic'],\n font: ['inherit'],\n objectPosition: vars.objectPosition,\n objectFit: ['contain', 'cover', 'fill', 'none', 'scale-down'],\n order: vars.order,\n placeHolder: {\n italic: {\n '::placeholder': {\n fontStyle: 'italic',\n // color: vars.colors['slate-400'],\n fontWeight: vars.fontWeight.light,\n },\n },\n },\n\n pointerEvents: ['none', 'auto'],\n msOverflowStyle: ['auto', 'none'],\n rotate: vars.rotate,\n scrollBar: {\n light: {\n '&::-webkit-scrollbar': {\n background: 'transparent',\n width: spacing[1.5],\n },\n '&::-webkit-scrollbar-thumb': {\n background: 'white',\n borderRadius: spacing[1.5],\n },\n },\n hidden: {\n '&::-webkit-scrollbar': {\n WebkitAppearance: 'none',\n display: 'none',\n },\n MsOverflowStyle: 'none',\n scrollbarWidth: 'none',\n },\n },\n scrollbarColor: {\n auto: 'auto',\n border: `${vars.colors.border} transparent`,\n borderLight: `${vars.colors.borderLight} transparent`,\n },\n scrollbarWidth: ['auto', 'none', 'thin'],\n skew: vars.skew,\n textDecoration: ['none', 'line-through', 'underline'],\n textDecorationThickness: vars.textDecorationThickness,\n textIndent: vars.spacing,\n textTransform: ['uppercase', 'lowercase', 'capitalize'],\n textUnderlineOffset: vars.textUnderlineOffset,\n transform: vars.transform,\n transformOrigin: {\n topLeft: 'top left',\n },\n transitionDelay: vars.transitionDelay,\n transitionDuration: vars.transitionDuration,\n transitionProperty: vars.transitionProperty,\n transitionTimingFunction: vars.transitionTimingFunction,\n verticalAlign: ['baseline', 'middle', 'sub', 'super', 'top'],\n willChange: ['background-position', 'transform'],\n zIndex: vars.zIndex,\n },\n});\n\nconst responsiveProperties = defineProperties({\n conditions: {\n base: {},\n sm: { '@media': screens.sm },\n md: { '@media': screens.md },\n lg: { '@media': screens.lg },\n xl: { '@media': screens.xl },\n xxl: { '@media': screens.xxl },\n max900: { '@media': 'screen and (max-width: 900px)' },\n max1023: { '@media': 'screen and (max-width: 1023px)' },\n min1200: { '@media': 'screen and (min-width: 1200px)' },\n },\n defaultCondition: 'base',\n properties: {\n /**\n * The order of fontSize in this file has an impact on CSS rule priority\n */\n fontSize: {\n '3xs': {\n fontSize: vars.fontSize['3xs'],\n lineHeight: vars.lineHeight['3xs'],\n },\n '2xs': {\n fontSize: vars.fontSize['2xs'],\n lineHeight: vars.lineHeight['2xs'],\n },\n xs: {\n fontSize: vars.fontSize.xs,\n lineHeight: vars.lineHeight.xs,\n },\n sm: {\n fontSize: vars.fontSize.sm,\n lineHeight: vars.lineHeight.sm,\n },\n base: {\n fontSize: vars.fontSize.base,\n lineHeight: vars.lineHeight.base,\n },\n lg: {\n fontSize: vars.fontSize.lg,\n lineHeight: vars.lineHeight.lg,\n },\n xl: {\n fontSize: vars.fontSize.xl,\n lineHeight: vars.lineHeight.xl,\n },\n '2xl': {\n fontSize: vars.fontSize['2xl'],\n lineHeight: vars.lineHeight['2xl'],\n },\n '3xl': {\n fontSize: vars.fontSize['3xl'],\n lineHeight: vars.lineHeight['3xl'],\n },\n '4xl': {\n fontSize: vars.fontSize['4xl'],\n },\n '5xl': {\n fontSize: vars.fontSize['5xl'],\n lineHeight: vars.lineHeight['5xl'],\n },\n '6xl': {\n fontSize: vars.fontSize['6xl'],\n lineHeight: vars.lineHeight['6xl'],\n },\n '7xl': {\n fontSize: vars.fontSize['7xl'],\n lineHeight: vars.lineHeight['7xl'],\n },\n '8xl': {\n fontSize: vars.fontSize['8xl'],\n lineHeight: vars.lineHeight['8xl'],\n },\n '9xl': {\n fontSize: vars.fontSize['9xl'],\n lineHeight: vars.lineHeight['9xl'],\n },\n responsive: {\n fontSize: vars.fontSize.responsive,\n lineHeight: vars.lineHeight.responsive,\n },\n },\n alignItems: [STRETCH, FLEX_START, CENTER, FLEX_END, BASELINE],\n alignSelf: ['auto', FLEX_START, CENTER, FLEX_END, STRETCH],\n borderColor: vars.colors,\n borderWidth: vars.borderWidth,\n borderStyle: [NONE, 'dashed', 'solid'],\n borderRadius: vars.borderRadius,\n borderTop: [NONE],\n borderRight: [NONE],\n borderBottom: [NONE],\n borderLeft: [NONE],\n borderTopColor: vars.colors,\n borderRightColor: vars.colors,\n borderBottomColor: vars.colors,\n borderLeftColor: vars.colors,\n borderTopWidth: vars.borderWidth,\n borderRightWidth: vars.borderWidth,\n borderBottomWidth: vars.borderWidth,\n borderLeftWidth: vars.borderWidth,\n borderTopRightRadius: vars.borderRadius,\n borderTopLeftRadius: vars.borderRadius,\n borderBottomRightRadius: vars.borderRadius,\n borderBottomLeftRadius: vars.borderRadius,\n borderSpacing: vars.borderSpacing,\n borderCollapse: ['collapse', 'separate'],\n bottom: vars.spacing,\n boxShadow: vars.boxShadow,\n columnGap: vars.spacing,\n display: [\n 'none',\n 'block',\n 'contents',\n 'flex',\n 'grid',\n 'inline',\n 'inline-flex',\n 'inline-block',\n 'table',\n 'table-cell',\n 'table-header-group',\n 'table-row',\n 'table-row-group',\n ],\n dropShadow: vars.dropShadow,\n flex: vars.flex,\n flexBasis: vars.flexBasis,\n flexDirection: ['row', 'column', 'row-reverse'],\n flexGrow: vars.flexGrow,\n flexShrink: vars.flexShrink,\n flexWrap: ['nowrap', 'wrap', 'wrap-reverse'],\n fontVariantNumeric: {\n 'tabular-nums': 'tabular-nums',\n },\n fontFamily: vars.fontFamily,\n fontWeight: vars.fontWeight,\n gap: vars.spacing,\n gridAutoColumns: vars.gridAutoColumns,\n gridAutoRows: vars.gridAutoRows,\n gridColumn: vars.gridColumn,\n gridColumnEnd: vars.gridColumnEnd,\n gridColumnStart: vars.gridColumnStart,\n gridRow: vars.gridRow,\n gridRowEnd: vars.gridRowEnd,\n gridRowStart: vars.gridRowStart,\n gridTemplateColumns: vars.gridTemplateColumns,\n gridTemplateRows: vars.gridTemplateRows,\n height: vars.height,\n hueRotate: vars.hueRotate,\n inset: vars.inset,\n invert: vars.invert,\n justifyContent: [\n 'center',\n 'flex-end',\n 'flex-start',\n 'space-between',\n 'stretch',\n 'space-around',\n ],\n left: vars.left,\n letterSpacing: vars.letterSpacing,\n wordSpacing: vars.wordSpacing,\n lineHeight: vars.lineHeight,\n listStyleType: vars.listStyleType,\n margin: vars.margin,\n marginBottom: vars.spacing,\n marginLeft: vars.spacing,\n marginRight: vars.spacing,\n marginTop: vars.spacing,\n maxHeight: vars.maxHeight,\n maxWidth: vars.maxWidth,\n minHeight: vars.minHeight,\n minWidth: { ...vars.minWidth, ...vars.width },\n outline: ['none'],\n outlineOffset: vars.outlineOffset,\n outlineWidth: vars.outlineWidth,\n overflow: ['auto', 'hidden', 'scroll', 'visible'],\n overflowWrap: ['anywhere', 'break-word'],\n overflowY: ['auto', 'hidden', 'scroll'],\n overflowX: ['auto', 'hidden', 'scroll', 'visible'],\n padding: vars.spacing,\n paddingBottom: vars.spacing,\n paddingBlock: vars.spacing,\n paddingInline: vars.spacing,\n paddingLeft: vars.spacing,\n paddingRight: vars.spacing,\n paddingTop: vars.spacing,\n position: ['absolute', 'relative', 'fixed', 'sticky', 'static'],\n right: vars.spacing,\n rowGap: vars.spacing,\n scale: vars.scale,\n scrollbarGutter: ['auto', 'stable', 'stable both-edges'],\n scrollMargin: vars.spacing,\n scrollMarginTop: vars.spacing,\n scrollPadding: vars.spacing,\n strokeWidth: vars.strokeWidth,\n textAlign: ['left', 'center', 'end'],\n textOverflow: ['ellipsis', 'clip'],\n top: vars.top,\n userSelect: {\n none: {\n userSelect: 'none',\n '-webkit-user-select': 'none',\n },\n },\n visibility: ['hidden', 'visible'],\n width: vars.width,\n wordBreak: ['break-word', 'break-all'],\n zIndex: vars.zIndex,\n whiteSpace: ['nowrap', 'normal', 'pre', 'pre-wrap'],\n resize: ['none', 'both', 'horizontal', 'vertical'],\n backgroundImage: vars.backgroundImage,\n },\n shorthands: {\n marginX: ['marginLeft', 'marginRight'],\n marginY: ['marginTop', 'marginBottom'],\n padding: ['paddingTop', 'paddingBottom', 'paddingLeft', 'paddingRight'],\n paddingX: ['paddingLeft', 'paddingRight'],\n paddingY: ['paddingTop', 'paddingBottom'],\n },\n});\n\nconst colorModeProperties = defineProperties({\n conditions: {\n lightMode: {},\n darkMode: { '@media': '(prefers-color-scheme: dark)' },\n },\n defaultCondition: 'lightMode',\n properties: {\n backgroundColor: vars.colors,\n background: {\n gradient:\n 'linear-gradient(to right, rgba(0, 127, 87, 1), rgba(5, 99, 116, 1));',\n ellipseGradient:\n 'radial-gradient(ellipse at top left, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.0653), rgba(255, 255, 255, 0));',\n linearGradient:\n 'linear-gradient(to right, rgba(0, 127, 87, 1), rgba(0, 126, 144, 1));',\n verticalLinearGradient: 'linear-gradient(white, #F1F5F9);',\n },\n color: vars.colors,\n grayscale: vars.grayscale,\n opacity: vars.opacity,\n outlineColor: vars.colors,\n sepia: vars.sepia,\n stroke: vars.stroke,\n textColor: vars.colors,\n textTransform: ['uppercase', 'lowercase', 'capitalize', 'none'],\n textDecorationColor: vars.colors,\n textOpacity: vars.opacity,\n },\n});\n\nexport const sprinkles = createSprinkles(\n colorModeProperties,\n otherProperties,\n responsiveProperties,\n);\n\nconst stateProperties = defineProperties({\n conditions: {\n hover: {\n selector: '&:hover',\n },\n focusVisible: {\n selector: '&:focus-visible',\n },\n disabled: {\n selector: '&:disabled',\n },\n },\n defaultCondition: false,\n properties: {\n backgroundColor: vars.colors,\n borderColor: vars.colors,\n boxShadow: vars.boxShadow,\n color: vars.colors,\n cursor: [\n 'alias',\n 'all-scroll',\n 'auto',\n 'cell',\n 'col-resize',\n 'context-menu',\n 'copy',\n 'crosshair',\n 'default',\n 'e-resize',\n 'ew-resize',\n 'grab',\n 'grabbing',\n 'help',\n 'move',\n 'n-resize',\n 'ne-resize',\n 'nesw-resize',\n 'no-drop',\n 'none',\n 'not-allowed',\n 'ns-resize',\n 'nw-resize',\n 'nwse-resize',\n 'pointer',\n 'progress',\n 'row-resize',\n 's-resize',\n 'se-resize',\n 'sw-resize',\n 'text',\n 'vertical-text',\n 'w-resize',\n 'wait',\n 'zoom-in',\n 'zoom-out',\n ],\n opacity: vars.opacity,\n },\n});\n\nconst hoverProperties = defineProperties({\n conditions: {\n default: {},\n hover: {\n selector: '&:hover',\n },\n },\n defaultCondition: 'default',\n properties: {\n backgroundColor: vars.colors,\n color: vars.colors,\n transform: vars.transform,\n textDecoration: ['underline'],\n },\n});\n\nconst firstChildProperties = defineProperties({\n conditions: {\n default: {},\n firstChild: {\n selector: '&:first-child',\n },\n },\n defaultCondition: 'default',\n properties: {\n borderTopLeftRadius: vars.borderRadius,\n borderTopRightRadius: vars.borderRadius,\n },\n});\n\nexport const hoverSprinkles = createSprinkles(hoverProperties);\nexport const firstChildSprinkles = createSprinkles(firstChildProperties);\nexport const stateSprinkles = createSprinkles(stateProperties);\n","export const spacing = {\n auto: 'auto',\n full: '100%',\n px: '1px',\n '-px': '-1px',\n '-108': '-30rem',\n '-102': '-26rem',\n '-96': '-24rem',\n '-88': '-22rem',\n '-80': '-20rem',\n '-72': '-18rem',\n '-64': '-16rem',\n '-60': '-15rem',\n '-56': '-14rem',\n '-52': '-13rem',\n '-48': '-12rem',\n '-44': '-11rem',\n '-40': '-10rem',\n '-36': '-9rem',\n '-34': '-8.5rem',\n '-32': '-8rem',\n '-30': '-7.5rem',\n '-28': '-7rem',\n '-24': '-6rem',\n '-20': '-5rem',\n '-19': '-4.75rem',\n '-17.5': '-4.375rem',\n '-16': '-4rem',\n '-15': '-3.75rem',\n '-14': '-3.5rem',\n '-13': '-3.125rem',\n '-12': '-3rem',\n '-11': '-2.75rem',\n '-10': '-2.5rem',\n '-9': '-2.25rem',\n '-8': '-2rem',\n '-7': '-1.75rem',\n '-6': '-1.5rem',\n '-5': '-1.25rem',\n '-4': '-1rem',\n '-3.5': '-0.875rem',\n '-3': '-0.75rem',\n '-2.5': '-0.625rem',\n '-2': '-0.5rem',\n '-1.5': '-0.375rem',\n '-1': '-0.25rem',\n '-0.5': '-0.125rem',\n 0: '0px',\n 0.5: '0.125rem',\n 1: '0.25rem',\n 1.5: '0.375rem',\n 2: '0.5rem',\n 2.5: '0.625rem',\n 3: '0.75rem',\n 3.5: '0.875rem',\n 4: '1rem',\n 5: '1.25rem',\n 6: '1.5rem',\n 7: '1.75rem',\n 8: '2rem',\n 9: '2.25rem',\n 10: '2.5rem',\n 11: '2.75rem',\n 12: '3rem',\n 13: '3.25rem',\n 14: '3.5rem',\n 15: '3.75rem',\n 16: '4rem',\n 17.5: '4.375rem',\n 18: '4.5rem',\n 18.5: '4.625rem',\n 19: '4.75rem',\n 20: '5rem',\n 24: '6rem',\n 28: '7rem',\n 30: '7.5rem',\n 32: '8rem',\n 34: '8.5rem',\n 36: '9rem',\n 40: '10rem',\n 44: '11rem',\n 48: '12rem',\n 52: '13rem',\n 56: '14rem',\n 60: '15rem',\n 64: '16rem',\n 72: '18rem',\n 80: '20rem',\n 88: '22rem',\n 96: '24rem',\n 102: '26rem',\n 108: '30rem',\n 112: '32rem',\n 120: '33.75rem',\n};\n\nexport const opacity = {\n 0: '0',\n 5: '0.05',\n 10: '0.1',\n 20: '0.2',\n 25: '0.25',\n 30: '0.3',\n 35: '0.35',\n 40: '0.4',\n 50: '0.5',\n 60: '0.6',\n 70: '0.7',\n 75: '0.75',\n 80: '0.8',\n 90: '0.9',\n 95: '0.95',\n 100: '1',\n};\n\nexport const screens = {\n sm: 'screen and (max-width: 640px)',\n md: 'screen and (max-width: 768px)',\n lg: 'screen and (max-width: 1024px)',\n xl: 'screen and (max-width: 1280px)',\n xxl: 'screen and (max-width: 1536px)',\n};\n","import { keyframes, style } from '@vanilla-extract/css';\nimport { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nconst baseSprinkles = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n paddingY: 2,\n paddingX: 3,\n borderRadius: 'md',\n fontSize: 'xs',\n fontWeight: 'medium',\n gap: 1,\n});\n\nconst baseTypography = sprinkles({\n lineHeight: 1,\n});\n\nconst shimmerAnimation = keyframes({\n '0%': {\n transform: 'translateX(-120%)',\n },\n '50%': {\n transform: 'translateX(0%)',\n },\n '100%': {\n transform: 'translateX(120%)',\n },\n});\n\nconst loadingBase = style({\n position: 'relative',\n overflow: 'hidden',\n selectors: {\n '&::after': {\n content: '',\n position: 'absolute',\n inset: 0,\n background: `linear-gradient(\n 100deg,\n ${vars.colors.transparent} 0%,\n color-mix(in srgb, ${vars.colors.white} 20%, transparent) 25%,\n color-mix(in srgb, ${vars.colors.white} 90%, transparent) 50%,\n color-mix(in srgb, ${vars.colors.white} 20%, transparent) 75%,\n ${vars.colors.transparent} 100%\n )`,\n transform: 'translateX(-120%)',\n animation: `${shimmerAnimation} 1.1s ease-in-out infinite`,\n opacity: 0.9,\n pointerEvents: 'none',\n willChange: 'transform',\n },\n },\n});\n\nexport const badge = recipe({\n base: [baseSprinkles, baseTypography],\n variants: {\n tone: {\n neutral: sprinkles({\n backgroundColor: 'brandLightGray',\n color: 'brandDarkGray',\n }),\n info: sprinkles({\n backgroundColor: 'primaryLight',\n color: 'brandPrimaryRed',\n }),\n success: sprinkles({ backgroundColor: 'green-100', color: 'green-700' }),\n warning: sprinkles({ backgroundColor: 'amber-100', color: 'amber-700' }),\n danger: sprinkles({ backgroundColor: 'red-100', color: 'red-700' }),\n accent: sprinkles({\n backgroundColor: 'brandSecondaryOrange',\n color: 'brandWhite',\n }),\n },\n loading: {\n on: loadingBase,\n off: '',\n },\n },\n defaultVariants: {\n tone: 'neutral',\n loading: 'off',\n },\n compoundVariants: [],\n});\n\nexport type BadgeVariants = RecipeVariants<typeof badge>;\n","import { type JSX, type ReactNode } from 'react';\n\nimport { badge } from './badge.css.js';\nimport { cx } from '../../../theme/tools.js';\n\ntype Props = {\n children: ReactNode;\n tone?: BadgeTone;\n className?: string;\n loading?: boolean;\n};\n\ntype BadgeTone =\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'danger'\n | 'accent';\n\nexport const Badge = ({\n children,\n tone,\n className,\n loading = false,\n}: Props): JSX.Element => {\n let loadingVariant: 'on' | 'off' = 'off';\n if (loading) {\n loadingVariant = 'on';\n }\n\n return (\n <span className={cx(badge({ tone, loading: loadingVariant }), className)}>\n {children}\n </span>\n );\n};\n\nexport default Badge;\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ButtonLoadingSpinnerSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n {...rest}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n strokeOpacity={0.25}\n ></circle>\n <path\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n fillOpacity={0.75}\n ></path>\n </svg>\n );\n};\n","import { useTranslation } from 'react-i18next';\n\n/** Returns i18n helpers bound to the ui namespace. */\nexport function useUiTranslation(): ReturnType<typeof useTranslation> {\n return useTranslation('ui');\n}\n","import { keyframes, style } from '@vanilla-extract/css';\nimport { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nconst baseLayout = sprinkles({\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n fontWeight: 'medium',\n cursor: 'pointer',\n});\n\nconst baseInteraction = style([\n sprinkles({\n transitionProperty: 'default',\n transitionDuration: 150,\n transitionTimingFunction: 'default',\n borderWidth: 0,\n borderStyle: 'none',\n }),\n {\n selectors: {\n '&:active': {\n transform: 'scale(0.98)',\n },\n '&:disabled': {\n opacity: '0.7',\n cursor: 'not-allowed',\n },\n },\n },\n]);\n\nconst primaryVariant = sprinkles({\n backgroundColor: 'brandPrimaryRed',\n color: 'brandWhite',\n fontWeight: 'semibold',\n});\n\nconst secondaryVariant = style([\n sprinkles({\n backgroundColor: 'transparent',\n color: 'primary',\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'primary',\n }),\n {\n selectors: {\n '&:hover:not(:disabled)': {\n backgroundColor: vars.colors.primaryLight,\n },\n },\n },\n]);\n\nconst textVariant = sprinkles({\n backgroundColor: 'transparent',\n color: 'primary',\n});\n\nconst successVariant = style([\n sprinkles({ backgroundColor: 'success', color: 'text' }),\n {\n selectors: {\n '&:hover:not(:disabled)': {\n filter: 'brightness(0.9)',\n },\n },\n },\n]);\n\nconst dangerVariant = style([\n sprinkles({ backgroundColor: 'error', color: 'text' }),\n {\n selectors: {\n '&:hover:not(:disabled)': {\n filter: 'brightness(0.9)',\n },\n },\n },\n]);\n\nconst brandVariant = style([\n sprinkles({\n color: 'brandWhite',\n fontWeight: 'semibold',\n backgroundImage: 'brandDiagonal125',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'transparent',\n boxShadow: 'xl',\n }),\n {\n selectors: {\n '&:hover:not(:disabled)': {\n filter: 'brightness(0.97)',\n transform: 'translateY(-1px)',\n },\n '&:active:not(:disabled)': {\n transform: 'translateY(0)',\n },\n },\n },\n]);\n\nconst brandGhostVariant = style([\n sprinkles({\n backgroundColor: 'brandSecondaryOrange',\n color: 'brandWhite',\n borderColor: 'brandSecondaryOrange',\n borderWidth: 'px',\n borderStyle: 'solid',\n transitionProperty: 'colors',\n transitionDuration: 120,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n '&:hover:not(:disabled)': {\n filter: 'brightness(0.97)',\n },\n },\n },\n]);\n\nconst iconVariant = style([\n sprinkles({\n backgroundColor: 'brandSecondaryOrange',\n color: 'brandWhite',\n borderRadius: 'full',\n padding: 0,\n }),\n {\n selectors: {\n '&:hover:not(:disabled)': {\n backgroundColor: vars.colors.primaryLight,\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n },\n },\n]);\n\nconst tabVariant = style([\n sprinkles({\n backgroundColor: 'transparent',\n color: 'textSecondary',\n cursor: 'pointer',\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n borderWidth: 0,\n borderStyle: 'solid',\n borderBottomWidth: 2,\n borderBottomColor: 'transparent',\n paddingY: 2,\n paddingX: 4,\n fontSize: 'sm',\n fontWeight: 'medium',\n appearance: 'none',\n }),\n {\n selectors: {\n '&:hover:not(:disabled)': {\n color: vars.colors.text,\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n '&:disabled': {\n cursor: 'default',\n opacity: 0.6,\n },\n },\n },\n]);\n\nconst smallSize = sprinkles({\n paddingY: 1,\n paddingX: 4,\n fontSize: 'xs',\n borderRadius: 'xl',\n height: 8,\n});\n\nconst mediumSize = sprinkles({\n paddingY: 2,\n paddingX: 6,\n fontSize: 'sm',\n borderRadius: 'xl',\n height: 10,\n});\n\nconst largeSize = sprinkles({\n paddingY: 4,\n paddingX: 8,\n fontSize: 'base',\n borderRadius: 'lg',\n height: 12,\n});\n\nconst iconSizeSmall = sprinkles({\n width: 8,\n height: 8,\n minWidth: 8,\n minHeight: 8,\n});\n\nconst iconSizeMedium = sprinkles({\n width: 10,\n height: 10,\n minWidth: 10,\n minHeight: 10,\n});\n\nconst iconSizeLarge = sprinkles({\n width: 12,\n height: 12,\n minWidth: 12,\n minHeight: 12,\n});\n\nexport const button = recipe({\n base: [baseLayout, baseInteraction],\n variants: {\n variant: {\n primary: primaryVariant,\n secondary: secondaryVariant,\n text: textVariant,\n success: successVariant,\n danger: dangerVariant,\n brand: brandVariant,\n brandGhost: brandGhostVariant,\n tab: tabVariant,\n icon: iconVariant,\n },\n size: {\n small: smallSize,\n medium: mediumSize,\n large: largeSize,\n },\n width: {\n auto: sprinkles({ width: 'auto' }),\n full: sprinkles({ width: 'full' }),\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'medium',\n width: 'auto',\n },\n compoundVariants: [\n {\n variants: { variant: 'icon', size: 'small' },\n style: iconSizeSmall,\n },\n {\n variants: { variant: 'icon', size: 'medium' },\n style: iconSizeMedium,\n },\n {\n variants: { variant: 'icon', size: 'large' },\n style: iconSizeLarge,\n },\n ],\n});\n\nexport const tabButtonActive = sprinkles({\n color: 'primary',\n borderWidth: 0,\n borderStyle: 'solid',\n borderBottomWidth: 2,\n borderBottomColor: 'primary',\n fontWeight: 'semibold',\n});\n\nexport const activeButton = recipe({\n base: [baseLayout, baseInteraction],\n variants: {\n variant: {\n primary: primaryVariant,\n secondary: secondaryVariant,\n text: textVariant,\n success: successVariant,\n danger: dangerVariant,\n brand: brandVariant,\n brandGhost: brandGhostVariant,\n tab: tabButtonActive,\n icon: iconVariant,\n },\n size: {\n small: smallSize,\n medium: mediumSize,\n large: largeSize,\n },\n width: {\n auto: sprinkles({ width: 'auto' }),\n full: sprinkles({ width: 'full' }),\n },\n },\n defaultVariants: {\n variant: 'primary',\n size: 'medium',\n width: 'auto',\n },\n compoundVariants: [\n {\n variants: { variant: 'icon', size: 'small' },\n style: iconSizeSmall,\n },\n {\n variants: { variant: 'icon', size: 'medium' },\n style: iconSizeMedium,\n },\n {\n variants: { variant: 'icon', size: 'large' },\n style: iconSizeLarge,\n },\n ],\n});\n\nexport type ButtonVariants = RecipeVariants<typeof button>;\n\nconst INLINE_FLEX = 'inline-flex' as const;\n\nconst inlineFlexCenter = sprinkles({\n display: INLINE_FLEX,\n alignItems: 'center',\n});\n\nconst spin = keyframes({\n '0%': {\n transform: 'rotate(0deg)',\n },\n '100%': {\n transform: 'rotate(360deg)',\n },\n});\n\nexport const content = inlineFlexCenter;\n\nexport const loadingIndicator = sprinkles({\n display: INLINE_FLEX,\n alignItems: 'center',\n gap: 2,\n});\n\nexport const spinnerIcon = style([\n sprinkles({\n width: 5,\n height: 5,\n flexShrink: 0,\n }),\n {\n animation: `${spin} 1s linear infinite`,\n },\n]);\n\nexport const iconLeft = sprinkles({\n display: INLINE_FLEX,\n alignItems: 'center',\n marginRight: 2,\n});\n\nexport const iconRight = sprinkles({\n display: INLINE_FLEX,\n alignItems: 'center',\n marginLeft: 2,\n});\n\nexport const iconOnlyContent = sprinkles({\n display: INLINE_FLEX,\n alignItems: 'center',\n justifyContent: 'center',\n});\n","import React, { type Ref, type JSX } from 'react';\n\nimport { ButtonLoadingSpinnerSvg } from '../../../icons/ButtonLoadingSpinnerSvg.js';\nimport { useUiTranslation } from '../../../i18n/useUiTranslation.js';\n\nimport {\n button,\n content as contentClass,\n iconLeft,\n iconRight,\n loadingIndicator,\n spinnerIcon,\n type ButtonVariants,\n} from './button.css.js';\nimport { cx } from '../../../theme/tools.js';\n\ntype ButtonSlot =\n | 'loadingIndicator'\n | 'spinnerIcon'\n | 'content'\n | 'iconLeft'\n | 'iconRight';\n\ntype SlotClasses<T extends string> = Partial<Record<T, string>>;\n\n// Omit the conflicting 'size' property from HTML button attributes\ntype Props = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'size'> & {\n variant?: NonNullable<ButtonVariants>['variant'];\n size?: NonNullable<ButtonVariants>['size'];\n width?: NonNullable<ButtonVariants>['width'];\n isLoading?: boolean;\n loadingLabel?: React.ReactNode;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n ref?: Ref<HTMLButtonElement>;\n classes?: SlotClasses<ButtonSlot>;\n};\n\nexport const Button = (props: Props): JSX.Element => {\n const { t } = useUiTranslation();\n const {\n children,\n className,\n disabled,\n isLoading = false,\n loadingLabel,\n classes,\n leftIcon,\n rightIcon,\n size,\n variant,\n width,\n ref,\n ...rest\n } = props;\n\n const resolvedClassName = cx(button({ variant, size, width }), className);\n const isDisabled = Boolean(isLoading) || Boolean(disabled);\n\n let renderedContent: JSX.Element;\n\n if (isLoading) {\n const resolvedLoadingLabel = loadingLabel ?? t('common.loading');\n renderedContent = (\n <span className={cx(loadingIndicator, classes?.loadingIndicator)}>\n <ButtonLoadingSpinnerSvg\n className={cx(spinnerIcon, classes?.spinnerIcon)}\n width={20}\n height={20}\n />\n {resolvedLoadingLabel}\n </span>\n );\n } else {\n const iconElements: JSX.Element[] = [];\n\n if (leftIcon != null) {\n iconElements.push(\n <span className={cx(iconLeft, classes?.iconLeft)} key=\"left-icon\">\n {leftIcon}\n </span>,\n );\n }\n\n iconElements.push(\n <span className={cx(contentClass, classes?.content)} key=\"content\">\n {children}\n </span>,\n );\n\n if (rightIcon != null) {\n iconElements.push(\n <span className={cx(iconRight, classes?.iconRight)} key=\"right-icon\">\n {rightIcon}\n </span>,\n );\n }\n\n renderedContent = <>{iconElements}</>;\n }\n\n return (\n <button\n ref={ref}\n className={resolvedClassName}\n disabled={isDisabled}\n {...rest}\n >\n {renderedContent}\n </button>\n );\n};\n","import {\n type ComponentPropsWithoutRef,\n type JSX,\n type ReactNode,\n type Ref,\n} from 'react';\nimport { Link } from '@plumile/router';\n\nimport { ButtonLoadingSpinnerSvg } from '../../../icons/ButtonLoadingSpinnerSvg.js';\nimport { cx } from '../../../theme/tools.js';\nimport {\n activeButton,\n button,\n content as contentClass,\n iconLeft,\n iconRight,\n loadingIndicator,\n spinnerIcon,\n type ButtonVariants,\n} from './button.css.js';\n\ntype LinkProps = ComponentPropsWithoutRef<typeof Link>;\n\ntype Props = Omit<LinkProps, 'children' | 'className'> & {\n children: ReactNode;\n className?: string;\n variant?: NonNullable<ButtonVariants>['variant'];\n size?: NonNullable<ButtonVariants>['size'];\n width?: NonNullable<ButtonVariants>['width'];\n isLoading?: boolean;\n loadingLabel?: ReactNode;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n ref?: Ref<HTMLAnchorElement>;\n};\n\nexport const LinkButton = (props: Props): JSX.Element => {\n const {\n children,\n className,\n isDisabled,\n isLoading = false,\n leftIcon,\n loadingLabel,\n ref,\n rightIcon,\n size,\n variant,\n width,\n ...rest\n } = props;\n\n const resolvedClassName = cx(button({ variant, size, width }), className);\n const disabled = Boolean(isLoading) || Boolean(isDisabled);\n const isIconVariant = variant === 'icon';\n\n let renderedContent: JSX.Element;\n\n if (isLoading) {\n renderedContent = (\n <span className={loadingIndicator}>\n <ButtonLoadingSpinnerSvg\n className={spinnerIcon}\n width={20}\n height={20}\n />\n {loadingLabel}\n </span>\n );\n } else if (isIconVariant) {\n const iconContent = leftIcon ?? rightIcon ?? children ?? null;\n\n renderedContent = <span>{iconContent}</span>;\n } else {\n const iconElements: JSX.Element[] = [];\n\n if (leftIcon != null) {\n iconElements.push(\n <span className={iconLeft} key=\"left-icon\">\n {leftIcon}\n </span>,\n );\n }\n\n iconElements.push(\n <span className={contentClass} key=\"content\">\n {children}\n </span>,\n );\n\n if (rightIcon != null) {\n iconElements.push(\n <span className={iconRight} key=\"right-icon\">\n {rightIcon}\n </span>,\n );\n }\n\n renderedContent = <>{iconElements}</>;\n }\n\n let ariaDisabled: true | undefined;\n if (disabled) {\n ariaDisabled = true;\n }\n\n return (\n <Link\n {...rest}\n ref={ref}\n className={resolvedClassName}\n activeClassName={activeButton({ variant })}\n isDisabled={disabled}\n aria-disabled={ariaDisabled}\n >\n {renderedContent}\n </Link>\n );\n};\n","import { style } from '@vanilla-extract/css';\nimport { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const checkboxContainer = sprinkles({\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n});\n\nexport const checkboxInput = sprinkles({\n position: 'absolute',\n cursor: 'pointer',\n opacity: 0,\n height: 0,\n width: 0,\n});\n\nexport const checkboxLabel = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n paddingLeft: 2,\n cursor: 'pointer',\n});\n\nconst checkboxBase = style([\n sprinkles({\n display: 'inline-block',\n width: 5,\n height: 5,\n backgroundColor: 'white',\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'border',\n borderRadius: 'md',\n cursor: 'pointer',\n position: 'relative',\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'default',\n }),\n {\n selectors: {\n '&:after': {\n content: '\"\"',\n position: 'absolute',\n display: 'none',\n left: '6px',\n top: '2px',\n width: '6px',\n height: '11px',\n border: `solid ${vars.colors.white}`,\n borderWidth: '0 2px 2px 0',\n transform: 'rotate(45deg)',\n },\n },\n },\n]);\n\nconst checkedVariant = style([\n sprinkles({ backgroundColor: 'primary', borderColor: 'primary' }),\n {\n selectors: {\n '&:after': {\n display: 'block',\n },\n },\n },\n]);\n\nconst uncheckedVariant = style([\n sprinkles({ backgroundColor: 'white' }),\n {\n selectors: {\n '&:hover': {\n borderColor: vars.colors.primary,\n },\n },\n },\n]);\n\nconst disabledVariant = sprinkles({\n opacity: 50,\n cursor: 'not-allowed',\n});\n\nconst enabledVariant = sprinkles({});\n\nexport const customCheckbox = recipe({\n base: checkboxBase,\n variants: {\n checked: {\n true: checkedVariant,\n false: uncheckedVariant,\n },\n disabled: {\n true: disabledVariant,\n false: enabledVariant,\n },\n },\n defaultVariants: {\n checked: false,\n disabled: false,\n },\n});\n\nexport type CheckboxVariants = RecipeVariants<typeof customCheckbox>;\n","import { style } from '@vanilla-extract/css';\nimport { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const container = sprinkles({\n position: 'relative',\n width: 'auto',\n display: 'inline-block',\n});\n\nexport const containerFullWidth = sprinkles({\n width: 'full',\n});\n\nconst iconBase = style([\n sprinkles({\n position: 'absolute',\n top: '1/2',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n pointerEvents: 'none',\n }),\n {\n transform: 'translateY(-50%)',\n },\n]);\n\nexport const leftIcon = style([iconBase, sprinkles({ left: 2.5 })]);\n\nexport const rightIcon = style([iconBase, sprinkles({ right: 2.5 })]);\n\nexport const inputWithLeftIcon = sprinkles({\n paddingLeft: 9,\n});\n\nexport const inputWithRightIcon = sprinkles({\n paddingRight: 9,\n});\n\nconst baseInput = style([\n sprinkles({\n paddingY: 1,\n paddingX: 3,\n borderRadius: 'lg',\n fontSize: 'base',\n width: 'full',\n outline: 'none',\n transitionProperty: 'default',\n transitionDuration: 150,\n transitionTimingFunction: 'default',\n }),\n {\n '::placeholder': {\n color: vars.colors.textSecondary,\n opacity: '0.7',\n },\n },\n]);\n\nconst defaultVariant = sprinkles({\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'border',\n backgroundColor: 'white',\n color: 'text',\n});\n\nconst errorVariant = style([\n sprinkles({\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'error',\n backgroundColor: 'white',\n color: 'text',\n }),\n {\n selectors: {\n '&:focus': {\n boxShadow: `0 0 0 3px color-mix(in srgb, ${vars.colors.error} 20%, transparent)`,\n },\n },\n },\n]);\n\nconst smallSize = sprinkles({\n paddingY: 1,\n paddingX: 2,\n fontSize: 'sm',\n});\n\nconst mediumSize = sprinkles({\n paddingY: 2,\n paddingX: 4,\n fontSize: 'base',\n});\n\nconst largeSize = sprinkles({\n paddingY: 4,\n paddingX: 6,\n fontSize: 'lg',\n});\n\nexport const input = recipe({\n base: baseInput,\n variants: {\n variant: {\n default: defaultVariant,\n error: errorVariant,\n },\n size: {\n small: smallSize,\n medium: mediumSize,\n large: largeSize,\n },\n fullWidth: {\n true: sprinkles({ width: 'full' }),\n false: sprinkles({ width: 'auto' }),\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'medium',\n fullWidth: true,\n },\n});\n\nexport type InputVariants = RecipeVariants<typeof input>;\n","import {\n type InputHTMLAttributes,\n type JSX,\n type ReactNode,\n type Ref,\n} from 'react';\nimport {\n container,\n containerFullWidth,\n input as inputRecipe,\n inputWithLeftIcon,\n inputWithRightIcon,\n leftIcon as leftIconClass,\n rightIcon as rightIconClass,\n} from './input.css.js';\n\ntype InputVariant = 'default' | 'error';\ntype InputSize = 'small' | 'medium' | 'large';\n\n// Omit the conflicting 'size' property from HTML input attributes\nexport type Props = Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> & {\n variant?: InputVariant;\n size?: InputSize;\n fullWidth?: boolean;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n ref?: Ref<HTMLInputElement>;\n};\n\nexport const Input = (props: Props): JSX.Element => {\n const {\n variant,\n size,\n fullWidth,\n leftIcon,\n rightIcon,\n ref: inputRef,\n ...rest\n } = props;\n const { className, style, ...inputProps } = rest;\n const inputType = inputProps.type;\n\n if (inputType === 'checkbox' || inputType === 'radio') {\n return (\n <input\n ref={inputRef}\n className={className}\n style={style}\n {...inputProps}\n />\n );\n }\n\n let leftIconElement: JSX.Element | null = null;\n if (leftIcon != null) {\n leftIconElement = <div className={leftIconClass}>{leftIcon}</div>;\n }\n\n let rightIconElement: JSX.Element | null = null;\n if (rightIcon != null) {\n rightIconElement = <div className={rightIconClass}>{rightIcon}</div>;\n }\n\n const computedClassName = inputRecipe({ variant, size, fullWidth });\n const mergedClassNameParts = [computedClassName, className];\n const mergedClassName = mergedClassNameParts\n .filter((value): value is string => {\n return typeof value === 'string' && value.length > 0;\n })\n .join(' ');\n\n const inputClassNames: string[] = [];\n if (mergedClassName !== '') {\n inputClassNames.push(mergedClassName);\n }\n if (leftIcon != null) {\n inputClassNames.push(inputWithLeftIcon);\n }\n if (rightIcon != null) {\n inputClassNames.push(inputWithRightIcon);\n }\n\n let resolvedClassName: string | undefined;\n if (inputClassNames.length > 0) {\n resolvedClassName = inputClassNames.join(' ');\n }\n\n let containerClassName = container;\n if (fullWidth === true) {\n containerClassName = `${container} ${containerFullWidth}`;\n }\n\n return (\n <div className={containerClassName}>\n {leftIconElement}\n <input ref={inputRef} className={resolvedClassName} {...inputProps} />\n {rightIconElement}\n </div>\n );\n};\n","import { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const label = recipe({\n base: sprinkles({\n display: 'block',\n marginBottom: 1,\n fontWeight: 'medium',\n }),\n variants: {\n variant: {\n default: sprinkles({ color: 'text' }),\n error: sprinkles({ color: 'error' }),\n },\n size: {\n small: sprinkles({ fontSize: 'xs' }),\n medium: sprinkles({ fontSize: 'sm' }),\n large: sprinkles({ fontSize: 'base' }),\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'medium',\n },\n});\n\nexport type LabelVariants = RecipeVariants<typeof label>;\n\nexport const requiredMark = sprinkles({\n color: 'error',\n marginLeft: 0.5,\n});\n","import React, { type JSX } from 'react';\nimport {\n label,\n requiredMark as requiredMarkClass,\n type LabelVariants,\n} from './label.css.js';\n\ntype Props = React.LabelHTMLAttributes<HTMLLabelElement> & {\n variant?: NonNullable<LabelVariants>['variant'];\n size?: NonNullable<LabelVariants>['size'];\n required?: boolean;\n};\n\nexport const Label = (props: Props): JSX.Element => {\n const { children, variant, size, required, ...rest } = props;\n const { className, ...labelProps } = rest;\n let requiredMark: JSX.Element | null = null;\n\n if (required === true) {\n requiredMark = <span className={requiredMarkClass}>*</span>;\n }\n\n const computedClassName = label({ variant, size });\n const mergedClassName = [computedClassName, className]\n .filter((value) => {\n return value != null && value !== '';\n })\n .join(' ');\n\n let resolvedClassName: string | undefined;\n if (mergedClassName !== '') {\n resolvedClassName = mergedClassName;\n }\n\n return (\n <label className={resolvedClassName} {...labelProps}>\n {children}\n {requiredMark}\n </label>\n );\n};\n","import React, { type JSX, type Ref } from 'react';\nimport {\n checkboxContainer,\n checkboxInput,\n checkboxLabel,\n customCheckbox,\n type CheckboxVariants,\n} from './checkbox.css.js';\nimport { Input } from '../input/Input.js';\nimport { Label } from '../label/Label.js';\n\nexport interface CheckboxProps\n extends\n Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'checked' | 'size'\n >,\n Omit<CheckboxVariants, 'checked'> {\n label?: string;\n checked?: boolean;\n ref?: Ref<HTMLInputElement>;\n}\n\nexport const Checkbox = (props: CheckboxProps): JSX.Element => {\n const {\n label,\n checked = false,\n disabled = false,\n onChange,\n ref: inputRef,\n ...rest\n } = props;\n\n let labelContent: JSX.Element | null = null;\n if (label != null && label !== '') {\n labelContent = <span className={checkboxLabel}>{label}</span>;\n }\n return (\n <Label className={checkboxContainer}>\n <Input\n ref={inputRef}\n type=\"checkbox\"\n className={checkboxInput}\n checked={checked}\n disabled={disabled}\n onChange={onChange}\n {...rest}\n />\n <span\n className={customCheckbox({ checked, disabled })}\n aria-hidden=\"true\"\n />\n {labelContent}\n </Label>\n );\n};\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const errorMessage = sprinkles({\n color: 'error',\n fontSize: 'sm',\n marginTop: 1,\n});\n","import React, { type JSX } from 'react';\nimport { errorMessage } from './errorMessage.css.js';\n\ntype Props = {\n children: React.ReactNode;\n className?: string;\n id?: string; // Added id prop\n};\n\nexport const ErrorMessage = ({\n children,\n id,\n ...rest\n}: Props): JSX.Element | null => {\n if (children == null) {\n return null;\n }\n\n return (\n <div id={id} className={errorMessage} {...rest}>\n {children}\n </div>\n );\n};\n","import { type JSX, useMemo } from 'react';\nimport { useUiTranslation } from '../../../i18n/useUiTranslation.js';\n\ntype DateValue = string | { toString: () => string };\n\ntype Props = {\n value: DateValue | null | undefined;\n fallback?: string;\n options?: Intl.DateTimeFormatOptions;\n locale?: string;\n className?: string;\n};\n\nconst DEFAULT_OPTIONS: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n};\n\nexport const FormattedDate = ({\n value,\n fallback,\n options = DEFAULT_OPTIONS,\n locale,\n className,\n}: Props): JSX.Element => {\n const { t } = useUiTranslation();\n const resolvedFallback = fallback ?? t('common.notAvailable');\n const displayValue = useMemo(() => {\n if (value == null) {\n return resolvedFallback;\n }\n\n const date = new Date(String(value));\n if (Number.isNaN(date.getTime())) {\n return resolvedFallback;\n }\n\n try {\n return new Intl.DateTimeFormat(locale, options).format(date);\n } catch {\n return resolvedFallback;\n }\n }, [value, resolvedFallback, locale, options]);\n\n return <span className={className}>{displayValue}</span>;\n};\n","import { type JSX, useMemo } from 'react';\n\nimport { useUiTranslation } from '../../../i18n/useUiTranslation.js';\n\ntype DateValue = string | { toString: () => string };\n\nexport type RelativeTimeTextProps = {\n value: DateValue | null | undefined;\n fallback?: string;\n locale?: string;\n className?: string;\n titleMode?: 'absolute' | 'none';\n};\n\ntype RelativeUnit = Intl.RelativeTimeFormatUnit;\n\nconst SECOND_IN_MS = 1000;\nconst MINUTE_IN_MS = 60 * SECOND_IN_MS;\nconst HOUR_IN_MS = 60 * MINUTE_IN_MS;\nconst DAY_IN_MS = 24 * HOUR_IN_MS;\nconst MONTH_IN_MS = 30 * DAY_IN_MS;\nconst YEAR_IN_MS = 365 * DAY_IN_MS;\n\nconst DEFAULT_TITLE_OPTIONS: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n};\n\nconst resolveRelativeParts = (\n diffInMs: number,\n): { value: number; unit: RelativeUnit } => {\n const absoluteDiff = Math.abs(diffInMs);\n\n if (absoluteDiff < MINUTE_IN_MS) {\n return {\n value: Math.round(diffInMs / SECOND_IN_MS),\n unit: 'second',\n };\n }\n\n if (absoluteDiff < HOUR_IN_MS) {\n return {\n value: Math.round(diffInMs / MINUTE_IN_MS),\n unit: 'minute',\n };\n }\n\n if (absoluteDiff < DAY_IN_MS) {\n return {\n value: Math.round(diffInMs / HOUR_IN_MS),\n unit: 'hour',\n };\n }\n\n if (absoluteDiff < MONTH_IN_MS) {\n return {\n value: Math.round(diffInMs / DAY_IN_MS),\n unit: 'day',\n };\n }\n\n if (absoluteDiff < YEAR_IN_MS) {\n return {\n value: Math.round(diffInMs / MONTH_IN_MS),\n unit: 'month',\n };\n }\n\n return {\n value: Math.round(diffInMs / YEAR_IN_MS),\n unit: 'year',\n };\n};\n\nconst formatAbsoluteTitle = (\n date: Date,\n locale?: string,\n): string | undefined => {\n try {\n return new Intl.DateTimeFormat(locale, DEFAULT_TITLE_OPTIONS).format(date);\n } catch {\n return undefined;\n }\n};\n\nexport const RelativeTimeText = ({\n className,\n fallback,\n locale,\n titleMode = 'absolute',\n value,\n}: RelativeTimeTextProps): JSX.Element => {\n const { i18n, t } = useUiTranslation();\n const resolvedFallback = fallback ?? t('common.notAvailable');\n const resolvedLocale = locale ?? i18n.language;\n\n const resolvedDate = useMemo(() => {\n if (value == null) {\n return null;\n }\n\n const date = new Date(String(value));\n if (Number.isNaN(date.getTime())) {\n return null;\n }\n\n return date;\n }, [value]);\n\n const displayValue = useMemo(() => {\n if (resolvedDate == null) {\n return resolvedFallback;\n }\n\n const diffInMs = resolvedDate.getTime() - Date.now();\n const { unit, value: relativeValue } = resolveRelativeParts(diffInMs);\n\n try {\n return new Intl.RelativeTimeFormat(resolvedLocale, {\n numeric: 'auto',\n }).format(relativeValue, unit);\n } catch {\n return resolvedFallback;\n }\n }, [resolvedDate, resolvedFallback, resolvedLocale]);\n\n let title: string | undefined;\n if (titleMode === 'absolute' && resolvedDate != null) {\n title = formatAbsoluteTitle(resolvedDate, resolvedLocale);\n }\n\n return (\n <span className={className} title={title}>\n {displayValue}\n </span>\n );\n};\n\nexport default RelativeTimeText;\n","import { type ComponentProps, type JSX } from 'react';\n\nimport { Button } from '../button/Button.js';\nimport { useUiTranslation } from '../../../i18n/useUiTranslation.js';\n\nconst DEFAULT_ICON = '⋮';\n\nexport type IconMenuButtonProps = Omit<\n ComponentProps<typeof Button>,\n 'children' | 'variant' | 'size'\n> & {\n label?: string;\n icon?: JSX.Element | string;\n};\n\nexport const IconMenuButton = ({\n label,\n icon = DEFAULT_ICON,\n type = 'button',\n ...rest\n}: IconMenuButtonProps): JSX.Element => {\n const { t } = useUiTranslation();\n const resolvedLabel = label ?? t('common.menu.open');\n return (\n <Button\n aria-label={resolvedLabel}\n variant=\"text\"\n size=\"small\"\n type={type}\n {...rest}\n >\n {icon}\n </Button>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ModalCloseSvg = ({\n width = 20,\n height = 20,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M18 6L6 18\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M6 6L18 18\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nconst overlayBase = {\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 'modal',\n transitionProperty: 'opacityVisibility',\n transitionDuration: 300,\n transitionTimingFunction: 'ease-in-out',\n} as const;\n\nexport const overlay = sprinkles({\n ...overlayBase,\n opacity: 0,\n visibility: 'hidden',\n backgroundColor: 'black-200',\n});\n\nexport const overlayVisible = sprinkles({\n opacity: 100,\n visibility: 'visible',\n});\n","import { type JSX } from 'react';\nimport * as styles from './overlay.css.js';\n\ntype Props = {\n isVisible: boolean;\n onClick?: () => void;\n};\n\nexport const Overlay = ({ isVisible, onClick }: Props): JSX.Element => {\n const classNames = [styles.overlay];\n\n if (isVisible) {\n classNames.push(styles.overlayVisible);\n }\n\n return (\n <div\n className={classNames.join(' ')}\n onClick={onClick}\n aria-hidden=\"true\"\n />\n );\n};\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const modalContainer = sprinkles({\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 4,\n zIndex: 'modal',\n});\n\nexport const modal = style([\n sprinkles({\n backgroundColor: 'white',\n borderRadius: 'xl',\n boxShadow: 'xl',\n width: 'full',\n maxWidth: 700,\n maxHeight: '90vh',\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n overflow: 'hidden',\n }),\n {\n animation: 'modalFadeIn 0.2s ease-out',\n zIndex: 51,\n },\n]);\n\nexport const modalHeader = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingY: 4,\n paddingX: 6,\n borderWidth: 0,\n borderStyle: 'solid',\n borderBottomWidth: 'default',\n borderBottomColor: 'border',\n});\n\nexport const modalTitle = sprinkles({\n color: 'text',\n margin: 0,\n fontSize: 'xl',\n fontWeight: 'semibold',\n});\n\nexport const closeButton = style([\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 8,\n height: 8,\n borderRadius: 'md',\n backgroundColor: 'transparent',\n borderWidth: 0,\n borderStyle: 'none',\n color: 'textSecondary',\n cursor: 'pointer',\n transitionProperty: 'colors',\n transitionDuration: 100,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n '&:hover': {\n backgroundColor: vars.colors.backgroundModifier,\n color: vars.colors.text,\n },\n '&:focus': {\n outline: 'none',\n boxShadow: `0 0 0 2px ${vars.colors.primary}`,\n },\n },\n },\n]);\n\nexport const modalContent = sprinkles({\n paddingY: 6,\n paddingX: 6,\n overflowY: 'auto',\n});\n\nexport const modalFooter = sprinkles({\n display: 'flex',\n justifyContent: 'flex-end',\n gap: 4,\n paddingY: 4,\n paddingX: 6,\n borderWidth: 0,\n borderStyle: 'solid',\n borderTopWidth: 'default',\n borderTopColor: 'border',\n});\n","import React, { type JSX, useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { ModalCloseSvg } from '../../../icons/ModalCloseSvg.js';\nimport { Overlay } from '../overlay/Overlay.js';\nimport * as styles from './modal.css.js';\n\ntype Props = {\n isOpen: boolean;\n onClose: () => void;\n title: string;\n children: React.ReactNode;\n footer?: React.ReactNode;\n};\n\nexport const Modal = (props: Props): JSX.Element | null => {\n const { isOpen, onClose, title, children, footer } = props;\n const modalRef = useRef<HTMLDivElement>(null);\n\n // Close modal on escape key\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [isOpen, onClose]);\n\n // Prevent click from bubbling to overlay\n const handleModalClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n };\n\n if (!isOpen) {\n return null;\n }\n\n const modalContent = (\n <>\n <Overlay isVisible={isOpen} onClick={onClose} />\n <div className={styles.modalContainer}>\n <div className={styles.modal} ref={modalRef} onClick={handleModalClick}>\n <div className={styles.modalHeader}>\n <h2 className={styles.modalTitle}>{title}</h2>\n <button\n className={styles.closeButton}\n onClick={onClose}\n aria-label=\"Close\"\n type=\"button\"\n >\n <ModalCloseSvg width={20} height={20} />\n </button>\n </div>\n <div className={styles.modalContent}>{children}</div>\n {footer != null && <div className={styles.modalFooter}>{footer}</div>}\n </div>\n </div>\n </>\n );\n\n if (typeof document === 'undefined') {\n return modalContent;\n }\n\n return createPortal(modalContent, document.body);\n};\n","import { style } from '@vanilla-extract/css';\nimport { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nconst baseTextarea = style([\n sprinkles({\n paddingY: 2,\n paddingX: 4,\n borderRadius: 'md',\n fontSize: 'base',\n width: 'full',\n outline: 'none',\n transitionProperty: 'default',\n transitionDuration: 150,\n transitionTimingFunction: 'default',\n minHeight: 24,\n resize: 'vertical',\n lineHeight: 1.5,\n }),\n {\n '::placeholder': {\n color: vars.colors.textSecondary,\n opacity: '0.7',\n },\n },\n]);\n\nconst defaultVariant = style([\n sprinkles({\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'border',\n backgroundColor: 'white',\n color: 'text',\n }),\n {\n selectors: {\n '&:focus': {\n borderColor: vars.colors.primary,\n boxShadow: `0 0 0 3px ${vars.colors.primaryLight}`,\n },\n },\n },\n]);\n\nconst errorVariant = style([\n sprinkles({\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'error',\n backgroundColor: 'white',\n color: 'text',\n }),\n {\n selectors: {\n '&:focus': {\n boxShadow: `0 0 0 3px color-mix(in srgb, ${vars.colors.error} 20%, transparent)`,\n },\n },\n },\n]);\n\nconst smallSize = sprinkles({\n paddingY: 1,\n paddingX: 2,\n fontSize: 'sm',\n minHeight: 18,\n});\n\nconst mediumSize = sprinkles({\n paddingY: 2,\n paddingX: 4,\n fontSize: 'base',\n minHeight: 24,\n});\n\nconst largeSize = sprinkles({\n paddingY: 4,\n paddingX: 6,\n fontSize: 'lg',\n minHeight: 32,\n});\n\nexport const textarea = recipe({\n base: baseTextarea,\n variants: {\n variant: {\n default: defaultVariant,\n error: errorVariant,\n },\n size: {\n small: smallSize,\n medium: mediumSize,\n large: largeSize,\n },\n fullWidth: {\n true: sprinkles({ width: 'full' }),\n false: sprinkles({ width: 'auto' }),\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'medium',\n fullWidth: true,\n },\n});\n\nexport type TextareaVariants = RecipeVariants<typeof textarea>;\n","import { type JSX, type Ref, type TextareaHTMLAttributes } from 'react';\n\nimport { textarea, type TextareaVariants } from './textarea.css.js';\n\ntype VariantProp = NonNullable<TextareaVariants>['variant'];\ntype SizeProp = NonNullable<TextareaVariants>['size'];\ntype FullWidthProp = NonNullable<TextareaVariants>['fullWidth'];\n\nexport type Props = TextareaHTMLAttributes<HTMLTextAreaElement> & {\n variant?: VariantProp;\n size?: SizeProp;\n fullWidth?: FullWidthProp;\n ref?: Ref<HTMLTextAreaElement>;\n};\n\nexport const Textarea = (props: Props): JSX.Element => {\n const { variant, size, fullWidth, ref: textareaRef, ...rest } = props;\n const { className, rows, ...textareaProps } = rest;\n\n const computedClassName = textarea({ variant, size, fullWidth });\n const mergedClassName = [computedClassName, className]\n .filter((value) => {\n return value != null && value !== '';\n })\n .join(' ');\n\n let resolvedClassName: string | undefined;\n if (mergedClassName !== '') {\n resolvedClassName = mergedClassName;\n }\n\n const resolvedRows = rows ?? 4;\n\n return (\n <textarea\n ref={textareaRef}\n className={resolvedClassName}\n rows={resolvedRows}\n {...textareaProps}\n />\n );\n};\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const card = sprinkles({\n width: 'full',\n borderRadius: 'xl',\n backgroundColor: 'brandSecondaryOrange-20',\n});\n\nexport const header = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: 4,\n});\n\nexport const title = sprinkles({\n fontSize: 'base',\n fontWeight: 'semibold',\n color: 'text',\n});\n\nexport const content = sprinkles({\n padding: 6,\n});\n","import React, { type JSX, useMemo } from 'react';\n\nimport * as styles from './Card.css.js';\nimport { cx } from '../../../theme/tools.js';\n\ntype Props = {\n headerActions?: React.ReactNode;\n title?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n contentClassName?: string;\n};\n\nexport const Card = (props: Props): JSX.Element => {\n const { title, children, headerActions, className, contentClassName } = props;\n\n const header = useMemo(() => {\n if (title == null) {\n return null;\n }\n\n return (\n <div className={styles.header}>\n <span className={styles.title}>{title}</span>\n {headerActions}\n </div>\n );\n }, [headerActions, title]);\n\n const rootClass = cx(styles.card, className);\n const contentClass = cx(styles.content, contentClassName);\n\n return (\n <div className={rootClass}>\n {header}\n <div className={contentClass}>{children}</div>\n </div>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const SidebarHomeSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M3 9L12 2L21 9V20C21 20.5304 20.7893 21.0391 20.4142 21.4142C20.0391 21.7893 19.5304 22 19 22H5C4.46957 22 3.96086 21.7893 3.58579 21.4142C3.21071 21.0391 3 20.5304 3 20V9Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M9 22V12H15V22\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { keyframes, style } from '@vanilla-extract/css';\n\nimport { vars } from '../../../theme/themeContract.js';\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\n\nconst displayInlineFlex = 'inline-flex';\n\nexport const breadcrumb = sprinkles({\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const breadcrumbList = sprinkles({\n display: 'flex',\n alignItems: 'center',\n listStyleType: 'none',\n margin: 0,\n padding: 0,\n gap: 3,\n});\n\nexport const breadcrumbItem = sprinkles({\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const breadcrumbSection = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: 1,\n});\n\nexport const breadcrumbLabel = sprinkles({\n fontSize: '2xs',\n fontWeight: 'semibold',\n textTransform: 'uppercase',\n letterSpacing: 'caps',\n color: 'textMuted',\n lineHeight: 1,\n});\n\nexport const breadcrumbNameRow = sprinkles({\n display: displayInlineFlex,\n alignItems: 'center',\n gap: 2,\n});\n\nexport const breadcrumbChevron = sprinkles({\n color: 'current',\n transitionProperty: 'default',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n});\n\nexport const breadcrumbChevronOpen = sprinkles({\n rotate: 180,\n color: 'text',\n});\n\nexport const breadcrumbLink = style([\n sprinkles({\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n display: displayInlineFlex,\n alignItems: 'center',\n fontSize: 'base',\n fontWeight: 'semibold',\n color: 'text',\n textDecoration: 'none',\n lineHeight: 1.2,\n }),\n {\n ':hover': {\n color: vars.colors.primary,\n textDecoration: 'none',\n },\n ':focus': {\n outline: 'none',\n color: vars.colors.primary,\n },\n },\n]);\n\nexport const breadcrumbSeparator = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'textMuted',\n fontSize: 'sm',\n fontWeight: 'bold',\n});\n\nexport const breadcrumbChevronButton = style([\n sprinkles({\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 6,\n height: 6,\n minWidth: 6,\n minHeight: 6,\n borderRadius: 'md',\n borderWidth: 0,\n borderStyle: 'none',\n backgroundColor: 'backgroundSecondary',\n color: 'text',\n cursor: 'pointer',\n padding: 0,\n }),\n {\n selectors: {\n '&:hover:not(:disabled)': {\n backgroundColor: vars.colors.backgroundTertiary,\n color: vars.colors.text,\n },\n },\n },\n]);\n\nexport const homeLink = sprinkles({\n display: displayInlineFlex,\n alignItems: 'center',\n justifyContent: 'center',\n height: 8,\n borderRadius: 'sm',\n color: 'text',\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n});\n\nexport const homeIcon = sprinkles({\n color: 'current',\n});\n\nconst popoverIn = keyframes({\n '0%': {\n opacity: 0,\n transform: 'translateY(-6px) scale(0.98)',\n },\n '100%': {\n opacity: 1,\n transform: 'translateY(0) scale(1)',\n },\n});\n\nexport const popoverPanel = style([\n sprinkles({\n padding: 2,\n minWidth: 64,\n maxWidth: '26rem',\n boxShadow: 'inkGlow',\n transformOrigin: 'topLeft',\n }),\n {\n animation: `${popoverIn} 160ms ease`,\n },\n]);\n\nexport const popoverContent = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const popoverHeader = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n});\n\nexport const popoverTitle = sprinkles({\n fontSize: 'xs',\n fontWeight: 'semibold',\n textTransform: 'uppercase',\n letterSpacing: 'caps',\n color: 'textMuted',\n});\n\nexport const popoverSearch = sprinkles({\n display: 'flex',\n});\n\nexport const popoverList = sprinkles({\n listStyleType: 'none',\n margin: 0,\n padding: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n maxHeight: 64,\n overflowY: 'auto',\n});\n\nexport const popoverItem = style([\n sprinkles({\n transitionProperty: 'colors',\n transitionDuration: 120,\n transitionTimingFunction: 'ease',\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n paddingRight: 3,\n paddingLeft: 3,\n paddingTop: 2,\n paddingBottom: 2,\n borderRadius: 'md',\n textDecoration: 'none',\n color: 'text',\n }),\n {\n ':hover': {\n backgroundColor: vars.colors.backgroundSecondary,\n color: vars.colors.text,\n },\n ':focus': {\n outline: `2px solid ${vars.colors.primaryLight}`,\n outlineOffset: 2,\n },\n },\n]);\n\nexport const popoverItemActive = sprinkles({\n backgroundColor: 'primaryLight',\n color: 'primary',\n});\n\nexport const popoverItemName = sprinkles({\n fontSize: 'sm',\n fontWeight: 'semibold',\n});\n\nexport const popoverItemDescription = sprinkles({\n fontSize: 'xs',\n color: 'textSecondary',\n});\n\nexport const popoverEmpty = sprinkles({\n padding: 2,\n fontSize: 'sm',\n color: 'textSecondary',\n});\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ChevronDownSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M6 9L12 15L18 9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\n// Container only wraps the trigger now; menu content is portaled to body.\nexport const container = sprinkles({\n position: 'relative',\n});\n\n// Base visual styling for the dropdown content. Position (top/left) is applied inline.\nexport const content = sprinkles({\n backgroundColor: 'white',\n borderRadius: 'xl',\n zIndex: 'modal',\n overflow: 'hidden',\n});\n\nexport const contentPositioned = sprinkles({\n position: 'fixed',\n top: 0,\n left: 0,\n});\n\nexport const hidden = sprinkles({\n display: 'none',\n});\n\nexport const focusOutlineReset = sprinkles({\n outline: 'none',\n});\n\nexport const menu = sprinkles({\n listStyleType: 'none',\n margin: 0,\n padding: 0,\n});\n\nexport const menuItem = sprinkles({\n cursor: 'pointer',\n});\n","import {\n useState,\n useRef,\n useEffect,\n useLayoutEffect,\n useCallback,\n type ReactNode,\n type ReactElement,\n type JSX,\n type Ref,\n type MutableRefObject,\n type HTMLAttributes,\n type MouseEvent as ReactMouseEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n createContext,\n useContext,\n isValidElement,\n cloneElement,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport * as classes from './dropdown.css.js';\nimport { cx } from '../../../theme/tools.js';\n\n// Types\nexport type DropdownPlacement =\n | 'bottom-start'\n | 'bottom-end'\n | 'top-start'\n | 'top-end';\n\ninterface DropdownContextValue {\n close: () => void;\n open: () => void;\n isOpen: boolean;\n}\n\nconst DropdownContext = createContext<DropdownContextValue | null>(null);\n/**\n * Access the nearest Dropdown context. Throws if used outside a <Dropdown />.\n */\nexport const useDropdown = (): DropdownContextValue => {\n const ctx = useContext(DropdownContext);\n if (ctx == null) {\n throw new Error('useDropdown must be used within a <Dropdown />');\n }\n return ctx;\n};\n\nexport interface DropdownProps {\n trigger: ReactElement | ((isOpen: boolean) => ReactElement);\n children: ReactNode;\n className?: string;\n contentClassName?: string;\n placement?: DropdownPlacement;\n offset?: number;\n matchTriggerWidth?: boolean;\n open?: boolean; // controlled\n defaultOpen?: boolean; // uncontrolled\n onOpenChange?: (open: boolean) => void;\n closeOnItemClick?: boolean;\n portalContainer?: HTMLElement | null;\n // Accessible label if trigger is an icon only\n ariaLabel?: string;\n}\n\ninterface PositionState {\n top: number;\n left: number;\n width?: number;\n}\n\nconst isForwardRefComponent = (type: unknown): boolean => {\n if (type == null || typeof type !== 'object') {\n return false;\n }\n return (\n (type as { $$typeof?: symbol }).$$typeof === Symbol.for('react.forward_ref')\n );\n};\n\n/**\n * A scalable, portal-based dropdown component with basic collision handling,\n * controlled/uncontrolled modes, accessibility attributes, and optional\n * trigger width matching. Content is rendered in a React portal (default: document.body).\n */\nexport const Dropdown = ({\n trigger,\n children,\n className,\n contentClassName,\n placement = 'bottom-start',\n offset = 4,\n matchTriggerWidth = true,\n open,\n defaultOpen = false,\n onOpenChange,\n closeOnItemClick = false,\n portalContainer,\n ariaLabel,\n}: DropdownProps): JSX.Element => {\n const isControlled = open != null;\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n let isOpen = uncontrolledOpen;\n if (isControlled) {\n isOpen = Boolean(open);\n }\n\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState<PositionState | null>(null);\n // Accumulate manual cleanups for effects where returning a function violates lint rules.\n const cleanupRef = useRef<(() => void)[]>([]);\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setUncontrolledOpen(next);\n }\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n const toggle = useCallback(() => {\n setOpen(!isOpen);\n }, [isOpen, setOpen]);\n const close = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n const openFn = useCallback(() => {\n setOpen(true);\n }, [setOpen]);\n\n // Positioning logic\n const computePosition = useCallback(() => {\n const triggerEl = triggerRef.current;\n const contentEl = contentRef.current;\n if (triggerEl == null) {\n return;\n }\n if (contentEl == null) {\n return;\n }\n\n const rect = triggerEl.getBoundingClientRect();\n let top = 0;\n let left = 0;\n\n switch (placement) {\n case 'bottom-start':\n top = rect.bottom + offset;\n left = rect.left;\n break;\n case 'bottom-end':\n top = rect.bottom + offset;\n left = rect.right - contentEl.offsetWidth;\n break;\n case 'top-start':\n top = rect.top - contentEl.offsetHeight - offset;\n left = rect.left;\n break;\n case 'top-end':\n top = rect.top - contentEl.offsetHeight - offset;\n left = rect.right - contentEl.offsetWidth;\n break;\n default:\n top = rect.bottom + offset;\n left = rect.left;\n }\n\n // Keep within viewport (basic collision handling)\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n let width: number | undefined;\n if (matchTriggerWidth) {\n width = rect.width;\n }\n const contentWidth = width ?? contentEl.offsetWidth;\n\n if (left + contentWidth > vw - 4) {\n left = Math.max(4, vw - contentWidth - 4);\n }\n if (left < 4) left = 4;\n const contentHeight = contentEl.offsetHeight;\n if (top + contentHeight > vh - 4) {\n // Try flip to top if bottom overflows and initial was bottom\n if (placement.startsWith('bottom')) {\n const flippedTop = rect.top - contentHeight - offset;\n if (flippedTop >= 4) {\n top = flippedTop;\n } else {\n top = Math.max(4, vh - contentHeight - 4);\n }\n } else {\n top = Math.max(4, vh - contentHeight - 4);\n }\n }\n if (top < 4) top = 4;\n\n setPosition({ top, left, width });\n }, [placement, offset, matchTriggerWidth]);\n\n useLayoutEffect(() => {\n if (isOpen) computePosition();\n }, [isOpen, computePosition, children]);\n\n useEffect(() => {\n if (!isOpen) return;\n const handle = () => {\n computePosition();\n };\n window.addEventListener('resize', handle);\n window.addEventListener('scroll', handle, true);\n const cleanup = () => {\n window.removeEventListener('resize', handle);\n window.removeEventListener('scroll', handle, true);\n };\n cleanupRef.current.push(cleanup);\n }, [isOpen, computePosition]);\n\n // Outside click & Escape\n useEffect(() => {\n if (!isOpen) return;\n const onDocMouseDown = (e: globalThis.MouseEvent) => {\n const target = e.target as Node;\n if (\n containerRef.current != null &&\n contentRef.current != null &&\n !containerRef.current.contains(target) &&\n !contentRef.current.contains(target)\n ) {\n close();\n }\n };\n const onKey = (e: globalThis.KeyboardEvent) => {\n if (e.key === 'Escape') {\n close();\n triggerRef.current?.focus();\n }\n };\n document.addEventListener('mousedown', onDocMouseDown);\n document.addEventListener('keydown', onKey);\n const cleanup = () => {\n document.removeEventListener('mousedown', onDocMouseDown);\n document.removeEventListener('keydown', onKey);\n };\n cleanupRef.current.push(cleanup);\n }, [isOpen, close]);\n\n // Keyboard navigation basic (ArrowDown focuses first focusable)\n useEffect(() => {\n if (!isOpen) return;\n const firstFocusable = contentRef.current?.querySelector<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n );\n firstFocusable?.focus();\n }, [isOpen]);\n\n // Close on item click if enabled\n useEffect(() => {\n if (!isOpen || !closeOnItemClick) return;\n const handler = (e: globalThis.MouseEvent) => {\n if (contentRef.current?.contains(e.target as Node)) {\n close();\n }\n };\n document.addEventListener('click', handler, { capture: true });\n // Explicit cleanup without returning (lint rule forbids returning arrow fn)\n const cleanup = () => {\n document.removeEventListener('click', handler, { capture: true });\n };\n // Store in ref to run on unmount / dependency change\n cleanupRef.current.push(cleanup);\n }, [isOpen, closeOnItemClick, close]);\n // Run accumulated cleanups on unmount\n useEffect(() => {\n return () => {\n cleanupRef.current.forEach((fn) => {\n fn();\n });\n cleanupRef.current = [];\n };\n }, []);\n\n let triggerElement = trigger;\n if (typeof trigger === 'function') {\n triggerElement = trigger(isOpen);\n }\n\n if (!isValidElement(triggerElement)) {\n throw new Error('Dropdown trigger must be a React element.');\n }\n\n const isHostElement = typeof triggerElement.type === 'string';\n const isButtonElement = isHostElement && triggerElement.type === 'button';\n const canAttachRef =\n isHostElement ||\n typeof triggerElement.type === 'function' ||\n isForwardRefComponent(triggerElement.type);\n\n if (!canAttachRef) {\n throw new Error(\n 'Dropdown trigger must be a DOM element or component that accepts a ref.',\n );\n }\n\n const triggerElementRef =\n (triggerElement.props as { ref?: Ref<HTMLElement> }).ref ??\n (triggerElement as ReactElement & { ref?: Ref<HTMLElement> }).ref;\n const setTriggerRef = (node: HTMLElement | null) => {\n triggerRef.current = node;\n if (typeof triggerElementRef === 'function') {\n triggerElementRef(node);\n } else if (triggerElementRef != null) {\n (triggerElementRef as MutableRefObject<HTMLElement | null>).current =\n node;\n }\n };\n\n const triggerProps = triggerElement.props as HTMLAttributes<HTMLElement> & {\n type?: string;\n };\n\n const handleTriggerClick = (event: ReactMouseEvent<HTMLElement>) => {\n triggerProps.onClick?.(event);\n if (event.defaultPrevented) {\n return;\n }\n toggle();\n };\n\n const handleTriggerKeyDown = (event: ReactKeyboardEvent<HTMLElement>) => {\n triggerProps.onKeyDown?.(event);\n if (event.defaultPrevented) {\n return;\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n toggle();\n }\n };\n\n const mergedTriggerProps: Record<string, unknown> = {\n onClick: handleTriggerClick,\n 'aria-haspopup': 'menu',\n 'aria-expanded': isOpen,\n };\n\n if (ariaLabel != null && ariaLabel !== '') {\n mergedTriggerProps['aria-label'] = ariaLabel;\n }\n\n if (isButtonElement) {\n if (triggerProps.type == null) {\n mergedTriggerProps.type = 'button';\n }\n } else {\n mergedTriggerProps.onKeyDown = handleTriggerKeyDown;\n if (triggerProps.role == null) {\n mergedTriggerProps.role = 'button';\n }\n if (triggerProps.tabIndex == null) {\n mergedTriggerProps.tabIndex = 0;\n }\n }\n\n mergedTriggerProps.ref = setTriggerRef;\n\n let contentStyles: React.CSSProperties = {};\n if (position != null) {\n contentStyles = {\n top: position.top,\n left: position.left,\n width: position.width,\n };\n }\n\n const portalTarget = portalContainer ?? document.body;\n\n const contextValue: DropdownContextValue = {\n close,\n open: openFn,\n isOpen,\n };\n\n let dropdownContent: JSX.Element | null = null;\n if (isOpen) {\n dropdownContent = createPortal(\n <div\n ref={contentRef}\n role=\"menu\"\n className={cx(\n classes.content,\n classes.contentPositioned,\n contentClassName,\n )}\n style={contentStyles}\n >\n {children}\n </div>,\n portalTarget,\n );\n }\n\n return (\n <DropdownContext.Provider value={contextValue}>\n <div className={cx(classes.container, className)} ref={containerRef}>\n {cloneElement(triggerElement, mergedTriggerProps)}\n </div>\n {dropdownContent}\n </DropdownContext.Provider>\n );\n};\n","import { type JSX, useMemo, useState } from 'react';\nimport { Link } from '@plumile/router';\nimport { Input } from '../../atoms/input/Input.js';\nimport { useDropdown } from '../dropdown/Dropdown.js';\nimport { cx } from '../../../theme/tools.js';\n\nimport * as styles from './breadcrumbNavigation.css.js';\nimport type { BreadcrumbMenuItem } from './types.js';\n\ntype Props = {\n items: readonly BreadcrumbMenuItem[];\n selectedId?: string | null;\n searchPlaceholder: string;\n searchAriaLabel: string;\n emptyLabel: string;\n emptyMatchesLabel: string;\n};\n\nexport const BreadcrumbMenuPopover = ({\n items,\n selectedId,\n searchPlaceholder,\n searchAriaLabel,\n emptyLabel,\n emptyMatchesLabel,\n}: Props): JSX.Element => {\n const { close } = useDropdown();\n const [query, setQuery] = useState('');\n const normalizedQuery = query.trim().toLowerCase();\n\n const filteredItems = useMemo(() => {\n if (normalizedQuery === '') {\n return items;\n }\n\n return items.filter((item) => {\n return item.name.toLowerCase().includes(normalizedQuery);\n });\n }, [items, normalizedQuery]);\n\n let emptyStateLabel: string;\n if (normalizedQuery === '') {\n emptyStateLabel = emptyLabel;\n } else {\n emptyStateLabel = emptyMatchesLabel;\n }\n\n return (\n <div className={styles.popoverContent}>\n <div className={styles.popoverSearch}>\n <Input\n type=\"search\"\n size=\"small\"\n fullWidth\n placeholder={searchPlaceholder}\n value={query}\n onChange={(event) => {\n setQuery(event.target.value);\n }}\n aria-label={searchAriaLabel}\n />\n </div>\n <ul className={styles.popoverList}>\n {filteredItems.length === 0 && (\n <li className={styles.popoverEmpty}>{emptyStateLabel}</li>\n )}\n {filteredItems.map((item) => {\n const itemClassName = cx(styles.popoverItem, {\n [styles.popoverItemActive]: item.id === selectedId,\n });\n\n let descriptionNode: JSX.Element | null = null;\n if (item.description != null && item.description !== '') {\n descriptionNode = (\n <span className={styles.popoverItemDescription}>\n {item.description}\n </span>\n );\n }\n\n return (\n <li key={item.id}>\n <Link\n to={item.to}\n className={itemClassName}\n onClick={() => {\n close();\n }}\n >\n <span className={styles.popoverItemName}>{item.name}</span>\n {descriptionNode}\n </Link>\n </li>\n );\n })}\n </ul>\n </div>\n );\n};\n","import { type JSX } from 'react';\nimport { Link } from '@plumile/router';\nimport { ChevronDownSvg } from '../../../icons/ChevronDownSvg.js';\nimport { Dropdown } from '../dropdown/Dropdown.js';\nimport { cx } from '../../../theme/tools.js';\n\nimport * as styles from './breadcrumbNavigation.css.js';\nimport { BreadcrumbMenuPopover } from './BreadcrumbMenuPopover.js';\nimport type { BreadcrumbMenuConfig, BreadcrumbNode } from './types.js';\n\ntype Props = {\n node: BreadcrumbNode;\n menu?: BreadcrumbMenuConfig;\n ariaLabel: string;\n searchPlaceholder: string;\n searchAriaLabel: string;\n emptyLabel: string;\n emptyMatchesLabel: string;\n};\n\nexport const BreadcrumbMenuDropdown = ({\n node,\n menu,\n ariaLabel,\n searchPlaceholder,\n searchAriaLabel,\n emptyLabel,\n emptyMatchesLabel,\n}: Props): JSX.Element => {\n const menuItems = menu?.items ?? [];\n\n if (menu == null) {\n return (\n <div className={styles.breadcrumbSection}>\n <div className={styles.breadcrumbNameRow}>\n <Link to={node.to} className={styles.breadcrumbLink}>\n {node.name}\n </Link>\n </div>\n </div>\n );\n }\n\n return (\n <div className={styles.breadcrumbSection}>\n {/* <span className={styles.breadcrumbLabel}>{sectionLabel}</span> */}\n <div className={styles.breadcrumbNameRow}>\n <Link to={node.to} className={styles.breadcrumbLink}>\n {node.name}\n </Link>\n <Dropdown\n trigger={(isOpen) => {\n return (\n <button type=\"button\" className={styles.breadcrumbChevronButton}>\n <ChevronDownSvg\n width={14}\n height={14}\n className={cx(styles.breadcrumbChevron, {\n [styles.breadcrumbChevronOpen]: isOpen,\n })}\n />\n </button>\n );\n }}\n ariaLabel={ariaLabel}\n placement=\"bottom-start\"\n matchTriggerWidth={false}\n contentClassName={styles.popoverPanel}\n >\n <BreadcrumbMenuPopover\n items={menuItems}\n selectedId={menu.selectedId}\n searchPlaceholder={searchPlaceholder}\n searchAriaLabel={searchAriaLabel}\n emptyLabel={emptyLabel}\n emptyMatchesLabel={emptyMatchesLabel}\n />\n </Dropdown>\n </div>\n </div>\n );\n};\n","import { type JSX } from 'react';\nimport { Link } from '@plumile/router';\nimport { SidebarHomeSvg } from '../../../icons/SidebarHomeSvg.js';\n\nimport * as styles from './breadcrumbNavigation.css.js';\nimport { cx } from '../../../theme/tools.js';\nimport { BreadcrumbMenuDropdown } from './BreadcrumbMenuDropdown.js';\nimport type { BreadcrumbNavigationItem, BreadcrumbNode } from './types.js';\n\ntype Props = {\n root: BreadcrumbNode;\n rootAriaLabel: string;\n items?: readonly BreadcrumbNavigationItem[];\n className?: string;\n};\n\nexport const BreadcrumbNavigation = (props: Props): JSX.Element => {\n const { root, rootAriaLabel, items = [], className } = props;\n const breadcrumbItems: JSX.Element[] = [];\n\n breadcrumbItems.push(\n <li key=\"home\" className={styles.breadcrumbItem}>\n <Link to={root.to} className={styles.homeLink} aria-label={rootAriaLabel}>\n <SidebarHomeSvg width={16} height={16} className={styles.homeIcon} />\n </Link>\n </li>,\n );\n\n for (const item of items) {\n breadcrumbItems.push(\n <li key={item.id} className={styles.breadcrumbItem}>\n <BreadcrumbMenuDropdown\n node={item.node}\n menu={item.menu}\n ariaLabel={item.labels?.ariaLabel ?? item.node.name}\n searchPlaceholder={item.labels?.searchPlaceholder ?? ''}\n searchAriaLabel={item.labels?.searchAriaLabel ?? ''}\n emptyLabel={item.labels?.emptyLabel ?? ''}\n emptyMatchesLabel={item.labels?.emptyMatchesLabel ?? ''}\n />\n </li>,\n );\n }\n\n const breadcrumbsWithSeparators = breadcrumbItems.flatMap((item, index) => {\n if (index === 0) {\n return [item];\n }\n return [\n <li\n key={`separator-${index}`}\n className={styles.breadcrumbSeparator}\n aria-hidden=\"true\"\n >\n /{/* <ChevronRightSvg width={16} height={16} /> */}\n </li>,\n item,\n ];\n });\n\n return (\n <nav className={cx(styles.breadcrumb, className)} aria-label=\"Breadcrumb\">\n <ol className={styles.breadcrumbList}>{breadcrumbsWithSeparators}</ol>\n </nav>\n );\n};\n\nexport type {\n BreadcrumbNavigationItem,\n BreadcrumbNode,\n BreadcrumbMenuItem,\n BreadcrumbMenuConfig,\n BreadcrumbMenuLabels,\n} from './types.js';\n","import { type ComponentProps, type JSX, type ReactNode } from 'react';\n\nimport { Button } from '../../atoms/button/Button.js';\nimport { useUiTranslation } from '../../../i18n/useUiTranslation.js';\n\nexport type FormActionsProps = {\n onCancel: () => void;\n cancelLabel?: string;\n submitLabel?: string;\n submitLoadingLabel?: string;\n isSubmitting?: boolean;\n submitDisabled?: boolean;\n className?: string;\n renderSubmitContent?: (isSubmitting: boolean) => ReactNode;\n submitButtonProps?: Omit<ComponentProps<typeof Button>, 'children' | 'type'>;\n cancelButtonProps?: Omit<\n ComponentProps<typeof Button>,\n 'children' | 'type' | 'variant'\n >;\n};\n\nexport const FormActions = ({\n onCancel,\n cancelLabel,\n submitLabel,\n submitLoadingLabel,\n isSubmitting = false,\n submitDisabled = false,\n className,\n renderSubmitContent,\n submitButtonProps,\n cancelButtonProps,\n}: FormActionsProps): JSX.Element => {\n const { t } = useUiTranslation();\n const resolvedCancelLabel = cancelLabel ?? t('common.actions.cancel');\n const resolvedSubmitLabel = submitLabel ?? t('common.actions.save');\n const resolvedSubmitLoadingLabel =\n submitLoadingLabel ?? t('common.actions.saving');\n const cancelProps = cancelButtonProps ?? {};\n const {\n className: cancelClassName,\n disabled: cancelDisabled,\n ...restCancelButtonProps\n } = cancelProps;\n\n const submitProps = submitButtonProps ?? {};\n const {\n className: submitClassName,\n disabled: submitDisabledOverride,\n ...restSubmitButtonProps\n } = submitProps;\n\n let submitContent: ReactNode;\n\n if (renderSubmitContent != null) {\n submitContent = renderSubmitContent(isSubmitting);\n } else if (isSubmitting) {\n submitContent = resolvedSubmitLoadingLabel;\n } else {\n submitContent = resolvedSubmitLabel;\n }\n\n const isCancelDisabled = Boolean(cancelDisabled);\n const isSubmitDisabled =\n Boolean(submitDisabled) || isSubmitting || submitDisabledOverride === true;\n\n return (\n <div className={className}>\n <Button\n type=\"button\"\n variant=\"text\"\n onClick={onCancel}\n disabled={isCancelDisabled}\n className={cancelClassName}\n {...restCancelButtonProps}\n >\n {resolvedCancelLabel}\n </Button>\n <Button\n type=\"submit\"\n variant=\"primary\"\n disabled={isSubmitDisabled}\n className={submitClassName}\n {...restSubmitButtonProps}\n >\n {submitContent}\n </Button>\n </div>\n );\n};\n","import { createVar, fallbackVar, style } from '@vanilla-extract/css';\n\nimport { vars } from '../../../theme/themeContract.js';\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const checkboxFieldMarginBottomVar = createVar();\nexport const checkboxLabelMarginLeftVar = createVar();\n\nexport const checkboxField = style([\n sprinkles({\n display: 'flex',\n alignItems: 'flex-start',\n }),\n {\n marginBottom: fallbackVar(checkboxFieldMarginBottomVar, vars.spacing[4]),\n },\n]);\n\nexport const checkboxWrapper = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n});\n\nexport const labelWrapper = style({\n marginLeft: fallbackVar(checkboxLabelMarginLeftVar, vars.spacing[1]),\n});\n\nexport const helperText = sprinkles({\n fontSize: 'xs',\n color: 'textSecondary',\n marginTop: 0.5,\n});\n","import React, { type JSX } from 'react';\n\nimport { Checkbox, type CheckboxProps } from '../../atoms/checkbox/Checkbox.js';\nimport { ErrorMessage } from '../../atoms/error_message/ErrorMessage.js';\nimport { Label } from '../../atoms/label/Label.js';\nimport {\n checkboxField,\n checkboxWrapper,\n labelWrapper,\n helperText as helperTextClassName,\n} from './checkboxField.css.js';\n\nexport type Props = Omit<CheckboxProps, 'label'> & {\n id?: string;\n label?: React.ReactNode;\n error?: string;\n helperText?: string;\n};\n\nexport const CheckboxField = (props: Props): JSX.Element => {\n const { id, label, error, helperText, ...rest } = props;\n let checkboxId = `checkbox-${Math.random().toString(36).substring(2, 9)}`;\n\n if (id != null && id !== '') {\n checkboxId = id;\n }\n\n let helperTextElement: JSX.Element | null = null;\n\n if (helperText != null && helperText !== '') {\n helperTextElement = <div className={helperTextClassName}>{helperText}</div>;\n }\n\n let errorElement: JSX.Element | null = null;\n\n if (error != null && error !== '') {\n errorElement = <ErrorMessage>{error}</ErrorMessage>;\n }\n\n let labelSection: JSX.Element | null = null;\n\n if (label != null) {\n labelSection = (\n <div className={labelWrapper}>\n <Label htmlFor={checkboxId}>{label}</Label>\n {helperTextElement}\n {errorElement}\n </div>\n );\n }\n\n return (\n <div className={checkboxField}>\n <div className={checkboxWrapper}>\n <Checkbox id={checkboxId} {...rest} />\n {labelSection}\n </div>\n </div>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const FormErrorAlertSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...rest}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line>\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line>\n </svg>\n );\n};\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const formError = sprinkles({\n alignItems: 'center',\n borderRadius: 'md',\n color: 'error',\n display: 'flex',\n fontSize: 'sm',\n fontWeight: 'medium',\n marginBottom: 6,\n padding: 4,\n backgroundColor: 'error-10',\n});\n\nexport const icon = sprinkles({\n marginRight: 2,\n flexShrink: 0,\n});\n\nexport const message = sprinkles({\n flexGrow: 'default',\n});\n","import React, { type JSX } from 'react';\n\nimport { FormErrorAlertSvg } from '../../../icons/FormErrorAlertSvg.js';\n\nimport { formError, icon, message } from './formError.css.js';\n\ntype Props = {\n children: React.ReactNode;\n className?: string;\n};\n\nexport const FormError = ({ children, ...rest }: Props): JSX.Element | null => {\n if (children == null) {\n return null;\n }\n\n return (\n <div className={formError} role=\"alert\" {...rest}>\n <span className={icon}>\n <FormErrorAlertSvg width={16} height={16} />\n </span>\n <div className={message}>{children}</div>\n </div>\n );\n};\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const formField = sprinkles({\n marginBottom: 6,\n width: 'full',\n});\n","import type { ComponentProps, JSX } from 'react';\n\nimport { Label } from '../../atoms/label/Label.js';\nimport { Input } from '../../atoms/input/Input.js';\nimport { ErrorMessage } from '../../atoms/error_message/ErrorMessage.js';\nimport { formField } from './formField.css.js';\n\ntype Props = Omit<ComponentProps<typeof Input>, 'id'> & {\n id?: string;\n label?: string;\n error?: string;\n required?: boolean;\n};\n\nexport const FormField = (props: Props): JSX.Element => {\n const { id, label, error, required = false, variant, ...rest } = props;\n let resolvedId = id;\n\n if (resolvedId == null || resolvedId === '') {\n let slug = 'generic';\n\n if (label != null && label !== '') {\n slug = label.toLowerCase().replace(/\\s+/g, '-');\n }\n\n resolvedId = `field-${slug}`;\n }\n\n const hasError = error != null && error !== '';\n const ariaInvalid = hasError;\n let describedById: string | undefined;\n\n if (hasError) {\n describedById = `${resolvedId}-error`;\n }\n\n let labelVariant: 'error' | 'default' = 'default';\n\n if (hasError) {\n labelVariant = 'error';\n }\n\n let inputVariant: NonNullable<Props['variant']> | 'default' = 'default';\n\n if (hasError) {\n inputVariant = 'error';\n } else if (variant != null) {\n inputVariant = variant;\n }\n\n let labelElement: JSX.Element | null = null;\n\n if (label != null) {\n labelElement = (\n <Label htmlFor={resolvedId} required={required} variant={labelVariant}>\n {label}\n </Label>\n );\n }\n\n let errorElement: JSX.Element | null = null;\n\n if (hasError) {\n errorElement = (\n <ErrorMessage id={`${resolvedId}-error`}>{error}</ErrorMessage>\n );\n }\n\n return (\n <div className={formField}>\n {labelElement}\n <Input\n id={resolvedId}\n variant={inputVariant}\n aria-invalid={ariaInvalid}\n aria-describedby={describedById}\n fullWidth\n {...rest}\n />\n {errorElement}\n </div>\n );\n};\n","import { style, keyframes } from '@vanilla-extract/css';\n\nimport { vars } from '../../../theme/themeContract.js';\nimport {\n checkboxFieldMarginBottomVar,\n checkboxLabelMarginLeftVar,\n} from '../checkbox_field/checkboxField.css.js';\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const form = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 6,\n});\n\nexport const createProjectTheme = style({\n vars: {\n [vars.colors.primary]: vars.colors.brandPrimaryRed,\n [vars.colors.primaryLight]:\n `color-mix(in srgb, ${vars.colors.brandPrimaryRed} 12%, transparent)`,\n },\n});\n\nexport const formGroup = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n});\n\nexport const input = style([\n sprinkles({\n backgroundColor: 'background',\n borderColor: 'border',\n borderRadius: 'xl',\n borderStyle: 'solid',\n borderWidth: 'default',\n color: 'text',\n fontSize: 'sm',\n padding: 4,\n transitionProperty: 'default',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n }),\n {\n ':focus': {\n outline: 'none',\n borderColor: vars.colors.primary,\n boxShadow: `0 0 0 1px ${vars.colors.primaryLight}`,\n },\n '::placeholder': {\n color: vars.colors.textMuted,\n },\n ':disabled': {\n backgroundColor: vars.colors.backgroundModifier,\n cursor: 'not-allowed',\n },\n },\n]);\n\nexport const errorMessage = sprinkles({\n color: 'error',\n fontSize: 'xs',\n marginTop: 1,\n});\n\nexport const formActions = sprinkles({\n display: 'flex',\n justifyContent: 'flex-end',\n gap: 3,\n marginTop: 2,\n});\n\nexport const button = style([\n sprinkles({\n borderRadius: 'md',\n cursor: 'pointer',\n fontSize: 'sm',\n fontWeight: 'medium',\n paddingY: 2,\n paddingX: 6,\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n }),\n {\n ':disabled': {\n opacity: 0.7,\n cursor: 'not-allowed',\n },\n },\n]);\n\nconst spin = keyframes({\n '0%': { transform: 'rotate(0deg)' },\n '100%': { transform: 'rotate(360deg)' },\n});\n\nexport const spinnerContainer = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n});\n\nexport const spinner = style([\n sprinkles({\n display: 'inline-block',\n width: 4,\n height: 4,\n border: 'spinner',\n borderRadius: '1/2',\n borderTopColor: 'white',\n }),\n {\n animation: `${spin} 0.8s linear infinite`,\n },\n]);\n\nexport const checkboxSection = style([\n sprinkles({\n display: 'flex',\n flexDirection: 'column',\n }),\n {\n vars: {\n [checkboxFieldMarginBottomVar]: '0px',\n [checkboxLabelMarginLeftVar]: vars.spacing[2],\n },\n },\n]);\n\nexport const checkboxItem = style([\n sprinkles({\n paddingY: 3,\n paddingX: 0,\n }),\n {\n selectors: {\n '&:not(:last-child)': {\n borderWidth: 0,\n borderStyle: 'solid',\n borderBottomWidth: 'default',\n borderBottomColor: 'border',\n },\n },\n },\n]);\n","import React, {\n type Ref,\n type ComponentPropsWithoutRef,\n type FormEvent,\n type JSX,\n} from 'react';\n\nimport * as styles from './formStyles.css.js';\nimport { cx } from '../../../theme/tools.js';\n\ntype Props = {\n onSubmit: (event: FormEvent<HTMLFormElement>) => void;\n className?: string;\n children: React.ReactNode;\n ref?: Ref<HTMLFormElement>;\n} & Omit<\n ComponentPropsWithoutRef<'form'>,\n 'onSubmit' | 'className' | 'children'\n>;\n\nexport const Form = (props: Props): JSX.Element => {\n const { onSubmit, className, children, ref, ...rest } = props;\n\n return (\n <form\n {...rest}\n ref={ref}\n onSubmit={onSubmit}\n className={cx(styles.form, className)}\n >\n {children}\n </form>\n );\n};\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n borderRadius: 'sm',\n color: 'error',\n fontSize: 'sm',\n lineHeight: 1.4,\n marginBottom: 4,\n paddingY: 3,\n paddingX: 4,\n backgroundColor: 'error-8',\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'error-35',\n});\n","import { type JSX } from 'react';\n\nimport * as styles from './FormErrorBanner.css.js';\n\ntype Props = {\n message?: string | null;\n className?: string;\n};\n\nexport const FormErrorBanner = ({\n message,\n className,\n}: Props): JSX.Element | null => {\n const content = message?.trim();\n\n if (content == null || content === '') {\n return null;\n }\n\n const classNames = [styles.root, className]\n .filter((value) => {\n return value != null && value !== '';\n })\n .join(' ');\n\n return <div className={classNames}>{content}</div>;\n};\n\nexport default FormErrorBanner;\n","import {\n type Ref,\n type ComponentPropsWithoutRef,\n type JSX,\n type ReactNode,\n} from 'react';\n\nimport * as styles from './formStyles.css.js';\nimport { cx } from '../../../theme/tools.js';\n\ntype Props = {\n className?: string;\n children: ReactNode;\n ref?: Ref<HTMLDivElement>;\n} & Omit<ComponentPropsWithoutRef<'div'>, 'className' | 'children'>;\n\nexport const FormGroup = (props: Props): JSX.Element => {\n const { className, children, ref, ...rest } = props;\n\n return (\n <div {...rest} ref={ref} className={cx(styles.formGroup, className)}>\n {children}\n </div>\n );\n};\n","import { Suspense, lazy, type JSX } from 'react';\n\nimport { HighlightCode } from '../../highlight/HighlightCode.js';\n\ntype Props = {\n code: string;\n language?: string | null;\n badgeLabel?: string | null;\n};\n\nconst MarkdownCodeBlock = lazy(async () => {\n const module = await import('./MarkdownCodeBlock.js');\n return { default: module.MarkdownCodeBlock };\n});\n\nconst resolveBadgeLabel = (\n language: string | null | undefined,\n badgeLabel: string | null | undefined,\n): string => {\n const trimmedBadgeLabel = badgeLabel?.trim();\n if (trimmedBadgeLabel != null && trimmedBadgeLabel !== '') {\n return trimmedBadgeLabel;\n }\n const trimmedLanguage = language?.trim();\n if (trimmedLanguage != null && trimmedLanguage !== '') {\n return trimmedLanguage.toUpperCase();\n }\n return 'CODE';\n};\n\nexport const LazyMarkdownCodeBlock = ({\n code,\n language,\n badgeLabel,\n}: Props): JSX.Element => {\n const resolvedBadgeLabel = resolveBadgeLabel(language, badgeLabel);\n\n return (\n <Suspense\n fallback={\n <HighlightCode\n badgeLabel={resolvedBadgeLabel}\n copyCode={code}\n fallbackCodeText={code}\n placeholderText=\"Loading code block...\"\n />\n }\n >\n <MarkdownCodeBlock\n badgeLabel={badgeLabel}\n code={code}\n language={language}\n />\n </Suspense>\n );\n};\n\nexport default LazyMarkdownCodeBlock;\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const fallback = sprinkles({\n overflowWrap: 'anywhere',\n whiteSpace: 'pre-wrap',\n});\n","import { Suspense, lazy, type JSX } from 'react';\n\nimport * as styles from './LazyMarkdownRenderer.css.js';\n\ntype Props = {\n content: string;\n};\n\nconst MarkdownRenderer = lazy(async () => {\n const module = await import('./MarkdownRenderer.js');\n return { default: module.MarkdownRenderer };\n});\n\nconst FallbackRenderer = ({ content }: Props): JSX.Element => {\n return <div className={styles.fallback}>{content}</div>;\n};\n\nexport const LazyMarkdownRenderer = ({ content }: Props): JSX.Element => {\n return (\n <Suspense fallback={<FallbackRenderer content={content} />}>\n <MarkdownRenderer content={content} />\n </Suspense>\n );\n};\n\nexport default LazyMarkdownRenderer;\n","import { createVar } from '@vanilla-extract/css';\n\nexport const markdownTextColorVar = createVar();\nexport const markdownFontSizeVar = createVar();\nexport const markdownLinkColorVar = createVar();\nexport const markdownLinkHoverColorVar = createVar();\nexport const markdownLinkIconColorVar = createVar();\nexport const markdownLinkDisabledColorVar = createVar();\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const content = sprinkles({\n width: 'full',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 2,\n textAlign: 'center',\n});\n\nexport const icon = sprinkles({\n fontSize: 'xl',\n});\n\nexport const title = sprinkles({\n margin: 0,\n fontSize: 'lg',\n fontWeight: 'semibold',\n color: 'text',\n});\n\nexport const description = sprinkles({\n margin: 0,\n fontSize: 'sm',\n color: 'textSecondary',\n maxWidth: 'md',\n});\n\nexport const actions = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n gap: 2,\n justifyContent: 'center',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { Card } from '../card/Card.js';\nimport * as styles from './EmptyState.css.js';\n\ntype Props = {\n title: string;\n description: ReactNode;\n icon?: ReactNode;\n actions?: ReactNode;\n className?: string;\n};\n\nexport const EmptyState = ({\n title,\n description,\n icon,\n actions,\n className,\n}: Props): JSX.Element => {\n let iconElement: JSX.Element | null = null;\n if (icon != null) {\n iconElement = <div className={styles.icon}>{icon}</div>;\n }\n\n let actionsElement: JSX.Element | null = null;\n if (actions != null) {\n actionsElement = <div className={styles.actions}>{actions}</div>;\n }\n\n return (\n <Card className={className} contentClassName={styles.content}>\n {iconElement}\n <h2 className={styles.title}>{title}</h2>\n <p className={styles.description}>{description}</p>\n {actionsElement}\n </Card>\n );\n};\n\nexport default EmptyState;\n","import { style } from '@vanilla-extract/css';\nimport { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 2,\n justifyContent: 'center',\n});\n\nconst tabBase = style([\n sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 1,\n borderTopLeftRadius: 'md',\n borderTopRightRadius: 'md',\n paddingX: 4,\n paddingY: 2,\n fontSize: 'sm',\n color: 'textSecondary',\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n borderBottomWidth: 2,\n borderBottomColor: 'transparent',\n fontWeight: 'medium',\n textDecoration: 'none',\n outline: 'none',\n position: 'relative',\n }),\n {\n marginBottom: '-1px',\n selectors: {\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n color: vars.colors.primary,\n borderBottomColor: vars.colors.primary,\n },\n },\n },\n]);\n\nexport const tabRecipe = recipe({\n base: tabBase,\n variants: {\n state: {\n default: style({\n selectors: {\n '&:hover': {\n color: vars.colors.primary,\n borderBottomColor: vars.colors.primaryLight,\n },\n },\n }),\n active: sprinkles({\n color: 'primary',\n borderBottomColor: 'primary',\n fontWeight: 'semibold',\n }),\n disabled: sprinkles({\n color: 'textMuted',\n pointerEvents: 'none',\n cursor: 'not-allowed',\n }),\n },\n },\n defaultVariants: {\n state: 'default',\n },\n});\n\nexport type TabRecipeVariants = RecipeVariants<typeof tabRecipe>;\n","import {\n type AnchorHTMLAttributes,\n type ComponentPropsWithoutRef,\n type JSX,\n type MouseEvent,\n type ReactNode,\n} from 'react';\nimport { Link, useLocation } from '@plumile/router';\n\nimport * as styles from './tabs.css.js';\n\nexport type TabsSelectEvent = MouseEvent<HTMLButtonElement | HTMLAnchorElement>;\n\ntype LinkComponentProps = ComponentPropsWithoutRef<typeof Link>;\ntype RouterLinkProps = LinkComponentProps &\n AnchorHTMLAttributes<HTMLAnchorElement>;\nconst RouterLink = Link as unknown as (props: RouterLinkProps) => JSX.Element;\n\ntype BaseTabItem = {\n id: string;\n label: ReactNode;\n disabled?: boolean;\n};\n\ntype NavigationTabItem = BaseTabItem & {\n to: NonNullable<LinkComponentProps['to']>;\n};\n\nexport type TabItem = NavigationTabItem;\n\nexport type TabsProps = {\n items: TabItem[];\n ariaLabel?: string;\n};\n\nexport const Tabs = (props: TabsProps): JSX.Element => {\n const { items, ariaLabel } = props;\n const { pathname } = useLocation();\n\n return (\n <div role=\"tablist\" aria-label={ariaLabel} className={styles.container}>\n {items.map((item) => {\n const { disabled, id, label, to } = item;\n const isActive = pathname === to;\n\n let ariaDisabled: true | undefined;\n if (disabled) {\n ariaDisabled = true;\n }\n\n type TabState = NonNullable<\n Parameters<typeof styles.tabRecipe>[0]\n >['state'];\n let tabState: TabState = 'default';\n let tabIndex: number | undefined;\n if (disabled) {\n tabState = 'disabled';\n tabIndex = -1;\n } else if (isActive) {\n tabState = 'active';\n }\n\n const handleLinkClick = (event: MouseEvent<HTMLAnchorElement>) => {\n if (disabled) {\n event.preventDefault();\n }\n };\n\n return (\n <RouterLink\n key={id}\n exact\n aria-disabled={ariaDisabled}\n className={styles.tabRecipe({ state: tabState })}\n role=\"tab\"\n to={to}\n tabIndex={tabIndex}\n onClick={handleLinkClick}\n >\n {label}\n </RouterLink>\n );\n })}\n </div>\n );\n};\n","import { keyframes, style } from '@vanilla-extract/css';\nimport { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const viewport = sprinkles({\n position: 'fixed',\n right: 4,\n bottom: 4,\n zIndex: 'modal',\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n\nconst slideIn = keyframes({\n from: { transform: 'translateY(10px)', opacity: 0 },\n to: { transform: 'translateY(0)', opacity: 1 },\n});\n\nexport const toast = style([\n sprinkles({\n backgroundColor: 'white',\n borderColor: 'border',\n borderStyle: 'solid',\n borderWidth: 'default',\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n paddingX: 4,\n paddingY: 3,\n borderRadius: 'lg',\n boxShadow: 'lg',\n }),\n {\n width: 'min(28rem, calc(100vw - 2rem))',\n animation: `${slideIn} 140ms ease-out`,\n },\n]);\n\nexport const kindRecipe = recipe({\n variants: {\n kind: {\n info: { borderColor: vars.colors['blue-200'] },\n warning: { borderColor: vars.colors['amber-200'] },\n error: { borderColor: vars.colors['red-200'] },\n },\n },\n defaultVariants: {\n kind: 'info',\n },\n});\n\nexport type KindVariants = RecipeVariants<typeof kindRecipe>;\n\nexport const header = sprinkles({\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: 2,\n});\n\nexport const title = sprinkles({\n fontWeight: 'semibold',\n});\n\nexport const message = sprinkles({\n fontSize: 'sm',\n});\n\nexport const actions = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n marginTop: 1,\n});\n\nexport const closeButton = style([\n sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 8,\n height: 8,\n borderRadius: 'md',\n borderStyle: 'none',\n borderWidth: 0,\n backgroundColor: 'transparent',\n cursor: 'pointer',\n }),\n]);\n\nexport const progressTrack = style([\n sprinkles({\n marginTop: 1,\n borderRadius: 'full',\n }),\n {\n height: 4,\n backgroundColor: vars.colors['blue-50'],\n overflow: 'hidden',\n },\n]);\n\nconst progressFill = keyframes({\n from: { width: '0%' },\n to: { width: '100%' },\n});\n\nexport const progressBar = style([\n {\n height: '100%',\n width: '0%',\n backgroundColor: vars.colors['blue-400'],\n animationName: progressFill,\n animationTimingFunction: 'linear',\n animationFillMode: 'forwards',\n },\n]);\n","export const INFO_TOAST_DURATION_MS = 15_000;\n","import { type JSX, type ReactNode, useMemo } from 'react';\nimport type { RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { ModalCloseSvg } from '../../../icons/ModalCloseSvg.js';\nimport { Button } from '../../atoms/button/Button.js';\nimport { useUiTranslation } from '../../../i18n/useUiTranslation.js';\n\nimport * as styles from './toast.css.js';\nimport { cx } from '../../../theme/tools.js';\nimport { INFO_TOAST_DURATION_MS } from './constants.js';\n\nexport type ToastKind = NonNullable<\n NonNullable<RecipeVariants<typeof styles.kindRecipe>>['kind']\n>;\n\nexport type ToastAction = {\n id: string;\n label: string;\n onClick: () => void;\n};\n\nexport type ToastItem = {\n id: string;\n kind?: ToastKind;\n title: ReactNode;\n message?: ReactNode;\n actions?: readonly ToastAction[];\n};\n\nexport type ToastViewportProps = {\n toasts: readonly ToastItem[];\n onDismiss: (toastId: string) => void;\n dismissLabel?: string;\n className?: string;\n};\n\nexport const ToastViewport = ({\n toasts,\n onDismiss,\n dismissLabel,\n className,\n}: ToastViewportProps): JSX.Element | null => {\n const { t } = useUiTranslation();\n const resolvedDismissLabel = dismissLabel ?? t('toast.dismissAriaLabel');\n\n const items = useMemo(() => {\n return toasts.map((toast) => {\n const kind = toast.kind ?? 'info';\n const actions = toast.actions ?? [];\n\n let messageNode: JSX.Element | null = null;\n if (toast.message != null) {\n messageNode = <div className={styles.message}>{toast.message}</div>;\n }\n\n let actionsNode: JSX.Element | null = null;\n if (actions.length > 0) {\n actionsNode = (\n <div className={styles.actions}>\n {actions.map((action) => {\n return (\n <Button\n key={action.id}\n type=\"button\"\n size=\"small\"\n variant=\"secondary\"\n onClick={action.onClick}\n >\n {action.label}\n </Button>\n );\n })}\n </div>\n );\n }\n\n let progressNode: JSX.Element | null = null;\n if (kind === 'info') {\n progressNode = (\n <div className={styles.progressTrack} aria-hidden=\"true\">\n <div\n className={styles.progressBar}\n style={{ animationDuration: `${INFO_TOAST_DURATION_MS}ms` }}\n />\n </div>\n );\n }\n\n return (\n <div\n key={toast.id}\n className={cx(styles.toast, styles.kindRecipe({ kind }))}\n >\n <div className={styles.header}>\n <div className={styles.title}>{toast.title}</div>\n <button\n type=\"button\"\n className={styles.closeButton}\n aria-label={resolvedDismissLabel}\n onClick={() => {\n onDismiss(toast.id);\n }}\n >\n <ModalCloseSvg width={18} height={18} aria-hidden=\"true\" />\n </button>\n </div>\n {messageNode}\n {actionsNode}\n {progressNode}\n </div>\n );\n });\n }, [onDismiss, resolvedDismissLabel, toasts]);\n\n if (toasts.length === 0) {\n return null;\n }\n\n return <div className={cx(styles.viewport, className)}>{items}</div>;\n};\n","import {\n createContext,\n useEffect,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n type JSX,\n type ReactNode,\n} from 'react';\n\nimport {\n ToastViewport,\n type ToastItem,\n type ToastKind,\n} from './ToastViewport.js';\nimport { INFO_TOAST_DURATION_MS } from './constants.js';\n\nexport type ToastApi = {\n push: (toast: Omit<ToastItem, 'id'> & { id?: string }) => string;\n dismiss: (toastId: string) => void;\n clear: () => void;\n info: (title: ReactNode, message?: ReactNode) => string;\n warning: (title: ReactNode, message?: ReactNode) => string;\n error: (title: ReactNode, message?: ReactNode) => string;\n};\n\nexport type ToastProviderProps = {\n children: ReactNode;\n maxToasts?: number;\n};\n\nconst ToastContext = createContext<ToastApi | null>(null);\n\nconst pushWithKind = (api: ToastApi, kind: ToastKind) => {\n return (title: ReactNode, message?: ReactNode): string => {\n return api.push({ kind, title, message });\n };\n};\n\nexport const ToastProvider = ({\n children,\n maxToasts = 4,\n}: ToastProviderProps): JSX.Element => {\n const [toasts, setToasts] = useState<ToastItem[]>([]);\n const counter = useRef(0);\n const infoToastTimers = useRef<Map<string, ReturnType<typeof setTimeout>>>(\n new Map(),\n );\n\n const dismiss = useCallback((toastId: string) => {\n const timer = infoToastTimers.current.get(toastId);\n if (timer != null) {\n clearTimeout(timer);\n infoToastTimers.current.delete(toastId);\n }\n setToasts((prev) => {\n return prev.filter((t) => {\n return t.id !== toastId;\n });\n });\n }, []);\n\n const clear = useCallback(() => {\n infoToastTimers.current.forEach((timer) => {\n clearTimeout(timer);\n });\n infoToastTimers.current.clear();\n setToasts([]);\n }, []);\n\n const push = useCallback(\n (toast: Omit<ToastItem, 'id'> & { id?: string }): string => {\n const id = toast.id ?? `toast-${counter.current++}`;\n setToasts((prev) => {\n const next = [...prev, { ...toast, kind: toast.kind ?? 'info', id }];\n if (next.length > maxToasts) {\n return next.slice(next.length - maxToasts);\n }\n return next;\n });\n return id;\n },\n [maxToasts],\n );\n\n useEffect(() => {\n const activeInfoToastIds = new Set<string>();\n toasts.forEach((toast) => {\n if (toast.kind !== 'info') {\n return;\n }\n activeInfoToastIds.add(toast.id);\n if (infoToastTimers.current.has(toast.id)) {\n return;\n }\n const timer = setTimeout(() => {\n infoToastTimers.current.delete(toast.id);\n setToasts((prev) => {\n return prev.filter((item) => {\n return item.id !== toast.id;\n });\n });\n }, INFO_TOAST_DURATION_MS);\n infoToastTimers.current.set(toast.id, timer);\n });\n\n infoToastTimers.current.forEach((timer, toastId) => {\n if (activeInfoToastIds.has(toastId)) {\n return;\n }\n clearTimeout(timer);\n infoToastTimers.current.delete(toastId);\n });\n }, [toasts]);\n\n useEffect(() => {\n const timers = infoToastTimers.current;\n return () => {\n timers.forEach((timer) => {\n clearTimeout(timer);\n });\n timers.clear();\n };\n }, []);\n\n const api = useMemo<ToastApi>(() => {\n const base: ToastApi = {\n push,\n dismiss,\n clear,\n info: () => {\n return '';\n },\n warning: () => {\n return '';\n },\n error: () => {\n return '';\n },\n };\n return {\n ...base,\n info: pushWithKind(base, 'info'),\n warning: pushWithKind(base, 'warning'),\n error: pushWithKind(base, 'error'),\n };\n }, [clear, dismiss, push]);\n\n return (\n <ToastContext.Provider value={api}>\n {children}\n <ToastViewport toasts={toasts} onDismiss={dismiss} />\n </ToastContext.Provider>\n );\n};\n\nexport const useToast = (): ToastApi => {\n const value = useContext(ToastContext);\n if (value == null) {\n throw new Error('useToast must be used within a ToastProvider');\n }\n return value;\n};\n","/* eslint-disable no-ternary */\nimport { useState, type ChangeEvent, type FormEvent } from 'react';\nimport { useUiTranslation } from '../../../i18n/useUiTranslation.js';\n\ninterface LoginFormData {\n email: string;\n password: string;\n}\n\ninterface LoginFormState {\n formData: LoginFormData;\n errors: {\n email?: string;\n password?: string;\n form?: string;\n };\n isSubmitting: boolean;\n}\n\ninterface UseLoginFormResult {\n formData: LoginFormData;\n errors: LoginFormState['errors'];\n isSubmitting: boolean;\n handleChange: (event: ChangeEvent<HTMLInputElement>) => void;\n handleSubmit: (event: FormEvent<HTMLFormElement>) => Promise<void>;\n}\n\nexport interface LoginFormAuthAdapter {\n login: (\n credentials: LoginFormData,\n ) => Promise<'success' | 'mfa-required' | 'error'>;\n beginAuthentication?: (email: string) => Promise<{\n methods: readonly string[];\n lockedUntil: string | null;\n }>;\n isLoading: boolean;\n nextStep?: string | null;\n error: { message: string } | null;\n lockedUntil?: string | null;\n availableMethods?: string[];\n}\n\n/**\n * Handles login form state, validation, and submission workflow.\n */\nexport function useLoginForm(\n auth: LoginFormAuthAdapter,\n onSuccess?: () => void,\n defaultEmail?: string,\n): UseLoginFormResult {\n const { t } = useUiTranslation();\n const [state, setState] = useState<LoginFormState>({\n formData: {\n email: defaultEmail ?? '',\n password: '',\n },\n errors: {},\n isSubmitting: false,\n });\n\n /** Validates the form data and updates error state when needed. */\n function validateForm(): boolean {\n const errors: LoginFormState['errors'] = {};\n let isValid = true;\n\n if (state.formData.email.trim().length === 0) {\n errors.email = t('auth.loginForm.errors.emailRequired');\n isValid = false;\n }\n\n if (state.formData.password.length === 0) {\n errors.password = t('auth.loginForm.errors.passwordRequired');\n isValid = false;\n } else if (state.formData.password.length < 6) {\n errors.password = t('auth.loginForm.errors.passwordMinLength', {\n minLength: 6,\n });\n isValid = false;\n }\n\n setState((prev) => {\n return {\n ...prev,\n errors,\n };\n });\n return isValid;\n }\n\n /** Handles updates to form fields and clears related errors. */\n function handleChange(event: ChangeEvent<HTMLInputElement>): void {\n const { name, value, type, checked } = event.target;\n let fieldValue: string | boolean = value;\n\n if (type === 'checkbox') {\n fieldValue = checked;\n }\n\n setState((prev) => {\n return {\n ...prev,\n formData: {\n ...prev.formData,\n [name]: fieldValue,\n },\n errors: {\n ...prev.errors,\n [name]: undefined,\n form: undefined,\n },\n };\n });\n }\n\n /** Submits the login form through the authentication hook. */\n async function handleSubmit(\n event: FormEvent<HTMLFormElement>,\n ): Promise<void> {\n event.preventDefault();\n\n if (!validateForm()) {\n return;\n }\n\n setState((prev) => {\n return {\n ...prev,\n isSubmitting: true,\n };\n });\n\n try {\n if (auth.beginAuthentication != null) {\n const result = await auth.beginAuthentication(\n state.formData.email.trim(),\n );\n const methodList = Array.isArray(result.methods) ? result.methods : [];\n if (methodList.length === 0) {\n const formErrorMessage =\n result.lockedUntil != null\n ? t('auth.loginForm.errors.lockedWithTime', {\n time: new Date(result.lockedUntil).toLocaleString(),\n })\n : t('auth.loginForm.errors.locked');\n setState((prev) => {\n return {\n ...prev,\n errors: {\n ...prev.errors,\n form: formErrorMessage,\n },\n };\n });\n return;\n }\n }\n\n const status = await auth.login({\n email: state.formData.email,\n password: state.formData.password,\n });\n\n if (status === 'success') {\n onSuccess?.();\n }\n } catch {\n // Error handling is done by the useAuth hook,\n // but we can set a form-level error here if needed\n const fallbackMessage = t('auth.loginForm.errors.loginFailed');\n const authMessage = auth.error?.message;\n let formErrorMessage = fallbackMessage;\n\n if (authMessage != null && authMessage !== '') {\n formErrorMessage = authMessage;\n }\n\n setState((prev) => {\n return {\n ...prev,\n errors: {\n ...prev.errors,\n form: formErrorMessage,\n },\n };\n });\n } finally {\n setState((prev) => {\n return {\n ...prev,\n isSubmitting: false,\n };\n });\n }\n }\n\n return {\n formData: state.formData,\n errors: state.errors,\n isSubmitting: auth.isLoading || state.isSubmitting,\n handleChange,\n handleSubmit,\n };\n}\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const form = sprinkles({\n width: 'full',\n display: 'flex',\n flexDirection: 'column',\n gap: 6,\n});\n\nexport const options = sprinkles({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 8,\n});\n\nexport const forgotPassword = sprinkles({\n fontSize: 'sm',\n});\n\nexport const link = sprinkles({\n color: 'primary',\n textDecoration: 'none',\n fontWeight: 'medium',\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n});\n","/* eslint-disable @typescript-eslint/no-misused-promises */\nimport type { JSX } from 'react';\nimport { useUiTranslation } from '../../../i18n/useUiTranslation.js';\nimport { FormField } from '../../molecules/form_field/FormField.js';\nimport { Button } from '@plumile/ui';\nimport { FormError } from '../../molecules/form_error/FormError.js';\nimport { useLoginForm, type LoginFormAuthAdapter } from './useLoginForm.js';\nimport { form } from './loginForm.css.js';\nimport { cx } from '../../../theme/tools.js';\n\ntype Props = {\n auth: LoginFormAuthAdapter;\n onSuccess?: () => void;\n defaultEmail?: string;\n submitButtonClassName?: string;\n className?: string;\n};\n\nexport const LoginForm = (props: Props): JSX.Element => {\n const { t } = useUiTranslation();\n const { auth, onSuccess, defaultEmail, submitButtonClassName, className } =\n props;\n const { formData, errors, isSubmitting, handleChange, handleSubmit } =\n useLoginForm(auth, onSuccess, defaultEmail);\n\n let formError: JSX.Element | null = null;\n if (errors.form != null) {\n formError = <FormError>{errors.form}</FormError>;\n }\n\n return (\n <form className={cx(form, className)} onSubmit={handleSubmit} noValidate>\n {formError}\n <div>\n <FormField\n label={t('auth.loginForm.labels.email')}\n name=\"email\"\n type=\"text\"\n value={formData.email}\n onChange={handleChange}\n error={errors.email}\n placeholder={t('auth.loginForm.placeholders.email')}\n autoComplete=\"email\"\n autoFocus\n required\n />\n <FormField\n label={t('auth.loginForm.labels.password')}\n name=\"password\"\n type=\"password\"\n value={formData.password}\n onChange={handleChange}\n error={errors.password}\n placeholder={t('auth.loginForm.placeholders.password')}\n autoComplete=\"current-password\"\n required\n />\n </div>\n <Button\n type=\"submit\"\n width=\"full\"\n size=\"large\"\n className={cx(submitButtonClassName)}\n isLoading={isSubmitting}\n >\n {t('auth.loginForm.actions.submit')}\n </Button>\n </form>\n );\n};\n","import { style } from '@vanilla-extract/css';\nimport { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nconst EASE_IN_OUT = 'ease-in-out';\n\nexport const sidebar = sprinkles({\n display: 'flex',\n height: 'screen',\n flexDirection: 'column',\n overflow: 'hidden',\n padding: 3,\n transitionProperty: 'width',\n transitionDuration: 300,\n transitionTimingFunction: EASE_IN_OUT,\n});\n\nexport const sidebarWidthRecipe = recipe({\n variants: {\n state: {\n collapsed: { width: vars.width[16] },\n expanded: { width: vars.width[60] },\n },\n },\n defaultVariants: {\n state: 'expanded',\n },\n});\n\nexport type SidebarWidthVariants = RecipeVariants<typeof sidebarWidthRecipe>;\n\nexport const content = sprinkles({\n display: 'flex',\n flex: 1,\n flexDirection: 'column',\n});\n\nexport const headerRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-start',\n gap: 2,\n marginBottom: 3,\n marginTop: 0,\n padding: 2,\n borderRadius: 'xl',\n backgroundImage: 'brandDiagonal',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'brandPrimaryRed',\n transitionProperty: 'opacity',\n transitionDuration: 300,\n transitionTimingFunction: EASE_IN_OUT,\n});\n\nexport const headerActions = sprinkles({\n display: 'flex',\n width: 'full',\n justifyContent: 'flex-start',\n gap: 2,\n marginBottom: 3,\n});\n\nexport const nav = sprinkles({\n display: 'flex',\n flex: 1,\n flexDirection: 'column',\n gap: 2,\n transitionProperty: 'gap',\n transitionDuration: 300,\n transitionTimingFunction: EASE_IN_OUT,\n paddingTop: 4,\n});\n\nexport const navCollapsed = sprinkles({\n gap: 1,\n});\n\nexport const footer = sprinkles({\n marginTop: 4,\n});\n\nexport const footerCollapsed = sprinkles({\n display: 'flex',\n justifyContent: 'center',\n});\n\nexport const defaultHeaderButton = style([\n sprinkles({\n borderRadius: 'md',\n paddingY: 2,\n paddingX: 3,\n fontSize: 'sm',\n fontWeight: 'medium',\n color: 'brandWhite',\n backgroundImage: 'brandDiagonal',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'brandPrimaryRed',\n transitionProperty: 'default',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n }),\n {\n boxShadow: `0 10px 20px color-mix(in srgb, ${vars.colors.black} 8%, transparent)`,\n selectors: {\n '&:hover': {\n boxShadow: `0 12px 24px color-mix(in srgb, ${vars.colors.black} 12%, transparent)`,\n transform: 'translateY(-1px)',\n },\n '&:focus-visible': {\n outline: 'none',\n boxShadow: `0 0 0 2px ${vars.colors.brandSecondaryOrange}`,\n },\n },\n },\n]);\n\nconst navigationLinkBase = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 3,\n borderRadius: 'lg',\n paddingY: 2,\n paddingX: 3,\n fontSize: 'sm',\n lineHeight: 1.2,\n textDecoration: 'none',\n backgroundColor: 'transparent',\n color: 'brandDarkGray',\n transitionProperty: 'default',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n});\n\nexport const organizationLink = style([\n navigationLinkBase,\n sprinkles({ fontWeight: 'semibold' }),\n {\n selectors: {\n '&:hover': {\n backgroundColor: vars.colors.brandLightGray,\n borderColor: vars.colors.brandSecondaryOrange,\n },\n },\n },\n]);\n\nexport const organizationLinkActive = sprinkles({\n backgroundImage: 'brandDiagonal',\n color: 'brandWhite',\n borderRadius: 'xl',\n});\n\nexport const organizationIcon = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 5,\n height: 5,\n color: 'inherit',\n fontWeight: 'semibold',\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n});\n\nexport const linkLabel = sprinkles({\n flex: 1,\n minWidth: 0,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n});\n","import { type JSX, type ReactNode } from 'react';\nimport type { RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './sidebar.css.js';\n\nexport type SidebarContainerProps = {\n children: ReactNode;\n headerSlot?: ReactNode;\n footerSlot?: ReactNode;\n hideHeader?: boolean;\n isCollapsed?: boolean;\n showDefaultHeaderAction?: boolean;\n};\n\nexport const SidebarContainer = ({\n children,\n headerSlot,\n footerSlot,\n hideHeader = false,\n isCollapsed = false,\n}: SidebarContainerProps): JSX.Element => {\n let headerAction: ReactNode | null = null;\n if (!isCollapsed) {\n headerAction = headerSlot;\n }\n\n const shouldRenderHeader = !hideHeader && headerAction != null;\n\n let widthState: NonNullable<\n NonNullable<RecipeVariants<typeof styles.sidebarWidthRecipe>>['state']\n > = 'expanded';\n if (isCollapsed) {\n widthState = 'collapsed';\n }\n\n return (\n <aside\n className={cx(\n styles.sidebar,\n styles.sidebarWidthRecipe({ state: widthState }),\n )}\n >\n <div className={styles.content}>\n {shouldRenderHeader && (\n <div className={styles.headerActions}>{headerAction}</div>\n )}\n <nav\n className={cx(styles.nav, {\n [styles.navCollapsed]: isCollapsed,\n })}\n >\n {children}\n </nav>\n </div>\n {footerSlot != null && (\n <div\n className={cx(styles.footer, {\n [styles.footerCollapsed]: isCollapsed,\n })}\n >\n {footerSlot}\n </div>\n )}\n </aside>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ChevronLeftSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M15 18L9 12L15 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ChevronRightSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M9 18L15 12L9 6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const GlobeSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.94-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ProjectsFolderSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M22 19C22 19.5304 21.7893 20.0391 21.4142 20.4142C21.0391 20.7893 20.5304 21 20 21H4C3.46957 21 2.96086 20.7893 2.58579 20.4142C2.21071 20.0391 2 19.5304 2 19V5C2 4.46957 2.21071 3.96086 2.58579 3.58579C2.96086 3.21071 3.46957 3 4 3H9L11 6H20C20.5304 6 21.0391 6.21071 21.4142 6.58579C21.7893 6.96086 22 7.46957 22 8V19Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const SidebarInitiativesSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M19 3H5C3.89543 3 3 3.89543 3 5V19C3 20.1046 3.89543 21 5 21H19C20.1046 21 21 20.1046 21 19V5C21 3.89543 20.1046 3 19 3Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3 9H21\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M9 21V9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const SidebarPlusSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M12 5V19\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M5 12H19\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const SidebarSearchSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M11 19C15.4183 19 19 15.4183 19 11C19 6.58172 15.4183 3 11 3C6.58172 3 3 6.58172 3 11C3 15.4183 6.58172 19 11 19Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M21 21L16.65 16.65\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const SidebarSettingsSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const SidebarTasksSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M9 11L12 14L22 4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M21 12V19C21 19.5304 20.7893 20.0391 20.4142 20.4142C20.0391 20.7893 19.5304 21 19 21H5C4.46957 21 3.96086 20.7893 3.58579 20.4142C3.21071 20.0391 3 19.5304 3 19V5C3 4.46957 3.21071 3.96086 3.58579 3.58579C3.96086 3.21071 4.46957 3 5 3H16\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const SidebarTeamSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M17 21V19C17 17.9391 16.5786 16.9217 15.8284 16.1716C15.0783 15.4214 14.0609 15 13 15H5C3.93913 15 2.92172 15.4214 2.17157 16.1716C1.42143 16.9217 1 17.9391 1 19V21\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M9 11C11.2091 11 13 9.20914 13 7C13 4.79086 11.2091 3 9 3C6.79086 3 5 4.79086 5 7C5 9.20914 6.79086 11 9 11Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M23 21V19C22.9993 18.1137 22.7044 17.2528 22.1614 16.5523C21.6184 15.8519 20.8581 15.3516 20 15.13\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M16 3.13C16.8604 3.35031 17.623 3.85071 18.1676 4.55232C18.7122 5.25392 19.0078 6.11683 19.0078 7.005C19.0078 7.89318 18.7122 8.75608 18.1676 9.45769C17.623 10.1593 16.8604 10.6597 16 10.88\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\nimport { ChevronDownSvg } from '../../../icons/ChevronDownSvg.js';\nimport { ChevronLeftSvg } from '../../../icons/ChevronLeftSvg.js';\nimport { ChevronRightSvg } from '../../../icons/ChevronRightSvg.js';\nimport { GlobeSvg } from '../../../icons/GlobeSvg.js';\nimport { ProjectsFolderSvg } from '../../../icons/ProjectsFolderSvg.js';\nimport { SidebarHomeSvg } from '../../../icons/SidebarHomeSvg.js';\nimport { SidebarInitiativesSvg } from '../../../icons/SidebarInitiativesSvg.js';\nimport { SidebarPlusSvg } from '../../../icons/SidebarPlusSvg.js';\nimport { SidebarSearchSvg } from '../../../icons/SidebarSearchSvg.js';\nimport { SidebarSettingsSvg } from '../../../icons/SidebarSettingsSvg.js';\nimport { SidebarTasksSvg } from '../../../icons/SidebarTasksSvg.js';\nimport { SidebarTeamSvg } from '../../../icons/SidebarTeamSvg.js';\n\ntype Props = {\n size?: number;\n className?: string;\n};\n\nexport const HomeIcon = ({ size = 24, className }: Props): JSX.Element => {\n return <SidebarHomeSvg width={size} height={size} className={className} />;\n};\n\nexport const TasksIcon = ({ size = 24, className }: Props): JSX.Element => {\n return <SidebarTasksSvg width={size} height={size} className={className} />;\n};\n\nexport const InitiativesIcon = ({\n size = 24,\n className,\n}: Props): JSX.Element => {\n return (\n <SidebarInitiativesSvg width={size} height={size} className={className} />\n );\n};\n\nexport const TeamIcon = ({ size = 24, className }: Props): JSX.Element => {\n return <SidebarTeamSvg width={size} height={size} className={className} />;\n};\n\nexport const DocumentationIcon = ({\n size = 24,\n className,\n}: Props): JSX.Element => {\n return <GlobeSvg width={size} height={size} className={className} />;\n};\n\nexport const SettingsIcon = ({ size = 24, className }: Props): JSX.Element => {\n return (\n <SidebarSettingsSvg width={size} height={size} className={className} />\n );\n};\n\nexport const ProjectsIcon = ({ size = 24, className }: Props): JSX.Element => {\n return <ProjectsFolderSvg width={size} height={size} className={className} />;\n};\n\nexport const ChevronDownIcon = ({\n size = 24,\n className,\n}: Props): JSX.Element => {\n return <ChevronDownSvg width={size} height={size} className={className} />;\n};\n\nexport const ChevronRightIcon = ({\n size = 24,\n className,\n}: Props): JSX.Element => {\n return <ChevronRightSvg width={size} height={size} className={className} />;\n};\n\nexport const ChevronLeftIcon = ({\n size = 24,\n className,\n}: Props): JSX.Element => {\n return <ChevronLeftSvg width={size} height={size} className={className} />;\n};\n\nexport const SearchIcon = ({ size = 24, className }: Props): JSX.Element => {\n return <SidebarSearchSvg width={size} height={size} className={className} />;\n};\n\nexport const PlusIcon = ({ size = 24, className }: Props): JSX.Element => {\n return <SidebarPlusSvg width={size} height={size} className={className} />;\n};\n","import { style } from '@vanilla-extract/css';\nimport { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const collapseButton = style([\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 'lg',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'brandPrimaryRed',\n color: 'brandPrimaryRed',\n backgroundColor: 'brandWhite',\n height: 10,\n transitionProperty: 'default',\n transitionDuration: 200,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n '&:hover': {\n backgroundColor: vars.colors.brandSecondaryOrange,\n color: vars.colors.brandWhite,\n boxShadow: vars.boxShadow.brandGlow,\n },\n '&:focus-visible': {\n outline: 'none',\n boxShadow: `0 0 0 2px ${vars.colors.brandSecondaryOrange}`,\n },\n },\n },\n]);\n\nexport const collapseButtonStateRecipe = recipe({\n variants: {\n state: {\n collapsed: {\n width: vars.spacing[10],\n paddingInline: 0,\n },\n expanded: {\n paddingInline: vars.spacing[3],\n width: 'auto',\n },\n },\n },\n defaultVariants: {\n state: 'expanded',\n },\n});\n\nexport type CollapseButtonStateVariants = RecipeVariants<\n typeof collapseButtonStateRecipe\n>;\n\nexport const collapseButtonLabel = sprinkles({\n marginLeft: 2,\n fontSize: 'sm',\n fontWeight: 'medium',\n});\n\nexport const collapsibleSection = sprinkles({\n display: 'grid',\n transitionProperty: 'gridTemplateRowsOpacity',\n transitionDuration: 300,\n transitionTimingFunction: 'ease-in-out',\n});\n\nexport const collapsibleStateRecipe = recipe({\n variants: {\n state: {\n expanded: {\n gridTemplateRows: '1fr',\n opacity: 1,\n },\n collapsed: {\n gridTemplateRows: '0fr',\n opacity: 0,\n pointerEvents: 'none',\n },\n },\n },\n defaultVariants: {\n state: 'collapsed',\n },\n});\n\nexport type CollapsibleStateVariants = RecipeVariants<\n typeof collapsibleStateRecipe\n>;\n\nexport const collapsibleContent = sprinkles({\n marginTop: 1,\n marginLeft: 5,\n borderLeftWidth: 2,\n borderStyle: 'solid',\n borderColor: 'brandPrimaryRed',\n paddingLeft: 3,\n overflow: 'hidden',\n});\n\nexport const collapsibleItem = style({\n selectors: {\n '&:not(:first-child)': {\n marginTop: vars.spacing[1],\n },\n },\n});\n\nexport const itemWrapper = sprinkles({\n position: 'relative',\n});\n\nconst interactiveBase = style([\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-start',\n width: 'full',\n borderRadius: 'lg',\n paddingY: 2,\n paddingX: 3,\n fontSize: 'sm',\n lineHeight: 1.2,\n textAlign: 'left',\n backgroundColor: 'transparent',\n transitionProperty: 'default',\n transitionDuration: 200,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n '&:hover': {\n backgroundColor: vars.colors.brandLightGray,\n borderColor: vars.colors.brandSecondaryOrange,\n },\n '&:focus-visible': {\n outline: 'none',\n },\n },\n },\n]);\n\nexport const navButton = style([\n interactiveBase,\n sprinkles({ fontWeight: 'bold', color: 'brandDarkGray' }),\n]);\n\nconst navLinkBase = style([\n interactiveBase,\n sprinkles({ fontWeight: 'semibold', textDecoration: 'none' }),\n]);\n\nexport const navLinkRecipe = recipe({\n base: navLinkBase,\n variants: {\n state: {\n default: sprinkles({\n color: 'brandDarkGray',\n }),\n active: sprinkles({\n backgroundImage: 'brandDiagonal',\n color: 'brandWhite',\n borderColor: 'brandPrimaryRed',\n borderRadius: 'xl',\n }),\n },\n },\n defaultVariants: {\n state: 'default',\n },\n});\n\nexport type NavLinkVariants = RecipeVariants<typeof navLinkRecipe>;\n\nexport const navGapRecipe = recipe({\n variants: {\n state: {\n collapsed: sprinkles({ columnGap: 0 }),\n expanded: sprinkles({ columnGap: 3 }),\n },\n },\n defaultVariants: {\n state: 'expanded',\n },\n});\n\nexport type NavGapVariants = RecipeVariants<typeof navGapRecipe>;\n\nexport const navWithTrailingAction = sprinkles({\n paddingRight: 12,\n});\n\nexport const label = sprinkles({\n flex: 1,\n minWidth: 0,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n transitionProperty: 'opacity',\n transitionDuration: 200,\n transitionTimingFunction: 'ease',\n});\n\nexport const iconWrapper = sprinkles({\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 5,\n height: 5,\n flexShrink: 0,\n});\n\nconst fadingLayer = sprinkles({\n transitionProperty: 'opacity',\n transitionDuration: 200,\n transitionTimingFunction: 'ease',\n});\n\nexport const iconBaseLayer = fadingLayer;\n\nexport const iconHiddenOnHover = style([\n fadingLayer,\n {\n selectors: {\n [`${itemWrapper}:hover &`]: { opacity: 0 },\n [`${itemWrapper}:focus-visible &`]: { opacity: 0 },\n [`${itemWrapper}:focus-within &`]: { opacity: 0 },\n },\n },\n]);\n\nexport const iconVisibleOnHover = style([\n fadingLayer,\n sprinkles({ opacity: 0 }),\n {\n selectors: {\n [`${itemWrapper}:hover &`]: { opacity: 1 },\n [`${itemWrapper}:focus-visible &`]: { opacity: 1 },\n [`${itemWrapper}:focus-within &`]: { opacity: 1 },\n },\n },\n]);\n\nexport const trailingIconWrapper = sprinkles({\n position: 'relative',\n marginLeft: 'auto',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 5,\n height: 5,\n});\n\nexport const trailingActionButton = style([\n sprinkles({\n position: 'absolute',\n top: '1/2',\n right: 2,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 8,\n height: 8,\n borderRadius: 'md',\n backgroundColor: 'brandWhite',\n color: 'brandPrimaryRed',\n opacity: 0,\n transitionProperty: 'default',\n transitionDuration: 200,\n transitionTimingFunction: 'ease',\n }),\n {\n transform: 'translateY(-50%)',\n selectors: {\n [`${itemWrapper}:hover &`]: { opacity: 1 },\n [`${itemWrapper}:focus-within &`]: { opacity: 1 },\n '&:hover': {\n backgroundColor: vars.colors.brandSecondaryOrange,\n color: vars.colors.brandWhite,\n },\n '&:focus-visible': {\n outline: 'none',\n boxShadow: `0 0 0 2px ${vars.colors.brandSecondaryOrange}`,\n opacity: 1,\n },\n },\n },\n]);\n\nexport const trailingActionIconWrapper = sprinkles({\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 4,\n height: 4,\n});\n\nexport const trailingActionIconHidden = style([\n sprinkles({\n transitionProperty: 'opacity',\n transitionDuration: 200,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n [`${trailingActionButton}:hover &`]: { opacity: 0 },\n [`${trailingActionButton}:focus-visible &`]: { opacity: 0 },\n },\n },\n]);\n\nexport const trailingActionIconVisible = style([\n sprinkles({\n opacity: 0,\n transitionProperty: 'opacity',\n transitionDuration: 200,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n [`${trailingActionButton}:hover &`]: { opacity: 1 },\n [`${trailingActionButton}:focus-visible &`]: { opacity: 1 },\n },\n },\n]);\n\nconst childLinkBase = style([\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n borderRadius: 'lg',\n paddingY: 2,\n paddingX: 3,\n fontSize: 'sm',\n fontWeight: 'medium',\n lineHeight: 1.2,\n textDecoration: 'none',\n transitionProperty: 'colors',\n transitionDuration: 200,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n '&:hover': {\n backgroundColor: vars.colors.brandLightGray,\n color: vars.colors.brandDarkGray,\n },\n },\n },\n]);\n\nexport const childLinkRecipe = recipe({\n base: childLinkBase,\n variants: {\n state: {\n default: sprinkles({\n color: 'brandDarkGray',\n }),\n active: sprinkles({\n backgroundColor: 'brandSecondaryOrange',\n color: 'brandWhite',\n fontWeight: 'semibold',\n }),\n },\n },\n defaultVariants: {\n state: 'default',\n },\n});\n\nexport type ChildLinkVariants = RecipeVariants<typeof childLinkRecipe>;\n\nexport const childIcon = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 4,\n height: 4,\n flexShrink: 0,\n color: 'brandPrimaryRed',\n});\n\nexport const childLabel = sprinkles({\n flex: 1,\n minWidth: 0,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n});\n","import {\n type JSX,\n type MouseEvent,\n type ReactNode,\n useCallback,\n useMemo,\n useState,\n} from 'react';\nimport { Link, useLocation } from '@plumile/router';\nimport type { RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { useUiTranslation } from '../../../i18n/useUiTranslation.js';\nimport { cx } from '../../../theme/tools.js';\nimport { ChevronLeftIcon, ChevronRightIcon } from './icons.js';\nimport * as styles from './navigationSidebar.css.js';\nimport { SidebarContainer } from './SidebarContainer.js';\n\ntype SidebarItemTrailingAction = {\n icon: ReactNode;\n hoverIcon?: ReactNode;\n label: string;\n onClick: () => void;\n};\n\ntype SidebarItem = {\n key: string;\n to: string;\n label: string;\n icon: ReactNode;\n exact?: boolean;\n hoverIcon?: ReactNode;\n trailingIcon?: ReactNode;\n trailingHoverIcon?: ReactNode;\n trailingAction?: SidebarItemTrailingAction;\n childItems?: SidebarChildItem[];\n defaultExpanded?: boolean;\n};\n\ntype SidebarChildItem = {\n key: string;\n to: string;\n label: string;\n icon?: ReactNode;\n};\n\ntype NavigationSidebarProps = {\n items: SidebarItem[];\n headerSlot?: ReactNode;\n isCollapsed?: boolean;\n onCollapsedChange?: (nextCollapsed: boolean) => void;\n showCollapseToggle?: boolean;\n};\n\nconst CollapsibleSection = ({\n id,\n isExpanded,\n children,\n}: {\n id: string;\n isExpanded: boolean;\n children: ReactNode;\n}): JSX.Element => {\n let collapsibleStateKey: NonNullable<\n NonNullable<RecipeVariants<typeof styles.collapsibleStateRecipe>>['state']\n > = 'collapsed';\n if (isExpanded) {\n collapsibleStateKey = 'expanded';\n }\n\n return (\n <div\n id={id}\n aria-hidden={!isExpanded}\n className={cx(\n styles.collapsibleSection,\n styles.collapsibleStateRecipe({ state: collapsibleStateKey }),\n )}\n >\n <div className={styles.collapsibleContent}>{children}</div>\n </div>\n );\n};\n\nconst NavigationSidebar = ({\n items,\n headerSlot,\n isCollapsed: isCollapsedProp,\n onCollapsedChange,\n showCollapseToggle = true,\n}: NavigationSidebarProps): JSX.Element => {\n const { t } = useUiTranslation();\n const [internalCollapsed, setInternalCollapsed] = useState(false);\n const [expandedState, setExpandedState] = useState<Record<string, boolean>>(\n {},\n );\n const isControlled = isCollapsedProp != null;\n const isCollapsed = isCollapsedProp ?? internalCollapsed;\n const { pathname } = useLocation();\n\n const isPathActive = (target: string, exact?: boolean): boolean => {\n if (exact === true) {\n return pathname === target;\n }\n if (pathname === target) {\n return true;\n }\n return pathname.startsWith(`${target}/`);\n };\n\n const handleToggle = useCallback((key: string, nextState: boolean) => {\n setExpandedState((prev) => {\n return {\n ...prev,\n [key]: nextState,\n };\n });\n }, []);\n\n const handleCollapseToggle = useCallback(() => {\n const nextState = !isCollapsed;\n if (!isControlled) {\n setInternalCollapsed(nextState);\n }\n onCollapsedChange?.(nextState);\n }, [isCollapsed, isControlled, onCollapsedChange]);\n\n let headerContent: ReactNode | undefined;\n if (!isCollapsed) {\n headerContent = headerSlot ?? undefined;\n }\n\n const collapseButton = useMemo(() => {\n if (!showCollapseToggle) {\n return null;\n }\n\n let CollapseIcon = ChevronLeftIcon;\n let buttonLabel = t('navigation.sidebar.actions.collapseAriaLabel');\n if (isCollapsed) {\n CollapseIcon = ChevronRightIcon;\n buttonLabel = t('navigation.sidebar.actions.expandAriaLabel');\n }\n\n let collapseState: NonNullable<\n NonNullable<\n RecipeVariants<typeof styles.collapseButtonStateRecipe>\n >['state']\n > = 'expanded';\n if (isCollapsed) {\n collapseState = 'collapsed';\n }\n\n let collapseLabel: JSX.Element | null = null;\n if (!isCollapsed) {\n collapseLabel = (\n <span className={styles.collapseButtonLabel}>\n {t('navigation.sidebar.actions.collapse')}\n </span>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={handleCollapseToggle}\n className={cx(\n styles.collapseButton,\n styles.collapseButtonStateRecipe({ state: collapseState }),\n )}\n aria-label={buttonLabel}\n >\n <CollapseIcon size={20} />\n {collapseLabel}\n </button>\n );\n }, [handleCollapseToggle, isCollapsed, showCollapseToggle, t]);\n\n return (\n <SidebarContainer\n headerSlot={headerContent}\n footerSlot={collapseButton}\n isCollapsed={isCollapsed}\n showDefaultHeaderAction={false}\n >\n {items.map((item) => {\n const childItems = item.childItems ?? null;\n const hasChildren = childItems != null && childItems.length > 0;\n const storedExpanded = expandedState[item.key];\n let isExpanded = storedExpanded ?? item.defaultExpanded ?? false;\n const nextExpanded = !isExpanded;\n let childSectionId: string | undefined;\n const shouldRenderChildren = !isCollapsed && hasChildren;\n if (shouldRenderChildren) {\n childSectionId = `navigation-sidebar-${item.key}-children`;\n }\n\n if (hasChildren) {\n const hasActiveChild = childItems.some((child) => {\n return isPathActive(child.to);\n });\n\n if (hasActiveChild) {\n isExpanded = true;\n }\n }\n\n let trailingAction: SidebarItemTrailingAction | null = null;\n if (!isCollapsed && item.trailingAction != null) {\n trailingAction = item.trailingAction;\n }\n const showTrailingAction = trailingAction != null;\n const hasHoverIcon =\n item.hoverIcon !== undefined && item.hoverIcon !== null;\n const hasTrailingIcon =\n item.trailingIcon !== undefined && item.trailingIcon !== null;\n const hasTrailingHoverIcon =\n item.trailingHoverIcon !== undefined &&\n item.trailingHoverIcon !== null;\n const showTrailing =\n !isCollapsed &&\n !showTrailingAction &&\n (hasTrailingIcon || hasTrailingHoverIcon);\n\n let itemAriaLabel: string | undefined;\n if (isCollapsed) {\n itemAriaLabel = item.label;\n }\n\n let gapState: NonNullable<\n NonNullable<RecipeVariants<typeof styles.navGapRecipe>>['state']\n > = 'expanded';\n if (isCollapsed) {\n gapState = 'collapsed';\n }\n const gapClassName = styles.navGapRecipe({ state: gapState });\n\n let paddingClassName: string | undefined;\n if (showTrailingAction) {\n paddingClassName = styles.navWithTrailingAction;\n }\n\n let labelNode: JSX.Element | null = null;\n if (!isCollapsed) {\n labelNode = <span className={styles.label}>{item.label}</span>;\n }\n\n let hoverLayer: JSX.Element | null = null;\n if (hasHoverIcon) {\n hoverLayer = (\n <span className={styles.iconVisibleOnHover}>{item.hoverIcon}</span>\n );\n }\n\n const leadingIcon = (\n <span className={styles.iconWrapper}>\n <span\n className={cx(styles.iconBaseLayer, {\n [styles.iconHiddenOnHover]: hasHoverIcon,\n })}\n >\n {item.icon}\n </span>\n {hoverLayer}\n </span>\n );\n\n let trailingIcons: JSX.Element | null = null;\n if (showTrailing) {\n let trailingBaseLayer: JSX.Element | null = null;\n if (hasTrailingIcon) {\n trailingBaseLayer = (\n <span\n className={cx(styles.iconBaseLayer, {\n [styles.iconHiddenOnHover]: hasTrailingHoverIcon,\n })}\n >\n {item.trailingIcon}\n </span>\n );\n }\n\n let trailingHoverLayer: JSX.Element | null = null;\n if (hasTrailingHoverIcon) {\n trailingHoverLayer = (\n <span className={styles.iconVisibleOnHover}>\n {item.trailingHoverIcon}\n </span>\n );\n }\n\n trailingIcons = (\n <span className={styles.trailingIconWrapper}>\n {trailingBaseLayer}\n {trailingHoverLayer}\n </span>\n );\n }\n\n const commonContent = (\n <>\n {leadingIcon}\n {labelNode}\n {trailingIcons}\n </>\n );\n\n const handleClick = (): void => {\n if (!hasChildren || isCollapsed) {\n return;\n }\n handleToggle(item.key, nextExpanded);\n };\n\n let interactiveClassName: string;\n if (hasChildren) {\n interactiveClassName = cx(\n styles.navButton,\n gapClassName,\n paddingClassName,\n );\n } else {\n let navState: NonNullable<\n NonNullable<RecipeVariants<typeof styles.navLinkRecipe>>['state']\n > = 'default';\n if (isPathActive(item.to, item.exact)) {\n navState = 'active';\n }\n interactiveClassName = cx(\n styles.navLinkRecipe({ state: navState }),\n gapClassName,\n paddingClassName,\n );\n }\n\n let itemNode: JSX.Element;\n if (hasChildren) {\n itemNode = (\n <button\n type=\"button\"\n className={interactiveClassName}\n aria-expanded={isExpanded}\n aria-controls={childSectionId}\n aria-label={itemAriaLabel}\n onClick={handleClick}\n >\n {commonContent}\n </button>\n );\n } else {\n itemNode = (\n <Link\n to={item.to}\n className={interactiveClassName}\n exact={item.exact}\n aria-label={itemAriaLabel}\n >\n {commonContent}\n </Link>\n );\n }\n\n let trailingActionNode: JSX.Element | null = null;\n if (trailingAction != null) {\n const handleTrailingClick = (\n event: MouseEvent<HTMLButtonElement>,\n ): void => {\n event.preventDefault();\n event.stopPropagation();\n trailingAction.onClick();\n };\n\n const trailingHoverIcon = trailingAction.hoverIcon;\n const showTrailingHoverIcon =\n trailingHoverIcon !== undefined && trailingHoverIcon !== null;\n let trailingHoverContent: JSX.Element | null = null;\n if (showTrailingHoverIcon) {\n trailingHoverContent = (\n <span className={styles.trailingActionIconVisible}>\n {trailingHoverIcon}\n </span>\n );\n }\n\n trailingActionNode = (\n <button\n type=\"button\"\n aria-label={trailingAction.label}\n onClick={handleTrailingClick}\n className={styles.trailingActionButton}\n >\n <span className={styles.trailingActionIconWrapper}>\n <span className={styles.trailingActionIconHidden}>\n {trailingAction.icon}\n </span>\n {trailingHoverContent}\n </span>\n </button>\n );\n }\n\n let childList: JSX.Element | null = null;\n if (shouldRenderChildren && childSectionId != null) {\n childList = (\n <CollapsibleSection id={childSectionId} isExpanded={isExpanded}>\n {childItems.map((child) => {\n let leading: JSX.Element | null = null;\n if (child.icon != null) {\n leading = (\n <span className={styles.childIcon}>{child.icon}</span>\n );\n }\n\n let childState: NonNullable<\n NonNullable<\n RecipeVariants<typeof styles.childLinkRecipe>\n >['state']\n > = 'default';\n if (isPathActive(child.to)) {\n childState = 'active';\n }\n\n return (\n <div key={child.key} className={styles.collapsibleItem}>\n <Link\n to={child.to}\n className={styles.childLinkRecipe({ state: childState })}\n aria-label={child.label}\n >\n {leading}\n <span className={styles.childLabel}>{child.label}</span>\n </Link>\n </div>\n );\n })}\n </CollapsibleSection>\n );\n }\n\n return (\n <div key={item.key}>\n <div className={styles.itemWrapper}>\n {itemNode}\n {trailingActionNode}\n </div>\n {childList}\n </div>\n );\n })}\n </SidebarContainer>\n );\n};\n\nexport { NavigationSidebar };\nexport type {\n NavigationSidebarProps,\n SidebarChildItem,\n SidebarItem,\n SidebarItemTrailingAction,\n};\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const mainStyle = sprinkles({\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 'screen',\n width: 'full',\n backgroundColor: 'brandSecondaryOrange-10',\n});\n\nexport const formCardStyle = sprinkles({\n width: 'full',\n maxWidth: 'lg',\n borderRadius: 'xl',\n overflow: 'hidden',\n boxShadow: 'authCardGlow',\n});\n\nexport const headerStyle = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 3,\n padding: 8,\n textAlign: 'center',\n backgroundImage: 'brandBackgroundGradient',\n});\n\nexport const titleStyle = sprinkles({\n fontSize: '3xl',\n fontWeight: 'bold',\n lineHeight: 1.2,\n color: 'white',\n});\n\nexport const subtitleStyle = sprinkles({\n fontSize: 'sm',\n color: 'white',\n fontWeight: 'normal',\n opacity: 70,\n});\n\nexport const brandSubtitle = sprinkles({\n fontSize: 'base',\n fontWeight: 'normal',\n color: 'brandDarkGray',\n});\n\nexport const link = sprinkles({\n color: 'primary',\n textDecoration: 'none',\n fontWeight: 'medium',\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n});\n","import React, { type JSX } from 'react';\nimport {\n mainStyle,\n formCardStyle,\n headerStyle,\n titleStyle,\n subtitleStyle,\n} from './authLayout.css.js';\n\ntype Props = {\n title: string;\n subtitle?: string;\n children: React.ReactNode;\n};\n\nexport const AuthLayout = (props: Props): JSX.Element => {\n const { title: titleText, subtitle: subtitleText, children } = props;\n\n let subtitleElement: JSX.Element | null = null;\n if (subtitleText != null && subtitleText !== '') {\n subtitleElement = <p className={subtitleStyle}>{subtitleText}</p>;\n }\n\n return (\n <div className={mainStyle}>\n <div className={formCardStyle}>\n <div className={headerStyle}>\n <h1 className={titleStyle}>{titleText}</h1>\n {subtitleElement}\n </div>\n {children}\n </div>\n </div>\n );\n};\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const container = sprinkles({\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: 4,\n flexWrap: 'wrap',\n});\n\nexport const left = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n minWidth: 0,\n flex: 1,\n});\n\nexport const headerRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 3,\n flexWrap: 'wrap',\n minWidth: 0,\n});\n\nexport const leftActions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n flexShrink: 0,\n});\n\nexport const titleRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n minWidth: 0,\n});\n\nexport const title = sprinkles({\n fontSize: '2xl',\n fontWeight: 'semibold',\n color: 'text',\n margin: 0,\n});\n\nexport const subtitle = sprinkles({\n margin: 0,\n fontSize: 'base',\n color: 'textSecondary',\n});\n\nexport const metaRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const actions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '@plumile/ui';\n\nimport * as styles from './backofficePageHeader.css.js';\n\nexport type BackofficePageHeaderProps = {\n title: string;\n subtitle?: ReactNode;\n actions?: ReactNode;\n meta?: ReactNode;\n leftActions?: ReactNode;\n className?: string;\n};\n\nexport const BackofficePageHeader = ({\n title,\n subtitle,\n actions,\n meta,\n leftActions,\n className,\n}: BackofficePageHeaderProps): JSX.Element => {\n return (\n <div className={cx(styles.container, className)}>\n <div className={styles.left}>\n <div className={styles.headerRow}>\n {leftActions != null && (\n <div className={styles.leftActions}>{leftActions}</div>\n )}\n <div className={styles.titleRow}>\n <h1 className={styles.title}>{title}</h1>\n {meta != null && <div className={styles.metaRow}>{meta}</div>}\n </div>\n </div>\n {subtitle != null &&\n (typeof subtitle !== 'string' || subtitle.trim() !== '') && (\n <p className={styles.subtitle}>{subtitle}</p>\n )}\n </div>\n {actions != null && <div className={styles.actions}>{actions}</div>}\n </div>\n );\n};\n\nexport default BackofficePageHeader;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 6,\n alignItems: 'flex-start',\n width: 'full',\n alignSelf: 'stretch',\n paddingTop: 5,\n paddingX: 5,\n flex: 1,\n minHeight: 0,\n});\n\nexport const actions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const secondaryActions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const actionItem = sprinkles({\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const primaryAction = sprinkles({\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const content = sprinkles({\n width: 'full',\n display: 'flex',\n alignItems: 'flex-start',\n flexDirection: 'column',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { BackofficePageHeader } from '../../../backoffice/molecules/backoffice_page_header/BackofficePageHeader.js';\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './pageContainer.css.js';\n\nexport type PageContainerProps = {\n title: string;\n subtitle?: ReactNode;\n primaryAction?: ReactNode;\n secondaryActions?: readonly ReactNode[];\n leftAction?: ReactNode;\n children: ReactNode;\n className?: string;\n contentClassName?: string;\n};\n\nexport const PageContainer = ({\n title,\n subtitle,\n primaryAction,\n secondaryActions,\n leftAction,\n children,\n className,\n contentClassName,\n}: PageContainerProps): JSX.Element => {\n const secondary = secondaryActions ?? [];\n const hasPrimaryAction = primaryAction != null;\n const hasSecondaryActions = secondary.length > 0;\n\n let actions: ReactNode | null = null;\n if (hasPrimaryAction || hasSecondaryActions) {\n actions = (\n <div className={styles.actions}>\n {hasSecondaryActions && (\n <div className={styles.secondaryActions}>\n {secondary.map((action, index) => {\n return (\n <div key={index} className={styles.actionItem}>\n {action}\n </div>\n );\n })}\n </div>\n )}\n {hasPrimaryAction && (\n <div className={styles.primaryAction}>{primaryAction}</div>\n )}\n </div>\n );\n }\n\n return (\n <div className={cx(styles.container, className)}>\n <BackofficePageHeader\n title={title}\n subtitle={subtitle}\n actions={actions}\n leftActions={leftAction}\n />\n <div className={cx(styles.content, contentClassName)}>{children}</div>\n </div>\n );\n};\n\nexport default PageContainer;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 6,\n paddingLeft: 4,\n paddingTop: 4,\n});\n\nexport const headerSupplement = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n});\n\nexport const actions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const secondaryActions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const actionItem = sprinkles({\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const primaryAction = sprinkles({\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const content = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 6,\n});\n\nexport const contentSection = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n});\n","import { type ComponentPropsWithoutRef, type JSX, type ReactNode } from 'react';\n\nimport { BackofficePageHeader } from '../../../backoffice/molecules/backoffice_page_header/BackofficePageHeader.js';\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './detailPage.css.js';\n\nexport type DetailPageProps = {\n title: string;\n subtitle?: ReactNode;\n primaryAction?: ReactNode;\n secondaryActions?: readonly ReactNode[];\n headerSupplement?: ReactNode;\n children: ReactNode;\n className?: string;\n contentClassName?: string;\n};\n\nexport type DetailPageContentProps = ComponentPropsWithoutRef<'div'> & {\n children: ReactNode;\n withBaseStyles?: boolean;\n};\n\nconst renderActions = (\n primaryAction?: ReactNode,\n secondaryActions?: readonly ReactNode[],\n): ReactNode | null => {\n const secondaryList = secondaryActions ?? [];\n const hasSecondary = secondaryList.length > 0;\n const hasPrimary = primaryAction != null;\n\n if (!hasPrimary && !hasSecondary) {\n return null;\n }\n\n return (\n <div className={styles.actions}>\n {hasSecondary && (\n <div className={styles.secondaryActions}>\n {secondaryList.map((action, index) => {\n return (\n <div key={index} className={styles.actionItem}>\n {action}\n </div>\n );\n })}\n </div>\n )}\n {hasPrimary && (\n <div className={styles.primaryAction}>{primaryAction}</div>\n )}\n </div>\n );\n};\n\nexport const DetailPage = ({\n title,\n subtitle,\n primaryAction,\n secondaryActions,\n headerSupplement,\n children,\n className,\n contentClassName,\n}: DetailPageProps): JSX.Element => {\n return (\n <div className={cx(styles.container, className)}>\n <BackofficePageHeader\n title={title}\n subtitle={subtitle}\n actions={renderActions(primaryAction, secondaryActions)}\n />\n {headerSupplement != null && (\n <div className={styles.headerSupplement}>{headerSupplement}</div>\n )}\n <div className={cx(styles.content, contentClassName)}>{children}</div>\n </div>\n );\n};\n\nexport const DetailPageContent = ({\n children,\n className,\n withBaseStyles = true,\n ...rest\n}: DetailPageContentProps): JSX.Element => {\n let contentClassName: string | undefined;\n if (withBaseStyles) {\n contentClassName = cx(styles.contentSection, className);\n } else if (className != null) {\n contentClassName = className;\n }\n\n return (\n <div {...rest} className={contentClassName}>\n {children}\n </div>\n );\n};\n\nexport default DetailPage;\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const chartContainer = sprinkles({\n width: 'full',\n height: {\n base: 340,\n md: 260,\n },\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'borderLight',\n borderRadius: 'lg',\n backgroundColor: 'surface',\n paddingY: 2,\n paddingX: 2,\n});\n\nexport const tooltip = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1.5,\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'border',\n borderRadius: 'md',\n backgroundColor: 'surfaceElevated',\n paddingY: 2,\n paddingX: 2.5,\n boxShadow: 'lg',\n});\n\nexport const tooltipDate = sprinkles({\n fontSize: 'xs',\n color: 'textMuted',\n fontWeight: 'medium',\n margin: 0,\n});\n\nexport const tooltipRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 3,\n fontSize: 'sm',\n color: 'text',\n});\n\nexport const tooltipRowLabel = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 1.5,\n});\n\nexport const tooltipSwatch = sprinkles({\n width: 2,\n height: 2,\n borderRadius: 'full',\n});\n","import { ResponsiveLine, type SliceTooltipProps } from '@nivo/line';\nimport type { JSX } from 'react';\n\nimport * as styles from './timeSeriesLineChart.css.js';\nimport { vars } from '../../theme/themeContract.js';\n\nexport type TimeSeriesLineChartPoint = {\n x: string;\n y: number;\n};\n\nexport type TimeSeriesLineChartSerie<Category extends string> = {\n id: Category;\n data: readonly TimeSeriesLineChartPoint[];\n};\n\ntype SlicePointPayload<Category extends string> = {\n seriesId: Category;\n data: {\n y: number;\n };\n color: string;\n};\n\nexport type TimeSeriesLineChartProps<Category extends string> = {\n series: readonly TimeSeriesLineChartSerie<Category>[];\n categoryOrder: readonly Category[];\n categoryColorById: Readonly<Record<Category, string>>;\n categoryLabel: (category: Category) => string;\n formatValue: (value: number) => string;\n ariaLabel: string;\n};\n\nconst MAX_X_TICKS = 6;\n\n/**\n * Limits the number of visible day ticks while always keeping the last point.\n */\nfunction getVisibleDayTicks<Category extends string>(\n series: readonly TimeSeriesLineChartSerie<Category>[],\n): readonly string[] {\n const firstSerie = series[0];\n if (firstSerie == null || firstSerie.data.length <= MAX_X_TICKS) {\n if (firstSerie == null) {\n return [];\n }\n\n return firstSerie.data.map((point) => {\n return point.x;\n });\n }\n\n const step = Math.ceil(firstSerie.data.length / MAX_X_TICKS);\n const visibleTicks = firstSerie.data\n .filter((_, index) => {\n return index % step === 0;\n })\n .map((point) => {\n return point.x;\n });\n\n const lastPoint = firstSerie.data.at(-1);\n if (lastPoint != null && visibleTicks.at(-1) !== lastPoint.x) {\n visibleTicks.push(lastPoint.x);\n }\n\n return visibleTicks;\n}\n\n/**\n * Formats a `YYYY-MM-DD` key into a short month/day label for the x-axis.\n */\nfunction formatDayTick(dayKey: string): string {\n const parsed = new Date(`${dayKey}T00:00:00Z`);\n return parsed.toLocaleDateString(undefined, {\n month: 'short',\n day: '2-digit',\n });\n}\n\nexport const TimeSeriesLineChart = <Category extends string>(\n props: TimeSeriesLineChartProps<Category>,\n): JSX.Element => {\n const {\n ariaLabel,\n categoryColorById,\n categoryLabel,\n categoryOrder,\n formatValue,\n series,\n } = props;\n\n const visibleTicks = getVisibleDayTicks(series);\n const categoryOrderString = categoryOrder as readonly string[];\n const isCategory = (value: string): value is Category => {\n return categoryOrderString.includes(value);\n };\n\n const legends = [\n {\n anchor: 'bottom' as const,\n direction: 'row' as const,\n translateY: 56,\n itemWidth: 90,\n itemHeight: 16,\n itemsSpacing: 8,\n symbolSize: 10,\n symbolShape: 'circle' as const,\n itemTextColor: vars.colors.textSecondary,\n data: categoryOrder.map((category) => {\n return {\n id: category,\n label: categoryLabel(category),\n color: categoryColorById[category],\n };\n }),\n },\n ];\n\n const colorById = (serie: { id: string | number }): string => {\n if (typeof serie.id !== 'string' || !isCategory(serie.id)) {\n return vars.colors.primary;\n }\n\n return categoryColorById[serie.id];\n };\n\n const sliceTooltip = ({\n slice,\n }: SliceTooltipProps<TimeSeriesLineChartSerie<Category>>): JSX.Element => {\n const dayKey = String(slice.id);\n const fallbackCategory = categoryOrder[0] ?? null;\n const points = [...slice.points]\n .map((point): SlicePointPayload<Category> | null => {\n let credits = 0;\n if (typeof point.data.y === 'number') {\n credits = point.data.y;\n }\n\n let seriesId = fallbackCategory;\n if (typeof point.seriesId === 'string' && isCategory(point.seriesId)) {\n seriesId = point.seriesId;\n }\n if (seriesId == null) {\n return null;\n }\n\n return {\n seriesId,\n data: { y: credits },\n color: point.seriesColor,\n };\n })\n .filter((point): point is SlicePointPayload<Category> => {\n return point != null;\n })\n .sort((left, right) => {\n const leftIndex = categoryOrder.indexOf(left.seriesId);\n const rightIndex = categoryOrder.indexOf(right.seriesId);\n\n return leftIndex - rightIndex;\n });\n\n return (\n <div className={styles.tooltip}>\n <p className={styles.tooltipDate}>{formatDayTick(dayKey)}</p>\n {points.map((point) => {\n return (\n <div\n key={`${dayKey}-${point.seriesId}`}\n className={styles.tooltipRow}\n >\n <span className={styles.tooltipRowLabel}>\n <span\n className={styles.tooltipSwatch}\n style={{ backgroundColor: point.color }}\n aria-hidden\n />\n <span>{categoryLabel(point.seriesId)}</span>\n </span>\n <strong>{formatValue(point.data.y)}</strong>\n </div>\n );\n })}\n </div>\n );\n };\n\n return (\n <div className={styles.chartContainer}>\n <ResponsiveLine\n data={series}\n margin={{ top: 14, right: 16, bottom: 74, left: 52 }}\n colors={colorById}\n xScale={{ type: 'point' }}\n yScale={{ type: 'linear', min: 0, max: 'auto' }}\n curve=\"monotoneX\"\n lineWidth={2.5}\n pointSize={4}\n pointBorderWidth={2}\n pointBorderColor={{ from: 'seriesColor', modifiers: [['darker', 0.2]] }}\n enableArea\n areaOpacity={0.1}\n enableGridX={false}\n enableGridY\n axisTop={null}\n axisRight={null}\n axisBottom={{\n tickValues: visibleTicks,\n format: (value) => {\n return formatDayTick(String(value));\n },\n tickSize: 0,\n tickPadding: 10,\n }}\n axisLeft={{\n tickSize: 0,\n tickPadding: 8,\n tickValues: 5,\n format: (value) => {\n if (typeof value !== 'number') {\n return '';\n }\n\n return new Intl.NumberFormat('en-US', {\n notation: 'compact',\n maximumFractionDigits: 1,\n }).format(value);\n },\n }}\n enablePoints\n useMesh\n legends={legends}\n theme={{\n grid: {\n line: {\n stroke: vars.colors.borderLight,\n },\n },\n axis: {\n ticks: {\n text: {\n fill: vars.colors.textMuted,\n fontSize: 12,\n },\n },\n },\n crosshair: {\n line: {\n stroke: vars.colors.border,\n strokeWidth: 1,\n strokeDasharray: '4 4',\n },\n },\n tooltip: {\n container: {\n background: 'transparent',\n boxShadow: 'none',\n padding: 0,\n },\n },\n }}\n sliceTooltip={sliceTooltip}\n enableSlices=\"x\"\n role=\"img\"\n ariaLabel={ariaLabel}\n />\n </div>\n );\n};\n\nexport default TimeSeriesLineChart;\n","import {\n createVar,\n fallbackVar,\n style,\n type StyleRule,\n} from '@vanilla-extract/css';\nimport { recipe } from '@vanilla-extract/recipes';\n\nimport { vars } from '../../theme/themeContract.js';\n\nimport {\n DATA_TABLE_BREAKPOINT_ENTRIES,\n type DataTableBreakpoint,\n} from './tableBreakpoints.js';\nimport { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const container = recipe({\n base: sprinkles({\n display: 'flex',\n flexDirection: 'column',\n width: 'full',\n containerType: 'inline-size',\n }),\n variants: {\n kind: {\n default: sprinkles({\n backgroundColor: 'white',\n borderColor: 'border',\n borderRadius: 'lg',\n borderStyle: 'solid',\n borderWidth: 'default',\n overflow: 'hidden',\n }),\n brandTable: sprinkles({\n backgroundColor: 'transparent',\n borderRadius: 'none',\n borderStyle: 'none',\n borderWidth: 0,\n overflow: 'visible',\n }),\n },\n },\n defaultVariants: {\n kind: 'default',\n },\n});\n\nexport const header = recipe({\n variants: {\n kind: {\n default: sprinkles({\n borderWidth: 0,\n borderStyle: 'solid',\n borderBottomWidth: 'default',\n borderBottomColor: 'border',\n backgroundColor: 'surfaceSecondary',\n }),\n brandTable: sprinkles({\n backgroundColor: 'transparent',\n borderWidth: 0,\n borderStyle: 'solid',\n borderBottomWidth: 'default',\n borderBottomColor: 'brandSecondaryOrange-20',\n }),\n },\n },\n defaultVariants: {\n kind: 'default',\n },\n});\n\nexport const headerRow = sprinkles({\n display: 'grid',\n width: 'full',\n alignItems: 'stretch',\n});\n\nexport const tableCellPaddingVar = createVar();\nexport const tableCellFontSizeVar = createVar();\nexport const tableEmptyRowPaddingVar = createVar();\n\nexport const headerCell = recipe({\n base: sprinkles({\n alignItems: 'center',\n display: 'flex',\n flexShrink: 0,\n gap: 2,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }),\n variants: {\n kind: {\n default: style([\n sprinkles({\n color: 'text',\n fontWeight: 'semibold',\n }),\n {\n padding: fallbackVar(\n tableCellPaddingVar,\n `${vars.spacing[3]} ${vars.spacing[4]}`,\n ),\n fontSize: fallbackVar(tableCellFontSizeVar, vars.fontSize.sm),\n borderRight: `1px solid ${vars.colors.border}`,\n selectors: {\n '&:last-child': {\n borderRight: 'none',\n },\n },\n },\n ]),\n brandTable: sprinkles({\n color: 'black-300',\n fontWeight: 'bold',\n fontSize: 'xs',\n letterSpacing: 'caps',\n textTransform: 'uppercase',\n paddingY: 4,\n paddingX: 0,\n borderRightWidth: 0,\n }),\n },\n },\n defaultVariants: {\n kind: 'default',\n },\n});\n\nexport const body = recipe({\n base: sprinkles({\n display: 'flex',\n flexDirection: 'column',\n }),\n variants: {\n kind: {\n default: {},\n brandTable: sprinkles({\n backgroundColor: 'transparent',\n }),\n },\n },\n defaultVariants: {\n kind: 'default',\n },\n});\n\nexport const row = recipe({\n base: sprinkles({\n alignItems: 'stretch',\n borderStyle: 'solid',\n borderWidth: 0,\n display: 'grid',\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n }),\n variants: {\n kind: {\n default: style([\n sprinkles({\n backgroundColor: 'surface',\n borderBottomColor: 'borderLight',\n borderBottomWidth: 'default',\n }),\n {\n selectors: {\n '&:last-child': {\n borderBottomWidth: 0,\n },\n '&:hover': {\n backgroundColor: vars.colors.surfaceSecondary,\n },\n },\n },\n ]),\n brandTable: style([\n sprinkles({\n backgroundColor: 'transparent',\n borderBottomColor: 'brandSecondaryOrange-20',\n borderBottomWidth: 'default',\n }),\n {\n selectors: {\n '&:last-child': {\n borderBottomWidth: 0,\n },\n '&:hover': {\n backgroundColor: 'transparent',\n },\n },\n },\n ]),\n },\n },\n defaultVariants: {\n kind: 'default',\n },\n});\n\nexport const rowEven = recipe({\n variants: {\n kind: {\n default: sprinkles({\n backgroundColor: 'surfaceMuted',\n }),\n brandTable: sprinkles({\n backgroundColor: 'transparent',\n }),\n },\n },\n defaultVariants: {\n kind: 'default',\n },\n});\n\nexport const rowOdd = recipe({\n variants: {\n kind: {\n default: sprinkles({\n backgroundColor: 'surface',\n }),\n brandTable: sprinkles({\n backgroundColor: 'transparent',\n }),\n },\n },\n defaultVariants: {\n kind: 'default',\n },\n});\n\nexport const cell = recipe({\n base: sprinkles({\n alignItems: 'center',\n display: 'flex',\n gap: 2,\n minWidth: 0,\n overflow: 'hidden',\n }),\n variants: {\n kind: {\n default: style([\n sprinkles({\n color: 'textSecondary',\n }),\n {\n padding: fallbackVar(\n tableCellPaddingVar,\n `${vars.spacing[3]} ${vars.spacing[4]}`,\n ),\n fontSize: fallbackVar(tableCellFontSizeVar, vars.fontSize.sm),\n borderRight: `1px solid ${vars.colors.borderLight}`,\n selectors: {\n '&:last-child': {\n borderRight: 'none',\n },\n },\n },\n ]),\n brandTable: sprinkles({\n color: 'text',\n fontWeight: 'semibold',\n fontSize: 'sm',\n paddingY: 4,\n paddingX: 0,\n borderRightWidth: 0,\n }),\n },\n },\n defaultVariants: {\n kind: 'default',\n },\n});\n\nexport const primaryCell = sprinkles({\n fontWeight: 'semibold',\n color: 'text',\n});\n\nexport const primaryHeaderCell = sprinkles({\n color: 'text',\n});\n\nexport const emptyRow = style({\n padding: fallbackVar(\n tableEmptyRowPaddingVar,\n `${vars.spacing[6]} ${vars.spacing[4]}`,\n ),\n});\n\nexport const emptyCell = sprinkles({\n fontSize: 'base',\n color: 'textSecondary',\n textAlign: 'center',\n});\n\nconst hideBelowMap: Record<DataTableBreakpoint, StyleRule> = {} as Record<\n DataTableBreakpoint,\n StyleRule\n>;\n\nDATA_TABLE_BREAKPOINT_ENTRIES.forEach(([breakpoint, width]) => {\n hideBelowMap[breakpoint] = {\n '@container': {\n [`(max-width: ${width - 0.5}px)`]: {\n visibility: 'hidden',\n opacity: 0,\n pointerEvents: 'none',\n paddingInline: 0,\n paddingBlock: 0,\n borderRight: 'none',\n overflow: 'hidden',\n },\n },\n };\n});\n\nexport const hideBelowRecipe = recipe({\n variants: {\n minVisibleAt: hideBelowMap,\n },\n});\n","import { type CSSProperties, type JSX } from 'react';\n\nimport * as styles from './DataTable.css.js';\nimport type { DataTableBreakpoint } from './tableBreakpoints.js';\nimport { cx } from '../../theme/tools.js';\nimport { useUiTranslation } from '../../i18n/useUiTranslation.js';\nimport type { SlotClasses } from '../../styles/slots.js';\n\nexport type DataTableColumn<Row> = {\n id: string;\n header: JSX.Element | string;\n cell: (row: Row) => JSX.Element | string | null;\n minVisibleAt?: DataTableBreakpoint;\n className?: string;\n isPrimary?: boolean;\n};\n\nexport type GetRowId<Row> = (row: Row, index: number) => string;\n\nexport type DataTableKind = NonNullable<\n Parameters<typeof styles.container>[0]\n>['kind'];\n\ntype DataTableSlot =\n | 'container'\n | 'header'\n | 'headerRow'\n | 'headerCell'\n | 'primaryHeaderCell'\n | 'body'\n | 'row'\n | 'rowEven'\n | 'rowOdd'\n | 'cell'\n | 'primaryCell'\n | 'emptyRow'\n | 'emptyCell';\n\nexport type DataTableProps<Row> = {\n columns: readonly DataTableColumn<Row>[];\n rows: readonly Row[];\n getRowId: GetRowId<Row>;\n emptyState?: JSX.Element;\n className?: string;\n headerClassName?: string;\n bodyClassName?: string;\n rowClassName?: (row: Row, index: number) => string | null | undefined;\n gridTemplateClassName?: string;\n gridTemplateColumns?: string;\n kind?: DataTableKind;\n classes?: SlotClasses<DataTableSlot>;\n};\n\nconst DEFAULT_TEMPLATE_CELL = 'minmax(0, 1fr)';\n\nconst getVisibilityClass = (minVisibleAt?: DataTableBreakpoint) => {\n if (minVisibleAt == null) {\n return null;\n }\n\n return styles.hideBelowRecipe({ minVisibleAt });\n};\n\nconst buildInlineTemplate = (\n columnCount: number,\n gridTemplateColumns?: string,\n): CSSProperties => {\n if (typeof gridTemplateColumns === 'string' && gridTemplateColumns !== '') {\n return { gridTemplateColumns };\n }\n return {\n gridTemplateColumns: `repeat(${columnCount}, ${DEFAULT_TEMPLATE_CELL})`,\n };\n};\n\n/**\n * Generic responsive data table component.\n */\nexport const DataTable = <Row,>({\n columns,\n rows,\n getRowId,\n emptyState,\n className,\n headerClassName,\n bodyClassName,\n rowClassName,\n gridTemplateClassName,\n gridTemplateColumns,\n kind,\n classes,\n}: DataTableProps<Row>): JSX.Element => {\n const { t } = useUiTranslation();\n const resolvedKind: DataTableKind = kind ?? 'default';\n const defaultEmptyState = (\n <div className={cx(styles.emptyCell, classes?.emptyCell)}>\n {t('common.table.empty')}\n </div>\n ) as JSX.Element;\n const resolvedEmptyState = emptyState ?? defaultEmptyState;\n const showEmpty = rows.length === 0;\n\n let inlineTemplateStyle: CSSProperties | undefined;\n if (gridTemplateClassName == null) {\n inlineTemplateStyle = buildInlineTemplate(\n columns.length,\n gridTemplateColumns,\n );\n }\n\n const sharedRowClasses: string[] = [];\n if (gridTemplateClassName != null) {\n sharedRowClasses.push(gridTemplateClassName);\n }\n\n let rowsContent: JSX.Element;\n if (showEmpty) {\n rowsContent = (\n <div className={cx(styles.emptyRow, classes?.emptyRow)} role=\"row\">\n <div role=\"cell\">{resolvedEmptyState}</div>\n </div>\n );\n } else {\n rowsContent = (\n <>\n {rows.map((row, index) => {\n const rowId = getRowId(row, index);\n const rowClasses = [styles.row({ kind: resolvedKind }), classes?.row];\n if (index % 2 === 0) {\n rowClasses.push(\n styles.rowEven({ kind: resolvedKind }),\n classes?.rowEven,\n );\n } else {\n rowClasses.push(\n styles.rowOdd({ kind: resolvedKind }),\n classes?.rowOdd,\n );\n }\n for (const sharedClass of sharedRowClasses) {\n rowClasses.push(sharedClass);\n }\n\n if (rowClassName != null) {\n const customClass = rowClassName(row, index);\n if (customClass != null) {\n rowClasses.push(customClass);\n }\n }\n\n return (\n <div\n key={rowId}\n role=\"row\"\n className={cx(...rowClasses)}\n style={inlineTemplateStyle}\n >\n {columns.map((column) => {\n const cellClasses = [\n styles.cell({ kind: resolvedKind }),\n classes?.cell,\n ];\n const visibilityClass = getVisibilityClass(column.minVisibleAt);\n\n if (visibilityClass != null) {\n cellClasses.push(visibilityClass);\n }\n\n if (column.className != null) {\n cellClasses.push(column.className);\n }\n if (column.isPrimary) {\n cellClasses.push(styles.primaryCell, classes?.primaryCell);\n }\n\n const content = column.cell(row);\n\n return (\n <div\n key={column.id}\n role=\"cell\"\n className={cx(...cellClasses)}\n >\n {content}\n </div>\n );\n })}\n </div>\n );\n })}\n </>\n );\n }\n\n return (\n <div\n className={cx(\n styles.container({ kind: resolvedKind }),\n classes?.container,\n className,\n )}\n role=\"table\"\n >\n <div\n className={cx(\n styles.header({ kind: resolvedKind }),\n classes?.header,\n headerClassName,\n )}\n role=\"rowgroup\"\n >\n <div\n className={cx(\n styles.headerRow,\n classes?.headerRow,\n ...sharedRowClasses,\n )}\n role=\"row\"\n style={inlineTemplateStyle}\n >\n {columns.map((column) => {\n const headerClasses = [\n styles.headerCell({ kind: resolvedKind }),\n classes?.headerCell,\n ];\n const visibilityClass = getVisibilityClass(column.minVisibleAt);\n if (visibilityClass != null) {\n headerClasses.push(visibilityClass);\n }\n\n if (column.className != null) {\n headerClasses.push(column.className);\n }\n if (column.isPrimary) {\n headerClasses.push(\n styles.primaryHeaderCell,\n classes?.primaryHeaderCell,\n );\n }\n\n return (\n <div\n key={column.id}\n role=\"columnheader\"\n className={cx(...headerClasses)}\n >\n {column.header}\n </div>\n );\n })}\n </div>\n </div>\n\n <div\n className={cx(\n styles.body({ kind: resolvedKind }),\n classes?.body,\n bodyClassName,\n )}\n role=\"rowgroup\"\n >\n {rowsContent}\n </div>\n </div>\n );\n};\n","import { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const base = sprinkles({\n width: 'full',\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n color: 'text',\n});\n\nexport const alignRecipe = recipe({\n variants: {\n align: {\n start: { justifyContent: 'flex-start', textAlign: 'left' },\n center: { justifyContent: 'center', textAlign: 'center' },\n end: { justifyContent: 'flex-end', textAlign: 'right' },\n },\n },\n defaultVariants: {\n align: 'start',\n },\n});\n\nexport type AlignRecipeVariants = RecipeVariants<typeof alignRecipe>;\n\nexport const text = sprinkles({\n color: 'text',\n});\n\nexport const number = sprinkles({\n color: 'text',\n whiteSpace: 'nowrap',\n});\n\nexport const date = sprinkles({\n color: 'text',\n whiteSpace: 'nowrap',\n});\n\nexport const muted = sprinkles({\n color: 'textSecondary',\n fontSize: 'xs',\n});\n\nexport const ellipsis = sprinkles({\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n\nexport const summary = sprinkles({\n whiteSpace: 'pre-wrap',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport * as styles from './TableCell.css.js';\nimport { cx } from '../../theme/tools.js';\nimport type { RecipeVariants } from '@vanilla-extract/recipes';\n\ntype Alignment = NonNullable<\n NonNullable<RecipeVariants<typeof styles.alignRecipe>>['align']\n>;\n\nexport type TableCellBaseProps = {\n children: ReactNode;\n className?: string;\n align?: Alignment;\n ellipsis?: boolean;\n};\n\nexport const TableCellBase = ({\n children,\n className,\n align = 'start',\n ellipsis = false,\n}: TableCellBaseProps): JSX.Element => {\n const classNames = [styles.base, styles.alignRecipe({ align }), className];\n\n if (ellipsis) {\n classNames.push(styles.ellipsis);\n }\n\n return <div className={cx(...classNames)}>{children}</div>;\n};\n","import { type JSX, type ReactNode, useMemo } from 'react';\n\nimport { Badge } from '../../atomic/atoms/badge/Badge.js';\nimport { FormattedDate } from '../../atomic/atoms/formatted-date/FormattedDate.js';\n\nimport * as styles from './TableCell.css.js';\nimport { TableCellBase, type TableCellBaseProps } from './TableCellBase.js';\nimport { cx } from '../../theme/tools.js';\n\ntype BadgeTone =\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'danger'\n | 'accent';\n\ntype TextCellProps = {\n value?: string | null | undefined;\n fallback?: string;\n children?: ReactNode;\n ellipsis?: boolean;\n className?: string;\n};\n\ntype NumberCellProps = {\n value: number | null | undefined;\n fallback?: string;\n locale?: string;\n formatOptions?: Intl.NumberFormatOptions;\n};\n\ntype StatusCellProps = {\n label: string;\n tone: BadgeTone;\n isLoading?: boolean;\n};\n\ntype DateCellProps = {\n value: string | null | undefined;\n fallback?: string;\n locale?: string;\n options?: Intl.DateTimeFormatOptions;\n};\n\ntype BadgeCellProps = {\n label: string;\n tone: BadgeTone;\n};\n\ntype ActionsCellProps = TableCellBaseProps;\n\nconst FALLBACK_REFERENCE = '—';\nconst DEFAULT_TEXT_FALLBACK = FALLBACK_REFERENCE;\n\nconst DefaultNumberFormat: Intl.NumberFormatOptions = {\n maximumFractionDigits: 2,\n};\n\nconst DefaultDateOptions: Intl.DateTimeFormatOptions = {\n dateStyle: 'medium',\n timeStyle: 'short',\n};\n\nconst Text = ({\n value,\n fallback = DEFAULT_TEXT_FALLBACK,\n children,\n ellipsis = false,\n className,\n}: TextCellProps): JSX.Element => {\n let content: ReactNode = children ?? value;\n\n if (content == null) {\n content = fallback;\n } else if (typeof content === 'string') {\n const trimmed = content.trim();\n if (trimmed.length === 0) {\n content = fallback;\n } else {\n content = trimmed;\n }\n }\n\n return (\n <TableCellBase ellipsis={ellipsis} className={cx(styles.text, className)}>\n {content}\n </TableCellBase>\n );\n};\n\nconst NumberCell = ({\n value,\n fallback = DEFAULT_TEXT_FALLBACK,\n locale,\n formatOptions = DefaultNumberFormat,\n}: NumberCellProps): JSX.Element => {\n const formatted = useMemo(() => {\n if (value == null || Number.isNaN(Number(value))) {\n return fallback;\n }\n\n try {\n return new Intl.NumberFormat(locale, formatOptions).format(value);\n } catch {\n return String(value);\n }\n }, [value, fallback, locale, formatOptions]);\n\n return (\n <TableCellBase align=\"end\" className={styles.number}>\n {formatted}\n </TableCellBase>\n );\n};\n\nconst Status = ({\n label,\n tone,\n isLoading = false,\n}: StatusCellProps): JSX.Element => {\n return (\n <TableCellBase>\n <Badge tone={tone} loading={isLoading}>\n {label}\n </Badge>\n </TableCellBase>\n );\n};\n\nconst DateCell = ({\n value,\n fallback = FALLBACK_REFERENCE,\n locale,\n options = DefaultDateOptions,\n}: DateCellProps): JSX.Element => {\n return (\n <TableCellBase className={styles.date}>\n <FormattedDate\n value={value}\n fallback={fallback}\n locale={locale}\n options={options}\n />\n </TableCellBase>\n );\n};\n\nconst BadgeCell = ({ label, tone }: BadgeCellProps): JSX.Element => {\n return (\n <TableCellBase>\n <Badge tone={tone}>{label}</Badge>\n </TableCellBase>\n );\n};\n\nconst Actions = ({ children, className }: ActionsCellProps): JSX.Element => {\n return (\n <TableCellBase align=\"end\" className={className}>\n {children}\n </TableCellBase>\n );\n};\n\nconst Muted = ({ children }: { children: ReactNode }): JSX.Element => {\n return <span className={styles.muted}>{children}</span>;\n};\n\nexport const TableCell = {\n Base: TableCellBase,\n Text,\n Number: NumberCell,\n Status,\n Date: DateCell,\n Badge: BadgeCell,\n Actions,\n Muted,\n};\n\nexport type { TextCellProps, NumberCellProps, StatusCellProps, DateCellProps };\n","import { type JSX, type ReactNode } from 'react';\n\nimport { Card } from '../../atomic/molecules/card/Card.js';\n\nexport type PanelShellProps = {\n title?: ReactNode;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n contentClassName?: string;\n};\n\nexport const PanelShell = ({\n actions,\n children,\n className,\n contentClassName,\n title,\n}: PanelShellProps): JSX.Element => {\n return (\n <Card\n title={title}\n headerActions={actions}\n className={className}\n contentClassName={contentClassName}\n >\n {children}\n </Card>\n );\n};\n\nexport default PanelShell;\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const header = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n});\n\nexport const title = sprinkles({\n margin: 0,\n fontSize: 'sm',\n fontWeight: 'semibold',\n color: 'text',\n});\n\nexport const description = sprinkles({\n margin: 0,\n fontSize: 'sm',\n color: 'textSecondary',\n});\n\nexport const content = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const actions = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n gap: 2,\n});\n\nexport const feedback = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../theme/tools.js';\nimport { PanelShell } from './PanelShell.js';\nimport * as styles from './ActionPanel.css.js';\n\nexport type ActionPanelProps = {\n title: ReactNode;\n description?: ReactNode;\n children: ReactNode;\n actions?: ReactNode;\n feedback?: ReactNode;\n className?: string;\n};\n\nexport const ActionPanel = ({\n actions,\n children,\n className,\n description,\n feedback,\n title,\n}: ActionPanelProps): JSX.Element => {\n return (\n <PanelShell className={className}>\n <div className={styles.root}>\n <div className={styles.header}>\n <h3 className={styles.title}>{title}</h3>\n {description != null && (\n <div className={styles.description}>{description}</div>\n )}\n </div>\n <div className={styles.content}>{children}</div>\n {actions != null && <div className={styles.actions}>{actions}</div>}\n {feedback != null && (\n <div className={cx(styles.feedback)}>{feedback}</div>\n )}\n </div>\n </PanelShell>\n );\n};\n\nexport default ActionPanel;\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n width: 'full',\n paddingX: 6,\n paddingY: 4,\n});\n\nexport const top = sprinkles({\n display: 'flex',\n flexDirection: { base: 'column', md: 'row' },\n alignItems: { base: 'flex-start', md: 'center' },\n justifyContent: 'space-between',\n gap: 4,\n});\n\nexport const body = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1.5,\n minWidth: 0,\n});\n\nexport const title = sprinkles({\n margin: 0,\n fontSize: { base: '2xl', md: '3xl' },\n fontWeight: 'bold',\n color: 'text',\n});\n\nexport const subtitle = sprinkles({\n margin: 0,\n fontSize: 'sm',\n color: 'textSecondary',\n maxWidth: 720,\n});\n\nexport const meta = sprinkles({\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: 2,\n color: 'textSecondary',\n fontSize: 'sm',\n});\n\nexport const actions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: 2,\n});\n\nexport const navStack = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../theme/tools.js';\nimport * as styles from './AppHeader.css.js';\n\nexport type AppHeaderProps = {\n title: ReactNode;\n subtitle?: ReactNode;\n meta?: ReactNode;\n primaryNav?: ReactNode;\n secondaryNav?: ReactNode;\n actions?: ReactNode;\n className?: string;\n};\n\nexport const AppHeader = ({\n actions,\n className,\n meta,\n primaryNav,\n secondaryNav,\n subtitle,\n title,\n}: AppHeaderProps): JSX.Element => {\n return (\n <header className={cx(styles.root, className)}>\n <div className={styles.top}>\n <div className={styles.body}>\n <h1 className={styles.title}>{title}</h1>\n {subtitle != null && (\n <div className={styles.subtitle}>{subtitle}</div>\n )}\n {meta != null && <div className={styles.meta}>{meta}</div>}\n </div>\n {actions != null && <div className={styles.actions}>{actions}</div>}\n </div>\n {(primaryNav != null || secondaryNav != null) && (\n <div className={styles.navStack}>\n {primaryNav}\n {secondaryNav}\n </div>\n )}\n </header>\n );\n};\n\nexport default AppHeader;\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const section = sprinkles({\n width: 'full',\n display: 'flex',\n justifyContent: 'flex-start',\n});\n\nexport const inner = sprinkles({\n width: 'full',\n display: 'flex',\n flexDirection: 'column',\n gap: 6,\n});\n\nexport const header = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n gap: 4,\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n});\n\nexport const headingGroup = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n minWidth: 0,\n});\n\nexport const title = sprinkles({\n fontSize: '2xl',\n lineHeight: '2xl',\n fontWeight: 'semibold',\n color: 'text',\n margin: 0,\n});\n\nexport const subheader = sprinkles({\n fontSize: 'base',\n color: 'textSecondary',\n margin: 0,\n});\n\nexport const metaRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: 2,\n});\n\nexport const actionCluster = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n gap: 2,\n justifyContent: 'flex-end',\n});\n\nexport const actionClusterItem = sprinkles({\n display: 'inline-flex',\n});\n\nexport const body = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 6,\n});\n\nexport const bottomFloatArea = sprinkles({\n position: 'fixed',\n left: 0,\n bottom: 6,\n width: 'full',\n display: 'flex',\n justifyContent: 'center',\n pointerEvents: 'none',\n paddingInline: 4,\n});\n\nexport const bottomFloatContent = sprinkles({\n pointerEvents: 'auto',\n});\n","import { type CSSProperties, type JSX, type ReactNode } from 'react';\n\nimport * as styles from './ContentLayout.css.js';\nimport { cx } from '../../theme/tools.js';\n\nexport type BottomFloatConfig = {\n node: ReactNode;\n reservedHeight?: number;\n};\n\ntype ContentLayoutSlot =\n | 'section'\n | 'inner'\n | 'header'\n | 'headingGroup'\n | 'title'\n | 'subheader'\n | 'metaRow'\n | 'actionCluster'\n | 'actionClusterItem'\n | 'body'\n | 'bottomFloatArea'\n | 'bottomFloatContent';\n\ntype SlotClasses<TSlot extends string> = Partial<Record<TSlot, string>>;\n\nexport type ContentLayoutProps = {\n title?: ReactNode;\n subheader?: ReactNode;\n mainAction?: ReactNode;\n secondaryActions?: ReactNode[];\n meta?: ReactNode;\n children: ReactNode;\n bottomFloat?: BottomFloatConfig;\n className?: string;\n contentClassName?: string;\n classes?: SlotClasses<ContentLayoutSlot>;\n};\n\nconst DEFAULT_BOTTOM_FLOAT_HEIGHT = 320;\nconst BOTTOM_FLOAT_BUFFER = 48;\n\nconst renderTitle = (\n title: ReactNode | undefined,\n className: string,\n): ReactNode => {\n if (title == null) {\n return null;\n }\n\n if (typeof title === 'string' || typeof title === 'number') {\n return <h1 className={className}>{title}</h1>;\n }\n\n return <div className={className}>{title}</div>;\n};\n\nconst renderSubheader = (\n subheader: ReactNode | undefined,\n className: string,\n): ReactNode => {\n if (subheader == null) {\n return null;\n }\n\n if (typeof subheader === 'string' || typeof subheader === 'number') {\n return <p className={className}>{subheader}</p>;\n }\n\n return <div className={className}>{subheader}</div>;\n};\n\nexport const ContentLayout = (props: ContentLayoutProps): JSX.Element => {\n const {\n bottomFloat,\n classes,\n children,\n className,\n contentClassName,\n mainAction,\n meta,\n secondaryActions = [],\n subheader,\n title,\n } = props;\n\n let reservedHeight = 0;\n if (bottomFloat != null) {\n const floatHeight =\n bottomFloat.reservedHeight ?? DEFAULT_BOTTOM_FLOAT_HEIGHT;\n reservedHeight = Math.max(floatHeight, 0);\n }\n\n let paddingStyles: CSSProperties | undefined;\n if (reservedHeight > 0) {\n paddingStyles = {\n paddingBottom: reservedHeight + BOTTOM_FLOAT_BUFFER,\n };\n }\n\n const shouldRenderActions = mainAction != null || secondaryActions.length > 0;\n let mainActionNode: JSX.Element | null = null;\n if (mainAction != null) {\n mainActionNode = (\n <div className={cx(styles.actionClusterItem, classes?.actionClusterItem)}>\n {mainAction}\n </div>\n );\n }\n\n let bottomFloatNode: JSX.Element | null = null;\n if (bottomFloat != null) {\n bottomFloatNode = (\n <div className={cx(styles.bottomFloatArea, classes?.bottomFloatArea)}>\n <div\n className={cx(styles.bottomFloatContent, classes?.bottomFloatContent)}\n >\n {bottomFloat.node}\n </div>\n </div>\n );\n }\n\n let actionClusterNode: JSX.Element | null = null;\n if (shouldRenderActions) {\n actionClusterNode = (\n <div className={cx(styles.actionCluster, classes?.actionCluster)}>\n {secondaryActions.map((action, index) => {\n return (\n <div\n key={`secondary-${index}`}\n className={cx(\n styles.actionClusterItem,\n classes?.actionClusterItem,\n )}\n >\n {action}\n </div>\n );\n })}\n {mainActionNode}\n </div>\n );\n }\n\n const titleClassName = cx(styles.title, classes?.title);\n const subheaderClassName = cx(styles.subheader, classes?.subheader);\n const metaClassName = cx(styles.metaRow, classes?.metaRow);\n let metaNode: ReactNode | null = null;\n if (meta != null) {\n metaNode = <div className={metaClassName}>{meta}</div>;\n }\n\n return (\n <section\n className={cx(styles.section, classes?.section, className)}\n style={paddingStyles}\n >\n <div className={cx(styles.inner, classes?.inner, contentClassName)}>\n {(title != null ||\n subheader != null ||\n meta != null ||\n shouldRenderActions) && (\n <div className={cx(styles.header, classes?.header)}>\n <div className={cx(styles.headingGroup, classes?.headingGroup)}>\n {renderTitle(title, titleClassName)}\n {renderSubheader(subheader, subheaderClassName)}\n {metaNode}\n </div>\n {actionClusterNode}\n </div>\n )}\n\n <div className={cx(styles.body, classes?.body)}>{children}</div>\n </div>\n\n {bottomFloatNode}\n </section>\n );\n};\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n display: 'flex',\n flexDirection: { base: 'column', md: 'row' },\n justifyContent: 'space-between',\n alignItems: { base: 'flex-start', md: 'center' },\n gap: 3,\n});\n\nexport const body = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n minWidth: 0,\n});\n\nexport const title = sprinkles({\n margin: 0,\n fontSize: 'lg',\n fontWeight: 'semibold',\n color: 'text',\n});\n\nexport const subtitle = sprinkles({\n margin: 0,\n fontSize: 'sm',\n color: 'textSecondary',\n});\n\nexport const meta = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 2,\n fontSize: 'sm',\n color: 'textSecondary',\n});\n\nexport const actions = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 2,\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../theme/tools.js';\nimport * as styles from './DetailSummaryHeader.css.js';\n\nexport type DetailSummaryHeaderProps = {\n title: ReactNode;\n subtitle?: ReactNode;\n meta?: ReactNode;\n actions?: ReactNode;\n className?: string;\n};\n\nexport const DetailSummaryHeader = ({\n actions,\n className,\n meta,\n subtitle,\n title,\n}: DetailSummaryHeaderProps): JSX.Element => {\n return (\n <div className={cx(styles.root, className)}>\n <div className={styles.body}>\n <h3 className={styles.title}>{title}</h3>\n {subtitle != null && <div className={styles.subtitle}>{subtitle}</div>}\n {meta != null && <div className={styles.meta}>{meta}</div>}\n </div>\n {actions != null && <div className={styles.actions}>{actions}</div>}\n </div>\n );\n};\n\nexport default DetailSummaryHeader;\n","import { style } from '@vanilla-extract/css';\nimport { recipe } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../theme/sprinkles.css.js';\nimport { vars } from '../../theme/themeContract.js';\n\nconst MOBILE_MEDIA_QUERY = 'screen and (max-width: 1023px)';\n\nexport const shell = sprinkles({\n display: 'flex',\n width: 'full',\n backgroundColor: 'brandSecondaryOrange-10',\n backgroundImage: 'pageShellSurface',\n});\n\nexport const page = sprinkles({\n paddingRight: 3,\n paddingTop: 3,\n paddingBottom: 3,\n height: 'screen',\n flex: 1,\n minWidth: 0,\n});\n\nexport const pageWithSidePanel = sprinkles({\n display: 'flex',\n alignItems: 'stretch',\n gap: {\n base: 0,\n max1023: 3,\n },\n minWidth: 0,\n flexDirection: {\n base: 'row',\n max1023: 'column',\n },\n height: {\n base: 'full',\n max1023: 'auto',\n },\n});\n\nexport const sidebarColumn = sprinkles({\n position: 'sticky',\n top: 0,\n height: 'screen',\n flexShrink: 0,\n display: 'flex',\n overflow: 'hidden',\n});\n\nexport const sidebarColumnMobile = style({\n '@media': {\n [MOBILE_MEDIA_QUERY]: {\n position: 'fixed',\n top: 0,\n left: 0,\n bottom: 0,\n width: '20rem',\n maxWidth: '85vw',\n transform: 'translateX(-100%)',\n transitionProperty: 'transform',\n transitionDuration: vars.transitionDuration[200],\n transitionTimingFunction: vars.transitionTimingFunction.ease,\n zIndex: vars.zIndex[30],\n backgroundColor: vars.colors.surface,\n borderRight: `1px solid ${vars.colors.borderSubtle}`,\n },\n },\n});\n\nexport const sidebarColumnMobileOpen = style({\n '@media': {\n [MOBILE_MEDIA_QUERY]: {\n transform: 'translateX(0)',\n },\n },\n});\n\nexport const sidebarInner = sprinkles({\n display: 'flex',\n height: 'full',\n});\n\nexport const mobileSidebarBackdrop = style({\n display: 'none',\n '@media': {\n [MOBILE_MEDIA_QUERY]: {\n display: 'block',\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgba(15, 23, 42, 0.32)',\n opacity: 0,\n pointerEvents: 'none',\n transitionProperty: 'opacity',\n transitionDuration: vars.transitionDuration[200],\n transitionTimingFunction: vars.transitionTimingFunction.ease,\n zIndex: vars.zIndex[20],\n },\n },\n});\n\nexport const mobileSidebarBackdropOpen = style({\n '@media': {\n [MOBILE_MEDIA_QUERY]: {\n opacity: 1,\n pointerEvents: 'auto',\n },\n },\n});\n\nexport const mobileSidebarToggle = sprinkles({\n display: {\n base: 'none',\n max1023: 'inline-flex',\n },\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 'sm',\n fontWeight: 'semibold',\n borderRadius: 'md',\n borderStyle: 'solid',\n borderWidth: 'default',\n borderColor: 'border',\n backgroundColor: 'surface',\n color: 'text',\n paddingX: 3,\n paddingY: 2,\n cursor: 'pointer',\n});\n\nexport const mobileSidebarClose = sprinkles({\n display: {\n base: 'none',\n max1023: 'inline-flex',\n },\n position: {\n base: 'static',\n max1023: 'absolute',\n },\n right: {\n base: 0,\n max1023: 3,\n },\n top: {\n base: 0,\n max1023: 3,\n },\n zIndex: 40,\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 'sm',\n fontWeight: 'semibold',\n borderRadius: 'md',\n borderStyle: 'solid',\n borderWidth: 'default',\n borderColor: 'border',\n backgroundColor: 'surface',\n color: 'text',\n paddingX: 3,\n paddingY: 2,\n cursor: 'pointer',\n});\n\nexport const mainColumn = sprinkles({\n flex: 1,\n height: 'full',\n minWidth: 0,\n minHeight: 0,\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: 'surface',\n overflow: 'hidden',\n borderRadius: '3xl',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n});\n\nexport const mainColumnWithSidePanel = sprinkles({\n height: {\n base: 'full',\n max1023: 'auto',\n },\n});\n\nexport const sidePanel = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n minHeight: 0,\n height: {\n base: 'full',\n max1023: 'auto',\n },\n});\n\nexport const sidePanelSurface = sprinkles({\n flex: 'none',\n backgroundColor: 'surface',\n borderRadius: '3xl',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n});\n\nexport const sidePanelResizer = style([\n sprinkles({\n alignSelf: 'stretch',\n backgroundColor: 'transparent',\n cursor: 'col-resize',\n flex: 'none',\n minWidth: 4,\n position: 'relative',\n width: 4,\n }),\n {\n selectors: {\n '&::after': {\n content: '',\n position: 'absolute',\n top: '50%',\n left: '50%',\n width: '4px',\n height: '96px',\n transform: 'translate(-50%, -50%)',\n borderRadius: vars.borderRadius.full,\n backgroundColor: vars.colors.border,\n boxShadow: vars.boxShadow.sm,\n transitionProperty: 'default',\n transitionDuration: vars.transitionDuration[120],\n transitionTimingFunction: vars.transitionTimingFunction.ease,\n },\n '&:hover::after, &[data-active=\"true\"]::after': {\n backgroundColor: vars.colors.primary,\n boxShadow: `0 0 0 1px ${vars.colors.primaryLight}`,\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n },\n },\n]);\n\nexport const sidePanelResizerHiddenOnMobile = sprinkles({\n display: {\n base: 'block',\n max1023: 'none',\n },\n});\n\nexport const header = sprinkles({\n position: 'sticky',\n top: 0,\n zIndex: 10,\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n backgroundColor: 'surface',\n borderWidth: 0,\n borderStyle: 'solid',\n borderBottomWidth: 'default',\n borderBottomColor: 'borderSubtle',\n paddingLeft: 5,\n paddingRight: 5,\n paddingBottom: 3,\n paddingTop: 4,\n});\n\nexport const headerRow = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: 4,\n width: 'full',\n});\n\nexport const breadcrumbNav = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n minWidth: 0,\n});\n\nexport const breadcrumbList = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n columnGap: 2,\n rowGap: 1,\n listStyleType: 'none',\n margin: 0,\n padding: 0,\n color: 'textSecondary',\n fontSize: 'sm',\n});\n\nexport const breadcrumbItem = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n maxWidth: '12rem',\n});\n\nexport const breadcrumbLink = style([\n sprinkles({\n color: 'text',\n textDecoration: 'none',\n fontWeight: 'medium',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }),\n {\n selectors: {\n '&:hover': {\n color: vars.colors['blue-600'],\n },\n },\n },\n]);\n\nexport const breadcrumbCurrent = sprinkles({\n color: 'text',\n fontWeight: 'semibold',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n\nexport const breadcrumbSeparator = sprinkles({\n color: 'borderLight',\n fontSize: 'xs',\n});\n\nexport const actionGroup = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n gap: 2,\n justifyContent: 'flex-end',\n});\n\nexport const secondaryAction = sprinkles({\n display: 'inline-flex',\n});\n\nexport const tabsRow = sprinkles({\n width: 'full',\n display: 'flex',\n flexWrap: 'wrap',\n gap: 2,\n});\n\nconst tabBase = style([\n sprinkles({\n alignItems: 'center',\n backgroundColor: 'surfaceMuted',\n borderRadius: 'lg',\n color: 'textSecondary',\n display: 'inline-flex',\n fontSize: 'sm',\n fontWeight: 'medium',\n paddingBlock: 1.5,\n paddingInline: 3,\n textDecoration: 'none',\n transitionProperty: 'default',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n '&:hover': {\n color: vars.colors.text,\n },\n },\n },\n]);\n\nexport const tabRecipe = recipe({\n base: tabBase,\n variants: {\n state: {\n default: {},\n active: sprinkles({\n backgroundColor: 'blue-500',\n color: 'white',\n boxShadow: 'sm',\n }),\n },\n mode: {\n link: {},\n static: sprinkles({\n cursor: 'default',\n }),\n },\n },\n defaultVariants: {\n state: 'default',\n mode: 'link',\n },\n});\n\nexport const content = sprinkles({\n flex: 1,\n minHeight: 0,\n display: 'flex',\n flexDirection: 'column',\n overflow: 'auto',\n padding: 6,\n});\n","import { Link } from '@plumile/router';\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type JSX,\n type ReactNode,\n type KeyboardEvent,\n type CSSProperties,\n} from 'react';\n\nimport * as styles from './PageShell.css.js';\nimport { cx } from '../../theme/tools.js';\nimport { useUiTranslation } from '../../i18n/useUiTranslation.js';\n\nexport type BreadcrumbItem = {\n label: ReactNode;\n href?: string;\n};\n\nexport type PageShellTab = {\n id: string;\n label: ReactNode;\n href?: string;\n isActive?: boolean;\n};\n\nexport type PageShellActions = {\n main?: ReactNode;\n secondary?: ReactNode[];\n};\n\nconst DEFAULT_SIDE_PANEL_WIDTH = 520;\nconst MIN_SIDE_PANEL_WIDTH = 360;\nconst MAX_SIDE_PANEL_RATIO = 0.5;\nconst MIN_MAIN_WIDTH = 480;\nconst SPLIT_BREAKPOINT = 1024;\nconst SIDE_PANEL_WIDTH_STORAGE_KEY = 'plumile:page-shell:side-panel-width';\n\nconst readStoredSidePanelWidth = (): number | null => {\n if (typeof window === 'undefined') {\n return null;\n }\n\n try {\n const stored = window.localStorage.getItem(SIDE_PANEL_WIDTH_STORAGE_KEY);\n if (stored == null) {\n return null;\n }\n const parsed = Number(stored);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n};\n\nconst persistSidePanelWidth = (width: number): void => {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n window.localStorage.setItem(SIDE_PANEL_WIDTH_STORAGE_KEY, String(width));\n } catch {\n // ignore quota / permission errors\n }\n};\n\nconst resolveMaxSidePanelWidth = (containerWidth: number): number => {\n let viewWidth = containerWidth;\n if (typeof window !== 'undefined') {\n viewWidth = window.innerWidth;\n }\n return viewWidth * MAX_SIDE_PANEL_RATIO;\n};\n\ntype ResizeMoveHandler = (event: MouseEvent | TouchEvent) => void;\ntype ResizeUpHandler = () => void;\ntype ActiveResizeHandlers = {\n move?: ResizeMoveHandler | null;\n up?: ResizeUpHandler | null;\n};\n\ntype Props = {\n sidebar: ReactNode;\n children: ReactNode;\n breadcrumb?: BreadcrumbItem[];\n breadcrumbSlot?: ReactNode;\n tabs?: PageShellTab[];\n actions?: PageShellActions;\n sidePanel?: ReactNode;\n contentClassName?: string;\n};\n\nconst resolveIsActive = (tab: PageShellTab, pathname?: string): boolean => {\n if (typeof tab.isActive === 'boolean') {\n return tab.isActive;\n }\n\n if (tab.href != null && pathname != null) {\n return pathname === tab.href;\n }\n\n return false;\n};\n\nexport const PageShell = ({\n actions,\n breadcrumb,\n breadcrumbSlot,\n children,\n contentClassName,\n sidebar,\n sidePanel,\n tabs,\n}: Props): JSX.Element => {\n const { t } = useUiTranslation();\n const hasSidePanel = sidePanel != null;\n const pageRef = useRef<HTMLDivElement | null>(null);\n const activeResizeHandlersRef = useRef<ActiveResizeHandlers | null>(null);\n const [sidePanelWidth, setSidePanelWidth] = useState(() => {\n const stored = readStoredSidePanelWidth();\n return stored ?? DEFAULT_SIDE_PANEL_WIDTH;\n });\n const sidePanelWidthSnapshotRef = useRef(sidePanelWidth);\n const [isResizingPanel, setIsResizingPanel] = useState(false);\n const [isStackedLayout, setIsStackedLayout] = useState(false);\n const [isMobileSidebarOpen, setIsMobileSidebarOpen] = useState(false);\n\n const clampSidePanelWidth = useCallback((candidateWidth: number): void => {\n const container = pageRef.current;\n if (container == null) {\n return;\n }\n\n const { width } = container.getBoundingClientRect();\n const maxWidth = Math.max(\n 0,\n Math.min(resolveMaxSidePanelWidth(width), width - MIN_MAIN_WIDTH),\n );\n const minWidth = Math.min(MIN_SIDE_PANEL_WIDTH, maxWidth);\n let safeMin = minWidth;\n if (maxWidth <= 0) {\n safeMin = 0;\n }\n const safeMax = Math.max(safeMin, maxWidth);\n const clampedWidth = Math.max(safeMin, Math.min(candidateWidth, safeMax));\n sidePanelWidthSnapshotRef.current = clampedWidth;\n setSidePanelWidth(clampedWidth);\n }, []);\n\n const startResizing = useCallback(\n (startClientX: number): void => {\n if (typeof window === 'undefined') {\n return;\n }\n\n if (!hasSidePanel || isStackedLayout) {\n return;\n }\n\n const container = pageRef.current;\n if (container == null) {\n return;\n }\n\n const rect = container.getBoundingClientRect();\n const currentWidth = sidePanelWidth;\n setIsResizingPanel(true);\n\n const moveHandler: ResizeMoveHandler = (event) => {\n let clientX = 0;\n if ('touches' in event) {\n const touch = event.touches[0];\n if (touch == null) {\n return;\n }\n clientX = touch.clientX;\n } else {\n clientX = event.clientX;\n }\n\n const deltaX = startClientX - clientX;\n const nextWidth = currentWidth + deltaX;\n\n const maxWidth = Math.max(\n 0,\n Math.min(\n resolveMaxSidePanelWidth(rect.width),\n rect.width - MIN_MAIN_WIDTH,\n ),\n );\n const minWidth = Math.min(MIN_SIDE_PANEL_WIDTH, maxWidth);\n let safeMin = minWidth;\n if (maxWidth <= 0) {\n safeMin = 0;\n }\n const safeMax = Math.max(safeMin, maxWidth);\n\n const clampedWidth = Math.max(safeMin, Math.min(nextWidth, safeMax));\n sidePanelWidthSnapshotRef.current = clampedWidth;\n setSidePanelWidth(clampedWidth);\n };\n\n const upHandler: ResizeUpHandler = () => {\n setIsResizingPanel(false);\n persistSidePanelWidth(sidePanelWidthSnapshotRef.current);\n const handlers = activeResizeHandlersRef.current;\n if (handlers?.move != null) {\n window.removeEventListener('mousemove', handlers.move);\n window.removeEventListener('touchmove', handlers.move);\n }\n if (handlers?.up != null) {\n window.removeEventListener('mouseup', handlers.up);\n window.removeEventListener('touchend', handlers.up);\n window.removeEventListener('touchcancel', handlers.up);\n }\n activeResizeHandlersRef.current = null;\n };\n\n activeResizeHandlersRef.current = { move: moveHandler, up: upHandler };\n\n window.addEventListener('mousemove', moveHandler);\n window.addEventListener('touchmove', moveHandler, { passive: false });\n window.addEventListener('mouseup', upHandler);\n window.addEventListener('touchend', upHandler);\n window.addEventListener('touchcancel', upHandler);\n },\n [hasSidePanel, isStackedLayout, sidePanelWidth],\n );\n\n useEffect(() => {\n sidePanelWidthSnapshotRef.current = sidePanelWidth;\n }, [sidePanelWidth]);\n\n useEffect(() => {\n if (typeof window === 'undefined') {\n return () => {};\n }\n const mediaQuery = window.matchMedia(\n `(max-width: ${SPLIT_BREAKPOINT - 1}px)`,\n );\n const handleMediaChange = () => {\n setIsStackedLayout(mediaQuery.matches);\n };\n\n handleMediaChange();\n mediaQuery.addEventListener('change', handleMediaChange);\n\n return () => {\n mediaQuery.removeEventListener('change', handleMediaChange);\n };\n }, []);\n\n useEffect(() => {\n if (hasSidePanel) {\n clampSidePanelWidth(sidePanelWidth);\n }\n }, [hasSidePanel, sidePanelWidth, clampSidePanelWidth]);\n\n useEffect(() => {\n if (!isStackedLayout && isMobileSidebarOpen) {\n setIsMobileSidebarOpen(false);\n }\n }, [isMobileSidebarOpen, isStackedLayout]);\n\n useEffect(() => {\n if (!isMobileSidebarOpen) {\n return () => {};\n }\n\n const handleEscape = (event: globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') {\n setIsMobileSidebarOpen(false);\n }\n };\n\n window.addEventListener('keydown', handleEscape);\n return () => {\n window.removeEventListener('keydown', handleEscape);\n };\n }, [isMobileSidebarOpen]);\n\n useEffect(() => {\n return () => {\n const handlers = activeResizeHandlersRef.current;\n if (handlers?.move != null) {\n window.removeEventListener('mousemove', handlers.move);\n window.removeEventListener('touchmove', handlers.move);\n }\n if (handlers?.up != null) {\n window.removeEventListener('mouseup', handlers.up);\n window.removeEventListener('touchend', handlers.up);\n window.removeEventListener('touchcancel', handlers.up);\n }\n };\n }, []);\n\n let currentPath: string | undefined;\n if (typeof window !== 'undefined') {\n currentPath = window.location.pathname;\n }\n\n const renderBreadcrumb = (): JSX.Element | null => {\n if (breadcrumbSlot != null) {\n return <div className={styles.breadcrumbNav}>{breadcrumbSlot}</div>;\n }\n\n if (breadcrumb == null || breadcrumb.length === 0) {\n return null;\n }\n\n const items = breadcrumb.flatMap((item, index) => {\n const isLast = index === breadcrumb.length - 1;\n const key = `${item.href ?? 'crumb'}-${index}`;\n let content: JSX.Element;\n if (item.href != null && !isLast) {\n content = (\n <Link to={item.href} className={styles.breadcrumbLink}>\n {item.label}\n </Link>\n );\n } else {\n let breadcrumbClass = styles.breadcrumbLink;\n if (isLast) {\n breadcrumbClass = styles.breadcrumbCurrent;\n }\n content = <span className={breadcrumbClass}>{item.label}</span>;\n }\n\n const renderedItem = (\n <li key={key} className={styles.breadcrumbItem}>\n {content}\n </li>\n );\n\n if (isLast) {\n return [renderedItem];\n }\n\n return [\n renderedItem,\n <li\n key={`${key}-sep`}\n className={styles.breadcrumbSeparator}\n aria-hidden=\"true\"\n >\n /\n </li>,\n ];\n });\n\n return (\n <nav className={styles.breadcrumbNav} aria-label=\"Breadcrumb\">\n <ol className={styles.breadcrumbList}>{items}</ol>\n </nav>\n );\n };\n\n const renderActions = (): JSX.Element | null => {\n if (\n actions == null ||\n (actions.main == null && (actions.secondary ?? []).length === 0)\n ) {\n return null;\n }\n\n const secondaryNodes = actions.secondary ?? [];\n\n let mainActionNode: JSX.Element | null = null;\n if (actions.main != null) {\n mainActionNode = (\n <div className={styles.secondaryAction}>{actions.main}</div>\n );\n }\n\n return (\n <div className={styles.actionGroup}>\n {secondaryNodes.map((node, index) => {\n return (\n <div key={`secondary-${index}`} className={styles.secondaryAction}>\n {node}\n </div>\n );\n })}\n {mainActionNode}\n </div>\n );\n };\n\n const renderTabs = (): JSX.Element | null => {\n if (tabs == null || tabs.length === 0) {\n return null;\n }\n\n return (\n <div className={styles.tabsRow}>\n {tabs.map((tab) => {\n const isActive = resolveIsActive(tab, currentPath);\n let tabState: 'default' | 'active' = 'default';\n if (isActive) {\n tabState = 'active';\n }\n let tabMode: 'static' | 'link' = 'link';\n if (tab.href == null) {\n tabMode = 'static';\n }\n const className = styles.tabRecipe({\n state: tabState,\n mode: tabMode,\n });\n const key = tab.id;\n\n if (tab.href != null) {\n return (\n <Link key={key} to={tab.href} className={className}>\n {tab.label}\n </Link>\n );\n }\n\n return (\n <span key={key} className={className} aria-current={isActive}>\n {tab.label}\n </span>\n );\n })}\n </div>\n );\n };\n\n const handleResizerKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n if (isStackedLayout) {\n return;\n }\n if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n event.preventDefault();\n let delta = 16;\n if (event.key === 'ArrowRight') {\n delta = -16;\n }\n clampSidePanelWidth(sidePanelWidth + delta);\n persistSidePanelWidth(sidePanelWidthSnapshotRef.current);\n }\n },\n [clampSidePanelWidth, isStackedLayout, sidePanelWidth],\n );\n\n let sidePanelNode: JSX.Element | null = null;\n if (hasSidePanel) {\n let sidePanelStyle: CSSProperties | undefined;\n if (!isStackedLayout) {\n sidePanelStyle = {\n width: `${sidePanelWidth}px`,\n minWidth: `${MIN_SIDE_PANEL_WIDTH}px`,\n maxWidth: '50vw',\n };\n }\n sidePanelNode = (\n <aside\n className={cx(styles.sidePanel, styles.sidePanelSurface)}\n style={sidePanelStyle}\n >\n {sidePanel}\n </aside>\n );\n }\n\n let resizerNode: JSX.Element | null = null;\n if (hasSidePanel) {\n let resizerActive = 'false';\n if (isResizingPanel) {\n resizerActive = 'true';\n }\n resizerNode = (\n <div\n className={cx(\n styles.sidePanelResizer,\n styles.sidePanelResizerHiddenOnMobile,\n )}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"Resize side panel\"\n tabIndex={0}\n data-active={resizerActive}\n onMouseDown={(event) => {\n event.preventDefault();\n startResizing(event.clientX);\n }}\n onTouchStart={(event) => {\n const touch = event.touches[0];\n if (touch != null) {\n startResizing(touch.clientX);\n }\n }}\n onKeyDown={handleResizerKeyDown}\n />\n );\n }\n\n return (\n <div className={styles.shell}>\n <div\n className={cx(styles.mobileSidebarBackdrop, {\n [styles.mobileSidebarBackdropOpen]:\n isStackedLayout && isMobileSidebarOpen,\n })}\n aria-hidden=\"true\"\n onClick={() => {\n setIsMobileSidebarOpen(false);\n }}\n />\n <div\n className={cx(styles.sidebarColumn, styles.sidebarColumnMobile, {\n [styles.sidebarColumnMobileOpen]:\n isStackedLayout && isMobileSidebarOpen,\n })}\n aria-hidden={isStackedLayout && !isMobileSidebarOpen}\n inert={isStackedLayout && !isMobileSidebarOpen}\n >\n <button\n type=\"button\"\n className={styles.mobileSidebarClose}\n onClick={() => {\n setIsMobileSidebarOpen(false);\n }}\n aria-label={t('navigation.pageShell.closeNavigation')}\n >\n {t('navigation.pageShell.close')}\n </button>\n <div className={styles.sidebarInner}>{sidebar}</div>\n </div>\n <div\n ref={pageRef}\n className={cx(styles.page, {\n [styles.pageWithSidePanel]: hasSidePanel,\n })}\n >\n <div\n className={cx(styles.mainColumn, {\n [styles.mainColumnWithSidePanel]: hasSidePanel,\n })}\n >\n <div className={styles.header}>\n <div className={styles.headerRow}>\n {isStackedLayout && (\n <button\n type=\"button\"\n className={styles.mobileSidebarToggle}\n onClick={() => {\n setIsMobileSidebarOpen(true);\n }}\n aria-expanded={isMobileSidebarOpen}\n aria-label={t('navigation.pageShell.openNavigation')}\n >\n {t('navigation.pageShell.menu')}\n </button>\n )}\n {renderBreadcrumb()}\n {renderActions()}\n </div>\n {renderTabs()}\n </div>\n <div className={cx(styles.content, contentClassName)}>{children}</div>\n </div>\n {resizerNode}\n {sidePanelNode}\n </div>\n </div>\n );\n};\n","import { type JSX, type ReactNode } from 'react';\n\nimport {\n PageShell,\n type PageShellActions,\n type PageShellTab,\n} from './PageShell.js';\n\nexport type AppShellProps = {\n sidebar: ReactNode;\n children: ReactNode;\n breadcrumbSlot?: ReactNode;\n actions?: PageShellActions;\n tabs?: PageShellTab[];\n};\n\nexport const AppShell = ({\n sidebar,\n children,\n breadcrumbSlot,\n actions,\n tabs,\n}: AppShellProps): JSX.Element => {\n return (\n <PageShell\n sidebar={sidebar}\n breadcrumbSlot={breadcrumbSlot}\n actions={actions}\n tabs={tabs}\n >\n {children}\n </PageShell>\n );\n};\n\nexport default AppShell;\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const content = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 1,\n});\n\nexport const dot = sprinkles({\n width: 2,\n height: 2,\n borderRadius: 'full',\n backgroundColor: 'current',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { Badge } from '@plumile/ui';\n\nimport * as styles from './statusBadge.css.js';\n\nexport type StatusTone =\n | 'active'\n | 'disabled'\n | 'pending'\n | 'error'\n | 'warning'\n | 'info';\n\nexport type StatusBadgeProps = {\n tone: StatusTone;\n children: ReactNode;\n showDot?: boolean;\n className?: string;\n loading?: boolean;\n};\n\ntype BadgeTone =\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'danger'\n | 'accent';\n\nconst toneMap: Record<StatusTone, BadgeTone> = {\n active: 'success',\n disabled: 'neutral',\n pending: 'info',\n error: 'danger',\n warning: 'warning',\n info: 'info',\n};\n\nexport const StatusBadge = ({\n tone,\n children,\n showDot = false,\n className,\n loading,\n}: StatusBadgeProps): JSX.Element => {\n const badgeTone = toneMap[tone];\n\n let dotNode: JSX.Element | null = null;\n if (showDot) {\n dotNode = <span className={styles.dot} aria-hidden=\"true\" />;\n }\n\n return (\n <Badge tone={badgeTone} className={className} loading={loading}>\n <span className={styles.content}>\n {dotNode}\n {children}\n </span>\n </Badge>\n );\n};\n\nexport default StatusBadge;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n\nexport const top = sprinkles({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n gap: 2,\n});\n\nexport const title = sprinkles({\n fontSize: 'sm',\n fontWeight: 'semibold',\n color: 'text',\n});\n\nexport const timestamp = sprinkles({\n fontSize: 'xs',\n color: 'textSecondary',\n});\n\nexport const summary = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { RelativeTimeText } from '../../../atomic/atoms/relative-time-text/RelativeTimeText.js';\nimport { StatusBadge } from '../../../backoffice/atoms/status_badge/StatusBadge.js';\nimport { PanelShell } from '../../layout/PanelShell.js';\nimport * as styles from './ActivityCard.css.js';\n\ntype ActivityTone =\n | 'active'\n | 'disabled'\n | 'pending'\n | 'error'\n | 'warning'\n | 'info';\n\nexport type ActivityCardProps = {\n title: ReactNode;\n status?: ReactNode;\n statusTone?: ActivityTone;\n timestamp?: string | Date;\n summary?: ReactNode;\n details?: ReactNode;\n className?: string;\n};\n\nexport const ActivityCard = ({\n className,\n details,\n status,\n statusTone,\n summary,\n timestamp,\n title,\n}: ActivityCardProps): JSX.Element => {\n let badgeNode: JSX.Element | null = null;\n if (status != null && statusTone != null) {\n badgeNode = <StatusBadge tone={statusTone}>{status}</StatusBadge>;\n }\n\n return (\n <PanelShell className={className}>\n <div className={styles.root}>\n <div className={styles.top}>\n <span className={styles.title}>{title}</span>\n {badgeNode}\n </div>\n {timestamp != null && (\n <span className={styles.timestamp}>\n <RelativeTimeText value={timestamp} />\n </span>\n )}\n {summary != null && <div className={styles.summary}>{summary}</div>}\n {details}\n </div>\n </PanelShell>\n );\n};\n\nexport default ActivityCard;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './ActivityFeed.css.js';\n\nexport type ActivityFeedProps = {\n children?: ReactNode;\n emptyState?: ReactNode;\n className?: string;\n};\n\nexport const ActivityFeed = ({\n children,\n className,\n emptyState,\n}: ActivityFeedProps): JSX.Element => {\n if (children == null) {\n return <>{emptyState ?? null}</>;\n }\n\n return <div className={cx(styles.root, className)}>{children}</div>;\n};\n\nexport default ActivityFeed;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n display: 'grid',\n gap: 4,\n width: 'full',\n minHeight: 0,\n});\n\nexport const columns = {\n 1: sprinkles({\n gridTemplateColumns: {\n base: 1,\n min1200: 1,\n },\n }),\n 2: sprinkles({\n gridTemplateColumns: {\n base: 1,\n min1200: 2,\n },\n }),\n 3: sprinkles({\n gridTemplateColumns: {\n base: 1,\n min1200: 3,\n },\n }),\n 4: sprinkles({\n gridTemplateColumns: {\n base: 1,\n min1200: 4,\n },\n }),\n uneven: sprinkles({\n gridTemplateColumns: {\n base: 1,\n min1200: 'dashboardUneven',\n },\n }),\n} as const;\n\nexport const column = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n minHeight: 0,\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './DashboardGrid.css.js';\n\nexport type DashboardGridColumns = 1 | 2 | 3 | 4 | 'uneven';\n\nexport type DashboardGridProps = {\n children: ReactNode;\n columns?: DashboardGridColumns;\n className?: string;\n};\n\nexport const DashboardGrid = ({\n children,\n className,\n columns = 3,\n}: DashboardGridProps): JSX.Element => {\n return (\n <div className={cx(styles.root, styles.columns[columns], className)}>\n {children}\n </div>\n );\n};\n\nexport type DashboardGridColumnProps = {\n children: ReactNode;\n className?: string;\n};\n\nexport const DashboardGridColumn = ({\n children,\n className,\n}: DashboardGridColumnProps): JSX.Element => {\n return <div className={cx(styles.column, className)}>{children}</div>;\n};\n\nexport default DashboardGrid;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const list = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n\nexport const item = sprinkles({\n display: 'grid',\n gap: 3,\n gridTemplateColumns: 'metadataStripSplit',\n});\n\nexport const label = sprinkles({\n fontSize: 'xs',\n color: 'textSecondary',\n textTransform: 'uppercase',\n letterSpacing: 'capsNarrow',\n});\n\nexport const value = sprinkles({\n fontSize: 'sm',\n color: 'text',\n minWidth: 0,\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './MetadataStrip.css.js';\n\nexport type MetadataStripItem = {\n id: string;\n label: ReactNode;\n value: ReactNode;\n};\n\nexport type MetadataStripProps = {\n items: readonly MetadataStripItem[];\n className?: string;\n};\n\nexport const MetadataStrip = ({\n className,\n items,\n}: MetadataStripProps): JSX.Element => {\n return (\n <dl className={cx(styles.list, className)}>\n {items.map((item) => {\n return (\n <div key={item.id} className={styles.item}>\n <dt className={styles.label}>{item.label}</dt>\n <dd className={styles.value}>{item.value}</dd>\n </div>\n );\n })}\n </dl>\n );\n};\n\nexport default MetadataStrip;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const top = sprinkles({\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: 3,\n});\n\nexport const label = sprinkles({\n margin: 0,\n fontSize: 'sm',\n color: 'textSecondary',\n});\n\nexport const value = sprinkles({\n margin: 0,\n fontSize: { base: '2xl', md: '3xl' },\n fontWeight: 'bold',\n color: 'text',\n});\n\nexport const hint = sprinkles({\n margin: 0,\n fontSize: 'sm',\n color: 'textSecondary',\n});\n\nexport const icon = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'textSecondary',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { PanelShell } from '../../layout/PanelShell.js';\nimport * as styles from './MetricCard.css.js';\n\nexport type MetricCardProps = {\n label: ReactNode;\n value: ReactNode;\n hint?: ReactNode;\n icon?: ReactNode;\n actions?: ReactNode;\n className?: string;\n};\n\nexport const MetricCard = ({\n actions,\n className,\n hint,\n icon,\n label,\n value,\n}: MetricCardProps): JSX.Element => {\n return (\n <PanelShell actions={actions} className={className}>\n <div className={styles.root}>\n <div className={styles.top}>\n <div>\n <p className={styles.label}>{label}</p>\n <p className={styles.value}>{value}</p>\n </div>\n {icon != null && <div className={styles.icon}>{icon}</div>}\n </div>\n {hint != null && <p className={styles.hint}>{hint}</p>}\n </div>\n </PanelShell>\n );\n};\n\nexport default MetricCard;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n display: 'grid',\n gap: 3,\n width: 'full',\n gridTemplateColumns: 'autoFitMinmax220',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './MetricTileGroup.css.js';\n\nexport type MetricTileGroupProps = {\n children: ReactNode;\n className?: string;\n};\n\nexport const MetricTileGroup = ({\n children,\n className,\n}: MetricTileGroupProps): JSX.Element => {\n return <div className={cx(styles.root, className)}>{children}</div>;\n};\n\nexport default MetricTileGroup;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n display: 'flex',\n flexDirection: { base: 'column', md: 'row' },\n alignItems: { base: 'flex-start', md: 'center' },\n justifyContent: 'space-between',\n gap: 4,\n width: 'full',\n paddingX: 6,\n paddingY: 4,\n});\n\nexport const body = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1.5,\n minWidth: 0,\n});\n\nexport const title = sprinkles({\n margin: 0,\n fontSize: { base: '2xl', md: '3xl' },\n fontWeight: 'bold',\n color: 'text',\n});\n\nexport const subtitle = sprinkles({\n margin: 0,\n fontSize: 'sm',\n color: 'textSecondary',\n maxWidth: 720,\n});\n\nexport const meta = sprinkles({\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: 2,\n color: 'textSecondary',\n fontSize: 'sm',\n});\n\nexport const actions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: 2,\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './PageHero.css.js';\n\nexport type PageHeroProps = {\n title: ReactNode;\n subtitle?: ReactNode;\n meta?: ReactNode;\n actions?: ReactNode;\n className?: string;\n};\n\nexport const PageHero = ({\n actions,\n className,\n meta,\n subtitle,\n title,\n}: PageHeroProps): JSX.Element => {\n return (\n <section className={cx(styles.root, className)}>\n <div className={styles.body}>\n <h1 className={styles.title}>{title}</h1>\n {subtitle != null && <div className={styles.subtitle}>{subtitle}</div>}\n {meta != null && <div className={styles.meta}>{meta}</div>}\n </div>\n {actions != null && <div className={styles.actions}>{actions}</div>}\n </section>\n );\n};\n\nexport default PageHero;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles, stateSprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const nav = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n gap: 2,\n width: 'full',\n});\n\nconst reset = sprinkles({\n all: 'unset',\n});\n\nexport const item = style([\n reset,\n sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n paddingX: 3,\n paddingY: 2,\n borderRadius: 'full',\n cursor: 'pointer',\n fontSize: 'sm',\n fontWeight: 'semibold',\n color: 'textSecondary',\n backgroundColor: 'backgroundSecondary',\n transitionProperty: 'default',\n transitionDuration: 160,\n transitionTimingFunction: 'ease',\n textDecoration: 'none',\n }),\n stateSprinkles({\n color: {\n hover: 'text',\n },\n backgroundColor: {\n hover: 'surfaceMuted',\n },\n }),\n {\n ':focus-visible': {\n outline: `2px solid ${vars.colors['blue-500']}`,\n outlineOffset: '2px',\n },\n },\n]);\n\nexport const active = sprinkles({\n color: 'white',\n backgroundColor: 'primary',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './SegmentedNav.css.js';\n\nexport type SegmentedNavItem = {\n id: string;\n label: ReactNode;\n href?: string;\n isActive?: boolean;\n onClick?: () => void;\n};\n\nexport type SegmentedNavProps = {\n items: readonly SegmentedNavItem[];\n className?: string;\n};\n\nexport const SegmentedNav = ({\n className,\n items,\n}: SegmentedNavProps): JSX.Element => {\n return (\n <nav className={cx(styles.nav, className)}>\n {items.map((item) => {\n const classes = cx(styles.item, {\n [styles.active]: item.isActive === true,\n });\n\n if (item.href != null) {\n return (\n <a key={item.id} href={item.href} className={classes}>\n {item.label}\n </a>\n );\n }\n\n return (\n <button\n key={item.id}\n type=\"button\"\n className={classes}\n onClick={item.onClick}\n >\n {item.label}\n </button>\n );\n })}\n </nav>\n );\n};\n\nexport default SegmentedNav;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles, stateSprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const nav = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n gap: 2,\n width: 'full',\n});\n\nconst reset = sprinkles({\n all: 'unset',\n});\n\nexport const item = style([\n reset,\n sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n paddingX: 3,\n paddingY: 2,\n borderRadius: 'full',\n cursor: 'pointer',\n fontSize: 'sm',\n fontWeight: 'medium',\n color: 'textSecondary',\n backgroundColor: 'surface',\n transitionProperty: 'default',\n transitionDuration: 160,\n transitionTimingFunction: 'ease',\n textDecoration: 'none',\n }),\n stateSprinkles({\n color: {\n hover: 'text',\n },\n backgroundColor: {\n hover: 'backgroundSecondary',\n },\n }),\n {\n ':focus-visible': {\n outline: `2px solid ${vars.colors['blue-500']}`,\n outlineOffset: '2px',\n },\n },\n]);\n\nexport const active = sprinkles({\n color: 'white',\n backgroundColor: 'primary',\n});\n","import { Link } from '@plumile/router';\nimport { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './SectionNav.css.js';\n\nexport type SectionNavItem = {\n id: string;\n label: ReactNode;\n href?: string;\n isActive?: boolean;\n onClick?: () => void;\n};\n\nexport type SectionNavProps = {\n items: readonly SectionNavItem[];\n className?: string;\n};\n\nexport const SectionNav = ({\n className,\n items,\n}: SectionNavProps): JSX.Element => {\n return (\n <nav className={cx(styles.nav, className)}>\n {items.map((item) => {\n const classes = cx(styles.item, {\n [styles.active]: item.isActive === true,\n });\n\n if (item.href != null) {\n return (\n <Link key={item.id} to={item.href} className={classes}>\n {item.label}\n </Link>\n );\n }\n\n return (\n <button\n key={item.id}\n type=\"button\"\n className={classes}\n onClick={item.onClick}\n >\n {item.label}\n </button>\n );\n })}\n </nav>\n );\n};\n\nexport default SectionNav;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles, stateSprinkles } from '../../../theme/sprinkles.css.js';\nimport { vars } from '../../../theme/themeContract.js';\n\nexport const button = style([\n sprinkles({\n all: 'unset',\n width: 'full',\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n padding: 3,\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n borderRadius: 'md',\n backgroundColor: 'background',\n cursor: 'pointer',\n transitionProperty: 'default',\n transitionDuration: 160,\n transitionTimingFunction: 'ease',\n }),\n stateSprinkles({\n boxShadow: {\n hover: 'sm',\n },\n }),\n {\n ':hover': {\n transform: 'translateY(-1px)',\n },\n ':focus-visible': {\n outline: `2px solid ${vars.colors['blue-500']}`,\n outlineOffset: '2px',\n },\n },\n]);\n\nexport const selected = sprinkles({\n borderColor: 'primary',\n backgroundColor: 'surfaceMuted',\n});\n\nexport const top = sprinkles({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n gap: 2,\n});\n\nexport const title = sprinkles({\n fontWeight: 'semibold',\n color: 'text',\n fontSize: 'sm',\n});\n\nexport const meta = sprinkles({\n color: 'textSecondary',\n fontSize: 'xs',\n});\n\nexport const body = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './SelectableCard.css.js';\n\nexport type SelectableCardProps = {\n title: ReactNode;\n meta?: ReactNode;\n selected?: boolean;\n onSelect?: () => void;\n trailing?: ReactNode;\n children?: ReactNode;\n className?: string;\n};\n\nexport const SelectableCard = ({\n children,\n className,\n meta,\n onSelect,\n selected = false,\n title,\n trailing,\n}: SelectableCardProps): JSX.Element => {\n return (\n <button\n type=\"button\"\n className={cx(styles.button, className, {\n [styles.selected]: selected,\n })}\n onClick={onSelect}\n >\n <div className={styles.top}>\n <span className={styles.title}>{title}</span>\n {trailing}\n </div>\n {meta != null && <div className={styles.meta}>{meta}</div>}\n {children != null && <div className={styles.body}>{children}</div>}\n </button>\n );\n};\n\nexport default SelectableCard;\n","import { type JSX, type ReactNode } from 'react';\n\nimport {\n PageShell,\n type BreadcrumbItem,\n type PageShellActions,\n} from './PageShell.js';\n\ntype Props = {\n children: ReactNode;\n sidebar: ReactNode;\n breadcrumbItems?: BreadcrumbItem[];\n breadcrumb?: ReactNode;\n actions?: PageShellActions;\n sidePanel?: ReactNode;\n contentClassName?: string;\n};\n\nconst SidebarPageLayout = ({\n actions,\n breadcrumb,\n breadcrumbItems,\n children,\n contentClassName,\n sidebar,\n sidePanel,\n}: Props): JSX.Element => {\n return (\n <PageShell\n sidebar={sidebar}\n breadcrumb={breadcrumbItems}\n breadcrumbSlot={breadcrumb}\n actions={actions}\n sidePanel={sidePanel}\n contentClassName={contentClassName}\n >\n {children}\n </PageShell>\n );\n};\n\nexport { SidebarPageLayout };\nexport default SidebarPageLayout;\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const container = sprinkles({\n display: 'grid',\n gap: 4,\n padding: 6,\n gridTemplateColumns: {\n base: 'settingsSplit',\n lg: 'detailSingle',\n },\n});\n\nexport const sidebar = sprinkles({\n borderRadius: 'lg',\n backgroundColor: 'background',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'border',\n overflow: 'hidden',\n});\n\nexport const content = sprinkles({\n borderRadius: 'lg',\n backgroundColor: 'background',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'border',\n overflow: 'hidden',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../theme/tools.js';\nimport * as styles from './SettingsLayout.css.js';\n\nexport type SettingsLayoutProps = {\n nav: ReactNode;\n children: ReactNode;\n className?: string;\n navClassName?: string;\n contentClassName?: string;\n};\n\nexport const SettingsLayout = ({\n nav,\n children,\n className,\n navClassName,\n contentClassName,\n}: SettingsLayoutProps): JSX.Element => {\n return (\n <div className={cx(styles.container, className)}>\n <aside className={cx(styles.sidebar, navClassName)}>{nav}</aside>\n <section className={cx(styles.content, contentClassName)}>\n {children}\n </section>\n </div>\n );\n};\n\nexport default SettingsLayout;\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const list = sprinkles({\n display: 'grid',\n gap: 2,\n});\n\nexport const item = sprinkles({\n display: 'grid',\n gridTemplateColumns: 'keyValueSplit',\n gap: 2,\n alignItems: 'center',\n paddingY: 2,\n paddingX: 3,\n borderRadius: 'lg',\n backgroundColor: 'surfaceMuted',\n});\n\nexport const itemSurface = sprinkles({\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n});\n\nexport const label = sprinkles({\n color: 'textMuted',\n textTransform: 'uppercase',\n letterSpacing: 'caps',\n fontWeight: 'semibold',\n});\n\nexport const labelSize = sprinkles({\n fontSize: 'xs',\n});\n\nexport const value = sprinkles({\n fontSize: 'base',\n color: 'text',\n margin: 0,\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport * as styles from './backofficeKeyValueList.css.js';\nimport { cx } from '@plumile/ui';\n\nexport type BackofficeKeyValueItem = {\n id: string;\n label: ReactNode;\n value: ReactNode;\n};\n\nexport type BackofficeKeyValueListProps = {\n items: readonly BackofficeKeyValueItem[];\n};\n\nexport const BackofficeKeyValueList = ({\n items,\n}: BackofficeKeyValueListProps): JSX.Element => {\n return (\n <dl className={styles.list}>\n {items.map((item) => {\n return (\n <div key={item.id} className={cx(styles.item, styles.itemSurface)}>\n <dt className={cx(styles.label, styles.labelSize)}>{item.label}</dt>\n <dd className={styles.value}>{item.value}</dd>\n </div>\n );\n })}\n </dl>\n );\n};\n\nexport default BackofficeKeyValueList;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const row = sprinkles({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n gap: 2,\n});\n\nexport const help = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { RelativeTimeText } from '../../../atomic/atoms/relative-time-text/RelativeTimeText.js';\nimport { StatusBadge } from '../../../backoffice/atoms/status_badge/StatusBadge.js';\nimport {\n BackofficeKeyValueList,\n type BackofficeKeyValueItem,\n} from '../../../backoffice/molecules/backoffice_key_value_list/BackofficeKeyValueList.js';\nimport { PanelShell } from '../../layout/PanelShell.js';\n\nimport * as styles from './StatusSummaryPanel.css.js';\n\ntype PanelTone =\n | 'active'\n | 'disabled'\n | 'pending'\n | 'error'\n | 'warning'\n | 'info';\n\nexport type StatusSummaryPanelProps = {\n title?: ReactNode;\n status: ReactNode;\n statusTone: PanelTone;\n statusLabel?: ReactNode;\n items?: readonly BackofficeKeyValueItem[];\n help?: ReactNode;\n updatedAt?: string | Date;\n className?: string;\n};\n\nexport const StatusSummaryPanel = ({\n className,\n help,\n items = [],\n status,\n statusLabel,\n statusTone,\n title,\n updatedAt,\n}: StatusSummaryPanelProps): JSX.Element => {\n return (\n <PanelShell title={title} className={className}>\n <div className={styles.root}>\n <div className={styles.row}>\n <span>{statusLabel ?? status}</span>\n <StatusBadge tone={statusTone}>{status}</StatusBadge>\n </div>\n {updatedAt != null && <RelativeTimeText value={updatedAt} />}\n {items.length > 0 && <BackofficeKeyValueList items={items} />}\n {help != null && <div className={styles.help}>{help}</div>}\n </div>\n </PanelShell>\n );\n};\n\nexport default StatusSummaryPanel;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n borderRadius: 'md',\n padding: 3,\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n backgroundColor: 'backgroundSecondary',\n});\n\nexport const timestamp = sprinkles({\n fontSize: 'xs',\n color: 'textSecondary',\n});\n\nexport const summary = sprinkles({\n fontSize: 'sm',\n color: 'text',\n});\n\nexport const metrics = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n gap: 2,\n fontSize: 'xs',\n color: 'textSecondary',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { RelativeTimeText } from '../../../atomic/atoms/relative-time-text/RelativeTimeText.js';\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './TimelineEventRow.css.js';\n\nexport type TimelineEventRowMetric = {\n id: string;\n label: ReactNode;\n value: ReactNode;\n};\n\nexport type TimelineEventRowProps = {\n timestamp: string | Date;\n summary?: ReactNode;\n metrics?: readonly TimelineEventRowMetric[];\n details?: ReactNode;\n className?: string;\n};\n\nexport const TimelineEventRow = ({\n className,\n details,\n metrics = [],\n summary,\n timestamp,\n}: TimelineEventRowProps): JSX.Element => {\n return (\n <article className={cx(styles.root, className)}>\n <span className={styles.timestamp}>\n <RelativeTimeText value={timestamp} />\n </span>\n {summary != null && <div className={styles.summary}>{summary}</div>}\n {metrics.length > 0 && (\n <div className={styles.metrics}>\n {metrics.map((metric) => {\n return (\n <span key={metric.id}>\n {metric.label}: {metric.value}\n </span>\n );\n })}\n </div>\n )}\n {details}\n </article>\n );\n};\n\nexport default TimelineEventRow;\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const container = sprinkles({\n display: 'grid',\n gap: 4,\n padding: 6,\n gridTemplateColumns: {\n base: 'splitViewSplit',\n lg: 'detailSingle',\n },\n});\n\nexport const panel = sprinkles({\n borderRadius: 'lg',\n backgroundColor: 'background',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'border',\n overflow: 'hidden',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../theme/tools.js';\nimport * as styles from './SplitViewLayout.css.js';\n\nexport type SplitViewLayoutProps = {\n list: ReactNode;\n detail: ReactNode;\n className?: string;\n listClassName?: string;\n detailClassName?: string;\n};\n\nexport const SplitViewLayout = ({\n list,\n detail,\n className,\n listClassName,\n detailClassName,\n}: SplitViewLayoutProps): JSX.Element => {\n return (\n <div className={cx(styles.container, className)}>\n <div className={cx(styles.panel, listClassName)}>{list}</div>\n <div className={cx(styles.panel, detailClassName)}>{detail}</div>\n </div>\n );\n};\n\nexport default SplitViewLayout;\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const row = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n flexWrap: 'wrap',\n gap: 3,\n width: 'full',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../theme/tools.js';\nimport * as styles from './ToolbarRow.css.js';\n\nexport type ToolbarRowProps = {\n children: ReactNode;\n className?: string;\n};\n\nexport const ToolbarRow = ({\n children,\n className,\n}: ToolbarRowProps): JSX.Element => {\n return <div className={cx(styles.row, className)}>{children}</div>;\n};\n\nexport default ToolbarRow;\n","/**\n * Trims markdown content and normalizes empty values to null.\n */\nexport function sanitizeAgentMarkdown(\n content: string | null | undefined,\n): string | null {\n const trimmed = content?.trim();\n if (trimmed == null || trimmed === '') {\n return null;\n }\n\n return trimmed;\n}\n\n/**\n * Trims plain-text answers and normalizes empty values to null.\n */\nexport function sanitizeAgentAnswer(\n answer: string | null | undefined,\n): string | null {\n const trimmed = answer?.trim();\n if (trimmed == null || trimmed === '') {\n return null;\n }\n\n return trimmed;\n}\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const container = sprinkles({\n display: 'flex',\n width: '4/5',\n flexDirection: 'column',\n gap: 2,\n});\n\nexport const title = sprinkles({\n margin: 0,\n fontSize: 'lg',\n fontWeight: 'semibold',\n});\n\nexport const emptyMessage = sprinkles({\n fontSize: 'sm',\n fontStyle: 'italic',\n margin: 0,\n});\n","import { type JSX } from 'react';\n\nimport { MarkdownRenderer } from '../../atomic/molecules/markdown/MarkdownRenderer.js';\nimport { sanitizeAgentMarkdown } from '../../shared/agentText.js';\nimport * as styles from './AgentMarkdownCard.css.js';\n\ntype Props = {\n title: string;\n content: string;\n emptyMessage: string;\n};\n\nexport const AgentMarkdownCard = ({\n content,\n emptyMessage,\n}: Props): JSX.Element => {\n const sanitizedContent = sanitizeAgentMarkdown(content);\n\n let body: JSX.Element;\n\n if (sanitizedContent != null) {\n body = <MarkdownRenderer content={sanitizedContent} />;\n } else {\n body = <p className={styles.emptyMessage}>{emptyMessage}</p>;\n }\n\n return <div className={styles.container}>{body}</div>;\n};\n\nexport default AgentMarkdownCard;\n","import { style } from '@vanilla-extract/css';\nimport { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../theme/sprinkles.css.js';\nimport { vars } from '../../theme/themeContract.js';\n\nexport const container = sprinkles({\n position: 'relative',\n width: 'full',\n});\n\nexport const label = sprinkles({\n display: 'block',\n marginBottom: 2,\n fontSize: 'xs',\n fontWeight: 'semibold',\n letterSpacing: 'wider',\n textTransform: 'uppercase',\n color: 'textMuted',\n});\n\nconst triggerBase = style([\n sprinkles({\n width: 'full',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 2,\n paddingY: 2,\n paddingX: 3,\n borderRadius: 'xl',\n fontSize: 'sm',\n fontWeight: 'semibold',\n textAlign: 'left',\n cursor: 'pointer',\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n '&:disabled': {\n opacity: 0.6,\n cursor: 'not-allowed',\n },\n },\n },\n]);\n\nconst defaultTrigger = sprinkles({\n borderWidth: 'px',\n borderStyle: 'solid',\n borderColor: 'border',\n backgroundColor: 'white',\n color: 'text',\n});\n\nconst brandTrigger = style([\n sprinkles({\n color: 'brandWhite',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'brandPrimaryRed',\n backgroundImage: 'brandDiagonal',\n }),\n {\n // boxShadow: `0 0 0 1px ${vars.colors.brandPrimaryRed}`,\n selectors: {\n '&:hover': {\n filter: 'brightness(0.98)',\n },\n '&:focus-visible': {\n outline: 'none',\n // borderColor: vars.colors.brandPrimaryRed,\n boxShadow: `0 0 0 2px ${vars.colors.brandSecondaryOrange}`,\n },\n },\n },\n]);\n\nexport const trigger = recipe({\n base: triggerBase,\n variants: {\n variant: {\n default: defaultTrigger,\n brand: brandTrigger,\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n});\n\nexport const triggerOpen = sprinkles({\n borderBottomLeftRadius: 'none',\n borderBottomRightRadius: 'none',\n});\n\nexport const valueText = sprinkles({\n flex: 1,\n minWidth: 0,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n});\n\nexport const triggerIcon = sprinkles({\n display: 'grid',\n alignItems: 'center',\n justifyContent: 'center',\n width: 4,\n height: 4,\n color: 'textMuted',\n transitionProperty: 'default',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n});\n\nexport const triggerIconOpen = sprinkles({\n rotate: 180,\n color: 'text',\n});\n\nexport const triggerIconBrand = sprinkles({\n color: 'brandWhite',\n});\n\nexport const menu = sprinkles({\n position: 'absolute',\n top: 'full',\n left: 0,\n right: 0,\n zIndex: 10,\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n padding: 1,\n borderRadius: 'xl',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'border',\n backgroundColor: 'white',\n boxShadow: 'lg',\n maxHeight: 72,\n overflowY: 'auto',\n});\n\nexport const menuOpen = sprinkles({\n borderTopLeftRadius: 'none',\n borderTopRightRadius: 'none',\n marginTop: '-px',\n});\n\nexport const optionButton = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: 1,\n width: 'full',\n borderWidth: 0,\n borderStyle: 'none',\n borderRadius: 'lg',\n backgroundColor: 'transparent',\n paddingY: 2,\n paddingX: 3,\n fontSize: 'sm',\n fontWeight: 'medium',\n color: 'text',\n textAlign: 'left',\n cursor: 'pointer',\n transitionProperty: 'colors',\n transitionDuration: 120,\n transitionTimingFunction: 'ease',\n});\n\nexport const optionSelected = sprinkles({\n // backgroundColor: vars.colors['slate-100'],\n color: 'text',\n});\n\nexport const optionDescription = sprinkles({\n fontSize: 'xs',\n color: 'textMuted',\n});\n\nexport const menuSeparator = sprinkles({\n height: 'px',\n marginY: 1,\n marginX: 2,\n backgroundColor: 'border',\n});\n\nexport const actionsContainer = sprinkles({\n paddingY: 1,\n paddingX: 2,\n});\n\nexport type SimpleSelectVariants = RecipeVariants<typeof trigger>;\n","import {\n type JSX,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport { ChevronDownSvg } from '../../icons/ChevronDownSvg.js';\n\nimport * as styles from './SimpleSelect.css.js';\nimport { cx } from '../../theme/tools.js';\nimport { useUiTranslation } from '../../i18n/useUiTranslation.js';\n\nexport type SimpleSelectOption = {\n id: string;\n label: string;\n value: string;\n description?: string | null;\n};\n\ntype ActionSlot = ReactNode | ((closeMenu: () => void) => ReactNode);\n\ntype Props = {\n options: readonly SimpleSelectOption[];\n value: string;\n onChange: (value: string) => void;\n label?: ReactNode;\n placeholder?: string;\n actionsSlot?: ActionSlot;\n isDisabled?: boolean;\n className?: string;\n variant?: 'default' | 'brand';\n};\n\nexport const SimpleSelect = ({\n actionsSlot,\n className,\n isDisabled = false,\n label,\n onChange,\n options,\n placeholder,\n value,\n variant = 'default',\n}: Props): JSX.Element => {\n const { t } = useUiTranslation();\n const [isOpen, setIsOpen] = useState(false);\n const resolvedPlaceholder = placeholder ?? t('common.select.placeholder');\n const [focusedIndex, setFocusedIndex] = useState<number>(-1);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const optionRefs = useRef<Map<string, HTMLButtonElement | null>>(new Map());\n const listboxId = useId();\n\n const selectedOption = useMemo(() => {\n return (\n options.find((option) => {\n return option.value === value;\n }) ?? null\n );\n }, [options, value]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const selectedIndex = options.findIndex((option) => {\n return option.value === value;\n });\n let nextIndex = 0;\n if (selectedIndex >= 0) {\n nextIndex = selectedIndex;\n }\n setFocusedIndex(nextIndex);\n }, [isOpen, options, value]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n if (focusedIndex < 0 || focusedIndex >= options.length) {\n return;\n }\n const option = options[focusedIndex];\n if (option == null) {\n return;\n }\n const node = optionRefs.current.get(option.id);\n node?.focus();\n }, [focusedIndex, isOpen, options]);\n\n useEffect(() => {\n if (!isOpen) {\n return () => {};\n }\n\n const handleClick = (event: MouseEvent) => {\n if (containerRef.current?.contains(event.target as Node)) {\n return;\n }\n setIsOpen(false);\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setIsOpen(false);\n triggerRef.current?.focus();\n }\n };\n\n document.addEventListener('mousedown', handleClick);\n window.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('mousedown', handleClick);\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [isOpen]);\n\n useEffect(() => {\n optionRefs.current.clear();\n }, [options]);\n\n const closeMenu = useCallback(() => {\n setIsOpen(false);\n requestAnimationFrame(() => {\n triggerRef.current?.focus();\n });\n }, []);\n\n const handleToggle = (): void => {\n if (isDisabled) {\n return;\n }\n setIsOpen((prev) => {\n return !prev;\n });\n };\n\n const handleSelect = (nextValue: string): void => {\n onChange(nextValue);\n closeMenu();\n };\n\n const handleTriggerKeyDown = (\n event: ReactKeyboardEvent<HTMLButtonElement>,\n ) => {\n if (isDisabled) {\n return;\n }\n\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n setIsOpen(true);\n }\n };\n\n const moveFocus = (direction: 1 | -1): void => {\n if (options.length === 0) {\n return;\n }\n setFocusedIndex((prev) => {\n if (prev < 0) {\n let fallbackIndex = options.length - 1;\n if (direction === 1) {\n fallbackIndex = 0;\n }\n return fallbackIndex;\n }\n const nextIndex = (prev + direction + options.length) % options.length;\n return nextIndex;\n });\n };\n\n const handleListKeyDown = (event: ReactKeyboardEvent<HTMLUListElement>) => {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n moveFocus(1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n moveFocus(-1);\n break;\n case 'Home':\n event.preventDefault();\n setFocusedIndex(0);\n break;\n case 'End':\n event.preventDefault();\n setFocusedIndex(options.length - 1);\n break;\n case 'Enter':\n case ' ': {\n event.preventDefault();\n if (focusedIndex >= 0 && focusedIndex < options.length) {\n const option = options[focusedIndex];\n if (option != null) {\n handleSelect(option.value);\n }\n }\n break;\n }\n case 'Escape':\n event.preventDefault();\n setIsOpen(false);\n triggerRef.current?.focus();\n break;\n default:\n break;\n }\n };\n\n const registerOptionRef = (optionId: string) => {\n return (node: HTMLButtonElement | null) => {\n optionRefs.current.set(optionId, node);\n };\n };\n\n let labelId: string | undefined;\n if (label != null) {\n labelId = `${listboxId}-label`;\n }\n\n const renderActionsSlot = (): ReactNode | null => {\n if (typeof actionsSlot === 'function') {\n return actionsSlot(closeMenu);\n }\n return actionsSlot ?? null;\n };\n\n const optionItems = options.map((option, index) => {\n const isSelected = option.value === value;\n const optionClassName = cx(styles.optionButton, {\n [styles.optionSelected]: isSelected,\n });\n let optionTabIndex = -1;\n if (focusedIndex === index) {\n optionTabIndex = 0;\n }\n\n let descriptionNode: JSX.Element | null = null;\n if (option.description != null && option.description !== '') {\n descriptionNode = (\n <span className={styles.optionDescription}>{option.description}</span>\n );\n }\n\n return (\n <li key={option.id} role=\"presentation\">\n <button\n ref={registerOptionRef(option.id)}\n type=\"button\"\n role=\"option\"\n aria-selected={isSelected}\n className={optionClassName}\n tabIndex={optionTabIndex}\n onClick={() => {\n handleSelect(option.value);\n }}\n onMouseEnter={() => {\n setFocusedIndex(index);\n }}\n >\n <span>{option.label}</span>\n {descriptionNode}\n </button>\n </li>\n );\n });\n\n let activeOptionId: string | undefined;\n if (focusedIndex >= 0 && focusedIndex < options.length) {\n activeOptionId = options[focusedIndex]?.id;\n }\n\n let labelNode: JSX.Element | null = null;\n if (label != null) {\n labelNode = (\n <span id={labelId} className={styles.label}>\n {label}\n </span>\n );\n }\n\n let ariaControls: string | undefined;\n if (isOpen) {\n ariaControls = listboxId;\n }\n\n let actionsSlotNode: ReactNode | null = null;\n if (actionsSlot != null) {\n actionsSlotNode = (\n <>\n <li role=\"presentation\">\n <div className={styles.menuSeparator} role=\"separator\" />\n </li>\n <li role=\"presentation\">\n <div className={styles.actionsContainer}>{renderActionsSlot()}</div>\n </li>\n </>\n );\n }\n\n let menuNode: JSX.Element | null = null;\n if (isOpen) {\n menuNode = (\n <ul\n id={listboxId}\n className={cx(styles.menu, styles.menuOpen)}\n role=\"listbox\"\n aria-activedescendant={activeOptionId}\n tabIndex={-1}\n onKeyDown={handleListKeyDown}\n >\n {optionItems}\n {actionsSlotNode}\n </ul>\n );\n }\n\n const triggerClassName = cx(styles.trigger({ variant }), {\n [styles.triggerOpen]: isOpen,\n });\n const triggerIconClassName = cx(styles.triggerIcon, {\n [styles.triggerIconOpen]: isOpen,\n [styles.triggerIconBrand]: variant === 'brand',\n });\n\n return (\n <div className={cx(styles.container, className)} ref={containerRef}>\n {labelNode}\n <button\n ref={triggerRef}\n type=\"button\"\n className={triggerClassName}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={ariaControls}\n aria-labelledby={labelId}\n onClick={handleToggle}\n onKeyDown={handleTriggerKeyDown}\n disabled={isDisabled}\n >\n <span className={styles.valueText}>\n {selectedOption?.label ?? resolvedPlaceholder}\n </span>\n <span className={triggerIconClassName}>\n <ChevronDownSvg width={16} height={16} aria-hidden=\"true\" />\n </span>\n </button>\n {menuNode}\n </div>\n );\n};\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const root = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 3,\n paddingY: 3,\n paddingX: 4,\n borderRadius: 'md',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'amber-200',\n backgroundColor: 'amber-50',\n color: 'amber-900',\n});\n\nexport const content = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n minWidth: 0,\n});\n\nexport const title = sprinkles({\n margin: 0,\n fontWeight: 'semibold',\n fontSize: 'sm',\n});\n\nexport const message = sprinkles({\n margin: 0,\n fontSize: 'sm',\n lineHeight: 1.4,\n});\n","import { type JSX } from 'react';\n\nimport { Button } from '../../atomic/atoms/button/Button.js';\nimport { cx } from '../../theme/tools.js';\nimport { useUiTranslation } from '../../i18n/useUiTranslation.js';\n\nimport * as styles from './RefetchNeededBanner.css.js';\n\ntype Props = {\n reason: string;\n onReload: () => void;\n className?: string;\n};\n\nexport const RefetchNeededBanner = ({\n reason,\n onReload,\n className,\n}: Props): JSX.Element => {\n const { t } = useUiTranslation();\n let message = t('subscriptions.refetchNeeded.messages.default');\n if (reason === 'CURSOR_REPLAY_UNAVAILABLE') {\n message = t('subscriptions.refetchNeeded.messages.cursorReplayUnavailable');\n } else if (reason === 'BUFFER_OVERFLOW') {\n message = t('subscriptions.refetchNeeded.messages.bufferOverflow');\n }\n\n return (\n <div className={cx(styles.root, className)}>\n <div className={styles.content}>\n <p className={styles.title}>{t('subscriptions.refetchNeeded.title')}</p>\n <p className={styles.message}>{message}</p>\n </div>\n <Button type=\"button\" variant=\"secondary\" size=\"small\" onClick={onReload}>\n {t('subscriptions.refetchNeeded.actions.reload')}\n </Button>\n </div>\n );\n};\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const wrapper = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n width: 'full',\n});\n\nexport const tabsBar = sprinkles({\n width: 'full',\n display: 'flex',\n justifyContent: 'center',\n});\n\nexport const tabsInner = sprinkles({\n width: 'full',\n display: 'flex',\n justifyContent: 'center',\n});\n\nexport const panels = sprinkles({\n width: 'full',\n});\n\nexport const panel = sprinkles({\n width: 'full',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { Tabs, type TabItem } from '../../atomic/molecules/tabs/Tabs.js';\nimport * as styles from './TabsContentLayout.css.js';\n\nexport type TabsContentLayoutProps = {\n tabs: TabItem[];\n ariaLabel?: string;\n children: ReactNode;\n};\n\nexport const TabsContentLayout = (\n props: TabsContentLayoutProps,\n): JSX.Element => {\n const { ariaLabel, children, tabs } = props;\n\n return (\n <div className={styles.wrapper}>\n <div className={styles.tabsBar}>\n <div className={styles.tabsInner}>\n <Tabs items={tabs} ariaLabel={ariaLabel} />\n </div>\n </div>\n <div className={styles.panels}>\n <section role=\"tabpanel\" className={styles.panel}>\n {children}\n </section>\n </div>\n </div>\n );\n};\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles, stateSprinkles } from '../../theme/sprinkles.css.js';\nimport { vars } from '../../theme/themeContract.js';\n\nexport const tile = sprinkles({\n width: 'full',\n borderRadius: '2xl',\n backgroundColor: 'black-10',\n padding: 6,\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n boxShadow: 'sm',\n});\n\nexport const interactive = style([\n sprinkles({\n transitionProperty: 'default',\n transitionDuration: 160,\n transitionTimingFunction: 'ease',\n }),\n stateSprinkles({\n boxShadow: {\n hover: 'md',\n },\n }),\n {\n ':hover': {\n transform: 'translateY(-2px)',\n },\n ':focus-visible': {\n outline: `2px solid ${vars.colors['blue-500']}`,\n outlineOffset: '2px',\n },\n },\n]);\n\nexport const interactiveLink = sprinkles({\n textDecoration: 'none',\n width: 'full',\n display: 'inline-flex',\n});\n\nexport const interactiveButton = sprinkles({\n all: 'unset',\n cursor: 'pointer',\n display: 'inline-flex',\n width: 'full',\n});\n\nexport const header = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: 3,\n});\n\nexport const headingGroup = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n minWidth: 0,\n});\n\nexport const title = sprinkles({\n fontSize: 'xl',\n lineHeight: 1.4,\n fontWeight: 'semibold',\n color: 'text',\n margin: 0,\n});\n\nexport const subtitle = sprinkles({\n margin: 0,\n fontSize: 'sm',\n fontWeight: 'extrabold',\n});\n\nexport const meta = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n display: 'flex',\n flexWrap: 'wrap',\n gap: 2,\n});\n\nexport const body = sprinkles({\n fontSize: 'base',\n color: 'text',\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n\nexport const footer = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n gap: 3,\n alignItems: 'center',\n justifyContent: 'space-between',\n fontSize: 'sm',\n color: 'textSecondary',\n});\n\nexport const actions = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n marginLeft: 'auto',\n});\n","import { type JSX, type ReactNode } from 'react';\nimport { Link } from '@plumile/router';\n\nimport * as styles from './InfoTile.css.js';\nimport { cx } from '../../theme/tools.js';\n\ntype InteractiveConfig =\n | {\n ariaLabel: string;\n href: string;\n onClick?: () => void;\n }\n | {\n ariaLabel: string;\n href?: undefined;\n onClick: () => void;\n };\n\nexport type InfoTileProps = {\n title?: ReactNode;\n subtitle?: ReactNode;\n meta?: ReactNode;\n body?: ReactNode;\n footer?: ReactNode;\n actions?: ReactNode;\n children?: ReactNode;\n interactive?: InteractiveConfig;\n};\n\nconst renderTitle = (value: ReactNode | undefined): ReactNode => {\n if (value == null) {\n return null;\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n return <p className={styles.title}>{value}</p>;\n }\n\n return <div className={styles.title}>{value}</div>;\n};\n\nconst renderSubtitle = (value: ReactNode | undefined): ReactNode => {\n if (value == null) {\n return null;\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n return <p className={styles.subtitle}>{value}</p>;\n }\n\n return <div className={styles.subtitle}>{value}</div>;\n};\n\nexport const InfoTile = (props: InfoTileProps): JSX.Element => {\n const {\n actions,\n body,\n children,\n footer,\n interactive,\n meta,\n subtitle,\n title,\n } = props;\n\n let headerActionsNode: JSX.Element | null = null;\n if (actions != null) {\n headerActionsNode = <div className={styles.actions}>{actions}</div>;\n }\n\n let metaNode: JSX.Element | null = null;\n if (meta != null) {\n metaNode = <div className={styles.meta}>{meta}</div>;\n }\n\n let footerNode: JSX.Element | null = null;\n if (footer != null) {\n footerNode = <div className={styles.footer}>{footer}</div>;\n }\n\n const content = (\n <article\n className={cx(styles.tile, {\n [styles.interactive]: interactive != null,\n })}\n >\n {(title != null || subtitle != null || actions != null) && (\n <div className={styles.header}>\n <div className={styles.headingGroup}>\n {renderTitle(title)}\n {renderSubtitle(subtitle)}\n </div>\n {headerActionsNode}\n </div>\n )}\n\n {metaNode}\n\n {(body != null || children != null) && (\n <div className={styles.body}>\n {body}\n {children}\n </div>\n )}\n\n {footerNode}\n </article>\n );\n\n if (interactive == null) {\n return content;\n }\n\n if (interactive.href != null) {\n return (\n <Link\n to={interactive.href}\n aria-label={interactive.ariaLabel}\n className={styles.interactiveLink}\n onClick={interactive.onClick}\n >\n {content}\n </Link>\n );\n }\n\n return (\n <button\n type=\"button\"\n aria-label={interactive.ariaLabel}\n className={styles.interactiveButton}\n onClick={interactive.onClick}\n >\n {content}\n </button>\n );\n};\n","import { sprinkles } from '../../theme/sprinkles.css.js';\n\nexport const singleLineCell = sprinkles({\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n minWidth: 0,\n});\n\nexport const bodyViewport = sprinkles({\n position: 'relative',\n});\n\nexport const spacer = sprinkles({\n width: 'full',\n});\n\nexport const sentinel = sprinkles({\n width: 'full',\n height: 1,\n});\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type JSX,\n} from 'react';\n\nimport type { DataTableBreakpoint } from './tableBreakpoints.js';\nimport type { DataTableColumn, DataTableKind, GetRowId } from './DataTable.js';\nimport * as dataTableStyles from './DataTable.css.js';\nimport * as styles from './VirtualizedConnectionTable.css.js';\n\nimport { cx } from '../../theme/tools.js';\nimport { useUiTranslation } from '../../i18n/useUiTranslation.js';\nimport type { SlotClasses } from '../../styles/slots.js';\n\nexport type VirtualizationConfig = {\n enabled: boolean;\n rowHeightPx: number;\n overscan: number;\n};\n\nexport type InfiniteScrollConfig = {\n enabled: boolean;\n thresholdPx?: number;\n autoLoad?: boolean;\n};\n\ntype DataTableSlot =\n | 'container'\n | 'header'\n | 'headerRow'\n | 'headerCell'\n | 'primaryHeaderCell'\n | 'body'\n | 'row'\n | 'rowEven'\n | 'rowOdd'\n | 'cell'\n | 'primaryCell'\n | 'emptyRow'\n | 'emptyCell';\n\nexport type VirtualizedConnectionTableProps<Row> = {\n columns: readonly DataTableColumn<Row>[];\n rows: readonly Row[];\n getRowId: GetRowId<Row>;\n emptyState?: JSX.Element;\n className?: string;\n gridTemplateColumns?: string;\n kind?: DataTableKind;\n classes?: SlotClasses<DataTableSlot>;\n\n virtualization?: VirtualizationConfig;\n\n infiniteScroll?: InfiniteScrollConfig;\n hasNextPage?: boolean;\n isLoadingMore?: boolean;\n onLoadMore?: () => void;\n};\n\nconst DEFAULT_TEMPLATE_CELL = 'minmax(0, 1fr)';\n\nconst buildInlineTemplate = (\n columnCount: number,\n gridTemplateColumns?: string,\n): CSSProperties => {\n if (typeof gridTemplateColumns === 'string' && gridTemplateColumns !== '') {\n return { gridTemplateColumns };\n }\n return {\n gridTemplateColumns: `repeat(${columnCount}, ${DEFAULT_TEMPLATE_CELL})`,\n };\n};\n\nconst getVisibilityClass = (minVisibleAt?: DataTableBreakpoint) => {\n if (minVisibleAt == null) {\n return null;\n }\n return dataTableStyles.hideBelowRecipe({ minVisibleAt });\n};\n\nconst findScrollParent = (el: HTMLElement | null): HTMLElement | null => {\n let current: HTMLElement | null = el;\n while (current != null) {\n const style = window.getComputedStyle(current);\n const { overflowY } = style;\n if (\n overflowY === 'auto' ||\n overflowY === 'scroll' ||\n overflowY === 'overlay'\n ) {\n return current;\n }\n current = current.parentElement;\n }\n return null;\n};\n\ntype VirtualWindow = {\n startIndex: number;\n endIndex: number;\n};\n\nconst clamp = (value: number, min: number, max: number): number => {\n return Math.min(max, Math.max(min, value));\n};\n\nexport const VirtualizedConnectionTable = <Row,>({\n columns,\n rows,\n getRowId,\n emptyState,\n className,\n gridTemplateColumns,\n kind,\n classes,\n virtualization,\n infiniteScroll,\n hasNextPage = false,\n isLoadingMore = false,\n onLoadMore,\n}: VirtualizedConnectionTableProps<Row>): JSX.Element => {\n const { t } = useUiTranslation();\n const resolvedKind: DataTableKind = kind ?? 'default';\n const containerRef = useRef<HTMLDivElement>(null);\n const bodyRef = useRef<HTMLDivElement>(null);\n const sentinelRef = useRef<HTMLDivElement>(null);\n const scrollParentRef = useRef<HTMLElement | null>(null);\n const rafRef = useRef<number | null>(null);\n const loadMoreCooldownRef = useRef(false);\n\n const isVirtualized = virtualization?.enabled === true;\n const rowHeightPx = useMemo(() => {\n if (!isVirtualized) {\n return null;\n }\n\n const configuredRowHeight = virtualization.rowHeightPx;\n if (\n typeof configuredRowHeight === 'number' &&\n Number.isFinite(configuredRowHeight) &&\n configuredRowHeight > 0\n ) {\n return configuredRowHeight;\n }\n\n return 56;\n }, [isVirtualized, virtualization]);\n\n const overscan = useMemo(() => {\n if (!isVirtualized) {\n return 0;\n }\n\n let nextOverscan = 10;\n const configuredOverscan = virtualization.overscan;\n if (\n typeof configuredOverscan === 'number' &&\n Number.isFinite(configuredOverscan)\n ) {\n nextOverscan = configuredOverscan;\n }\n return Math.max(0, nextOverscan);\n }, [isVirtualized, virtualization]);\n\n const thresholdPx = infiniteScroll?.thresholdPx ?? 800;\n const autoLoad = infiniteScroll?.autoLoad ?? true;\n const infiniteEnabled = infiniteScroll?.enabled === true;\n\n const canLoadMore =\n infiniteEnabled && hasNextPage && !isLoadingMore && onLoadMore != null;\n\n const triggerLoadMore = useCallback(() => {\n if (onLoadMore == null) {\n return;\n }\n onLoadMore();\n }, [onLoadMore]);\n\n const [windowState, setWindowState] = useState<VirtualWindow>(() => {\n return { startIndex: 0, endIndex: Math.min(rows.length, 50) };\n });\n\n const inlineTemplateStyle = useMemo(() => {\n return buildInlineTemplate(columns.length, gridTemplateColumns);\n }, [columns.length, gridTemplateColumns]);\n\n const renderRow = useCallback(\n (row: Row, index: number, heightPx?: number | null): JSX.Element => {\n const rowId = getRowId(row, index);\n const rowClasses = [\n dataTableStyles.row({ kind: resolvedKind }),\n classes?.row,\n ];\n if (index % 2 === 0) {\n rowClasses.push(\n dataTableStyles.rowEven({ kind: resolvedKind }),\n classes?.rowEven,\n );\n } else {\n rowClasses.push(\n dataTableStyles.rowOdd({ kind: resolvedKind }),\n classes?.rowOdd,\n );\n }\n const rowStyle: CSSProperties = { ...inlineTemplateStyle };\n if (typeof heightPx === 'number') {\n rowStyle.height = heightPx;\n }\n return (\n <div\n key={rowId}\n role=\"row\"\n className={cx(...rowClasses)}\n style={rowStyle}\n >\n {columns.map((column) => {\n const cellClasses = [\n dataTableStyles.cell({ kind: resolvedKind }),\n styles.singleLineCell,\n classes?.cell,\n ];\n const visibilityClass = getVisibilityClass(column.minVisibleAt);\n if (visibilityClass != null) {\n cellClasses.push(visibilityClass);\n }\n if (column.className != null) {\n cellClasses.push(column.className);\n }\n if (column.isPrimary) {\n cellClasses.push(\n dataTableStyles.primaryCell,\n classes?.primaryCell,\n );\n }\n return (\n <div key={column.id} role=\"cell\" className={cx(...cellClasses)}>\n {column.cell(row)}\n </div>\n );\n })}\n </div>\n );\n },\n [classes, columns, getRowId, inlineTemplateStyle, resolvedKind],\n );\n\n const computeVirtualWindow = useCallback(() => {\n if (!isVirtualized) {\n return;\n }\n const height = rowHeightPx;\n if (height == null) {\n return;\n }\n const bodyEl = bodyRef.current;\n if (bodyEl == null) {\n return;\n }\n\n const scrollParent = scrollParentRef.current;\n const viewportHeight = scrollParent?.clientHeight ?? window.innerHeight;\n const parentRectTop = scrollParent?.getBoundingClientRect().top ?? 0;\n const bodyRectTop = bodyEl.getBoundingClientRect().top;\n const relativeTop = bodyRectTop - parentRectTop;\n const visibleTop = Math.max(0, -relativeTop);\n const visibleBottom = visibleTop + viewportHeight;\n\n const totalHeight = rows.length * height;\n const clampedBottom = clamp(visibleBottom, 0, totalHeight);\n const clampedTop = clamp(visibleTop, 0, totalHeight);\n\n const rawStart = Math.floor(clampedTop / height) - overscan;\n const rawEnd = Math.ceil(clampedBottom / height) + overscan;\n\n const startIndex = clamp(rawStart, 0, rows.length);\n const endIndex = clamp(rawEnd, startIndex, rows.length);\n\n setWindowState((prev) => {\n if (prev.startIndex === startIndex && prev.endIndex === endIndex) {\n return prev;\n }\n return { startIndex, endIndex };\n });\n\n if (\n autoLoad &&\n canLoadMore &&\n totalHeight - clampedBottom <= thresholdPx &&\n !loadMoreCooldownRef.current\n ) {\n loadMoreCooldownRef.current = true;\n triggerLoadMore();\n window.setTimeout(() => {\n loadMoreCooldownRef.current = false;\n }, 250);\n }\n }, [\n autoLoad,\n canLoadMore,\n isVirtualized,\n overscan,\n rowHeightPx,\n rows.length,\n thresholdPx,\n triggerLoadMore,\n ]);\n\n const scheduleCompute = useCallback(() => {\n if (rafRef.current != null) {\n return;\n }\n rafRef.current = window.requestAnimationFrame(() => {\n rafRef.current = null;\n computeVirtualWindow();\n });\n }, [computeVirtualWindow]);\n\n useLayoutEffect(() => {\n if (!isVirtualized) {\n return;\n }\n const container = containerRef.current;\n if (container == null) {\n return;\n }\n scrollParentRef.current = findScrollParent(container);\n scheduleCompute();\n }, [isVirtualized, scheduleCompute]);\n\n useEffect(() => {\n if (!isVirtualized) {\n return undefined;\n }\n const scrollParent = scrollParentRef.current;\n const target: HTMLElement | Window = scrollParent ?? window;\n\n const handler = () => {\n scheduleCompute();\n };\n\n target.addEventListener('scroll', handler, { passive: true });\n window.addEventListener('resize', handler);\n\n return () => {\n target.removeEventListener('scroll', handler);\n window.removeEventListener('resize', handler);\n };\n }, [isVirtualized, scheduleCompute]);\n\n useEffect(() => {\n if (isVirtualized) {\n return undefined;\n }\n if (!infiniteEnabled || !autoLoad || !canLoadMore) {\n return undefined;\n }\n const sentinel = sentinelRef.current;\n if (sentinel == null) {\n return undefined;\n }\n\n const scrollParent = scrollParentRef.current;\n\n const observer = new IntersectionObserver(\n (entries) => {\n const [entry] = entries;\n if (entry == null) {\n return;\n }\n\n if (entry.isIntersecting && !loadMoreCooldownRef.current) {\n loadMoreCooldownRef.current = true;\n triggerLoadMore();\n window.setTimeout(() => {\n loadMoreCooldownRef.current = false;\n }, 250);\n }\n },\n {\n root: scrollParent,\n rootMargin: `0px 0px ${thresholdPx}px 0px`,\n },\n );\n\n observer.observe(sentinel);\n return () => {\n observer.disconnect();\n };\n }, [\n autoLoad,\n canLoadMore,\n infiniteEnabled,\n isVirtualized,\n thresholdPx,\n triggerLoadMore,\n ]);\n\n useLayoutEffect(() => {\n if (isVirtualized) {\n return;\n }\n const container = containerRef.current;\n if (container == null) {\n return;\n }\n scrollParentRef.current = findScrollParent(container);\n }, [isVirtualized]);\n\n const headerRow = (\n <div\n className={cx(\n dataTableStyles.header({ kind: resolvedKind }),\n classes?.header,\n )}\n role=\"rowgroup\"\n >\n <div\n className={cx(dataTableStyles.headerRow, classes?.headerRow)}\n role=\"row\"\n style={inlineTemplateStyle}\n >\n {columns.map((column) => {\n const headerClasses = [\n dataTableStyles.headerCell({ kind: resolvedKind }),\n classes?.headerCell,\n ];\n const visibilityClass = getVisibilityClass(column.minVisibleAt);\n if (visibilityClass != null) {\n headerClasses.push(visibilityClass);\n }\n if (column.className != null) {\n headerClasses.push(column.className);\n }\n if (column.isPrimary) {\n headerClasses.push(\n dataTableStyles.primaryHeaderCell,\n classes?.primaryHeaderCell,\n );\n }\n return (\n <div\n key={column.id}\n role=\"columnheader\"\n className={cx(...headerClasses)}\n >\n {column.header}\n </div>\n );\n })}\n </div>\n </div>\n );\n\n let bodyRows: JSX.Element;\n if (rows.length === 0) {\n bodyRows = (\n <div\n className={cx(dataTableStyles.emptyRow, classes?.emptyRow)}\n role=\"row\"\n >\n <div role=\"cell\">\n {emptyState ?? (\n <div className={cx(dataTableStyles.emptyCell, classes?.emptyCell)}>\n {t('common.table.empty')}\n </div>\n )}\n </div>\n </div>\n );\n } else if (isVirtualized && rowHeightPx != null) {\n const { startIndex, endIndex } = windowState;\n const topSpacerHeight = startIndex * rowHeightPx;\n const bottomSpacerHeight = (rows.length - endIndex) * rowHeightPx;\n const slice = rows.slice(startIndex, endIndex);\n bodyRows = (\n <div className={styles.bodyViewport} ref={bodyRef}>\n <div className={styles.spacer} style={{ height: topSpacerHeight }} />\n {slice.map((row, sliceIndex) => {\n const absoluteIndex = startIndex + sliceIndex;\n return renderRow(row, absoluteIndex, rowHeightPx);\n })}\n <div className={styles.spacer} style={{ height: bottomSpacerHeight }} />\n </div>\n );\n } else {\n bodyRows = (\n <div ref={bodyRef}>\n {rows.map((row, index) => {\n return renderRow(row, index, null);\n })}\n </div>\n );\n }\n\n let sentinelNode: JSX.Element | null = null;\n if (!isVirtualized && infiniteEnabled && autoLoad) {\n sentinelNode = <div ref={sentinelRef} className={styles.sentinel} />;\n }\n\n return (\n <div\n ref={containerRef}\n className={cx(\n dataTableStyles.container({ kind: resolvedKind }),\n classes?.container,\n className,\n )}\n role=\"table\"\n >\n {headerRow}\n <div\n className={cx(\n dataTableStyles.body({ kind: resolvedKind }),\n classes?.body,\n )}\n role=\"rowgroup\"\n >\n {bodyRows}\n {sentinelNode}\n </div>\n </div>\n );\n};\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const root = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n});\n\nexport const value = sprinkles({\n overflow: 'hidden',\n fontSize: 'sm',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: 'md',\n});\n\nexport const valueNoTruncate = sprinkles({\n maxWidth: 'none',\n whiteSpace: 'normal',\n overflow: 'visible',\n textOverflow: 'clip',\n});\n\nexport const feedback = sprinkles({\n fontSize: 'xs',\n // color: 'slate-500',\n});\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type JSX,\n} from 'react';\n\nimport { Button, cx } from '@plumile/ui';\n\nimport * as styles from './copyableText.css.js';\n\nexport type CopyableTextProps = {\n value: string;\n copyValue?: string;\n className?: string;\n truncate?: boolean;\n copyLabel?: string;\n copiedLabel?: string;\n};\n\nconst copyWithExecCommand = (text: string): boolean => {\n try {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.setAttribute('readonly', 'true');\n textarea.style.position = 'fixed';\n textarea.style.top = '-1000px';\n textarea.style.left = '-1000px';\n document.body.appendChild(textarea);\n textarea.select();\n const ok = document.execCommand('copy');\n document.body.removeChild(textarea);\n return ok;\n } catch {\n return false;\n }\n};\n\nexport const CopyableText = ({\n value,\n copyValue,\n className,\n truncate = true,\n copyLabel = 'Copy',\n copiedLabel = 'Copied',\n}: CopyableTextProps): JSX.Element => {\n const [copied, setCopied] = useState(false);\n const timeoutRef = useRef<number | null>(null);\n\n const resolvedCopyValue = copyValue ?? value;\n\n const displayClassName = useMemo(() => {\n let noTruncateClass: string | null = null;\n if (!truncate) {\n noTruncateClass = styles.valueNoTruncate;\n }\n return cx(styles.value, noTruncateClass, className);\n }, [className, truncate]);\n\n const clearTimer = useCallback(() => {\n if (timeoutRef.current != null) {\n window.clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n }, []);\n\n useEffect(() => {\n return () => {\n clearTimer();\n };\n }, [clearTimer]);\n\n const handleCopy = useCallback(async () => {\n clearTimer();\n let ok = false;\n try {\n if (typeof navigator !== 'undefined') {\n const { clipboard } = navigator;\n await clipboard.writeText(resolvedCopyValue);\n ok = true;\n }\n } catch {\n ok = false;\n }\n\n if (!ok) {\n ok = copyWithExecCommand(resolvedCopyValue);\n }\n\n if (ok) {\n setCopied(true);\n timeoutRef.current = window.setTimeout(() => {\n setCopied(false);\n timeoutRef.current = null;\n }, 1400);\n }\n }, [clearTimer, resolvedCopyValue]);\n\n const handleCopyClick = () => {\n handleCopy().catch(() => {});\n };\n\n let feedbackNode: JSX.Element | null = null;\n if (copied) {\n feedbackNode = (\n <span className={styles.feedback} role=\"status\" aria-live=\"polite\">\n {copiedLabel}\n </span>\n );\n }\n\n return (\n <span className={styles.root}>\n <span className={displayClassName} title={value}>\n {value}\n </span>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={handleCopyClick}\n >\n {copyLabel}\n </Button>\n {feedbackNode}\n </span>\n );\n};\n\nexport default CopyableText;\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const container = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n minWidth: 0,\n});\n","import { type JSX } from 'react';\n\nimport { CopyableText } from '../copyable_text/CopyableText.js';\n\nimport * as styles from './backofficeIdBadge.css.js';\n\nexport type BackofficeIdBadgeProps = {\n id: string;\n className?: string;\n copyLabel?: string;\n copiedLabel?: string;\n truncate?: boolean;\n};\n\nexport const BackofficeIdBadge = ({\n id,\n className,\n copyLabel = 'Copy ID',\n copiedLabel = 'Copied',\n truncate = true,\n}: BackofficeIdBadgeProps): JSX.Element => {\n return (\n <span className={styles.container}>\n <CopyableText\n value={id}\n className={className}\n copyLabel={copyLabel}\n copiedLabel={copiedLabel}\n truncate={truncate}\n />\n </span>\n );\n};\n\nexport default BackofficeIdBadge;\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const label = sprinkles({\n textTransform: 'uppercase',\n});\n","import { type JSX } from 'react';\n\nimport { Badge } from '@plumile/ui';\n\nimport * as styles from './environmentBadge.css.js';\n\nexport type EnvironmentBadgeEnvironment = 'dev' | 'staging' | 'prod';\n\nexport type EnvironmentBadgeProps = {\n environment: EnvironmentBadgeEnvironment;\n className?: string;\n label?: string;\n};\n\ntype BadgeTone =\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'danger'\n | 'accent';\n\nconst badgeToneMap: Record<EnvironmentBadgeEnvironment, BadgeTone> = {\n dev: 'neutral',\n staging: 'warning',\n prod: 'danger',\n};\n\nconst defaultLabelMap: Record<EnvironmentBadgeEnvironment, string> = {\n dev: 'DEV',\n staging: 'STAGING',\n prod: 'PROD',\n};\n\nexport const EnvironmentBadge = ({\n environment,\n className,\n label,\n}: EnvironmentBadgeProps): JSX.Element => {\n const badgeTone = badgeToneMap[environment];\n const resolvedLabel = label ?? defaultLabelMap[environment];\n\n return (\n <Badge tone={badgeTone} className={className}>\n <span className={styles.label}>{resolvedLabel}</span>\n </Badge>\n );\n};\n\nexport default EnvironmentBadge;\n","import { sprinkles } from '../../../theme/index.js';\n// import { vars } from '../../../theme/index.js';\n\nexport const container = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 1,\n});\n\nexport const key = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n paddingX: 1.5,\n paddingY: 0.5,\n borderRadius: 'sm',\n fontSize: '2xs',\n fontWeight: 'medium',\n lineHeight: 'none',\n});\n","import { type JSX } from 'react';\n\nimport * as styles from './shortcutHint.css.js';\nimport { cx } from '@plumile/ui';\n\nexport type ShortcutHintProps = {\n keys: readonly string[] | string;\n className?: string;\n};\n\nexport const ShortcutHint = ({\n keys,\n className,\n}: ShortcutHintProps): JSX.Element => {\n let parts: string[] = [];\n if (typeof keys === 'string') {\n parts = keys.split(' ');\n } else {\n parts = [...keys];\n }\n\n return (\n <span className={cx(styles.container, className)} aria-hidden=\"true\">\n {parts.map((part, index) => {\n return (\n <kbd key={`${part}-${index}`} className={styles.key}>\n {part}\n </kbd>\n );\n })}\n </span>\n );\n};\n\nexport default ShortcutHint;\n","import { keyframes, style } from '@vanilla-extract/css';\n\nimport { sprinkles } from '../../../theme/index.js';\n\nconst shimmer = keyframes({\n '0%': { backgroundPosition: '100% 0' },\n '100%': { backgroundPosition: '-100% 0' },\n});\n\nexport const base = style([\n sprinkles({\n display: 'block',\n borderRadius: 'md',\n backgroundSize: 'skeleton',\n willChange: 'background-position',\n }),\n {\n animation: `${shimmer} 1.1s ease-in-out infinite`,\n },\n]);\n\nexport const variant = {\n text: sprinkles({ borderRadius: 'sm' }),\n block: sprinkles({ borderRadius: 'md' }),\n circle: sprinkles({ borderRadius: 'full' }),\n} as const;\n\nexport const linesContainer = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n","import { type CSSProperties, type JSX } from 'react';\n\nimport * as styles from './skeleton.css.js';\nimport { cx } from '@plumile/ui';\n\nexport type SkeletonVariant = 'text' | 'block' | 'circle';\n\nexport type SkeletonProps = {\n variant?: SkeletonVariant;\n width?: number | string;\n height?: number | string;\n className?: string;\n style?: CSSProperties;\n lines?: number;\n};\n\nconst toCssSize = (value: number | string | undefined): string | undefined => {\n if (value == null) {\n return undefined;\n }\n if (typeof value === 'number') {\n return `${value}px`;\n }\n return value;\n};\n\nconst defaultHeightForVariant = (variant: SkeletonVariant): string => {\n if (variant === 'text') {\n return '0.875rem';\n }\n if (variant === 'circle') {\n return '2.25rem';\n }\n return '6rem';\n};\n\nexport const Skeleton = ({\n variant = 'text',\n width,\n height,\n className,\n style,\n lines,\n}: SkeletonProps): JSX.Element => {\n const resolvedHeight = toCssSize(height) ?? defaultHeightForVariant(variant);\n const resolvedWidth = toCssSize(width);\n\n const baseStyle: CSSProperties = {\n width: resolvedWidth,\n height: resolvedHeight,\n ...style,\n };\n\n const shouldRenderLines = variant === 'text' && (lines ?? 1) > 1;\n\n if (!shouldRenderLines) {\n return (\n <span\n aria-hidden=\"true\"\n className={cx(styles.base, styles.variant[variant], className)}\n style={baseStyle}\n />\n );\n }\n\n const count = Math.max(1, lines ?? 1);\n\n return (\n <span aria-hidden=\"true\" className={styles.linesContainer}>\n {Array.from({ length: count }, (_, index) => {\n const isLast = index === count - 1;\n let lineWidth = resolvedWidth ?? '100%';\n if (isLast) {\n lineWidth = '70%';\n }\n return (\n <span\n key={`line-${index}`}\n className={cx(styles.base, styles.variant.text, className)}\n style={{\n ...baseStyle,\n width: lineWidth,\n height: resolvedHeight,\n }}\n />\n );\n })}\n </span>\n );\n};\n\nexport default Skeleton;\n","import { keyframes, style } from '@vanilla-extract/css';\n\nimport { sprinkles } from '../../../theme/index.js';\n// import { vars } from '../../../theme/index.js';\n\nconst spin = keyframes({\n to: { transform: 'rotate(360deg)' },\n});\n\nexport const root = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n});\n\nexport const icon = style({\n animation: `${spin} 0.9s linear infinite`,\n // color: vars.colors['slate-600'],\n});\n","import { type JSX } from 'react';\n\nimport { ButtonLoadingSpinnerSvg } from '../../../icons/ButtonLoadingSpinnerSvg.js';\n\nimport * as styles from './spinner.css.js';\nimport { cx } from '@plumile/ui';\n\nexport type SpinnerProps = {\n size?: number;\n className?: string;\n ariaLabel?: string;\n};\n\nexport const Spinner = ({\n size = 18,\n className,\n ariaLabel = 'Loading',\n}: SpinnerProps): JSX.Element => {\n return (\n <span\n className={cx(styles.root, className)}\n role=\"status\"\n aria-label={ariaLabel}\n >\n <ButtonLoadingSpinnerSvg\n className={styles.icon}\n width={size}\n height={size}\n />\n </span>\n );\n};\n\nexport default Spinner;\n","import { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/index.js';\n\nconst rootBase = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 1,\n paddingY: 1,\n paddingX: 2,\n borderRadius: 'full',\n fontSize: 'xs',\n fontWeight: 'medium',\n});\n\nconst toneNeutral = sprinkles({ backgroundColor: 'brandLightGray' });\nconst toneInfo = sprinkles({\n backgroundColor: 'primaryLight',\n color: 'brandPrimaryRed',\n});\nconst toneSuccess = sprinkles({\n backgroundColor: 'green-100',\n color: 'green-700',\n});\nconst toneWarning = sprinkles({\n backgroundColor: 'amber-100',\n color: 'amber-700',\n});\nconst toneDanger = sprinkles({\n backgroundColor: 'red-100',\n color: 'red-700',\n});\n\nexport const rootRecipe = recipe({\n base: rootBase,\n variants: {\n tone: {\n neutral: toneNeutral,\n info: toneInfo,\n success: toneSuccess,\n warning: toneWarning,\n danger: toneDanger,\n },\n },\n defaultVariants: {\n tone: 'neutral',\n },\n});\n\nexport type RootRecipeVariants = RecipeVariants<typeof rootRecipe>;\n\nexport const removeButton = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: 'full',\n borderWidth: 0,\n borderStyle: 'none',\n backgroundColor: 'transparent',\n color: 'inherit',\n padding: 0,\n cursor: 'pointer',\n});\n","import { type JSX, type ReactNode, useId } from 'react';\nimport type { RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { ModalCloseSvg } from '../../../icons/ModalCloseSvg.js';\n\nimport * as styles from './tag.css.js';\nimport { cx } from '@plumile/ui';\n\nexport type TagTone = NonNullable<\n NonNullable<RecipeVariants<typeof styles.rootRecipe>>['tone']\n>;\n\nexport type TagProps = {\n children: ReactNode;\n tone?: TagTone;\n className?: string;\n onRemove?: () => void;\n removeLabel?: string;\n};\n\nexport const Tag = ({\n children,\n tone = 'neutral',\n className,\n onRemove,\n removeLabel = 'Remove',\n}: TagProps): JSX.Element => {\n const labelId = useId();\n const isRemovable = typeof onRemove === 'function';\n\n let removeButtonNode: JSX.Element | null = null;\n if (isRemovable) {\n removeButtonNode = (\n <button\n type=\"button\"\n className={styles.removeButton}\n onClick={onRemove}\n aria-label={removeLabel}\n aria-describedby={labelId}\n >\n <ModalCloseSvg width={14} height={14} aria-hidden=\"true\" />\n </button>\n );\n }\n\n return (\n <span className={cx(styles.rootRecipe({ tone }), className)}>\n <span id={labelId}>{children}</span>\n {removeButtonNode}\n </span>\n );\n};\n\nexport default Tag;\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n});\n\nexport const header = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n\nexport const layout = sprinkles({\n display: 'grid',\n gridTemplateColumns: {\n base: 'detailAside320',\n lg: 'detailSingle',\n },\n alignItems: 'flex-start',\n gap: 4,\n});\n\nexport const primary = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n minWidth: 0,\n});\n\nexport const secondary = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const stacked = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n});\n","import { type JSX, type ReactNode } from 'react';\nimport { cx } from '@plumile/ui';\n\nimport * as styles from './backofficeDetailLayout.css.js';\n\nexport type BackofficeDetailLayoutProps = {\n header: ReactNode;\n content: ReactNode;\n aside?: ReactNode;\n className?: string;\n};\n\nexport const BackofficeDetailLayout = ({\n header,\n content,\n aside,\n className,\n}: BackofficeDetailLayoutProps): JSX.Element => {\n let headerNode: JSX.Element | null = null;\n if (header != null) {\n headerNode = <div className={styles.header}>{header}</div>;\n }\n\n if (aside == null) {\n return (\n <div className={cx(styles.container, className)}>\n {headerNode}\n <div className={styles.stacked}>{content}</div>\n </div>\n );\n }\n\n return (\n <div className={cx(styles.container, className)}>\n {headerNode}\n <div className={styles.layout}>\n <div className={styles.primary}>{content}</div>\n <aside className={styles.secondary}>{aside}</aside>\n </div>\n </div>\n );\n};\n\nexport default BackofficeDetailLayout;\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n textAlign: 'center',\n paddingY: 6,\n paddingX: 4,\n gap: 2,\n color: 'textSecondary',\n});\n\nexport const icon = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'textSecondary',\n});\n\nexport const title = sprinkles({\n fontSize: 'base',\n fontWeight: 'semibold',\n color: 'text',\n});\n\nexport const description = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n});\n\nexport const actions = sprinkles({\n marginTop: 2,\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n justifyContent: 'center',\n});\n","import { type JSX, type ReactNode } from 'react';\nimport { cx } from '@plumile/ui';\n\nimport * as styles from './backofficeEmptyState.css.js';\n\nexport type BackofficeEmptyStateProps = {\n title: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n icon?: ReactNode;\n className?: string;\n};\n\nexport const BackofficeEmptyState = ({\n title,\n description,\n actions,\n icon,\n className,\n}: BackofficeEmptyStateProps): JSX.Element => {\n let descriptionNode: JSX.Element | null = null;\n if (description != null) {\n descriptionNode = <div className={styles.description}>{description}</div>;\n }\n\n let actionsNode: JSX.Element | null = null;\n if (actions != null) {\n actionsNode = <div className={styles.actions}>{actions}</div>;\n }\n\n let iconNode: JSX.Element | null = null;\n if (icon != null) {\n iconNode = <div className={styles.icon}>{icon}</div>;\n }\n\n return (\n <div className={cx(styles.container, className)}>\n {iconNode}\n <div className={styles.title}>{title}</div>\n {descriptionNode}\n {actionsNode}\n </div>\n );\n};\n\nexport default BackofficeEmptyState;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles, vars } from '../../../theme/index.js';\n\nexport const backdrop = style({\n position: 'fixed',\n inset: 0,\n backgroundColor: 'rgb(15 23 42 / 0.35)',\n zIndex: vars.zIndex.modal,\n});\n\nexport const drawerContainer = sprinkles({\n position: 'fixed',\n inset: 0,\n display: 'flex',\n justifyContent: 'flex-end',\n zIndex: 'modal',\n});\n\nexport const drawer = sprinkles({\n backgroundColor: 'surface',\n borderLeftColor: 'borderSubtle',\n borderLeftWidth: 'default',\n borderStyle: 'solid',\n boxShadow: 'xl',\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n height: 'full',\n maxWidth: '26rem',\n overflowY: 'auto',\n padding: 5,\n width: 'full',\n});\n\nexport const header = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 3,\n});\n\nexport const titleBlock = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n});\n\nexport const title = sprinkles({\n fontSize: 'xl',\n fontWeight: 'semibold',\n color: 'text',\n});\n\nexport const subtitle = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n});\n\nexport const closeButton = style({\n alignItems: 'center',\n backgroundColor: vars.colors.surfaceMuted,\n borderRadius: vars.borderRadius.full,\n borderStyle: 'none',\n borderWidth: 0,\n color: vars.colors.textSecondary,\n cursor: 'pointer',\n display: 'inline-flex',\n height: vars.height[8],\n justifyContent: 'center',\n transitionProperty: vars.transitionProperty.colors,\n transitionDuration: vars.transitionDuration[150],\n transitionTimingFunction: vars.transitionTimingFunction.ease,\n width: vars.width[8],\n selectors: {\n '&:hover': {\n backgroundColor: vars.colors.surfaceSecondary,\n color: vars.colors.text,\n },\n },\n});\n\nexport const searchRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n});\n\nexport const sections = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n});\n\nexport const section = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n\nexport const sectionHeader = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n});\n\nexport const sectionTitle = sprinkles({\n fontSize: 'xs',\n textTransform: 'uppercase',\n letterSpacing: 'caps',\n color: 'textMuted',\n fontWeight: 'semibold',\n});\n\nexport const sectionDescription = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n});\n\nexport const sectionItems = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n\nexport const sectionItem = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n});\n","import { useEffect, type ChangeEvent, type JSX, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTranslation } from 'react-i18next';\n\nimport { Button, Input } from '@plumile/ui';\nimport { ModalCloseSvg } from '../../../icons/ModalCloseSvg.js';\n\nimport * as styles from './backofficeFilterDrawer.css.js';\n\nexport type BackofficeFilterDrawerItem = {\n id: string;\n node: ReactNode;\n};\n\nexport type BackofficeFilterDrawerSection = {\n id: string;\n title: ReactNode;\n description?: ReactNode;\n items: readonly BackofficeFilterDrawerItem[];\n};\n\nexport type BackofficeFilterDrawerProps = {\n isOpen: boolean;\n title?: string;\n sections: readonly BackofficeFilterDrawerSection[];\n searchValue?: string;\n onSearchChange?: (value: string) => void;\n onClose: () => void;\n onReset?: () => void;\n};\n\nexport const BackofficeFilterDrawer = ({\n isOpen,\n title,\n sections,\n searchValue,\n onSearchChange,\n onClose,\n onReset,\n}: BackofficeFilterDrawerProps): JSX.Element | null => {\n const { t } = useTranslation('ui');\n const resolvedTitle = title ?? t('backoffice.filterDrawer.title');\n\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [isOpen, onClose]);\n\n if (!isOpen) {\n return null;\n }\n\n const totalCount = sections.reduce((total, section) => {\n return total + section.items.length;\n }, 0);\n\n let searchNode: JSX.Element | null = null;\n if (onSearchChange != null) {\n searchNode = (\n <Input\n value={searchValue ?? ''}\n onChange={(event: ChangeEvent<HTMLInputElement>) => {\n onSearchChange(event.target.value);\n }}\n placeholder={t('backoffice.filterDrawer.searchPlaceholder')}\n size=\"small\"\n fullWidth\n />\n );\n }\n\n let resetNode: JSX.Element | null = null;\n if (onReset != null) {\n resetNode = (\n <Button type=\"button\" variant=\"secondary\" size=\"small\" onClick={onReset}>\n {t('backoffice.filterDrawer.reset')}\n </Button>\n );\n }\n\n let ariaLabel = t('backoffice.filterDrawer.ariaLabel');\n if (typeof resolvedTitle === 'string') {\n ariaLabel = resolvedTitle;\n }\n\n const drawerContent = (\n <>\n <div className={styles.backdrop} onClick={onClose} />\n <div className={styles.drawerContainer} onClick={onClose}>\n <aside\n className={styles.drawer}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n onClick={(event) => {\n event.stopPropagation();\n }}\n >\n <div className={styles.header}>\n <div className={styles.titleBlock}>\n <div className={styles.title}>{resolvedTitle}</div>\n <div className={styles.subtitle}>\n {t('backoffice.filterDrawer.subtitle', { count: totalCount })}\n </div>\n </div>\n <button\n type=\"button\"\n className={styles.closeButton}\n onClick={onClose}\n aria-label={t('backoffice.filterDrawer.closeAriaLabel')}\n >\n <ModalCloseSvg width={18} height={18} aria-hidden=\"true\" />\n </button>\n </div>\n\n <div className={styles.searchRow}>\n {searchNode}\n {resetNode}\n </div>\n\n <div className={styles.sections}>\n {sections.map((section) => {\n let descriptionNode: JSX.Element | null = null;\n if (section.description != null) {\n descriptionNode = (\n <div className={styles.sectionDescription}>\n {section.description}\n </div>\n );\n }\n\n return (\n <section key={section.id} className={styles.section}>\n <div className={styles.sectionHeader}>\n <div className={styles.sectionTitle}>{section.title}</div>\n {descriptionNode}\n </div>\n <div className={styles.sectionItems}>\n {section.items.map((item) => {\n return (\n <div key={item.id} className={styles.sectionItem}>\n {item.node}\n </div>\n );\n })}\n </div>\n </section>\n );\n })}\n </div>\n </aside>\n </div>\n </>\n );\n\n if (typeof document === 'undefined') {\n return drawerContent;\n }\n\n return createPortal(drawerContent, document.body);\n};\n\nexport default BackofficeFilterDrawer;\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const field = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n padding: 3,\n borderRadius: 'lg',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n backgroundColor: 'surface',\n});\n\nexport const header = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n});\n\nexport const label = sprinkles({\n fontSize: 'xs',\n textTransform: 'uppercase',\n letterSpacing: 'caps',\n color: 'textMuted',\n fontWeight: 'semibold',\n});\n\nexport const description = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n});\n\nexport const control = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '@plumile/ui';\n\nimport * as styles from './backofficeFilterField.css.js';\n\nexport type BackofficeFilterFieldProps = {\n label: ReactNode;\n description?: ReactNode;\n children: ReactNode;\n className?: string;\n};\n\nexport const BackofficeFilterField = ({\n label,\n description,\n children,\n className,\n}: BackofficeFilterFieldProps): JSX.Element => {\n let descriptionNode: JSX.Element | null = null;\n if (description != null) {\n descriptionNode = <div className={styles.description}>{description}</div>;\n }\n\n return (\n <div className={cx(styles.field, className)}>\n <div className={styles.header}>\n <div className={styles.label}>{label}</div>\n {descriptionNode}\n </div>\n <div className={styles.control}>{children}</div>\n </div>\n );\n};\n\nexport default BackofficeFilterField;\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n width: 'full',\n});\n\nexport const topRow = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: {\n base: 'center',\n sm: 'stretch',\n },\n justifyContent: 'space-between',\n gap: 3,\n flexDirection: {\n base: 'row',\n sm: 'column',\n },\n});\n\nexport const left = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: 2,\n minWidth: 0,\n flex: 1,\n});\n\nexport const right = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const chipsRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n minWidth: 0,\n flexWrap: 'wrap',\n gap: 2,\n paddingTop: 2,\n borderTopWidth: 'default',\n borderStyle: 'solid',\n borderTopColor: 'borderLight',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '@plumile/ui';\n\nimport * as styles from './backofficeFiltersBar.css.js';\n\nexport type BackofficeFiltersBarProps = {\n leftSlot?: ReactNode;\n searchSlot?: ReactNode;\n quickFiltersSlot?: ReactNode;\n allFiltersSlot?: ReactNode;\n rightActions?: ReactNode;\n chipsSlot?: ReactNode;\n className?: string;\n};\n\nexport const BackofficeFiltersBar = ({\n leftSlot,\n searchSlot,\n quickFiltersSlot,\n allFiltersSlot,\n rightActions,\n chipsSlot,\n className,\n}: BackofficeFiltersBarProps): JSX.Element | null => {\n const showTop =\n leftSlot != null ||\n searchSlot != null ||\n quickFiltersSlot != null ||\n allFiltersSlot != null ||\n rightActions != null;\n\n const showChips = chipsSlot != null;\n\n if (!showTop && !showChips) {\n return null;\n }\n\n let chipsNode: JSX.Element | null = null;\n if (showChips) {\n chipsNode = <div className={styles.chipsRow}>{chipsSlot}</div>;\n }\n\n let topNode: JSX.Element | null = null;\n if (showTop) {\n topNode = (\n <div className={styles.topRow}>\n <div className={styles.left}>\n {leftSlot}\n {searchSlot}\n {quickFiltersSlot}\n {allFiltersSlot}\n </div>\n <div className={styles.right}>{rightActions}</div>\n </div>\n );\n }\n\n return (\n <div className={cx(styles.container, className)}>\n {topNode}\n {chipsNode}\n </div>\n );\n};\n\nexport default BackofficeFiltersBar;\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n padding: 4,\n borderRadius: 'lg',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n backgroundColor: 'surface',\n});\n\nexport const header = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n});\n\nexport const title = sprinkles({\n fontSize: 'base',\n fontWeight: 'semibold',\n color: 'text',\n margin: 0,\n});\n\nexport const description = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n margin: 0,\n});\n","import { type JSX, type ReactNode } from 'react';\nimport { cx } from '@plumile/ui';\n\nimport * as styles from './backofficeFormSection.css.js';\n\nexport type BackofficeFormSectionProps = {\n title?: string;\n description?: string;\n children: ReactNode;\n className?: string;\n};\n\nexport const BackofficeFormSection = ({\n title,\n description,\n children,\n className,\n}: BackofficeFormSectionProps): JSX.Element => {\n const hasHeader =\n (title != null && title.trim() !== '') ||\n (description != null && description.trim() !== '');\n\n return (\n <section className={cx(styles.container, className)}>\n {hasHeader && (\n <div className={styles.header}>\n {title != null && title.trim() !== '' && (\n <h3 className={styles.title}>{title}</h3>\n )}\n {description != null && description.trim() !== '' && (\n <p className={styles.description}>{description}</p>\n )}\n </div>\n )}\n {children}\n </section>\n );\n};\n\nexport default BackofficeFormSection;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const body = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const footer = sprinkles({\n display: 'flex',\n justifyContent: 'flex-end',\n gap: 3,\n});\n","import { useCallback, useState, type JSX, type ReactNode } from 'react';\n\nimport { Button } from '../../../atomic/atoms/button/Button.js';\nimport { ErrorMessage } from '../../../atomic/atoms/error_message/ErrorMessage.js';\nimport { Modal } from '../../../atomic/atoms/modal/Modal.js';\n\nimport * as styles from './confirmDialog.css.js';\n\nexport type ConfirmDialogProps = {\n isOpen: boolean;\n title: string;\n children: ReactNode;\n confirmLabel?: string;\n cancelLabel?: string;\n confirmTone?: 'default' | 'danger';\n onClose: () => void;\n onConfirm: () => Promise<void> | void;\n closeOnConfirm?: boolean;\n};\n\nexport const ConfirmDialog = ({\n isOpen,\n title,\n children,\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n confirmTone = 'default',\n onClose,\n onConfirm,\n closeOnConfirm = true,\n}: ConfirmDialogProps): JSX.Element | null => {\n const [isConfirming, setIsConfirming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const handleClose = useCallback(() => {\n if (isConfirming) {\n return;\n }\n setError(null);\n onClose();\n }, [isConfirming, onClose]);\n\n const handleConfirm = useCallback(async () => {\n if (isConfirming) {\n return;\n }\n setError(null);\n setIsConfirming(true);\n try {\n await onConfirm();\n if (closeOnConfirm) {\n onClose();\n }\n } catch (err) {\n let message = 'An unexpected error occurred.';\n if (err instanceof Error) {\n message = err.message;\n }\n setError(message);\n } finally {\n setIsConfirming(false);\n }\n }, [closeOnConfirm, isConfirming, onClose, onConfirm]);\n\n let confirmVariant: 'primary' | 'danger' = 'primary';\n if (confirmTone === 'danger') {\n confirmVariant = 'danger';\n }\n\n const handleConfirmClick = () => {\n handleConfirm().catch(() => {});\n };\n\n const footer = (\n <div className={styles.footer}>\n <Button\n type=\"button\"\n variant=\"secondary\"\n onClick={handleClose}\n disabled={isConfirming}\n >\n {cancelLabel}\n </Button>\n <Button\n type=\"button\"\n variant={confirmVariant}\n onClick={handleConfirmClick}\n isLoading={isConfirming}\n >\n {confirmLabel}\n </Button>\n </div>\n );\n\n let errorNode: JSX.Element | null = null;\n if (error != null) {\n errorNode = <ErrorMessage>{error}</ErrorMessage>;\n }\n\n return (\n <Modal isOpen={isOpen} onClose={handleClose} title={title} footer={footer}>\n <div className={styles.body}>\n {errorNode}\n {children}\n </div>\n </Modal>\n );\n};\n\nexport default ConfirmDialog;\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n width: 'full',\n});\n\nexport const header = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 3,\n});\n\nexport const title = sprinkles({\n fontSize: 'sm',\n fontWeight: 'medium',\n color: 'textSecondary',\n});\n\nexport const actions = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n});\n\nexport const pre = sprinkles({\n margin: 0,\n padding: 4,\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'border',\n borderRadius: 'lg',\n color: 'text',\n fontFamily: 'mono',\n fontSize: 'xs',\n lineHeight: 1.45,\n overflow: 'auto',\n maxHeight: 96,\n whiteSpace: 'pre',\n});\n\nexport const truncated = sprinkles({\n maxHeight: 48,\n});\n","import { useCallback, useMemo, useState, type JSX } from 'react';\n\nimport { Button, cx } from '@plumile/ui';\n\nimport * as styles from './backofficeJsonViewer.css.js';\n\nexport type BackofficeJsonViewerProps = {\n value: unknown;\n title?: string;\n className?: string;\n maxHeight?: string;\n truncate?: boolean;\n truncateLabel?: string;\n expandLabel?: string;\n copyLabel?: string;\n copiedLabel?: string;\n};\n\nconst copyWithExecCommand = (text: string): boolean => {\n try {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.setAttribute('readonly', 'true');\n textarea.style.position = 'fixed';\n textarea.style.top = '-1000px';\n textarea.style.left = '-1000px';\n document.body.appendChild(textarea);\n textarea.select();\n const ok = document.execCommand('copy');\n document.body.removeChild(textarea);\n return ok;\n } catch {\n return false;\n }\n};\n\nexport const BackofficeJsonViewer = ({\n value,\n title = 'Raw JSON',\n className,\n maxHeight,\n truncate = false,\n truncateLabel = 'Collapse',\n expandLabel = 'Expand',\n copyLabel = 'Copy',\n copiedLabel = 'Copied',\n}: BackofficeJsonViewerProps): JSX.Element => {\n const [isCollapsed, setIsCollapsed] = useState(truncate);\n const [copied, setCopied] = useState(false);\n\n const jsonText = useMemo(() => {\n try {\n return JSON.stringify(value, null, 2);\n } catch (err) {\n let message = String(err);\n if (err instanceof Error) {\n message = err.message;\n }\n return JSON.stringify({ error: 'Failed to serialize JSON', message });\n }\n }, [value]);\n\n const handleCopy = useCallback(async () => {\n let ok = false;\n try {\n if (typeof navigator !== 'undefined') {\n await navigator.clipboard.writeText(jsonText);\n ok = true;\n }\n } catch {\n ok = false;\n }\n\n if (!ok) {\n ok = copyWithExecCommand(jsonText);\n }\n\n if (ok) {\n setCopied(true);\n window.setTimeout(() => {\n setCopied(false);\n }, 1400);\n }\n }, [jsonText]);\n\n const preStyle = useMemo(() => {\n if (maxHeight == null) {\n return undefined;\n }\n return { maxHeight };\n }, [maxHeight]);\n\n let copyButtonLabel = copyLabel;\n if (copied) {\n copyButtonLabel = copiedLabel;\n }\n\n let collapseButtonLabel = truncateLabel;\n if (isCollapsed) {\n collapseButtonLabel = expandLabel;\n }\n\n return (\n <div className={cx(styles.container, className)}>\n <div className={styles.header}>\n <span className={styles.title}>{title}</span>\n <div className={styles.actions}>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={() => {\n handleCopy().catch(() => {});\n }}\n >\n {copyButtonLabel}\n </Button>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={() => {\n setIsCollapsed((v) => {\n return !v;\n });\n }}\n >\n {collapseButtonLabel}\n </Button>\n </div>\n </div>\n <pre\n className={cx(styles.pre, { [styles.truncated]: isCollapsed })}\n style={preStyle}\n >\n {jsonText}\n </pre>\n </div>\n );\n};\n\nexport default BackofficeJsonViewer;\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const fallback = sprinkles({\n overflow: 'auto',\n whiteSpace: 'pre-wrap',\n});\n","import { Suspense, lazy, type JSX } from 'react';\n\nimport type { BackofficeJsonViewerProps } from './BackofficeJsonViewer.js';\n\nimport * as styles from './LazyBackofficeJsonViewer.css.js';\n\nconst BackofficeJsonViewer = lazy(async () => {\n return import('./BackofficeJsonViewerAsync.js');\n});\n\nconst buildFallbackText = (value: unknown): string => {\n try {\n return JSON.stringify(value, null, 2);\n } catch (err) {\n let message = String(err);\n if (err instanceof Error) {\n message = err.message;\n }\n return JSON.stringify({ error: 'Failed to serialize JSON', message });\n }\n};\n\nconst FallbackViewer = ({\n value,\n className,\n}: Pick<BackofficeJsonViewerProps, 'value' | 'className'>): JSX.Element => {\n return (\n <pre className={className ?? styles.fallback}>\n {buildFallbackText(value)}\n </pre>\n );\n};\n\nexport const LazyBackofficeJsonViewer = (\n props: BackofficeJsonViewerProps,\n): JSX.Element => {\n return (\n <Suspense\n fallback={\n <FallbackViewer value={props.value} className={props.className} />\n }\n >\n <BackofficeJsonViewer {...props} />\n </Suspense>\n );\n};\n\nexport default LazyBackofficeJsonViewer;\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const container = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 3,\n paddingY: 3,\n paddingX: 4,\n borderWidth: 0,\n borderTopWidth: 'default',\n borderStyle: 'solid',\n borderTopColor: 'borderLight',\n backgroundColor: 'white',\n});\n\nexport const left = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n minWidth: 0,\n});\n\nexport const meta = sprinkles({\n fontSize: 'sm',\n color: 'textSecondary',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n});\n","import { type JSX, type ReactNode } from 'react';\nimport { Spinner } from '../../atoms/spinner/Spinner.js';\n\nimport * as styles from './backofficeLoadMore.css.js';\n\nexport type BackofficeLoadMoreProps = {\n hasNextPage: boolean;\n isLoading: boolean;\n loadMoreLabel?: string;\n endLabel?: string;\n loadingLabel?: string;\n meta?: ReactNode;\n};\n\nexport const BackofficeLoadMore = ({\n hasNextPage,\n isLoading,\n loadMoreLabel = 'More results available',\n endLabel = 'End of results',\n loadingLabel = 'Loading more…',\n meta,\n}: BackofficeLoadMoreProps): JSX.Element => {\n let statusLabel = endLabel;\n if (hasNextPage) {\n statusLabel = loadMoreLabel;\n }\n if (isLoading) {\n statusLabel = loadingLabel;\n }\n\n let spinnerNode: JSX.Element | null = null;\n if (isLoading) {\n spinnerNode = <Spinner size={16} />;\n }\n\n return (\n <div className={styles.container}>\n <div className={styles.left}>\n {spinnerNode}\n <span className={styles.meta}>{statusLabel}</span>\n {meta}\n </div>\n </div>\n );\n};\n\nexport default BackofficeLoadMore;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles, stateSprinkles } from '../../../theme/index.js';\n\nexport const container = sprinkles({\n position: 'relative',\n display: 'inline-flex',\n});\n\nexport const triggerIcon = sprinkles({\n transitionProperty: 'transform',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n});\n\nexport const triggerIconOpen = sprinkles({\n rotate: 180,\n});\n\nexport const menu = sprinkles({\n position: 'absolute',\n right: 0,\n top: 'full',\n marginTop: 2,\n minWidth: 64,\n backgroundColor: 'surface',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n borderRadius: 'lg',\n boxShadow: 'md',\n padding: 2,\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n zIndex: 20,\n});\n\nexport const menuItem = style([\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 2,\n paddingY: 2,\n paddingX: 3,\n borderRadius: 'md',\n color: 'text',\n textDecoration: 'none',\n fontSize: 'sm',\n }),\n stateSprinkles({\n backgroundColor: {\n hover: 'surfaceSecondary',\n },\n }),\n]);\n\nexport const itemLabel = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n});\n\nexport const count = sprinkles({\n fontSize: 'xs',\n color: 'textMuted',\n});\n","import {\n type JSX,\n type MouseEvent as ReactMouseEvent,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { Link } from '@plumile/router';\n\nimport { Button, ChevronDownIcon, cx } from '@plumile/ui';\n\nimport * as styles from './backofficeRelationsMenu.css.js';\n\nexport type BackofficeRelationsMenuItem = {\n id: string;\n label: string;\n count?: number | null;\n href: string;\n onClick?: (event: ReactMouseEvent<HTMLAnchorElement>) => void | Promise<void>;\n};\n\nexport type BackofficeRelationsMenuProps = {\n label?: string;\n items: readonly BackofficeRelationsMenuItem[];\n};\n\nexport const BackofficeRelationsMenu = ({\n label = 'Relations',\n items,\n}: BackofficeRelationsMenuProps): JSX.Element => {\n const [isOpen, setIsOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!isOpen) {\n return undefined;\n }\n\n const handleClick = (event: PointerEvent) => {\n if (!(event.target instanceof Node)) {\n return;\n }\n if (containerRef.current?.contains(event.target)) {\n return;\n }\n setIsOpen(false);\n };\n\n document.addEventListener('pointerdown', handleClick);\n return () => {\n document.removeEventListener('pointerdown', handleClick);\n };\n }, [isOpen]);\n\n if (items.length === 0) {\n return (\n <Button type=\"button\" variant=\"secondary\" size=\"small\" disabled>\n {label}\n </Button>\n );\n }\n\n return (\n <div className={styles.container} ref={containerRef}>\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={() => {\n setIsOpen((prev) => {\n return !prev;\n });\n }}\n aria-expanded={isOpen}\n aria-haspopup=\"menu\"\n >\n {label}\n <ChevronDownIcon\n size={14}\n className={cx(styles.triggerIcon, {\n [styles.triggerIconOpen]: isOpen,\n })}\n />\n </Button>\n\n {isOpen && (\n <div className={styles.menu} role=\"menu\">\n {items.map((item) => {\n let countValue: number | null = null;\n if (typeof item.count === 'number') {\n countValue = item.count;\n }\n return (\n <Link\n key={item.id}\n to={item.href}\n className={styles.menuItem}\n onClick={(event: ReactMouseEvent<HTMLAnchorElement>) => {\n setIsOpen(false);\n const result = item.onClick?.(event);\n if (result != null) {\n result.catch(() => {});\n }\n }}\n >\n <span className={styles.itemLabel}>{item.label}</span>\n {countValue != null && (\n <span className={styles.count}>{countValue}</span>\n )}\n </Link>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n\nexport default BackofficeRelationsMenu;\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n borderRadius: 'lg',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n overflow: 'hidden',\n});\n\nexport const header = sprinkles({\n display: 'grid',\n gridTemplateColumns: 'autoFitMinmax0',\n gap: 2,\n padding: 3,\n backgroundColor: 'surfaceSecondary',\n borderWidth: 0,\n borderStyle: 'solid',\n borderBottomWidth: 'default',\n borderBottomColor: 'borderSubtle',\n});\n\nexport const headerCell = sprinkles({\n display: 'flex',\n alignItems: 'center',\n});\n\nexport const body = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n padding: 3,\n});\n\nexport const row = sprinkles({\n display: 'grid',\n gridTemplateColumns: 'autoFitMinmax0',\n gap: 2,\n});\n\nexport const cell = sprinkles({\n display: 'flex',\n alignItems: 'center',\n});\n","import { type JSX } from 'react';\n\nimport { Skeleton } from '../../atoms/skeleton/Skeleton.js';\nimport * as styles from './backofficeTableSkeleton.css.js';\n\nexport type BackofficeTableSkeletonProps = {\n rows?: number;\n columns?: number;\n};\n\nexport const BackofficeTableSkeleton = ({\n rows = 6,\n columns = 4,\n}: BackofficeTableSkeletonProps): JSX.Element => {\n const headerCells = Array.from({ length: columns }, (_, index) => {\n return (\n <div key={`header-${index}`} className={styles.headerCell}>\n <Skeleton variant=\"text\" width=\"70%\" />\n </div>\n );\n });\n\n const bodyRows = Array.from({ length: rows }, (_, rowIndex) => {\n return (\n <div key={`row-${rowIndex}`} className={styles.row}>\n {Array.from({ length: columns }, (_, colIndex) => {\n return (\n <div key={`cell-${rowIndex}-${colIndex}`} className={styles.cell}>\n <Skeleton variant=\"text\" width=\"80%\" />\n </div>\n );\n })}\n </div>\n );\n });\n\n return (\n <div className={styles.container} aria-hidden=\"true\">\n <div className={styles.header}>{headerCells}</div>\n <div className={styles.body}>{bodyRows}</div>\n </div>\n );\n};\n\nexport default BackofficeTableSkeleton;\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n width: 'full',\n});\n\nexport const topRow = sprinkles({\n display: 'flex',\n justifyContent: 'space-between',\n gap: 3,\n flexWrap: 'wrap',\n alignItems: {\n base: 'center',\n sm: 'stretch',\n },\n flexDirection: {\n base: 'row',\n sm: 'column',\n },\n});\n\nexport const left = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n minWidth: 0,\n flex: 1,\n});\n\nexport const right = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const chipsRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: 2,\n paddingTop: 2,\n borderTopWidth: 'px',\n borderStyle: 'solid',\n borderTopColor: 'borderSubtle',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '@plumile/ui';\n\nimport * as styles from './backofficeTableToolbar.css.js';\n\nexport type BackofficeTableToolbarProps = {\n searchSlot?: ReactNode;\n filtersSlot?: ReactNode;\n sortSlot?: ReactNode;\n refreshSlot?: ReactNode;\n ctaSlot?: ReactNode;\n chipsSlot?: ReactNode;\n className?: string;\n};\n\nexport const BackofficeTableToolbar = ({\n searchSlot,\n filtersSlot,\n sortSlot,\n refreshSlot,\n ctaSlot,\n chipsSlot,\n className,\n}: BackofficeTableToolbarProps): JSX.Element | null => {\n const showTop =\n searchSlot != null ||\n filtersSlot != null ||\n sortSlot != null ||\n refreshSlot != null ||\n ctaSlot != null;\n\n const showChips = chipsSlot != null;\n\n if (!showTop && !showChips) {\n return null;\n }\n\n return (\n <div className={cx(styles.container, className)}>\n {showTop && (\n <div className={styles.topRow}>\n <div className={styles.left}>\n {searchSlot}\n {filtersSlot}\n {sortSlot}\n </div>\n <div className={styles.right}>\n {refreshSlot}\n {ctaSlot}\n </div>\n </div>\n )}\n {showChips && <div className={styles.chipsRow}>{chipsSlot}</div>}\n </div>\n );\n};\n\nexport default BackofficeTableToolbar;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles, stateSprinkles, vars } from '../../../theme/index.js';\n\nexport const tabs = sprinkles({\n display: 'inline-flex',\n flexWrap: 'wrap',\n gap: 1,\n padding: 1,\n borderRadius: 'full',\n backgroundColor: 'surfaceMuted',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n});\n\nexport const tab = style([\n sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n paddingX: 3,\n paddingY: 1.5,\n borderRadius: 'full',\n fontSize: 'sm',\n fontWeight: 'medium',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'transparent',\n backgroundColor: 'transparent',\n color: 'textSecondary',\n cursor: 'pointer',\n }),\n stateSprinkles({\n color: {\n hover: 'text',\n },\n backgroundColor: {\n hover: 'surface',\n },\n }),\n {\n ':focus-visible': {\n outline: `2px solid ${vars.colors['blue-500']}`,\n outlineOffset: 2,\n },\n },\n]);\n\nexport const active = sprinkles({\n backgroundColor: 'surface',\n borderColor: 'borderSubtle',\n color: 'text',\n boxShadow: 'sm',\n});\n","import { Link } from '@plumile/router';\nimport { type ComponentPropsWithoutRef, type JSX, type ReactNode } from 'react';\n\nimport * as styles from './backofficeTabs.css.js';\nimport { cx } from '@plumile/ui';\n\nexport type BackofficeTabItem = {\n id: string;\n label: ReactNode;\n to?: ComponentPropsWithoutRef<typeof Link>['to'];\n};\n\nexport type BackofficeTabsProps = {\n items: readonly BackofficeTabItem[];\n activeId: string;\n onChange: (id: string) => void;\n className?: string;\n};\n\nexport const BackofficeTabs = ({\n items,\n activeId,\n onChange,\n className,\n}: BackofficeTabsProps): JSX.Element | null => {\n if (items.length === 0) {\n return null;\n }\n\n return (\n <div className={cx(styles.tabs, className)} role=\"tablist\">\n {items.map((tab) => {\n const isActive = tab.id === activeId;\n const tabClassName = cx(styles.tab, { [styles.active]: isActive });\n if (tab.to != null) {\n return (\n <Link key={tab.id} to={tab.to} className={tabClassName}>\n {tab.label}\n </Link>\n );\n }\n return (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n className={tabClassName}\n onClick={() => {\n onChange(tab.id);\n }}\n >\n {tab.label}\n </button>\n );\n })}\n </div>\n );\n};\n\nexport default BackofficeTabs;\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const bar = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 3,\n paddingX: 4,\n paddingY: 3,\n borderRadius: 'lg',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'border',\n});\n\nexport const left = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n fontSize: 'sm',\n});\n\nexport const right = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { Button, cx } from '@plumile/ui';\n\nimport * as styles from './bulkActionsBar.css.js';\n\nexport type BulkActionsBarProps = {\n selectedCount: number;\n label?: (count: number) => ReactNode;\n actions?: ReactNode;\n onClearSelection?: () => void;\n clearLabel?: string;\n className?: string;\n};\n\nexport const BulkActionsBar = ({\n selectedCount,\n label = (count) => {\n return `${count} selected`;\n },\n actions,\n onClearSelection,\n clearLabel = 'Clear',\n className,\n}: BulkActionsBarProps): JSX.Element | null => {\n if (selectedCount <= 0) {\n return null;\n }\n\n let clearButtonNode: JSX.Element | null = null;\n if (onClearSelection != null) {\n clearButtonNode = (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"small\"\n onClick={onClearSelection}\n >\n {clearLabel}\n </Button>\n );\n }\n\n return (\n <div className={cx(styles.bar, className)} role=\"status\">\n <div className={styles.left}>{label(selectedCount)}</div>\n <div className={styles.right}>\n {actions}\n {clearButtonNode}\n </div>\n </div>\n );\n};\n\nexport default BulkActionsBar;\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const row = sprinkles({\n display: 'flex',\n alignItems: 'center',\n flexWrap: 'wrap',\n gap: 2,\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { Button, cx } from '@plumile/ui';\nimport { Tag } from '../../atoms/tag/Tag.js';\n\nimport * as styles from './filterChipRow.css.js';\n\nexport type FilterChip = {\n id: string;\n label: ReactNode;\n onRemove?: () => void;\n};\n\nexport type FilterChipRowProps = {\n chips: readonly FilterChip[];\n onClearAll?: () => void;\n clearAllLabel?: string;\n className?: string;\n};\n\nexport const FilterChipRow = ({\n chips,\n onClearAll,\n clearAllLabel = 'Clear all',\n className,\n}: FilterChipRowProps): JSX.Element | null => {\n if (chips.length === 0) {\n return null;\n }\n\n let clearAllNode: JSX.Element | null = null;\n if (onClearAll != null) {\n clearAllNode = (\n <Button type=\"button\" size=\"small\" variant=\"text\" onClick={onClearAll}>\n {clearAllLabel}\n </Button>\n );\n }\n\n return (\n <div className={cx(styles.row, className)}>\n {chips.map((chip) => {\n return (\n <Tag\n key={chip.id}\n tone=\"neutral\"\n onRemove={chip.onRemove}\n removeLabel=\"Remove filter\"\n >\n {chip.label}\n </Tag>\n );\n })}\n {clearAllNode}\n </div>\n );\n};\n\nexport default FilterChipRow;\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const container = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n minWidth: 0,\n});\n\nexport const input = sprinkles({\n width: 'full',\n});\n\nexport const clearButton = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n borderWidth: 0,\n borderStyle: 'none',\n padding: 0,\n});\n","import { type ChangeEvent, type JSX, type ReactNode } from 'react';\n\nimport { Input } from '@plumile/ui';\nimport { ModalCloseSvg } from '../../../icons/ModalCloseSvg.js';\nimport { SidebarSearchSvg } from '../../../icons/SidebarSearchSvg.js';\n\nimport { ShortcutHint } from '../../atoms/shortcut_hint/ShortcutHint.js';\nimport * as styles from './globalSearchInput.css.js';\n\nexport type GlobalSearchInputProps = {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n ariaLabel?: string;\n className?: string;\n shortcut?: readonly string[] | string;\n rightSlot?: ReactNode;\n clearLabel?: string;\n};\n\nexport const GlobalSearchInput = ({\n value,\n onChange,\n placeholder = 'Search…',\n ariaLabel,\n className,\n shortcut,\n rightSlot,\n clearLabel = 'Clear search',\n}: GlobalSearchInputProps): JSX.Element => {\n const showClear = value.trim() !== '';\n const resolvedAriaLabel = ariaLabel ?? placeholder;\n\n let clearButton: JSX.Element | null = null;\n if (showClear) {\n clearButton = (\n <button\n type=\"button\"\n aria-label={clearLabel}\n onClick={() => {\n onChange('');\n }}\n className={styles.clearButton}\n >\n <ModalCloseSvg width={16} height={16} aria-hidden=\"true\" />\n </button>\n );\n }\n\n let shortcutNode: JSX.Element | null = null;\n if (shortcut != null) {\n shortcutNode = <ShortcutHint keys={shortcut} />;\n }\n\n const rightIcon = (\n <span className={styles.container}>\n {clearButton}\n {shortcutNode}\n {rightSlot}\n </span>\n );\n\n return (\n <Input\n className={className}\n value={value}\n onChange={(event: ChangeEvent<HTMLInputElement>) => {\n onChange(event.target.value);\n }}\n placeholder={placeholder}\n aria-label={resolvedAriaLabel}\n size=\"small\"\n fullWidth\n leftIcon={<SidebarSearchSvg width={18} height={18} aria-hidden=\"true\" />}\n rightIcon={rightIcon}\n />\n );\n};\n\nexport default GlobalSearchInput;\n","import { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles } from '../../../theme/index.js';\n\nexport const container = sprinkles({\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: 3,\n paddingX: 4,\n paddingY: 3,\n borderRadius: 'md',\n fontSize: 'sm',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'border',\n});\n\nconst toneInfo = sprinkles({\n backgroundColor: 'brandLightGray',\n color: 'text',\n});\nconst toneSuccess = sprinkles({\n backgroundColor: 'green-50',\n color: 'green-800',\n});\nconst toneWarning = sprinkles({\n backgroundColor: 'amber-50',\n color: 'amber-900',\n});\nconst toneDanger = sprinkles({\n backgroundColor: 'red-50',\n color: 'red-800',\n});\n\nexport const toneRecipe = recipe({\n variants: {\n tone: {\n info: toneInfo,\n success: toneSuccess,\n warning: toneWarning,\n danger: toneDanger,\n },\n },\n defaultVariants: {\n tone: 'info',\n },\n});\n\nexport type ToneRecipeVariants = RecipeVariants<typeof toneRecipe>;\n\nexport const content = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n flex: 1,\n minWidth: 0,\n});\n\nexport const title = sprinkles({\n fontWeight: 'semibold',\n});\n\nexport const description = sprinkles({\n // color: 'slate-700',\n});\n\nexport const actions = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n flexShrink: 0,\n});\n\nexport const closeButton = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 8,\n height: 8,\n borderRadius: 'md',\n backgroundColor: 'transparent',\n cursor: 'pointer',\n borderWidth: 0,\n borderStyle: 'none',\n color: 'inherit',\n});\n","import { type JSX, type ReactNode } from 'react';\nimport type { RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { ModalCloseSvg } from '../../../icons/ModalCloseSvg.js';\n\nimport * as styles from './inlineBanner.css.js';\nimport { cx } from '@plumile/ui';\n\nexport type InlineBannerTone = NonNullable<\n NonNullable<RecipeVariants<typeof styles.toneRecipe>>['tone']\n>;\n\nexport type InlineBannerProps = {\n tone?: InlineBannerTone;\n title?: ReactNode;\n children?: ReactNode;\n actions?: ReactNode;\n onDismiss?: () => void;\n dismissLabel?: string;\n className?: string;\n};\n\nexport const InlineBanner = ({\n tone = 'info',\n title,\n children,\n actions,\n onDismiss,\n dismissLabel = 'Dismiss',\n className,\n}: InlineBannerProps): JSX.Element => {\n const showDismiss = typeof onDismiss === 'function';\n\n let titleNode: JSX.Element | null = null;\n if (title != null) {\n titleNode = <div className={styles.title}>{title}</div>;\n }\n\n let descriptionNode: JSX.Element | null = null;\n if (children != null) {\n descriptionNode = <div className={styles.description}>{children}</div>;\n }\n\n let dismissNode: JSX.Element | null = null;\n if (showDismiss) {\n dismissNode = (\n <button\n type=\"button\"\n onClick={onDismiss}\n className={styles.closeButton}\n aria-label={dismissLabel}\n >\n <ModalCloseSvg width={18} height={18} aria-hidden=\"true\" />\n </button>\n );\n }\n\n return (\n <div\n className={cx(styles.container, styles.toneRecipe({ tone }), className)}\n role=\"status\"\n >\n <div className={styles.content}>\n {titleNode}\n {descriptionNode}\n </div>\n\n <div className={styles.actions}>\n {actions}\n {dismissNode}\n </div>\n </div>\n );\n};\n\nexport default InlineBanner;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles, stateSprinkles } from '../../../theme/index.js';\n\nconst inlineFlex = 'inline-flex';\n\nexport const actions = sprinkles({\n display: inlineFlex,\n alignItems: 'center',\n gap: 1,\n transitionProperty: 'opacity',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n flexShrink: 0,\n opacity: 0,\n visibility: 'hidden',\n pointerEvents: 'none',\n});\n\nexport const actionsVisible = sprinkles({\n opacity: 100,\n visibility: 'visible',\n pointerEvents: 'auto',\n});\n\nexport const item = style([\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n paddingY: 2,\n paddingX: 3,\n borderRadius: 'md',\n fontSize: 'sm',\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n cursor: 'pointer',\n color: 'textSecondary',\n }),\n stateSprinkles({\n backgroundColor: {\n hover: 'surfaceMuted',\n },\n color: {\n hover: 'text',\n },\n }),\n]);\n\nexport const itemCollapsed = sprinkles({\n justifyContent: 'center',\n paddingX: 2,\n});\n\nexport const itemActive = sprinkles({\n fontWeight: 'semibold',\n backgroundColor: 'surfaceMuted',\n color: 'text',\n boxShadow: 'sidebarActiveInset',\n});\n\nexport const itemDisabled = style([\n sprinkles({\n color: 'textMuted',\n cursor: 'not-allowed',\n }),\n {\n selectors: {\n '&:hover': {\n backgroundColor: 'transparent',\n },\n },\n },\n]);\n\nexport const link = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flex: 1,\n minWidth: 0,\n textDecoration: 'none',\n backgroundColor: 'transparent',\n borderWidth: 0,\n borderStyle: 'none',\n padding: 0,\n textAlign: 'left',\n color: 'inherit',\n font: 'inherit',\n});\n\nexport const actionSlot = sprinkles({\n display: inlineFlex,\n alignItems: 'center',\n});\n\nexport const dragHandle = style([\n sprinkles({\n display: inlineFlex,\n alignItems: 'center',\n justifyContent: 'center',\n width: 6,\n height: 6,\n borderRadius: 'md',\n borderWidth: 0,\n borderStyle: 'none',\n padding: 0,\n backgroundColor: 'transparent',\n color: 'textSecondary',\n cursor: 'grab',\n }),\n stateSprinkles({\n backgroundColor: {\n hover: 'surfaceMuted',\n },\n color: {\n hover: 'text',\n },\n }),\n {\n selectors: {\n '&:active': {\n cursor: 'grabbing',\n },\n },\n },\n]);\n\nexport const icon = sprinkles({\n display: inlineFlex,\n alignItems: 'center',\n justifyContent: 'center',\n width: 6,\n height: 6,\n flexShrink: 0,\n color: 'inherit',\n});\n\nexport const label = sprinkles({\n flex: 1,\n minWidth: 0,\n});\n\nexport const labelCollapsed = sprinkles({\n display: 'none',\n});\n\nexport const badge = sprinkles({\n display: inlineFlex,\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n});\n\nexport const badgeCollapsed = sprinkles({\n display: 'none',\n});\n","import { Link } from '@plumile/router';\nimport {\n type AnchorHTMLAttributes,\n type ComponentPropsWithoutRef,\n type DragEvent,\n type FocusEvent,\n type JSX,\n type ReactNode,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nimport * as styles from './sidebarNavItem.css.js';\nimport { cx } from '@plumile/ui';\n\ntype RouterLinkProps = ComponentPropsWithoutRef<typeof Link> &\n AnchorHTMLAttributes<HTMLAnchorElement>;\nconst RouterLink = Link as unknown as (props: RouterLinkProps) => JSX.Element;\n\nexport type SidebarNavItemProps = {\n label: ReactNode;\n href?: string;\n icon?: ReactNode;\n badge?: ReactNode;\n isActive?: boolean;\n disabled?: boolean;\n onClick?: () => void;\n onDragStart?: (event: DragEvent) => void;\n onDragOver?: (event: DragEvent) => void;\n onDrop?: (event: DragEvent) => void;\n onDragEnd?: (event: DragEvent) => void;\n collapsed?: boolean;\n ariaLabel?: string;\n className?: string;\n actionSlot?: ReactNode;\n dragHandleSlot?: ReactNode;\n dragHandleLabel?: string;\n draggable?: boolean;\n};\n\nexport const SidebarNavItem = ({\n label,\n href,\n icon,\n badge,\n isActive = false,\n disabled = false,\n onClick,\n onDragStart,\n onDragOver,\n onDrop,\n onDragEnd,\n collapsed = false,\n ariaLabel,\n className,\n actionSlot,\n dragHandleSlot,\n dragHandleLabel,\n draggable = false,\n}: SidebarNavItemProps): JSX.Element => {\n const itemRef = useRef<HTMLDivElement | null>(null);\n const hoverTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const [isHoverIntent, setIsHoverIntent] = useState(false);\n const [isFocusWithin, setIsFocusWithin] = useState(false);\n\n const itemClassNames: (string | null | undefined)[] = [styles.item];\n if (collapsed) {\n itemClassNames.push(styles.itemCollapsed);\n }\n if (isActive) {\n itemClassNames.push(styles.itemActive);\n }\n if (disabled) {\n itemClassNames.push(styles.itemDisabled);\n }\n if (className != null) {\n itemClassNames.push(className);\n }\n const itemClassName = cx(...itemClassNames);\n\n let resolvedAriaLabel: string | undefined = ariaLabel;\n if (resolvedAriaLabel == null && typeof label === 'string') {\n resolvedAriaLabel = label;\n }\n\n let collapsedAriaLabel: string | undefined;\n let collapsedTitle: string | undefined;\n if (collapsed) {\n collapsedAriaLabel = resolvedAriaLabel;\n collapsedTitle = resolvedAriaLabel;\n }\n\n let ariaCurrent: 'page' | undefined;\n if (isActive) {\n ariaCurrent = 'page';\n }\n\n let iconNode: JSX.Element | null = null;\n if (icon != null) {\n iconNode = <span className={styles.icon}>{icon}</span>;\n }\n\n let labelExtraClass: string | null = null;\n if (collapsed) {\n labelExtraClass = styles.labelCollapsed;\n }\n const labelClassName = cx(styles.label, labelExtraClass);\n\n let badgeNode: JSX.Element | null = null;\n if (badge != null) {\n let badgeExtraClass: string | null = null;\n if (collapsed) {\n badgeExtraClass = styles.badgeCollapsed;\n }\n badgeNode = (\n <span className={cx(styles.badge, badgeExtraClass)}>{badge}</span>\n );\n }\n\n const content = (\n <>\n {iconNode}\n <span className={labelClassName}>{label}</span>\n {badgeNode}\n </>\n );\n\n const handleClick = (): void => {\n if (onClick != null) {\n onClick();\n }\n };\n\n const shouldRenderActions =\n !collapsed && !disabled && (actionSlot != null || dragHandleSlot != null);\n\n const clearHoverTimeout = useCallback((): void => {\n if (hoverTimeoutRef.current != null) {\n clearTimeout(hoverTimeoutRef.current);\n hoverTimeoutRef.current = null;\n }\n }, []);\n\n useEffect(() => {\n if (!shouldRenderActions) {\n setIsHoverIntent(false);\n setIsFocusWithin(false);\n clearHoverTimeout();\n }\n\n return () => {\n clearHoverTimeout();\n };\n }, [clearHoverTimeout, shouldRenderActions]);\n\n const handleMouseEnter = (): void => {\n if (!shouldRenderActions) {\n return;\n }\n clearHoverTimeout();\n hoverTimeoutRef.current = setTimeout(() => {\n setIsHoverIntent(true);\n }, 150);\n };\n\n const handleMouseLeave = (): void => {\n clearHoverTimeout();\n setIsHoverIntent(false);\n };\n\n const handleFocusCapture = (): void => {\n if (!shouldRenderActions) {\n return;\n }\n setIsFocusWithin(true);\n };\n\n const handleBlurCapture = (event: FocusEvent<HTMLDivElement>): void => {\n if (!shouldRenderActions) {\n setIsFocusWithin(false);\n return;\n }\n const nextTarget = event.relatedTarget as Node | null;\n if (nextTarget != null && itemRef.current?.contains(nextTarget)) {\n return;\n }\n setIsFocusWithin(false);\n };\n\n let mainNode: JSX.Element;\n if (disabled) {\n mainNode = (\n <span\n className={styles.link}\n aria-disabled=\"true\"\n aria-label={collapsedAriaLabel}\n title={collapsedTitle}\n >\n {content}\n </span>\n );\n } else if (href != null) {\n mainNode = (\n <RouterLink\n to={href}\n className={styles.link}\n aria-current={ariaCurrent}\n aria-label={collapsedAriaLabel}\n title={collapsedTitle}\n onClick={handleClick}\n >\n {content}\n </RouterLink>\n );\n } else {\n mainNode = (\n <button\n type=\"button\"\n className={styles.link}\n onClick={handleClick}\n aria-current={ariaCurrent}\n aria-label={collapsedAriaLabel}\n title={collapsedTitle}\n >\n {content}\n </button>\n );\n }\n\n const isActionsVisible =\n shouldRenderActions && (isHoverIntent || isFocusWithin);\n let actionsVisibilityClass: string | undefined;\n if (isActionsVisible) {\n actionsVisibilityClass = styles.actionsVisible;\n }\n const actionsClassName = cx(styles.actions, actionsVisibilityClass);\n\n let dragHandleNode: JSX.Element | null = null;\n if (dragHandleSlot != null && !collapsed) {\n dragHandleNode = (\n <button\n type=\"button\"\n className={styles.dragHandle}\n draggable={draggable}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n aria-label={dragHandleLabel}\n title={dragHandleLabel}\n >\n {dragHandleSlot}\n </button>\n );\n }\n\n let actionNode: JSX.Element | null = null;\n if (actionSlot != null && !collapsed) {\n actionNode = <span className={styles.actionSlot}>{actionSlot}</span>;\n }\n\n let actionsNode: JSX.Element | null = null;\n if (shouldRenderActions) {\n actionsNode = (\n <span className={actionsClassName}>\n {dragHandleNode}\n {actionNode}\n </span>\n );\n }\n\n return (\n <div\n className={itemClassName}\n onDragOver={onDragOver}\n onDrop={onDrop}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onFocusCapture={handleFocusCapture}\n onBlurCapture={handleBlurCapture}\n ref={itemRef}\n >\n {mainNode}\n {actionsNode}\n </div>\n );\n};\n\nexport default SidebarNavItem;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles, stateSprinkles } from '../../../theme/index.js';\n\nexport const section = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n});\n\nexport const header = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 2,\n paddingX: 2,\n paddingY: 1,\n});\n\nexport const title = sprinkles({\n fontSize: '2xs',\n fontWeight: 'semibold',\n textTransform: 'uppercase',\n color: 'textMuted',\n letterSpacing: 'wide',\n});\n\nexport const toggle = style([\n sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 7,\n height: 7,\n borderRadius: 'md',\n backgroundColor: 'backgroundSecondary',\n borderWidth: 0,\n borderStyle: 'none',\n cursor: 'pointer',\n color: 'textSecondary',\n }),\n stateSprinkles({\n backgroundColor: {\n hover: 'surfaceMuted',\n },\n color: {\n hover: 'text',\n },\n }),\n]);\n\nexport const items = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1.5,\n});\n","import {\n type JSX,\n type ReactNode,\n useCallback,\n useMemo,\n useState,\n} from 'react';\n\nimport { ChevronDownSvg } from '../../../icons/ChevronDownSvg.js';\n\nimport {\n SidebarNavItem,\n type SidebarNavItemProps,\n} from '../sidebar_nav_item/SidebarNavItem.js';\nimport * as styles from './sidebarNavSection.css.js';\nimport { cx } from '@plumile/ui';\n\nexport type SidebarNavSectionItemData = {\n kind: 'dashboard' | 'entity' | 'tool';\n id: string;\n groupId?: string;\n};\n\nexport type SidebarNavSectionItem = SidebarNavItemProps & {\n id: string;\n data?: SidebarNavSectionItemData;\n};\n\nexport type SidebarNavSectionProps = {\n title?: ReactNode;\n items: readonly SidebarNavSectionItem[];\n collapsible?: boolean;\n isCollapsed?: boolean;\n defaultCollapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n collapsed?: boolean;\n className?: string;\n};\n\nexport const SidebarNavSection = ({\n title,\n items,\n collapsible = false,\n isCollapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n collapsed: sidebarCollapsed = false,\n className,\n}: SidebarNavSectionProps): JSX.Element => {\n const [uncontrolledCollapsed, setUncontrolledCollapsed] =\n useState(defaultCollapsed);\n\n const collapsed = isCollapsed ?? uncontrolledCollapsed;\n\n const canCollapse = collapsible;\n\n const handleToggle = useCallback(() => {\n if (!canCollapse) {\n return;\n }\n const next = !collapsed;\n if (isCollapsed == null) {\n setUncontrolledCollapsed(next);\n }\n onCollapsedChange?.(next);\n }, [canCollapse, collapsed, isCollapsed, onCollapsedChange]);\n\n const iconStyle = useMemo(() => {\n let rotate = 'rotate(0deg)';\n if (collapsed) {\n rotate = 'rotate(-90deg)';\n }\n return { transform: rotate, transition: 'transform 120ms ease' } as const;\n }, [collapsed]);\n\n let headerNode: JSX.Element | null = null;\n if (title != null) {\n let collapseToggleNode: JSX.Element | null = null;\n if (canCollapse) {\n collapseToggleNode = (\n <button\n type=\"button\"\n className={styles.toggle}\n onClick={handleToggle}\n aria-expanded={!collapsed}\n >\n <ChevronDownSvg width={18} height={18} style={iconStyle} />\n </button>\n );\n }\n\n headerNode = (\n <div className={styles.header}>\n <div className={styles.title}>{title}</div>\n {collapseToggleNode}\n </div>\n );\n }\n\n let itemsNode: JSX.Element | null = null;\n if (!collapsed) {\n itemsNode = (\n <div className={styles.items}>\n {items.map((item) => {\n const { id, data, ...rest } = item;\n return (\n <SidebarNavItem key={id} {...rest} collapsed={sidebarCollapsed} />\n );\n })}\n </div>\n );\n }\n\n return (\n <section className={cx(styles.section, className)}>\n {headerNode}\n {itemsNode}\n </section>\n );\n};\n\nexport default SidebarNavSection;\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ProfileDropdownLogoutSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M9 21H5C4.46957 21 3.96086 20.7893 3.58579 20.4142C3.21071 20.0391 3 19.5304 3 20V4C3 3.46957 3.21071 2.96086 3.58579 2.58579C3.96086 2.21071 4.46957 2 5 2H9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M16 17L21 12L16 7\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M21 12H9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { style } from '@vanilla-extract/css';\nimport { recipe } from '@vanilla-extract/recipes';\n\nimport { sprinkles, vars } from '../../../theme/index.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n width: 'full',\n});\n\nexport const title = sprinkles({\n fontSize: 'xs',\n fontWeight: 'semibold',\n color: 'textSecondary',\n paddingX: 1,\n});\n\nexport const hidden = sprinkles({\n display: 'none',\n});\n\nexport const trigger = recipe({\n base: [\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n width: 'full',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n borderRadius: 'lg',\n backgroundColor: 'surfaceSecondary',\n transitionProperty: 'colors',\n transitionDuration: 120,\n transitionTimingFunction: 'ease',\n cursor: 'pointer',\n }),\n {\n selectors: {\n '&:hover': {\n backgroundColor: vars.colors.surfaceElevated,\n borderColor: vars.colors.borderStrong,\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n },\n },\n ],\n variants: {\n collapsed: {\n true: sprinkles({\n justifyContent: 'center',\n padding: 2,\n }),\n false: sprinkles({\n justifyContent: 'space-between',\n gap: 2,\n paddingY: 2,\n paddingX: 3,\n }),\n },\n },\n defaultVariants: {\n collapsed: false,\n },\n});\n\nexport const triggerMain = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n minWidth: 0,\n flex: 1,\n});\n\nexport const avatar = sprinkles({\n width: 8,\n height: 8,\n minWidth: 8,\n minHeight: 8,\n borderRadius: 'full',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 'xs',\n fontWeight: 'semibold',\n color: 'brandWhite',\n backgroundImage: 'brandDiagonal',\n textTransform: 'uppercase',\n});\n\nexport const identity = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n minWidth: 0,\n});\n\nexport const displayName = sprinkles({\n fontSize: 'sm',\n fontWeight: 'semibold',\n color: 'text',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n});\n\nexport const email = sprinkles({\n fontSize: 'xs',\n color: 'textSecondary',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n});\n\nexport const chevron = sprinkles({\n color: 'textSecondary',\n transitionProperty: 'transform',\n transitionDuration: 120,\n transitionTimingFunction: 'ease',\n});\n\nexport const chevronOpen = sprinkles({\n rotate: 180,\n});\n\nexport const menu = sprinkles({\n minWidth: 56,\n padding: 2,\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n});\n\nexport const menuItem = style([\n sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n width: 'full',\n borderWidth: 0,\n borderStyle: 'none',\n borderRadius: 'md',\n backgroundColor: 'transparent',\n color: 'text',\n fontSize: 'sm',\n fontWeight: 'medium',\n textAlign: 'left',\n cursor: 'pointer',\n paddingY: 2,\n paddingX: 3,\n transitionProperty: 'colors',\n transitionDuration: 120,\n transitionTimingFunction: 'ease',\n }),\n {\n selectors: {\n '&:hover:not(:disabled)': {\n backgroundColor: vars.colors.surfaceSecondary,\n },\n '&:focus-visible': {\n outline: `2px solid ${vars.colors.primary}`,\n outlineOffset: '2px',\n },\n '&:disabled': {\n opacity: 0.6,\n cursor: 'not-allowed',\n },\n },\n },\n]);\n\nexport const menuIcon = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n color: 'textSecondary',\n});\n","import { type JSX } from 'react';\n\nimport { Dropdown } from '../../../atomic/molecules/dropdown/Dropdown.js';\nimport { ChevronDownSvg } from '../../../icons/ChevronDownSvg.js';\nimport { ProfileDropdownLogoutSvg } from '../../../icons/ProfileDropdownLogoutSvg.js';\nimport { cx } from '@plumile/ui';\n\nimport * as styles from './sidebarProfileMenu.css.js';\n\nexport type BackofficeSidebarProfileViewer = {\n displayName: string;\n email: string;\n initials: string;\n ariaLabel: string;\n};\n\nexport type BackofficeSidebarProfileMenuLabels = {\n sectionTitle: string;\n menuAriaLabel: string;\n signOut: string;\n};\n\nexport type BackofficeSidebarProfileMenuProps = {\n viewer: BackofficeSidebarProfileViewer;\n collapsed: boolean;\n labels: BackofficeSidebarProfileMenuLabels;\n onSignOut: () => void;\n isSigningOut?: boolean;\n className?: string;\n};\n\nexport const BackofficeSidebarProfileMenu = ({\n viewer,\n collapsed,\n labels,\n onSignOut,\n isSigningOut = false,\n className,\n}: BackofficeSidebarProfileMenuProps): JSX.Element => {\n let titleClassName = styles.title;\n if (collapsed) {\n titleClassName = styles.hidden;\n }\n\n return (\n <div className={cx(styles.container, className)}>\n <div className={titleClassName}>{labels.sectionTitle}</div>\n <Dropdown\n trigger={(isOpen: boolean) => {\n return (\n <button\n type=\"button\"\n className={styles.trigger({ collapsed })}\n aria-label={viewer.ariaLabel}\n >\n <span className={styles.triggerMain}>\n <span className={styles.avatar}>{viewer.initials}</span>\n {!collapsed && (\n <span className={styles.identity}>\n <span className={styles.displayName}>\n {viewer.displayName}\n </span>\n <span className={styles.email}>{viewer.email}</span>\n </span>\n )}\n </span>\n {!collapsed && (\n <ChevronDownSvg\n width={16}\n height={16}\n className={cx(styles.chevron, {\n [styles.chevronOpen]: isOpen,\n })}\n />\n )}\n </button>\n );\n }}\n ariaLabel={labels.menuAriaLabel}\n placement=\"top-start\"\n closeOnItemClick\n matchTriggerWidth={false}\n >\n <div className={styles.menu}>\n <button\n type=\"button\"\n role=\"menuitem\"\n className={styles.menuItem}\n onClick={onSignOut}\n disabled={isSigningOut}\n >\n <span className={styles.menuIcon}>\n <ProfileDropdownLogoutSvg width={16} height={16} />\n </span>\n {labels.signOut}\n </button>\n </div>\n </Dropdown>\n </div>\n );\n};\n\nexport default BackofficeSidebarProfileMenu;\n","import { style } from '@vanilla-extract/css';\n\nimport { sprinkles, stateSprinkles } from '../../../theme/index.js';\n\nexport const button = style([\n sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n paddingX: 3,\n paddingY: 2,\n borderRadius: 'md',\n backgroundColor: 'transparent',\n borderWidth: 0,\n borderStyle: 'none',\n cursor: 'pointer',\n fontSize: 'sm',\n color: 'textSecondary',\n transitionProperty: 'colors',\n transitionDuration: 150,\n transitionTimingFunction: 'ease',\n }),\n stateSprinkles({\n backgroundColor: {\n hover: 'surfaceMuted',\n },\n color: {\n hover: 'text',\n },\n }),\n]);\n\nexport const icon = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 6,\n height: 6,\n});\n\nexport const label = sprinkles({ flex: 1 });\n","import { type JSX, type ReactNode } from 'react';\n\nimport { ChevronLeftSvg } from '../../../icons/ChevronLeftSvg.js';\nimport { ChevronRightSvg } from '../../../icons/ChevronRightSvg.js';\n\nimport { ShortcutHint } from '../../atoms/shortcut_hint/ShortcutHint.js';\nimport * as styles from './sidebarCollapseToggle.css.js';\nimport { cx } from '@plumile/ui';\n\nexport type SidebarCollapseToggleProps = {\n isCollapsed: boolean;\n onToggle: () => void;\n label?: ReactNode;\n shortcut?: readonly string[] | string;\n className?: string;\n};\n\nexport const SidebarCollapseToggle = ({\n isCollapsed,\n onToggle,\n label = 'Collapse',\n shortcut,\n className,\n}: SidebarCollapseToggleProps): JSX.Element => {\n let Icon = ChevronLeftSvg;\n let resolvedLabel = label;\n if (isCollapsed) {\n Icon = ChevronRightSvg;\n resolvedLabel = 'Expand';\n }\n\n let shortcutNode: JSX.Element | null = null;\n if (shortcut != null) {\n shortcutNode = <ShortcutHint keys={shortcut} />;\n }\n\n return (\n <button\n type=\"button\"\n className={cx(styles.button, className)}\n onClick={onToggle}\n aria-pressed={isCollapsed}\n >\n <span className={styles.icon} aria-hidden=\"true\">\n <Icon width={18} height={18} />\n </span>\n <span className={styles.label}>{resolvedLabel}</span>\n {shortcutNode}\n </button>\n );\n};\n\nexport default SidebarCollapseToggle;\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n borderWidth: 0,\n borderStyle: 'solid',\n borderBottomWidth: 'default',\n borderBottomColor: 'border',\n paddingBottom: 3,\n marginBottom: 3,\n});\n\nexport const topRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 3,\n flexWrap: 'wrap',\n});\n\nexport const left = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flex: 1,\n minWidth: 0,\n});\n\nexport const right = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n justifyContent: 'flex-end',\n flexShrink: 0,\n});\n\nexport const bottomRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 3,\n flexWrap: 'wrap',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport * as styles from './tableToolbar.css.js';\nimport { cx } from '@plumile/ui';\n\nexport type TableToolbarProps = {\n search?: ReactNode;\n filters?: ReactNode;\n leftActions?: ReactNode;\n rightActions?: ReactNode;\n bottomLeft?: ReactNode;\n bottomRight?: ReactNode;\n className?: string;\n};\n\nexport const TableToolbar = ({\n search,\n filters,\n leftActions,\n rightActions,\n bottomLeft,\n bottomRight,\n className,\n}: TableToolbarProps): JSX.Element | null => {\n const showTop =\n search != null ||\n filters != null ||\n leftActions != null ||\n rightActions != null;\n const showBottom = bottomLeft != null || bottomRight != null;\n\n if (!showTop && !showBottom) {\n return null;\n }\n\n let topNode: JSX.Element | null = null;\n if (showTop) {\n topNode = (\n <div className={styles.topRow}>\n <div className={styles.left}>\n {search}\n {filters}\n {leftActions}\n </div>\n <div className={styles.right}>{rightActions}</div>\n </div>\n );\n }\n\n let bottomNode: JSX.Element | null = null;\n if (showBottom) {\n bottomNode = (\n <div className={styles.bottomRow}>\n <div className={styles.left}>{bottomLeft}</div>\n <div className={styles.right}>{bottomRight}</div>\n </div>\n );\n }\n\n return (\n <div className={cx(styles.container, className)}>\n {topNode}\n {bottomNode}\n </div>\n );\n};\n\nexport default TableToolbar;\n","import { sprinkles } from '../../../theme/sprinkles.css.js';\n\nexport const list = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const item = sprinkles({\n display: 'flex',\n gap: 3,\n});\n\nexport const gutter = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n gap: 1,\n flexShrink: 0,\n});\n\nexport const dot = sprinkles({\n width: 2,\n height: 2,\n borderRadius: 'full',\n marginTop: 1,\n});\n\nexport const line = sprinkles({\n width: 2,\n flex: 1,\n});\n\nexport const body = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n paddingBottom: 2,\n});\n\nexport const header = sprinkles({\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'baseline',\n gap: 2,\n flexWrap: 'wrap',\n});\n\nexport const title = sprinkles({\n fontSize: 'sm',\n fontWeight: 'semibold',\n});\n\nexport const time = sprinkles({\n fontSize: 'xs',\n});\n\nexport const description = sprinkles({\n fontSize: 'sm',\n});\n\nexport const meta = sprinkles({\n fontSize: 'xs',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport { cx } from '../../../theme/tools.js';\nimport * as styles from './auditTimeline.css.js';\n\nexport type AuditTimelineEvent<T = unknown> = {\n id: string;\n title: ReactNode;\n time?: ReactNode;\n description?: ReactNode;\n meta?: ReactNode;\n raw?: T;\n};\n\nexport type AuditTimelineProps<T = unknown> = {\n events: readonly AuditTimelineEvent<T>[];\n className?: string;\n renderEvent?: (event: AuditTimelineEvent<T>) => ReactNode;\n};\n\nexport const AuditTimeline = <T,>({\n events,\n className,\n renderEvent,\n}: AuditTimelineProps<T>): JSX.Element | null => {\n if (events.length === 0) {\n return null;\n }\n\n return (\n <ol className={cx(styles.list, className)}>\n {events.map((event, index) => {\n const isLast = index === events.length - 1;\n const custom = renderEvent?.(event);\n if (custom != null) {\n return <li key={event.id}>{custom}</li>;\n }\n\n let lineNode: JSX.Element | null = null;\n if (!isLast) {\n lineNode = <div className={styles.line} />;\n }\n\n let timeNode: JSX.Element | null = null;\n if (event.time != null) {\n timeNode = <div className={styles.time}>{event.time}</div>;\n }\n\n let descriptionNode: JSX.Element | null = null;\n if (event.description != null) {\n descriptionNode = (\n <div className={styles.description}>{event.description}</div>\n );\n }\n\n let metaNode: JSX.Element | null = null;\n if (event.meta != null) {\n metaNode = <div className={styles.meta}>{event.meta}</div>;\n }\n\n return (\n <li key={event.id} className={styles.item}>\n <div className={styles.gutter} aria-hidden=\"true\">\n <div className={styles.dot} />\n {lineNode}\n </div>\n <div className={styles.body}>\n <div className={styles.header}>\n <div className={styles.title}>{event.title}</div>\n {timeNode}\n </div>\n {descriptionNode}\n {metaNode}\n </div>\n </li>\n );\n })}\n </ol>\n );\n};\n\nexport default AuditTimeline;\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const wrapper = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const selectionCell = sprinkles({\n justifyContent: 'center',\n});\n","import { useCallback, useMemo, type JSX, type ReactNode } from 'react';\n\nimport { Checkbox, cx } from '@plumile/ui';\nimport {\n DataTable,\n type DataTableColumn,\n type GetRowId,\n} from '../../../components/data-table/DataTable.js';\n\nimport { BulkActionsBar } from '../../molecules/bulk_actions_bar/BulkActionsBar.js';\nimport {\n TableToolbar,\n type TableToolbarProps,\n} from '../../molecules/table_toolbar/TableToolbar.js';\n\nimport * as styles from './backofficeDataTable.css.js';\n\nexport type BackofficeDataTableSelection<Row> = {\n selectedRowIds: ReadonlySet<string>;\n onSelectionChange: (next: ReadonlySet<string>) => void;\n isRowSelectable?: (row: Row, index: number) => boolean;\n};\n\nexport type BackofficeDataTableProps<Row> = {\n columns: readonly DataTableColumn<Row>[];\n rows: readonly Row[];\n getRowId: GetRowId<Row>;\n toolbar?: TableToolbarProps;\n selection?: BackofficeDataTableSelection<Row>;\n bulkActions?: ReactNode;\n emptyState?: JSX.Element;\n className?: string;\n};\n\ntype WrappedRow<Row> = {\n row: Row;\n index: number;\n id: string;\n selectable: boolean;\n};\n\nconst buildSelectionColumn = <Row,>(options: {\n rows: readonly WrappedRow<Row>[];\n selection: BackofficeDataTableSelection<Row>;\n}): DataTableColumn<WrappedRow<Row>> => {\n const { rows, selection } = options;\n\n const selectableRowIds: string[] = [];\n for (const wrapped of rows) {\n if (wrapped.selectable) {\n selectableRowIds.push(wrapped.id);\n }\n }\n\n const selectedCount = selectableRowIds.filter((id) => {\n return selection.selectedRowIds.has(id);\n }).length;\n\n const isAllSelected =\n selectableRowIds.length > 0 && selectedCount === selectableRowIds.length;\n\n const toggleAll = (): void => {\n if (selectableRowIds.length === 0) {\n return;\n }\n if (isAllSelected) {\n selection.onSelectionChange(new Set());\n return;\n }\n selection.onSelectionChange(new Set(selectableRowIds));\n };\n\n return {\n id: '__select',\n header: (\n <div className={styles.selectionCell}>\n <Checkbox\n checked={isAllSelected}\n onChange={() => {\n toggleAll();\n }}\n aria-label=\"Select all\"\n />\n </div>\n ),\n cell: (wrapped) => {\n const { id: rowId, selectable } = wrapped;\n const checked = selection.selectedRowIds.has(rowId);\n\n return (\n <div className={styles.selectionCell}>\n <Checkbox\n checked={checked}\n disabled={!selectable}\n onChange={() => {\n const next = new Set(selection.selectedRowIds);\n if (next.has(rowId)) {\n next.delete(rowId);\n } else if (selectable) {\n next.add(rowId);\n }\n selection.onSelectionChange(next);\n }}\n aria-label=\"Select row\"\n />\n </div>\n );\n },\n className: styles.selectionCell,\n };\n};\n\nexport const BackofficeDataTable = <Row,>({\n columns,\n rows,\n getRowId,\n toolbar,\n selection,\n bulkActions,\n emptyState,\n className,\n}: BackofficeDataTableProps<Row>): JSX.Element => {\n const wrappedRows = useMemo<readonly WrappedRow<Row>[]>(() => {\n return rows.map((row, index) => {\n const id = getRowId(row, index);\n const selectable = selection?.isRowSelectable?.(row, index) ?? true;\n return { row, index, id, selectable };\n });\n }, [getRowId, rows, selection]);\n\n const selectionColumn = useMemo(() => {\n if (selection == null) {\n return null;\n }\n return buildSelectionColumn({ rows: wrappedRows, selection });\n }, [selection, wrappedRows]);\n\n const resolvedColumns = useMemo(() => {\n const mapped = columns.map<DataTableColumn<WrappedRow<Row>>>((column) => {\n return {\n ...column,\n cell: (wrapped: WrappedRow<Row>) => {\n return column.cell(wrapped.row);\n },\n };\n });\n if (selectionColumn == null) {\n return mapped;\n }\n return [selectionColumn, ...mapped];\n }, [columns, selectionColumn]);\n\n const columnsWithPrimary = useMemo(() => {\n const hasPrimary = resolvedColumns.some((column) => {\n return column.isPrimary === true;\n });\n if (hasPrimary) {\n return resolvedColumns;\n }\n if (resolvedColumns.length === 0) {\n return resolvedColumns;\n }\n let primaryIndex = 0;\n if (selectionColumn != null && resolvedColumns.length > 1) {\n primaryIndex = 1;\n }\n return resolvedColumns.map((column, index) => {\n if (index === primaryIndex) {\n return { ...column, isPrimary: true };\n }\n return column;\n });\n }, [resolvedColumns, selectionColumn]);\n\n const gridTemplateColumns = useMemo(() => {\n if (selectionColumn == null) {\n return undefined;\n }\n const restCount = Math.max(0, resolvedColumns.length - 1);\n return `2.75rem repeat(${restCount}, minmax(0, 1fr))`;\n }, [resolvedColumns.length, selectionColumn]);\n\n let selectedCount = 0;\n if (selection != null) {\n selectedCount = selection.selectedRowIds.size;\n }\n\n const handleClearSelection = useCallback(() => {\n if (selection != null) {\n selection.onSelectionChange(new Set());\n }\n }, [selection]);\n\n let toolbarNode: JSX.Element | null = null;\n if (toolbar != null) {\n toolbarNode = <TableToolbar {...toolbar} />;\n }\n\n let bulkActionsNode: JSX.Element | null = null;\n if (selection != null) {\n bulkActionsNode = (\n <BulkActionsBar\n selectedCount={selectedCount}\n actions={bulkActions}\n onClearSelection={handleClearSelection}\n />\n );\n }\n\n return (\n <div className={cx(styles.wrapper, className)}>\n {toolbarNode}\n {bulkActionsNode}\n\n <DataTable\n columns={columnsWithPrimary}\n rows={wrappedRows}\n getRowId={(wrapped: WrappedRow<Row>) => {\n return wrapped.id;\n }}\n emptyState={emptyState}\n className={undefined}\n headerClassName={undefined}\n bodyClassName={undefined}\n rowClassName={undefined}\n gridTemplateClassName={undefined}\n gridTemplateColumns={gridTemplateColumns}\n />\n </div>\n );\n};\n\nexport default BackofficeDataTable;\n","import { type JSX } from 'react';\nimport {\n VirtualizedConnectionTable,\n type InfiniteScrollConfig,\n type VirtualizationConfig,\n} from '../../../components/data-table/VirtualizedConnectionTable.js';\nimport type {\n DataTableColumn,\n GetRowId,\n} from '../../../components/data-table/DataTable.js';\n\nexport type BackofficeVirtualizationConfig = {\n enabled: boolean;\n rowHeightPx: number;\n overscan: number;\n};\n\nexport type BackofficeInfiniteScrollConfig = {\n enabled: boolean;\n thresholdPx?: number;\n autoLoad?: boolean;\n};\n\nexport type BackofficeVirtualizedConnectionTableProps<Row> = {\n columns: readonly DataTableColumn<Row>[];\n rows: readonly Row[];\n getRowId: GetRowId<Row>;\n emptyState?: JSX.Element;\n className?: string;\n gridTemplateColumns?: string;\n\n virtualization?: BackofficeVirtualizationConfig;\n\n infiniteScroll?: BackofficeInfiniteScrollConfig;\n hasNextPage?: boolean;\n isLoadingMore?: boolean;\n onLoadMore?: () => void;\n};\n\nconst mapVirtualization = (\n config?: BackofficeVirtualizationConfig,\n): VirtualizationConfig | undefined => {\n if (config == null) {\n return undefined;\n }\n return {\n enabled: config.enabled,\n rowHeightPx: config.rowHeightPx,\n overscan: config.overscan,\n };\n};\n\nconst mapInfiniteScroll = (\n config?: BackofficeInfiniteScrollConfig,\n): InfiniteScrollConfig | undefined => {\n if (config == null) {\n return undefined;\n }\n return {\n enabled: config.enabled,\n thresholdPx: config.thresholdPx,\n autoLoad: config.autoLoad,\n };\n};\n\nexport const BackofficeVirtualizedConnectionTable = <Row,>({\n columns,\n rows,\n getRowId,\n emptyState,\n className,\n gridTemplateColumns,\n virtualization,\n infiniteScroll,\n hasNextPage,\n isLoadingMore,\n onLoadMore,\n}: BackofficeVirtualizedConnectionTableProps<Row>): JSX.Element => {\n return (\n <VirtualizedConnectionTable\n columns={columns}\n rows={rows}\n getRowId={getRowId}\n emptyState={emptyState}\n className={className}\n gridTemplateColumns={gridTemplateColumns}\n kind={undefined}\n classes={undefined}\n virtualization={mapVirtualization(virtualization)}\n infiniteScroll={mapInfiniteScroll(infiniteScroll)}\n hasNextPage={hasNextPage}\n isLoadingMore={isLoadingMore}\n onLoadMore={onLoadMore}\n />\n );\n};\n\nexport default BackofficeVirtualizedConnectionTable;\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n});\n\nexport const topRow = sprinkles({\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n gap: 4,\n flexWrap: 'wrap',\n});\n\nexport const titleBlock = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n minWidth: 0,\n flex: 1,\n});\n\nexport const titleRow = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n flexWrap: 'wrap',\n minWidth: 0,\n});\n\nexport const title = sprinkles({\n fontSize: '3xl',\n lineHeight: '3xl',\n fontWeight: 'semibold',\n color: 'text',\n});\n\nexport const badgeRow = sprinkles({\n display: 'inline-flex',\n flexWrap: 'wrap',\n gap: 1.5,\n alignItems: 'center',\n});\n\nexport const subtitle = sprinkles({\n fontSize: 'base',\n color: 'textSecondary',\n});\n\nexport const metaSlot = sprinkles({\n display: 'flex',\n flexWrap: 'wrap',\n gap: 2,\n});\n\nexport const meta = sprinkles({\n display: 'grid',\n gap: 2,\n gridTemplateColumns: 'autoFitMinmax12_5rem',\n paddingTop: 1,\n});\n\nexport const metaItem = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n padding: 3,\n borderRadius: 'lg',\n backgroundColor: 'surfaceMuted',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n});\n\nexport const metaLabel = sprinkles({\n fontSize: 'xs',\n color: 'textMuted',\n textTransform: 'uppercase',\n letterSpacing: 'caps',\n fontWeight: 'semibold',\n});\n\nexport const metaValue = sprinkles({\n fontSize: 'base',\n color: 'text',\n fontWeight: 'medium',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport * as styles from './entityHeader.css.js';\nimport { cx } from '@plumile/ui';\n\nexport type EntityHeaderItem = {\n id: string;\n label: ReactNode;\n value: ReactNode;\n};\n\nexport type EntityHeaderProps = {\n title: ReactNode;\n subtitle?: ReactNode;\n status?: ReactNode;\n badges?: ReactNode;\n actions?: ReactNode;\n items?: readonly EntityHeaderItem[];\n metaSlot?: ReactNode;\n className?: string;\n};\n\nexport const EntityHeader = ({\n title,\n subtitle,\n status,\n badges,\n actions,\n items = [],\n metaSlot,\n className,\n}: EntityHeaderProps): JSX.Element => {\n let subtitleNode: JSX.Element | null = null;\n if (subtitle != null) {\n subtitleNode = <div className={styles.subtitle}>{subtitle}</div>;\n }\n\n let badgesNode: JSX.Element | null = null;\n if (status != null || badges != null) {\n badgesNode = (\n <div className={styles.badgeRow}>\n {status}\n {badges}\n </div>\n );\n }\n\n let itemsNode: JSX.Element | null = null;\n if (items.length > 0) {\n itemsNode = (\n <div className={styles.meta}>\n {items.map((item) => {\n return (\n <div key={item.id} className={styles.metaItem}>\n <div className={styles.metaLabel}>{item.label}</div>\n <div className={styles.metaValue}>{item.value}</div>\n </div>\n );\n })}\n </div>\n );\n }\n\n let metaSlotNode: JSX.Element | null = null;\n if (metaSlot != null) {\n metaSlotNode = <div className={styles.metaSlot}>{metaSlot}</div>;\n }\n\n return (\n <div className={cx(styles.container, className)}>\n <div className={styles.topRow}>\n <div className={styles.titleBlock}>\n <div className={styles.titleRow}>\n <div className={styles.title}>{title}</div>\n {badgesNode}\n </div>\n {subtitleNode}\n </div>\n {actions}\n </div>\n\n {metaSlotNode}\n {itemsNode}\n </div>\n );\n};\n\nexport default EntityHeader;\n","import { createVar, style } from '@vanilla-extract/css';\nimport { sprinkles } from '../../../theme/index.js';\n\nimport { backofficeLayoutTokens } from '../../layout/backofficeLayoutTokens.js';\n\nconst detailTokens = backofficeLayoutTokens.detail;\n\nexport const sidePanelTopVar = createVar();\n\nexport const container = style([\n sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n }),\n {\n vars: {\n [sidePanelTopVar]: detailTokens.stickyTop,\n },\n },\n]);\n\nexport const rowSingle = sprinkles({\n width: 'full',\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n});\n\nexport const rowSplit = sprinkles({\n display: 'grid',\n gridTemplateColumns: {\n base: 'detailSingle',\n min1200: 'detailAside320',\n },\n alignItems: {\n base: 'stretch',\n min1200: 'flex-start',\n },\n});\n\nexport const rowSplitBase = sprinkles({\n width: 'full',\n minWidth: 0,\n gap: 4,\n});\n\nexport const headerCard = sprinkles({\n minWidth: 0,\n borderRadius: '2xl',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n backgroundColor: 'surface',\n padding: 6,\n boxShadow: 'sm',\n});\n\nexport const body = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n minWidth: 0,\n});\n\nexport const sidePanelBase = style([\n sprinkles({\n position: 'sticky',\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n minWidth: 0,\n alignSelf: 'flex-start',\n }),\n {\n top: sidePanelTopVar,\n },\n]);\n\nexport const sidePanelCard = sprinkles({\n borderRadius: '2xl',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n backgroundColor: 'surface',\n padding: 4,\n boxShadow: 'sm',\n});\n\nexport const sidePanelPlain = sprinkles({\n borderWidth: 0,\n borderStyle: 'none',\n backgroundColor: 'transparent',\n padding: 0,\n boxShadow: 'none',\n});\n\nexport const tabsRow = sprinkles({\n position: 'sticky',\n backgroundColor: 'surface',\n paddingBottom: 2,\n top: 4,\n zIndex: 2,\n});\n","import { type CSSProperties, type JSX, type ReactNode } from 'react';\n\nimport {\n EntityHeader,\n type EntityHeaderProps,\n} from '../../organisms/entity_header/EntityHeader.js';\nimport * as styles from './detailPageTemplate.css.js';\nimport { cx } from '@plumile/ui';\n\ntype WithHeaderProps = {\n header: EntityHeaderProps;\n headerNode?: never;\n};\n\ntype WithHeaderNode = {\n header?: never;\n headerNode: ReactNode;\n};\n\nexport type DetailSidePanelVariant = 'card' | 'plain';\nexport type DetailLayoutVariant = 'single' | 'split';\n\nexport type DetailPageTemplateProps = (WithHeaderProps | WithHeaderNode) & {\n children: ReactNode;\n aboveContent?: ReactNode;\n tabsNode?: ReactNode;\n sidePanel?: ReactNode;\n sidePanelVariant?: DetailSidePanelVariant;\n sidePanelStickyTop?: string;\n layoutVariant?: DetailLayoutVariant;\n className?: string;\n};\n\nexport const DetailPageTemplate = (\n props: DetailPageTemplateProps,\n): JSX.Element => {\n const {\n children,\n aboveContent,\n className,\n tabsNode,\n sidePanel,\n sidePanelVariant = 'card',\n sidePanelStickyTop,\n layoutVariant,\n } = props;\n\n const hasSidePanel = sidePanel != null;\n let autoLayoutVariant: DetailLayoutVariant = 'single';\n if (hasSidePanel) {\n autoLayoutVariant = 'split';\n }\n let resolvedLayoutVariant = layoutVariant ?? autoLayoutVariant;\n if (!hasSidePanel) {\n resolvedLayoutVariant = 'single';\n }\n const isSplitLayout = resolvedLayoutVariant === 'split';\n let rowClassName = styles.rowSingle;\n if (isSplitLayout) {\n rowClassName = cx(styles.rowSplit, styles.rowSplitBase);\n }\n\n let resolvedHeader: ReactNode;\n if ('headerNode' in props) {\n resolvedHeader = props.headerNode;\n } else {\n resolvedHeader = <EntityHeader {...props.header} />;\n }\n\n const resolvedStickyTop = sidePanelStickyTop?.trim();\n let containerStyle: CSSProperties | undefined;\n if (resolvedStickyTop != null && resolvedStickyTop !== '') {\n containerStyle = {\n [styles.sidePanelTopVar]: resolvedStickyTop,\n } as CSSProperties;\n }\n\n let sidePanelClassName = styles.sidePanelCard;\n if (sidePanelVariant === 'plain') {\n sidePanelClassName = styles.sidePanelPlain;\n }\n const resolvedSidePanelClassName = cx(\n styles.sidePanelBase,\n sidePanelClassName,\n );\n\n return (\n <div className={cx(styles.container, className)} style={containerStyle}>\n <div className={rowClassName}>\n <div className={styles.headerCard}>{resolvedHeader}</div>\n </div>\n {tabsNode != null && (\n <div className={rowClassName}>\n <div className={styles.tabsRow}>{tabsNode}</div>\n </div>\n )}\n <div className={rowClassName}>\n <div className={styles.body}>\n {aboveContent}\n {children}\n </div>\n {hasSidePanel && (\n <aside className={resolvedSidePanelClassName}>{sidePanel}</aside>\n )}\n </div>\n </div>\n );\n};\n\nexport default DetailPageTemplate;\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const container = sprinkles({\n display: 'grid',\n gap: 4,\n height: 'full',\n minHeight: 0,\n});\n\nexport const containerWithToolbar = sprinkles({\n gridTemplateRows: 'autoAutoMinmax0',\n});\n\nexport const containerNoToolbar = sprinkles({\n gridTemplateRows: 'autoMinmax0',\n});\n\nexport const headerCard = sprinkles({\n borderRadius: '2xl',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n backgroundColor: 'surface',\n padding: 6,\n boxShadow: 'sm',\n});\n\nexport const toolbarCard = sprinkles({\n borderRadius: 'xl',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n backgroundColor: 'surface',\n padding: 4,\n boxShadow: 'sm',\n});\n\nexport const tableCard = sprinkles({\n display: 'grid',\n gridTemplateRows: 'minmax0Auto',\n minHeight: 0,\n borderRadius: '2xl',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'borderSubtle',\n backgroundColor: 'surface',\n padding: 4,\n boxShadow: 'sm',\n});\n\nexport const tableScroll = sprinkles({\n minHeight: 0,\n overflow: 'auto',\n});\n\nexport const tableFooter = sprinkles({\n marginTop: 0,\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport {\n BackofficeDataTable,\n type BackofficeDataTableProps,\n} from '../../organisms/backoffice_data_table/BackofficeDataTable.js';\nimport {\n EntityHeader,\n type EntityHeaderProps,\n} from '../../organisms/entity_header/EntityHeader.js';\n\nimport * as styles from './listPageTemplate.css.js';\nimport { cx } from '@plumile/ui';\n\ntype ListBaseProps = {\n toolbarNode?: ReactNode;\n tableFooterNode?: ReactNode;\n className?: string;\n};\n\ntype ListWithHeaderProps<Row> = ListBaseProps & {\n header: EntityHeaderProps;\n headerNode?: never;\n table: BackofficeDataTableProps<Row>;\n tableNode?: never;\n};\n\ntype ListWithHeaderNode<Row> = ListBaseProps & {\n header?: never;\n headerNode: ReactNode;\n table: BackofficeDataTableProps<Row>;\n tableNode?: never;\n};\n\ntype ListWithCustomTable =\n | (ListBaseProps & {\n header: EntityHeaderProps;\n headerNode?: never;\n table?: never;\n tableNode: ReactNode;\n })\n | (ListBaseProps & {\n header?: never;\n headerNode: ReactNode;\n table?: never;\n tableNode: ReactNode;\n });\n\nexport type ListPageTemplateProps<Row> =\n | ListWithHeaderProps<Row>\n | ListWithHeaderNode<Row>\n | ListWithCustomTable;\n\nexport const ListPageTemplate = <Row,>(\n props: ListPageTemplateProps<Row>,\n): JSX.Element => {\n const { className, toolbarNode, tableFooterNode } = props;\n\n let containerVariant = styles.containerNoToolbar;\n if (toolbarNode != null) {\n containerVariant = styles.containerWithToolbar;\n }\n\n const containerClasses = cx(styles.container, containerVariant, className);\n\n let resolvedHeader: ReactNode;\n if ('headerNode' in props) {\n resolvedHeader = props.headerNode;\n } else {\n resolvedHeader = <EntityHeader {...props.header} />;\n }\n\n let resolvedTable: ReactNode;\n if ('tableNode' in props) {\n resolvedTable = props.tableNode;\n } else {\n resolvedTable = <BackofficeDataTable {...props.table} />;\n }\n\n let footerSection: ReactNode | null = null;\n if (tableFooterNode != null) {\n footerSection = <div className={styles.tableFooter}>{tableFooterNode}</div>;\n }\n\n return (\n <div className={containerClasses}>\n <div className={styles.headerCard}>{resolvedHeader}</div>\n {toolbarNode != null && (\n <div className={styles.toolbarCard}>{toolbarNode}</div>\n )}\n <div className={styles.tableCard}>\n <div className={styles.tableScroll}>{resolvedTable}</div>\n {footerSection}\n </div>\n </div>\n );\n};\n\nexport default ListPageTemplate;\n","import { recipe, type RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { sprinkles, vars } from '../../../theme/index.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n height: 'full',\n backgroundColor: 'surface',\n borderWidth: 0,\n borderStyle: 'solid',\n borderRightWidth: 'px',\n borderRightColor: 'borderSubtle',\n});\n\nexport const widthRecipe = recipe({\n variants: {\n state: {\n expanded: { width: vars.width[64] },\n collapsed: { width: vars.width[17.5] },\n },\n },\n defaultVariants: {\n state: 'expanded',\n },\n});\n\nexport type WidthRecipeVariants = RecipeVariants<typeof widthRecipe>;\n\nexport const inner = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n padding: 4,\n height: 'full',\n minHeight: 0,\n});\n\nexport const header = sprinkles({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 2,\n paddingX: 1,\n});\n\nexport const sections = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n flex: 1,\n minHeight: 0,\n overflowY: 'auto',\n});\n\nexport const search = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n paddingX: 1,\n});\n\nexport const footer = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n paddingX: 1,\n});\n","import { useCallback, useState, type JSX, type ReactNode } from 'react';\nimport type { RecipeVariants } from '@vanilla-extract/recipes';\n\nimport { SidebarCollapseToggle } from '../../../backoffice/molecules/sidebar_collapse_toggle/SidebarCollapseToggle.js';\nimport {\n SidebarNavSection,\n type SidebarNavSectionItem,\n} from '../../../backoffice/molecules/sidebar_nav_section/SidebarNavSection.js';\n\nimport * as styles from './adminSidebar.css.js';\nimport { cx } from '@plumile/ui';\n\nexport type AdminSidebarSection = {\n id: string;\n title?: ReactNode;\n items: readonly SidebarNavSectionItem[];\n collapsible?: boolean;\n defaultCollapsed?: boolean;\n isCollapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n};\n\nexport type AdminSidebarProps = {\n header?: ReactNode;\n search?: ReactNode;\n footer?: ReactNode;\n sections: readonly AdminSidebarSection[];\n isCollapsed?: boolean;\n defaultCollapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n collapseToggleLabel?: ReactNode;\n collapseShortcut?: readonly string[] | string;\n className?: string;\n};\n\nexport const AdminSidebar = ({\n header,\n search,\n footer,\n sections,\n isCollapsed,\n defaultCollapsed = false,\n onCollapsedChange,\n collapseToggleLabel,\n collapseShortcut,\n className,\n}: AdminSidebarProps): JSX.Element => {\n const [uncontrolledCollapsed, setUncontrolledCollapsed] =\n useState(defaultCollapsed);\n\n const collapsed = isCollapsed ?? uncontrolledCollapsed;\n\n const handleToggleCollapsed = useCallback(() => {\n const next = !collapsed;\n if (isCollapsed == null) {\n setUncontrolledCollapsed(next);\n }\n onCollapsedChange?.(next);\n }, [collapsed, isCollapsed, onCollapsedChange]);\n\n let widthKey: NonNullable<\n NonNullable<RecipeVariants<typeof styles.widthRecipe>>['state']\n > = 'expanded';\n if (collapsed) {\n widthKey = 'collapsed';\n }\n\n let footerNode: JSX.Element | null = null;\n if (footer != null) {\n footerNode = <div className={styles.footer}>{footer}</div>;\n }\n\n return (\n <aside\n className={cx(\n styles.container,\n styles.widthRecipe({ state: widthKey }),\n className,\n )}\n >\n <div className={styles.inner}>\n <div className={styles.header}>\n {header}\n <SidebarCollapseToggle\n isCollapsed={collapsed}\n onToggle={handleToggleCollapsed}\n label={collapseToggleLabel}\n shortcut={collapseShortcut}\n />\n </div>\n\n {search != null && <div className={styles.search}>{search}</div>}\n <nav className={styles.sections} aria-label=\"Admin navigation\">\n {sections.map((section) => {\n return (\n <SidebarNavSection\n key={section.id}\n title={section.title}\n items={section.items}\n collapsible={section.collapsible}\n defaultCollapsed={section.defaultCollapsed}\n isCollapsed={section.isCollapsed}\n onCollapsedChange={section.onCollapsedChange}\n collapsed={collapsed}\n />\n );\n })}\n </nav>\n\n {footerNode}\n </div>\n </aside>\n );\n};\n\nexport default AdminSidebar;\n","import { sprinkles } from '../../../theme/index.js';\n\nexport const container = sprinkles({\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n minWidth: 0,\n width: 'full',\n});\n\nexport const row = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n flexWrap: 'wrap',\n minWidth: 0,\n});\n\nexport const left = sprinkles({\n display: 'flex',\n alignItems: 'center',\n gap: 3,\n flex: 1,\n minWidth: 0,\n});\n\nexport const right = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n gap: 2,\n justifyContent: 'flex-end',\n flexShrink: 0,\n});\n\nexport const divider = sprinkles({\n display: 'inline-flex',\n alignItems: 'center',\n height: 6,\n width: 0.5,\n backgroundColor: 'border',\n});\n","import { type JSX, type ReactNode } from 'react';\n\nimport * as styles from './adminTopbar.css.js';\nimport { cx } from '@plumile/ui';\n\nexport type AdminTopbarProps = {\n breadcrumb?: ReactNode;\n leftSlot?: ReactNode;\n rightSlot?: ReactNode;\n className?: string;\n};\n\nexport const AdminTopbar = ({\n breadcrumb,\n leftSlot,\n rightSlot,\n className,\n}: AdminTopbarProps): JSX.Element => {\n return (\n <div className={cx(styles.container, className)}>\n <div className={styles.row}>\n <div className={styles.left}>\n {breadcrumb}\n {leftSlot}\n </div>\n <div className={styles.right}>{rightSlot}</div>\n </div>\n </div>\n );\n};\n\nexport default AdminTopbar;\n","import { type JSX, type ReactNode } from 'react';\n\nimport { AppShell } from '../../../components/layout/AppShell.js';\nimport {\n AdminSidebar,\n type AdminSidebarProps,\n} from '../../organisms/admin_sidebar/AdminSidebar.js';\nimport {\n AdminTopbar,\n type AdminTopbarProps,\n} from '../../organisms/admin_topbar/AdminTopbar.js';\nimport type { PageShellActions, PageShellTab } from '@plumile/ui';\n\nexport type AdminShellLayoutProps = {\n children: ReactNode;\n sidebar: AdminSidebarProps;\n topbar?: AdminTopbarProps;\n actions?: PageShellActions;\n tabs?: PageShellTab[];\n};\n\nexport const AdminShellLayout = ({\n children,\n sidebar,\n topbar,\n actions,\n tabs,\n}: AdminShellLayoutProps): JSX.Element => {\n const sidebarNode = <AdminSidebar {...sidebar} />;\n let topbarNode: JSX.Element | null = null;\n if (topbar != null) {\n topbarNode = <AdminTopbar {...topbar} />;\n }\n\n return (\n <AppShell\n sidebar={sidebarNode}\n breadcrumbSlot={topbarNode}\n actions={actions}\n tabs={tabs}\n >\n {children}\n </AppShell>\n );\n};\n\nexport default AdminShellLayout;\n","import { style } from '@vanilla-extract/css';\nimport { vars } from '../../theme/index.js';\n\nexport const adminThemeClass = style({\n vars: {\n [vars.colors.background]: '#F7F8FB',\n [vars.colors.backgroundSecondary]: '#F2F4F8',\n [vars.colors.backgroundTertiary]: '#EAEDF2',\n [vars.colors.backgroundModifier]: '#E1E6EE',\n [vars.colors.surface]: '#FFFFFF',\n [vars.colors.surfaceSecondary]: '#F6F8FC',\n [vars.colors.surfaceMuted]: '#F1F4F8',\n [vars.colors.surfaceElevated]: '#FFFFFF',\n [vars.colors.text]: '#0B111E',\n [vars.colors.textSecondary]: '#4A5568',\n [vars.colors.textMuted]: '#6B7280',\n [vars.colors.border]: '#E1E6EE',\n [vars.colors.borderSubtle]: '#E7EBF2',\n [vars.colors.borderStrong]: '#D2D9E4',\n [vars.colors.borderLight]: '#E1E6EE',\n [vars.colors.primaryLight]: 'rgba(165, 2, 70, 0.08)',\n [vars.colors.brandLightGray]: '#F5F7FB',\n },\n backgroundColor: vars.colors.background,\n color: vars.colors.text,\n minHeight: '100vh',\n});\n","import type { JSX, ReactNode } from 'react';\n\nimport '../../theme/accessibility.css.js';\nimport '../../theme/global.css.js';\n\nimport { adminThemeClass } from './adminTheme.css.js';\n\nexport type AdminThemeProviderProps = {\n children: ReactNode;\n};\n\nexport const AdminThemeProvider = ({\n children,\n}: AdminThemeProviderProps): JSX.Element => {\n return <div className={adminThemeClass}>{children}</div>;\n};\n\nexport default AdminThemeProvider;\n","export const FALLBACK_REFERENCE = '—';\n\n/**\n * Returns a display-safe string or a fallback glyph when the value is absent.\n */\nexport function formatNullableString(value: string | null | undefined): string {\n if (value == null) {\n return FALLBACK_REFERENCE;\n }\n\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n return FALLBACK_REFERENCE;\n }\n\n return value;\n}\n\n/**\n * Formats numeric values for UI display while preserving a fallback for nullish input.\n */\nexport function formatNullableNumber(value: number | null | undefined): string {\n if (value == null) {\n return FALLBACK_REFERENCE;\n }\n\n if (Number.isFinite(value)) {\n return value.toLocaleString();\n }\n\n return String(value);\n}\n\n/**\n * Joins a list of labels for display or returns the fallback when the list is empty.\n */\nexport function formatStringList(values: readonly string[]): string {\n if (values.length === 0) {\n return FALLBACK_REFERENCE;\n }\n\n return values.join(', ');\n}\n\n/**\n * Formats a currency amount with locale-aware separators and a null-safe fallback.\n */\nexport function formatNullableCurrency(\n value: number | null | undefined,\n currency = 'USD',\n locale?: string,\n): string {\n if (value == null) {\n return FALLBACK_REFERENCE;\n }\n\n const numeric = Number(value);\n if (!Number.isFinite(numeric)) {\n return FALLBACK_REFERENCE;\n }\n\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n currencyDisplay: 'symbol',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(numeric);\n } catch {\n return numeric.toString();\n }\n}\n","import { style } from '@vanilla-extract/css';\n\nimport {\n tableCellFontSizeVar,\n tableCellPaddingVar,\n tableEmptyRowPaddingVar,\n} from '../components/data-table/DataTable.css.js';\nimport { vars } from '../theme/index.js';\n\nexport const denseTableClass = style({\n vars: {\n [tableCellPaddingVar]: `${vars.spacing[2]} ${vars.spacing[3]}`,\n [tableCellFontSizeVar]: vars.fontSize.sm,\n [tableEmptyRowPaddingVar]: `${vars.spacing[4]} ${vars.spacing[3]}`,\n },\n});\n","import type { JSX, ReactNode } from 'react';\n\ntype Props = {\n children: ReactNode;\n};\n\nexport const WrapperPage = ({ children }: Props): JSX.Element => {\n return <>{children}</>;\n};\n\nexport default WrapperPage;\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const BanSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M6 6l12 12\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ChatSizeLargeSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <rect\n x=\"3\"\n y=\"2\"\n width=\"18\"\n height=\"18\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M8 5H16\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M8 9H16\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M8 13H16\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M8 16H14\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ChatSizeMediumSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <rect\n x=\"3\"\n y=\"4\"\n width=\"18\"\n height=\"14\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M8 7H16\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M8 11H16\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M8 14H12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ChatSizeSmallSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <rect\n x=\"3\"\n y=\"6\"\n width=\"18\"\n height=\"10\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path\n d=\"M8 9H16\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M8 12H14\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ChatCheckSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M21 15C21 15.5304 20.7893 16.0391 20.4142 16.4142C20.0391 16.7893 19.5304 17 19 17H7L3 21V5C3 4.46957 3.21071 3.96086 3.58579 3.58579C3.96086 3.21071 4.46957 3 5 3H19C19.5304 3 20.0391 3.21071 20.4142 3.58579C20.7893 3.96086 21 4.46957 21 5V15Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m14.5 16.5 1.5 1.5 3.5-3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ChatXSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M21 15C21 15.5304 20.7893 16.0391 20.4142 16.4142C20.0391 16.7893 19.5304 17 19 17H7L3 21V5C3 4.46957 3.21071 3.96086 3.58579 3.58579C3.96086 3.21071 4.46957 3 5 3H19C19.5304 3 20.0391 3.21071 20.4142 3.58579C20.7893 3.96086 21 4.46957 21 5V15Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m15 16 4 4m0-4-4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const CheckSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M5 13.5L9.5 18 19 8.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const CoinOffSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <ellipse\n cx=\"12\"\n cy=\"8\"\n rx=\"7\"\n ry=\"3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M5 8v8c0 1.66 3.13 3 7 3s7-1.34 7-3V8\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M5 12c0 1.66 3.13 3 7 3s7-1.34 7-3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3 3l18 18\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ClockSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 7v5l3 2\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const DatabaseCheckSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <ellipse\n cx=\"12\"\n cy=\"6.5\"\n rx=\"7\"\n ry=\"3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M5 6.5v9c0 1.66 3.13 3 7 3s7-1.34 7-3v-9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M5 11c0 1.66 3.13 3 7 3s7-1.34 7-3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m14.5 16.5 1.5 1.5 3.5-3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const DatabaseXSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <ellipse\n cx=\"12\"\n cy=\"6.5\"\n rx=\"7\"\n ry=\"3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M5 6.5v9c0 1.66 3.13 3 7 3s7-1.34 7-3v-9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M5 11c0 1.66 3.13 3 7 3s7-1.34 7-3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m15 16 4 4m0-4-4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const DevModeSvg = ({\n width = 20,\n height = 20,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"m7 8.25-4 4 4 4m10-8 4 4-4 4M13 4l-2 16\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const EyeSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M2.5 12S6.5 6 12 6s9.5 6 9.5 6-4 6-9.5 6-9.5-6-9.5-6Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"12\" cy=\"12\" r=\"3\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const GripDotsSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <circle cx=\"9\" cy=\"6\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"15\" cy=\"6\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"9\" cy=\"12\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"15\" cy=\"12\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"9\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"15\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n );\n};\n\nexport default GripDotsSvg;\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const HomeActivityAssignUserSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M16 21V19C16 17.9391 15.5786 16.9217 14.8284 16.1716C14.0783 15.4214 13.0609 15 12 15H5C3.93913 15 2.92172 15.4214 2.17157 16.1716C1.42143 16.9217 1 17.9391 1 19V21\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M8.5 11C10.7091 11 12.5 9.20914 12.5 7C12.5 4.79086 10.7091 3 8.5 3C6.29086 3 4.5 4.79086 4.5 7C4.5 9.20914 6.29086 11 8.5 11Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M20 8V14\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M23 11H17\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const HomeStatsCheckBadgeSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M22 11.08V12C21.9988 14.1564 21.3005 16.2547 20.0093 17.9818C18.7182 19.709 16.9033 20.9725 14.8354 21.5839C12.7674 22.1953 10.5573 22.1219 8.53447 21.3746C6.51168 20.6273 4.78465 19.2461 3.61096 17.4371C2.43727 15.628 1.87979 13.4881 2.02168 11.3363C2.16356 9.18457 2.99721 7.13633 4.39828 5.49707C5.79935 3.85782 7.69279 2.71538 9.79619 2.24015C11.8996 1.76491 14.1003 1.98234 16.07 2.86\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M22 4L12 14.01L9 11.01\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const HomeStatsClipboardSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M16 4H18C18.5304 4 19.0391 4.21071 19.4142 4.58579C19.7893 4.96086 20 5.46957 20 6V20C20 20.5304 19.7893 21.0391 19.4142 21.4142C19.0391 21.7893 18.5304 22 18 22H6C5.46957 22 4.96086 21.7893 4.58579 21.4142C4.21071 21.0391 4 20.5304 4 20V6C4 5.46957 4.21071 4.96086 4.58579 4.58579C4.96086 4.21071 5.46957 4 6 4H8\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M15 2H9C8.44772 2 8 2.44772 8 3V5C8 5.55228 8.44772 6 9 6H15C15.5523 6 16 5.55228 16 5V3C16 2.44772 15.5523 2 15 2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const HomeStatsClockSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M12 22C17.5228 22 22 17.5228 22 12C22 6.47715 17.5228 2 12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 6V12L16 14\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const KeyOffSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <circle\n cx=\"7.5\"\n cy=\"16.5\"\n r=\"3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M11 16.5h10l-2 2m2-2-2-2\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M3 3l18 18\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const KeySvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <circle\n cx=\"7.5\"\n cy=\"16.5\"\n r=\"3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M11 16.5h10l-2 2m2-2-2-2\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M16 16.5v-3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const LinkCheckSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M10 13a5 5 0 0 1 0-7l1.5-1.5a5 5 0 0 1 7 7L17 13\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14 11a5 5 0 0 1 0 7L12.5 19.5a5 5 0 0 1-7-7L7 11\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m14.5 16.5 1.5 1.5 3.5-3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const LinkXSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M10 13a5 5 0 0 1 0-7l1.5-1.5a5 5 0 0 1 7 7L17 13\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M14 11a5 5 0 0 1 0 7L12.5 19.5a5 5 0 0 1-7-7L7 11\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m15 16 4 4m0-4-4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const LockOpenSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <rect\n x=\"5\"\n y=\"11\"\n width=\"14\"\n height=\"10\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M8 11V8a4 4 0 0 1 7.5-2\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const LockSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <rect\n x=\"5\"\n y=\"11\"\n width=\"14\"\n height=\"10\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M8 11V8a4 4 0 0 1 8 0v3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const MailCheckSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <rect\n x=\"4\"\n y=\"6\"\n width=\"16\"\n height=\"12\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M4.5 7.5 12 13l7.5-5.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m14.5 16.5 1.5 1.5 3.5-3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const MailXSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <rect\n x=\"4\"\n y=\"6\"\n width=\"16\"\n height=\"12\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M4.5 7.5 12 13l7.5-5.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m15 16 4 4m0-4-4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const PencilSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 640 640\"\n {...rest}\n >\n <path d=\"M505 122.9L517.1 135C526.5 144.4 526.5 159.6 517.1 168.9L488 198.1L441.9 152L471 122.9C480.4 113.5 495.6 113.5 504.9 122.9zM273.8 320.2L408 185.9L454.1 232L319.8 366.2C316.9 369.1 313.3 371.2 309.4 372.3L250.9 389L267.6 330.5C268.7 326.6 270.8 323 273.7 320.1zM437.1 89L239.8 286.2C231.1 294.9 224.8 305.6 221.5 317.3L192.9 417.3C190.5 425.7 192.8 434.7 199 440.9C205.2 447.1 214.2 449.4 222.6 447L322.6 418.4C334.4 415 345.1 408.7 353.7 400.1L551 202.9C579.1 174.8 579.1 129.2 551 101.1L538.9 89C510.8 60.9 465.2 60.9 437.1 89zM152 128C103.4 128 64 167.4 64 216L64 488C64 536.6 103.4 576 152 576L424 576C472.6 576 512 536.6 512 488L512 376C512 362.7 501.3 352 488 352C474.7 352 464 362.7 464 376L464 488C464 510.1 446.1 528 424 528L152 528C129.9 528 112 510.1 112 488L112 216C112 193.9 129.9 176 152 176L264 176C277.3 176 288 165.3 288 152C288 138.7 277.3 128 264 128L152 128z\" />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const PinFilledSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M8 3H16V5L14.5 7V12L18 15.5V17H6V15.5L9.5 12V7L8 5V3Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M12 17V22\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default PinFilledSvg;\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const PinSvg = ({\n width = 24,\n height = 24,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M8 3H16V5L14.5 7V12L18 15.5V17H6V15.5L9.5 12V7L8 5V3Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 17V22\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default PinSvg;\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ProfileDropdownOrganizationSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M20 21V19C20 17.9391 19.5786 16.9217 18.8284 16.1716C18.0783 15.4214 17.0609 15 16 15H8C6.93913 15 5.92172 15.4214 5.17157 16.1716C4.42143 16.9217 4 17.9391 4 19V21\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 11C14.2091 11 16 9.20914 16 7C16 4.79086 14.2091 3 12 3C9.79086 3 8 4.79086 8 7C8 9.20914 9.79086 11 12 11Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const RobotCheckSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M12 3v3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <rect\n x=\"6\"\n y=\"6\"\n width=\"12\"\n height=\"12\"\n rx=\"3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"10\" cy=\"11\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"14\" cy=\"11\" r=\"1\" fill=\"currentColor\" />\n <path\n d=\"M9.5 15h5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m14.5 16.5 1.5 1.5 3.5-3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const RobotSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M12 3v3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <rect\n x=\"6\"\n y=\"6\"\n width=\"12\"\n height=\"12\"\n rx=\"3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"10\" cy=\"11\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"14\" cy=\"11\" r=\"1\" fill=\"currentColor\" />\n <path\n d=\"M9.5 15h5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const RobotXSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M12 3v3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <rect\n x=\"6\"\n y=\"6\"\n width=\"12\"\n height=\"12\"\n rx=\"3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <circle cx=\"10\" cy=\"11\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"14\" cy=\"11\" r=\"1\" fill=\"currentColor\" />\n <path\n d=\"M9.5 15h5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m15 16 4 4m0-4-4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const RocketOffSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M3 3l18 18\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 2c3 2 5 5 5 9 0 3-1.2 5.7-3 7.5L12 21l-2-2.5C8.2 16.7 7 14 7 11c0-4 2-7 5-9z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M7 12l-3 1 1-3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M17 12l3 1-1-3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 22c-1 0-2-.5-2-1.5 0-1 1-2.5 2-3 1 .5 2 2 2 3S13 22 12 22z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M10.5 10a1.5 1.5 0 012.6-1\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default RocketOffSvg;\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const RocketSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M12 2c3 2 5 5 5 9 0 3-1.2 5.7-3 7.5L12 21l-2-2.5C8.2 16.7 7 14 7 11c0-4 2-7 5-9z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M7 12l-3 1 1-3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M17 12l3 1-1-3\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 22c-1 0-2-.5-2-1.5 0-1 1-2.5 2-3 1 .5 2 2 2 3S13 22 12 22z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M10.5 10a1.5 1.5 0 103 0 1.5 1.5 0 00-3 0z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default RocketSvg;\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const SendCheckSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <line\n x1=\"22\"\n y1=\"2\"\n x2=\"11\"\n y2=\"13\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <polygon\n points=\"22 2 15 22 11 13 2 9 22 2\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m14.5 16.5 1.5 1.5 3.5-3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const SendMessageSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <line\n x1=\"22\"\n y1=\"2\"\n x2=\"11\"\n y2=\"13\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <polygon\n points=\"22 2 15 22 11 13 2 9 22 2\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const SendXSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <line\n x1=\"22\"\n y1=\"2\"\n x2=\"11\"\n y2=\"13\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <polygon\n points=\"22 2 15 22 11 13 2 9 22 2\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m15 16 4 4m0-4-4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const SettingsCheckSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m14.5 16.5 1.5 1.5 3.5-3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const SettingsXSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M12 15C13.6569 15 15 13.6569 15 12C15 10.3431 13.6569 9 12 9C10.3431 9 9 10.3431 9 12C9 13.6569 10.3431 15 12 15Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m15 16 4 4m0-4-4 4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ShieldLockSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M12 2 20 6v6c0 5-3.5 9-8 10-4.5-1-8-5-8-10V6l8-4Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <rect\n x=\"9\"\n y=\"11\"\n width=\"6\"\n height=\"6\"\n rx=\"1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M10.5 11v-1a1.5 1.5 0 0 1 3 0v1\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const ShieldOffSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M12 2 20 6v6c0 5-3.5 9-8 10-4.5-1-8-5-8-10V6l8-4Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M4 4l16 16\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const TaskAttachmentSvg = ({\n width = 18,\n height = 18,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M21.44 11.05L12.25 20.24C11.1242 21.3658 9.59718 21.9983 8.00498 21.9983C6.41278 21.9983 4.88581 21.3658 3.75998 20.24C2.63416 19.1142 2.00164 17.5872 2.00164 15.995C2.00164 14.4028 2.63416 12.8758 3.75998 11.75L12.33 3.18C13.0806 2.42938 14.0973 2.00548 15.1575 2.00548C16.2177 2.00548 17.2344 2.42938 17.985 3.18C18.7356 3.93062 19.1595 4.94734 19.1595 6.0075C19.1595 7.06766 18.7356 8.08438 17.985 8.835L9.40998 17.41C9.03467 17.7853 8.52631 17.9972 7.99623 17.9972C7.46616 17.9972 6.95779 17.7853 6.58248 17.41C6.20717 17.0347 5.99522 16.5263 5.99522 15.9962C5.99522 15.4662 6.20717 14.9578 6.58248 14.5825L15.07 6.1\"\n stroke=\"black\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const TaskCommentBubbleSvg = ({\n width = 14,\n height = 14,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M21 15C21 15.5304 20.7893 16.0391 20.4142 16.4142C20.0391 16.7893 19.5304 17 19 17H7L3 21V5C3 4.46957 3.21071 3.96086 3.58579 3.58579C3.96086 3.21071 4.46957 3 5 3H19C19.5304 3 20.0391 3.21071 20.4142 3.58579C20.7893 3.96086 21 4.46957 21 5V15Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const TaskDependencyBlockedSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M18.364 5.636A9 9 0 105.636 18.364 9 9 0 0018.364 5.636z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M15 9l-6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default TaskDependencyBlockedSvg;\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const TaskDependencyReadySvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M9 12l2 2 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M12 21a9 9 0 100-18 9 9 0 000 18z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nexport default TaskDependencyReadySvg;\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const WrenchSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M14 7a5 5 0 0 0-6 6l-4 4 3 3 4-4a5 5 0 0 0 6-6l-3 3-3-3 3-3Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\ntype Props = React.SVGProps<SVGSVGElement>;\n\nexport const XBadgeSvg = ({\n width = 16,\n height = 16,\n ...rest\n}: Props): JSX.Element => {\n return (\n <svg\n width={width}\n height={height}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...rest}\n >\n <path\n d=\"M22 11.08V12C21.9988 14.1564 21.3005 16.2547 20.0093 17.9818C18.7182 19.709 16.9033 20.9725 14.8354 21.5839C12.7674 22.1953 10.5573 22.1219 8.53447 21.3746C6.51168 20.6273 4.78465 19.2461 3.61096 17.4371C2.43727 15.628 1.87979 13.4881 2.02168 11.3363C2.16356 9.18457 2.99721 7.13633 4.39828 5.49707C5.79935 3.85782 7.69279 2.71538 9.79619 2.24015C11.8996 1.76491 14.1003 1.98234 16.07 2.86\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"m15 9 5 5m0-5-5 5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n","import { type JSX } from 'react';\n\nimport { ChevronDownSvg } from '../icons/ChevronDownSvg.js';\n\ntype Props = {\n size?: number;\n className?: string;\n};\n\nexport const ChevronDownIcon = ({\n size = 24,\n className,\n}: Props): JSX.Element => {\n return <ChevronDownSvg width={size} height={size} className={className} />;\n};\n\nexport default ChevronDownIcon;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IETY,IAAU;CACrB,MAAM;CACN,MAAM;CACN,IAAI;CACJ,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,SAAS;CACT,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,GAAG;CACH,IAAK;CACL,GAAG;CACH,KAAK;CACL,GAAG;CACH,KAAK;CACL,GAAG;CACH,KAAK;CACL,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,MAAM;CACN,IAAI;CACJ,MAAM;CACN,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACN,EAEY,IAAU;CACrB,GAAG;CACH,GAAG;CACH,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,KAAK;CACN,EAEY,IAAU;CACrB,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,KAAK;CACN;;;;;;;;;;;;;;;;;;;;;IErGY,KAAS,EACpB,aACA,SACA,cACA,aAAU,SACc;CACxB,IAAI,IAA+B;AAKnC,QAJI,MACF,IAAiB,OAIjB,kBAAC,QAAD;EAAM,WAAW,EAAG,EAAM;GAAE;GAAM,SAAS;GAAgB,CAAC,EAAE,EAAU;EACrE;EACI,CAAA;GC9BE,KAA2B,EACtC,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,OAAM;CACN,MAAK;CACL,SAAQ;CACR,GAAI;WANN,CAQE,kBAAC,UAAD;EACE,IAAG;EACH,IAAG;EACH,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAe;EACP,CAAA,EACV,kBAAC,QAAD;EACE,MAAK;EACL,GAAE;EACF,aAAa;EACP,CAAA,CACJ;;;;AC5BV,SAAgB,IAAsD;AACpE,QAAO,EAAe,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0OEkChB,KAAU,MAA8B;CACnD,IAAM,EAAE,SAAM,GAAkB,EAC1B,EACJ,aACA,cACA,aACA,eAAY,IACZ,iBACA,YACA,aACA,cACA,SACA,YACA,UACA,QACA,GAAG,MACD,GAEE,IAAoB,EAAG,GAAO;EAAE;EAAS;EAAM;EAAO,CAAC,EAAE,EAAU,EACnE,IAAa,EAAQ,KAAc,EAAQ,GAE7C;AAEJ,KAAI,GAAW;EACb,IAAM,IAAuB,KAAgB,EAAE,iBAAiB;AAChE,MACE,kBAAC,QAAD;GAAM,WAAW,EAAG,IAAkB,GAAS,iBAAiB;aAAhE,CACE,kBAAC,GAAD;IACE,WAAW,EAAG,IAAa,GAAS,YAAY;IAChD,OAAO;IACP,QAAQ;IACR,CAAA,EACD,EACI;;QAEJ;EACL,IAAM,IAA8B,EAAE;AAwBtC,EAtBI,KAAY,QACd,EAAa,KACX,kBAAC,QAAD;GAAM,WAAW,EAAG,IAAU,GAAS,SAAS;aAC7C;GACI,EAF+C,YAE/C,CACR,EAGH,EAAa,KACX,kBAAC,QAAD;GAAM,WAAW,EAAG,IAAc,GAAS,QAAQ;GAChD;GACI,EAFkD,UAElD,CACR,EAEG,KAAa,QACf,EAAa,KACX,kBAAC,QAAD;GAAM,WAAW,EAAG,IAAW,GAAS,UAAU;aAC/C;GACI,EAFiD,aAEjD,CACR,EAGH,IAAkB,kBAAA,GAAA,EAAA,UAAG,GAAgB,CAAA;;AAGvC,QACE,kBAAC,UAAD;EACO;EACL,WAAW;EACX,UAAU;EACV,GAAI;YAEH;EACM,CAAA;GCzEA,MAAc,MAA8B;CACvD,IAAM,EACJ,aACA,cACA,eACA,eAAY,IACZ,aACA,iBACA,QACA,cACA,SACA,YACA,UACA,GAAG,MACD,GAEE,IAAoB,EAAG,GAAO;EAAE;EAAS;EAAM;EAAO,CAAC,EAAE,EAAU,EACnE,IAAW,EAAQ,KAAc,EAAQ,GACzC,IAAgB,MAAY,QAE9B;AAEJ,KAAI,EACF,KACE,kBAAC,QAAD;EAAM,WAAW;YAAjB,CACE,kBAAC,GAAD;GACE,WAAW;GACX,OAAO;GACP,QAAQ;GACR,CAAA,EACD,EACI;;UAEA,EAGT,KAAkB,kBAAC,QAAD,EAAA,UAFE,KAAY,KAAa,KAAY,MAEb,CAAA;MACvC;EACL,IAAM,IAA8B,EAAE;AAwBtC,EAtBI,KAAY,QACd,EAAa,KACX,kBAAC,QAAD;GAAM,WAAW;aACd;GACI,EAFwB,YAExB,CACR,EAGH,EAAa,KACX,kBAAC,QAAD;GAAM,WAAW;GACd;GACI,EAF4B,UAE5B,CACR,EAEG,KAAa,QACf,EAAa,KACX,kBAAC,QAAD;GAAM,WAAW;aACd;GACI,EAFyB,aAEzB,CACR,EAGH,IAAkB,kBAAA,GAAA,EAAA,UAAG,GAAgB,CAAA;;CAGvC,IAAI;AAKJ,QAJI,MACF,IAAe,KAIf,kBAAC,GAAD;EACE,GAAI;EACC;EACL,WAAW;EACX,iBAAiB,GAAa,EAAE,YAAS,CAAC;EAC1C,YAAY;EACZ,iBAAe;YAEd;EACI,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IGvFE,KAAS,MAA8B;CAClD,IAAM,EACJ,YACA,SACA,cACA,UAAA,GACA,WAAA,GACA,KAAK,GACL,GAAG,MACD,GACE,EAAE,cAAW,UAAO,GAAG,MAAe,GACtC,IAAY,EAAW;AAE7B,KAAI,MAAc,cAAc,MAAc,QAC5C,QACE,kBAAC,SAAD;EACE,KAAK;EACM;EACJ;EACP,GAAI;EACJ,CAAA;CAIN,IAAI,IAAsC;AAC1C,CAAI,KAAY,SACd,IAAkB,kBAAC,OAAD;EAAK,WAAW;YAAgB;EAAe,CAAA;CAGnE,IAAI,IAAuC;AAC3C,CAAI,KAAa,SACf,IAAmB,kBAAC,OAAD;EAAK,WAAW;YAAiB;EAAgB,CAAA;CAKtE,IAAM,IADuB,CADH,GAAY;EAAE;EAAS;EAAM;EAAW,CAAC,EAClB,EAAU,CAExD,QAAQ,MACA,OAAO,KAAU,YAAY,EAAM,SAAS,EACnD,CACD,KAAK,IAAI,EAEN,IAA4B,EAAE;AAOpC,CANI,MAAoB,MACtB,EAAgB,KAAK,EAAgB,EAEnC,KAAY,QACd,EAAgB,KAAK,GAAkB,EAErC,KAAa,QACf,EAAgB,KAAK,GAAmB;CAG1C,IAAI;AACJ,CAAI,EAAgB,SAAS,MAC3B,IAAoB,EAAgB,KAAK,IAAI;CAG/C,IAAI,IAAqB;AAKzB,QAJI,MAAc,OAChB,IAAqB,GAAG,GAAU,GAAG,OAIrC,kBAAC,OAAD;EAAK,WAAW;YAAhB;GACG;GACD,kBAAC,SAAD;IAAO,KAAK;IAAU,WAAW;IAAmB,GAAI;IAAc,CAAA;GACrE;GACG;;;;;;;;;;;;;;;;;;;;yCEpFG,MAAS,MAA8B;CAClD,IAAM,EAAE,aAAU,YAAS,SAAM,aAAU,GAAG,MAAS,GACjD,EAAE,cAAW,GAAG,MAAe,GACjC,IAAmC;AAEvC,CAAI,MAAa,OACf,IAAe,kBAAC,QAAD;EAAM,WAAW;YAAmB;EAAQ,CAAA;CAI7D,IAAM,IAAkB,CADE,GAAM;EAAE;EAAS;EAAM,CAAC,EACN,EAAU,CACnD,QAAQ,MACA,KAAS,QAAQ,MAAU,GAClC,CACD,KAAK,IAAI,EAER;AAKJ,QAJI,MAAoB,OACtB,IAAoB,IAIpB,kBAAC,SAAD;EAAO,WAAW;EAAmB,GAAI;YAAzC,CACG,GACA,EACK;;GCfC,MAAY,MAAsC;CAC7D,IAAM,EACJ,UACA,aAAU,IACV,cAAW,IACX,aACA,KAAK,GACL,GAAG,MACD,GAEA,IAAmC;AAIvC,QAHI,KAAS,QAAQ,MAAU,OAC7B,IAAe,kBAAC,QAAD;EAAM,WAAW;YAAgB;EAAa,CAAA,GAG7D,kBAAC,IAAD;EAAO,WAAW;YAAlB;GACE,kBAAC,GAAD;IACE,KAAK;IACL,MAAK;IACL,WAAW;IACF;IACC;IACA;IACV,GAAI;IACJ,CAAA;GACF,kBAAC,QAAD;IACE,WAAW,GAAe;KAAE;KAAS;KAAU,CAAC;IAChD,eAAY;IACZ,CAAA;GACD;GACK;;kDE5CC,MAAgB,EAC3B,aACA,OACA,GAAG,QAEC,KAAY,OACP,OAIP,kBAAC,OAAD;CAAS;CAAI,WAAW;CAAc,GAAI;CACvC;CACG,CAAA,ECRJ,KAA8C;CAClD,MAAM;CACN,OAAO;CACP,KAAK;CACN,EAEY,MAAiB,EAC5B,UACA,aACA,aAAU,IACV,WACA,mBACwB;CACxB,IAAM,EAAE,SAAM,GAAkB,EAC1B,IAAmB,KAAY,EAAE,sBAAsB;AAkB7D,QAAO,kBAAC,QAAD;EAAiB;YAjBH,QAAc;AACjC,OAAI,KAAS,KACX,QAAO;GAGT,IAAM,IAAO,IAAI,KAAK,OAAO,EAAM,CAAC;AACpC,OAAI,OAAO,MAAM,EAAK,SAAS,CAAC,CAC9B,QAAO;AAGT,OAAI;AACF,WAAO,IAAI,KAAK,eAAe,GAAQ,EAAQ,CAAC,OAAO,EAAK;WACtD;AACN,WAAO;;KAER;GAAC;GAAO;GAAkB;GAAQ;GAAQ,CAAC;EAEU,CAAA;GC7BpD,KAAe,KACf,KAAe,KAAK,IACpB,KAAa,KAAK,IAClB,KAAY,KAAK,IACjB,KAAc,KAAK,IACnB,KAAa,MAAM,IAEnB,KAAoD;CACxD,MAAM;CACN,OAAO;CACP,KAAK;CACL,MAAM;CACN,QAAQ;CACT,EAEK,MACJ,MAC0C;CAC1C,IAAM,IAAe,KAAK,IAAI,EAAS;AAqCvC,QAnCI,IAAe,KACV;EACL,OAAO,KAAK,MAAM,IAAW,GAAa;EAC1C,MAAM;EACP,GAGC,IAAe,KACV;EACL,OAAO,KAAK,MAAM,IAAW,GAAa;EAC1C,MAAM;EACP,GAGC,IAAe,KACV;EACL,OAAO,KAAK,MAAM,IAAW,GAAW;EACxC,MAAM;EACP,GAGC,IAAe,KACV;EACL,OAAO,KAAK,MAAM,IAAW,GAAU;EACvC,MAAM;EACP,GAGC,IAAe,KACV;EACL,OAAO,KAAK,MAAM,IAAW,GAAY;EACzC,MAAM;EACP,GAGI;EACL,OAAO,KAAK,MAAM,IAAW,GAAW;EACxC,MAAM;EACP;GAGG,MACJ,GACA,MACuB;AACvB,KAAI;AACF,SAAO,IAAI,KAAK,eAAe,GAAQ,GAAsB,CAAC,OAAO,EAAK;SACpE;AACN;;GAIS,MAAoB,EAC/B,cACA,aACA,WACA,eAAY,YACZ,eACwC;CACxC,IAAM,EAAE,SAAM,SAAM,GAAkB,EAChC,IAAmB,KAAY,EAAE,sBAAsB,EACvD,IAAiB,KAAU,EAAK,UAEhC,IAAe,QAAc;AACjC,MAAI,KAAS,KACX,QAAO;EAGT,IAAM,IAAO,IAAI,KAAK,OAAO,EAAM,CAAC;AAKpC,SAJI,OAAO,MAAM,EAAK,SAAS,CAAC,GACvB,OAGF;IACN,CAAC,EAAM,CAAC,EAEL,IAAe,QAAc;AACjC,MAAI,KAAgB,KAClB,QAAO;EAIT,IAAM,EAAE,SAAM,OAAO,MAAkB,GADtB,EAAa,SAAS,GAAG,KAAK,KAAK,CACiB;AAErE,MAAI;AACF,UAAO,IAAI,KAAK,mBAAmB,GAAgB,EACjD,SAAS,QACV,CAAC,CAAC,OAAO,GAAe,EAAK;UACxB;AACN,UAAO;;IAER;EAAC;EAAc;EAAkB;EAAe,CAAC,EAEhD;AAKJ,QAJI,MAAc,cAAc,KAAgB,SAC9C,IAAQ,GAAoB,GAAc,EAAe,GAIzD,kBAAC,QAAD;EAAiB;EAAkB;YAChC;EACI,CAAA;GCpIL,KAAe,KAUR,MAAkB,EAC7B,UACA,UAAO,IACP,UAAO,UACP,GAAG,QACmC;CACtC,IAAM,EAAE,SAAM,GAAkB,EAC1B,IAAgB,KAAS,EAAE,mBAAmB;AACpD,QACE,kBAAC,GAAD;EACE,cAAY;EACZ,SAAQ;EACR,MAAK;EACC;EACN,GAAI;YAEH;EACM,CAAA;GC5BA,MAAiB,EAC5B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN,CAQE,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,EACF,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,CACE;2KExBG,MAAW,EAAE,cAAW,iBAAkC;CACrE,IAAM,IAAa,CAAC,GAAe;AAMnC,QAJI,KACF,EAAW,KAAK,GAAsB,EAItC,kBAAC,OAAD;EACE,WAAW,EAAW,KAAK,IAAI;EACtB;EACT,eAAY;EACZ,CAAA;spBELO,MAAS,MAAqC;CACzD,IAAM,EAAE,WAAQ,YAAS,UAAO,aAAU,cAAW,GAC/C,IAAW,EAAuB,KAAK;AAG7C,SAAgB;EACd,IAAM,KAAiB,MAAqB;AAC1C,GAAI,EAAE,QAAQ,YAAY,KACxB,GAAS;;AAMb,SAFA,OAAO,iBAAiB,WAAW,EAAc,QAEpC;AACX,UAAO,oBAAoB,WAAW,EAAc;;IAErD,CAAC,GAAQ,EAAQ,CAAC;CAGrB,IAAM,KAAoB,MAAwB;AAChD,IAAE,iBAAiB;;AAGrB,KAAI,CAAC,EACH,QAAO;CAGT,IAAM,IACJ,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,IAAD;EAAS,WAAW;EAAQ,SAAS;EAAW,CAAA,EAChD,kBAAC,OAAD;EAAK,WAAW;YACd,kBAAC,OAAD;GAAK,WAAW;GAAc,KAAK;GAAU,SAAS;aAAtD;IACE,kBAAC,OAAD;KAAK,WAAW;eAAhB,CACE,kBAAC,MAAD;MAAI,WAAW;gBAAoB;MAAW,CAAA,EAC9C,kBAAC,UAAD;MACE,WAAW;MACX,SAAS;MACT,cAAW;MACX,MAAK;gBAEL,kBAAC,IAAD;OAAe,OAAO;OAAI,QAAQ;OAAM,CAAA;MACjC,CAAA,CACL;;IACN,kBAAC,OAAD;KAAK,WAAW;KAAsB;KAAe,CAAA;IACpD,KAAU,QAAQ,kBAAC,OAAD;KAAK,WAAW;eAAqB;KAAa,CAAA;IACjE;;EACF,CAAA,CACL,EAAA,CAAA;AAOL,QAJI,OAAO,WAAa,MACf,IAGF,EAAa,GAAc,SAAS,KAAK;;;;;;;;;;;;;;;;;;;;;;;;IEvDrC,MAAY,MAA8B;CACrD,IAAM,EAAE,YAAS,SAAM,cAAW,KAAK,GAAa,GAAG,MAAS,GAC1D,EAAE,cAAW,SAAM,GAAG,MAAkB,GAGxC,IAAkB,CADE,GAAS;EAAE;EAAS;EAAM;EAAW,CAAC,EACpB,EAAU,CACnD,QAAQ,MACA,KAAS,QAAQ,MAAU,GAClC,CACD,KAAK,IAAI,EAER;AAOJ,QANI,MAAoB,OACtB,IAAoB,IAMpB,kBAAC,YAAD;EACE,KAAK;EACL,WAAW;EACX,MANiB,KAAQ;EAOzB,GAAI;EACJ,CAAA;uLE1BO,MAAQ,MAA8B;CACjD,IAAM,EAAE,UAAO,aAAU,kBAAe,cAAW,wBAAqB,GAElE,IAAS,QACT,KAAS,OACJ,OAIP,kBAAC,OAAD;EAAK,WAAW;YAAhB,CACE,kBAAC,QAAD;GAAM,WAAW;aAAe;GAAa,CAAA,EAC5C,EACG;KAEP,CAAC,GAAe,EAAM,CAAC;AAK1B,QACE,kBAAC,OAAD;EAAK,WAJW,EAAG,IAAa,EAAU;YAI1C,CACG,GACD,kBAAC,OAAD;GAAK,WALY,EAAG,IAAgB,EAAiB;GAKtB;GAAe,CAAA,CAC1C;;GChCG,MAAkB,EAC7B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN,CAQE,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,EACF,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,CACE;82CE5BG,MAAkB,EAC7B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WAEJ,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA;CACE,CAAA,kIEYJ,KAAkB,EAA2C,KAAK,EAI3D,WAA0C;CACrD,IAAM,IAAM,EAAW,GAAgB;AACvC,KAAI,KAAO,KACT,OAAU,MAAM,iDAAiD;AAEnE,QAAO;GA0BH,MAAyB,MACT,OAAO,KAAS,aAAhC,IACK,KAGN,EAA+B,aAAa,OAAO,IAAI,oBAAoB,EASnE,MAAY,EACvB,YACA,aACA,cACA,qBACA,eAAY,gBACZ,YAAS,GACT,uBAAoB,IACpB,SACA,iBAAc,IACd,iBACA,sBAAmB,IACnB,oBACA,mBACgC;CAChC,IAAM,IAAe,KAAQ,MACvB,CAAC,GAAkB,KAAuB,EAAS,EAAY,EACjE,IAAS;AACb,CAAI,MACF,IAAS,EAAQ;CAGnB,IAAM,IAAe,EAAuB,KAAK,EAC3C,IAAa,EAAoB,KAAK,EACtC,IAAa,EAAuB,KAAK,EACzC,CAAC,GAAU,KAAe,EAA+B,KAAK,EAE9D,IAAa,EAAuB,EAAE,CAAC,EAEvC,IAAU,GACb,MAAkB;AAIjB,EAHK,KACH,EAAoB,EAAK,EAE3B,IAAe,EAAK;IAEtB,CAAC,GAAc,EAAa,CAC7B,EAEK,IAAS,QAAkB;AAC/B,IAAQ,CAAC,EAAO;IACf,CAAC,GAAQ,EAAQ,CAAC,EACf,IAAQ,QAAkB;AAC9B,IAAQ,GAAM;IACb,CAAC,EAAQ,CAAC,EACP,IAAS,QAAkB;AAC/B,IAAQ,GAAK;IACZ,CAAC,EAAQ,CAAC,EAGP,IAAkB,QAAkB;EACxC,IAAM,IAAY,EAAW,SACvB,IAAY,EAAW;AAI7B,MAHI,KAAa,QAGb,KAAa,KACf;EAGF,IAAM,IAAO,EAAU,uBAAuB,EAC1C,IAAM,GACN,IAAO;AAEX,UAAQ,GAAR;GACE,KAAK;AAEH,IADA,IAAM,EAAK,SAAS,GACpB,IAAO,EAAK;AACZ;GACF,KAAK;AAEH,IADA,IAAM,EAAK,SAAS,GACpB,IAAO,EAAK,QAAQ,EAAU;AAC9B;GACF,KAAK;AAEH,IADA,IAAM,EAAK,MAAM,EAAU,eAAe,GAC1C,IAAO,EAAK;AACZ;GACF,KAAK;AAEH,IADA,IAAM,EAAK,MAAM,EAAU,eAAe,GAC1C,IAAO,EAAK,QAAQ,EAAU;AAC9B;GACF,QAEE,CADA,IAAM,EAAK,SAAS,GACpB,IAAO,EAAK;;EAIhB,IAAM,IAAK,OAAO,YACZ,IAAK,OAAO,aACd;AACJ,EAAI,MACF,IAAQ,EAAK;EAEf,IAAM,IAAe,KAAS,EAAU;AAKxC,EAHI,IAAO,IAAe,IAAK,MAC7B,IAAO,KAAK,IAAI,GAAG,IAAK,IAAe,EAAE,GAEvC,IAAO,MAAG,IAAO;EACrB,IAAM,IAAgB,EAAU;AAChC,MAAI,IAAM,IAAgB,IAAK,EAE7B,KAAI,EAAU,WAAW,SAAS,EAAE;GAClC,IAAM,IAAa,EAAK,MAAM,IAAgB;AAC9C,GAGE,IAHE,KAAc,IACV,IAEA,KAAK,IAAI,GAAG,IAAK,IAAgB,EAAE;QAG3C,KAAM,KAAK,IAAI,GAAG,IAAK,IAAgB,EAAE;AAK7C,EAFI,IAAM,MAAG,IAAM,IAEnB,EAAY;GAAE;GAAK;GAAM;GAAO,CAAC;IAChC;EAAC;EAAW;EAAQ;EAAkB,CAAC;AA2E1C,CAzEA,QAAsB;AACpB,EAAI,KAAQ,GAAiB;IAC5B;EAAC;EAAQ;EAAiB;EAAS,CAAC,EAEvC,QAAgB;AACd,MAAI,CAAC,EAAQ;EACb,IAAM,UAAe;AACnB,MAAiB;;AAQnB,EANA,OAAO,iBAAiB,UAAU,EAAO,EACzC,OAAO,iBAAiB,UAAU,GAAQ,GAAK,EAK/C,EAAW,QAAQ,WAJG;AAEpB,GADA,OAAO,oBAAoB,UAAU,EAAO,EAC5C,OAAO,oBAAoB,UAAU,GAAQ,GAAK;IAEpB;IAC/B,CAAC,GAAQ,EAAgB,CAAC,EAG7B,QAAgB;AACd,MAAI,CAAC,EAAQ;EACb,IAAM,KAAkB,MAA6B;GACnD,IAAM,IAAS,EAAE;AACjB,GACE,EAAa,WAAW,QACxB,EAAW,WAAW,QACtB,CAAC,EAAa,QAAQ,SAAS,EAAO,IACtC,CAAC,EAAW,QAAQ,SAAS,EAAO,IAEpC,GAAO;KAGL,KAAS,MAAgC;AAC7C,GAAI,EAAE,QAAQ,aACZ,GAAO,EACP,EAAW,SAAS,OAAO;;AAS/B,EANA,SAAS,iBAAiB,aAAa,EAAe,EACtD,SAAS,iBAAiB,WAAW,EAAM,EAK3C,EAAW,QAAQ,WAJG;AAEpB,GADA,SAAS,oBAAoB,aAAa,EAAe,EACzD,SAAS,oBAAoB,WAAW,EAAM;IAEhB;IAC/B,CAAC,GAAQ,EAAM,CAAC,EAGnB,QAAgB;AACT,QACkB,EAAW,SAAS,cACzC,6EACD,GACe,OAAO;IACtB,CAAC,EAAO,CAAC,EAGZ,QAAgB;AACd,MAAI,CAAC,KAAU,CAAC,EAAkB;EAClC,IAAM,KAAW,MAA6B;AAC5C,GAAI,EAAW,SAAS,SAAS,EAAE,OAAe,IAChD,GAAO;;AASX,EANA,SAAS,iBAAiB,SAAS,GAAS,EAAE,SAAS,IAAM,CAAC,EAM9D,EAAW,QAAQ,WAJG;AACpB,YAAS,oBAAoB,SAAS,GAAS,EAAE,SAAS,IAAM,CAAC;IAGnC;IAC/B;EAAC;EAAQ;EAAkB;EAAM,CAAC,EAErC,cACe;AAIX,EAHA,EAAW,QAAQ,SAAS,MAAO;AACjC,MAAI;IACJ,EACF,EAAW,UAAU,EAAE;IAExB,EAAE,CAAC;CAEN,IAAI,IAAiB;AAKrB,KAJI,OAAO,KAAY,eACrB,IAAiB,EAAQ,EAAO,GAG9B,CAAC,EAAe,EAAe,CACjC,OAAU,MAAM,4CAA4C;CAG9D,IAAM,IAAgB,OAAO,EAAe,QAAS,UAC/C,IAAkB,KAAiB,EAAe,SAAS;AAMjE,KAAI,EAJF,KACA,OAAO,EAAe,QAAS,cAC/B,GAAsB,EAAe,KAAK,EAG1C,OAAU,MACR,0EACD;CAGH,IAAM,IACH,EAAe,MAAqC,OACpD,EAA6D,KAC1D,KAAiB,MAA6B;AAElD,EADA,EAAW,UAAU,GACjB,OAAO,KAAsB,aAC/B,EAAkB,EAAK,GACd,KAAqB,SAC7B,EAA2D,UAC1D;IAIA,IAAe,EAAe,OAI9B,KAAsB,MAAwC;AAClE,IAAa,UAAU,EAAM,EACzB,GAAM,oBAGV,GAAQ;IAGJ,KAAwB,MAA2C;AACvE,IAAa,YAAY,EAAM,EAC3B,GAAM,qBAGN,EAAM,QAAQ,WAAW,EAAM,QAAQ,SACzC,EAAM,gBAAgB,EACtB,GAAQ;IAIN,IAA8C;EAClD,SAAS;EACT,iBAAiB;EACjB,iBAAiB;EAClB;AAoBD,CAlBI,KAAa,QAAQ,MAAc,OACrC,EAAmB,gBAAgB,IAGjC,IACE,EAAa,SACf,EAAmB,OAAO,aAG5B,EAAmB,YAAY,GAC3B,EAAa,SACf,EAAmB,OAAO,WAExB,EAAa,aACf,EAAmB,WAAW,KAIlC,EAAmB,MAAM;CAEzB,IAAI,IAAqC,EAAE;AAC3C,CAAI,KAAY,SACd,IAAgB;EACd,KAAK,EAAS;EACd,MAAM,EAAS;EACf,OAAO,EAAS;EACjB;CAGH,IAAM,IAAe,KAAmB,SAAS,MAE3C,IAAqC;EACzC;EACA,MAAM;EACN;EACD,EAEG,KAAsC;AAmB1C,QAlBI,MACF,KAAkB,EAChB,kBAAC,OAAD;EACE,KAAK;EACL,MAAK;EACL,WAAW,EACT,IACA,IACA,EACD;EACD,OAAO;EAEN;EACG,CAAA,EACN,EACD,GAID,kBAAC,GAAgB,UAAjB;EAA0B,OAAO;YAAjC,CACE,kBAAC,OAAD;GAAK,WAAW,EAAG,IAAmB,EAAU;GAAE,KAAK;aACpD,EAAa,GAAgB,EAAmB;GAC7C,CAAA,EACL,GACwB;;GC1YlB,MAAyB,EACpC,UACA,eACA,sBACA,oBACA,eACA,2BACwB;CACxB,IAAM,EAAE,aAAU,IAAa,EACzB,CAAC,GAAO,KAAY,EAAS,GAAG,EAChC,IAAkB,EAAM,MAAM,CAAC,aAAa,EAE5C,IAAgB,QAChB,MAAoB,KACf,IAGF,EAAM,QAAQ,MACZ,EAAK,KAAK,aAAa,CAAC,SAAS,EAAgB,CACxD,EACD,CAAC,GAAO,EAAgB,CAAC,EAExB;AAOJ,QANA,AAGE,IAHE,MAAoB,KACJ,IAEA,GAIlB,kBAAC,OAAD;EAAK,WAAW;YAAhB,CACE,kBAAC,OAAD;GAAK,WAAW;aACd,kBAAC,GAAD;IACE,MAAK;IACL,MAAK;IACL,WAAA;IACA,aAAa;IACb,OAAO;IACP,WAAW,MAAU;AACnB,OAAS,EAAM,OAAO,MAAM;;IAE9B,cAAY;IACZ,CAAA;GACE,CAAA,EACN,kBAAC,MAAD;GAAI,WAAW;aAAf,CACG,EAAc,WAAW,KACxB,kBAAC,MAAD;IAAI,WAAW;cAAsB;IAAqB,CAAA,EAE3D,EAAc,KAAK,MAAS;IAC3B,IAAM,IAAgB,EAAG,IAAoB,GAC1C,KAA2B,EAAK,OAAO,GACzC,CAAC,EAEE,IAAsC;AAS1C,WARI,EAAK,eAAe,QAAQ,EAAK,gBAAgB,OACnD,IACE,kBAAC,QAAD;KAAM,WAAW;eACd,EAAK;KACD,CAAA,GAKT,kBAAC,MAAD,EAAA,UACE,kBAAC,GAAD;KACE,IAAI,EAAK;KACT,WAAW;KACX,eAAe;AACb,SAAO;;eAJX,CAOE,kBAAC,QAAD;MAAM,WAAW;gBAAyB,EAAK;MAAY,CAAA,EAC1D,EACI;QACJ,EAXI,EAAK,GAWT;KAEP,CACC;KACD;;GC5EG,MAA0B,EACrC,SACA,SACA,cACA,sBACA,oBACA,eACA,2BACwB;CACxB,IAAM,IAAY,GAAM,SAAS,EAAE;AAcnC,QAZI,KAAQ,OAER,kBAAC,OAAD;EAAK,WAAW;YACd,kBAAC,OAAD;GAAK,WAAW;aACd,kBAAC,GAAD;IAAM,IAAI,EAAK;IAAI,WAAW;cAC3B,EAAK;IACD,CAAA;GACH,CAAA;EACF,CAAA,GAKR,kBAAC,OAAD;EAAK,WAAW;YAEd,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACE,kBAAC,GAAD;IAAM,IAAI,EAAK;IAAI,WAAW;cAC3B,EAAK;IACD,CAAA,EACP,kBAAC,IAAD;IACE,UAAU,MAEN,kBAAC,UAAD;KAAQ,MAAK;KAAS,WAAW;eAC/B,kBAAC,IAAD;MACE,OAAO;MACP,QAAQ;MACR,WAAW,EAAG,IAA0B,GACrC,KAA+B,GACjC,CAAC;MACF,CAAA;KACK,CAAA;IAGF;IACX,WAAU;IACV,mBAAmB;IACnB,kBAAkB;cAElB,kBAAC,IAAD;KACE,OAAO;KACP,YAAY,EAAK;KACE;KACF;KACL;KACO;KACnB,CAAA;IACO,CAAA,CACP;;EACF,CAAA;GC/DG,MAAwB,MAA8B;CACjE,IAAM,EAAE,SAAM,kBAAe,WAAQ,EAAE,EAAE,iBAAc,GACjD,IAAiC,EAAE;AAEzC,GAAgB,KACd,kBAAC,MAAD;EAAe,WAAW;YACxB,kBAAC,GAAD;GAAM,IAAI,EAAK;GAAI,WAAW;GAAiB,cAAY;aACzD,kBAAC,IAAD;IAAgB,OAAO;IAAI,QAAQ;IAAI,WAAW;IAAmB,CAAA;GAChE,CAAA;EACJ,EAJG,OAIH,CACN;AAED,MAAK,IAAM,KAAQ,EACjB,GAAgB,KACd,kBAAC,MAAD;EAAkB,WAAW;YAC3B,kBAAC,IAAD;GACE,MAAM,EAAK;GACX,MAAM,EAAK;GACX,WAAW,EAAK,QAAQ,aAAa,EAAK,KAAK;GAC/C,mBAAmB,EAAK,QAAQ,qBAAqB;GACrD,iBAAiB,EAAK,QAAQ,mBAAmB;GACjD,YAAY,EAAK,QAAQ,cAAc;GACvC,mBAAmB,EAAK,QAAQ,qBAAqB;GACrD,CAAA;EACC,EAVI,EAAK,GAUT,CACN;CAGH,IAAM,IAA4B,EAAgB,SAAS,GAAM,MAC3D,MAAU,IACL,CAAC,EAAK,GAER,CACL,kBAAC,MAAD;EAEE,WAAW;EACX,eAAY;YACb;EAEI,EALE,aAAa,IAKf,EACL,EACD,CACD;AAEF,QACE,kBAAC,OAAD;EAAK,WAAW,EAAG,IAAmB,EAAU;EAAE,cAAW;YAC3D,kBAAC,MAAD;GAAI,WAAW;aAAwB;GAA+B,CAAA;EAClE,CAAA;GC1CG,MAAe,EAC1B,aACA,gBACA,gBACA,uBACA,kBAAe,IACf,oBAAiB,IACjB,cACA,wBACA,sBACA,2BACmC;CACnC,IAAM,EAAE,SAAM,GAAkB,EAC1B,IAAsB,KAAe,EAAE,wBAAwB,EAC/D,IAAsB,KAAe,EAAE,sBAAsB,EAC7D,IACJ,KAAsB,EAAE,wBAAwB,EAE5C,EACJ,WAAW,GACX,UAAU,GACV,GAAG,MAJe,KAAqB,EAAE,EAQrC,EACJ,WAAW,GACX,UAAU,GACV,GAAG,MAJe,KAAqB,EAAE,EAOvC;AAEJ,CACE,IADE,KAAuB,OAEhB,IACO,IAEA,IAJA,EAAoB,EAAa;CAOnD,IAAM,IAAmB,EAAQ,GAC3B,IACJ,EAAQ,KAAmB,KAAgB,MAA2B;AAExE,QACE,kBAAC,OAAD;EAAgB;YAAhB,CACE,kBAAC,GAAD;GACE,MAAK;GACL,SAAQ;GACR,SAAS;GACT,UAAU;GACV,WAAW;GACX,GAAI;aAEH;GACM,CAAA,EACT,kBAAC,GAAD;GACE,MAAK;GACL,SAAQ;GACR,UAAU;GACV,WAAW;GACX,GAAI;aAEH;GACM,CAAA,CACL;;kKEpEG,MAAiB,MAA8B;CAC1D,IAAM,EAAE,OAAI,UAAO,UAAO,YAAA,GAAY,GAAG,MAAS,GAC9C,IAAa,YAAY,KAAK,QAAQ,CAAC,SAAS,GAAG,CAAC,UAAU,GAAG,EAAE;AAEvE,CAAI,KAAM,QAAQ,MAAO,OACvB,IAAa;CAGf,IAAI,IAAwC;AAE5C,CAAI,KAAc,QAAQ,MAAe,OACvC,IAAoB,kBAAC,OAAD;EAAK,WAAW;YAAsB;EAAiB,CAAA;CAG7E,IAAI,IAAmC;AAEvC,CAAI,KAAS,QAAQ,MAAU,OAC7B,IAAe,kBAAC,IAAD,EAAA,UAAe,GAAqB,CAAA;CAGrD,IAAI,IAAmC;AAYvC,QAVI,KAAS,SACX,IACE,kBAAC,OAAD;EAAK,WAAW;YAAhB;GACE,kBAAC,IAAD;IAAO,SAAS;cAAa;IAAc,CAAA;GAC1C;GACA;GACG;MAKR,kBAAC,OAAD;EAAK,WAAW;YACd,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACE,kBAAC,IAAD;IAAU,IAAI;IAAY,GAAI;IAAQ,CAAA,EACrC,EACG;;EACF,CAAA;GCrDG,MAAqB,EAChC,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,OAAM;CACN,SAAQ;CACR,MAAK;CACL,QAAO;CACP,aAAY;CACZ,eAAc;CACd,gBAAe;CACf,GAAI;WAVN;EAYE,kBAAC,UAAD;GAAQ,IAAG;GAAK,IAAG;GAAK,GAAE;GAAc,CAAA;EACxC,kBAAC,QAAD;GAAM,IAAG;GAAK,IAAG;GAAI,IAAG;GAAK,IAAG;GAAY,CAAA;EAC5C,kBAAC,QAAD;GAAM,IAAG;GAAK,IAAG;GAAK,IAAG;GAAQ,IAAG;GAAY,CAAA;EAC5C;uKEdG,MAAa,EAAE,aAAU,GAAG,QACnC,KAAY,OACP,OAIP,kBAAC,OAAD;CAAK,WAAW;CAAW,MAAK;CAAQ,GAAI;WAA5C,CACE,kBAAC,QAAD;EAAM,WAAW;YACf,kBAAC,IAAD;GAAmB,OAAO;GAAI,QAAQ;GAAM,CAAA;EACvC,CAAA,EACP,kBAAC,OAAD;EAAK,WAAW;EAAU;EAAe,CAAA,CACrC;0CERG,MAAa,MAA8B;CACtD,IAAM,EAAE,OAAI,UAAO,UAAO,cAAW,IAAO,YAAS,GAAG,MAAS,GAC7D,IAAa;AAEjB,KAAI,KAAc,QAAQ,MAAe,IAAI;EAC3C,IAAI,IAAO;AAMX,EAJI,KAAS,QAAQ,MAAU,OAC7B,IAAO,EAAM,aAAa,CAAC,QAAQ,QAAQ,IAAI,GAGjD,IAAa,SAAS;;CAGxB,IAAM,IAAW,KAAS,QAAQ,MAAU,IACtC,IAAc,GAChB;AAEJ,CAAI,MACF,IAAgB,GAAG,EAAW;CAGhC,IAAI,IAAoC;AAExC,CAAI,MACF,IAAe;CAGjB,IAAI,IAA0D;AAE9D,CAAI,IACF,IAAe,UACN,KAAW,SACpB,IAAe;CAGjB,IAAI,IAAmC;AAEvC,CAAI,KAAS,SACX,IACE,kBAAC,IAAD;EAAO,SAAS;EAAsB;EAAU,SAAS;YACtD;EACK,CAAA;CAIZ,IAAI,IAAmC;AAQvC,QANI,MACF,IACE,kBAAC,IAAD;EAAc,IAAI,GAAG,EAAW;YAAU;EAAqB,CAAA,GAKjE,kBAAC,OAAD;EAAK,WAAW;YAAhB;GACG;GACD,kBAAC,GAAD;IACE,IAAI;IACJ,SAAS;IACT,gBAAc;IACd,oBAAkB;IAClB,WAAA;IACA,GAAI;IACJ,CAAA;GACD;GACG;;mGE5DG,MAAQ,MAA8B;CACjD,IAAM,EAAE,aAAU,cAAW,aAAU,QAAK,GAAG,MAAS;AAExD,QACE,kBAAC,QAAD;EACE,GAAI;EACC;EACK;EACV,WAAW,EAAG,IAAa,EAAU;EAEpC;EACI,CAAA;qJEtBE,MAAmB,EAC9B,YACA,mBAC+B;CAC/B,IAAM,IAAU,GAAS,MAAM;AAY/B,QAVI,KAAW,QAAQ,MAAY,KAC1B,OASF,kBAAC,OAAD;EAAK,WANO,CAAC,IAAa,EAAU,CACxC,QAAQ,MACA,KAAS,QAAQ,MAAU,GAClC,CACD,KAAK,IAAI;YAEwB;EAAc,CAAA;GCTvC,MAAa,MAA8B;CACtD,IAAM,EAAE,cAAW,aAAU,QAAK,GAAG,MAAS;AAE9C,QACE,kBAAC,OAAD;EAAK,GAAI;EAAW;EAAK,WAAW,EAAG,IAAkB,EAAU;EAChE;EACG,CAAA;GCZJ,KAAoB,EAAK,aAEtB,EAAE,UADM,MAAM,OAAO,mCAAA,MAAA,MAAA,EAAA,EAAA,EACH,mBAAmB,EAC5C,EAEI,MACJ,GACA,MACW;CACX,IAAM,IAAoB,GAAY,MAAM;AAC5C,KAAI,KAAqB,QAAQ,MAAsB,GACrD,QAAO;CAET,IAAM,IAAkB,GAAU,MAAM;AAIxC,QAHI,KAAmB,QAAQ,MAAoB,KAC1C,EAAgB,aAAa,GAE/B;GAGI,MAAyB,EACpC,SACA,aACA,oBAKE,kBAAC,GAAD;CACE,UACE,kBAAC,GAAD;EACE,YANmB,GAAkB,GAAU,EAAW;EAO1D,UAAU;EACV,kBAAkB;EAClB,iBAAgB;EAChB,CAAA;WAGJ,kBAAC,IAAD;EACc;EACN;EACI;EACV,CAAA;CACO,CAAA,wCE7CT,KAAmB,EAAK,aAErB,EAAE,UADM,MAAM,OAAO,kCAAA,MAAA,MAAA,EAAA,EAAA,EACH,kBAAkB,EAC3C,EAEI,MAAoB,EAAE,iBACnB,kBAAC,OAAD;CAAK,WAAW;WAAkB;CAAc,CAAA,EAG5C,MAAwB,EAAE,iBAEnC,kBAAC,GAAD;CAAU,UAAU,kBAAC,IAAD,EAA2B,YAAW,CAAA;WACxD,kBAAC,IAAD,EAA2B,YAAW,CAAA;CAC7B,CAAA,sbGRF,MAAc,EACzB,UACA,gBACA,SACA,YACA,mBACwB;CACxB,IAAI,IAAkC;AACtC,CAAI,KAAQ,SACV,IAAc,kBAAC,OAAD;EAAK,WAAW;YAAc;EAAW,CAAA;CAGzD,IAAI,IAAqC;AAKzC,QAJI,KAAW,SACb,IAAiB,kBAAC,OAAD;EAAK,WAAW;YAAiB;EAAc,CAAA,GAIhE,kBAAC,IAAD;EAAiB;EAAW,kBAAkB;YAA9C;GACG;GACD,kBAAC,MAAD;IAAI,WAAW;cAAe;IAAW,CAAA;GACzC,kBAAC,KAAD;IAAG,WAAW;cAAqB;IAAgB,CAAA;GAClD;GACI;;;;;;;;;;;IEpBL,KAAa,GAmBN,MAAQ,MAAkC;CACrD,IAAM,EAAE,UAAO,iBAAc,GACvB,EAAE,gBAAa,GAAa;AAElC,QACE,kBAAC,OAAD;EAAK,MAAK;EAAU,cAAY;EAAW,WAAW;YACnD,EAAM,KAAK,MAAS;GACnB,IAAM,EAAE,aAAU,OAAI,UAAO,UAAO,GAC9B,IAAW,MAAa,GAE1B;AACJ,GAAI,MACF,IAAe;GAMjB,IAAI,IAAqB,WACrB;AACJ,GAAI,KACF,IAAW,YACX,IAAW,MACF,MACT,IAAW;GAGb,IAAM,KAAmB,MAAyC;AAChE,IAAI,KACF,EAAM,gBAAgB;;AAI1B,UACE,kBAAC,IAAD;IAEE,OAAA;IACA,iBAAe;IACf,WAAW,GAAiB,EAAE,OAAO,GAAU,CAAC;IAChD,MAAK;IACD;IACM;IACV,SAAS;cAER;IACU,EAVN,EAUM;IAEf;EACE,CAAA;;;;;;;;;;4WEnFG,KAAyB,MCoCzB,MAAiB,EAC5B,WACA,cACA,iBACA,mBAC4C;CAC5C,IAAM,EAAE,SAAM,GAAkB,EAC1B,IAAuB,KAAgB,EAAE,yBAAyB,EAElE,IAAQ,QACL,EAAO,KAAK,MAAU;EAC3B,IAAM,IAAO,EAAM,QAAQ,QACrB,IAAU,EAAM,WAAW,EAAE,EAE/B,IAAkC;AACtC,EAAI,EAAM,WAAW,SACnB,IAAc,kBAAC,OAAD;GAAK,WAAW;aAAiB,EAAM;GAAc,CAAA;EAGrE,IAAI,IAAkC;AACtC,EAAI,EAAQ,SAAS,MACnB,IACE,kBAAC,OAAD;GAAK,WAAW;aACb,EAAQ,KAAK,MAEV,kBAAC,GAAD;IAEE,MAAK;IACL,MAAK;IACL,SAAQ;IACR,SAAS,EAAO;cAEf,EAAO;IACD,EAPF,EAAO,GAOL,CAEX;GACE,CAAA;EAIV,IAAI,IAAmC;AAYvC,SAXI,MAAS,WACX,IACE,kBAAC,OAAD;GAAK,WAAW;GAAsB,eAAY;aAChD,kBAAC,OAAD;IACE,WAAW;IACX,OAAO,EAAE,mBAAmB,GAAG,GAAuB,KAAK;IAC3D,CAAA;GACE,CAAA,GAKR,kBAAC,OAAD;GAEE,WAAW,EAAG,IAAc,GAAkB,EAAE,SAAM,CAAC,CAAC;aAF1D;IAIE,kBAAC,OAAD;KAAK,WAAW;eAAhB,CACE,kBAAC,OAAD;MAAK,WAAW;gBAAe,EAAM;MAAY,CAAA,EACjD,kBAAC,UAAD;MACE,MAAK;MACL,WAAW;MACX,cAAY;MACZ,eAAe;AACb,SAAU,EAAM,GAAG;;gBAGrB,kBAAC,IAAD;OAAe,OAAO;OAAI,QAAQ;OAAI,eAAY;OAAS,CAAA;MACpD,CAAA,CACL;;IACL;IACA;IACA;IACG;KAnBC,EAAM,GAmBP;GAER,EACD;EAAC;EAAW;EAAsB;EAAO,CAAC;AAM7C,QAJI,EAAO,WAAW,IACb,OAGF,kBAAC,OAAD;EAAK,WAAW,EAAG,IAAiB,EAAU;YAAG;EAAY,CAAA;GCrFhE,KAAe,EAA+B,KAAK,EAEnD,MAAgB,GAAe,OAC3B,GAAkB,MACjB,EAAI,KAAK;CAAE;CAAM;CAAO;CAAS,CAAC,EAIhC,MAAiB,EAC5B,aACA,eAAY,QACyB;CACrC,IAAM,CAAC,GAAQ,KAAa,EAAsB,EAAE,CAAC,EAC/C,IAAU,EAAO,EAAE,EACnB,IAAkB,kBACtB,IAAI,KAAK,CACV,EAEK,IAAU,GAAa,MAAoB;EAC/C,IAAM,IAAQ,EAAgB,QAAQ,IAAI,EAAQ;AAKlD,EAJI,KAAS,SACX,aAAa,EAAM,EACnB,EAAgB,QAAQ,OAAO,EAAQ,GAEzC,GAAW,MACF,EAAK,QAAQ,MACX,EAAE,OAAO,EAChB,CACF;IACD,EAAE,CAAC,EAEA,IAAQ,QAAkB;AAK9B,EAJA,EAAgB,QAAQ,SAAS,MAAU;AACzC,gBAAa,EAAM;IACnB,EACF,EAAgB,QAAQ,OAAO,EAC/B,EAAU,EAAE,CAAC;IACZ,EAAE,CAAC,EAEA,IAAO,GACV,MAA2D;EAC1D,IAAM,IAAK,EAAM,MAAM,SAAS,EAAQ;AAQxC,SAPA,GAAW,MAAS;GAClB,IAAM,IAAO,CAAC,GAAG,GAAM;IAAE,GAAG;IAAO,MAAM,EAAM,QAAQ;IAAQ;IAAI,CAAC;AAIpE,UAHI,EAAK,SAAS,IACT,EAAK,MAAM,EAAK,SAAS,EAAU,GAErC;IACP,EACK;IAET,CAAC,EAAU,CACZ;AAgCD,CA9BA,QAAgB;EACd,IAAM,oBAAqB,IAAI,KAAa;AAoB5C,EAnBA,EAAO,SAAS,MAAU;AAKxB,OAJI,EAAM,SAAS,WAGnB,EAAmB,IAAI,EAAM,GAAG,EAC5B,EAAgB,QAAQ,IAAI,EAAM,GAAG,EACvC;GAEF,IAAM,IAAQ,iBAAiB;AAE7B,IADA,EAAgB,QAAQ,OAAO,EAAM,GAAG,EACxC,GAAW,MACF,EAAK,QAAQ,MACX,EAAK,OAAO,EAAM,GACzB,CACF;MACD,GAAuB;AAC1B,KAAgB,QAAQ,IAAI,EAAM,IAAI,EAAM;IAC5C,EAEF,EAAgB,QAAQ,SAAS,GAAO,MAAY;AAC9C,KAAmB,IAAI,EAAQ,KAGnC,aAAa,EAAM,EACnB,EAAgB,QAAQ,OAAO,EAAQ;IACvC;IACD,CAAC,EAAO,CAAC,EAEZ,QAAgB;EACd,IAAM,IAAS,EAAgB;AAC/B,eAAa;AAIX,GAHA,EAAO,SAAS,MAAU;AACxB,iBAAa,EAAM;KACnB,EACF,EAAO,OAAO;;IAEf,EAAE,CAAC;CAEN,IAAM,IAAM,QAAwB;EAClC,IAAM,IAAiB;GACrB;GACA;GACA;GACA,YACS;GAET,eACS;GAET,aACS;GAEV;AACD,SAAO;GACL,GAAG;GACH,MAAM,GAAa,GAAM,OAAO;GAChC,SAAS,GAAa,GAAM,UAAU;GACtC,OAAO,GAAa,GAAM,QAAQ;GACnC;IACA;EAAC;EAAO;EAAS;EAAK,CAAC;AAE1B,QACE,kBAAC,GAAa,UAAd;EAAuB,OAAO;YAA9B,CACG,GACD,kBAAC,IAAD;GAAuB;GAAQ,WAAW;GAAW,CAAA,CAC/B;;GAIf,WAA2B;CACtC,IAAM,IAAQ,EAAW,GAAa;AACtC,KAAI,KAAS,KACX,OAAU,MAAM,+CAA+C;AAEjE,QAAO;;;;ACtHT,SAAgB,GACd,GACA,GACA,GACoB;CACpB,IAAM,EAAE,SAAM,GAAkB,EAC1B,CAAC,GAAO,KAAY,EAAyB;EACjD,UAAU;GACR,OAAO,KAAgB;GACvB,UAAU;GACX;EACD,QAAQ,EAAE;EACV,cAAc;EACf,CAAC;CAGF,SAAS,IAAwB;EAC/B,IAAM,IAAmC,EAAE,EACvC,IAAU;AAuBd,SArBI,EAAM,SAAS,MAAM,MAAM,CAAC,WAAW,MACzC,EAAO,QAAQ,EAAE,sCAAsC,EACvD,IAAU,KAGR,EAAM,SAAS,SAAS,WAAW,KACrC,EAAO,WAAW,EAAE,yCAAyC,EAC7D,IAAU,MACD,EAAM,SAAS,SAAS,SAAS,MAC1C,EAAO,WAAW,EAAE,2CAA2C,EAC7D,WAAW,GACZ,CAAC,EACF,IAAU,KAGZ,GAAU,OACD;GACL,GAAG;GACH;GACD,EACD,EACK;;CAIT,SAAS,EAAa,GAA4C;EAChE,IAAM,EAAE,SAAM,UAAO,SAAM,eAAY,EAAM,QACzC,IAA+B;AAMnC,EAJI,MAAS,eACX,IAAa,IAGf,GAAU,OACD;GACL,GAAG;GACH,UAAU;IACR,GAAG,EAAK;KACP,IAAO;IACT;GACD,QAAQ;IACN,GAAG,EAAK;KACP,IAAO,KAAA;IACR,MAAM,KAAA;IACP;GACF,EACD;;CAIJ,eAAe,EACb,GACe;AACf,QAAM,gBAAgB,EAEjB,GAAc,EAInB;MAAU,OACD;IACL,GAAG;IACH,cAAc;IACf,EACD;AAEF,OAAI;AACF,QAAI,EAAK,uBAAuB,MAAM;KACpC,IAAM,IAAS,MAAM,EAAK,oBACxB,EAAM,SAAS,MAAM,MAAM,CAC5B;AAED,UADmB,MAAM,QAAQ,EAAO,QAAQ,GAAG,EAAO,UAAU,EAAE,EACvD,WAAW,GAAG;MAC3B,IAAM,IACJ,EAAO,eAAe,OAIlB,EAAE,+BAA+B,GAHjC,EAAE,wCAAwC,EACxC,MAAM,IAAI,KAAK,EAAO,YAAY,CAAC,gBAAgB,EACpD,CAAC;AAER,SAAU,OACD;OACL,GAAG;OACH,QAAQ;QACN,GAAG,EAAK;QACR,MAAM;QACP;OACF,EACD;AACF;;;AASJ,IALe,MAAM,EAAK,MAAM;KAC9B,OAAO,EAAM,SAAS;KACtB,UAAU,EAAM,SAAS;KAC1B,CAAC,KAEa,aACb,KAAa;WAET;IAGN,IAAM,IAAkB,EAAE,oCAAoC,EACxD,IAAc,EAAK,OAAO,SAC5B,IAAmB;AAMvB,IAJI,KAAe,QAAQ,MAAgB,OACzC,IAAmB,IAGrB,GAAU,OACD;KACL,GAAG;KACH,QAAQ;MACN,GAAG,EAAK;MACR,MAAM;MACP;KACF,EACD;aACM;AACR,OAAU,OACD;KACL,GAAG;KACH,cAAc;KACf,EACD;;;;AAIN,QAAO;EACL,UAAU,EAAM;EAChB,QAAQ,EAAM;EACd,cAAc,EAAK,aAAa,EAAM;EACtC;EACA;EACD;;;;8DEvLU,MAAa,MAA8B;CACtD,IAAM,EAAE,SAAM,GAAkB,EAC1B,EAAE,SAAM,cAAW,iBAAc,0BAAuB,iBAC5D,GACI,EAAE,aAAU,WAAQ,iBAAc,iBAAc,oBACpD,GAAa,GAAM,GAAW,EAAa,EAEzC,IAAgC;AAKpC,QAJI,EAAO,QAAQ,SACjB,IAAY,kBAAC,IAAD,EAAA,UAAY,EAAO,MAAiB,CAAA,GAIhD,kBAAC,QAAD;EAAM,WAAW,EAAG,IAAM,EAAU;EAAE,UAAU;EAAc,YAAA;YAA9D;GACG;GACD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,IAAD;IACE,OAAO,EAAE,8BAA8B;IACvC,MAAK;IACL,MAAK;IACL,OAAO,EAAS;IAChB,UAAU;IACV,OAAO,EAAO;IACd,aAAa,EAAE,oCAAoC;IACnD,cAAa;IACb,WAAA;IACA,UAAA;IACA,CAAA,EACF,kBAAC,IAAD;IACE,OAAO,EAAE,iCAAiC;IAC1C,MAAK;IACL,MAAK;IACL,OAAO,EAAS;IAChB,UAAU;IACV,OAAO,EAAO;IACd,aAAa,EAAE,uCAAuC;IACtD,cAAa;IACb,UAAA;IACA,CAAA,CACE,EAAA,CAAA;GACN,kBAAC,GAAD;IACE,MAAK;IACL,OAAM;IACN,MAAK;IACL,WAAW,EAAG,EAAsB;IACpC,WAAW;cAEV,EAAE,gCAAgC;IAC5B,CAAA;GACJ;;;;;;;;;;+KEpDE,MAAoB,EAC/B,aACA,eACA,eACA,gBAAa,IACb,iBAAc,SAC0B;CACxC,IAAI,IAAiC;AACrC,CAAK,MACH,IAAe;CAGjB,IAAM,IAAqB,CAAC,KAAc,KAAgB,MAEtD,IAEA;AAKJ,QAJI,MACF,IAAa,cAIb,kBAAC,SAAD;EACE,WAAW,EACT,IACA,GAA0B,EAAE,OAAO,GAAY,CAAC,CACjD;YAJH,CAME,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACG,KACC,kBAAC,OAAD;IAAK,WAAW;cAAuB;IAAmB,CAAA,EAE5D,kBAAC,OAAD;IACE,WAAW,EAAG,IAAY,GACvB,KAAsB,GACxB,CAAC;IAED;IACG,CAAA,CACF;MACL,KAAc,QACb,kBAAC,OAAD;GACE,WAAW,EAAG,uBAAe,EAC1B,iCAAyB,GAC3B,CAAC;aAED;GACG,CAAA,CAEF;;GC5DC,MAAkB,EAC7B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WAEJ,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA;CACE,CAAA,ECrBG,MAAmB,EAC9B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WAEJ,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA;CACE,CAAA,ECrBG,MAAY,EACvB,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WAEJ,kBAAC,QAAD;EACE,GAAE;EACF,MAAK;EACL,CAAA;CACE,CAAA,EClBG,MAAqB,EAChC,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WAEJ,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA;CACE,CAAA,ECrBG,MAAyB,EACpC,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACE;ICnCG,MAAkB,EAC7B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN,CAQE,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,EACF,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,CACE;IC5BG,MAAoB,EAC/B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN,CAQE,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,EACF,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,CACE;IC5BG,MAAsB,EACjC,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN,CAQE,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,EACF,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,CACE;IC5BG,MAAmB,EAC9B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN,CAQE,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,EACF,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,CACE;IC5BG,MAAkB,EAC7B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACE;IC1BG,MAAY,EAAE,UAAO,IAAI,mBAC7B,kBAAC,IAAD;CAAgB,OAAO;CAAM,QAAQ;CAAiB;CAAa,CAAA,EAG/D,MAAa,EAAE,UAAO,IAAI,mBAC9B,kBAAC,IAAD;CAAiB,OAAO;CAAM,QAAQ;CAAiB;CAAa,CAAA,EAGhE,MAAmB,EAC9B,UAAO,IACP,mBAGE,kBAAC,IAAD;CAAuB,OAAO;CAAM,QAAQ;CAAiB;CAAa,CAAA,EAIjE,MAAY,EAAE,UAAO,IAAI,mBAC7B,kBAAC,IAAD;CAAgB,OAAO;CAAM,QAAQ;CAAiB;CAAa,CAAA,EAG/D,MAAqB,EAChC,UAAO,IACP,mBAEO,kBAAC,IAAD;CAAU,OAAO;CAAM,QAAQ;CAAiB;CAAa,CAAA,EAGzD,MAAgB,EAAE,UAAO,IAAI,mBAEtC,kBAAC,IAAD;CAAoB,OAAO;CAAM,QAAQ;CAAiB;CAAa,CAAA,EAI9D,MAAgB,EAAE,UAAO,IAAI,mBACjC,kBAAC,IAAD;CAAmB,OAAO;CAAM,QAAQ;CAAiB;CAAa,CAAA,EAUlE,MAAoB,EAC/B,UAAO,IACP,mBAEO,kBAAC,IAAD;CAAiB,OAAO;CAAM,QAAQ;CAAiB;CAAa,CAAA,EAGhE,MAAmB,EAC9B,UAAO,IACP,mBAEO,kBAAC,IAAD;CAAgB,OAAO;CAAM,QAAQ;CAAiB;CAAa,CAAA,EAG/D,MAAc,EAAE,UAAO,IAAI,mBAC/B,kBAAC,IAAD;CAAkB,OAAO;CAAM,QAAQ;CAAiB;CAAa,CAAA,EAGjE,MAAY,EAAE,UAAO,IAAI,mBAC7B,kBAAC,IAAD;CAAgB,OAAO;CAAM,QAAQ;CAAiB;CAAa,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6JE/BtE,MAAsB,EAC1B,OACA,eACA,kBAKiB;CACjB,IAAI,IAEA;AAKJ,QAJI,MACF,IAAsB,aAItB,kBAAC,OAAD;EACM;EACJ,eAAa,CAAC;EACd,WAAW,EACT,IACA,GAA8B,EAAE,OAAO,GAAqB,CAAC,CAC9D;YAED,kBAAC,OAAD;GAAK,WAAW;GAA4B;GAAe,CAAA;EACvD,CAAA;GAIJ,MAAqB,EACzB,UACA,eACA,aAAa,GACb,sBACA,wBAAqB,SACoB;CACzC,IAAM,EAAE,SAAM,GAAkB,EAC1B,CAAC,GAAmB,KAAwB,EAAS,GAAM,EAC3D,CAAC,GAAe,KAAoB,EACxC,EAAE,CACH,EACK,IAAe,KAAmB,MAClC,IAAc,KAAmB,GACjC,EAAE,gBAAa,GAAa,EAE5B,KAAgB,GAAgB,MAChC,MAAU,KACL,MAAa,IAElB,MAAa,IACR,KAEF,EAAS,WAAW,GAAG,EAAO,GAAG,EAGpC,IAAe,GAAa,GAAa,MAAuB;AACpE,KAAkB,OACT;GACL,GAAG;IACF,IAAM;GACR,EACD;IACD,EAAE,CAAC,EAEA,IAAuB,QAAkB;EAC7C,IAAM,IAAY,CAAC;AAInB,EAHK,KACH,EAAqB,EAAU,EAEjC,IAAoB,EAAU;IAC7B;EAAC;EAAa;EAAc;EAAkB,CAAC,EAE9C;AACJ,CAAK,MACH,IAAgB,KAAc,KAAA;CAGhC,IAAM,IAAiB,QAAc;AACnC,MAAI,CAAC,EACH,QAAO;EAGT,IAAI,IAAe,IACf,IAAc,EAAE,+CAA+C;AACnE,EAAI,MACF,IAAe,IACf,IAAc,EAAE,6CAA6C;EAG/D,IAAI,IAIA;AACJ,EAAI,MACF,IAAgB;EAGlB,IAAI,IAAoC;AASxC,SARK,MACH,IACE,kBAAC,QAAD;GAAM,WAAW;aACd,EAAE,sCAAsC;GACpC,CAAA,GAKT,kBAAC,UAAD;GACE,MAAK;GACL,SAAS;GACT,WAAW,EACT,IACA,GAAiC,EAAE,OAAO,GAAe,CAAC,CAC3D;GACD,cAAY;aAPd,CASE,kBAAC,GAAD,EAAc,MAAM,IAAM,CAAA,EACzB,EACM;;IAEV;EAAC;EAAsB;EAAa;EAAoB;EAAE,CAAC;AAE9D,QACE,kBAAC,IAAD;EACE,YAAY;EACZ,YAAY;EACC;EACb,yBAAyB;YAExB,EAAM,KAAK,MAAS;GACnB,IAAM,IAAa,EAAK,cAAc,MAChC,IAAc,KAAc,QAAQ,EAAW,SAAS,GAE1D,IADmB,EAAc,EAAK,QACP,EAAK,mBAAmB,IACrD,IAAe,CAAC,GAClB,GACE,IAAuB,CAAC,KAAe;AAK7C,GAJI,MACF,IAAiB,sBAAsB,EAAK,IAAI,aAG9C,KACqB,EAAW,MAAM,MAC/B,EAAa,EAAM,GAAG,CAC7B,KAGA,IAAa;GAIjB,IAAI,IAAmD;AACvD,GAAI,CAAC,KAAe,EAAK,kBAAkB,SACzC,IAAiB,EAAK;GAExB,IAAM,IAAqB,KAAkB,MACvC,IACJ,EAAK,cAAc,KAAA,KAAa,EAAK,cAAc,MAC/C,IACJ,EAAK,iBAAiB,KAAA,KAAa,EAAK,iBAAiB,MACrD,IACJ,EAAK,sBAAsB,KAAA,KAC3B,EAAK,sBAAsB,MACvB,IACJ,CAAC,KACD,CAAC,MACA,KAAmB,IAElB;AACJ,GAAI,MACF,IAAgB,EAAK;GAGvB,IAAI,IAEA;AACJ,GAAI,MACF,IAAW;GAEb,IAAM,IAAe,GAAoB,EAAE,OAAO,GAAU,CAAC,EAEzD;AACJ,GAAI,MACF,IAAmB;GAGrB,IAAI,IAAgC;AACpC,GAAK,MACH,IAAY,kBAAC,QAAD;IAAM,WAAW;cAAe,EAAK;IAAa,CAAA;GAGhE,IAAI,IAAiC;AACrC,GAAI,MACF,IACE,kBAAC,QAAD;IAAM,WAAW;cAA4B,EAAK;IAAiB,CAAA;GAIvE,IAAM,IACJ,kBAAC,QAAD;IAAM,WAAW;cAAjB,CACE,kBAAC,QAAD;KACE,WAAW,EAAG,IAAsB,GACjC,KAA2B,GAC7B,CAAC;eAED,EAAK;KACD,CAAA,EACN,EACI;OAGL,IAAoC;AACxC,OAAI,GAAc;IAChB,IAAI,IAAwC;AAC5C,IAAI,MACF,IACE,kBAAC,QAAD;KACE,WAAW,EAAG,IAAsB,GACjC,KAA2B,GAC7B,CAAC;eAED,EAAK;KACD,CAAA;IAIX,IAAI,IAAyC;AAS7C,IARI,MACF,IACE,kBAAC,QAAD;KAAM,WAAW;eACd,EAAK;KACD,CAAA,GAIX,IACE,kBAAC,QAAD;KAAM,WAAW;eAAjB,CACG,GACA,EACI;;;GAIX,IAAM,IACJ,kBAAA,GAAA,EAAA,UAAA;IACG;IACA;IACA;IACA,EAAA,CAAA,EAGC,UAA0B;AAC1B,KAAC,KAAe,KAGpB,EAAa,EAAK,KAAK,EAAa;MAGlC;AACJ,OAAI,EACF,KAAuB,EACrB,IACA,GACA,EACD;QACI;IACL,IAAI,IAEA;AAIJ,IAHI,EAAa,EAAK,IAAI,EAAK,MAAM,KACnC,IAAW,WAEb,IAAuB,EACrB,GAAqB,EAAE,OAAO,GAAU,CAAC,EACzC,GACA,EACD;;GAGH,IAAI;AACJ,GAcE,IAdE,IAEA,kBAAC,UAAD;IACE,MAAK;IACL,WAAW;IACX,iBAAe;IACf,iBAAe;IACf,cAAY;IACZ,SAAS;cAER;IACM,CAAA,GAIT,kBAAC,GAAD;IACE,IAAI,EAAK;IACT,WAAW;IACX,OAAO,EAAK;IACZ,cAAY;cAEX;IACI,CAAA;GAIX,IAAI,IAAyC;AAC7C,OAAI,KAAkB,MAAM;IAC1B,IAAM,KACJ,MACS;AAGT,KAFA,EAAM,gBAAgB,EACtB,EAAM,iBAAiB,EACvB,EAAe,SAAS;OAGpB,IAAoB,EAAe,WACnC,IACJ,KAAyD,MACvD,IAA2C;AAS/C,IARI,MACF,IACE,kBAAC,QAAD;KAAM,WAAW;eACd;KACI,CAAA,GAIX,IACE,kBAAC,UAAD;KACE,MAAK;KACL,cAAY,EAAe;KAC3B,SAAS;KACT,WAAW;eAEX,kBAAC,QAAD;MAAM,WAAW;gBAAjB,CACE,kBAAC,QAAD;OAAM,WAAW;iBACd,EAAe;OACX,CAAA,EACN,EACI;;KACA,CAAA;;GAIb,IAAI,IAAgC;AAsCpC,UArCI,KAAwB,KAAkB,SAC5C,IACE,kBAAC,IAAD;IAAoB,IAAI;IAA4B;cACjD,EAAW,KAAK,MAAU;KACzB,IAAI,IAA8B;AAClC,KAAI,EAAM,QAAQ,SAChB,IACE,kBAAC,QAAD;MAAM,WAAW;gBAAmB,EAAM;MAAY,CAAA;KAI1D,IAAI,IAIA;AAKJ,YAJI,EAAa,EAAM,GAAG,KACxB,IAAa,WAIb,kBAAC,OAAD;MAAqB,WAAW;gBAC9B,kBAAC,GAAD;OACE,IAAI,EAAM;OACV,WAAW,GAAuB,EAAE,OAAO,GAAY,CAAC;OACxD,cAAY,EAAM;iBAHpB,CAKG,GACD,kBAAC,QAAD;QAAM,WAAW;kBAAoB,EAAM;QAAa,CAAA,CACnD;;MACH,EATI,EAAM,IASV;MAER;IACiB,CAAA,GAKvB,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;IAAK,WAAW;cAAhB,CACG,GACA,EACG;OACL,EACG,EAAA,EANI,EAAK,IAMT;IAER;EACe,CAAA;kWEjbV,MAAc,MAA8B;CACvD,IAAM,EAAE,OAAO,GAAW,UAAU,GAAc,gBAAa,GAE3D,IAAsC;AAK1C,QAJI,KAAgB,QAAQ,MAAiB,OAC3C,IAAkB,kBAAC,KAAD;EAAG,WAAW;YAAgB;EAAiB,CAAA,GAIjE,kBAAC,OAAD;EAAK,WAAW;YACd,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACE,kBAAC,OAAD;IAAK,WAAW;cAAhB,CACE,kBAAC,MAAD;KAAI,WAAW;eAAa;KAAe,CAAA,EAC1C,EACG;OACL,EACG;;EACF,CAAA;yUEjBG,MAAwB,EACnC,UACA,aACA,YACA,SACA,aAAA,GACA,mBAGE,kBAAC,OAAD;CAAK,WAAW,EAAG,IAAkB,EAAU;WAA/C,CACE,kBAAC,OAAD;EAAK,WAAW;YAAhB,CACE,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACG,KAAe,QACd,kBAAC,OAAD;IAAK,WAAW;cAAqB;IAAkB,CAAA,EAEzD,kBAAC,OAAD;IAAK,WAAW;cAAhB,CACE,kBAAC,MAAD;KAAI,WAAW;eAAe;KAAW,CAAA,EACxC,KAAQ,QAAQ,kBAAC,OAAD;KAAK,WAAW;eAAiB;KAAW,CAAA,CACzD;MACF;MACL,KAAY,SACV,OAAO,KAAa,YAAY,EAAS,MAAM,KAAK,OACnD,kBAAC,KAAD;GAAG,WAAW;aAAkB;GAAa,CAAA,CAE7C;KACL,KAAW,QAAQ,kBAAC,OAAD;EAAK,WAAW;YAAiB;EAAc,CAAA,CAC/D;8PExBG,MAAiB,EAC5B,UACA,aACA,kBACA,qBACA,eACA,aACA,cACA,0BACqC;CACrC,IAAM,IAAY,KAAoB,EAAE,EAClC,IAAmB,KAAiB,MACpC,IAAsB,EAAU,SAAS,GAE3C,IAA4B;AAsBhC,SArBI,KAAoB,OACtB,IACE,kBAAC,OAAD;EAAK,WAAW;YAAhB,CACG,KACC,kBAAC,OAAD;GAAK,WAAW;aACb,EAAU,KAAK,GAAQ,MAEpB,kBAAC,OAAD;IAAiB,WAAW;cACzB;IACG,EAFI,EAEJ,CAER;GACE,CAAA,EAEP,KACC,kBAAC,OAAD;GAAK,WAAW;aAAuB;GAAoB,CAAA,CAEzD;MAKR,kBAAC,OAAD;EAAK,WAAW,EAAG,IAAkB,EAAU;YAA/C,CACE,kBAAC,IAAD;GACS;GACG;GACD;GACT,aAAa;GACb,CAAA,EACF,kBAAC,OAAD;GAAK,WAAW,EAAG,IAAgB,EAAiB;GAAG;GAAe,CAAA,CAClE;;sOExCJ,MACJ,GACA,MACqB;CACrB,IAAM,IAAgB,KAAoB,EAAE,EACtC,IAAe,EAAc,SAAS,GACtC,IAAa,KAAiB;AAMpC,QAJI,CAAC,KAAc,CAAC,IACX,OAIP,kBAAC,OAAD;EAAK,WAAW;YAAhB,CACG,KACC,kBAAC,OAAD;GAAK,WAAW;aACb,EAAc,KAAK,GAAQ,MAExB,kBAAC,OAAD;IAAiB,WAAW;cACzB;IACG,EAFI,EAEJ,CAER;GACE,CAAA,EAEP,KACC,kBAAC,OAAD;GAAK,WAAW;aAAuB;GAAoB,CAAA,CAEzD;;GAIG,MAAc,EACzB,UACA,aACA,kBACA,qBACA,kBAAA,GACA,aACA,cACA,0BAGE,kBAAC,OAAD;CAAK,WAAW,EAAG,IAAkB,EAAU;WAA/C;EACE,kBAAC,IAAD;GACS;GACG;GACV,SAAS,GAAc,GAAe,EAAiB;GACvD,CAAA;EACD,KAAoB,QACnB,kBAAC,OAAD;GAAK,WAAW;aAA0B;GAAuB,CAAA;EAEnE,kBAAC,OAAD;GAAK,WAAW,EAAG,IAAgB,EAAiB;GAAG;GAAe,CAAA;EAClE;IAIG,MAAqB,EAChC,aACA,cACA,oBAAiB,IACjB,GAAG,QACsC;CACzC,IAAI;AAOJ,QANI,IACF,IAAmB,EAAG,IAAuB,EAAU,GAC9C,KAAa,SACtB,IAAmB,IAInB,kBAAC,OAAD;EAAK,GAAI;EAAM,WAAW;EACvB;EACG,CAAA;mgBE9DJ,KAAc;AAKpB,SAAS,GACP,GACmB;CACnB,IAAM,IAAa,EAAO;AAC1B,KAAI,KAAc,QAAQ,EAAW,KAAK,UAAU,GAKlD,QAJI,KAAc,OACT,EAAE,GAGJ,EAAW,KAAK,KAAK,MACnB,EAAM,EACb;CAGJ,IAAM,IAAO,KAAK,KAAK,EAAW,KAAK,SAAS,GAAY,EACtD,IAAe,EAAW,KAC7B,QAAQ,GAAG,MACH,IAAQ,MAAS,EACxB,CACD,KAAK,MACG,EAAM,EACb,EAEE,IAAY,EAAW,KAAK,GAAG,GAAG;AAKxC,QAJI,KAAa,QAAQ,EAAa,GAAG,GAAG,KAAK,EAAU,KACzD,EAAa,KAAK,EAAU,EAAE,EAGzB;;AAMT,SAAS,GAAc,GAAwB;AAE7C,yBADe,IAAI,KAAK,GAAG,EAAO,YAAY,EAChC,mBAAmB,KAAA,GAAW;EAC1C,OAAO;EACP,KAAK;EACN,CAAC;;AAGJ,IAAa,MACX,MACgB;CAChB,IAAM,EACJ,cACA,sBACA,kBACA,kBACA,gBACA,cACE,GAEE,IAAe,GAAmB,EAAO,EACzC,IAAsB,GACtB,KAAc,MACX,EAAoB,SAAS,EAAM,EAGtC,IAAU,CACd;EACE,QAAQ;EACR,WAAW;EACX,YAAY;EACZ,WAAW;EACX,YAAY;EACZ,cAAc;EACd,YAAY;EACZ,aAAa;EACb,eAAe,EAAK,OAAO;EAC3B,MAAM,EAAc,KAAK,OAChB;GACL,IAAI;GACJ,OAAO,EAAc,EAAS;GAC9B,OAAO,EAAkB;GAC1B,EACD;EACH,CACF;AAuED,QACE,kBAAC,OAAD;EAAK,WAAW;YACd,kBAAC,GAAD;GACE,MAAM;GACN,QAAQ;IAAE,KAAK;IAAI,OAAO;IAAI,QAAQ;IAAI,MAAM;IAAI;GACpD,SA1Ea,MACb,OAAO,EAAM,MAAO,YAAY,CAAC,EAAW,EAAM,GAAG,GAChD,EAAK,OAAO,UAGd,EAAkB,EAAM;GAsE3B,QAAQ,EAAE,MAAM,SAAS;GACzB,QAAQ;IAAE,MAAM;IAAU,KAAK;IAAG,KAAK;IAAQ;GAC/C,OAAM;GACN,WAAW;GACX,WAAW;GACX,kBAAkB;GAClB,kBAAkB;IAAE,MAAM;IAAe,WAAW,CAAC,CAAC,UAAU,GAAI,CAAC;IAAE;GACvE,YAAA;GACA,aAAa;GACb,aAAa;GACb,aAAA;GACA,SAAS;GACT,WAAW;GACX,YAAY;IACV,YAAY;IACZ,SAAS,MACA,GAAc,OAAO,EAAM,CAAC;IAErC,UAAU;IACV,aAAa;IACd;GACD,UAAU;IACR,UAAU;IACV,aAAa;IACb,YAAY;IACZ,SAAS,MACH,OAAO,KAAU,WAId,IAAI,KAAK,aAAa,SAAS;KACpC,UAAU;KACV,uBAAuB;KACxB,CAAC,CAAC,OAAO,EAAM,GANP;IAQZ;GACD,cAAA;GACA,SAAA;GACS;GACT,OAAO;IACL,MAAM,EACJ,MAAM,EACJ,QAAQ,EAAK,OAAO,aACrB,EACF;IACD,MAAM,EACJ,OAAO,EACL,MAAM;KACJ,MAAM,EAAK,OAAO;KAClB,UAAU;KACX,EACF,EACF;IACD,WAAW,EACT,MAAM;KACJ,QAAQ,EAAK,OAAO;KACpB,aAAa;KACb,iBAAiB;KAClB,EACF;IACD,SAAS,EACP,WAAW;KACT,YAAY;KACZ,WAAW;KACX,SAAS;KACV,EACF;IACF;GACa,eAvIE,EACpB,eACwE;IACxE,IAAM,IAAS,OAAO,EAAM,GAAG,EACzB,IAAmB,EAAc,MAAM,MACvC,IAAS,CAAC,GAAG,EAAM,OAAO,CAC7B,KAAK,MAA8C;KAClD,IAAI,IAAU;AACd,KAAI,OAAO,EAAM,KAAK,KAAM,aAC1B,IAAU,EAAM,KAAK;KAGvB,IAAI,IAAW;AAQf,YAPI,OAAO,EAAM,YAAa,YAAY,EAAW,EAAM,SAAS,KAClE,IAAW,EAAM,WAEf,KAAY,OACP,OAGF;MACL;MACA,MAAM,EAAE,GAAG,GAAS;MACpB,OAAO,EAAM;MACd;MACD,CACD,QAAQ,MACA,KAAS,KAChB,CACD,MAAM,GAAM,MACO,EAAc,QAAQ,EAAK,SAAS,GACnC,EAAc,QAAQ,EAAM,SAAS,CAGxD;AAEJ,WACE,kBAAC,OAAD;KAAK,WAAW;eAAhB,CACE,kBAAC,KAAD;MAAG,WAAW;gBAAqB,GAAc,EAAO;MAAK,CAAA,EAC5D,EAAO,KAAK,MAET,kBAAC,OAAD;MAEE,WAAW;gBAFb,CAIE,kBAAC,QAAD;OAAM,WAAW;iBAAjB,CACE,kBAAC,QAAD;QACE,WAAW;QACX,OAAO,EAAE,iBAAiB,EAAM,OAAO;QACvC,eAAA;QACA,CAAA,EACF,kBAAC,QAAD,EAAA,UAAO,EAAc,EAAM,SAAS,EAAQ,CAAA,CACvC;UACP,kBAAC,UAAD,EAAA,UAAS,EAAY,EAAM,KAAK,EAAE,EAAU,CAAA,CACxC;QAZC,GAAG,EAAO,GAAG,EAAM,WAYpB,CAER,CACE;;;GA+EJ,cAAa;GACb,MAAK;GACM;GACX,CAAA;EACE,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IEtNJ,KAAwB,kBAExB,MAAsB,MACtB,KAAgB,OACX,OAGF,GAAuB,EAAE,iBAAc,CAAC,EAG3C,MACJ,GACA,MAEI,OAAO,KAAwB,YAAY,MAAwB,KAC9D,EAAE,wBAAqB,GAEzB,EACL,qBAAqB,UAAU,EAAY,IAAI,GAAsB,IACtE,EAMU,MAAmB,EAC9B,YACA,SACA,aACA,eACA,cACA,oBACA,kBACA,iBACA,0BACA,wBACA,SACA,iBACsC;CACtC,IAAM,EAAE,SAAM,GAAkB,EAC1B,IAA8B,KAAQ,WACtC,IACJ,kBAAC,OAAD;EAAK,WAAW,EAAG,IAAkB,GAAS,UAAU;YACrD,EAAE,qBAAqB;EACpB,CAAA,EAEF,IAAqB,KAAc,GACnC,IAAY,EAAK,WAAW,GAE9B;AACJ,CAAI,MACF,IAAsB,GACpB,EAAQ,QACR,EACD;CAGH,IAAM,IAA6B,EAAE;AACrC,CAAI,KAAyB,QAC3B,EAAiB,KAAK,EAAsB;CAG9C,IAAI;AA+EJ,QA9EA,AAOE,IAPE,IAEA,kBAAC,OAAD;EAAK,WAAW,EAAG,IAAiB,GAAS,SAAS;EAAE,MAAK;YAC3D,kBAAC,OAAD;GAAK,MAAK;aAAQ;GAAyB,CAAA;EACvC,CAAA,GAIN,kBAAA,GAAA,EAAA,UACG,EAAK,KAAK,GAAK,MAAU;EACxB,IAAM,IAAQ,EAAS,GAAK,EAAM,EAC5B,IAAa,CAAC,GAAW,EAAE,MAAM,GAAc,CAAC,EAAE,GAAS,IAAI;AACrE,EAAI,IAAQ,KAAM,IAChB,EAAW,KACT,GAAe,EAAE,MAAM,GAAc,CAAC,EACtC,GAAS,QACV,GAED,EAAW,KACT,GAAc,EAAE,MAAM,GAAc,CAAC,EACrC,GAAS,OACV;AAEH,OAAK,IAAM,KAAe,EACxB,GAAW,KAAK,EAAY;AAG9B,MAAI,KAAgB,MAAM;GACxB,IAAM,IAAc,EAAa,GAAK,EAAM;AAC5C,GAAI,KAAe,QACjB,EAAW,KAAK,EAAY;;AAIhC,SACE,kBAAC,OAAD;GAEE,MAAK;GACL,WAAW,EAAG,GAAG,EAAW;GAC5B,OAAO;aAEN,EAAQ,KAAK,MAAW;IACvB,IAAM,IAAc,CAClB,GAAY,EAAE,MAAM,GAAc,CAAC,EACnC,GAAS,KACV,EACK,IAAkB,GAAmB,EAAO,aAAa;AAS/D,IAPI,KAAmB,QACrB,EAAY,KAAK,EAAgB,EAG/B,EAAO,aAAa,QACtB,EAAY,KAAK,EAAO,UAAU,EAEhC,EAAO,aACT,EAAY,KAAK,IAAoB,GAAS,YAAY;IAG5D,IAAM,IAAU,EAAO,KAAK,EAAI;AAEhC,WACE,kBAAC,OAAD;KAEE,MAAK;KACL,WAAW,EAAG,GAAG,EAAY;eAE5B;KACG,EALC,EAAO,GAKR;KAER;GACE,EAnCC,EAmCD;GAER,EACD,CAAA,EAKL,kBAAC,OAAD;EACE,WAAW,EACT,GAAiB,EAAE,MAAM,GAAc,CAAC,EACxC,GAAS,WACT,EACD;EACD,MAAK;YANP,CAQE,kBAAC,OAAD;GACE,WAAW,EACT,GAAc,EAAE,MAAM,GAAc,CAAC,EACrC,GAAS,QACT,EACD;GACD,MAAK;aAEL,kBAAC,OAAD;IACE,WAAW,EACT,IACA,GAAS,WACT,GAAG,EACJ;IACD,MAAK;IACL,OAAO;cAEN,EAAQ,KAAK,MAAW;KACvB,IAAM,IAAgB,CACpB,GAAkB,EAAE,MAAM,GAAc,CAAC,EACzC,GAAS,WACV,EACK,IAAkB,GAAmB,EAAO,aAAa;AAe/D,YAdI,KAAmB,QACrB,EAAc,KAAK,EAAgB,EAGjC,EAAO,aAAa,QACtB,EAAc,KAAK,EAAO,UAAU,EAElC,EAAO,aACT,EAAc,KACZ,IACA,GAAS,kBACV,EAID,kBAAC,OAAD;MAEE,MAAK;MACL,WAAW,EAAG,GAAG,EAAc;gBAE9B,EAAO;MACJ,EALC,EAAO,GAKR;MAER;IACE,CAAA;GACF,CAAA,EAEN,kBAAC,OAAD;GACE,WAAW,EACT,GAAY,EAAE,MAAM,GAAc,CAAC,EACnC,GAAS,MACT,EACD;GACD,MAAK;aAEJ;GACG,CAAA,CACF;;;;;;;;;;;uLEtPG,KAAiB,EAC5B,aACA,cACA,WAAQ,SACR,UAAA,IAAW,SAC0B;CACrC,IAAM,IAAa;EAAC;EAAa,GAAmB,EAAE,UAAO,CAAC;EAAE;EAAU;AAM1E,QAJI,KACF,EAAW,KAAK,GAAgB,EAG3B,kBAAC,OAAD;EAAK,WAAW,EAAG,GAAG,EAAW;EAAG;EAAe,CAAA;GCuBtD,KAAqB,KACrB,KAAwB,IAExB,KAAgD,EACpD,uBAAuB,GACxB,EAEK,KAAiD;CACrD,WAAW;CACX,WAAW;CACZ,EA0GY,KAAY;CACvB,MAAM;CACN,OA1GY,EACZ,UACA,cAAW,IACX,aACA,cAAW,IACX,mBACgC;EAChC,IAAI,IAAqB,KAAY;AAErC,MAAI,KAAW,KACb,KAAU;WACD,OAAO,KAAY,UAAU;GACtC,IAAM,IAAU,EAAQ,MAAM;AAC9B,GAGE,IAHE,EAAQ,WAAW,IACX,IAEA;;AAId,SACE,kBAAC,GAAD;GAAyB;GAAU,WAAW,EAAG,IAAa,EAAU;aACrE;GACa,CAAA;;CAoFlB,SAhFkB,EAClB,UACA,cAAW,IACX,WACA,mBAAgB,SAed,kBAAC,GAAD;EAAe,OAAM;EAAM,WAAW;YAbtB,QAAc;AAC9B,OAAI,KAAS,QAAQ,OAAO,MAAM,OAAO,EAAM,CAAC,CAC9C,QAAO;AAGT,OAAI;AACF,WAAO,IAAI,KAAK,aAAa,GAAQ,EAAc,CAAC,OAAO,EAAM;WAC3D;AACN,WAAO,OAAO,EAAM;;KAErB;GAAC;GAAO;GAAU;GAAQ;GAAc,CAAC;EAK1B,CAAA;CA4DlB,SAxDc,EACd,UACA,SACA,eAAY,SAGV,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;EAAa;EAAM,SAAS;YACzB;EACK,CAAA,EACM,CAAA;CA+ClB,OA3CgB,EAChB,UACA,cAAW,IACX,WACA,aAAU,SAGR,kBAAC,GAAD;EAAe,WAAW;YACxB,kBAAC,IAAD;GACS;GACG;GACF;GACC;GACT,CAAA;EACY,CAAA;CA8BlB,QA1BiB,EAAE,UAAO,cAExB,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;EAAa;YAAO;EAAc,CAAA,EACpB,CAAA;CAuBlB,UAnBe,EAAE,aAAU,mBAEzB,kBAAC,GAAD;EAAe,OAAM;EAAiB;EACnC;EACa,CAAA;CAgBlB,QAZa,EAAE,kBACR,kBAAC,QAAD;EAAM,WAAW;EAAe;EAAgB,CAAA;CAYxD,ECrKY,MAAc,EACzB,YACA,aACA,cACA,qBACA,eAGE,kBAAC,IAAD;CACS;CACP,eAAe;CACJ;CACO;CAEjB;CACI,CAAA,2MEZE,MAAe,EAC1B,YACA,aACA,cACA,gBACA,aACA,eAGE,kBAAC,IAAD;CAAuB;WACrB,kBAAC,OAAD;EAAK,WAAW;YAAhB;GACE,kBAAC,OAAD;IAAK,WAAW;cAAhB,CACE,kBAAC,MAAD;KAAI,WAAW;eAAe;KAAW,CAAA,EACxC,KAAe,QACd,kBAAC,OAAD;KAAK,WAAW;eAAqB;KAAkB,CAAA,CAErD;;GACN,kBAAC,OAAD;IAAK,WAAW;IAAiB;IAAe,CAAA;GAC/C,KAAW,QAAQ,kBAAC,OAAD;IAAK,WAAW;cAAiB;IAAc,CAAA;GAClE,KAAY,QACX,kBAAC,OAAD;IAAK,WAAW,EAAG,+BAAgB;cAAG;IAAe,CAAA;GAEnD;;CACK,CAAA,sTEvBJ,MAAa,EACxB,YACA,cACA,SACA,eACA,iBACA,aACA,eAGE,kBAAC,UAAD;CAAQ,WAAW,EAAG,IAAa,EAAU;WAA7C,CACE,kBAAC,OAAD;EAAK,WAAW;YAAhB,CACE,kBAAC,OAAD;GAAK,WAAW;aAAhB;IACE,kBAAC,MAAD;KAAI,WAAW;eAAe;KAAW,CAAA;IACxC,KAAY,QACX,kBAAC,OAAD;KAAK,WAAW;eAAkB;KAAe,CAAA;IAElD,KAAQ,QAAQ,kBAAC,OAAD;KAAK,WAAW;eAAc;KAAW,CAAA;IACtD;MACL,KAAW,QAAQ,kBAAC,OAAD;GAAK,WAAW;aAAiB;GAAc,CAAA,CAC/D;MACJ,KAAc,QAAQ,KAAgB,SACtC,kBAAC,OAAD;EAAK,WAAW;YAAhB,CACG,GACA,EACG;IAED;2hBEHP,KAA8B,KAC9B,KAAsB,IAEtB,MACJ,GACA,MAEI,KAAS,OACJ,OAIA,EADL,OAAO,KAAU,YAAY,OAAO,KAAU,WACxC,OAGF,OAHC;CAAe;WAAY;CAAW,CAAA,EAM3C,MACJ,GACA,MAEI,KAAa,OACR,OAIA,EADL,OAAO,KAAc,YAAY,OAAO,KAAc,WAChD,MAGF,OAHC;CAAc;WAAY;CAAc,CAAA,EAMtC,MAAiB,MAA2C;CACvE,IAAM,EACJ,gBACA,YACA,aACA,cACA,qBACA,eACA,SACA,sBAAmB,EAAE,EACrB,WAAA,GACA,aACE,GAEA,IAAiB;AACrB,KAAI,KAAe,MAAM;EACvB,IAAM,IACJ,EAAY,kBAAkB;AAChC,MAAiB,KAAK,IAAI,GAAa,EAAE;;CAG3C,IAAI;AACJ,CAAI,IAAiB,MACnB,IAAgB,EACd,eAAe,IAAiB,IACjC;CAGH,IAAM,IAAsB,KAAc,QAAQ,EAAiB,SAAS,GACxE,IAAqC;AACzC,CAAI,KAAc,SAChB,IACE,kBAAC,OAAD;EAAK,WAAW,EAAG,IAA0B,GAAS,kBAAkB;YACrE;EACG,CAAA;CAIV,IAAI,IAAsC;AAC1C,CAAI,KAAe,SACjB,IACE,kBAAC,OAAD;EAAK,WAAW,EAAG,IAAwB,GAAS,gBAAgB;YAClE,kBAAC,OAAD;GACE,WAAW,EAAG,IAA2B,GAAS,mBAAmB;aAEpE,EAAY;GACT,CAAA;EACF,CAAA;CAIV,IAAI,IAAwC;AAC5C,CAAI,MACF,IACE,kBAAC,OAAD;EAAK,WAAW,EAAG,IAAsB,GAAS,cAAc;YAAhE,CACG,EAAiB,KAAK,GAAQ,MAE3B,kBAAC,OAAD;GAEE,WAAW,EACT,IACA,GAAS,kBACV;aAEA;GACG,EAPC,aAAa,IAOd,CAER,EACD,EACG;;CAIV,IAAM,IAAiB,EAAG,IAAc,GAAS,MAAM,EACjD,IAAqB,EAAG,IAAkB,GAAS,UAAU,EAC7D,IAAgB,EAAG,IAAgB,GAAS,QAAQ,EACtD,IAA6B;AAKjC,QAJI,KAAQ,SACV,IAAW,kBAAC,OAAD;EAAK,WAAW;YAAgB;EAAW,CAAA,GAItD,kBAAC,WAAD;EACE,WAAW,EAAG,IAAgB,GAAS,SAAS,EAAU;EAC1D,OAAO;YAFT,CAIE,kBAAC,OAAD;GAAK,WAAW,EAAG,IAAc,GAAS,OAAO,EAAiB;aAAlE,EACI,KAAS,QACT,KAAa,QACb,KAAQ,QACR,MACA,kBAAC,OAAD;IAAK,WAAW,EAAG,8DAAe,GAAS,OAAO;cAAlD,CACE,kBAAC,OAAD;KAAK,WAAW,EAAG,qDAAqB,GAAS,aAAa;eAA9D;MACG,GAAY,GAAO,EAAe;MAClC,GAAgB,GAAW,EAAmB;MAC9C;MACG;QACL,EACG;OAGR,kBAAC,OAAD;IAAK,WAAW,EAAG,IAAa,GAAS,KAAK;IAAG;IAAe,CAAA,CAC5D;MAEL,EACO;;4MEpKD,MAAuB,EAClC,YACA,cACA,SACA,aACA,eAGE,kBAAC,OAAD;CAAK,WAAW,EAAG,IAAa,EAAU;WAA1C,CACE,kBAAC,OAAD;EAAK,WAAW;YAAhB;GACE,kBAAC,MAAD;IAAI,WAAW;cAAe;IAAW,CAAA;GACxC,KAAY,QAAQ,kBAAC,OAAD;IAAK,WAAW;cAAkB;IAAe,CAAA;GACrE,KAAQ,QAAQ,kBAAC,OAAD;IAAK,WAAW;cAAc;IAAW,CAAA;GACtD;KACL,KAAW,QAAQ,kBAAC,OAAD;EAAK,WAAW;YAAiB;EAAc,CAAA,CAC/D;;;;;;;;;;;;;;;;;;mFEKJ,KAA2B,KAC3B,KAAuB,KACvB,KAAuB,IACvB,KAAiB,KACjB,KAAmB,MACnB,KAA+B,uCAE/B,WAAgD;AACpD,KAAI,OAAO,SAAW,IACpB,QAAO;AAGT,KAAI;EACF,IAAM,IAAS,OAAO,aAAa,QAAQ,GAA6B;AACxE,MAAI,KAAU,KACZ,QAAO;EAET,IAAM,IAAS,OAAO,EAAO;AAI7B,SAHI,CAAC,OAAO,SAAS,EAAO,IAAI,KAAU,IACjC,OAEF;SACD;AACN,SAAO;;GAIL,MAAyB,MAAwB;AACjD,cAAO,SAAW,KAItB,KAAI;AACF,SAAO,aAAa,QAAQ,IAA8B,OAAO,EAAM,CAAC;SAClE;GAKJ,MAA4B,MAAmC;CACnE,IAAI,IAAY;AAIhB,QAHI,OAAO,SAAW,QACpB,IAAY,OAAO,aAEd,IAAY;GAqBf,MAAmB,GAAmB,MACtC,OAAO,EAAI,YAAa,YACnB,EAAI,WAGT,EAAI,QAAQ,QAAQ,KAAY,OAC3B,MAAa,EAAI,OAGnB,IAGI,MAAa,EACxB,YACA,eACA,mBACA,aACA,qBACA,YACA,WAAA,GACA,cACwB;CACxB,IAAM,EAAE,SAAM,GAAkB,EAC1B,IAAe,KAAa,MAC5B,IAAU,EAA8B,KAAK,EAC7C,IAA0B,EAAoC,KAAK,EACnE,CAAC,GAAgB,KAAqB,QAC3B,IAA0B,IACxB,GACjB,EACI,IAA4B,EAAO,EAAe,EAClD,CAAC,GAAiB,KAAsB,EAAS,GAAM,EACvD,CAAC,GAAiB,KAAsB,EAAS,GAAM,EACvD,CAAC,GAAqB,KAA0B,EAAS,GAAM,EAE/D,IAAsB,GAAa,MAAiC;EACxE,IAAM,IAAY,EAAQ;AAC1B,MAAI,KAAa,KACf;EAGF,IAAM,EAAE,aAAU,EAAU,uBAAuB,EAC7C,IAAW,KAAK,IACpB,GACA,KAAK,IAAI,GAAyB,EAAM,EAAE,IAAQ,GAAe,CAClE,EAEG,IADa,KAAK,IAAI,IAAsB,EAAS;AAEzD,EAAI,KAAY,MACd,IAAU;EAEZ,IAAM,IAAU,KAAK,IAAI,GAAS,EAAS,EACrC,IAAe,KAAK,IAAI,GAAS,KAAK,IAAI,GAAgB,EAAQ,CAAC;AAEzE,EADA,EAA0B,UAAU,GACpC,EAAkB,EAAa;IAC9B,EAAE,CAAC,EAEA,IAAgB,GACnB,MAA+B;AAK9B,MAJI,OAAO,SAAW,OAIlB,CAAC,KAAgB,EACnB;EAGF,IAAM,IAAY,EAAQ;AAC1B,MAAI,KAAa,KACf;EAGF,IAAM,IAAO,EAAU,uBAAuB,EACxC,IAAe;AACrB,IAAmB,GAAK;EAExB,IAAM,KAAkC,MAAU;GAChD,IAAI,IAAU;AACd,OAAI,aAAa,GAAO;IACtB,IAAM,IAAQ,EAAM,QAAQ;AAC5B,QAAI,KAAS,KACX;AAEF,QAAU,EAAM;SAEhB,KAAU,EAAM;GAIlB,IAAM,IAAY,KADH,IAAe,IAGxB,IAAW,KAAK,IACpB,GACA,KAAK,IACH,GAAyB,EAAK,MAAM,EACpC,EAAK,QAAQ,GACd,CACF,EAEG,IADa,KAAK,IAAI,IAAsB,EAAS;AAEzD,GAAI,KAAY,MACd,IAAU;GAEZ,IAAM,IAAU,KAAK,IAAI,GAAS,EAAS,EAErC,IAAe,KAAK,IAAI,GAAS,KAAK,IAAI,GAAW,EAAQ,CAAC;AAEpE,GADA,EAA0B,UAAU,GACpC,EAAkB,EAAa;KAG3B,UAAmC;AAEvC,GADA,EAAmB,GAAM,EACzB,GAAsB,EAA0B,QAAQ;GACxD,IAAM,IAAW,EAAwB;AAUzC,GATI,GAAU,QAAQ,SACpB,OAAO,oBAAoB,aAAa,EAAS,KAAK,EACtD,OAAO,oBAAoB,aAAa,EAAS,KAAK,GAEpD,GAAU,MAAM,SAClB,OAAO,oBAAoB,WAAW,EAAS,GAAG,EAClD,OAAO,oBAAoB,YAAY,EAAS,GAAG,EACnD,OAAO,oBAAoB,eAAe,EAAS,GAAG,GAExD,EAAwB,UAAU;;AASpC,EANA,EAAwB,UAAU;GAAE,MAAM;GAAa,IAAI;GAAW,EAEtE,OAAO,iBAAiB,aAAa,EAAY,EACjD,OAAO,iBAAiB,aAAa,GAAa,EAAE,SAAS,IAAO,CAAC,EACrE,OAAO,iBAAiB,WAAW,EAAU,EAC7C,OAAO,iBAAiB,YAAY,EAAU,EAC9C,OAAO,iBAAiB,eAAe,EAAU;IAEnD;EAAC;EAAc;EAAiB;EAAe,CAChD;AAsDD,CApDA,QAAgB;AACd,IAA0B,UAAU;IACnC,CAAC,EAAe,CAAC,EAEpB,QAAgB;AACd,MAAI,OAAO,SAAW,IACpB,cAAa;EAEf,IAAM,IAAa,OAAO,WACxB,eAAe,KAAmB,EAAE,KACrC,EACK,UAA0B;AAC9B,KAAmB,EAAW,QAAQ;;AAMxC,SAHA,GAAmB,EACnB,EAAW,iBAAiB,UAAU,EAAkB,QAE3C;AACX,KAAW,oBAAoB,UAAU,EAAkB;;IAE5D,EAAE,CAAC,EAEN,QAAgB;AACd,EAAI,KACF,EAAoB,EAAe;IAEpC;EAAC;EAAc;EAAgB;EAAoB,CAAC,EAEvD,QAAgB;AACd,EAAI,CAAC,KAAmB,KACtB,EAAuB,GAAM;IAE9B,CAAC,GAAqB,EAAgB,CAAC,EAE1C,QAAgB;AACd,MAAI,CAAC,EACH,cAAa;EAGf,IAAM,KAAgB,MAAoC;AACxD,GAAI,EAAM,QAAQ,YAChB,EAAuB,GAAM;;AAKjC,SADA,OAAO,iBAAiB,WAAW,EAAa,QACnC;AACX,UAAO,oBAAoB,WAAW,EAAa;;IAEpD,CAAC,EAAoB,CAAC,EAEzB,cACe;EACX,IAAM,IAAW,EAAwB;AAKzC,EAJI,GAAU,QAAQ,SACpB,OAAO,oBAAoB,aAAa,EAAS,KAAK,EACtD,OAAO,oBAAoB,aAAa,EAAS,KAAK,GAEpD,GAAU,MAAM,SAClB,OAAO,oBAAoB,WAAW,EAAS,GAAG,EAClD,OAAO,oBAAoB,YAAY,EAAS,GAAG,EACnD,OAAO,oBAAoB,eAAe,EAAS,GAAG;IAGzD,EAAE,CAAC;CAEN,IAAI;AACJ,CAAI,OAAO,SAAW,QACpB,IAAc,OAAO,SAAS;CAGhC,IAAM,UAA6C;AACjD,MAAI,KAAkB,KACpB,QAAO,kBAAC,OAAD;GAAK,WAAW;aAAuB;GAAqB,CAAA;AAGrE,MAAI,KAAc,QAAQ,EAAW,WAAW,EAC9C,QAAO;EAGT,IAAM,IAAQ,EAAW,SAAS,GAAM,MAAU;GAChD,IAAM,IAAS,MAAU,EAAW,SAAS,GACvC,IAAM,GAAG,EAAK,QAAQ,QAAQ,GAAG,KACnC;AACJ,OAAI,EAAK,QAAQ,QAAQ,CAAC,EACxB,KACE,kBAAC,GAAD;IAAM,IAAI,EAAK;IAAM,WAAW;cAC7B,EAAK;IACD,CAAA;QAEJ;IACL,IAAI,IAAkB;AAItB,IAHI,MACF,IAAkB,KAEpB,IAAU,kBAAC,QAAD;KAAM,WAAW;eAAkB,EAAK;KAAa,CAAA;;GAGjE,IAAM,IACJ,kBAAC,MAAD;IAAc,WAAW;cACtB;IACE,EAFI,EAEJ;AAOP,UAJI,IACK,CAAC,EAAa,GAGhB,CACL,GACA,kBAAC,MAAD;IAEE,WAAW;IACX,eAAY;cACb;IAEI,EALE,GAAG,EAAI,MAKT,CACN;IACD;AAEF,SACE,kBAAC,OAAD;GAAK,WAAW;GAAsB,cAAW;aAC/C,kBAAC,MAAD;IAAI,WAAW;cAAwB;IAAW,CAAA;GAC9C,CAAA;IAIJ,UAA0C;AAC9C,MACE,KAAW,QACV,EAAQ,QAAQ,SAAS,EAAQ,aAAa,EAAE,EAAE,WAAW,EAE9D,QAAO;EAGT,IAAM,IAAiB,EAAQ,aAAa,EAAE,EAE1C,IAAqC;AAOzC,SANI,EAAQ,QAAQ,SAClB,IACE,kBAAC,OAAD;GAAK,WAAW;aAAyB,EAAQ;GAAW,CAAA,GAK9D,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACG,EAAe,KAAK,GAAM,MAEvB,kBAAC,OAAD;IAAgC,WAAW;cACxC;IACG,EAFI,aAAa,IAEjB,CAER,EACD,EACG;;IAIJ,UACA,KAAQ,QAAQ,EAAK,WAAW,IAC3B,OAIP,kBAAC,OAAD;EAAK,WAAW;YACb,EAAK,KAAK,MAAQ;GACjB,IAAM,IAAW,GAAgB,GAAK,EAAY,EAC9C,IAAiC;AACrC,GAAI,MACF,IAAW;GAEb,IAAI,IAA6B;AACjC,GAAI,EAAI,SACN,IAAU;GAEZ,IAAM,IAAY,GAAiB;IACjC,OAAO;IACP,MAAM;IACP,CAAC,EACI,IAAM,EAAI;AAUhB,UARI,EAAI,QAAQ,OASd,kBAAC,QAAD;IAA2B;IAAW,gBAAc;cACjD,EAAI;IACA,EAFI,EAEJ,GATL,kBAAC,GAAD;IAAgB,IAAI,EAAI;IAAiB;cACtC,EAAI;IACA,EAFI,EAEJ;IASX;EACE,CAAA,EAIJ,IAAuB,GAC1B,MAAyC;AACpC,aAGA,EAAM,QAAQ,eAAe,EAAM,QAAQ,eAAc;AAC3D,KAAM,gBAAgB;GACtB,IAAI,IAAQ;AAKZ,GAJI,EAAM,QAAQ,iBAChB,IAAQ,MAEV,EAAoB,IAAiB,EAAM,EAC3C,GAAsB,EAA0B,QAAQ;;IAG5D;EAAC;EAAqB;EAAiB;EAAe,CACvD,EAEG,IAAoC;AACxC,KAAI,GAAc;EAChB,IAAI;AAQJ,EAPK,MACH,IAAiB;GACf,OAAO,GAAG,EAAe;GACzB,UAAU,GAAG,GAAqB;GAClC,UAAU;GACX,GAEH,IACE,kBAAC,SAAD;GACE,WAAW,EAAG,IAAkB,GAAwB;GACxD,OAAO;aAEN;GACK,CAAA;;CAIZ,IAAI,IAAkC;AACtC,KAAI,GAAc;EAChB,IAAI,IAAgB;AAIpB,EAHI,MACF,IAAgB,SAElB,IACE,kBAAC,OAAD;GACE,WAAW,EACT,IACA,GACD;GACD,MAAK;GACL,oBAAiB;GACjB,cAAW;GACX,UAAU;GACV,eAAa;GACb,cAAc,MAAU;AAEtB,IADA,EAAM,gBAAgB,EACtB,EAAc,EAAM,QAAQ;;GAE9B,eAAe,MAAU;IACvB,IAAM,IAAQ,EAAM,QAAQ;AAC5B,IAAI,KAAS,QACX,EAAc,EAAM,QAAQ;;GAGhC,WAAW;GACX,CAAA;;AAIN,QACE,kBAAC,OAAD;EAAK,WAAW;YAAhB;GACE,kBAAC,OAAD;IACE,WAAW,EAAG,IAA8B,GACzC,KACC,KAAmB,GACtB,CAAC;IACF,eAAY;IACZ,eAAe;AACb,OAAuB,GAAM;;IAE/B,CAAA;GACF,kBAAC,OAAD;IACE,WAAW,EAAG,IAAsB,IAA4B,GAC7D,KACC,KAAmB,GACtB,CAAC;IACF,eAAa,KAAmB,CAAC;IACjC,OAAO,KAAmB,CAAC;cAN7B,CAQE,kBAAC,UAAD;KACE,MAAK;KACL,WAAW;KACX,eAAe;AACb,QAAuB,GAAM;;KAE/B,cAAY,EAAE,uCAAuC;eAEpD,EAAE,6BAA6B;KACzB,CAAA,EACT,kBAAC,OAAD;KAAK,WAAW;eAAsB;KAAc,CAAA,CAChD;;GACN,kBAAC,OAAD;IACE,KAAK;IACL,WAAW,EAAG,IAAa,GACxB,KAA2B,GAC7B,CAAC;cAJJ;KAME,kBAAC,OAAD;MACE,WAAW,EAAG,IAAmB,GAC9B,KAAiC,GACnC,CAAC;gBAHJ,CAKE,kBAAC,OAAD;OAAK,WAAW;iBAAhB,CACE,kBAAC,OAAD;QAAK,WAAW;kBAAhB;SACG,KACC,kBAAC,UAAD;UACE,MAAK;UACL,WAAW;UACX,eAAe;AACb,aAAuB,GAAK;;UAE9B,iBAAe;UACf,cAAY,EAAE,sCAAsC;oBAEnD,EAAE,4BAA4B;UACxB,CAAA;SAEV,GAAkB;SAClB,GAAe;SACZ;WACL,GAAY,CACT;UACN,kBAAC,OAAD;OAAK,WAAW,EAAG,IAAgB,EAAiB;OAAG;OAAe,CAAA,CAClE;;KACL;KACA;KACG;;GACF;;GC7iBG,MAAY,EACvB,YACA,aACA,mBACA,YACA,cAGE,kBAAC,IAAD;CACW;CACO;CACP;CACH;CAEL;CACS,CAAA,uGEDV,KAAyC;CAC7C,QAAQ;CACR,UAAU;CACV,SAAS;CACT,OAAO;CACP,SAAS;CACT,MAAM;CACP,EAEY,MAAe,EAC1B,SACA,aACA,aAAU,IACV,cACA,iBACmC;CACnC,IAAM,IAAY,GAAQ,IAEtB,IAA8B;AAKlC,QAJI,MACF,IAAU,kBAAC,QAAD;EAAM,WAAW;EAAY,eAAY;EAAS,CAAA,GAI5D,kBAAC,GAAD;EAAO,MAAM;EAAsB;EAAoB;YACrD,kBAAC,QAAD;GAAM,WAAW;aAAjB,CACG,GACA,EACI;;EACD,CAAA;2JElCC,MAAgB,EAC3B,cACA,YACA,WACA,eACA,YACA,cACA,eACoC;CACpC,IAAI,IAAgC;AAKpC,QAJI,KAAU,QAAQ,KAAc,SAClC,IAAY,kBAAC,IAAD;EAAa,MAAM;YAAa;EAAqB,CAAA,GAIjE,kBAAC,IAAD;EAAuB;YACrB,kBAAC,OAAD;GAAK,WAAW;aAAhB;IACE,kBAAC,OAAD;KAAK,WAAW;eAAhB,CACE,kBAAC,QAAD;MAAM,WAAW;gBAAe;MAAa,CAAA,EAC5C,EACG;;IACL,KAAa,QACZ,kBAAC,QAAD;KAAM,WAAW;eACf,kBAAC,IAAD,EAAkB,OAAO,GAAa,CAAA;KACjC,CAAA;IAER,KAAW,QAAQ,kBAAC,OAAD;KAAK,WAAW;eAAiB;KAAc,CAAA;IAClE;IACG;;EACK,CAAA;mDE3CJ,MAAgB,EAC3B,aACA,cACA,oBAEI,KAAY,OACP,kBAAA,GAAA,EAAA,UAAG,KAAc,MAAQ,CAAA,GAG3B,kBAAC,OAAD;CAAK,WAAW,EAAG,IAAa,EAAU;CAAG;CAAe,CAAA;;;;;;6DEPxD,MAAiB,EAC5B,aACA,cACA,SAAA,IAAU,QAGR,kBAAC,OAAD;CAAK,WAAW,EAAG,IAAa,GAAe,IAAU,EAAU;CAChE;CACG,CAAA,EASG,MAAuB,EAClC,aACA,mBAEO,kBAAC,OAAD;CAAK,WAAW,EAAG,IAAe,EAAU;CAAG;CAAe,CAAA,iMElB1D,MAAiB,EAC5B,cACA,eAGE,kBAAC,MAAD;CAAI,WAAW,EAAG,IAAa,EAAU;WACtC,EAAM,KAAK,MAER,kBAAC,OAAD;EAAmB,WAAW;YAA9B,CACE,kBAAC,MAAD;GAAI,WAAW;aAAe,EAAK;GAAW,CAAA,EAC9C,kBAAC,MAAD;GAAI,WAAW;aAAe,EAAK;GAAW,CAAA,CAC1C;IAHI,EAAK,GAGT,CAER;CACC,CAAA,4NEhBI,MAAc,EACzB,YACA,cACA,MAAA,GACA,SACA,UACA,eAGE,kBAAC,IAAD;CAAqB;CAAoB;WACvC,kBAAC,OAAD;EAAK,WAAW;YAAhB,CACE,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;IAAG,WAAW;cAAe;IAAU,CAAA,EACvC,kBAAC,KAAD;IAAG,WAAW;cAAe;IAAU,CAAA,CACnC,EAAA,CAAA,EACL,KAAQ,QAAQ,kBAAC,OAAD;IAAK,WAAW;cAAc;IAAW,CAAA,CACtD;MACL,KAAQ,QAAQ,kBAAC,KAAD;GAAG,WAAW;aAAc;GAAS,CAAA,CAClD;;CACK,CAAA,4DExBJ,MAAmB,EAC9B,aACA,mBAEO,kBAAC,OAAD;CAAK,WAAW,EAAG,IAAa,EAAU;CAAG;CAAe,CAAA,sQEDxD,MAAY,EACvB,YACA,cACA,SACA,aACA,eAGE,kBAAC,WAAD;CAAS,WAAW,EAAG,IAAa,EAAU;WAA9C,CACE,kBAAC,OAAD;EAAK,WAAW;YAAhB;GACE,kBAAC,MAAD;IAAI,WAAW;cAAe;IAAW,CAAA;GACxC,KAAY,QAAQ,kBAAC,OAAD;IAAK,WAAW;cAAkB;IAAe,CAAA;GACrE,KAAQ,QAAQ,kBAAC,OAAD;IAAK,WAAW;cAAc;IAAW,CAAA;GACtD;KACL,KAAW,QAAQ,kBAAC,OAAD;EAAK,WAAW;YAAiB;EAAc,CAAA,CAC3D;sUEVD,MAAgB,EAC3B,cACA,eAGE,kBAAC,OAAD;CAAK,WAAW,EAAG,IAAY,EAAU;WACtC,EAAM,KAAK,MAAS;EACnB,IAAM,IAAU,EAAG,IAAa,GAC7B,KAAgB,EAAK,aAAa,IACpC,CAAC;AAUF,SARI,EAAK,QAAQ,OASf,kBAAC,UAAD;GAEE,MAAK;GACL,WAAW;GACX,SAAS,EAAK;aAEb,EAAK;GACC,EANF,EAAK,GAMH,GAdP,kBAAC,KAAD;GAAiB,MAAM,EAAK;GAAM,WAAW;aAC1C,EAAK;GACJ,EAFI,EAAK,GAET;GAcR;CACE,CAAA,gVE7BG,MAAc,EACzB,cACA,eAGE,kBAAC,OAAD;CAAK,WAAW,EAAG,IAAY,EAAU;WACtC,EAAM,KAAK,MAAS;EACnB,IAAM,IAAU,EAAG,IAAa,GAC7B,KAAgB,EAAK,aAAa,IACpC,CAAC;AAUF,SARI,EAAK,QAAQ,OASf,kBAAC,UAAD;GAEE,MAAK;GACL,WAAW;GACX,SAAS,EAAK;aAEb,EAAK;GACC,EANF,EAAK,GAMH,GAdP,kBAAC,GAAD;GAAoB,IAAI,EAAK;GAAM,WAAW;aAC3C,EAAK;GACD,EAFI,EAAK,GAET;GAcX;CACE,CAAA,6UElCG,MAAkB,EAC7B,aACA,cACA,SACA,aACA,UAAA,IAAW,IACX,UACA,kBAGE,kBAAC,UAAD;CACE,MAAK;CACL,WAAW,EAAG,IAAe,GAAW,GACrC,KAAkB,GACpB,CAAC;CACF,SAAS;WALX;EAOE,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACE,kBAAC,QAAD;IAAM,WAAW;cAAe;IAAa,CAAA,EAC5C,EACG;;EACL,KAAQ,QAAQ,kBAAC,OAAD;GAAK,WAAW;aAAc;GAAW,CAAA;EACzD,KAAY,QAAQ,kBAAC,OAAD;GAAK,WAAW;GAAc;GAAe,CAAA;EAC3D;ICpBP,MAAqB,EACzB,YACA,eACA,oBACA,aACA,qBACA,YACA,mBAGE,kBAAC,IAAD;CACW;CACT,YAAY;CACZ,gBAAgB;CACP;CACE;CACO;CAEjB;CACS,CAAA,0NExBH,MAAkB,EAC7B,QACA,aACA,cACA,iBACA,0BAGE,kBAAC,OAAD;CAAK,WAAW,EAAG,IAAkB,EAAU;WAA/C,CACE,kBAAC,SAAD;EAAO,WAAW,EAAG,IAAgB,EAAa;YAAG;EAAY,CAAA,EACjE,kBAAC,WAAD;EAAS,WAAW,EAAG,IAAgB,EAAiB;EACrD;EACO,CAAA,CACN;qUEXG,MAA0B,EACrC,eAGE,kBAAC,MAAD;CAAI,WAAW;WACZ,EAAM,KAAK,MAER,kBAAC,OAAD;EAAmB,WAAW,EAAG,IAAa,GAAmB;YAAjE,CACE,kBAAC,MAAD;GAAI,WAAW,EAAG,IAAc,GAAiB;aAAG,EAAK;GAAW,CAAA,EACpE,kBAAC,MAAD;GAAI,WAAW;aAAe,EAAK;GAAW,CAAA,CAC1C;IAHI,EAAK,GAGT,CAER;CACC,CAAA,2GEGI,MAAsB,EACjC,cACA,MAAA,GACA,WAAQ,EAAE,EACV,WACA,gBACA,eACA,UACA,mBAGE,kBAAC,IAAD;CAAmB;CAAkB;WACnC,kBAAC,OAAD;EAAK,WAAW;YAAhB;GACE,kBAAC,OAAD;IAAK,WAAW;cAAhB,CACE,kBAAC,QAAD,EAAA,UAAO,KAAe,GAAc,CAAA,EACpC,kBAAC,IAAD;KAAa,MAAM;eAAa;KAAqB,CAAA,CACjD;;GACL,KAAa,QAAQ,kBAAC,IAAD,EAAkB,OAAO,GAAa,CAAA;GAC3D,EAAM,SAAS,KAAK,kBAAC,IAAD,EAA+B,UAAS,CAAA;GAC5D,KAAQ,QAAQ,kBAAC,OAAD;IAAK,WAAW;cAAc;IAAW,CAAA;GACtD;;CACK,CAAA,kJEhCJ,MAAoB,EAC/B,cACA,YACA,SAAA,IAAU,EAAE,EACZ,SAAA,GACA,WAAA,QAGE,kBAAC,WAAD;CAAS,WAAW,EAAG,IAAa,EAAU;WAA9C;EACE,kBAAC,QAAD;GAAM,WAAW;aACf,kBAAC,IAAD,EAAkB,OAAO,GAAa,CAAA;GACjC,CAAA;EACN,KAAW,QAAQ,kBAAC,OAAD;GAAK,WAAW;aAAiB;GAAc,CAAA;EAClE,EAAQ,SAAS,KAChB,kBAAC,OAAD;GAAK,WAAW;aACb,EAAQ,KAAK,MAEV,kBAAC,QAAD,EAAA,UAAA;IACG,EAAO;IAAM;IAAG,EAAO;IACnB,EAAA,EAFI,EAAO,GAEX,CAET;GACE,CAAA;EAEP;EACO;qJEhCD,MAAmB,EAC9B,SACA,WACA,cACA,kBACA,yBAGE,kBAAC,OAAD;CAAK,WAAW,EAAG,IAAkB,EAAU;WAA/C,CACE,kBAAC,OAAD;EAAK,WAAW,EAAG,IAAc,EAAc;YAAG;EAAW,CAAA,EAC7D,kBAAC,OAAD;EAAK,WAAW,EAAG,IAAc,EAAgB;YAAG;EAAa,CAAA,CAC7D;+EEdG,MAAc,EACzB,aACA,mBAEO,kBAAC,OAAD;CAAK,WAAW,EAAG,IAAY,EAAU;CAAG;CAAe,CAAA;;;ACXpE,SAAgB,GACd,GACe;CACf,IAAM,IAAU,GAAS,MAAM;AAK/B,QAJI,KAAW,QAAQ,MAAY,KAC1B,OAGF;;AAMT,SAAgB,GACd,GACe;CACf,IAAM,IAAU,GAAQ,MAAM;AAK9B,QAJI,KAAW,QAAQ,MAAY,KAC1B,OAGF;;;;4GEbI,MAAqB,EAChC,YACA,cAAA,QACwB;CACxB,IAAM,IAAmB,GAAsB,EAAQ,EAEnD;AAQJ,QANA,AACE,IADE,KAAoB,OAGf,kBAAC,KAAD;EAAG,WAAW;YAAsB;EAAiB,CAAA,GAFrD,kBAAC,GAAD,EAAkB,SAAS,GAAoB,CAAA,EAKjD,kBAAC,OAAD;EAAK,WAAW;YAAmB;EAAW,CAAA;;;;;;;;;w6BEa1C,MAAgB,EAC3B,gBACA,cACA,gBAAa,IACb,UACA,aACA,YACA,gBACA,UACA,aAAU,gBACc;CACxB,IAAM,EAAE,SAAM,GAAkB,EAC1B,CAAC,GAAQ,KAAa,EAAS,GAAM,EACrC,IAAsB,KAAe,EAAE,4BAA4B,EACnE,CAAC,GAAc,KAAmB,EAAiB,GAAG,EACtD,IAAe,EAA8B,KAAK,EAClD,IAAa,EAAiC,KAAK,EACnD,IAAa,kBAA8C,IAAI,KAAK,CAAC,EACrE,IAAY,GAAO,EAEnB,IAAiB,QAEnB,EAAQ,MAAM,MACL,EAAO,UAAU,EACxB,IAAI,MAEP,CAAC,GAAS,EAAM,CAAC;AA4DpB,CA1DA,QAAgB;AACd,MAAI,CAAC,EACH;EAGF,IAAM,IAAgB,EAAQ,WAAW,MAChC,EAAO,UAAU,EACxB,EACE,IAAY;AAIhB,EAHI,KAAiB,MACnB,IAAY,IAEd,EAAgB,EAAU;IACzB;EAAC;EAAQ;EAAS;EAAM,CAAC,EAE5B,QAAgB;AAId,MAHI,CAAC,KAGD,IAAe,KAAK,KAAgB,EAAQ,OAC9C;EAEF,IAAM,IAAS,EAAQ;AACnB,OAAU,QAGD,EAAW,QAAQ,IAAI,EAAO,GAAG,EACxC,OAAO;IACZ;EAAC;EAAc;EAAQ;EAAQ,CAAC,EAEnC,QAAgB;AACd,MAAI,CAAC,EACH,cAAa;EAGf,IAAM,KAAe,MAAsB;AACrC,KAAa,SAAS,SAAS,EAAM,OAAe,IAGxD,EAAU,GAAM;KAGZ,KAAiB,MAAyB;AAC9C,GAAI,EAAM,QAAQ,aAChB,EAAU,GAAM,EAChB,EAAW,SAAS,OAAO;;AAO/B,SAHA,SAAS,iBAAiB,aAAa,EAAY,EACnD,OAAO,iBAAiB,WAAW,EAAc,QAEpC;AAEX,GADA,SAAS,oBAAoB,aAAa,EAAY,EACtD,OAAO,oBAAoB,WAAW,EAAc;;IAErD,CAAC,EAAO,CAAC,EAEZ,QAAgB;AACd,IAAW,QAAQ,OAAO;IACzB,CAAC,EAAQ,CAAC;CAEb,IAAM,IAAY,QAAkB;AAElC,EADA,EAAU,GAAM,EAChB,4BAA4B;AAC1B,KAAW,SAAS,OAAO;IAC3B;IACD,EAAE,CAAC,EAEA,UAA2B;AAC3B,OAGJ,GAAW,MACF,CAAC,EACR;IAGE,KAAgB,MAA4B;AAEhD,EADA,EAAS,EAAU,EACnB,GAAW;IAGP,KACJ,MACG;AACC,QAIA,EAAM,QAAQ,eAAe,EAAM,QAAQ,eAC7C,EAAM,gBAAgB,EACtB,EAAU,GAAK;IAIb,KAAa,MAA4B;AACzC,IAAQ,WAAW,KAGvB,GAAiB,MAAS;AACxB,OAAI,IAAO,GAAG;IACZ,IAAI,IAAgB,EAAQ,SAAS;AAIrC,WAHI,MAAc,MAChB,IAAgB,IAEX;;AAGT,WADmB,IAAO,IAAY,EAAQ,UAAU,EAAQ;IAEhE;IAGE,KAAqB,MAAgD;AACzE,UAAQ,EAAM,KAAd;GACE,KAAK;AAEH,IADA,EAAM,gBAAgB,EACtB,EAAU,EAAE;AACZ;GACF,KAAK;AAEH,IADA,EAAM,gBAAgB,EACtB,EAAU,GAAG;AACb;GACF,KAAK;AAEH,IADA,EAAM,gBAAgB,EACtB,EAAgB,EAAE;AAClB;GACF,KAAK;AAEH,IADA,EAAM,gBAAgB,EACtB,EAAgB,EAAQ,SAAS,EAAE;AACnC;GACF,KAAK;GACL,KAAK;AAEH,QADA,EAAM,gBAAgB,EAClB,KAAgB,KAAK,IAAe,EAAQ,QAAQ;KACtD,IAAM,IAAS,EAAQ;AACvB,KAAI,KAAU,QACZ,EAAa,EAAO,MAAM;;AAG9B;GAEF,KAAK;AAGH,IAFA,EAAM,gBAAgB,EACtB,EAAU,GAAM,EAChB,EAAW,SAAS,OAAO;AAC3B;GACF,QACE;;IAIA,KAAqB,OACjB,MAAmC;AACzC,IAAW,QAAQ,IAAI,GAAU,EAAK;IAItC;AACJ,CAAI,KAAS,SACX,IAAU,GAAG,EAAU;CAGzB,IAAM,UACA,OAAO,KAAgB,aAClB,EAAY,EAAU,GAExB,KAAe,MAGlB,IAAc,EAAQ,KAAK,GAAQ,MAAU;EACjD,IAAM,IAAa,EAAO,UAAU,GAC9B,IAAkB,EAAG,IAAqB,GAC7C,KAAwB,GAC1B,CAAC,EACE,IAAiB;AACrB,EAAI,MAAiB,MACnB,IAAiB;EAGnB,IAAI,IAAsC;AAO1C,SANI,EAAO,eAAe,QAAQ,EAAO,gBAAgB,OACvD,IACE,kBAAC,QAAD;GAAM,WAAW;aAA2B,EAAO;GAAmB,CAAA,GAKxE,kBAAC,MAAD;GAAoB,MAAK;aACvB,kBAAC,UAAD;IACE,KAAK,EAAkB,EAAO,GAAG;IACjC,MAAK;IACL,MAAK;IACL,iBAAe;IACf,WAAW;IACX,UAAU;IACV,eAAe;AACb,OAAa,EAAO,MAAM;;IAE5B,oBAAoB;AAClB,OAAgB,EAAM;;cAX1B,CAcE,kBAAC,QAAD,EAAA,UAAO,EAAO,OAAa,CAAA,EAC1B,EACM;;GACN,EAlBI,EAAO,GAkBX;GAEP,EAEE;AACJ,CAAI,KAAgB,KAAK,IAAe,EAAQ,WAC9C,IAAiB,EAAQ,IAAe;CAG1C,IAAI,IAAgC;AACpC,CAAI,KAAS,SACX,IACE,kBAAC,QAAD;EAAM,IAAI;EAAS,WAAW;YAC3B;EACI,CAAA;CAIX,IAAI;AACJ,CAAI,MACF,IAAe;CAGjB,IAAI,IAAoC;AACxC,CAAI,KAAe,SACjB,IACE,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,MAAD;EAAI,MAAK;YACP,kBAAC,OAAD;GAAK,WAAW;GAAsB,MAAK;GAAc,CAAA;EACtD,CAAA,EACL,kBAAC,MAAD;EAAI,MAAK;YACP,kBAAC,OAAD;GAAK,WAAW;aAA0B,GAAmB;GAAO,CAAA;EACjE,CAAA,CACJ,EAAA,CAAA;CAIP,IAAI,IAA+B;AACnC,CAAI,MACF,IACE,kBAAC,MAAD;EACE,IAAI;EACJ,WAAW,EAAG,IAAa,GAAgB;EAC3C,MAAK;EACL,yBAAuB;EACvB,UAAU;EACV,WAAW;YANb,CAQG,GACA,EACE;;CAIT,IAAM,IAAmB,EAAG,GAAe,EAAE,YAAS,CAAC,EAAE,GACtD,KAAqB,GACvB,CAAC,EACI,IAAuB,EAAG,IAAoB;GACjD,KAAyB;GACzB,KAA0B,MAAY;EACxC,CAAC;AAEF,QACE,kBAAC,OAAD;EAAK,WAAW,EAAG,IAAkB,EAAU;EAAE,KAAK;YAAtD;GACG;GACD,kBAAC,UAAD;IACE,KAAK;IACL,MAAK;IACL,WAAW;IACX,iBAAc;IACd,iBAAe;IACf,iBAAe;IACf,mBAAiB;IACjB,SAAS;IACT,WAAW;IACX,UAAU;cAVZ,CAYE,kBAAC,QAAD;KAAM,WAAW;eACd,GAAgB,SAAS;KACrB,CAAA,EACP,kBAAC,QAAD;KAAM,WAAW;eACf,kBAAC,IAAD;MAAgB,OAAO;MAAI,QAAQ;MAAI,eAAY;MAAS,CAAA;KACvD,CAAA,CACA;;GACR;GACG;;uTExVG,MAAuB,EAClC,WACA,aACA,mBACwB;CACxB,IAAM,EAAE,SAAM,GAAkB,EAC5B,IAAU,EAAE,+CAA+C;AAO/D,QANI,MAAW,8BACb,IAAU,EAAE,+DAA+D,GAClE,MAAW,sBACpB,IAAU,EAAE,sDAAsD,GAIlE,kBAAC,OAAD;EAAK,WAAW,EAAG,IAAa,EAAU;YAA1C,CACE,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACE,kBAAC,KAAD;IAAG,WAAW;cAAe,EAAE,oCAAoC;IAAK,CAAA,EACxE,kBAAC,KAAD;IAAG,WAAW;cAAiB;IAAY,CAAA,CACvC;MACN,kBAAC,GAAD;GAAQ,MAAK;GAAS,SAAQ;GAAY,MAAK;GAAQ,SAAS;aAC7D,EAAE,6CAA6C;GACzC,CAAA,CACL;;2MEzBG,MACX,MACgB;CAChB,IAAM,EAAE,cAAW,aAAU,YAAS;AAEtC,QACE,kBAAC,OAAD;EAAK,WAAW;YAAhB,CACE,kBAAC,OAAD;GAAK,WAAW;aACd,kBAAC,OAAD;IAAK,WAAW;cACd,kBAAC,IAAD;KAAM,OAAO;KAAiB;KAAa,CAAA;IACvC,CAAA;GACF,CAAA,EACN,kBAAC,OAAD;GAAK,WAAW;aACd,kBAAC,WAAD;IAAS,MAAK;IAAW,WAAW;IACjC;IACO,CAAA;GACN,CAAA,CACF;;ylBECJ,MAAe,MACf,KAAS,OACJ,OAIA,EADL,OAAO,KAAU,YAAY,OAAO,KAAU,WACxC,MAGF,OAHC;CAAG,WAAW;WAAe;CAAU,CAAA,EAM5C,MAAkB,MAClB,KAAS,OACJ,OAIA,EADL,OAAO,KAAU,YAAY,OAAO,KAAU,WACxC,MAGF,OAHC;CAAG,WAAW;WAAkB;CAAU,CAAA,EAMxC,MAAY,MAAsC;CAC7D,IAAM,EACJ,YACA,SACA,aACA,WACA,aAAA,GACA,SACA,aACA,aACE,GAEA,IAAwC;AAC5C,CAAI,KAAW,SACb,IAAoB,kBAAC,OAAD;EAAK,WAAW;YAAiB;EAAc,CAAA;CAGrE,IAAI,IAA+B;AACnC,CAAI,KAAQ,SACV,IAAW,kBAAC,OAAD;EAAK,WAAW;YAAc;EAAW,CAAA;CAGtD,IAAI,IAAiC;AACrC,CAAI,KAAU,SACZ,IAAa,kBAAC,OAAD;EAAK,WAAW;YAAgB;EAAa,CAAA;CAG5D,IAAM,IACJ,kBAAC,WAAD;EACE,WAAW,EAAG,IAAa,GACxB,KAAqB,KAAe,MACtC,CAAC;YAHJ;IAKI,KAAS,QAAQ,KAAY,QAAQ,KAAW,SAChD,kBAAC,OAAD;IAAK,WAAW;cAAhB,CACE,kBAAC,OAAD;KAAK,WAAW;eAAhB,CACG,GAAY,EAAM,EAClB,GAAe,EAAS,CACrB;QACL,EACG;;GAGP;IAEC,KAAQ,QAAQ,KAAY,SAC5B,kBAAC,OAAD;IAAK,WAAW;cAAhB,CACG,GACA,EACG;;GAGP;GACO;;AAoBZ,QAjBI,KAAe,OACV,IAGL,EAAY,QAAQ,OActB,kBAAC,UAAD;EACE,MAAK;EACL,cAAY,EAAY;EACxB,WAAW;EACX,SAAS,EAAY;YAEpB;EACM,CAAA,GAnBP,kBAAC,GAAD;EACE,IAAI,EAAY;EAChB,cAAY,EAAY;EACxB,WAAW;EACX,SAAS,EAAY;YAEpB;EACI,CAAA;2JEzDP,KAAwB,kBAExB,MACJ,GACA,MAEI,OAAO,KAAwB,YAAY,MAAwB,KAC9D,EAAE,wBAAqB,GAEzB,EACL,qBAAqB,UAAU,EAAY,IAAI,GAAsB,IACtE,EAGG,MAAsB,MACtB,KAAgB,OACX,OAEF,GAAgC,EAAE,iBAAc,CAAC,EAGpD,MAAoB,MAA+C;CACvE,IAAI,IAA8B;AAClC,QAAO,KAAW,OAAM;EAEtB,IAAM,EAAE,iBADM,OAAO,iBAAiB,EAAQ;AAE9C,MACE,MAAc,UACd,MAAc,YACd,MAAc,UAEd,QAAO;AAET,MAAU,EAAQ;;AAEpB,QAAO;GAQH,MAAS,GAAe,GAAa,MAClC,KAAK,IAAI,GAAK,KAAK,IAAI,GAAK,EAAM,CAAC,EAG/B,MAAoC,EAC/C,YACA,SACA,aACA,eACA,cACA,wBACA,SACA,YACA,mBACA,mBACA,iBAAc,IACd,mBAAgB,IAChB,oBACuD;CACvD,IAAM,EAAE,SAAM,GAAkB,EAC1B,IAA8B,KAAQ,WACtC,IAAe,EAAuB,KAAK,EAC3C,IAAU,EAAuB,KAAK,EACtC,IAAc,EAAuB,KAAK,EAC1C,IAAkB,EAA2B,KAAK,EAClD,IAAS,EAAsB,KAAK,EACpC,IAAsB,EAAO,GAAM,EAEnC,IAAgB,GAAgB,YAAY,IAC5C,IAAc,QAAc;AAChC,MAAI,CAAC,EACH,QAAO;EAGT,IAAM,IAAsB,EAAe;AAS3C,SAPE,OAAO,KAAwB,YAC/B,OAAO,SAAS,EAAoB,IACpC,IAAsB,IAEf,IAGF;IACN,CAAC,GAAe,EAAe,CAAC,EAE7B,IAAW,QAAc;AAC7B,MAAI,CAAC,EACH,QAAO;EAGT,IAAI,IAAe,IACb,IAAqB,EAAe;AAO1C,SALE,OAAO,KAAuB,YAC9B,OAAO,SAAS,EAAmB,KAEnC,IAAe,IAEV,KAAK,IAAI,GAAG,EAAa;IAC/B,CAAC,GAAe,EAAe,CAAC,EAE7B,IAAc,GAAgB,eAAe,KAC7C,IAAW,GAAgB,YAAY,IACvC,IAAkB,GAAgB,YAAY,IAE9C,IACJ,KAAmB,KAAe,CAAC,KAAiB,KAAc,MAE9D,IAAkB,QAAkB;AACpC,OAGQ;IACX,CAAC,EAAW,CAAC,EAEV,CAAC,GAAa,KAAkB,SAC7B;EAAE,YAAY;EAAG,UAAU,KAAK,IAAI,EAAK,QAAQ,GAAG;EAAE,EAC7D,EAEI,IAAsB,QACnB,GAAoB,EAAQ,QAAQ,EAAoB,EAC9D,CAAC,EAAQ,QAAQ,EAAoB,CAAC,EAEnC,IAAY,GACf,GAAU,GAAe,MAA0C;EAClE,IAAM,IAAQ,EAAS,GAAK,EAAM,EAC5B,IAAa,CACjB,GAAoB,EAAE,MAAM,GAAc,CAAC,EAC3C,GAAS,IACV;AACD,EAAI,IAAQ,KAAM,IAChB,EAAW,KACT,GAAwB,EAAE,MAAM,GAAc,CAAC,EAC/C,GAAS,QACV,GAED,EAAW,KACT,GAAuB,EAAE,MAAM,GAAc,CAAC,EAC9C,GAAS,OACV;EAEH,IAAM,IAA0B,EAAE,GAAG,GAAqB;AAI1D,SAHI,OAAO,KAAa,aACtB,EAAS,SAAS,IAGlB,kBAAC,OAAD;GAEE,MAAK;GACL,WAAW,EAAG,GAAG,EAAW;GAC5B,OAAO;aAEN,EAAQ,KAAK,MAAW;IACvB,IAAM,IAAc;KAClB,GAAqB,EAAE,MAAM,GAAc,CAAC;KAC5C;KACA,GAAS;KACV,EACK,IAAkB,GAAmB,EAAO,aAAa;AAa/D,WAZI,KAAmB,QACrB,EAAY,KAAK,EAAgB,EAE/B,EAAO,aAAa,QACtB,EAAY,KAAK,EAAO,UAAU,EAEhC,EAAO,aACT,EAAY,KACV,IACA,GAAS,YACV,EAGD,kBAAC,OAAD;KAAqB,MAAK;KAAO,WAAW,EAAG,GAAG,EAAY;eAC3D,EAAO,KAAK,EAAI;KACb,EAFI,EAAO,GAEX;KAER;GACE,EA9BC,EA8BD;IAGV;EAAC;EAAS;EAAS;EAAU;EAAqB;EAAa,CAChE,EAEK,IAAuB,QAAkB;AAC7C,MAAI,CAAC,EACH;EAEF,IAAM,IAAS;AACf,MAAI,KAAU,KACZ;EAEF,IAAM,IAAS,EAAQ;AACvB,MAAI,KAAU,KACZ;EAGF,IAAM,IAAe,EAAgB,SAC/B,IAAiB,GAAc,gBAAgB,OAAO,aACtD,IAAgB,GAAc,uBAAuB,CAAC,OAAO,GAE7D,IADc,EAAO,uBAAuB,CAAC,MACjB,GAC5B,IAAa,KAAK,IAAI,GAAG,CAAC,EAAY,EACtC,IAAgB,IAAa,GAE7B,IAAc,EAAK,SAAS,GAC5B,IAAgB,GAAM,GAAe,GAAG,EAAY,EACpD,IAAa,GAAM,GAAY,GAAG,EAAY,EAE9C,IAAW,KAAK,MAAM,IAAa,EAAO,GAAG,GAC7C,IAAS,KAAK,KAAK,IAAgB,EAAO,GAAG,GAE7C,IAAa,GAAM,GAAU,GAAG,EAAK,OAAO,EAC5C,IAAW,GAAM,GAAQ,GAAY,EAAK,OAAO;AASvD,EAPA,GAAgB,MACV,EAAK,eAAe,KAAc,EAAK,aAAa,IAC/C,IAEF;GAAE;GAAY;GAAU,CAC/B,EAGA,KACA,KACA,IAAc,KAAiB,KAC/B,CAAC,EAAoB,YAErB,EAAoB,UAAU,IAC9B,GAAiB,EACjB,OAAO,iBAAiB;AACtB,KAAoB,UAAU;KAC7B,IAAI;IAER;EACD;EACA;EACA;EACA;EACA;EACA,EAAK;EACL;EACA;EACD,CAAC,EAEI,IAAkB,QAAkB;AACpC,EAGJ,EAAO,YAAU,OAAO,4BAA4B;AAElD,GADA,EAAO,UAAU,MACjB,GAAsB;IACtB;IACD,CAAC,EAAqB,CAAC;AAkF1B,CAhFA,QAAsB;AACpB,MAAI,CAAC,EACH;EAEF,IAAM,IAAY,EAAa;AAC3B,OAAa,SAGjB,EAAgB,UAAU,GAAiB,EAAU,EACrD,GAAiB;IAChB,CAAC,GAAe,EAAgB,CAAC,EAEpC,QAAgB;AACd,MAAI,CAAC,EACH;EAGF,IAAM,IADe,EAAgB,WACgB,QAE/C,UAAgB;AACpB,MAAiB;;AAMnB,SAHA,EAAO,iBAAiB,UAAU,GAAS,EAAE,SAAS,IAAM,CAAC,EAC7D,OAAO,iBAAiB,UAAU,EAAQ,QAE7B;AAEX,GADA,EAAO,oBAAoB,UAAU,EAAQ,EAC7C,OAAO,oBAAoB,UAAU,EAAQ;;IAE9C,CAAC,GAAe,EAAgB,CAAC,EAEpC,QAAgB;AAId,MAHI,KAGA,CAAC,KAAmB,CAAC,KAAY,CAAC,EACpC;EAEF,IAAM,IAAW,EAAY;AAC7B,MAAI,KAAY,KACd;EAGF,IAAM,IAAe,EAAgB,SAE/B,IAAW,IAAI,sBAClB,MAAY;GACX,IAAM,CAAC,KAAS;AACZ,QAAS,QAIT,EAAM,kBAAkB,CAAC,EAAoB,YAC/C,EAAoB,UAAU,IAC9B,GAAiB,EACjB,OAAO,iBAAiB;AACtB,MAAoB,UAAU;MAC7B,IAAI;KAGX;GACE,MAAM;GACN,YAAY,WAAW,EAAY;GACpC,CACF;AAGD,SADA,EAAS,QAAQ,EAAS,QACb;AACX,KAAS,YAAY;;IAEtB;EACD;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,EAEF,QAAsB;AACpB,MAAI,EACF;EAEF,IAAM,IAAY,EAAa;AAC3B,OAAa,SAGjB,EAAgB,UAAU,GAAiB,EAAU;IACpD,CAAC,EAAc,CAAC;CAEnB,IAAM,IACJ,kBAAC,OAAD;EACE,WAAW,EACT,GAAuB,EAAE,MAAM,GAAc,CAAC,EAC9C,GAAS,OACV;EACD,MAAK;YAEL,kBAAC,OAAD;GACE,WAAW,EAAG,IAA2B,GAAS,UAAU;GAC5D,MAAK;GACL,OAAO;aAEN,EAAQ,KAAK,MAAW;IACvB,IAAM,IAAgB,CACpB,GAA2B,EAAE,MAAM,GAAc,CAAC,EAClD,GAAS,WACV,EACK,IAAkB,GAAmB,EAAO,aAAa;AAa/D,WAZI,KAAmB,QACrB,EAAc,KAAK,EAAgB,EAEjC,EAAO,aAAa,QACtB,EAAc,KAAK,EAAO,UAAU,EAElC,EAAO,aACT,EAAc,KACZ,IACA,GAAS,kBACV,EAGD,kBAAC,OAAD;KAEE,MAAK;KACL,WAAW,EAAG,GAAG,EAAc;eAE9B,EAAO;KACJ,EALC,EAAO,GAKR;KAER;GACE,CAAA;EACF,CAAA,EAGJ;AACJ,KAAI,EAAK,WAAW,EAClB,KACE,kBAAC,OAAD;EACE,WAAW,EAAG,IAA0B,GAAS,SAAS;EAC1D,MAAK;YAEL,kBAAC,OAAD;GAAK,MAAK;aACP,KACC,kBAAC,OAAD;IAAK,WAAW,EAAG,yCAA2B,GAAS,UAAU;cAC9D,EAAE,qBAAqB;IACpB,CAAA;GAEJ,CAAA;EACF,CAAA;UAEC,KAAiB,KAAe,MAAM;EAC/C,IAAM,EAAE,eAAY,gBAAa,GAC3B,IAAkB,IAAa,GAC/B,KAAsB,EAAK,SAAS,KAAY,GAChD,IAAQ,EAAK,MAAM,GAAY,EAAS;AAC9C,MACE,kBAAC,OAAD;GAAK,WAAW;GAAqB,KAAK;aAA1C;IACE,kBAAC,OAAD;KAAK,WAAW;KAAe,OAAO,EAAE,QAAQ,GAAiB;KAAI,CAAA;IACpE,EAAM,KAAK,GAAK,MAER,EAAU,GADK,IAAa,GACE,EAAY,CACjD;IACF,kBAAC,OAAD;KAAK,WAAW;KAAe,OAAO,EAAE,QAAQ,GAAoB;KAAI,CAAA;IACpE;;OAGR,KACE,kBAAC,OAAD;EAAK,KAAK;YACP,EAAK,KAAK,GAAK,MACP,EAAU,GAAK,GAAO,KAAK,CAClC;EACE,CAAA;CAIV,IAAI,IAAmC;AAKvC,QAJI,CAAC,KAAiB,KAAmB,MACvC,IAAe,kBAAC,OAAD;EAAK,KAAK;EAAa,WAAW;EAAmB,CAAA,GAIpE,kBAAC,OAAD;EACE,KAAK;EACL,WAAW,EACT,GAA0B,EAAE,MAAM,GAAc,CAAC,EACjD,GAAS,WACT,EACD;EACD,MAAK;YAPP,CASG,GACD,kBAAC,OAAD;GACE,WAAW,EACT,GAAqB,EAAE,MAAM,GAAc,CAAC,EAC5C,GAAS,KACV;GACD,MAAK;aALP,CAOG,GACA,EACG;KACF;;0MExfJ,MAAuB,MAA0B;AACrD,KAAI;EACF,IAAM,IAAW,SAAS,cAAc,WAAW;AAOnD,EANA,EAAS,QAAQ,GACjB,EAAS,aAAa,YAAY,OAAO,EACzC,EAAS,MAAM,WAAW,SAC1B,EAAS,MAAM,MAAM,WACrB,EAAS,MAAM,OAAO,WACtB,SAAS,KAAK,YAAY,EAAS,EACnC,EAAS,QAAQ;EACjB,IAAM,IAAK,SAAS,YAAY,OAAO;AAEvC,SADA,SAAS,KAAK,YAAY,EAAS,EAC5B;SACD;AACN,SAAO;;GAIE,MAAgB,EAC3B,OAAA,GACA,cACA,cACA,cAAW,IACX,eAAY,QACZ,iBAAc,eACsB;CACpC,IAAM,CAAC,GAAQ,KAAa,EAAS,GAAM,EACrC,IAAa,EAAsB,KAAK,EAExC,IAAoB,KAAa,GAEjC,IAAmB,QAAc;EACrC,IAAI,IAAiC;AAIrC,SAHK,MACH,IAAkB,KAEb,EAAG,IAAc,GAAiB,EAAU;IAClD,CAAC,GAAW,EAAS,CAAC,EAEnB,IAAa,QAAkB;AACnC,EAAI,EAAW,WAAW,SACxB,OAAO,aAAa,EAAW,QAAQ,EACvC,EAAW,UAAU;IAEtB,EAAE,CAAC;AAEN,eACe;AACX,KAAY;IAEb,CAAC,EAAW,CAAC;CAEhB,IAAM,IAAa,EAAY,YAAY;AACzC,KAAY;EACZ,IAAI,IAAK;AACT,MAAI;AACF,OAAI,OAAO,YAAc,KAAa;IACpC,IAAM,EAAE,iBAAc;AAEtB,IADA,MAAM,EAAU,UAAU,EAAkB,EAC5C,IAAK;;UAED;AACN,OAAK;;AAOP,EAJA,AACE,MAAK,GAAoB,EAAkB,EAGzC,MACF,EAAU,GAAK,EACf,EAAW,UAAU,OAAO,iBAAiB;AAE3C,GADA,EAAU,GAAM,EAChB,EAAW,UAAU;KACpB,KAAK;IAET,CAAC,GAAY,EAAkB,CAAC,EAE7B,UAAwB;AAC5B,KAAY,CAAC,YAAY,GAAG;IAG1B,IAAmC;AASvC,QARI,MACF,IACE,kBAAC,QAAD;EAAM,WAAW;EAAiB,MAAK;EAAS,aAAU;YACvD;EACI,CAAA,GAKT,kBAAC,QAAD;EAAM,WAAW;YAAjB;GACE,kBAAC,QAAD;IAAM,WAAW;IAAkB,OAAO;cACvC;IACI,CAAA;GACP,kBAAC,GAAD;IACE,MAAK;IACL,SAAQ;IACR,MAAK;IACL,SAAS;cAER;IACM,CAAA;GACR;GACI;;iDEjHE,MAAqB,EAChC,OACA,cACA,eAAY,WACZ,iBAAc,UACd,cAAW,SAGT,kBAAC,QAAD;CAAM,WAAW;WACf,kBAAC,IAAD;EACE,OAAO;EACI;EACA;EACE;EACH;EACV,CAAA;CACG,CAAA,2BERL,KAA+D;CACnE,KAAK;CACL,SAAS;CACT,MAAM;CACP,EAEK,KAA+D;CACnE,KAAK;CACL,SAAS;CACT,MAAM;CACP,EAEY,MAAoB,EAC/B,gBACA,cACA,eACwC;CACxC,IAAM,IAAY,GAAa;AAG/B,QACE,kBAAC,GAAD;EAAO,MAAM;EAAsB;YACjC,kBAAC,QAAD;GAAM,WAAW;aAJC,KAAS,GAAgB;GAIU,CAAA;EAC/C,CAAA;0KEnCC,MAAgB,EAC3B,SACA,mBACoC;CACpC,IAAI,IAAkB,EAAE;AAOxB,QANA,AAGE,IAHE,OAAO,KAAS,WACV,EAAK,MAAM,IAAI,GAEf,CAAC,GAAG,EAAK,EAIjB,kBAAC,QAAD;EAAM,WAAW,EAAG,IAAkB,EAAU;EAAE,eAAY;YAC3D,EAAM,KAAK,GAAM,MAEd,kBAAC,OAAD;GAA8B,WAAW;aACtC;GACG,EAFI,GAAG,EAAK,GAAG,IAEf,CAER;EACG,CAAA;;;;;iDEdL,MAAa,MAA2D;AACxE,UAAS,KAMb,QAHI,OAAO,KAAU,WACZ,GAAG,EAAM,MAEX;GAGH,MAA2B,MAC3B,MAAY,SACP,aAEL,MAAY,WACP,YAEF,QAGI,MAAY,EACvB,SAAA,IAAU,QACV,UACA,WACA,cACA,UACA,eACgC;CAChC,IAAM,IAAiB,GAAU,EAAO,IAAI,GAAwB,EAAQ,EACtE,IAAgB,GAAU,EAAM,EAEhC,IAA2B;EAC/B,OAAO;EACP,QAAQ;EACR,GAAG;EACJ;AAID,KAAI,EAFsB,MAAY,WAAW,KAAS,KAAK,GAG7D,QACE,kBAAC,QAAD;EACE,eAAY;EACZ,WAAW,EAAG,IAAa,GAAe,IAAU,EAAU;EAC9D,OAAO;EACP,CAAA;CAIN,IAAM,IAAQ,KAAK,IAAI,GAAG,KAAS,EAAE;AAErC,QACE,kBAAC,QAAD;EAAM,eAAY;EAAO,WAAW;YACjC,MAAM,KAAK,EAAE,QAAQ,GAAO,GAAG,GAAG,MAAU;GAC3C,IAAM,IAAS,MAAU,IAAQ,GAC7B,IAAY,KAAiB;AAIjC,UAHI,MACF,IAAY,QAGZ,kBAAC,QAAD;IAEE,WAAW,EAAG,IAAA,GAA4B,MAAM,EAAU;IAC1D,OAAO;KACL,GAAG;KACH,OAAO;KACP,QAAQ;KACT;IACD,EAPK,QAAQ,IAOb;IAEJ;EACG,CAAA;gEE1EE,MAAW,EACtB,UAAO,IACP,cACA,eAAY,gBAGV,kBAAC,QAAD;CACE,WAAW,EAAG,IAAa,EAAU;CACrC,MAAK;CACL,cAAY;WAEZ,kBAAC,GAAD;EACE,WAAW;EACX,OAAO;EACP,QAAQ;EACR,CAAA;CACG,CAAA;;;;;;;;;;;sHETE,MAAO,EAClB,aACA,UAAO,WACP,cACA,aACA,iBAAc,eACa;CAC3B,IAAM,IAAU,GAAO,EACjB,IAAc,OAAO,KAAa,YAEpC,IAAuC;AAe3C,QAdI,MACF,IACE,kBAAC,UAAD;EACE,MAAK;EACL,WAAW;EACX,SAAS;EACT,cAAY;EACZ,oBAAkB;YAElB,kBAAC,IAAD;GAAe,OAAO;GAAI,QAAQ;GAAI,eAAY;GAAS,CAAA;EACpD,CAAA,GAKX,kBAAC,QAAD;EAAM,WAAW,EAAG,GAAkB,EAAE,SAAM,CAAC,EAAE,EAAU;YAA3D,CACE,kBAAC,QAAD;GAAM,IAAI;GAAU;GAAgB,CAAA,EACnC,EACI;;gUErCE,MAA0B,EACrC,WACA,YACA,UACA,mBAC8C;CAC9C,IAAI,IAAiC;AAcrC,QAbI,KAAU,SACZ,IAAa,kBAAC,OAAD;EAAK,WAAW;YAAgB;EAAa,CAAA,GAGxD,KAAS,OAET,kBAAC,OAAD;EAAK,WAAW,EAAG,IAAkB,EAAU;YAA/C,CACG,GACD,kBAAC,OAAD;GAAK,WAAW;aAAiB;GAAc,CAAA,CAC3C;MAKR,kBAAC,OAAD;EAAK,WAAW,EAAG,IAAkB,EAAU;YAA/C,CACG,GACD,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACE,kBAAC,OAAD;IAAK,WAAW;cAAiB;IAAc,CAAA,EAC/C,kBAAC,SAAD;IAAO,WAAW;cAAmB;IAAc,CAAA,CAC/C;KACF;;4VE1BG,MAAwB,EACnC,UACA,gBACA,YACA,SACA,mBAC4C;CAC5C,IAAI,IAAsC;AAC1C,CAAI,KAAe,SACjB,IAAkB,kBAAC,OAAD;EAAK,WAAW;YAAqB;EAAkB,CAAA;CAG3E,IAAI,IAAkC;AACtC,CAAI,KAAW,SACb,IAAc,kBAAC,OAAD;EAAK,WAAW;YAAiB;EAAc,CAAA;CAG/D,IAAI,IAA+B;AAKnC,QAJI,KAAQ,SACV,IAAW,kBAAC,OAAD;EAAK,WAAW;YAAc;EAAW,CAAA,GAIpD,kBAAC,OAAD;EAAK,WAAW,EAAG,IAAkB,EAAU;YAA/C;GACG;GACD,kBAAC,OAAD;IAAK,WAAW;cAAe;IAAY,CAAA;GAC1C;GACA;GACG;;wxBEVG,MAA0B,EACrC,WACA,UACA,aACA,gBACA,mBACA,YACA,iBACqD;CACrD,IAAM,EAAE,SAAM,EAAe,KAAK,EAC5B,IAAgB,KAAS,EAAE,gCAAgC;AAejE,KAbA,QAAgB;EACd,IAAM,KAAiB,MAAyB;AAC9C,GAAI,EAAM,QAAQ,YAAY,KAC5B,GAAS;;AAKb,SADA,OAAO,iBAAiB,WAAW,EAAc,QACpC;AACX,UAAO,oBAAoB,WAAW,EAAc;;IAErD,CAAC,GAAQ,EAAQ,CAAC,EAEjB,CAAC,EACH,QAAO;CAGT,IAAM,IAAa,EAAS,QAAQ,GAAO,MAClC,IAAQ,EAAQ,MAAM,QAC5B,EAAE,EAED,IAAiC;AACrC,CAAI,KAAkB,SACpB,IACE,kBAAC,GAAD;EACE,OAAO,KAAe;EACtB,WAAW,MAAyC;AAClD,KAAe,EAAM,OAAO,MAAM;;EAEpC,aAAa,EAAE,4CAA4C;EAC3D,MAAK;EACL,WAAA;EACA,CAAA;CAIN,IAAI,IAAgC;AACpC,CAAI,KAAW,SACb,IACE,kBAAC,GAAD;EAAQ,MAAK;EAAS,SAAQ;EAAY,MAAK;EAAQ,SAAS;YAC7D,EAAE,gCAAgC;EAC5B,CAAA;CAIb,IAAI,IAAY,EAAE,oCAAoC;AACtD,CAAI,OAAO,KAAkB,aAC3B,IAAY;CAGd,IAAM,IACJ,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,OAAD;EAAK,WAAW;EAAiB,SAAS;EAAW,CAAA,EACrD,kBAAC,OAAD;EAAK,WAAW;EAAwB,SAAS;YAC/C,kBAAC,SAAD;GACE,WAAW;GACX,MAAK;GACL,cAAW;GACX,cAAY;GACZ,UAAU,MAAU;AAClB,MAAM,iBAAiB;;aAN3B;IASE,kBAAC,OAAD;KAAK,WAAW;eAAhB,CACE,kBAAC,OAAD;MAAK,WAAW;gBAAhB,CACE,kBAAC,OAAD;OAAK,WAAW;iBAAe;OAAoB,CAAA,EACnD,kBAAC,OAAD;OAAK,WAAW;iBACb,EAAE,oCAAoC,EAAE,OAAO,GAAY,CAAC;OACzD,CAAA,CACF;SACN,kBAAC,UAAD;MACE,MAAK;MACL,WAAW;MACX,SAAS;MACT,cAAY,EAAE,yCAAyC;gBAEvD,kBAAC,IAAD;OAAe,OAAO;OAAI,QAAQ;OAAI,eAAY;OAAS,CAAA;MACpD,CAAA,CACL;;IAEN,kBAAC,OAAD;KAAK,WAAW;eAAhB,CACG,GACA,EACG;;IAEN,kBAAC,OAAD;KAAK,WAAW;eACb,EAAS,KAAK,MAAY;MACzB,IAAI,IAAsC;AAS1C,aARI,EAAQ,eAAe,SACzB,IACE,kBAAC,OAAD;OAAK,WAAW;iBACb,EAAQ;OACL,CAAA,GAKR,kBAAC,WAAD;OAA0B,WAAW;iBAArC,CACE,kBAAC,OAAD;QAAK,WAAW;kBAAhB,CACE,kBAAC,OAAD;SAAK,WAAW;mBAAsB,EAAQ;SAAY,CAAA,EACzD,EACG;WACN,kBAAC,OAAD;QAAK,WAAW;kBACb,EAAQ,MAAM,KAAK,MAEhB,kBAAC,OAAD;SAAmB,WAAW;mBAC3B,EAAK;SACF,EAFI,EAAK,GAET,CAER;QACE,CAAA,CACE;SAdI,EAAQ,GAcZ;OAEZ;KACE,CAAA;IACA;;EACJ,CAAA,CACL,EAAA,CAAA;AAOL,QAJI,OAAO,WAAa,MACf,IAGF,EAAa,GAAe,SAAS,KAAK;gTE1JtC,MAAyB,EACpC,UACA,gBACA,aACA,mBAC6C;CAC7C,IAAI,IAAsC;AAK1C,QAJI,KAAe,SACjB,IAAkB,kBAAC,OAAD;EAAK,WAAW;YAAqB;EAAkB,CAAA,GAIzE,kBAAC,OAAD;EAAK,WAAW,EAAG,IAAc,EAAU;YAA3C,CACE,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACE,kBAAC,OAAD;IAAK,WAAW;cAAe;IAAY,CAAA,EAC1C,EACG;MACN,kBAAC,OAAD;GAAK,WAAW;GAAiB;GAAe,CAAA,CAC5C;;oYEfG,MAAwB,EACnC,aACA,eACA,qBACA,mBACA,iBACA,cACA,mBACmD;CACnD,IAAM,IACJ,KAAY,QACZ,KAAc,QACd,KAAoB,QACpB,KAAkB,QAClB,KAAgB,MAEZ,IAAY,KAAa;AAE/B,KAAI,CAAC,KAAW,CAAC,EACf,QAAO;CAGT,IAAI,IAAgC;AACpC,CAAI,MACF,IAAY,kBAAC,OAAD;EAAK,WAAW;YAAkB;EAAgB,CAAA;CAGhE,IAAI,IAA8B;AAelC,QAdI,MACF,IACE,kBAAC,OAAD;EAAK,WAAW;YAAhB,CACE,kBAAC,OAAD;GAAK,WAAW;aAAhB;IACG;IACA;IACA;IACA;IACG;MACN,kBAAC,OAAD;GAAK,WAAW;aAAe;GAAmB,CAAA,CAC9C;MAKR,kBAAC,OAAD;EAAK,WAAW,EAAG,IAAkB,EAAU;YAA/C,CACG,GACA,EACG;;4GElDG,MAAyB,EACpC,UACA,gBACA,aACA,mBAC6C;CAC7C,IAAM,IACH,KAAS,QAAQ,EAAM,MAAM,KAAK,MAClC,KAAe,QAAQ,EAAY,MAAM,KAAK;AAEjD,QACE,kBAAC,WAAD;EAAS,WAAW,EAAG,IAAkB,EAAU;YAAnD,CACG,KACC,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACG,KAAS,QAAQ,EAAM,MAAM,KAAK,MACjC,kBAAC,MAAD;IAAI,WAAW;cAAe;IAAW,CAAA,EAE1C,KAAe,QAAQ,EAAY,MAAM,KAAK,MAC7C,kBAAC,KAAD;IAAG,WAAW;cAAqB;IAAgB,CAAA,CAEjD;MAEP,EACO;;mGEfD,MAAiB,EAC5B,WACA,UACA,aACA,kBAAe,WACf,iBAAc,UACd,iBAAc,WACd,YACA,cACA,oBAAiB,SAC2B;CAC5C,IAAM,CAAC,GAAc,KAAmB,EAAS,GAAM,EACjD,CAAC,GAAO,KAAY,EAAwB,KAAK,EAEjD,IAAc,QAAkB;AAChC,QAGJ,EAAS,KAAK,EACd,GAAS;IACR,CAAC,GAAc,EAAQ,CAAC,EAErB,IAAgB,EAAY,YAAY;AACxC,UAIJ;GADA,EAAS,KAAK,EACd,EAAgB,GAAK;AACrB,OAAI;AAEF,IADA,MAAM,GAAW,EACb,KACF,GAAS;YAEJ,GAAK;IACZ,IAAI,IAAU;AAId,IAHI,aAAe,UACjB,IAAU,EAAI,UAEhB,EAAS,EAAQ;aACT;AACR,MAAgB,GAAM;;;IAEvB;EAAC;EAAgB;EAAc;EAAS;EAAU,CAAC,EAElD,IAAuC;AAC3C,CAAI,MAAgB,aAClB,IAAiB;CAOnB,IAAM,IACJ,kBAAC,OAAD;EAAK,WAAW;YAAhB,CACE,kBAAC,GAAD;GACE,MAAK;GACL,SAAQ;GACR,SAAS;GACT,UAAU;aAET;GACM,CAAA,EACT,kBAAC,GAAD;GACE,MAAK;GACL,SAAS;GACT,eAjB2B;AAC/B,OAAe,CAAC,YAAY,GAAG;;GAiB3B,WAAW;aAEV;GACM,CAAA,CACL;KAGJ,IAAgC;AAKpC,QAJI,KAAS,SACX,IAAY,kBAAC,IAAD,EAAA,UAAe,GAAqB,CAAA,GAIhD,kBAAC,IAAD;EAAe;EAAQ,SAAS;EAAoB;EAAe;YACjE,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACG,GACA,EACG;;EACA,CAAA;kYEvFN,MAAuB,MAA0B;AACrD,KAAI;EACF,IAAM,IAAW,SAAS,cAAc,WAAW;AAOnD,EANA,EAAS,QAAQ,GACjB,EAAS,aAAa,YAAY,OAAO,EACzC,EAAS,MAAM,WAAW,SAC1B,EAAS,MAAM,MAAM,WACrB,EAAS,MAAM,OAAO,WACtB,SAAS,KAAK,YAAY,EAAS,EACnC,EAAS,QAAQ;EACjB,IAAM,IAAK,SAAS,YAAY,OAAO;AAEvC,SADA,SAAS,KAAK,YAAY,EAAS,EAC5B;SACD;AACN,SAAO;;GAIE,MAAwB,EACnC,UACA,WAAQ,YACR,cACA,cACA,cAAW,IACX,mBAAgB,YAChB,iBAAc,UACd,eAAY,QACZ,iBAAc,eAC8B;CAC5C,IAAM,CAAC,GAAa,KAAkB,EAAS,EAAS,EAClD,CAAC,GAAQ,KAAa,EAAS,GAAM,EAErC,IAAW,QAAc;AAC7B,MAAI;AACF,UAAO,KAAK,UAAU,GAAO,MAAM,EAAE;WAC9B,GAAK;GACZ,IAAI,IAAU,OAAO,EAAI;AAIzB,UAHI,aAAe,UACjB,IAAU,EAAI,UAET,KAAK,UAAU;IAAE,OAAO;IAA4B;IAAS,CAAC;;IAEtE,CAAC,EAAM,CAAC,EAEL,IAAa,EAAY,YAAY;EACzC,IAAI,IAAK;AACT,MAAI;AACF,GAAI,OAAO,YAAc,QACvB,MAAM,UAAU,UAAU,UAAU,EAAS,EAC7C,IAAK;UAED;AACN,OAAK;;AAOP,EAJA,AACE,MAAK,GAAoB,EAAS,EAGhC,MACF,EAAU,GAAK,EACf,OAAO,iBAAiB;AACtB,KAAU,GAAM;KACf,KAAK;IAET,CAAC,EAAS,CAAC,EAER,IAAW,QAAc;AACzB,WAAa,KAGjB,QAAO,EAAE,cAAW;IACnB,CAAC,EAAU,CAAC,EAEX,IAAkB;AACtB,CAAI,MACF,IAAkB;CAGpB,IAAI,IAAsB;AAK1B,QAJI,MACF,IAAsB,IAItB,kBAAC,OAAD;EAAK,WAAW,EAAG,IAAkB,EAAU;YAA/C,CACE,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACE,kBAAC,QAAD;IAAM,WAAW;cAAe;IAAa,CAAA,EAC7C,kBAAC,OAAD;IAAK,WAAW;cAAhB,CACE,kBAAC,GAAD;KACE,MAAK;KACL,SAAQ;KACR,MAAK;KACL,eAAe;AACb,SAAY,CAAC,YAAY,GAAG;;eAG7B;KACM,CAAA,EACT,kBAAC,GAAD;KACE,MAAK;KACL,SAAQ;KACR,MAAK;KACL,eAAe;AACb,SAAgB,MACP,CAAC,EACR;;eAGH;KACM,CAAA,CACL;MACF;MACN,kBAAC,OAAD;GACE,WAAW,EAAG,IAAY,GAAG,KAAmB,GAAa,CAAC;GAC9D,OAAO;aAEN;GACG,CAAA,CACF;;GEnIJ,KAAuB,EAAK,YACzB,OAAO,2CACd,EAEI,MAAqB,MAA2B;AACpD,KAAI;AACF,SAAO,KAAK,UAAU,GAAO,MAAM,EAAE;UAC9B,GAAK;EACZ,IAAI,IAAU,OAAO,EAAI;AAIzB,SAHI,aAAe,UACjB,IAAU,EAAI,UAET,KAAK,UAAU;GAAE,OAAO;GAA4B;GAAS,CAAC;;GAInE,MAAkB,EACtB,UACA,mBAGE,kBAAC,OAAD;CAAK,WAAW,KAAa;WAC1B,GAAkB,EAAM;CACrB,CAAA,EAIG,MACX,MAGE,kBAAC,GAAD;CACE,UACE,kBAAC,IAAD;EAAgB,OAAO,EAAM;EAAO,WAAW,EAAM;EAAa,CAAA;WAGpE,kBAAC,IAAD,EAAsB,GAAI,GAAS,CAAA;CAC1B,CAAA,iRE7BF,MAAsB,EACjC,gBACA,cACA,mBAAgB,0BAChB,cAAW,kBACX,kBAAe,iBACf,cAC0C;CAC1C,IAAI,IAAc;AAIlB,CAHI,MACF,IAAc,IAEZ,MACF,IAAc;CAGhB,IAAI,IAAkC;AAKtC,QAJI,MACF,IAAc,kBAAC,IAAD,EAAS,MAAM,IAAM,CAAA,GAInC,kBAAC,OAAD;EAAK,WAAW;YACd,kBAAC,OAAD;GAAK,WAAW;aAAhB;IACG;IACD,kBAAC,QAAD;KAAM,WAAW;eAAc;KAAmB,CAAA;IACjD;IACG;;EACF,CAAA;iHEhBG,MAA2B,EACtC,WAAQ,aACR,eAC+C;CAC/C,IAAM,CAAC,GAAQ,KAAa,EAAS,GAAM,EACrC,IAAe,EAA8B,KAAK;AA+BxD,QA7BA,QAAgB;AACd,MAAI,CAAC,EACH;EAGF,IAAM,KAAe,MAAwB;AACrC,KAAM,kBAAkB,SAG1B,EAAa,SAAS,SAAS,EAAM,OAAO,IAGhD,EAAU,GAAM;;AAIlB,SADA,SAAS,iBAAiB,eAAe,EAAY,QACxC;AACX,YAAS,oBAAoB,eAAe,EAAY;;IAEzD,CAAC,EAAO,CAAC,EAER,EAAM,WAAW,IAEjB,kBAAC,GAAD;EAAQ,MAAK;EAAS,SAAQ;EAAY,MAAK;EAAQ,UAAA;YACpD;EACM,CAAA,GAKX,kBAAC,OAAD;EAAK,WAAW;EAAkB,KAAK;YAAvC,CACE,kBAAC,GAAD;GACE,MAAK;GACL,SAAQ;GACR,MAAK;GACL,eAAe;AACb,OAAW,MACF,CAAC,EACR;;GAEJ,iBAAe;GACf,iBAAc;aAVhB,CAYG,GACD,kBAAC,IAAD;IACE,MAAM;IACN,WAAW,EAAG,IAAoB,GAC/B,KAAyB,GAC3B,CAAC;IACF,CAAA,CACK;MAER,KACC,kBAAC,OAAD;GAAK,WAAW;GAAa,MAAK;aAC/B,EAAM,KAAK,MAAS;IACnB,IAAI,IAA4B;AAIhC,WAHI,OAAO,EAAK,SAAU,aACxB,IAAa,EAAK,QAGlB,kBAAC,GAAD;KAEE,IAAI,EAAK;KACT,WAAW;KACX,UAAU,MAA8C;AAGtD,MAFA,EAAU,GAAM,GACD,EAAK,UAAU,EAAM,GAE3B,YAAY,GAAG;;eAR5B,CAYE,kBAAC,QAAD;MAAM,WAAW;gBAAmB,EAAK;MAAa,CAAA,EACrD,KAAc,QACb,kBAAC,QAAD;MAAM,WAAW;gBAAe;MAAkB,CAAA,CAE/C;OAfA,EAAK,GAeL;KAET;GACE,CAAA,CAEJ;;oXExGG,MAA2B,EACtC,UAAO,GACP,aAAU,QACqC;CAC/C,IAAM,IAAc,MAAM,KAAK,EAAE,QAAQ,GAAS,GAAG,GAAG,MAEpD,kBAAC,OAAD;EAA6B,WAAW;YACtC,kBAAC,IAAD;GAAU,SAAQ;GAAO,OAAM;GAAQ,CAAA;EACnC,EAFI,UAAU,IAEd,CAER,EAEI,IAAW,MAAM,KAAK,EAAE,QAAQ,GAAM,GAAG,GAAG,MAE9C,kBAAC,OAAD;EAA6B,WAAW;YACrC,MAAM,KAAK,EAAE,QAAQ,GAAS,GAAG,GAAG,MAEjC,kBAAC,OAAD;GAA0C,WAAW;aACnD,kBAAC,IAAD;IAAU,SAAQ;IAAO,OAAM;IAAQ,CAAA;GACnC,EAFI,QAAQ,EAAS,GAAG,IAExB,CAER;EACE,EARI,OAAO,IAQX,CAER;AAEF,QACE,kBAAC,OAAD;EAAK,WAAW;EAAkB,eAAY;YAA9C,CACE,kBAAC,OAAD;GAAK,WAAW;aAAgB;GAAkB,CAAA,EAClD,kBAAC,OAAD;GAAK,WAAW;aAAc;GAAe,CAAA,CACzC;;2DExBG,MAA0B,EACrC,eACA,gBACA,aACA,gBACA,YACA,cACA,mBACqD;CACrD,IAAM,IACJ,KAAc,QACd,KAAe,QACf,KAAY,QACZ,KAAe,QACf,KAAW,MAEP,IAAY,KAAa;AAM/B,QAJI,CAAC,KAAW,CAAC,IACR,OAIP,kBAAC,OAAD;EAAK,WAAW,EAAG,IAAkB,EAAU;YAA/C,CACG,KACC,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACE,kBAAC,OAAD;IAAK,WAAW;cAAhB;KACG;KACA;KACA;KACG;OACN,kBAAC,OAAD;IAAK,WAAW;cAAhB,CACG,GACA,EACG;MACF;MAEP,KAAa,kBAAC,OAAD;GAAK,WAAW;aAAkB;GAAgB,CAAA,CAC5D;;6WEnCG,MAAkB,EAC7B,UACA,aACA,aACA,mBAEI,EAAM,WAAW,IACZ,OAIP,kBAAC,OAAD;CAAK,WAAW,EAAG,IAAa,EAAU;CAAE,MAAK;WAC9C,EAAM,KAAK,MAAQ;EAClB,IAAM,IAAW,EAAI,OAAO,GACtB,IAAe,EAAG,IAAY,GAAG,KAAgB,GAAU,CAAC;AAQlE,SAPI,EAAI,MAAM,OAQZ,kBAAC,UAAD;GAEE,MAAK;GACL,MAAK;GACL,iBAAe;GACf,WAAW;GACX,eAAe;AACb,MAAS,EAAI,GAAG;;aAGjB,EAAI;GACE,EAVF,EAAI,GAUF,GAjBP,kBAAC,GAAD;GAAmB,IAAI,EAAI;GAAI,WAAW;aACvC,EAAI;GACA,EAFI,EAAI,GAER;GAiBX;CACE,CAAA,2OEzCG,MAAkB,EAC7B,kBACA,YAAS,MACA,GAAG,EAAM,YAElB,YACA,qBACA,gBAAa,SACb,mBAC6C;AAC7C,KAAI,KAAiB,EACnB,QAAO;CAGT,IAAI,IAAsC;AAc1C,QAbI,KAAoB,SACtB,IACE,kBAAC,GAAD;EACE,MAAK;EACL,SAAQ;EACR,MAAK;EACL,SAAS;YAER;EACM,CAAA,GAKX,kBAAC,OAAD;EAAK,WAAW,EAAG,IAAY,EAAU;EAAE,MAAK;YAAhD,CACE,kBAAC,OAAD;GAAK,WAAW;aAAc,EAAM,EAAc;GAAO,CAAA,EACzD,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACG,GACA,EACG;KACF;;4DE9BG,MAAiB,EAC5B,UACA,eACA,mBAAgB,aAChB,mBAC4C;AAC5C,KAAI,EAAM,WAAW,EACnB,QAAO;CAGT,IAAI,IAAmC;AASvC,QARI,KAAc,SAChB,IACE,kBAAC,GAAD;EAAQ,MAAK;EAAS,MAAK;EAAQ,SAAQ;EAAO,SAAS;YACxD;EACM,CAAA,GAKX,kBAAC,OAAD;EAAK,WAAW,EAAG,IAAY,EAAU;YAAzC,CACG,EAAM,KAAK,MAER,kBAAC,IAAD;GAEE,MAAK;GACL,UAAU,EAAK;GACf,aAAY;aAEX,EAAK;GACF,EANC,EAAK,GAMN,CAER,EACD,EACG;;uJElCG,MAAqB,EAChC,UACA,aACA,iBAAc,WACd,cACA,cACA,aACA,cACA,gBAAa,qBAC4B;CACzC,IAAM,IAAY,EAAM,MAAM,KAAK,IAC7B,IAAoB,KAAa,GAEnC,IAAkC;AACtC,CAAI,MACF,IACE,kBAAC,UAAD;EACE,MAAK;EACL,cAAY;EACZ,eAAe;AACb,KAAS,GAAG;;EAEd,WAAW;YAEX,kBAAC,IAAD;GAAe,OAAO;GAAI,QAAQ;GAAI,eAAY;GAAS,CAAA;EACpD,CAAA;CAIb,IAAI,IAAmC;AACvC,CAAI,KAAY,SACd,IAAe,kBAAC,IAAD,EAAc,MAAM,GAAY,CAAA;CAGjD,IAAM,IACJ,kBAAC,QAAD;EAAM,WAAW;YAAjB;GACG;GACA;GACA;GACI;;AAGT,QACE,kBAAC,GAAD;EACa;EACJ;EACP,WAAW,MAAyC;AAClD,KAAS,EAAM,OAAO,MAAM;;EAEjB;EACb,cAAY;EACZ,MAAK;EACL,WAAA;EACA,UAAU,kBAAC,IAAD;GAAkB,OAAO;GAAI,QAAQ;GAAI,eAAY;GAAS,CAAA;EAC7D;EACX,CAAA;;;;;;;;;;;6SErDO,MAAgB,EAC3B,UAAO,QACP,UACA,aACA,YACA,cACA,kBAAe,WACf,mBACoC;CACpC,IAAM,IAAc,OAAO,KAAc,YAErC,IAAgC;AACpC,CAAI,KAAS,SACX,IAAY,kBAAC,OAAD;EAAK,WAAW;YAAe;EAAY,CAAA;CAGzD,IAAI,IAAsC;AAC1C,CAAI,KAAY,SACd,IAAkB,kBAAC,OAAD;EAAK,WAAW;EAAqB;EAAe,CAAA;CAGxE,IAAI,IAAkC;AActC,QAbI,MACF,IACE,kBAAC,UAAD;EACE,MAAK;EACL,SAAS;EACT,WAAW;EACX,cAAY;YAEZ,kBAAC,IAAD;GAAe,OAAO;GAAI,QAAQ;GAAI,eAAY;GAAS,CAAA;EACpD,CAAA,GAKX,kBAAC,OAAD;EACE,WAAW,EAAG,IAAkB,GAAkB,EAAE,SAAM,CAAC,EAAE,EAAU;EACvE,MAAK;YAFP,CAIE,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACG,GACA,EACG;MAEN,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACG,GACA,EACG;KACF;;6kCEpDJ,KAAa,GAuBN,MAAkB,EAC7B,UACA,SACA,SACA,OAAA,GACA,cAAW,IACX,cAAW,IACX,YACA,gBACA,eACA,WACA,cACA,eAAY,IACZ,cACA,cACA,YAAA,GACA,mBACA,oBACA,eAAY,SAC0B;CACtC,IAAM,IAAU,EAA8B,KAAK,EAC7C,IAAkB,EAA6C,KAAK,EACpE,CAAC,GAAe,KAAoB,EAAS,GAAM,EACnD,CAAC,GAAe,KAAoB,EAAS,GAAM,EAEnD,IAAgD,CAAC,GAAY;AAUnE,CATI,KACF,EAAe,KAAK,GAAqB,EAEvC,KACF,EAAe,KAAK,GAAkB,EAEpC,KACF,EAAe,KAAK,GAAoB,EAEtC,KAAa,QACf,EAAe,KAAK,EAAU;CAEhC,IAAM,IAAgB,EAAG,GAAG,EAAe,EAEvC,IAAwC;AAC5C,CAAI,KAAqB,QAAQ,OAAO,KAAU,aAChD,IAAoB;CAGtB,IAAI,GACA;AACJ,CAAI,MACF,IAAqB,GACrB,IAAiB;CAGnB,IAAI;AACJ,CAAI,MACF,IAAc;CAGhB,IAAI,IAA+B;AACnC,CAAI,KAAQ,SACV,IAAW,kBAAC,QAAD;EAAM,WAAW;YAAc;EAAY,CAAA;CAGxD,IAAI,IAAiC;AACrC,CAAI,MACF,IAAkB;CAEpB,IAAM,IAAiB,EAAG,IAAc,EAAgB,EAEpD,IAAgC;AACpC,KAAI,KAAS,MAAM;EACjB,IAAI,IAAiC;AAIrC,EAHI,MACF,IAAkB,KAEpB,IACE,kBAAC,QAAD;GAAM,WAAW,EAAG,IAAc,EAAgB;aAAG;GAAa,CAAA;;CAItE,IAAM,IACJ,kBAAA,GAAA,EAAA,UAAA;EACG;EACD,kBAAC,QAAD;GAAM,WAAW;aAAiB;GAAa,CAAA;EAC9C;EACA,EAAA,CAAA,EAGC,UAA0B;AAC9B,EAAI,KACO;IAIP,IACJ,CAAC,KAAa,CAAC,MAAa,KAAc,QAAQ,KAAkB,OAEhE,IAAoB,QAAwB;AAChD,EAAI,EAAgB,WAAW,SAC7B,aAAa,EAAgB,QAAQ,EACrC,EAAgB,UAAU;IAE3B,EAAE,CAAC;AAEN,UACO,MACH,EAAiB,GAAM,EACvB,EAAiB,GAAM,EACvB,GAAmB,SAGR;AACX,KAAmB;KAEpB,CAAC,GAAmB,EAAoB,CAAC;CAE5C,IAAM,UAA+B;AAC9B,QAGL,GAAmB,EACnB,EAAgB,UAAU,iBAAiB;AACzC,KAAiB,GAAK;KACrB,IAAI;IAGH,UAA+B;AAEnC,EADA,GAAmB,EACnB,EAAiB,GAAM;IAGnB,UAAiC;AAChC,OAGL,EAAiB,GAAK;IAGlB,KAAqB,MAA4C;AACrE,MAAI,CAAC,GAAqB;AACxB,KAAiB,GAAM;AACvB;;EAEF,IAAM,IAAa,EAAM;AACrB,OAAc,QAAQ,EAAQ,SAAS,SAAS,EAAW,IAG/D,EAAiB,GAAM;IAGrB;AACJ,CAYE,IAZE,IAEA,kBAAC,QAAD;EACE,WAAW;EACX,iBAAc;EACd,cAAY;EACZ,OAAO;YAEN;EACI,CAAA,GAEA,KAAQ,OAef,kBAAC,UAAD;EACE,MAAK;EACL,WAAW;EACX,SAAS;EACT,gBAAc;EACd,cAAY;EACZ,OAAO;YAEN;EACM,CAAA,GAtBT,kBAAC,IAAD;EACE,IAAI;EACJ,WAAW;EACX,gBAAc;EACd,cAAY;EACZ,OAAO;EACP,SAAS;YAER;EACU,CAAA;CAiBjB,IAAM,KACJ,MAAwB,KAAiB,IACvC;AACJ,CAAI,OACF,KAAyB;CAE3B,IAAM,KAAmB,EAAG,IAAgB,GAAuB,EAE/D,KAAqC;AACzC,CAAI,KAAkB,QAAQ,CAAC,MAC7B,KACE,kBAAC,UAAD;EACE,MAAK;EACL,WAAW;EACA;EACE;EACF;EACX,cAAY;EACZ,OAAO;YAEN;EACM,CAAA;CAIb,IAAI,KAAiC;AACrC,CAAI,KAAc,QAAQ,CAAC,MACzB,KAAa,kBAAC,QAAD;EAAM,WAAW;YAAoB;EAAkB,CAAA;CAGtE,IAAI,KAAkC;AAUtC,QATI,MACF,KACE,kBAAC,QAAD;EAAM,WAAW;YAAjB,CACG,IACA,GACI;MAKT,kBAAC,OAAD;EACE,WAAW;EACC;EACJ;EACR,cAAc;EACd,cAAc;EACd,gBAAgB;EAChB,eAAe;EACf,KAAK;YARP,CAUG,GACA,GACG;;2aErPG,MAAqB,EAChC,UACA,OAAA,GACA,iBAAc,IACd,gBACA,sBAAmB,IACnB,sBACA,WAAW,IAAmB,IAC9B,mBACyC;CACzC,IAAM,CAAC,GAAuB,KAC5B,EAAS,EAAiB,EAEtB,IAAY,KAAe,GAE3B,IAAc,GAEd,IAAe,QAAkB;AACrC,MAAI,CAAC,EACH;EAEF,IAAM,IAAO,CAAC;AAId,EAHI,KACF,EAAyB,EAAK,EAEhC,IAAoB,EAAK;IACxB;EAAC;EAAa;EAAW;EAAa;EAAkB,CAAC,EAEtD,IAAY,QAAc;EAC9B,IAAI,IAAS;AAIb,SAHI,MACF,IAAS,mBAEJ;GAAE,WAAW;GAAQ,YAAY;GAAwB;IAC/D,CAAC,EAAU,CAAC,EAEX,IAAiC;AACrC,KAAI,KAAS,MAAM;EACjB,IAAI,IAAyC;AAc7C,EAbI,MACF,IACE,kBAAC,UAAD;GACE,MAAK;GACL,WAAW;GACX,SAAS;GACT,iBAAe,CAAC;aAEhB,kBAAC,IAAD;IAAgB,OAAO;IAAI,QAAQ;IAAI,OAAO;IAAa,CAAA;GACpD,CAAA,GAIb,IACE,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACE,kBAAC,OAAD;IAAK,WAAW;cAAe;IAAY,CAAA,EAC1C,EACG;;;CAIV,IAAI,IAAgC;AAcpC,QAbK,MACH,IACE,kBAAC,OAAD;EAAK,WAAW;YACb,EAAM,KAAK,MAAS;GACnB,IAAM,EAAE,OAAI,SAAM,GAAG,MAAS;AAC9B,UACE,kBAAC,IAAD;IAAyB,GAAI;IAAM,WAAW;IAAoB,EAA7C,EAA6C;IAEpE;EACE,CAAA,GAKR,kBAAC,WAAD;EAAS,WAAW,EAAG,IAAgB,EAAU;YAAjD,CACG,GACA,EACO;;GCjHD,MAA4B,EACvC,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACE;;;;;;;;;wiBERG,MAAgC,EAC3C,WACA,cACA,WACA,cACA,kBAAe,IACf,mBACoD;CACpD,IAAI,IAAiB;AAKrB,QAJI,MACF,IAAiB,KAIjB,kBAAC,OAAD;EAAK,WAAW,EAAG,IAAkB,EAAU;YAA/C,CACE,kBAAC,OAAD;GAAK,WAAW;aAAiB,EAAO;GAAmB,CAAA,EAC3D,kBAAC,IAAD;GACE,UAAU,MAEN,kBAAC,UAAD;IACE,MAAK;IACL,WAAW,GAAe,EAAE,cAAW,CAAC;IACxC,cAAY,EAAO;cAHrB,CAKE,kBAAC,QAAD;KAAM,WAAW;eAAjB,CACE,kBAAC,QAAD;MAAM,WAAW;gBAAgB,EAAO;MAAgB,CAAA,EACvD,CAAC,KACA,kBAAC,QAAD;MAAM,WAAW;gBAAjB,CACE,kBAAC,QAAD;OAAM,WAAW;iBACd,EAAO;OACH,CAAA,EACP,kBAAC,QAAD;OAAM,WAAW;iBAAe,EAAO;OAAa,CAAA,CAC/C;QAEJ;QACN,CAAC,KACA,kBAAC,IAAD;KACE,OAAO;KACP,QAAQ;KACR,WAAW,EAAG,kDAAgB,EAC3B,sBAAqB,GACvB,CAAC;KACF,CAAA,CAEG;;GAGb,WAAW,EAAO;GAClB,WAAU;GACV,kBAAA;GACA,mBAAmB;aAEnB,kBAAC,OAAD;IAAK,WAAW;cACd,kBAAC,UAAD;KACE,MAAK;KACL,MAAK;KACL,WAAW;KACX,SAAS;KACT,UAAU;eALZ,CAOE,kBAAC,QAAD;MAAM,WAAW;gBACf,kBAAC,IAAD;OAA0B,OAAO;OAAI,QAAQ;OAAM,CAAA;MAC9C,CAAA,EACN,EAAO,QACD;;IACL,CAAA;GACG,CAAA,CACP;;+TEjFG,MAAyB,EACpC,gBACA,aACA,OAAA,IAAQ,YACR,aACA,mBAC6C;CAC7C,IAAI,IAAO,IACP,IAAgB;AACpB,CAAI,MACF,IAAO,IACP,IAAgB;CAGlB,IAAI,IAAmC;AAKvC,QAJI,KAAY,SACd,IAAe,kBAAC,IAAD,EAAc,MAAM,GAAY,CAAA,GAI/C,kBAAC,UAAD;EACE,MAAK;EACL,WAAW,EAAG,IAAe,EAAU;EACvC,SAAS;EACT,gBAAc;YAJhB;GAME,kBAAC,QAAD;IAAM,WAAW;IAAa,eAAY;cACxC,kBAAC,GAAD;KAAM,OAAO;KAAI,QAAQ;KAAM,CAAA;IAC1B,CAAA;GACP,kBAAC,QAAD;IAAM,WAAW;cAAe;IAAqB,CAAA;GACpD;GACM;;sXEjCA,MAAgB,EAC3B,WACA,YACA,gBACA,iBACA,eACA,gBACA,mBAC2C;CAC3C,IAAM,IACJ,KAAU,QACV,KAAW,QACX,KAAe,QACf,KAAgB,MACZ,IAAa,KAAc,QAAQ,KAAe;AAExD,KAAI,CAAC,KAAW,CAAC,EACf,QAAO;CAGT,IAAI,IAA8B;AAClC,CAAI,MACF,IACE,kBAAC,OAAD;EAAK,WAAW;YAAhB,CACE,kBAAC,OAAD;GAAK,WAAW;aAAhB;IACG;IACA;IACA;IACG;MACN,kBAAC,OAAD;GAAK,WAAW;aAAe;GAAmB,CAAA,CAC9C;;CAIV,IAAI,IAAiC;AAUrC,QATI,MACF,IACE,kBAAC,OAAD;EAAK,WAAW;YAAhB,CACE,kBAAC,OAAD;GAAK,WAAW;aAAc;GAAiB,CAAA,EAC/C,kBAAC,OAAD;GAAK,WAAW;aAAe;GAAkB,CAAA,CAC7C;MAKR,kBAAC,OAAD;EAAK,WAAW,EAAG,IAAkB,EAAU;YAA/C,CACG,GACA,EACG;;oeE3CG,MAAqB,EAChC,WACA,cACA,qBAEI,EAAO,WAAW,IACb,OAIP,kBAAC,MAAD;CAAI,WAAW,EAAG,IAAa,EAAU;WACtC,EAAO,KAAK,GAAO,MAAU;EAC5B,IAAM,IAAS,MAAU,EAAO,SAAS,GACnC,IAAS,IAAc,EAAM;AACnC,MAAI,KAAU,KACZ,QAAO,kBAAC,MAAD,EAAA,UAAoB,GAAY,EAAvB,EAAM,GAAiB;EAGzC,IAAI,IAA+B;AACnC,EAAK,MACH,IAAW,kBAAC,OAAD,EAAK,WAAW,IAAe,CAAA;EAG5C,IAAI,IAA+B;AACnC,EAAI,EAAM,QAAQ,SAChB,IAAW,kBAAC,OAAD;GAAK,WAAW;aAAc,EAAM;GAAW,CAAA;EAG5D,IAAI,IAAsC;AAC1C,EAAI,EAAM,eAAe,SACvB,IACE,kBAAC,OAAD;GAAK,WAAW;aAAqB,EAAM;GAAkB,CAAA;EAIjE,IAAI,IAA+B;AAKnC,SAJI,EAAM,QAAQ,SAChB,IAAW,kBAAC,OAAD;GAAK,WAAW;aAAc,EAAM;GAAW,CAAA,GAI1D,kBAAC,MAAD;GAAmB,WAAW;aAA9B,CACE,kBAAC,OAAD;IAAK,WAAW;IAAe,eAAY;cAA3C,CACE,kBAAC,OAAD,EAAK,WAAW,IAAc,CAAA,EAC7B,EACG;OACN,kBAAC,OAAD;IAAK,WAAW;cAAhB;KACE,kBAAC,OAAD;MAAK,WAAW;gBAAhB,CACE,kBAAC,OAAD;OAAK,WAAW;iBAAe,EAAM;OAAY,CAAA,EAChD,EACG;;KACL;KACA;KACG;MACH;KAbI,EAAM,GAaV;GAEP;CACC,CAAA,0EEpCH,MAA8B,MAGI;CACtC,IAAM,EAAE,SAAM,iBAAc,GAEtB,IAA6B,EAAE;AACrC,MAAK,IAAM,KAAW,EACpB,CAAI,EAAQ,cACV,EAAiB,KAAK,EAAQ,GAAG;CAIrC,IAAM,IAAgB,EAAiB,QAAQ,MACtC,EAAU,eAAe,IAAI,EAAG,CACvC,CAAC,QAEG,IACJ,EAAiB,SAAS,KAAK,MAAkB,EAAiB,QAE9D,UAAwB;AACxB,QAAiB,WAAW,GAGhC;OAAI,GAAe;AACjB,MAAU,kCAAkB,IAAI,KAAK,CAAC;AACtC;;AAEF,KAAU,kBAAkB,IAAI,IAAI,EAAiB,CAAC;;;AAGxD,QAAO;EACL,IAAI;EACJ,QACE,kBAAC,OAAD;GAAK,WAAW;aACd,kBAAC,IAAD;IACE,SAAS;IACT,gBAAgB;AACd,QAAW;;IAEb,cAAW;IACX,CAAA;GACE,CAAA;EAER,OAAO,MAAY;GACjB,IAAM,EAAE,IAAI,GAAO,kBAAe;AAGlC,UACE,kBAAC,OAAD;IAAK,WAAW;cACd,kBAAC,IAAD;KACW,SALC,EAAU,eAAe,IAAI,EAAM;KAM7C,UAAU,CAAC;KACX,gBAAgB;MACd,IAAM,IAAO,IAAI,IAAI,EAAU,eAAe;AAM9C,MALI,EAAK,IAAI,EAAM,GACjB,EAAK,OAAO,EAAM,GACT,KACT,EAAK,IAAI,EAAM,EAEjB,EAAU,kBAAkB,EAAK;;KAEnC,cAAW;KACX,CAAA;IACE,CAAA;;EAGV,WAAW;EACZ;GAGU,MAA6B,EACxC,YACA,SACA,aACA,YACA,cACA,gBACA,eACA,mBACgD;CAChD,IAAM,IAAc,QACX,EAAK,KAAK,GAAK,OAGb;EAAE;EAAK;EAAO,IAFV,EAAS,GAAK,EAAM;EAEN,YADN,GAAW,kBAAkB,GAAK,EAAM,IAAI;EAC1B,EACrC,EACD;EAAC;EAAU;EAAM;EAAU,CAAC,EAEzB,IAAkB,QAClB,KAAa,OACR,OAEF,GAAqB;EAAE,MAAM;EAAa;EAAW,CAAC,EAC5D,CAAC,GAAW,EAAY,CAAC,EAEtB,IAAkB,QAAc;EACpC,IAAM,IAAS,EAAQ,KAAuC,OACrD;GACL,GAAG;GACH,OAAO,MACE,EAAO,KAAK,EAAQ,IAAI;GAElC,EACD;AAIF,SAHI,KAAmB,OACd,IAEF,CAAC,GAAiB,GAAG,EAAO;IAClC,CAAC,GAAS,EAAgB,CAAC,EAExB,IAAqB,QAAc;AAOvC,MANmB,EAAgB,MAAM,MAChC,EAAO,cAAc,GAC5B,IAIE,EAAgB,WAAW,EAC7B,QAAO;EAET,IAAI,IAAe;AAInB,SAHI,KAAmB,QAAQ,EAAgB,SAAS,MACtD,IAAe,IAEV,EAAgB,KAAK,GAAQ,MAC9B,MAAU,IACL;GAAE,GAAG;GAAQ,WAAW;GAAM,GAEhC,EACP;IACD,CAAC,GAAiB,EAAgB,CAAC,EAEhC,IAAsB,QAAc;AACpC,WAAmB,KAIvB,QAAO,kBADW,KAAK,IAAI,GAAG,EAAgB,SAAS,EAAE,CACtB;IAClC,CAAC,EAAgB,QAAQ,EAAgB,CAAC,EAEzC,IAAgB;AACpB,CAAI,KAAa,SACf,IAAgB,EAAU,eAAe;CAG3C,IAAM,IAAuB,QAAkB;AAC7C,EAAI,GACQ,kCAAkB,IAAI,KAAK,CAAC;IAEvC,CAAC,EAAU,CAAC,EAEX,IAAkC;AACtC,CAAI,KAAW,SACb,IAAc,kBAAC,IAAD,EAAc,GAAI,GAAW,CAAA;CAG7C,IAAI,IAAsC;AAW1C,QAVI,KAAa,SACf,IACE,kBAAC,IAAD;EACiB;EACf,SAAS;EACT,kBAAkB;EAClB,CAAA,GAKJ,kBAAC,OAAD;EAAK,WAAW,EAAG,IAAgB,EAAU;YAA7C;GACG;GACA;GAED,kBAAC,IAAD;IACE,SAAS;IACT,MAAM;IACN,WAAW,MACF,EAAQ;IAEL;IACZ,WAAW,KAAA;IACX,iBAAiB,KAAA;IACjB,eAAe,KAAA;IACf,cAAc,KAAA;IACd,uBAAuB,KAAA;IACF;IACrB,CAAA;GACE;;GC7LJ,MACJ,MACqC;AACjC,UAAU,KAGd,QAAO;EACL,SAAS,EAAO;EAChB,aAAa,EAAO;EACpB,UAAU,EAAO;EAClB;GAGG,MACJ,MACqC;AACjC,UAAU,KAGd,QAAO;EACL,SAAS,EAAO;EAChB,aAAa,EAAO;EACpB,UAAU,EAAO;EAClB;GAGU,MAA8C,EACzD,YACA,SACA,aACA,eACA,cACA,wBACA,mBACA,mBACA,gBACA,kBACA,oBAGE,kBAAC,IAAD;CACW;CACH;CACI;CACE;CACD;CACU;CACrB,MAAM,KAAA;CACN,SAAS,KAAA;CACT,gBAAgB,GAAkB,EAAe;CACjD,gBAAgB,GAAkB,EAAe;CACpC;CACE;CACH;CACZ,CAAA,isBEvEO,MAAgB,EAC3B,OAAA,GACA,UAAA,GACA,WACA,WACA,YACA,WAAQ,EAAE,EACV,UAAA,GACA,mBACoC;CACpC,IAAI,IAAmC;AACvC,CAAI,KAAY,SACd,IAAe,kBAAC,OAAD;EAAK,WAAW;YAAkB;EAAe,CAAA;CAGlE,IAAI,IAAiC;AACrC,EAAI,KAAU,QAAQ,KAAU,UAC9B,IACE,kBAAC,OAAD;EAAK,WAAW;YAAhB,CACG,GACA,EACG;;CAIV,IAAI,IAAgC;AACpC,CAAI,EAAM,SAAS,MACjB,IACE,kBAAC,OAAD;EAAK,WAAW;YACb,EAAM,KAAK,MAER,kBAAC,OAAD;GAAmB,WAAW;aAA9B,CACE,kBAAC,OAAD;IAAK,WAAW;cAAmB,EAAK;IAAY,CAAA,EACpD,kBAAC,OAAD;IAAK,WAAW;cAAmB,EAAK;IAAY,CAAA,CAChD;KAHI,EAAK,GAGT,CAER;EACE,CAAA;CAIV,IAAI,IAAmC;AAKvC,QAJI,KAAY,SACd,IAAe,kBAAC,OAAD;EAAK,WAAW;YAAkB;EAAe,CAAA,GAIhE,kBAAC,OAAD;EAAK,WAAW,EAAG,IAAkB,EAAU;YAA/C;GACE,kBAAC,OAAD;IAAK,WAAW;cAAhB,CACE,kBAAC,OAAD;KAAK,WAAW;eAAhB,CACE,kBAAC,OAAD;MAAK,WAAW;gBAAhB,CACE,kBAAC,OAAD;OAAK,WAAW;iBAAe;OAAY,CAAA,EAC1C,EACG;SACL,EACG;QACL,EACG;;GAEL;GACA;GACG;;ioBElDG,MACX,MACgB;CAChB,IAAM,EACJ,aACA,iBACA,cACA,aACA,cACA,sBAAmB,QACnB,uBACA,qBACE,GAEE,IAAe,KAAa,MAC9B,IAAyC;AAC7C,CAAI,MACF,IAAoB;CAEtB,IAAI,IAAwB,KAAiB;AAC7C,CAAK,MACH,IAAwB;CAE1B,IAAM,IAAgB,MAA0B,SAC5C,IAAe;AACnB,CAAI,MACF,IAAe,EAAG,IAAiB,GAAoB;CAGzD,IAAI;AACJ,CAGE,IAHE,gBAAgB,IACD,EAAM,aAEN,kBAAC,IAAD,EAAc,GAAI,EAAM,QAAU,CAAA;CAGrD,IAAM,IAAoB,GAAoB,MAAM,EAChD;AACJ,CAAI,KAAqB,QAAQ,MAAsB,OACrD,IAAiB,GACd,KAAyB,GAC3B;CAGH,IAAI,IAAqB;AACzB,CAAI,MAAqB,YACvB,IAAqB;CAEvB,IAAM,IAA6B,EACjC,IACA,EACD;AAED,QACE,kBAAC,OAAD;EAAK,WAAW,EAAG,IAAkB,EAAU;EAAE,OAAO;YAAxD;GACE,kBAAC,OAAD;IAAK,WAAW;cACd,kBAAC,OAAD;KAAK,WAAW;eAAoB;KAAqB,CAAA;IACrD,CAAA;GACL,KAAY,QACX,kBAAC,OAAD;IAAK,WAAW;cACd,kBAAC,OAAD;KAAK,WAAW;eAAiB;KAAe,CAAA;IAC5C,CAAA;GAER,kBAAC,OAAD;IAAK,WAAW;cAAhB,CACE,kBAAC,OAAD;KAAK,WAAW;eAAhB,CACG,GACA,EACG;QACL,KACC,kBAAC,SAAD;KAAO,WAAW;eAA6B;KAAkB,CAAA,CAE/D;;GACF;;qXEpDG,MACX,MACgB;CAChB,IAAM,EAAE,cAAW,gBAAa,uBAAoB,GAEhD,IAAmB;AACvB,CAAI,KAAe,SACjB,IAAmB;CAGrB,IAAM,IAAmB,EAAG,IAAkB,GAAkB,EAAU,EAEtE;AACJ,CAGE,IAHE,gBAAgB,IACD,EAAM,aAEN,kBAAC,IAAD,EAAc,GAAI,EAAM,QAAU,CAAA;CAGrD,IAAI;AACJ,CAGE,IAHE,eAAe,IACD,EAAM,YAEN,kBAAC,IAAD,EAAqB,GAAI,EAAM,OAAS,CAAA;CAG1D,IAAI,IAAkC;AAKtC,QAJI,KAAmB,SACrB,IAAgB,kBAAC,OAAD;EAAK,WAAW;YAAqB;EAAsB,CAAA,GAI3E,kBAAC,OAAD;EAAK,WAAW;YAAhB;GACE,kBAAC,OAAD;IAAK,WAAW;cAAoB;IAAqB,CAAA;GACxD,KAAe,QACd,kBAAC,OAAD;IAAK,WAAW;cAAqB;IAAkB,CAAA;GAEzD,kBAAC,OAAD;IAAK,WAAW;cAAhB,CACE,kBAAC,OAAD;KAAK,WAAW;eAAqB;KAAoB,CAAA,EACxD,EACG;;GACF;;;;;;;;;;ySE3DG,MAAgB,EAC3B,QAAA,GACA,QAAA,GACA,QAAA,GACA,UAAA,GACA,gBACA,sBAAmB,IACnB,sBACA,wBACA,qBACA,mBACoC;CACpC,IAAM,CAAC,GAAuB,KAC5B,EAAS,EAAiB,EAEtB,IAAY,KAAe,GAE3B,IAAwB,QAAkB;EAC9C,IAAM,IAAO,CAAC;AAId,EAHI,KACF,EAAyB,EAAK,EAEhC,IAAoB,EAAK;IACxB;EAAC;EAAW;EAAa;EAAkB,CAAC,EAE3C,IAEA;AACJ,CAAI,MACF,IAAW;CAGb,IAAI,IAAiC;AAKrC,QAJI,KAAU,SACZ,IAAa,kBAAC,OAAD;EAAK,WAAW;YAAgB;EAAa,CAAA,GAI1D,kBAAC,SAAD;EACE,WAAW,EACT,IACA,GAAmB,EAAE,OAAO,GAAU,CAAC,EACvC,EACD;YAED,kBAAC,OAAD;GAAK,WAAW;aAAhB;IACE,kBAAC,OAAD;KAAK,WAAW;eAAhB,CACG,GACD,kBAAC,IAAD;MACE,aAAa;MACb,UAAU;MACV,OAAO;MACP,UAAU;MACV,CAAA,CACE;;IAEL,KAAU,QAAQ,kBAAC,OAAD;KAAK,WAAW;eAAgB;KAAa,CAAA;IAChE,kBAAC,OAAD;KAAK,WAAW;KAAiB,cAAW;eACzC,EAAS,KAAK,MAEX,kBAAC,IAAD;MAEE,OAAO,EAAQ;MACf,OAAO,EAAQ;MACf,aAAa,EAAQ;MACrB,kBAAkB,EAAQ;MAC1B,aAAa,EAAQ;MACrB,mBAAmB,EAAQ;MAChB;MACX,EARK,EAAQ,GAQb,CAEJ;KACE,CAAA;IAEL;IACG;;EACA,CAAA;gREnGC,MAAe,EAC1B,eACA,aACA,cACA,mBAGE,kBAAC,OAAD;CAAK,WAAW,EAAG,IAAkB,EAAU;WAC7C,kBAAC,OAAD;EAAK,WAAW;YAAhB,CACE,kBAAC,OAAD;GAAK,WAAW;aAAhB,CACG,GACA,EACG;MACN,kBAAC,OAAD;GAAK,WAAW;aAAe;GAAgB,CAAA,CAC3C;;CACF,CAAA,ECNG,MAAoB,EAC/B,aACA,YACA,WACA,YACA,cACwC;CACxC,IAAM,IAAc,kBAAC,IAAD,EAAc,GAAI,GAAW,CAAA,EAC7C,IAAiC;AAKrC,QAJI,KAAU,SACZ,IAAa,kBAAC,IAAD,EAAa,GAAI,GAAU,CAAA,GAIxC,kBAAC,IAAD;EACE,SAAS;EACT,gBAAgB;EACP;EACH;EAEL;EACQ,CAAA;mBE/BF,MAAsB,EACjC,kBAEO,kBAAC,OAAD;CAAK,WAAW;CAAkB;CAAe,CAAA,ECd7C,KAAqB;AAKlC,SAAgB,GAAqB,GAA0C;AAU7E,QATI,KAAS,QAIG,EAAM,MAAM,CAChB,WAAW,IACrB,MAGK;;AAMT,SAAgB,GAAqB,GAA0C;AAS7E,QARI,KAAS,OACX,MAGE,OAAO,SAAS,EAAM,GACjB,EAAM,gBAAgB,GAGxB,OAAO,EAAM;;AAMtB,SAAgB,GAAiB,GAAmC;AAKlE,QAJI,EAAO,WAAW,IACpB,MAGK,EAAO,KAAK,KAAK;;AAM1B,SAAgB,GACd,GACA,IAAW,OACX,GACQ;AACR,KAAI,KAAS,KACX,QAAA;CAGF,IAAM,IAAU,OAAO,EAAM;AAC7B,KAAI,CAAC,OAAO,SAAS,EAAQ,CAC3B,QAAA;AAGF,KAAI;AACF,SAAO,IAAI,KAAK,aAAa,GAAQ;GACnC,OAAO;GACP;GACA,iBAAiB;GACjB,uBAAuB;GACvB,uBAAuB;GACxB,CAAC,CAAC,OAAO,EAAQ;SACZ;AACN,SAAO,EAAQ,UAAU;;;;;qBEhEhB,MAAe,EAAE,kBACrB,kBAAA,GAAA,EAAG,aAAY,CAAA,ECHX,MAAU,EACrB,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN,CAQE,kBAAC,UAAD;EACE,IAAG;EACH,IAAG;EACH,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,EACF,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,CACE;IC9BG,MAAoB,EAC/B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,QAAD;GACE,GAAE;GACF,GAAE;GACF,OAAM;GACN,QAAO;GACP,IAAG;GACH,QAAO;GACP,aAAY;GACZ,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,CAAA;EACE;IC/CG,MAAqB,EAChC,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,QAAD;GACE,GAAE;GACF,GAAE;GACF,OAAM;GACN,QAAO;GACP,IAAG;GACH,QAAO;GACP,aAAY;GACZ,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,CAAA;EACE;ICzCG,MAAoB,EAC/B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,QAAD;GACE,GAAE;GACF,GAAE;GACF,OAAM;GACN,QAAO;GACP,IAAG;GACH,QAAO;GACP,aAAY;GACZ,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,CAAA;EACE;ICnCG,MAAgB,EAC3B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN,CAQE,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,EACF,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,CACE;IC5BG,MAAY,EACvB,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN,CAQE,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,EACF,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,CACE;IC5BG,MAAY,EACvB,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WAEJ,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA;CACE,CAAA,ECrBG,MAAc,EACzB,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,WAAD;GACE,IAAG;GACH,IAAG;GACH,IAAG;GACH,IAAG;GACH,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACE;IC7CG,MAAY,EACvB,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN,CAQE,kBAAC,UAAD;EACE,IAAG;EACH,IAAG;EACH,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,EACF,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,CACE;IC9BG,MAAoB,EAC/B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,WAAD;GACE,IAAG;GACH,IAAG;GACH,IAAG;GACH,IAAG;GACH,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACE;IC7CG,MAAgB,EAC3B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,WAAD;GACE,IAAG;GACH,IAAG;GACH,IAAG;GACH,IAAG;GACH,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACE;IC7CG,MAAc,EACzB,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WAEJ,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAa;EACb,eAAc;EACd,gBAAe;EACf,CAAA;CACE,CAAA,ECrBG,MAAU,EACrB,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN,CAQE,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,EACF,kBAAC,UAAD;EAAQ,IAAG;EAAK,IAAG;EAAK,GAAE;EAAI,QAAO;EAAe,aAAY;EAAQ,CAAA,CACpE;ICtBG,MAAe,EAC1B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,UAAD;GAAQ,IAAG;GAAI,IAAG;GAAI,GAAE;GAAM,MAAK;GAAiB,CAAA;EACpD,kBAAC,UAAD;GAAQ,IAAG;GAAK,IAAG;GAAI,GAAE;GAAM,MAAK;GAAiB,CAAA;EACrD,kBAAC,UAAD;GAAQ,IAAG;GAAI,IAAG;GAAK,GAAE;GAAM,MAAK;GAAiB,CAAA;EACrD,kBAAC,UAAD;GAAQ,IAAG;GAAK,IAAG;GAAK,GAAE;GAAM,MAAK;GAAiB,CAAA;EACtD,kBAAC,UAAD;GAAQ,IAAG;GAAI,IAAG;GAAK,GAAE;GAAM,MAAK;GAAiB,CAAA;EACrD,kBAAC,UAAD;GAAQ,IAAG;GAAK,IAAG;GAAK,GAAE;GAAM,MAAK;GAAiB,CAAA;EAClD;ICpBG,MAA6B,EACxC,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACE;IC1CG,MAA0B,EACrC,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN,CAQE,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,EACF,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,CACE;IC5BG,MAAyB,EACpC,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN,CAQE,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,EACF,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,CACE;IC5BG,MAAqB,EAChC,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN,CAQE,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,EACF,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,CACE;IC5BG,MAAa,EACxB,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,UAAD;GACE,IAAG;GACH,IAAG;GACH,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACE;ICrCG,MAAU,EACrB,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,UAAD;GACE,IAAG;GACH,IAAG;GACH,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACE;ICrCG,MAAgB,EAC3B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACE;ICnCG,MAAY,EACvB,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACE;ICnCG,MAAe,EAC1B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN,CAQE,kBAAC,QAAD;EACE,GAAE;EACF,GAAE;EACF,OAAM;EACN,QAAO;EACP,IAAG;EACH,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,EACF,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,CACE;IChCG,MAAW,EACtB,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN,CAQE,kBAAC,QAAD;EACE,GAAE;EACF,GAAE;EACF,OAAM;EACN,QAAO;EACP,IAAG;EACH,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,EACF,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,CACE;IChCG,MAAgB,EAC3B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,QAAD;GACE,GAAE;GACF,GAAE;GACF,OAAM;GACN,QAAO;GACP,IAAG;GACH,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACE;ICvCG,MAAY,EACvB,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,QAAD;GACE,GAAE;GACF,GAAE;GACF,OAAM;GACN,QAAO;GACP,IAAG;GACH,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACE;ICvCG,MAAa,EACxB,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,OAAM;CACN,SAAQ;CACR,GAAI;WAEJ,kBAAC,QAAD,EAAM,GAAE,i3BAAk3B,CAAA;CACt3B,CAAA,ECdG,MAAgB,EAC3B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN,CAQE,kBAAC,QAAD;EACE,GAAE;EACF,MAAK;EACL,CAAA,EACF,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,CACE;ICzBG,MAAU,EACrB,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN,CAQE,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,EACF,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,CACE;IC5BG,MAAkC,EAC7C,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN,CAQE,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,EACF,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,CACE;IC5BG,MAAiB,EAC5B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,GAAE;GACF,OAAM;GACN,QAAO;GACP,IAAG;GACH,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,UAAD;GAAQ,IAAG;GAAK,IAAG;GAAK,GAAE;GAAI,MAAK;GAAiB,CAAA;EACpD,kBAAC,UAAD;GAAQ,IAAG;GAAK,IAAG;GAAK,GAAE;GAAI,MAAK;GAAiB,CAAA;EACpD,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACE;IChDG,MAAY,EACvB,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,GAAE;GACF,OAAM;GACN,QAAO;GACP,IAAG;GACH,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,UAAD;GAAQ,IAAG;GAAK,IAAG;GAAK,GAAE;GAAI,MAAK;GAAiB,CAAA;EACpD,kBAAC,UAAD;GAAQ,IAAG;GAAK,IAAG;GAAK,GAAE;GAAI,MAAK;GAAiB,CAAA;EACpD,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACE;ICzCG,MAAa,EACxB,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,GAAE;GACF,OAAM;GACN,QAAO;GACP,IAAG;GACH,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,UAAD;GAAQ,IAAG;GAAK,IAAG;GAAK,GAAE;GAAI,MAAK;GAAiB,CAAA;EACpD,kBAAC,UAAD;GAAQ,IAAG;GAAK,IAAG;GAAK,GAAE;GAAI,MAAK;GAAiB,CAAA;EACpD,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACE;IChDG,MAAgB,EAC3B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACE;ICxDG,MAAa,EACxB,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACE;ICjDG,MAAgB,EAC3B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,QAAD;GACE,IAAG;GACH,IAAG;GACH,IAAG;GACH,IAAG;GACH,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,WAAD;GACE,QAAO;GACP,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACE;ICtCG,MAAkB,EAC7B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN,CAQE,kBAAC,QAAD;EACE,IAAG;EACH,IAAG;EACH,IAAG;EACH,IAAG;EACH,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,EACF,kBAAC,WAAD;EACE,QAAO;EACP,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,CACE;IC/BG,MAAY,EACvB,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,QAAD;GACE,IAAG;GACH,IAAG;GACH,IAAG;GACH,IAAG;GACH,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,WAAD;GACE,QAAO;GACP,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACE;ICtCG,MAAoB,EAC/B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACE;ICnCG,MAAgB,EAC3B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACE;ICnCG,MAAiB,EAC5B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN;EAQE,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,GAAE;GACF,OAAM;GACN,QAAO;GACP,IAAG;GACH,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACF,kBAAC,QAAD;GACE,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;GACd,gBAAe;GACf,CAAA;EACE;ICvCG,MAAgB,EAC3B,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN,CAQE,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,EACF,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,CACE;IC5BG,MAAqB,EAChC,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WAEJ,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA;CACE,CAAA,ECrBG,MAAwB,EACnC,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WAEJ,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA;CACE,CAAA,ECrBG,MAA4B,EACvC,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN,CAQE,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,EACF,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,CACE;IC5BG,MAA0B,EACrC,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN,CAQE,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,EACF,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,CACE;IC5BG,MAAa,EACxB,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WAEJ,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA;CACE,CAAA,ECrBG,MAAa,EACxB,WAAQ,IACR,YAAS,IACT,GAAG,QAGD,kBAAC,OAAD;CACS;CACC;CACR,SAAQ;CACR,MAAK;CACL,OAAM;CACN,GAAI;WANN,CAQE,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,EACF,kBAAC,QAAD;EACE,GAAE;EACF,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACf,CAAA,CACE;ICvBG,MAAmB,EAC9B,UAAO,IACP,mBAEO,kBAAC,IAAD;CAAgB,OAAO;CAAM,QAAQ;CAAiB;CAAa,CAAA"}