@llmnative/react 0.1.1 → 1.1.0

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 (185) hide show
  1. package/README.md +397 -364
  2. package/bin/cli.js +117 -98
  3. package/dist/index.css +1 -1
  4. package/dist/index.js +21 -823
  5. package/dist/index.mjs +14984 -9345
  6. package/dist/style.css +1 -0
  7. package/dist/types/src/App.d.ts +75 -14
  8. package/dist/types/src/Config.d.ts +28 -5
  9. package/dist/types/src/Global.d.ts +2 -2
  10. package/dist/types/src/I18n.d.ts +186 -0
  11. package/dist/types/src/Theme.d.ts +153 -81
  12. package/dist/types/src/auth.d.ts +13 -1
  13. package/dist/types/src/components/Component.d.ts +13 -27
  14. package/dist/types/src/components/ErrorBoundary.d.ts +30 -0
  15. package/dist/types/src/components/blocks/Brand.d.ts +9 -4
  16. package/dist/types/src/components/blocks/Breadcrumbs.d.ts +50 -4
  17. package/dist/types/src/components/blocks/Carousel.d.ts +7 -5
  18. package/dist/types/src/components/blocks/Dropdown.d.ts +38 -20
  19. package/dist/types/src/components/blocks/ListCard.d.ts +38 -0
  20. package/dist/types/src/components/blocks/Menu.d.ts +15 -16
  21. package/dist/types/src/components/blocks/Notifications.d.ts +11 -3
  22. package/dist/types/src/components/blocks/ProviderSwitcher.d.ts +65 -0
  23. package/dist/types/src/components/blocks/Search.d.ts +3 -2
  24. package/dist/types/src/components/blocks/SideNav.d.ts +45 -0
  25. package/dist/types/src/components/blocks/ThemeSwitcher.d.ts +28 -0
  26. package/dist/types/src/components/blocks/Toolbar.d.ts +23 -0
  27. package/dist/types/src/components/index.d.ts +28 -7
  28. package/dist/types/src/components/types.d.ts +10 -3
  29. package/dist/types/src/components/ui/Alert.d.ts +20 -4
  30. package/dist/types/src/components/ui/Badge.d.ts +12 -5
  31. package/dist/types/src/components/ui/Buttons.d.ts +16 -12
  32. package/dist/types/src/components/ui/Card.d.ts +11 -7
  33. package/dist/types/src/components/ui/Code.d.ts +5 -1
  34. package/dist/types/src/components/ui/Gallery.d.ts +16 -16
  35. package/dist/types/src/components/ui/GridSystem.d.ts +5 -2
  36. package/dist/types/src/components/ui/Icon.d.ts +6 -1
  37. package/dist/types/src/components/ui/Image.d.ts +7 -1
  38. package/dist/types/src/components/ui/ImageAvatar.d.ts +4 -1
  39. package/dist/types/src/components/ui/Loader.d.ts +3 -1
  40. package/dist/types/src/components/ui/LocaleSwitcher.d.ts +14 -0
  41. package/dist/types/src/components/ui/Modal.d.ts +46 -15
  42. package/dist/types/src/components/ui/Pagination.d.ts +16 -3
  43. package/dist/types/src/components/ui/Percentage.d.ts +14 -5
  44. package/dist/types/src/components/ui/Repeat.d.ts +14 -6
  45. package/dist/types/src/components/ui/Tab.d.ts +29 -2
  46. package/dist/types/src/components/ui/TabDynamic.d.ts +4 -3
  47. package/dist/types/src/components/ui/Table.d.ts +18 -14
  48. package/dist/types/src/components/ui/fields/CodeEditor.d.ts +46 -0
  49. package/dist/types/src/components/ui/fields/ContextMenu.d.ts +87 -0
  50. package/dist/types/src/components/ui/fields/Crop.d.ts +4 -2
  51. package/dist/types/src/components/ui/fields/ImageField.d.ts +31 -0
  52. package/dist/types/src/components/ui/fields/Input.d.ts +43 -14
  53. package/dist/types/src/components/ui/fields/Prompt.d.ts +2 -31
  54. package/dist/types/src/components/ui/fields/RichText.d.ts +89 -0
  55. package/dist/types/src/components/ui/fields/Select.d.ts +13 -10
  56. package/dist/types/src/components/ui/fields/Upload.d.ts +50 -2
  57. package/dist/types/src/components/ui/fields/UploadCSV.d.ts +2 -0
  58. package/dist/types/src/components/ui/useRecordSelection.d.ts +1 -2
  59. package/dist/types/src/components/widgets/Form.d.ts +80 -43
  60. package/dist/types/src/components/widgets/ImageEditor.d.ts +4 -5
  61. package/dist/types/src/components/widgets/MarkdownReader.d.ts +4 -4
  62. package/dist/types/src/components/widgets/Prompt.d.ts +90 -22
  63. package/dist/types/src/components/widgets/TabDynamic.d.ts +4 -3
  64. package/dist/types/src/components/widgets/form-controller.d.ts +42 -0
  65. package/dist/types/src/components/widgets/grid-core/GridCore.d.ts +1 -1
  66. package/dist/types/src/components/widgets/grid-core/GridDB.d.ts +1 -1
  67. package/dist/types/src/components/widgets/grid-core/GridGalleryView.d.ts +1 -1
  68. package/dist/types/src/components/widgets/grid-core/GridTableView.d.ts +1 -1
  69. package/dist/types/src/components/widgets/grid-core/types.d.ts +77 -27
  70. package/dist/types/src/components/widgets/grid-core/useGridActions.d.ts +4 -8
  71. package/dist/types/src/components/widgets/grid-core/useGridColumns.d.ts +2 -2
  72. package/dist/types/src/components/widgets/grid-core/useGridDBRecords.d.ts +1 -2
  73. package/dist/types/src/components/widgets/grid-core/useGridPreparedRecords.d.ts +2 -2
  74. package/dist/types/src/components/widgets/grid-core/useGridSelection.d.ts +4 -5
  75. package/dist/types/src/components/widgets/grid-core/utils.d.ts +11 -3
  76. package/dist/types/src/conf/Prompt.d.ts +1 -1
  77. package/dist/types/src/conf/i18n/ar.d.ts +2 -0
  78. package/dist/types/src/conf/i18n/de.d.ts +2 -0
  79. package/dist/types/src/conf/i18n/en.d.ts +2 -0
  80. package/dist/types/src/conf/i18n/index.d.ts +6 -0
  81. package/dist/types/src/conf/i18n/it.d.ts +2 -0
  82. package/dist/types/src/conf/i18n/ru.d.ts +2 -0
  83. package/dist/types/src/conf/i18n/zh.d.ts +2 -0
  84. package/dist/types/src/constant.d.ts +1 -1
  85. package/dist/types/src/index.d.ts +48 -13
  86. package/dist/types/src/libs/converter.d.ts +4 -4
  87. package/dist/types/src/libs/editorHeight.d.ts +12 -0
  88. package/dist/types/src/libs/fetch.d.ts +4 -4
  89. package/dist/types/src/libs/imageBuilder.d.ts +63 -14
  90. package/dist/types/src/libs/imageVariants.d.ts +35 -0
  91. package/dist/types/src/libs/index.d.ts +1 -4
  92. package/dist/types/src/libs/promptUtils.d.ts +24 -0
  93. package/dist/types/src/libs/sanitizer.d.ts +2 -2
  94. package/dist/types/src/libs/utils.d.ts +9 -10
  95. package/dist/types/src/pages/index.d.ts +0 -2
  96. package/dist/types/src/providers/ProviderConfiguration.d.ts +6 -0
  97. package/dist/types/src/providers/ProviderDescriptor.d.ts +18 -0
  98. package/dist/types/src/providers/ProviderRegistryContext.d.ts +51 -0
  99. package/dist/types/src/providers/ProviderSession.d.ts +68 -0
  100. package/dist/types/src/providers/ai/AIProvider.d.ts +57 -0
  101. package/dist/types/src/providers/ai/AIProviderContext.d.ts +13 -0
  102. package/dist/types/src/providers/ai/anthropic.d.ts +2 -0
  103. package/dist/types/src/providers/ai/deepseek.d.ts +1 -0
  104. package/dist/types/src/providers/ai/gemini.d.ts +2 -0
  105. package/dist/types/src/providers/ai/glm.d.ts +1 -0
  106. package/dist/types/src/providers/ai/index.d.ts +20 -134
  107. package/dist/types/src/providers/ai/mistral.d.ts +1 -0
  108. package/dist/types/src/providers/ai/openai.d.ts +1 -0
  109. package/dist/types/src/providers/ai/openaiCompatible.d.ts +19 -0
  110. package/dist/types/src/providers/ai/opencode.d.ts +2 -0
  111. package/dist/types/src/providers/ai/openrouter.d.ts +1 -0
  112. package/dist/types/src/providers/ai/shared.d.ts +55 -0
  113. package/dist/types/src/providers/api/ApiProvider.d.ts +43 -0
  114. package/dist/types/src/providers/api/direct.d.ts +14 -0
  115. package/dist/types/src/providers/api/firebase.d.ts +14 -0
  116. package/dist/types/src/providers/api/mock.d.ts +7 -0
  117. package/dist/types/src/providers/api/supabase.d.ts +14 -0
  118. package/dist/types/src/providers/auth/AuthProvider.d.ts +10 -2
  119. package/dist/types/src/providers/auth/firebase/FirebaseAuthProvider.d.ts +49 -0
  120. package/dist/types/src/providers/auth/google/GoogleAuth.d.ts +2 -2
  121. package/dist/types/src/providers/auth/supabase/SupabaseAuthProvider.d.ts +48 -0
  122. package/dist/types/src/providers/credentials/CredentialsProvider.d.ts +3 -0
  123. package/dist/types/src/providers/credentials/CredentialsProviderContext.d.ts +12 -0
  124. package/dist/types/src/providers/credentials/google/GoogleServiceAccountProvider.d.ts +8 -0
  125. package/dist/types/src/providers/data/DataProvider.d.ts +27 -1
  126. package/dist/types/src/providers/data/firebase.d.ts +5 -4
  127. package/dist/types/src/providers/data/firestore.d.ts +45 -0
  128. package/dist/types/src/providers/data/mock.d.ts +8 -1
  129. package/dist/types/src/providers/data/supabase.d.ts +36 -10
  130. package/dist/types/src/providers/email/definitions.d.ts +3 -0
  131. package/dist/types/src/providers/firebase-init.d.ts +24 -7
  132. package/dist/types/src/providers/icon/PhosphorIconProvider.d.ts +1 -1
  133. package/dist/types/src/providers/manifest.d.ts +20 -14
  134. package/dist/types/src/providers/proxy/index.d.ts +7 -0
  135. package/dist/types/src/providers/proxy/vite.d.ts +3 -0
  136. package/dist/types/src/providers/publish/PublishProvider.d.ts +29 -0
  137. package/dist/types/src/providers/publish/definitions.d.ts +3 -0
  138. package/dist/types/src/providers/scrape/index.d.ts +2 -1
  139. package/dist/types/src/providers/seo/google/keyword.d.ts +6 -1
  140. package/dist/types/src/providers/storage/StorageProvider.d.ts +155 -4
  141. package/dist/types/src/providers/storage/dropbox.d.ts +3 -3
  142. package/dist/types/src/providers/storage/firebase.d.ts +44 -7
  143. package/dist/types/src/providers/storage/supabase.d.ts +47 -7
  144. package/dist/types/src/providers/supabase-init.d.ts +35 -0
  145. package/dist/types/src/types/FormFields.d.ts +4 -2
  146. package/dist/types/src/types/FormSchema.d.ts +29 -0
  147. package/dist/types/themes/tokyo-night-light.d.ts +3 -0
  148. package/dist/types/themes/tokyo-night.d.ts +3 -0
  149. package/dist/types/themes/vscode-dark-plus.d.ts +3 -0
  150. package/dist/types/themes/vscode-light-plus.d.ts +3 -0
  151. package/dist/vite.js +1 -0
  152. package/dist/vite.mjs +54 -0
  153. package/package.json +46 -8
  154. package/scripts/cli/proxy-templates/cloudflare.ts +34 -0
  155. package/scripts/cli/proxy-templates/express.ts +77 -0
  156. package/scripts/cli/proxy-templates/nextjs-app.ts +42 -0
  157. package/scripts/cli/proxy-templates/nextjs-pages.ts +41 -0
  158. package/scripts/cli/proxy-templates/scaffold.json +33 -0
  159. package/scripts/cli/setup-devtools.js +155 -85
  160. package/scripts/cli/setup-project.js +618 -484
  161. package/themes/cyber.ts +469 -405
  162. package/themes/default.ts +469 -405
  163. package/themes/flat.ts +469 -405
  164. package/themes/tokyo-night-light.ts +38 -0
  165. package/themes/tokyo-night.ts +38 -0
  166. package/themes/vscode-dark-plus.ts +29 -0
  167. package/themes/vscode-light-plus.ts +29 -0
  168. package/dist/index.js.map +0 -1
  169. package/dist/index.mjs.map +0 -1
  170. package/dist/types/src/components/FormEnhancer.d.ts +0 -26
  171. package/dist/types/src/components/Template.d.ts +0 -18
  172. package/dist/types/src/components/ui/fields/AssistantAI.d.ts +0 -23
  173. package/dist/types/src/components/ui/fields/Command.d.ts +0 -15
  174. package/dist/types/src/components/ui/fields/ImageUrl.d.ts +0 -7
  175. package/dist/types/src/libs/cache.d.ts +0 -9
  176. package/dist/types/src/libs/database.d.ts +0 -3
  177. package/dist/types/src/libs/log.d.ts +0 -2
  178. package/dist/types/src/libs/seo.d.ts +0 -8
  179. package/dist/types/src/libs/storage.d.ts +0 -2
  180. package/dist/types/src/pages/Blog.d.ts +0 -3
  181. package/dist/types/src/pages/BlogPost.d.ts +0 -16
  182. package/dist/types/src/pages/Helper.d.ts +0 -8
  183. package/dist/types/src/providers/auth/google/apis/auth.d.ts +0 -4
  184. package/dist/types/src/types/Block.d.ts +0 -4
  185. package/dist/types/src/types/Section.d.ts +0 -4
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../src/libs/converter.ts","../themes/default.ts","../themes/flat.ts","../themes/cyber.ts","../src/Theme.tsx","../src/components/ui/GridSystem.tsx","../src/libs/cn.ts","../src/components/ui/Badge.tsx","../src/providers/icon/LucideIconProvider.tsx","../src/providers/icon/PhosphorIconProvider.tsx","../src/providers/icon/IconProviderContext.tsx","../src/components/ui/Icon.tsx","../src/components/blocks/Menu.tsx","../src/motion.ts","../src/components/blocks/Dropdown.tsx","../src/Global.tsx","../src/Config.tsx","../src/libs/utils.ts","../src/libs/fetch.ts","../src/components/ui/Buttons.tsx","../src/providers/auth/AuthProviderContext.tsx","../src/libs/path.ts","../src/components/ui/ImageAvatar.tsx","../src/providers/ProviderConfiguration.ts","../src/auth.tsx","../src/providers/data/DataProviderContext.tsx","../src/components/ui/Loader.tsx","../src/components/ui/Card.tsx","../src/components/ui/Modal.tsx","../src/components/ui/Image.tsx","../src/components/blocks/Brand.tsx","../src/components/blocks/Breadcrumbs.tsx","../src/components/blocks/Carousel.tsx","../src/components/blocks/Notifications.tsx","../src/components/blocks/Search.tsx","../src/components/ui/Alert.tsx","../src/components/ui/Code.tsx","../src/components/ui/Percentage.tsx","../src/constant.ts","../src/providers/auth/google/auth.ts","../src/providers/firebase-init.ts","../src/providers/data/firebase.ts","../src/libs/log.ts","../src/types/Layout.tsx","../src/components/ui/fields/Input.tsx","../src/libs/order.ts","../src/components/ui/fields/Select.tsx","../src/libs/locale.ts","../src/conf/Prompt.ts","../src/providers/ai/index.ts","../src/components/ui/fields/Prompt.tsx","../src/components/ui/fields/ImageUrl.tsx","../src/components/ui/useRecordSelection.ts","../src/components/ui/useStableRecordKey.ts","../src/components/ui/Table.tsx","../src/components/ui/fields/Crop.tsx","../src/components/ui/fields/Upload.tsx","../src/components/widgets/Prompt.tsx","../src/types/FormFields.tsx","../src/types/Block.tsx","../src/types/Section.tsx","../src/components/Component.tsx","../src/components/widgets/Form.tsx","../src/components/ui/Repeat.tsx","../src/components/ui/Tab.tsx","../src/components/ui/LayoutBuilder.tsx","../src/components/ui/fields/UploadCSV.tsx","../src/components/FormEnhancer.tsx","../src/components/ui/fields/AssistantAI.tsx","../src/components/widgets/grid-core/useGridDBRecords.ts","../src/components/widgets/grid-core/resolveGridPathFromUrl.ts","../src/components/widgets/grid-core/GridDB.tsx","../src/components/widgets/grid-core/utils.ts","../src/components/widgets/grid-core/GridTableView.tsx","../src/components/widgets/ImageEditor.tsx","../src/Head.tsx","../src/components/widgets/MarkdownReader.tsx","../src/components/widgets/TabDynamic.tsx","../src/components/Template.tsx","../src/components/ui/Pagination.tsx","../src/components/ui/Gallery.tsx","../src/components/widgets/grid-core/GridGalleryView.tsx","../src/components/widgets/grid-core/useGridActions.tsx","../src/components/widgets/grid-core/useGridColumns.ts","../src/components/widgets/grid-core/useGridPreparedRecords.ts","../src/components/widgets/grid-core/useGridSelection.ts","../src/components/widgets/grid-core/GridCore.tsx","../src/components/widgets/grid-core/GridArray.tsx","../src/components/widgets/Grid.tsx","../src/pages/Users.tsx","../src/pages/NotFound.tsx","../src/providers/storage/StorageProviderContext.tsx","../src/providers/data/mock.ts","../src/providers/auth/google/GoogleAuthProvider.ts","../src/providers/email/EmailProviderContext.tsx","../src/providers/storage/firebase.ts","../src/providers/auth/dropbox/DropboxAuthProvider.ts","../src/providers/auth/google/GoogleAuth.tsx","../src/providers/email/google/email.ts","../src/providers/email/google/GmailEmailProvider.ts","../src/providers/data/supabase.ts","../src/providers/storage/supabase.ts","../src/providers/manifest.ts","../src/App.tsx","../src/providers/seo/google/keyword.ts","../src/providers/seo/google/trend.ts","../src/providers/storage/dropbox.tsx","../src/libs/cache.ts","../src/providers/scrape/index.ts","../src/libs/seo.ts","../src/libs/sanitizer.ts","../src/libs/imageBuilder.ts","../src/pages/Helper.tsx","../src/pages/BlogPost.tsx","../src/pages/Blog.tsx"],"sourcesContent":["import { normalizeKey } from \"./utils\";\r\n\r\ninterface DateTimeResult {\r\n year: string;\r\n shortYear: string;\r\n month: string;\r\n day: string;\r\n hours: string;\r\n minutes: string;\r\n seconds: string;\r\n hour: string;\r\n minute: string;\r\n second: string;\r\n}\r\n\r\nfunction DateTime(date: string | number | Date): DateTimeResult {\r\n const d = new Date(typeof date === 'number' || /^\\d+$/.test(String(date)) ? Number(date) : date);\r\n if (isNaN(d.getTime())) {\r\n return {\r\n year: '',\r\n shortYear: '',\r\n month: '',\r\n day: '',\r\n hours: '',\r\n minutes: '',\r\n seconds: '',\r\n hour: '',\r\n minute: '',\r\n second: '',\r\n };\r\n }\r\n\r\n const padToTwoDigits = (num: number): string => num.toString().padStart(2, '0');\r\n\r\n return {\r\n year: d.getFullYear().toString(),\r\n shortYear: d.getFullYear().toString().slice(-2),\r\n month: padToTwoDigits(d.getMonth() + 1),\r\n day: padToTwoDigits(d.getDate()),\r\n hours: padToTwoDigits(d.getHours()),\r\n minutes: padToTwoDigits(d.getMinutes()),\r\n seconds: padToTwoDigits(d.getSeconds()),\r\n hour: d.getHours().toString(),\r\n minute: d.getMinutes().toString(),\r\n second: d.getSeconds().toString(),\r\n };\r\n}\r\n\r\nfunction formatDate(date: string | number | Date, format: string): string {\r\n const {\r\n year, shortYear, month, day, hours, minutes, seconds, hour, minute, second\r\n } = DateTime(date);\r\n\r\n const replacements: Record<string, string> = {\r\n 'YYYY': year,\r\n 'YY': shortYear,\r\n 'MM': month,\r\n 'DD': day,\r\n 'hh': hours,\r\n 'mm': minutes,\r\n 'ss': seconds,\r\n 'h': hour,\r\n 'm': minute,\r\n 's': second\r\n };\r\n\r\n return format.replace(/YYYY|YY|MM|DD|hh|mm|ss|h|m|s/g, match => replacements[match] || match);\r\n}\r\n\r\nfunction getDefaultDateFormat(): string {\r\n const date = new Date();\r\n const formatter = new Intl.DateTimeFormat(undefined, {\r\n year: 'numeric', month: '2-digit', day: '2-digit'\r\n });\r\n const parts = formatter.formatToParts(date);\r\n return parts.map(part => {\r\n switch (part.type) {\r\n case 'year': return 'YYYY';\r\n case 'month': return 'MM';\r\n case 'day': return 'DD';\r\n default: return part.value;\r\n }\r\n }).join('');\r\n}\r\n\r\nfunction getDefaultTimeFormat(): string {\r\n const date = new Date();\r\n const formatter = new Intl.DateTimeFormat(undefined, {\r\n hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false\r\n });\r\n const parts = formatter.formatToParts(date);\r\n return parts.map(part => {\r\n switch (part.type) {\r\n case 'hour': return 'hh';\r\n case 'minute': return 'mm';\r\n case 'second': return 'ss';\r\n default: return part.value;\r\n }\r\n }).join('');\r\n}\r\n\r\ntype ConverterFunction = (value: string | number | Date, format?: string) => string;\r\n\r\ninterface ConverterCore {\r\n toDate: ConverterFunction;\r\n toTime: ConverterFunction;\r\n toDateTime: ConverterFunction;\r\n toCamel: (str: string, separator?: string, delimiter?: string[]) => string;\r\n toUpper: (str: string) => string;\r\n toLower: (str: string) => string;\r\n toSlug: (str: string) => string;\r\n subStringCount: (str: string, subStr: string) => number;\r\n}\r\n\r\ninterface Converter extends ConverterCore {\r\n parse: (values: Record<string, any>, pattern: string, target?: {key: string, value: any, hideEmpty: boolean}) => string;\r\n truncate: (str: string, length?: number) => string;\r\n splitLast: (str: string, seps: string | string[], regException?: RegExp) => [string, string];\r\n splitFirst: (str: string, seps: string | string[], regException?: RegExp) => [string, string];\r\n padLeft: (str: string, length: number, char?: string, regex?: RegExp) => string;\r\n padRight: (str: string, length: number, char?: string, regex?: RegExp) => string;\r\n toQueryString: (params: Record<string, string>, startWith?: string, fill?: string) => string;\r\n fillObject: <T>(obj: Record<string, T>, value?: any) => Record<string, any>;\r\n [key: string]: ConverterCore[keyof ConverterCore] | any;\r\n}\r\n\r\ntype GetPathValueTarget = {\r\n key?: string;\r\n value: Record<string, any>;\r\n hideEmpty: boolean;\r\n}\r\n\r\ntype SanitizerCallback = (value: any) => any;\r\n\r\ntype GetPathValue = (\r\n obj: Record<string, any>,\r\n path: string,\r\n target?: GetPathValueTarget,\r\n sanitizerCallback?: SanitizerCallback\r\n ) => string; \r\n\r\nconst getPathValue: GetPathValue = (obj, path, target, sanitizerCallback) => {\r\n if (!obj || !path) return '';\r\n \r\n const parts = path.split(\".\");\r\n let acc: any = obj;\r\n \r\n for (let i = 0; i < parts.length; i++) {\r\n const part = parts[i];\r\n \r\n if (acc == null) return '';\r\n \r\n // 🔹 Caso con [] → esplodo l’array e ricorro\r\n if (part.endsWith(\"[]\")) {\r\n const key = part.slice(0, -2);\r\n const arr = acc?.[key];\r\n if (!Array.isArray(arr)) return '';\r\n \r\n const rest = parts.slice(i + 1).join(\".\");\r\n if (!rest) {\r\n if(target) {\r\n target.key && (target.value[target.key] = arr) || (target.value = arr);\r\n return '';\r\n }\r\n return arr;\r\n }\r\n\r\n const resultValue = target?.value ?? {};\r\n for(const index in arr) {\r\n const value = (() => {\r\n const v = getPathValue(arr[index], rest);\r\n return sanitizerCallback?.(v) ?? v;\r\n })();\r\n \r\n if (target) {\r\n if(!target.hideEmpty || value !== '') { \r\n resultValue[index] = target.key\r\n ? { ...(resultValue?.[index] ?? {}), [target.key]: value }\r\n : value;\r\n }\r\n }\r\n }\r\n return target ? '' : resultValue;\r\n }\r\n\r\n acc = acc[part];\r\n }\r\n\r\n acc = sanitizerCallback?.(acc) ?? acc;\r\n if (target && (!target.hideEmpty || acc !== '')) {\r\n target.key && (target.value[target.key] = acc) || (target.value = acc);\r\n return '';\r\n }\r\n \r\n return acc;\r\n}\r\n\r\nexport const converter: Converter = {\r\n parse: (values, pattern, target = undefined, sanitizerCallback = undefined) => {\r\n if (typeof pattern !== 'string') return pattern;\r\n const parse = pattern.replace(/{([^}:]+)(?::([^}:]+))?(?::([^}:]+))?}/g, (_, Key, Func, format) => {\r\n const [pre, key] = ((Key || '').indexOf('(') === -1 ? ['', Key] : Key.split('(', 2));\r\n const [func, post] = ((Func || '').indexOf(')') === -1 ? [Func, ''] : Func.split(')', 2));\r\n\r\n const value = getPathValue(values, key, target, sanitizerCallback);\r\n if (!converter?.[func] || !value) {\r\n return value || '';\r\n }\r\n\r\n return pre + converter[func](value, format) + post;\r\n });\r\n\r\n return splitter(replacer(parse));\r\n },\r\n toDate: (date, format = undefined) => {\r\n const defaultFormat = getDefaultDateFormat();\r\n if (format === 'ISO') {\r\n return formatDate(date, 'YYYY-MM-DD');\r\n }\r\n return formatDate(date, format || defaultFormat);\r\n },\r\n toTime: (date, format = undefined) => {\r\n const defaultFormat = getDefaultTimeFormat();\r\n if (format === 'ISO') {\r\n return formatDate(date, 'hh:mm:ss');\r\n }\r\n return formatDate(date, format || defaultFormat);\r\n },\r\n toDateTime: (date, format = undefined) => {\r\n const defaultDateFormat = getDefaultDateFormat();\r\n const defaultTimeFormat = getDefaultTimeFormat();\r\n const defaultFormat = `${defaultDateFormat} ${defaultTimeFormat}`;\r\n if (format === 'ISO') {\r\n return formatDate(date, 'YYYY-MM-DD hh:mm:ss');\r\n }\r\n return formatDate(date, format || defaultFormat);\r\n },\r\n toCamel: (str, separator = '', delimiter = ['-', '_', ' ']) => {\r\n const parts = str.split('/');\r\n const last = parts.pop() || '';\r\n const escaped = delimiter.map(d => '\\\\' + d).join('');\r\n const regex = new RegExp(`(?:[${escaped}]+|^)(.)`, 'g');\r\n const camel = last.toLowerCase().replace(regex, (_, char) => separator + char.toUpperCase());\r\n return [...parts, camel].join('/');\r\n },\r\n toUpper: (str) => str.toUpperCase(),\r\n toLower: (str) => str.toLowerCase(),\r\n toSlug: (str) => normalizeKey(str),\r\n toNumberFormat: (num: string | number, locale = navigator.language) => {\r\n return new Intl.NumberFormat(locale).format(Number(num));\r\n },\r\n splitLast: (str, seps, regException = undefined) => {\r\n const splitter = (sep: string): [string, string] | null => {\r\n const split = str.split(sep);\r\n if (split.length <= 1) return null;\r\n let last = split.pop() || '';\r\n while (split.length && regException?.test(split[split.length - 1])) {\r\n last = split.pop() + sep + last;\r\n }\r\n return [split.join(sep), last];\r\n };\r\n const separators: string[] = typeof seps === 'string' ? [seps] : Array.isArray(seps) ? seps : [];\r\n for (const sep of separators) {\r\n const result = splitter(sep);\r\n if (result) return result;\r\n }\r\n return [str, ''];\r\n },\r\n splitFirst: (str, seps, regException = undefined) => {\r\n const splitter = (sep: string): [string, string] | null => {\r\n const split = str.split(sep);\r\n if (split.length <= 1) return null;\r\n let first = split.shift() || '';\r\n while (split.length && regException?.test(split[0])) {\r\n first += sep + split.shift();\r\n }\r\n return [first, split.join(sep)];\r\n };\r\n const separators: string[] = typeof seps === 'string' ? [seps] : Array.isArray(seps) ? seps : [];\r\n for (const sep of separators) {\r\n const result = splitter(sep);\r\n if (result) return result;\r\n }\r\n return [str, ''];\r\n },\r\n padLeft: (str, length, char = ' ', regex = undefined) => {\r\n if (regex) {\r\n return str.replace(regex, match => match.padStart(length, char));\r\n }\r\n return str.padStart(length, char);\r\n },\r\n padRight: (str, length, char = ' ', regex = undefined) => {\r\n if (regex) {\r\n return str.replace(regex, match => match.padEnd(length, char));\r\n }\r\n return str.padEnd(length, char);\r\n },\r\n toQueryString: (params, startWith = \"?\", fill = undefined) => {\r\n const query = Object.keys(params);\r\n return (query.length > 0 ? startWith : \"\") + query.map(key => {\r\n return `${encodeURIComponent(key)}=${encodeURIComponent(fill === undefined\r\n ? params[key]\r\n : fill)}`;\r\n }).join('&');\r\n },\r\n fillObject: (obj, value = null) => {\r\n const result: Record<string, any> = {};\r\n for (const key in obj) {\r\n result[key] = value;\r\n }\r\n return result;\r\n },\r\n subStringCount: (str, subStr) => {\r\n if (subStr === '') return 0;\r\n return str.split(subStr).length - 1;\r\n },\r\n truncate: (str, length = 100) => {\r\n return str.length > length ? str.substring(0, length) : str;\r\n }\r\n};\r\n\r\nfunction replacer(pattern: string) {\r\n return pattern.replace(/replace\\(([^,]+),([^,]+),([^)]+)\\)/gi, (_, key, from, to) => {\r\n return key.replaceAll(from, to);\r\n });\r\n}\r\n\r\nfunction splitter(pattern: string) {\r\n return pattern.replace(/split\\(([^,]+),([^,]+),([^)]+)\\)/gi, (_, key, sep, index = 0) => {\r\n return key.split(sep)[index];\r\n });\r\n}\r\n","import type { Theme, ThemeDefinition, ThemePresetConfig } from '../src/Theme';\nimport type { MotionRegistry } from '../src/motion';\n\nexport const preset: ThemePresetConfig = {\n mode: 'light',\n radius: 0.5,\n colors: {\n background: '0 0% 100%',\n foreground: '222.2 84% 4.9%',\n card: '0 0% 100%',\n cardForeground: '222.2 84% 4.9%',\n popover: '0 0% 100%',\n popoverForeground: '222.2 84% 4.9%',\n primary: '221.2 83.2% 53.3%',\n primaryForeground: '210 40% 98%',\n secondary: '210 40% 96.1%',\n secondaryForeground: '222.2 47.4% 11.2%',\n muted: '210 40% 96.1%',\n mutedForeground: '215.4 16.3% 46.9%',\n accent: '210 40% 96.1%',\n accentForeground: '222.2 47.4% 11.2%',\n destructive: '0 84.2% 60.2%',\n destructiveForeground:'210 40% 98%',\n success: '142.1 76.2% 36.3%',\n successForeground: '0 0% 100%',\n warning: '32.1 94.6% 43.7%',\n warningForeground: '0 0% 100%',\n info: '198.6 88.7% 48.4%',\n infoForeground: '0 0% 100%',\n border: '214.3 31.8% 91.4%',\n input: '214.3 31.8% 91.4%',\n ring: '221.2 83.2% 53.3%',\n },\n dark: {\n background: '222.2 84% 4.9%',\n foreground: '210 40% 98%',\n card: '222.2 84% 4.9%',\n cardForeground: '210 40% 98%',\n popover: '222.2 84% 4.9%',\n popoverForeground: '210 40% 98%',\n primary: '217.2 91.2% 59.8%',\n primaryForeground: '222.2 47.4% 11.2%',\n secondary: '217.2 32.6% 17.5%',\n secondaryForeground: '210 40% 98%',\n muted: '217.2 32.6% 17.5%',\n mutedForeground: '215 20.2% 65.1%',\n accent: '217.2 32.6% 17.5%',\n accentForeground: '210 40% 98%',\n destructive: '0 62.8% 30.6%',\n destructiveForeground:'210 40% 98%',\n success: '142.1 70.6% 45.3%',\n successForeground: '0 0% 100%',\n warning: '32.1 94.6% 55%',\n warningForeground: '0 0% 100%',\n info: '198.6 88.7% 60%',\n infoForeground: '0 0% 100%',\n border: '217.2 32.6% 17.5%',\n input: '217.2 32.6% 17.5%',\n ring: '224.3 76.3% 48%',\n },\n};\n\nexport const motion: MotionRegistry = {\n none: {\n from: {},\n to: {},\n transition: { duration: 0, easing: 'linear', properties: ['opacity', 'transform', 'box-shadow'] },\n reducedMotion: 'always',\n },\n fade: {\n from: { opacity: 0 },\n to: { opacity: 1 },\n transition: { duration: 160, easing: 'cubic-bezier(0.2, 0, 0, 1)', properties: ['opacity'] },\n reducedMotion: 'respect-user',\n },\n fadeUp: {\n from: { opacity: 0, transform: 'translateY(8px)' },\n to: { opacity: 1, transform: 'translateY(0)' },\n transition: { duration: 160, easing: 'cubic-bezier(0.2, 0, 0, 1)', properties: ['opacity', 'transform'] },\n reducedMotion: 'respect-user',\n },\n fadeDown: {\n from: { opacity: 0, transform: 'translateY(-8px)' },\n to: { opacity: 1, transform: 'translateY(0)' },\n transition: { duration: 140, easing: 'cubic-bezier(0.2, 0, 0, 1)', properties: ['opacity', 'transform', 'visibility'] },\n reducedMotion: 'respect-user',\n },\n slideFromRight: {\n from: { opacity: 0, transform: 'translateX(100%)' },\n to: { opacity: 1, transform: 'translateX(0)' },\n transition: { duration: 220, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', properties: ['opacity', 'transform'] },\n reducedMotion: 'respect-user',\n },\n slideFromLeft: {\n from: { opacity: 0, transform: 'translateX(-100%)' },\n to: { opacity: 1, transform: 'translateX(0)' },\n transition: { duration: 220, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', properties: ['opacity', 'transform'] },\n reducedMotion: 'respect-user',\n },\n slideFromTop: {\n from: { opacity: 0, transform: 'translateY(-100%)' },\n to: { opacity: 1, transform: 'translateY(0)' },\n transition: { duration: 220, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', properties: ['opacity', 'transform'] },\n reducedMotion: 'respect-user',\n },\n slideFromBottom: {\n from: { opacity: 0, transform: 'translateY(100%)' },\n to: { opacity: 1, transform: 'translateY(0)' },\n transition: { duration: 220, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', properties: ['opacity', 'transform'] },\n reducedMotion: 'respect-user',\n },\n press: {\n from: {},\n to: { transform: 'scale(0.98)' },\n transition: { duration: 100, easing: 'cubic-bezier(0.2, 0, 0, 1)', properties: ['transform', 'box-shadow'] },\n reducedMotion: 'respect-user',\n },\n imageZoom: {\n from: { transform: 'scale(1)' },\n to: { transform: 'scale(1.06)' },\n transition: { duration: 300, easing: 'cubic-bezier(0.2, 0, 0, 1)', properties: ['transform'] },\n reducedMotion: 'respect-user',\n },\n};\n\nexport const components: Theme = {\n Grid: {\n Card: {\n wrapClass: '',\n className: '',\n headerClass: 'flex justify-between',\n bodyClass: 'p-0',\n footerClass: '',\n showArrow: false,\n showLoader: false,\n },\n Table: {\n wrapClass: '',\n className: 'table-striped',\n headerClass: '',\n bodyClass: '',\n footerClass: '',\n scrollClass: 'fixed-table-container',\n selectedClass: 'table-info',\n },\n Gallery: {\n wrapClass: '',\n className: '',\n scrollClass: '',\n headerClass: '',\n bodyClass: '',\n footerClass: '',\n selectedClass: 'bg-primary/20',\n gutterSize: 1,\n rowCols: 4,\n },\n Modal: {\n mode: 'form',\n size: 'lg',\n position: 'center',\n wrapClass: '',\n className: '',\n headerClass: '',\n titleClass: '',\n subTitleClass: 'pr-1 text-muted-foreground',\n bodyClass: '',\n footerClass: '',\n iconExpand: 'fullscreen',\n iconCollapse: 'fullscreen-exit',\n motion: {\n center: 'fade',\n top: 'slideFromTop',\n left: 'slideFromLeft',\n right: 'slideFromRight',\n bottom: 'slideFromBottom',\n backdrop: 'fade',\n },\n },\n i18n: {\n headerAdd: 'Aggiungi',\n headerEdit: 'Modifica',\n buttonAdd: 'Aggiungi',\n },\n },\n Table: {\n wrapClass: 'bootstrap-table',\n className: 'table-striped',\n headerClass: '',\n bodyClass: '',\n footerClass: '',\n scrollClass: 'fixed-table-container',\n selectedClass: 'table-info',\n },\n Gallery: {\n wrapClass: '',\n className: '',\n scrollClass: '',\n headerClass: '',\n bodyClass: '',\n footerClass: '',\n selectedClass: 'bg-primary/20',\n gutterSize: 4,\n rowCols: 2,\n },\n Pagination: {\n wrapClass: '',\n className: '',\n stickyClass: 'fixed-bottom mx-5',\n scrollToTop: false,\n scrollBehavior: 'auto',\n maxItems: 5,\n sticky: true,\n align: 'end',\n },\n Carousel: {\n showIndicators: true,\n showControls: true,\n showCaption: true,\n layoutDark: false,\n autoPlay: true,\n },\n Card: {\n wrapClass: '',\n className: '',\n headerClass: 'flex justify-between bg-white/[.15] font-normal',\n bodyClass: 'flex flex-col',\n footerClass: '',\n showLoader: false,\n showArrow: false,\n },\n Loader: {\n wrapClass: '',\n className: '',\n icon: 'custom-loader',\n title: 'Loading..',\n description: '',\n },\n ActionButton: {\n className: 'btn-primary',\n badgeClass: 'rounded-full bg-destructive text-destructive-foreground',\n motion: {\n press: 'press',\n },\n },\n LoadingButton: {\n className: 'btn-primary',\n badgeClass: 'rounded-full bg-destructive text-destructive-foreground',\n motion: {\n press: 'press',\n },\n },\n LinkButton: {\n className: 'btn-outline-secondary',\n },\n Alert: {\n className: '',\n },\n Badge: {\n className: '',\n },\n Modal: {\n size: 'lg',\n position: 'center',\n wrapClass: '',\n className: '',\n headerClass: '',\n titleClass: '',\n subTitleClass: 'pr-1 text-muted-foreground',\n bodyClass: '',\n footerClass: '',\n iconExpand: 'fullscreen',\n iconCollapse: 'fullscreen-exit',\n motion: {\n center: 'fade',\n top: 'slideFromTop',\n left: 'slideFromLeft',\n right: 'slideFromRight',\n bottom: 'slideFromBottom',\n backdrop: 'fade',\n },\n },\n Dropdown: {\n wrapClass: '',\n className: '',\n buttonClass: 'btn btn-outline-primary',\n badgeClass: '',\n menuClass: '',\n menuHeaderClass: '',\n menuItemClass: '',\n menuDividerClass: '',\n headerClass: '',\n footerClass: '',\n Menu: {\n wrapClass: '',\n className: 'list-none p-0 m-0',\n headerClass: '',\n itemClass: '',\n linkClass: 'flex items-center gap-2 rounded-sm px-2 py-1.5 text-sm hover:bg-accent',\n iconClass: 'text-muted-foreground',\n textClass: '',\n badgeClass: '',\n arrowClass: '',\n submenuClass: '',\n },\n motion: {\n open: 'fadeDown',\n close: 'fadeDown',\n press: 'press',\n },\n },\n Notifications: {\n wrapClass: 'menu-item',\n Dropdown: {\n className: '',\n buttonClass: 'btn btn-link',\n menuClass: 'mt-1 fs-11px w-300px pt-1',\n },\n },\n Select: {\n wrapClass: '',\n className: '',\n },\n Autocomplete: {\n wrapClass: '',\n className: '',\n },\n Form: {\n wrapClass: '',\n buttonSaveClass: 'btn-outline-primary',\n buttonDeleteClass: 'btn-outline-danger',\n buttonBackClass: 'btn-link',\n Card: {\n headerClass: '',\n bodyClass: '',\n footerClass: 'text-right',\n },\n i18n: {\n headerAdd: 'Aggiungi',\n headerEdit: 'Modifica',\n headerNewRecord: 'Nuovo Record',\n buttonSave: 'Salva',\n buttonDelete: 'Elimina',\n buttonBack: 'Indietro',\n noticeRequiredFields: 'Per favore, compila tutti i campi obbligatori',\n },\n },\n Menu: {\n wrapClass: 'flex-1 overflow-auto p-4',\n className: 'navbar-nav flex-col mb-auto',\n headerClass: '',\n itemClass: 'nav-item',\n linkClass: 'nav-link',\n iconClass: 'mr-1',\n textClass: 'flex-grow-1',\n badgeClass: 'ml-1',\n arrowClass: '',\n submenuClass: 'nav flex-col ml-4',\n },\n Brand: {\n wrapClass: '',\n className: 'brand',\n logoClass: 'navbar-brand',\n labelClass: 'navbar-text',\n },\n SignIn: {\n className: 'flex items-center',\n avatarClass: 'avatar rounded-full mx-2',\n },\n Image: {\n wrapClass: '',\n className: '',\n motion: {\n enter: 'fade',\n hover: false,\n },\n },\n ImageAvatar: {\n wrapClass: '',\n className: '',\n motion: { enter: 'fade', hover: false },\n },\n Percentage: {\n wrapClass: '',\n className: '',\n },\n Tab: {\n wrapClass: '',\n className: '',\n motion: {\n enter: 'fadeUp',\n },\n },\n Code: {\n wrapClass: '',\n className: '',\n },\n Prompt: {\n wrapClass: '',\n className: '',\n },\n};\n\nconst definition: ThemeDefinition = { preset, motion, components };\n\nexport default definition;\n","import type { Theme, ThemeDefinition, ThemePresetConfig } from '../src/Theme';\nimport type { MotionRegistry } from '../src/motion';\n\nexport const preset: ThemePresetConfig = {\n mode: 'light' as const,\n radius: 0.125,\n colors: {\n background: '0 0% 98%',\n foreground: '215 25% 16%',\n card: '0 0% 100%',\n cardForeground: '215 25% 16%',\n popover: '0 0% 100%',\n popoverForeground: '215 25% 16%',\n primary: '215 25% 27%',\n primaryForeground: '210 40% 98%',\n secondary: '215 15% 93%',\n secondaryForeground: '215 25% 27%',\n muted: '215 15% 93%',\n mutedForeground: '215 15% 50%',\n accent: '215 15% 90%',\n accentForeground: '215 25% 27%',\n destructive: '0 72% 51%',\n destructiveForeground:'0 0% 100%',\n success: '142.1 76.2% 36.3%',\n successForeground: '0 0% 100%',\n warning: '32.1 94.6% 43.7%',\n warningForeground: '0 0% 100%',\n info: '198.6 88.7% 48.4%',\n infoForeground: '0 0% 100%',\n border: '215 15% 85%',\n input: '215 15% 85%',\n ring: '215 25% 27%',\n },\n dark: {\n background: '215 20% 12%',\n foreground: '215 10% 85%',\n card: '215 20% 15%',\n cardForeground: '215 10% 85%',\n popover: '215 20% 15%',\n popoverForeground: '215 10% 85%',\n primary: '215 35% 55%',\n primaryForeground: '0 0% 100%',\n secondary: '215 20% 20%',\n secondaryForeground: '215 10% 75%',\n muted: '215 20% 20%',\n mutedForeground: '215 10% 55%',\n accent: '215 20% 22%',\n accentForeground: '215 10% 85%',\n destructive: '0 62% 40%',\n destructiveForeground:'0 0% 100%',\n success: '142.1 70.6% 45.3%',\n successForeground: '0 0% 100%',\n warning: '32.1 94.6% 55%',\n warningForeground: '0 0% 100%',\n info: '198.6 88.7% 60%',\n infoForeground: '0 0% 100%',\n border: '215 20% 22%',\n input: '215 20% 22%',\n ring: '215 35% 55%',\n },\n};\n\nexport const motion: MotionRegistry = {\n none: {\n from: {},\n to: {},\n transition: { duration: 0, easing: 'linear', properties: ['opacity', 'transform', 'box-shadow'] },\n reducedMotion: 'always',\n },\n fade: {\n from: { opacity: 0 },\n to: { opacity: 1 },\n transition: { duration: 140, easing: 'cubic-bezier(0.2, 0, 0, 1)', properties: ['opacity'] },\n reducedMotion: 'respect-user',\n },\n fadeUp: {\n from: { opacity: 0, transform: 'translateY(4px)' },\n to: { opacity: 1, transform: 'translateY(0)' },\n transition: { duration: 140, easing: 'cubic-bezier(0.2, 0, 0, 1)', properties: ['opacity', 'transform'] },\n reducedMotion: 'respect-user',\n },\n fadeDown: {\n from: { opacity: 0, transform: 'translateY(-4px)' },\n to: { opacity: 1, transform: 'translateY(0)' },\n transition: { duration: 120, easing: 'cubic-bezier(0.2, 0, 0, 1)', properties: ['opacity', 'transform', 'visibility'] },\n reducedMotion: 'respect-user',\n },\n slideFromRight: {\n from: { opacity: 0, transform: 'translateX(100%)' },\n to: { opacity: 1, transform: 'translateX(0)' },\n transition: { duration: 180, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', properties: ['opacity', 'transform'] },\n reducedMotion: 'respect-user',\n },\n slideFromLeft: {\n from: { opacity: 0, transform: 'translateX(-100%)' },\n to: { opacity: 1, transform: 'translateX(0)' },\n transition: { duration: 180, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', properties: ['opacity', 'transform'] },\n reducedMotion: 'respect-user',\n },\n slideFromTop: {\n from: { opacity: 0, transform: 'translateY(-100%)' },\n to: { opacity: 1, transform: 'translateY(0)' },\n transition: { duration: 180, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', properties: ['opacity', 'transform'] },\n reducedMotion: 'respect-user',\n },\n slideFromBottom: {\n from: { opacity: 0, transform: 'translateY(100%)' },\n to: { opacity: 1, transform: 'translateY(0)' },\n transition: { duration: 180, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', properties: ['opacity', 'transform'] },\n reducedMotion: 'respect-user',\n },\n press: {\n from: {},\n to: { transform: 'scale(0.99)' },\n transition: { duration: 90, easing: 'cubic-bezier(0.2, 0, 0, 1)', properties: ['transform', 'box-shadow'] },\n reducedMotion: 'respect-user',\n },\n imageZoom: {\n from: { transform: 'scale(1)' },\n to: { transform: 'scale(1.06)' },\n transition: { duration: 300, easing: 'cubic-bezier(0.2, 0, 0, 1)', properties: ['transform'] },\n reducedMotion: 'respect-user',\n },\n};\n\nexport const components: Theme = {\n Grid: {\n Card: {\n wrapClass: '',\n className: '',\n headerClass: 'flex justify-between',\n bodyClass: 'p-0',\n footerClass: '',\n showArrow: false,\n showLoader: false,\n },\n Table: {\n wrapClass: '',\n className: 'table-striped',\n headerClass: '',\n bodyClass: '',\n footerClass: '',\n scrollClass: 'fixed-table-container',\n selectedClass: 'table-info',\n },\n Gallery: {\n wrapClass: '',\n className: '',\n scrollClass: '',\n headerClass: '',\n bodyClass: '',\n footerClass: '',\n selectedClass: 'bg-primary/20',\n gutterSize: 1,\n rowCols: 4,\n },\n Modal: {\n mode: 'form',\n size: 'lg',\n position: 'center',\n wrapClass: '',\n className: '',\n headerClass: '',\n titleClass: '',\n subTitleClass: 'pr-1 text-muted-foreground',\n bodyClass: '',\n footerClass: '',\n iconExpand: 'fullscreen',\n iconCollapse: 'fullscreen-exit',\n motion: {\n center: 'fade',\n top: 'slideFromTop',\n left: 'slideFromLeft',\n right: 'slideFromRight',\n bottom: 'slideFromBottom',\n backdrop: 'fade',\n },\n },\n i18n: {\n headerAdd: 'Aggiungi',\n headerEdit: 'Modifica',\n buttonAdd: 'Aggiungi',\n },\n },\n Table: {\n wrapClass: 'bootstrap-table',\n className: 'table-striped',\n headerClass: '',\n bodyClass: '',\n footerClass: '',\n scrollClass: 'fixed-table-container',\n selectedClass: 'table-info',\n },\n Gallery: {\n wrapClass: '',\n className: '',\n scrollClass: '',\n headerClass: '',\n bodyClass: '',\n footerClass: '',\n selectedClass: 'bg-primary/20',\n gutterSize: 4,\n rowCols: 2,\n },\n Pagination: {\n wrapClass: '',\n className: '',\n stickyClass: 'fixed-bottom mx-5',\n scrollToTop: false,\n scrollBehavior: 'auto',\n maxItems: 5,\n sticky: true,\n align: 'end',\n },\n Carousel: {\n showIndicators: true,\n showControls: true,\n showCaption: true,\n layoutDark: false,\n autoPlay: true,\n },\n Card: {\n wrapClass: '',\n className: '',\n headerClass: 'flex justify-between bg-white/[.15] font-normal',\n bodyClass: 'flex flex-col',\n footerClass: '',\n showLoader: false,\n showArrow: false,\n },\n Loader: {\n wrapClass: '',\n className: '',\n icon: 'custom-loader',\n title: 'Loading..',\n description: '',\n },\n ActionButton: {\n className: 'btn-primary',\n badgeClass: 'rounded-full bg-destructive text-destructive-foreground',\n motion: {\n press: 'press',\n },\n },\n LoadingButton: {\n className: 'btn-primary',\n badgeClass: 'rounded-full bg-destructive text-destructive-foreground',\n motion: {\n press: 'press',\n },\n },\n LinkButton: {\n className: 'btn-outline-secondary',\n },\n Alert: {\n className: '',\n },\n Badge: {\n className: '',\n },\n Modal: {\n size: 'lg',\n position: 'center',\n wrapClass: '',\n className: '',\n headerClass: '',\n titleClass: '',\n subTitleClass: 'pr-1 text-muted-foreground',\n bodyClass: '',\n footerClass: '',\n iconExpand: 'fullscreen',\n iconCollapse: 'fullscreen-exit',\n motion: {\n center: 'fade',\n top: 'slideFromTop',\n left: 'slideFromLeft',\n right: 'slideFromRight',\n bottom: 'slideFromBottom',\n backdrop: 'fade',\n },\n },\n Dropdown: {\n wrapClass: '',\n className: '',\n buttonClass: 'btn btn-outline-primary',\n badgeClass: '',\n menuClass: '',\n menuHeaderClass: '',\n menuItemClass: '',\n menuDividerClass: '',\n headerClass: '',\n footerClass: '',\n Menu: {\n wrapClass: '',\n className: 'list-none p-0 m-0',\n headerClass: '',\n itemClass: '',\n linkClass: 'flex items-center gap-2 rounded-sm px-2 py-1.5 text-sm hover:bg-accent',\n iconClass: 'text-muted-foreground',\n textClass: '',\n badgeClass: '',\n arrowClass: '',\n submenuClass: '',\n },\n motion: {\n open: 'fadeDown',\n close: 'fadeDown',\n press: 'press',\n },\n },\n Notifications: {\n wrapClass: 'menu-item',\n Dropdown: {\n className: '',\n buttonClass: 'btn btn-link',\n menuClass: 'mt-1 fs-11px w-300px pt-1',\n },\n },\n Select: {\n wrapClass: '',\n className: '',\n },\n Autocomplete: {\n wrapClass: '',\n className: '',\n },\n Form: {\n wrapClass: '',\n buttonSaveClass: 'btn-outline-primary',\n buttonDeleteClass: 'btn-outline-danger',\n buttonBackClass: 'btn-link',\n Card: {\n headerClass: '',\n bodyClass: '',\n footerClass: 'text-right',\n },\n i18n: {\n headerAdd: 'Aggiungi',\n headerEdit: 'Modifica',\n headerNewRecord: 'Nuovo Record',\n buttonSave: 'Salva',\n buttonDelete: 'Elimina',\n buttonBack: 'Indietro',\n noticeRequiredFields: 'Per favore, compila tutti i campi obbligatori',\n },\n },\n Menu: {\n wrapClass: 'flex-1 overflow-auto p-4',\n className: 'navbar-nav flex-col mb-auto',\n headerClass: '',\n itemClass: 'nav-item',\n linkClass: 'nav-link',\n iconClass: 'mr-1',\n textClass: 'flex-grow-1',\n badgeClass: 'ml-1',\n arrowClass: '',\n submenuClass: 'nav flex-col ml-4',\n },\n Brand: {\n wrapClass: '',\n className: 'brand',\n logoClass: 'navbar-brand',\n labelClass: 'navbar-text',\n },\n SignIn: {\n className: 'flex items-center',\n avatarClass: 'avatar rounded-full mx-2',\n },\n Image: {\n wrapClass: '',\n className: '',\n motion: {\n enter: 'fade',\n hover: false,\n },\n },\n ImageAvatar: {\n wrapClass: '',\n className: '',\n motion: { enter: 'fade', hover: false },\n },\n Percentage: {\n wrapClass: '',\n className: '',\n },\n Tab: {\n wrapClass: '',\n className: '',\n motion: {\n enter: 'fadeUp',\n },\n },\n Code: {\n wrapClass: '',\n className: '',\n },\n Prompt: {\n wrapClass: '',\n className: '',\n },\n};\n\nconst definition: ThemeDefinition = { preset, motion, components };\n\nexport default definition;\n","import type { Theme, ThemeDefinition, ThemePresetConfig } from '../src/Theme';\nimport type { MotionRegistry } from '../src/motion';\n\nexport const preset: ThemePresetConfig = {\n mode: 'dark' as const,\n radius: 0,\n colors: {\n background: '0 0% 98%',\n foreground: '215 25% 16%',\n card: '0 0% 100%',\n cardForeground: '215 25% 16%',\n popover: '0 0% 100%',\n popoverForeground: '215 25% 16%',\n primary: '160 84% 39%',\n primaryForeground: '0 0% 0%',\n secondary: '160 20% 92%',\n secondaryForeground: '160 25% 20%',\n muted: '160 15% 93%',\n mutedForeground: '215 15% 50%',\n accent: '160 30% 90%',\n accentForeground: '160 84% 25%',\n destructive: '0 72% 51%',\n destructiveForeground:'0 0% 100%',\n success: '160 84% 39%',\n successForeground: '0 0% 0%',\n warning: '45 96% 48%',\n warningForeground: '0 0% 0%',\n info: '199 89% 48%',\n infoForeground: '0 0% 0%',\n border: '160 20% 85%',\n input: '160 20% 85%',\n ring: '160 84% 39%',\n },\n dark: {\n background: '220 20% 7%',\n foreground: '160 10% 90%',\n card: '220 20% 10%',\n cardForeground: '160 10% 90%',\n popover: '220 20% 10%',\n popoverForeground: '160 10% 90%',\n primary: '160 84% 39%',\n primaryForeground: '0 0% 0%',\n secondary: '220 20% 15%',\n secondaryForeground: '160 10% 75%',\n muted: '220 20% 14%',\n mutedForeground: '220 10% 55%',\n accent: '160 60% 15%',\n accentForeground: '160 84% 70%',\n destructive: '0 72% 51%',\n destructiveForeground:'0 0% 100%',\n success: '160 84% 45%',\n successForeground: '0 0% 0%',\n warning: '45 96% 55%',\n warningForeground: '0 0% 0%',\n info: '199 89% 55%',\n infoForeground: '0 0% 0%',\n border: '220 20% 18%',\n input: '220 20% 18%',\n ring: '160 84% 39%',\n },\n};\n\nexport const motion: MotionRegistry = {\n none: {\n from: {},\n to: {},\n transition: { duration: 0, easing: 'linear', properties: ['opacity', 'transform', 'box-shadow'] },\n reducedMotion: 'always',\n },\n fade: {\n from: { opacity: 0 },\n to: { opacity: 1 },\n transition: { duration: 180, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', properties: ['opacity'] },\n reducedMotion: 'respect-user',\n },\n fadeUp: {\n from: { opacity: 0, transform: 'translateY(10px)' },\n to: { opacity: 1, transform: 'translateY(0)' },\n transition: { duration: 200, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', properties: ['opacity', 'transform'] },\n reducedMotion: 'respect-user',\n },\n fadeDown: {\n from: { opacity: 0, transform: 'translateY(-10px)' },\n to: { opacity: 1, transform: 'translateY(0)' },\n transition: { duration: 180, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', properties: ['opacity', 'transform', 'visibility'] },\n reducedMotion: 'respect-user',\n },\n slideFromRight: {\n from: { opacity: 0, transform: 'translateX(100%)' },\n to: { opacity: 1, transform: 'translateX(0)' },\n transition: { duration: 220, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', properties: ['opacity', 'transform'] },\n reducedMotion: 'respect-user',\n },\n slideFromLeft: {\n from: { opacity: 0, transform: 'translateX(-100%)' },\n to: { opacity: 1, transform: 'translateX(0)' },\n transition: { duration: 220, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', properties: ['opacity', 'transform'] },\n reducedMotion: 'respect-user',\n },\n slideFromTop: {\n from: { opacity: 0, transform: 'translateY(-100%)' },\n to: { opacity: 1, transform: 'translateY(0)' },\n transition: { duration: 220, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', properties: ['opacity', 'transform'] },\n reducedMotion: 'respect-user',\n },\n slideFromBottom: {\n from: { opacity: 0, transform: 'translateY(100%)' },\n to: { opacity: 1, transform: 'translateY(0)' },\n transition: { duration: 220, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', properties: ['opacity', 'transform'] },\n reducedMotion: 'respect-user',\n },\n press: {\n from: {},\n to: { transform: 'scale(0.97)' },\n transition: { duration: 110, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', properties: ['transform', 'box-shadow'] },\n reducedMotion: 'respect-user',\n },\n imageZoom: {\n from: { transform: 'scale(1)' },\n to: { transform: 'scale(1.06)' },\n transition: { duration: 280, easing: 'cubic-bezier(0.16, 1, 0.3, 1)', properties: ['transform'] },\n reducedMotion: 'respect-user',\n },\n};\n\nexport const components: Theme = {\n Grid: {\n Card: {\n wrapClass: '',\n className: '',\n headerClass: 'flex justify-between',\n bodyClass: 'p-0',\n footerClass: '',\n showArrow: false,\n showLoader: false,\n },\n Table: {\n wrapClass: '',\n className: 'table-striped',\n headerClass: '',\n bodyClass: '',\n footerClass: '',\n scrollClass: 'fixed-table-container',\n selectedClass: 'table-info',\n },\n Gallery: {\n wrapClass: '',\n className: '',\n scrollClass: '',\n headerClass: '',\n bodyClass: '',\n footerClass: '',\n selectedClass: 'bg-primary/20',\n gutterSize: 1,\n rowCols: 4,\n },\n Modal: {\n mode: 'form',\n size: 'lg',\n position: 'center',\n wrapClass: '',\n className: '',\n headerClass: '',\n titleClass: '',\n subTitleClass: 'pr-1 text-muted-foreground',\n bodyClass: '',\n footerClass: '',\n iconExpand: 'fullscreen',\n iconCollapse: 'fullscreen-exit',\n motion: {\n center: 'fade',\n top: 'slideFromTop',\n left: 'slideFromLeft',\n right: 'slideFromRight',\n bottom: 'slideFromBottom',\n backdrop: 'fade',\n },\n },\n i18n: {\n headerAdd: 'Aggiungi',\n headerEdit: 'Modifica',\n buttonAdd: 'Aggiungi',\n },\n },\n Table: {\n wrapClass: 'bootstrap-table',\n className: 'table-striped',\n headerClass: '',\n bodyClass: '',\n footerClass: '',\n scrollClass: 'fixed-table-container',\n selectedClass: 'table-info',\n },\n Gallery: {\n wrapClass: '',\n className: '',\n scrollClass: '',\n headerClass: '',\n bodyClass: '',\n footerClass: '',\n selectedClass: 'bg-primary/20',\n gutterSize: 4,\n rowCols: 2,\n },\n Pagination: {\n wrapClass: '',\n className: '',\n stickyClass: 'fixed-bottom mx-5',\n scrollToTop: false,\n scrollBehavior: 'auto',\n maxItems: 5,\n sticky: true,\n align: 'end',\n },\n Carousel: {\n showIndicators: true,\n showControls: true,\n showCaption: true,\n layoutDark: false,\n autoPlay: true,\n },\n Card: {\n wrapClass: '',\n className: '',\n headerClass: 'flex justify-between bg-white/[.15] font-normal',\n bodyClass: 'flex flex-col',\n footerClass: '',\n showLoader: false,\n showArrow: false,\n },\n Loader: {\n wrapClass: '',\n className: '',\n icon: 'custom-loader',\n title: 'Loading..',\n description: '',\n },\n ActionButton: {\n className: 'btn-primary',\n badgeClass: 'rounded-full bg-destructive text-destructive-foreground',\n motion: {\n press: 'press',\n },\n },\n LoadingButton: {\n className: 'btn-primary',\n badgeClass: 'rounded-full bg-destructive text-destructive-foreground',\n motion: {\n press: 'press',\n },\n },\n LinkButton: {\n className: 'btn-outline-secondary',\n },\n Alert: {\n className: '',\n },\n Badge: {\n className: '',\n },\n Modal: {\n size: 'lg',\n position: 'center',\n wrapClass: '',\n className: '',\n headerClass: '',\n titleClass: '',\n subTitleClass: 'pr-1 text-muted-foreground',\n bodyClass: '',\n footerClass: '',\n iconExpand: 'fullscreen',\n iconCollapse: 'fullscreen-exit',\n motion: {\n center: 'fade',\n top: 'slideFromTop',\n left: 'slideFromLeft',\n right: 'slideFromRight',\n bottom: 'slideFromBottom',\n backdrop: 'fade',\n },\n },\n Dropdown: {\n wrapClass: '',\n className: '',\n buttonClass: 'btn btn-outline-primary',\n badgeClass: '',\n menuClass: '',\n menuHeaderClass: '',\n menuItemClass: '',\n menuDividerClass: '',\n headerClass: '',\n footerClass: '',\n Menu: {\n wrapClass: '',\n className: 'list-none p-0 m-0',\n headerClass: '',\n itemClass: '',\n linkClass: 'flex items-center gap-2 rounded-sm px-2 py-1.5 text-sm hover:bg-accent',\n iconClass: 'text-muted-foreground',\n textClass: '',\n badgeClass: '',\n arrowClass: '',\n submenuClass: '',\n },\n motion: {\n open: 'fadeDown',\n close: 'fadeDown',\n press: 'press',\n },\n },\n Notifications: {\n wrapClass: 'menu-item',\n Dropdown: {\n className: '',\n buttonClass: 'btn btn-link',\n menuClass: 'mt-1 fs-11px w-300px pt-1',\n },\n },\n Select: {\n wrapClass: '',\n className: '',\n },\n Autocomplete: {\n wrapClass: '',\n className: '',\n },\n Form: {\n wrapClass: '',\n buttonSaveClass: 'btn-outline-primary',\n buttonDeleteClass: 'btn-outline-danger',\n buttonBackClass: 'btn-link',\n Card: {\n headerClass: '',\n bodyClass: '',\n footerClass: 'text-right',\n },\n i18n: {\n headerAdd: 'Aggiungi',\n headerEdit: 'Modifica',\n headerNewRecord: 'Nuovo Record',\n buttonSave: 'Salva',\n buttonDelete: 'Elimina',\n buttonBack: 'Indietro',\n noticeRequiredFields: 'Per favore, compila tutti i campi obbligatori',\n },\n },\n Menu: {\n wrapClass: 'flex-1 overflow-auto p-4',\n className: 'navbar-nav flex-col mb-auto',\n headerClass: '',\n itemClass: 'nav-item',\n linkClass: 'nav-link',\n iconClass: 'mr-1',\n textClass: 'flex-grow-1',\n badgeClass: 'ml-1',\n arrowClass: '',\n submenuClass: 'nav flex-col ml-4',\n },\n Brand: {\n wrapClass: '',\n className: 'brand',\n logoClass: 'navbar-brand',\n labelClass: 'navbar-text',\n },\n SignIn: {\n className: 'flex items-center',\n avatarClass: 'avatar rounded-full mx-2',\n },\n Image: {\n wrapClass: '',\n className: '',\n motion: {\n enter: 'fade',\n hover: 'imageZoom',\n },\n },\n ImageAvatar: {\n wrapClass: '',\n className: '',\n motion: { enter: 'fade', hover: 'imageZoom' },\n },\n Percentage: {\n wrapClass: '',\n className: '',\n },\n Tab: {\n wrapClass: '',\n className: '',\n motion: {\n enter: 'fadeUp',\n },\n },\n Code: {\n wrapClass: '',\n className: '',\n },\n Prompt: {\n wrapClass: '',\n className: '',\n },\n};\n\nconst definition: ThemeDefinition = { preset, motion, components };\n\nexport default definition;\n","import React, {createContext, useContext, useEffect, useMemo, useState, ReactNode} from 'react';\r\nimport _themeDefault, { components as defaultComponents } from '../themes/default';\r\nimport _themeFlat from '../themes/flat';\r\nimport _themeCyber from '../themes/cyber';\r\nimport type { MotionReference, MotionRegistry } from './motion';\r\n\r\ntype UseTheme = Theme;\r\n\r\ninterface ThemeProviderProps {\r\n children: ReactNode;\r\n config?: AppThemeProviderConfig;\r\n}\r\n\r\nexport type ThemeMode = 'light' | 'dark' | 'system';\r\n\r\n/**\r\n * Full set of semantic color design tokens, expressed as HSL channel values (\"H S% L%\").\r\n * Maps 1-to-1 with the --rf-* CSS custom properties defined in globals.css.\r\n * Both `colors` (light mode) and `dark` override sets use this shape.\r\n */\r\nexport interface ColorScale {\r\n background?: string;\r\n foreground?: string;\r\n card?: string;\r\n cardForeground?: string;\r\n popover?: string;\r\n popoverForeground?: string;\r\n primary?: string;\r\n primaryForeground?: string;\r\n secondary?: string;\r\n secondaryForeground?: string;\r\n muted?: string;\r\n mutedForeground?: string;\r\n accent?: string;\r\n accentForeground?: string;\r\n destructive?: string;\r\n destructiveForeground?: string;\r\n success?: string;\r\n successForeground?: string;\r\n warning?: string;\r\n warningForeground?: string;\r\n info?: string;\r\n infoForeground?: string;\r\n border?: string;\r\n input?: string;\r\n ring?: string;\r\n}\r\n\r\n// ─── Per-component sub-interfaces ───────────────────────────────────────────\r\n\r\nexport interface MenuTheme {\r\n wrapClass?: string;\r\n className?: string;\r\n headerClass?: string;\r\n itemClass?: string;\r\n linkClass?: string;\r\n iconClass?: string;\r\n textClass?: string;\r\n badgeClass?: string;\r\n arrowClass?: string;\r\n submenuClass?: string;\r\n}\r\n\r\nexport interface CardTheme {\r\n wrapClass?: string;\r\n className?: string;\r\n headerClass?: string;\r\n bodyClass?: string;\r\n footerClass?: string;\r\n showLoader?: boolean;\r\n showArrow?: boolean;\r\n}\r\n\r\nexport interface TableTheme {\r\n wrapClass?: string;\r\n className?: string;\r\n headerClass?: string;\r\n bodyClass?: string;\r\n footerClass?: string;\r\n scrollClass?: string;\r\n selectedClass?: string;\r\n}\r\n\r\nexport interface GalleryTheme {\r\n wrapClass?: string;\r\n className?: string;\r\n scrollClass?: string;\r\n headerClass?: string;\r\n bodyClass?: string;\r\n footerClass?: string;\r\n selectedClass?: string;\r\n gutterSize?: 0 | 1 | 2 | 3 | 4 | 5;\r\n rowCols?: 1 | 2 | 3 | 4 | 6;\r\n}\r\n\r\nexport interface ModalTheme {\r\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"fullscreen\";\r\n position?: \"center\" | \"top\" | \"left\" | \"right\" | \"bottom\";\r\n wrapClass?: string;\r\n className?: string;\r\n headerClass?: string;\r\n titleClass?: string;\r\n subTitleClass?: string;\r\n bodyClass?: string;\r\n footerClass?: string;\r\n iconExpand?: string;\r\n iconCollapse?: string;\r\n motion?: {\r\n center?: MotionReference;\r\n top?: MotionReference;\r\n left?: MotionReference;\r\n right?: MotionReference;\r\n bottom?: MotionReference;\r\n backdrop?: MotionReference;\r\n };\r\n}\r\n\r\n/**\r\n * Full typed interface for component theme overrides.\r\n * Used by app-level themeOverride. All fields are optional so you only declare what you want to change.\r\n * The `default` theme in themes/default/ provides a full reference implementation of every field.\r\n */\r\nexport interface ThemeConfig {\r\n Grid?: {\r\n Card?: CardTheme;\r\n Table?: TableTheme;\r\n Gallery?: GalleryTheme;\r\n Modal?: ModalTheme & { mode?: 'form' | 'empty' };\r\n i18n?: {\r\n headerAdd?: string;\r\n headerEdit?: string;\r\n buttonAdd?: string;\r\n };\r\n };\r\n Table?: TableTheme;\r\n Gallery?: GalleryTheme;\r\n Pagination?: {\r\n wrapClass?: string;\r\n className?: string;\r\n stickyClass?: string;\r\n scrollToTop?: boolean;\r\n scrollBehavior?: ScrollBehavior;\r\n maxItems?: number;\r\n sticky?: boolean;\r\n align?: string;\r\n };\r\n Carousel?: {\r\n showIndicators?: boolean;\r\n showControls?: boolean;\r\n showCaption?: boolean;\r\n layoutDark?: boolean;\r\n autoPlay?: any;\r\n };\r\n Card?: CardTheme;\r\n Loader?: {\r\n wrapClass?: string;\r\n className?: string;\r\n icon?: string;\r\n title?: string;\r\n description?: string;\r\n };\r\n ActionButton?: {\r\n className?: string;\r\n badgeClass?: string;\r\n motion?: {\r\n press?: MotionReference;\r\n };\r\n };\r\n LoadingButton?: {\r\n className?: string;\r\n badgeClass?: string;\r\n motion?: {\r\n press?: MotionReference;\r\n };\r\n };\r\n LinkButton?: {\r\n className?: string;\r\n };\r\n Alert?: {\r\n className?: string;\r\n };\r\n Badge?: {\r\n className?: string;\r\n };\r\n Modal?: ModalTheme;\r\n Dropdown?: {\r\n wrapClass?: string;\r\n className?: string;\r\n buttonClass?: string;\r\n badgeClass?: string;\r\n menuClass?: string;\r\n menuHeaderClass?: string;\r\n menuItemClass?: string;\r\n menuDividerClass?: string;\r\n headerClass?: string;\r\n footerClass?: string;\r\n Menu?: MenuTheme;\r\n motion?: {\r\n open?: MotionReference;\r\n close?: MotionReference;\r\n press?: MotionReference;\r\n };\r\n };\r\n Notifications?: {\r\n wrapClass?: string;\r\n Dropdown?: {\r\n className?: string;\r\n buttonClass?: string;\r\n menuClass?: string;\r\n };\r\n };\r\n Select?: {\r\n wrapClass?: string;\r\n className?: string;\r\n };\r\n Autocomplete?: {\r\n wrapClass?: string;\r\n className?: string;\r\n };\r\n Form?: {\r\n wrapClass?: string;\r\n buttonSaveClass?: string;\r\n buttonDeleteClass?: string;\r\n buttonBackClass?: string;\r\n Card?: {\r\n headerClass?: string;\r\n bodyClass?: string;\r\n footerClass?: string;\r\n };\r\n i18n?: {\r\n headerAdd?: string;\r\n headerEdit?: string;\r\n headerNewRecord?: string;\r\n buttonSave?: string;\r\n buttonDelete?: string;\r\n buttonBack?: string;\r\n noticeRequiredFields?: string;\r\n };\r\n };\r\n Menu?: MenuTheme;\r\n Brand?: {\r\n wrapClass?: string;\r\n className?: string;\r\n logoClass?: string;\r\n labelClass?: string;\r\n };\r\n SignIn?: {\r\n className?: string;\r\n avatarClass?: string;\r\n };\r\n Image?: {\r\n wrapClass?: string;\r\n className?: string;\r\n motion?: {\r\n enter?: MotionReference;\r\n hover?: MotionReference;\r\n };\r\n };\r\n ImageAvatar?: {\r\n wrapClass?: string;\r\n className?: string;\r\n motion?: { enter?: MotionReference; hover?: MotionReference };\r\n };\r\n Percentage?: {\r\n wrapClass?: string;\r\n className?: string;\r\n };\r\n Tab?: {\r\n wrapClass?: string;\r\n className?: string;\r\n motion?: {\r\n enter?: MotionReference;\r\n };\r\n };\r\n Code?: {\r\n wrapClass?: string;\r\n className?: string;\r\n };\r\n Prompt?: {\r\n wrapClass?: string;\r\n className?: string;\r\n };\r\n}\r\n\r\ntype DeepRequired<T> = {\r\n [K in keyof T]-?: NonNullable<T[K]> extends (...args: any[]) => any\r\n ? NonNullable<T[K]>\r\n : NonNullable<T[K]> extends object\r\n ? DeepRequired<NonNullable<T[K]>>\r\n : NonNullable<T[K]>;\r\n};\r\n\r\nexport type Theme = DeepRequired<ThemeConfig> & {\r\n};\r\n\r\nexport interface ThemePresetConfig {\r\n mode?: ThemeMode;\r\n radius?: number;\r\n /** CSS font-family string for the sans-serif font, e.g. `\"'Inter', sans-serif\"`. Maps to `--font-sans`. */\r\n fontSans?: string;\r\n /** CSS font-family string for the monospace font, e.g. `\"'JetBrains Mono', monospace\"`. Maps to `--font-mono`. */\r\n fontMono?: string;\r\n /** Full semantic color palette for light mode. Each value is an HSL channel string, e.g. \"221.2 83.2% 53.3%\". */\r\n colors?: ColorScale;\r\n /** Semantic color overrides applied when dark mode is active. Merged on top of `colors`. */\r\n dark?: ColorScale;\r\n /** Arbitrary CSS custom properties not covered by ColorScale, e.g. spacing or font tokens. */\r\n variables?: Record<string, string>;\r\n}\r\n\r\nexport interface ThemeDefinition {\r\n preset: ThemePresetConfig;\r\n motion: MotionRegistry;\r\n components: Theme;\r\n}\r\n\r\n/** IDs of built-in themes. Extend by adding entries to BUILT_IN_THEMES. */\r\nexport const BUILT_IN_THEME_IDS = ['default', 'flat', 'cyber'] as const;\r\nexport type BuiltInThemeId = (typeof BUILT_IN_THEME_IDS)[number];\r\n\r\nexport type AppThemeProviderConfig =\r\n | BuiltInThemeId\r\n | ThemeDefinition\r\n | {\r\n defaultMode?: ThemeMode;\r\n theme?: string;\r\n themes?: Record<string, ThemeDefinition>;\r\n themeOverride?: ThemeConfig;\r\n };\r\n\r\nexport interface ThemeController {\r\n mode: ThemeMode;\r\n resolvedMode: 'light' | 'dark';\r\n theme: string;\r\n primary: string;\r\n primaryForeground: string;\r\n radius: number;\r\n fontSans: string;\r\n fontMono: string;\r\n colors: ColorScale | undefined;\r\n dark: ColorScale | undefined;\r\n themes: Record<string, ThemeDefinition>;\r\n setMode: (mode: ThemeMode) => void;\r\n toggleMode: () => void;\r\n applyTheme: (theme: string) => void;\r\n setPrimary: (primary: string) => void;\r\n setRadius: (radius: number) => void;\r\n setFont: (fontSans: string, fontMono?: string) => void;\r\n setColors: (colors: ColorScale) => void;\r\n setTokens: (tokens: Partial<ColorScale>) => void;\r\n}\r\n\r\nconst ThemeContext = createContext<Theme>(defaultComponents);\r\nconst MotionRegistryContext = createContext<MotionRegistry>(_themeDefault.motion);\r\nconst ThemeControllerContext = createContext<ThemeController | null>(null);\r\n\r\nexport const BUILT_IN_THEMES: Record<BuiltInThemeId, ThemeDefinition> = {\r\n default: _themeDefault,\r\n flat: _themeFlat,\r\n cyber: _themeCyber,\r\n};\r\n\r\n// Funzione per unire profondamente due oggetti\r\nconst deepMerge = (target: any, source: any) => {\r\n for (const key in source) {\r\n if (source.hasOwnProperty(key)) {\r\n if (typeof source[key] === 'object' && source[key] !== null) {\r\n if (!target[key]) {\r\n target[key] = {};\r\n }\r\n deepMerge(target[key], source[key]);\r\n } else if(source[key] !== null) {\r\n target[key] = source[key];\r\n }\r\n }\r\n }\r\n return target;\r\n};\r\n\r\nconst cloneTheme = (theme: Theme): Theme => deepMerge({}, theme);\r\n\r\nfunction isThemeDefinition(config: unknown): config is ThemeDefinition {\r\n return typeof config === 'object'\r\n && config !== null\r\n && 'preset' in config\r\n && 'motion' in config\r\n && 'components' in config;\r\n}\r\n\r\nfunction normalizeThemeProviderConfig(config?: AppThemeProviderConfig): {\r\n defaultMode?: ThemeMode;\r\n theme: string;\r\n themes: Record<string, ThemeDefinition>;\r\n themeOverride?: ThemeConfig;\r\n} {\r\n if (typeof config === 'string' || typeof config === 'undefined') {\r\n return {\r\n theme: config ?? 'default',\r\n themes: { ...BUILT_IN_THEMES },\r\n };\r\n }\r\n\r\n if (isThemeDefinition(config)) {\r\n return {\r\n theme: 'custom',\r\n themes: { ...BUILT_IN_THEMES, custom: config },\r\n };\r\n }\r\n\r\n return {\r\n defaultMode: config.defaultMode,\r\n theme: config.theme ?? 'default',\r\n themes: { ...BUILT_IN_THEMES, ...(config.themes ?? {}) },\r\n themeOverride: config.themeOverride,\r\n };\r\n}\r\nfunction resolveMode(mode: ThemeMode): 'light' | 'dark' {\r\n if (mode !== 'system') return mode;\r\n if (typeof window === 'undefined' || !window.matchMedia) return 'light';\r\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\r\n}\r\n\r\nfunction colorKeyToCssVar(key: string): string {\r\n return '--rf-' + key.replace(/([A-Z])/g, (m) => `-${m.toLowerCase()}`);\r\n}\r\n\r\nfunction applyThemeVars({\r\n mode,\r\n radius,\r\n fontSans,\r\n fontMono,\r\n colors,\r\n dark,\r\n variables,\r\n}: {\r\n mode: ThemeMode;\r\n radius: number;\r\n fontSans?: string;\r\n fontMono?: string;\r\n colors?: ColorScale;\r\n dark?: ColorScale;\r\n variables?: Record<string, string>;\r\n}) {\r\n if (typeof document === 'undefined') return;\r\n\r\n document.documentElement.classList.toggle('dark', resolveMode(mode) === 'dark');\r\n\r\n const lightVars: Record<string, string> = {};\r\n const darkVars: Record<string, string> = {};\r\n\r\n for (const [key, value] of Object.entries(colors ?? {})) {\r\n if (value !== undefined) lightVars[colorKeyToCssVar(key)] = value as string;\r\n }\r\n for (const [key, value] of Object.entries(dark ?? {})) {\r\n if (value !== undefined) darkVars[colorKeyToCssVar(key)] = value as string;\r\n }\r\n\r\n lightVars['--radius'] = `${radius}rem`;\r\n lightVars['--radius-sm'] = `${(radius * 0.5).toFixed(4).replace(/\\.?0+$/, '')}rem`;\r\n lightVars['--radius-md'] = `${(radius * 0.75).toFixed(4).replace(/\\.?0+$/, '')}rem`;\r\n lightVars['--radius-lg'] = `${radius}rem`;\r\n lightVars['--radius-xl'] = `${(radius * 1.5).toFixed(4).replace(/\\.?0+$/, '')}rem`;\r\n lightVars['--radius-2xl'] = `${(radius * 2).toFixed(4).replace(/\\.?0+$/, '')}rem`;\r\n lightVars['--radius-3xl'] = `${(radius * 3).toFixed(4).replace(/\\.?0+$/, '')}rem`;\r\n\r\n if (fontSans) lightVars['--font-sans'] = fontSans;\r\n if (fontMono) lightVars['--font-mono'] = fontMono;\r\n\r\n for (const [key, value] of Object.entries(variables ?? {})) {\r\n lightVars[key.startsWith('--') ? key : `--${key}`] = value;\r\n }\r\n\r\n // Inject/update a single <style> tag — appended to <head> so it wins over the CSS file\r\n let el = document.getElementById('rf-theme-vars') as HTMLStyleElement | null;\r\n if (!el) {\r\n el = document.createElement('style');\r\n el.id = 'rf-theme-vars';\r\n document.head.appendChild(el);\r\n }\r\n const toDecls = (map: Record<string, string>) =>\r\n Object.entries(map).map(([k, v]) => ` ${k}: ${v};`).join('\\n');\r\n el.textContent = [\r\n Object.keys(lightVars).length ? `:root {\\n${toDecls(lightVars)}\\n}` : '',\r\n Object.keys(darkVars).length ? `.dark {\\n${toDecls(darkVars)}\\n}` : '',\r\n ].filter(Boolean).join('\\n');\r\n}\r\n\r\nexport const PLACEHOLDER_IMAGE = \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjEwMCIgaGVpZ2h0PSIxMDAiIGZpbGw9InRyYW5zcGFyZW50Ii8+PGNpcmNsZSBjeD0iNjUiIGN5PSIzNSIgcj0iMTAiIGZpbGw9IiM5Y2EzYWYiLz48cGF0aCBkPSJNMTAsNzUgTDMyLDUwIEw1Miw3MCBMNjgsNTIgTDkwLDcyIEw5MCw4MCBIMTAgWiIgZmlsbD0iIzljYTNhZiIvPjwvc3ZnPg==\";\r\nexport const PLACEHOLDER_USER = \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='100' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='50' fill='%23eef2f7'/%3E%3Ccircle cx='50' cy='38' r='16' fill='%2364758b'/%3E%3Cpath d='M22 84c3.8-20 19-31 28-31s24.2 11 28 31c.5 2.8-1.7 5-4.5 5h-47c-2.8 0-5-2.2-4.5-5z' fill='%2364758b'/%3E%3C/svg%3E\";\r\nexport const PLACEHOLDER_BRAND = \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+PHBhdGggZD0iTTUwIDE1IEw4NSA1MCBMNTAgODUgTDE1IDUwIFoiIGZpbGw9IiNjY2MiIG9wYWNpdHk9IjAuMiIvPjxwYXRoIGQ9Ik01MCAzMCBMNzAgNTAgTDUwIDcwIEwzMCA1MCBaIiBmaWxsPSIjY2NjIi8+PC9zdmc+\";\r\n\r\n\r\nexport const ThemeProvider = ({\r\n children,\r\n config = undefined\r\n}: ThemeProviderProps) => {\r\n const normalized = useMemo(() => normalizeThemeProviderConfig(config), [config]);\r\n const initialDefinition = normalized.themes[normalized.theme] ?? normalized.themes.default;\r\n const initialThemePreset = initialDefinition.preset;\r\n const [themeRegistry, setThemeRegistry] = useState<Record<string, ThemeDefinition>>(normalized.themes);\r\n const [activeTheme, setActiveTheme] = useState(normalized.theme);\r\n const [mode, setMode] = useState<ThemeMode>(normalized.defaultMode ?? initialThemePreset.mode ?? 'light');\r\n const [radius, setRadius] = useState(initialThemePreset.radius ?? BUILT_IN_THEMES.default.preset.radius!);\r\n const [fontSans, setFontSans] = useState(initialThemePreset.fontSans ?? '');\r\n const [fontMono, setFontMono] = useState(initialThemePreset.fontMono ?? '');\r\n const [themeColors, setThemeColors] = useState<ColorScale | undefined>(initialThemePreset.colors);\r\n const [themeDark, setThemeDark] = useState<ColorScale | undefined>(initialThemePreset.dark);\r\n const [theme, setTheme] = useState<Theme>(() => cloneTheme(initialDefinition.components));\r\n const [motionRegistry, setMotionRegistry] = useState<MotionRegistry>(initialDefinition.motion);\r\n\r\n useEffect(() => {\r\n const selectedDefinition = normalized.themes[normalized.theme] ?? normalized.themes.default;\r\n const selectedPreset = selectedDefinition.preset;\r\n setThemeRegistry(normalized.themes);\r\n setActiveTheme(normalized.theme);\r\n setMode(normalized.defaultMode ?? selectedPreset.mode ?? 'light');\r\n setRadius(selectedPreset.radius ?? BUILT_IN_THEMES.default.preset.radius!);\r\n setFontSans(selectedPreset.fontSans ?? '');\r\n setFontMono(selectedPreset.fontMono ?? '');\r\n setThemeColors(selectedPreset.colors);\r\n setThemeDark(selectedPreset.dark);\r\n setMotionRegistry(selectedDefinition.motion);\r\n }, [normalized]);\r\n\r\n useEffect(() => {\r\n const currentDefinition = themeRegistry[activeTheme] ?? themeRegistry.default;\r\n const nextTheme = cloneTheme(currentDefinition.components);\r\n deepMerge(nextTheme, normalized.themeOverride ?? {});\r\n setTheme(nextTheme);\r\n setMotionRegistry(currentDefinition.motion);\r\n }, [activeTheme, normalized.themeOverride, themeRegistry]);\r\n\r\n useEffect(() => {\r\n const currentPreset = (themeRegistry[activeTheme] ?? themeRegistry.default).preset;\r\n applyThemeVars({\r\n mode, radius, fontSans, fontMono,\r\n colors: themeColors,\r\n dark: themeDark,\r\n variables: currentPreset.variables,\r\n });\r\n }, [mode, themeRegistry, activeTheme, radius, fontSans, fontMono, themeColors, themeDark]);\r\n\r\n const controller = useMemo<ThemeController>(() => ({\r\n mode,\r\n resolvedMode: resolveMode(mode),\r\n theme: activeTheme,\r\n primary: themeColors?.primary ?? BUILT_IN_THEMES.default.preset.colors!.primary!,\r\n primaryForeground: themeColors?.primaryForeground ?? BUILT_IN_THEMES.default.preset.colors!.primaryForeground!,\r\n radius,\r\n fontSans,\r\n fontMono,\r\n colors: themeColors,\r\n dark: themeDark,\r\n themes: themeRegistry,\r\n setMode,\r\n toggleMode() {\r\n setMode((current) => resolveMode(current) === 'dark' ? 'light' : 'dark');\r\n },\r\n applyTheme(nextTheme: string) {\r\n const selectedDefinition = themeRegistry[nextTheme];\r\n if (!selectedDefinition) {\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.warn(`[ThemeProvider] Unknown theme \"${nextTheme}\", falling back to \"default\".`);\r\n }\r\n nextTheme = 'default';\r\n }\r\n const resolvedPreset = (themeRegistry[nextTheme] ?? themeRegistry.default).preset;\r\n setActiveTheme(nextTheme);\r\n setMode(resolvedPreset.mode ?? 'light');\r\n setRadius(resolvedPreset.radius ?? BUILT_IN_THEMES.default.preset.radius!);\r\n setFontSans(resolvedPreset.fontSans ?? '');\r\n setFontMono(resolvedPreset.fontMono ?? '');\r\n setThemeColors(resolvedPreset.colors);\r\n setThemeDark(resolvedPreset.dark);\r\n },\r\n setPrimary(primary: string) {\r\n const h = primary.split(' ')[0];\r\n setThemeColors((current) => ({\r\n ...current,\r\n primary,\r\n ring: primary,\r\n secondary: `${h} 40% 96%`,\r\n secondaryForeground: `${h} 47% 11%`,\r\n accent: `${h} 40% 94%`,\r\n accentForeground: `${h} 47% 11%`,\r\n }));\r\n setThemeDark((current) => ({\r\n ...current,\r\n primary,\r\n ring: primary,\r\n secondary: `${h} 30% 18%`,\r\n secondaryForeground: `${h} 10% 96%`,\r\n accent: `${h} 30% 18%`,\r\n accentForeground: `${h} 10% 96%`,\r\n }));\r\n },\r\n setRadius,\r\n setFont(sans: string, mono?: string) {\r\n setFontSans(sans);\r\n if (mono !== undefined) setFontMono(mono);\r\n },\r\n setColors(colors: ColorScale) {\r\n setThemeColors(colors);\r\n },\r\n setTokens(tokens: Partial<ColorScale>) {\r\n setThemeColors((c) => ({ ...c, ...tokens }));\r\n setThemeDark((c) => ({ ...c, ...tokens }));\r\n },\r\n }), [mode, activeTheme, radius, fontSans, fontMono, themeColors, themeDark, themeRegistry]);\r\n\r\n return (\r\n <ThemeControllerContext.Provider value={controller}>\r\n <MotionRegistryContext.Provider value={motionRegistry}>\r\n <ThemeContext.Provider value={theme}>\r\n {children}\r\n </ThemeContext.Provider>\r\n </MotionRegistryContext.Provider>\r\n </ThemeControllerContext.Provider>\r\n );\r\n};\r\n\r\nexport const useTheme = (_scope?: string): UseTheme => {\r\n return useContext(ThemeContext) as Theme;\r\n};\r\n\r\nexport const useMotionRegistry = (): MotionRegistry => {\r\n return useContext(MotionRegistryContext);\r\n};\r\n\r\nexport const useThemeController = (): ThemeController => {\r\n const controller = useContext(ThemeControllerContext);\r\n if (!controller) {\r\n throw new Error('useThemeController must be used inside <App> or <ThemeProvider>.');\r\n }\r\n return controller;\r\n};\r\n","import React, { CSSProperties, ReactNode } from 'react';\r\n\r\ntype ContainerProps = {\r\n children?: ReactNode;\r\n className?: string;\r\n style?: CSSProperties;\r\n onClick?: () => void;\r\n};\r\n\r\ntype ColProps = ContainerProps & {\r\n defaultSize?: number;\r\n xxl?: number | 'auto';\r\n xl?: number | 'auto';\r\n lg?: number | 'auto';\r\n md?: number | 'auto';\r\n sm?: number | 'auto';\r\n xs?: number | 'auto';\r\n};\r\n\r\nexport const Wrapper = ({\r\n children = undefined,\r\n className = undefined,\r\n style = undefined,\r\n onClick = undefined,\r\n} : ContainerProps) => {\r\n return className\r\n ? <div className={className} style={style} onClick={onClick}>{children}</div>\r\n : <>{children}</>;\r\n};\r\n\r\n\r\nexport const Container = ({\r\n children = undefined,\r\n className = undefined,\r\n style = undefined\r\n}: ContainerProps) => {\r\n const fullClassName = className ? `container ${className}` : 'container';\r\n\r\n return (<div className={fullClassName} style={style}>{children}</div>);\r\n};\r\n\r\nexport const Row = ({\r\n children = undefined,\r\n className = undefined,\r\n style = undefined\r\n}: ContainerProps) => {\r\n const fullClassName = className ? `row ${className}` : 'row';\r\n\r\n return (<div className={fullClassName} style={style}>{children}</div>);\r\n};\r\n\r\nexport const Col = ({\r\n children = undefined,\r\n className = undefined,\r\n style = undefined,\r\n xxl = undefined,\r\n xl = undefined,\r\n lg = undefined,\r\n md = undefined,\r\n sm = undefined,\r\n xs = undefined\r\n}: ColProps) => {\r\n const entries = (\r\n [\r\n [\"\", xs],\r\n [\"-sm\", sm],\r\n [\"-md\", md],\r\n [\"-lg\", lg],\r\n [\"-xl\", xl],\r\n [\"-xxl\", xxl],\r\n ]\r\n ).filter(([, v]) => v !== undefined);\r\n\r\n const classParts = entries.reduce<string[]>((acc, [bp, val], i) => {\r\n if (i === 0 || val !== entries[i - 1][1]) {\r\n acc.push(`col${bp}-${val}`);\r\n }\r\n return acc;\r\n }, []);\r\n\r\n\r\n const fullClassName = (classParts.join(\" \") || `col`) + (className ? ` ${className}` : \"\");\r\n\r\n return <div className={fullClassName} style={style}>{children}</div>;\r\n};\r\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import React from \"react\";\nimport {useTheme} from \"../../Theme\";\nimport type { UIProps } from '../types';\nimport { Wrapper } from \"./GridSystem\";\nimport { cn } from '../../libs/cn';\n\r\nexport type BadgeType = \"info\" | \"success\" | \"warning\" | \"danger\" | \"primary\" | \"secondary\" | \"light\" | \"dark\";\n\nexport type BadgeDescriptor = {\n content: React.ReactNode;\n type?: BadgeType;\n className?: string;\n};\n\nexport type BadgeProps = React.ReactNode | BadgeDescriptor;\n\nexport function isBadgeDescriptor(value: BadgeProps | undefined): value is BadgeDescriptor {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !React.isValidElement(value) &&\n \"content\" in value\n );\n}\n\nexport function normalizeBadgeProps(\n value: BadgeProps | undefined,\n fallbackType: BadgeType = \"info\",\n fallbackClassName?: string\n): BadgeDescriptor | undefined {\n if (value === undefined || value === null || value === false) return undefined;\n\n if (isBadgeDescriptor(value)) {\n return {\n ...value,\n type: value.type || fallbackType,\n className: cn(value.className, fallbackClassName),\n };\n }\n\n return {\n content: value,\n type: fallbackType,\n className: fallbackClassName,\n };\n}\n\nexport type BadgeOverlayProps = {\n badge?: BadgeProps;\n content?: React.ReactNode;\n type?: BadgeType;\n defaultType?: BadgeType;\n className?: string;\n descriptorOnly?: boolean;\n children?: React.ReactNode;\n};\n\nexport const BadgeOverlay = ({\n badge,\n content = undefined,\n type = undefined,\n defaultType = \"info\",\n className = undefined,\n descriptorOnly = false,\n children = undefined\n}: BadgeOverlayProps): React.ReactNode => {\n const value = content !== undefined\n ? { content, type, className }\n : badge;\n\n if (descriptorOnly && content === undefined && !isBadgeDescriptor(badge)) return badge ?? null;\n\n const normalized = normalizeBadgeProps(value, type || defaultType, className);\n\n if (!normalized) return children ?? null;\n\n if (children !== undefined) {\n return (\n <Badge type={normalized.type} post={normalized.content} className={normalized.className}>\n {children}\n </Badge>\n );\n }\n\n return (\n <Badge type={normalized.type} className={normalized.className}>\n {normalized.content}\n </Badge>\n );\n};\n\nexport type BadgeComponentProps = {\n children: string | React.ReactNode;\n type?: BadgeType;\n} & UIProps;\n\r\nconst Badge = ({\r\n children,\r\n type = \"info\",\r\n pre = undefined,\r\n post = undefined,\n wrapClass = undefined,\n className = undefined\n}: BadgeComponentProps) => {\n const theme = useTheme(\"badge\");\r\n\r\n // Overlay mode: children is a React element (not a plain string/number)\r\n if (React.isValidElement(children)) {\r\n const badgeClass = cn(\"badge badge-overlay badge-\" + type, \"absolute top-0 z-10\", className || theme.Badge.className);\r\n return (\r\n <span className={cn(\"relative inline-flex\", wrapClass)}>\r\n {children}\r\n {pre !== undefined && (\r\n <span className={cn(badgeClass, \"left-0 -translate-x-1/2 -translate-y-1/2\")}>{pre}</span>\r\n )}\r\n {post !== undefined && (\r\n <span className={cn(badgeClass, \"right-0 translate-x-1/2 -translate-y-1/2\")}>{post}</span>\r\n )}\r\n {pre === undefined && post === undefined && (\r\n <span className={cn(badgeClass, \"right-0 translate-x-1/2 -translate-y-1/2 !p-0 !min-w-0 w-2.5 h-2.5 rounded-full\")} />\r\n )}\r\n </span>\r\n );\r\n }\r\n\r\n return (\r\n <Wrapper className={wrapClass}>\r\n {pre}\r\n <span className={cn(\"badge badge-\" + type, className || theme.Badge.className)}>\r\n {children}\r\n </span>\r\n {post}\r\n </Wrapper>\r\n );\r\n}\r\n\r\nexport default Badge;\r\n","import * as LucideIcons from 'lucide-react';\nimport type { IconProviderAdapter, IconComponentProps } from './IconProvider';\n\n// Names that diverge from kebab→PascalCase convention in Lucide\nconst ALIASES: Record<string, string> = {\n 'add': 'Plus',\n 'arrow-arc-left': 'Undo2',\n 'arrow-arc-right': 'Redo2',\n 'arrow-line-down': 'FlipVertical',\n 'arrow-line-right': 'FlipHorizontal',\n 'camera-rotate': 'RotateCw',\n 'caret-down': 'ChevronDown',\n 'caret-right': 'ChevronRight',\n 'close': 'X',\n 'dashboard': 'LayoutDashboard',\n 'edit': 'Pencil',\n 'file': 'FileText',\n 'floppy-disk': 'Save',\n 'fullscreen': 'Maximize',\n 'fullscreen-exit': 'Minimize',\n 'github': 'GitBranch',\n 'house-door': 'Home',\n 'link-break': 'Unlink',\n 'magnifying-glass-minus': 'ZoomOut',\n 'magnifying-glass-plus': 'ZoomIn',\n 'rectangle': 'Square',\n 'text-t': 'Type',\n 'trash': 'Trash2',\n 'warning': 'TriangleAlert',\n};\n\nfunction toPascalCase(name: string): string {\n return name.split('-').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join('');\n}\n\nexport class LucideIconProvider implements IconProviderAdapter {\n readonly id = 'lucide' as const;\n\n resolve(name: string): import('react').ComponentType<IconComponentProps> | null {\n const key = ALIASES[name] ?? toPascalCase(name);\n return (LucideIcons as unknown as Record<string, import('react').ComponentType<IconComponentProps>>)[key] ?? null;\n }\n}\n","import React from 'react';\nimport * as PhosphorIcons from '@phosphor-icons/react';\nimport type { IconProviderAdapter, IconComponentProps } from './IconProvider';\n\nexport type PhosphorWeight = 'thin' | 'light' | 'regular' | 'bold' | 'fill' | 'duotone';\n\n// Names that diverge from kebab→PascalCase convention in Phosphor\nconst ALIASES: Record<string, string> = {\n 'add': 'Plus',\n 'arrow-arc-left': 'ArrowArcLeft',\n 'arrow-arc-right': 'ArrowArcRight',\n 'arrow-line-down': 'ArrowLineDown',\n 'arrow-line-right': 'ArrowLineRight',\n 'camera-rotate': 'CameraRotate',\n 'caret-down': 'CaretDown',\n 'caret-right': 'CaretRight',\n 'close': 'X',\n 'dashboard': 'SquaresFour',\n 'edit': 'PencilSimple',\n 'external-link': 'ArrowSquareOut',\n 'file': 'FileText',\n 'floppy-disk': 'FloppyDisk',\n 'fullscreen': 'CornersOut',\n 'fullscreen-exit': 'CornersIn',\n 'github': 'GithubLogo',\n 'house-door': 'House',\n 'link-break': 'LinkBreak',\n 'magnifying-glass-minus': 'MagnifyingGlassMinus',\n 'magnifying-glass-plus': 'MagnifyingGlassPlus',\n 'menu': 'List',\n 'rectangle': 'Rectangle',\n 'search': 'MagnifyingGlass',\n 'settings': 'Gear',\n 'text-t': 'TextT',\n 'trash': 'Trash',\n 'warning': 'Warning',\n 'layers': 'Stack',\n};\n\nfunction toPascalCase(name: string): string {\n return name.split('-').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join('');\n}\n\nexport class PhosphorIconProvider implements IconProviderAdapter {\n readonly id = 'phosphor' as const;\n private readonly _cache = new Map<string, React.ComponentType<IconComponentProps>>();\n\n constructor(private readonly weight: PhosphorWeight = 'regular') {}\n\n resolve(name: string): React.ComponentType<IconComponentProps> | null {\n const cached = this._cache.get(name);\n if (cached) return cached;\n\n const key = ALIASES[name] ?? toPascalCase(name);\n const Base = (PhosphorIcons as unknown as Record<string, React.ComponentType<IconComponentProps & { weight?: PhosphorWeight }>>)[key];\n if (!Base) return null;\n\n const resolved: React.ComponentType<IconComponentProps> =\n this.weight === 'regular'\n ? Base\n : (props: IconComponentProps) =>\n React.createElement(Base, { weight: this.weight, ...props } as IconComponentProps & { weight: PhosphorWeight });\n\n this._cache.set(name, resolved);\n return resolved;\n }\n}\n","import React from 'react';\nimport type { IconProviderAdapter } from './IconProvider';\nimport { LucideIconProvider } from './LucideIconProvider';\nimport { PhosphorIconProvider } from './PhosphorIconProvider';\n\nconst IconProviderContext = React.createContext<IconProviderAdapter | null>(null);\nconst IconControllerContext = React.createContext<IconController | null>(null);\n\n/** Built-in icon provider identifiers. */\nexport type BuiltInIconProviderId = 'lucide' | 'phosphor';\n\n/**\n * Configuration for the icon provider.\n *\n * - `BuiltInIconProviderId` string: selects a built-in provider (`'lucide'` | `'phosphor'`)\n * - `IconProviderAdapter` instance: use a custom provider directly\n * - object `{ provider, aliases? }`: custom provider with optional icon name aliases\n *\n * @example\n * iconProvider=\"phosphor\"\n *\n * @example\n * iconProvider={new HeroIconProvider()}\n *\n * @example\n * iconProvider={{ provider: new HeroIconProvider(), aliases: { delete: 'trash', edit: 'pencil' } }}\n */\nexport type AppIconProviderConfig =\n | BuiltInIconProviderId\n | IconProviderAdapter\n | {\n /** The icon provider instance to use. */\n provider: IconProviderAdapter;\n /** Map icon name aliases to actual icon names in this provider (`{ delete: 'trash' }`). */\n aliases?: Record<string, string>;\n }\n | {\n /** ID of the default provider to activate. Must be a key in `providers` or a built-in id. */\n default: string;\n /** Additional providers to register alongside the built-in ones. */\n providers: Record<string, IconProviderAdapter>;\n /** Map icon name aliases to actual icon names (`{ delete: 'trash' }`). */\n aliases?: Record<string, string>;\n };\n\nexport interface IconController {\n providerId: string;\n providers: Record<string, IconProviderAdapter>;\n aliases: Record<string, string>;\n setProvider: (id: string) => void;\n registerProvider: (id: string, provider: IconProviderAdapter) => void;\n resolve: IconProviderAdapter['resolve'];\n}\n\nconst BUILT_IN_ICON_PROVIDERS: Record<string, IconProviderAdapter> = {\n lucide: new LucideIconProvider(),\n phosphor: new PhosphorIconProvider(),\n};\n\nconst DEFAULT_ICON_PROVIDER_ID = 'lucide';\n\nfunction isIconProvider(value: unknown): value is IconProviderAdapter {\n return Boolean(value)\n && typeof value === 'object'\n && typeof (value as IconProviderAdapter).id === 'string'\n && typeof (value as IconProviderAdapter).resolve === 'function';\n}\n\nfunction normalizeIconProviderConfig(config?: AppIconProviderConfig): {\n defaultId: string;\n providers: Record<string, IconProviderAdapter>;\n aliases: Record<string, string>;\n} {\n if (!config) {\n return { defaultId: DEFAULT_ICON_PROVIDER_ID, providers: { ...BUILT_IN_ICON_PROVIDERS }, aliases: {} };\n }\n\n if (typeof config === 'string') {\n return { defaultId: config, providers: { ...BUILT_IN_ICON_PROVIDERS }, aliases: {} };\n }\n\n if (isIconProvider(config)) {\n return {\n defaultId: config.id,\n providers: { ...BUILT_IN_ICON_PROVIDERS, [config.id]: config },\n aliases: {},\n };\n }\n\n // multi-provider form: { default, providers, aliases? }\n if ('default' in config && 'providers' in config) {\n const c = config as { default: string; providers: Record<string, IconProviderAdapter>; aliases?: Record<string, string> };\n return {\n defaultId: c.default,\n providers: { ...BUILT_IN_ICON_PROVIDERS, ...c.providers },\n aliases: c.aliases ?? {},\n };\n }\n\n // single-provider form: { provider, aliases? }\n return {\n defaultId: config.provider.id,\n providers: { ...BUILT_IN_ICON_PROVIDERS, [config.provider.id]: config.provider },\n aliases: config.aliases ?? {},\n };\n}\n\nfunction createAliasedProvider(provider: IconProviderAdapter, aliases: Record<string, string>): IconProviderAdapter {\n if (Object.keys(aliases).length === 0) return provider;\n\n return {\n id: provider.id,\n resolve(name) {\n return provider.resolve(aliases[name] ?? name);\n },\n };\n}\n\nexport function IconProvider({\n provider,\n config,\n children,\n}: {\n provider?: IconProviderAdapter;\n config?: AppIconProviderConfig;\n children: React.ReactNode;\n}) {\n const normalized = React.useMemo(\n () => normalizeIconProviderConfig(config ?? provider),\n [config, provider]\n );\n const [providers, setProviders] = React.useState(normalized.providers);\n const [providerId, setProviderId] = React.useState(normalized.defaultId);\n\n React.useEffect(() => {\n setProviders(normalized.providers);\n setProviderId(normalized.defaultId);\n }, [normalized]);\n\n const activeProvider = providers[providerId] ?? providers[DEFAULT_ICON_PROVIDER_ID];\n const providerWithAliases = React.useMemo(\n () => activeProvider ? createAliasedProvider(activeProvider, normalized.aliases) : null,\n [activeProvider, normalized.aliases]\n );\n\n const controller = React.useMemo<IconController>(() => ({\n providerId: activeProvider?.id ?? DEFAULT_ICON_PROVIDER_ID,\n providers,\n aliases: normalized.aliases,\n setProvider(id: string) {\n if (providers[id]) {\n setProviderId(id);\n return;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`[IconProvider] Unknown provider \"${id}\", falling back to \"${DEFAULT_ICON_PROVIDER_ID}\".`);\n }\n setProviderId(DEFAULT_ICON_PROVIDER_ID);\n },\n registerProvider(id: string, registeredProvider: IconProviderAdapter) {\n setProviders((current) => ({ ...current, [id]: registeredProvider }));\n },\n resolve(name: string) {\n return providerWithAliases?.resolve(name) ?? null;\n },\n }), [activeProvider, providers, normalized.aliases, providerWithAliases]);\n\n return (\n <IconControllerContext.Provider value={controller}>\n <IconProviderContext.Provider value={providerWithAliases}>\n {children}\n </IconProviderContext.Provider>\n </IconControllerContext.Provider>\n );\n}\n\nexport function useIconProvider(): IconProviderAdapter | null {\n return React.useContext(IconProviderContext);\n}\n\nexport function useIconController(): IconController {\n const controller = React.useContext(IconControllerContext);\n if (!controller) {\n throw new Error('useIconController must be used inside <App> or <IconProvider>.');\n }\n return controller;\n}\n","import React from 'react';\nimport { useIconProvider } from '../../providers/icon/IconProviderContext';\nimport type { IconProviderAdapter } from '../../providers/icon/IconProvider';\nimport { LucideIconProvider } from '../../providers/icon/LucideIconProvider';\n\ninterface IconProps {\n name?: string;\n size?: number;\n className?: string;\n style?: React.CSSProperties;\n /** Override the global icon provider for this instance only */\n provider?: IconProviderAdapter;\n label?: string;\n}\n\nconst defaultProvider = new LucideIconProvider();\n\nconst Icon = ({ name, size = 16, className, style, provider: overrideProvider, label }: IconProps) => {\n const contextProvider = useIconProvider();\n const provider = overrideProvider ?? contextProvider ?? defaultProvider;\n if (!provider || typeof name !== 'string' || !name.trim()) return null;\n const Component = provider.resolve(name);\n if (!Component) return null;\n return <Component size={size} className={className} style={style} aria-label={label} aria-hidden={label ? undefined : true} />;\n};\n\nexport default Icon;\n","import React, { useEffect, useState } from 'react';\r\nimport { useMenu } from '../../App';\r\nimport { useTheme } from '../../Theme';\r\nimport { Link } from 'react-router-dom';\r\nimport { Wrapper } from '../ui/GridSystem';\nimport Badge, { BadgeType } from '../ui/Badge';\nimport { isInteractiveElement } from '../../libs/utils';\nimport Icon from '../ui/Icon';\n\r\ninterface MenuProps {\r\n context: string;\r\n Type?: 'ul' | 'ol';\r\n badges?: Record<string, { type?: BadgeType, children: string }>;\n pre?: React.ReactNode;\r\n post?: React.ReactNode;\r\n wrapClass?: string;\r\n className?: string;\r\n headerClass?: string;\r\n itemClass?: string;\r\n linkClass?: string;\r\n iconClass?: string;\r\n textClass?: string;\r\n badgeClass?: string;\r\n arrowClass?: string;\r\n submenuClass?: string;\r\n}\r\n\r\nconst Menu = ({\r\n context,\r\n Type = 'ul',\r\n badges = {},\r\n pre = undefined,\r\n post = undefined,\r\n wrapClass = undefined,\r\n className = undefined,\r\n headerClass = undefined,\r\n itemClass = undefined,\r\n linkClass = undefined,\r\n iconClass = undefined,\r\n textClass = undefined,\r\n badgeClass = undefined,\r\n arrowClass = undefined,\r\n submenuClass = undefined,\r\n}: MenuProps) => {\r\n const menu = useMenu(context);\r\n const theme = useTheme('menu');\r\n\r\n const MenuItem = ({ item, index }: { item: any; index: number }) => {\r\n const [isOpen, setIsOpen] = useState<boolean>(item.active);\r\n\r\n useEffect(() => {\r\n setIsOpen(item.active);\r\n }, [item]);\r\n\r\n const hasChildren = item.children?.length > 0;\r\n const key = item.title.toLowerCase();\r\n const MenuIcon = () => (\n <span className={iconClass ?? theme.Menu.iconClass}>\n <Icon name={item.icon} />\n </span>\n );\n\r\n if (!item.path) {\r\n return (\r\n <li key={index} className={headerClass ?? theme.Menu.headerClass}>\r\n {item.icon && <MenuIcon />}\n {item.title && (/^-+$/.test(item.title) ? <hr className={\"m-0\"} /> : <span>{item.title}</span>)}\r\n </li>\r\n );\r\n }\r\n\r\n return (\r\n <li className={`${item.active ? 'active ' : ''}${itemClass ?? theme.Menu.itemClass}`}>\r\n <Link\r\n to={item.path.split(\"*\")[0]}\r\n className={linkClass ?? theme.Menu.linkClass}\r\n {...(hasChildren && {\r\n\r\n })}\r\n onClick={(e) => {\r\n if (hasChildren && !isInteractiveElement(e, 'a')) {\r\n e.preventDefault();\r\n setIsOpen(prev => !prev)\r\n }\r\n }}\r\n >\r\n {item.icon && <MenuIcon />}\n <span className={textClass ?? theme.Menu.textClass}>\r\n {item.title}\r\n </span>\r\n {badges[key] && (\r\n <Badge type={badges[key].type} className={badgeClass ?? theme.Menu.badgeClass}>\r\n {badges[key].children}\r\n </Badge>\r\n )}\r\n {hasChildren && <Icon name={isOpen ? 'caret-down' : 'caret-right'} />}\n </Link>\r\n {hasChildren && (\r\n <div className={`collapse ${isOpen ? 'show' : ''}`}>\r\n <Type className={submenuClass ?? theme.Menu.submenuClass}>\r\n {item.children.map((child: any, idx: number) => (\r\n <MenuItem key={idx} item={child} index={idx} />\r\n ))}\r\n </Type>\r\n </div>\r\n )}\r\n </li>\r\n );\r\n };\r\n\r\n return (\r\n <Wrapper className={wrapClass ?? theme.Menu.wrapClass}>\r\n {pre}\r\n <Type className={className ?? theme.Menu.className}>\r\n {menu.map((item, index) => (\r\n <MenuItem key={index} item={item} index={index} />\r\n ))}\r\n </Type>\r\n {post}\r\n </Wrapper>\r\n );\r\n};\r\n\r\nexport default Menu;\r\n","import React from 'react';\nimport { useMotionRegistry } from './Theme';\n\nexport type ReducedMotionMode = 'respect-user' | 'always' | 'never';\nexport type MotionStyle = React.CSSProperties;\nexport type MotionReference = string | MotionEffect | false;\n\nexport interface MotionTransition {\n duration?: number;\n easing?: string;\n delay?: number;\n properties?: string[];\n}\n\nexport interface MotionEffect {\n from?: MotionStyle;\n to?: MotionStyle;\n transition?: MotionTransition;\n reducedMotion?: ReducedMotionMode;\n}\n\nexport type MotionRegistry = Record<string, MotionEffect>;\n\nexport interface ResolvedMotionEffect {\n from: MotionStyle;\n to: MotionStyle;\n transition: Required<MotionTransition>;\n reducedMotion: ReducedMotionMode;\n transitionValue: string;\n}\n\nconst NONE_EFFECT: MotionEffect = {\n from: {},\n to: {},\n transition: {\n duration: 0,\n easing: 'linear',\n delay: 0,\n properties: ['opacity', 'transform', 'box-shadow'],\n },\n reducedMotion: 'always',\n};\n\nconst FALLBACK_EFFECT: MotionEffect = {\n from: {},\n to: {},\n transition: {\n duration: 160,\n easing: 'cubic-bezier(0.2, 0, 0, 1)',\n delay: 0,\n properties: ['opacity', 'transform', 'box-shadow'],\n },\n reducedMotion: 'respect-user',\n};\n\nconst prefersReducedMotion = (): boolean =>\n typeof window !== 'undefined'\n && typeof window.matchMedia === 'function'\n && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\nconst resolveReference = (\n reference: MotionReference | undefined,\n registry: MotionRegistry,\n fallback: MotionReference = 'fade'\n): MotionEffect => {\n const candidate = reference === undefined ? fallback : reference;\n\n if (candidate === false) return NONE_EFFECT;\n if (typeof candidate === 'string') return registry[candidate] ?? registry.none ?? NONE_EFFECT;\n return candidate;\n};\n\nexport const createMotionTransition = (transition: Required<MotionTransition>): string =>\n transition.properties\n .map((property) => `${property} ${transition.duration}ms ${transition.easing} ${transition.delay}ms`)\n .join(', ');\n\nexport const resolveMotionEffect = (\n reference: MotionReference | undefined,\n registry: MotionRegistry = {},\n fallback?: MotionReference\n): ResolvedMotionEffect => {\n const base = resolveReference(fallback, registry, 'fade');\n const effect = resolveReference(reference, registry, fallback);\n const mergedTransition = {\n ...FALLBACK_EFFECT.transition,\n ...base.transition,\n ...effect.transition,\n };\n const reducedMotion = effect.reducedMotion ?? base.reducedMotion ?? FALLBACK_EFFECT.reducedMotion!;\n const reduced = reducedMotion === 'always'\n || (reducedMotion === 'respect-user' && prefersReducedMotion());\n const transition = {\n duration: reduced ? 0 : mergedTransition.duration!,\n easing: reduced ? 'linear' : mergedTransition.easing!,\n delay: reduced ? 0 : mergedTransition.delay!,\n properties: mergedTransition.properties!,\n };\n\n return {\n from: reduced ? {} : { ...(base.from ?? {}), ...(effect.from ?? {}) },\n to: reduced ? {} : { ...(base.to ?? {}), ...(effect.to ?? {}) },\n transition,\n reducedMotion,\n transitionValue: createMotionTransition(transition),\n };\n};\n\nexport const useMotionEffect = (\n reference?: MotionReference,\n fallback?: MotionReference\n): ResolvedMotionEffect => {\n const registry = useMotionRegistry();\n return React.useMemo(\n () => resolveMotionEffect(reference, registry, fallback),\n [reference, registry, fallback]\n );\n};\n\nexport const useMotionState = (\n active: boolean,\n reference?: MotionReference,\n fallback?: MotionReference,\n baseStyle?: React.CSSProperties\n): React.CSSProperties => {\n const effect = useMotionEffect(reference, fallback);\n\n return React.useMemo(() => ({\n ...baseStyle,\n ...(active ? effect.to : effect.from),\n transition: [\n baseStyle?.transition,\n effect.transitionValue,\n ].filter(Boolean).join(', '),\n }), [active, baseStyle, effect]);\n};\n\nexport const usePressMotion = (\n disabled = false,\n baseStyle?: React.CSSProperties,\n reference?: MotionReference,\n fallback: MotionReference = 'press'\n) => {\n const effect = useMotionEffect(reference, fallback);\n const [pressed, setPressed] = React.useState(false);\n\n const style = React.useMemo<React.CSSProperties>(() => ({\n ...baseStyle,\n ...(pressed && !disabled ? effect.to : effect.from),\n transition: [\n baseStyle?.transition,\n effect.transitionValue,\n ].filter(Boolean).join(', '),\n }), [baseStyle, disabled, effect, pressed]);\n\n return {\n style,\n pressHandlers: {\n onMouseDown: () => !disabled && setPressed(true),\n onMouseUp: () => setPressed(false),\n onMouseLeave: () => setPressed(false),\n onBlur: () => setPressed(false),\n },\n };\n};\n\nexport const useEnterMotion = (\n baseStyle?: React.CSSProperties,\n reference?: MotionReference,\n fallback: MotionReference = 'fadeUp'\n) => {\n const [entered, setEntered] = React.useState(false);\n\n React.useEffect(() => {\n setEntered(false);\n const frame = window.requestAnimationFrame(() => setEntered(true));\n return () => window.cancelAnimationFrame(frame);\n }, [reference, fallback]);\n\n return useMotionState(entered, reference, fallback, baseStyle);\n};\n","import React from 'react';\r\nimport {Link} from \"react-router-dom\";\r\nimport {useTheme} from \"../../Theme\";\r\nimport {Wrapper} from \"../ui/GridSystem\";\r\nimport { BadgeOverlay, BadgeProps } from \"../ui/Badge\";\nimport Menu from './Menu';\nimport { cn } from '../../libs/cn';\nimport { useMotionState, usePressMotion } from '../../motion';\nimport type { MotionUIProps } from '../types';\nimport Icon from '../ui/Icon';\n\r\ninterface DropdownTogglerProps {\r\n icon?: string;\r\n text?: string;\r\n}\r\ninterface DropdownProps extends Pick<MotionUIProps, 'motion'> {\n children: React.ReactNode;\n toggleButton?: string | React.ReactNode | DropdownTogglerProps;\n badge?: BadgeProps;\n header?: React.ReactNode;\n footer?: React.ReactNode;\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n alwaysOpen?: boolean;\n position?: \"start\" | \"end\";\n wrapClass?: string;\n className?: string;\r\n buttonClass?: string;\r\n badgeClass?: string;\r\n menuClass?: string;\r\n headerClass?: string;\r\n footerClass?: string;\n}\n\ninterface DropdownButtonProps extends Pick<MotionUIProps, 'motion'> {\n children: React.ReactNode;\n badge?: BadgeProps;\n display?: \"static\" | \"dynamic\";\r\n className?: string;\n badgeClass?: string;\n onToggle?: () => void;\n open?: boolean;\n menuId?: string;\n}\n\r\ninterface DropdownItemProps {\r\n url?: string;\r\n onClick?: React.MouseEventHandler<HTMLAnchorElement | HTMLButtonElement>;\r\n className?: string;\r\n children: React.ReactNode;\r\n icon?: string;\r\n}\r\ninterface DropdownHeaderProps {\r\n children: React.ReactNode;\r\n className?: string;\r\n}\r\ninterface DropdownDividerProps {\r\n className?: string;\r\n}\r\n\r\nexport const Dropdown = ({\r\n children,\r\n toggleButton,\r\n badge = undefined,\n header = undefined,\n footer = undefined,\n defaultOpen = false,\n open: controlledOpen = undefined,\n onOpenChange = undefined,\n alwaysOpen = false,\n position = undefined,\n wrapClass = undefined,\r\n className = undefined,\r\n buttonClass = undefined,\r\n menuClass = undefined,\r\n badgeClass = undefined,\n headerClass = undefined,\n footerClass = undefined,\n motion: motionConfig = undefined,\n\n}: DropdownProps) => {\n const theme = useTheme(\"dropdown\");\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen);\n const rootRef = React.useRef<HTMLDivElement>(null);\n const menuId = React.useId();\n const open = alwaysOpen ? true : controlledOpen ?? uncontrolledOpen;\n const renderToggle = !alwaysOpen && toggleButton !== undefined;\n const menuMotionStyle = useMotionState(open, motionConfig ?? theme.Dropdown.motion?.open ?? 'fadeDown', theme.Dropdown.motion?.open ?? 'fadeDown');\n\n const updateOpen = React.useCallback((nextOpen: boolean) => {\n if (alwaysOpen) return;\n if (controlledOpen === undefined) setUncontrolledOpen(nextOpen);\n onOpenChange?.(nextOpen);\n }, [alwaysOpen, controlledOpen, onOpenChange]);\n\n React.useEffect(() => {\n if (!open || alwaysOpen) return;\n\n const handlePointerDown = (event: PointerEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) {\n updateOpen(false);\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') updateOpen(false);\n };\n\n window.document.addEventListener('pointerdown', handlePointerDown);\n window.document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n window.document.removeEventListener('pointerdown', handlePointerDown);\n window.document.removeEventListener('keydown', handleKeyDown);\n };\n }, [alwaysOpen, open, updateOpen]);\n function isDropdownToggler(button: any): button is DropdownTogglerProps {\r\n return (\r\n typeof button === \"object\" &&\r\n button !== null &&\r\n !React.isValidElement(button) &&\r\n (\"icon\" in button || \"text\" in button)\r\n );\r\n }\r\n\r\n const Button = renderToggle ? <DropdownButton className={buttonClass} badge={badge} badgeClass={badgeClass} motion={motionConfig} onToggle={() => updateOpen(!open)} open={open} menuId={menuId}>\n {isDropdownToggler(toggleButton)\n ? <>\n {toggleButton.icon && <Icon name={toggleButton.icon} className={toggleButton.text ? \"mr-2\" : undefined} />}\n {toggleButton.text}\n </>\n : toggleButton\n }\n </DropdownButton> : null;\n\n\n return (\n <Wrapper className={wrapClass || theme.Dropdown.wrapClass}>\n <div ref={rootRef} className={cn(alwaysOpen ? \"inline-block text-left\" : \"relative inline-block text-left\", className || theme.Dropdown.className)}>\n {Button}\n <div\n id={menuId}\n role=\"menu\"\n aria-hidden={!open}\n className={cn(\n \"min-w-56 overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md outline-none\",\n alwaysOpen ? \"relative\" : \"absolute z-50 mt-2\",\n !alwaysOpen && position === \"end\" && \"right-0\",\n !alwaysOpen && position === \"start\" && \"left-0\",\n menuClass || theme.Dropdown.menuClass\n )}\n style={alwaysOpen\n ? undefined\n : {\n ...menuMotionStyle,\n opacity: open ? 1 : 0,\n visibility: open ? 'visible' : 'hidden',\n pointerEvents: open ? undefined : 'none',\n }}\n onClick={(e) => {\n e.stopPropagation();\n }}\n >\n {header && <div className={cn(\"px-2 py-1.5 text-sm font-semibold\", headerClass || theme.Dropdown.headerClass)}>\n {header}\n <DropdownDivider />\n </div>}\n {children}\r\n {footer && <div className={(footerClass || theme.Dropdown.footerClass)}>\r\n <DropdownDivider />\r\n {footer}\r\n </div>}\r\n </div>\r\n </div>\r\n </Wrapper>\r\n );\r\n};\r\n\r\n\r\nexport const DropdownButton = ({\r\n children,\r\n badge = undefined,\r\n display = \"dynamic\",\n className = undefined,\n badgeClass = undefined,\n motion: motionConfig = undefined,\n onToggle = undefined,\n open = false,\n menuId = undefined\n}: DropdownButtonProps) => {\n const theme = useTheme(\"dropdown\");\n const motion = usePressMotion(false, {cursor: \"pointer\"}, motionConfig ?? theme.Dropdown.motion?.press ?? 'press');\n\r\n const button = (\n <button\n type=\"button\"\n className={cn(\"inline-flex items-center justify-center gap-2\", className || theme.Dropdown.buttonClass)}\n style={motion.style}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={menuId}\n onClick={onToggle}\n {...motion.pressHandlers}\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" || e.key === \" \") {\r\n e.preventDefault();\r\n onToggle?.();\r\n }\r\n }}\r\n data-display={display}\n >\n {children}\n </button>\n );\n\n return (\n <BadgeOverlay badge={badge} className={badgeClass || theme.Dropdown.badgeClass}>\n {button}\n </BadgeOverlay>\n );\n};\n\r\nexport const DropdownItem = ({\r\n children,\r\n url = undefined,\r\n onClick = undefined,\r\n icon = undefined,\r\n className = undefined\r\n}: DropdownItemProps) => {\r\n const theme = useTheme(\"dropdown\");\r\n const item = icon \r\n ? <span className=\"inline-flex min-w-0 items-center gap-2\">\n <span className=\"inline-flex h-4 w-4 shrink-0 items-center justify-center text-muted-foreground\">\n <Icon name={icon} size={16} />\n </span>\n <span className=\"min-w-0\">\n {children}\n </span>\n </span>\n : children;\n\r\n return url ? (\r\n <Link \n to={url}\n role=\"menuitem\"\n className={cn(\"flex w-full cursor-pointer select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground\", className || theme.Dropdown.menuItemClass)}\n >\n {item}\n </Link>\n ) : onClick ? (\r\n <button \n onClick={onClick}\n role=\"menuitem\"\n className={cn(\"flex w-full cursor-pointer select-none items-center rounded-sm px-2 py-1.5 text-left text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground\", className || theme.Dropdown.menuItemClass)}\n >\n {item}\n </button>\n ) : (\n <span role=\"menuitem\" className={cn(\"flex w-full select-none items-center rounded-sm px-2 py-1.5 text-sm\", className || theme.Dropdown.menuItemClass)}>\n {item}\n </span>\n );\r\n};\r\n\r\nexport const DropdownHeader = ({children, className}: DropdownHeaderProps) => {\r\n const theme = useTheme(\"dropdown\");\r\n return (\r\n <div className={cn(\"px-2 py-1.5 text-xs font-medium uppercase tracking-wide text-muted-foreground\", className || theme.Dropdown.menuHeaderClass)}>\n {children}\n </div>\n );\r\n}\r\n\r\nexport const DropdownDivider = ({className}: DropdownDividerProps) => {\r\n const theme = useTheme(\"dropdown\");\r\n return <div className={cn(\"-mx-1 my-1 h-px bg-border\", className || theme.Dropdown.menuDividerClass)} />;\n}\r\n\r\ninterface DropdownMenuProps {\r\n context: string;\r\n Type?: 'ul' | 'ol';\r\n badges?: Record<string, any>;\r\n pre?: React.ReactNode;\r\n post?: React.ReactNode;\r\n}\r\n\r\nexport const DropdownMenu = ({ \r\n context,\r\n Type = 'ul',\r\n badges = {},\r\n pre = undefined,\r\n post = undefined\r\n}: DropdownMenuProps) => {\r\n const theme = useTheme(\"dropdown\");\r\n\r\n return <Menu \r\n context={context} \r\n Type={Type} \r\n badges={badges} \r\n pre={pre} \r\n post={post} \r\n wrapClass={theme.Dropdown.Menu.wrapClass}\r\n className={theme.Dropdown.Menu.className}\r\n headerClass={theme.Dropdown.Menu.headerClass}\r\n itemClass={theme.Dropdown.Menu.itemClass}\r\n linkClass={theme.Dropdown.Menu.linkClass}\r\n iconClass={theme.Dropdown.Menu.iconClass}\r\n textClass={theme.Dropdown.Menu.textClass}\r\n badgeClass={theme.Dropdown.Menu.badgeClass}\r\n arrowClass={theme.Dropdown.Menu.arrowClass}\r\n submenuClass={theme.Dropdown.Menu.submenuClass}\r\n />\r\n}\r\n","import React, {createContext, useContext, useState, useEffect, ReactNode} from 'react';\r\n\r\ntype GlobalVars = {\r\n [key: string]: any;\r\n};\r\n\r\ninterface GlobalContextType {\r\n globalVars: GlobalVars;\r\n setGlobalVars: (value: any, namespace: string) => void;\r\n removeGlobalVars: (namespace: string) => void;\r\n}\r\n\r\nconst _GLOBAL_VARS = 'globalVars';\r\nconst GlobalContext = createContext<GlobalContextType | undefined>(undefined);\r\n\r\n// Funzione helper per leggere il localStorage\r\nconst getStoredGlobalVars = () => JSON.parse(localStorage.getItem(_GLOBAL_VARS) || '{}');\r\n\r\n// Provider component to wrap around your app\r\nexport const GlobalProvider = ({ children }: { children: ReactNode }) => {\r\n const [globalVars, setGlobalVarsState] = useState(() => getStoredGlobalVars());\r\n\r\n useEffect(() => {\r\n const handleStorageChange = (event: StorageEvent) => {\r\n if (event.storageArea === localStorage && event.key === _GLOBAL_VARS) {\r\n setGlobalVarsState(getStoredGlobalVars());\r\n }\r\n };\r\n\r\n window.addEventListener('storage', handleStorageChange);\r\n return () => {\r\n window.removeEventListener('storage', handleStorageChange);\r\n };\r\n }, []);\r\n\r\n const updateLocalStorage = (updatedVars: GlobalVars) => {\r\n localStorage.setItem(_GLOBAL_VARS, JSON.stringify(updatedVars));\r\n setGlobalVarsState(updatedVars);\r\n };\r\n\r\n const setGlobalVars = (value: any, namespace: string): void => {\r\n const updatedVars = { ...globalVars, [namespace]: value };\r\n updateLocalStorage(updatedVars);\r\n };\r\n\r\n const removeGlobalVars = (namespace: string): void => {\r\n const updatedVars = { ...globalVars };\r\n delete updatedVars[namespace];\r\n updateLocalStorage(updatedVars);\r\n };\r\n\r\n return (\r\n <GlobalContext.Provider value={{ globalVars, setGlobalVars, removeGlobalVars }}>\r\n {children}\r\n </GlobalContext.Provider>\r\n );\r\n};\r\n\r\n// Hook per utilizzare globalVars con o senza namespace\r\nexport const useGlobalVars = <T = any>(namespace: string): [\r\n value: T | null,\r\n set: (newVars: T) => void,\r\n remove: () => void\r\n] => {\r\n const context = useContext(GlobalContext);\r\n if (!context) throw new Error(\"useGlobalVars must be used within a GlobalProvider\");\r\n\r\n const { globalVars, setGlobalVars, removeGlobalVars } = context;\r\n\r\n return [\r\n globalVars[namespace] ?? null,\r\n (newVars: T) => setGlobalVars(newVars, namespace),\r\n () => removeGlobalVars(namespace),\r\n ];\r\n};\r\n\r\n// Funzione per ottenere variabili globali dal localStorage\r\nexport const getGlobalVars = (namespace: string | null = null): GlobalVars => {\r\n const globalVars = getStoredGlobalVars();\r\n return namespace ? globalVars[namespace] || {} : globalVars;\r\n};\r\n\r\n// Funzione per impostare variabili globali nel localStorage senza usare il context\r\nexport const setGlobalVars = (value: any, namespace: string): void => {\r\n const updatedVars = { ...getStoredGlobalVars(), [namespace]: value };\r\n localStorage.setItem(_GLOBAL_VARS, JSON.stringify(updatedVars));\r\n};\r\n\r\n// Funzione per rimuovere variabili globali dal localStorage senza usare il context\r\nexport const removeGlobalVars = (namespace: string): void => {\r\n const updatedVars = { ...getStoredGlobalVars() };\r\n delete updatedVars[namespace];\r\n localStorage.setItem(_GLOBAL_VARS, JSON.stringify(updatedVars));\r\n};\r\n","import React, {createContext, useContext, useState, ReactNode, useRef, useEffect} from 'react';\r\nimport {fetchJson} from \"./libs/fetch\";\r\nimport {DropdownHeader, DropdownItem} from \"./components/blocks/Dropdown\";\r\nimport {GlobalProvider} from \"./Global\";\r\n\r\nexport type FirebaseConfig = {\r\n apiKey: string;\r\n authDomain: string;\r\n databaseURL: string;\r\n projectId: string;\r\n storageBucket: string;\r\n messagingSenderId: string;\r\n appId: string;\r\n measurementId: string;\r\n};\r\n\r\nexport type GoogleOAuth2 = {\r\n clientId: string;\r\n scope?: string;\r\n};\r\n\r\nexport type GoogleServiceAccount = {\r\n type: string;\r\n project_id: string;\r\n private_key_id: string;\r\n private_key: string;\r\n client_email: string;\r\n client_id: string;\r\n auth_uri: string;\r\n token_uri: string;\r\n auth_provider_x509_cert_url: string;\r\n client_x509_cert_url: string;\r\n};\r\n\r\nexport type GoogleConfig = {\r\n oAuth2: GoogleOAuth2;\r\n serviceAccount?: GoogleServiceAccount;\r\n developerToken?: string;\r\n}\r\n\r\nexport type DropboxConfig = {\r\n clientId: string;\r\n rootPath: string;\r\n};\r\n\r\nexport type AIConfig = {\r\n geminiApiKey?: string;\r\n openaiApiKey?: string;\r\n deepSeekApiKey?: string;\r\n anthropicApiKey?: string;\r\n mistralApiKey?: string;\r\n};\r\n\r\nexport type ScrapeConfig = {\r\n serpApiKey?: string;\r\n};\r\n\r\nexport type Config = {\r\n title: string;\r\n firebase?: FirebaseConfig;\r\n google?: GoogleConfig;\r\n dropbox?: DropboxConfig;\r\n ai?: AIConfig;\r\n scrape?: ScrapeConfig;\r\n proxyURI?: string;\r\n};\r\n\r\ninterface TenantMenuItem {\r\n title: string;\r\n icon: string;\r\n active: boolean;\r\n onClick: () => void;\r\n}\r\n\r\ntype ConfigChangeHandler = (newConfig: Config, prevConfig: Config | null) => void;\r\n\r\n\r\nlet tenantsMenu: TenantMenuItem[] = [];\r\nlet tenantsConfig: Config[] = [];\r\nlet currentConfig: Config | undefined = undefined;\r\n\r\n\r\nconst ConfigContext = createContext<Config | null>(null);\r\nconst ConfigUpdateContext = createContext<(cfg: Config) => void>(() => {});\r\n\r\nconst configChangeHandlers: Set<ConfigChangeHandler> = new Set();\r\n\r\nexport const onConfigChange = (fn: ConfigChangeHandler) => {\r\n configChangeHandlers.add(fn);\r\n if (currentConfig) fn(currentConfig, null);\r\n};\r\n\r\nconst useConfig = () => useContext(ConfigContext);\r\nconst useSetConfig = () => useContext(ConfigUpdateContext);\r\n\r\nexport const RuntimeProvider = ({\r\n children,\r\n defaultConfig,\r\n tenantsURI\r\n }: {\r\n children: ReactNode;\r\n defaultConfig: Config;\r\n tenantsURI?: string;\r\n}) => {\r\n const [config, setConfig] = useState<Config>(initConfig(defaultConfig, tenantsURI));\r\n const prevConfigRef = useRef<Config | null>(null);\r\n\r\n useEffect(() => {\r\n const prev = prevConfigRef.current;\r\n\r\n if (prev !== config) {\r\n currentConfig = config;\r\n for (const handler of configChangeHandlers) {\r\n handler(config, prev);\r\n }\r\n }\r\n\r\n prevConfigRef.current = config;\r\n }, [config]);\r\n\r\n return (\r\n <ConfigContext.Provider value={config}>\r\n <ConfigUpdateContext.Provider value={setConfig}>\r\n <GlobalProvider>\r\n {children}\r\n </GlobalProvider>\r\n </ConfigUpdateContext.Provider>\r\n </ConfigContext.Provider>\r\n );\r\n};\r\n\r\nconst initConfig = (defaultConfig: Config, tenantsURI ?: string): Config => {\r\n const loadTenants = async () => {\r\n if (!tenantsURI) {\r\n return;\r\n }\r\n\r\n try {\r\n const fetchedTenants = await fetchJson(tenantsURI);\r\n tenantsConfig = [defaultConfig, ...fetchedTenants];\r\n localStorage.setItem(\"tenants\", JSON.stringify(tenantsConfig));\r\n } catch (err) {\r\n console.warn(\"No tenants found at\", tenantsURI);\r\n }\r\n }\r\n\r\n tenantsConfig = [defaultConfig];\r\n currentConfig = defaultConfig;\r\n loadTenants();\r\n\r\n return currentConfig;\r\n}\r\n\r\nexport const getConfig = () => currentConfig;\r\n\r\nconst useTenants = (setTenants: (items: TenantMenuItem[]) => void): void => {\r\n const setConfig = useSetConfig();\r\n const currentConfig = useConfig();\r\n\r\n if (tenantsMenu.length > 0) {\r\n // già inizializzati → li setto subito\r\n setTenants(tenantsMenu);\r\n return;\r\n }\r\n\r\n // recupero dal localStorage una sola volta\r\n const stored = localStorage.getItem(\"tenants\");\r\n if (!stored) return;\r\n\r\n try {\r\n tenantsConfig = JSON.parse(stored);\r\n\r\n tenantsMenu = tenantsConfig.map((tenant, index) => ({\r\n title: tenant.title || `Tenant ${index}`,\r\n icon: \"folder\",\r\n active: tenant.firebase?.appId === currentConfig?.firebase?.appId,\r\n onClick: () => {\r\n const selectedConfig = tenantsConfig[index];\r\n setConfig(selectedConfig);\r\n\r\n tenantsMenu = tenantsMenu.map((t, i) => ({\r\n ...t,\r\n active: i === index\r\n }));\r\n\r\n setTenants(tenantsMenu);\r\n }\r\n }));\r\n\r\n setTenants(tenantsMenu);\r\n } catch (e) {\r\n console.error(\"Error parsing tenants from localStorage\", e);\r\n }\r\n};\r\n\r\n\r\nexport const TenantMenu = () => {\r\n const [tenants, setTenants] = useState<TenantMenuItem[]>([]);\r\n\r\n useTenants(setTenants);\r\n\r\n if (tenants.length === 0) return null;\r\n\r\n return (\r\n <>\r\n <DropdownHeader>Projects</DropdownHeader>\r\n {tenants.map((item) => (\r\n <DropdownItem key={item.title} onClick={item.onClick}>\r\n <i className={`mr-1 ${item.active ? \"text-success\" : \"text-muted\"}`}>\r\n <i className={`bi bi-${item.icon}`} />\r\n </i>\r\n {item.title}\r\n </DropdownItem>\r\n ))}\r\n <div className=\"-mx-1 my-1 h-px bg-border\" />\n </>\r\n );\r\n};\r\n\r\nexport default TenantMenu;\r\n","import React from 'react';\r\nimport {converter} from \"./converter\";\r\nimport {getConfig} from \"../Config\";\r\nimport { RecordProps } from '../providers/data/DataProvider';\r\n\r\nexport const decodeJWT = (token: string): any => {\r\n try {\r\n // Divide il token nelle sue parti: header, payload, firma\r\n const payloadEncoded = token.split('.');\r\n\r\n // Decodifica la parte payload (Base64)\r\n const payloadDecoded = atob(payloadEncoded[1]);\r\n\r\n // Parsa la parte payload in un oggetto JSON\r\n return JSON.parse(payloadDecoded);\r\n } catch (error) {\r\n console.error('Errore durante la decodifica del token:', error);\r\n }\r\n};\r\nexport const copyToClipboard = (text: string): void => {\r\n try {\r\n // Copia il selettore direttamente negli appunti\r\n navigator.clipboard.writeText(text)\r\n .then(() => {\r\n console.log('Selettore HTML copiato negli appunti:', text);\r\n })\r\n .catch((err) => {\r\n console.error('Errore durante la copia del selettore HTML negli appunti:', err);\r\n });\r\n } catch (err) {\r\n console.error('Clipboard API non supportata:', err);\r\n }\r\n};\r\n\r\nexport const trimPath = (path?: string): string => {\r\n return normalizePath(path)\r\n .replace(/\\/$/, \"\")\r\n .replace(/^\\//, \"\");\r\n};\r\n\r\nexport const normalizePath = (path?: string): string => {\r\n if(!path) return '';\r\n return path\r\n .replaceAll(\" \", \"-\")\r\n .replaceAll(\"'\", \"-\")\r\n .replaceAll('\"', \"-\")\r\n .toLowerCase()\r\n .replace(/[^a-z0-9\\-/]+/g, \"\")\r\n .replace(/-+/g, \"-\")\r\n .replace(/\\/+/g, \"/\");\r\n};\r\n\r\nexport const trimSlash = (path?: string | number | boolean): string => {\r\n if (typeof path === \"number\") return String(path);\r\n if (typeof path === \"boolean\") return path ? \"true\" : \"false\";\r\n if(!path) return '';\r\n\r\n return (path.startsWith('/')\r\n ? path.substring(1)\r\n : path\r\n );\r\n};\r\n\r\nexport const normalizeKey = (key?: string | number | boolean): string => {\r\n return trimSlash(key)\r\n .replaceAll(\"/\", \"|\")\r\n .replaceAll(\" \", \"-\")\r\n .replaceAll(\"'\", \"-\")\r\n .replaceAll('\"', \"-\")\r\n .replaceAll(\".\", \"-\")\r\n .replaceAll(\"@\", \"-\")\r\n .replaceAll(\"#\", \"-\")\r\n .replaceAll(\"$\", \"-\")\r\n .replaceAll(\"[\", \"-\")\r\n .replaceAll(\"]\", \"-\")\r\n .replaceAll(\"_\", \"-\")\r\n .toLowerCase()\r\n .replace(/[^a-z0-9\\-|]+/g, \"\")\r\n .replace(/^-+|-+$/g, \"\")\r\n .replace(/-+/g, \"-\");\r\n};\r\n\r\n\r\n\r\nexport const dirname = (path: string): string => {\r\n // Controlla se il path è una stringa vuota\r\n if (!path) return '';\r\n\r\n // Rimuovi lo slash finale se presente\r\n path = path.replace(/\\/$/, \"\");\r\n\r\n // Separa il path in segmenti usando la barra di divisione\r\n const segments = path.split(\"/\");\r\n\r\n // Rimuovi l'ultimo segmento (il nome del file)\r\n segments.pop();\r\n\r\n // Ricostruisci il percorso della directory padre\r\n return segments.join(\"/\");\r\n};\r\n\r\nexport async function sleep(ms: number): Promise<void> {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n}\r\n\r\nexport function proxy(url: string, format: string = 'json'): string {\r\n const config = getConfig();\r\n return (\r\n config?.proxyURI\r\n ? config.proxyURI + encodeURIComponent(url) + \"&f=\" + format\r\n : url\r\n );\r\n}\r\n\r\nexport function generateUniqueId(name = null) {\r\n const timestamp = Date.now().toString(36); // Converti il timestamp in base 36\r\n const randomStr = name || Math.random().toString(36).substring(2); // Genera una stringa casuale\r\n\r\n return `${timestamp}-${randomStr}`;\r\n}\r\n\r\nexport function eventClosest(e: Event, tagName: string): HTMLElement | null {\r\n // Se il target è già un elemento con il tag desiderato, restituisci il target stesso\r\n\r\n let currentElement = e.target as HTMLElement;\r\n if (currentElement.tagName.toLowerCase() === tagName.toLowerCase()) {\r\n return currentElement;\r\n }\r\n\r\n // Risali fino a trovare il primo elemento con il tag desiderato\r\n while (currentElement.parentNode) {\r\n const parentElement = currentElement.parentNode as HTMLElement;\r\n if (parentElement.tagName.toLowerCase() === tagName.toLowerCase()) {\r\n // Trovato un elemento con il tag desiderato nel cammino verso l'alto\r\n return parentElement;\r\n }\r\n currentElement = parentElement;\r\n }\r\n\r\n // Se non hai trovato un elemento con il tag desiderato, restituisci null\r\n return null;\r\n}\r\n\r\n\r\nexport const substrCount = (str: string, sub: string): number => {\r\n return str.split(sub).length - 1;\r\n};\r\n\r\nexport const replacePlaceholders = (\r\n pattern: string,\r\n arrPath: string[]\r\n): string => {\r\n return pattern.replace(/\\$(\\d+)/g, (match: string, placeholderIndex: string) => {\r\n const index = parseInt(placeholderIndex);\r\n return arrPath[index] || \"\";\r\n }).trim();\r\n}\r\n\r\n\r\nexport const checkConditions = (\r\n conds: Array<{ key: string; value: string; operator: string }>,\r\n metaObject: { [key: string]: string | undefined },\r\n tokens: string[]\r\n): boolean => {\r\n for (const cond of conds) {\r\n const key = normalizePath(replaceVariables(cond.key, metaObject));\r\n const value = normalizePath(replacePlaceholders(replaceVariables(cond.value, metaObject), tokens));\r\n\r\n if (((cond.operator === \"==\" || cond.operator === \"=\") && key === value) ||\r\n (cond.operator === \"!=\" && key !== value) ||\r\n (cond.operator === \">\" && key > value) ||\r\n (cond.operator === \"<\" && key < value) ||\r\n (cond.operator === \">=\" && key >= value) ||\r\n (cond.operator === \"<=\" && key <= value) ||\r\n (cond.operator === \"contains\" && key.includes(value)) ||\r\n (cond.operator === \"not contains\" && !key.includes(value))) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nexport const crc32 = (str: string) => {\r\n const crcTable: number[] = [];\r\n for (let i = 0; i < 256; i++) {\r\n let c = i;\r\n for (let j = 0; j < 8; j++) {\r\n if (c & 1) {\r\n c = 0xEDB88320 ^ (c >>> 1);\r\n } else {\r\n c = c >>> 1;\r\n }\r\n }\r\n crcTable[i] = c;\r\n }\r\n\r\n let crc = 0 ^ (-1);\r\n\r\n for (let i = 0; i < str.length; i++) {\r\n crc = (crc >>> 8) ^ crcTable[(crc ^ str.charCodeAt(i)) & 0xFF];\r\n }\r\n\r\n return (crc ^ (-1)) >>> 0;\r\n}\r\n\r\nexport const ucfirst = (str?: string): string => {\r\n if (!str) return '';\r\n return str.charAt(0).toUpperCase() + str.slice(1);\r\n}\r\n\r\nexport const loadScripts = (scriptData: Array<{ src: string; [key: string]: any }>): void => {\r\n if (!scriptData.length) return;\r\n\r\n const scriptFragment = document.createDocumentFragment();\r\n\r\n scriptData.forEach(({ src, clean, ...attrs }) => {\r\n if (!src) return;\r\n\r\n const scriptElement = document.createElement('script');\r\n scriptElement.setAttribute('src', src);\r\n Object.entries(attrs).forEach(([key, value]) => {\r\n scriptElement.setAttribute(key, value);\r\n });\r\n\r\n if (clean) {\r\n scriptElement.onload = () => document.body.removeChild(scriptElement);\r\n }\r\n\r\n scriptFragment.appendChild(scriptElement);\r\n });\r\n\r\n document.body.appendChild(scriptFragment);\r\n}\r\n\r\nexport const intersectObjects = (\r\n obj1: { [key: string]: any },\r\n obj2: { [key: string]: any }\r\n): { [key: string]: any } => {\r\n const result: { [key: string]: any } = {};\r\n\r\n for (const key in obj1) {\r\n if (obj1.hasOwnProperty(key) && key in obj2) {\r\n result[key] = obj1[key];\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport const replaceVariables = (\r\n pattern: string,\r\n metaObject: { [key: string]: string | undefined }\r\n): string => {\r\n const matches = pattern.match(/{[^}]*}/g) || [];\r\n\r\n matches.forEach(match => {\r\n const key = match.slice(1, -1).split(\":\");\r\n const varName = key[0]; // Nome della variabile\r\n const funcName = key[1]; // Nome della funzione\r\n\r\n // Controlla se funcName è una funzione nel converter\r\n const value = (funcName && typeof converter[funcName] === 'function'\r\n ? converter[funcName](metaObject[varName])\r\n : metaObject[varName]\r\n ) || '';\r\n\r\n pattern = pattern.replaceAll(match, value);\r\n });\r\n\r\n return pattern;\r\n};\r\n\r\n\r\n\r\nexport const arrayUnique = <T>(array: T[], key?: keyof T): T[] => {\r\n if (!key) {\r\n return [...new Set(array)];\r\n } else {\r\n const seen = new Set();\r\n return array.filter((item: T) => {\r\n const value = item[key];\r\n if (!seen.has(value)) {\r\n seen.add(value);\r\n return true;\r\n }\r\n return false;\r\n });\r\n }\r\n};\r\n\r\nexport const isEmpty = (data: any): boolean => {\n return data === undefined || data === null || data === '' || data === false || data === '0' || data === 0 || (typeof data === 'object' && Object.keys(data).length === 0);\n};\n\nfunction cloneFallback<T>(value: T, seen: WeakMap<object, unknown> = new WeakMap()): T {\n if (\n value === null ||\n value === undefined ||\n typeof value !== 'object' ||\n React.isValidElement(value)\n ) {\n return value;\n }\n\n if (value instanceof Date) {\n return new Date(value.getTime()) as T;\n }\n\n if (value instanceof RegExp) {\n return new RegExp(value.source, value.flags) as T;\n }\n\n if (seen.has(value)) {\n return seen.get(value) as T;\n }\n\n if (Array.isArray(value)) {\n const clone: unknown[] = [];\n seen.set(value, clone);\n value.forEach((item, index) => {\n clone[index] = cloneFallback(item, seen);\n });\n return clone as T;\n }\n\n if (value instanceof Map) {\n const clone = new Map();\n seen.set(value, clone);\n value.forEach((mapValue, mapKey) => {\n clone.set(cloneFallback(mapKey, seen), cloneFallback(mapValue, seen));\n });\n return clone as T;\n }\n\n if (value instanceof Set) {\n const clone = new Set();\n seen.set(value, clone);\n value.forEach((entry) => {\n clone.add(cloneFallback(entry, seen));\n });\n return clone as T;\n }\n\n const prototype = Object.getPrototypeOf(value);\n if (prototype && prototype !== Object.prototype) {\n return value;\n }\n\n const clone: Record<string, unknown> = {};\n seen.set(value, clone);\n\n Object.entries(value).forEach(([key, entry]) => {\n clone[key] = cloneFallback(entry, seen);\n });\n\n return clone as T;\n}\n\nexport function safeClone<T>(obj: T): T {\n if (typeof structuredClone !== 'function') {\n return cloneFallback(obj);\n }\n\n try {\n return structuredClone(obj);\n } catch {\n return cloneFallback(obj);\n }\n}\n\r\n\r\nexport function base64Encode(input: string | Buffer | ArrayBuffer): string {\r\n const buffer = typeof input === 'string'\r\n ? Buffer.from(input, 'utf8')\r\n : input instanceof ArrayBuffer\r\n ? Buffer.from(new Uint8Array(input))\r\n : Buffer.from(input);\r\n\r\n return buffer\r\n .toString('base64')\r\n .replace(/\\+/g, '-')\r\n .replace(/\\//g, '_')\r\n .replace(/=+$/, '');\r\n}\r\n\r\nexport function arraysEqual(a: any[], b: any[]): boolean {\r\n if (a === b) return true;\r\n if (a.length !== b.length) return false;\r\n for (let i = 0; i < a.length; i++) {\r\n if (a[i] !== b[i]) return false;\r\n }\r\n return true;\r\n}\r\n\r\nexport function sanitizeKey(str: string) : string {\r\n return str.replace(/[^a-zA-Z0-9-_:.]/g, \"_\");\r\n}\r\n\r\n/**\r\n * Checks if the event target or any of its parent elements is an interactive element\r\n * (link, button, input, textarea, or select)\r\n * @param e The event to check\r\n * @returns true if the target or any parent is an interactive element\r\n */\r\nexport function isInteractiveElement(e: Event | React.MouseEvent, exclude?: string): boolean {\r\n const target = e.target as HTMLElement;\r\n const isInteractive = !!(target.closest('a') || target.closest('button') || target.closest('input') || target.closest('textarea') || target.closest('select'));\r\n if (exclude) {\r\n return isInteractive && !target.closest(exclude);\r\n }\r\n return isInteractive;\r\n}\r\n\r\nexport const render2Base64 = (arrayBuffer: ArrayBuffer): string => {\r\n const bytes = new Uint8Array(arrayBuffer);\r\n let binary = '';\r\n for (let i = 0; i < bytes.byteLength; i++) {\r\n binary += String.fromCharCode(bytes[i]);\r\n }\r\n return btoa(binary);\r\n};\r\n\r\nexport const base64ToBlob = (base64: string, type: string): Blob | undefined => {\r\n try {\r\n const byteCharacters = atob(base64.split(',')[1]);\r\n const byteNumbers = new Array(byteCharacters.length);\r\n for (let i = 0; i < byteCharacters.length; i++) {\r\n byteNumbers[i] = byteCharacters.charCodeAt(i);\r\n }\r\n const byteArray = new Uint8Array(byteNumbers);\r\n return new Blob([byteArray], { type });\r\n } catch (error) {\r\n console.warn('Failed to create blob from base64:', error);\r\n return undefined;\r\n }\r\n};\r\n\r\nexport const base64ToUrl = (base64: string, type: string): string | undefined => {\r\n const blob = base64ToBlob(base64, type);\r\n return blob ? URL.createObjectURL(blob) : undefined;\r\n};\r\n\r\nexport const getRecordValue = (record?: RecordProps, name?: string): any => {\r\n if (!record || !name) return undefined;\r\n \r\n return name.split('.').reduce((acc: any, part: string) => acc?.[part], record);\r\n};\r\n\r\nexport const cleanRecord = (record: RecordProps | undefined): RecordProps => {\r\n const cleaned: RecordProps = {};\r\n\r\n if (!record) return cleaned;\r\n if (record instanceof File) return {\r\n name: record.name,\r\n type: record.type,\r\n size: record.size,\r\n lastModified: record.lastModified\r\n };\r\n for (const [k, v] of Object.entries(record)) {\r\n if (!k) continue;\r\n \r\n if (Array.isArray(v)) {\r\n cleaned[k] = v\r\n .map(item => typeof item === 'object' ? cleanRecord(item) : item)\r\n .filter(item => item !== undefined);\r\n } else if(v && typeof v === 'object') {\r\n cleaned[k] = cleanRecord(v);\r\n } else if (v !== undefined) {\r\n cleaned[k] = v;\r\n }\r\n }\r\n return cleaned;\r\n}\r\n\r\nexport const smartTypeCast = (value: any): string | number | boolean | null | undefined => {\r\n if (value === null || value === undefined || value === \"\" || typeof value !== \"string\") return value;\r\n if (/^(true|false)$/i.test(value)) return value.toLowerCase() === \"true\";\r\n if (/^0\\d+$/.test(value)) return value;\r\n if (/^-?\\d+(\\.\\d+)?$/.test(value)) return Number(value);\r\n return value.trim();\r\n};\r\n \r\n","import {sleep} from \"./utils\";\r\n\r\ninterface FetchOptions {\r\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"HEAD\" | \"PATCH\";\r\n headers?: Record<string, string>;\r\n body?: Record<string, any> | string;\r\n}\r\n\r\nfunction resolveContentType(options: FetchOptions) {\r\n const { body, headers } = options;\r\n const contentType = headers?.[\"Content-Type\"] || \"\";\r\n\r\n const allowedContentTypes = Array.isArray(body) || typeof body === 'object'\r\n ? [\"application/json\", \"application/x-www-form-urlencoded\", \"multipart/form-data\"]\r\n : [\"text/plain\", \"text/html\"];\r\n\r\n if (allowedContentTypes.includes(contentType)) {\r\n return contentType;\r\n }\r\n\r\n return typeof body === 'object'\r\n ? \"application/json\"\r\n : typeof body === 'string' && body.startsWith(\"<\")\r\n ? \"text/html\"\r\n : \"text/plain\";\r\n}\r\n\r\nexport async function fetchRest(\r\n url: string,\r\n options: FetchOptions | null = null\r\n): Promise<any> {\r\n const request: RequestInit = {\r\n redirect: \"follow\",\r\n method: options?.method?.toUpperCase() || \"GET\",\r\n headers: options?.headers || {}\r\n };\r\n\r\n if (options?.body) {\r\n if ([\"GET\", \"HEAD\"].includes(request.method as string)) {\r\n url += (url.includes(\"?\") ? \"&\" : \"?\") + new URLSearchParams(options.body);\r\n } else {\r\n switch (resolveContentType(options)) {\r\n case \"application/json\":\r\n request.body = JSON.stringify(options.body);\r\n break;\r\n\r\n case \"application/x-www-form-urlencoded\":\r\n request.body = new URLSearchParams(options.body);\r\n break;\r\n\r\n case \"multipart/form-data\": {\r\n const formData = new FormData();\r\n const body = options.body as Record<string, any>;\r\n for (const key in body) {\r\n formData.append(key, body[key]);\r\n }\r\n request.body = formData;\r\n break;\r\n }\r\n case \"text/html\":\r\n case \"text/plain\":\r\n if (typeof options.body !== 'string') {\r\n throw new Error(\"Fetch: Body must be a string for text/plain or text/html content types.\");\r\n }\r\n\r\n request.body = options.body;\r\n break;\r\n default:\r\n throw new Error(`Fetch: Unsupported Content-Type`);\r\n }\r\n }\r\n }\r\n\r\n //options.mode = options.mode || \"no-cors\";\r\n return fetch(url, request)\r\n .then(response => {\r\n if (!response.ok) {\r\n return response.text().then(text => { throw { response, text }; });\r\n }\r\n\r\n const accept = options?.headers?.['Accept'];\r\n const contentType = response.headers.get('Content-Type')?.split(\";\")[0];\r\n if (accept && accept.split(\";\")[0] !== contentType) {\r\n return response.text().then(text => { throw { response, text }; });\r\n }\r\n\r\n return response?.headers && response.headers.get('Content-Type') === \"application/json\"\r\n ? response.json()\r\n : response.text();\r\n })\r\n .catch(error => {\r\n if (error.message) {\r\n console.warn(`fetch: ${error.message}`, url, request);\r\n return null;\r\n }\r\n const { response, text } = error;\r\n function getResponse() {\r\n const contentType = response?.headers.get('Content-Type')?.split(\";\")[0] || \"\";\r\n\r\n if (contentType === \"application/json\" && (text.startsWith(\"{\") || text.startsWith(\"[\"))) {\r\n const json = JSON.parse(text);\r\n console.warn(`fetch: Error`, url, request, response.status, json);\r\n return json;\r\n } else {\r\n const accept = options?.headers?.['Accept']?.split(\";\")[0] || \"\";\r\n\r\n const wrongContentType = accept !== contentType\r\n ? \"Request Accept header does not match response Content-Type (Accept: \" + accept + \", Content-Type: \" + contentType + \")\"\r\n : accept === \"application/json\"\r\n ? \"Request Accept header is application/json but response is not JSON\"\r\n : null;\r\n\r\n console.warn(`fetch: ${wrongContentType}`, url, request, response.status, text);\r\n return (wrongContentType && accept === \"application/json\"\r\n ? {error: text, status: 520}\r\n : text\r\n );\r\n }\r\n }\r\n\r\n throw getResponse();\r\n });\r\n}\r\n\r\nexport async function fetchJson(\r\n url: string,\r\n options: FetchOptions | null = null\r\n): Promise<any> {\r\n return fetchRest(url, {\r\n ...options,\r\n headers: {\r\n \"Accept\": \"application/json\",\r\n \"Content-Type\": \"application/json\",\r\n ...options?.headers,\r\n }\r\n })\r\n .then(response => {\r\n if (response?.error) {\r\n throw response;\r\n }\r\n return response;\r\n });\r\n}\r\n\r\nexport async function fetchWithRetry(\r\n url: string,\r\n options: RequestInit = {},\r\n maxRetries: number = 3,\r\n statusNoRetry: number[] = [429]\r\n): Promise<any | Response> {\r\n return fetch(url, options)\r\n .then(response => {\r\n if (response.ok) {\r\n return response.json();\r\n }\r\n\r\n if (!statusNoRetry.includes(response.status) && maxRetries > 0) {\r\n console.log(\"Retrying...\", maxRetries, url, options);\r\n\r\n return sleep(500)\r\n .then(() => fetchWithRetry(url, options, maxRetries - 1));\r\n }\r\n\r\n console.error(response);\r\n return response;\r\n //throw new Error(`Failed to fetch ${url}`);\r\n })\r\n .catch((err) => console.error(err, \"BBBBBBBBBBBBBBBBBBBBBBB\"));\r\n}","import React, {useEffect, useState} from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport {useTheme} from \"../../Theme\";\nimport { BadgeOverlay } from './Badge';\nimport type { MotionUIProps, UIProps } from '../types';\nimport { Wrapper } from './GridSystem';\nimport { BadgeProps } from './Badge';\nimport { cn } from '../../libs/cn';\nimport { usePressMotion } from '../../motion';\nimport Icon from './Icon';\n\nexport interface IButton extends MotionUIProps {\n onClick?: (e: any) => any;\n icon?: string;\n label?: string | React.ReactNode;\n badge?: BadgeProps;\n title?: string;\r\n disabled?: boolean;\n showLoader?: boolean;\n iconClass?: string;\n style?: React.CSSProperties;\n variant?: \"primary\" | \"secondary\" | \"danger\" | \"success\" | \"warning\" | \"info\" | \"light\" | \"dark\" | \"outline-primary\" | \"outline-secondary\" | \"outline-danger\" | \"outline-success\" | \"link\";\n}\n\nexport type SetMessagePayload = { message: string; chunkDone?: number; totalChunks?: number };\n\nexport interface LoadingButtonProps extends Omit<IButton, \"onClick\"> {\n onClick?: (e: any, setMessage?: (payload: SetMessagePayload) => any) => Promise<any>;\n loadingLabel?: string | React.ReactNode;\n}\n\nexport const buttonBaseClass = \"btn\";\nexport const buttonPrimaryClass = \"btn-primary\";\nexport const buttonSecondaryClass = \"btn-secondary\";\nexport const buttonDangerClass = \"btn-danger\";\nexport const buttonSuccessClass = \"btn-success\";\nexport const buttonWarningClass = \"btn-warning\";\nexport const buttonInfoClass = \"btn-info\";\nexport const buttonLightClass = \"btn-light\";\nexport const buttonDarkClass = \"btn-dark\";\nexport const buttonOutlinePrimaryClass = \"btn-outline-primary\";\nexport const buttonOutlineSecondaryClass = \"btn-outline-secondary\";\nexport const buttonOutlineDangerClass = \"btn-outline-danger\";\nexport const buttonOutlineSuccessClass = \"btn-outline-success\";\nexport const buttonLinkClass = \"btn-link\";\n\nconst resolveButtonVariant = (variant?: IButton[\"variant\"]) => {\n switch (variant) {\n case \"primary\": return buttonPrimaryClass;\n case \"secondary\": return buttonSecondaryClass;\n case \"danger\": return buttonDangerClass;\n case \"success\": return buttonSuccessClass;\n case \"warning\": return buttonWarningClass;\n case \"info\": return buttonInfoClass;\n case \"light\": return buttonLightClass;\n case \"dark\": return buttonDarkClass;\n case \"outline-primary\": return buttonOutlinePrimaryClass;\n case \"outline-secondary\": return buttonOutlineSecondaryClass;\n case \"outline-danger\": return buttonOutlineDangerClass;\n case \"outline-success\": return buttonOutlineSuccessClass;\n case \"link\": return buttonLinkClass;\n default: return undefined;\n }\n};\n \r\nexport const LoadingButton = ({\r\n onClick,\r\n icon = undefined,\r\n label = undefined,\r\n badge = undefined,\r\n title = undefined,\r\n disabled = false,\r\n showLoader = false,\r\n pre = undefined,\r\n post = undefined,\r\n wrapClass = undefined,\n className = undefined,\n iconClass = undefined,\n style = undefined,\n loadingLabel = undefined,\n variant = undefined,\n motion: motionConfig = undefined\n}: LoadingButtonProps = {}) => {\n const [loader, setLoader] = useState(showLoader);\r\n const [disable, setDisable] = useState(disabled);\r\n const [message, setMessageState] = useState(\"\");\r\n\r\n const setMessage = (payload: SetMessagePayload) => {\r\n setMessageState(payload.message ?? '');\r\n };\n\n const theme = useTheme(\"button\");\n const motion = usePressMotion(disable || loader, style, motionConfig ?? theme.LoadingButton.motion?.press ?? 'press');\n const activeLoadingLabel = loadingLabel ?? (message || (typeof label === 'string' ? `${label}...` : label));\n\r\n useEffect(() => {\n setLoader(showLoader);\n setDisable(disabled);\n }, [showLoader, disabled]);\n\n const button = (\n <button\n title={title}\n className={cn(\n buttonBaseClass,\n variant ? resolveButtonVariant(variant) : (className || theme.LoadingButton.className),\n variant ? className : undefined,\n loader && \"whitespace-nowrap\"\n )}\n style={motion.style}\n disabled={disable || loader}\n {...motion.pressHandlers}\n onClick={async (e) => {\n e.stopPropagation();\n setDisable(true);\n setLoader(true);\n await onClick?.(e, setMessage);\n setLoader(false);\n setDisable(false);\n }}\n >\n {loader && <>\n <span className={cn(activeLoadingLabel && \"mr-1\", \"inline-block h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent\")} />\n {activeLoadingLabel && <span>{activeLoadingLabel}</span>}\n </>}\n {(icon && !loader) && <Icon name={icon} className={cn(label && \"mr-1\", iconClass)} />}\n {!loader && label}\n </button>\n );\n\n return (\n <Wrapper className={wrapClass}>\n {pre}\n <BadgeOverlay badge={!loader ? badge : undefined}>{button}</BadgeOverlay>\n {post}\n </Wrapper>\n );\n};\n\r\nexport const ActionButton = ({\r\n onClick,\r\n icon = undefined,\r\n label = undefined,\r\n badge = undefined,\r\n title = undefined,\r\n disabled = false,\r\n pre = undefined,\n post = undefined,\n wrapClass = undefined,\n className = undefined,\n iconClass = undefined,\n style = undefined,\n variant = undefined,\n motion: motionConfig = undefined\n}: IButton = {}) => {\n const theme = useTheme(\"button\");\n const motion = usePressMotion(disabled, style, motionConfig ?? theme.ActionButton.motion?.press ?? 'press');\n const button = (\n <button\n title={title}\n className={cn(\n buttonBaseClass,\n variant ? resolveButtonVariant(variant) : (className || theme.ActionButton.className),\n variant ? className : undefined\n )}\n style={motion.style}\n disabled={disabled}\n {...motion.pressHandlers}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onClick?.(e);\n }}\n >\n {icon && <Icon name={icon} className={cn(label && \"mr-1\", iconClass)} />}\n {label}\n </button>\n );\n\n return (\n <Wrapper className={wrapClass}>\n {pre}\n <span\n title={disabled ? title : undefined}\n style={disabled ? { cursor: 'not-allowed', display: 'inline-flex' } : undefined}\n >\n <BadgeOverlay badge={badge}>{button}</BadgeOverlay>\n </span>\n {post}\n </Wrapper>\n );\n};\n\r\ninterface BackLinkProps extends UIProps {\r\n label?: string;\r\n}\r\n\r\nexport const BackLink = ({\r\n label = \"<- Back\",\r\n pre = undefined,\r\n post = undefined,\r\n wrapClass = undefined,\r\n className = undefined\r\n}: BackLinkProps) => {\n const navigate = useNavigate();\n const theme = useTheme(\"button\");\n return (\n <Wrapper className={wrapClass}>\r\n {pre}\r\n <a href=\"#\"\n className={cn(buttonBaseClass, className || theme.LinkButton.className)}\n onClick={(e) => {\r\n e.preventDefault();\r\n navigate(-1);\r\n }}\r\n >\r\n {label}\r\n </a>\r\n {post}\r\n </Wrapper>\r\n );\r\n};\r\n\r\ninterface GoSiteProps extends UIProps {\r\n label: string;\r\n url: string;\r\n}\r\n\r\nexport const GoSite = ({\r\n label,\r\n url,\r\n pre = undefined,\r\n post = undefined,\r\n wrapClass = undefined,\r\n className = undefined\r\n}: GoSiteProps) => {\r\n const theme = useTheme(\"button\");\r\n\r\n return (\r\n <Wrapper className={wrapClass}>\r\n {pre}\r\n <h1 className={cn(\"m-0 text-2xl font-bold\", className)}>\r\n {label + \" \"}\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\">\n <Icon name=\"external-link\" />\n </a>\n </h1>\r\n {post}\r\n </Wrapper>\r\n );\r\n};\r\n\r\ninterface ReferSiteProps extends UIProps {\r\n title: string;\r\n url: string;\r\n imageUrl: string;\r\n width?: number | string;\r\n}\r\n\r\nexport const ReferSite = ({\r\n title,\r\n url,\r\n imageUrl,\r\n width,\r\n pre = undefined,\r\n post = undefined,\r\n wrapClass = undefined,\r\n className = undefined\r\n}: ReferSiteProps) => {\r\n return (\r\n <Wrapper className={wrapClass}>\r\n {pre}\r\n <a\r\n href={url}\r\n className={cn(\"mr-1\", className)}\r\n target=\"_blank\"\r\n title={title}\r\n rel=\"noopener noreferrer\"\r\n >\r\n <img src={imageUrl} width={width ? width : \"100\"} height=\"30\" alt={title} />\r\n </a>\r\n {post}\r\n </Wrapper>\r\n );\r\n};\r\n\r\n","import React, { createContext, useContext } from 'react';\nimport type { AuthProviderAdapter } from './AuthProvider';\n\ntype AuthProviderContextValue = {\n registry: Record<string, AuthProviderAdapter>;\n defaultKey: string;\n};\n\nconst AuthProviderContext = createContext<AuthProviderContextValue | null>(null);\n\nexport const AuthProvider = ({\n registry,\n defaultKey,\n children,\n}: AuthProviderContextValue & { children: React.ReactNode }) => (\n <AuthProviderContext.Provider value={{ registry, defaultKey }}>\n {children}\n </AuthProviderContext.Provider>\n);\n\nexport const useAuthProvider = (name?: string): AuthProviderAdapter => {\n const ctx = useContext(AuthProviderContext);\n if (!ctx) throw new Error('useAuthProvider must be used inside <App providers={...} />.');\n const key = name ?? ctx.defaultKey;\n const provider = ctx.registry[key];\n if (!provider) throw new Error(`AuthProvider '${key}' is not registered. Available: ${Object.keys(ctx.registry).join(', ')}`);\n return provider;\n};\n\nexport default AuthProviderContext;\n","interface PathUtils {\r\n basename(path: string): string;\r\n extname(path: string): string;\r\n dirname(path: string): string;\r\n filename(path: string): string;\r\n parentBasename(path: string): string;\r\n parentDirname(path: string): string;\r\n parentFilename(path: string): string;\r\n append(path: string, suffix: string): string;\r\n prepend(path: string, prefix: string): string;\r\n changeFilename(path: string, options?: { prefix?: string; suffix?: string; ext?: string | null }): string;\r\n join(...paths: string[]): string;\r\n parse(path: string): { root: string; dir: string; base: string; ext: string; name: string; };\r\n}\r\n\r\nconst path: PathUtils = {\r\n // Restituisce l'ultimo segmento di un percorso, escludendo la barra finale se presente\r\n basename: (path) => {\r\n const segments = path.split('/').filter(Boolean);\r\n return segments.pop() || '';\r\n },\r\n\r\n // Restituisce l'estensione del file, includendo il punto\r\n extname: (path) => {\r\n const index = path.lastIndexOf('.');\r\n return index > 0 ? path.slice(index) : '';\r\n },\r\n\r\n // Restituisce la directory del percorso, escludendo il nome del file\r\n dirname: (path) => {\r\n const segments = path.split('/').filter(Boolean);\r\n segments.pop(); // Rimuovi il basename\r\n return '/' + segments.join('/');\r\n },\r\n\r\n // Restituisce il nome del file senza l'estensione\r\n filename: (path) => {\r\n const base = path.split('/').pop() || '';\r\n const ext = base.includes('.') ? base.slice(base.lastIndexOf('.')) : '';\r\n return base.replace(ext, '');\r\n },\r\n\r\n // Restituisce il nome del percorso genitore\r\n parentBasename: (path) => {\r\n const segments = path.split('/').filter(Boolean);\r\n segments.pop(); // Rimuovi il basename\r\n return segments.pop() || '';\r\n },\r\n\r\n // Restituisce la directory del percorso genitore\r\n parentDirname: (path) => {\r\n const segments = path.split('/').filter(Boolean);\r\n segments.pop(); // Rimuovi il basename\r\n segments.pop(); // Rimuovi il parent basename\r\n return '/' + segments.join('/');\r\n },\r\n\r\n // Restituisce il nome del file del percorso genitore senza l'estensione\r\n parentFilename: (path) => {\r\n const segments = path.split('/').filter(Boolean);\r\n segments.pop(); // Rimuovi il basename\r\n const parentBase = segments.pop() || '';\r\n const ext = parentBase.includes('.') ? parentBase.slice(parentBase.lastIndexOf('.')) : '';\r\n return parentBase.replace(ext, '');\r\n },\r\n\r\n // Aggiunge un suffisso al nome del file mantenendo l'estensione\r\n append: (path, suffix) => {\r\n const dir = path.split('/').slice(0, -1).join('/');\r\n const base = path.split('/').pop() || '';\r\n const ext = base.includes('.') ? base.slice(base.lastIndexOf('.')) : '';\r\n const name = base.replace(ext, '');\r\n return (dir ? dir + '/' : '') + name + suffix + ext;\r\n },\r\n\r\n // Aggiunge un prefisso al nome del file mantenendo l'estensione\r\n prepend: (path, prefix) => {\r\n const dir = path.split('/').slice(0, -1).join('/');\r\n const base = path.split('/').pop() || '';\r\n const ext = base.includes('.') ? base.slice(base.lastIndexOf('.')) : '';\r\n const name = base.replace(ext, '');\r\n return (dir ? dir + '/' : '') + prefix + name + ext;\r\n },\r\n\r\n // Modifica il nome del file aggiungendo un prefisso e/o un suffisso e opzionalmente cambiando l'estensione\r\n changeFilename: (path, { prefix = '', suffix = '', ext = null } = {}) => {\r\n const dir = path.split('/').slice(0, -1).join('/');\r\n const base = path.split('/').pop() || '';\r\n const currentExt = base.includes('.') ? base.slice(base.lastIndexOf('.')) : '';\r\n const name = base.replace(currentExt, '');\r\n //const newExt = ext === '' ? '' : ext.startsWith('.') ? ext : (ext ? '.' + ext : currentExt);\r\n const newExt = ext !== null ? (ext ? (ext.startsWith('.') ? ext : '.' + ext) : '') : currentExt;\r\n return (dir ? dir + '/' : '') + prefix + name + suffix + newExt;\r\n },\r\n\r\n // Combina diversi segmenti di percorso in un unico percorso\r\n join: (...paths) => {\r\n return paths.join('/').replace(/\\/+/g, '/');\r\n },\r\n\r\n // Divide il percorso in root, dir, base, ext, e name\r\n parse: (inputPath) => {\r\n const ext = path.extname(inputPath);\r\n const base = path.basename(inputPath);\r\n const dir = path.dirname(inputPath);\r\n const root = inputPath.startsWith('/') ? '/' : '';\r\n const name = base.replace(ext, '');\r\n\r\n return {\r\n root: root,\r\n dir: dir,\r\n base: base,\r\n ext: ext,\r\n name: name\r\n };\r\n }\r\n};\r\n\r\nexport default path;","import React, { useEffect, useState } from \"react\";\nimport path from \"../../libs/path\";\nimport { PLACEHOLDER_USER, useTheme } from \"../../Theme\";\nimport type { UIProps } from '../types';\nimport { Wrapper } from \"./GridSystem\";\nimport { cn } from '../../libs/cn';\nimport { useEnterMotion, useMotionState } from '../../motion';\nimport type { MotionReference } from '../../motion';\nimport type { BadgeDescriptor } from './Badge';\n\nexport type AvatarFit = 'cover' | 'contain' | 'fill' | 'scale-down' | 'none';\n\ninterface ImageAvatarProps extends UIProps {\n src: string;\n width?: number;\n height?: number;\n title?: string;\n alt?: string;\n fit?: AvatarFit;\n badge?: BadgeDescriptor;\n feedback?: React.ReactNode;\n}\n\nconst ImageAvatar = ({\n src,\n width = undefined,\n height = undefined,\n title = undefined,\n alt = undefined,\n fit = 'cover',\n badge = undefined,\n feedback = undefined,\n pre = undefined,\n post = undefined,\n wrapClass = undefined,\n className = undefined,\n}: ImageAvatarProps) => {\n const theme = useTheme(\"image\");\n const [imgSrc, setImgSrc] = useState(PLACEHOLDER_USER);\n\n const enterRef: MotionReference = theme.ImageAvatar?.motion?.enter ?? false;\n const hoverRef: MotionReference = theme.ImageAvatar?.motion?.hover ?? false;\n const hasHover = hoverRef !== false;\n\n const enterStyle = useEnterMotion(undefined, enterRef, false);\n const [hovered, setHovered] = useState(false);\n const hoverStyle = useMotionState(hovered, hoverRef, false);\n\n const cacheKey = src ? src.split('?')[0] : src;\n const storageKey = `avatar::${cacheKey}`;\n const failedStorageKey = `avatar-fetch-failed::${cacheKey}`;\n const resolvedAlt = alt || title || path.filename(src || PLACEHOLDER_USER);\n\n useEffect(() => {\n if (!src || src.startsWith('data:')) {\n setImgSrc(src || PLACEHOLDER_USER);\n return;\n }\n\n const cached = localStorage.getItem(storageKey);\n if (cached) {\n setImgSrc(cached);\n return;\n }\n\n setImgSrc(src);\n\n const failedAt = Number(localStorage.getItem(failedStorageKey) || 0);\n if (failedAt && Date.now() - failedAt < 24 * 60 * 60 * 1000) return;\n\n // Cache remote avatars opportunistically. If CORS blocks the fetch,\n // keep the browser-rendered image instead of replacing it with fallback.\n fetch(src)\n .then(res => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.blob();\n })\n .then(blob => {\n const reader = new FileReader();\n reader.onloadend = () => {\n const data = reader.result as string;\n localStorage.setItem(storageKey, data);\n localStorage.removeItem(failedStorageKey);\n setImgSrc(data);\n };\n reader.readAsDataURL(blob);\n })\n .catch(err => {\n console.warn(\"ImageAvatar:\", err.message);\n localStorage.setItem(failedStorageKey, String(Date.now()));\n });\n }, [src, storageKey, failedStorageKey]);\n\n const size = width ?? height ?? undefined;\n const imgStyle: React.CSSProperties = {\n ...(width && height\n ? { width, height, objectFit: fit }\n : size\n ? { width: size, height: size, objectFit: fit }\n : { objectFit: fit }),\n ...(hasHover ? hoverStyle : {}),\n };\n\n return (\n <Wrapper className={cn(\"flex items-center gap-3\", wrapClass || theme.ImageAvatar?.wrapClass)}>\n {pre && <div className=\"shrink-0 self-center\">{pre}</div>}\n <div\n className={cn(\"relative shrink-0\", hasHover && \"overflow-hidden\")}\n style={enterStyle}\n onMouseEnter={hasHover ? () => setHovered(true) : undefined}\n onMouseLeave={hasHover ? () => setHovered(false) : undefined}\n >\n <img\n src={imgSrc}\n alt={resolvedAlt}\n width={width ?? size}\n height={height ?? size}\n className={cn(className || theme.ImageAvatar?.className)}\n title={title}\n style={imgStyle}\n onError={() => setImgSrc(PLACEHOLDER_USER)}\n />\n {badge && (\n <span className={cn(\n \"badge badge-overlay absolute top-0 right-0 translate-x-1/4 -translate-y-1/4 z-10\",\n \"badge-\" + (badge.type || 'success'),\n !badge.content && \"!p-0 !min-w-0 w-3 h-3 rounded-full\",\n badge.className,\n )}>\n {badge.content}\n </span>\n )}\n {feedback && <div className=\"mt-1 text-xs text-center\">{feedback}</div>}\n </div>\n {post && <div className=\"min-w-0 self-center\">{post}</div>}\n </Wrapper>\n );\n};\n\nexport default ImageAvatar;\n","export interface ProviderConfigurationState {\n configured: boolean;\n reason?: string;\n missingKeys?: string[];\n}\n\nexport interface ProviderConfigurable {\n isConfigured?(): boolean;\n getConfigurationState?(): ProviderConfigurationState;\n}\n\nexport const getMissingKeys = (\n config: Record<string, unknown> | undefined,\n keys: string[],\n prefix = ''\n): string[] => keys\n .filter((key) => {\n const value = config?.[key];\n return value === undefined || value === null || value === '';\n })\n .map((key) => `${prefix}${key}`);\n\nexport const createConfigurationState = (\n provider: string,\n missingKeys: string[]\n): ProviderConfigurationState => ({\n configured: missingKeys.length === 0,\n missingKeys,\n reason: missingKeys.length\n ? `${provider} is not configured. Missing: ${missingKeys.join(', ')}.`\n : undefined,\n});\n\nexport const getProviderConfigurationState = (\n provider: ProviderConfigurable | null | undefined,\n fallbackName = 'Provider'\n): ProviderConfigurationState => {\n if (!provider) {\n return {\n configured: false,\n reason: `${fallbackName} is not registered.`,\n };\n }\n\n if (provider.getConfigurationState) {\n return provider.getConfigurationState();\n }\n\n if (provider.isConfigured) {\n const configured = provider.isConfigured();\n return {\n configured,\n reason: configured ? undefined : `${fallbackName} is not configured.`,\n };\n }\n\n return { configured: true };\n};\n","import React, { useEffect } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { fetchRest } from './libs/fetch';\nimport { ActionButton, type IButton } from './components/ui/Buttons';\nimport { getGlobalVars, setGlobalVars, useGlobalVars } from './Global';\nimport { useAuthProvider } from './providers/auth/AuthProviderContext';\nimport type { AuthIntent, UserProfile } from './providers/auth/AuthProvider';\nimport ImageAvatar from './components/ui/ImageAvatar';\nimport { PLACEHOLDER_USER, useTheme } from './Theme';\nimport { getProviderConfigurationState } from './providers/ProviderConfiguration';\nimport Icon from './components/ui/Icon';\n\ninterface IAuthResponse {\n iat: number;\n access_token: string;\n expires_in: number;\n token_type: string;\n scope: string;\n refresh_token: string;\n account_id: string;\n uid: string;\n}\n\ninterface AuthChallenge {\n authServer: string;\n clientID: string;\n codeVerifier: string;\n}\n\nexport const AUTH_REDIRECT_URI = '/__/authorize';\nconst _AUTHS = 'auths';\n\nfunction generateCodeVerifier(): string {\n const array = new Uint32Array(56 / 2);\n window.crypto.getRandomValues(array);\n return Array.from(array, (dec) => (`0${dec.toString(16)}`).substr(-2)).join('');\n}\n\nasync function generateCodeChallenge(codeVerifier: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(codeVerifier);\n const digest = await window.crypto.subtle.digest('SHA-256', data);\n return btoa(String.fromCharCode(...new Uint8Array(digest)))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n}\n\nconst openAuthWindow = (authUrl: string, windowName: string, width: number) => {\n const left = window.screen.width / 2 - width / 2;\n const top = window.screen.height / 2 - width / 2;\n const options = `width=${width},height=${width},top=${top},left=${left}`;\n return window.open(authUrl, windowName, options);\n};\n\nexport function redirectToAuthPage({\n authServer,\n clientID,\n scopes = undefined,\n refreshParamName = 'access_type',\n}: {\n authServer: string;\n clientID: string;\n scopes?: string[];\n refreshParamName?: string;\n}) {\n const codeVerifier = generateCodeVerifier();\n localStorage.setItem('authChallenge', JSON.stringify({\n authServer,\n clientID,\n codeVerifier,\n }));\n\n generateCodeChallenge(codeVerifier).then((codeChallenge) => {\n const params = new URLSearchParams({\n response_type: 'code',\n client_id: clientID,\n redirect_uri: `${window.location.origin}${AUTH_REDIRECT_URI}`,\n scope: scopes ? scopes.join(' ') : '',\n code_challenge: codeChallenge,\n code_challenge_method: 'S256',\n [refreshParamName]: 'offline',\n });\n openAuthWindow(`https://${authServer}/authorize?${params.toString()}`, 'auth', 600);\n });\n}\n\nconst setAuths = (authServer: string, clientID: string, authResponse: IAuthResponse): void => {\n setGlobalVars({\n [clientID]: {\n ...authResponse,\n server: authServer,\n client_id: clientID,\n iat: Math.floor(Date.now() / 1000),\n },\n }, _AUTHS);\n};\n\nconst Authorize = () => {\n const location = useLocation().search;\n\n useEffect(() => {\n const query = new URLSearchParams(location);\n\n const code = query.get('code');\n const getJsonFromStorage = <T = any>(key: string, fallback?: T): T | undefined => {\n try {\n return JSON.parse(localStorage.getItem(key) || '') || fallback;\n } catch {\n return fallback;\n }\n };\n\n const authChallenge = getJsonFromStorage<AuthChallenge>('authChallenge');\n if (!code || !authChallenge) return;\n\n const { authServer, clientID, codeVerifier } = authChallenge;\n fetchRest(`https://${authServer}/token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: {\n grant_type: 'authorization_code',\n client_id: clientID,\n code,\n redirect_uri: `${window.location.origin}${AUTH_REDIRECT_URI}`,\n code_verifier: codeVerifier,\n },\n })\n .then((authResponse: IAuthResponse) => {\n setAuths(authServer, clientID, authResponse);\n localStorage.removeItem('authChallenge');\n window.close();\n })\n .catch((error) => console.error('Error:', error));\n }, [location]);\n\n return <div>Loading...</div>;\n};\n\nconst refreshAccessToken = (authServer: string, clientID: string, refresh_token: string): Promise<string | null> => {\n return fetchRest(`https://${authServer}/token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: {\n grant_type: 'refresh_token',\n client_id: clientID,\n refresh_token,\n },\n })\n .then((authResponse: IAuthResponse) => {\n setAuths(authServer, clientID, authResponse);\n return authResponse.access_token;\n })\n .catch((error) => {\n console.error('Error:', error);\n localStorage.removeItem(_AUTHS);\n return null;\n });\n};\n\nexport const useAccessToken = (clientID: string, renew = true): boolean => {\n const [auths] = useGlobalVars(_AUTHS);\n const auth = auths?.[clientID] || {};\n\n const isExpired = Math.floor(Date.now() / 1000) >= (auth?.iat + auth?.expires_in);\n return !!(auth && auth?.access_token && (!isExpired || (renew && isExpired && auth.refresh_token && (refreshAccessToken(auth.server, auth.client_id, auth.refresh_token) || true))));\n};\n\nexport const getAuthSession = (clientID: string) => {\n const auths = getGlobalVars(_AUTHS);\n return auths?.[clientID];\n};\n\nexport const clearAccessToken = (clientID: string): void => {\n const auths = getGlobalVars(_AUTHS) || {};\n if (auths[clientID]) {\n delete auths[clientID];\n setGlobalVars(auths, _AUTHS);\n }\n};\n\nexport const getAccessToken = (clientID: string): Promise<string | null> => {\n const auth = getAuthSession(clientID);\n const isExpired = Math.floor(Date.now() / 1000) > auth?.iat + auth?.expires_in;\n\n if (!isExpired && auth?.access_token) {\n return Promise.resolve(auth.access_token);\n }\n if (isExpired && auth?.refresh_token) {\n return refreshAccessToken(auth.server, auth.client_id, auth.refresh_token);\n }\n\n return Promise.resolve(null);\n};\n\nexport type AuthButtonAspect = 'button' | 'avatar';\n\nexport interface AuthButtonProps extends Omit<IButton, 'onClick'> {\n provider?: string;\n intent?: AuthIntent;\n aspect?: AuthButtonAspect;\n scopes?: string[];\n iconLogout?: string;\n avatarClass?: string;\n options?: Omit<IButton, 'onClick'>;\n}\n\nconst isLogoutIntent = (intent?: AuthIntent): boolean =>\n intent === 'signOut' || intent === 'disconnect';\n\nexport const AuthButton = ({\n provider,\n intent = 'signIn',\n aspect = 'button',\n scopes = undefined,\n iconLogout = 'log-out',\n avatarClass = undefined,\n options = {},\n label = undefined,\n icon = undefined,\n title = undefined,\n className = undefined,\n disabled = false,\n ...rest\n}: AuthButtonProps) => {\n const auth = useAuthProvider(provider);\n const theme = useTheme('auth');\n const providerLabel = provider || 'AuthProvider';\n const getConfigurationState = React.useCallback(\n () => getProviderConfigurationState(auth, providerLabel),\n [auth, providerLabel]\n );\n const configurationState = React.useMemo(\n () => getConfigurationState(),\n [getConfigurationState]\n );\n const isConfigured = configurationState.configured;\n const [user, setUser] = React.useState<UserProfile | null>(() => isConfigured ? auth.getUser() : null);\n const [authenticated, setAuthenticated] = React.useState<boolean>(() => isConfigured && (auth.isAuthenticated?.() ?? !!auth.getUser()));\n const [avatarOpen, setAvatarOpen] = React.useState(false);\n const notConfiguredTitle = configurationState.reason\n || `Auth provider \"${providerLabel}\" is not configured. Add the required client key before using this action.`;\n\n React.useEffect(() => {\n const configured = getConfigurationState().configured;\n if (!configured) {\n setUser(null);\n setAuthenticated(false);\n setAvatarOpen(false);\n return () => {};\n }\n\n setUser(auth.getUser());\n setAuthenticated(auth.isAuthenticated?.() ?? !!auth.getUser());\n return auth.onAuthChange((nextUser) => {\n setUser(nextUser);\n setAuthenticated(auth.isAuthenticated?.() ?? !!nextUser);\n });\n }, [auth, getConfigurationState]);\n\n const refreshState = () => {\n if (!getConfigurationState().configured) {\n setUser(null);\n setAuthenticated(false);\n return;\n }\n\n const nextUser = auth.getUser();\n setUser(nextUser);\n setAuthenticated(auth.isAuthenticated?.() ?? !!nextUser);\n };\n\n const runIntent = async () => {\n if (!getConfigurationState().configured) return;\n\n if (isLogoutIntent(intent)) {\n await auth.signOut();\n refreshState();\n return;\n }\n\n if (!auth.signIn) {\n throw new Error('AuthProvider does not implement signIn().');\n }\n\n await auth.signIn({ scopes, intent });\n refreshState();\n };\n\n const mergedOptions = {\n ...rest,\n ...options,\n label: options.label ?? label ?? (authenticated ? 'Connected' : intent === 'signIn' ? 'Sign in' : 'Connect'),\n icon: options.icon ?? icon ?? (authenticated ? 'link' : 'link-break'),\n title: !isConfigured ? notConfiguredTitle : options.title ?? title,\n className: options.className ?? className,\n disabled: !isConfigured || (options.disabled ?? disabled),\n style: !isConfigured\n ? { ...(rest.style || {}), ...(options.style || {}), opacity: 0.55, cursor: 'not-allowed' }\n : options.style ?? rest.style,\n };\n\n if (aspect === 'avatar') {\n const displayName = user?.displayName ?? user?.email ?? (authenticated ? 'Authenticated' : 'Sign in');\n\n return (\n <div\n className={className || theme.SignIn.className}\n style={{ position: 'relative', display: 'inline-flex' }}\n title={!isConfigured ? notConfiguredTitle : undefined}\n >\n <button\n type=\"button\"\n className=\"border-0 bg-transparent p-0\"\n title={!isConfigured ? notConfiguredTitle : displayName}\n aria-label={displayName}\n disabled={!isConfigured || disabled}\n aria-disabled={!isConfigured || disabled}\n style={!isConfigured ? { opacity: 0.55, cursor: 'not-allowed' } : undefined}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n if (!isConfigured || disabled) return;\n setAvatarOpen((value) => !value);\n }}\n >\n <ImageAvatar\n src={user?.photoURL ?? PLACEHOLDER_USER}\n title={!isConfigured ? notConfiguredTitle : displayName}\n height={36}\n className={avatarClass || theme.SignIn.avatarClass}\n />\n </button>\n {avatarOpen && (\n <div\n role=\"menu\"\n className=\"absolute right-0 top-full z-50 mt-2 min-w-40 overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md\"\n >\n {!authenticated && (\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"flex w-full cursor-pointer select-none items-center rounded-sm px-2 py-1.5 text-left text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground\"\n onClick={runIntent}\n >\n {label ?? 'SIGN IN'}\n </button>\n )}\n {authenticated && (\n <button\n type=\"button\"\n role=\"menuitem\"\n className=\"flex w-full cursor-pointer select-none items-center rounded-sm px-2 py-1.5 text-left text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground\"\n onClick={async () => {\n await auth.signOut();\n refreshState();\n setAvatarOpen(false);\n }}\n >\n {iconLogout && <Icon name={iconLogout} className=\"mr-2\" />}\n LOGOUT\n </button>\n )}\n </div>\n )}\n </div>\n );\n }\n\n return (\n <ActionButton\n {...mergedOptions}\n onClick={runIntent}\n />\n );\n};\n\nexport default Authorize;\n","import React, { createContext, useContext } from 'react';\nimport type { DataProviderAdapter } from './DataProvider';\n\ntype DataProviderContextValue = {\n registry: Record<string, DataProviderAdapter>;\n defaultKey: string;\n};\n\nconst DataProviderContext = createContext<DataProviderContextValue | null>(null);\n\nexport const DataProvider = ({\n registry,\n defaultKey,\n children,\n}: DataProviderContextValue & { children: React.ReactNode }) => (\n <DataProviderContext.Provider value={{ registry, defaultKey }}>\n {children}\n </DataProviderContext.Provider>\n);\n\nexport const useDataProvider = (name?: string): DataProviderAdapter => {\n const ctx = useContext(DataProviderContext);\n if (!ctx) throw new Error('useDataProvider must be used inside <App>.');\n const key = name ?? ctx.defaultKey;\n const provider = ctx.registry[key];\n if (!provider) throw new Error(`DataProvider '${key}' is not registered. Available: ${Object.keys(ctx.registry).join(', ')}`);\n return provider;\n};\n\nexport default DataProviderContext;\n","import React from 'react';\r\nimport {useTheme} from \"../../Theme\";\r\nimport { UIProps } from '../..';\r\nimport { Wrapper } from \"./GridSystem\";\r\n\r\ninterface LoaderProps extends UIProps {\r\n show?: boolean;\r\n children: React.ReactNode;\r\n icon?: string;\r\n title?: string;\r\n description?: string;\r\n}\r\n\r\nfunction Loader({\r\n children,\r\n show = false,\r\n icon = undefined,\r\n title = undefined,\r\n description = undefined,\r\n pre = undefined,\r\n post = undefined,\r\n wrapClass = undefined,\r\n className = undefined\r\n}: LoaderProps) {\r\n const theme = useTheme(\"loader\");\r\n icon = icon || theme.Loader.icon;\r\n title = title || theme.Loader.title;\r\n description = description || theme.Loader.description;\r\n\r\n return show ? (\r\n <Wrapper className={wrapClass || theme.Loader.wrapClass}>\r\n <div className={\"relative \" + (className || theme.Loader.className)} style={{minHeight: \"200px\"}}>\r\n <div className=\"absolute top-0 bottom-0 left-0 right-0\"\r\n style={{zIndex:10, backdropFilter: \"blur(2px)\", background:\"rgba(255, 255, 255, 0.5)\"}}>\r\n {pre}\r\n {(icon || title || description) && <div className=\"p-4 text-center position-sticky top-50\">\r\n {icon && <div className={icon}></div>}\r\n {title && <h2 className=\"my-3 f-w-400\">{title}</h2>}\r\n {description && <p className=\"mb-0\">{description}</p>}\r\n </div>}\r\n {post}\r\n </div>\r\n {children}\r\n </div>\r\n </Wrapper>\r\n ) : children;\r\n}\r\n\r\nexport default Loader;","import React from 'react';\r\nimport {useTheme} from \"../../Theme\";\r\nimport {Wrapper} from \"./GridSystem\";\r\nimport Loader from \"./Loader\";\r\nimport { UIProps } from '../..';\r\nimport { cn } from '../../libs/cn';\r\n\r\ninterface CardProps extends UIProps {\r\n children: React.ReactNode;\r\n title?: string;\r\n header?: string | React.ReactNode;\r\n footer?: string | React.ReactNode;\r\n headerClass?: string;\r\n bodyClass?: string;\r\n footerClass?: string;\r\n showLoader?: boolean;\r\n showArrow?: boolean;\r\n}\r\n\r\nconst Card = ({\r\n children,\r\n title = undefined,\r\n header = undefined,\r\n footer = undefined,\r\n showLoader = undefined,\r\n showArrow = undefined,\r\n wrapClass = undefined,\r\n className = undefined,\r\n headerClass = undefined,\r\n bodyClass = undefined,\r\n footerClass = undefined\r\n}: CardProps) => {\r\n const theme = useTheme(\"card\");\r\n\r\n return (\r\n <Wrapper className={wrapClass || theme.Card.wrapClass}>\r\n <div className={cn(\"card\", className || theme.Card.className)}>\r\n {(header || title) &&\r\n <div className={cn(\"card-header\", headerClass || theme.Card.headerClass)}>\r\n {title ? <h5 className=\"m-0 text-base font-semibold leading-none whitespace-nowrap\">{title}</h5> : \"\"}\r\n {header}\r\n </div>\r\n }\r\n\r\n <div className={cn(\"card-body\", bodyClass || theme.Card.bodyClass)}>\r\n <Loader show={showLoader || theme.Card.showLoader}>\r\n {children}\r\n </Loader>\r\n </div>\r\n {footer && <div className={cn(\"card-footer\", footerClass || theme.Card.footerClass)}>{footer}</div>}\r\n {(showArrow || theme.Card.showArrow) &&\r\n <div className=\"card-arrow\">\r\n <div className=\"card-arrow-top-left\" />\r\n <div className=\"card-arrow-top-right\" />\r\n <div className=\"card-arrow-bottom-left\" />\r\n <div className=\"card-arrow-bottom-right\" />\r\n </div>\r\n }\r\n </div>\r\n </Wrapper>\r\n );\r\n};\r\n\r\nexport default Card;\r\n","import React, {useState} from 'react';\nimport { createPortal } from 'react-dom';\nimport {useTheme} from \"../../Theme\";\nimport {ActionButton, LoadingButton} from \"./Buttons\";\nimport type { MotionUIProps } from '../types';\nimport { useMotionEffect, useMotionState } from '../../motion';\nimport Icon from './Icon';\nimport { cn } from '../../libs/cn';\n\nexport type ModalSaveHandler = (e: React.MouseEvent<HTMLButtonElement>) => Promise<boolean>;\nexport type ModalDeleteHandler = (e: React.MouseEvent<HTMLButtonElement>) => Promise<boolean>;\n\ninterface ModalProps extends MotionUIProps {\n children: React.ReactNode;\n title?: React.ReactNode;\n header?: React.ReactNode;\n footer?: React.ReactNode | false;\n onClose?: () => void;\n onSave?: ModalSaveHandler;\n onDelete?: ModalDeleteHandler;\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"fullscreen\";\n position?: \"center\" | \"top\" | \"left\" | \"right\" | \"bottom\";\n buttonFullscreen?: boolean;\n buttonCancel?: boolean;\n headerClass?: string;\n titleClass?: string;\r\n subTitleClass?: string;\r\n bodyClass?: string;\r\n footerClass?: string;\n closeOnBackdrop?: boolean;\n}\n\r\ninterface ModalYesNoProps {\n title?: React.ReactNode;\n children: React.ReactNode;\r\n onYes?: (e: React.MouseEvent<HTMLButtonElement>) => Promise<boolean>;\r\n onNo?: (e: React.MouseEvent<HTMLButtonElement>) => Promise<boolean>;\r\n onClose?: () => void;\r\n}\r\n\r\ninterface ModalOkProps {\n children: React.ReactNode;\n title?: React.ReactNode;\n onClose?: () => void;\r\n}\r\n\r\nconst Modal = (props: ModalProps) => {\r\n return <ModalDefault {...props} />;\r\n};\r\n\r\nconst ModalDefault = ({\n children,\r\n title = undefined,\r\n header = undefined,\r\n footer = undefined,\r\n onClose = undefined,\r\n onSave = undefined,\r\n onDelete = undefined,\n size = undefined,\n position = undefined,\n buttonFullscreen = true,\n buttonCancel = true,\n pre = undefined,\n post = undefined,\r\n wrapClass = undefined,\r\n className = undefined,\r\n headerClass = undefined,\r\n titleClass = undefined,\n subTitleClass = undefined,\n bodyClass = undefined,\n footerClass = undefined,\n closeOnBackdrop = true,\n motion: motionConfig = undefined\n}: ModalProps) => {\n const theme = useTheme(\"modal\");\n const [entered, setEntered] = React.useState(false);\n const closingRef = React.useRef(false);\n const closeTimerRef = React.useRef<number | undefined>(undefined);\n\n const [sizeClass, setSizeClass] = useState(size);\n\n const dialogSizeClass = {\n sm: \"max-w-sm\",\n md: \"max-w-md\",\n lg: \"max-w-2xl\",\n xl: \"max-w-4xl\",\n fullscreen: \"max-w-none w-screen h-dvh rounded-none\",\n }[sizeClass || theme.Modal.size || \"lg\"];\n\n const sideWidthClass = {\n sm: \"w-72\",\n md: \"w-96\",\n lg: \"w-[36rem]\",\n xl: \"w-[48rem]\",\n fullscreen: \"w-screen\",\n }[sizeClass || theme.Modal.size || \"lg\"];\n\n const verticalHeightClass = {\n sm: \"max-h-[30vh]\",\n md: \"max-h-[45vh]\",\n lg: \"max-h-[60vh]\",\n xl: \"max-h-[85vh]\",\n fullscreen: \"h-dvh max-h-none\",\n }[sizeClass || theme.Modal.size || \"lg\"];\n\n const positions = {\n center: {\n coverClass: \"fixed inset-0 z-50 flex items-center justify-center overflow-y-auto p-4\",\n dialogClass: cn(\"relative z-50 flex w-full flex-col overflow-hidden rounded-lg border bg-card shadow-xl\", dialogSizeClass, wrapClass || theme.Modal.wrapClass),\n contentClass: cn(\"flex min-h-0 flex-1 flex-col\", className || theme.Modal.className),\n headerClass: cn(\"flex items-center justify-between gap-3 border-b px-4 py-3\", headerClass || theme.Modal.headerClass),\n titleClass: cn(\"text-lg font-semibold leading-none\", titleClass || theme.Modal.titleClass),\n subTitleClass: cn(\"mt-1 text-sm text-muted-foreground\", subTitleClass || theme.Modal.subTitleClass),\n bodyClass: cn(\"min-h-0 flex-1 overflow-auto p-4\", bodyClass || theme.Modal.bodyClass),\n footerClass: cn(\"flex items-center justify-end gap-2 border-t px-4 py-3\", footerClass || theme.Modal.footerClass),\n },\n top: {\n coverClass: \"\",\n dialogClass: cn(\"fixed left-0 right-0 top-0 z-50 flex flex-col border-b bg-card shadow-xl\", verticalHeightClass, wrapClass || theme.Modal.wrapClass),\n contentClass: cn(\"flex min-h-0 flex-1 flex-col\", className || theme.Modal.className),\n headerClass: cn(\"flex items-center justify-between gap-3 border-b px-4 py-3\", headerClass || theme.Modal.headerClass),\n titleClass: cn(\"text-lg font-semibold leading-none\", titleClass || theme.Modal.titleClass),\n subTitleClass: cn(\"mt-1 text-sm text-muted-foreground\", subTitleClass || theme.Modal.subTitleClass),\n bodyClass: cn(\"min-h-0 flex-1 overflow-auto p-4\", bodyClass || theme.Modal.bodyClass),\n footerClass: cn(\"flex items-center justify-end gap-2 border-t px-4 py-3\", footerClass || theme.Modal.footerClass),\n },\n left: {\n coverClass: \"\",\n dialogClass: cn(\"fixed bottom-0 left-0 top-0 z-50 flex max-w-full flex-col border-r bg-card shadow-xl\", sideWidthClass, wrapClass || theme.Modal.wrapClass),\n contentClass: cn(\"flex min-h-0 flex-1 flex-col\", className || theme.Modal.className),\n headerClass: cn(\"flex items-center justify-between gap-3 border-b px-4 py-3\", headerClass || theme.Modal.headerClass),\n titleClass: cn(\"text-lg font-semibold leading-none\", titleClass || theme.Modal.titleClass),\n subTitleClass: cn(\"mt-1 text-sm text-muted-foreground\", subTitleClass || theme.Modal.subTitleClass),\n bodyClass: cn(\"min-h-0 flex-1 overflow-auto p-4\", bodyClass || theme.Modal.bodyClass),\n footerClass: cn(\"flex items-center justify-end gap-2 border-t px-4 py-3\", footerClass || theme.Modal.footerClass),\n },\n right: {\n coverClass: \"\",\n dialogClass: cn(\"fixed bottom-0 right-0 top-0 z-50 flex max-w-full flex-col border-l bg-card shadow-xl\", sideWidthClass, wrapClass || theme.Modal.wrapClass),\n contentClass: cn(\"flex min-h-0 flex-1 flex-col\", className || theme.Modal.className),\n headerClass: cn(\"flex items-center justify-between gap-3 border-b px-4 py-3\", headerClass || theme.Modal.headerClass),\n titleClass: cn(\"text-lg font-semibold leading-none\", titleClass || theme.Modal.titleClass),\n subTitleClass: cn(\"mt-1 text-sm text-muted-foreground\", subTitleClass || theme.Modal.subTitleClass),\n bodyClass: cn(\"min-h-0 flex-1 overflow-auto p-4\", bodyClass || theme.Modal.bodyClass),\n footerClass: cn(\"flex items-center justify-end gap-2 border-t px-4 py-3\", footerClass || theme.Modal.footerClass),\n },\n bottom: {\n coverClass: \"\",\n dialogClass: cn(\"fixed bottom-0 left-0 right-0 z-50 flex flex-col border-t bg-card shadow-xl\", verticalHeightClass, wrapClass || theme.Modal.wrapClass),\n contentClass: cn(\"flex min-h-0 flex-1 flex-col\", className || theme.Modal.className),\n headerClass: cn(\"flex items-center justify-between gap-3 border-b px-4 py-3\", headerClass || theme.Modal.headerClass),\n titleClass: cn(\"text-lg font-semibold leading-none\", titleClass || theme.Modal.titleClass),\n subTitleClass: cn(\"mt-1 text-sm text-muted-foreground\", subTitleClass || theme.Modal.subTitleClass),\n bodyClass: cn(\"min-h-0 flex-1 overflow-auto p-4\", bodyClass || theme.Modal.bodyClass),\n footerClass: cn(\"flex items-center justify-end gap-2 border-t px-4 py-3\", footerClass || theme.Modal.footerClass),\n }\n }\n\n const modalPosition = sizeClass === \"fullscreen\" ? \"center\" : (position || theme.Modal.position);\n const pos = positions[modalPosition as keyof typeof positions];\n const coverClass = sizeClass === \"fullscreen\"\n ? cn(pos.coverClass, \"!overflow-hidden !p-0\")\n : pos.coverClass;\n\n React.useEffect(() => {\n const originalOverflow = window.document.body.style.overflow;\n window.document.body.style.overflow = \"hidden\";\n const frame = window.requestAnimationFrame(() => setEntered(true));\n\n return () => {\n window.cancelAnimationFrame(frame);\n if (closeTimerRef.current !== undefined) {\n window.clearTimeout(closeTimerRef.current);\n }\n window.document.body.style.overflow = originalOverflow || \"auto\";\n };\n }, []);\n\n const modalMotionReference = motionConfig ?? theme.Modal.motion?.[modalPosition as keyof NonNullable<typeof theme.Modal.motion>] ?? 'fade';\n const dialogMotion = useMotionEffect(modalMotionReference, modalMotionReference);\n\n const handleClose = () => {\n if (closingRef.current) return;\n closingRef.current = true;\n setEntered(false);\n window.document.body.style.overflow = \"auto\";\n const closeDelay = dialogMotion.transition.duration + dialogMotion.transition.delay;\n closeTimerRef.current = window.setTimeout(() => {\n onClose?.();\n }, closeDelay);\n }\n\n const dialogStyle = useMotionState(entered, modalMotionReference, modalMotionReference);\n\n const backdropStyle: React.CSSProperties = {\n ...useMotionState(entered, theme.Modal.motion?.backdrop ?? 'fade', theme.Modal.motion?.backdrop ?? 'fade'),\n cursor: closeOnBackdrop && onClose ? 'pointer' : 'default',\n };\n\n const coverStyle: React.CSSProperties = {\n cursor: modalPosition === \"center\" && closeOnBackdrop && onClose ? 'pointer' : 'default',\n };\n\n const showFooter = footer !== false && (footer || onSave || onDelete || (buttonCancel && onClose));\n\n const closeButtonClass = \"inline-flex h-9 w-9 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\";\n\n return createPortal(<>\n <div\n className={coverClass}\n style={coverStyle}\n onClick={() => {\n if (modalPosition === \"center\" && closeOnBackdrop && onClose) {\n handleClose();\n }\n }}\n >\n <div className={pos.dialogClass} style={dialogStyle} onClick={(e) => e.stopPropagation()}>\n {pre}\n <div className={pos.contentClass}>\n {(header || title || buttonFullscreen || onClose) && <div className={pos.headerClass}>\n <div className=\"min-w-0\">\n {title && <h3 className={pos.titleClass}>{title}</h3>}\n {(title && header) && <div className={pos.subTitleClass}>{header}</div>}\n {!title && header && (typeof header === \"string\" ? <h3 className={pos.titleClass}>{header}</h3> : header)}\n </div>\n {(buttonFullscreen || onClose) && <div className=\"ml-auto flex shrink-0 items-center gap-1\">\n {buttonFullscreen && <button\n type=\"button\"\n title={sizeClass === \"fullscreen\" ? \"Exit fullscreen\" : \"Enter fullscreen\"}\n aria-label={sizeClass === \"fullscreen\" ? \"Exit fullscreen\" : \"Enter fullscreen\"}\n className={closeButtonClass}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setSizeClass((prev) => prev === \"fullscreen\" ? size === \"fullscreen\" ? \"lg\" : size : \"fullscreen\")\n }}\n >\n <Icon name={sizeClass === \"fullscreen\" ? theme.Modal.iconCollapse : theme.Modal.iconExpand} size={18} />\n </button>}\n {onClose && <button\n type=\"button\"\n title=\"Close\"\n aria-label=\"Close\"\n className={closeButtonClass}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleClose();\n }}\n >\n <Icon name=\"x\" size={20} />\n </button>}\n </div>}\n </div>}\n <div className={pos.bodyClass}>{children}</div>\n {showFooter && <div className={pos.footerClass}>\n {footer}\n {onSave && <LoadingButton\n className=\"btn-primary\"\n label={\"Save\"}\n onClick={async (e) => {\r\n e.preventDefault();\r\n \r\n if (await onSave(e)) {\r\n handleClose()\r\n }\r\n }}\r\n />}\r\n {onDelete && <LoadingButton\n className=\"btn-danger\"\n label={\"Delete\"}\n onClick={async (e) => {\r\n e.preventDefault();\r\n await onDelete(e);\r\n handleClose()\r\n }}\n />}\n {buttonCancel && onClose && <ActionButton\n className=\"btn-link\"\n label={\"Cancel\"}\n onClick={handleClose}\n />}\n </div>}\n </div>\n {post}\n </div>\n </div>\n <div\n data-rf-modal-backdrop=\"\"\n aria-hidden=\"true\"\n className=\"fixed inset-0 z-40 bg-black/60 backdrop-blur-sm\"\n style={backdropStyle}\n onClick={() => {\n if (closeOnBackdrop && onClose) {\n handleClose();\n }\n }}\n />\n </>, document.body);\n};\n\r\nexport const ModalYesNo = ({\r\n children,\r\n title = undefined,\r\n onYes = undefined,\r\n onNo = undefined,\r\n onClose = undefined\r\n}: ModalYesNoProps) => {\r\n return <ModalDefault\n title={title}\n onClose={onClose}\n buttonFullscreen={false}\n footer={<>\n {onYes && <LoadingButton\n className=\"btn-primary\"\n label={\"Yes\"}\n onClick={async (e) => {\r\n e.preventDefault();\r\n await onYes(e);\r\n onClose?.()\r\n }}\r\n />}\r\n {onNo && <LoadingButton\n className=\"btn-secondary\"\n label={\"No\"}\n onClick={async (e) => {\r\n e.preventDefault();\r\n await onNo(e);\r\n onClose?.()\r\n }}\r\n />}\r\n </>}\r\n >\r\n {children}\r\n </ModalDefault>\r\n}\r\n\r\nexport const ModalOk = ({\r\n children,\r\n title = undefined,\r\n onClose = undefined\r\n }: ModalOkProps) => {\r\n return <ModalDefault\n title={title}\n onClose={onClose}\n buttonFullscreen={false}\n footer={<>\n <ActionButton className=\"btn-primary\" label={\"Ok\"} onClick={onClose} />\n </>}\r\n >\r\n {children}\r\n </ModalDefault>\r\n}\r\n\r\nexport default Modal;\r\n","import React, { useState } from \"react\";\nimport { Wrapper } from \"./GridSystem\";\nimport { PLACEHOLDER_IMAGE } from \"../../Theme\";\nimport { UIProps } from '../..';\nimport { useTheme } from \"../../Theme\";\nimport { cn } from '../../libs/cn';\nimport { useEnterMotion, useMotionState } from '../../motion';\nimport type { MotionReference } from '../../motion';\n\nexport type ImageFit = 'cover' | 'contain' | 'fill' | 'scale-down' | 'none';\nexport type ImagePosition =\n | 'center'\n | 'top' | 'bottom' | 'left' | 'right'\n | 'top left' | 'top right' | 'bottom left' | 'bottom right';\n\ntype ImageProps = {\n src: string;\n placeholder?: string;\n label?: string;\n title?: string;\n fit?: ImageFit;\n position?: ImagePosition;\n feedback?: React.ReactNode;\n width?: number;\n height?: number;\n srcset?: string;\n sizes?: string;\n} & UIProps;\n\nconst Image = ({\n src,\n placeholder = undefined,\n label = undefined,\n title = undefined,\n fit = undefined,\n position = undefined,\n feedback = undefined,\n width = undefined,\n height = undefined,\n srcset = undefined,\n sizes = undefined,\n pre = undefined,\n post = undefined,\n wrapClass = undefined,\n className = undefined\n}: ImageProps) => {\n const theme = useTheme(\"image\");\n\n const enterRef: MotionReference = theme.Image.motion?.enter ?? false;\n const hoverRef: MotionReference = theme.Image.motion?.hover ?? false;\n const hasHover = hoverRef !== false;\n\n const enterStyle = useEnterMotion(undefined, enterRef, false);\n const [hovered, setHovered] = useState(false);\n const hoverStyle = useMotionState(hovered, hoverRef, false);\n\n return (\n <Wrapper className={cn(\"flex items-center gap-4\", wrapClass || theme.Image.wrapClass)}>\n {pre && <div className=\"shrink-0 self-center\">{pre}</div>}\n <div\n className={cn(\"flex min-w-0 flex-col\", hasHover && \"overflow-hidden\")}\n style={enterStyle}\n onMouseEnter={hasHover ? () => setHovered(true) : undefined}\n onMouseLeave={hasHover ? () => setHovered(false) : undefined}\n >\n <img\n src={src || placeholder || PLACEHOLDER_IMAGE}\n alt={label || title || src}\n title={title}\n className={className || theme.Image.className}\n style={{\n ...(width && height\n ? { maxWidth: width, aspectRatio: `${width} / ${height}`, width: '100%' }\n : width\n ? { maxWidth: width, width: '100%' }\n : height\n ? { height }\n : {}),\n ...(fit ? { objectFit: fit } : {}),\n ...(position ? { objectPosition: position }: {}),\n ...(hasHover ? hoverStyle : {}),\n }}\n width={width}\n height={height}\n srcSet={srcset}\n sizes={sizes}\n />\n {feedback && <div className=\"feedback\">{feedback}</div>}\n </div>\n {post && <div className=\"shrink-0 self-center\">{post}</div>}\n </Wrapper>\n );\n};\n\nexport default Image;\n","import React from 'react';\r\nimport {Link} from \"react-router-dom\";\r\nimport {PLACEHOLDER_BRAND, useTheme} from \"../../Theme\";\r\nimport Image from \"../ui/Image\";\r\nimport {Wrapper} from \"../ui/GridSystem\";\r\n\r\ntype BrandProps = {\r\n url?: string;\r\n label?: string;\r\n logo?: string;\r\n width?: number;\r\n height?: number;\r\n wrapClass ?: string;\r\n className?: string;\r\n logoClass?: string;\r\n labelClass?: string;\r\n};\r\n\r\nconst Brand = ({\r\n url = undefined,\r\n label = undefined,\r\n logo = undefined,\r\n width = undefined,\r\n height = 36,\r\n wrapClass = undefined,\r\n className = undefined,\r\n logoClass = undefined,\r\n labelClass = undefined\r\n}: BrandProps) => {\r\n const theme = useTheme(\"brand\");\r\n const Logo = <>\r\n <Image src={logo || PLACEHOLDER_BRAND}\r\n width={width}\r\n height={height}\r\n />\r\n {label && <span className={labelClass || theme.Brand.labelClass}>{label}</span>}\r\n </>\r\n\r\n return (<Wrapper className={wrapClass}>\r\n <div className={className || theme.Brand.className}>\r\n {url\r\n ? <Link to={url} className={logoClass || theme.Brand.logoClass}>{Logo}</Link>\r\n : <span className={logoClass || theme.Brand.logoClass}>{Logo}</span>\r\n }\r\n </div>\r\n </Wrapper>);\r\n}\r\n\r\nexport default Brand;","import React from 'react';\r\nimport {Link, useLocation} from \"react-router-dom\";\r\nimport {trimSlash} from \"../../libs/utils\";\r\n\r\ntype Breadcrumb = {\r\n label: string;\r\n url: string;\r\n};\r\n\r\ntype BreadcrumbsProps = {\r\n path?: string;\r\n pre?: React.ReactNode;\r\n className?: string;\r\n};\r\n\r\nexport const Breadcrumbs = ({\r\n path = undefined,\r\n pre = undefined,\r\n className = undefined\r\n}: BreadcrumbsProps) => {\r\n const location = useLocation();\r\n const pathname = trimSlash(path || location.pathname);\r\n\r\n const tokens = pathname.split('/');\r\n const current = tokens.pop();\r\n\r\n let breadcrumbs: Breadcrumb[] = [];\r\n let tokenPath = '';\r\n for(const token of tokens) {\r\n tokenPath += `/${token}`;\r\n breadcrumbs.push({\r\n label: token,\r\n url: tokenPath\r\n });\r\n }\r\n\r\n return (breadcrumbs.length || pre) && pathname ? (\r\n <ol className={`breadcrumb ${className}`}>\r\n {pre && <li className=\"breadcrumb-item\">{pre}</li>}\r\n {breadcrumbs.map((breadcrumb, index) => (\r\n <li className=\"breadcrumb-item\" key={index}>\r\n <Link to={breadcrumb.url}>{breadcrumb.label}</Link>\r\n </li>\r\n ))}\r\n <li className=\"breadcrumb-item active\">{current}</li>\r\n </ol>\r\n ) : <>{current}</>;\r\n}\r\n\r\nexport default Breadcrumbs;\r\n","import React from 'react';\r\nimport {useTheme} from \"../../Theme\";\r\nimport {generateUniqueId} from \"../../libs/utils\";\r\n\r\ntype AutoPlayOptions = {\r\n interval: number;\r\n pause: \"hover\" | \"false\" | \"true\";\r\n wrap: boolean;\r\n};\r\n\r\ntype CarouselProps = {\r\n children: React.ReactElement[];\r\n showIndicators?: boolean;\r\n showControls?: boolean;\r\n showCaption?: boolean;\r\n layoutDark?: boolean;\r\n autoPlay?: AutoPlayOptions;\r\n startSlide?: number;\r\n onParseCaption?: (image: React.ReactElement) => React.ReactElement;\r\n onClick?: (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;\r\n};\r\n\r\nconst Carousel = ({\r\n children,\r\n showIndicators = false,\r\n showControls = false,\r\n showCaption = false,\r\n layoutDark = false,\r\n autoPlay = undefined,\r\n startSlide = 0,\r\n onParseCaption = undefined,\r\n onClick = undefined,\r\n} : CarouselProps) => {\r\n const theme = useTheme(\"carousel\");\r\n showIndicators = showIndicators || theme.Carousel.showIndicators;\r\n showControls = showControls || theme.Carousel.showControls;\r\n showCaption = showCaption || theme.Carousel.showCaption;\r\n layoutDark = layoutDark || theme.Carousel.layoutDark;\r\n autoPlay = autoPlay || theme.Carousel.autoPlay;\r\n\r\n\r\n const [isHover, setIsHover] = React.useState(false);\r\n const id = generateUniqueId();\r\n const bgOverlay = layoutDark ? \"bg-white\" : \"bg-dark\";\r\n const textCaption = layoutDark ? \"text-gray\" : \"text-white\";\r\n\r\n const Caption = (image : React.ReactElement) : React.ReactElement | null => {\r\n if (!showCaption) return null;\r\n if (onParseCaption) return onParseCaption(image);\r\n\r\n const { alt, description } = image.props;\r\n if (alt || description) {\r\n return (\r\n <div className=\"carousel-caption hidden md:block opacity-75 bottom-0\">\r\n {alt && <h5 className={textCaption}>{alt}</h5>}\r\n {description && <p>{description}</p>}\r\n </div>\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n return (\r\n <div id={id}\r\n className={\"carousel slide\" + (layoutDark ? \" carousel-dark\" : \"\")}\r\n data-bs-ride={autoPlay ? \"carousel\" : \"false\"}\r\n data-bs-interval={autoPlay?.interval || 2000}\r\n data-bs-pause={autoPlay?.pause || \"hover\"}\r\n data-bs-wrap={autoPlay?.wrap || \"true\"}\r\n onMouseEnter={() => setIsHover(true)}\r\n onMouseLeave={() => setIsHover(false)}\r\n >\r\n {children.length > 1 && <ol className=\"carousel-indicators mb-0\">\r\n {showIndicators && children.map((_, index) => {\r\n return (\r\n <li key={index} data-bs-target={\"#\" + id} data-bs-slide-to={index} className={index === startSlide ? \"active\" : \"\"}></li>\r\n );\r\n })}\r\n </ol>}\r\n <div className=\"carousel-inner\" onClick={onClick} style={{cursor: onClick ? \"pointer\" : \"default\"}}>\r\n {children.map((image, index) => {\r\n return (\r\n <div key={index} className={`carousel-item${index === startSlide ? \" active\" : \"\"}`}>\r\n {image}\r\n {(showIndicators || showControls || showCaption) && isHover && <div className={\"pointer-events-none absolute top-0 bottom-0 left-0 right-0 opacity-25 \" + bgOverlay}></div>}\r\n {isHover && Caption(image)}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n {showControls && isHover && children.length > 1 && <>\r\n <a className=\"carousel-control-prev\" href={\"#\" + id} role=\"button\" data-bs-slide=\"prev\"><span className=\"carousel-control-prev-icon\" aria-hidden=\"true\"></span><span className=\"sr-only\">Previous</span></a>\r\n <a className=\"carousel-control-next\" href={\"#\" + id} role=\"button\" data-bs-slide=\"next\"><span className=\"carousel-control-next-icon\" aria-hidden=\"true\"></span><span className=\"sr-only\">Next</span></a>\r\n </>}\r\n </div>\r\n );\r\n}\r\n\r\nexport default Carousel;\r\n","import React from \"react\";\r\nimport {Dropdown, DropdownItem} from \"./Dropdown\";\nimport {useTheme} from \"../../Theme\";\nimport {Wrapper} from \"../ui/GridSystem\";\nimport Icon from \"../ui/Icon\";\nimport type { BadgeProps } from \"../ui/Badge\";\n\r\ninterface NotificationItem {\r\n title: string;\r\n url: string;\r\n time: string;\r\n icon: string;\r\n}\r\n\r\ninterface NotificationsProps {\r\n children?: NotificationItem[];\r\n badge?: BadgeProps;\n wrapClass?: string;\r\n}\r\n\r\nfunction Notifications({\r\n children = [],\r\n badge = undefined,\r\n wrapClass = undefined\r\n}: NotificationsProps) {\r\n const theme = useTheme(\"notifications\");\r\n\r\n return (\r\n <Wrapper className={wrapClass || theme.Notifications.wrapClass}>\r\n <Dropdown\r\n toggleButton={{\r\n icon: \"bell\",\r\n }}\r\n className={\"flex items-center \" + theme.Notifications.Dropdown.className}\r\n buttonClass={\"fs-20px \" + theme.Notifications.Dropdown.buttonClass}\r\n menuClass={theme.Notifications.Dropdown.menuClass}\r\n badge={badge}\r\n header=\"NOTIFICATIONS\"\r\n footer=\"SEE ALL\"\r\n >\r\n {(children || []).map((notify, index) => {\r\n const iconClass = index === 0 ? \"fs-20px\" : \"fs-20px w-20px\";\r\n\r\n return (\r\n <DropdownItem\r\n key={index}\r\n className=\"py-10px text-wrap\"\r\n url={notify.url}\r\n >\n <div className={iconClass}>\n <Icon name={notify.icon} className=\"text-theme\" />\n </div>\n <div className=\"flex-1 flex-wrap pl-3\">\r\n <div className=\"mb-1 text-white\">{notify.title}</div>\r\n <div className=\"small\">{notify.time}</div>\r\n </div>\n <div className=\"pl-2 fs-16px\">\n <Icon name=\"chevron-right\" />\n </div>\n </DropdownItem>\r\n );\r\n })}\r\n </Dropdown>\r\n </Wrapper>\r\n );\r\n}\r\n\r\nexport default Notifications;\n","import React from 'react';\nimport {Link} from \"react-router-dom\";\nimport Icon from \"../ui/Icon\";\n\r\n\r\ninterface SearchProps {\r\n handleSearch?: (event: React.ChangeEvent<HTMLInputElement>) => void;\r\n}\r\nexport const SearchButton = () => {\n return (\n <div className=\"menu-item dropdown\">\n <Link\r\n to=\"/#\"\r\n data-toggle-class=\"app-header-menu-search-toggled\"\r\n data-toggle-target=\".app\"\r\n className=\"menu-link\"\r\n >\n <div className=\"menu-icon\">\n <Icon name=\"search\" className=\"nav-icon\" />\n </div>\n </Link>\n </div>\r\n );\r\n};\r\n\r\nfunction Search ({\r\n handleSearch = undefined\r\n}: SearchProps) {\r\n return (\r\n\r\n <div>\r\n <SearchButton />\r\n <input className={\"hidden\"} type=\"text\" placeholder=\"Search\" onChange={handleSearch}/>\r\n </div>\r\n )\r\n}\r\n\r\nexport default Search;\n","import React, { useEffect } from 'react';\r\nimport { useTheme } from '../../Theme';\r\nimport { UIProps } from '../..';\r\nimport { Wrapper } from \"./GridSystem\";\r\nimport { createPortal } from 'react-dom';\r\nimport { cn } from '../../libs/cn';\r\nimport Icon from './Icon';\r\n\r\ntype AlertProps = {\r\n children: string | React.ReactNode;\r\n type?: \"info\" | \"success\" | \"warning\" | \"danger\" | \"primary\" | \"secondary\" | \"light\" | \"dark\";\r\n isFixed?: \"top\" | \"bottom\";\r\n timeout?: number;\r\n onClose?: () => void;\r\n icon?: string | boolean;\r\n className?: string;\r\n} & UIProps;\r\n\r\nconst Alert = ({\r\n children,\r\n type = \"info\",\r\n isFixed = undefined,\r\n timeout = undefined,\r\n onClose = undefined,\r\n icon = true,\r\n pre = undefined,\r\n post = undefined,\r\n wrapClass = undefined,\r\n className = undefined\r\n}: AlertProps) => {\r\n const theme = useTheme(\"alert\");\r\n\r\n const DEFAULT_ICONS: Record<string, string> = {\r\n info: 'info',\r\n success: 'check',\r\n warning: 'warning',\r\n danger: 'x-circle',\r\n primary: '',\r\n secondary: '',\r\n light: '',\r\n dark: '',\r\n };\r\n\r\n const iconName: string | null = icon === false ? null\r\n : icon === true ? (DEFAULT_ICONS[type] || null)\r\n : (icon as string) || null;\r\n\r\n useEffect(() => {\r\n if (typeof onClose === 'function') {\r\n const duration = timeout || 5000;\r\n const timer = setTimeout(() => {\r\n onClose();\r\n }, duration);\r\n\r\n return () => clearTimeout(timer);\r\n }\r\n }, [onClose, timeout]);\r\n\r\n const renderAlert = () => (\r\n <Wrapper className={wrapClass}>\r\n {pre}\r\n <div\r\n role=\"alert\"\r\n className={cn(\r\n \"alert alert-\" + type,\r\n className || theme.Alert.className,\r\n isFixed && \"fixed left-1/2 z-[1100] w-[calc(100%-2rem)] max-w-3xl -translate-x-1/2 shadow-lg\"\r\n )}\r\n style={isFixed ? { [isFixed]: 50 } : undefined}\r\n >\r\n {iconName && <Icon name={iconName} size={16} className=\"shrink-0\" />}\r\n {children}\r\n </div>\r\n {post}\r\n </Wrapper>\r\n );\r\n\r\n return isFixed ? createPortal(renderAlert(), document.body) : renderAlert();\r\n}\r\n\r\nexport default Alert;\r\n","import React, { useEffect, useRef } from 'react';\n\nimport { UIProps } from '../..';\nimport { useTheme } from '../../Theme';\nimport { cn } from '../../libs/cn';\nimport { copyToClipboard } from '../../libs/utils';\nimport Prism from 'prismjs';\nimport Icon from './Icon';\nimport { Wrapper } from './GridSystem';\n\nconst LANGUAGES: Record<string, () => Promise<unknown>> = {\n markup: () => import('prismjs/components/prism-markup'),\n html: () => import('prismjs/components/prism-markup'),\n xml: () => import('prismjs/components/prism-markup'),\n svg: () => import('prismjs/components/prism-markup'),\n mathml: () => import('prismjs/components/prism-markup'),\n css: () => import('prismjs/components/prism-css'),\n clike: () => import('prismjs/components/prism-clike'),\n javascript: () => import('prismjs/components/prism-javascript'),\n js: () => import('prismjs/components/prism-javascript'),\n jsx: () => import('prismjs/components/prism-jsx'),\n typescript: () => import('prismjs/components/prism-typescript'),\n tsx: () => import('prismjs/components/prism-tsx'),\n json: () => import('prismjs/components/prism-json'),\n bash: () => import('prismjs/components/prism-bash'),\n shell: () => import('prismjs/components/prism-bash'),\n python: () => import('prismjs/components/prism-python'),\n java: () => import('prismjs/components/prism-java'),\n c: () => import('prismjs/components/prism-c'),\n cpp: () => import('prismjs/components/prism-cpp'),\n csharp: () => import('prismjs/components/prism-csharp'),\n go: () => import('prismjs/components/prism-go'),\n sql: () => import('prismjs/components/prism-sql'),\n php: () => import('prismjs/components/prism-php'),\n ruby: () => import('prismjs/components/prism-ruby'),\n yaml: () => import('prismjs/components/prism-yaml'),\n ini: () => import('prismjs/components/prism-ini'),\n docker: () => import('prismjs/components/prism-docker'),\n powershell: () => import('prismjs/components/prism-powershell'),\n git: () => import('prismjs/components/prism-git'),\n graphql: () => import('prismjs/components/prism-graphql'),\n};\n\nconst LANGUAGE_DEPENDENCIES: Record<string, string[]> = {\n html: ['markup'],\n xml: ['markup'],\n svg: ['markup'],\n mathml: ['markup'],\n javascript: ['clike'],\n js: ['clike', 'javascript'],\n jsx: ['markup', 'clike', 'javascript'],\n typescript: ['clike', 'javascript'],\n tsx: ['markup', 'clike', 'javascript', 'jsx', 'typescript'],\n c: ['clike'],\n cpp: ['c'],\n csharp: ['clike'],\n java: ['clike'],\n php: ['markup'],\n};\n\nconst THEMES = {\n prism: 'rf-code-theme-prism',\n dark: 'rf-code-theme-dark',\n coy: 'rf-code-theme-coy',\n funky: 'rf-code-theme-funky',\n okaidia: 'rf-code-theme-okaidia',\n solarizedlight: 'rf-code-theme-solarizedlight',\n tomorrow: 'rf-code-theme-tomorrow',\n twilight: 'rf-code-theme-twilight',\n};\n\ntype PrismLanguage = keyof typeof LANGUAGES;\ntype PrismTheme = keyof typeof THEMES;\n\nexport type PrismBackground =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'danger'\n | 'warning'\n | 'info'\n | 'light'\n | 'dark'\n | 'white'\n | 'black'\n | 'transparent'\n | 'default';\n\nconst BACKGROUND_CLASS: Record<PrismBackground, string | undefined> = {\n primary: 'bg-primary text-primary-foreground',\n secondary: 'bg-secondary text-secondary-foreground',\n success: 'bg-success text-success-foreground',\n danger: 'bg-destructive text-destructive-foreground',\n warning: 'bg-warning text-warning-foreground',\n info: 'bg-info text-info-foreground',\n light: 'bg-muted text-muted-foreground',\n dark: 'bg-foreground text-background',\n white: 'bg-white text-slate-950',\n black: 'bg-black text-white',\n transparent: 'bg-transparent',\n default: undefined,\n};\n\ninterface CodeProps extends UIProps {\n children: string;\n language?: PrismLanguage;\n showCopy?: boolean;\n theme?: PrismTheme;\n background?: PrismBackground;\n}\n\nfunction isRecordKey<T extends Record<string, unknown>>(record: T, value: unknown): value is keyof T {\n return typeof value === 'string' && value in record;\n}\n\nasync function loadPrismLanguage(language: PrismLanguage, loaded = new Set<string>()) {\n if (loaded.has(language)) return;\n\n for (const dependency of LANGUAGE_DEPENDENCIES[language] ?? []) {\n if (isRecordKey(LANGUAGES, dependency)) {\n await loadPrismLanguage(dependency as PrismLanguage, loaded);\n }\n }\n\n await LANGUAGES[language]?.();\n loaded.add(language);\n}\n\nconst Code = ({\n language,\n children,\n pre,\n post,\n wrapClass,\n className,\n showCopy = true,\n theme = 'tomorrow',\n background = 'default',\n}: CodeProps) => {\n const codeRef = useRef<HTMLElement>(null);\n const themeConfig = useTheme('code');\n const codeText = typeof children === 'string' ? children : String(children ?? '');\n const resolvedLanguage = isRecordKey(LANGUAGES, language) ? language : 'tsx';\n const resolvedTheme = isRecordKey(THEMES, theme) ? theme : 'tomorrow';\n const resolvedBackground = isRecordKey(BACKGROUND_CLASS, background) ? background : 'transparent';\n\n useEffect(() => {\n let cancelled = false;\n\n const loadAndHighlight = async () => {\n try {\n await loadPrismLanguage(resolvedLanguage);\n } catch (err) {\n console.warn(`Errore nel caricare il linguaggio Prism \"${resolvedLanguage}\"`, err);\n }\n\n if (!cancelled && codeRef.current) {\n try {\n Prism.highlightElement(codeRef.current);\n } catch (err) {\n console.warn(`Errore nell'evidenziare il blocco Prism \"${resolvedLanguage}\"`, err);\n }\n }\n };\n\n loadAndHighlight();\n return () => {\n cancelled = true;\n };\n }, [codeText, resolvedLanguage]);\n\n return (\n <Wrapper className={wrapClass || themeConfig.Code.wrapClass}>\n <div className={cn('flex w-full items-stretch gap-2', (pre || post) && 'overflow-x-auto')}>\n {pre && <div className=\"flex shrink-0 items-center text-sm text-muted-foreground\">{pre}</div>}\n <pre\n data-rf-code-theme={resolvedTheme}\n data-rf-code-background={resolvedBackground}\n className={cn(\n 'relative min-w-0 flex-1 overflow-auto rounded-md border border-border p-4 text-sm',\n THEMES[resolvedTheme],\n BACKGROUND_CLASS[resolvedBackground],\n className || themeConfig.Code.className\n )}\n >\n {showCopy && (\n <button\n onClick={() => copyToClipboard(codeText)}\n className=\"absolute right-2 top-2 inline-flex items-center justify-center rounded-md bg-secondary px-2 py-1 text-xs font-medium text-secondary-foreground transition-colors hover:bg-secondary/80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n title=\"Copy code\"\n aria-label=\"Copy code\"\n >\n <Icon name=\"clipboard\" size={14} />\n </button>\n )}\n <code ref={codeRef} className={`language-${resolvedLanguage}`}>\n {codeText}\n </code>\n </pre>\n {post && <div className=\"flex shrink-0 items-center text-sm text-muted-foreground\">{post}</div>}\n </div>\n </Wrapper>\n );\n};\n\nexport default Code;\n","import React from \"react\";\r\nimport { Label, UIProps } from '../..';\r\nimport { useTheme } from \"../../Theme\";\r\nimport { Wrapper } from \"./GridSystem\";\r\nimport { cn } from \"../../libs/cn\";\r\n\r\ntype ColorType = \"info\" | \"success\" | \"warning\" | \"danger\" | \"primary\" | \"secondary\" | \"light\" | \"dark\";\r\ntype ShapeType = \"bar\" | \"circle\";\r\n\r\ninterface PercentageBarProps {\r\n progress: number;\r\n type: ColorType;\r\n className: string;\r\n thickness: number;\r\n showText: boolean;\r\n background: ColorType;\r\n size: number;\r\n fontSize: number;\r\n}\r\n\r\n\r\ninterface PercentageProps extends UIProps {\r\n val?: number;\r\n max?: number;\r\n min?: number;\r\n shape?: ShapeType;\r\n type?: ColorType;\r\n background?: ColorType;\r\n thickness?: number;\r\n showText?: boolean;\r\n size?: number;\r\n fontSize?: number;\r\n label?: string;\r\n}\r\n\r\nconst colorToken: Record<ColorType, string> = {\r\n primary: \"primary\",\r\n secondary: \"secondary\",\r\n success: \"success\",\r\n warning: \"warning\",\r\n danger: \"destructive\",\r\n info: \"info\",\r\n light: \"muted\",\r\n dark: \"foreground\",\r\n};\r\n\r\nconst foregroundToken: Record<ColorType, string> = {\r\n primary: \"primary-foreground\",\r\n secondary: \"secondary-foreground\",\r\n success: \"success-foreground\",\r\n warning: \"warning-foreground\",\r\n danger: \"destructive-foreground\",\r\n info: \"info-foreground\",\r\n light: \"muted-foreground\",\r\n dark: \"background\",\r\n};\r\n\r\nconst hsl = (token: string, alpha?: number) =>\r\n `hsl(var(--rf-${token})${alpha === undefined ? \"\" : ` / ${alpha}`})`;\r\n\r\nconst PercentageBar: React.FC<PercentageBarProps> = ({ \r\n progress, \r\n type, \r\n thickness,\r\n showText,\r\n background,\r\n size,\r\n fontSize,\r\n className\r\n}) => {\r\n const trackColor = hsl(colorToken[background], background === \"secondary\" || background === \"light\" ? 0.55 : 0.16);\r\n const fillColor = hsl(colorToken[type]);\r\n const textColor = progress >= 12 ? hsl(foregroundToken[type]) : hsl(\"foreground\");\r\n\r\n return (\r\n <div \r\n className={cn(\"relative overflow-hidden rounded-full border border-border shadow-sm\", className)}\r\n style={{ \r\n height: `${thickness}px`,\r\n width: `${size}%`,\r\n minWidth: size < 100 ? 120 : undefined,\r\n backgroundColor: trackColor,\r\n }}\r\n role=\"progressbar\"\r\n aria-valuenow={progress}\r\n aria-valuemin={0}\r\n aria-valuemax={100}\r\n >\r\n <div\r\n className=\"h-full rounded-full transition-all duration-300\"\r\n style={{ width: `${progress}%`, backgroundColor: fillColor }}\r\n />\r\n {showText && (\r\n <span\r\n className=\"pointer-events-none absolute inset-0 flex items-center justify-center font-medium tabular-nums\"\r\n style={{ fontSize: `${fontSize}px`, color: textColor }}\r\n >\r\n {progress}%\r\n </span>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nconst PercentageCircle: React.FC<PercentageBarProps> = ({ \r\n progress, \r\n type, \r\n thickness, \r\n showText,\r\n background,\r\n size,\r\n fontSize,\r\n className,\r\n}) => {\r\n const radius = size / 2;\r\n const normalizedRadius = radius - thickness / 2;\r\n const circumference = 2 * Math.PI * normalizedRadius;\r\n const strokeDashoffset = circumference * ((100 - progress) / 100);\r\n const startAngle = -90;\r\n const trackColor = hsl(colorToken[background], background === \"secondary\" || background === \"light\" ? 0.55 : 0.18);\r\n const fillColor = hsl(colorToken[type]);\r\n const textColor = hsl(\"foreground\");\r\n\r\n return (\r\n <span\r\n className={cn(\"inline-flex items-center justify-center\", className)}\r\n role=\"progressbar\"\r\n aria-valuenow={progress}\r\n aria-valuemin={0}\r\n aria-valuemax={100}\r\n >\r\n <svg width={size} height={size} viewBox={`0 0 ${size} ${size}`}>\r\n <circle\r\n r={normalizedRadius}\r\n cx={radius}\r\n cy={radius}\r\n fill=\"none\"\r\n stroke={trackColor}\r\n strokeWidth={thickness}\r\n />\r\n <circle\r\n r={normalizedRadius}\r\n cx={radius}\r\n cy={radius}\r\n fill=\"none\"\r\n stroke={fillColor}\r\n strokeWidth={thickness}\r\n strokeLinecap=\"round\"\r\n strokeDasharray={circumference}\r\n strokeDashoffset={strokeDashoffset}\r\n style={{\r\n transform: `rotate(${startAngle}deg)`,\r\n transformOrigin: 'center',\r\n transition: 'stroke-dashoffset 300ms ease',\r\n }}\r\n />\r\n {showText && (\r\n <text\r\n x=\"50%\"\r\n y=\"50%\"\r\n textAnchor=\"middle\"\r\n dominantBaseline=\"middle\"\r\n fontWeight={700}\r\n fontSize={fontSize}\r\n fill={textColor}\r\n >\r\n {`${progress}%`}\r\n </text>\r\n )}\r\n </svg>\r\n </span>\r\n );\r\n};\r\n\r\nconst Percentage = ({\r\n val = 0,\r\n max = 100,\r\n min = 0,\r\n shape = \"bar\",\r\n type = \"primary\",\r\n background = \"secondary\",\r\n thickness = 10,\r\n showText = true,\r\n size = 100,\r\n fontSize = 16, \r\n label = undefined,\r\n pre = undefined,\r\n post = undefined,\r\n wrapClass = undefined,\r\n className = undefined\r\n}: PercentageProps) => {\r\n const theme = useTheme(\"percentage\");\r\n const range = max - min;\r\n const progress = range <= 0 ? 0 : Math.round(Math.max(0, Math.min(100, ((val - min) / range) * 100)));\r\n const finalClassName = className || theme.Percentage?.className || '';\r\n\r\n return (\r\n <Wrapper className={wrapClass || theme.Percentage?.wrapClass}>\r\n {pre}\r\n {label && <Label label={label} />}\r\n {shape === \"bar\" \r\n ? <PercentageBar\r\n progress={progress}\r\n type={type}\r\n thickness={thickness}\r\n showText={showText}\r\n background={background}\r\n size={size}\r\n fontSize={fontSize}\r\n className={finalClassName}\r\n />\r\n : <PercentageCircle\r\n progress={progress}\r\n type={type}\r\n thickness={thickness}\r\n showText={showText}\r\n background={background}\r\n size={size}\r\n fontSize={fontSize}\r\n className={finalClassName}\r\n />\r\n }\r\n {post}\r\n </Wrapper>\r\n );\r\n};\r\n\r\nexport default Percentage;\r\n","export const FIREBASE_BUCKET_ERRORS = 'errors';\r\nexport const FIREBASE_BUCKET_METAOBJECT = 'metaobject';\r\nexport const FIREBASE_BUCKET_DICTIONARY = 'dictionary';\r\nexport const FIREBASE_BUCKET_SITEMAP = 'sitemap';\r\nexport const FIREBASE_BUCKET_SITETREE = 'sitetree';\r\nexport const FIREBASE_BUCKET_AICHAT = 'aichat';\r\nexport const FIREBASE_BUCKET_SCRAPE = 'scrape';\r\nexport const SEP = '/';\r\nexport const DOT = '.';\r\n\r\nexport const DEFAULT_LANG = 'it';\r\n\r\nexport const consoleLog = (...args: any[]): void => {\r\n if (0 && process.env.NODE_ENV === 'development') {\r\n console.log(...args);\r\n }\r\n};\r\n\r\n\r\nexport interface PageRawBase {\r\n path : string;\r\n strategy : string;\r\n caller : string;\r\n relRule : string;\r\n relData : string;\r\n}\r\n\r\nexport const defaultPageRawBase = {\r\n path : \"\",\r\n strategy : \"\",\r\n caller : \"\",\r\n relRule : \"\",\r\n relData : \"\"\r\n}\r\n\r\n\r\ninterface Image {\r\n thumbnail: string;\r\n original: string;\r\n original_width: number;\r\n original_height: number;\r\n alt: string;\r\n}\r\n\r\ninterface Section {\r\n title: string;\r\n paragraph: string[];\r\n image: Image;\r\n}\r\n\r\nexport interface Page {\r\n meta: {\r\n category: string;\r\n title: string;\r\n description: string;\r\n keyword: string;\r\n searchIntent: string;\r\n };\r\n header: {\r\n title: string;\r\n content: string;\r\n };\r\n footer: {\r\n content: {\r\n title: string;\r\n paragraph: string[];\r\n };\r\n };\r\n sections: Section[];\r\n image: Image;\r\n gallery: {\r\n title: string;\r\n description: string;\r\n slides: Image[];\r\n };\r\n}\r\n\r\nexport const defaultPage = {\r\n meta: {\r\n category: \"\",\r\n title: \"\",\r\n description: \"\",\r\n keyword: \"\",\r\n searchIntent: \"\"\r\n },\r\n header: {\r\n title: \"\",\r\n content: \"\"\r\n },\r\n footer: {\r\n content: {\r\n title: \"\",\r\n paragraph: []\r\n }\r\n },\r\n sections: [],\r\n image: {\r\n thumbnail: \"\",\r\n original: \"\",\r\n original_width: 0,\r\n original_height: 0,\r\n alt: \"\"\r\n },\r\n gallery: {\r\n title: \"\",\r\n description: \"\",\r\n slides: []\r\n }\r\n}","import {decodeJWT} from \"../../../libs/utils\";\nimport {GoogleAuthProvider} from \"firebase/auth\";\nimport {Config, getConfig, GoogleConfig, onConfigChange} from \"../../../Config\";\n\nlet config: GoogleConfig | undefined = getConfig?.()?.google;\nif (typeof onConfigChange === 'function') {\n onConfigChange((newConfig: Config) => {\n config = newConfig.google;\n });\n}\n\nexport const authConfig = <K extends keyof GoogleConfig>(\n key: K\n): GoogleConfig[K] | undefined => {\n return config?.[key];\n};\n\nexport const getGoogleCredential = () => {\n const googleCredentialToken = localStorage.getItem(\"googleCredentialToken\");\n if (!googleCredentialToken) {\n console.error(\"Google credential token not found\");\n return null;\n }\n const decodedToken = decodeJWT(googleCredentialToken);\n if (decodedToken.exp < Date.now() / 1000) {\n console.error(\"Google credential token expired\");\n return null;\n }\n\n try {\n return GoogleAuthProvider.credential(googleCredentialToken);\n } catch (error) {\n console.error(error);\n }\n\n return null;\n}\n","import firebase from \"firebase/compat/app\";\nimport 'firebase/compat/database';\nimport { getAdditionalUserInfo, getAuth, signInWithCredential, onAuthStateChanged, Auth, User } from \"firebase/auth\";\nimport { getGoogleCredential } from \"./auth/google/auth\";\nimport {FirebaseConfig} from \"../Config\";\nimport {\n createConfigurationState,\n getMissingKeys,\n type ProviderConfigurationState,\n} from \"./ProviderConfiguration\";\n\ninterface TokenInfo {\n accessToken?: string;\n refreshToken?: string;\n expirationTime?: number;\n isExpired: boolean;\n}\n\nlet currentFirebaseConfig: FirebaseConfig | undefined;\n\nexport const setFirebaseConfigState = (config: FirebaseConfig | undefined): void => {\n currentFirebaseConfig = config;\n};\n\nexport const getFirebaseConfigurationState = (): ProviderConfigurationState => createConfigurationState(\n 'FirebaseProvider',\n getMissingKeys(currentFirebaseConfig as unknown as Record<string, unknown> | undefined, [\n 'apiKey',\n 'authDomain',\n 'databaseURL',\n 'projectId',\n 'storageBucket',\n 'messagingSenderId',\n 'appId',\n ], 'firebase.')\n);\n\nexport const getSafeAuth = (): Auth | null => {\n try {\n return getAuth();\n } catch (error: any) {\n console.error('FirebaseAuthorization', error?.message || 'Error: check Configuration');\n return null;\n }\n}\n\nconst getUser = (auth: Auth): Promise<User | null> => {\n return new Promise((resolve, reject) => {\n const unsubscribe = onAuthStateChanged(auth, (user) => {\n unsubscribe();\n resolve(user);\n }, reject);\n });\n};\n\nconst requestLogin = async (): Promise<boolean> => {\n console.log(\"Requesting user login.\");\n const googleCredential = getGoogleCredential();\n if (!googleCredential) {\n console.error(\"Firebase: Google credential not found.\");\n return false;\n }\n\n try {\n const userCredential = await signInWithCredential(getAuth(), googleCredential);\n const additionalUserInfo = getAdditionalUserInfo(userCredential);\n if (additionalUserInfo?.isNewUser) {\n // you can do something here with the new user\n }\n console.log(\"Firebase: User logged in successfully.\");\n return true;\n } catch (error) {\n console.error(\"Firebase getAuthorization: \", error);\n return false;\n }\n};\n\nfunction getTokenInfo(user: User): TokenInfo {\n const { stsTokenManager } = user.toJSON() as {\n stsTokenManager?: {\n accessToken?: string;\n refreshToken?: string;\n expirationTime?: number;\n };\n };\n\n const expirationTime = stsTokenManager?.expirationTime ?? 0;\n\n return {\n accessToken: stsTokenManager?.accessToken,\n refreshToken: stsTokenManager?.refreshToken,\n expirationTime: stsTokenManager?.expirationTime,\n isExpired: expirationTime < Date.now(),\n };\n}\n\nconst getFirebaseAuthorization = async (): Promise<boolean> => {\n const auth = getSafeAuth();\n if (!auth) return false;\n\n const user = await getUser(auth);\n if(!user) return requestLogin();\n\n const tokenInfo = getTokenInfo(user);\n\n if (!tokenInfo.accessToken) {\n console.error(\"Firebase access token not found\");\n return requestLogin();\n }\n\n if (tokenInfo.isExpired) {\n try {\n await user.getIdToken(true);\n console.log(\"Token refreshed successfully.\");\n return true;\n } catch (error) {\n console.error(\"Firebase token refresh error: \", error);\n return requestLogin();\n }\n }\n\n console.log(\"Using valid Firebase access token.\");\n return true;\n};\n\nconst init = async (config: FirebaseConfig): Promise<firebase.app.App> => {\n setFirebaseConfigState(config);\n const firebaseApp = firebase.apps.length ? firebase.app() : undefined;\n\n if (firebaseApp) {\n if ((firebaseApp.options as Partial<FirebaseConfig>)?.appId === config.appId) {\n console.log(\"[firebase] Already initialized with same appId, skipping re-init\");\n return firebaseApp;\n }\n await firebaseApp.delete();\n }\n\n firebase.initializeApp(config);\n await getFirebaseAuthorization();\n\n return firebase.app();\n};\n\nexport default init;\n","import firebase from \"firebase/compat/app\";\nimport 'firebase/compat/database';\nimport { onAuthStateChanged } from \"firebase/auth\";\nimport { converter } from \"../../libs/converter\";\nimport { consoleLog } from \"../../constant\";\nimport { Config, onConfigChange } from \"../../Config\";\nimport init, { getFirebaseConfigurationState, getSafeAuth } from \"../firebase-init\";\nimport { cleanRecord } from \"../../libs/utils\";\nimport { SetMessagePayload } from \"../../components/ui/Buttons\";\nimport {\n DataProviderAdapter,\n DatabaseOptions,\n ReadOptions,\n SetChunksOptions,\n RecordProps,\n RecordArray,\n WhereClause,\n OrderClause,\n Condition,\n OperatorValue,\n} from \"./DataProvider\";\nimport type { ProviderConfigurationState } from \"../ProviderConfiguration\";\n\ntype RecordObject = Record<string, Record<string, any>>;\ntype WhereEntry = [string, Condition | OperatorValue];\ntype OrderEntry = [string, \"asc\" | \"desc\"];\ntype QueryPlan = {\n dbRef: firebase.database.Query;\n clientWhere?: WhereClause;\n};\n\nexport const SYSTEM_FIELDS = {\n key: \"@key\",\n value: \"@value\",\n};\n\nlet databaseInstance: firebase.database.Database;\nif (typeof onConfigChange === 'function') {\n onConfigChange((newConfig: Config) => {\n if (newConfig.firebase) init(newConfig.firebase);\n });\n}\n\nconst getDatabase = (): firebase.database.Database => {\n if (!databaseInstance && firebase.apps.length) {\n databaseInstance = firebase.app().database();\n }\n return databaseInstance;\n};\n\nconst handleError = (action: string, error: any, exception: boolean) => {\n const message = `Error during ${action}: ${error}`;\n if (exception) throw new Error(message);\n console.error(message);\n};\n\nconst omitWhereEntry = (where: WhereClause | undefined, field: string): WhereClause | undefined => {\n if (!where || !(field in where)) return where;\n const { [field]: _omitted, ...rest } = where;\n return Object.keys(rest).length ? rest : undefined;\n};\n\nconst normalizeCondition = (raw: Condition | OperatorValue): { condition: Condition; clientCondition?: Condition } => {\n const condition = typeof raw === \"object\" && raw !== null && !Array.isArray(raw)\n ? raw as Condition\n : Array.isArray(raw)\n ? { in: raw }\n : { eq: raw };\n\n let clientCondition: Condition | undefined;\n if (condition.gt !== undefined) clientCondition = { ...clientCondition, gt: condition.gt };\n if (condition.lt !== undefined) clientCondition = { ...clientCondition, lt: condition.lt };\n if (condition.in !== undefined) clientCondition = { ...clientCondition, in: condition.in };\n if (condition.nin !== undefined) clientCondition = { ...clientCondition, nin: condition.nin };\n\n return { condition, clientCondition };\n};\n\nconst getOrderedRef = (ref: firebase.database.Reference, field: string): firebase.database.Query => {\n switch (field) {\n case SYSTEM_FIELDS.key: return ref.orderByKey();\n case SYSTEM_FIELDS.value: return ref.orderByValue();\n default: return ref.orderByChild(field);\n }\n};\n\nconst buildQueryPlan = (ref: firebase.database.Reference, order?: OrderClause, where?: WhereClause): QueryPlan => {\n const [firstOrder] = Object.entries(order || {}) as OrderEntry[];\n if (!firstOrder) return { dbRef: ref, clientWhere: where };\n\n const [field] = firstOrder;\n let dbRef = getOrderedRef(ref, field);\n const raw = where?.[field];\n if (raw == null) return { dbRef, clientWhere: where };\n\n const { condition, clientCondition } = normalizeCondition(raw);\n\n switch (true) {\n case condition.eq !== undefined:\n return { dbRef: dbRef.equalTo(condition.eq as any), clientWhere: omitWhereEntry(where, field) };\n case condition.gte !== undefined && condition.lte !== undefined:\n dbRef = dbRef.startAt(condition.gte as any).endAt(condition.lte as any); break;\n case condition.gte !== undefined && condition.lt !== undefined:\n dbRef = dbRef.startAt(condition.gte as any).endAt(condition.lt as any); break;\n case condition.gt !== undefined && condition.lte !== undefined:\n dbRef = dbRef.startAt(condition.gt as any).endAt(condition.lte as any); break;\n case condition.gt !== undefined && condition.lt !== undefined:\n dbRef = dbRef.startAt(condition.gt as any).endAt(condition.lt as any); break;\n case condition.gte !== undefined:\n dbRef = dbRef.startAt(condition.gte as any); break;\n case condition.gt !== undefined:\n dbRef = dbRef.startAt(condition.gt as any); break;\n case condition.lte !== undefined:\n dbRef = dbRef.endAt(condition.lte as any); break;\n case condition.lt !== undefined:\n dbRef = dbRef.endAt(condition.lt as any); break;\n }\n\n return {\n dbRef,\n clientWhere: clientCondition\n ? { ...(omitWhereEntry(where, field) || {}), [field]: clientCondition }\n : omitWhereEntry(where, field)\n };\n};\n\nconst getEntryValue = (value: any, field: string) => {\n if (!field) return value;\n const parts = field.split(\".\");\n let current = value;\n for (const part of parts) {\n if (current == null) return undefined;\n current = current[part];\n }\n return current;\n};\n\nconst compareValues = (left: any, right: any): number => {\n if (left === right) return 0;\n if (left == null) return -1;\n if (right == null) return 1;\n if (typeof left === \"number\" && typeof right === \"number\") return left - right;\n if (typeof left === \"boolean\" && typeof right === \"boolean\") return Number(left) - Number(right);\n return globalThis.String(left).localeCompare(globalThis.String(right), undefined, { numeric: true, sensitivity: \"base\" });\n};\n\nconst matchWhere = (value: any, raw: Condition | OperatorValue): boolean => {\n const condition = typeof raw === \"object\" && raw !== null && !Array.isArray(raw) ? raw as Condition : { eq: raw };\n for (const [op, target] of Object.entries(condition as Record<string, OperatorValue>)) {\n switch (op) {\n case \"eq\": if (value !== target) return false; break;\n case \"gt\": if (!(value > (target as any))) return false; break;\n case \"gte\": if (!(value >= (target as any))) return false; break;\n case \"lt\": if (!(value < (target as any))) return false; break;\n case \"lte\": if (!(value <= (target as any))) return false; break;\n case \"in\": if (!Array.isArray(target) || !(target as any[]).includes(value)) return false; break;\n case \"nin\": if (Array.isArray(target) && (target as any[]).includes(value)) return false; break;\n default: return false;\n }\n }\n return true;\n};\n\nconst processRecordObject = (val: RecordObject, where?: WhereClause, order?: OrderClause): RecordObject => {\n const [firstOrder, ...restOrder] = Object.entries(order || {}) as OrderEntry[];\n const whereEntries = Object.entries(where || {}) as WhereEntry[];\n let filtered = Object.entries(val);\n\n if (whereEntries.length) {\n filtered = filtered.filter(([, value]) =>\n whereEntries.every(([field, raw]) => matchWhere(getEntryValue(value, field), raw))\n );\n }\n\n if (firstOrder) {\n const orderEntries = [firstOrder, ...restOrder];\n filtered.sort((left, right) => {\n for (const [field, dir] of orderEntries) {\n const result = compareValues(getEntryValue(left[1], field), getEntryValue(right[1], field));\n if (result) return dir === \"desc\" ? -result : result;\n }\n return 0;\n });\n }\n\n return Object.fromEntries(filtered);\n};\n\nconst buildShallowURL = (path: string, auth?: string): string => {\n const u = new URL(`${path}.json`, getDatabase().ref().toString());\n u.searchParams.set(\"shallow\", \"true\");\n if (auth) u.searchParams.set(\"auth\", auth);\n return u.toString();\n};\n\nexport class FirebaseDataProvider implements DataProviderAdapter {\n getConfigurationState(): ProviderConfigurationState {\n return getFirebaseConfigurationState();\n }\n\n isConfigured(): boolean {\n return this.getConfigurationState().configured;\n }\n\n readShallow = async (path: string, exception = false): Promise<string[]> => {\n try {\n const auth = getSafeAuth();\n if (!auth) return [];\n const token = await auth.currentUser?.getIdToken().catch(() => undefined);\n const url = buildShallowURL(path, token);\n const res = await fetch(url);\n if (!res.ok) throw new Error(`${res.status} ${res.statusText}`);\n const json = await res.json();\n return json ? Object.keys(json) : [];\n } catch (error) {\n handleError(`reading SHALLOW data in Firebase for ${path}`, error, exception);\n return [];\n }\n };\n\n read = async (path: string, { where, order, toArray = false, exception = false }: ReadOptions = {}): Promise<any> => {\n const { dbRef, clientWhere } = buildQueryPlan(getDatabase().ref(path), order, where);\n try {\n const snapshot = await dbRef.get();\n if (snapshot.exists()) {\n consoleLog(`Info: Data found in Firebase for path ${path}`);\n const processed = processRecordObject(snapshot.val(), clientWhere, order);\n return toArray ? Object.values(processed) : processed;\n } else if (exception) {\n handleError(`Data not found in Firebase for path ${path}`, null, exception);\n }\n } catch (error) {\n handleError(`reading data in Firebase for ${path}`, error, exception);\n }\n };\n\n update = async (path: string, data: any, exception = false): Promise<void> => {\n try {\n await getDatabase().ref(path).update(data);\n consoleLog(`Data successfully merged in Firebase for ${path}`);\n } catch (error) {\n handleError(`updating data in Firebase for ${path}`, error, exception);\n }\n };\n\n set = async (path: string, data: any, exception = false): Promise<void> => {\n try {\n await getDatabase().ref(path).set(data);\n consoleLog(`Data successfully updated in Firebase for ${path}`);\n } catch (error) {\n handleError(`updating data in Firebase for ${path}`, error, exception);\n }\n };\n\n setChunks = async (\n path: string,\n data: any,\n { chunkSize = 1000, purge = false, onProgress }: SetChunksOptions = {}\n ): Promise<void> => {\n const dbRef = getDatabase().ref(path);\n try {\n if (purge) {\n await dbRef.remove();\n onProgress?.(0, 0, `Purging existing data at ${path}`);\n }\n const entries = Object.entries(cleanRecord(data));\n const totalChunks = Math.ceil(entries.length / chunkSize);\n for (let i = 0; i < entries.length; i += chunkSize) {\n const chunk = Object.fromEntries(entries.slice(i, i + chunkSize));\n await dbRef.update(chunk);\n const done = Math.floor(i / chunkSize) + 1;\n onProgress?.(done, totalChunks, `Saving chunk ${done}/${totalChunks}`);\n }\n } catch (error) {\n handleError(`setting data in chunks in Firebase for ${path}`, error, false);\n }\n };\n\n remove = async (path: string, exception = false): Promise<void> => {\n try {\n await getDatabase().ref(path).remove();\n consoleLog(`Data successfully removed from Firebase for ${path}`);\n } catch (error) {\n handleError(`removing data from Firebase for ${path}`, error, exception);\n }\n };\n\n count = async (path: string): Promise<number> => {\n const keys = await this.readShallow(path);\n return keys.length;\n };\n\n subscribe = <T extends RecordProps = RecordProps>(\n path: string | undefined,\n setRecords: (records: T[]) => void,\n { where, order, fieldMap, onLoad }: DatabaseOptions = {}\n ): (() => void) => {\n const auth = getSafeAuth();\n if (!auth || !path) return () => undefined;\n\n const fetchData = () => {\n const { dbRef, clientWhere } = buildQueryPlan(getDatabase().ref(path), order, where);\n\n const onValueChange = (snapshot: firebase.database.DataSnapshot) => {\n const val: RecordObject = snapshot.val();\n if (!val) { setRecords([]); return; }\n\n const data = onLoad\n ? onLoad(processRecordObject(val, clientWhere, order))\n : processRecordObject(val, clientWhere, order);\n\n const entries = Object.entries(data);\n\n if (!fieldMap) {\n const records = entries.map(([key, value], index) => (\n typeof value === \"object\" && value !== null\n ? { _index: index, _key: key, ...value }\n : { _index: index, _key: key, [SYSTEM_FIELDS.value]: value }\n )) as T[];\n setRecords(records);\n return;\n }\n\n const mapKeys = Object.keys(fieldMap);\n const records = entries.map(([key, value], index) => {\n const source = typeof value === \"object\" && value !== null\n ? { [SYSTEM_FIELDS.key]: key, ...value }\n : { [SYSTEM_FIELDS.key]: key, [SYSTEM_FIELDS.value]: value };\n const mapped: Record<string, any> = {};\n for (const prop of mapKeys) {\n const field = fieldMap[prop];\n mapped[prop] = field.includes(\"{\")\n ? converter.parse(source, field)\n : field === SYSTEM_FIELDS.key ? key\n : field === SYSTEM_FIELDS.value ? value\n : source[field];\n }\n return { _key: key, _index: index, ...mapped } as T;\n });\n setRecords(records);\n };\n\n dbRef.on(\"value\", onValueChange);\n return () => { dbRef.off(\"value\", onValueChange); };\n };\n\n let unsubscribeData: (() => void) | undefined;\n const unsubscribeAuth = onAuthStateChanged(auth, (user) => {\n unsubscribeData?.();\n unsubscribeData = undefined;\n if (!user) {\n setRecords([]);\n } else {\n unsubscribeData = fetchData();\n }\n });\n\n return () => {\n unsubscribeData?.();\n unsubscribeAuth();\n };\n };\n}\n\nexport default new FirebaseDataProvider();\n","import db from \"./database\";\r\nimport {normalizeKey} from \"./utils\";\r\nimport {getGlobalVars} from \"../Global\";\r\n\r\n\r\n\r\nconst setLog = async (\r\n path: string,\r\n action: 'create' | 'update' | 'delete',\r\n record: any,\r\n recordKey?: string\r\n): Promise<void> => {\r\n const when = new Date().toISOString();\r\n const user = getGlobalVars(\"user\");\r\n const data = {\r\n user: user.email ?? 'unknown',\r\n when,\r\n action,\r\n record,\r\n recordKey\r\n };\r\n\r\n await db.set(`/log/${path}/${normalizeKey(when)}`, data);\r\n};\r\n\r\nexport default setLog;","import {Container, Wrapper, Row, Col} from \"../components/ui/GridSystem\";\n\nexport interface ComponentLayoutMap {\n container: typeof Container;\n wrapper: typeof Wrapper;\n row: typeof Row;\n col: typeof Col;\n}\n\nconst componentLayout: ComponentLayoutMap = {\n container: Container,\n wrapper: Wrapper,\n row: Row,\n col: Col\n};\n\nexport default componentLayout;\n","import React, { useId, useState } from 'react';\r\nimport { isEmpty, isInteractiveElement } from \"../../../libs/utils\";\r\nimport { Wrapper } from \"../GridSystem\";\r\nimport { ActionButton, Icon, UIProps } from '../../..';\r\nimport { FormFieldProps, InputType, useFormContext, useHandleDrop } from '../../widgets/Form';\r\n\r\ninterface BaseInputProps extends FormFieldProps {\r\n placeholder?: string;\r\n type?: InputType;\r\n updatable?: boolean;\r\n disabled?: boolean;\r\n feedback?: string;\r\n min?: number;\r\n max?: number;\r\n step?: number;\r\n}\r\n\r\ninterface LabelProps {\r\n label: string;\r\n required?: boolean;\r\n htmlFor?: string;\r\n className?: string;\r\n}\r\n\r\nexport type InputProps = Omit<BaseInputProps, 'type'>;\r\n\r\nexport interface CheckboxProps extends FormFieldProps {\r\n title?: string;\r\n valueChecked?: string | number;\r\n}\r\n\r\nexport interface TextAreaProps extends FormFieldProps {\r\n placeholder?: string;\r\n updatable?: boolean;\r\n disabled?: boolean;\r\n rows?: number;\r\n feedback?: string;\r\n useRef?: any; //da verificare se serve\r\n}\r\n\r\nexport interface ListGroupProps extends UIProps {\r\n children: React.ReactNode[];\r\n onClick?: (event: React.MouseEvent<HTMLDivElement>, index: number) => void;\r\n label?: string;\r\n draggable?: boolean;\r\n onDrop?: (text: string) => string;\r\n actives?: number[];\r\n disables?: number[];\r\n loaders?: number[];\r\n itemClass?: string;\r\n}\r\n\r\n\r\n\r\n\r\n\r\nexport const Input = ({\r\n name,\r\n //value = undefined,\r\n onChange = undefined,\r\n defaultValue = undefined,\r\n placeholder = undefined,\r\n label = undefined,\r\n type = \"text\",\r\n required = false,\r\n updatable = true,\r\n disabled = false,\r\n pre = undefined,\r\n post = undefined,\r\n feedback = undefined,\r\n min = undefined,\r\n max = undefined,\r\n step = undefined,\r\n wrapClass = undefined,\r\n className = undefined\r\n}: BaseInputProps) => {\r\n const { value, handleChange, formWrapClass } = useFormContext({ name, onChange, wrapClass, inputType: type, defaultValue });\r\n const id = useId();\r\n const handleDrop = useHandleDrop({ name, value, handleChange });\r\n\r\n return (\r\n <Wrapper className={formWrapClass}>\r\n {label && <Label label={label} required={required} htmlFor={id} />}\r\n <Wrapper className={pre || post ? \"input-group\" : \"\"}>\r\n {pre && <span className=\"input-group-text\">{pre}</span>}\r\n <input\r\n id={id}\r\n type={type}\r\n name={name}\r\n className={`form-control${className ? \" \" + className : \"\"}`}\r\n placeholder={placeholder}\r\n required={required}\r\n disabled={disabled || (!updatable && !isEmpty(value))}\r\n value={value}\r\n onChange={handleChange}\r\n min={min}\r\n max={max}\r\n step={step}\r\n onDragOver={(e) => e.preventDefault()}\r\n onDrop={handleDrop}\r\n />\r\n {post && <span className=\"input-group-text\">{post}</span>}\r\n </Wrapper>\r\n {feedback && <div className=\"feedback\">{feedback}</div>}\r\n </Wrapper>\r\n );\r\n};\r\n\r\nexport const String = (props: InputProps) => (\r\n <Input {...props} type=\"text\" />\r\n);\r\n\r\nexport const Number = (props: InputProps) => (\r\n <Input {...props} type=\"number\" />\r\n);\r\n\r\nexport const Email = (props: InputProps) => (\r\n <Input {...props} type=\"email\" />\r\n);\r\n\r\nexport const Password = (props: InputProps) => {\r\n const [visible, setVisible] = useState(false);\r\n\r\n return <Input {...props} type={visible ? \"text\": \"password\"} post={\r\n <ActionButton \r\n className=\"p-0 border-0\"\r\n icon={visible ? \"eye\" : \"eye-slash\"} \r\n onClick={() => setVisible(!visible)}\r\n />}\r\n />\r\n};\r\n\r\nexport const Color = (props: InputProps) => (\r\n <Input {...props} type=\"color\" />\r\n);\r\n\r\nexport const Date = (props: InputProps) => (\r\n <Input {...props} type=\"date\" />\r\n);\r\n\r\nexport const Time = (props: InputProps) => (\r\n <Input {...props} type=\"time\" />\r\n);\r\n\r\nexport const DateTime = (props: InputProps) => (\r\n <Input {...props} type=\"datetime-local\" />\r\n);\r\n\r\nexport const Week = (props: InputProps) => (\r\n <Input {...props} type=\"week\" />\r\n);\r\n\r\nexport const Month = (props: InputProps) => (\r\n <Input {...props} type=\"month\" />\r\n);\r\n\r\nexport const Range = (props: InputProps) => (\r\n <Input {...props} type=\"range\" />\r\n);\r\n\r\nexport const Url = (props: InputProps) => (\r\n <Input {...props} type=\"url\" />\r\n);\r\n\r\nexport const Checkbox = ({\r\n name,\r\n //value = false,\r\n onChange = undefined,\r\n defaultValue = undefined, //todo: da capire come gestirlo\r\n label = undefined,\r\n title = undefined,\r\n required = false,\r\n valueChecked = \"on\",\r\n pre = undefined,\r\n post = undefined,\r\n wrapClass = undefined,\r\n className = undefined\r\n}: CheckboxProps) => {\r\n //todo:se aggiungo il defaultvalue, succede che impazzisce. vedi pageeditor denominazione-regione\r\n //trattements esce object[object]\r\n // gli orari nelle card non escono\r\n //in page editor quando si usano le select per scegliere i tag html si salvano in un punto sbagliato\r\n //il render frontendnelle pagine non funziona quando voglio nascondere un elemento vedi social link\r\n //il render frontend l'ultimo elemento dentro al comune se non ha quartiere esce l'ultimo centro estetico\r\n\r\n const toValueString = (v: any): string => (v == null ? \"\" : `${v}`);\r\n\r\n const { value, handleChange, formWrapClass } = useFormContext({\r\n name,\r\n onChange,\r\n wrapClass,\r\n inputType: typeof valueChecked === \"number\" ? \"number\" : \"text\",\r\n defaultValue:\r\n defaultValue !== undefined\r\n ? (toValueString(defaultValue as any) === toValueString(valueChecked) ? toValueString(valueChecked) : \"\")\r\n : undefined\r\n });\r\n\r\n const id = useId();\r\n\r\n const handleCheckboxChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const nextRawValue = event.target.checked ? valueChecked : \"\";\r\n\r\n handleChange?.({\r\n target: {\r\n name,\r\n value: nextRawValue,\r\n },\r\n });\r\n\r\n console.log(\r\n \"Checkbox\",\r\n name,\r\n value,\r\n \"valueChecked:\",\r\n valueChecked,\r\n \"typeof\",\r\n typeof value,\r\n typeof valueChecked,\r\n \"savedType\",\r\n typeof nextRawValue\r\n );\r\n };\r\n\r\n if (!wrapClass && label) wrapClass = \"checkbox\";\r\n\r\n //console.log(\"Checkbox\", name, value, defaultValue);\r\n\r\n return (\r\n <Wrapper className={formWrapClass}>\r\n {pre}\r\n <input\r\n type=\"checkbox\"\r\n id={id}\r\n name={name}\r\n title={title}\r\n className={`form-check-input${className ? \" \" + className : \"\"}`}\r\n checked={toValueString(value) === toValueString(valueChecked)}\r\n onChange={handleCheckboxChange}\r\n />\r\n {label && <label className=\"form-check-label pl-1\" htmlFor={id}>\r\n {label}\r\n {required && <span className=\"text-danger\">&nbsp;*</span>}\r\n </label>}\r\n {post}\r\n </Wrapper>\r\n );\r\n};\r\n\r\nexport const Switch = (props: CheckboxProps) => (\r\n <Wrapper className={props?.wrapClass}>\r\n <Checkbox {...props} wrapClass='form-check form-switch' />\r\n </Wrapper>\r\n);\r\n\r\nexport const Label = ({\r\n label,\r\n required = false,\r\n htmlFor = undefined,\r\n className = undefined\r\n}: LabelProps) => {\r\n return (\r\n <label htmlFor={htmlFor} className={`form-label${className ? \" \" + className : \"\"}`}>\r\n {label} {required && <span className=\"text-danger\">*</span>}\r\n </label>\r\n );\r\n};\r\n\r\nexport const TextArea = ({\r\n name,\r\n //value = undefined,\r\n onChange = undefined,\r\n defaultValue = undefined,\r\n placeholder = undefined,\r\n label = undefined,\r\n required = false,\r\n updatable = true,\r\n disabled = false,\r\n rows = undefined,\r\n useRef = {},\r\n pre = undefined,\r\n post = undefined,\r\n feedback = undefined,\r\n className = undefined,\r\n wrapClass = undefined\r\n}: TextAreaProps) => {\r\n const { value, handleChange, formWrapClass } = useFormContext({ name, onChange, wrapClass, defaultValue });\r\n\r\n const id = useId();\r\n const handleDrop = useHandleDrop({ name, value, handleChange });\r\n\r\n return (\r\n <Wrapper className={formWrapClass}>\r\n {label && <Label required={required} label={label} htmlFor={id} />}\r\n <Wrapper className={pre || post ? \"input-group\" : \"\"}>\r\n {pre && <span className=\"input-group-text\">{pre}</span>}\r\n <textarea\r\n id={id}\r\n name={name}\r\n className={`form-control${className ? \" \" + className : \"\"}`}\r\n ref={(el) => (useRef = el)}\r\n rows={rows}\r\n placeholder={placeholder}\r\n required={required}\r\n disabled={disabled || (!updatable && !isEmpty(value))}\r\n value={value}\r\n onChange={handleChange}\r\n onDragOver={(e) => e.preventDefault()}\r\n onDrop={handleDrop}\r\n />\r\n {post && <span className=\"input-group-text\">{post}</span>}\r\n </Wrapper>\r\n {feedback && <div className=\"feedback\">{feedback}</div>}\r\n </Wrapper>\r\n );\r\n};\r\n\r\nexport const ListGroup = ({\r\n children,\r\n onClick = undefined,\r\n label = undefined,\r\n actives = undefined,\r\n draggable = undefined,\r\n onDrop = undefined,\r\n disables = undefined,\r\n loaders = undefined,\r\n pre = undefined,\r\n post = undefined,\r\n wrapClass = undefined,\r\n className = undefined,\r\n itemClass = undefined\r\n}: ListGroupProps) => {\r\n const fullClassName = `list-group${className ? ' ' + className : ''}`;\r\n\r\n const extractText = (node: React.ReactNode): string => {\r\n const walk = (n: React.ReactNode): string => {\r\n if (n == null || typeof n === \"boolean\") return \"\";\r\n if (typeof n === \"string\" || typeof n === \"number\") return `${n}`;\r\n if (Array.isArray(n)) return n.map(walk).join(\" \");\r\n if (React.isValidElement(n)) return walk(n.props.children);\r\n return \"\";\r\n };\r\n\r\n return walk(node).replace(/\\s+/g, \" \").trim();\r\n };\r\n\r\n const handleDragStart = (e: React.DragEvent<HTMLSpanElement>, text: string) => {\r\n e.dataTransfer.setData('text/plain', onDrop?.(text) ?? text)\r\n }\r\n\r\n return <Wrapper className={wrapClass}>\r\n {pre}\r\n {label && <div>{label}</div>}\r\n <div className={fullClassName}>\r\n {children.map((child, index) => {\r\n const isActive = actives?.includes(index);\r\n const isDisable = disables?.includes(index);\r\n const isLoading = loaders?.includes(index);\r\n const fullItemClass = `list-group-item pl-1 ${itemClass ? ' ' + itemClass : ''\r\n }${onClick ? ' list-group-item-action' : ''\r\n }${isActive ? ' active' : ''\r\n }${isDisable ? ' disabled' : ''\r\n }${isLoading ? ' loading' : ''}`;\r\n\r\n return onClick\r\n ? <div\r\n key={index}\r\n onClick={(e) => {\r\n if (!isLoading && !isInteractiveElement(e)) {\r\n onClick(e, index);\r\n }\r\n }}\r\n className={fullItemClass}\r\n style={{ cursor: \"pointer\" }}\r\n >\r\n {child}\r\n </div>\r\n\r\n :\r\n <span\r\n key={index}\r\n className={fullItemClass}\r\n draggable={draggable}\r\n onDragStart={draggable ? (e) => handleDragStart(e, extractText(child)) : undefined}\r\n style={{ cursor: draggable ? 'grab' : 'default' }}\r\n >\r\n {draggable && <Icon name='grip-vertical' />}\r\n {child}\r\n </span>\r\n })}\r\n </div>\r\n {post}\r\n </Wrapper>\r\n};\r\n","import { getRecordValue } from './utils';\nimport type { RecordProps } from '../providers/data/DataProvider';\n\nexport type OrderDirection = 'asc' | 'desc';\n\nexport type OrderConfig = {\n field: string;\n dir?: OrderDirection;\n};\n\nexport const DEFAULT_ORDER: Required<OrderConfig> = {\n field: '',\n dir: 'asc',\n};\n\nconst isDateValue = (value: unknown): value is string =>\n typeof value === 'string' && !Number.isNaN(Date.parse(value));\n\nconst comparePrimitiveValues = (a: unknown, b: unknown): number => {\n if (a == null && b == null) return 0;\n if (a == null) return 1;\n if (b == null) return -1;\n\n if (typeof a === 'number' && typeof b === 'number') {\n return a - b;\n }\n\n if (typeof a === 'boolean' && typeof b === 'boolean') {\n return Number(a) - Number(b);\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() - b.getTime();\n }\n\n if (isDateValue(a) && isDateValue(b)) {\n return Date.parse(a) - Date.parse(b);\n }\n\n return String(a).localeCompare(String(b), undefined, { numeric: true, sensitivity: 'base' });\n};\n\nexport const Order = {\n normalize(order?: OrderConfig | null): Required<OrderConfig> | undefined {\n if (!order?.field) return undefined;\n return {\n field: order.field,\n dir: order.dir === 'desc' ? 'desc' : 'asc',\n };\n },\n\n toggle(current: OrderConfig | undefined, field: string): Required<OrderConfig> {\n if (!current || current.field !== field) {\n return { field, dir: 'asc' };\n }\n\n return {\n field,\n dir: current.dir === 'asc' ? 'desc' : 'asc',\n };\n },\n\n compareValues(a: unknown, b: unknown, dir: OrderDirection = 'asc'): number {\n const comparison = comparePrimitiveValues(a, b);\n return dir === 'desc' ? -comparison : comparison;\n },\n\n compareRecords<T extends RecordProps>(a: T, b: T, order: OrderConfig): number {\n const normalized = this.normalize(order);\n if (!normalized) return 0;\n\n const aValue = getRecordValue(a, normalized.field);\n const bValue = getRecordValue(b, normalized.field);\n return this.compareValues(aValue, bValue, normalized.dir);\n },\n\n records<T extends RecordProps>(records: T[] | undefined, order?: OrderConfig | null): T[] | undefined {\n if (!records) return records;\n\n const normalized = this.normalize(order);\n if (!normalized) return [...records];\n\n return [...records].sort((left, right) => this.compareRecords(left, right, normalized));\n },\n};\n\n","import React, { useEffect, useId, useMemo, useState } from 'react';\r\nimport { Label } from \"./Input\";\nimport { Wrapper } from \"../GridSystem\"\nimport { useTheme } from \"../../../Theme\";\nimport { DEFAULT_ORDER, Order, type OrderConfig } from \"../../../libs/order\";\nimport { arraysEqual, arrayUnique, isEmpty, sanitizeKey } from \"../../../libs/utils\";\nimport { DatabaseOptions, DBConfig, RecordProps } from \"../../../providers/data/DataProvider\";\nimport { useDataProvider } from \"../../../providers/data/DataProviderContext\";\r\nimport { FormFieldProps, useFormContext } from '../../widgets/Form';\r\nimport { cn } from '../../../libs/cn';\r\n\r\ninterface Option extends RecordProps {\r\n label: string;\r\n value: string;\r\n}\r\n\r\ntype OptionOrderConfig = OrderConfig & {\n field: 'label' | 'value';\n};\n\r\ninterface BaseProps extends FormFieldProps {\r\n updatable?: boolean;\r\n disabled?: boolean;\r\n title?: string;\r\n feedback?: string;\n options?: Option[] | string[] | number[];\n db?: DBConfig;\n order?: OptionOrderConfig;\n}\r\n\r\nexport interface SelectProps extends BaseProps {\r\n optionEmpty?: Option;\r\n value?: string | number;\r\n}\r\n\r\nexport interface AutocompleteProps extends BaseProps {\r\n min?: number;\r\n max?: number;\r\n placeholder?: string;\r\n creatable?: boolean;\r\n onCreate?: (value: string) => Promise<void> | void;\r\n}\r\n\r\nexport interface ChecklistProps extends BaseProps {\r\n checkClass?: string;\r\n}\r\n\r\nconst valueToArray = (value: string | number | any[] | undefined): any[] => {\r\n if (!value) return []\r\n\r\n return typeof value === 'string' || typeof value === \"number\"\r\n ? value.toString().split(',')\r\n : value;\r\n}\r\n\r\nconst normalizeOption = (\r\n fieldMap: Record<string, any> | string | number | undefined\r\n): Option => {\r\n if (!fieldMap) {\r\n return { label: '@value', value: '@value' };\r\n }\r\n\r\n if (typeof fieldMap !== 'object') {\r\n return { label: fieldMap?.toString() || '', value: fieldMap?.toString() || '' };\r\n }\r\n\r\n return {\r\n label: fieldMap?.label?.toString() || '',\r\n value: fieldMap?.value?.toString() || ''\r\n };\r\n};\r\n\r\nconst normalizeLookup = (records: RecordProps[]): Option[] =>\r\n records.map((record) => normalizeOption({\r\n label: record.label ?? record.name ?? record.title ?? record._key ?? '',\r\n value: record.value ?? record._key ?? record.label ?? record.name ?? '',\r\n }));\r\n\r\nfunction getOptionsDB(\n db?: DBConfig\n): DatabaseOptions {\n return {\n fieldMap: db?.fieldMap\n ? normalizeOption(db.fieldMap)\n : undefined,\n where: db?.where,\n order: db?.order,\n onLoad: db?.onLoad,\n };\n}\n\r\nconst isDbOrdered = (\r\n fieldMap: DatabaseOptions[\"fieldMap\"],\r\n dbOrder: DBConfig[\"order\"],\r\n order: OptionOrderConfig\n) => {\n const mappedField = fieldMap?.[order.field];\r\n const [firstDbOrder] = Object.entries(dbOrder || {});\r\n\r\n if (!firstDbOrder || !mappedField) return false;\r\n\r\n const [dbField, dbDir] = firstDbOrder;\r\n return dbField === mappedField && dbDir === order.dir;\r\n};\r\n\r\n\r\nconst getOptions = (\r\n options: Array<string | number | Option>,\r\n lookup: Option[],\r\n order?: OptionOrderConfig,\n dbOrder?: DBConfig[\"order\"],\r\n fieldMap?: DatabaseOptions[\"fieldMap\"]\r\n): Option[] => {\r\n const effectiveOrder = order || { ...DEFAULT_ORDER, field: 'label' };\n const combined = [\r\n ...options.map(normalizeOption),\r\n ...lookup\r\n ];\r\n\r\n if (options.length === 0 && isDbOrdered(fieldMap, dbOrder, effectiveOrder)) {\r\n return combined;\r\n }\r\n\r\n return Order.records(combined, effectiveOrder) || [];\n}\n\r\nexport const Select = ({\r\n name,\r\n onChange = undefined,\r\n defaultValue = undefined,\r\n required = false,\r\n updatable = true,\r\n disabled = false,\r\n optionEmpty = {\r\n label: \"Select...\",\r\n value: \"\"\r\n },\r\n label = undefined,\r\n title = undefined,\r\n pre = undefined,\r\n post = undefined,\r\n feedback = undefined,\r\n options = [],\r\n db = undefined,\r\n order = undefined,\r\n wrapClass = undefined,\r\n className = undefined,\r\n}: SelectProps) => {\r\n const { value, handleChange, formWrapClass } = useFormContext({ name, onChange, wrapClass, defaultValue });\r\n\r\n const theme = useTheme(\"select\");\r\n\r\n const dbOptions = useMemo(() => getOptionsDB(db), [db?.fieldMap, db?.where, db?.order, db?.onLoad]);\n const database = useDataProvider();\n const [lookup, setLookup] = useState<Option[]>([]);\n useEffect(() => {\n return database.subscribe(db?.path, (records) => setLookup(normalizeLookup(records)), dbOptions);\n }, [database, db?.path, dbOptions]);\n\r\n const opts = useMemo(() => {\r\n const combinedOptions = getOptions(options, lookup, order, db?.order, dbOptions.fieldMap);\r\n\r\n return arrayUnique(\r\n value && !combinedOptions.length\r\n ? [...combinedOptions, { label: `❌ ${value.toString()}`, value: value.toString() }]\r\n : combinedOptions\r\n );\r\n\r\n }, [options, lookup, order, db?.order, dbOptions.fieldMap, value]);\r\n\r\n if (!value && !optionEmpty && opts.length > 0) {\r\n handleChange?.({ target: { name, value: opts[0].value } });\r\n }\r\n \r\n\r\n const id = useId();\r\n return (\r\n <Wrapper className={formWrapClass || theme.Select.wrapClass}>\r\n {label && <Label label={label} required={required} htmlFor={id} />}\r\n <Wrapper className={pre || post ? \"input-group flex-nowrap\" : \"\"}>\r\n {pre && <span className=\"input-group-text\">{pre}</span>}\r\n <select\r\n id={id}\r\n name={name}\r\n className={cn(\"form-select\", className || theme.Select.className)}\r\n value={value ?? ''}\r\n required={required}\r\n disabled={disabled || (!updatable && !isEmpty(value))}\r\n onChange={handleChange}\r\n title={title}\r\n >\r\n {optionEmpty && <option key={`${id}-empty`} value={optionEmpty.value}>{optionEmpty.label}</option>}\r\n {opts.map((op, index) => <option key={`${id}-${index}`} value={op.value}>{op.label}</option>)}\r\n </select>\r\n {post && <span className=\"input-group-text\">{post}</span>}\r\n </Wrapper>\r\n {feedback && <div className=\"feedback\">{feedback}</div>}\r\n </Wrapper>\r\n );\r\n};\r\n\r\nexport const Autocomplete = ({\r\n name,\r\n defaultValue = undefined,\r\n min = undefined,\r\n max = undefined,\r\n onChange = undefined,\r\n required = false,\r\n updatable = true,\r\n disabled = false,\r\n label = undefined,\r\n title = undefined,\r\n placeholder = undefined,\r\n pre = undefined,\r\n post = undefined,\r\n feedback = undefined,\r\n options = [],\r\n db = undefined,\r\n order = undefined,\r\n wrapClass = undefined,\r\n className = undefined,\r\n creatable = false,\r\n onCreate = undefined,\r\n}: AutocompleteProps) => {\r\n const { value, handleChange, formWrapClass } = useFormContext({ name, onChange, wrapClass, defaultValue });\r\n\r\n const theme = useTheme(\"select\");\r\n\r\n const valueArray = useMemo(() => valueToArray(value), [value]);\r\n const [selectedItems, setSelectedItems] = useState(() => valueArray);\r\n useEffect(() => {\r\n if (!arraysEqual(valueArray, selectedItems)) {\r\n setSelectedItems(valueArray);\r\n }\r\n }, [valueArray]);\r\n\r\n const dbOptions = useMemo(() => getOptionsDB(db), [db?.fieldMap, db?.where, db?.order, db?.onLoad]);\n const database = useDataProvider();\n const [lookup, setLookup] = useState<Option[]>([]);\n useEffect(() => {\n return database.subscribe(db?.path, (records) => setLookup(normalizeLookup(records)), dbOptions);\n }, [database, db?.path, dbOptions]);\n\r\n const [localOpts, setLocalOpts] = useState<Option[]>([]);\r\n\r\n const opts = useMemo(() => {\r\n const combinedOptions = getOptions([...options, ...localOpts], lookup, order, db?.order, dbOptions.fieldMap);\r\n return arrayUnique(combinedOptions, 'value');\r\n }, [options, localOpts, lookup, order, db?.order, dbOptions.fieldMap]);\r\n\r\n const commitValue = (currentValue: string, inputEl: HTMLInputElement) => {\r\n if (!currentValue) return;\r\n if (selectedItems.includes(currentValue) || (max && selectedItems.length >= max)) {\r\n inputEl.value = '';\r\n return;\r\n }\r\n setSelectedItems(prevState => {\r\n const updatedItems = [...prevState, currentValue];\r\n setTimeout(() => {\r\n handleChange?.({ target: { name, value: updatedItems } });\r\n }, 0);\r\n return updatedItems;\r\n });\r\n inputEl.value = '';\r\n };\r\n\r\n const handleAutocompleteChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const currentValue = e.target.value;\r\n const inOpts = opts.some(op => op.value === currentValue);\r\n if (!inOpts) return; // free input committed via Enter (onKeyDown)\r\n commitValue(currentValue, e.target);\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (e.key !== 'Enter') return;\r\n e.preventDefault();\r\n const currentValue = (e.target as HTMLInputElement).value.trim();\r\n if (!currentValue) return;\r\n\r\n const inOpts = opts.some(op => op.value === currentValue);\r\n if (!inOpts) {\r\n if (!creatable) return;\r\n setLocalOpts(prev => [...prev, { label: currentValue, value: currentValue }]);\r\n onCreate?.(currentValue);\r\n }\r\n commitValue(currentValue, e.target as HTMLInputElement);\r\n };\r\n\r\n const removeItem = (currentValue: string) => {\r\n setSelectedItems(prevState => {\r\n const updatedItems = prevState.filter(item => item !== currentValue);\r\n setTimeout(() => {\r\n handleChange?.({ target: { name, value: updatedItems } });\r\n }, 0);\r\n return updatedItems;\r\n });\r\n };\r\n\r\n const id = useId();\r\n const listId = `${id}-options`;\r\n return (\r\n <Wrapper className={formWrapClass || theme.Autocomplete.wrapClass}>\r\n {label && <Label label={label} required={required} htmlFor={id} />}\r\n <Wrapper className={pre || post ? \"input-group flex-nowrap\" : \"\"}>\r\n {pre && <span className=\"input-group-text\">{pre}</span>}\r\n <div className={`flex flex-wrap items-center gap-1 form-control !h-auto min-h-9 py-1.5 px-2`}>\r\n {selectedItems.map(item => (\r\n <span className=\"inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium bg-primary/10 text-primary border border-primary/20 rounded-full\" key={item}>\r\n {item}<button type=\"button\" className=\"opacity-60 hover:opacity-100 transition-opacity ml-0.5\" onClick={() => removeItem(item)}>×</button>\r\n </span>\r\n ))}\r\n {(!max || selectedItems.length < max) && (\r\n <input\r\n id={id}\r\n type=\"text\"\r\n className={cn(\"flex-1 min-w-[120px] border-none outline-none bg-transparent text-sm placeholder:text-muted-foreground\", className || theme.Autocomplete.className)}\r\n required={required && selectedItems.length < (min || 0)}\r\n disabled={disabled || (!updatable && !isEmpty(value))}\r\n placeholder={creatable ? (placeholder ?? 'Type or press Enter to create…') : placeholder}\r\n title={title}\r\n list={listId}\r\n onChange={handleAutocompleteChange}\r\n onKeyDown={handleKeyDown}\r\n />\r\n )}\r\n </div>\r\n <datalist id={listId}>\r\n {opts.map((op, index) => <option value={op.value} key={`${id}-${index}`}>{op.label}</option>)}\r\n </datalist>\r\n {post && <span className=\"input-group-text\">{post}</span>}\r\n </Wrapper>\r\n {feedback && <div className=\"feedback\">{feedback}</div>}\r\n </Wrapper>\r\n );\r\n};\r\n\r\nexport const Checklist = ({\r\n name,\r\n defaultValue = undefined,\r\n onChange = undefined,\r\n required = false,\r\n updatable = true,\r\n disabled = false,\r\n label = undefined,\r\n title = undefined,\r\n pre = undefined,\r\n post = undefined,\r\n feedback = undefined,\r\n options = [],\r\n db = undefined,\r\n order = undefined,\r\n wrapClass = undefined,\r\n className = undefined,\r\n checkClass = undefined,\r\n}: ChecklistProps) => {\r\n const { value, handleChange, formWrapClass } = useFormContext({ name, onChange, wrapClass, defaultValue });\r\n\r\n const valueArray = useMemo(() => valueToArray(value), [value]);\r\n const [selectedItems, setSelectedItems] = useState(() => valueArray);\r\n useEffect(() => {\r\n if (!arraysEqual(valueArray, selectedItems)) {\r\n setSelectedItems(valueArray);\r\n }\r\n }, [valueArray]);\r\n\r\n const dbOptions = useMemo(() => getOptionsDB(db), [db?.fieldMap, db?.where, db?.order, db?.onLoad]);\n const database = useDataProvider();\n const [lookup, setLookup] = useState<Option[]>([]);\n useEffect(() => {\n return database.subscribe(db?.path, (records) => setLookup(normalizeLookup(records)), dbOptions);\n }, [database, db?.path, dbOptions]);\n\r\n const opts = useMemo(() => {\r\n const combinedOptions = getOptions(options, lookup, order, db?.order, dbOptions.fieldMap);\r\n return arrayUnique(combinedOptions, 'value');\r\n }, [options, lookup, order, db?.order, dbOptions.fieldMap]);\r\n\r\n const removeItem = (currentValue: string) => {\r\n setSelectedItems(prevState => {\r\n const updatedItems = prevState.filter(item => item !== currentValue);\r\n setTimeout(() => {\r\n handleChange?.({ target: { name: name, value: updatedItems } }); //, opts\r\n }, 0);\r\n\r\n return updatedItems;\r\n });\r\n };\r\n\r\n const handleChecklistChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const currentValue = e.target.value;\r\n\r\n if (!e.target.checked) {\r\n removeItem(currentValue);\r\n return;\r\n }\r\n\r\n if (opts.filter(op => op.value === currentValue).length === 0) {\r\n return;\r\n }\r\n\r\n if (selectedItems.includes(currentValue)) {\r\n return;\r\n }\r\n\r\n setSelectedItems(prevState => {\r\n const updatedItems = [...prevState, currentValue];\r\n setTimeout(() => {\r\n handleChange?.({ target: { name: name, value: updatedItems } }); //, opts\r\n }, 0);\r\n\r\n return updatedItems;\r\n });\r\n };\r\n\r\n const id = useId();\r\n const isDisabled = disabled || (!updatable && selectedItems.length > 0);\r\n const checklist = (\r\n <Wrapper className={cn(\r\n pre || post ? \"form-control !h-auto min-h-9 w-full min-w-0 flex-col items-start py-2 px-3\" : \"\",\r\n \"space-y-1\"\r\n )}>\r\n {opts.map((op) => {\r\n const key = sanitizeKey(`cl-${id}-${name}-${op.value}`);\r\n return (\r\n <div key={key} className={cn(\"form-check flex w-full items-center gap-2\", checkClass)}>\r\n <input\r\n className={\"form-check-input shrink-0\"}\r\n type={\"checkbox\"}\r\n id={key}\r\n name={name}\r\n value={op.value}\r\n onChange={handleChecklistChange}\r\n checked={selectedItems.includes(op.value)}\r\n disabled={isDisabled}\r\n title={title}\r\n />\r\n <label htmlFor={key} className={\"form-check-label\"}>{op.label}</label>\r\n </div>\r\n );\r\n })}\r\n </Wrapper>\r\n );\r\n\r\n return (\r\n <Wrapper className={cn(formWrapClass, className)}>\r\n {label && <><Label label={label} className={\"form-check-label\"} required={required} /><hr className={\"mt-0\"} /></>}\r\n {pre || post ? (\r\n <Wrapper className=\"input-group flex-nowrap items-stretch\">\r\n {pre && <span className=\"input-group-text\">{pre}</span>}\r\n {checklist}\r\n {post && <span className=\"input-group-text\">{post}</span>}\r\n </Wrapper>\r\n ) : checklist}\r\n {feedback && <div className=\"feedback\">{feedback}</div>}\r\n </Wrapper>\r\n );\r\n};\r\n","\r\nexport const COUNTRIES = {\r\n \"US\": \"United States\",\r\n \"CN\": \"中国\",\r\n \"IT\": \"Italia\",\r\n \"FR\": \"France\",\r\n \"DE\": \"Deutschland\",\r\n \"ES\": \"España\",\r\n \"PT\": \"Portugal\",\r\n \"RU\": \"Россия\",\r\n \"JP\": \"日本\"\r\n};\r\n\r\nexport const LANGS = {\r\n \"it\": \"Italiano\",\r\n \"en\": \"English\",\r\n \"fr\": \"Français\",\r\n \"de\": \"Deutsch\",\r\n \"es\": \"Español\",\r\n \"pt\": \"Português\",\r\n \"ru\": \"Русский\",\r\n \"ja\": \"日本語\",\r\n \"ko\": \"한국어\"\r\n};\r\n\r\n\r\nexport const currentCountry = (code: boolean = false) => {\r\n const country = localStorage.getItem(\"user.country\") || navigator.language.split(\"-\")[1] || \"US\"\r\n return code ? country : COUNTRIES[country as keyof typeof COUNTRIES]\r\n}\r\nexport const currentLang = (code: boolean = false) => {\r\n const lang = localStorage.getItem(\"user.lang\") || navigator.language.split(\"-\")[0] || \"en\"\r\n return code ? lang : LANGS[lang as keyof typeof LANGS]\r\n}\r\n","import { converter } from \"../libs/converter\";\r\nimport { currentCountry, currentLang, COUNTRIES, LANGS } from \"../libs/locale\";\r\n\r\nexport const PROMPT_CLEANUP = `Please ignore all previous instructions.`;\r\nexport const PROMPT_NO_REFERENCE = `Do not repeat yourself. Do not self reference. Do not explain what you are doing.`;\r\n\r\nexport const PROMPTS = {\r\n SEARCH_INTENT_FROM_KEYWORDS: `\r\n ${PROMPT_CLEANUP}\r\n Please respond only in the {language} language.\r\n You are a keyword research expert that speaks and writes fluent {language}.\r\n I will give you a long list of keywords, and I want you to classify them by the search intent, whether commercial, transactional, navigational, informational, local or investigational. \r\n Once done, please print them out in a {output} with \"Keyword\" as the first column, and \"Search Intent\" as the second. \r\n Here are the keywords - {search}\r\n `,\r\n RELATED_KEYWORD_GENERATOR: `\r\n ${PROMPT_CLEANUP}\r\n Please respond only in the {language} language. \r\n You are a keyword research expert that speaks and writes fluent {language}. \r\n I want you to generate a list of {limit} keywords closely related to \"{search}\" without duplicating any words. \r\n Please create a {output} with two columns \"Keyword\" and \"Search Intent\". \r\n The first column should be the keyword you generated, and the second column should be the search intent of the keyword (commercial, transactional, navigational, informational, local or investigational). \r\n ${PROMPT_NO_REFERENCE}\r\n `,\r\n LONG_TAIL_KEYWORD_GENERATOR: `\r\n ${PROMPT_CLEANUP}\r\n Please respond only in the {language} language. \r\n You are a keyword research expert that speaks and writes fluent {language}. \r\n I want you to generate a list of {limit} long-tail keywords for \"{search}\". \r\n Please create a {output} with two columns \"Keyword\" and \"Search Intent\". \r\n The first column should be the keyword you generated, and the second column should be the search intent of the keyword (commercial, transactional, navigational, informational, local or investigational). \r\n ${PROMPT_NO_REFERENCE}\r\n `,\r\n KEYWORD_STRATEGY: `\r\n ${PROMPT_CLEANUP}\r\n Please respond only in the {language} language. \r\n You are a market research expert that speaks and writes fluent {language}. \r\n You are an expert in keyword research and can develop a full SEO content plan in fluent {language}. \r\n \"{search}\" is the target keyword for which you need to create a Keyword Strategy & Content Plan. \r\n Create a {output} with a list of {limit} closely related keywords for an SEO strategy plan for the main keyword \"{search}\". \r\n Cluster the keywords according to the top 10 super categories and name the super category in the first column as \"category\". \r\n There should be a maximum of 6 keywords in a super category. \r\n The second column should be called \"keyword\" and contain the suggested keyword. \r\n The third column will be called \"searchIntent\" and will show the search intent of the suggested keyword from the following list of intents (commercial, transactional, navigational, informational, local or investigational). \r\n The fourth column will be called \"title\" and will be catchy and click-bait title to use for an article or blog post about that keyword. \r\n The fifth column will be called \"description: and will be a catchy meta description with a maximum length of 160 words. \r\n The meta description should ideally have a call to action. \r\n Do not use markdown, line breaks, single quotes, double quotes or any other enclosing characters in any of the columns you fill in. \r\n ${PROMPT_NO_REFERENCE} \r\n Please return the responses in a valid JSON object following this prototype: [{ category: \"\", keyword: \"\", searchIntent: \"\", title: \"\", description: \"\" }, {...}].\r\n `,\r\n GENERATE_BLOG_POST_TITLES: `\r\n ${PROMPT_CLEANUP}\r\n You are an expert copywriter who writes catchy titles for blog posts. \r\n You have a {voice} tone of voice. \r\n You have a {style} writing style. \r\n Write {limit} catchy blog post titles with a hook for the topic \"{search}\". \r\n The titles should be written in the {language} language. \r\n The titles should be less than 60 characters. \r\n The titles should include the words from the topic \"{search}\". \r\n Please create a {output} where each object has a single column named \"Title.\"\r\n Do not use markdown, line breaks, single quotes, double quotes or any other enclosing characters. \r\n ${PROMPT_NO_REFERENCE}\r\n `,\r\n GENERATE_BLOG_POST_DESCRIPTIONS: `\r\n ${PROMPT_CLEANUP}\r\n You are an expert copywriter who writes catchy descriptions for blog posts. \r\n You have a {voice} tone of voice. \r\n You have a {style} writing style. \r\n Write {limit} catchy blog post descriptions with a hook for the blog post titled \"{search}\". \r\n The descriptions should be written in the {language} language. \r\n The descriptions should be less than 160 characters. \r\n The descriptions should include the words from the title \"{search}\". \r\n Please create a {output} where each object has a single column named \"Description.\"\r\n Do not use markdown, line breaks, single quotes, double quotes or any other enclosing characters. \r\n ${PROMPT_NO_REFERENCE}\r\n `,\r\n GENERATE_BLOG_POST_OUTLINE: `\r\n ${PROMPT_CLEANUP}\r\n You are an expert copywriter who creates content outlines. \r\n You have a {voice} tone of voice. \r\n You have a {style} writing style. \r\n Create {limit} alternative long form content outlines in the {language} language for the blog post titled {search}. \r\n Each outline should include a minimum of 3-4 headings, and each heading should have 4-5 subheadings. \r\n Each outline should be extensive and should cover the entire topic. \r\n Create detailed subheadings that are engaging and catchy. \r\n Do not write the blog post, only the outlines. \r\n Write the output as an array of outlines, where each outline is an array of sections.\r\n The response should have this exact structure:\r\n [\r\n {\r\n \"outline\": [\r\n {\r\n \"headline\": \"First Section Title\",\r\n \"subheadings\": [\"Point 1\", \"Point 2\", \"Point 3\", \"Point 4\"]\r\n },\r\n {\r\n \"headline\": \"Second Section Title\",\r\n \"subheadings\": [\"Point 1\", \"Point 2\", \"Point 3\", \"Point 4\"]\r\n }\r\n ]\r\n },\r\n {\r\n \"outline\": [\r\n // next alternative outline sections...\r\n ]\r\n }\r\n ]\r\n Each outline array should contain 3-4 different sections.\r\n Avoid self-reference and the inclusion of explanatory notes, crafting outlines that speak directly to the essence of the blog post.\r\n ${PROMPT_NO_REFERENCE}\r\n `,\r\n/* GENERATE_BLOG_POST_OUTLINE_OLD: `\r\n ${PROMPT_CLEANUP}\r\n You are an expert copywriter who creates content outlines. \r\n You have a {voice} tone of voice. \r\n You have a {style} writing style. \r\n Create {limit} alternative long form content outlines in the {language} language for the blog post titled {search}. \r\n Each outline should include a minimum of 3-4 headings, and each heading should have 4-5 subheadings. \r\n Each outline should be extensive and should cover the entire topic. \r\n Create detailed subheadings that are engaging and catchy. \r\n Do not write the blog post, only the outlines. \r\n Write the output as an array of outlines, where each outline is an array of sections.\r\n The response should have this exact structure:\r\n [\r\n {\r\n \"outline\": [\r\n {\r\n \"headline\": \"First Section Title\",\r\n \"subheadings\": [\"Point 1\", \"Point 2\", \"Point 3\", \"Point 4\"]\r\n },\r\n {\r\n \"headline\": \"Second Section Title\",\r\n \"subheadings\": [\"Point 1\", \"Point 2\", \"Point 3\", \"Point 4\"]\r\n }\r\n ]\r\n },\r\n {\r\n \"outline\": [\r\n // next alternative outline sections...\r\n ]\r\n }\r\n ]\r\n Each outline array should contain 3-4 different sections.\r\n Avoid self-reference and the inclusion of explanatory notes, crafting outlines that speak directly to the essence of the blog post.\r\n ${PROMPT_NO_REFERENCE}\r\n `,\r\n /* GENERATE_BLOG_POST_OUTLINE_OLD: `\r\n ${PROMPT_CLEANUP}\r\n You are an expert copywriter who creates content outlines. \r\n You have a {voice} tone of voice. \r\n You have a {style} writing style. \r\n Create a long form content outline in the {language} language for the blog post titled \"{search}\". \r\n The content outline should include a minimum of 20 headings and subheadings. \r\n The outline should be extensive and it should cover the entire topic. \r\n Create detailed subheadings that are engaging and catchy. \r\n Do not write the blog post, please only write the outline of the blog post. \r\n Please do not number the headings. \r\n Please add a newline space between headings and subheadings. \r\n Avoid self-reference and the inclusion of explanatory notes, crafting an outline that speaks directly to the essence of the blog post.\r\n `, */\r\n GENERATE_COMPLETE_BLOG_POST_FROM_OUTLINE: `\r\n ${PROMPT_CLEANUP}\r\n You are an expert copywriter who writes detailed and thoughtful blog articles. \r\n You have a {voice} tone of voice. \r\n You have a {style} writing style. \r\n I will give you an outline for an article and I want you to expand in the {language} language on each of the subheadings to create a complete article from it. \r\n Please intersperse short and long sentences. \r\n Utilize uncommon terminology to enhance the originality of the content. \r\n Please format the content in a professional format. \r\n Do not use markdown, line breaks, single quotes, double quotes or any other enclosing characters in any of the columns you fill in. \r\n ${PROMPT_NO_REFERENCE} \r\n Please return the responses in a valid JSON object following this prototype: { intro: { title: \"\", paragraphs: [...] }, sections: [{ title: \"\", paragraphs: [...] }, {...}], conclusion: { title: \"\", paragraphs: [...] } }.\r\n The blog article outline is - \"{search}\"\r\n `,\r\n GENERATE_COMPLETE_BLOG_POST_FROM_TOPIC: `\r\n ${PROMPT_CLEANUP}\r\n You are an expert copywriter who writes detailed and thoughtful blog articles. \r\n You have a {voice} tone of voice. \r\n You have a {style} writing style. \r\n I will give you a topic for an article and I want you to create an outline for the topic with a minimum of 20 headings and subheadings. \r\n I then want you to expand in the {language} language on each of the individual subheadings in the outline to create a complete article from it. \r\n Please intersperse short and long sentences. \r\n Utilize uncommon terminology to enhance the originality of the content. \r\n Please format the content in a professional format. \r\n ${PROMPT_NO_REFERENCE} \r\n Send me the outline and then immediately start writing the complete article. \r\n The blog article topic is - \"{search}\". \r\n `,\r\n GENERATE_INTRODUCTION_USING_FRAMEWORK: `\r\n ${PROMPT_CLEANUP}\r\n You are an expert copywriter who writes detailed and compelling blog articles. \r\n You have a {voice} tone of voice. \r\n You have a {style} writing style. \r\n I want you to write a compelling blog introduction paragraph of around {limit} words on \"{search}\" in the {language} language. \r\n Please use the {framework} copywriting framework to hook and grab the attention of the blog readers. \r\n Please intersperse short and long sentences. \r\n Utilize uncommon terminology to enhance the originality of the content. \r\n Please format the content in a professional format. \r\n ${PROMPT_NO_REFERENCE} \r\n I will give you a list of keywords below and it would be great if you can add them into the text wherever appropriate. \r\n Please do highlight these keywords in bold in the text using markdown if you have them in the text. \r\n Here are the keywords - \"{keywords}\". Remember that the topic is \"{search}\"\r\n `,\r\n GENERATE_PARAGRAPH_OF_TEXT: `\r\n ${PROMPT_CLEANUP}\r\n You are an expert copywriter who writes detailed and thoughtful blog articles. \r\n You have a {voice} tone of voice. \r\n You have a {style} writing style. \r\n I want you to write around {limit} words on \"{search}\" in the {language} language. \r\n I will give you a list of keywords that need to be in the text that you create. \r\n Please intersperse short and long sentences. \r\n Utilize uncommon terminology to enhance the originality of the content. \r\n Please format the content in a professional format. \r\n ${PROMPT_NO_REFERENCE} \r\n Here are the keywords - \"{keywords}\". \r\n Please highlight these keywords in bold in the text using markdown.\r\n `,\r\n GENERATE_DICTIONARY: `\r\n ${PROMPT_CLEANUP}\r\n Generate a simple list of all {search} in the {output_array} format.\r\n Kindly respond only in the {language} language.\r\n ${PROMPT_NO_REFERENCE}\r\n `,\r\n GENERATE_FREE: `\r\n ${PROMPT_CLEANUP}\r\n {search}\r\n Please respond only in the {language} language.\r\n ${PROMPT_NO_REFERENCE}\r\n `,\r\n};\r\n\r\nexport const PROMPTS_ROLE = {\r\n SEARCH_INTENT_FROM_KEYWORDS: [\r\n 'You are a keyword research expert that speaks and writes fluent {language}.',\r\n ],\r\n RELATED_KEYWORD_GENERATOR: [\r\n 'You are a keyword research expert that speaks and writes fluent {language}.',\r\n ],\r\n LONG_TAIL_KEYWORD_GENERATOR: [\r\n 'You are a keyword research expert that speaks and writes fluent {language}.',\r\n ],\r\n KEYWORD_STRATEGY: [\r\n 'You are a market research expert that speaks and writes fluent {language}.',\r\n 'You are an expert in keyword research and can develop a full SEO content plan in fluent {language}.',\r\n ],\r\n GENERATE_BLOG_POST_TITLES: [\r\n 'You are an expert copywriter who writes catchy titles for blog posts and writes fluent {language}.',\r\n 'You have a {voice} tone of voice.',\r\n 'You have a {style} writing style.',\r\n ],\r\n GENERATE_BLOG_POST_DESCRIPTIONS: [\r\n 'You are an expert copywriter who writes catchy descriptions for blog posts and writes fluent {language}.',\r\n 'You have a {voice} tone of voice.',\r\n 'You have a {style} writing style.',\r\n ],\r\n GENERATE_BLOG_POST_OUTLINE: [\r\n 'You are an expert copywriter who creates content outlines and writes fluent {language}.',\r\n 'You have a {voice} tone of voice.',\r\n 'You have a {style} writing style.',\r\n ],\r\n GENERATE_COMPLETE_BLOG_POST_FROM_OUTLINE: [\r\n 'You are an expert copywriter who writes detailed and thoughtful blog articles and writes fluent {language}.',\r\n 'You have a {voice} tone of voice.',\r\n 'You have a {style} writing style.',\r\n ],\r\n GENERATE_COMPLETE_BLOG_POST_FROM_TOPIC: [\r\n 'You are an expert copywriter who writes detailed and thoughtful blog articles and writes fluent {language}.',\r\n 'You have a {voice} tone of voice.',\r\n 'You have a {style} writing style.',\r\n ],\r\n GENERATE_INTRODUCTION_USING_FRAMEWORK: [\r\n 'You are an expert copywriter who writes detailed and compelling blog articles and writes fluent {language}.',\r\n 'You have a {voice} tone of voice.',\r\n 'You have a {style} writing style.',\r\n ],\r\n GENERATE_PARAGRAPH_OF_TEXT: [\r\n 'You are an expert copywriter who writes detailed and thoughtful blog articles and writes fluent {language}.',\r\n 'You have a {voice} tone of voice.',\r\n 'You have a {style} writing style.',\r\n ],\r\n GENERATE_DICTIONARY: [\r\n 'You are an expert copywriter who writes detailed and thoughtful blog articles and writes fluent {language}.',\r\n 'You have a {voice} tone of voice.',\r\n 'You have a {style} writing style.',\r\n ],\r\n GENERATE_FREE: [\r\n 'You are an expert copywriter who writes catchy text in fluent {language}.',\r\n 'You have a {voice} tone of voice.',\r\n 'You have a {style} writing style.',\r\n ],\r\n};\r\n\r\nexport const LABELS = {\r\n SEARCH_INTENT_FROM_KEYWORDS: \"Enter the list of keywords to classify by search intent.\",\r\n RELATED_KEYWORD_GENERATOR: \"What is the main keyword you want related suggestions for?\",\r\n LONG_TAIL_KEYWORD_GENERATOR: \"What is the main keyword you want long-tail keywords for?\",\r\n KEYWORD_STRATEGY: \"What is the main keyword to build your SEO strategy around?\",\r\n GENERATE_BLOG_POST_TITLES: \"What is the main topic you want to generate titles about?\",\r\n GENERATE_BLOG_POST_DESCRIPTIONS: \"What is the title of the blog post to generate descriptions for?\",\r\n GENERATE_BLOG_POST_OUTLINE: \"What is the blog post title you want an outline for?\",\r\n /* GENERATE_BLOG_POST_OUTLINE_OLD: \"What is the blog post title you want an outline for?\", */\r\n GENERATE_COMPLETE_BLOG_POST_FROM_OUTLINE: \"What is the outline or blog topic to expand into a full article?\",\r\n GENERATE_COMPLETE_BLOG_POST_FROM_TOPIC: \"What is the topic for the blog article?\",\r\n GENERATE_INTRODUCTION_USING_FRAMEWORK: \"What is the topic of the blog post you want an introduction for?\",\r\n GENERATE_PARAGRAPH_OF_TEXT: \"What is the topic you want to write a paragraph about?\",\r\n GENERATE_DICTIONARY: \"What items do you want to list in a dictionary format?\",\r\n GENERATE_FREE: \"What custom prompt would you like to run?\"\r\n};\r\n\r\n\r\nexport const getPromptVoice = () => {\r\n return localStorage.getItem(\"promptVoice\") || PROMPT_VOICE_DEFAULT\r\n}\r\nexport const getPromptStyle = () => {\r\n return localStorage.getItem(\"promptStyle\") || PROMPT_STYLE_DEFAULT\r\n}\r\n\r\nexport const getPromptCountries = () => {\r\n return Object.values(COUNTRIES);\r\n}\r\nexport const getPromptLangs = () => {\r\n return Object.values(LANGS);\r\n}\r\nexport const getPromptVoices = () => {\r\n return PROMPT_VOICES;\r\n}\r\n\r\nexport const getPromptStyles = () => {\r\n return PROMPT_STYLES;\r\n}\r\n\r\nexport const getPrompt = (strategy: keyof typeof PROMPTS): { prompt: string; label: string } => {\r\n return {\r\n prompt: PROMPTS[strategy] ?? \"\",\r\n label: LABELS[strategy] ?? \"\"\r\n };\r\n}\r\n\r\nexport const getPromptOutline = () => {\r\n return PROMPTS[\"GENERATE_BLOG_POST_OUTLINE\"] ?? \"\";\r\n}\r\n\r\nexport const getPromptRole = (strategy: keyof typeof PROMPTS_ROLE): string[] => {\r\n return PROMPTS_ROLE[strategy] ?? [];\r\n};\r\n\r\n\r\nexport const setPrompt = (\r\n prompt: string,\r\n configVariables: { lang?: string, voice?: string, style?: string, limit?: string },\r\n userInput: string\r\n): string => {\r\n const { lang, voice, style, limit } = configVariables;\r\n return prompt\r\n .replaceAll(\"{search}\", userInput || \"\")\r\n .replaceAll(\"{language}\", lang || \"\")\r\n .replaceAll(\"{voice}\", voice || \"\")\r\n .replaceAll(\"{style}\", style || \"\")\r\n .replaceAll(\"{limit}\", limit || \"\");\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n//------------------------------------------------------------------------\r\n\r\n\r\nexport interface PromptVariables {\r\n [key: string]: any;\r\n}\r\n\r\nconst PROMPT_ROLE_DEFAULT = \"default\";\r\nconst PROMPT_VOICE_DEFAULT = \"Informative\";\r\nconst PROMPT_STYLE_DEFAULT = \"Argumentative\";\r\n\r\n\r\nconst PROMPT_VOICES = [\r\n \"Authoritative\",\r\n \"Caring\",\r\n \"Casual\",\r\n \"Cheerful\",\r\n \"Coarse\",\r\n \"Conservative\",\r\n \"Conversational\",\r\n \"Creative\",\r\n \"Dry\",\r\n \"Edgy\",\r\n \"Enthusiastic\",\r\n \"Expository\",\r\n \"Formal\",\r\n \"Frank\",\r\n \"Friendly\",\r\n \"Fun\",\r\n \"Funny\",\r\n \"Humorous\",\r\n \"Informative\",\r\n \"Irreverent\",\r\n \"Journalistic\",\r\n \"Matter of fact\",\r\n \"Nostalgic\",\r\n \"Objective\",\r\n \"Passionate\",\r\n \"Poetic\",\r\n \"Playful\",\r\n \"Professional\",\r\n \"Provocative\",\r\n \"Quirky\",\r\n \"Respectful\",\r\n \"Romantic\",\r\n \"Sarcastic\",\r\n \"Serious\",\r\n \"Smart\",\r\n \"Snarky\",\r\n \"Subjective\",\r\n \"Sympathetic\",\r\n \"Trendy\",\r\n \"Trustworthy\",\r\n \"Unapologetic\",\r\n \"Upbeat\",\r\n \"Witty\",\r\n];\r\n\r\nconst PROMPT_STYLES = [\r\n \"Academic\",\r\n \"Analytical\",\r\n \"Argumentative\",\r\n \"Conversational\",\r\n \"Creative\",\r\n \"Critical\",\r\n \"Descriptive\",\r\n \"Epigrammatic\",\r\n \"Epistolary\",\r\n \"Expository\",\r\n \"Informative\",\r\n \"Instructive\",\r\n \"Journalistic\",\r\n \"Metaphorical\",\r\n \"Narrative\",\r\n \"Persuasive\",\r\n \"Poetic\",\r\n \"Satirical\",\r\n \"Technical\",\r\n];\r\n\r\nconst PROMPT_ROLES: Record<string, string> = {\r\n // --- Macro-ruoli generici ---\r\n default: `You are a highly skilled and versatile AI assistant who can adapt to any task or context. You write in fluent {language}, using a {voice} tone of voice and a {style} writing style. You provide clear, concise, and well-structured responses, ensuring both accuracy and creativity according to the user's needs.`,\r\n copywriter: `You are an expert copywriter who writes catchy text in fluent {language}. You have a {voice} tone of voice. You have a {style} writing style.`,\r\n seo_expert: `You are an experienced SEO specialist who writes optimized, keyword-rich content in fluent {language}. You have a {voice} tone of voice. You have a {style} writing style.`,\r\n storyteller: `You are a talented storyteller who crafts engaging narratives in fluent {language}. You have a {voice} tone of voice. You have a {style} writing style.`,\r\n translator: `You are a professional translator who accurately translates content into {language}, maintaining meaning, nuance, and cultural relevance. You have a {voice} tone of voice. You have a {style} writing style.`,\r\n marketing_strategist: `You are a skilled marketing strategist who creates persuasive campaigns in fluent {language}. You have a {voice} tone of voice. You have a {style} writing style.`,\r\n teacher: `You are a knowledgeable teacher who explains concepts clearly and simply in fluent {language}. You have a {voice} tone of voice. You have a {style} writing style.`,\r\n technical_writer: `You are a precise and detail-oriented technical writer who produces clear documentation in fluent {language}. You have a {voice} tone of voice. You have a {style} writing style.`,\r\n interviewer: `You are a skilled interviewer who formulates relevant and engaging questions in fluent {language}. You have a {voice} tone of voice. You have a {style} writing style.`,\r\n product_describer: `You are an e-commerce product description specialist who writes compelling, benefit-focused descriptions in fluent {language}. You have a {voice} tone of voice. You have a {style} writing style.`,\r\n social_media_manager: `You are a creative social media manager who writes engaging, platform-specific posts in fluent {language}. You have a {voice} tone of voice. You have a {style} writing style.`,\r\n ux_writer: `You are a UX writer who creates clear, concise, and user-friendly interface text in fluent {language}. You have a {voice} tone of voice. You have a {style} writing style.`,\r\n press_officer: `You are an experienced press officer who writes impactful press releases in fluent {language}. You have a {voice} tone of voice. You have a {style} writing style.`,\r\n legal_drafter: `You are a legal expert who drafts precise and compliant legal texts in fluent {language}. You have a {voice} tone of voice. You have a {style} writing style.`,\r\n recruiter: `You are a professional recruiter who writes compelling job descriptions and outreach messages in fluent {language}. You have a {voice} tone of voice. You have a {style} writing style.`,\r\n news_reporter: `You are a news reporter who writes objective and concise news articles in fluent {language}. You have a {voice} tone of voice. You have a {style} writing style.`,\r\n\r\n // --- Ruoli SEO specializzati ---\r\n search_intent_analyst: `You are a keyword research expert who analyzes search intent from given keywords and writes in fluent {language}.`,\r\n keyword_generator: `You are a keyword research expert who generates related keywords in fluent {language}.`,\r\n long_tail_keyword_generator: `You are a keyword research expert who generates long-tail keywords in fluent {language}.`,\r\n seo_content_planner: `You are a market research expert and SEO strategist who develops a full SEO content plan in fluent {language}.`,\r\n\r\n // --- Ruoli di content creation specializzati ---\r\n blog_title_specialist: `You are an expert copywriter who writes catchy blog post titles in fluent {language}. You have a {voice} tone of voice. You have a {style} writing style.`,\r\n blog_description_specialist: `You are an expert copywriter who writes compelling blog post descriptions in fluent {language}. You have a {voice} tone of voice. You have a {style} writing style.`,\r\n blog_outline_specialist: `You are an expert copywriter who creates structured content outlines in fluent {language}. You have a {voice} tone of voice. You have a {style} writing style.`,\r\n blog_writer_from_outline: `You are an expert copywriter who writes complete blog posts from outlines in fluent {language}. You have a {voice} tone of voice. You have a {style} writing style.`,\r\n blog_writer_from_topic: `You are an expert copywriter who writes complete blog posts from topics in fluent {language}. You have a {voice} tone of voice. You have a {style} writing style.`,\r\n blog_intro_specialist: `You are an expert copywriter who writes engaging introductions using known copywriting frameworks in fluent {language}. You have a {voice} tone of voice. You have a {style} writing style.`,\r\n paragraph_writer: `You are an expert copywriter who writes single, impactful paragraphs in fluent {language}. You have a {voice} tone of voice. You have a {style} writing style.`,\r\n dictionary_writer: `You are a copywriter who writes concise and clear definitions in fluent {language}. You have a {voice} tone of voice. You have a {style} writing style.`,\r\n creative_free_writer: `You are an expert copywriter who writes any kind of catchy text in fluent {language}. You have a {voice} tone of voice. You have a {style} writing style.`\r\n};\r\n\r\nexport class Prompt {\r\n static getRoles(): string[] {\r\n return Object.keys(PROMPT_ROLES);\r\n }\r\n\r\n static getLangs(): string[] {\r\n return Object.values(LANGS);\r\n }\r\n\r\n static getCountries(): string[] {\r\n return Object.values(COUNTRIES);\r\n }\r\n\r\n static getVoices(): string[] {\r\n return PROMPT_VOICES;\r\n }\r\n\r\n static getStyles(): string[] {\r\n return PROMPT_STYLES;\r\n }\r\n\r\n static defaults(): { role: string, language: string, country: string, voice: string, style: string } {\r\n return {\r\n role: PROMPT_ROLE_DEFAULT,\r\n language: currentLang(),\r\n country: currentCountry(),\r\n voice: localStorage.getItem(\"prompt.voice\") || PROMPT_VOICE_DEFAULT,\r\n style: localStorage.getItem(\"prompt.style\") || PROMPT_STYLE_DEFAULT,\r\n };\r\n }\r\n\r\n static parseRole(role?: string, variables: PromptVariables = {}): string {\r\n return converter.parse({ ...this.defaults(), ...variables }, PROMPT_ROLES[role ?? this.defaults().role]);\r\n }\r\n static parsePrompt(prompt: string, variables: PromptVariables = {}): string {\r\n return converter.parse({ ...this.defaults(), ...variables }, prompt);\r\n }\r\n}","import { getPromptStyle, getPromptVoice, Prompt, PROMPTS, PROMPTS_ROLE } from \"../../conf/Prompt\";\nimport { fetchRest } from \"../../libs/fetch\";\nimport { consoleLog } from \"../../constant\";\nimport { AIConfig, Config, onConfigChange } from \"../../Config\";\nimport {\n createConfigurationState,\n getMissingKeys,\n type ProviderConfigurationState,\n} from \"../ProviderConfiguration\";\nimport { currentLang } from \"../../libs/locale\";\nimport { PromptVariables } from \"../../conf/Prompt\";\n\nconst OUTPUT = `Return ONLY a valid JSON array of objects.\nRules:\n- No trailing commas\n- No markdown\n- No explanations\n- No comments`;\n\nconst OUTPUT_ARRAY = `Return ONLY a valid JSON array of primitive values.\nRules:\n- The array must contain ONLY primitive values (string, number, or boolean)\n- Do NOT include objects or nested arrays\n- No trailing commas\n- No markdown\n- No explanations\n- No comments\n- The response must be directly parseable by JSON.parse()\n`;\n\nconst CHATGPT_URL = 'https://api.openai.com/v1/chat/completions';\nconst CHATGPT_COMPLETION_URL = 'https://api.openai.com/v1/completions';\n\nconst CHATGPT_TEMPERATURE = 0.5;\nconst CHATGPT_MODEL = 'gpt-5';\nconst CHATGPT_FRAMEWORK = \"AIDA (Attention Interest Desire Action)\";\nconst CHATGPT_FRAMEWORKS = [\n \"AIDA (Attention Interest Desire Action)\",\n \"PAS (Problem Agitate Solution)\",\n \"BAB (Before After Bridge)\",\n \"FAB (Features Advantages Benefits)\",\n];\n\nconst GEMINI_COMPLETION_URL = 'https://api.gemini.com/v1/predict';\nconst GEMINI_MODEL = 'your-gemini-model-default';\n\ntype PromptPlaceholders = {\n [key: string]: string | number | boolean | undefined;\n};\n\ntype FetchAIOptions = {\n limit?: number;\n keywords?: string[];\n model?: string;\n framework?: string;\n temperature?: number;\n voice?: string;\n style?: string;\n};\n\ntype Message = {\n role: 'user' | 'system' | 'assistant';\n content: string;\n};\n\nlet config: AIConfig | undefined = undefined;\nif (typeof onConfigChange === 'function') {\n onConfigChange((newConfig: Config) => {\n config = newConfig.ai;\n });\n}\n\nconst promptAssign = (prompt: string, options: PromptPlaceholders): string => {\n Object.keys(options).forEach(key => {\n options[key] && (prompt = prompt.replaceAll(`{${key}}`, String(options[key])));\n });\n return prompt\n .replaceAll('{output}', OUTPUT)\n .replaceAll('{output_array}', OUTPUT_ARRAY)\n .replaceAll('{language}', currentLang())\n .replaceAll('{voice}', getPromptVoice())\n .replaceAll('{style}', getPromptStyle())\n .replace(/{[^{}]+}/g, '');\n}\n\nconst parseContent = (str: string): any => {\n try {\n return (str.startsWith(\"{\") || str.startsWith(\"[\")\n ? JSON.parse(str)\n : str\n )\n } catch (error) {\n console.error('Errore di sintassi JSON');\n return;\n }\n}\n\nconst apiLog = (aiType: string, response: any, strategy?: string) => {\n consoleLog(aiType + \"->response::\", strategy, response);\n return response;\n}\n\nconst chatChatGPTContinue = async (\n content: string,\n prevMessages: any[],\n countRetry = 0\n): Promise<any> => {\n if (!config?.openaiApiKey) {\n console.error(`\n❌ OpenAI API Key not configured.\n\nTo use ChatGPT, you must configure a valid OpenAI API key.\n\n🛠 How to get your API key:\n1. Go to https://platform.openai.com/\n2. Log in or create a free account\n3. From your dashboard, click on your profile (top right) > \"View API keys\"\n4. Click \"Create new secret key\"\n5. Copy the key and store it securely\n\n📌 Add it to your tenant configuration under:\n config.ai.chatGptApiKey = \"<your-api-key>\"\n\n⚠️ Without this key, ChatGPT features will not work.\n`);\n return;\n }\n\n countRetry++;\n if (countRetry > 3) {\n return;\n }\n\n const messages = [\n ...prevMessages,\n { role: 'user', content: 'Please continue: ' + content }\n ];\n\n console.log(\"Retry: \" + countRetry, '<------------------------------------------------------------------------------------');\n return fetchRest(CHATGPT_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': 'Bearer ' + config.openaiApiKey\n },\n body: {\n engine: CHATGPT_MODEL,\n messages: messages,\n temperature: CHATGPT_TEMPERATURE\n }\n })\n .then(response => {\n if (!response?.choices) {\n console.log(\"<<<<<<<<impossible>>>>>>>>\");\n return null;\n }\n\n const continueContent = content + response.choices[0].message.content;\n\n return parseContent(continueContent) || chatChatGPTContinue(continueContent, prevMessages, countRetry);\n });\n}\n\n\nconst fetchOpenaiApi = async (\n prompt: string,\n options: {\n model?: string;\n temperature?: number;\n } = {},\n strategy?: keyof typeof PROMPTS | undefined\n): Promise<any> => {\n const prompts = strategy !== undefined ? PROMPTS_ROLE[strategy] ?? [] : [];\n\n const roles: Message[] = prompts.map((role: string) => ({\n role: 'system',\n content: role\n }));\n\n\n const body = {\n model: options.model || CHATGPT_MODEL,\n messages: [\n ...roles,\n { role: 'user', content: prompt }\n ],\n temperature: options.temperature || CHATGPT_TEMPERATURE\n };\n\n consoleLog(PROVIDER_OPENAI + \"->request::\", strategy, body);\n return fetchRest(CHATGPT_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': 'Bearer ' + config?.openaiApiKey\n },\n body: body\n })\n .then(response => {\n console.log('Laaaaaaaaaaaa')\n console.log(response)\n return apiLog(PROVIDER_OPENAI, response, strategy)})\n .then(response => {\n if (!response?.choices) return null;\n return parseContent(response.choices[0].message.content)\n || chatChatGPTContinue(response.choices[0].message.content, roles);\n });\n};\n\n\nconst fetchGeminiApi = async (\n search: string,\n {\n limit = 10,\n keywords = [],\n model = undefined,\n framework = undefined,\n temperature = undefined,\n voice = undefined,\n style = undefined,\n }: FetchAIOptions,\n strategy?: keyof typeof PROMPTS | undefined\n): Promise<any> => {\n if (!config?.geminiApiKey) {\n console.error(`\n❌ Gemini API Key not configured.\n\nTo use Google Gemini (formerly Bard), you must configure a valid API key.\n\n🛠 How to get your Gemini API key:\n1. Go to https://makersuite.google.com/app/apikey\n2. Sign in with your Google account\n3. Click on \"Create API Key\"\n4. Copy the key provided\n\n📌 Add it to your tenant configuration under:\n config.ai.geminiApiKey = \"<your-api-key>\"\n\n⚠️ Without this key, Gemini-related features will not function.\n`);\n return;\n }\n\n const promptOptions: PromptPlaceholders = {\n keywords: keywords.join(', '),\n search,\n limit,\n voice,\n style,\n };\n\n const promptRole = (question: string): string => {\n const role = 'Assistant';\n const specialization = 'Generalist';\n\n return `**Role:** ${role}\\n**Specialization:** ${specialization}\\n\\nYour question: ${question}`;\n }\n\n const prompt = promptRole(\n promptAssign(\n strategy !== undefined ? PROMPTS[strategy] ?? \"\" : \"\",\n promptOptions\n )\n );\n const body = {\n instances: [{ content: prompt }]\n };\n\n consoleLog(PROVIDER_GEMINI + \"->request::\", strategy, body);\n return fetchRest(`${GEMINI_COMPLETION_URL}?model=${model || GEMINI_MODEL}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': 'Bearer ' + config.geminiApiKey\n },\n body: body\n })\n .then(response => apiLog(PROVIDER_GEMINI, response, strategy))\n .then(response => {\n if (response?.predictions) {\n return;\n }\n return parseContent(response.predictions[0].text)\n });\n}\n\nconst fetchAnthropicApi = async (\n prompt: string,\n options: FetchAIOptions = {},\n strategy?: keyof typeof PROMPTS | undefined\n): Promise<any> => {\n return fetchRest(PROVIDERS[PROVIDER_ANTHROPIC].url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': 'Bearer ' + config?.anthropicApiKey\n },\n body: {\n model: options.model || PROVIDERS[PROVIDER_ANTHROPIC].model,\n messages: [{ role: 'user', content: prompt }],\n temperature: options.temperature || PROVIDERS[PROVIDER_ANTHROPIC].temperature\n }\n })\n .then(response => apiLog(PROVIDER_ANTHROPIC, response, strategy))\n .then(response => {\n if (!response?.choices) return null;\n return parseContent(response.choices[0].message.content)\n });\n}\n\nconst fetchMistralApi = async (\n prompt: string,\n options: FetchAIOptions = {},\n strategy?: keyof typeof PROMPTS | undefined\n): Promise<any> => {\n return fetchRest(PROVIDERS[PROVIDER_MISTRAL].url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': 'Bearer ' + config?.mistralApiKey\n },\n body: {\n model: options.model || PROVIDERS[PROVIDER_MISTRAL].model,\n messages: [{ role: 'user', content: prompt }],\n temperature: options.temperature || PROVIDERS[PROVIDER_MISTRAL].temperature\n }\n })\n .then(response => apiLog(PROVIDER_MISTRAL, response, strategy))\n .then(response => {\n if (!response?.choices) return null;\n return parseContent(response.choices[0].message.content)\n });\n}\n\nexport default function fetchAI(provider = PROVIDER_DEFAULT) {\n return fetchOpenaiApi;\n}\n\ninterface AIProvider {\n name: string;\n url: string;\n model: string;\n models: string[];\n framework?: string;\n frameworks?: string[];\n temperature: number;\n parseHeaders: () => Record<string, string>;\n parseBody: (prompt: string, role: string, options: AIOptions) => Record<string, any>;\n parseResponse: (response: any) => any;\n}\n\ninterface AIOptions {\n language?: string;\n voice?: string;\n style?: string;\n role?: string;\n model?: string;\n temperature?: number;\n}\n\nexport interface AIFetchConfig extends AIOptions {\n provider?: keyof typeof PROVIDERS;\n}\n\n\nconst PROVIDER_OPENAI = \"openai\";\nconst PROVIDER_GEMINI = \"gemini\";\nconst PROVIDER_ANTHROPIC = \"anthropic\";\nconst PROVIDER_MISTRAL = \"mistral\";\nconst PROVIDER_DEFAULT = PROVIDER_OPENAI;\n\nconst PROVIDER_CONFIG_KEYS = {\n [PROVIDER_OPENAI]: 'openaiApiKey',\n [PROVIDER_GEMINI]: 'geminiApiKey',\n [PROVIDER_ANTHROPIC]: 'anthropicApiKey',\n [PROVIDER_MISTRAL]: 'mistralApiKey',\n} as const;\n\nexport const getAIProviderConfigurationState = (\n provider: keyof typeof PROVIDERS = PROVIDER_DEFAULT\n): ProviderConfigurationState => createConfigurationState(\n `AIProvider:${provider}`,\n getMissingKeys(\n config as unknown as Record<string, unknown> | undefined,\n [PROVIDER_CONFIG_KEYS[provider]],\n 'ai.'\n )\n);\n\nconst PROVIDERS = {\n [PROVIDER_OPENAI]: {\n name: PROVIDER_OPENAI,\n url: 'https://api.openai.com/v1/chat/completions',\n model: 'gpt-5.2',\n models: ['gpt-4.1', 'gpt-4.1-mini', 'gpt-4.1-nano', 'gpt-5', 'gpt-5-mini', 'gpt-5-nano'],\n framework: 'AIDA (Attention Interest Desire Action)',\n frameworks: [\n 'AIDA (Attention Interest Desire Action)',\n 'PAS (Problem Agitate Solution)',\n 'BAB (Before After Bridge)',\n 'FAB (Features Advantages Benefits)',\n ],\n temperature: 0.7,\n parseHeaders: () => {\n return {\n 'Content-Type': 'application/json',\n 'Authorization': 'Bearer ' + config?.openaiApiKey\n }\n },\n parseBody: (prompt: string, role: string, options: AIOptions) => {\n return {\n model: options.model || PROVIDERS[PROVIDER_OPENAI].model,\n messages: [\n ...(role ? [{ role: 'system', content: role }] : []),\n { role: 'user', content: prompt }\n ],\n temperature: options.temperature ?? PROVIDERS[PROVIDER_OPENAI].temperature\n }\n },\n parseResponse: (response: any) => {\n if (!response?.choices) return null;\n return response.choices[0].message.content\n }\n },\n [PROVIDER_GEMINI]: {\n name: PROVIDER_GEMINI,\n url: 'https://api.gemini.com/v1/predict',\n model: 'gemini-2.5-pro',\n models: ['gemini-2.5-pro', 'gemini-2.5-flash', 'gemini-2.5-flash-lite', 'gemini-2.5-deep-think'],\n temperature: 0.7,\n parseHeaders: () => {\n return {\n 'Content-Type': 'application/json',\n 'Authorization': 'Bearer ' + config?.geminiApiKey\n }\n },\n parseBody: (prompt: string, role: string, options: AIOptions) => {\n return {\n model: options.model || PROVIDERS[PROVIDER_GEMINI].model,\n instances: [{ content: role ? role + \"\\n\\n\" + prompt : prompt }],\n temperature: options.temperature ?? PROVIDERS[PROVIDER_GEMINI].temperature\n }\n },\n parseResponse: (response: any) => {\n if (!response?.predictions) return null;\n return response.predictions[0].text\n }\n },\n [PROVIDER_ANTHROPIC]: {\n name: PROVIDER_ANTHROPIC,\n url: 'https://api.anthropic.com/v1/completions',\n model: 'claude-3.5',\n models: ['claude-3.5', 'claude-3.7-sonnet', 'claude-4', 'claude-opus-4.1'],\n temperature: 0.7,\n parseHeaders: () => {\n return {\n 'Content-Type': 'application/json',\n 'Authorization': 'Bearer ' + config?.anthropicApiKey\n }\n },\n parseBody: (prompt: string, role: string, options: AIOptions) => {\n return {\n model: options.model || PROVIDERS[PROVIDER_ANTHROPIC].model,\n messages: [\n ...(role ? [{ role: 'system', content: role }] : []),\n { role: 'user', content: prompt }\n ],\n temperature: options.temperature ?? PROVIDERS[PROVIDER_ANTHROPIC].temperature\n }\n },\n parseResponse: (response: any) => {\n if (!response?.choices) return null;\n return response.choices[0].message.content\n }\n },\n [PROVIDER_MISTRAL]: {\n name: PROVIDER_MISTRAL,\n url: 'https://api.mistral.com/v1/completions',\n model: 'mistral-small-3.1',\n models: ['mistral-small-3.1', 'mistral-medium-3', 'magistral-small', 'magistral-medium', 'devstral-small', 'codestral-22B', 'mixtral-8x22B', 'mistral-large-2'],\n temperature: 0.7,\n parseHeaders: () => {\n return {\n 'Content-Type': 'application/json',\n 'Authorization': 'Bearer ' + config?.mistralApiKey\n }\n },\n parseBody: (prompt: string, role: string, options: AIOptions) => {\n return {\n model: options.model || PROVIDERS[PROVIDER_MISTRAL].model,\n messages: [\n ...(role ? [{ role: 'system', content: role }] : []),\n { role: 'user', content: prompt }\n ],\n temperature: options.temperature ?? PROVIDERS[PROVIDER_MISTRAL].temperature\n }\n },\n parseResponse: (response: any) => {\n if (!response?.choices) return null;\n return response.choices[0].message.content\n }\n },\n}\n\nexport class AI extends Prompt {\n config: AIProvider;\n options: AIOptions;\n data?: PromptVariables;\n\n static fetch(prompt: string, config: AIFetchConfig, data?: PromptVariables) {\n const { provider, ...options } = config;\n\n return (new AI(provider))\n .setOptions(options)\n .setData(data)\n .fetchAPI(prompt);\n }\n\n static getModels(provider?: keyof typeof PROVIDERS) {\n return PROVIDERS[provider ?? PROVIDER_DEFAULT].models;\n }\n\n constructor(provider: keyof typeof PROVIDERS = PROVIDER_DEFAULT) {\n super();\n this.config = PROVIDERS[provider];\n this.options = {};\n }\n\n setOptions(options: AIOptions) {\n this.options = options;\n return this;\n }\n\n setData(data?: PromptVariables) {\n this.data = data;\n return this;\n }\n\n static defaults() {\n return {\n ...super.defaults(),\n model: localStorage.getItem(\"prompt.model\") || PROVIDERS[PROVIDER_DEFAULT].model,\n }\n }\n\n async fetchAPI(prompt: string): Promise<any> {\n const body = this.config.parseBody(\n AI.parsePrompt(prompt, { ...this.options, ...this.data }),\n AI.parseRole(this.options.role, this.options),\n this.options\n );\n console.log(this.config.name + \"->request\", body);\n\n return fetchRest(this.config.url, {\n method: 'POST',\n headers: this.config.parseHeaders(),\n body: body\n })\n .then(response => {\n console.log(this.config.name + \"->response\", response);\n return this.config.parseResponse(response)\n })\n .then(response => {\n if (response === null) {\n console.error('fetchAI->warning: Response is null');\n return null;\n }\n try {\n return (response.startsWith(\"{\") || response.startsWith(\"[\")\n ? JSON.parse(response)\n : response\n )\n } catch (error) {\n console.error('fetchAI->error: Failed to parse response', error);\n return null;\n }\n })\n .catch(error => {\n console.error('fetchAI->error: Failed to fetch', error);\n return null;\n });\n\n }\n}\n","import React, { useState } from 'react';\r\nimport { Switch, TextArea, Wrapper, LoadingButton, Dropdown, DropdownItem, Select, Range, ActionButton } from '../..';\r\nimport {useTheme} from \"../../../Theme\";\r\nimport { AI, AIFetchConfig } from '../../../providers/ai';\r\nimport { PROMPT_CLEANUP, PROMPT_NO_REFERENCE, PromptVariables } from '../../../conf/Prompt';\r\nimport { FormFieldProps, useFormContext } from '../../widgets/Form';\r\nimport { RecordProps } from '../../../providers/data/DataProvider';\r\n\r\nexport enum PromptMode {\r\n EDITOR = \"editor\",\r\n LIVE = \"live\"\r\n}\r\ntype PromptOptions = AIFetchConfig & {\r\n value: string;\r\n};\r\n\r\ntype OnRunPrompt = (prompt: string, config: AIFetchConfig, data?: PromptVariables) => Promise<string>;\r\n\r\nexport interface PromptProps extends FormFieldProps {\r\n mode?: PromptMode;\r\n onRunPrompt?: OnRunPrompt;\r\n renderPromptDisabled?: (props: Omit<FormFieldProps, \"defaultValue\">) => React.ReactNode;\r\n rows?: number;\r\n defaultValue?: {\r\n value?: string;\r\n enabled?: boolean;\r\n role?: string;\r\n language?: string;\r\n voice?: string;\r\n style?: string;\r\n model?: string;\r\n temperature?: number;\r\n };\r\n}\r\n\r\ninterface PromptEditorProps extends Omit<PromptProps, \"mode\" | \"onRunPrompt\" | \"renderPromptDisabled\"> {\r\n value?: RecordProps\r\n}\r\n\r\ninterface PromptLiveProps extends Omit<PromptProps, \"mode\" | \"renderPromptDisabled\"> {\r\n value?: RecordProps;\r\n}\r\n\r\ninterface PromptDisabledProps extends Omit<PromptProps, \"mode\" | \"onRunPrompt\"> {\r\n}\r\n\r\ninterface RunPromptProps {\r\n prompt: string;\r\n config: AIFetchConfig;\r\n data?: PromptVariables;\r\n onRunPrompt?: OnRunPrompt;\r\n}\r\n\r\nconst promptLabel = \"Prompt: \";\r\nconst promptClass = \"relative border-l-4 pl-2 border-secondary\";\r\nconst promptActionClass = \"absolute top-0 right-0 flex gap-2\";\r\n\r\nexport const Prompt = ({\r\n mode = PromptMode.EDITOR,\r\n onRunPrompt,\r\n renderPromptDisabled,\r\n ...props\r\n}: PromptProps) => {\r\n const { value } = useFormContext({name: props.name});\r\n return mode === PromptMode.EDITOR \r\n ? <PromptEditor {...props} value={value} /> \r\n : value?.prompt?.enabled \r\n ? <PromptLive {...props} value={value} onRunPrompt={onRunPrompt} /> \r\n : <PromptDisabled {...props} renderPromptDisabled={renderPromptDisabled} />\r\n}\r\n\r\n\r\nconst PromptEditor = ({\r\n name,\r\n label = undefined,\r\n value = undefined,\r\n required = false,\r\n onChange = undefined,\r\n defaultValue = undefined,\r\n rows = 10,\r\n pre = undefined,\r\n post = undefined,\r\n wrapClass = undefined,\r\n className = undefined\r\n}: PromptEditorProps) => {\r\n const { handleChange } = useFormContext({ name });\r\n const theme = useTheme(\"prompt\");\r\n const caption = label || name;\r\nconsole.log(\"PromptEditorAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\", name, value, defaultValue);\r\n\r\n return (\r\n <Wrapper className={wrapClass || theme.Prompt.wrapClass}>\r\n {pre}\r\n <div className={value?.prompt?.enabled ? promptClass : \"relative\"}>\r\n <div className={promptActionClass}>\r\n <Switch \r\n name={name + \".prompt.enabled\"} \r\n label={\"prompt\"} \r\n defaultValue={defaultValue?.enabled}\r\n onChange={({event}) => {\r\n handleChange({\r\n target: {\r\n name: name + \".prompt.value\",\r\n value: event.target.value && defaultValue?.value\r\n }\r\n });\r\n }}\r\n />\r\n </div>\r\n <TextArea \r\n className={className || theme.Prompt.className}\r\n name={name + (value?.prompt?.enabled ? \".prompt.value\" : \".value\")} \r\n label={value?.prompt?.enabled ? promptLabel + caption : caption}\r\n defaultValue={value?.prompt?.enabled && defaultValue?.value}\r\n onChange={onChange} \r\n required={required} \r\n rows={rows} />\r\n </div>\r\n {post}\r\n </Wrapper>\r\n )\r\n}\r\n\r\nconst PromptLive = ({\r\n name,\r\n label,\r\n value,\r\n required,\r\n onChange,\r\n defaultValue,\r\n rows = 10,\r\n pre,\r\n post,\r\n wrapClass,\r\n className,\r\n onRunPrompt\r\n}: PromptLiveProps) => {\r\n const { handleChange, record } = useFormContext({name});\r\n\r\n const theme = useTheme(\"prompt\");\r\n const caption = label || name;\r\n const [prompt, setPrompt] = useState(false);\r\n const defaultValues = AI.defaults();\r\n return (\r\n <Wrapper className={wrapClass || theme.Prompt.wrapClass}>\r\n {pre}\r\n <div className={prompt ? promptClass : \"relative\"}>\r\n <div className={promptActionClass}>\r\n <ActionButton className={value?.prompt?.value ? \"border-0 text-primary hover:bg-primary/10\" : \"border-0 text-warning hover:bg-warning/10\"} \n icon={prompt ? \"terminal-fill\" : \"terminal\"} title={prompt ? \"Mode: Prompt Editor\" : \"Mode: Run Prompt\"} \r\n onClick={() => {\r\n setPrompt(!prompt);\r\n }} />\r\n\r\n </div>\r\n <TextArea \r\n className={(className || theme.Prompt.className)}\r\n name={name + \".prompt.value\"} \r\n label={promptLabel + caption}\r\n defaultValue={defaultValue?.value}\r\n onChange={onChange} \r\n required={true} \r\n post={<Dropdown \r\n position=\"end\"\r\n toggleButton={{\r\n icon: \"gear\"\r\n }}\r\n >\r\n <DropdownItem><Select name={name + \".prompt.role\"} pre=\"Role\" \r\n defaultValue={defaultValue?.role} \r\n options={AI.getRoles()} \r\n optionEmpty={{\r\n label: \"Default (\" + defaultValues.role + \")\",\r\n value: \"\"\r\n }}\r\n /></DropdownItem>\r\n <DropdownItem><Select name={name + \".prompt.language\"} pre=\"Language\" \r\n defaultValue={defaultValue?.language} \r\n options={AI.getLangs()} \r\n optionEmpty={{\r\n label: \"Default (\" + defaultValues.language + \")\",\r\n value: \"\"\r\n }}\r\n /></DropdownItem>\r\n <DropdownItem><Select name={name + \".prompt.voice\"} pre=\"Voice\" \r\n defaultValue={defaultValue?.voice} \r\n options={AI.getVoices()} \r\n optionEmpty={{\r\n label: \"Default (\" + defaultValues.voice + \")\",\r\n value: \"\"\r\n }}\r\n /></DropdownItem>\r\n <DropdownItem><Select name={name + \".prompt.style\"} pre=\"Style\" \r\n defaultValue={defaultValue?.style} \r\n options={AI.getStyles()} \r\n optionEmpty={{\r\n label: \"Default (\" + defaultValues.style + \")\",\r\n value: \"\"\r\n }}\r\n /></DropdownItem>\r\n <DropdownItem><Select name={name + \".prompt.model\"} pre=\"Model\" \r\n defaultValue={defaultValue?.model} \r\n options={AI.getModels()} \r\n optionEmpty={{\r\n label: \"Default (\" + defaultValues.model + \")\",\r\n value: \"\"\r\n }}\r\n /></DropdownItem>\r\n <DropdownItem><Range name={name + \".prompt.temperature\"} label=\"Temperature\" \r\n defaultValue={defaultValue?.temperature} \r\n min={0} \r\n max={1} \r\n step={0.1} \r\n /></DropdownItem>\r\n </Dropdown>}\r\n wrapClass={prompt ? \"\" : \" hidden\"}\r\n rows={rows} />\r\n <TextArea\r\n className={(className || theme.Prompt.className)}\r\n name={name + \".value\"}\r\n label={caption}\r\n onChange={onChange}\r\n required={required}\r\n post={<LoadingButton icon=\"stars\" onClick={async () => {\r\n handleChange?.({\r\n target: {\r\n name: name + \".value\",\r\n value: await runPrompt(value?.prompt, record, onRunPrompt)\r\n }\r\n });\r\n }} />}\r\n wrapClass={prompt ? \" hidden\" : \"\"}\r\n rows={rows} />\r\n </div>\r\n {post}\r\n </Wrapper>\r\n )\r\n}\r\n\r\nconst PromptDisabled = ({\r\n name,\r\n label,\r\n required,\r\n onChange,\r\n rows,\r\n pre,\r\n post,\r\n wrapClass,\r\n className,\r\n renderPromptDisabled\r\n}: PromptDisabledProps) => {\r\n const theme = useTheme(\"prompt\");\r\n\r\n return (\r\n <Wrapper className={wrapClass || theme.Prompt.wrapClass}>\r\n {pre}\r\n {renderPromptDisabled?.({name, label, required, onChange}) ?? (\r\n <TextArea \r\n className={(className || theme.Prompt.className)}\r\n name={name + \".value\"} \r\n label={label}\r\n onChange={onChange} \r\n required={required} \r\n rows={rows} \r\n />\r\n )}\r\n {post}\r\n </Wrapper>\r\n )\r\n}\r\n\r\nexport const runPrompt = async (options: PromptOptions, data?: PromptVariables, onRunPrompt?: OnRunPrompt): Promise<string> => {\r\n const { value: prompt, ...config } = options;\r\n const response = await AI.fetch(\r\n [PROMPT_CLEANUP, onRunPrompt?.(prompt, config, data) ?? prompt, PROMPT_NO_REFERENCE].join(\"\\n\"),\r\n config,\r\n data\r\n );\r\n\r\n console.log(response);\r\n return response;\r\n}\r\n","import React from \"react\";\r\nimport { FormFieldProps, useFormContext } from \"../../widgets/Form\";\r\nimport { Col, Row, Wrapper } from \"../GridSystem\";\r\nimport { Prompt, PromptMode } from \"./Prompt\";\r\nimport { Number, Url } from \"./Input\";\r\nimport Image from \"../Image\";\r\n\r\nexport interface ImageUrlProps extends FormFieldProps {\r\n mode?: PromptMode;\r\n}\r\n\r\nexport const ImageUrl = ({\r\n name,\r\n label,\r\n required,\r\n onChange,\r\n defaultValue,\r\n pre,\r\n post,\r\n wrapClass,\r\n className,\r\n mode,\r\n}: ImageUrlProps) => {\r\n const { value: imageValue, handleChange } = useFormContext({\r\n name,\r\n defaultValue,\r\n onChange,\r\n });\r\n\r\n return (\r\n <Wrapper className={wrapClass}>\r\n {pre}\r\n <Row>\r\n <Url\r\n name={`${name}.url`}\r\n label={label}\r\n pre=\"URL\"\r\n required={required}\r\n className={className}\r\n onChange={onChange}\r\n defaultValue={defaultValue}\r\n />\r\n\r\n <Col className=\"pt-2\">\r\n <Prompt\r\n name={`${name}.alt`}\r\n label=\"Alt text\"\r\n mode={mode}\r\n required={required}\r\n defaultValue={defaultValue}\r\n rows={2}\r\n />\r\n\r\n <Row>\r\n <Col>\r\n <Number\r\n name={`${name}.width`}\r\n pre=\"Width\"\r\n required={required}\r\n defaultValue={defaultValue}\r\n />\r\n </Col>\r\n <Col>\r\n <Number\r\n name={`${name}.height`}\r\n pre=\"Height\"\r\n required={required}\r\n defaultValue={defaultValue}\r\n />\r\n </Col>\r\n </Row>\r\n </Col>\r\n\r\n <Col xs={4}>\r\n <Image\r\n className=\"img-thumbnail w-full h-full\"\r\n src={imageValue?.url}\r\n label={imageValue?.alt}\r\n width={imageValue?.width}\r\n height={imageValue?.height}\r\n />\r\n </Col>\r\n </Row>\r\n {post}\r\n </Wrapper>\r\n );\r\n};\r\n","import { useCallback, useEffect, useMemo, useState } from 'react';\n\nexport type RecordSelectionState<TRecord> = {\n keys: string[];\n records: TRecord[];\n clear: () => void;\n hasSelection: boolean;\n};\n\ntype RecordSelectionPayload<TRecord> = Omit<RecordSelectionState<TRecord>, 'clear'>;\n\ntype UseRecordSelectionArgs<TRecord> = {\n records: TRecord[];\n selectedKeys?: string[];\n legacySelectedKeys?: string[];\n onSelectionChange?: (selection: RecordSelectionState<TRecord>) => void;\n getRecordKey: (record: TRecord, index: number) => string;\n};\n\nexport function useRecordSelection<TRecord>({\n records,\n selectedKeys,\n legacySelectedKeys,\n onSelectionChange,\n getRecordKey,\n}: UseRecordSelectionArgs<TRecord>) {\n const incomingSelectedKeys = selectedKeys ?? legacySelectedKeys;\n const isSelectionControlled = incomingSelectedKeys !== undefined && !!onSelectionChange;\n const [internalSelectedKeys, setInternalSelectedKeys] = useState<string[]>(incomingSelectedKeys ?? []);\n\n useEffect(() => {\n if (incomingSelectedKeys !== undefined && !isSelectionControlled) {\n setInternalSelectedKeys(incomingSelectedKeys);\n }\n }, [incomingSelectedKeys, isSelectionControlled]);\n\n const activeSelectedKeys = isSelectionControlled ? (incomingSelectedKeys || []) : internalSelectedKeys;\n const showSelection = !!onSelectionChange || incomingSelectedKeys !== undefined;\n\n const buildSelectionPayload = useCallback((keys: string[]): RecordSelectionPayload<TRecord> => {\n const keySet = new Set(keys);\n const selectedRecords = records.filter((record, index) => keySet.has(getRecordKey(record, index)));\n return {\n keys,\n records: selectedRecords,\n hasSelection: keys.length > 0,\n };\n }, [getRecordKey, records]);\n\n const updateSelection = useCallback((nextKeys: string[]) => {\n if (!isSelectionControlled) {\n setInternalSelectedKeys(nextKeys);\n }\n\n const nextSelection = buildSelectionPayload(nextKeys);\n onSelectionChange?.({\n ...nextSelection,\n clear: () => updateSelection([]),\n });\n }, [buildSelectionPayload, isSelectionControlled, onSelectionChange]);\n\n const clearSelection = useCallback(() => {\n updateSelection([]);\n }, [updateSelection]);\n\n const selectionState = useMemo<RecordSelectionState<TRecord>>(() => {\n const nextSelection = buildSelectionPayload(activeSelectedKeys);\n return {\n ...nextSelection,\n clear: clearSelection,\n };\n }, [activeSelectedKeys, buildSelectionPayload, clearSelection]);\n\n return {\n activeSelectedKeys,\n selectionState,\n showSelection,\n updateSelection,\n };\n}\n","import { useCallback, useRef } from 'react';\n\ntype RecordWithOptionalKey = {\n _key?: string;\n};\n\nexport function useStableRecordKey<TRecord extends RecordWithOptionalKey>(prefix: string) {\n const generatedKeys = useRef(new WeakMap<object, string>());\n const keyCounter = useRef(0);\n\n return useCallback((record: TRecord, _index?: number) => {\n if (record._key) return record._key;\n\n const cacheKey = record as object;\n const existingKey = generatedKeys.current.get(cacheKey);\n if (existingKey) return existingKey;\n\n const nextKey = `${prefix}-${keyCounter.current++}`;\n generatedKeys.current.set(cacheKey, nextKey);\n return nextKey;\n }, [prefix]);\n}\n","import React, { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { ArrowDown, ArrowUp, ArrowUpDown, GripVertical } from 'lucide-react';\nimport { useTheme } from \"../../Theme\";\nimport { RecordArray, RecordProps } from \"../../providers/data/DataProvider\";\nimport { UIProps } from '../';\nimport Pagination, { PaginationParams } from './Pagination';\nimport { Order, type OrderConfig } from '../../libs/order';\nimport { RecordSelectionState, useRecordSelection } from './useRecordSelection';\nimport { useStableRecordKey } from './useStableRecordKey';\n\nexport type TableHeaderProp = {\n key: string,\n label: string,\n className?: string,\n sort?: boolean\n};\n\nexport type TableReorderMeta = {\n fromIndex: number;\n toIndex: number;\n record: RecordProps;\n};\n\ntype DropIndicatorPosition = 'before' | 'after';\n\nexport type TableSelectionState = RecordSelectionState<RecordProps>;\nexport type TableSelectionMode = 'single' | 'multiple';\nexport type TableSelectionChangeHandler = (selection: TableSelectionState) => void;\nexport type TableReorderHandler = (reorderedRecords: RecordArray, meta: TableReorderMeta) => void;\n\ninterface TableProps extends UIProps {\n header?: TableHeaderProp[],\n body?: RecordArray,\n Footer?: string | React.ReactNode,\n onClick?: (record: RecordProps) => void;\n onReorder?: TableReorderHandler;\n onSelectionChange?: TableSelectionChangeHandler;\n selectionMode?: TableSelectionMode;\n sortable?: boolean | OrderConfig;\n pagination?: PaginationParams;\n activeKey?: string | null;\n selectedKeys?: string[];\n selectedRowKeys?: string[];\n headerClass?: string,\n bodyClass?: string,\n footerClass?: string,\n heightClass?: string,\n scrollClass?: string,\n selectedClass?: string\n};\n\nfunction Table({\n header = undefined,\n body = undefined,\n Footer = undefined,\n onClick = undefined,\n onReorder = undefined,\n onSelectionChange = undefined,\n selectionMode = 'multiple',\n sortable = false,\n pagination = undefined,\n activeKey = undefined,\n selectedKeys = undefined,\n selectedRowKeys = undefined,\n pre = undefined,\n post = undefined,\n wrapClass = undefined,\n className = undefined,\n headerClass = undefined,\n bodyClass = undefined,\n footerClass = undefined,\n heightClass = undefined,\n scrollClass = undefined,\n selectedClass = undefined\n}: TableProps) {\n const theme = useTheme(\"table\");\n const activeClass = selectedClass || theme.Table.selectedClass;\n const [rows, setRows] = useState<RecordArray>(body || []);\n const sortableOrder = useMemo(() => {\n if (!sortable || typeof sortable === 'boolean') return undefined;\n return sortable;\n }, [typeof sortable === 'object' ? sortable?.dir : undefined, typeof sortable === 'object' ? sortable?.field : undefined]);\n const sortingEnabled = sortable !== false;\n const [currentOrder, setCurrentOrder] = useState<OrderConfig | undefined>(sortableOrder);\n const [paginationNavEl, setPaginationNavEl] = useState<HTMLElement | null>(null);\n const [draggedKey, setDraggedKey] = useState<string | null>(null);\n const [dragOverKey, setDragOverKey] = useState<string | null>(null);\n const [dropIndicator, setDropIndicator] = useState<{ key: string; position: DropIndicatorPosition } | null>(null);\n const [activeRowKey, setActiveRowKey] = useState<string | null>(null);\n const hasWarnedReorderSortConflict = useRef(false);\n const paginationNavRef = useCallback((node: HTMLDivElement | null) => {\n if (node) setPaginationNavEl(node);\n }, []);\n const singleSelectionGroupName = useId();\n\n const reorderable = !!onReorder;\n const hasSortConfiguration = sortingEnabled || !!Order.normalize(sortableOrder);\n const sortDisabledByReorder = reorderable && hasSortConfiguration;\n const effectiveSortable = sortDisabledByReorder ? false : sortingEnabled;\n const effectiveOrder = sortDisabledByReorder ? undefined : sortableOrder;\n\n useEffect(() => {\n setRows(body || []);\n }, [body]);\n\n useEffect(() => {\n setCurrentOrder(effectiveOrder);\n }, [effectiveOrder?.field, effectiveOrder?.dir]);\n\n useEffect(() => {\n if (!sortDisabledByReorder || hasWarnedReorderSortConflict.current) return;\n\n console.warn(\n 'Table: `onReorder` cannot be combined with sortable sorting on the same view. Manual reorder takes precedence and sorting is ignored.'\n );\n hasWarnedReorderSortConflict.current = true;\n }, [sortDisabledByReorder]);\n\n const getStableRecordKey = useStableRecordKey<RecordProps>('row');\n const getRecordKey = useCallback((record: RecordProps, index?: number) => getStableRecordKey(record, index), [getStableRecordKey]);\n const {\n activeSelectedKeys,\n selectionState,\n showSelection,\n updateSelection,\n } = useRecordSelection<RecordProps>({\n records: rows,\n selectedKeys,\n legacySelectedKeys: selectedRowKeys,\n onSelectionChange,\n getRecordKey,\n });\n\n useEffect(() => {\n if (!activeRowKey) return;\n\n const rowStillExists = rows.some((record, index) => getRecordKey(record, index) === activeRowKey);\n if (!rowStillExists) {\n setActiveRowKey(null);\n }\n }, [activeRowKey, getRecordKey, rows]);\n\n useEffect(() => {\n if (currentOrder || !header?.length || reorderable) return;\n const firstSortable = header.find((column) => effectiveSortable && column.sort !== false);\n if (firstSortable) {\n setCurrentOrder({ field: firstSortable.key, dir: 'asc' });\n }\n }, [currentOrder, effectiveSortable, header, reorderable]);\n\n const sortedBody = useMemo<RecordArray>(() => Order.records(rows, currentOrder) || [], [rows, currentOrder]);\n\n const handleClick = (e: React.MouseEvent<HTMLElement>, record: RecordProps, absoluteIndex?: number) => {\n let currentElement = e.target as HTMLElement;\n\n while (currentElement && currentElement.tagName !== 'TR') {\n if (['A', 'BUTTON', 'INPUT', 'LABEL'].includes(currentElement.tagName)) {\n return;\n }\n currentElement = currentElement.parentNode as HTMLElement;\n }\n\n const rowKey = getRecordKey(record, absoluteIndex);\n\n if (activeClass) {\n if (activeKey === undefined) {\n setActiveRowKey((current) => current === rowKey ? null : rowKey);\n }\n }\n\n onClick?.(record);\n };\n\n const getFieldComponent = (item: RecordProps, key: string): React.ReactNode => {\n const v = (item[key]?.prompt && item[key]?.value) || item[key];\n if (React.isValidElement(v) || v == null || typeof v !== 'object') return v;\n return Array.isArray(v) && !v.some((entry) => typeof entry === 'object' && entry)\n ? v.join(\", \")\n : \"\";\n };\n\n const toggleRowSelection = useCallback((record: RecordProps, absoluteIndex: number) => {\n const rowKey = getRecordKey(record, absoluteIndex);\n const nextKeys = activeSelectedKeys.includes(rowKey)\n ? activeSelectedKeys.filter((key) => key !== rowKey)\n : [...activeSelectedKeys, rowKey];\n updateSelection(nextKeys);\n }, [activeSelectedKeys, getRecordKey, updateSelection]);\n\n const toggleSingleRowSelection = useCallback((record: RecordProps, absoluteIndex: number) => {\n const rowKey = getRecordKey(record, absoluteIndex);\n updateSelection(activeSelectedKeys.includes(rowKey) ? [] : [rowKey]);\n }, [activeSelectedKeys, getRecordKey, updateSelection]);\n\n const handleDrop = useCallback((targetRecord: RecordProps, targetIndex: number) => {\n if (!draggedKey) return;\n\n const sourceIndex = sortedBody.findIndex((record, index) => getRecordKey(record, index) === draggedKey);\n const destinationIndex = sortedBody.findIndex((record, index) => getRecordKey(record, index) === getRecordKey(targetRecord, targetIndex));\n\n setDragOverKey(null);\n setDraggedKey(null);\n const indicatorPosition = dropIndicator?.position || 'after';\n setDropIndicator(null);\n\n if (sourceIndex < 0 || destinationIndex < 0 || sourceIndex === destinationIndex) return;\n\n const nextRows = [...sortedBody];\n const [movedRecord] = nextRows.splice(sourceIndex, 1);\n const adjustedDestinationIndex =\n sourceIndex < destinationIndex\n ? destinationIndex + (indicatorPosition === 'after' ? 0 : -1)\n : destinationIndex + (indicatorPosition === 'after' ? 1 : 0);\n\n nextRows.splice(adjustedDestinationIndex, 0, movedRecord);\n\n setCurrentOrder(undefined);\n setRows(nextRows);\n onReorder?.(nextRows, {\n fromIndex: sourceIndex,\n toIndex: adjustedDestinationIndex,\n record: movedRecord,\n });\n }, [draggedKey, dropIndicator?.position, getRecordKey, onReorder, sortedBody]);\n\n if (sortedBody.length === 0) {\n return <p className={\"p-4\"}>Nessun dato trovato</p>;\n }\n\n const headers: TableHeaderProp[] = header || Object.keys(sortedBody[0]).map((key) => ({ key, label: key, sort: sortingEnabled }));\n const viewportClass = [\n \"fixed-table-container\",\n theme.Table.scrollClass,\n heightClass ? `${heightClass} overflow-auto` : \"\",\n scrollClass || \"\",\n ].filter(Boolean).join(\" \");\n const totalColumns = headers.length + (showSelection ? 1 : 0) + (reorderable ? 1 : 0);\n\n const renderDropIndicator = (\n key: string,\n position: DropIndicatorPosition,\n record: RecordProps,\n absoluteIndex: number\n ) => {\n if (!dropIndicator || dropIndicator.key !== key || dropIndicator.position !== position) {\n return null;\n }\n\n return (\n <tr\n aria-hidden=\"true\"\n onDragOver={(event) => {\n if (!reorderable) return;\n event.preventDefault();\n if (dragOverKey !== key) {\n setDragOverKey(key);\n }\n setDropIndicator({ key, position });\n }}\n onDrop={(event) => {\n if (!reorderable) return;\n event.preventDefault();\n setDropIndicator({ key, position });\n handleDrop(record, absoluteIndex);\n }}\n >\n <td colSpan={totalColumns} className=\"border-0 p-0\">\n <div className=\"relative h-5 cursor-grab\">\n <div className=\"absolute inset-x-2 top-1/2 -translate-y-1/2\">\n <div className=\"h-0 rounded-full border-t-2 border-primary/80\" />\n <div className=\"absolute left-0 top-1/2 h-2 w-2 -translate-y-1/2 rounded-full bg-primary shadow-sm\" />\n </div>\n </div>\n </td>\n </tr>\n );\n };\n\n return (\n <div ref={paginationNavRef} className={\"table-responsive \" + (wrapClass || theme.Table.wrapClass)}>\n <div className={viewportClass}>\n {pre && <div className=\"mb-3\">{pre}</div>}\n <table className={\"table \" + (className || theme.Table.className)}>\n <thead className={headerClass || theme.Table.headerClass}>\n <tr>\n {showSelection && (\n <th style={{ width: '1%', whiteSpace: 'nowrap' }}>\n {selectionMode !== 'single' ? (\n <div className=\"th-inner py-1\">\n <input\n type=\"checkbox\"\n aria-label=\"Select all rows\"\n checked={selectionState.records.length > 0 && selectionState.records.length === rows.length}\n onChange={(event) => {\n const nextKeys = event.target.checked\n ? sortedBody.map((record, index) => getRecordKey(record, index))\n : [];\n updateSelection(nextKeys);\n }}\n />\n </div>\n ) : (\n <div className=\"th-inner py-1\" />\n )}\n </th>\n )}\n {reorderable && (\n <th style={{ width: '1%', whiteSpace: 'nowrap' }}>\n <div className=\"th-inner py-1\" />\n </th>\n )}\n {headers.map((hdr) => (\n hdr.label ? (\n (() => {\n const isSortable = effectiveSortable && hdr.sort !== false;\n const isActiveSort = isSortable && currentOrder?.field === hdr.key;\n const ariaSort = !isActiveSort\n ? \"none\"\n : currentOrder?.dir === 'desc'\n ? \"descending\"\n : \"ascending\";\n\n return (\n <th\n key={hdr.key}\n className={hdr.className}\n aria-sort={ariaSort}\n >\n {isSortable ? (\n <button\n type=\"button\"\n className={\n \"th-inner group inline-flex w-full cursor-pointer items-center gap-2 rounded-sm border-0 bg-transparent px-0 py-1 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40 \" +\n (isActiveSort\n ? \"font-semibold text-foreground\"\n : \"text-muted-foreground hover:text-foreground\")\n }\n onClick={() => setCurrentOrder((prev) => Order.toggle(prev, hdr.key))}\n aria-label={\n isActiveSort\n ? `Sort by ${hdr.label}, currently ${currentOrder?.dir === 'desc' ? 'descending' : 'ascending'}`\n : `Sort by ${hdr.label}`\n }\n title={\n isActiveSort\n ? `${hdr.label}: ${currentOrder?.dir === 'desc' ? 'descending' : 'ascending'}`\n : `Sort by ${hdr.label}`\n }\n >\n <span\n className={\n \"inline-flex h-4 w-4 flex-none items-center justify-center transition-colors \" +\n (isActiveSort\n ? \"text-primary\"\n : \"text-muted-foreground/70 group-hover:text-foreground/80\")\n }\n aria-hidden=\"true\"\n >\n {isActiveSort ? (\n currentOrder?.dir === 'desc' ? <ArrowDown size={14} /> : <ArrowUp size={14} />\n ) : (\n <ArrowUpDown size={14} />\n )}\n </span>\n <span>{hdr.label}</span>\n </button>\n ) : (\n <div className=\"th-inner py-1\">{hdr.label}</div>\n )}\n </th>\n );\n })()\n ) : (\n <th key={hdr.key} style={{ width: '1%', whiteSpace: 'nowrap' }}></th>\n )\n ))}\n </tr>\n </thead>\n <tbody className={bodyClass || theme.Table.bodyClass}>\n <Pagination\n recordSet={sortedBody}\n appendTo={paginationNavEl}\n wrapClass=\"px-3 pt-4 pb-2\"\n {...(pagination || {})}\n >\n {(pageRecords, pageOffset) =>\n pageRecords.map((record, index) => {\n const absoluteIndex = pageOffset + index;\n const rowKey = getRecordKey(record, absoluteIndex);\n const isSelected = activeSelectedKeys.includes(rowKey);\n const isDraggedOver = dragOverKey === rowKey;\n const isDragged = draggedKey === rowKey;\n const resolvedActiveKey = activeKey === undefined ? activeRowKey : activeKey;\n const isActiveRow = activeClass && resolvedActiveKey === rowKey;\n\n return (\n <React.Fragment key={rowKey}>\n {renderDropIndicator(rowKey, 'before', record, absoluteIndex)}\n <tr\n draggable={reorderable}\n className={[\n isDraggedOver ? \"bg-muted/30\" : \"\",\n isActiveRow ? activeClass : \"\",\n ].filter(Boolean).join(\" \") || undefined}\n style={{\n cursor: onClick ? \"pointer\" : reorderable ? \"grab\" : \"default\",\n opacity: isDragged ? 0.45 : 1,\n }}\n onClick={(e) => {\n if (onClick) {\n handleClick(e, record, absoluteIndex);\n }\n }}\n onDragStart={() => {\n setDraggedKey(rowKey);\n }}\n onDragOver={(event) => {\n if (!reorderable) return;\n event.preventDefault();\n const rect = event.currentTarget.getBoundingClientRect();\n const nextPosition: DropIndicatorPosition =\n event.clientY < rect.top + rect.height / 2 ? 'before' : 'after';\n\n if (dragOverKey !== rowKey) {\n setDragOverKey(rowKey);\n }\n\n if (draggedKey !== rowKey) {\n setDropIndicator((current) =>\n current?.key === rowKey && current.position === nextPosition\n ? current\n : { key: rowKey, position: nextPosition }\n );\n }\n }}\n onDragLeave={() => {\n if (dragOverKey === rowKey) {\n setDragOverKey(null);\n }\n }}\n onDragEnd={() => {\n setDraggedKey(null);\n setDragOverKey(null);\n setDropIndicator(null);\n }}\n onDrop={(event) => {\n if (!reorderable) return;\n event.preventDefault();\n handleDrop(record, absoluteIndex);\n }}\n >\n {showSelection && (\n <td style={{ width: '1%', whiteSpace: 'nowrap' }}>\n <input\n type={selectionMode === 'single' ? 'radio' : 'checkbox'}\n name={selectionMode === 'single' ? singleSelectionGroupName : undefined}\n aria-label={`Select row ${rowKey}`}\n checked={isSelected}\n onChange={() => {\n if (selectionMode === 'single') {\n toggleSingleRowSelection(record, absoluteIndex);\n return;\n }\n toggleRowSelection(record, absoluteIndex);\n }}\n onClick={(event) => {\n event.stopPropagation();\n if (selectionMode === 'single') {\n event.preventDefault();\n toggleSingleRowSelection(record, absoluteIndex);\n }\n }}\n />\n </td>\n )}\n {reorderable && (\n <td style={{ width: '1%', whiteSpace: 'nowrap' }}>\n <button\n type=\"button\"\n draggable={reorderable}\n className=\"inline-flex cursor-grab items-center justify-center rounded-sm border-0 bg-transparent p-0 text-muted-foreground\"\n aria-label={`Reorder row ${rowKey}`}\n onClick={(event) => event.preventDefault()}\n onDragStart={(event) => {\n event.stopPropagation();\n setDraggedKey(rowKey);\n }}\n onDragEnd={(event) => {\n event.stopPropagation();\n setDraggedKey(null);\n setDragOverKey(null);\n setDropIndicator(null);\n }}\n >\n <GripVertical size={14} />\n </button>\n </td>\n )}\n {headers.map((hdr) => (\n <td key={hdr.key}>{getFieldComponent(record, hdr.key)}</td>\n ))}\n </tr>\n {renderDropIndicator(rowKey, 'after', record, absoluteIndex)}\n </React.Fragment>\n );\n })\n }\n </Pagination>\n </tbody>\n {Footer && <tfoot className={footerClass || theme.Table.footerClass}>{Footer}</tfoot>}\n </table>\n {post && <div className=\"mt-3\">{post}</div>}\n </div>\n </div>\n );\n}\n\nexport default Table;\n","import React, { forwardRef, useEffect, useImperativeHandle, useRef, useState } from \"react\";\r\nimport Card from \"../Card\";\r\nimport { String, Switch } from \"./Input\";\r\nimport { FileProps, getFileUrl } from \"./Upload\";\r\nimport { FieldOnChange } from \"../../widgets/Form\";\r\n\r\n\r\nconst scales: Record<string, number> = {\r\n \"1:1\": 1 / 1,\r\n \"3:4\": 3 / 4,\r\n \"4:3\": 4 / 3,\r\n};\r\n\r\ninterface CropProps {\r\n fileName: string;\r\n type: string;\r\n scale: string;\r\n top: number;\r\n left: number;\r\n width: number;\r\n height: number;\r\n base64?: string;\r\n}\r\n\r\ninterface ImageProps extends FileProps {\r\n variants: Record<string, CropProps>;\r\n}\r\n\r\n\r\ntype ImageBounds = { width: number; height: number; offsetX: number; offsetY: number };\r\n\r\nexport const CropImage = forwardRef(({img, title} : { img: ImageProps, title?: string }, ref) => {\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const imgRefs = useRef<Record<string, HTMLImageElement | null>>({});\r\n const [imageBoundsMap, setImageBoundsMap] = useState<Record<string, ImageBounds>>({});\r\n\r\n useImperativeHandle(ref, () => ({\r\n handleSave : () => {\r\n const canvas = canvasRef.current;\r\n const ctx = canvas?.getContext(\"2d\");\r\n if (!canvas || !ctx) return;\r\n \r\n const variants: Record<string, CropProps> = {};\r\n for (const scale of selectedScales) {\r\n const currentImage = imgRefs.current[scale];\r\n const bounds = imageBoundsMap[scale];\r\n const data = cropData[scale];\r\n if (!currentImage || !bounds || !data) return;\r\n\r\n const delta = currentImage.naturalWidth / bounds.width;\r\n const { top, left, width, height } = data;\r\n canvas.width = width;\r\n canvas.height = height;\r\n\r\n ctx.clearRect(0, 0, width, height);\r\n ctx.drawImage(\r\n currentImage,\r\n (left - bounds.offsetX) * delta,\r\n (top - bounds.offsetY) * delta,\r\n width * delta,\r\n height * delta,\r\n 0, 0, width, height);\r\n\r\n variants[scale] = {\r\n fileName: cropData[scale].fileName,\r\n type: cropData[scale].type,\r\n scale,\r\n top,\r\n left,\r\n width,\r\n height,\r\n base64: canvas.toDataURL(cropData[scale].type),\r\n }\r\n }\r\n\r\n return { fileName: originalFileName, variants };\r\n }\r\n }));\r\n\r\n const [selectedScales, setSelectedScales] = useState<string[]>(() => Object.keys(img.variants ?? scales).filter(k => k !== \"original\"));\r\n\r\n const [originalFileName, setOriginalFileName] = useState<string>(img.fileName)\r\n\r\n const [cropData, setCropData] = useState<Record<string, CropProps>>(img.variants ?? {});\r\n\r\n const [dragging, setDragging] = useState<{ [scale: string]: boolean }>({});\r\n const [resizing, setResizing] = useState<{ [scale: string]: boolean }>({});\r\n const [dragOffset, setDragOffset] = useState<{ [scale: string]: { x: number, y: number } }>({});\r\n const [resizeStart, setResizeStart] = useState<{ [scale: string]: { mouseX: number, mouseY: number, width: number, height: number } }>({});\r\n\r\n const handleLoad = (e: React.SyntheticEvent<HTMLImageElement>, scale: string) => {\r\n const currentImage = e.currentTarget;\r\n\r\n setImageBoundsMap(prev => ({\r\n ...prev,\r\n [scale]: { width: currentImage.width, height: currentImage.height, offsetX: 0, offsetY: 0 }\r\n }));\r\n\r\n setCropData(prev => {\r\n if (prev[scale]) return prev; \r\n\r\n const ratio = scales[scale];\r\n const maxWidth = Math.min(currentImage.width, currentImage.height * ratio);\r\n const maxHeight = Math.min(currentImage.height, currentImage.width / ratio);\r\n\r\n return {\r\n ...prev,\r\n [scale]: {\r\n fileName: img.fileName,\r\n type: img.type,\r\n scale,\r\n top: (currentImage.height - maxHeight) / 2,\r\n left: (currentImage.width - maxWidth) / 2,\r\n width: maxWidth,\r\n height: maxHeight,\r\n base64: ''\r\n }\r\n };\r\n });\r\n };\r\n\r\n const calculateCropByScale = (\r\n scale: string,\r\n image: HTMLImageElement,\r\n cropDataState: Record<string, CropProps>\r\n ): CropProps | null => {\r\n const { width, height } = image.getBoundingClientRect();\r\n const ratio = scales[scale];\r\n const crop = cropDataState[scale];\r\n if (!crop) return null;\r\n\r\n const maxWidth = Math.min(width, height * ratio);\r\n\r\n let newWidth = Math.min(crop.width, maxWidth);\r\n let newHeight = newWidth / ratio;\r\n\r\n let newLeft = Math.min(Math.max(crop.left, 0), width - newWidth);\r\n let newTop = Math.min(Math.max(crop.top, 0), height - newHeight);\r\n\r\n return {\r\n ...crop,\r\n width: newWidth,\r\n height: newHeight,\r\n left: newLeft,\r\n top: newTop,\r\n };\r\n };\r\n\r\n useEffect(() => {\r\n const handleResize = () => {\r\n setCropData(prevCropData => {\r\n const newCropData = { ...prevCropData };\r\n Object.keys(imageBoundsMap).forEach(scale => {\r\n const currentImage = imgRefs.current[scale];\r\n if (!currentImage) return;\r\n\r\n const updatedCrop = calculateCropByScale(scale, currentImage, newCropData);\r\n if (updatedCrop) {\r\n newCropData[scale] = updatedCrop;\r\n }\r\n });\r\n return newCropData;\r\n });\r\n\r\n Object.keys(imageBoundsMap).forEach(scale => {\r\n const currentImage = imgRefs.current[scale];\r\n if (!currentImage) return;\r\n\r\n const { width, height } = currentImage.getBoundingClientRect();\r\n setImageBoundsMap(prev => ({\r\n ...prev,\r\n [scale]: { width, height, offsetX: 0, offsetY: 0 }\r\n }));\r\n });\r\n };\r\n\r\n window.addEventListener('resize', handleResize);\r\n return () => window.removeEventListener('resize', handleResize);\r\n }, [imageBoundsMap]);\r\n\r\n const handleMouseDown = (e: React.MouseEvent, scale: string, type: \"move\" | \"resize\") => {\r\n e.stopPropagation();\r\n const { left, top, width, height } = cropData[scale]\r\n\r\n if (type === \"move\") {\r\n setDragging(prev => ({ ...prev, [scale]: true }));\r\n setDragOffset(prev => ({\r\n ...prev,\r\n [scale]: {\r\n x: e.clientX - left,\r\n y: e.clientY - top\r\n }\r\n }));\r\n } else {\r\n setResizing(prev => ({ ...prev, [scale]: true }));\r\n setResizeStart(prev => ({\r\n ...prev,\r\n [scale]: {\r\n mouseX: e.clientX,\r\n mouseY: e.clientY,\r\n width: width,\r\n height: height\r\n }\r\n }));\r\n }\r\n };\r\n\r\n const handleMouseMove = (e: React.MouseEvent) => {\r\n selectedScales.forEach(scale => {\r\n const bounds = imageBoundsMap[scale];\r\n const crop = cropData[scale];\r\n const offset = dragOffset[scale];\r\n const start = resizeStart[scale];\r\n const ratio = scales[scale];\r\n if (!bounds || !crop) return;\r\n\r\n if (dragging[scale] && offset) {\r\n const newLeft = Math.max(bounds.offsetX, Math.min(e.clientX - offset.x, bounds.offsetX + bounds.width - crop.width));\r\n const newTop = Math.max(bounds.offsetY, Math.min(e.clientY - offset.y, bounds.offsetY + bounds.height - crop.height));\r\n setCropData(prev => ({\r\n ...prev,\r\n [scale]: { ...prev[scale], left: newLeft, top: newTop }\r\n }));\r\n }\r\n\r\n if (resizing[scale] && start) {\r\n let newWidth = start.width + (e.clientX - start.mouseX);\r\n let newHeight = newWidth / ratio;\r\n\r\n const maxWidth = bounds.width - (crop.left - bounds.offsetX);\r\n const maxHeight = bounds.height - (crop.top - bounds.offsetY);\r\n\r\n if (newWidth > maxWidth) {\r\n newWidth = maxWidth;\r\n newHeight = newWidth / ratio;\r\n }\r\n if (newHeight > maxHeight) {\r\n newHeight = maxHeight;\r\n newWidth = newHeight * ratio;\r\n }\r\n\r\n const minSize = 50;\r\n if (newWidth >= minSize && newHeight >= minSize) {\r\n setCropData(prev => ({\r\n ...prev,\r\n [scale]: { ...prev[scale], width: newWidth, height: newHeight }\r\n }));\r\n }\r\n }\r\n });\r\n };\r\n\r\n const handleMouseUp = () => {\r\n setDragging({});\r\n setResizing({});\r\n };\r\n\r\n return (\r\n <div onMouseMove={handleMouseMove} onMouseUp={handleMouseUp} onMouseLeave={handleMouseUp}>\r\n {title && <h3>{title}</h3>}\r\n <div className=\"mb-2\">\r\n <h6>Original Image</h6>\r\n <ImageEditorItem\r\n img={{\r\n src: getFileUrl(img),\r\n alt: 'Original Image'\r\n }}\r\n file={{\r\n value: originalFileName,\r\n onChange: setOriginalFileName,\r\n label: 'Original File Name'\r\n }}\r\n />\r\n </div>\r\n <div className=\"mb-2\">\r\n {Object.keys(scales).map((scale) => (\r\n <Card key={scale}>\r\n <Switch\r\n name={scale}\r\n label={scale}\r\n value={selectedScales.includes(scale)}\r\n onChange={({event}) => {\r\n setSelectedScales(prev =>\r\n event.target.checked\r\n ? [...prev, scale]\r\n : prev.filter(a => a !== scale)\r\n );\r\n }}\r\n />\r\n {selectedScales.includes(scale) && (\r\n <ImageEditorItem\r\n img={{\r\n src: getFileUrl(img),\r\n alt: `Crop ${scale}`,\r\n ref: el => imgRefs.current[scale] = el,\r\n onLoad: (e) => handleLoad(e, scale),\r\n post: <CropBox cropData={cropData} scale={scale} handleMouseDown={handleMouseDown} />\r\n }}\r\n file={{\r\n value: cropData[scale]?.fileName ?? img.fileName,\r\n scale: scale,\r\n onChange: fileName => setCropData(prev => ({ ...prev, [scale]: { ...prev[scale], fileName } })),\r\n label: `Nome file per ${scale}`\r\n }}\r\n />\r\n )}\r\n </Card>\r\n ))}\r\n </div>\r\n <canvas ref={canvasRef} style={{ display: \"none\" }} />\r\n </div>\r\n );\r\n});\r\n\r\n\r\nconst CropBox = ({\r\n cropData,\r\n scale,\r\n handleMouseDown\r\n}: {\r\n cropData: Record<string, CropProps>;\r\n scale: string;\r\n handleMouseDown: (e: React.MouseEvent, scale: string, type: 'move' | 'resize') => void;\r\n}) => {\r\n return (\r\n <>\r\n {cropData[scale] && (\r\n <div\r\n onMouseDown={(e) => handleMouseDown(e, scale, \"move\")}\r\n className=\"absolute\"\r\n style={{\r\n top: cropData[scale].top,\r\n left: cropData[scale].left,\r\n width: cropData[scale].width,\r\n height: cropData[scale].height,\r\n border: \"2px dashed rgba(0, 0, 0, 0.8)\",\r\n backgroundColor: \"rgba(0, 0, 0, 0.2)\",\r\n cursor: \"move\",\r\n }}\r\n >\r\n <div\r\n onMouseDown={(e) => handleMouseDown(e, scale, \"resize\")}\r\n className=\"absolute bottom-0 right-0\"\r\n style={{\r\n width: 15,\r\n height: 15,\r\n backgroundColor: \"rgba(0,0,0,0.8)\",\r\n cursor: \"nwse-resize\",\r\n }}\r\n />\r\n </div>\r\n )}\r\n </>\r\n )\r\n}\r\n\r\n\r\ninterface ImageEditorItemProps {\r\n img: {\r\n src: string;\r\n alt: string;\r\n ref?: React.LegacyRef<HTMLImageElement>;\r\n onLoad?: (e: React.SyntheticEvent<HTMLImageElement, Event>) => void;\r\n post?: React.ReactNode;\r\n };\r\n file: {\r\n value: string;\r\n scale?: string;\r\n onChange: (newName: string) => void;\r\n label?: string;\r\n };\r\n}\r\n\r\nconst ImageEditorItem = ({\r\n img,\r\n file\r\n}: ImageEditorItemProps) => {\r\n return (<>\r\n <div className=\"relative\">\r\n <img\r\n src={img.src}\r\n alt={img.alt}\r\n ref={img.ref}\r\n onLoad={img.onLoad}\r\n className=\"relative img-fluid\"\r\n draggable={false}\r\n />\r\n {img.post}\r\n </div>\r\n <FileNameEditor {...file} />\r\n </>)\r\n}\r\n\r\n\r\ninterface FileNameEditorProps {\r\n value: string;\r\n onChange: (newName: string) => void;\r\n scale?: string;\r\n label?: string;\r\n}\r\n\r\nexport const FileNameEditor = ({\r\n value,\r\n onChange,\r\n label = undefined,\r\n scale = undefined,\r\n}: FileNameEditorProps) => {\r\n\r\n const ext = value?.split('.').pop() ?? \"\";\r\n\r\n const scaleSuffix = scale && `_${scale.replace(\":\", \"x\")}`;\r\n\r\n const stripFileName = (fullName: string): string => {\r\n const base = fullName.replace(/\\.[^/.]+$/, \"\");\r\n if (!scaleSuffix) return base;\r\n return base.endsWith(scaleSuffix)\r\n ? base.slice(0, -scaleSuffix.length)\r\n : base;\r\n };\r\n\r\n const inputValue = stripFileName(value || \"\");\r\n\r\n const handleChange: FieldOnChange = ({value}) => {\r\n const baseName = value.trim();\r\n onChange(`${baseName}${scaleSuffix ?? ''}.${ext}`);\r\n };\r\n\r\n return (\r\n <String\r\n name=\"fileName\"\r\n label={label}\r\n value={inputValue}\r\n onChange={handleChange}\r\n post={scale}\r\n />\r\n );\r\n};","import React, { useRef, useState } from \"react\";\r\nimport Modal from \"../Modal\";\r\nimport { ActionButton } from \"../Buttons\";\r\nimport Badge from \"../Badge\";\r\nimport Table from \"../Table\";\r\nimport Percentage from \"../Percentage\";\r\nimport { CropImage, FileNameEditor } from \"./Crop\";\r\nimport { Label } from \"./Input\";\r\nimport { Wrapper } from \"../GridSystem\";\r\nimport { base64ToUrl, render2Base64 } from \"../../../libs/utils\";\r\nimport { PLACEHOLDER_IMAGE } from \"../../../Theme\";\r\nimport Icon from \"../Icon\";\r\nimport { FormFieldProps, FieldOnChange, useFormContext } from \"../../widgets/Form\";\r\n\r\nexport interface FileProps {\r\n key: string;\r\n fileName: string;\r\n size: number;\r\n type: string;\r\n progress: number;\r\n url: string;\r\n base64?: string;\r\n variants: Record<string, any>;\r\n} \r\n\r\nconst useFileUpload = <T extends FileProps>(\r\n name: string,\r\n //value?: Array<T>,\r\n onChange?: FieldOnChange,\r\n wrapClass?: string\r\n) => {\r\n const { value, handleChange, formWrapClass } = useFormContext({name, onChange, wrapClass});\r\n const [files, setFiles] = useState<T[]>(value || []);\r\n const [currentFile, setCurrentFile] = useState<T | null>(null);\r\n const fileInputRef = useRef<HTMLInputElement | null>(null);\r\n \r\n const updateFile = (key: string, updates: Partial<T>) => {\r\n setFiles(prev => {\r\n const updatedFiles = prev.map(f =>\r\n f.key === key ? { ...f, ...updates } : f\r\n );\r\n handleChange({ target: { name, value: updatedFiles } });\r\n return updatedFiles;\r\n });\r\n };\r\n\r\n const removeFile = (key: string) => {\r\n setFiles(prev => {\r\n const updatedFiles = prev.filter(f => f.key !== key);\r\n handleChange({ target: { name, value: updatedFiles } });\r\n return updatedFiles;\r\n });\r\n };\r\n\r\n const handleSave = (updates: Partial<T>) => {\r\n if (!currentFile) return;\r\n \r\n updateFile(currentFile.key, updates);\r\n setCurrentFile(null);\r\n };\r\n\r\n const handleEdit = (file: T) => setCurrentFile(file);\n const handleClose = () => setCurrentFile(null);\r\n\r\n const handleUploadChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n const selectedFiles = Array.from(event.target.files || []);\r\n\r\n setFiles(prev => {\r\n const updatedFiles = [...prev];\r\n \r\n selectedFiles.forEach(file => {\r\n const newFile = {\r\n key: file.name,\r\n fileName: file.name,\r\n size: file.size,\r\n type: file.type,\r\n progress: 0,\r\n base64: '',\r\n variants: {}\r\n } as T;\r\n \r\n const existingIndex = updatedFiles.findIndex(f => f.key === file.name);\r\n if (existingIndex !== -1) {\r\n updatedFiles[existingIndex] = newFile;\r\n } else {\r\n updatedFiles.push(newFile);\r\n }\r\n\r\n const reader = new FileReader();\r\n reader.onprogress = e => {\r\n if (e.lengthComputable) {\r\n const percent = Math.round((e.loaded / e.total) * 100);\r\n updateFile(newFile.key, { progress: percent } as Partial<T>);\r\n }\r\n };\r\n\r\n reader.onloadend = () => {\r\n updateFile(newFile.key, { progress: 99 } as Partial<T>);\r\n setTimeout(() => {\r\n updateFile(newFile.key, {\r\n progress: 100,\r\n base64: `data:${file.type};base64,${render2Base64(reader.result as ArrayBuffer)}`\r\n } as Partial<T>);\r\n }, 500);\r\n };\r\n\r\n reader.readAsArrayBuffer(file);\r\n });\r\n \r\n return updatedFiles;\r\n });\r\n \r\n if (fileInputRef.current) fileInputRef.current.value = \"\";\r\n };\r\n\r\n return {\r\n files,\r\n currentFile,\r\n fileInputRef,\r\n formWrapClass,\r\n handleUploadChange,\r\n handleUpload: () => fileInputRef.current?.click(),\r\n handleRemove: (key: string) => {\r\n removeFile(key);\r\n },\r\n handleSave,\r\n handleEdit,\r\n handleClose\r\n };\r\n};\r\n\r\nexport interface UploadDocumentProps extends FormFieldProps {\r\n editable?: boolean;\r\n multiple?: boolean;\r\n accept?: string;\r\n max?: number;\r\n}\r\n\r\nexport interface UploadImageProps extends UploadDocumentProps {\r\n previewHeight?: number;\r\n previewWidth?: number;\r\n}\r\n\r\ninterface FileInputProps {\r\n name: string;\r\n fileInputRef: React.RefObject<HTMLInputElement>;\r\n accept: string;\r\n onUpload: () => void;\r\n onChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;\r\n label?: string;\r\n icon?: string;\r\n required?: boolean;\r\n multiple?: boolean;\r\n height?: number;\r\n width?: number;\r\n iconClass?: string;\r\n}\r\n\r\ninterface FileEditorProps {\r\n title: string;\r\n file: FileProps;\r\n type: 'img' | 'document';\r\n onSave?: (result: { fileName: string; variants: Record<string, any> }) => void;\r\n onClose?: () => void;\r\n} \r\n\r\nconst FileInput = ({\r\n name,\r\n fileInputRef,\r\n accept = \"*/*\",\r\n onUpload,\r\n onChange = undefined,\r\n label = undefined,\r\n icon = undefined,\r\n required = false,\r\n multiple = false,\r\n height = undefined,\r\n width = undefined,\r\n iconClass = undefined\r\n}: FileInputProps) => {\r\n return (\r\n <>\r\n <ActionButton\r\n icon={icon}\r\n label={label}\r\n onClick={onUpload}\r\n iconClass={iconClass}\r\n style={{height: height, width: width}}\r\n />\r\n\r\n <input\r\n name={name}\r\n type=\"file\"\r\n accept={accept}\r\n ref={fileInputRef}\r\n multiple={multiple}\r\n required={required}\r\n className=\"hidden\"\r\n onChange={onChange}\r\n />\r\n </>\r\n );\r\n};\r\n\r\nconst FileEditor = ({\r\n title,\r\n file,\r\n type,\r\n onSave = undefined,\r\n onClose = undefined\r\n}: FileEditorProps) => {\r\n const [fileName, setFileName] = useState(file.fileName);\r\n\r\n const cropRef = useRef<{\r\n handleSave: () => {\r\n fileName: string;\r\n variants: Record<string, any>;\r\n };\r\n }>(null);\r\n\r\n const handleSave = async (): Promise<boolean> => {\r\n if (cropRef.current) {\r\n onSave?.(cropRef.current.handleSave());\r\n } else {\r\n onSave?.({ fileName, variants: {} });\r\n }\r\n return true;\r\n };\r\n\r\n return (\r\n <Modal\r\n title={title}\r\n onSave={handleSave}\r\n onClose={onClose}\r\n size={type === 'img' ? \"fullscreen\" : undefined}\r\n >\r\n {type === 'document' &&\r\n <FileNameEditor\r\n value={fileName}\r\n onChange={setFileName}\r\n label={\"File name\"}\r\n />}\r\n\r\n {type === 'img' &&\r\n <CropImage\r\n ref={cropRef}\r\n img={file}\r\n />\r\n }\r\n </Modal>\r\n )\r\n}\r\nconst isUploadable = (files: FileProps[], max: number, multiple: boolean) => {\r\n return files.length < max && (multiple || files.length === 0);\r\n}\r\n\r\nconst urlCache = new Map<string, string>();\r\nexport const getFileUrl = (file: FileProps, suffix: string = \"origin\"): string => {\r\n if (file.base64) {\r\n const fileKey = `${file.fileName} ${suffix}`;\r\n if (!urlCache.has(fileKey)) {\r\n urlCache.set(fileKey, base64ToUrl(file.base64, file.type) ?? PLACEHOLDER_IMAGE);\r\n }\r\n return urlCache.get(fileKey) ?? PLACEHOLDER_IMAGE; \r\n }\r\n return file.url;\r\n};\r\n\r\nexport const UploadDocument = ({\r\n name,\r\n //value = undefined,\r\n onChange = undefined,\r\n label = undefined,\r\n required = false,\r\n editable = false,\r\n multiple = false,\r\n max = 100,\r\n accept = \".pdf,.doc,.docx,.txt,.iso\",\r\n pre = undefined,\r\n post = undefined,\r\n wrapClass = undefined,\r\n className = undefined,\r\n}: UploadDocumentProps) => {\r\n const { files, currentFile, fileInputRef, formWrapClass, handleUploadChange, handleUpload, handleRemove, handleSave, handleEdit, handleClose } = useFileUpload<FileProps>(name, onChange, wrapClass);\r\n\r\n return (\r\n <Wrapper className={formWrapClass}>\r\n {pre}\r\n <div className={className}>\r\n <div className={`flex items-center ${label ? 'justify-between' : 'justify-end'}`} >\r\n {label && <Label label={label} required={required} />}\r\n {isUploadable(files, max, multiple) && <FileInput\r\n name={name}\r\n fileInputRef={fileInputRef}\r\n accept={accept}\r\n onUpload={handleUpload}\r\n onChange={handleUploadChange}\r\n label={\"Upload\"}\r\n icon={\"upload\"}\r\n required={required}\r\n multiple={multiple}\r\n />}\r\n </div>\r\n {files.length > 0 && <Table\n onClick={(record) => editable && handleEdit(record as FileProps)}\n header={[\n { label: 'Name', key: 'name' },\n { label: 'Kilobyte', key: 'kilobyte' },\n { label: 'Actions', key: 'actions' }\n ]}\n body={files.map((file) => ({\n ...file,\n name: file.progress === 100 ? <a href={getFileUrl(file)} target=\"_blank\" rel=\"noopener noreferrer\">{file.fileName}</a> : file.fileName,\n kilobyte: (\n file.progress === 100 \n ? (file.size / 1024).toFixed(2) + ' KB' \n : <Percentage max={100} min={0} val={file.progress} shape=\"bar\" />\n ),\r\n actions: (\r\n <>\r\n {<ActionButton onClick={() => handleRemove(file.key)} icon='x' className=\"p-1\" />}\r\n </>\r\n )\r\n }))}\r\n />}\r\n </div>\r\n {editable && currentFile && (\r\n <FileEditor\r\n title=\"Editor Document\"\r\n file={currentFile}\r\n type=\"document\"\r\n onSave={handleSave}\r\n onClose={handleClose}\r\n />\r\n )}\r\n {post}\r\n </Wrapper>\r\n );\r\n};\r\n\r\nexport const UploadImage = ({\r\n name,\r\n //value = undefined,\r\n onChange = undefined,\r\n label = undefined,\r\n editable = false,\r\n multiple = false,\r\n accept = \"image/*\",\r\n required = false,\r\n max = 100,\r\n previewHeight = 100,\r\n previewWidth = 100,\r\n pre = undefined,\r\n post = undefined,\r\n wrapClass = undefined,\r\n className = undefined,\r\n}: UploadImageProps) => {\r\n const { files, currentFile, fileInputRef, formWrapClass, handleUploadChange, handleUpload, handleRemove, handleSave, handleEdit, handleClose } = useFileUpload<FileProps>(name, onChange, wrapClass);\r\n\r\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null);\r\n\r\n const ScaleBadge = ({scales}: {scales: Record<string, FileProps>}) => {\r\n if(!scales) return undefined;\r\n const keys = Object.keys(scales);\r\n if (keys.length === 0) return null;\r\n return keys\r\n .map((key) => (\r\n <Badge key={key}><a href={getFileUrl(scales[key], key)} className=\"text-white\" target=\"_blank\" rel=\"noopener noreferrer\">{key}</a></Badge>\r\n ))\r\n \r\n }\r\n \r\n return (\r\n <Wrapper className={formWrapClass}>\r\n {pre}\r\n <Wrapper className={className}>\r\n {label && <Label label={label} required={required} />}\r\n <div className=\"flex gap-2 flex-wrap\">\r\n {files.map((img, i) => (\r\n <div\r\n key={i}\r\n className=\"relative overflow-hidden\"\r\n style={{ width: previewHeight, height: previewWidth }}\r\n onMouseEnter={() => setHoveredIndex(i)}\r\n onMouseLeave={() => setHoveredIndex(null)}\r\n >\r\n {img.progress === 100 ? (\r\n <>\r\n <img\r\n src={getFileUrl(img)}\r\n alt={`preview-${i}`}\r\n className=\"img-thumbnail h-full w-full\"\r\n />\r\n \r\n \r\n <div className=\"bg-dark opacity-75 absolute top-0 left-0 bottom-0 right-0 justify-end items-start\" style={{ display: hoveredIndex === i ? \"flex\" : \"none\" }}>\r\n <a href={getFileUrl(img)} target=\"_blank\" className=\"p-1 text-white\" rel=\"noopener noreferrer\"><Icon name=\"eye\" /></a>\r\n {editable && <ActionButton onClick={() => handleEdit(img)} icon='pencil' className=\"p-1\" />}\n <ActionButton onClick={() => handleRemove(img.key)} icon='x' className=\"p-1\" />\r\n {editable && <div className=\"absolute bottom-0 left-0 w-full p-1 flex items-center justify-between\">\r\n <ScaleBadge scales={img.variants} />\r\n </div>}\r\n </div>\r\n </>\r\n ) : (\r\n <Percentage max={100} min={0} val={img.progress} shape=\"circle\" />\r\n )}\r\n </div>\r\n ))}\r\n\r\n {isUploadable(files, max, multiple) && <FileInput\r\n name={name}\r\n fileInputRef={fileInputRef}\r\n accept={accept} \r\n onUpload={handleUpload}\r\n onChange={handleUploadChange}\r\n icon={\"upload\"}\r\n required={required}\r\n multiple={multiple}\r\n height={previewHeight}\r\n width={previewWidth}\r\n iconClass=\"fs-1\"\r\n />}\r\n </div>\r\n </Wrapper>\r\n\r\n {editable && currentFile && (\r\n <FileEditor\r\n title=\"Editor Image\"\r\n file={currentFile}\r\n type=\"img\"\r\n onSave={handleSave}\r\n onClose={handleClose}\r\n />\r\n )}\r\n {post}\r\n </Wrapper>\r\n );\r\n};\r\n","import React, { useState } from 'react';\r\nimport { Switch, TextArea, Wrapper, LoadingButton, Dropdown, DropdownItem, Select, Range, ActionButton } from '..';\r\nimport {useTheme} from \"../../Theme\";\r\nimport { AI, AIFetchConfig } from '../../providers/ai';\r\nimport { PROMPT_CLEANUP, PROMPT_NO_REFERENCE, PromptVariables } from '../../conf/Prompt';\r\nimport { FormFieldProps, useFormContext } from './Form';\r\nimport { RecordProps } from '../../providers/data/DataProvider';\r\n\r\nexport enum PromptMode {\r\n EDITOR = \"editor\",\r\n LIVE = \"live\"\r\n}\r\ntype PromptOptions = AIFetchConfig & {\r\n value: string;\r\n};\r\n\r\ntype OnRunPrompt = (prompt: string, config: AIFetchConfig, data?: PromptVariables) => Promise<string>;\r\n\r\nexport interface PromptProps extends FormFieldProps {\r\n mode?: PromptMode;\r\n onRunPrompt?: OnRunPrompt;\r\n renderPromptDisabled?: (props: Omit<FormFieldProps, \"defaultValue\">) => React.ReactNode;\r\n rows?: number;\r\n defaultValue?: {\r\n value?: string;\r\n enabled?: boolean;\r\n role?: string;\r\n language?: string;\r\n voice?: string;\r\n style?: string;\r\n model?: string;\r\n temperature?: number;\r\n };\r\n}\r\n\r\ninterface PromptEditorProps extends Omit<PromptProps, \"mode\" | \"onRunPrompt\" | \"renderPromptDisabled\"> {\r\n value?: RecordProps\r\n}\r\n\r\ninterface PromptLiveProps extends Omit<PromptProps, \"mode\" | \"renderPromptDisabled\"> {\r\n value?: RecordProps;\r\n}\r\n\r\ninterface PromptDisabledProps extends Omit<PromptProps, \"mode\" | \"onRunPrompt\"> {\r\n}\r\n\r\ninterface RunPromptProps {\r\n prompt: string;\r\n config: AIFetchConfig;\r\n data?: PromptVariables;\r\n onRunPrompt?: OnRunPrompt;\r\n}\r\n\r\nconst promptLabel = \"Prompt: \";\r\nconst promptClass = \"relative border-l-4 pl-2 border-secondary\";\r\nconst promptActionClass = \"absolute top-0 right-0 flex gap-2\";\r\n\r\nexport const Prompt = ({\r\n mode = PromptMode.EDITOR,\r\n onRunPrompt,\r\n renderPromptDisabled,\r\n ...props\r\n}: PromptProps) => {\r\n const { value } = useFormContext({name: props.name});\r\n return mode === PromptMode.EDITOR \r\n ? <PromptEditor {...props} value={value} /> \r\n : value?.prompt?.enabled \r\n ? <PromptLive {...props} value={value} onRunPrompt={onRunPrompt} /> \r\n : <PromptDisabled {...props} renderPromptDisabled={renderPromptDisabled} />\r\n}\r\n\r\n\r\nconst PromptEditor = ({\r\n name,\r\n label = undefined,\r\n value = undefined,\r\n required = false,\r\n onChange = undefined,\r\n defaultValue = undefined,\r\n rows = 10,\r\n pre = undefined,\r\n post = undefined,\r\n wrapClass = undefined,\r\n className = undefined\r\n}: PromptEditorProps) => {\r\n const { handleChange } = useFormContext({ name });\r\n const theme = useTheme(\"prompt\");\r\n const caption = label || name;\r\n\r\n return (\r\n <Wrapper className={wrapClass || theme.Prompt.wrapClass}>\r\n {pre}\r\n <div className={value?.prompt?.enabled ? promptClass : \"relative\"}>\r\n <div className={promptActionClass}>\r\n <Switch \r\n name={name + \".prompt.enabled\"} \r\n label={\"prompt\"} \r\n defaultValue={defaultValue?.enabled}\r\n onChange={({event}) => {\r\n handleChange({\r\n target: {\r\n name: name + \".prompt.value\",\r\n value: event.target.value && defaultValue?.value\r\n }\r\n });\r\n }}\r\n />\r\n </div>\r\n <TextArea \r\n className={className || theme.Prompt.className}\r\n name={name + (value?.prompt?.enabled ? \".prompt.value\" : \".value\")} \r\n label={value?.prompt?.enabled ? promptLabel + caption : caption}\r\n defaultValue={value?.prompt?.enabled && defaultValue?.value}\r\n onChange={onChange} \r\n required={required} \r\n rows={rows} />\r\n </div>\r\n {post}\r\n </Wrapper>\r\n )\r\n}\r\n\r\nconst PromptLive = ({\r\n name,\r\n label,\r\n value,\r\n required,\r\n onChange,\r\n defaultValue,\r\n rows = 10,\r\n pre,\r\n post,\r\n wrapClass,\r\n className,\r\n onRunPrompt\r\n}: PromptLiveProps) => {\r\n const { handleChange, record } = useFormContext({name});\r\n\r\n const theme = useTheme(\"prompt\");\r\n const caption = label || name;\r\n const [prompt, setPrompt] = useState(false);\r\n const defaultValues = AI.defaults();\r\n return (\r\n <Wrapper className={wrapClass || theme.Prompt.wrapClass}>\r\n {pre}\r\n <div className={prompt ? promptClass : \"relative\"}>\r\n <div className={promptActionClass}>\r\n <ActionButton className={value?.prompt?.value ? \"border-0 text-primary hover:bg-primary/10\" : \"border-0 text-warning hover:bg-warning/10\"} \n icon={prompt ? \"terminal-fill\" : \"terminal\"} title={prompt ? \"Mode: Prompt Editor\" : \"Mode: Run Prompt\"} \r\n onClick={() => {\r\n setPrompt(!prompt);\r\n }} />\r\n\r\n </div>\r\n <TextArea \r\n className={(className || theme.Prompt.className)}\r\n name={name + \".prompt.value\"} \r\n label={promptLabel + caption}\r\n defaultValue={defaultValue?.value}\r\n onChange={onChange} \r\n required={true} \r\n post={<Dropdown \r\n position=\"end\"\r\n toggleButton={{\r\n icon: \"gear\"\r\n }}\r\n >\r\n <DropdownItem><Select name={name + \".prompt.role\"} pre=\"Role\" \r\n defaultValue={defaultValue?.role} \r\n options={AI.getRoles()} \r\n optionEmpty={{\r\n label: \"Default (\" + defaultValues.role + \")\",\r\n value: \"\"\r\n }}\r\n /></DropdownItem>\r\n <DropdownItem><Select name={name + \".prompt.language\"} pre=\"Language\" \r\n defaultValue={defaultValue?.language} \r\n options={AI.getLangs()} \r\n optionEmpty={{\r\n label: \"Default (\" + defaultValues.language + \")\",\r\n value: \"\"\r\n }}\r\n /></DropdownItem>\r\n <DropdownItem><Select name={name + \".prompt.voice\"} pre=\"Voice\" \r\n defaultValue={defaultValue?.voice} \r\n options={AI.getVoices()} \r\n optionEmpty={{\r\n label: \"Default (\" + defaultValues.voice + \")\",\r\n value: \"\"\r\n }}\r\n /></DropdownItem>\r\n <DropdownItem><Select name={name + \".prompt.style\"} pre=\"Style\" \r\n defaultValue={defaultValue?.style} \r\n options={AI.getStyles()} \r\n optionEmpty={{\r\n label: \"Default (\" + defaultValues.style + \")\",\r\n value: \"\"\r\n }}\r\n /></DropdownItem>\r\n <DropdownItem><Select name={name + \".prompt.model\"} pre=\"Model\" \r\n defaultValue={defaultValue?.model} \r\n options={AI.getModels()} \r\n optionEmpty={{\r\n label: \"Default (\" + defaultValues.model + \")\",\r\n value: \"\"\r\n }}\r\n /></DropdownItem>\r\n <DropdownItem><Range name={name + \".prompt.temperature\"} label=\"Temperature\" \r\n defaultValue={defaultValue?.temperature} \r\n min={0} \r\n max={1} \r\n step={0.1} \r\n /></DropdownItem>\r\n </Dropdown>}\r\n wrapClass={prompt ? \"\" : \" hidden\"}\r\n rows={rows} />\r\n <TextArea \r\n className={(className || theme.Prompt.className)}\r\n name={name + \".value\"} \r\n label={caption}\r\n onChange={onChange} \r\n required={required} \r\n post={<LoadingButton icon=\"stars\" onClick={async () => {\r\n handleChange?.({\r\n target: {\r\n name: name + \".value\",\r\n value: await runPrompt(value?.prompt, record, onRunPrompt)\r\n }\r\n });\r\n }} />} \r\n wrapClass={prompt ? \" hidden\" : \"\"}\r\n rows={rows} />\r\n </div>\r\n {post}\r\n </Wrapper>\r\n )\r\n}\r\n\r\nconst PromptDisabled = ({\r\n name,\r\n label,\r\n required,\r\n onChange,\r\n rows,\r\n pre,\r\n post,\r\n wrapClass,\r\n className,\r\n renderPromptDisabled\r\n}: PromptDisabledProps) => {\r\n const theme = useTheme(\"prompt\");\r\n\r\n return (\r\n <Wrapper className={wrapClass || theme.Prompt.wrapClass}>\r\n {pre}\r\n {renderPromptDisabled?.({name, label, required, onChange}) ?? (\r\n <TextArea \r\n className={(className || theme.Prompt.className)}\r\n name={name + \".value\"} \r\n label={label}\r\n onChange={onChange} \r\n required={required} \r\n rows={rows} \r\n />\r\n )}\r\n {post}\r\n </Wrapper>\r\n )\r\n}\r\n\r\nexport const runPrompt = async (options: PromptOptions, data?: PromptVariables, onRunPrompt?: OnRunPrompt): Promise<string> => {\r\n const { value: prompt, ...config } = options;\r\n const response = await AI.fetch(\r\n [PROMPT_CLEANUP, onRunPrompt?.(prompt, config, data) ?? prompt, PROMPT_NO_REFERENCE].join(\"\\n\"),\r\n config,\r\n data\r\n );\r\n\r\n console.log(response);\r\n return response;\r\n}\r\n","import React from \"react\";\r\nimport { FieldFactory } from \"../components/Component\";\r\nimport {\r\n InputProps,\r\n Checkbox,\r\n Date,\r\n DateTime,\r\n Email,\r\n Number,\r\n String,\r\n Switch,\r\n TextArea,\r\n Time, TextAreaProps, CheckboxProps,\r\n Password,\r\n Color,\r\n Week,\r\n Month\r\n} from \"../components/ui/fields/Input\";\r\nimport {Autocomplete, Checklist, Select, SelectProps} from \"../components/ui/fields/Select\";\r\nimport {ImageUrl, ImageUrlProps} from \"../components/ui/fields/ImageUrl\";\r\nimport {UploadDocument, UploadDocumentProps, UploadImage, UploadImageProps} from \"../components/ui/fields/Upload\";\r\nimport { Prompt, PromptProps } from \"../components/widgets/Prompt\";\r\n\r\nexport interface ComponentFormFieldsMap {\r\n string: FieldFactory<Partial<InputProps>>;\r\n number: FieldFactory<Partial<InputProps>>;\r\n email: FieldFactory<Partial<InputProps>>;\r\n password: FieldFactory<Partial<InputProps>>;\r\n color: FieldFactory<Partial<InputProps>>;\r\n date: FieldFactory<Partial<InputProps>>;\r\n time: FieldFactory<Partial<InputProps>>;\r\n datetime: FieldFactory<Partial<InputProps>>;\r\n week: FieldFactory<Partial<InputProps>>;\r\n month: FieldFactory<Partial<InputProps>>;\r\n textarea: FieldFactory<Partial<TextAreaProps>>;\r\n checkbox: FieldFactory<Partial<CheckboxProps>>;\r\n switch: FieldFactory<Partial<CheckboxProps>>;\r\n select: FieldFactory<Partial<SelectProps>>;\r\n autocomplete: FieldFactory<Partial<SelectProps>>;\r\n checklist: FieldFactory<Partial<SelectProps>>;\r\n uploadImage: FieldFactory<Partial<UploadImageProps>>;\r\n uploadDocument: FieldFactory<Partial<UploadDocumentProps>>;\r\n prompt: FieldFactory<Partial<PromptProps>>;\r\n imageUrl: FieldFactory<Partial<ImageUrlProps>>;\r\n menu: FieldFactory<{ defaultValue?: string }>;\r\n}\r\n\r\nconst componentFormFields: ComponentFormFieldsMap = {\r\n string: (props = {}) => ({\r\n __props: props,\r\n getDefaults: (name) => ({[name]: props.defaultValue}),\r\n render: ({name, label, ...rest} = {}) => <String key={name ?? props.name} name={name ?? props.name} label={label ?? props.label ?? name} {...props} {...rest} />\r\n }),\r\n number: (props = {}) => ({\r\n __props: props,\r\n getDefaults: (name) => ({[name]: props.defaultValue}),\r\n render: ({name, label, ...rest} = {}) => <Number key={name ?? props.name} name={name ?? props.name} label={label ?? props.label ?? name} {...props} {...rest} />\r\n }),\r\n email: (props = {}) => ({\r\n __props: props,\r\n getDefaults: (name) => ({[name]: props.defaultValue}),\r\n render: ({name, label, ...rest} = {}) => <Email key={name ?? props.name} name={name ?? props.name} label={label ?? props.label ?? name} {...props} {...rest} />\r\n }),\r\n password: (props = {}) => ({\r\n __props: props,\r\n getDefaults: (name) => ({[name]: props.defaultValue}),\r\n render: ({name, label, ...rest} = {}) => <Password key={name ?? props.name} name={name ?? props.name} label={label ?? props.label ?? name} {...props} {...rest} />\r\n }),\r\n color: (props = {}) => ({\r\n __props: props,\r\n getDefaults: (name) => ({[name]: props.defaultValue}),\r\n render: ({name, label, ...rest} = {}) => <Color key={name ?? props.name} name={name ?? props.name} label={label ?? props.label ?? name} {...props} {...rest} />\r\n }),\r\n date: (props = {}) => ({\r\n __props: props,\r\n getDefaults: (name) => ({[name]: props.defaultValue}),\r\n render: ({name, label, ...rest} = {}) => <Date key={name ?? props.name} name={name ?? props.name} label={label ?? props.label ?? name} {...props} {...rest} />\r\n }),\r\n time: (props = {}) => ({\r\n __props: props,\r\n getDefaults: (name) => ({[name]: props.defaultValue}),\r\n render: ({name, label, ...rest} = {}) => <Time key={name ?? props.name} name={name ?? props.name} label={label ?? props.label ?? name} {...props} {...rest} />\r\n }),\r\n datetime: (props = {}) => ({\r\n __props: props,\r\n getDefaults: (name) => ({ [name]: props.defaultValue }),\r\n render: ({name, label, ...rest} = {}) => <DateTime key={name ?? props.name} name={name ?? props.name} label={label ?? props.label ?? name} {...props} {...rest} />\r\n }),\r\n week: (props = {}) => ({\r\n __props: props,\r\n getDefaults: (name) => ({ [name]: props.defaultValue }),\r\n render: ({name, label, ...rest} = {}) => <Week key={name ?? props.name} name={name ?? props.name} label={label ?? props.label ?? name} {...props} {...rest} />\r\n }),\r\n month: (props = {}) => ({\r\n __props: props,\r\n getDefaults: (name) => ({ [name]: props.defaultValue }),\r\n render: ({name, label, ...rest} = {}) => <Month key={name ?? props.name} name={name ?? props.name} label={label ?? props.label ?? name} {...props} {...rest} />\r\n }),\r\n textarea: (props = {}) => ({\r\n __props: props,\r\n getDefaults: (name) => ({[name]: props.defaultValue}),\r\n render: ({name, label, ...rest} = {}) => <TextArea key={name ?? props.name} name={name ?? props.name} label={label ?? props.label ?? name} {...props} {...rest} />\r\n }),\r\n checkbox: (props = {}) => ({\r\n __props: props,\r\n getDefaults: (name) => ({[name]: props.defaultValue}),\r\n render: ({name, label, ...rest} = {}) => <Checkbox key={name ?? props.name} name={name ?? props.name} label={label ?? props.label ?? name} {...props} {...rest} />\r\n }),\r\n switch: (props = {}) => ({\r\n __props: props,\r\n getDefaults: (name) => ({[name]: props.defaultValue}),\r\n render: ({name, label, ...rest} = {}) => <Switch key={name ?? props.name} name={name ?? props.name} label={label ?? props.label ?? name} {...props} {...rest} />\r\n }),\r\n select: (props = {}) => ({\r\n __props: props,\r\n getDefaults: (name) => ({[name]: props.defaultValue}),\r\n render: ({name, label, ...rest} = {}) => <Select key={name ?? props.name} name={name ?? props.name} label={label ?? props.label ?? name} {...props} {...rest} />\r\n }),\r\n autocomplete: (props = {}) => ({\r\n __props: props,\r\n getDefaults: (name) => ({[name]: props.defaultValue}),\r\n render: ({name, label, ...rest} = {}) => <Autocomplete key={name ?? props.name} name={name ?? props.name} label={label ?? props.label ?? name} {...props} {...rest} />\r\n }),\r\n checklist: (props = {}) => ({\r\n __props: props,\r\n getDefaults: (name) => ({[name]: props.defaultValue}),\r\n render: ({name, label, ...rest} = {}) => <Checklist key={name ?? props.name} name={name ?? props.name} label={label ?? props.label ?? name} {...props} {...rest} />\r\n }),\r\n uploadImage: (props = {}) => ({\r\n __props: props,\r\n getDefaults: (name) => ({[name]: props.defaultValue}),\r\n render: ({name, label, ...rest} = {}) => <UploadImage key={name ?? props.name} name={name ?? props.name} label={label ?? props.label ?? name} {...props} {...rest} />\r\n }),\r\n uploadDocument: (props = {}) => ({\r\n __props: props,\r\n getDefaults: (name) => ({[name]: props.defaultValue}),\r\n render: ({name, label, ...rest} = {}) => <UploadDocument key={name ?? props.name} name={name ?? props.name} label={label ?? props.label ?? name} {...props} {...rest} />\r\n }),\r\n prompt: (props = {}) => ({\r\n __props: props,\r\n getDefaults: (name) => ({[name]: props.defaultValue}),\r\n render: ({name, label, ...rest} = {}) => <Prompt key={name ?? props.name} name={name ?? props.name} label={label ?? props.label ?? name} {...props} {...rest} />\r\n }),\r\n imageUrl: (props = {}) => {\r\n return {\r\n __props: props,\r\n getDefaults: (name) => ({[name]: props.defaultValue}),\r\n render: ({name, label, ...rest} = {}) => <ImageUrl name={name} label={label ?? name} {...props} {...rest} />\r\n }\r\n },\r\n menu: (props = {}) => ({\r\n __props: props,\r\n getDefaults: (name) => ({[name]: props.defaultValue}),\r\n render: ({name, label, ...rest} = {}) => <Select key={name} name={name} label={label ?? name} {...props} {...rest} />\r\n })\r\n};\r\n\r\nexport default componentFormFields;\r\n","export interface ComponentBlockMap {\n}\n\nconst componentBlock: ComponentBlockMap = {\n\n};\n\nexport default componentBlock;\n","\nexport interface ComponentSectionMap {\n}\n\nconst componentSection: ComponentSectionMap = {\n};\n\nexport default componentSection;\n","import React from \"react\";\r\nimport componentLayout from \"../types/Layout\";\r\nimport componentFormFields from \"../types/FormFields\";\r\nimport componentBlock from \"../types/Block\";\r\nimport componentSection from \"../types/Section\";\r\n\r\nimport Form from \"./widgets/Form\";\r\n\r\ntype Primitive = string | number | boolean | undefined;\r\n\r\ninterface FieldRenderProps {\r\n name: string; \r\n defaultValue?: any;\r\n label?: string;\r\n onChange?: (value: any) => void;\r\n}\r\n\r\ninterface FieldAdapter<TProps = any> {\r\n getDefaults: (name: string) => Record<string, any>;\r\n render: (props?: FieldRenderProps & TProps) => React.ReactNode;\r\n __props: TProps;\r\n}\r\n\r\nexport type FieldFactory<TProps = {}> = (props?: TProps) => FieldAdapter;\r\n\r\ninterface ComponentProps {\r\n [key: string]: any;\r\n}\r\n\r\ntype Defaults = {\r\n [key: string]: Primitive | Primitive[];\r\n};\r\nexport type ModelProps = {\r\n [key: string]: FieldAdapter | React.ReactNode | ModelProps;\r\n};\r\n\r\nexport type FormTree = {\r\n [key: string]: React.ReactNode | FormTree;\r\n};\r\n\r\n\r\n//todo: deprecata: eliminare tutta la gestione dei value e onchange in .render \r\nexport const Component = {\r\n layout: componentLayout,\r\n input: componentFormFields,\r\n block: componentBlock,\r\n section: componentSection\r\n};\r\n\r\n\r\nexport abstract class ComponentBlock {\r\n abstract model: ModelProps;\r\n abstract html(props?: ComponentProps): React.ReactNode;\r\n abstract form(props?: ComponentProps): React.ReactNode;\r\n\r\n protected verifyRequiredMethods(): void {\r\n if (!this.model || typeof this.model !== 'object') {\r\n throw new Error(`[ComponentBlock] Missing property: \"model\"`);\r\n }\r\n\r\n for (const method of ['html', 'form'] as const) {\r\n if (typeof this[method] !== 'function') {\r\n throw new Error(`[ComponentBlock] Missing method: \"${method}()\"`);\r\n }\r\n }\r\n }\r\n\r\n static default(this: new () => ComponentBlock, options?: { dataStoragePath?: string }): React.FC {\r\n const instance = new this();\r\n instance.verifyRequiredMethods();\r\n return () => {\r\n const [fields, defaults] = React.useMemo(() => {\r\n return buildFormFields(instance.model);\r\n }, [instance.model]);\r\n \r\n \r\n return (\r\n <Form defaultValues={defaults} dataStoragePath={options?.dataStoragePath}>\r\n {instance.form(fields)}\r\n </Form>\r\n );\r\n };\r\n }\r\n}\r\n\r\nfunction isFieldAdapter(obj: any): obj is FieldAdapter {\r\n return typeof obj?.render === 'function' && typeof obj?.getDefaults === 'function';\r\n}\r\n\r\nfunction isComponentBlock(obj: any): obj is new () => ComponentBlock {\r\n return typeof obj === 'function' && obj.prototype instanceof ComponentBlock;\r\n}\r\nfunction isNestedModel(obj: any): obj is ModelProps {\r\n return (\r\n obj &&\r\n typeof obj === 'object' &&\r\n !Array.isArray(obj) &&\r\n !React.isValidElement(obj) &&\r\n !isFieldAdapter(obj)\r\n );\r\n}\r\n\r\n\r\nexport function buildFormFields(\r\n model: ModelProps\r\n): [ FormTree, Defaults ] {\r\n const fields: FormTree = {};\r\n const defaults: Defaults = {};\r\n\r\n function setDefaults(obj: Defaults) {\r\n for (const [k, v] of Object.entries(obj)) {\r\n defaults[k] = v;\r\n }\r\n }\r\n\r\n for (const [name, value] of Object.entries(model)) {\r\n if (isFieldAdapter(value)) {\r\n fields[name] = value.render({name});\r\n setDefaults(value.getDefaults(name));\r\n } else if (isComponentBlock(value)) {\r\n const instance = new value();\r\n const [subFields, subDefaults] = buildFormFields(instance.model);\r\n\r\n fields[name] = instance.form(subFields);\r\n setDefaults(subDefaults);\r\n } else if (Array.isArray(value)) {\r\n console.warn(\r\n `[buildFormFields] ⚠️ The field \"${name}\" is defined as an array. ` +\r\n `It has been automatically converted into an object with generated keys (e.g., \"${name}_0\"). ` +\r\n `Consider refactoring your model to use an explicit object instead of an array.`\r\n );\r\n const syntheticModel: ModelProps = {};\r\n\r\n value.forEach((item, i) => {\r\n const itemKey = `${name}_${i}`;\r\n syntheticModel[itemKey] = item;\r\n });\r\n\r\n const [subFields, subDefaults] = buildFormFields(syntheticModel);\r\n setDefaults(subDefaults);\r\n\r\n fields[name] = subFields\r\n } else if (isNestedModel(value)) {\r\n const [nestedFields, nestedDefaults] = buildFormFields(value);\r\n fields[name] = nestedFields;\r\n setDefaults(nestedDefaults);\r\n } else {\r\n fields[name] = value;\r\n }\r\n }\r\n\r\n return [ fields, defaults ];\r\n}\r\n\r\nimport db from \"../libs/database\";\r\nimport {renderToStaticMarkup} from \"react-dom/server\";\r\n\r\n\r\nexport function ComponentBlockSave(blockClass: new () => ComponentBlock, dbStoragePath: string) {\r\n const instance = new blockClass();\r\n\r\n // Modifica i field per usare {key} come valore nei props\r\n function injectVariableProps(tree: any, prefix = ''): any {\r\n const output: any = {};\r\n for (const [key, node] of Object.entries(tree)) {\r\n const fullKey = prefix ? `${prefix}.${key}` : key;\r\n\r\n if (React.isValidElement(node)) {\r\n output[key] = injectProps(node, fullKey);\r\n } else if (typeof node === 'object') {\r\n output[key] = injectVariableProps(node, fullKey);\r\n } else {\r\n output[key] = `{${fullKey}}`;\r\n }\r\n }\r\n return output;\r\n }\r\n\r\n // Sostituisce le props dinamiche dei form con {key} stringati\r\n function injectProps(node: React.ReactElement, key: string): React.ReactElement {\r\n const newProps: Record<string, any> = { ...node.props };\r\n\r\n if ('value' in newProps) newProps.value = `{${key}}`;\r\n if ('checked' in newProps) newProps.checked = `{${key}}`;\r\n if ('src' in newProps) newProps.src = `{${key}}`;\r\n if ('alt' in newProps) newProps.alt = `{${key}}`;\r\n if ('defaultValue' in newProps) newProps.defaultValue = `{${key}}`;\r\n\r\n return React.cloneElement(node, newProps);\r\n }\r\n\r\n function detectFieldType(adapter: FieldAdapter): string {\r\n for (const [typeName, factory] of Object.entries(componentFormFields)) {\r\n const testAdapter = factory();\r\n if (testAdapter.render.toString() === adapter.render.toString()) {\r\n return typeName;\r\n }\r\n }\r\n return \"unknown\";\r\n }\r\n\r\n function serializeModel(model: ModelProps): any {\r\n const out: any = {};\r\n for (const [key, value] of Object.entries(model)) {\r\n if (value && typeof value === 'object') {\r\n if (isFieldAdapter(value)) {\r\n out[key] = {\r\n type: detectFieldType(value),\r\n props: value.__props\r\n };\r\n } else if (isComponentBlock(value)) {\r\n out[key] = {\r\n type: 'ComponentBlockRef',\r\n ref: `/components/${value.name}`\r\n };\r\n } else if (Array.isArray(value)) {\r\n out[key] = value.map((item) =>\r\n isNestedModel(item)\r\n ? serializeModel(item as ModelProps)\r\n : '[JSX]'\r\n );\r\n } else if (React.isValidElement(value)) {\r\n out[key] = '[JSX]';\r\n } else if (isNestedModel(value)) {\r\n out[key] = serializeModel(value);\r\n } else {\r\n out[key] = '[JSX]';\r\n }\r\n } else {\r\n out[key] = null;\r\n }\r\n }\r\n return out;\r\n }\r\n\r\n function buildTemplate(): any {\r\n const [fields] = buildFormFields(instance.model);\r\n const injectedFields = injectVariableProps(fields);\r\n\r\n const renderedForm = instance.form(injectedFields);\r\n const renderedHtml = instance.html(injectedFields);\r\n\r\n return {\r\n ref: dbStoragePath,\r\n model: serializeModel(instance.model),\r\n form: renderToStaticMarkup(renderedForm),\r\n html: renderToStaticMarkup(renderedHtml)\r\n };\r\n }\r\n\r\n return db.set(dbStoragePath, buildTemplate());\r\n}\r\n\r\n\r\n\r\nfunction ComponentBlockSave2(blockClass: new () => ComponentBlock, dbStoragePath: string) {\r\n const instance = new blockClass();\r\n\r\n function generatePlaceholders(model: ModelProps): FormTree {\r\n const out: FormTree = {};\r\n for (const [key, value] of Object.entries(model)) {\r\n if (isNestedModel(value)) {\r\n out[key] = generatePlaceholders(value);\r\n } else {\r\n out[key] = `{${key}}`;\r\n }\r\n }\r\n return out;\r\n }\r\n\r\n function detectFieldType(adapter: FieldAdapter): string {\r\n for (const [typeName, factory] of Object.entries(componentFormFields)) {\r\n const testAdapter = factory();\r\n if (testAdapter.render.toString() === adapter.render.toString()) {\r\n return typeName;\r\n }\r\n }\r\n return \"unknown\";\r\n }\r\n\r\n function serializeModel(model: ModelProps): any {\r\n const out: any = {};\r\n for (const [key, value] of Object.entries(model)) {\r\n if (value && typeof value === 'object') {\r\n if (isFieldAdapter(value)) {\r\n out[key] = {\r\n type: detectFieldType(value),\r\n props: value.__props\r\n };\r\n } else if (isComponentBlock(value)) {\r\n out[key] = {\r\n type: 'ComponentBlockRef',\r\n ref: `/components/${value.name}`\r\n };\r\n } else if (Array.isArray(value)) {\r\n out[key] = value.map((item) =>\r\n isNestedModel(item)\r\n ? serializeModel(item as ModelProps)\r\n : '[JSX]'\r\n );\r\n } else if (React.isValidElement(value)) {\r\n out[key] = '[JSX]';\r\n } else if (isNestedModel(value)) {\r\n out[key] = serializeModel(value);\r\n } else {\r\n out[key] = '[JSX]';\r\n }\r\n } else {\r\n out[key] = null;\r\n }\r\n }\r\n return out;\r\n }\r\n\r\n function buildTemplate(): any {\r\n const placeholders = generatePlaceholders(instance.model);\r\n const renderedForm = instance.form(placeholders);\r\n const renderedHtml = instance.html(placeholders);\r\n\r\n return {\r\n ref: dbStoragePath,\r\n model: serializeModel(instance.model),\r\n form: renderToStaticMarkup(renderedForm),\r\n html: renderToStaticMarkup(renderedHtml)\r\n };\r\n }\r\n\r\n return db.set(dbStoragePath, buildTemplate());\r\n}\r\n\r\n\r\nexport class ComponentTemplate {\r\n private template?: any;\r\n\r\n constructor(path: string) {\r\n this.loadTemplate(path);\r\n }\r\n\r\n async loadTemplate(path: string): Promise<void> {\r\n this.template = await db.read(path);\r\n if (!this.template) throw new Error(\"Template not found at \" + path);\r\n }\r\n\r\n async render(dataPath: string): Promise<{ html: () => React.ReactNode; form: () => React.ReactNode }> {\r\n const data = await db.read(dataPath);\r\n return {\r\n html: () => this.renderTemplate(this.template.html, data),\r\n form: () => this.renderTemplate(this.template.form, data)\r\n };\r\n }\r\n\r\n\r\n\r\n private renderTemplate(html: string, slots: Record<string, Primitive>): React.ReactNode[] {\r\n const parts = html.split(/({[^}]+})/g); // divide in: testo, {variabile}, testo, ecc.\r\n\r\n return parts.map((part, i) => {\r\n const match = part.match(/^{(.+)}$/); // trova {chiave}\r\n if (match) {\r\n const key = match[1].trim();\r\n return <React.Fragment key={i}>{slots[key] != null ? String(slots[key]) : ''}</React.Fragment>;\r\n } else {\r\n return <React.Fragment key={i}>{part}</React.Fragment>;\r\n }\r\n });\r\n }\r\n\r\n private parseTemplate(template: string, slots: Record<string, Primitive>): React.ReactNode {\r\n const div = document.createElement(\"div\");\r\n div.innerHTML = template;\r\n\r\n function walk(node: ChildNode): React.ReactNode {\r\n switch (node.nodeType) {\r\n case Node.TEXT_NODE: {\r\n const text = node.textContent || '';\r\n const parts = text.split(/({[^}]+})/g);\r\n\r\n return parts.map((part, i) => {\r\n const match = part.match(/^{(.+)}$/);\r\n if (match) {\r\n const key = match[1].trim();\r\n return <React.Fragment key={i}>{slots[key] != null ? String(slots[key]) : ''}</React.Fragment>;\r\n } else {\r\n return <React.Fragment key={i}>{part}</React.Fragment>;\r\n }\r\n });\r\n }\r\n\r\n case Node.ELEMENT_NODE: {\r\n const el = node as HTMLElement;\r\n const tag = el.tagName.toLowerCase();\r\n const props: Record<string, any> = {};\r\n\r\n for (const attr of Array.from(el.attributes)) {\r\n props[attr.name === 'class' ? 'className' : attr.name] = attr.value.replace(\r\n /({[^}]+})/g,\r\n (_, expr) => String(slots[expr.trim()] ?? '')\r\n );\r\n }\r\n\r\n const children = Array.from(el.childNodes).map((child, i) => (\r\n <React.Fragment key={i}>{walk(child)}</React.Fragment>\r\n ));\r\n\r\n return React.createElement(tag, props, ...children);\r\n }\r\n\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n {Array.from(div.childNodes).map((node, i) => (\r\n <React.Fragment key={i}>{walk(node)}</React.Fragment>\r\n ))}\r\n </>\r\n );\r\n }\r\n\r\n}\r\n\r\n\r\n\r\nexport default Component;\r\n"," import React, { createContext, useContext, useEffect, useState, forwardRef, useImperativeHandle, useRef, useCallback, useMemo } from 'react';\r\n import { useLocation } from \"react-router-dom\";\r\n import { Wrapper } from \"../ui/GridSystem\";\r\n import { trimSlash, cleanRecord } from \"../../libs/utils\";\r\n import { useDataProvider } from \"../../providers/data/DataProviderContext\";\r\n import Card from \"../ui/Card\";\r\n import { BackLink, LoadingButton } from \"../ui/Buttons\";\r\n import setLog from \"../../libs/log\";\r\n import { useTheme } from \"../../Theme\";\r\n import Alert from \"../ui/Alert\";\r\n import { RecordProps } from \"../../providers/data/DataProvider\";\r\n import {FormTree, ModelProps, buildFormFields} from \"../Component\";\r\n import Breadcrumbs from \"../blocks/Breadcrumbs\";\r\n import { UIProps } from '../';\r\n\r\n export type ChangeHandler = React.ChangeEvent<any> | { target: { name: string; value?: any } };\r\n\r\n type FormHandleChange = (event: ChangeHandler) => void;\r\n interface FormProviderProps {\r\n record: RecordProps | undefined;\r\n setRecord: React.Dispatch<React.SetStateAction<RecordProps | undefined>>;\r\n wrapClass?: string;\r\n }\r\n export type FieldOnChange = (params: {event: ChangeHandler, name: string, value: any, record: RecordProps, onChange: FormHandleChange}) => void;\r\n export type InputType = \"text\" | \"number\" | \"email\" | \"password\" | \"color\" | \"date\" | \"time\" | \"datetime-local\" | \"week\" | \"month\" | \"range\" | \"checkbox\" | \"radio\" | \"url\" ;\r\n \r\n interface FormContextProps {\r\n name: string;\r\n onChange?: FieldOnChange;\r\n wrapClass?: string;\r\n inputType?: InputType;\r\n defaultValue?: any;\r\n }\r\n interface FormContextResult {\r\n value: any;\r\n handleChange: FormHandleChange;\r\n formWrapClass?: string;\r\n record: RecordProps;\r\n }\r\n\r\n const cloneContainer = (value: any) => (\r\n Array.isArray(value)\r\n ? [...value]\r\n : (value && typeof value === \"object\")\r\n ? { ...value }\r\n : {}\r\n );\r\n\r\n const isArrayIndex = (value: string) => !Number.isNaN(Number(value));\r\n\r\n const normalizeInputValue = (rawValue: string, inputType: InputType) => {\r\n if (![\"number\", \"range\"].includes(inputType)) return rawValue;\r\n return rawValue === \"\" || rawValue == null ? \"\" : Number(rawValue);\r\n };\r\n\r\n const createContainer = (nextKey?: string) => {\r\n return nextKey !== undefined && isArrayIndex(nextKey) ? [] : {};\r\n };\r\n\r\n const applyChangeToRecord = (\r\n source: RecordProps | undefined,\r\n event: ChangeHandler,\r\n inputType: InputType\r\n ): RecordProps => {\r\n const path = event.target.name.split(\".\");\r\n const nextValue = normalizeInputValue(event.target.value, inputType);\r\n\r\n const root = cloneContainer(source ?? {}) as RecordProps;\r\n let cursor: any = root;\r\n // Dynamic path traversal across nested objects/arrays.\r\n\r\n for (let i = 0; i < path.length - 1; i++) {\r\n const key = path[i];\r\n const nextKey = path[i + 1];\r\n const currentValue = cursor[key];\r\n\r\n cursor[key] =\r\n currentValue != null && typeof currentValue === \"object\"\r\n ? cloneContainer(currentValue)\r\n : createContainer(nextKey);\r\n\r\n cursor = cursor[key];\r\n }\r\n\r\n const finalKey = path[path.length - 1];\r\n if (nextValue == null || nextValue === \"\") {\r\n if (Array.isArray(cursor) && isArrayIndex(finalKey)) {\r\n cursor.splice(Number(finalKey), 1);\r\n } else {\r\n delete cursor[finalKey];\r\n }\r\n } else {\r\n cursor[finalKey] = nextValue;\r\n }\r\n\r\n return root;\r\n };\r\n\r\n export interface FormFieldProps extends UIProps {\r\n name: string;\r\n label?: string;\r\n value?: any;\r\n required?: boolean;\r\n onChange?: FieldOnChange;\r\n defaultValue?: any; //todo: da propagare per le select, checkbox e vrificare la copertura ovunque\r\n }\r\n\r\n interface SetFormFieldsNameProps {\r\n children: React.ReactNode;\r\n parentName: string;\r\n parentKey?: string;\r\n wrapClass?: string;\r\n }\r\n\r\n const FormContext = createContext<FormProviderProps | null>(null);\r\n \r\n\r\nexport const useFormContext = ({name, onChange, wrapClass, inputType = \"text\", defaultValue}: FormContextProps): FormContextResult => {\r\n const ctx = useContext(FormContext);\r\n if (!ctx) throw new Error(\"useFormContext must be used within a FormContext.Provider\");\r\n if (!name) throw new Error(\"useFormContext: name is required\");\r\n\r\n const formChange = (event: ChangeHandler, sourceRecord?: RecordProps) => {\r\n const nextRecord = applyChangeToRecord(sourceRecord ?? ctx.record, event, inputType);\r\n return nextRecord;\r\n }\r\n/*\r\n const currentValue = name.split(\".\").reduce((acc, key) => acc?.[key], ctx.record);\r\n if (!initialized.current && currentValue === undefined && defaultValue !== undefined) {\r\n console.log(\"FORM defaultValue!!!!!!!!!!!!\", name, defaultValue);\r\n formChange({ target: { name, value: defaultValue } });\r\n initialized.current = true;\r\n }\r\n\r\n const value = currentValue ?? defaultValue;\r\n*/\r\n\r\n const value = useMemo(() => {\r\n const currentValue = name.split(\".\").reduce((acc, key) => (acc === undefined ? undefined : acc[key]), ctx.record);\r\n //if (!initialized.current) {\r\n // initialized.current = true;\r\n if (currentValue === undefined && defaultValue !== undefined) {\r\n //formChange({ target: { name, value: defaultValue } });\r\n return defaultValue ?? '';\r\n }\r\n //}\r\n return currentValue ?? '';\r\n }, [name, ctx.record, defaultValue]);\r\n\r\n \r\n return {\r\n value,\r\n handleChange: (event) => {\r\n let nextRecord = ctx.record;\r\n ctx.setRecord((prev) => {\r\n nextRecord = formChange(event, prev);\r\n return nextRecord;\r\n });\r\n onChange?.({\r\n event,\r\n name,\r\n value: event.target.value,\r\n record: nextRecord ?? {},\r\n onChange: (nextEvent) => {\r\n ctx.setRecord((prev) => formChange(nextEvent, prev));\r\n }\r\n });\r\n },\r\n formWrapClass: [wrapClass, ctx.wrapClass].filter(Boolean).join(\" \"),\r\n record: ctx.record ?? {},\r\n }; \r\n };\r\n\r\n type UseHandleDropProps = {\r\n name: string;\r\n value: string;\r\n handleChange?: FormHandleChange;\r\n };\r\n\r\n export const useHandleDrop = ({ name, value, handleChange }: UseHandleDropProps) => {\r\n return React.useCallback(\r\n (e: React.DragEvent<HTMLTextAreaElement | HTMLInputElement>) => {\r\n e.preventDefault();\r\n \r\n const target = e.target as HTMLTextAreaElement | HTMLInputElement;\r\n const raw = e.dataTransfer.getData(\"text/plain\");\r\n const text = `${raw}`;\r\n \r\n target.focus();\r\n \r\n // Calcola posizione caret\r\n const caretPosition = (() => {\r\n const position =\r\n document.caretPositionFromPoint?.(e.clientX, e.clientY) ??\r\n (document as any).caretRangeFromPoint?.(e.clientX, e.clientY);\r\n return position && \"offset\" in position\r\n ? position.offset\r\n : target.value.length;\r\n })();\r\n \r\n // Crea nuovo valore\r\n const newValue =\r\n (value ?? \"\").slice(0, caretPosition) +\r\n text +\r\n (value ?? \"\").slice(caretPosition);\r\n \r\n // Notifica onChange\r\n \r\n handleChange?.({\r\n target: {\r\n value: newValue.trim(),\r\n name,\r\n },\r\n });\r\n \r\n // Posiziona il cursore dopo il testo inserito\r\n requestAnimationFrame(() => {\r\n const newPosition = caretPosition + text.length;\r\n target.setSelectionRange(newPosition, newPosition);\r\n });\r\n },\r\n [name, value, handleChange]\r\n );\r\n }\r\n\r\n function setParentName(name: string, parentName: string) {\r\n if (name.indexOf('.') === -1 || parentName.indexOf('.') === -1) return `${parentName}.${name}`;\r\n\r\n const min = Math.min(name.length, parentName.length);\r\n let i = 0;\r\n\r\n while (i < min && name.charCodeAt(i) === parentName.charCodeAt(i)) i++;\r\n\r\n const lastDot = name.lastIndexOf('.', i - 1);\r\n if (lastDot === -1) return `${parentName}.${name}`;\r\n\r\n return `${parentName}.${name.slice(lastDot + 1)}`;\r\n }\r\n \r\n export const setFormFieldsName = ({children, parentName, parentKey, wrapClass}: SetFormFieldsNameProps): React.ReactNode => {\r\n return React.Children.map(children, (child) => {\r\n if (!parentName || !React.isValidElement(child)) return child;\r\n\r\n const {name, children: childChildren} = child.props;\r\n const newProps: Record<string, any> = {};\r\n if (name) {\r\n newProps.name = setParentName(name, parentName);\r\n newProps.key = parentKey ?? newProps.name;\r\n newProps.wrapClass = child.props.wrapClass ?? wrapClass;\r\n\r\n if (child.props.pre && React.isValidElement(child.props.pre) ) {\r\n newProps.pre = setFormFieldsName({\r\n children: child.props.pre,\r\n parentName,\r\n parentKey: `${newProps.key}.pre` ,\r\n });\r\n }\r\n if (child.props.post && React.isValidElement(child.props.post) ) {\r\n newProps.post = setFormFieldsName({\r\n children: child.props.post,\r\n parentName,\r\n parentKey: `${newProps.key}.post` ,\r\n });\r\n }\r\n }\r\n if (childChildren) {\r\n newProps.children = setFormFieldsName({\r\n children: childChildren, \r\n parentName, \r\n parentKey,\r\n });\r\n }\r\n\r\n return React.cloneElement(child as any, newProps);\r\n });\r\n }\r\n\r\n export type SavePathProps = {\n record: RecordProps;\n storagePath?: string;\n }\n\n export type FormSaveArgs = {\n record?: RecordProps;\n prevRecord?: RecordProps;\n storagePath?: string;\n action: 'create' | 'update';\n }\n\n export type FormDeleteArgs = {\n record?: RecordProps;\n }\n\n export type FormFinallyArgs = {\n record?: RecordProps;\n action: 'create' | 'update' | 'delete';\n }\n\n export type FormSaveHandler = (args: FormSaveArgs) => Promise<string | undefined>;\n export type FormDeleteHandler = (args: FormDeleteArgs) => Promise<string | undefined>;\n export type FormFinallyHandler = (args: FormFinallyArgs) => Promise<boolean>;\n\r\n interface BaseFormProps {\r\n aspect?: \"card\" | \"empty\";\r\n header?: React.ReactNode;\r\n footer?: React.ReactNode;\r\n dataStoragePath?: string;\r\n handlers?: FormHandlers;\r\n setPrimaryKey?: (record: RecordProps) => string;\r\n savePath?: (props: SavePathProps) => string | undefined;\r\n onLoad?: (record: RecordProps) => void;\r\n onChange?: (record: RecordProps) => void;\r\n onSave?: FormSaveHandler;\n onDelete?: FormDeleteHandler;\n onFinally?: FormFinallyHandler;\n log?: boolean;\r\n showNotice?: boolean;\r\n showBack?: boolean;\r\n wrapClass?: string;\r\n headerClass?: string;\r\n className?: string;\r\n footerClass?: string;\r\n }\r\n interface FormDefaultProps extends BaseFormProps {\r\n children: React.ReactNode | ((fields: FormTree) => React.ReactNode) | ((args: { record?: RecordProps}) => React.ReactNode);\r\n defaultValues?: RecordProps;\r\n }\r\n\r\n interface FormDatabaseProps extends FormDefaultProps {\r\n dataStoragePath: string;\r\n }\r\n interface FormModelProps extends BaseFormProps {\r\n model: ModelProps;\r\n children?: ((fields: FormTree) => React.ReactNode);\r\n }\r\n\r\n interface FormProps extends BaseFormProps {\r\n children?: React.ReactNode | ((fields: FormTree) => React.ReactNode) | ((args: { record?: RecordProps }) => React.ReactNode);\r\n defaultValues?: RecordProps;\r\n }\r\n\r\n export interface FormRef {\r\n handleSave: (e: React.MouseEvent<HTMLButtonElement>) => Promise<boolean>;\r\n handleDelete: (e: React.MouseEvent<HTMLButtonElement>) => Promise<boolean>;\r\n getHeader: () => React.ReactNode;\r\n getRecord: () => {record: RecordProps, isNewRecord: boolean};\r\n getFooter: () => React.ReactNode;\r\n }\r\n type FormHandlers = Partial<FormRef>;\r\n\r\n\r\n\r\n function Form(props: FormProps, ref?: React.Ref<FormRef>) {\r\n const location = useLocation();\r\n const { dataStoragePath, setPrimaryKey, handlers, defaultValues, children, ...rest } = props;\r\n\r\n const genStoragePath = (record: RecordProps) => {\r\n return `${dataStoragePath ?? trimSlash(location.pathname)}/${setPrimaryKey?.(record) ?? Date.now()}`;\r\n };\r\n const getStoragePath = (dataStoragePath: string | undefined) => (\r\n dataStoragePath ?? (location.hash \r\n ? `${trimSlash(location.pathname)}/${location.hash.slice(1)}` \r\n : undefined)\r\n );\r\n\r\n const dbStoragePath = getStoragePath(dataStoragePath);\r\n const savePath = ({record, storagePath}: SavePathProps) => storagePath ?? genStoragePath(record);\r\n\r\n return defaultValues || !dbStoragePath || (handlers && !dataStoragePath)\r\n ? <FormData children={children} defaultValues={defaultValues} handlers={handlers} savePath={savePath} dataStoragePath={dbStoragePath} {...rest} ref={ref} />\r\n : <FormDatabase children={children} defaultValues={defaultValues} handlers={handlers} savePath={savePath} dataStoragePath={dbStoragePath} {...rest} ref={ref} />;\r\n }\r\n\r\n export const FormDatabase = forwardRef<FormRef, FormDatabaseProps>((props, ref) => {\r\n const { dataStoragePath, defaultValues, ...rest } = props;\r\n const db = useDataProvider();\r\n\r\n const [record, setRecord] = useState<RecordProps | undefined>(undefined);\r\n\r\n useEffect(() => {\r\n db.read(dataStoragePath).then(data => {\r\n setRecord({ ...defaultValues, ...data});\r\n }).catch(error => {\r\n console.error(error);\r\n setRecord({});\r\n });\r\n }, [dataStoragePath]);\r\n \r\n\r\n if (!record) {\r\n return <p className={\"p-4\"}><span className=\"mr-2 inline-block h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent\" />Caricamento in corso...</p>;\n }\r\n\r\n return <FormData {...rest} defaultValues={record} dataStoragePath={dataStoragePath} ref={ref} />;\r\n });\r\n\r\n type NoticeProps = {\r\n type: \"danger\" | \"success\" | \"info\" | \"warning\" | \"primary\" | \"secondary\" | \"light\" | \"dark\";\r\n message: string;\r\n };\r\n\r\n const FormData = forwardRef<FormRef, FormDefaultProps>(({\r\n children,\r\n aspect = undefined,\r\n header = undefined,\r\n footer = undefined,\r\n dataStoragePath = undefined,\r\n handlers = undefined,\r\n defaultValues = undefined,\r\n savePath = undefined,\r\n onLoad = undefined,\r\n onChange = undefined,\r\n onSave = undefined,\r\n onDelete = undefined,\r\n onFinally = undefined,\r\n log = false,\r\n showNotice = true,\r\n showBack = false,\r\n wrapClass = undefined,\r\n headerClass = undefined,\r\n className = undefined,\r\n footerClass = undefined\r\n }, ref) => {\r\n const theme = useTheme(\"form\");\r\n const db = useDataProvider();\r\n\r\n const [record, setRecord] = useState<RecordProps | undefined>(defaultValues);\r\n const isNewRecord = !dataStoragePath;\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n useEffect(()=>{\r\n if (defaultValues) {\r\n setRecord({...defaultValues});\r\n onLoad?.({...defaultValues});\r\n }\r\n }, [JSON.stringify(defaultValues)]);\r\n \r\n const recordRef = useRef(record);\r\n useEffect(() => {\r\n recordRef.current = record;\r\n if (record !== undefined) onChange?.(record);\r\n }, [record]);\r\n \r\n\r\n const [notification, setNotification] = useState<NoticeProps | undefined>(undefined);\r\n const notice = useCallback(({ message, type = \"danger\" }: NoticeProps) => {\r\n if (showNotice) {\r\n setNotification({ type, message });\r\n }\r\n }, [showNotice]);\r\n\r\n \r\n\r\n const handleSave = useCallback(async (e: React.MouseEvent<HTMLButtonElement>): Promise<boolean> => {\r\n e.preventDefault();\r\n \r\n showNotice && setNotification(undefined);\r\n const emptyRequiredFields = document.querySelectorAll('[required]:not([value]), [required][value=\"\"]');\r\n if (emptyRequiredFields.length > 0) {\r\n showNotice && setNotification({ message: theme.Form.i18n.noticeRequiredFields, type: \"warning\" });\r\n //return false;\r\n }\r\n const action = isNewRecord ? \"create\" : \"update\";\r\n /*const recordStoragePath = onSave \r\n ? await onSave({\r\n record: recordRef.current, \r\n prevRecord: defaultValues,\r\n action: action, \r\n storagePath: dataStoragePath\r\n }) ?? dataStoragePath\r\n : savePath \r\n ? savePath?.({record: recordRef.current ?? {}, storagePath: dataStoragePath})\r\n : dataStoragePath;\r\n*/\r\n const recordStoragePath =\r\n (onSave && await onSave({\r\n record: recordRef.current,\r\n prevRecord: defaultValues,\r\n action,\r\n storagePath: dataStoragePath,\r\n }))\r\n ?? savePath?.({\r\n record: recordRef.current ?? {},\r\n storagePath: dataStoragePath,\r\n })\r\n ?? dataStoragePath;\r\n\r\n recordStoragePath && await db.set(recordStoragePath, cleanRecord(recordRef.current));\r\n return await handleFinally(action);\r\n }, [dataStoragePath, onSave, onFinally, showNotice, savePath]);\r\n\r\n const handleDelete = useCallback(async (e: React.MouseEvent<HTMLButtonElement>) => {\r\n e.preventDefault();\r\n \r\n showNotice && setNotification(undefined);\r\n\r\n const recordStoragePath = onDelete \r\n ? await onDelete({record: recordRef.current})\r\n : savePath?.({record: recordRef.current ?? {}, storagePath: dataStoragePath}) ?? dataStoragePath;\r\n\r\n recordStoragePath && await db.remove(recordStoragePath);\r\n return await handleFinally(\"delete\");\r\n }, [dataStoragePath, onDelete, onFinally, showNotice, savePath]);\r\n\r\n const handleFinally = useCallback(async (action: 'create' | 'update' | 'delete') => {\r\n log && dataStoragePath && setLog(dataStoragePath, action, recordRef.current);\r\n\r\n notice({ message: `Record ${action}ed successfully`, type: \"success\" });\r\n\r\n return (await onFinally?.({record: recordRef.current, action})) ?? true;\r\n }, [log, dataStoragePath, onFinally, notice]);\r\n\r\n useImperativeHandle(ref, () => ({\r\n handleSave: handlers?.handleSave ?? handleSave,\r\n handleDelete: handlers?.handleDelete ?? handleDelete,\r\n getHeader: handlers?.getHeader ?? (() => header),\r\n getRecord: handlers?.getRecord ?? (() => ({record: recordRef.current ?? {}, isNewRecord})),\r\n getFooter: handlers?.getFooter ?? (() => footer),\r\n }), [handleSave, handleDelete, handlers]);\r\n\r\n const components = <FormContext.Provider value={{ record, setRecord, wrapClass: \"mb-3\" }}>\r\n {typeof children === 'function' ? children({record}) : children}\r\n </FormContext.Provider>;\r\n\r\n\r\n const displayComponent = useMemo(() => {\r\n if(!aspect && ref) return components;\r\n\r\n switch (aspect) {\r\n case \"empty\":\r\n return components;\r\n case \"card\":\r\n default:\r\n return <Card\r\n header={header || <Breadcrumbs pre={(isNewRecord ? theme.Form.i18n.headerAdd : theme.Form.i18n.headerEdit)} path={dataStoragePath ?? theme.Form.i18n.headerNewRecord} />}\r\n footer={(footer || !isNewRecord || onSave || onDelete || showBack) && <>\r\n {footer}\r\n {(onSave || !isNewRecord) && <LoadingButton\r\n className={theme.Form.buttonSaveClass}\r\n label={theme.Form.i18n.buttonSave}\r\n onClick={e => handleSave(e)}\r\n />}\r\n {(onDelete || !isNewRecord) && <LoadingButton\r\n className={theme.Form.buttonDeleteClass}\r\n label={theme.Form.i18n.buttonDelete}\r\n onClick={handleDelete}\r\n />}\r\n {showBack && <BackLink\r\n className={theme.Form.buttonBackClass}\r\n label={theme.Form.i18n.buttonBack}\r\n />}\r\n </>}\r\n headerClass={headerClass || theme.Form.Card.headerClass}\r\n bodyClass={className || theme.Form.Card.bodyClass}\r\n footerClass={footerClass || theme.Form.Card.footerClass}\r\n >\r\n {components}\r\n </Card>;\r\n }\r\n }, [aspect, header, footer, onSave, onDelete, showBack, record, components, ref]);\r\n\r\n return (\r\n <Wrapper className={wrapClass || theme.Form.wrapClass}>\r\n {notification && (\r\n <Alert type={notification.type} onClose={()=>setNotification(undefined)}>\r\n {notification.message}\r\n </Alert>\r\n )}\r\n {displayComponent}\r\n </Wrapper>\r\n )\r\n });\r\n \r\n export function FormModel({\r\n model,\r\n children,\r\n ...formProps\r\n }: FormModelProps\r\n ) {\r\n const [ fields, defaults ] = React.useMemo(() => {\r\n if (!model) return [{}, {}];\r\n return buildFormFields(model);\r\n }, [model]);\r\n\r\n const location = useLocation();\r\n const getStoragePath = (dataStoragePath: string | undefined) => (\r\n dataStoragePath ?? (location.hash \r\n ? `${trimSlash(location.pathname)}/${location.hash.slice(1)}` \r\n : undefined)\r\n );\r\n\r\n console.log(\"formnodel nodes\", children && children(fields));\r\n const dataStoragePath = getStoragePath(formProps.dataStoragePath);\r\n if (!dataStoragePath) return null;\r\n\r\n return (\r\n <FormDatabase dataStoragePath={dataStoragePath} defaultValues={defaults} {...formProps}>\r\n {children && children(fields)}\r\n </FormDatabase>\r\n\r\n );\r\n }\r\n\r\n export default forwardRef(Form);\r\n","import React, { useMemo } from 'react';\r\nimport { ActionButton } from './Buttons';\r\nimport { FieldOnChange, setFormFieldsName, useFormContext } from '../widgets/Form';\r\nimport { Col, Row } from './GridSystem';\r\n\r\ninterface RepeatProps {\r\n name: string;\r\n children: React.ReactNode | ((record: any) => React.ReactNode);\r\n value?: any[];\r\n onChange?: FieldOnChange;\r\n onAdd?: (value: any[]) => void;\r\n onRemove?: (index: number) => void;\r\n className?: string;\r\n layout?: 'vertical' | 'horizontal' | 'inline';\r\n min?: number;\r\n max?: number;\r\n label?: string;\r\n readOnly?: boolean;\r\n}\r\n\r\nconst Repeat = ({\r\n name,\r\n children,\r\n //value = undefined,\r\n onChange,\r\n onAdd,\r\n onRemove,\r\n className,\r\n layout = 'horizontal',\r\n min = undefined,\r\n max = undefined,\r\n label = undefined,\r\n readOnly = false,\r\n}: RepeatProps) => {\r\n const { value, handleChange } = useFormContext({ name, onChange });\r\n\r\n const renderChildren = (index: number, wrapClass?: string) => {\r\n return setFormFieldsName({\r\n children: typeof children === 'function'\r\n ? children({ record: value?.[index], records: value, index: index })\r\n : children,\r\n parentName: `${name}.${index}`,\r\n wrapClass\r\n })\r\n }\r\n const renderLayout = (index: number, canRemove: boolean) => {\r\n switch (layout) {\r\n case 'horizontal': \r\n return <>\r\n {canRemove && (<div className='flex justify-between pl-1 mb-2'>\r\n <h6>#{index + 1}</h6>\r\n <ActionButton\n className=\"h-6 w-6 rounded-md bg-transparent p-0 text-muted-foreground hover:bg-accent hover:text-foreground\"\n icon=\"x\"\n onClick={() => handleRemove(index)}\n />\n </div>)}\r\n <div className={`pl-2`}>\r\n {renderChildren(index)}\r\n </div>\r\n <hr className='mb-2' />\r\n </>\r\n case 'vertical':\r\n return <></>\r\n case 'inline':\r\n return <Row className={`pl-2`}>\r\n {renderChildren(index, 'col')}\r\n {canRemove && (\r\n <Col xs='auto' className='flex items-start justify-end pt-1'>\r\n <ActionButton\n className=\"h-6 w-6 rounded-md bg-transparent p-0 text-muted-foreground hover:bg-accent hover:text-foreground\"\n icon=\"x\"\n onClick={() => handleRemove(index)}\n />\n </Col>\r\n )}\r\n </Row>\r\n }\r\n }\r\n\r\n\r\n const components = (Array.isArray(value) ? value : Array.from({ length: min || 0 }, () => ({})))?.map((_, index) => {\r\n const canRemove = !readOnly && index >= (min || 0);\r\n\r\n return (\r\n <React.Fragment key={`${name}-${index}`}>\r\n {renderLayout(index, canRemove)}\r\n </React.Fragment>\r\n );\r\n });\r\n\r\n const handleAdd = () => {\r\n const next = Array.isArray(value)\r\n ? [...value, {}]\r\n : Array.from({ length: components.length + 1 }, () => ({}));\r\n onAdd?.(next);\r\n handleChange({ target: { name: `${name}.${next.length - 1}`, value: {} } });\r\n };\r\n\r\n const handleRemove = (index: number) => {\r\n onRemove?.(index);\r\n handleChange({ target: { name: `${name}.${index}` } });\r\n };\r\n\r\n const addButton = useMemo(() => {\r\n if (readOnly) return null;\r\n if (!max || components.length < max) {\r\n return <ActionButton wrapClass='text-end' icon='plus' label={label ? undefined : 'Add'} onClick={handleAdd} />\r\n }\r\n return null;\r\n }, [readOnly, max, components.length]);\r\n\r\n return (\r\n <div className={className}>\r\n {label && <><h6 className='flex items-center justify-between'>{label}{addButton}</h6><hr /></>}\r\n {components}\r\n {!label && addButton}\r\n </div>\r\n );\r\n};\r\n\r\nexport default Repeat;\r\n","import React, { useState, Children, ReactElement } from 'react';\nimport { Wrapper } from \"./GridSystem\";\nimport type { MotionUIProps } from '../types';\nimport { useEnterMotion } from '../../motion';\nimport { useTheme } from '../../Theme';\n\r\nexport type TabPosition = \"default\" | \"top\" | \"left\" | \"right\" | \"bottom\";\r\n\r\ninterface TabItemProps {\r\n label: React.ReactNode;\r\n children: React.ReactNode;\r\n}\r\n\r\ninterface TabLayoutProps {\r\n menu: React.ReactNode;\r\n content: React.ReactNode;\r\n}\r\n\r\ninterface TabProps extends MotionUIProps {\n children: React.ReactNode;\n defaultTab?: number;\n tabPosition?: TabPosition;\n}\n\r\nexport const TabLayouts: Record<TabPosition, (props: TabLayoutProps) => JSX.Element> = {\r\n default: ({menu, content}) => (\r\n <>\r\n <ul className=\"nav nav-tabs mb-2\">{menu}</ul>\r\n <div className=\"tab-content\">{content}</div>\r\n </>\r\n ),\r\n top: ({menu, content}) => (\r\n <>\r\n <ul className=\"nav nav-pills mb-2\">{menu}</ul>\r\n <div className=\"tab-content\">{content}</div>\r\n </>\r\n ),\r\n left: ({menu, content}) => (\r\n <div className=\"flex\">\r\n <ul className=\"nav nav-pills flex-col mr-2\">{menu}</ul>\r\n <div className=\"tab-content flex-fill\">{content}</div>\r\n </div>\r\n ),\r\n right: ({menu, content}) => (\r\n <div className=\"flex\">\r\n <div className=\"tab-content flex-fill\">{content}</div>\r\n <ul className=\"nav nav-pills flex-col ml-2\">{menu}</ul>\r\n </div>\r\n ),\r\n bottom: ({menu, content}) => (\r\n <>\r\n <div className=\"tab-content\">{content}</div>\r\n <ul className=\"nav nav-pills\">{menu}</ul>\r\n </>\r\n )\r\n};\r\n\r\n\r\nexport const TabItem: React.FC<TabItemProps> = () => null;\n\nconst TabPane = ({\n children,\n motion,\n}: {\n children: React.ReactNode;\n motion?: MotionUIProps['motion'];\n}) => {\n const theme = useTheme(\"tab\");\n const style = useEnterMotion(undefined, motion ?? theme.Tab.motion?.enter ?? 'fadeUp', theme.Tab.motion?.enter ?? 'fadeUp');\n\n return (\n <div className=\"tab-pane fade show active\" style={style}>\n {children}\n </div>\n );\n};\n\nconst Tab: React.FC<TabProps> = ({\n children,\r\n defaultTab = 0,\r\n tabPosition = \"default\",\r\n pre = undefined,\n post = undefined,\n wrapClass = undefined,\n className = undefined,\n motion = undefined\n}) => {\n const [active, setActive] = useState(defaultTab);\r\n \r\n const items = Children.toArray(children)\r\n .filter((child): child is ReactElement<TabItemProps> => \r\n React.isValidElement(child) && child.type === TabItem\r\n );\r\n\r\n const TabLayout = TabLayouts[tabPosition];\r\n\r\n return (\r\n <Wrapper className={wrapClass}>\r\n {pre}\r\n <div className={className}>\r\n <TabLayout\r\n menu={items.map((item, index) => (\r\n <li key={index} className=\"nav-item mr-1\">\r\n <button \r\n onClick={() => setActive(index)}\r\n className={`nav-link ${index === active ? 'active' : ''}`}\r\n >\r\n {item.props.label}\r\n </button>\r\n </li>\r\n ))}\r\n content={\n <TabPane key={active} motion={motion}>\n {items[active]?.props?.children}\n </TabPane>\n }\n />\n </div>\r\n {post}\r\n </Wrapper>\r\n );\r\n};\r\n\r\nexport default Tab;\r\n","import { useFormContext } from \"../widgets/Form\";\r\nimport React, {\r\n forwardRef,\r\n useEffect,\r\n useImperativeHandle,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\n\r\n// elemento dentro row\r\ntype RowItem = {\r\n id: string;\r\n fieldName: string;\r\n colStart: number; // colonna di partenza\r\n colSpan: number; // colonne occupate\r\n};\r\n\r\n// interfaccia del ref che il parent può usare\r\nexport type LayoutBuilderHandle = {\r\n getValue: () => RowItem[]; // Ti ritorna lo stato corrente\r\n setValue: (items: RowItem[]) => void; // Imposta da fuori una lista di items\r\n clear: () => void; // Svuota la row\r\n};\r\n\r\n// props componente\r\ntype Props = {\r\n name: string; // nome campo form\r\n defaultSpan?: number; // span default col drop\r\n heightPx?: number; // altezza row\r\n};\r\n\r\nconst MAX_COLS = 12;\r\nconst MAX_ITEMS = 12;\r\n\r\n// clippa un numero fra min e max per non uscire dalle 12 colonne\r\nconst clamp = (n: number, min: number, max: number) => Math.max(min, Math.min(max, n));\r\n\r\n// prende quello che arriva dal drag (es \"{workflow.nome_campo}\") e tira fuori \"nome_campo\"\r\nconst extractFieldName = (raw: string) => {\r\n if (!raw) return \"\";\r\n const cleaned = raw.trim().replace(/^\\{/, \"\").replace(/\\}$/, \"\").trim(); // tolgo { } e spazi\r\n const parts = cleaned.split(\".\");\r\n const last = parts[parts.length - 1];\r\n return (last || cleaned).trim();\r\n};\r\n\r\n/** Converte una coordinata X (clientX) in una colonna 0..11 */\r\nconst clientXToCol = (clientX: number, rowRect: DOMRect) => {\r\n const x = clientX - rowRect.left;\r\n const colWidth = rowRect.width / MAX_COLS;\r\n return clamp(Math.floor(x / colWidth), 0, MAX_COLS - 1);\r\n};\r\n\r\n/** Generatore id */\r\nconst uid = () => `${Date.now()}_${Math.random().toString(16).slice(2)}`;\r\n\r\nconst findFreeSpot = (desiredCol: number, span: number, items: RowItem[]): number | null => {\r\n const canPlaceAt = (start: number) => {\r\n const end = start + span; // esclusivo\r\n if (end > MAX_COLS) return false;\r\n\r\n // collisione se si sovrappone anche solo una colonna\r\n return !items.some((it) => {\r\n const a0 = start;\r\n const a1 = end;\r\n const b0 = it.colStart;\r\n const b1 = it.colStart + it.colSpan;\r\n return a0 < b1 && b0 < a1;\r\n });\r\n };\r\n\r\n for (let c = desiredCol; c <= MAX_COLS - span; c++) if (canPlaceAt(c)) return c;\r\n for (let c = 0; c <= MAX_COLS - span; c++) if (canPlaceAt(c)) return c;\r\n return null;\r\n};\r\n\r\nconst tryMoveItem = (items: RowItem[], itemId: string, targetCol: number) => {\r\n const current = items.find((i) => i.id === itemId);\r\n if (!current) return items;\r\n\r\n const others = items.filter((i) => i.id !== itemId);\r\n const start = clamp(targetCol, 0, MAX_COLS - current.colSpan);\r\n\r\n const free = findFreeSpot(start, current.colSpan, others);\r\n if (free === null) return items;\r\n\r\n return items.map((i) => (i.id === itemId ? { ...i, colStart: free } : i));\r\n};\r\n\r\nconst resizeItemToFit = (items: RowItem[], itemId: string, targetSpan: number) => {\r\n const current = items.find((i) => i.id === itemId);\r\n if (!current) return items;\r\n\r\n const others = items.filter((i) => i.id !== itemId);\r\n const maxSpanFromStart = MAX_COLS - current.colStart;\r\n let span = clamp(targetSpan, 1, maxSpanFromStart);\r\n\r\n const collides = (spanTry: number) => {\r\n const a0 = current.colStart;\r\n const a1 = current.colStart + spanTry;\r\n return others.some((it) => {\r\n const b0 = it.colStart;\r\n const b1 = it.colStart + it.colSpan;\r\n return a0 < b1 && b0 < a1;\r\n });\r\n };\r\n\r\n while (span > 1 && collides(span)) span--;\r\n if (collides(span)) return items; // anche 1 collide => non cambio\r\n\r\n return items.map((i) => (i.id === itemId ? { ...i, colSpan: span } : i));\r\n};\r\n\r\n/**\r\n * Se non c'è spazio, restringe \"l'elemento più vicino\" abbastanza (se possibile)\r\n * e ritorna: items aggiornati + start col dove inserire il nuovo.\r\n *\r\n * Strategia: scegli l'item più vicino alla col di drop (centro più vicino),\r\n * se quell'item ha abbastanza colSpan per liberare `needCols` (senza scendere sotto 1),\r\n * lo restringi \"a destra\" e metti il nuovo item nello spazio liberato (alla fine dell'item ristretto).\r\n */\r\nconst makeRoomByShrinkingNearest = (\r\n items: RowItem[],\r\n dropCol: number,\r\n needCols: number\r\n): { nextItems: RowItem[]; insertCol: number } | null => {\r\n if (needCols <= 0) return null;\r\n\r\n const candidates = items\r\n .map((it) => {\r\n const center = it.colStart + it.colSpan / 2;\r\n const dist = Math.abs(center - (dropCol + 0.5));\r\n return { it, dist };\r\n })\r\n .sort((a, b) => a.dist - b.dist)\r\n .map((x) => x.it);\r\n\r\n for (const it of candidates) {\r\n const canShrink = it.colSpan - 1; // non scendo sotto 1\r\n if (canShrink < needCols) continue;\r\n\r\n const newSpan = it.colSpan - needCols;\r\n const insertCol = it.colStart + newSpan;\r\n\r\n // insertCol..insertCol+needCols è dentro il vecchio spazio dell'item -> non collide con altri\r\n if (insertCol < 0 || insertCol + needCols > MAX_COLS) continue;\r\n\r\n const nextItems = items.map((x) => (x.id === it.id ? { ...x, colSpan: newSpan } : x));\r\n return { nextItems, insertCol };\r\n }\r\n\r\n return null;\r\n};\r\n\r\nexport const LayoutBuilder = forwardRef<LayoutBuilderHandle, Props>(\r\n ({ name, defaultSpan = 1, heightPx = 100 }, ref) => {\r\n const rowRef = useRef<HTMLDivElement | null>(null);\r\n\r\n const { value, handleChange } = useFormContext({ name, defaultValue: [] });\r\n const items: RowItem[] = Array.isArray(value) ? value : [];\r\n\r\n const setItems = (updater: RowItem[] | ((prev: RowItem[]) => RowItem[])) => {\r\n const prev = items;\r\n const next = typeof updater === \"function\" ? (updater as any)(prev) : updater;\r\n handleChange({ target: { name, value: next } });\r\n };\r\n\r\n // Drag interno: quale item sto spostando\r\n const [draggingId, setDraggingId] = useState<string | null>(null);\r\n\r\n // Resize: quale item sto ridimensionando\r\n const [resizing, setResizing] = useState<{\r\n id: string;\r\n startClientX: number;\r\n startSpan: number;\r\n } | null>(null);\r\n\r\n // Messaggi (es. se già 12 elementi)\r\n const [notice, setNotice] = useState<string>(\"\");\r\n const noticeTimerRef = useRef<number | null>(null);\r\n const showNotice = (msg: string) => {\r\n setNotice(msg);\r\n if (noticeTimerRef.current) window.clearTimeout(noticeTimerRef.current);\r\n noticeTimerRef.current = window.setTimeout(() => setNotice(\"\"), 2500);\r\n };\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (noticeTimerRef.current) window.clearTimeout(noticeTimerRef.current);\r\n };\r\n }, []);\r\n\r\n // Espongo metodi al parent\r\n useImperativeHandle(ref, () => ({\r\n getValue: () => items,\r\n setValue: (newItems) => setItems(newItems),\r\n clear: () => setItems([]),\r\n }));\r\n\r\n // Righe verticali per far capire le 12 colonne\r\n const gridLines = useMemo(() => Array.from({ length: MAX_COLS }, (_, i) => i), []);\r\n\r\n // DRAG & DROP: quando trascini una cosa sopra la row, serve permettere il drop\r\n const handleDragOverRow = (e: React.DragEvent) => {\r\n e.preventDefault(); // senza questo, il drop non funziona\r\n };\r\n\r\n // DRAG & DROP: quando lasci cadere un elemento nella row\r\n const handleDropOnRow = (e: React.DragEvent) => {\r\n e.preventDefault();\r\n\r\n const internalId = e.dataTransfer.getData(\"application/x-layoutbuilder-internal\");\r\n if (internalId) {\r\n setDraggingId(null);\r\n return;\r\n }\r\n\r\n // limite massimo: 12 elementi\r\n if (items.length >= MAX_ITEMS) {\r\n showNotice(\"Hai già 12 elementi nella row: rimuovine uno prima di aggiungerne un altro.\");\r\n return;\r\n }\r\n\r\n const rowEl = rowRef.current;\r\n if (!rowEl) return;\r\n\r\n const rowRect = rowEl.getBoundingClientRect();\r\n const dropCol = clientXToCol(e.clientX, rowRect);\r\n\r\n // Leggo label dall’oggetto trascinato\r\n const raw = e.dataTransfer.getData(\"text/plain\") || e.dataTransfer.getData(\"label\") || \"\";\r\n const fieldName = extractFieldName(raw) || \"unknown\";\r\n\r\n const span = clamp(defaultSpan, 1, MAX_COLS);\r\n const desiredStart = clamp(dropCol, 0, MAX_COLS - span);\r\n\r\n // 1) Provo normale: metto in uno spot libero\r\n const free = findFreeSpot(desiredStart, span, items);\r\n if (free !== null) {\r\n setItems((prev) => [...prev, { id: uid(), fieldName, colStart: free, colSpan: span }]);\r\n return;\r\n }\r\n\r\n // 2) Se pieno (nessun buco), restringo l'elemento più vicino e inserisco sempre\r\n const room = makeRoomByShrinkingNearest(items, dropCol, span);\r\n if (!room) {\r\n // Caso raro: nessun item ha abbastanza span per liberare `span` colonne senza scendere sotto 1\r\n showNotice(\"Nessuno spazio: non posso restringere abbastanza gli elementi per inserire questo campo.\");\r\n return;\r\n }\r\n\r\n setItems((prev) => {\r\n // ricalcolo su prev per sicurezza\r\n if (prev.length >= MAX_ITEMS) {\r\n showNotice(\"Hai già 12 elementi nella row: rimuovine uno prima di aggiungerne un altro.\");\r\n return prev;\r\n }\r\n\r\n const roomPrev = makeRoomByShrinkingNearest(prev, dropCol, span);\r\n if (!roomPrev) {\r\n showNotice(\"Nessuno spazio: non posso restringere abbastanza gli elementi per inserire questo campo.\");\r\n return prev;\r\n }\r\n\r\n const newItem: RowItem = {\r\n id: uid(),\r\n fieldName,\r\n colStart: roomPrev.insertCol,\r\n colSpan: span,\r\n };\r\n return [...roomPrev.nextItems, newItem];\r\n });\r\n };\r\n\r\n // DRAG INTERNO: inizio a trascinare un box già dentro la row\r\n const handleItemDragStart = (id: string) => (e: React.DragEvent) => {\r\n setDraggingId(id);\r\n e.dataTransfer.setData(\"application/x-layoutbuilder-internal\", id);\r\n e.dataTransfer.effectAllowed = \"move\";\r\n };\r\n\r\n // DRAG INTERNO: durante il drag sopra la row, aggiorno la posizione a “snap”\r\n const handleRowDragOver = (e: React.DragEvent) => {\r\n e.preventDefault();\r\n if (!draggingId) return;\r\n\r\n const rowEl = rowRef.current;\r\n if (!rowEl) return;\r\n const rect = rowEl.getBoundingClientRect();\r\n const col = clientXToCol(e.clientX, rect);\r\n\r\n setItems((prev) => tryMoveItem(prev, draggingId, col));\r\n };\r\n\r\n // DRAG INTERNO: stop drag\r\n const handleRowDragEnd = () => setDraggingId(null);\r\n\r\n // RESIZE: mouse down sulla maniglia (inizio ridimensionamento)\r\n const handleResizeMouseDown = (id: string) => (e: React.MouseEvent) => {\r\n e.stopPropagation();\r\n e.preventDefault();\r\n\r\n const it = items.find((x) => x.id === id);\r\n if (!it) return;\r\n\r\n setResizing({\r\n id,\r\n startClientX: e.clientX,\r\n startSpan: it.colSpan,\r\n });\r\n };\r\n\r\n // RESIZE: mentre muovo il mouse, trasformo deltaX in deltaColonne\r\n const handleMouseMove = (e: React.MouseEvent) => {\r\n if (!resizing) return;\r\n const rowEl = rowRef.current;\r\n if (!rowEl) return;\r\n\r\n const rect = rowEl.getBoundingClientRect();\r\n const colWidth = rect.width / MAX_COLS;\r\n\r\n const deltaX = e.clientX - resizing.startClientX;\r\n const deltaCols = Math.round(deltaX / colWidth);\r\n\r\n const targetSpan = resizing.startSpan + deltaCols;\r\n setItems((prev) => resizeItemToFit(prev, resizing.id, targetSpan));\r\n };\r\n\r\n // RESIZE: stop ridimensionamento\r\n const handleMouseUp = () => {\r\n if (resizing) setResizing(null);\r\n };\r\n\r\n // Rimuovi item\r\n const removeItem = (id: string) => setItems((prev) => prev.filter((i) => i.id !== id));\r\n\r\n return (\r\n <div onMouseMove={handleMouseMove} onMouseUp={handleMouseUp} onMouseLeave={handleMouseUp}>\r\n {/* Messaggio */}\r\n {notice && (\r\n <div\r\n style={{\r\n marginBottom: 8,\r\n padding: \"8px 10px\",\r\n borderRadius: 10,\r\n border: \"1px solid rgba(255,255,255,0.15)\",\r\n background: \"rgba(255,255,255,0.04)\",\r\n fontSize: 12,\r\n opacity: 0.95,\r\n }}\r\n >\r\n {notice}\r\n </div>\r\n )}\r\n\r\n {/* ROW: area droppabile + griglia 12 colonne */}\r\n <div\r\n ref={rowRef}\r\n onDragOver={(e) => {\r\n // Permetto sia il drop esterno sia il drag interno\r\n handleDragOverRow(e);\r\n handleRowDragOver(e);\r\n }}\r\n onDrop={handleDropOnRow}\r\n onDragEnd={handleRowDragEnd}\r\n style={{\r\n position: \"relative\",\r\n height: heightPx,\r\n borderRadius: 12,\r\n border: \"2px dashed rgba(255, 255, 255, 0.25)\",\r\n background: \"rgba(0,0,0,0.02)\",\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n {/* Linee griglia */}\r\n {gridLines.map((i) => (\r\n <div\r\n key={i}\r\n style={{\r\n position: \"absolute\",\r\n top: 0,\r\n bottom: 0,\r\n left: `${(i / MAX_COLS) * 100}%`,\r\n width: 1,\r\n background: \"rgba(255, 255, 255, 0.06)\",\r\n pointerEvents: \"none\",\r\n }}\r\n />\r\n ))}\r\n\r\n {/* Items posizionati a colonne */}\r\n {items.map((it) => (\r\n <div\r\n key={it.id}\r\n draggable\r\n onDragStart={handleItemDragStart(it.id)}\r\n style={{\r\n position: \"absolute\",\r\n top: 12,\r\n bottom: 12,\r\n left: `${(it.colStart / MAX_COLS) * 100}%`,\r\n width: `${(it.colSpan / MAX_COLS) * 100}%`,\r\n padding: 10,\r\n borderRadius: 12,\r\n border: \"1px solid rgba(255, 255, 255, 0.18)\",\r\n boxShadow: \"0 1px 2px rgba(0,0,0,0.06)\",\r\n cursor: draggingId === it.id ? \"grabbing\" : \"grab\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n userSelect: \"none\",\r\n }}\r\n title=\"Trascina per spostare\"\r\n >\r\n {/* Testo centrale */}\r\n <div style={{ fontSize: 10, fontWeight: 400, opacity: 0.9 }}>{it.fieldName}</div>\r\n\r\n {/* Bottone remove (in alto a destra) */}\r\n <button\r\n type=\"button\"\r\n onClick={() => removeItem(it.id)}\r\n style={{\r\n position: \"absolute\",\r\n border: \"none\",\r\n top: 3,\r\n right: 3,\r\n color: \"white\",\r\n background: \"rgba(255, 255, 255, 0.03)\",\r\n fontSize: 12,\r\n cursor: \"pointer\",\r\n }}\r\n title=\"Rimuovi\"\r\n >\r\n ×\r\n </button>\r\n\r\n {/* Maniglia resize */}\r\n <div\r\n onMouseDown={handleResizeMouseDown(it.id)}\r\n style={{\r\n position: \"absolute\",\r\n right: 4,\r\n top: \"50%\",\r\n transform: \"translateY(-50%)\",\r\n width: 10,\r\n height: 30,\r\n borderRadius: 6,\r\n background: \"rgba(255, 255, 255, 0.12)\",\r\n cursor: \"ew-resize\",\r\n }}\r\n title=\"Trascina per ridimensionare\"\r\n />\r\n </div>\r\n ))}\r\n\r\n {/* se vuoto */}\r\n {items.length === 0 && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n pointerEvents: \"none\",\r\n }}\r\n >\r\n Trascina un elemento qui dentro\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n);\r\n","import React, { useState, ChangeEvent, DragEvent } from 'react';\r\nimport Papa, { ParseResult } from 'papaparse';\r\nimport { Wrapper } from '../GridSystem';\r\nimport { Icon, normalizeKey, UIProps } from '../../..';\r\nimport { cn } from '../../../libs/cn';\r\nimport { smartTypeCast } from '../../../libs/utils';\r\n\r\nexport type UploadCSVCell = string | null | undefined;\nexport interface UploadCSVRow {\n [key: string]: UploadCSVCell;\n}\nexport interface UploadCSVData {\n data: UploadCSVRow[];\n fields: string[];\n file: File;\n}\nexport type UploadCSVParseField = [key: string, value: UploadCSVCell];\nexport type UploadCSVDataLoadedHandler = (results: UploadCSVData) => void;\nexport type UploadCSVParseFieldHandler = (field: UploadCSVParseField) => UploadCSVParseField | undefined;\n\ninterface UploadCSVProps extends UIProps {\n name: string;\n onDataLoaded: UploadCSVDataLoadedHandler;\n onParseField?: UploadCSVParseFieldHandler;\n label?: string;\r\n icon?: string;\r\n delimiter?: string;\r\n normalizeKeys?: boolean;\r\n removeEmptyFields?: boolean;\r\n}\r\n\r\nexport const UploadCSV: React.FC<UploadCSVProps> = ({\r\n name,\r\n onDataLoaded,\r\n onParseField = undefined,\r\n label = undefined,\r\n icon = \"upload\",\r\n delimiter = undefined,\r\n normalizeKeys = false,\r\n removeEmptyFields = false,\r\n pre = undefined,\r\n post = undefined,\r\n wrapClass = undefined,\r\n className = undefined,\r\n}) => {\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const sanitizeField = ([key, value]: UploadCSVParseField) => {\n if ([\"\", null, undefined].includes(key)) return;\r\n if (value === undefined) return;\r\n if (removeEmptyFields && [\"\", null].includes(value)) return;\r\n if (normalizeKeys) key = normalizeKey(key);\r\n if (onParseField) return onParseField([key, value]);\n return [key.trim(), smartTypeCast(value)] as UploadCSVParseField;\n }\r\n\r\n const handleFile = (file: File | null) => {\r\n if (!file) return;\r\n \r\n Papa.parse(file, {\r\n header: true,\r\n skipEmptyLines: true,\r\n delimiter: delimiter,\r\n dynamicTyping: false,\r\n complete: (results: ParseResult<UploadCSVRow>) => {\n setError(null);\r\n onDataLoaded({\r\n data: results.data.map(item =>\r\n Object.fromEntries(\r\n Object.entries(item).reduce<UploadCSVParseField[]>((acc, [k, v]) => {\n const sanitizedField = sanitizeField([k, v]);\r\n if (sanitizedField) acc.push(sanitizedField);\r\n return acc;\r\n }, [])\r\n )\r\n ), \r\n fields: (results.meta?.fields || []).reduce<string[]>((acc, field) => {\r\n if (!field) return acc;\r\n acc.push(normalizeKeys ? normalizeKey(field) : field);\r\n return acc;\r\n }, []), \r\n file: file\r\n });\r\n },\r\n error: (err: any) => {\r\n setError(err.message);\r\n },\r\n });\r\n };\r\n\r\n const handleFileChange = (event: ChangeEvent<HTMLInputElement>) => {\r\n const file = event.target.files?.[0] ?? null;\r\n file && handleFile(file);\r\n };\r\n\r\n // Drag & drop handlers\r\n const handleDragOver = (event: DragEvent<HTMLDivElement>) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n };\r\n\r\n const handleDrop = (event: DragEvent<HTMLDivElement>) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n const file = event.dataTransfer.files?.[0] ?? null;\r\n handleFile(file);\r\n };\r\n\r\n const handleDragLeave = (event: DragEvent<HTMLDivElement>) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n };\r\n\r\n return (\r\n <Wrapper className={wrapClass}>\r\n {pre}\r\n <div\r\n data-name={name}\r\n className={cn(\"fileinput-button\", className)}\r\n onDragOver={handleDragOver}\r\n onDrop={handleDrop}\r\n onDragLeave={handleDragLeave}\r\n >\r\n <input\r\n type=\"file\"\r\n onChange={handleFileChange}\r\n accept=\".csv,.tsv,text/csv,text/plain\"\r\n />\r\n <Icon name={icon} label={label || \"Drag or click to upload\"} />\r\n </div>\r\n\r\n {error && <p style={{ color: 'red' }}>Errore: {error}</p>}\r\n {post}\r\n </Wrapper>\r\n );\r\n};\r\n\r\n","import React from 'react';\r\nimport {RecordProps} from \"../providers/data/DataProvider\";\r\nimport { FormRef, ChangeHandler } from './widgets/Form';\r\nimport { getRecordValue } from '../libs/utils';\r\n\r\ntype FormProps = {\r\n name?: string;\r\n value?: any;\r\n onChange?: (event: ChangeHandler) => void;\r\n dataStoragePath?: string;\r\n};\r\n\r\ninterface EnhancerProps {\r\n record?: RecordProps;\r\n handleChange?: (event: ChangeHandler) => void;\r\n parentName?: string;\r\n dataStoragePath?: string;\r\n formRef?: React.Ref<FormRef>;\r\n wrapClass?: string;\r\n}\r\ninterface FormEnhancerProps extends EnhancerProps {\r\n components: React.ReactNode;\r\n}\r\n\r\ninterface ApplyOnChangeProps extends EnhancerProps {\r\n children: React.ReactNode;\r\n};\r\n\r\nconst checkForwardRef = (type: any) =>\r\n typeof type === \"object\" && type !== null && type.$$typeof === Symbol.for(\"react.forward_ref\");\r\n\r\nconst applyRef = (child: React.ReactNode, formRef: React.Ref<FormRef>): React.ReactNode => {\r\n if (!React.isValidElement(child)) return child;\r\n\r\n const {type, props} = child;\r\n const isForwardRef = checkForwardRef(type);\r\n\r\n if (isForwardRef) {\r\n console.log(\"APPLY REF\", child, formRef);\r\n return React.cloneElement(child as any, { ref: formRef });\r\n }\r\n if (props.children) {\r\n return React.cloneElement(child as any, {\r\n children: applyRef(props.children, formRef)\r\n });\r\n }\r\n\r\n return child;\r\n}\r\n\r\n\r\n\r\n\r\nconst applyOnChangeRecursive = ({\r\n children,\r\n record,\r\n handleChange,\r\n parentName = undefined,\r\n dataStoragePath = undefined,\r\n formRef = undefined,\r\n wrapClass = undefined\r\n }: ApplyOnChangeProps): React.ReactNode => {\r\n return React.Children.map(children, (child) => { \r\n console.log(\"SIAMO TUTTI\", child);\r\n\r\n if (!React.isValidElement(child)) return child;\r\n\r\n const {type, props} = child;\r\n const name = props.name;\r\n const onChange = handleChange && ((event: ChangeHandler) => {\r\n console.log(\"ONCHANGE\", parentName, name, event, record);\r\n props.onChange?.(event);\r\n handleChange?.(event);\r\n });\r\n \r\n if ((type as any)?.__form) {\r\n console.log(\"ENHANCE\", child, record, parentName, name, (name ? record?.[name] : record) ?? props.value ?? undefined);\r\n\r\n return React.cloneElement(child as any, {\r\n wrapClass: `${wrapClass}${props.wrapClass ? ' ' + props.wrapClass : ''}`,\r\n name: parentName ? `${parentName}.${name}` : name,\r\n value: record?.[name] ?? record ?? props.value ?? undefined,\r\n dataStoragePath: props.dataStoragePath ?? dataStoragePath ?? undefined,\r\n onChange,\r\n ...(checkForwardRef(type) ? {ref: formRef} : {}),\r\n });\r\n }\r\n\r\n if (props.children) {\r\n return React.cloneElement(child as any, {\r\n children: applyOnChangeRecursive({\r\n children: props.children,\r\n record,\r\n handleChange,\r\n parentName,\r\n dataStoragePath,\r\n formRef,\r\n wrapClass\r\n }),\r\n });\r\n }\r\n\r\n const value = getRecordValue(record, name);\r\n if (name && value === undefined) {\r\n console.warn(`The property \"${name}\" is not present in the record`, child);\r\n }\r\n if(name) {\r\n console.log(\"CLONE ELEMENT\", child, parentName, name, record, record?.[name]);\r\n }\r\n return React.cloneElement(child as any, props.onChange || name\r\n ? {\r\n wrapClass: `${wrapClass}${props.wrapClass ? ' ' + props.wrapClass : ''}`,\r\n name: parentName ? `${parentName}.${name}` : name,\r\n value: value ?? props.value ?? undefined,\r\n onChange\r\n }\r\n : {\r\n className: `${wrapClass}${props.className ? ' ' + props.className : ''}`,\r\n });\r\n });\r\n};\r\n\r\nconst FormEnhancer = ({\r\n components,\r\n record,\r\n handleChange,\r\n parentName = undefined,\r\n dataStoragePath = undefined,\r\n formRef = undefined,\r\n wrapClass = 'mb-3'\r\n}: FormEnhancerProps ) => {\r\n const children = Array.isArray(components) ? components : [components];\r\n\r\n return (\r\n <>\r\n {applyOnChangeRecursive({children, record, handleChange, parentName, dataStoragePath, formRef, wrapClass})}\r\n </>\r\n );\r\n}\r\n\r\nexport function extractComponentProps<T>(\r\n components: React.ReactNode | React.ReactNode[],\r\n onEnhance: (props: {[key: string]: any}) => T\r\n): T[] { \r\n const children = Array.isArray(components) ? components : [components];\r\n const result: T[] = [];\r\n\r\n const extractRecursive = (nodes: React.ReactNode) => {\r\n React.Children.forEach(nodes, (child) => {\r\n if (!React.isValidElement(child)) return;\r\n\r\n const {props} = child;\r\n if (props.name) {\r\n result.push(onEnhance(props));\r\n } else if (props.children) {\r\n extractRecursive(props.children);\r\n }\r\n });\r\n };\r\n\r\n extractRecursive(children);\r\n return result;\r\n}\r\n\r\n\r\nexport function asForm<P extends FormProps>(\r\n Component: React.ComponentType<P>\r\n ): React.ComponentType<P> {\r\n (Component as any).__form = true;\r\n return Component;\r\n }\r\n\r\n\r\nexport default FormEnhancer;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { Label, ListGroup, TextArea } from './Input';\r\nimport { ActionButton, LoadingButton } from '../Buttons';\r\nimport { getPrompt, PROMPTS, setPrompt } from '../../../conf/Prompt';\r\nimport fetchAI from '../../../providers/ai';\r\nimport FormEnhancer from '../../FormEnhancer';\r\nimport Loader from '../Loader';\r\nimport Carousel from '../../blocks/Carousel';\r\nimport Card from '../Card';\r\nimport { UIProps, Wrapper } from '../../index';\r\n\r\ntype PromptKey = keyof typeof PROMPTS;\r\n\r\ninterface OutlineItem {\r\n headline: string;\r\n subheadings: string[];\r\n}\r\n\r\ntype ResponseItem =\r\n | { Title: string }\r\n | { Description: string }\r\n | { outline: OutlineItem[] };\r\n\r\ninterface AssistantAIProps extends UIProps {\r\n name: string;\r\n promptTopic: { prompt: string; label: string };\r\n configVariables: { lang: string; voice: string; style: string; limit: string };\r\n initialValue?: string;\r\n children?: React.ReactNode;\r\n onChange: (e: any) => void;\r\n viewMode?: 'list' | 'carousel';\r\n autoStart?: boolean;\r\n onReset?: () => void;\r\n}\r\n\r\n/* Pulisce e formatta il testo selezionato dalla risposta AI */\r\nconst cleanSelectedText = (selectedText: string): string => {\r\n return selectedText\r\n .replace(/^Outline \\d+:\\s*\\n*/i, '')\r\n .replace(/([•\\-]\\s*[^\\n]+)/g, '$1\\n')\r\n .trim();\r\n}\r\n\r\n/* Restituisce il contenuto formattato per la visualizzazione in base alla viewMode */\r\nconst getResponseContent = (response: ResponseItem, viewMode: 'list' | 'carousel'): React.ReactNode => {\r\n if (viewMode === 'carousel') {\r\n if ('outline' in response && Array.isArray(response.outline)) {\r\n console.log(response)\r\n const formatted = response.outline.map(section => {\r\n const subs = section.subheadings.map(sub => ` - ${sub}`).join('\\n');\r\n return `Heading: ${section.headline}\\n${subs}`;\r\n }).join('\\n\\n');\r\n return formatted.split('\\n').map((line, i) => <div key={i}>{line}</div>);\r\n } else if ('Title' in response) {\r\n return response.Title;\r\n } else if ('Description' in response) {\r\n return response.Description;\r\n }\r\n return '[Nessun valore]';\r\n } else {\r\n const firstValue = Object.values(response).find(value => typeof value === 'string');\r\n return (firstValue as string) ?? '[Nessun valore]';\r\n }\r\n}\r\n\r\nconst AssistantAI = ({\r\n name,\r\n promptTopic,\r\n configVariables,\r\n initialValue,\r\n children,\r\n onChange = () => { },\r\n viewMode = 'list',\r\n autoStart = false,\r\n onReset = undefined,\r\n pre = undefined,\r\n post = undefined,\r\n wrapClass = undefined,\r\n className = undefined\r\n}: AssistantAIProps) => {\r\n /* const { prompt, label } = getPrompt(promptTopic); */\r\n const [userInput, setUserInput] = useState<string>(initialValue ?? '');\r\n const [responsesAI, setResponsesAI] = useState<ResponseItem[]>([]);\r\n const [selectedResponse, setSelectedResponse] = useState<string>('');\r\n const [isLoading, setIsLoading] = useState<boolean>(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const fetch = fetchAI();\r\n\r\n useEffect(() => {\r\n if (initialValue && autoStart) {\r\n handleInput();\r\n }\r\n }, [initialValue, autoStart])\r\n\r\n const handleInput = async () => {\r\n setResponsesAI([]);\r\n setSelectedResponse('');\r\n setIsLoading(true);\r\n setError(null);\r\n onReset?.();\r\n\r\n try {\r\n const finalPrompt = setPrompt(promptTopic.prompt, configVariables, userInput);\r\n const response = await fetch(finalPrompt, {\r\n model: 'gpt-5.2',\r\n temperature: 0.7\r\n });\r\n\r\n if (!response) {\r\n throw new Error('Failed to get response');\r\n }\r\n\r\n handleResponsesAI(response);\r\n\r\n } catch (err) {\r\n setError('Failed to generate content. Please try again.');\r\n console.error('AI Error:', err);\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n }\r\n\r\n // gestione risposte AI\r\n const handleResponsesAI = (response: any) => {\r\n let outputArray: any[] = [];\r\n\r\n // single object\r\n if (!Array.isArray(response) && typeof response === 'object') {\r\n if (response.output) {\r\n outputArray = Array.isArray(response.output) ? response.output : [response.output];\r\n } else {\r\n setSelectedResponse(response);\r\n onChange(response);\r\n setIsLoading(false);\r\n return;\r\n }\r\n } else {\r\n // array\r\n outputArray = Array.isArray(response) ? response : [response];\r\n }\r\n\r\n setResponsesAI(outputArray);\r\n }\r\n\r\n // gestione selezione risposta\r\n const handleSelectedResponse = (e: React.MouseEvent, index?: number) => {\r\n const selectedText = e.currentTarget.textContent || '';\r\n const cleanedText = cleanSelectedText(selectedText);\r\n let selectedElement: string | {} = selectedText;\r\n if (index !== undefined) {\r\n const response = responsesAI[index];\r\n selectedElement = 'outline' in response ? response.outline : selectedText;\r\n }\r\n setSelectedResponse(cleanedText);\r\n onChange(selectedElement);\r\n }\r\n\r\n return (\r\n <Wrapper className={wrapClass}>\r\n {pre}\r\n <Card\r\n title={name}\r\n className={`my-3 ${className}`}\r\n header={\r\n <div className='flex justify-end items-center gap-2'>\r\n {isLoading && <Loader>Thinking...</Loader>}\r\n {error && <span className='text-danger'>{error}</span>}\r\n {(selectedResponse || responsesAI.length > 0 || error) && <ActionButton icon='arrow-clockwise' onClick={handleInput} />}\r\n </div>\r\n }\r\n >\r\n\r\n {(!autoStart || !initialValue) && !selectedResponse && !error && <TextArea\r\n name='inputUser'\r\n label={promptTopic.label}\r\n value={initialValue ?? userInput}\r\n onChange={({value}) => setUserInput(value)}\r\n post={<LoadingButton\r\n icon='robot'\r\n onClick={handleInput}\r\n disabled={userInput ? false : true}\r\n />}\r\n wrapClass='my-3'\r\n />}\r\n\r\n {responsesAI?.length > 0 && !selectedResponse && !error && (\r\n viewMode === 'carousel' ? (\r\n <Carousel>\r\n {responsesAI.map((response, index) => {\r\n const lines = getResponseContent(response, viewMode);\r\n // lines deve essere un array di stringhe\r\n return (\r\n <>\r\n Outline {index + 1}\r\n <ListGroup\r\n key={index}\r\n data-index={index}\r\n className=\"carousel-item-content\"\r\n onClick={(event) => handleSelectedResponse(event, index)}\r\n >\r\n {Array.isArray(lines)\r\n ? lines.map((line, i) => (line))\r\n : [{ lines }]\r\n }\r\n </ListGroup>\r\n </>\r\n );\r\n })}\r\n </Carousel>\r\n ) : (\r\n <ListGroup onClick={handleSelectedResponse}>\r\n {responsesAI.map((response, index) => getResponseContent(response, viewMode))}\r\n </ListGroup>\r\n )\r\n )}\r\n {selectedResponse && !error &&\r\n <FormEnhancer\r\n components={children}\r\n record={{ [name]: selectedResponse }}\r\n />\r\n }\r\n </Card>\r\n {post}\r\n </Wrapper>\r\n )\r\n}\r\n\r\nexport default AssistantAI;\r\n","import { useEffect, useMemo, useState } from \"react\";\nimport { type DatabaseOptions, type RecordArray, type RecordProps } from \"../../../providers/data/DataProvider\";\nimport { useDataProvider } from \"../../../providers/data/DataProviderContext\";\n\ntype UseGridDBRecordsArgs = {\n path?: string;\n where?: DatabaseOptions[\"where\"];\n order?: DatabaseOptions[\"order\"];\n fieldMap?: DatabaseOptions[\"fieldMap\"];\n onLoad?: DatabaseOptions[\"onLoad\"];\n};\n\nfunction useGridDBRecords<TRecord extends RecordProps>({\n path,\n where,\n order,\n fieldMap,\n onLoad,\n}: UseGridDBRecordsArgs) {\n const db = useDataProvider();\n const [records, setRecords] = useState<RecordArray>([]);\n const options = useMemo<DatabaseOptions | undefined>(() => {\n if (!where && !order && !fieldMap && !onLoad) return undefined;\n return { where, order, fieldMap, onLoad };\n }, [fieldMap, onLoad, order, where]);\n\n useEffect(() => {\n return db.subscribe(path, setRecords, options);\n }, [db, options, path]);\n\n return records as TRecord[];\n}\n\nexport default useGridDBRecords;\n","export function resolveGridPathFromUrl(pathname: string): string | undefined {\n if (!pathname) return undefined;\n return pathname;\n}\n","import React from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { type RecordProps } from \"../../../providers/data/DataProvider\";\nimport GridCore from \"./GridCore\";\nimport { type GridDBProps } from \"./types\";\nimport useGridDBRecords from \"./useGridDBRecords\";\nimport { resolveGridPathFromUrl } from \"./resolveGridPathFromUrl\";\n\nfunction GridDB<TRecord extends RecordProps = RecordProps>({\n path,\n where,\n order,\n fieldMap,\n onLoad,\n recordId = \"_key\" as keyof TRecord,\n ...rest\n}: GridDBProps<TRecord>) {\n const location = useLocation();\n const resolvedPath = path === \"fromUrl\"\n ? resolveGridPathFromUrl(location.pathname)\n : path;\n const records = useGridDBRecords<TRecord>({ path: resolvedPath, where, order, fieldMap, onLoad });\n const providerOrder = React.useMemo(() => {\n if (!order) return undefined;\n const firstEntry = Object.entries(order)[0];\n if (!firstEntry) return undefined;\n const [field, dir] = firstEntry;\n return { field, dir };\n }, [order]);\n const resolvedSortable = rest.sortable === undefined || rest.sortable === true\n ? (providerOrder ?? rest.sortable)\n : rest.sortable;\n\n return (\n <GridCore\n {...rest}\n records={records}\n recordId={recordId}\n sourcePath={resolvedPath}\n sortable={resolvedSortable}\n />\n );\n}\n\nexport default GridDB;\n","import React from \"react\";\nimport { converter } from \"../../../libs/converter\";\nimport { getRecordValue } from \"../../../libs/utils\";\nimport { type OrderConfig } from \"../../../libs/order\";\nimport { type RecordProps } from \"../../../providers/data/DataProvider\";\nimport { extractComponentProps } from \"../../FormEnhancer\";\nimport {\n type GridAction,\n type GridActions,\n type GridCellContext,\n type GridColumn,\n type GridFormat,\n type GridRecordKey,\n} from \"./types\";\n\nexport const isExternalUrl = (value: string) => /^https?:\\/\\//i.test(value);\n\nexport const sanitizeHashPart = (value: string) => value.replace(/[^a-zA-Z0-9_-]/g, \"-\").replace(/-+/g, \"-\").replace(/^-|-$/g, \"\");\n\nexport const getRecordKeyResolver = <TRecord extends RecordProps>(recordId: GridRecordKey<TRecord>) => {\n return (record: TRecord) => {\n if (typeof recordId === \"function\") return String(recordId(record));\n const value = record[recordId];\n if (value == null || value === \"\") return \"\";\n return String(value);\n };\n};\n\nconst formatValue = (format: GridFormat | undefined, value: unknown) => {\n if (format == null || format === \"text\") return value as React.ReactNode;\n if (format === \"boolean\") return value ? \"Yes\" : \"No\";\n if (format === \"json\") return value == null ? \"\" : JSON.stringify(value, null, 2);\n if (format === \"badge\") return value as React.ReactNode;\n if (format === \"image\") return value as React.ReactNode;\n if (format === \"email\") return value as React.ReactNode;\n\n const converterKey = format === \"datetime\" ? \"dateTime\" : format;\n const formatter = (converter as Record<string, ((value: unknown) => React.ReactNode) | undefined>)[converterKey];\n return formatter ? formatter(value) : value as React.ReactNode;\n};\n\nexport const buildDisplayRecords = <TRecord extends RecordProps>(\n records: TRecord[],\n columns: GridColumn<TRecord>[],\n runAction: (actionKey: string, record?: TRecord) => void\n) => {\n return records.map((record, rowIndex) => {\n const displayRecord: RecordProps = { ...record, _index: rowIndex };\n\n for (const column of columns) {\n const columnKey = String(column.key);\n const value = getRecordValue(record, columnKey);\n const context: GridCellContext<TRecord> = {\n record,\n value,\n key: columnKey,\n rowIndex,\n runAction: (actionKey: string) => runAction(actionKey, record),\n };\n displayRecord[columnKey] = typeof column.render === \"function\"\n ? column.render(context)\n : formatValue(column.render, value);\n }\n\n return displayRecord as TRecord;\n });\n};\n\nconst defaultHeader = <TRecord extends RecordProps>(key: string): GridColumn<TRecord> => ({\n key,\n label: converter.toCamel(key, \" \"),\n sortable: true,\n});\n\nexport const inferColumns = <TRecord extends RecordProps>(\n columns: GridColumn<TRecord>[] | undefined,\n records: TRecord[],\n form: React.ReactElement | ((ctx: any) => React.ReactNode) | undefined\n) => {\n if (columns?.length) return columns;\n if (React.isValidElement(form)) {\n return extractComponentProps(form, (props) => defaultHeader<TRecord>(props.name));\n }\n const firstRecord = records[0];\n if (!firstRecord) return [];\n\n return Object.entries(firstRecord).reduce<GridColumn<TRecord>[]>((acc, [key, value]) => {\n if (key.startsWith(\"_\")) return acc;\n if (React.isValidElement(value) || typeof value !== \"object\" || Array.isArray(value)) {\n acc.push(defaultHeader<TRecord>(key));\n }\n return acc;\n }, []);\n};\n\nexport const normalizeActions = <TRecord extends RecordProps>(\n actions: GridActions<TRecord> | undefined,\n hasForm: boolean\n): Record<string, GridAction<TRecord>> => {\n if (Array.isArray(actions)) {\n return actions.reduce<Record<string, GridAction<TRecord>>>((acc, actionKey) => {\n if (actionKey === \"delete\") {\n acc[actionKey] = { kind: \"delete\" };\n } else {\n acc[actionKey] = { kind: \"modal\" };\n }\n return acc;\n }, {});\n }\n\n if (!actions) {\n return hasForm\n ? {\n add: { kind: \"modal\" },\n edit: { kind: \"modal\" },\n delete: { kind: \"delete\" },\n }\n : {};\n }\n\n return Object.entries(actions).reduce<Record<string, GridAction<TRecord>>>((acc, [key, value]) => {\n if (value) acc[key] = value;\n return acc;\n }, {});\n};\n\nexport const isActionVisible = <TRecord extends RecordProps>(action: GridAction<TRecord> | undefined, record?: TRecord) => {\n if (!action?.visible) return true;\n return typeof action.visible === \"function\" ? action.visible(record) : action.visible;\n};\n\nexport const isActionDisabled = <TRecord extends RecordProps>(action: GridAction<TRecord> | undefined, record?: TRecord) => {\n if (!action?.disabled) return false;\n return typeof action.disabled === \"function\" ? action.disabled(record) : action.disabled;\n};\n\nexport const getActionLabel = (actionKey: string, action: GridAction<any> | undefined) => {\n if (action?.label) return action.label;\n if (actionKey === \"add\") return \"Add\";\n if (actionKey === \"edit\") return \"Edit\";\n if (actionKey === \"delete\") return \"Delete\";\n return converter.toCamel(actionKey, \" \");\n};\n\nexport const resolveInitialOrder = (sortable: boolean | OrderConfig | undefined) => {\n if (!sortable || typeof sortable === \"boolean\") return undefined;\n return sortable;\n};\n","import React, { useMemo } from \"react\";\nimport Table from \"../../ui/Table\";\nimport { type RecordProps } from \"../../../providers/data/DataProvider\";\nimport { type GridSelectionState, type GridTableViewProps } from \"./types\";\nimport { buildDisplayRecords, getRecordKeyResolver } from \"./utils\";\n\nfunction GridTableView<TRecord extends RecordProps>({\n records,\n recordId,\n columns,\n runAction,\n sortable,\n pagination,\n selection = false,\n selectedKeys,\n onSelectionChange,\n onClickRow,\n reorderable = false,\n onReorder,\n activeKey,\n wrapClass,\n}: GridTableViewProps<TRecord>) {\n const getRecordKey = useMemo(() => getRecordKeyResolver(recordId), [recordId]);\n const sourceByKey = useMemo(() => {\n return records.reduce<Map<string, TRecord>>((acc, record) => {\n acc.set(getRecordKey(record), record);\n return acc;\n }, new Map());\n }, [getRecordKey, records]);\n\n const displayRecords = useMemo(() => buildDisplayRecords(records, columns, runAction), [columns, records, runAction]);\n\n return (\n <Table\n header={columns.map((column) => ({\n key: String(column.key),\n label: column.label,\n className: column.className,\n sort: column.sortable,\n }))}\n body={displayRecords}\n sortable={sortable}\n pagination={pagination}\n selectionMode={selection === \"single\" ? \"single\" : \"multiple\"}\n selectedKeys={selection ? selectedKeys : undefined}\n onSelectionChange={selection ? (nextSelection) => {\n const keySet = new Set(nextSelection.keys);\n const recordsForSelection = records.filter((record) => keySet.has(getRecordKey(record)));\n let normalizedRecords = recordsForSelection;\n let normalizedKeys = nextSelection.keys;\n\n if (selection === \"single\" && nextSelection.keys.length > 1) {\n const lastKey = nextSelection.keys[nextSelection.keys.length - 1];\n normalizedKeys = lastKey ? [lastKey] : [];\n normalizedRecords = lastKey ? (sourceByKey.get(lastKey) ? [sourceByKey.get(lastKey)!] : []) : [];\n }\n\n const payload: GridSelectionState<TRecord> = {\n keys: normalizedKeys,\n records: normalizedRecords,\n hasSelection: normalizedKeys.length > 0,\n clear: () => onSelectionChange?.({\n keys: [],\n records: [],\n hasSelection: false,\n clear: () => undefined,\n }),\n };\n onSelectionChange?.(payload);\n } : undefined}\n onClick={onClickRow ? (record) => {\n const key = getRecordKey(record as TRecord);\n const sourceRecord = sourceByKey.get(key);\n if (sourceRecord) onClickRow(sourceRecord);\n } : undefined}\n onReorder={reorderable && onReorder ? (reorderedDisplayRecords, meta) => {\n const reorderedRecords = reorderedDisplayRecords\n .map((record) => sourceByKey.get(getRecordKey(record as TRecord)))\n .filter(Boolean) as TRecord[];\n const movedRecord = sourceByKey.get(getRecordKey(meta.record as TRecord));\n if (!movedRecord) return;\n onReorder(reorderedRecords, {\n fromIndex: meta.fromIndex,\n toIndex: meta.toIndex,\n record: movedRecord,\n });\n } : undefined}\n activeKey={activeKey}\n wrapClass={wrapClass}\n />\n );\n}\n\nexport default GridTableView;\n","import React, {useRef, useEffect, useCallback, useState} from 'react';\r\nimport TuiImageEditor from 'tui-image-editor';\r\nimport 'tui-image-editor/dist/tui-image-editor.css';\r\nimport Modal from \"../ui/Modal\";\nimport {LoadingButton} from \"../ui/Buttons\";\nimport Icon from \"../ui/Icon\";\n\r\ntype ImageEditorProps = {\r\n imageUrl: string;\r\n title?: string;\r\n width?: number;\r\n height?: number;\r\n modal?: boolean;\r\n onImageLoad?: () => void;\r\n onClose?: () => void;\r\n onSave?: (dataUrl: string) => void;\r\n};\r\n\r\ntype DrawingMode =\r\n | 'ZOOMIN'\r\n | 'ZOOMOUT'\r\n | 'UNDO'\r\n | 'REDO'\r\n | 'CROPPER'\r\n | 'FLIPX'\r\n | 'FLIPY'\r\n | 'ROTATE'\r\n | 'FREE_DRAWING'\r\n | 'LINE_DRAWING'\r\n | 'TEXT'\r\n | 'circle'\r\n | 'rect'\r\n | 'triangle';\r\n\r\ntype LineDrawingOptions = {\r\n width?: number;\r\n color?: string;\r\n arrowType?: {\r\n tail?: string;\r\n head?: string;\r\n };\r\n};\r\n\r\nconst ImageEditor = ({\r\n imageUrl,\r\n title = undefined,\r\n width = 700,\r\n height = 500,\r\n modal = false,\r\n onImageLoad = undefined,\r\n onClose = undefined,\r\n onSave = undefined\r\n}: ImageEditorProps) => {\n const rootEl = useRef<HTMLDivElement | null>(null);\n const imageEditorInst = useRef<InstanceType<typeof TuiImageEditor> | null>(null);\r\n const objStyle = {\r\n width: 10,\r\n color: 'rgba(255,0,0,0.5)',\r\n fill: 'transparent'\r\n }\r\n\r\n const [zoom, setZoom] = useState(1);\r\n\r\n useEffect(() => {\r\n if (!rootEl.current) return;\r\n\r\n const editor = new TuiImageEditor(rootEl.current, {\r\n cssMaxWidth: width,\r\n cssMaxHeight: height,\r\n selectionStyle: {\r\n cornerSize: 10,\r\n rotatingPointOffset: 70,\r\n cornerColor: 'white',\r\n cornerStrokeColor: 'red',\r\n borderColor: 'red',\r\n },\r\n });\r\n\r\n imageEditorInst.current = editor;\r\n\r\n editor.on('objectAdded', (obj) => {\r\n console.log('objectAdded', obj);\r\n editor.stopDrawingMode();\r\n });\r\n\r\n editor.on('addText', (pos) => {\r\n editor.stopDrawingMode();\r\n editor.addText('init text', {\r\n styles: {\r\n fill: '#FF0000',\r\n fontSize: 30,\r\n fontWeight: 'bold',\r\n },\r\n position: {\r\n x: pos.originPosition.x,\r\n y: pos.originPosition.y,\r\n },\r\n });\r\n });\r\n\r\n return () => {\r\n editor.destroy();\r\n imageEditorInst.current = null;\r\n };\r\n }, [width, height]);\r\n\r\n\r\n const loadImage = useCallback(() => {\r\n const editor = imageEditorInst.current;\r\n if (!imageUrl || !editor) return;\r\n\r\n editor.loadImageFromURL(imageUrl, 'Sample Image')\r\n .then(() => {\r\n onImageLoad?.();\r\n editor.clearUndoStack();\r\n editor.clearRedoStack();\r\n })\r\n .catch((err) => {\r\n console.error('Error loading image:', err);\r\n });\r\n }, [imageUrl, onImageLoad]);\r\n\r\n useEffect(() => {\r\n loadImage();\r\n }, [loadImage]);\r\n\r\n\r\n const handleStartDrawingMode = (e: React.MouseEvent<HTMLButtonElement>, mode: DrawingMode) => {\r\n e.preventDefault();\r\n\r\n const editor = imageEditorInst.current;\r\n if (!editor) return;\r\n\r\n const maxZoom = 3;\r\n const minZoom = 1;\r\n\r\n switch (mode) {\r\n // 🔍 Zoom controls\r\n case 'ZOOMIN':\r\n if (zoom < maxZoom) setZoom((prev) => prev * 1.2);\r\n break;\r\n\r\n case 'ZOOMOUT':\r\n if (zoom > minZoom) setZoom((prev) => Math.max(prev * 0.8, minZoom));\r\n break;\r\n\r\n // 🔁 History controls\r\n case 'UNDO':\r\n if (!editor.isEmptyUndoStack()) editor.undo();\r\n break;\r\n case 'REDO':\r\n if (!editor.isEmptyRedoStack()) editor.redo();\r\n break;\r\n\r\n // 🔄 Transform controls\r\n case 'FLIPX':\r\n editor.flipX();\r\n break;\r\n case 'FLIPY':\r\n editor.flipY();\r\n break;\r\n case 'ROTATE':\r\n editor.rotate(90);\r\n break;\r\n\r\n // ✂️ Crop\r\n case 'CROPPER':\r\n editor.startDrawingMode(mode);\r\n break;\r\n\r\n // ✏️ Free drawing\r\n case 'FREE_DRAWING':\r\n editor.startDrawingMode(mode, {\r\n width: objStyle.width,\r\n color: objStyle.color,\r\n });\r\n break;\r\n\r\n // ➖ Line drawing\r\n case 'LINE_DRAWING':\r\n editor.startDrawingMode(mode, {\r\n width: objStyle.width,\r\n color: objStyle.color,\r\n arrowType: {\r\n tail: 'chevron',\r\n },\r\n } as LineDrawingOptions);\r\n break;\r\n\r\n // 🔤 Text\r\n case 'TEXT':\r\n editor.startDrawingMode(mode);\r\n break;\r\n\r\n // 🟠🟦🔺 Shapes\r\n case 'circle':\r\n case 'rect':\r\n case 'triangle':\r\n editor.setDrawingShape(mode, {\r\n fill: objStyle.fill,\r\n stroke: objStyle.color,\r\n strokeWidth: 3,\r\n });\r\n editor.startDrawingMode('SHAPE');\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n };\r\n\r\n const handleSave = async () => {\r\n const editor = imageEditorInst.current;\r\n if (!editor) return;\r\n\r\n await onSave?.(editor.toDataURL());\r\n\r\n document.body.style.overflow = '';\r\n };\r\n\r\n const handleClose = () => {\r\n document.body.style.overflow = '';\r\n onClose?.();\r\n }\r\n\r\n window.document.body.style.overflow = 'hidden';\r\n const toolButtonClass = \"inline-flex h-9 w-9 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\";\n const Controls = <div className={\"flex border-b\"}>\n <div className={\"border-end\"}>\n <button className={toolButtonClass} title=\"Undo\" onClick={(e) => handleStartDrawingMode(e, 'UNDO')}>\n <Icon name=\"arrow-arc-left\" />\n </button>\n <button className={toolButtonClass} title=\"Redo\" onClick={(e) => handleStartDrawingMode(e, 'REDO')}>\n <Icon name=\"arrow-arc-right\" />\n </button>\n <button className={toolButtonClass} title=\"Zoom In\" onClick={(e) => handleStartDrawingMode(e, 'ZOOMOUT')}>\n <Icon name=\"magnifying-glass-minus\" />\n </button>\n <button className={toolButtonClass} title=\"Zoom Out\" onClick={(e) => handleStartDrawingMode(e, 'ZOOMIN')}>\n <Icon name=\"magnifying-glass-plus\" />\n </button>\n </div>\n <div className={\"border-end\"}>\n <button className={toolButtonClass} title=\"Crop\" onClick={(e) => handleStartDrawingMode(e, 'CROPPER')}>\n <Icon name=\"crop\" />\n </button>\n <button className={toolButtonClass} title=\"Flip X\" onClick={(e) => handleStartDrawingMode(e, 'FLIPX')}>\n <Icon name=\"arrow-line-right\" />\n </button>\n <button className={toolButtonClass} title=\"Flip Y\" onClick={(e) => handleStartDrawingMode(e, 'FLIPY')}>\n <Icon name=\"arrow-line-down\" />\n </button>\n <button className={toolButtonClass} title=\"Rotate\" onClick={(e) => handleStartDrawingMode(e, 'ROTATE')}>\n <Icon name=\"camera-rotate\" />\n </button>\n </div>\n <div className={\"border-end\"}>\n <button className={toolButtonClass} title=\"Free Drawing\" onClick={(e) => handleStartDrawingMode(e, 'FREE_DRAWING')}>\n <Icon name=\"pencil\" />\n </button>\n <button className={toolButtonClass} title=\"Line\" onClick={(e) => handleStartDrawingMode(e, 'LINE_DRAWING')}>\n <Icon name=\"arrow-right\" />\n </button>\n <button className={toolButtonClass} title=\"Text\" onClick={(e) => handleStartDrawingMode(e, 'TEXT')}>\n <Icon name=\"text-t\" />\n </button>\n <button className={toolButtonClass} title=\"Rect\" onClick={(e) => handleStartDrawingMode(e, 'rect')}>\n <Icon name=\"rectangle\" />\n </button>\n <button className={toolButtonClass} title=\"Circle\" onClick={(e) => handleStartDrawingMode(e, 'circle')}>\n <Icon name=\"circle\" />\n </button>\n <button className={toolButtonClass} title=\"Triangle\" onClick={(e) => handleStartDrawingMode(e, 'triangle')}>\n <Icon name=\"triangle\" />\n </button>\n </div>\n {onSave && <div className={\"ml-auto\"}>\n <LoadingButton className={\"btn-primary\"} onClick={handleSave} icon={\"floppy-disk\"} label={\"Save\"} />\n </div>}\n </div>;\r\n\r\n const Editor =\r\n <div ref={rootEl}\r\n className={\"flex justify-center\"}\r\n style={{\r\n transform: `scale(${zoom})`,\r\n transformOrigin: 'top center',\r\n display: 'inline-block',\r\n userSelect: 'none',\r\n width: '100%',\r\n height: (height * zoom) + 'px'\r\n }}/>;\r\n\r\n\r\n return (modal\r\n ? <Modal\r\n size={\"xl\"}\r\n title={title || \"Image Editor\"}\r\n header={Controls}\r\n className={\"bg-secondary\"}\r\n bodyClass={\"overflow-hidden\"}\r\n onClose={handleClose}\r\n footer={false}\r\n >\r\n {Editor}\r\n </Modal>\r\n : <>{Controls}{Editor}</>\r\n );\r\n};\r\n\r\nexport default ImageEditor;\r\n","import React, { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\n\r\nexport type HeadMetaAttributes = Record<string, string | undefined>;\r\n\r\nexport interface PageMetadataState {\r\n title?: string;\r\n description?: string;\r\n meta?: HeadMetaAttributes;\r\n}\r\n\r\nexport interface SocialHeadState {\r\n openGraph?: OpenGraphHeadState;\r\n twitter?: TwitterHeadState;\r\n}\r\n\r\nexport interface HeadLinkDescriptor {\r\n rel: string;\r\n href?: string;\r\n as?: string;\r\n type?: string;\r\n sizes?: string;\r\n media?: string;\r\n hrefLang?: string;\r\n title?: string;\r\n crossOrigin?: string;\r\n [attribute: string]: string | boolean | undefined;\r\n}\r\n\r\nexport interface HeadLinksState {\r\n canonical?: string;\r\n links?: HeadLinkDescriptor[];\r\n}\r\n\r\nexport interface DocumentHeadState {\r\n charset?: string;\r\n viewport?: string;\r\n base?: DocumentBaseHead;\r\n httpEquiv?: DocumentHttpEquivMeta;\r\n robots?: string;\r\n googlebot?: string;\r\n canonical?: string;\r\n ampHtml?: string;\r\n sitemap?: string;\r\n keywords?: string | string[];\r\n author?: string;\r\n publisher?: string;\r\n referrer?: string;\r\n meta?: DocumentMetaAttributes;\r\n links?: HeadLinkDescriptor[];\r\n}\r\n\r\nexport interface DocumentBaseHead {\r\n href?: string;\r\n target?: '_self' | '_blank' | '_parent' | '_top' | string;\r\n}\r\n\r\nexport type DocumentHttpEquivMeta = HeadMetaAttributes;\r\nexport type DocumentMetaAttributes = HeadMetaAttributes;\r\n\r\nexport interface LanguageAlternateLink {\r\n href: string;\r\n hrefLang: string;\r\n media?: string;\r\n type?: string;\r\n title?: string;\r\n}\r\n\r\nexport interface LanguageHeadState {\r\n lang?: string;\r\n dir?: 'ltr' | 'rtl' | 'auto';\r\n alternates?: LanguageAlternateLink[];\r\n}\r\n\r\nexport interface PaginationHeadState {\r\n prev?: string;\r\n next?: string;\r\n}\r\n\r\nexport interface OpenGraphHeadState extends HeadMetaAttributes {\r\n title?: string;\r\n type?: string;\r\n image?: string;\r\n url?: string;\r\n description?: string;\r\n siteName?: string;\r\n locale?: string;\r\n}\r\n\r\nexport interface TwitterHeadState extends HeadMetaAttributes {\r\n card?: 'summary' | 'summary_large_image' | 'app' | 'player' | string;\r\n site?: string;\r\n creator?: string;\r\n title?: string;\r\n description?: string;\r\n image?: string;\r\n}\r\n\r\nexport interface HeadScriptAsset {\r\n src?: string;\r\n inline?: string;\r\n type?: string;\r\n async?: boolean;\r\n defer?: boolean;\r\n nonce?: string;\r\n integrity?: string;\r\n crossOrigin?: string;\r\n referrerPolicy?: string;\r\n id?: string;\r\n}\r\n\r\nexport interface HeadStyleAsset {\r\n href?: string;\r\n inline?: string;\r\n media?: string;\r\n title?: string;\r\n type?: string;\r\n disabled?: boolean;\r\n integrity?: string;\r\n crossOrigin?: string;\r\n id?: string;\r\n nonce?: string;\r\n}\r\n\r\nexport interface HeadFontAsset {\r\n href: string;\r\n preload?: boolean;\r\n preconnect?: string[];\r\n dnsPrefetch?: string[];\r\n crossOrigin?: string;\r\n as?: string;\r\n type?: string;\r\n media?: string;\r\n}\r\n\r\nexport interface AssetsHeadState {\r\n scripts?: HeadScriptAsset[];\r\n styles?: HeadStyleAsset[];\r\n fonts?: HeadFontAsset[];\r\n}\r\n\r\nexport interface PwaHeadState {\r\n manifest?: string;\r\n themeColor?: string;\r\n backgroundColor?: string;\r\n colorScheme?: 'normal' | 'light' | 'dark' | 'light dark' | 'dark light' | string;\r\n applicationName?: string;\r\n mobileWebAppCapable?: boolean;\r\n appleMobileWebAppCapable?: boolean;\r\n appleMobileWebAppTitle?: string;\r\n appleMobileWebAppStatusBarStyle?: 'default' | 'black' | 'black-translucent';\r\n favicon?: string;\r\n appleTouchIcon?: string;\r\n icons?: PwaIconLink[];\r\n}\r\n\r\nexport interface PwaIconLink extends HeadLinkDescriptor {\r\n rel: 'icon' | 'apple-touch-icon' | 'mask-icon' | string;\r\n href: string;\r\n}\r\n\r\nexport type SchemaOrgJson = Record<string, unknown>;\r\n\r\nexport interface SchemaOrgHeadState {\r\n jsonLd?: SchemaOrgJson | SchemaOrgJson[];\r\n}\r\n\r\nexport interface HeadProviderProps {\r\n children: React.ReactNode;\r\n appName?: string;\r\n}\r\n\r\nexport interface HeadController {\r\n metadata: PageMetadataState;\r\n social: SocialHeadState;\r\n links: HeadLinksState;\r\n pagination: PaginationHeadState;\r\n language: LanguageHeadState;\r\n document: DocumentHeadState;\r\n assets: AssetsHeadState;\r\n pwa: PwaHeadState;\r\n schemaOrg: SchemaOrgHeadState;\r\n setPageMetadata: (metadata: PageMetadataState) => void;\r\n clearPageMetadata: () => void;\r\n setPageMetadataEntry: (id: string, metadata: PageMetadataState) => void;\r\n clearPageMetadataEntry: (id: string) => void;\r\n setSocialHead: (social: SocialHeadState) => void;\r\n clearSocialHead: () => void;\r\n setHeadLinks: (links: HeadLinksState) => void;\r\n clearHeadLinks: () => void;\r\n setPaginationHead: (pagination: PaginationHeadState) => void;\r\n clearPaginationHead: () => void;\r\n setLanguageHead: (language: LanguageHeadState) => void;\r\n clearLanguageHead: () => void;\r\n setDocumentHead: (document: DocumentHeadState) => void;\r\n clearDocumentHead: () => void;\r\n setAssetsHead: (assets: AssetsHeadState) => void;\r\n clearAssetsHead: () => void;\r\n setPwaHead: (pwa: PwaHeadState) => void;\r\n clearPwaHead: () => void;\r\n setSchemaOrg: (schemaOrg: SchemaOrgHeadState) => void;\r\n clearSchemaOrg: () => void;\r\n}\r\n\r\nconst HeadContext = createContext<HeadController | null>(null);\r\nlet metadataEntryId = 0;\r\n\r\nexport const DEFAULT_HEAD_APP_NAME = 'LLM Native';\r\nexport const DEFAULT_DOCUMENT_HEAD: DocumentHeadState = {\r\n charset: 'UTF-8',\r\n viewport: 'width=device-width, initial-scale=1.0',\r\n};\r\nexport const DEFAULT_LANGUAGE_HEAD: LanguageHeadState = {\r\n lang: 'en',\r\n};\r\n\r\ntype MetadataEntry = {\r\n id: string;\r\n metadata: PageMetadataState;\r\n};\r\n\r\nfunction normalizeSocialKey(prefix: string, key: string): string {\r\n return key.includes(':') ? key : `${prefix}:${key}`;\r\n}\r\n\r\nfunction normalizeKeywords(keywords: DocumentHeadState['keywords']): string | undefined {\r\n return Array.isArray(keywords) ? keywords.join(', ') : keywords;\r\n}\r\n\r\nfunction normalizeOpenGraphKey(key: string): string {\r\n return key === 'siteName' ? 'og:site_name' : normalizeSocialKey('og', key);\r\n}\r\n\r\nfunction createDocumentLinks(document: DocumentHeadState): HeadLinkDescriptor[] {\r\n return [\r\n ...(document.canonical ? [{ rel: 'canonical', href: document.canonical }] : []),\r\n ...(document.ampHtml ? [{ rel: 'amphtml', href: document.ampHtml }] : []),\r\n ...(document.sitemap ? [{ rel: 'sitemap', href: document.sitemap, type: 'application/xml' }] : []),\r\n ...(document.links ?? []),\r\n ];\r\n}\r\n\r\nfunction createPaginationLinks(pagination: PaginationHeadState): HeadLinkDescriptor[] {\r\n return [\r\n ...(pagination.prev ? [{ rel: 'prev', href: pagination.prev }] : []),\r\n ...(pagination.next ? [{ rel: 'next', href: pagination.next }] : []),\r\n ];\r\n}\r\n\r\nfunction createLanguageLinks(language: LanguageHeadState): HeadLinkDescriptor[] {\r\n return (language.alternates ?? []).map((alternate) => ({\r\n rel: 'alternate',\r\n href: alternate.href,\r\n hrefLang: alternate.hrefLang,\r\n media: alternate.media,\r\n type: alternate.type,\r\n title: alternate.title,\r\n }));\r\n}\r\n\r\nfunction createMetaGroups(metadata: PageMetadataState, social: SocialHeadState, document: DocumentHeadState): {\r\n name: HeadMetaAttributes;\r\n property: HeadMetaAttributes;\r\n} {\r\n return {\r\n name: {\r\n description: metadata.description,\r\n ...(metadata.meta ?? {}),\r\n robots: document.robots ?? metadata.meta?.robots,\r\n googlebot: document.googlebot,\r\n keywords: normalizeKeywords(document.keywords),\r\n author: document.author,\r\n publisher: document.publisher,\r\n referrer: document.referrer,\r\n ...(document.meta ?? {}),\r\n ...Object.fromEntries(\r\n Object.entries(social.twitter ?? {}).map(([key, value]) => [\r\n normalizeSocialKey('twitter', key),\r\n value,\r\n ])\r\n ),\r\n },\r\n property: Object.fromEntries(\r\n Object.entries(social.openGraph ?? {}).map(([key, value]) => [\r\n normalizeOpenGraphKey(key),\r\n value,\r\n ])\r\n ),\r\n };\r\n}\r\n\r\nfunction createHeadLinks(\r\n links: HeadLinksState,\r\n document: DocumentHeadState,\r\n language: LanguageHeadState,\r\n pagination: PaginationHeadState\r\n): HeadLinkDescriptor[] {\r\n return [\r\n ...createDocumentLinks(document),\r\n ...createPaginationLinks(pagination),\r\n ...createLanguageLinks(language),\r\n ...(links.canonical && !document.canonical ? [{ rel: 'canonical', href: links.canonical }] : []),\r\n ...(links.links ?? []),\r\n ];\r\n}\r\n\r\nfunction createAssetLinks(assets: AssetsHeadState): HeadLinkDescriptor[] {\r\n return [\r\n ...(assets.fonts ?? []).flatMap((font) => [\r\n ...(font.dnsPrefetch ?? []).map((href) => ({ rel: 'dns-prefetch', href })),\r\n ...(font.preconnect ?? []).map((href) => ({ rel: 'preconnect', href, crossOrigin: font.crossOrigin })),\r\n ...(font.preload ? [{\r\n rel: 'preload',\r\n href: font.href,\r\n as: font.as ?? 'font',\r\n type: font.type,\r\n media: font.media,\r\n crossOrigin: font.crossOrigin,\r\n }] : []),\r\n {\r\n rel: 'stylesheet',\r\n href: font.href,\r\n media: font.media,\r\n crossOrigin: font.crossOrigin,\r\n },\r\n ]),\r\n ];\r\n}\r\n\r\nfunction createPwaLinks(pwa: PwaHeadState): HeadLinkDescriptor[] {\r\n return [\r\n ...(pwa.manifest ? [{ rel: 'manifest', href: pwa.manifest }] : []),\r\n ...(pwa.favicon ? [{ rel: 'icon', href: pwa.favicon }] : []),\r\n ...(pwa.appleTouchIcon ? [{ rel: 'apple-touch-icon', href: pwa.appleTouchIcon }] : []),\r\n ...(pwa.icons ?? []),\r\n ];\r\n}\r\n\r\nfunction createPwaMeta(pwa: PwaHeadState): HeadMetaAttributes {\r\n return {\r\n 'theme-color': pwa.themeColor,\r\n 'msapplication-TileColor': pwa.backgroundColor,\r\n 'color-scheme': pwa.colorScheme,\r\n 'application-name': pwa.applicationName,\r\n 'mobile-web-app-capable': pwa.mobileWebAppCapable === undefined ? undefined : String(pwa.mobileWebAppCapable),\r\n 'apple-mobile-web-app-capable': pwa.appleMobileWebAppCapable === undefined ? undefined : String(pwa.appleMobileWebAppCapable),\r\n 'apple-mobile-web-app-title': pwa.appleMobileWebAppTitle,\r\n 'apple-mobile-web-app-status-bar-style': pwa.appleMobileWebAppStatusBarStyle,\r\n };\r\n}\r\n\r\nfunction createSchemaOrgBlocks(schemaOrg: SchemaOrgHeadState): SchemaOrgJson[] {\r\n return Array.isArray(schemaOrg.jsonLd)\r\n ? schemaOrg.jsonLd\r\n : schemaOrg.jsonLd\r\n ? [schemaOrg.jsonLd]\r\n : [];\r\n}\r\n\r\nfunction toReactLinkProps(link: HeadLinkDescriptor): React.LinkHTMLAttributes<HTMLLinkElement> {\r\n return Object.fromEntries(\r\n Object.entries(link).filter(([, value]) => Boolean(value))\r\n ) as React.LinkHTMLAttributes<HTMLLinkElement>;\r\n}\r\n\r\nfunction toReactScriptProps(script: HeadScriptAsset): React.ScriptHTMLAttributes<HTMLScriptElement> {\r\n const { inline: _inline, ...props } = script;\r\n return Object.fromEntries(\r\n Object.entries(props).filter(([, value]) => value !== undefined && value !== false)\r\n ) as React.ScriptHTMLAttributes<HTMLScriptElement>;\r\n}\r\n\r\nfunction toReactStyleLinkProps(style: HeadStyleAsset): React.LinkHTMLAttributes<HTMLLinkElement> {\r\n const { inline: _inline, ...props } = style;\r\n return Object.fromEntries(\r\n Object.entries(props).filter(([, value]) => value !== undefined && value !== false)\r\n ) as React.LinkHTMLAttributes<HTMLLinkElement>;\r\n}\r\n\r\nfunction HeadPortal({\r\n appName,\r\n metadata,\r\n social,\r\n links,\r\n pagination,\r\n language,\r\n document,\r\n assets,\r\n pwa,\r\n schemaOrg,\r\n}: {\r\n appName: string;\r\n metadata: PageMetadataState;\r\n social: SocialHeadState;\r\n links: HeadLinksState;\r\n pagination: PaginationHeadState;\r\n language: LanguageHeadState;\r\n document: DocumentHeadState;\r\n assets: AssetsHeadState;\r\n pwa: PwaHeadState;\r\n schemaOrg: SchemaOrgHeadState;\r\n}) {\r\n if (typeof globalThis.document === 'undefined') return null;\r\n\r\n const meta = createMetaGroups(metadata, social, document);\r\n const pwaMeta = createPwaMeta(pwa);\r\n const linkTags = [\r\n ...createHeadLinks(links, document, language, pagination),\r\n ...createAssetLinks(assets),\r\n ...createPwaLinks(pwa),\r\n ];\r\n const schemaOrgBlocks = createSchemaOrgBlocks(schemaOrg);\r\n\r\n return createPortal(\r\n <>\r\n {document.charset ? <meta charSet={document.charset} data-rfs-head=\"document\" /> : null}\r\n {document.base?.href || document.base?.target ? (\r\n <base\r\n href={document.base.href}\r\n target={document.base.target}\r\n data-rfs-head=\"document\"\r\n />\r\n ) : null}\r\n <title data-rfs-head=\"title\">{metadata.title ?? appName}</title>\r\n {document.viewport ? <meta name=\"viewport\" content={document.viewport} data-rfs-head=\"document\" /> : null}\r\n {Object.entries(document.httpEquiv ?? {}).map(([httpEquiv, content]) => (\r\n content ? <meta key={`http-equiv:${httpEquiv}`} httpEquiv={httpEquiv} content={content} data-rfs-head=\"document\" /> : null\r\n ))}\r\n {Object.entries(meta.name).map(([name, content]) => (\r\n content ? <meta key={`name:${name}`} name={name} content={content} data-rfs-head=\"meta\" /> : null\r\n ))}\r\n {Object.entries(meta.property).map(([property, content]) => (\r\n content ? <meta key={`property:${property}`} property={property} content={content} data-rfs-head=\"meta\" /> : null\r\n ))}\r\n {Object.entries(pwaMeta).map(([name, content]) => (\r\n content ? <meta key={`pwa:${name}`} name={name} content={content} data-rfs-head=\"pwa\" /> : null\r\n ))}\r\n {linkTags.map((link, index) => (\r\n <link\r\n key={`${link.rel}:${link.href ?? index}`}\r\n {...toReactLinkProps(link)}\r\n data-rfs-head=\"link\"\r\n />\r\n ))}\r\n {(assets.styles ?? []).map((style, index) => (\r\n <React.Fragment key={`style:${style.href ?? index}`}>\r\n {style.href ? (\r\n <link\r\n rel=\"stylesheet\"\r\n href={style.href}\r\n {...toReactStyleLinkProps(style)}\r\n data-rfs-head=\"asset-style\"\r\n />\r\n ) : null}\r\n {style.inline ? (\r\n <style\r\n id={style.id}\r\n nonce={style.nonce}\r\n media={style.media}\r\n title={style.title}\r\n data-rfs-head=\"asset-style\"\r\n >\r\n {style.inline}\r\n </style>\r\n ) : null}\r\n </React.Fragment>\r\n ))}\r\n {(assets.scripts ?? []).map((script, index) => (\r\n <React.Fragment key={`script:${script.src ?? index}`}>\r\n {script.src ? (\r\n <script\r\n {...toReactScriptProps(script)}\r\n data-rfs-head=\"asset-script\"\r\n />\r\n ) : null}\r\n {script.inline ? (\r\n <script\r\n type={script.type}\r\n id={script.id}\r\n nonce={script.nonce}\r\n data-rfs-head=\"asset-script\"\r\n >\r\n {script.inline}\r\n </script>\r\n ) : null}\r\n </React.Fragment>\r\n ))}\r\n {schemaOrgBlocks.map((block, index) => (\r\n <script\r\n key={`schema-org:${index}`}\r\n type=\"application/ld+json\"\r\n data-rfs-head=\"schema-org\"\r\n >\r\n {JSON.stringify(block)}\r\n </script>\r\n ))}\r\n </>,\r\n globalThis.document.head\r\n );\r\n}\r\n\r\nexport function HeadProvider({ appName = DEFAULT_HEAD_APP_NAME, children }: HeadProviderProps) {\r\n const resolvedAppName = appName || DEFAULT_HEAD_APP_NAME;\r\n const defaultLangRef = React.useRef(typeof globalThis.document === 'undefined' ? '' : globalThis.document.documentElement.lang);\r\n const defaultDirRef = React.useRef(typeof globalThis.document === 'undefined' ? '' : globalThis.document.documentElement.dir);\r\n const [metadata, setPageMetadata] = useState<PageMetadataState>({});\r\n const [metadataEntries, setMetadataEntries] = useState<MetadataEntry[]>([]);\r\n const [social, setSocialHead] = useState<SocialHeadState>({});\r\n const [links, setHeadLinks] = useState<HeadLinksState>({});\r\n const [pagination, setPaginationHead] = useState<PaginationHeadState>({});\r\n const [language, setLanguageHead] = useState<LanguageHeadState>(DEFAULT_LANGUAGE_HEAD);\r\n const [document, setDocumentHead] = useState<DocumentHeadState>(DEFAULT_DOCUMENT_HEAD);\r\n const [assets, setAssetsHead] = useState<AssetsHeadState>({});\r\n const [pwa, setPwaHead] = useState<PwaHeadState>({});\r\n const [schemaOrg, setSchemaOrg] = useState<SchemaOrgHeadState>({});\r\n const clearPageMetadata = useCallback(() => setPageMetadata({}), []);\r\n const setPageMetadataEntry = useCallback((id: string, nextMetadata: PageMetadataState) => {\r\n setMetadataEntries((current) => {\r\n const nextEntries = current.filter((entry) => entry.id !== id);\r\n return [...nextEntries, { id, metadata: nextMetadata }];\r\n });\r\n }, []);\r\n const clearPageMetadataEntry = useCallback((id: string) => {\r\n setMetadataEntries((current) => current.filter((entry) => entry.id !== id));\r\n }, []);\r\n const clearSocialHead = useCallback(() => setSocialHead({}), []);\r\n const clearHeadLinks = useCallback(() => setHeadLinks({}), []);\r\n const clearPaginationHead = useCallback(() => setPaginationHead({}), []);\r\n const clearLanguageHead = useCallback(() => setLanguageHead(DEFAULT_LANGUAGE_HEAD), []);\r\n const clearDocumentHead = useCallback(() => setDocumentHead(DEFAULT_DOCUMENT_HEAD), []);\r\n const clearAssetsHead = useCallback(() => setAssetsHead({}), []);\r\n const clearPwaHead = useCallback(() => setPwaHead({}), []);\r\n const clearSchemaOrg = useCallback(() => setSchemaOrg({}), []);\r\n\r\n useEffect(() => {\r\n if (typeof globalThis.document === 'undefined') return;\r\n\r\n globalThis.document.documentElement.lang = language.lang ?? defaultLangRef.current;\r\n globalThis.document.documentElement.dir = language.dir ?? defaultDirRef.current;\r\n }, [language.lang, language.dir]);\r\n\r\n const activeMetadata = metadataEntries.length > 0 ? metadataEntries[metadataEntries.length - 1].metadata : metadata;\r\n\r\n // Set document.title imperatively so the browser tab updates even when index.html\r\n // already has a <title> element (createPortal appends a second one which browsers ignore).\r\n useEffect(() => {\r\n if (typeof globalThis.document === 'undefined') return;\r\n globalThis.document.title = activeMetadata.title ?? resolvedAppName;\r\n }, [activeMetadata.title, resolvedAppName]);\r\n\r\n const controller = useMemo<HeadController>(() => ({\r\n metadata: activeMetadata,\r\n social,\r\n links,\r\n pagination,\r\n language,\r\n document,\r\n assets,\r\n pwa,\r\n schemaOrg,\r\n setPageMetadata,\r\n clearPageMetadata,\r\n setPageMetadataEntry,\r\n clearPageMetadataEntry,\r\n setSocialHead,\r\n clearSocialHead,\r\n setHeadLinks,\r\n clearHeadLinks,\r\n setPaginationHead,\r\n clearPaginationHead,\r\n setLanguageHead,\r\n clearLanguageHead,\r\n setDocumentHead,\r\n clearDocumentHead,\r\n setAssetsHead,\r\n clearAssetsHead,\r\n setPwaHead,\r\n clearPwaHead,\r\n setSchemaOrg,\r\n clearSchemaOrg,\r\n }), [\r\n activeMetadata,\r\n social,\r\n links,\r\n pagination,\r\n language,\r\n document,\r\n assets,\r\n pwa,\r\n schemaOrg,\r\n clearPageMetadata,\r\n setPageMetadataEntry,\r\n clearPageMetadataEntry,\r\n clearSocialHead,\r\n clearHeadLinks,\r\n clearPaginationHead,\r\n clearLanguageHead,\r\n clearDocumentHead,\r\n clearAssetsHead,\r\n clearPwaHead,\r\n clearSchemaOrg,\r\n ]);\r\n\r\n return (\r\n <HeadContext.Provider value={controller}>\r\n {children}\r\n <HeadPortal\r\n appName={resolvedAppName}\r\n metadata={activeMetadata}\r\n social={social}\r\n links={links}\r\n pagination={pagination}\r\n language={language}\r\n document={document}\r\n assets={assets}\r\n pwa={pwa}\r\n schemaOrg={schemaOrg}\r\n />\r\n </HeadContext.Provider>\r\n );\r\n}\r\n\r\nfunction useHeadController(): HeadController | null {\r\n return useContext(HeadContext);\r\n}\r\n\r\nfunction stableKey(value: unknown): string {\r\n return JSON.stringify(value ?? {});\r\n}\r\n\r\nexport function useHead(metadata?: PageMetadataState): HeadController | null {\r\n const controller = useHeadController();\r\n const idRef = React.useRef<string | null>(null);\r\n if (!idRef.current) {\r\n metadataEntryId += 1;\r\n idRef.current = `metadata-${metadataEntryId}`;\r\n }\r\n const metadataKey = stableKey(metadata);\r\n\r\n useEffect(() => {\r\n if (!controller || !metadata) return;\r\n const id = idRef.current!;\r\n controller.setPageMetadataEntry(id, metadata);\r\n return () => controller.clearPageMetadataEntry(id);\r\n }, [controller?.setPageMetadataEntry, controller?.clearPageMetadataEntry, metadataKey]);\r\n\r\n return controller;\r\n}\r\n\r\nexport function useSocialHead(social?: SocialHeadState): HeadController | null {\r\n const controller = useHeadController();\r\n const socialKey = stableKey(social);\r\n\r\n useEffect(() => {\r\n if (!controller || !social) return;\r\n const previousSocial = controller.social;\r\n controller.setSocialHead(social);\r\n return () => controller.setSocialHead(previousSocial);\r\n }, [controller?.setSocialHead, socialKey]);\r\n\r\n return controller;\r\n}\r\n\r\nexport function useHeadLinks(links?: HeadLinksState): HeadController | null {\r\n const controller = useHeadController();\r\n const linksKey = stableKey(links);\r\n\r\n useEffect(() => {\r\n if (!controller || !links) return;\r\n const previousLinks = controller.links;\r\n controller.setHeadLinks(links);\r\n return () => controller.setHeadLinks(previousLinks);\r\n }, [controller?.setHeadLinks, linksKey]);\r\n\r\n return controller;\r\n}\r\n\r\nexport function usePaginationHead(pagination?: PaginationHeadState): HeadController | null {\r\n const controller = useHeadController();\r\n const paginationKey = stableKey(pagination);\r\n\r\n useEffect(() => {\r\n if (!controller || !pagination) return;\r\n const previousPagination = controller.pagination;\r\n controller.setPaginationHead(pagination);\r\n return () => controller.setPaginationHead(previousPagination);\r\n }, [controller?.setPaginationHead, paginationKey]);\r\n\r\n return controller;\r\n}\r\n\r\nexport function useLanguageHead(language?: LanguageHeadState): HeadController | null {\r\n const controller = useHeadController();\r\n const languageKey = stableKey(language);\r\n\r\n useEffect(() => {\r\n if (!controller || !language) return;\r\n const previousLanguage = controller.language;\r\n controller.setLanguageHead(language);\r\n return () => controller.setLanguageHead(previousLanguage);\r\n }, [controller?.setLanguageHead, languageKey]);\r\n\r\n return controller;\r\n}\r\n\r\nexport function useDocumentHead(document?: DocumentHeadState): HeadController | null {\r\n const controller = useHeadController();\r\n const documentKey = stableKey(document);\r\n\r\n useEffect(() => {\r\n if (!controller || !document) return;\r\n const previousDocumentHead = controller.document;\r\n controller.setDocumentHead(document);\r\n return () => controller.setDocumentHead(previousDocumentHead);\r\n }, [controller?.setDocumentHead, documentKey]);\r\n\r\n return controller;\r\n}\r\n\r\nexport function useAssetsHead(assets?: AssetsHeadState): HeadController | null {\r\n const controller = useHeadController();\r\n const assetsKey = stableKey(assets);\r\n\r\n useEffect(() => {\r\n if (!controller || !assets) return;\r\n const previousAssets = controller.assets;\r\n controller.setAssetsHead(assets);\r\n return () => controller.setAssetsHead(previousAssets);\r\n }, [controller?.setAssetsHead, assetsKey]);\r\n\r\n return controller;\r\n}\r\n\r\nexport function usePwaHead(pwa?: PwaHeadState): HeadController | null {\r\n const controller = useHeadController();\r\n const pwaKey = stableKey(pwa);\r\n\r\n useEffect(() => {\r\n if (!controller || !pwa) return;\r\n const previousPwa = controller.pwa;\r\n controller.setPwaHead(pwa);\r\n return () => controller.setPwaHead(previousPwa);\r\n }, [controller?.setPwaHead, pwaKey]);\r\n\r\n return controller;\r\n}\r\n\r\nexport function useSchemaOrgHead(schemaOrg?: SchemaOrgHeadState): HeadController | null {\r\n const controller = useHeadController();\r\n const schemaOrgKey = stableKey(schemaOrg);\r\n\r\n useEffect(() => {\r\n if (!controller || !schemaOrg) return;\r\n const previousSchemaOrg = controller.schemaOrg;\r\n controller.setSchemaOrg(schemaOrg);\r\n return () => controller.setSchemaOrg(previousSchemaOrg);\r\n }, [controller?.setSchemaOrg, schemaOrgKey]);\r\n\r\n return controller;\r\n}\r\n\r\nexport function Head(metadata: PageMetadataState) {\r\n useHead(metadata);\r\n return null;\r\n}\r\n","import React from 'react';\nimport ReactMarkdown, { Components } from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport rehypeSlug from 'rehype-slug';\nimport rehypeAutolinkHeadings from 'rehype-autolink-headings';\nimport rehypeSanitize from 'rehype-sanitize';\nimport { cn } from '../../libs/cn';\nimport { copyToClipboard } from '../../libs/utils';\nimport { useHead, type PageMetadataState } from '../../Head';\n\ntype MarkdownComponents = Components;\n\nexport interface MarkdownReaderProps {\n content: string;\n components?: MarkdownComponents;\n className?: string;\n wrapClass?: string;\n head?: PageMetadataState;\n onNavigateInternal?: (href: string, event: React.MouseEvent<HTMLAnchorElement>) => void;\n}\n\ninterface MarkdownCodeBlockProps {\n code: string;\n language?: string;\n}\n\nconst isExternalLink = (href: string): boolean =>\n /^(https?:)?\\/\\//.test(href) || href.startsWith('mailto:') || href.startsWith('tel:');\n\nconst isInternalLink = (href: string): boolean =>\n Boolean(href) && !isExternalLink(href) && !href.startsWith('#');\n\nconst isHashLink = (href: string): boolean =>\n href.startsWith('#');\n\nconst getText = (node: React.ReactNode): string => {\n if (typeof node === 'string' || typeof node === 'number') return String(node);\n if (Array.isArray(node)) return node.map(getText).join('');\n if (React.isValidElement<{ children?: React.ReactNode }>(node)) return getText(node.props.children);\n return '';\n};\n\nconst getCodeLanguage = (node: React.ReactNode): string | undefined => {\n if (!React.isValidElement<{ className?: string }>(node)) return undefined;\n const match = /language-([\\w-]+)/.exec(node.props.className || '');\n return match?.[1];\n};\n\nfunction MarkdownCodeBlock({ code, language }: MarkdownCodeBlockProps) {\n const [copied, setCopied] = React.useState(false);\n\n const copy = () => {\n copyToClipboard(code);\n setCopied(true);\n window.setTimeout(() => setCopied(false), 1600);\n };\n\n return (\n <div className=\"relative my-4 overflow-hidden rounded-md border bg-muted/50\">\n <div className=\"flex h-9 items-center justify-between border-b px-3\">\n <span className=\"text-xs font-medium text-muted-foreground\">\n {language || 'text'}\n </span>\n <button\n type=\"button\"\n className=\"rounded border bg-background px-2 py-1 text-xs text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\"\n onClick={copy}\n >\n {copied ? 'Copied' : 'Copy'}\n </button>\n </div>\n <pre className=\"m-0 overflow-x-auto p-4 text-xs leading-relaxed\">\n <code className={language ? `language-${language}` : undefined}>{code}</code>\n </pre>\n </div>\n );\n}\n\nconst createDefaultComponents = (\n onNavigateInternal?: MarkdownReaderProps['onNavigateInternal']\n): MarkdownComponents => ({\n h1: ({ className, ...props }) => <h1 className={cn('mt-8 scroll-m-20 text-3xl font-bold tracking-normal first:mt-0 [&>a]:no-underline [&>a:hover]:opacity-80', className)} {...props} />,\n h2: ({ className, ...props }) => <h2 className={cn('mt-8 scroll-m-20 border-b pb-2 text-2xl font-semibold tracking-normal first:mt-0 [&>a]:no-underline [&>a:hover]:opacity-80', className)} {...props} />,\n h3: ({ className, ...props }) => <h3 className={cn('mt-6 scroll-m-20 text-xl font-semibold tracking-normal [&>a]:no-underline [&>a:hover]:opacity-80', className)} {...props} />,\n h4: ({ className, ...props }) => <h4 className={cn('mt-5 scroll-m-20 text-base font-semibold tracking-normal [&>a]:no-underline [&>a:hover]:opacity-80', className)} {...props} />,\n p: ({ className, ...props }) => <p className={cn('my-4 leading-7 text-foreground', className)} {...props} />,\n ul: ({ className, ...props }) => <ul className={cn('my-4 ml-6 list-disc space-y-2', className)} {...props} />,\n ol: ({ className, ...props }) => <ol className={cn('my-4 ml-6 list-decimal space-y-2', className)} {...props} />,\n li: ({ className, ...props }) => <li className={cn('leading-7', className)} {...props} />,\n blockquote: ({ className, ...props }) => (\n <blockquote className={cn('my-4 border-l-4 border-primary bg-muted/40 px-4 py-3 text-sm text-muted-foreground', className)} {...props} />\n ),\n table: ({ className, ...props }) => (\n <div className=\"my-4 w-full overflow-x-auto\">\n <table className={cn('w-full border-collapse text-sm', className)} {...props} />\n </div>\n ),\n th: ({ className, ...props }) => <th className={cn('border bg-muted px-3 py-2 text-left font-semibold', className)} {...props} />,\n td: ({ className, ...props }) => <td className={cn('border px-3 py-2 align-top', className)} {...props} />,\n hr: ({ className, ...props }) => <hr className={cn('my-8 border-border', className)} {...props} />,\n a: ({ className, href = '', onClick, ...props }) => (\n <a\n className={cn(\n isHashLink(href)\n ? 'text-primary no-underline transition-opacity hover:opacity-80'\n : 'font-medium text-primary no-underline transition-opacity hover:opacity-80',\n className\n )}\n href={href}\n target={isExternalLink(href) ? '_blank' : undefined}\n rel={isExternalLink(href) ? 'noreferrer' : undefined}\n onClick={(event) => {\n onClick?.(event);\n if (!event.defaultPrevented && onNavigateInternal && isInternalLink(href)) {\n event.preventDefault();\n onNavigateInternal(href, event);\n }\n }}\n {...props}\n />\n ),\n pre: ({ children }) => (\n <MarkdownCodeBlock code={getText(children).replace(/\\n$/, '')} language={getCodeLanguage(children)} />\n ),\n code: ({ className, children, ...props }: any) => {\n const isBlock = typeof className === 'string' && className.startsWith('language-');\n if (isBlock) return <code className={className} {...props}>{children}</code>;\n return (\n <code className={cn('rounded bg-muted px-1.5 py-0.5 text-[0.9em]', className)} {...props}>\n {children}\n </code>\n );\n },\n input: ({ className, ...props }) => (\n <input className={cn('mr-2 align-middle', className)} disabled {...props} />\n ),\n});\n\nexport default function MarkdownReader({\n content,\n components,\n className,\n wrapClass,\n head,\n onNavigateInternal,\n}: MarkdownReaderProps) {\n // Extract first H1 from markdown content as automatic title fallback.\n // head.title always wins; H1 is used when head.title is absent or head is not passed.\n const h1Title = React.useMemo(() => content.match(/^#[ \\t]+(.+)/m)?.[1]?.trim(), [content]);\n const effectiveHead: PageMetadataState | undefined = (head || h1Title)\n ? { ...(head ?? {}), title: head?.title ?? h1Title }\n : undefined;\n useHead(effectiveHead);\n\n const defaultComponents = React.useMemo(\n () => createDefaultComponents(onNavigateInternal),\n [onNavigateInternal]\n );\n\n return (\n <div className={cn('rf-markdown-reader max-w-none text-sm text-foreground', wrapClass, className)}>\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[\n rehypeSlug,\n [rehypeAutolinkHeadings, { behavior: 'wrap' }],\n rehypeSanitize,\n ]}\n components={{ ...defaultComponents, ...components }}\n >\n {content}\n </ReactMarkdown>\n </div>\n );\n}\n","import React, { useMemo, useState } from 'react';\r\nimport { ActionButton } from \"../ui/Buttons\";\r\nimport {converter} from \"../../libs/converter\";\r\nimport { TabLayouts, TabPosition } from '../ui/Tab';\r\nimport { FieldOnChange, setFormFieldsName, useFormContext } from './Form';\r\n\r\ninterface TabDynamicProps {\r\n children: React.ReactNode | ((record: any) => React.ReactNode);\r\n name: string;\r\n onChange?: FieldOnChange;\r\n onAdd?: (value: any[]) => void;\r\n onRemove?: (index: number) => void;\r\n value?: any[];\r\n label?: string;\r\n min?: number;\r\n max?: number;\r\n activeIndex?: number;\r\n title?: string;\r\n readOnly?: boolean;\r\n tabPosition?: TabPosition;\r\n}\r\n\r\nconst TabDynamic = ({\r\n children,\r\n name,\r\n onChange = undefined,\r\n onAdd = undefined,\r\n onRemove = undefined,\r\n //value = undefined,\r\n label = \"Tab\",\r\n min = 1,\r\n max = undefined,\r\n activeIndex = 0,\r\n title = undefined,\r\n readOnly = false,\r\n tabPosition = \"default\"\r\n}: TabDynamicProps) => {\r\n const { value, handleChange } = useFormContext({name, onChange});\r\n \r\n const [active, setActive] = useState(activeIndex);\r\n const [release, setRelease] = useState(0);\r\n\r\n\r\n const tabs = useMemo(() => {\r\n return (Array.isArray(value) ? value : Array.from({ length: min }, () => ({})))?.map((_, index) => label.includes(\"{\")\r\n ? converter.parse(value?.[index], label)\r\n : label + \" \" + (index + 1))\r\n }, [value, label, min, release]);\r\n\r\n const components = typeof children === 'function'\r\n ? children({record: value?.[active], records: value, currentIndex: active})\r\n : children;\r\n\r\n const component = useMemo(() => {\r\n return setFormFieldsName({\r\n children: components, \r\n parentName: `${name}.${active}`, \r\n parentKey: `${name}-${active}-${release}`\r\n });\r\n }, [active, components, name, release]);\r\n\r\n \r\n const handleAdd = () => {\r\n const next = Array.isArray(value) \r\n ? [...value, {}] \r\n : Array.from({ length: tabs.length + 1 }, () => ({}));\r\n onAdd?.(next);\r\n handleChange({ target: { name: `${name}.${next.length - 1}`, value: {} } });\r\n\r\n setActive(next.length - 1);\r\n setRelease(prev => prev + 1);\r\n }\r\n\r\n const handleRemove = (index: number) => {\r\n const lastIndex = tabs.length - 1;\r\n onRemove?.(index);\r\n //setRecords(next);\r\n handleChange({ target: { name: `${name}.${index}` } });\r\n\r\n if(active >= lastIndex) {\r\n setActive(prev => prev - 1);\r\n }\r\n setRelease(prev => prev + 1);\r\n }\r\n\r\n\r\n \r\n const TabLayout = TabLayouts[tabPosition];\r\n\r\n return (\r\n <div>\r\n {title && <h3>{title}</h3>}\r\n <TabLayout\r\n menu={<>\r\n {tabs?.map((label, index) => \r\n <li key={`${name}-${index}`} className=\"nav-item mr-1 relative\">\r\n <button\r\n onClick={() => setActive(index)}\r\n className={`nav-link ${index === active ? 'active' : ''}`}\r\n >\r\n {label}\r\n </button>\r\n {(!readOnly && tabs.length -1 >= min && index === active) &&\r\n <ActionButton className=\"absolute top-0 right-0 p-0\" icon=\"x\"\r\n onClick={() => handleRemove(index)}/>}\r\n </li>\r\n )}\r\n {!readOnly && (!max || tabs.length < max) && <li key={tabs.length + 1} className=\"nav-item mr-1\">\r\n <ActionButton className=\"nav-link\" icon=\"plus\" onClick={handleAdd} />\r\n </li>}\r\n </>}\r\n content={<div className=\"tab-pane fade show active\">\r\n {component}\r\n </div>}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nexport default TabDynamic;\r\n","import React, {useEffect, useMemo, useState} from 'react';\r\nimport componentLayout , {ComponentLayoutMap} from '../types/Layout';\r\nimport componentFormFields , {ComponentFormFieldsMap} from '../types/FormFields';\r\nimport { FormDatabase } from './widgets/Form';\r\nimport db from \"../libs/database\";\r\n\r\n\r\ntype ComponentSpec = {\r\n tag: keyof ComponentFormFieldsMap;\r\n props?: Record<string, any>;\r\n};\r\ntype FormFieldsMap = Record<string, ComponentSpec>;\r\ntype FieldBucketsMap = Record<string, FormFieldsMap>;\r\n\r\n\r\n// Cache\r\nconst templateCache = new Map<string, React.ReactElement>();\r\nconst fieldCache = new Map<string, {\r\n formFields : Record<string, React.ReactNode>;\r\n defaultValues : Record<string, any>;\r\n}>();\r\n\r\nclass Template {\r\n htmlString : string;\r\n formFields : Record<string, React.ReactNode> = {};\r\n defaultValues : Record<string, any> = {};\r\n\r\n public static async loadFromDatabase(path: string, bucket?: string): Promise<Template> {\r\n const result = await db.read(path);\r\n const html: string = typeof result.html === 'string' ? result.html : '';\r\n const fieldBuckets: FieldBucketsMap = typeof result.fields === 'object' && result.fields !== null\r\n ? result.fields\r\n : {};\r\n\r\n if (!result.html) {\r\n console.warn(`[Template] Attempted to load 'html' from database at path \"${path}\", but it was not found.`);\r\n }\r\n if (!result.fields) {\r\n console.warn(`[Template] Attempted to load 'fields' from database at path \"${path}\", but they were not found.`);\r\n }\r\n\r\n return new Template(html, fieldBuckets).use(bucket);\r\n }\r\n\r\n constructor(htmlString: string = \"\", fieldBuckets?: FieldBucketsMap) {\r\n this.htmlString = htmlString;\r\n\r\n if (fieldBuckets) {\r\n Object.entries(fieldBuckets).forEach(([bucketKey, fields]) => {\r\n this.setFields(fields, bucketKey);\r\n });\r\n }\r\n }\r\n\r\n public setHtml(html: string): this {\r\n this.htmlString = html;\r\n return this;\r\n }\r\n public use(bucket?: string): this {\r\n if (bucket && !this.useFields(bucket)) {\r\n console.warn(`[Template] Bucket Fields \"${bucket}\" not found`);\r\n }\r\n\r\n return this;\r\n }\r\n private useFields(bucket: string): boolean {\r\n if (fieldCache.has(bucket)) {\r\n const { formFields, defaultValues } = fieldCache.get(bucket)!;\r\n this.formFields = formFields;\r\n this.defaultValues = defaultValues;\r\n return true;\r\n } else {\r\n this.formFields = {};\r\n this.defaultValues = {};\r\n return false;\r\n }\r\n }\r\n\r\n private buildFormField(tag: keyof ComponentFormFieldsMap, props: any = {}) {\r\n const factory = componentFormFields[tag];\r\n return factory ? factory(props) : null;\r\n }\r\n public setFields(fields: FormFieldsMap, bucket: string, reset: boolean = false): Template {\r\n if (reset || !this.useFields(bucket)) {\r\n for (const [name, {tag, props = {}}] of Object.entries(fields)) {\r\n const field = this.buildFormField(tag, props);\r\n if (!field) {\r\n console.warn(`[Template] Tipo di input non riconosciuto: \"${tag}\" per la variabile \"${name}\"`);\r\n continue;\r\n }\r\n this.formFields[name] = field.render({name});\r\n Object.assign(this.defaultValues, field.getDefaults(name));\r\n }\r\n\r\n fieldCache.set(bucket, {\r\n formFields: this.formFields,\r\n defaultValues: this.defaultValues\r\n });\r\n }\r\n return this\r\n }\r\n\r\n public toJSX(): React.ReactElement {\r\n if (!templateCache.has(this.htmlString)) {\r\n templateCache.set(this.htmlString, this.parseXmlToReactTree());\r\n }\r\n\r\n return templateCache.get(this.htmlString)!;\r\n }\r\n\r\n public getDefaultValues() {\r\n return this.defaultValues;\r\n }\r\n\r\n public getFields() {\r\n return this.formFields;\r\n }\r\n\r\n private convertJsxAttrsToXml(input: string): string {\r\n return input.replace(/(\\w+)\\s*=\\s*{([^}]+)}/g, (_, key, value) => {\r\n return `${key}=\"${value.trim()}\"`;\r\n });\r\n }\r\n\r\n private parseTextToFragments(text: string): React.ReactNode[] {\r\n const fragments: React.ReactNode[] = [];\r\n let lastIndex = 0;\r\n let match: RegExpExecArray | null;\r\n const regex = /{([^}]+)}/g;\r\n\r\n while ((match = regex.exec(text))) {\r\n const index = match.index;\r\n const varName = match[1];\r\n\r\n // Push static text before match\r\n if (index > lastIndex) {\r\n fragments.push(text.substring(lastIndex, index));\r\n }\r\n lastIndex = index + match[0].length;\r\n\r\n const component = this.formFields[varName];\r\n if (component !== undefined) {\r\n fragments.push(component);\r\n } else {\r\n // opzionale: salta o aggiungi come stringa raw\r\n console.warn(`[parseTextToFragments] component \"${varName}\" not found`);\r\n }\r\n }\r\n\r\n if (lastIndex < text.length) {\r\n fragments.push(text.substring(lastIndex));\r\n }\r\n\r\n return fragments;\r\n }\r\n\r\n private walk(node: ChildNode): React.ReactNode[] {\r\n switch (node.nodeType) {\r\n case Node.TEXT_NODE: {\r\n const text = node.textContent;\r\n return text && text.trim() ? this.parseTextToFragments(text) : [];\r\n }\r\n\r\n case Node.ELEMENT_NODE: {\r\n const el = node as Element;\r\n const tag = el.tagName.toLowerCase();\r\n\r\n const component: React.ElementType = componentLayout[tag as keyof ComponentLayoutMap] ?? tag;\r\n\r\n const props = Object.fromEntries(\r\n Array.from(el.attributes, attr => [attr.name, attr.value] as const)\r\n );\r\n\r\n const children = Array.from(el.childNodes).flatMap(child => this.walk(child));\r\n\r\n return [React.createElement(component, props, ...children)];\r\n }\r\n\r\n default:\r\n return [];\r\n }\r\n }\r\n private parseXmlToReactTree(): React.ReactElement {\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(this.convertJsxAttrsToXml(this.htmlString), 'text/xml');\r\n\r\n const nodes = Array.from(doc.childNodes).flatMap(node => this.walk(node));\r\n console.log(\"nodes\", nodes);\r\n return React.createElement(React.Fragment, null, ...nodes);\r\n }\r\n}\r\n\r\n\r\nexport function FormTemplate({\r\n htmlString,\r\n components,\r\n dataStoragePath\r\n }: {\r\n htmlString: string;\r\n components: FormFieldsMap;\r\n dataStoragePath: string;\r\n}) {\r\n const Compiled = useMemo(() => {\r\n const template = new Template(htmlString).setFields(components, \"default\");\r\n\r\n return {\r\n RenderComponent: template.toJSX(),\r\n defaultValues: template.getDefaultValues()\r\n };\r\n }, [htmlString, components]);\r\n\r\n return (\r\n <FormDatabase dataStoragePath={dataStoragePath} defaultValues={Compiled.defaultValues}>\r\n {Compiled.RenderComponent}\r\n </FormDatabase>\r\n );\r\n}\r\n\r\n\r\nexport function FormTemplate2({\r\n template,\r\n fieldBucketKey,\r\n dataSource,\r\n }: {\r\n template: string;\r\n fieldBucketKey: string;\r\n dataSource?: string;\r\n}) {\r\n const [form, setForm] = useState<{\r\n children: React.ReactElement;\r\n defaultValues: Record<string, any>;\r\n } | null>(null);\r\n\r\n useEffect(() => {\r\n const controller = new AbortController();\r\n\r\n Template.loadFromDatabase(template, fieldBucketKey).then((template) => {\r\n if (!controller.signal.aborted) {\r\n setForm({\r\n children: template.toJSX(),\r\n defaultValues: template.getDefaultValues(),\r\n });\r\n }\r\n });\r\n\r\n return () => {\r\n controller.abort();\r\n };\r\n }, [template]);\r\n\r\n if (!form) {\r\n return <p className={\"p-4\"}><span className=\"mr-2 inline-block h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent\" />Caricamento in corso...</p>;\n }\r\n\r\n if (!dataSource) {\r\n return <p className={\"p-4\"}><span className=\"mr-2 inline-block h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent\" />Caricamento in corso...</p>;\n }\r\n\r\n return (\r\n <FormDatabase dataStoragePath={dataSource} defaultValues={form.defaultValues}>\r\n {form.children}\r\n </FormDatabase>\r\n );\r\n}\r\n\r\n","import React, { useMemo, useState, useEffect } from 'react';\r\nimport { UIProps, Wrapper } from \"../index\";\r\nimport { createPortal } from 'react-dom';\r\nimport { useTheme } from '../../Theme';\r\n\r\nexport type PaginationParams = {\r\n page?: number;\r\n limit?: number;\r\n navLimit?: number;\r\n scrollToTopOnChange?: boolean;\r\n scrollBehavior?: ScrollBehavior;\r\n align?: \"start\" | \"center\" | \"end\";\r\n sticky?: boolean;\r\n};\r\n\r\ninterface PaginationProps<T> extends UIProps, PaginationParams {\r\n recordSet: T[];\r\n children: (pageRecords: T[], pageOffset: number) => React.ReactNode;\r\n appendTo?: HTMLElement | null;\r\n}\r\n\r\nconst Pagination = <T,>({\r\n recordSet,\r\n children,\r\n limit = undefined,\r\n page = undefined,\r\n navLimit = undefined,\r\n appendTo = undefined,\r\n pre = undefined,\r\n post = undefined,\r\n className = undefined,\r\n wrapClass = undefined,\r\n scrollToTopOnChange = undefined,\r\n scrollBehavior = undefined,\r\n align = undefined,\r\n sticky = undefined\r\n}: PaginationProps<T>) => {\r\n const theme = useTheme(\"pagination\");\r\n\r\n const [currentPage, setCurrentPage] = useState(page || 1);\r\n\r\n // ✅ sync se page cambia dall'esterno\r\n /* useEffect(() => {\r\n if (page && page !== currentPage) {\r\n setCurrentPage(page);\r\n }\r\n }, [page]);*/\r\n\r\n const pageLimit = limit || recordSet.length;\r\n const totalPages = Math.ceil(recordSet.length / pageLimit);\r\n\r\n const pageOffset = (currentPage - 1) * pageLimit;\r\n const end = pageOffset + pageLimit;\r\n\r\n const pageRecords = useMemo(\r\n () => recordSet.slice(pageOffset, end),\r\n [recordSet, pageOffset, end]\r\n );\r\n\r\n const go = (p: number) => {\r\n if (p >= 1 && p <= totalPages) {\r\n setCurrentPage(p);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (!(scrollToTopOnChange || theme.Pagination.scrollToTop)) return;\r\n\r\n window.scrollTo({\r\n top: 0,\r\n behavior: scrollBehavior || theme.Pagination.scrollBehavior\r\n });\r\n }, [currentPage, scrollToTopOnChange, scrollBehavior]);\r\n\r\n const range = useMemo(() => {\r\n const max = Math.min(navLimit || theme.Pagination.maxItems, totalPages);\r\n\r\n let s = Math.max(1, currentPage - Math.floor(max / 2));\r\n let e = s + max - 1;\r\n\r\n if (e > totalPages) {\r\n e = totalPages;\r\n s = Math.max(1, e - max + 1);\r\n }\r\n\r\n return Array.from({ length: e - s + 1 }, (_, i) => s + i);\r\n }, [currentPage, navLimit, totalPages]);\r\n\r\n const disabledPrev = currentPage === 1 ? 'disabled' : '';\n const disabledNext = currentPage === totalPages ? 'disabled' : '';\n const resolvedAlign = align || theme.Pagination.align;\n const alignmentClass = {\n start: \"justify-start\",\n center: \"justify-center\",\n end: \"justify-end\",\n }[resolvedAlign as \"start\" | \"center\" | \"end\"] || \"justify-end\";\n\n const nav = (\n <Wrapper className={(wrapClass || theme.Pagination.wrapClass) + (sticky || theme.Pagination.sticky ? ` ${theme.Pagination.stickyClass}` : '')}\n style={sticky || theme.Pagination.sticky ? {backdropFilter: \"blur(10px)\", backgroundColor: \"rgba(255, 255, 255, 0.1)\"} : {}}\n >\r\n {pre}\r\n\n {recordSet.length > pageLimit && (\n <nav aria-label=\"Page navigation\" className={`${className || theme.Pagination.className} flex w-full ${alignmentClass}`}>\n <ul className=\"pagination\">\n\n <li className={`page-item page-item-group-start ${disabledPrev}`}>\n <button onClick={() => go(1)} className=\"page-link\">\n <span>&laquo;</span>\n </button>\n </li>\n\n <li className={`page-item ${disabledPrev}`}>\n <button\n className=\"page-link\"\n onClick={() => go(currentPage - 1)}\n >\n <span>&lsaquo;</span>\r\n </button>\r\n </li>\r\n\r\n {range.map((pageNum) => (\r\n <li\r\n key={pageNum}\r\n className={`page-item ${currentPage === pageNum ? 'active' : ''}`}\r\n >\r\n <button\r\n onClick={() => go(pageNum)}\r\n className=\"page-link\"\r\n >\r\n {pageNum}\r\n </button>\r\n </li>\r\n ))}\r\n\r\n <li className={`page-item page-item-group-end ${disabledNext}`}>\n <button\n className=\"page-link\"\n onClick={() => go(currentPage + 1)}\n >\n <span>&rsaquo;</span>\n </button>\r\n </li>\r\n\r\n <li className={`page-item ${disabledNext}`}>\n <button\n onClick={() => go(totalPages)}\n className=\"page-link\"\n >\n <span>&raquo;</span>\r\n </button>\r\n </li>\r\n\r\n </ul>\r\n </nav>\r\n )}\r\n\r\n {post}\r\n </Wrapper>\r\n );\r\n\r\n return (\r\n <>\r\n {children(pageRecords, pageOffset)}\r\n {appendTo\r\n ? createPortal(nav, appendTo)\r\n : appendTo === undefined && nav}\r\n </>\r\n );\r\n};\r\n\r\nexport default Pagination;\n","import React, { useCallback, useMemo, useState } from 'react';\nimport { useTheme } from \"../../Theme\";\nimport { Wrapper } from \"../ui/GridSystem\";\nimport { converter } from \"../../libs/converter\";\r\nimport { RecordProps } from \"../../providers/data/DataProvider\";\r\nimport Pagination, { PaginationParams } from './Pagination';\nimport { UIProps } from '../';\nimport { cn } from '../../libs/cn';\nimport { BadgeOverlay, BadgeProps } from './Badge';\nimport { Order, type OrderConfig } from '../../libs/order';\nimport { RecordSelectionState, useRecordSelection } from './useRecordSelection';\nimport { useStableRecordKey } from './useStableRecordKey';\n\r\ntype ImageProps = React.ReactElement<HTMLImageElement>;\nexport type GalleryRecord = RecordProps & {\n img?: React.ReactElement<{\n className: string;\n style?: React.CSSProperties;\n onClick?: (e: React.MouseEvent<HTMLImageElement>) => void\n }>;\r\n thumbnail?: string;\r\n mimetype?: string;\r\n width?: number;\r\n height?: number;\r\n name?: string;\n};\n\nexport type GalleryOverlayPosition =\n | \"topLeft\"\n | \"topRight\"\n | \"bottomLeft\"\n | \"bottomRight\"\n | \"middleLeft\"\n | \"middleRight\";\n\nexport type GalleryOverlayFilter =\n | Partial<Record<keyof GalleryRecord, unknown>>\n | ((item: GalleryRecord, index: number) => boolean);\n\nexport type GalleryOverlayValue =\n | BadgeProps\n | ((item: GalleryRecord, index: number) => BadgeProps | null | undefined);\n\nexport type GalleryOverlay = {\n position: GalleryOverlayPosition;\n badge?: GalleryOverlayValue;\n render?: (item: GalleryRecord, index: number) => React.ReactNode;\n when?: GalleryOverlayFilter;\n className?: string;\n};\n\ntype GalleryRenderedRecord =\n | { kind: \"item\"; image: ImageProps; item: GalleryRecord; index: number }\n | { kind: \"group\"; element: React.ReactElement };\n\nexport type GallerySelectionState = RecordSelectionState<GalleryRecord>;\nexport type GallerySelectionChangeHandler = (selection: GallerySelectionState) => void;\n\ninterface GalleryProps extends UIProps {\n body?: GalleryRecord[];\n Header?: string | React.ReactNode;\n Footer?: string | React.ReactNode;\n overlays?: GalleryOverlay[];\n onClick?: (record: GalleryRecord) => void;\n onSelectionChange?: GallerySelectionChangeHandler;\n sortable?: boolean | OrderConfig;\n pagination?: PaginationParams;\n scrollToTopOnChange?: boolean;\n scrollBehavior?: ScrollBehavior;\n gutterSize?: 0 | 1 | 2 | 3 | 4 | 5;\n rowCols?: 1 | 2 | 3 | 4 | 6;\n groupBy?: string | string[];\n selectedKeys?: string[];\n selectedRowKeys?: string[];\n scrollClass?: string;\n headerClass?: string;\n bodyClass?: string;\n footerClass?: string;\r\n selectedClass?: string;\r\n}\r\n\r\nconst Gallery = ({\n body = undefined,\n Header = undefined,\n Footer = undefined,\n overlays = undefined,\n onClick = undefined,\n onSelectionChange = undefined,\n sortable = false,\n pagination = undefined,\n gutterSize = undefined,\n rowCols = undefined,\n groupBy = undefined,\n selectedKeys = undefined,\n selectedRowKeys = undefined,\n pre = undefined,\n post = undefined,\n wrapClass = undefined,\r\n className = undefined,\r\n headerClass = undefined,\r\n scrollClass = undefined,\r\n bodyClass = undefined,\r\n footerClass = undefined,\r\n selectedClass = undefined\r\n}: GalleryProps) => {\n const theme = useTheme(\"gallery\");\n const activeClass = selectedClass || theme.Gallery.selectedClass;\n const [paginationNavEl, setPaginationNavEl] = useState<HTMLElement | null>(null);\n const paginationNavRef = useCallback((node: HTMLDivElement | null) => {\n if (node) setPaginationNavEl(node);\n }, []);\n const paddingSize = gutterSize ?? theme.Gallery.gutterSize;\n const numCols = rowCols ?? theme.Gallery.rowCols;\n const spacingScale: Record<number, string> = {\n 0: \"0\",\n 1: \"0.25rem\",\n 2: \"0.5rem\",\n 3: \"1rem\",\n 4: \"1.5rem\",\n 5: \"3rem\",\n };\n const itemGap = spacingScale[paddingSize] || spacingScale[2];\n const overlayOffset = \"0.75rem\";\n const overlayLaneWidth = \"calc(50% - 1rem)\";\n const itemWidth = `calc((100% - (${itemGap} * ${numCols - 1})) / ${numCols})`;\n const galleryRecords = body || [];\n const sortableOrder = useMemo(() => {\n if (!sortable) return undefined;\n if (typeof sortable === 'object') return sortable;\n\n const firstRecord = body?.[0];\n if (!firstRecord) return undefined;\n\n const firstSortableKey = Object.keys(firstRecord).find((key) => !key.startsWith('_'));\n if (!firstSortableKey) return undefined;\n\n return { field: firstSortableKey, dir: 'asc' as const };\n }, [body, typeof sortable === 'object' ? sortable?.dir : undefined, typeof sortable === 'object' ? sortable?.field : undefined, sortable]);\n const getStableRecordKey = useStableRecordKey<GalleryRecord>('item');\n const getRecordKey = useCallback((record: GalleryRecord, index?: number) => getStableRecordKey(record, index), [getStableRecordKey]);\n const {\n activeSelectedKeys,\n showSelection,\n updateSelection,\n } = useRecordSelection<GalleryRecord>({\n records: galleryRecords,\n selectedKeys,\n legacySelectedKeys: selectedRowKeys,\n onSelectionChange,\n getRecordKey,\n });\n\n const handleClick = (e: React.MouseEvent<HTMLElement>, record: GalleryRecord) => {\n if (activeClass) {\n const activeClasses = activeClass.split(/\\s+/).filter(Boolean);\n let currentElement = e.target as HTMLElement;\n\n while (currentElement && !currentElement.classList.contains(\"item\")) {\n if (['A', 'BUTTON', 'INPUT', 'LABEL'].includes(currentElement.tagName)) {\n return;\n }\n currentElement = currentElement.parentNode as HTMLElement;\n }\r\n\r\n if (!activeClasses.every((className) => currentElement.classList.contains(className))) {\n Array.from(currentElement.parentNode?.children || []).forEach(row => {\n row.classList.remove(...activeClasses);\n });\n\n currentElement.classList.add(...activeClasses);\n }\n }\n\r\n onClick?.(record);\n }\n\n const toggleSelection = useCallback((record: GalleryRecord, index: number) => {\n const recordKey = getRecordKey(record, index);\n const nextKeys = activeSelectedKeys.includes(recordKey)\n ? activeSelectedKeys.filter((key) => key !== recordKey)\n : [...activeSelectedKeys, recordKey];\n updateSelection(nextKeys);\n }, [activeSelectedKeys, getRecordKey, updateSelection]);\n\r\n const getImage = (item: GalleryRecord, index: number): ImageProps => {\r\n const imgElement = item.img;\r\n\r\n if (imgElement && React.isValidElement(imgElement)) {\n return React.cloneElement(imgElement, {\n className: cn(\"img-fluid w-full rounded-lg object-cover\", imgElement.props.className),\n style: {\n ...(imgElement.props.style || {}),\n aspectRatio: imgElement.props.style?.aspectRatio || \"16 / 11\",\n cursor: onClick ? \"pointer\" : \"default\",\n },\n onClick: onClick ? ((e: React.MouseEvent<HTMLImageElement>) => {\n handleClick(e, item);\n imgElement.props.onClick?.(e);\n }) : imgElement.props.onClick,\n }) as ImageProps;\n }\n\n return (\n <img\n className=\"img-fluid w-full rounded-lg object-cover\"\n src={\n item.thumbnail\n ? item.mimetype + item.thumbnail\n : 'data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAgAAAAwAAAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw=='\n }\n alt={item.name}\n width={item.width}\n height={item.height}\n style={{ aspectRatio: \"16 / 11\", cursor: onClick ? \"pointer\" : \"default\" }}\n onClick={onClick ? ((e: React.MouseEvent<HTMLImageElement>) => handleClick(e, item)) : undefined}\n />\n );\n };\n\n const renderOverlayContent = (content: BadgeProps): React.ReactNode => {\n if (React.isValidElement(content)) return content;\n\n return (\n <span className=\"inline-block max-w-full overflow-hidden text-ellipsis align-top\">\n <BadgeOverlay badge={content} className=\"badge-overlay\" />\n </span>\n );\n };\n\n const renderOverlay = (\n content: BadgeProps,\n style: React.CSSProperties,\n align: \"left\" | \"right\" = \"left\",\n className?: string\n ): React.ReactNode => (\n <div\n className={cn(\n \"absolute z-10 overflow-hidden text-ellipsis whitespace-nowrap leading-none\",\n align === \"right\" ? \"text-right\" : \"text-left\",\n className\n )}\n style={{\n width: overlayLaneWidth,\n maxWidth: overlayLaneWidth,\n pointerEvents: \"none\",\n ...style,\n }}\n >\n {renderOverlayContent(content)}\n </div>\n );\n\n const overlayPositionStyles: Record<GalleryOverlayPosition, { style: React.CSSProperties; align?: \"left\" | \"right\" }> = {\n topLeft: { style: { left: overlayOffset, top: overlayOffset } },\n topRight: { style: { right: overlayOffset, top: overlayOffset }, align: \"right\" },\n bottomLeft: { style: { bottom: overlayOffset, left: overlayOffset } },\n bottomRight: { style: { bottom: overlayOffset, right: overlayOffset }, align: \"right\" },\n middleLeft: { style: { left: overlayOffset, top: \"50%\", transform: \"translateY(-50%)\" } },\n middleRight: { style: { right: overlayOffset, top: \"50%\", transform: \"translateY(-50%)\" }, align: \"right\" },\n };\n\n const matchesOverlay = (overlay: GalleryOverlay, item: GalleryRecord, index: number): boolean => {\n if (!overlay.when) return true;\n if (typeof overlay.when === \"function\") return overlay.when(item, index);\n\n return Object.entries(overlay.when).every(([key, value]) => item[key] === value);\n };\n\n const getOverlayContent = (overlay: GalleryOverlay, item: GalleryRecord, index: number): BadgeProps | null | undefined => {\n if (overlay.render) return overlay.render(item, index);\n if (typeof overlay.badge === \"function\") return overlay.badge(item, index);\n return overlay.badge;\n };\n\n const renderItemOverlays = (item: GalleryRecord, index: number): React.ReactNode => {\n if (!overlays?.length) return null;\n\n return overlays.map((overlay, overlayIndex) => {\n if (!overlay.position || !matchesOverlay(overlay, item, index)) return null;\n\n const content = getOverlayContent(overlay, item, index);\n if (content === undefined || content === null || content === false) return null;\n\n const position = overlayPositionStyles[overlay.position];\n if (!position) return null;\n\n return (\n <React.Fragment key={`${overlay.position}-${overlayIndex}`}>\n {renderOverlay(content, position.style, position.align, overlay.className)}\n </React.Fragment>\n );\n });\n };\n\n const renderItem = (Component: React.ReactElement, index: number, item: GalleryRecord) => {\n const recordKey = getRecordKey(item, index);\n const isSelected = activeSelectedKeys.includes(recordKey);\n const activeClasses = activeClass?.split(/\\s+/).filter(Boolean) || [];\n\n return (\n <div\n key={index}\n className={cn(\"item min-w-0\", isSelected && activeClasses)}\n style={{\n flex: `0 0 ${itemWidth}`,\n maxWidth: itemWidth,\n }}\n >\n <div className=\"relative overflow-hidden rounded-lg\">\n {showSelection && (\n <label className=\"absolute left-3 top-3 z-20 inline-flex items-center rounded bg-background/90 px-2 py-1 shadow-sm\">\n <input\n type=\"checkbox\"\n aria-label={`Select item ${recordKey}`}\n checked={isSelected}\n onChange={() => toggleSelection(item, index)}\n onClick={(event) => event.stopPropagation()}\n />\n </label>\n )}\n {Component}\n {renderItemOverlays(item, index)}\n </div>\n </div>\n );\n };\n\n const getGroups = (body: GalleryRecord[], seps: string | string[]): GalleryRenderedRecord[] => {\n const groupMap: Record<string, Array<{ image: ImageProps; item: GalleryRecord; index: number }>> = {};\n\n body.forEach((item, index) => {\n const imgElement = getImage(item, index);\n const alt = imgElement.props.alt || \"\";\n const src = imgElement.props.src || \"\";\n if (!alt || !src) return;\n\n const [leftPart] = converter.splitFirst(alt.toUpperCase(), seps, /^\\d/g);\n const groupKey = leftPart || \"GROUP\";\n\n if (!groupMap[groupKey]) groupMap[groupKey] = [];\n groupMap[groupKey].push({ image: imgElement, item, index });\n });\n\n return Object.entries(groupMap).map(([groupName, items]) => (\n {\n kind: \"group\",\n element: (\n <section key={groupName} className=\"gallery-group rounded-lg border bg-card p-3 text-left\">\n <h3 className=\"mb-3 text-sm font-semibold uppercase tracking-wide text-muted-foreground\">\n {groupName.toLowerCase()}\n </h3>\n <div className={cn(\"flex flex-wrap items-center\", \"row-cols-\" + numCols)} style={{ gap: itemGap }}>\n {items.map(({ image, item, index }) => renderItem(image, index, item))}\n </div>\n </section>\n )\n }\n ));\n };\n\r\n const renderedBody = useMemo(() => {\n if (!Array.isArray(body)) return undefined;\n\n const orderedBody = Order.records(body, sortableOrder) || [];\n\n return groupBy\n ? getGroups(orderedBody, groupBy)\n : orderedBody.map((item, index) => ({ kind: \"item\", image: getImage(item, index), item, index }) as GalleryRenderedRecord);\n }, [activeSelectedKeys, body, groupBy, overlays, sortableOrder, toggleSelection]);\n\r\n if (renderedBody === undefined) {\r\n return <p className={\"p-4\"}><span className=\"mr-2 inline-block h-4 w-4 animate-spin rounded-full border-2 border-current border-t-transparent\" />Caricamento in corso...</p>;\n } else if (renderedBody.length === 0) {\r\n return <p className={\"p-4\"}>Nessun dato trovato</p>;\r\n }\r\n\r\n return (\n <div className={cn(\"flex items-stretch gap-3\", wrapClass || theme.Gallery.wrapClass)}>\n {pre && <div className=\"gallery-pre flex shrink-0 items-center self-stretch\">{pre}</div>}\n <Wrapper className={cn(\"min-w-0 flex-1 flex flex-col\", className || theme.Gallery.className)}>\n {Header && <div className={headerClass || theme.Gallery.headerClass}>{Header}</div>}\n <Wrapper className={cn(\"min-w-0 flex-1\", scrollClass || theme.Gallery.scrollClass)}>\n <Pagination\n recordSet={renderedBody}\n appendTo={paginationNavEl}\n wrapClass=\"px-3 pt-4 pb-2\"\n {...(pagination || {})}\n >\n {(pageRecords, pageOffset) => (\n <div className=\"p-3\">\n <div\n className={\"flex flex-wrap text-center items-center row-cols-\" + numCols + \" \" + (bodyClass || theme.Gallery.bodyClass)}\n style={{ gap: itemGap }}\n >\n {pageRecords.map((record) => (\n record.kind === \"group\"\n ? record.element\n : renderItem(record.image, record.index, record.item)\n ))}\n </div>\n </div>\n )}\n </Pagination>\n </Wrapper>\n <div ref={paginationNavRef} className=\"mt-auto\" />\n {Footer && <div className={footerClass || theme.Gallery.footerClass}>{Footer}</div>}\n </Wrapper>\n {post && <div className=\"gallery-post flex shrink-0 items-center self-stretch\">{post}</div>}\n </div>)\n}\n\r\nexport default Gallery;\r\n\r\n","import React, { useMemo } from \"react\";\nimport Gallery from \"../../ui/Gallery\";\nimport { type RecordProps } from \"../../../providers/data/DataProvider\";\nimport { type GridGalleryViewProps, type GridSelectionState } from \"./types\";\nimport { getRecordKeyResolver } from \"./utils\";\n\nfunction GridGalleryView<TRecord extends RecordProps>({\n records,\n recordId,\n sortable,\n pagination,\n selection = false,\n selectedKeys,\n onSelectionChange,\n onClickRow,\n groupBy,\n wrapClass,\n}: GridGalleryViewProps<TRecord>) {\n const getRecordKey = useMemo(() => getRecordKeyResolver(recordId), [recordId]);\n const sourceByKey = useMemo(() => {\n return records.reduce<Map<string, TRecord>>((acc, record) => {\n acc.set(getRecordKey(record), record);\n return acc;\n }, new Map());\n }, [getRecordKey, records]);\n\n return (\n <Gallery\n body={records}\n sortable={sortable}\n pagination={pagination}\n selectedKeys={selection ? selectedKeys : undefined}\n onSelectionChange={selection ? (nextSelection) => {\n let normalizedKeys = nextSelection.keys;\n let normalizedRecords = nextSelection.records as TRecord[];\n\n if (selection === \"single\" && nextSelection.keys.length > 1) {\n const lastKey = nextSelection.keys[nextSelection.keys.length - 1];\n normalizedKeys = lastKey ? [lastKey] : [];\n normalizedRecords = lastKey ? (sourceByKey.get(lastKey) ? [sourceByKey.get(lastKey)!] : []) : [];\n }\n\n const payload: GridSelectionState<TRecord> = {\n keys: normalizedKeys,\n records: normalizedRecords,\n hasSelection: normalizedKeys.length > 0,\n clear: () => onSelectionChange?.({\n keys: [],\n records: [],\n hasSelection: false,\n clear: () => undefined,\n }),\n };\n onSelectionChange?.(payload);\n } : undefined}\n onClick={onClickRow ? (record) => onClickRow(record as TRecord) : undefined}\n groupBy={groupBy as string | string[] | undefined}\n wrapClass={wrapClass}\n />\n );\n}\n\nexport default GridGalleryView;\n","import React, { useCallback, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { useLocation, useNavigate } from \"react-router-dom\";\nimport { type FormRef } from \"../Form\";\nimport Form from \"../Form\";\nimport { type DataProviderAdapter, type RecordProps } from \"../../../providers/data/DataProvider\";\nimport {\n type GridAction,\n type GridActionContext,\n type GridActions,\n type GridFormContext,\n type GridModalActionContext,\n type GridRecordKey,\n} from \"./types\";\nimport {\n getActionLabel,\n getRecordKeyResolver,\n isActionDisabled,\n isActionVisible,\n normalizeActions,\n sanitizeHashPart,\n} from \"./utils\";\n\nexport type GridActiveAction<TRecord extends RecordProps> = {\n actionKey: string;\n record?: TRecord;\n};\n\ntype UseGridActionsArgs<TRecord extends RecordProps> = {\n actions?: GridActions<TRecord>;\n form?: React.ReactElement | ((ctx: GridFormContext<TRecord>) => React.ReactNode);\n routeSync?: { edit?: boolean };\n preparedRecords: TRecord[];\n recordId: GridRecordKey<TRecord>;\n sourcePath?: string;\n db: DataProviderAdapter;\n onSave?: (args: { record?: TRecord; action: \"create\" | \"update\"; storagePath?: string }) => Promise<string | undefined>;\n onDelete?: (args: { record?: TRecord }) => Promise<string | undefined>;\n onAfterAction?: (args: { record?: TRecord; action: \"create\" | \"update\" | \"delete\" }) => Promise<boolean>;\n createRecordKey?: (record: TRecord) => string;\n audit?: boolean;\n};\n\ntype InternalGridActionContext<TRecord extends RecordProps> = GridActionContext<TRecord> & {\n close: () => void;\n save: () => Promise<boolean>;\n remove: () => Promise<boolean>;\n};\n\nfunction useGridActions<TRecord extends RecordProps>({\n actions,\n form,\n routeSync,\n preparedRecords,\n recordId,\n sourcePath,\n db,\n onSave,\n onDelete,\n onAfterAction,\n createRecordKey,\n audit = false,\n}: UseGridActionsArgs<TRecord>) {\n const location = useLocation();\n const navigate = useNavigate();\n const reactId = useId();\n const formRef = useRef<FormRef | undefined>(undefined);\n const getRecordKey = useMemo(() => getRecordKeyResolver(recordId), [recordId]);\n const normalizedActions = useMemo(() => normalizeActions(actions, !!form), [actions, form]);\n const [activeAction, setActiveAction] = useState<GridActiveAction<TRecord> | null>(null);\n const gridHashId = useMemo(() => {\n const sourceId = sourcePath || \"grid-records\";\n return `${sanitizeHashPart(sourceId)}-${sanitizeHashPart(reactId)}`;\n }, [reactId, sourcePath]);\n\n const close = useCallback(() => {\n setActiveAction(null);\n formRef.current = undefined;\n if (routeSync?.edit && location.hash.startsWith(`#${gridHashId}:`)) {\n navigate({ pathname: location.pathname, search: location.search, hash: \"\" }, { replace: true });\n }\n }, [gridHashId, location.hash, location.pathname, location.search, navigate, routeSync?.edit]);\n\n const removeRecord = useCallback(async (record: TRecord, closeOnSuccess = true) => {\n const storagePath = onDelete\n ? await onDelete({ record })\n : sourcePath\n ? `${sourcePath}/${getRecordKey(record)}`\n : undefined;\n if (!storagePath && !onDelete) return false;\n if (storagePath) await db.remove(storagePath);\n const result = await onAfterAction?.({ record, action: \"delete\" }) ?? true;\n if (result && closeOnSuccess) close();\n return result;\n }, [close, db, getRecordKey, onAfterAction, onDelete, sourcePath]);\n\n const saveCurrentAction = useCallback(async () => (\n formRef.current?.handleSave({ preventDefault: () => undefined } as React.MouseEvent<HTMLButtonElement>) ?? false\n ), []);\n\n const runAction = useCallback(async (actionKey: string, record?: TRecord) => {\n const action = normalizedActions[actionKey];\n if (!action) return;\n if (!isActionVisible(action, record) || isActionDisabled(action, record)) return;\n\n const context: InternalGridActionContext<TRecord> = {\n actionKey,\n record,\n recordKey: record ? getRecordKey(record) : undefined,\n rowIndex: record?._index,\n isNewRecord: !record,\n close,\n save: saveCurrentAction,\n remove: async () => {\n if (!record) return false;\n return removeRecord(record, true);\n },\n runAction: (nextActionKey: string, nextRecord?: TRecord) => runAction(nextActionKey, nextRecord),\n };\n\n if (action.kind === \"route\") {\n const target = typeof action.to === \"function\" ? action.to(context) : action.to;\n navigate(target);\n return;\n }\n\n if (action.kind === \"external\") {\n const target = typeof action.href === \"function\" ? action.href(context) : action.href;\n window.open(target, \"_blank\", \"noopener,noreferrer\");\n return;\n }\n\n if (action.kind === \"inline\") {\n await action.run(context);\n return;\n }\n\n if (actionKey === \"edit\" && routeSync?.edit && record) {\n navigate({ hash: `${gridHashId}:${encodeURIComponent(getRecordKey(record))}` }, { replace: false });\n }\n\n setActiveAction({ actionKey, record });\n }, [close, getRecordKey, gridHashId, navigate, normalizedActions, removeRecord, routeSync?.edit, saveCurrentAction]);\n\n const getActionContext = useCallback((actionKey: string, record?: TRecord): GridActionContext<TRecord> => ({\n actionKey,\n record,\n recordKey: record ? getRecordKey(record) : undefined,\n rowIndex: record?._index,\n isNewRecord: !record,\n runAction: (nextActionKey: string, nextRecord?: TRecord) => runAction(nextActionKey, nextRecord),\n }), [getRecordKey, runAction]);\n\n const runModalAction = useCallback(async (actionKey: string) => {\n const record = activeAction?.record;\n\n if (actionKey === \"cancel\") {\n close();\n return;\n }\n\n if (actionKey === \"save\") {\n await saveCurrentAction();\n return;\n }\n\n if (actionKey === \"remove\") {\n if (!record) return;\n await removeRecord(record, true);\n return;\n }\n\n await runAction(actionKey, record);\n }, [activeAction?.record, close, removeRecord, runAction, saveCurrentAction]);\n\n const getModalActionContext = useCallback((actionKey: string, record?: TRecord): GridModalActionContext<TRecord> => ({\n actionKey,\n record,\n recordKey: record ? getRecordKey(record) : undefined,\n rowIndex: record?._index,\n isNewRecord: !record,\n runAction: (nextActionKey: string) => {\n void runModalAction(nextActionKey);\n },\n }), [getRecordKey, runModalAction]);\n\n useEffect(() => {\n if (!routeSync?.edit) return;\n\n const hash = location.hash.replace(/^#/, \"\");\n const prefix = `${gridHashId}:`;\n if (!hash.startsWith(prefix)) {\n if (activeAction?.actionKey === \"edit\") setActiveAction(null);\n return;\n }\n\n const decodedRecordKey = decodeURIComponent(hash.slice(prefix.length));\n const nextRecord = preparedRecords.find((record) => getRecordKey(record) === decodedRecordKey);\n if (nextRecord) {\n setActiveAction((current) => (\n current?.actionKey === \"edit\" && current.record && getRecordKey(current.record) === decodedRecordKey\n ? current\n : { actionKey: \"edit\", record: nextRecord }\n ));\n }\n }, [activeAction?.actionKey, getRecordKey, gridHashId, location.hash, preparedRecords, routeSync?.edit]);\n\n const activeActionConfig = activeAction ? normalizedActions[activeAction.actionKey] : undefined;\n\n const activeActionBody = useMemo(() => {\n if (!activeAction || !activeActionConfig) return null;\n const actionContext = getActionContext(activeAction.actionKey, activeAction.record);\n const modalContext = getModalActionContext(activeAction.actionKey, activeAction.record);\n\n if (activeActionConfig.kind === \"delete\") {\n if (typeof activeActionConfig.body === \"function\") return activeActionConfig.body(modalContext);\n if (activeActionConfig.body !== undefined) return activeActionConfig.body;\n return (\n <div className=\"space-y-2\">\n <p>Delete this record?</p>\n {activeAction.record && <p className=\"text-sm text-muted-foreground\">{getRecordKey(activeAction.record)}</p>}\n </div>\n );\n }\n\n if ((activeAction.actionKey === \"add\" || activeAction.actionKey === \"edit\") && form) {\n const formNode = activeActionConfig.kind === \"modal\" && activeActionConfig.body !== undefined\n ? (typeof activeActionConfig.body === \"function\"\n ? activeActionConfig.body(modalContext)\n : activeActionConfig.body)\n : (typeof form === \"function\"\n ? form({ ...actionContext, record: activeAction.record })\n : form);\n if (!React.isValidElement(formNode)) return formNode;\n\n return (\n <Form\n aspect=\"empty\"\n defaultValues={activeAction.record}\n log={audit}\n onSave={onSave ? async ({ record, action, storagePath }) => (\n onSave({\n record: record as TRecord | undefined,\n action,\n storagePath,\n })\n ) : undefined}\n onDelete={onDelete ? async ({ record }) => (\n onDelete({\n record: record as TRecord | undefined,\n })\n ) : undefined}\n onFinally={async ({ record, action }) => {\n const success = await onAfterAction?.({ record: record as TRecord | undefined, action }) ?? true;\n if (success) close();\n return success;\n }}\n savePath={({ record }) => {\n if (!sourcePath) return undefined;\n const recordToSave = record as TRecord;\n const nextKey = createRecordKey?.(recordToSave) || getRecordKey(recordToSave) || `${Date.now()}`;\n return `${sourcePath}/${nextKey}`;\n }}\n ref={(ref) => { formRef.current = ref ?? undefined; }}\n >\n {formNode}\n </Form>\n );\n }\n\n if (activeActionConfig.kind === \"modal\" && activeActionConfig.body !== undefined) {\n return typeof activeActionConfig.body === \"function\"\n ? activeActionConfig.body(modalContext)\n : activeActionConfig.body;\n }\n\n return null;\n }, [activeAction, activeActionConfig, audit, close, createRecordKey, form, getActionContext, getModalActionContext, getRecordKey, onAfterAction, onDelete, onSave, sourcePath]);\n\n return {\n normalizedActions,\n activeAction,\n activeActionConfig,\n activeActionBody,\n activeKey: activeAction?.actionKey === \"edit\" && activeAction.record ? getRecordKey(activeAction.record) : null,\n runAction,\n runModalAction,\n close,\n getActionContext,\n getModalActionContext,\n getRecordKey,\n formRef,\n gridHashId,\n };\n}\n\nexport default useGridActions;\n","import React, { useMemo } from \"react\";\nimport { type RecordProps } from \"../../../providers/data/DataProvider\";\nimport { inferColumns } from \"./utils\";\nimport { type GridColumn } from \"./types\";\n\ntype UseGridColumnsArgs<TRecord extends RecordProps> = {\n columns?: GridColumn<TRecord>[];\n records: TRecord[];\n form?: React.ReactElement | ((ctx: any) => React.ReactNode);\n};\n\nfunction useGridColumns<TRecord extends RecordProps>({\n columns,\n records,\n form,\n}: UseGridColumnsArgs<TRecord>) {\n return useMemo(() => inferColumns(columns, records, form), [columns, form, records]);\n}\n\nexport default useGridColumns;\n","import { useEffect, useState } from \"react\";\nimport { safeClone } from \"../../../libs/utils\";\nimport { type RecordProps } from \"../../../providers/data/DataProvider\";\n\ntype UseGridPreparedRecordsArgs<TRecord extends RecordProps> = {\n records: TRecord[];\n transformRecords?: (records: TRecord[]) => TRecord[] | Promise<TRecord[]>;\n};\n\nfunction useGridPreparedRecords<TRecord extends RecordProps>({\n records,\n transformRecords,\n}: UseGridPreparedRecordsArgs<TRecord>) {\n const [preparedRecords, setPreparedRecords] = useState<TRecord[]>(records);\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n if (!transformRecords) {\n setPreparedRecords(records);\n setLoading(false);\n return;\n }\n\n let active = true;\n const next = transformRecords(safeClone(records));\n if (next instanceof Promise) {\n setLoading(true);\n next\n .then((resolved) => {\n if (active) setPreparedRecords(resolved);\n })\n .finally(() => {\n if (active) setLoading(false);\n });\n return () => {\n active = false;\n };\n }\n\n setPreparedRecords(next);\n setLoading(false);\n }, [records, transformRecords]);\n\n return {\n preparedRecords,\n loading,\n };\n}\n\nexport default useGridPreparedRecords;\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { type RecordProps } from \"../../../providers/data/DataProvider\";\nimport { type GridSelectionState } from \"./types\";\n\ntype UseGridSelectionArgs<TRecord extends RecordProps> = {\n selectedKeys?: string[];\n defaultSelectedKeys?: string[];\n onSelectionChange?: (selection: GridSelectionState<TRecord>) => void;\n};\n\nfunction useGridSelection<TRecord extends RecordProps>({\n selectedKeys,\n defaultSelectedKeys,\n onSelectionChange,\n}: UseGridSelectionArgs<TRecord>) {\n const [internalSelectedKeys, setInternalSelectedKeys] = useState<string[]>(defaultSelectedKeys || []);\n const [internalSelectedRecords, setInternalSelectedRecords] = useState<TRecord[]>([]);\n\n useEffect(() => {\n if (selectedKeys !== undefined) setInternalSelectedKeys(selectedKeys);\n }, [selectedKeys]);\n\n const activeSelectionKeys = selectedKeys ?? internalSelectedKeys;\n\n const clearSelection = useCallback(() => {\n if (selectedKeys === undefined) {\n setInternalSelectedKeys([]);\n }\n setInternalSelectedRecords([]);\n onSelectionChange?.({ keys: [], records: [], hasSelection: false, clear: () => undefined });\n }, [onSelectionChange, selectedKeys]);\n\n const selectionState = useMemo<GridSelectionState<TRecord>>(() => ({\n keys: activeSelectionKeys,\n records: internalSelectedRecords,\n hasSelection: activeSelectionKeys.length > 0,\n clear: clearSelection,\n }), [activeSelectionKeys, clearSelection, internalSelectedRecords]);\n\n const handleSelectionChange = useCallback((nextSelection: GridSelectionState<TRecord>) => {\n if (selectedKeys === undefined) {\n setInternalSelectedKeys(nextSelection.keys);\n }\n setInternalSelectedRecords(nextSelection.records);\n onSelectionChange?.(nextSelection);\n }, [onSelectionChange, selectedKeys]);\n\n return {\n activeSelectionKeys,\n selectionState,\n handleSelectionChange,\n };\n}\n\nexport default useGridSelection;\n","import React, { useCallback, useMemo } from \"react\";\nimport { useTheme } from \"../../../Theme\";\nimport { useDataProvider } from \"../../../providers/data/DataProviderContext\";\nimport Card from \"../../ui/Card\";\nimport Modal from \"../../ui/Modal\";\nimport { ActionButton, buttonPrimaryClass } from \"../../ui/Buttons\";\nimport { type RecordProps } from \"../../../providers/data/DataProvider\";\nimport GridGalleryView from \"./GridGalleryView\";\nimport GridTableView from \"./GridTableView\";\nimport {\n type GridAction,\n type GridActionContext,\n type GridCoreProps,\n type GridFooterContext,\n type GridHeaderContext,\n type GridModalActionContext,\n} from \"./types\";\nimport {\n getActionLabel,\n isActionDisabled,\n isActionVisible,\n resolveInitialOrder,\n} from \"./utils\";\nimport useGridActions from \"./useGridActions\";\nimport useGridColumns from \"./useGridColumns\";\nimport useGridPreparedRecords from \"./useGridPreparedRecords\";\nimport useGridSelection from \"./useGridSelection\";\n\nconst buildActionTitle = <TRecord extends RecordProps>(\n actionKey: string,\n action: GridAction<TRecord> | undefined,\n context: GridActionContext<TRecord> | GridModalActionContext<TRecord>\n) => {\n if (action?.kind === \"delete\") {\n if (typeof action.title === \"function\") return action.title(context as GridModalActionContext<TRecord>);\n return action.title || \"Delete record\";\n }\n if (action?.kind === \"modal\") {\n if (typeof action.title === \"function\") return action.title(context as GridModalActionContext<TRecord>);\n return action.title || getActionLabel(actionKey, action);\n }\n return getActionLabel(actionKey, action);\n};\n\nfunction GridCore<TRecord extends RecordProps>({\n records,\n recordId,\n sourcePath,\n columns,\n actions,\n form,\n routeSync,\n header,\n footer,\n layout = \"table\",\n sticky,\n wrapClass,\n loading = false,\n title,\n sortable = true,\n pagination,\n selection = false,\n selectedKeys,\n defaultSelectedKeys,\n onSelectionChange,\n onClickRow,\n reorderable = false,\n onReorder,\n groupBy,\n onSave,\n onDelete,\n onAfterAction,\n createRecordKey,\n audit = false,\n transformRecords,\n}: GridCoreProps<TRecord>) {\n const theme = useTheme(\"grid\");\n const db = useDataProvider();\n const { preparedRecords, loading: preparedRecordsLoading } = useGridPreparedRecords({ records, transformRecords });\n const inferredColumns = useGridColumns({ columns, records: preparedRecords, form });\n const { activeSelectionKeys, selectionState, handleSelectionChange } = useGridSelection({\n selectedKeys,\n defaultSelectedKeys,\n onSelectionChange,\n });\n const {\n normalizedActions,\n activeAction,\n activeActionConfig,\n activeActionBody,\n activeKey,\n runAction,\n close,\n getActionContext,\n getModalActionContext,\n getRecordKey,\n formRef,\n } = useGridActions({\n actions,\n form,\n routeSync,\n preparedRecords,\n recordId,\n sourcePath,\n db,\n onSave,\n onDelete,\n onAfterAction,\n createRecordKey,\n audit,\n });\n const canOpenEditFromRow = !!normalizedActions.edit && !!form;\n\n const handleRowClick = useCallback((record: TRecord) => {\n onClickRow?.(record);\n\n if (!canOpenEditFromRow) return;\n const recordKey = getRecordKey(record);\n if (activeAction?.actionKey === \"edit\" && activeAction.record && getRecordKey(activeAction.record) === recordKey) {\n close();\n return;\n }\n runAction(\"edit\", record);\n }, [activeAction?.actionKey, activeAction?.record, canOpenEditFromRow, close, getRecordKey, onClickRow, runAction]);\n\n const rowClickHandler = onClickRow || canOpenEditFromRow\n ? handleRowClick\n : undefined;\n\n const actionButton = useCallback((actionKey: string, record?: TRecord, className?: string) => {\n const action = normalizedActions[actionKey];\n if (!action || !isActionVisible(action, record)) return null;\n return (\n <ActionButton\n className={className || (actionKey === \"add\" ? buttonPrimaryClass : undefined)}\n icon={action.icon}\n label={getActionLabel(actionKey, action)}\n disabled={isActionDisabled(action, record)}\n onClick={() => runAction(actionKey, record)}\n />\n );\n }, [normalizedActions, runAction]);\n\n const headerActionKeys = useMemo(() => {\n return Object.entries(normalizedActions)\n .filter(([actionKey, action]) => actionKey !== \"edit\" && actionKey !== \"delete\" && isActionVisible(action, undefined))\n .map(([actionKey]) => actionKey);\n }, [normalizedActions]);\n\n const headerContext = useMemo<GridHeaderContext<TRecord>>(() => ({\n title,\n records: preparedRecords,\n selection: selectionState,\n runAction,\n }), [preparedRecords, runAction, selectionState, title]);\n\n const footerContext = useMemo<GridFooterContext<TRecord>>(() => ({\n records: preparedRecords,\n selection: selectionState,\n runAction,\n }), [preparedRecords, runAction, selectionState]);\n\n const resolvedHeader = useMemo(() => {\n if (header !== undefined) {\n return typeof header === \"function\" ? header(headerContext) : header;\n }\n if (!title && !headerActionKeys.length) return undefined;\n\n return (\n <>\n {title || <span />}\n {headerActionKeys.length ? (\n <span className=\"flex flex-wrap items-center gap-2\">\n {headerActionKeys.map((actionKey) => (\n <React.Fragment key={actionKey}>\n {actionButton(actionKey)}\n </React.Fragment>\n ))}\n </span>\n ) : null}\n </>\n );\n }, [actionButton, header, headerActionKeys, headerContext, title]);\n\n const resolvedFooter = useMemo(() => {\n if (footer !== undefined) {\n return typeof footer === \"function\" ? footer(footerContext) : footer;\n }\n return undefined;\n }, [footer, footerContext]);\n\n const activeModalContext = useMemo(() => {\n if (!activeAction || !activeActionConfig || (activeActionConfig.kind !== \"modal\" && activeActionConfig.kind !== \"delete\")) return undefined;\n return getModalActionContext(activeAction.actionKey, activeAction.record);\n }, [activeAction, activeActionConfig, getModalActionContext]);\n\n const activeModalHeader = useMemo(() => {\n if (!activeActionConfig || (activeActionConfig.kind !== \"modal\" && activeActionConfig.kind !== \"delete\") || activeActionConfig.header === undefined || !activeModalContext) {\n return undefined;\n }\n return typeof activeActionConfig.header === \"function\"\n ? activeActionConfig.header(activeModalContext)\n : activeActionConfig.header;\n }, [activeActionConfig, activeModalContext]);\n\n const activeModalFooter = useMemo(() => {\n if (!activeActionConfig || (activeActionConfig.kind !== \"modal\" && activeActionConfig.kind !== \"delete\")) return undefined;\n if (activeActionConfig.footer === false) return false;\n if (activeActionConfig.footer === undefined || !activeModalContext) return undefined;\n return typeof activeActionConfig.footer === \"function\"\n ? activeActionConfig.footer(activeModalContext)\n : activeActionConfig.footer;\n }, [activeActionConfig, activeModalContext]);\n\n const initialSort = resolveInitialOrder(sortable);\n\n return (\n <>\n <Card\n wrapClass={wrapClass}\n header={resolvedHeader}\n footer={resolvedFooter}\n className={(theme.Grid.Card.className + (sticky ? ` sticky-${sticky}` : \"\")).trim()}\n headerClass={theme.Grid.Card.headerClass}\n bodyClass={theme.Grid.Card.bodyClass}\n footerClass={theme.Grid.Card.footerClass}\n showLoader={loading || preparedRecordsLoading}\n showArrow={theme.Grid.Card.showArrow}\n >\n {layout === \"gallery\" ? (\n <GridGalleryView\n records={preparedRecords}\n recordId={recordId}\n sortable={initialSort || sortable}\n pagination={pagination}\n selection={selection}\n selectedKeys={activeSelectionKeys}\n onSelectionChange={handleSelectionChange}\n onClickRow={rowClickHandler}\n groupBy={groupBy}\n wrapClass={theme.Grid.Gallery.wrapClass}\n />\n ) : (\n <GridTableView\n records={preparedRecords}\n recordId={recordId}\n columns={inferredColumns}\n runAction={runAction}\n sortable={initialSort || sortable}\n pagination={pagination}\n selection={selection}\n selectedKeys={activeSelectionKeys}\n onSelectionChange={handleSelectionChange}\n onClickRow={rowClickHandler}\n reorderable={reorderable}\n onReorder={onReorder}\n activeKey={activeKey}\n wrapClass={theme.Grid.Table.wrapClass}\n />\n )}\n </Card>\n {activeAction && activeActionConfig && (activeActionConfig.kind === \"modal\" || activeActionConfig.kind === \"delete\") && (\n <Modal\n size={\n activeActionConfig.kind === \"modal\" || activeActionConfig.kind === \"delete\"\n ? activeActionConfig.size || theme.Grid.Modal.size\n : theme.Grid.Modal.size\n }\n position={\n activeActionConfig.kind === \"modal\" || activeActionConfig.kind === \"delete\"\n ? activeActionConfig.position || theme.Grid.Modal.position\n : theme.Grid.Modal.position\n }\n header={activeModalHeader}\n title={buildActionTitle(\n activeAction.actionKey,\n activeActionConfig,\n activeActionConfig.kind === \"modal\" || activeActionConfig.kind === \"delete\"\n ? getModalActionContext(activeAction.actionKey, activeAction.record)\n : getActionContext(activeAction.actionKey, activeAction.record)\n )}\n onClose={close}\n onSave={\n activeActionConfig.kind === \"modal\"\n && activeActionConfig.footer === undefined\n && (activeAction.actionKey === \"add\" || activeAction.actionKey === \"edit\")\n ? (event) => formRef.current?.handleSave(event) ?? Promise.resolve(false)\n : undefined\n }\n onDelete={\n activeActionConfig.kind === \"delete\"\n ? async () => {\n const record = activeAction.record;\n if (!record) return false;\n const storagePath = onDelete\n ? await onDelete({ record })\n : sourcePath\n ? `${sourcePath}/${getRecordKey(record)}`\n : undefined;\n if (!storagePath && !onDelete) return false;\n if (storagePath) await db.remove(storagePath);\n const success = await onAfterAction?.({ record, action: \"delete\" }) ?? true;\n if (success) close();\n return success;\n }\n : activeActionConfig.kind === \"modal\"\n && activeActionConfig.footer === undefined\n && activeAction.actionKey === \"edit\"\n && !!activeAction.record\n && !!normalizedActions.delete\n ? async () => {\n await getModalActionContext(activeAction.actionKey, activeAction.record).runAction(\"remove\");\n return false;\n }\n : undefined\n }\n footer={activeModalFooter}\n buttonCancel={\n activeActionConfig.kind === \"modal\" || activeActionConfig.kind === \"delete\"\n ? activeActionConfig.footer === undefined\n : true\n }\n buttonFullscreen={\n activeActionConfig.kind === \"modal\" || activeActionConfig.kind === \"delete\"\n ? activeActionConfig.buttonFullscreen\n : true\n }\n wrapClass={theme.Grid.Modal.wrapClass}\n className={theme.Grid.Modal.className}\n headerClass={theme.Grid.Modal.headerClass}\n titleClass={theme.Grid.Modal.titleClass}\n bodyClass={theme.Grid.Modal.bodyClass}\n footerClass={theme.Grid.Modal.footerClass}\n >\n {activeActionBody}\n </Modal>\n )}\n </>\n );\n}\n\nexport default GridCore;\n","import React from \"react\";\nimport { type RecordProps } from \"../../../providers/data/DataProvider\";\nimport GridCore from \"./GridCore\";\nimport { type GridArrayProps } from \"./types\";\n\nfunction GridArray<TRecord extends RecordProps>(props: GridArrayProps<TRecord>) {\n return <GridCore {...props} />;\n}\n\nexport default GridArray;\n","import React from \"react\";\nimport { type RecordProps } from \"../../providers/data/DataProvider\";\nimport GridArray from \"./grid-core/GridArray\";\nimport GridDB from \"./grid-core/GridDB\";\nimport { type GridGatewayDBProps, type GridArrayProps, type GridProps } from \"./grid-core/types\";\n\nfunction Grid<TRecord extends RecordProps = RecordProps>(props: GridProps<TRecord>) {\n if (\"records\" in props) {\n return <GridArray {...props as GridArrayProps<TRecord>} />;\n }\n\n return <GridDB {...props as GridGatewayDBProps<TRecord>} />;\n}\n\nexport default Grid;\nexport type * from \"./grid-core/types\";\n","import React from \"react\";\nimport Grid from \"../components/widgets/Grid\";\nimport {String, Email} from \"../components/ui/fields/Input\";\nimport {Select} from \"../components/ui/fields/Select\";\nimport { RecordProps } from \"../providers/data/DataProvider\";\n\nfunction Users() {\n return (\n <Grid\n path={\"/users\"}\n createRecordKey={(record: RecordProps) => record.email.replace('@', '-')}\n form={(\n <>\n <String name={\"username\"}\n label={\"Username\"}\n />\n <Email name={\"email\"}\n label={\"Email\"}\n required={true}\n updatable={false}\n />\n <Select name={\"permission\"}\n label={\"Permission\"}\n options={[\n {value: \"admin\", label: \"Admin\"},\n {value: \"user\", label: \"User\"},\n ]}\n required={true}\n />\n </>\n )}\n />\n );\n}\n\r\nexport default Users;\n","import React from 'react';\nimport {Link} from \"react-router-dom\";\nimport Icon from \"../components/ui/Icon\";\n\nconst NotFound: React.FC = () => {\n return (\n <div className='flex flex-col justify-center items-center vh-100'>\n <h1>404</h1>\n <p>Oops! Page not found.</p>\n <Link to='/'><Icon name=\"house-door\" /> Go to Home</Link>\n </div>\n );\n};\r\n\r\nexport default NotFound;\r\n","import React, { createContext, useContext } from 'react';\nimport type { StorageProviderAdapter } from './StorageProvider';\n\ntype StorageProviderContextValue = {\n registry: Record<string, StorageProviderAdapter>;\n defaultKey: string;\n};\n\nconst StorageProviderContext = createContext<StorageProviderContextValue | null>(null);\n\nexport const StorageProvider = ({\n registry,\n defaultKey,\n children,\n}: StorageProviderContextValue & { children: React.ReactNode }) => (\n <StorageProviderContext.Provider value={{ registry, defaultKey }}>\n {children}\n </StorageProviderContext.Provider>\n);\n\nexport const useStorageProvider = (name?: string): StorageProviderAdapter | null => {\n const ctx = useContext(StorageProviderContext);\n if (!ctx) return null;\n const key = name ?? ctx.defaultKey;\n return ctx.registry[key] ?? null;\n};\n\nexport default StorageProviderContext;\n","import { converter } from '../../libs/converter';\nimport {\n DataProviderAdapter,\n DatabaseOptions,\n ReadOptions,\n Condition,\n OperatorValue,\n RecordProps,\n RecordArray,\n WhereClause,\n OrderClause,\n} from './DataProvider';\n\ntype CollectionStore = Record<string, Record<string, any>>;\ntype ListenerSet = Set<() => void>;\ntype RecordObject = Record<string, Record<string, any>>;\ntype WhereEntry = [string, Condition | OperatorValue];\ntype OrderEntry = [string, 'asc' | 'desc'];\nconst SYSTEM_FIELDS = {\n key: '@key',\n value: '@value',\n};\n\nfunction toRecordArray(col: Record<string, any>): RecordArray {\n return Object.entries(col).map(([key, value], index) => ({\n _key: key,\n _index: index,\n ...(typeof value === 'object' && value !== null ? value : {}),\n }));\n}\n\nfunction getEntryValue(value: any, field: string) {\n if (!field) return value;\n const parts = field.split('.');\n let current = value;\n for (const part of parts) {\n if (current == null) return undefined;\n current = current[part];\n }\n return current;\n}\n\nfunction compareValues(left: any, right: any): number {\n if (left === right) return 0;\n if (left == null) return -1;\n if (right == null) return 1;\n if (typeof left === 'number' && typeof right === 'number') return left - right;\n if (typeof left === 'boolean' && typeof right === 'boolean') return Number(left) - Number(right);\n return globalThis.String(left).localeCompare(globalThis.String(right), undefined, { numeric: true, sensitivity: 'base' });\n}\n\nfunction matchWhere(value: any, raw: Condition | OperatorValue): boolean {\n const condition = typeof raw === 'object' && raw !== null && !Array.isArray(raw) ? raw as Condition : { eq: raw };\n for (const [op, target] of Object.entries(condition as Record<string, OperatorValue>)) {\n switch (op) {\n case 'eq': if (value !== target) return false; break;\n case 'gt': if (!(value > (target as any))) return false; break;\n case 'gte': if (!(value >= (target as any))) return false; break;\n case 'lt': if (!(value < (target as any))) return false; break;\n case 'lte': if (!(value <= (target as any))) return false; break;\n case 'in': if (!Array.isArray(target) || !(target as any[]).includes(value)) return false; break;\n case 'nin': if (Array.isArray(target) && (target as any[]).includes(value)) return false; break;\n default: return false;\n }\n }\n return true;\n}\n\nfunction processRecordObject(val: RecordObject, where?: WhereClause, order?: OrderClause): RecordObject {\n const orderEntries = Object.entries(order || {}) as OrderEntry[];\n const whereEntries = Object.entries(where || {}) as WhereEntry[];\n let filtered = Object.entries(val);\n\n if (whereEntries.length) {\n filtered = filtered.filter(([, value]) =>\n whereEntries.every(([field, raw]) => matchWhere(getEntryValue(value, field), raw))\n );\n }\n\n if (orderEntries.length) {\n filtered.sort((left, right) => {\n for (const [field, dir] of orderEntries) {\n const result = compareValues(getEntryValue(left[1], field), getEntryValue(right[1], field));\n if (result) return dir === 'desc' ? -result : result;\n }\n return 0;\n });\n }\n\n return Object.fromEntries(filtered);\n}\n\nfunction mapRecordObjectToArray(\n data: RecordObject,\n fieldMap?: DatabaseOptions['fieldMap']\n): RecordArray {\n const entries = Object.entries(data);\n\n if (!fieldMap) {\n return entries.map(([key, value], index) => (\n typeof value === 'object' && value !== null\n ? { _index: index, _key: key, ...value }\n : { _index: index, _key: key, [SYSTEM_FIELDS.value]: value }\n ));\n }\n\n const mapKeys = Object.keys(fieldMap);\n return entries.map(([key, value], index) => {\n const source = typeof value === 'object' && value !== null\n ? { [SYSTEM_FIELDS.key]: key, ...value }\n : { [SYSTEM_FIELDS.key]: key, [SYSTEM_FIELDS.value]: value };\n const mapped: Record<string, any> = {};\n for (const prop of mapKeys) {\n const field = fieldMap[prop];\n mapped[prop] = field.includes('{')\n ? converter.parse(source, field)\n : field === SYSTEM_FIELDS.key ? key\n : field === SYSTEM_FIELDS.value ? value\n : source[field];\n }\n return { _key: key, _index: index, ...mapped };\n });\n}\n\nexport class MockDataProvider implements DataProviderAdapter {\n private store: CollectionStore = {};\n private listeners: Map<string, ListenerSet> = new Map();\n\n constructor(initialData?: CollectionStore) {\n if (initialData) {\n for (const [rawPath, records] of Object.entries(initialData)) {\n const key = rawPath.startsWith('/') ? rawPath : `/${rawPath}`;\n this.store[key] = { ...records };\n }\n }\n }\n\n isConfigured(): boolean {\n return true;\n }\n\n getConfigurationState() {\n return { configured: true };\n }\n\n private getCollection(collPath: string): Record<string, any> {\n if (!this.store[collPath]) this.store[collPath] = {};\n return this.store[collPath];\n }\n\n private resolvePath(path: string): { collection: string; id?: string } {\n const normalized = path.startsWith('/') ? path : `/${path}`;\n if (this.store[normalized]) return { collection: normalized };\n\n const collectionKeys = Object.keys(this.store)\n .filter((key) => normalized.startsWith(`${key}/`))\n .sort((left, right) => right.length - left.length);\n\n const matchedCollection = collectionKeys[0];\n if (matchedCollection) {\n return {\n collection: matchedCollection,\n id: normalized.slice(matchedCollection.length + 1),\n };\n }\n\n const parts = normalized.replace(/^\\/+/, '').split('/').filter(Boolean);\n if (parts.length <= 1) return { collection: normalized };\n\n return {\n collection: `/${parts.slice(0, -1).join('/')}`,\n id: parts[parts.length - 1],\n };\n }\n\n private notify(collPath: string): void {\n this.listeners.get(collPath)?.forEach(cb => cb());\n }\n\n read = async (path: string, options: ReadOptions = {}): Promise<any> => {\n const { collection, id } = this.resolvePath(path);\n const col = this.getCollection(collection);\n if (id) {\n return col[id] ? { ...col[id] } : undefined;\n }\n const processed = processRecordObject(col, options.where, options.order);\n if (options.toArray) return Object.values(processed).map(v => ({ ...v }));\n return Object.fromEntries(Object.entries(processed).map(([k, v]) => [k, { ...v }]));\n };\n\n set = async (path: string, data: object): Promise<void> => {\n const { collection, id } = this.resolvePath(path);\n const col = this.getCollection(collection);\n if (id) {\n col[id] = { ...data };\n } else {\n this.store[collection] = { ...(data as Record<string, any>) };\n }\n this.notify(collection);\n };\n\n update = async (path: string, data: object): Promise<void> => {\n const { collection, id } = this.resolvePath(path);\n const col = this.getCollection(collection);\n if (id) {\n col[id] = { ...(col[id] || {}), ...data };\n } else {\n this.store[collection] = { ...col, ...(data as Record<string, any>) };\n }\n this.notify(collection);\n };\n\n remove = async (path: string): Promise<void> => {\n const { collection, id } = this.resolvePath(path);\n if (id) {\n delete this.getCollection(collection)[id];\n } else {\n delete this.store[collection];\n }\n this.notify(collection);\n };\n\n subscribe = (\n path: string | undefined,\n setRecords: (records: RecordArray) => void,\n options?: DatabaseOptions\n ): (() => void) => {\n if (!path) return () => undefined;\n\n const col = path.startsWith('/') ? path : `/${path}`;\n const dispatch = () => {\n const processed = processRecordObject(this.getCollection(col), options?.where, options?.order);\n const loaded = options?.onLoad ? options.onLoad(processed) : processed;\n setRecords(mapRecordObjectToArray(loaded, options?.fieldMap));\n };\n\n dispatch();\n\n if (!this.listeners.has(col)) this.listeners.set(col, new Set());\n this.listeners.get(col)!.add(dispatch);\n\n return () => {\n this.listeners.get(col)?.delete(dispatch);\n };\n };\n}\n","import {\n getAdditionalUserInfo,\n GoogleAuthProvider as FirebaseGoogleAuthProvider,\n onAuthStateChanged,\n signInWithCredential,\n signOut as firebaseSignOut,\n} from 'firebase/auth';\nimport { AuthProviderAdapter, AuthSignInOptions, UserProfile } from '../AuthProvider';\nimport { getGlobalVars, removeGlobalVars, setGlobalVars } from '../../../Global';\nimport { getSafeAuth } from '../../firebase-init';\nimport { authConfig } from './auth';\nimport { decodeJWT, loadScripts } from '../../../libs/utils';\nimport {\n createConfigurationState,\n getMissingKeys,\n type ProviderConfigurationState,\n} from '../../ProviderConfiguration';\n\nconst loadGoogleIdentityScript = async (): Promise<void> => {\n if ((window as any).google?.accounts?.id) return;\n loadScripts([\n { src: 'https://accounts.google.com/gsi/client', async: true, clean: true },\n ]);\n await new Promise((resolve) => setTimeout(resolve, 0));\n};\n\nexport class GoogleAuthProvider implements AuthProviderAdapter {\n getConfigurationState(): ProviderConfigurationState {\n return createConfigurationState(\n 'GoogleAuthProvider',\n getMissingKeys(authConfig('oAuth2') as Record<string, unknown> | undefined, ['clientId'], 'google.oAuth2.')\n );\n }\n\n isConfigured(): boolean {\n return this.getConfigurationState().configured;\n }\n\n getUser(): UserProfile | null {\n if (!this.isConfigured()) return null;\n const stored = getGlobalVars(\"user\");\n if (!stored) return null;\n const profile = stored.profile ?? {};\n return {\n ...profile,\n uid: stored.uid,\n email: stored.email ?? profile.email,\n displayName: stored.displayName ?? profile.name,\n photoURL: stored.photoURL ?? profile.picture,\n };\n }\n\n async signIn(options: AuthSignInOptions = {}): Promise<UserProfile | null> {\n const config = authConfig('oAuth2');\n if (!this.isConfigured() || !config?.clientId) {\n throw new Error('GoogleAuthProvider: missing google.oAuth2.clientId configuration.');\n }\n\n await loadGoogleIdentityScript();\n\n return new Promise((resolve, reject) => {\n if (!(window as any).google?.accounts?.id) {\n reject(new Error('GoogleAuthProvider: Google Identity Services script is not available.'));\n return;\n }\n\n (window as any).handleGoogleSignIn = async ({ credential }: { credential: string }): Promise<void> => {\n try {\n const credentialDecoded = decodeJWT(credential);\n localStorage.setItem('googleCredentialToken', credential);\n\n const firebaseAuth = getSafeAuth();\n if (!firebaseAuth) {\n reject(new Error('GoogleAuthProvider: Firebase auth is not initialized.'));\n return;\n }\n\n const firebaseCredential = FirebaseGoogleAuthProvider.credential(credential);\n const userCredential = await signInWithCredential(firebaseAuth, firebaseCredential);\n const additionalUserInfo = getAdditionalUserInfo(userCredential);\n\n setGlobalVars({\n ...userCredential.user,\n profile: additionalUserInfo?.profile ?? credentialDecoded,\n }, 'user');\n\n if (options.scopes?.length) {\n await this.getAccessToken(options.scopes);\n }\n\n resolve(this.getUser());\n } catch (error) {\n reject(error);\n }\n };\n\n (window as any).google.accounts.id.initialize({\n client_id: config.clientId,\n callback: (window as any).handleGoogleSignIn,\n auto_select: false,\n cancel_on_tap_outside: true,\n });\n (window as any).google.accounts.id.prompt();\n });\n }\n\n async signOut(): Promise<void> {\n const stored = getGlobalVars(\"user\");\n if (stored?.profile?.sub) {\n (window as any).google?.accounts?.id?.revoke(stored.profile.sub);\n }\n localStorage.removeItem(\"googleCredentialToken\");\n removeGlobalVars(\"user\");\n const auth = getSafeAuth();\n if (auth) {\n await firebaseSignOut(auth);\n }\n }\n\n onAuthChange(callback: (user: UserProfile | null) => void): () => void {\n const auth = getSafeAuth();\n if (!auth) {\n callback(this.getUser());\n return () => {};\n }\n return onAuthStateChanged(auth, (firebaseUser) => {\n const storedUser = this.getUser();\n if (!firebaseUser) {\n callback(storedUser);\n return;\n }\n const stored = getGlobalVars(\"user\");\n const profile = stored?.profile ?? {};\n callback({\n ...profile,\n uid: firebaseUser.uid,\n email: firebaseUser.email ?? profile.email,\n displayName: firebaseUser.displayName ?? profile.name,\n photoURL: firebaseUser.photoURL ?? profile.picture,\n });\n });\n }\n\n getAccessToken(scopes: string[] = []): Promise<string> {\n const config = authConfig('oAuth2');\n if (!this.isConfigured() || !config?.clientId) {\n return Promise.reject('Google client ID not found');\n }\n\n const scope = scopes.join(' ');\n const tokenKey = `googleAccessToken::${scope}`;\n const expiresKey = `googleExpiresAt::${scope}`;\n\n return new Promise((resolve, reject) => {\n const accessToken = localStorage.getItem(tokenKey);\n const expiresAt = localStorage.getItem(expiresKey);\n const isExpired = !expiresAt || new Date(expiresAt).getTime() < Date.now();\n\n if (accessToken && !isExpired) {\n resolve(accessToken);\n return;\n }\n\n const gclient = (window as any).google?.accounts?.oauth2?.initTokenClient({\n client_id: config.clientId,\n scope,\n callback: (tokenResponse: { access_token?: string; expires_in: number }) => {\n if (tokenResponse.access_token) {\n localStorage.setItem(tokenKey, tokenResponse.access_token);\n localStorage.setItem(expiresKey, new Date(Date.now() + tokenResponse.expires_in * 1000).toISOString());\n resolve(tokenResponse.access_token);\n } else {\n reject('Failed to obtain access token');\n }\n },\n });\n\n if (!gclient) {\n reject('Google token client is not available');\n return;\n }\n\n gclient.requestAccessToken();\n });\n }\n\n isAuthenticated(): boolean {\n return !!this.getUser();\n }\n}\n","import React, { createContext, useContext } from 'react';\nimport type { EmailProviderAdapter } from './EmailProvider';\n\ntype EmailProviderContextValue = {\n registry: Record<string, EmailProviderAdapter>;\n defaultKey: string;\n};\n\nconst EmailProviderContext = createContext<EmailProviderContextValue | null>(null);\n\nexport const EmailProvider = ({\n registry,\n defaultKey,\n children,\n}: EmailProviderContextValue & { children: React.ReactNode }) => (\n <EmailProviderContext.Provider value={{ registry, defaultKey }}>\n {children}\n </EmailProviderContext.Provider>\n);\n\nexport const useEmailProvider = (name?: string): EmailProviderAdapter | null => {\n const ctx = useContext(EmailProviderContext);\n if (!ctx) return null;\n const key = name ?? ctx.defaultKey;\n return ctx.registry[key] ?? null;\n};\n\nexport default EmailProviderContext;\n","import firebase from \"firebase/compat/app\";\nimport \"firebase/compat/storage\";\nimport { Config, onConfigChange } from \"../../Config\";\nimport init, { getFirebaseConfigurationState } from \"../firebase-init\";\nimport { StorageProviderAdapter } from \"./StorageProvider\";\nimport type { ProviderConfigurationState } from \"../ProviderConfiguration\";\n\nlet storageInstance: firebase.storage.Storage | undefined;\nif (typeof onConfigChange === 'function') {\n onConfigChange((newConfig: Config) => {\n if (newConfig.firebase) init(newConfig.firebase);\n });\n}\n\nconst getStorage = (): firebase.storage.Storage | undefined => {\n if (!storageInstance && firebase.apps.length) {\n storageInstance = firebase.app().storage();\n }\n return storageInstance;\n};\n\nexport class FirebaseStorageProvider implements StorageProviderAdapter {\n getConfigurationState(): ProviderConfigurationState {\n return getFirebaseConfigurationState();\n }\n\n isConfigured(): boolean {\n return this.getConfigurationState().configured;\n }\n\n upload = async (file: string, path: string): Promise<string | undefined> => {\n if (!file) return;\n const storageRef = getStorage()?.ref(path);\n if (!storageRef) { console.error(\"Firebase Storage not initialized\"); return; }\n try {\n const snapshot = await storageRef.putString(file, 'data_url');\n return await snapshot.ref.getDownloadURL();\n } catch (error) {\n console.error(\"Upload error:\", error);\n }\n };\n\n getURL = async (path: string): Promise<string | undefined> => {\n const storageRef = getStorage()?.ref(path);\n if (!storageRef) return;\n try {\n return await storageRef.getDownloadURL();\n } catch (error) {\n console.error(`Error getting download URL for ${path}:`, error);\n }\n };\n\n download = async (path: string): Promise<Blob | undefined> => {\n const url = await this.getURL(path);\n if (!url) return;\n try {\n const response = await fetch(url);\n if (!response.ok) throw new Error(\"Failed to fetch the file\");\n return await response.blob();\n } catch (error) {\n console.error(\"Error downloading file:\", error);\n }\n };\n\n delete = async (path: string): Promise<boolean> => {\n const storageRef = getStorage()?.ref(path);\n if (!storageRef) return false;\n try {\n await storageRef.delete();\n return true;\n } catch (error) {\n console.error(`Error deleting file ${path}:`, error);\n return false;\n }\n };\n}\n\nexport default new FirebaseStorageProvider();\n","import type { DropboxConfig } from '../../../Config';\nimport {\n createConfigurationState,\n getMissingKeys,\n type ProviderConfigurationState,\n} from '../../ProviderConfiguration';\nimport {\n clearAccessToken,\n getAccessToken,\n getAuthSession,\n redirectToAuthPage,\n} from '../../../auth';\nimport type { AuthProviderAdapter, AuthSignInOptions, UserProfile } from '../AuthProvider';\n\nexport const DROPBOX_AUTH_SERVER = 'www.dropbox.com/oauth2';\n\nexport class DropboxAuthProvider implements AuthProviderAdapter {\n constructor(private readonly config: DropboxConfig) {}\n\n getConfigurationState(): ProviderConfigurationState {\n return createConfigurationState(\n 'DropboxAuthProvider',\n getMissingKeys(this.config as unknown as Record<string, unknown>, ['clientId'], 'dropbox.')\n );\n }\n\n isConfigured(): boolean {\n return this.getConfigurationState().configured;\n }\n\n getUser(): UserProfile | null {\n if (!this.isConfigured()) return null;\n const session = getAuthSession(this.config.clientId);\n if (!session?.access_token) return null;\n return {\n uid: session.account_id ?? this.config.clientId,\n displayName: 'Dropbox',\n provider: 'dropbox',\n accountId: session.account_id,\n };\n }\n\n async signIn(options: AuthSignInOptions = {}): Promise<UserProfile | null> {\n if (!this.isConfigured()) {\n throw new Error('DropboxAuthProvider: missing dropbox.clientId configuration.');\n }\n\n redirectToAuthPage({\n authServer: DROPBOX_AUTH_SERVER,\n clientID: this.config.clientId,\n scopes: options.scopes,\n refreshParamName: 'token_access_type',\n });\n return this.getUser();\n }\n\n async signOut(): Promise<void> {\n clearAccessToken(this.config.clientId);\n }\n\n onAuthChange(callback: (user: UserProfile | null) => void): () => void {\n callback(this.getUser());\n return () => {};\n }\n\n async getAccessToken(): Promise<string> {\n if (!this.isConfigured()) {\n throw new Error('DropboxAuthProvider: missing dropbox.clientId configuration.');\n }\n\n const token = await getAccessToken(this.config.clientId);\n if (!token) {\n throw new Error('DropboxAuthProvider: access token not found.');\n }\n return token;\n }\n\n isAuthenticated(): boolean {\n if (!this.isConfigured()) return false;\n return !!getAuthSession(this.config.clientId)?.access_token;\n }\n}\n","import React from \"react\";\nimport {getAuth, GoogleAuthProvider, signInWithCredential, getAdditionalUserInfo, signOut} from 'firebase/auth';\nimport {Dropdown, DropdownDivider, DropdownItem, DropdownMenu} from \"../../../components/blocks/Dropdown\";\nimport {decodeJWT, loadScripts} from \"../../../libs/utils\";\nimport {PLACEHOLDER_USER, useTheme} from \"../../../Theme\";\nimport {useGlobalVars} from \"../../../Global\";\nimport {authConfig} from \"./auth\";\nimport TenantMenu from \"../../../Config\";\nimport ImageAvatar from \"../../../components/ui/ImageAvatar\";\n\ndeclare global {\n interface Window {\n google: {\n accounts: {\n id: {\n initialize: (options: any) => void;\n prompt: (callback?: () => void) => void;\n renderButton: (element: HTMLElement, options: any) => void;\n disableAutoSelect: () => void;\n revoke: (hint: string, callback?: () => void) => void;\n };\n oauth2: {\n initTokenClient: (config: {\n client_id: string;\n scope: string;\n callback: (response: TokenResponse) => void;\n }) => {\n requestAccessToken: () => void;\n };\n hasGrantedAllScopes?: (\n response: TokenResponse,\n ...scopes: string[]\n ) => boolean;\n };\n };\n };\n handleGoogleSignIn: (response: { credential: string }) => void;\n }\n}\n\n\ninterface GoogleAuthProps {\n scope?: string;\n iconLogout: string;\n className?: string;\n avatarClass?: string;\n}\n\ninterface TokenResponse {\n access_token: string;\n expires_in: number;\n scope: string;\n token_type: string;\n}\n\nconst loadScript = () => {\n loadScripts([\n {src: \"https://accounts.google.com/gsi/client\", async: true, clean: true}\n ]);\n}\n\nconst GoogleAuthFallback = () => (\n <div className=\"menu-item dropdown dropdown-mobile-full\" title=\"⚠️ Google OAuth2 config missing\">\n <Dropdown className=\"me-lg-3\"\n toggleButton={\n <div className=\"menu-img offline\">\n <img\n src={PLACEHOLDER_USER}\n alt=\"No Config\"\n height=\"36\"\n className=\"avatar rounded-circle ml-2\"\n />\n </div>\n }\n >\n <div className=\"text-danger p-2 small\" style={{ maxWidth: 300, whiteSpace: \"normal\" }}>\n ⚠️ Google Single Sign-On is not configured.<br />\n Please make sure the <code>oAuth2.clientId</code> value is correctly set in your tenant configuration.\n <hr className=\"my-2\" />\n <strong>To retrieve your <code>clientId</code>:</strong>\n <ol className=\"pl-3 mb-1\">\n <li>Go to <a href=\"https://console.cloud.google.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Google Cloud Console</a></li>\n <li>Select your project or create one</li>\n <li>Navigate to <code>APIs & Services &gt; Credentials</code></li>\n <li>Click <strong>\"Create Credentials\"</strong> &gt; <strong>OAuth client ID</strong></li>\n <li>Select <strong>Web application</strong> as the type</li>\n <li>Add your redirect URI (e.g. <code>https://yourdomain.com/auth/callback</code>)</li>\n <li>Click <strong>Create</strong> and copy the <code>Client ID</code></li>\n </ol>\n Use that value in your config under <code>google.oAuth2.clientId</code>.\n </div>\n </Dropdown>\n </div>\n);\n\n\nconst GoogleAuth = ({\n scope,\n iconLogout,\n className = undefined,\n avatarClass = undefined\n}: GoogleAuthProps) => {\n const theme = useTheme(\"auth\");\n const [ user, setUser, removeUser ] = useGlobalVars(\"user\");\n const userProfile = user?.profile || {};\n\n const config = authConfig(\"oAuth2\");\n if (!config) {\n console.warn(\"GoogleAuth: Missing oAuth2.clientId in configuration\");\n return GoogleAuthFallback();\n }\n\n const firebaseSignInWithGoogleCredential = async(credentialToken: string): Promise<void> => {\n try {\n const credential = GoogleAuthProvider.credential(credentialToken);\n const userCredential = await signInWithCredential(getAuth(), credential);\n const additionalUserInfo = getAdditionalUserInfo(userCredential);\n\n setUser({\n ...userCredential.user,\n profile: additionalUserInfo?.profile\n });\n } catch (error) {\n console.error(error);\n }\n }\n const handleGoogleSignOut = async (): Promise<void> => {\n if (user?.profile?.sub) {\n window.google.accounts.id.revoke(user.profile.sub);\n }\n localStorage.removeItem(\"googleCredentialToken\");\n\n removeUser();\n const auth = getAuth();\n\n await signOut(auth);\n console.log(\"Utente disconnesso da Firebase.\");\n\n loadScript();\n }\n window.handleGoogleSignIn = ({credential}: {credential: string}): void => {\n const credentialDecoded = decodeJWT(credential);\n\n console.log(credential, credentialDecoded)\n localStorage.setItem(\"googleCredentialToken\", credential);\n\n firebaseSignInWithGoogleCredential(credential);\n\n const gclient = window.google.accounts.oauth2.initTokenClient({\n client_id: config.clientId,\n scope: scope ?? config.scope ?? '',\n callback: (tokenResponse: TokenResponse) => {\n console.log(tokenResponse);\n\n localStorage.setItem('googleAccessToken', tokenResponse.access_token);\n localStorage.setItem('googleExpiresAt', new Date(new Date().getTime() + tokenResponse.expires_in * 1000).toISOString());\n },\n });\n function isGoogleTokenExpired(): boolean {\n const expiresAt = localStorage.getItem('googleExpiresAt');\n return !expiresAt || new Date(expiresAt).getTime() < Date.now();\n }\n\n if (!localStorage.getItem('googleAccessToken') || isGoogleTokenExpired()) {\n // get access token\n //gclient.requestAccessToken();\n }\n };\n\n if(!window.google) {\n loadScript();\n }\n\n return (\n <>\n {!user && <div id=\"g_id_onload\"\n data-client_id={config.clientId}\n data-context=\"signin\"\n data-ux_mode=\"popup\"\n data-callback=\"handleGoogleSignIn\"\n data-auto_select=\"true\"\n data-itp_support=\"true\">\n </div>}\n\n\n\n { <div className={className || theme.SignIn.className}>\n <Dropdown\n position=\"end\"\n toggleButton={<ImageAvatar\n src={userProfile.picture}\n title={userProfile.name}\n height={36}\n className={avatarClass || theme.SignIn.avatarClass}\n />}\n >\n {!user && <>\n <DropdownItem key={\"g_id_signin\"}>\n <div className=\"g_id_signin\"\n data-type=\"standard\"\n data-shape=\"pill\"\n data-theme=\"filled_white\"\n data-text=\"signin\"\n data-size=\"large\"\n data-logo_alignment=\"left\">\n </div>\n </DropdownItem>\n <DropdownDivider />\n </>}\n <TenantMenu />\n <DropdownMenu context={\"profile\"} />\n\n {user && <>\n <DropdownDivider />\n <DropdownItem onClick={handleGoogleSignOut} icon={iconLogout}>\n LOGOUT\n </DropdownItem>\n </>}\n </Dropdown>\n </div>}\n </>\n );\n}\n\n\nexport const googleGetAccessToken = (scopes: string[]): Promise<string> => {\n const config = authConfig(\"oAuth2\");\n if (!config) {\n console.warn(\"GoogleAuth: Missing oAuth2.clientId in configuration\");\n return Promise.reject(\"Google client ID not found\");\n }\n\n const scope = scopes.join(' ');\n const tokenKey = `googleAccessToken::${scope}`;\n const expiresKey = `googleExpiresAt::${scope}`;\n\n return new Promise((resolve, reject) => {\n const accessToken = localStorage.getItem(tokenKey);\n const expiresAt = localStorage.getItem(expiresKey);\n const isExpired = !expiresAt || new Date(expiresAt).getTime() < Date.now();\n\n if (accessToken && !isExpired) {\n resolve(accessToken);\n } else {\n const gclient = window.google.accounts.oauth2.initTokenClient({\n client_id: config.clientId,\n scope,\n callback: (tokenResponse) => {\n if (tokenResponse.access_token) {\n localStorage.setItem(tokenKey, tokenResponse.access_token);\n localStorage.setItem(expiresKey, new Date(Date.now() + tokenResponse.expires_in * 1000).toISOString());\n\n resolve(tokenResponse.access_token);\n } else {\n reject('Failed to obtain access token');\n }\n },\n });\n\n gclient.requestAccessToken();\n }\n });\n};\n\nexport default GoogleAuth;\n","import { Buffer } from 'buffer';\nimport { googleGetAccessToken } from '../../auth/google/GoogleAuth';\n\n\ntype SendEmailParams = {\n to: string[];\n bcc?: string[];\n subject: string;\n message: string;\n};\n\ntype GmailSendResponse = {\n id: string;\n threadId: string;\n labelIds?: string[];\n};\n\nexport async function sendEmail({ to, bcc, subject, message }: SendEmailParams): Promise<GmailSendResponse> {\n const accessToken = await googleGetAccessToken(['https://www.googleapis.com/auth/gmail.send']);\n\n const recipients = [\n `To: ${to.join(', ')}`,\n ];\n\n if (bcc && bcc.length) {\n recipients.push(`Bcc: ${bcc.join(', ')}`);\n }\n const email = [\n ...recipients,\n 'Content-Type: text/html; charset=utf-8',\n 'MIME-Version: 1.0',\n `Subject: ${subject}`,\n '',\n message,\n ].join('\\n');\n\n const base64EncodedEmail = Buffer.from(email)\n .toString('base64')\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n\n const response = await fetch('https://gmail.googleapis.com/gmail/v1/users/me/messages/send', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${accessToken}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n raw: base64EncodedEmail\n }),\n });\n\n if (!response.ok) {\n throw new Error('Failed to send email');\n }\n\n const data = await response.json();\n console.log('Email sent:', data);\n return data;\n}\n","import { EmailProviderAdapter, EmailSendParams } from '../EmailProvider';\nimport {\n createConfigurationState,\n getMissingKeys,\n type ProviderConfigurationState,\n} from '../../ProviderConfiguration';\nimport { authConfig } from '../../auth/google/auth';\nimport { sendEmail as gmailSend } from './email';\n\nexport class GmailEmailProvider implements EmailProviderAdapter {\n getConfigurationState(): ProviderConfigurationState {\n return createConfigurationState(\n 'GmailEmailProvider',\n getMissingKeys(authConfig('oAuth2') as Record<string, unknown> | undefined, ['clientId'], 'google.oAuth2.')\n );\n }\n\n isConfigured(): boolean {\n return this.getConfigurationState().configured;\n }\n\n async send(params: EmailSendParams): Promise<void> {\n if (!this.isConfigured()) {\n throw new Error(this.getConfigurationState().reason || 'GmailEmailProvider is not configured.');\n }\n\n await gmailSend({\n to: Array.isArray(params.to) ? params.to : [params.to],\n bcc: params.bcc\n ? (Array.isArray(params.bcc) ? params.bcc : [params.bcc])\n : undefined,\n subject: params.subject,\n message: params.message,\n });\n }\n}\n","import { DataProviderAdapter, DatabaseOptions, ReadOptions, RecordArray, RecordProps } from \"./DataProvider\";\nimport {\n createConfigurationState,\n getMissingKeys,\n type ProviderConfigurationState,\n} from \"../ProviderConfiguration\";\n\ninterface SupabaseConfig {\n url: string;\n anonKey: string;\n}\n\nconst warn = (method: string) =>\n console.warn(`SupabaseDataProvider.${method}: not fully implemented yet.`);\n\nexport class SupabaseDataProvider implements DataProviderAdapter {\n private config: SupabaseConfig;\n\n constructor(config: SupabaseConfig) {\n this.config = config;\n }\n\n getConfigurationState(): ProviderConfigurationState {\n return createConfigurationState(\n 'SupabaseDataProvider',\n getMissingKeys(this.config as unknown as Record<string, unknown>, ['url', 'anonKey'], 'supabase.')\n );\n }\n\n isConfigured(): boolean {\n return this.getConfigurationState().configured;\n }\n\n read = async (path: string, _options?: ReadOptions): Promise<any> => {\n warn(\"read\");\n // path format: \"/table/id\" or \"/table\"\n const [, table, id] = path.split(\"/\");\n const url = `${this.config.url}/rest/v1/${table}${id ? `?id=eq.${id}` : \"\"}`;\n const res = await fetch(url, {\n headers: {\n apikey: this.config.anonKey,\n Authorization: `Bearer ${this.config.anonKey}`,\n },\n });\n const data = await res.json();\n if (id) return data[0] ?? null;\n return Object.fromEntries((data as any[]).map((r: any) => [r.id, r]));\n };\n\n set = async (path: string, data: object): Promise<void> => {\n warn(\"set\");\n const [, table, id] = path.split(\"/\");\n const url = `${this.config.url}/rest/v1/${table}`;\n await fetch(url, {\n method: id ? \"PUT\" : \"POST\",\n headers: {\n apikey: this.config.anonKey,\n Authorization: `Bearer ${this.config.anonKey}`,\n \"Content-Type\": \"application/json\",\n Prefer: \"return=minimal\",\n },\n body: JSON.stringify(id ? { ...data, id } : data),\n });\n };\n\n update = async (path: string, data: object): Promise<void> => {\n warn(\"update\");\n await this.set(path, data);\n };\n\n remove = async (path: string): Promise<void> => {\n warn(\"remove\");\n const [, table, id] = path.split(\"/\");\n if (!id) { console.error(\"SupabaseDataProvider.remove: id required\"); return; }\n await fetch(`${this.config.url}/rest/v1/${table}?id=eq.${id}`, {\n method: \"DELETE\",\n headers: {\n apikey: this.config.anonKey,\n Authorization: `Bearer ${this.config.anonKey}`,\n },\n });\n };\n\n subscribe = (\n path: string | undefined,\n setRecords: (records: RecordArray) => void,\n _options?: DatabaseOptions\n ): (() => void) => {\n if (!path) return () => undefined;\n warn(\"subscribe — polling every 5s (no real-time)\");\n const [, table] = path.split(\"/\");\n const poll = async () => {\n const res = await fetch(`${this.config.url}/rest/v1/${table}`, {\n headers: {\n apikey: this.config.anonKey,\n Authorization: `Bearer ${this.config.anonKey}`,\n },\n });\n const data: any[] = await res.json();\n setRecords(data.map((r, i) => ({ ...r, _key: String(r.id ?? i), _index: i })));\n };\n void poll();\n const interval = setInterval(poll, 5000);\n return () => clearInterval(interval);\n };\n\n count = async (path: string): Promise<number> => {\n warn(\"count\");\n const [, table] = path.split(\"/\");\n const res = await fetch(`${this.config.url}/rest/v1/${table}?select=id`, {\n headers: {\n apikey: this.config.anonKey,\n Authorization: `Bearer ${this.config.anonKey}`,\n Prefer: \"count=exact\",\n },\n });\n const count = res.headers.get(\"content-range\")?.split(\"/\")[1];\n return count ? parseInt(count, 10) : 0;\n };\n}\n","import { StorageProviderAdapter } from \"./StorageProvider\";\nimport {\n createConfigurationState,\n getMissingKeys,\n type ProviderConfigurationState,\n} from \"../ProviderConfiguration\";\n\ninterface SupabaseStorageConfig {\n url: string;\n anonKey: string;\n bucket?: string;\n}\n\nconst warn = (method: string) =>\n console.warn(`SupabaseStorageProvider.${method}: not fully implemented yet.`);\n\nexport class SupabaseStorageProvider implements StorageProviderAdapter {\n private config: SupabaseStorageConfig;\n\n constructor(config: SupabaseStorageConfig) {\n this.config = config;\n }\n\n getConfigurationState(): ProviderConfigurationState {\n return createConfigurationState(\n 'SupabaseStorageProvider',\n getMissingKeys(this.config as unknown as Record<string, unknown>, ['url', 'anonKey'], 'supabase.')\n );\n }\n\n isConfigured(): boolean {\n return this.getConfigurationState().configured;\n }\n\n private get bucket() {\n return this.config.bucket ?? \"public\";\n }\n\n upload = async (file: string, path: string): Promise<string | undefined> => {\n warn(\"upload\");\n const base64 = file.split(\",\")[1];\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n const blob = new Blob([bytes]);\n\n const res = await fetch(\n `${this.config.url}/storage/v1/object/${this.bucket}/${path}`,\n {\n method: \"POST\",\n headers: {\n apikey: this.config.anonKey,\n Authorization: `Bearer ${this.config.anonKey}`,\n },\n body: blob,\n }\n );\n if (!res.ok) { console.error(\"Supabase upload error:\", await res.text()); return; }\n return this.getURL(path);\n };\n\n getURL = async (path: string): Promise<string | undefined> => {\n return `${this.config.url}/storage/v1/object/public/${this.bucket}/${path}`;\n };\n\n download = async (path: string): Promise<Blob | undefined> => {\n warn(\"download\");\n const url = await this.getURL(path);\n if (!url) return;\n try {\n const res = await fetch(url);\n if (!res.ok) throw new Error(\"Failed to fetch\");\n return await res.blob();\n } catch (error) {\n console.error(\"Supabase download error:\", error);\n }\n };\n\n delete = async (path: string): Promise<boolean> => {\n warn(\"delete\");\n const res = await fetch(\n `${this.config.url}/storage/v1/object/${this.bucket}/${path}`,\n {\n method: \"DELETE\",\n headers: {\n apikey: this.config.anonKey,\n Authorization: `Bearer ${this.config.anonKey}`,\n },\n }\n );\n return res.ok;\n };\n}\n","import { FirebaseDataProvider } from './data/firebase';\nimport { FirebaseStorageProvider } from './storage/firebase';\nimport { GoogleAuthProvider } from './auth/google/GoogleAuthProvider';\nimport { DropboxAuthProvider } from './auth/dropbox/DropboxAuthProvider';\nimport { GmailEmailProvider } from './email/google/GmailEmailProvider';\nimport { SupabaseDataProvider } from './data/supabase';\nimport { SupabaseStorageProvider } from './storage/supabase';\nimport { MockDataProvider } from './data/mock';\nimport type { DataProviderAdapter } from './data/DataProvider';\nimport type { StorageProviderAdapter } from './storage/StorageProvider';\nimport type { AuthProviderAdapter } from './auth/AuthProvider';\nimport type { EmailProviderAdapter } from './email/EmailProvider';\nimport type { DropboxConfig, FirebaseConfig, GoogleOAuth2, GoogleServiceAccount } from '../Config';\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport type ServiceCategory = 'data' | 'storage' | 'auth' | 'email';\n\ntype AnyAdapter =\n | DataProviderAdapter\n | StorageProviderAdapter\n | AuthProviderAdapter\n | EmailProviderAdapter;\n\nexport interface DriverDescriptor<TConfig = unknown> {\n service: ServiceCategory;\n create: (config: TConfig) => AnyAdapter;\n}\n\nexport type DriverManifest<TConfig> = Record<string, DriverDescriptor<TConfig>>;\n\n// ── Provider config types ────────────────────────────────────────────────────\n\nexport type GoogleProviderConfig = GoogleOAuth2 & {\n serviceAccount?: GoogleServiceAccount;\n developerToken?: string;\n};\n\nexport type SupabaseProviderConfig = {\n url: string;\n anonKey: string;\n bucket?: string;\n};\n\nexport type MockProviderConfig = {\n data?: ConstructorParameters<typeof MockDataProvider>[0];\n};\n\n// ── Firebase manifest ────────────────────────────────────────────────────────\n\nexport const FIREBASE_MANIFEST: DriverManifest<FirebaseConfig> = {\n dbRealtime: { service: 'data', create: () => new FirebaseDataProvider() },\n firestorage: { service: 'storage', create: () => new FirebaseStorageProvider() },\n};\n\n// ── Google manifest ──────────────────────────────────────────────────────────\n\nexport const GOOGLE_MANIFEST: DriverManifest<GoogleProviderConfig> = {\n googleAuth: { service: 'auth', create: () => new GoogleAuthProvider() },\n gmail: { service: 'email', create: () => new GmailEmailProvider() },\n};\n\nexport const DROPBOX_MANIFEST: DriverManifest<DropboxConfig> = {\n dropboxAuth: { service: 'auth', create: (cfg) => new DropboxAuthProvider(cfg) },\n};\n\n// ── Supabase manifest ────────────────────────────────────────────────────────\n\nexport const SUPABASE_MANIFEST: DriverManifest<SupabaseProviderConfig> = {\n supabaseDb: { service: 'data', create: (cfg) => new SupabaseDataProvider(cfg) },\n supabaseStorage: { service: 'storage', create: (cfg) => new SupabaseStorageProvider(cfg) },\n};\n\n// ── Mock manifest ────────────────────────────────────────────────────────────\n\nexport const MOCK_MANIFEST: DriverManifest<MockProviderConfig> = {\n mock: { service: 'data', create: (cfg) => new MockDataProvider(cfg?.data) },\n};\n\n// ── Central registry — adding a provider = one new entry here ────────────────\n\nexport const PROVIDER_MANIFESTS: Record<string, DriverManifest<any>> = {\n firebase: FIREBASE_MANIFEST,\n google: GOOGLE_MANIFEST,\n dropbox: DROPBOX_MANIFEST,\n supabase: SUPABASE_MANIFEST,\n mock: MOCK_MANIFEST,\n};\n\n// ── Driver name unions (type-safe services config) ────────────────────────────\n\nexport type DataDriverName = 'dbRealtime' | 'supabaseDb' | 'mock';\nexport type StorageDriverName = 'firestorage' | 'supabaseStorage';\nexport type AuthDriverName = 'googleAuth' | 'dropboxAuth';\nexport type EmailDriverName = 'gmail';\n\nexport type ServicesConfig = {\n data?: DataDriverName;\n storage?: StorageDriverName;\n auth?: AuthDriverName;\n email?: EmailDriverName;\n};\n","import React, { useState, Suspense, useMemo } from 'react';\r\nimport {\r\n BrowserRouter,\r\n Route,\r\n Routes,\r\n useLocation\r\n} from 'react-router-dom';\r\n\r\nimport Authorize, {AUTH_REDIRECT_URI} from \"./auth\";\r\nimport {converter as convert} from \"./libs/converter\";\r\nimport { AppThemeProviderConfig, ThemeProvider } from \"./Theme\";\r\nimport Users from \"./pages/Users\";\r\nimport NotFound from './pages/NotFound';\r\nimport Alert from \"./components/ui/Alert\";\r\nimport {\r\n AIConfig,\r\n DropboxConfig,\r\n FirebaseConfig,\r\n RuntimeProvider,\r\n ScrapeConfig\r\n} from \"./Config\";\r\nimport type { DataProviderAdapter } from \"./providers/data/DataProvider\";\r\nimport { DataProvider } from \"./providers/data/DataProviderContext\";\r\nimport type { StorageProviderAdapter } from \"./providers/storage/StorageProvider\";\r\nimport { StorageProvider } from \"./providers/storage/StorageProviderContext\";\r\nimport { MockDataProvider } from \"./providers/data/mock\";\r\nimport type { AuthProviderAdapter } from \"./providers/auth/AuthProvider\";\r\nimport { AuthProvider } from \"./providers/auth/AuthProviderContext\";\r\nimport { GoogleAuthProvider } from \"./providers/auth/google/GoogleAuthProvider\";\r\nimport type { EmailProviderAdapter } from \"./providers/email/EmailProvider\";\r\nimport { EmailProvider } from \"./providers/email/EmailProviderContext\";\r\nimport { IconProvider, type AppIconProviderConfig } from \"./providers/icon/IconProviderContext\";\r\nimport { HeadProvider } from \"./Head\";\r\nimport {\r\n PROVIDER_MANIFESTS,\r\n type ServicesConfig,\r\n type GoogleProviderConfig,\r\n type SupabaseProviderConfig,\r\n type MockProviderConfig,\r\n} from \"./providers/manifest\";\r\n\r\n\r\n\r\ninterface MenuItem {\r\n path: string;\r\n title?: string;\r\n icon?: string;\r\n children?: MenuItem[];\r\n [key: string]: any;\r\n}\r\n\r\ninterface UseMenuItem extends MenuItem {\r\n active: boolean;\r\n onClick?: () => void;\r\n}\r\n\r\ntype MenuConfig = {\r\n [key: string]: (MenuItem & {\r\n page?: React.ComponentType;\r\n layout?: React.ComponentType;\r\n })[];\r\n};\r\n\r\nexport type AppProvidersConfig = {\r\n firebase?: FirebaseConfig;\r\n supabase?: SupabaseProviderConfig;\r\n google?: GoogleProviderConfig;\r\n dropbox?: DropboxConfig;\r\n mock?: MockProviderConfig;\r\n custom?: {\r\n data?: Record<string, DataProviderAdapter> | DataProviderAdapter;\r\n storage?: Record<string, StorageProviderAdapter> | StorageProviderAdapter;\r\n auth?: Record<string, AuthProviderAdapter> | AuthProviderAdapter;\r\n email?: Record<string, EmailProviderAdapter> | EmailProviderAdapter;\r\n };\r\n services?: ServicesConfig;\r\n};\r\nexport type AppProps = {\r\n appName?: string;\r\n aiConfig?: AIConfig;\r\n scrapeConfig?: ScrapeConfig;\r\n tenantsURI?: string;\r\n proxyURI?: string;\r\n importPage: (pagesPath: string) => Promise<{ default: React.ComponentType }>;\r\n LayoutDefault?: React.ComponentType;\r\n menuConfig: MenuConfig;\r\n providers?: AppProvidersConfig;\r\n /** Icon provider registry config. String shorthand selects the default provider id. */\r\n iconProvider?: AppIconProviderConfig;\r\n /** Theme registry config. String shorthand selects the active theme id. */\r\n themeProvider?: AppThemeProviderConfig;\r\n children?: React.ReactNode;\r\n};\r\nfunction addCustomProviders<T>(registry: Record<string, T>, custom?: Record<string, T> | T): void {\r\n if (!custom) return;\r\n const candidate = custom as Record<string, T>;\r\n const entries = typeof custom === 'object' && !Array.isArray(custom) ? Object.entries(candidate) : [];\r\n const isNamedMap = entries.length > 0 && entries.every(([, value]) => typeof value === 'object' && value !== null);\r\n\r\n if (isNamedMap) {\r\n Object.assign(registry, candidate);\r\n return;\r\n }\r\n\r\n registry.custom = custom as T;\r\n}\r\n\r\nfunction selectDefaultKey<T>(registry: Record<string, T>, preferred?: string, fallback?: string): string {\r\n if (preferred && registry[preferred]) return preferred;\r\n if (fallback && registry[fallback]) return fallback;\r\n return Object.keys(registry)[0] ?? 'default';\r\n}\r\n\r\nfunction resolveProviderRegistries(providers: AppProvidersConfig = {}) {\r\n const data: Record<string, DataProviderAdapter> = {};\r\n const storage: Record<string, StorageProviderAdapter> = {};\r\n const auth: Record<string, AuthProviderAdapter> = {};\r\n const email: Record<string, EmailProviderAdapter> = {};\r\n\r\n const registries = { data, storage, auth, email } as Record<string, Record<string, any>>;\r\n\r\n // Manifest-driven: one loop for all providers — adding a new provider\r\n // only requires a new entry in PROVIDER_MANIFESTS, not a change here.\r\n for (const [providerKey, manifest] of Object.entries(PROVIDER_MANIFESTS)) {\r\n const cfg = (providers as Record<string, unknown>)[providerKey];\r\n if (cfg === undefined) continue;\r\n for (const [driverName, descriptor] of Object.entries(manifest)) {\r\n registries[descriptor.service][driverName] = descriptor.create(cfg);\r\n }\r\n }\r\n\r\n addCustomProviders(data, providers.custom?.data);\r\n addCustomProviders(storage, providers.custom?.storage);\r\n addCustomProviders(auth, providers.custom?.auth);\r\n addCustomProviders(email, providers.custom?.email);\r\n\r\n if (Object.keys(data).length === 0) data.mock = new MockDataProvider();\r\n if (Object.keys(auth).length === 0) auth.googleAuth = new GoogleAuthProvider();\r\n\r\n const svc = providers.services;\r\n\r\n return {\r\n data: { registry: data, defaultKey: selectDefaultKey(data, svc?.data) },\r\n storage: { registry: storage, defaultKey: selectDefaultKey(storage, svc?.storage) },\r\n auth: { registry: auth, defaultKey: selectDefaultKey(auth, svc?.auth) },\r\n email: { registry: email, defaultKey: selectDefaultKey(email, svc?.email) },\r\n };\r\n}\r\nconst MaybeEmailProvider = ({\r\n registry,\r\n defaultKey,\r\n children,\r\n}: {\r\n registry: Record<string, EmailProviderAdapter>;\r\n defaultKey: string;\r\n children: React.ReactNode;\r\n}) => Object.keys(registry).length > 0\r\n ? <EmailProvider registry={registry} defaultKey={defaultKey}>{children}</EmailProvider>\r\n : <>{children}</>;\r\n\r\nlet menu: MenuConfig = {};\r\nexport const setStaticMenu = (config: MenuConfig) => {\r\n menu = config;\r\n};\r\nexport const getStaticMenu = (type: string): MenuItem[] => {\r\n return menu[type] || [];\r\n};\r\nexport const getContextMenu = (): string[] => {\r\n return Object.keys(menu);\r\n};\r\n\r\nfunction App({\r\n importPage,\r\n LayoutDefault = undefined,\r\n aiConfig = undefined,\r\n scrapeConfig = undefined,\r\n tenantsURI = undefined,\r\n proxyURI = undefined,\r\n appName = \"LLM Native\",\r\n menuConfig = {},\r\n providers = {},\r\n iconProvider,\r\n themeProvider,\r\n children,\r\n}: AppProps) {\r\n const providerRegistries = resolveProviderRegistries(providers);\r\n const dataRegistry = providerRegistries.data;\r\n const storageRegistry = providerRegistries.storage;\r\n const authRegistry = providerRegistries.auth;\r\n const emailRegistry = providerRegistries.email;\r\n setStaticMenu(menuConfig);\r\n\r\n const LayoutEmpty = ({ children }: { children: React.ReactNode }) => <>{children}</>;\r\n const FallbackPage: React.FC<{ pageSource: string, message?: string }> = ({ pageSource, message }) => (\r\n <Alert type=\"warning\">Missing Page: {pageSource}\r\n {message && <code className={\"ml-2\"}>{message}</code>}\r\n </Alert>\r\n );\r\n\r\n function getRoute(key: string, item: MenuItem, index: number): React.ReactElement {\r\n const component = item.component ? \"/\" + item.component :\r\n (item.path === \"/\" \r\n ? \"/Home\"\r\n : convert.toCamel(item.path.split(\"*\")[0])\r\n );\r\n const pageSource = `./pages${component}.js`;\r\n\r\n const PageComponent = item.page || React.lazy(() =>\r\n importPage(pageSource)\r\n .then((mod): { default: React.ComponentType<any> } => {\r\n if (typeof mod.default !== 'function') {\r\n console.warn(`⚠️ Invalid default export in ${pageSource}`);\r\n return { default: () => <FallbackPage pageSource={pageSource} /> };\r\n }\r\n\r\n return { default: mod.default };\r\n })\r\n .catch((err: Error): { default: React.ComponentType<any> } => {\r\n console.error(`❌ Failed to load ${pageSource}:`, err);\r\n return { default: () => <FallbackPage pageSource={pageSource} message={err.message} /> };\r\n })\r\n );\r\n\r\n const LayoutComponent = item.layout || LayoutDefault || LayoutEmpty;\r\n return (\r\n <Route\r\n key={`${key}-${index}`}\r\n path={item.path}\r\n element={\r\n <LayoutComponent>\r\n <Suspense fallback={<div>Loading...</div>}>\r\n <PageComponent />\r\n </Suspense>\r\n </LayoutComponent>\r\n }\r\n />\r\n );\r\n }\r\n\r\n const renderRoutes = (menuObject: MenuConfig): React.ReactNode[] =>\r\n Object.keys(menuObject).flatMap(key =>\r\n menuObject[key].flatMap((item, index) => [\r\n item.path && getRoute(key, item, index),\r\n item.children && renderRoutes({ children: item.children })\r\n ].filter(Boolean))\r\n );\r\n\r\n return (\r\n <BrowserRouter future={{ v7_relativeSplatPath: true, v7_startTransition: true }}>\r\n <RuntimeProvider defaultConfig={{\r\n title: appName,\r\n firebase: providers.firebase,\r\n google: providers.google\r\n ? {\r\n oAuth2: { clientId: providers.google.clientId, scope: providers.google.scope },\r\n serviceAccount: providers.google.serviceAccount,\r\n developerToken: providers.google.developerToken,\r\n }\r\n : undefined,\r\n dropbox: providers.dropbox,\r\n ai: aiConfig,\r\n scrape: scrapeConfig,\r\n proxyURI: proxyURI\r\n }} tenantsURI={tenantsURI}>\r\n <AuthProvider {...authRegistry}>\r\n <DataProvider {...dataRegistry}>\r\n <StorageProvider {...storageRegistry}>\r\n <MaybeEmailProvider registry={emailRegistry.registry} defaultKey={emailRegistry.defaultKey}>\r\n <IconProvider config={iconProvider}>\r\n <HeadProvider appName={appName}>\r\n <ThemeProvider config={themeProvider}>\r\n {children}\r\n <Routes>\r\n <Route path={AUTH_REDIRECT_URI} element={<Authorize />}></Route>\r\n <>\r\n {renderRoutes({\r\n default: [{ path: \"/\" }], ...{\r\n ...menu,\r\n _auth: [{\r\n path: \"/users\",\r\n page: Users,\r\n layout: LayoutDefault\r\n }]\r\n }\r\n })}\r\n </>\r\n <Route path='*' element={<NotFound />}></Route>\r\n </Routes>\r\n </ThemeProvider>\r\n </HeadProvider>\r\n </IconProvider>\r\n </MaybeEmailProvider>\r\n </StorageProvider>\r\n </DataProvider>\r\n </AuthProvider>\r\n </RuntimeProvider>\r\n </BrowserRouter>\r\n );\r\n}\r\n\r\n\r\nexport const useMenu = (type: string): UseMenuItem[] => {\r\n const menuItems: MenuItem[] = getStaticMenu(type);\r\n const location = useLocation();\r\n\r\n // Funzione ricorsiva per determinare se l'item o uno dei suoi figli è attivo\r\n const markActive = (items: MenuItem[]): UseMenuItem[] => {\r\n return items.map((item) => {\r\n // Determina se l'item è attivo in base alla path\r\n const isActive = location.pathname === item.path;\r\n\r\n // Se ha dei figli, applica markActive ricorsivamente\r\n const children = item.children ? markActive(item.children) : [];\r\n\r\n // Se uno dei figli è attivo, il genitore diventa attivo\r\n const active = isActive || children.some(child => child.active);\r\n\r\n return {\r\n ...item,\r\n active,\r\n children\r\n };\r\n });\r\n };\r\n\r\n // Ottieni il menu processato e memorizza i risultati\r\n return useMemo(() => markActive(menuItems), [location.pathname]);\r\n};\r\n\r\nexport default App;\r\n","import { Config, GoogleConfig, onConfigChange } from \"../../../Config\";\nimport { googleGetAccessToken } from \"../../auth/google/GoogleAuth\";\n\nlet config: GoogleConfig | undefined = undefined;\nif (typeof onConfigChange === 'function') {\n onConfigChange((newConfig: Config) => {\n config = newConfig.google;\n });\n}\n\nexport const DEFAULT_GEO_TARGET = 'geoTargetConstants/2380';\nexport const DEFAULT_LANGUAGE = 'languageConstants/1000';\n\nexport const GEO_TARGETS: Record<string, string> = {\n ita: 'geoTargetConstants/2380',\n rome: 'geoTargetConstants/1033236',\n mil: 'geoTargetConstants/1033239',\n nap: 'geoTargetConstants/1033245',\n tor: 'geoTargetConstants/1033247',\n};\n\nexport const LANGUAGE_TARGETS: Record<string, string> = {\n it: 'languageConstants/1000',\n en: 'languageConstants/1001',\n fr: 'languageConstants/1002',\n es: 'languageConstants/1003',\n de: 'languageConstants/1005',\n};\n\nexport function getGeoTargetConstant(code: string): string {\n return GEO_TARGETS[code.toLowerCase()] || DEFAULT_GEO_TARGET;\n}\n\nexport function getLanguageConstant(code: string): string {\n return LANGUAGE_TARGETS[code.toLowerCase()] || DEFAULT_LANGUAGE;\n}\n\ntype GetKeywordIdeasParams = {\n keyword: string;\n googleAdsAccountId: string;\n geoCode?: string;\n languageCode?: string;\n};\n\nexport async function getKeywordIdeas({\n keyword,\n googleAdsAccountId,\n geoCode = 'ita',\n languageCode = 'it',\n }: GetKeywordIdeasParams) {\n if (!config?.developerToken) {\n console.error(`\n❌ Google Ads API: developerToken non configurato.\n\nPer ottenere un developerToken segui questi passaggi:\n\n1️⃣ Vai su https://ads.google.com/aw/apicenter\n2️⃣ Seleziona o crea un account Google Ads Manager (MCC) se non ne hai uno.\n3️⃣ Vai alla sezione \"Strumenti e impostazioni\" → \"Accesso API\" (o \"API Center\").\n4️⃣ Clicca su \"Richiedi accesso API\" se non l'hai ancora fatto.\n5️⃣ Copia il valore del tuo Developer Token (è un identificatore simile a: 'ABc123456789xyz').\n6️⃣ Inseriscilo nel tuo file di configurazione, nella sezione:\n config.google.developerToken\n\nℹ️ Attenzione: Inizialmente il token sarà in modalità di test. Per usarlo in produzione, dovrai richiedere l'approvazione da Google Ads.\n`);\n return [];\n }\n\n const accessToken = await googleGetAccessToken([\n 'https://www.googleapis.com/auth/adwords',\n ]);\n\n const geoTarget = getGeoTargetConstant(geoCode);\n const language = getLanguageConstant(languageCode);\n\n const url = `https://googleads.googleapis.com/v13/customers/${googleAdsAccountId}:generateKeywordIdeas`;\n\n const body = {\n keywordSeed: {\n keywords: [keyword],\n },\n geoTargetConstants: [geoTarget],\n language,\n };\n\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${accessToken}`,\n 'developer-token': config.developerToken,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n\n if (!res.ok) {\n const err = await res.text();\n throw new Error(`Keyword planner error: ${res.status} – ${err}`);\n }\n\n const data = await res.json();\n\n return data.results?.map((item: any) => ({\n keyword: item.text,\n avgMonthlySearches: item.keywordIdeaMetrics?.avgMonthlySearches || 0,\n competition: item.keywordIdeaMetrics?.competition || 'UNSPECIFIED',\n cpc: item.keywordIdeaMetrics?.averageCpc?.micros\n ? item.keywordIdeaMetrics.averageCpc.micros / 1_000_000\n : null,\n })) || [];\n}\n","// googleTrends.ts\n\nexport type TrendPoint = {\n date: string;\n value: number;\n};\n\nexport type RelatedQuery = {\n query: string;\n value: number;\n};\n\nexport type GoogleTrendsResponse = {\n keyword: string;\n timeline: TrendPoint[];\n};\n\nexport type GoogleTrendsRelatedResponse = {\n keyword: string;\n top: RelatedQuery[];\n rising: RelatedQuery[];\n};\n\n/**\n * Ottiene i dati storici di trend per una keyword.\n */\nexport async function getGoogleTrendsData(\n keyword: string,\n geo: string = 'IT',\n timeRange: string = 'today 12-m'\n): Promise<GoogleTrendsResponse> {\n const exploreUrl = `https://trends.google.com/trends/api/explore?hl=en-US&tz=0&req=${encodeURIComponent(\n JSON.stringify({\n comparisonItem: [{ keyword, geo, time: timeRange }],\n category: 0,\n property: '',\n })\n )}&_=${Date.now()}`;\n\n const widgetRes = await fetch(exploreUrl);\n const widgetText = await widgetRes.text();\n const widgetData = JSON.parse(widgetText.replace(\")]}',\", ''));\n\n const timelineWidget = widgetData.widgets.find((w: any) => w.id === 'TIMESERIES');\n if (!timelineWidget) throw new Error('Timeline widget not found');\n\n const token = timelineWidget.token;\n const req = timelineWidget.request;\n\n const timelineUrl = `https://trends.google.com/trends/api/widgetdata/multiline?hl=en-US&tz=0&req=${encodeURIComponent(\n JSON.stringify(req)\n )}&token=${token}&_=${Date.now()}`;\n\n const timelineRes = await fetch(timelineUrl);\n const timelineText = await timelineRes.text();\n const timelineData = JSON.parse(timelineText.replace(\")]}',\", ''));\n\n const timeline: TrendPoint[] = timelineData.default.timelineData.map((d: any) => ({\n date: d.formattedTime,\n value: d.value[0],\n }));\n\n return {\n keyword,\n timeline,\n };\n}\n\n/**\n * Ottiene query correlate (top e rising) per una keyword.\n */\nexport async function getGoogleTrendsRelated(\n keyword: string,\n geo: string = 'IT',\n timeRange: string = 'today 12-m'\n): Promise<GoogleTrendsRelatedResponse> {\n const exploreUrl = `https://trends.google.com/trends/api/explore?hl=en-US&tz=0&req=${encodeURIComponent(\n JSON.stringify({\n comparisonItem: [{ keyword, geo, time: timeRange }],\n category: 0,\n property: '',\n })\n )}&_=${Date.now()}`;\n\n const widgetRes = await fetch(exploreUrl);\n const widgetText = await widgetRes.text();\n const widgetData = JSON.parse(widgetText.replace(\")]}',\", ''));\n\n const relatedWidget = widgetData.widgets.find((w: any) => w.id === 'RELATED_QUERIES');\n if (!relatedWidget) throw new Error('Related queries widget not found');\n\n const relatedUrl = `https://trends.google.com/trends/api/widgetdata/relatedsearches?hl=en-US&tz=0&req=${encodeURIComponent(\n JSON.stringify(relatedWidget.request)\n )}&token=${relatedWidget.token}&_=${Date.now()}`;\n\n const relatedRes = await fetch(relatedUrl);\n const relatedText = await relatedRes.text();\n const relatedData = JSON.parse(relatedText.replace(\")]}',\", ''));\n\n const top = relatedData.default.rankedList?.[0]?.rankedKeyword?.map((item: any) => ({\n query: item.query,\n value: item.value,\n })) || [];\n\n const rising = relatedData.default.rankedList?.[1]?.rankedKeyword?.map((item: any) => ({\n query: item.query,\n value: item.value,\n })) || [];\n\n return {\n keyword,\n top,\n rising,\n };\n}\n","import React from \"react\";\nimport {fetchWithRetry} from \"../../libs/fetch\";\nimport {sleep} from \"../../libs/utils\";\nimport {AuthButton, getAccessToken, useAccessToken} from \"../../auth\";\nimport type {IButton} from \"../../components/ui/Buttons\";\nimport pathInfo from \"../../libs/path\";\nimport {Config, DropboxConfig, onConfigChange} from \"../../Config\";\nimport Icon from \"../../components/ui/Icon\";\n\nconst DROPBOX_CHECK_DELAY = 5000;\nconst DROPBPX_URL = \"https://www.dropbox.com/home\";\n\ninterface AsyncJobResponse {\n async_job_id?: string;\n [key: string]: any;\n}\n\ninterface CheckResponse {\n [key: string]: any;\n entries?: any[];\n}\n\ntype DropboxListFolderResponse = {\n entries: any[];\n cursor: string;\n has_more: boolean;\n};\n\ninterface ListFoldersParams {\n path?: string;\n recursive?: boolean;\n}\n\ntype PathEntry = {\n from: string;\n to: string;\n};\n\ntype CopyJobStatus = {\n [key: string]: any;\n '.tag': 'in_progress' | 'complete' | 'failed' | 'async_job_id';\n async_job_id?: string;\n entries?: any[];\n failure?: any;\n};\n\n\ntype ThumbnailEntry = {\n path: string;\n [key: string]: any;\n};\n\ntype ThumbnailRequestOptions = {\n thumbnailsRequest: ThumbnailEntry[];\n size?: 'w32h32' | 'w64h64' | 'w128h128' | 'w256h256' | 'w480h320' | 'w640h480' | 'w960h640' | 'w1024h768' | 'w2048h1536';\n format?: 'jpg' | 'jpeg' | 'png' | 'tiff' | 'tif' | 'gif' | 'webp' | 'ppm' | 'bmp';\n mode?: 'strict' | 'bestfit' | 'fitone_bestfit' | 'original';\n};\n\ntype ThumbnailResult = {\n [path: string]: {\n path: string;\n thumbnail: string;\n mimetype: string;\n width: number;\n height: number;\n [key: string]: any;\n };\n};\n\nlet config: DropboxConfig | undefined = undefined;\nif (typeof onConfigChange === 'function') {\n onConfigChange((newConfig: Config) => {\n config = newConfig.dropbox;\n });\n}\n\nconst fetchDropboxBlob = async (\n url: string,\n body: Blob | ArrayBuffer | Uint8Array,\n headers: Record<string, string> = {}\n): Promise<Response | null> => {\n if (!config) {\n console.error('DropBox: Config not found');\n return null;\n }\n\n const ACCESS_TOKEN= await getAccessToken(config.clientId);\n if(!ACCESS_TOKEN) {\n throw new Error('DropBox: Access token not found');\n }\n\n return await fetch(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${ACCESS_TOKEN}`,\n 'Content-Type': 'application/octet-stream',\n ...headers\n },\n body: body,\n }).catch((error) => {\n console.error('There was a problem with the fetch operation:', error);\n return null;\n }).finally(() => {\n console.log('DropBox: Fetch operation completed');\n })\n}\n\nconst fetchDropbox = async (\n url: string,\n body: any,\n headers: Record<string, string> = {}\n): Promise<any> => {\n if (!config) {\n console.error('DropBox: Config not found');\n return;\n }\n const ACCESS_TOKEN= await getAccessToken(config.clientId);\n if(!ACCESS_TOKEN) {\n console.error('DropBox: Access token not found');\n return;\n }\n\n return await fetchWithRetry(url, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${ACCESS_TOKEN}`,\n 'Content-Type': 'application/json',\n ...headers\n },\n body: JSON.stringify(body),\n }).then(async (response) => {\n if (response.status === 409) {\n const json = await response.json();\n if (!json.error_summary || !json.error_summary.includes(\"not_found\")) {\n console.error('DropBox: Fetch operation failed:', json, url, body);\n }\n return;\n }\n return response;\n }).catch((error) => {\n console.error('There was a problem with the fetch operation:', error, url, body);\n return;\n }).finally(() => {\n console.log('DropBox: Fetch operation completed', url, body);\n })\n}\n\nexport const resolvePath = (path: string, includeHost = false): string => {\n const rootPath = config?.rootPath || \"\";\n return (includeHost ? DROPBPX_URL : \"\") + (path.startsWith(rootPath) ? path : rootPath + path);\n}\n\nconst search = async (\n jobPath: string,\n startPath: string = \"\",\n removeExtension: boolean = false\n): Promise<Record<string, string>> => {\n const paths: Record<string, string> = {}\n const dropBoxPaths = await dropBox.listFolders({\n path: `${jobPath + startPath}`,\n recursive: true\n });\n dropBoxPaths.forEach(dropBoxPath => {\n if (dropBoxPath[\".tag\"] === \"folder\") return;\n paths[removeExtension ? pathInfo.changeFilename(dropBoxPath.path_display, {ext:''}): dropBoxPath.path_display] = dropBoxPath.name;\n });\n\n return paths;\n}\n\nconst onCompleted = async (\n response: AsyncJobResponse,\n path: string\n): Promise<any[] | undefined> => {\n if (!response.async_job_id) {\n return Promise.reject(response);\n }\n\n let check: CheckResponse | undefined = undefined;\n let inProgress = true;\n while (inProgress) {\n await sleep(100);\n check = await fetchDropbox(`https://api.dropboxapi.com/2/${path}/check`, {\n async_job_id: response.async_job_id\n });\n\n console.log(\"DropBox: Check folders response: \", check);\n\n if (check?.[\".tag\"] !== \"in_progress\") {\n inProgress = false;\n }\n }\n\n return (check?.[\".tag\"] === \"complete\"\n ? Promise.resolve(check.entries)\n : Promise.reject(check)\n );\n};\n\n\nconst createFolders = async (paths: string[], basePath = \"\"): Promise<any> => {\n const apiPath = \"files/create_folder_batch\";\n const response = await fetchDropbox(`https://api.dropboxapi.com/2/${apiPath}`, {\n \"autorename\": false,\n \"force_async\": true,\n \"paths\": paths.map(path => resolvePath(basePath + path)),\n });\n\n return response ? onCompleted(response, apiPath) : undefined;\n}\n\nconst deleteBulk = async (paths: string[], basePath = \"\"): Promise<any> => {\n const apiPath = \"files/create_folder_batch\";\n const response = fetchDropbox(`https://api.dropboxapi.com/2/${apiPath}`, {\n entries: paths.map(path => ({ path: resolvePath(basePath + path) })),\n });\n\n return response ? onCompleted(response, apiPath) : undefined;\n}\n\nconst addTag = async (path: string, tag: string): Promise<any> => {\n return fetchDropbox(\"https://api.dropboxapi.com/2/files/tags/add\", {\n \"path\": path,\n \"tag_text\": tag.toLowerCase().replaceAll(/[^a-z0-9]/g, \"\"),\n });\n}\n\nconst addTags = async (paths: Record<string, string[]>, basePath = \"\"): Promise<void> => {\n for (const path in paths) {\n for (const tag of paths[path]) {\n await addTag(resolvePath(basePath + path), tag);\n }\n }\n}\n\nexport const listFolders = async ({ path = \"\", recursive = false }: ListFoldersParams = {}): Promise<any[]> => {\n const entries = [];\n const fetchFolders = async ({\n path,\n cursor,\n recursive\n }: {\n path?: string;\n cursor?: string;\n recursive: boolean;\n }): Promise<DropboxListFolderResponse | undefined> => {\n return (\n path\n ? await fetchDropbox(\"https://api.dropboxapi.com/2/files/list_folder\", {\n \"include_deleted\": false,\n \"include_has_explicit_shared_members\": false,\n \"include_media_info\": false,\n \"include_mounted_folders\": true,\n \"include_non_downloadable_files\": true,\n \"path\": resolvePath(path),\n \"recursive\": recursive\n })\n : await fetchDropbox(\"https://api.dropboxapi.com/2/files/list_folder/continue\", {\n \"cursor\": cursor\n })\n );\n }\n\n let folders: DropboxListFolderResponse | undefined = { has_more: true, cursor: \"\", entries: [] };\n while (folders?.has_more) {\n folders = await fetchFolders(folders.cursor\n ? {cursor: folders.cursor, recursive}\n : {path: path, recursive}\n );\n folders && entries.push(...folders.entries);\n }\n\n return entries;\n}\n\nconst copy_ = async (paths: PathEntry[]): Promise<void> => {\n const startCopy = async (entry: { from_path: string; to_path: string }) => {\n return await fetchDropbox(\"https://api.dropboxapi.com/2/files/copy_v2\", {\n ...entry,\n autorename: false\n });\n };\n\n for (const path of paths) {\n await startCopy({\n from_path: resolvePath(path.from),\n to_path: resolvePath(path.to),\n });\n }\n\n};\n\nconst copy = async (paths: PathEntry[]): Promise<any[]> => {\n const STEP = 900;\n\n const startCopy = async (entries: { from_path: string; to_path: string }[]) => {\n return await fetchDropbox(\"https://api.dropboxapi.com/2/files/copy_batch_v2\", {\n entries: entries,\n autorename: false\n });\n };\n const checkJobStatus = async (asyncJobId: string): Promise<CopyJobStatus | undefined> => {\n return await fetchDropbox(\"https://api.dropboxapi.com/2/files/copy_batch/check_v2\", {\n async_job_id: asyncJobId\n });\n };\n\n const results = [];\n let entries = [];\n for (let i = 0; i < paths.length; i += STEP) {\n entries = paths.slice(i, i + STEP).map(path => ({\n from_path: resolvePath(path.from),\n to_path: resolvePath(path.to),\n }));\n\n const copyResponse = await startCopy(entries);\n if (copyResponse.error) {\n throw new Error(`Error starting copy: ${copyResponse.error}`);\n }\n\n let jobStatus = copyResponse;\n while (jobStatus?.['.tag'] === 'async_job_id' || jobStatus?.['.tag'] === 'in_progress') {\n await sleep(DROPBOX_CHECK_DELAY);\n\n jobStatus = await checkJobStatus(copyResponse.async_job_id);\n }\n\n if (jobStatus?.['.tag'] === 'failed') {\n throw new Error(`Copy operation failed: ${jobStatus['.tag']}`);\n }\n\n if (jobStatus?.['.tag'] === 'complete') {\n results.push(...jobStatus.entries);\n }\n }\n\n return results\n .filter(entry => entry[\".tag\"] === \"failure\")\n .map(entry => entry.failure);\n};\n\nconst move = async (paths: PathEntry[]): Promise<void> => {\n const startMove = async (entry: { from_path: string; to_path: string }) => {\n return await fetchDropbox(\"https://api.dropboxapi.com/2/files/move_v2\", {\n ...entry,\n autorename: true\n });\n };\n\n for (const path of paths) {\n await startMove({\n from_path: resolvePath(path.from),\n to_path: resolvePath(path.to),\n });\n }\n};\n\n\nconst getThumbnails = async (\n {\n thumbnailsRequest = [],\n size = \"w64h64\",\n format = \"jpeg\",\n mode = \"strict\",\n }: ThumbnailRequestOptions,\n setThumbnails?: (thumbs: ThumbnailResult) => void\n): Promise<ThumbnailResult> => {\n const STEP = 25;\n const PLACEHOLDER_THUMBNAIL= \"data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAgAAAAwAAAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==\";\n\n let results = {};\n const fetchPromise = [];\n for (let i = 0; i < thumbnailsRequest.length; i += STEP) {\n const batch = thumbnailsRequest.slice(i, i + STEP);\n const entries = batch.map(req => ({\n path: resolvePath(req.path),\n format,\n size,\n mode,\n }));\n\n await sleep(100);\n\n fetchPromise.push(fetchDropbox(\"https://content.dropboxapi.com/2/files/get_thumbnail_batch\", { entries })\n .then((thumbnails) => {\n if(!thumbnails) return;\n\n const entries = thumbnails.entries.reduce((acc: ThumbnailResult, entry: any, index: number) => {\n const path = batch[index].path;\n const [w, h] = size.replace(\"w\", \"\").split(\"h\").map(Number);\n\n acc[path] = {\n ...batch[index],\n thumbnail: entry?.[\".tag\"] === \"success\" ? entry.thumbnail : PLACEHOLDER_THUMBNAIL,\n mimetype: \"data:image/jpeg;base64,\",\n width: w,\n height: h,\n };\n return acc;\n }, {});\n console.log(\"DropBox: setThumbnails\", entries);\n setThumbnails?.(entries);\n results = {...results, ...entries};\n }));\n }\n return Promise.all(fetchPromise).then(() => {\n return results;\n });\n}\n\nconst b64toBlob = (b64Data: string, contentType = 'application/octet-stream', sliceSize = 512): Blob => {\n const byteCharacters = atob(b64Data);\n const byteArrays = [];\n\n for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {\n const slice = byteCharacters.slice(offset, offset + sliceSize);\n const byteNumbers = new Array(slice.length);\n\n for (let i = 0; i < slice.length; i++) {\n byteNumbers[i] = slice.charCodeAt(i);\n }\n\n const byteArray = new Uint8Array(byteNumbers);\n byteArrays.push(byteArray);\n }\n\n return new Blob(byteArrays, { type: contentType });\n};\n\nconst upload = async (path: string, fileBase64: string): Promise<void> => {\n try {\n const base64Data = fileBase64.split(',')[1];\n const blob = b64toBlob(base64Data, 'application/octet-stream');\n\n fetchDropboxBlob(\"https://content.dropboxapi.com/2/files/upload\", blob, {\n 'Dropbox-API-Arg': JSON.stringify({\n path: resolvePath(path),\n mode: 'overwrite',\n autorename: true,\n mute: false\n })\n }).then((response) => {\n console.log(\"DropBox: Upload response\", response);\n });\n } catch (error) {\n console.error('Errore durante il caricamento su Dropbox:', error);\n }\n}\n\nexport const useDropBoxConnect = (renew = false): boolean => {\n if(!config) return false;\n return useAccessToken(config.clientId, renew);\n}\n\nexport const DropBoxConnectButton = (options: IButton = {}): React.ReactElement => {\n if (!config) {\n return (\n <div\n title={`DropBox: configurazione mancante. Recupera il \"Client ID\" accedendo a https://www.dropbox.com/developers, vai su \"App Console\", seleziona un'app esistente o chiedi il Client ID a chi ha configurato il sistema.`}\n className=\"text-danger flex items-center gap-2\"\n >\n <Icon name=\"warning\" />\n <span>Dropbox non configurato</span>\n </div>\n );\n }\n const isAuth = useDropBoxConnect(true);\n\n return(<AuthButton\n provider=\"dropboxAuth\"\n intent=\"connect\"\n aspect=\"button\"\n options={{\n ...options,\n className: options?.className + (isAuth ? \" text-success\": \" text-danger\"),\n icon : isAuth ? \"link\" : \"link-break\",\n title : isAuth ? \"DropBox Connected\" : \"DropBox Disconnected\",\n }}\n />\n );\n}\n\nexport const dropBox = {\n setRootPath: (path: string) => {\n if (config) config.rootPath = path;\n },\n resolvePath: resolvePath,\n createFolders: createFolders,\n deleteBulk: deleteBulk,\n addTags: addTags,\n listFolders: listFolders,\n getThumbnails: getThumbnails,\n search: search,\n upload: upload,\n copy: copy,\n move: move,\n}\n","import db from \"./database\";\r\nimport { normalizeKey } from \"./utils\";\r\n\r\nexport interface CacheOptions {\r\n callLabel: string;\r\n callKey: string;\r\n callBasePath: string;\r\n callService: string;\r\n callFunc: Function;\r\n callOptions: Object;\r\n}\r\n\r\nexport const cache = async (\r\n search: any, \r\n strategy: any,\r\n {\r\n callLabel,\r\n callKey,\r\n callBasePath,\r\n callService,\r\n callFunc,\r\n callOptions\r\n }: CacheOptions,\r\n caller: any = null, \r\n storePaths: string[] = []\r\n) => {\r\n const callPath = `${callBasePath}/${normalizeKey(strategy)}/${callKey}`;\r\n const callServicePath = `${callService}/${callKey}`;\r\n\r\n return await db.read(callPath) || await callFunc(search, strategy, callOptions).then((response: any) => {\r\n if (response) {\r\n db.set(callPath, response).then(() => {\r\n // Success case - could add error management here if needed\r\n });\r\n } else {\r\n console.warn(`${callLabel} ${strategy}: No Result`);\r\n response = {};\r\n }\r\n\r\n return response;\r\n });\r\n};\r\n","import {FIREBASE_BUCKET_SCRAPE} from \"../../constant\";\nimport {currentCountry, currentLang} from \"../../libs/locale\";\nimport {fetchJson} from \"../../libs/fetch\";\nimport {cache} from \"../../libs/cache\";\nimport { Config, onConfigChange, ScrapeConfig } from \"../../Config\";\nimport { normalizeKey, proxy } from \"../../libs/utils\";\n\nconst SERPAPI_ENDPOINT = \"https://api.serpapi.com/search\";\n\nconst ENGINE_GOOGLE = \"google\";\nconst ENGINE_GOOGLE_IMAGES = \"google_images\";\nconst ENGINE_GOOGLE_AUTOCOMPLETE = \"google_autocomplete\";\nconst ENGINE_GOOGLE_TRENDS = \"google_trends\";\nconst ENGINE_GOOGLE_MAPS = \"google_maps\";\nconst ENGINE_GOOGLE_MAPS_PHOTOS = \"google_maps_photos\";\nconst ENGINE_GOOGLE_MAPS_REVIEWS = \"google_maps_reviews\";\n\nconst SEARCH_QUERY = {\n q: null,\n}\n\nconst nameCountry = currentCountry();\nconst codeCountry = currentCountry(true);\nconst codeLang = currentLang(true);\n\nconst SERPAPI_PARAMS = {\n engine: null,\n device: null,\n no_cache: false,\n async: false,\n output: \"json\",\n};\nconst GEOGRAPHIC_LOCATION = {\n location: nameCountry,\n uule: null,\n}\nconst GEOGRAPHIC_LOCATION2 = {\n geo: nameCountry,\n region: null,\n}\nconst LOCALIZATION = {\n google_domain: \"google.com\",\n gl: codeCountry.toLowerCase(),\n hl: codeLang,\n cr: \"country\" + codeCountry,\n lr: \"lang_\" + codeLang,\n}\n\nconst ADVANCED = {\n tbs: null,\n safe: \"active\",\n nfpr: 0,\n filter: 1,\n}\n\nconst MAPS_DETAILS = {\n data_id: null,\n hl: codeLang,\n}\n\nconst SEARCH_BY_ENGINE = {\n [ENGINE_GOOGLE]: {\n ...SERPAPI_PARAMS,\n ...GEOGRAPHIC_LOCATION,\n ...LOCALIZATION,\n ...ADVANCED,\n ...SEARCH_QUERY,\n engine: ENGINE_GOOGLE,\n ludocid: null,\n lsig: null,\n kgmid: null,\n si: null,\n tbm: null,\n start: null,\n num: null,\n },\n [ENGINE_GOOGLE_IMAGES]: {\n ...SERPAPI_PARAMS,\n ...GEOGRAPHIC_LOCATION,\n ...LOCALIZATION,\n ...ADVANCED,\n ...SEARCH_QUERY,\n engine: ENGINE_GOOGLE_IMAGES,\n chips: null,\n ijn: null,\n },\n [ENGINE_GOOGLE_AUTOCOMPLETE]: {\n ...SERPAPI_PARAMS,\n ...LOCALIZATION,\n ...SEARCH_QUERY,\n engine: ENGINE_GOOGLE_AUTOCOMPLETE,\n cp: null,\n client: null,\n },\n [ENGINE_GOOGLE_TRENDS]: {\n ...SERPAPI_PARAMS,\n ...GEOGRAPHIC_LOCATION2,\n ...SEARCH_QUERY,\n engine: ENGINE_GOOGLE_TRENDS,\n data_type: null,\n tz: null,\n cat: null,\n gprop: null,\n date: null,\n csv: null,\n },\n [ENGINE_GOOGLE_MAPS]: {\n ...SERPAPI_PARAMS,\n ...GEOGRAPHIC_LOCATION,\n ...LOCALIZATION,\n ...ADVANCED,\n ...SEARCH_QUERY,\n engine: ENGINE_GOOGLE_MAPS,\n },\n [ENGINE_GOOGLE_MAPS_PHOTOS]: {\n ...SERPAPI_PARAMS,\n ...MAPS_DETAILS,\n engine: ENGINE_GOOGLE_MAPS_PHOTOS,\n },\n [ENGINE_GOOGLE_MAPS_REVIEWS]: {\n ...SERPAPI_PARAMS,\n ...MAPS_DETAILS,\n engine: ENGINE_GOOGLE_MAPS_REVIEWS,\n },\n};\n\n\nlet config: ScrapeConfig | undefined = undefined;\nif (typeof onConfigChange === 'function') {\n onConfigChange((newConfig: Config) => {\n config = newConfig.scrape;\n });\n}\n\nfunction removeNullProperties(obj: Record<string, any>): Record<string, any> {\n const newObj: Record<string, any> = {};\n for (const key in obj) {\n if (obj[key] !== null) {\n newObj[key] = obj[key];\n }\n }\n return newObj;\n}\n\nlet API_KEY_INDEX = 0;\nfunction getSerpApikey(next = false) {\n const apis = config?.serpApiKey?.split(\",\").map(k => k.trim()).filter(Boolean) || [];\n if (apis.length === 0) return null;\n\n if (next) {\n API_KEY_INDEX++;\n }\n\n return (API_KEY_INDEX < apis.length\n ? apis[API_KEY_INDEX]\n : null\n );\n}\n\nconst fetchSerpApi = async (search: string, engine: string) => {\n const getRequest = (apiKey: string) => {\n const query = removeNullProperties({\n ...(SEARCH_BY_ENGINE as any)[engine],\n api_key: apiKey,\n q: search,\n });\n console.log(SERPAPI_ENDPOINT, query);\n const params = new URLSearchParams(query);\n const url = `${SERPAPI_ENDPOINT}?${params}`;\n\n return proxy(url);\n }\n\n let apiKey = getSerpApikey();\n while (apiKey) {\n try {\n return await fetchJson(getRequest(apiKey));\n } catch (response: any) {\n if (response.error === \"quota_exceeded\") {\n console.warn(`SerpApi: invalid api key: ${apiKey}`, response);\n apiKey = getSerpApikey(true);\n continue;\n }\n\n console.error(`SerpApi: ${apiKey}`, response);\n throw response;\n }\n }\n\n return null;\n};\n\n\n\nconst callSerpApi = async (search: string, strategy: string, {caller = null, storePaths = []}: {caller?: any, storePaths?: string[]} = {}) => {\n return await cache(\n search, strategy,\n {\n callLabel: \"Serp Api\",\n callKey: normalizeKey(search),\n callBasePath: FIREBASE_BUCKET_SCRAPE,\n callService: \"serpApi\",\n callFunc: fetchSerpApi,\n callOptions: {}\n },\n caller, storePaths\n );\n}\n\nconst fetchScrape = (caller: any = null, storePaths: string[] = []) => {\n return {\n googleSearch: async (search: string) => {\n return await callSerpApi(search, ENGINE_GOOGLE, {caller, storePaths});\n },\n googleImages: async (search: string) => {\n return await callSerpApi(search, ENGINE_GOOGLE_IMAGES, {caller, storePaths});\n },\n googleAutocomplete: async (search: string) => {\n return await callSerpApi(search, ENGINE_GOOGLE_AUTOCOMPLETE, {caller, storePaths});\n },\n googleTrends: async (search: string) => {\n return await callSerpApi(search, ENGINE_GOOGLE_TRENDS, {caller, storePaths});\n },\n googleMaps: async (search: string) => {\n return await callSerpApi(search, ENGINE_GOOGLE_MAPS, {caller, storePaths});\n },\n googleMapsPhotos: async (search: string) => {\n return await callSerpApi(search, ENGINE_GOOGLE_MAPS_PHOTOS, {caller, storePaths});\n },\n googleMapsReviews: async (search: string) => {\n return await callSerpApi(search, ENGINE_GOOGLE_MAPS_REVIEWS, {caller, storePaths});\n },\n }\n}\n\nexport default fetchScrape;\n","import {getKeywordIdeas} from \"../providers/seo/google/keyword\";\r\nimport {getGoogleTrendsData} from \"../providers/seo/google/trend\";\r\n\r\nconst seo = {\r\n keyword: getKeywordIdeas,\r\n trend: getGoogleTrendsData,\r\n serp: null\r\n}\r\n\r\nexport default seo;","import { converter } from \"./converter\";\r\nimport { smartTypeCast } from \"./utils\";\r\n\r\n/* ----------------------------------------------\r\n * 🔹 Types\r\n * ---------------------------------------------- */\r\ninterface ExclusionItem {\r\n phrase: string;\r\n}\r\ninterface Transformation {\r\n pattern: string;\r\n replace: string;\r\n}\r\n\r\ntype ConverterMask =\r\n | keyof typeof converter\r\n | { func: keyof typeof converter; arg?: string };\r\n\r\nexport interface SanitizerRule {\r\n description?: string;\r\n exclusions?: ExclusionItem[];\r\n transformations?: Transformation[];\r\n mask?: ConverterMask[];\r\n}\r\n\r\nexport type SanitizerConfig = Record<string, SanitizerRule>;\r\n\r\n/** Map of field patterns → rule names */\r\nexport interface SanitizerMatch {\r\n pattern: string; // supports wildcard like \"email*\", \"*_price\"\r\n use: keyof SanitizerConfig; // name of rule to apply\r\n}\r\n\r\nexport const NORMALIZE_MAP: Record<string, string> = {\r\n // Plus/minus\r\n \"+\": \"+\",\r\n \"﹢\": \"+\",\r\n \"-\": \"-\",\r\n \"﹣\": \"-\",\r\n \"–\": \"-\",\r\n \"—\": \"-\",\r\n\r\n // Symbols\r\n \"@\": \"@\",\r\n \"#\": \"#\",\r\n \"$\": \"$\",\r\n \"%\": \"%\",\r\n \"&\": \"&\",\r\n \"*\": \"*\",\r\n\r\n // Digits (fullwidth → ASCII)\r\n \"0\": \"0\", \"1\": \"1\", \"2\": \"2\", \"3\": \"3\", \"4\": \"4\",\r\n \"5\": \"5\", \"6\": \"6\", \"7\": \"7\", \"8\": \"8\", \"9\": \"9\",\r\n\r\n // Letters (fullwidth → ASCII)\r\n \"A\": \"A\", \"B\": \"B\", \"C\": \"C\", \"D\": \"D\", \"E\": \"E\",\r\n \"F\": \"F\", \"G\": \"G\", \"H\": \"H\", \"I\": \"I\", \"J\": \"J\",\r\n \"K\": \"K\", \"L\": \"L\", \"M\": \"M\", \"N\": \"N\", \"O\": \"O\",\r\n \"P\": \"P\", \"Q\": \"Q\", \"R\": \"R\", \"S\": \"S\", \"T\": \"T\",\r\n \"U\": \"U\", \"V\": \"V\", \"W\": \"W\", \"X\": \"X\", \"Y\": \"Y\", \"Z\": \"Z\",\r\n \"a\": \"a\", \"b\": \"b\", \"c\": \"c\", \"d\": \"d\", \"e\": \"e\",\r\n \"f\": \"f\", \"g\": \"g\", \"h\": \"h\", \"i\": \"i\", \"j\": \"j\",\r\n \"k\": \"k\", \"l\": \"l\", \"m\": \"m\", \"n\": \"n\", \"o\": \"o\",\r\n \"p\": \"p\", \"q\": \"q\", \"r\": \"r\", \"s\": \"s\", \"t\": \"t\",\r\n \"u\": \"u\", \"v\": \"v\", \"w\": \"w\", \"x\": \"x\", \"y\": \"y\", \"z\": \"z\"\r\n};\r\n\r\n\r\nconst defaultRules: SanitizerConfig = {\r\n email: {\r\n description: \"Email: no spaces -> Lower/Trim\",\r\n transformations: [{ pattern: \"\\\\s+\", replace: \"\" }],\r\n mask: [\"toLower\", \"trim\"]\r\n },\r\n phone: {\r\n description: \"Phone: Digits only\",\r\n transformations: [{ pattern: \"\\\\D\", replace: \"\" }],\r\n mask: []\r\n },\r\n price: {\r\n description: \"Price: Digits/Dot/Comma/Minus -> toCurrency\",\r\n transformations: [\r\n { pattern: \"[^0-9.-]\", replace: \"\" },\r\n { pattern: \",\", replace: \".\" }\r\n ],\r\n mask: [\"toCurrency\"]\r\n },\r\n name: {\r\n description: \"Name: All chars -> UcWords/Trim\",\r\n transformations: [],\r\n mask: [\"ucwords\", \"trim\"]\r\n },\r\n date: {\r\n description: \"Date: All chars -> toDate (YYYY-MM-DD)\",\r\n transformations: [],\r\n mask: [{ func: \"toDate\", arg: \"YYYY-MM-DD\" }]\r\n },\r\n slug: {\r\n description: \"Slug: All chars -> toSlug\",\r\n transformations: [],\r\n mask: [\"toSlug\"]\r\n }\r\n}\r\n\r\nconst defaultMatches: SanitizerMatch[] = [\r\n { pattern: \"email*\", use: \"email\" },\r\n { pattern: \"*_price\", use: \"price\" },\r\n { pattern: \"name*\", use: \"name\" },\r\n { pattern: \"date*\", use: \"date\" }\r\n]\r\n\r\nconst NORMALIZE_REGEX = new RegExp(Object.keys(NORMALIZE_MAP).join(\"|\"), \"g\");\r\n\r\nexport function normalizeVisualChars(input: string): string {\r\n if (!input) return \"\";\r\n return input\r\n .normalize(\"NFKC\") // Unicode normalization first\r\n .replace(NORMALIZE_REGEX, match => NORMALIZE_MAP[match] ?? match);\r\n}\r\n\r\n/* ----------------------------------------------\r\n * ⚙️ Sanitizer class\r\n * ---------------------------------------------- */\r\n\r\nexport class Sanitizer {\r\n private config: SanitizerConfig;\r\n private matches: SanitizerMatch[];\r\n\r\n constructor(config: SanitizerConfig = {}, matches: SanitizerMatch[] = []) {\r\n this.config = { ...defaultRules, ...config };\r\n this.matches = [...defaultMatches, ...matches];\r\n }\r\n\r\n /* ----------------------------------------------\r\n * 🧮 Apply a specific rule directly\r\n * ---------------------------------------------- */\r\n apply(ruleName: keyof SanitizerConfig, value: any, autoCast: boolean = false): any {\r\n const rule = this.config[ruleName];\r\n if (!rule) {\r\n //console.warn(`Rule \"${String(ruleName)}\" not found`);\r\n return autoCast ? smartTypeCast(value) : value;\r\n }\r\n\r\n let result = value;\r\n\r\n // 🔹 1. visual normalization always first\r\n result = normalizeVisualChars(result);\r\n\r\n // 🔹 2. exclusions check\r\n const exclusions = rule.exclusions;\r\n\r\n if (Array.isArray(exclusions) && exclusions.length) {\r\n const lowerResult = String(result).toLowerCase();\r\n\r\n for (const item of exclusions) {\r\n const term = (item?.phrase ?? \"\").trim().toLowerCase();\r\n if (!term) continue;\r\n\r\n if (lowerResult.includes(term)) {\r\n result = \"\";\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // 🔹 3. Apply RegExp transformations\r\n for (const { pattern, replace = \"\" } of rule.transformations || []) {\r\n try {\r\n result = String(result).replace(new RegExp(pattern, \"g\"), String(replace));\r\n } catch (e) {\r\n console.warn(`Invalid regex in rule ${String(ruleName)}: ${pattern}`);\r\n }\r\n }\r\n\r\n\r\n\r\n // 🔹 4. Apply converter masks\r\n for (const mask of rule.mask || []) {\r\n let func: keyof typeof converter;\r\n let arg: string | undefined;\r\n\r\n if (typeof mask === \"object\" && mask !== null && \"func\" in mask) {\r\n func = mask.func;\r\n arg = mask.arg;\r\n } else {\r\n func = mask as keyof typeof converter;\r\n }\r\n\r\n const fn = converter[func];\r\n if (typeof fn === \"function\") {\r\n try {\r\n result = fn(result, arg);\r\n } catch (e) {\r\n console.warn(`Error applying mask ${func} for rule ${ruleName}:`, e);\r\n }\r\n }\r\n }\r\n\r\n // 🔹 5. smart type cast opzionale\r\n return autoCast ? smartTypeCast(result) : result;\r\n }\r\n\r\n /* ----------------------------------------------\r\n * 🌐 Apply matches to an entire object\r\n * ---------------------------------------------- */\r\n applyMatches<T extends Record<string, any>>(obj: T, autoCast: boolean = false): T {\r\n const output: Record<string, any> = { ...obj };\r\n\r\n for (const [field, value] of Object.entries(obj)) {\r\n for (const match of this.matches) {\r\n const regex = this.wildcardToRegExp(match.pattern);\r\n if (regex.test(field)) {\r\n output[field] = this.apply(match.use, value, autoCast);\r\n break; // stop after first match\r\n }\r\n }\r\n }\r\n\r\n return output as T;\r\n }\r\n\r\n getOptions(): Record<string, string>[] {\r\n return Object.keys(this.config).sort().map((key) => ({ label: this.config[key].description ?? converter.toCamel(key), value: key }));\r\n }\r\n\r\n\r\n /* ----------------------------------------------\r\n * 🧰 Helpers\r\n * ---------------------------------------------- */\r\n\r\n addRule(name: keyof SanitizerConfig, rule: SanitizerRule): void {\r\n this.config[name] = rule;\r\n }\r\n\r\n addMatch(pattern: string, use: keyof SanitizerConfig): void {\r\n this.matches.push({ pattern, use });\r\n }\r\n\r\n private wildcardToRegExp(pattern: string): RegExp {\r\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n return new RegExp(`^${escaped.replace(/\\*/g, \".*\")}$`, \"i\");\r\n }\r\n}\r\n","/**\n * imageBuilder — pure utility for generating SEO/performance-optimised <img> tags\n * with srcset support. Does NOT resize images; assumes variant files already exist.\n *\n * Two srcset modes:\n * density — fixed-size images (logos, avatars): 1x / 2x / 3x descriptors\n * naming: image.jpg → image@2x.jpg, image@3x.jpg\n * width — responsive/fluid images (hero, content): width descriptors + sizes\n * naming: image.jpg → image-400w.jpg, image-800w.jpg …\n */\n\nexport type ImgFit = 'cover' | 'contain' | 'fill' | 'scale-down' | 'none';\n\nexport interface ImageBuilderConfig {\n /** URL, relative path, or data URI of the source image (used as src and as the 1x/base variant in srcset). */\n src: string;\n /** Alt text — required for SEO and accessibility. */\n alt: string;\n title?: string;\n /** Intrinsic display width in px. Prevents CLS (Core Web Vitals). */\n width?: number;\n /** Intrinsic display height in px. Prevents CLS (Core Web Vitals). */\n height?: number;\n fit?: ImgFit;\n position?: string;\n /**\n * loading=\"lazy\" for below-the-fold images.\n * Do NOT use on LCP images — use priority=true instead.\n * Default: 'lazy'.\n */\n loading?: 'lazy' | 'eager';\n /**\n * Marks this as the LCP (Largest Contentful Paint) image.\n * Sets fetchpriority=\"high\" and loading=\"eager\". Overrides `loading`.\n */\n priority?: boolean;\n /** Default: 'async' — frees the main thread from image decoding. */\n decoding?: 'async' | 'sync' | 'auto';\n className?: string;\n crossorigin?: 'anonymous' | 'use-credentials';\n referrerpolicy?: string;\n}\n\n/** Density-based srcset: best for fixed-size images (logos, avatars, icons). */\nexport interface SrcsetDensityConfig {\n mode: 'density';\n /** Pixel-density multipliers. Include 1 to make the 1x variant explicit. Default: [1, 2]. */\n densities?: number[];\n /**\n * Override the suffix inserted before the extension for each density.\n * Default: density === 1 → no suffix (uses src as-is), density > 1 → '@{d}x'\n * Example: (2) => '-2x' to get image-2x.jpg instead of image@2x.jpg\n */\n suffix?: (density: number) => string;\n}\n\n/** Width-based srcset: best for responsive/fluid images (hero, content, cards). */\nexport interface SrcsetWidthConfig {\n mode: 'width';\n /** Image widths in pixels, ascending order. Example: [400, 800, 1200]. */\n widths: number[];\n /**\n * Override the suffix inserted before the extension for each width.\n * Default: (w) => `-${w}w` → image-400w.jpg\n */\n suffix?: (width: number) => string;\n /**\n * CSS sizes attribute — tells the browser how wide the image renders at each breakpoint.\n * Required for width-mode srcset to work correctly.\n * Example: '(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw'\n */\n sizes?: string;\n}\n\nexport type SrcsetConfig = SrcsetDensityConfig | SrcsetWidthConfig;\n\n/** JSON-serialisable representation of all <img> attributes. */\nexport interface ImageParams {\n src: string;\n alt: string;\n title?: string;\n width?: number;\n height?: number;\n srcset?: string;\n sizes?: string;\n style?: string;\n loading?: 'lazy' | 'eager';\n decoding?: 'async' | 'sync' | 'auto';\n fetchpriority?: 'high' | 'low' | 'auto';\n class?: string;\n crossorigin?: string;\n referrerpolicy?: string;\n}\n\n// ── Internal helpers ──────────────────────────────────────────────────────────\n\nfunction insertSuffix(src: string, suffix: string): string {\n if (!suffix) return src;\n const qIdx = src.indexOf('?');\n const base = qIdx !== -1 ? src.slice(0, qIdx) : src;\n const query = qIdx !== -1 ? src.slice(qIdx) : '';\n const dot = base.lastIndexOf('.');\n return dot === -1\n ? `${base}${suffix}${query}`\n : `${base.slice(0, dot)}${suffix}${base.slice(dot)}${query}`;\n}\n\nfunction buildSrcsetString(src: string, cfg: SrcsetConfig): string {\n if (cfg.mode === 'density') {\n const densities = cfg.densities ?? [1, 2];\n return densities\n .map(d => {\n const suffix = cfg.suffix\n ? cfg.suffix(d)\n : d === 1 ? '' : `@${d}x`;\n return `${insertSuffix(src, suffix)} ${d}x`;\n })\n .join(', ');\n }\n\n return cfg.widths\n .map(w => {\n const suffix = cfg.suffix ? cfg.suffix(w) : `-${w}w`;\n return `${insertSuffix(src, suffix)} ${w}w`;\n })\n .join(', ');\n}\n\n// ── Internal builders (not exported) ─────────────────────────────────────────\n\nfunction buildImageParams(\n config: ImageBuilderConfig,\n srcset?: SrcsetConfig,\n): ImageParams {\n const loading = config.priority ? 'eager' : (config.loading ?? 'lazy');\n\n const params: ImageParams = {\n src: config.src,\n alt: config.alt,\n width: config.width,\n height: config.height,\n loading,\n decoding: config.decoding ?? 'async',\n ...(config.priority && { fetchpriority: 'high' }),\n ...(config.title && { title: config.title }),\n ...(config.className && { class: config.className }),\n ...(config.crossorigin && { crossorigin: config.crossorigin }),\n ...(config.referrerpolicy && { referrerpolicy: config.referrerpolicy }),\n };\n\n const styleParts: string[] = [];\n if (config.fit) styleParts.push(`object-fit: ${config.fit}`);\n if (config.position) styleParts.push(`object-position: ${config.position}`);\n if (styleParts.length) params.style = styleParts.join('; ');\n\n if (srcset) {\n params.srcset = buildSrcsetString(config.src, srcset);\n if (srcset.mode === 'width' && srcset.sizes) {\n params.sizes = srcset.sizes;\n }\n }\n\n // Remove undefined keys for clean JSON serialisation\n return Object.fromEntries(\n Object.entries(params).filter(([, v]) => v !== undefined),\n ) as ImageParams;\n}\n\nfunction imageParamsToTag(params: ImageParams): string {\n const ORDER: (keyof ImageParams)[] = [\n 'src', 'srcset', 'sizes', 'alt', 'title',\n 'width', 'height', 'style', 'class',\n 'loading', 'decoding', 'fetchpriority',\n 'crossorigin', 'referrerpolicy',\n ];\n\n const attrs = ORDER\n .filter(k => params[k] !== undefined)\n .map(k => `${k}=\"${String(params[k])}\"`);\n\n if (attrs.length === 0) return '<img />';\n\n // First attr on same line as <img, rest indented\n const [first, ...rest] = attrs;\n return rest.length === 0\n ? `<img ${first} />`\n : `<img ${first}\\n ${rest.join('\\n ')} />`;\n}\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\nexport interface UseImageResult {\n /** Generates the <img> HTML string with all SEO/performance attributes. */\n toHtml: (srcset?: SrcsetConfig) => string;\n /** Generates a JSON string of all img attributes — for CMS, SSR or metadata. */\n toJson: (srcset?: SrcsetConfig) => string;\n /** Returns the raw ImageParams object for custom serialisation. */\n params: (srcset?: SrcsetConfig) => ImageParams;\n}\n\n/**\n * Returns toHtml / toJson / params helpers bound to the given image config.\n * Does NOT resize images — assumes variant files already exist on the server.\n *\n * @example\n * const img = useImage({ src: 'hero.jpg', alt: 'Hero', width: 800, height: 450, priority: true })\n *\n * // Responsive HTML with width-based srcset (files: hero-400w.jpg, hero-800w.jpg, hero-1200w.jpg)\n * img.toHtml({ mode: 'width', widths: [400, 800, 1200], sizes: '(max-width: 640px) 100vw, 800px' })\n *\n * // Fixed-size HTML with density srcset (files: hero.jpg, hero@2x.jpg, hero@3x.jpg)\n * img.toHtml({ mode: 'density', densities: [1, 2, 3] })\n *\n * // JSON params for CMS or SSR\n * img.toJson({ mode: 'width', widths: [400, 800, 1200], sizes: '100vw' })\n */\nexport function useImage(config: ImageBuilderConfig): UseImageResult {\n return {\n toHtml: (srcset?) => imageParamsToTag(buildImageParams(config, srcset)),\n toJson: (srcset?) => JSON.stringify(buildImageParams(config, srcset), null, 2),\n params: (srcset?) => buildImageParams(config, srcset),\n };\n}\n","import React, { useState, useRef, useEffect } from 'react'\r\nimport Grid from \"../components/widgets/Grid\";\r\nimport { Select } from \"../components/ui/fields/Select\";\r\nimport { Wrapper, Container, Row, Col } from \"../components/ui/GridSystem\";\r\nimport Card from \"../components/ui/Card\";\r\nimport { String, Number, Email, Password, Color, Date, Time, DateTime, Week, Month, TextArea, Checkbox, ListGroup, Switch, Label, Range } from \"../components/ui/fields/Input\";\r\nimport { Autocomplete, Checklist } from \"../components/ui/fields/Select\";\r\nimport { UploadDocument, UploadImage } from \"../components/ui/fields/Upload\";\r\nimport { ActionButton, LoadingButton, GoSite, ReferSite } from \"../components/ui/Buttons\";\r\nimport Alert from \"../components/ui/Alert\";\r\nimport Badge from \"../components/ui/Badge\";\r\nimport Notifications from \"../components/blocks/Notifications\";\r\nimport Search from \"../components/blocks/Search\";\r\nimport Form from \"../components/widgets/Form\";\r\nimport TabDynamic from \"../components/widgets/TabDynamic\";\r\nimport Tab, { TabItem } from \"../components/ui/Tab\";\r\nimport Table from \"../components/ui/Table\";\r\nimport Brand from \"../components/blocks/Brand\";\r\nimport { Breadcrumbs } from \"../components/blocks/Breadcrumbs\";\r\nimport Carousel from \"../components/blocks/Carousel\";\r\nimport { Dropdown, DropdownItem } from \"../components/blocks/Dropdown\";\r\nimport Image from \"../components/ui/Image\";\r\nimport Gallery from \"../components/ui/Gallery\";\r\nimport Loader from \"../components/ui/Loader\";\r\nimport Percentage from \"../components/ui/Percentage\";\r\nimport Repeat from \"../components/ui/Repeat\";\r\nimport Modal from \"../components/ui/Modal\";\r\nimport { PLACEHOLDER_BRAND, PLACEHOLDER_IMAGE } from '../Theme';\r\nimport Menu from '../components/blocks/Menu';\r\nimport Code from '../components/ui/Code';\r\nimport Pagination from '../components/ui/Pagination';\r\nimport { RecordArray } from '../providers/data/DataProvider';\r\n\r\n\r\ndeclare global {\r\n interface Window {\r\n bootstrap: any;\r\n }\r\n}\r\n\r\nfunction Helper() {\r\n\r\n const [showModal, setShowModal] = useState(false);\r\n const [showAlert, setShowAlert] = useState(false)\r\n\r\n const scrollRef = useRef(null);\r\n\r\n useEffect(() => {\r\n if (window.bootstrap && scrollRef.current) {\r\n window.bootstrap.ScrollSpy.getOrCreateInstance(scrollRef.current, {\r\n target: '#sidebar-bootstrap',\r\n smoothScroll: true\r\n });\r\n }\r\n }, []);\r\n\r\n useEffect(() => {\r\n document.body.style.overflow = 'hidden';\r\n return () => {\r\n document.body.style.overflow = 'auto';\r\n };\r\n }, []);\r\n\r\n const recordSet = [] as RecordArray;\r\n for (let i = 1; i <= 30; i++) {\r\n recordSet.push({\r\n id: i,\r\n name: 'Valore ' + i\r\n })\r\n }\r\n\r\n return (\r\n <Container className='mb-5'>\r\n <Row className='justify-content-center'>\r\n <Col xl={10}>\r\n <Row>\r\n <Col xl={9}>\r\n {/* ScrollSpy container: native div for correct Bootstrap behavior */}\r\n <div\r\n ref={scrollRef}\r\n data-bs-spy=\"scroll\"\r\n data-bs-target=\"#sidebar-bootstrap\"\r\n data-bs-smooth-scroll=\"true\"\r\n className=\"p-2\"\r\n tabIndex={0}\r\n style={{ height: \"80vh\", overflowY: \"auto\" }}\r\n >\r\n <h1>Helper</h1>\r\n <p>Helper is a component that helps you to create a form.</p>\r\n\r\n {/* Input */}\r\n <Row className='pb-3'>\r\n <Col lg={5}>\r\n <h2 id='input'>Input</h2>\r\n <Form dataStoragePath='' header=\"Input\">\r\n {/* String */}\r\n <String name='text' label='String' placeholder='Lorem ipsum.' />\r\n {/* Number */}\r\n <Number name='number' label='Number' value={10} />\r\n {/* Email */}\r\n <Email name='email' label='Email' placeholder='test@example.com' />\r\n {/* Password */}\r\n <Password name='password' label='Password' placeholder='my passowrd' />\r\n {/* Color */}\r\n <Color name='color' label='Color' placeholder='Pick a Color' />\r\n {/* TextArea */}\r\n <TextArea name='textarea' label='Text Area' placeholder='Lorem ipsum.' />\r\n </Form>\r\n </Col>\r\n <Col lg={7}>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {`<Form dataStoragePath='' header=\"Input\">\r\n\r\n {/* String */}\r\n <String name='text' label='String' placeholder='Lorem ipsum.' />\r\n\r\n {/* Number */}\r\n <Number name='number' label='Number' value={10} />\r\n\r\n {/* Email */}\r\n <Email name='email' label='Email' placeholder='test@example.com' />\r\n\r\n {/* Password */}\r\n <Password name='password' label='Password' placeholder='my passowrd' />\r\n\r\n {/* Color */}\r\n <Color name='color' label='Color' placeholder='Pick a Color' />\r\n\r\n {/* TextArea */}\r\n <TextArea name='textarea' label='Text Area' placeholder='Lorem ipsum.' />\r\n\r\n </Form>`}\r\n </Code>\r\n </Col>\r\n </Row>\r\n <Row className='pb-3'>\r\n <Col lg={5}>\r\n {/* Date */}\r\n <Form dataStoragePath='' header=\"Date Input\">\r\n {/* Date */}\r\n <Date name='date' label='Date' />\r\n {/* Time */}\r\n <Time name='time' label='Time' />\r\n {/* DateTime */}\r\n <DateTime name='datetime' label='DateTime' />\r\n {/* Week */}\r\n <Week name='week' label='Week' />\r\n {/* Month */}\r\n <Month name='month' label='Month' />\r\n {/* Range */}\r\n <Range name='range' label='Range' min={0} max={100} step={1} />\r\n </Form>\r\n </Col>\r\n <Col lg={7}>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {`<Form dataStoragePath='' header=\"Date Input\">\r\n\r\n {/* Date */}\r\n <Date name='date' label='Date'/>\r\n\r\n {/* Time */}\r\n <Time name='time' label='Time' />\r\n\r\n {/* DateTime */}\r\n <DateTime name='datetime' label='DateTime' />\r\n\r\n {/* Week */}\r\n <Week name='week' label='Week'/>\r\n \r\n {/* Month */}\r\n <Month name='month' label='Month' />\r\n\r\n {/* Range */}\r\n <Range name='range' label='Range' min={0} max={100} step={1} />\r\n\r\n </Form>`}\r\n </Code>\r\n </Col>\r\n </Row>\r\n\r\n <Row>\r\n <Col lg={5}>\r\n {/* Boolean */}\r\n <Form dataStoragePath='' header=\"Boolean Input\">\r\n {/* Checkbox */}\r\n <Label label='Checkboxes' />\r\n <Checkbox name='checkbox1' label='Checkbox1' />\r\n <Checkbox name='checkbox2' label='Checkbox2' value={true} />\r\n {/* Switch */}\r\n <Label label='Switches' />\r\n <Switch name='switch1' label='Switch input' onChange={() => { }} value={false} />\r\n <Switch name='switch2' onChange={() => { }} label='Switch input' value={true} />\r\n </Form>\r\n\r\n {/* List -> Select? */}\r\n <Form dataStoragePath='' header=\"List Group\">\r\n <ListGroup actives={[0]} disables={[1]} itemClass='p-1'>\r\n <span className='text-danger'>Element1</span>\r\n <span className='text-success'>Element2</span>\r\n <span className='text-warning'>Element3</span>\r\n </ListGroup>\r\n <ListGroup label='List Group with onClick' onClick={(e, index) => { console.log(\"List Group click\", index, e.currentTarget.innerHTML) }} actives={[0]} disables={[1]}>\r\n <span className='text-danger'>Element1</span>\r\n <span className='text-success'>Element2</span>\r\n <span className='text-warning'>Element3</span>\r\n </ListGroup>\r\n </Form>\r\n </Col>\r\n <Col lg={7} className='mb-5'>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {`{/* Boolean */}\r\n <Form dataStoragePath='' header=\"Boolean Input\">\r\n \r\n {/* Checkbox */}\r\n <Label label='Checkboxes' />\r\n <Checkbox name='checkbox1' label='Checkbox1' />\r\n <Checkbox name='checkbox2' label='Checkbox2' className='mb-3' value={true} />\r\n \r\n {/* Switch */}\r\n <Label label='Switches' />\r\n <Switch name='switch1' label='Switch input' onChange={() => { }} value={false} />\r\n <Switch name='switch2' onChange={() => { }} label='Switch input' className='mb-3' value={true} />\r\n </Form>\r\n\r\n\r\n {/* List */}\r\n <Form dataStoragePath='' header=\"List Group\">\r\n \r\n <ListGroup actives={[0]} disables={[1]} className='mb-3' itemClass='p-1'>\r\n <span className='text-danger'>Element1</span>\r\n <span className='text-success'>Element2</span>\r\n <span className='text-warning'>Element3</span>\r\n </ListGroup>\r\n \r\n <ListGroup label='List Group with onClick' onClick={(e, index) => { console.log(\"List Group click\", index, e.currentTarget.innerHTML) }} actives={[0]} disables={[1]}>\r\n <span className='text-danger'>Element1</span>\r\n <span className='text-success'>Element2</span>\r\n <span className='text-warning'>Element3</span>\r\n </ListGroup>\r\n </Form>\r\n `}\r\n </Code>\r\n </Col>\r\n\r\n {/* Selectors */}\r\n <Col lg={5} className='mb-5'>\r\n <h2 id='selectors'>Selectors</h2>\r\n <Card className='mb-3'>\r\n <Form dataStoragePath='' header='Selectors'>\r\n {/* Select */}\r\n <Select name='select' label='Select' value={'Option1'} options={['Option1', 'Option2', 'Option3']} />\r\n {/* Autocomplete */}\r\n <Autocomplete name='autocomplete' label='Autocomplete' options={['Option1', 'Option2', 'Option3']} />\r\n {/* Checklist */}\r\n <Checklist name='checklist' label='Checklist' options={['Option1', 'Option2', 'Option3']} />\r\n\r\n </Form>\r\n </Card>\r\n </Col>\r\n <Col lg={7} className='mb-5'>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {`<Form dataStoragePath='' className='Selectors'>\r\n\r\n {/* Select */}\r\n <Select name='select' label='Select' value={'Option1'} options={['Option1', 'Option2', 'Option3']} />\r\n\r\n {/* Autocomplete */}\r\n <Autocomplete name='autocomplete' label='Autocomplete' options={['Option1', 'Option2', 'Option3']} />\r\n \r\n {/* Checklist */}\r\n <Checklist name='checklist' label='Checklist' options={['Option1', 'Option2', 'Option3']} />\r\n\r\n </Form>\r\n `}\r\n </Code>\r\n </Col>\r\n\r\n {/* Upload */}\r\n <Col lg={5} className='mb-5'>\r\n <h2 id='upload'>Upload</h2>\r\n {/* Documenti */}\r\n <Form dataStoragePath='' header=\"Documents Upload\">\r\n <UploadDocument name='uploadDocument' label=\"Upload Multiple Documents\" editable multiple />\r\n\r\n <UploadDocument name='uploadDocument' label=\"Upload Document not Editable\" />\r\n </Form>\r\n\r\n {/* Images */}\r\n <Form dataStoragePath='' header=\"Images Upload\">\r\n <UploadImage name='uploadImage' label='Upload Multiple Images' previewWidth={150} previewHeight={150} multiple editable />\r\n\r\n <UploadImage name='uploadImage' label='Upload Single Image' editable />\r\n\r\n <UploadImage name='uploadImage' label='Upload Single Image not Editable Images' />\r\n </Form>\r\n </Col>\r\n <Col lg={7} className='mb-5'>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {`<Form dataStoragePath='' header=\"Documents Upload\">\r\n \r\n {/* Multiple Documents */}\r\n <UploadDocument name='uploadDocument' label=\"Upload Multiple Documents\" editable multiple />\r\n \r\n {/* Single Document */}\r\n <UploadDocument name='uploadDocument' label=\"Upload Document not Editable\" />\r\n\r\n </Form>\r\n\r\n <Form dataStoragePath='' header=\"Images Upload\">\r\n \r\n {/* Multiple Editable Images */}\r\n <UploadImage name='uploadImage' label='Upload Multiple Images' previewWidth={150} previewHeight={150} multiple editable />\r\n \r\n {/* Single Editable Image */}\r\n <UploadImage name='uploadImage' label='Upload Single Image' editable />\r\n \r\n {/* Single Not Editable Image */}\r\n <UploadImage name='uploadImage' label='Upload Single Image not Editable Images' />\r\n </Form>\r\n `}\r\n </Code>\r\n </Col>\r\n\r\n {/* Alert */}\r\n <Col lg={5} className='mb-5'>\r\n <h2 id='alert'>Alert</h2>\r\n <Card className='mb-3'>\r\n <Alert type=\"info\" children=\"Info\" />\r\n <Alert type=\"success\" children=\"Success\" />\r\n <Alert type=\"warning\" children=\"Warning\" />\r\n <Alert type=\"danger\" children=\"Danger\" />\r\n <Alert type=\"primary\" children=\"Primary\" />\r\n <Alert type=\"secondary\" children=\"Secondary\" />\r\n <Alert type=\"light\" children=\"Light\" />\r\n <Alert type=\"dark\" children=\"Dark\" />\r\n\r\n <ActionButton onClick={() => setShowAlert(true)} label='click alert fixed' />\r\n {showAlert && <Alert isFixed='top' onClose={() => setShowAlert(false)}>Prova Alert fixedTop con timeout 5s</Alert>}\r\n </Card>\r\n </Col>\r\n <Col lg={7} className='mb-5'>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {`<Card className='mb-3'>\r\n\r\n <Alert type=\"info\" children=\"Info\" />\r\n <Alert type=\"success\" children=\"Success\" />\r\n <Alert type=\"warning\" children=\"Warning\" />\r\n <Alert type=\"danger\" children=\"Danger\" />\r\n <Alert type=\"primary\" children=\"Primary\" />\r\n <Alert type=\"secondary\" children=\"Secondary\" />\r\n <Alert type=\"light\" children=\"Light\" />\r\n <Alert type=\"dark\" children=\"Dark\" />\r\n\r\n <ActionButton onClick={() => setShowAlert(true)} label='click alert fixed' />\r\n {showAlert && <Alert isFixed='top' onClose={() => setShowAlert(false)}>Prova Alert fixedTop con timeout 5s</Alert>}\r\n </Card>\r\n `}\r\n </Code>\r\n </Col>\r\n\r\n {/* Badge */}\r\n <Col lg={5} className='mb-5'>\r\n <h2 id='badge'>Badge</h2>\r\n <Card className='mb-3'>\r\n <Row className='gap-2 d-flex justify-content-center'>\r\n <Col sm={5}>\r\n <Badge type=\"info\" children=\"Info\" className='mb-3 w-100' />\r\n </Col>\r\n <Col sm={5}>\r\n <Badge type=\"success\" children=\"Success\" className='mb-3 w-100' />\r\n </Col>\r\n <Col sm={5}>\r\n <Badge type=\"warning\" children=\"Warning\" className='mb-3 w-100' />\r\n </Col>\r\n <Col sm={5}>\r\n <Badge type=\"danger\" children=\"Danger\" className='mb-3 w-100' />\r\n </Col>\r\n <Col sm={5}>\r\n <Badge type=\"primary\" children=\"Primary\" className='mb-3 w-100' />\r\n </Col>\r\n <Col sm={5}>\r\n <Badge type=\"secondary\" children=\"Secondary\" className='mb-3 w-100' />\r\n </Col>\r\n <Col sm={5}>\r\n <Badge type=\"light\" children=\"Light\" className='mb-3 w-100' />\r\n </Col>\r\n <Col sm={5}>\r\n <Badge type=\"dark\" children=\"Dark\" className='mb-3 w-100' />\r\n </Col>\r\n </Row>\r\n </Card>\r\n </Col>\r\n <Col lg={7} className='mb-5'>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {`<Row className='gap-2 d-flex justify-content-center'>\r\n <Col sm={5}>\r\n <Badge type=\"info\" children=\"Info\" className='mb-3 w-100' />\r\n </Col>\r\n <Col sm={5}>\r\n <Badge type=\"success\" children=\"Success\" className='mb-3 w-100' />\r\n </Col>\r\n <Col sm={5}>\r\n <Badge type=\"warning\" children=\"Warning\" className='mb-3 w-100' />\r\n </Col>\r\n <Col sm={5}>\r\n <Badge type=\"danger\" children=\"Danger\" className='mb-3 w-100' />\r\n </Col>\r\n <Col sm={5}>\r\n <Badge type=\"primary\" children=\"Primary\" className='mb-3 w-100' />\r\n </Col>\r\n <Col sm={5}>\r\n <Badge type=\"secondary\" children=\"Secondary\" className='mb-3 w-100' />\r\n </Col>\r\n <Col sm={5}>\r\n <Badge type=\"light\" children=\"Light\" className='mb-3 w-100' />\r\n </Col>\r\n <Col sm={5}>\r\n <Badge type=\"dark\" children=\"Dark\" className='mb-3 w-100' />\r\n </Col>\r\n </Row>\r\n `}\r\n </Code>\r\n </Col>\r\n\r\n {/* Buttons */}\r\n <Col lg={5} className='mb-5'>\r\n <h2 id='buttons'>Buttons</h2>\r\n <Card className='mb-3'>\r\n <Row>\r\n <Col xs={12} className='d-flex gap-3 mb-3'>\r\n {/* Loading Button */}\r\n <Label label='Loading Button' />\r\n <LoadingButton\r\n label=\"Loading Button\"\r\n icon=\"save\"\r\n showLoader={false}\r\n onClick={async () => {\r\n // Simula una chiamata async\r\n await new Promise((res) => setTimeout(res, 1000));\r\n alert(\"Dati salvati!\");\r\n }}\r\n />\r\n\r\n </Col>\r\n <Col xs={12} className='d-flex gap-3 mb-3'>\r\n {/* Action Button */}\r\n <Label label='Action Button' />\r\n <ActionButton\r\n label=\"Action Button\"\r\n icon=\"box-arrow-up-right\"\r\n title=\"Apri finestra\"\r\n onClick={() => console.log(\"Azione eseguita!\")}\r\n />\r\n </Col>\r\n <Col xs={12} className='d-flex gap-3 mb-3'>\r\n {/* Go Site */}\r\n <Label label='Go Site' />\r\n <GoSite\r\n label=\"Go site Button\"\r\n url=\"https://www.example.com\"\r\n />\r\n </Col>\r\n <Col xs={12} className='d-flex gap-3 mb-3'>\r\n {/* Refer Site */}\r\n <Label label='Refer Site' />\r\n <ReferSite\r\n title=\"OpenAI\"\r\n url=\"https://www.openai.com\"\r\n imageUrl={PLACEHOLDER_BRAND}\r\n width={120}\r\n />\r\n </Col>\r\n </Row>\r\n </Card>\r\n </Col>\r\n <Col lg={7} className='mb-5'>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {`<Row>\r\n <Col xs={12} className='d-flex gap-3 mb-3'>\r\n {/* Loading Button */}\r\n <Label label='Loading Button' />\r\n <LoadingButton\r\n label=\"Loading Button\"\r\n icon=\"save\"\r\n showLoader={false}\r\n onClick={async () => {\r\n // Simula una chiamata async\r\n await new Promise((res) => setTimeout(res, 1000));\r\n alert(\"Dati salvati!\");\r\n }}\r\n />\r\n\r\n </Col>\r\n <Col xs={12} className='d-flex gap-3 mb-3'>\r\n {/* Action Button */}\r\n <Label label='Action Button' />\r\n <ActionButton\r\n label=\"Action Button\"\r\n icon=\"box-arrow-up-right\"\r\n title=\"Apri finestra\"\r\n toggle=\"modal\"\r\n target=\"#myModal\"\r\n onClick={() => console.log(\"Azione eseguita!\")}\r\n />\r\n </Col>\r\n <Col xs={12} className='d-flex gap-3 mb-3'>\r\n {/* Go Site */}\r\n <Label label='Go Site' />\r\n <GoSite\r\n label=\"Go site Button\"\r\n url=\"https://www.example.com\"\r\n />\r\n </Col>\r\n <Col xs={12} className='d-flex gap-3 mb-3'>\r\n {/* Refer Site */}\r\n <Label label='Refer Site' />\r\n <ReferSite\r\n title=\"OpenAI\"\r\n url=\"https://www.openai.com\"\r\n imageUrl={PLACEHOLDER_BRAND}\r\n width={120}\r\n />\r\n </Col>\r\n </Row>\r\n `}\r\n </Code>\r\n </Col>\r\n\r\n {/* Card */}\r\n <Col lg={5} className='mb-5'>\r\n <h2 id='card'>Card</h2>\r\n <Card className='mb-3'>\r\n <Card\r\n className=\"shadow-sm\"\r\n wrapClass=\"my-3\"\r\n title=\"Card Title\"\r\n header={<span className=\"text-muted\">Header</span>}\r\n footer={<div>Footer with actions.</div>}\r\n showLoader={false}\r\n showArrow={true}\r\n\r\n >\r\n <p>Main content.</p>\r\n </Card>\r\n <Card\r\n title=\"Data loading\"\r\n showLoader={true}\r\n >\r\n <p>Data will be show when loaded.</p>\r\n </Card>\r\n </Card>\r\n </Col>\r\n <Col lg={7} className='mb-5'>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {`<Card\r\n className=\"shadow-sm\"\r\n wrapClass=\"my-3\"\r\n title=\"Card Title\"\r\n header={<span className=\"text-muted\">Header</span>}\r\n footer={<div>Footer with actions.</div>}\r\n showLoader={false}\r\n showArrow={true}\r\n\r\n >\r\n <p>Main content.</p>\r\n </Card>\r\n\r\n <Card\r\n title=\"Data loading\"\r\n showLoader={true}\r\n >\r\n <p>Data will be show when loaded.</p>\r\n </Card>\r\n `}\r\n </Code>\r\n </Col>\r\n\r\n {/* Gallery */}\r\n <Col lg={5} className='mb-5'>\r\n <h2 id='gallery'>Gallery</h2>\r\n <Card className='mb-3'>\r\n <Gallery\r\n body={\r\n [\r\n {\r\n thumbnail: PLACEHOLDER_IMAGE,\r\n name: 'Foto 1',\r\n mimetype: '',\r\n width: 100,\r\n height: 100,\r\n },\r\n {\r\n thumbnail: PLACEHOLDER_IMAGE,\r\n name: 'Foto 2',\r\n mimetype: '',\r\n width: 100,\r\n height: 100,\r\n },\r\n {\r\n thumbnail: PLACEHOLDER_IMAGE,\r\n name: 'Foto 3',\r\n mimetype: '',\r\n width: 100,\r\n height: 100,\r\n },\r\n {\r\n thumbnail: PLACEHOLDER_IMAGE,\r\n name: 'Foto 4',\r\n mimetype: '',\r\n width: 100,\r\n height: 100,\r\n },\r\n {\r\n thumbnail: PLACEHOLDER_IMAGE,\r\n name: 'Foto 5',\r\n mimetype: '',\r\n width: 100,\r\n height: 100,\r\n },\r\n {\r\n thumbnail: PLACEHOLDER_IMAGE,\r\n name: 'Foto 6',\r\n mimetype: '',\r\n width: 100,\r\n height: 100,\r\n },\r\n {\r\n thumbnail: PLACEHOLDER_IMAGE,\r\n name: 'Foto 7',\r\n mimetype: '',\r\n width: 100,\r\n height: 100,\r\n },\r\n {\r\n thumbnail: PLACEHOLDER_IMAGE,\r\n name: 'Foto 8',\r\n mimetype: '',\r\n width: 100,\r\n height: 100,\r\n },\r\n {\r\n thumbnail: PLACEHOLDER_IMAGE,\r\n name: 'Foto 9',\r\n mimetype: '',\r\n width: 100,\r\n height: 100,\r\n },\r\n {\r\n thumbnail: PLACEHOLDER_IMAGE,\r\n name: 'Foto 10',\r\n mimetype: '',\r\n width: 100,\r\n height: 100,\r\n }\r\n ]\r\n }\r\n Header={<h5>Galleria immagini</h5>}\r\n />\r\n </Card>\r\n </Col>\r\n <Col lg={7} className='mb-5'>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {`<Gallery\r\n body={\r\n [\r\n {\r\n thumbnail: PLACEHOLDER_IMAGE,\r\n name: 'Foto 1',\r\n mimetype: '',\r\n width: 100,\r\n height: 100,\r\n },\r\n {\r\n thumbnail: PLACEHOLDER_IMAGE,\r\n name: 'Foto 2',\r\n mimetype: '',\r\n width: 100,\r\n height: 100,\r\n },\r\n {\r\n thumbnail: PLACEHOLDER_IMAGE,\r\n name: 'Foto 3',\r\n mimetype: '',\r\n width: 100,\r\n height: 100,\r\n },\r\n {\r\n thumbnail: PLACEHOLDER_IMAGE,\r\n name: 'Foto 4',\r\n mimetype: '',\r\n width: 100,\r\n height: 100,\r\n },\r\n {\r\n thumbnail: PLACEHOLDER_IMAGE,\r\n name: 'Foto 5',\r\n mimetype: '',\r\n width: 100,\r\n height: 100,\r\n },\r\n {\r\n thumbnail: PLACEHOLDER_IMAGE,\r\n name: 'Foto 6',\r\n mimetype: '',\r\n width: 100,\r\n height: 100,\r\n },\r\n {\r\n thumbnail: PLACEHOLDER_IMAGE,\r\n name: 'Foto 7',\r\n mimetype: '',\r\n width: 100,\r\n height: 100,\r\n },\r\n {\r\n thumbnail: PLACEHOLDER_IMAGE,\r\n name: 'Foto 8',\r\n mimetype: '',\r\n width: 100,\r\n height: 100,\r\n },\r\n {\r\n thumbnail: PLACEHOLDER_IMAGE,\r\n name: 'Foto 9',\r\n mimetype: '',\r\n width: 100,\r\n height: 100,\r\n },\r\n {\r\n thumbnail: PLACEHOLDER_IMAGE,\r\n name: 'Foto 10',\r\n mimetype: '',\r\n width: 100,\r\n height: 100,\r\n }\r\n ]\r\n }\r\n Header={<h5>Galleria immagini</h5>}\r\n />\r\n `}\r\n </Code>\r\n </Col>\r\n\r\n {/* GridSystem */}\r\n <Col lg={5} className='mb-5'>\r\n <h2 id='gridSystem'>GridSystem</h2>\r\n <Card className='mb-3'>\r\n <Wrapper>\r\n <Container>\r\n <Row>\r\n <Col xs={12} sm={6} md={4} className='bg-primary py-3'>\r\n Colonna 1\r\n </Col>\r\n <Col xs={12} sm={6} md={4} className='bg-secondary py-3'>\r\n Colonna 2\r\n </Col>\r\n <Col xs={12} sm={12} md={4} className='bg-dark py-3'>\r\n Colonna 3\r\n </Col>\r\n </Row>\r\n </Container>\r\n </Wrapper>\r\n </Card>\r\n </Col>\r\n <Col lg={7} className='mb-5'>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {`<Wrapper>\r\n\r\n <Container>\r\n \r\n <Row>\r\n \r\n <Col xs={12} sm={6} md={4} className='bg-primary py-3'>\r\n Colonna 1\r\n </Col>\r\n\r\n <Col xs={12} sm={6} md={4} className='bg-secondary py-3'>\r\n Colonna 2\r\n </Col>\r\n\r\n <Col xs={12} sm={12} md={4} className='bg-dark py-3'>\r\n Colonna 3\r\n </Col>\r\n\r\n \r\n </Row>\r\n \r\n </Container>\r\n </Wrapper>\r\n `}\r\n </Code>\r\n </Col>\r\n\r\n {/* Images */}\r\n <Col lg={5} className='mb-5'>\r\n <h2 id='images'>Images</h2>\r\n <Card className='mb-3' title='Image'>\r\n <p>This is the standard HTML tag for displaying an image. It is simple and easy to use, but it doesn't handle errors, fallbacks, or custom caching. If the image fails to load, the user will see a broken image icon.\r\n\r\n </p>\r\n <Image\r\n src={PLACEHOLDER_IMAGE}\r\n className=\"img-fluid\"\r\n width={150}\r\n height={150}\r\n />\r\n </Card>\r\n {/* ImageAvatar */}\r\n <Card className='mb-3' title='Image Avatar'>\r\n <p>ImageAvatar is a React component that:\r\n <ul>\r\n <li>Displays a default placeholder if the image fails to load</li>\r\n <li>Converts the image to base64 and stores it in localStorage for local caching</li>\r\n <li>Reuses cached images to improve performance</li>\r\n <li>Handles alternate text smartly using alt, title, or the filename</li>\r\n <li>Provides robust error handling and a better user experience</li>\r\n </ul>\r\n </p>\r\n <Image\r\n src={PLACEHOLDER_IMAGE}\r\n className=\"img-fluid\"\r\n width={150}\r\n height={150}\r\n />\r\n </Card>\r\n </Col>\r\n <Col lg={7} className='mb-5'>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {`\r\n <Image\r\n src={PLACEHOLDER_IMAGE}\r\n className=\"img-fluid\"\r\n width={150}\r\n height={150}\r\n />\r\n `}\r\n </Code>\r\n </Col>\r\n\r\n {/* Loader */}\r\n <Col lg={5} className='mb-5'>\r\n <h2 id='loader'>Loader</h2>\r\n <Card className='mb-3'>\r\n <Loader\r\n children=\"Loading...\"\r\n show={true}\r\n />\r\n </Card>\r\n </Col>\r\n <Col lg={7} className='mb-5'>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {`\r\n <Loader\r\n children=\"Loading...\"\r\n show={true}\r\n />\r\n `}\r\n </Code>\r\n </Col>\r\n\r\n {/* Modal */}\r\n <Col lg={5} className='mb-5'>\r\n <h2 id='modal'>Modal</h2>\r\n <Card className='mb-3' title=''>\r\n <ActionButton label='Open modal' onClick={async () => { setShowModal(true) }} />\r\n {showModal &&\r\n <Modal\r\n title=\"Modal Title\"\r\n header={\"Header Subtitle\"}\r\n footer={<div>Footer with actions.</div>}\r\n size=\"lg\"\r\n onClose={() => { setShowModal(false) }}\r\n >\r\n <p>Main content.</p>\r\n </Modal>\r\n }\r\n </Card>\r\n </Col>\r\n <Col lg={7} className='mb-5'>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {`\r\n <ActionButton label='Open modal' onClick={async () => { setShowModal(true) }} />\r\n {showModal &&\r\n <Modal\r\n title=\"Modal Title\"\r\n header={\"Header Subtitle\"}\r\n footer={<div>Footer with actions.</div>}\r\n size=\"lg\"\r\n onClose={() => { setShowModal(false) }}\r\n >\r\n <p>Main content.</p>\r\n </Modal>\r\n }\r\n `}\r\n </Code>\r\n </Col>\r\n\r\n {/* Percentage */}\r\n <Col lg={5} className='mb-5'>\r\n <h2 id=\"percentage\">Percentage</h2>\r\n <Card className='mb-3' header='Percentage'>\r\n <div className='mb-2'>\r\n <Percentage className='me-2' min={0} max={100} val={30} shape='circle' label='Circle' fontSize={30} />\r\n <Percentage className='me-2' min={0} max={100} val={40} shape='circle' size={100} thickness={15} type='success' />\r\n <Percentage className='me-2' min={0} max={100} val={50} shape='circle' size={80} thickness={20} type='danger' />\r\n <Percentage className='me-2' min={0} max={100} val={60} shape='circle' size={60} thickness={25} type='warning' showText={false} />\r\n <Percentage className='me-2' min={0} max={100} val={70} shape='circle' size={40} thickness={30} type='info' showText={false} />\r\n </div>\r\n\r\n <Percentage label='Bar' className='mb-2' min={0} max={10} val={3} shape='bar' size={40} thickness={30} type='info' />\r\n <Percentage className='mb-2' min={0} max={10} val={4} shape='bar' size={60} thickness={25} type='warning' />\r\n <Percentage className='mb-2' min={0} max={10} val={5} shape='bar' size={80} thickness={20} type='danger' />\r\n <Percentage className='mb-2' min={0} max={10} val={6} shape='bar' size={100} thickness={15} type='success' showText={false} />\r\n <Percentage className='mb-2' min={0} max={10} val={7} shape='bar' thickness={2} showText={false} />\r\n </Card>\r\n </Col>\r\n <Col lg={7} className='mb-5'>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {`\r\n <div className='mb-2'>\r\n <Percentage min={0} max={100} val={30} shape='circle' label='Circle' fontSize={30} />\r\n <Percentage min={0} max={100} val={40} shape='circle' size={100} thickness={15} type='success' />\r\n <Percentage min={0} max={100} val={50} shape='circle' size={80} thickness={20} type='danger' />\r\n <Percentage min={0} max={100} val={60} shape='circle' size={60} thickness={25} type='warning' showText={false} />\r\n <Percentage min={0} max={100} val={70} shape='circle' size={40} thickness={30} type='info' showText={false} />\r\n </div>\r\n\r\n <Percentage label='Bar' min={0} max={10} val={3} shape='bar' size={40} thickness={30} type='info' />\r\n <Percentage min={0} max={10} val={4} shape='bar' size={60} thickness={25} type='warning' />\r\n <Percentage min={0} max={10} val={5} shape='bar' size={80} thickness={20} type='danger' />\r\n <Percentage min={0} max={10} val={6} shape='bar' size={100} thickness={15} type='success' showText={false} />\r\n <Percentage min={0} max={10} val={7} shape='bar' thickness={2} showText={false} />\r\n `}\r\n </Code>\r\n </Col>\r\n\r\n {/* Repeat */}\r\n <Col lg={5} className='mb-5'>\r\n <h2 id='repeat'>Repeat</h2>\r\n <Card className='mb-3' title=''>\r\n <Form dataStoragePath='' header=\"Repeat Demo\">\r\n <Repeat name='repeatGroup'>\r\n <String name='repeat1' label='Repeat 1' className='mb-3' placeholder='Lorem ipsum.' />\r\n <String name='repeat2' label='Repeat 2' className='mb-3' placeholder='Lorem ipsum.' />\r\n <String name='repeat3' label='Repeat 3' className='mb-3' placeholder='Lorem ipsum.' />\r\n </Repeat>\r\n </Form>\r\n </Card>\r\n </Col>\r\n <Col lg={7} className='mb-5'>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {`<Form dataStoragePath='' header=\"Repeat Demo\">\r\n \r\n <Repeat name='repeatGroup'>\r\n <String name='repeat1' label='Repeat 1' className='mb-3' placeholder='Lorem ipsum.' />\r\n <String name='repeat2' label='Repeat 2' className='mb-3' placeholder='Lorem ipsum.' />\r\n <String name='repeat3' label='Repeat 3' className='mb-3' placeholder='Lorem ipsum.' />\r\n </Repeat>\r\n \r\n </Form>\r\n `}\r\n </Code>\r\n </Col>\r\n\r\n {/* Tab */}\r\n <Col lg={5} className='mb-5'>\r\n <h2 id='tab'>Tab</h2>\r\n <Card className='mb-3' title='Tabs'>\r\n <h3>Default</h3>\r\n <Tab tabPosition='default'>\r\n <TabItem label='Intro'>\r\n <p>Lorem ipsum. Content 1 or Component Nested 1</p>\r\n <p>Lorem ipsum. Content 2 or Component Nested 2</p>\r\n <p>Lorem ipsum. Content 3 or Component Nested 3</p>\r\n </TabItem>\r\n <TabItem label='Tab 2'>\r\n <Form dataStoragePath=''>\r\n <String name='example1' label='Example Tab 2' />\r\n <TextArea name='example2' label='Example Tab 2' />\r\n </Form>\r\n </TabItem>\r\n <TabItem label='End'>\r\n <Card\r\n title='Card Example Tab 3'\r\n header={\"Lorem ipsum. Content 1 or Component Nested 1\"}\r\n footer={\"Lorem ipsum. Content 2 or Component Nested 2\"}\r\n showLoader={false}\r\n showArrow={true}\r\n >\r\n <p>Main content.</p>\r\n <hr />\r\n <Form dataStoragePath=''>\r\n <TextArea name='example' label='Example Tab 3' />\r\n </Form>\r\n </Card>\r\n </TabItem>\r\n </Tab>\r\n <br /><hr /><br />\r\n <h3>Top</h3>\r\n <Tab tabPosition='top'>\r\n <TabItem label='Tab1'>\r\n <p>Lorem ipsum. Content 1 or Component Nested 1</p>\r\n </TabItem>\r\n <TabItem label='Tab2'>\r\n <p>Lorem ipsum. Content 2 or Component Nested 2</p>\r\n </TabItem>\r\n <TabItem label='Tab3'>\r\n <p>Lorem ipsum. Content 3 or Component Nested 3</p>\r\n </TabItem>\r\n </Tab>\r\n <br /><hr /><br />\r\n <h3>Left</h3>\r\n <Tab tabPosition='left'>\r\n <TabItem label='Tab1'>\r\n <p>Lorem ipsum. Content 1 or Component Nested 1</p>\r\n </TabItem>\r\n <TabItem label='Tab2'>\r\n <p>Lorem ipsum. Content 2 or Component Nested 2</p>\r\n </TabItem>\r\n <TabItem label='Tab3'>\r\n <p>Lorem ipsum. Content 3 or Component Nested 3</p>\r\n </TabItem>\r\n </Tab>\r\n <br /><hr /><br />\r\n <h3>Right</h3>\r\n <Tab tabPosition='right'>\r\n <TabItem label='Tab1'>\r\n <p>Lorem ipsum. Content 1 or Component Nested 1</p>\r\n </TabItem>\r\n <TabItem label='Tab2'>\r\n <p>Lorem ipsum. Content 2 or Component Nested 2</p>\r\n </TabItem>\r\n <TabItem label='Tab3'>\r\n <p>Lorem ipsum. Content 3 or Component Nested 3</p>\r\n </TabItem>\r\n </Tab>\r\n <br /><hr /><br />\r\n <h3>Bottom</h3>\r\n <Tab tabPosition='bottom'>\r\n <TabItem label='Tab1'>\r\n <p>Lorem ipsum. Content 1 or Component Nested 1</p>\r\n </TabItem>\r\n <TabItem label='Tab2'>\r\n <p>Lorem ipsum. Content 2 or Component Nested 2</p>\r\n </TabItem>\r\n <TabItem label='Tab3'>\r\n <p>Lorem ipsum. Content 3 or Component Nested 3</p>\r\n </TabItem>\r\n </Tab>\r\n </Card>\r\n <Card className='mb-3' title='Dynamic Tabs (TabDynamic)'>\r\n <h3>Default</h3>\r\n <Form dataStoragePath='' header=\"TabDynamic Demo\">\r\n <TabDynamic name='tabDynamic' min={1} label='Tab'>\r\n <String name='example' label='Example Tab 1' />\r\n </TabDynamic>\r\n <br /><hr /><br />\r\n <h3>Top</h3>\r\n <TabDynamic name='tabDynamic2' min={2} label='Tab' tabPosition='top'>\r\n <String name='example' label='Example Tab 2' />\r\n </TabDynamic>\r\n <br /><hr /><br />\r\n <h3>Left</h3>\r\n <TabDynamic name='tabDynamic3' min={3} label='Tab' tabPosition='left'>\r\n <String name='example' label='Example Tab 3' />\r\n </TabDynamic>\r\n <br /><hr /><br />\r\n <h3>Right</h3>\r\n <TabDynamic name='tabDynamic4' min={4} max={4} label='Tab' tabPosition='right'>\r\n <String name='example' label='Example Tab 4' />\r\n </TabDynamic>\r\n <br /><hr /><br />\r\n <h3>Bottom</h3>\r\n <TabDynamic name='tabDynamic5' min={0} readOnly={true} value={[{ example: 'first Tab' }, { example: 'second Tab' }, { example: 'third Tab' }]} label='Tab' tabPosition='bottom'>\r\n <String name='example' label='Example Tab 5' />\r\n </TabDynamic>\r\n </Form>\r\n </Card>\r\n </Col>\r\n <Col lg={7} className='mb-5'>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {`<Card>\r\n /* Default */\r\n <Tab tabPosition='default'>\r\n\r\n <TabItem label='Intro'>\r\n <p>Lorem ipsum. Content 1 or Component Nested 1</p>\r\n <p>Lorem ipsum. Content 2 or Component Nested 2</p>\r\n <p>Lorem ipsum. Content 3 or Component Nested 3</p>\r\n </TabItem>\r\n\r\n <TabItem label='Tab 2'>\r\n <Form dataStoragePath=''>\r\n <String name='example1' label='Example Tab 2' />\r\n <TextArea name='example2' label='Example Tab 2' />\r\n </Form>\r\n </TabItem>\r\n\r\n <TabItem label='End'>\r\n <Card\r\n title='Card Example Tab 3'\r\n header={\"Lorem ipsum. Content 1 or Component Nested 1\"}\r\n footer={\"Lorem ipsum. Content 2 or Component Nested 2\"}\r\n showLoader={false}\r\n showArrow={true}\r\n >\r\n <p>Main content.</p>\r\n <hr />\r\n <Form dataStoragePath=''>\r\n <TextArea name='example' label='Example Tab 3' />\r\n </Form>\r\n </Card>\r\n </TabItem>\r\n\r\n </Tab>\r\n\r\n /* Top */\r\n <Tab tabPosition='top'>\r\n\r\n <TabItem label='Tab1'>\r\n <p>Lorem ipsum. Content 1 or Component Nested 1</p>\r\n </TabItem>\r\n\r\n <TabItem label='Tab2'>\r\n <p>Lorem ipsum. Content 2 or Component Nested 2</p>\r\n </TabItem>\r\n\r\n <TabItem label='Tab3'>\r\n <p>Lorem ipsum. Content 3 or Component Nested 3</p>\r\n </TabItem>\r\n\r\n </Tab>\r\n \r\n /* Left */\r\n <Tab tabPosition='left'>\r\n\r\n <TabItem label='Tab1'>\r\n <p>Lorem ipsum. Content 1 or Component Nested 1</p>\r\n </TabItem>\r\n\r\n <TabItem label='Tab2'>\r\n <p>Lorem ipsum. Content 2 or Component Nested 2</p>\r\n </TabItem>\r\n\r\n <TabItem label='Tab3'>\r\n <p>Lorem ipsum. Content 3 or Component Nested 3</p>\r\n </TabItem>\r\n\r\n </Tab>\r\n \r\n /* Right */\r\n <Tab tabPosition='right'>\r\n\r\n <TabItem label='Tab1'>\r\n <p>Lorem ipsum. Content 1 or Component Nested 1</p>\r\n </TabItem>\r\n\r\n <TabItem label='Tab2'>\r\n <p>Lorem ipsum. Content 2 or Component Nested 2</p>\r\n </TabItem>\r\n\r\n <TabItem label='Tab3'>\r\n <p>Lorem ipsum. Content 3 or Component Nested 3</p>\r\n </TabItem>\r\n\r\n </Tab>\r\n\r\n /* Bottom */\r\n <Tab tabPosition='bottom'>\r\n\r\n <TabItem label='Tab1'>\r\n <p>Lorem ipsum. Content 1 or Component Nested 1</p>\r\n </TabItem>\r\n\r\n <TabItem label='Tab2'>\r\n <p>Lorem ipsum. Content 2 or Component Nested 2</p>\r\n </TabItem>\r\n\r\n <TabItem label='Tab3'>\r\n <p>Lorem ipsum. Content 3 or Component Nested 3</p>\r\n </TabItem>\r\n\r\n </Tab>\r\n\r\n </Card>\r\n\r\n /* Dynamic Tabs */\r\n <Card className='mb-3' title='Dynamic Tabs (TabDynamic)'>\r\n /* Default */\r\n <Form dataStoragePath='' header=\"TabDynamic Demo\">\r\n\r\n <TabDynamic name='tabDynamic' min={1} label='Tab'>\r\n <String name='example' label='Example Tab 1' />\r\n </TabDynamic>\r\n \r\n /* Top */\r\n <TabDynamic name='tabDynamic2' min={2} label='Tab' tabPosition='top'>\r\n <String name='example' label='Example Tab 2' />\r\n </TabDynamic>\r\n\r\n /* Left */\r\n <TabDynamic name='tabDynamic3' min={3} label='Tab' tabPosition='left'>\r\n <String name='example' label='Example Tab 3' />\r\n </TabDynamic>\r\n \r\n /* Right */\r\n <TabDynamic name='tabDynamic4' min={4} max={4} label='Tab' tabPosition='right'>\r\n <String name='example' label='Example Tab 4' />\r\n </TabDynamic>\r\n \r\n /* Bottom */\r\n <TabDynamic name='tabDynamic5' min={0} readOnly={true} value={[{ example: 'first Tab' }, { example: 'second Tab' }, { example: 'third Tab' }]} label='Tab' tabPosition='bottom'>\r\n <String name='example' label='Example Tab 5' />\r\n </TabDynamic>\r\n\r\n </Form>\r\n `}\r\n </Code>\r\n </Col>\r\n\r\n {/* Table */}\r\n <Col lg={5} className='mb-5'>\r\n <h2 id='table'>Table</h2>\r\n <Card className='mb-3' title=''>\r\n <Table\r\n header={[\r\n { label: 'ID', key: 'id' },\r\n { label: 'Name', key: 'name' },\r\n { label: 'Email', key: 'email' },\r\n ]}\r\n body={[\r\n { id: 1, name: 'John Doe', email: 'john@doe.com' },\r\n { id: 2, name: 'Jane Doe', email: 'jane@doe.com' },\r\n { id: 3, name: 'Alice Smith', email: 'alice@smith.com' },\r\n { id: 4, name: 'Bob Johnson', email: 'bob@johnson.com' },\r\n { id: 5, name: 'Charlie Brown', email: 'charlie@brown.com' }\r\n ]}\r\n onClick={(index) => {\r\n console.log(index);\r\n }}\r\n />\r\n </Card>\r\n </Col>\r\n <Col lg={7} className='mb-5'>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {`<Table\r\n header={[\r\n { label: 'ID', key: 'id' },\r\n { label: 'Name', key: 'name' },\r\n { label: 'Email', key: 'email' },\r\n ]}\r\n body={[\r\n { id: 1, name: 'John Doe', email: 'john@doe.com' },\r\n { id: 2, name: 'Jane Doe', email: 'jane@doe.com' },\r\n { id: 3, name: 'Alice Smith', email: 'alice@smith.com' },\r\n { id: 4, name: 'Bob Johnson', email: 'bob@johnson.com' },\r\n { id: 5, name: 'Charlie Brown', email: 'charlie@brown.com' }\r\n ]}\r\n onClick={(index) => {\r\n console.log(index);\r\n }}\r\n />\r\n `}\r\n </Code>\r\n </Col>\r\n\r\n {/* Brand */}\r\n <Col lg={5} className='mb-5'>\r\n <h2 id='brand'>Brand</h2>\r\n <Card className='mb-3' title=''>\r\n <Brand url='https://it.wikipedia.org/wiki/Sicurezza_informatica' logo={PLACEHOLDER_BRAND} label='Cyber' />\r\n </Card>\r\n </Col>\r\n <Col lg={7} className='mb-5'>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {` <Brand url='https://it.wikipedia.org/wiki/Sicurezza_informatica' logo={PLACEHOLDER_BRAND} label='Cyber' />\r\n `}\r\n </Code>\r\n </Col>\r\n\r\n\r\n {/* Breadcrumbs */}\r\n <Col lg={5} className='mb-5'>\r\n <h2 id='breadcrumb'>Breadcrumbs</h2>\r\n <Card className='mb-3' title=''>\r\n <Breadcrumbs className=\"mb-3\" pre={<i className=\"bi bi-house-door-fill\" />} />\r\n </Card>\r\n </Col>\r\n <Col lg={7} className='mb-5'>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {` <Breadcrumbs className=\"mb-3\" pre={<i className=\"bi bi-house-door-fill\" />} />\r\n `}\r\n </Code>\r\n </Col>\r\n\r\n {/* Carousel */}\r\n <Col lg={5} className='mb-5'>\r\n <h2 id='carousel'>Carousel</h2>\r\n <Card className='mb-3' title=''>\r\n <Carousel\r\n showIndicators={true}\r\n showControls={true}\r\n showCaption={true}\r\n layoutDark={true}\r\n autoPlay={{ interval: 3000, pause: \"hover\", wrap: true }}\r\n startSlide={0}\r\n >\r\n {[\r\n <img key=\"1\" src={PLACEHOLDER_IMAGE} alt=\"First slide\" className=\"d-block w-50 m-auto\" />,\r\n <img key=\"2\" src={PLACEHOLDER_IMAGE} alt=\"Second slide\" className=\"d-block w-50 m-auto\" />,\r\n <img key=\"3\" src={PLACEHOLDER_IMAGE} alt=\"Third slide\" className=\"d-block w-50 m-auto\" />\r\n ]}\r\n </Carousel>\r\n </Card>\r\n </Col>\r\n <Col lg={7} className='mb-5'>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {` <Carousel\r\n showIndicators={true}\r\n showControls={true}\r\n showCaption={true}\r\n layoutDark={true}\r\n autoPlay={{ interval: 3000, pause: \"hover\", wrap: true }}\r\n startSlide={0}\r\n >\r\n {[\r\n <img key=\"1\" src={PLACEHOLDER_IMAGE} alt=\"First slide\" className=\"d-block w-50 m-auto\" />,\r\n <img key=\"2\" src={PLACEHOLDER_IMAGE} alt=\"Second slide\" className=\"d-block w-50 m-auto\" />,\r\n <img key=\"3\" src={PLACEHOLDER_IMAGE} alt=\"Third slide\" className=\"d-block w-50 m-auto\" />\r\n ]}\r\n </Carousel>\r\n `}\r\n </Code>\r\n </Col>\r\n\r\n {/* Dropdown */}\r\n <Col lg={5} className='mb-5'>\r\n <h2 id='dropdown'>Dropdown</h2>\r\n <Card className='mb-3' title=''>\r\n {/* Dropdown Links */}\r\n <Dropdown\r\n toggleButton={{\r\n icon: \"list\",\r\n text: \"Dropdown with Links\"\r\n }}\n header=\"Account\"\n footer={<a href=\"/logout\" className=\"flex w-full items-center rounded-sm px-2 py-1.5 text-sm text-destructive hover:bg-accent\">Logout</a>}\n >\n <DropdownItem url=\"/profile\">My Profile</DropdownItem>\r\n <DropdownItem url=\"/settings\">Settings</DropdownItem>\r\n <DropdownItem onClick={() => alert(\"Clicked Help\")}>Help</DropdownItem>\r\n </Dropdown>\r\n </Card>\r\n </Col>\r\n <Col lg={7} className='mb-5'>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {` <Dropdown\r\n toggleButton={{\r\n icon: \"list\",\r\n text: \"Dropdown with Links\"\r\n }}\n header=\"Account\"\n footer={<a href=\"/logout\" className=\"flex w-full items-center rounded-sm px-2 py-1.5 text-sm text-destructive hover:bg-accent\">Logout</a>}\n >\n <DropdownItem url=\"/profile\">My Profile</DropdownItem>\r\n <DropdownItem url=\"/settings\">Settings</DropdownItem>\r\n <DropdownItem onClick={() => alert(\"Clicked Help\")}>Help</DropdownItem>\r\n </Dropdown>\r\n `}\r\n </Code>\r\n </Col>\r\n\r\n {/* Notifications */}\r\n <Col lg={5} className='mb-5'>\r\n <h2 id='notification'>Notifications</h2>\r\n <Card className='mb-3' title=''>\r\n <Notifications badge={<span className=\"badge \">3</span>}>\r\n {[\r\n {\r\n title: \"New comment on your post\",\r\n url: \"/comments/1\",\r\n time: \"2m ago\",\r\n icon: \"message\"\r\n },\r\n {\r\n title: \"New follower: Jane Smith\",\r\n url: \"/profile/jane-smith\",\r\n time: \"10m ago\",\r\n icon: \"user\"\r\n },\r\n {\r\n title: \"Server downtime alert\",\r\n url: \"/status\",\r\n time: \"1h ago\",\r\n icon: \"alert-triangle\"\r\n }\r\n ]}\r\n </Notifications>\r\n </Card>\r\n </Col>\r\n <Col lg={7} className='mb-5'>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {` <Notifications badge={<span className=\"badge \">3</span>}>\r\n {[\r\n {\r\n title: \"New comment on your post\",\r\n url: \"/comments/1\",\r\n time: \"2m ago\",\r\n icon: \"message\"\r\n },\r\n {\r\n title: \"New follower: Jane Smith\",\r\n url: \"/profile/jane-smith\",\r\n time: \"10m ago\",\r\n icon: \"user\"\r\n },\r\n {\r\n title: \"Server downtime alert\",\r\n url: \"/status\",\r\n time: \"1h ago\",\r\n icon: \"alert-triangle\"\r\n }\r\n ]}\r\n </Notifications>\r\n `}\r\n </Code>\r\n </Col>\r\n\r\n {/* Search */}\r\n <Col lg={5} className='mb-5'>\r\n <h2 id='search'>Search</h2>\r\n <Card className='mb-3' title=''>\r\n <Search />\r\n </Card>\r\n </Col>\r\n <Col lg={7} className='mb-5'>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {` <Search />\r\n `}\r\n </Code>\r\n </Col>\r\n\r\n {/* Form */}\r\n <Col lg={5} className=\"mb-5\">\r\n <h2 id='form'>Form</h2>\r\n <Card className=\"mb-3\" title=\"Basic Form with Manual Fields\">\r\n <p className=\"text-muted\">\r\n A simple form manually composed using standard field components. Suitable when you need full control over layout and fields.\r\n </p>\r\n <Form dataStoragePath=\"/demo/form/manual\">\r\n <String name=\"name\" label=\"Name\" />\r\n <Email name=\"email\" label=\"Email\" />\r\n <TextArea name=\"notes\" label=\"Notes\" />\r\n </Form>\r\n </Card>\r\n {/* Form Template */}\r\n <Card className=\"mb-3\" title=\"Dynamic Form via Form using model\">\r\n <p className=\"text-muted\">\r\n Automatically generates form fields from a model object. Ideal for dynamic UIs, low-code interfaces, or admin panels.\r\n </p>\r\n Work in progress...\r\n </Card>\r\n </Col>\r\n <Col lg={7} className='mb-5'>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {`<Card className=\"mb-3\" title=\"Basic Form with Manual Fields\">\r\n\r\n <Form dataStoragePath=\"/demo/form/manual\">\r\n <String name=\"name\" label=\"Name\" />\r\n <Email name=\"email\" label=\"Email\" />\r\n <TextArea name=\"notes\" label=\"Notes\" />\r\n </Form>\r\n\r\n </Card>\r\n `}\r\n </Code>\r\n </Col>\r\n\r\n {/* Grid */}\r\n <Col lg={5} className='mb-5'>\r\n <h2 id='grid'>Grid</h2>\r\n <Card className='mb-3' title=''>\r\n <Grid\n records={[\n {\n id: 1,\n name: \"Alice Johnson\",\n email: \"alice.johnson@example.com\",\r\n role: \"Admin\",\r\n status: \"Active\"\r\n },\r\n {\r\n id: 2,\r\n name: \"David Miller\",\r\n email: \"david.miller@example.com\",\r\n role: \"Editor\",\r\n status: \"Inactive\"\r\n },\r\n {\r\n id: 3,\r\n name: \"Emma Wilson\",\r\n email: \"emma.wilson@example.com\",\r\n role: \"Viewer\",\r\n status: \"Active\"\r\n },\r\n {\r\n id: 4,\r\n name: \"James Taylor\",\r\n email: \"james.taylor@example.com\",\r\n role: \"Admin\",\r\n status: \"Suspended\"\r\n }\r\n ]}\r\n columns={[\n { key: 'id', label: 'ID' },\n { key: 'name', label: 'Name' },\n { key: 'email', label: 'Email' },\n { key: 'role', label: 'Role' },\n { key: 'status', label: 'Status' }\n ]}\n recordId=\"id\"\n onClickRow={() => { }}\n />\n </Card>\r\n </Col>\r\n <Col lg={7} className='mb-5'>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {`<Grid\n records={[\n {\n id: 1,\n name: \"Alice Johnson\",\n email: \"alice.johnson@example.com\",\r\n role: \"Admin\",\r\n status: \"Active\"\r\n },\r\n {\r\n id: 2,\r\n name: \"David Miller\",\r\n email: \"david.miller@example.com\",\r\n role: \"Editor\",\r\n status: \"Inactive\"\r\n },\r\n {\r\n id: 3,\r\n name: \"Emma Wilson\",\r\n email: \"emma.wilson@example.com\",\r\n role: \"Viewer\",\r\n status: \"Active\"\r\n },\r\n {\r\n id: 4,\r\n name: \"James Taylor\",\r\n email: \"james.taylor@example.com\",\r\n role: \"Admin\",\r\n status: \"Suspended\"\r\n }\r\n ]}\r\n columns={[\n { key: 'id', label: 'ID' },\n { key: 'name', label: 'Name' },\n { key: 'email', label: 'Email' },\n { key: 'role', label: 'Role' },\n { key: 'status', label: 'Status' }\n ]}\n recordId=\"id\"\n onClickRow={() => { }}\n />\n `}\n </Code>\r\n </Col>\r\n\r\n {/* Pagination */}\r\n <Col lg={5} className=\"mb-5\">\r\n <h2 id='pagination'>Pagination</h2>\r\n <Card className=\"mb-3\" title=\"Basic Form with Manual Fields\">\r\n <Pagination recordSet={recordSet} limit={10}>\r\n {(pageRecords: any) => pageRecords.map((component: any, index: number) => (\r\n <p key={index}>{component.name}</p>\r\n ))}\r\n </Pagination>\r\n </Card>\r\n </Col>\r\n <Col lg={7} className='mb-5'>\r\n <Code language='jsx' className='h-100 d-flex flex-grow-1 m-0'>\r\n {`<Pagination recordSet={recordSet} limit={10}>\r\n {(pageRecords: any) => pageRecords.map((component: any, index: number) => (\r\n <p key={index}>{component.name}</p>\r\n ))}\r\n </Pagination>\r\n `}\r\n </Code>\r\n </Col>\r\n\r\n {/* Menu */}\r\n <Menu context='header' />\r\n\r\n </Row>\r\n\r\n </div>\r\n </Col>\r\n\r\n <Col xl={3}>\r\n\r\n {/* Sidebar menu with correct id for ScrollSpy */}\r\n <nav id='sidebar-bootstrap' className='navbar d-none d-xl-block' style={{ height: \"80vh\", overflowY: \"auto\" }}>\r\n <ul className='nav nav-pills flex-column'>\r\n <li className='nav-item'>\r\n <a href='#input' className='nav-link' data-toggle='scroll-to'>Input</a>\r\n </li>\r\n <li className='nav-item'>\r\n <a href='#selectors' className='nav-link' data-toggle='scroll-to'>Selectors</a>\r\n </li>\r\n <li className='nav-item'>\r\n <a href='#upload' className='nav-link' data-toggle='scroll-to'>Upload</a>\r\n </li>\r\n <li className='nav-item'>\r\n <a href='#alert' className='nav-link' data-toggle='scroll-to'>Alert</a>\r\n </li>\r\n <li className='nav-item'>\r\n <a href='#badge' className='nav-link' data-toggle='scroll-to'>Badge</a>\r\n </li>\r\n <li className='nav-item'>\r\n <a href='#buttons' className='nav-link' data-toggle='scroll-to'>Buttons</a>\r\n </li>\r\n <li className='nav-item'>\r\n <a href='#card' className='nav-link' data-toggle='scroll-to'>Card</a>\r\n </li>\r\n <li className='nav-item'>\r\n <a href='#gallery' className='nav-link' data-toggle='scroll-to'>Gallery</a>\r\n </li>\r\n <li className='nav-item'>\r\n <a href='#gridSystem' className='nav-link' data-toggle='scroll-to'>Grid System</a>\r\n </li>\r\n <li className='nav-item'>\r\n <a href='#images' className='nav-link' data-toggle='scroll-to'>Images</a>\r\n </li>\r\n <li className='nav-item'>\r\n <a href='#loader' className='nav-link' data-toggle='scroll-to'>Loader</a>\r\n </li>\r\n <li className='nav-item'>\r\n <a href='#modal' className='nav-link' data-toggle='scroll-to'>Modal</a>\r\n </li>\r\n <li className='nav-item'>\r\n <a href='#percentage' className='nav-link' data-toggle='scroll-to'>Percentage</a>\r\n </li>\r\n <li className='nav-item'>\r\n <a href='#repeat' className='nav-link' data-toggle='scroll-to'>Repeat</a>\r\n </li>\r\n <li className='nav-item'>\r\n <a href='#tab' className='nav-link' data-toggle='scroll-to'>Tab</a>\r\n </li>\r\n <li className='nav-item'>\r\n <a href='#table' className='nav-link' data-toggle='scroll-to'>Table</a>\r\n </li>\r\n <li className='nav-item'>\r\n <a href='#brand' className='nav-link' data-toggle='scroll-to'>Brand</a>\r\n </li>\r\n <li className='nav-item'>\r\n <a href='#breadcrumb' className='nav-link' data-toggle='scroll-to'>Breadcrumb</a>\r\n </li>\r\n <li className='nav-item'>\r\n <a href='#carousel' className='nav-link' data-toggle='scroll-to'>Carousel</a>\r\n </li>\r\n <li className='nav-item'>\r\n <a href='#dropdown' className='nav-link' data-toggle='scroll-to'>Dropdown</a>\r\n </li>\r\n <li className='nav-item'>\r\n <a href='#notification' className='nav-link' data-toggle='scroll-to'>Notifications</a>\r\n </li>\r\n <li className='nav-item'>\r\n <a href='#search' className='nav-link' data-toggle='scroll-to'>Search</a>\r\n </li>\r\n <li className='nav-item'>\r\n <a href='#form' className='nav-link' data-toggle='scroll-to'>Form</a>\r\n </li>\r\n <li className='nav-item'>\r\n <a href='#grid' className='nav-link' data-toggle='scroll-to'>Grid</a>\r\n </li>\r\n <li className='nav-item'>\r\n <a href='#pagination' className='nav-link' data-toggle='scroll-to'>Pagination</a>\r\n </li>\r\n </ul>\r\n </nav>\r\n </Col>\r\n </Row>\r\n </Col>\r\n\r\n </Row >\r\n\r\n </Container >\r\n )\r\n}\r\n\r\nexport default Helper;\r\n","import React, { useEffect, useState } from 'react'\r\nimport { getPrompt, getPromptLangs, getPromptStyles, getPromptVoices, PROMPTS } from '../conf/Prompt';\r\nimport Tab, { TabItem } from '../components/ui/Tab';\r\nimport { ActionButton } from '../components/ui/Buttons';\r\nimport { Number, TextArea } from '../components/ui/fields/Input';\r\nimport { Select } from '../components/ui/fields/Select';\r\nimport AssistantAI from '../components/ui/fields/AssistantAI'\r\nimport Form from '../components/widgets/Form';\r\nimport { FieldOnChange } from '../components/widgets/Form';\r\n\r\ntype PromptKey = keyof typeof PROMPTS;\r\n\r\ninterface Outline {\r\n headline: string;\r\n subheadings: string[];\r\n}\r\n\r\ninterface SectionContent {\r\n title: string;\r\n paragraphs: string[];\r\n}\r\n\r\ninterface Section {\r\n intro: SectionContent;\r\n sections: SectionContent[];\r\n conclusion: SectionContent;\r\n}\r\n\r\ninterface Post {\r\n title: string;\r\n outline: Outline[];\r\n sections: Section;\r\n description: string;\r\n}\r\n\r\ninterface ConfigVariables {\r\n lang: string;\r\n voice: string;\r\n style: string;\r\n limit: string;\r\n}\r\n\r\nconst initialSection: SectionContent = { title: '', paragraphs: [] };\r\nconst initialPost: Post = {\r\n title: '',\r\n outline: [],\r\n sections: {\r\n intro: initialSection,\r\n sections: [],\r\n conclusion: initialSection\r\n },\r\n description: ''\r\n};\r\n\r\nexport default function BlogPost({\r\n data = {\r\n lang: 'Italiano',\r\n voice: 'Informative',\r\n style: 'Descriptive',\r\n limit: '3'\r\n },\r\n promptTopic = 'GENERATE_BLOG_POST_TITLES',\r\n onChange = () => { },\r\n value = undefined\r\n}: {\r\n data?: ConfigVariables,\r\n promptTopic?: PromptKey,\r\n onChange?: (e: any) => void\r\n value?: any\r\n}) {\r\n const langsOptions = getPromptLangs();\r\n const voicesOptions = getPromptVoices();\r\n const stylesOptions = getPromptStyles();\r\n\r\n const [refreshKey, setRefreshKey] = useState(0);\r\n const [post, setPost] = useState<Post>(initialPost);\r\n const [configVariables, setConfigVariables] = useState<ConfigVariables>({\r\n lang: data.lang,\r\n voice: data.voice,\r\n style: data.style,\r\n limit: data.limit\r\n });\r\n const [disableVariables, setDisabledVariables] = useState(false);\r\n\r\n useEffect(() => {\r\n post.title && setDisabledVariables(true);\r\n }, [post.title]);\r\n\r\n const handleConfigChange: FieldOnChange = ({name, value}) => {\r\n setConfigVariables(prev => ({ ...prev, [name]: value }));\r\n };\r\n\r\n const updatePost = (field: keyof Post) => (value: any) => {\r\n setPost(prev => ({ ...prev, [field]: value }));\r\n onChange(post);\r\n };\r\n\r\n const updateSectionContent = (type: 'intro' | 'conclusion', field: keyof SectionContent, value: string) => {\r\n setPost(prev => ({\r\n ...prev,\r\n sections: {\r\n ...prev.sections,\r\n [type]: {\r\n ...prev.sections[type],\r\n [field]: field === 'paragraphs' ? value.split('\\n') : value\r\n }\r\n }\r\n }));\r\n };\r\n\r\n const updateSection = (index: number, field: keyof SectionContent, value: string) => {\r\n setPost(prev => ({\r\n ...prev,\r\n sections: {\r\n ...prev.sections,\r\n sections: prev.sections.sections.map((s, i) =>\r\n i === index ? { ...s, [field]: field === 'paragraphs' ? value.split('\\n') : value } : s\r\n )\r\n }\r\n }));\r\n };\r\n\r\n type ResetType = 'all' | 'fromTitle' | 'fromOutline' | 'fromSections' | 'fromDescription';\r\n\r\n const resetPost = (type: ResetType = 'all') => {\r\n if (type === 'all') {\r\n setDisabledVariables(false);\r\n setRefreshKey(prev => prev + 1);\r\n setPost(initialPost);\r\n return;\r\n }\r\n\r\n setPost(prev => {\r\n switch (type) {\r\n case 'fromTitle':\r\n return {\r\n ...prev,\r\n title: '',\r\n outline: [],\r\n sections: { intro: initialSection, sections: [], conclusion: initialSection },\r\n description: ''\r\n };\r\n case 'fromOutline':\r\n return {\r\n ...prev,\r\n outline: [],\r\n sections: { intro: initialSection, sections: [], conclusion: initialSection },\r\n description: ''\r\n };\r\n case 'fromSections':\r\n return {\r\n ...prev,\r\n sections: { intro: initialSection, sections: [], conclusion: initialSection },\r\n description: ''\r\n };\r\n case 'fromDescription':\r\n return {\r\n ...prev,\r\n description: ''\r\n };\r\n default:\r\n return prev;\r\n }\r\n });\r\n };\r\n\r\n const formatOutlineForAI = (outline: Outline[]) => {\r\n return outline.map(item => (\r\n `Section: ${item.headline}\\nTopics to cover:\\n${item.subheadings.map(sub => `- ${sub}`).join('\\n')}`\r\n )).join('\\n\\n');\r\n };\r\n\r\n type SectionItem =\r\n | { type: 'intro' | 'conclusion'; label: string; section: SectionContent }\r\n | { type: 'section'; label: string; section: SectionContent; index: number };\r\n\r\n return (\r\n <>\r\n <h1>Create Blog Post</h1>\r\n <Form>\r\n <div className='flex flex-col gap-2 mb-3'>\r\n <Select\r\n name='lang'\r\n pre='Language'\r\n value={configVariables.lang}\r\n options={langsOptions}\r\n onChange={handleConfigChange}\r\n disabled={disableVariables}\r\n />\r\n <Select\r\n name='voice'\r\n pre='Voice'\r\n value={configVariables.voice}\r\n options={voicesOptions}\r\n onChange={handleConfigChange}\r\n disabled={disableVariables}\r\n />\r\n <Select\r\n name='style'\r\n pre='Style'\r\n value={configVariables.style}\r\n options={stylesOptions}\r\n onChange={handleConfigChange}\r\n disabled={disableVariables}\r\n />\r\n <Number\r\n name=\"limit\"\r\n pre=\"Limit\"\r\n value={configVariables.limit}\r\n onChange={handleConfigChange}\r\n disabled={disableVariables}\r\n />\r\n </div>\r\n\r\n {post.title && (\r\n <div className='flex justify-end my-3'>\r\n <ActionButton label='refresh' onClick={() => resetPost('all')} />\r\n </div>\r\n )}\r\n\r\n\r\n <AssistantAI\r\n name='title'\r\n key={refreshKey + '-title'}\r\n promptTopic={getPrompt(promptTopic)}\r\n configVariables={configVariables}\r\n onChange={updatePost('title')}\r\n onReset={() => resetPost('fromTitle')}\r\n >\r\n <TextArea name='title' label='Title' value={post.title} rows={2} />\r\n </AssistantAI>\r\n\r\n {post.title && (\r\n <AssistantAI\r\n key={refreshKey + '-outline'}\r\n name='outline'\r\n initialValue={post.title || ''}\r\n promptTopic={getPrompt('GENERATE_BLOG_POST_OUTLINE')}\r\n configVariables={configVariables}\r\n onChange={updatePost('outline')}\r\n viewMode='carousel'\r\n onReset={() => resetPost('fromOutline')}\r\n >\r\n <TextArea\r\n name='postOutline'\r\n label='Outline'\r\n value={post.outline.map(item => (\r\n item.headline + '\\n' + item.subheadings.join('\\n')\r\n )).join('\\n')}\r\n rows={10}\r\n />\r\n </AssistantAI>\r\n )}\r\n\r\n {post.outline.length > 0 && (\r\n <AssistantAI\r\n key={refreshKey + '-outlines'}\r\n name='sections'\r\n initialValue={post.outline.length > 0 ? formatOutlineForAI(post.outline) : ''}\r\n promptTopic={getPrompt('GENERATE_COMPLETE_BLOG_POST_FROM_OUTLINE')}\r\n configVariables={configVariables}\r\n onChange={updatePost('sections')}\r\n onReset={() => resetPost('fromSections')}\r\n viewMode='carousel'\r\n >\r\n <Tab>\r\n {([\r\n { type: 'intro', label: 'Intro', section: post.sections.intro },\r\n ...post.sections.sections.map((section, index) => ({\r\n type: 'section',\r\n label: `Section ${index + 1}`,\r\n section,\r\n index\r\n })),\r\n { type: 'conclusion', label: 'Conclusion', section: post.sections.conclusion }\r\n ] as SectionItem[]).map((item) => (\r\n <TabItem key={item.label} label={item.label}>\r\n <TextArea\r\n name={`post${item.label}Title`}\r\n label={`${item.label} Title`}\r\n value={item.section.title}\r\n onChange={({value}) =>\r\n item.type === 'section'\r\n ? updateSection(item.index, 'title', value)\r\n : updateSectionContent(item.type, 'title', value)\r\n }\r\n rows={2}\r\n />\r\n <TextArea\r\n name={`post${item.label}`}\r\n label={item.label}\r\n value={item.section.paragraphs.join('\\n')}\r\n onChange={({value}) =>\r\n item.type === 'section'\r\n ? updateSection(item.index, 'paragraphs', value)\r\n : updateSectionContent(item.type, 'paragraphs', value)\r\n }\r\n rows={5}\r\n />\r\n </TabItem>\r\n ))}\r\n </Tab>\r\n </AssistantAI>\r\n )}\r\n\r\n {post.sections.intro.title && (\r\n <AssistantAI\r\n key={refreshKey + '-desc'}\r\n name='description'\r\n initialValue={post.title || ''}\r\n promptTopic={getPrompt('GENERATE_BLOG_POST_DESCRIPTIONS')}\r\n configVariables={configVariables}\r\n onChange={updatePost('description')}\r\n onReset={() => resetPost('fromDescription')}\r\n autoStart={true}\r\n >\r\n <TextArea name='description' label='Description' value={post.description} rows={3} />\r\n </AssistantAI>\r\n )}\r\n\r\n </Form>\r\n\r\n </>\r\n );\r\n}\r\n","import Grid from '../components/widgets/Grid';\nimport React, { useState } from 'react'\nimport BlogPost from './BlogPost'\n\r\ninterface Post {\r\n title: string;\r\n description: string;\r\n outline: string;\r\n sections: {}[];\r\n}\r\n\r\nfunction Blog() {\r\n\r\n const [posts, setPosts] = useState<Post[]>([]);\r\n\r\n const columns = [\r\n { key: 'topic', label: 'topic' },\r\n { key: 'title', label: 'Titolo' },\r\n { key: 'description', label: 'Descrizione' },\r\n { key: 'sections', label: 'N Sezioni' },\r\n ];\r\n\r\n\r\n return (\r\n <>\r\n <h1>Blog</h1>\r\n <Grid\n records={posts}\n recordId=\"title\"\n columns={columns}\n form={<BlogPost data={{ lang: 'Italiano', voice: 'Informative', style: 'Descriptive', limit: '3' }} />}\n />\n </>\n )\n}\n\r\nexport default Blog;\n"],"names":["DateTime","date","d","padToTwoDigits","num","formatDate","format","year","shortYear","month","day","hours","minutes","seconds","hour","minute","second","replacements","match","getDefaultDateFormat","part","getDefaultTimeFormat","getPathValue","obj","path","target","sanitizerCallback","parts","acc","i","key","arr","rest","resultValue","index","value","v","converter","values","pattern","parse","_","Key","Func","pre","func","post","splitter","replacer","defaultFormat","defaultDateFormat","defaultTimeFormat","str","separator","delimiter","last","escaped","regex","camel","char","normalizeKey","locale","seps","regException","sep","split","separators","result","first","length","params","startWith","fill","query","subStr","from","to","preset","motion","components","definition","BUILT_IN_THEME_IDS","ThemeContext","createContext","defaultComponents","MotionRegistryContext","_themeDefault","ThemeControllerContext","BUILT_IN_THEMES","_themeFlat","_themeCyber","deepMerge","source","cloneTheme","theme","isThemeDefinition","config","normalizeThemeProviderConfig","resolveMode","mode","colorKeyToCssVar","m","applyThemeVars","radius","fontSans","fontMono","colors","dark","variables","lightVars","darkVars","el","toDecls","map","k","PLACEHOLDER_IMAGE","PLACEHOLDER_USER","PLACEHOLDER_BRAND","ThemeProvider","children","normalized","useMemo","initialDefinition","initialThemePreset","themeRegistry","setThemeRegistry","useState","activeTheme","setActiveTheme","setMode","setRadius","setFontSans","setFontMono","themeColors","setThemeColors","themeDark","setThemeDark","setTheme","motionRegistry","setMotionRegistry","useEffect","selectedDefinition","selectedPreset","currentDefinition","nextTheme","currentPreset","controller","current","resolvedPreset","primary","h","sans","mono","tokens","c","React","useTheme","_scope","useContext","useMotionRegistry","useThemeController","Wrapper","className","style","onClick","Container","fullClassName","Row","Col","xxl","xl","lg","md","sm","xs","entries","bp","val","cn","inputs","twMerge","clsx","isBadgeDescriptor","normalizeBadgeProps","fallbackType","fallbackClassName","BadgeOverlay","badge","content","type","defaultType","descriptorOnly","Badge","wrapClass","badgeClass","ALIASES","toPascalCase","name","s","LucideIconProvider","LucideIcons","PhosphorIconProvider","weight","cached","Base","PhosphorIcons","resolved","props","IconProviderContext","IconControllerContext","BUILT_IN_ICON_PROVIDERS","DEFAULT_ICON_PROVIDER_ID","isIconProvider","normalizeIconProviderConfig","createAliasedProvider","provider","aliases","IconProvider","providers","setProviders","providerId","setProviderId","activeProvider","providerWithAliases","id","registeredProvider","useIconProvider","useIconController","defaultProvider","Icon","size","overrideProvider","label","contextProvider","Component","Menu","context","Type","badges","headerClass","itemClass","linkClass","iconClass","textClass","arrowClass","submenuClass","menu","useMenu","MenuItem","item","isOpen","setIsOpen","hasChildren","_a","MenuIcon","Link","e","isInteractiveElement","prev","child","idx","NONE_EFFECT","FALLBACK_EFFECT","prefersReducedMotion","resolveReference","reference","registry","fallback","candidate","createMotionTransition","transition","property","resolveMotionEffect","base","effect","mergedTransition","reducedMotion","reduced","useMotionEffect","useMotionState","active","baseStyle","usePressMotion","disabled","pressed","setPressed","useEnterMotion","entered","setEntered","frame","Dropdown","toggleButton","header","footer","defaultOpen","controlledOpen","onOpenChange","alwaysOpen","position","buttonClass","menuClass","footerClass","motionConfig","uncontrolledOpen","setUncontrolledOpen","rootRef","menuId","open","renderToggle","menuMotionStyle","_b","updateOpen","nextOpen","handlePointerDown","event","handleKeyDown","isDropdownToggler","button","Button","DropdownButton","DropdownDivider","display","onToggle","DropdownItem","url","icon","DropdownHeader","DropdownMenu","_GLOBAL_VARS","GlobalContext","getStoredGlobalVars","GlobalProvider","globalVars","setGlobalVarsState","handleStorageChange","updateLocalStorage","updatedVars","setGlobalVars","namespace","removeGlobalVars","useGlobalVars","newVars","getGlobalVars","tenantsConfig","currentConfig","ConfigContext","ConfigUpdateContext","configChangeHandlers","onConfigChange","fn","RuntimeProvider","defaultConfig","tenantsURI","setConfig","initConfig","prevConfigRef","useRef","handler","loadTenants","fetchedTenants","fetchJson","getConfig","decodeJWT","token","payloadEncoded","payloadDecoded","error","copyToClipboard","text","err","trimPath","normalizePath","trimSlash","dirname","segments","sleep","ms","resolve","proxy","generateUniqueId","timestamp","randomStr","eventClosest","tagName","currentElement","parentElement","substrCount","sub","replacePlaceholders","arrPath","placeholderIndex","checkConditions","conds","metaObject","cond","replaceVariables","crc32","crcTable","j","crc","ucfirst","loadScripts","scriptData","scriptFragment","src","clean","attrs","scriptElement","intersectObjects","obj1","obj2","varName","funcName","arrayUnique","array","seen","isEmpty","data","cloneFallback","clone","mapValue","mapKey","entry","prototype","safeClone","base64Encode","input","arraysEqual","a","b","sanitizeKey","exclude","isInteractive","render2Base64","arrayBuffer","bytes","binary","base64ToBlob","base64","byteCharacters","byteNumbers","byteArray","base64ToUrl","blob","getRecordValue","record","cleanRecord","cleaned","smartTypeCast","resolveContentType","options","body","headers","contentType","fetchRest","request","formData","response","accept","getResponse","json","_c","wrongContentType","fetchWithRetry","maxRetries","statusNoRetry","buttonBaseClass","buttonPrimaryClass","buttonSecondaryClass","buttonDangerClass","buttonSuccessClass","buttonWarningClass","buttonInfoClass","buttonLightClass","buttonDarkClass","buttonOutlinePrimaryClass","buttonOutlineSecondaryClass","buttonOutlineDangerClass","buttonOutlineSuccessClass","buttonLinkClass","resolveButtonVariant","variant","LoadingButton","title","showLoader","loadingLabel","loader","setLoader","disable","setDisable","message","setMessageState","setMessage","payload","activeLoadingLabel","ActionButton","BackLink","navigate","useNavigate","GoSite","ReferSite","imageUrl","width","AuthProviderContext","AuthProvider","defaultKey","useAuthProvider","ctx","ext","parentBase","suffix","dir","prefix","currentExt","newExt","paths","inputPath","root","ImageAvatar","height","alt","fit","feedback","imgSrc","setImgSrc","enterRef","hoverRef","_d","hasHover","enterStyle","hovered","setHovered","hoverStyle","cacheKey","storageKey","failedStorageKey","resolvedAlt","failedAt","res","reader","imgStyle","_e","_f","getMissingKeys","keys","createConfigurationState","missingKeys","getProviderConfigurationState","fallbackName","configured","AUTH_REDIRECT_URI","_AUTHS","generateCodeVerifier","dec","generateCodeChallenge","codeVerifier","digest","openAuthWindow","authUrl","windowName","left","top","redirectToAuthPage","authServer","clientID","scopes","refreshParamName","codeChallenge","setAuths","authResponse","Authorize","location","useLocation","code","authChallenge","refreshAccessToken","refresh_token","useAccessToken","renew","auths","auth","isExpired","getAuthSession","clearAccessToken","getAccessToken","isLogoutIntent","intent","AuthButton","aspect","iconLogout","avatarClass","providerLabel","getConfigurationState","configurationState","isConfigured","user","setUser","authenticated","setAuthenticated","avatarOpen","setAvatarOpen","notConfiguredTitle","nextUser","refreshState","runIntent","mergedOptions","displayName","DataProviderContext","DataProvider","useDataProvider","Loader","show","description","Card","showArrow","bodyClass","Modal","ModalDefault","onClose","onSave","onDelete","buttonFullscreen","buttonCancel","titleClass","subTitleClass","closeOnBackdrop","closingRef","closeTimerRef","sizeClass","setSizeClass","dialogSizeClass","sideWidthClass","verticalHeightClass","positions","modalPosition","pos","coverClass","originalOverflow","modalMotionReference","dialogMotion","handleClose","closeDelay","dialogStyle","backdropStyle","coverStyle","showFooter","closeButtonClass","createPortal","ModalYesNo","onYes","onNo","ModalOk","Image","placeholder","srcset","sizes","Brand","logo","logoClass","labelClass","Logo","Breadcrumbs","pathname","breadcrumbs","tokenPath","breadcrumb","Carousel","showIndicators","showControls","showCaption","layoutDark","autoPlay","startSlide","onParseCaption","isHover","setIsHover","bgOverlay","textCaption","Caption","image","Notifications","notify","SearchButton","Search","handleSearch","Alert","isFixed","timeout","iconName","timer","renderAlert","LANGUAGES","LANGUAGE_DEPENDENCIES","THEMES","BACKGROUND_CLASS","isRecordKey","loadPrismLanguage","language","loaded","dependency","Code","showCopy","background","codeRef","themeConfig","codeText","resolvedLanguage","resolvedTheme","resolvedBackground","cancelled","Prism","colorToken","foregroundToken","hsl","alpha","PercentageBar","progress","thickness","showText","fontSize","trackColor","fillColor","textColor","PercentageCircle","normalizedRadius","circumference","strokeDashoffset","startAngle","Percentage","max","min","shape","range","finalClassName","Label","FIREBASE_BUCKET_SCRAPE","consoleLog","args","newConfig","authConfig","getGoogleCredential","googleCredentialToken","GoogleAuthProvider","currentFirebaseConfig","setFirebaseConfigState","getFirebaseConfigurationState","getSafeAuth","getAuth","getUser","reject","unsubscribe","onAuthStateChanged","requestLogin","googleCredential","userCredential","signInWithCredential","additionalUserInfo","getAdditionalUserInfo","getTokenInfo","stsTokenManager","expirationTime","getFirebaseAuthorization","tokenInfo","init","firebaseApp","firebase","SYSTEM_FIELDS","databaseInstance","getDatabase","handleError","action","exception","omitWhereEntry","where","field","_omitted","normalizeCondition","raw","condition","clientCondition","getOrderedRef","ref","buildQueryPlan","order","firstOrder","dbRef","getEntryValue","compareValues","right","matchWhere","op","processRecordObject","restOrder","whereEntries","filtered","orderEntries","buildShallowURL","u","FirebaseDataProvider","toArray","clientWhere","snapshot","processed","chunkSize","purge","onProgress","totalChunks","chunk","done","setRecords","fieldMap","onLoad","fetchData","onValueChange","records","mapKeys","mapped","prop","unsubscribeData","unsubscribeAuth","db","setLog","recordKey","when","componentLayout","Input","onChange","defaultValue","required","updatable","step","handleChange","formWrapClass","useFormContext","useId","handleDrop","useHandleDrop","String","Number","Email","Password","visible","setVisible","Color","Date","Time","Week","Month","Range","Url","Checkbox","valueChecked","toValueString","handleCheckboxChange","nextRawValue","Switch","htmlFor","TextArea","rows","ListGroup","actives","draggable","onDrop","disables","loaders","extractText","node","walk","n","handleDragStart","isActive","isDisable","isLoading","fullItemClass","DEFAULT_ORDER","isDateValue","comparePrimitiveValues","Order","comparison","aValue","bValue","valueToArray","normalizeOption","normalizeLookup","getOptionsDB","isDbOrdered","dbOrder","mappedField","firstDbOrder","dbField","dbDir","getOptions","lookup","effectiveOrder","combined","Select","optionEmpty","dbOptions","database","setLookup","opts","combinedOptions","Autocomplete","creatable","onCreate","valueArray","selectedItems","setSelectedItems","localOpts","setLocalOpts","commitValue","currentValue","inputEl","prevState","updatedItems","handleAutocompleteChange","removeItem","listId","Checklist","checkClass","handleChecklistChange","isDisabled","checklist","COUNTRIES","LANGS","currentCountry","country","currentLang","lang","PROMPT_CLEANUP","PROMPT_NO_REFERENCE","PROMPTS","PROMPTS_ROLE","LABELS","getPromptLangs","getPromptVoices","PROMPT_VOICES","getPromptStyles","PROMPT_STYLES","getPrompt","strategy","setPrompt","prompt","configVariables","userInput","voice","limit","PROMPT_ROLE_DEFAULT","PROMPT_VOICE_DEFAULT","PROMPT_STYLE_DEFAULT","PROMPT_ROLES","Prompt$2","role","CHATGPT_URL","CHATGPT_TEMPERATURE","CHATGPT_MODEL","parseContent","apiLog","aiType","chatChatGPTContinue","prevMessages","countRetry","messages","continueContent","fetchOpenaiApi","roles","PROVIDER_OPENAI","fetchAI","PROVIDER_DEFAULT","PROVIDER_GEMINI","PROVIDER_ANTHROPIC","PROVIDER_MISTRAL","PROVIDER_CONFIG_KEYS","getAIProviderConfigurationState","PROVIDERS","AI","Prompt","promptLabel","promptClass","promptActionClass","onRunPrompt","renderPromptDisabled","PromptEditor","PromptLive","PromptDisabled","caption","defaultValues","runPrompt","ImageUrl","imageValue","useRecordSelection","selectedKeys","legacySelectedKeys","onSelectionChange","getRecordKey","incomingSelectedKeys","isSelectionControlled","internalSelectedKeys","setInternalSelectedKeys","activeSelectedKeys","showSelection","buildSelectionPayload","useCallback","keySet","selectedRecords","updateSelection","nextKeys","nextSelection","clearSelection","selectionState","useStableRecordKey","generatedKeys","keyCounter","_index","existingKey","nextKey","Table","Footer","onReorder","selectionMode","sortable","pagination","activeKey","selectedRowKeys","heightClass","scrollClass","selectedClass","activeClass","setRows","sortableOrder","sortingEnabled","currentOrder","setCurrentOrder","paginationNavEl","setPaginationNavEl","draggedKey","setDraggedKey","dragOverKey","setDragOverKey","dropIndicator","setDropIndicator","activeRowKey","setActiveRowKey","hasWarnedReorderSortConflict","paginationNavRef","singleSelectionGroupName","reorderable","hasSortConfiguration","sortDisabledByReorder","effectiveSortable","getStableRecordKey","firstSortable","column","sortedBody","handleClick","absoluteIndex","rowKey","getFieldComponent","toggleRowSelection","toggleSingleRowSelection","targetRecord","targetIndex","sourceIndex","destinationIndex","indicatorPosition","nextRows","movedRecord","adjustedDestinationIndex","viewportClass","totalColumns","renderDropIndicator","hdr","isSortable","isActiveSort","ariaSort","ArrowDown","ArrowUp","ArrowUpDown","Pagination","pageRecords","pageOffset","isSelected","isDraggedOver","isDragged","isActiveRow","rect","nextPosition","GripVertical","scales","CropImage","forwardRef","img","canvasRef","imgRefs","imageBoundsMap","setImageBoundsMap","useImperativeHandle","canvas","variants","scale","selectedScales","currentImage","bounds","cropData","delta","originalFileName","setSelectedScales","setOriginalFileName","setCropData","dragging","setDragging","resizing","setResizing","dragOffset","setDragOffset","resizeStart","setResizeStart","handleLoad","ratio","maxWidth","maxHeight","calculateCropByScale","cropDataState","crop","newWidth","newHeight","newLeft","newTop","handleResize","prevCropData","newCropData","updatedCrop","handleMouseDown","handleMouseMove","offset","start","minSize","handleMouseUp","ImageEditorItem","getFileUrl","CropBox","fileName","file","FileNameEditor","scaleSuffix","inputValue","fullName","baseName","useFileUpload","files","setFiles","currentFile","setCurrentFile","fileInputRef","updateFile","updates","updatedFiles","f","removeFile","selectedFiles","newFile","existingIndex","percent","FileInput","onUpload","multiple","FileEditor","setFileName","cropRef","handleSave","isUploadable","urlCache","fileKey","UploadDocument","editable","handleUploadChange","handleUpload","handleRemove","handleEdit","UploadImage","previewHeight","previewWidth","hoveredIndex","setHoveredIndex","ScaleBadge","PromptMode","componentFormFields","componentBlock","componentSection","ComponentBlock","method","instance","fields","defaults","buildFormFields","Form","isFieldAdapter","isComponentBlock","isNestedModel","model","setDefaults","subFields","subDefaults","syntheticModel","itemKey","nestedFields","nestedDefaults","cloneContainer","isArrayIndex","normalizeInputValue","rawValue","inputType","createContainer","applyChangeToRecord","nextValue","cursor","finalKey","FormContext","formChange","sourceRecord","nextRecord","nextEvent","caretPosition","newValue","newPosition","setParentName","parentName","lastDot","setFormFieldsName","parentKey","childChildren","newProps","dataStoragePath","setPrimaryKey","handlers","genStoragePath","dbStoragePath","savePath","storagePath","FormData","FormDatabase","setRecord","onFinally","log","showNotice","showBack","isNewRecord","recordRef","notification","setNotification","notice","recordStoragePath","handleFinally","handleDelete","displayComponent","Repeat","onAdd","onRemove","layout","readOnly","renderChildren","renderLayout","canRemove","handleAdd","next","addButton","TabLayouts","TabItem","TabPane","Tab","defaultTab","tabPosition","setActive","items","Children","TabLayout","MAX_COLS","MAX_ITEMS","clamp","extractFieldName","clientXToCol","clientX","rowRect","x","colWidth","uid","findFreeSpot","desiredCol","span","canPlaceAt","end","it","a0","a1","b0","b1","tryMoveItem","itemId","targetCol","others","free","resizeItemToFit","targetSpan","maxSpanFromStart","collides","spanTry","makeRoomByShrinkingNearest","dropCol","needCols","candidates","center","dist","newSpan","insertCol","LayoutBuilder","defaultSpan","heightPx","rowRef","setItems","updater","draggingId","setDraggingId","setNotice","noticeTimerRef","msg","newItems","gridLines","handleDragOverRow","handleDropOnRow","rowEl","fieldName","desiredStart","roomPrev","newItem","handleItemDragStart","handleRowDragOver","col","handleRowDragEnd","handleResizeMouseDown","deltaX","deltaCols","UploadCSV","onDataLoaded","onParseField","normalizeKeys","removeEmptyFields","setError","sanitizeField","handleFile","Papa","results","sanitizedField","handleFileChange","handleDragOver","handleDragLeave","checkForwardRef","applyOnChangeRecursive","formRef","FormEnhancer","extractComponentProps","onEnhance","extractRecursive","nodes","cleanSelectedText","selectedText","getResponseContent","viewMode","section","subs","line","AssistantAI","promptTopic","initialValue","autoStart","onReset","setUserInput","responsesAI","setResponsesAI","selectedResponse","setSelectedResponse","setIsLoading","fetch","handleInput","finalPrompt","handleResponsesAI","outputArray","handleSelectedResponse","cleanedText","selectedElement","lines","useGridDBRecords","resolveGridPathFromUrl","GridDB","recordId","resolvedPath","providerOrder","firstEntry","resolvedSortable","GridCore","sanitizeHashPart","getRecordKeyResolver","formatValue","formatter","buildDisplayRecords","columns","runAction","rowIndex","displayRecord","columnKey","actionKey","defaultHeader","inferColumns","form","firstRecord","normalizeActions","actions","hasForm","isActionVisible","isActionDisabled","getActionLabel","resolveInitialOrder","GridTableView","selection","onClickRow","sourceByKey","displayRecords","normalizedRecords","normalizedKeys","lastKey","reorderedDisplayRecords","meta","reorderedRecords","ImageEditor","modal","onImageLoad","rootEl","imageEditorInst","objStyle","zoom","setZoom","editor","TuiImageEditor","loadImage","handleStartDrawingMode","maxZoom","minZoom","toolButtonClass","Controls","Editor","HeadContext","metadataEntryId","DEFAULT_HEAD_APP_NAME","DEFAULT_DOCUMENT_HEAD","DEFAULT_LANGUAGE_HEAD","normalizeSocialKey","normalizeKeywords","keywords","normalizeOpenGraphKey","createDocumentLinks","document","createPaginationLinks","createLanguageLinks","alternate","createMetaGroups","metadata","social","createHeadLinks","links","createAssetLinks","assets","font","href","createPwaLinks","pwa","createPwaMeta","createSchemaOrgBlocks","schemaOrg","toReactLinkProps","link","toReactScriptProps","script","_inline","toReactStyleLinkProps","HeadPortal","appName","pwaMeta","linkTags","schemaOrgBlocks","httpEquiv","block","HeadProvider","resolvedAppName","defaultLangRef","defaultDirRef","setPageMetadata","metadataEntries","setMetadataEntries","setSocialHead","setHeadLinks","setPaginationHead","setLanguageHead","setDocumentHead","setAssetsHead","setPwaHead","setSchemaOrg","clearPageMetadata","setPageMetadataEntry","nextMetadata","clearPageMetadataEntry","clearSocialHead","clearHeadLinks","clearPaginationHead","clearLanguageHead","clearDocumentHead","clearAssetsHead","clearPwaHead","clearSchemaOrg","activeMetadata","useHeadController","stableKey","useHead","idRef","metadataKey","useSocialHead","socialKey","previousSocial","useHeadLinks","linksKey","previousLinks","usePaginationHead","paginationKey","previousPagination","useLanguageHead","languageKey","previousLanguage","useDocumentHead","documentKey","previousDocumentHead","useAssetsHead","assetsKey","previousAssets","usePwaHead","pwaKey","previousPwa","useSchemaOrgHead","schemaOrgKey","previousSchemaOrg","Head","isExternalLink","isInternalLink","isHashLink","getText","getCodeLanguage","MarkdownCodeBlock","copied","setCopied","copy","createDefaultComponents","onNavigateInternal","MarkdownReader","head","h1Title","effectiveHead","ReactMarkdown","remarkGfm","rehypeSlug","rehypeAutolinkHeadings","rehypeSanitize","TabDynamic","activeIndex","release","setRelease","tabs","component","lastIndex","templateCache","fieldCache","Template","htmlString","fieldBuckets","bucketKey","bucket","html","formFields","tag","factory","reset","fragments","attr","doc","FormTemplate","Compiled","template","FormTemplate2","fieldBucketKey","dataSource","setForm","recordSet","page","navLimit","appendTo","scrollToTopOnChange","scrollBehavior","align","sticky","currentPage","setCurrentPage","pageLimit","totalPages","go","p","disabledPrev","disabledNext","resolvedAlign","alignmentClass","nav","pageNum","Gallery","Header","overlays","gutterSize","rowCols","groupBy","paddingSize","numCols","spacingScale","itemGap","overlayOffset","overlayLaneWidth","itemWidth","galleryRecords","firstSortableKey","activeClasses","row","toggleSelection","getImage","imgElement","renderOverlayContent","renderOverlay","overlayPositionStyles","matchesOverlay","overlay","getOverlayContent","renderItemOverlays","overlayIndex","renderItem","getGroups","groupMap","leftPart","groupKey","groupName","renderedBody","orderedBody","GridGalleryView","useGridActions","routeSync","preparedRecords","sourcePath","onAfterAction","createRecordKey","audit","reactId","normalizedActions","activeAction","setActiveAction","gridHashId","close","removeRecord","closeOnSuccess","saveCurrentAction","nextActionKey","getActionContext","runModalAction","getModalActionContext","hash","decodedRecordKey","activeActionConfig","activeActionBody","actionContext","modalContext","formNode","success","recordToSave","useGridColumns","useGridPreparedRecords","transformRecords","setPreparedRecords","loading","setLoading","useGridSelection","defaultSelectedKeys","internalSelectedRecords","setInternalSelectedRecords","activeSelectionKeys","handleSelectionChange","buildActionTitle","preparedRecordsLoading","inferredColumns","canOpenEditFromRow","handleRowClick","rowClickHandler","actionButton","headerActionKeys","headerContext","footerContext","resolvedHeader","resolvedFooter","activeModalContext","activeModalHeader","activeModalFooter","initialSort","GridArray","Grid","Users","NotFound","StorageProviderContext","StorageProvider","useStorageProvider","mapRecordObjectToArray","MockDataProvider","initialData","collection","dispatch","rawPath","collPath","matchedCollection","cb","loadGoogleIdentityScript","stored","profile","credential","credentialDecoded","firebaseAuth","firebaseCredential","FirebaseGoogleAuthProvider","firebaseSignOut","callback","firebaseUser","storedUser","scope","tokenKey","expiresKey","accessToken","expiresAt","gclient","tokenResponse","EmailProviderContext","EmailProvider","useEmailProvider","storageInstance","getStorage","FirebaseStorageProvider","storageRef","DROPBOX_AUTH_SERVER","DropboxAuthProvider","session","googleGetAccessToken","sendEmail","bcc","subject","recipients","email","base64EncodedEmail","Buffer","GmailEmailProvider","gmailSend","warn","SupabaseDataProvider","_options","table","r","poll","interval","count","SupabaseStorageProvider","FIREBASE_MANIFEST","GOOGLE_MANIFEST","DROPBOX_MANIFEST","cfg","SUPABASE_MANIFEST","MOCK_MANIFEST","PROVIDER_MANIFESTS","addCustomProviders","custom","selectDefaultKey","preferred","resolveProviderRegistries","storage","registries","providerKey","manifest","driverName","descriptor","svc","MaybeEmailProvider","setStaticMenu","getStaticMenu","App","importPage","LayoutDefault","aiConfig","scrapeConfig","proxyURI","menuConfig","iconProvider","themeProvider","providerRegistries","dataRegistry","storageRegistry","authRegistry","emailRegistry","LayoutEmpty","FallbackPage","pageSource","getRoute","convert","PageComponent","mod","LayoutComponent","Route","Suspense","renderRoutes","menuObject","BrowserRouter","Routes","menuItems","markActive","DEFAULT_GEO_TARGET","DEFAULT_LANGUAGE","GEO_TARGETS","LANGUAGE_TARGETS","getGeoTargetConstant","getLanguageConstant","getKeywordIdeas","keyword","googleAdsAccountId","geoCode","languageCode","geoTarget","getGoogleTrendsData","geo","timeRange","exploreUrl","widgetText","timelineWidget","w","req","timelineUrl","timelineText","timeline","getGoogleTrendsRelated","relatedWidget","relatedUrl","relatedText","relatedData","rising","DROPBOX_CHECK_DELAY","DROPBPX_URL","fetchDropboxBlob","ACCESS_TOKEN","fetchDropbox","resolvePath","includeHost","rootPath","search","jobPath","startPath","removeExtension","dropBox","dropBoxPath","pathInfo","onCompleted","check","inProgress","createFolders","basePath","apiPath","deleteBulk","addTag","addTags","listFolders","recursive","fetchFolders","folders","startCopy","checkJobStatus","asyncJobId","copyResponse","jobStatus","move","startMove","getThumbnails","thumbnailsRequest","setThumbnails","PLACEHOLDER_THUMBNAIL","fetchPromise","batch","thumbnails","b64toBlob","b64Data","sliceSize","byteArrays","slice","upload","fileBase64","base64Data","useDropBoxConnect","DropBoxConnectButton","isAuth","cache","callLabel","callKey","callBasePath","callService","callFunc","callOptions","caller","storePaths","callPath","SERPAPI_ENDPOINT","ENGINE_GOOGLE","ENGINE_GOOGLE_IMAGES","ENGINE_GOOGLE_AUTOCOMPLETE","ENGINE_GOOGLE_TRENDS","ENGINE_GOOGLE_MAPS","ENGINE_GOOGLE_MAPS_PHOTOS","ENGINE_GOOGLE_MAPS_REVIEWS","SEARCH_QUERY","nameCountry","codeCountry","codeLang","SERPAPI_PARAMS","GEOGRAPHIC_LOCATION","GEOGRAPHIC_LOCATION2","LOCALIZATION","ADVANCED","MAPS_DETAILS","SEARCH_BY_ENGINE","removeNullProperties","newObj","API_KEY_INDEX","getSerpApikey","apis","fetchSerpApi","engine","getRequest","apiKey","callSerpApi","fetchScrape","seo","NORMALIZE_MAP","defaultRules","defaultMatches","NORMALIZE_REGEX","normalizeVisualChars","Sanitizer","matches","ruleName","autoCast","rule","exclusions","lowerResult","term","replace","mask","arg","output","use","insertSuffix","qIdx","dot","buildSrcsetString","buildImageParams","styleParts","imageParamsToTag","useImage","Helper","showModal","setShowModal","showAlert","setShowAlert","scrollRef","initialSection","initialPost","BlogPost","langsOptions","voicesOptions","stylesOptions","refreshKey","setRefreshKey","setPost","setConfigVariables","disableVariables","setDisabledVariables","handleConfigChange","updatePost","updateSectionContent","updateSection","resetPost","formatOutlineForAI","outline","Blog","posts","setPosts"],"mappings":"w/CAeA,SAASA,GAASC,EAA8C,CAC5D,MAAMC,EAAI,IAAI,KAAK,OAAOD,GAAS,UAAY,QAAQ,KAAK,OAAOA,CAAI,CAAC,EAAI,OAAOA,CAAI,EAAIA,CAAI,EAC/F,GAAI,MAAMC,EAAE,QAAA,CAAS,EACjB,MAAO,CACH,KAAM,GACN,UAAW,GACX,MAAO,GACP,IAAK,GACL,MAAO,GACP,QAAS,GACT,QAAS,GACT,KAAM,GACN,OAAQ,GACR,OAAQ,EAAA,EAIhB,MAAMC,EAAkBC,GAAwBA,EAAI,WAAW,SAAS,EAAG,GAAG,EAE9E,MAAO,CACH,KAAMF,EAAE,YAAA,EAAc,SAAA,EACtB,UAAWA,EAAE,YAAA,EAAc,SAAA,EAAW,MAAM,EAAE,EAC9C,MAAOC,EAAeD,EAAE,SAAA,EAAa,CAAC,EACtC,IAAKC,EAAeD,EAAE,SAAS,EAC/B,MAAOC,EAAeD,EAAE,UAAU,EAClC,QAASC,EAAeD,EAAE,YAAY,EACtC,QAASC,EAAeD,EAAE,YAAY,EACtC,KAAMA,EAAE,SAAA,EAAW,SAAA,EACnB,OAAQA,EAAE,WAAA,EAAa,SAAA,EACvB,OAAQA,EAAE,WAAA,EAAa,SAAA,CAAS,CAExC,CAEA,SAASG,GAAWJ,EAA8BK,EAAwB,CACtE,KAAM,CACF,KAAAC,EAAM,UAAAC,EAAW,MAAAC,EAAO,IAAAC,EAAK,MAAAC,EAAO,QAAAC,EAAS,QAAAC,EAAS,KAAAC,EAAM,OAAAC,EAAQ,OAAAC,CAAA,EACpEhB,GAASC,CAAI,EAEXgB,EAAuC,CACzC,KAAQV,EACR,GAAMC,EACN,GAAMC,EACN,GAAMC,EACN,GAAMC,EACN,GAAMC,EACN,GAAMC,EACN,EAAKC,EACL,EAAKC,EACL,EAAKC,CAAA,EAGT,OAAOV,EAAO,QAAQ,mCAA0CW,EAAaC,CAAK,GAAKA,CAAK,CAChG,CAEA,SAASC,IAA+B,CACpC,MAAMlB,MAAW,KAKjB,OAJkB,IAAI,KAAK,eAAe,OAAW,CACjD,KAAM,UAAW,MAAO,UAAW,IAAK,SAAA,CAC3C,EACuB,cAAcA,CAAI,EAC7B,IAAImB,GAAQ,CACrB,OAAQA,EAAK,KAAA,CACT,IAAK,OAAQ,MAAO,OACpB,IAAK,QAAS,MAAO,KACrB,IAAK,MAAO,MAAO,KACnB,QAAS,OAAOA,EAAK,KAAA,CAE7B,CAAC,EAAE,KAAK,EAAE,CACd,CAEA,SAASC,IAA+B,CACpC,MAAMpB,MAAW,KAKjB,OAJkB,IAAI,KAAK,eAAe,OAAW,CACjD,KAAM,UAAW,OAAQ,UAAW,OAAQ,UAAW,OAAQ,EAAA,CAClE,EACuB,cAAcA,CAAI,EAC7B,IAAImB,GAAQ,CACrB,OAAQA,EAAK,KAAA,CACT,IAAK,OAAQ,MAAO,KACpB,IAAK,SAAU,MAAO,KACtB,IAAK,SAAU,MAAO,KACtB,QAAS,OAAOA,EAAK,KAAA,CAE7B,CAAC,EAAE,KAAK,EAAE,CACd,CA0CA,MAAME,GAA6B,CAACC,EAAKC,EAAMC,EAAQC,IAAsB,CACzE,GAAI,CAACH,GAAO,CAACC,EAAM,MAAO,GAE1B,MAAMG,EAAQH,EAAK,MAAM,GAAG,EAC5B,IAAII,EAAWL,EAEf,QAASM,EAAI,EAAGA,EAAIF,EAAM,OAAQE,IAAK,CACrC,MAAMT,EAAOO,EAAME,CAAC,EAEpB,GAAID,GAAO,KAAM,MAAO,GAGxB,GAAIR,EAAK,SAAS,IAAI,EAAG,CACvB,MAAMU,EAAMV,EAAK,MAAM,EAAG,EAAE,EACtBW,EAAMH,GAAA,YAAAA,EAAME,GAClB,GAAI,CAAC,MAAM,QAAQC,CAAG,EAAG,MAAO,GAEhC,MAAMC,EAAOL,EAAM,MAAME,EAAI,CAAC,EAAE,KAAK,GAAG,EACxC,GAAI,CAACG,EACD,OAAGP,GACCA,EAAO,MAAQA,EAAO,MAAMA,EAAO,GAAG,EAAIM,KAASN,EAAO,MAAQM,GAC3D,IAEJA,EAGX,MAAME,GAAcR,GAAA,YAAAA,EAAQ,QAAS,CAAA,EACrC,UAAUS,KAASH,EAAK,CACpB,MAAMI,GAAS,IAAM,CACjB,MAAMC,EAAId,GAAaS,EAAIG,CAAK,EAAGF,CAAI,EACvC,OAAON,GAAA,YAAAA,EAAoBU,KAAMA,CACrC,GAAA,EAEIX,IACG,CAACA,EAAO,WAAaU,IAAU,MAC9BF,EAAYC,CAAK,EAAIT,EAAO,IAC1B,CAAE,IAAIQ,GAAA,YAAAA,EAAcC,KAAU,CAAA,EAAK,CAACT,EAAO,GAAG,EAAGU,GACjDA,EAGd,CACA,OAAOV,EAAS,GAAKQ,CACvB,CAEAL,EAAMA,EAAIR,CAAI,CAChB,CAGA,OADAQ,GAAMF,GAAA,YAAAA,EAAoBE,KAAQA,EAC9BH,IAAW,CAACA,EAAO,WAAaG,IAAQ,KACxCH,EAAO,MAAQA,EAAO,MAAMA,EAAO,GAAG,EAAIG,KAASH,EAAO,MAAQG,GAC3D,IAGJA,CACX,EAEaS,GAAuB,CAChC,MAAO,CAACC,EAAQC,EAASd,EAAS,OAAWC,EAAoB,SAAc,CAC3E,GAAI,OAAOa,GAAY,SAAU,OAAOA,EACxC,MAAMC,EAAQD,EAAQ,QAAQ,0CAA2C,CAACE,EAAGC,EAAKC,EAAMrC,IAAW,CAC/F,KAAM,CAACsC,EAAKd,CAAG,GAAMY,GAAO,IAAI,QAAQ,GAAG,IAAM,GAAK,CAAC,GAAIA,CAAG,EAAIA,EAAI,MAAM,IAAK,CAAC,EAC5E,CAACG,EAAMC,CAAI,GAAMH,GAAQ,IAAI,QAAQ,GAAG,IAAM,GAAK,CAACA,EAAM,EAAE,EAAIA,EAAK,MAAM,IAAK,CAAC,EAEjFR,EAAQb,GAAagB,EAAQR,EAAKL,EAAQC,CAAiB,EACjE,MAAI,EAACW,IAAA,MAAAA,GAAYQ,KAAS,CAACV,EAChBA,GAAS,GAGbS,EAAMP,GAAUQ,CAAI,EAAEV,EAAO7B,CAAM,EAAIwC,CAClD,CAAC,EAED,OAAOC,GAASC,GAASR,CAAK,CAAC,CACnC,EACA,OAAQ,CAACvC,EAAMK,EAAS,SAAc,CAClC,MAAM2C,EAAgB9B,GAAA,EACtB,OAAIb,IAAW,MACJD,GAAWJ,EAAM,YAAY,EAEjCI,GAAWJ,EAAMK,GAAU2C,CAAa,CACnD,EACA,OAAQ,CAAChD,EAAMK,EAAS,SAAc,CAClC,MAAM2C,EAAgB5B,GAAA,EACtB,OAAIf,IAAW,MACJD,GAAWJ,EAAM,UAAU,EAE/BI,GAAWJ,EAAMK,GAAU2C,CAAa,CACnD,EACA,WAAY,CAAChD,EAAMK,EAAS,SAAc,CACtC,MAAM4C,EAAoB/B,GAAA,EACpBgC,EAAoB9B,GAAA,EACpB4B,EAAgB,GAAGC,CAAiB,IAAIC,CAAiB,GAC/D,OAAI7C,IAAW,MACJD,GAAWJ,EAAM,qBAAqB,EAE1CI,GAAWJ,EAAMK,GAAU2C,CAAa,CACnD,EACA,QAAS,CAACG,EAAKC,EAAY,GAAIC,EAAY,CAAC,IAAK,IAAK,GAAG,IAAM,CAC3D,MAAM3B,EAAQyB,EAAI,MAAM,GAAG,EACrBG,EAAO5B,EAAM,IAAA,GAAS,GACtB6B,EAAUF,EAAU,IAAIpD,GAAK,KAAOA,CAAC,EAAE,KAAK,EAAE,EAC9CuD,EAAQ,IAAI,OAAO,OAAOD,CAAO,WAAY,GAAG,EAChDE,EAAQH,EAAK,YAAA,EAAc,QAAQE,EAAO,CAAChB,EAAGkB,IAASN,EAAYM,EAAK,YAAA,CAAa,EAC3F,MAAO,CAAC,GAAGhC,EAAO+B,CAAK,EAAE,KAAK,GAAG,CACrC,EACA,QAAUN,GAAQA,EAAI,YAAA,EACtB,QAAUA,GAAQA,EAAI,YAAA,EACtB,OAASA,GAAQQ,GAAaR,CAAG,EACjC,eAAgB,CAAChD,EAAsByD,EAAS,UAAU,WAC/C,IAAI,KAAK,aAAaA,CAAM,EAAE,OAAO,OAAOzD,CAAG,CAAC,EAE3D,UAAW,CAACgD,EAAKU,EAAMC,EAAe,SAAc,CAChD,MAAMhB,EAAYiB,GAAyC,CACvD,MAAMC,EAAQb,EAAI,MAAMY,CAAG,EAC3B,GAAIC,EAAM,QAAU,EAAG,OAAO,KAC9B,IAAIV,EAAOU,EAAM,IAAA,GAAS,GAC1B,KAAOA,EAAM,SAAUF,GAAA,MAAAA,EAAc,KAAKE,EAAMA,EAAM,OAAS,CAAC,KAC5DV,EAAOU,EAAM,IAAA,EAAQD,EAAMT,EAE/B,MAAO,CAACU,EAAM,KAAKD,CAAG,EAAGT,CAAI,CACjC,EACMW,EAAuB,OAAOJ,GAAS,SAAW,CAACA,CAAI,EAAI,MAAM,QAAQA,CAAI,EAAIA,EAAO,CAAA,EAC9F,UAAWE,KAAOE,EAAY,CAC1B,MAAMC,EAASpB,EAASiB,CAAG,EAC3B,GAAIG,EAAQ,OAAOA,CACvB,CACA,MAAO,CAACf,EAAK,EAAE,CACnB,EACA,WAAY,CAACA,EAAKU,EAAMC,EAAe,SAAc,CACjD,MAAMhB,EAAYiB,GAAyC,CACvD,MAAMC,EAAQb,EAAI,MAAMY,CAAG,EAC3B,GAAIC,EAAM,QAAU,EAAG,OAAO,KAC9B,IAAIG,EAAQH,EAAM,MAAA,GAAW,GAC7B,KAAOA,EAAM,SAAUF,GAAA,MAAAA,EAAc,KAAKE,EAAM,CAAC,KAC7CG,GAASJ,EAAMC,EAAM,MAAA,EAEzB,MAAO,CAACG,EAAOH,EAAM,KAAKD,CAAG,CAAC,CAClC,EACME,EAAuB,OAAOJ,GAAS,SAAW,CAACA,CAAI,EAAI,MAAM,QAAQA,CAAI,EAAIA,EAAO,CAAA,EAC9F,UAAWE,KAAOE,EAAY,CAC1B,MAAMC,EAASpB,EAASiB,CAAG,EAC3B,GAAIG,EAAQ,OAAOA,CACvB,CACA,MAAO,CAACf,EAAK,EAAE,CACnB,EACA,QAAS,CAACA,EAAKiB,EAAQV,EAAO,IAAKF,EAAQ,SACnCA,EACOL,EAAI,QAAQK,EAAOvC,GAASA,EAAM,SAASmD,EAAQV,CAAI,CAAC,EAE5DP,EAAI,SAASiB,EAAQV,CAAI,EAEpC,SAAU,CAACP,EAAKiB,EAAQV,EAAO,IAAKF,EAAQ,SACpCA,EACOL,EAAI,QAAQK,EAAOvC,GAASA,EAAM,OAAOmD,EAAQV,CAAI,CAAC,EAE1DP,EAAI,OAAOiB,EAAQV,CAAI,EAElC,cAAe,CAACW,EAAQC,EAAY,IAAKC,EAAO,SAAc,CAC1D,MAAMC,EAAQ,OAAO,KAAKH,CAAM,EAChC,OAAQG,EAAM,OAAS,EAAIF,EAAY,IAAME,EAAM,IAAI3C,GAC5C,GAAG,mBAAmBA,CAAG,CAAC,IAAI,mBAAmB0C,IAAS,OAC3DF,EAAOxC,CAAG,EACV0C,CAAI,CAAC,EACd,EAAE,KAAK,GAAG,CACf,EACA,WAAY,CAACjD,EAAKY,EAAQ,OAAS,CAC/B,MAAMgC,EAA8B,CAAA,EACpC,UAAWrC,KAAOP,EACd4C,EAAOrC,CAAG,EAAIK,EAElB,OAAOgC,CACX,EACA,eAAgB,CAACf,EAAKsB,IACdA,IAAW,GAAW,EACnBtB,EAAI,MAAMsB,CAAM,EAAE,OAAS,EAEtC,SAAU,CAACtB,EAAKiB,EAAS,MACdjB,EAAI,OAASiB,EAASjB,EAAI,UAAU,EAAGiB,CAAM,EAAIjB,CAEhE,EAEA,SAASJ,GAAST,EAAiB,CAC/B,OAAOA,EAAQ,QAAQ,uCAAwC,CAACE,EAAGX,EAAK6C,EAAMC,IACnE9C,EAAI,WAAW6C,EAAMC,CAAE,CACjC,CACL,CAEA,SAAS7B,GAASR,EAAiB,CAC/B,OAAOA,EAAQ,QAAQ,qCAAsC,CAACE,EAAGX,EAAKkC,EAAK9B,EAAQ,IACxEJ,EAAI,MAAMkC,CAAG,EAAE9B,CAAK,CAC9B,CACL,CCxUO,MAAM2C,GAA4B,CACrC,KAAM,QACN,OAAQ,GACR,OAAQ,CACJ,WAAsB,YACtB,WAAsB,iBACtB,KAAsB,YACtB,eAAsB,iBACtB,QAAsB,YACtB,kBAAsB,iBACtB,QAAsB,oBACtB,kBAAsB,cACtB,UAAsB,gBACtB,oBAAsB,oBACtB,MAAsB,gBACtB,gBAAsB,oBACtB,OAAsB,gBACtB,iBAAsB,oBACtB,YAAsB,gBACtB,sBAAsB,cACtB,QAAsB,oBACtB,kBAAsB,YACtB,QAAsB,mBACtB,kBAAsB,YACtB,KAAsB,oBACtB,eAAsB,YACtB,OAAsB,oBACtB,MAAsB,oBACtB,KAAsB,mBAAA,EAE1B,KAAM,CACF,WAAsB,iBACtB,WAAsB,cACtB,KAAsB,iBACtB,eAAsB,cACtB,QAAsB,iBACtB,kBAAsB,cACtB,QAAsB,oBACtB,kBAAsB,oBACtB,UAAsB,oBACtB,oBAAsB,cACtB,MAAsB,oBACtB,gBAAsB,kBACtB,OAAsB,oBACtB,iBAAsB,cACtB,YAAsB,gBACtB,sBAAsB,cACtB,QAAsB,oBACtB,kBAAsB,YACtB,QAAsB,iBACtB,kBAAsB,YACtB,KAAsB,kBACtB,eAAsB,YACtB,OAAsB,oBACtB,MAAsB,oBACtB,KAAsB,iBAAA,CAE9B,EAEaC,GAAyB,CAClC,KAAM,CACF,KAAM,CAAA,EACN,GAAI,CAAA,EACJ,WAAY,CAAE,SAAU,EAAG,OAAQ,SAAU,WAAY,CAAC,UAAW,YAAa,YAAY,CAAA,EAC9F,cAAe,QAAA,EAEnB,KAAM,CACF,KAAM,CAAE,QAAS,CAAA,EACjB,GAAI,CAAE,QAAS,CAAA,EACf,WAAY,CAAE,SAAU,IAAK,OAAQ,6BAA8B,WAAY,CAAC,SAAS,CAAA,EACzF,cAAe,cAAA,EAEnB,OAAQ,CACJ,KAAM,CAAE,QAAS,EAAG,UAAW,iBAAA,EAC/B,GAAI,CAAE,QAAS,EAAG,UAAW,eAAA,EAC7B,WAAY,CAAE,SAAU,IAAK,OAAQ,6BAA8B,WAAY,CAAC,UAAW,WAAW,CAAA,EACtG,cAAe,cAAA,EAEnB,SAAU,CACN,KAAM,CAAE,QAAS,EAAG,UAAW,kBAAA,EAC/B,GAAI,CAAE,QAAS,EAAG,UAAW,eAAA,EAC7B,WAAY,CAAE,SAAU,IAAK,OAAQ,6BAA8B,WAAY,CAAC,UAAW,YAAa,YAAY,CAAA,EACpH,cAAe,cAAA,EAEnB,eAAgB,CACZ,KAAM,CAAE,QAAS,EAAG,UAAW,kBAAA,EAC/B,GAAI,CAAE,QAAS,EAAG,UAAW,eAAA,EAC7B,WAAY,CAAE,SAAU,IAAK,OAAQ,gCAAiC,WAAY,CAAC,UAAW,WAAW,CAAA,EACzG,cAAe,cAAA,EAEnB,cAAe,CACX,KAAM,CAAE,QAAS,EAAG,UAAW,mBAAA,EAC/B,GAAI,CAAE,QAAS,EAAG,UAAW,eAAA,EAC7B,WAAY,CAAE,SAAU,IAAK,OAAQ,gCAAiC,WAAY,CAAC,UAAW,WAAW,CAAA,EACzG,cAAe,cAAA,EAEnB,aAAc,CACV,KAAM,CAAE,QAAS,EAAG,UAAW,mBAAA,EAC/B,GAAI,CAAE,QAAS,EAAG,UAAW,eAAA,EAC7B,WAAY,CAAE,SAAU,IAAK,OAAQ,gCAAiC,WAAY,CAAC,UAAW,WAAW,CAAA,EACzG,cAAe,cAAA,EAEnB,gBAAiB,CACb,KAAM,CAAE,QAAS,EAAG,UAAW,kBAAA,EAC/B,GAAI,CAAE,QAAS,EAAG,UAAW,eAAA,EAC7B,WAAY,CAAE,SAAU,IAAK,OAAQ,gCAAiC,WAAY,CAAC,UAAW,WAAW,CAAA,EACzG,cAAe,cAAA,EAEnB,MAAO,CACH,KAAM,CAAA,EACN,GAAI,CAAE,UAAW,aAAA,EACjB,WAAY,CAAE,SAAU,IAAK,OAAQ,6BAA8B,WAAY,CAAC,YAAa,YAAY,CAAA,EACzG,cAAe,cAAA,EAEnB,UAAW,CACP,KAAM,CAAE,UAAW,UAAA,EACnB,GAAI,CAAE,UAAW,aAAA,EACjB,WAAY,CAAE,SAAU,IAAK,OAAQ,6BAA8B,WAAY,CAAC,WAAW,CAAA,EAC3F,cAAe,cAAA,CAEvB,EAEaC,GAAoB,CAC7B,KAAM,CACF,KAAM,CACF,UAAW,GACX,UAAW,GACX,YAAa,uBACb,UAAW,MACX,YAAa,GACb,UAAW,GACX,WAAY,EAAA,EAEhB,MAAO,CACH,UAAW,GACX,UAAW,gBACX,YAAa,GACb,UAAW,GACX,YAAa,GACb,YAAa,wBACb,cAAe,YAAA,EAEnB,QAAS,CACL,UAAW,GACX,UAAW,GACX,YAAa,GACb,YAAa,GACb,UAAW,GACX,YAAa,GACb,cAAe,gBACf,WAAY,EACZ,QAAS,CAAA,EAEb,MAAO,CACH,KAAM,OACN,KAAM,KACN,SAAU,SACV,UAAW,GACX,UAAW,GACX,YAAa,GACb,WAAY,GACZ,cAAe,6BACf,UAAW,GACX,YAAa,GACb,WAAY,aACZ,aAAc,kBACd,OAAQ,CACJ,OAAQ,OACR,IAAK,eACL,KAAM,gBACN,MAAO,iBACP,OAAQ,kBACR,SAAU,MAAA,CACd,EAEJ,KAAM,CACF,UAAW,WACX,WAAY,WACZ,UAAW,UAAA,CACf,EAEJ,MAAO,CACH,UAAW,kBACX,UAAW,gBACX,YAAa,GACb,UAAW,GACX,YAAa,GACb,YAAa,wBACb,cAAe,YAAA,EAEnB,QAAS,CACL,UAAW,GACX,UAAW,GACX,YAAa,GACb,YAAa,GACb,UAAW,GACX,YAAa,GACb,cAAe,gBACf,WAAY,EACZ,QAAS,CAAA,EAEb,WAAY,CACR,UAAW,GACX,UAAW,GACX,YAAa,oBACb,YAAa,GACb,eAAgB,OAChB,SAAU,EACV,OAAQ,GACR,MAAO,KAAA,EAEX,SAAU,CACN,eAAgB,GAChB,aAAc,GACd,YAAa,GACb,WAAY,GACZ,SAAU,EAAA,EAEd,KAAM,CACF,UAAW,GACX,UAAW,GACX,YAAa,kDACb,UAAW,gBACX,YAAa,GACb,WAAY,GACZ,UAAW,EAAA,EAEf,OAAQ,CACJ,UAAW,GACX,UAAW,GACX,KAAM,gBACN,MAAO,YACP,YAAa,EAAA,EAEjB,aAAc,CACV,UAAW,cACX,WAAY,0DACZ,OAAQ,CACJ,MAAO,OAAA,CACX,EAEJ,cAAe,CACX,UAAW,cACX,WAAY,0DACZ,OAAQ,CACJ,MAAO,OAAA,CACX,EAEJ,WAAY,CACR,UAAW,uBAAA,EAEf,MAAO,CACH,UAAW,EAAA,EAEf,MAAO,CACH,UAAW,EAAA,EAEf,MAAO,CACH,KAAM,KACN,SAAU,SACV,UAAW,GACX,UAAW,GACX,YAAa,GACb,WAAY,GACZ,cAAe,6BACf,UAAW,GACX,YAAa,GACb,WAAY,aACZ,aAAc,kBACd,OAAQ,CACJ,OAAQ,OACR,IAAK,eACL,KAAM,gBACN,MAAO,iBACP,OAAQ,kBACR,SAAU,MAAA,CACd,EAEJ,SAAU,CACN,UAAW,GACX,UAAW,GACX,YAAa,0BACb,WAAY,GACZ,UAAW,GACX,gBAAiB,GACjB,cAAe,GACf,iBAAkB,GAClB,YAAa,GACb,YAAa,GACb,KAAM,CACF,UAAW,GACX,UAAW,oBACX,YAAa,GACb,UAAW,GACX,UAAW,yEACX,UAAW,wBACX,UAAW,GACX,WAAY,GACZ,WAAY,GACZ,aAAc,EAAA,EAElB,OAAQ,CACJ,KAAM,WACN,MAAO,WACP,MAAO,OAAA,CACX,EAEJ,cAAe,CACX,UAAW,YACX,SAAU,CACN,UAAW,GACX,YAAa,eACb,UAAW,2BAAA,CACf,EAEJ,OAAQ,CACJ,UAAW,GACX,UAAW,EAAA,EAEf,aAAc,CACV,UAAW,GACX,UAAW,EAAA,EAEf,KAAM,CACF,UAAW,GACX,gBAAiB,sBACjB,kBAAmB,qBACnB,gBAAiB,WACjB,KAAM,CACF,YAAa,GACb,UAAW,GACX,YAAa,YAAA,EAEjB,KAAM,CACF,UAAW,WACX,WAAY,WACZ,gBAAiB,eACjB,WAAY,QACZ,aAAc,UACd,WAAY,WACZ,qBAAsB,+CAAA,CAC1B,EAEJ,KAAM,CACF,UAAW,2BACX,UAAW,8BACX,YAAa,GACb,UAAW,WACX,UAAW,WACX,UAAW,OACX,UAAW,cACX,WAAY,OACZ,WAAY,GACZ,aAAc,mBAAA,EAElB,MAAO,CACH,UAAW,GACX,UAAW,QACX,UAAW,eACX,WAAY,aAAA,EAEhB,OAAQ,CACJ,UAAW,oBACX,YAAa,0BAAA,EAEjB,MAAO,CACH,UAAW,GACX,UAAW,GACX,OAAQ,CACJ,MAAO,OACP,MAAO,EAAA,CACX,EAEJ,YAAa,CACT,UAAW,GACX,UAAW,GACX,OAAQ,CAAE,MAAO,OAAQ,MAAO,EAAA,CAAM,EAE1C,WAAY,CACR,UAAW,GACX,UAAW,EAAA,EAEf,IAAK,CACD,UAAW,GACX,UAAW,GACX,OAAQ,CACJ,MAAO,QAAA,CACX,EAEJ,KAAM,CACF,UAAW,GACX,UAAW,EAAA,EAEf,OAAQ,CACJ,UAAW,GACX,UAAW,EAAA,CAEnB,EAEMC,GAA8B,CAAA,OAAEH,UAAQC,GAAA,WAAQC,EAAA,EC/YzCF,GAA4B,CACrC,KAAM,QACN,OAAQ,KACR,OAAQ,CACJ,WAAsB,WACtB,WAAsB,cACtB,KAAsB,YACtB,eAAsB,cACtB,QAAsB,YACtB,kBAAsB,cACtB,QAAsB,cACtB,kBAAsB,cACtB,UAAsB,cACtB,oBAAsB,cACtB,MAAsB,cACtB,gBAAsB,cACtB,OAAsB,cACtB,iBAAsB,cACtB,YAAsB,YACtB,sBAAsB,YACtB,QAAsB,oBACtB,kBAAsB,YACtB,QAAsB,mBACtB,kBAAsB,YACtB,KAAsB,oBACtB,eAAsB,YACtB,OAAsB,cACtB,MAAsB,cACtB,KAAsB,aAAA,EAE1B,KAAM,CACF,WAAsB,cACtB,WAAsB,cACtB,KAAsB,cACtB,eAAsB,cACtB,QAAsB,cACtB,kBAAsB,cACtB,QAAsB,cACtB,kBAAsB,YACtB,UAAsB,cACtB,oBAAsB,cACtB,MAAsB,cACtB,gBAAsB,cACtB,OAAsB,cACtB,iBAAsB,cACtB,YAAsB,YACtB,sBAAsB,YACtB,QAAsB,oBACtB,kBAAsB,YACtB,QAAsB,iBACtB,kBAAsB,YACtB,KAAsB,kBACtB,eAAsB,YACtB,OAAsB,cACtB,MAAsB,cACtB,KAAsB,aAAA,CAE9B,EAEaC,GAAyB,CAClC,KAAM,CACF,KAAM,CAAA,EACN,GAAI,CAAA,EACJ,WAAY,CAAE,SAAU,EAAG,OAAQ,SAAU,WAAY,CAAC,UAAW,YAAa,YAAY,CAAA,EAC9F,cAAe,QAAA,EAEnB,KAAM,CACF,KAAM,CAAE,QAAS,CAAA,EACjB,GAAI,CAAE,QAAS,CAAA,EACf,WAAY,CAAE,SAAU,IAAK,OAAQ,6BAA8B,WAAY,CAAC,SAAS,CAAA,EACzF,cAAe,cAAA,EAEnB,OAAQ,CACJ,KAAM,CAAE,QAAS,EAAG,UAAW,iBAAA,EAC/B,GAAI,CAAE,QAAS,EAAG,UAAW,eAAA,EAC7B,WAAY,CAAE,SAAU,IAAK,OAAQ,6BAA8B,WAAY,CAAC,UAAW,WAAW,CAAA,EACtG,cAAe,cAAA,EAEnB,SAAU,CACN,KAAM,CAAE,QAAS,EAAG,UAAW,kBAAA,EAC/B,GAAI,CAAE,QAAS,EAAG,UAAW,eAAA,EAC7B,WAAY,CAAE,SAAU,IAAK,OAAQ,6BAA8B,WAAY,CAAC,UAAW,YAAa,YAAY,CAAA,EACpH,cAAe,cAAA,EAEnB,eAAgB,CACZ,KAAM,CAAE,QAAS,EAAG,UAAW,kBAAA,EAC/B,GAAI,CAAE,QAAS,EAAG,UAAW,eAAA,EAC7B,WAAY,CAAE,SAAU,IAAK,OAAQ,gCAAiC,WAAY,CAAC,UAAW,WAAW,CAAA,EACzG,cAAe,cAAA,EAEnB,cAAe,CACX,KAAM,CAAE,QAAS,EAAG,UAAW,mBAAA,EAC/B,GAAI,CAAE,QAAS,EAAG,UAAW,eAAA,EAC7B,WAAY,CAAE,SAAU,IAAK,OAAQ,gCAAiC,WAAY,CAAC,UAAW,WAAW,CAAA,EACzG,cAAe,cAAA,EAEnB,aAAc,CACV,KAAM,CAAE,QAAS,EAAG,UAAW,mBAAA,EAC/B,GAAI,CAAE,QAAS,EAAG,UAAW,eAAA,EAC7B,WAAY,CAAE,SAAU,IAAK,OAAQ,gCAAiC,WAAY,CAAC,UAAW,WAAW,CAAA,EACzG,cAAe,cAAA,EAEnB,gBAAiB,CACb,KAAM,CAAE,QAAS,EAAG,UAAW,kBAAA,EAC/B,GAAI,CAAE,QAAS,EAAG,UAAW,eAAA,EAC7B,WAAY,CAAE,SAAU,IAAK,OAAQ,gCAAiC,WAAY,CAAC,UAAW,WAAW,CAAA,EACzG,cAAe,cAAA,EAEnB,MAAO,CACH,KAAM,CAAA,EACN,GAAI,CAAE,UAAW,aAAA,EACjB,WAAY,CAAE,SAAU,GAAI,OAAQ,6BAA8B,WAAY,CAAC,YAAa,YAAY,CAAA,EACxG,cAAe,cAAA,EAEnB,UAAW,CACP,KAAM,CAAE,UAAW,UAAA,EACnB,GAAI,CAAE,UAAW,aAAA,EACjB,WAAY,CAAE,SAAU,IAAK,OAAQ,6BAA8B,WAAY,CAAC,WAAW,CAAA,EAC3F,cAAe,cAAA,CAEvB,EAEaC,GAAoB,CAC7B,KAAM,CACF,KAAM,CACF,UAAW,GACX,UAAW,GACX,YAAa,uBACb,UAAW,MACX,YAAa,GACb,UAAW,GACX,WAAY,EAAA,EAEhB,MAAO,CACH,UAAW,GACX,UAAW,gBACX,YAAa,GACb,UAAW,GACX,YAAa,GACb,YAAa,wBACb,cAAe,YAAA,EAEnB,QAAS,CACL,UAAW,GACX,UAAW,GACX,YAAa,GACb,YAAa,GACb,UAAW,GACX,YAAa,GACb,cAAe,gBACf,WAAY,EACZ,QAAS,CAAA,EAEb,MAAO,CACH,KAAM,OACN,KAAM,KACN,SAAU,SACV,UAAW,GACX,UAAW,GACX,YAAa,GACb,WAAY,GACZ,cAAe,6BACf,UAAW,GACX,YAAa,GACb,WAAY,aACZ,aAAc,kBACd,OAAQ,CACJ,OAAQ,OACR,IAAK,eACL,KAAM,gBACN,MAAO,iBACP,OAAQ,kBACR,SAAU,MAAA,CACd,EAEJ,KAAM,CACF,UAAW,WACX,WAAY,WACZ,UAAW,UAAA,CACf,EAEJ,MAAO,CACH,UAAW,kBACX,UAAW,gBACX,YAAa,GACb,UAAW,GACX,YAAa,GACb,YAAa,wBACb,cAAe,YAAA,EAEnB,QAAS,CACL,UAAW,GACX,UAAW,GACX,YAAa,GACb,YAAa,GACb,UAAW,GACX,YAAa,GACb,cAAe,gBACf,WAAY,EACZ,QAAS,CAAA,EAEb,WAAY,CACR,UAAW,GACX,UAAW,GACX,YAAa,oBACb,YAAa,GACb,eAAgB,OAChB,SAAU,EACV,OAAQ,GACR,MAAO,KAAA,EAEX,SAAU,CACN,eAAgB,GAChB,aAAc,GACd,YAAa,GACb,WAAY,GACZ,SAAU,EAAA,EAEd,KAAM,CACF,UAAW,GACX,UAAW,GACX,YAAa,kDACb,UAAW,gBACX,YAAa,GACb,WAAY,GACZ,UAAW,EAAA,EAEf,OAAQ,CACJ,UAAW,GACX,UAAW,GACX,KAAM,gBACN,MAAO,YACP,YAAa,EAAA,EAEjB,aAAc,CACV,UAAW,cACX,WAAY,0DACZ,OAAQ,CACJ,MAAO,OAAA,CACX,EAEJ,cAAe,CACX,UAAW,cACX,WAAY,0DACZ,OAAQ,CACJ,MAAO,OAAA,CACX,EAEJ,WAAY,CACR,UAAW,uBAAA,EAEf,MAAO,CACH,UAAW,EAAA,EAEf,MAAO,CACH,UAAW,EAAA,EAEf,MAAO,CACH,KAAM,KACN,SAAU,SACV,UAAW,GACX,UAAW,GACX,YAAa,GACb,WAAY,GACZ,cAAe,6BACf,UAAW,GACX,YAAa,GACb,WAAY,aACZ,aAAc,kBACd,OAAQ,CACJ,OAAQ,OACR,IAAK,eACL,KAAM,gBACN,MAAO,iBACP,OAAQ,kBACR,SAAU,MAAA,CACd,EAEJ,SAAU,CACN,UAAW,GACX,UAAW,GACX,YAAa,0BACb,WAAY,GACZ,UAAW,GACX,gBAAiB,GACjB,cAAe,GACf,iBAAkB,GAClB,YAAa,GACb,YAAa,GACb,KAAM,CACF,UAAW,GACX,UAAW,oBACX,YAAa,GACb,UAAW,GACX,UAAW,yEACX,UAAW,wBACX,UAAW,GACX,WAAY,GACZ,WAAY,GACZ,aAAc,EAAA,EAElB,OAAQ,CACJ,KAAM,WACN,MAAO,WACP,MAAO,OAAA,CACX,EAEJ,cAAe,CACX,UAAW,YACX,SAAU,CACN,UAAW,GACX,YAAa,eACb,UAAW,2BAAA,CACf,EAEJ,OAAQ,CACJ,UAAW,GACX,UAAW,EAAA,EAEf,aAAc,CACV,UAAW,GACX,UAAW,EAAA,EAEf,KAAM,CACF,UAAW,GACX,gBAAiB,sBACjB,kBAAmB,qBACnB,gBAAiB,WACjB,KAAM,CACF,YAAa,GACb,UAAW,GACX,YAAa,YAAA,EAEjB,KAAM,CACF,UAAW,WACX,WAAY,WACZ,gBAAiB,eACjB,WAAY,QACZ,aAAc,UACd,WAAY,WACZ,qBAAsB,+CAAA,CAC1B,EAEJ,KAAM,CACF,UAAW,2BACX,UAAW,8BACX,YAAa,GACb,UAAW,WACX,UAAW,WACX,UAAW,OACX,UAAW,cACX,WAAY,OACZ,WAAY,GACZ,aAAc,mBAAA,EAElB,MAAO,CACH,UAAW,GACX,UAAW,QACX,UAAW,eACX,WAAY,aAAA,EAEhB,OAAQ,CACJ,UAAW,oBACX,YAAa,0BAAA,EAEjB,MAAO,CACH,UAAW,GACX,UAAW,GACX,OAAQ,CACJ,MAAO,OACP,MAAO,EAAA,CACX,EAEJ,YAAa,CACT,UAAW,GACX,UAAW,GACX,OAAQ,CAAE,MAAO,OAAQ,MAAO,EAAA,CAAM,EAE1C,WAAY,CACR,UAAW,GACX,UAAW,EAAA,EAEf,IAAK,CACD,UAAW,GACX,UAAW,GACX,OAAQ,CACJ,MAAO,QAAA,CACX,EAEJ,KAAM,CACF,UAAW,GACX,UAAW,EAAA,EAEf,OAAQ,CACJ,UAAW,GACX,UAAW,EAAA,CAEnB,EAEMC,GAA8B,CAAA,OAAEH,UAAQC,GAAA,WAAQC,EAAA,EC/YzCF,GAA4B,CACrC,KAAM,OACN,OAAQ,EACR,OAAQ,CACJ,WAAsB,WACtB,WAAsB,cACtB,KAAsB,YACtB,eAAsB,cACtB,QAAsB,YACtB,kBAAsB,cACtB,QAAsB,cACtB,kBAAsB,UACtB,UAAsB,cACtB,oBAAsB,cACtB,MAAsB,cACtB,gBAAsB,cACtB,OAAsB,cACtB,iBAAsB,cACtB,YAAsB,YACtB,sBAAsB,YACtB,QAAsB,cACtB,kBAAsB,UACtB,QAAsB,aACtB,kBAAsB,UACtB,KAAsB,cACtB,eAAsB,UACtB,OAAsB,cACtB,MAAsB,cACtB,KAAsB,aAAA,EAE1B,KAAM,CACF,WAAsB,aACtB,WAAsB,cACtB,KAAsB,cACtB,eAAsB,cACtB,QAAsB,cACtB,kBAAsB,cACtB,QAAsB,cACtB,kBAAsB,UACtB,UAAsB,cACtB,oBAAsB,cACtB,MAAsB,cACtB,gBAAsB,cACtB,OAAsB,cACtB,iBAAsB,cACtB,YAAsB,YACtB,sBAAsB,YACtB,QAAsB,cACtB,kBAAsB,UACtB,QAAsB,aACtB,kBAAsB,UACtB,KAAsB,cACtB,eAAsB,UACtB,OAAsB,cACtB,MAAsB,cACtB,KAAsB,aAAA,CAE9B,EAEaC,GAAyB,CAClC,KAAM,CACF,KAAM,CAAA,EACN,GAAI,CAAA,EACJ,WAAY,CAAE,SAAU,EAAG,OAAQ,SAAU,WAAY,CAAC,UAAW,YAAa,YAAY,CAAA,EAC9F,cAAe,QAAA,EAEnB,KAAM,CACF,KAAM,CAAE,QAAS,CAAA,EACjB,GAAI,CAAE,QAAS,CAAA,EACf,WAAY,CAAE,SAAU,IAAK,OAAQ,gCAAiC,WAAY,CAAC,SAAS,CAAA,EAC5F,cAAe,cAAA,EAEnB,OAAQ,CACJ,KAAM,CAAE,QAAS,EAAG,UAAW,kBAAA,EAC/B,GAAI,CAAE,QAAS,EAAG,UAAW,eAAA,EAC7B,WAAY,CAAE,SAAU,IAAK,OAAQ,gCAAiC,WAAY,CAAC,UAAW,WAAW,CAAA,EACzG,cAAe,cAAA,EAEnB,SAAU,CACN,KAAM,CAAE,QAAS,EAAG,UAAW,mBAAA,EAC/B,GAAI,CAAE,QAAS,EAAG,UAAW,eAAA,EAC7B,WAAY,CAAE,SAAU,IAAK,OAAQ,gCAAiC,WAAY,CAAC,UAAW,YAAa,YAAY,CAAA,EACvH,cAAe,cAAA,EAEnB,eAAgB,CACZ,KAAM,CAAE,QAAS,EAAG,UAAW,kBAAA,EAC/B,GAAI,CAAE,QAAS,EAAG,UAAW,eAAA,EAC7B,WAAY,CAAE,SAAU,IAAK,OAAQ,gCAAiC,WAAY,CAAC,UAAW,WAAW,CAAA,EACzG,cAAe,cAAA,EAEnB,cAAe,CACX,KAAM,CAAE,QAAS,EAAG,UAAW,mBAAA,EAC/B,GAAI,CAAE,QAAS,EAAG,UAAW,eAAA,EAC7B,WAAY,CAAE,SAAU,IAAK,OAAQ,gCAAiC,WAAY,CAAC,UAAW,WAAW,CAAA,EACzG,cAAe,cAAA,EAEnB,aAAc,CACV,KAAM,CAAE,QAAS,EAAG,UAAW,mBAAA,EAC/B,GAAI,CAAE,QAAS,EAAG,UAAW,eAAA,EAC7B,WAAY,CAAE,SAAU,IAAK,OAAQ,gCAAiC,WAAY,CAAC,UAAW,WAAW,CAAA,EACzG,cAAe,cAAA,EAEnB,gBAAiB,CACb,KAAM,CAAE,QAAS,EAAG,UAAW,kBAAA,EAC/B,GAAI,CAAE,QAAS,EAAG,UAAW,eAAA,EAC7B,WAAY,CAAE,SAAU,IAAK,OAAQ,gCAAiC,WAAY,CAAC,UAAW,WAAW,CAAA,EACzG,cAAe,cAAA,EAEnB,MAAO,CACH,KAAM,CAAA,EACN,GAAI,CAAE,UAAW,aAAA,EACjB,WAAY,CAAE,SAAU,IAAK,OAAQ,gCAAiC,WAAY,CAAC,YAAa,YAAY,CAAA,EAC5G,cAAe,cAAA,EAEnB,UAAW,CACP,KAAM,CAAE,UAAW,UAAA,EACnB,GAAI,CAAE,UAAW,aAAA,EACjB,WAAY,CAAE,SAAU,IAAK,OAAQ,gCAAiC,WAAY,CAAC,WAAW,CAAA,EAC9F,cAAe,cAAA,CAEvB,EAEaC,GAAoB,CAC7B,KAAM,CACF,KAAM,CACF,UAAW,GACX,UAAW,GACX,YAAa,uBACb,UAAW,MACX,YAAa,GACb,UAAW,GACX,WAAY,EAAA,EAEhB,MAAO,CACH,UAAW,GACX,UAAW,gBACX,YAAa,GACb,UAAW,GACX,YAAa,GACb,YAAa,wBACb,cAAe,YAAA,EAEnB,QAAS,CACL,UAAW,GACX,UAAW,GACX,YAAa,GACb,YAAa,GACb,UAAW,GACX,YAAa,GACb,cAAe,gBACf,WAAY,EACZ,QAAS,CAAA,EAEb,MAAO,CACH,KAAM,OACN,KAAM,KACN,SAAU,SACV,UAAW,GACX,UAAW,GACX,YAAa,GACb,WAAY,GACZ,cAAe,6BACf,UAAW,GACX,YAAa,GACb,WAAY,aACZ,aAAc,kBACd,OAAQ,CACJ,OAAQ,OACR,IAAK,eACL,KAAM,gBACN,MAAO,iBACP,OAAQ,kBACR,SAAU,MAAA,CACd,EAEJ,KAAM,CACF,UAAW,WACX,WAAY,WACZ,UAAW,UAAA,CACf,EAEJ,MAAO,CACH,UAAW,kBACX,UAAW,gBACX,YAAa,GACb,UAAW,GACX,YAAa,GACb,YAAa,wBACb,cAAe,YAAA,EAEnB,QAAS,CACL,UAAW,GACX,UAAW,GACX,YAAa,GACb,YAAa,GACb,UAAW,GACX,YAAa,GACb,cAAe,gBACf,WAAY,EACZ,QAAS,CAAA,EAEb,WAAY,CACR,UAAW,GACX,UAAW,GACX,YAAa,oBACb,YAAa,GACb,eAAgB,OAChB,SAAU,EACV,OAAQ,GACR,MAAO,KAAA,EAEX,SAAU,CACN,eAAgB,GAChB,aAAc,GACd,YAAa,GACb,WAAY,GACZ,SAAU,EAAA,EAEd,KAAM,CACF,UAAW,GACX,UAAW,GACX,YAAa,kDACb,UAAW,gBACX,YAAa,GACb,WAAY,GACZ,UAAW,EAAA,EAEf,OAAQ,CACJ,UAAW,GACX,UAAW,GACX,KAAM,gBACN,MAAO,YACP,YAAa,EAAA,EAEjB,aAAc,CACV,UAAW,cACX,WAAY,0DACZ,OAAQ,CACJ,MAAO,OAAA,CACX,EAEJ,cAAe,CACX,UAAW,cACX,WAAY,0DACZ,OAAQ,CACJ,MAAO,OAAA,CACX,EAEJ,WAAY,CACR,UAAW,uBAAA,EAEf,MAAO,CACH,UAAW,EAAA,EAEf,MAAO,CACH,UAAW,EAAA,EAEf,MAAO,CACH,KAAM,KACN,SAAU,SACV,UAAW,GACX,UAAW,GACX,YAAa,GACb,WAAY,GACZ,cAAe,6BACf,UAAW,GACX,YAAa,GACb,WAAY,aACZ,aAAc,kBACd,OAAQ,CACJ,OAAQ,OACR,IAAK,eACL,KAAM,gBACN,MAAO,iBACP,OAAQ,kBACR,SAAU,MAAA,CACd,EAEJ,SAAU,CACN,UAAW,GACX,UAAW,GACX,YAAa,0BACb,WAAY,GACZ,UAAW,GACX,gBAAiB,GACjB,cAAe,GACf,iBAAkB,GAClB,YAAa,GACb,YAAa,GACb,KAAM,CACF,UAAW,GACX,UAAW,oBACX,YAAa,GACb,UAAW,GACX,UAAW,yEACX,UAAW,wBACX,UAAW,GACX,WAAY,GACZ,WAAY,GACZ,aAAc,EAAA,EAElB,OAAQ,CACJ,KAAM,WACN,MAAO,WACP,MAAO,OAAA,CACX,EAEJ,cAAe,CACX,UAAW,YACX,SAAU,CACN,UAAW,GACX,YAAa,eACb,UAAW,2BAAA,CACf,EAEJ,OAAQ,CACJ,UAAW,GACX,UAAW,EAAA,EAEf,aAAc,CACV,UAAW,GACX,UAAW,EAAA,EAEf,KAAM,CACF,UAAW,GACX,gBAAiB,sBACjB,kBAAmB,qBACnB,gBAAiB,WACjB,KAAM,CACF,YAAa,GACb,UAAW,GACX,YAAa,YAAA,EAEjB,KAAM,CACF,UAAW,WACX,WAAY,WACZ,gBAAiB,eACjB,WAAY,QACZ,aAAc,UACd,WAAY,WACZ,qBAAsB,+CAAA,CAC1B,EAEJ,KAAM,CACF,UAAW,2BACX,UAAW,8BACX,YAAa,GACb,UAAW,WACX,UAAW,WACX,UAAW,OACX,UAAW,cACX,WAAY,OACZ,WAAY,GACZ,aAAc,mBAAA,EAElB,MAAO,CACH,UAAW,GACX,UAAW,QACX,UAAW,eACX,WAAY,aAAA,EAEhB,OAAQ,CACJ,UAAW,oBACX,YAAa,0BAAA,EAEjB,MAAO,CACH,UAAW,GACX,UAAW,GACX,OAAQ,CACJ,MAAO,OACP,MAAO,WAAA,CACX,EAEJ,YAAa,CACT,UAAW,GACX,UAAW,GACX,OAAQ,CAAE,MAAO,OAAQ,MAAO,WAAA,CAAY,EAEhD,WAAY,CACR,UAAW,GACX,UAAW,EAAA,EAEf,IAAK,CACD,UAAW,GACX,UAAW,GACX,OAAQ,CACJ,MAAO,QAAA,CACX,EAEJ,KAAM,CACF,UAAW,GACX,UAAW,EAAA,EAEf,OAAQ,CACJ,UAAW,GACX,UAAW,EAAA,CAEnB,EAEMC,GAA8B,CAAE,OAAAH,GAAQ,OAAAC,GAAQ,WAAAC,EAAA,ECrFzCE,GAAqB,CAAC,UAAW,OAAQ,OAAO,EAmCvDC,GAAeC,EAAAA,cAAqBC,EAAiB,EACrDC,GAAwBF,EAAAA,cAA8BG,GAAc,MAAM,EAC1EC,GAAyBJ,EAAAA,cAAsC,IAAI,EAE5DK,GAA2D,CACpE,QAASF,GACT,KAASG,GACT,MAASC,EACb,EAGMC,GAAY,CAAClE,EAAamE,IAAgB,CAC5C,UAAW9D,KAAO8D,EACVA,EAAO,eAAe9D,CAAG,IACrB,OAAO8D,EAAO9D,CAAG,GAAM,UAAY8D,EAAO9D,CAAG,IAAM,MAC9CL,EAAOK,CAAG,IACXL,EAAOK,CAAG,EAAI,CAAA,GAElB6D,GAAUlE,EAAOK,CAAG,EAAG8D,EAAO9D,CAAG,CAAC,GAC5B8D,EAAO9D,CAAG,IAAM,OACtBL,EAAOK,CAAG,EAAI8D,EAAO9D,CAAG,IAIpC,OAAOL,CACX,EAEMoE,GAAcC,GAAwBH,GAAU,CAAA,EAAIG,CAAK,EAE/D,SAASC,GAAkBC,EAA4C,CACnE,OAAO,OAAOA,GAAW,UAClBA,IAAW,MACX,WAAYA,GACZ,WAAYA,GACZ,eAAgBA,CAC3B,CAEA,SAASC,GAA6BD,EAKpC,CACE,OAAI,OAAOA,GAAW,UAAY,OAAOA,EAAW,IACzC,CACH,MAAOA,GAAU,UACjB,OAAQ,CAAE,GAAGR,EAAA,CAAgB,EAIjCO,GAAkBC,CAAM,EACjB,CACH,MAAO,SACP,OAAQ,CAAE,GAAGR,GAAiB,OAAQQ,CAAA,CAAO,EAI9C,CACH,YAAaA,EAAO,YACpB,MAAOA,EAAO,OAAS,UACvB,OAAQ,CAAE,GAAGR,GAAiB,GAAIQ,EAAO,QAAU,CAAA,CAAC,EACpD,cAAeA,EAAO,aAAA,CAE9B,CACA,SAASE,GAAYC,EAAmC,CACpD,OAAIA,IAAS,SAAiBA,EAC1B,OAAO,OAAW,KAAe,CAAC,OAAO,WAAmB,QACzD,OAAO,WAAW,8BAA8B,EAAE,QAAU,OAAS,OAChF,CAEA,SAASC,GAAiBtE,EAAqB,CAC3C,MAAO,QAAUA,EAAI,QAAQ,WAAauE,GAAM,IAAIA,EAAE,YAAA,CAAa,EAAE,CACzE,CAEA,SAASC,GAAe,CACpB,KAAAH,EACA,OAAAI,EACA,SAAAC,EACA,SAAAC,EACA,OAAAC,EACA,KAAAC,EACA,UAAAC,CACJ,EAQG,CACC,GAAI,OAAO,SAAa,IAAa,OAErC,SAAS,gBAAgB,UAAU,OAAO,OAAQV,GAAYC,CAAI,IAAM,MAAM,EAE9E,MAAMU,EAAoC,CAAA,EACpCC,EAAmC,CAAA,EAEzC,SAAW,CAAChF,EAAKK,CAAK,IAAK,OAAO,QAAQuE,GAAU,CAAA,CAAE,EAC9CvE,IAAU,SAAW0E,EAAUT,GAAiBtE,CAAG,CAAC,EAAIK,GAEhE,SAAW,CAACL,EAAKK,CAAK,IAAK,OAAO,QAAQwE,GAAQ,CAAA,CAAE,EAC5CxE,IAAU,SAAW2E,EAASV,GAAiBtE,CAAG,CAAC,EAAIK,GAG/D0E,EAAU,UAAU,EAAQ,GAAGN,CAAM,MACrCM,EAAU,aAAa,EAAK,IAAIN,EAAS,IAAK,QAAQ,CAAC,EAAE,QAAQ,SAAU,EAAE,CAAC,MAC9EM,EAAU,aAAa,EAAK,IAAIN,EAAS,KAAM,QAAQ,CAAC,EAAE,QAAQ,SAAU,EAAE,CAAC,MAC/EM,EAAU,aAAa,EAAK,GAAGN,CAAM,MACrCM,EAAU,aAAa,EAAK,IAAIN,EAAS,KAAK,QAAQ,CAAC,EAAE,QAAQ,SAAU,EAAE,CAAC,MAC9EM,EAAU,cAAc,EAAI,IAAIN,EAAS,GAAG,QAAQ,CAAC,EAAE,QAAQ,SAAU,EAAE,CAAC,MAC5EM,EAAU,cAAc,EAAI,IAAIN,EAAS,GAAG,QAAQ,CAAC,EAAE,QAAQ,SAAU,EAAE,CAAC,MAExEC,IAAUK,EAAU,aAAa,EAAIL,GACrCC,IAAUI,EAAU,aAAa,EAAIJ,GAEzC,SAAW,CAAC3E,EAAKK,CAAK,IAAK,OAAO,QAAQyE,GAAa,CAAA,CAAE,EACrDC,EAAU/E,EAAI,WAAW,IAAI,EAAIA,EAAM,KAAKA,CAAG,EAAE,EAAIK,EAIzD,IAAI4E,EAAK,SAAS,eAAe,eAAe,EAC3CA,IACDA,EAAK,SAAS,cAAc,OAAO,EACnCA,EAAG,GAAK,gBACR,SAAS,KAAK,YAAYA,CAAE,GAEhC,MAAMC,EAAWC,GACb,OAAO,QAAQA,CAAG,EAAE,IAAI,CAAC,CAACC,EAAG9E,CAAC,IAAM,KAAK8E,CAAC,KAAK9E,CAAC,GAAG,EAAE,KAAK;AAAA,CAAI,EAClE2E,EAAG,YAAc,CACb,OAAO,KAAKF,CAAS,EAAE,OAAS;AAAA,EAAYG,EAAQH,CAAS,CAAC;AAAA,GAAQ,GACtE,OAAO,KAAKC,CAAQ,EAAE,OAAS;AAAA,EAAYE,EAAQF,CAAQ,CAAC;AAAA,GAAQ,EAAA,EACtE,OAAO,OAAO,EAAE,KAAK;AAAA,CAAI,CAC/B,CAEO,MAAMK,GAAoB,iYACpBC,GAAmB,wVACnBC,GAAoB,yTAGpBC,GAAgB,CAAC,CACkC,SAAAC,EACA,OAAAvB,EAAS,MACzE,IAA0B,CACtB,MAAMwB,EAAaC,EAAAA,QAAQ,IAAMxB,GAA6BD,CAAM,EAAG,CAACA,CAAM,CAAC,EACzE0B,EAAoBF,EAAW,OAAOA,EAAW,KAAK,GAAKA,EAAW,OAAO,QAC7EG,EAAqBD,EAAkB,OACvC,CAACE,EAAeC,CAAgB,EAAIC,EAAAA,SAA0CN,EAAW,MAAM,EAC/F,CAACO,EAAaC,CAAc,EAAIF,EAAAA,SAASN,EAAW,KAAK,EACzD,CAACrB,EAAM8B,CAAO,EAAIH,EAAAA,SAAoBN,EAAW,aAAeG,EAAmB,MAAQ,OAAO,EAClG,CAACpB,EAAQ2B,CAAS,EAAIJ,WAASH,EAAmB,QAAUnC,GAAgB,QAAQ,OAAO,MAAO,EAClG,CAACgB,EAAU2B,CAAW,EAAIL,EAAAA,SAASH,EAAmB,UAAY,EAAE,EACpE,CAAClB,EAAU2B,CAAW,EAAIN,EAAAA,SAASH,EAAmB,UAAY,EAAE,EACpE,CAACU,EAAaC,CAAc,EAAIR,EAAAA,SAAiCH,EAAmB,MAAM,EAC1F,CAACY,EAAWC,CAAY,EAAIV,EAAAA,SAAiCH,EAAmB,IAAI,EACpF,CAAC7B,EAAO2C,CAAQ,EAAIX,EAAAA,SAAgB,IAAMjC,GAAW6B,EAAkB,UAAU,CAAC,EAClF,CAACgB,EAAgBC,CAAiB,EAAIb,EAAAA,SAAyBJ,EAAkB,MAAM,EAE7FkB,EAAAA,UAAU,IAAM,CACZ,MAAMC,EAAqBrB,EAAW,OAAOA,EAAW,KAAK,GAAKA,EAAW,OAAO,QAC9EsB,EAAiBD,EAAmB,OAC1ChB,EAAiBL,EAAW,MAAM,EAClCQ,EAAeR,EAAW,KAAK,EAC/BS,EAAQT,EAAW,aAAesB,EAAe,MAAQ,OAAO,EAChEZ,EAAUY,EAAe,QAAUtD,GAAgB,QAAQ,OAAO,MAAO,EACzE2C,EAAYW,EAAe,UAAY,EAAE,EACzCV,EAAYU,EAAe,UAAY,EAAE,EACzCR,EAAeQ,EAAe,MAAM,EACpCN,EAAaM,EAAe,IAAI,EAChCH,EAAkBE,EAAmB,MAAM,CAC/C,EAAG,CAACrB,CAAU,CAAC,EAEfoB,EAAAA,UAAU,IAAM,CACZ,MAAMG,EAAoBnB,EAAcG,CAAW,GAAKH,EAAc,QAChEoB,EAAYnD,GAAWkD,EAAkB,UAAU,EACzDpD,GAAUqD,EAAWxB,EAAW,eAAiB,CAAA,CAAE,EACnDiB,EAASO,CAAS,EAClBL,EAAkBI,EAAkB,MAAM,CAC9C,EAAG,CAAChB,EAAaP,EAAW,cAAeI,CAAa,CAAC,EAEzDgB,EAAAA,UAAU,IAAM,CACZ,MAAMK,GAAiBrB,EAAcG,CAAW,GAAKH,EAAc,SAAS,OAC5EtB,GAAe,CACX,KAAAH,EAAM,OAAAI,EAAQ,SAAAC,EAAU,SAAAC,EACxB,OAAQ4B,EACR,KAAME,EACN,UAAWU,EAAc,SAAA,CAC5B,CACL,EAAG,CAAC9C,EAAMyB,EAAeG,EAAaxB,EAAQC,EAAUC,EAAU4B,EAAaE,CAAS,CAAC,EAEzF,MAAMW,EAAazB,EAAAA,QAAyB,KAAO,CAC/C,KAAAtB,EACA,aAAcD,GAAYC,CAAI,EAC9B,MAAO4B,EACP,SAASM,GAAA,YAAAA,EAAa,UAAW7C,GAAgB,QAAQ,OAAO,OAAQ,QACxE,mBAAmB6C,GAAA,YAAAA,EAAa,oBAAqB7C,GAAgB,QAAQ,OAAO,OAAQ,kBAC5F,OAAAe,EACA,SAAAC,EACA,SAAAC,EACA,OAAQ4B,EACR,KAAME,EACN,OAAQX,EACR,QAAAK,EACA,YAAa,CACTA,EAASkB,GAAYjD,GAAYiD,CAAO,IAAM,OAAS,QAAU,MAAM,CAC3E,EACA,WAAWH,EAAmB,CACCpB,EAAcoB,CAAS,IAE1C,QAAQ,IAAI,WAAa,cACzB,QAAQ,KAAK,kCAAkCA,CAAS,+BAA+B,EAE3FA,EAAY,WAEhB,MAAMI,GAAkBxB,EAAcoB,CAAS,GAAKpB,EAAc,SAAS,OAC3EI,EAAegB,CAAS,EACxBf,EAAQmB,EAAe,MAAQ,OAAO,EACtClB,EAAUkB,EAAe,QAAU5D,GAAgB,QAAQ,OAAO,MAAO,EACzE2C,EAAYiB,EAAe,UAAY,EAAE,EACzChB,EAAYgB,EAAe,UAAY,EAAE,EACzCd,EAAec,EAAe,MAAM,EACpCZ,EAAaY,EAAe,IAAI,CACpC,EACA,WAAWC,EAAiB,CACxB,MAAMC,EAAID,EAAQ,MAAM,GAAG,EAAE,CAAC,EAC9Bf,EAAgBa,IAAa,CACzB,GAAGA,EACH,QAAAE,EACA,KAAMA,EACN,UAAsB,GAAGC,CAAC,WAC1B,oBAAsB,GAAGA,CAAC,WAC1B,OAAsB,GAAGA,CAAC,WAC1B,iBAAsB,GAAGA,CAAC,UAAA,EAC5B,EACFd,EAAcW,IAAa,CACvB,GAAGA,EACH,QAAAE,EACA,KAAMA,EACN,UAAsB,GAAGC,CAAC,WAC1B,oBAAsB,GAAGA,CAAC,WAC1B,OAAsB,GAAGA,CAAC,WAC1B,iBAAsB,GAAGA,CAAC,UAAA,EAC5B,CACN,EACA,UAAApB,EACA,QAAQqB,EAAcC,EAAe,CACjCrB,EAAYoB,CAAI,EACZC,IAAS,QAAWpB,EAAYoB,CAAI,CAC5C,EACA,UAAU9C,EAAoB,CAC1B4B,EAAe5B,CAAM,CACzB,EACA,UAAU+C,EAA6B,CACnCnB,EAAgBoB,IAAO,CAAE,GAAGA,EAAG,GAAGD,GAAS,EAC3CjB,EAAckB,IAAO,CAAE,GAAGA,EAAG,GAAGD,GAAS,CAC7C,CAAA,GACA,CAACtD,EAAM4B,EAAaxB,EAAQC,EAAUC,EAAU4B,EAAaE,EAAWX,CAAa,CAAC,EAE1F,OACI+B,EAAA,cAACpE,GAAuB,SAAvB,CAAgC,MAAO2D,GACpCS,EAAA,cAACtE,GAAsB,SAAtB,CAA+B,MAAOqD,CAAA,EACnCiB,EAAA,cAACzE,GAAa,SAAb,CAAsB,MAAOY,GACzByB,CACL,CACJ,CACJ,CAER,EAEaqC,EAAYC,GACdC,EAAAA,WAAW5E,EAAY,EAGrB6E,GAAoB,IACtBD,EAAAA,WAAWzE,EAAqB,EAG9B2E,GAAqB,IAAuB,CACrD,MAAMd,EAAaY,EAAAA,WAAWvE,EAAsB,EACpD,GAAI,CAAC2D,EACD,MAAM,IAAI,MAAM,kEAAkE,EAEtF,OAAOA,CACX,ECxmBae,EAAU,CAAC,CACI,SAAA1C,EAAc,OACd,UAAA2C,EAAc,OACd,MAAAC,EAAc,OACd,QAAAC,EAAc,MAC1C,IACWF,kBACA,MAAA,CAAI,UAAAA,EAAsB,MAAAC,EAAc,QAAAC,CAAA,EAAmB7C,CAAS,EACrEoC,EAAA,cAAAA,EAAA,SAAA,KAAGpC,CAAS,EAIT8C,GAAY,CAAC,CACE,SAAA9C,EAAc,OACd,UAAA2C,EAAc,OACd,MAAAC,EAAc,MAC1C,IAAsB,CAClB,MAAMG,EAAgBJ,EAAY,aAAaA,CAAS,GAAK,YAE7D,OAAQP,EAAA,cAAC,MAAA,CAAI,UAAWW,EAAe,MAAAH,GAAe5C,CAAS,CACnE,EAEagD,GAAM,CAAC,CACQ,SAAAhD,EAAc,OACd,UAAA2C,EAAc,OACd,MAAAC,EAAc,MAC1C,IAAsB,CAClB,MAAMG,EAAgBJ,EAAY,OAAOA,CAAS,GAAK,MAEvD,OAAQP,EAAA,cAAC,MAAA,CAAI,UAAWW,EAAe,MAAAH,GAAe5C,CAAS,CACnE,EAEaiD,EAAM,CAAC,CACQ,SAAAjD,EAAc,OACd,UAAA2C,EAAc,OACd,MAAAC,EAAc,OACd,IAAAM,EAAc,OACd,GAAAC,EAAc,OACd,GAAAC,EAAc,OACd,GAAAC,EAAc,OACd,GAAAC,EAAc,OACd,GAAAC,EAAc,MAC1C,IAAgB,CACZ,MAAMC,EACF,CACI,CAAC,GAAID,CAAE,EACP,CAAC,MAAOD,CAAE,EACV,CAAC,MAAOD,CAAE,EACV,CAAC,MAAOD,CAAE,EACV,CAAC,MAAOD,CAAE,EACV,CAAC,OAAQD,CAAG,CAAA,EAElB,OAAO,CAAC,CAAA,CAAGrI,CAAC,IAAMA,IAAM,MAAS,EAU7BkI,GARaS,EAAQ,OAAiB,CAACnJ,EAAK,CAACoJ,EAAIC,CAAG,EAAGpJ,MACrDA,IAAM,GAAKoJ,IAAQF,EAAQlJ,EAAI,CAAC,EAAE,CAAC,IACnCD,EAAI,KAAK,MAAMoJ,CAAE,IAAIC,CAAG,EAAE,EAEvBrJ,GACR,CAAA,CAAE,EAG6B,KAAK,GAAG,GAAK,QAAUsI,EAAY,IAAIA,CAAS,GAAK,IAEvF,OAAOP,EAAA,cAAC,MAAA,CAAI,UAAWW,EAAe,MAAAH,GAAe5C,CAAS,CAClE,ECjFO,SAAS2D,KAAMC,EAAsB,CACxC,OAAOC,GAAAA,QAAQC,QAAKF,CAAM,CAAC,CAC/B,CCWO,SAASG,GAAkBnJ,EAAyD,CACvF,OACI,OAAOA,GAAU,UACjBA,IAAU,MACV,CAACwH,EAAM,eAAexH,CAAK,GAC3B,YAAaA,CAErB,CAEO,SAASoJ,GACZpJ,EACAqJ,EAA0B,OAC1BC,EAC2B,CAC3B,GAAI,EAAuBtJ,GAAU,MAAQA,IAAU,IAEvD,OAAImJ,GAAkBnJ,CAAK,EAChB,CACH,GAAGA,EACH,KAAMA,EAAM,MAAQqJ,EACpB,UAAWN,EAAG/I,EAAM,UAAWsJ,CAAiB,CAAA,EAIjD,CACH,QAAStJ,EACT,KAAMqJ,EACN,UAAWC,CAAA,CAEnB,CAYO,MAAMC,GAAe,CAAC,CACzB,MAAAC,EACA,QAAAC,EAAU,OACV,KAAAC,EAAO,OACP,YAAAC,EAAc,OACd,UAAA5B,EAAY,OACZ,eAAA6B,EAAiB,GACjB,SAAAxE,EAAW,MACf,IAA0C,CACtC,MAAMpF,EAAQyJ,IAAY,OACpB,CAAE,QAAAA,EAAS,KAAAC,EAAM,UAAA3B,GACjByB,EAEN,GAAII,GAAkBH,IAAY,QAAa,CAACN,GAAkBK,CAAK,SAAUA,GAAS,KAE1F,MAAMnE,EAAa+D,GAAoBpJ,EAAO0J,GAAQC,EAAa5B,CAAS,EAE5E,OAAK1C,EAEDD,IAAa,OAEToC,EAAA,cAACqC,GAAA,CAAM,KAAMxE,EAAW,KAAM,KAAMA,EAAW,QAAS,UAAWA,EAAW,SAAA,EACzED,CACL,EAKJoC,EAAA,cAACqC,IAAM,KAAMxE,EAAW,KAAM,UAAWA,EAAW,WAC/CA,EAAW,OAChB,EAboBD,GAAY,IAexC,EAOMyE,GAAQ,CAAC,CACX,SAAAzE,EACA,KAAAsE,EAAc,OACd,IAAAjJ,EAAc,OACd,KAAAE,EAAc,OACd,UAAAmJ,EAAc,OACd,UAAA/B,EAAc,MAClB,IAA2B,CACvB,MAAMpE,EAAQ8D,EAAgB,EAG9B,GAAID,EAAM,eAAepC,CAAQ,EAAG,CAChC,MAAM2E,EAAahB,EAAG,6BAA+BW,EAAM,sBAAuB3B,GAAapE,EAAM,MAAM,SAAS,EACpH,uBACK,OAAA,CAAK,UAAWoF,EAAG,uBAAwBe,CAAS,GAChD1E,EACA3E,IAAQ,QACL+G,EAAA,cAAC,QAAK,UAAWuB,EAAGgB,EAAY,0CAA0C,CAAA,EAAItJ,CAAI,EAErFE,IAAS,QACN6G,EAAA,cAAC,QAAK,UAAWuB,EAAGgB,EAAY,0CAA0C,CAAA,EAAIpJ,CAAK,EAEtFF,IAAQ,QAAaE,IAAS,wBAC1B,OAAA,CAAK,UAAWoI,EAAGgB,EAAY,iFAAiF,EAAG,CAE5H,CAER,CAEA,uBACKjC,EAAA,CAAQ,UAAWgC,GACfrJ,EACD+G,EAAA,cAAC,QAAK,UAAWuB,EAAG,eAAiBW,EAAM3B,GAAapE,EAAM,MAAM,SAAS,CAAA,EACxEyB,CACL,EACCzE,CACL,CAER,EClIMqJ,GAAkC,CACpC,IAA0B,OAC1B,iBAA0B,QAC1B,kBAA0B,QAC1B,kBAA0B,eAC1B,mBAA0B,iBAC1B,gBAA0B,WAC1B,aAA0B,cAC1B,cAA0B,eAC1B,MAA0B,IAC1B,UAA0B,kBAC1B,KAA0B,SAC1B,KAA0B,WAC1B,cAA0B,OAC1B,WAA0B,WAC1B,kBAA0B,WAC1B,OAA0B,YAC1B,aAA0B,OAC1B,aAA0B,SAC1B,yBAA0B,UAC1B,wBAA0B,SAC1B,UAA0B,SAC1B,SAA0B,OAC1B,MAA0B,SAC1B,QAA0B,eAC9B,EAEA,SAASC,GAAaC,EAAsB,CACxC,OAAOA,EAAK,MAAM,GAAG,EAAE,IAAIC,GAAKA,EAAE,OAAO,CAAC,EAAE,YAAA,EAAgBA,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CACnF,CAEO,MAAMC,EAAkD,CAAxD,aAAA,CACH,KAAS,GAAK,QAAA,CAEd,QAAQF,EAAwE,CAC5E,MAAMvK,EAAMqK,GAAQE,CAAI,GAAKD,GAAaC,CAAI,EAC9C,OAAQG,GAA6F1K,CAAG,GAAK,IACjH,CACJ,CCnCA,MAAMqK,GAAkC,CACpC,IAA0B,OAC1B,iBAA0B,eAC1B,kBAA0B,gBAC1B,kBAA0B,gBAC1B,mBAA0B,iBAC1B,gBAA0B,eAC1B,aAA0B,YAC1B,cAA0B,aAC1B,MAA0B,IAC1B,UAA0B,cAC1B,KAA0B,eAC1B,gBAA0B,iBAC1B,KAA0B,WAC1B,cAA0B,aAC1B,WAA0B,aAC1B,kBAA0B,YAC1B,OAA0B,aAC1B,aAA0B,QAC1B,aAA0B,YAC1B,yBAA0B,uBAC1B,wBAA0B,sBAC1B,KAA0B,OAC1B,UAA0B,YAC1B,OAAiB,kBACjB,SAAiB,OACjB,SAAiB,QACjB,MAAiB,QACjB,QAAiB,UACjB,OAAiB,OACrB,EAEA,SAASC,GAAaC,EAAsB,CACxC,OAAOA,EAAK,MAAM,GAAG,EAAE,IAAIC,GAAKA,EAAE,OAAO,CAAC,EAAE,YAAA,EAAgBA,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CACnF,CAEO,MAAMG,EAAoD,CAI7D,YAA6BC,EAAyB,UAAW,CAApC,KAAA,OAAAA,EAH7B,KAAS,GAAK,WACd,KAAiB,WAAa,GAEoC,CAElE,QAAQL,EAA8D,CAClE,MAAMM,EAAS,KAAK,OAAO,IAAIN,CAAI,EACnC,GAAIM,EAAQ,OAAOA,EAEnB,MAAM7K,EAAMqK,GAAQE,CAAI,GAAKD,GAAaC,CAAI,EACxCO,EAAQC,GAAmH/K,CAAG,EACpI,GAAI,CAAC8K,EAAM,OAAO,KAElB,MAAME,EACF,KAAK,SAAW,UACVF,EACCG,GACCpD,EAAM,cAAciD,EAAM,CAAE,OAAQ,KAAK,OAAQ,GAAGG,EAA0D,EAE1H,YAAK,OAAO,IAAIV,EAAMS,CAAQ,EACvBA,CACX,CACJ,CC7DA,MAAME,GAAsBrD,EAAM,cAA0C,IAAI,EAC1EsD,GAAwBtD,EAAM,cAAqC,IAAI,EAgDvEuD,GAA+D,CACjE,OAAQ,IAAIX,GACZ,SAAU,IAAIE,EAClB,EAEMU,GAA2B,SAEjC,SAASC,GAAejL,EAA8C,CAClE,MAAO,EAAQA,GACR,OAAOA,GAAU,UACjB,OAAQA,EAA8B,IAAO,UAC7C,OAAQA,EAA8B,SAAY,UAC7D,CAEA,SAASkL,GAA4BrH,EAInC,CACE,GAAI,CAACA,EACD,MAAO,CAAE,UAAWmH,GAA0B,UAAW,CAAE,GAAGD,EAAA,EAA2B,QAAS,EAAC,EAGvG,GAAI,OAAOlH,GAAW,SAClB,MAAO,CAAE,UAAWA,EAAQ,UAAW,CAAE,GAAGkH,EAAA,EAA2B,QAAS,EAAC,EAGrF,GAAIE,GAAepH,CAAM,EACrB,MAAO,CACH,UAAWA,EAAO,GAClB,UAAW,CAAE,GAAGkH,GAAyB,CAAClH,EAAO,EAAE,EAAGA,CAAA,EACtD,QAAS,CAAA,CAAC,EAKlB,GAAI,YAAaA,GAAU,cAAeA,EAAQ,CAC9C,MAAM0D,EAAI1D,EACV,MAAO,CACH,UAAW0D,EAAE,QACb,UAAW,CAAE,GAAGwD,GAAyB,GAAGxD,EAAE,SAAA,EAC9C,QAASA,EAAE,SAAW,CAAA,CAAC,CAE/B,CAGA,MAAO,CACH,UAAW1D,EAAO,SAAS,GAC3B,UAAW,CAAE,GAAGkH,GAAyB,CAAClH,EAAO,SAAS,EAAE,EAAGA,EAAO,QAAA,EACtE,QAASA,EAAO,SAAW,CAAA,CAAC,CAEpC,CAEA,SAASsH,GAAsBC,EAA+BC,EAAsD,CAChH,OAAI,OAAO,KAAKA,CAAO,EAAE,SAAW,EAAUD,EAEvC,CACH,GAAIA,EAAS,GACb,QAAQlB,EAAM,CACV,OAAOkB,EAAS,QAAQC,EAAQnB,CAAI,GAAKA,CAAI,CACjD,CAAA,CAER,CAEO,SAASoB,GAAa,CACzB,SAAAF,EACA,OAAAvH,EACA,SAAAuB,CACJ,EAIG,CACC,MAAMC,EAAamC,EAAM,QACrB,IAAM0D,GAA4BrH,GAAUuH,CAAQ,EACpD,CAACvH,EAAQuH,CAAQ,CAAA,EAEf,CAACG,EAAWC,CAAY,EAAIhE,EAAM,SAASnC,EAAW,SAAS,EAC/D,CAACoG,EAAYC,CAAa,EAAIlE,EAAM,SAASnC,EAAW,SAAS,EAEvEmC,EAAM,UAAU,IAAM,CAClBgE,EAAanG,EAAW,SAAS,EACjCqG,EAAcrG,EAAW,SAAS,CACtC,EAAG,CAACA,CAAU,CAAC,EAEf,MAAMsG,EAAiBJ,EAAUE,CAAU,GAAKF,EAAUP,EAAwB,EAC5EY,EAAsBpE,EAAM,QAC9B,IAAMmE,EAAiBR,GAAsBQ,EAAgBtG,EAAW,OAAO,EAAI,KACnF,CAACsG,EAAgBtG,EAAW,OAAO,CAAA,EAGjC0B,EAAaS,EAAM,QAAwB,KAAO,CACpD,YAAYmE,GAAA,YAAAA,EAAgB,KAAMX,GAClC,UAAAO,EACA,QAASlG,EAAW,QACpB,YAAYwG,EAAY,CACpB,GAAIN,EAAUM,CAAE,EAAG,CACfH,EAAcG,CAAE,EAChB,MACJ,CAEI,QAAQ,IAAI,WAAa,cACzB,QAAQ,KAAK,oCAAoCA,CAAE,uBAAuBb,EAAwB,IAAI,EAE1GU,EAAcV,EAAwB,CAC1C,EACA,iBAAiBa,EAAYC,EAAyC,CAClEN,EAAcxE,IAAa,CAAE,GAAGA,EAAS,CAAC6E,CAAE,EAAGC,CAAA,EAAqB,CACxE,EACA,QAAQ5B,EAAc,CAClB,OAAO0B,GAAA,YAAAA,EAAqB,QAAQ1B,KAAS,IACjD,CAAA,GACA,CAACyB,EAAgBJ,EAAWlG,EAAW,QAASuG,CAAmB,CAAC,EAExE,OACIpE,EAAA,cAACsD,GAAsB,SAAtB,CAA+B,MAAO/D,CAAA,EACnCS,EAAA,cAACqD,GAAoB,SAApB,CAA6B,MAAOe,CAAA,EAChCxG,CACL,CACJ,CAER,CAEO,SAAS2G,IAA8C,CAC1D,OAAOvE,EAAM,WAAWqD,EAAmB,CAC/C,CAEO,SAASmB,IAAoC,CAChD,MAAMjF,EAAaS,EAAM,WAAWsD,EAAqB,EACzD,GAAI,CAAC/D,EACD,MAAM,IAAI,MAAM,gEAAgE,EAEpF,OAAOA,CACX,CC5KA,MAAMkF,GAAkB,IAAI7B,GAEtB8B,EAAO,CAAC,CAAE,KAAAhC,EAAM,KAAAiC,EAAO,GAAI,UAAApE,EAAW,MAAAC,EAAO,SAAUoE,EAAkB,MAAAC,KAAuB,CAClG,MAAMC,EAAkBP,GAAA,EAClBX,EAAWgB,GAAoBE,GAAmBL,GACxD,GAAI,CAACb,GAAY,OAAOlB,GAAS,UAAY,CAACA,EAAK,KAAA,EAAQ,OAAO,KAClE,MAAMqC,EAAYnB,EAAS,QAAQlB,CAAI,EACvC,OAAKqC,EACE/E,EAAA,cAAC+E,EAAA,CAAU,KAAAJ,EAAY,UAAApE,EAAsB,MAAAC,EAAc,aAAYqE,EAAO,cAAaA,EAAQ,OAAY,EAAA,CAAM,EADrG,IAE3B,ECGMG,GAAO,CAAC,CACZ,QAAAC,EACA,KAAAC,EAAgB,KAChB,OAAAC,EAAgB,CAAA,EAChB,IAAAlM,EAAgB,OAChB,KAAAE,EAAgB,OAChB,UAAAmJ,EAAgB,OAChB,UAAA/B,EAAgB,OAChB,YAAA6E,EAAgB,OAChB,UAAAC,EAAgB,OAChB,UAAAC,EAAgB,OAChB,UAAAC,EAAgB,OAChB,UAAAC,EAAgB,OAChB,WAAAjD,EAAgB,OAChB,WAAAkD,EAAgB,OAChB,aAAAC,EAAgB,MAClB,IAAiB,CACf,MAAMC,EAAOC,GAAQX,CAAO,EACtB9I,EAAQ8D,EAAe,EAEvB4F,EAAW,CAAC,CAAE,KAAAC,EAAM,MAAAvN,KAA0C,OAClE,KAAM,CAACwN,EAAQC,CAAS,EAAI7H,EAAAA,SAAkB2H,EAAK,MAAM,EAEzD7G,EAAAA,UAAU,IAAM,CACd+G,EAAUF,EAAK,MAAM,CACvB,EAAG,CAACA,CAAI,CAAC,EAET,MAAMG,IAAcC,EAAAJ,EAAK,WAAL,YAAAI,EAAe,QAAS,EACtC/N,EAAM2N,EAAK,MAAM,YAAA,EACjBK,EAAW,IACfnG,EAAA,cAAC,OAAA,CAAK,UAAWuF,GAAapJ,EAAM,KAAK,WACvC6D,EAAA,cAAC0E,EAAA,CAAK,KAAMoB,EAAK,KAAM,CACzB,EAGF,OAAKA,EAAK,KAUR9F,EAAA,cAAC,KAAA,CAAG,UAAW,GAAG8F,EAAK,OAAS,UAAY,EAAE,GAAGT,GAAalJ,EAAM,KAAK,SAAS,EAAA,EAChF6D,EAAA,cAACoG,GAAAA,KAAA,CACC,GAAIN,EAAK,KAAK,MAAM,GAAG,EAAE,CAAC,EAC1B,UAAWR,GAAanJ,EAAM,KAAK,UAClC,GAAI8J,GAAe,CAAA,EAGpB,QAAUI,GAAM,CACVJ,GAAe,CAACK,GAAqBD,EAAG,GAAG,IAC7CA,EAAE,eAAA,EACFL,EAAUO,GAAQ,CAACA,CAAI,EAE3B,CAAA,EAECT,EAAK,MAAQ9F,EAAA,cAACmG,EAAA,IAAS,EACxBnG,EAAA,cAAC,QAAK,UAAWwF,GAAarJ,EAAM,KAAK,WACtC2J,EAAK,KACR,EACCX,EAAOhN,CAAG,mBACRkK,GAAA,CAAM,KAAM8C,EAAOhN,CAAG,EAAE,KAAM,UAAWoK,GAAcpG,EAAM,KAAK,YAChEgJ,EAAOhN,CAAG,EAAE,QACf,EAED8N,GAAejG,EAAA,cAAC0E,EAAA,CAAK,KAAMqB,EAAS,aAAe,aAAA,CAAe,CAAA,EAEpEE,GACCjG,EAAA,cAAC,MAAA,CAAI,UAAW,YAAY+F,EAAS,OAAS,EAAE,IAC9C/F,EAAA,cAACkF,EAAA,CAAK,UAAWQ,GAAgBvJ,EAAM,KAAK,cACzC2J,EAAK,SAAS,IAAI,CAACU,EAAYC,oBAC7BZ,EAAA,CAAS,IAAKY,EAAK,KAAMD,EAAO,MAAOC,CAAA,CAAK,CAC9C,CACH,CACF,CAEJ,EA1CEzG,EAAA,cAAC,KAAA,CAAG,IAAKzH,EAAO,UAAW6M,GAAejJ,EAAM,KAAK,WAAA,EAClD2J,EAAK,MAAQ9F,EAAA,cAACmG,MAAS,EACvBL,EAAK,QAAU,OAAO,KAAKA,EAAK,KAAK,EAAI9F,EAAA,cAAC,KAAA,CAAG,UAAW,MAAO,EAAKA,EAAA,cAAC,OAAA,KAAM8F,EAAK,KAAM,EACzF,CAyCN,EAEA,OACE9F,EAAA,cAACM,EAAA,CAAQ,UAAWgC,GAAanG,EAAM,KAAK,SAAA,EACzClD,EACD+G,EAAA,cAACkF,EAAA,CAAK,UAAW3E,GAAapE,EAAM,KAAK,SAAA,EACtCwJ,EAAK,IAAI,CAACG,EAAMvN,IACfyH,EAAA,cAAC6F,EAAA,CAAS,IAAKtN,EAAO,KAAAuN,EAAY,MAAAvN,CAAA,CAAc,CACjD,CACH,EACCY,CACH,CAEJ,EC1FMuN,GAA4B,CAC9B,KAAM,CAAA,EACN,GAAI,CAAA,EACJ,WAAY,CACR,SAAU,EACV,OAAQ,SACR,MAAO,EACP,WAAY,CAAC,UAAW,YAAa,YAAY,CAAA,EAErD,cAAe,QACnB,EAEMC,GAAgC,CAGlC,WAAY,CACR,SAAU,IACV,OAAQ,6BACR,MAAO,EACP,WAAY,CAAC,UAAW,YAAa,YAAY,CAAA,EAErD,cAAe,cACnB,EAEMC,GAAuB,IACzB,OAAO,OAAW,KACf,OAAO,OAAO,YAAe,YAC7B,OAAO,WAAW,kCAAkC,EAAE,QAEvDC,GAAmB,CACrBC,EACAC,EACAC,EAA4B,SACb,CACf,MAAMC,EAAYH,IAAc,OAAYE,EAAWF,EAEvD,OAAIG,IAAc,GAAcP,GAC5B,OAAOO,GAAc,SAAiBF,EAASE,CAAS,GAAKF,EAAS,MAAQL,GAC3EO,CACX,EAEaC,GAA0BC,GACnCA,EAAW,WACN,IAAKC,GAAa,GAAGA,CAAQ,IAAID,EAAW,QAAQ,MAAMA,EAAW,MAAM,IAAIA,EAAW,KAAK,IAAI,EACnG,KAAK,IAAI,EAELE,GAAsB,CAC/BP,EACAC,EAA2B,CAAA,EAC3BC,IACuB,CACvB,MAAMM,EAAOT,GAAiBG,EAAUD,EAAU,MAAM,EAClDQ,EAASV,GAAiBC,EAAWC,EAAUC,CAAQ,EACvDQ,EAAmB,CACrB,GAAGb,GAAgB,WACnB,GAAGW,EAAK,WACR,GAAGC,EAAO,UAAA,EAERE,EAAgBF,EAAO,eAAiBD,EAAK,eAAiBX,GAAgB,cAC9Ee,EAAUD,IAAkB,UAC1BA,IAAkB,gBAAkBb,GAAA,EACtCO,EAAa,CACf,SAAUO,EAAU,EAAIF,EAAiB,SACzC,OAAQE,EAAU,SAAWF,EAAiB,OAC9C,MAAOE,EAAU,EAAIF,EAAiB,MACtC,WAAYA,EAAiB,UAAA,EAGjC,MAAO,CACH,KAAME,EAAU,GAAK,CAAE,GAAIJ,EAAK,MAAQ,CAAA,EAAK,GAAIC,EAAO,MAAQ,EAAC,EACjE,GAAIG,EAAU,GAAK,CAAE,GAAIJ,EAAK,IAAM,CAAA,EAAK,GAAIC,EAAO,IAAM,EAAC,EAC3D,WAAAJ,EACA,cAAAM,EACA,gBAAiBP,GAAuBC,CAAU,CAAA,CAE1D,EAEaQ,GAAkB,CAC3Bb,EACAE,IACuB,CACvB,MAAMD,EAAW3G,GAAA,EACjB,OAAOJ,EAAM,QACT,IAAMqH,GAAoBP,EAAWC,EAAUC,CAAQ,EACvD,CAACF,EAAWC,EAAUC,CAAQ,CAAA,CAEtC,EAEaY,GAAiB,CAC1BC,EACAf,EACAE,EACAc,IACsB,CACtB,MAAMP,EAASI,GAAgBb,EAAWE,CAAQ,EAElD,OAAOhH,EAAM,QAAQ,KAAO,CACxB,GAAG8H,EACH,GAAID,EAASN,EAAO,GAAKA,EAAO,KAChC,WAAY,CACRO,GAAA,YAAAA,EAAW,WACXP,EAAO,eAAA,EACT,OAAO,OAAO,EAAE,KAAK,IAAI,CAAA,GAC3B,CAACM,EAAQC,EAAWP,CAAM,CAAC,CACnC,EAEaQ,GAAiB,CAC1BC,EAAW,GACXF,EACAhB,EACAE,EAA4B,UAC3B,CACD,MAAMO,EAASI,GAAgBb,EAAWE,CAAQ,EAC5C,CAACiB,EAASC,CAAU,EAAIlI,EAAM,SAAS,EAAK,EAWlD,MAAO,CACH,MAVUA,EAAM,QAA6B,KAAO,CACpD,GAAG8H,EACH,GAAIG,GAAW,CAACD,EAAWT,EAAO,GAAKA,EAAO,KAC9C,WAAY,CACRO,GAAA,YAAAA,EAAW,WACXP,EAAO,eAAA,EACT,OAAO,OAAO,EAAE,KAAK,IAAI,CAAA,GAC3B,CAACO,EAAWE,EAAUT,EAAQU,CAAO,CAAC,EAItC,cAAe,CACX,YAAa,IAAM,CAACD,GAAYE,EAAW,EAAI,EAC/C,UAAW,IAAMA,EAAW,EAAK,EACjC,aAAc,IAAMA,EAAW,EAAK,EACpC,OAAQ,IAAMA,EAAW,EAAK,CAAA,CAClC,CAER,EAEaC,GAAiB,CAC1BL,EACAhB,EACAE,EAA4B,WAC3B,CACD,KAAM,CAACoB,EAASC,CAAU,EAAIrI,EAAM,SAAS,EAAK,EAElD,OAAAA,EAAM,UAAU,IAAM,CAClBqI,EAAW,EAAK,EAChB,MAAMC,EAAQ,OAAO,sBAAsB,IAAMD,EAAW,EAAI,CAAC,EACjE,MAAO,IAAM,OAAO,qBAAqBC,CAAK,CAClD,EAAG,CAACxB,EAAWE,CAAQ,CAAC,EAEjBY,GAAeQ,EAAStB,EAAWE,EAAUc,CAAS,CACjE,ECvHaS,GAAW,CAAC,CACI,SAAA3K,EACA,aAAA4K,EACA,MAAAxG,EAAqB,OACrB,OAAAyG,EAAqB,OACrB,OAAAC,EAAqB,OACrB,YAAAC,EAAqB,GACrB,KAAMC,EAAiB,OACvB,aAAAC,EAAqB,OACrB,WAAAC,EAAqB,GACrB,SAAAC,EAAqB,OACrB,UAAAzG,EAAqB,OACrB,UAAA/B,EAAqB,OACrB,YAAAyI,EAAqB,OACrB,UAAAC,EAAqB,OACrB,WAAA1G,EAAqB,OACrB,YAAA6C,EAAqB,OACrB,YAAA8D,EAAqB,OACrB,OAAQC,EAAe,MAEpD,IAAqB,SACjB,MAAMhN,EAAQ8D,EAAmB,EAC3B,CAACmJ,EAAkBC,CAAmB,EAAIrJ,EAAM,SAAS2I,CAAW,EACpEW,EAAUtJ,EAAM,OAAuB,IAAI,EAC3CuJ,EAASvJ,EAAM,MAAA,EACfwJ,EAAOV,EAAa,GAAOF,GAAkBQ,EAC7CK,EAAe,CAACX,GAAcN,IAAiB,OAC/CkB,EAAkB9B,GAAe4B,EAAML,KAAgBjD,EAAA/J,EAAM,SAAS,SAAf,YAAA+J,EAAuB,OAAQ,aAAYyD,EAAAxN,EAAM,SAAS,SAAf,YAAAwN,EAAuB,OAAQ,UAAU,EAE3IC,EAAa5J,EAAM,YAAa6J,GAAsB,CACpDf,IACAF,IAAmB,QAAWS,EAAoBQ,CAAQ,EAC9DhB,GAAA,MAAAA,EAAegB,GACnB,EAAG,CAACf,EAAYF,EAAgBC,CAAY,CAAC,EAE7C7I,EAAM,UAAU,IAAM,CAClB,GAAI,CAACwJ,GAAQV,EAAY,OAEzB,MAAMgB,EAAqBC,GAAwB,QAC1C7D,EAAAoD,EAAQ,UAAR,MAAApD,EAAiB,SAAS6D,EAAM,SACjCH,EAAW,EAAK,CAExB,EAEMI,EAAiBD,GAAyB,CACxCA,EAAM,MAAQ,UAAUH,EAAW,EAAK,CAChD,EAEA,cAAO,SAAS,iBAAiB,cAAeE,CAAiB,EACjE,OAAO,SAAS,iBAAiB,UAAWE,CAAa,EAElD,IAAM,CACT,OAAO,SAAS,oBAAoB,cAAeF,CAAiB,EACpE,OAAO,SAAS,oBAAoB,UAAWE,CAAa,CAChE,CACJ,EAAG,CAAClB,EAAYU,EAAMI,CAAU,CAAC,EACjC,SAASK,EAAkBC,EAA6C,CACpE,OACI,OAAOA,GAAW,UAClBA,IAAW,MACX,CAAClK,EAAM,eAAekK,CAAM,IAC3B,SAAUA,GAAU,SAAUA,EAEvC,CAEA,MAAMC,EAASV,EAAezJ,EAAA,cAACoK,GAAA,CAAe,UAAWpB,EAAa,MAAAhH,EAAc,WAAAO,EAAwB,OAAQ4G,EAAc,SAAU,IAAMS,EAAW,CAACJ,CAAI,EAAG,KAAAA,EAAY,OAAAD,GAC5KU,EAAkBzB,CAAY,kCAEtBA,EAAa,sBAAS9D,EAAA,CAAK,KAAM8D,EAAa,KAAM,UAAWA,EAAa,KAAO,OAAS,MAAA,CAAW,EACvGA,EAAa,IAClB,EACEA,CAEV,EAAoB,KAGpB,OACIxI,EAAA,cAACM,GAAQ,UAAWgC,GAAanG,EAAM,SAAS,SAAA,kBAC3C,MAAA,CAAI,IAAKmN,EAAS,UAAW/H,EAAGuH,EAAa,yBAA2B,kCAAmCvI,GAAapE,EAAM,SAAS,SAAS,CAAA,EAC5IgO,EACDnK,EAAA,cAAC,MAAA,CACI,GAAIuJ,EACJ,KAAK,OACL,cAAa,CAACC,EACd,UAAWjI,EACP,2GACAuH,EAAa,WAAa,qBAC1B,CAACA,GAAcC,IAAa,OAAS,UACrC,CAACD,GAAcC,IAAa,SAAW,SACvCE,GAAa9M,EAAM,SAAS,SAAA,EAEhC,MAAO2M,EACD,OACA,CACE,GAAGY,EACH,QAASF,EAAO,EAAI,EACpB,WAAYA,EAAO,UAAY,SAC/B,cAAeA,EAAO,OAAY,MAAA,EAE1C,QAAUnD,GAAM,CACZA,EAAE,gBAAA,CACN,CAAA,EAEAoC,GAAUzI,EAAA,cAAC,MAAA,CAAI,UAAWuB,EAAG,oCAAqC6D,GAAejJ,EAAM,SAAS,WAAW,CAAA,EACvGsM,EACDzI,EAAA,cAACqK,OAAgB,CACrB,EACCzM,EACA8K,GAAU1I,EAAA,cAAC,MAAA,CAAI,UAAYkJ,GAAe/M,EAAM,SAAS,WAAA,EACtD6D,EAAA,cAACqK,GAAA,IAAgB,EAChB3B,CACL,CAAA,CAER,CACJ,CAER,EAGa0B,GAAiB,CAAC,CACI,SAAAxM,EACA,MAAAoE,EAAe,OACf,QAAAsI,EAAe,UACf,UAAA/J,EAAe,OACf,WAAAgC,EAAe,OACf,OAAQ4G,EAAe,OACvB,SAAAoB,EAAe,OACf,KAAAf,EAAe,GACf,OAAAD,EAAe,MAClD,IAA2B,OACvB,MAAMpN,EAAQ8D,EAAmB,EAC3B9E,EAAS4M,GAAe,GAAO,CAAC,OAAQ,SAAA,EAAYoB,KAAgBjD,EAAA/J,EAAM,SAAS,SAAf,YAAA+J,EAAuB,QAAS,OAAO,EAE3GgE,EACFlK,EAAA,cAAC,SAAA,CACG,KAAK,SACL,UAAWuB,EAAG,gDAAiDhB,GAAapE,EAAM,SAAS,WAAW,EACtG,MAAOhB,EAAO,MACd,gBAAc,OACd,gBAAeqO,EACf,gBAAeD,EACf,QAASgB,EACR,GAAGpP,EAAO,cACX,UAAYkL,GAAM,EACVA,EAAE,MAAQ,SAAWA,EAAE,MAAQ,OAC/BA,EAAE,eAAA,EACFkE,GAAA,MAAAA,IAER,EACA,eAAcD,CAAA,EAEb1M,CAAA,EAIT,OACIoC,EAAA,cAAC+B,IAAa,MAAAC,EAAc,UAAWO,GAAcpG,EAAM,SAAS,YAC/D+N,CACL,CAER,EAEaM,GAAe,CAAC,CACI,SAAA5M,EACA,IAAA6M,EAAa,OACb,QAAAhK,EAAa,OACb,KAAAiK,EAAa,OACb,UAAAnK,EAAa,MAC9C,IAAyB,CACrB,MAAMpE,EAAQ8D,EAAmB,EAC3B6F,EAAO4E,EACP1K,EAAA,cAAC,OAAA,CAAK,UAAU,0CACdA,EAAA,cAAC,OAAA,CAAK,UAAU,gFAAA,EACZA,EAAA,cAAC0E,EAAA,CAAK,KAAMgG,EAAM,KAAM,EAAA,CAAI,CAChC,EACA1K,EAAA,cAAC,QAAK,UAAU,SAAA,EACXpC,CACL,CACJ,EACEA,EAEN,OAAO6M,EACHzK,EAAA,cAACoG,GAAAA,KAAA,CACG,GAAIqE,EACJ,KAAK,WACL,UAAWlJ,EAAG,8MAA+MhB,GAAapE,EAAM,SAAS,aAAa,CAAA,EAErQ2J,CAAA,EAELrF,EACAT,EAAA,cAAC,SAAA,CACG,QAAAS,EACA,KAAK,WACL,UAAWc,EAAG,wNAAyNhB,GAAapE,EAAM,SAAS,aAAa,CAAA,EAE/Q2J,CAAA,EAGL9F,EAAA,cAAC,OAAA,CAAK,KAAK,WAAW,UAAWuB,EAAG,sEAAuEhB,GAAapE,EAAM,SAAS,aAAa,GAC/I2J,CACL,CAER,EAEa6E,GAAiB,CAAC,CAAC,SAAA/M,EAAU,UAAA2C,KAAoC,CAC1E,MAAMpE,EAAQ8D,EAAmB,EACjC,OACID,EAAA,cAAC,MAAA,CAAI,UAAWuB,EAAG,gFAAiFhB,GAAapE,EAAM,SAAS,eAAe,CAAA,EAC1IyB,CACL,CAER,EAEayM,GAAkB,CAAC,CAAC,UAAA9J,KAAqC,CAClE,MAAMpE,EAAQ8D,EAAmB,EACjC,OAAOD,EAAA,cAAC,OAAI,UAAWuB,EAAG,4BAA6BhB,GAAapE,EAAM,SAAS,gBAAgB,CAAA,CAAG,CAC1G,EAUayO,GAAe,CAAC,CACzB,QAAA3F,EACA,KAAAC,EAAgB,KAChB,OAAAC,EAAgB,CAAA,EAChB,IAAAlM,EAAgB,OAChB,KAAAE,EAAgB,MACpB,IAAyB,CACrB,MAAMgD,EAAQ8D,EAAmB,EAEjC,OAAOD,EAAA,cAACgF,GAAA,CACJ,QAAAC,EACA,KAAAC,EACA,OAAAC,EACA,IAAAlM,EACA,KAAAE,EACA,UAAWgD,EAAM,SAAS,KAAK,UAC/B,UAAWA,EAAM,SAAS,KAAK,UAC/B,YAAaA,EAAM,SAAS,KAAK,YACjC,UAAWA,EAAM,SAAS,KAAK,UAC/B,UAAWA,EAAM,SAAS,KAAK,UAC/B,UAAWA,EAAM,SAAS,KAAK,UAC/B,UAAWA,EAAM,SAAS,KAAK,UAC/B,WAAYA,EAAM,SAAS,KAAK,WAChC,WAAYA,EAAM,SAAS,KAAK,WAChC,aAAcA,EAAM,SAAS,KAAK,YAAA,CAAA,CAE1C,EC7SM0O,GAAe,aACfC,GAAgBtP,EAAAA,cAA6C,MAAS,EAGtEuP,GAAsB,IAAM,KAAK,MAAM,aAAa,QAAQF,EAAY,GAAK,IAAI,EAG1EG,GAAiB,CAAC,CAAE,SAAApN,KAAwC,CACrE,KAAM,CAACqN,EAAYC,CAAkB,EAAI/M,EAAAA,SAAS,IAAM4M,IAAqB,EAE7E9L,EAAAA,UAAU,IAAM,CACZ,MAAMkM,EAAuBpB,GAAwB,CAC7CA,EAAM,cAAgB,cAAgBA,EAAM,MAAQc,IACpDK,EAAmBH,IAAqB,CAEhD,EAEA,cAAO,iBAAiB,UAAWI,CAAmB,EAC/C,IAAM,CACT,OAAO,oBAAoB,UAAWA,CAAmB,CAC7D,CACJ,EAAG,CAAA,CAAE,EAEL,MAAMC,EAAsBC,GAA4B,CACpD,aAAa,QAAQR,GAAc,KAAK,UAAUQ,CAAW,CAAC,EAC9DH,EAAmBG,CAAW,CAClC,EAEMC,EAAgB,CAAC9S,EAAY+S,IAA4B,CAC3D,MAAMF,EAAc,CAAE,GAAGJ,EAAY,CAACM,CAAS,EAAG/S,CAAA,EAClD4S,EAAmBC,CAAW,CAClC,EAEMG,EAAoBD,GAA4B,CAClD,MAAMF,EAAc,CAAE,GAAGJ,CAAA,EACzB,OAAOI,EAAYE,CAAS,EAC5BH,EAAmBC,CAAW,CAClC,EAEA,OACIrL,EAAA,cAAC8K,GAAc,SAAd,CAAuB,MAAO,CAAE,WAAAG,EAAY,cAAAK,EAAe,iBAAAE,CAAAA,CAAiB,EACxE5N,CACL,CAER,EAGa6N,GAA0BF,GAIlC,CACD,MAAMtG,EAAU9E,EAAAA,WAAW2K,EAAa,EACxC,GAAI,CAAC7F,EAAS,MAAM,IAAI,MAAM,oDAAoD,EAElF,KAAM,CAAE,WAAAgG,EAAY,cAAAK,EAAe,iBAAAE,GAAqBvG,EAExD,MAAO,CACHgG,EAAWM,CAAS,GAAK,KACxBG,GAAeJ,EAAcI,EAASH,CAAS,EAChD,IAAMC,EAAiBD,CAAS,CAAA,CAExC,EAGaI,GAAgB,CAACJ,EAA2B,OAAqB,CAC1E,MAAMN,EAAaF,GAAA,EACnB,OAAOQ,EAAYN,EAAWM,CAAS,GAAK,CAAA,EAAKN,CACrD,EAGaK,GAAgB,CAAC9S,EAAY+S,IAA4B,CAClE,MAAMF,EAAc,CAAE,GAAGN,GAAA,EAAuB,CAACQ,CAAS,EAAG/S,CAAA,EAC7D,aAAa,QAAQqS,GAAc,KAAK,UAAUQ,CAAW,CAAC,CAClE,EAGaG,GAAoBD,GAA4B,CACzD,MAAMF,EAAc,CAAE,GAAGN,IAAoB,EAC7C,OAAOM,EAAYE,CAAS,EAC5B,aAAa,QAAQV,GAAc,KAAK,UAAUQ,CAAW,CAAC,CAClE,ECfA,IAAIO,GAAkC,CAAA,EAClCC,GAGJ,MAAMC,GAAgBtQ,EAAAA,cAA6B,IAAI,EACjDuQ,GAAsBvQ,EAAAA,cAAqC,IAAM,CAAC,CAAC,EAEnEwQ,OAAqD,IAE9CC,GAAkBC,GAA4B,CACvDF,GAAqB,IAAIE,CAAE,EACvBL,IAAeK,EAAGL,GAAe,IAAI,CAC7C,EAKaM,GAAkB,CAAC,CACG,SAAAvO,EACA,cAAAwO,EACA,WAAAC,CACJ,IAIzB,CACF,KAAM,CAAChQ,EAAQiQ,CAAS,EAAInO,EAAAA,SAAiBoO,GAAWH,EAAeC,CAAU,CAAC,EAC5EG,EAAgBC,EAAAA,OAAsB,IAAI,EAEhDxN,OAAAA,EAAAA,UAAU,IAAM,CACZ,MAAMsH,EAAOiG,EAAc,QAE3B,GAAIjG,IAASlK,EAAQ,CACjBwP,GAAgBxP,EAChB,UAAWqQ,KAAWV,GAClBU,EAAQrQ,EAAQkK,CAAI,CAE5B,CAEAiG,EAAc,QAAUnQ,CAC5B,EAAG,CAACA,CAAM,CAAC,kBAGNyP,GAAc,SAAd,CAAuB,MAAOzP,GAC3B2D,EAAA,cAAC+L,GAAoB,SAApB,CAA6B,MAAOO,CAAA,EACjCtM,EAAA,cAACgL,GAAA,KACIpN,CACL,CACJ,CACJ,CAER,EAEM2O,GAAa,CAACH,EAAuBC,IAAiC,CACxE,MAAMM,EAAc,SAAY,CAC5B,GAAKN,EAIL,GAAI,CACA,MAAMO,EAAiB,MAAMC,GAAUR,CAAU,EACjDT,GAAgB,CAACQ,EAAe,GAAGQ,CAAc,EACjD,aAAa,QAAQ,UAAW,KAAK,UAAUhB,EAAa,CAAC,CACjE,MAAc,CACV,QAAQ,KAAK,sBAAuBS,CAAU,CAClD,CACJ,EAEA,OAAAT,GAAgB,CAACQ,CAAa,EAC9BP,GAAgBO,EAChBO,EAAA,EAEOd,EACX,EAEaiB,GAAY,IAAMjB,GCpJlBkB,GAAaC,GAAuB,CAC7C,GAAI,CAEA,MAAMC,EAAiBD,EAAM,MAAM,GAAG,EAGhCE,EAAiB,KAAKD,EAAe,CAAC,CAAC,EAG7C,OAAO,KAAK,MAAMC,CAAc,CACpC,OAASC,EAAO,CACZ,QAAQ,MAAM,0CAA2CA,CAAK,CAClE,CACJ,EACaC,GAAmBC,GAAuB,CACnD,GAAI,CAEA,UAAU,UAAU,UAAUA,CAAI,EAC7B,KAAK,IAAM,CACR,QAAQ,IAAI,wCAAyCA,CAAI,CAC7D,CAAC,EACA,MAAOC,GAAQ,CACZ,QAAQ,MAAM,4DAA6DA,CAAG,CAClF,CAAC,CACT,OAASA,EAAK,CACV,QAAQ,MAAM,gCAAiCA,CAAG,CACtD,CACJ,EAEaC,GAAY1V,GACd2V,GAAc3V,CAAI,EACpB,QAAQ,MAAO,EAAE,EACjB,QAAQ,MAAO,EAAE,EAGb2V,GAAiB3V,GACtBA,EACGA,EACF,WAAW,IAAK,GAAG,EACnB,WAAW,IAAK,GAAG,EACnB,WAAW,IAAK,GAAG,EACnB,YAAA,EACA,QAAQ,iBAAkB,EAAE,EAC5B,QAAQ,MAAO,GAAG,EAClB,QAAQ,OAAQ,GAAG,EARP,GAWR4V,GAAa5V,GAClB,OAAOA,GAAS,SAAiB,OAAOA,CAAI,EAC5C,OAAOA,GAAS,UAAkBA,EAAO,OAAS,QAClDA,EAEIA,EAAK,WAAW,GAAG,EACjBA,EAAK,UAAU,CAAC,EAChBA,EAJO,GAQRoC,GAAgB9B,GAClBsV,GAAUtV,CAAG,EACf,WAAW,IAAK,GAAG,EACnB,WAAW,IAAK,GAAG,EACnB,WAAW,IAAK,GAAG,EACnB,WAAW,IAAK,GAAG,EACnB,WAAW,IAAK,GAAG,EACnB,WAAW,IAAK,GAAG,EACnB,WAAW,IAAK,GAAG,EACnB,WAAW,IAAK,GAAG,EACnB,WAAW,IAAK,GAAG,EACnB,WAAW,IAAK,GAAG,EACnB,WAAW,IAAK,GAAG,EACnB,YAAA,EACA,QAAQ,iBAAkB,EAAE,EAC5B,QAAQ,WAAY,EAAE,EACtB,QAAQ,MAAO,GAAG,EAKduV,GAAW7V,GAAyB,CAE7C,GAAI,CAACA,EAAM,MAAO,GAGlBA,EAAOA,EAAK,QAAQ,MAAO,EAAE,EAG7B,MAAM8V,EAAW9V,EAAK,MAAM,GAAG,EAG/B,OAAA8V,EAAS,IAAA,EAGFA,EAAS,KAAK,GAAG,CAC5B,EAEA,eAAsBC,GAAMC,EAA2B,CACnD,OAAO,IAAI,QAAQC,GAAW,WAAWA,EAASD,CAAE,CAAC,CACzD,CAEO,SAASE,GAAMtD,EAAa9T,EAAiB,OAAgB,CAChE,MAAM0F,EAASyQ,GAAA,EACf,OACIzQ,GAAA,MAAAA,EAAQ,SACFA,EAAO,SAAW,mBAAmBoO,CAAG,EAAI,MAAQ9T,EACpD8T,CAEd,CAEO,SAASuD,GAAiBtL,EAAO,KAAM,CAC1C,MAAMuL,EAAY,KAAK,IAAA,EAAM,SAAS,EAAE,EAClCC,EAAYxL,GAAQ,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,UAAU,CAAC,EAEhE,MAAO,GAAGuL,CAAS,IAAIC,CAAS,EACpC,CAEO,SAASC,GAAa,EAAUC,EAAqC,CAGxE,IAAIC,EAAkB,EAAE,OACxB,GAAIA,EAAe,QAAQ,YAAA,IAAkBD,EAAQ,cACjD,OAAOC,EAIX,KAAOA,EAAe,YAAY,CAC9B,MAAMC,EAAgBD,EAAe,WACrC,GAAIC,EAAc,QAAQ,YAAA,IAAkBF,EAAQ,cAEhD,OAAOE,EAEXD,EAAiBC,CACrB,CAGA,OAAO,IACX,CAGO,MAAMC,GAAc,CAAC9U,EAAa+U,IAC9B/U,EAAI,MAAM+U,CAAG,EAAE,OAAS,EAGtBC,GAAsB,CAC/B7V,EACA8V,IAEO9V,EAAQ,QAAQ,WAAY,CAACrB,EAAeoX,IAA6B,CAC5E,MAAMpW,EAAQ,SAASoW,CAAgB,EACvC,OAAOD,EAAQnW,CAAK,GAAK,EAC7B,CAAC,EAAE,KAAA,EAIMqW,GAAkB,CAC3BC,EACAC,EACAhP,IACU,CACV,UAAWiP,KAAQF,EAAO,CACtB,MAAM1W,EAAMqV,GAAcwB,GAAiBD,EAAK,IAAKD,CAAU,CAAC,EAC1DtW,EAAQgV,GAAciB,GAAoBO,GAAiBD,EAAK,MAAOD,CAAU,EAAGhP,CAAM,CAAC,EAEjG,IAAMiP,EAAK,WAAa,MAAQA,EAAK,WAAa,MAAQ5W,IAAQK,GAC7DuW,EAAK,WAAa,MAAQ5W,IAAQK,GAClCuW,EAAK,WAAa,KAAO5W,EAAMK,GAC/BuW,EAAK,WAAa,KAAO5W,EAAMK,GAC/BuW,EAAK,WAAa,MAAQ5W,GAAOK,GACjCuW,EAAK,WAAa,MAAQ5W,GAAOK,GACjCuW,EAAK,WAAa,YAAc5W,EAAI,SAASK,CAAK,GAClDuW,EAAK,WAAa,gBAAkB,CAAC5W,EAAI,SAASK,CAAK,EACxD,MAAO,EAEf,CACA,MAAO,EACX,EAEayW,GAASxV,GAAgB,CAClC,MAAMyV,EAAqB,CAAA,EAC3B,QAAShX,EAAI,EAAGA,EAAI,IAAKA,IAAK,CAC1B,IAAI6H,EAAI7H,EACR,QAASiX,EAAI,EAAGA,EAAI,EAAGA,IACfpP,EAAI,EACJA,EAAI,WAAcA,IAAM,EAExBA,EAAIA,IAAM,EAGlBmP,EAAShX,CAAC,EAAI6H,CAClB,CAEA,IAAIqP,EAAM,GAEV,QAASlX,EAAI,EAAGA,EAAIuB,EAAI,OAAQvB,IAC5BkX,EAAOA,IAAQ,EAAKF,GAAUE,EAAM3V,EAAI,WAAWvB,CAAC,GAAK,GAAI,EAGjE,OAAQkX,EAAO,MAAS,CAC5B,EAEaC,GAAW5V,GACfA,EACEA,EAAI,OAAO,CAAC,EAAE,cAAgBA,EAAI,MAAM,CAAC,EAD/B,GAIR6V,GAAeC,GAAiE,CACzF,GAAI,CAACA,EAAW,OAAQ,OAExB,MAAMC,EAAiB,SAAS,uBAAA,EAEhCD,EAAW,QAAQ,CAAC,CAAE,IAAAE,EAAK,MAAAC,EAAO,GAAGC,KAAY,CAC7C,GAAI,CAACF,EAAK,OAEV,MAAMG,EAAgB,SAAS,cAAc,QAAQ,EACrDA,EAAc,aAAa,MAAOH,CAAG,EACrC,OAAO,QAAQE,CAAK,EAAE,QAAQ,CAAC,CAACxX,EAAKK,CAAK,IAAM,CAC5CoX,EAAc,aAAazX,EAAKK,CAAK,CACzC,CAAC,EAEGkX,IACAE,EAAc,OAAS,IAAM,SAAS,KAAK,YAAYA,CAAa,GAGxEJ,EAAe,YAAYI,CAAa,CAC5C,CAAC,EAED,SAAS,KAAK,YAAYJ,CAAc,CAC5C,EAEaK,GAAmB,CAC5BC,EACAC,IACyB,CACzB,MAAMvV,EAAiC,CAAA,EAEvC,UAAWrC,KAAO2X,EACVA,EAAK,eAAe3X,CAAG,GAAKA,KAAO4X,IACnCvV,EAAOrC,CAAG,EAAI2X,EAAK3X,CAAG,GAI9B,OAAOqC,CACX,EAEawU,GAAmB,CAC5BpW,EACAkW,MAEgBlW,EAAQ,MAAM,UAAU,GAAK,CAAA,GAErC,QAAQrB,GAAS,CACrB,MAAMY,EAAMZ,EAAM,MAAM,EAAG,EAAE,EAAE,MAAM,GAAG,EAClCyY,EAAU7X,EAAI,CAAC,EACf8X,EAAW9X,EAAI,CAAC,EAGhBK,GAASyX,GAAY,OAAOvX,GAAUuX,CAAQ,GAAM,WACpDvX,GAAUuX,CAAQ,EAAEnB,EAAWkB,CAAO,CAAC,EACvClB,EAAWkB,CAAO,IAClB,GAENpX,EAAUA,EAAQ,WAAWrB,EAAOiB,CAAK,CAC7C,CAAC,EAEMI,GAKEsX,GAAc,CAAIC,EAAYhY,IAAuB,CAC9D,GAAKA,EAEE,CACH,MAAMiY,MAAW,IACjB,OAAOD,EAAM,OAAQrK,GAAY,CAC7B,MAAMtN,EAAQsN,EAAK3N,CAAG,EACtB,OAAKiY,EAAK,IAAI5X,CAAK,EAIZ,IAHH4X,EAAK,IAAI5X,CAAK,EACP,GAGf,CAAC,CACL,KAXI,OAAO,CAAC,GAAG,IAAI,IAAI2X,CAAK,CAAC,CAYjC,EAEaE,GAAWC,GACSA,GAAS,MAAQA,IAAS,IAAMA,IAAS,IAASA,IAAS,KAAOA,IAAS,GAAM,OAAOA,GAAS,UAAY,OAAO,KAAKA,CAAI,EAAE,SAAW,EAG3K,SAASC,GAAiB/X,EAAU4X,EAAiC,IAAI,QAAc,CACnF,GACI5X,GAAU,MAEV,OAAOA,GAAU,UACjBwH,EAAM,eAAexH,CAAK,EAE1B,OAAOA,EAGX,GAAIA,aAAiB,KACjB,OAAO,IAAI,KAAKA,EAAM,SAAS,EAGnC,GAAIA,aAAiB,OACjB,OAAO,IAAI,OAAOA,EAAM,OAAQA,EAAM,KAAK,EAG/C,GAAI4X,EAAK,IAAI5X,CAAK,EACd,OAAO4X,EAAK,IAAI5X,CAAK,EAGzB,GAAI,MAAM,QAAQA,CAAK,EAAG,CACtB,MAAMgY,EAAmB,CAAA,EACzB,OAAAJ,EAAK,IAAI5X,EAAOgY,CAAK,EACrBhY,EAAM,QAAQ,CAACsN,EAAMvN,IAAU,CAC3BiY,EAAMjY,CAAK,EAAIgY,GAAczK,EAAMsK,CAAI,CAC3C,CAAC,EACMI,CACX,CAEA,GAAIhY,aAAiB,IAAK,CACtB,MAAMgY,MAAY,IAClB,OAAAJ,EAAK,IAAI5X,EAAOgY,CAAK,EACrBhY,EAAM,QAAQ,CAACiY,EAAUC,IAAW,CAChCF,EAAM,IAAID,GAAcG,EAAQN,CAAI,EAAGG,GAAcE,EAAUL,CAAI,CAAC,CACxE,CAAC,EACMI,CACX,CAEA,GAAIhY,aAAiB,IAAK,CACtB,MAAMgY,MAAY,IAClB,OAAAJ,EAAK,IAAI5X,EAAOgY,CAAK,EACrBhY,EAAM,QAASmY,GAAU,CACrBH,EAAM,IAAID,GAAcI,EAAOP,CAAI,CAAC,CACxC,CAAC,EACMI,CACX,CAEA,MAAMI,EAAY,OAAO,eAAepY,CAAK,EAC7C,GAAIoY,GAAaA,IAAc,OAAO,UAClC,OAAOpY,EAGX,MAAMgY,EAAiC,CAAA,EACvC,OAAAJ,EAAK,IAAI5X,EAAOgY,CAAK,EAErB,OAAO,QAAQhY,CAAK,EAAE,QAAQ,CAAC,CAACL,EAAKwY,CAAK,IAAM,CAC5CH,EAAMrY,CAAG,EAAIoY,GAAcI,EAAOP,CAAI,CAC1C,CAAC,EAEMI,CACX,CAEO,SAASK,GAAajZ,EAAW,CACpC,GAAI,OAAO,iBAAoB,WAC3B,OAAO2Y,GAAc3Y,CAAG,EAG5B,GAAI,CACA,OAAO,gBAAgBA,CAAG,CAC9B,MAAQ,CACJ,OAAO2Y,GAAc3Y,CAAG,CAC5B,CACJ,CAGO,SAASkZ,GAAaC,EAA8C,CAOvE,OANe,OAAOA,GAAU,SAC1B,OAAO,KAAKA,EAAO,MAAM,EACzBA,aAAiB,YACb,OAAO,KAAK,IAAI,WAAWA,CAAK,CAAC,EACjC,OAAO,KAAKA,CAAK,GAGtB,SAAS,QAAQ,EACjB,QAAQ,MAAO,GAAG,EAClB,QAAQ,MAAO,GAAG,EAClB,QAAQ,MAAO,EAAE,CAC1B,CAEO,SAASC,GAAYC,EAAUC,EAAmB,CACrD,GAAID,IAAMC,EAAG,MAAO,GACpB,GAAID,EAAE,SAAWC,EAAE,OAAQ,MAAO,GAClC,QAAShZ,EAAI,EAAGA,EAAI+Y,EAAE,OAAQ/Y,IAC1B,GAAI+Y,EAAE/Y,CAAC,IAAMgZ,EAAEhZ,CAAC,EAAG,MAAO,GAE9B,MAAO,EACX,CAEO,SAASiZ,GAAY1X,EAAsB,CAC9C,OAAOA,EAAI,QAAQ,oBAAqB,GAAG,CAC/C,CAQO,SAAS6M,GAAqB,EAA6B8K,EAA2B,CACzF,MAAMtZ,EAAS,EAAE,OACXuZ,EAAgB,CAAC,EAAEvZ,EAAO,QAAQ,GAAG,GAAKA,EAAO,QAAQ,QAAQ,GAAKA,EAAO,QAAQ,OAAO,GAAKA,EAAO,QAAQ,UAAU,GAAKA,EAAO,QAAQ,QAAQ,GAC5J,OAAIsZ,EACOC,GAAiB,CAACvZ,EAAO,QAAQsZ,CAAO,EAE5CC,CACX,CAEO,MAAMC,GAAiBC,GAAqC,CAC/D,MAAMC,EAAQ,IAAI,WAAWD,CAAW,EACxC,IAAIE,EAAS,GACb,QAASvZ,EAAI,EAAGA,EAAIsZ,EAAM,WAAYtZ,IAClCuZ,GAAU,OAAO,aAAaD,EAAMtZ,CAAC,CAAC,EAE1C,OAAO,KAAKuZ,CAAM,CACtB,EAEaC,GAAe,CAACC,EAAgBzP,IAAmC,CAC5E,GAAI,CACA,MAAM0P,EAAiB,KAAKD,EAAO,MAAM,GAAG,EAAE,CAAC,CAAC,EAC1CE,EAAc,IAAI,MAAMD,EAAe,MAAM,EACnD,QAAS1Z,EAAI,EAAGA,EAAI0Z,EAAe,OAAQ1Z,IACvC2Z,EAAY3Z,CAAC,EAAI0Z,EAAe,WAAW1Z,CAAC,EAEhD,MAAM4Z,EAAY,IAAI,WAAWD,CAAW,EAC5C,OAAO,IAAI,KAAK,CAACC,CAAS,EAAG,CAAE,KAAA5P,EAAM,CACzC,OAASiL,EAAO,CACZ,QAAQ,KAAK,qCAAsCA,CAAK,EACxD,MACJ,CACJ,EAEa4E,GAAc,CAACJ,EAAgBzP,IAAqC,CAC7E,MAAM8P,EAAON,GAAaC,EAAQzP,CAAI,EACtC,OAAO8P,EAAO,IAAI,gBAAgBA,CAAI,EAAI,MAC9C,EAEaC,GAAiB,CAACC,EAAsBxP,IAAuB,CACxE,GAAI,GAACwP,GAAU,CAACxP,GAEhB,OAAOA,EAAK,MAAM,GAAG,EAAE,OAAO,CAACzK,EAAUR,IAAiBQ,GAAA,YAAAA,EAAMR,GAAOya,CAAM,CACjF,EAEaC,GAAeD,GAAiD,CACzE,MAAME,EAAuB,CAAA,EAE7B,GAAI,CAACF,EAAQ,OAAOE,EACpB,GAAIF,aAAkB,KAAM,MAAO,CAC/B,KAAMA,EAAO,KACb,KAAMA,EAAO,KACb,KAAMA,EAAO,KACb,aAAcA,EAAO,YAAA,EAEzB,SAAW,CAAC3U,EAAG9E,CAAC,IAAK,OAAO,QAAQyZ,CAAM,EACjC3U,IAED,MAAM,QAAQ9E,CAAC,EACf2Z,EAAQ7U,CAAC,EAAI9E,EACZ,IAAIqN,GAAQ,OAAOA,GAAS,SAAWqM,GAAYrM,CAAI,EAAIA,CAAI,EAC/D,OAAOA,GAAQA,IAAS,MAAS,EAC5BrN,GAAK,OAAOA,GAAM,SACxB2Z,EAAQ7U,CAAC,EAAI4U,GAAY1Z,CAAC,EACnBA,IAAM,SACb2Z,EAAQ7U,CAAC,EAAI9E,IAGrB,OAAO2Z,CACX,EAEaC,GAAiB7Z,GACtBA,GAAU,MAA+BA,IAAU,IAAM,OAAOA,GAAU,SAAiBA,EAC3F,kBAAkB,KAAKA,CAAK,EAAUA,EAAM,gBAAkB,OAC9D,SAAS,KAAKA,CAAK,EAAUA,EAC7B,kBAAkB,KAAKA,CAAK,EAAU,OAAOA,CAAK,EAC/CA,EAAM,KAAA,ECvdjB,SAAS8Z,GAAmBC,EAAuB,CAC/C,KAAM,CAAE,KAAAC,EAAM,QAAAC,CAAA,EAAYF,EACpBG,GAAcD,GAAA,YAAAA,EAAU,kBAAmB,GAMjD,OAJ4B,MAAM,QAAQD,CAAI,GAAK,OAAOA,GAAS,SAC7D,CAAC,mBAAoB,oCAAqC,qBAAqB,EAC/E,CAAC,aAAc,WAAW,GAER,SAASE,CAAW,EACjCA,EAGJ,OAAOF,GAAS,SACjB,mBACA,OAAOA,GAAS,UAAYA,EAAK,WAAW,GAAG,EAC3C,YACA,YACd,CAEA,eAAsBG,GAClBlI,EACA8H,EAA+B,KACnB,OACZ,MAAMK,EAAuB,CACzB,SAAU,SACV,SAAQ1M,EAAAqM,GAAA,YAAAA,EAAS,SAAT,YAAArM,EAAiB,gBAAiB,MAC1C,SAASqM,GAAA,YAAAA,EAAS,UAAW,CAAA,CAAC,EAGlC,GAAIA,GAAA,MAAAA,EAAS,KACT,GAAI,CAAC,MAAO,MAAM,EAAE,SAASK,EAAQ,MAAgB,EACjDnI,IAAQA,EAAI,SAAS,GAAG,EAAI,IAAM,KAAO,IAAI,gBAAgB8H,EAAQ,IAAI,MAEzE,QAAQD,GAAmBC,CAAO,EAAA,CAC9B,IAAK,mBACDK,EAAQ,KAAO,KAAK,UAAUL,EAAQ,IAAI,EAC1C,MAEJ,IAAK,oCACDK,EAAQ,KAAO,IAAI,gBAAgBL,EAAQ,IAAI,EAC/C,MAEJ,IAAK,sBAAuB,CACxB,MAAMM,EAAW,IAAI,SACfL,EAAOD,EAAQ,KACrB,UAAWpa,KAAOqa,EACdK,EAAS,OAAO1a,EAAKqa,EAAKra,CAAG,CAAC,EAElCya,EAAQ,KAAOC,EACf,KACJ,CACA,IAAK,YACL,IAAK,aACD,GAAI,OAAON,EAAQ,MAAS,SACxB,MAAM,IAAI,MAAM,yEAAyE,EAG7FK,EAAQ,KAAOL,EAAQ,KACvB,MACJ,QACI,MAAM,IAAI,MAAM,iCAAiC,CAAA,CAMjE,OAAO,MAAM9H,EAAKmI,CAAO,EACpB,KAAKE,GAAY,SACd,GAAI,CAACA,EAAS,GACV,OAAOA,EAAS,KAAA,EAAO,KAAKzF,GAAQ,CAAE,KAAM,CAAE,SAAAyF,EAAU,KAAAzF,CAAA,CAAQ,CAAC,EAGrE,MAAM0F,GAAS7M,EAAAqM,GAAA,YAAAA,EAAS,UAAT,YAAArM,EAAmB,OAC5BwM,GAAc/I,EAAAmJ,EAAS,QAAQ,IAAI,cAAc,IAAnC,YAAAnJ,EAAsC,MAAM,KAAK,GACrE,OAAIoJ,GAAUA,EAAO,MAAM,GAAG,EAAE,CAAC,IAAML,EAC5BI,EAAS,KAAA,EAAO,KAAKzF,GAAQ,CAAE,KAAM,CAAE,SAAAyF,EAAU,KAAAzF,CAAA,CAAQ,CAAC,EAG9DyF,GAAA,MAAAA,EAAU,SAAWA,EAAS,QAAQ,IAAI,cAAc,IAAM,mBAC/DA,EAAS,OACTA,EAAS,KAAA,CACnB,CAAC,EACA,MAAM3F,GAAS,CACZ,GAAIA,EAAM,QACN,eAAQ,KAAK,UAAUA,EAAM,OAAO,GAAI1C,EAAKmI,CAAO,EAC7C,KAEX,KAAM,CAAE,SAAAE,EAAU,KAAAzF,CAAA,EAASF,EAC3B,SAAS6F,GAAc,WACnB,MAAMN,IAAcxM,EAAA4M,GAAA,YAAAA,EAAU,QAAQ,IAAI,kBAAtB,YAAA5M,EAAuC,MAAM,KAAK,KAAM,GAE5E,GAAIwM,IAAgB,qBAAuBrF,EAAK,WAAW,GAAG,GAAKA,EAAK,WAAW,GAAG,GAAI,CACtF,MAAM4F,EAAO,KAAK,MAAM5F,CAAI,EAC5B,eAAQ,KAAK,eAAgB5C,EAAKmI,EAASE,EAAS,OAAQG,CAAI,EACzDA,CACX,KAAO,CACH,MAAMF,IAASG,GAAAvJ,EAAA4I,GAAA,YAAAA,EAAS,UAAT,YAAA5I,EAAmB,SAAnB,YAAAuJ,EAA8B,MAAM,KAAK,KAAM,GAExDC,EAAmBJ,IAAWL,EAC9B,uEAAyEK,EAAS,mBAAqBL,EAAc,IACrHK,IAAW,mBACP,qEACA,KAEV,eAAQ,KAAK,UAAUI,CAAgB,GAAI1I,EAAKmI,EAASE,EAAS,OAAQzF,CAAI,EACtE8F,GAAoBJ,IAAW,mBAC7B,CAAC,MAAO1F,EAAM,OAAQ,KACtBA,CAEd,CACJ,CAEA,MAAM2F,EAAA,CACV,CAAC,CACT,CAEA,eAAsBnG,GAClBpC,EACA8H,EAA+B,KACnB,CACZ,OAAOI,GAAUlI,EAAK,CAClB,GAAG8H,EACH,QAAS,CACL,OAAU,mBACV,eAAgB,mBAChB,GAAGA,GAAA,YAAAA,EAAS,OAAA,CAChB,CACH,EACA,KAAKO,GAAY,CACd,GAAIA,GAAA,MAAAA,EAAU,MACV,MAAMA,EAEV,OAAOA,CACX,CAAC,CACL,CAEA,eAAsBM,GAClB3I,EACA8H,EAAuB,CAAA,EACvBc,EAAqB,EACrBC,EAA0B,CAAC,GAAG,EACP,CACvB,OAAO,MAAM7I,EAAK8H,CAAO,EACpB,KAAKO,GACEA,EAAS,GACFA,EAAS,KAAA,EAGhB,CAACQ,EAAc,SAASR,EAAS,MAAM,GAAKO,EAAa,GACzD,QAAQ,IAAI,cAAeA,EAAY5I,EAAK8H,CAAO,EAE5C3E,GAAM,GAAG,EACX,KAAK,IAAMwF,GAAe3I,EAAK8H,EAASc,EAAa,CAAC,CAAC,IAGhE,QAAQ,MAAMP,CAAQ,EACfA,EAEV,EACA,MAAOxF,GAAQ,QAAQ,MAAMA,EAAK,yBAAyB,CAAC,CACrE,CCzIO,MAAMiG,GAAkB,MAClBC,GAAqB,cACrBC,GAAuB,gBACvBC,GAAoB,aACpBC,GAAqB,cACrBC,GAAqB,cACrBC,GAAkB,WAClBC,GAAmB,YACnBC,GAAkB,WAClBC,GAA4B,sBAC5BC,GAA8B,wBAC9BC,GAA2B,qBAC3BC,GAA4B,sBAC5BC,GAAkB,WAEzBC,GAAwBC,GAAiC,CAC3D,OAAQA,EAAA,CACJ,IAAK,UAAW,OAAOd,GACvB,IAAK,YAAa,OAAOC,GACzB,IAAK,SAAU,OAAOC,GACtB,IAAK,UAAW,OAAOC,GACvB,IAAK,UAAW,OAAOC,GACvB,IAAK,OAAQ,OAAOC,GACpB,IAAK,QAAS,OAAOC,GACrB,IAAK,OAAQ,OAAOC,GACpB,IAAK,kBAAmB,OAAOC,GAC/B,IAAK,oBAAqB,OAAOC,GACjC,IAAK,iBAAkB,OAAOC,GAC9B,IAAK,kBAAmB,OAAOC,GAC/B,IAAK,OAAQ,OAAOC,GACpB,QAAS,MAAO,CAExB,EAEaG,GAAgB,CAAC,CAC1B,QAAA9T,EACA,KAAAiK,EAAkB,OAClB,MAAA7F,EAAkB,OAClB,MAAA7C,EAAkB,OAClB,MAAAwS,EAAkB,OAClB,SAAAxM,EAAkB,GAClB,WAAAyM,EAAkB,GAClB,IAAAxb,EAAkB,OAClB,KAAAE,EAAkB,OAClB,UAAAmJ,EAAkB,OAClB,UAAA/B,EAAkB,OAClB,UAAAgF,EAAkB,OAClB,MAAA/E,EAAkB,OAClB,aAAAkU,EAAkB,OAClB,QAAAJ,EAAkB,OAClB,OAAQnL,EAAe,MAC3B,EAAwB,KAAO,OAC3B,KAAM,CAACwL,EAAQC,CAAS,EAAIzW,EAAAA,SAASsW,CAAU,EACzC,CAACI,EAASC,CAAU,EAAI3W,EAAAA,SAAS6J,CAAQ,EACzC,CAAC+M,EAASC,CAAe,EAAI7W,EAAAA,SAAS,EAAE,EAExC8W,EAAcC,GAA+B,CAC/CF,EAAgBE,EAAQ,SAAW,EAAE,CACzC,EAEM/Y,EAAQ8D,EAAiB,EACzB9E,EAAS4M,GAAe8M,GAAWF,EAAQnU,EAAO2I,KAAgBjD,EAAA/J,EAAM,cAAc,SAApB,YAAA+J,EAA4B,QAAS,OAAO,EAC9GiP,EAAqBT,IAAiBK,IAAY,OAAOlQ,GAAU,SAAW,GAAGA,CAAK,MAAQA,IAEpG5F,EAAAA,UAAU,IAAM,CACZ2V,EAAUH,CAAU,EACpBK,EAAW9M,CAAQ,CACvB,EAAG,CAACyM,EAAYzM,CAAQ,CAAC,EAEzB,MAAMkC,EACFlK,EAAA,cAAC,SAAA,CACG,MAAAwU,EACA,UAAWjT,EACPgS,GACAe,EAAUD,GAAqBC,CAAO,EAAK/T,GAAapE,EAAM,cAAc,UAC5EmY,EAAU/T,EAAY,OACtBoU,GAAU,mBAAA,EAEd,MAAOxZ,EAAO,MACd,SAAU0Z,GAAWF,EACpB,GAAGxZ,EAAO,cACX,QAAS,MAAOkL,GAAM,CAClBA,EAAE,gBAAA,EACFyO,EAAW,EAAI,EACfF,EAAU,EAAI,EACd,MAAMnU,GAAA,YAAAA,EAAU4F,EAAG4O,IACnBL,EAAU,EAAK,EACfE,EAAW,EAAK,CACpB,CAAA,EAECH,GAAU3U,EAAA,cAAAA,EAAA,SAAA,KACPA,EAAA,cAAC,OAAA,CAAK,UAAWuB,EAAG4T,GAAsB,OAAQ,6FAA6F,EAAG,EACjJA,GAAsBnV,EAAA,cAAC,OAAA,KAAMmV,CAAmB,CACrD,EACEzK,GAAQ,CAACiK,GAAW3U,EAAA,cAAC0E,EAAA,CAAK,KAAMgG,EAAM,UAAWnJ,EAAGsD,GAAS,OAAQU,CAAS,CAAA,CAAG,EAClF,CAACoP,GAAU9P,CAAA,EAIpB,OACI7E,EAAA,cAACM,EAAA,CAAQ,UAAWgC,CAAA,EACfrJ,EACD+G,EAAA,cAAC+B,GAAA,CAAa,MAAQ4S,EAAiB,OAAR3S,GAAoBkI,CAAO,EACzD/Q,CACL,CAER,EAEaic,GAAe,CAAC,CACzB,QAAA3U,EACA,KAAAiK,EAAkB,OAClB,MAAA7F,EAAkB,OAClB,MAAA7C,EAAkB,OAClB,MAAAwS,EAAkB,OAClB,SAAAxM,EAAkB,GAClB,IAAA/O,EAAkB,OAClB,KAAAE,EAAkB,OAClB,UAAAmJ,EAAkB,OAClB,UAAA/B,EAAkB,OAClB,UAAAgF,EAAkB,OAClB,MAAA/E,EAAkB,OAClB,QAAA8T,EAAkB,OAClB,OAAQnL,EAAe,MAC3B,EAAa,KAAO,OAChB,MAAMhN,EAAQ8D,EAAiB,EACzB9E,EAAS4M,GAAeC,EAAUxH,EAAO2I,KAAgBjD,EAAA/J,EAAM,aAAa,SAAnB,YAAA+J,EAA2B,QAAS,OAAO,EACpGgE,EACFlK,EAAA,cAAC,SAAA,CACG,MAAAwU,EACA,UAAWjT,EACPgS,GACAe,EAAUD,GAAqBC,CAAO,EAAK/T,GAAapE,EAAM,aAAa,UAC3EmY,EAAU/T,EAAY,MAAA,EAE1B,MAAOpF,EAAO,MACd,SAAA6M,EACC,GAAG7M,EAAO,cACX,QAAUkL,GAAM,CACZA,EAAE,eAAA,EACFA,EAAE,gBAAA,EACF5F,GAAA,MAAAA,EAAU4F,EACd,CAAA,EAECqE,GAAQ1K,EAAA,cAAC0E,EAAA,CAAK,KAAMgG,EAAM,UAAWnJ,EAAGsD,GAAS,OAAQU,CAAS,CAAA,CAAG,EACrEV,CAAA,EAIT,OACI7E,EAAA,cAACM,EAAA,CAAQ,UAAWgC,CAAA,EACfrJ,EACD+G,EAAA,cAAC,OAAA,CACG,MAAOgI,EAAWwM,EAAQ,OAC1B,MAAOxM,EAAW,CAAE,OAAQ,cAAe,QAAS,eAAkB,MAAA,EAEtEhI,EAAA,cAAC+B,GAAA,CAAa,MAAAC,CAAA,EAAekI,CAAO,CAAA,EAEvC/Q,CACL,CAER,EAMakc,GAAW,CAAC,CACrB,MAAAxQ,EAAkB,UAClB,IAAA5L,EAAkB,OAClB,KAAAE,EAAkB,OAClB,UAAAmJ,EAAkB,OAClB,UAAA/B,EAAkB,MACtB,IAAqB,CACjB,MAAM+U,EAAWC,GAAAA,YAAA,EACXpZ,EAAQ8D,EAAiB,EAC/B,OACID,EAAA,cAACM,EAAA,CAAQ,UAAWgC,CAAA,EACfrJ,EACD+G,EAAA,cAAC,IAAA,CAAE,KAAK,IACL,UAAWuB,EAAGgS,GAAiBhT,GAAapE,EAAM,WAAW,SAAS,EACtE,QAAUkK,GAAM,CACZA,EAAE,eAAA,EACFiP,EAAS,EAAE,CACf,CAAA,EAEEzQ,CAAA,EAEJ1L,CACL,CAER,EAOaqc,GAAS,CAAC,CACnB,MAAA3Q,EACA,IAAA4F,EACA,IAAAxR,EAAkB,OAClB,KAAAE,EAAkB,OAClB,UAAAmJ,EAAkB,OAClB,UAAA/B,EAAkB,MACtB,KACkBN,EAAiB,EAG3BD,EAAA,cAACM,EAAA,CAAQ,UAAWgC,CAAA,EACfrJ,EACD+G,EAAA,cAAC,KAAA,CAAG,UAAWuB,EAAG,yBAA0BhB,CAAS,CAAA,EAChDsE,EAAQ,IACT7E,EAAA,cAAC,IAAA,CAAE,KAAMyK,EAAK,OAAO,SAAS,IAAI,qBAAA,EAC9BzK,EAAA,cAAC0E,EAAA,CAAK,KAAK,gBAAgB,CAC/B,CACJ,EACCvL,CACL,GAWKsc,GAAY,CAAC,CACtB,MAAAjB,EACA,IAAA/J,EACA,SAAAiL,EACA,MAAAC,EACA,IAAA1c,EAAkB,OAClB,KAAAE,EAAkB,OAClB,UAAAmJ,EAAkB,OAClB,UAAA/B,EAAkB,MACtB,IAEQP,EAAA,cAACM,EAAA,CAAQ,UAAWgC,CAAA,EACfrJ,EACD+G,EAAA,cAAC,IAAA,CACG,KAAMyK,EACN,UAAWlJ,EAAG,OAAQhB,CAAS,EAC/B,OAAO,SACP,MAAAiU,EACA,IAAI,qBAAA,EAEJxU,EAAA,cAAC,MAAA,CAAI,IAAK0V,EAAU,MAAOC,GAAgB,MAAO,OAAO,KAAK,IAAKnB,CAAA,CAAO,CAAA,EAE7Erb,CACL,EClRFyc,GAAsBpa,EAAAA,cAA+C,IAAI,EAElEqa,GAAe,CAAC,CACzB,SAAA9O,EACA,WAAA+O,EACA,SAAAlY,CACJ,IACIoC,EAAA,cAAC4V,GAAoB,SAApB,CAA6B,MAAO,CAAE,SAAA7O,EAAU,WAAA+O,CAAA,CAAW,EACvDlY,CACL,EAGSmY,GAAmBrT,GAAuC,CACnE,MAAMsT,EAAM7V,EAAAA,WAAWyV,EAAmB,EAC1C,GAAI,CAACI,EAAK,MAAM,IAAI,MAAM,8DAA8D,EACxF,MAAM7d,EAAMuK,GAAQsT,EAAI,WAClBpS,EAAWoS,EAAI,SAAS7d,CAAG,EACjC,GAAI,CAACyL,EAAU,MAAM,IAAI,MAAM,iBAAiBzL,CAAG,mCAAmC,OAAO,KAAK6d,EAAI,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,EAC5H,OAAOpS,CACX,ECZM/L,GAAkB,CAEpB,SAAWA,GACUA,EAAK,MAAM,GAAG,EAAE,OAAO,OAAO,EAC/B,OAAS,GAI7B,QAAUA,GAAS,CACf,MAAMU,EAAQV,EAAK,YAAY,GAAG,EAClC,OAAOU,EAAQ,EAAIV,EAAK,MAAMU,CAAK,EAAI,EAC3C,EAGA,QAAUV,GAAS,CACf,MAAM8V,EAAW9V,EAAK,MAAM,GAAG,EAAE,OAAO,OAAO,EAC/C,OAAA8V,EAAS,IAAA,EACF,IAAMA,EAAS,KAAK,GAAG,CAClC,EAGA,SAAW9V,GAAS,CAChB,MAAMyP,EAAOzP,EAAK,MAAM,GAAG,EAAE,OAAS,GAChCoe,EAAM3O,EAAK,SAAS,GAAG,EAAIA,EAAK,MAAMA,EAAK,YAAY,GAAG,CAAC,EAAI,GACrE,OAAOA,EAAK,QAAQ2O,EAAK,EAAE,CAC/B,EAGA,eAAiBpe,GAAS,CACtB,MAAM8V,EAAW9V,EAAK,MAAM,GAAG,EAAE,OAAO,OAAO,EAC/C,OAAA8V,EAAS,IAAA,EACFA,EAAS,OAAS,EAC7B,EAGA,cAAgB9V,GAAS,CACrB,MAAM8V,EAAW9V,EAAK,MAAM,GAAG,EAAE,OAAO,OAAO,EAC/C,OAAA8V,EAAS,IAAA,EACTA,EAAS,IAAA,EACF,IAAMA,EAAS,KAAK,GAAG,CAClC,EAGA,eAAiB9V,GAAS,CACtB,MAAM8V,EAAW9V,EAAK,MAAM,GAAG,EAAE,OAAO,OAAO,EAC/C8V,EAAS,IAAA,EACT,MAAMuI,EAAavI,EAAS,IAAA,GAAS,GAC/BsI,EAAMC,EAAW,SAAS,GAAG,EAAIA,EAAW,MAAMA,EAAW,YAAY,GAAG,CAAC,EAAI,GACvF,OAAOA,EAAW,QAAQD,EAAK,EAAE,CACrC,EAGA,OAAQ,CAACpe,EAAMse,IAAW,CACtB,MAAMC,EAAMve,EAAK,MAAM,GAAG,EAAE,MAAM,EAAG,EAAE,EAAE,KAAK,GAAG,EAC3CyP,EAAOzP,EAAK,MAAM,GAAG,EAAE,OAAS,GAChCoe,EAAM3O,EAAK,SAAS,GAAG,EAAIA,EAAK,MAAMA,EAAK,YAAY,GAAG,CAAC,EAAI,GAC/D5E,EAAO4E,EAAK,QAAQ2O,EAAK,EAAE,EACjC,OAAQG,EAAMA,EAAM,IAAM,IAAM1T,EAAOyT,EAASF,CACpD,EAGA,QAAS,CAACpe,EAAMwe,IAAW,CACvB,MAAMD,EAAMve,EAAK,MAAM,GAAG,EAAE,MAAM,EAAG,EAAE,EAAE,KAAK,GAAG,EAC3CyP,EAAOzP,EAAK,MAAM,GAAG,EAAE,OAAS,GAChCoe,EAAM3O,EAAK,SAAS,GAAG,EAAIA,EAAK,MAAMA,EAAK,YAAY,GAAG,CAAC,EAAI,GAC/D5E,EAAO4E,EAAK,QAAQ2O,EAAK,EAAE,EACjC,OAAQG,EAAMA,EAAM,IAAM,IAAMC,EAAS3T,EAAOuT,CACpD,EAGA,eAAgB,CAACpe,EAAM,CAAE,OAAAwe,EAAS,GAAI,OAAAF,EAAS,GAAI,IAAAF,EAAM,IAAA,EAAS,KAAO,CACrE,MAAMG,EAAMve,EAAK,MAAM,GAAG,EAAE,MAAM,EAAG,EAAE,EAAE,KAAK,GAAG,EAC3CyP,EAAOzP,EAAK,MAAM,GAAG,EAAE,OAAS,GAChCye,EAAahP,EAAK,SAAS,GAAG,EAAIA,EAAK,MAAMA,EAAK,YAAY,GAAG,CAAC,EAAI,GACtE5E,EAAO4E,EAAK,QAAQgP,EAAY,EAAE,EAElCC,EAASN,IAAQ,KAAQA,EAAOA,EAAI,WAAW,GAAG,EAAIA,EAAM,IAAMA,EAAO,GAAMK,EACrF,OAAQF,EAAMA,EAAM,IAAM,IAAMC,EAAS3T,EAAOyT,EAASI,CAC7D,EAGA,KAAM,IAAIC,IACCA,EAAM,KAAK,GAAG,EAAE,QAAQ,OAAQ,GAAG,EAI9C,MAAQC,GAAc,CAClB,MAAMR,EAAMpe,GAAK,QAAQ4e,CAAS,EAC5BnP,EAAOzP,GAAK,SAAS4e,CAAS,EAC9BL,EAAMve,GAAK,QAAQ4e,CAAS,EAC5BC,EAAOD,EAAU,WAAW,GAAG,EAAI,IAAM,GACzC/T,EAAO4E,EAAK,QAAQ2O,EAAK,EAAE,EAEjC,MAAO,CACH,KAAAS,EACA,IAAAN,EACA,KAAA9O,EACA,IAAA2O,EACA,KAAAvT,CAAA,CAER,CACJ,EC7FMiU,GAAc,CAAC,CACjB,IAAAlH,EACA,MAAAkG,EAAa,OACb,OAAAiB,EAAa,OACb,MAAApC,EAAa,OACb,IAAAqC,EAAa,OACb,IAAAC,EAAa,QACb,MAAA9U,EAAa,OACb,SAAA+U,EAAa,OACb,IAAA9d,EAAa,OACb,KAAAE,EAAa,OACb,UAAAmJ,EAAa,OACb,UAAA/B,EAAa,MACjB,IAAwB,iBACpB,MAAMpE,EAAQ8D,EAAgB,EACxB,CAAC+W,EAAQC,CAAS,EAAI9Y,EAAAA,SAASV,EAAgB,EAE/CyZ,IAA4BvN,GAAAzD,EAAA/J,EAAM,cAAN,YAAA+J,EAAmB,SAAnB,YAAAyD,EAA2B,QAAS,GAChEwN,IAA4BC,GAAAlE,EAAA/W,EAAM,cAAN,YAAA+W,EAAmB,SAAnB,YAAAkE,EAA2B,QAAS,GAChEC,EAAWF,IAAa,GAExBG,EAAanP,GAAe,OAAW+O,EAAU,EAAK,EACtD,CAACK,EAASC,CAAU,EAAIrZ,EAAAA,SAAS,EAAK,EACtCsZ,EAAa7P,GAAe2P,EAASJ,EAAU,EAAK,EAEpDO,EAAWjI,GAAMA,EAAI,MAAM,GAAG,EAAE,CAAC,EACjCkI,EAAa,WAAWD,CAAQ,GAChCE,EAAmB,wBAAwBF,CAAQ,GACnDG,EAAchB,GAAOrC,GAAS3c,GAAK,SAAS4X,GAAOhS,EAAgB,EAEzEwB,EAAAA,UAAU,IAAM,CACZ,GAAI,CAACwQ,GAAOA,EAAI,WAAW,OAAO,EAAG,CACjCwH,EAAUxH,GAAOhS,EAAgB,EACjC,MACJ,CAEA,MAAMuF,EAAS,aAAa,QAAQ2U,CAAU,EAC9C,GAAI3U,EAAQ,CACRiU,EAAUjU,CAAM,EAChB,MACJ,CAEAiU,EAAUxH,CAAG,EAEb,MAAMqI,EAAW,OAAO,aAAa,QAAQF,CAAgB,GAAK,CAAC,EAC/DE,GAAY,KAAK,IAAA,EAAQA,EAAW,GAAK,GAAK,GAAK,KAIvD,MAAMrI,CAAG,EACJ,KAAKsI,GAAO,CACT,GAAI,CAACA,EAAI,GAAI,MAAM,IAAI,MAAM,QAAQA,EAAI,MAAM,EAAE,EACjD,OAAOA,EAAI,KAAA,CACf,CAAC,EACA,KAAK/F,GAAQ,CACV,MAAMgG,EAAS,IAAI,WACnBA,EAAO,UAAY,IAAM,CACrB,MAAM1H,EAAO0H,EAAO,OACpB,aAAa,QAAQL,EAAYrH,CAAI,EACrC,aAAa,WAAWsH,CAAgB,EACxCX,EAAU3G,CAAI,CAClB,EACA0H,EAAO,cAAchG,CAAI,CAC7B,CAAC,EACA,MAAM1E,GAAO,CACV,QAAQ,KAAK,eAAgBA,EAAI,OAAO,EACxC,aAAa,QAAQsK,EAAkB,OAAO,KAAK,IAAA,CAAK,CAAC,CAC7D,CAAC,CACT,EAAG,CAACnI,EAAKkI,EAAYC,CAAgB,CAAC,EAEtC,MAAMjT,EAAOgR,GAASiB,GAAU,OAC1BqB,EAAgC,CAClC,GAAItC,GAASiB,EACP,CAAE,MAAAjB,EAAO,OAAAiB,EAAQ,UAAWE,GAC5BnS,EACI,CAAE,MAAOA,EAAM,OAAQA,EAAM,UAAWmS,GACxC,CAAE,UAAWA,CAAA,EACvB,GAAIO,EAAWI,EAAa,CAAA,CAAC,EAGjC,uBACKnX,EAAA,CAAQ,UAAWiB,EAAG,0BAA2Be,KAAa4V,EAAA/b,EAAM,cAAN,YAAA+b,EAAmB,UAAS,CAAA,EACtFjf,GAAO+G,EAAA,cAAC,MAAA,CAAI,UAAU,wBAAwB/G,CAAI,EACnD+G,EAAA,cAAC,MAAA,CACG,UAAWuB,EAAG,oBAAqB8V,GAAY,iBAAiB,EAChE,MAAOC,EACP,aAAcD,EAAW,IAAMG,EAAW,EAAI,EAAI,OAClD,aAAcH,EAAW,IAAMG,EAAW,EAAK,EAAI,MAAA,EAEnDxX,EAAA,cAAC,MAAA,CACG,IAAKgX,EACL,IAAKa,EACL,MAAOlC,GAAShR,EAChB,OAAQiS,GAAUjS,EAClB,UAAWpD,EAAGhB,KAAa4X,EAAAhc,EAAM,cAAN,YAAAgc,EAAmB,UAAS,EACvD,MAAA3D,EACA,MAAOyD,EACP,QAAS,IAAMhB,EAAUxZ,EAAgB,CAAA,CAAA,EAE5CuE,GACGhC,EAAA,cAAC,OAAA,CAAK,UAAWuB,EACb,mFACA,UAAYS,EAAM,MAAQ,WAC1B,CAACA,EAAM,SAAW,qCAClBA,EAAM,SAAA,CACV,EACKA,EAAM,OACX,EAEH+U,GAAY/W,EAAA,cAAC,MAAA,CAAI,UAAU,4BAA4B+W,CAAS,CAAA,EAEpE5d,GAAQ6G,EAAA,cAAC,OAAI,UAAU,uBAAuB7G,CAAK,CACxD,CAER,EC9Haif,GAAiB,CAC1B/b,EACAgc,EACAhC,EAAS,KACEgC,EACV,OAAQlgB,GAAQ,CACb,MAAMK,EAAQ6D,GAAA,YAAAA,EAASlE,GACvB,OAA8BK,GAAU,MAAQA,IAAU,EAC9D,CAAC,EACA,IAAKL,GAAQ,GAAGke,CAAM,GAAGle,CAAG,EAAE,EAEtBmgB,GAA2B,CACpC1U,EACA2U,KAC8B,CAC9B,WAAYA,EAAY,SAAW,EACnC,YAAAA,EACA,OAAQA,EAAY,OACd,GAAG3U,CAAQ,gCAAgC2U,EAAY,KAAK,IAAI,CAAC,IACjE,MACV,GAEaC,GAAgC,CACzC5U,EACA6U,EAAe,aACc,CAC7B,GAAI,CAAC7U,EACD,MAAO,CACH,WAAY,GACZ,OAAQ,GAAG6U,CAAY,qBAAA,EAI/B,GAAI7U,EAAS,sBACT,OAAOA,EAAS,sBAAA,EAGpB,GAAIA,EAAS,aAAc,CACvB,MAAM8U,EAAa9U,EAAS,aAAA,EAC5B,MAAO,CACH,WAAA8U,EACA,OAAQA,EAAa,OAAY,GAAGD,CAAY,qBAAA,CAExD,CAEA,MAAO,CAAE,WAAY,EAAA,CACzB,EC5BaE,GAAoB,gBAC3BC,GAAS,QAEf,SAASC,IAA+B,CACpC,MAAM1I,EAAQ,IAAI,YAAY,EAAM,EACpC,cAAO,OAAO,gBAAgBA,CAAK,EAC5B,MAAM,KAAKA,EAAQ2I,GAAS,IAAIA,EAAI,SAAS,EAAE,CAAC,GAAI,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAClF,CAEA,eAAeC,GAAsBC,EAAuC,CAExE,MAAM1I,EADU,IAAI,YAAA,EACC,OAAO0I,CAAY,EAClCC,EAAS,MAAM,OAAO,OAAO,OAAO,OAAO,UAAW3I,CAAI,EAChE,OAAO,KAAK,OAAO,aAAa,GAAG,IAAI,WAAW2I,CAAM,CAAC,CAAC,EACrD,QAAQ,MAAO,GAAG,EAClB,QAAQ,MAAO,GAAG,EAClB,QAAQ,MAAO,EAAE,CAC1B,CAEA,MAAMC,GAAiB,CAACC,EAAiBC,EAAoBzD,IAAkB,CAC3E,MAAM0D,EAAO,OAAO,OAAO,MAAQ,EAAI1D,EAAQ,EACzC2D,EAAM,OAAO,OAAO,OAAS,EAAI3D,EAAQ,EACzCpD,EAAU,SAASoD,CAAK,WAAWA,CAAK,QAAQ2D,CAAG,SAASD,CAAI,GACtE,OAAO,OAAO,KAAKF,EAASC,EAAY7G,CAAO,CACnD,EAEO,SAASgH,GAAmB,CAC/B,WAAAC,EACA,SAAAC,EACA,OAAAC,EAAS,OACT,iBAAAC,EAAmB,aACvB,EAKG,CACC,MAAMX,EAAeH,GAAA,EACrB,aAAa,QAAQ,gBAAiB,KAAK,UAAU,CACjD,WAAAW,EACA,SAAAC,EACA,aAAAT,CAAA,CACH,CAAC,EAEFD,GAAsBC,CAAY,EAAE,KAAMY,GAAkB,CACxD,MAAMjf,EAAS,IAAI,gBAAgB,CAC/B,cAAe,OACf,UAAW8e,EACX,aAAc,GAAG,OAAO,SAAS,MAAM,GAAGd,EAAiB,GAC3D,MAAOe,EAASA,EAAO,KAAK,GAAG,EAAI,GACnC,eAAgBE,EAChB,sBAAuB,OACvB,CAACD,CAAgB,EAAG,SAAA,CACvB,EACDT,GAAe,WAAWM,CAAU,cAAc7e,EAAO,UAAU,GAAI,OAAQ,GAAG,CACtF,CAAC,CACL,CAEA,MAAMkf,GAAW,CAACL,EAAoBC,EAAkBK,IAAsC,CAC1FxO,GAAc,CACV,CAACmO,CAAQ,EAAG,CACR,GAAGK,EACH,OAAQN,EACR,UAAWC,EACX,IAAK,KAAK,MAAM,KAAK,IAAA,EAAQ,GAAI,CAAA,CACrC,EACDb,EAAM,CACb,EAEMmB,GAAY,IAAM,CACpB,MAAMC,EAAWC,GAAAA,cAAc,OAE/Bhb,OAAAA,EAAAA,UAAU,IAAM,CAGZ,MAAMib,EAFQ,IAAI,gBAAgBF,CAAQ,EAEvB,IAAI,MAAM,EASvBG,GARqB,CAAUhiB,EAAa6O,IAAgC,CAC9E,GAAI,CACA,OAAO,KAAK,MAAM,aAAa,QAAQ7O,CAAG,GAAK,EAAE,GAAK6O,CAC1D,MAAQ,CACJ,OAAOA,CACX,CACJ,GAEwD,eAAe,EACvE,GAAI,CAACkT,GAAQ,CAACC,EAAe,OAE7B,KAAM,CAAE,WAAAX,EAAY,SAAAC,EAAU,aAAAT,CAAA,EAAiBmB,EAC/CxH,GAAU,WAAW6G,CAAU,SAAU,CACrC,OAAQ,OACR,QAAS,CACL,eAAgB,mCAAA,EAEpB,KAAM,CACF,WAAY,qBACZ,UAAWC,EACX,KAAAS,EACA,aAAc,GAAG,OAAO,SAAS,MAAM,GAAGvB,EAAiB,GAC3D,cAAeK,CAAA,CACnB,CACH,EACI,KAAMc,GAAgC,CACnCD,GAASL,EAAYC,EAAUK,CAAY,EAC3C,aAAa,WAAW,eAAe,EACvC,OAAO,MAAA,CACX,CAAC,EACA,MAAO3M,GAAU,QAAQ,MAAM,SAAUA,CAAK,CAAC,CACxD,EAAG,CAAC6M,CAAQ,CAAC,EAENha,EAAA,cAAC,WAAI,YAAU,CAC1B,EAEMoa,GAAqB,CAACZ,EAAoBC,EAAkBY,IACvD1H,GAAU,WAAW6G,CAAU,SAAU,CAC5C,OAAQ,OACR,QAAS,CACL,eAAgB,mCAAA,EAEpB,KAAM,CACF,WAAY,gBACZ,UAAWC,EACX,cAAAY,CAAA,CACJ,CACH,EACI,KAAMP,IACHD,GAASL,EAAYC,EAAUK,CAAY,EACpCA,EAAa,aACvB,EACA,MAAO3M,IACJ,QAAQ,MAAM,SAAUA,CAAK,EAC7B,aAAa,WAAWyL,EAAM,EACvB,KACV,EAGI0B,GAAiB,CAACb,EAAkBc,EAAQ,KAAkB,CACvE,KAAM,CAACC,CAAK,EAAI/O,GAAcmN,EAAM,EAC9B6B,GAAOD,GAAA,YAAAA,EAAQf,KAAa,CAAA,EAE5BiB,EAAY,KAAK,MAAM,KAAK,MAAQ,GAAI,IAAMD,GAAA,YAAAA,EAAM,MAAMA,GAAA,YAAAA,EAAM,YACtE,MAAO,CAAC,EAAEA,IAAQA,GAAA,MAAAA,EAAM,gBAAiB,CAACC,GAAcH,GAASG,GAAaD,EAAK,gBAAkBL,GAAmBK,EAAK,OAAQA,EAAK,UAAWA,EAAK,aAAa,GAAK,KAChL,EAEaE,GAAkBlB,GAAqB,CAChD,MAAMe,EAAQ7O,GAAciN,EAAM,EAClC,OAAO4B,GAAA,YAAAA,EAAQf,EACnB,EAEamB,GAAoBnB,GAA2B,CACxD,MAAMe,EAAQ7O,GAAciN,EAAM,GAAK,CAAA,EACnC4B,EAAMf,CAAQ,IACd,OAAOe,EAAMf,CAAQ,EACrBnO,GAAckP,EAAO5B,EAAM,EAEnC,EAEaiC,GAAkBpB,GAA6C,CACxE,MAAMgB,EAAOE,GAAelB,CAAQ,EAC9BiB,EAAY,KAAK,MAAM,KAAK,MAAQ,GAAI,GAAID,GAAA,YAAAA,EAAM,MAAMA,GAAA,YAAAA,EAAM,YAEpE,MAAI,CAACC,IAAaD,GAAA,MAAAA,EAAM,cACb,QAAQ,QAAQA,EAAK,YAAY,EAExCC,IAAaD,GAAA,MAAAA,EAAM,eACZL,GAAmBK,EAAK,OAAQA,EAAK,UAAWA,EAAK,aAAa,EAGtE,QAAQ,QAAQ,IAAI,CAC/B,EAcMK,GAAkBC,GACpBA,IAAW,WAAaA,IAAW,aAE1BC,GAAa,CAAC,CACvB,SAAApX,EACA,OAAAmX,EAAS,SACT,OAAAE,EAAS,SACT,OAAAvB,EAAS,OACT,WAAAwB,EAAa,UACb,YAAAC,EAAc,OACd,QAAA5I,EAAU,CAAA,EACV,MAAA1N,EAAQ,OACR,KAAA6F,EAAO,OACP,MAAA8J,EAAQ,OACR,UAAAjU,EAAY,OACZ,SAAAyH,EAAW,GACX,GAAG3P,CACP,IAAuB,CACnB,MAAMoiB,EAAO1E,GAAgBnS,CAAQ,EAC/BzH,EAAQ8D,EAAe,EACvBmb,EAAgBxX,GAAY,eAC5ByX,EAAwBrb,EAAM,YAChC,IAAMwY,GAA8BiC,EAAMW,CAAa,EACvD,CAACX,EAAMW,CAAa,CAAA,EAElBE,EAAqBtb,EAAM,QAC7B,IAAMqb,EAAA,EACN,CAACA,CAAqB,CAAA,EAEpBE,EAAeD,EAAmB,WAClC,CAACE,EAAMC,CAAO,EAAIzb,EAAM,SAA6B,IAAMub,EAAed,EAAK,QAAA,EAAY,IAAI,EAC/F,CAACiB,EAAeC,CAAgB,EAAI3b,EAAM,SAAkB,IAAA,OAAM,OAAAub,MAAiBrV,EAAAuU,EAAK,kBAAL,YAAAvU,EAAA,KAAAuU,KAA4B,CAAC,CAACA,EAAK,WAAU,EAChI,CAACmB,EAAYC,CAAa,EAAI7b,EAAM,SAAS,EAAK,EAClD8b,EAAqBR,EAAmB,QACvC,kBAAkBF,CAAa,6EAEtCpb,EAAM,UAAU,IAAM,OAElB,OADmBqb,IAAwB,YAQ3CI,EAAQhB,EAAK,SAAS,EACtBkB,IAAiBzV,EAAAuU,EAAK,kBAAL,YAAAvU,EAAA,KAAAuU,KAA4B,CAAC,CAACA,EAAK,SAAS,EACtDA,EAAK,aAAcsB,GAAa,OACnCN,EAAQM,CAAQ,EAChBJ,IAAiBzV,EAAAuU,EAAK,kBAAL,YAAAvU,EAAA,KAAAuU,KAA4B,CAAC,CAACsB,CAAQ,CAC3D,CAAC,IAXGN,EAAQ,IAAI,EACZE,EAAiB,EAAK,EACtBE,EAAc,EAAK,EACZ,IAAM,CAAC,EAStB,EAAG,CAACpB,EAAMY,CAAqB,CAAC,EAEhC,MAAMW,EAAe,IAAM,OACvB,GAAI,CAACX,EAAA,EAAwB,WAAY,CACrCI,EAAQ,IAAI,EACZE,EAAiB,EAAK,EACtB,MACJ,CAEA,MAAMI,EAAWtB,EAAK,QAAA,EACtBgB,EAAQM,CAAQ,EAChBJ,IAAiBzV,EAAAuU,EAAK,kBAAL,YAAAvU,EAAA,KAAAuU,KAA4B,CAAC,CAACsB,CAAQ,CAC3D,EAEME,EAAY,SAAY,CAC1B,GAAKZ,EAAA,EAAwB,WAE7B,IAAIP,GAAeC,CAAM,EAAG,CACxB,MAAMN,EAAK,QAAA,EACXuB,EAAA,EACA,MACJ,CAEA,GAAI,CAACvB,EAAK,OACN,MAAM,IAAI,MAAM,2CAA2C,EAG/D,MAAMA,EAAK,OAAO,CAAE,OAAAf,EAAQ,OAAAqB,EAAQ,EACpCiB,EAAA,EACJ,EAEME,EAAgB,CAClB,GAAG7jB,EACH,GAAGka,EACH,MAAOA,EAAQ,OAAS1N,IAAU6W,EAAgB,YAAcX,IAAW,SAAW,UAAY,WAClG,KAAMxI,EAAQ,MAAQ7H,IAASgR,EAAgB,OAAS,cACxD,MAAQH,EAAoChJ,EAAQ,OAASiC,EAAtCsH,EACvB,UAAWvJ,EAAQ,WAAahS,EAChC,SAAU,CAACgb,IAAiBhJ,EAAQ,UAAYvK,GAChD,MAAQuT,EAEFhJ,EAAQ,OAASla,EAAK,MADtB,CAAE,GAAIA,EAAK,OAAS,CAAA,EAAK,GAAIka,EAAQ,OAAS,CAAA,EAAK,QAAS,IAAM,OAAQ,aAAA,CACpD,EAGhC,GAAI0I,IAAW,SAAU,CACrB,MAAMkB,GAAcX,GAAA,YAAAA,EAAM,eAAeA,GAAA,YAAAA,EAAM,SAAUE,EAAgB,gBAAkB,WAE3F,OACI1b,EAAA,cAAC,MAAA,CACG,UAAWO,GAAapE,EAAM,OAAO,UACrC,MAAO,CAAE,SAAU,WAAY,QAAS,aAAA,EACxC,MAAQof,EAAoC,OAArBO,CAAqB,EAE5C9b,EAAA,cAAC,SAAA,CACG,KAAK,SACL,UAAU,8BACV,MAAQub,EAAoCY,EAArBL,EACvB,aAAYK,EACZ,SAAU,CAACZ,GAAgBvT,EAC3B,gBAAe,CAACuT,GAAgBvT,EAChC,MAAQuT,EAA0D,OAA3C,CAAE,QAAS,IAAM,OAAQ,eAChD,QAAUxR,GAAU,CAChBA,EAAM,eAAA,EACNA,EAAM,gBAAA,EACF,GAACwR,GAAgBvT,IACrB6T,EAAerjB,GAAU,CAACA,CAAK,CACnC,CAAA,EAEIwH,EAAA,cAAC2W,GAAA,CACG,KAAK6E,GAAA,YAAAA,EAAM,WAAY/d,GACvB,MAAQ8d,EAAoCY,EAArBL,EACvB,OAAQ,GACR,UAAWX,GAAehf,EAAM,OAAO,WAAA,CAAA,CAC3C,EAEPyf,GACG5b,EAAA,cAAC,MAAA,CACG,KAAK,OACL,UAAU,iIAAA,EAET,CAAC0b,GACE1b,EAAA,cAAC,SAAA,CACG,KAAK,SACL,KAAK,WACL,UAAU,wNACV,QAASic,CAAA,EAERpX,GAAS,SAAA,EAGjB6W,GACG1b,EAAA,cAAC,SAAA,CACG,KAAK,SACL,KAAK,WACL,UAAU,wNACV,QAAS,SAAY,CACjB,MAAMya,EAAK,QAAA,EACXuB,EAAA,EACAH,EAAc,EAAK,CACvB,CAAA,EAECX,GAAclb,EAAA,cAAC0E,EAAA,CAAK,KAAMwW,EAAY,UAAU,OAAO,EAAG,QAAA,CAE/D,CAER,CAIhB,CAEA,OACIlb,EAAA,cAACoV,GAAA,CACI,GAAG8G,EACJ,QAASD,CAAA,CAAA,CAGrB,ECnXMG,GAAsB5gB,EAAAA,cAA+C,IAAI,EAElE6gB,GAAe,CAAC,CACzB,SAAAtV,EACA,WAAA+O,EACA,SAAAlY,CACJ,IACIoC,EAAA,cAACoc,GAAoB,SAApB,CAA6B,MAAO,CAAE,SAAArV,EAAU,WAAA+O,CAAA,CAAW,EACvDlY,CACL,EAGS0e,GAAmB5Z,GAAuC,CACnE,MAAMsT,EAAM7V,EAAAA,WAAWic,EAAmB,EAC1C,GAAI,CAACpG,EAAK,MAAM,IAAI,MAAM,4CAA4C,EACtE,MAAM7d,EAAMuK,GAAQsT,EAAI,WAClBpS,EAAWoS,EAAI,SAAS7d,CAAG,EACjC,GAAI,CAACyL,EAAU,MAAM,IAAI,MAAM,iBAAiBzL,CAAG,mCAAmC,OAAO,KAAK6d,EAAI,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,EAC5H,OAAOpS,CACX,ECdA,SAAS2Y,GAAO,CACI,SAAA3e,EACA,KAAA4e,EAAkB,GAClB,KAAA9R,EAAkB,OAClB,MAAA8J,EAAkB,OAClB,YAAAiI,EAAkB,OAClB,IAAAxjB,EAAiB,OACjB,KAAAE,EAAiB,OACjB,UAAAmJ,EAAiB,OACjB,UAAA/B,EAAiB,MACrC,EAAgB,CACZ,MAAMpE,EAAQ8D,EAAiB,EAC/B,OAAAyK,EAAOA,GAAQvO,EAAM,OAAO,KAC5BqY,EAAQA,GAASrY,EAAM,OAAO,MAC9BsgB,EAAcA,GAAetgB,EAAM,OAAO,YAEnCqgB,kBACFlc,EAAA,CAAQ,UAAWgC,GAAanG,EAAM,OAAO,WAC1C6D,EAAA,cAAC,MAAA,CAAI,UAAW,aAAeO,GAAapE,EAAM,OAAO,WAAY,MAAO,CAAC,UAAW,QAAO,EAC3F6D,EAAA,cAAC,MAAA,CAAI,UAAU,yCACX,MAAO,CAAC,OAAO,GAAI,eAAgB,YAAa,WAAW,0BAAA,CAA0B,EACpF/G,GACCyR,GAAQ8J,GAASiI,IAAgBzc,EAAA,cAAC,MAAA,CAAI,UAAU,wCAAA,EAC7C0K,GAAQ1K,EAAA,cAAC,MAAA,CAAI,UAAW0K,CAAA,CAAM,EAC9B8J,GAASxU,EAAA,cAAC,KAAA,CAAG,UAAU,cAAA,EAAgBwU,CAAM,EAC7CiI,GAAezc,EAAA,cAAC,IAAA,CAAE,UAAU,MAAA,EAAQyc,CAAY,CACrD,EACCtjB,CAAA,EAEJyE,CACL,CACJ,EACAA,CACR,CC3BA,MAAM8e,GAAO,CAAC,CACV,SAAA9e,EACA,MAAA4W,EAAgB,OAChB,OAAA/L,EAAgB,OAChB,OAAAC,EAAgB,OAChB,WAAA+L,EAAgB,OAChB,UAAAkI,EAAgB,OAChB,UAAAra,EAAgB,OAChB,UAAA/B,EAAgB,OAChB,YAAA6E,EAAgB,OAChB,UAAAwX,EAAgB,OAChB,YAAA1T,EAAgB,MACpB,IAAiB,CACf,MAAM/M,EAAQ8D,EAAe,EAE7B,OACED,EAAA,cAACM,GAAQ,UAAWgC,GAAanG,EAAM,KAAK,SAAA,EACxC6D,EAAA,cAAC,MAAA,CAAI,UAAWuB,EAAG,OAAQhB,GAAapE,EAAM,KAAK,SAAS,CAAA,GACxDsM,GAAU+L,IACVxU,EAAA,cAAC,MAAA,CAAI,UAAWuB,EAAG,cAAe6D,GAAejJ,EAAM,KAAK,WAAW,CAAA,EAClEqY,kBAAS,KAAA,CAAG,UAAU,4DAAA,EAA8DA,CAAM,EAAQ,GAClG/L,CACL,EAGFzI,EAAA,cAAC,OAAI,UAAWuB,EAAG,YAAaqb,GAAazgB,EAAM,KAAK,SAAS,CAAA,EAC7D6D,EAAA,cAACuc,IAAO,KAAM9H,GAActY,EAAM,KAAK,UAAA,EACpCyB,CACH,CACJ,EACC8K,GAAU1I,EAAA,cAAC,MAAA,CAAI,UAAWuB,EAAG,cAAe2H,GAAe/M,EAAM,KAAK,WAAW,GAAIuM,CAAO,GAC3FiU,GAAaxgB,EAAM,KAAK,4BACvB,MAAA,CAAI,UAAU,cACb6D,EAAA,cAAC,MAAA,CAAI,UAAU,qBAAA,CAAsB,EACrCA,EAAA,cAAC,MAAA,CAAI,UAAU,sBAAA,CAAuB,EACtCA,EAAA,cAAC,MAAA,CAAI,UAAU,wBAAA,CAAyB,EACxCA,EAAA,cAAC,OAAI,UAAU,yBAAA,CAA0B,CAC3C,CAEJ,CACJ,CAEJ,ECfM6c,GAASzZ,GACJpD,EAAA,cAAC8c,GAAA,CAAc,GAAG1Z,CAAA,CAAO,EAG9B0Z,GAAe,CAAC,CACI,SAAAlf,EACA,MAAA4W,EAAoB,OACpB,OAAA/L,EAAoB,OACpB,OAAAC,EAAoB,OACpB,QAAAqU,EAAoB,OACpB,OAAAC,EAAoB,OACpB,SAAAC,EAAoB,OACpB,KAAAtY,EAAoB,OACpB,SAAAoE,EAAoB,OACpB,iBAAAmU,EAAoB,GACpB,aAAAC,EAAoB,GACpB,IAAAlkB,EAAoB,OACpB,KAAAE,EAAoB,OACpB,UAAAmJ,EAAoB,OACpB,UAAA/B,EAAoB,OACpB,YAAA6E,EAAoB,OACpB,WAAAgY,EAAoB,OACpB,cAAAC,EAAoB,OACpB,UAAAT,EAAoB,OACpB,YAAA1T,EAAoB,OACpB,gBAAAoU,EAAoB,GACpB,OAAQnU,EAAe,MACjD,IAAkB,cACd,MAAMhN,EAAQ8D,EAAgB,EACxB,CAACmI,EAASC,CAAU,EAAIrI,EAAM,SAAS,EAAK,EAC5Cud,EAAavd,EAAM,OAAO,EAAK,EAC/Bwd,EAAgBxd,EAAM,OAA2B,MAAS,EAE1D,CAACyd,EAAWC,CAAY,EAAIvf,EAAAA,SAASwG,CAAI,EAEzCgZ,EAAkB,CACpB,GAAI,WACJ,GAAI,WACJ,GAAI,YACJ,GAAI,YACJ,WAAY,wCAAA,EACdF,GAAathB,EAAM,MAAM,MAAQ,IAAI,EAEjCyhB,EAAiB,CACnB,GAAI,OACJ,GAAI,OACJ,GAAI,YACJ,GAAI,YACJ,WAAY,UAAA,EACdH,GAAathB,EAAM,MAAM,MAAQ,IAAI,EAEjC0hB,EAAsB,CACxB,GAAI,eACJ,GAAI,eACJ,GAAI,eACJ,GAAI,eACJ,WAAY,kBAAA,EACdJ,GAAathB,EAAM,MAAM,MAAQ,IAAI,EAEjC2hB,EAAY,CACd,OAAQ,CACJ,WAAY,0EACZ,YAAavc,EAAG,yFAA0Foc,EAAiBrb,GAAanG,EAAM,MAAM,SAAS,EAC7J,aAAcoF,EAAG,+BAAgChB,GAAapE,EAAM,MAAM,SAAS,EACnF,YAAaoF,EAAG,6DAA8D6D,GAAejJ,EAAM,MAAM,WAAW,EACpH,WAAYoF,EAAG,qCAAsC6b,GAAcjhB,EAAM,MAAM,UAAU,EACzF,cAAeoF,EAAG,qCAAsC8b,GAAiBlhB,EAAM,MAAM,aAAa,EAClG,UAAWoF,EAAG,mCAAoCqb,GAAazgB,EAAM,MAAM,SAAS,EACpF,YAAaoF,EAAG,yDAA0D2H,GAAe/M,EAAM,MAAM,WAAW,CAAA,EAEpH,IAAK,CACD,WAAY,GACZ,YAAaoF,EAAG,2EAA4Esc,EAAqBvb,GAAanG,EAAM,MAAM,SAAS,EACnJ,aAAcoF,EAAG,+BAAgChB,GAAapE,EAAM,MAAM,SAAS,EACnF,YAAaoF,EAAG,6DAA8D6D,GAAejJ,EAAM,MAAM,WAAW,EACpH,WAAYoF,EAAG,qCAAsC6b,GAAcjhB,EAAM,MAAM,UAAU,EACzF,cAAeoF,EAAG,qCAAsC8b,GAAiBlhB,EAAM,MAAM,aAAa,EAClG,UAAWoF,EAAG,mCAAoCqb,GAAazgB,EAAM,MAAM,SAAS,EACpF,YAAaoF,EAAG,yDAA0D2H,GAAe/M,EAAM,MAAM,WAAW,CAAA,EAEpH,KAAM,CACF,WAAY,GACZ,YAAaoF,EAAG,uFAAwFqc,EAAgBtb,GAAanG,EAAM,MAAM,SAAS,EAC1J,aAAcoF,EAAG,+BAAgChB,GAAapE,EAAM,MAAM,SAAS,EACnF,YAAaoF,EAAG,6DAA8D6D,GAAejJ,EAAM,MAAM,WAAW,EACpH,WAAYoF,EAAG,qCAAsC6b,GAAcjhB,EAAM,MAAM,UAAU,EACzF,cAAeoF,EAAG,qCAAsC8b,GAAiBlhB,EAAM,MAAM,aAAa,EAClG,UAAWoF,EAAG,mCAAoCqb,GAAazgB,EAAM,MAAM,SAAS,EACpF,YAAaoF,EAAG,yDAA0D2H,GAAe/M,EAAM,MAAM,WAAW,CAAA,EAEpH,MAAO,CACH,WAAY,GACZ,YAAaoF,EAAG,wFAAyFqc,EAAgBtb,GAAanG,EAAM,MAAM,SAAS,EAC3J,aAAcoF,EAAG,+BAAgChB,GAAapE,EAAM,MAAM,SAAS,EACnF,YAAaoF,EAAG,6DAA8D6D,GAAejJ,EAAM,MAAM,WAAW,EACpH,WAAYoF,EAAG,qCAAsC6b,GAAcjhB,EAAM,MAAM,UAAU,EACzF,cAAeoF,EAAG,qCAAsC8b,GAAiBlhB,EAAM,MAAM,aAAa,EAClG,UAAWoF,EAAG,mCAAoCqb,GAAazgB,EAAM,MAAM,SAAS,EACpF,YAAaoF,EAAG,yDAA0D2H,GAAe/M,EAAM,MAAM,WAAW,CAAA,EAEpH,OAAQ,CACJ,WAAY,GACZ,YAAaoF,EAAG,8EAA+Esc,EAAqBvb,GAAanG,EAAM,MAAM,SAAS,EACtJ,aAAcoF,EAAG,+BAAgChB,GAAapE,EAAM,MAAM,SAAS,EACnF,YAAaoF,EAAG,6DAA8D6D,GAAejJ,EAAM,MAAM,WAAW,EACpH,WAAYoF,EAAG,qCAAsC6b,GAAcjhB,EAAM,MAAM,UAAU,EACzF,cAAeoF,EAAG,qCAAsC8b,GAAiBlhB,EAAM,MAAM,aAAa,EAClG,UAAWoF,EAAG,mCAAoCqb,GAAazgB,EAAM,MAAM,SAAS,EACpF,YAAaoF,EAAG,yDAA0D2H,GAAe/M,EAAM,MAAM,WAAW,CAAA,CACpH,EAGE4hB,EAAgBN,IAAc,aAAe,SAAY1U,GAAY5M,EAAM,MAAM,SACjF6hB,EAAMF,EAAUC,CAAuC,EACvDE,EAAaR,IAAc,aAC3Blc,EAAGyc,EAAI,WAAY,uBAAuB,EAC1CA,EAAI,WAEVhe,EAAM,UAAU,IAAM,CAClB,MAAMke,GAAmB,OAAO,SAAS,KAAK,MAAM,SACpD,OAAO,SAAS,KAAK,MAAM,SAAW,SACtC,MAAM5V,GAAQ,OAAO,sBAAsB,IAAMD,EAAW,EAAI,CAAC,EAEjE,MAAO,IAAM,CACT,OAAO,qBAAqBC,EAAK,EAC7BkV,EAAc,UAAY,QAC1B,OAAO,aAAaA,EAAc,OAAO,EAE7C,OAAO,SAAS,KAAK,MAAM,SAAWU,IAAoB,MAC9D,CACJ,EAAG,CAAA,CAAE,EAEL,MAAMC,EAAuBhV,KAAgBjD,GAAA/J,EAAM,MAAM,SAAZ,YAAA+J,GAAqB6X,KAAkE,OAC9HK,EAAezW,GAAgBwW,EAAsBA,CAAoB,EAEzEE,EAAc,IAAM,CACtB,GAAId,EAAW,QAAS,OACxBA,EAAW,QAAU,GACrBlV,EAAW,EAAK,EAChB,OAAO,SAAS,KAAK,MAAM,SAAW,OACtC,MAAMiW,GAAaF,EAAa,WAAW,SAAWA,EAAa,WAAW,MAC9EZ,EAAc,QAAU,OAAO,WAAW,IAAM,CAC5CT,GAAA,MAAAA,GACJ,EAAGuB,EAAU,CACjB,EAEMC,EAAc3W,GAAeQ,EAAS+V,EAAsBA,CAAoB,EAEhFK,EAAqC,CACvC,GAAG5W,GAAeQ,IAASuB,GAAAxN,EAAM,MAAM,SAAZ,YAAAwN,GAAoB,WAAY,SAAQuJ,GAAA/W,EAAM,MAAM,SAAZ,YAAA+W,GAAoB,WAAY,MAAM,EACzG,OAAQoK,GAAmBP,EAAU,UAAY,SAAA,EAG/C0B,GAAkC,CACpC,OAAQV,IAAkB,UAAYT,GAAmBP,EAAU,UAAY,SAAA,EAG7E2B,GAAahW,IAAW,KAAUA,GAAUsU,GAAUC,GAAaE,GAAgBJ,GAEnF4B,EAAmB,mNAEzB,OAAOC,GAAAA,aAAa5e,EAAA,cAAAA,EAAA,SAAA,KAChBA,EAAA,cAAC,MAAA,CACG,UAAWie,EACX,MAAOQ,GACP,QAAS,IAAM,CACPV,IAAkB,UAAYT,GAAmBP,GACjDsB,EAAA,CAER,CAAA,EAEAre,EAAA,cAAC,MAAA,CAAI,UAAWge,EAAI,YAAa,MAAOO,EAAa,QAAUlY,IAAMA,GAAE,gBAAA,CAAgB,EAClFpN,EACD+G,EAAA,cAAC,MAAA,CAAI,UAAWge,EAAI,YAAA,GACdvV,GAAU+L,GAAS0I,GAAoBH,IAAY/c,EAAA,cAAC,MAAA,CAAI,UAAWge,EAAI,aACrEhe,EAAA,cAAC,MAAA,CAAI,UAAU,SAAA,EACVwU,GAASxU,EAAA,cAAC,KAAA,CAAG,UAAWge,EAAI,YAAaxJ,CAAM,EAC9CA,GAAS/L,GAAWzI,EAAA,cAAC,MAAA,CAAI,UAAWge,EAAI,aAAA,EAAgBvV,CAAO,EAChE,CAAC+L,GAAS/L,IAAW,OAAOA,GAAW,SAAWzI,EAAA,cAAC,KAAA,CAAG,UAAWge,EAAI,YAAavV,CAAO,EAAQA,EACtG,GACEyU,GAAoBH,IAAY/c,EAAA,cAAC,MAAA,CAAI,UAAU,4CAC5Ckd,GAAoBld,EAAA,cAAC,SAAA,CAClB,KAAK,SACL,MAAOyd,IAAc,aAAe,kBAAoB,mBACxD,aAAYA,IAAc,aAAe,kBAAoB,mBAC7D,UAAWkB,EACX,QAAUtY,IAAM,CACZA,GAAE,eAAA,EACFA,GAAE,gBAAA,EACFqX,EAAcnX,IAASA,KAAS,aAAe5B,IAAS,aAAe,KAAOA,EAAO,YAAY,CACrG,CAAA,EAEA3E,EAAA,cAAC0E,EAAA,CAAK,KAAM+Y,IAAc,aAAethB,EAAM,MAAM,aAAeA,EAAM,MAAM,WAAY,KAAM,EAAA,CAAI,CAAA,EAEzG4gB,GAAW/c,EAAA,cAAC,SAAA,CACT,KAAK,SACL,MAAM,QACN,aAAW,QACX,UAAW2e,EACX,QAAUtY,IAAM,CACZA,GAAE,eAAA,EACFA,GAAE,gBAAA,EACFgY,EAAA,CACJ,CAAA,EAEAre,EAAA,cAAC0E,EAAA,CAAK,KAAK,IAAI,KAAM,EAAA,CAAI,CAAA,CAEjC,CACJ,EACA1E,EAAA,cAAC,MAAA,CAAI,UAAWge,EAAI,WAAYpgB,CAAS,EACxC8gB,IAAc1e,EAAA,cAAC,MAAA,CAAI,UAAWge,EAAI,WAAA,EAC9BtV,EACAsU,GAAUhd,EAAA,cAACuU,GAAA,CACR,UAAU,cACV,MAAO,OACP,QAAS,MAAOlO,IAAM,CAClBA,GAAE,eAAA,EAEE,MAAM2W,EAAO3W,EAAC,GACdgY,EAAA,CAER,CAAA,CAAA,EAEHpB,GAAYjd,EAAA,cAACuU,GAAA,CACV,UAAU,aACV,MAAO,SACP,QAAS,MAAOlO,IAAM,CAClBA,GAAE,eAAA,EACF,MAAM4W,EAAS5W,EAAC,EAChBgY,EAAA,CACJ,CAAA,CAAA,EAEHlB,GAAgBJ,GAAW/c,EAAA,cAACoV,GAAA,CACzB,UAAU,WACV,MAAO,SACP,QAASiJ,CAAA,CAAA,CAEjB,CACJ,EACCllB,CACL,CAAA,EAEJ6G,EAAA,cAAC,MAAA,CACG,yBAAuB,GACvB,cAAY,OACZ,UAAU,kDACV,MAAOwe,EACP,QAAS,IAAM,CACPlB,GAAmBP,GACnBsB,EAAA,CAER,CAAA,CAAA,CAER,EAAK,SAAS,IAAI,CACtB,EAEaQ,GAAa,CAAC,CACI,SAAAjhB,EACA,MAAA4W,EAAW,OACX,MAAAsK,EAAW,OACX,KAAAC,EAAW,OACX,QAAAhC,EAAW,MAC1C,IACW/c,EAAA,cAAC8c,GAAA,CACJ,MAAAtI,EACA,QAAAuI,EACA,iBAAkB,GAClB,uCACK+B,GAAS9e,EAAA,cAACuU,GAAA,CACP,UAAU,cACV,MAAO,MACP,QAAS,MAAOlO,GAAM,CAClBA,EAAE,eAAA,EACF,MAAMyY,EAAMzY,CAAC,EACb0W,GAAA,MAAAA,GACJ,CAAA,CAAA,EAEHgC,GAAQ/e,EAAA,cAACuU,GAAA,CACN,UAAU,gBACV,MAAO,KACP,QAAS,MAAOlO,GAAM,CAClBA,EAAE,eAAA,EACF,MAAM0Y,EAAK1Y,CAAC,EACZ0W,GAAA,MAAAA,GACJ,CAAA,CAAA,CAER,CAAA,EAECnf,CAAA,EAIIohB,GAAU,CAAC,CACI,SAAAphB,EACA,MAAA4W,EAAc,OACd,QAAAuI,EAAc,MAClB,IACb/c,EAAA,cAAC8c,GAAA,CACJ,MAAAtI,EACA,QAAAuI,EACA,iBAAkB,GAClB,OAAQ/c,EAAA,cAAAA,EAAA,SAAA,KACJA,EAAA,cAACoV,GAAA,CAAa,UAAU,cAAc,MAAO,KAAM,QAAS2H,EAAS,CACzE,CAAA,EAECnf,CAAA,EClUHqhB,GAAQ,CAAC,CACI,IAAAxP,EACA,YAAAyP,EAAgB,OAChB,MAAAra,EAAe,OACf,MAAA2P,EAAe,OACf,IAAAsC,EAAe,OACf,SAAA/N,EAAe,OACf,SAAAgO,EAAe,OACf,MAAApB,EAAe,OACf,OAAAiB,EAAe,OACf,OAAAuI,EAAe,OACf,MAAAC,EAAe,OACf,IAAAnmB,EAAe,OACf,KAAAE,EAAe,OACf,UAAAmJ,EAAe,OACf,UAAA/B,EAAe,MAClC,IAAkB,SACd,MAAMpE,EAAQ8D,EAAgB,EAExBiX,IAA4BhR,EAAA/J,EAAM,MAAM,SAAZ,YAAA+J,EAAoB,QAAS,GACzDiR,IAA4BxN,EAAAxN,EAAM,MAAM,SAAZ,YAAAwN,EAAoB,QAAS,GACzD0N,EAAWF,IAAa,GAExBG,EAAanP,GAAe,OAAW+O,EAAU,EAAK,EACtD,CAACK,EAASC,CAAU,EAAIrZ,EAAAA,SAAS,EAAK,EACtCsZ,EAAa7P,GAAe2P,EAASJ,EAAU,EAAK,EAE1D,uBACK7W,EAAA,CAAQ,UAAWiB,EAAG,0BAA2Be,GAAanG,EAAM,MAAM,SAAS,CAAA,EAC/ElD,GAAO+G,EAAA,cAAC,MAAA,CAAI,UAAU,wBAAwB/G,CAAI,EACnD+G,EAAA,cAAC,MAAA,CACG,UAAWuB,EAAG,wBAAyB8V,GAAY,iBAAiB,EACpE,MAAOC,EACP,aAAcD,EAAW,IAAMG,EAAW,EAAI,EAAI,OAClD,aAAcH,EAAW,IAAMG,EAAW,EAAK,EAAI,MAAA,EAEnDxX,EAAA,cAAC,MAAA,CACG,IAAKyP,GAAOyP,GAAe1hB,GAC3B,IAAKqH,GAAS2P,GAAS/E,EACvB,MAAA+E,EACA,UAAWjU,GAAapE,EAAM,MAAM,UACpC,MAAO,CACH,GAAIwZ,GAASiB,EACP,CAAE,SAAUjB,EAAO,YAAa,GAAGA,CAAK,MAAMiB,CAAM,GAAI,MAAO,QAC/DjB,EACI,CAAE,SAAUA,EAAO,MAAO,QAC1BiB,EACI,CAAE,OAAAA,CAAA,EACF,CAAA,EACd,GAAIE,EAAW,CAAE,UAAWA,CAAA,EAAiB,CAAA,EAC7C,GAAI/N,EAAW,CAAE,eAAgBA,CAAA,EAAY,CAAA,EAC7C,GAAIsO,EAAWI,EAAa,CAAA,CAAC,EAEjC,MAAA9B,EACA,OAAAiB,EACA,OAAQuI,EACR,MAAAC,CAAA,CAAA,EAEHrI,GAAY/W,EAAA,cAAC,MAAA,CAAI,UAAU,YAAY+W,CAAS,CAAA,EAEpD5d,GAAQ6G,EAAA,cAAC,OAAI,UAAU,wBAAwB7G,CAAK,CACzD,CAER,EC1EMkmB,GAAQ,CAAC,CACI,IAAA5U,EAAe,OACf,MAAA5F,EAAe,OACf,KAAAya,EAAgB,OAChB,MAAA3J,EAAe,OACf,OAAAiB,EAAe,GACf,UAAAtU,EAAe,OACf,UAAA/B,EAAe,OACf,UAAAgf,EAAe,OACf,WAAAC,EAAe,MAClC,IAAkB,CACd,MAAMrjB,EAAQ8D,EAAgB,EACxBwf,EAAOzf,EAAA,cAAAA,EAAA,SAAA,KACTA,EAAA,cAACif,GAAA,CAAM,IAAKK,GAAQ5hB,GACb,MAAAiY,EACA,OAAAiB,CAAA,CAAA,EAEN/R,GAAS7E,EAAA,cAAC,OAAA,CAAK,UAAWwf,GAAcrjB,EAAM,MAAM,UAAA,EAAa0I,CAAM,CAC5E,EAEA,OAAQ7E,EAAA,cAACM,EAAA,CAAQ,UAAWgC,CAAA,kBACvB,MAAA,CAAI,UAAW/B,GAAapE,EAAM,MAAM,SAAA,EACpCsO,EACKzK,EAAA,cAACoG,GAAAA,MAAK,GAAIqE,EAAK,UAAW8U,GAAapjB,EAAM,MAAM,SAAA,EAAYsjB,CAAK,EACpEzf,EAAA,cAAC,OAAA,CAAK,UAAWuf,GAAapjB,EAAM,MAAM,SAAA,EAAYsjB,CAAK,CAErE,CACJ,CACJ,EC/BaC,GAAc,CAAC,CACI,KAAA7nB,EAAc,OACd,IAAAoB,EAAc,OACd,UAAAsH,EAAc,MAC9C,IAAwB,CACpB,MAAMyZ,EAAWC,GAAAA,YAAA,EACX0F,EAAWlS,GAAU5V,GAAQmiB,EAAS,QAAQ,EAE9Cla,EAAS6f,EAAS,MAAM,GAAG,EAC3BngB,EAAUM,EAAO,IAAA,EAEvB,IAAI8f,EAA4B,CAAA,EAC5BC,EAAY,GAChB,UAAU7S,KAASlN,EACf+f,GAAa,IAAI7S,CAAK,GACtB4S,EAAY,KAAK,CACb,MAAO5S,EACP,IAAK6S,CAAA,CACR,EAGL,OAAQD,EAAY,QAAU3mB,IAAQ0mB,kBACjC,KAAA,CAAG,UAAW,cAAcpf,CAAS,EAAA,EACjCtH,GAAO+G,EAAA,cAAC,KAAA,CAAG,UAAU,iBAAA,EAAmB/G,CAAI,EAC5C2mB,EAAY,IAAI,CAACE,EAAYvnB,IAC9ByH,EAAA,cAAC,MAAG,UAAU,kBAAkB,IAAKzH,CAAA,EACjCyH,EAAA,cAACoG,SAAK,GAAI0Z,EAAW,KAAMA,EAAW,KAAM,CAChD,CACC,kBACA,KAAA,CAAG,UAAU,0BAA0BtgB,CAAQ,CACpD,EACAQ,EAAA,cAAAA,EAAA,SAAA,KAAGR,CAAQ,CACnB,ECzBMugB,GAAW,CAAC,CACE,SAAAniB,EACA,eAAAoiB,EAAkB,GAClB,aAAAC,EAAkB,GAClB,YAAAC,EAAkB,GAClB,WAAAC,EAAkB,GAClB,SAAAC,EAAkB,OAClB,WAAAC,EAAkB,EAClB,eAAAC,EAAkB,OAClB,QAAA7f,EAAkB,MACtC,IAAsB,CAClB,MAAMtE,EAAQ8D,EAAmB,EACjC+f,EAAiBA,GAAkB7jB,EAAM,SAAS,eAClD8jB,EAAeA,GAAgB9jB,EAAM,SAAS,aAC9C+jB,EAAcA,GAAe/jB,EAAM,SAAS,YAC5CgkB,EAAaA,GAAchkB,EAAM,SAAS,WAC1CikB,EAAWA,GAAYjkB,EAAM,SAAS,SAGtC,KAAM,CAACokB,EAASC,CAAU,EAAIxgB,EAAM,SAAS,EAAK,EAC5CqE,EAAK2J,GAAA,EACLyS,EAAYN,EAAa,WAAa,UACtCO,EAAcP,EAAa,YAAc,aAEzCQ,EAAWC,GAA2D,CACxE,GAAI,CAACV,EAAa,OAAO,KACzB,GAAII,EAAgB,OAAOA,EAAeM,CAAK,EAE/C,KAAM,CAAE,IAAA/J,EAAK,YAAA4F,CAAA,EAAgBmE,EAAM,MACnC,OAAI/J,GAAO4F,EAEHzc,EAAA,cAAC,MAAA,CAAI,UAAU,sDAAA,EACV6W,GAAO7W,EAAA,cAAC,KAAA,CAAG,UAAW0gB,CAAA,EAAc7J,CAAI,EACxC4F,GAAezc,EAAA,cAAC,IAAA,KAAGyc,CAAY,CACpC,EAGD,IACX,EAEA,OACIzc,EAAA,cAAC,MAAA,CAAI,GAAAqE,EACA,UAAW,kBAAoB8b,EAAa,iBAAmB,IAC/D,eAAcC,EAAW,WAAa,QACtC,oBAAkBA,GAAA,YAAAA,EAAU,WAAY,IACxC,iBAAeA,GAAA,YAAAA,EAAU,QAAS,QAClC,gBAAcA,GAAA,YAAAA,EAAU,OAAQ,OAChC,aAAc,IAAMI,EAAW,EAAI,EACnC,aAAc,IAAMA,EAAW,EAAK,CAAA,EAEpC5iB,EAAS,OAAS,GAAKoC,EAAA,cAAC,KAAA,CAAG,UAAU,0BAAA,EACjCggB,GAAkBpiB,EAAS,IAAI,CAAC9E,EAAGP,IAE5ByH,EAAA,cAAC,KAAA,CAAG,IAAKzH,EAAO,iBAAgB,IAAM8L,EAAI,mBAAkB9L,EAAO,UAAWA,IAAU8nB,EAAa,SAAW,GAAI,CAE3H,CACL,kBACC,MAAA,CAAI,UAAU,iBAAiB,QAAA5f,EAAkB,MAAO,CAAC,OAAQA,EAAU,UAAY,UAAS,EAC5F7C,EAAS,IAAI,CAACgjB,EAAOroB,IAEdyH,EAAA,cAAC,MAAA,CAAI,IAAKzH,EAAO,UAAW,gBAAgBA,IAAU8nB,EAAa,UAAY,EAAE,EAAA,EAC5EO,GACCZ,GAAkBC,GAAgBC,IAAgBK,GAAWvgB,EAAA,cAAC,MAAA,CAAI,UAAW,yEAA2EygB,CAAA,CAAW,EACpKF,GAAWI,EAAQC,CAAK,CAC7B,CAEP,CACL,EACCX,GAAgBM,GAAW3iB,EAAS,OAAS,mCAC1CoC,EAAA,cAAC,IAAA,CAAE,UAAU,wBAAwB,KAAM,IAAMqE,EAAI,KAAK,SAAS,gBAAc,MAAA,EAAOrE,EAAA,cAAC,OAAA,CAAK,UAAU,6BAA6B,cAAY,MAAA,CAAO,EAAOA,EAAA,cAAC,OAAA,CAAK,UAAU,WAAU,UAAQ,CAAO,EACxMA,EAAA,cAAC,IAAA,CAAE,UAAU,wBAAwB,KAAM,IAAMqE,EAAI,KAAK,SAAS,gBAAc,MAAA,kBAAQ,OAAA,CAAK,UAAU,6BAA6B,cAAY,MAAA,CAAO,EAAOrE,EAAA,cAAC,OAAA,CAAK,UAAU,SAAA,EAAU,MAAI,CAAO,CACxM,CAAA,CAGZ,EC5EA,SAAS6gB,GAAc,CACI,SAAAjjB,EAAe,CAAA,EACf,MAAAoE,EAAe,OACf,UAAAM,EAAe,MAC1C,EAAuB,CACrB,MAAMnG,EAAQ8D,EAAwB,EAEtC,uBACKK,EAAA,CAAQ,UAAWgC,GAAanG,EAAM,cAAc,SAAA,EACjD6D,EAAA,cAACuI,GAAA,CACG,aAAc,CACZ,KAAM,MAAA,EAER,UAAW,qBAAuBpM,EAAM,cAAc,SAAS,UAC/D,YAAa,WAAaA,EAAM,cAAc,SAAS,YACvD,UAAWA,EAAM,cAAc,SAAS,UACxC,MAAA6F,EACA,OAAO,gBACP,OAAO,SAAA,GAELpE,GAAY,CAAA,GAAI,IAAI,CAACkjB,EAAQvoB,IAAU,CACrC,MAAMgN,EAAYhN,IAAU,EAAI,UAAY,iBAE5C,OACIyH,EAAA,cAACwK,GAAA,CACG,IAAKjS,EACL,UAAU,oBACV,IAAKuoB,EAAO,GAAA,EAEZ9gB,EAAA,cAAC,MAAA,CAAI,UAAWuF,CAAA,EACZvF,EAAA,cAAC0E,EAAA,CAAK,KAAMoc,EAAO,KAAM,UAAU,YAAA,CAAa,CACpD,kBACC,MAAA,CAAI,UAAU,yBACX9gB,EAAA,cAAC,OAAI,UAAU,mBAAmB8gB,EAAO,KAAM,EAC/C9gB,EAAA,cAAC,MAAA,CAAI,UAAU,OAAA,EAAS8gB,EAAO,IAAK,CACxC,EACA9gB,EAAA,cAAC,OAAI,UAAU,cAAA,kBACV0E,EAAA,CAAK,KAAK,gBAAgB,CAC/B,CAAA,CAGZ,CAAC,CAAA,CAET,CAEN,CCzDO,MAAMqc,GAAe,IAEpB/gB,EAAA,cAAC,MAAA,CAAI,UAAU,oBAAA,EACXA,EAAA,cAACoG,GAAAA,KAAA,CACG,GAAG,KACH,oBAAkB,iCAClB,qBAAmB,OACnB,UAAU,WAAA,EAEVpG,EAAA,cAAC,MAAA,CAAI,UAAU,WAAA,EACXA,EAAA,cAAC0E,GAAK,KAAK,SAAS,UAAU,UAAA,CAAW,CAC7C,CAAA,CAER,EAIR,SAASsc,GAAQ,CACI,aAAAC,EAAe,MACpC,EAAgB,CACZ,OAEIjhB,EAAA,cAAC,MAAA,KACGA,EAAA,cAAC+gB,GAAA,IAAa,EACd/gB,EAAA,cAAC,QAAA,CAAM,UAAW,SAAU,KAAK,OAAO,YAAY,SAAS,SAAUihB,EAAa,CACxF,CAER,CCjBA,MAAMC,GAAQ,CAAC,CACX,SAAAtjB,EACA,KAAAsE,EAAO,OACP,QAAAif,EAAU,OACV,QAAAC,EAAU,OACV,QAAArE,EAAU,OACV,KAAArS,EAAO,GACP,IAAAzR,EAAM,OACN,KAAAE,EAAO,OACP,UAAAmJ,EAAY,OACZ,UAAA/B,EAAY,MAChB,IAAkB,CACd,MAAMpE,EAAQ8D,EAAgB,EAaxBohB,EAA0B3W,IAAS,GAAQ,KAC3CA,IAAS,GAZ+B,CAC1C,KAAW,OACX,QAAW,QACX,QAAW,UACX,OAAW,WACX,QAAW,GACX,UAAW,GACX,MAAW,GACX,KAAW,EAAA,EAIsBxI,CAAI,GAAK,KACvCwI,GAAmB,KAE1BzL,EAAAA,UAAU,IAAM,CACZ,GAAI,OAAO8d,GAAY,WAAY,CAE/B,MAAMuE,EAAQ,WAAW,IAAM,CAC3BvE,EAAA,CACJ,EAHiBqE,GAAW,GAGjB,EAEX,MAAO,IAAM,aAAaE,CAAK,CACnC,CACJ,EAAG,CAACvE,EAASqE,CAAO,CAAC,EAErB,MAAMG,EAAc,IAChBvhB,EAAA,cAACM,EAAA,CAAQ,UAAWgC,GACfrJ,EACD+G,EAAA,cAAC,MAAA,CACG,KAAK,QACL,UAAWuB,EACP,eAAiBW,EACjB3B,GAAapE,EAAM,MAAM,UACzBglB,GAAW,kFAAA,EAEf,MAAOA,EAAU,CAAE,CAACA,CAAO,EAAG,IAAO,MAAA,EAEpCE,mBAAa3c,EAAA,CAAK,KAAM2c,EAAU,KAAM,GAAI,UAAU,UAAA,CAAW,EACjEzjB,CAAA,EAEJzE,CACL,EAGJ,OAAOgoB,EAAUvC,GAAAA,aAAa2C,EAAA,EAAe,SAAS,IAAI,EAAIA,EAAA,CAClE,ECpEMC,GAAoD,CACxD,OAAQ,IAAM,OAAO,iCAAiC,EACtD,KAAM,IAAM,OAAO,iCAAiC,EACpD,IAAK,IAAM,OAAO,iCAAiC,EACnD,IAAK,IAAM,OAAO,iCAAiC,EACnD,OAAQ,IAAM,OAAO,iCAAiC,EACtD,IAAK,IAAM,OAAO,8BAA8B,EAChD,MAAO,IAAM,OAAO,gCAAgC,EACpD,WAAY,IAAM,OAAO,qCAAqC,EAC9D,GAAI,IAAM,OAAO,qCAAqC,EACtD,IAAK,IAAM,OAAO,8BAA8B,EAChD,WAAY,IAAM,OAAO,qCAAqC,EAC9D,IAAK,IAAM,OAAO,8BAA8B,EAChD,KAAM,IAAM,OAAO,+BAA+B,EAClD,KAAM,IAAM,OAAO,+BAA+B,EAClD,MAAO,IAAM,OAAO,+BAA+B,EACnD,OAAQ,IAAM,OAAO,iCAAiC,EACtD,KAAM,IAAM,OAAO,+BAA+B,EAClD,EAAG,IAAM,OAAO,4BAA4B,EAC5C,IAAK,IAAM,OAAO,8BAA8B,EAChD,OAAQ,IAAM,OAAO,iCAAiC,EACtD,GAAI,IAAM,OAAO,6BAA6B,EAC9C,IAAK,IAAM,OAAO,8BAA8B,EAChD,IAAK,IAAM,OAAO,8BAA8B,EAChD,KAAM,IAAM,OAAO,+BAA+B,EAClD,KAAM,IAAM,OAAO,+BAA+B,EAClD,IAAK,IAAM,OAAO,8BAA8B,EAChD,OAAQ,IAAM,OAAO,iCAAiC,EACtD,WAAY,IAAM,OAAO,qCAAqC,EAC9D,IAAK,IAAM,OAAO,8BAA8B,EAChD,QAAS,IAAM,OAAO,kCAAkC,CAC1D,EAEMC,GAAkD,CACtD,KAAM,CAAC,QAAQ,EACf,IAAK,CAAC,QAAQ,EACd,IAAK,CAAC,QAAQ,EACd,OAAQ,CAAC,QAAQ,EACjB,WAAY,CAAC,OAAO,EACpB,GAAI,CAAC,QAAS,YAAY,EAC1B,IAAK,CAAC,SAAU,QAAS,YAAY,EACrC,WAAY,CAAC,QAAS,YAAY,EAClC,IAAK,CAAC,SAAU,QAAS,aAAc,MAAO,YAAY,EAC1D,EAAG,CAAC,OAAO,EACX,IAAK,CAAC,GAAG,EACT,OAAQ,CAAC,OAAO,EAChB,KAAM,CAAC,OAAO,EACd,IAAK,CAAC,QAAQ,CAChB,EAEMC,GAAS,CACb,MAAO,sBACP,KAAM,qBACN,IAAK,oBACL,MAAO,sBACP,QAAS,wBACT,eAAgB,+BAChB,SAAU,yBACV,SAAU,wBACZ,EAmBMC,GAAgE,CACpE,QAAS,qCACT,UAAW,yCACX,QAAS,qCACT,OAAQ,6CACR,QAAS,qCACT,KAAM,+BACN,MAAO,iCACP,KAAM,gCACN,MAAO,0BACP,MAAO,sBACP,YAAa,iBACb,QAAS,MACX,EAUA,SAASC,GAA+C1P,EAAW1Z,EAAkC,CACnG,OAAO,OAAOA,GAAU,UAAYA,KAAS0Z,CAC/C,CAEA,eAAe2P,GAAkBC,EAAyBC,EAAS,IAAI,IAAe,OACpF,GAAI,CAAAA,EAAO,IAAID,CAAQ,EAEvB,WAAWE,KAAcP,GAAsBK,CAAQ,GAAK,CAAA,EACtDF,GAAYJ,GAAWQ,CAAU,GACnC,MAAMH,GAAkBG,EAA6BD,CAAM,EAI/D,OAAM7b,EAAAsb,GAAUM,KAAV,YAAA5b,EAAA,KAAAsb,KACNO,EAAO,IAAID,CAAQ,EACrB,CAEA,MAAMG,GAAO,CAAC,CACZ,SAAAH,EACA,SAAAlkB,EACA,IAAA3E,EACA,KAAAE,EACA,UAAAmJ,EACA,UAAA/B,EACA,SAAA2hB,EAAW,GACX,MAAA/lB,EAAQ,WACR,WAAAgmB,EAAa,SACf,IAAiB,CACf,MAAMC,EAAU3V,EAAAA,OAAoB,IAAI,EAClC4V,EAAcpiB,EAAe,EAC7BqiB,EAAW,OAAO1kB,GAAa,SAAWA,EAAW,OAAOA,GAAY,EAAE,EAC1E2kB,EAAmBX,GAAYJ,GAAWM,CAAQ,EAAIA,EAAW,MACjEU,EAAgBZ,GAAYF,GAAQvlB,CAAK,EAAIA,EAAQ,WACrDsmB,EAAqBb,GAAYD,GAAkBQ,CAAU,EAAIA,EAAa,cAEpFljB,OAAAA,EAAAA,UAAU,IAAM,CACd,IAAIyjB,EAAY,GAkBhB,OAhByB,SAAY,CACnC,GAAI,CACF,MAAMb,GAAkBU,CAAgB,CAC1C,OAASjV,EAAK,CACZ,QAAQ,KAAK,4CAA4CiV,CAAgB,IAAKjV,CAAG,CACnF,CAEA,GAAI,CAACoV,GAAaN,EAAQ,QACxB,GAAI,CACFO,GAAM,iBAAiBP,EAAQ,OAAO,CACxC,OAAS9U,EAAK,CACZ,QAAQ,KAAK,4CAA4CiV,CAAgB,IAAKjV,CAAG,CACnF,CAEJ,GAEA,EACO,IAAM,CACXoV,EAAY,EACd,CACF,EAAG,CAACJ,EAAUC,CAAgB,CAAC,EAG7BviB,EAAA,cAACM,GAAQ,UAAWgC,GAAa+f,EAAY,KAAK,SAAA,EAChDriB,EAAA,cAAC,MAAA,CAAI,UAAWuB,EAAG,mCAAoCtI,GAAOE,IAAS,iBAAiB,CAAA,EACrFF,mBAAQ,MAAA,CAAI,UAAU,0DAAA,EAA4DA,CAAI,EACvF+G,EAAA,cAAC,MAAA,CACC,qBAAoBwiB,EACpB,0BAAyBC,EACzB,UAAWlhB,EACT,oFACAmgB,GAAOc,CAAa,EACpBb,GAAiBc,CAAkB,EACnCliB,GAAa8hB,EAAY,KAAK,SAAA,CAChC,EAECH,GACCliB,EAAA,cAAC,SAAA,CACC,QAAS,IAAMoN,GAAgBkV,CAAQ,EACvC,UAAU,iQACV,MAAM,YACN,aAAW,WAAA,EAEXtiB,EAAA,cAAC0E,EAAA,CAAK,KAAK,YAAY,KAAM,EAAA,CAAI,CAAA,EAGrC1E,EAAA,cAAC,QAAK,IAAKoiB,EAAS,UAAW,YAAYG,CAAgB,IACxDD,CACH,CAAA,EAEDnpB,GAAQ6G,EAAA,cAAC,MAAA,CAAI,UAAU,0DAAA,EAA4D7G,CAAK,CAC3F,CACF,CAEJ,ECxKMypB,GAAwC,CAC5C,QAAS,UACT,UAAW,YACX,QAAS,UACT,QAAS,UACT,OAAQ,cACR,KAAM,OACN,MAAO,QACP,KAAM,YACR,EAEMC,GAA6C,CACjD,QAAS,qBACT,UAAW,uBACX,QAAS,qBACT,QAAS,qBACT,OAAQ,yBACR,KAAM,kBACN,MAAO,mBACP,KAAM,YACR,EAEMC,GAAM,CAAC9V,EAAe+V,IAC1B,gBAAgB/V,CAAK,IAAI+V,IAAU,OAAY,GAAK,MAAMA,CAAK,EAAE,IAE7DC,GAA8C,CAAC,CACnD,SAAAC,EACA,KAAA/gB,EACA,UAAAghB,EACA,SAAAC,EACA,WAAAhB,EACA,KAAAxd,EACA,SAAAye,EACA,UAAA7iB,CACF,IAAM,CACJ,MAAM8iB,EAAaP,GAAIF,GAAWT,CAAU,EAAGA,IAAe,aAAeA,IAAe,QAAU,IAAO,GAAI,EAC3GmB,EAAYR,GAAIF,GAAW1gB,CAAI,CAAC,EAChCqhB,EAAYN,GAAY,GAAKH,GAAID,GAAgB3gB,CAAI,CAAC,EAAI4gB,GAAI,YAAY,EAEhF,OACE9iB,EAAA,cAAC,MAAA,CACC,UAAWuB,EAAG,uEAAwEhB,CAAS,EAC/F,MAAO,CACL,OAAQ,GAAG2iB,CAAS,KACpB,MAAO,GAAGve,CAAI,IACd,SAAUA,EAAO,IAAM,IAAM,OAC7B,gBAAiB0e,CAAA,EAEnB,KAAK,cACL,gBAAeJ,EACf,gBAAe,EACf,gBAAe,GAAA,EAEfjjB,EAAA,cAAC,MAAA,CACC,UAAU,kDACV,MAAO,CAAE,MAAO,GAAGijB,CAAQ,IAAK,gBAAiBK,CAAA,CAAU,CAAA,EAE5DH,GACCnjB,EAAA,cAAC,OAAA,CACC,UAAU,iGACV,MAAO,CAAE,SAAU,GAAGojB,CAAQ,KAAM,MAAOG,CAAA,CAAU,EAEpDN,EAAS,GAAA,CACZ,CAIR,EAEMO,GAAiD,CAAC,CACtD,SAAAP,EACA,KAAA/gB,EACA,UAAAghB,EACA,SAAAC,EACA,WAAAhB,EACA,KAAAxd,EACA,SAAAye,EACA,UAAA7iB,CACF,IAAM,CACJ,MAAM3D,EAAS+H,EAAO,EAChB8e,EAAmB7mB,EAASsmB,EAAY,EACxCQ,EAAgB,EAAI,KAAK,GAAKD,EAC9BE,EAAmBD,IAAkB,IAAMT,GAAY,KACvDW,EAAa,IACbP,EAAaP,GAAIF,GAAWT,CAAU,EAAGA,IAAe,aAAeA,IAAe,QAAU,IAAO,GAAI,EAC3GmB,EAAYR,GAAIF,GAAW1gB,CAAI,CAAC,EAChCqhB,EAAYT,GAAI,YAAY,EAElC,OACE9iB,EAAA,cAAC,OAAA,CACC,UAAWuB,EAAG,0CAA2ChB,CAAS,EAClE,KAAK,cACL,gBAAe0iB,EACf,gBAAe,EACf,gBAAe,GAAA,EAEfjjB,EAAA,cAAC,MAAA,CAAI,MAAO2E,EAAM,OAAQA,EAAM,QAAS,OAAOA,CAAI,IAAIA,CAAI,EAAA,EAC1D3E,EAAA,cAAC,SAAA,CACC,EAAGyjB,EACH,GAAI7mB,EACJ,GAAIA,EACJ,KAAK,OACL,OAAQymB,EACR,YAAaH,CAAA,CAAA,EAEfljB,EAAA,cAAC,SAAA,CACC,EAAGyjB,EACH,GAAI7mB,EACJ,GAAIA,EACJ,KAAK,OACL,OAAQ0mB,EACR,YAAaJ,EACb,cAAc,QACd,gBAAiBQ,EACjB,iBAAAC,EACA,MAAO,CACL,UAAW,UAAUC,CAAU,OAC/B,gBAAiB,SACjB,WAAY,8BAAA,CACd,CAAA,EAEDT,GACCnjB,EAAA,cAAC,OAAA,CACC,EAAE,MACF,EAAE,MACF,WAAW,SACX,iBAAiB,SACjB,WAAY,IACZ,SAAAojB,EACA,KAAMG,CAAA,EAEL,GAAGN,CAAQ,GAAA,CAGlB,CAAA,CAGN,EAEMY,GAAa,CAAC,CAClB,IAAAviB,EAAM,EACN,IAAAwiB,EAAM,IACN,IAAAC,EAAM,EACN,MAAAC,EAAQ,MACR,KAAA9hB,EAAO,UACP,WAAAigB,EAAa,YACb,UAAAe,EAAY,GACZ,SAAAC,EAAW,GACX,KAAAxe,EAAO,IACP,SAAAye,EAAW,GACX,MAAAve,EAAQ,OACR,IAAA5L,EAAM,OACN,KAAAE,EAAO,OACP,UAAAmJ,EAAY,OACZ,UAAA/B,EAAY,MACd,IAAuB,SACrB,MAAMpE,EAAQ8D,EAAqB,EAC7BgkB,EAAQH,EAAMC,EACdd,EAAWgB,GAAS,EAAI,EAAI,KAAK,MAAM,KAAK,IAAI,EAAG,KAAK,IAAI,KAAO3iB,EAAMyiB,GAAOE,EAAS,GAAG,CAAC,CAAC,EAC9FC,EAAiB3jB,KAAa2F,EAAA/J,EAAM,aAAN,YAAA+J,EAAkB,YAAa,GAEnE,OACElG,EAAA,cAACM,EAAA,CAAQ,UAAWgC,KAAaqH,EAAAxN,EAAM,aAAN,YAAAwN,EAAkB,YAChD1Q,EACA4L,GAAS7E,EAAA,cAACmkB,GAAA,CAAM,MAAAtf,CAAA,CAAc,EAC9Bmf,IAAU,MACThkB,EAAA,cAACgjB,GAAA,CACC,SAAAC,EACA,KAAA/gB,EACA,UAAAghB,EACA,SAAAC,EACA,WAAAhB,EACA,KAAAxd,EACA,SAAAye,EACA,UAAWc,CAAA,CAAA,EAEblkB,EAAA,cAACwjB,GAAA,CACC,SAAAP,EACA,KAAA/gB,EACA,UAAAghB,EACA,SAAAC,EACA,WAAAhB,EACA,KAAAxd,EACA,SAAAye,EACA,UAAWc,CAAA,CAAA,EAGd/qB,CACH,CAEJ,EC3NairB,GAA6B,SAM7BC,GAAa,IAAIC,IAAsB,CAIpD,SCZA,IAAIjoB,IAAmC6J,GAAA4G,IAAA,YAAAA,OAAA,YAAA5G,GAAe,OAClD,OAAO+F,IAAmB,YAC1BA,GAAgBsY,GAAsB,CAClCloB,GAASkoB,EAAU,MACvB,CAAC,EAGE,MAAMC,GACTrsB,GAEOkE,IAAAA,YAAAA,GAASlE,GAGPssB,GAAsB,IAAM,CACrC,MAAMC,EAAwB,aAAa,QAAQ,uBAAuB,EAC1E,GAAI,CAACA,EACD,eAAQ,MAAM,mCAAmC,EAC1C,KAGX,GADqB3X,GAAU2X,CAAqB,EACnC,IAAM,KAAK,IAAA,EAAQ,IAChC,eAAQ,MAAM,iCAAiC,EACxC,KAGX,GAAI,CACA,OAAOC,GAAAA,mBAAmB,WAAWD,CAAqB,CAC9D,OAASvX,EAAO,CACZ,QAAQ,MAAMA,CAAK,CACvB,CAEA,OAAO,IACX,EClBA,IAAIyX,GAEG,MAAMC,GAA0BxoB,GAA6C,CAChFuoB,GAAwBvoB,CAC5B,EAEayoB,GAAgC,IAAkCxM,GAC3E,mBACAF,GAAewM,GAAyE,CACpF,SACA,aACA,cACA,YACA,gBACA,oBACA,OAAA,EACD,WAAW,CAClB,EAEaG,GAAc,IAAmB,CAC1C,GAAI,CACA,OAAOC,WAAA,CACX,OAAS7X,EAAY,CACjB,eAAQ,MAAM,yBAAyBA,GAAA,YAAAA,EAAO,UAAW,4BAA4B,EAC9E,IACX,CACJ,EAEM8X,GAAWxK,GACN,IAAI,QAAQ,CAAC3M,EAASoX,IAAW,CACpC,MAAMC,EAAcC,GAAAA,mBAAmB3K,EAAOe,GAAS,CACnD2J,EAAA,EACArX,EAAQ0N,CAAI,CAChB,EAAG0J,CAAM,CACb,CAAC,EAGCG,GAAe,SAA8B,CAC/C,QAAQ,IAAI,wBAAwB,EACpC,MAAMC,EAAmBb,GAAA,EACzB,GAAI,CAACa,EACD,eAAQ,MAAM,wCAAwC,EAC/C,GAGX,GAAI,CACA,MAAMC,EAAiB,MAAMC,GAAAA,qBAAqBR,GAAAA,QAAA,EAAWM,CAAgB,EACvEG,EAAqBC,GAAAA,sBAAsBH,CAAc,EAC/D,OAAIE,GAAA,MAAAA,EAAoB,UAGxB,QAAQ,IAAI,wCAAwC,EAC7C,EACX,OAAStY,EAAO,CACZ,eAAQ,MAAM,8BAA+BA,CAAK,EAC3C,EACX,CACJ,EAEA,SAASwY,GAAanK,EAAuB,CACzC,KAAM,CAAE,gBAAAoK,CAAA,EAAoBpK,EAAK,OAAA,EAQ3BqK,GAAiBD,GAAA,YAAAA,EAAiB,iBAAkB,EAE1D,MAAO,CACH,YAAaA,GAAA,YAAAA,EAAiB,YAC9B,aAAcA,GAAA,YAAAA,EAAiB,aAC/B,eAAgBA,GAAA,YAAAA,EAAiB,eACjC,UAAWC,EAAiB,KAAK,IAAA,CAAI,CAE7C,CAEA,MAAMC,GAA2B,SAA8B,CAC3D,MAAMrL,EAAOsK,GAAA,EACb,GAAI,CAACtK,EAAM,MAAO,GAElB,MAAMe,EAAO,MAAMyJ,GAAQxK,CAAI,EAC/B,GAAG,CAACe,EAAM,OAAO6J,GAAA,EAEjB,MAAMU,EAAYJ,GAAanK,CAAI,EAEnC,GAAI,CAACuK,EAAU,YACX,eAAQ,MAAM,iCAAiC,EACxCV,GAAA,EAGX,GAAIU,EAAU,UACV,GAAI,CACA,aAAMvK,EAAK,WAAW,EAAI,EAC1B,QAAQ,IAAI,+BAA+B,EACpC,EACX,OAASrO,EAAO,CACZ,eAAQ,MAAM,iCAAkCA,CAAK,EAC9CkY,GAAA,CACX,CAGJ,eAAQ,IAAI,oCAAoC,EACzC,EACX,EAEMW,GAAO,MAAO3pB,GAAsD,OACtEwoB,GAAuBxoB,CAAM,EAC7B,MAAM4pB,EAAcC,GAAS,KAAK,OAASA,GAAS,MAAQ,OAE5D,GAAID,EAAa,CACb,KAAK/f,EAAA+f,EAAY,UAAZ,YAAA/f,EAAiD,SAAU7J,EAAO,MACnE,eAAQ,IAAI,kEAAkE,EACvE4pB,EAEX,MAAMA,EAAY,OAAA,CACtB,CAEAC,OAAAA,GAAS,cAAc7pB,CAAM,EAC7B,MAAMypB,GAAA,EAECI,GAAS,IAAA,CACpB,EC9GaC,GAAgB,CACzB,IAAK,OACL,MAAO,QACX,EAEA,IAAIC,GACA,OAAOna,IAAmB,YAC1BA,GAAgBsY,GAAsB,CAC9BA,EAAU,UAAUyB,GAAKzB,EAAU,QAAQ,CACnD,CAAC,EAGL,MAAM8B,GAAc,KACZ,CAACD,IAAoBF,GAAS,KAAK,SACnCE,GAAmBF,GAAS,IAAA,EAAM,SAAA,GAE/BE,IAGLE,GAAc,CAACC,EAAgBpZ,EAAYqZ,IAAuB,CACpE,MAAMzR,EAAU,gBAAgBwR,CAAM,KAAKpZ,CAAK,GAChD,GAAIqZ,EAAW,MAAM,IAAI,MAAMzR,CAAO,EACtC,QAAQ,MAAMA,CAAO,CACzB,EAEM0R,GAAiB,CAACC,EAAgCC,IAA2C,CAC/F,GAAI,CAACD,GAAS,EAAEC,KAASD,GAAQ,OAAOA,EACxC,KAAM,CAAE,CAACC,CAAK,EAAGC,EAAU,GAAGvuB,GAASquB,EACvC,OAAO,OAAO,KAAKruB,CAAI,EAAE,OAASA,EAAO,MAC7C,EAEMwuB,GAAsBC,GAA0F,CAClH,MAAMC,EAAY,OAAOD,GAAQ,UAAYA,IAAQ,MAAQ,CAAC,MAAM,QAAQA,CAAG,EACzEA,EACA,MAAM,QAAQA,CAAG,EACb,CAAE,GAAIA,CAAA,EACN,CAAE,GAAIA,CAAA,EAEhB,IAAIE,EACJ,OAAID,EAAU,KAAO,SAAWC,EAAkB,CAAE,GAAGA,EAAiB,GAAID,EAAU,EAAA,GAClFA,EAAU,KAAO,SAAWC,EAAkB,CAAE,GAAGA,EAAiB,GAAID,EAAU,EAAA,GAClFA,EAAU,KAAO,SAAWC,EAAkB,CAAE,GAAGA,EAAiB,GAAID,EAAU,EAAA,GAClFA,EAAU,MAAQ,SAAWC,EAAkB,CAAE,GAAGA,EAAiB,IAAKD,EAAU,GAAA,GAEjF,CAAE,UAAAA,EAAW,gBAAAC,CAAA,CACxB,EAEMC,GAAgB,CAACC,EAAkCP,IAA2C,CAChG,OAAQA,EAAA,CACJ,KAAKR,GAAc,IAAK,OAAOe,EAAI,WAAA,EACnC,KAAKf,GAAc,MAAO,OAAOe,EAAI,aAAA,EACrC,QAAS,OAAOA,EAAI,aAAaP,CAAK,CAAA,CAE9C,EAEMQ,GAAiB,CAACD,EAAkCE,EAAqBV,IAAmC,CAC9G,KAAM,CAACW,CAAU,EAAI,OAAO,QAAQD,GAAS,CAAA,CAAE,EAC/C,GAAI,CAACC,EAAY,MAAO,CAAE,MAAOH,EAAK,YAAaR,CAAA,EAEnD,KAAM,CAACC,CAAK,EAAIU,EAChB,IAAIC,EAAQL,GAAcC,EAAKP,CAAK,EACpC,MAAMG,EAAMJ,GAAA,YAAAA,EAAQC,GACpB,GAAIG,GAAO,KAAM,MAAO,CAAE,MAAAQ,EAAO,YAAaZ,CAAA,EAE9C,KAAM,CAAE,UAAAK,EAAW,gBAAAC,GAAoBH,GAAmBC,CAAG,EAE7D,OAAQ,GAAA,CACJ,KAAKC,EAAU,KAAO,OAClB,MAAO,CAAE,MAAOO,EAAM,QAAQP,EAAU,EAAS,EAAG,YAAaN,GAAeC,EAAOC,CAAK,CAAA,EAChG,KAAKI,EAAU,MAAQ,QAAaA,EAAU,MAAQ,QAClDO,EAAQA,EAAM,QAAQP,EAAU,GAAU,EAAE,MAAMA,EAAU,GAAU,EAAG,MAC7E,KAAKA,EAAU,MAAQ,QAAaA,EAAU,KAAO,QACjDO,EAAQA,EAAM,QAAQP,EAAU,GAAU,EAAE,MAAMA,EAAU,EAAS,EAAG,MAC5E,KAAKA,EAAU,KAAO,QAAaA,EAAU,MAAQ,QACjDO,EAAQA,EAAM,QAAQP,EAAU,EAAS,EAAE,MAAMA,EAAU,GAAU,EAAG,MAC5E,KAAKA,EAAU,KAAO,QAAaA,EAAU,KAAO,QAChDO,EAAQA,EAAM,QAAQP,EAAU,EAAS,EAAE,MAAMA,EAAU,EAAS,EAAG,MAC3E,KAAKA,EAAU,MAAQ,OACnBO,EAAQA,EAAM,QAAQP,EAAU,GAAU,EAAG,MACjD,KAAKA,EAAU,KAAO,OAClBO,EAAQA,EAAM,QAAQP,EAAU,EAAS,EAAG,MAChD,KAAKA,EAAU,MAAQ,OACnBO,EAAQA,EAAM,MAAMP,EAAU,GAAU,EAAG,MAC/C,KAAKA,EAAU,KAAO,OAClBO,EAAQA,EAAM,MAAMP,EAAU,EAAS,EAAG,KAAA,CAGlD,MAAO,CACH,MAAAO,EACA,YAAaN,EACP,CAAE,GAAIP,GAAeC,EAAOC,CAAK,GAAK,CAAA,EAAK,CAACA,CAAK,EAAGK,GACpDP,GAAeC,EAAOC,CAAK,CAAA,CAEzC,EAEMY,GAAgB,CAAC/uB,EAAYmuB,IAAkB,CACjD,GAAI,CAACA,EAAO,OAAOnuB,EACnB,MAAMR,EAAQ2uB,EAAM,MAAM,GAAG,EAC7B,IAAInnB,EAAUhH,EACd,UAAWf,KAAQO,EAAO,CACtB,GAAIwH,GAAW,KAAM,OACrBA,EAAUA,EAAQ/H,CAAI,CAC1B,CACA,OAAO+H,CACX,EAEMgoB,GAAgB,CAACnO,EAAWoO,IAC1BpO,IAASoO,EAAc,EACvBpO,GAAQ,KAAa,GACrBoO,GAAS,KAAa,EACtB,OAAOpO,GAAS,UAAY,OAAOoO,GAAU,SAAiBpO,EAAOoO,EACrE,OAAOpO,GAAS,WAAa,OAAOoO,GAAU,UAAkB,OAAOpO,CAAI,EAAI,OAAOoO,CAAK,EACxF,WAAW,OAAOpO,CAAI,EAAE,cAAc,WAAW,OAAOoO,CAAK,EAAG,OAAW,CAAE,QAAS,GAAM,YAAa,OAAQ,EAGtHC,GAAa,CAAClvB,EAAYsuB,IAA4C,CACxE,MAAMC,EAAY,OAAOD,GAAQ,UAAYA,IAAQ,MAAQ,CAAC,MAAM,QAAQA,CAAG,EAAIA,EAAmB,CAAE,GAAIA,CAAA,EAC5G,SAAW,CAACa,EAAI7vB,CAAM,IAAK,OAAO,QAAQivB,CAA0C,EAChF,OAAQY,EAAA,CACJ,IAAK,KAAM,GAAInvB,IAAUV,EAAQ,MAAO,GAAO,MAC/C,IAAK,KAAM,GAAI,EAAEU,EAASV,GAAiB,MAAO,GAAO,MACzD,IAAK,MAAO,GAAI,EAAEU,GAAUV,GAAiB,MAAO,GAAO,MAC3D,IAAK,KAAM,GAAI,EAAEU,EAASV,GAAiB,MAAO,GAAO,MACzD,IAAK,MAAO,GAAI,EAAEU,GAAUV,GAAiB,MAAO,GAAO,MAC3D,IAAK,KAAM,GAAI,CAAC,MAAM,QAAQA,CAAM,GAAK,CAAEA,EAAiB,SAASU,CAAK,EAAG,MAAO,GAAO,MAC3F,IAAK,MAAO,GAAI,MAAM,QAAQV,CAAM,GAAMA,EAAiB,SAASU,CAAK,EAAG,MAAO,GAAO,MAC1F,QAAS,MAAO,EAAA,CAGxB,MAAO,EACX,EAEMovB,GAAsB,CAACtmB,EAAmBolB,EAAqBU,IAAsC,CACvG,KAAM,CAACC,EAAY,GAAGQ,CAAS,EAAI,OAAO,QAAQT,GAAS,EAAE,EACvDU,EAAe,OAAO,QAAQpB,GAAS,CAAA,CAAE,EAC/C,IAAIqB,EAAW,OAAO,QAAQzmB,CAAG,EAQjC,GANIwmB,EAAa,SACbC,EAAWA,EAAS,OAAO,CAAC,CAAA,CAAGvvB,CAAK,IAChCsvB,EAAa,MAAM,CAAC,CAACnB,EAAOG,CAAG,IAAMY,GAAWH,GAAc/uB,EAAOmuB,CAAK,EAAGG,CAAG,CAAC,CAAA,GAIrFO,EAAY,CACZ,MAAMW,EAAe,CAACX,EAAY,GAAGQ,CAAS,EAC9CE,EAAS,KAAK,CAAC1O,EAAMoO,IAAU,CAC3B,SAAW,CAACd,EAAOvQ,CAAG,IAAK4R,EAAc,CACrC,MAAMxtB,EAASgtB,GAAcD,GAAclO,EAAK,CAAC,EAAGsN,CAAK,EAAGY,GAAcE,EAAM,CAAC,EAAGd,CAAK,CAAC,EAC1F,GAAInsB,EAAQ,OAAO4b,IAAQ,OAAS,CAAC5b,EAASA,CAClD,CACA,MAAO,EACX,CAAC,CACL,CAEA,OAAO,OAAO,YAAYutB,CAAQ,CACtC,EAEME,GAAkB,CAACpwB,EAAc4iB,IAA0B,CAC7D,MAAMyN,EAAI,IAAI,IAAI,GAAGrwB,CAAI,QAASwuB,GAAA,EAAc,IAAA,EAAM,SAAA,CAAU,EAChE,OAAA6B,EAAE,aAAa,IAAI,UAAW,MAAM,EAChCzN,GAAMyN,EAAE,aAAa,IAAI,OAAQzN,CAAI,EAClCyN,EAAE,SAAA,CACb,EAEO,MAAMC,EAAoD,CAA1D,aAAA,CASH,KAAA,YAAc,MAAOtwB,EAAc2uB,EAAY,KAA6B,OACxE,GAAI,CACA,MAAM/L,EAAOsK,GAAA,EACb,GAAI,CAACtK,EAAM,MAAO,CAAA,EAClB,MAAMzN,EAAQ,OAAM9G,EAAAuU,EAAK,cAAL,YAAAvU,EAAkB,aAAa,MAAM,IAAA,KACnDuE,EAAMwd,GAAgBpwB,EAAMmV,CAAK,EACjC+K,EAAM,MAAM,MAAMtN,CAAG,EAC3B,GAAI,CAACsN,EAAI,GAAI,MAAM,IAAI,MAAM,GAAGA,EAAI,MAAM,IAAIA,EAAI,UAAU,EAAE,EAC9D,MAAM9E,EAAO,MAAM8E,EAAI,KAAA,EACvB,OAAO9E,EAAO,OAAO,KAAKA,CAAI,EAAI,CAAA,CACtC,OAAS9F,EAAO,CACZ,OAAAmZ,GAAY,wCAAwCzuB,CAAI,GAAIsV,EAAOqZ,CAAS,EACrE,CAAA,CACX,CACJ,EAEA,KAAA,KAAO,MAAO3uB,EAAc,CAAE,MAAA6uB,EAAO,MAAAU,EAAO,QAAAgB,EAAU,GAAO,UAAA5B,EAAY,EAAA,EAAuB,CAAA,IAAqB,CACjH,KAAM,CAAE,MAAAc,EAAO,YAAAe,CAAA,EAAgBlB,GAAed,KAAc,IAAIxuB,CAAI,EAAGuvB,EAAOV,CAAK,EACnF,GAAI,CACA,MAAM4B,EAAW,MAAMhB,EAAM,IAAA,EAC7B,GAAIgB,EAAS,SAAU,CACnBjE,GAAW,yCAAyCxsB,CAAI,EAAE,EAC1D,MAAM0wB,EAAYX,GAAoBU,EAAS,IAAA,EAAOD,EAAajB,CAAK,EACxE,OAAOgB,EAAU,OAAO,OAAOG,CAAS,EAAIA,CAChD,MAAW/B,GACPF,GAAY,uCAAuCzuB,CAAI,GAAI,KAAM2uB,CAAS,CAElF,OAASrZ,EAAO,CACZmZ,GAAY,gCAAgCzuB,CAAI,GAAIsV,EAAOqZ,CAAS,CACxE,CACJ,EAEA,KAAA,OAAS,MAAO3uB,EAAcyY,EAAWkW,EAAY,KAAyB,CAC1E,GAAI,CACA,MAAMH,KAAc,IAAIxuB,CAAI,EAAE,OAAOyY,CAAI,EACzC+T,GAAW,4CAA4CxsB,CAAI,EAAE,CACjE,OAASsV,EAAO,CACZmZ,GAAY,iCAAiCzuB,CAAI,GAAIsV,EAAOqZ,CAAS,CACzE,CACJ,EAEA,KAAA,IAAM,MAAO3uB,EAAcyY,EAAWkW,EAAY,KAAyB,CACvE,GAAI,CACA,MAAMH,KAAc,IAAIxuB,CAAI,EAAE,IAAIyY,CAAI,EACtC+T,GAAW,6CAA6CxsB,CAAI,EAAE,CAClE,OAASsV,EAAO,CACZmZ,GAAY,iCAAiCzuB,CAAI,GAAIsV,EAAOqZ,CAAS,CACzE,CACJ,EAEA,KAAA,UAAY,MACR3uB,EACAyY,EACA,CAAE,UAAAkY,EAAY,IAAM,MAAAC,EAAQ,GAAO,WAAAC,CAAA,EAAiC,CAAA,IACpD,CAChB,MAAMpB,EAAQjB,KAAc,IAAIxuB,CAAI,EACpC,GAAI,CACI4wB,IACA,MAAMnB,EAAM,OAAA,EACZoB,GAAA,MAAAA,EAAa,EAAG,EAAG,4BAA4B7wB,CAAI,KAEvD,MAAMuJ,EAAU,OAAO,QAAQ+Q,GAAY7B,CAAI,CAAC,EAC1CqY,EAAc,KAAK,KAAKvnB,EAAQ,OAASonB,CAAS,EACxD,QAAStwB,EAAI,EAAGA,EAAIkJ,EAAQ,OAAQlJ,GAAKswB,EAAW,CAChD,MAAMI,EAAQ,OAAO,YAAYxnB,EAAQ,MAAMlJ,EAAGA,EAAIswB,CAAS,CAAC,EAChE,MAAMlB,EAAM,OAAOsB,CAAK,EACxB,MAAMC,EAAO,KAAK,MAAM3wB,EAAIswB,CAAS,EAAI,EACzCE,GAAA,MAAAA,EAAaG,EAAMF,EAAa,gBAAgBE,CAAI,IAAIF,CAAW,GACvE,CACJ,OAASxb,EAAO,CACZmZ,GAAY,0CAA0CzuB,CAAI,GAAIsV,EAAO,EAAK,CAC9E,CACJ,EAEA,KAAA,OAAS,MAAOtV,EAAc2uB,EAAY,KAAyB,CAC/D,GAAI,CACA,MAAMH,GAAA,EAAc,IAAIxuB,CAAI,EAAE,OAAA,EAC9BwsB,GAAW,+CAA+CxsB,CAAI,EAAE,CACpE,OAASsV,EAAO,CACZmZ,GAAY,mCAAmCzuB,CAAI,GAAIsV,EAAOqZ,CAAS,CAC3E,CACJ,EAEA,KAAA,MAAQ,MAAO3uB,IACE,MAAM,KAAK,YAAYA,CAAI,GAC5B,OAGhB,KAAA,UAAY,CACRA,EACAixB,EACA,CAAE,MAAApC,EAAO,MAAAU,EAAO,SAAA2B,EAAU,OAAAC,CAAA,EAA4B,KACvC,CACf,MAAMvO,EAAOsK,GAAA,EACb,GAAI,CAACtK,GAAQ,CAAC5iB,QAAa,IAAA,GAE3B,MAAMoxB,EAAY,IAAM,CACpB,KAAM,CAAE,MAAA3B,EAAO,YAAAe,CAAA,EAAgBlB,GAAed,KAAc,IAAIxuB,CAAI,EAAGuvB,EAAOV,CAAK,EAE7EwC,EAAiBZ,GAA6C,CAChE,MAAMhnB,EAAoBgnB,EAAS,IAAA,EACnC,GAAI,CAAChnB,EAAK,CAAEwnB,EAAW,CAAA,CAAE,EAAG,MAAQ,CAEpC,MAAMxY,EAAO0Y,EACPA,EAAOpB,GAAoBtmB,EAAK+mB,EAAajB,CAAK,CAAC,EACnDQ,GAAoBtmB,EAAK+mB,EAAajB,CAAK,EAE3ChmB,EAAU,OAAO,QAAQkP,CAAI,EAEnC,GAAI,CAACyY,EAAU,CACX,MAAMI,EAAU/nB,EAAQ,IAAI,CAAC,CAACjJ,EAAKK,CAAK,EAAGD,IACvC,OAAOC,GAAU,UAAYA,IAAU,KACjC,CAAE,OAAQD,EAAO,KAAMJ,EAAK,GAAGK,CAAA,EAC/B,CAAE,OAAQD,EAAO,KAAMJ,EAAK,CAACguB,GAAc,KAAK,EAAG3tB,EAC5D,EACDswB,EAAWK,CAAO,EAClB,MACJ,CAEA,MAAMC,EAAU,OAAO,KAAKL,CAAQ,EAC9BI,EAAU/nB,EAAQ,IAAI,CAAC,CAACjJ,EAAKK,CAAK,EAAGD,IAAU,CACjD,MAAM0D,EAAS,OAAOzD,GAAU,UAAYA,IAAU,KAChD,CAAE,CAAC2tB,GAAc,GAAG,EAAGhuB,EAAK,GAAGK,CAAA,EAC/B,CAAE,CAAC2tB,GAAc,GAAG,EAAGhuB,EAAK,CAACguB,GAAc,KAAK,EAAG3tB,CAAA,EACnD6wB,EAA8B,CAAA,EACpC,UAAWC,KAAQF,EAAS,CACxB,MAAMzC,EAAQoC,EAASO,CAAI,EAC3BD,EAAOC,CAAI,EAAI3C,EAAM,SAAS,GAAG,EAC3BjuB,GAAU,MAAMuD,EAAQ0qB,CAAK,EAC7BA,IAAUR,GAAc,IAAMhuB,EAC9BwuB,IAAUR,GAAc,MAAQ3tB,EAChCyD,EAAO0qB,CAAK,CACtB,CACA,MAAO,CAAE,KAAMxuB,EAAK,OAAQI,EAAO,GAAG8wB,CAAA,CAC1C,CAAC,EACDP,EAAWK,CAAO,CACtB,EAEA,OAAA7B,EAAM,GAAG,QAAS4B,CAAa,EACxB,IAAM,CAAE5B,EAAM,IAAI,QAAS4B,CAAa,CAAG,CACtD,EAEA,IAAIK,EACJ,MAAMC,EAAkBpE,GAAAA,mBAAmB3K,EAAOe,GAAS,CACvD+N,GAAA,MAAAA,IACAA,EAAkB,OACb/N,EAGD+N,EAAkBN,EAAA,EAFlBH,EAAW,CAAA,CAAE,CAIrB,CAAC,EAED,MAAO,IAAM,CACTS,GAAA,MAAAA,IACAC,EAAA,CACJ,CACJ,CAAA,CArKA,uBAAoD,CAChD,OAAO1E,GAAA,CACX,CAEA,cAAwB,CACpB,OAAO,KAAK,wBAAwB,UACxC,CAgKJ,CAEA,MAAA2E,GAAe,IAAItB,GCtWbuB,GAAS,MACX7xB,EACA0uB,EACArU,EACAyX,IACgB,CAChB,MAAMC,EAAO,IAAI,KAAA,EAAO,YAAA,EAElBtZ,EAAO,CACT,KAFS3E,GAAc,MAAM,EAElB,OAAS,UACpB,KAAAie,EACA,OAAArD,EACA,OAAArU,EACA,UAAAyX,CAAA,EAGJ,MAAMF,GAAG,IAAI,QAAQ5xB,CAAI,IAAIoC,GAAa2vB,CAAI,CAAC,GAAItZ,CAAI,CAC3D,ECdMuZ,GAAuC,CACzC,UAAWnpB,GACX,QAASJ,EACT,IAAKM,GACL,IAAKC,CACT,EC0CaipB,GAAQ,CAAC,CAClB,KAAApnB,EAEA,SAAAqnB,EAAW,OACX,aAAAC,EAAe,OACf,YAAA9K,EAAc,OACd,MAAAra,EAAQ,OACR,KAAA3C,EAAO,OACP,SAAA+nB,EAAW,GACX,UAAAC,EAAY,GACZ,SAAAliB,EAAW,GACX,IAAA/O,EAAM,OACN,KAAAE,EAAO,OACP,SAAA4d,EAAW,OACX,IAAAgN,EAAM,OACN,IAAAD,EAAM,OACN,KAAAqG,EAAO,OACP,UAAA7nB,EAAY,OACZ,UAAA/B,EAAY,MAChB,IAAsB,CAClB,KAAM,CAAE,MAAA/H,EAAO,aAAA4xB,EAAc,cAAAC,CAAA,EAAkBC,GAAe,CAAE,KAAA5nB,EAAM,SAAAqnB,EAAU,UAAAznB,EAAW,UAAWJ,EAAM,aAAA8nB,EAAc,EACpH3lB,EAAKkmB,EAAAA,MAAA,EACLC,EAAaC,GAAc,CAAE,KAAA/nB,EAAM,MAAAlK,EAAO,aAAA4xB,EAAc,EAE9D,OACIpqB,EAAA,cAACM,EAAA,CAAQ,UAAW+pB,CAAA,EACfxlB,mBAAUsf,GAAA,CAAM,MAAAtf,EAAc,SAAAolB,EAAoB,QAAS5lB,CAAA,CAAI,kBAC/D/D,EAAA,CAAQ,UAAWrH,GAAOE,EAAO,cAAgB,EAAA,EAC7CF,GAAO+G,EAAA,cAAC,OAAA,CAAK,UAAU,kBAAA,EAAoB/G,CAAI,EAChD+G,EAAA,cAAC,QAAA,CACG,GAAAqE,EACA,KAAAnC,EACA,KAAAQ,EACA,UAAW,eAAenC,EAAY,IAAMA,EAAY,EAAE,GAC1D,YAAA2e,EACA,SAAA+K,EACA,SAAUjiB,GAAa,CAACkiB,GAAa,CAAC7Z,GAAQ7X,CAAK,EACnD,MAAAA,EACA,SAAU4xB,EACV,IAAArG,EACA,IAAAD,EACA,KAAAqG,EACA,WAAa9jB,GAAMA,EAAE,eAAA,EACrB,OAAQmkB,CAAA,CAAA,EAEXrxB,GAAQ6G,EAAA,cAAC,OAAA,CAAK,UAAU,kBAAA,EAAoB7G,CAAK,CACtD,EACC4d,GAAY/W,EAAA,cAAC,MAAA,CAAI,UAAU,UAAA,EAAY+W,CAAS,CACrD,CAER,EAEa2T,GAAUtnB,GACnBpD,EAAA,cAAC8pB,IAAO,GAAG1mB,EAAO,KAAK,MAAA,CAAO,EAGrBunB,GAAUvnB,GACnBpD,EAAA,cAAC8pB,IAAO,GAAG1mB,EAAO,KAAK,QAAA,CAAS,EAGvBwnB,GAASxnB,GAClBpD,EAAA,cAAC8pB,IAAO,GAAG1mB,EAAO,KAAK,OAAA,CAAQ,EAGtBynB,GAAYznB,GAAsB,CAC3C,KAAM,CAAC0nB,EAASC,CAAU,EAAI5sB,EAAAA,SAAS,EAAK,EAE5C,OAAO6B,EAAA,cAAC8pB,GAAA,CAAO,GAAG1mB,EAAO,KAAM0nB,EAAU,OAAQ,WAAY,KACzD9qB,EAAA,cAACoV,GAAA,CACG,UAAU,eACV,KAAM0V,EAAU,MAAQ,YACxB,QAAS,IAAMC,EAAW,CAACD,CAAO,CAAA,CAAA,CACtC,CAAA,CAER,EAEaE,GAAS5nB,GAClBpD,EAAA,cAAC8pB,IAAO,GAAG1mB,EAAO,KAAK,OAAA,CAAQ,EAGtB6nB,GAAQ7nB,GACjBpD,EAAA,cAAC8pB,IAAO,GAAG1mB,EAAO,KAAK,MAAA,CAAO,EAGrB8nB,GAAQ9nB,GACjBpD,EAAA,cAAC8pB,IAAO,GAAG1mB,EAAO,KAAK,MAAA,CAAO,EAGrB/M,GAAY+M,GACrBpD,EAAA,cAAC8pB,IAAO,GAAG1mB,EAAO,KAAK,gBAAA,CAAiB,EAG/B+nB,GAAQ/nB,GACjBpD,EAAA,cAAC8pB,IAAO,GAAG1mB,EAAO,KAAK,MAAA,CAAO,EAGrBgoB,GAAShoB,GAClBpD,EAAA,cAAC8pB,IAAO,GAAG1mB,EAAO,KAAK,OAAA,CAAQ,EAGtBioB,GAASjoB,GAClBpD,EAAA,cAAC8pB,IAAO,GAAG1mB,EAAO,KAAK,OAAA,CAAQ,EAGtBkoB,GAAOloB,GAChBpD,EAAA,cAAC8pB,IAAO,GAAG1mB,EAAO,KAAK,KAAA,CAAM,EAGpBmoB,GAAW,CAAC,CACrB,KAAA7oB,EAEA,SAAAqnB,EAAW,OACX,aAAAC,EAAe,OACf,MAAAnlB,EAAQ,OACR,MAAA2P,EAAQ,OACR,SAAAyV,EAAW,GACX,aAAAuB,EAAe,KACf,IAAAvyB,EAAM,OACN,KAAAE,EAAO,OACP,UAAAmJ,EAAY,OACZ,UAAA/B,EAAY,MAChB,IAAqB,CAQjB,MAAMkrB,EAAiBhzB,GAAoBA,GAAK,KAAO,GAAK,GAAGA,CAAC,GAE1D,CAAE,MAAAD,EAAO,aAAA4xB,EAAc,cAAAC,CAAA,EAAkBC,GAAe,CAC1D,KAAA5nB,EACA,SAAAqnB,EACA,UAAAznB,EACA,UAAW,OAAOkpB,GAAiB,SAAW,SAAW,OACzD,aACIxB,IAAiB,OACVyB,EAAczB,CAAmB,IAAMyB,EAAcD,CAAY,EAAIC,EAAcD,CAAY,EAAI,GACpG,MAAA,CACb,EAEKnnB,EAAKkmB,EAAAA,MAAA,EAELmB,EAAwB3hB,GAA+C,CACzE,MAAM4hB,EAAe5hB,EAAM,OAAO,QAAUyhB,EAAe,GAE3DpB,GAAA,MAAAA,EAAe,CACX,OAAQ,CACJ,KAAA1nB,EACA,MAAOipB,CAAA,CACX,GAGJ,QAAQ,IACJ,WACAjpB,EACAlK,EACA,gBACAgzB,EACA,SACA,OAAOhzB,EACP,OAAOgzB,EACP,YACA,OAAOG,CAAA,CAEf,EAEA,MAAI,CAACrpB,GAAauC,IAAOvC,EAAY,YAKjCtC,EAAA,cAACM,EAAA,CAAQ,UAAW+pB,CAAA,EACfpxB,EACD+G,EAAA,cAAC,QAAA,CACG,KAAK,WACL,GAAAqE,EACA,KAAA3B,EACA,MAAA8R,EACA,UAAW,mBAAmBjU,EAAY,IAAMA,EAAY,EAAE,GAC9D,QAASkrB,EAAcjzB,CAAK,IAAMizB,EAAcD,CAAY,EAC5D,SAAUE,CAAA,CAAA,EAEb7mB,GAAS7E,EAAA,cAAC,QAAA,CAAM,UAAU,wBAAwB,QAASqE,GACvDQ,EACAolB,mBAAa,OAAA,CAAK,UAAU,eAAc,IAAO,CACtD,EACC9wB,CACL,CAER,EAEayyB,GAAUxoB,GACnBpD,EAAA,cAACM,GAAQ,UAAW8C,GAAA,YAAAA,EAAO,SAAA,EACvBpD,EAAA,cAACurB,GAAA,CAAU,GAAGnoB,EAAO,UAAU,yBAAyB,CAC5D,EAGS+gB,GAAQ,CAAC,CAClB,MAAAtf,EACA,SAAAolB,EAAW,GACX,QAAA4B,EAAU,OACV,UAAAtrB,EAAY,MAChB,oBAES,QAAA,CAAM,QAAAsrB,EAAkB,UAAW,aAAatrB,EAAY,IAAMA,EAAY,EAAE,EAAA,EAC5EsE,EAAM,IAAEolB,GAAYjqB,EAAA,cAAC,QAAK,UAAU,aAAA,EAAc,GAAC,CACxD,EAIK8rB,GAAW,CAAC,CACrB,KAAAppB,EAEA,SAAAqnB,EAAW,OACX,aAAAC,EAAe,OACf,YAAA9K,EAAc,OACd,MAAAra,EAAQ,OACR,SAAAolB,EAAW,GACX,UAAAC,EAAY,GACZ,SAAAliB,EAAW,GACX,KAAA+jB,EAAO,OACP,OAAAtf,EAAS,CAAA,EACT,IAAAxT,EAAM,OACN,KAAAE,EAAO,OACP,SAAA4d,EAAW,OACX,UAAAxW,EAAY,OACZ,UAAA+B,EAAY,MAChB,IAAqB,CACjB,KAAM,CAAE,MAAA9J,EAAO,aAAA4xB,EAAc,cAAAC,GAAkBC,GAAe,CAAE,KAAA5nB,EAAM,SAAAqnB,EAAU,UAAAznB,EAAW,aAAA0nB,EAAc,EAEnG3lB,EAAKkmB,EAAAA,MAAA,EACLC,EAAaC,GAAc,CAAE,KAAA/nB,EAAM,MAAAlK,EAAO,aAAA4xB,EAAc,EAE9D,OACIpqB,EAAA,cAACM,EAAA,CAAQ,UAAW+pB,CAAA,EACfxlB,mBAAUsf,GAAA,CAAM,SAAA8F,EAAoB,MAAAplB,EAAc,QAASR,CAAA,CAAI,kBAC/D/D,EAAA,CAAQ,UAAWrH,GAAOE,EAAO,cAAgB,EAAA,EAC7CF,GAAO+G,EAAA,cAAC,OAAA,CAAK,UAAU,kBAAA,EAAoB/G,CAAI,EAChD+G,EAAA,cAAC,WAAA,CACG,GAAAqE,EACA,KAAA3B,EACA,UAAW,eAAenC,EAAY,IAAMA,EAAY,EAAE,GAC1D,IAAMnD,GAAQqP,EAASrP,EACvB,KAAA2uB,EACA,YAAA7M,EACA,SAAA+K,EACA,SAAUjiB,GAAa,CAACkiB,GAAa,CAAC7Z,GAAQ7X,CAAK,EACnD,MAAAA,EACA,SAAU4xB,EACV,WAAa/jB,GAAMA,EAAE,eAAA,EACrB,OAAQmkB,CAAA,CAAA,EAEXrxB,GAAQ6G,EAAA,cAAC,OAAA,CAAK,UAAU,kBAAA,EAAoB7G,CAAK,CACtD,EACC4d,GAAY/W,EAAA,cAAC,MAAA,CAAI,UAAU,UAAA,EAAY+W,CAAS,CACrD,CAER,EAEaiV,GAAY,CAAC,CACtB,SAAApuB,EACA,QAAA6C,EAAU,OACV,MAAAoE,EAAQ,OACR,QAAAonB,EAAU,OACV,UAAAC,EAAY,OACZ,OAAAC,EAAS,OACT,SAAAC,EAAW,OACX,QAAAC,EAAU,OACV,IAAApzB,EAAM,OACN,KAAAE,EAAO,OACP,UAAAmJ,EAAY,OACZ,UAAA/B,EAAY,OACZ,UAAA8E,EAAY,MAChB,IAAsB,CAClB,MAAM1E,EAAgB,aAAaJ,EAAY,IAAMA,EAAY,EAAE,GAE7D+rB,EAAeC,GAAkC,CACnD,MAAMC,EAAQC,GACNA,GAAK,MAAQ,OAAOA,GAAM,UAAkB,GAC5C,OAAOA,GAAM,UAAY,OAAOA,GAAM,SAAiB,GAAGA,CAAC,GAC3D,MAAM,QAAQA,CAAC,EAAUA,EAAE,IAAID,CAAI,EAAE,KAAK,GAAG,EAC7CxsB,EAAM,eAAeysB,CAAC,EAAUD,EAAKC,EAAE,MAAM,QAAQ,EAClD,GAGX,OAAOD,EAAKD,CAAI,EAAE,QAAQ,OAAQ,GAAG,EAAE,KAAA,CAC3C,EAEMG,EAAkB,CAACrmB,EAAqCgH,IAAiB,CAC3EhH,EAAE,aAAa,QAAQ,cAAc8lB,GAAA,YAAAA,EAAS9e,KAASA,CAAI,CAC/D,EAEA,uBAAQ/M,EAAA,CAAQ,UAAWgC,GACtBrJ,EACA4L,mBAAU,MAAA,KAAKA,CAAM,EACtB7E,EAAA,cAAC,OAAI,UAAWW,CAAA,EACX/C,EAAS,IAAI,CAAC4I,EAAOjO,IAAU,CAC5B,MAAMo0B,EAAWV,GAAA,YAAAA,EAAS,SAAS1zB,GAC7Bq0B,EAAYR,GAAA,YAAAA,EAAU,SAAS7zB,GAC/Bs0B,EAAYR,GAAA,YAAAA,EAAS,SAAS9zB,GAC9Bu0B,EAAgB,wBAAwBznB,EAAY,IAAMA,EAAY,EACxE,GAAG5E,EAAU,0BAA4B,EACzC,GAAGksB,EAAW,UAAY,EAC1B,GAAGC,EAAY,YAAc,EAC7B,GAAGC,EAAY,WAAa,EAAE,GAElC,OAAOpsB,EACDT,EAAA,cAAC,MAAA,CACC,IAAKzH,EACL,QAAU8N,GAAM,CACR,CAACwmB,GAAa,CAACvmB,GAAqBD,CAAC,GACrC5F,EAAQ4F,EAAG9N,CAAK,CAExB,EACA,UAAWu0B,EACX,MAAO,CAAE,OAAQ,SAAA,CAAU,EAE1BtmB,CAAA,EAILxG,EAAA,cAAC,OAAA,CACG,IAAKzH,EACL,UAAWu0B,EACX,UAAAZ,EACA,YAAaA,EAAa7lB,GAAMqmB,EAAgBrmB,EAAGimB,EAAY9lB,CAAK,CAAC,EAAI,OACzE,MAAO,CAAE,OAAQ0lB,EAAY,OAAS,SAAA,CAAU,EAE/CA,GAAalsB,EAAA,cAAC0E,EAAA,CAAK,KAAK,gBAAgB,EACxC8B,CAAA,CAEb,CAAC,CACL,EACCrN,CACL,CACJ,EC/Xa4zB,GAAuC,CAChD,MAAO,GACP,IAAK,KACT,EAEMC,GAAex0B,GACjB,OAAOA,GAAU,UAAY,CAAC,OAAO,MAAM,KAAK,MAAMA,CAAK,CAAC,EAE1Dy0B,GAAyB,CAAChc,EAAYC,IACpCD,GAAK,MAAQC,GAAK,KAAa,EAC/BD,GAAK,KAAa,EAClBC,GAAK,KAAa,GAElB,OAAOD,GAAM,UAAY,OAAOC,GAAM,SAC/BD,EAAIC,EAGX,OAAOD,GAAM,WAAa,OAAOC,GAAM,UAChC,OAAOD,CAAC,EAAI,OAAOC,CAAC,EAG3BD,aAAa,MAAQC,aAAa,KAC3BD,EAAE,UAAYC,EAAE,QAAA,EAGvB8b,GAAY/b,CAAC,GAAK+b,GAAY9b,CAAC,EACxB,KAAK,MAAMD,CAAC,EAAI,KAAK,MAAMC,CAAC,EAGhC,OAAOD,CAAC,EAAE,cAAc,OAAOC,CAAC,EAAG,OAAW,CAAE,QAAS,GAAM,YAAa,OAAQ,EAGlFgc,GAAQ,CACjB,UAAU9F,EAA+D,CACrE,GAAKA,GAAA,MAAAA,EAAO,MACZ,MAAO,CACH,MAAOA,EAAM,MACb,IAAKA,EAAM,MAAQ,OAAS,OAAS,KAAA,CAE7C,EAEA,OAAO5nB,EAAkCmnB,EAAsC,CAC3E,MAAI,CAACnnB,GAAWA,EAAQ,QAAUmnB,EACvB,CAAE,MAAAA,EAAO,IAAK,KAAA,EAGlB,CACH,MAAAA,EACA,IAAKnnB,EAAQ,MAAQ,MAAQ,OAAS,KAAA,CAE9C,EAEA,cAAcyR,EAAYC,EAAYkF,EAAsB,MAAe,CACvE,MAAM+W,EAAaF,GAAuBhc,EAAGC,CAAC,EAC9C,OAAOkF,IAAQ,OAAS,CAAC+W,EAAaA,CAC1C,EAEA,eAAsClc,EAAMC,EAAMkW,EAA4B,CAC1E,MAAMvpB,EAAa,KAAK,UAAUupB,CAAK,EACvC,GAAI,CAACvpB,EAAY,MAAO,GAExB,MAAMuvB,EAASnb,GAAehB,EAAGpT,EAAW,KAAK,EAC3CwvB,EAASpb,GAAef,EAAGrT,EAAW,KAAK,EACjD,OAAO,KAAK,cAAcuvB,EAAQC,EAAQxvB,EAAW,GAAG,CAC5D,EAEA,QAA+BsrB,EAA0B/B,EAA6C,CAClG,GAAI,CAAC+B,EAAS,OAAOA,EAErB,MAAMtrB,EAAa,KAAK,UAAUupB,CAAK,EACvC,OAAKvpB,EAEE,CAAC,GAAGsrB,CAAO,EAAE,KAAK,CAAC9P,EAAMoO,IAAU,KAAK,eAAepO,EAAMoO,EAAO5pB,CAAU,CAAC,EAF9D,CAAC,GAAGsrB,CAAO,CAGvC,CACJ,ECrCMmE,GAAgB90B,GACbA,EAEE,OAAOA,GAAU,UAAY,OAAOA,GAAU,SAC/CA,EAAM,SAAA,EAAW,MAAM,GAAG,EAC1BA,EAJa,CAAA,EAOjB+0B,GACFxE,GACS,SACT,OAAKA,EAID,OAAOA,GAAa,SACb,CAAE,OAAOA,GAAA,YAAAA,EAAU,aAAc,GAAI,OAAOA,GAAA,YAAAA,EAAU,aAAc,EAAA,EAGxE,CACH,QAAO7iB,EAAA6iB,GAAA,YAAAA,EAAU,QAAV,YAAA7iB,EAAiB,aAAc,GACtC,QAAOyD,EAAAof,GAAA,YAAAA,EAAU,QAAV,YAAApf,EAAiB,aAAc,EAAA,EAT/B,CAAE,MAAO,SAAU,MAAO,QAAA,CAWzC,EAEM6jB,GAAmBrE,GACrBA,EAAQ,IAAKjX,GAAWqb,GAAgB,CACpC,MAAOrb,EAAO,OAASA,EAAO,MAAQA,EAAO,OAASA,EAAO,MAAQ,GACrE,MAAOA,EAAO,OAASA,EAAO,MAAQA,EAAO,OAASA,EAAO,MAAQ,EACzE,CAAC,CAAC,EAEN,SAASub,GACLhE,EACe,CACf,MAAO,CACH,SAAUA,GAAA,MAAAA,EAAI,SACR8D,GAAgB9D,EAAG,QAAQ,EAC3B,OACN,MAAOA,GAAA,YAAAA,EAAI,MACX,MAAOA,GAAA,YAAAA,EAAI,MACX,OAAQA,GAAA,YAAAA,EAAI,MAAA,CAEpB,CAEA,MAAMiE,GAAc,CAChB3E,EACA4E,EACAvG,IACC,CACD,MAAMwG,EAAc7E,GAAA,YAAAA,EAAW3B,EAAM,OAC/B,CAACyG,CAAY,EAAI,OAAO,QAAQF,GAAW,CAAA,CAAE,EAEnD,GAAI,CAACE,GAAgB,CAACD,EAAa,MAAO,GAE1C,KAAM,CAACE,EAASC,CAAK,EAAIF,EACzB,OAAOC,IAAYF,GAAeG,IAAU3G,EAAM,GACtD,EAGM4G,GAAa,CACfzb,EACA0b,EACA7G,EACAuG,EACA5E,IACW,CACX,MAAMmF,EAAiB9G,GAAS,CAAE,GAAG2F,GAAe,MAAO,OAAA,EACrDoB,EAAW,CACb,GAAG5b,EAAQ,IAAIgb,EAAe,EAC9B,GAAGU,CAAA,EAGP,OAAI1b,EAAQ,SAAW,GAAKmb,GAAY3E,EAAU4E,EAASO,CAAc,EAC9DC,EAGJjB,GAAM,QAAQiB,EAAUD,CAAc,GAAK,CAAA,CACtD,EAEaE,GAAS,CAAC,CACnB,KAAA1rB,EACA,SAAAqnB,EAAW,OACX,aAAAC,EAAe,OACf,SAAAC,EAAW,GACX,UAAAC,EAAY,GACZ,SAAAliB,EAAW,GACX,YAAAqmB,EAAc,CACV,MAAO,YACP,MAAO,EAAA,EAEX,MAAAxpB,EAAQ,OACR,MAAA2P,EAAQ,OACR,IAAAvb,EAAM,OACN,KAAAE,EAAO,OACP,SAAA4d,EAAW,OACX,QAAAxE,EAAU,CAAA,EACV,GAAAkX,EAAK,OACL,MAAArC,EAAQ,OACR,UAAA9kB,EAAY,OACZ,UAAA/B,EAAY,MAChB,IAAmB,CACf,KAAM,CAAE,MAAA/H,EAAO,aAAA4xB,EAAc,cAAAC,GAAkBC,GAAe,CAAE,KAAA5nB,EAAM,SAAAqnB,EAAU,UAAAznB,EAAW,aAAA0nB,EAAc,EAEnG7tB,EAAQ8D,EAAiB,EAEzBquB,EAAYxwB,EAAAA,QAAQ,IAAM2vB,GAAahE,CAAE,EAAG,CAACA,GAAA,YAAAA,EAAI,SAAUA,GAAA,YAAAA,EAAI,MAAOA,GAAA,YAAAA,EAAI,MAAOA,GAAA,YAAAA,EAAI,MAAM,CAAC,EAC5F8E,EAAWjS,GAAA,EACX,CAAC2R,EAAQO,CAAS,EAAIrwB,EAAAA,SAAmB,CAAA,CAAE,EACjDc,EAAAA,UAAU,IACCsvB,EAAS,UAAU9E,GAAA,YAAAA,EAAI,KAAON,GAAYqF,EAAUhB,GAAgBrE,CAAO,CAAC,EAAGmF,CAAS,EAChG,CAACC,EAAU9E,GAAA,YAAAA,EAAI,KAAM6E,CAAS,CAAC,EAElC,MAAMG,EAAO3wB,EAAAA,QAAQ,IAAM,CACvB,MAAM4wB,EAAkBV,GAAWzb,EAAS0b,EAAQ7G,EAAOqC,GAAA,YAAAA,EAAI,MAAO6E,EAAU,QAAQ,EAExF,OAAOpe,GACH1X,GAAS,CAACk2B,EAAgB,OACpB,CAAC,GAAGA,EAAiB,CAAE,MAAO,KAAKl2B,EAAM,SAAA,CAAU,GAAI,MAAOA,EAAM,SAAA,CAAS,CAAG,EAChFk2B,CAAA,CAGd,EAAG,CAACnc,EAAS0b,EAAQ7G,EAAOqC,GAAA,YAAAA,EAAI,MAAO6E,EAAU,SAAU91B,CAAK,CAAC,EAE7D,CAACA,GAAS,CAAC61B,GAAeI,EAAK,OAAS,IACxCrE,GAAA,MAAAA,EAAe,CAAE,OAAQ,CAAE,KAAA1nB,EAAM,MAAO+rB,EAAK,CAAC,EAAE,KAAA,KAIpD,MAAMpqB,EAAKkmB,EAAAA,MAAA,EACX,OACIvqB,EAAA,cAACM,EAAA,CAAQ,UAAW+pB,GAAiBluB,EAAM,OAAO,SAAA,EAC7C0I,GAAS7E,EAAA,cAACmkB,GAAA,CAAM,MAAAtf,EAAc,SAAAolB,EAAoB,QAAS5lB,CAAA,CAAI,EAChErE,EAAA,cAACM,EAAA,CAAQ,UAAWrH,GAAOE,EAAO,0BAA4B,IACzDF,GAAO+G,EAAA,cAAC,OAAA,CAAK,UAAU,kBAAA,EAAoB/G,CAAI,EAChD+G,EAAA,cAAC,SAAA,CACG,GAAAqE,EACA,KAAA3B,EACA,UAAWnB,EAAG,cAAehB,GAAapE,EAAM,OAAO,SAAS,EAChE,MAAO3D,GAAS,GAChB,SAAAyxB,EACA,SAAUjiB,GAAa,CAACkiB,GAAa,CAAC7Z,GAAQ7X,CAAK,EACnD,SAAU4xB,EACV,MAAA5V,CAAA,EAEC6Z,GAAeruB,EAAA,cAAC,SAAA,CAAO,IAAK,GAAGqE,CAAE,SAAU,MAAOgqB,EAAY,KAAA,EAAQA,EAAY,KAAM,EACxFI,EAAK,IAAI,CAAC9G,EAAIpvB,IAAUyH,EAAA,cAAC,UAAO,IAAK,GAAGqE,CAAE,IAAI9L,CAAK,GAAI,MAAOovB,EAAG,KAAA,EAAQA,EAAG,KAAM,CAAS,CAAA,EAE/FxuB,GAAQ6G,EAAA,cAAC,OAAA,CAAK,UAAU,kBAAA,EAAoB7G,CAAK,CACtD,EACC4d,GAAY/W,EAAA,cAAC,MAAA,CAAI,UAAU,UAAA,EAAY+W,CAAS,CACrD,CAER,EAEa4X,GAAe,CAAC,CACzB,KAAAjsB,EACA,aAAAsnB,EAAe,OACf,IAAAjG,EAAM,OACN,IAAAD,EAAM,OACN,SAAAiG,EAAW,OACX,SAAAE,EAAW,GACX,UAAAC,EAAY,GACZ,SAAAliB,EAAW,GACX,MAAAnD,EAAQ,OACR,MAAA2P,EAAQ,OACR,YAAA0K,EAAc,OACd,IAAAjmB,EAAM,OACN,KAAAE,EAAO,OACP,SAAA4d,EAAW,OACX,QAAAxE,EAAU,CAAA,EACV,GAAAkX,EAAK,OACL,MAAArC,EAAQ,OACR,UAAA9kB,EAAY,OACZ,UAAA/B,EAAY,OACZ,UAAAquB,EAAY,GACZ,SAAAC,EAAW,MACf,IAAyB,CACrB,KAAM,CAAE,MAAAr2B,EAAO,aAAA4xB,EAAc,cAAAC,GAAkBC,GAAe,CAAE,KAAA5nB,EAAM,SAAAqnB,EAAU,UAAAznB,EAAW,aAAA0nB,EAAc,EAEnG7tB,EAAQ8D,EAAiB,EAEzB6uB,EAAahxB,EAAAA,QAAQ,IAAMwvB,GAAa90B,CAAK,EAAG,CAACA,CAAK,CAAC,EACvD,CAACu2B,EAAeC,CAAgB,EAAI7wB,EAAAA,SAAS,IAAM2wB,CAAU,EACnE7vB,EAAAA,UAAU,IAAM,CACP+R,GAAY8d,EAAYC,CAAa,GACtCC,EAAiBF,CAAU,CAEnC,EAAG,CAACA,CAAU,CAAC,EAEf,MAAMR,EAAYxwB,EAAAA,QAAQ,IAAM2vB,GAAahE,CAAE,EAAG,CAACA,GAAA,YAAAA,EAAI,SAAUA,GAAA,YAAAA,EAAI,MAAOA,GAAA,YAAAA,EAAI,MAAOA,GAAA,YAAAA,EAAI,MAAM,CAAC,EAC5F8E,EAAWjS,GAAA,EACX,CAAC2R,EAAQO,CAAS,EAAIrwB,EAAAA,SAAmB,CAAA,CAAE,EACjDc,EAAAA,UAAU,IACCsvB,EAAS,UAAU9E,GAAA,YAAAA,EAAI,KAAON,IAAYqF,EAAUhB,GAAgBrE,EAAO,CAAC,EAAGmF,CAAS,EAChG,CAACC,EAAU9E,GAAA,YAAAA,EAAI,KAAM6E,CAAS,CAAC,EAElC,KAAM,CAACW,EAAWC,CAAY,EAAI/wB,EAAAA,SAAmB,CAAA,CAAE,EAEjDswB,EAAO3wB,EAAAA,QAAQ,IAAM,CACvB,MAAM4wB,GAAkBV,GAAW,CAAC,GAAGzb,EAAS,GAAG0c,CAAS,EAAGhB,EAAQ7G,EAAOqC,GAAA,YAAAA,EAAI,MAAO6E,EAAU,QAAQ,EAC3G,OAAOpe,GAAYwe,GAAiB,OAAO,CAC/C,EAAG,CAACnc,EAAS0c,EAAWhB,EAAQ7G,EAAOqC,GAAA,YAAAA,EAAI,MAAO6E,EAAU,QAAQ,CAAC,EAE/Da,EAAc,CAACC,GAAsBC,KAA8B,CACrE,GAAKD,GACL,IAAIL,EAAc,SAASK,EAAY,GAAMtL,GAAOiL,EAAc,QAAUjL,EAAM,CAC9EuL,GAAQ,MAAQ,GAChB,MACJ,CACAL,EAAiBM,GAAa,CAC1B,MAAMC,GAAe,CAAC,GAAGD,EAAWF,EAAY,EAChD,kBAAW,IAAM,CACbhF,GAAA,MAAAA,EAAe,CAAE,OAAQ,CAAE,KAAA1nB,EAAM,MAAO6sB,EAAA,GAC5C,EAAG,CAAC,EACGA,EACX,CAAC,EACDF,GAAQ,MAAQ,GACpB,EAEMG,EAA4BnpB,IAA2C,CACzE,MAAM+oB,GAAe/oB,GAAE,OAAO,MACfooB,EAAK,KAAK9G,IAAMA,GAAG,QAAUyH,EAAY,GAExDD,EAAYC,GAAc/oB,GAAE,MAAM,CACtC,EAEM2D,EAAiB3D,IAA6C,CAChE,GAAIA,GAAE,MAAQ,QAAS,OACvBA,GAAE,eAAA,EACF,MAAM+oB,GAAgB/oB,GAAE,OAA4B,MAAM,KAAA,EAC1D,GAAI,CAAC+oB,GAAc,OAGnB,GAAI,CADWX,EAAK,KAAK9G,IAAMA,GAAG,QAAUyH,EAAY,EAC3C,CACT,GAAI,CAACR,EAAW,OAChBM,EAAa3oB,IAAQ,CAAC,GAAGA,GAAM,CAAE,MAAO6oB,GAAc,MAAOA,EAAA,CAAc,CAAC,EAC5EP,GAAA,MAAAA,EAAWO,GACf,CACAD,EAAYC,GAAc/oB,GAAE,MAA0B,CAC1D,EAEMopB,EAAcL,IAAyB,CACzCJ,EAAiBM,IAAa,CAC1B,MAAMC,EAAeD,GAAU,OAAOxpB,IAAQA,KAASspB,EAAY,EACnE,kBAAW,IAAM,CACbhF,GAAA,MAAAA,EAAe,CAAE,OAAQ,CAAE,KAAA1nB,EAAM,MAAO6sB,CAAA,GAC5C,EAAG,CAAC,EACGA,CACX,CAAC,CACL,EAEMlrB,EAAKkmB,EAAAA,MAAA,EACLmF,EAAS,GAAGrrB,CAAE,WACpB,OACIrE,EAAA,cAACM,EAAA,CAAQ,UAAW+pB,GAAiBluB,EAAM,aAAa,SAAA,EACnD0I,GAAS7E,EAAA,cAACmkB,GAAA,CAAM,MAAAtf,EAAc,SAAAolB,EAAoB,QAAS5lB,CAAA,CAAI,EAChErE,EAAA,cAACM,EAAA,CAAQ,UAAWrH,GAAOE,EAAO,0BAA4B,EAAA,EACzDF,GAAO+G,EAAA,cAAC,OAAA,CAAK,UAAU,oBAAoB/G,CAAI,EAChD+G,EAAA,cAAC,MAAA,CAAI,UAAW,4EAAA,EACX+uB,EAAc,IAAIjpB,IACf9F,EAAA,cAAC,OAAA,CAAK,UAAU,kIAAkI,IAAK8F,EAAA,EAClJA,GAAK9F,EAAA,cAAC,SAAA,CAAO,KAAK,SAAS,UAAU,yDAAyD,QAAS,IAAMyvB,EAAW3pB,EAAI,CAAA,EAAG,GAAC,CACrI,CACH,GACC,CAACge,GAAOiL,EAAc,OAASjL,IAC7B9jB,EAAA,cAAC,QAAA,CACG,GAAAqE,EACA,KAAK,OACL,UAAW9C,EAAG,yGAA0GhB,GAAapE,EAAM,aAAa,SAAS,EACjK,SAAU8tB,GAAY8E,EAAc,QAAUhL,GAAO,GACrD,SAAU/b,GAAa,CAACkiB,GAAa,CAAC7Z,GAAQ7X,CAAK,EACnD,YAAao2B,EAAa1P,GAAe,iCAAoCA,EAC7E,MAAA1K,EACA,KAAMkb,EACN,SAAUF,EACV,UAAWxlB,CAAA,CAAA,CAGvB,EACAhK,EAAA,cAAC,YAAS,GAAI0vB,GACTjB,EAAK,IAAI,CAAC9G,GAAIpvB,qBAAW,SAAA,CAAO,MAAOovB,GAAG,MAAO,IAAK,GAAGtjB,CAAE,IAAI9L,EAAK,IAAKovB,GAAG,KAAM,CAAS,CAChG,EACCxuB,mBAAS,OAAA,CAAK,UAAU,oBAAoBA,CAAK,CACtD,EACC4d,GAAY/W,EAAA,cAAC,OAAI,UAAU,YAAY+W,CAAS,CACrD,CAER,EAEa4Y,GAAY,CAAC,CACtB,KAAAjtB,EACA,aAAAsnB,EAAe,OACf,SAAAD,EAAW,OACX,SAAAE,EAAW,GACX,UAAAC,EAAY,GACZ,SAAAliB,EAAW,GACX,MAAAnD,EAAQ,OACR,MAAA2P,EAAQ,OACR,IAAAvb,EAAM,OACN,KAAAE,EAAO,OACP,SAAA4d,EAAW,OACX,QAAAxE,EAAU,CAAA,EACV,GAAAkX,EAAK,OACL,MAAArC,EAAQ,OACR,UAAA9kB,EAAY,OACZ,UAAA/B,EAAY,OACZ,WAAAqvB,EAAa,MACjB,IAAsB,CAClB,KAAM,CAAE,MAAAp3B,EAAO,aAAA4xB,EAAc,cAAAC,GAAkBC,GAAe,CAAE,KAAA5nB,EAAM,SAAAqnB,EAAU,UAAAznB,EAAW,aAAA0nB,EAAc,EAEnG8E,EAAahxB,EAAAA,QAAQ,IAAMwvB,GAAa90B,CAAK,EAAG,CAACA,CAAK,CAAC,EACvD,CAACu2B,EAAeC,CAAgB,EAAI7wB,EAAAA,SAAS,IAAM2wB,CAAU,EACnE7vB,EAAAA,UAAU,IAAM,CACP+R,GAAY8d,EAAYC,CAAa,GACtCC,EAAiBF,CAAU,CAEnC,EAAG,CAACA,CAAU,CAAC,EAEf,MAAMR,EAAYxwB,EAAAA,QAAQ,IAAM2vB,GAAahE,CAAE,EAAG,CAACA,GAAA,YAAAA,EAAI,SAAUA,GAAA,YAAAA,EAAI,MAAOA,GAAA,YAAAA,EAAI,MAAOA,GAAA,YAAAA,EAAI,MAAM,CAAC,EAC5F8E,EAAWjS,GAAA,EACX,CAAC2R,EAAQO,CAAS,EAAIrwB,EAAAA,SAAmB,CAAA,CAAE,EACjDc,EAAAA,UAAU,IACCsvB,EAAS,UAAU9E,GAAA,YAAAA,EAAI,KAAON,GAAYqF,EAAUhB,GAAgBrE,CAAO,CAAC,EAAGmF,CAAS,EAChG,CAACC,EAAU9E,GAAA,YAAAA,EAAI,KAAM6E,CAAS,CAAC,EAElC,MAAMG,EAAO3wB,EAAAA,QAAQ,IAAM,CACvB,MAAM4wB,EAAkBV,GAAWzb,EAAS0b,EAAQ7G,EAAOqC,GAAA,YAAAA,EAAI,MAAO6E,EAAU,QAAQ,EACxF,OAAOpe,GAAYwe,EAAiB,OAAO,CAC/C,EAAG,CAACnc,EAAS0b,EAAQ7G,EAAOqC,GAAA,YAAAA,EAAI,MAAO6E,EAAU,QAAQ,CAAC,EAEpDmB,EAAcL,GAAyB,CACzCJ,EAAiBM,GAAa,CAC1B,MAAMC,EAAeD,EAAU,OAAOxpB,GAAQA,IAASspB,CAAY,EACnE,kBAAW,IAAM,CACbhF,GAAA,MAAAA,EAAe,CAAE,OAAQ,CAAE,KAAA1nB,EAAY,MAAO6sB,CAAA,GAClD,EAAG,CAAC,EAEGA,CACX,CAAC,CACL,EAEMM,EAAyBxpB,GAA2C,CACtE,MAAM+oB,EAAe/oB,EAAE,OAAO,MAE9B,GAAI,CAACA,EAAE,OAAO,QAAS,CACnBopB,EAAWL,CAAY,EACvB,MACJ,CAEIX,EAAK,OAAO9G,GAAMA,EAAG,QAAUyH,CAAY,EAAE,SAAW,IAIxDL,EAAc,SAASK,CAAY,GAIvCJ,EAAiBM,GAAa,CAC1B,MAAMC,EAAe,CAAC,GAAGD,EAAWF,CAAY,EAChD,kBAAW,IAAM,CACbhF,GAAA,MAAAA,EAAe,CAAE,OAAQ,CAAE,KAAA1nB,EAAY,MAAO6sB,CAAA,GAClD,EAAG,CAAC,EAEGA,CACX,CAAC,EACL,EAEMlrB,EAAKkmB,EAAAA,MAAA,EACLuF,EAAa9nB,GAAa,CAACkiB,GAAa6E,EAAc,OAAS,EAC/DgB,EACF/vB,EAAA,cAACM,EAAA,CAAQ,UAAWiB,EAChBtI,GAAOE,EAAO,6EAA+E,GAC7F,WAAA,CACJ,EACKs1B,EAAK,IAAK9G,GAAO,CACd,MAAMxvB,EAAMgZ,GAAY,MAAM9M,CAAE,IAAI3B,CAAI,IAAIilB,EAAG,KAAK,EAAE,EACtD,uBACK,MAAA,CAAI,IAAAxvB,EAAU,UAAWoJ,EAAG,4CAA6CquB,CAAU,CAAA,EAChF5vB,EAAA,cAAC,QAAA,CACG,UAAW,4BACX,KAAM,WACN,GAAI7H,EACJ,KAAAuK,EACA,MAAOilB,EAAG,MACV,SAAUkI,EACV,QAASd,EAAc,SAASpH,EAAG,KAAK,EACxC,SAAUmI,EACV,MAAAtb,CAAA,CAAA,kBAEH,QAAA,CAAM,QAASrc,EAAK,UAAW,kBAAA,EAAqBwvB,EAAG,KAAM,CAClE,CAER,CAAC,CACL,EAGJ,OACI3nB,EAAA,cAACM,GAAQ,UAAWiB,EAAG8oB,EAAe9pB,CAAS,CAAA,EAC1CsE,GAAS7E,EAAA,cAAAA,EAAA,SAAA,KAAEA,EAAA,cAACmkB,GAAA,CAAM,MAAAtf,EAAc,UAAW,mBAAoB,SAAAolB,CAAA,CAAoB,EAAEjqB,EAAA,cAAC,KAAA,CAAG,UAAW,MAAA,CAAQ,CAAE,EAC9G/G,GAAOE,EACJ6G,EAAA,cAACM,GAAQ,UAAU,uCAAA,EACdrH,GAAO+G,EAAA,cAAC,OAAA,CAAK,UAAU,oBAAoB/G,CAAI,EAC/C82B,EACA52B,GAAQ6G,EAAA,cAAC,OAAA,CAAK,UAAU,kBAAA,EAAoB7G,CAAK,CACtD,EACA42B,EACHhZ,mBAAa,MAAA,CAAI,UAAU,UAAA,EAAYA,CAAS,CACrD,CAER,ECvcaiZ,GAAY,CACrB,GAAM,gBACN,GAAM,KACN,GAAM,SACN,GAAM,SACN,GAAM,cACN,GAAM,SACN,GAAM,WACN,GAAM,SACN,GAAM,IACV,EAEaC,GAAQ,CACjB,GAAM,WACN,GAAM,UACN,GAAM,WACN,GAAM,UACN,GAAM,UACN,GAAM,YACN,GAAM,UACN,GAAM,MACN,GAAM,KACV,EAGaC,GAAiB,CAAChW,EAAgB,KAAU,CACrD,MAAMiW,EAAU,aAAa,QAAQ,cAAc,GAAK,UAAU,SAAS,MAAM,GAAG,EAAE,CAAC,GAAK,KAC5F,OAAOjW,EAAOiW,EAAUH,GAAUG,CAAiC,CACvE,EACaC,GAAc,CAAClW,EAAgB,KAAU,CAClD,MAAMmW,EAAO,aAAa,QAAQ,WAAW,GAAK,UAAU,SAAS,MAAM,GAAG,EAAE,CAAC,GAAK,KACtF,OAAOnW,EAAOmW,EAAOJ,GAAMI,CAA0B,CACzD,EC9BaC,GAAiB,2CACjBC,GAAsB,oFAEtBC,GAAU,CACrB,4BAA6B;AAAA,UACrBF,EAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOtB,0BAA2B;AAAA,UACnBA,EAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAMdC,EAAmB;AAAA,MAE3B,4BAA6B;AAAA,UACrBD,EAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAMdC,EAAmB;AAAA,MAE3B,iBAAkB;AAAA,UACVD,EAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAcdC,EAAmB;AAAA;AAAA,MAG3B,0BAA2B;AAAA,UACnBD,EAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAUdC,EAAmB;AAAA,MAE3B,gCAAiC;AAAA,UACzBD,EAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAUdC,EAAmB;AAAA,MAE3B,2BAA4B;AAAA,UACpBD,EAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAgCdC,EAAmB;AAAA,MAmD3B,yCAA0C;AAAA,UAClCD,EAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UASdC,EAAmB;AAAA;AAAA;AAAA,MAI3B,uCAAwC;AAAA,UAChCD,EAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UASdC,EAAmB;AAAA;AAAA;AAAA,MAI3B,sCAAuC;AAAA,UAC/BD,EAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UASdC,EAAmB;AAAA;AAAA;AAAA;AAAA,MAK3B,2BAA4B;AAAA,UACpBD,EAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UASdC,EAAmB;AAAA;AAAA;AAAA,MAI3B,oBAAqB;AAAA,UACbD,EAAc;AAAA;AAAA;AAAA,UAGdC,EAAmB;AAAA,MAE3B,cAAe;AAAA,UACPD,EAAc;AAAA;AAAA;AAAA,UAGdC,EAAmB;AAAA,KAE7B,EAEaE,GAAe,CAC1B,4BAA6B,CAC3B,6EAAA,EAEF,0BAA2B,CACzB,6EAAA,EAEF,4BAA6B,CAC3B,6EAAA,EAEF,iBAAkB,CAChB,6EACA,qGAAA,EAEF,0BAA2B,CACzB,qGACA,oCACA,mCAAA,EAEF,gCAAiC,CAC/B,2GACA,oCACA,mCAAA,EAEF,2BAA4B,CAC1B,0FACA,oCACA,mCAAA,EAEF,yCAA0C,CACxC,8GACA,oCACA,mCAAA,EAEF,uCAAwC,CACtC,8GACA,oCACA,mCAAA,EAEF,sCAAuC,CACrC,8GACA,oCACA,mCAAA,EAEF,2BAA4B,CAC1B,8GACA,oCACA,mCAAA,EAEF,oBAAqB,CACnB,8GACA,oCACA,mCAAA,EAEF,cAAe,CACb,4EACA,oCACA,mCAAA,CAEJ,EAEaC,GAAS,CACpB,4BAA6B,2DAC7B,0BAA2B,6DAC3B,4BAA6B,4DAC7B,iBAAkB,8DAClB,0BAA2B,4DAC3B,gCAAiC,mEACjC,2BAA4B,uDAE5B,yCAA0C,mEAC1C,uCAAwC,0CACxC,sCAAuC,mEACvC,2BAA4B,yDAC5B,oBAAqB,yDACrB,cAAe,2CACjB,EAaaC,GAAiB,IACrB,OAAO,OAAOV,EAAK,EAEfW,GAAkB,IACtBC,GAGIC,GAAkB,IACtBC,GAGIC,GAAaC,IACjB,CACL,OAAQT,GAAQS,CAAQ,GAAK,GAC7B,MAAOP,GAAOO,CAAQ,GAAK,EAAA,GAalBC,GAAY,CACvBC,EACAC,EACAC,IACW,CACX,KAAM,CAAE,KAAAhB,EAAM,MAAAiB,EAAO,MAAA9wB,EAAO,MAAA+wB,GAAUH,EACtC,OAAOD,EACJ,WAAW,WAAYE,GAAa,EAAE,EACtC,WAAW,aAAchB,GAAQ,EAAE,EACnC,WAAW,UAAWiB,GAAS,EAAE,EACjC,WAAW,UAAW9wB,GAAS,EAAE,EACjC,WAAW,UAAW+wB,GAAS,EAAE,CACtC,EAwBMC,GAAsB,UACtBC,GAAuB,cACvBC,GAAuB,gBAGvBb,GAAgB,CACpB,gBACA,SACA,SACA,WACA,SACA,eACA,iBACA,WACA,MACA,OACA,eACA,aACA,SACA,QACA,WACA,MACA,QACA,WACA,cACA,aACA,eACA,iBACA,YACA,YACA,aACA,SACA,UACA,eACA,cACA,SACA,aACA,WACA,YACA,UACA,QACA,SACA,aACA,cACA,SACA,cACA,eACA,SACA,OACF,EAEME,GAAgB,CACpB,WACA,aACA,gBACA,iBACA,WACA,WACA,cACA,eACA,aACA,aACA,cACA,cACA,eACA,eACA,YACA,aACA,SACA,YACA,WACF,EAEMY,GAAuC,CAE3C,QAAS,uTACT,WAAY,gJACZ,WAAY,6KACZ,YAAa,0JACb,WAAY,gNACZ,qBAAsB,oKACtB,QAAS,qKACT,iBAAkB,oLAClB,YAAa,yKACb,kBAAmB,qMACnB,qBAAsB,iLACtB,UAAW,6KACX,cAAe,qKACf,cAAe,gKACf,UAAW,0LACX,cAAe,mKAGf,sBAAuB,oHACvB,kBAAmB,yFACnB,4BAA6B,2FAC7B,oBAAqB,iHAGrB,sBAAuB,4JACvB,4BAA6B,sKAC7B,wBAAyB,iKACzB,yBAA0B,sKAC1B,uBAAwB,oKACxB,sBAAuB,8LACvB,iBAAkB,iKAClB,kBAAmB,0JACnB,qBAAsB,2JACxB,EAEO,IAAAC,GAAA,KAAa,CAClB,OAAO,UAAqB,CAC1B,OAAO,OAAO,KAAKD,EAAY,CACjC,CAEA,OAAO,UAAqB,CAC1B,OAAO,OAAO,OAAO1B,EAAK,CAC5B,CAEA,OAAO,cAAyB,CAC9B,OAAO,OAAO,OAAOD,EAAS,CAChC,CAEA,OAAO,WAAsB,CAC3B,OAAOa,EACT,CAEA,OAAO,WAAsB,CAC3B,OAAOE,EACT,CAEA,OAAO,UAA8F,CACnG,MAAO,CACL,KAAMS,GACN,SAAUpB,GAAA,EACV,QAASF,GAAA,EACT,MAAO,aAAa,QAAQ,cAAc,GAAKuB,GAC/C,MAAO,aAAa,QAAQ,cAAc,GAAKC,EAAA,CAEnD,CAEA,OAAO,UAAUG,EAAe50B,EAA6B,GAAY,CACvE,OAAOvE,GAAU,MAAM,CAAE,GAAG,KAAK,WAAY,GAAGuE,CAAA,EAAa00B,GAAaE,GAAQ,KAAK,SAAA,EAAW,IAAI,CAAC,CACzG,CACA,OAAO,YAAYV,EAAgBl0B,EAA6B,GAAY,CAC1E,OAAOvE,GAAU,MAAM,CAAE,GAAG,KAAK,WAAY,GAAGuE,CAAA,EAAak0B,CAAM,CACrE,CACF,ECrfA,MAAMW,GAAc,6CAGdC,GAAsB,GACtBC,GAAgB,QA+BtB,IAAI31B,GACA,OAAO4P,IAAmB,YAC1BA,GAAgBsY,GAAsB,CAClCloB,GAASkoB,EAAU,EACvB,CAAC,EAgBL,MAAM0N,GAAgBx4B,GAAqB,CACvC,GAAI,CACA,OAAQA,EAAI,WAAW,GAAG,GAAKA,EAAI,WAAW,GAAG,EAC3C,KAAK,MAAMA,CAAG,EACdA,CAEV,MAAgB,CACZ,QAAQ,MAAM,yBAAyB,EACvC,MACJ,CACJ,EAEMy4B,GAAS,CAACC,EAAgBrf,EAAeme,IAEpCne,EAGLsf,GAAsB,MACxBnwB,EACAowB,EACAC,EAAa,IACE,CACf,GAAI,EAACj2B,IAAAA,MAAAA,GAAQ,cAAc,CACvB,QAAQ,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAgBrB,EACO,MACJ,CAGA,GADAi2B,IACIA,EAAa,EACb,OAGJ,MAAMC,EAAW,CACb,GAAGF,EACH,CAAE,KAAM,OAAQ,QAAS,oBAAsBpwB,CAAA,CAAQ,EAG3D,eAAQ,IAAI,UAAYqwB,EAAY,uFAAuF,EACpH3f,GAAUmf,GAAa,CAC1B,OAAQ,OACR,QAAS,CACL,eAAgB,mBAChB,cAAiB,UAAYz1B,GAAO,YAAA,EAExC,KAAM,CACF,OAAQ21B,GACR,SAAAO,EACA,YAAaR,EAAA,CACjB,CACH,EACI,KAAKjf,GAAY,CACd,GAAI,EAACA,GAAA,MAAAA,EAAU,SACX,eAAQ,IAAI,4BAA4B,EACjC,KAGX,MAAM0f,EAAkBvwB,EAAU6Q,EAAS,QAAQ,CAAC,EAAE,QAAQ,QAE9D,OAAOmf,GAAaO,CAAe,GAAKJ,GAAoBI,EAAiBH,EAAcC,CAAU,CACzG,CAAC,CACT,EAGMG,GAAiB,MACnBtB,EACA5e,EAGI,CAAA,EACJ0e,IACe,CAGX,MAAMyB,GAFUzB,IAAa,OAAYR,GAAaQ,CAAQ,GAAK,CAAA,EAAK,CAAA,GAEvC,IAAKY,IAAkB,CACtD,KAAM,SACN,QAASA,CAAA,EACT,EAGArf,EAAO,CACT,MAAOD,EAAQ,OAASyf,GACxB,SAAU,CACN,GAAGU,EACH,CAAE,KAAM,OAAQ,QAASvB,CAAA,CAAO,EAEpC,YAAa5e,EAAQ,aAAewf,EAAA,EAIxC,OAAOpf,GAAUmf,GAAa,CAC1B,OAAQ,OACR,QAAS,CACL,eAAgB,mBAChB,cAAiB,WAAYz1B,IAAAA,YAAAA,GAAQ,aAAA,EAEzC,KAAAmW,CAAA,CACH,EACI,KAAKM,IACF,QAAQ,IAAI,eAAe,EAC3B,QAAQ,IAAIA,CAAQ,EACbof,GAAOS,GAAiB7f,CAAkB,EAAE,EACtD,KAAKA,GACGA,GAAA,MAAAA,EAAU,QACRmf,GAAanf,EAAS,QAAQ,CAAC,EAAE,QAAQ,OAAO,GAChDsf,GAAoBtf,EAAS,QAAQ,CAAC,EAAE,QAAQ,QAAS4f,CAAK,EAFtC,IAGlC,CACT,EA+HA,SAAwBE,GAAQhvB,EAAWivB,GAAkB,CACzD,OAAOJ,EACX,CA6BA,MAAME,GAAkB,SAClBG,GAAkB,SAClBC,GAAqB,YACrBC,GAAmB,UACnBH,GAAmBF,GAEnBM,GAAuB,CACzB,CAACN,EAAe,EAAG,eACnB,CAACG,EAAe,EAAG,eACnB,CAACC,EAAkB,EAAG,kBACtB,CAACC,EAAgB,EAAG,eACxB,EAEaE,GAAkC,CAC3CtvB,EAAmCivB,KACNva,GAC7B,cAAc1U,CAAQ,GACtBwU,GACI/b,GACA,CAAC42B,GAAqBrvB,CAAQ,CAAC,EAC/B,KAAA,CAER,EAEMuvB,GAAY,CACd,CAACR,EAAe,EAAG,CACf,KAAMA,GACN,IAAK,6CACL,MAAO,UACP,OAAQ,CAAC,UAAW,eAAgB,eAAgB,QAAS,aAAc,YAAY,EACvF,UAAW,0CACX,WAAY,CACR,0CACA,iCACA,4BACA,oCAAA,EAEJ,YAAa,GACb,aAAc,KACH,CACH,eAAgB,mBAChB,cAAiB,WAAYt2B,IAAAA,YAAAA,GAAQ,aAAA,GAG7C,UAAW,CAAC80B,EAAgBU,EAActf,KAC/B,CACH,MAAOA,EAAQ,OAAS4gB,GAAUR,EAAe,EAAE,MACnD,SAAU,CACN,GAAId,EAAO,CAAC,CAAE,KAAM,SAAU,QAASA,CAAA,CAAM,EAAI,CAAA,EACjD,CAAE,KAAM,OAAQ,QAASV,CAAA,CAAO,EAEpC,YAAa5e,EAAQ,aAAe4gB,GAAUR,EAAe,EAAE,WAAA,GAGvE,cAAgB7f,GACPA,GAAA,MAAAA,EAAU,QACRA,EAAS,QAAQ,CAAC,EAAE,QAAQ,QADJ,IAEnC,EAEJ,CAACggB,EAAe,EAAG,CACf,KAAMA,GACN,IAAK,oCACL,MAAO,iBACP,OAAQ,CAAC,iBAAkB,mBAAoB,wBAAyB,uBAAuB,EAC/F,YAAa,GACb,aAAc,KACH,CACH,eAAgB,mBAChB,cAAiB,WAAYz2B,IAAAA,YAAAA,GAAQ,aAAA,GAG7C,UAAW,CAAC80B,EAAgBU,EAActf,KAC/B,CACH,MAAOA,EAAQ,OAAS4gB,GAAUL,EAAe,EAAE,MACnD,UAAW,CAAC,CAAE,QAASjB,EAAOA,EAAO;AAAA;AAAA,EAASV,EAASA,EAAQ,EAC/D,YAAa5e,EAAQ,aAAe4gB,GAAUL,EAAe,EAAE,WAAA,GAGvE,cAAgBhgB,GACPA,GAAA,MAAAA,EAAU,YACRA,EAAS,YAAY,CAAC,EAAE,KADI,IAEvC,EAEJ,CAACigB,EAAkB,EAAG,CAClB,KAAMA,GACN,IAAK,2CACL,MAAO,aACP,OAAQ,CAAC,aAAc,oBAAqB,WAAY,iBAAiB,EACzE,YAAa,GACb,aAAc,KACH,CACH,eAAgB,mBAChB,cAAiB,WAAY12B,IAAAA,YAAAA,GAAQ,gBAAA,GAG7C,UAAW,CAAC80B,EAAgBU,EAActf,KAC/B,CACH,MAAOA,EAAQ,OAAS4gB,GAAUJ,EAAkB,EAAE,MACtD,SAAU,CACN,GAAIlB,EAAO,CAAC,CAAE,KAAM,SAAU,QAASA,CAAA,CAAM,EAAI,CAAA,EACjD,CAAE,KAAM,OAAQ,QAASV,CAAA,CAAO,EAEpC,YAAa5e,EAAQ,aAAe4gB,GAAUJ,EAAkB,EAAE,WAAA,GAG1E,cAAgBjgB,GACPA,GAAA,MAAAA,EAAU,QACRA,EAAS,QAAQ,CAAC,EAAE,QAAQ,QADJ,IAEnC,EAEJ,CAACkgB,EAAgB,EAAG,CAChB,KAAMA,GACN,IAAK,yCACL,MAAO,oBACP,OAAQ,CAAC,oBAAqB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,gBAAiB,gBAAiB,iBAAiB,EAC9J,YAAa,GACb,aAAc,KACH,CACH,eAAgB,mBAChB,cAAiB,WAAY32B,IAAAA,YAAAA,GAAQ,cAAA,GAG7C,UAAW,CAAC80B,EAAgBU,EAActf,KAC/B,CACH,MAAOA,EAAQ,OAAS4gB,GAAUH,EAAgB,EAAE,MACpD,SAAU,CACN,GAAInB,EAAO,CAAC,CAAE,KAAM,SAAU,QAASA,CAAA,CAAM,EAAI,CAAA,EACjD,CAAE,KAAM,OAAQ,QAASV,CAAA,CAAO,EAEpC,YAAa5e,EAAQ,aAAe4gB,GAAUH,EAAgB,EAAE,WAAA,GAGxE,cAAgBlgB,GACPA,GAAA,MAAAA,EAAU,QACRA,EAAS,QAAQ,CAAC,EAAE,QAAQ,QADJ,IAEnC,CAER,EAEO,MAAMsgB,WAAWC,EAAO,CAK3B,OAAO,MAAMlC,EAAgB90B,EAAuBiU,EAAwB,CACxE,KAAM,CAAE,SAAA1M,EAAU,GAAG2O,CAAA,EAAYlW,EAEjC,OAAQ,IAAI+2B,GAAGxvB,CAAQ,EAClB,WAAW2O,CAAO,EAClB,QAAQjC,CAAI,EACZ,SAAS6gB,CAAM,CACxB,CAEA,OAAO,UAAUvtB,EAAmC,CAChD,OAAOuvB,GAAUvvB,GAAYivB,EAAgB,EAAE,MACnD,CAEA,YAAYjvB,EAAmCivB,GAAkB,CAC7D,MAAA,EACA,KAAK,OAAaM,GAAUvvB,CAAQ,EACpC,KAAK,QAAa,CAAA,CACtB,CAEA,WAAW2O,EAAoB,CAC3B,YAAK,QAAUA,EACR,IACX,CAEA,QAAQjC,EAAwB,CAC5B,YAAK,KAAOA,EACL,IACX,CAEA,OAAO,UAAW,CACd,MAAO,CACH,GAAG,MAAM,SAAA,EACT,MAAO,aAAa,QAAQ,cAAc,GAAK6iB,GAAUN,EAAgB,EAAE,KAAA,CAEnF,CAEA,MAAM,SAAS1B,EAA8B,CACzC,MAAM3e,EAAO,KAAK,OAAO,UACrB4gB,GAAG,YAAYjC,EAAQ,CAAE,GAAG,KAAK,QAAS,GAAG,KAAK,KAAM,EACxDiC,GAAG,UAAU,KAAK,QAAQ,KAAM,KAAK,OAAO,EAC5C,KAAK,OAAA,EAET,eAAQ,IAAI,KAAK,OAAO,KAAO,YAAa5gB,CAAI,EAEzCG,GAAU,KAAK,OAAO,IAAK,CAC9B,OAAQ,OACR,QAAS,KAAK,OAAO,aAAA,EACrB,KAAAH,CAAA,CACH,EACA,KAAKM,IACF,QAAQ,IAAI,KAAK,OAAO,KAAO,aAAcA,CAAQ,EAC9C,KAAK,OAAO,cAAcA,CAAQ,EAC5C,EACA,KAAKA,GAAY,CACd,GAAIA,IAAa,KACb,eAAQ,MAAM,oCAAoC,EAC3C,KAEX,GAAI,CACA,OAAQA,EAAS,WAAW,GAAG,GAAKA,EAAS,WAAW,GAAG,EACrD,KAAK,MAAMA,CAAQ,EACnBA,CAEV,OAAS3F,EAAO,CACZ,eAAQ,MAAM,2CAA4CA,CAAK,EACxD,IACX,CACJ,CAAC,EACA,MAAMA,IACH,QAAQ,MAAM,kCAAmCA,CAAK,EAC/C,KACV,CAEL,CACJ,CClhBA,MAAMmmB,GAAc,WACdC,GAAc,4CACdC,GAAoB,oCAEbH,GAAS,CAAC,CACnB,KAAA72B,EAAO,SACP,YAAAi3B,EACA,qBAAAC,EACA,GAAGtwB,CACP,IAAmB,OACf,KAAM,CAAE,MAAA5K,GAAU8xB,GAAe,CAAC,KAAMlnB,EAAM,KAAK,EACnD,OAAO5G,IAAS,SACVwD,EAAA,cAAC2zB,GAAA,CAAc,GAAGvwB,EAAO,MAAA5K,CAAA,CAAc,GACvC0N,EAAA1N,GAAA,YAAAA,EAAO,SAAP,MAAA0N,EAAe,wBACV0tB,GAAA,CAAY,GAAGxwB,EAAO,MAAA5K,EAAc,YAAAi7B,CAAA,CAA0B,EAC/DzzB,EAAA,cAAC6zB,GAAA,CAAgB,GAAGzwB,EAAO,qBAAAswB,CAAA,CAA4C,CACrF,EAGMC,GAAe,CAAC,CAClB,KAAAjxB,EACA,MAAAmC,EAAgB,OAChB,MAAArM,EAAgB,OAChB,SAAAyxB,EAAgB,GAChB,SAAAF,EAAgB,OAChB,aAAAC,EAAgB,OAChB,KAAA+B,EAAgB,GAChB,IAAA9yB,EAAgB,OAChB,KAAAE,EAAgB,OAChB,UAAAmJ,EAAgB,OAChB,UAAA/B,EAAgB,MACpB,IAAyB,aACrB,KAAM,CAAE,aAAA6pB,CAAA,EAAiBE,GAAe,CAAE,KAAA5nB,EAAM,EAC1CvG,EAAQ8D,EAAiB,EACzB6zB,EAAUjvB,GAASnC,EAC7B,eAAQ,IAAI,8CAA+CA,EAAMlK,EAAOwxB,CAAY,kBAG3E1pB,EAAA,CAAQ,UAAWgC,GAAanG,EAAM,OAAO,WACzClD,EACD+G,EAAA,cAAC,OAAI,WAAWkG,EAAA1N,GAAA,YAAAA,EAAO,SAAP,MAAA0N,EAAe,QAAUqtB,GAAc,YACnDvzB,EAAA,cAAC,MAAA,CAAI,UAAWwzB,EAAA,EACZxzB,EAAA,cAAC4rB,GAAA,CACG,KAAMlpB,EAAO,kBACb,MAAO,SACP,aAAcsnB,GAAA,YAAAA,EAAc,QAC5B,SAAU,CAAC,CAAC,MAAAjgB,KAAW,CACnBqgB,EAAa,CACT,OAAQ,CACJ,KAAM1nB,EAAO,gBACb,MAAOqH,EAAM,OAAO,QAASigB,GAAA,YAAAA,EAAc,MAAA,CAC/C,CACH,CACL,CAAA,CAAA,CAER,EACAhqB,EAAA,cAAC8rB,GAAA,CACG,UAAWvrB,GAAapE,EAAM,OAAO,UACrC,KAAMuG,IAAQiH,EAAAnR,GAAA,YAAAA,EAAO,SAAP,MAAAmR,EAAe,QAAU,gBAAkB,UACzD,OAAOuJ,EAAA1a,GAAA,YAAAA,EAAO,SAAP,MAAA0a,EAAe,QAAUogB,GAAcQ,EAAUA,EACxD,eAAc1c,EAAA5e,GAAA,YAAAA,EAAO,SAAP,YAAA4e,EAAe,WAAW4S,GAAA,YAAAA,EAAc,OACtD,SAAAD,EACA,SAAAE,EACA,KAAA8B,CAAA,CAAA,CACR,EACC5yB,CACL,CAER,EAEMy6B,GAAa,CAAC,CAChB,KAAAlxB,EACA,MAAAmC,EACA,MAAArM,EACA,SAAAyxB,EACA,SAAAF,EACA,aAAAC,EACA,KAAA+B,EAAO,GACP,IAAA9yB,EACA,KAAAE,EACA,UAAAmJ,EACA,UAAA/B,EACA,YAAAkzB,CACJ,IAAuB,OACnB,KAAM,CAAE,aAAArJ,EAAc,OAAAlY,CAAA,EAAWoY,GAAe,CAAC,KAAA5nB,EAAK,EAEhDvG,EAAQ8D,EAAiB,EACzB6zB,EAAUjvB,GAASnC,EACnB,CAACyuB,EAAQD,CAAS,EAAI/yB,EAAAA,SAAS,EAAK,EACpC41B,EAAgBX,GAAG,SAAA,EACzB,uBACK9yB,EAAA,CAAQ,UAAWgC,GAAanG,EAAM,OAAO,SAAA,EACzClD,EACD+G,EAAA,cAAC,MAAA,CAAI,UAAWmxB,EAASoC,GAAc,YACnCvzB,EAAA,cAAC,MAAA,CAAI,UAAWwzB,EAAA,EACZxzB,EAAA,cAACoV,GAAA,CAAa,WAAWlP,EAAA1N,GAAA,YAAAA,EAAO,SAAP,MAAA0N,EAAe,MAAQ,4CAA8C,4CAC1F,KAAMirB,EAAS,gBAAkB,WAAY,MAAOA,EAAS,sBAAwB,mBACrF,QAAS,IAAM,CACfD,EAAU,CAACC,CAAM,CACrB,CAAA,CAAA,CAEJ,EACAnxB,EAAA,cAAC8rB,GAAA,CACG,UAAYvrB,GAAapE,EAAM,OAAO,UACtC,KAAMuG,EAAO,gBACb,MAAO4wB,GAAcQ,EACrB,aAAc9J,GAAA,YAAAA,EAAc,MAC5B,SAAAD,EACA,SAAU,GACV,KAAM/pB,EAAA,cAACuI,GAAA,CACH,SAAS,MACT,aAAc,CACV,KAAM,MAAA,CACV,kBAECiC,GAAA,KAAaxK,EAAA,cAACouB,GAAA,CAAO,KAAM1rB,EAAO,eAAgB,IAAI,OACnD,aAAcsnB,GAAA,YAAAA,EAAc,KAC5B,QAASoJ,GAAG,SAAA,EACZ,YAAa,CACT,MAAO,YAAcW,EAAc,KAAO,IAC1C,MAAO,EAAA,CACX,CAAA,CACF,kBACDvpB,GAAA,KAAaxK,EAAA,cAACouB,GAAA,CAAO,KAAM1rB,EAAO,mBAAoB,IAAI,WACvD,aAAcsnB,GAAA,YAAAA,EAAc,SAC5B,QAASoJ,GAAG,SAAA,EACZ,YAAa,CACT,MAAO,YAAcW,EAAc,SAAW,IAC9C,MAAO,EAAA,CACX,CAAA,CACF,kBACDvpB,GAAA,KAAaxK,EAAA,cAACouB,GAAA,CAAO,KAAM1rB,EAAO,gBAAiB,IAAI,QACpD,aAAcsnB,GAAA,YAAAA,EAAc,MAC5B,QAASoJ,GAAG,UAAA,EACZ,YAAa,CACT,MAAO,YAAcW,EAAc,MAAQ,IAC3C,MAAO,EAAA,CACX,CAAA,CACF,kBACDvpB,GAAA,KAAaxK,EAAA,cAACouB,GAAA,CAAO,KAAM1rB,EAAO,gBAAiB,IAAI,QACpD,aAAcsnB,GAAA,YAAAA,EAAc,MAC5B,QAASoJ,GAAG,UAAA,EACZ,YAAa,CACT,MAAO,YAAcW,EAAc,MAAQ,IAC3C,MAAO,EAAA,CACX,CAAA,CACF,kBACDvpB,GAAA,KAAaxK,EAAA,cAACouB,GAAA,CAAO,KAAM1rB,EAAO,gBAAiB,IAAI,QACpD,aAAcsnB,GAAA,YAAAA,EAAc,MAC5B,QAASoJ,GAAG,UAAA,EACZ,YAAa,CACT,MAAO,YAAcW,EAAc,MAAQ,IAC3C,MAAO,EAAA,CACX,CAAA,CACF,kBACDvpB,GAAA,KAAaxK,EAAA,cAACqrB,GAAA,CAAM,KAAM3oB,EAAO,sBAAuB,MAAM,cAC3D,aAAcsnB,GAAA,YAAAA,EAAc,YAC5B,IAAK,EACL,IAAK,EACL,KAAM,EAAA,CAAA,CACR,CAAA,EAEN,UAAWmH,EAAS,GAAK,UACzB,KAAApF,CAAA,CAAA,EACJ/rB,EAAA,cAAC8rB,GAAA,CACG,UAAYvrB,GAAapE,EAAM,OAAO,UACtC,KAAMuG,EAAO,SACb,MAAOoxB,EACP,SAAA/J,EACA,SAAAE,EACA,KAAMjqB,EAAA,cAACuU,GAAA,CAAc,KAAK,QAAQ,QAAS,SAAY,CACnD6V,GAAA,MAAAA,EAAe,CACX,OAAQ,CACJ,KAAM1nB,EAAO,SACb,MAAO,MAAMsxB,GAAUx7B,GAAA,YAAAA,EAAO,OAAQ0Z,EAAQuhB,CAAW,CAAA,CAC7D,EAER,EAAG,EACH,UAAWtC,EAAS,UAAY,GAChC,KAAApF,CAAA,CAAA,CACR,EACC5yB,CACL,CAER,EAEM06B,GAAiB,CAAC,CACpB,KAAAnxB,EACA,MAAAmC,EACA,SAAAolB,EACA,SAAAF,EACA,KAAAgC,EACA,IAAA9yB,EACA,KAAAE,EACA,UAAAmJ,EACA,UAAA/B,EACA,qBAAAmzB,CACJ,IAA2B,CACvB,MAAMv3B,EAAQ8D,EAAiB,EAE/B,OACID,EAAA,cAACM,EAAA,CAAQ,UAAWgC,GAAanG,EAAM,OAAO,SAAA,EACzClD,GACAy6B,GAAA,YAAAA,EAAuB,CAAC,KAAAhxB,EAAM,MAAAmC,EAAO,SAAAolB,EAAU,SAAAF,CAAA,KAC5C/pB,EAAA,cAAC8rB,GAAA,CACG,UAAYvrB,GAAapE,EAAM,OAAO,UACtC,KAAMuG,EAAO,SACb,MAAAmC,EACA,SAAAklB,EACA,SAAAE,EACA,KAAA8B,CAAA,CAAA,EAGP5yB,CACL,CAER,EAEa66B,GAAY,MAAOzhB,EAAwBjC,EAAwBmjB,IAA+C,CAC3H,KAAM,CAAE,MAAOtC,EAAQ,GAAG90B,GAAWkW,EAC/BO,EAAW,MAAMsgB,GAAG,MACtB,CAAC9C,IAAgBmD,GAAA,YAAAA,EAActC,EAAQ90B,EAAQiU,KAAS6gB,EAAQZ,EAAmB,EAAE,KAAK;AAAA,CAAI,EAC9Fl0B,EACAiU,CAAA,EAGJ,eAAQ,IAAIwC,CAAQ,EACbA,CACX,EC9QamhB,GAAW,CAAC,CACvB,KAAAvxB,EACA,MAAAmC,EACA,SAAAolB,EACA,SAAAF,EACA,aAAAC,EACA,IAAA/wB,EACA,KAAAE,EACA,UAAAmJ,EACA,UAAA/B,EACA,KAAA/D,CACF,IAAqB,CACnB,KAAM,CAAE,MAAO03B,CAAyB,EAAI5J,GAAe,CACzD,KAAA5nB,EACA,aAAAsnB,EACA,SAAAD,CAAA,CACD,EAED,uBACGzpB,EAAA,CAAQ,UAAWgC,CAAA,EACjBrJ,kBACA2H,GAAA,KACCZ,EAAA,cAACsrB,GAAA,CACC,KAAM,GAAG5oB,CAAI,OACb,MAAAmC,EACA,IAAI,MACJ,SAAAolB,EACA,UAAA1pB,EACA,SAAAwpB,EACA,aAAAC,CAAA,CAAA,EAGFhqB,EAAA,cAACa,EAAA,CAAI,UAAU,MAAA,EACbb,EAAA,cAACqzB,GAAA,CACC,KAAM,GAAG3wB,CAAI,OACb,MAAM,WACN,KAAAlG,EACA,SAAAytB,EACA,aAAAD,EACA,KAAM,CAAA,CAAA,EAGRhqB,EAAA,cAACY,GAAA,KACCZ,EAAA,cAACa,EAAA,KACCb,EAAA,cAAC2qB,GAAA,CACC,KAAM,GAAGjoB,CAAI,SACb,IAAI,QACJ,SAAAunB,EACA,aAAAD,CAAA,CAAA,CAEJ,EACAhqB,EAAA,cAACa,EAAA,KACCb,EAAA,cAAC2qB,GAAA,CACC,KAAM,GAAGjoB,CAAI,UACb,IAAI,SACJ,SAAAunB,EACA,aAAAD,CAAA,CAAA,CAEJ,CACF,CACF,EAEAhqB,EAAA,cAACa,EAAA,CAAI,GAAI,GACPb,EAAA,cAACif,GAAA,CACC,UAAU,8BACV,IAAKiV,GAAA,YAAAA,EAAY,IACjB,MAAOA,GAAA,YAAAA,EAAY,IACnB,MAAOA,GAAA,YAAAA,EAAY,MACnB,OAAQA,GAAA,YAAAA,EAAY,MAAA,CAAA,CAExB,CACF,EACC/6B,CACH,CAEJ,ECnEO,SAASg7B,GAA4B,CACxC,QAAAhL,EACA,aAAAiL,EACA,mBAAAC,EACA,kBAAAC,EACA,aAAAC,CACJ,EAAoC,CAChC,MAAMC,EAAuBJ,GAAgBC,EACvCI,EAAwBD,IAAyB,QAAa,CAAC,CAACF,EAChE,CAACI,EAAsBC,CAAuB,EAAIx2B,EAAAA,SAAmBq2B,GAAwB,CAAA,CAAE,EAErGv1B,EAAAA,UAAU,IAAM,CACRu1B,IAAyB,QAAa,CAACC,GACvCE,EAAwBH,CAAoB,CAEpD,EAAG,CAACA,EAAsBC,CAAqB,CAAC,EAEhD,MAAMG,EAAqBH,EAAyBD,GAAwB,CAAA,EAAME,EAC5EG,EAAgB,CAAC,CAACP,GAAqBE,IAAyB,OAEhEM,EAAwBC,cAAa1c,GAAoD,CAC3F,MAAM2c,EAAS,IAAI,IAAI3c,CAAI,EACrB4c,EAAkB9L,EAAQ,OAAO,CAACjX,EAAQ3Z,IAAUy8B,EAAO,IAAIT,EAAariB,EAAQ3Z,CAAK,CAAC,CAAC,EACjG,MAAO,CACH,KAAA8f,EACA,QAAS4c,EACT,aAAc5c,EAAK,OAAS,CAAA,CAEpC,EAAG,CAACkc,EAAcpL,CAAO,CAAC,EAEpB+L,EAAkBH,cAAaI,GAAuB,CACnDV,GACDE,EAAwBQ,CAAQ,EAGpC,MAAMC,EAAgBN,EAAsBK,CAAQ,EACpDb,GAAA,MAAAA,EAAoB,CAChB,GAAGc,EACH,MAAO,IAAMF,EAAgB,CAAA,CAAE,CAAA,EAEvC,EAAG,CAACJ,EAAuBL,EAAuBH,CAAiB,CAAC,EAE9De,EAAiBN,EAAAA,YAAY,IAAM,CACrCG,EAAgB,CAAA,CAAE,CACtB,EAAG,CAACA,CAAe,CAAC,EAEdI,EAAiBx3B,EAAAA,QAAuC,KAEnD,CACH,GAFkBg3B,EAAsBF,CAAkB,EAG1D,MAAOS,CAAA,GAEZ,CAACT,EAAoBE,EAAuBO,CAAc,CAAC,EAE9D,MAAO,CACH,mBAAAT,EACA,eAAAU,EACA,cAAAT,EACA,gBAAAK,CAAA,CAER,CCzEO,SAASK,GAA0Dlf,EAAgB,CACtF,MAAMmf,EAAgB/oB,EAAAA,OAAO,IAAI,OAAyB,EACpDgpB,EAAahpB,EAAAA,OAAO,CAAC,EAE3B,OAAOsoB,EAAAA,YAAY,CAAC7iB,EAAiBwjB,IAAoB,CACrD,GAAIxjB,EAAO,KAAM,OAAOA,EAAO,KAE/B,MAAMwF,EAAWxF,EACXyjB,EAAcH,EAAc,QAAQ,IAAI9d,CAAQ,EACtD,GAAIie,EAAa,OAAOA,EAExB,MAAMC,EAAU,GAAGvf,CAAM,IAAIof,EAAW,SAAS,GACjD,OAAAD,EAAc,QAAQ,IAAI9d,EAAUke,CAAO,EACpCA,CACX,EAAG,CAACvf,CAAM,CAAC,CACf,CC8BA,SAASwf,GAAM,CACX,OAAAptB,EAAS,OACT,KAAA+J,EAAO,OACP,OAAAsjB,EAAS,OACT,QAAAr1B,EAAU,OACV,UAAAs1B,EAAY,OACZ,kBAAAzB,EAAoB,OACpB,cAAA0B,EAAgB,WAChB,SAAAC,EAAW,GACX,WAAAC,EAAa,OACb,UAAAC,EAAY,OACZ,aAAA/B,EAAe,OACf,gBAAAgC,EAAkB,OAClB,IAAAn9B,EAAM,OACN,KAAAE,EAAO,OACP,UAAAmJ,EAAY,OACZ,UAAA/B,EAAY,OACZ,YAAA6E,EAAc,OACd,UAAAwX,EAAY,OACZ,YAAA1T,EAAc,OACd,YAAAmtB,EAAc,OACd,YAAAC,EAAc,OACd,cAAAC,EAAgB,MACpB,EAAe,CACX,MAAMp6B,EAAQ8D,EAAgB,EACxBu2B,EAAcD,GAAiBp6B,EAAM,MAAM,cAC3C,CAAC4vB,EAAM0K,CAAO,EAAIt4B,EAAAA,SAAsBqU,GAAQ,CAAA,CAAE,EAClDkkB,EAAgB54B,EAAAA,QAAQ,IAAM,CAChC,GAAI,GAACm4B,GAAY,OAAOA,GAAa,WACrC,OAAOA,CACX,EAAG,CAAC,OAAOA,GAAa,SAAWA,GAAA,YAAAA,EAAU,IAAM,OAAW,OAAOA,GAAa,SAAWA,GAAA,YAAAA,EAAU,MAAQ,MAAS,CAAC,EACnHU,EAAiBV,IAAa,GAC9B,CAACW,EAAcC,CAAe,EAAI14B,EAAAA,SAAkCu4B,CAAa,EACjF,CAACI,EAAiBC,CAAkB,EAAI54B,EAAAA,SAA6B,IAAI,EACzE,CAAC64B,EAAYC,CAAa,EAAI94B,EAAAA,SAAwB,IAAI,EAC1D,CAAC+4B,EAAaC,CAAc,EAAIh5B,EAAAA,SAAwB,IAAI,EAC5D,CAACi5B,EAAeC,CAAgB,EAAIl5B,EAAAA,SAAkE,IAAI,EAC1G,CAACm5B,EAAcC,CAAe,EAAIp5B,EAAAA,SAAwB,IAAI,EAC9Dq5B,EAA+B/qB,EAAAA,OAAO,EAAK,EAC3CgrB,GAAmB1C,cAAaxI,GAAgC,CAC9DA,KAAyBA,CAAI,CACrC,EAAG,CAAA,CAAE,EACCmL,GAA2BnN,EAAAA,MAAA,EAE3BoN,EAAc,CAAC,CAAC5B,EAChB6B,GAAuBjB,GAAkB,CAAC,CAACzJ,GAAM,UAAUwJ,CAAa,EACxEmB,GAAwBF,GAAeC,GACvCE,GAAoBD,GAAwB,GAAQlB,EACpDzI,GAAiB2J,GAAwB,OAAYnB,EAE3Dz3B,EAAAA,UAAU,IAAM,CACZw3B,EAAQjkB,GAAQ,EAAE,CACtB,EAAG,CAACA,CAAI,CAAC,EAETvT,EAAAA,UAAU,IAAM,CACZ43B,EAAgB3I,EAAc,CAClC,EAAG,CAACA,IAAA,YAAAA,GAAgB,MAAOA,IAAA,YAAAA,GAAgB,GAAG,CAAC,EAE/CjvB,EAAAA,UAAU,IAAM,CACR,CAAC44B,IAAyBL,EAA6B,UAE3D,QAAQ,KACJ,uIAAA,EAEJA,EAA6B,QAAU,GAC3C,EAAG,CAACK,EAAqB,CAAC,EAE1B,MAAME,GAAqBxC,GAAgC,KAAK,EAC1DhB,GAAeQ,EAAAA,YAAY,CAAC7iB,EAAqB3Z,IAAmBw/B,GAAmB7lB,EAAQ3Z,CAAK,EAAG,CAACw/B,EAAkB,CAAC,EAC3H,CACF,mBAAAnD,GACA,eAAAU,GACA,cAAAT,GACA,gBAAAK,CAAA,EACAf,GAAgC,CAChC,QAASpI,EACT,aAAAqI,EACA,mBAAoBgC,EACpB,kBAAA9B,EACA,aAAAC,EAAA,CACH,EAEDt1B,EAAAA,UAAU,IAAM,CACZ,GAAI,CAACq4B,EAAc,OAEIvL,EAAK,KAAK,CAAC7Z,EAAQ3Z,IAAUg8B,GAAariB,EAAQ3Z,CAAK,IAAM++B,CAAY,GAE5FC,EAAgB,IAAI,CAE5B,EAAG,CAACD,EAAc/C,GAAcxI,CAAI,CAAC,EAErC9sB,EAAAA,UAAU,IAAM,CACZ,GAAI23B,GAAgB,EAACnuB,GAAA,MAAAA,EAAQ,SAAUkvB,EAAa,OACpD,MAAMK,EAAgBvvB,EAAO,KAAMwvB,GAAWH,IAAqBG,EAAO,OAAS,EAAK,EACpFD,GACAnB,EAAgB,CAAE,MAAOmB,EAAc,IAAK,IAAK,MAAO,CAEhE,EAAG,CAACpB,EAAckB,GAAmBrvB,EAAQkvB,CAAW,CAAC,EAEzD,MAAMO,EAAap6B,EAAAA,QAAqB,IAAMovB,GAAM,QAAQnB,EAAM6K,CAAY,GAAK,CAAA,EAAI,CAAC7K,EAAM6K,CAAY,CAAC,EAErGuB,EAAc,CAAC9xB,EAAkC6L,EAAqBkmB,IAA2B,CACnG,IAAI/pB,GAAiBhI,EAAE,OAEvB,KAAOgI,IAAkBA,GAAe,UAAY,MAAM,CACtD,GAAI,CAAC,IAAK,SAAU,QAAS,OAAO,EAAE,SAASA,GAAe,OAAO,EACjE,OAEJA,GAAiBA,GAAe,UACpC,CAEA,MAAMgqB,GAAS9D,GAAariB,EAAQkmB,CAAa,EAE7C5B,GACIL,IAAc,QACdoB,EAAiB/3B,IAAYA,KAAY64B,GAAS,KAAOA,EAAM,EAIvE53B,GAAA,MAAAA,EAAUyR,EACd,EAEMomB,GAAoB,CAACxyB,EAAmB3N,IAAiC,WAC3E,MAAMM,IAAKyN,GAAAJ,EAAK3N,CAAG,IAAR,YAAA+N,GAAW,WAAUyD,GAAA7D,EAAK3N,CAAG,IAAR,YAAAwR,GAAW,QAAU7D,EAAK3N,CAAG,EAC7D,OAAI6H,EAAM,eAAevH,CAAC,GAAKA,GAAK,MAAQ,OAAOA,GAAM,SAAiBA,EACnE,MAAM,QAAQA,CAAC,GAAK,CAACA,EAAE,KAAMkY,IAAU,OAAOA,IAAU,UAAYA,EAAK,EAC1ElY,EAAE,KAAK,IAAI,EACX,EACV,EAEM8/B,GAAqBxD,EAAAA,YAAY,CAAC7iB,EAAqBkmB,IAA0B,CACnF,MAAMC,EAAS9D,GAAariB,EAAQkmB,CAAa,EAC3CjD,GAAWP,GAAmB,SAASyD,CAAM,EAC7CzD,GAAmB,OAAQz8B,IAAQA,KAAQkgC,CAAM,EACjD,CAAC,GAAGzD,GAAoByD,CAAM,EACpCnD,EAAgBC,EAAQ,CAC5B,EAAG,CAACP,GAAoBL,GAAcW,CAAe,CAAC,EAEhDsD,GAA2BzD,EAAAA,YAAY,CAAC7iB,EAAqBkmB,IAA0B,CACzF,MAAMC,EAAS9D,GAAariB,EAAQkmB,CAAa,EACjDlD,EAAgBN,GAAmB,SAASyD,CAAM,EAAI,CAAA,EAAK,CAACA,CAAM,CAAC,CACvE,EAAG,CAACzD,GAAoBL,GAAcW,CAAe,CAAC,EAEhD1K,GAAauK,EAAAA,YAAY,CAAC0D,EAA2BC,IAAwB,CAC/E,GAAI,CAAC1B,EAAY,OAEjB,MAAM2B,EAAcT,EAAW,UAAU,CAAChmB,GAAQ3Z,KAAUg8B,GAAariB,GAAQ3Z,EAAK,IAAMy+B,CAAU,EAChG4B,GAAmBV,EAAW,UAAU,CAAChmB,GAAQ3Z,KAAUg8B,GAAariB,GAAQ3Z,EAAK,IAAMg8B,GAAakE,EAAcC,CAAW,CAAC,EAExIvB,EAAe,IAAI,EACnBF,EAAc,IAAI,EAClB,MAAM4B,IAAoBzB,GAAA,YAAAA,EAAe,WAAY,QAGrD,GAFAC,EAAiB,IAAI,EAEjBsB,EAAc,GAAKC,GAAmB,GAAKD,IAAgBC,GAAkB,OAEjF,MAAME,GAAW,CAAC,GAAGZ,CAAU,EACzB,CAACa,EAAW,EAAID,GAAS,OAAOH,EAAa,CAAC,EAC9CK,GACFL,EAAcC,GACRA,IAAoBC,KAAsB,QAAU,EAAI,IACxDD,IAAoBC,KAAsB,QAAU,EAAI,GAElEC,GAAS,OAAOE,GAA0B,EAAGD,EAAW,EAExDlC,EAAgB,MAAS,EACzBJ,EAAQqC,EAAQ,EAChB/C,GAAA,MAAAA,EAAY+C,GAAU,CAClB,UAAWH,EACX,QAASK,GACT,OAAQD,EAAA,EAEhB,EAAG,CAAC/B,EAAYI,GAAA,YAAAA,EAAe,SAAU7C,GAAcwB,EAAWmC,CAAU,CAAC,EAE7E,GAAIA,EAAW,SAAW,EACtB,OAAOl4B,EAAA,cAAC,IAAA,CAAE,UAAW,KAAA,EAAO,qBAAmB,EAGnD,MAAMyS,GAA6BhK,GAAU,OAAO,KAAKyvB,EAAW,CAAC,CAAC,EAAE,IAAK//B,IAAS,CAAE,IAAAA,EAAK,MAAOA,EAAK,KAAMw+B,GAAiB,EAC1HsC,GAAgB,CAClB,wBACA98B,EAAM,MAAM,YACZk6B,EAAc,GAAGA,CAAW,iBAAmB,GAC/CC,GAAe,EAAA,EACjB,OAAO,OAAO,EAAE,KAAK,GAAG,EACpB4C,GAAezmB,GAAQ,QAAUoiB,GAAgB,EAAI,IAAM8C,EAAc,EAAI,GAE7EwB,GAAsB,CACxBhhC,EACA4Q,EACAmJ,EACAkmB,KAEI,CAAChB,GAAiBA,EAAc,MAAQj/B,GAAOi/B,EAAc,WAAaruB,EACnE,KAIP/I,EAAA,cAAC,KAAA,CACG,cAAY,OACZ,WAAa+J,IAAU,CACd4tB,IACL5tB,GAAM,eAAA,EACFmtB,IAAgB/+B,GAChBg/B,EAAeh/B,CAAG,EAEtBk/B,EAAiB,CAAE,IAAAl/B,EAAK,SAAA4Q,EAAU,EACtC,EACA,OAASgB,IAAU,CACV4tB,IACL5tB,GAAM,eAAA,EACNstB,EAAiB,CAAE,IAAAl/B,EAAK,SAAA4Q,EAAU,EAClCyhB,GAAWtY,EAAQkmB,EAAa,EACpC,CAAA,EAEAp4B,EAAA,cAAC,KAAA,CAAG,QAASk5B,GAAc,UAAU,gBACjCl5B,EAAA,cAAC,MAAA,CAAI,UAAU,0BAAA,EACXA,EAAA,cAAC,MAAA,CAAI,UAAU,6CAAA,EACXA,EAAA,cAAC,MAAA,CAAI,UAAU,+CAAA,CAAgD,EAC/DA,EAAA,cAAC,MAAA,CAAI,UAAU,oFAAA,CAAqF,CACxG,CACJ,CACJ,CAAA,EAKZ,OACIA,EAAA,cAAC,MAAA,CAAI,IAAKy3B,GAAkB,UAAW,qBAAuBn1B,GAAanG,EAAM,MAAM,UAAA,EACnF6D,EAAA,cAAC,MAAA,CAAI,UAAWi5B,EAAA,EACXhgC,GAAO+G,EAAA,cAAC,MAAA,CAAI,UAAU,MAAA,EAAQ/G,CAAI,EACnC+G,EAAA,cAAC,QAAA,CAAM,UAAW,UAAYO,GAAapE,EAAM,MAAM,UAAA,EACnD6D,EAAA,cAAC,QAAA,CAAM,UAAWoF,GAAejJ,EAAM,MAAM,WAAA,EACzC6D,EAAA,cAAC,KAAA,KACI60B,IACG70B,EAAA,cAAC,MAAG,MAAO,CAAE,MAAO,KAAM,WAAY,QAAA,GACjCg2B,IAAkB,SACfh2B,EAAA,cAAC,MAAA,CAAI,UAAU,eAAA,EACXA,EAAA,cAAC,QAAA,CACG,KAAK,WACL,aAAW,kBACX,QAASs1B,GAAe,QAAQ,OAAS,GAAKA,GAAe,QAAQ,SAAWvJ,EAAK,OACrF,SAAWhiB,GAAU,CACjB,MAAMorB,EAAWprB,EAAM,OAAO,QACxBmuB,EAAW,IAAI,CAAChmB,EAAQ3Z,KAAUg8B,GAAariB,EAAQ3Z,EAAK,CAAC,EAC7D,CAAA,EACN28B,EAAgBC,CAAQ,CAC5B,CAAA,CAAA,CAER,EAEAn1B,EAAA,cAAC,MAAA,CAAI,UAAU,gBAAgB,CAEvC,EAEH23B,GACG33B,EAAA,cAAC,KAAA,CAAG,MAAO,CAAE,MAAO,KAAM,WAAY,QAAA,CAAS,EAC3CA,EAAA,cAAC,MAAA,CAAI,UAAU,eAAA,CAAgB,CACnC,EAEHyS,GAAQ,IAAK2mB,GACVA,EAAI,OACC,IAAM,CACH,MAAMC,EAAavB,IAAqBsB,EAAI,OAAS,GAC/CE,EAAeD,IAAczC,GAAA,YAAAA,EAAc,SAAUwC,EAAI,IACzDG,GAAYD,GAEZ1C,GAAA,YAAAA,EAAc,OAAQ,OAClB,aACA,YAHJ,OAKN,OACI52B,EAAA,cAAC,KAAA,CACG,IAAKo5B,EAAI,IACT,UAAWA,EAAI,UACf,YAAWG,EAAA,EAEVF,EACGr5B,EAAA,cAAC,SAAA,CACG,KAAK,SACL,UACI,+NACCs5B,EACK,gCACA,+CAEV,QAAS,IAAMzC,EAAiBtwB,IAAS2mB,GAAM,OAAO3mB,GAAM6yB,EAAI,GAAG,CAAC,EACpE,aACIE,EACM,WAAWF,EAAI,KAAK,gBAAexC,GAAA,YAAAA,EAAc,OAAQ,OAAS,aAAe,WAAW,GAC5F,WAAWwC,EAAI,KAAK,GAE9B,MACIE,EACM,GAAGF,EAAI,KAAK,MAAKxC,GAAA,YAAAA,EAAc,OAAQ,OAAS,aAAe,WAAW,GAC1E,WAAWwC,EAAI,KAAK,EAAA,EAG9Bp5B,EAAA,cAAC,OAAA,CACG,UACI,gFACCs5B,EACK,eACA,2DAEV,cAAY,MAAA,EAEXA,GACG1C,GAAA,YAAAA,EAAc,OAAQ,OAAS52B,EAAA,cAACw5B,GAAAA,WAAU,KAAM,EAAA,CAAI,EAAKx5B,EAAA,cAACy5B,YAAQ,KAAM,GAAI,EAE5Ez5B,EAAA,cAAC05B,GAAAA,YAAA,CAAY,KAAM,EAAA,CAAI,CAAA,EAG/B15B,EAAA,cAAC,OAAA,KAAMo5B,EAAI,KAAM,CAAA,EAGrBp5B,EAAA,cAAC,MAAA,CAAI,UAAU,eAAA,EAAiBo5B,EAAI,KAAM,CAAA,CAI1D,GAAA,EAEAp5B,EAAA,cAAC,KAAA,CAAG,IAAKo5B,EAAI,IAAK,MAAO,CAAE,MAAO,KAAM,WAAY,SAAS,CAAG,CAEvE,CACL,CACJ,EACAp5B,EAAA,cAAC,SAAM,UAAW4c,GAAazgB,EAAM,MAAM,SAAA,EACvC6D,EAAA,cAAC25B,GAAA,CACG,UAAWzB,EACX,SAAUpB,EACV,UAAU,iBACT,GAAIZ,GAAc,CAAA,CAAC,EAEnB,CAAC0D,EAAaC,IACXD,EAAY,IAAI,CAAC1nB,EAAQ3Z,KAAU,CAC/B,MAAM6/B,GAAgByB,EAAathC,GAC7B8/B,GAAS9D,GAAariB,EAAQkmB,EAAa,EAC3C0B,GAAalF,GAAmB,SAASyD,EAAM,EAC/C0B,GAAgB7C,IAAgBmB,GAChC2B,GAAYhD,IAAeqB,GAE3B4B,GAAczD,IADML,IAAc,OAAYmB,EAAenB,KACVkC,GAEzD,OACIr4B,EAAA,cAACA,EAAM,SAAN,CAAe,IAAKq4B,EAAA,EAChBc,GAAoBd,GAAQ,SAAUnmB,EAAQkmB,EAAa,EAC5Dp4B,EAAA,cAAC,KAAA,CACG,UAAW23B,EACX,UAAW,CACPoC,GAAgB,cAAgB,GAChCE,GAAczD,EAAc,EAAA,EAC9B,OAAO,OAAO,EAAE,KAAK,GAAG,GAAK,OAC/B,MAAO,CACH,OAAQ/1B,EAAU,UAAYk3B,EAAc,OAAS,UACrD,QAASqC,GAAY,IAAO,CAAA,EAEhC,QAAU3zB,IAAM,CACR5F,GACA03B,EAAY9xB,GAAG6L,EAAQkmB,EAAa,CAE5C,EACA,YAAa,IAAM,CACfnB,EAAcoB,EAAM,CACxB,EACA,WAAatuB,IAAU,CACnB,GAAI,CAAC4tB,EAAa,OAClB5tB,GAAM,eAAA,EACN,MAAMmwB,GAAOnwB,GAAM,cAAc,sBAAA,EAC3BowB,GACFpwB,GAAM,QAAUmwB,GAAK,IAAMA,GAAK,OAAS,EAAI,SAAW,QAExDhD,IAAgBmB,IAChBlB,EAAekB,EAAM,EAGrBrB,IAAeqB,IACfhB,EAAkB73B,KACdA,IAAA,YAAAA,GAAS,OAAQ64B,IAAU74B,GAAQ,WAAa26B,GAC1C36B,GACA,CAAE,IAAK64B,GAAQ,SAAU8B,EAAA,CAAa,CAGxD,EACA,YAAa,IAAM,CACXjD,IAAgBmB,IAChBlB,EAAe,IAAI,CAE3B,EACA,UAAW,IAAM,CACbF,EAAc,IAAI,EAClBE,EAAe,IAAI,EACnBE,EAAiB,IAAI,CACzB,EACA,OAASttB,IAAU,CACV4tB,IACL5tB,GAAM,eAAA,EACNygB,GAAWtY,EAAQkmB,EAAa,EACpC,CAAA,EAECvD,oBACI,KAAA,CAAG,MAAO,CAAE,MAAO,KAAM,WAAY,SAAS,EAC3C70B,EAAA,cAAC,QAAA,CACG,KAAMg2B,IAAkB,SAAW,QAAU,WAC7C,KAAMA,IAAkB,SAAW0B,GAA2B,OAC9D,aAAY,cAAcW,EAAM,GAChC,QAASyB,GACT,SAAU,IAAM,CACZ,GAAI9D,IAAkB,SAAU,CAC5BwC,GAAyBtmB,EAAQkmB,EAAa,EAC9C,MACJ,CACAG,GAAmBrmB,EAAQkmB,EAAa,CAC5C,EACA,QAAUruB,IAAU,CAChBA,GAAM,gBAAA,EACFisB,IAAkB,WAClBjsB,GAAM,eAAA,EACNyuB,GAAyBtmB,EAAQkmB,EAAa,EAEtD,CAAA,CAAA,CAER,EAEHT,mBACI,KAAA,CAAG,MAAO,CAAE,MAAO,KAAM,WAAY,SAAS,EAC3C33B,EAAA,cAAC,SAAA,CACG,KAAK,SACL,UAAW23B,EACX,UAAU,mHACV,aAAY,eAAeU,EAAM,GACjC,QAAUtuB,IAAUA,GAAM,eAAA,EAC1B,YAAcA,IAAU,CACpBA,GAAM,gBAAA,EACNktB,EAAcoB,EAAM,CACxB,EACA,UAAYtuB,IAAU,CAClBA,GAAM,gBAAA,EACNktB,EAAc,IAAI,EAClBE,EAAe,IAAI,EACnBE,EAAiB,IAAI,CACzB,CAAA,EAEAr3B,EAAA,cAACo6B,GAAAA,aAAA,CAAa,KAAM,EAAA,CAAI,CAAA,CAEhC,EAEH3nB,GAAQ,IAAK2mB,oBACT,KAAA,CAAG,IAAKA,GAAI,GAAA,EAAMd,GAAkBpmB,EAAQknB,GAAI,GAAG,CAAE,CACzD,CAAA,EAEJD,GAAoBd,GAAQ,QAASnmB,EAAQkmB,EAAa,CAC/D,CAER,CAAC,CAAA,CAGb,EACCtC,GAAU91B,EAAA,cAAC,SAAM,UAAWkJ,GAAe/M,EAAM,MAAM,WAAA,EAAc25B,CAAO,CACjF,EACC38B,GAAQ6G,EAAA,cAAC,MAAA,CAAI,UAAU,MAAA,EAAQ7G,CAAK,CACzC,CACJ,CAER,CC5fA,MAAMkhC,GAAiC,CACnC,MAAO,EAAI,EACX,MAAO,EAAI,EACX,MAAO,EAAI,CACf,EAoBaC,GAAYC,EAAAA,WAAW,CAAC,CAAC,IAAAC,EAAK,MAAAhmB,CAAA,EAA8C0S,IAAQ,CAC7F,MAAMuT,EAAYhuB,EAAAA,OAA0B,IAAI,EAC1CiuB,EAAUjuB,EAAAA,OAAgD,EAAE,EAC5D,CAACkuB,EAAgBC,CAAiB,EAAIz8B,EAAAA,SAAsC,CAAA,CAAE,EAEpF08B,EAAAA,oBAAoB3T,EAAK,KAAO,CAC5B,WAAc,IAAM,CAChB,MAAM4T,EAASL,EAAU,QACnBzkB,EAAM8kB,GAAA,YAAAA,EAAQ,WAAW,MAC/B,GAAI,CAACA,GAAU,CAAC9kB,EAAK,OAErB,MAAM+kB,EAAsC,CAAA,EAC5C,UAAWC,KAASC,EAAgB,CAChC,MAAMC,EAAeR,EAAQ,QAAQM,CAAK,EACpCG,EAASR,EAAeK,CAAK,EAC7B1qB,EAAO8qB,EAASJ,CAAK,EAC3B,GAAI,CAACE,GAAgB,CAACC,GAAU,CAAC7qB,EAAM,OAEvC,MAAM+qB,EAAQH,EAAa,aAAeC,EAAO,MAC3C,CAAE,IAAA7hB,EAAK,KAAAD,EAAM,MAAA1D,EAAO,OAAAiB,GAAWtG,EACrCwqB,EAAO,MAAQnlB,EACfmlB,EAAO,OAASlkB,EAEhBZ,EAAI,UAAU,EAAG,EAAGL,EAAOiB,CAAM,EACjCZ,EAAI,UACAklB,GACC7hB,EAAO8hB,EAAO,SAAWE,GACzB/hB,EAAM6hB,EAAO,SAAWE,EACzB1lB,EAAQ0lB,EACRzkB,EAASykB,EACT,EAAG,EAAG1lB,EAAOiB,CAAA,EAEjBmkB,EAASC,CAAK,EAAI,CACd,SAAUI,EAASJ,CAAK,EAAE,SAC1B,KAAMI,EAASJ,CAAK,EAAE,KACtB,MAAAA,EACA,IAAA1hB,EACA,KAAAD,EACA,MAAA1D,EACA,OAAAiB,EACA,OAAQkkB,EAAO,UAAUM,EAASJ,CAAK,EAAE,IAAI,CAAA,CAErD,CAEA,MAAO,CAAE,SAAUM,EAAkB,SAAAP,CAAA,CACzC,CAAA,EACF,EAEF,KAAM,CAACE,EAAgBM,CAAiB,EAAIp9B,EAAAA,SAAmB,IAAM,OAAO,KAAKq8B,EAAI,UAAYH,EAAM,EAAE,OAAO,GAAK,IAAM,UAAU,CAAC,EAEhI,CAACiB,EAAkBE,CAAmB,EAAIr9B,EAAAA,SAAiBq8B,EAAI,QAAQ,EAEvE,CAACY,EAAUK,CAAW,EAAIt9B,EAAAA,SAAoCq8B,EAAI,UAAY,EAAE,EAEhF,CAACkB,EAAUC,CAAW,EAAIx9B,EAAAA,SAAuC,CAAA,CAAE,EACnE,CAACy9B,EAAUC,CAAW,EAAI19B,EAAAA,SAAuC,CAAA,CAAE,EACnE,CAAC29B,EAAYC,CAAa,EAAI59B,EAAAA,SAAwD,CAAA,CAAE,EACxF,CAAC69B,EAAaC,CAAc,EAAI99B,EAAAA,SAAiG,CAAA,CAAE,EAEnI+9B,EAAa,CAAC71B,EAA2C20B,IAAkB,CAC7E,MAAME,EAAe70B,EAAE,cAEvBu0B,EAAkBr0B,IAAS,CACvB,GAAGA,EACH,CAACy0B,CAAK,EAAG,CAAE,MAAOE,EAAa,MAAO,OAAQA,EAAa,OAAQ,QAAS,EAAG,QAAS,CAAA,CAAE,EAC5F,EAEFO,EAAYl1B,GAAQ,CAChB,GAAIA,EAAKy0B,CAAK,EAAG,OAAOz0B,EAExB,MAAM41B,EAAQ9B,GAAOW,CAAK,EACpBoB,EAAW,KAAK,IAAIlB,EAAa,MAAOA,EAAa,OAASiB,CAAK,EACnEE,EAAY,KAAK,IAAInB,EAAa,OAAQA,EAAa,MAAQiB,CAAK,EAE1E,MAAO,CACH,GAAG51B,EACH,CAACy0B,CAAK,EAAG,CACL,SAAUR,EAAI,SACd,KAAMA,EAAI,KACV,MAAAQ,EACA,KAAME,EAAa,OAASmB,GAAa,EACzC,MAAOnB,EAAa,MAAQkB,GAAY,EACxC,MAAOA,EACP,OAAQC,EACR,OAAQ,EAAA,CACZ,CAER,CAAC,CACL,EAEMC,EAAuB,CACzBtB,EACApa,EACA2b,IACmB,CACnB,KAAM,CAAE,MAAA5mB,EAAO,OAAAiB,GAAWgK,EAAM,sBAAA,EAC1Bub,EAAQ9B,GAAOW,CAAK,EACpBwB,EAAOD,EAAcvB,CAAK,EAChC,GAAI,CAACwB,EAAM,OAAO,KAElB,MAAMJ,EAAW,KAAK,IAAIzmB,EAAOiB,EAASulB,CAAK,EAE/C,IAAIM,EAAW,KAAK,IAAID,EAAK,MAAOJ,CAAQ,EACxCM,EAAYD,EAAWN,EAEvBQ,EAAU,KAAK,IAAI,KAAK,IAAIH,EAAK,KAAM,CAAC,EAAG7mB,EAAQ8mB,CAAQ,EAC3DG,EAAS,KAAK,IAAI,KAAK,IAAIJ,EAAK,IAAK,CAAC,EAAG5lB,EAAS8lB,CAAS,EAE/D,MAAO,CACH,GAAGF,EACH,MAAOC,EACP,OAAQC,EACR,KAAMC,EACN,IAAKC,CAAA,CAEb,EAEA39B,EAAAA,UAAU,IAAM,CACZ,MAAM49B,EAAe,IAAM,CACvBpB,EAAYqB,GAAgB,CACxB,MAAMC,EAAc,CAAE,GAAGD,CAAA,EACzB,cAAO,KAAKnC,CAAc,EAAE,QAAQK,GAAS,CACzC,MAAME,EAAeR,EAAQ,QAAQM,CAAK,EAC1C,GAAI,CAACE,EAAc,OAEnB,MAAM8B,EAAcV,EAAqBtB,EAAOE,EAAc6B,CAAW,EACrEC,IACAD,EAAY/B,CAAK,EAAIgC,EAE7B,CAAC,EACMD,CACX,CAAC,EAED,OAAO,KAAKpC,CAAc,EAAE,QAAQK,GAAS,CACzC,MAAME,EAAeR,EAAQ,QAAQM,CAAK,EAC1C,GAAI,CAACE,EAAc,OAEnB,KAAM,CAAE,MAAAvlB,EAAO,OAAAiB,GAAWskB,EAAa,sBAAA,EACvCN,EAAkBr0B,IAAS,CACvB,GAAGA,EACH,CAACy0B,CAAK,EAAG,CAAE,MAAArlB,EAAO,OAAAiB,EAAQ,QAAS,EAAG,QAAS,CAAA,CAAE,EACnD,CACN,CAAC,CACL,EAEA,cAAO,iBAAiB,SAAUimB,CAAY,EACvC,IAAM,OAAO,oBAAoB,SAAUA,CAAY,CAClE,EAAG,CAAClC,CAAc,CAAC,EAEnB,MAAMsC,EAAkB,CAAC52B,EAAqB20B,EAAe94B,IAA4B,CACrFmE,EAAE,gBAAA,EACF,KAAM,CAAE,KAAAgT,EAAM,IAAAC,EAAK,MAAA3D,EAAO,OAAAiB,CAAA,EAAWwkB,EAASJ,CAAK,EAE/C94B,IAAS,QACTy5B,EAAYp1B,IAAS,CAAE,GAAGA,EAAM,CAACy0B,CAAK,EAAG,IAAO,EAChDe,EAAcx1B,IAAS,CACnB,GAAGA,EACH,CAACy0B,CAAK,EAAG,CACL,EAAG30B,EAAE,QAAUgT,EACf,EAAGhT,EAAE,QAAUiT,CAAA,CACnB,EACF,IAEFuiB,EAAYt1B,IAAS,CAAE,GAAGA,EAAM,CAACy0B,CAAK,EAAG,IAAO,EAChDiB,EAAe11B,IAAS,CACpB,GAAGA,EACH,CAACy0B,CAAK,EAAG,CACL,OAAQ30B,EAAE,QACV,OAAQA,EAAE,QACV,MAAAsP,EACA,OAAAiB,CAAA,CACJ,EACF,EAEV,EAEMsmB,EAAmB72B,GAAwB,CAC7C40B,EAAe,QAAQD,GAAS,CAC5B,MAAMG,EAASR,EAAeK,CAAK,EAC7BwB,EAAOpB,EAASJ,CAAK,EACrBmC,EAASrB,EAAWd,CAAK,EACzBoC,EAAQpB,EAAYhB,CAAK,EACzBmB,EAAQ9B,GAAOW,CAAK,EAC1B,GAAI,GAACG,GAAU,CAACqB,GAEhB,IAAId,EAASV,CAAK,GAAKmC,EAAQ,CAC3B,MAAMR,EAAU,KAAK,IAAIxB,EAAO,QAAS,KAAK,IAAI90B,EAAE,QAAU82B,EAAO,EAAGhC,EAAO,QAAUA,EAAO,MAAQqB,EAAK,KAAK,CAAC,EAC7GI,EAAS,KAAK,IAAIzB,EAAO,QAAS,KAAK,IAAI90B,EAAE,QAAU82B,EAAO,EAAGhC,EAAO,QAAUA,EAAO,OAASqB,EAAK,MAAM,CAAC,EACpHf,EAAYl1B,IAAS,CACjB,GAAGA,EACH,CAACy0B,CAAK,EAAG,CAAE,GAAGz0B,EAAKy0B,CAAK,EAAG,KAAM2B,EAAS,IAAKC,CAAA,CAAO,EACxD,CACN,CAEA,GAAIhB,EAASZ,CAAK,GAAKoC,EAAO,CAC1B,IAAIX,EAAWW,EAAM,OAAS/2B,EAAE,QAAU+2B,EAAM,QAC5CV,EAAYD,EAAWN,EAE3B,MAAMC,EAAWjB,EAAO,OAASqB,EAAK,KAAOrB,EAAO,SAC9CkB,EAAYlB,EAAO,QAAUqB,EAAK,IAAMrB,EAAO,SAEjDsB,EAAWL,IACXK,EAAWL,EACXM,EAAYD,EAAWN,GAEvBO,EAAYL,IACZK,EAAYL,EACZI,EAAWC,EAAYP,GAG3B,MAAMkB,EAAU,GACZZ,GAAYY,GAAWX,GAAaW,GACpC5B,EAAYl1B,IAAS,CACjB,GAAGA,EACH,CAACy0B,CAAK,EAAG,CAAE,GAAGz0B,EAAKy0B,CAAK,EAAG,MAAOyB,EAAU,OAAQC,CAAA,CAAU,EAChE,CAEV,EACJ,CAAC,CACL,EAEMY,EAAgB,IAAM,CACxB3B,EAAY,CAAA,CAAE,EACdE,EAAY,CAAA,CAAE,CAClB,EAEA,OACI77B,EAAA,cAAC,OAAI,YAAak9B,EAAiB,UAAWI,EAAe,aAAcA,GACtE9oB,GAASxU,EAAA,cAAC,UAAIwU,CAAM,kBACpB,MAAA,CAAI,UAAU,QACXxU,EAAA,cAAC,KAAA,KAAG,gBAAc,EAClBA,EAAA,cAACu9B,GAAA,CACG,IAAK,CACD,IAAKC,GAAWhD,CAAG,EACnB,IAAK,gBAAA,EAET,KAAM,CACF,MAAOc,EACP,SAAUE,EACV,MAAO,oBAAA,CACX,CAAA,CAER,EACAx7B,EAAA,cAAC,MAAA,CAAI,UAAU,QACV,OAAO,KAAKq6B,EAAM,EAAE,IAAKW,UACtB,OAAAh7B,EAAA,cAAC0c,GAAA,CAAK,IAAKse,GACPh7B,EAAA,cAAC4rB,GAAA,CACG,KAAMoP,EACN,MAAOA,EACP,MAAOC,EAAe,SAASD,CAAK,EACpC,SAAU,CAAC,CAAC,MAAAjxB,KAAW,CACnBwxB,EAAkBh1B,GACdwD,EAAM,OAAO,QACP,CAAC,GAAGxD,EAAMy0B,CAAK,EACfz0B,EAAK,OAAO0K,GAAKA,IAAM+pB,CAAK,CAAA,CAE1C,CAAA,CAAA,EAEHC,EAAe,SAASD,CAAK,GAC1Bh7B,EAAA,cAACu9B,GAAA,CACG,IAAK,CACD,IAAKC,GAAWhD,CAAG,EACnB,IAAK,QAAQQ,CAAK,GAClB,IAAK59B,GAAMs9B,EAAQ,QAAQM,CAAK,EAAI59B,EACpC,OAASiJ,GAAM61B,EAAW71B,EAAG20B,CAAK,EAClC,KAAMh7B,EAAA,cAACy9B,GAAA,CAAQ,SAAArC,EAAoB,MAAAJ,EAAc,gBAAAiC,CAAA,CAAkC,CAAA,EAEvF,KAAM,CACF,QAAO/2B,EAAAk1B,EAASJ,CAAK,IAAd,YAAA90B,EAAiB,WAAYs0B,EAAI,SACxC,MAAAQ,EACA,SAAU0C,GAAYjC,EAAYl1B,IAAS,CAAE,GAAGA,EAAM,CAACy0B,CAAK,EAAG,CAAE,GAAGz0B,EAAKy0B,CAAK,EAAG,SAAA0C,CAAA,GAAa,EAC9F,MAAO,iBAAiB1C,CAAK,EAAA,CACjC,CAAA,CAGZ,EACH,CACL,EACAh7B,EAAA,cAAC,SAAA,CAAO,IAAKy6B,EAAW,MAAO,CAAE,QAAS,MAAA,EAAU,CACxD,CAER,CAAC,EAGKgD,GAAU,CAAC,CACb,SAAArC,EACA,MAAAJ,EACA,gBAAAiC,CACJ,IAMQj9B,EAAA,cAAAA,EAAA,SAAA,KACKo7B,EAASJ,CAAK,GACXh7B,EAAA,cAAC,MAAA,CACG,YAAcqG,GAAM42B,EAAgB52B,EAAG20B,EAAO,MAAM,EACpD,UAAU,WACV,MAAO,CACH,IAAKI,EAASJ,CAAK,EAAE,IACrB,KAAMI,EAASJ,CAAK,EAAE,KACtB,MAAOI,EAASJ,CAAK,EAAE,MACvB,OAAQI,EAASJ,CAAK,EAAE,OACxB,OAAQ,gCACR,gBAAiB,qBACjB,OAAQ,MAAA,CACZ,EAEAh7B,EAAA,cAAC,MAAA,CACG,YAAcqG,GAAM42B,EAAgB52B,EAAG20B,EAAO,QAAQ,EACtD,UAAU,4BACV,MAAO,CACH,MAAO,GACP,OAAQ,GACR,gBAAiB,kBACjB,OAAQ,aAAA,CACZ,CAAA,CACJ,CAGZ,EAqBFuC,GAAkB,CAAC,CACrB,IAAA/C,EACA,KAAAmD,CACJ,IACY39B,EAAA,cAAAA,EAAA,SAAA,KACJA,EAAA,cAAC,MAAA,CAAI,UAAU,UAAA,EACXA,EAAA,cAAC,MAAA,CACG,IAAKw6B,EAAI,IACT,IAAKA,EAAI,IACT,IAAKA,EAAI,IACT,OAAQA,EAAI,OACZ,UAAU,qBACV,UAAW,EAAA,CAAA,EAEdA,EAAI,IACT,kBACCoD,GAAA,CAAgB,GAAGD,EAAM,CAC9B,EAWSC,GAAiB,CAAC,CAC3B,MAAAplC,EACA,SAAAuxB,EACA,MAAAllB,EAAQ,OACR,MAAAm2B,EAAQ,MACZ,IAA2B,CAEvB,MAAM/kB,GAAMzd,GAAA,YAAAA,EAAO,MAAM,KAAK,QAAS,GAEjCqlC,EAAc7C,GAAS,IAAIA,EAAM,QAAQ,IAAK,GAAG,CAAC,GAUlD8C,GARiBC,GAA6B,CAChD,MAAMz2B,EAAOy2B,EAAS,QAAQ,YAAa,EAAE,EAC7C,OAAKF,GACEv2B,EAAK,SAASu2B,CAAW,EAC1Bv2B,EAAK,MAAM,EAAG,CAACu2B,EAAY,MAAM,EAFdv2B,CAI7B,GAEiC9O,GAAS,EAAE,EAEtC4xB,EAA8B,CAAC,CAAC,MAAA5xB,KAAW,CAC7C,MAAMwlC,EAAWxlC,EAAM,KAAA,EACvBuxB,EAAS,GAAGiU,CAAQ,GAAGH,GAAe,EAAE,IAAI5nB,CAAG,EAAE,CACrD,EAEA,OACIjW,EAAA,cAAC0qB,GAAA,CACG,KAAK,WACL,MAAA7lB,EACA,MAAOi5B,EACP,SAAU1T,EACV,KAAM4Q,CAAA,CAAA,CAGlB,EC3ZMiD,GAAgB,CAClBv7B,EAEAqnB,EACAznB,IACC,CACD,KAAM,CAAE,MAAA9J,EAAO,aAAA4xB,EAAc,cAAAC,CAAA,EAAkBC,GAAe,CAAC,KAAA5nB,EAAM,SAAAqnB,EAAU,UAAAznB,EAAU,EACnF,CAAC47B,EAAOC,CAAQ,EAAIhgC,EAAAA,SAAc3F,GAAS,CAAA,CAAE,EAC7C,CAAC4lC,EAAaC,CAAc,EAAIlgC,EAAAA,SAAmB,IAAI,EACvDmgC,EAAe7xB,EAAAA,OAAgC,IAAI,EAEnD8xB,EAAa,CAACpmC,EAAaqmC,IAAwB,CACrDL,EAAS53B,GAAQ,CACb,MAAMk4B,EAAel4B,EAAK,IAAIm4B,GAC1BA,EAAE,MAAQvmC,EAAM,CAAE,GAAGumC,EAAG,GAAGF,GAAYE,CAAA,EAE3C,OAAAtU,EAAa,CAAE,OAAQ,CAAE,KAAA1nB,EAAM,MAAO+7B,CAAA,EAAgB,EAC/CA,CACX,CAAC,CACL,EAEME,EAAcxmC,GAAgB,CAChCgmC,EAAS53B,GAAQ,CACb,MAAMk4B,EAAel4B,EAAK,OAAOm4B,GAAKA,EAAE,MAAQvmC,CAAG,EACnD,OAAAiyB,EAAa,CAAE,OAAQ,CAAE,KAAA1nB,EAAM,MAAO+7B,CAAA,EAAgB,EAC/CA,CACX,CAAC,CACL,EA+DA,MAAO,CACH,MAAAP,EACA,YAAAE,EACA,aAAAE,EACA,cAAAjU,EACA,mBAxDwBtgB,GAA+C,CACvE,MAAM60B,EAAgB,MAAM,KAAK70B,EAAM,OAAO,OAAS,EAAE,EAEzDo0B,EAAS53B,GAAQ,CACb,MAAMk4B,EAAe,CAAC,GAAGl4B,CAAI,EAE7B,OAAAq4B,EAAc,QAAQjB,GAAQ,CAC1B,MAAMkB,EAAU,CACZ,IAAKlB,EAAK,KACV,SAAUA,EAAK,KACf,KAAMA,EAAK,KACX,KAAMA,EAAK,KACX,SAAU,EACV,OAAQ,GACR,SAAU,CAAA,CAAC,EAGTmB,EAAgBL,EAAa,aAAeC,EAAE,MAAQf,EAAK,IAAI,EACjEmB,IAAkB,GAClBL,EAAaK,CAAa,EAAID,EAE9BJ,EAAa,KAAKI,CAAO,EAG7B,MAAM7mB,EAAS,IAAI,WACnBA,EAAO,WAAa3R,GAAK,CACrB,GAAIA,EAAE,iBAAkB,CACpB,MAAM04B,EAAU,KAAK,MAAO14B,EAAE,OAASA,EAAE,MAAS,GAAG,EACrDk4B,EAAWM,EAAQ,IAAK,CAAE,SAAUE,EAAuB,CAC/D,CACJ,EAEA/mB,EAAO,UAAY,IAAM,CACrBumB,EAAWM,EAAQ,IAAK,CAAE,SAAU,GAAkB,EACtD,WAAW,IAAM,CACbN,EAAWM,EAAQ,IAAK,CACpB,SAAU,IACV,OAAQ,QAAQlB,EAAK,IAAI,WAAWrsB,GAAc0G,EAAO,MAAqB,CAAC,EAAA,CACpE,CACnB,EAAG,GAAG,CACV,EAEAA,EAAO,kBAAkB2lB,CAAI,CACjC,CAAC,EAEMc,CACX,CAAC,EAEGH,EAAa,UAASA,EAAa,QAAQ,MAAQ,GAC3D,EAQI,aAAc,IAAA,OAAM,OAAAp4B,EAAAo4B,EAAa,UAAb,YAAAp4B,EAAsB,SAC1C,aAAe/N,GAAgB,CAC3BwmC,EAAWxmC,CAAG,CAClB,EACA,WAvEgBqmC,GAAwB,CACnCJ,IAELG,EAAWH,EAAY,IAAKI,CAAO,EACnCH,EAAe,IAAI,EACvB,EAmEI,WAjEgBV,GAAYU,EAAeV,CAAI,EAkE/C,YAjEgB,IAAMU,EAAe,IAAI,CAiEzC,CAER,EAqCMW,GAAY,CAAC,CACf,KAAAt8B,EACA,aAAA47B,EACA,OAAAvrB,EAAsB,MACtB,SAAAksB,EACA,SAAAlV,EAAsB,OACtB,MAAAllB,EAAsB,OACtB,KAAA6F,EAAsB,OACtB,SAAAuf,EAAsB,GACtB,SAAAiV,EAAsB,GACtB,OAAAtoB,EAAsB,OACtB,MAAAjB,EAAsB,OACtB,UAAApQ,EAAsB,MAC1B,IAEQvF,EAAA,cAAAA,EAAA,SAAA,KACIA,EAAA,cAACoV,GAAA,CACG,KAAA1K,EACA,MAAA7F,EACA,QAASo6B,EACT,UAAA15B,EACA,MAAO,CAAC,OAAAqR,EAAgB,MAAAjB,CAAA,CAAY,CAAA,EAGxC3V,EAAA,cAAC,QAAA,CACG,KAAA0C,EACA,KAAK,OACL,OAAAqQ,EACA,IAAKurB,EACL,SAAAY,EACA,SAAAjV,EACA,UAAU,SACV,SAAAF,CAAA,CAAA,CAER,EAIFoV,GAAa,CAAC,CAChB,MAAA3qB,EACA,KAAAmpB,EACA,KAAAz7B,EACA,OAAA8a,EAAS,OACT,QAAAD,EAAU,MACd,IAAuB,CACnB,KAAM,CAAC2gB,EAAU0B,CAAW,EAAIjhC,EAAAA,SAASw/B,EAAK,QAAQ,EAEhD0B,EAAU5yB,EAAAA,OAKb,IAAI,EAED6yB,EAAa,UACXD,EAAQ,QACRriB,GAAA,MAAAA,EAASqiB,EAAQ,QAAQ,cAEzBriB,GAAA,MAAAA,EAAS,CAAE,SAAA0gB,EAAU,SAAU,CAAA,IAE5B,IAGX,OACI19B,EAAA,cAAC6c,GAAA,CACG,MAAArI,EACA,OAAQ8qB,EACR,QAAAviB,EACA,KAAM7a,IAAS,MAAQ,aAAe,MAAA,EAErCA,IAAS,YACNlC,EAAA,cAAC49B,GAAA,CACG,MAAOF,EACP,SAAU0B,EACV,MAAO,WAAA,CAAA,EAGdl9B,IAAS,OACNlC,EAAA,cAACs6B,GAAA,CACG,IAAK+E,EACL,IAAK1B,CAAA,CAAA,CACT,CAIhB,EACM4B,GAAe,CAACrB,EAAoBpa,EAAaob,IAC5ChB,EAAM,OAASpa,IAAQob,GAAYhB,EAAM,SAAW,GAGzDsB,OAAe,IACRhC,GAAa,CAACG,EAAiBxnB,EAAiB,WAAqB,CAC9E,GAAIwnB,EAAK,OAAQ,CACb,MAAM8B,EAAU,GAAG9B,EAAK,QAAQ,IAAIxnB,CAAM,GAC1C,OAAKqpB,GAAS,IAAIC,CAAO,GACrBD,GAAS,IAAIC,EAAS1tB,GAAY4rB,EAAK,OAAQA,EAAK,IAAI,GAAKngC,EAAiB,EAE3EgiC,GAAS,IAAIC,CAAO,GAAKjiC,EACpC,CACA,OAAOmgC,EAAK,GAChB,EAEa+B,GAAiB,CAAC,CAC3B,KAAAh9B,EAEA,SAAAqnB,EAAc,OACd,MAAAllB,EAAc,OACd,SAAAolB,EAAc,GACd,SAAA0V,EAAc,GACd,SAAAT,EAAc,GACd,IAAApb,EAAc,IACd,OAAA/Q,EAAc,4BACd,IAAA9Z,EAAc,OACd,KAAAE,EAAc,OACd,UAAAmJ,EAAc,OACd,UAAA/B,EAAc,MAClB,IAA2B,CACvB,KAAM,CAAE,MAAA29B,EAAO,YAAAE,EAAa,aAAAE,EAAc,cAAAjU,EAAe,mBAAAuV,EAAoB,aAAAC,EAAc,aAAAC,EAAc,WAAAR,EAAY,WAAAS,EAAY,YAAA1hB,CAAA,EAAgB4f,GAAyBv7B,EAAMqnB,EAAUznB,CAAS,EAEnM,OACItC,EAAA,cAACM,EAAA,CAAQ,UAAW+pB,CAAA,EACfpxB,EACD+G,EAAA,cAAC,MAAA,CAAI,UAAAO,GACDP,EAAA,cAAC,MAAA,CAAI,UAAW,qBAAqB6E,EAAQ,kBAAoB,aAAa,EAAA,EACzEA,GAAS7E,EAAA,cAACmkB,GAAA,CAAM,MAAAtf,EAAc,SAAAolB,CAAA,CAAoB,EAClDsV,GAAarB,EAAOpa,EAAKob,CAAQ,GAAKl/B,EAAA,cAACg/B,GAAA,CACpC,KAAAt8B,EACA,aAAA47B,EACA,OAAAvrB,EACA,SAAU8sB,EACV,SAAUD,EACV,MAAO,SACP,KAAM,SACN,SAAA3V,EACA,SAAAiV,CAAA,CAAA,CAER,EACChB,EAAM,OAAS,GAAKl+B,EAAA,cAAC61B,GAAA,CAClB,QAAU3jB,GAAWytB,GAAYI,EAAW7tB,CAAmB,EAC/D,OAAQ,CACJ,CAAE,MAAO,OAAQ,IAAK,MAAA,EACtB,CAAE,MAAO,WAAY,IAAK,UAAA,EAC1B,CAAE,MAAO,UAAW,IAAK,SAAA,CAAU,EAEvC,KAAMgsB,EAAM,IAAKP,IAAU,CACvB,GAAGA,EACH,KAAMA,EAAK,WAAa,IAAM39B,EAAA,cAAC,KAAE,KAAMw9B,GAAWG,CAAI,EAAG,OAAO,SAAS,IAAI,uBAAuBA,EAAK,QAAS,EAAOA,EAAK,SAC9H,SACIA,EAAK,WAAa,KACfA,EAAK,KAAO,MAAM,QAAQ,CAAC,EAAI,MAChC39B,EAAA,cAAC6jB,GAAA,CAAW,IAAK,IAAK,IAAK,EAAG,IAAK8Z,EAAK,SAAU,MAAM,KAAA,CAAM,EAEpE,QACI39B,EAAA,cAAAA,EAAA,SAAA,KACKA,EAAA,cAACoV,GAAA,CAAa,QAAS,IAAM0qB,EAAanC,EAAK,GAAG,EAAG,KAAK,IAAI,UAAU,MAAM,CACnF,CAAA,EAEN,CAAA,CAAA,CAEV,EACCgC,GAAYvB,GACTp+B,EAAA,cAACm/B,GAAA,CACG,MAAM,kBACN,KAAMf,EACN,KAAK,WACL,OAAQkB,EACR,QAASjhB,CAAA,CAAA,EAGhBllB,CACL,CAER,EAEa6mC,GAAc,CAAC,CACxB,KAAAt9B,EAEA,SAAAqnB,EAAkB,OAClB,MAAAllB,EAAkB,OAClB,SAAA86B,EAAkB,GAClB,SAAAT,EAAkB,GAClB,OAAAnsB,EAAkB,UAClB,SAAAkX,EAAkB,GAClB,IAAAnG,EAAkB,IAClB,cAAAmc,EAAkB,IAClB,aAAAC,EAAkB,IAClB,IAAAjnC,EAAkB,OAClB,KAAAE,EAAkB,OAClB,UAAAmJ,EAAkB,OAClB,UAAA/B,EAAkB,MACtB,IAAwB,CACpB,KAAM,CAAE,MAAA29B,EAAO,YAAAE,EAAa,aAAAE,EAAc,cAAAjU,EAAe,mBAAAuV,EAAoB,aAAAC,EAAc,aAAAC,EAAc,WAAAR,EAAY,WAAAS,EAAY,YAAA1hB,CAAA,EAAgB4f,GAAyBv7B,EAAMqnB,EAAUznB,CAAS,EAE7L,CAAC69B,EAAcC,CAAe,EAAIjiC,EAAAA,SAAwB,IAAI,EAE9DkiC,EAAa,CAAC,CAAC,OAAAhG,KAAiD,CAClE,GAAG,CAACA,EAAQ,OACZ,MAAMhiB,EAAO,OAAO,KAAKgiB,CAAM,EAC/B,OAAIhiB,EAAK,SAAW,EAAU,KACvBA,EACF,IAAKlgB,GACF6H,EAAA,cAACqC,IAAM,IAAAlK,CAAA,EAAU6H,EAAA,cAAC,IAAA,CAAE,KAAMw9B,GAAWnD,EAAOliC,CAAG,EAAGA,CAAG,EAAG,UAAU,aAAa,OAAO,SAAS,IAAI,qBAAA,EAAuBA,CAAI,CAAI,CACrI,CAET,EAEA,OACI6H,EAAA,cAACM,GAAQ,UAAW+pB,CAAA,EACfpxB,EACD+G,EAAA,cAACM,EAAA,CAAQ,UAAAC,CAAA,EACJsE,GAAS7E,EAAA,cAACmkB,GAAA,CAAM,MAAAtf,EAAc,SAAAolB,CAAA,CAAoB,kBAClD,MAAA,CAAI,UAAU,wBACViU,EAAM,IAAI,CAAC1D,EAAKtiC,IACb8H,EAAA,cAAC,MAAA,CACG,IAAK9H,EACL,UAAU,2BACV,MAAO,CAAE,MAAO+nC,EAAe,OAAQC,CAAA,EACvC,aAAc,IAAME,EAAgBloC,CAAC,EACrC,aAAc,IAAMkoC,EAAgB,IAAI,CAAA,EAEvC5F,EAAI,WAAa,IACdx6B,EAAA,cAAAA,EAAA,SAAA,KACIA,EAAA,cAAC,MAAA,CACG,IAAKw9B,GAAWhD,CAAG,EACnB,IAAK,WAAWtiC,CAAC,GACjB,UAAU,6BAAA,CAAA,EAId8H,EAAA,cAAC,MAAA,CAAI,UAAU,oFAAoF,MAAO,CAAE,QAASmgC,IAAiBjoC,EAAI,OAAS,MAAA,mBAC9I,IAAA,CAAE,KAAMslC,GAAWhD,CAAG,EAAG,OAAO,SAAS,UAAU,iBAAiB,IAAI,qBAAA,EAAsBx6B,EAAA,cAAC0E,GAAK,KAAK,KAAA,CAAM,CAAE,EACjHi7B,GAAY3/B,EAAA,cAACoV,GAAA,CAAa,QAAS,IAAM2qB,EAAWvF,CAAG,EAAG,KAAK,SAAS,UAAU,MAAM,EACzFx6B,EAAA,cAACoV,GAAA,CAAa,QAAS,IAAM0qB,EAAatF,EAAI,GAAG,EAAG,KAAK,IAAI,UAAU,MAAM,EAC5EmF,mBAAa,MAAA,CAAI,UAAU,uEAAA,EACxB3/B,EAAA,cAACqgC,GAAW,OAAQ7F,EAAI,SAAU,CACtC,CACJ,CACJ,EAEAx6B,EAAA,cAAC6jB,GAAA,CAAW,IAAK,IAAK,IAAK,EAAG,IAAK2W,EAAI,SAAU,MAAM,QAAA,CAAS,CAAA,CAG3E,EAEA+E,GAAarB,EAAOpa,EAAKob,CAAQ,GAAKl/B,EAAA,cAACg/B,GAAA,CACpC,KAAAt8B,EACA,aAAA47B,EACA,OAAAvrB,EACA,SAAU8sB,EACV,SAAUD,EACV,KAAM,SACN,SAAA3V,EACA,SAAAiV,EACA,OAAQe,EACR,MAAOC,EACP,UAAU,MAAA,CAAA,CAElB,CACJ,EAECP,GAAYvB,GACTp+B,EAAA,cAACm/B,GAAA,CACG,MAAM,eACN,KAAMf,EACN,KAAK,MACL,OAAQkB,EACR,QAASjhB,CAAA,CAAA,EAGhBllB,CACL,CAER,EC9aO,IAAKmnC,IAAAA,IACRA,EAAA,OAAS,SACTA,EAAA,KAAO,OAFCA,IAAAA,IAAA,CAAA,CAAA,EA6CZ,MAAMhN,GAAc,WACdC,GAAc,4CACdC,GAAoB,oCAEbH,GAAS,CAAC,CACnB,KAAA72B,EAAO,SACP,YAAAi3B,EACA,qBAAAC,EACA,GAAGtwB,CACP,IAAmB,OACf,KAAM,CAAE,MAAA5K,GAAU8xB,GAAe,CAAC,KAAMlnB,EAAM,KAAK,EACnD,OAAO5G,IAAS,SACVwD,EAAA,cAAC2zB,GAAA,CAAc,GAAGvwB,EAAO,MAAA5K,CAAA,CAAc,GACvC0N,EAAA1N,GAAA,YAAAA,EAAO,SAAP,MAAA0N,EAAe,wBACV0tB,GAAA,CAAY,GAAGxwB,EAAO,MAAA5K,EAAc,YAAAi7B,CAAA,CAA0B,EAC/DzzB,EAAA,cAAC6zB,GAAA,CAAgB,GAAGzwB,EAAO,qBAAAswB,CAAA,CAA4C,CACrF,EAGMC,GAAe,CAAC,CAClB,KAAAjxB,EACA,MAAAmC,EAAgB,OAChB,MAAArM,EAAgB,OAChB,SAAAyxB,EAAgB,GAChB,SAAAF,EAAgB,OAChB,aAAAC,EAAgB,OAChB,KAAA+B,EAAgB,GAChB,IAAA9yB,EAAgB,OAChB,KAAAE,EAAgB,OAChB,UAAAmJ,EAAgB,OAChB,UAAA/B,EAAgB,MACpB,IAAyB,aACrB,KAAM,CAAE,aAAA6pB,CAAA,EAAiBE,GAAe,CAAE,KAAA5nB,EAAM,EAC1CvG,EAAQ8D,EAAiB,EACzB6zB,EAAUjvB,GAASnC,EAEzB,uBACKpC,EAAA,CAAQ,UAAWgC,GAAanG,EAAM,OAAO,WACzClD,EACD+G,EAAA,cAAC,OAAI,WAAWkG,EAAA1N,GAAA,YAAAA,EAAO,SAAP,MAAA0N,EAAe,QAAUqtB,GAAc,YACnDvzB,EAAA,cAAC,MAAA,CAAI,UAAWwzB,EAAA,EACZxzB,EAAA,cAAC4rB,GAAA,CACG,KAAMlpB,EAAO,kBACb,MAAO,SACP,aAAcsnB,GAAA,YAAAA,EAAc,QAC5B,SAAU,CAAC,CAAC,MAAAjgB,KAAW,CACnBqgB,EAAa,CACT,OAAQ,CACJ,KAAM1nB,EAAO,gBACb,MAAOqH,EAAM,OAAO,QAASigB,GAAA,YAAAA,EAAc,MAAA,CAC/C,CACH,CACL,CAAA,CAAA,CAER,EACAhqB,EAAA,cAAC8rB,GAAA,CACG,UAAWvrB,GAAapE,EAAM,OAAO,UACrC,KAAMuG,IAAQiH,EAAAnR,GAAA,YAAAA,EAAO,SAAP,MAAAmR,EAAe,QAAU,gBAAkB,UACzD,OAAOuJ,EAAA1a,GAAA,YAAAA,EAAO,SAAP,MAAA0a,EAAe,QAAUogB,GAAcQ,EAAUA,EACxD,eAAc1c,EAAA5e,GAAA,YAAAA,EAAO,SAAP,YAAA4e,EAAe,WAAW4S,GAAA,YAAAA,EAAc,OACtD,SAAAD,EACA,SAAAE,EACA,KAAA8B,CAAA,CAAA,CACR,EACC5yB,CACL,CAER,EAEMy6B,GAAa,CAAC,CAChB,KAAAlxB,EACA,MAAAmC,EACA,MAAArM,EACA,SAAAyxB,EACA,SAAAF,EACA,aAAAC,EACA,KAAA+B,EAAO,GACP,IAAA9yB,EACA,KAAAE,EACA,UAAAmJ,EACA,UAAA/B,EACA,YAAAkzB,CACJ,IAAuB,OACnB,KAAM,CAAE,aAAArJ,EAAc,OAAAlY,CAAA,EAAWoY,GAAe,CAAC,KAAA5nB,EAAK,EAEhDvG,EAAQ8D,EAAiB,EACzB6zB,EAAUjvB,GAASnC,EACnB,CAACyuB,EAAQD,CAAS,EAAI/yB,EAAAA,SAAS,EAAK,EACpC41B,EAAgBX,GAAG,SAAA,EACzB,uBACK9yB,EAAA,CAAQ,UAAWgC,GAAanG,EAAM,OAAO,SAAA,EACzClD,EACD+G,EAAA,cAAC,MAAA,CAAI,UAAWmxB,EAASoC,GAAc,YACnCvzB,EAAA,cAAC,MAAA,CAAI,UAAWwzB,EAAA,EACZxzB,EAAA,cAACoV,GAAA,CAAa,WAAWlP,EAAA1N,GAAA,YAAAA,EAAO,SAAP,MAAA0N,EAAe,MAAQ,4CAA8C,4CAC1F,KAAMirB,EAAS,gBAAkB,WAAY,MAAOA,EAAS,sBAAwB,mBACrF,QAAS,IAAM,CACfD,EAAU,CAACC,CAAM,CACrB,CAAA,CAAA,CAEJ,EACAnxB,EAAA,cAAC8rB,GAAA,CACG,UAAYvrB,GAAapE,EAAM,OAAO,UACtC,KAAMuG,EAAO,gBACb,MAAO4wB,GAAcQ,EACrB,aAAc9J,GAAA,YAAAA,EAAc,MAC5B,SAAAD,EACA,SAAU,GACV,KAAM/pB,EAAA,cAACuI,GAAA,CACH,SAAS,MACT,aAAc,CACV,KAAM,MAAA,CACV,kBAECiC,GAAA,KAAaxK,EAAA,cAACouB,GAAA,CAAO,KAAM1rB,EAAO,eAAgB,IAAI,OACnD,aAAcsnB,GAAA,YAAAA,EAAc,KAC5B,QAASoJ,GAAG,SAAA,EACZ,YAAa,CACT,MAAO,YAAcW,EAAc,KAAO,IAC1C,MAAO,EAAA,CACX,CAAA,CACF,kBACDvpB,GAAA,KAAaxK,EAAA,cAACouB,GAAA,CAAO,KAAM1rB,EAAO,mBAAoB,IAAI,WACvD,aAAcsnB,GAAA,YAAAA,EAAc,SAC5B,QAASoJ,GAAG,SAAA,EACZ,YAAa,CACT,MAAO,YAAcW,EAAc,SAAW,IAC9C,MAAO,EAAA,CACX,CAAA,CACF,kBACDvpB,GAAA,KAAaxK,EAAA,cAACouB,GAAA,CAAO,KAAM1rB,EAAO,gBAAiB,IAAI,QACpD,aAAcsnB,GAAA,YAAAA,EAAc,MAC5B,QAASoJ,GAAG,UAAA,EACZ,YAAa,CACT,MAAO,YAAcW,EAAc,MAAQ,IAC3C,MAAO,EAAA,CACX,CAAA,CACF,kBACDvpB,GAAA,KAAaxK,EAAA,cAACouB,GAAA,CAAO,KAAM1rB,EAAO,gBAAiB,IAAI,QACpD,aAAcsnB,GAAA,YAAAA,EAAc,MAC5B,QAASoJ,GAAG,UAAA,EACZ,YAAa,CACT,MAAO,YAAcW,EAAc,MAAQ,IAC3C,MAAO,EAAA,CACX,CAAA,CACF,kBACDvpB,GAAA,KAAaxK,EAAA,cAACouB,GAAA,CAAO,KAAM1rB,EAAO,gBAAiB,IAAI,QACpD,aAAcsnB,GAAA,YAAAA,EAAc,MAC5B,QAASoJ,GAAG,UAAA,EACZ,YAAa,CACT,MAAO,YAAcW,EAAc,MAAQ,IAC3C,MAAO,EAAA,CACX,CAAA,CACF,kBACDvpB,GAAA,KAAaxK,EAAA,cAACqrB,GAAA,CAAM,KAAM3oB,EAAO,sBAAuB,MAAM,cAC3D,aAAcsnB,GAAA,YAAAA,EAAc,YAC5B,IAAK,EACL,IAAK,EACL,KAAM,EAAA,CAAA,CACR,CAAA,EAEN,UAAWmH,EAAS,GAAK,UACzB,KAAApF,CAAA,CAAA,EACJ/rB,EAAA,cAAC8rB,GAAA,CACG,UAAYvrB,GAAapE,EAAM,OAAO,UACtC,KAAMuG,EAAO,SACb,MAAOoxB,EACP,SAAA/J,EACA,SAAAE,EACA,KAAMjqB,EAAA,cAACuU,GAAA,CAAc,KAAK,QAAQ,QAAS,SAAY,CACnD6V,GAAA,MAAAA,EAAe,CACX,OAAQ,CACJ,KAAM1nB,EAAO,SACb,MAAO,MAAMsxB,GAAUx7B,GAAA,YAAAA,EAAO,OAAQ0Z,EAAQuhB,CAAW,CAAA,CAC7D,EAER,EAAG,EACH,UAAWtC,EAAS,UAAY,GAChC,KAAApF,CAAA,CAAA,CACR,EACC5yB,CACL,CAER,EAEM06B,GAAiB,CAAC,CACpB,KAAAnxB,EACA,MAAAmC,EACA,SAAAolB,EACA,SAAAF,EACA,KAAAgC,EACA,IAAA9yB,EACA,KAAAE,EACA,UAAAmJ,EACA,UAAA/B,EACA,qBAAAmzB,CACJ,IAA2B,CACvB,MAAMv3B,EAAQ8D,EAAiB,EAE/B,OACID,EAAA,cAACM,EAAA,CAAQ,UAAWgC,GAAanG,EAAM,OAAO,SAAA,EACzClD,GACAy6B,GAAA,YAAAA,EAAuB,CAAC,KAAAhxB,EAAM,MAAAmC,EAAO,SAAAolB,EAAU,SAAAF,CAAA,KAC5C/pB,EAAA,cAAC8rB,GAAA,CACG,UAAYvrB,GAAapE,EAAM,OAAO,UACtC,KAAMuG,EAAO,SACb,MAAAmC,EACA,SAAAklB,EACA,SAAAE,EACA,KAAA8B,CAAA,CAAA,EAGP5yB,CACL,CAER,EAEa66B,GAAY,MAAOzhB,EAAwBjC,EAAwBmjB,IAA+C,CAC3H,KAAM,CAAE,MAAOtC,EAAQ,GAAG90B,GAAWkW,EAC/BO,EAAW,MAAMsgB,GAAG,MACtB,CAAC9C,IAAgBmD,GAAA,YAAAA,EAActC,EAAQ90B,EAAQiU,KAAS6gB,EAAQZ,EAAmB,EAAE,KAAK;AAAA,CAAI,EAC9Fl0B,EACAiU,CAAA,EAGJ,eAAQ,IAAIwC,CAAQ,EACbA,CACX,ECzOMytB,GAA8C,CAChD,OAAQ,CAACn9B,EAAQ,MAAQ,CACrB,QAASA,EACT,YAAcV,IAAU,CAAC,CAACA,CAAI,EAAGU,EAAM,eACvC,OAAQ,CAAC,CAAC,KAAAV,EAAM,MAAAmC,EAAO,GAAGxM,CAAA,EAAQ,KAAO2H,EAAA,cAAC0qB,GAAA,CAAO,IAAKhoB,GAAQU,EAAM,KAAM,KAAMV,GAAQU,EAAM,KAAM,MAAOyB,GAASzB,EAAM,OAASV,EAAO,GAAGU,EAAQ,GAAG/K,CAAA,CAAM,CAAA,GAElK,OAAQ,CAAC+K,EAAQ,MAAQ,CACrB,QAASA,EACT,YAAcV,IAAU,CAAC,CAACA,CAAI,EAAGU,EAAM,eACvC,OAAQ,CAAC,CAAC,KAAAV,EAAM,MAAAmC,EAAO,GAAGxM,CAAA,EAAQ,KAAO2H,EAAA,cAAC2qB,GAAA,CAAO,IAAKjoB,GAAQU,EAAM,KAAM,KAAMV,GAAQU,EAAM,KAAM,MAAOyB,GAASzB,EAAM,OAASV,EAAO,GAAGU,EAAQ,GAAG/K,CAAA,CAAM,CAAA,GAElK,MAAO,CAAC+K,EAAQ,MAAQ,CACpB,QAASA,EACT,YAAcV,IAAU,CAAC,CAACA,CAAI,EAAGU,EAAM,eACvC,OAAQ,CAAC,CAAC,KAAAV,EAAM,MAAAmC,EAAO,GAAGxM,CAAA,EAAQ,KAAO2H,EAAA,cAAC4qB,GAAA,CAAM,IAAKloB,GAAQU,EAAM,KAAM,KAAMV,GAAQU,EAAM,KAAM,MAAOyB,GAASzB,EAAM,OAASV,EAAO,GAAGU,EAAQ,GAAG/K,CAAA,CAAM,CAAA,GAEjK,SAAU,CAAC+K,EAAQ,MAAQ,CACvB,QAASA,EACT,YAAcV,IAAU,CAAC,CAACA,CAAI,EAAGU,EAAM,eACvC,OAAQ,CAAC,CAAC,KAAAV,EAAM,MAAAmC,EAAO,GAAGxM,CAAA,EAAQ,KAAO2H,EAAA,cAAC6qB,GAAA,CAAS,IAAKnoB,GAAQU,EAAM,KAAM,KAAMV,GAAQU,EAAM,KAAM,MAAOyB,GAASzB,EAAM,OAASV,EAAO,GAAGU,EAAQ,GAAG/K,CAAA,CAAM,CAAA,GAEpK,MAAO,CAAC+K,EAAQ,MAAQ,CACpB,QAASA,EACT,YAAcV,IAAU,CAAC,CAACA,CAAI,EAAGU,EAAM,eACvC,OAAQ,CAAC,CAAC,KAAAV,EAAM,MAAAmC,EAAO,GAAGxM,CAAA,EAAQ,KAAO2H,EAAA,cAACgrB,GAAA,CAAM,IAAKtoB,GAAQU,EAAM,KAAM,KAAMV,GAAQU,EAAM,KAAM,MAAOyB,GAASzB,EAAM,OAASV,EAAO,GAAGU,EAAQ,GAAG/K,CAAA,CAAM,CAAA,GAEjK,KAAM,CAAC+K,EAAQ,MAAQ,CACnB,QAASA,EACT,YAAcV,IAAU,CAAC,CAACA,CAAI,EAAGU,EAAM,eACvC,OAAQ,CAAC,CAAC,KAAAV,EAAM,MAAAmC,EAAO,GAAGxM,CAAA,EAAQ,KAAO2H,EAAA,cAACirB,GAAA,CAAK,IAAKvoB,GAAQU,EAAM,KAAM,KAAMV,GAAQU,EAAM,KAAM,MAAOyB,GAASzB,EAAM,OAASV,EAAO,GAAGU,EAAQ,GAAG/K,CAAA,CAAM,CAAA,GAEhK,KAAM,CAAC+K,EAAQ,MAAQ,CACnB,QAASA,EACT,YAAcV,IAAU,CAAC,CAACA,CAAI,EAAGU,EAAM,eACvC,OAAQ,CAAC,CAAC,KAAAV,EAAM,MAAAmC,EAAO,GAAGxM,CAAA,EAAQ,KAAO2H,EAAA,cAACkrB,GAAA,CAAK,IAAKxoB,GAAQU,EAAM,KAAM,KAAMV,GAAQU,EAAM,KAAM,MAAOyB,GAASzB,EAAM,OAASV,EAAO,GAAGU,EAAQ,GAAG/K,CAAA,CAAM,CAAA,GAEhK,SAAU,CAAC+K,EAAQ,MAAQ,CACvB,QAASA,EACT,YAAcV,IAAU,CAAE,CAACA,CAAI,EAAGU,EAAM,eACxC,OAAQ,CAAC,CAAC,KAAAV,EAAM,MAAAmC,EAAO,GAAGxM,CAAA,EAAQ,KAAO2H,EAAA,cAAC3J,GAAA,CAAS,IAAKqM,GAAQU,EAAM,KAAM,KAAMV,GAAQU,EAAM,KAAM,MAAOyB,GAASzB,EAAM,OAASV,EAAO,GAAGU,EAAQ,GAAG/K,CAAA,CAAM,CAAA,GAEpK,KAAM,CAAC+K,EAAQ,MAAQ,CACnB,QAASA,EACT,YAAcV,IAAU,CAAE,CAACA,CAAI,EAAGU,EAAM,eACxC,OAAQ,CAAC,CAAC,KAAAV,EAAM,MAAAmC,EAAO,GAAGxM,CAAA,EAAQ,KAAO2H,EAAA,cAACmrB,GAAA,CAAK,IAAKzoB,GAAQU,EAAM,KAAM,KAAMV,GAAQU,EAAM,KAAM,MAAOyB,GAASzB,EAAM,OAASV,EAAO,GAAGU,EAAQ,GAAG/K,CAAA,CAAM,CAAA,GAEhK,MAAO,CAAC+K,EAAQ,MAAQ,CACpB,QAASA,EACT,YAAcV,IAAU,CAAE,CAACA,CAAI,EAAGU,EAAM,eACxC,OAAQ,CAAC,CAAC,KAAAV,EAAM,MAAAmC,EAAO,GAAGxM,CAAA,EAAQ,KAAO2H,EAAA,cAACorB,GAAA,CAAM,IAAK1oB,GAAQU,EAAM,KAAM,KAAMV,GAAQU,EAAM,KAAM,MAAOyB,GAASzB,EAAM,OAASV,EAAO,GAAGU,EAAQ,GAAG/K,CAAA,CAAM,CAAA,GAEjK,SAAU,CAAC+K,EAAQ,MAAQ,CACvB,QAASA,EACT,YAAcV,IAAU,CAAC,CAACA,CAAI,EAAGU,EAAM,eACvC,OAAQ,CAAC,CAAC,KAAAV,EAAM,MAAAmC,EAAO,GAAGxM,CAAA,EAAQ,KAAO2H,EAAA,cAAC8rB,GAAA,CAAS,IAAKppB,GAAQU,EAAM,KAAM,KAAMV,GAAQU,EAAM,KAAM,MAAOyB,GAASzB,EAAM,OAASV,EAAO,GAAGU,EAAQ,GAAG/K,CAAA,CAAM,CAAA,GAEpK,SAAU,CAAC+K,EAAQ,MAAQ,CACvB,QAASA,EACT,YAAcV,IAAU,CAAC,CAACA,CAAI,EAAGU,EAAM,eACvC,OAAQ,CAAC,CAAC,KAAAV,EAAM,MAAAmC,EAAO,GAAGxM,CAAA,EAAQ,KAAO2H,EAAA,cAACurB,GAAA,CAAS,IAAK7oB,GAAQU,EAAM,KAAM,KAAMV,GAAQU,EAAM,KAAM,MAAOyB,GAASzB,EAAM,OAASV,EAAO,GAAGU,EAAQ,GAAG/K,CAAA,CAAM,CAAA,GAEpK,OAAQ,CAAC+K,EAAQ,MAAQ,CACrB,QAASA,EACT,YAAcV,IAAU,CAAC,CAACA,CAAI,EAAGU,EAAM,eACvC,OAAQ,CAAC,CAAC,KAAAV,EAAM,MAAAmC,EAAO,GAAGxM,CAAA,EAAQ,KAAO2H,EAAA,cAAC4rB,GAAA,CAAO,IAAKlpB,GAAQU,EAAM,KAAM,KAAMV,GAAQU,EAAM,KAAM,MAAOyB,GAASzB,EAAM,OAASV,EAAO,GAAGU,EAAQ,GAAG/K,CAAA,CAAM,CAAA,GAElK,OAAQ,CAAC+K,EAAQ,MAAQ,CACrB,QAASA,EACT,YAAcV,IAAU,CAAC,CAACA,CAAI,EAAGU,EAAM,eACvC,OAAQ,CAAC,CAAC,KAAAV,EAAM,MAAAmC,EAAO,GAAGxM,CAAA,EAAQ,KAAO2H,EAAA,cAACouB,GAAA,CAAO,IAAK1rB,GAAQU,EAAM,KAAM,KAAMV,GAAQU,EAAM,KAAM,MAAOyB,GAASzB,EAAM,OAASV,EAAO,GAAGU,EAAQ,GAAG/K,CAAA,CAAM,CAAA,GAElK,aAAc,CAAC+K,EAAQ,MAAQ,CAC3B,QAASA,EACT,YAAcV,IAAU,CAAC,CAACA,CAAI,EAAGU,EAAM,eACvC,OAAQ,CAAC,CAAC,KAAAV,EAAM,MAAAmC,EAAO,GAAGxM,CAAA,EAAQ,KAAO2H,EAAA,cAAC2uB,GAAA,CAAa,IAAKjsB,GAAQU,EAAM,KAAM,KAAMV,GAAQU,EAAM,KAAM,MAAOyB,GAASzB,EAAM,OAASV,EAAO,GAAGU,EAAQ,GAAG/K,CAAA,CAAM,CAAA,GAExK,UAAW,CAAC+K,EAAQ,MAAQ,CACxB,QAASA,EACT,YAAcV,IAAU,CAAC,CAACA,CAAI,EAAGU,EAAM,eACvC,OAAQ,CAAC,CAAC,KAAAV,EAAM,MAAAmC,EAAO,GAAGxM,CAAA,EAAQ,KAAO2H,EAAA,cAAC2vB,GAAA,CAAU,IAAKjtB,GAAQU,EAAM,KAAM,KAAMV,GAAQU,EAAM,KAAM,MAAOyB,GAASzB,EAAM,OAASV,EAAO,GAAGU,EAAQ,GAAG/K,CAAA,CAAM,CAAA,GAErK,YAAa,CAAC+K,EAAQ,MAAQ,CAC1B,QAASA,EACT,YAAcV,IAAU,CAAC,CAACA,CAAI,EAAGU,EAAM,eACvC,OAAQ,CAAC,CAAC,KAAAV,EAAM,MAAAmC,EAAO,GAAGxM,CAAA,EAAQ,KAAO2H,EAAA,cAACggC,GAAA,CAAY,IAAKt9B,GAAQU,EAAM,KAAM,KAAMV,GAAQU,EAAM,KAAM,MAAOyB,GAASzB,EAAM,OAASV,EAAO,GAAGU,EAAQ,GAAG/K,CAAA,CAAM,CAAA,GAEvK,eAAgB,CAAC+K,EAAQ,MAAQ,CAC7B,QAASA,EACT,YAAcV,IAAU,CAAC,CAACA,CAAI,EAAGU,EAAM,eACvC,OAAQ,CAAC,CAAC,KAAAV,EAAM,MAAAmC,EAAO,GAAGxM,CAAA,EAAQ,KAAO2H,EAAA,cAAC0/B,GAAA,CAAe,IAAKh9B,GAAQU,EAAM,KAAM,KAAMV,GAAQU,EAAM,KAAM,MAAOyB,GAASzB,EAAM,OAASV,EAAO,GAAGU,EAAQ,GAAG/K,CAAA,CAAM,CAAA,GAE1K,OAAQ,CAAC+K,EAAQ,MAAQ,CACrB,QAASA,EACT,YAAcV,IAAU,CAAC,CAACA,CAAI,EAAGU,EAAM,eACvC,OAAQ,CAAC,CAAC,KAAAV,EAAM,MAAAmC,EAAO,GAAGxM,CAAA,EAAQ,KAAO2H,EAAA,cAACqzB,GAAA,CAAO,IAAK3wB,GAAQU,EAAM,KAAM,KAAMV,GAAQU,EAAM,KAAM,MAAOyB,GAASzB,EAAM,OAASV,EAAO,GAAGU,EAAQ,GAAG/K,CAAA,CAAM,CAAA,GAElK,SAAU,CAAC+K,EAAQ,MACR,CACH,QAASA,EACT,YAAcV,IAAU,CAAC,CAACA,CAAI,EAAGU,EAAM,eACvC,OAAQ,CAAC,CAAC,KAAAV,EAAM,MAAAmC,EAAO,GAAGxM,GAAQ,CAAA,IAAO2H,EAAA,cAACi0B,GAAA,CAAS,KAAAvxB,EAAY,MAAOmC,GAASnC,EAAO,GAAGU,EAAQ,GAAG/K,CAAA,CAAM,CAAA,GAGlH,KAAM,CAAC+K,EAAQ,MAAQ,CACnB,QAASA,EACT,YAAcV,IAAU,CAAC,CAACA,CAAI,EAAGU,EAAM,eACvC,OAAQ,CAAC,CAAC,KAAAV,EAAM,MAAAmC,EAAO,GAAGxM,GAAQ,CAAA,oBAAQ+1B,GAAA,CAAO,IAAK1rB,EAAM,KAAAA,EAAY,MAAOmC,GAASnC,EAAO,GAAGU,EAAQ,GAAG/K,CAAA,CAAM,CAAA,EAE3H,ECxJMmoC,GAAoC,CAAA,ECCpCC,GAAwC,CAAA,ECsCjC17B,GAAY,CACrB,OAAQ8kB,GACR,MAAO0W,GACP,MAAOC,GACP,QAASC,EACb,EAGO,MAAeC,EAAe,CAKvB,uBAA8B,CACpC,GAAI,CAAC,KAAK,OAAS,OAAO,KAAK,OAAU,SACrC,MAAM,IAAI,MAAM,4CAA4C,EAGhE,UAAWC,IAAU,CAAC,OAAQ,MAAM,EAChC,GAAI,OAAO,KAAKA,CAAM,GAAM,WACxB,MAAM,IAAI,MAAM,qCAAqCA,CAAM,KAAK,CAG5E,CAEA,OAAO,QAAwCpuB,EAAkD,CAC7F,MAAMquB,EAAW,IAAI,KACrB,OAAAA,EAAS,sBAAA,EACF,IAAM,CACT,KAAM,CAACC,EAAQC,CAAQ,EAAI9gC,EAAM,QAAQ,IAC9B+gC,GAAgBH,EAAS,KAAK,EACtC,CAACA,EAAS,KAAK,CAAC,EAGnB,OACI5gC,EAAA,cAACghC,GAAA,CAAK,cAAeF,EAAU,gBAAiBvuB,GAAA,YAAAA,EAAS,eAAA,EACpDquB,EAAS,KAAKC,CAAM,CACzB,CAER,CACJ,CACJ,CAEA,SAASI,GAAerpC,EAA+B,CACnD,OAAO,OAAOA,GAAA,YAAAA,EAAK,SAAW,YAAc,OAAOA,GAAA,YAAAA,EAAK,cAAgB,UAC5E,CAEA,SAASspC,GAAiBtpC,EAA2C,CACjE,OAAO,OAAOA,GAAQ,YAAcA,EAAI,qBAAqB8oC,EACjE,CACA,SAASS,GAAcvpC,EAA6B,CAChD,OACIA,GACA,OAAOA,GAAQ,UACf,CAAC,MAAM,QAAQA,CAAG,GAClB,CAACoI,EAAM,eAAepI,CAAG,GACzB,CAACqpC,GAAerpC,CAAG,CAE3B,CAGO,SAASmpC,GACZK,EACsB,CACtB,MAAMP,EAAmB,CAAA,EACnBC,EAAqB,CAAA,EAE3B,SAASO,EAAYzpC,EAAe,CAChC,SAAW,CAAC2F,EAAG9E,CAAC,IAAK,OAAO,QAAQb,CAAG,EACnCkpC,EAASvjC,CAAC,EAAI9E,CAEtB,CAEA,SAAW,CAACiK,EAAMlK,CAAK,IAAK,OAAO,QAAQ4oC,CAAK,EAC5C,GAAIH,GAAezoC,CAAK,EACpBqoC,EAAOn+B,CAAI,EAAIlK,EAAM,OAAO,CAAC,KAAAkK,EAAK,EAClC2+B,EAAY7oC,EAAM,YAAYkK,CAAI,CAAC,UAC5Bw+B,GAAiB1oC,CAAK,EAAG,CAChC,MAAMooC,EAAW,IAAIpoC,EACf,CAAC8oC,EAAWC,CAAW,EAAIR,GAAgBH,EAAS,KAAK,EAE/DC,EAAOn+B,CAAI,EAAIk+B,EAAS,KAAKU,CAAS,EACtCD,EAAYE,CAAW,CAC3B,SAAW,MAAM,QAAQ/oC,CAAK,EAAG,CAC7B,QAAQ,KACJ,mCAAmCkK,CAAI,4GAC2CA,CAAI,sFAAA,EAG1F,MAAM8+B,EAA6B,CAAA,EAEnChpC,EAAM,QAAQ,CAACsN,EAAM5N,IAAM,CACvB,MAAMupC,EAAU,GAAG/+B,CAAI,IAAIxK,CAAC,GAC5BspC,EAAeC,CAAO,EAAI37B,CAC9B,CAAC,EAED,KAAM,CAACw7B,EAAWC,CAAW,EAAIR,GAAgBS,CAAc,EAC/DH,EAAYE,CAAW,EAEvBV,EAAOn+B,CAAI,EAAI4+B,CACnB,SAAWH,GAAc3oC,CAAK,EAAG,CAC7B,KAAM,CAACkpC,EAAcC,CAAc,EAAIZ,GAAgBvoC,CAAK,EAC5DqoC,EAAOn+B,CAAI,EAAIg/B,EACfL,EAAYM,CAAc,CAC9B,MACId,EAAOn+B,CAAI,EAAIlK,EAIvB,MAAO,CAAEqoC,EAAQC,CAAS,CAC9B,CChHI,MAAMc,GAAkBppC,GACpB,MAAM,QAAQA,CAAK,EACb,CAAC,GAAGA,CAAK,EACRA,GAAS,OAAOA,GAAU,SACvB,CAAE,GAAGA,CAAA,EACL,CAAA,EAGRqpC,GAAgBrpC,GAAkB,CAAC,OAAO,MAAM,OAAOA,CAAK,CAAC,EAE7DspC,GAAsB,CAACC,EAAkBC,IACtC,CAAC,SAAU,OAAO,EAAE,SAASA,CAAS,EACpCD,IAAa,IAAMA,GAAY,KAAO,GAAK,OAAOA,CAAQ,EADZA,EAInDE,GAAmBrM,GACdA,IAAY,QAAaiM,GAAajM,CAAO,EAAI,CAAA,EAAK,CAAA,EAG3DsM,GAAsB,CACxBjmC,EACA8N,EACAi4B,IACc,CACd,MAAMnqC,EAAOkS,EAAM,OAAO,KAAK,MAAM,GAAG,EAClCo4B,EAAYL,GAAoB/3B,EAAM,OAAO,MAAOi4B,CAAS,EAE7DtrB,EAAOkrB,GAAe3lC,GAAU,EAAE,EACxC,IAAImmC,EAAc1rB,EAGlB,QAASxe,EAAI,EAAGA,EAAIL,EAAK,OAAS,EAAGK,IAAK,CACtC,MAAMC,EAAMN,EAAKK,CAAC,EACZ09B,EAAU/9B,EAAKK,EAAI,CAAC,EACpBk3B,EAAegT,EAAOjqC,CAAG,EAE/BiqC,EAAOjqC,CAAG,EACNi3B,GAAgB,MAAQ,OAAOA,GAAiB,SAC1CwS,GAAexS,CAAY,EAC3B6S,GAAgBrM,CAAO,EAEjCwM,EAASA,EAAOjqC,CAAG,CACvB,CAEA,MAAMkqC,EAAWxqC,EAAKA,EAAK,OAAS,CAAC,EACrC,OAAIsqC,GAAa,MAAQA,IAAc,GAC/B,MAAM,QAAQC,CAAM,GAAKP,GAAaQ,CAAQ,EAC9CD,EAAO,OAAO,OAAOC,CAAQ,EAAG,CAAC,EAEjC,OAAOD,EAAOC,CAAQ,EAG1BD,EAAOC,CAAQ,EAAIF,EAGhBzrB,CACX,EAkBM4rB,GAAc9mC,EAAAA,cAAwC,IAAI,EAGvD8uB,GAAiB,CAAC,CAAC,KAAA5nB,EAAM,SAAAqnB,EAAU,UAAAznB,EAAW,UAAA0/B,EAAY,OAAQ,aAAAhY,KAAuD,CAClI,MAAMhU,EAAM7V,EAAAA,WAAWmiC,EAAW,EAClC,GAAI,CAACtsB,EAAK,MAAM,IAAI,MAAM,2DAA2D,EACrF,GAAI,CAACtT,EAAM,MAAM,IAAI,MAAM,kCAAkC,EAE7D,MAAM6/B,EAAa,CAACx4B,EAAsBy4B,IACnBN,GAAoBM,GAAgBxsB,EAAI,OAAQjM,EAAOi4B,CAAS,EA2BnF,MAAO,CACH,MAdUlkC,EAAAA,QAAQ,IAAM,CACxB,MAAMsxB,EAAe1sB,EAAK,MAAM,GAAG,EAAE,OAAO,CAACzK,EAAKE,IAASF,IAAQ,OAAY,OAAYA,EAAIE,CAAG,EAAI6d,EAAI,MAAM,EAG5G,OAAIoZ,IAAiB,QAAapF,IAAiB,OAExCA,GAAgB,GAGxBoF,GAAgB,EAC3B,EAAG,CAAC1sB,EAAMsT,EAAI,OAAQgU,CAAY,CAAC,EAK/B,aAAejgB,GAAU,CACrB,IAAI04B,EAAazsB,EAAI,OACrBA,EAAI,UAAWzP,IACXk8B,EAAaF,EAAWx4B,EAAOxD,CAAI,EAC5Bk8B,EACV,EACD1Y,GAAA,MAAAA,EAAW,CACP,MAAAhgB,EACA,KAAArH,EACA,MAAOqH,EAAM,OAAO,MACpB,OAAQ04B,GAAc,CAAA,EACtB,SAAWC,GAAc,CACrB1sB,EAAI,UAAWzP,GAASg8B,EAAWG,EAAWn8B,CAAI,CAAC,CACvD,CAAA,EAER,EACA,cAAe,CAACjE,EAAW0T,EAAI,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAClE,OAAQA,EAAI,QAAU,CAAA,CAAC,CAE/B,EAQayU,GAAgB,CAAC,CAAE,KAAA/nB,EAAM,MAAAlK,EAAO,aAAA4xB,KAClCpqB,EAAM,YACVqG,GAA+D,CAC9DA,EAAE,eAAA,EAEF,MAAMvO,EAASuO,EAAE,OAEXgH,EAAO,GADDhH,EAAE,aAAa,QAAQ,YAAY,CAC5B,GAEnBvO,EAAO,MAAA,EAGP,MAAM6qC,GAAiB,IAAM,SAC3B,MAAM55B,IACJ7C,EAAA,SAAS,yBAAT,YAAAA,EAAA,cAAkCG,EAAE,QAASA,EAAE,aAC9CsD,EAAA,SAAiB,sBAAjB,YAAAA,EAAA,cAAuCtD,EAAE,QAASA,EAAE,UACvD,OAAO0C,GAAY,WAAYA,EAC3BA,EAAS,OACTjR,EAAO,MAAM,MACnB,GAAA,EAGM8qC,GACHpqC,GAAS,IAAI,MAAM,EAAGmqC,CAAa,EACpCt1B,GACC7U,GAAS,IAAI,MAAMmqC,CAAa,EAInCvY,GAAA,MAAAA,EAAe,CACb,OAAQ,CACN,MAAOwY,EAAS,KAAA,EAChB,KAAAlgC,CAAA,CACF,GAIF,sBAAsB,IAAM,CAC1B,MAAMmgC,EAAcF,EAAgBt1B,EAAK,OACzCvV,EAAO,kBAAkB+qC,EAAaA,CAAW,CACnD,CAAC,CACH,EACA,CAACngC,EAAMlK,EAAO4xB,CAAY,CAAA,EAIhC,SAAS0Y,GAAcpgC,EAAcqgC,EAAoB,CACrD,GAAIrgC,EAAK,QAAQ,GAAG,IAAM,IAAMqgC,EAAW,QAAQ,GAAG,IAAM,GAAI,MAAO,GAAGA,CAAU,IAAIrgC,CAAI,GAE5F,MAAMqhB,EAAM,KAAK,IAAIrhB,EAAK,OAAQqgC,EAAW,MAAM,EACnD,IAAI7qC,EAAI,EAER,KAAOA,EAAI6rB,GAAOrhB,EAAK,WAAWxK,CAAC,IAAM6qC,EAAW,WAAW7qC,CAAC,GAAGA,IAEnE,MAAM8qC,EAAUtgC,EAAK,YAAY,IAAKxK,EAAI,CAAC,EAC3C,OAAI8qC,IAAY,GAAW,GAAGD,CAAU,IAAIrgC,CAAI,GAEzC,GAAGqgC,CAAU,IAAIrgC,EAAK,MAAMsgC,EAAU,CAAC,CAAC,EACnD,CAEO,MAAMC,GAAoB,CAAC,CAAC,SAAArlC,EAAU,WAAAmlC,EAAY,UAAAG,EAAW,UAAA5gC,KACzDtC,EAAM,SAAS,IAAIpC,EAAW4I,GAAU,CAC3C,GAAI,CAACu8B,GAAc,CAAC/iC,EAAM,eAAewG,CAAK,EAAG,OAAOA,EAExD,KAAM,CAAC,KAAA9D,EAAM,SAAUygC,CAAA,EAAiB38B,EAAM,MACxC48B,EAAgC,CAAA,EACtC,OAAI1gC,IACA0gC,EAAS,KAAaN,GAAcpgC,EAAMqgC,CAAU,EACpDK,EAAS,IAAaF,GAAaE,EAAS,KAC5CA,EAAS,UAAa58B,EAAM,MAAM,WAAalE,EAE3CkE,EAAM,MAAM,KAAOxG,EAAM,eAAewG,EAAM,MAAM,GAAG,IACvD48B,EAAS,IAAMH,GAAkB,CAC7B,SAAUz8B,EAAM,MAAM,IACtB,WAAAu8B,EACA,UAAW,GAAGK,EAAS,GAAG,MAAA,CAC7B,GAED58B,EAAM,MAAM,MAAQxG,EAAM,eAAewG,EAAM,MAAM,IAAI,IACzD48B,EAAS,KAAOH,GAAkB,CAC9B,SAAUz8B,EAAM,MAAM,KACtB,WAAAu8B,EACA,UAAW,GAAGK,EAAS,GAAG,OAAA,CAC7B,IAGLD,IACAC,EAAS,SAAaH,GAAkB,CACpC,SAAUE,EACV,WAAAJ,EACA,UAAAG,CAAA,CACH,GAGEljC,EAAM,aAAawG,EAAc48B,CAAQ,CACpD,CAAC,EA8EL,SAASpC,GAAK59B,EAAkB8jB,EAA0B,CACtD,MAAMlN,EAAWC,GAAAA,YAAA,EACX,CAAE,gBAAAopB,EAAiB,cAAAC,EAAe,SAAAC,EAAU,cAAAxP,EAAe,SAAAn2B,EAAU,GAAGvF,GAAS+K,EAEjFogC,EAAkBtxB,GACb,GAAGmxB,GAAmB51B,GAAUuM,EAAS,QAAQ,CAAC,KAAIspB,GAAA,YAAAA,EAAgBpxB,KAAW,KAAK,IAAA,CAAK,GAQhGuxB,GANkBJ,GACpBA,IAAoBrpB,EAAS,KACvB,GAAGvM,GAAUuM,EAAS,QAAQ,CAAC,IAAIA,EAAS,KAAK,MAAM,CAAC,CAAC,GACzD,SAG2BqpB,CAAe,EAC9CK,EAAW,CAAC,CAAC,OAAAxxB,EAAQ,YAAAyxB,KAAgCA,GAAeH,EAAetxB,CAAM,EAE/F,OAAO6hB,GAAiB,CAAC0P,GAAkBF,GAAY,CAACF,EAClDrjC,EAAA,cAAC4jC,GAAA,CAAS,SAAAhmC,EAAoB,cAAAm2B,EAA8B,SAAAwP,EAAoB,SAAAG,EAAoB,gBAAiBD,EAAgB,GAAGprC,EAAM,IAAA6uB,CAAA,CAAU,EACxJlnB,EAAA,cAAC6jC,GAAA,CAAa,SAAAjmC,EAAoB,cAAAm2B,EAA8B,SAAAwP,EAAoB,SAAAG,EAAoB,gBAAiBD,EAAgB,GAAGprC,EAAM,IAAA6uB,EAAU,CACtK,CAEO,MAAM2c,GAAetJ,EAAAA,WAAuC,CAACn3B,EAAO8jB,IAAQ,CAC/E,KAAM,CAAE,gBAAAmc,EAAiB,cAAAtP,EAAe,GAAG17B,GAAS+K,EAC9CqmB,EAAKnN,GAAA,EAEL,CAACpK,EAAQ4xB,CAAS,EAAI3lC,EAAAA,SAAkC,MAAS,EAYvE,OAVAc,EAAAA,UAAU,IAAM,CACZwqB,EAAG,KAAK4Z,CAAe,EAAE,KAAK/yB,GAAQ,CAClCwzB,EAAU,CAAE,GAAG/P,EAAe,GAAGzjB,EAAK,CAC1C,CAAC,EAAE,MAAMnD,GAAS,CACd,QAAQ,MAAMA,CAAK,EACnB22B,EAAU,CAAA,CAAE,CAChB,CAAC,CACL,EAAG,CAACT,CAAe,CAAC,EAGfnxB,kBAIG0xB,GAAA,CAAU,GAAGvrC,EAAM,cAAe6Z,EAAQ,gBAAAmxB,EAAkC,IAAAnc,EAAU,EAHnFlnB,EAAA,cAAC,KAAE,UAAW,KAAA,kBAAQ,OAAA,CAAK,UAAU,kGAAA,CAAmG,EAAE,yBAAuB,CAIhL,CAAC,EAOK4jC,GAAWrJ,EAAAA,WAAsC,CAAC,CACpD,SAAA38B,EACA,OAAAqd,EAAS,OACT,OAAAxS,EAAS,OACT,OAAAC,EAAS,OACT,gBAAA26B,EAAkB,OAClB,SAAAE,EAAW,OACX,cAAAxP,EAAgB,OAChB,SAAA2P,EAAW,OACX,OAAA1a,EAAS,OACT,SAAAe,EAAW,OACX,OAAA/M,EAAS,OACT,SAAAC,EAAW,OACX,UAAA8mB,EAAY,OACZ,IAAAC,EAAM,GACN,WAAAC,EAAa,GACb,SAAAC,EAAW,GACX,UAAA5hC,EAAY,OACZ,YAAA8C,EAAc,OACd,UAAA7E,EAAY,OACZ,YAAA2I,EAAc,MAClB,EAAGge,IAAQ,CACP,MAAM/qB,EAAQ8D,EAAe,EACvBwpB,EAAKnN,GAAA,EAEL,CAACpK,EAAQ4xB,CAAS,EAAI3lC,EAAAA,SAAkC41B,CAAa,EACrEoQ,EAAc,CAACd,EAGrBpkC,EAAAA,UAAU,IAAI,CACN80B,IACA+P,EAAU,CAAC,GAAG/P,EAAc,EAC5B/K,GAAA,MAAAA,EAAS,CAAC,GAAG+K,IAErB,EAAG,CAAC,KAAK,UAAUA,CAAa,CAAC,CAAC,EAElC,MAAMqQ,EAAY33B,EAAAA,OAAOyF,CAAM,EAC/BjT,EAAAA,UAAU,IAAM,CACZmlC,EAAU,QAAUlyB,EAChBA,IAAW,SAAW6X,GAAA,MAAAA,EAAW7X,GACzC,EAAG,CAACA,CAAM,CAAC,EAGX,KAAM,CAACmyB,EAAcC,CAAe,EAAInmC,EAAAA,SAAkC,MAAS,EAC7EomC,EAASxP,EAAAA,YAAY,CAAC,CAAE,QAAAhgB,EAAS,KAAA7S,EAAO,YAA4B,CAClE+hC,GACAK,EAAgB,CAAE,KAAApiC,EAAM,QAAA6S,EAAS,CAEzC,EAAG,CAACkvB,CAAU,CAAC,EAIT3E,EAAavK,cAAY,MAAO1uB,GAA6D,CAC/FA,EAAE,eAAA,EAEF49B,GAAcK,EAAgB,MAAS,EACX,SAAS,iBAAiB,+CAA+C,EAC7E,OAAS,GAC7BL,GAAcK,EAAgB,CAAE,QAASnoC,EAAM,KAAK,KAAK,qBAAsB,KAAM,UAAW,EAGpG,MAAMoqB,EAAS4d,EAAc,SAAW,SAYlCK,GACDxnB,GAAU,MAAMA,EAAO,CACpB,OAAQonB,EAAU,QAClB,WAAYrQ,EACZ,OAAAxN,EACA,YAAa8c,CAAA,CAChB,KACEK,GAAA,YAAAA,EAAW,CACV,OAAQU,EAAU,SAAW,CAAA,EAC7B,YAAaf,CAAA,KAEdA,EAEP,OAAAmB,GAAqB,MAAM/a,EAAG,IAAI+a,EAAmBryB,GAAYiyB,EAAU,OAAO,CAAC,EAC5E,MAAMK,EAAcle,CAAM,CACrC,EAAG,CAAC8c,EAAiBrmB,EAAQ+mB,EAAWE,EAAYP,CAAQ,CAAC,EAEvDgB,EAAe3P,cAAY,MAAO1uB,GAA2C,CAC/EA,EAAE,eAAA,EAEF49B,GAAcK,EAAgB,MAAS,EAEvC,MAAME,EAAoBvnB,EACpB,MAAMA,EAAS,CAAC,OAAQmnB,EAAU,QAAQ,GAC1CV,GAAA,YAAAA,EAAW,CAAC,OAAQU,EAAU,SAAW,CAAA,EAAI,YAAaf,CAAA,KAAqBA,EAErF,OAAAmB,GAAqB,MAAM/a,EAAG,OAAO+a,CAAiB,EAC/C,MAAMC,EAAc,QAAQ,CACvC,EAAG,CAACpB,EAAiBpmB,EAAU8mB,EAAWE,EAAYP,CAAQ,CAAC,EAEzDe,EAAgB1P,cAAY,MAAOxO,IACrCyd,GAAOX,GAAmB3Z,GAAO2Z,EAAiB9c,EAAQ6d,EAAU,OAAO,EAE3EG,EAAO,CAAE,QAAS,UAAUhe,CAAM,kBAAmB,KAAM,UAAW,EAE9D,MAAMwd,GAAA,YAAAA,EAAY,CAAC,OAAQK,EAAU,QAAS,OAAA7d,CAAA,KAAa,IACpE,CAACyd,EAAKX,EAAiBU,EAAWQ,CAAM,CAAC,EAE5C1J,EAAAA,oBAAoB3T,EAAK,KAAO,CAC5B,YAAYqc,GAAA,YAAAA,EAAU,aAAcjE,EACpC,cAAciE,GAAA,YAAAA,EAAU,eAAgBmB,EACxC,WAAWnB,GAAA,YAAAA,EAAU,aAAc,IAAM96B,GACzC,WAAW86B,GAAA,YAAAA,EAAU,aAAc,KAAO,CAAC,OAAQa,EAAU,SAAW,CAAA,EAAI,YAAAD,CAAA,IAC5E,WAAWZ,GAAA,YAAAA,EAAU,aAAc,IAAM76B,EAAA,GACzC,CAAC42B,EAAYoF,EAAcnB,CAAQ,CAAC,EAExC,MAAMnoC,kBAAcknC,GAAY,SAAZ,CAAqB,MAAO,CAAE,OAAApwB,EAAQ,UAAA4xB,EAAW,UAAW,OAAO,EAC9D,OAAOlmC,GAAa,WAAaA,EAAS,CAAC,OAAAsU,EAAO,EAAItU,CAC3D,EAGd+mC,EAAmB7mC,EAAAA,QAAQ,IAAM,CACnC,GAAG,CAACmd,GAAUiM,EAAK,OAAO9rB,EAE1B,OAAQ6f,EAAA,CACJ,IAAK,QACD,OAAO7f,EACX,IAAK,OACL,QACI,OAAO4E,EAAA,cAAC0c,GAAA,CACJ,OAAQjU,GAAUzI,EAAA,cAAC0f,IAAY,IAAMykB,EAAchoC,EAAM,KAAK,KAAK,UAAYA,EAAM,KAAK,KAAK,WAAa,KAAMknC,GAAmBlnC,EAAM,KAAK,KAAK,gBAAiB,EACtK,QAASuM,GAAU,CAACy7B,GAAennB,GAAUC,GAAYinB,IAAalkC,EAAA,cAAAA,EAAA,SAAA,KACjE0I,GACCsU,GAAU,CAACmnB,IAAgBnkC,EAAA,cAACuU,GAAA,CAC1B,UAAWpY,EAAM,KAAK,gBACtB,MAAOA,EAAM,KAAK,KAAK,WACvB,QAASkK,GAAKi5B,EAAWj5B,CAAC,CAAA,CAAA,GAE5B4W,GAAY,CAACknB,IAAgBnkC,EAAA,cAACuU,GAAA,CAC5B,UAAWpY,EAAM,KAAK,kBACtB,MAAOA,EAAM,KAAK,KAAK,aACvB,QAASuoC,CAAA,CAAA,EAEZR,GAAYlkC,EAAA,cAACqV,GAAA,CACV,UAAWlZ,EAAM,KAAK,gBACtB,MAAOA,EAAM,KAAK,KAAK,UAAA,CAAA,CAE/B,EACA,YAAaiJ,GAAejJ,EAAM,KAAK,KAAK,YAC5C,UAAWoE,GAAapE,EAAM,KAAK,KAAK,UACxC,YAAa+M,GAAe/M,EAAM,KAAK,KAAK,WAAA,EAE3Cf,CAAA,CACL,CAEZ,EAAG,CAAC6f,EAAQxS,EAAQC,EAAQsU,EAAQC,EAAUinB,EAAUhyB,EAAQ9W,EAAY8rB,CAAG,CAAC,EAEhF,OACIlnB,EAAA,cAACM,GAAQ,UAAWgC,GAAanG,EAAM,KAAK,WACvCkoC,GACGrkC,EAAA,cAACkhB,GAAA,CAAM,KAAMmjB,EAAa,KAAM,QAAS,IAAIC,EAAgB,MAAS,CAAA,EACjED,EAAa,OAClB,EAEHM,CACL,CAER,CAAC,EAgCD3D,GAAezG,EAAAA,WAAWyG,EAAI,ECvkB5B4D,GAAS,CAAC,CACZ,KAAAliC,EACA,SAAA9E,EAEA,SAAAmsB,EACA,MAAA8a,EACA,SAAAC,EACA,UAAAvkC,EACA,OAAAwkC,EAAS,aACT,IAAAhhB,EAAM,OACN,IAAAD,EAAM,OACN,MAAAjf,EAAQ,OACR,SAAAmgC,EAAW,EACf,IAAmB,OACf,KAAM,CAAE,MAAAxsC,EAAO,aAAA4xB,CAAA,EAAiBE,GAAe,CAAE,KAAA5nB,EAAM,SAAAqnB,EAAU,EAE3Dkb,EAAiB,CAAC1sC,EAAe+J,IAC5B2gC,GAAkB,CACrB,SAAU,OAAOrlC,GAAa,WACxBA,EAAS,CAAE,OAAQpF,GAAA,YAAAA,EAAQD,GAAQ,QAASC,EAAO,MAAAD,CAAA,CAAc,EACjEqF,EACN,WAAY,GAAG8E,CAAI,IAAInK,CAAK,GAC5B,UAAA+J,CAAA,CACH,EAEC4iC,EAAe,CAAC3sC,EAAe4sC,IAAuB,CACxD,OAAQJ,EAAA,CACJ,IAAK,aACL,OAAO/kC,EAAA,cAAAA,EAAA,SAAA,KACFmlC,GAAcnlC,EAAA,cAAC,MAAA,CAAI,UAAU,kCAC1BA,EAAA,cAAC,KAAA,KAAG,IAAEzH,EAAQ,CAAE,EAChByH,EAAA,cAACoV,GAAA,CACG,UAAU,oGACV,KAAK,IACL,QAAS,IAAM0qB,EAAavnC,CAAK,CAAA,CAAA,CAEzC,EACAyH,EAAA,cAAC,MAAA,CAAI,UAAW,QACXilC,EAAe1sC,CAAK,CACzB,EACAyH,EAAA,cAAC,KAAA,CAAG,UAAU,OAAO,CACzB,EACA,IAAK,WACD,OAAOA,EAAA,cAAAA,EAAA,SAAA,IAAE,EACb,IAAK,SACL,OAAOA,EAAA,cAACY,GAAA,CAAI,UAAW,MAAA,EAClBqkC,EAAe1sC,EAAO,KAAK,EAC3B4sC,GACGnlC,EAAA,cAACa,EAAA,CAAI,GAAG,OAAO,UAAU,qCACrBb,EAAA,cAACoV,GAAA,CACG,UAAU,oGACV,KAAK,IACL,QAAS,IAAM0qB,EAAavnC,CAAK,CAAA,CAAA,CAEzC,CAER,CAAA,CAER,EAGM6C,GAAc8K,EAAA,MAAM,QAAQ1N,CAAK,EAAIA,EAAQ,MAAM,KAAK,CAAE,OAAQurB,GAAO,CAAA,EAAK,KAAO,CAAA,EAAG,IAA1E,YAAA7d,EAA8E,IAAI,CAACpN,EAAGP,IAAU,CAChH,MAAM4sC,EAAY,CAACH,GAAYzsC,IAAUwrB,GAAO,GAEhD,OACI/jB,EAAA,cAACA,EAAM,SAAN,CAAe,IAAK,GAAG0C,CAAI,IAAInK,CAAK,EAAA,EAChC2sC,EAAa3sC,EAAO4sC,CAAS,CAClC,CAER,GAEMC,EAAY,IAAM,CACpB,MAAMC,EAAO,MAAM,QAAQ7sC,CAAK,EAC1B,CAAC,GAAGA,EAAO,EAAE,EACb,MAAM,KAAK,CAAE,OAAQ4C,EAAW,OAAS,CAAA,EAAK,KAAO,CAAA,EAAG,EAC9DypC,GAAA,MAAAA,EAAQQ,GACRjb,EAAa,CAAE,OAAQ,CAAE,KAAM,GAAG1nB,CAAI,IAAI2iC,EAAK,OAAS,CAAC,GAAI,MAAO,CAAA,CAAC,EAAK,CAC9E,EAEMvF,EAAgBvnC,GAAkB,CACpCusC,GAAA,MAAAA,EAAWvsC,GACX6xB,EAAa,CAAE,OAAQ,CAAE,KAAM,GAAG1nB,CAAI,IAAInK,CAAK,EAAA,EAAM,CACzD,EAEM+sC,EAAYxnC,EAAAA,QAAQ,IAClBknC,EAAiB,KACjB,CAAClhB,GAAO1oB,EAAW,OAAS0oB,EACrB9jB,EAAA,cAACoV,GAAA,CAAa,UAAU,WAAW,KAAK,OAAO,MAAOvQ,EAAQ,OAAY,MAAO,QAASugC,CAAA,CAAW,EAEzG,KACR,CAACJ,EAAUlhB,EAAK1oB,EAAW,MAAM,CAAC,EAErC,uBACK,MAAA,CAAI,UAAAmF,CAAA,EACAsE,GAAS7E,EAAA,cAAAA,EAAA,SAAA,KAAEA,EAAA,cAAC,MAAG,UAAU,mCAAA,EAAqC6E,EAAOygC,CAAU,kBAAM,KAAA,IAAG,CAAE,EAC1FlqC,EACA,CAACyJ,GAASygC,CACf,CAER,EC/FaC,GAA0E,CACnF,QAAS,CAAC,CAAC,KAAA5/B,EAAM,QAAA1D,CAAA,oCAETjC,EAAA,cAAC,KAAA,CAAG,UAAU,mBAAA,EAAqB2F,CAAK,EACxC3F,EAAA,cAAC,OAAI,UAAU,aAAA,EAAeiC,CAAQ,CAC1C,EAEJ,IAAK,CAAC,CAAC,KAAA0D,EAAM,QAAA1D,CAAA,oCAELjC,EAAA,cAAC,KAAA,CAAG,UAAU,oBAAA,EAAsB2F,CAAK,EACzC3F,EAAA,cAAC,OAAI,UAAU,aAAA,EAAeiC,CAAQ,CAC1C,EAEJ,KAAM,CAAC,CAAC,KAAA0D,EAAM,QAAA1D,KACVjC,EAAA,cAAC,OAAI,UAAU,MAAA,kBACV,KAAA,CAAG,UAAU,+BAA+B2F,CAAK,kBACjD,MAAA,CAAI,UAAU,uBAAA,EAAyB1D,CAAQ,CACpD,EAEJ,MAAO,CAAC,CAAC,KAAA0D,EAAM,QAAA1D,KACXjC,EAAA,cAAC,OAAI,UAAU,MAAA,kBACV,MAAA,CAAI,UAAU,yBAAyBiC,CAAQ,kBAC/C,KAAA,CAAG,UAAU,6BAAA,EAA+B0D,CAAK,CACtD,EAEJ,OAAQ,CAAC,CAAC,KAAAA,EAAM,QAAA1D,qCAERjC,EAAA,cAAC,MAAA,CAAI,UAAU,eAAeiC,CAAQ,EACtCjC,EAAA,cAAC,MAAG,UAAU,eAAA,EAAiB2F,CAAK,CACxC,CAER,EAGa6/B,GAAkC,IAAM,KAE/CC,GAAU,CAAC,CACb,SAAA7nC,EACA,OAAAzC,CACJ,IAGM,SACF,MAAMgB,EAAQ8D,EAAc,EACtBO,EAAQ2H,GAAe,OAAWhN,KAAU+K,EAAA/J,EAAM,IAAI,SAAV,YAAA+J,EAAkB,QAAS,WAAUyD,EAAAxN,EAAM,IAAI,SAAV,YAAAwN,EAAkB,QAAS,QAAQ,EAE1H,OACI3J,EAAA,cAAC,MAAA,CAAI,UAAU,4BAA4B,MAAAQ,GACtC5C,CACL,CAER,EAEM8nC,GAA0B,CAAC,CAC7B,SAAA9nC,EACA,WAAA+nC,EAAa,EACb,YAAAC,EAAc,UACd,IAAA3sC,EAAM,OACN,KAAAE,EAAO,OACP,UAAAmJ,EAAY,OACZ,UAAA/B,EAAY,OACZ,OAAApF,EAAS,MACb,IAAM,SACF,KAAM,CAAC0M,EAAQg+B,CAAS,EAAI1nC,EAAAA,SAASwnC,CAAU,EAEzCG,EAAQC,EAAAA,SAAS,QAAQnoC,CAAQ,EAClC,OAAQ4I,GACLxG,EAAM,eAAewG,CAAK,GAAKA,EAAM,OAASg/B,EAAA,EAGhDQ,EAAYT,GAAWK,CAAW,EAExC,uBACKtlC,EAAA,CAAQ,UAAWgC,GACfrJ,EACD+G,EAAA,cAAC,OAAI,UAAAO,CAAA,EACDP,EAAA,cAACgmC,EAAA,CACG,KAAMF,EAAM,IAAI,CAAChgC,EAAMvN,IACnByH,EAAA,cAAC,KAAA,CAAG,IAAKzH,EAAO,UAAU,eAAA,EACtByH,EAAA,cAAC,SAAA,CACE,QAAS,IAAM6lC,EAAUttC,CAAK,EAC9B,UAAW,YAAYA,IAAUsP,EAAS,SAAW,EAAE,EAAA,EAErD/B,EAAK,MAAM,KAAA,CAEpB,CACH,EACD,QACI9F,EAAA,cAACylC,GAAA,CAAQ,IAAK59B,EAAQ,OAAA1M,IACjBwO,GAAAzD,EAAA4/B,EAAMj+B,CAAM,IAAZ,YAAA3B,EAAe,QAAf,YAAAyD,EAAsB,QAC3B,CAAA,CAAA,CAGZ,EACCxQ,CACL,CAER,ECzFM8sC,GAAW,GACXC,GAAY,GAGZC,GAAQ,CAAC1Z,EAAW1I,EAAaD,IAAgB,KAAK,IAAIC,EAAK,KAAK,IAAID,EAAK2I,CAAC,CAAC,EAG/E2Z,GAAoBtf,GAAgB,CACxC,GAAI,CAACA,EAAK,MAAO,GACjB,MAAM1U,EAAU0U,EAAI,KAAA,EAAO,QAAQ,MAAO,EAAE,EAAE,QAAQ,MAAO,EAAE,EAAE,KAAA,EAC3D9uB,EAAQoa,EAAQ,MAAM,GAAG,EAE/B,OADapa,EAAMA,EAAM,OAAS,CAAC,GACnBoa,GAAS,KAAA,CAC3B,EAGMi0B,GAAe,CAACC,EAAiBC,IAAqB,CAC1D,MAAMC,EAAIF,EAAUC,EAAQ,KACtBE,EAAWF,EAAQ,MAAQN,GACjC,OAAOE,GAAM,KAAK,MAAMK,EAAIC,CAAQ,EAAG,EAAGR,GAAW,CAAC,CACxD,EAGMS,GAAM,IAAM,GAAG,KAAK,KAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,GAEhEC,GAAe,CAACC,EAAoBC,EAAcf,IAAoC,CAC1F,MAAMgB,EAAc1J,GAAkB,CACpC,MAAM2J,EAAM3J,EAAQyJ,EACpB,OAAIE,EAAMd,GAAiB,GAGpB,CAACH,EAAM,KAAMkB,GAAO,CACzB,MAAMC,EAAK7J,EACL8J,EAAKH,EACLI,EAAKH,EAAG,SACRI,EAAKJ,EAAG,SAAWA,EAAG,QAC5B,OAAOC,EAAKG,GAAMD,EAAKD,CACzB,CAAC,CACH,EAEA,QAASnnC,EAAI6mC,EAAY7mC,GAAKkmC,GAAWY,EAAM9mC,IAAK,GAAI+mC,EAAW/mC,CAAC,EAAG,OAAOA,EAC9E,QAASA,EAAI,EAAGA,GAAKkmC,GAAWY,EAAM9mC,IAAK,GAAI+mC,EAAW/mC,CAAC,EAAG,OAAOA,EACrE,OAAO,IACT,EAEMsnC,GAAc,CAACvB,EAAkBwB,EAAgBC,IAAsB,CAC3E,MAAM/nC,EAAUsmC,EAAM,KAAM,GAAM,EAAE,KAAOwB,CAAM,EACjD,GAAI,CAAC9nC,EAAS,OAAOsmC,EAErB,MAAM0B,EAAS1B,EAAM,OAAQ,GAAM,EAAE,KAAOwB,CAAM,EAC5ClK,EAAQ+I,GAAMoB,EAAW,EAAGtB,GAAWzmC,EAAQ,OAAO,EAEtDioC,EAAOd,GAAavJ,EAAO59B,EAAQ,QAASgoC,CAAM,EACxD,OAAIC,IAAS,KAAa3B,EAEnBA,EAAM,IAAK,GAAO,EAAE,KAAOwB,EAAS,CAAE,GAAG,EAAG,SAAUG,CAAA,EAAS,CAAE,CAC1E,EAEMC,GAAkB,CAAC5B,EAAkBwB,EAAgBK,IAAuB,CAChF,MAAMnoC,EAAUsmC,EAAM,KAAM5tC,GAAMA,EAAE,KAAOovC,CAAM,EACjD,GAAI,CAAC9nC,EAAS,OAAOsmC,EAErB,MAAM0B,EAAS1B,EAAM,OAAQ5tC,GAAMA,EAAE,KAAOovC,CAAM,EAC5CM,EAAmB3B,GAAWzmC,EAAQ,SAC5C,IAAIqnC,EAAOV,GAAMwB,EAAY,EAAGC,CAAgB,EAEhD,MAAMC,EAAYC,GAAoB,CACpC,MAAMb,EAAKznC,EAAQ,SACb0nC,EAAK1nC,EAAQ,SAAWsoC,EAC9B,OAAON,EAAO,KAAMR,GAAO,CACzB,MAAMG,EAAKH,EAAG,SACRI,EAAKJ,EAAG,SAAWA,EAAG,QAC5B,OAAOC,EAAKG,GAAMD,EAAKD,CACzB,CAAC,CACH,EAEA,KAAOL,EAAO,GAAKgB,EAAShB,CAAI,GAAGA,IACnC,OAAIgB,EAAShB,CAAI,EAAUf,EAEpBA,EAAM,IAAK5tC,GAAOA,EAAE,KAAOovC,EAAS,CAAE,GAAGpvC,EAAG,QAAS2uC,CAAA,EAAS3uC,CAAE,CACzE,EAUM6vC,GAA6B,CACjCjC,EACAkC,EACAC,IACuD,CACvD,GAAIA,GAAY,EAAG,OAAO,KAE1B,MAAMC,EAAapC,EAChB,IAAKkB,GAAO,CACX,MAAMmB,EAASnB,EAAG,SAAWA,EAAG,QAAU,EACpCoB,EAAO,KAAK,IAAID,GAAUH,EAAU,GAAI,EAC9C,MAAO,CAAE,GAAAhB,EAAI,KAAAoB,CAAA,CACf,CAAC,EACA,KAAK,CAACn3B,EAAGC,IAAMD,EAAE,KAAOC,EAAE,IAAI,EAC9B,IAAKs1B,GAAMA,EAAE,EAAE,EAElB,UAAWQ,KAAMkB,EAAY,CAE3B,GADkBlB,EAAG,QAAU,EACfiB,EAAU,SAE1B,MAAMI,EAAUrB,EAAG,QAAUiB,EACvBK,EAAYtB,EAAG,SAAWqB,EAGhC,GAAIC,EAAY,GAAKA,EAAYL,EAAWhC,GAAU,SAGtD,MAAO,CAAE,UADSH,EAAM,IAAKU,GAAOA,EAAE,KAAOQ,EAAG,GAAK,CAAE,GAAGR,EAAG,QAAS6B,CAAA,EAAY7B,CAAE,EAChE,UAAA8B,CAAA,CACtB,CAEA,OAAO,IACT,EAEaC,GAAgBhO,EAAAA,WAC3B,CAAC,CAAE,KAAA73B,EAAM,YAAA8lC,EAAc,EAAG,SAAAC,EAAW,GAAA,EAAOvhB,IAAQ,CAClD,MAAMwhB,EAASj8B,EAAAA,OAA8B,IAAI,EAE3C,CAAE,MAAAjU,EAAO,aAAA4xB,GAAiBE,GAAe,CAAE,KAAA5nB,EAAM,aAAc,CAAA,EAAI,EACnEojC,EAAmB,MAAM,QAAQttC,CAAK,EAAIA,EAAQ,CAAA,EAElDmwC,EAAYC,GAA0D,CAE1E,MAAMvD,EAAO,OAAOuD,GAAY,WAAcA,EADjC9C,CACqD,EAAI8C,EACtExe,EAAa,CAAE,OAAQ,CAAE,KAAA1nB,EAAM,MAAO2iC,CAAA,EAAQ,CAChD,EAGM,CAACwD,EAAYC,CAAa,EAAI3qC,EAAAA,SAAwB,IAAI,EAG1D,CAACy9B,EAAUC,CAAW,EAAI19B,EAAAA,SAItB,IAAI,EAGR,CAAComC,EAAQwE,CAAS,EAAI5qC,EAAAA,SAAiB,EAAE,EACzC6qC,EAAiBv8B,EAAAA,OAAsB,IAAI,EAC3Cw3B,EAAcgF,GAAgB,CAClCF,EAAUE,CAAG,EACTD,EAAe,SAAS,OAAO,aAAaA,EAAe,OAAO,EACtEA,EAAe,QAAU,OAAO,WAAW,IAAMD,EAAU,EAAE,EAAG,IAAI,CACtE,EAEA9pC,EAAAA,UAAU,IACD,IAAM,CACP+pC,EAAe,SAAS,OAAO,aAAaA,EAAe,OAAO,CACxE,EACC,CAAA,CAAE,EAGLnO,EAAAA,oBAAoB3T,EAAK,KAAO,CAC9B,SAAU,IAAM4e,EAChB,SAAWoD,GAAaP,EAASO,CAAQ,EACzC,MAAO,IAAMP,EAAS,CAAA,CAAE,CAAA,EACxB,EAGF,MAAMQ,EAAYrrC,EAAAA,QAAQ,IAAM,MAAM,KAAK,CAAE,OAAQmoC,EAAA,EAAY,CAACntC,EAAGZ,IAAMA,CAAC,EAAG,CAAA,CAAE,EAG3EkxC,EAAqB/iC,GAAuB,CAChDA,EAAE,eAAA,CACJ,EAGMgjC,EAAmBhjC,GAAuB,CAI9C,GAHAA,EAAE,eAAA,EAEiBA,EAAE,aAAa,QAAQ,sCAAsC,EAChE,CACdyiC,EAAc,IAAI,EAClB,MACF,CAGA,GAAIhD,EAAM,QAAUI,GAAW,CAC7BjC,EAAW,6EAA6E,EACxF,MACF,CAEA,MAAMqF,EAAQZ,EAAO,QACrB,GAAI,CAACY,EAAO,OAEZ,MAAM/C,EAAU+C,EAAM,sBAAA,EAChBtB,EAAU3B,GAAahgC,EAAE,QAASkgC,CAAO,EAGzCzf,EAAMzgB,EAAE,aAAa,QAAQ,YAAY,GAAKA,EAAE,aAAa,QAAQ,OAAO,GAAK,GACjFkjC,EAAYnD,GAAiBtf,CAAG,GAAK,UAErC+f,EAAOV,GAAMqC,EAAa,EAAGvC,EAAQ,EACrCuD,EAAerD,GAAM6B,EAAS,EAAG/B,GAAWY,CAAI,EAGhDY,EAAOd,GAAa6C,EAAc3C,EAAMf,CAAK,EACnD,GAAI2B,IAAS,KAAM,CACjBkB,EAAUpiC,GAAS,CAAC,GAAGA,EAAM,CAAE,GAAImgC,KAAO,UAAA6C,EAAW,SAAU9B,EAAM,QAASZ,CAAA,CAAM,CAAC,EACrF,MACF,CAIA,GAAI,CADSkB,GAA2BjC,EAAOkC,EAASnB,CAAI,EACjD,CAET5C,EAAW,0FAA0F,EACrG,MACF,CAEA0E,EAAUpiC,GAAS,CAEjB,GAAIA,EAAK,QAAU2/B,GACjB,OAAAjC,EAAW,6EAA6E,EACjF19B,EAGT,MAAMkjC,EAAW1B,GAA2BxhC,EAAMyhC,EAASnB,CAAI,EAC/D,GAAI,CAAC4C,EACH,OAAAxF,EAAW,0FAA0F,EAC9F19B,EAGT,MAAMmjC,EAAmB,CACvB,GAAIhD,GAAA,EACJ,UAAA6C,EACA,SAAUE,EAAS,UACnB,QAAS5C,CAAA,EAEX,MAAO,CAAC,GAAG4C,EAAS,UAAWC,CAAO,CACxC,CAAC,CACH,EAGMC,EAAuBtlC,GAAgBgC,GAAuB,CAClEyiC,EAAczkC,CAAE,EAChBgC,EAAE,aAAa,QAAQ,uCAAwChC,CAAE,EACjEgC,EAAE,aAAa,cAAgB,MACjC,EAGMujC,EAAqBvjC,GAAuB,CAEhD,GADAA,EAAE,eAAA,EACE,CAACwiC,EAAY,OAEjB,MAAMS,EAAQZ,EAAO,QACrB,GAAI,CAACY,EAAO,OACZ,MAAMpP,EAAOoP,EAAM,sBAAA,EACbO,EAAMxD,GAAahgC,EAAE,QAAS6zB,CAAI,EAExCyO,EAAUpiC,GAAS8gC,GAAY9gC,EAAMsiC,EAAYgB,CAAG,CAAC,CACvD,EAGMC,EAAmB,IAAMhB,EAAc,IAAI,EAG3CiB,EAAyB1lC,GAAgBgC,GAAwB,CACrEA,EAAE,gBAAA,EACFA,EAAE,eAAA,EAEF,MAAM2gC,EAAKlB,EAAM,KAAMU,GAAMA,EAAE,KAAOniC,CAAE,EACnC2iC,GAELnL,EAAY,CACV,GAAAx3B,EACA,aAAcgC,EAAE,QAChB,UAAW2gC,EAAG,OAAA,CACf,CACH,EAGM9J,EAAmB72B,GAAwB,CAC/C,GAAI,CAACu1B,EAAU,OACf,MAAM0N,EAAQZ,EAAO,QACrB,GAAI,CAACY,EAAO,OAGZ,MAAM7C,EADO6C,EAAM,sBAAA,EACG,MAAQrD,GAExB+D,EAAS3jC,EAAE,QAAUu1B,EAAS,aAC9BqO,EAAY,KAAK,MAAMD,EAASvD,CAAQ,EAExCkB,EAAa/L,EAAS,UAAYqO,EACxCtB,EAAUpiC,GAASmhC,GAAgBnhC,EAAMq1B,EAAS,GAAI+L,CAAU,CAAC,CACnE,EAGMrK,EAAgB,IAAM,CACtB1B,KAAsB,IAAI,CAChC,EAGMnM,EAAcprB,GAAeskC,EAAUpiC,GAASA,EAAK,OAAQrO,GAAMA,EAAE,KAAOmM,CAAE,CAAC,EAErF,OACErE,EAAA,cAAC,OAAI,YAAak9B,EAAiB,UAAWI,EAAe,aAAcA,GAExEiH,GACCvkC,EAAA,cAAC,MAAA,CACC,MAAO,CACL,aAAc,EACd,QAAS,WACT,aAAc,GACd,OAAQ,mCACR,WAAY,yBACZ,SAAU,GACV,QAAS,GAAA,CACX,EAECukC,CAAA,EAKLvkC,EAAA,cAAC,MAAA,CACC,IAAK0oC,EACL,WAAariC,GAAM,CAEjB+iC,EAAkB/iC,CAAC,EACnBujC,EAAkBvjC,CAAC,CACrB,EACA,OAAQgjC,EACR,UAAWS,EACX,MAAO,CACL,SAAU,WACV,OAAQrB,EACR,aAAc,GACd,OAAQ,uCACR,WAAY,mBACZ,SAAU,QAAA,CACZ,EAGCU,EAAU,IAAKjxC,GACd8H,EAAA,cAAC,MAAA,CACC,IAAK9H,EACL,MAAO,CACL,SAAU,WACV,IAAK,EACL,OAAQ,EACR,KAAM,GAAIA,EAAI+tC,GAAY,GAAG,IAC7B,MAAO,EACP,WAAY,4BACZ,cAAe,MAAA,CACjB,CAAA,CAEH,EAGAH,EAAM,IAAKkB,GACVhnC,EAAA,cAAC,MAAA,CACC,IAAKgnC,EAAG,GACR,UAAS,GACT,YAAa2C,EAAoB3C,EAAG,EAAE,EACtC,MAAO,CACL,SAAU,WACV,IAAK,GACL,OAAQ,GACR,KAAM,GAAIA,EAAG,SAAWf,GAAY,GAAG,IACvC,MAAO,GAAIe,EAAG,QAAUf,GAAY,GAAG,IACvC,QAAS,GACT,aAAc,GACd,OAAQ,sCACR,UAAW,6BACX,OAAQ4C,IAAe7B,EAAG,GAAK,WAAa,OAC5C,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,WAAY,MAAA,EAEd,MAAM,uBAAA,EAGNhnC,EAAA,cAAC,MAAA,CAAI,MAAO,CAAE,SAAU,GAAI,WAAY,IAAK,QAAS,EAAA,CAAI,EAAIgnC,EAAG,SAAU,EAG3EhnC,EAAA,cAAC,SAAA,CACC,KAAK,SACL,QAAS,IAAMyvB,EAAWuX,EAAG,EAAE,EAC/B,MAAO,CACL,SAAU,WACV,OAAQ,OACR,IAAK,EACL,MAAO,EACP,MAAO,QACP,WAAY,4BACZ,SAAU,GACV,OAAQ,SAAA,EAEV,MAAM,SAAA,EACP,GAAA,EAKDhnC,EAAA,cAAC,MAAA,CACC,YAAa+pC,EAAsB/C,EAAG,EAAE,EACxC,MAAO,CACL,SAAU,WACV,MAAO,EACP,IAAK,MACL,UAAW,mBACX,MAAO,GACP,OAAQ,GACR,aAAc,EACd,WAAY,4BACZ,OAAQ,WAAA,EAEV,MAAM,6BAAA,CAAA,CACR,CAEH,EAGAlB,EAAM,SAAW,GAChB9lC,EAAA,cAAC,MAAA,CACC,MAAO,CACL,SAAU,WACV,MAAO,EACP,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,cAAe,MAAA,CACjB,EACD,iCAAA,CAED,CAGN,CAEJ,CACF,EC5bakqC,GAAsC,CAAC,CAClD,KAAAxnC,EACA,aAAAynC,EACA,aAAAC,EAAgB,OAChB,MAAAvlC,EAAgB,OAChB,KAAA6F,EAAgB,SAChB,UAAA/Q,EAAgB,OAChB,cAAA0wC,EAAgB,GAChB,kBAAAC,EAAoB,GACpB,IAAArxC,EAAgB,OAChB,KAAAE,EAAgB,OAChB,UAAAmJ,EAAgB,OAChB,UAAA/B,EAAgB,MAClB,IAAM,CACJ,KAAM,CAAC4M,EAAOo9B,CAAQ,EAAIpsC,EAAAA,SAAwB,IAAI,EAEhDqsC,EAAgB,CAAC,CAACryC,EAAKK,CAAK,IAA2B,CAC3D,GAAI,EAAC,GAAI,KAAM,MAAS,EAAE,SAASL,CAAG,GAClCK,IAAU,QACV,EAAA8xC,GAAqB,CAAC,GAAI,IAAI,EAAE,SAAS9xC,CAAK,GAElD,OADI6xC,IAAelyC,EAAM8B,GAAa9B,CAAG,GACrCiyC,EAAqBA,EAAa,CAACjyC,EAAKK,CAAK,CAAC,EAC3C,CAACL,EAAI,KAAA,EAAQka,GAAc7Z,CAAK,CAAC,CAC1C,EAEMiyC,EAAc9M,GAAsB,CACnCA,GAEL+M,GAAK,MAAM/M,EAAM,CACf,OAAQ,GACR,eAAgB,GAChB,UAAAhkC,EACA,cAAe,GACf,SAAWgxC,GAAuC,OAChDJ,EAAS,IAAI,EACbJ,EAAa,CACX,KAAMQ,EAAQ,KAAK,OACjB,OAAO,YACL,OAAO,QAAQ7kC,CAAI,EAAE,OAA8B,CAAC7N,EAAK,CAACsF,EAAG9E,CAAC,IAAM,CAClE,MAAMmyC,EAAiBJ,EAAc,CAACjtC,EAAG9E,CAAC,CAAC,EAC3C,OAAImyC,GAAgB3yC,EAAI,KAAK2yC,CAAc,EACpC3yC,CACT,EAAG,CAAA,CAAE,CAAA,CACP,EAEF,UAASiO,EAAAykC,EAAQ,OAAR,YAAAzkC,EAAc,SAAU,CAAA,GAAI,OAAiB,CAACjO,EAAK0uB,KACrDA,GACL1uB,EAAI,KAAKoyC,EAAgBpwC,GAAa0sB,CAAK,EAAIA,CAAK,EAC7C1uB,GACN,CAAA,CAAE,EACL,KAAA0lC,CAAA,CACD,CACH,EACA,MAAQrwB,GAAa,CACnBi9B,EAASj9B,EAAI,OAAO,CACtB,CAAA,CACD,CACH,EAEMu9B,EAAoB9gC,GAAyC,OACjE,MAAM4zB,IAAOz3B,EAAA6D,EAAM,OAAO,QAAb,YAAA7D,EAAqB,KAAM,KACxCy3B,GAAQ8M,EAAW9M,CAAI,CACzB,EAGMmN,EAAkB/gC,GAAqC,CAC3DA,EAAM,eAAA,EACNA,EAAM,gBAAA,CACR,EAEMygB,EAAczgB,GAAqC,OACvDA,EAAM,eAAA,EACNA,EAAM,gBAAA,EACN,MAAM4zB,IAAOz3B,EAAA6D,EAAM,aAAa,QAAnB,YAAA7D,EAA2B,KAAM,KAC9CukC,EAAW9M,CAAI,CACjB,EAEMoN,EAAmBhhC,GAAqC,CAC5DA,EAAM,eAAA,EACNA,EAAM,gBAAA,CACR,EAEA,OACE/J,EAAA,cAACM,EAAA,CAAQ,UAAWgC,CAAA,EACjBrJ,EACD+G,EAAA,cAAC,MAAA,CACC,YAAW0C,EACX,UAAWnB,EAAG,mBAAoBhB,CAAS,EAC3C,WAAYuqC,EACZ,OAAQtgB,EACR,YAAaugB,CAAA,EAEb/qC,EAAA,cAAC,QAAA,CACC,KAAK,OACL,SAAU6qC,EACV,OAAO,+BAAA,CAAA,kBAERnmC,EAAA,CAAK,KAAMgG,EAAM,MAAO7F,GAAS,yBAAA,CAA2B,CAAA,EAG9DsI,GAASnN,EAAA,cAAC,IAAA,CAAE,MAAO,CAAE,MAAO,KAAA,CAAM,EAAG,WAASmN,CAAM,EACpDhU,CACH,CAEJ,EC3GM6xC,GAAmB9oC,GACrB,OAAOA,GAAS,UAAYA,IAAS,MAAQA,EAAK,WAAa,OAAO,IAAI,mBAAmB,EAwB3F+oC,GAAyB,CAAC,CACI,SAAArtC,EACA,OAAAsU,EACA,aAAAkY,EACA,WAAA2Y,EAAa,OACb,gBAAAM,EAAkB,OAClB,QAAA6H,EAAU,OACV,UAAA5oC,EAAY,MAChB,IACrBtC,EAAM,SAAS,IAAIpC,EAAW4I,GAAU,CAG3C,GAFA,QAAQ,IAAI,cAAeA,CAAK,EAE5B,CAACxG,EAAM,eAAewG,CAAK,EAAG,OAAOA,EAEzC,KAAM,CAAC,KAAAtE,EAAM,MAAAkB,CAAA,EAASoD,EAChB9D,EAAOU,EAAM,KACb2mB,EAAWK,IAAkBrgB,GAAyB,OACxD,QAAQ,IAAI,WAAYg5B,EAAYrgC,EAAMqH,EAAOmI,CAAM,GACvDhM,EAAA9C,EAAM,WAAN,MAAA8C,EAAA,KAAA9C,EAAiB2G,GACjBqgB,GAAA,MAAAA,EAAergB,EACnB,GAEA,GAAK7H,GAAA,MAAAA,EAAc,OACf,eAAQ,IAAI,UAAWsE,EAAO0L,EAAQ6wB,EAAYrgC,GAAOA,EAAOwP,GAAA,YAAAA,EAASxP,GAAQwP,IAAW9O,EAAM,OAAS,MAAS,EAE7GpD,EAAM,aAAawG,EAAc,CACpC,UAAW,GAAGlE,CAAS,GAAGc,EAAM,UAAY,IAAMA,EAAM,UAAY,EAAE,GACtE,KAAM2/B,EAAa,GAAGA,CAAU,IAAIrgC,CAAI,GAAKA,EAC7C,OAAOwP,GAAA,YAAAA,EAASxP,KAASwP,GAAU9O,EAAM,OAAS,OAClD,gBAAiBA,EAAM,iBAAmBigC,GAAmB,OAC7D,SAAAtZ,EACA,GAAIihB,GAAgB9oC,CAAI,EAAI,CAAC,IAAKgpC,CAAA,EAAW,CAAA,CAAC,CACjD,EAGL,GAAI9nC,EAAM,SACN,OAAOpD,EAAM,aAAawG,EAAc,CACpC,SAAUykC,GAAuB,CAC7B,SAAU7nC,EAAM,SAChB,OAAA8O,EACA,aAAAkY,EACA,WAAA2Y,EACA,gBAAAM,EACA,QAAA6H,EACA,UAAA5oC,CAAA,CACH,CAAA,CACJ,EAGL,MAAM9J,EAAQyZ,GAAeC,EAAQxP,CAAI,EACzC,OAAIA,GAAQlK,IAAU,QAClB,QAAQ,KAAK,iBAAiBkK,CAAI,iCAAkC8D,CAAK,EAE1E9D,GACC,QAAQ,IAAI,gBAAiB8D,EAAOu8B,EAAYrgC,EAAMwP,EAAQA,GAAA,YAAAA,EAASxP,EAAK,EAEzE1C,EAAM,aAAawG,EAAcpD,EAAM,UAAYV,EACpD,CACE,UAAW,GAAGJ,CAAS,GAAGc,EAAM,UAAY,IAAMA,EAAM,UAAY,EAAE,GACtE,KAAM2/B,EAAa,GAAGA,CAAU,IAAIrgC,CAAI,GAAKA,EAC7C,MAAOlK,GAAS4K,EAAM,OAAS,OAC/B,SAAA2mB,CAAA,EAEF,CACE,UAAW,GAAGznB,CAAS,GAAGc,EAAM,UAAY,IAAMA,EAAM,UAAY,EAAE,EAAA,CACzE,CACT,CAAC,EAGC+nC,GAAe,CAAC,CACS,WAAA/vC,EACA,OAAA8W,EACA,aAAAkY,EACA,WAAA2Y,EAAa,OACb,gBAAAM,EAAkB,OAClB,QAAA6H,EAAU,OACV,UAAA5oC,EAAY,MAC3C,IAA0B,CACtB,MAAM1E,EAAW,MAAM,QAAQxC,CAAU,EAAIA,EAAa,CAACA,CAAU,EAErE,OACI4E,EAAA,cAAAA,EAAA,SAAA,KACKirC,GAAuB,CAAC,SAAArtC,EAAU,OAAAsU,EAAQ,aAAAkY,EAAc,WAAA2Y,EAAY,gBAAAM,EAAiB,QAAA6H,EAAS,UAAA5oC,CAAA,CAAU,CAC7G,CAER,EAEO,SAAS8oC,GACZhwC,EACAiwC,EACG,CACH,MAAMztC,EAAW,MAAM,QAAQxC,CAAU,EAAIA,EAAa,CAACA,CAAU,EAC/DZ,EAAc,CAAA,EAEd8wC,EAAoBC,GAA2B,CACjDvrC,EAAM,SAAS,QAAQurC,EAAQ/kC,GAAU,CACrC,GAAI,CAACxG,EAAM,eAAewG,CAAK,EAAG,OAElC,KAAM,CAAC,MAAApD,GAASoD,EACZpD,EAAM,KACN5I,EAAO,KAAK6wC,EAAUjoC,CAAK,CAAC,EACrBA,EAAM,UACbkoC,EAAiBloC,EAAM,QAAQ,CAEvC,CAAC,CACL,EAEA,OAAAkoC,EAAiB1tC,CAAQ,EAClBpD,CACX,CC9HA,MAAMgxC,GAAqBC,GAChBA,EACF,QAAQ,uBAAwB,EAAE,EAClC,QAAQ,oBAAqB;AAAA,CAAM,EACnC,KAAA,EAIHC,GAAqB,CAAC54B,EAAwB64B,IAC5CA,IAAa,WACT,YAAa74B,GAAY,MAAM,QAAQA,EAAS,OAAO,GACvD,QAAQ,IAAIA,CAAQ,EACFA,EAAS,QAAQ,IAAI84B,GAAW,CAC9C,MAAMC,EAAOD,EAAQ,YAAY,IAAIp9B,GAAO,OAAOA,CAAG,EAAE,EAAE,KAAK;AAAA,CAAI,EACnE,MAAO,YAAYo9B,EAAQ,QAAQ;AAAA,EAAKC,CAAI,EAChD,CAAC,EAAE,KAAK;AAAA;AAAA,CAAM,EACG,MAAM;AAAA,CAAI,EAAE,IAAI,CAACC,EAAM5zC,IAAM8H,EAAA,cAAC,MAAA,CAAI,IAAK9H,CAAA,EAAI4zC,CAAK,CAAM,GAChE,UAAWh5B,EACXA,EAAS,MACT,gBAAiBA,EACjBA,EAAS,YAEb,kBAEY,OAAO,OAAOA,CAAQ,EAAE,KAAKta,GAAS,OAAOA,GAAU,QAAQ,GACjD,kBAInCuzC,GAAc,CAAC,CACjB,KAAArpC,EACA,YAAAspC,EACA,gBAAA5a,EACA,aAAA6a,EACA,SAAAruC,EACA,SAAAmsB,EAAsB,IAAM,CAAE,EAC9B,SAAA4hB,EAAsB,OACtB,UAAAO,EAAsB,GACtB,QAAAC,EAAsB,OACtB,IAAAlzC,EAAsB,OACtB,KAAAE,EAAsB,OACtB,UAAAmJ,EAAsB,OACtB,UAAA/B,EAAsB,MAC1B,IAAwB,CAEpB,KAAM,CAAC8wB,EAAW+a,CAAY,EAAIjuC,EAAAA,SAAiB8tC,GAAgB,EAAE,EAC/D,CAACI,EAAaC,CAAc,EAAInuC,EAAAA,SAAyB,CAAA,CAAE,EAC3D,CAACouC,EAAkBC,CAAmB,EAAIruC,EAAAA,SAAiB,EAAE,EAC7D,CAAC0uB,EAAW4f,CAAY,EAAItuC,EAAAA,SAAkB,EAAK,EACnD,CAACgP,EAAOo9B,CAAQ,EAAIpsC,EAAAA,SAAwB,IAAI,EAEhDuuC,EAAQ9Z,GAAA,EAEd3zB,EAAAA,UAAU,IAAM,CACRgtC,GAAgBC,GAChBS,EAAA,CAER,EAAG,CAACV,EAAcC,CAAS,CAAC,EAE5B,MAAMS,EAAc,SAAY,CAC5BL,EAAe,CAAA,CAAE,EACjBE,EAAoB,EAAE,EACtBC,EAAa,EAAI,EACjBlC,EAAS,IAAI,EACb4B,GAAA,MAAAA,IAEA,GAAI,CACA,MAAMS,EAAc1b,GAAU8a,EAAY,OAAQ5a,EAAiBC,CAAS,EACtEve,EAAW,MAAM45B,EAAME,EAAa,CACtC,MAAO,UACP,YAAa,EAAA,CAChB,EAED,GAAI,CAAC95B,EACD,MAAM,IAAI,MAAM,wBAAwB,EAG5C+5B,EAAkB/5B,CAAQ,CAE9B,OAASxF,EAAK,CACVi9B,EAAS,+CAA+C,EACxD,QAAQ,MAAM,YAAaj9B,CAAG,CAClC,QAAA,CACIm/B,EAAa,EAAK,CACtB,CACJ,EAGMI,EAAqB/5B,GAAkB,CACzC,IAAIg6B,EAAqB,CAAA,EAGzB,GAAI,CAAC,MAAM,QAAQh6B,CAAQ,GAAK,OAAOA,GAAa,SAChD,GAAIA,EAAS,OACTg6B,EAAc,MAAM,QAAQh6B,EAAS,MAAM,EAAIA,EAAS,OAAS,CAACA,EAAS,MAAM,MAC9E,CACH05B,EAAoB15B,CAAQ,EAC5BiX,EAASjX,CAAQ,EACjB25B,EAAa,EAAK,EAClB,MACJ,MAGAK,EAAc,MAAM,QAAQh6B,CAAQ,EAAIA,EAAW,CAACA,CAAQ,EAGhEw5B,EAAeQ,CAAW,CAC9B,EAGMC,EAAyB,CAAC1mC,EAAqB9N,IAAmB,CACpE,MAAMkzC,EAAeplC,EAAE,cAAc,aAAe,GAC9C2mC,EAAcxB,GAAkBC,CAAY,EAClD,IAAIwB,EAA+BxB,EACnC,GAAIlzC,IAAU,OAAW,CACrB,MAAMua,EAAWu5B,EAAY9zC,CAAK,EAClC00C,EAAkB,YAAan6B,EAAWA,EAAS,QAAU24B,CACjE,CACAe,EAAoBQ,CAAW,EAC/BjjB,EAASkjB,CAAe,CAC5B,EAEA,OACIjtC,EAAA,cAACM,EAAA,CAAQ,UAAWgC,CAAA,EACfrJ,EACD+G,EAAA,cAAC0c,GAAA,CACG,MAAOha,EACP,UAAW,QAAQnC,CAAS,GAC5B,OACIP,EAAA,cAAC,MAAA,CAAI,UAAU,qCAAA,EACV6sB,GAAa7sB,EAAA,cAACuc,GAAA,KAAO,aAAW,EAChCpP,GAASnN,EAAA,cAAC,OAAA,CAAK,UAAU,aAAA,EAAemN,CAAM,GAC7Co/B,GAAoBF,EAAY,OAAS,GAAKl/B,IAAUnN,EAAA,cAACoV,GAAA,CAAa,KAAK,kBAAkB,QAASu3B,EAAa,CACzH,CAAA,GAIF,CAACT,GAAa,CAACD,IAAiB,CAACM,GAAoB,CAACp/B,GAASnN,EAAA,cAAC8rB,GAAA,CAC9D,KAAK,YACL,MAAOkgB,EAAY,MACnB,MAAOC,GAAgB5a,EACvB,SAAU,CAAC,CAAC,MAAA74B,KAAW4zC,EAAa5zC,CAAK,EACzC,KAAMwH,EAAA,cAACuU,GAAA,CACH,KAAK,QACL,QAASo4B,EACT,SAAU,CAAAtb,CAAoB,CAAA,EAElC,UAAU,MAAA,CAAA,GAGbgb,GAAA,YAAAA,EAAa,QAAS,GAAK,CAACE,GAAoB,CAACp/B,IAC9Cw+B,IAAa,2BACR5rB,GAAA,KACIssB,EAAY,IAAI,CAACv5B,EAAUva,IAAU,CAClC,MAAM20C,EAAQxB,GAAmB54B,EAAU64B,CAAQ,EAEnD,OACI3rC,EAAA,cAAAA,EAAA,SAAA,KAAE,WACWzH,EAAQ,EACjByH,EAAA,cAACgsB,GAAA,CACG,IAAKzzB,EACL,aAAYA,EACZ,UAAU,wBACV,QAAUwR,GAAUgjC,EAAuBhjC,EAAOxR,CAAK,CAAA,EAEtD,MAAM,QAAQ20C,CAAK,EACdA,EAAM,IAAI,CAACpB,EAAM5zC,IAAO4zC,CAAK,EAC7B,CAAC,CAAE,MAAAoB,EAAO,CAAA,CAGxB,CAER,CAAC,CACL,EAEAltC,EAAA,cAACgsB,GAAA,CAAU,QAAS+gB,CAAA,EACfV,EAAY,IAAI,CAACv5B,EAAUva,IAAUmzC,GAAmB54B,EAAU64B,CAAQ,CAAC,CAChF,GAGPY,GAAoB,CAACp/B,GAClBnN,EAAA,cAACmrC,GAAA,CACG,WAAYvtC,EACZ,OAAQ,CAAE,CAAC8E,CAAI,EAAG6pC,CAAA,CAAiB,CAAA,CACvC,EAGPpzC,CACL,CAER,ECtNA,SAASg0C,GAA8C,CACnD,KAAAt1C,EACA,MAAA6uB,EACA,MAAAU,EACA,SAAA2B,EACA,OAAAC,CACJ,EAAyB,CACrB,MAAMS,EAAKnN,GAAA,EACL,CAAC6M,EAASL,CAAU,EAAI3qB,EAAAA,SAAsB,CAAA,CAAE,EAChDoU,EAAUzU,EAAAA,QAAqC,IAAM,CACvD,GAAI,GAAC4oB,GAAS,CAACU,GAAS,CAAC2B,GAAY,CAACC,GACtC,MAAO,CAAE,MAAAtC,EAAO,MAAAU,EAAO,SAAA2B,EAAU,OAAAC,CAAA,CACrC,EAAG,CAACD,EAAUC,EAAQ5B,EAAOV,CAAK,CAAC,EAEnCznB,OAAAA,EAAAA,UAAU,IACCwqB,EAAG,UAAU5xB,EAAMixB,EAAYvW,CAAO,EAC9C,CAACkX,EAAIlX,EAAS1a,CAAI,CAAC,EAEfsxB,CACX,CC/BO,SAASikB,GAAuBztB,EAAsC,CACzE,GAAKA,EACL,OAAOA,CACX,CCKA,SAAS0tB,GAAkD,CACvD,KAAAx1C,EACA,MAAA6uB,EACA,MAAAU,EACA,SAAA2B,EACA,OAAAC,EACA,SAAAskB,EAAW,OACX,GAAGj1C,CACP,EAAyB,CACrB,MAAM2hB,EAAWC,GAAAA,YAAA,EACXszB,EAAe11C,IAAS,UACxBu1C,GAAuBpzB,EAAS,QAAQ,EACxCniB,EACAsxB,EAAUgkB,GAA0B,CAAE,KAAMI,EAAc,MAAA7mB,EAAO,MAAAU,EAAO,SAAA2B,EAAU,OAAAC,EAAQ,EAC1FwkB,EAAgBxtC,EAAM,QAAQ,IAAM,CACtC,GAAI,CAAConB,EAAO,OACZ,MAAMqmB,EAAa,OAAO,QAAQrmB,CAAK,EAAE,CAAC,EAC1C,GAAI,CAACqmB,EAAY,OACjB,KAAM,CAAC9mB,EAAOvQ,CAAG,EAAIq3B,EACrB,MAAO,CAAE,MAAA9mB,EAAO,IAAAvQ,CAAA,CACpB,EAAG,CAACgR,CAAK,CAAC,EACJsmB,EAAmBr1C,EAAK,WAAa,QAAaA,EAAK,WAAa,GACnEm1C,GAAiBn1C,EAAK,SACvBA,EAAK,SAEX,OACI2H,EAAA,cAAC2tC,GAAA,CACI,GAAGt1C,EACJ,QAAA8wB,EACA,SAAAmkB,EACA,WAAYC,EACZ,SAAUG,CAAA,CAAA,CAGtB,CCzBO,MAAME,GAAoBp1C,GAAkBA,EAAM,QAAQ,kBAAmB,GAAG,EAAE,QAAQ,MAAO,GAAG,EAAE,QAAQ,SAAU,EAAE,EAEpHq1C,GAAqDP,GACtDp7B,GAAoB,CACxB,GAAI,OAAOo7B,GAAa,kBAAmB,OAAOA,EAASp7B,CAAM,CAAC,EAClE,MAAM1Z,EAAQ0Z,EAAOo7B,CAAQ,EAC7B,OAAI90C,GAAS,MAAQA,IAAU,GAAW,GACnC,OAAOA,CAAK,CACvB,EAGEs1C,GAAc,CAACn3C,EAAgC6B,IAAmB,CACpE,GAAI7B,GAAU,MAAQA,IAAW,OAAQ,OAAO6B,EAChD,GAAI7B,IAAW,UAAW,OAAO6B,EAAQ,MAAQ,KACjD,GAAI7B,IAAW,OAAQ,OAAO6B,GAAS,KAAO,GAAK,KAAK,UAAUA,EAAO,KAAM,CAAC,EAGhF,GAFI7B,IAAW,SACXA,IAAW,SACXA,IAAW,QAAS,OAAO6B,EAG/B,MAAMu1C,EAAar1C,GADE/B,IAAW,WAAa,WAAaA,CACqD,EAC/G,OAAOo3C,EAAYA,EAAUv1C,CAAK,EAAIA,CAC1C,EAEaw1C,GAAsB,CAC/B7kB,EACA8kB,EACAC,IAEO/kB,EAAQ,IAAI,CAACjX,EAAQi8B,IAAa,CACrC,MAAMC,EAA6B,CAAE,GAAGl8B,EAAQ,OAAQi8B,CAAA,EAExD,UAAWlW,KAAUgW,EAAS,CAC1B,MAAMI,EAAY,OAAOpW,EAAO,GAAG,EAC7Bz/B,EAAQyZ,GAAeC,EAAQm8B,CAAS,EACxCppC,EAAoC,CACtC,OAAAiN,EACA,MAAA1Z,EACA,IAAK61C,EACL,SAAAF,EACA,UAAYG,GAAsBJ,EAAUI,EAAWp8B,CAAM,CAAA,EAEjEk8B,EAAcC,CAAS,EAAI,OAAOpW,EAAO,QAAW,WAC9CA,EAAO,OAAOhzB,CAAO,EACrB6oC,GAAY7V,EAAO,OAAQz/B,CAAK,CAC1C,CAEA,OAAO41C,CACX,CAAC,EAGCG,GAA8Cp2C,IAAsC,CACtF,IAAAA,EACA,MAAOO,GAAU,QAAQP,EAAK,GAAG,EACjC,SAAU,EACd,GAEaq2C,GAAe,CACxBP,EACA9kB,EACAslB,IACC,CACD,GAAIR,GAAA,MAAAA,EAAS,OAAQ,OAAOA,EAC5B,GAAIjuC,EAAM,eAAeyuC,CAAI,EACzB,OAAOrD,GAAsBqD,EAAOrrC,GAAUmrC,GAAuBnrC,EAAM,IAAI,CAAC,EAEpF,MAAMsrC,EAAcvlB,EAAQ,CAAC,EAC7B,OAAKulB,EAEE,OAAO,QAAQA,CAAW,EAAE,OAA8B,CAACz2C,EAAK,CAACE,EAAKK,CAAK,KAC1EL,EAAI,WAAW,GAAG,IAClB6H,EAAM,eAAexH,CAAK,GAAK,OAAOA,GAAU,UAAY,MAAM,QAAQA,CAAK,IAC/EP,EAAI,KAAKs2C,GAAuBp2C,CAAG,CAAC,EAEjCF,GACR,CAAA,CAAE,EARoB,CAAA,CAS7B,EAEa02C,GAAmB,CAC5BC,EACAC,IAEI,MAAM,QAAQD,CAAO,EACdA,EAAQ,OAA4C,CAAC32C,EAAKq2C,KACzDA,IAAc,SACdr2C,EAAIq2C,CAAS,EAAI,CAAE,KAAM,QAAA,EAEzBr2C,EAAIq2C,CAAS,EAAI,CAAE,KAAM,OAAA,EAEtBr2C,GACR,CAAA,CAAE,EAGJ22C,EAUE,OAAO,QAAQA,CAAO,EAAE,OAA4C,CAAC32C,EAAK,CAACE,EAAKK,CAAK,KACpFA,IAAOP,EAAIE,CAAG,EAAIK,GACfP,GACR,CAAA,CAAE,EAZM42C,EACD,CACE,IAAK,CAAE,KAAM,OAAA,EACb,KAAM,CAAE,KAAM,OAAA,EACd,OAAQ,CAAE,KAAM,QAAA,CAAS,EAE3B,CAAA,EASDC,GAAkB,CAA8BvoB,EAAyCrU,IAC7FqU,GAAA,MAAAA,EAAQ,QACN,OAAOA,EAAO,SAAY,WAAaA,EAAO,QAAQrU,CAAM,EAAIqU,EAAO,QADjD,GAIpBwoB,GAAmB,CAA8BxoB,EAAyCrU,IAC9FqU,GAAA,MAAAA,EAAQ,SACN,OAAOA,EAAO,UAAa,WAAaA,EAAO,SAASrU,CAAM,EAAIqU,EAAO,SADlD,GAIrByoB,GAAiB,CAACV,EAAmB/nB,IAC1CA,GAAA,MAAAA,EAAQ,MAAcA,EAAO,MAC7B+nB,IAAc,MAAc,MAC5BA,IAAc,OAAe,OAC7BA,IAAc,SAAiB,SAC5B51C,GAAU,QAAQ41C,EAAW,GAAG,EAG9BW,GAAuBhZ,GAAgD,CAChF,GAAI,GAACA,GAAY,OAAOA,GAAa,WACrC,OAAOA,CACX,EC7IA,SAASiZ,GAA2C,CAChD,QAAA/lB,EACA,SAAAmkB,EACA,QAAAW,EACA,UAAAC,EACA,SAAAjY,EACA,WAAAC,EACA,UAAAiZ,EAAY,GACZ,aAAA/a,EACA,kBAAAE,EACA,WAAA8a,EACA,YAAAzX,EAAc,GACd,UAAA5B,EACA,UAAAI,EACA,UAAA7zB,CACJ,EAAgC,CAC5B,MAAMiyB,EAAez2B,EAAAA,QAAQ,IAAM+vC,GAAqBP,CAAQ,EAAG,CAACA,CAAQ,CAAC,EACvE+B,EAAcvxC,EAAAA,QAAQ,IACjBqrB,EAAQ,OAA6B,CAAClxB,EAAKia,KAC9Cja,EAAI,IAAIs8B,EAAariB,CAAM,EAAGA,CAAM,EAC7Bja,GACR,IAAI,GAAK,EACb,CAACs8B,EAAcpL,CAAO,CAAC,EAEpBmmB,EAAiBxxC,EAAAA,QAAQ,IAAMkwC,GAAoB7kB,EAAS8kB,EAASC,CAAS,EAAG,CAACD,EAAS9kB,EAAS+kB,CAAS,CAAC,EAEpH,OACIluC,EAAA,cAAC61B,GAAA,CACG,OAAQoY,EAAQ,IAAKhW,IAAY,CAC7B,IAAK,OAAOA,EAAO,GAAG,EACtB,MAAOA,EAAO,MACd,UAAWA,EAAO,UAClB,KAAMA,EAAO,QAAA,EACf,EACF,KAAMqX,EACN,SAAArZ,EACA,WAAAC,EACA,cAAeiZ,IAAc,SAAW,SAAW,WACnD,aAAcA,EAAY/a,EAAe,OACzC,kBAAmB+a,EAAa/Z,GAAkB,CAC9C,MAAMJ,EAAS,IAAI,IAAII,EAAc,IAAI,EAEzC,IAAIma,EADwBpmB,EAAQ,OAAQjX,GAAW8iB,EAAO,IAAIT,EAAariB,CAAM,CAAC,CAAC,EAEnFs9B,EAAiBpa,EAAc,KAEnC,GAAI+Z,IAAc,UAAY/Z,EAAc,KAAK,OAAS,EAAG,CACzD,MAAMqa,EAAUra,EAAc,KAAKA,EAAc,KAAK,OAAS,CAAC,EAChEoa,EAAiBC,EAAU,CAACA,CAAO,EAAI,CAAA,EACvCF,EAAoBE,EAAWJ,EAAY,IAAII,CAAO,EAAI,CAACJ,EAAY,IAAII,CAAO,CAAE,EAAI,CAAA,EAAM,CAAA,CAClG,CAEA,MAAMv6B,EAAuC,CACzC,KAAMs6B,EACN,QAASD,EACT,aAAcC,EAAe,OAAS,EACtC,MAAO,IAAMlb,GAAA,YAAAA,EAAoB,CAC7B,KAAM,CAAA,EACN,QAAS,CAAA,EACT,aAAc,GACd,MAAO,IAAA,EAAM,EAChB,EAELA,GAAA,MAAAA,EAAoBpf,EACxB,EAAI,OACJ,QAASk6B,EAAcl9B,GAAW,CAC9B,MAAM/Z,EAAMo8B,EAAariB,CAAiB,EACpCswB,EAAe6M,EAAY,IAAIl3C,CAAG,EACpCqqC,KAAyBA,CAAY,CAC7C,EAAI,OACJ,UAAW7K,GAAe5B,EAAY,CAAC2Z,EAAyBC,IAAS,CACrE,MAAMC,EAAmBF,EACpB,IAAKx9B,GAAWm9B,EAAY,IAAI9a,EAAariB,CAAiB,CAAC,CAAC,EAChE,OAAO,OAAO,EACb6mB,EAAcsW,EAAY,IAAI9a,EAAaob,EAAK,MAAiB,CAAC,EACnE5W,GACLhD,EAAU6Z,EAAkB,CACxB,UAAWD,EAAK,UAChB,QAASA,EAAK,QACd,OAAQ5W,CAAA,CACX,CACL,EAAI,OACJ,UAAA5C,EACA,UAAA7zB,CAAA,CAAA,CAGZ,CChDA,MAAMutC,GAAc,CAAC,CACI,SAAAn6B,EACA,MAAAlB,EAAiB,OACjB,MAAAmB,EAAiB,IACjB,OAAAiB,EAAiB,IACjB,MAAAk5B,EAAiB,GACjB,YAAAC,EAAiB,OACjB,QAAAhzB,EAAiB,OACjB,OAAAC,EAAiB,MAC1C,IAAwB,CACpB,MAAMgzB,EAASvjC,EAAAA,OAA8B,IAAI,EAC3CwjC,EAAkBxjC,EAAAA,OAAmD,IAAI,EACzEyjC,EAAW,CACb,MAAO,GACP,MAAO,oBACP,KAAM,aAAA,EAGJ,CAACC,EAAMC,CAAO,EAAIjyC,EAAAA,SAAS,CAAC,EAElCc,EAAAA,UAAU,IAAM,CACZ,GAAI,CAAC+wC,EAAO,QAAS,OAErB,MAAMK,EAAS,IAAIC,GAAeN,EAAO,QAAS,CAC9C,YAAar6B,EACb,aAAciB,EACd,eAAgB,CACZ,WAAY,GACZ,oBAAqB,GACrB,YAAa,QACb,kBAAmB,MACnB,YAAa,KAAA,CACjB,CACH,EAED,OAAAq5B,EAAgB,QAAUI,EAE1BA,EAAO,GAAG,cAAgBz4C,GAAQ,CAC9B,QAAQ,IAAI,cAAeA,CAAG,EAC9By4C,EAAO,gBAAA,CACX,CAAC,EAEDA,EAAO,GAAG,UAAYryB,GAAQ,CAC1BqyB,EAAO,gBAAA,EACPA,EAAO,QAAQ,YAAa,CACxB,OAAQ,CACJ,KAAM,UACN,SAAU,GACV,WAAY,MAAA,EAEhB,SAAU,CACN,EAAGryB,EAAI,eAAe,EACtB,EAAGA,EAAI,eAAe,CAAA,CAC1B,CACH,CACL,CAAC,EAEM,IAAM,CACTqyB,EAAO,QAAA,EACPJ,EAAgB,QAAU,IAC9B,CACJ,EAAG,CAACt6B,EAAOiB,CAAM,CAAC,EAGlB,MAAM25B,EAAYxb,EAAAA,YAAY,IAAM,CAChC,MAAMsb,EAASJ,EAAgB,QAC3B,CAACv6B,GAAY,CAAC26B,GAElBA,EAAO,iBAAiB36B,EAAU,cAAc,EAC3C,KAAK,IAAM,CACRq6B,GAAA,MAAAA,IACAM,EAAO,eAAA,EACPA,EAAO,eAAA,CACX,CAAC,EACA,MAAO/iC,GAAQ,CACZ,QAAQ,MAAM,uBAAwBA,CAAG,CAC7C,CAAC,CACT,EAAG,CAACoI,EAAUq6B,CAAW,CAAC,EAE1B9wC,EAAAA,UAAU,IAAM,CACZsxC,EAAA,CACJ,EAAG,CAACA,CAAS,CAAC,EAGd,MAAMC,EAAyB,CAACnqC,EAAwC7J,IAAsB,CAC1F6J,EAAE,eAAA,EAEF,MAAMgqC,EAASJ,EAAgB,QAC/B,GAAI,CAACI,EAAQ,OAEb,MAAMI,EAAU,EACVC,EAAU,EAEhB,OAAQl0C,EAAA,CAEJ,IAAK,SACG2zC,EAAOM,GAASL,EAAS7pC,GAASA,EAAO,GAAG,EAChD,MAEJ,IAAK,UACG4pC,EAAOO,GAASN,EAAS7pC,GAAS,KAAK,IAAIA,EAAO,GAAKmqC,CAAO,CAAC,EACnE,MAGJ,IAAK,OACIL,EAAO,sBAA2B,KAAA,EACvC,MACJ,IAAK,OACIA,EAAO,sBAA2B,KAAA,EACvC,MAGJ,IAAK,QACDA,EAAO,MAAA,EACP,MACJ,IAAK,QACDA,EAAO,MAAA,EACP,MACJ,IAAK,SACDA,EAAO,OAAO,EAAE,EAChB,MAGJ,IAAK,UACDA,EAAO,iBAAiB7zC,CAAI,EAC5B,MAGJ,IAAK,eACD6zC,EAAO,iBAAiB7zC,EAAM,CAC1B,MAAO0zC,EAAS,MAChB,MAAOA,EAAS,KAAA,CACnB,EACD,MAGJ,IAAK,eACDG,EAAO,iBAAiB7zC,EAAM,CAC1B,MAAO0zC,EAAS,MAChB,MAAOA,EAAS,MAChB,UAAW,CACP,KAAM,SAAA,CACV,CACmB,EACvB,MAGJ,IAAK,OACDG,EAAO,iBAAiB7zC,CAAI,EAC5B,MAGJ,IAAK,SACL,IAAK,OACL,IAAK,WACD6zC,EAAO,gBAAgB7zC,EAAM,CACzB,KAAM0zC,EAAS,KACf,OAAQA,EAAS,MACjB,YAAa,CAAA,CAChB,EACDG,EAAO,iBAAiB,OAAO,EAC/B,KAGA,CAEZ,EAEM/Q,EAAa,SAAY,CAC3B,MAAM+Q,EAASJ,EAAgB,QAC1BI,IAEL,MAAMrzB,GAAA,YAAAA,EAASqzB,EAAO,cAEtB,SAAS,KAAK,MAAM,SAAW,GACnC,EAEMhyB,EAAc,IAAM,CACtB,SAAS,KAAK,MAAM,SAAW,GAC/BtB,GAAA,MAAAA,GACJ,EAEA,OAAO,SAAS,KAAK,MAAM,SAAW,SACtC,MAAM4zB,EAAkB,mNAClBC,EAAW5wC,EAAA,cAAC,MAAA,CAAI,UAAW,iBAC7BA,EAAA,cAAC,MAAA,CAAI,UAAW,YAAA,kBACX,SAAA,CAAO,UAAW2wC,EAAiB,MAAM,OAAO,QAAUtqC,GAAMmqC,EAAuBnqC,EAAG,MAAM,CAAA,EAC7FrG,EAAA,cAAC0E,GAAK,KAAK,gBAAA,CAAiB,CAChC,kBACC,SAAA,CAAO,UAAWisC,EAAiB,MAAM,OAAO,QAAUtqC,GAAMmqC,EAAuBnqC,EAAG,MAAM,GAC7FrG,EAAA,cAAC0E,GAAK,KAAK,iBAAA,CAAkB,CACjC,kBACC,SAAA,CAAO,UAAWisC,EAAiB,MAAM,UAAU,QAAUtqC,GAAMmqC,EAAuBnqC,EAAG,SAAS,CAAA,EACnGrG,EAAA,cAAC0E,GAAK,KAAK,yBAAyB,CACxC,kBACC,SAAA,CAAO,UAAWisC,EAAiB,MAAM,WAAW,QAAUtqC,GAAMmqC,EAAuBnqC,EAAG,QAAQ,CAAA,EACnGrG,EAAA,cAAC0E,GAAK,KAAK,uBAAA,CAAwB,CACvC,CACJ,EACA1E,EAAA,cAAC,MAAA,CAAI,UAAW,YAAA,kBACX,SAAA,CAAO,UAAW2wC,EAAiB,MAAM,OAAO,QAAUtqC,GAAMmqC,EAAuBnqC,EAAG,SAAS,GAChGrG,EAAA,cAAC0E,GAAK,KAAK,MAAA,CAAO,CACtB,kBACC,SAAA,CAAO,UAAWisC,EAAiB,MAAM,SAAS,QAAUtqC,GAAMmqC,EAAuBnqC,EAAG,OAAO,CAAA,EAChGrG,EAAA,cAAC0E,GAAK,KAAK,mBAAmB,CAClC,kBACC,SAAA,CAAO,UAAWisC,EAAiB,MAAM,SAAS,QAAUtqC,GAAMmqC,EAAuBnqC,EAAG,OAAO,CAAA,EAChGrG,EAAA,cAAC0E,EAAA,CAAK,KAAK,iBAAA,CAAkB,CACjC,EACA1E,EAAA,cAAC,UAAO,UAAW2wC,EAAiB,MAAM,SAAS,QAAUtqC,GAAMmqC,EAAuBnqC,EAAG,QAAQ,CAAA,EACjGrG,EAAA,cAAC0E,EAAA,CAAK,KAAK,eAAA,CAAgB,CAC/B,CACJ,kBACC,MAAA,CAAI,UAAW,YAAA,EACZ1E,EAAA,cAAC,SAAA,CAAO,UAAW2wC,EAAiB,MAAM,eAAe,QAAUtqC,GAAMmqC,EAAuBnqC,EAAG,cAAc,CAAA,EAC7GrG,EAAA,cAAC0E,EAAA,CAAK,KAAK,SAAS,CACxB,EACA1E,EAAA,cAAC,SAAA,CAAO,UAAW2wC,EAAiB,MAAM,OAAO,QAAUtqC,GAAMmqC,EAAuBnqC,EAAG,cAAc,CAAA,EACrGrG,EAAA,cAAC0E,EAAA,CAAK,KAAK,aAAA,CAAc,CAC7B,EACA1E,EAAA,cAAC,SAAA,CAAO,UAAW2wC,EAAiB,MAAM,OAAO,QAAUtqC,GAAMmqC,EAAuBnqC,EAAG,MAAM,CAAA,EAC7FrG,EAAA,cAAC0E,EAAA,CAAK,KAAK,QAAA,CAAS,CACxB,EACA1E,EAAA,cAAC,SAAA,CAAO,UAAW2wC,EAAiB,MAAM,OAAO,QAAUtqC,GAAMmqC,EAAuBnqC,EAAG,MAAM,CAAA,EAC7FrG,EAAA,cAAC0E,EAAA,CAAK,KAAK,WAAA,CAAY,CAC3B,EACA1E,EAAA,cAAC,SAAA,CAAO,UAAW2wC,EAAiB,MAAM,SAAS,QAAUtqC,GAAMmqC,EAAuBnqC,EAAG,QAAQ,GACjGrG,EAAA,cAAC0E,EAAA,CAAK,KAAK,QAAA,CAAS,CACxB,EACA1E,EAAA,cAAC,SAAA,CAAO,UAAW2wC,EAAiB,MAAM,WAAW,QAAUtqC,GAAMmqC,EAAuBnqC,EAAG,UAAU,CAAA,EACrGrG,EAAA,cAAC0E,EAAA,CAAK,KAAK,WAAW,CAC1B,CACJ,EACCsY,GAAUhd,EAAA,cAAC,MAAA,CAAI,UAAW,SAAA,kBACtBuU,GAAA,CAAc,UAAW,cAAe,QAAS+qB,EAAY,KAAM,cAAe,MAAO,MAAA,CAAQ,CACtG,CACJ,EAEMuR,EACF7wC,EAAA,cAAC,MAAA,CAAI,IAAKgwC,EACL,UAAW,sBACX,MAAO,CACH,UAAW,SAASG,CAAI,IACxB,gBAAiB,aACjB,QAAS,eACT,WAAY,OACZ,MAAO,OACP,OAASv5B,EAASu5B,EAAQ,IAAA,CAC9B,CAAA,EAGT,OAAQL,EACE9vC,EAAA,cAAC6c,GAAA,CACC,KAAM,KACN,MAAOrI,GAAS,eAChB,OAAQo8B,EACR,UAAW,eACX,UAAW,kBACX,QAASvyB,EACT,OAAQ,EAAA,EAEPwyB,CAAA,EAEH7wC,EAAA,cAAAA,EAAA,SAAA,KAAG4wC,EAAUC,CAAO,CAElC,ECxGMC,GAAct1C,EAAAA,cAAqC,IAAI,EAC7D,IAAIu1C,GAAkB,EAEf,MAAMC,GAAwB,aACxBC,GAA2C,CACpD,QAAS,QACT,SAAU,uCACd,EACaC,GAA2C,CACpD,KAAM,IACV,EAOA,SAASC,GAAmB96B,EAAgBle,EAAqB,CAC7D,OAAOA,EAAI,SAAS,GAAG,EAAIA,EAAM,GAAGke,CAAM,IAAIle,CAAG,EACrD,CAEA,SAASi5C,GAAkBC,EAA6D,CACpF,OAAO,MAAM,QAAQA,CAAQ,EAAIA,EAAS,KAAK,IAAI,EAAIA,CAC3D,CAEA,SAASC,GAAsBn5C,EAAqB,CAChD,OAAOA,IAAQ,WAAa,eAAiBg5C,GAAmB,KAAMh5C,CAAG,CAC7E,CAEA,SAASo5C,GAAoBC,EAAmD,CAC5E,MAAO,CACH,GAAIA,EAAS,UAAY,CAAC,CAAE,IAAK,YAAa,KAAMA,EAAS,SAAA,CAAW,EAAI,CAAA,EAC5E,GAAIA,EAAS,QAAU,CAAC,CAAE,IAAK,UAAW,KAAMA,EAAS,OAAA,CAAS,EAAI,CAAA,EACtE,GAAIA,EAAS,QAAU,CAAC,CAAE,IAAK,UAAW,KAAMA,EAAS,QAAS,KAAM,iBAAA,CAAmB,EAAI,CAAA,EAC/F,GAAIA,EAAS,OAAS,CAAA,CAAC,CAE/B,CAEA,SAASC,GAAsBvb,EAAuD,CAClF,MAAO,CACH,GAAIA,EAAW,KAAO,CAAC,CAAE,IAAK,OAAQ,KAAMA,EAAW,IAAA,CAAM,EAAI,CAAA,EACjE,GAAIA,EAAW,KAAO,CAAC,CAAE,IAAK,OAAQ,KAAMA,EAAW,IAAA,CAAM,EAAI,CAAA,CAAC,CAE1E,CAEA,SAASwb,GAAoB5vB,EAAmD,CAC5E,OAAQA,EAAS,YAAc,CAAA,GAAI,IAAK6vB,IAAe,CACnD,IAAK,YACL,KAAMA,EAAU,KAChB,SAAUA,EAAU,SACpB,MAAOA,EAAU,MACjB,KAAMA,EAAU,KAChB,MAAOA,EAAU,KAAA,EACnB,CACN,CAEA,SAASC,GAAiBC,EAA6BC,EAAyBN,EAG9E,OACE,MAAO,CACH,KAAM,CACF,YAAaK,EAAS,YACtB,GAAIA,EAAS,MAAQ,CAAA,EACrB,OAAQL,EAAS,UAAUtrC,EAAA2rC,EAAS,OAAT,YAAA3rC,EAAe,QAC1C,UAAWsrC,EAAS,UACpB,SAAUJ,GAAkBI,EAAS,QAAQ,EAC7C,OAAQA,EAAS,OACjB,UAAWA,EAAS,UACpB,SAAUA,EAAS,SACnB,GAAIA,EAAS,MAAQ,CAAA,EACrB,GAAG,OAAO,YACN,OAAO,QAAQM,EAAO,SAAW,CAAA,CAAE,EAAE,IAAI,CAAC,CAAC35C,EAAKK,CAAK,IAAM,CACvD24C,GAAmB,UAAWh5C,CAAG,EACjCK,CAAA,CACH,CAAA,CACL,EAEJ,SAAU,OAAO,YACb,OAAO,QAAQs5C,EAAO,WAAa,CAAA,CAAE,EAAE,IAAI,CAAC,CAAC35C,EAAKK,CAAK,IAAM,CACzD84C,GAAsBn5C,CAAG,EACzBK,CAAA,CACH,CAAA,CACL,CAER,CAEA,SAASu5C,GACLC,EACAR,EACA1vB,EACAoU,EACoB,CACpB,MAAO,CACH,GAAGqb,GAAoBC,CAAQ,EAC/B,GAAGC,GAAsBvb,CAAU,EACnC,GAAGwb,GAAoB5vB,CAAQ,EAC/B,GAAIkwB,EAAM,WAAa,CAACR,EAAS,UAAY,CAAC,CAAE,IAAK,YAAa,KAAMQ,EAAM,SAAA,CAAW,EAAI,CAAA,EAC7F,GAAIA,EAAM,OAAS,CAAA,CAAC,CAE5B,CAEA,SAASC,GAAiBC,EAA+C,CACrE,MAAO,CACH,IAAIA,EAAO,OAAS,CAAA,GAAI,QAASC,GAAS,CACtC,IAAIA,EAAK,aAAe,CAAA,GAAI,IAAKC,IAAU,CAAE,IAAK,eAAgB,KAAAA,CAAA,EAAO,EACzE,IAAID,EAAK,YAAc,CAAA,GAAI,IAAKC,IAAU,CAAE,IAAK,aAAc,KAAAA,EAAM,YAAaD,EAAK,aAAc,EACrG,GAAIA,EAAK,QAAU,CAAC,CAChB,IAAK,UACL,KAAMA,EAAK,KACX,GAAIA,EAAK,IAAM,OACf,KAAMA,EAAK,KACX,MAAOA,EAAK,MACZ,YAAaA,EAAK,WAAA,CACrB,EAAI,CAAA,EACL,CACI,IAAK,aACL,KAAMA,EAAK,KACX,MAAOA,EAAK,MACZ,YAAaA,EAAK,WAAA,CACtB,CACH,CAAA,CAET,CAEA,SAASE,GAAeC,EAAyC,CAC7D,MAAO,CACH,GAAIA,EAAI,SAAW,CAAC,CAAE,IAAK,WAAY,KAAMA,EAAI,QAAA,CAAU,EAAI,CAAA,EAC/D,GAAIA,EAAI,QAAU,CAAC,CAAE,IAAK,OAAQ,KAAMA,EAAI,OAAA,CAAS,EAAI,CAAA,EACzD,GAAIA,EAAI,eAAiB,CAAC,CAAE,IAAK,mBAAoB,KAAMA,EAAI,cAAA,CAAgB,EAAI,CAAA,EACnF,GAAIA,EAAI,OAAS,CAAA,CAAC,CAE1B,CAEA,SAASC,GAAcD,EAAuC,CAC1D,MAAO,CACH,cAAeA,EAAI,WACnB,0BAA2BA,EAAI,gBAC/B,eAAgBA,EAAI,YACpB,mBAAoBA,EAAI,gBACxB,yBAA0BA,EAAI,sBAAwB,OAAY,OAAY,OAAOA,EAAI,mBAAmB,EAC5G,+BAAgCA,EAAI,2BAA6B,OAAY,OAAY,OAAOA,EAAI,wBAAwB,EAC5H,6BAA8BA,EAAI,uBAClC,wCAAyCA,EAAI,+BAAA,CAErD,CAEA,SAASE,GAAsBC,EAAgD,CAC3E,OAAO,MAAM,QAAQA,EAAU,MAAM,EAC/BA,EAAU,OACVA,EAAU,OACN,CAACA,EAAU,MAAM,EACjB,CAAA,CACd,CAEA,SAASC,GAAiBC,EAAqE,CAC3F,OAAO,OAAO,YACV,OAAO,QAAQA,CAAI,EAAE,OAAO,CAAC,EAAGn6C,CAAK,IAAM,EAAQA,CAAM,CAAA,CAEjE,CAEA,SAASo6C,GAAmBC,EAAwE,CAChG,KAAM,CAAE,OAAQC,EAAS,GAAG1vC,GAAUyvC,EACtC,OAAO,OAAO,YACV,OAAO,QAAQzvC,CAAK,EAAE,OAAO,CAAC,EAAG5K,CAAK,IAAMA,IAAU,QAAaA,IAAU,EAAK,CAAA,CAE1F,CAEA,SAASu6C,GAAsBvyC,EAAkE,CAC7F,KAAM,CAAE,OAAQsyC,EAAS,GAAG1vC,GAAU5C,EACtC,OAAO,OAAO,YACV,OAAO,QAAQ4C,CAAK,EAAE,OAAO,CAAC,EAAG5K,CAAK,IAAMA,IAAU,QAAaA,IAAU,EAAK,CAAA,CAE1F,CAEA,SAASw6C,GAAW,CAChB,QAAAC,EACA,SAAApB,EACA,OAAAC,EACA,MAAAE,EACA,WAAA9b,EACA,SAAApU,EACA,SAAA0vB,EACA,OAAAU,EACA,IAAAI,EACA,UAAAG,CACJ,EAWG,SACC,GAAI,OAAO,WAAW,SAAa,IAAa,OAAO,KAEvD,MAAM9C,EAAOiC,GAAiBC,EAAUC,EAAQN,CAAQ,EAClD0B,EAAUX,GAAcD,CAAG,EAC3Ba,EAAW,CACb,GAAGpB,GAAgBC,EAAOR,EAAU1vB,EAAUoU,CAAU,EACxD,GAAG+b,GAAiBC,CAAM,EAC1B,GAAGG,GAAeC,CAAG,CAAA,EAEnBc,EAAkBZ,GAAsBC,CAAS,EAEvD,OAAO7zB,GAAAA,6CAEE4yB,EAAS,QAAUxxC,EAAA,cAAC,OAAA,CAAK,QAASwxC,EAAS,QAAS,gBAAc,WAAW,EAAK,MAClFtrC,EAAAsrC,EAAS,OAAT,MAAAtrC,EAAe,OAAQyD,EAAA6nC,EAAS,OAAT,MAAA7nC,EAAe,OACnC3J,EAAA,cAAC,OAAA,CACG,KAAMwxC,EAAS,KAAK,KACpB,OAAQA,EAAS,KAAK,OACtB,gBAAc,UAAA,CAAA,EAElB,KACJxxC,EAAA,cAAC,QAAA,CAAM,gBAAc,OAAA,EAAS6xC,EAAS,OAASoB,CAAQ,EACvDzB,EAAS,SAAWxxC,EAAA,cAAC,OAAA,CAAK,KAAK,WAAW,QAASwxC,EAAS,SAAU,gBAAc,UAAA,CAAW,EAAK,KACpG,OAAO,QAAQA,EAAS,WAAa,CAAA,CAAE,EAAE,IAAI,CAAC,CAAC6B,EAAWpxC,CAAO,IAC9DA,EAAUjC,EAAA,cAAC,OAAA,CAAK,IAAK,cAAcqzC,CAAS,GAAI,UAAAA,EAAsB,QAAApxC,EAAkB,gBAAc,UAAA,CAAW,EAAK,IACzH,EACA,OAAO,QAAQ0tC,EAAK,IAAI,EAAE,IAAI,CAAC,CAACjtC,EAAMT,CAAO,IAC1CA,EAAUjC,EAAA,cAAC,OAAA,CAAK,IAAK,QAAQ0C,CAAI,GAAI,KAAAA,EAAY,QAAAT,EAAkB,gBAAc,MAAA,CAAO,EAAK,IAChG,EACA,OAAO,QAAQ0tC,EAAK,QAAQ,EAAE,IAAI,CAAC,CAACvoC,EAAUnF,CAAO,IAClDA,EAAUjC,EAAA,cAAC,OAAA,CAAK,IAAK,YAAYoH,CAAQ,GAAI,SAAAA,EAAoB,QAAAnF,EAAkB,gBAAc,MAAA,CAAO,EAAK,IAChH,EACA,OAAO,QAAQixC,CAAO,EAAE,IAAI,CAAC,CAACxwC,EAAMT,CAAO,IACxCA,EAAUjC,EAAA,cAAC,OAAA,CAAK,IAAK,OAAO0C,CAAI,GAAI,KAAAA,EAAY,QAAAT,EAAkB,gBAAc,KAAA,CAAM,EAAK,IAC9F,EACAkxC,EAAS,IAAI,CAACR,EAAMp6C,IACjByH,EAAA,cAAC,OAAA,CACG,IAAK,GAAG2yC,EAAK,GAAG,IAAIA,EAAK,MAAQp6C,CAAK,GACrC,GAAGm6C,GAAiBC,CAAI,EACzB,gBAAc,MAAA,CAAA,CAErB,GACCT,EAAO,QAAU,IAAI,IAAI,CAAC1xC,EAAOjI,oBAC9ByH,EAAM,SAAN,CAAe,IAAK,SAASQ,EAAM,MAAQjI,CAAK,IAC5CiI,EAAM,KACHR,EAAA,cAAC,OAAA,CACG,IAAI,aACJ,KAAMQ,EAAM,KACX,GAAGuyC,GAAsBvyC,CAAK,EAC/B,gBAAc,aAAA,CAAA,EAElB,KACHA,EAAM,OACHR,EAAA,cAAC,QAAA,CACG,GAAIQ,EAAM,GACV,MAAOA,EAAM,MACb,MAAOA,EAAM,MACb,MAAOA,EAAM,MACb,gBAAc,aAAA,EAEbA,EAAM,MAAA,EAEX,IACR,CACH,GACC0xC,EAAO,SAAW,CAAA,GAAI,IAAI,CAACW,EAAQt6C,IACjCyH,EAAA,cAACA,EAAM,SAAN,CAAe,IAAK,UAAU6yC,EAAO,KAAOt6C,CAAK,IAC7Cs6C,EAAO,IACJ7yC,EAAA,cAAC,SAAA,CACI,GAAG4yC,GAAmBC,CAAM,EAC7B,gBAAc,cAAA,CAAA,EAElB,KACHA,EAAO,OACJ7yC,EAAA,cAAC,SAAA,CACG,KAAM6yC,EAAO,KACb,GAAIA,EAAO,GACX,MAAOA,EAAO,MACd,gBAAc,cAAA,EAEbA,EAAO,MAAA,EAEZ,IACR,CACH,EACAO,EAAgB,IAAI,CAACE,EAAO/6C,IACzByH,EAAA,cAAC,SAAA,CACG,IAAK,cAAczH,CAAK,GACxB,KAAK,sBACL,gBAAc,YAAA,EAEb,KAAK,UAAU+6C,CAAK,CAAA,CAE5B,CACL,EACA,WAAW,SAAS,IAAA,CAE5B,CAEO,SAASC,GAAa,CAAE,QAAAN,EAAUjC,GAAuB,SAAApzC,GAA+B,CAC3F,MAAM41C,EAAkBP,GAAWjC,GAC7ByC,EAAiBzzC,EAAM,OAAO,OAAO,WAAW,SAAa,IAAc,GAAK,WAAW,SAAS,gBAAgB,IAAI,EACxH0zC,EAAgB1zC,EAAM,OAAO,OAAO,WAAW,SAAa,IAAc,GAAK,WAAW,SAAS,gBAAgB,GAAG,EACtH,CAAC6xC,EAAU8B,CAAe,EAAIx1C,EAAAA,SAA4B,CAAA,CAAE,EAC5D,CAACy1C,EAAiBC,CAAkB,EAAI11C,EAAAA,SAA0B,CAAA,CAAE,EACpE,CAAC2zC,EAAQgC,CAAa,EAAI31C,EAAAA,SAA0B,CAAA,CAAE,EACtD,CAAC6zC,EAAO+B,CAAY,EAAI51C,EAAAA,SAAyB,CAAA,CAAE,EACnD,CAAC+3B,EAAY8d,CAAiB,EAAI71C,EAAAA,SAA8B,CAAA,CAAE,EAClE,CAAC2jB,EAAUmyB,CAAe,EAAI91C,EAAAA,SAA4B+yC,EAAqB,EAC/E,CAACM,EAAU0C,CAAe,EAAI/1C,EAAAA,SAA4B8yC,EAAqB,EAC/E,CAACiB,EAAQiC,CAAa,EAAIh2C,EAAAA,SAA0B,CAAA,CAAE,EACtD,CAACm0C,EAAK8B,CAAU,EAAIj2C,EAAAA,SAAuB,CAAA,CAAE,EAC7C,CAACs0C,EAAW4B,CAAY,EAAIl2C,EAAAA,SAA6B,CAAA,CAAE,EAC3Dm2C,EAAoBvf,EAAAA,YAAY,IAAM4e,EAAgB,CAAA,CAAE,EAAG,CAAA,CAAE,EAC7DY,EAAuBxf,EAAAA,YAAY,CAAC1wB,EAAYmwC,IAAoC,CACtFX,EAAoBr0C,GAET,CAAC,GADYA,EAAQ,OAAQmR,IAAUA,GAAM,KAAOtM,CAAE,EACrC,CAAE,GAAAA,EAAI,SAAUmwC,EAAc,CACzD,CACL,EAAG,CAAA,CAAE,EACCC,EAAyB1f,cAAa1wB,GAAe,CACvDwvC,EAAoBr0C,GAAYA,EAAQ,OAAQmR,GAAUA,EAAM,KAAOtM,CAAE,CAAC,CAC9E,EAAG,CAAA,CAAE,EACCqwC,EAAkB3f,EAAAA,YAAY,IAAM+e,EAAc,CAAA,CAAE,EAAG,CAAA,CAAE,EACzDa,EAAiB5f,EAAAA,YAAY,IAAMgf,EAAa,CAAA,CAAE,EAAG,CAAA,CAAE,EACvDa,EAAsB7f,EAAAA,YAAY,IAAMif,EAAkB,CAAA,CAAE,EAAG,CAAA,CAAE,EACjEa,EAAoB9f,EAAAA,YAAY,IAAMkf,EAAgB/C,EAAqB,EAAG,CAAA,CAAE,EAChF4D,EAAoB/f,EAAAA,YAAY,IAAMmf,EAAgBjD,EAAqB,EAAG,CAAA,CAAE,EAChF8D,EAAkBhgB,EAAAA,YAAY,IAAMof,EAAc,CAAA,CAAE,EAAG,CAAA,CAAE,EACzDa,EAAejgB,EAAAA,YAAY,IAAMqf,EAAW,CAAA,CAAE,EAAG,CAAA,CAAE,EACnDa,EAAiBlgB,EAAAA,YAAY,IAAMsf,EAAa,CAAA,CAAE,EAAG,CAAA,CAAE,EAE7Dp1C,EAAAA,UAAU,IAAM,CACR,OAAO,WAAW,SAAa,MAEnC,WAAW,SAAS,gBAAgB,KAAO6iB,EAAS,MAAQ2xB,EAAe,QAC3E,WAAW,SAAS,gBAAgB,IAAM3xB,EAAS,KAAO4xB,EAAc,QAC5E,EAAG,CAAC5xB,EAAS,KAAMA,EAAS,GAAG,CAAC,EAEhC,MAAMozB,EAAiBtB,EAAgB,OAAS,EAAIA,EAAgBA,EAAgB,OAAS,CAAC,EAAE,SAAW/B,EAI3G5yC,EAAAA,UAAU,IAAM,CACR,OAAO,WAAW,SAAa,MACnC,WAAW,SAAS,MAAQi2C,EAAe,OAAS1B,EACxD,EAAG,CAAC0B,EAAe,MAAO1B,CAAe,CAAC,EAE1C,MAAMj0C,EAAazB,EAAAA,QAAwB,KAAO,CAC9C,SAAUo3C,EACV,OAAApD,EACA,MAAAE,EACA,WAAA9b,EACA,SAAApU,EACA,SAAA0vB,EACA,OAAAU,EACA,IAAAI,EACA,UAAAG,EACA,gBAAAkB,EACA,kBAAAW,EACA,qBAAAC,EACA,uBAAAE,EACA,cAAAX,EACA,gBAAAY,EACA,aAAAX,EACA,eAAAY,EACA,kBAAAX,EACA,oBAAAY,EACA,gBAAAX,EACA,kBAAAY,EACA,gBAAAX,EACA,kBAAAY,EACA,cAAAX,EACA,gBAAAY,EACA,WAAAX,EACA,aAAAY,EACA,aAAAX,EACA,eAAAY,CAAA,GACA,CACAC,EACApD,EACAE,EACA9b,EACApU,EACA0vB,EACAU,EACAI,EACAG,EACA6B,EACAC,EACAE,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,CAAA,CACH,EAED,uBACKnE,GAAY,SAAZ,CAAqB,MAAOvxC,GACxB3B,EACDoC,EAAA,cAACgzC,GAAA,CACG,QAASQ,EACT,SAAU0B,EACV,OAAApD,EACA,MAAAE,EACA,WAAA9b,EACA,SAAApU,EACA,SAAA0vB,EACA,OAAAU,EACA,IAAAI,EACA,UAAAG,CAAA,CAAA,CAER,CAER,CAEA,SAAS0C,IAA2C,CAChD,OAAOh1C,EAAAA,WAAW2wC,EAAW,CACjC,CAEA,SAASsE,GAAU58C,EAAwB,CACvC,OAAO,KAAK,UAAUA,GAAS,EAAE,CACrC,CAEO,SAAS68C,GAAQxD,EAAqD,CACzE,MAAMtyC,EAAa41C,GAAA,EACbG,EAAQt1C,EAAM,OAAsB,IAAI,EACzCs1C,EAAM,UACPvE,IAAmB,EACnBuE,EAAM,QAAU,YAAYvE,EAAe,IAE/C,MAAMwE,EAAcH,GAAUvD,CAAQ,EAEtC5yC,OAAAA,EAAAA,UAAU,IAAM,CACZ,GAAI,CAACM,GAAc,CAACsyC,EAAU,OAC9B,MAAMxtC,EAAKixC,EAAM,QACjB,OAAA/1C,EAAW,qBAAqB8E,EAAIwtC,CAAQ,EACrC,IAAMtyC,EAAW,uBAAuB8E,CAAE,CACrD,EAAG,CAAC9E,GAAA,YAAAA,EAAY,qBAAsBA,GAAA,YAAAA,EAAY,uBAAwBg2C,CAAW,CAAC,EAE/Eh2C,CACX,CAEO,SAASi2C,GAAc1D,EAAiD,CAC3E,MAAMvyC,EAAa41C,GAAA,EACbM,EAAYL,GAAUtD,CAAM,EAElC7yC,OAAAA,EAAAA,UAAU,IAAM,CACZ,GAAI,CAACM,GAAc,CAACuyC,EAAQ,OAC5B,MAAM4D,EAAiBn2C,EAAW,OAClC,OAAAA,EAAW,cAAcuyC,CAAM,EACxB,IAAMvyC,EAAW,cAAcm2C,CAAc,CACxD,EAAG,CAACn2C,GAAA,YAAAA,EAAY,cAAek2C,CAAS,CAAC,EAElCl2C,CACX,CAEO,SAASo2C,GAAa3D,EAA+C,CACxE,MAAMzyC,EAAa41C,GAAA,EACbS,EAAWR,GAAUpD,CAAK,EAEhC/yC,OAAAA,EAAAA,UAAU,IAAM,CACZ,GAAI,CAACM,GAAc,CAACyyC,EAAO,OAC3B,MAAM6D,EAAgBt2C,EAAW,MACjC,OAAAA,EAAW,aAAayyC,CAAK,EACtB,IAAMzyC,EAAW,aAAas2C,CAAa,CACtD,EAAG,CAACt2C,GAAA,YAAAA,EAAY,aAAcq2C,CAAQ,CAAC,EAEhCr2C,CACX,CAEO,SAASu2C,GAAkB5f,EAAyD,CACvF,MAAM32B,EAAa41C,GAAA,EACbY,EAAgBX,GAAUlf,CAAU,EAE1Cj3B,OAAAA,EAAAA,UAAU,IAAM,CACZ,GAAI,CAACM,GAAc,CAAC22B,EAAY,OAChC,MAAM8f,EAAqBz2C,EAAW,WACtC,OAAAA,EAAW,kBAAkB22B,CAAU,EAChC,IAAM32B,EAAW,kBAAkBy2C,CAAkB,CAChE,EAAG,CAACz2C,GAAA,YAAAA,EAAY,kBAAmBw2C,CAAa,CAAC,EAE1Cx2C,CACX,CAEO,SAAS02C,GAAgBn0B,EAAqD,CACjF,MAAMviB,EAAa41C,GAAA,EACbe,EAAcd,GAAUtzB,CAAQ,EAEtC7iB,OAAAA,EAAAA,UAAU,IAAM,CACZ,GAAI,CAACM,GAAc,CAACuiB,EAAU,OAC9B,MAAMq0B,EAAmB52C,EAAW,SACpC,OAAAA,EAAW,gBAAgBuiB,CAAQ,EAC5B,IAAMviB,EAAW,gBAAgB42C,CAAgB,CAC5D,EAAG,CAAC52C,GAAA,YAAAA,EAAY,gBAAiB22C,CAAW,CAAC,EAEtC32C,CACX,CAEO,SAAS62C,GAAgB5E,EAAqD,CACjF,MAAMjyC,EAAa41C,GAAA,EACbkB,EAAcjB,GAAU5D,CAAQ,EAEtCvyC,OAAAA,EAAAA,UAAU,IAAM,CACZ,GAAI,CAACM,GAAc,CAACiyC,EAAU,OAC9B,MAAM8E,EAAuB/2C,EAAW,SACxC,OAAAA,EAAW,gBAAgBiyC,CAAQ,EAC5B,IAAMjyC,EAAW,gBAAgB+2C,CAAoB,CAChE,EAAG,CAAC/2C,GAAA,YAAAA,EAAY,gBAAiB82C,CAAW,CAAC,EAEtC92C,CACX,CAEO,SAASg3C,GAAcrE,EAAiD,CAC3E,MAAM3yC,EAAa41C,GAAA,EACbqB,EAAYpB,GAAUlD,CAAM,EAElCjzC,OAAAA,EAAAA,UAAU,IAAM,CACZ,GAAI,CAACM,GAAc,CAAC2yC,EAAQ,OAC5B,MAAMuE,EAAiBl3C,EAAW,OAClC,OAAAA,EAAW,cAAc2yC,CAAM,EACxB,IAAM3yC,EAAW,cAAck3C,CAAc,CACxD,EAAG,CAACl3C,GAAA,YAAAA,EAAY,cAAei3C,CAAS,CAAC,EAElCj3C,CACX,CAEO,SAASm3C,GAAWpE,EAA2C,CAClE,MAAM/yC,EAAa41C,GAAA,EACbwB,EAASvB,GAAU9C,CAAG,EAE5BrzC,OAAAA,EAAAA,UAAU,IAAM,CACZ,GAAI,CAACM,GAAc,CAAC+yC,EAAK,OACzB,MAAMsE,EAAcr3C,EAAW,IAC/B,OAAAA,EAAW,WAAW+yC,CAAG,EAClB,IAAM/yC,EAAW,WAAWq3C,CAAW,CAClD,EAAG,CAACr3C,GAAA,YAAAA,EAAY,WAAYo3C,CAAM,CAAC,EAE5Bp3C,CACX,CAEO,SAASs3C,GAAiBpE,EAAuD,CACpF,MAAMlzC,EAAa41C,GAAA,EACb2B,EAAe1B,GAAU3C,CAAS,EAExCxzC,OAAAA,EAAAA,UAAU,IAAM,CACZ,GAAI,CAACM,GAAc,CAACkzC,EAAW,OAC/B,MAAMsE,EAAoBx3C,EAAW,UACrC,OAAAA,EAAW,aAAakzC,CAAS,EAC1B,IAAMlzC,EAAW,aAAaw3C,CAAiB,CAC1D,EAAG,CAACx3C,GAAA,YAAAA,EAAY,aAAcu3C,CAAY,CAAC,EAEpCv3C,CACX,CAEO,SAASy3C,GAAKnF,EAA6B,CAC9C,OAAAwD,GAAQxD,CAAQ,EACT,IACX,CCluBA,MAAMoF,GAAkB7E,GACpB,kBAAkB,KAAKA,CAAI,GAAKA,EAAK,WAAW,SAAS,GAAKA,EAAK,WAAW,MAAM,EAElF8E,GAAkB9E,GACpB,EAAQA,GAAS,CAAC6E,GAAe7E,CAAI,GAAK,CAACA,EAAK,WAAW,GAAG,EAE5D+E,GAAc/E,GAChBA,EAAK,WAAW,GAAG,EAEjBgF,GAAW7qB,GACT,OAAOA,GAAS,UAAY,OAAOA,GAAS,SAAiB,OAAOA,CAAI,EACxE,MAAM,QAAQA,CAAI,EAAUA,EAAK,IAAI6qB,EAAO,EAAE,KAAK,EAAE,EACrDp3C,EAAM,eAA+CusB,CAAI,EAAU6qB,GAAQ7qB,EAAK,MAAM,QAAQ,EAC3F,GAGL8qB,GAAmB9qB,GAA8C,CACnE,GAAI,CAACvsB,EAAM,eAAuCusB,CAAI,EAAG,OACzD,MAAMh1B,EAAQ,oBAAoB,KAAKg1B,EAAK,MAAM,WAAa,EAAE,EACjE,OAAOh1B,GAAA,YAAAA,EAAQ,EACnB,EAEA,SAAS+/C,GAAkB,CAAE,KAAAp9B,EAAM,SAAA4H,GAAoC,CACnE,KAAM,CAACy1B,EAAQC,CAAS,EAAIx3C,EAAM,SAAS,EAAK,EAE1Cy3C,EAAO,IAAM,CACfrqC,GAAgB8M,CAAI,EACpBs9B,EAAU,EAAI,EACd,OAAO,WAAW,IAAMA,EAAU,EAAK,EAAG,IAAI,CAClD,EAEA,OACIx3C,EAAA,cAAC,MAAA,CAAI,UAAU,6DAAA,kBACV,MAAA,CAAI,UAAU,qDAAA,EACXA,EAAA,cAAC,OAAA,CAAK,UAAU,2CAAA,EACX8hB,GAAY,MACjB,EACA9hB,EAAA,cAAC,SAAA,CACG,KAAK,SACL,UAAU,+HACV,QAASy3C,CAAA,EAERF,EAAS,SAAW,MAAA,CAE7B,EACAv3C,EAAA,cAAC,MAAA,CAAI,UAAU,mDACXA,EAAA,cAAC,OAAA,CAAK,UAAW8hB,EAAW,YAAYA,CAAQ,GAAK,MAAA,EAAY5H,CAAK,CAC1E,CACJ,CAER,CAEA,MAAMw9B,GACFC,IACsB,CACtB,GAAI,CAAC,CAAE,UAAAp3C,EAAW,GAAG6C,CAAA,IAAYpD,EAAA,cAAC,KAAA,CAAG,UAAWuB,EAAG,2GAA4GhB,CAAS,EAAI,GAAG6C,EAAO,EACtL,GAAI,CAAC,CAAE,UAAA7C,EAAW,GAAG6C,CAAA,IAAYpD,EAAA,cAAC,KAAA,CAAG,UAAWuB,EAAG,6HAA8HhB,CAAS,EAAI,GAAG6C,EAAO,EACxM,GAAI,CAAC,CAAE,UAAA7C,EAAW,GAAG6C,CAAA,IAAYpD,EAAA,cAAC,KAAA,CAAG,UAAWuB,EAAG,mGAAoGhB,CAAS,EAAI,GAAG6C,EAAO,EAC9K,GAAI,CAAC,CAAE,UAAA7C,EAAW,GAAG6C,CAAA,IAAYpD,EAAA,cAAC,KAAA,CAAG,UAAWuB,EAAG,qGAAsGhB,CAAS,EAAI,GAAG6C,EAAO,EAChL,EAAG,CAAC,CAAE,UAAA7C,EAAW,GAAG6C,CAAA,IAAYpD,EAAA,cAAC,IAAA,CAAE,UAAWuB,EAAG,iCAAkChB,CAAS,EAAI,GAAG6C,EAAO,EAC1G,GAAI,CAAC,CAAE,UAAA7C,EAAW,GAAG6C,CAAA,IAAYpD,EAAA,cAAC,KAAA,CAAG,UAAWuB,EAAG,gCAAiChB,CAAS,EAAI,GAAG6C,EAAO,EAC3G,GAAI,CAAC,CAAE,UAAA7C,EAAW,GAAG6C,CAAA,IAAYpD,EAAA,cAAC,KAAA,CAAG,UAAWuB,EAAG,mCAAoChB,CAAS,EAAI,GAAG6C,EAAO,EAC9G,GAAI,CAAC,CAAE,UAAA7C,EAAW,GAAG6C,CAAA,IAAYpD,EAAA,cAAC,KAAA,CAAG,UAAWuB,EAAG,YAAahB,CAAS,EAAI,GAAG6C,EAAO,EACvF,WAAY,CAAC,CAAE,UAAA7C,EAAW,GAAG6C,CAAA,IACzBpD,EAAA,cAAC,aAAA,CAAW,UAAWuB,EAAG,qFAAsFhB,CAAS,EAAI,GAAG6C,EAAO,EAE3I,MAAO,CAAC,CAAE,UAAA7C,EAAW,GAAG6C,CAAA,oBACnB,MAAA,CAAI,UAAU,+BACXpD,EAAA,cAAC,QAAA,CAAM,UAAWuB,EAAG,iCAAkChB,CAAS,EAAI,GAAG6C,EAAO,CAClF,EAEJ,GAAI,CAAC,CAAE,UAAA7C,EAAW,GAAG6C,CAAA,IAAYpD,EAAA,cAAC,KAAA,CAAG,UAAWuB,EAAG,oDAAqDhB,CAAS,EAAI,GAAG6C,EAAO,EAC/H,GAAI,CAAC,CAAE,UAAA7C,EAAW,GAAG6C,CAAA,IAAYpD,EAAA,cAAC,KAAA,CAAG,UAAWuB,EAAG,6BAA8BhB,CAAS,EAAI,GAAG6C,EAAO,EACxG,GAAI,CAAC,CAAE,UAAA7C,EAAW,GAAG6C,CAAA,IAAYpD,EAAA,cAAC,KAAA,CAAG,UAAWuB,EAAG,qBAAsBhB,CAAS,EAAI,GAAG6C,EAAO,EAChG,EAAG,CAAC,CAAE,UAAA7C,EAAW,KAAA6xC,EAAO,GAAI,QAAA3xC,EAAS,GAAG2C,KACpCpD,EAAA,cAAC,IAAA,CACG,UAAWuB,EACP41C,GAAW/E,CAAI,EACT,gEACA,4EACN7xC,CAAA,EAEJ,KAAA6xC,EACA,OAAQ6E,GAAe7E,CAAI,EAAI,SAAW,OAC1C,IAAK6E,GAAe7E,CAAI,EAAI,aAAe,OAC3C,QAAUroC,GAAU,CAChBtJ,GAAA,MAAAA,EAAUsJ,GACN,CAACA,EAAM,kBAAoB4tC,GAAsBT,GAAe9E,CAAI,IACpEroC,EAAM,eAAA,EACN4tC,EAAmBvF,EAAMroC,CAAK,EAEtC,EACC,GAAG3G,CAAA,CAAA,EAGZ,IAAK,CAAC,CAAE,SAAAxF,KACJoC,EAAA,cAACs3C,IAAkB,KAAMF,GAAQx5C,CAAQ,EAAE,QAAQ,MAAO,EAAE,EAAG,SAAUy5C,GAAgBz5C,CAAQ,EAAG,EAExG,KAAM,CAAC,CAAE,UAAA2C,EAAW,SAAA3C,EAAU,GAAGwF,KACb,OAAO7C,GAAc,UAAYA,EAAU,WAAW,WAAW,EAC7DP,EAAA,cAAC,QAAK,UAAAO,EAAuB,GAAG6C,GAAQxF,CAAS,EAEjEoC,EAAA,cAAC,QAAK,UAAWuB,EAAG,8CAA+ChB,CAAS,EAAI,GAAG6C,CAAA,EAC9ExF,CACL,EAGR,MAAO,CAAC,CAAE,UAAA2C,EAAW,GAAG6C,KACpBpD,EAAA,cAAC,QAAA,CAAM,UAAWuB,EAAG,oBAAqBhB,CAAS,EAAG,SAAQ,GAAE,GAAG6C,CAAA,CAAO,CAElF,GAEA,SAAwBw0C,GAAe,CACnC,QAAA31C,EACA,WAAA7G,EACA,UAAAmF,EACA,UAAA+B,EACA,KAAAu1C,EACA,mBAAAF,CACJ,EAAwB,CAGpB,MAAMG,EAAU93C,EAAM,QAAQ,IAAA,SAAM,OAAA2J,GAAAzD,EAAAjE,EAAQ,MAAM,eAAe,IAA7B,YAAAiE,EAAiC,KAAjC,YAAAyD,EAAqC,QAAQ,CAAC1H,CAAO,CAAC,EACpF81C,EAAgDF,GAAQC,EACxD,CAAE,GAAID,GAAQ,GAAK,OAAOA,GAAA,YAAAA,EAAM,QAASC,CAAA,EACzC,OACNzC,GAAQ0C,CAAa,EAErB,MAAMt8C,EAAoBuE,EAAM,QAC5B,IAAM03C,GAAwBC,CAAkB,EAChD,CAACA,CAAkB,CAAA,EAGvB,uBACK,MAAA,CAAI,UAAWp2C,EAAG,wDAAyDe,EAAW/B,CAAS,CAAA,EAC5FP,EAAA,cAACg4C,GAAA,CACG,cAAe,CAACC,EAAS,EACzB,cAAe,CACXC,GACA,CAACC,GAAwB,CAAE,SAAU,OAAQ,EAC7CC,EAAA,EAEJ,WAAY,CAAE,GAAG38C,EAAmB,GAAGL,CAAA,CAAW,EAEjD6G,CAAA,CAET,CAER,CCxJA,MAAMo2C,GAAa,CAAC,CACH,SAAAz6C,EACA,KAAA8E,EACA,SAAAqnB,EAAiB,OACjB,MAAA8a,EAAiB,OACjB,SAAAC,EAAiB,OAEjB,MAAAjgC,EAAiB,MACjB,IAAAkf,EAAiB,EACjB,IAAAD,EAAiB,OACjB,YAAAw0B,EAAiB,EACjB,MAAA9jC,EAAiB,OACjB,SAAAwwB,EAAiB,GACjB,YAAAY,EAAiB,SAClC,IAAuB,CACnB,KAAM,CAAE,MAAAptC,EAAO,aAAA4xB,CAAA,EAAiBE,GAAe,CAAC,KAAA5nB,EAAM,SAAAqnB,EAAS,EAEzD,CAACliB,EAAQg+B,CAAS,EAAI1nC,EAAAA,SAASm6C,CAAW,EAC1C,CAACC,EAASC,CAAU,EAAIr6C,EAAAA,SAAS,CAAC,EAGlCs6C,EAAO36C,EAAAA,QAAQ,IAAM,OACvB,OAAQoI,EAAA,MAAM,QAAQ1N,CAAK,EAAIA,EAAQ,MAAM,KAAK,CAAE,OAAQurB,CAAA,EAAO,KAAO,CAAA,EAAG,IAArE,YAAA7d,EAAyE,IAAI,CAACpN,EAAGP,IAAUsM,EAAM,SAAS,GAAG,EACnHnM,GAAU,MAAMF,GAAA,YAAAA,EAAQD,GAAQsM,CAAK,EACrCA,EAAQ,KAAOtM,EAAQ,GAC7B,EAAG,CAACC,EAAOqM,EAAOkf,EAAKw0B,CAAO,CAAC,EAEzBn9C,EAAa,OAAOwC,GAAa,WACrCA,EAAS,CAAC,OAAQpF,GAAA,YAAAA,EAAQqP,GAAS,QAASrP,EAAO,aAAcqP,CAAA,CAAO,EACxEjK,EAEI86C,EAAY56C,EAAAA,QAAQ,IACfmlC,GAAkB,CACrB,SAAU7nC,EACV,WAAY,GAAGsH,CAAI,IAAImF,CAAM,GAC7B,UAAW,GAAGnF,CAAI,IAAImF,CAAM,IAAI0wC,CAAO,EAAA,CAC1C,EACF,CAAC1wC,EAAQzM,EAAYsH,EAAM61C,CAAO,CAAC,EAGhCnT,EAAY,IAAM,CACpB,MAAMC,EAAO,MAAM,QAAQ7sC,CAAK,EAC1B,CAAC,GAAGA,EAAO,EAAE,EACb,MAAM,KAAK,CAAE,OAAQigD,EAAK,OAAS,CAAA,EAAK,KAAO,CAAA,EAAG,EACxD5T,GAAA,MAAAA,EAAQQ,GACRjb,EAAa,CAAE,OAAQ,CAAE,KAAM,GAAG1nB,CAAI,IAAI2iC,EAAK,OAAS,CAAC,GAAI,MAAO,CAAA,CAAC,EAAK,EAE1EQ,EAAUR,EAAK,OAAS,CAAC,EACzBmT,EAAWjyC,GAAQA,EAAO,CAAC,CAC/B,EAEMu5B,EAAgBvnC,GAAkB,CACpC,MAAMogD,EAAYF,EAAK,OAAS,EAChC3T,GAAA,MAAAA,EAAWvsC,GAEX6xB,EAAa,CAAE,OAAQ,CAAE,KAAM,GAAG1nB,CAAI,IAAInK,CAAK,EAAA,EAAM,EAElDsP,GAAU8wC,GACT9S,EAAUt/B,GAAQA,EAAO,CAAC,EAE9BiyC,EAAWjyC,GAAQA,EAAO,CAAC,CAC/B,EAIMy/B,EAAYT,GAAWK,CAAW,EAExC,uBACK,MAAA,KACIpxB,GAASxU,EAAA,cAAC,KAAA,KAAIwU,CAAM,EACrBxU,EAAA,cAACgmC,EAAA,CACG,qCACKyS,GAAA,YAAAA,EAAM,IAAI,CAAC5zC,EAAOtM,IACfyH,EAAA,cAAC,KAAA,CAAG,IAAK,GAAG0C,CAAI,IAAInK,CAAK,GAAI,UAAU,wBAAA,EACnCyH,EAAA,cAAC,SAAA,CACE,QAAS,IAAM6lC,EAAUttC,CAAK,EAC9B,UAAW,YAAYA,IAAUsP,EAAS,SAAW,EAAE,EAAA,EAErDhD,CAAA,EAEH,CAACmgC,GAAYyT,EAAK,OAAQ,GAAK10B,GAAOxrB,IAAUsP,GAC9C7H,EAAA,cAACoV,GAAA,CAAa,UAAU,6BAA6B,KAAK,IAC5C,QAAS,IAAM0qB,EAAavnC,CAAK,CAAA,CAAA,CACvD,GAEH,CAACysC,IAAa,CAAClhB,GAAO20B,EAAK,OAAS30B,IAAQ9jB,EAAA,cAAC,KAAA,CAAG,IAAKy4C,EAAK,OAAS,EAAG,UAAU,eAAA,EAC7Ez4C,EAAA,cAACoV,GAAA,CAAa,UAAU,WAAW,KAAK,OAAO,QAASgwB,CAAA,CAAW,CACvE,CACJ,EACA,QAASplC,EAAA,cAAC,MAAA,CAAI,UAAU,6BACnB04C,CACL,CAAA,CAAA,CAER,CAER,ECrGME,OAAoB,IACpBC,OAAoB,IAK1B,MAAMC,EAAS,CAsBX,YAAYC,EAAqB,GAAIC,EAAgC,CApBrE,KAAA,WAAoD,CAAA,EACpD,KAAA,cAAwC,CAAA,EAoBpC,KAAK,WAAqBD,EAEtBC,GACA,OAAO,QAAQA,CAAY,EAAE,QAAQ,CAAC,CAACC,EAAWpY,CAAM,IAAM,CAC1D,KAAK,UAAUA,EAAQoY,CAAS,CACpC,CAAC,CAET,CAzBA,aAAoB,iBAAiBphD,EAAcqhD,EAAoC,CACnF,MAAM1+C,EAAS,MAAMivB,GAAG,KAAK5xB,CAAI,EAC3BshD,EAAe,OAAO3+C,EAAO,MAAS,SAAWA,EAAO,KAAO,GAC/Dw+C,EAAgC,OAAOx+C,EAAO,QAAW,UAAYA,EAAO,SAAW,KACvFA,EAAO,OACP,CAAA,EAEN,OAAKA,EAAO,MACR,QAAQ,KAAK,8DAA8D3C,CAAI,0BAA0B,EAExG2C,EAAO,QACR,QAAQ,KAAK,gEAAgE3C,CAAI,6BAA6B,EAG3G,IAAIihD,GAASK,EAAMH,CAAY,EAAE,IAAIE,CAAM,CACtD,CAYO,QAAQC,EAAoB,CAC/B,YAAK,WAAaA,EACX,IACX,CACO,IAAID,EAAuB,CAC9B,OAAIA,GAAU,CAAC,KAAK,UAAUA,CAAM,GAChC,QAAQ,KAAK,6BAA6BA,CAAM,aAAa,EAG1D,IACX,CACQ,UAAUA,EAAyB,CACvC,GAAIL,GAAW,IAAIK,CAAM,EAAG,CACxB,KAAM,CAAE,WAAAE,EAAY,cAAArlB,CAAA,EAAkB8kB,GAAW,IAAIK,CAAM,EAC3D,YAAK,WAAiBE,EACtB,KAAK,cAAiBrlB,EACf,EACX,KACI,aAAK,WAAiB,CAAA,EACtB,KAAK,cAAiB,CAAA,EACf,EAEf,CAEQ,eAAeslB,EAAmCj2C,EAAa,GAAI,CACvE,MAAMk2C,EAAU/Y,GAAoB8Y,CAAG,EACvC,OAAOC,EAAUA,EAAQl2C,CAAK,EAAI,IACtC,CACO,UAAUy9B,EAAuBqY,EAAgBK,EAAiB,GAAiB,CACtF,GAAIA,GAAS,CAAC,KAAK,UAAUL,CAAM,EAAG,CAClC,SAAW,CAACx2C,EAAM,CAAC,IAAA22C,EAAK,MAAAj2C,EAAQ,EAAC,CAAE,IAAK,OAAO,QAAQy9B,CAAM,EAAG,CAC5D,MAAMla,EAAQ,KAAK,eAAe0yB,EAAKj2C,CAAK,EAC5C,GAAI,CAACujB,EAAO,CACR,QAAQ,KAAK,+CAA+C0yB,CAAG,uBAAuB32C,CAAI,GAAG,EAC7F,QACJ,CACA,KAAK,WAAWA,CAAI,EAAIikB,EAAM,OAAO,CAAC,KAAAjkB,EAAK,EAC3C,OAAO,OAAO,KAAK,cAAeikB,EAAM,YAAYjkB,CAAI,CAAC,CAC7D,CAEAm2C,GAAW,IAAIK,EAAQ,CACnB,WAAY,KAAK,WACjB,cAAe,KAAK,aAAA,CACvB,CACL,CACA,OAAO,IACX,CAEO,OAA4B,CAC/B,OAAKN,GAAc,IAAI,KAAK,UAAU,GAClCA,GAAc,IAAI,KAAK,WAAY,KAAK,qBAAqB,EAG1DA,GAAc,IAAI,KAAK,UAAU,CAC5C,CAEO,kBAAmB,CACtB,OAAO,KAAK,aAChB,CAEO,WAAY,CACf,OAAO,KAAK,UAChB,CAEQ,qBAAqB7nC,EAAuB,CAChD,OAAOA,EAAM,QAAQ,yBAA0B,CAACjY,EAAGX,EAAKK,IAC7C,GAAGL,CAAG,KAAKK,EAAM,MAAM,GACjC,CACL,CAEQ,qBAAqB6U,EAAiC,CAC1D,MAAMmsC,EAA+B,CAAA,EACrC,IAAIb,EAAY,EACZphD,EACJ,MAAMuC,EAAQ,aAEd,KAAQvC,EAAQuC,EAAM,KAAKuT,CAAI,GAAI,CAC/B,MAAM9U,EAAQhB,EAAM,MACdyY,EAAUzY,EAAM,CAAC,EAGnBgB,EAAQogD,GACRa,EAAU,KAAKnsC,EAAK,UAAUsrC,EAAWpgD,CAAK,CAAC,EAEnDogD,EAAYpgD,EAAQhB,EAAM,CAAC,EAAE,OAE7B,MAAMmhD,EAAY,KAAK,WAAW1oC,CAAO,EACrC0oC,IAAc,OACdc,EAAU,KAAKd,CAAS,EAGxB,QAAQ,KAAK,qCAAqC1oC,CAAO,aAAa,CAE9E,CAEA,OAAI2oC,EAAYtrC,EAAK,QACjBmsC,EAAU,KAAKnsC,EAAK,UAAUsrC,CAAS,CAAC,EAGrCa,CACX,CAEQ,KAAKjtB,EAAoC,CAC7C,OAAQA,EAAK,SAAA,CACT,KAAK,KAAK,UAAW,CACjB,MAAMlf,EAAOkf,EAAK,YAClB,OAAOlf,GAAQA,EAAK,KAAA,EAAS,KAAK,qBAAqBA,CAAI,EAAI,CAAA,CACnE,CAEA,KAAK,KAAK,aAAc,CACpB,MAAMjQ,EAAKmvB,EACL8sB,EAAMj8C,EAAG,QAAQ,YAAA,EAEjBs7C,EAA+B7uB,GAAgBwvB,CAA+B,GAAKA,EAEnFj2C,EAAQ,OAAO,YACjB,MAAM,KAAKhG,EAAG,WAAYq8C,GAAQ,CAACA,EAAK,KAAMA,EAAK,KAAK,CAAU,CAAA,EAGhE77C,EAAW,MAAM,KAAKR,EAAG,UAAU,EAAE,QAAQoJ,GAAS,KAAK,KAAKA,CAAK,CAAC,EAE5E,MAAO,CAACxG,EAAM,cAAc04C,EAAWt1C,EAAO,GAAGxF,CAAQ,CAAC,CAC9D,CAEA,QACI,MAAO,CAAA,CAAC,CAEpB,CACQ,qBAA0C,CAE9C,MAAM87C,EADS,IAAI,UAAA,EACA,gBAAgB,KAAK,qBAAqB,KAAK,UAAU,EAAG,UAAU,EAEnFnO,EAAQ,MAAM,KAAKmO,EAAI,UAAU,EAAE,QAAQntB,GAAQ,KAAK,KAAKA,CAAI,CAAC,EACxE,eAAQ,IAAI,QAASgf,CAAK,EACnBvrC,EAAM,cAAcA,EAAM,SAAU,KAAM,GAAGurC,CAAK,CAC7D,CACJ,CAGO,SAASoO,GAAa,CACI,WAAAZ,EACA,WAAA39C,EACA,gBAAAioC,CACJ,EAI1B,CACC,MAAMuW,EAAW97C,EAAAA,QAAQ,IAAM,CAC3B,MAAM+7C,EAAW,IAAIf,GAASC,CAAU,EAAE,UAAU39C,EAAY,SAAS,EAEzE,MAAO,CACH,gBAAiBy+C,EAAS,MAAA,EAC1B,cAAeA,EAAS,iBAAA,CAAiB,CAEjD,EAAG,CAACd,EAAY39C,CAAU,CAAC,EAE3B,uBACKyoC,GAAA,CAAa,gBAAAR,EAAkC,cAAeuW,EAAS,aAAA,EACnEA,EAAS,eACd,CAER,CAGO,SAASE,GAAc,CACI,SAAAD,EACA,eAAAE,EACA,WAAAC,CACJ,EAI3B,CACC,KAAM,CAACvL,EAAMwL,CAAO,EAAI97C,EAAAA,SAGd,IAAI,EAmBd,OAjBAc,EAAAA,UAAU,IAAM,CACZ,MAAMM,EAAa,IAAI,gBAEvB,OAAAu5C,GAAS,iBAAiBe,EAAUE,CAAc,EAAE,KAAMF,GAAa,CAC9Dt6C,EAAW,OAAO,SACnB06C,EAAQ,CACJ,SAAUJ,EAAS,MAAA,EACnB,cAAeA,EAAS,iBAAA,CAAiB,CAC5C,CAET,CAAC,EAEM,IAAM,CACTt6C,EAAW,MAAA,CACf,CACJ,EAAG,CAACs6C,CAAQ,CAAC,EAERpL,EAIAuL,EAKDh6C,EAAA,cAAC6jC,IAAa,gBAAiBmW,EAAY,cAAevL,EAAK,eAC1DA,EAAK,QACV,EANOzuC,EAAA,cAAC,KAAE,UAAW,KAAA,kBAAQ,OAAA,CAAK,UAAU,kGAAA,CAAmG,EAAE,yBAAuB,EAJjKA,EAAA,cAAC,KAAE,UAAW,KAAA,kBAAQ,OAAA,CAAK,UAAU,kGAAA,CAAmG,EAAE,yBAAuB,CAYhL,CClPA,MAAM25B,GAAa,CAAK,CACpB,UAAAugB,EACA,SAAAt8C,EACA,MAAA2zB,EAAQ,OACR,KAAA4oB,EAAO,OACP,SAAAC,EAAW,OACX,SAAAC,EAAW,OACX,IAAAphD,EAAM,OACN,KAAAE,EAAO,OACP,UAAAoH,EAAY,OACZ,UAAA+B,EAAY,OACZ,oBAAAg4C,EAAsB,OACtB,eAAAC,EAAiB,OACjB,MAAAC,EAAQ,OACR,OAAAC,EAAS,MACb,IAA0B,CACtB,MAAMt+C,EAAQ8D,EAAqB,EAE7B,CAACy6C,EAAaC,CAAc,EAAIx8C,EAAAA,SAASg8C,GAAQ,CAAC,EASlDS,EAAYrpB,GAAS2oB,EAAU,OAC/BW,EAAa,KAAK,KAAKX,EAAU,OAASU,CAAS,EAEnD/gB,GAAc6gB,EAAc,GAAKE,EACjC7T,EAAMlN,EAAa+gB,EAEnBhhB,EAAc97B,EAAAA,QAChB,IAAMo8C,EAAU,MAAMrgB,EAAYkN,CAAG,EACrC,CAACmT,EAAWrgB,EAAYkN,CAAG,CAAA,EAGzB+T,EAAMC,GAAc,CAClBA,GAAK,GAAKA,GAAKF,GACfF,EAAeI,CAAC,CAExB,EAEA97C,EAAAA,UAAU,IAAM,EACNq7C,GAAuBn+C,EAAM,WAAW,cAE9C,OAAO,SAAS,CACZ,IAAK,EACL,SAAUo+C,GAAkBp+C,EAAM,WAAW,cAAA,CAChD,CACL,EAAG,CAACu+C,EAAaJ,EAAqBC,CAAc,CAAC,EAErD,MAAMt2B,EAAQnmB,EAAAA,QAAQ,IAAM,CACxB,MAAMgmB,EAAM,KAAK,IAAIs2B,GAAYj+C,EAAM,WAAW,SAAU0+C,CAAU,EAEtE,IAAIl4C,EAAI,KAAK,IAAI,EAAG+3C,EAAc,KAAK,MAAM52B,EAAM,CAAC,CAAC,EACjDzd,EAAI1D,EAAImhB,EAAM,EAElB,OAAIzd,EAAIw0C,IACJx0C,EAAIw0C,EACJl4C,EAAI,KAAK,IAAI,EAAG0D,EAAIyd,EAAM,CAAC,GAGxB,MAAM,KAAK,CAAE,OAAQzd,EAAI1D,EAAI,CAAA,EAAK,CAAC,EAAGzK,IAAMyK,EAAIzK,CAAC,CAC5D,EAAG,CAACwiD,EAAaN,EAAUS,CAAU,CAAC,EAEhCG,EAAeN,IAAgB,EAAI,WAAa,GAChDO,EAAeP,IAAgBG,EAAa,WAAa,GACzDK,EAAgBV,GAASr+C,EAAM,WAAW,MAC1Cg/C,EAAiB,CACnB,MAAO,gBACP,OAAQ,iBACR,IAAK,aAAA,EACPD,CAA2C,GAAK,cAE5CE,EACFp7C,EAAA,cAACM,EAAA,CAAQ,WAAYgC,GAAanG,EAAM,WAAW,YAAcs+C,GAAUt+C,EAAM,WAAW,OAAS,IAAIA,EAAM,WAAW,WAAW,GAAK,IACtI,MAAOs+C,GAAUt+C,EAAM,WAAW,OAAS,CAAC,eAAgB,aAAc,gBAAiB,4BAA8B,CAAA,CAAC,EAEzHlD,EAEAihD,EAAU,OAASU,GAChB56C,EAAA,cAAC,OAAI,aAAW,kBAAkB,UAAW,GAAGO,GAAapE,EAAM,WAAW,SAAS,gBAAgBg/C,CAAc,EAAA,kBAChH,KAAA,CAAG,UAAU,YAAA,EAEVn7C,EAAA,cAAC,KAAA,CAAG,UAAW,mCAAmCg7C,CAAY,EAAA,kBACzD,SAAA,CAAO,QAAS,IAAMF,EAAG,CAAC,EAAG,UAAU,WAAA,kBACnC,OAAA,KAAK,GAAO,CACjB,CACJ,kBAEC,KAAA,CAAG,UAAW,aAAaE,CAAY,EAAA,EACpCh7C,EAAA,cAAC,SAAA,CACG,UAAU,YACV,QAAS,IAAM86C,EAAGJ,EAAc,CAAC,CAAA,EAEjC16C,EAAA,cAAC,YAAK,GAAQ,CAAA,CAEtB,EAECikB,EAAM,IAAKo3B,GACRr7C,EAAA,cAAC,KAAA,CACG,IAAKq7C,EACL,UAAW,aAAaX,IAAgBW,EAAU,SAAW,EAAE,EAAA,EAE/Dr7C,EAAA,cAAC,SAAA,CACG,QAAS,IAAM86C,EAAGO,CAAO,EACzB,UAAU,WAAA,EAETA,CAAA,CACL,CAEP,EAEDr7C,EAAA,cAAC,MAAG,UAAW,iCAAiCi7C,CAAY,EAAA,EACxDj7C,EAAA,cAAC,SAAA,CACG,UAAU,YACV,QAAS,IAAM86C,EAAGJ,EAAc,CAAC,CAAA,EAEjC16C,EAAA,cAAC,YAAK,GAAQ,CAAA,CAEtB,EAEAA,EAAA,cAAC,MAAG,UAAW,aAAai7C,CAAY,EAAA,EACpCj7C,EAAA,cAAC,SAAA,CACG,QAAS,IAAM86C,EAAGD,CAAU,EAC5B,UAAU,WAAA,EAEV76C,EAAA,cAAC,YAAK,GAAO,CAAA,CAErB,CAEJ,CACJ,EAGH7G,CAAA,EAIT,OACI6G,EAAA,cAAAA,EAAA,SAAA,KACKpC,EAASg8B,EAAaC,CAAU,EAChCwgB,EACKz7B,GAAAA,aAAaw8B,EAAKf,CAAQ,EAC1BA,IAAa,QAAae,CACpC,CAER,ECzFME,GAAU,CAAC,CACb,KAAA9oC,EAAO,OACP,OAAA+oC,EAAS,OACT,OAAAzlB,EAAS,OACT,SAAA0lB,EAAW,OACX,QAAA/6C,EAAU,OACV,kBAAA6zB,EAAoB,OACpB,SAAA2B,EAAW,GACX,WAAAC,EAAa,OACb,WAAAulB,EAAa,OACb,QAAAC,EAAU,OACV,QAAAC,EAAU,OACV,aAAAvnB,EAAe,OACf,gBAAAgC,EAAkB,OAClB,IAAAn9B,EAAM,OACN,KAAAE,EAAO,OACP,UAAAmJ,EAAY,OACZ,UAAA/B,EAAY,OACZ,YAAA6E,EAAc,OACd,YAAAkxB,EAAc,OACd,UAAA1Z,EAAY,OACZ,YAAA1T,EAAc,OACd,cAAAqtB,EAAgB,MACpB,IAAoB,CAChB,MAAMp6B,EAAQ8D,EAAkB,EAC1Bu2B,EAAcD,GAAiBp6B,EAAM,QAAQ,cAC7C,CAAC26B,EAAiBC,CAAkB,EAAI54B,EAAAA,SAA6B,IAAI,EACzEs5B,EAAmB1C,cAAaxI,GAAgC,CAC9DA,KAAyBA,CAAI,CACrC,EAAG,CAAA,CAAE,EACCqvB,EAAcH,GAAct/C,EAAM,QAAQ,WAC1C0/C,EAAUH,GAAWv/C,EAAM,QAAQ,QACnC2/C,EAAuC,CACzC,EAAG,IACH,EAAG,UACH,EAAG,SACH,EAAG,OACH,EAAG,SACH,EAAG,MAAA,EAEDC,EAAUD,EAAaF,CAAW,GAAKE,EAAa,CAAC,EACrDE,EAAgB,UAChBC,EAAmB,mBACnBC,EAAY,iBAAiBH,CAAO,MAAMF,EAAU,CAAC,QAAQA,CAAO,IACpEM,EAAiB3pC,GAAQ,CAAA,EACzBkkB,EAAgB54B,EAAAA,QAAQ,IAAM,CAChC,GAAI,CAACm4B,EAAU,OACf,GAAI,OAAOA,GAAa,SAAU,OAAOA,EAEzC,MAAMyY,EAAcl8B,GAAA,YAAAA,EAAO,GAC3B,GAAI,CAACk8B,EAAa,OAElB,MAAM0N,EAAmB,OAAO,KAAK1N,CAAW,EAAE,KAAMv2C,GAAQ,CAACA,EAAI,WAAW,GAAG,CAAC,EACpF,GAAKikD,EAEL,MAAO,CAAE,MAAOA,EAAkB,IAAK,KAAA,CAC3C,EAAG,CAAC5pC,EAAM,OAAOyjB,GAAa,SAAWA,GAAA,YAAAA,EAAU,IAAM,OAAW,OAAOA,GAAa,SAAWA,GAAA,YAAAA,EAAU,MAAQ,OAAWA,CAAQ,CAAC,EACnI8B,EAAqBxC,GAAkC,MAAM,EAC7DhB,EAAeQ,EAAAA,YAAY,CAAC7iB,EAAuB3Z,IAAmBw/B,EAAmB7lB,EAAQ3Z,CAAK,EAAG,CAACw/B,CAAkB,CAAC,EAC7H,CACF,mBAAAnD,EACA,cAAAC,EACA,gBAAAK,CAAA,EACAf,GAAkC,CAClC,QAASgoB,EACT,aAAA/nB,EACA,mBAAoBgC,EACpB,kBAAA9B,EACA,aAAAC,CAAA,CACH,EAEK4D,GAAc,CAAC9xB,EAAkC6L,IAA0B,OAC7E,GAAIskB,EAAa,CACb,MAAM6lB,GAAgB7lB,EAAY,MAAM,KAAK,EAAE,OAAO,OAAO,EAC7D,IAAInoB,GAAiBhI,EAAE,OAEvB,KAAOgI,IAAkB,CAACA,GAAe,UAAU,SAAS,MAAM,GAAG,CACjE,GAAI,CAAC,IAAK,SAAU,QAAS,OAAO,EAAE,SAASA,GAAe,OAAO,EACjE,OAEJA,GAAiBA,GAAe,UACpC,CAEKguC,GAAc,MAAO97C,IAAc8N,GAAe,UAAU,SAAS9N,EAAS,CAAC,IAChF,MAAM,OAAK2F,EAAAmI,GAAe,aAAf,YAAAnI,EAA2B,WAAY,EAAE,EAAE,QAAQo2C,IAAO,CACjEA,GAAI,UAAU,OAAO,GAAGD,EAAa,CACzC,CAAC,EAEDhuC,GAAe,UAAU,IAAI,GAAGguC,EAAa,EAErD,CAEA57C,GAAA,MAAAA,EAAUyR,EACd,EAEMqqC,GAAkBxnB,EAAAA,YAAY,CAAC7iB,EAAuB3Z,IAAkB,CAC1E,MAAMoxB,EAAY4K,EAAariB,EAAQ3Z,CAAK,EACtC48B,GAAWP,EAAmB,SAASjL,CAAS,EAChDiL,EAAmB,OAAQz8B,IAAQA,KAAQwxB,CAAS,EACpD,CAAC,GAAGiL,EAAoBjL,CAAS,EACvCuL,EAAgBC,EAAQ,CAC5B,EAAG,CAACP,EAAoBL,EAAcW,CAAe,CAAC,EAEhDsnB,EAAW,CAAC12C,EAAqBvN,IAA8B,QACjE,MAAMkkD,EAAa32C,EAAK,IAExB,OAAI22C,GAAcz8C,EAAM,eAAey8C,CAAU,EACtCz8C,EAAM,aAAay8C,EAAY,CAClC,UAAWl7C,EAAG,2CAA4Ck7C,EAAW,MAAM,SAAS,EACpF,MAAO,CACH,GAAIA,EAAW,MAAM,OAAS,CAAA,EAC9B,cAAav2C,GAAAu2C,EAAW,MAAM,QAAjB,YAAAv2C,GAAwB,cAAe,UACpD,OAAQzF,EAAU,UAAY,SAAA,EAElC,QAASA,EAAY4F,IAA0C,WAC3D8xB,GAAY9xB,GAAGP,CAAI,GACnB6D,IAAAzD,GAAAu2C,EAAW,OAAM,UAAjB,MAAA9yC,GAAA,KAAAzD,GAA2BG,GAC/B,EAAKo2C,EAAW,MAAM,OAAA,CACzB,EAIDz8C,EAAA,cAAC,MAAA,CACG,UAAU,2CACV,IACI8F,EAAK,UACCA,EAAK,SAAWA,EAAK,UACrB,6FAEV,IAAKA,EAAK,KACV,MAAOA,EAAK,MACZ,OAAQA,EAAK,OACb,MAAO,CAAE,YAAa,UAAW,OAAQrF,EAAU,UAAY,SAAA,EAC/D,QAASA,EAAY4F,IAA0C8xB,GAAY9xB,GAAGP,CAAI,EAAK,MAAA,CAAA,CAGnG,EAEM42C,GAAwBz6C,GACtBjC,EAAM,eAAeiC,CAAO,EAAUA,EAGtCjC,EAAA,cAAC,OAAA,CAAK,UAAU,iEAAA,EACZA,EAAA,cAAC+B,IAAa,MAAOE,EAAS,UAAU,eAAA,CAAgB,CAC5D,EAIF06C,GAAgB,CAClB16C,EACAzB,EACAg6C,EAA0B,OAC1Bj6C,KAEAP,EAAA,cAAC,MAAA,CACG,UAAWuB,EACP,6EACAi5C,IAAU,QAAU,aAAe,YACnCj6C,EAAA,EAEJ,MAAO,CACH,MAAO07C,EACP,SAAUA,EACV,cAAe,OACf,GAAGz7C,CAAA,CACP,EAECk8C,GAAqBz6C,CAAO,CAAA,EAI/B26C,GAAkH,CACpH,QAAS,CAAE,MAAO,CAAE,KAAMZ,EAAe,IAAKA,EAAc,EAC5D,SAAU,CAAE,MAAO,CAAE,MAAOA,EAAe,IAAKA,CAAA,EAAiB,MAAO,OAAA,EACxE,WAAY,CAAE,MAAO,CAAE,OAAQA,EAAe,KAAMA,EAAc,EAClE,YAAa,CAAE,MAAO,CAAE,OAAQA,EAAe,MAAOA,CAAA,EAAiB,MAAO,OAAA,EAC9E,WAAY,CAAE,MAAO,CAAE,KAAMA,EAAe,IAAK,MAAO,UAAW,mBAAmB,EACtF,YAAa,CAAE,MAAO,CAAE,MAAOA,EAAe,IAAK,MAAO,UAAW,kBAAA,EAAsB,MAAO,OAAA,CAAQ,EAGxGa,GAAiB,CAACC,EAAyBh3C,EAAqBvN,IAC7DukD,EAAQ,KACT,OAAOA,EAAQ,MAAS,WAAmBA,EAAQ,KAAKh3C,EAAMvN,CAAK,EAEhE,OAAO,QAAQukD,EAAQ,IAAI,EAAE,MAAM,CAAC,CAAC3kD,GAAKK,EAAK,IAAMsN,EAAK3N,EAAG,IAAMK,EAAK,EAHrD,GAMxBukD,GAAoB,CAACD,EAAyBh3C,EAAqBvN,IACjEukD,EAAQ,OAAeA,EAAQ,OAAOh3C,EAAMvN,CAAK,EACjD,OAAOukD,EAAQ,OAAU,WAAmBA,EAAQ,MAAMh3C,EAAMvN,CAAK,EAClEukD,EAAQ,MAGbE,GAAqB,CAACl3C,EAAqBvN,IACxCijD,GAAA,MAAAA,EAAU,OAERA,EAAS,IAAI,CAACsB,EAASG,KAAiB,CAC3C,GAAI,CAACH,EAAQ,UAAY,CAACD,GAAeC,EAASh3C,EAAMvN,CAAK,EAAG,OAAO,KAEvE,MAAM0J,GAAU86C,GAAkBD,EAASh3C,EAAMvN,CAAK,EACtD,GAA6B0J,IAAY,MAAQA,KAAY,GAAO,OAAO,KAE3E,MAAM8G,GAAW6zC,GAAsBE,EAAQ,QAAQ,EACvD,OAAK/zC,mBAGA/I,EAAM,SAAN,CAAe,IAAK,GAAG88C,EAAQ,QAAQ,IAAIG,EAAY,EAAA,EACnDN,GAAc16C,GAAS8G,GAAS,MAAOA,GAAS,MAAO+zC,EAAQ,SAAS,CAC7E,EALkB,IAO1B,CAAC,EAhB6B,KAmB5BI,GAAa,CAACn4C,EAA+BxM,EAAeuN,IAAwB,CACtF,MAAM6jB,GAAY4K,EAAazuB,EAAMvN,CAAK,EACpCuhC,GAAalF,EAAmB,SAASjL,EAAS,EAClD0yB,IAAgB7lB,GAAA,YAAAA,EAAa,MAAM,OAAO,OAAO,WAAY,CAAA,EAEnE,OACAx2B,EAAA,cAAC,MAAA,CACG,IAAKzH,EACL,UAAWgJ,EAAG,eAAgBu4B,IAAcuiB,EAAa,EACzD,MAAO,CACH,KAAM,OAAOH,CAAS,GACtB,SAAUA,CAAA,CACd,EAEAl8C,EAAA,cAAC,OAAI,UAAU,qCAAA,EACV60B,GACG70B,EAAA,cAAC,QAAA,CAAM,UAAU,kGAAA,EACbA,EAAA,cAAC,QAAA,CACG,KAAK,WACL,aAAY,eAAe2pB,EAAS,GACpC,QAASmQ,GACT,SAAU,IAAMyiB,GAAgBz2C,EAAMvN,CAAK,EAC3C,QAAUwR,IAAUA,GAAM,gBAAA,CAAgB,CAAA,CAElD,EAEHhF,EACAi4C,GAAmBl3C,EAAMvN,CAAK,CACnC,CAAA,CAGR,EAEM4kD,GAAY,CAAC3qC,EAAuBrY,IAAqD,CAC3F,MAAMijD,EAA6F,CAAA,EAEnG5qC,OAAAA,EAAK,QAAQ,CAAC1M,GAAMvN,KAAU,CAC1B,MAAMkkD,GAAaD,EAAS12C,EAAW,EACjC+Q,GAAM4lC,GAAW,MAAM,KAAO,GAC9BhtC,GAAMgtC,GAAW,MAAM,KAAO,GACpC,GAAI,CAAC5lC,IAAO,CAACpH,GAAK,OAElB,KAAM,CAAC4tC,EAAQ,EAAI3kD,GAAU,WAAWme,GAAI,YAAA,EAAe1c,EAAM,MAAM,EACjEmjD,GAAWD,IAAY,QAExBD,EAASE,EAAQ,IAAGF,EAASE,EAAQ,EAAI,CAAA,GAC9CF,EAASE,EAAQ,EAAE,KAAK,CAAE,MAAOb,GAAY,KAAA32C,GAAM,MAAAvN,GAAO,CAC9D,CAAC,EAEM,OAAO,QAAQ6kD,CAAQ,EAAE,IAAI,CAAC,CAACG,GAAWzX,EAAK,KAClD,CACI,KAAM,QACN,QACI9lC,EAAA,cAAC,UAAA,CAAQ,IAAKu9C,GAAW,UAAU,yDAC/Bv9C,EAAA,cAAC,KAAA,CAAG,UAAU,4EACTu9C,GAAU,aACf,kBACC,MAAA,CAAI,UAAWh8C,EAAG,8BAA+B,YAAcs6C,CAAO,EAAG,MAAO,CAAE,IAAKE,IACnFjW,GAAM,IAAI,CAAC,CAAE,MAAAllB,GAAO,KAAA9a,GAAM,MAAAvN,EAAA,IAAY2kD,GAAWt8B,GAAOroB,GAAOuN,EAAI,CAAC,CACzE,CACJ,CAAA,EAGX,CACL,EAEM03C,GAAe1/C,EAAAA,QAAQ,IAAM,CAC/B,GAAI,CAAC,MAAM,QAAQ0U,CAAI,EAAG,OAE1B,MAAMirC,EAAcvwB,GAAM,QAAQ1a,EAAMkkB,CAAa,GAAK,CAAA,EAE1D,OAAOilB,EACDwB,GAAUM,EAAa9B,CAAO,EAC9B8B,EAAY,IAAI,CAAC33C,EAAMvN,KAAW,CAAE,KAAM,OAAQ,MAAOikD,EAAS12C,CAAW,EAAG,KAAAA,EAAM,MAAAvN,GAAiC,CACjI,EAAG,CAACq8B,EAAoBpiB,EAAMmpC,EAASH,EAAU9kB,EAAe6lB,EAAe,CAAC,EAEhF,OAAIiB,KAAiB,OACVx9C,EAAA,cAAC,KAAE,UAAW,KAAA,kBAAQ,OAAA,CAAK,UAAU,kGAAA,CAAmG,EAAE,yBAAuB,EACjKw9C,GAAa,SAAW,EACxBx9C,EAAA,cAAC,IAAA,CAAE,UAAW,KAAA,EAAO,qBAAmB,EAI/CA,EAAA,cAAC,OAAI,UAAWuB,EAAG,2BAA4Be,GAAanG,EAAM,QAAQ,SAAS,CAAA,EAC9ElD,GAAO+G,EAAA,cAAC,MAAA,CAAI,UAAU,qDAAA,EAAuD/G,CAAI,EAClF+G,EAAA,cAACM,EAAA,CAAQ,UAAWiB,EAAG,+BAAgChB,GAAapE,EAAM,QAAQ,SAAS,GACtFo/C,GAAUv7C,EAAA,cAAC,OAAI,UAAWoF,GAAejJ,EAAM,QAAQ,WAAA,EAAco/C,CAAO,EAC7Ev7C,EAAA,cAACM,GAAQ,UAAWiB,EAAG,iBAAkB+0B,GAAen6B,EAAM,QAAQ,WAAW,CAAA,EAC7E6D,EAAA,cAAC25B,GAAA,CACG,UAAW6jB,GACX,SAAU1mB,EACV,UAAU,iBACT,GAAIZ,GAAc,CAAA,CAAC,EAEnB,CAAC0D,EAAaC,IACX75B,EAAA,cAAC,MAAA,CAAI,UAAU,OACXA,EAAA,cAAC,MAAA,CACG,UAAW,oDAAsD67C,EAAU,KAAOj/B,GAAazgB,EAAM,QAAQ,WAC7G,MAAO,CAAE,IAAK4/C,CAAA,CAAQ,EAErBniB,EAAY,IAAK1nB,GACdA,EAAO,OAAS,QACVA,EAAO,QACPgrC,GAAWhrC,EAAO,MAAOA,EAAO,MAAOA,EAAO,IAAI,CAC3D,CAAA,CAET,CAAA,CAGZ,EACAlS,EAAA,cAAC,MAAA,CAAI,IAAKy3B,EAAkB,UAAU,SAAA,CAAU,EAC/C3B,GAAU91B,EAAA,cAAC,MAAA,CAAI,UAAWkJ,GAAe/M,EAAM,QAAQ,WAAA,EAAc25B,CAAO,CACjF,EACC38B,GAAQ6G,EAAA,cAAC,MAAA,CAAI,UAAU,sDAAA,EAAwD7G,CAAK,CACzF,CACR,ECnZA,SAASukD,GAA6C,CAClD,QAAAv0B,EACA,SAAAmkB,EACA,SAAArX,EACA,WAAAC,EACA,UAAAiZ,EAAY,GACZ,aAAA/a,EACA,kBAAAE,EACA,WAAA8a,EACA,QAAAuM,EACA,UAAAr5C,CACJ,EAAkC,CAC9B,MAAMiyB,EAAez2B,EAAAA,QAAQ,IAAM+vC,GAAqBP,CAAQ,EAAG,CAACA,CAAQ,CAAC,EACvE+B,EAAcvxC,EAAAA,QAAQ,IACjBqrB,EAAQ,OAA6B,CAAClxB,EAAKia,KAC9Cja,EAAI,IAAIs8B,EAAariB,CAAM,EAAGA,CAAM,EAC7Bja,GACR,IAAI,GAAK,EACb,CAACs8B,EAAcpL,CAAO,CAAC,EAE1B,OACInpB,EAAA,cAACs7C,GAAA,CACG,KAAMnyB,EACN,SAAA8M,EACA,WAAAC,EACA,aAAciZ,EAAY/a,EAAe,OACzC,kBAAmB+a,EAAa/Z,GAAkB,CAC9C,IAAIoa,EAAiBpa,EAAc,KAC/Bma,EAAoBna,EAAc,QAEtC,GAAI+Z,IAAc,UAAY/Z,EAAc,KAAK,OAAS,EAAG,CACzD,MAAMqa,EAAUra,EAAc,KAAKA,EAAc,KAAK,OAAS,CAAC,EAChEoa,EAAiBC,EAAU,CAACA,CAAO,EAAI,CAAA,EACvCF,EAAoBE,EAAWJ,EAAY,IAAII,CAAO,EAAI,CAACJ,EAAY,IAAII,CAAO,CAAE,EAAI,CAAA,EAAM,CAAA,CAClG,CAEA,MAAMv6B,EAAuC,CACzC,KAAMs6B,EACN,QAASD,EACT,aAAcC,EAAe,OAAS,EACtC,MAAO,IAAMlb,GAAA,YAAAA,EAAoB,CAC7B,KAAM,CAAA,EACN,QAAS,CAAA,EACT,aAAc,GACd,MAAO,IAAA,EAAM,EAChB,EAELA,GAAA,MAAAA,EAAoBpf,EACxB,EAAI,OACJ,QAASk6B,EAAcl9B,GAAWk9B,EAAWl9B,CAAiB,EAAI,OAClE,QAAAypC,EACA,UAAAr5C,CAAA,CAAA,CAGZ,CCZA,SAASq7C,GAA4C,CACjD,QAAA/O,EACA,KAAAH,EACA,UAAAmP,EACA,gBAAAC,EACA,SAAAvQ,EACA,WAAAwQ,EACA,GAAAr0B,EACA,OAAAzM,EACA,SAAAC,EACA,cAAA8gC,EACA,gBAAAC,EACA,MAAAC,EAAQ,EACZ,EAAgC,CAC5B,MAAMjkC,EAAWC,GAAAA,YAAA,EACX3E,EAAWC,GAAAA,YAAA,EACX2oC,EAAU3zB,EAAAA,MAAA,EACV2gB,EAAUz+B,EAAAA,OAA4B,MAAS,EAC/C8nB,EAAez2B,EAAAA,QAAQ,IAAM+vC,GAAqBP,CAAQ,EAAG,CAACA,CAAQ,CAAC,EACvE6Q,EAAoBrgD,EAAAA,QAAQ,IAAM6wC,GAAiBC,EAAS,CAAC,CAACH,CAAI,EAAG,CAACG,EAASH,CAAI,CAAC,EACpF,CAAC2P,EAAcC,CAAe,EAAIlgD,EAAAA,SAA2C,IAAI,EACjFmgD,EAAaxgD,EAAAA,QAAQ,IAEhB,GAAG8vC,GADOkQ,GAAc,cACI,CAAC,IAAIlQ,GAAiBsQ,CAAO,CAAC,GAClE,CAACA,EAASJ,CAAU,CAAC,EAElBS,EAAQxpB,EAAAA,YAAY,IAAM,CAC5BspB,EAAgB,IAAI,EACpBnT,EAAQ,QAAU,OACd0S,GAAA,MAAAA,EAAW,MAAQ5jC,EAAS,KAAK,WAAW,IAAIskC,CAAU,GAAG,GAC7DhpC,EAAS,CAAE,SAAU0E,EAAS,SAAU,OAAQA,EAAS,OAAQ,KAAM,EAAA,EAAM,CAAE,QAAS,GAAM,CAEtG,EAAG,CAACskC,EAAYtkC,EAAS,KAAMA,EAAS,SAAUA,EAAS,OAAQ1E,EAAUsoC,GAAA,YAAAA,EAAW,IAAI,CAAC,EAEvFY,EAAezpB,EAAAA,YAAY,MAAO7iB,EAAiBusC,EAAiB,KAAS,CAC/E,MAAM9a,EAAc1mB,EACd,MAAMA,EAAS,CAAE,OAAA/K,CAAA,CAAQ,EACzB4rC,EACI,GAAGA,CAAU,IAAIvpB,EAAariB,CAAM,CAAC,GACrC,OACV,GAAI,CAACyxB,GAAe,CAAC1mB,EAAU,MAAO,GAClC0mB,GAAa,MAAMla,EAAG,OAAOka,CAAW,EAC5C,MAAMnpC,EAAS,MAAMujD,GAAA,YAAAA,EAAgB,CAAE,OAAA7rC,EAAQ,OAAQ,QAAA,KAAe,GACtE,OAAI1X,GAAUikD,GAAgBF,EAAA,EACvB/jD,CACX,EAAG,CAAC+jD,EAAO90B,EAAI8K,EAAcwpB,EAAe9gC,EAAU6gC,CAAU,CAAC,EAE3DY,EAAoB3pB,EAAAA,YAAY,SAAA,OAClC,QAAA7uB,EAAAglC,EAAQ,UAAR,YAAAhlC,EAAiB,WAAW,CAAE,eAAgB,IAAA,EAAM,KAAuD,IAC5G,CAAA,CAAE,EAECgoC,EAAYnZ,EAAAA,YAAY,MAAOuZ,EAAmBp8B,IAAqB,CACzE,MAAMqU,EAAS43B,EAAkB7P,CAAS,EAE1C,GADI,CAAC/nB,GACD,CAACuoB,GAAgBvoB,EAAQrU,CAAM,GAAK68B,GAAiBxoB,EAAQrU,CAAM,EAAG,OAE1E,MAAMjN,EAA8C,CAChD,UAAAqpC,EACA,OAAAp8B,EACA,UAAWA,EAASqiB,EAAariB,CAAM,EAAI,OAC3C,SAAUA,GAAA,YAAAA,EAAQ,OAClB,YAAa,CAACA,EACd,MAAAqsC,EACA,KAAMG,EACN,OAAQ,SACCxsC,EACEssC,EAAatsC,EAAQ,EAAI,EADZ,GAGxB,UAAW,CAACysC,EAAuBlc,IAAyByL,EAAUyQ,EAAelc,CAAU,CAAA,EAGnG,GAAIlc,EAAO,OAAS,QAAS,CACzB,MAAMzuB,EAAS,OAAOyuB,EAAO,IAAO,WAAaA,EAAO,GAAGthB,CAAO,EAAIshB,EAAO,GAC7EjR,EAASxd,CAAM,EACf,MACJ,CAEA,GAAIyuB,EAAO,OAAS,WAAY,CAC5B,MAAMzuB,EAAS,OAAOyuB,EAAO,MAAS,WAAaA,EAAO,KAAKthB,CAAO,EAAIshB,EAAO,KACjF,OAAO,KAAKzuB,EAAQ,SAAU,qBAAqB,EACnD,MACJ,CAEA,GAAIyuB,EAAO,OAAS,SAAU,CAC1B,MAAMA,EAAO,IAAIthB,CAAO,EACxB,MACJ,CAEIqpC,IAAc,SAAUsP,GAAA,MAAAA,EAAW,OAAQ1rC,GAC3CoD,EAAS,CAAE,KAAM,GAAGgpC,CAAU,IAAI,mBAAmB/pB,EAAariB,CAAM,CAAC,CAAC,EAAA,EAAM,CAAE,QAAS,GAAO,EAGtGmsC,EAAgB,CAAE,UAAA/P,EAAW,OAAAp8B,EAAQ,CACzC,EAAG,CAACqsC,EAAOhqB,EAAc+pB,EAAYhpC,EAAU6oC,EAAmBK,EAAcZ,GAAA,YAAAA,EAAW,KAAMc,CAAiB,CAAC,EAE7GE,EAAmB7pB,EAAAA,YAAY,CAACuZ,EAAmBp8B,KAAkD,CACvG,UAAAo8B,EACA,OAAAp8B,EACA,UAAWA,EAASqiB,EAAariB,CAAM,EAAI,OAC3C,SAAUA,GAAA,YAAAA,EAAQ,OAClB,YAAa,CAACA,EACd,UAAW,CAACysC,EAAuBlc,IAAyByL,EAAUyQ,EAAelc,CAAU,CAAA,GAC/F,CAAClO,EAAc2Z,CAAS,CAAC,EAEvB2Q,EAAiB9pB,cAAY,MAAOuZ,GAAsB,CAC5D,MAAMp8B,EAASksC,GAAA,YAAAA,EAAc,OAE7B,GAAI9P,IAAc,SAAU,CACxBiQ,EAAA,EACA,MACJ,CAEA,GAAIjQ,IAAc,OAAQ,CACtB,MAAMoQ,EAAA,EACN,MACJ,CAEA,GAAIpQ,IAAc,SAAU,CACxB,GAAI,CAACp8B,EAAQ,OACb,MAAMssC,EAAatsC,EAAQ,EAAI,EAC/B,MACJ,CAEA,MAAMg8B,EAAUI,EAAWp8B,CAAM,CACrC,EAAG,CAACksC,GAAA,YAAAA,EAAc,OAAQG,EAAOC,EAActQ,EAAWwQ,CAAiB,CAAC,EAEtEI,EAAwB/pB,EAAAA,YAAY,CAACuZ,EAAmBp8B,KAAuD,CACjH,UAAAo8B,EACA,OAAAp8B,EACA,UAAWA,EAASqiB,EAAariB,CAAM,EAAI,OAC3C,SAAUA,GAAA,YAAAA,EAAQ,OAClB,YAAa,CAACA,EACd,UAAYysC,GAA0B,CAC7BE,EAAeF,CAAa,CACrC,CAAA,GACA,CAACpqB,EAAcsqB,CAAc,CAAC,EAElC5/C,EAAAA,UAAU,IAAM,CACZ,GAAI,EAAC2+C,GAAA,MAAAA,EAAW,MAAM,OAEtB,MAAMmB,EAAO/kC,EAAS,KAAK,QAAQ,KAAM,EAAE,EACrC3D,EAAS,GAAGioC,CAAU,IAC5B,GAAI,CAACS,EAAK,WAAW1oC,CAAM,EAAG,EACtB+nC,GAAA,YAAAA,EAAc,aAAc,QAAQC,EAAgB,IAAI,EAC5D,MACJ,CAEA,MAAMW,EAAmB,mBAAmBD,EAAK,MAAM1oC,EAAO,MAAM,CAAC,EAC/DosB,EAAaob,EAAgB,KAAM3rC,GAAWqiB,EAAariB,CAAM,IAAM8sC,CAAgB,EACzFvc,GACA4b,EAAiB7+C,IACbA,GAAA,YAAAA,EAAS,aAAc,QAAUA,EAAQ,QAAU+0B,EAAa/0B,EAAQ,MAAM,IAAMw/C,EAC9Ex/C,EACA,CAAE,UAAW,OAAQ,OAAQijC,EACtC,CAET,EAAG,CAAC2b,GAAA,YAAAA,EAAc,UAAW7pB,EAAc+pB,EAAYtkC,EAAS,KAAM6jC,EAAiBD,GAAA,YAAAA,EAAW,IAAI,CAAC,EAEvG,MAAMqB,EAAqBb,EAAeD,EAAkBC,EAAa,SAAS,EAAI,OAEhFc,EAAmBphD,EAAAA,QAAQ,IAAM,CACnC,GAAI,CAACsgD,GAAgB,CAACa,EAAoB,OAAO,KACjD,MAAME,EAAgBP,EAAiBR,EAAa,UAAWA,EAAa,MAAM,EAC5EgB,EAAeN,EAAsBV,EAAa,UAAWA,EAAa,MAAM,EAEtF,GAAIa,EAAmB,OAAS,SAC5B,OAAI,OAAOA,EAAmB,MAAS,WAAmBA,EAAmB,KAAKG,CAAY,EAC1FH,EAAmB,OAAS,OAAkBA,EAAmB,qBAEhE,MAAA,CAAI,UAAU,aACXj/C,EAAA,cAAC,IAAA,KAAE,qBAAmB,EACrBo+C,EAAa,QAAUp+C,EAAA,cAAC,KAAE,UAAU,+BAAA,EAAiCu0B,EAAa6pB,EAAa,MAAM,CAAE,CAC5G,EAIR,IAAKA,EAAa,YAAc,OAASA,EAAa,YAAc,SAAW3P,EAAM,CACjF,MAAM4Q,EAAWJ,EAAmB,OAAS,SAAWA,EAAmB,OAAS,OAC7E,OAAOA,EAAmB,MAAS,WAChCA,EAAmB,KAAKG,CAAY,EACpCH,EAAmB,KACtB,OAAOxQ,GAAS,WACbA,EAAK,CAAE,GAAG0Q,EAAe,OAAQf,EAAa,MAAA,CAAQ,EACtD3P,EACV,OAAKzuC,EAAM,eAAeq/C,CAAQ,EAG9Br/C,EAAA,cAACghC,GAAA,CACG,OAAO,QACP,cAAeod,EAAa,OAC5B,IAAKH,EACL,OAAQjhC,EAAS,MAAO,CAAE,OAAA9K,EAAQ,OAAAqU,EAAQ,YAAAod,CAAA,IACtC3mB,EAAO,CACH,OAAA9K,EACA,OAAAqU,EACA,YAAAod,CAAA,CACH,EACD,OACJ,SAAU1mB,EAAW,MAAO,CAAE,OAAA/K,CAAA,IAC1B+K,EAAS,CACL,OAAA/K,CAAA,CACH,EACD,OACJ,UAAW,MAAO,CAAE,OAAAA,EAAQ,OAAAqU,KAAa,CACrC,MAAM+4B,EAAU,MAAMvB,GAAA,YAAAA,EAAgB,CAAE,OAAA7rC,EAAuC,OAAAqU,CAAA,KAAa,GAC5F,OAAI+4B,GAASf,EAAA,EACNe,CACX,EACA,SAAU,CAAC,CAAE,OAAAptC,KAAa,CACtB,GAAI,CAAC4rC,EAAY,OACjB,MAAMyB,EAAertC,EACf0jB,GAAUooB,GAAA,YAAAA,EAAkBuB,KAAiBhrB,EAAagrB,CAAY,GAAK,GAAG,KAAK,IAAA,CAAK,GAC9F,MAAO,GAAGzB,CAAU,IAAIloB,CAAO,EACnC,EACA,IAAM1O,GAAQ,CAAEgkB,EAAQ,QAAUhkB,GAAO,MAAW,CAAA,EAEnDm4B,CAAA,EAhCmCA,CAmChD,CAEA,OAAIJ,EAAmB,OAAS,SAAWA,EAAmB,OAAS,OAC5D,OAAOA,EAAmB,MAAS,WACpCA,EAAmB,KAAKG,CAAY,EACpCH,EAAmB,KAGtB,IACX,EAAG,CAACb,EAAca,EAAoBhB,EAAOM,EAAOP,EAAiBvP,EAAMmQ,EAAkBE,EAAuBvqB,EAAcwpB,EAAe9gC,EAAUD,EAAQ8gC,CAAU,CAAC,EAE9K,MAAO,CACH,kBAAAK,EACA,aAAAC,EACA,mBAAAa,EACA,iBAAAC,EACA,WAAWd,GAAA,YAAAA,EAAc,aAAc,QAAUA,EAAa,OAAS7pB,EAAa6pB,EAAa,MAAM,EAAI,KAC3G,UAAAlQ,EACA,eAAA2Q,EACA,MAAAN,EACA,iBAAAK,EACA,sBAAAE,EACA,aAAAvqB,EACA,QAAA2W,EACA,WAAAoT,CAAA,CAER,CC1RA,SAASkB,GAA4C,CACjD,QAAAvR,EACA,QAAA9kB,EACA,KAAAslB,CACJ,EAAgC,CAC5B,OAAO3wC,UAAQ,IAAM0wC,GAAaP,EAAS9kB,EAASslB,CAAI,EAAG,CAACR,EAASQ,EAAMtlB,CAAO,CAAC,CACvF,CCRA,SAASs2B,GAAoD,CACzD,QAAAt2B,EACA,iBAAAu2B,CACJ,EAAwC,CACpC,KAAM,CAAC7B,EAAiB8B,CAAkB,EAAIxhD,EAAAA,SAAoBgrB,CAAO,EACnE,CAACy2B,EAASC,CAAU,EAAI1hD,EAAAA,SAAS,EAAK,EAE5Cc,OAAAA,EAAAA,UAAU,IAAM,CACZ,GAAI,CAACygD,EAAkB,CACnBC,EAAmBx2B,CAAO,EAC1B02B,EAAW,EAAK,EAChB,MACJ,CAEA,IAAIh4C,EAAS,GACb,MAAMw9B,EAAOqa,EAAiB7uC,GAAUsY,CAAO,CAAC,EAChD,GAAIkc,aAAgB,QAChB,OAAAwa,EAAW,EAAI,EACfxa,EACK,KAAMliC,GAAa,CACZ0E,KAA2B1E,CAAQ,CAC3C,CAAC,EACA,QAAQ,IAAM,CACP0E,KAAmB,EAAK,CAChC,CAAC,EACE,IAAM,CACTA,EAAS,EACb,EAGJ83C,EAAmBta,CAAI,EACvBwa,EAAW,EAAK,CACpB,EAAG,CAAC12B,EAASu2B,CAAgB,CAAC,EAEvB,CACH,gBAAA7B,EACA,QAAA+B,CAAA,CAER,CCrCA,SAASE,GAA8C,CACnD,aAAA1rB,EACA,oBAAA2rB,EACA,kBAAAzrB,CACJ,EAAkC,CAC9B,KAAM,CAACI,EAAsBC,CAAuB,EAAIx2B,EAAAA,SAAmB4hD,GAAuB,CAAA,CAAE,EAC9F,CAACC,EAAyBC,CAA0B,EAAI9hD,EAAAA,SAAoB,CAAA,CAAE,EAEpFc,EAAAA,UAAU,IAAM,CACRm1B,IAAiB,QAAWO,EAAwBP,CAAY,CACxE,EAAG,CAACA,CAAY,CAAC,EAEjB,MAAM8rB,EAAsB9rB,GAAgBM,EAEtCW,EAAiBN,EAAAA,YAAY,IAAM,CACjCX,IAAiB,QACjBO,EAAwB,CAAA,CAAE,EAE9BsrB,EAA2B,CAAA,CAAE,EAC7B3rB,GAAA,MAAAA,EAAoB,CAAE,KAAM,CAAA,EAAI,QAAS,CAAA,EAAI,aAAc,GAAO,MAAO,IAAA,IAC7E,EAAG,CAACA,EAAmBF,CAAY,CAAC,EAE9BkB,EAAiBx3B,EAAAA,QAAqC,KAAO,CAC/D,KAAMoiD,EACN,QAASF,EACT,aAAcE,EAAoB,OAAS,EAC3C,MAAO7qB,CAAA,GACP,CAAC6qB,EAAqB7qB,EAAgB2qB,CAAuB,CAAC,EAE5DG,EAAwBprB,cAAaK,GAA+C,CAClFhB,IAAiB,QACjBO,EAAwBS,EAAc,IAAI,EAE9C6qB,EAA2B7qB,EAAc,OAAO,EAChDd,GAAA,MAAAA,EAAoBc,EACxB,EAAG,CAACd,EAAmBF,CAAY,CAAC,EAEpC,MAAO,CACH,oBAAA8rB,EACA,eAAA5qB,EACA,sBAAA6qB,CAAA,CAER,CCxBA,MAAMC,GAAmB,CACrB9R,EACA/nB,EACAthB,KAEIshB,GAAA,YAAAA,EAAQ,QAAS,SACb,OAAOA,EAAO,OAAU,WAAmBA,EAAO,MAAMthB,CAA0C,EAC/FshB,EAAO,OAAS,iBAEvBA,GAAA,YAAAA,EAAQ,QAAS,QACb,OAAOA,EAAO,OAAU,WAAmBA,EAAO,MAAMthB,CAA0C,EAC/FshB,EAAO,OAASyoB,GAAeV,EAAW/nB,CAAM,EAEpDyoB,GAAeV,EAAW/nB,CAAM,EAG3C,SAASonB,GAAsC,CAC3C,QAAAxkB,EACA,SAAAmkB,EACA,WAAAwQ,EACA,QAAA7P,EACA,QAAAW,EACA,KAAAH,EACA,UAAAmP,EACA,OAAAn1C,EACA,OAAAC,EACA,OAAAq8B,EAAS,QACT,OAAA0V,EACA,UAAAn4C,EACA,QAAAs9C,EAAU,GACV,MAAAprC,EACA,SAAAyhB,EAAW,GACX,WAAAC,EACA,UAAAiZ,EAAY,GACZ,aAAA/a,EACA,oBAAA2rB,EACA,kBAAAzrB,EACA,WAAA8a,EACA,YAAAzX,EAAc,GACd,UAAA5B,EACA,QAAA4lB,EACA,OAAA3+B,EACA,SAAAC,EACA,cAAA8gC,EACA,gBAAAC,EACA,MAAAC,EAAQ,GACR,iBAAAyB,CACJ,EAA2B,CACvB,MAAMvjD,EAAQ8D,EAAe,EACvBwpB,EAAKnN,GAAA,EACL,CAAE,gBAAAuhC,EAAiB,QAASwC,CAAA,EAA2BZ,GAAuB,CAAE,QAAAt2B,EAAS,iBAAAu2B,EAAkB,EAC3GY,EAAkBd,GAAe,CAAE,QAAAvR,EAAS,QAAS4P,EAAiB,KAAApP,EAAM,EAC5E,CAAE,oBAAAyR,EAAqB,eAAA5qB,EAAgB,sBAAA6qB,CAAA,EAA0BL,GAAiB,CACpF,aAAA1rB,EACA,oBAAA2rB,EACA,kBAAAzrB,CAAA,CACH,EACK,CACF,kBAAA6pB,EACA,aAAAC,EACA,mBAAAa,EACA,iBAAAC,GACA,UAAA/oB,GACA,UAAA+X,EACA,MAAAqQ,GACA,iBAAAK,GACA,sBAAAE,GACA,aAAAvqB,GACA,QAAA2W,EAAA,EACAyS,GAAe,CACf,QAAA/O,EACA,KAAAH,EACA,UAAAmP,EACA,gBAAAC,EACA,SAAAvQ,EACA,WAAAwQ,EACA,GAAAr0B,EACA,OAAAzM,EACA,SAAAC,EACA,cAAA8gC,EACA,gBAAAC,EACA,MAAAC,CAAA,CACH,EACKsC,GAAqB,CAAC,CAACpC,EAAkB,MAAQ,CAAC,CAAC1P,EAEnD+R,GAAiBzrB,cAAa7iB,IAAoB,CAGpD,GAFAk9B,GAAA,MAAAA,EAAal9B,IAET,CAACquC,GAAoB,OACzB,MAAM52B,GAAY4K,GAAariB,EAAM,EACrC,IAAIksC,GAAA,YAAAA,EAAc,aAAc,QAAUA,EAAa,QAAU7pB,GAAa6pB,EAAa,MAAM,IAAMz0B,GAAW,CAC9G40B,GAAA,EACA,MACJ,CACArQ,EAAU,OAAQh8B,EAAM,CAC5B,EAAG,CAACksC,GAAA,YAAAA,EAAc,UAAWA,GAAA,YAAAA,EAAc,OAAQmC,GAAoBhC,GAAOhqB,GAAc6a,EAAYlB,CAAS,CAAC,EAE5GuS,GAAkBrR,GAAcmR,GAChCC,GACA,OAEAE,GAAe3rB,EAAAA,YAAY,CAACuZ,GAAmBp8B,GAAkB3R,IAAuB,CAC1F,MAAMgmB,EAAS43B,EAAkB7P,EAAS,EAC1C,MAAI,CAAC/nB,GAAU,CAACuoB,GAAgBvoB,EAAQrU,EAAM,EAAU,KAEpDlS,EAAA,cAACoV,GAAA,CACG,UAAW7U,IAAc+tC,KAAc,MAAQ96B,GAAqB,QACpE,KAAM+S,EAAO,KACb,MAAOyoB,GAAeV,GAAW/nB,CAAM,EACvC,SAAUwoB,GAAiBxoB,EAAQrU,EAAM,EACzC,QAAS,IAAMg8B,EAAUI,GAAWp8B,EAAM,CAAA,CAAA,CAGtD,EAAG,CAACisC,EAAmBjQ,CAAS,CAAC,EAE3ByS,EAAmB7iD,EAAAA,QAAQ,IACtB,OAAO,QAAQqgD,CAAiB,EAClC,OAAO,CAAC,CAAC7P,GAAW/nB,EAAM,IAAM+nB,KAAc,QAAUA,KAAc,UAAYQ,GAAgBvoB,GAAQ,MAAS,CAAC,EACpH,IAAI,CAAC,CAAC+nB,EAAS,IAAMA,EAAS,EACpC,CAAC6P,CAAiB,CAAC,EAEhByC,EAAgB9iD,EAAAA,QAAoC,KAAO,CAC7D,MAAA0W,EACA,QAASqpC,EACT,UAAWvoB,EACX,UAAA4Y,CAAA,GACA,CAAC2P,EAAiB3P,EAAW5Y,EAAgB9gB,CAAK,CAAC,EAEjDqsC,EAAgB/iD,EAAAA,QAAoC,KAAO,CAC7D,QAAS+/C,EACT,UAAWvoB,EACX,UAAA4Y,CAAA,GACA,CAAC2P,EAAiB3P,EAAW5Y,CAAc,CAAC,EAE1CwrB,GAAiBhjD,EAAAA,QAAQ,IAAM,CACjC,GAAI2K,IAAW,OACX,OAAO,OAAOA,GAAW,WAAaA,EAAOm4C,CAAa,EAAIn4C,EAElE,GAAI,GAAC+L,GAAS,CAACmsC,EAAiB,QAEhC,OACI3gD,EAAA,cAAAA,EAAA,SAAA,KACKwU,GAASxU,EAAA,cAAC,OAAA,IAAK,EACf2gD,EAAiB,OACd3gD,EAAA,cAAC,OAAA,CAAK,UAAU,mCAAA,EACX2gD,EAAiB,IAAKrS,IACnBtuC,EAAA,cAACA,EAAM,SAAN,CAAe,IAAKsuC,EAAA,EAChBoS,GAAapS,EAAS,CAC3B,CACH,CACL,EACA,IACR,CAER,EAAG,CAACoS,GAAcj4C,EAAQk4C,EAAkBC,EAAepsC,CAAK,CAAC,EAE3DusC,GAAiBjjD,EAAAA,QAAQ,IAAM,CACjC,GAAI4K,IAAW,OACX,OAAO,OAAOA,GAAW,WAAaA,EAAOm4C,CAAa,EAAIn4C,CAGtE,EAAG,CAACA,EAAQm4C,CAAa,CAAC,EAEpBG,GAAqBljD,EAAAA,QAAQ,IAAM,CACrC,GAAI,GAACsgD,GAAgB,CAACa,GAAuBA,EAAmB,OAAS,SAAWA,EAAmB,OAAS,UAChH,OAAOH,GAAsBV,EAAa,UAAWA,EAAa,MAAM,CAC5E,EAAG,CAACA,EAAca,EAAoBH,EAAqB,CAAC,EAEtDmC,GAAoBnjD,EAAAA,QAAQ,IAAM,CACpC,GAAI,GAACmhD,GAAuBA,EAAmB,OAAS,SAAWA,EAAmB,OAAS,UAAaA,EAAmB,SAAW,QAAa,CAAC+B,IAGxJ,OAAO,OAAO/B,EAAmB,QAAW,WACtCA,EAAmB,OAAO+B,EAAkB,EAC5C/B,EAAmB,MAC7B,EAAG,CAACA,EAAoB+B,EAAkB,CAAC,EAErCE,GAAoBpjD,EAAAA,QAAQ,IAAM,CACpC,GAAI,GAACmhD,GAAuBA,EAAmB,OAAS,SAAWA,EAAmB,OAAS,UAC/F,IAAIA,EAAmB,SAAW,GAAO,MAAO,GAChD,GAAI,EAAAA,EAAmB,SAAW,QAAa,CAAC+B,IAChD,OAAO,OAAO/B,EAAmB,QAAW,WACtCA,EAAmB,OAAO+B,EAAkB,EAC5C/B,EAAmB,OAC7B,EAAG,CAACA,EAAoB+B,EAAkB,CAAC,EAErCG,GAAclS,GAAoBhZ,CAAQ,EAEhD,OACIj2B,EAAA,cAAAA,EAAA,SAAA,KACIA,EAAA,cAAC0c,GAAA,CACG,UAAApa,EACA,OAAQw+C,GACR,OAAQC,GACR,WAAY5kD,EAAM,KAAK,KAAK,WAAas+C,EAAS,WAAWA,CAAM,GAAK,KAAK,KAAA,EAC7E,YAAat+C,EAAM,KAAK,KAAK,YAC7B,UAAWA,EAAM,KAAK,KAAK,UAC3B,YAAaA,EAAM,KAAK,KAAK,YAC7B,WAAYyjD,GAAWS,EACvB,UAAWlkD,EAAM,KAAK,KAAK,SAAA,EAE1B4oC,IAAW,UACR/kC,EAAA,cAAC09C,GAAA,CACG,QAASG,EACT,SAAAvQ,EACA,SAAU6T,IAAelrB,EACzB,WAAAC,EACA,UAAAiZ,EACA,aAAc+Q,EACd,kBAAmBC,EACnB,WAAYM,GACZ,QAAA9E,EACA,UAAWx/C,EAAM,KAAK,QAAQ,SAAA,CAAA,EAGlC6D,EAAA,cAACkvC,GAAA,CACG,QAAS2O,EACT,SAAAvQ,EACA,QAASgT,EACT,UAAApS,EACA,SAAUiT,IAAelrB,EACzB,WAAAC,EACA,UAAAiZ,EACA,aAAc+Q,EACd,kBAAmBC,EACnB,WAAYM,GACZ,YAAA9oB,EACA,UAAA5B,EACA,UAAAI,GACA,UAAWh6B,EAAM,KAAK,MAAM,SAAA,CAAA,CAChC,EAGPiiD,GAAgBa,IAAuBA,EAAmB,OAAS,SAAWA,EAAmB,OAAS,WACvGj/C,EAAA,cAAC6c,GAAA,CACG,MACIoiC,EAAmB,OAAS,SAAWA,EAAmB,OAAS,WAC7DA,EAAmB,MAAQ9iD,EAAM,KAAK,MAAM,KAGtD,UACI8iD,EAAmB,OAAS,SAAWA,EAAmB,OAAS,WAC7DA,EAAmB,UAAY9iD,EAAM,KAAK,MAAM,SAG1D,OAAQ8kD,GACR,MAAOb,GACHhC,EAAa,UACba,EACAA,EAAmB,OAAS,SAAWA,EAAmB,OAAS,SAC7DH,GAAsBV,EAAa,UAAWA,EAAa,MAAM,EACjEQ,GAAiBR,EAAa,UAAWA,EAAa,MAAM,CAAA,EAEtE,QAASG,GACT,OACIU,EAAmB,OAAS,SACzBA,EAAmB,SAAW,SAC7Bb,EAAa,YAAc,OAASA,EAAa,YAAc,QAC5Dr0C,YAAU,QAAA7D,GAAAglC,GAAQ,UAAR,YAAAhlC,GAAiB,WAAW6D,MAAU,QAAQ,QAAQ,EAAK,GACtE,OAEV,SACIk1C,EAAmB,OAAS,SACtB,SAAY,CACV,MAAM/sC,GAASksC,EAAa,OAC5B,GAAI,CAAClsC,GAAQ,MAAO,GACpB,MAAMyxB,GAAc1mB,EACd,MAAMA,EAAS,CAAE,OAAA/K,EAAA,CAAQ,EACzB4rC,EACI,GAAGA,CAAU,IAAIvpB,GAAariB,EAAM,CAAC,GACrC,OACV,GAAI,CAACyxB,IAAe,CAAC1mB,EAAU,MAAO,GAClC0mB,IAAa,MAAMla,EAAG,OAAOka,EAAW,EAC5C,MAAM2b,EAAU,MAAMvB,GAAA,YAAAA,EAAgB,CAAE,OAAA7rC,GAAQ,OAAQ,QAAA,KAAe,GACvE,OAAIotC,GAASf,GAAA,EACNe,CACX,EACEL,EAAmB,OAAS,SACvBA,EAAmB,SAAW,QAC9Bb,EAAa,YAAc,QACzBA,EAAa,QACbD,EAAkB,OACjB,UACE,MAAMW,GAAsBV,EAAa,UAAWA,EAAa,MAAM,EAAE,UAAU,QAAQ,EACpF,IAET,OAElB,OAAQ8C,GACR,aACIjC,EAAmB,OAAS,SAAWA,EAAmB,OAAS,SAC7DA,EAAmB,SAAW,OAC9B,GAEV,iBACIA,EAAmB,OAAS,SAAWA,EAAmB,OAAS,SAC7DA,EAAmB,iBACnB,GAEV,UAAW9iD,EAAM,KAAK,MAAM,UAC5B,UAAWA,EAAM,KAAK,MAAM,UAC5B,YAAaA,EAAM,KAAK,MAAM,YAC9B,WAAYA,EAAM,KAAK,MAAM,WAC7B,UAAWA,EAAM,KAAK,MAAM,UAC5B,YAAaA,EAAM,KAAK,MAAM,WAAA,EAE7B+iD,EAAA,CAGb,CAER,CC9UA,SAASkC,GAAuCh+C,EAAgC,CAC5E,OAAOpD,EAAA,cAAC2tC,GAAA,CAAU,GAAGvqC,CAAA,CAAO,CAChC,CCDA,SAASi+C,GAAgDj+C,EAA2B,CAChF,MAAI,YAAaA,EACNpD,EAAA,cAACohD,GAAA,CAAW,GAAGh+C,CAAA,CAAkC,EAGrDpD,EAAA,cAACqtC,GAAA,CAAQ,GAAGjqC,CAAA,CAAsC,CAC7D,CCNA,SAASk+C,IAAQ,CACf,OACEthD,EAAA,cAACqhD,GAAA,CACG,KAAM,SACN,gBAAkBnvC,GAAwBA,EAAO,MAAM,QAAQ,IAAK,GAAG,EACvE,KACIlS,EAAA,cAAAA,EAAA,SAAA,KACEA,EAAA,cAAC0qB,GAAA,CAAO,KAAM,WACN,MAAO,UAAA,CAAA,EAEf1qB,EAAA,cAAC4qB,GAAA,CAAM,KAAM,QACP,MAAO,QACP,SAAU,GACV,UAAW,EAAA,CAAA,EAEjB5qB,EAAA,cAACouB,GAAA,CAAO,KAAM,aACN,MAAO,aACP,QAAS,CACL,CAAC,MAAO,QAAS,MAAO,OAAA,EACxB,CAAC,MAAO,OAAQ,MAAO,MAAA,CAAM,EAEjC,SAAU,EAAA,CAAA,CAEpB,CAAA,CAAA,CAIZ,CC7BA,MAAMmzB,GAAqB,IAEnBvhD,EAAA,cAAC,OAAI,UAAU,kDAAA,kBACV,KAAA,KAAG,KAAG,EACPA,EAAA,cAAC,IAAA,KAAE,uBAAqB,EACxBA,EAAA,cAACoG,GAAAA,KAAA,CAAK,GAAG,GAAA,EAAIpG,EAAA,cAAC0E,GAAK,KAAK,YAAA,CAAa,EAAE,aAAW,CACtD,ECFF88C,GAAyBhmD,EAAAA,cAAkD,IAAI,EAExEimD,GAAkB,CAAC,CAC5B,SAAA16C,EACA,WAAA+O,EACA,SAAAlY,CACJ,IACIoC,EAAA,cAACwhD,GAAuB,SAAvB,CAAgC,MAAO,CAAE,SAAAz6C,EAAU,WAAA+O,CAAA,CAAW,EAC1DlY,CACL,EAGS8jD,GAAsBh/C,GAAiD,CAChF,MAAMsT,EAAM7V,EAAAA,WAAWqhD,EAAsB,EAC7C,GAAI,CAACxrC,EAAK,OAAO,KACjB,MAAM7d,EAAMuK,GAAQsT,EAAI,WACxB,OAAOA,EAAI,SAAS7d,CAAG,GAAK,IAChC,ECPMguB,GAAgB,CAClB,IAAK,OACL,MAAO,QACX,EAUA,SAASoB,GAAc/uB,EAAYmuB,EAAe,CAC9C,GAAI,CAACA,EAAO,OAAOnuB,EACnB,MAAMR,EAAQ2uB,EAAM,MAAM,GAAG,EAC7B,IAAInnB,EAAUhH,EACd,UAAWf,KAAQO,EAAO,CACtB,GAAIwH,GAAW,KAAM,OACrBA,EAAUA,EAAQ/H,CAAI,CAC1B,CACA,OAAO+H,CACX,CAEA,SAASgoB,GAAcnO,EAAWoO,EAAoB,CAClD,OAAIpO,IAASoO,EAAc,EACvBpO,GAAQ,KAAa,GACrBoO,GAAS,KAAa,EACtB,OAAOpO,GAAS,UAAY,OAAOoO,GAAU,SAAiBpO,EAAOoO,EACrE,OAAOpO,GAAS,WAAa,OAAOoO,GAAU,UAAkB,OAAOpO,CAAI,EAAI,OAAOoO,CAAK,EACxF,WAAW,OAAOpO,CAAI,EAAE,cAAc,WAAW,OAAOoO,CAAK,EAAG,OAAW,CAAE,QAAS,GAAM,YAAa,OAAQ,CAC5H,CAEA,SAASC,GAAWlvB,EAAYsuB,EAAyC,CACrE,MAAMC,EAAY,OAAOD,GAAQ,UAAYA,IAAQ,MAAQ,CAAC,MAAM,QAAQA,CAAG,EAAIA,EAAmB,CAAE,GAAIA,CAAA,EAC5G,SAAW,CAACa,EAAI7vB,CAAM,IAAK,OAAO,QAAQivB,CAA0C,EAChF,OAAQY,EAAA,CACJ,IAAK,KAAM,GAAInvB,IAAUV,EAAQ,MAAO,GAAO,MAC/C,IAAK,KAAM,GAAI,EAAEU,EAASV,GAAiB,MAAO,GAAO,MACzD,IAAK,MAAO,GAAI,EAAEU,GAAUV,GAAiB,MAAO,GAAO,MAC3D,IAAK,KAAM,GAAI,EAAEU,EAASV,GAAiB,MAAO,GAAO,MACzD,IAAK,MAAO,GAAI,EAAEU,GAAUV,GAAiB,MAAO,GAAO,MAC3D,IAAK,KAAM,GAAI,CAAC,MAAM,QAAQA,CAAM,GAAK,CAAEA,EAAiB,SAASU,CAAK,EAAG,MAAO,GAAO,MAC3F,IAAK,MAAO,GAAI,MAAM,QAAQV,CAAM,GAAMA,EAAiB,SAASU,CAAK,EAAG,MAAO,GAAO,MAC1F,QAAS,MAAO,EAAA,CAGxB,MAAO,EACX,CAEA,SAASovB,GAAoBtmB,EAAmBolB,EAAqBU,EAAmC,CACpG,MAAMY,EAAe,OAAO,QAAQZ,GAAS,CAAA,CAAE,EACzCU,EAAe,OAAO,QAAQpB,GAAS,CAAA,CAAE,EAC/C,IAAIqB,EAAW,OAAO,QAAQzmB,CAAG,EAEjC,OAAIwmB,EAAa,SACbC,EAAWA,EAAS,OAAO,CAAC,CAAA,CAAGvvB,CAAK,IAChCsvB,EAAa,MAAM,CAAC,CAACnB,EAAOG,CAAG,IAAMY,GAAWH,GAAc/uB,EAAOmuB,CAAK,EAAGG,CAAG,CAAC,CAAA,GAIrFkB,EAAa,QACbD,EAAS,KAAK,CAAC1O,EAAMoO,IAAU,CAC3B,SAAW,CAACd,EAAOvQ,CAAG,IAAK4R,EAAc,CACrC,MAAMxtB,EAASgtB,GAAcD,GAAclO,EAAK,CAAC,EAAGsN,CAAK,EAAGY,GAAcE,EAAM,CAAC,EAAGd,CAAK,CAAC,EAC1F,GAAInsB,EAAQ,OAAO4b,IAAQ,OAAS,CAAC5b,EAASA,CAClD,CACA,MAAO,EACX,CAAC,EAGE,OAAO,YAAYutB,CAAQ,CACtC,CAEA,SAAS45B,GACLrxC,EACAyY,EACW,CACX,MAAM3nB,EAAU,OAAO,QAAQkP,CAAI,EAEnC,GAAI,CAACyY,EACD,OAAO3nB,EAAQ,IAAI,CAAC,CAACjJ,EAAKK,CAAK,EAAGD,IAC9B,OAAOC,GAAU,UAAYA,IAAU,KACjC,CAAE,OAAQD,EAAO,KAAMJ,EAAK,GAAGK,CAAA,EAC/B,CAAE,OAAQD,EAAO,KAAMJ,EAAK,CAACguB,GAAc,KAAK,EAAG3tB,EAC5D,EAGL,MAAM4wB,EAAU,OAAO,KAAKL,CAAQ,EACpC,OAAO3nB,EAAQ,IAAI,CAAC,CAACjJ,EAAKK,CAAK,EAAGD,IAAU,CACxC,MAAM0D,EAAS,OAAOzD,GAAU,UAAYA,IAAU,KAChD,CAAE,CAAC2tB,GAAc,GAAG,EAAGhuB,EAAK,GAAGK,CAAA,EAC/B,CAAE,CAAC2tB,GAAc,GAAG,EAAGhuB,EAAK,CAACguB,GAAc,KAAK,EAAG3tB,CAAA,EACnD6wB,EAA8B,CAAA,EACpC,UAAWC,KAAQF,EAAS,CACxB,MAAMzC,EAAQoC,EAASO,CAAI,EAC3BD,EAAOC,CAAI,EAAI3C,EAAM,SAAS,GAAG,EAC3BjuB,GAAU,MAAMuD,EAAQ0qB,CAAK,EAC7BA,IAAUR,GAAc,IAAMhuB,EAC9BwuB,IAAUR,GAAc,MAAQ3tB,EAChCyD,EAAO0qB,CAAK,CACtB,CACA,MAAO,CAAE,KAAMxuB,EAAK,OAAQI,EAAO,GAAG8wB,CAAA,CAC1C,CAAC,CACL,CAEO,MAAMu4B,EAAgD,CAIzD,YAAYC,EAA+B,CACvC,GAJJ,KAAQ,MAAyB,CAAA,EACjC,KAAQ,cAA0C,IAqDlD,KAAA,KAAO,MAAOhqD,EAAc0a,EAAuB,CAAA,IAAqB,CACpE,KAAM,CAAE,WAAAuvC,EAAY,GAAAz9C,CAAA,EAAO,KAAK,YAAYxM,CAAI,EAC1CgyC,EAAM,KAAK,cAAciY,CAAU,EACzC,GAAIz9C,EACA,OAAOwlC,EAAIxlC,CAAE,EAAI,CAAE,GAAGwlC,EAAIxlC,CAAE,GAAM,OAEtC,MAAMkkB,EAAYX,GAAoBiiB,EAAKt3B,EAAQ,MAAOA,EAAQ,KAAK,EACvE,OAAIA,EAAQ,QAAgB,OAAO,OAAOgW,CAAS,EAAE,IAAI9vB,IAAM,CAAE,GAAGA,CAAA,EAAI,EACjE,OAAO,YAAY,OAAO,QAAQ8vB,CAAS,EAAE,IAAI,CAAC,CAAChrB,EAAG9E,CAAC,IAAM,CAAC8E,EAAG,CAAE,GAAG9E,CAAA,CAAG,CAAC,CAAC,CACtF,EAEA,KAAA,IAAM,MAAOZ,EAAcyY,IAAgC,CACvD,KAAM,CAAE,WAAAwxC,EAAY,GAAAz9C,CAAA,EAAO,KAAK,YAAYxM,CAAI,EAC1CgyC,EAAM,KAAK,cAAciY,CAAU,EACrCz9C,EACAwlC,EAAIxlC,CAAE,EAAI,CAAE,GAAGiM,CAAA,EAEf,KAAK,MAAMwxC,CAAU,EAAI,CAAE,GAAIxxC,CAAA,EAEnC,KAAK,OAAOwxC,CAAU,CAC1B,EAEA,KAAA,OAAS,MAAOjqD,EAAcyY,IAAgC,CAC1D,KAAM,CAAE,WAAAwxC,EAAY,GAAAz9C,CAAA,EAAO,KAAK,YAAYxM,CAAI,EAC1CgyC,EAAM,KAAK,cAAciY,CAAU,EACrCz9C,EACAwlC,EAAIxlC,CAAE,EAAI,CAAE,GAAIwlC,EAAIxlC,CAAE,GAAK,CAAA,EAAK,GAAGiM,CAAA,EAEnC,KAAK,MAAMwxC,CAAU,EAAI,CAAE,GAAGjY,EAAK,GAAIv5B,CAAA,EAE3C,KAAK,OAAOwxC,CAAU,CAC1B,EAEA,KAAA,OAAS,MAAOjqD,GAAgC,CAC5C,KAAM,CAAE,WAAAiqD,EAAY,GAAAz9C,CAAA,EAAO,KAAK,YAAYxM,CAAI,EAC5CwM,EACA,OAAO,KAAK,cAAcy9C,CAAU,EAAEz9C,CAAE,EAExC,OAAO,KAAK,MAAMy9C,CAAU,EAEhC,KAAK,OAAOA,CAAU,CAC1B,EAEA,KAAA,UAAY,CACRjqD,EACAixB,EACAvW,IACe,CACf,GAAI,CAAC1a,EAAM,MAAO,OAElB,MAAMgyC,EAAMhyC,EAAK,WAAW,GAAG,EAAIA,EAAO,IAAIA,CAAI,GAC5CkqD,EAAW,IAAM,CACnB,MAAMx5B,EAAYX,GAAoB,KAAK,cAAciiB,CAAG,EAAGt3B,GAAA,YAAAA,EAAS,MAAOA,GAAA,YAAAA,EAAS,KAAK,EACvFwP,EAASxP,GAAA,MAAAA,EAAS,OAASA,EAAQ,OAAOgW,CAAS,EAAIA,EAC7DO,EAAW64B,GAAuB5/B,EAAQxP,GAAA,YAAAA,EAAS,QAAQ,CAAC,CAChE,EAEA,OAAAwvC,EAAA,EAEK,KAAK,UAAU,IAAIlY,CAAG,GAAG,KAAK,UAAU,IAAIA,EAAK,IAAI,GAAK,EAC/D,KAAK,UAAU,IAAIA,CAAG,EAAG,IAAIkY,CAAQ,EAE9B,IAAM,QACT77C,EAAA,KAAK,UAAU,IAAI2jC,CAAG,IAAtB,MAAA3jC,EAAyB,OAAO67C,EACpC,CACJ,EAnHQF,EACA,SAAW,CAACG,EAAS74B,CAAO,IAAK,OAAO,QAAQ04B,CAAW,EAAG,CAC1D,MAAM1pD,EAAM6pD,EAAQ,WAAW,GAAG,EAAIA,EAAU,IAAIA,CAAO,GAC3D,KAAK,MAAM7pD,CAAG,EAAI,CAAE,GAAGgxB,CAAA,CAC3B,CAER,CAEA,cAAwB,CACpB,MAAO,EACX,CAEA,uBAAwB,CACpB,MAAO,CAAE,WAAY,EAAA,CACzB,CAEQ,cAAc84B,EAAuC,CACzD,OAAK,KAAK,MAAMA,CAAQ,IAAG,KAAK,MAAMA,CAAQ,EAAI,CAAA,GAC3C,KAAK,MAAMA,CAAQ,CAC9B,CAEQ,YAAYpqD,EAAmD,CACnE,MAAMgG,EAAahG,EAAK,WAAW,GAAG,EAAIA,EAAO,IAAIA,CAAI,GACzD,GAAI,KAAK,MAAMgG,CAAU,EAAG,MAAO,CAAE,WAAYA,CAAA,EAMjD,MAAMqkD,EAJiB,OAAO,KAAK,KAAK,KAAK,EACxC,OAAQ/pD,GAAQ0F,EAAW,WAAW,GAAG1F,CAAG,GAAG,CAAC,EAChD,KAAK,CAACkhB,EAAMoO,IAAUA,EAAM,OAASpO,EAAK,MAAM,EAEZ,CAAC,EAC1C,GAAI6oC,EACA,MAAO,CACH,WAAYA,EACZ,GAAIrkD,EAAW,MAAMqkD,EAAkB,OAAS,CAAC,CAAA,EAIzD,MAAMlqD,EAAQ6F,EAAW,QAAQ,OAAQ,EAAE,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO,EACtE,OAAI7F,EAAM,QAAU,EAAU,CAAE,WAAY6F,CAAA,EAErC,CACH,WAAY,IAAI7F,EAAM,MAAM,EAAG,EAAE,EAAE,KAAK,GAAG,CAAC,GAC5C,GAAIA,EAAMA,EAAM,OAAS,CAAC,CAAA,CAElC,CAEQ,OAAOiqD,EAAwB,QACnC/7C,EAAA,KAAK,UAAU,IAAI+7C,CAAQ,IAA3B,MAAA/7C,EAA8B,QAAQi8C,GAAMA,IAChD,CAoEJ,CCnOA,MAAMC,GAA2B,SAA2B,UACnDz4C,GAAAzD,EAAA,OAAe,SAAf,YAAAA,EAAuB,WAAvB,MAAAyD,EAAiC,KACtC2F,GAAY,CACR,CAAE,IAAK,yCAA0C,MAAO,GAAM,MAAO,EAAA,CAAK,CAC7E,EACD,MAAM,IAAI,QAASxB,GAAY,WAAWA,EAAS,CAAC,CAAC,EACzD,EAEO,MAAM6W,EAAkD,CAC3D,uBAAoD,CAChD,OAAOrM,GACH,qBACAF,GAAeoM,GAAW,QAAQ,EAA0C,CAAC,UAAU,EAAG,gBAAgB,CAAA,CAElH,CAEA,cAAwB,CACpB,OAAO,KAAK,wBAAwB,UACxC,CAEA,SAA8B,CAC1B,GAAI,CAAC,KAAK,aAAA,EAAgB,OAAO,KACjC,MAAM69B,EAAS12C,GAAc,MAAM,EACnC,GAAI,CAAC02C,EAAQ,OAAO,KACpB,MAAMC,EAAUD,EAAO,SAAW,CAAA,EAClC,MAAO,CACH,GAAGC,EACH,IAAKD,EAAO,IACZ,MAAOA,EAAO,OAASC,EAAQ,MAC/B,YAAaD,EAAO,aAAeC,EAAQ,KAC3C,SAAUD,EAAO,UAAYC,EAAQ,OAAA,CAE7C,CAEA,MAAM,OAAO/vC,EAA6B,GAAiC,CACvE,MAAMlW,EAASmoB,GAAW,QAAQ,EAClC,GAAI,CAAC,KAAK,aAAA,GAAkB,EAACnoB,GAAA,MAAAA,EAAQ,UACjC,MAAM,IAAI,MAAM,mEAAmE,EAGvF,aAAM+lD,GAAA,EAEC,IAAI,QAAQ,CAACt0C,EAASoX,IAAW,SACpC,GAAI,GAAEvb,GAAAzD,EAAA,OAAe,SAAf,YAAAA,EAAuB,WAAvB,MAAAyD,EAAiC,IAAI,CACvCub,EAAO,IAAI,MAAM,uEAAuE,CAAC,EACzF,MACJ,CAEC,OAAe,mBAAqB,MAAO,CAAE,WAAAq9B,KAAwD,OAClG,GAAI,CACA,MAAMC,EAAoBz1C,GAAUw1C,CAAU,EAC9C,aAAa,QAAQ,wBAAyBA,CAAU,EAExD,MAAME,EAAe19B,GAAA,EACrB,GAAI,CAAC09B,EAAc,CACfv9B,EAAO,IAAI,MAAM,uDAAuD,CAAC,EACzE,MACJ,CAEA,MAAMw9B,EAAqBC,GAAAA,mBAA2B,WAAWJ,CAAU,EACrEh9B,EAAiB,MAAMC,wBAAqBi9B,EAAcC,CAAkB,EAC5Ej9B,EAAqBC,GAAAA,sBAAsBH,CAAc,EAE/Dja,GAAc,CACV,GAAGia,EAAe,KAClB,SAASE,GAAA,YAAAA,EAAoB,UAAW+8B,CAAA,EACzC,MAAM,GAELt8C,EAAAqM,EAAQ,SAAR,MAAArM,EAAgB,QAChB,MAAM,KAAK,eAAeqM,EAAQ,MAAM,EAG5CzE,EAAQ,KAAK,SAAS,CAC1B,OAASX,EAAO,CACZ+X,EAAO/X,CAAK,CAChB,CACJ,EAEC,OAAe,OAAO,SAAS,GAAG,WAAW,CAC1C,UAAW9Q,EAAO,SAClB,SAAW,OAAe,mBAC1B,YAAa,GACb,sBAAuB,EAAA,CAC1B,EACA,OAAe,OAAO,SAAS,GAAG,OAAA,CACvC,CAAC,CACL,CAEA,MAAM,SAAyB,aAC3B,MAAMgmD,EAAS12C,GAAc,MAAM,GAC/BzF,EAAAm8C,GAAA,YAAAA,EAAQ,UAAR,MAAAn8C,EAAiB,OAChBkR,GAAAlE,GAAAvJ,EAAA,OAAe,SAAf,YAAAA,EAAuB,WAAvB,YAAAuJ,EAAiC,KAAjC,MAAAkE,EAAqC,OAAOirC,EAAO,QAAQ,MAEhE,aAAa,WAAW,uBAAuB,EAC/C72C,GAAiB,MAAM,EACvB,MAAMiP,EAAOsK,GAAA,EACTtK,GACA,MAAMmoC,GAAAA,QAAgBnoC,CAAI,CAElC,CAEA,aAAaooC,EAA0D,CACnE,MAAMpoC,EAAOsK,GAAA,EACb,OAAKtK,EAIE2K,GAAAA,mBAAmB3K,EAAOqoC,GAAiB,CAC9C,MAAMC,EAAa,KAAK,QAAA,EACxB,GAAI,CAACD,EAAc,CACfD,EAASE,CAAU,EACnB,MACJ,CACA,MAAMV,EAAS12C,GAAc,MAAM,EAC7B22C,GAAUD,GAAA,YAAAA,EAAQ,UAAW,CAAA,EACnCQ,EAAS,CACL,GAAGP,EACH,IAAKQ,EAAa,IAClB,MAAOA,EAAa,OAASR,EAAQ,MACrC,YAAaQ,EAAa,aAAeR,EAAQ,KACjD,SAAUQ,EAAa,UAAYR,EAAQ,OAAA,CAC9C,CACL,CAAC,GAlBGO,EAAS,KAAK,SAAS,EAChB,IAAM,CAAC,EAkBtB,CAEA,eAAenpC,EAAmB,GAAqB,CACnD,MAAMrd,EAASmoB,GAAW,QAAQ,EAClC,GAAI,CAAC,KAAK,aAAA,GAAkB,EAACnoB,GAAA,MAAAA,EAAQ,UACjC,OAAO,QAAQ,OAAO,4BAA4B,EAGtD,MAAM2mD,EAAQtpC,EAAO,KAAK,GAAG,EACvBupC,EAAW,sBAAsBD,CAAK,GACtCE,EAAa,oBAAoBF,CAAK,GAE5C,OAAO,IAAI,QAAQ,CAACl1C,EAASoX,IAAW,WACpC,MAAMi+B,EAAc,aAAa,QAAQF,CAAQ,EAC3CG,EAAY,aAAa,QAAQF,CAAU,EAC3CxoC,EAAY,CAAC0oC,GAAa,IAAI,KAAKA,CAAS,EAAE,QAAA,EAAY,KAAK,IAAA,EAErE,GAAID,GAAe,CAACzoC,EAAW,CAC3B5M,EAAQq1C,CAAW,EACnB,MACJ,CAEA,MAAME,GAAWnwC,GAAAvJ,GAAAzD,EAAA,OAAe,SAAf,YAAAA,EAAuB,WAAvB,YAAAyD,EAAiC,SAAjC,YAAAuJ,EAAyC,gBAAgB,CACtE,UAAW7W,EAAO,SAClB,MAAA2mD,EACA,SAAWM,GAAiE,CACpEA,EAAc,cACd,aAAa,QAAQL,EAAUK,EAAc,YAAY,EACzD,aAAa,QAAQJ,EAAY,IAAI,KAAK,KAAK,IAAA,EAAQI,EAAc,WAAa,GAAI,EAAE,YAAA,CAAa,EACrGx1C,EAAQw1C,EAAc,YAAY,GAElCp+B,EAAO,+BAA+B,CAE9C,CAAA,GAGJ,GAAI,CAACm+B,EAAS,CACVn+B,EAAO,sCAAsC,EAC7C,MACJ,CAEAm+B,EAAQ,mBAAA,CACZ,CAAC,CACL,CAEA,iBAA2B,CACvB,MAAO,CAAC,CAAC,KAAK,QAAA,CAClB,CACJ,CCrLA,MAAME,GAAuB/nD,EAAAA,cAAgD,IAAI,EAEpEgoD,GAAgB,CAAC,CAC1B,SAAAz8C,EACA,WAAA+O,EACA,SAAAlY,CACJ,IACIoC,EAAA,cAACujD,GAAqB,SAArB,CAA8B,MAAO,CAAE,SAAAx8C,EAAU,WAAA+O,CAAA,CAAW,EACxDlY,CACL,EAGS6lD,GAAoB/gD,GAA+C,CAC5E,MAAMsT,EAAM7V,EAAAA,WAAWojD,EAAoB,EAC3C,GAAI,CAACvtC,EAAK,OAAO,KACjB,MAAM7d,EAAMuK,GAAQsT,EAAI,WACxB,OAAOA,EAAI,SAAS7d,CAAG,GAAK,IAChC,EClBA,IAAIurD,GACA,OAAOz3C,IAAmB,YAC1BA,GAAgBsY,GAAsB,CAC9BA,EAAU,UAAUyB,GAAKzB,EAAU,QAAQ,CACnD,CAAC,EAGL,MAAMo/B,GAAa,KACX,CAACD,IAAmBx9B,GAAS,KAAK,SAClCw9B,GAAkBx9B,GAAS,IAAA,EAAM,QAAA,GAE9Bw9B,IAGJ,MAAME,EAA0D,CAAhE,aAAA,CASH,KAAA,OAAS,MAAOjmB,EAAc9lC,IAA8C,OACxE,GAAI,CAAC8lC,EAAM,OACX,MAAMkmB,GAAa39C,EAAAy9C,OAAA,YAAAz9C,EAAc,IAAIrO,GACrC,GAAI,CAACgsD,EAAY,CAAE,QAAQ,MAAM,kCAAkC,EAAG,MAAQ,CAC9E,GAAI,CAEA,OAAO,MADU,MAAMA,EAAW,UAAUlmB,EAAM,UAAU,GACtC,IAAI,eAAA,CAC9B,OAASxwB,EAAO,CACZ,QAAQ,MAAM,gBAAiBA,CAAK,CACxC,CACJ,EAEA,KAAA,OAAS,MAAOtV,GAA8C,OAC1D,MAAMgsD,GAAa39C,EAAAy9C,OAAA,YAAAz9C,EAAc,IAAIrO,GACrC,GAAKgsD,EACL,GAAI,CACA,OAAO,MAAMA,EAAW,eAAA,CAC5B,OAAS12C,EAAO,CACZ,QAAQ,MAAM,kCAAkCtV,CAAI,IAAKsV,CAAK,CAClE,CACJ,EAEA,KAAA,SAAW,MAAOtV,GAA4C,CAC1D,MAAM4S,EAAM,MAAM,KAAK,OAAO5S,CAAI,EAClC,GAAK4S,EACL,GAAI,CACA,MAAMqI,EAAW,MAAM,MAAMrI,CAAG,EAChC,GAAI,CAACqI,EAAS,GAAI,MAAM,IAAI,MAAM,0BAA0B,EAC5D,OAAO,MAAMA,EAAS,KAAA,CAC1B,OAAS3F,EAAO,CACZ,QAAQ,MAAM,0BAA2BA,CAAK,CAClD,CACJ,EAEA,KAAA,OAAS,MAAOtV,GAAmC,OAC/C,MAAMgsD,GAAa39C,EAAAy9C,OAAA,YAAAz9C,EAAc,IAAIrO,GACrC,GAAI,CAACgsD,EAAY,MAAO,GACxB,GAAI,CACA,aAAMA,EAAW,OAAA,EACV,EACX,OAAS12C,EAAO,CACZ,eAAQ,MAAM,uBAAuBtV,CAAI,IAAKsV,CAAK,EAC5C,EACX,CACJ,CAAA,CApDA,uBAAoD,CAChD,OAAO2X,GAAA,CACX,CAEA,cAAwB,CACpB,OAAO,KAAK,wBAAwB,UACxC,CA+CJ,CAEA,MAAAoB,GAAe,IAAI09B,GC/DNE,GAAsB,yBAE5B,MAAMC,EAAmD,CAC5D,YAA6B1nD,EAAuB,CAAvB,KAAA,OAAAA,CAAwB,CAErD,uBAAoD,CAChD,OAAOic,GACH,sBACAF,GAAe,KAAK,OAA8C,CAAC,UAAU,EAAG,UAAU,CAAA,CAElG,CAEA,cAAwB,CACpB,OAAO,KAAK,wBAAwB,UACxC,CAEA,SAA8B,CAC1B,GAAI,CAAC,KAAK,aAAA,EAAgB,OAAO,KACjC,MAAM4rC,EAAUrpC,GAAe,KAAK,OAAO,QAAQ,EACnD,OAAKqpC,GAAA,MAAAA,EAAS,aACP,CACH,IAAKA,EAAQ,YAAc,KAAK,OAAO,SACvC,YAAa,UACb,SAAU,UACV,UAAWA,EAAQ,UAAA,EALY,IAOvC,CAEA,MAAM,OAAOzxC,EAA6B,GAAiC,CACvE,GAAI,CAAC,KAAK,eACN,MAAM,IAAI,MAAM,8DAA8D,EAGlF,OAAAgH,GAAmB,CACf,WAAYuqC,GACZ,SAAU,KAAK,OAAO,SACtB,OAAQvxC,EAAQ,OAChB,iBAAkB,mBAAA,CACrB,EACM,KAAK,QAAA,CAChB,CAEA,MAAM,SAAyB,CAC3BqI,GAAiB,KAAK,OAAO,QAAQ,CACzC,CAEA,aAAaioC,EAA0D,CACnE,OAAAA,EAAS,KAAK,SAAS,EAChB,IAAM,CAAC,CAClB,CAEA,MAAM,gBAAkC,CACpC,GAAI,CAAC,KAAK,eACN,MAAM,IAAI,MAAM,8DAA8D,EAGlF,MAAM71C,EAAQ,MAAM6N,GAAe,KAAK,OAAO,QAAQ,EACvD,GAAI,CAAC7N,EACD,MAAM,IAAI,MAAM,8CAA8C,EAElE,OAAOA,CACX,CAEA,iBAA2B,OACvB,OAAK,KAAK,aAAA,EACH,CAAC,GAAC9G,EAAAyU,GAAe,KAAK,OAAO,QAAQ,IAAnC,MAAAzU,EAAsC,cADd,EAErC,CACJ,CCgJO,MAAM+9C,GAAwBvqC,GAAsC,CACvE,MAAMrd,EAASmoB,GAAW,QAAQ,EAClC,GAAI,CAACnoB,EACD,eAAQ,KAAK,sDAAsD,EAC5D,QAAQ,OAAO,4BAA4B,EAGtD,MAAM2mD,EAAQtpC,EAAO,KAAK,GAAG,EACvBupC,EAAW,sBAAsBD,CAAK,GACtCE,EAAa,oBAAoBF,CAAK,GAE5C,OAAO,IAAI,QAAQ,CAACl1C,EAASoX,IAAW,CACpC,MAAMi+B,EAAc,aAAa,QAAQF,CAAQ,EAC3CG,EAAY,aAAa,QAAQF,CAAU,EAC3CxoC,EAAY,CAAC0oC,GAAa,IAAI,KAAKA,CAAS,EAAE,QAAA,EAAY,KAAK,IAAA,EAEjED,GAAe,CAACzoC,EAChB5M,EAAQq1C,CAAW,EAEH,OAAO,OAAO,SAAS,OAAO,gBAAgB,CAC1D,UAAW9mD,EAAO,SAClB,MAAA2mD,EACA,SAAWM,GAAkB,CACrBA,EAAc,cACd,aAAa,QAAQL,EAAUK,EAAc,YAAY,EACzD,aAAa,QAAQJ,EAAY,IAAI,KAAK,KAAK,IAAA,EAAQI,EAAc,WAAa,GAAI,EAAE,YAAA,CAAa,EAErGx1C,EAAQw1C,EAAc,YAAY,GAElCp+B,EAAO,+BAA+B,CAE9C,CAAA,CACH,EAEO,mBAAA,CAEhB,CAAC,CACL,ECrPA,eAAsBg/B,GAAU,CAAE,GAAAjpD,EAAI,IAAAkpD,EAAK,QAAAC,EAAS,QAAArvC,GAAyD,CACzG,MAAMouC,EAAc,MAAMc,GAAqB,CAAC,4CAA4C,CAAC,EAEvFI,EAAa,CACf,OAAOppD,EAAG,KAAK,IAAI,CAAC,EAAA,EAGpBkpD,GAAOA,EAAI,QACXE,EAAW,KAAK,QAAQF,EAAI,KAAK,IAAI,CAAC,EAAE,EAE5C,MAAMG,EAAQ,CACV,GAAGD,EACH,yCACA,oBACA,YAAYD,CAAO,GACnB,GACArvC,CAAA,EACF,KAAK;AAAA,CAAI,EAELwvC,EAAqBC,GAAAA,OAAO,KAAKF,CAAK,EACvC,SAAS,QAAQ,EACjB,QAAQ,MAAO,GAAG,EAClB,QAAQ,MAAO,GAAG,EAClB,QAAQ,MAAO,EAAE,EAEhBxxC,EAAW,MAAM,MAAM,+DAAgE,CACzF,OAAQ,OACR,QAAS,CACL,cAAiB,UAAUqwC,CAAW,GACtC,eAAgB,kBAAA,EAEpB,KAAM,KAAK,UAAU,CACjB,IAAKoB,CAAA,CACR,CAAA,CACJ,EAED,GAAI,CAACzxC,EAAS,GACV,MAAM,IAAI,MAAM,sBAAsB,EAG1C,MAAMxC,EAAO,MAAMwC,EAAS,KAAA,EAC5B,eAAQ,IAAI,cAAexC,CAAI,EACxBA,CACX,CCnDO,MAAMm0C,EAAmD,CAC5D,uBAAoD,CAChD,OAAOnsC,GACH,qBACAF,GAAeoM,GAAW,QAAQ,EAA0C,CAAC,UAAU,EAAG,gBAAgB,CAAA,CAElH,CAEA,cAAwB,CACpB,OAAO,KAAK,wBAAwB,UACxC,CAEA,MAAM,KAAK7pB,EAAwC,CAC/C,GAAI,CAAC,KAAK,eACN,MAAM,IAAI,MAAM,KAAK,sBAAA,EAAwB,QAAU,uCAAuC,EAGlG,MAAM+pD,GAAU,CACZ,GAAI,MAAM,QAAQ/pD,EAAO,EAAE,EAAIA,EAAO,GAAK,CAACA,EAAO,EAAE,EACrD,IAAKA,EAAO,IACL,MAAM,QAAQA,EAAO,GAAG,EAAIA,EAAO,IAAM,CAACA,EAAO,GAAG,EACrD,OACN,QAASA,EAAO,QAChB,QAASA,EAAO,OAAA,CACnB,CACL,CACJ,CCvBA,MAAMgqD,GAAQhkB,GACV,QAAQ,KAAK,wBAAwBA,CAAM,8BAA8B,EAEtE,MAAMikB,EAAoD,CAG7D,YAAYvoD,EAAwB,CAepC,KAAA,KAAO,MAAOxE,EAAcgtD,IAAyC,CACjEF,GAAK,MAAM,EAEX,KAAM,CAAA,CAAGG,EAAOzgD,CAAE,EAAIxM,EAAK,MAAM,GAAG,EAC9B4S,EAAM,GAAG,KAAK,OAAO,GAAG,YAAYq6C,CAAK,GAAGzgD,EAAK,UAAUA,CAAE,GAAK,EAAE,GAOpEiM,EAAO,MAND,MAAM,MAAM7F,EAAK,CACzB,QAAS,CACL,OAAQ,KAAK,OAAO,QACpB,cAAe,UAAU,KAAK,OAAO,OAAO,EAAA,CAChD,CACH,GACsB,KAAA,EACvB,OAAIpG,EAAWiM,EAAK,CAAC,GAAK,KACnB,OAAO,YAAaA,EAAe,IAAKy0C,GAAW,CAACA,EAAE,GAAIA,CAAC,CAAC,CAAC,CACxE,EAEA,KAAA,IAAM,MAAOltD,EAAcyY,IAAgC,CACvDq0C,GAAK,KAAK,EACV,KAAM,CAAA,CAAGG,EAAOzgD,CAAE,EAAIxM,EAAK,MAAM,GAAG,EAC9B4S,EAAM,GAAG,KAAK,OAAO,GAAG,YAAYq6C,CAAK,GAC/C,MAAM,MAAMr6C,EAAK,CACb,OAAQpG,EAAK,MAAQ,OACrB,QAAS,CACL,OAAQ,KAAK,OAAO,QACpB,cAAe,UAAU,KAAK,OAAO,OAAO,GAC5C,eAAgB,mBAChB,OAAQ,gBAAA,EAEZ,KAAM,KAAK,UAAUA,EAAK,CAAE,GAAGiM,EAAM,GAAAjM,CAAA,EAAOiM,CAAI,CAAA,CACnD,CACL,EAEA,KAAA,OAAS,MAAOzY,EAAcyY,IAAgC,CAC1Dq0C,GAAK,QAAQ,EACb,MAAM,KAAK,IAAI9sD,EAAMyY,CAAI,CAC7B,EAEA,KAAA,OAAS,MAAOzY,GAAgC,CAC5C8sD,GAAK,QAAQ,EACb,KAAM,CAAA,CAAGG,EAAOzgD,CAAE,EAAIxM,EAAK,MAAM,GAAG,EACpC,GAAI,CAACwM,EAAI,CAAE,QAAQ,MAAM,0CAA0C,EAAG,MAAQ,CAC9E,MAAM,MAAM,GAAG,KAAK,OAAO,GAAG,YAAYygD,CAAK,UAAUzgD,CAAE,GAAI,CAC3D,OAAQ,SACR,QAAS,CACL,OAAQ,KAAK,OAAO,QACpB,cAAe,UAAU,KAAK,OAAO,OAAO,EAAA,CAChD,CACH,CACL,EAEA,KAAA,UAAY,CACRxM,EACAixB,EACA+7B,IACe,CACf,GAAI,CAAChtD,EAAM,MAAO,OAClB8sD,GAAK,6CAA6C,EAClD,KAAM,CAAA,CAAGG,CAAK,EAAIjtD,EAAK,MAAM,GAAG,EAC1BmtD,EAAO,SAAY,CAOrB,MAAM10C,EAAc,MANR,MAAM,MAAM,GAAG,KAAK,OAAO,GAAG,YAAYw0C,CAAK,GAAI,CAC3D,QAAS,CACL,OAAQ,KAAK,OAAO,QACpB,cAAe,UAAU,KAAK,OAAO,OAAO,EAAA,CAChD,CACH,GAC6B,KAAA,EAC9Bh8B,EAAWxY,EAAK,IAAI,CAACy0C,EAAG7sD,KAAO,CAAE,GAAG6sD,EAAG,KAAM,OAAOA,EAAE,IAAM7sD,CAAC,EAAG,OAAQA,CAAA,EAAI,CAAC,CACjF,EACK8sD,EAAA,EACL,MAAMC,EAAW,YAAYD,EAAM,GAAI,EACvC,MAAO,IAAM,cAAcC,CAAQ,CACvC,EAEA,KAAA,MAAQ,MAAOptD,GAAkC,OAC7C8sD,GAAK,OAAO,EACZ,KAAM,CAAA,CAAGG,CAAK,EAAIjtD,EAAK,MAAM,GAAG,EAQ1BqtD,GAAQh/C,GAPF,MAAM,MAAM,GAAG,KAAK,OAAO,GAAG,YAAY4+C,CAAK,aAAc,CACrE,QAAS,CACL,OAAQ,KAAK,OAAO,QACpB,cAAe,UAAU,KAAK,OAAO,OAAO,GAC5C,OAAQ,aAAA,CACZ,CACH,GACiB,QAAQ,IAAI,eAAe,IAA/B,YAAA5+C,EAAkC,MAAM,KAAK,GAC3D,OAAOg/C,EAAQ,SAASA,EAAO,EAAE,EAAI,CACzC,EAnGI,KAAK,OAAS7oD,CAClB,CAEA,uBAAoD,CAChD,OAAOic,GACH,uBACAF,GAAe,KAAK,OAA8C,CAAC,MAAO,SAAS,EAAG,WAAW,CAAA,CAEzG,CAEA,cAAwB,CACpB,OAAO,KAAK,wBAAwB,UACxC,CAwFJ,CC1GA,MAAMusC,GAAQhkB,GACV,QAAQ,KAAK,2BAA2BA,CAAM,8BAA8B,EAEzE,MAAMwkB,EAA0D,CAGnE,YAAY9oD,EAA+B,CAmB3C,KAAA,OAAS,MAAOshC,EAAc9lC,IAA8C,CACxE8sD,GAAK,QAAQ,EACb,MAAMhzC,EAASgsB,EAAK,MAAM,GAAG,EAAE,CAAC,EAC1BlsB,EAAS,KAAKE,CAAM,EACpBH,EAAQ,IAAI,WAAWC,EAAO,MAAM,EAC1C,QAASvZ,EAAI,EAAGA,EAAIuZ,EAAO,OAAQvZ,IAAKsZ,EAAMtZ,CAAC,EAAIuZ,EAAO,WAAWvZ,CAAC,EACtE,MAAM8Z,EAAO,IAAI,KAAK,CAACR,CAAK,CAAC,EAEvBuG,EAAM,MAAM,MACd,GAAG,KAAK,OAAO,GAAG,sBAAsB,KAAK,MAAM,IAAIlgB,CAAI,GAC3D,CACI,OAAQ,OACR,QAAS,CACL,OAAQ,KAAK,OAAO,QACpB,cAAe,UAAU,KAAK,OAAO,OAAO,EAAA,EAEhD,KAAMma,CAAA,CACV,EAEJ,GAAI,CAAC+F,EAAI,GAAI,CAAE,QAAQ,MAAM,yBAA0B,MAAMA,EAAI,MAAM,EAAG,MAAQ,CAClF,OAAO,KAAK,OAAOlgB,CAAI,CAC3B,EAEA,KAAA,OAAS,MAAOA,GACL,GAAG,KAAK,OAAO,GAAG,6BAA6B,KAAK,MAAM,IAAIA,CAAI,GAG7E,KAAA,SAAW,MAAOA,GAA4C,CAC1D8sD,GAAK,UAAU,EACf,MAAMl6C,EAAM,MAAM,KAAK,OAAO5S,CAAI,EAClC,GAAK4S,EACL,GAAI,CACA,MAAMsN,EAAM,MAAM,MAAMtN,CAAG,EAC3B,GAAI,CAACsN,EAAI,GAAI,MAAM,IAAI,MAAM,iBAAiB,EAC9C,OAAO,MAAMA,EAAI,KAAA,CACrB,OAAS5K,EAAO,CACZ,QAAQ,MAAM,2BAA4BA,CAAK,CACnD,CACJ,EAEA,KAAA,OAAS,MAAOtV,IACZ8sD,GAAK,QAAQ,GACD,MAAM,MACd,GAAG,KAAK,OAAO,GAAG,sBAAsB,KAAK,MAAM,IAAI9sD,CAAI,GAC3D,CACI,OAAQ,SACR,QAAS,CACL,OAAQ,KAAK,OAAO,QACpB,cAAe,UAAU,KAAK,OAAO,OAAO,EAAA,CAChD,CACJ,GAEO,IAtEX,KAAK,OAASwE,CAClB,CAEA,uBAAoD,CAChD,OAAOic,GACH,0BACAF,GAAe,KAAK,OAA8C,CAAC,MAAO,SAAS,EAAG,WAAW,CAAA,CAEzG,CAEA,cAAwB,CACpB,OAAO,KAAK,wBAAwB,UACxC,CAEA,IAAY,QAAS,CACjB,OAAO,KAAK,OAAO,QAAU,QACjC,CAwDJ,CC1CO,MAAMgtC,GAAoD,CAC7D,WAAa,CAAE,QAAS,OAAW,OAAQ,IAAM,IAAIj9B,EAAqB,EAC1E,YAAa,CAAE,QAAS,UAAW,OAAQ,IAAM,IAAIy7B,EAAwB,CACjF,EAIayB,GAAwD,CACjE,WAAY,CAAE,QAAS,OAAS,OAAQ,IAAM,IAAI1gC,EAAmB,EACrE,MAAY,CAAE,QAAS,QAAS,OAAQ,IAAM,IAAI8/B,EAAmB,CACzE,EAEaa,GAAkD,CAC3D,YAAa,CAAE,QAAS,OAAQ,OAASC,GAAQ,IAAIxB,GAAoBwB,CAAG,CAAA,CAChF,EAIaC,GAA4D,CACrE,WAAiB,CAAE,QAAS,OAAW,OAASD,GAAQ,IAAIX,GAAqBW,CAAG,CAAA,EACpF,gBAAiB,CAAE,QAAS,UAAW,OAASA,GAAQ,IAAIJ,GAAwBI,CAAG,CAAA,CAC3F,EAIaE,GAAoD,CAC7D,KAAM,CAAE,QAAS,OAAQ,OAASF,GAAQ,IAAI3D,GAAiB2D,GAAA,YAAAA,EAAK,IAAI,CAAA,CAC5E,EAIaG,GAA0D,CACnE,SAAUN,GACV,OAAUC,GACV,QAAUC,GACV,SAAUE,GACV,KAAUC,EACd,ECMA,SAASE,GAAsB5+C,EAA6B6+C,EAAsC,CAC9F,GAAI,CAACA,EAAQ,OACb,MAAM3+C,EAAY2+C,EACZxkD,EAAU,OAAOwkD,GAAW,UAAY,CAAC,MAAM,QAAQA,CAAM,EAAI,OAAO,QAAQ3+C,CAAS,EAAI,CAAA,EAGnG,GAFmB7F,EAAQ,OAAS,GAAKA,EAAQ,MAAM,CAAC,CAAA,CAAG5I,CAAK,IAAM,OAAOA,GAAU,UAAYA,IAAU,IAAI,EAEjG,CACZ,OAAO,OAAOuO,EAAUE,CAAS,EACjC,MACJ,CAEAF,EAAS,OAAS6+C,CACtB,CAEA,SAASC,GAAoB9+C,EAA6B++C,EAAoB9+C,EAA2B,CACrG,OAAI8+C,GAAa/+C,EAAS++C,CAAS,EAAUA,EAEtC,OAAO,KAAK/+C,CAAQ,EAAE,CAAC,GAAK,SACvC,CAEA,SAASg/C,GAA0BhiD,EAAgC,GAAI,aACnE,MAAMuM,EAA4C,CAAA,EAC5C01C,EAAkD,CAAA,EAClDvrC,EAA4C,CAAA,EAC5C6pC,EAA8C,CAAA,EAE9C2B,EAAa,CAAE,KAAA31C,EAAM,QAAA01C,EAAS,KAAAvrC,EAAM,MAAA6pC,CAAA,EAI1C,SAAW,CAAC4B,EAAaC,CAAQ,IAAK,OAAO,QAAQT,EAAkB,EAAG,CACtE,MAAMH,EAAOxhD,EAAsCmiD,CAAW,EAC9D,GAAIX,IAAQ,OACZ,SAAW,CAACa,EAAYC,CAAU,IAAK,OAAO,QAAQF,CAAQ,EAC1DF,EAAWI,EAAW,OAAO,EAAED,CAAU,EAAIC,EAAW,OAAOd,CAAG,CAE1E,CAEAI,GAAmBr1C,GAAMpK,EAAAnC,EAAU,SAAV,YAAAmC,EAAkB,IAAI,EAC/Cy/C,GAAmBK,GAASr8C,EAAA5F,EAAU,SAAV,YAAA4F,EAAkB,OAAO,EACrDg8C,GAAmBlrC,GAAMvH,EAAAnP,EAAU,SAAV,YAAAmP,EAAkB,IAAI,EAC/CyyC,GAAmBrB,GAAOltC,EAAArT,EAAU,SAAV,YAAAqT,EAAkB,KAAK,EAE7C,OAAO,KAAK9G,CAAI,EAAE,SAAW,IAAGA,EAAK,KAAO,IAAIsxC,IAChD,OAAO,KAAKnnC,CAAI,EAAE,SAAW,IAAGA,EAAK,WAAa,IAAIkK,IAE1D,MAAM2hC,EAAMviD,EAAU,SAEtB,MAAO,CACH,KAAS,CAAE,SAAUuM,EAAS,WAAYu1C,GAAiBv1C,EAASg2C,GAAA,YAAAA,EAAK,IAAI,CAAA,EAC7E,QAAS,CAAE,SAAUN,EAAS,WAAYH,GAAiBG,EAASM,GAAA,YAAAA,EAAK,OAAO,CAAA,EAChF,KAAS,CAAE,SAAU7rC,EAAS,WAAYorC,GAAiBprC,EAAS6rC,GAAA,YAAAA,EAAK,IAAI,CAAA,EAC7E,MAAS,CAAE,SAAUhC,EAAS,WAAYuB,GAAiBvB,EAASgC,GAAA,YAAAA,EAAK,KAAK,CAAA,CAAE,CAExF,CACA,MAAMC,GAAqB,CAAC,CACxB,SAAAx/C,EACA,WAAA+O,EACA,SAAAlY,CACJ,IAIM,OAAO,KAAKmJ,CAAQ,EAAE,OAAS,EAC/B/G,EAAA,cAACwjD,GAAA,CAAc,SAAAz8C,EAAoB,WAAA+O,CAAA,EAAyBlY,CAAS,kCAClEA,CAAS,EAElB,IAAI+H,GAAmB,CAAA,EAChB,MAAM6gD,GAAiBnqD,GAAuB,CACjDsJ,GAAOtJ,CACX,EACaoqD,GAAiBvkD,GACnByD,GAAKzD,CAAI,GAAK,CAAA,EAMzB,SAASwkD,GAAI,CACI,WAAAC,EACA,cAAAC,EAAqB,OACrB,SAAAC,EAAqB,OACrB,aAAAC,EAAqB,OACrB,WAAAz6C,EAAqB,OACrB,SAAA06C,EAAqB,OACrB,QAAA9T,EAAU,aACV,WAAA+T,EAAqB,CAAA,EACrB,UAAAjjD,EAAqB,CAAA,EACrB,aAAAkjD,EACA,cAAAC,EACA,SAAAtpD,CACjB,EAAa,CACT,MAAMupD,EAAqBpB,GAA0BhiD,CAAS,EACxDqjD,EAAeD,EAAmB,KAClCE,EAAkBF,EAAmB,QACrCG,EAAeH,EAAmB,KAClCI,EAAgBJ,EAAmB,MACzCX,GAAcQ,CAAU,EAExB,MAAMQ,EAAc,CAAC,CAAE,SAAA5pD,CAAAA,oCAAiDA,CAAS,EAC3E6pD,EAAmE,CAAC,CAAE,WAAAC,EAAY,QAAA3yC,CAAA,oBACnFmM,GAAA,CAAM,KAAK,SAAA,EAAU,iBAAewmC,EAChC3yC,GAAW/U,EAAA,cAAC,QAAK,UAAW,QAAS+U,CAAQ,CAClD,EAGJ,SAAS4yC,EAASxvD,EAAa2N,EAAgBvN,EAAmC,CAM9E,MAAMmvD,EAAa,UALD5hD,EAAK,UAAY,IAAMA,EAAK,UACzCA,EAAK,OAAS,IACT,QACA8hD,GAAQ,QAAQ9hD,EAAK,KAAK,MAAM,GAAG,EAAE,CAAC,CAAC,CAEX,MAEhC+hD,EAAgB/hD,EAAK,MAAQ9F,EAAM,KAAK,IAC1C2mD,EAAWe,CAAU,EAChB,KAAMI,GACC,OAAOA,EAAI,SAAY,YACvB,QAAQ,KAAK,gCAAgCJ,CAAU,EAAE,EAClD,CAAE,QAAS,IAAM1nD,EAAA,cAACynD,EAAA,CAAa,WAAAC,EAAwB,CAAA,GAG3D,CAAE,QAASI,EAAI,OAAA,CACzB,EACA,MAAOx6C,IACJ,QAAQ,MAAM,oBAAoBo6C,CAAU,IAAKp6C,CAAG,EAC7C,CAAE,QAAS,IAAMtN,EAAA,cAACynD,GAAa,WAAAC,EAAwB,QAASp6C,EAAI,OAAA,CAAS,CAAA,EACvF,CAAA,EAGHy6C,EAAkBjiD,EAAK,QAAU8gD,GAAiBY,EACxD,OACIxnD,EAAA,cAACgoD,GAAAA,MAAA,CACG,IAAK,GAAG7vD,CAAG,IAAII,CAAK,GACpB,KAAMuN,EAAK,KACX,QACI9F,EAAA,cAAC+nD,EAAA,KACG/nD,EAAA,cAACioD,EAAAA,SAAA,CAAS,SAAUjoD,EAAA,cAAC,MAAA,KAAI,YAAU,CAAA,EAC/BA,EAAA,cAAC6nD,EAAA,IAAc,CACnB,CACJ,CAAA,CAAA,CAIhB,CAEA,MAAMK,EAAgBC,GAClB,OAAO,KAAKA,CAAU,EAAE,WACpBA,EAAWhwD,CAAG,EAAE,QAAQ,CAAC2N,EAAMvN,IAAU,CACrCuN,EAAK,MAAQ6hD,EAASxvD,EAAK2N,EAAMvN,CAAK,EACtCuN,EAAK,UAAYoiD,EAAa,CAAE,SAAUpiD,EAAK,SAAU,CAAA,EAC3D,OAAO,OAAO,CAAC,CAAA,EAGzB,OACI9F,EAAA,cAACooD,GAAAA,cAAA,CAAc,OAAQ,CAAE,qBAAsB,GAAM,mBAAoB,EAAA,CAAK,EAC1EpoD,EAAA,cAACmM,GAAA,CAAgB,cAAe,CAC5B,MAAO8mC,EACP,SAAUlvC,EAAU,SACpB,OAAQA,EAAU,OACZ,CACE,OAAQ,CAAE,SAAUA,EAAU,OAAO,SAAU,MAAOA,EAAU,OAAO,KAAA,EACvE,eAAgBA,EAAU,OAAO,eACjC,eAAgBA,EAAU,OAAO,cAAA,EAEnC,OACN,QAASA,EAAU,QACnB,GAAI8iD,EACJ,OAAQC,EACR,SAAAC,CAAA,EACD,WAAA16C,GACKrM,EAAA,cAAC6V,GAAA,CAAc,GAAGyxC,CAAA,EAClBtnD,EAAA,cAACqc,IAAc,GAAG+qC,CAAA,kBACjB3F,GAAA,CAAiB,GAAG4F,GACrBrnD,EAAA,cAACumD,GAAA,CAAmB,SAAUgB,EAAc,SAAU,WAAYA,EAAc,UAAA,EAChFvnD,EAAA,cAAC8D,IAAa,OAAQmjD,CAAA,kBACrB1T,GAAA,CAAa,QAAAN,CAAA,kBACbt1C,GAAA,CAAc,OAAQupD,GAClBtpD,EACDoC,EAAA,cAACqoD,GAAAA,YACGroD,EAAA,cAACgoD,GAAAA,MAAA,CAAM,KAAMrvC,GAAmB,wBAAUoB,GAAA,IAAU,CAAA,CAAI,EACxD/Z,EAAA,cAAAA,EAAA,SAAA,KACKkoD,EAAa,CACV,QAAS,CAAC,CAAE,KAAM,IAAK,EACnB,GAAGviD,GACH,MAAO,CAAC,CACJ,KAAM,SACN,KAAM27C,GACN,OAAQsF,CAAA,CACX,CACL,CACH,CACL,EACA5mD,EAAA,cAACgoD,GAAAA,OAAM,KAAK,IAAI,QAAShoD,EAAA,cAACuhD,GAAA,IAAS,EAAI,CAC3C,CACJ,CACA,CACA,CACA,CACA,CACA,CACA,CACR,CACJ,CAER,CAGO,MAAM37C,GAAW1D,GAAgC,CACpD,MAAMomD,EAAwB7B,GAAcvkD,CAAI,EAC1C8X,EAAWC,GAAAA,YAAA,EAGXsuC,EAAcziB,GACTA,EAAM,IAAKhgC,GAAS,CAEvB,MAAM6mB,EAAW3S,EAAS,WAAalU,EAAK,KAGtClI,EAAWkI,EAAK,SAAWyiD,EAAWziD,EAAK,QAAQ,EAAI,CAAA,EAGvD+B,EAAS8kB,GAAY/uB,EAAS,KAAK4I,GAASA,EAAM,MAAM,EAE9D,MAAO,CACH,GAAGV,EACH,OAAA+B,EACA,SAAAjK,CAAA,CAER,CAAC,EAIL,OAAOE,EAAAA,QAAQ,IAAMyqD,EAAWD,CAAS,EAAG,CAACtuC,EAAS,QAAQ,CAAC,CACnE,ECpUA,IAAI3d,GACA,OAAO4P,IAAmB,YAC1BA,GAAgBsY,GAAsB,CAClCloB,GAASkoB,EAAU,MACvB,CAAC,EAGE,MAAMikC,GAAqB,0BACrBC,GAAmB,yBAEnBC,GAAsC,CAC/C,IAAK,0BACL,KAAM,6BACN,IAAK,6BACL,IAAK,6BACL,IAAK,4BACT,EAEaC,GAA2C,CACpD,GAAI,yBACJ,GAAI,yBACJ,GAAI,yBACJ,GAAI,yBACJ,GAAI,wBACR,EAEO,SAASC,GAAqB1uC,EAAsB,CACvD,OAAOwuC,GAAYxuC,EAAK,YAAA,CAAa,GAAKsuC,EAC9C,CAEO,SAASK,GAAoB3uC,EAAsB,CACtD,OAAOyuC,GAAiBzuC,EAAK,YAAA,CAAa,GAAKuuC,EACnD,CASA,eAAsBK,GAAgB,CACI,QAAAC,EACA,mBAAAC,EACA,QAAAC,EAAwB,MACxB,aAAAC,EAAwB,IAC5B,EAA0B,OAC5D,GAAI,EAAC7sD,IAAAA,MAAAA,GAAQ,gBACT,eAAQ,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAcrB,EACc,CAAA,EAGX,MAAM8mD,EAAc,MAAMc,GAAqB,CAC3C,yCAAA,CACH,EAEKkF,EAAYP,GAAqBK,CAAO,EACxCnnC,EAAW+mC,GAAoBK,CAAY,EAE3Cz+C,EAAM,kDAAkDu+C,CAAkB,wBAE1Ex2C,EAAO,CACT,YAAa,CACT,SAAU,CAACu2C,CAAO,CAAA,EAEtB,mBAAoB,CAACI,CAAS,EAC9B,SAAArnC,CAAA,EAGE/J,EAAM,MAAM,MAAMtN,EAAK,CACzB,OAAQ,OACR,QAAS,CACL,cAAiB,UAAU04C,CAAW,GACtC,kBAAmB9mD,GAAO,eAC1B,eAAgB,kBAAA,EAEpB,KAAM,KAAK,UAAUmW,CAAI,CAAA,CAC5B,EAED,GAAI,CAACuF,EAAI,GAAI,CACT,MAAMzK,EAAM,MAAMyK,EAAI,KAAA,EACtB,MAAM,IAAI,MAAM,0BAA0BA,EAAI,MAAM,MAAMzK,CAAG,EAAE,CACnE,CAIA,QAAOpH,GAFM,MAAM6R,EAAI,KAAA,GAEX,UAAL,YAAA7R,EAAc,IAAKJ,GAAA,aAAe,OACrC,QAASA,EAAK,KACd,qBAAoBI,EAAAJ,EAAK,qBAAL,YAAAI,EAAyB,qBAAsB,EACnE,cAAayD,EAAA7D,EAAK,qBAAL,YAAA6D,EAAyB,cAAe,cACrD,KAAKyN,GAAAlE,EAAApN,EAAK,qBAAL,YAAAoN,EAAyB,aAAzB,MAAAkE,EAAqC,OACpCtR,EAAK,mBAAmB,WAAW,OAAS,IAC5C,IAAA,MACH,CAAA,CACX,CCrFA,eAAsBsjD,GAClBL,EACAM,EAAc,KACdC,EAAoB,aACS,CAC7B,MAAMC,EAAa,kEAAkE,mBACjF,KAAK,UAAU,CACX,eAAgB,CAAC,CAAE,QAAAR,EAAS,IAAAM,EAAK,KAAMC,EAAW,EAClD,SAAU,EACV,SAAU,EAAA,CACb,CAAA,CACJ,MAAM,KAAK,IAAA,CAAK,GAGXE,EAAa,MADD,MAAM,MAAMD,CAAU,GACL,KAAA,EAG7BE,EAFa,KAAK,MAAMD,EAAW,QAAQ,QAAS,EAAE,CAAC,EAE3B,QAAQ,KAAME,GAAWA,EAAE,KAAO,YAAY,EAChF,GAAI,CAACD,EAAgB,MAAM,IAAI,MAAM,2BAA2B,EAEhE,MAAMz8C,EAAQy8C,EAAe,MACvBE,EAAMF,EAAe,QAErBG,EAAc,+EAA+E,mBAC/F,KAAK,UAAUD,CAAG,CAAA,CACrB,UAAU38C,CAAK,MAAM,KAAK,KAAK,GAG1B68C,EAAe,MADD,MAAM,MAAMD,CAAW,GACJ,KAAA,EAGjCE,EAFe,KAAK,MAAMD,EAAa,QAAQ,QAAS,EAAE,CAAC,EAErB,QAAQ,aAAa,IAAKtzD,IAAY,CAC9E,KAAMA,EAAE,cACR,MAAOA,EAAE,MAAM,CAAC,CAAA,EAClB,EAEF,MAAO,CACH,QAAAwyD,EACA,SAAAe,CAAA,CAER,CAKA,eAAsBC,GAClBhB,EACAM,EAAc,KACdC,EAAoB,aACgB,iBACpC,MAAMC,EAAa,kEAAkE,mBACjF,KAAK,UAAU,CACX,eAAgB,CAAC,CAAE,QAAAR,EAAS,IAAAM,EAAK,KAAMC,EAAW,EAClD,SAAU,EACV,SAAU,EAAA,CACb,CAAA,CACJ,MAAM,KAAK,IAAA,CAAK,GAGXE,EAAa,MADD,MAAM,MAAMD,CAAU,GACL,KAAA,EAG7BS,EAFa,KAAK,MAAMR,EAAW,QAAQ,QAAS,EAAE,CAAC,EAE5B,QAAQ,KAAME,GAAWA,EAAE,KAAO,iBAAiB,EACpF,GAAI,CAACM,EAAe,MAAM,IAAI,MAAM,kCAAkC,EAEtE,MAAMC,EAAa,qFAAqF,mBACpG,KAAK,UAAUD,EAAc,OAAO,CAAA,CACvC,UAAUA,EAAc,KAAK,MAAM,KAAK,KAAK,GAGxCE,EAAc,MADD,MAAM,MAAMD,CAAU,GACJ,KAAA,EAC/BE,EAAc,KAAK,MAAMD,EAAY,QAAQ,QAAS,EAAE,CAAC,EAEzD5wC,IAAMpG,GAAAvJ,GAAAzD,EAAAikD,EAAY,QAAQ,aAApB,YAAAjkD,EAAiC,KAAjC,YAAAyD,EAAqC,gBAArC,YAAAuJ,EAAoD,IAAKpN,IAAe,CAChF,MAAOA,EAAK,MACZ,MAAOA,EAAK,KAAA,MACT,CAAA,EAEDskD,IAASjyC,GAAAD,GAAAd,EAAA+yC,EAAY,QAAQ,aAApB,YAAA/yC,EAAiC,KAAjC,YAAAc,EAAqC,gBAArC,YAAAC,EAAoD,IAAKrS,IAAe,CACnF,MAAOA,EAAK,MACZ,MAAOA,EAAK,KAAA,MACT,CAAA,EAEP,MAAO,CACH,QAAAijD,EACA,IAAAzvC,EACA,OAAA8wC,CAAA,CAER,CCzGA,MAAMC,GAAsB,IACtBC,GAAc,+BA4DpB,IAAIjuD,GACA,OAAO4P,IAAmB,YAC1BA,GAAgBsY,GAAsB,CAClCloB,GAASkoB,EAAU,OACvB,CAAC,EAGL,MAAMgmC,GAAmB,MACrB9/C,EACA+H,EACAC,EAAkC,CAAA,IACP,CAC3B,GAAI,CAACpW,GACD,eAAQ,MAAM,2BAA2B,EAClC,KAGX,MAAMmuD,EAAc,MAAM3vC,GAAexe,GAAO,QAAQ,EACxD,GAAG,CAACmuD,EACA,MAAM,IAAI,MAAM,iCAAiC,EAGrD,OAAO,MAAM,MAAM//C,EAAK,CACpB,OAAQ,OACR,QAAS,CACL,cAAe,UAAU+/C,CAAY,GACrC,eAAgB,2BAChB,GAAG/3C,CAAA,EAEP,KAAAD,CAAA,CACH,EAAE,MAAOrF,IACN,QAAQ,MAAM,gDAAiDA,CAAK,EAC7D,KACV,EAAE,QAAQ,IAAM,CACb,QAAQ,IAAI,oCAAoC,CACpD,CAAC,CACL,EAEMs9C,GAAe,MACjBhgD,EACA+H,EACAC,EAAkC,CAAA,IACnB,CACf,GAAI,CAACpW,GAAQ,CACT,QAAQ,MAAM,2BAA2B,EACzC,MACJ,CACA,MAAMmuD,EAAc,MAAM3vC,GAAexe,GAAO,QAAQ,EACxD,GAAG,CAACmuD,EAAc,CACd,QAAQ,MAAM,iCAAiC,EAC/C,MACJ,CAEA,OAAO,MAAMp3C,GAAe3I,EAAK,CAC7B,OAAQ,OACR,QAAS,CACL,cAAe,UAAU+/C,CAAY,GACrC,eAAgB,mBAChB,GAAG/3C,CAAA,EAEP,KAAM,KAAK,UAAUD,CAAI,CAAA,CAC5B,EAAE,KAAK,MAAOM,GAAa,CACxB,GAAIA,EAAS,SAAW,IAAK,CACzB,MAAMG,EAAO,MAAMH,EAAS,KAAA,GACxB,CAACG,EAAK,eAAiB,CAACA,EAAK,cAAc,SAAS,WAAW,IAC/D,QAAQ,MAAM,mCAAoCA,EAAMxI,EAAK+H,CAAI,EAErE,MACJ,CACA,OAAOM,CACX,CAAC,EAAE,MAAO3F,GAAU,CAChB,QAAQ,MAAM,gDAAiDA,EAAO1C,EAAK+H,CAAI,CAEnF,CAAC,EAAE,QAAQ,IAAM,CACb,QAAQ,IAAI,qCAAsC/H,EAAK+H,CAAI,CAC/D,CAAC,CACL,EAEak4C,GAAc,CAAC7yD,EAAc8yD,EAAc,KAAkB,CACtE,MAAMC,GAAWvuD,IAAAA,YAAAA,GAAQ,WAAY,GACrC,OAAQsuD,EAAcL,GAAc,KAAOzyD,EAAK,WAAW+yD,CAAQ,EAAI/yD,EAAO+yD,EAAW/yD,EAC7F,EAEMgzD,GAAS,MACXC,EACAC,EAA8B,GAC9BC,EAA8B,KACI,CAClC,MAAMx0C,EAAgC,CAAA,EAKtC,OAJqB,MAAMy0C,GAAQ,YAAY,CAC3C,KAAM,GAAGH,EAAUC,CAAS,GAC5B,UAAW,EAAA,CACd,GACY,QAAQG,GAAe,CAC5BA,EAAY,MAAM,IAAM,WAC5B10C,EAAMw0C,EAAkBG,GAAS,eAAeD,EAAY,aAAc,CAAC,IAAI,EAAA,CAAG,EAAGA,EAAY,YAAY,EAAIA,EAAY,KACjI,CAAC,EAEM10C,CACX,EAEM40C,GAAc,MAChBt4C,EACAjb,IAC6B,CAC7B,GAAI,CAACib,EAAS,aACV,OAAO,QAAQ,OAAOA,CAAQ,EAGlC,IAAIu4C,EACAC,EAAa,GACjB,KAAOA,GACH,MAAM19C,GAAM,GAAG,EACfy9C,EAAQ,MAAMZ,GAAa,gCAAgC5yD,CAAI,SAAU,CACrE,aAAcib,EAAS,YAAA,CAC1B,EAED,QAAQ,IAAI,oCAAqCu4C,CAAK,GAElDA,GAAA,YAAAA,EAAQ,WAAY,gBACpBC,EAAa,IAIrB,OAAQD,GAAA,YAAAA,EAAQ,WAAY,WACtB,QAAQ,QAAQA,EAAM,OAAO,EAC7B,QAAQ,OAAOA,CAAK,CAE9B,EAGME,GAAgB,MAAO/0C,EAAiBg1C,EAAW,KAAqB,CAC1E,MAAMC,EAAU,4BACV34C,EAAW,MAAM23C,GAAa,gCAAgCgB,CAAO,GAAI,CAC3E,WAAc,GACd,YAAe,GACf,MAASj1C,EAAM,OAAYk0C,GAAYc,EAAW3zD,CAAI,CAAC,CAAA,CAC1D,EAED,OAAOib,EAAWs4C,GAAYt4C,EAAU24C,CAAO,EAAI,MACvD,EAEMC,GAAa,MAAOl1C,EAAiBg1C,EAAW,KAAqB,CACvE,MAAMC,EAAU,4BACV34C,EAAW23C,GAAa,gCAAgCgB,CAAO,GAAI,CACrE,QAASj1C,EAAM,IAAI3e,IAAS,CAAE,KAAM6yD,GAAYc,EAAW3zD,CAAI,GAAI,CAAA,CACtE,EAED,OAAOib,EAAWs4C,GAAYt4C,EAAU24C,CAAO,EAAI,MACvD,EAEME,GAAS,MAAO9zD,EAAcwhD,IACzBoR,GAAa,8CAA+C,CAC/D,KAAQ5yD,EACR,SAAYwhD,EAAI,YAAA,EAAc,WAAW,aAAc,EAAE,CAAA,CAC5D,EAGCuS,GAAU,MAAOp1C,EAAiCg1C,EAAW,KAAsB,CACrF,UAAW3zD,KAAQ2e,EACf,UAAW6iC,KAAO7iC,EAAM3e,CAAI,EACxB,MAAM8zD,GAAOjB,GAAYc,EAAW3zD,CAAI,EAAGwhD,CAAG,CAG1D,EAEawS,GAAc,MAAO,CAAE,KAAAh0D,EAAO,GAAI,UAAAi0D,EAAY,EAAA,EAA6B,KAAuB,CAC3G,MAAM1qD,EAAU,CAAA,EACV2qD,EAAe,MAAO,CACI,KAAAl0D,EACA,OAAAuqC,EACA,UAAA0pB,CAAA,IAOxBj0D,EACE,MAAM4yD,GAAa,iDAAkD,CACnE,gBAAmB,GACnB,oCAAuC,GACvC,mBAAsB,GACtB,wBAA2B,GAC3B,+BAAkC,GAClC,KAAQC,GAAY7yD,CAAI,EACxB,UAAai0D,CAAA,CAChB,EACC,MAAMrB,GAAa,0DAA2D,CAC5E,OAAUroB,CAAA,CACb,EAIT,IAAI4pB,EAAiD,CAAE,SAAU,GAAM,OAAQ,GAAI,QAAS,EAAC,EAC7F,KAAOA,GAAA,MAAAA,EAAS,UACZA,EAAU,MAAMD,EAAaC,EAAQ,OAC/B,CAAC,OAAQA,EAAQ,OAAQ,UAAAF,CAAA,EACzB,CAAC,KAAAj0D,EAAa,UAAAi0D,CAAA,CAAS,EAE7BE,GAAW5qD,EAAQ,KAAK,GAAG4qD,EAAQ,OAAO,EAG9C,OAAO5qD,CACX,EAmBMq2C,GAAO,MAAOjhC,GAAuC,CAGvD,MAAMy1C,EAAY,MAAO7qD,GACd,MAAMqpD,GAAa,mDAAoD,CAC1E,QAASrpD,EACT,WAAY,EAAA,CACf,EAEC8qD,EAAiB,MAAOC,GACnB,MAAM1B,GAAa,yDAA0D,CAChF,aAAc0B,CAAA,CACjB,EAGCxhB,EAAU,CAAA,EAChB,IAAIvpC,EAAU,CAAA,EACd,QAASlJ,EAAI,EAAGA,EAAIse,EAAM,OAAQte,GAAK,IAAM,CACzCkJ,EAAUoV,EAAM,MAAMte,EAAGA,EAAI,GAAI,EAAE,IAAIL,IAAS,CAC5C,UAAW6yD,GAAY7yD,EAAK,IAAI,EAChC,QAAS6yD,GAAY7yD,EAAK,EAAE,CAAA,EAC9B,EAEF,MAAMu0D,EAAe,MAAMH,EAAU7qD,CAAO,EAC5C,GAAIgrD,EAAa,MACb,MAAM,IAAI,MAAM,wBAAwBA,EAAa,KAAK,EAAE,EAGhE,IAAIC,EAAYD,EAChB,MAAOC,GAAA,YAAAA,EAAY,WAAY,iBAAkBA,GAAA,YAAAA,EAAY,WAAY,eACrE,MAAMz+C,GAAMy8C,EAAmB,EAE/BgC,EAAY,MAAMH,EAAeE,EAAa,YAAY,EAG9D,IAAIC,GAAA,YAAAA,EAAY,WAAY,SACxB,MAAM,IAAI,MAAM,0BAA0BA,EAAU,MAAM,CAAC,EAAE,GAG7DA,GAAA,YAAAA,EAAY,WAAY,YACxB1hB,EAAQ,KAAK,GAAG0hB,EAAU,OAAO,CAEzC,CAEA,OAAO1hB,EACF,OAAOh6B,GAASA,EAAM,MAAM,IAAM,SAAS,EAC3C,IAAIA,GAASA,EAAM,OAAO,CACnC,EAEM27C,GAAO,MAAO91C,GAAsC,CACtD,MAAM+1C,EAAY,MAAO57C,GACd,MAAM85C,GAAa,6CAA8C,CACpE,GAAG95C,EACH,WAAY,EAAA,CACf,EAGL,UAAW9Y,KAAQ2e,EACf,MAAM+1C,EAAU,CACZ,UAAW7B,GAAY7yD,EAAK,IAAI,EAChC,QAAS6yD,GAAY7yD,EAAK,EAAE,CAAA,CAC/B,CAET,EAGM20D,GAAgB,MAClB,CACI,kBAAAC,EAAoB,CAAA,EACpB,KAAA9nD,EAAO,SACP,OAAAhO,EAAS,OACT,KAAA6F,EAAO,QACX,EACAkwD,IAC2B,CAE3B,MAAMC,EAAuB,6FAE7B,IAAIhiB,EAAU,CAAA,EACd,MAAMiiB,EAAe,CAAA,EACrB,QAAS10D,EAAI,EAAGA,EAAIu0D,EAAkB,OAAQv0D,GAAK,GAAM,CACrD,MAAM20D,EAAQJ,EAAkB,MAAMv0D,EAAGA,EAAI,EAAI,EAC3CkJ,EAAUyrD,EAAM,IAAIlD,IAAQ,CAC9B,KAAMe,GAAYf,EAAI,IAAI,EAC1B,OAAAhzD,EACA,KAAAgO,EACA,KAAAnI,CAAA,EACF,EAEF,MAAMoR,GAAM,GAAG,EAEfg/C,EAAa,KAAKnC,GAAa,6DAA8D,CAAE,QAAArpD,EAAS,EACnG,KAAM0rD,GAAe,CAClB,GAAG,CAACA,EAAY,OAEhB,MAAM1rD,EAAU0rD,EAAW,QAAQ,OAAO,CAAC70D,EAAsB0Y,EAAYpY,IAAkB,CAC3F,MAAMV,EAAOg1D,EAAMt0D,CAAK,EAAE,KACpB,CAACmxD,EAAG/pD,CAAC,EAAIgF,EAAK,QAAQ,IAAK,EAAE,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM,EAE1D,OAAA1M,EAAIJ,CAAI,EAAI,CACR,GAAGg1D,EAAMt0D,CAAK,EACd,WAAWoY,GAAA,YAAAA,EAAQ,WAAY,UAAYA,EAAM,UAAYg8C,EAC7D,SAAU,0BACV,MAAOjD,EACP,OAAQ/pD,CAAA,EAEL1H,CACX,EAAG,CAAA,CAAE,EACL,QAAQ,IAAI,yBAA0BmJ,CAAO,EAC7CsrD,GAAA,MAAAA,EAAgBtrD,GAChBupC,EAAU,CAAC,GAAGA,EAAS,GAAGvpC,CAAAA,CAC9B,CAAC,CAAC,CACV,CACA,OAAO,QAAQ,IAAIwrD,CAAY,EAAE,KAAK,IAC3BjiB,CACV,CACL,EAEMoiB,GAAY,CAACC,EAAiBt6C,EAAc,2BAA4Bu6C,EAAY,MAAc,CACpG,MAAMr7C,EAAiB,KAAKo7C,CAAO,EAC7BE,EAAa,CAAA,EAEnB,QAAS/vB,EAAS,EAAGA,EAASvrB,EAAe,OAAQurB,GAAU8vB,EAAW,CACtE,MAAME,EAAQv7C,EAAe,MAAMurB,EAAQA,EAAS8vB,CAAS,EACvDp7C,EAAc,IAAI,MAAMs7C,EAAM,MAAM,EAE1C,QAASj1D,EAAI,EAAGA,EAAIi1D,EAAM,OAAQj1D,IAC9B2Z,EAAY3Z,CAAC,EAAIi1D,EAAM,WAAWj1D,CAAC,EAGvC,MAAM4Z,EAAY,IAAI,WAAWD,CAAW,EAC5Cq7C,EAAW,KAAKp7C,CAAS,CAC7B,CAEA,OAAO,IAAI,KAAKo7C,EAAY,CAAE,KAAMx6C,EAAa,CACrD,EAEM06C,GAAS,MAAOv1D,EAAcw1D,IAAsC,CACtE,GAAI,CACA,MAAMC,EAAaD,EAAW,MAAM,GAAG,EAAE,CAAC,EACpCr7C,EAAO+6C,GAAUO,EAAY,0BAA0B,EAE7D/C,GAAiB,gDAAiDv4C,EAAM,CACpE,kBAAmB,KAAK,UAAU,CAC9B,KAAM04C,GAAY7yD,CAAI,EACtB,KAAM,YACN,WAAY,GACZ,KAAM,EAAA,CACT,CAAA,CACJ,EAAE,KAAMib,GAAa,CAClB,QAAQ,IAAI,2BAA4BA,CAAQ,CACpD,CAAC,CACL,OAAS3F,EAAO,CACZ,QAAQ,MAAM,4CAA6CA,CAAK,CACpE,CACJ,EAEaogD,GAAoB,CAAChzC,EAAQ,KAClCle,GACGie,GAAeje,GAAO,SAAUke,CAAK,EADzB,GAIVizC,GAAuB,CAACj7C,EAAmB,KAA2B,CAC/E,GAAI,CAAClW,GACD,OACI2D,EAAA,cAAC,MAAA,CACG,MAAO,oNACP,UAAU,qCAAA,EAEVA,EAAA,cAAC0E,EAAA,CAAK,KAAK,SAAA,CAAU,EACrB1E,EAAA,cAAC,YAAK,yBAAuB,CAAA,EAIzC,MAAMytD,EAASF,GAAkB,EAAI,EAErC,OAAOvtD,EAAA,cAACgb,GAAA,CACA,SAAS,cACT,OAAO,UACP,OAAO,SACP,QAAS,CACL,GAAGzI,EACH,WAAWA,GAAA,YAAAA,EAAS,YAAak7C,EAAS,gBAAiB,gBAC3D,KAAOA,EAAS,OAAS,aACzB,MAAQA,EAAS,oBAAsB,sBAAA,CAC3C,CAAA,CAGZ,EAEaxC,GAAU,CACnB,YAAcpzD,GAAiB,CACvBwE,QAAe,SAAWxE,EAClC,EACA,YAAA6yD,GACA,cAAAa,GACA,WAAAG,GACA,QAAAE,GACA,YAAAC,GACA,cAAAW,GACA,OAAA3B,GACA,OAAAuC,GACA,KAAA3V,GACA,KAAA6U,EACJ,ECreaoB,GAAQ,MACjB7C,EACA55B,EACA,CACI,UAAA08B,EACA,QAAAC,EACA,aAAAC,EACA,YAAAC,EACA,SAAAC,EACA,YAAAC,CACJ,EACAC,EAAc,KACdC,EAAuB,KACtB,CACD,MAAMC,EAAW,GAAGN,CAAY,IAAI5zD,GAAag3B,CAAQ,CAAC,IAAI28B,CAAO,GAGrE,OAAO,MAAMnkC,GAAG,KAAK0kC,CAAQ,GAAK,MAAMJ,EAASlD,EAAQ55B,EAAU+8B,CAAW,EAAE,KAAMl7C,IAC9EA,EACA2W,GAAG,IAAI0kC,EAAUr7C,CAAQ,EAAE,KAAK,IAAM,CAEtC,CAAC,GAED,QAAQ,KAAK,GAAG66C,CAAS,IAAI18B,CAAQ,aAAa,EAClDne,EAAW,CAAA,GAGRA,EACV,CACL,EClCMs7C,GAAmB,iCAEnBC,GAAgC,SAChCC,GAAgC,gBAChCC,GAAgC,sBAChCC,GAAgC,gBAChCC,GAAgC,cAChCC,GAAgC,qBAChCC,GAAgC,sBAEhCC,GAAe,CACjB,EAAG,IACP,EAEMC,GAAgB3+B,GAAA,EAChB4+B,GAAgB5+B,GAAe,EAAI,EACnC6+B,GAAgB3+B,GAAY,EAAI,EAEhC4+B,GAAiB,CACnB,OAAQ,KACR,OAAQ,KACR,SAAU,GACV,MAAO,GACP,OAAQ,MACZ,EACMC,GAAsB,CACxB,SAAUJ,GACV,KAAM,IACV,EACMK,GAAuB,CACzB,IAAKL,GACL,OAAQ,IACZ,EACMM,GAAe,CACjB,cAAe,aACf,GAAIL,GAAY,YAAA,EAChB,GAAIC,GACJ,GAAI,UAAYD,GAChB,GAAI,QAAUC,EAClB,EAEMK,GAAW,CACb,IAAK,KACL,KAAM,SACN,KAAM,EACN,OAAQ,CACZ,EAEMC,GAAe,CACjB,QAAS,KACT,GAAIN,EACR,EAEMO,GAAmB,CACrB,CAACjB,EAAa,EAAG,CACb,GAAGW,GACH,GAAGC,GACH,GAAGE,GACH,GAAGC,GACH,GAAGR,GACH,OAAQP,GACR,QAAS,KACT,KAAM,KACN,MAAO,KACP,GAAI,KACJ,IAAK,KACL,MAAO,KACP,IAAK,IAAA,EAET,CAACC,EAAoB,EAAG,CACpB,GAAGU,GACH,GAAGC,GACH,GAAGE,GACH,GAAGC,GACH,GAAGR,GACH,OAAQN,GACR,MAAO,KACP,IAAK,IAAA,EAET,CAACC,EAA0B,EAAG,CAC1B,GAAGS,GACH,GAAGG,GACH,GAAGP,GACH,OAAQL,GACR,GAAI,KACJ,OAAQ,IAAA,EAEZ,CAACC,EAAoB,EAAG,CACpB,GAAGQ,GACH,GAAGE,GACH,GAAGN,GACH,OAAQJ,GACR,UAAW,KACX,GAAI,KACJ,IAAK,KACL,MAAO,KACP,KAAM,KACN,IAAK,IAAA,EAET,CAACC,EAAkB,EAAG,CAClB,GAAGO,GACH,GAAGC,GACH,GAAGE,GACH,GAAGC,GACH,GAAGR,GACH,OAAQH,EAAA,EAEZ,CAACC,EAAyB,EAAG,CACzB,GAAGM,GACH,GAAGK,GACH,OAAQX,EAAA,EAEZ,CAACC,EAA0B,EAAG,CAC1B,GAAGK,GACH,GAAGK,GACH,OAAQV,EAAA,CAEhB,EAGA,IAAItyD,GACA,OAAO4P,IAAmB,YAC1BA,GAAgBsY,GAAsB,CAClCloB,GAASkoB,EAAU,MACvB,CAAC,EAGL,SAASgrC,GAAqB33D,EAA+C,CACzE,MAAM43D,EAA8B,CAAA,EACpC,UAAWr3D,KAAOP,EACVA,EAAIO,CAAG,IAAM,OACbq3D,EAAOr3D,CAAG,EAAIP,EAAIO,CAAG,GAG7B,OAAOq3D,CACX,CAEA,IAAIC,GAAgB,EACpB,SAASC,GAAcrqB,EAAO,GAAO,OACjC,MAAMsqB,IAAOzpD,EAAA7J,IAAA,YAAAA,GAAQ,aAAR,YAAA6J,EAAoB,MAAM,KAAK,IAAI3I,GAAKA,EAAE,QAAQ,OAAO,WAAY,CAAA,EAClF,OAAIoyD,EAAK,SAAW,EAAU,MAE1BtqB,GACAoqB,KAGIA,GAAgBE,EAAK,OACvBA,EAAKF,EAAa,EAClB,KAEV,CAEA,MAAMG,GAAe,MAAO/E,EAAgBgF,IAAmB,CAC3D,MAAMC,EAAcC,GAAmB,CACnC,MAAMj1D,EAAQy0D,GAAqB,CAC/B,GAAID,GAAyBO,CAAM,EACnC,QAASE,EACT,EAAGlF,CAAA,CACN,EACD,QAAQ,IAAIuD,GAAkBtzD,CAAK,EACnC,MAAMH,EAAS,IAAI,gBAAgBG,CAAK,EAClC2P,EAAM,GAAG2jD,EAAgB,IAAIzzD,CAAM,GAEzC,OAAOoT,GAAMtD,CAAG,CACpB,EAEA,IAAIslD,EAASL,GAAA,EACb,KAAOK,GACH,GAAI,CACA,OAAO,MAAMljD,GAAUijD,EAAWC,CAAM,CAAC,CAC7C,OAASj9C,EAAe,CACpB,GAAIA,EAAS,QAAU,iBAAkB,CACrC,QAAQ,KAAK,6BAA6Bi9C,CAAM,GAAIj9C,CAAQ,EAC5Di9C,EAASL,GAAc,EAAI,EAC3B,QACJ,CAEA,cAAQ,MAAM,YAAYK,CAAM,GAAIj9C,CAAQ,EACtCA,CACV,CAGJ,OAAO,IACX,EAIMk9C,GAAc,MAAOnF,EAAgB55B,EAAkB,CAAC,OAAAg9B,EAAS,KAAM,WAAAC,EAAa,EAAC,EAA4C,KAC5H,MAAMR,GACT7C,EAAQ55B,EACR,CACI,UAAW,WACX,QAASh3B,GAAa4wD,CAAM,EAC5B,aAAczmC,GACd,YAAa,UACb,SAAUwrC,GACV,YAAa,CAAA,CAAC,EAElB3B,EAAQC,CAAA,EAIV+B,GAAc,CAAChC,EAAc,KAAMC,EAAuB,CAAA,KACrD,CACH,aAAc,MAAOrD,GACV,MAAMmF,GAAYnF,EAAQwD,GAAe,CAAC,OAAAJ,EAAQ,WAAAC,EAAW,EAExE,aAAc,MAAOrD,GACV,MAAMmF,GAAYnF,EAAQyD,GAAsB,CAAC,OAAAL,EAAQ,WAAAC,EAAW,EAE/E,mBAAoB,MAAOrD,GAChB,MAAMmF,GAAYnF,EAAQ0D,GAA4B,CAAC,OAAAN,EAAQ,WAAAC,EAAW,EAErF,aAAc,MAAOrD,GACV,MAAMmF,GAAYnF,EAAQ2D,GAAsB,CAAC,OAAAP,EAAQ,WAAAC,EAAW,EAE/E,WAAY,MAAOrD,GACR,MAAMmF,GAAYnF,EAAQ4D,GAAoB,CAAC,OAAAR,EAAQ,WAAAC,EAAW,EAE7E,iBAAkB,MAAOrD,GACd,MAAMmF,GAAYnF,EAAQ6D,GAA2B,CAAC,OAAAT,EAAQ,WAAAC,EAAW,EAEpF,kBAAmB,MAAOrD,GACf,MAAMmF,GAAYnF,EAAQ8D,GAA4B,CAAC,OAAAV,EAAQ,WAAAC,EAAW,CACrF,GCpOFgC,GAAM,CACR,QAASpH,GACT,MAAOM,GACP,KAAM,IACV,EC0Ba+G,GAAwC,CAEnD,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IAGL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IAGL,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAC7C,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAG7C,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAC7C,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAC7C,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAC7C,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAC7C,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IACvD,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAC7C,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAC7C,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAC7C,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAC7C,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,IAAK,EAAK,GACzD,EAGMC,GAAgC,CACpC,MAAO,CACL,YAAa,iCACb,gBAAiB,CAAC,CAAE,QAAS,OAAQ,QAAS,GAAI,EAClD,KAAM,CAAC,UAAW,MAAM,CAAA,EAE1B,MAAO,CACL,YAAa,qBACb,gBAAiB,CAAC,CAAE,QAAS,MAAO,QAAS,GAAI,EACjD,KAAM,CAAA,CAAC,EAET,MAAO,CACL,YAAa,8CACb,gBAAiB,CACf,CAAE,QAAS,WAAY,QAAS,EAAA,EAChC,CAAE,QAAS,IAAK,QAAS,GAAA,CAAI,EAE/B,KAAM,CAAC,YAAY,CAAA,EAErB,KAAM,CACJ,YAAa,kCACb,gBAAiB,CAAA,EACjB,KAAM,CAAC,UAAW,MAAM,CAAA,EAE1B,KAAM,CACJ,YAAa,yCACb,gBAAiB,CAAA,EACjB,KAAM,CAAC,CAAE,KAAM,SAAU,IAAK,aAAc,CAAA,EAE9C,KAAM,CACJ,YAAa,4BACb,gBAAiB,CAAA,EACjB,KAAM,CAAC,QAAQ,CAAA,CAEnB,EAEMC,GAAmC,CACvC,CAAE,QAAS,SAAU,IAAK,OAAA,EAC1B,CAAE,QAAS,UAAW,IAAK,OAAA,EAC3B,CAAE,QAAS,QAAS,IAAK,MAAA,EACzB,CAAE,QAAS,QAAS,IAAK,MAAA,CAC3B,EAEMC,GAAkB,IAAI,OAAO,OAAO,KAAKH,EAAa,EAAE,KAAK,GAAG,EAAG,GAAG,EAErE,SAASI,GAAqBx/C,EAAuB,CAC1D,OAAKA,EACEA,EACJ,UAAU,MAAM,EAChB,QAAQu/C,GAAiB/4D,GAAS44D,GAAc54D,CAAK,GAAKA,CAAK,EAH/C,EAIrB,CAMO,MAAMi5D,EAAU,CAIrB,YAAYn0D,EAA0B,GAAIo0D,EAA4B,CAAA,EAAI,CACxE,KAAK,OAAS,CAAE,GAAGL,GAAc,GAAG/zD,CAAA,EACpC,KAAK,QAAU,CAAC,GAAGg0D,GAAgB,GAAGI,CAAO,CAC/C,CAKA,MAAMC,EAAiCl4D,EAAYm4D,EAAoB,GAAY,CACjF,MAAMC,EAAO,KAAK,OAAOF,CAAQ,EACjC,GAAI,CAACE,EAEH,OAAOD,EAAWt+C,GAAc7Z,CAAK,EAAIA,EAG3C,IAAIgC,EAAShC,EAGbgC,EAAS+1D,GAAqB/1D,CAAM,EAGpC,MAAMq2D,EAAaD,EAAK,WAExB,GAAI,MAAM,QAAQC,CAAU,GAAKA,EAAW,OAAQ,CAClD,MAAMC,EAAc,OAAOt2D,CAAM,EAAE,YAAA,EAEnC,UAAWsL,KAAQ+qD,EAAY,CAC7B,MAAME,IAAQjrD,GAAA,YAAAA,EAAM,SAAU,IAAI,KAAA,EAAO,YAAA,EACzC,GAAKirD,GAEDD,EAAY,SAASC,CAAI,EAAG,CAC9Bv2D,EAAS,GACT,KACF,CACF,CACF,CAGA,SAAW,CAAE,QAAA5B,EAAS,QAAAo4D,EAAU,EAAA,IAAQJ,EAAK,iBAAmB,GAC9D,GAAI,CACFp2D,EAAS,OAAOA,CAAM,EAAE,QAAQ,IAAI,OAAO5B,EAAS,GAAG,EAAG,OAAOo4D,CAAO,CAAC,CAC3E,MAAY,CACV,QAAQ,KAAK,yBAAyB,OAAON,CAAQ,CAAC,KAAK93D,CAAO,EAAE,CACtE,CAMF,UAAWq4D,KAAQL,EAAK,MAAQ,CAAA,EAAI,CAClC,IAAI13D,EACAg4D,EAEA,OAAOD,GAAS,UAAYA,IAAS,MAAQ,SAAUA,GACzD/3D,EAAO+3D,EAAK,KACZC,EAAMD,EAAK,KAEX/3D,EAAO+3D,EAGT,MAAM/kD,EAAKxT,GAAUQ,CAAI,EACzB,GAAI,OAAOgT,GAAO,WAChB,GAAI,CACF1R,EAAS0R,EAAG1R,EAAQ02D,CAAG,CACzB,OAAS7qD,EAAG,CACV,QAAQ,KAAK,uBAAuBnN,CAAI,aAAaw3D,CAAQ,IAAKrqD,CAAC,CACrE,CAEJ,CAGA,OAAOsqD,EAAWt+C,GAAc7X,CAAM,EAAIA,CAC5C,CAKA,aAA4C5C,EAAQ+4D,EAAoB,GAAU,CAChF,MAAMQ,EAA8B,CAAE,GAAGv5D,CAAA,EAEzC,SAAW,CAAC+uB,EAAOnuB,CAAK,IAAK,OAAO,QAAQZ,CAAG,EAC7C,UAAWL,KAAS,KAAK,QAEvB,GADc,KAAK,iBAAiBA,EAAM,OAAO,EACvC,KAAKovB,CAAK,EAAG,CACrBwqC,EAAOxqC,CAAK,EAAI,KAAK,MAAMpvB,EAAM,IAAKiB,EAAOm4D,CAAQ,EACrD,KACF,CAIJ,OAAOQ,CACT,CAEA,YAAuC,CACrC,OAAO,OAAO,KAAK,KAAK,MAAM,EAAE,KAAA,EAAO,IAAKh5D,IAAS,CAAE,MAAO,KAAK,OAAOA,CAAG,EAAE,aAAeO,GAAU,QAAQP,CAAG,EAAG,MAAOA,CAAA,EAAM,CACrI,CAOA,QAAQuK,EAA6BkuD,EAA2B,CAC9D,KAAK,OAAOluD,CAAI,EAAIkuD,CACtB,CAEA,SAASh4D,EAAiBw4D,EAAkC,CAC1D,KAAK,QAAQ,KAAK,CAAE,QAAAx4D,EAAS,IAAAw4D,EAAK,CACpC,CAEQ,iBAAiBx4D,EAAyB,CAChD,MAAMiB,EAAUjB,EAAQ,QAAQ,oBAAqB,MAAM,EAC3D,OAAO,IAAI,OAAO,IAAIiB,EAAQ,QAAQ,MAAO,IAAI,CAAC,IAAK,GAAG,CAC5D,CACF,CClJA,SAASw3D,GAAa5hD,EAAa0G,EAAwB,CACvD,GAAI,CAACA,EAAQ,OAAO1G,EACpB,MAAM6hD,EAAO7hD,EAAI,QAAQ,GAAG,EACtBnI,EAAQgqD,IAAS,GAAK7hD,EAAI,MAAM,EAAG6hD,CAAI,EAAI7hD,EAC3C3U,EAAQw2D,IAAS,GAAK7hD,EAAI,MAAM6hD,CAAI,EAAO,GAC3CC,EAAQjqD,EAAK,YAAY,GAAG,EAClC,OAAOiqD,IAAQ,GACT,GAAGjqD,CAAI,GAAG6O,CAAM,GAAGrb,CAAK,GACxB,GAAGwM,EAAK,MAAM,EAAGiqD,CAAG,CAAC,GAAGp7C,CAAM,GAAG7O,EAAK,MAAMiqD,CAAG,CAAC,GAAGz2D,CAAK,EAClE,CAEA,SAAS02D,GAAkB/hD,EAAa81C,EAA2B,CAC/D,OAAIA,EAAI,OAAS,WACKA,EAAI,WAAa,CAAC,EAAG,CAAC,GAEnC,IAAIhvD,GAAK,CACN,MAAM4f,EAASovC,EAAI,OACbA,EAAI,OAAOhvD,CAAC,EACZA,IAAM,EAAI,GAAK,IAAIA,CAAC,IAC1B,MAAO,GAAG86D,GAAa5hD,EAAK0G,CAAM,CAAC,IAAI5f,CAAC,GAC5C,CAAC,EACA,KAAK,IAAI,EAGXgvD,EAAI,OACN,IAAImE,GAAK,CACN,MAAMvzC,EAASovC,EAAI,OAASA,EAAI,OAAOmE,CAAC,EAAI,IAAIA,CAAC,IACjD,MAAO,GAAG2H,GAAa5hD,EAAK0G,CAAM,CAAC,IAAIuzC,CAAC,GAC5C,CAAC,EACA,KAAK,IAAI,CAClB,CAIA,SAAS+H,GACLp1D,EACA8iB,EACW,CACX,MAAMygC,EAAUvjD,EAAO,SAAW,QAAWA,EAAO,SAAW,OAEzD1B,EAAsB,CACxB,IAAU0B,EAAO,IACjB,IAAUA,EAAO,IACjB,MAAUA,EAAO,MACjB,OAAUA,EAAO,OACjB,QAAAujD,EACA,SAAUvjD,EAAO,UAAY,QAC7B,GAAIA,EAAO,UAAmB,CAAE,cAAe,MAAA,EAC/C,GAAIA,EAAO,OAAmB,CAAE,MAAOA,EAAO,KAAA,EAC9C,GAAIA,EAAO,WAAmB,CAAE,MAAOA,EAAO,SAAA,EAC9C,GAAIA,EAAO,aAAmB,CAAE,YAAaA,EAAO,WAAA,EACpD,GAAIA,EAAO,gBAAmB,CAAE,eAAgBA,EAAO,cAAA,CAAe,EAGpEq1D,EAAuB,CAAA,EAC7B,OAAIr1D,EAAO,KAAUq1D,EAAW,KAAK,eAAer1D,EAAO,GAAG,EAAE,EAC5DA,EAAO,UAAUq1D,EAAW,KAAK,oBAAoBr1D,EAAO,QAAQ,EAAE,EACtEq1D,EAAW,SAAQ/2D,EAAO,MAAQ+2D,EAAW,KAAK,IAAI,GAEtDvyC,IACAxkB,EAAO,OAAS62D,GAAkBn1D,EAAO,IAAK8iB,CAAM,EAChDA,EAAO,OAAS,SAAWA,EAAO,QAClCxkB,EAAO,MAAQwkB,EAAO,QAKvB,OAAO,YACV,OAAO,QAAQxkB,CAAM,EAAE,OAAO,CAAC,EAAGlC,CAAC,IAAMA,IAAM,MAAS,CAAA,CAEhE,CAEA,SAASk5D,GAAiBh3D,EAA6B,CAQnD,MAAMgV,EAP+B,CACjC,MAAO,SAAU,QAAS,MAAO,QACjC,QAAS,SAAU,QAAS,QAC5B,UAAW,WAAY,gBACvB,cAAe,gBAAA,EAId,UAAYhV,EAAO4C,CAAC,IAAM,MAAS,EACnC,IAAIA,GAAK,GAAGA,CAAC,KAAK,OAAO5C,EAAO4C,CAAC,CAAC,CAAC,GAAG,EAE3C,GAAIoS,EAAM,SAAW,EAAG,MAAO,UAG/B,KAAM,CAAClV,EAAO,GAAGpC,CAAI,EAAIsX,EACzB,OAAOtX,EAAK,SAAW,EACjB,QAAQoC,CAAK,MACb,QAAQA,CAAK;AAAA,OAAUpC,EAAK,KAAK;AAAA,MAAS,CAAC,KACrD,CA6BO,SAASu5D,GAASv1D,EAA4C,CACjE,MAAO,CACH,OAAU8iB,GAAYwyC,GAAiBF,GAAiBp1D,EAAQ8iB,CAAM,CAAC,EACvE,OAAUA,GAAY,KAAK,UAAUsyC,GAAiBp1D,EAAQ8iB,CAAM,EAAG,KAAM,CAAC,EAC9E,OAAUA,GAAYsyC,GAAiBp1D,EAAQ8iB,CAAM,CAAA,CAE7D,CCtLA,SAAS0yC,IAAS,CAEhB,KAAM,CAACC,EAAWC,CAAY,EAAI5zD,EAAAA,SAAS,EAAK,EAC1C,CAAC6zD,EAAWC,CAAY,EAAI9zD,EAAAA,SAAS,EAAK,EAE1C+zD,EAAYzlD,EAAAA,OAAO,IAAI,EAE7BxN,EAAAA,UAAU,IAAM,CACV,OAAO,WAAaizD,EAAU,SAChC,OAAO,UAAU,UAAU,oBAAoBA,EAAU,QAAS,CAChE,OAAQ,qBACR,aAAc,EAAA,CACf,CAEL,EAAG,CAAA,CAAE,EAELjzD,EAAAA,UAAU,KACR,SAAS,KAAK,MAAM,SAAW,SACxB,IAAM,CACX,SAAS,KAAK,MAAM,SAAW,MACjC,GACC,CAAA,CAAE,EAEL,MAAMi7C,EAAY,CAAA,EAClB,QAAShiD,EAAI,EAAGA,GAAK,GAAIA,IACvBgiD,EAAU,KAAK,CACb,GAAIhiD,EACJ,KAAM,UAAYA,CAAA,CACnB,EAGH,uBACGwI,GAAA,CAAU,UAAU,MAAA,EACnBV,EAAA,cAACY,IAAI,UAAU,wBAAA,EACbZ,EAAA,cAACa,EAAA,CAAI,GAAI,EAAA,EACPb,EAAA,cAACY,QACCZ,EAAA,cAACa,EAAA,CAAI,GAAI,CAAA,EAEPb,EAAA,cAAC,MAAA,CACC,IAAKkyD,EACL,cAAY,SACZ,iBAAe,qBACf,wBAAsB,OACtB,UAAU,MACV,SAAU,EACV,MAAO,CAAE,OAAQ,OAAQ,UAAW,MAAA,CAAO,EAE3ClyD,EAAA,cAAC,UAAG,QAAM,EACVA,EAAA,cAAC,SAAE,wDAAsD,kBAGxDY,GAAA,CAAI,UAAU,QACbZ,EAAA,cAACa,EAAA,CAAI,GAAI,CAAA,EACPb,EAAA,cAAC,KAAA,CAAG,GAAG,SAAQ,OAAK,kBACnBghC,GAAA,CAAK,gBAAgB,GAAG,OAAO,OAAA,EAE9BhhC,EAAA,cAAC0qB,GAAA,CAAO,KAAK,OAAO,MAAM,SAAS,YAAY,cAAA,CAAe,EAE9D1qB,EAAA,cAAC2qB,GAAA,CAAO,KAAK,SAAS,MAAM,SAAS,MAAO,GAAI,EAEhD3qB,EAAA,cAAC4qB,IAAM,KAAK,QAAQ,MAAM,QAAQ,YAAY,kBAAA,CAAmB,kBAEhEC,GAAA,CAAS,KAAK,WAAW,MAAM,WAAW,YAAY,aAAA,CAAc,EAErE7qB,EAAA,cAACgrB,GAAA,CAAM,KAAK,QAAQ,MAAM,QAAQ,YAAY,cAAA,CAAe,EAE7DhrB,EAAA,cAAC8rB,IAAS,KAAK,WAAW,MAAM,YAAY,YAAY,eAAe,CACzE,CACF,EACA9rB,EAAA,cAACa,EAAA,CAAI,GAAI,CAAA,EACPb,EAAA,cAACiiB,IAAK,SAAS,MAAM,UAAU,8BAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAqBH,CACF,CACF,EACAjiB,EAAA,cAACY,GAAA,CAAI,UAAU,MAAA,kBACZC,EAAA,CAAI,GAAI,CAAA,EAEPb,EAAA,cAACghC,IAAK,gBAAgB,GAAG,OAAO,YAAA,kBAE7B/V,GAAA,CAAK,KAAK,OAAO,MAAM,MAAA,CAAO,EAE/BjrB,EAAA,cAACkrB,GAAA,CAAK,KAAK,OAAO,MAAM,OAAO,kBAE9B70B,GAAA,CAAS,KAAK,WAAW,MAAM,WAAW,EAE3C2J,EAAA,cAACmrB,GAAA,CAAK,KAAK,OAAO,MAAM,MAAA,CAAO,kBAE9BC,GAAA,CAAM,KAAK,QAAQ,MAAM,QAAQ,EAElCprB,EAAA,cAACqrB,GAAA,CAAM,KAAK,QAAQ,MAAM,QAAQ,IAAK,EAAG,IAAK,IAAK,KAAM,CAAA,CAAG,CAC/D,CACF,EACArrB,EAAA,cAACa,EAAA,CAAI,GAAI,GACPb,EAAA,cAACiiB,GAAA,CAAK,SAAS,MAAM,UAAU,8BAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAqBH,CACF,CACF,EAEAjiB,EAAA,cAACY,QACCZ,EAAA,cAACa,EAAA,CAAI,GAAI,CAAA,EAEPb,EAAA,cAACghC,IAAK,gBAAgB,GAAG,OAAO,eAAA,EAE9BhhC,EAAA,cAACmkB,IAAM,MAAM,YAAA,CAAa,EAC1BnkB,EAAA,cAACurB,GAAA,CAAS,KAAK,YAAY,MAAM,YAAY,EAC7CvrB,EAAA,cAACurB,IAAS,KAAK,YAAY,MAAM,YAAY,MAAO,GAAM,EAE1DvrB,EAAA,cAACmkB,IAAM,MAAM,UAAA,CAAW,EACxBnkB,EAAA,cAAC4rB,GAAA,CAAO,KAAK,UAAU,MAAM,eAAe,SAAU,IAAM,CAAE,EAAG,MAAO,EAAA,CAAO,kBAC9EA,GAAA,CAAO,KAAK,UAAU,SAAU,IAAM,CAAE,EAAG,MAAM,eAAe,MAAO,GAAM,CAChF,EAGA5rB,EAAA,cAACghC,GAAA,CAAK,gBAAgB,GAAG,OAAO,YAAA,EAC9BhhC,EAAA,cAACgsB,GAAA,CAAU,QAAS,CAAC,CAAC,EAAG,SAAU,CAAC,CAAC,EAAG,UAAU,KAAA,kBAC/C,OAAA,CAAK,UAAU,aAAA,EAAc,UAAQ,EACtChsB,EAAA,cAAC,QAAK,UAAU,cAAA,EAAe,UAAQ,EACvCA,EAAA,cAAC,OAAA,CAAK,UAAU,cAAA,EAAe,UAAQ,CACzC,EACAA,EAAA,cAACgsB,GAAA,CAAU,MAAM,0BAA0B,QAAS,CAAC3lB,EAAG9N,IAAU,CAAE,QAAQ,IAAI,mBAAoBA,EAAO8N,EAAE,cAAc,SAAS,CAAE,EAAG,QAAS,CAAC,CAAC,EAAG,SAAU,CAAC,CAAC,GACjKrG,EAAA,cAAC,OAAA,CAAK,UAAU,eAAc,UAAQ,EACtCA,EAAA,cAAC,OAAA,CAAK,UAAU,gBAAe,UAAQ,EACvCA,EAAA,cAAC,QAAK,UAAU,cAAA,EAAe,UAAQ,CACzC,CACF,CACF,EACAA,EAAA,cAACa,GAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAACiiB,IAAK,SAAS,MAAM,UAAU,8BAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBA+BH,CACF,EAGAjiB,EAAA,cAACa,EAAA,CAAI,GAAI,EAAG,UAAU,QACpBb,EAAA,cAAC,KAAA,CAAG,GAAG,WAAA,EAAY,WAAS,EAC5BA,EAAA,cAAC0c,IAAK,UAAU,MAAA,EACd1c,EAAA,cAACghC,GAAA,CAAK,gBAAgB,GAAG,OAAO,aAE9BhhC,EAAA,cAACouB,IAAO,KAAK,SAAS,MAAM,SAAS,MAAO,UAAW,QAAS,CAAC,UAAW,UAAW,SAAS,CAAA,CAAG,EAEnGpuB,EAAA,cAAC2uB,GAAA,CAAa,KAAK,eAAe,MAAM,eAAe,QAAS,CAAC,UAAW,UAAW,SAAS,CAAA,CAAG,EAEnG3uB,EAAA,cAAC2vB,GAAA,CAAU,KAAK,YAAY,MAAM,YAAY,QAAS,CAAC,UAAW,UAAW,SAAS,CAAA,CAAG,CAE5F,CACF,CACF,EACA3vB,EAAA,cAACa,EAAA,CAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAACiiB,IAAK,SAAS,MAAM,UAAU,8BAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAaH,CACF,EAGAjiB,EAAA,cAACa,GAAI,GAAI,EAAG,UAAU,QACpBb,EAAA,cAAC,MAAG,GAAG,QAAA,EAAS,QAAM,EAEtBA,EAAA,cAACghC,IAAK,gBAAgB,GAAG,OAAO,kBAAA,EAC9BhhC,EAAA,cAAC0/B,GAAA,CAAe,KAAK,iBAAiB,MAAM,4BAA4B,SAAQ,GAAC,SAAQ,GAAC,EAE1F1/B,EAAA,cAAC0/B,IAAe,KAAK,iBAAiB,MAAM,8BAAA,CAA+B,CAC7E,EAGA1/B,EAAA,cAACghC,GAAA,CAAK,gBAAgB,GAAG,OAAO,eAAA,EAC9BhhC,EAAA,cAACggC,IAAY,KAAK,cAAc,MAAM,yBAAyB,aAAc,IAAK,cAAe,IAAK,SAAQ,GAAC,SAAQ,GAAC,EAExHhgC,EAAA,cAACggC,IAAY,KAAK,cAAc,MAAM,sBAAsB,SAAQ,GAAC,EAErEhgC,EAAA,cAACggC,IAAY,KAAK,cAAc,MAAM,yCAAA,CAA0C,CAClF,CACF,EACAhgC,EAAA,cAACa,GAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAACiiB,IAAK,SAAS,MAAM,UAAU,8BAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAsBH,CACF,EAGAjiB,EAAA,cAACa,EAAA,CAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAAC,KAAA,CAAG,GAAG,OAAA,EAAQ,OAAK,EACpBA,EAAA,cAAC0c,GAAA,CAAK,UAAU,MAAA,EACd1c,EAAA,cAACkhB,IAAM,KAAK,OAAO,SAAS,OAAO,EACnClhB,EAAA,cAACkhB,IAAM,KAAK,UAAU,SAAS,SAAA,CAAU,EACzClhB,EAAA,cAACkhB,IAAM,KAAK,UAAU,SAAS,SAAA,CAAU,EACzClhB,EAAA,cAACkhB,IAAM,KAAK,SAAS,SAAS,QAAA,CAAS,EACvClhB,EAAA,cAACkhB,IAAM,KAAK,UAAU,SAAS,SAAA,CAAU,EACzClhB,EAAA,cAACkhB,IAAM,KAAK,YAAY,SAAS,WAAA,CAAY,EAC7ClhB,EAAA,cAACkhB,IAAM,KAAK,QAAQ,SAAS,OAAA,CAAQ,EACrClhB,EAAA,cAACkhB,IAAM,KAAK,OAAO,SAAS,MAAA,CAAO,EAEnClhB,EAAA,cAACoV,IAAa,QAAS,IAAM68C,EAAa,EAAI,EAAG,MAAM,oBAAoB,EAC1ED,GAAahyD,EAAA,cAACkhB,GAAA,CAAM,QAAQ,MAAM,QAAS,IAAM+wC,EAAa,EAAK,CAAA,EAAG,qCAAmC,CAC5G,CACF,EACAjyD,EAAA,cAACa,EAAA,CAAI,GAAI,EAAG,UAAU,QACpBb,EAAA,cAACiiB,GAAA,CAAK,SAAS,MAAM,UAAU,8BAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAeH,CACF,EAGAjiB,EAAA,cAACa,EAAA,CAAI,GAAI,EAAG,UAAU,QACpBb,EAAA,cAAC,MAAG,GAAG,OAAA,EAAQ,OAAK,kBACnB0c,GAAA,CAAK,UAAU,MAAA,EACd1c,EAAA,cAACY,GAAA,CAAI,UAAU,qCAAA,EACbZ,EAAA,cAACa,GAAI,GAAI,GACPb,EAAA,cAACqC,GAAA,CAAM,KAAK,OAAO,SAAS,OAAO,UAAU,aAAa,CAC5D,EACArC,EAAA,cAACa,EAAA,CAAI,GAAI,CAAA,EACPb,EAAA,cAACqC,GAAA,CAAM,KAAK,UAAU,SAAS,UAAU,UAAU,aAAa,CAClE,EACArC,EAAA,cAACa,EAAA,CAAI,GAAI,CAAA,EACPb,EAAA,cAACqC,GAAA,CAAM,KAAK,UAAU,SAAS,UAAU,UAAU,aAAa,CAClE,EACArC,EAAA,cAACa,EAAA,CAAI,GAAI,GACPb,EAAA,cAACqC,GAAA,CAAM,KAAK,SAAS,SAAS,SAAS,UAAU,aAAa,CAChE,EACArC,EAAA,cAACa,EAAA,CAAI,GAAI,CAAA,EACPb,EAAA,cAACqC,GAAA,CAAM,KAAK,UAAU,SAAS,UAAU,UAAU,YAAA,CAAa,CAClE,EACArC,EAAA,cAACa,EAAA,CAAI,GAAI,CAAA,EACPb,EAAA,cAACqC,GAAA,CAAM,KAAK,YAAY,SAAS,YAAY,UAAU,YAAA,CAAa,CACtE,EACArC,EAAA,cAACa,EAAA,CAAI,GAAI,GACPb,EAAA,cAACqC,GAAA,CAAM,KAAK,QAAQ,SAAS,QAAQ,UAAU,YAAA,CAAa,CAC9D,EACArC,EAAA,cAACa,EAAA,CAAI,GAAI,GACPb,EAAA,cAACqC,GAAA,CAAM,KAAK,OAAO,SAAS,OAAO,UAAU,YAAA,CAAa,CAC5D,CACF,CACF,CACF,kBACCxB,EAAA,CAAI,GAAI,EAAG,UAAU,QACpBb,EAAA,cAACiiB,GAAA,CAAK,SAAS,MAAM,UAAU,8BAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBA2BH,CACF,EAGAjiB,EAAA,cAACa,EAAA,CAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAAC,KAAA,CAAG,GAAG,SAAA,EAAU,SAAO,EACxBA,EAAA,cAAC0c,GAAA,CAAK,UAAU,QACd1c,EAAA,cAACY,GAAA,KACCZ,EAAA,cAACa,EAAA,CAAI,GAAI,GAAI,UAAU,mBAAA,EAErBb,EAAA,cAACmkB,GAAA,CAAM,MAAM,iBAAiB,EAC9BnkB,EAAA,cAACuU,GAAA,CACC,MAAM,iBACN,KAAK,OACL,WAAY,GACZ,QAAS,SAAY,CAEnB,MAAM,IAAI,QAASwD,GAAQ,WAAWA,EAAK,GAAI,CAAC,EAChD,MAAM,eAAe,CACvB,CAAA,CAAA,CAGJ,EACA/X,EAAA,cAACa,EAAA,CAAI,GAAI,GAAI,UAAU,mBAAA,EAErBb,EAAA,cAACmkB,GAAA,CAAM,MAAM,eAAA,CAAgB,EAC7BnkB,EAAA,cAACoV,GAAA,CACC,MAAM,gBACN,KAAK,qBACL,MAAM,gBACN,QAAS,IAAM,QAAQ,IAAI,kBAAkB,CAAA,CAAA,CAEjD,EACApV,EAAA,cAACa,EAAA,CAAI,GAAI,GAAI,UAAU,mBAAA,EAErBb,EAAA,cAACmkB,GAAA,CAAM,MAAM,SAAA,CAAU,EACvBnkB,EAAA,cAACwV,GAAA,CACC,MAAM,iBACN,IAAI,yBAAA,CAAA,CAER,EACAxV,EAAA,cAACa,EAAA,CAAI,GAAI,GAAI,UAAU,mBAAA,EAErBb,EAAA,cAACmkB,GAAA,CAAM,MAAM,YAAA,CAAa,EAC1BnkB,EAAA,cAACyV,GAAA,CACC,MAAM,SACN,IAAI,yBACJ,SAAU/X,GACV,MAAO,GAAA,CAAA,CAEX,CACF,CACF,CACF,kBACCmD,EAAA,CAAI,GAAI,EAAG,UAAU,QACpBb,EAAA,cAACiiB,GAAA,CAAK,SAAS,MAAM,UAAU,8BAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAgDH,CACF,EAGAjiB,EAAA,cAACa,EAAA,CAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAAC,KAAA,CAAG,GAAG,QAAO,MAAI,EAClBA,EAAA,cAAC0c,GAAA,CAAK,UAAU,MAAA,EACd1c,EAAA,cAAC0c,GAAA,CACC,UAAU,YACV,UAAU,OACV,MAAM,aACN,OAAQ1c,EAAA,cAAC,OAAA,CAAK,UAAU,cAAa,QAAM,EAC3C,OAAQA,EAAA,cAAC,MAAA,KAAI,sBAAoB,EACjC,WAAY,GACZ,UAAW,EAAA,EAGXA,EAAA,cAAC,SAAE,eAAa,CAAA,EAElBA,EAAA,cAAC0c,GAAA,CACC,MAAM,eACN,WAAY,EAAA,EAEZ1c,EAAA,cAAC,SAAE,gCAA8B,CAAA,CAErC,CACF,EACAA,EAAA,cAACa,GAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAACiiB,GAAA,CAAK,SAAS,MAAM,UAAU,8BAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAoBH,CACF,EAGAjiB,EAAA,cAACa,EAAA,CAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAAC,KAAA,CAAG,GAAG,WAAU,SAAO,EACxBA,EAAA,cAAC0c,GAAA,CAAK,UAAU,MAAA,EACd1c,EAAA,cAACs7C,GAAA,CACC,KACE,CACE,CACE,UAAW99C,GACX,KAAM,SACN,SAAU,GACV,MAAO,IACP,OAAQ,GAAA,EAEV,CACE,UAAWA,GACX,KAAM,SACN,SAAU,GACV,MAAO,IACP,OAAQ,GAAA,EAEV,CACE,UAAWA,GACX,KAAM,SACN,SAAU,GACV,MAAO,IACP,OAAQ,GAAA,EAEV,CACE,UAAWA,GACX,KAAM,SACN,SAAU,GACV,MAAO,IACP,OAAQ,GAAA,EAEV,CACE,UAAWA,GACX,KAAM,SACN,SAAU,GACV,MAAO,IACP,OAAQ,GAAA,EAEV,CACE,UAAWA,GACX,KAAM,SACN,SAAU,GACV,MAAO,IACP,OAAQ,GAAA,EAEV,CACE,UAAWA,GACX,KAAM,SACN,SAAU,GACV,MAAO,IACP,OAAQ,GAAA,EAEV,CACE,UAAWA,GACX,KAAM,SACN,SAAU,GACV,MAAO,IACP,OAAQ,GAAA,EAEV,CACE,UAAWA,GACX,KAAM,SACN,SAAU,GACV,MAAO,IACP,OAAQ,GAAA,EAEV,CACE,UAAWA,GACX,KAAM,UACN,SAAU,GACV,MAAO,IACP,OAAQ,GAAA,CACV,EAGJ,OAAQwC,EAAA,cAAC,KAAA,KAAG,mBAAiB,CAAA,CAAA,CAEjC,CACF,EACAA,EAAA,cAACa,GAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAACiiB,GAAA,CAAK,SAAS,MAAM,UAAU,8BAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBA8EH,CACF,EAGAjiB,EAAA,cAACa,EAAA,CAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAAC,KAAA,CAAG,GAAG,YAAA,EAAa,YAAU,EAC9BA,EAAA,cAAC0c,IAAK,UAAU,MAAA,EACd1c,EAAA,cAACM,EAAA,qBACEI,GAAA,KACCV,EAAA,cAACY,GAAA,KACCZ,EAAA,cAACa,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,UAAU,iBAAA,EAAkB,WAEvD,EACAb,EAAA,cAACa,EAAA,CAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,UAAU,qBAAoB,WAEzD,EACAb,EAAA,cAACa,EAAA,CAAI,GAAI,GAAI,GAAI,GAAI,GAAI,EAAG,UAAU,cAAA,EAAe,WAErD,CACF,CACF,CACF,CACF,CACF,kBACCA,EAAA,CAAI,GAAI,EAAG,UAAU,QACpBb,EAAA,cAACiiB,GAAA,CAAK,SAAS,MAAM,UAAU,8BAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAwBH,CACF,EAGAjiB,EAAA,cAACa,EAAA,CAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAAC,KAAA,CAAG,GAAG,UAAS,QAAM,EACtBA,EAAA,cAAC0c,GAAA,CAAK,UAAU,OAAO,MAAM,OAAA,EAC3B1c,EAAA,cAAC,IAAA,KAAE,qNAEH,EACAA,EAAA,cAACif,GAAA,CACC,IAAKzhB,GACL,UAAU,YACV,MAAO,IACP,OAAQ,GAAA,CAAA,CAEZ,EAEAwC,EAAA,cAAC0c,GAAA,CAAK,UAAU,OAAO,MAAM,gBAC3B1c,EAAA,cAAC,SAAE,yCACDA,EAAA,cAAC,KAAA,KACCA,EAAA,cAAC,UAAG,2DAAyD,EAC7DA,EAAA,cAAC,KAAA,KAAG,8EAA4E,EAChFA,EAAA,cAAC,KAAA,KAAG,6CAA2C,EAC/CA,EAAA,cAAC,KAAA,KAAG,kEAAgE,EACpEA,EAAA,cAAC,KAAA,KAAG,6DAA2D,CACjE,CACF,EACAA,EAAA,cAACif,GAAA,CACC,IAAKzhB,GACL,UAAU,YACV,MAAO,IACP,OAAQ,GAAA,CAAA,CAEZ,CACF,EACAwC,EAAA,cAACa,GAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAACiiB,GAAA,CAAK,SAAS,MAAM,UAAU,gCAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAQH,CACF,EAGAjiB,EAAA,cAACa,EAAA,CAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAAC,KAAA,CAAG,GAAG,UAAS,QAAM,EACtBA,EAAA,cAAC0c,GAAA,CAAK,UAAU,MAAA,EACd1c,EAAA,cAACuc,GAAA,CACC,SAAS,aACT,KAAM,EAAA,CAAA,CAEV,CACF,EACAvc,EAAA,cAACa,GAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAACiiB,GAAA,CAAK,SAAS,MAAM,UAAU,gCAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,uBAMH,CACF,EAGAjiB,EAAA,cAACa,EAAA,CAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAAC,KAAA,CAAG,GAAG,OAAA,EAAQ,OAAK,EACpBA,EAAA,cAAC0c,GAAA,CAAK,UAAU,OAAO,MAAM,EAAA,EAC3B1c,EAAA,cAACoV,GAAA,CAAa,MAAM,aAAa,QAAS,SAAY,CAAE28C,EAAa,EAAI,CAAE,EAAG,EAC7ED,GACC9xD,EAAA,cAAC6c,GAAA,CACC,MAAM,cACN,OAAQ,kBACR,OAAQ7c,EAAA,cAAC,MAAA,KAAI,sBAAoB,EACjC,KAAK,KACL,QAAS,IAAM,CAAE+xD,EAAa,EAAK,CAAE,CAAA,EAErC/xD,EAAA,cAAC,SAAE,eAAa,CAAA,CAGtB,CACF,EACAA,EAAA,cAACa,GAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAACiiB,GAAA,CAAK,SAAS,MAAM,UAAU,gCAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAcH,CACF,EAGAjiB,EAAA,cAACa,EAAA,CAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAAC,KAAA,CAAG,GAAG,YAAA,EAAa,YAAU,EAC9BA,EAAA,cAAC0c,GAAA,CAAK,UAAU,OAAO,OAAO,YAAA,EAC5B1c,EAAA,cAAC,MAAA,CAAI,UAAU,MAAA,EACbA,EAAA,cAAC6jB,GAAA,CAAW,UAAU,OAAO,IAAK,EAAG,IAAK,IAAK,IAAK,GAAI,MAAM,SAAS,MAAM,SAAS,SAAU,EAAA,CAAI,EACpG7jB,EAAA,cAAC6jB,IAAW,UAAU,OAAO,IAAK,EAAG,IAAK,IAAK,IAAK,GAAI,MAAM,SAAS,KAAM,IAAK,UAAW,GAAI,KAAK,SAAA,CAAU,EAChH7jB,EAAA,cAAC6jB,GAAA,CAAW,UAAU,OAAO,IAAK,EAAG,IAAK,IAAK,IAAK,GAAI,MAAM,SAAS,KAAM,GAAI,UAAW,GAAI,KAAK,QAAA,CAAS,EAC9G7jB,EAAA,cAAC6jB,GAAA,CAAW,UAAU,OAAO,IAAK,EAAG,IAAK,IAAK,IAAK,GAAI,MAAM,SAAS,KAAM,GAAI,UAAW,GAAI,KAAK,UAAU,SAAU,EAAA,CAAO,EAChI7jB,EAAA,cAAC6jB,IAAW,UAAU,OAAO,IAAK,EAAG,IAAK,IAAK,IAAK,GAAI,MAAM,SAAS,KAAM,GAAI,UAAW,GAAI,KAAK,OAAO,SAAU,EAAA,CAAO,CAC/H,EAEA7jB,EAAA,cAAC6jB,IAAW,MAAM,MAAM,UAAU,OAAO,IAAK,EAAG,IAAK,GAAI,IAAK,EAAG,MAAM,MAAM,KAAM,GAAI,UAAW,GAAI,KAAK,MAAA,CAAO,EACnH7jB,EAAA,cAAC6jB,GAAA,CAAW,UAAU,OAAO,IAAK,EAAG,IAAK,GAAI,IAAK,EAAG,MAAM,MAAM,KAAM,GAAI,UAAW,GAAI,KAAK,UAAU,EAC1G7jB,EAAA,cAAC6jB,GAAA,CAAW,UAAU,OAAO,IAAK,EAAG,IAAK,GAAI,IAAK,EAAG,MAAM,MAAM,KAAM,GAAI,UAAW,GAAI,KAAK,QAAA,CAAS,EACzG7jB,EAAA,cAAC6jB,IAAW,UAAU,OAAO,IAAK,EAAG,IAAK,GAAI,IAAK,EAAG,MAAM,MAAM,KAAM,IAAK,UAAW,GAAI,KAAK,UAAU,SAAU,EAAA,CAAO,EAC5H7jB,EAAA,cAAC6jB,GAAA,CAAW,UAAU,OAAO,IAAK,EAAG,IAAK,GAAI,IAAK,EAAG,MAAM,MAAM,UAAW,EAAG,SAAU,EAAA,CAAO,CACnG,CACF,EACA7jB,EAAA,cAACa,EAAA,CAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAACiiB,GAAA,CAAK,SAAS,MAAM,UAAU,gCAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAeH,CACF,EAGAjiB,EAAA,cAACa,EAAA,CAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAAC,KAAA,CAAG,GAAG,QAAA,EAAS,QAAM,EACtBA,EAAA,cAAC0c,IAAK,UAAU,OAAO,MAAM,oBAC1BskB,GAAA,CAAK,gBAAgB,GAAG,OAAO,eAC9BhhC,EAAA,cAAC4kC,GAAA,CAAO,KAAK,aAAA,kBACVla,GAAA,CAAO,KAAK,UAAU,MAAM,WAAW,UAAU,OAAO,YAAY,eAAe,kBACnFA,GAAA,CAAO,KAAK,UAAU,MAAM,WAAW,UAAU,OAAO,YAAY,cAAA,CAAe,EACpF1qB,EAAA,cAAC0qB,GAAA,CAAO,KAAK,UAAU,MAAM,WAAW,UAAU,OAAO,YAAY,eAAe,CACtF,CACF,CACF,CACF,EACA1qB,EAAA,cAACa,EAAA,CAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAACiiB,IAAK,SAAS,MAAM,UAAU,8BAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAUH,CACF,EAGAjiB,EAAA,cAACa,EAAA,CAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAAC,MAAG,GAAG,KAAA,EAAM,KAAG,kBACf0c,GAAA,CAAK,UAAU,OAAO,MAAM,MAAA,EAC3B1c,EAAA,cAAC,KAAA,KAAG,SAAO,EACXA,EAAA,cAAC0lC,GAAA,CAAI,YAAY,2BACdF,GAAA,CAAQ,MAAM,SACbxlC,EAAA,cAAC,SAAE,8CAA4C,EAC/CA,EAAA,cAAC,IAAA,KAAE,8CAA4C,EAC/CA,EAAA,cAAC,IAAA,KAAE,8CAA4C,CACjD,EACAA,EAAA,cAACwlC,GAAA,CAAQ,MAAM,SACbxlC,EAAA,cAACghC,GAAA,CAAK,gBAAgB,IACpBhhC,EAAA,cAAC0qB,GAAA,CAAO,KAAK,WAAW,MAAM,gBAAgB,EAC9C1qB,EAAA,cAAC8rB,IAAS,KAAK,WAAW,MAAM,eAAA,CAAgB,CAClD,CACF,EACA9rB,EAAA,cAACwlC,GAAA,CAAQ,MAAM,KAAA,EACbxlC,EAAA,cAAC0c,GAAA,CACC,MAAM,qBACN,OAAQ,+CACR,OAAQ,+CACR,WAAY,GACZ,UAAW,EAAA,EAEX1c,EAAA,cAAC,SAAE,eAAa,kBACf,KAAA,IAAG,EACJA,EAAA,cAACghC,GAAA,CAAK,gBAAgB,EAAA,EACpBhhC,EAAA,cAAC8rB,IAAS,KAAK,UAAU,MAAM,eAAA,CAAgB,CACjD,CAAA,CAEJ,CACF,kBACC,KAAA,IAAG,kBAAG,KAAA,IAAG,kBAAG,KAAA,IAAG,kBACf,KAAA,KAAG,KAAG,EACP9rB,EAAA,cAAC0lC,GAAA,CAAI,YAAY,KAAA,EACf1lC,EAAA,cAACwlC,IAAQ,MAAM,MAAA,kBACZ,IAAA,KAAE,8CAA4C,CACjD,EACAxlC,EAAA,cAACwlC,IAAQ,MAAM,MAAA,kBACZ,IAAA,KAAE,8CAA4C,CACjD,EACAxlC,EAAA,cAACwlC,IAAQ,MAAM,MAAA,kBACZ,IAAA,KAAE,8CAA4C,CACjD,CACF,EACAxlC,EAAA,cAAC,KAAA,IAAG,EAAEA,EAAA,cAAC,KAAA,IAAG,EAAEA,EAAA,cAAC,KAAA,IAAG,EAChBA,EAAA,cAAC,KAAA,KAAG,MAAI,EACRA,EAAA,cAAC0lC,IAAI,YAAY,MAAA,kBACdF,GAAA,CAAQ,MAAM,QACbxlC,EAAA,cAAC,IAAA,KAAE,8CAA4C,CACjD,kBACCwlC,GAAA,CAAQ,MAAM,QACbxlC,EAAA,cAAC,IAAA,KAAE,8CAA4C,CACjD,kBACCwlC,GAAA,CAAQ,MAAM,QACbxlC,EAAA,cAAC,IAAA,KAAE,8CAA4C,CACjD,CACF,EACAA,EAAA,cAAC,SAAG,EAAEA,EAAA,cAAC,SAAG,EAAEA,EAAA,cAAC,SAAG,EAChBA,EAAA,cAAC,UAAG,OAAK,kBACR0lC,GAAA,CAAI,YAAY,SACf1lC,EAAA,cAACwlC,GAAA,CAAQ,MAAM,MAAA,EACbxlC,EAAA,cAAC,SAAE,8CAA4C,CACjD,EACAA,EAAA,cAACwlC,GAAA,CAAQ,MAAM,MAAA,EACbxlC,EAAA,cAAC,SAAE,8CAA4C,CACjD,EACAA,EAAA,cAACwlC,GAAA,CAAQ,MAAM,MAAA,EACbxlC,EAAA,cAAC,SAAE,8CAA4C,CACjD,CACF,EACAA,EAAA,cAAC,KAAA,IAAG,kBAAG,KAAA,IAAG,kBAAG,KAAA,IAAG,kBACf,KAAA,KAAG,QAAM,EACVA,EAAA,cAAC0lC,GAAA,CAAI,YAAY,UACf1lC,EAAA,cAACwlC,IAAQ,MAAM,MAAA,kBACZ,IAAA,KAAE,8CAA4C,CACjD,EACAxlC,EAAA,cAACwlC,IAAQ,MAAM,MAAA,kBACZ,IAAA,KAAE,8CAA4C,CACjD,EACAxlC,EAAA,cAACwlC,IAAQ,MAAM,MAAA,kBACZ,IAAA,KAAE,8CAA4C,CACjD,CACF,CACF,EACAxlC,EAAA,cAAC0c,GAAA,CAAK,UAAU,OAAO,MAAM,2BAAA,EAC3B1c,EAAA,cAAC,UAAG,SAAO,kBACVghC,GAAA,CAAK,gBAAgB,GAAG,OAAO,iBAAA,kBAC7BqX,GAAA,CAAW,KAAK,aAAa,IAAK,EAAG,MAAM,KAAA,EAC1Cr4C,EAAA,cAAC0qB,IAAO,KAAK,UAAU,MAAM,eAAA,CAAgB,CAC/C,EACA1qB,EAAA,cAAC,KAAA,IAAG,EAAEA,EAAA,cAAC,KAAA,IAAG,EAAEA,EAAA,cAAC,KAAA,IAAG,EAChBA,EAAA,cAAC,KAAA,KAAG,KAAG,EACPA,EAAA,cAACq4C,IAAW,KAAK,cAAc,IAAK,EAAG,MAAM,MAAM,YAAY,OAC7Dr4C,EAAA,cAAC0qB,GAAA,CAAO,KAAK,UAAU,MAAM,gBAAgB,CAC/C,kBACC,KAAA,IAAG,kBAAG,KAAA,IAAG,kBAAG,KAAA,IAAG,kBACf,KAAA,KAAG,MAAI,EACR1qB,EAAA,cAACq4C,GAAA,CAAW,KAAK,cAAc,IAAK,EAAG,MAAM,MAAM,YAAY,MAAA,EAC7Dr4C,EAAA,cAAC0qB,IAAO,KAAK,UAAU,MAAM,eAAA,CAAgB,CAC/C,EACA1qB,EAAA,cAAC,KAAA,IAAG,EAAEA,EAAA,cAAC,SAAG,EAAEA,EAAA,cAAC,SAAG,EAChBA,EAAA,cAAC,UAAG,OAAK,kBACRq4C,GAAA,CAAW,KAAK,cAAc,IAAK,EAAG,IAAK,EAAG,MAAM,MAAM,YAAY,OAAA,kBACpE3tB,GAAA,CAAO,KAAK,UAAU,MAAM,eAAA,CAAgB,CAC/C,EACA1qB,EAAA,cAAC,SAAG,EAAEA,EAAA,cAAC,SAAG,EAAEA,EAAA,cAAC,SAAG,EAChBA,EAAA,cAAC,UAAG,QAAM,kBACTq4C,GAAA,CAAW,KAAK,cAAc,IAAK,EAAG,SAAU,GAAM,MAAO,CAAC,CAAE,QAAS,aAAe,CAAE,QAAS,YAAA,EAAgB,CAAE,QAAS,WAAA,CAAa,EAAG,MAAM,MAAM,YAAY,QAAA,kBACpK3tB,GAAA,CAAO,KAAK,UAAU,MAAM,eAAA,CAAgB,CAC/C,CACF,CACF,CACF,EACA1qB,EAAA,cAACa,GAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAACiiB,IAAK,SAAS,MAAM,UAAU,8BAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAwIH,CACF,EAGAjiB,EAAA,cAACa,GAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAAC,MAAG,GAAG,OAAA,EAAQ,OAAK,EACpBA,EAAA,cAAC0c,IAAK,UAAU,OAAO,MAAM,EAAA,EAC3B1c,EAAA,cAAC61B,GAAA,CACC,OAAQ,CACN,CAAE,MAAO,KAAM,IAAK,IAAA,EACpB,CAAE,MAAO,OAAQ,IAAK,MAAA,EACtB,CAAE,MAAO,QAAS,IAAK,OAAA,CAAQ,EAEjC,KAAM,CACJ,CAAE,GAAI,EAAG,KAAM,WAAY,MAAO,cAAA,EAClC,CAAE,GAAI,EAAG,KAAM,WAAY,MAAO,cAAA,EAClC,CAAE,GAAI,EAAG,KAAM,cAAe,MAAO,iBAAA,EACrC,CAAE,GAAI,EAAG,KAAM,cAAe,MAAO,iBAAA,EACrC,CAAE,GAAI,EAAG,KAAM,gBAAiB,MAAO,mBAAA,CAAoB,EAE7D,QAAUt9B,GAAU,CAClB,QAAQ,IAAIA,CAAK,CACnB,CAAA,CAAA,CAEJ,CACF,EACAyH,EAAA,cAACa,GAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAACiiB,GAAA,CAAK,SAAS,MAAM,UAAU,8BAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAkBH,CACF,EAGAjiB,EAAA,cAACa,GAAI,GAAI,EAAG,UAAU,QACpBb,EAAA,cAAC,MAAG,GAAG,OAAA,EAAQ,OAAK,EACpBA,EAAA,cAAC0c,IAAK,UAAU,OAAO,MAAM,EAAA,EAC3B1c,EAAA,cAACqf,GAAA,CAAM,IAAI,sDAAsD,KAAM3hB,GAAmB,MAAM,OAAA,CAAQ,CAC1G,CACF,EACAsC,EAAA,cAACa,GAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAACiiB,IAAK,SAAS,MAAM,UAAU,8BAAA,EAC5B;AAAA,uBAEH,CACF,EAIAjiB,EAAA,cAACa,EAAA,CAAI,GAAI,EAAG,UAAU,QACpBb,EAAA,cAAC,KAAA,CAAG,GAAG,YAAA,EAAa,aAAW,EAC/BA,EAAA,cAAC0c,GAAA,CAAK,UAAU,OAAO,MAAM,IAC3B1c,EAAA,cAAC0f,GAAA,CAAY,UAAU,OAAO,oBAAM,IAAA,CAAE,UAAU,wBAAwB,CAAA,CAAI,CAC9E,CACF,EACA1f,EAAA,cAACa,GAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAACiiB,IAAK,SAAS,MAAM,UAAU,8BAAA,EAC5B;AAAA,uBAEH,CACF,EAGAjiB,EAAA,cAACa,GAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAAC,MAAG,GAAG,UAAA,EAAW,UAAQ,EAC1BA,EAAA,cAAC0c,IAAK,UAAU,OAAO,MAAM,EAAA,EAC3B1c,EAAA,cAAC+f,GAAA,CACC,eAAgB,GAChB,aAAc,GACd,YAAa,GACb,WAAY,GACZ,SAAU,CAAE,SAAU,IAAM,MAAO,QAAS,KAAM,EAAA,EAClD,WAAY,CAAA,EAEX,CACC/f,EAAA,cAAC,OAAI,IAAI,IAAI,IAAKxC,GAAmB,IAAI,cAAc,UAAU,qBAAA,CAAsB,EACvFwC,EAAA,cAAC,OAAI,IAAI,IAAI,IAAKxC,GAAmB,IAAI,eAAe,UAAU,qBAAA,CAAsB,EACxFwC,EAAA,cAAC,OAAI,IAAI,IAAI,IAAKxC,GAAmB,IAAI,cAAc,UAAU,qBAAA,CAAsB,CAAA,CACzF,CAEJ,CACF,EACAwC,EAAA,cAACa,GAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAACiiB,GAAA,CAAK,SAAS,MAAM,UAAU,8BAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAeH,CACF,EAGAjiB,EAAA,cAACa,GAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAAC,MAAG,GAAG,UAAA,EAAW,UAAQ,EAC1BA,EAAA,cAAC0c,IAAK,UAAU,OAAO,MAAM,EAAA,EAE3B1c,EAAA,cAACuI,GAAA,CACC,aAAc,CACZ,KAAM,OACN,KAAM,qBAAA,EAER,OAAO,UACP,OAAQvI,EAAA,cAAC,IAAA,CAAE,KAAK,UAAU,UAAU,4FAA2F,QAAM,CAAA,EAErIA,EAAA,cAACwK,GAAA,CAAa,IAAI,UAAA,EAAW,YAAU,EACvCxK,EAAA,cAACwK,GAAA,CAAa,IAAI,WAAA,EAAY,UAAQ,kBACrCA,GAAA,CAAa,QAAS,IAAM,MAAM,cAAc,GAAG,MAAI,CAAA,CAE5D,CACF,EACAxK,EAAA,cAACa,GAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAACiiB,GAAA,CAAK,SAAS,MAAM,UAAU,8BAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAaH,CACF,EAGAjiB,EAAA,cAACa,EAAA,CAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAAC,KAAA,CAAG,GAAG,cAAA,EAAe,eAAa,EACnCA,EAAA,cAAC0c,GAAA,CAAK,UAAU,OAAO,MAAM,IAC3B1c,EAAA,cAAC6gB,GAAA,CAAc,MAAO7gB,EAAA,cAAC,OAAA,CAAK,UAAU,QAAA,EAAS,GAAC,GAC7C,CACC,CACE,MAAO,2BACP,IAAK,cACL,KAAM,SACN,KAAM,SAAA,EAER,CACE,MAAO,2BACP,IAAK,sBACL,KAAM,UACN,KAAM,MAAA,EAER,CACE,MAAO,wBACP,IAAK,UACL,KAAM,SACN,KAAM,gBAAA,CACR,CAEJ,CACF,CACF,kBACCa,EAAA,CAAI,GAAI,EAAG,UAAU,QACpBb,EAAA,cAACiiB,GAAA,CAAK,SAAS,MAAM,UAAU,8BAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAuBH,CACF,EAGAjiB,EAAA,cAACa,EAAA,CAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAAC,KAAA,CAAG,GAAG,QAAA,EAAS,QAAM,EACtBA,EAAA,cAAC0c,IAAK,UAAU,OAAO,MAAM,EAAA,kBAC1BsE,GAAA,IAAO,CACV,CACF,kBACCngB,EAAA,CAAI,GAAI,EAAG,UAAU,QACpBb,EAAA,cAACiiB,GAAA,CAAK,SAAS,MAAM,UAAU,8BAAA,EAC5B;AAAA,uBAEH,CACF,EAGAjiB,EAAA,cAACa,EAAA,CAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAAC,KAAA,CAAG,GAAG,MAAA,EAAO,MAAI,EAClBA,EAAA,cAAC0c,IAAK,UAAU,OAAO,MAAM,+BAAA,kBAC1B,IAAA,CAAE,UAAU,YAAA,EAAa,8HAE1B,EACA1c,EAAA,cAACghC,GAAA,CAAK,gBAAgB,qCACnBtW,GAAA,CAAO,KAAK,OAAO,MAAM,OAAO,EACjC1qB,EAAA,cAAC4qB,GAAA,CAAM,KAAK,QAAQ,MAAM,OAAA,CAAQ,EAClC5qB,EAAA,cAAC8rB,GAAA,CAAS,KAAK,QAAQ,MAAM,OAAA,CAAQ,CACvC,CACF,EAEA9rB,EAAA,cAAC0c,IAAK,UAAU,OAAO,MAAM,mCAAA,EAC3B1c,EAAA,cAAC,IAAA,CAAE,UAAU,cAAa,uHAE1B,EAAI,qBAEN,CACF,EACAA,EAAA,cAACa,EAAA,CAAI,GAAI,EAAG,UAAU,QACpBb,EAAA,cAACiiB,IAAK,SAAS,MAAM,UAAU,8BAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAUH,CACF,EAGAjiB,EAAA,cAACa,GAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAAC,MAAG,GAAG,MAAA,EAAO,MAAI,EAClBA,EAAA,cAAC0c,IAAK,UAAU,OAAO,MAAM,EAAA,EAC3B1c,EAAA,cAACqhD,GAAA,CACC,QAAS,CACP,CACE,GAAI,EACJ,KAAM,gBACN,MAAO,4BACP,KAAM,QACN,OAAQ,QAAA,EAEV,CACE,GAAI,EACJ,KAAM,eACN,MAAO,2BACP,KAAM,SACN,OAAQ,UAAA,EAEV,CACE,GAAI,EACJ,KAAM,cACN,MAAO,0BACP,KAAM,SACN,OAAQ,QAAA,EAEV,CACE,GAAI,EACJ,KAAM,eACN,MAAO,2BACP,KAAM,QACN,OAAQ,WAAA,CACV,EAEF,QAAS,CACP,CAAE,IAAK,KAAM,MAAO,IAAA,EACpB,CAAE,IAAK,OAAQ,MAAO,MAAA,EACtB,CAAE,IAAK,QAAS,MAAO,OAAA,EACvB,CAAE,IAAK,OAAQ,MAAO,MAAA,EACtB,CAAE,IAAK,SAAU,MAAO,QAAA,CAAS,EAEnC,SAAS,KACT,WAAY,IAAM,CAAE,CAAA,CAAA,CAExB,CACF,EACArhD,EAAA,cAACa,GAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAACiiB,GAAA,CAAK,SAAS,MAAM,UAAU,8BAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBA0CH,CACF,EAGAjiB,EAAA,cAACa,EAAA,CAAI,GAAI,EAAG,UAAU,MAAA,EACpBb,EAAA,cAAC,KAAA,CAAG,GAAG,YAAA,EAAa,YAAU,EAC9BA,EAAA,cAAC0c,GAAA,CAAK,UAAU,OAAO,MAAM,+BAAA,EAC3B1c,EAAA,cAAC25B,GAAA,CAAW,UAAAugB,EAAsB,MAAO,EAAA,EACrCtgB,GAAqBA,EAAY,IAAI,CAAC8e,EAAgBngD,IACtDyH,EAAA,cAAC,IAAA,CAAE,IAAKzH,CAAA,EAAQmgD,EAAU,IAAK,CAChC,CACH,CACF,CACF,EACA14C,EAAA,cAACa,EAAA,CAAI,GAAI,EAAG,UAAU,QACpBb,EAAA,cAACiiB,GAAA,CAAK,SAAS,MAAM,UAAU,8BAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,uBAMH,CACF,EAGAjiB,EAAA,cAACgF,GAAA,CAAK,QAAQ,SAAS,CAEzB,CAAA,CAGJ,EAEAhF,EAAA,cAACa,EAAA,CAAI,GAAI,CAAA,EAGPb,EAAA,cAAC,OAAI,GAAG,oBAAoB,UAAU,2BAA2B,MAAO,CAAE,OAAQ,OAAQ,UAAW,MAAA,CAAO,EAC1GA,EAAA,cAAC,KAAA,CAAG,UAAU,2BAAA,kBACX,KAAA,CAAG,UAAU,YACZA,EAAA,cAAC,IAAA,CAAE,KAAK,SAAS,UAAU,WAAW,cAAY,WAAA,EAAY,OAAK,CACrE,kBACC,KAAA,CAAG,UAAU,YACZA,EAAA,cAAC,IAAA,CAAE,KAAK,aAAa,UAAU,WAAW,cAAY,WAAA,EAAY,WAAS,CAC7E,EACAA,EAAA,cAAC,MAAG,UAAU,UAAA,kBACX,IAAA,CAAE,KAAK,UAAU,UAAU,WAAW,cAAY,WAAA,EAAY,QAAM,CACvE,EACAA,EAAA,cAAC,KAAA,CAAG,UAAU,UAAA,EACZA,EAAA,cAAC,KAAE,KAAK,SAAS,UAAU,WAAW,cAAY,aAAY,OAAK,CACrE,EACAA,EAAA,cAAC,KAAA,CAAG,UAAU,YACZA,EAAA,cAAC,IAAA,CAAE,KAAK,SAAS,UAAU,WAAW,cAAY,WAAA,EAAY,OAAK,CACrE,EACAA,EAAA,cAAC,MAAG,UAAU,UAAA,kBACX,IAAA,CAAE,KAAK,WAAW,UAAU,WAAW,cAAY,WAAA,EAAY,SAAO,CACzE,EACAA,EAAA,cAAC,MAAG,UAAU,UAAA,kBACX,IAAA,CAAE,KAAK,QAAQ,UAAU,WAAW,cAAY,aAAY,MAAI,CACnE,EACAA,EAAA,cAAC,KAAA,CAAG,UAAU,UAAA,EACZA,EAAA,cAAC,IAAA,CAAE,KAAK,WAAW,UAAU,WAAW,cAAY,WAAA,EAAY,SAAO,CACzE,kBACC,KAAA,CAAG,UAAU,UAAA,EACZA,EAAA,cAAC,IAAA,CAAE,KAAK,cAAc,UAAU,WAAW,cAAY,WAAA,EAAY,aAAW,CAChF,EACAA,EAAA,cAAC,MAAG,UAAU,4BACX,IAAA,CAAE,KAAK,UAAU,UAAU,WAAW,cAAY,WAAA,EAAY,QAAM,CACvE,EACAA,EAAA,cAAC,KAAA,CAAG,UAAU,UAAA,EACZA,EAAA,cAAC,KAAE,KAAK,UAAU,UAAU,WAAW,cAAY,WAAA,EAAY,QAAM,CACvE,kBACC,KAAA,CAAG,UAAU,YACZA,EAAA,cAAC,IAAA,CAAE,KAAK,SAAS,UAAU,WAAW,cAAY,WAAA,EAAY,OAAK,CACrE,EACAA,EAAA,cAAC,MAAG,UAAU,UAAA,kBACX,IAAA,CAAE,KAAK,cAAc,UAAU,WAAW,cAAY,WAAA,EAAY,YAAU,CAC/E,EACAA,EAAA,cAAC,MAAG,UAAU,UAAA,EACZA,EAAA,cAAC,IAAA,CAAE,KAAK,UAAU,UAAU,WAAW,cAAY,aAAY,QAAM,CACvE,EACAA,EAAA,cAAC,KAAA,CAAG,UAAU,UAAA,EACZA,EAAA,cAAC,IAAA,CAAE,KAAK,OAAO,UAAU,WAAW,cAAY,WAAA,EAAY,KAAG,CACjE,EACAA,EAAA,cAAC,KAAA,CAAG,UAAU,UAAA,kBACX,IAAA,CAAE,KAAK,SAAS,UAAU,WAAW,cAAY,WAAA,EAAY,OAAK,CACrE,EACAA,EAAA,cAAC,MAAG,UAAU,UAAA,kBACX,IAAA,CAAE,KAAK,SAAS,UAAU,WAAW,cAAY,WAAA,EAAY,OAAK,CACrE,EACAA,EAAA,cAAC,KAAA,CAAG,UAAU,UAAA,EACZA,EAAA,cAAC,KAAE,KAAK,cAAc,UAAU,WAAW,cAAY,WAAA,EAAY,YAAU,CAC/E,kBACC,KAAA,CAAG,UAAU,YACZA,EAAA,cAAC,IAAA,CAAE,KAAK,YAAY,UAAU,WAAW,cAAY,WAAA,EAAY,UAAQ,CAC3E,EACAA,EAAA,cAAC,MAAG,UAAU,UAAA,kBACX,IAAA,CAAE,KAAK,YAAY,UAAU,WAAW,cAAY,WAAA,EAAY,UAAQ,CAC3E,EACAA,EAAA,cAAC,KAAA,CAAG,UAAU,UAAA,EACZA,EAAA,cAAC,KAAE,KAAK,gBAAgB,UAAU,WAAW,cAAY,aAAY,eAAa,CACpF,EACAA,EAAA,cAAC,KAAA,CAAG,UAAU,YACZA,EAAA,cAAC,IAAA,CAAE,KAAK,UAAU,UAAU,WAAW,cAAY,aAAY,QAAM,CACvE,EACAA,EAAA,cAAC,MAAG,UAAU,UAAA,kBACX,IAAA,CAAE,KAAK,QAAQ,UAAU,WAAW,cAAY,WAAA,EAAY,MAAI,CACnE,EACAA,EAAA,cAAC,MAAG,UAAU,UAAA,kBACX,IAAA,CAAE,KAAK,QAAQ,UAAU,WAAW,cAAY,aAAY,MAAI,CACnE,EACAA,EAAA,cAAC,KAAA,CAAG,UAAU,UAAA,EACZA,EAAA,cAAC,IAAA,CAAE,KAAK,cAAc,UAAU,WAAW,cAAY,WAAA,EAAY,YAAU,CAC/E,CACF,CACF,CACF,CACF,CACF,CAEF,CAEF,CAEJ,CClnDA,MAAMmyD,GAAiC,CAAE,MAAO,GAAI,WAAY,CAAA,CAAC,EAC3DC,GAAoB,CACxB,MAAO,GACP,QAAS,CAAA,EACT,SAAU,CACR,MAAOD,GACP,SAAU,CAAA,EACV,WAAYA,EAAA,EAEd,YAAa,EACf,EAEA,SAAwBE,GAAS,CAC/B,KAAA/hD,EAAO,CACL,KAAM,WACN,MAAO,cACP,MAAO,cACP,MAAO,GAAA,EAET,YAAA07B,EAAc,4BACd,SAAAjiB,EAAW,IAAM,CAAE,EACnB,MAAAvxB,EAAQ,MACV,EAKG,CACD,MAAM85D,EAAe3hC,GAAA,EACf4hC,EAAgB3hC,GAAA,EAChB4hC,EAAgB1hC,GAAA,EAEhB,CAAC2hC,EAAYC,CAAa,EAAIv0D,EAAAA,SAAS,CAAC,EACxC,CAAChF,EAAMw5D,CAAO,EAAIx0D,EAAAA,SAAei0D,EAAW,EAC5C,CAAChhC,EAAiBwhC,CAAkB,EAAIz0D,WAA0B,CACtE,KAAMmS,EAAK,KACX,MAAOA,EAAK,MACZ,MAAOA,EAAK,MACZ,MAAOA,EAAK,KAAA,CACb,EACK,CAACuiD,EAAkBC,CAAoB,EAAI30D,EAAAA,SAAS,EAAK,EAE/Dc,EAAAA,UAAU,IAAM,CACd9F,EAAK,OAAS25D,EAAqB,EAAI,CACzC,EAAG,CAAC35D,EAAK,KAAK,CAAC,EAEf,MAAM45D,EAAoC,CAAC,CAAC,KAAArwD,EAAM,MAAAlK,KAAW,CAC3Do6D,EAAmBrsD,IAAS,CAAE,GAAGA,EAAM,CAAC7D,CAAI,EAAGlK,GAAQ,CACzD,EAEMw6D,EAAcrsC,GAAuBnuB,GAAe,CACxDm6D,EAAQpsD,IAAS,CAAE,GAAGA,EAAM,CAACogB,CAAK,EAAGnuB,GAAQ,EAC7CuxB,EAAS5wB,CAAI,CACf,EAEM85D,EAAuB,CAAC/wD,EAA8BykB,EAA6BnuB,IAAkB,CACzGm6D,EAAQpsD,IAAS,CACf,GAAGA,EACH,SAAU,CACR,GAAGA,EAAK,SACR,CAACrE,CAAI,EAAG,CACN,GAAGqE,EAAK,SAASrE,CAAI,EACrB,CAACykB,CAAK,EAAGA,IAAU,aAAenuB,EAAM,MAAM;AAAA,CAAI,EAAIA,CAAA,CACxD,CACF,EACA,CACJ,EAEM06D,EAAgB,CAAC36D,EAAeouB,EAA6BnuB,IAAkB,CACnFm6D,EAAQpsD,IAAS,CACf,GAAGA,EACH,SAAU,CACR,GAAGA,EAAK,SACR,SAAUA,EAAK,SAAS,SAAS,IAAI,CAAC5D,EAAGzK,IACvCA,IAAMK,EAAQ,CAAE,GAAGoK,EAAG,CAACgkB,CAAK,EAAGA,IAAU,aAAenuB,EAAM,MAAM;AAAA,CAAI,EAAIA,GAAUmK,CAAA,CACxF,CACF,EACA,CACJ,EAIMwwD,EAAY,CAACjxD,EAAkB,QAAU,CAC7C,GAAIA,IAAS,MAAO,CAClB4wD,EAAqB,EAAK,EAC1BJ,EAAcnsD,GAAQA,EAAO,CAAC,EAC9BosD,EAAQP,EAAW,EACnB,MACF,CAEAO,EAAQpsD,GAAQ,CACd,OAAQrE,EAAA,CACN,IAAK,YACH,MAAO,CACL,GAAGqE,EACH,MAAO,GACP,QAAS,CAAA,EACT,SAAU,CAAE,MAAO4rD,GAAgB,SAAU,CAAA,EAAI,WAAYA,EAAA,EAC7D,YAAa,EAAA,EAEjB,IAAK,cACH,MAAO,CACL,GAAG5rD,EACH,QAAS,CAAA,EACT,SAAU,CAAE,MAAO4rD,GAAgB,SAAU,CAAA,EAAI,WAAYA,EAAA,EAC7D,YAAa,EAAA,EAEjB,IAAK,eACH,MAAO,CACL,GAAG5rD,EACH,SAAU,CAAE,MAAO4rD,GAAgB,SAAU,CAAA,EAAI,WAAYA,EAAA,EAC7D,YAAa,EAAA,EAEjB,IAAK,kBACH,MAAO,CACL,GAAG5rD,EACH,YAAa,EAAA,EAEjB,QACE,OAAOA,CAAA,CAEb,CAAC,CACH,EAEM6sD,EAAsBC,GACnBA,EAAQ,IAAIvtD,GACjB,YAAYA,EAAK,QAAQ;AAAA;AAAA,EAAuBA,EAAK,YAAY,IAAI0I,GAAO,KAAKA,CAAG,EAAE,EAAE,KAAK;AAAA,CAAI,CAAC,EACnG,EAAE,KAAK;AAAA;AAAA,CAAM,EAOhB,OACExO,EAAA,cAAAA,EAAA,SAAA,KACEA,EAAA,cAAC,KAAA,KAAG,kBAAgB,kBACnBghC,GAAA,KACGhhC,EAAA,cAAC,MAAA,CAAI,UAAU,4BACbA,EAAA,cAACouB,GAAA,CACC,KAAK,OACL,IAAI,WACJ,MAAOgD,EAAgB,KACvB,QAASkhC,EACT,SAAUS,EACV,SAAUF,CAAA,CAAA,EAEZ7yD,EAAA,cAACouB,GAAA,CACC,KAAK,QACL,IAAI,QACJ,MAAOgD,EAAgB,MACvB,QAASmhC,EACT,SAAUQ,EACV,SAAUF,CAAA,CAAA,EAEZ7yD,EAAA,cAACouB,GAAA,CACC,KAAK,QACL,IAAI,QACJ,MAAOgD,EAAgB,MACvB,QAASohC,EACT,SAAUO,EACV,SAAUF,CAAA,CAAA,EAEZ7yD,EAAA,cAAC2qB,GAAA,CACC,KAAK,QACL,IAAI,QACJ,MAAOyG,EAAgB,MACvB,SAAU2hC,EACV,SAAUF,CAAA,CAAA,CAEd,EAEC15D,EAAK,OACJ6G,EAAA,cAAC,MAAA,CAAI,UAAU,uBAAA,EACbA,EAAA,cAACoV,GAAA,CAAa,MAAM,UAAU,QAAS,IAAM+9C,EAAU,KAAK,CAAA,CAAG,CACjE,EAIFnzD,EAAA,cAAC+rC,GAAA,CACC,KAAK,QACL,IAAK0mB,EAAa,SAClB,YAAazhC,GAAUgb,CAAW,EAClC,gBAAA5a,EACA,SAAU4hC,EAAW,OAAO,EAC5B,QAAS,IAAMG,EAAU,WAAW,CAAA,EAEpCnzD,EAAA,cAAC8rB,GAAA,CAAS,KAAK,QAAQ,MAAM,QAAQ,MAAO3yB,EAAK,MAAO,KAAM,CAAA,CAAG,CAAA,EAGlEA,EAAK,OACJ6G,EAAA,cAAC+rC,GAAA,CACC,IAAK0mB,EAAa,WAClB,KAAK,UACL,aAAct5D,EAAK,OAAS,GAC5B,YAAa63B,GAAU,4BAA4B,EACnD,gBAAAI,EACA,SAAU4hC,EAAW,SAAS,EAC9B,SAAS,WACT,QAAS,IAAMG,EAAU,aAAa,CAAA,EAEtCnzD,EAAA,cAAC8rB,GAAA,CACC,KAAK,cACL,MAAM,UACN,MAAO3yB,EAAK,QAAQ,OAClB2M,EAAK,SAAW;AAAA,EAAOA,EAAK,YAAY,KAAK;AAAA,CAAI,CAClD,EAAE,KAAK;AAAA,CAAI,EACZ,KAAM,EAAA,CAAA,CACR,EAIH3M,EAAK,QAAQ,OAAS,GACrB6G,EAAA,cAAC+rC,GAAA,CACC,IAAK0mB,EAAa,YAClB,KAAK,WACL,aAAct5D,EAAK,QAAQ,OAAS,EAAIi6D,EAAmBj6D,EAAK,OAAO,EAAI,GAC3E,YAAa63B,GAAU,0CAA0C,EACjE,gBAAAI,EACA,SAAU4hC,EAAW,UAAU,EAC/B,QAAS,IAAMG,EAAU,cAAc,EACvC,SAAS,UAAA,kBAERztB,GAAA,KACG,CACA,CAAE,KAAM,QAAS,MAAO,QAAS,QAASvsC,EAAK,SAAS,KAAA,EACxD,GAAGA,EAAK,SAAS,SAAS,IAAI,CAACyyC,EAASrzC,KAAW,CACjD,KAAM,UACN,MAAO,WAAWA,EAAQ,CAAC,GAC3B,QAAAqzC,EACA,MAAArzC,CAAA,EACA,EACF,CAAE,KAAM,aAAc,MAAO,aAAc,QAASY,EAAK,SAAS,UAAA,CAAW,EAC3D,IAAK2M,GACvB9F,EAAA,cAACwlC,GAAA,CAAQ,IAAK1/B,EAAK,MAAO,MAAOA,EAAK,KAAA,EACpC9F,EAAA,cAAC8rB,GAAA,CACC,KAAM,OAAOhmB,EAAK,KAAK,QACvB,MAAO,GAAGA,EAAK,KAAK,SACpB,MAAOA,EAAK,QAAQ,MACpB,SAAU,CAAC,CAAC,MAAAtN,CAAAA,IACVsN,EAAK,OAAS,UACVotD,EAAcptD,EAAK,MAAO,QAAStN,CAAK,EACxCy6D,EAAqBntD,EAAK,KAAM,QAAStN,CAAK,EAEpD,KAAM,CAAA,CAAA,EAERwH,EAAA,cAAC8rB,GAAA,CACC,KAAM,OAAOhmB,EAAK,KAAK,GACvB,MAAOA,EAAK,MACZ,MAAOA,EAAK,QAAQ,WAAW,KAAK;AAAA,CAAI,EACxC,SAAU,CAAC,CAAC,MAAAtN,CAAAA,IACVsN,EAAK,OAAS,UACVotD,EAAcptD,EAAK,MAAO,aAActN,CAAK,EAC7Cy6D,EAAqBntD,EAAK,KAAM,aAActN,CAAK,EAEzD,KAAM,CAAA,CAAA,CAEV,CACD,CACH,CAAA,EAIHW,EAAK,SAAS,MAAM,OACnB6G,EAAA,cAAC+rC,GAAA,CACC,IAAK0mB,EAAa,QAClB,KAAK,cACL,aAAct5D,EAAK,OAAS,GAC5B,YAAa63B,GAAU,iCAAiC,EACxD,gBAAAI,EACA,SAAU4hC,EAAW,aAAa,EAClC,QAAS,IAAMG,EAAU,iBAAiB,EAC1C,UAAW,EAAA,EAEXnzD,EAAA,cAAC8rB,GAAA,CAAS,KAAK,cAAc,MAAM,cAAc,MAAO3yB,EAAK,YAAa,KAAM,CAAA,CAAG,CAAA,CAI3F,CAEF,CAEJ,CCzTA,SAASm6D,IAAO,CAEZ,KAAM,CAACC,EAAOC,CAAQ,EAAIr1D,EAAAA,SAAiB,CAAA,CAAE,EAEvC8vC,EAAU,CACZ,CAAE,IAAK,QAAS,MAAO,OAAA,EACvB,CAAE,IAAK,QAAS,MAAO,QAAA,EACvB,CAAE,IAAK,cAAe,MAAO,aAAA,EAC7B,CAAE,IAAK,WAAY,MAAO,WAAA,CAAY,EAI1C,OACIjuC,EAAA,cAAAA,EAAA,SAAA,KACIA,EAAA,cAAC,KAAA,KAAG,MAAI,EACRA,EAAA,cAACqhD,GAAA,CACG,QAASkS,EACT,SAAS,QACT,QAAAtlB,EACA,KAAMjuC,EAAA,cAACqyD,GAAA,CAAS,KAAM,CAAE,KAAM,WAAY,MAAO,cAAe,MAAO,cAAe,MAAO,IAAI,CAAG,CAAA,CAAA,CAE5G,CAER"}