@ottocode/web-sdk 0.1.226 → 0.1.228

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 (406) hide show
  1. package/dist/components/chat/FileMentionPopup.d.ts.map +1 -1
  2. package/dist/components/index.js +25158 -80
  3. package/dist/components/index.js.map +180 -1
  4. package/dist/components/messages/AssistantMessageGroup.d.ts.map +1 -1
  5. package/dist/components/messages/CompactActivityGroup.d.ts +10 -0
  6. package/dist/components/messages/CompactActivityGroup.d.ts.map +1 -0
  7. package/dist/components/messages/MessagePartItem.d.ts.map +1 -1
  8. package/dist/components/messages/MessageThread.d.ts +1 -0
  9. package/dist/components/messages/MessageThread.d.ts.map +1 -1
  10. package/dist/components/messages/MessageThreadContainer.d.ts.map +1 -1
  11. package/dist/components/messages/compactActivity.d.ts +34 -0
  12. package/dist/components/messages/compactActivity.d.ts.map +1 -0
  13. package/dist/components/messages/renderers/EditRenderer.d.ts +1 -1
  14. package/dist/components/messages/renderers/EditRenderer.d.ts.map +1 -1
  15. package/dist/components/messages/renderers/index.d.ts.map +1 -1
  16. package/dist/components/messages/renderers/types.d.ts +3 -1
  17. package/dist/components/messages/renderers/types.d.ts.map +1 -1
  18. package/dist/components/settings/SettingsSidebar.d.ts.map +1 -1
  19. package/dist/components/settings/SetuTopupModal.d.ts.map +1 -1
  20. package/dist/hooks/index.js +4821 -29
  21. package/dist/hooks/index.js.map +67 -1
  22. package/dist/hooks/useAuthStatus.d.ts.map +1 -1
  23. package/dist/hooks/useMCP.d.ts +9 -0
  24. package/dist/hooks/useMCP.d.ts.map +1 -1
  25. package/dist/hooks/usePreferences.d.ts +1 -0
  26. package/dist/hooks/usePreferences.d.ts.map +1 -1
  27. package/dist/hooks/useSessionStream.d.ts.map +1 -1
  28. package/dist/index.js +25928 -7
  29. package/dist/index.js.map +185 -1
  30. package/dist/lib/api-client/approval.d.ts.map +1 -1
  31. package/dist/lib/api-client/utils.d.ts.map +1 -1
  32. package/dist/lib/index.js +1016 -5
  33. package/dist/lib/index.js.map +22 -1
  34. package/dist/stores/index.js +693 -22
  35. package/dist/stores/index.js.map +30 -1
  36. package/dist/stores/toastStore.d.ts +1 -0
  37. package/dist/stores/toastStore.d.ts.map +1 -1
  38. package/dist/types/api.js +2 -2
  39. package/dist/types/api.js.map +9 -1
  40. package/package.json +4 -4
  41. package/dist/assets/provider-logos.js +0 -43
  42. package/dist/assets/provider-logos.js.map +0 -1
  43. package/dist/components/branch/BranchModal.js +0 -45
  44. package/dist/components/branch/BranchModal.js.map +0 -1
  45. package/dist/components/chat/ChatInput.js +0 -267
  46. package/dist/components/chat/ChatInput.js.map +0 -1
  47. package/dist/components/chat/ChatInputContainer.js +0 -295
  48. package/dist/components/chat/ChatInputContainer.js.map +0 -1
  49. package/dist/components/chat/ChatInputKeyHandler.js +0 -75
  50. package/dist/components/chat/ChatInputKeyHandler.js.map +0 -1
  51. package/dist/components/chat/CommandSuggestionsPopup.js +0 -45
  52. package/dist/components/chat/CommandSuggestionsPopup.js.map +0 -1
  53. package/dist/components/chat/ConfigModal.js +0 -46
  54. package/dist/components/chat/ConfigModal.js.map +0 -1
  55. package/dist/components/chat/ConfigSelector.js +0 -47
  56. package/dist/components/chat/ConfigSelector.js.map +0 -1
  57. package/dist/components/chat/FileMentionPopup.js +0 -138
  58. package/dist/components/chat/FileMentionPopup.js.map +0 -1
  59. package/dist/components/chat/ShortcutsModal.js +0 -275
  60. package/dist/components/chat/ShortcutsModal.js.map +0 -1
  61. package/dist/components/chat/StopButton.js +0 -25
  62. package/dist/components/chat/StopButton.js.map +0 -1
  63. package/dist/components/chat/UnifiedAgentSelector.js +0 -107
  64. package/dist/components/chat/UnifiedAgentSelector.js.map +0 -1
  65. package/dist/components/chat/UnifiedModelSelector.js +0 -209
  66. package/dist/components/chat/UnifiedModelSelector.js.map +0 -1
  67. package/dist/components/common/ProviderLogo.js +0 -30
  68. package/dist/components/common/ProviderLogo.js.map +0 -1
  69. package/dist/components/common/StatusIndicator.js +0 -54
  70. package/dist/components/common/StatusIndicator.js.map +0 -1
  71. package/dist/components/common/UsageModal.js +0 -55
  72. package/dist/components/common/UsageModal.js.map +0 -1
  73. package/dist/components/common/UsageRing.js +0 -22
  74. package/dist/components/common/UsageRing.js.map +0 -1
  75. package/dist/components/file-browser/FileBrowserSidebar.js +0 -50
  76. package/dist/components/file-browser/FileBrowserSidebar.js.map +0 -1
  77. package/dist/components/file-browser/FileBrowserSidebarToggle.js +0 -12
  78. package/dist/components/file-browser/FileBrowserSidebarToggle.js.map +0 -1
  79. package/dist/components/file-browser/FileViewerPanel.js +0 -85
  80. package/dist/components/file-browser/FileViewerPanel.js.map +0 -1
  81. package/dist/components/file-browser/QuickFilePicker.js +0 -118
  82. package/dist/components/file-browser/QuickFilePicker.js.map +0 -1
  83. package/dist/components/git/GitCommitModal.js +0 -70
  84. package/dist/components/git/GitCommitModal.js.map +0 -1
  85. package/dist/components/git/GitDiffPanel.js +0 -60
  86. package/dist/components/git/GitDiffPanel.js.map +0 -1
  87. package/dist/components/git/GitDiffViewer.js +0 -224
  88. package/dist/components/git/GitDiffViewer.js.map +0 -1
  89. package/dist/components/git/GitFileItem.js +0 -145
  90. package/dist/components/git/GitFileItem.js.map +0 -1
  91. package/dist/components/git/GitFileList.js +0 -108
  92. package/dist/components/git/GitFileList.js.map +0 -1
  93. package/dist/components/git/GitSidebar.js +0 -156
  94. package/dist/components/git/GitSidebar.js.map +0 -1
  95. package/dist/components/git/GitSidebarToggle.js +0 -18
  96. package/dist/components/git/GitSidebarToggle.js.map +0 -1
  97. package/dist/components/mcp/AddMCPServerModal.js +0 -166
  98. package/dist/components/mcp/AddMCPServerModal.js.map +0 -1
  99. package/dist/components/mcp/MCPSidebar.js +0 -192
  100. package/dist/components/mcp/MCPSidebar.js.map +0 -1
  101. package/dist/components/mcp/MCPSidebarToggle.js +0 -14
  102. package/dist/components/mcp/MCPSidebarToggle.js.map +0 -1
  103. package/dist/components/mcp/index.js +0 -4
  104. package/dist/components/mcp/index.js.map +0 -1
  105. package/dist/components/messages/AssistantMessageGroup.js +0 -176
  106. package/dist/components/messages/AssistantMessageGroup.js.map +0 -1
  107. package/dist/components/messages/MessagePartItem.js +0 -362
  108. package/dist/components/messages/MessagePartItem.js.map +0 -1
  109. package/dist/components/messages/MessageThread.js +0 -239
  110. package/dist/components/messages/MessageThread.js.map +0 -1
  111. package/dist/components/messages/MessageThreadContainer.js +0 -22
  112. package/dist/components/messages/MessageThreadContainer.js.map +0 -1
  113. package/dist/components/messages/ToolApprovalCard.js +0 -143
  114. package/dist/components/messages/ToolApprovalCard.js.map +0 -1
  115. package/dist/components/messages/TopupApprovalCard.js +0 -52
  116. package/dist/components/messages/TopupApprovalCard.js.map +0 -1
  117. package/dist/components/messages/UserMessageGroup.js +0 -132
  118. package/dist/components/messages/UserMessageGroup.js.map +0 -1
  119. package/dist/components/messages/renderers/ApplyPatchRenderer.js +0 -55
  120. package/dist/components/messages/renderers/ApplyPatchRenderer.js.map +0 -1
  121. package/dist/components/messages/renderers/BashRenderer.js +0 -55
  122. package/dist/components/messages/renderers/BashRenderer.js.map +0 -1
  123. package/dist/components/messages/renderers/DatabaseToolRenderer.js +0 -151
  124. package/dist/components/messages/renderers/DatabaseToolRenderer.js.map +0 -1
  125. package/dist/components/messages/renderers/DebugRenderer.js +0 -5
  126. package/dist/components/messages/renderers/DebugRenderer.js.map +0 -1
  127. package/dist/components/messages/renderers/DiffView.js +0 -206
  128. package/dist/components/messages/renderers/DiffView.js.map +0 -1
  129. package/dist/components/messages/renderers/EditRenderer.js +0 -25
  130. package/dist/components/messages/renderers/EditRenderer.js.map +0 -1
  131. package/dist/components/messages/renderers/ErrorRenderer.js +0 -162
  132. package/dist/components/messages/renderers/ErrorRenderer.js.map +0 -1
  133. package/dist/components/messages/renderers/FinishRenderer.js +0 -7
  134. package/dist/components/messages/renderers/FinishRenderer.js.map +0 -1
  135. package/dist/components/messages/renderers/GenericRenderer.js +0 -50
  136. package/dist/components/messages/renderers/GenericRenderer.js.map +0 -1
  137. package/dist/components/messages/renderers/GitCommitRenderer.js +0 -21
  138. package/dist/components/messages/renderers/GitCommitRenderer.js.map +0 -1
  139. package/dist/components/messages/renderers/GitDiffRenderer.js +0 -34
  140. package/dist/components/messages/renderers/GitDiffRenderer.js.map +0 -1
  141. package/dist/components/messages/renderers/GitStatusRenderer.js +0 -60
  142. package/dist/components/messages/renderers/GitStatusRenderer.js.map +0 -1
  143. package/dist/components/messages/renderers/ListRenderer.js +0 -28
  144. package/dist/components/messages/renderers/ListRenderer.js.map +0 -1
  145. package/dist/components/messages/renderers/LoadMcpToolsRenderer.js +0 -20
  146. package/dist/components/messages/renderers/LoadMcpToolsRenderer.js.map +0 -1
  147. package/dist/components/messages/renderers/McpToolRenderer.js +0 -68
  148. package/dist/components/messages/renderers/McpToolRenderer.js.map +0 -1
  149. package/dist/components/messages/renderers/ProgressUpdateRenderer.js +0 -9
  150. package/dist/components/messages/renderers/ProgressUpdateRenderer.js.map +0 -1
  151. package/dist/components/messages/renderers/ReadRenderer.js +0 -87
  152. package/dist/components/messages/renderers/ReadRenderer.js.map +0 -1
  153. package/dist/components/messages/renderers/ReasoningRenderer.js +0 -34
  154. package/dist/components/messages/renderers/ReasoningRenderer.js.map +0 -1
  155. package/dist/components/messages/renderers/SearchRenderer.js +0 -52
  156. package/dist/components/messages/renderers/SearchRenderer.js.map +0 -1
  157. package/dist/components/messages/renderers/SkillRenderer.js +0 -36
  158. package/dist/components/messages/renderers/SkillRenderer.js.map +0 -1
  159. package/dist/components/messages/renderers/TerminalRenderer.js +0 -84
  160. package/dist/components/messages/renderers/TerminalRenderer.js.map +0 -1
  161. package/dist/components/messages/renderers/TodosRenderer.js +0 -15
  162. package/dist/components/messages/renderers/TodosRenderer.js.map +0 -1
  163. package/dist/components/messages/renderers/ToolErrorDisplay.js +0 -10
  164. package/dist/components/messages/renderers/ToolErrorDisplay.js.map +0 -1
  165. package/dist/components/messages/renderers/TreeRenderer.js +0 -33
  166. package/dist/components/messages/renderers/TreeRenderer.js.map +0 -1
  167. package/dist/components/messages/renderers/WebSearchRenderer.js +0 -29
  168. package/dist/components/messages/renderers/WebSearchRenderer.js.map +0 -1
  169. package/dist/components/messages/renderers/WriteRenderer.js +0 -28
  170. package/dist/components/messages/renderers/WriteRenderer.js.map +0 -1
  171. package/dist/components/messages/renderers/index.js +0 -129
  172. package/dist/components/messages/renderers/index.js.map +0 -1
  173. package/dist/components/messages/renderers/shared/CopyButton.js +0 -27
  174. package/dist/components/messages/renderers/shared/CopyButton.js.map +0 -1
  175. package/dist/components/messages/renderers/shared/ImagePreview.js +0 -14
  176. package/dist/components/messages/renderers/shared/ImagePreview.js.map +0 -1
  177. package/dist/components/messages/renderers/shared/ToolContentBox.js +0 -9
  178. package/dist/components/messages/renderers/shared/ToolContentBox.js.map +0 -1
  179. package/dist/components/messages/renderers/shared/ToolHeader.js +0 -69
  180. package/dist/components/messages/renderers/shared/ToolHeader.js.map +0 -1
  181. package/dist/components/messages/renderers/shared/index.js +0 -5
  182. package/dist/components/messages/renderers/shared/index.js.map +0 -1
  183. package/dist/components/messages/renderers/types.js +0 -2
  184. package/dist/components/messages/renderers/types.js.map +0 -1
  185. package/dist/components/messages/renderers/utils.js +0 -60
  186. package/dist/components/messages/renderers/utils.js.map +0 -1
  187. package/dist/components/onboarding/OnboardingModal.js +0 -22
  188. package/dist/components/onboarding/OnboardingModal.js.map +0 -1
  189. package/dist/components/onboarding/index.js +0 -4
  190. package/dist/components/onboarding/index.js.map +0 -1
  191. package/dist/components/onboarding/steps/DefaultsStep.js +0 -104
  192. package/dist/components/onboarding/steps/DefaultsStep.js.map +0 -1
  193. package/dist/components/onboarding/steps/ProviderSetupStep.js +0 -398
  194. package/dist/components/onboarding/steps/ProviderSetupStep.js.map +0 -1
  195. package/dist/components/research/ResearchSidebar.js +0 -288
  196. package/dist/components/research/ResearchSidebar.js.map +0 -1
  197. package/dist/components/research/ResearchSidebarToggle.js +0 -15
  198. package/dist/components/research/ResearchSidebarToggle.js.map +0 -1
  199. package/dist/components/research/index.js +0 -3
  200. package/dist/components/research/index.js.map +0 -1
  201. package/dist/components/session-files/SessionFilesDiffPanel.js +0 -345
  202. package/dist/components/session-files/SessionFilesDiffPanel.js.map +0 -1
  203. package/dist/components/session-files/SessionFilesSidebar.js +0 -87
  204. package/dist/components/session-files/SessionFilesSidebar.js.map +0 -1
  205. package/dist/components/session-files/SessionFilesSidebarToggle.js +0 -15
  206. package/dist/components/session-files/SessionFilesSidebarToggle.js.map +0 -1
  207. package/dist/components/session-files/index.js +0 -4
  208. package/dist/components/session-files/index.js.map +0 -1
  209. package/dist/components/sessions/EditableTitle.js +0 -40
  210. package/dist/components/sessions/EditableTitle.js.map +0 -1
  211. package/dist/components/sessions/LeanHeader.js +0 -70
  212. package/dist/components/sessions/LeanHeader.js.map +0 -1
  213. package/dist/components/sessions/SessionHeader.js +0 -75
  214. package/dist/components/sessions/SessionHeader.js.map +0 -1
  215. package/dist/components/sessions/SessionItem.js +0 -28
  216. package/dist/components/sessions/SessionItem.js.map +0 -1
  217. package/dist/components/sessions/SessionListContainer.js +0 -86
  218. package/dist/components/sessions/SessionListContainer.js.map +0 -1
  219. package/dist/components/settings/SettingsSidebar.js +0 -212
  220. package/dist/components/settings/SettingsSidebar.js.map +0 -1
  221. package/dist/components/settings/SettingsSidebarToggle.js +0 -12
  222. package/dist/components/settings/SettingsSidebarToggle.js.map +0 -1
  223. package/dist/components/settings/SetuTopupModal.js +0 -306
  224. package/dist/components/settings/SetuTopupModal.js.map +0 -1
  225. package/dist/components/skills/SkillViewerPanel.js +0 -89
  226. package/dist/components/skills/SkillViewerPanel.js.map +0 -1
  227. package/dist/components/skills/SkillsSidebar.js +0 -59
  228. package/dist/components/skills/SkillsSidebar.js.map +0 -1
  229. package/dist/components/skills/SkillsSidebarToggle.js +0 -12
  230. package/dist/components/skills/SkillsSidebarToggle.js.map +0 -1
  231. package/dist/components/skills/index.js +0 -4
  232. package/dist/components/skills/index.js.map +0 -1
  233. package/dist/components/terminals/TerminalPanelToggle.js +0 -13
  234. package/dist/components/terminals/TerminalPanelToggle.js.map +0 -1
  235. package/dist/components/terminals/TerminalTabBar.js +0 -22
  236. package/dist/components/terminals/TerminalTabBar.js.map +0 -1
  237. package/dist/components/terminals/TerminalViewer.js +0 -371
  238. package/dist/components/terminals/TerminalViewer.js.map +0 -1
  239. package/dist/components/terminals/TerminalsPanel.js +0 -134
  240. package/dist/components/terminals/TerminalsPanel.js.map +0 -1
  241. package/dist/components/terminals/index.js +0 -11
  242. package/dist/components/terminals/index.js.map +0 -1
  243. package/dist/components/tunnel/TunnelSidebar.js +0 -55
  244. package/dist/components/tunnel/TunnelSidebar.js.map +0 -1
  245. package/dist/components/tunnel/TunnelSidebarToggle.js +0 -14
  246. package/dist/components/tunnel/TunnelSidebarToggle.js.map +0 -1
  247. package/dist/components/tunnel/index.js +0 -3
  248. package/dist/components/tunnel/index.js.map +0 -1
  249. package/dist/components/ui/Button.js +0 -19
  250. package/dist/components/ui/Button.js.map +0 -1
  251. package/dist/components/ui/Card.js +0 -7
  252. package/dist/components/ui/Card.js.map +0 -1
  253. package/dist/components/ui/ConfirmationDialog.js +0 -72
  254. package/dist/components/ui/ConfirmationDialog.js.map +0 -1
  255. package/dist/components/ui/Input.js +0 -7
  256. package/dist/components/ui/Input.js.map +0 -1
  257. package/dist/components/ui/Modal.js +0 -51
  258. package/dist/components/ui/Modal.js.map +0 -1
  259. package/dist/components/ui/ResizeHandle.js +0 -39
  260. package/dist/components/ui/ResizeHandle.js.map +0 -1
  261. package/dist/components/ui/Textarea.js +0 -7
  262. package/dist/components/ui/Textarea.js.map +0 -1
  263. package/dist/components/ui/Toaster.js +0 -41
  264. package/dist/components/ui/Toaster.js.map +0 -1
  265. package/dist/components/ui/ToolApprovalDialog.js +0 -57
  266. package/dist/components/ui/ToolApprovalDialog.js.map +0 -1
  267. package/dist/hooks/useAuthStatus.js +0 -287
  268. package/dist/hooks/useAuthStatus.js.map +0 -1
  269. package/dist/hooks/useBranch.js +0 -44
  270. package/dist/hooks/useBranch.js.map +0 -1
  271. package/dist/hooks/useCommandSuggestions.js +0 -86
  272. package/dist/hooks/useCommandSuggestions.js.map +0 -1
  273. package/dist/hooks/useConfig.js +0 -32
  274. package/dist/hooks/useConfig.js.map +0 -1
  275. package/dist/hooks/useFileBrowser.js +0 -30
  276. package/dist/hooks/useFileBrowser.js.map +0 -1
  277. package/dist/hooks/useFileMention.js +0 -56
  278. package/dist/hooks/useFileMention.js.map +0 -1
  279. package/dist/hooks/useFileUpload.js +0 -317
  280. package/dist/hooks/useFileUpload.js.map +0 -1
  281. package/dist/hooks/useFiles.js +0 -15
  282. package/dist/hooks/useFiles.js.map +0 -1
  283. package/dist/hooks/useGit.js +0 -149
  284. package/dist/hooks/useGit.js.map +0 -1
  285. package/dist/hooks/useImageUpload.js +0 -197
  286. package/dist/hooks/useImageUpload.js.map +0 -1
  287. package/dist/hooks/useKeyboardShortcuts.js +0 -249
  288. package/dist/hooks/useKeyboardShortcuts.js.map +0 -1
  289. package/dist/hooks/useMCP.js +0 -202
  290. package/dist/hooks/useMCP.js.map +0 -1
  291. package/dist/hooks/useMessages.js +0 -26
  292. package/dist/hooks/useMessages.js.map +0 -1
  293. package/dist/hooks/usePreferences.js +0 -61
  294. package/dist/hooks/usePreferences.js.map +0 -1
  295. package/dist/hooks/useProviderUsage.js +0 -44
  296. package/dist/hooks/useProviderUsage.js.map +0 -1
  297. package/dist/hooks/useQueueState.js +0 -31
  298. package/dist/hooks/useQueueState.js.map +0 -1
  299. package/dist/hooks/useResearch.js +0 -139
  300. package/dist/hooks/useResearch.js.map +0 -1
  301. package/dist/hooks/useSessionFiles.js +0 -15
  302. package/dist/hooks/useSessionFiles.js.map +0 -1
  303. package/dist/hooks/useSessionStream.js +0 -572
  304. package/dist/hooks/useSessionStream.js.map +0 -1
  305. package/dist/hooks/useSessions.js +0 -83
  306. package/dist/hooks/useSessions.js.map +0 -1
  307. package/dist/hooks/useSetuBalance.js +0 -71
  308. package/dist/hooks/useSetuBalance.js.map +0 -1
  309. package/dist/hooks/useSetuPayments.js +0 -171
  310. package/dist/hooks/useSetuPayments.js.map +0 -1
  311. package/dist/hooks/useShareStatus.js +0 -12
  312. package/dist/hooks/useShareStatus.js.map +0 -1
  313. package/dist/hooks/useSkills.js +0 -54
  314. package/dist/hooks/useSkills.js.map +0 -1
  315. package/dist/hooks/useTerminals.js +0 -67
  316. package/dist/hooks/useTerminals.js.map +0 -1
  317. package/dist/hooks/useTheme.js +0 -57
  318. package/dist/hooks/useTheme.js.map +0 -1
  319. package/dist/hooks/useToolApprovalShortcuts.js +0 -88
  320. package/dist/hooks/useToolApprovalShortcuts.js.map +0 -1
  321. package/dist/hooks/useTopupCallback.js +0 -74
  322. package/dist/hooks/useTopupCallback.js.map +0 -1
  323. package/dist/hooks/useTunnel.js +0 -158
  324. package/dist/hooks/useTunnel.js.map +0 -1
  325. package/dist/hooks/useVimMode.js +0 -298
  326. package/dist/hooks/useVimMode.js.map +0 -1
  327. package/dist/hooks/useWorkingDirectory.js +0 -34
  328. package/dist/hooks/useWorkingDirectory.js.map +0 -1
  329. package/dist/lib/api-client/approval.js +0 -25
  330. package/dist/lib/api-client/approval.js.map +0 -1
  331. package/dist/lib/api-client/auth.js +0 -139
  332. package/dist/lib/api-client/auth.js.map +0 -1
  333. package/dist/lib/api-client/branches.js +0 -45
  334. package/dist/lib/api-client/branches.js.map +0 -1
  335. package/dist/lib/api-client/config.js +0 -38
  336. package/dist/lib/api-client/config.js.map +0 -1
  337. package/dist/lib/api-client/files.js +0 -35
  338. package/dist/lib/api-client/files.js.map +0 -1
  339. package/dist/lib/api-client/git.js +0 -154
  340. package/dist/lib/api-client/git.js.map +0 -1
  341. package/dist/lib/api-client/index.js +0 -92
  342. package/dist/lib/api-client/index.js.map +0 -1
  343. package/dist/lib/api-client/sessions.js +0 -106
  344. package/dist/lib/api-client/sessions.js.map +0 -1
  345. package/dist/lib/api-client/setu.js +0 -144
  346. package/dist/lib/api-client/setu.js.map +0 -1
  347. package/dist/lib/api-client/skills.js +0 -31
  348. package/dist/lib/api-client/skills.js.map +0 -1
  349. package/dist/lib/api-client/utils.js +0 -65
  350. package/dist/lib/api-client/utils.js.map +0 -1
  351. package/dist/lib/commands.js +0 -124
  352. package/dist/lib/commands.js.map +0 -1
  353. package/dist/lib/config.js +0 -28
  354. package/dist/lib/config.js.map +0 -1
  355. package/dist/lib/nerd-font.js +0 -55
  356. package/dist/lib/nerd-font.js.map +0 -1
  357. package/dist/lib/open-url.js +0 -9
  358. package/dist/lib/open-url.js.map +0 -1
  359. package/dist/lib/parseResearchContext.js +0 -30
  360. package/dist/lib/parseResearchContext.js.map +0 -1
  361. package/dist/lib/sse-client.js +0 -113
  362. package/dist/lib/sse-client.js.map +0 -1
  363. package/dist/stores/confirmationStore.js +0 -27
  364. package/dist/stores/confirmationStore.js.map +0 -1
  365. package/dist/stores/fileBrowserStore.js +0 -63
  366. package/dist/stores/fileBrowserStore.js.map +0 -1
  367. package/dist/stores/filePickerStore.js +0 -8
  368. package/dist/stores/filePickerStore.js.map +0 -1
  369. package/dist/stores/focusStore.js +0 -12
  370. package/dist/stores/focusStore.js.map +0 -1
  371. package/dist/stores/gitStore.js +0 -63
  372. package/dist/stores/gitStore.js.map +0 -1
  373. package/dist/stores/mcpStore.js +0 -63
  374. package/dist/stores/mcpStore.js.map +0 -1
  375. package/dist/stores/onboardingStore.js +0 -38
  376. package/dist/stores/onboardingStore.js.map +0 -1
  377. package/dist/stores/panelWidthStore.js +0 -12
  378. package/dist/stores/panelWidthStore.js.map +0 -1
  379. package/dist/stores/pendingResearchStore.js +0 -38
  380. package/dist/stores/pendingResearchStore.js.map +0 -1
  381. package/dist/stores/queueStore.js +0 -11
  382. package/dist/stores/queueStore.js.map +0 -1
  383. package/dist/stores/researchStore.js +0 -54
  384. package/dist/stores/researchStore.js.map +0 -1
  385. package/dist/stores/sessionFilesStore.js +0 -62
  386. package/dist/stores/sessionFilesStore.js.map +0 -1
  387. package/dist/stores/settingsStore.js +0 -29
  388. package/dist/stores/settingsStore.js.map +0 -1
  389. package/dist/stores/setuStore.js +0 -29
  390. package/dist/stores/setuStore.js.map +0 -1
  391. package/dist/stores/sidebarStore.js +0 -10
  392. package/dist/stores/sidebarStore.js.map +0 -1
  393. package/dist/stores/skillsStore.js +0 -46
  394. package/dist/stores/skillsStore.js.map +0 -1
  395. package/dist/stores/terminalStore.js +0 -32
  396. package/dist/stores/terminalStore.js.map +0 -1
  397. package/dist/stores/toastStore.js +0 -46
  398. package/dist/stores/toastStore.js.map +0 -1
  399. package/dist/stores/toolApprovalStore.js +0 -16
  400. package/dist/stores/toolApprovalStore.js.map +0 -1
  401. package/dist/stores/topupApprovalStore.js +0 -11
  402. package/dist/stores/topupApprovalStore.js.map +0 -1
  403. package/dist/stores/tunnelStore.js +0 -55
  404. package/dist/stores/tunnelStore.js.map +0 -1
  405. package/dist/stores/usageStore.js +0 -14
  406. package/dist/stores/usageStore.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1,185 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,YAAY,GACZ,MAAM,wBAAwB,CAAC;AAEhC,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC"}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/ui/Button.tsx", "../src/components/ui/Card.tsx", "../src/components/ui/Input.tsx", "../src/components/ui/Textarea.tsx", "../src/components/ui/ConfirmationDialog.tsx", "../src/stores/confirmationStore.ts", "../src/components/ui/Toaster.tsx", "../src/stores/toastStore.ts", "../src/lib/open-url.ts", "../src/components/ui/ToolApprovalDialog.tsx", "../src/stores/toolApprovalStore.ts", "../src/components/ui/ResizeHandle.tsx", "../src/stores/panelWidthStore.ts", "../src/components/chat/ChatInput.tsx", "../src/components/chat/FileMentionPopup.tsx", "../src/components/chat/CommandSuggestionsPopup.tsx", "../src/hooks/useConfig.ts", "../src/lib/api-client/sessions.ts", "../src/lib/api-client/utils.ts", "../src/lib/config.ts", "../src/lib/api-client/git.ts", "../src/lib/api-client/config.ts", "../src/lib/api-client/files.ts", "../src/lib/api-client/branches.ts", "../src/lib/api-client/approval.ts", "../src/lib/api-client/setu.ts", "../src/lib/api-client/auth.ts", "../src/lib/api-client/skills.ts", "../src/lib/api-client/index.ts", "../src/hooks/usePreferences.ts", "../src/hooks/useShareStatus.ts", "../src/lib/commands.ts", "../src/components/chat/ShortcutsModal.tsx", "../src/components/ui/Modal.tsx", "../src/components/common/ProviderLogo.tsx", "../src/assets/provider-logos.ts", "../src/hooks/useFiles.ts", "../src/hooks/useVimMode.ts", "../src/hooks/useFileMention.ts", "../src/hooks/useCommandSuggestions.ts", "../src/components/chat/ChatInputKeyHandler.ts", "../src/stores/setuStore.ts", "../src/components/chat/ChatInputContainer.tsx", "../src/hooks/useMessages.ts", "../src/hooks/useSessions.ts", "../src/hooks/useGit.ts", "../src/stores/gitStore.ts", "../src/stores/sessionFilesStore.ts", "../src/stores/researchStore.ts", "../src/stores/settingsStore.ts", "../src/stores/tunnelStore.ts", "../src/stores/fileBrowserStore.ts", "../src/stores/mcpStore.ts", "../src/stores/skillsStore.ts", "../src/hooks/useFileUpload.ts", "../src/stores/queueStore.ts", "../src/stores/pendingResearchStore.ts", "../src/lib/parseResearchContext.ts", "../src/hooks/useSetuBalance.ts", "../src/components/chat/ConfigModal.tsx", "../src/components/chat/UnifiedModelSelector.tsx", "../src/components/chat/UnifiedAgentSelector.tsx", "../src/components/chat/ConfigSelector.tsx", "../src/components/chat/StopButton.tsx", "../src/components/messages/MessageThread.tsx", "../src/components/messages/AssistantMessageGroup.tsx", "../src/components/messages/MessagePartItem.tsx", "../src/components/messages/ToolApprovalCard.tsx", "../src/components/messages/renderers/DiffView.tsx", "../src/components/messages/renderers/index.tsx", "../src/components/messages/renderers/ReadRenderer.tsx", "../src/components/messages/renderers/utils.ts", "../src/components/messages/renderers/ToolErrorDisplay.tsx", "../src/components/messages/renderers/WriteRenderer.tsx", "../src/components/messages/renderers/EditRenderer.tsx", "../src/components/messages/renderers/BashRenderer.tsx", "../src/components/messages/renderers/shared/CopyButton.tsx", "../src/components/messages/renderers/shared/ToolContentBox.tsx", "../src/components/messages/renderers/shared/ImagePreview.tsx", "../src/components/messages/renderers/shared/ToolHeader.tsx", "../src/components/messages/renderers/GitStatusRenderer.tsx", "../src/components/messages/renderers/GitDiffRenderer.tsx", "../src/components/messages/renderers/GitCommitRenderer.tsx", "../src/components/messages/renderers/ApplyPatchRenderer.tsx", "../src/components/messages/renderers/ListRenderer.tsx", "../src/components/messages/renderers/TreeRenderer.tsx", "../src/components/messages/renderers/SearchRenderer.tsx", "../src/components/messages/renderers/FinishRenderer.tsx", "../src/components/messages/renderers/GenericRenderer.tsx", "../src/components/messages/renderers/DebugRenderer.tsx", "../src/components/messages/renderers/TodosRenderer.tsx", "../src/components/messages/renderers/ProgressUpdateRenderer.tsx", "../src/components/messages/renderers/WebSearchRenderer.tsx", "../src/components/messages/renderers/ErrorRenderer.tsx", "../src/components/messages/renderers/DatabaseToolRenderer.tsx", "../src/components/messages/renderers/TerminalRenderer.tsx", "../src/lib/nerd-font.ts", "../src/components/messages/renderers/McpToolRenderer.tsx", "../src/components/messages/renderers/LoadMcpToolsRenderer.tsx", "../src/components/messages/renderers/SkillRenderer.tsx", "../src/components/messages/renderers/ReasoningRenderer.tsx", "../src/components/messages/CompactActivityGroup.tsx", "../src/components/messages/compactActivity.ts", "../src/hooks/useQueueState.ts", "../src/components/branch/BranchModal.tsx", "../src/hooks/useBranch.ts", "../src/components/messages/UserMessageGroup.tsx", "../src/components/sessions/SessionHeader.tsx", "../src/components/sessions/EditableTitle.tsx", "../src/components/sessions/LeanHeader.tsx", "../src/components/common/UsageRing.tsx", "../src/stores/usageStore.ts", "../src/components/common/UsageModal.tsx", "../src/hooks/useProviderUsage.ts", "../src/components/messages/TopupApprovalCard.tsx", "../src/stores/topupApprovalStore.ts", "../src/components/messages/MessageThreadContainer.tsx", "../src/hooks/useSessionStream.ts", "../src/lib/sse-client.ts", "../src/hooks/useToolApprovalShortcuts.ts", "../src/components/settings/SetuTopupModal.tsx", "../src/components/common/StatusIndicator.tsx", "../src/components/sessions/SessionItem.tsx", "../src/components/sessions/SessionListContainer.tsx", "../src/stores/focusStore.ts", "../src/components/git/GitDiffViewer.tsx", "../src/components/git/GitFileList.tsx", "../src/components/git/GitFileItem.tsx", "../src/components/git/GitSidebar.tsx", "../src/components/git/GitSidebarToggle.tsx", "../src/components/git/GitDiffPanel.tsx", "../src/stores/sidebarStore.ts", "../src/hooks/useFileBrowser.ts", "../src/components/git/GitCommitModal.tsx", "../src/components/terminals/TerminalsPanel.tsx", "../src/stores/terminalStore.ts", "../src/hooks/useTerminals.ts", "../src/components/terminals/TerminalTabBar.tsx", "../src/components/terminals/TerminalViewer.tsx", "../src/components/terminals/TerminalPanelToggle.tsx", "../src/components/session-files/SessionFilesSidebar.tsx", "../src/hooks/useSessionFiles.ts", "../src/components/session-files/SessionFilesSidebarToggle.tsx", "../src/components/session-files/SessionFilesDiffPanel.tsx", "../src/components/research/ResearchSidebar.tsx", "../src/hooks/useResearch.ts", "../src/components/research/ResearchSidebarToggle.tsx", "../src/components/settings/SettingsSidebar.tsx", "../src/stores/onboardingStore.ts", "../src/hooks/useAuthStatus.ts", "../src/hooks/useTopupCallback.ts", "../src/components/settings/SettingsSidebarToggle.tsx", "../src/components/tunnel/TunnelSidebar.tsx", "../src/hooks/useTunnel.ts", "../src/components/tunnel/TunnelSidebarToggle.tsx", "../src/components/mcp/MCPSidebar.tsx", "../src/hooks/useMCP.ts", "../src/components/mcp/AddMCPServerModal.tsx", "../src/components/mcp/MCPSidebarToggle.tsx", "../src/components/skills/SkillsSidebar.tsx", "../src/hooks/useSkills.ts", "../src/components/skills/SkillsSidebarToggle.tsx", "../src/components/skills/SkillViewerPanel.tsx", "../src/components/file-browser/FileBrowserSidebar.tsx", "../src/components/file-browser/FileBrowserSidebarToggle.tsx", "../src/components/file-browser/FileViewerPanel.tsx", "../src/components/file-browser/QuickFilePicker.tsx", "../src/stores/filePickerStore.ts", "../src/components/onboarding/OnboardingModal.tsx", "../src/components/onboarding/steps/ProviderSetupStep.tsx", "../src/components/onboarding/steps/DefaultsStep.tsx", "../src/hooks/useTheme.ts", "../src/hooks/useWorkingDirectory.ts", "../src/hooks/useKeyboardShortcuts.ts", "../src/hooks/useImageUpload.ts", "../src/hooks/useSetuPayments.ts"],
4
+ "sourcesContent": [
5
+ "import { forwardRef } from 'react';\nimport type { ButtonHTMLAttributes } from 'react';\n\ninterface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n\tvariant?: 'primary' | 'secondary' | 'ghost';\n\tsize?: 'sm' | 'md' | 'lg' | 'icon';\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n\t({ className = '', variant = 'primary', size = 'md', ...props }, ref) => {\n\t\tconst baseStyles =\n\t\t\t'inline-flex items-center justify-center rounded font-medium transition-colors focus-visible:outline-none disabled:opacity-50 disabled:cursor-not-allowed';\n\n\t\tconst variants = {\n\t\t\tprimary: 'bg-primary text-primary-foreground hover:bg-primary/90',\n\t\t\tsecondary:\n\t\t\t\t'bg-muted text-foreground hover:bg-muted/80 border border-border',\n\t\t\tghost: 'text-muted-foreground hover:text-foreground hover:bg-muted/50',\n\t\t};\n\n\t\tconst sizes = {\n\t\t\tsm: 'px-3 py-1.5 text-sm',\n\t\t\tmd: 'px-4 py-2 text-sm',\n\t\t\tlg: 'px-6 py-3 text-base',\n\t\t\ticon: 'w-10 h-10 p-0',\n\t\t};\n\n\t\treturn (\n\t\t\t<button\n\t\t\t\tref={ref}\n\t\t\t\tclassName={`${baseStyles} ${variants[variant]} ${sizes[size]} ${className}`}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t);\n\t},\n);\n\nButton.displayName = 'Button';\n",
6
+ "import { forwardRef } from 'react';\nimport type { HTMLAttributes } from 'react';\n\ninterface CardProps extends HTMLAttributes<HTMLDivElement> {}\n\nexport const Card = forwardRef<HTMLDivElement, CardProps>(\n\t({ className = '', children, ...props }, ref) => {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={`bg-card text-card-foreground border border-border rounded-lg ${className}`}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t);\n\t},\n);\n\nCard.displayName = 'Card';\n",
7
+ "import { forwardRef } from 'react';\nimport type { InputHTMLAttributes } from 'react';\n\ninterface InputProps extends InputHTMLAttributes<HTMLInputElement> {}\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n\t({ className = '', ...props }, ref) => {\n\t\treturn (\n\t\t\t<input\n\t\t\t\tref={ref}\n\t\t\t\tclassName={`w-full px-3 py-2 bg-muted border border-border rounded text-foreground placeholder-muted-foreground outline-none ${className}`}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t);\n\t},\n);\n\nInput.displayName = 'Input';\n",
8
+ "import { forwardRef } from 'react';\nimport type { TextareaHTMLAttributes } from 'react';\n\ninterface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {}\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n\t({ className = '', ...props }, ref) => {\n\t\treturn (\n\t\t\t<textarea\n\t\t\t\tref={ref}\n\t\t\t\tclassName={`w-full px-3 py-2 bg-muted border border-border rounded text-foreground placeholder-muted-foreground outline-none resize-none ${className}`}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t);\n\t},\n);\n\nTextarea.displayName = 'Textarea';\n",
9
+ "import { useCallback } from 'react';\nimport { useConfirmationStore } from '../../stores/confirmationStore';\nimport { X, AlertCircle } from 'lucide-react';\nimport { useEffect, useState } from 'react';\n\nexport function ConfirmationDialog() {\n\tconst {\n\t\tisOpen,\n\t\ttitle,\n\t\tmessage,\n\t\tconfirmLabel,\n\t\tcancelLabel,\n\t\tvariant,\n\t\tonConfirm,\n\t\tonCancel,\n\t\tcloseConfirmation,\n\t} = useConfirmationStore();\n\n\tconst [isProcessing, setIsProcessing] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (!isOpen) {\n\t\t\tsetIsProcessing(false);\n\t\t}\n\t}, [isOpen]);\n\n\tconst handleConfirm = useCallback(async () => {\n\t\tsetIsProcessing(true);\n\t\ttry {\n\t\t\tawait onConfirm();\n\t\t\tcloseConfirmation();\n\t\t} catch (error) {\n\t\t\tconsole.error('Confirmation action failed:', error);\n\t\t\tsetIsProcessing(false);\n\t\t}\n\t}, [onConfirm, closeConfirmation]);\n\n\tconst handleCancel = useCallback(() => {\n\t\tonCancel?.();\n\t\tcloseConfirmation();\n\t}, [onCancel, closeConfirmation]);\n\n\tconst handleBackdropClick = (e: React.MouseEvent<HTMLDivElement>) => {\n\t\tif (e.target === e.currentTarget && !isProcessing) {\n\t\t\thandleCancel();\n\t\t}\n\t};\n\n\tuseEffect(() => {\n\t\tconst handleEscape = (e: KeyboardEvent) => {\n\t\t\tif (isOpen && !isProcessing) {\n\t\t\t\tconst target = e.target as HTMLElement;\n\t\t\t\tconst isInInput =\n\t\t\t\t\ttarget.tagName === 'INPUT' ||\n\t\t\t\t\ttarget.tagName === 'TEXTAREA' ||\n\t\t\t\t\ttarget.isContentEditable;\n\t\t\t\tif (e.key === 'Escape' || (e.key === 'q' && !isInInput)) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\thandleCancel();\n\t\t\t\t}\n\t\t\t\tif (e.key === 'Enter') {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\thandleConfirm();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tif (isOpen) {\n\t\t\tdocument.addEventListener('keydown', handleEscape);\n\t\t\treturn () => document.removeEventListener('keydown', handleEscape);\n\t\t}\n\t}, [isOpen, isProcessing, handleConfirm, handleCancel]);\n\n\tif (!isOpen) return null;\n\n\treturn (\n\t\t<div\n\t\t\trole=\"dialog\"\n\t\t\taria-modal=\"true\"\n\t\t\tclassName=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\"\n\t\t\tonClick={handleBackdropClick}\n\t\t\tonKeyDown={(e) => {\n\t\t\t\tconst target = e.target as HTMLElement;\n\t\t\t\tconst isInInput =\n\t\t\t\t\ttarget.tagName === 'INPUT' ||\n\t\t\t\t\ttarget.tagName === 'TEXTAREA' ||\n\t\t\t\t\ttarget.isContentEditable;\n\t\t\t\tif (\n\t\t\t\t\t(e.key === 'Escape' || (e.key === 'q' && !isInInput)) &&\n\t\t\t\t\t!isProcessing\n\t\t\t\t) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\thandleCancel();\n\t\t\t\t}\n\t\t\t}}\n\t\t>\n\t\t\t<div className=\"bg-background border border-border rounded-lg shadow-lg max-w-md w-full mx-4\">\n\t\t\t\t<div className=\"flex items-center justify-between p-4 border-b border-border\">\n\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t{variant === 'destructive' && (\n\t\t\t\t\t\t\t<AlertCircle className=\"w-5 h-5 text-destructive\" />\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<h2 className=\"text-lg font-semibold\">{title}</h2>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={handleCancel}\n\t\t\t\t\t\tdisabled={isProcessing}\n\t\t\t\t\t\tclassName=\"p-1 hover:bg-muted rounded transition-colors disabled:opacity-50\"\n\t\t\t\t\t\taria-label=\"Close\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<X className=\"w-5 h-5\" />\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"p-4\">\n\t\t\t\t\t<p className=\"text-muted-foreground\">{message}</p>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"flex items-center justify-end gap-3 p-4 border-t border-border\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={handleCancel}\n\t\t\t\t\t\tdisabled={isProcessing}\n\t\t\t\t\t\tclassName=\"px-4 py-2 text-sm font-medium rounded transition-colors hover:bg-muted disabled:opacity-50\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{cancelLabel}\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={handleConfirm}\n\t\t\t\t\t\tdisabled={isProcessing}\n\t\t\t\t\t\tclassName={`px-4 py-2 text-sm font-medium rounded transition-colors disabled:opacity-50 ${\n\t\t\t\t\t\t\tvariant === 'destructive'\n\t\t\t\t\t\t\t\t? 'bg-destructive text-destructive-foreground hover:bg-destructive/90'\n\t\t\t\t\t\t\t\t: 'bg-primary text-primary-foreground hover:bg-primary/90'\n\t\t\t\t\t\t}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isProcessing ? 'Processing...' : confirmLabel}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n",
10
+ "import { create } from 'zustand';\n\ninterface ConfirmationState {\n\tisOpen: boolean;\n\ttitle: string;\n\tmessage: string;\n\tconfirmLabel: string;\n\tcancelLabel: string;\n\tvariant: 'default' | 'destructive';\n\tonConfirm: () => void | Promise<void>;\n\tonCancel?: () => void;\n\n\topenConfirmation: (options: {\n\t\ttitle?: string;\n\t\tmessage: string;\n\t\tconfirmLabel?: string;\n\t\tcancelLabel?: string;\n\t\tvariant?: 'default' | 'destructive';\n\t\tonConfirm: () => void | Promise<void>;\n\t\tonCancel?: () => void;\n\t}) => void;\n\tcloseConfirmation: () => void;\n}\n\nexport const useConfirmationStore = create<ConfirmationState>((set) => ({\n\tisOpen: false,\n\ttitle: 'Confirm Action',\n\tmessage: '',\n\tconfirmLabel: 'Confirm',\n\tcancelLabel: 'Cancel',\n\tvariant: 'default',\n\tonConfirm: () => {},\n\tonCancel: undefined,\n\n\topenConfirmation: (options) =>\n\t\tset({\n\t\t\tisOpen: true,\n\t\t\ttitle: options.title || 'Confirm Action',\n\t\t\tmessage: options.message,\n\t\t\tconfirmLabel: options.confirmLabel || 'Confirm',\n\t\t\tcancelLabel: options.cancelLabel || 'Cancel',\n\t\t\tvariant: options.variant || 'default',\n\t\t\tonConfirm: options.onConfirm,\n\t\t\tonCancel: options.onCancel,\n\t\t}),\n\n\tcloseConfirmation: () =>\n\t\tset({\n\t\t\tisOpen: false,\n\t\t\tonConfirm: () => {},\n\t\t\tonCancel: undefined,\n\t\t}),\n}));\n",
11
+ "import { useEffect, useState } from 'react';\nimport {\n\tCheckCircle,\n\tXCircle,\n\tLoader2,\n\tCreditCard,\n\tExternalLink,\n} from 'lucide-react';\nimport {\n\tuseToastStore,\n\ttype Toast,\n\ttype ToastType,\n} from '../../stores/toastStore';\nimport { openUrl } from '../../lib/open-url';\n\nconst icons: Record<ToastType, React.ReactNode> = {\n\tdefault: <CreditCard className=\"h-4 w-4\" />,\n\tsuccess: <CheckCircle className=\"h-4 w-4 text-green-500\" />,\n\terror: <XCircle className=\"h-4 w-4 text-red-500\" />,\n\tloading: <Loader2 className=\"h-4 w-4 animate-spin\" />,\n};\n\nfunction ToastItem({ toast }: { toast: Toast }) {\n\tconst [isVisible, setIsVisible] = useState(false);\n\tconst removeToast = useToastStore((s) => s.removeToast);\n\n\tuseEffect(() => {\n\t\trequestAnimationFrame(() => setIsVisible(true));\n\t}, []);\n\n\tconst handleDismiss = () => {\n\t\tsetIsVisible(false);\n\t\tsetTimeout(() => removeToast(toast.id), 150);\n\t};\n\n\treturn (\n\t\t// biome-ignore lint/a11y/useKeyWithClickEvents: toast click-to-dismiss is supplementary\n\t\t<div\n\t\t\tclassName={`\n\t\t\t\tflex items-center gap-3 px-4 py-3\n\t\t\t\tbg-card border border-border rounded-lg shadow-lg\n\t\t\t\ttransition-all duration-150 ease-out cursor-pointer\n\t\t\t\thover:bg-accent/50\n\t\t\t\t${isVisible ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-2'}\n\t\t\t`}\n\t\t\tonClick={handleDismiss}\n\t\t\trole=\"alert\"\n\t\t>\n\t\t\t{icons[toast.type]}\n\t\t\t<span className=\"text-sm text-foreground\">{toast.message}</span>\n\t\t\t{toast.action && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\topenUrl(toast.action?.href);\n\t\t\t\t\t}}\n\t\t\t\t\tclassName=\"ml-auto flex items-center gap-1 text-xs text-primary hover:underline\"\n\t\t\t\t>\n\t\t\t\t\t{toast.action.label}\n\t\t\t\t\t<ExternalLink className=\"h-3 w-3\" />\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nexport function Toaster() {\n\tconst toasts = useToastStore((s) => s.toasts);\n\n\tif (toasts.length === 0) return null;\n\n\treturn (\n\t\t<div className=\"fixed bottom-4 right-4 z-[9999] flex flex-col gap-2 max-w-sm\">\n\t\t\t{toasts.map((toast) => (\n\t\t\t\t<ToastItem key={toast.id} toast={toast} />\n\t\t\t))}\n\t\t</div>\n\t);\n}\n",
12
+ "import { create } from 'zustand';\n\nexport type ToastType = 'default' | 'success' | 'error' | 'loading';\n\nexport interface Toast {\n\tid: string;\n\tmessage: string;\n\ttype: ToastType;\n\tduration?: number;\n\ticon?: string;\n\taction?: {\n\t\tlabel: string;\n\t\thref: string;\n\t};\n}\n\ninterface ToastState {\n\ttoasts: Toast[];\n\taddToast: (toast: Omit<Toast, 'id'>) => string;\n\tremoveToast: (id: string) => void;\n\tupdateToast: (id: string, updates: Partial<Omit<Toast, 'id'>>) => void;\n\tclearToasts: () => void;\n}\n\nlet toastId = 0;\n\nexport const useToastStore = create<ToastState>((set) => ({\n\ttoasts: [],\n\taddToast: (toast) => {\n\t\tconst id = `toast-${++toastId}`;\n\t\tset((state) => ({\n\t\t\ttoasts: [...state.toasts, { ...toast, id }],\n\t\t}));\n\t\treturn id;\n\t},\n\tremoveToast: (id) =>\n\t\tset((state) => ({\n\t\t\ttoasts: state.toasts.filter((t) => t.id !== id),\n\t\t})),\n\tupdateToast: (id, updates) =>\n\t\tset((state) => ({\n\t\t\ttoasts: state.toasts.map((t) => (t.id === id ? { ...t, ...updates } : t)),\n\t\t})),\n\tclearToasts: () => set({ toasts: [] }),\n}));\n\nexport function toast(\n\tmessage: string,\n\ttype: ToastType = 'default',\n\tduration = 4000,\n) {\n\tconst id = useToastStore.getState().addToast({ message, type, duration });\n\tif (duration > 0) {\n\t\tsetTimeout(() => {\n\t\t\tuseToastStore.getState().removeToast(id);\n\t\t}, duration);\n\t}\n\treturn id;\n}\n\ntoast.success = (message: string, duration = 4000) =>\n\ttoast(message, 'success', duration);\ntoast.error = (message: string, duration = 5000) =>\n\ttoast(message, 'error', duration);\ntoast.info = (message: string, duration = 4000) =>\n\ttoast(message, 'default', duration);\ntoast.loading = (message: string) => toast(message, 'loading', 0);\n\ntoast.successWithAction = (\n\tmessage: string,\n\taction: { label: string; href: string },\n\tduration = 6000,\n) => {\n\tconst id = useToastStore.getState().addToast({\n\t\tmessage,\n\t\ttype: 'success',\n\t\tduration,\n\t\taction,\n\t});\n\tif (duration > 0) {\n\t\tsetTimeout(() => {\n\t\t\tuseToastStore.getState().removeToast(id);\n\t\t}, duration);\n\t}\n\treturn id;\n};\n",
13
+ "export function openUrl(url: string) {\n\tif (window.self !== window.top) {\n\t\twindow.parent.postMessage({ type: 'otto-open-url', url }, '*');\n\t} else {\n\t\twindow.open(url, '_blank', 'noopener,noreferrer');\n\t}\n}\n",
14
+ "import { useCallback, useState } from 'react';\nimport { useToolApprovalStore } from '../../stores/toolApprovalStore';\nimport { Shield, Check, X, Terminal, FileEdit, GitCommit } from 'lucide-react';\n\nconst TOOL_ICONS: Record<string, typeof Terminal> = {\n\tbash: Terminal,\n\twrite: FileEdit,\n\tapply_patch: FileEdit,\n\tedit: FileEdit,\n\tterminal: Terminal,\n\tgit_commit: GitCommit,\n\tgit_push: GitCommit,\n};\n\ninterface ToolApprovalDialogProps {\n\tbaseUrl: string;\n\tsessionId: string;\n}\n\nexport function ToolApprovalDialog({\n\tbaseUrl,\n\tsessionId,\n}: ToolApprovalDialogProps) {\n\tconst { pendingApprovals, removePendingApproval } = useToolApprovalStore();\n\tconst [processingId, setProcessingId] = useState<string | null>(null);\n\n\tconst handleApproval = useCallback(\n\t\tasync (callId: string, approved: boolean) => {\n\t\t\tsetProcessingId(callId);\n\t\t\ttry {\n\t\t\t\tconst response = await fetch(\n\t\t\t\t\t`${baseUrl}/v1/sessions/${sessionId}/approval`,\n\t\t\t\t\t{\n\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\t\t\tbody: JSON.stringify({ callId, approved }),\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tif (response.ok) {\n\t\t\t\t\tremovePendingApproval(callId);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('Failed to send approval:', error);\n\t\t\t} finally {\n\t\t\t\tsetProcessingId(null);\n\t\t\t}\n\t\t},\n\t\t[baseUrl, sessionId, removePendingApproval],\n\t);\n\n\tif (pendingApprovals.length === 0) return null;\n\n\tconst formatArgs = (args: unknown): string => {\n\t\tif (!args) return '';\n\t\tif (typeof args === 'string') return args;\n\t\ttry {\n\t\t\tconst str = JSON.stringify(args, null, 2);\n\t\t\treturn str.length > 200 ? `${str.slice(0, 200)}...` : str;\n\t\t} catch {\n\t\t\treturn String(args);\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className=\"fixed bottom-4 right-4 z-50 flex flex-col gap-2 max-w-md\">\n\t\t\t{pendingApprovals.map((approval) => {\n\t\t\t\tconst Icon = TOOL_ICONS[approval.toolName] || Shield;\n\t\t\t\tconst isProcessing = processingId === approval.callId;\n\n\t\t\t\treturn (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={approval.callId}\n\t\t\t\t\t\tclassName=\"bg-background border border-border rounded-lg shadow-lg p-4 animate-in slide-in-from-right-2\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"flex items-start gap-3\">\n\t\t\t\t\t\t\t<div className=\"p-2 bg-warning/10 rounded-lg\">\n\t\t\t\t\t\t\t\t<Icon className=\"w-5 h-5 text-warning\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"flex-1 min-w-0\">\n\t\t\t\t\t\t\t\t<h3 className=\"font-semibold text-sm flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t<Shield className=\"w-4 h-4 text-warning\" />\n\t\t\t\t\t\t\t\t\tTool Approval Required\n\t\t\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground mt-1\">\n\t\t\t\t\t\t\t\t\t<code className=\"px-1.5 py-0.5 bg-muted rounded text-xs font-mono\">\n\t\t\t\t\t\t\t\t\t\t{approval.toolName}\n\t\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t{approval.args && (\n\t\t\t\t\t\t\t\t\t<pre className=\"mt-2 p-2 bg-muted rounded text-xs font-mono overflow-x-auto max-h-24 overflow-y-auto\">\n\t\t\t\t\t\t\t\t\t\t{formatArgs(approval.args)}\n\t\t\t\t\t\t\t\t\t</pre>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex items-center justify-end gap-2 mt-3\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => handleApproval(approval.callId, false)}\n\t\t\t\t\t\t\t\tdisabled={isProcessing}\n\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium rounded transition-colors hover:bg-muted disabled:opacity-50\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<X className=\"w-4 h-4\" />\n\t\t\t\t\t\t\t\tReject\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => handleApproval(approval.callId, true)}\n\t\t\t\t\t\t\t\tdisabled={isProcessing}\n\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 px-3 py-1.5 text-sm font-medium rounded transition-colors bg-primary text-primary-foreground hover:bg-primary/90 disabled:opacity-50\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Check className=\"w-4 h-4\" />\n\t\t\t\t\t\t\t\t{isProcessing ? 'Approving...' : 'Approve'}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n",
15
+ "import { create } from 'zustand';\n\nexport interface PendingToolApproval {\n\tcallId: string;\n\ttoolName: string;\n\targs: unknown;\n\tmessageId: string;\n\tcreatedAt: number;\n}\n\ninterface ToolApprovalState {\n\tpendingApprovals: PendingToolApproval[];\n\taddPendingApproval: (approval: PendingToolApproval) => void;\n\tremovePendingApproval: (callId: string) => void;\n\tupdatePendingApproval: (callId: string, args: unknown) => void;\n\tclearPendingApprovals: () => void;\n\tsetPendingApprovals: (approvals: PendingToolApproval[]) => void;\n}\n\nexport const useToolApprovalStore = create<ToolApprovalState>((set) => ({\n\tpendingApprovals: [],\n\n\taddPendingApproval: (approval) =>\n\t\tset((state) => ({\n\t\t\tpendingApprovals: [...state.pendingApprovals, approval],\n\t\t})),\n\n\tremovePendingApproval: (callId) =>\n\t\tset((state) => ({\n\t\t\tpendingApprovals: state.pendingApprovals.filter(\n\t\t\t\t(a) => a.callId !== callId,\n\t\t\t),\n\t\t})),\n\n\tupdatePendingApproval: (callId, args) =>\n\t\tset((state) => ({\n\t\t\tpendingApprovals: state.pendingApprovals.map((a) =>\n\t\t\t\ta.callId === callId ? { ...a, args } : a,\n\t\t\t),\n\t\t})),\n\n\tclearPendingApprovals: () => set({ pendingApprovals: [] }),\n\n\tsetPendingApprovals: (approvals) => set({ pendingApprovals: approvals }),\n}));\n",
16
+ "import { memo, useCallback, useRef } from 'react';\nimport { usePanelWidthStore } from '../../stores/panelWidthStore';\n\ninterface ResizeHandleProps {\n\tpanelKey: string;\n\tside: 'left' | 'right';\n\tminWidth: number;\n\tmaxWidth: number;\n\tdefaultWidth: number;\n\tonWidthChange?: (width: number) => void;\n}\n\nexport const ResizeHandle = memo(function ResizeHandle({\n\tpanelKey,\n\tside,\n\tminWidth,\n\tmaxWidth,\n\tdefaultWidth,\n\tonWidthChange,\n}: ResizeHandleProps) {\n\tconst dragRef = useRef<{ startX: number; startWidth: number } | null>(null);\n\n\tconst handleMouseDown = useCallback(\n\t\t(e: React.MouseEvent) => {\n\t\t\te.preventDefault();\n\t\t\tconst currentWidth = usePanelWidthStore\n\t\t\t\t.getState()\n\t\t\t\t.getWidth(panelKey, defaultWidth);\n\t\t\tdragRef.current = { startX: e.clientX, startWidth: currentWidth };\n\n\t\t\tconst handleMouseMove = (ev: MouseEvent) => {\n\t\t\t\tif (!dragRef.current) return;\n\t\t\t\tconst delta = ev.clientX - dragRef.current.startX;\n\t\t\t\tconst newWidth =\n\t\t\t\t\tside === 'right'\n\t\t\t\t\t\t? dragRef.current.startWidth - delta\n\t\t\t\t\t\t: dragRef.current.startWidth + delta;\n\t\t\t\tconst clamped = Math.min(Math.max(minWidth, newWidth), maxWidth);\n\t\t\t\tusePanelWidthStore.getState().setWidth(panelKey, clamped);\n\t\t\t\tonWidthChange?.(clamped);\n\t\t\t};\n\n\t\t\tconst handleMouseUp = () => {\n\t\t\t\tdragRef.current = null;\n\t\t\t\tdocument.removeEventListener('mousemove', handleMouseMove);\n\t\t\t\tdocument.removeEventListener('mouseup', handleMouseUp);\n\t\t\t\tdocument.body.style.cursor = '';\n\t\t\t\tdocument.body.style.userSelect = '';\n\t\t\t};\n\n\t\t\tdocument.addEventListener('mousemove', handleMouseMove);\n\t\t\tdocument.addEventListener('mouseup', handleMouseUp);\n\t\t\tdocument.body.style.cursor = 'col-resize';\n\t\t\tdocument.body.style.userSelect = 'none';\n\t\t},\n\t\t[panelKey, side, minWidth, maxWidth, defaultWidth, onWidthChange],\n\t);\n\n\treturn (\n\t\t// biome-ignore lint/a11y/noStaticElementInteractions: mouse-only resize handle\n\t\t<div\n\t\t\tclassName={`w-1 h-full cursor-col-resize hover:bg-primary/30 active:bg-primary/50 transition-colors absolute top-0 bottom-0 z-10 ${\n\t\t\t\tside === 'right' ? 'left-0' : 'right-0'\n\t\t\t}`}\n\t\t\tonMouseDown={handleMouseDown}\n\t\t/>\n\t);\n});\n",
17
+ "import { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\n\ninterface PanelWidthState {\n\twidths: Record<string, number>;\n\tsetWidth: (key: string, width: number) => void;\n\tgetWidth: (key: string, defaultWidth: number) => number;\n}\n\nexport const usePanelWidthStore = create<PanelWidthState>()(\n\tpersist(\n\t\t(set, get) => ({\n\t\t\twidths: {},\n\t\t\tsetWidth: (key, width) =>\n\t\t\t\tset((state) => ({\n\t\t\t\t\twidths: { ...state.widths, [key]: width },\n\t\t\t\t})),\n\t\t\tgetWidth: (key, defaultWidth) => get().widths[key] ?? defaultWidth,\n\t\t}),\n\t\t{\n\t\t\tname: 'panel-widths',\n\t\t},\n\t),\n);\n",
18
+ "import {\n\tuseState,\n\tuseRef,\n\tuseEffect,\n\tuseCallback,\n\tmemo,\n\tforwardRef,\n\tuseImperativeHandle,\n\tuseMemo,\n} from 'react';\nimport type { ChangeEvent, ClipboardEvent } from 'react';\n\nimport {\n\tArrowUp,\n\tMoreVertical,\n\tX,\n\tImageIcon,\n\tBrain,\n\tFileText,\n\tFileIcon,\n\tFlaskConical,\n\tRefreshCw,\n\tChevronUp,\n} from 'lucide-react';\nimport { Textarea } from '../ui/Textarea';\nimport { FileMentionPopup } from './FileMentionPopup';\nimport { CommandSuggestionsPopup } from './CommandSuggestionsPopup';\nimport { ShortcutsModal } from './ShortcutsModal';\nimport { ProviderLogo } from '../common/ProviderLogo';\nimport { useFiles } from '../../hooks/useFiles';\nimport { usePreferences } from '../../hooks/usePreferences';\nimport { useConfig, useUpdateDefaults } from '../../hooks/useConfig';\nimport { useVimMode } from '../../hooks/useVimMode';\nimport { useFileMention } from '../../hooks/useFileMention';\nimport { useCommandSuggestions } from '../../hooks/useCommandSuggestions';\nimport { createChatInputKeyHandler } from './ChatInputKeyHandler';\nimport { useSetuStore } from '../../stores/setuStore';\nimport type { FileAttachment } from '../../hooks/useFileUpload';\n\ninterface ChatInputProps {\n\tonSend: (message: string) => void;\n\tonCommand?: (commandId: string) => void;\n\tdisabled?: boolean;\n\tonConfigClick?: () => void;\n\tonPlanModeToggle?: (isPlanMode: boolean) => void;\n\tisPlanMode?: boolean;\n\treasoningEnabled?: boolean;\n\tsessionId?: string;\n\timages?: FileAttachment[];\n\tdocuments?: FileAttachment[];\n\tonFileRemove?: (id: string) => void;\n\tisDragging?: boolean;\n\tonPaste?: (e: ClipboardEvent) => void;\n\tvisionEnabled?: boolean;\n\tattachmentEnabled?: boolean;\n\tmodelName?: string;\n\tproviderName?: string;\n\tauthType?: 'api' | 'oauth' | 'wallet';\n\tresearchContexts?: Array<{ id: string; label: string }>;\n\tonResearchContextRemove?: (id: string) => void;\n\tonRefreshBalance?: () => void;\n\tisBalanceLoading?: boolean;\n\tonModelInfoClick?: () => void;\n\tagent?: string;\n\tagents?: string[];\n\tonAgentChange?: (agent: string) => void;\n}\n\nexport const ChatInput = memo(\n\tforwardRef<\n\t\t{ focus: () => void; setValue: (value: string) => void },\n\t\tChatInputProps\n\t>(function ChatInput(\n\t\t{\n\t\t\tonSend,\n\t\t\tonCommand,\n\t\t\tdisabled,\n\t\t\tonConfigClick,\n\t\t\tonPlanModeToggle,\n\t\t\tisPlanMode: externalIsPlanMode,\n\t\t\treasoningEnabled,\n\t\t\tsessionId,\n\t\t\timages = [],\n\t\t\tdocuments = [],\n\t\t\tonFileRemove,\n\t\t\tisDragging = false,\n\t\t\tonPaste,\n\t\t\tvisionEnabled = false,\n\t\t\tattachmentEnabled = false,\n\t\t\tmodelName,\n\t\t\tproviderName,\n\t\t\tauthType,\n\t\t\tresearchContexts = [],\n\t\t\tonResearchContextRemove,\n\t\t\tonRefreshBalance,\n\t\t\tisBalanceLoading = false,\n\t\t\tonModelInfoClick,\n\t\t\tagent,\n\t\t\tagents = [],\n\t\t\tonAgentChange,\n\t\t},\n\t\tref,\n\t) {\n\t\tconst [message, setMessage] = useState('');\n\t\tconst [isPlanMode, setIsPlanMode] = useState(externalIsPlanMode || false);\n\t\tconst [showShortcutsModal, setShowShortcutsModal] = useState(false);\n\t\tconst [showAgentDropdown, setShowAgentDropdown] = useState(false);\n\t\tconst textareaRef = useRef<HTMLTextAreaElement>(null);\n\t\tconst agentDropdownRef = useRef<HTMLDivElement>(null);\n\n\t\tconst { data: filesData, isLoading: filesLoading } = useFiles();\n\t\tconst { preferences, updatePreferences } = usePreferences();\n\t\tconst { data: configData } = useConfig();\n\t\tconst updateDefaultsMutation = useUpdateDefaults();\n\t\tconst files = filesData?.files || [];\n\t\tconst changedFiles = filesData?.changedFiles || [];\n\n\t\tconst setuBalance = useSetuStore((s) => s.balance);\n\t\tconst setuSubscription = useSetuStore((s) => s.subscription);\n\t\tconst setuPayg = useSetuStore((s) => s.payg);\n\t\tconst isSetu = providerName === 'setu';\n\t\tconst setuStatusLabel = useMemo(() => {\n\t\t\tif (!isSetu) return null;\n\n\t\t\tconst effectivePayg =\n\t\t\t\tsetuPayg?.effectiveSpendableUsd !== undefined\n\t\t\t\t\t? setuPayg.effectiveSpendableUsd\n\t\t\t\t\t: setuBalance;\n\n\t\t\tif (setuSubscription?.active) {\n\t\t\t\tconst credits = `${setuSubscription.creditsRemaining?.toFixed(1) ?? '—'} credits`;\n\t\t\t\tif (\n\t\t\t\t\teffectivePayg !== null &&\n\t\t\t\t\teffectivePayg !== undefined &&\n\t\t\t\t\teffectivePayg > 0\n\t\t\t\t) {\n\t\t\t\t\treturn `GO ${credits} · $${effectivePayg.toFixed(2)}`;\n\t\t\t\t}\n\t\t\t\treturn `GO ${credits}`;\n\t\t\t}\n\n\t\t\tif (effectivePayg !== null && effectivePayg !== undefined) {\n\t\t\t\treturn `$${effectivePayg.toFixed(2)}`;\n\t\t\t}\n\n\t\t\treturn null;\n\t\t}, [isSetu, setuPayg, setuBalance, setuSubscription]);\n\n\t\tuseEffect(() => {\n\t\t\tif (!showAgentDropdown) return;\n\t\t\tconst handleClickOutside = (event: MouseEvent) => {\n\t\t\t\tif (\n\t\t\t\t\tagentDropdownRef.current &&\n\t\t\t\t\t!agentDropdownRef.current.contains(event.target as Node)\n\t\t\t\t) {\n\t\t\t\t\tsetShowAgentDropdown(false);\n\t\t\t\t}\n\t\t\t};\n\t\t\tdocument.addEventListener('mousedown', handleClickOutside);\n\t\t\treturn () =>\n\t\t\t\tdocument.removeEventListener('mousedown', handleClickOutside);\n\t\t}, [showAgentDropdown]);\n\n\t\tconst handleSendRef = useRef<() => void>(() => {});\n\n\t\tconst {\n\t\t\tshowFileMention,\n\t\t\tmentionQuery,\n\t\t\tmentionSelectedIndex,\n\t\t\tcurrentFileToSelect,\n\t\t\tsetShowFileMention,\n\t\t\tsetMentionSelectedIndex,\n\t\t\tsetCurrentFileToSelect,\n\t\t\thandleFileSelect: selectFile,\n\t\t\thandleEnterSelect: handleMentionEnterSelect,\n\t\t\tcheckForMention,\n\t\t} = useFileMention();\n\n\t\tconst {\n\t\t\tshowCommandSuggestions,\n\t\t\tcommandQuery,\n\t\t\tcommandSelectedIndex,\n\t\t\tcurrentCommandToSelect,\n\t\t\tsetShowCommandSuggestions,\n\t\t\tsetCommandSelectedIndex,\n\t\t\tsetCurrentCommandToSelect,\n\t\t\thandleCommandSelect,\n\t\t\thandleCommandEnterSelect,\n\t\t\tcheckForCommand,\n\t\t} = useCommandSuggestions({\n\t\t\tonCommand,\n\t\t\tupdatePreferences,\n\t\t\tupdateReasoningText: (enabled: boolean) =>\n\t\t\t\tupdateDefaultsMutation.mutate({\n\t\t\t\t\treasoningText: enabled,\n\t\t\t\t\tscope: 'global',\n\t\t\t\t}),\n\t\t\tvimModeEnabled: preferences.vimMode,\n\t\t\treasoningEnabled: configData?.defaults?.reasoningText ?? true,\n\t\t\ttextareaRef,\n\t\t\tsetMessage,\n\t\t\tsetShowShortcutsModal,\n\t\t\tsessionId,\n\t\t});\n\n\t\tconst { vimMode, setVimMode, handleVimNormalMode } = useVimMode({\n\t\t\tenabled: preferences.vimMode,\n\t\t\tonSend: () => handleSendRef.current(),\n\t\t\ttextareaRef,\n\t\t\tsetMessage,\n\t\t});\n\n\t\tuseEffect(() => {\n\t\t\ttextareaRef.current?.focus();\n\t\t}, []);\n\n\t\tuseEffect(() => {\n\t\t\tif (externalIsPlanMode !== undefined) {\n\t\t\t\tsetIsPlanMode(externalIsPlanMode);\n\t\t\t}\n\t\t}, [externalIsPlanMode]);\n\n\t\tuseImperativeHandle(ref, () => ({\n\t\t\tfocus: () => {\n\t\t\t\ttextareaRef.current?.focus();\n\t\t\t},\n\t\t\tsetValue: (value: string) => {\n\t\t\t\tsetMessage(value);\n\t\t\t\ttextareaRef.current?.focus();\n\t\t\t},\n\t\t}));\n\n\t\tconst adjustTextareaHeight = useCallback(() => {\n\t\t\tconst textarea = textareaRef.current;\n\t\t\tif (!textarea) return;\n\t\t\ttextarea.style.height = 'auto';\n\t\t\ttextarea.style.height = `${textarea.scrollHeight}px`;\n\t\t}, []);\n\n\t\t// biome-ignore lint/correctness/useExhaustiveDependencies: message dependency required for adjusting textarea height on content change\n\t\tuseEffect(() => {\n\t\t\tadjustTextareaHeight();\n\t\t}, [adjustTextareaHeight, message]);\n\n\t\tconst handleMentionClose = useCallback(() => {\n\t\t\tsetShowFileMention(false);\n\t\t\tsetCurrentFileToSelect(undefined);\n\t\t}, [setShowFileMention, setCurrentFileToSelect]);\n\n\t\tconst handleCommandClose = useCallback(() => {\n\t\t\tsetShowCommandSuggestions(false);\n\t\t\tsetCurrentCommandToSelect(undefined);\n\t\t}, [setShowCommandSuggestions, setCurrentCommandToSelect]);\n\n\t\tconst handleMentionSelect = useCallback(\n\t\t\t(filePath: string) => {\n\t\t\t\tselectFile(filePath, textareaRef, setMessage);\n\t\t\t},\n\t\t\t[selectFile],\n\t\t);\n\n\t\tconst handleSend = useCallback(() => {\n\t\t\tif (!message.trim() || disabled) return;\n\n\t\t\tonSend(message);\n\t\t\tsetMessage('');\n\t\t\tsetShowFileMention(false);\n\t\t\tsetShowCommandSuggestions(false);\n\t\t\tsetCurrentFileToSelect(undefined);\n\t\t\tsetCurrentCommandToSelect(undefined);\n\n\t\t\tif (textareaRef.current) {\n\t\t\t\ttextareaRef.current.style.height = 'auto';\n\t\t\t}\n\n\t\t\tif (preferences.vimMode) {\n\t\t\t\tsetVimMode('normal');\n\t\t\t}\n\n\t\t\ttextareaRef.current?.focus();\n\t\t}, [\n\t\t\tmessage,\n\t\t\tdisabled,\n\t\t\tonSend,\n\t\t\tpreferences.vimMode,\n\t\t\tsetShowFileMention,\n\t\t\tsetShowCommandSuggestions,\n\t\t\tsetCurrentFileToSelect,\n\t\t\tsetCurrentCommandToSelect,\n\t\t\tsetVimMode,\n\t\t]);\n\n\t\tuseEffect(() => {\n\t\t\thandleSendRef.current = handleSend;\n\t\t}, [handleSend]);\n\n\t\tconst handleChange = useCallback(\n\t\t\t(e: ChangeEvent<HTMLTextAreaElement>) => {\n\t\t\t\tif (preferences.vimMode && vimMode === 'normal') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst value = e.target.value;\n\t\t\t\tsetMessage(value);\n\n\t\t\t\tcheckForCommand(value);\n\n\t\t\t\tif (value.startsWith('/') && !value.includes(' ')) {\n\t\t\t\t\tsetShowFileMention(false);\n\t\t\t\t\tsetCurrentFileToSelect(undefined);\n\t\t\t\t} else {\n\t\t\t\t\tsetShowCommandSuggestions(false);\n\t\t\t\t\tsetCurrentCommandToSelect(undefined);\n\t\t\t\t\tcheckForMention(value, e.target.selectionStart);\n\t\t\t\t}\n\t\t\t},\n\t\t\t[\n\t\t\t\tpreferences.vimMode,\n\t\t\t\tvimMode,\n\t\t\t\tcheckForCommand,\n\t\t\t\tsetShowFileMention,\n\t\t\t\tsetCurrentFileToSelect,\n\t\t\t\tsetShowCommandSuggestions,\n\t\t\t\tsetCurrentCommandToSelect,\n\t\t\t\tcheckForMention,\n\t\t\t],\n\t\t);\n\n\t\tconst handleKeyDown = useMemo(\n\t\t\t() =>\n\t\t\t\tcreateChatInputKeyHandler({\n\t\t\t\t\tshowFileMention,\n\t\t\t\t\tshowCommandSuggestions,\n\t\t\t\t\tmentionSelectedIndex,\n\t\t\t\t\tcommandSelectedIndex,\n\t\t\t\t\tcurrentFileToSelect,\n\t\t\t\t\tcurrentCommandToSelect,\n\t\t\t\t\tisPlanMode,\n\t\t\t\t\tvimModeEnabled: preferences.vimMode,\n\t\t\t\t\tvimMode,\n\t\t\t\t\tsetMentionSelectedIndex,\n\t\t\t\t\tsetCommandSelectedIndex,\n\t\t\t\t\tsetShowFileMention,\n\t\t\t\t\tsetShowCommandSuggestions,\n\t\t\t\t\tsetIsPlanMode,\n\t\t\t\t\tsetVimMode,\n\t\t\t\t\thandleFileSelect: handleMentionSelect,\n\t\t\t\t\thandleCommandSelect,\n\t\t\t\t\thandleSend,\n\t\t\t\t\thandleVimNormalMode,\n\t\t\t\t\tonPlanModeToggle,\n\t\t\t\t}),\n\t\t\t[\n\t\t\t\tshowFileMention,\n\t\t\t\tshowCommandSuggestions,\n\t\t\t\tmentionSelectedIndex,\n\t\t\t\tcommandSelectedIndex,\n\t\t\t\tcurrentFileToSelect,\n\t\t\t\tcurrentCommandToSelect,\n\t\t\t\tisPlanMode,\n\t\t\t\tpreferences.vimMode,\n\t\t\t\tvimMode,\n\t\t\t\tsetMentionSelectedIndex,\n\t\t\t\tsetCommandSelectedIndex,\n\t\t\t\tsetShowFileMention,\n\t\t\t\tsetShowCommandSuggestions,\n\t\t\t\tsetVimMode,\n\t\t\t\thandleMentionSelect,\n\t\t\t\thandleCommandSelect,\n\t\t\t\thandleSend,\n\t\t\t\thandleVimNormalMode,\n\t\t\t\tonPlanModeToggle,\n\t\t\t],\n\t\t);\n\n\t\tuseEffect(() => {\n\t\t\tif (!preferences.vimMode) {\n\t\t\t\tsetVimMode('insert');\n\t\t\t}\n\t\t}, [preferences.vimMode, setVimMode]);\n\n\t\tconst handleTextareaPaste = useCallback(\n\t\t\t(e: ClipboardEvent<HTMLTextAreaElement>) => {\n\t\t\t\tonPaste?.(e as unknown as ClipboardEvent);\n\t\t\t},\n\t\t\t[onPaste],\n\t\t);\n\n\t\tconst hasImages = images.length > 0;\n\t\tconst hasDocuments = documents.length > 0;\n\t\tconst hasFiles = hasImages || hasDocuments;\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{isDragging &&\n\t\t\t\t\t(() => {\n\t\t\t\t\t\tconst supportsAny = visionEnabled || attachmentEnabled;\n\t\t\t\t\t\tconst fileTypes = [\n\t\t\t\t\t\t\t...(visionEnabled ? ['Images'] : []),\n\t\t\t\t\t\t\t...(attachmentEnabled ? ['PDF'] : []),\n\t\t\t\t\t\t\t'Markdown',\n\t\t\t\t\t\t\t'Text',\n\t\t\t\t\t\t].join(', ');\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div className=\"fixed inset-0 z-50 flex items-center justify-center bg-background/80 backdrop-blur-sm pointer-events-none\">\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName={`flex flex-col items-center gap-4 p-8 rounded-2xl border-2 border-dashed ${supportsAny ? 'bg-card border-primary/50' : 'bg-card border-muted-foreground/30'}`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName={`p-4 rounded-full ${supportsAny ? 'bg-primary/10' : 'bg-muted'}`}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<FileIcon\n\t\t\t\t\t\t\t\t\t\t\tclassName={`w-12 h-12 ${supportsAny ? 'text-primary' : 'text-muted-foreground'}`}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div className=\"text-center\">\n\t\t\t\t\t\t\t\t\t\t<p className=\"text-lg font-medium text-foreground\">\n\t\t\t\t\t\t\t\t\t\t\tDrop files here\n\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t{fileTypes} up to 10MB\n\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t);\n\t\t\t\t\t})()}\n\t\t\t\t<div className=\"absolute bottom-0 left-0 right-0 pt-16 pb-5 md:pb-6 px-2 md:px-4 bg-gradient-to-t from-background via-background to-transparent pointer-events-none z-20 safe-area-inset-bottom\">\n\t\t\t\t\t<div className=\"max-w-3xl mx-auto pointer-events-auto relative\">\n\t\t\t\t\t\t{preferences.vimMode && vimMode === 'normal' && (\n\t\t\t\t\t\t\t<div className=\"absolute -top-6 right-0 px-2 py-0.5 text-xs font-mono font-semibold bg-amber-500/90 text-white rounded shadow-sm\">\n\t\t\t\t\t\t\t\tNORMAL\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{preferences.vimMode && vimMode === 'insert' && (\n\t\t\t\t\t\t\t<div className=\"absolute -top-6 right-0 px-2 py-0.5 text-xs font-mono font-semibold bg-green-500/90 text-white rounded shadow-sm\">\n\t\t\t\t\t\t\t\tINSERT\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={`relative flex flex-col rounded-3xl p-1 transition-all touch-manipulation ${\n\t\t\t\t\t\t\t\tisPlanMode\n\t\t\t\t\t\t\t\t\t? 'bg-slate-100 dark:bg-slate-900/40 border border-slate-300 dark:border-slate-700 focus-within:border-slate-400 dark:focus-within:border-slate-600 focus-within:ring-1 focus-within:ring-slate-300 dark:focus-within:ring-slate-700'\n\t\t\t\t\t\t\t\t\t: 'bg-card border border-border focus-within:border-primary/60 focus-within:ring-1 focus-within:ring-primary/40'\n\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{hasFiles && (\n\t\t\t\t\t\t\t\t<div className=\"flex flex-wrap gap-2 px-3 pt-2 pb-1\">\n\t\t\t\t\t\t\t\t\t{images.map((img) => (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tkey={img.id}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"relative group w-12 h-12 rounded-lg overflow-hidden bg-muted\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\t\tsrc={img.preview}\n\t\t\t\t\t\t\t\t\t\t\t\talt=\"Attachment\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-full h-full object-cover\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => onFileRemove?.(img.id)}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"absolute top-0 right-0 p-0.5 bg-black/60 rounded-bl-md opacity-0 group-hover:opacity-100 transition-opacity\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<X className=\"w-3 h-3 text-white\" />\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t{documents.map((doc) => (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tkey={doc.id}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"relative group flex items-center gap-2 px-3 py-2 rounded-lg bg-muted max-w-[200px]\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{doc.type === 'pdf' ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<FileIcon className=\"w-4 h-4 text-red-500 flex-shrink-0\" />\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t<FileText className=\"w-4 h-4 text-blue-500 flex-shrink-0\" />\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-xs truncate\">{doc.name}</span>\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => onFileRemove?.(doc.id)}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"absolute top-0 right-0 p-0.5 bg-black/60 rounded-bl-md opacity-0 group-hover:opacity-100 transition-opacity\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<X className=\"w-3 h-3 text-white\" />\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{researchContexts.length > 0 && (\n\t\t\t\t\t\t\t\t<div className=\"flex flex-wrap gap-2 px-3 pt-2 pb-1\">\n\t\t\t\t\t\t\t\t\t{researchContexts.map((ctx) => (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tkey={ctx.id}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"relative group flex items-center gap-2 px-3 py-2 rounded-lg bg-teal-500/10 border border-teal-500/30 max-w-[200px]\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<FlaskConical className=\"w-4 h-4 text-teal-500 flex-shrink-0\" />\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-xs truncate text-teal-600 dark:text-teal-400\">\n\t\t\t\t\t\t\t\t\t\t\t\t{ctx.label}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t{onResearchContextRemove && (\n\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => onResearchContextRemove(ctx.id)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"absolute top-0 right-0 p-0.5 bg-black/60 rounded-bl-md opacity-0 group-hover:opacity-100 transition-opacity\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<X className=\"w-3 h-3 text-white\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t<div className=\"flex items-end gap-1\">\n\t\t\t\t\t\t\t\t{onConfigClick && (\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={onConfigClick}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-center w-10 h-10 rounded-full hover:bg-background/50 active:bg-background/70 transition-colors text-muted-foreground hover:text-foreground flex-shrink-0 touch-manipulation\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<MoreVertical className=\"w-4 h-4\" />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<Textarea\n\t\t\t\t\t\t\t\t\tref={textareaRef}\n\t\t\t\t\t\t\t\t\tvalue={message}\n\t\t\t\t\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\t\t\t\tonPaste={handleTextareaPaste}\n\t\t\t\t\t\t\t\t\tplaceholder={\n\t\t\t\t\t\t\t\t\t\tisPlanMode\n\t\t\t\t\t\t\t\t\t\t\t? 'Plan mode - Type a message...'\n\t\t\t\t\t\t\t\t\t\t\t: 'Type a message...'\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\trows={1}\n\t\t\t\t\t\t\t\t\tclassName={`border-0 bg-transparent pl-1 pr-2 py-2 max-h-[200px] overflow-y-auto leading-normal resize-none scrollbar-hide text-base ${\n\t\t\t\t\t\t\t\t\t\tpreferences.vimMode && vimMode === 'normal'\n\t\t\t\t\t\t\t\t\t\t\t? 'caret-[6px]'\n\t\t\t\t\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t\tstyle={{ height: '2.5rem' }}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={handleSend}\n\t\t\t\t\t\t\t\t\tdisabled={disabled || (!message.trim() && !hasFiles)}\n\t\t\t\t\t\t\t\t\tclassName={`flex items-center justify-center w-10 h-10 rounded-full transition-colors flex-shrink-0 touch-manipulation ${\n\t\t\t\t\t\t\t\t\t\tmessage.trim() || hasFiles\n\t\t\t\t\t\t\t\t\t\t\t? 'bg-primary hover:bg-primary/90 active:bg-primary/80 text-primary-foreground'\n\t\t\t\t\t\t\t\t\t\t\t: 'bg-transparent text-muted-foreground'\n\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ArrowUp className=\"w-4 h-4\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{(reasoningEnabled ||\n\t\t\t\t\t\t\tvisionEnabled ||\n\t\t\t\t\t\t\tmodelName ||\n\t\t\t\t\t\t\tproviderName ||\n\t\t\t\t\t\t\tauthType ||\n\t\t\t\t\t\t\tagent) && (\n\t\t\t\t\t\t\t<div className=\"grid grid-cols-[auto_1fr_auto] items-center mt-1 px-3\">\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName=\"justify-self-start flex-shrink-0 relative\"\n\t\t\t\t\t\t\t\t\tref={agentDropdownRef}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{agent && agents.length > 0 && (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => setShowAgentDropdown(!showAgentDropdown)}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-[10px] text-muted-foreground flex items-center gap-1 transition-colors hover:text-foreground cursor-pointer\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"uppercase font-medium\">{agent}</span>\n\t\t\t\t\t\t\t\t\t\t\t<ChevronUp\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={`h-2.5 w-2.5 transition-transform ${showAgentDropdown ? 'rotate-180' : ''}`}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{showAgentDropdown && (\n\t\t\t\t\t\t\t\t\t\t<div className=\"absolute bottom-full left-0 mb-1 min-w-[120px] bg-popover border border-border rounded-md shadow-lg overflow-hidden z-50\">\n\t\t\t\t\t\t\t\t\t\t\t{agents.map((a) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={a}\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonAgentChange?.(a);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetShowAgentDropdown(false);\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={`w-full text-left px-3 py-1.5 text-xs transition-colors hover:bg-accent ${a === agent ? 'text-foreground font-medium bg-accent/50' : 'text-muted-foreground'}`}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{a}\n\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div className=\"justify-self-center\">\n\t\t\t\t\t\t\t\t\t{(providerName || modelName || authType) && (\n\t\t\t\t\t\t\t\t\t\t<div className=\"text-[10px] text-muted-foreground flex items-center gap-1 px-2 py-0.5\">\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={onModelInfoClick}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1 transition-colors hover:text-foreground cursor-pointer\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{providerName && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ProviderLogo\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tprovider={providerName}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize={12}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"opacity-70\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"opacity-40\">/</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t{modelName && <span>{modelName}</span>}\n\t\t\t\t\t\t\t\t\t\t\t\t{authType && authType === 'oauth' && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"opacity-50\">(pro)</span>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t{isSetu && setuStatusLabel && (\n\t\t\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-emerald-600 dark:text-emerald-400\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{setuStatusLabel}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{onRefreshBalance && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonRefreshBalance();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={isBalanceLoading}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"p-0.5 hover:bg-background/50 rounded transition-colors disabled:opacity-50\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<RefreshCw\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={`h-2.5 w-2.5 text-muted-foreground ${isBalanceLoading ? 'animate-spin' : ''}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div className=\"justify-self-end flex-shrink-0 flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t{reasoningEnabled && (\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-[10px] text-indigo-600 dark:text-indigo-300 flex items-center gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t<Brain className=\"h-3 w-3\" />\n\t\t\t\t\t\t\t\t\t\t\tthinking\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{visionEnabled && (\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-[10px] text-emerald-600 dark:text-emerald-400 flex items-center gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t<ImageIcon className=\"h-3 w-3\" />\n\t\t\t\t\t\t\t\t\t\t\timages\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{showFileMention && !filesLoading && (\n\t\t\t\t\t\t\t<FileMentionPopup\n\t\t\t\t\t\t\t\tfiles={files}\n\t\t\t\t\t\t\t\tchangedFiles={changedFiles}\n\t\t\t\t\t\t\t\tquery={mentionQuery}\n\t\t\t\t\t\t\t\tselectedIndex={mentionSelectedIndex}\n\t\t\t\t\t\t\t\tonSelect={handleMentionSelect}\n\t\t\t\t\t\t\t\tonEnterSelect={handleMentionEnterSelect}\n\t\t\t\t\t\t\t\tonClose={handleMentionClose}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{showCommandSuggestions && (\n\t\t\t\t\t\t\t<CommandSuggestionsPopup\n\t\t\t\t\t\t\t\tquery={commandQuery}\n\t\t\t\t\t\t\t\tselectedIndex={commandSelectedIndex}\n\t\t\t\t\t\t\t\tonSelect={handleCommandSelect}\n\t\t\t\t\t\t\t\tonEnterSelect={handleCommandEnterSelect}\n\t\t\t\t\t\t\t\tonClose={handleCommandClose}\n\t\t\t\t\t\t\t\tsessionId={sessionId}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t<ShortcutsModal\n\t\t\t\t\t\t\tisOpen={showShortcutsModal}\n\t\t\t\t\t\t\tonClose={() => setShowShortcutsModal(false)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</>\n\t\t);\n\t}),\n);\n",
19
+ "import { useEffect, useMemo } from 'react';\nimport Fuse from 'fuse.js';\nimport {\n\tFile,\n\tFileCode,\n\tFileJson,\n\tFileText,\n\tImage,\n\tBraces,\n\tFileType,\n\tPlus,\n\tPencil,\n\ttype LucideIcon,\n} from 'lucide-react';\n\ninterface FileMentionPopupProps {\n\tfiles: string[];\n\tchangedFiles?: Array<{\n\t\tpath: string;\n\t\tstatus: string;\n\t}>;\n\tquery: string;\n\tselectedIndex: number;\n\tonSelect: (file: string) => void;\n\tonEnterSelect: (file: string | undefined) => void;\n\tonClose: () => void;\n}\n\nfunction getFileIcon(filePath: string): LucideIcon {\n\tconst ext = filePath.split('.').pop()?.toLowerCase();\n\n\tswitch (ext) {\n\t\tcase 'ts':\n\t\tcase 'tsx':\n\t\tcase 'js':\n\t\tcase 'jsx':\n\t\tcase 'mjs':\n\t\tcase 'cjs':\n\t\tcase 'py':\n\t\tcase 'rb':\n\t\tcase 'go':\n\t\tcase 'rs':\n\t\tcase 'java':\n\t\tcase 'c':\n\t\tcase 'cpp':\n\t\tcase 'h':\n\t\tcase 'hpp':\n\t\t\treturn FileCode;\n\t\tcase 'json':\n\t\tcase 'yaml':\n\t\tcase 'yml':\n\t\tcase 'toml':\n\t\t\treturn FileJson;\n\t\tcase 'md':\n\t\tcase 'txt':\n\t\tcase 'log':\n\t\t\treturn FileText;\n\t\tcase 'png':\n\t\tcase 'jpg':\n\t\tcase 'jpeg':\n\t\tcase 'gif':\n\t\tcase 'svg':\n\t\tcase 'webp':\n\t\t\treturn Image;\n\t\tcase 'css':\n\t\tcase 'scss':\n\t\tcase 'sass':\n\t\tcase 'less':\n\t\t\treturn Braces;\n\t\tcase 'html':\n\t\tcase 'xml':\n\t\t\treturn FileType;\n\t\tdefault:\n\t\t\treturn File;\n\t}\n}\n\nfunction getGitStatusInfo(\n\tfilePath: string,\n\tchangedFilesMap: Map<string, string>,\n) {\n\tconst status = changedFilesMap.get(filePath);\n\tif (!status) {\n\t\treturn null;\n\t}\n\n\tconst icons: Record<\n\t\tstring,\n\t\t{ icon: LucideIcon; label: string; className: string }\n\t> = {\n\t\tadded: { icon: Plus, label: 'Added', className: 'text-green-500' },\n\t\tmodified: { icon: Pencil, label: 'Modified', className: 'text-yellow-500' },\n\t\tuntracked: { icon: Plus, label: 'Untracked', className: 'text-blue-500' },\n\t};\n\n\treturn (\n\t\ticons[status] || {\n\t\t\ticon: Pencil,\n\t\t\tlabel: 'Modified',\n\t\t\tclassName: 'text-yellow-500',\n\t\t}\n\t);\n}\n\nexport function FileMentionPopup({\n\tfiles,\n\tchangedFiles = [],\n\tquery,\n\tselectedIndex,\n\tonSelect,\n\tonEnterSelect,\n\tonClose,\n}: FileMentionPopupProps) {\n\tconst changedFilesMap = useMemo(\n\t\t() => new Map(changedFiles?.map((f) => [f.path, f.status]) || []),\n\t\t[changedFiles],\n\t);\n\n\tconst fuse = useMemo(\n\t\t() =>\n\t\t\tnew Fuse(\n\t\t\t\tfiles.map((f) => ({\n\t\t\t\t\tpath: f,\n\t\t\t\t\tfilename: f.split('/').pop() || f,\n\t\t\t\t\tnormalized: f.replace(/[.\\-_/]/g, ''),\n\t\t\t\t})),\n\t\t\t\t{\n\t\t\t\t\tkeys: [\n\t\t\t\t\t\t{ name: 'filename', weight: 2 },\n\t\t\t\t\t\t{ name: 'normalized', weight: 1.5 },\n\t\t\t\t\t\t{ name: 'path', weight: 1 },\n\t\t\t\t\t],\n\t\t\t\t\tthreshold: 0.3,\n\t\t\t\t\tdistance: 200,\n\t\t\t\t\tignoreLocation: true,\n\t\t\t\t\tincludeScore: true,\n\t\t\t\t},\n\t\t\t),\n\t\t[files],\n\t);\n\n\tconst results = useMemo(() => {\n\t\tif (!query) {\n\t\t\treturn files.slice(0, 20);\n\t\t}\n\t\tconst normalizedQuery = query.replace(/[.\\-_/]/g, '');\n\t\tconst searchResults = fuse.search(normalizedQuery);\n\n\t\tsearchResults.sort((a, b) => {\n\t\t\tconst scoreA = a.score ?? 1;\n\t\t\tconst scoreB = b.score ?? 1;\n\t\t\tconst scoreDiff = Math.abs(scoreA - scoreB);\n\t\t\tif (scoreDiff < 0.05) {\n\t\t\t\tconst aChanged = changedFilesMap.has(a.item.path);\n\t\t\t\tconst bChanged = changedFilesMap.has(b.item.path);\n\t\t\t\tif (aChanged && !bChanged) return -1;\n\t\t\t\tif (!aChanged && bChanged) return 1;\n\t\t\t}\n\t\t\treturn scoreA - scoreB;\n\t\t});\n\n\t\treturn searchResults.slice(0, 20).map((r) => r.item.path);\n\t}, [fuse, query, files, changedFilesMap]);\n\n\tuseEffect(() => {\n\t\tconst element = document.getElementById(`file-item-${selectedIndex}`);\n\t\telement?.scrollIntoView({ block: 'nearest' });\n\t}, [selectedIndex]);\n\n\tuseEffect(() => {\n\t\tonEnterSelect(results[selectedIndex]);\n\t}, [results, selectedIndex, onEnterSelect]);\n\n\tuseEffect(() => {\n\t\tconst handleClickOutside = (e: MouseEvent) => {\n\t\t\tconst target = e.target as HTMLElement;\n\t\t\tif (!target.closest('[data-file-mention-popup]')) {\n\t\t\t\tonClose();\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('mousedown', handleClickOutside);\n\t\treturn () => document.removeEventListener('mousedown', handleClickOutside);\n\t}, [onClose]);\n\n\tif (results.length === 0) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tdata-file-mention-popup\n\t\t\t\tclassName=\"absolute bottom-full left-0 right-0 mb-2 bg-card border border-border rounded-lg shadow-lg z-50 p-3\"\n\t\t\t>\n\t\t\t\t<span className=\"text-muted-foreground text-sm\">No files found</span>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tdata-file-mention-popup\n\t\t\tclassName=\"absolute bottom-full left-0 right-0 mb-2 bg-card border border-border rounded-lg shadow-lg max-h-[300px] overflow-y-auto z-50\"\n\t\t>\n\t\t\t{results.map((filePath, index) => (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tkey={filePath}\n\t\t\t\t\tid={`file-item-${index}`}\n\t\t\t\t\tonMouseDown={(e) => {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tonSelect(filePath);\n\t\t\t\t\t}}\n\t\t\t\t\tclassName={`w-full text-left px-3 py-2 hover:bg-accent ${\n\t\t\t\t\t\tindex === selectedIndex ? 'bg-accent' : ''\n\t\t\t\t\t}`}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"flex items-center gap-2 w-full\">\n\t\t\t\t\t\t{(() => {\n\t\t\t\t\t\t\tconst Icon = getFileIcon(filePath);\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Icon className=\"w-4 h-4 flex-shrink-0 text-muted-foreground\" />\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})()}\n\t\t\t\t\t\t<span className=\"font-mono text-sm flex-1 truncate\">\n\t\t\t\t\t\t\t{filePath}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{(() => {\n\t\t\t\t\t\t\tconst status = getGitStatusInfo(filePath, changedFilesMap);\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\tstatus && (\n\t\t\t\t\t\t\t\t\t<span title={status.label}>\n\t\t\t\t\t\t\t\t\t\t<status.icon\n\t\t\t\t\t\t\t\t\t\t\tclassName={`w-3.5 h-3.5 flex-shrink-0 ${status.className}`}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})()}\n\t\t\t\t\t</div>\n\t\t\t\t</button>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n",
20
+ "import { useEffect, useMemo } from 'react';\nimport { useConfig } from '../../hooks/useConfig';\nimport { usePreferences } from '../../hooks/usePreferences';\nimport { useShareStatus } from '../../hooks/useShareStatus';\nimport { filterCommands, getCommandDescription } from '../../lib/commands';\n\ninterface CommandSuggestionsPopupProps {\n\tquery: string;\n\tselectedIndex: number;\n\tonSelect: (commandId: string) => void;\n\tonEnterSelect: (commandId: string | undefined) => void;\n\tonClose: () => void;\n\tsessionId?: string;\n}\n\nexport function CommandSuggestionsPopup({\n\tquery,\n\tselectedIndex,\n\tonSelect,\n\tonEnterSelect,\n\tonClose,\n\tsessionId,\n}: CommandSuggestionsPopupProps) {\n\tconst { preferences } = usePreferences();\n\tconst { data: config } = useConfig();\n\tconst { data: shareStatus } = useShareStatus(sessionId);\n\n\tconst state = useMemo(\n\t\t() => ({\n\t\t\tvimModeEnabled: preferences.vimMode,\n\t\t\treasoningEnabled: config?.defaults?.reasoningText ?? true,\n\t\t\tisShared: shareStatus?.shared,\n\t\t}),\n\t\t[preferences.vimMode, config?.defaults?.reasoningText, shareStatus?.shared],\n\t);\n\n\tconst results = useMemo(() => filterCommands(query, state), [query, state]);\n\n\tuseEffect(() => {\n\t\tconst element = document.getElementById(`command-item-${selectedIndex}`);\n\t\telement?.scrollIntoView({ block: 'nearest' });\n\t}, [selectedIndex]);\n\n\tuseEffect(() => {\n\t\tonEnterSelect(results[selectedIndex]?.id);\n\t}, [results, selectedIndex, onEnterSelect]);\n\n\tuseEffect(() => {\n\t\tconst handleClickOutside = (e: MouseEvent) => {\n\t\t\tconst target = e.target as HTMLElement;\n\t\t\tif (!target.closest('[data-command-popup]')) {\n\t\t\t\tonClose();\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('mousedown', handleClickOutside);\n\t\treturn () => document.removeEventListener('mousedown', handleClickOutside);\n\t}, [onClose]);\n\n\tif (results.length === 0) {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tdata-command-popup\n\t\t\t\tclassName=\"absolute bottom-full left-0 right-0 mb-2 bg-card border border-border rounded-lg shadow-lg z-50 p-3\"\n\t\t\t>\n\t\t\t\t<span className=\"text-muted-foreground text-sm\">No commands found</span>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tdata-command-popup\n\t\t\tclassName=\"absolute bottom-full left-0 right-0 mb-2 bg-card border border-border rounded-lg shadow-lg max-h-[300px] overflow-y-auto z-50\"\n\t\t>\n\t\t\t{results.map((command, index) => {\n\t\t\t\tconst Icon = command.icon;\n\t\t\t\treturn (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tkey={command.id}\n\t\t\t\t\t\tid={`command-item-${index}`}\n\t\t\t\t\t\tonMouseDown={(e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tonSelect(command.id);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName={`w-full text-left px-3 py-2 hover:bg-accent ${\n\t\t\t\t\t\t\tindex === selectedIndex ? 'bg-accent' : ''\n\t\t\t\t\t\t}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"flex items-center gap-3 w-full\">\n\t\t\t\t\t\t\t<Icon className=\"w-4 h-4 flex-shrink-0 text-primary\" />\n\t\t\t\t\t\t\t<div className=\"flex-1 min-w-0\">\n\t\t\t\t\t\t\t\t<div className=\"font-mono text-sm font-medium text-foreground\">\n\t\t\t\t\t\t\t\t\t{command.label}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div className=\"text-xs text-muted-foreground truncate\">\n\t\t\t\t\t\t\t\t\t{getCommandDescription(command, state)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</button>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n",
21
+ "import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiClient } from '../lib/api-client';\n\nexport function useConfig() {\n\treturn useQuery({\n\t\tqueryKey: ['config'],\n\t\tqueryFn: () => apiClient.getConfig(),\n\t\tstaleTime: 30000,\n\t});\n}\n\nexport function useModels(provider?: string) {\n\treturn useQuery({\n\t\tqueryKey: ['models', provider],\n\t\tqueryFn: () => (provider ? apiClient.getModels(provider) : null),\n\t\tenabled: !!provider,\n\t});\n}\n\nexport function useAllModels() {\n\treturn useQuery({\n\t\tqueryKey: ['models', 'all'],\n\t\tqueryFn: () => apiClient.getAllModels(),\n\t});\n}\n\nexport function useUpdateDefaults() {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: (data: {\n\t\t\tagent?: string;\n\t\t\tprovider?: string;\n\t\t\tmodel?: string;\n\t\t\ttoolApproval?: 'auto' | 'dangerous' | 'all';\n\t\t\tguidedMode?: boolean;\n\t\t\treasoningText?: boolean;\n\t\t\tscope?: 'global' | 'local';\n\t\t}) => apiClient.updateDefaults(data),\n\t\tonSuccess: () => {\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['config'] });\n\t\t},\n\t});\n}\n",
22
+ "import {\n\tcreateSession as apiCreateSession,\n\tlistSessions as apiListSessions,\n\tlistMessages as apiListMessages,\n\tcreateMessage as apiCreateMessage,\n\tabortSession as apiAbortSession,\n\tdeleteSession as apiDeleteSession,\n\tupdateSession as apiUpdateSession,\n\tgetSessionQueue as apiGetSessionQueue,\n\tremoveFromQueue as apiRemoveFromQueue,\n\tretryMessage as apiRetryMessage,\n\ttype Session as ApiSession,\n\ttype CreateSessionData,\n\ttype CreateMessageData,\n} from '@ottocode/api';\nimport type {\n\tSession,\n\tMessage,\n\tCreateSessionRequest,\n\tSendMessageRequest,\n\tSendMessageResponse,\n\tUpdateSessionRequest,\n\tSessionsPage,\n} from '../../types/api';\nimport {\n\textractErrorMessage,\n\tconvertSession,\n\tconvertMessage,\n\tgetBaseUrl,\n} from './utils';\n\nexport const sessionsMixin = {\n\tasync getSessions(): Promise<Session[]> {\n\t\tconst page = await this.getSessionsPage({ limit: 200 });\n\t\treturn page.items;\n\t},\n\n\tasync getSessionsPage(\n\t\tparams: { limit?: number; offset?: number } = {},\n\t): Promise<SessionsPage> {\n\t\tconst { limit = 50, offset = 0 } = params;\n\t\tconst response = await apiListSessions({\n\t\t\tquery: { limit, offset },\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\tconst data = response.data;\n\t\treturn {\n\t\t\titems: (data?.items ?? []).map((s) => convertSession(s as ApiSession)),\n\t\t\thasMore: data?.hasMore ?? false,\n\t\t\tnextOffset: data?.nextOffset ?? null,\n\t\t};\n\t},\n\n\tasync createSession(data: CreateSessionRequest): Promise<Session> {\n\t\tconst response = await apiCreateSession({\n\t\t\tbody: data as CreateSessionData['body'],\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\tif (!response.data) throw new Error('No data returned from create session');\n\t\treturn convertSession(response.data);\n\t},\n\n\tasync updateSession(\n\t\tsessionId: string,\n\t\tdata: UpdateSessionRequest,\n\t): Promise<Session> {\n\t\tconst response = await apiUpdateSession({\n\t\t\tpath: { sessionId },\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: API type mismatch\n\t\t\tbody: data as any,\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\treturn convertSession(response.data as ApiSession);\n\t},\n\n\tasync deleteSession(sessionId: string): Promise<{ success: boolean }> {\n\t\tconst response = await apiDeleteSession({ path: { sessionId } });\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\treturn response.data as { success: boolean };\n\t},\n\n\tasync abortSession(sessionId: string): Promise<{ success: boolean }> {\n\t\tconst response = await apiAbortSession({ path: { sessionId } });\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\treturn response.data as { success: boolean };\n\t},\n\n\tasync abortMessage(\n\t\tsessionId: string,\n\t\t_messageId: string,\n\t): Promise<{ success: boolean; wasRunning: boolean; messageId: string }> {\n\t\tconst response = await apiAbortSession({\n\t\t\tpath: { sessionId },\n\t\t});\n\t\tif (response.error) throw new Error('Failed to abort message');\n\t\treturn response.data as {\n\t\t\tsuccess: boolean;\n\t\t\twasRunning: boolean;\n\t\t\tmessageId: string;\n\t\t};\n\t},\n\n\tasync getQueueState(sessionId: string): Promise<{\n\t\tcurrentMessageId: string | null;\n\t\tqueuedMessages: Array<{ messageId: string; position: number }>;\n\t\tisRunning: boolean;\n\t}> {\n\t\tconst response = await apiGetSessionQueue({ path: { sessionId } });\n\t\tif (response.error) throw new Error('Failed to get queue state');\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tasync removeFromQueue(\n\t\tsessionId: string,\n\t\tmessageId: string,\n\t): Promise<{\n\t\tsuccess: boolean;\n\t\tremoved: boolean;\n\t\twasQueued?: boolean;\n\t\twasRunning?: boolean;\n\t}> {\n\t\tconst response = await apiRemoveFromQueue({\n\t\t\tpath: { sessionId, messageId },\n\t\t});\n\t\tif (response.error) throw new Error('Failed to remove from queue');\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tasync getMessages(sessionId: string): Promise<Message[]> {\n\t\tconst response = await apiListMessages({ path: { id: sessionId } });\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\treturn (response.data || []).map(convertMessage);\n\t},\n\n\tasync sendMessage(\n\t\tsessionId: string,\n\t\tdata: SendMessageRequest,\n\t): Promise<SendMessageResponse> {\n\t\tconst response = await apiCreateMessage({\n\t\t\tpath: { id: sessionId },\n\t\t\tbody: data as CreateMessageData['body'],\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\treturn response.data as SendMessageResponse;\n\t},\n\n\tgetStreamUrl(sessionId: string): string {\n\t\treturn `${getBaseUrl()}/v1/sessions/${sessionId}/stream`;\n\t},\n\n\tasync retryMessage(\n\t\tsessionId: string,\n\t\tmessageId: string,\n\t): Promise<{ success: boolean; messageId: string }> {\n\t\tconst response = await apiRetryMessage({\n\t\t\tpath: { sessionId, messageId },\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n};\n",
23
+ "import { client } from '@ottocode/api';\nimport type {\n\tSession as ApiSession,\n\tMessage as ApiMessage,\n} from '@ottocode/api';\nimport { API_BASE_URL } from '../config';\nimport type { Session, Message } from '../../types/api';\n\ninterface WindowWithAgiServerUrl extends Window {\n\tOTTO_SERVER_URL?: string;\n}\n\nfunction getClientAdapter(): 'fetch' | undefined {\n\tif (typeof window !== 'undefined' && typeof window.fetch === 'function') {\n\t\treturn 'fetch';\n\t}\n\treturn undefined;\n}\n\nexport function extractErrorMessage(error: unknown): string {\n\tif (!error) return 'Unknown error';\n\tif (typeof error === 'string') return error;\n\tif (error && typeof error === 'object') {\n\t\tconst errObj = error as Record<string, unknown>;\n\t\tif (errObj.error && typeof errObj.error === 'object') {\n\t\t\tconst innerError = errObj.error as Record<string, unknown>;\n\t\t\tif (typeof innerError.message === 'string') return innerError.message;\n\t\t}\n\t\tif (typeof errObj.error === 'string') return errObj.error;\n\t\tif (typeof errObj.message === 'string') return errObj.message;\n\t\ttry {\n\t\t\treturn JSON.stringify(error);\n\t\t} catch {\n\t\t\treturn 'Error occurred (unable to parse)';\n\t\t}\n\t}\n\treturn 'Unknown error';\n}\n\nexport function configureApiClient() {\n\tconst win = window as WindowWithAgiServerUrl;\n\tconst baseURL = win.OTTO_SERVER_URL || API_BASE_URL;\n\tclient.setConfig({\n\t\tbaseURL,\n\t\tadapter: getClientAdapter(),\n\t});\n}\n\nconfigureApiClient();\n\nexport function getBaseUrl(): string {\n\tconst win = window as WindowWithAgiServerUrl;\n\tif (win.OTTO_SERVER_URL) return win.OTTO_SERVER_URL;\n\treturn API_BASE_URL;\n}\n\nexport function convertSession(apiSession: ApiSession): Session {\n\treturn {\n\t\t...apiSession,\n\t\ttitle: apiSession.title ?? null,\n\t\tcreatedAt:\n\t\t\ttypeof apiSession.createdAt === 'string'\n\t\t\t\t? new Date(apiSession.createdAt).getTime()\n\t\t\t\t: apiSession.createdAt,\n\t\tlastActiveAt:\n\t\t\ttypeof apiSession.lastActiveAt === 'string'\n\t\t\t\t? new Date(apiSession.lastActiveAt).getTime()\n\t\t\t\t: apiSession.lastActiveAt,\n\t} as Session;\n}\n\nexport function convertMessage(apiMessage: ApiMessage): Message {\n\treturn {\n\t\t...apiMessage,\n\t\tcreatedAt:\n\t\t\ttypeof apiMessage.createdAt === 'string'\n\t\t\t\t? new Date(apiMessage.createdAt).getTime()\n\t\t\t\t: apiMessage.createdAt,\n\t\tcompletedAt: apiMessage.completedAt\n\t\t\t? typeof apiMessage.completedAt === 'string'\n\t\t\t\t? new Date(apiMessage.completedAt).getTime()\n\t\t\t\t: apiMessage.completedAt\n\t\t\t: null,\n\t} as Message;\n}\n",
24
+ "// Extend Window interface to include custom properties\ninterface OttoWindow extends Window {\n\t__OTTO_API_URL__?: string;\n\tOTTO_SERVER_URL?: string;\n}\n\n// This function will execute at runtime in the browser\nfunction computeApiBaseUrl(): string {\n\t// Check Vite env var first (for dev mode)\n\tconst envUrl = import.meta.env?.VITE_API_BASE_URL;\n\tif (envUrl) {\n\t\treturn envUrl;\n\t}\n\n\t// Check window object for injected values (for production)\n\tif (typeof window !== 'undefined') {\n\t\tconst win = window as OttoWindow;\n\t\tif (win.OTTO_SERVER_URL) {\n\t\t\treturn win.OTTO_SERVER_URL;\n\t\t}\n\t\tif (win.__OTTO_API_URL__) {\n\t\t\treturn win.__OTTO_API_URL__;\n\t\t}\n\t}\n\n\t// Fallback for standalone dev\n\treturn 'http://localhost:9100';\n}\n\nexport function getRuntimeApiBaseUrl(): string {\n\treturn computeApiBaseUrl();\n}\n\nexport const API_BASE_URL = computeApiBaseUrl();\n\nexport const config = {\n\tapiBaseUrl: API_BASE_URL,\n};\n",
25
+ "import {\n\tgetGitStatus as apiGetGitStatus,\n\tgetGitDiff as apiGetGitDiff,\n\tgetGitBranch as apiGetGitBranch,\n\tstageFiles as apiStageFiles,\n\tunstageFiles as apiUnstageFiles,\n\trestoreFiles as apiRestoreFiles,\n\tdeleteFiles as apiDeleteFiles,\n\tcommitChanges as apiCommitChanges,\n\tgenerateCommitMessage as apiGenerateCommitMessage,\n\tpushCommits as apiPushCommits,\n\tpullChanges as apiPullChanges,\n\tinitGitRepo as apiInitGitRepo,\n\tgetGitRemotes as apiGetGitRemotes,\n\taddGitRemote as apiAddGitRemote,\n\tremoveGitRemote as apiRemoveGitRemote,\n} from '@ottocode/api';\nimport type {\n\tGitStatusResponse,\n\tGitDiffResponse,\n\tGitStageResponse,\n\tGitUnstageResponse,\n\tGitCommitResponse,\n\tGitGenerateCommitMessageResponse,\n\tGitBranchInfo,\n\tGitPushResponse,\n\tGitPullResponse,\n\tGitRemoteInfo,\n} from '../../types/api';\nimport { extractErrorMessage } from './utils';\n\nexport const gitMixin = {\n\tasync initGitRepo(): Promise<{ initialized: boolean; path: string }> {\n\t\tconst response = await apiInitGitRepo();\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn (response.data as any)?.data;\n\t},\n\n\tasync getGitStatus(): Promise<GitStatusResponse> {\n\t\tconst response = await apiGetGitStatus();\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn (response.data as any)?.data as GitStatusResponse;\n\t},\n\n\tasync getGitDiff(\n\t\tfile: string,\n\t\tstaged: boolean = false,\n\t): Promise<GitDiffResponse> {\n\t\tconst response = await apiGetGitDiff({\n\t\t\tquery: { file, staged: staged ? 'true' : 'false' },\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn (response.data as any)?.data as GitDiffResponse;\n\t},\n\n\tasync getGitDiffFullFile(\n\t\tfile: string,\n\t\tstaged = false,\n\t): Promise<GitDiffResponse> {\n\t\tconst response = await apiGetGitDiff({\n\t\t\tquery: {\n\t\t\t\tfile,\n\t\t\t\tstaged: staged ? 'true' : 'false',\n\t\t\t\tfullFile: 'true',\n\t\t\t},\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn (response.data as any)?.data as GitDiffResponse;\n\t},\n\n\tasync generateCommitMessage(\n\t\tsessionId?: string,\n\t): Promise<GitGenerateCommitMessageResponse> {\n\t\tconst response = await apiGenerateCommitMessage({\n\t\t\tbody: sessionId ? { sessionId } : {},\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn (response.data as any)?.data as GitGenerateCommitMessageResponse;\n\t},\n\n\tasync stageFiles(files: string[]): Promise<GitStageResponse> {\n\t\tconst response = await apiStageFiles({\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: API type mismatch\n\t\t\tbody: { files } as any,\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn (response.data as any)?.data as GitStageResponse;\n\t},\n\n\tasync unstageFiles(files: string[]): Promise<GitUnstageResponse> {\n\t\tconst response = await apiUnstageFiles({\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: API type mismatch\n\t\t\tbody: { files } as any,\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn (response.data as any)?.data as GitUnstageResponse;\n\t},\n\n\tasync restoreFiles(files: string[]): Promise<{ restored: string[] }> {\n\t\tconst response = await apiRestoreFiles({\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: API type mismatch\n\t\t\tbody: { files } as any,\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn (response.data as any)?.data as { restored: string[] };\n\t},\n\n\tasync deleteFiles(files: string[]): Promise<{ deleted: string[] }> {\n\t\tconst response = await apiDeleteFiles({\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: API type mismatch\n\t\t\tbody: { files } as any,\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn (response.data as any)?.data as { deleted: string[] };\n\t},\n\n\tasync commitChanges(message: string): Promise<GitCommitResponse> {\n\t\tconst response = await apiCommitChanges({\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: API type mismatch\n\t\t\tbody: { message } as any,\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn (response.data as any)?.data as GitCommitResponse;\n\t},\n\n\tasync getGitBranch(): Promise<GitBranchInfo> {\n\t\tconst response = await apiGetGitBranch();\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn (response.data as any)?.data as GitBranchInfo;\n\t},\n\n\tasync pushCommits(): Promise<GitPushResponse> {\n\t\tconst response = await apiPushCommits({\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: API type mismatch\n\t\t\tbody: {} as any,\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn (response.data as any)?.data as GitPushResponse;\n\t},\n\n\tasync pullChanges(): Promise<GitPullResponse> {\n\t\tconst response = await apiPullChanges({\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: API type mismatch\n\t\t\tbody: {} as any,\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn (response.data as any)?.data as GitPullResponse;\n\t},\n\n\tasync getRemotes(): Promise<GitRemoteInfo[]> {\n\t\tconst response = await apiGetGitRemotes();\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn (response.data as any)?.data?.remotes as GitRemoteInfo[];\n\t},\n\n\tasync addRemote(\n\t\tname: string,\n\t\turl: string,\n\t): Promise<{ name: string; url: string }> {\n\t\tconst response = await apiAddGitRemote({\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: API type mismatch\n\t\t\tbody: { name, url } as any,\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn (response.data as any)?.data as { name: string; url: string };\n\t},\n\n\tasync removeRemote(name: string): Promise<{ removed: string }> {\n\t\tconst response = await apiRemoveGitRemote({\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: API type mismatch\n\t\t\tbody: { name } as any,\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn (response.data as any)?.data as { removed: string };\n\t},\n};\n",
26
+ "import {\n\tgetConfig as apiGetConfig,\n\tgetProviderModels as apiGetProviderModels,\n\tgetAllModels as apiGetAllModels,\n\tupdateDefaults as apiUpdateDefaults,\n} from '@ottocode/api';\nimport type { AllModelsResponse } from '../../types/api';\nimport { extractErrorMessage } from './utils';\n\nexport const configMixin = {\n\tasync getConfig(): Promise<{\n\t\tagents: string[];\n\t\tproviders: string[];\n\t\tdefaults: {\n\t\t\tagent: string;\n\t\t\tprovider: string;\n\t\t\tmodel: string;\n\t\t\ttoolApproval?: 'auto' | 'dangerous' | 'all';\n\t\t\tguidedMode?: boolean;\n\t\t\treasoningText?: boolean;\n\t\t};\n\t}> {\n\t\tconst response = await apiGetConfig();\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tasync getModels(providerId: string): Promise<{\n\t\tmodels: Array<{\n\t\t\tid: string;\n\t\t\tlabel: string;\n\t\t\ttoolCall?: boolean;\n\t\t\tavailable?: boolean;\n\t\t\tunavailableReason?: string;\n\t\t}>;\n\t\tdefault: string;\n\t}> {\n\t\tconst response = await apiGetProviderModels({\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: API type mismatch\n\t\t\tpath: { provider: providerId as any },\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tasync getAllModels(): Promise<AllModelsResponse> {\n\t\tconst response = await apiGetAllModels();\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\treturn response.data as AllModelsResponse;\n\t},\n\n\tasync updateDefaults(data: {\n\t\tagent?: string;\n\t\tprovider?: string;\n\t\tmodel?: string;\n\t\ttoolApproval?: 'auto' | 'dangerous' | 'all';\n\t\tguidedMode?: boolean;\n\t\treasoningText?: boolean;\n\t\tscope?: 'global' | 'local';\n\t}): Promise<{\n\t\tsuccess: boolean;\n\t\tdefaults: {\n\t\t\tagent: string;\n\t\t\tprovider: string;\n\t\t\tmodel: string;\n\t\t\ttoolApproval?: 'auto' | 'dangerous' | 'all';\n\t\t\tguidedMode?: boolean;\n\t\t\treasoningText?: boolean;\n\t\t};\n\t}> {\n\t\tconst response = await apiUpdateDefaults({\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: API type mismatch\n\t\t\tbody: data as any,\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n};\n",
27
+ "import {\n\tlistFiles as apiListFiles,\n\tgetFileTree as apiGetFileTree,\n\treadFile as apiReadFile,\n\tgetSessionFiles as apiGetSessionFiles,\n} from '@ottocode/api';\nimport type { SessionFilesResponse } from '../../types/api';\nimport { extractErrorMessage } from './utils';\n\nexport const filesMixin = {\n\tasync listFiles() {\n\t\tconst response = await apiListFiles();\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\treturn response.data as {\n\t\t\tfiles: string[];\n\t\t\tignoredFiles?: string[];\n\t\t\tchangedFiles: Array<{ path: string; status: string }>;\n\t\t\ttruncated: boolean;\n\t\t};\n\t},\n\n\tasync getFileTree(dirPath = '.'): Promise<{\n\t\titems: Array<{\n\t\t\tname: string;\n\t\t\tpath: string;\n\t\t\ttype: 'file' | 'directory';\n\t\t\tgitignored?: boolean;\n\t\t}>;\n\t\tpath: string;\n\t}> {\n\t\tconst response = await apiGetFileTree({\n\t\t\tquery: { path: dirPath },\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tasync readFileContent(filePath: string): Promise<{\n\t\tcontent: string;\n\t\tpath: string;\n\t\textension: string;\n\t\tlineCount: number;\n\t}> {\n\t\tconst response = await apiReadFile({\n\t\t\tquery: { path: filePath },\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tasync getSessionFiles(sessionId: string): Promise<SessionFilesResponse> {\n\t\tconst response = await apiGetSessionFiles({ path: { sessionId } });\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\treturn response.data as SessionFilesResponse;\n\t},\n};\n",
28
+ "import {\n\tcreateBranch as apiCreateBranch,\n\tlistBranches as apiListBranches,\n\tgetParentSession as apiGetParentSession,\n\tgetShareStatus as apiGetShareStatus,\n\tshareSession as apiShareSession,\n\tsyncShare as apiSyncShare,\n} from '@ottocode/api';\nimport type {\n\tCreateBranchRequest,\n\tBranchResult,\n\tListBranchesResponse,\n\tParentSessionResponse,\n\tShareStatus,\n\tShareSessionResponse,\n\tSyncSessionResponse,\n} from '../../types/api';\nimport { extractErrorMessage } from './utils';\n\nexport const branchesMixin = {\n\tasync createBranch(\n\t\tsessionId: string,\n\t\tdata: CreateBranchRequest,\n\t): Promise<BranchResult> {\n\t\tconst response = await apiCreateBranch({\n\t\t\tpath: { sessionId },\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: API type mismatch\n\t\t\tbody: data as any,\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\treturn response.data as unknown as BranchResult;\n\t},\n\n\tasync listBranches(sessionId: string): Promise<ListBranchesResponse> {\n\t\tconst response = await apiListBranches({ path: { sessionId } });\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\treturn response.data as unknown as ListBranchesResponse;\n\t},\n\n\tasync getParentSession(sessionId: string): Promise<ParentSessionResponse> {\n\t\tconst response = await apiGetParentSession({ path: { sessionId } });\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\treturn response.data as ParentSessionResponse;\n\t},\n\n\tasync getShareStatus(sessionId: string): Promise<ShareStatus> {\n\t\tconst response = await apiGetShareStatus({ path: { sessionId } });\n\t\tif (response.error) return { shared: false };\n\t\treturn response.data as ShareStatus;\n\t},\n\n\tasync shareSession(sessionId: string): Promise<ShareSessionResponse> {\n\t\tconst response = await apiShareSession({ path: { sessionId } });\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\treturn response.data as ShareSessionResponse;\n\t},\n\n\tasync syncSession(sessionId: string): Promise<SyncSessionResponse> {\n\t\tconst response = await apiSyncShare({ path: { sessionId } });\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\treturn response.data as SyncSessionResponse;\n\t},\n};\n",
29
+ "import {\n\tresolveApproval as apiResolveApproval,\n\tgetPendingApprovals as apiGetPendingApprovals,\n} from '@ottocode/api';\n\nexport const approvalMixin = {\n\tasync approveToolCall(\n\t\tsessionId: string,\n\t\tcallId: string,\n\t\tapproved: boolean,\n\t): Promise<{ ok: boolean; callId: string; approved: boolean }> {\n\t\tconst response = await apiResolveApproval({\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: API path type mismatch\n\t\t\tpath: { id: sessionId } as any,\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: API type mismatch\n\t\t\tbody: { callId, approved, sessionId } as any,\n\t\t});\n\t\tif (response.error) throw new Error('Failed to send tool approval');\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tasync getPendingApprovals(sessionId: string): Promise<{\n\t\tok: boolean;\n\t\tpending: Array<{\n\t\t\tcallId: string;\n\t\t\ttoolName: string;\n\t\t\targs: unknown;\n\t\t\tmessageId: string;\n\t\t\tcreatedAt: number;\n\t\t}>;\n\t}> {\n\t\tconst response = await apiGetPendingApprovals({\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: API path type mismatch\n\t\t\tpath: { id: sessionId } as any,\n\t\t});\n\t\tif (response.error) return { ok: false, pending: [] };\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n};\n",
30
+ "import {\n\tgetSetuBalance as apiGetSetuBalance,\n\tgetSetuWallet as apiGetSetuWallet,\n\tgetSetuUsdcBalance as apiGetSetuUsdcBalance,\n\tcreatePolarCheckout as apiCreatePolarCheckout,\n\tgetPolarTopupEstimate as apiGetPolarTopupEstimate,\n\tgetPolarTopupStatus as apiGetPolarTopupStatus,\n\tgetRazorpayTopupEstimate as apiGetRazorpayTopupEstimate,\n\tcreateRazorpayOrder as apiCreateRazorpayOrder,\n\tverifyRazorpayPayment as apiVerifyRazorpayPayment,\n\tselectTopupMethod as apiSelectTopupMethod,\n\tcancelTopup as apiCancelTopup,\n\tgetPendingTopup as apiGetPendingTopup,\n} from '@ottocode/api';\nimport { extractErrorMessage } from './utils';\n\nexport const setuMixin = {\n\tasync getSetuBalance(): Promise<{\n\t\twalletAddress: string;\n\t\tbalance: number;\n\t\ttotalSpent: number;\n\t\ttotalTopups: number;\n\t\trequestCount: number;\n\t\tscope?: 'wallet' | 'account';\n\t\tpayg?: {\n\t\t\twalletBalanceUsd: number;\n\t\t\taccountBalanceUsd: number;\n\t\t\trawPoolUsd: number;\n\t\t\teffectiveSpendableUsd: number;\n\t\t};\n\t\tlimits?: {\n\t\t\tenabled: boolean;\n\t\t\tdailyLimitUsd: number | null;\n\t\t\tdailySpentUsd: number;\n\t\t\tdailyRemainingUsd: number | null;\n\t\t\tmonthlyLimitUsd: number | null;\n\t\t\tmonthlySpentUsd: number;\n\t\t\tmonthlyRemainingUsd: number | null;\n\t\t\tcapRemainingUsd: number | null;\n\t\t} | null;\n\t\tsubscription?: {\n\t\t\tactive: boolean;\n\t\t\ttierId?: string;\n\t\t\ttierName?: string;\n\t\t\tcreditsIncluded?: number;\n\t\t\tcreditsUsed?: number;\n\t\t\tcreditsRemaining?: number;\n\t\t\tperiodStart?: string;\n\t\t\tperiodEnd?: string;\n\t\t} | null;\n\t} | null> {\n\t\ttry {\n\t\t\tconst response = await apiGetSetuBalance();\n\t\t\tif (response.error) return null;\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\t\treturn response.data as any;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t},\n\n\tasync getSetuWallet(): Promise<{\n\t\tconfigured: boolean;\n\t\tpublicKey?: string;\n\t\terror?: string;\n\t}> {\n\t\ttry {\n\t\t\tconst response = await apiGetSetuWallet();\n\t\t\tif (response.error) return { configured: false };\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\t\treturn response.data as any;\n\t\t} catch {\n\t\t\treturn { configured: false };\n\t\t}\n\t},\n\n\tasync getSetuUsdcBalance(network: 'mainnet' | 'devnet' = 'mainnet'): Promise<{\n\t\twalletAddress: string;\n\t\tusdcBalance: number;\n\t\tnetwork: 'mainnet' | 'devnet';\n\t} | null> {\n\t\ttry {\n\t\t\tconst response = await apiGetSetuUsdcBalance({\n\t\t\t\tquery: { network },\n\t\t\t});\n\t\t\tif (response.error) return null;\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\t\treturn response.data as any;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t},\n\n\tasync getPolarTopupEstimate(amount: number): Promise<{\n\t\tcreditAmount: number;\n\t\tchargeAmount: number;\n\t\tfeeAmount: number;\n\t\tfeeBreakdown: {\n\t\t\tbasePercent: number;\n\t\t\tinternationalPercent: number;\n\t\t\tfixedCents: number;\n\t\t};\n\t} | null> {\n\t\ttry {\n\t\t\tconst response = await apiGetPolarTopupEstimate({\n\t\t\t\tquery: { amount },\n\t\t\t});\n\t\t\tif (response.error) return null;\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\t\treturn response.data as any;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t},\n\n\tasync createPolarCheckout(\n\t\tamount: number,\n\t\tsuccessUrl: string,\n\t): Promise<{\n\t\tsuccess: boolean;\n\t\tcheckoutId: string;\n\t\tcheckoutUrl: string;\n\t\tcreditAmount: number;\n\t\tchargeAmount: number;\n\t\tfeeAmount: number;\n\t}> {\n\t\tconst response = await apiCreatePolarCheckout({\n\t\t\tbody: { amount, successUrl },\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tasync selectTopupMethod(\n\t\tsessionId: string,\n\t\tmethod: 'crypto' | 'fiat',\n\t): Promise<{ success: boolean; method: string }> {\n\t\tconst response = await apiSelectTopupMethod({\n\t\t\tbody: { sessionId, method },\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tasync cancelTopup(\n\t\tsessionId: string,\n\t\treason?: string,\n\t): Promise<{ success: boolean }> {\n\t\tconst response = await apiCancelTopup({\n\t\t\tbody: { sessionId, reason },\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tasync getPendingTopup(sessionId: string): Promise<{\n\t\thasPending: boolean;\n\t\tsessionId?: string;\n\t\tmessageId?: string;\n\t\tamountUsd?: number;\n\t\tcurrentBalance?: number;\n\t\tcreatedAt?: number;\n\t}> {\n\t\ttry {\n\t\t\tconst response = await apiGetPendingTopup({\n\t\t\t\tquery: { sessionId },\n\t\t\t});\n\t\t\tif (response.error) return { hasPending: false };\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\t\treturn response.data as any;\n\t\t} catch {\n\t\t\treturn { hasPending: false };\n\t\t}\n\t},\n\n\tasync getPolarTopupStatus(checkoutId: string): Promise<{\n\t\tcheckoutId: string;\n\t\tconfirmed: boolean;\n\t\tamountUsd: number | null;\n\t\tconfirmedAt: string | null;\n\t} | null> {\n\t\ttry {\n\t\t\tconst response = await apiGetPolarTopupStatus({\n\t\t\t\tquery: { checkoutId },\n\t\t\t});\n\t\t\tif (response.error) return null;\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\t\treturn response.data as any;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t},\n\n\tasync getRazorpayTopupEstimate(amount: number): Promise<{\n\t\tcreditAmountUsd: number;\n\t\tchargeAmountInr: number;\n\t\tfeeAmountInr: number;\n\t\tcurrency: string;\n\t\texchangeRate: number;\n\t} | null> {\n\t\ttry {\n\t\t\tconst response = await apiGetRazorpayTopupEstimate({\n\t\t\t\tquery: { amount },\n\t\t\t});\n\t\t\tif (response.error) return null;\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\t\treturn response.data as any;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t},\n\n\tasync createRazorpayOrder(amount: number): Promise<{\n\t\tsuccess: boolean;\n\t\torderId: string;\n\t\tamount: number;\n\t\tcurrency: string;\n\t\tcreditAmountUsd: number;\n\t\tkeyId: string;\n\t}> {\n\t\tconst response = await apiCreateRazorpayOrder({\n\t\t\tbody: { amount },\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tasync verifyRazorpayPayment(params: {\n\t\trazorpay_order_id: string;\n\t\trazorpay_payment_id: string;\n\t\trazorpay_signature: string;\n\t}): Promise<{\n\t\tsuccess: boolean;\n\t\tcredited: number;\n\t\tnewBalance: number;\n\t}> {\n\t\tconst response = await apiVerifyRazorpayPayment({\n\t\t\tbody: params,\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n};\n",
31
+ "import {\n\tgetAuthStatus as apiGetAuthStatus,\n\tsetupSetuWallet as apiSetupSetuWallet,\n\timportSetuWallet as apiImportSetuWallet,\n\texportSetuWallet as apiExportSetuWallet,\n\taddProviderApiKey as apiAddProviderApiKey,\n\tremoveProvider as apiRemoveProvider,\n\tcompleteOnboarding as apiCompleteOnboarding,\n\tgetOAuthUrl as apiGetOAuthUrl,\n\texchangeOAuthCode as apiExchangeOAuthCode,\n\tstartCopilotDeviceFlow as apiStartCopilotDeviceFlow,\n\tpollCopilotDeviceFlow as apiPollCopilotDeviceFlow,\n\tgetCopilotAuthMethods as apiGetCopilotAuthMethods,\n\tsaveCopilotToken as apiSaveCopilotToken,\n\timportCopilotTokenFromGh as apiImportCopilotTokenFromGh,\n\tgetCopilotDiagnostics as apiGetCopilotDiagnostics,\n\tgetProviderUsage as apiGetProviderUsage,\n} from '@ottocode/api';\nimport type { ProviderUsageResponse } from '../../types/api';\nimport { extractErrorMessage, getBaseUrl } from './utils';\n\nexport const authMixin = {\n\tasync getAuthStatus(): Promise<{\n\t\tonboardingComplete: boolean;\n\t\tsetu: { configured: boolean; publicKey?: string };\n\t\tproviders: Record<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tconfigured: boolean;\n\t\t\t\ttype?: 'api' | 'oauth' | 'wallet';\n\t\t\t\tlabel: string;\n\t\t\t\tsupportsOAuth: boolean;\n\t\t\t\tsupportsToken?: boolean;\n\t\t\t\tsupportsGhImport?: boolean;\n\t\t\t\tmodelCount: number;\n\t\t\t\tcostRange?: { min: number; max: number };\n\t\t\t}\n\t\t>;\n\t\tdefaults: {\n\t\t\tagent: string;\n\t\t\tprovider: string;\n\t\t\tmodel: string;\n\t\t\ttoolApproval?: 'auto' | 'dangerous' | 'all';\n\t\t};\n\t}> {\n\t\tconst response = await apiGetAuthStatus();\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tasync setupSetuWallet(): Promise<{\n\t\tsuccess: boolean;\n\t\tpublicKey: string;\n\t\tisNew: boolean;\n\t}> {\n\t\tconst response = await apiSetupSetuWallet();\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tasync importSetuWallet(privateKey: string): Promise<{\n\t\tsuccess: boolean;\n\t\tpublicKey: string;\n\t}> {\n\t\tconst response = await apiImportSetuWallet({\n\t\t\tbody: { privateKey },\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tasync exportSetuWallet(): Promise<{\n\t\tsuccess: boolean;\n\t\tpublicKey: string;\n\t\tprivateKey: string;\n\t}> {\n\t\tconst response = await apiExportSetuWallet();\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tasync addProvider(\n\t\tprovider: string,\n\t\tapiKey: string,\n\t): Promise<{ success: boolean; provider: string }> {\n\t\tconst response = await apiAddProviderApiKey({\n\t\t\tpath: { provider },\n\t\t\tbody: { apiKey },\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tasync removeProvider(\n\t\tprovider: string,\n\t): Promise<{ success: boolean; provider: string }> {\n\t\tconst response = await apiRemoveProvider({ path: { provider } });\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tasync completeOnboarding(): Promise<{ success: boolean }> {\n\t\tconst response = await apiCompleteOnboarding();\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tgetOAuthStartUrl(provider: string, mode?: string): string {\n\t\tconst baseUrl = `${getBaseUrl()}/v1/auth/${provider}/oauth/start`;\n\t\tif (mode) return `${baseUrl}?mode=${mode}`;\n\t\treturn baseUrl;\n\t},\n\n\tasync getOAuthUrl(\n\t\tprovider: string,\n\t\tmode?: string,\n\t): Promise<{ url: string; sessionId: string; provider: string }> {\n\t\tconst response = await apiGetOAuthUrl({\n\t\t\tpath: { provider },\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: API type mismatch\n\t\t\tbody: { mode } as any,\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tasync exchangeOAuthCode(\n\t\tprovider: string,\n\t\tcode: string,\n\t\tsessionId: string,\n\t): Promise<{ success: boolean; provider: string }> {\n\t\tconst response = await apiExchangeOAuthCode({\n\t\t\tpath: { provider },\n\t\t\tbody: { code, sessionId },\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tasync startCopilotDeviceFlow(): Promise<{\n\t\tsessionId: string;\n\t\tuserCode: string;\n\t\tverificationUri: string;\n\t\tinterval: number;\n\t}> {\n\t\tconst response = await apiStartCopilotDeviceFlow();\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tasync pollCopilotDeviceFlow(\n\t\tsessionId: string,\n\t): Promise<{ status: 'complete' | 'pending' | 'error'; error?: string }> {\n\t\tconst response = await apiPollCopilotDeviceFlow({\n\t\t\tbody: { sessionId },\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tasync getCopilotAuthMethods(): Promise<{\n\t\toauth: boolean;\n\t\ttoken: boolean;\n\t\tghImport: { available: boolean; authenticated: boolean; reason?: string };\n\t}> {\n\t\tconst response = await apiGetCopilotAuthMethods();\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tasync saveCopilotToken(token: string): Promise<{\n\t\tsuccess: boolean;\n\t\tprovider: string;\n\t\tsource: 'token';\n\t\tmodelCount: number;\n\t\thasGpt52Codex: boolean;\n\t\tsampleModels: string[];\n\t}> {\n\t\tconst response = await apiSaveCopilotToken({ body: { token } });\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tasync importCopilotTokenFromGh(): Promise<{\n\t\tsuccess: boolean;\n\t\tprovider: string;\n\t\tsource: 'gh';\n\t\tmodelCount: number;\n\t\thasGpt52Codex: boolean;\n\t\tsampleModels: string[];\n\t}> {\n\t\tconst response = await apiImportCopilotTokenFromGh();\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tasync getCopilotDiagnostics(): Promise<{\n\t\ttokenSources: Array<{\n\t\t\tsource: 'env' | 'stored';\n\t\t\tconfigured: boolean;\n\t\t\tmodelCount?: number;\n\t\t\thasGpt52Codex?: boolean;\n\t\t\tsampleModels?: string[];\n\t\t\trestrictedByOrgPolicy?: boolean;\n\t\t\trestrictedOrg?: string;\n\t\t\trestrictionMessage?: string;\n\t\t\terror?: string;\n\t\t}>;\n\t\tmethods: {\n\t\t\toauth: boolean;\n\t\t\ttoken: boolean;\n\t\t\tghImport: { available: boolean; authenticated: boolean; reason?: string };\n\t\t};\n\t}> {\n\t\tconst response = await apiGetCopilotDiagnostics();\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\t// biome-ignore lint/suspicious/noExplicitAny: API response structure\n\t\treturn response.data as any;\n\t},\n\n\tasync getProviderUsage(provider: string): Promise<ProviderUsageResponse> {\n\t\tconst response = await apiGetProviderUsage({\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: API path type mismatch\n\t\t\tpath: { provider } as any,\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\treturn response.data as ProviderUsageResponse;\n\t},\n};\n",
32
+ "import {\n\tlistSkills as apiListSkills,\n\tgetSkill as apiGetSkill,\n\tlistSkillFiles as apiListSkillFiles,\n\tgetSkillFile as apiGetSkillFile,\n} from '@ottocode/api';\nimport { extractErrorMessage } from './utils';\n\nexport interface SkillSummary {\n\tname: string;\n\tdescription: string;\n\tscope: string;\n\tpath: string;\n}\n\nexport interface SkillDetail {\n\tname: string;\n\tdescription: string;\n\tlicense?: string | null;\n\tcompatibility?: string | null;\n\tmetadata?: unknown;\n\tallowedTools?: string[] | null;\n\tpath: string;\n\tscope: string;\n\tcontent: string;\n}\n\nexport interface SkillFileInfo {\n\trelativePath: string;\n\tsize: number;\n}\n\nexport const skillsMixin = {\n\tasync listSkills(): Promise<{ skills: SkillSummary[] }> {\n\t\tconst response = await apiListSkills();\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\treturn response.data as { skills: SkillSummary[] };\n\t},\n\n\tasync getSkill(name: string): Promise<SkillDetail> {\n\t\tconst response = await apiGetSkill({ path: { name } });\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\treturn response.data as SkillDetail;\n\t},\n\n\tasync getSkillFiles(name: string): Promise<{ files: SkillFileInfo[] }> {\n\t\tconst response = await apiListSkillFiles({ path: { name } });\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\treturn response.data as { files: SkillFileInfo[] };\n\t},\n\n\tasync getSkillFileContent(\n\t\tname: string,\n\t\tfilePath: string,\n\t): Promise<{ content: string; path: string }> {\n\t\tconst response = await apiGetSkillFile({\n\t\t\tpath: { name, filePath },\n\t\t});\n\t\tif (response.error) throw new Error(extractErrorMessage(response.error));\n\t\treturn response.data as { content: string; path: string };\n\t},\n};\n",
33
+ "import { sessionsMixin } from './sessions';\nimport { gitMixin } from './git';\nimport { configMixin } from './config';\nimport { filesMixin } from './files';\nimport { branchesMixin } from './branches';\nimport { approvalMixin } from './approval';\nimport { setuMixin } from './setu';\nimport { authMixin } from './auth';\nimport { skillsMixin } from './skills';\n\nexport { configureApiClient } from './utils';\n\nclass ApiClient {\n\tgetSessions = sessionsMixin.getSessions;\n\tgetSessionsPage = sessionsMixin.getSessionsPage;\n\tcreateSession = sessionsMixin.createSession;\n\tupdateSession = sessionsMixin.updateSession;\n\tdeleteSession = sessionsMixin.deleteSession;\n\tabortSession = sessionsMixin.abortSession;\n\tabortMessage = sessionsMixin.abortMessage;\n\tgetQueueState = sessionsMixin.getQueueState;\n\tremoveFromQueue = sessionsMixin.removeFromQueue;\n\tgetMessages = sessionsMixin.getMessages;\n\tsendMessage = sessionsMixin.sendMessage;\n\tgetStreamUrl = sessionsMixin.getStreamUrl;\n\tretryMessage = sessionsMixin.retryMessage;\n\n\tinitGitRepo = gitMixin.initGitRepo;\n\tgetGitStatus = gitMixin.getGitStatus;\n\tgetGitDiff = gitMixin.getGitDiff;\n\tgetGitDiffFullFile = gitMixin.getGitDiffFullFile;\n\tgenerateCommitMessage = gitMixin.generateCommitMessage;\n\tstageFiles = gitMixin.stageFiles;\n\tunstageFiles = gitMixin.unstageFiles;\n\trestoreFiles = gitMixin.restoreFiles;\n\tdeleteFiles = gitMixin.deleteFiles;\n\tcommitChanges = gitMixin.commitChanges;\n\tgetGitBranch = gitMixin.getGitBranch;\n\tpushCommits = gitMixin.pushCommits;\n\tpullChanges = gitMixin.pullChanges;\n\tgetRemotes = gitMixin.getRemotes;\n\taddRemote = gitMixin.addRemote;\n\tremoveRemote = gitMixin.removeRemote;\n\n\tgetConfig = configMixin.getConfig;\n\tgetModels = configMixin.getModels;\n\tgetAllModels = configMixin.getAllModels;\n\tupdateDefaults = configMixin.updateDefaults;\n\n\tlistFiles = filesMixin.listFiles;\n\tgetFileTree = filesMixin.getFileTree;\n\treadFileContent = filesMixin.readFileContent;\n\tgetSessionFiles = filesMixin.getSessionFiles;\n\n\tcreateBranch = branchesMixin.createBranch;\n\tlistBranches = branchesMixin.listBranches;\n\tgetParentSession = branchesMixin.getParentSession;\n\tgetShareStatus = branchesMixin.getShareStatus;\n\tshareSession = branchesMixin.shareSession;\n\tsyncSession = branchesMixin.syncSession;\n\n\tapproveToolCall = approvalMixin.approveToolCall;\n\tgetPendingApprovals = approvalMixin.getPendingApprovals;\n\n\tgetSetuBalance = setuMixin.getSetuBalance;\n\tgetSetuWallet = setuMixin.getSetuWallet;\n\tgetSetuUsdcBalance = setuMixin.getSetuUsdcBalance;\n\tgetPolarTopupEstimate = setuMixin.getPolarTopupEstimate;\n\tcreatePolarCheckout = setuMixin.createPolarCheckout;\n\tselectTopupMethod = setuMixin.selectTopupMethod;\n\tcancelTopup = setuMixin.cancelTopup;\n\tgetPendingTopup = setuMixin.getPendingTopup;\n\tgetPolarTopupStatus = setuMixin.getPolarTopupStatus;\n\tgetRazorpayTopupEstimate = setuMixin.getRazorpayTopupEstimate;\n\tcreateRazorpayOrder = setuMixin.createRazorpayOrder;\n\tverifyRazorpayPayment = setuMixin.verifyRazorpayPayment;\n\n\tgetAuthStatus = authMixin.getAuthStatus;\n\tsetupSetuWallet = authMixin.setupSetuWallet;\n\timportSetuWallet = authMixin.importSetuWallet;\n\texportSetuWallet = authMixin.exportSetuWallet;\n\taddProvider = authMixin.addProvider;\n\tremoveProvider = authMixin.removeProvider;\n\tcompleteOnboarding = authMixin.completeOnboarding;\n\tgetOAuthStartUrl = authMixin.getOAuthStartUrl;\n\tgetOAuthUrl = authMixin.getOAuthUrl;\n\texchangeOAuthCode = authMixin.exchangeOAuthCode;\n\tstartCopilotDeviceFlow = authMixin.startCopilotDeviceFlow;\n\tpollCopilotDeviceFlow = authMixin.pollCopilotDeviceFlow;\n\tgetCopilotAuthMethods = authMixin.getCopilotAuthMethods;\n\tsaveCopilotToken = authMixin.saveCopilotToken;\n\timportCopilotTokenFromGh = authMixin.importCopilotTokenFromGh;\n\tgetCopilotDiagnostics = authMixin.getCopilotDiagnostics;\n\tgetProviderUsage = authMixin.getProviderUsage;\n\n\tlistSkills = skillsMixin.listSkills;\n\tgetSkill = skillsMixin.getSkill;\n\tgetSkillFiles = skillsMixin.getSkillFiles;\n\tgetSkillFileContent = skillsMixin.getSkillFileContent;\n}\n\nexport const apiClient = new ApiClient();\n",
34
+ "import { useCallback, useMemo, useSyncExternalStore } from 'react';\n\ninterface Preferences {\n\tvimMode: boolean;\n\tcompactThread: boolean;\n}\n\nconst STORAGE_KEY = 'otto-preferences';\nconst DEFAULT_PREFERENCES: Preferences = {\n\tvimMode: false,\n\tcompactThread: true,\n};\n\nfunction resolveInitialPreferences(): Preferences {\n\tif (typeof window === 'undefined') {\n\t\treturn DEFAULT_PREFERENCES;\n\t}\n\ttry {\n\t\tconst stored = window.localStorage.getItem(STORAGE_KEY);\n\t\tif (stored) {\n\t\t\tconst parsed = JSON.parse(stored) as Partial<Preferences>;\n\t\t\treturn {\n\t\t\t\t...DEFAULT_PREFERENCES,\n\t\t\t\t...parsed,\n\t\t\t};\n\t\t}\n\t} catch (error) {\n\t\tconsole.warn('Failed to load preferences', error);\n\t}\n\treturn DEFAULT_PREFERENCES;\n}\n\nlet preferences: Preferences = resolveInitialPreferences();\nconst listeners = new Set<() => void>();\n\nfunction getSnapshot(): Preferences {\n\treturn preferences;\n}\n\nfunction getServerSnapshot(): Preferences {\n\treturn DEFAULT_PREFERENCES;\n}\n\nfunction subscribe(listener: () => void): () => void {\n\tlisteners.add(listener);\n\treturn () => listeners.delete(listener);\n}\n\nfunction notifyListeners() {\n\tfor (const listener of listeners) {\n\t\tlistener();\n\t}\n}\n\nfunction updateStore(updates: Partial<Preferences>) {\n\tpreferences = { ...preferences, ...updates };\n\tif (typeof window !== 'undefined') {\n\t\ttry {\n\t\t\twindow.localStorage.setItem(STORAGE_KEY, JSON.stringify(preferences));\n\t\t} catch (error) {\n\t\t\tconsole.warn('Failed to persist preferences', error);\n\t\t}\n\t}\n\tnotifyListeners();\n}\n\nexport function usePreferences() {\n\tconst currentPreferences = useSyncExternalStore(\n\t\tsubscribe,\n\t\tgetSnapshot,\n\t\tgetServerSnapshot,\n\t);\n\n\tconst updatePreferences = useCallback((updates: Partial<Preferences>) => {\n\t\tupdateStore(updates);\n\t}, []);\n\n\treturn useMemo(\n\t\t() => ({ preferences: currentPreferences, updatePreferences }),\n\t\t[currentPreferences, updatePreferences],\n\t);\n}\n\nexport type { Preferences };\n",
35
+ "import { useQuery } from '@tanstack/react-query';\nimport { apiClient } from '../lib/api-client';\nimport type { ShareStatus } from '../types/api';\n\nexport function useShareStatus(sessionId: string | undefined): {\n\tdata: ShareStatus | undefined;\n\tisLoading: boolean;\n\terror: Error | null;\n} {\n\tconst { data, isLoading, error } = useQuery({\n\t\tqueryKey: ['share-status', sessionId],\n\t\tqueryFn: () => apiClient.getShareStatus(sessionId as string),\n\t\tenabled: !!sessionId,\n\t\tstaleTime: 30000,\n\t});\n\n\treturn { data, isLoading, error: error as Error | null };\n}\n",
36
+ "import {\n\tTerminal,\n\tSparkles,\n\tPlus,\n\tKeyboard,\n\tCode,\n\tBrain,\n\tStopCircle,\n\tGitBranch,\n\tCheck,\n\tMinimize2,\n\tSplit,\n\tTrash2,\n\tShare2,\n\tRefreshCw,\n} from 'lucide-react';\n\nexport interface Command {\n\tid: string;\n\tlabel: string;\n\tdescription: string | ((state: CommandState) => string);\n\ticon: typeof Terminal;\n}\n\nexport interface CommandState {\n\tvimModeEnabled: boolean;\n\treasoningEnabled: boolean;\n\tisShared?: boolean;\n}\n\nexport const COMMANDS: Command[] = [\n\t{\n\t\tid: 'models',\n\t\tlabel: '/models',\n\t\tdescription: 'Open model selector',\n\t\ticon: Sparkles,\n\t},\n\t{\n\t\tid: 'agents',\n\t\tlabel: '/agents',\n\t\tdescription: 'Open agent selector',\n\t\ticon: Terminal,\n\t},\n\t{\n\t\tid: 'new',\n\t\tlabel: '/new',\n\t\tdescription: 'Create new session',\n\t\ticon: Plus,\n\t},\n\t{\n\t\tid: 'stop',\n\t\tlabel: '/stop',\n\t\tdescription: 'Stop current generation',\n\t\ticon: StopCircle,\n\t},\n\t{\n\t\tid: 'help',\n\t\tlabel: '/help',\n\t\tdescription: 'Show keyboard shortcuts and help',\n\t\ticon: Keyboard,\n\t},\n\t{\n\t\tid: 'vim',\n\t\tlabel: '/vim',\n\t\tdescription: (state) =>\n\t\t\tstate.vimModeEnabled ? 'Disable Vim mode' : 'Enable Vim mode',\n\t\ticon: Code,\n\t},\n\t{\n\t\tid: 'reasoning',\n\t\tlabel: '/reasoning',\n\t\tdescription: (state) =>\n\t\t\tstate.reasoningEnabled\n\t\t\t\t? 'Disable extended thinking'\n\t\t\t\t: 'Enable extended thinking',\n\t\ticon: Brain,\n\t},\n\t{\n\t\tid: 'stage',\n\t\tlabel: '/stage',\n\t\tdescription: 'Stage all changes (git add -A)',\n\t\ticon: GitBranch,\n\t},\n\t{\n\t\tid: 'commit',\n\t\tlabel: '/commit',\n\t\tdescription: 'Commit staged changes',\n\t\ticon: Check,\n\t},\n\t{\n\t\tid: 'compact',\n\t\tlabel: '/compact',\n\t\tdescription: 'Compact conversation to reduce context size',\n\t\ticon: Minimize2,\n\t},\n\t{\n\t\tid: 'branch',\n\t\tlabel: '/branch',\n\t\tdescription: 'Branch session from last message',\n\t\ticon: Split,\n\t},\n\t{\n\t\tid: 'delete',\n\t\tlabel: '/delete',\n\t\tdescription: 'Delete current session',\n\t\ticon: Trash2,\n\t},\n\t{\n\t\tid: 'share',\n\t\tlabel: '/share',\n\t\tdescription: 'Share session publicly',\n\t\ticon: Share2,\n\t},\n\t{\n\t\tid: 'sync',\n\t\tlabel: '/sync',\n\t\tdescription: 'Sync new messages to shared session',\n\t\ticon: RefreshCw,\n\t},\n];\n\nexport function getCommandDescription(\n\tcmd: Command,\n\tstate: CommandState,\n): string {\n\treturn typeof cmd.description === 'function'\n\t\t? cmd.description(state)\n\t\t: cmd.description;\n}\n\nexport function filterCommands(query: string, state: CommandState): Command[] {\n\tconst baseCommands = COMMANDS.filter((cmd) => {\n\t\tif (cmd.id === 'share' && state.isShared) return false;\n\t\tif (cmd.id === 'sync' && !state.isShared) return false;\n\t\treturn true;\n\t});\n\n\tif (!query) {\n\t\treturn baseCommands;\n\t}\n\n\tconst lowerQuery = query.toLowerCase();\n\tconst matches: (Command & { matchScore: number })[] = [];\n\n\tfor (const cmd of baseCommands) {\n\t\tconst desc = getCommandDescription(cmd, state);\n\t\tconst labelMatch = cmd.label.toLowerCase().includes(lowerQuery);\n\t\tconst descriptionMatch = desc.toLowerCase().includes(lowerQuery);\n\n\t\tif (labelMatch || descriptionMatch) {\n\t\t\tconst matchScore = labelMatch ? 10 : 5;\n\t\t\tmatches.push({ ...cmd, matchScore });\n\t\t}\n\t}\n\n\treturn matches.sort((a, b) => {\n\t\tconst scoreDiff = b.matchScore - a.matchScore;\n\t\tif (scoreDiff !== 0) return scoreDiff;\n\t\treturn a.label.localeCompare(b.label);\n\t});\n}\n",
37
+ "import { useEffect, useRef } from 'react';\nimport { Modal } from '../ui/Modal';\nimport { Keyboard, Command } from 'lucide-react';\n\ninterface ShortcutsModalProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n}\n\ninterface ShortcutItem {\n\tkeys: string[];\n\tdescription: string;\n\tcategory: string;\n}\n\nconst SHORTCUTS: ShortcutItem[] = [\n\t{\n\t\tkeys: ['Ctrl', 'H'],\n\t\tdescription: 'Navigate to left sidebar (sessions)',\n\t\tcategory: 'Navigation',\n\t},\n\t{\n\t\tkeys: ['Ctrl', 'L'],\n\t\tdescription: 'Navigate to right sidebar (git)',\n\t\tcategory: 'Navigation',\n\t},\n\t{\n\t\tkeys: ['Ctrl', '/'],\n\t\tdescription: 'Toggle left sidebar collapse/expand',\n\t\tcategory: 'Navigation',\n\t},\n\t{\n\t\tkeys: ['Ctrl', '\\\\'],\n\t\tdescription: 'Toggle right sidebar collapse/expand',\n\t\tcategory: 'Navigation',\n\t},\n\t{\n\t\tkeys: ['Ctrl', 'N'],\n\t\tdescription: 'Create new session',\n\t\tcategory: 'Navigation',\n\t},\n\t{\n\t\tkeys: ['ESC'],\n\t\tdescription: 'Close sidebar and return to center',\n\t\tcategory: 'Navigation',\n\t},\n\t{\n\t\tkeys: ['J'],\n\t\tdescription: 'Navigate to next item (in focused list)',\n\t\tcategory: 'List Navigation',\n\t},\n\t{\n\t\tkeys: ['K'],\n\t\tdescription: 'Navigate to previous item (in focused list)',\n\t\tcategory: 'List Navigation',\n\t},\n\t{\n\t\tkeys: ['Enter'],\n\t\tdescription: 'Select focused item and return to input',\n\t\tcategory: 'List Navigation',\n\t},\n\t{\n\t\tkeys: ['Space'],\n\t\tdescription: 'Toggle stage/unstage for focused file (git panel)',\n\t\tcategory: 'Git Operations',\n\t},\n\t{\n\t\tkeys: ['A'],\n\t\tdescription: 'Stage all unstaged files',\n\t\tcategory: 'Git Operations',\n\t},\n\t{\n\t\tkeys: ['U'],\n\t\tdescription: 'Unstage all staged files',\n\t\tcategory: 'Git Operations',\n\t},\n\t{\n\t\tkeys: ['C'],\n\t\tdescription: 'Open commit modal (if files are staged)',\n\t\tcategory: 'Git Operations',\n\t},\n\t{\n\t\tkeys: ['Tab'],\n\t\tdescription: 'Toggle plan mode',\n\t\tcategory: 'Chat',\n\t},\n\t{\n\t\tkeys: ['Enter'],\n\t\tdescription: 'Send message',\n\t\tcategory: 'Chat',\n\t},\n\t{\n\t\tkeys: ['Shift', 'Enter'],\n\t\tdescription: 'New line in message',\n\t\tcategory: 'Chat',\n\t},\n\t{\n\t\tkeys: ['@'],\n\t\tdescription: 'Mention file (opens file picker)',\n\t\tcategory: 'Chat',\n\t},\n\t{\n\t\tkeys: ['/'],\n\t\tdescription: 'Slash command (opens command menu)',\n\t\tcategory: 'Chat',\n\t},\n];\n\nconst VIM_MODE_SHORTCUTS: ShortcutItem[] = [\n\t{\n\t\tkeys: ['i'],\n\t\tdescription: 'Enter insert mode at cursor (vim mode)',\n\t\tcategory: 'Vim Mode',\n\t},\n\t{\n\t\tkeys: ['a'],\n\t\tdescription: 'Enter insert mode after cursor (vim mode)',\n\t\tcategory: 'Vim Mode',\n\t},\n\t{\n\t\tkeys: ['I'],\n\t\tdescription: 'Enter insert mode at line start (vim mode)',\n\t\tcategory: 'Vim Mode',\n\t},\n\t{\n\t\tkeys: ['A'],\n\t\tdescription: 'Enter insert mode at line end (vim mode)',\n\t\tcategory: 'Vim Mode',\n\t},\n\t{\n\t\tkeys: ['o'],\n\t\tdescription: 'New line below and enter insert mode (vim mode)',\n\t\tcategory: 'Vim Mode',\n\t},\n\t{\n\t\tkeys: ['O'],\n\t\tdescription: 'New line above and enter insert mode (vim mode)',\n\t\tcategory: 'Vim Mode',\n\t},\n\t{\n\t\tkeys: ['ESC'],\n\t\tdescription: 'Return to normal mode (vim mode)',\n\t\tcategory: 'Vim Mode',\n\t},\n\t{\n\t\tkeys: ['Enter'],\n\t\tdescription: 'Send message in normal mode (vim mode)',\n\t\tcategory: 'Vim Mode',\n\t},\n\t{\n\t\tkeys: ['w'],\n\t\tdescription: 'Jump to next word start (vim mode)',\n\t\tcategory: 'Vim Mode',\n\t},\n\t{\n\t\tkeys: ['e'],\n\t\tdescription: 'Jump to next word end (vim mode)',\n\t\tcategory: 'Vim Mode',\n\t},\n\t{\n\t\tkeys: ['b'],\n\t\tdescription: 'Jump to previous word start (vim mode)',\n\t\tcategory: 'Vim Mode',\n\t},\n\t{\n\t\tkeys: ['x'],\n\t\tdescription: 'Delete character under cursor (vim mode)',\n\t\tcategory: 'Vim Mode',\n\t},\n\t{\n\t\tkeys: ['s'],\n\t\tdescription: 'Delete character and enter insert mode (vim mode)',\n\t\tcategory: 'Vim Mode',\n\t},\n\t{\n\t\tkeys: ['S'],\n\t\tdescription: 'Delete line and enter insert mode (vim mode)',\n\t\tcategory: 'Vim Mode',\n\t},\n\t{\n\t\tkeys: ['f', '{char}'],\n\t\tdescription: 'Find and jump to next character on line (vim mode)',\n\t\tcategory: 'Vim Mode',\n\t},\n\t{\n\t\tkeys: ['d', 'd'],\n\t\tdescription: 'Delete current line (vim mode)',\n\t\tcategory: 'Vim Mode',\n\t},\n\t{\n\t\tkeys: ['0'],\n\t\tdescription: 'Jump to line start (vim mode)',\n\t\tcategory: 'Vim Mode',\n\t},\n\t{\n\t\tkeys: ['$'],\n\t\tdescription: 'Jump to line end (vim mode)',\n\t\tcategory: 'Vim Mode',\n\t},\n];\n\nconst SLASH_COMMANDS = [\n\t{\n\t\tcommand: '/models',\n\t\tdescription: 'Open model selector',\n\t},\n\t{\n\t\tcommand: '/agents',\n\t\tdescription: 'Open agent selector',\n\t},\n\t{\n\t\tcommand: '/new',\n\t\tdescription: 'Create new session',\n\t},\n\t{\n\t\tcommand: '/help',\n\t\tdescription: 'Show keyboard shortcuts and help (this modal)',\n\t},\n\t{\n\t\tcommand: '/compact',\n\t\tdescription: 'Compact conversation to reduce context size',\n\t},\n];\n\nfunction groupShortcutsByCategory(shortcuts: ShortcutItem[]) {\n\tconst grouped: Record<string, ShortcutItem[]> = {};\n\tfor (const shortcut of shortcuts) {\n\t\tif (!grouped[shortcut.category]) {\n\t\t\tgrouped[shortcut.category] = [];\n\t\t}\n\t\tgrouped[shortcut.category].push(shortcut);\n\t}\n\treturn grouped;\n}\n\nexport function ShortcutsModal({ isOpen, onClose }: ShortcutsModalProps) {\n\tconst allShortcuts = [...SHORTCUTS, ...VIM_MODE_SHORTCUTS];\n\tconst groupedShortcuts = groupShortcutsByCategory(allShortcuts);\n\tconst modalContentRef = useRef<HTMLDivElement>(null);\n\tconst previousActiveElement = useRef<HTMLElement | null>(null);\n\n\tuseEffect(() => {\n\t\tif (isOpen) {\n\t\t\tpreviousActiveElement.current = document.activeElement as HTMLElement;\n\t\t\tif (previousActiveElement.current) {\n\t\t\t\tpreviousActiveElement.current.blur();\n\t\t\t}\n\t\t} else {\n\t\t\tif (previousActiveElement.current) {\n\t\t\t\tpreviousActiveElement.current.focus();\n\t\t\t\tpreviousActiveElement.current = null;\n\t\t\t}\n\t\t}\n\t}, [isOpen]);\n\n\tuseEffect(() => {\n\t\tif (!isOpen) return;\n\n\t\tconst handleKeyDown = (e: KeyboardEvent) => {\n\t\t\tconst target = e.target as HTMLElement;\n\t\t\tconst isInputField =\n\t\t\t\ttarget.tagName === 'INPUT' ||\n\t\t\t\ttarget.tagName === 'TEXTAREA' ||\n\t\t\t\ttarget.isContentEditable;\n\n\t\t\tif (isInputField) return;\n\n\t\t\tif (e.key === 'j') {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst container = modalContentRef.current;\n\t\t\t\tif (container) {\n\t\t\t\t\tcontainer.scrollBy({ top: 100, behavior: 'smooth' });\n\t\t\t\t}\n\t\t\t} else if (e.key === 'k') {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst container = modalContentRef.current;\n\t\t\t\tif (container) {\n\t\t\t\t\tcontainer.scrollBy({ top: -100, behavior: 'smooth' });\n\t\t\t\t}\n\t\t\t} else if (e.key === 'Enter') {\n\t\t\t\te.preventDefault();\n\t\t\t\tonClose();\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener('keydown', handleKeyDown);\n\t\treturn () => document.removeEventListener('keydown', handleKeyDown);\n\t}, [isOpen, onClose]);\n\n\treturn (\n\t\t<Modal\n\t\t\tisOpen={isOpen}\n\t\t\tonClose={onClose}\n\t\t\ttitle={\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<Keyboard className=\"w-5 h-5\" />\n\t\t\t\t\t<span>Keyboard Shortcuts & Help</span>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\tmaxWidth=\"2xl\"\n\t\t\tcloseOnEscape={true}\n\t\t\tcloseOnBackdropClick={true}\n\t\t>\n\t\t\t<div\n\t\t\t\tref={modalContentRef}\n\t\t\t\tclassName=\"space-y-6 max-h-[70vh] overflow-y-auto\"\n\t\t\t>\n\t\t\t\t{Object.entries(groupedShortcuts).map(([category, shortcuts]) => (\n\t\t\t\t\t<div key={category}>\n\t\t\t\t\t\t<h3 className=\"text-sm font-semibold text-foreground mb-3 flex items-center gap-2\">\n\t\t\t\t\t\t\t<Command className=\"w-4 h-4\" />\n\t\t\t\t\t\t\t{category}\n\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t{shortcuts.map((shortcut, _index) => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={`${category}-${shortcut.description}`}\n\t\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-between py-2 px-3 rounded-lg bg-accent/50 hover:bg-accent transition-colors\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span className=\"text-sm text-foreground\">\n\t\t\t\t\t\t\t\t\t\t{shortcut.description}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t\t\t\t{shortcut.keys.map((key) => (\n\t\t\t\t\t\t\t\t\t\t\t<span key={key} className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t<kbd className=\"px-2 py-1 text-xs font-mono bg-background border border-border rounded shadow-sm\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{key}\n\t\t\t\t\t\t\t\t\t\t\t\t</kbd>\n\t\t\t\t\t\t\t\t\t\t\t\t{shortcut.keys.indexOf(key) <\n\t\t\t\t\t\t\t\t\t\t\t\t\tshortcut.keys.length - 1 && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">+</span>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\n\t\t\t\t<div>\n\t\t\t\t\t<h3 className=\"text-sm font-semibold text-foreground mb-3 flex items-center gap-2\">\n\t\t\t\t\t\t<Command className=\"w-4 h-4\" />\n\t\t\t\t\t\tSlash Commands\n\t\t\t\t\t</h3>\n\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t{SLASH_COMMANDS.map((cmd, _index) => (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={cmd.command}\n\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-between py-2 px-3 rounded-lg bg-accent/50 hover:bg-accent transition-colors\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-foreground\">\n\t\t\t\t\t\t\t\t\t{cmd.description}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<kbd className=\"px-2 py-1 text-xs font-mono bg-background border border-border rounded shadow-sm\">\n\t\t\t\t\t\t\t\t\t{cmd.command}\n\t\t\t\t\t\t\t\t</kbd>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"pt-4 border-t border-border\">\n\t\t\t\t\t<p className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t<strong>Tip:</strong> Shortcuts are disabled when typing in input\n\t\t\t\t\t\tfields. Press <kbd className=\"text-xs\">ESC</kbd> to close popups and\n\t\t\t\t\t\treturn focus to chat input.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</Modal>\n\t);\n}\n",
38
+ "import { useEffect, type ReactNode } from 'react';\nimport { X } from 'lucide-react';\n\ninterface ModalProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\ttitle?: string | React.ReactNode;\n\tchildren: ReactNode;\n\tshowCloseButton?: boolean;\n\tcloseOnBackdropClick?: boolean;\n\tcloseOnEscape?: boolean;\n\tmaxWidth?: 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n}\n\nconst maxWidthClasses = {\n\tsm: 'max-w-sm',\n\tmd: 'max-w-md',\n\tlg: 'max-w-lg',\n\txl: 'max-w-xl',\n\t'2xl': 'max-w-2xl',\n};\n\nexport function Modal({\n\tisOpen,\n\tonClose,\n\ttitle,\n\tchildren,\n\tshowCloseButton = true,\n\tcloseOnBackdropClick = true,\n\tcloseOnEscape = true,\n\tmaxWidth = 'md',\n}: ModalProps) {\n\tuseEffect(() => {\n\t\tif (!isOpen || !closeOnEscape) return;\n\n\t\tconst handleEscape = (e: KeyboardEvent) => {\n\t\t\tconst target = e.target as HTMLElement;\n\t\t\tconst isInInput =\n\t\t\t\ttarget.tagName === 'INPUT' ||\n\t\t\t\ttarget.tagName === 'TEXTAREA' ||\n\t\t\t\ttarget.isContentEditable;\n\t\t\tif (e.key === 'Escape' || (e.key === 'q' && !isInInput)) {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t\tonClose();\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener('keydown', handleEscape);\n\t\treturn () => document.removeEventListener('keydown', handleEscape);\n\t}, [isOpen, closeOnEscape, onClose]);\n\n\tuseEffect(() => {\n\t\tif (isOpen) {\n\t\t\t// Prevent body scroll when modal is open\n\t\t\tdocument.body.style.overflow = 'hidden';\n\t\t\treturn () => {\n\t\t\t\tdocument.body.style.overflow = '';\n\t\t\t};\n\t\t}\n\t}, [isOpen]);\n\n\tif (!isOpen) return null;\n\n\tconst handleBackdropClick = (e: React.MouseEvent<HTMLElement>) => {\n\t\tif (closeOnBackdropClick && e.target === e.currentTarget) {\n\t\t\tonClose();\n\t\t}\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t{/* Backdrop */}\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName=\"fixed inset-0 bg-black/50 backdrop-blur-sm z-[9999] cursor-default\"\n\t\t\t\tonClick={handleBackdropClick}\n\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\thandleBackdropClick(\n\t\t\t\t\t\t\te as unknown as React.MouseEvent<HTMLDivElement>,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\taria-label=\"Close modal\"\n\t\t\t/>\n\n\t\t\t{/* Modal Container */}\n\t\t\t<div\n\t\t\t\tclassName={`fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 z-[9999] w-full ${maxWidthClasses[maxWidth]} px-4`}\n\t\t\t>\n\t\t\t\t<div className=\"bg-background border border-border rounded-lg shadow-lg\">\n\t\t\t\t\t{/* Header */}\n\t\t\t\t\t{(title || showCloseButton) && (\n\t\t\t\t\t\t<div className=\"flex items-center justify-between p-4 border-b border-border\">\n\t\t\t\t\t\t\t{title && (\n\t\t\t\t\t\t\t\t<div className=\"text-lg font-semibold text-foreground\">\n\t\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{showCloseButton && (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground hover:text-foreground transition-colors ml-auto\"\n\t\t\t\t\t\t\t\t\taria-label=\"Close\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<X className=\"h-5 w-5\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{/* Content */}\n\t\t\t\t\t<div className=\"p-6\">{children}</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</>\n\t);\n}\n",
39
+ "import { memo } from 'react';\n\nimport {\n\tanthropicLogo,\n\topenaiLogo,\n\tgoogleLogo,\n\topenrouterLogo,\n\tgroqLogo,\n\tdeepseekLogo,\n\txaiLogo,\n\tzaiLogo,\n\tsetuLogo,\n\tminimaxLogo,\n\topencodeLogo,\n\tcopilotLogo,\n} from '../../assets/provider-logos';\n\nconst providerLogos: Record<string, string> = {\n\tanthropic: anthropicLogo,\n\topenai: openaiLogo,\n\tgoogle: googleLogo,\n\topenrouter: openrouterLogo,\n\tgroq: groqLogo,\n\tdeepseek: deepseekLogo,\n\txai: xaiLogo,\n\tzai: zaiLogo,\n\t'zai-coding': zaiLogo,\n\tsetu: setuLogo,\n\tminimax: minimaxLogo,\n\topencode: opencodeLogo,\n\tcopilot: copilotLogo,\n};\n\ninterface ProviderLogoProps {\n\tprovider: string;\n\tclassName?: string;\n\tsize?: number;\n}\n\nexport const ProviderLogo = memo(function ProviderLogo({\n\tprovider,\n\tclassName = '',\n\tsize = 16,\n}: ProviderLogoProps) {\n\tconst logoSvg = providerLogos[provider.toLowerCase()];\n\n\tif (!logoSvg) {\n\t\treturn (\n\t\t\t<span\n\t\t\t\tclassName={`inline-flex items-center justify-center text-[10px] font-medium text-muted-foreground uppercase ${className}`}\n\t\t\t\tstyle={{ width: size, height: size }}\n\t\t\t\ttitle={provider}\n\t\t\t>\n\t\t\t\t{provider.slice(0, 2)}\n\t\t\t</span>\n\t\t);\n\t}\n\n\treturn (\n\t\t<span\n\t\t\tclassName={`inline-flex items-center justify-center text-foreground/70 dark:text-foreground/80 ${className}`}\n\t\t\tstyle={{ width: size, height: size }}\n\t\t\ttitle={provider}\n\t\t\t// biome-ignore lint/security/noDangerouslySetInnerHtml: SVG logos are hardcoded trusted content\n\t\t\tdangerouslySetInnerHTML={{\n\t\t\t\t__html: logoSvg.replace(\n\t\t\t\t\t/<svg/,\n\t\t\t\t\t`<svg width=\"${size}\" height=\"${size}\" style=\"width:${size}px;height:${size}px\"`,\n\t\t\t\t),\n\t\t\t}}\n\t\t/>\n\t);\n});\n",
40
+ "export const anthropicLogo = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 40 40\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M26.9568 9.88184H22.1265L30.7753 31.7848H35.4917L26.9568 9.88184ZM13.028 9.88184L4.4917 31.7848H9.32203L11.2305 27.1793H20.2166L22.0126 31.6724H26.8444L18.0832 9.88184H13.028ZM12.5783 23.1361L15.4987 15.3853L18.5315 23.1361H12.5783Z\" fill=\"currentColor\"/>\n</svg>`;\n\nexport const openaiLogo = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 40 40\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M32.8377 17.282C33.2127 16.25 33.3072 15.218 33.2127 14.1875C33.1197 13.1571 32.7447 12.1251 32.2752 11.1876C31.4322 9.78209 30.2127 8.6571 28.8072 8.0001C27.3072 7.34461 25.7127 7.15711 24.1197 7.53211C23.3698 6.78212 22.5253 6.12512 21.5878 5.65713C20.6503 5.18913 19.5253 5.00013 18.4948 5.00013C16.8851 4.99074 15.3125 5.48246 13.9948 6.40712C12.6824 7.34311 11.7449 8.6571 11.2754 10.1571C10.1504 10.4376 9.21289 10.9071 8.27539 11.4696C7.4324 12.1251 6.77541 12.9696 6.21291 13.8126C5.36992 15.2195 5.08792 16.8125 5.27542 18.407C5.46399 19.9968 6.11605 21.496 7.1504 22.718C6.79608 23.7086 6.66795 24.7659 6.77541 25.8124C6.86991 26.8444 7.2449 27.8749 7.7129 28.8124C8.55739 30.2194 9.77538 31.3444 11.1824 31.9999C12.6824 32.6569 14.2753 32.8444 15.8698 32.4694C16.6198 33.2194 17.4628 33.8749 18.4003 34.3444C19.3378 34.8139 20.4628 34.9999 21.4948 34.9999C23.1043 35.0097 24.6769 34.5185 25.9947 33.5944C27.3072 32.6569 28.2447 31.3444 28.7127 29.8444C29.7719 29.6432 30.7682 29.1934 31.6197 28.5319C32.4627 27.8749 33.2127 27.1249 33.6822 26.1874C34.5251 24.7819 34.8071 23.1875 34.6196 21.5945C34.4322 20 33.8697 18.5015 32.8377 17.282ZM21.5878 33.0304C20.0878 33.0304 18.9628 32.5609 17.9323 31.7179C17.9323 31.7179 18.0253 31.6234 18.1198 31.6234L24.1197 28.1554C24.2862 28.0803 24.4196 27.9469 24.4947 27.7804C24.5698 27.636 24.6021 27.4731 24.5877 27.3109V18.875L27.1197 20.375V27.3124C27.1455 28.0547 27.0215 28.7945 26.755 29.4878C26.4885 30.181 26.085 30.8134 25.5687 31.3473C25.0523 31.8811 24.4337 32.3054 23.7497 32.5949C23.0658 32.8843 22.3305 33.0314 21.5878 33.0304ZM9.49488 27.8749C8.83789 26.7499 8.55739 25.4374 8.83789 24.125C8.83789 24.125 8.93239 24.2195 9.02539 24.2195L15.0253 27.6874C15.1693 27.7638 15.3325 27.7966 15.4948 27.7819C15.6823 27.7819 15.8698 27.7819 15.9628 27.6874L23.2753 23.4695V26.3749L17.1823 29.9374C16.5506 30.3042 15.8527 30.5427 15.1287 30.6393C14.4046 30.7358 13.6686 30.6884 12.9629 30.4999C11.4629 30.1249 10.2449 29.1874 9.49488 27.8749ZM7.9004 14.8445C8.56239 13.7234 9.58826 12.8627 10.8074 12.4056V19.532C10.8074 19.718 10.8074 19.907 10.9004 20C10.9755 20.1665 11.1089 20.2998 11.2754 20.375L18.5878 24.5944L16.0573 26.0944L10.0574 22.625C9.41842 22.2639 8.85742 21.7797 8.40684 21.2004C7.95627 20.6211 7.62506 19.9582 7.4324 19.25C7.05741 17.8445 7.1504 16.157 7.9004 14.8445ZM28.6197 19.625L21.3073 15.407L23.8377 13.9071L29.8377 17.375C30.7752 17.9375 31.5252 18.6875 31.9947 19.625C32.4642 20.5625 32.7447 21.5945 32.6502 22.7195C32.5603 23.7755 32.1699 24.7837 31.5252 25.6249C30.8697 26.4694 30.0252 27.1249 28.9947 27.4999V20.375C28.9947 20.1875 28.9947 20 28.9002 19.907C28.9002 19.907 28.8072 19.718 28.6197 19.625ZM31.1502 15.875C31.1502 15.875 31.0572 15.782 30.9627 15.782L24.9627 12.3126C24.7752 12.2196 24.6822 12.2196 24.4947 12.2196C24.3072 12.2196 24.1197 12.2196 24.0252 12.3126L16.7128 16.532V13.6251L22.8073 10.0626C23.7448 9.50009 24.7752 9.31259 25.9002 9.31259C26.9322 9.31259 27.9627 9.68759 28.9002 10.3446C29.7447 11.0001 30.4947 11.8446 30.8697 12.7821C31.2447 13.7196 31.3377 14.8445 31.1502 15.875ZM15.4003 21.125L12.8699 19.625V12.5946C12.8699 11.5626 13.1503 10.4376 13.7128 9.59459C14.2753 8.6571 15.1198 8.0001 16.0573 7.53211C17.0127 7.05249 18.0956 6.88812 19.1503 7.06261C20.1823 7.15711 21.2128 7.62511 22.0573 8.2821C22.0573 8.2821 21.9628 8.3751 21.8698 8.3751L15.8698 11.8446C15.7033 11.9197 15.57 12.0531 15.4948 12.2196C15.4003 12.4071 15.4003 12.5001 15.4003 12.6876V21.125ZM16.7128 18.125L19.9948 16.25L23.2753 18.125V21.875L19.9948 23.75L16.7128 21.875V18.125Z\" fill=\"currentColor\"/>\n</svg>`;\n\nexport const googleLogo = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 40 40\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M37 20.034C27.8809 20.5837 20.5808 27.8809 20.0326 37H19.966C19.4163 27.8809 12.1177 20.5837 3 20.034V19.9674C12.1191 19.4163 19.4163 12.1191 19.966 3H20.0326C20.5822 12.1191 27.8809 19.4163 37 19.9674V20.034Z\" fill=\"currentColor\"/>\n</svg>`;\n\nexport const openrouterLogo = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M3.10913 12.07C3.65512 12.07 5.76627 11.5988 6.85825 10.98C7.95023 10.3612 7.95023 10.3612 10.207 8.75965C13.0642 6.73196 15.0845 7.41088 18.3968 7.41088\" fill=\"currentColor\"/>\n<path d=\"M3.10913 12.07C3.65512 12.07 5.76627 11.5988 6.85825 10.98C7.95023 10.3612 7.95023 10.3612 10.207 8.75965C13.0642 6.73196 15.0845 7.41088 18.3968 7.41088\" stroke=\"currentColor\" stroke-width=\"3.27593\"/>\n<path d=\"M21.6 7.43108L16.0037 10.6622V4.20001L21.6 7.43108Z\" fill=\"currentColor\" stroke=\"currentColor\" stroke-width=\"0.0363992\"/>\n<path d=\"M3 12.072C3.54599 12.072 5.65714 12.5432 6.74912 13.162C7.8411 13.7808 7.8411 13.7808 10.0978 15.3823C12.9551 17.41 14.9753 16.7311 18.2877 16.7311\" fill=\"currentColor\"/>\n<path d=\"M3 12.072C3.54599 12.072 5.65714 12.5432 6.74912 13.162C7.8411 13.7808 7.8411 13.7808 10.0978 15.3823C12.9551 17.41 14.9753 16.7311 18.2877 16.7311\" stroke=\"currentColor\" stroke-width=\"3.27593\"/>\n<path d=\"M21.4909 16.7109L15.8945 13.4798V19.942L21.4909 16.7109Z\" fill=\"currentColor\" stroke=\"currentColor\" stroke-width=\"0.0363992\"/>\n</svg>`;\n\nexport const groqLogo = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 40 40\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M20.056 4.50022C14.0839 4.44597 9.20616 9.15015 9.15036 15.0106C9.09611 20.8726 13.8855 25.6621 19.8576 25.7163H23.6085V21.7391H20.056C16.3252 21.7825 13.2671 18.8468 13.2237 15.1827C13.1787 11.5216 16.1702 8.52086 19.901 8.47746H20.056C23.7868 8.47746 26.8108 11.4457 26.8216 15.1083V24.8809C26.8216 28.5109 23.8085 31.4683 20.1211 31.5132C18.3617 31.5007 16.6759 30.8049 15.42 29.5726L12.551 32.3905C14.5529 34.3571 17.239 35.4715 20.0451 35.4998H20.1877C26.0823 35.413 30.8175 30.7212 30.85 24.9351V14.8603C30.7059 9.0928 25.9165 4.50022 20.056 4.50022Z\" fill=\"currentColor\"/>\n</svg>`;\n\nexport const deepseekLogo = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 40 40\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M35.6638 9.91965C35.3251 9.75432 35.1785 10.0703 34.9811 10.2316C34.9131 10.2836 34.8558 10.3516 34.7985 10.413C34.3025 10.9423 33.7238 11.289 32.9678 11.2476C31.8625 11.1863 30.9186 11.533 30.0839 12.3783C29.9066 11.3356 29.3173 10.7143 28.4213 10.3143C27.9519 10.1063 27.4773 9.89965 27.148 9.44766C26.9186 9.12633 26.856 8.76767 26.7413 8.41568C26.668 8.20235 26.5946 7.98502 26.3506 7.94902C26.084 7.90769 25.98 8.13035 25.876 8.31702C25.4587 9.07967 25.2973 9.91965 25.3133 10.7703C25.3493 12.6849 26.1573 14.2102 27.764 15.2942C27.9466 15.4182 27.9933 15.5435 27.9359 15.7249C27.8266 16.0982 27.696 16.4609 27.5813 16.8355C27.508 17.0742 27.3986 17.1248 27.1426 17.0222C26.2777 16.6504 25.4919 16.1164 24.828 15.4489C23.6854 14.3449 22.6534 13.1263 21.3654 12.1716C21.067 11.9511 20.7606 11.7416 20.4468 11.5436C19.1335 10.2676 20.6201 9.21967 20.9641 9.09567C21.3241 8.965 21.0881 8.51968 19.9254 8.52501C18.7628 8.53035 17.6988 8.91834 16.3428 9.43699C16.1413 9.51421 15.934 9.57529 15.7229 9.61966C14.4557 9.38091 13.1598 9.33506 11.8789 9.48366C9.36565 9.76365 7.35902 10.953 5.88305 12.9809C4.10975 15.4182 3.69243 18.1888 4.20308 21.0768C4.74041 24.122 6.29504 26.6433 8.683 28.6139C11.1603 30.6579 14.0122 31.6592 17.2668 31.4672C19.2428 31.3539 21.4441 31.0886 23.9254 28.9873C24.552 29.2993 25.208 29.4233 26.2986 29.5166C27.1386 29.5953 27.9466 29.4766 28.5719 29.3459C29.5519 29.1379 29.4839 28.23 29.1306 28.0646C26.2573 26.726 26.888 27.2713 26.3133 26.83C27.7746 25.102 29.9746 23.3074 30.8359 17.4928C30.9026 17.0302 30.8452 16.7395 30.8359 16.3662C30.8306 16.1395 30.8826 16.0502 31.1426 16.0249C31.8639 15.95 32.5637 15.7349 33.2025 15.3915C35.0638 14.3742 35.8158 12.7049 35.9931 10.7023C36.0198 10.3956 35.9878 10.081 35.6638 9.91965ZM19.4414 27.9433C16.6562 25.754 15.3055 25.0327 14.7482 25.0634C14.2256 25.0954 14.3202 25.6913 14.4349 26.0807C14.5549 26.4647 14.7109 26.7286 14.9295 27.066C15.0815 27.2886 15.1855 27.6206 14.7789 27.87C13.8816 28.4246 12.3229 27.6833 12.2496 27.6473C10.435 26.578 8.91632 25.1673 7.84834 23.2381C6.81637 21.3808 6.21638 19.3888 6.11771 17.2622C6.09105 16.7475 6.24171 16.5662 6.7537 16.4729C7.42583 16.3442 8.11451 16.3267 8.79233 16.4209C11.6349 16.8368 14.0536 18.1075 16.0828 20.1194C17.2402 21.2661 18.1161 22.6354 19.0188 23.974C19.9788 25.3953 21.0108 26.75 22.3254 27.8593C22.7894 28.2486 23.1587 28.5446 23.5134 28.7619C22.4441 28.8819 20.6601 28.9086 19.4414 27.9433ZM20.7748 19.3568C20.7745 19.2906 20.7904 19.2253 20.8211 19.1666C20.8517 19.1078 20.8962 19.0575 20.9507 19.0198C21.0052 18.9821 21.068 18.9583 21.1337 18.9503C21.1995 18.9424 21.2662 18.9505 21.3281 18.9741C21.407 19.0024 21.475 19.0546 21.5228 19.1235C21.5706 19.1923 21.5958 19.2743 21.5947 19.3581C21.5949 19.4123 21.5843 19.4659 21.5636 19.5159C21.5428 19.5659 21.5123 19.6113 21.4738 19.6494C21.4354 19.6875 21.3897 19.7176 21.3395 19.7378C21.2893 19.7581 21.2356 19.7682 21.1814 19.7675C21.1277 19.7676 21.0745 19.7571 21.0248 19.7365C20.9752 19.7158 20.9302 19.6855 20.8925 19.6473C20.8548 19.609 20.825 19.5636 20.805 19.5138C20.785 19.4639 20.7739 19.4105 20.7748 19.3568ZM24.9213 21.4848C24.6547 21.5928 24.3893 21.6861 24.1347 21.6981C23.7516 21.7114 23.3756 21.5918 23.0707 21.3594C22.7054 21.0528 22.4441 20.8821 22.3347 20.3488C22.297 20.0881 22.3042 19.823 22.3561 19.5648C22.4494 19.1288 22.3454 18.8488 22.0374 18.5955C21.7881 18.3875 21.4694 18.3302 21.1201 18.3302C21.0005 18.3232 20.8843 18.2875 20.7814 18.2262C20.6348 18.1542 20.5148 17.9728 20.6294 17.7488C20.6668 17.6768 20.8428 17.5008 20.8854 17.4688C21.3601 17.1995 21.9081 17.2875 22.4134 17.4902C22.8827 17.6822 23.2374 18.0342 23.748 18.5328C24.2694 19.1341 24.364 19.3008 24.6613 19.7515C24.896 20.1048 25.1093 20.4674 25.2547 20.8821C25.344 21.1421 25.2293 21.3541 24.9213 21.4848Z\" fill=\"currentColor\"/>\n</svg>`;\n\nexport const xaiLogo = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 40 40\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M12.4579 15.6036L26.1529 35H20.0656L6.37059 15.6036H12.4579ZM12.4524 26.3764L15.4974 30.6909L12.4551 35H6.36377L12.4524 26.3764ZM33.6365 7.15727V35H28.647V14.2236L33.6365 7.15727ZM33.6365 5L20.0656 24.2205L17.0206 19.9073L27.5451 5H33.6365Z\" fill=\"currentColor\"/>\n</svg>`;\n\nexport const zaiLogo = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 40 40\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M20.1312 7.50002L17.4088 11.1913H5.81625L8.5375 7.50002H20.1325H20.1312ZM34.0675 28.81L31.3475 32.5H19.795L22.5125 28.81H34.0675ZM35 7.50002L16.58 32.5H5L23.42 7.50002H35Z\" fill=\"currentColor\"/>\n</svg>`;\n\nexport const setuLogo = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 100 100\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M55.0151 11H45.7732C42.9871 11 41.594 11 40.5458 11.7564C39.4977 12.5128 39.0587 13.8349 38.1807 16.479L28.4934 45.6545C26.899 50.4561 26.1019 52.8569 27.2993 54.5162C28.4967 56.1754 31.0264 56.1754 36.0858 56.1754H38.1307C41.9554 56.1754 43.8677 56.1754 45.0206 57.2527C45.2855 57.5002 45.5155 57.7825 45.7043 58.092C46.5262 59.4389 46.1395 61.3117 45.3662 65.0574C42.291 79.9519 40.7534 87.3991 43.0079 88.8933C43.4871 89.2109 44.0292 89.4215 44.5971 89.5107C47.2691 89.9303 51.1621 83.398 58.9481 70.3336L70.7118 50.5949C72.8831 46.9517 73.9687 45.13 73.6853 43.639C73.5201 42.7697 73.0712 41.9797 72.4091 41.3927C71.2734 40.386 69.1528 40.386 64.9115 40.386C61.2258 40.386 59.3829 40.386 58.2863 39.5068C57.6438 38.9916 57.176 38.2907 56.9467 37.4998C56.5553 36.1498 57.2621 34.4479 58.6757 31.044L62.4033 22.0683C64.4825 17.0618 65.5221 14.5585 64.3345 12.7793C63.1468 11 60.4362 11 55.0151 11Z\" fill=\"currentColor\"/>\n</svg>`;\n\nexport const minimaxLogo = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 40 40\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M6 32V12L13 22L20 12V32H17V20L13 26L9 20V32H6ZM22 32V12L29 22L36 12V32H33V20L29 26L25 20V32H22Z\" fill=\"currentColor\"/>\n</svg>`;\n\nexport const opencodeLogo = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path opacity=\"0.2\" d=\"M19.2002 17.4H8.40017V13.8H15.6002V10.2H19.2002V17.4ZM8.40017 13.8H4.80017V10.2H8.40017V13.8Z\" fill=\"currentColor\"/>\n<path d=\"M8.40005 17.4H19.2001V21H4.80005V13.8H8.40005V17.4ZM15.6001 10.2V13.8H8.40005V10.2H15.6001ZM19.2001 10.2H15.6001V6.6H4.80005V3H19.2001V10.2Z\" fill=\"currentColor\"/>\n</svg>`;\n\nexport const copilotLogo = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 40 40\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M35.3993 26.4544C34.2871 28.3855 27.8314 32.9425 20 32.9425C12.1686 32.9425 5.71288 28.3855 4.60075 26.4544C4.5427 26.3532 4.50826 26.2401 4.5 26.1237V22.418C4.51199 22.3209 4.53496 22.2256 4.56846 22.1338C5.04896 20.9261 6.30833 19.1733 7.93325 18.7031C8.14896 18.149 8.468 17.3404 8.76508 16.7437C8.71727 16.2776 8.69485 15.8094 8.69792 15.3409C8.69792 13.6217 9.06217 12.113 10.1601 10.9906C10.6729 10.4662 11.3097 10.0644 12.064 9.76091C13.871 8.29357 16.4453 7.05745 19.9716 7.05745C23.4978 7.05745 26.129 8.29357 27.936 9.76091C28.6903 10.0644 29.3271 10.4662 29.8399 10.9906C30.9378 12.113 31.3021 13.6217 31.3021 15.3409C31.3021 15.8162 31.284 16.2877 31.2349 16.7437C31.532 17.3404 31.851 18.149 32.0667 18.7031C33.6917 19.1733 34.951 20.9261 35.4315 22.1338C35.4677 22.2248 35.4908 22.3205 35.5 22.418V26.1237C35.4917 26.2401 35.4573 26.3532 35.3993 26.4544ZM20.2222 18.7147H19.7778C19.6422 18.945 19.4889 19.1644 19.3193 19.3709C18.3247 20.5941 16.8419 21.2981 14.7881 21.2981C12.56 21.2981 10.9273 20.8344 9.90304 19.6719C9.86495 19.6283 9.82833 19.5835 9.79325 19.5375L9.66667 19.6719V28.1775C11.5202 29.1837 15.4972 30.992 20 30.992C24.5028 30.992 28.4798 29.1837 30.3333 28.1775V19.6719L30.2067 19.5375C30.2067 19.5375 30.1641 19.5957 30.097 19.6719C29.0727 20.8344 27.44 21.2981 25.2119 21.2981C23.1581 21.2981 21.6753 20.5941 20.6807 19.3709C20.5111 19.1644 20.3578 18.945 20.2222 18.7147ZM23.2292 22.9127C23.9383 22.9127 24.5208 23.4952 24.5208 24.2043V26.7877C24.5208 27.4968 23.9383 28.0793 23.2292 28.0793C22.52 28.0793 21.9375 27.4968 21.9375 26.7877V24.2043C21.9375 23.4952 22.52 22.9127 23.2292 22.9127ZM16.7708 22.9127C17.48 22.9127 18.0625 23.4952 18.0625 24.2043V26.7877C18.0625 27.4968 17.48 28.0793 16.7708 28.0793C16.0617 28.0793 15.4792 27.4968 15.4792 26.7877V24.2043C15.4792 23.4952 16.0617 22.9127 16.7708 22.9127ZM21.0501 14.9237C21.2258 16.289 21.5707 17.3947 22.1842 18.149C22.7551 18.8517 23.649 19.3606 25.2119 19.3606C27.2437 19.3606 28.1724 18.9253 28.6438 18.3905C29.1398 17.8287 29.3646 16.9051 29.3646 15.3409C29.3646 13.8684 29.0507 12.9552 28.454 12.3455C27.8378 11.7152 26.7502 11.2321 24.8063 11.0216C22.8856 10.8136 21.975 11.1998 21.5345 11.7049C21.187 12.1014 20.97 12.7485 20.9688 13.7431V13.7702C20.9688 14.1121 20.9959 14.4966 21.0501 14.9237ZM18.9499 14.9237C19.0041 14.4966 19.0312 14.1117 19.0312 13.7689V13.7431C19.03 12.7485 18.813 12.1014 18.4655 11.7049C18.025 11.1998 17.1144 10.8136 15.1937 11.0216C13.2498 11.2321 12.1622 11.7152 11.546 12.3455C10.9493 12.9552 10.6354 13.8684 10.6354 15.3409C10.6354 16.9051 10.8615 17.8287 11.3562 18.3905C11.8276 18.9253 12.7563 19.3606 14.7881 19.3606C16.351 19.3606 17.2449 18.8517 17.8158 18.149C18.4293 17.3947 18.7742 16.289 18.9499 14.9237Z\" fill=\"currentColor\"/>\n</svg>`;\n",
41
+ "import { useQuery } from '@tanstack/react-query';\nimport { apiClient } from '../lib/api-client';\n\nexport function useFiles() {\n\treturn useQuery({\n\t\tqueryKey: ['files'],\n\t\tqueryFn: async () => {\n\t\t\tconst result = await apiClient.listFiles();\n\t\t\treturn result;\n\t\t},\n\t\tstaleTime: 10000,\n\t\trefetchOnWindowFocus: true,\n\t\tretry: 1,\n\t});\n}\n",
42
+ "import { useState, useCallback } from 'react';\nimport type { KeyboardEvent } from 'react';\n\nexport type VimMode = 'normal' | 'insert';\n\ninterface UseVimModeOptions {\n\tenabled: boolean;\n\tonSend: () => void;\n\ttextareaRef: React.RefObject<HTMLTextAreaElement>;\n\tsetMessage: (message: string) => void;\n}\n\ninterface UseVimModeReturn {\n\tvimMode: VimMode;\n\tsetVimMode: (mode: VimMode) => void;\n\thandleVimNormalMode: (e: KeyboardEvent<HTMLTextAreaElement>) => boolean;\n}\n\nexport function useVimMode({\n\tenabled,\n\tonSend,\n\ttextareaRef,\n\tsetMessage,\n}: UseVimModeOptions): UseVimModeReturn {\n\tconst [vimMode, setVimMode] = useState<VimMode>(\n\t\tenabled ? 'normal' : 'insert',\n\t);\n\tconst [vimPendingKey, setVimPendingKey] = useState<string>('');\n\n\tconst findNextWordStart = useCallback((text: string, pos: number): number => {\n\t\twhile (pos < text.length && /\\S/.test(text[pos])) pos++;\n\t\twhile (pos < text.length && /\\s/.test(text[pos])) pos++;\n\t\treturn Math.min(pos, text.length);\n\t}, []);\n\n\tconst findNextWordEnd = useCallback((text: string, pos: number): number => {\n\t\tif (pos < text.length && /\\S/.test(text[pos])) pos++;\n\t\twhile (pos < text.length && /\\s/.test(text[pos])) pos++;\n\t\twhile (pos < text.length && /\\S/.test(text[pos])) pos++;\n\t\treturn Math.max(0, pos - 1);\n\t}, []);\n\n\tconst findPrevWordStart = useCallback((text: string, pos: number): number => {\n\t\tpos = Math.max(0, pos - 1);\n\t\twhile (pos > 0 && /\\s/.test(text[pos])) pos--;\n\t\twhile (pos > 0 && /\\S/.test(text[pos - 1])) pos--;\n\t\treturn pos;\n\t}, []);\n\n\tconst handleVimNormalMode = useCallback(\n\t\t(e: KeyboardEvent<HTMLTextAreaElement>): boolean => {\n\t\t\tconst textarea = textareaRef.current;\n\t\t\tif (!textarea) return false;\n\n\t\t\tconst key = e.key;\n\n\t\t\tif (key === 'i') {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetVimMode('insert');\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (key === 'a') {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetVimMode('insert');\n\t\t\t\tconst pos = textarea.selectionStart;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\ttextarea.setSelectionRange(pos + 1, pos + 1);\n\t\t\t\t}, 0);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (key === 'I') {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetVimMode('insert');\n\t\t\t\tconst text = textarea.value;\n\t\t\t\tconst lineStart =\n\t\t\t\t\ttext.lastIndexOf('\\n', textarea.selectionStart - 1) + 1;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\ttextarea.setSelectionRange(lineStart, lineStart);\n\t\t\t\t}, 0);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (key === 'A') {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetVimMode('insert');\n\t\t\t\tconst text = textarea.value;\n\t\t\t\tlet lineEnd = text.indexOf('\\n', textarea.selectionStart);\n\t\t\t\tif (lineEnd === -1) lineEnd = text.length;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\ttextarea.setSelectionRange(lineEnd, lineEnd);\n\t\t\t\t}, 0);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (key === '0') {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst text = textarea.value;\n\t\t\t\tconst lineStart =\n\t\t\t\t\ttext.lastIndexOf('\\n', textarea.selectionStart - 1) + 1;\n\t\t\t\ttextarea.setSelectionRange(lineStart, lineStart);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (key === '$') {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst text = textarea.value;\n\t\t\t\tlet lineEnd = text.indexOf('\\n', textarea.selectionStart);\n\t\t\t\tif (lineEnd === -1) lineEnd = text.length;\n\t\t\t\ttextarea.setSelectionRange(lineEnd, lineEnd);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (key === 'o') {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetVimMode('insert');\n\t\t\t\tconst text = textarea.value;\n\t\t\t\tlet lineEnd = text.indexOf('\\n', textarea.selectionStart);\n\t\t\t\tif (lineEnd === -1) lineEnd = text.length;\n\n\t\t\t\tconst newValue = `${text.slice(0, lineEnd)}\\n${text.slice(lineEnd)}`;\n\t\t\t\tsetMessage(newValue);\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\ttextarea.setSelectionRange(lineEnd + 1, lineEnd + 1);\n\t\t\t\t}, 0);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (key === 'O') {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetVimMode('insert');\n\t\t\t\tconst text = textarea.value;\n\t\t\t\tconst lineStart =\n\t\t\t\t\ttext.lastIndexOf('\\n', textarea.selectionStart - 1) + 1;\n\n\t\t\t\tconst newValue = `${text.slice(0, lineStart)}\\n${text.slice(lineStart)}`;\n\t\t\t\tsetMessage(newValue);\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\ttextarea.setSelectionRange(lineStart, lineStart);\n\t\t\t\t}, 0);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (vimPendingKey === 'f' && key.length === 1 && key !== 'Escape') {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst text = textarea.value;\n\t\t\t\tconst currentLine = text.slice(\n\t\t\t\t\ttext.lastIndexOf('\\n', textarea.selectionStart - 1) + 1,\n\t\t\t\t\ttext.indexOf('\\n', textarea.selectionStart) === -1\n\t\t\t\t\t\t? text.length\n\t\t\t\t\t\t: text.indexOf('\\n', textarea.selectionStart),\n\t\t\t\t);\n\t\t\t\tconst posInLine =\n\t\t\t\t\ttextarea.selectionStart -\n\t\t\t\t\ttext.lastIndexOf('\\n', textarea.selectionStart - 1) -\n\t\t\t\t\t1;\n\t\t\t\tconst charIndex = currentLine.indexOf(key, posInLine + 1);\n\n\t\t\t\tif (charIndex !== -1) {\n\t\t\t\t\tconst newPos =\n\t\t\t\t\t\ttext.lastIndexOf('\\n', textarea.selectionStart - 1) + 1 + charIndex;\n\t\t\t\t\ttextarea.setSelectionRange(newPos, newPos);\n\t\t\t\t}\n\n\t\t\t\tsetVimPendingKey('');\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (key === 'f') {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetVimPendingKey('f');\n\t\t\t\tsetTimeout(() => setVimPendingKey(''), 2000);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (key === 'd') {\n\t\t\t\tif (vimPendingKey === 'd') {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst text = textarea.value;\n\t\t\t\t\tconst lineStart =\n\t\t\t\t\t\ttext.lastIndexOf('\\n', textarea.selectionStart - 1) + 1;\n\t\t\t\t\tlet lineEnd = text.indexOf('\\n', textarea.selectionStart);\n\t\t\t\t\tif (lineEnd === -1) lineEnd = text.length;\n\t\t\t\t\telse lineEnd += 1;\n\n\t\t\t\t\tconst newValue = text.slice(0, lineStart) + text.slice(lineEnd);\n\t\t\t\t\tsetMessage(newValue);\n\t\t\t\t\tsetVimPendingKey('');\n\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\ttextarea.setSelectionRange(lineStart, lineStart);\n\t\t\t\t\t}, 0);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\te.preventDefault();\n\t\t\t\tsetVimPendingKey('d');\n\t\t\t\tsetTimeout(() => setVimPendingKey(''), 1000);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (key === 'Enter') {\n\t\t\t\te.preventDefault();\n\t\t\t\tonSend();\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (key === 'Escape') {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (key === 'w') {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst text = textarea.value;\n\t\t\t\tconst newPos = findNextWordStart(text, textarea.selectionStart);\n\t\t\t\ttextarea.setSelectionRange(newPos, newPos);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (key === 'e') {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst text = textarea.value;\n\t\t\t\tconst newPos = findNextWordEnd(text, textarea.selectionStart);\n\t\t\t\ttextarea.setSelectionRange(newPos, newPos);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (key === 'b') {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst text = textarea.value;\n\t\t\t\tconst newPos = findPrevWordStart(text, textarea.selectionStart);\n\t\t\t\ttextarea.setSelectionRange(newPos, newPos);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (key === 'x') {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst text = textarea.value;\n\t\t\t\tconst pos = textarea.selectionStart;\n\t\t\t\tif (pos < text.length) {\n\t\t\t\t\tconst newValue = text.slice(0, pos) + text.slice(pos + 1);\n\t\t\t\t\tsetMessage(newValue);\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\ttextarea.setSelectionRange(pos, pos);\n\t\t\t\t\t}, 0);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (key === 's') {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst text = textarea.value;\n\t\t\t\tconst pos = textarea.selectionStart;\n\t\t\t\tif (pos < text.length) {\n\t\t\t\t\tconst newValue = text.slice(0, pos) + text.slice(pos + 1);\n\t\t\t\t\tsetMessage(newValue);\n\t\t\t\t\tsetVimMode('insert');\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\ttextarea.setSelectionRange(pos, pos);\n\t\t\t\t\t}, 0);\n\t\t\t\t} else {\n\t\t\t\t\tsetVimMode('insert');\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (key === 'S') {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst text = textarea.value;\n\t\t\t\tconst lineStart =\n\t\t\t\t\ttext.lastIndexOf('\\n', textarea.selectionStart - 1) + 1;\n\t\t\t\tlet lineEnd = text.indexOf('\\n', textarea.selectionStart);\n\t\t\t\tif (lineEnd === -1) lineEnd = text.length;\n\n\t\t\t\tconst newValue = text.slice(0, lineStart) + text.slice(lineEnd);\n\t\t\t\tsetMessage(newValue);\n\t\t\t\tsetVimMode('insert');\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\ttextarea.setSelectionRange(lineStart, lineStart);\n\t\t\t\t}, 0);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (key === 'h') {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst pos = textarea.selectionStart;\n\t\t\t\tif (pos > 0) {\n\t\t\t\t\ttextarea.setSelectionRange(pos - 1, pos - 1);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (key === 'l') {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst pos = textarea.selectionStart;\n\t\t\t\tif (pos < textarea.value.length) {\n\t\t\t\t\ttextarea.setSelectionRange(pos + 1, pos + 1);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (key === 'j') {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst text = textarea.value;\n\t\t\t\tconst pos = textarea.selectionStart;\n\t\t\t\tconst lineStart = text.lastIndexOf('\\n', pos - 1) + 1;\n\t\t\t\tconst col = pos - lineStart;\n\t\t\t\tconst lineEnd = text.indexOf('\\n', pos);\n\t\t\t\tif (lineEnd !== -1) {\n\t\t\t\t\tconst nextLineStart = lineEnd + 1;\n\t\t\t\t\tlet nextLineEnd = text.indexOf('\\n', nextLineStart);\n\t\t\t\t\tif (nextLineEnd === -1) nextLineEnd = text.length;\n\t\t\t\t\tconst nextLineLen = nextLineEnd - nextLineStart;\n\t\t\t\t\tconst newPos = nextLineStart + Math.min(col, nextLineLen);\n\t\t\t\t\ttextarea.setSelectionRange(newPos, newPos);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (key === 'k') {\n\t\t\t\te.preventDefault();\n\t\t\t\tconst text = textarea.value;\n\t\t\t\tconst pos = textarea.selectionStart;\n\t\t\t\tconst lineStart = text.lastIndexOf('\\n', pos - 1) + 1;\n\t\t\t\tif (lineStart > 0) {\n\t\t\t\t\tconst col = pos - lineStart;\n\t\t\t\t\tconst prevLineEnd = lineStart - 1;\n\t\t\t\t\tconst prevLineStart = text.lastIndexOf('\\n', prevLineEnd - 1) + 1;\n\t\t\t\t\tconst prevLineLen = prevLineEnd - prevLineStart;\n\t\t\t\t\tconst newPos = prevLineStart + Math.min(col, prevLineLen);\n\t\t\t\t\ttextarea.setSelectionRange(newPos, newPos);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\t[\n\t\t\tvimPendingKey,\n\t\t\tonSend,\n\t\t\ttextareaRef,\n\t\t\tsetMessage,\n\t\t\tfindNextWordStart,\n\t\t\tfindNextWordEnd,\n\t\t\tfindPrevWordStart,\n\t\t],\n\t);\n\n\treturn {\n\t\tvimMode,\n\t\tsetVimMode,\n\t\thandleVimNormalMode,\n\t};\n}\n",
43
+ "import { useState, useCallback } from 'react';\n\ninterface UseFileMentionReturn {\n\tshowFileMention: boolean;\n\tmentionQuery: string;\n\tmentionSelectedIndex: number;\n\tcurrentFileToSelect: string | undefined;\n\tsetShowFileMention: (show: boolean) => void;\n\tsetMentionQuery: (query: string) => void;\n\tsetMentionSelectedIndex: (index: number) => void;\n\tsetCurrentFileToSelect: (file: string | undefined) => void;\n\thandleFileSelect: (\n\t\tfilePath: string,\n\t\ttextareaRef: React.RefObject<HTMLTextAreaElement>,\n\t\tsetMessage: (msg: string) => void,\n\t) => void;\n\thandleEnterSelect: (file: string | undefined) => void;\n\tcheckForMention: (value: string, cursorPos: number) => void;\n}\n\nexport function useFileMention(): UseFileMentionReturn {\n\tconst [showFileMention, setShowFileMention] = useState(false);\n\tconst [mentionQuery, setMentionQuery] = useState('');\n\tconst [mentionSelectedIndex, setMentionSelectedIndex] = useState(0);\n\tconst [currentFileToSelect, setCurrentFileToSelect] = useState<\n\t\tstring | undefined\n\t>();\n\n\tconst handleFileSelect = useCallback(\n\t\t(\n\t\t\tfilePath: string,\n\t\t\ttextareaRef: React.RefObject<HTMLTextAreaElement>,\n\t\t\tsetMessage: (msg: string) => void,\n\t\t) => {\n\t\t\tconst textarea = textareaRef.current;\n\t\t\tif (!textarea) return;\n\n\t\t\tconst value = textarea.value;\n\t\t\tconst cursorPos = textarea.selectionStart;\n\t\t\tconst textBeforeCursor = value.slice(0, cursorPos);\n\n\t\t\tconst match = textBeforeCursor.match(/(^|[\\s])@(\\S*)$/);\n\t\t\tif (!match) return;\n\n\t\t\tconst atPos = cursorPos - match[0].length + match[1].length;\n\t\t\tconst newValue = `${value.slice(0, atPos)}@${filePath} ${value.slice(cursorPos)}`;\n\n\t\t\tsetMessage(newValue);\n\t\t\tsetShowFileMention(false);\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tconst newCursorPos = atPos + filePath.length + 2;\n\t\t\t\ttextarea.setSelectionRange(newCursorPos, newCursorPos);\n\t\t\t\ttextarea.focus();\n\t\t\t}, 0);\n\t\t},\n\t\t[],\n\t);\n\n\tconst handleEnterSelect = useCallback((file: string | undefined) => {\n\t\tsetCurrentFileToSelect(file);\n\t}, []);\n\n\tconst checkForMention = useCallback((value: string, cursorPos: number) => {\n\t\tconst textBeforeCursor = value.slice(0, cursorPos);\n\t\tconst match = textBeforeCursor.match(/(^|[\\s])@(\\S*)$/);\n\n\t\tif (match) {\n\t\t\tsetShowFileMention(true);\n\t\t\tsetMentionQuery(match[2]);\n\t\t\tsetMentionSelectedIndex(0);\n\t\t} else {\n\t\t\tsetShowFileMention(false);\n\t\t}\n\t}, []);\n\n\treturn {\n\t\tshowFileMention,\n\t\tmentionQuery,\n\t\tmentionSelectedIndex,\n\t\tcurrentFileToSelect,\n\t\tsetShowFileMention,\n\t\tsetMentionQuery,\n\t\tsetMentionSelectedIndex,\n\t\tsetCurrentFileToSelect,\n\t\thandleFileSelect,\n\t\thandleEnterSelect,\n\t\tcheckForMention,\n\t};\n}\n",
44
+ "import { useState, useCallback } from 'react';\nimport { apiClient } from '../lib/api-client';\n\ninterface UseCommandSuggestionsOptions {\n\tonCommand?: (commandId: string) => void;\n\tupdatePreferences: (prefs: { vimMode?: boolean }) => void;\n\tupdateReasoningText: (enabled: boolean) => void;\n\tvimModeEnabled: boolean;\n\treasoningEnabled: boolean;\n\ttextareaRef: React.RefObject<HTMLTextAreaElement>;\n\tsetMessage: (msg: string) => void;\n\tsetShowShortcutsModal: (show: boolean) => void;\n\tsessionId?: string;\n}\n\ninterface UseCommandSuggestionsReturn {\n\tshowCommandSuggestions: boolean;\n\tcommandQuery: string;\n\tcommandSelectedIndex: number;\n\tcurrentCommandToSelect: string | undefined;\n\tsetShowCommandSuggestions: (show: boolean) => void;\n\tsetCommandQuery: (query: string) => void;\n\tsetCommandSelectedIndex: (index: number) => void;\n\tsetCurrentCommandToSelect: (commandId: string | undefined) => void;\n\thandleCommandSelect: (commandId: string) => void;\n\thandleCommandEnterSelect: (commandId: string | undefined) => void;\n\tcheckForCommand: (value: string) => void;\n}\n\nexport function useCommandSuggestions({\n\tonCommand,\n\tupdatePreferences,\n\tupdateReasoningText,\n\tvimModeEnabled,\n\treasoningEnabled,\n\ttextareaRef,\n\tsetMessage,\n\tsetShowShortcutsModal,\n\tsessionId,\n}: UseCommandSuggestionsOptions): UseCommandSuggestionsReturn {\n\tconst [showCommandSuggestions, setShowCommandSuggestions] = useState(false);\n\tconst [commandQuery, setCommandQuery] = useState('');\n\tconst [commandSelectedIndex, setCommandSelectedIndex] = useState(0);\n\tconst [currentCommandToSelect, setCurrentCommandToSelect] = useState<\n\t\tstring | undefined\n\t>();\n\n\tconst handleCommandSelect = useCallback(\n\t\tasync (commandId: string) => {\n\t\t\tconst resetInput = () => {\n\t\t\t\tsetMessage('');\n\t\t\t\tsetShowCommandSuggestions(false);\n\t\t\t\tif (textareaRef.current) {\n\t\t\t\t\ttextareaRef.current.style.height = 'auto';\n\t\t\t\t}\n\t\t\t\ttextareaRef.current?.focus();\n\t\t\t};\n\n\t\t\tif (commandId === 'help') {\n\t\t\t\tsetShowShortcutsModal(true);\n\t\t\t\tresetInput();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (commandId === 'vim') {\n\t\t\t\tupdatePreferences({ vimMode: !vimModeEnabled });\n\t\t\t\tresetInput();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (commandId === 'reasoning') {\n\t\t\t\tupdateReasoningText(!reasoningEnabled);\n\t\t\t\tresetInput();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (commandId === 'stop') {\n\t\t\t\tif (sessionId) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait apiClient.abortSession(sessionId);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.error('Failed to stop generation:', error);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tresetInput();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (onCommand) {\n\t\t\t\tonCommand(commandId);\n\t\t\t}\n\t\t\tresetInput();\n\t\t},\n\t\t[\n\t\t\tonCommand,\n\t\t\tvimModeEnabled,\n\t\t\treasoningEnabled,\n\t\t\tupdatePreferences,\n\t\t\tupdateReasoningText,\n\t\t\ttextareaRef,\n\t\t\tsetMessage,\n\t\t\tsetShowShortcutsModal,\n\t\t\tsessionId,\n\t\t],\n\t);\n\n\tconst handleCommandEnterSelect = useCallback(\n\t\t(commandId: string | undefined) => {\n\t\t\tsetCurrentCommandToSelect(commandId);\n\t\t},\n\t\t[],\n\t);\n\n\tconst checkForCommand = useCallback((value: string) => {\n\t\tif (value.startsWith('/') && !value.includes(' ')) {\n\t\t\tsetShowCommandSuggestions(true);\n\t\t\tsetCommandQuery(value.slice(1));\n\t\t\tsetCommandSelectedIndex(0);\n\t\t} else {\n\t\t\tsetShowCommandSuggestions(false);\n\t\t}\n\t}, []);\n\n\treturn {\n\t\tshowCommandSuggestions,\n\t\tcommandQuery,\n\t\tcommandSelectedIndex,\n\t\tcurrentCommandToSelect,\n\t\tsetShowCommandSuggestions,\n\t\tsetCommandQuery,\n\t\tsetCommandSelectedIndex,\n\t\tsetCurrentCommandToSelect,\n\t\thandleCommandSelect,\n\t\thandleCommandEnterSelect,\n\t\tcheckForCommand,\n\t};\n}\n",
45
+ "import type { KeyboardEvent } from 'react';\nimport type { VimMode } from '../../hooks/useVimMode';\nimport { COMMANDS } from '../../lib/commands';\n\ninterface ChatInputKeyHandlerOptions {\n\tshowFileMention: boolean;\n\tshowCommandSuggestions: boolean;\n\tmentionSelectedIndex: number;\n\tcommandSelectedIndex: number;\n\tcurrentFileToSelect: string | undefined;\n\tcurrentCommandToSelect: string | undefined;\n\tisPlanMode: boolean;\n\tvimModeEnabled: boolean;\n\tvimMode: VimMode;\n\tsetMentionSelectedIndex: (index: number) => void;\n\tsetCommandSelectedIndex: (index: number) => void;\n\tsetShowFileMention: (show: boolean) => void;\n\tsetShowCommandSuggestions: (show: boolean) => void;\n\tsetIsPlanMode: (mode: boolean) => void;\n\tsetVimMode: (mode: VimMode) => void;\n\thandleFileSelect: (file: string) => void;\n\thandleCommandSelect: (commandId: string) => void;\n\thandleSend: () => void;\n\thandleVimNormalMode: (e: KeyboardEvent<HTMLTextAreaElement>) => boolean;\n\tonPlanModeToggle?: (isPlanMode: boolean) => void;\n}\n\nexport function createChatInputKeyHandler(options: ChatInputKeyHandlerOptions) {\n\treturn (e: KeyboardEvent<HTMLTextAreaElement>) => {\n\t\tconst {\n\t\t\tshowFileMention,\n\t\t\tshowCommandSuggestions,\n\t\t\tmentionSelectedIndex,\n\t\t\tcommandSelectedIndex,\n\t\t\tcurrentFileToSelect,\n\t\t\tcurrentCommandToSelect,\n\t\t\tisPlanMode,\n\t\t\tvimModeEnabled,\n\t\t\tvimMode,\n\t\t\tsetMentionSelectedIndex,\n\t\t\tsetCommandSelectedIndex,\n\t\t\tsetShowFileMention,\n\t\t\tsetShowCommandSuggestions,\n\t\t\tsetIsPlanMode,\n\t\t\tsetVimMode,\n\t\t\thandleFileSelect,\n\t\t\thandleCommandSelect,\n\t\t\thandleSend,\n\t\t\thandleVimNormalMode,\n\t\t\tonPlanModeToggle,\n\t\t} = options;\n\n\t\tif (showCommandSuggestions) {\n\t\t\tconst count = COMMANDS.length;\n\t\t\tif (e.key === 'ArrowDown' || (e.ctrlKey && e.key === 'j')) {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetCommandSelectedIndex((commandSelectedIndex + 1) % count);\n\t\t\t} else if (e.key === 'ArrowUp' || (e.ctrlKey && e.key === 'k')) {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetCommandSelectedIndex((commandSelectedIndex - 1 + count) % count);\n\t\t\t} else if (e.key === 'Enter') {\n\t\t\t\te.preventDefault();\n\t\t\t\tif (currentCommandToSelect) {\n\t\t\t\t\thandleCommandSelect(currentCommandToSelect);\n\t\t\t\t}\n\t\t\t} else if (e.key === 'Escape') {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetShowCommandSuggestions(false);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (showFileMention) {\n\t\t\tif (e.key === 'ArrowDown' || (e.ctrlKey && e.key === 'j')) {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetMentionSelectedIndex((mentionSelectedIndex + 1) % 20);\n\t\t\t} else if (e.key === 'ArrowUp' || (e.ctrlKey && e.key === 'k')) {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetMentionSelectedIndex((mentionSelectedIndex - 1 + 20) % 20);\n\t\t\t} else if (e.key === 'Enter') {\n\t\t\t\te.preventDefault();\n\t\t\t\tif (currentFileToSelect) {\n\t\t\t\t\thandleFileSelect(currentFileToSelect);\n\t\t\t\t}\n\t\t\t} else if (e.key === 'Escape') {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetShowFileMention(false);\n\t\t\t\tif (vimModeEnabled) {\n\t\t\t\t\tsetVimMode('normal');\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (vimModeEnabled && vimMode === 'normal') {\n\t\t\tconst handled = handleVimNormalMode(e);\n\t\t\tif (handled) return;\n\t\t}\n\n\t\tif (vimModeEnabled && vimMode === 'insert' && e.key === 'Escape') {\n\t\t\te.preventDefault();\n\t\t\tsetVimMode('normal');\n\t\t\treturn;\n\t\t}\n\n\t\tif (e.key === 'Tab') {\n\t\t\te.preventDefault();\n\t\t\tconst newPlanMode = !isPlanMode;\n\t\t\tsetIsPlanMode(newPlanMode);\n\t\t\tonPlanModeToggle?.(newPlanMode);\n\t\t} else if (\n\t\t\te.key === 'Enter' &&\n\t\t\t!e.shiftKey &&\n\t\t\t(!vimModeEnabled || vimMode === 'normal')\n\t\t) {\n\t\t\te.preventDefault();\n\t\t\thandleSend();\n\t\t}\n\t};\n}\n",
46
+ "import { create } from 'zustand';\n\ninterface SetuSubscription {\n\tactive: boolean;\n\ttierId?: string;\n\ttierName?: string;\n\tcreditsIncluded?: number;\n\tcreditsUsed?: number;\n\tcreditsRemaining?: number;\n\tperiodStart?: string;\n\tperiodEnd?: string;\n}\n\ninterface SetuPayg {\n\twalletBalanceUsd: number;\n\taccountBalanceUsd: number;\n\trawPoolUsd: number;\n\teffectiveSpendableUsd: number;\n}\n\ninterface SetuLimits {\n\tenabled: boolean;\n\tdailyLimitUsd: number | null;\n\tdailySpentUsd: number;\n\tdailyRemainingUsd: number | null;\n\tmonthlyLimitUsd: number | null;\n\tmonthlySpentUsd: number;\n\tmonthlyRemainingUsd: number | null;\n\tcapRemainingUsd: number | null;\n}\n\ninterface SetuState {\n\tbalance: number | null;\n\tusdcBalance: number | null;\n\tnetwork: 'mainnet' | 'devnet';\n\tisPaymentPending: boolean;\n\tlastPaymentAmount: number | null;\n\twalletAddress: string | null;\n\tisLoading: boolean;\n\tisTopupModalOpen: boolean;\n\tscope: 'wallet' | 'account' | null;\n\tpayg: SetuPayg | null;\n\tsubscription: SetuSubscription | null;\n\tlimits: SetuLimits | null;\n\tsetBalance: (balance: number | null) => void;\n\tsetUsdcBalance: (usdcBalance: number | null) => void;\n\tsetNetwork: (network: 'mainnet' | 'devnet') => void;\n\tsetPaymentPending: (pending: boolean) => void;\n\tsetLastPaymentAmount: (amount: number | null) => void;\n\tsetWalletAddress: (address: string | null) => void;\n\tsetLoading: (loading: boolean) => void;\n\topenTopupModal: () => void;\n\tcloseTopupModal: () => void;\n\tsetScope: (scope: 'wallet' | 'account' | null) => void;\n\tsetPayg: (payg: SetuPayg | null) => void;\n\tsetSubscription: (subscription: SetuSubscription | null) => void;\n\tsetLimits: (limits: SetuLimits | null) => void;\n}\n\nexport const useSetuStore = create<SetuState>((set) => ({\n\tbalance: null,\n\tusdcBalance: null,\n\tnetwork: 'mainnet',\n\tisPaymentPending: false,\n\tlastPaymentAmount: null,\n\twalletAddress: null,\n\tisLoading: false,\n\tisTopupModalOpen: false,\n\tscope: null,\n\tpayg: null,\n\tsubscription: null,\n\tlimits: null,\n\tsetBalance: (balance) => set({ balance }),\n\tsetUsdcBalance: (usdcBalance) => set({ usdcBalance }),\n\tsetNetwork: (network) => set({ network }),\n\tsetPaymentPending: (isPaymentPending) => set({ isPaymentPending }),\n\tsetLastPaymentAmount: (lastPaymentAmount) => set({ lastPaymentAmount }),\n\tsetWalletAddress: (walletAddress) => set({ walletAddress }),\n\tsetLoading: (isLoading) => set({ isLoading }),\n\topenTopupModal: () => set({ isTopupModalOpen: true }),\n\tcloseTopupModal: () => set({ isTopupModalOpen: false }),\n\tsetScope: (scope) => set({ scope }),\n\tsetPayg: (payg) => set({ payg }),\n\tsetSubscription: (subscription) => set({ subscription }),\n\tsetLimits: (limits) => set({ limits }),\n}));\n",
47
+ "import {\n\tmemo,\n\tuseState,\n\tuseCallback,\n\tuseEffect,\n\tuseRef,\n\tforwardRef,\n\tuseImperativeHandle,\n\tuseMemo,\n} from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useSendMessage, useMessages } from '../../hooks/useMessages';\nimport {\n\tuseSession,\n\tuseUpdateSession,\n\tuseDeleteSession,\n} from '../../hooks/useSessions';\nimport { useAllModels, useConfig } from '../../hooks/useConfig';\nimport { useGitStatus, useStageFiles } from '../../hooks/useGit';\nimport { useGitStore } from '../../stores/gitStore';\nimport { useFileUpload } from '../../hooks/useFileUpload';\nimport { useQueueStore } from '../../stores/queueStore';\nimport { usePendingResearchStore } from '../../stores/pendingResearchStore';\nimport { formatResearchContextForMessage } from '../../lib/parseResearchContext';\nimport { useSetuBalance } from '../../hooks/useSetuBalance';\nimport { useSetuStore } from '../../stores/setuStore';\nimport { toast } from '../../stores/toastStore';\nimport { useToastStore } from '../../stores/toastStore';\nimport { apiClient } from '../../lib/api-client';\nimport { ChatInput } from './ChatInput';\nimport { ConfigModal } from './ConfigModal';\n\ninterface ChatInputContainerProps {\n\tsessionId: string;\n\tuserContext?: string;\n\tonNewSession?: () => void;\n\tonDeleteSession?: () => void;\n}\n\nexport interface ChatInputContainerRef {\n\tfocus: () => void;\n}\n\nexport const ChatInputContainer = memo(\n\tforwardRef<ChatInputContainerRef, ChatInputContainerProps>(\n\t\tfunction ChatInputContainer(\n\t\t\t{ sessionId, userContext, onNewSession, onDeleteSession },\n\t\t\tref,\n\t\t) {\n\t\t\tconst session = useSession(sessionId);\n\t\t\tconst [agent, setAgent] = useState('');\n\t\t\tconst [provider, setProvider] = useState('');\n\t\t\tconst [model, setModel] = useState('');\n\t\t\tconst [isConfigOpen, setIsConfigOpen] = useState(false);\n\t\t\tconst [configFocusTarget, setConfigFocusTarget] = useState<\n\t\t\t\t'agent' | 'model' | null\n\t\t\t>(null);\n\t\t\tconst [inputKey, setInputKey] = useState(0);\n\n\t\t\tconst chatInputRef = useRef<{\n\t\t\t\tfocus: () => void;\n\t\t\t\tsetValue: (value: string) => void;\n\t\t\t}>(null);\n\n\t\t\tconst sendMessage = useSendMessage(sessionId);\n\t\t\tuseMessages(sessionId);\n\t\t\tconst updateSession = useUpdateSession(sessionId);\n\t\t\tconst deleteSession = useDeleteSession();\n\t\t\tconst { data: allModels } = useAllModels();\n\t\t\tconst { data: config } = useConfig();\n\t\t\tconst { data: gitStatus } = useGitStatus();\n\t\t\tconst stageFiles = useStageFiles();\n\t\t\tconst openCommitModalForSession = useGitStore(\n\t\t\t\t(state) => state.openCommitModalForSession,\n\t\t\t);\n\t\t\tconst setActiveSessionId = useGitStore(\n\t\t\t\t(state) => state.setActiveSessionId,\n\t\t\t);\n\t\t\tconst queryClient = useQueryClient();\n\n\t\t\tconst modelSupportsReasoning = allModels?.[provider]?.models?.find(\n\t\t\t\t(m) => m.id === model,\n\t\t\t)?.reasoningText;\n\n\t\t\tconst modelSupportsVision = allModels?.[provider]?.models?.find(\n\t\t\t\t(m) => m.id === model,\n\t\t\t)?.vision;\n\n\t\t\tconst modelSupportsAttachment = allModels?.[provider]?.models?.find(\n\t\t\t\t(m) => m.id === model,\n\t\t\t)?.attachment;\n\n\t\t\tconst {\n\t\t\t\timages,\n\t\t\t\tdocuments,\n\t\t\t\tisDragging,\n\t\t\t\tremoveFile,\n\t\t\t\tclearFiles,\n\t\t\t\thandlePaste,\n\t\t\t} = useFileUpload({\n\t\t\t\tsupportsImages: !!modelSupportsVision,\n\t\t\t\tsupportsFileAttachments: !!modelSupportsAttachment,\n\t\t\t\tonError: toast.error,\n\t\t\t});\n\n\t\t\tconst pendingContextsMap = usePendingResearchStore(\n\t\t\t\t(state) => state.pendingContexts,\n\t\t\t);\n\t\t\tconst removeResearchContext = usePendingResearchStore(\n\t\t\t\t(state) => state.removeContext,\n\t\t\t);\n\t\t\tconst consumeResearchContexts = usePendingResearchStore(\n\t\t\t\t(state) => state.consumeContexts,\n\t\t\t);\n\n\t\t\tconst pendingResearchContexts = pendingContextsMap.get(sessionId) || [];\n\n\t\t\tconst researchContexts = useMemo(\n\t\t\t\t() =>\n\t\t\t\t\tpendingResearchContexts.map((ctx) => ({\n\t\t\t\t\t\tid: ctx.id,\n\t\t\t\t\t\tlabel: ctx.label,\n\t\t\t\t\t})),\n\t\t\t\t[pendingResearchContexts],\n\t\t\t);\n\n\t\t\tconst handleResearchContextRemove = useCallback(\n\t\t\t\t(contextId: string) => {\n\t\t\t\t\tremoveResearchContext(sessionId, contextId);\n\t\t\t\t},\n\t\t\t\t[sessionId, removeResearchContext],\n\t\t\t);\n\n\t\t\tconst providerAuthType = allModels?.[provider]?.authType;\n\n\t\t\tconst { fetchBalance } = useSetuBalance(provider);\n\t\t\tconst isBalanceLoading = useSetuStore((s) => s.isLoading);\n\n\t\t\tuseEffect(() => {\n\t\t\t\tif (session) {\n\t\t\t\t\tsetAgent(session.agent);\n\t\t\t\t\tsetProvider(session.provider);\n\t\t\t\t\tsetModel(session.model);\n\t\t\t\t}\n\t\t\t}, [session]);\n\n\t\t\tuseEffect(() => {\n\t\t\t\tsetActiveSessionId(sessionId);\n\t\t\t\treturn () => setActiveSessionId(null);\n\t\t\t}, [sessionId, setActiveSessionId]);\n\n\t\t\tuseEffect(() => {\n\t\t\t\tsetInputKey((prev) => prev + 1);\n\t\t\t}, []);\n\n\t\t\tconst pendingRestoreText = useQueueStore(\n\t\t\t\t(state) => state.pendingRestoreText,\n\t\t\t);\n\t\t\tconst consumeRestoreText = useQueueStore(\n\t\t\t\t(state) => state.consumeRestoreText,\n\t\t\t);\n\n\t\t\tuseEffect(() => {\n\t\t\t\tif (pendingRestoreText) {\n\t\t\t\t\tconst text = consumeRestoreText();\n\t\t\t\t\tif (text) {\n\t\t\t\t\t\tchatInputRef.current?.setValue(text);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, [pendingRestoreText, consumeRestoreText]);\n\n\t\t\tuseImperativeHandle(ref, () => ({\n\t\t\t\tfocus: () => {\n\t\t\t\t\tchatInputRef.current?.focus();\n\t\t\t\t},\n\t\t\t}));\n\n\t\t\tconst handleSendMessage = useCallback(\n\t\t\t\tasync (content: string) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst researchCtxs = consumeResearchContexts(sessionId);\n\t\t\t\t\t\tconst researchPrefix =\n\t\t\t\t\t\t\tformatResearchContextForMessage(researchCtxs);\n\t\t\t\t\t\tconst finalContent = researchPrefix\n\t\t\t\t\t\t\t? `${researchPrefix}\\n\\n${content}`\n\t\t\t\t\t\t\t: content;\n\n\t\t\t\t\t\tconst imageData =\n\t\t\t\t\t\t\timages.length > 0\n\t\t\t\t\t\t\t\t? images.map((img) => ({\n\t\t\t\t\t\t\t\t\t\tdata: img.data,\n\t\t\t\t\t\t\t\t\t\tmediaType: img.mediaType,\n\t\t\t\t\t\t\t\t\t}))\n\t\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\tconst fileData =\n\t\t\t\t\t\t\tdocuments.length > 0\n\t\t\t\t\t\t\t\t? documents.map((f) => ({\n\t\t\t\t\t\t\t\t\t\ttype: f.type,\n\t\t\t\t\t\t\t\t\t\tname: f.name,\n\t\t\t\t\t\t\t\t\t\tdata: f.data,\n\t\t\t\t\t\t\t\t\t\tmediaType: f.mediaType,\n\t\t\t\t\t\t\t\t\t\ttextContent: f.textContent,\n\t\t\t\t\t\t\t\t\t}))\n\t\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\tawait sendMessage.mutateAsync({\n\t\t\t\t\t\t\tcontent: finalContent,\n\t\t\t\t\t\t\timages: imageData,\n\t\t\t\t\t\t\tfiles: fileData,\n\t\t\t\t\t\t\tagent: agent || undefined,\n\t\t\t\t\t\t\tprovider: provider || undefined,\n\t\t\t\t\t\t\tmodel: model || undefined,\n\t\t\t\t\t\t\tuserContext: userContext || undefined,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tclearFiles();\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.error('Failed to send message:', error);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t[\n\t\t\t\t\tsendMessage,\n\t\t\t\t\tdocuments,\n\t\t\t\t\timages,\n\t\t\t\t\tclearFiles,\n\t\t\t\t\tagent,\n\t\t\t\t\tprovider,\n\t\t\t\t\tmodel,\n\t\t\t\t\tuserContext,\n\t\t\t\t\tsessionId,\n\t\t\t\t\tconsumeResearchContexts,\n\t\t\t\t],\n\t\t\t);\n\n\t\t\tconst handleToggleConfig = useCallback(() => {\n\t\t\t\tsetIsConfigOpen((prev) => !prev);\n\t\t\t}, []);\n\n\t\t\tconst handleCloseConfig = useCallback(() => {\n\t\t\t\tsetIsConfigOpen(false);\n\t\t\t\tsetConfigFocusTarget(null);\n\t\t\t}, []);\n\n\t\t\tconst handleCommand = useCallback(\n\t\t\t\tasync (commandId: string) => {\n\t\t\t\t\tif (commandId === 'models') {\n\t\t\t\t\t\tsetConfigFocusTarget('model');\n\t\t\t\t\t\tsetIsConfigOpen(true);\n\t\t\t\t\t} else if (commandId === 'agents') {\n\t\t\t\t\t\tsetConfigFocusTarget('agent');\n\t\t\t\t\t\tsetIsConfigOpen(true);\n\t\t\t\t\t} else if (commandId === 'new') {\n\t\t\t\t\t\tonNewSession?.();\n\t\t\t\t\t} else if (commandId === 'stage') {\n\t\t\t\t\t\tconst unstagedPaths = gitStatus?.unstaged?.map((f) => f.path) ?? [];\n\t\t\t\t\t\tconst untrackedPaths =\n\t\t\t\t\t\t\tgitStatus?.untracked?.map((f) => f.path) ?? [];\n\t\t\t\t\t\tconst allUnstaged = [...unstagedPaths, ...untrackedPaths];\n\t\t\t\t\t\tif (allUnstaged.length > 0) {\n\t\t\t\t\t\t\tstageFiles.mutate(allUnstaged);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (commandId === 'commit') {\n\t\t\t\t\t\topenCommitModalForSession(sessionId);\n\t\t\t\t\t} else if (commandId === 'compact') {\n\t\t\t\t\t\thandleSendMessage('/compact');\n\t\t\t\t\t} else if (commandId === 'delete') {\n\t\t\t\t\t\tdeleteSession.mutate(sessionId, {\n\t\t\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\t\t\tonDeleteSession?.();\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (commandId === 'share') {\n\t\t\t\t\t\tconst toastId = toast.loading('Sharing session...');\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst result = await apiClient.shareSession(sessionId);\n\t\t\t\t\t\t\tif (result.shared) {\n\t\t\t\t\t\t\t\ttoast.successWithAction(\n\t\t\t\t\t\t\t\t\tresult.message === 'Already shared'\n\t\t\t\t\t\t\t\t\t\t? 'Already shared'\n\t\t\t\t\t\t\t\t\t\t: 'Session shared!',\n\t\t\t\t\t\t\t\t\t{ label: 'Open', href: result.url },\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tqueryClient.invalidateQueries({\n\t\t\t\t\t\t\t\t\tqueryKey: ['share-status', sessionId],\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\ttoast.error(\n\t\t\t\t\t\t\t\terror instanceof Error ? error.message : 'Failed to share',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tuseToastStore.getState().removeToast(toastId);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (commandId === 'sync') {\n\t\t\t\t\t\tconst toastId = toast.loading('Syncing session...');\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst result = await apiClient.syncSession(sessionId);\n\t\t\t\t\t\t\tif (result.synced) {\n\t\t\t\t\t\t\t\tconst msg =\n\t\t\t\t\t\t\t\t\tresult.newMessages > 0\n\t\t\t\t\t\t\t\t\t\t? `Synced ${result.newMessages} new messages`\n\t\t\t\t\t\t\t\t\t\t: 'Already synced';\n\t\t\t\t\t\t\t\ttoast.successWithAction(msg, {\n\t\t\t\t\t\t\t\t\tlabel: 'Open',\n\t\t\t\t\t\t\t\t\thref: result.url,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tqueryClient.invalidateQueries({\n\t\t\t\t\t\t\t\t\tqueryKey: ['share-status', sessionId],\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\ttoast.error(\n\t\t\t\t\t\t\t\terror instanceof Error ? error.message : 'Failed to sync',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tuseToastStore.getState().removeToast(toastId);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t[\n\t\t\t\t\tonNewSession,\n\t\t\t\t\tgitStatus,\n\t\t\t\t\tstageFiles,\n\t\t\t\t\topenCommitModalForSession,\n\t\t\t\t\thandleSendMessage,\n\t\t\t\t\tdeleteSession,\n\t\t\t\t\tsessionId,\n\t\t\t\t\tonDeleteSession,\n\t\t\t\t\tqueryClient,\n\t\t\t\t],\n\t\t\t);\n\n\t\t\tconst handleAgentChange = useCallback(\n\t\t\t\tasync (value: string) => {\n\t\t\t\t\tsetAgent(value);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait updateSession.mutateAsync({ agent: value });\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.error('Failed to update agent:', error);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t[updateSession],\n\t\t\t);\n\n\t\t\tconst handleModelSelectorChange = useCallback(\n\t\t\t\tasync (newProvider: string, newModel: string) => {\n\t\t\t\t\tsetProvider(newProvider);\n\t\t\t\t\tsetModel(newModel);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait updateSession.mutateAsync({\n\t\t\t\t\t\t\tprovider: newProvider,\n\t\t\t\t\t\t\tmodel: newModel,\n\t\t\t\t\t\t});\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.error('Failed to update model:', error);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t[updateSession],\n\t\t\t);\n\n\t\t\tconst handleProviderChange = useCallback(\n\t\t\t\tasync (newProvider: string) => {\n\t\t\t\t\tsetProvider(newProvider);\n\t\t\t\t\tif (model) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait updateSession.mutateAsync({\n\t\t\t\t\t\t\t\tprovider: newProvider,\n\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconsole.error('Failed to update provider:', error);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t[model, updateSession],\n\t\t\t);\n\n\t\t\tconst handleModelChange = useCallback(\n\t\t\t\tasync (newModel: string) => {\n\t\t\t\t\tsetModel(newModel);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait updateSession.mutateAsync({ provider, model: newModel });\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.error('Failed to update model:', error);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t[provider, updateSession],\n\t\t\t);\n\n\t\t\tconst handlePlanModeToggle = useCallback(\n\t\t\t\tasync (isPlanMode: boolean) => {\n\t\t\t\t\tconst newAgent = isPlanMode ? 'plan' : 'build';\n\t\t\t\t\tsetAgent(newAgent);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait updateSession.mutateAsync({ agent: newAgent });\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.error('Failed to switch agent:', error);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t[updateSession],\n\t\t\t);\n\n\t\t\treturn (\n\t\t\t\t<>\n\t\t\t\t\t<ConfigModal\n\t\t\t\t\t\tisOpen={isConfigOpen}\n\t\t\t\t\t\tonClose={handleCloseConfig}\n\t\t\t\t\t\tinitialFocus={configFocusTarget}\n\t\t\t\t\t\tchatInputRef={chatInputRef}\n\t\t\t\t\t\tagent={agent}\n\t\t\t\t\t\tprovider={provider}\n\t\t\t\t\t\tmodel={model}\n\t\t\t\t\t\tmodelSupportsReasoning={modelSupportsReasoning}\n\t\t\t\t\t\tonAgentChange={handleAgentChange}\n\t\t\t\t\t\tonProviderChange={handleProviderChange}\n\t\t\t\t\t\tonModelChange={handleModelChange}\n\t\t\t\t\t\tonModelSelectorChange={handleModelSelectorChange}\n\t\t\t\t\t/>\n\t\t\t\t\t<ChatInput\n\t\t\t\t\t\tref={chatInputRef}\n\t\t\t\t\t\tkey={inputKey}\n\t\t\t\t\t\tonSend={handleSendMessage}\n\t\t\t\t\t\tonCommand={handleCommand}\n\t\t\t\t\t\tdisabled={sendMessage.isPending}\n\t\t\t\t\t\tonConfigClick={handleToggleConfig}\n\t\t\t\t\t\tonPlanModeToggle={handlePlanModeToggle}\n\t\t\t\t\t\tisPlanMode={agent === 'plan'}\n\t\t\t\t\t\treasoningEnabled={\n\t\t\t\t\t\t\tmodelSupportsReasoning &&\n\t\t\t\t\t\t\t(config?.defaults?.reasoningText ?? true)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsessionId={sessionId}\n\t\t\t\t\t\timages={images}\n\t\t\t\t\t\tdocuments={documents}\n\t\t\t\t\t\tonFileRemove={removeFile}\n\t\t\t\t\t\tisDragging={isDragging}\n\t\t\t\t\t\tonPaste={handlePaste}\n\t\t\t\t\t\tvisionEnabled={modelSupportsVision}\n\t\t\t\t\t\tattachmentEnabled={modelSupportsAttachment}\n\t\t\t\t\t\tmodelName={model}\n\t\t\t\t\t\tproviderName={provider}\n\t\t\t\t\t\tauthType={providerAuthType}\n\t\t\t\t\t\tresearchContexts={researchContexts}\n\t\t\t\t\t\tonResearchContextRemove={handleResearchContextRemove}\n\t\t\t\t\t\tonRefreshBalance={provider === 'setu' ? fetchBalance : undefined}\n\t\t\t\t\t\tisBalanceLoading={isBalanceLoading}\n\t\t\t\t\t\tonModelInfoClick={() => {\n\t\t\t\t\t\t\tsetConfigFocusTarget('model');\n\t\t\t\t\t\t\tsetIsConfigOpen(true);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tagent={agent}\n\t\t\t\t\t\tagents={config?.agents}\n\t\t\t\t\t\tonAgentChange={handleAgentChange}\n\t\t\t\t\t/>\n\t\t\t\t</>\n\t\t\t);\n\t\t},\n\t),\n);\n",
48
+ "import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiClient } from '../lib/api-client';\nimport type { SendMessageRequest } from '../types/api';\nimport { sessionsQueryKey } from './useSessions';\n\nexport function useMessages(sessionId: string | undefined) {\n\treturn useQuery({\n\t\tqueryKey: ['messages', sessionId],\n\t\tqueryFn: () => {\n\t\t\tif (!sessionId) {\n\t\t\t\tthrow new Error('Session ID is required');\n\t\t\t}\n\t\t\treturn apiClient.getMessages(sessionId);\n\t\t},\n\t\tenabled: !!sessionId,\n\t});\n}\n\nexport function useSendMessage(sessionId: string) {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: (data: SendMessageRequest) =>\n\t\t\tapiClient.sendMessage(sessionId, data),\n\t\tonSuccess: () => {\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['messages', sessionId] });\n\t\t\tqueryClient.invalidateQueries({ queryKey: sessionsQueryKey });\n\t\t},\n\t});\n}\n",
49
+ "import {\n\tuseInfiniteQuery,\n\tuseMutation,\n\tuseQueryClient,\n} from '@tanstack/react-query';\nimport { useMemo } from 'react';\nimport { apiClient } from '../lib/api-client';\nimport type {\n\tCreateSessionRequest,\n\tUpdateSessionRequest,\n\tSession,\n\tSessionsPage,\n} from '../types/api';\n\nconst SESSIONS_PAGE_SIZE = 50;\n\nexport const sessionsQueryKey = ['sessions', 'list'] as const;\n\nexport function useSessionsInfinite() {\n\treturn useInfiniteQuery({\n\t\tqueryKey: sessionsQueryKey,\n\t\tqueryFn: ({ pageParam = 0 }) =>\n\t\t\tapiClient.getSessionsPage({\n\t\t\t\tlimit: SESSIONS_PAGE_SIZE,\n\t\t\t\toffset: pageParam,\n\t\t\t}),\n\t\tgetNextPageParam: (lastPage) => lastPage.nextOffset ?? undefined,\n\t\tinitialPageParam: 0,\n\t\tstaleTime: 30_000,\n\t\trefetchInterval: 30_000,\n\t\trefetchOnWindowFocus: false,\n\t});\n}\n\nexport function useSessions() {\n\tconst query = useSessionsInfinite();\n\tconst data = useMemo<Session[]>(() => {\n\t\tif (!query.data?.pages) return [];\n\t\treturn query.data.pages.flatMap((p) => p.items ?? []);\n\t}, [query.data]);\n\n\treturn {\n\t\tdata,\n\t\tisLoading: query.isLoading,\n\t\tisError: query.isError,\n\t\terror: query.error,\n\t\thasNextPage: query.hasNextPage,\n\t\tfetchNextPage: query.fetchNextPage,\n\t\tisFetchingNextPage: query.isFetchingNextPage,\n\t};\n}\n\nexport function useSession(sessionId: string) {\n\tconst { data: sessions } = useSessions();\n\treturn sessions?.find((s) => s.id === sessionId);\n}\n\nexport function useCreateSession() {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: (data: CreateSessionRequest) => apiClient.createSession(data),\n\t\tonSuccess: (newSession) => {\n\t\t\tqueryClient.setQueryData<{ pages: SessionsPage[]; pageParams: number[] }>(\n\t\t\t\tsessionsQueryKey,\n\t\t\t\t(old) => {\n\t\t\t\t\tif (!old) return old;\n\t\t\t\t\tconst firstPage = old.pages[0];\n\t\t\t\t\tif (!firstPage) return old;\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...old,\n\t\t\t\t\t\tpages: [\n\t\t\t\t\t\t\t{ ...firstPage, items: [newSession, ...firstPage.items] },\n\t\t\t\t\t\t\t...old.pages.slice(1),\n\t\t\t\t\t\t],\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t);\n\t\t\tqueryClient.invalidateQueries({ queryKey: sessionsQueryKey });\n\t\t},\n\t});\n}\n\nexport function useUpdateSession(sessionId: string) {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: (data: UpdateSessionRequest) =>\n\t\t\tapiClient.updateSession(sessionId, data),\n\t\tonSuccess: async () => {\n\t\t\tawait queryClient.invalidateQueries({ queryKey: sessionsQueryKey });\n\t\t\tawait queryClient.invalidateQueries({ queryKey: ['session', sessionId] });\n\t\t},\n\t});\n}\n\nexport function useDeleteSession() {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: (sessionId: string) => apiClient.deleteSession(sessionId),\n\t\tonSuccess: () => {\n\t\t\tqueryClient.invalidateQueries({ queryKey: sessionsQueryKey });\n\t\t},\n\t});\n}\n",
50
+ "import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiClient } from '../lib/api-client';\nimport { useGitStore } from '../stores/gitStore';\n\nexport function useGitStatus() {\n\tconst isExpanded = useGitStore((state) => state.isExpanded);\n\n\treturn useQuery({\n\t\tqueryKey: ['git', 'status'],\n\t\tqueryFn: () => apiClient.getGitStatus(),\n\t\t// Only poll when sidebar is expanded to reduce unnecessary requests\n\t\t// Disabled during active generation to prevent interference\n\t\trefetchInterval: isExpanded ? 5000 : false, // Poll every 5 seconds when expanded\n\t\tretry: 1,\n\t\t// Keep data fresh but don't spam the server\n\t\tstaleTime: 3000,\n\t});\n}\n\nexport function useGitDiff(file: string | null, staged = false) {\n\treturn useQuery({\n\t\tqueryKey: ['git', 'diff', file, staged],\n\t\tqueryFn: () => (file ? apiClient.getGitDiff(file, staged) : null),\n\t\tenabled: !!file,\n\t\tretry: 1,\n\t\t// Don't refetch automatically for diff views\n\t\trefetchInterval: false,\n\t});\n}\n\nexport function useGitBranch() {\n\tconst isExpanded = useGitStore((state) => state.isExpanded);\n\n\treturn useQuery({\n\t\tqueryKey: ['git', 'branch'],\n\t\tqueryFn: () => apiClient.getGitBranch(),\n\t\t// Only poll when sidebar is expanded\n\t\trefetchInterval: isExpanded ? 10000 : false, // Poll every 10 seconds\n\t\tretry: 1,\n\t\tstaleTime: 5000,\n\t});\n}\n\nexport function useGenerateCommitMessage(sessionId?: string | null) {\n\treturn useMutation({\n\t\tmutationFn: () => apiClient.generateCommitMessage(sessionId ?? undefined),\n\t});\n}\n\nexport function useStageFiles() {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: (files: string[]) => apiClient.stageFiles(files),\n\t\tonSuccess: () => {\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['git', 'status'] });\n\t\t},\n\t});\n}\n\nexport function useUnstageFiles() {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: (files: string[]) => apiClient.unstageFiles(files),\n\t\tonSuccess: () => {\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['git', 'status'] });\n\t\t},\n\t});\n}\n\nexport function useRestoreFiles() {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: (files: string[]) => apiClient.restoreFiles(files),\n\t\tonSuccess: () => {\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['git', 'status'] });\n\t\t},\n\t});\n}\n\nexport function useDeleteFiles() {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: (files: string[]) => apiClient.deleteFiles(files),\n\t\tonSuccess: () => {\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['git', 'status'] });\n\t\t},\n\t});\n}\n\nexport function useCommitChanges() {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: (message: string) => apiClient.commitChanges(message),\n\t\tonSuccess: () => {\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['git', 'status'] });\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['git', 'branch'] });\n\t\t},\n\t});\n}\n\nexport function usePushCommits() {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: () => apiClient.pushCommits(),\n\t\tonSuccess: () => {\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['git', 'status'] });\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['git', 'branch'] });\n\t\t},\n\t});\n}\n\nexport function usePullChanges() {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: () => apiClient.pullChanges(),\n\t\tonSuccess: () => {\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['git', 'status'] });\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['git', 'branch'] });\n\t\t},\n\t});\n}\n\nexport function useGitInit() {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: () => apiClient.initGitRepo(),\n\t\tonSuccess: () => {\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['git', 'status'] });\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['git', 'branch'] });\n\t\t},\n\t});\n}\n\nexport function useGitRemotes() {\n\tconst isExpanded = useGitStore((state) => state.isExpanded);\n\n\treturn useQuery({\n\t\tqueryKey: ['git', 'remotes'],\n\t\tqueryFn: () => apiClient.getRemotes(),\n\t\tenabled: isExpanded,\n\t\tretry: 1,\n\t\tstaleTime: 10000,\n\t});\n}\n\nexport function useAddRemote() {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: ({ name, url }: { name: string; url: string }) =>\n\t\t\tapiClient.addRemote(name, url),\n\t\tonSuccess: () => {\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['git', 'remotes'] });\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['git', 'status'] });\n\t\t},\n\t});\n}\n\nexport function useRemoveRemote() {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: (name: string) => apiClient.removeRemote(name),\n\t\tonSuccess: () => {\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['git', 'remotes'] });\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['git', 'status'] });\n\t\t},\n\t});\n}\n",
51
+ "import { create } from 'zustand';\nimport { useSessionFilesStore } from './sessionFilesStore';\nimport { useResearchStore } from './researchStore';\nimport { useSettingsStore } from './settingsStore';\nimport { useTunnelStore } from './tunnelStore';\nimport { useFileBrowserStore } from './fileBrowserStore';\nimport { useMCPStore } from './mcpStore';\nimport { useSkillsStore } from './skillsStore';\n\ninterface GitState {\n\t// Sidebar state\n\tisExpanded: boolean;\n\n\t// Active session tracking (for commit message generation)\n\tactiveSessionId: string | null;\n\n\t// Diff panel state\n\tselectedFile: string | null;\n\tselectedFileStaged: boolean;\n\tisDiffOpen: boolean;\n\n\t// Commit modal state\n\tisCommitModalOpen: boolean;\n\tcommitSessionId: string | null;\n\n\t// Session list collapse state (when diff is open)\n\twasSessionListCollapsed: boolean;\n\n\t// Actions\n\ttoggleSidebar: () => void;\n\texpandSidebar: () => void;\n\tcollapseSidebar: () => void;\n\n\topenDiff: (file: string, staged: boolean) => void;\n\tcloseDiff: () => void;\n\tswitchFile: (file: string, staged: boolean) => void;\n\n\topenCommitModal: () => void;\n\topenCommitModalForSession: (sessionId: string) => void;\n\tcloseCommitModal: () => void;\n\n\tsetActiveSessionId: (sessionId: string | null) => void;\n\tsetSessionListCollapsed: (collapsed: boolean) => void;\n}\n\nexport const useGitStore = create<GitState>((set) => ({\n\t// Initial state\n\tisExpanded: false,\n\tactiveSessionId: null,\n\tselectedFile: null,\n\tselectedFileStaged: false,\n\tisDiffOpen: false,\n\tisCommitModalOpen: false,\n\tcommitSessionId: null,\n\twasSessionListCollapsed: false,\n\n\t// Sidebar actions\n\ttoggleSidebar: () => {\n\t\tset((state) => {\n\t\t\tconst newExpanded = !state.isExpanded;\n\t\t\tif (newExpanded) {\n\t\t\t\tuseSessionFilesStore.getState().collapseSidebar();\n\t\t\t\tuseResearchStore.getState().collapseSidebar();\n\t\t\t\tuseSettingsStore.getState().collapseSidebar();\n\t\t\t\tuseTunnelStore.getState().collapseSidebar();\n\t\t\t\tuseFileBrowserStore.getState().collapseSidebar();\n\t\t\t\tuseMCPStore.getState().collapseSidebar();\n\t\t\t\tuseSkillsStore.getState().collapseSidebar();\n\t\t\t}\n\t\t\treturn { isExpanded: newExpanded };\n\t\t});\n\t},\n\texpandSidebar: () => set({ isExpanded: true }),\n\tcollapseSidebar: () =>\n\t\tset({ isExpanded: false, isDiffOpen: false, selectedFile: null }),\n\n\t// Diff panel actions\n\topenDiff: (file, staged) =>\n\t\tset({\n\t\t\tselectedFile: file,\n\t\t\tselectedFileStaged: staged,\n\t\t\tisDiffOpen: true,\n\t\t\tisExpanded: true,\n\t\t}),\n\tcloseDiff: () =>\n\t\tset({\n\t\t\tisDiffOpen: false,\n\t\t\tselectedFile: null,\n\t\t}),\n\tswitchFile: (file, staged) =>\n\t\tset({\n\t\t\tselectedFile: file,\n\t\t\tselectedFileStaged: staged,\n\t\t}),\n\n\t// Commit modal actions\n\topenCommitModal: () =>\n\t\tset((state) => ({\n\t\t\tisCommitModalOpen: true,\n\t\t\tcommitSessionId: state.activeSessionId,\n\t\t})),\n\topenCommitModalForSession: (sessionId: string) =>\n\t\tset({ isCommitModalOpen: true, commitSessionId: sessionId }),\n\tcloseCommitModal: () =>\n\t\tset({ isCommitModalOpen: false, commitSessionId: null }),\n\n\t// Session list collapse\n\tsetActiveSessionId: (sessionId) => set({ activeSessionId: sessionId }),\n\tsetSessionListCollapsed: (collapsed) =>\n\t\tset({ wasSessionListCollapsed: collapsed }),\n}));\n",
52
+ "import { create } from 'zustand';\nimport { useGitStore } from './gitStore';\nimport { useResearchStore } from './researchStore';\nimport { useSettingsStore } from './settingsStore';\nimport { useTunnelStore } from './tunnelStore';\nimport { useFileBrowserStore } from './fileBrowserStore';\nimport { useMCPStore } from './mcpStore';\nimport { useSkillsStore } from './skillsStore';\nimport type { SessionFileOperation } from '../types/api';\n\ninterface SessionFilesState {\n\tisExpanded: boolean;\n\tselectedFile: string | null;\n\tallOperations: SessionFileOperation[];\n\tselectedOperationIndex: number;\n\tisDiffOpen: boolean;\n\n\ttoggleSidebar: () => void;\n\texpandSidebar: () => void;\n\tcollapseSidebar: () => void;\n\topenDiff: (file: string, operations: SessionFileOperation[]) => void;\n\tselectOperation: (index: number) => void;\n\tcloseDiff: () => void;\n}\n\nexport const useSessionFilesStore = create<SessionFilesState>((set) => ({\n\tisExpanded: false,\n\tselectedFile: null,\n\tallOperations: [],\n\tselectedOperationIndex: 0,\n\tisDiffOpen: false,\n\n\ttoggleSidebar: () => {\n\t\tset((state) => {\n\t\t\tconst newExpanded = !state.isExpanded;\n\t\t\tif (newExpanded) {\n\t\t\t\tuseGitStore.getState().collapseSidebar();\n\t\t\t\tuseResearchStore.getState().collapseSidebar();\n\t\t\t\tuseSettingsStore.getState().collapseSidebar();\n\t\t\t\tuseTunnelStore.getState().collapseSidebar();\n\t\t\t\tuseFileBrowserStore.getState().collapseSidebar();\n\t\t\t\tuseMCPStore.getState().collapseSidebar();\n\t\t\t\tuseSkillsStore.getState().collapseSidebar();\n\t\t\t}\n\t\t\treturn { isExpanded: newExpanded };\n\t\t});\n\t},\n\texpandSidebar: () => {\n\t\tuseGitStore.getState().collapseSidebar();\n\t\tuseResearchStore.getState().collapseSidebar();\n\t\tuseSettingsStore.getState().collapseSidebar();\n\t\tuseTunnelStore.getState().collapseSidebar();\n\t\tuseFileBrowserStore.getState().collapseSidebar();\n\t\tuseMCPStore.getState().collapseSidebar();\n\t\tuseSkillsStore.getState().collapseSidebar();\n\t\tset({ isExpanded: true });\n\t},\n\tcollapseSidebar: () =>\n\t\tset({\n\t\t\tisExpanded: false,\n\t\t\tisDiffOpen: false,\n\t\t\tselectedFile: null,\n\t\t\tallOperations: [],\n\t\t\tselectedOperationIndex: 0,\n\t\t}),\n\topenDiff: (file, operations) =>\n\t\tset({\n\t\t\tselectedFile: file,\n\t\t\tallOperations: operations,\n\t\t\tselectedOperationIndex: operations.length - 1,\n\t\t\tisDiffOpen: true,\n\t\t\tisExpanded: true,\n\t\t}),\n\tselectOperation: (index) => set({ selectedOperationIndex: index }),\n\tcloseDiff: () =>\n\t\tset({\n\t\t\tisDiffOpen: false,\n\t\t\tselectedFile: null,\n\t\t\tallOperations: [],\n\t\t\tselectedOperationIndex: 0,\n\t\t}),\n}));\n",
53
+ "import { create } from 'zustand';\nimport { useGitStore } from './gitStore';\nimport { useSessionFilesStore } from './sessionFilesStore';\nimport { useSettingsStore } from './settingsStore';\nimport { useTunnelStore } from './tunnelStore';\nimport { useFileBrowserStore } from './fileBrowserStore';\nimport { useMCPStore } from './mcpStore';\nimport { useSkillsStore } from './skillsStore';\n\ninterface ResearchState {\n\tisExpanded: boolean;\n\tactiveResearchSessionId: string | null;\n\tparentSessionId: string | null;\n\n\ttoggleSidebar: () => void;\n\texpandSidebar: () => void;\n\tcollapseSidebar: () => void;\n\tselectResearchSession: (id: string | null) => void;\n\tsetParentSessionId: (id: string | null) => void;\n\treset: () => void;\n}\n\nexport const useResearchStore = create<ResearchState>((set, get) => ({\n\tisExpanded: false,\n\tactiveResearchSessionId: null,\n\tparentSessionId: null,\n\n\ttoggleSidebar: () => {\n\t\tset((state) => {\n\t\t\tconst newExpanded = !state.isExpanded;\n\t\t\tif (newExpanded) {\n\t\t\t\tuseGitStore.getState().collapseSidebar();\n\t\t\t\tuseSessionFilesStore.getState().collapseSidebar();\n\t\t\t\tuseSettingsStore.getState().collapseSidebar();\n\t\t\t\tuseTunnelStore.getState().collapseSidebar();\n\t\t\t\tuseFileBrowserStore.getState().collapseSidebar();\n\t\t\t\tuseMCPStore.getState().collapseSidebar();\n\t\t\t\tuseSkillsStore.getState().collapseSidebar();\n\t\t\t}\n\t\t\treturn { isExpanded: newExpanded };\n\t\t});\n\t},\n\n\texpandSidebar: () => {\n\t\tuseGitStore.getState().collapseSidebar();\n\t\tuseSessionFilesStore.getState().collapseSidebar();\n\t\tuseSettingsStore.getState().collapseSidebar();\n\t\tuseTunnelStore.getState().collapseSidebar();\n\t\tuseFileBrowserStore.getState().collapseSidebar();\n\t\tuseMCPStore.getState().collapseSidebar();\n\t\tuseSkillsStore.getState().collapseSidebar();\n\t\tset({ isExpanded: true });\n\t},\n\n\tcollapseSidebar: () => set({ isExpanded: false }),\n\n\tselectResearchSession: (id) => set({ activeResearchSessionId: id }),\n\n\tsetParentSessionId: (id) => {\n\t\tconst currentParentId = get().parentSessionId;\n\t\tif (currentParentId !== id) {\n\t\t\tset({\n\t\t\t\tparentSessionId: id,\n\t\t\t\tactiveResearchSessionId: null,\n\t\t\t});\n\t\t}\n\t},\n\n\treset: () =>\n\t\tset({\n\t\t\tactiveResearchSessionId: null,\n\t\t\tparentSessionId: null,\n\t\t}),\n}));\n",
54
+ "import { create } from 'zustand';\nimport { useGitStore } from './gitStore';\nimport { useSessionFilesStore } from './sessionFilesStore';\nimport { useResearchStore } from './researchStore';\nimport { useTunnelStore } from './tunnelStore';\nimport { useFileBrowserStore } from './fileBrowserStore';\nimport { useMCPStore } from './mcpStore';\nimport { useSkillsStore } from './skillsStore';\n\ninterface SettingsState {\n\tisExpanded: boolean;\n\ttoggleSidebar: () => void;\n\texpandSidebar: () => void;\n\tcollapseSidebar: () => void;\n}\n\nexport const useSettingsStore = create<SettingsState>((set) => ({\n\tisExpanded: false,\n\n\ttoggleSidebar: () => {\n\t\tset((state) => {\n\t\t\tconst newExpanded = !state.isExpanded;\n\t\t\tif (newExpanded) {\n\t\t\t\tuseGitStore.getState().collapseSidebar();\n\t\t\t\tuseSessionFilesStore.getState().collapseSidebar();\n\t\t\t\tuseResearchStore.getState().collapseSidebar();\n\t\t\t\tuseTunnelStore.getState().collapseSidebar();\n\t\t\t\tuseFileBrowserStore.getState().collapseSidebar();\n\t\t\t\tuseMCPStore.getState().collapseSidebar();\n\t\t\t\tuseSkillsStore.getState().collapseSidebar();\n\t\t\t}\n\t\t\treturn { isExpanded: newExpanded };\n\t\t});\n\t},\n\texpandSidebar: () => set({ isExpanded: true }),\n\tcollapseSidebar: () => set({ isExpanded: false }),\n}));\n",
55
+ "import { create } from 'zustand';\nimport { useGitStore } from './gitStore';\nimport { useSessionFilesStore } from './sessionFilesStore';\nimport { useSettingsStore } from './settingsStore';\nimport { useResearchStore } from './researchStore';\nimport { useFileBrowserStore } from './fileBrowserStore';\nimport { useMCPStore } from './mcpStore';\nimport { useSkillsStore } from './skillsStore';\n\nexport type TunnelStatus = 'idle' | 'starting' | 'connected' | 'error';\n\ninterface TunnelState {\n\tisExpanded: boolean;\n\tstatus: TunnelStatus;\n\turl: string | null;\n\tqrCode: string | null;\n\terror: string | null;\n\tprogress: string | null;\n\n\ttoggleSidebar: () => void;\n\texpandSidebar: () => void;\n\tcollapseSidebar: () => void;\n\tsetStatus: (status: TunnelStatus) => void;\n\tsetUrl: (url: string | null) => void;\n\tsetQrCode: (qrCode: string | null) => void;\n\tsetError: (error: string | null) => void;\n\tsetProgress: (progress: string | null) => void;\n\treset: () => void;\n}\n\nexport const useTunnelStore = create<TunnelState>((set) => ({\n\tisExpanded: false,\n\tstatus: 'idle',\n\turl: null,\n\tqrCode: null,\n\terror: null,\n\tprogress: null,\n\n\ttoggleSidebar: () => {\n\t\tset((state) => {\n\t\t\tconst newExpanded = !state.isExpanded;\n\t\t\tif (newExpanded) {\n\t\t\t\tuseGitStore.getState().collapseSidebar();\n\t\t\t\tuseSessionFilesStore.getState().collapseSidebar();\n\t\t\t\tuseSettingsStore.getState().collapseSidebar();\n\t\t\t\tuseResearchStore.getState().collapseSidebar();\n\t\t\t\tuseFileBrowserStore.getState().collapseSidebar();\n\t\t\t\tuseMCPStore.getState().collapseSidebar();\n\t\t\t\tuseSkillsStore.getState().collapseSidebar();\n\t\t\t}\n\t\t\treturn { isExpanded: newExpanded };\n\t\t});\n\t},\n\n\texpandSidebar: () => {\n\t\tuseGitStore.getState().collapseSidebar();\n\t\tuseSessionFilesStore.getState().collapseSidebar();\n\t\tuseSettingsStore.getState().collapseSidebar();\n\t\tuseResearchStore.getState().collapseSidebar();\n\t\tuseFileBrowserStore.getState().collapseSidebar();\n\t\tuseMCPStore.getState().collapseSidebar();\n\t\tuseSkillsStore.getState().collapseSidebar();\n\t\tset({ isExpanded: true });\n\t},\n\n\tcollapseSidebar: () => set({ isExpanded: false }),\n\n\tsetStatus: (status) => set({ status }),\n\tsetUrl: (url) => set({ url }),\n\tsetQrCode: (qrCode) => set({ qrCode }),\n\tsetError: (error) => set({ error }),\n\tsetProgress: (progress) => set({ progress }),\n\n\treset: () =>\n\t\tset({\n\t\t\tstatus: 'idle',\n\t\t\turl: null,\n\t\t\tqrCode: null,\n\t\t\terror: null,\n\t\t\tprogress: null,\n\t\t}),\n}));\n",
56
+ "import { create } from 'zustand';\nimport { useGitStore } from './gitStore';\nimport { useSessionFilesStore } from './sessionFilesStore';\nimport { useResearchStore } from './researchStore';\nimport { useSettingsStore } from './settingsStore';\nimport { useTunnelStore } from './tunnelStore';\nimport { useMCPStore } from './mcpStore';\nimport { useSkillsStore } from './skillsStore';\n\ninterface FileBrowserState {\n\tisExpanded: boolean;\n\tselectedFile: string | null;\n\tisViewerOpen: boolean;\n\texpandedDirs: Set<string>;\n\n\ttoggleSidebar: () => void;\n\texpandSidebar: () => void;\n\tcollapseSidebar: () => void;\n\topenFile: (path: string) => void;\n\tcloseViewer: () => void;\n\ttoggleDir: (path: string) => void;\n}\n\nexport const useFileBrowserStore = create<FileBrowserState>((set) => ({\n\tisExpanded: false,\n\tselectedFile: null,\n\tisViewerOpen: false,\n\texpandedDirs: new Set<string>(),\n\n\ttoggleSidebar: () => {\n\t\tset((state) => {\n\t\t\tconst newExpanded = !state.isExpanded;\n\t\t\tif (newExpanded) {\n\t\t\t\tuseGitStore.getState().collapseSidebar();\n\t\t\t\tuseSessionFilesStore.getState().collapseSidebar();\n\t\t\t\tuseResearchStore.getState().collapseSidebar();\n\t\t\t\tuseSettingsStore.getState().collapseSidebar();\n\t\t\t\tuseTunnelStore.getState().collapseSidebar();\n\t\t\t\tuseMCPStore.getState().collapseSidebar();\n\t\t\t\tuseSkillsStore.getState().collapseSidebar();\n\t\t\t}\n\t\t\treturn { isExpanded: newExpanded };\n\t\t});\n\t},\n\texpandSidebar: () => {\n\t\tuseGitStore.getState().collapseSidebar();\n\t\tuseSessionFilesStore.getState().collapseSidebar();\n\t\tuseResearchStore.getState().collapseSidebar();\n\t\tuseSettingsStore.getState().collapseSidebar();\n\t\tuseTunnelStore.getState().collapseSidebar();\n\t\tuseMCPStore.getState().collapseSidebar();\n\t\tuseSkillsStore.getState().collapseSidebar();\n\t\tset({ isExpanded: true });\n\t},\n\tcollapseSidebar: () =>\n\t\tset({\n\t\t\tisExpanded: false,\n\t\t\tisViewerOpen: false,\n\t\t\tselectedFile: null,\n\t\t}),\n\topenFile: (path) =>\n\t\tset({\n\t\t\tselectedFile: path,\n\t\t\tisViewerOpen: true,\n\t\t}),\n\tcloseViewer: () =>\n\t\tset({\n\t\t\tisViewerOpen: false,\n\t\t\tselectedFile: null,\n\t\t}),\n\ttoggleDir: (path) =>\n\t\tset((state) => {\n\t\t\tconst next = new Set(state.expandedDirs);\n\t\t\tif (next.has(path)) {\n\t\t\t\tnext.delete(path);\n\t\t\t} else {\n\t\t\t\tnext.add(path);\n\t\t\t}\n\t\t\treturn { expandedDirs: next };\n\t\t}),\n}));\n",
57
+ "import { create } from 'zustand';\nimport { useGitStore } from './gitStore';\nimport { useSessionFilesStore } from './sessionFilesStore';\nimport { useResearchStore } from './researchStore';\nimport { useSettingsStore } from './settingsStore';\nimport { useTunnelStore } from './tunnelStore';\nimport { useFileBrowserStore } from './fileBrowserStore';\nimport { useSkillsStore } from './skillsStore';\n\nexport type MCPScope = 'global' | 'project';\n\nexport interface MCPServerInfo {\n\tname: string;\n\ttransport: string;\n\tcommand?: string;\n\targs: string[];\n\turl?: string;\n\tdisabled: boolean;\n\tconnected: boolean;\n\ttools: string[];\n\tauthRequired: boolean;\n\tauthenticated: boolean;\n\tscope: MCPScope;\n\tauthType?: string;\n}\n\nexport interface CopilotDeviceInfo {\n\tsessionId: string;\n\tuserCode: string;\n\tverificationUri: string;\n\tinterval: number;\n\tserverName: string;\n}\n\ninterface MCPState {\n\tisExpanded: boolean;\n\tservers: MCPServerInfo[];\n\tloading: Set<string>;\n\tauthUrls: Map<string, string>;\n\tcopilotDevice: CopilotDeviceInfo | null;\n\n\ttoggleSidebar: () => void;\n\texpandSidebar: () => void;\n\tcollapseSidebar: () => void;\n\tsetServers: (servers: MCPServerInfo[]) => void;\n\tsetLoading: (name: string, loading: boolean) => void;\n\tupdateServer: (name: string, updates: Partial<MCPServerInfo>) => void;\n\tsetAuthUrl: (name: string, url: string | null) => void;\n\tsetCopilotDevice: (info: CopilotDeviceInfo | null) => void;\n}\n\nexport const useMCPStore = create<MCPState>((set) => ({\n\tisExpanded: false,\n\tservers: [],\n\tloading: new Set(),\n\tauthUrls: new Map(),\n\tcopilotDevice: null,\n\n\ttoggleSidebar: () => {\n\t\tset((state) => {\n\t\t\tconst newExpanded = !state.isExpanded;\n\t\t\tif (newExpanded) {\n\t\t\t\tuseGitStore.getState().collapseSidebar();\n\t\t\t\tuseSessionFilesStore.getState().collapseSidebar();\n\t\t\t\tuseResearchStore.getState().collapseSidebar();\n\t\t\t\tuseSettingsStore.getState().collapseSidebar();\n\t\t\t\tuseTunnelStore.getState().collapseSidebar();\n\t\t\t\tuseFileBrowserStore.getState().collapseSidebar();\n\t\t\t\tuseSkillsStore.getState().collapseSidebar();\n\t\t\t}\n\t\t\treturn { isExpanded: newExpanded };\n\t\t});\n\t},\n\n\texpandSidebar: () => {\n\t\tuseGitStore.getState().collapseSidebar();\n\t\tuseSessionFilesStore.getState().collapseSidebar();\n\t\tuseResearchStore.getState().collapseSidebar();\n\t\tuseSettingsStore.getState().collapseSidebar();\n\t\tuseTunnelStore.getState().collapseSidebar();\n\t\tuseFileBrowserStore.getState().collapseSidebar();\n\t\tuseSkillsStore.getState().collapseSidebar();\n\t\tset({ isExpanded: true });\n\t},\n\n\tcollapseSidebar: () => set({ isExpanded: false }),\n\n\tsetServers: (servers) => set({ servers }),\n\n\tsetLoading: (name, loading) =>\n\t\tset((state) => {\n\t\t\tconst next = new Set(state.loading);\n\t\t\tif (loading) next.add(name);\n\t\t\telse next.delete(name);\n\t\t\treturn { loading: next };\n\t\t}),\n\n\tupdateServer: (name, updates) =>\n\t\tset((state) => ({\n\t\t\tservers: state.servers.map((s) =>\n\t\t\t\ts.name === name ? { ...s, ...updates } : s,\n\t\t\t),\n\t\t})),\n\n\tsetAuthUrl: (name, url) =>\n\t\tset((state) => {\n\t\t\tconst next = new Map(state.authUrls);\n\t\t\tif (url) next.set(name, url);\n\t\t\telse next.delete(name);\n\t\t\treturn { authUrls: next };\n\t\t}),\n\n\tsetCopilotDevice: (info) => set({ copilotDevice: info }),\n}));\n",
58
+ "import { create } from 'zustand';\nimport { useGitStore } from './gitStore';\nimport { useSessionFilesStore } from './sessionFilesStore';\nimport { useResearchStore } from './researchStore';\nimport { useSettingsStore } from './settingsStore';\nimport { useTunnelStore } from './tunnelStore';\nimport { useFileBrowserStore } from './fileBrowserStore';\nimport { useMCPStore } from './mcpStore';\n\nexport interface SkillInfo {\n\tname: string;\n\tdescription: string;\n\tscope: string;\n\tpath: string;\n}\n\ninterface SkillsState {\n\tisExpanded: boolean;\n\tskills: SkillInfo[];\n\tselectedSkill: string | null;\n\n\tisViewerOpen: boolean;\n\tviewingFile: string | null;\n\n\ttoggleSidebar: () => void;\n\texpandSidebar: () => void;\n\tcollapseSidebar: () => void;\n\tsetSkills: (skills: SkillInfo[]) => void;\n\tselectSkill: (name: string | null) => void;\n\topenViewer: (file: string | null) => void;\n\tcloseViewer: () => void;\n}\n\nexport const useSkillsStore = create<SkillsState>((set) => ({\n\tisExpanded: false,\n\tskills: [],\n\tselectedSkill: null,\n\tisViewerOpen: false,\n\tviewingFile: null,\n\n\ttoggleSidebar: () => {\n\t\tset((state) => {\n\t\t\tconst newExpanded = !state.isExpanded;\n\t\t\tif (newExpanded) {\n\t\t\t\tuseGitStore.getState().collapseSidebar();\n\t\t\t\tuseSessionFilesStore.getState().collapseSidebar();\n\t\t\t\tuseResearchStore.getState().collapseSidebar();\n\t\t\t\tuseSettingsStore.getState().collapseSidebar();\n\t\t\t\tuseTunnelStore.getState().collapseSidebar();\n\t\t\t\tuseFileBrowserStore.getState().collapseSidebar();\n\t\t\t\tuseMCPStore.getState().collapseSidebar();\n\t\t\t}\n\t\t\treturn { isExpanded: newExpanded };\n\t\t});\n\t},\n\n\texpandSidebar: () => {\n\t\tuseGitStore.getState().collapseSidebar();\n\t\tuseSessionFilesStore.getState().collapseSidebar();\n\t\tuseResearchStore.getState().collapseSidebar();\n\t\tuseSettingsStore.getState().collapseSidebar();\n\t\tuseTunnelStore.getState().collapseSidebar();\n\t\tuseFileBrowserStore.getState().collapseSidebar();\n\t\tuseMCPStore.getState().collapseSidebar();\n\t\tset({ isExpanded: true });\n\t},\n\n\tcollapseSidebar: () => set({ isExpanded: false }),\n\n\tsetSkills: (skills) => set({ skills }),\n\n\tselectSkill: (name) =>\n\t\tset({ selectedSkill: name, isViewerOpen: false, viewingFile: null }),\n\n\topenViewer: (file) => set({ isViewerOpen: true, viewingFile: file }),\n\n\tcloseViewer: () => set({ isViewerOpen: false, viewingFile: null }),\n}));\n",
59
+ "import {\n\tuseState,\n\tuseCallback,\n\tuseEffect,\n\ttype DragEvent,\n\ttype ClipboardEvent,\n} from 'react';\n\nexport type FileAttachmentType = 'image' | 'pdf' | 'text';\n\nexport interface FileAttachment {\n\tid: string;\n\tfile: File;\n\ttype: FileAttachmentType;\n\tname: string;\n\tpreview?: string;\n\tdata: string;\n\tmediaType: string;\n\ttextContent?: string;\n}\n\nconst IMAGE_TYPES = ['image/png', 'image/jpeg', 'image/gif', 'image/webp'];\nconst PDF_TYPES = ['application/pdf'];\nconst TEXT_TYPES = [\n\t'text/plain',\n\t'text/markdown',\n\t'text/x-markdown',\n\t'application/json',\n\t'text/csv',\n\t'text/xml',\n\t'application/xml',\n\t'text/yaml',\n\t'text/x-yaml',\n\t'application/x-yaml',\n\t'text/html',\n\t'text/css',\n\t'text/javascript',\n\t'application/javascript',\n\t'application/typescript',\n];\nconst TEXT_EXTENSIONS = [\n\t'.txt',\n\t'.md',\n\t'.markdown',\n\t'.json',\n\t'.csv',\n\t'.xml',\n\t'.yaml',\n\t'.yml',\n\t'.html',\n\t'.css',\n\t'.js',\n\t'.ts',\n\t'.jsx',\n\t'.tsx',\n\t'.py',\n\t'.rs',\n\t'.go',\n\t'.java',\n\t'.c',\n\t'.cpp',\n\t'.h',\n\t'.hpp',\n\t'.rb',\n\t'.php',\n\t'.sh',\n\t'.bash',\n\t'.zsh',\n\t'.toml',\n\t'.ini',\n\t'.cfg',\n\t'.env',\n\t'.log',\n\t'.sql',\n\t'.graphql',\n\t'.svelte',\n\t'.vue',\n];\n\nconst SUPPORTED_TYPES = [...IMAGE_TYPES, ...PDF_TYPES, ...TEXT_TYPES];\n\nfunction generateId(): string {\n\treturn `file-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\nfunction getFileType(file: File): FileAttachmentType | null {\n\tif (IMAGE_TYPES.includes(file.type)) return 'image';\n\tif (PDF_TYPES.includes(file.type)) return 'pdf';\n\tif (TEXT_TYPES.includes(file.type)) return 'text';\n\tconst ext = file.name.toLowerCase().slice(file.name.lastIndexOf('.'));\n\tif (TEXT_EXTENSIONS.includes(ext)) return 'text';\n\treturn null;\n}\n\nfunction isSupported(file: File): boolean {\n\tif (SUPPORTED_TYPES.includes(file.type)) return true;\n\tconst ext = file.name.toLowerCase().slice(file.name.lastIndexOf('.'));\n\treturn TEXT_EXTENSIONS.includes(ext);\n}\n\nasync function fileToBase64(file: File): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst reader = new FileReader();\n\t\treader.onload = () => {\n\t\t\tconst result = reader.result as string;\n\t\t\tconst base64 = result.split(',')[1];\n\t\t\tresolve(base64);\n\t\t};\n\t\treader.onerror = reject;\n\t\treader.readAsDataURL(file);\n\t});\n}\n\nasync function fileToText(file: File): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst reader = new FileReader();\n\t\treader.onload = () => resolve(reader.result as string);\n\t\treader.onerror = reject;\n\t\treader.readAsText(file);\n\t});\n}\n\nasync function fileToPreview(file: File): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst reader = new FileReader();\n\t\treader.onload = () => resolve(reader.result as string);\n\t\treader.onerror = reject;\n\t\treader.readAsDataURL(file);\n\t});\n}\n\ninterface UseFileUploadOptions {\n\tmaxFiles?: number;\n\tmaxSizeMB?: number;\n\tpageWide?: boolean;\n\tsupportsImages?: boolean;\n\tsupportsFileAttachments?: boolean;\n\tonError?: (message: string) => void;\n}\n\nexport function useFileUpload(options: UseFileUploadOptions = {}) {\n\tconst {\n\t\tmaxFiles = 10,\n\t\tmaxSizeMB = 10,\n\t\tpageWide = true,\n\t\tsupportsImages = true,\n\t\tsupportsFileAttachments = true,\n\t\tonError,\n\t} = options;\n\n\tconst [files, setFiles] = useState<FileAttachment[]>([]);\n\tconst [isDragging, setIsDragging] = useState(false);\n\tconst [error, setError] = useState<string | null>(null);\n\n\tconst maxSizeBytes = maxSizeMB * 1024 * 1024;\n\n\tconst validateFile = useCallback(\n\t\t(file: File): string | null => {\n\t\t\tif (!supportsImages && IMAGE_TYPES.includes(file.type)) {\n\t\t\t\treturn 'This model does not support image attachments';\n\t\t\t}\n\t\t\tif (!supportsFileAttachments && PDF_TYPES.includes(file.type)) {\n\t\t\t\treturn 'This model does not support PDF attachments';\n\t\t\t}\n\t\t\tif (!isSupported(file)) {\n\t\t\t\tconst ext = file.name.slice(file.name.lastIndexOf('.'));\n\t\t\t\treturn `Unsupported file type: ${ext || file.type || 'unknown'}`;\n\t\t\t}\n\t\t\tif (file.size > maxSizeBytes) {\n\t\t\t\treturn `File too large: ${(file.size / 1024 / 1024).toFixed(1)}MB. Max: ${maxSizeMB}MB`;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\t[maxSizeBytes, maxSizeMB, supportsImages, supportsFileAttachments],\n\t);\n\n\tconst addFiles = useCallback(\n\t\tasync (inputFiles: FileList | File[]) => {\n\t\t\tsetError(null);\n\t\t\tconst fileArray = Array.from(inputFiles);\n\t\t\tconst remaining = maxFiles - files.length;\n\n\t\t\tif (remaining <= 0) {\n\t\t\t\tconst msg = `Maximum ${maxFiles} files allowed`;\n\t\t\t\tsetError(msg);\n\t\t\t\tonError?.(msg);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst filesToAdd = fileArray.slice(0, remaining);\n\t\t\tconst newFiles: FileAttachment[] = [];\n\n\t\t\tfor (const file of filesToAdd) {\n\t\t\t\tconst validationError = validateFile(file);\n\t\t\t\tif (validationError) {\n\t\t\t\t\tsetError(validationError);\n\t\t\t\t\tonError?.(validationError);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst fileType = getFileType(file);\n\t\t\t\tif (!fileType) continue;\n\n\t\t\t\ttry {\n\t\t\t\t\tlet preview: string | undefined;\n\t\t\t\t\tlet data: string;\n\t\t\t\t\tlet textContent: string | undefined;\n\t\t\t\t\tlet mediaType = file.type;\n\n\t\t\t\t\tif (fileType === 'image') {\n\t\t\t\t\t\t[preview, data] = await Promise.all([\n\t\t\t\t\t\t\tfileToPreview(file),\n\t\t\t\t\t\t\tfileToBase64(file),\n\t\t\t\t\t\t]);\n\t\t\t\t\t} else if (fileType === 'pdf') {\n\t\t\t\t\t\tdata = await fileToBase64(file);\n\t\t\t\t\t\tmediaType = 'application/pdf';\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttextContent = await fileToText(file);\n\t\t\t\t\t\tdata = textContent;\n\t\t\t\t\t\tif (!mediaType) {\n\t\t\t\t\t\t\tconst ext = file.name.toLowerCase();\n\t\t\t\t\t\t\tmediaType =\n\t\t\t\t\t\t\t\text.endsWith('.md') || ext.endsWith('.markdown')\n\t\t\t\t\t\t\t\t\t? 'text/markdown'\n\t\t\t\t\t\t\t\t\t: 'text/plain';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tnewFiles.push({\n\t\t\t\t\t\tid: generateId(),\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\ttype: fileType,\n\t\t\t\t\t\tname: file.name,\n\t\t\t\t\t\tpreview,\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\tmediaType,\n\t\t\t\t\t\ttextContent,\n\t\t\t\t\t});\n\t\t\t\t} catch {\n\t\t\t\t\tconst msg = `Failed to process file: ${file.name}`;\n\t\t\t\t\tsetError(msg);\n\t\t\t\t\tonError?.(msg);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (newFiles.length > 0) {\n\t\t\t\tsetFiles((prev) => [...prev, ...newFiles]);\n\t\t\t}\n\t\t},\n\t\t[files.length, maxFiles, validateFile, onError],\n\t);\n\n\tconst removeFile = useCallback((id: string) => {\n\t\tsetFiles((prev) => prev.filter((f) => f.id !== id));\n\t\tsetError(null);\n\t}, []);\n\n\tconst clearFiles = useCallback(() => {\n\t\tsetFiles([]);\n\t\tsetError(null);\n\t}, []);\n\n\tconst handleDragEnter = useCallback((e: DragEvent) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\tif (e.dataTransfer.types.includes('Files')) {\n\t\t\tsetIsDragging(true);\n\t\t}\n\t}, []);\n\n\tconst handleDragLeave = useCallback((e: DragEvent) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\tconst rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n\t\tconst x = e.clientX;\n\t\tconst y = e.clientY;\n\t\tif (x < rect.left || x > rect.right || y < rect.top || y > rect.bottom) {\n\t\t\tsetIsDragging(false);\n\t\t}\n\t}, []);\n\n\tconst handleDragOver = useCallback((e: DragEvent) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t}, []);\n\n\tconst handleDrop = useCallback(\n\t\t(e: DragEvent) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tsetIsDragging(false);\n\n\t\t\tconst droppedFiles = e.dataTransfer.files;\n\t\t\tif (droppedFiles.length > 0) {\n\t\t\t\taddFiles(Array.from(droppedFiles));\n\t\t\t}\n\t\t},\n\t\t[addFiles],\n\t);\n\n\tconst handlePaste = useCallback(\n\t\t(e: ClipboardEvent) => {\n\t\t\tconst items = e.clipboardData?.items;\n\t\t\tif (!items) return;\n\n\t\t\tconst pastedFiles: File[] = [];\n\t\t\tfor (const item of Array.from(items)) {\n\t\t\t\tif (item.kind === 'file') {\n\t\t\t\t\tconst file = item.getAsFile();\n\t\t\t\t\tif (file) {\n\t\t\t\t\t\tpastedFiles.push(file);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (pastedFiles.length > 0) {\n\t\t\t\te.preventDefault();\n\t\t\t\taddFiles(pastedFiles);\n\t\t\t}\n\t\t},\n\t\t[addFiles],\n\t);\n\n\tuseEffect(() => {\n\t\tif (!pageWide) return;\n\n\t\tlet dragCounter = 0;\n\n\t\tconst onDragEnter = (e: globalThis.DragEvent) => {\n\t\t\te.preventDefault();\n\t\t\tif (e.dataTransfer?.types.includes('Files')) {\n\t\t\t\tdragCounter++;\n\t\t\t\tif (dragCounter === 1) {\n\t\t\t\t\tsetIsDragging(true);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tconst onDragLeave = (e: globalThis.DragEvent) => {\n\t\t\te.preventDefault();\n\t\t\tdragCounter--;\n\t\t\tif (dragCounter === 0) {\n\t\t\t\tsetIsDragging(false);\n\t\t\t}\n\t\t};\n\n\t\tconst onDragOver = (e: globalThis.DragEvent) => {\n\t\t\te.preventDefault();\n\t\t};\n\n\t\tconst onDrop = (e: globalThis.DragEvent) => {\n\t\t\te.preventDefault();\n\t\t\tdragCounter = 0;\n\t\t\tsetIsDragging(false);\n\n\t\t\tconst droppedFiles = e.dataTransfer?.files;\n\t\t\tif (droppedFiles && droppedFiles.length > 0) {\n\t\t\t\taddFiles(Array.from(droppedFiles));\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener('dragenter', onDragEnter);\n\t\tdocument.addEventListener('dragleave', onDragLeave);\n\t\tdocument.addEventListener('dragover', onDragOver);\n\t\tdocument.addEventListener('drop', onDrop);\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('dragenter', onDragEnter);\n\t\t\tdocument.removeEventListener('dragleave', onDragLeave);\n\t\t\tdocument.removeEventListener('dragover', onDragOver);\n\t\t\tdocument.removeEventListener('drop', onDrop);\n\t\t};\n\t}, [pageWide, addFiles]);\n\n\tconst images = files.filter((f) => f.type === 'image');\n\tconst documents = files.filter((f) => f.type === 'pdf' || f.type === 'text');\n\n\treturn {\n\t\tfiles,\n\t\timages,\n\t\tdocuments,\n\t\tisDragging,\n\t\terror,\n\t\taddFiles,\n\t\tremoveFile,\n\t\tclearFiles,\n\t\thandleDragEnter,\n\t\thandleDragLeave,\n\t\thandleDragOver,\n\t\thandleDrop,\n\t\thandlePaste,\n\t};\n}\n",
60
+ "import { create } from 'zustand';\n\ninterface QueueState {\n\tpendingRestoreText: string | null;\n\tsetPendingRestoreText: (text: string | null) => void;\n\tconsumeRestoreText: () => string | null;\n}\n\nexport const useQueueStore = create<QueueState>((set, get) => ({\n\tpendingRestoreText: null,\n\tsetPendingRestoreText: (text) => set({ pendingRestoreText: text }),\n\tconsumeRestoreText: () => {\n\t\tconst text = get().pendingRestoreText;\n\t\tset({ pendingRestoreText: null });\n\t\treturn text;\n\t},\n}));\n",
61
+ "import { create } from 'zustand';\n\nexport interface PendingResearchContext {\n\tid: string;\n\tsessionId: string;\n\tlabel: string;\n\tcontent: string;\n}\n\ninterface PendingResearchState {\n\tpendingContexts: Map<string, PendingResearchContext[]>;\n\taddContext: (\n\t\tparentSessionId: string,\n\t\tcontext: PendingResearchContext,\n\t) => void;\n\tremoveContext: (parentSessionId: string, contextId: string) => void;\n\tgetContexts: (parentSessionId: string) => PendingResearchContext[];\n\tclearContexts: (parentSessionId: string) => void;\n\tconsumeContexts: (parentSessionId: string) => PendingResearchContext[];\n}\n\nexport const usePendingResearchStore = create<PendingResearchState>(\n\t(set, get) => ({\n\t\tpendingContexts: new Map(),\n\n\t\taddContext: (parentSessionId, context) => {\n\t\t\tset((state) => {\n\t\t\t\tconst newMap = new Map(state.pendingContexts);\n\t\t\t\tconst existing = newMap.get(parentSessionId) || [];\n\t\t\t\tif (!existing.some((c) => c.id === context.id)) {\n\t\t\t\t\tnewMap.set(parentSessionId, [...existing, context]);\n\t\t\t\t}\n\t\t\t\treturn { pendingContexts: newMap };\n\t\t\t});\n\t\t},\n\n\t\tremoveContext: (parentSessionId, contextId) => {\n\t\t\tset((state) => {\n\t\t\t\tconst newMap = new Map(state.pendingContexts);\n\t\t\t\tconst existing = newMap.get(parentSessionId) || [];\n\t\t\t\tnewMap.set(\n\t\t\t\t\tparentSessionId,\n\t\t\t\t\texisting.filter((c) => c.id !== contextId),\n\t\t\t\t);\n\t\t\t\treturn { pendingContexts: newMap };\n\t\t\t});\n\t\t},\n\n\t\tgetContexts: (parentSessionId) => {\n\t\t\treturn get().pendingContexts.get(parentSessionId) || [];\n\t\t},\n\n\t\tclearContexts: (parentSessionId) => {\n\t\t\tset((state) => {\n\t\t\t\tconst newMap = new Map(state.pendingContexts);\n\t\t\t\tnewMap.delete(parentSessionId);\n\t\t\t\treturn { pendingContexts: newMap };\n\t\t\t});\n\t\t},\n\n\t\tconsumeContexts: (parentSessionId) => {\n\t\t\tconst contexts = get().getContexts(parentSessionId);\n\t\t\tget().clearContexts(parentSessionId);\n\t\t\treturn contexts;\n\t\t},\n\t}),\n);\n",
62
+ "export interface ParsedResearchContext {\n\tid: string;\n\tlabel: string;\n\tcontent: string;\n\tfrom: string;\n}\n\nexport interface ParseResult {\n\tresearchContexts: ParsedResearchContext[];\n\tcleanContent: string;\n}\n\nconst RESEARCH_CONTEXT_REGEX =\n\t/<research-context\\s+from=\"([^\"]+)\"\\s+label=\"([^\"]+)\"[^>]*>([\\s\\S]*?)<\\/research-context>/g;\n\nexport function parseResearchContext(content: string): ParseResult {\n\tconst researchContexts: ParsedResearchContext[] = [];\n\tlet cleanContent = content;\n\n\tconst regex = new RegExp(RESEARCH_CONTEXT_REGEX);\n\tlet match = regex.exec(content);\n\n\twhile (match !== null) {\n\t\tconst [fullMatch, from, label, innerContent] = match;\n\t\tresearchContexts.push({\n\t\t\tid: from,\n\t\t\tfrom,\n\t\t\tlabel,\n\t\t\tcontent: innerContent.trim(),\n\t\t});\n\t\tcleanContent = cleanContent.replace(fullMatch, '');\n\t\tmatch = regex.exec(content);\n\t}\n\n\tcleanContent = cleanContent.trim();\n\n\treturn {\n\t\tresearchContexts,\n\t\tcleanContent,\n\t};\n}\n\nexport function formatResearchContextForMessage(\n\tcontexts: Array<{ sessionId: string; label: string; content: string }>,\n): string {\n\tif (contexts.length === 0) return '';\n\n\t// content is already the full XML from server, just join them\n\treturn contexts.map((ctx) => ctx.content).join('\\n\\n');\n}\n",
63
+ "import { useEffect, useCallback } from 'react';\nimport { apiClient } from '../lib/api-client';\nimport { useSetuStore } from '../stores/setuStore';\n\nexport function useSetuBalance(providerName: string | undefined) {\n\tconst setBalance = useSetuStore((s) => s.setBalance);\n\tconst setUsdcBalance = useSetuStore((s) => s.setUsdcBalance);\n\tconst setWalletAddress = useSetuStore((s) => s.setWalletAddress);\n\tconst setLoading = useSetuStore((s) => s.setLoading);\n\tconst setScope = useSetuStore((s) => s.setScope);\n\tconst setPayg = useSetuStore((s) => s.setPayg);\n\tconst setSubscription = useSetuStore((s) => s.setSubscription);\n\tconst setLimits = useSetuStore((s) => s.setLimits);\n\tconst balance = useSetuStore((s) => s.balance);\n\tconst usdcBalance = useSetuStore((s) => s.usdcBalance);\n\tconst network = useSetuStore((s) => s.network);\n\n\tconst fetchBalance = useCallback(async () => {\n\t\tif (providerName !== 'setu') {\n\t\t\treturn;\n\t\t}\n\n\t\tsetLoading(true);\n\t\ttry {\n\t\t\tconst [setuData, usdcData, walletData] = await Promise.all([\n\t\t\t\tapiClient.getSetuBalance(),\n\t\t\t\tapiClient.getSetuUsdcBalance(network),\n\t\t\t\tapiClient.getSetuWallet(),\n\t\t\t]);\n\n\t\t\tif (setuData) {\n\t\t\t\tsetBalance(setuData.balance);\n\t\t\t\tsetWalletAddress(setuData.walletAddress);\n\t\t\t\tsetScope(setuData.scope ?? null);\n\t\t\t\tsetPayg(setuData.payg ?? null);\n\t\t\t\tsetSubscription(setuData.subscription ?? null);\n\t\t\t\tsetLimits(setuData.limits ?? null);\n\t\t\t} else if (walletData?.configured && walletData.publicKey) {\n\t\t\t\tsetWalletAddress(walletData.publicKey);\n\t\t\t}\n\n\t\t\tif (usdcData) {\n\t\t\t\tsetUsdcBalance(usdcData.usdcBalance);\n\t\t\t\tif (!setuData && usdcData.walletAddress) {\n\t\t\t\t\tsetWalletAddress(usdcData.walletAddress);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t}, [\n\t\tproviderName,\n\t\tnetwork,\n\t\tsetBalance,\n\t\tsetUsdcBalance,\n\t\tsetWalletAddress,\n\t\tsetLoading,\n\t\tsetScope,\n\t\tsetPayg,\n\t\tsetSubscription,\n\t\tsetLimits,\n\t]);\n\n\tuseEffect(() => {\n\t\tif (providerName === 'setu' && (balance === null || usdcBalance === null)) {\n\t\t\tfetchBalance();\n\t\t}\n\t}, [providerName, balance, usdcBalance, fetchBalance]);\n\n\treturn {\n\t\tfetchBalance,\n\t};\n}\n",
64
+ "import { useEffect, useRef } from 'react';\nimport { useConfig, useUpdateDefaults } from '../../hooks/useConfig';\nimport { Modal } from '../ui/Modal';\nimport {\n\tUnifiedModelSelector,\n\ttype UnifiedModelSelectorRef,\n} from './UnifiedModelSelector';\nimport {\n\tUnifiedAgentSelector,\n\ttype UnifiedAgentSelectorRef,\n} from './UnifiedAgentSelector';\n\ninterface ConfigModalProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\tinitialFocus?: 'agent' | 'model' | null;\n\tchatInputRef?: React.RefObject<{ focus: () => void }>;\n\tagent: string;\n\tprovider: string;\n\tmodel: string;\n\tmodelSupportsReasoning?: boolean;\n\tonAgentChange: (agent: string) => void;\n\tonProviderChange: (provider: string) => void;\n\tonModelChange: (model: string) => void;\n\tonModelSelectorChange?: (provider: string, model: string) => void;\n}\n\nexport function ConfigModal({\n\tisOpen,\n\tonClose,\n\tinitialFocus,\n\tchatInputRef,\n\tagent,\n\tprovider,\n\tmodel,\n\tmodelSupportsReasoning,\n\tonAgentChange,\n\tonProviderChange,\n\tonModelChange,\n\tonModelSelectorChange,\n}: ConfigModalProps) {\n\tconst { data: config, isLoading: configLoading } = useConfig();\n\tconst updateDefaults = useUpdateDefaults();\n\tconst reasoningEnabled = config?.defaults?.reasoningText ?? true;\n\tconst agentSelectorRef = useRef<UnifiedAgentSelectorRef>(null);\n\tconst modelSelectorRef = useRef<UnifiedModelSelectorRef>(null);\n\n\tuseEffect(() => {\n\t\tif (isOpen && initialFocus) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (initialFocus === 'agent') {\n\t\t\t\t\tagentSelectorRef.current?.openAndFocus();\n\t\t\t\t} else if (initialFocus === 'model') {\n\t\t\t\t\tmodelSelectorRef.current?.openAndFocus();\n\t\t\t\t}\n\t\t\t}, 100);\n\t\t}\n\t}, [isOpen, initialFocus]);\n\n\tconst handleClose = () => {\n\t\tonClose();\n\t\t// Focus chat input after modal closes\n\t\tsetTimeout(() => {\n\t\t\tchatInputRef?.current?.focus();\n\t\t}, 100);\n\t};\n\n\tconst handleModelChange = (\n\t\tselectedProvider: string,\n\t\tselectedModel: string,\n\t) => {\n\t\tif (onModelSelectorChange) {\n\t\t\tonModelSelectorChange(selectedProvider, selectedModel);\n\t\t} else {\n\t\t\tonProviderChange(selectedProvider);\n\t\t\tonModelChange(selectedModel);\n\t\t}\n\t};\n\n\treturn (\n\t\t<Modal\n\t\t\tisOpen={isOpen}\n\t\t\tonClose={handleClose}\n\t\t\ttitle=\"Configuration\"\n\t\t\tcloseOnEscape={true}\n\t\t\tcloseOnBackdropClick={true}\n\t\t>\n\t\t\t{configLoading ? (\n\t\t\t\t<div className=\"text-center text-muted-foreground py-8\">\n\t\t\t\t\tLoading configuration...\n\t\t\t\t</div>\n\t\t\t) : config ? (\n\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div className=\"block text-sm font-medium text-foreground mb-2\">\n\t\t\t\t\t\t\tAgent\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<UnifiedAgentSelector\n\t\t\t\t\t\t\tref={agentSelectorRef}\n\t\t\t\t\t\t\tagent={agent}\n\t\t\t\t\t\t\tagents={config.agents}\n\t\t\t\t\t\t\tonChange={onAgentChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div className=\"block text-sm font-medium text-foreground mb-2\">\n\t\t\t\t\t\t\tProvider / Model\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<UnifiedModelSelector\n\t\t\t\t\t\t\tref={modelSelectorRef}\n\t\t\t\t\t\t\tprovider={provider}\n\t\t\t\t\t\t\tmodel={model}\n\t\t\t\t\t\t\tonChange={handleModelChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{modelSupportsReasoning && (\n\t\t\t\t\t\t<div className=\"flex items-center justify-between py-2\">\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<div className=\"text-sm font-medium text-foreground\">\n\t\t\t\t\t\t\t\t\tExtended Thinking\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tEnable reasoning for deeper analysis\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\trole=\"switch\"\n\t\t\t\t\t\t\t\taria-checked={reasoningEnabled}\n\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\tupdateDefaults.mutate({\n\t\t\t\t\t\t\t\t\t\treasoningText: !reasoningEnabled,\n\t\t\t\t\t\t\t\t\t\tscope: 'global',\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tclassName={`relative inline-flex h-6 w-11 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 ${\n\t\t\t\t\t\t\t\t\treasoningEnabled ? 'bg-primary' : 'bg-muted'\n\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tclassName={`inline-block h-4 w-4 transform rounded-full transition-transform ${\n\t\t\t\t\t\t\t\t\t\treasoningEnabled ? 'translate-x-6' : 'translate-x-1'\n\t\t\t\t\t\t\t\t\t} ${reasoningEnabled ? 'bg-primary-foreground' : 'bg-foreground'}`}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t</Modal>\n\t);\n}\n",
65
+ "import {\n\tuseState,\n\tuseEffect,\n\tuseRef,\n\tuseMemo,\n\tuseImperativeHandle,\n\tforwardRef,\n} from 'react';\nimport { ChevronDown, Search } from 'lucide-react';\nimport Fuse from 'fuse.js';\nimport { useAllModels } from '../../hooks/useConfig';\n\ninterface UnifiedModelSelectorProps {\n\tprovider: string;\n\tmodel: string;\n\tonChange: (provider: string, model: string) => void;\n\tdisabled?: boolean;\n}\n\ninterface FlattenedModel {\n\tproviderKey: string;\n\tproviderLabel: string;\n\tmodelId: string;\n\tmodelLabel: string;\n\ttoolCall?: boolean;\n\treasoningText?: boolean;\n\tavailable?: boolean;\n\tunavailableReason?: string;\n}\n\nexport interface UnifiedModelSelectorRef {\n\topenAndFocus: () => void;\n}\n\nexport const UnifiedModelSelector = forwardRef<\n\tUnifiedModelSelectorRef,\n\tUnifiedModelSelectorProps\n>(function UnifiedModelSelector(\n\t{ provider, model, onChange, disabled = false },\n\tref,\n) {\n\tconst { data: allModels, isLoading } = useAllModels();\n\tconst [isOpen, setIsOpen] = useState(false);\n\tconst [searchQuery, setSearchQuery] = useState('');\n\tconst [highlightedIndex, setHighlightedIndex] = useState(0);\n\tconst dropdownRef = useRef<HTMLDivElement>(null);\n\tconst searchInputRef = useRef<HTMLInputElement>(null);\n\tconst itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n\tuseImperativeHandle(ref, () => ({\n\t\topenAndFocus: () => {\n\t\t\tsetIsOpen(true);\n\t\t},\n\t}));\n\n\tconst flattenedModels = useMemo(() => {\n\t\tif (!allModels) return [];\n\t\tconst flattened: FlattenedModel[] = [];\n\t\tfor (const [providerKey, providerData] of Object.entries(allModels)) {\n\t\t\tfor (const modelItem of providerData.models) {\n\t\t\t\tflattened.push({\n\t\t\t\t\tproviderKey,\n\t\t\t\t\tproviderLabel: providerData.label,\n\t\t\t\t\tmodelId: modelItem.id,\n\t\t\t\t\tmodelLabel: modelItem.label,\n\t\t\t\t\ttoolCall: modelItem.toolCall,\n\t\t\t\t\treasoningText: modelItem.reasoningText,\n\t\t\t\t\tavailable: modelItem.available,\n\t\t\t\t\tunavailableReason: modelItem.unavailableReason,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn flattened;\n\t}, [allModels]);\n\n\tconst fuse = useMemo(() => {\n\t\treturn new Fuse(flattenedModels, {\n\t\t\tkeys: [\n\t\t\t\t{ name: 'modelLabel', weight: 2 },\n\t\t\t\t{ name: 'modelId', weight: 1 },\n\t\t\t\t{ name: 'providerLabel', weight: 0.5 },\n\t\t\t],\n\t\t\tthreshold: 0.3,\n\t\t\tignoreLocation: true,\n\t\t\tincludeScore: true,\n\t\t\tdistance: 100,\n\t\t\tminMatchCharLength: 1,\n\t\t});\n\t}, [flattenedModels]);\n\n\tconst filteredModels = useMemo(() => {\n\t\tif (!allModels) return {};\n\t\tif (!searchQuery.trim()) return allModels;\n\n\t\tconst results = fuse.search(searchQuery);\n\n\t\tconst sortedResults = results.sort((a, b) => {\n\t\t\tconst scoreA = a.score ?? 1;\n\t\t\tconst scoreB = b.score ?? 1;\n\t\t\tif (Math.abs(scoreA - scoreB) < 0.001) {\n\t\t\t\tconst labelA = a.item.modelLabel.toLowerCase();\n\t\t\t\tconst labelB = b.item.modelLabel.toLowerCase();\n\t\t\t\tconst query = searchQuery.toLowerCase();\n\t\t\t\tconst indexA = labelA.indexOf(query);\n\t\t\t\tconst indexB = labelB.indexOf(query);\n\t\t\t\tif (indexA >= 0 && indexB < 0) return -1;\n\t\t\t\tif (indexB >= 0 && indexA < 0) return 1;\n\t\t\t\tif (indexA >= 0 && indexB >= 0) return indexA - indexB;\n\t\t\t}\n\t\t\treturn scoreA - scoreB;\n\t\t});\n\n\t\tconst filtered: typeof allModels = {};\n\n\t\tfor (const result of sortedResults) {\n\t\t\tconst item = result.item;\n\n\t\t\tif (!filtered[item.providerKey]) {\n\t\t\t\tfiltered[item.providerKey] = {\n\t\t\t\t\tlabel: item.providerLabel,\n\t\t\t\t\tmodels: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst existingModel = filtered[item.providerKey].models.find(\n\t\t\t\t(m) => m.id === item.modelId,\n\t\t\t);\n\t\t\tif (!existingModel) {\n\t\t\t\tfiltered[item.providerKey].models.push({\n\t\t\t\t\tid: item.modelId,\n\t\t\t\t\tlabel: item.modelLabel,\n\t\t\t\t\ttoolCall: item.toolCall,\n\t\t\t\t\treasoningText: item.reasoningText,\n\t\t\t\t\tavailable: item.available,\n\t\t\t\t\tunavailableReason: item.unavailableReason,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn filtered;\n\t}, [allModels, searchQuery, fuse]);\n\n\tconst filteredFlatList = useMemo(() => {\n\t\tconst list: FlattenedModel[] = [];\n\t\tfor (const [providerKey, providerData] of Object.entries(filteredModels)) {\n\t\t\tfor (const modelItem of providerData.models) {\n\t\t\t\tlist.push({\n\t\t\t\t\tproviderKey,\n\t\t\t\t\tproviderLabel: providerData.label,\n\t\t\t\t\tmodelId: modelItem.id,\n\t\t\t\t\tmodelLabel: modelItem.label,\n\t\t\t\t\ttoolCall: modelItem.toolCall,\n\t\t\t\t\treasoningText: modelItem.reasoningText,\n\t\t\t\t\tavailable: modelItem.available,\n\t\t\t\t\tunavailableReason: modelItem.unavailableReason,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn list;\n\t}, [filteredModels]);\n\n\tuseEffect(() => {\n\t\tif (isOpen) {\n\t\t\tsetHighlightedIndex(0);\n\t\t}\n\t}, [isOpen]);\n\n\tuseEffect(() => {\n\t\tif (\n\t\t\tisOpen &&\n\t\t\thighlightedIndex >= 0 &&\n\t\t\thighlightedIndex < itemRefs.current.length\n\t\t) {\n\t\t\titemRefs.current[highlightedIndex]?.scrollIntoView({\n\t\t\t\tblock: 'nearest',\n\t\t\t\tbehavior: 'smooth',\n\t\t\t});\n\t\t}\n\t}, [highlightedIndex, isOpen]);\n\n\tuseEffect(() => {\n\t\tconst handleClickOutside = (event: MouseEvent) => {\n\t\t\tif (\n\t\t\t\tdropdownRef.current &&\n\t\t\t\t!dropdownRef.current.contains(event.target as Node)\n\t\t\t) {\n\t\t\t\tsetIsOpen(false);\n\t\t\t}\n\t\t};\n\n\t\tconst handleEscape = (event: KeyboardEvent) => {\n\t\t\tconst target = event.target as HTMLElement;\n\t\t\tconst isInInput =\n\t\t\t\ttarget.tagName === 'INPUT' ||\n\t\t\t\ttarget.tagName === 'TEXTAREA' ||\n\t\t\t\ttarget.isContentEditable;\n\t\t\tif (event.key === 'Escape' || (event.key === 'q' && !isInInput)) {\n\t\t\t\tsetIsOpen(false);\n\t\t\t}\n\t\t};\n\n\t\tif (isOpen) {\n\t\t\tdocument.addEventListener('mousedown', handleClickOutside);\n\t\t\tdocument.addEventListener('keydown', handleEscape);\n\t\t\tsetTimeout(() => searchInputRef.current?.focus(), 0);\n\t\t}\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('mousedown', handleClickOutside);\n\t\t\tdocument.removeEventListener('keydown', handleEscape);\n\t\t};\n\t}, [isOpen]);\n\n\tconst handleSelect = (\n\t\tselectedProvider: string,\n\t\tselectedModel: string,\n\t\tavailable?: boolean,\n\t) => {\n\t\tif (available === false) return;\n\t\tonChange(selectedProvider, selectedModel);\n\t\tsetIsOpen(false);\n\t\tsetSearchQuery('');\n\t};\n\n\tconst handleSearchKeyDown = (event: React.KeyboardEvent) => {\n\t\tif (filteredFlatList.length === 0) return;\n\n\t\tif (event.key === 'ArrowDown' || (event.ctrlKey && event.key === 'j')) {\n\t\t\tevent.preventDefault();\n\t\t\tsetHighlightedIndex((prev) =>\n\t\t\t\tprev < filteredFlatList.length - 1 ? prev + 1 : 0,\n\t\t\t);\n\t\t} else if (\n\t\t\tevent.key === 'ArrowUp' ||\n\t\t\t(event.ctrlKey && event.key === 'k')\n\t\t) {\n\t\t\tevent.preventDefault();\n\t\t\tsetHighlightedIndex((prev) =>\n\t\t\t\tprev > 0 ? prev - 1 : filteredFlatList.length - 1,\n\t\t\t);\n\t\t} else if (event.key === 'Enter') {\n\t\t\tevent.preventDefault();\n\t\t\tconst highlighted = filteredFlatList[highlightedIndex];\n\t\t\tif (highlighted && highlighted.available !== false) {\n\t\t\t\thandleSelect(\n\t\t\t\t\thighlighted.providerKey,\n\t\t\t\t\thighlighted.modelId,\n\t\t\t\t\thighlighted.available,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t};\n\n\tconst currentProviderLabel = allModels?.[provider]?.label || provider;\n\tconst currentModelLabel =\n\t\tallModels?.[provider]?.models.find((m) => m.id === model)?.label || model;\n\n\treturn (\n\t\t<div ref={dropdownRef} className=\"relative w-full\">\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => !disabled && setIsOpen(!isOpen)}\n\t\t\t\tdisabled={disabled || isLoading}\n\t\t\t\tclassName=\"w-full flex items-center justify-between px-3 py-2 bg-[hsl(var(--secondary))] border border-[hsl(var(--border))] rounded-md hover:bg-[hsl(var(--accent))] focus:outline-none focus:ring-2 focus:ring-[hsl(var(--ring))] disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n\t\t\t>\n\t\t\t\t<span className=\"flex items-center gap-2 text-sm truncate\">\n\t\t\t\t\t<span className=\"text-[hsl(var(--muted-foreground))]\">\n\t\t\t\t\t\t{currentProviderLabel}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"text-[hsl(var(--muted-foreground))]/50\">/</span>\n\t\t\t\t\t<span className=\"text-[hsl(var(--foreground))]\">\n\t\t\t\t\t\t{currentModelLabel}\n\t\t\t\t\t</span>\n\t\t\t\t</span>\n\t\t\t\t<ChevronDown\n\t\t\t\t\tclassName={`w-4 h-4 text-[hsl(var(--muted-foreground))] transition-transform ${isOpen ? 'rotate-180' : ''}`}\n\t\t\t\t/>\n\t\t\t</button>\n\t\t\t{isOpen && !isLoading && allModels && (\n\t\t\t\t<div className=\"absolute z-50 mt-1 w-full bg-[hsl(var(--popover))] border border-[hsl(var(--border))] rounded-md shadow-lg max-h-80 overflow-hidden flex flex-col\">\n\t\t\t\t\t<div className=\"p-2 border-b border-[hsl(var(--border))]\">\n\t\t\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t\t\t<Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[hsl(var(--muted-foreground))]\" />\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tref={searchInputRef}\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\tvalue={searchQuery}\n\t\t\t\t\t\t\t\tonChange={(e) => setSearchQuery(e.target.value)}\n\t\t\t\t\t\t\t\tonKeyDown={handleSearchKeyDown}\n\t\t\t\t\t\t\t\tplaceholder=\"Search providers and models...\"\n\t\t\t\t\t\t\t\tclassName=\"w-full pl-9 pr-3 py-2 bg-[hsl(var(--secondary))] border border-[hsl(var(--border))] rounded text-sm text-[hsl(var(--foreground))] placeholder-[hsl(var(--muted-foreground))] focus:outline-none focus:ring-2 focus:ring-[hsl(var(--ring))]\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div className=\"overflow-y-auto\">\n\t\t\t\t\t\t{Object.keys(filteredModels).length === 0 ? (\n\t\t\t\t\t\t\t<div className=\"p-4 text-center text-[hsl(var(--muted-foreground))] text-sm\">\n\t\t\t\t\t\t\t\tNo models found\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\tObject.entries(filteredModels).map(\n\t\t\t\t\t\t\t\t([providerKey, providerData]) => (\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tkey={providerKey}\n\t\t\t\t\t\t\t\t\t\tclassName=\"border-b border-[hsl(var(--border))] last:border-0\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<div className=\"sticky top-0 px-3 py-2 text-xs font-semibold text-[hsl(var(--muted-foreground))] uppercase tracking-wider bg-[hsl(var(--muted))] z-10\">\n\t\t\t\t\t\t\t\t\t\t\t{providerData.label}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t\t{providerData.models.map((modelItem) => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst isSelected =\n\t\t\t\t\t\t\t\t\t\t\t\t\tproviderKey === provider && modelItem.id === model;\n\t\t\t\t\t\t\t\t\t\t\t\tconst flatIndex = filteredFlatList.findIndex(\n\t\t\t\t\t\t\t\t\t\t\t\t\t(item) =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\titem.providerKey === providerKey &&\n\t\t\t\t\t\t\t\t\t\t\t\t\t\titem.modelId === modelItem.id,\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\tconst isHighlighted = flatIndex === highlightedIndex;\n\t\t\t\t\t\t\t\t\t\t\t\tconst isAvailable = modelItem.available !== false;\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={modelItem.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (flatIndex >= 0) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\titemRefs.current[flatIndex] = el;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={!isAvailable}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttitle={modelItem.unavailableReason}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\thandleSelect(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tproviderKey,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tmodelItem.id,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tmodelItem.available,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonMouseEnter={() => setHighlightedIndex(flatIndex)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={`w-full text-left px-4 py-2 text-sm flex items-center justify-between transition-colors ${\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisHighlighted\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'bg-[hsl(var(--accent))]'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'hover:bg-[hsl(var(--accent))]'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t} ${\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisSelected\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'text-[hsl(var(--accent-foreground))] font-medium'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'text-[hsl(var(--foreground))]'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t} ${\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t!isAvailable\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'opacity-60 cursor-not-allowed'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"truncate\">{modelItem.label}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{(!isAvailable ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tmodelItem.toolCall ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tmodelItem.reasoningText) && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex gap-1 ml-2 flex-shrink-0\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{!isAvailable && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-[10px] px-1.5 py-0.5 bg-red-600/20 text-red-400 rounded\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tUnavailable\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{modelItem.toolCall && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-[10px] px-1.5 py-0.5 bg-green-600/20 text-green-400 rounded\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tTools\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{modelItem.reasoningText && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-[10px] px-1.5 py-0.5 bg-purple-600/20 text-purple-400 rounded\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tReasoning\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n",
66
+ "import {\n\tuseState,\n\tuseEffect,\n\tuseRef,\n\tuseMemo,\n\tuseImperativeHandle,\n\tforwardRef,\n} from 'react';\nimport { ChevronDown, Search } from 'lucide-react';\nimport Fuse from 'fuse.js';\n\ninterface UnifiedAgentSelectorProps {\n\tagent: string;\n\tagents: string[];\n\tonChange: (agent: string) => void;\n\tdisabled?: boolean;\n}\n\nexport interface UnifiedAgentSelectorRef {\n\topenAndFocus: () => void;\n}\n\nexport const UnifiedAgentSelector = forwardRef<\n\tUnifiedAgentSelectorRef,\n\tUnifiedAgentSelectorProps\n>(function UnifiedAgentSelector(\n\t{ agent, agents, onChange, disabled = false },\n\tref,\n) {\n\tconst [isOpen, setIsOpen] = useState(false);\n\tconst [searchQuery, setSearchQuery] = useState('');\n\tconst [highlightedIndex, setHighlightedIndex] = useState(0);\n\tconst dropdownRef = useRef<HTMLDivElement>(null);\n\tconst searchInputRef = useRef<HTMLInputElement>(null);\n\tconst itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n\tuseImperativeHandle(ref, () => ({\n\t\topenAndFocus: () => {\n\t\t\tsetIsOpen(true);\n\t\t},\n\t}));\n\n\tconst fuse = useMemo(() => {\n\t\treturn new Fuse(agents, {\n\t\t\tthreshold: 0.4,\n\t\t\tignoreLocation: true,\n\t\t});\n\t}, [agents]);\n\n\tconst filteredAgents = useMemo(() => {\n\t\tif (!searchQuery.trim()) return agents;\n\t\tconst results = fuse.search(searchQuery);\n\t\treturn results.map((result) => result.item);\n\t}, [agents, searchQuery, fuse]);\n\n\tuseEffect(() => {\n\t\tif (isOpen) {\n\t\t\tsetHighlightedIndex(0);\n\t\t}\n\t}, [isOpen]);\n\n\tuseEffect(() => {\n\t\tif (\n\t\t\tisOpen &&\n\t\t\thighlightedIndex >= 0 &&\n\t\t\thighlightedIndex < itemRefs.current.length\n\t\t) {\n\t\t\titemRefs.current[highlightedIndex]?.scrollIntoView({\n\t\t\t\tblock: 'nearest',\n\t\t\t\tbehavior: 'smooth',\n\t\t\t});\n\t\t}\n\t}, [highlightedIndex, isOpen]);\n\n\tuseEffect(() => {\n\t\tconst handleClickOutside = (event: MouseEvent) => {\n\t\t\tif (\n\t\t\t\tdropdownRef.current &&\n\t\t\t\t!dropdownRef.current.contains(event.target as Node)\n\t\t\t) {\n\t\t\t\tsetIsOpen(false);\n\t\t\t}\n\t\t};\n\n\t\tconst handleEscape = (event: KeyboardEvent) => {\n\t\t\tconst target = event.target as HTMLElement;\n\t\t\tconst isInInput =\n\t\t\t\ttarget.tagName === 'INPUT' ||\n\t\t\t\ttarget.tagName === 'TEXTAREA' ||\n\t\t\t\ttarget.isContentEditable;\n\t\t\tif (event.key === 'Escape' || (event.key === 'q' && !isInInput)) {\n\t\t\t\tsetIsOpen(false);\n\t\t\t}\n\t\t};\n\n\t\tif (isOpen) {\n\t\t\tdocument.addEventListener('mousedown', handleClickOutside);\n\t\t\tdocument.addEventListener('keydown', handleEscape);\n\t\t\tsetTimeout(() => searchInputRef.current?.focus(), 0);\n\t\t}\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('mousedown', handleClickOutside);\n\t\t\tdocument.removeEventListener('keydown', handleEscape);\n\t\t};\n\t}, [isOpen]);\n\n\tconst handleSelect = (selectedAgent: string) => {\n\t\tonChange(selectedAgent);\n\t\tsetIsOpen(false);\n\t\tsetSearchQuery('');\n\t};\n\n\tconst handleSearchKeyDown = (event: React.KeyboardEvent) => {\n\t\tif (filteredAgents.length === 0) return;\n\n\t\tif (event.key === 'ArrowDown' || (event.ctrlKey && event.key === 'j')) {\n\t\t\tevent.preventDefault();\n\t\t\tsetHighlightedIndex((prev) =>\n\t\t\t\tprev < filteredAgents.length - 1 ? prev + 1 : 0,\n\t\t\t);\n\t\t} else if (\n\t\t\tevent.key === 'ArrowUp' ||\n\t\t\t(event.ctrlKey && event.key === 'k')\n\t\t) {\n\t\t\tevent.preventDefault();\n\t\t\tsetHighlightedIndex((prev) =>\n\t\t\t\tprev > 0 ? prev - 1 : filteredAgents.length - 1,\n\t\t\t);\n\t\t} else if (event.key === 'Enter') {\n\t\t\tevent.preventDefault();\n\t\t\tconst highlighted = filteredAgents[highlightedIndex];\n\t\t\tif (highlighted) {\n\t\t\t\thandleSelect(highlighted);\n\t\t\t}\n\t\t}\n\t};\n\n\treturn (\n\t\t<div ref={dropdownRef} className=\"relative w-full\">\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => !disabled && setIsOpen(!isOpen)}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tclassName=\"w-full flex items-center justify-between px-3 py-2 bg-[hsl(var(--secondary))] border border-[hsl(var(--border))] rounded-md hover:bg-[hsl(var(--accent))] focus:outline-none focus:ring-2 focus:ring-[hsl(var(--ring))] disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n\t\t\t>\n\t\t\t\t<span className=\"text-sm text-[hsl(var(--foreground))] truncate\">\n\t\t\t\t\t{agent}\n\t\t\t\t</span>\n\t\t\t\t<ChevronDown\n\t\t\t\t\tclassName={`w-4 h-4 text-[hsl(var(--muted-foreground))] transition-transform ${isOpen ? 'rotate-180' : ''}`}\n\t\t\t\t/>\n\t\t\t</button>\n\n\t\t\t{isOpen && (\n\t\t\t\t<div className=\"absolute z-50 mt-1 w-full bg-[hsl(var(--popover))] border border-[hsl(var(--border))] rounded-md shadow-lg max-h-80 overflow-hidden flex flex-col\">\n\t\t\t\t\t<div className=\"p-2 border-b border-[hsl(var(--border))]\">\n\t\t\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t\t\t<Search className=\"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-[hsl(var(--muted-foreground))]\" />\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tref={searchInputRef}\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\tvalue={searchQuery}\n\t\t\t\t\t\t\t\tonChange={(e) => setSearchQuery(e.target.value)}\n\t\t\t\t\t\t\t\tonKeyDown={handleSearchKeyDown}\n\t\t\t\t\t\t\t\tplaceholder=\"Search agents...\"\n\t\t\t\t\t\t\t\tclassName=\"w-full pl-9 pr-3 py-2 bg-[hsl(var(--secondary))] border border-[hsl(var(--border))] rounded text-sm text-[hsl(var(--foreground))] placeholder-[hsl(var(--muted-foreground))] focus:outline-none focus:ring-2 focus:ring-[hsl(var(--ring))]\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div className=\"overflow-y-auto\">\n\t\t\t\t\t\t{filteredAgents.length === 0 ? (\n\t\t\t\t\t\t\t<div className=\"p-4 text-center text-[hsl(var(--muted-foreground))] text-sm\">\n\t\t\t\t\t\t\t\tNo agents found\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\tfilteredAgents.map((agentItem, index) => {\n\t\t\t\t\t\t\t\tconst isSelected = agentItem === agent;\n\t\t\t\t\t\t\t\tconst isHighlighted = index === highlightedIndex;\n\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tkey={agentItem}\n\t\t\t\t\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\t\t\t\t\titemRefs.current[index] = el;\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => handleSelect(agentItem)}\n\t\t\t\t\t\t\t\t\t\tonMouseEnter={() => setHighlightedIndex(index)}\n\t\t\t\t\t\t\t\t\t\tclassName={`w-full text-left px-4 py-2 text-sm transition-colors ${\n\t\t\t\t\t\t\t\t\t\t\tisHighlighted\n\t\t\t\t\t\t\t\t\t\t\t\t? 'bg-[hsl(var(--accent))]'\n\t\t\t\t\t\t\t\t\t\t\t\t: 'hover:bg-[hsl(var(--accent))]'\n\t\t\t\t\t\t\t\t\t\t} ${\n\t\t\t\t\t\t\t\t\t\t\tisSelected\n\t\t\t\t\t\t\t\t\t\t\t\t? 'text-[hsl(var(--accent-foreground))] font-medium'\n\t\t\t\t\t\t\t\t\t\t\t\t: 'text-[hsl(var(--foreground))]'\n\t\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<span className=\"truncate\">{agentItem}</span>\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n",
67
+ "import { useEffect } from 'react';\nimport { Settings } from 'lucide-react';\nimport { useConfig, useModels } from '../../hooks/useConfig';\n\ninterface ConfigSelectorProps {\n\tagent: string;\n\tprovider: string;\n\tmodel: string;\n\tonAgentChange: (agent: string) => void;\n\tonProviderChange: (provider: string) => void;\n\tonModelChange: (model: string) => void;\n}\n\nexport function ConfigSelector({\n\tagent,\n\tprovider,\n\tmodel,\n\tonAgentChange,\n\tonProviderChange,\n\tonModelChange,\n}: ConfigSelectorProps) {\n\tconst { data: config, isLoading: configLoading } = useConfig();\n\tconst { data: modelsData, isLoading: modelsLoading } = useModels(provider);\n\n\tconsole.log('ConfigSelector rendered', {\n\t\tconfig,\n\t\tconfigLoading,\n\t\tagent,\n\t\tprovider,\n\t\tmodel,\n\t});\n\n\t// Set defaults when config loads\n\tuseEffect(() => {\n\t\tif (config && !agent && !provider && !model) {\n\t\t\tonAgentChange(config.defaults.agent);\n\t\t\tonProviderChange(config.defaults.provider);\n\t\t\tonModelChange(config.defaults.model);\n\t\t}\n\t}, [\n\t\tconfig,\n\t\tagent,\n\t\tprovider,\n\t\tmodel,\n\t\tonAgentChange,\n\t\tonProviderChange,\n\t\tonModelChange,\n\t]);\n\n\t// Update model when provider changes\n\tuseEffect(() => {\n\t\tif (modelsData && modelsData.models.length > 0) {\n\t\t\tconst currentModelExists = modelsData.models.some((m) => m.id === model);\n\t\t\tif (!currentModelExists) {\n\t\t\t\tonModelChange(modelsData.default || modelsData.models[0].id);\n\t\t\t}\n\t\t}\n\t}, [modelsData, model, onModelChange]);\n\n\tif (configLoading) {\n\t\treturn (\n\t\t\t<div className=\"flex items-center gap-2 px-4 py-2 border-t border-border bg-background/50\">\n\t\t\t\t<Settings className=\"h-4 w-4 text-muted-foreground animate-spin\" />\n\t\t\t\t<span className=\"text-xs text-muted-foreground\">Loading config...</span>\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (!config) return null;\n\n\treturn (\n\t\t<div className=\"absolute bottom-24 left-0 right-0 pb-2 px-4 pointer-events-none z-40\">\n\t\t\t<div className=\"max-w-3xl mx-auto pointer-events-auto\">\n\t\t\t\t<div className=\"flex items-center gap-2 px-4 py-2 border border-border bg-background/95 backdrop-blur-sm rounded-lg\">\n\t\t\t\t\t<Settings className=\"h-4 w-4 text-muted-foreground\" />\n\n\t\t\t\t\t<select\n\t\t\t\t\t\tvalue={agent}\n\t\t\t\t\t\tonChange={(e) => onAgentChange(e.target.value)}\n\t\t\t\t\t\tclassName=\"text-xs bg-background border border-border rounded px-2 py-1 outline-none\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{config.agents.map((a) => (\n\t\t\t\t\t\t\t<option key={a} value={a}>\n\t\t\t\t\t\t\t\t{a}\n\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</select>\n\n\t\t\t\t\t<select\n\t\t\t\t\t\tvalue={provider}\n\t\t\t\t\t\tonChange={(e) => onProviderChange(e.target.value)}\n\t\t\t\t\t\tclassName=\"text-xs bg-background border border-border rounded px-2 py-1 outline-none\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{config.providers.map((p) => (\n\t\t\t\t\t\t\t<option key={p} value={p}>\n\t\t\t\t\t\t\t\t{p}\n\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</select>\n\n\t\t\t\t\t<select\n\t\t\t\t\t\tvalue={model}\n\t\t\t\t\t\tonChange={(e) => onModelChange(e.target.value)}\n\t\t\t\t\t\tdisabled={modelsLoading || !modelsData}\n\t\t\t\t\t\tclassName=\"text-xs bg-background border border-border rounded px-2 py-1 outline-none disabled:opacity-50\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{modelsData?.models.map((m) => (\n\t\t\t\t\t\t\t<option key={m.id} value={m.id}>\n\t\t\t\t\t\t\t\t{m.label}\n\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</select>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n",
68
+ "import { StopCircle } from 'lucide-react';\nimport { useState } from 'react';\nimport { apiClient } from '../../lib/api-client';\n\ninterface StopButtonProps {\n\tsessionId: string;\n\tonStop?: () => void;\n\tdisabled?: boolean;\n}\n\nexport function StopButton({ sessionId, onStop, disabled }: StopButtonProps) {\n\tconst [isAborting, setIsAborting] = useState(false);\n\n\tconst handleStop = async () => {\n\t\tif (isAborting) return;\n\t\tsetIsAborting(true);\n\n\t\ttry {\n\t\t\tawait apiClient.abortSession(sessionId);\n\t\t\tonStop?.();\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to abort stream:', error);\n\t\t} finally {\n\t\t\t// Keep button disabled for a bit to prevent double-clicks\n\t\t\tsetTimeout(() => setIsAborting(false), 1000);\n\t\t}\n\t};\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={handleStop}\n\t\t\tdisabled={disabled || isAborting}\n\t\t\tclassName=\"flex items-center gap-1.5 text-sm text-destructive hover:text-destructive/80 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n\t\t\ttitle=\"Stop generation\"\n\t\t>\n\t\t\t<StopCircle className=\"w-4 h-4\" />\n\t\t\t<span className=\"font-medium\">{isAborting ? 'Stopping...' : 'Stop'}</span>\n\t\t</button>\n\t);\n}\n",
69
+ "import { useEffect, useRef, useState, useMemo, memo, useCallback } from 'react';\nimport { ArrowDown } from 'lucide-react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport type { Message, Session } from '../../types/api';\nimport { AssistantMessageGroup } from './AssistantMessageGroup';\nimport { UserMessageGroup } from './UserMessageGroup';\nimport { SessionHeader } from '../sessions/SessionHeader';\nimport { LeanHeader } from '../sessions/LeanHeader';\nimport { TopupApprovalCard } from './TopupApprovalCard';\nimport { useTopupApprovalStore } from '../../stores/topupApprovalStore';\nimport { apiClient } from '../../lib/api-client';\nimport { toast } from '../../stores/toastStore';\n\ninterface MessageThreadProps {\n\tmessages: Message[];\n\tsession?: Session;\n\tsessionId?: string;\n\tisGenerating?: boolean;\n\tcompact?: boolean;\n\tdisableAutoScroll?: boolean;\n\tonSelectSession?: (sessionId: string) => void;\n}\n\nexport const MessageThread = memo(function MessageThread({\n\tmessages,\n\tsession,\n\tsessionId,\n\tisGenerating,\n\tcompact = false,\n\tdisableAutoScroll = false,\n\tonSelectSession,\n}: MessageThreadProps) {\n\tconst queryClient = useQueryClient();\n\tconst bottomRef = useRef<HTMLDivElement>(null);\n\tconst scrollContainerRef = useRef<HTMLDivElement>(null);\n\tconst sessionHeaderRef = useRef<HTMLDivElement>(null);\n\tconst [autoScroll, setAutoScroll] = useState(true);\n\tconst autoScrollRef = useRef(true);\n\tconst [showLeanHeader, setShowLeanHeader] = useState(false);\n\tconst userScrollingRef = useRef(false);\n\tconst userScrollTimeoutRef = useRef<\n\t\tReturnType<typeof setTimeout> | undefined\n\t>(undefined);\n\tconst targetScrollRef = useRef(0);\n\tconst animationFrameRef = useRef<number | undefined>(undefined);\n\tconst initialScrollDoneRef = useRef(false);\n\tconst lastSessionIdRef = useRef<string | undefined>(session?.id);\n\tconst prevMessagesLengthRef = useRef(messages.length);\n\tconst prevIsGeneratingRef = useRef(isGenerating);\n\tconst lastScrollHeightRef = useRef(0);\n\tconst lastScrollTopRef = useRef(0);\n\n\tconst pendingTopup = useTopupApprovalStore((s) => s.pendingTopup);\n\tconst clearPendingTopup = useTopupApprovalStore((s) => s.clearPendingTopup);\n\n\tconst showTopupApproval =\n\t\tpendingTopup && pendingTopup.sessionId === sessionId;\n\n\tconst handleScroll = useCallback(() => {\n\t\tconst container = scrollContainerRef.current;\n\t\tif (!container) return;\n\n\t\tconst { scrollTop, scrollHeight, clientHeight } = container;\n\t\tconst distanceFromBottom = scrollHeight - scrollTop - clientHeight;\n\n\t\tconst scrollHeightIncreased = scrollHeight > lastScrollHeightRef.current;\n\t\tconst userScrolledUp = scrollTop < lastScrollTopRef.current - 5;\n\n\t\tlastScrollHeightRef.current = scrollHeight;\n\t\tlastScrollTopRef.current = scrollTop;\n\n\t\tif (distanceFromBottom < 100) {\n\t\t\tautoScrollRef.current = true;\n\t\t\tsetAutoScroll(true);\n\t\t} else if (userScrolledUp) {\n\t\t\tautoScrollRef.current = false;\n\t\t\tsetAutoScroll(false);\n\t\t\tuserScrollingRef.current = true;\n\t\t} else if (!scrollHeightIncreased && autoScrollRef.current) {\n\t\t\tautoScrollRef.current = false;\n\t\t\tsetAutoScroll(false);\n\t\t}\n\t\tif (\n\t\t\tuserScrolledUp ||\n\t\t\t(!autoScrollRef.current && distanceFromBottom >= 100)\n\t\t) {\n\t\t\tif (userScrollTimeoutRef.current) {\n\t\t\t\tclearTimeout(userScrollTimeoutRef.current);\n\t\t\t}\n\t\t\tuserScrollTimeoutRef.current = setTimeout(() => {\n\t\t\t\tuserScrollingRef.current = false;\n\t\t\t}, 150);\n\t\t}\n\n\t\tconst headerElement = sessionHeaderRef.current;\n\t\tif (headerElement) {\n\t\t\tconst headerRect = headerElement.getBoundingClientRect();\n\t\t\tconst containerRect = container.getBoundingClientRect();\n\t\t\tsetShowLeanHeader(headerRect.bottom < containerRect.top);\n\t\t}\n\t}, []);\n\n\t// Immediate scroll to bottom on initial load or session change\n\tuseEffect(() => {\n\t\tif (disableAutoScroll) return;\n\n\t\tconst sessionChanged = session?.id !== lastSessionIdRef.current;\n\t\tlastSessionIdRef.current = session?.id;\n\n\t\tif (sessionChanged) {\n\t\t\tinitialScrollDoneRef.current = false;\n\t\t}\n\n\t\tif (!initialScrollDoneRef.current && messages.length > 0) {\n\t\t\tinitialScrollDoneRef.current = true;\n\t\t\tconst container = scrollContainerRef.current;\n\t\t\tif (container) {\n\t\t\t\tcontainer.scrollTop = container.scrollHeight;\n\t\t\t}\n\t\t}\n\t}, [messages.length, session?.id, disableAutoScroll]);\n\n\tuseEffect(() => {\n\t\tif (disableAutoScroll) return;\n\n\t\tconst justStartedGenerating = isGenerating && !prevIsGeneratingRef.current;\n\t\tconst messagesAdded = messages.length > prevMessagesLengthRef.current;\n\n\t\tprevIsGeneratingRef.current = isGenerating;\n\t\tprevMessagesLengthRef.current = messages.length;\n\n\t\t// Scroll to bottom when generation starts (user just sent a message)\n\t\tif (justStartedGenerating) {\n\t\t\tuserScrollingRef.current = false;\n\t\t\tautoScrollRef.current = true;\n\t\t\tsetAutoScroll(true);\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tconst container = scrollContainerRef.current;\n\t\t\t\t\tif (container) {\n\t\t\t\t\t\tcontainer.scrollTop = container.scrollHeight;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t} else if (messagesAdded && !userScrollingRef.current && !isGenerating) {\n\t\t\tautoScrollRef.current = true;\n\t\t\tsetAutoScroll(true);\n\t\t}\n\t}, [messages.length, isGenerating, disableAutoScroll]);\n\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: messages dep needed for streaming content updates\n\tuseEffect(() => {\n\t\tif (disableAutoScroll) return;\n\n\t\tconst container = scrollContainerRef.current;\n\t\tif (!container || !autoScroll || userScrollingRef.current) return;\n\n\t\ttargetScrollRef.current = container.scrollHeight - container.clientHeight;\n\n\t\tconst animate = () => {\n\t\t\tconst el = scrollContainerRef.current;\n\t\t\tif (!el || userScrollingRef.current) return;\n\n\t\t\tconst current = el.scrollTop;\n\t\t\tconst target = el.scrollHeight - el.clientHeight;\n\t\t\tconst diff = target - current;\n\n\t\t\tif (Math.abs(diff) < 1) {\n\t\t\t\tel.scrollTop = el.scrollHeight - el.clientHeight;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If very close, just snap to bottom\n\t\t\tif (Math.abs(diff) < 10) {\n\t\t\t\tel.scrollTop = el.scrollHeight - el.clientHeight;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tel.scrollTop = current + diff * 0.15;\n\t\t\tanimationFrameRef.current = requestAnimationFrame(animate);\n\t\t};\n\n\t\tif (animationFrameRef.current) {\n\t\t\tcancelAnimationFrame(animationFrameRef.current);\n\t\t}\n\t\tanimationFrameRef.current = requestAnimationFrame(animate);\n\t}, [messages, autoScroll]);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (userScrollTimeoutRef.current) {\n\t\t\t\tclearTimeout(userScrollTimeoutRef.current);\n\t\t\t}\n\t\t\tif (animationFrameRef.current) {\n\t\t\t\tcancelAnimationFrame(animationFrameRef.current);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\tconst scrollToBottom = () => {\n\t\tuserScrollingRef.current = false;\n\t\tautoScrollRef.current = true;\n\t\tsetAutoScroll(true);\n\t\tconst container = scrollContainerRef.current;\n\t\tif (container) {\n\t\t\tcontainer.scrollTop = container.scrollHeight;\n\t\t}\n\t};\n\n\tconst filteredMessages = useMemo(() => {\n\t\treturn messages\n\t\t\t.filter((message) => message.role !== 'system')\n\t\t\t.sort((a, b) => a.createdAt - b.createdAt);\n\t}, [messages]);\n\n\t// Create a retry handler for error messages\n\tconst createRetryHandler = useCallback(\n\t\t(messageId: string) => {\n\t\t\treturn async () => {\n\t\t\t\tif (!sessionId) return;\n\t\t\t\tif (!messageId) return;\n\n\t\t\t\tqueryClient.setQueryData<Message[]>(\n\t\t\t\t\t['messages', sessionId],\n\t\t\t\t\t(oldMessages) => {\n\t\t\t\t\t\tif (!oldMessages) return oldMessages;\n\t\t\t\t\t\treturn oldMessages.map((msg) => {\n\t\t\t\t\t\t\tif (msg.id !== messageId) return msg;\n\t\t\t\t\t\t\tconst partsToKeep =\n\t\t\t\t\t\t\t\tmsg.parts?.filter(\n\t\t\t\t\t\t\t\t\t(part: { type: string; toolName?: string }) => {\n\t\t\t\t\t\t\t\t\t\tif (part.type === 'error') return false;\n\t\t\t\t\t\t\t\t\t\tif (part.type === 'tool_call' && part.toolName === 'finish')\n\t\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t) ?? [];\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t...msg,\n\t\t\t\t\t\t\t\tstatus: 'pending',\n\t\t\t\t\t\t\t\tparts: partsToKeep,\n\t\t\t\t\t\t\t\terror: null,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\ttry {\n\t\t\t\t\tawait apiClient.retryMessage(sessionId, messageId);\n\t\t\t\t} catch (error) {\n\t\t\t\t\ttoast.error(\n\t\t\t\t\t\terror instanceof Error ? error.message : 'Failed to retry',\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\t\t[sessionId, queryClient],\n\t);\n\n\tconst handleCompact = useCallback(async () => {\n\t\tif (!sessionId) return;\n\t\ttry {\n\t\t\tawait apiClient.sendMessage(sessionId, { content: '/compact' });\n\t\t} catch (error) {\n\t\t\ttoast.error(error instanceof Error ? error.message : 'Failed to compact');\n\t\t}\n\t}, [sessionId]);\n\n\tif (messages.length === 0) {\n\t\treturn (\n\t\t\t<div className=\"flex-1 flex items-center justify-center text-muted-foreground text-sm\">\n\t\t\t\tNo messages yet. Start a conversation below.\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"absolute inset-0 flex flex-col\">\n\t\t\t{/* Lean Header - shows when session header scrolls off - positioned within thread */}\n\t\t\t{session && (\n\t\t\t\t<LeanHeader\n\t\t\t\t\tsession={session}\n\t\t\t\t\tisVisible={showLeanHeader}\n\t\t\t\t\tisGenerating={isGenerating}\n\t\t\t\t\tonNavigateToSession={onSelectSession}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t<div\n\t\t\t\tref={scrollContainerRef}\n\t\t\t\tclassName=\"flex-1 overflow-y-auto\"\n\t\t\t\tonScroll={handleScroll}\n\t\t\t>\n\t\t\t\t{/* Session Header - scrolls with content */}\n\t\t\t\t<div ref={sessionHeaderRef}>\n\t\t\t\t\t{session && (\n\t\t\t\t\t\t<SessionHeader\n\t\t\t\t\t\t\tsession={session}\n\t\t\t\t\t\t\tonNavigateToSession={onSelectSession}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Messages */}\n\t\t\t\t<div className={compact ? 'p-4 pb-56' : 'p-6 pb-64'}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\tcompact\n\t\t\t\t\t\t\t\t? 'max-w-3xl mx-auto space-y-4'\n\t\t\t\t\t\t\t\t: 'max-w-3xl mx-auto space-y-6'\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\t{filteredMessages.map((message, idx) => {\n\t\t\t\t\t\t\tconst prevMessage = filteredMessages[idx - 1];\n\t\t\t\t\t\t\tconst nextMessage = filteredMessages[idx + 1];\n\t\t\t\t\t\t\tconst isLastMessage = idx === filteredMessages.length - 1;\n\n\t\t\t\t\t\t\tif (message.role === 'user') {\n\t\t\t\t\t\t\t\tconst nextAssistantMessage =\n\t\t\t\t\t\t\t\t\tnextMessage && nextMessage.role === 'assistant'\n\t\t\t\t\t\t\t\t\t\t? nextMessage\n\t\t\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<UserMessageGroup\n\t\t\t\t\t\t\t\t\t\tkey={message.id}\n\t\t\t\t\t\t\t\t\t\tsessionId={sessionId}\n\t\t\t\t\t\t\t\t\t\tmessage={message}\n\t\t\t\t\t\t\t\t\t\tisFirst={idx === 0}\n\t\t\t\t\t\t\t\t\t\tnextAssistantMessageId={nextAssistantMessage?.id}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (message.role === 'assistant') {\n\t\t\t\t\t\t\t\tconst showHeader =\n\t\t\t\t\t\t\t\t\t!prevMessage || prevMessage.role !== 'assistant';\n\t\t\t\t\t\t\t\tconst nextIsAssistant =\n\t\t\t\t\t\t\t\t\tnextMessage && nextMessage.role === 'assistant';\n\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<AssistantMessageGroup\n\t\t\t\t\t\t\t\t\t\tkey={message.id}\n\t\t\t\t\t\t\t\t\t\tsessionId={sessionId}\n\t\t\t\t\t\t\t\t\t\tmessage={message}\n\t\t\t\t\t\t\t\t\t\tshowHeader={showHeader}\n\t\t\t\t\t\t\t\t\t\thasNextAssistantMessage={nextIsAssistant}\n\t\t\t\t\t\t\t\t\t\tisLastMessage={isLastMessage}\n\t\t\t\t\t\t\t\t\t\tonBranchCreated={onSelectSession}\n\t\t\t\t\t\t\t\t\t\tonRetry={\n\t\t\t\t\t\t\t\t\t\t\tisLastMessage ? createRetryHandler(message.id) : undefined\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tcompact={compact}\n\t\t\t\t\t\t\t\t\t\tonCompact={isLastMessage ? handleCompact : undefined}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t})}\n\n\t\t\t\t\t\t{/* Topup Approval Card - shown when payment required */}\n\t\t\t\t\t\t{showTopupApproval && pendingTopup && (\n\t\t\t\t\t\t\t<div className=\"py-4\">\n\t\t\t\t\t\t\t\t<TopupApprovalCard\n\t\t\t\t\t\t\t\t\tpendingTopup={pendingTopup}\n\t\t\t\t\t\t\t\t\tonMethodSelected={() => clearPendingTopup()}\n\t\t\t\t\t\t\t\t\tonCancel={() => clearPendingTopup()}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t<div ref={bottomRef} />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Scroll to bottom button - only shown when user has scrolled up */}\n\t\t\t{!autoScroll && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={scrollToBottom}\n\t\t\t\t\tclassName=\"absolute bottom-36 left-1/2 -translate-x-1/2 flex items-center gap-2 px-4 py-2 bg-background border border-border rounded-full shadow-lg hover:bg-muted/50 transition-all text-sm text-foreground z-10\"\n\t\t\t\t>\n\t\t\t\t\t<ArrowDown className=\"w-4 h-4\" />\n\t\t\t\t\t<span>Scroll to bottom</span>\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n",
70
+ "import { memo, useState, useCallback, useMemo } from 'react';\nimport {\n\tSparkles,\n\tGitBranch,\n\tCopy,\n\tCheck,\n\tShield,\n\tCheckCheck,\n} from 'lucide-react';\nimport type { Message, MessagePart } from '../../types/api';\nimport { MessagePartItem } from './MessagePartItem';\nimport { CompactActivityGroup } from './CompactActivityGroup';\nimport { useMessageQueuePosition } from '../../hooks/useQueueState';\nimport { BranchModal } from '../branch/BranchModal';\nimport { ProviderLogo } from '../common/ProviderLogo';\nimport { useToolApprovalStore } from '../../stores/toolApprovalStore';\nimport { apiClient } from '../../lib/api-client';\nimport {\n\ttype CompactActivityEntry,\n\tbuildCompactActivityEntries,\n\tisCompactActivityPart,\n} from './compactActivity';\n\ninterface AssistantMessageGroupProps {\n\tsessionId?: string;\n\tmessage: Message;\n\tshowHeader: boolean;\n\thasNextAssistantMessage: boolean;\n\tisLastMessage: boolean;\n\tonBranchCreated?: (newSessionId: string) => void;\n\tcompact?: boolean;\n\tshowBranchButton?: boolean;\n\tonNavigateToSession?: (sessionId: string) => void;\n\tonRetry?: () => void;\n\tonCompact?: () => void;\n}\n\nconst loadingMessages = [\n\t'Generating...',\n\t'Cooking up something...',\n\t'Thinking...',\n\t'Processing...',\n\t'Working on it...',\n\t'Crafting response...',\n\t'Brewing magic...',\n\t'Computing...',\n];\n\nfunction getLoadingMessage(messageId: string) {\n\tconst hash = messageId\n\t\t.split('')\n\t\t.reduce((acc, char) => acc + char.charCodeAt(0), 0);\n\treturn loadingMessages[hash % loadingMessages.length];\n}\n\ntype AssistantRenderItem =\n\t| {\n\t\t\tkind: 'part';\n\t\t\tindex: number;\n\t\t\tpart: MessagePart;\n\t }\n\t| {\n\t\t\tkind: 'group';\n\t\t\tid: string;\n\t\t\tentries: CompactActivityEntry[];\n\t\t\ttitleOverride?: string;\n\t };\n\nexport const AssistantMessageGroup = memo(\n\tfunction AssistantMessageGroup({\n\t\tsessionId,\n\t\tmessage,\n\t\tshowHeader,\n\t\thasNextAssistantMessage,\n\t\tonBranchCreated,\n\t\tcompact,\n\t\tshowBranchButton = true,\n\t\tonNavigateToSession,\n\t\tonRetry,\n\t\tonCompact,\n\t}: AssistantMessageGroupProps) {\n\t\tconst { isQueued } = useMessageQueuePosition(sessionId, message.id);\n\t\tconst [isHovered, setIsHovered] = useState(false);\n\t\tconst [showBranchModal, setShowBranchModal] = useState(false);\n\t\tconst [copied, setCopied] = useState(false);\n\n\t\t// Tool approval handling\n\t\tconst { pendingApprovals, removePendingApproval } = useToolApprovalStore();\n\n\t\tconst handleApprove = useCallback(\n\t\t\tasync (callId: string) => {\n\t\t\t\tif (!sessionId) return;\n\t\t\t\ttry {\n\t\t\t\t\tawait apiClient.approveToolCall(sessionId, callId, true);\n\t\t\t\t\tremovePendingApproval(callId);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('Failed to approve tool call:', error);\n\t\t\t\t}\n\t\t\t},\n\t\t\t[sessionId, removePendingApproval],\n\t\t);\n\n\t\tconst handleReject = useCallback(\n\t\t\tasync (callId: string) => {\n\t\t\t\tif (!sessionId) return;\n\t\t\t\ttry {\n\t\t\t\t\tawait apiClient.approveToolCall(sessionId, callId, false);\n\t\t\t\t\tremovePendingApproval(callId);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('Failed to reject tool call:', error);\n\t\t\t\t}\n\t\t\t},\n\t\t\t[sessionId, removePendingApproval],\n\t\t);\n\n\t\t// Handle approving all pending approvals for this message\n\t\tconst messagePendingApprovals = useMemo(() => {\n\t\t\treturn pendingApprovals.filter((a) => a.messageId === message.id);\n\t\t}, [pendingApprovals, message.id]);\n\n\t\tconst handleApproveAll = useCallback(async () => {\n\t\t\tif (!sessionId) return;\n\t\t\ttry {\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tmessagePendingApprovals.map((a) =>\n\t\t\t\t\t\tapiClient.approveToolCall(sessionId, a.callId, true),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tfor (const a of messagePendingApprovals) {\n\t\t\t\t\tremovePendingApproval(a.callId);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('Failed to approve all tool calls:', error);\n\t\t\t}\n\t\t}, [sessionId, messagePendingApprovals, removePendingApproval]);\n\n\t\t// Sort parts by index to maintain correct order when tool results come in\n\t\tconst parts = useMemo(() => {\n\t\t\tconst rawParts = message.parts || [];\n\t\t\treturn [...rawParts].sort((a, b) => {\n\t\t\t\tconst indexDiff = (a.index ?? 0) - (b.index ?? 0);\n\t\t\t\tif (indexDiff !== 0) return indexDiff;\n\t\t\t\tconst stepDiff = (a.stepIndex ?? 0) - (b.stepIndex ?? 0);\n\t\t\t\tif (stepDiff !== 0) return stepDiff;\n\t\t\t\t// Secondary sort by startedAt for parts with same index\n\t\t\t\treturn (a.startedAt ?? 0) - (b.startedAt ?? 0);\n\t\t\t});\n\t\t}, [message.parts]);\n\n\t\tconst hasFinish = parts.some((part) => part.toolName === 'finish');\n\t\tconst latestProgressUpdateIndex = parts.reduce(\n\t\t\t(lastIndex, part, index) =>\n\t\t\t\tpart.type === 'tool_result' && part.toolName === 'progress_update'\n\t\t\t\t\t? index\n\t\t\t\t\t: lastIndex,\n\t\t\t-1,\n\t\t);\n\t\tconst latestProgressUpdatePart =\n\t\t\tlatestProgressUpdateIndex >= 0 ? parts[latestProgressUpdateIndex] : null;\n\t\tconst renderItems = useMemo(() => {\n\t\t\tconst items: AssistantRenderItem[] = [];\n\t\t\tlet compactBuffer: MessagePart[] = [];\n\t\t\tlet bufferStartIndex = -1;\n\t\t\tlet pendingTitle: string | undefined;\n\n\t\t\tconst flushCompactBuffer = (nextTitle?: string) => {\n\t\t\t\tif (compactBuffer.length === 0) {\n\t\t\t\t\tif (nextTitle) {\n\t\t\t\t\t\tpendingTitle = nextTitle;\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst entries = buildCompactActivityEntries(compactBuffer);\n\t\t\t\tif (entries.length > 0) {\n\t\t\t\t\titems.push({\n\t\t\t\t\t\tkind: 'group',\n\t\t\t\t\t\tid: `compact-${compactBuffer[0].id}`,\n\t\t\t\t\t\tentries,\n\t\t\t\t\t\ttitleOverride: pendingTitle,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tfor (const [offset, part] of compactBuffer.entries()) {\n\t\t\t\t\t\titems.push({\n\t\t\t\t\t\t\tkind: 'part',\n\t\t\t\t\t\t\tindex: bufferStartIndex + offset,\n\t\t\t\t\t\t\tpart,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcompactBuffer = [];\n\t\t\t\tbufferStartIndex = -1;\n\t\t\t\tpendingTitle = nextTitle;\n\t\t\t};\n\n\t\t\tfor (const [index, part] of parts.entries()) {\n\t\t\t\tconst isProgressUpdate =\n\t\t\t\t\t(part.type === 'tool_result' || part.type === 'tool_call') &&\n\t\t\t\t\tpart.toolName === 'progress_update';\n\n\t\t\t\tif (isProgressUpdate) {\n\t\t\t\t\tlet msg: string | undefined;\n\t\t\t\t\tconst payload =\n\t\t\t\t\t\tpart.contentJson && typeof part.contentJson === 'object'\n\t\t\t\t\t\t\t? part.contentJson\n\t\t\t\t\t\t\t: null;\n\t\t\t\t\tif (payload) {\n\t\t\t\t\t\tconst bucket =\n\t\t\t\t\t\t\t(payload as Record<string, unknown>).args ??\n\t\t\t\t\t\t\t(payload as Record<string, unknown>).result;\n\t\t\t\t\t\tif (bucket && typeof bucket === 'object') {\n\t\t\t\t\t\t\tconst m = (bucket as Record<string, unknown>).message;\n\t\t\t\t\t\t\tif (typeof m === 'string' && m.trim()) {\n\t\t\t\t\t\t\t\tmsg = m.trim();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (msg) {\n\t\t\t\t\t\tflushCompactBuffer(msg);\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (compact && isCompactActivityPart(part)) {\n\t\t\t\t\tif (compactBuffer.length === 0) {\n\t\t\t\t\t\tbufferStartIndex = index;\n\t\t\t\t\t}\n\t\t\t\t\tcompactBuffer.push(part);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tflushCompactBuffer();\n\t\t\t\titems.push({ kind: 'part', index, part });\n\t\t\t}\n\n\t\t\tflushCompactBuffer();\n\t\t\treturn items;\n\t\t}, [parts, compact]);\n\t\tconst hasVisibleNonProgressParts = renderItems.length > 0;\n\t\tconst firstVisiblePartIndex = parts.findIndex(\n\t\t\t(part) =>\n\t\t\t\t!(part.type === 'tool_result' && part.toolName === 'progress_update'),\n\t\t);\n\t\tconst shouldShowProgressUpdate =\n\t\t\tmessage.status === 'pending' &&\n\t\t\t!hasFinish &&\n\t\t\tBoolean(latestProgressUpdatePart);\n\t\tconst shouldShowLoadingFallback =\n\t\t\tmessage.status === 'pending' &&\n\t\t\t!hasFinish &&\n\t\t\t!latestProgressUpdatePart &&\n\t\t\t!isQueued;\n\t\tconst formatTime = (ts?: number) => {\n\t\t\tif (!ts) return '';\n\t\t\tconst date = new Date(ts);\n\t\t\treturn date.toLocaleTimeString([], {\n\t\t\t\thour: '2-digit',\n\t\t\t\tminute: '2-digit',\n\t\t\t});\n\t\t};\n\n\t\tconst isComplete = message.status === 'complete';\n\n\t\tconst handleCopy = useCallback(() => {\n\t\t\tconst textParts = parts\n\t\t\t\t.filter((p) => p.type === 'text')\n\t\t\t\t.map((p) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst parsed = JSON.parse(p.content || '{}');\n\t\t\t\t\t\treturn parsed?.text || '';\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn p.content || '';\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.join('\\n');\n\n\t\t\tnavigator.clipboard.writeText(textParts);\n\t\t\tsetCopied(true);\n\t\t\tsetTimeout(() => setCopied(false), 2000);\n\t\t}, [parts]);\n\n\t\tconst handleBranchClick = useCallback(() => {\n\t\t\tsetShowBranchModal(true);\n\t\t}, []);\n\n\t\tif (isQueued) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn (\n\t\t\t// biome-ignore lint/a11y/noStaticElementInteractions: hover state for showing actions\n\t\t\t<div\n\t\t\t\tclassName=\"relative group\"\n\t\t\t\tonMouseEnter={() => setIsHovered(true)}\n\t\t\t\tonMouseLeave={() => setIsHovered(false)}\n\t\t\t>\n\t\t\t\t{showHeader && (\n\t\t\t\t\t<div className=\"pb-2 flex items-center justify-between\">\n\t\t\t\t\t\t<div className=\"inline-flex items-center bg-violet-500/10 border border-violet-500/30 dark:bg-violet-500/5 dark:border-violet-500/20 rounded-full pr-3 md:pr-4 flex-shrink min-w-0\">\n\t\t\t\t\t\t\t<div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full border border-violet-500/50 bg-violet-500/20 dark:bg-violet-500/10\">\n\t\t\t\t\t\t\t\t<Sparkles className=\"h-3.5 w-3.5 text-violet-700 dark:text-violet-300\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-x-1.5 md:gap-x-2 text-xs md:text-sm text-muted-foreground pl-2 md:pl-3 min-w-0\">\n\t\t\t\t\t\t\t\t{message.agent && (\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclassName={`font-medium text-violet-700 dark:text-violet-300 ${compact ? 'inline-block truncate max-w-[120px]' : 'whitespace-nowrap'}`}\n\t\t\t\t\t\t\t\t\t\ttitle={message.agent}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{message.agent}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{message.provider && (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t{message.agent && (\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground/50\">·</span>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t<ProviderLogo\n\t\t\t\t\t\t\t\t\t\t\tprovider={message.provider}\n\t\t\t\t\t\t\t\t\t\t\tsize={14}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"opacity-70\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{message.model && (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<span className=\"hidden md:inline text-muted-foreground/50\">\n\t\t\t\t\t\t\t\t\t\t\t·\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\tclassName={`hidden md:inline text-muted-foreground ${compact ? 'truncate max-w-[120px]' : ''}`}\n\t\t\t\t\t\t\t\t\t\t\ttitle={message.model}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{message.model}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{message.createdAt && (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground/50\">·</span>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground whitespace-nowrap\">\n\t\t\t\t\t\t\t\t\t\t\t{formatTime(message.createdAt)}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{isHovered && isComplete && sessionId && showBranchButton && (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={handleBranchClick}\n\t\t\t\t\t\t\t\tclassName=\"ml-4 p-1.5 text-muted-foreground hover:text-primary transition-colors flex-shrink-0\"\n\t\t\t\t\t\t\t\ttitle=\"Branch from this message\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<GitBranch className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<div className=\"relative ml-1\">\n\t\t\t\t\t{renderItems.map((item, renderIndex) => {\n\t\t\t\t\t\tconst hasFollowingContent =\n\t\t\t\t\t\t\trenderIndex < renderItems.length - 1 ||\n\t\t\t\t\t\t\thasNextAssistantMessage ||\n\t\t\t\t\t\t\tshouldShowProgressUpdate;\n\n\t\t\t\t\t\tif (item.kind === 'group') {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<CompactActivityGroup\n\t\t\t\t\t\t\t\t\tkey={item.id}\n\t\t\t\t\t\t\t\t\tentries={item.entries}\n\t\t\t\t\t\t\t\t\ttitleOverride={item.titleOverride}\n\t\t\t\t\t\t\t\t\tshowLine={hasFollowingContent}\n\t\t\t\t\t\t\t\t\tcollapsed={\n\t\t\t\t\t\t\t\t\t\tmessage.status !== 'pending' ||\n\t\t\t\t\t\t\t\t\t\trenderIndex < renderItems.length - 1\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst { part, index } = item;\n\t\t\t\t\t\tconst isLastPart = index === parts.length - 1;\n\t\t\t\t\t\t// Find pending approval for this part's tool call\n\t\t\t\t\t\tconst pendingApproval =\n\t\t\t\t\t\t\tpart.type === 'tool_call' && part.toolCallId\n\t\t\t\t\t\t\t\t? (pendingApprovals.find((a) => a.callId === part.toolCallId) ??\n\t\t\t\t\t\t\t\t\tnull)\n\t\t\t\t\t\t\t\t: null;\n\t\t\t\t\t\tconst isFinishTool =\n\t\t\t\t\t\t\tpart.type === 'tool_result' && part.toolName === 'finish';\n\t\t\t\t\t\tconst showLine = hasFollowingContent && !isFinishTool;\n\t\t\t\t\t\tconst isLastToolCall = part.type === 'tool_call' && isLastPart;\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<MessagePartItem\n\t\t\t\t\t\t\t\tkey={part.id}\n\t\t\t\t\t\t\t\tpart={part}\n\t\t\t\t\t\t\t\tshowLine={showLine}\n\t\t\t\t\t\t\t\tisFirstPart={index === firstVisiblePartIndex && !showHeader}\n\t\t\t\t\t\t\t\tisLastToolCall={isLastToolCall}\n\t\t\t\t\t\t\t\tonNavigateToSession={onNavigateToSession}\n\t\t\t\t\t\t\t\tcompact={compact}\n\t\t\t\t\t\t\t\tpendingApproval={pendingApproval}\n\t\t\t\t\t\t\t\tonApprove={handleApprove}\n\t\t\t\t\t\t\t\tonReject={handleReject}\n\t\t\t\t\t\t\t\tsessionId={sessionId}\n\t\t\t\t\t\t\t\tonRetry={onRetry}\n\t\t\t\t\t\t\t\tonCompact={onCompact}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\n\t\t\t\t\t{/* Approve All banner when multiple approvals pending */}\n\t\t\t\t\t{messagePendingApprovals.length > 1 && (\n\t\t\t\t\t\t<div className=\"flex items-center gap-3 py-2 px-3 my-2 bg-amber-50 dark:bg-amber-950/30 border border-amber-200 dark:border-amber-800 rounded-lg\">\n\t\t\t\t\t\t\t<Shield className=\"h-4 w-4 text-amber-600 dark:text-amber-400 flex-shrink-0\" />\n\t\t\t\t\t\t\t<span className=\"text-sm text-amber-800 dark:text-amber-200 flex-1\">\n\t\t\t\t\t\t\t\t{messagePendingApprovals.length} tools waiting for approval\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={handleApproveAll}\n\t\t\t\t\t\t\t\ttitle=\"Approve All (A)\"\n\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded bg-amber-600 text-white hover:bg-amber-700 transition-colors\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<CheckCheck className=\"w-3.5 h-3.5\" />\n\t\t\t\t\t\t\t\tApprove All\n\t\t\t\t\t\t\t\t<kbd className=\"ml-1 text-[10px] opacity-70\">A</kbd>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{shouldShowProgressUpdate && latestProgressUpdatePart && (\n\t\t\t\t\t\t<MessagePartItem\n\t\t\t\t\t\t\tkey={latestProgressUpdatePart.id}\n\t\t\t\t\t\t\tpart={latestProgressUpdatePart}\n\t\t\t\t\t\t\tshowLine={hasNextAssistantMessage}\n\t\t\t\t\t\t\tisFirstPart={!hasVisibleNonProgressParts && !showHeader}\n\t\t\t\t\t\t\tisLastProgressUpdate\n\t\t\t\t\t\t\tcompact={compact}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{shouldShowLoadingFallback && (\n\t\t\t\t\t\t<div className=\"flex gap-3 pb-2 relative\">\n\t\t\t\t\t\t\t<div className=\"flex-shrink-0 w-6 flex items-start justify-center relative pt-0.5\">\n\t\t\t\t\t\t\t\t<div className=\"flex h-5 w-5 shrink-0 items-center justify-center rounded-full relative bg-card text-violet-700 dark:bg-background dark:text-violet-300\">\n\t\t\t\t\t\t\t\t\t<Sparkles className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"flex-1 pt-0.5\">\n\t\t\t\t\t\t\t\t<div className=\"text-base text-foreground animate-pulse\">\n\t\t\t\t\t\t\t\t\t{getLoadingMessage(message.id)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{isComplete && sessionId && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"grid ml-7 transition-[grid-template-rows] duration-200 ease-out\"\n\t\t\t\t\t\tstyle={{ gridTemplateRows: isHovered ? '1fr' : '0fr' }}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"overflow-hidden\">\n\t\t\t\t\t\t\t<div className=\"flex gap-2 mt-2\">\n\t\t\t\t\t\t\t\t{showBranchButton && (\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleBranchClick}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 px-2 py-1 text-xs text-muted-foreground hover:text-foreground hover:bg-muted/50 rounded transition-colors\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<GitBranch className=\"h-3 w-3\" />\n\t\t\t\t\t\t\t\t\t\tBranch\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={handleCopy}\n\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 px-2 py-1 text-xs text-muted-foreground hover:text-foreground hover:bg-muted/50 rounded transition-colors\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{copied ? (\n\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t<Check className=\"h-3 w-3 text-green-500\" />\n\t\t\t\t\t\t\t\t\t\t\tCopied\n\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t<Copy className=\"h-3 w-3\" />\n\t\t\t\t\t\t\t\t\t\t\tCopy\n\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{showBranchModal && sessionId && (\n\t\t\t\t\t<BranchModal\n\t\t\t\t\t\tisOpen={showBranchModal}\n\t\t\t\t\t\tonClose={() => setShowBranchModal(false)}\n\t\t\t\t\t\tsessionId={sessionId}\n\t\t\t\t\t\tmessage={message}\n\t\t\t\t\t\tonBranchCreated={onBranchCreated}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t},\n\t(prevProps, nextProps) => {\n\t\tconst prevParts = prevProps.message.parts || [];\n\t\tconst nextParts = nextProps.message.parts || [];\n\n\t\tif (prevParts.length !== nextParts.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (let i = 0; i < prevParts.length; i++) {\n\t\t\tconst prevPart = prevParts[i];\n\t\t\tconst nextPart = nextParts[i];\n\t\t\tif (\n\t\t\t\tprevPart.id !== nextPart.id ||\n\t\t\t\tprevPart.index !== nextPart.index ||\n\t\t\t\tprevPart.stepIndex !== nextPart.stepIndex ||\n\t\t\t\tprevPart.type !== nextPart.type ||\n\t\t\t\tprevPart.content !== nextPart.content ||\n\t\t\t\tprevPart.contentJson !== nextPart.contentJson ||\n\t\t\t\tprevPart.toolName !== nextPart.toolName ||\n\t\t\t\tprevPart.toolCallId !== nextPart.toolCallId ||\n\t\t\t\tprevPart.ephemeral !== nextPart.ephemeral ||\n\t\t\t\tprevPart.completedAt !== nextPart.completedAt ||\n\t\t\t\tprevPart.startedAt !== nextPart.startedAt\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn (\n\t\t\tprevProps.message.id === nextProps.message.id &&\n\t\t\tprevProps.message.status === nextProps.message.status &&\n\t\t\tprevProps.message.completedAt === nextProps.message.completedAt &&\n\t\t\tprevProps.showHeader === nextProps.showHeader &&\n\t\t\tprevProps.hasNextAssistantMessage === nextProps.hasNextAssistantMessage &&\n\t\t\tprevProps.isLastMessage === nextProps.isLastMessage &&\n\t\t\tprevProps.sessionId === nextProps.sessionId &&\n\t\t\tprevProps.compact === nextProps.compact &&\n\t\t\tprevProps.onNavigateToSession === nextProps.onNavigateToSession\n\t\t);\n\t},\n);\n",
71
+ "import {\n\tSparkles,\n\tLoader2,\n\tGitBranch,\n\tDiff,\n\tGitCommit,\n\tCheck,\n\tTerminal,\n\tFileText,\n\tFileEdit,\n\tSearch,\n\tFolderTree,\n\tList,\n\tAlertCircle,\n\tXOctagon,\n\tBrain,\n\tDatabase,\n\tPlug,\n\tBookOpen,\n} from 'lucide-react';\nimport {\n\tFragment,\n\tmemo,\n\ttype ReactNode,\n\ttype ComponentPropsWithoutRef,\n} from 'react';\nimport type { PendingToolApproval } from '../../stores/toolApprovalStore';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport { ToolApprovalCard } from './ToolApprovalCard';\nimport type { MessagePart } from '../../types/api';\nimport {\n\tToolResultRenderer,\n\tReasoningRenderer,\n\ttype ContentJson,\n} from './renderers';\nimport { CopyButton } from './renderers/shared';\n\nfunction getToolCallPayload(part: MessagePart): Record<string, unknown> | null {\n\tconst fromJson = part.contentJson;\n\tif (fromJson && typeof fromJson === 'object') {\n\t\treturn fromJson;\n\t}\n\ttry {\n\t\tif (part.content) {\n\t\t\tconst parsed = JSON.parse(part.content);\n\t\t\tif (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n\t\t\t\treturn parsed as Record<string, unknown>;\n\t\t\t}\n\t\t}\n\t} catch {}\n\treturn null;\n}\n\nfunction getToolCallArgs(\n\tpart: MessagePart,\n): Record<string, unknown> | undefined {\n\tconst payload = getToolCallPayload(part);\n\tif (!payload) return undefined;\n\n\tconst args = (payload as { args?: unknown }).args;\n\tif (args && typeof args === 'object' && !Array.isArray(args)) {\n\t\treturn args as Record<string, unknown>;\n\t}\n\n\treturn undefined;\n}\n\nfunction getPrimaryCommand(\n\targs: Record<string, unknown> | undefined,\n): string | null {\n\tif (!args) return null;\n\tconst candidates = ['cmd', 'command', 'script', 'input'];\n\tfor (const key of candidates) {\n\t\tconst value = args[key];\n\t\tif (typeof value === 'string' && value.trim().length > 0) {\n\t\t\treturn value.trim();\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction getPatchedFileFromPatch(patch: string): string | null {\n\tconst match = patch.match(\n\t\t/^\\*\\*\\*\\s+(?:Update|Add|Delete|Replace in):\\s+(.+)$/m,\n\t);\n\treturn match?.[1]?.trim() || null;\n}\n\nfunction normalizeToolTarget(\n\ttoolName: string,\n\targs: Record<string, unknown> | undefined,\n): { key: string; value: string } | null {\n\tif (!args) return null;\n\tconst candidates = [\n\t\t{ key: 'path', match: true },\n\t\t{ key: 'file', match: true },\n\t\t{ key: 'target', match: true },\n\t\t{ key: 'cwd', match: true },\n\t\t{ key: 'query', match: true },\n\t\t{ key: 'pattern', match: true },\n\t\t{ key: 'glob', match: true },\n\t\t{ key: 'dir', match: true },\n\t];\n\tfor (const { key } of candidates) {\n\t\tconst value = args[key];\n\t\tif (typeof value === 'string' && value.trim().length > 0) {\n\t\t\treturn { key, value: value.trim() };\n\t\t}\n\t}\n\tif (toolName === 'bash') {\n\t\tconst command = args.command;\n\t\tif (typeof command === 'string' && command.trim().length > 0) {\n\t\t\treturn { key: 'command', value: command.trim() };\n\t\t}\n\t}\n\tif (toolName === 'apply_patch') {\n\t\tconst patch = args.patch;\n\t\tif (typeof patch === 'string' && patch.trim().length > 0) {\n\t\t\tconst target = getPatchedFileFromPatch(patch);\n\t\t\tif (target) {\n\t\t\t\treturn { key: 'patch', value: target };\n\t\t\t}\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction formatArgsPreview(\n\targs: Record<string, unknown> | undefined,\n\tskipKey?: string,\n): string | null {\n\tif (!args) return null;\n\tconst pieces: string[] = [];\n\tfor (const [key, value] of Object.entries(args)) {\n\t\tif (skipKey && key === skipKey) continue;\n\t\tif (typeof value === 'string' || typeof value === 'number') {\n\t\t\tconst rendered = `${key}=${String(value)}`;\n\t\t\tpieces.push(rendered);\n\t\t}\n\t\tif (pieces.length >= 3) break;\n\t}\n\tif (!pieces.length) return null;\n\tconst joined = pieces.join(' ');\n\treturn joined.length > 120 ? `${joined.slice(0, 117)}…` : joined;\n}\n\ninterface MessagePartItemProps {\n\tpart: MessagePart;\n\tshowLine: boolean;\n\tisFirstPart: boolean;\n\tisLastToolCall?: boolean;\n\tisLastProgressUpdate?: boolean;\n\tonNavigateToSession?: (sessionId: string) => void;\n\tcompact?: boolean;\n\tpendingApproval?: PendingToolApproval | null;\n\tonApprove?: (callId: string) => void;\n\tonReject?: (callId: string) => void;\n\tsessionId?: string;\n\tonRetry?: () => void;\n\tonCompact?: () => void;\n}\n\nexport const MessagePartItem = memo(\n\tfunction MessagePartItem({\n\t\tpart,\n\t\tshowLine,\n\t\tisLastToolCall,\n\t\tisLastProgressUpdate,\n\t\tonNavigateToSession,\n\t\tcompact,\n\t\tpendingApproval,\n\t\tonApprove,\n\t\tonReject,\n\t\tsessionId,\n\t\tonRetry,\n\t\tonCompact,\n\t}: MessagePartItemProps) {\n\t\t// Show tool_call if it's the last one OR if it has a pending approval\n\t\t// Never show loading indicator for progress_update calls\n\t\tif (part.type === 'tool_call') {\n\t\t\tconst toolName = part.toolName || '';\n\t\t\tif (toolName === 'progress_update') return null;\n\t\t\tif (!isLastToolCall && !pendingApproval) return null;\n\t\t}\n\n\t\tif (\n\t\t\tpart.type === 'tool_result' &&\n\t\t\tpart.toolName === 'progress_update' &&\n\t\t\t!isLastProgressUpdate\n\t\t) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (part.type === 'text') {\n\t\t\tconst data = part.contentJson || part.content;\n\t\t\tlet content = '';\n\t\t\tif (data && typeof data === 'object' && 'text' in data) {\n\t\t\t\tcontent = String(data.text);\n\t\t\t} else if (typeof data === 'string') {\n\t\t\t\tcontent = data;\n\t\t\t}\n\t\t\tif (!content || !content.trim()) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\tif (part.type === 'reasoning') {\n\t\t\tconst data = part.contentJson || part.content;\n\t\t\tlet content = '';\n\t\t\tif (data && typeof data === 'object' && 'text' in data) {\n\t\t\t\tcontent = String(data.text);\n\t\t\t} else if (typeof data === 'string') {\n\t\t\t\tcontent = data;\n\t\t\t}\n\t\t\tif (!content || !content.trim()) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\tconst isToolMessage =\n\t\t\tpart.type === 'tool_call' || part.type === 'tool_result';\n\n\t\tconst contentClasses = ['flex-1', 'min-w-0', 'max-w-full'];\n\n\t\tif (isToolMessage || part.type === 'reasoning') {\n\t\t\tcontentClasses.push(compact ? 'pt-0.5' : 'pt-1');\n\t\t} else if (part.type === 'error') {\n\t\t\tcontentClasses.push('pt-0.5');\n\t\t} else if (part.type === 'text') {\n\t\t\tcontentClasses.push('pt-0');\n\t\t\tcontentClasses.push('-mt-0.5');\n\t\t} else {\n\t\t\tcontentClasses.push('pt-0');\n\t\t}\n\n\t\tconst contentClassName = contentClasses.join(' ');\n\n\t\tconst renderIcon = () => {\n\t\t\tif (part.type === 'reasoning') {\n\t\t\t\treturn (\n\t\t\t\t\t<Brain className=\"h-4 w-4 text-indigo-600 dark:text-indigo-300\" />\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (part.type === 'tool_call') {\n\t\t\t\treturn (\n\t\t\t\t\t<Loader2 className=\"h-4 w-4 text-amber-600 dark:text-amber-300 animate-spin\" />\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (part.type === 'error') {\n\t\t\t\tconst payload = getToolCallPayload(part);\n\t\t\t\tconst isAborted = payload?.isAborted === true;\n\t\t\t\treturn isAborted ? (\n\t\t\t\t\t<XOctagon className=\"h-4 w-4 text-amber-600 dark:text-amber-400\" />\n\t\t\t\t) : (\n\t\t\t\t\t<AlertCircle className=\"h-4 w-4 text-red-600 dark:text-red-400\" />\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (part.type === 'tool_result') {\n\t\t\t\tconst toolName = part.toolName || '';\n\t\t\t\tif (toolName === 'read')\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<FileText className=\"h-4 w-4 text-blue-600 dark:text-blue-300\" />\n\t\t\t\t\t);\n\t\t\t\tif (toolName === 'write')\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<FileEdit className=\"h-4 w-4 text-emerald-600 dark:text-emerald-300\" />\n\t\t\t\t\t);\n\t\t\t\tif (toolName === 'edit')\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<FileEdit className=\"h-4 w-4 text-purple-600 dark:text-purple-300\" />\n\t\t\t\t\t);\n\t\t\t\tif (toolName === 'ls')\n\t\t\t\t\treturn <List className=\"h-4 w-4 text-cyan-600 dark:text-cyan-300\" />;\n\t\t\t\tif (toolName === 'tree')\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<FolderTree className=\"h-4 w-4 text-cyan-600 dark:text-cyan-300\" />\n\t\t\t\t\t);\n\t\t\t\tif (toolName === 'bash')\n\t\t\t\t\treturn <Terminal className=\"h-4 w-4 text-muted-foreground\" />;\n\t\t\t\tif (\n\t\t\t\t\ttoolName === 'ripgrep' ||\n\t\t\t\t\ttoolName === 'grep' ||\n\t\t\t\t\ttoolName === 'glob'\n\t\t\t\t)\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Search className=\"h-4 w-4 text-amber-600 dark:text-amber-300\" />\n\t\t\t\t\t);\n\t\t\t\tif (toolName === 'apply_patch')\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Diff className=\"h-4 w-4 text-purple-600 dark:text-purple-300\" />\n\t\t\t\t\t);\n\t\t\t\tif (toolName === 'git_status')\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<GitBranch className=\"h-4 w-4 text-blue-600 dark:text-blue-300\" />\n\t\t\t\t\t);\n\t\t\t\tif (toolName === 'git_diff')\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Diff className=\"h-4 w-4 text-purple-600 dark:text-purple-300\" />\n\t\t\t\t\t);\n\t\t\t\tif (toolName === 'git_commit')\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<GitCommit className=\"h-4 w-4 text-emerald-600 dark:text-emerald-300\" />\n\t\t\t\t\t);\n\t\t\t\tif (toolName === 'finish')\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Check className=\"h-4 w-4 text-emerald-600 dark:text-emerald-300\" />\n\t\t\t\t\t);\n\t\t\t\tif (\n\t\t\t\t\ttoolName === 'query_sessions' ||\n\t\t\t\t\ttoolName === 'query_messages' ||\n\t\t\t\t\ttoolName === 'search_history' ||\n\t\t\t\t\ttoolName === 'get_session_context' ||\n\t\t\t\t\ttoolName === 'get_parent_session'\n\t\t\t\t)\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Database className=\"h-4 w-4 text-teal-600 dark:text-teal-300\" />\n\t\t\t\t\t);\n\t\t\t\tif (toolName === 'terminal')\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Terminal className=\"h-4 w-4 text-amber-600 dark:text-amber-300\" />\n\t\t\t\t\t);\n\t\t\t\tif (toolName === 'skill')\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<BookOpen className=\"h-4 w-4 text-violet-600 dark:text-violet-300\" />\n\t\t\t\t\t);\n\t\t\t\tif (toolName.includes('__'))\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<Plug className=\"h-4 w-4 text-purple-600 dark:text-purple-300\" />\n\t\t\t\t\t);\n\t\t\t\treturn <Terminal className=\"h-4 w-4 text-muted-foreground\" />;\n\t\t\t}\n\n\t\t\treturn (\n\t\t\t\t<Sparkles className=\"h-4 w-4 text-violet-600 dark:text-violet-300\" />\n\t\t\t);\n\t\t};\n\n\t\tconst renderToolResult = () => {\n\t\t\tconst toolName = part.toolName || '';\n\n\t\t\tlet contentJson: ContentJson;\n\t\t\ttry {\n\t\t\t\tif (part.contentJson && typeof part.contentJson === 'object') {\n\t\t\t\t\tcontentJson = part.contentJson as ContentJson;\n\t\t\t\t} else if (typeof part.content === 'string') {\n\t\t\t\t\tcontentJson = JSON.parse(part.content);\n\t\t\t\t} else {\n\t\t\t\t\tcontentJson = {};\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tcontentJson = { result: part.content } as ContentJson;\n\t\t\t}\n\n\t\t\treturn (\n\t\t\t\t<ToolResultRenderer\n\t\t\t\t\ttoolName={toolName}\n\t\t\t\t\tcontentJson={contentJson}\n\t\t\t\t\ttoolDurationMs={part.toolDurationMs}\n\t\t\t\t\tdebug={false}\n\t\t\t\t\tonNavigateToSession={onNavigateToSession}\n\t\t\t\t\tcompact={compact}\n\t\t\t\t/>\n\t\t\t);\n\t\t};\n\n\t\tconst renderContent = () => {\n\t\t\tif (part.type === 'reasoning') {\n\t\t\t\treturn <ReasoningRenderer part={part} />;\n\t\t\t}\n\n\t\t\tif (part.type === 'text') {\n\t\t\t\tlet content = '';\n\t\t\t\tconst data = part.contentJson || part.content;\n\t\t\t\tif (data && typeof data === 'object' && 'text' in data) {\n\t\t\t\t\tcontent = String(data.text);\n\t\t\t\t} else if (typeof data === 'string') {\n\t\t\t\t\tcontent = data;\n\t\t\t\t} else if (data) {\n\t\t\t\t\tcontent = JSON.stringify(data, null, 2);\n\t\t\t\t}\n\n\t\t\t\treturn (\n\t\t\t\t\t<div className=\"relative group\">\n\t\t\t\t\t\t<div className=\"absolute -top-1 right-0 opacity-0 group-hover:opacity-100 transition-opacity z-10\">\n\t\t\t\t\t\t\t<CopyButton\n\t\t\t\t\t\t\t\ttext={content}\n\t\t\t\t\t\t\t\tclassName=\"bg-background/80 backdrop-blur-sm border border-border/50 shadow-sm\"\n\t\t\t\t\t\t\t\tsize=\"md\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"text-base text-foreground leading-relaxed markdown-content max-w-full overflow-x-auto\">\n\t\t\t\t\t\t\t<ReactMarkdown\n\t\t\t\t\t\t\t\tremarkPlugins={[remarkGfm]}\n\t\t\t\t\t\t\t\tcomponents={{\n\t\t\t\t\t\t\t\t\ta: ({\n\t\t\t\t\t\t\t\t\t\thref,\n\t\t\t\t\t\t\t\t\t\tchildren,\n\t\t\t\t\t\t\t\t\t\t...props\n\t\t\t\t\t\t\t\t\t}: ComponentPropsWithoutRef<'a'>) => (\n\t\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\t\thref={href}\n\t\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (window.self !== window.top && href) {\n\t\t\t\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\t\twindow.parent.postMessage(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'otto-open-url',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turl: href,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'*',\n\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\tpre: ({\n\t\t\t\t\t\t\t\t\t\tchildren,\n\t\t\t\t\t\t\t\t\t\t...props\n\t\t\t\t\t\t\t\t\t}: ComponentPropsWithoutRef<'pre'>) => {\n\t\t\t\t\t\t\t\t\t\tconst codeContent = (() => {\n\t\t\t\t\t\t\t\t\t\t\tif (!children) return '';\n\t\t\t\t\t\t\t\t\t\t\tconst child = Array.isArray(children)\n\t\t\t\t\t\t\t\t\t\t\t\t? children[0]\n\t\t\t\t\t\t\t\t\t\t\t\t: children;\n\t\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\t\tchild &&\n\t\t\t\t\t\t\t\t\t\t\t\ttypeof child === 'object' &&\n\t\t\t\t\t\t\t\t\t\t\t\t'props' in child\n\t\t\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\t\t\tconst codeProps = child.props as { children?: unknown };\n\t\t\t\t\t\t\t\t\t\t\t\tif (typeof codeProps.children === 'string') {\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn codeProps.children;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\treturn '';\n\t\t\t\t\t\t\t\t\t\t})();\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"relative group/code my-3\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"absolute top-2 right-2 opacity-0 group-hover/code:opacity-100 transition-opacity z-10\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<CopyButton\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttext={codeContent}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"bg-background/80 backdrop-blur-sm border border-border/50 shadow-sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<pre {...props} className=\"overflow-x-auto\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t\t\t\t\t\t\t</pre>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\ttable: ({\n\t\t\t\t\t\t\t\t\t\tchildren,\n\t\t\t\t\t\t\t\t\t\t...props\n\t\t\t\t\t\t\t\t\t}: ComponentPropsWithoutRef<'table'>) => (\n\t\t\t\t\t\t\t\t\t\t<div className=\"overflow-x-auto max-w-full min-w-0 my-3\">\n\t\t\t\t\t\t\t\t\t\t\t<table {...props}>{children}</table>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{content}\n\t\t\t\t\t\t\t</ReactMarkdown>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{content.length > 500 && (\n\t\t\t\t\t\t\t<div className=\"absolute -bottom-1 right-0 opacity-0 group-hover:opacity-100 transition-opacity z-10\">\n\t\t\t\t\t\t\t\t<CopyButton\n\t\t\t\t\t\t\t\t\ttext={content}\n\t\t\t\t\t\t\t\t\tclassName=\"bg-background/80 backdrop-blur-sm border border-border/50 shadow-sm\"\n\t\t\t\t\t\t\t\t\tsize=\"md\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (part.type === 'error') {\n\t\t\t\tlet contentJson: ContentJson;\n\t\t\t\ttry {\n\t\t\t\t\tif (part.contentJson && typeof part.contentJson === 'object') {\n\t\t\t\t\t\tcontentJson = part.contentJson as ContentJson;\n\t\t\t\t\t} else if (typeof part.content === 'string') {\n\t\t\t\t\t\tcontentJson = JSON.parse(part.content);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontentJson = {};\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\tcontentJson = {\n\t\t\t\t\t\tmessage: part.content || 'Unknown error',\n\t\t\t\t\t} as ContentJson;\n\t\t\t\t}\n\n\t\t\t\treturn (\n\t\t\t\t\t<ToolResultRenderer\n\t\t\t\t\t\ttoolName=\"error\"\n\t\t\t\t\t\tcontentJson={contentJson}\n\t\t\t\t\t\ttoolDurationMs={part.toolDurationMs}\n\t\t\t\t\t\tdebug={false}\n\t\t\t\t\t\tcompact={compact}\n\t\t\t\t\t\tsessionId={sessionId}\n\t\t\t\t\t\tonRetry={onRetry}\n\t\t\t\t\t\tonCompact={onCompact}\n\t\t\t\t\t/>\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (part.type === 'tool_call') {\n\t\t\t\tconst payload = getToolCallPayload(part);\n\t\t\t\tconst rawToolName =\n\t\t\t\t\tpart.toolName ||\n\t\t\t\t\t(typeof (payload as { name?: unknown })?.name === 'string'\n\t\t\t\t\t\t? ((payload as { name?: unknown }).name as string)\n\t\t\t\t\t\t: 'tool');\n\t\t\t\tconst toolLabel = rawToolName.includes('__')\n\t\t\t\t\t? rawToolName.replace('__', ' › ')\n\t\t\t\t\t: rawToolName.replace(/_/g, ' ');\n\t\t\t\t// Use args from pending approval if available (for early approval display)\n\t\t\t\t// Fall back to part args for normal tool calls\n\t\t\t\tconst partArgs = getToolCallArgs(part);\n\t\t\t\tconst approvalArgs = pendingApproval?.args as\n\t\t\t\t\t| Record<string, unknown>\n\t\t\t\t\t| undefined;\n\t\t\t\tconst args = partArgs || approvalArgs;\n\t\t\t\tconst primary = normalizeToolTarget(rawToolName, args);\n\t\t\t\tconst argsPreview = formatArgsPreview(args, primary?.key);\n\t\t\t\tconst command = rawToolName === 'bash' ? getPrimaryCommand(args) : null;\n\t\t\t\tconst segments: Array<{ key: string; node: ReactNode }> = [];\n\t\t\t\tif (command) {\n\t\t\t\t\tsegments.push({\n\t\t\t\t\t\tkey: 'cmd',\n\t\t\t\t\t\tnode: (\n\t\t\t\t\t\t\t<code className=\"font-mono text-foreground/90 truncate max-w-xs\">\n\t\t\t\t\t\t\t\t{command}\n\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\t} else if (primary) {\n\t\t\t\t\tsegments.push({\n\t\t\t\t\t\tkey: 'primary',\n\t\t\t\t\t\tnode: (\n\t\t\t\t\t\t\t<code className=\"font-mono text-foreground/85 truncate max-w-xs\">\n\t\t\t\t\t\t\t\t{primary.value}\n\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (argsPreview) {\n\t\t\t\t\tsegments.push({\n\t\t\t\t\t\tkey: 'args',\n\t\t\t\t\t\tnode: (\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground/80 truncate max-w-xs\">\n\t\t\t\t\t\t\t\t{argsPreview}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Check if this tool call has a pending approval\n\t\t\t\tconst hasPendingApproval =\n\t\t\t\t\tpendingApproval && pendingApproval.callId === part.toolCallId;\n\n\t\t\t\tif (hasPendingApproval && onApprove && onReject) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<ToolApprovalCard\n\t\t\t\t\t\t\ttoolName={rawToolName}\n\t\t\t\t\t\t\targs={args}\n\t\t\t\t\t\t\tpendingApproval={pendingApproval}\n\t\t\t\t\t\t\tonApprove={onApprove}\n\t\t\t\t\t\t\tonReject={onReject}\n\t\t\t\t\t\t/>\n\t\t\t\t\t);\n\t\t\t\t} else if (segments.length === 0) {\n\t\t\t\t\tsegments.push({\n\t\t\t\t\t\tkey: 'running',\n\t\t\t\t\t\tnode: <span className=\"text-muted-foreground/75\">running…</span>,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst containerClasses = [\n\t\t\t\t\t'flex flex-wrap items-center gap-x-2 gap-y-1 text-xs text-foreground/80 max-w-full',\n\t\t\t\t];\n\t\t\t\tif (part.ephemeral) containerClasses.push('animate-pulse');\n\t\t\t\treturn (\n\t\t\t\t\t<div className={containerClasses.join(' ')}>\n\t\t\t\t\t\t<span className=\"font-medium text-foreground\">{toolLabel}</span>\n\t\t\t\t\t\t{segments.map((segment) => (\n\t\t\t\t\t\t\t<Fragment key={segment.key}>\n\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground/65\">·</span>\n\t\t\t\t\t\t\t\t{segment.node}\n\t\t\t\t\t\t\t</Fragment>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (part.type === 'tool_result') {\n\t\t\t\treturn renderToolResult();\n\t\t\t}\n\n\t\t\treturn null;\n\t\t};\n\n\t\treturn (\n\t\t\t<div className=\"flex gap-3 pb-2 relative max-w-full overflow-hidden\">\n\t\t\t\t<div className=\"flex-shrink-0 w-6 flex items-start justify-center relative pt-0.5\">\n\t\t\t\t\t<div className=\"flex h-5 w-5 shrink-0 items-center justify-center rounded-full relative bg-background\">\n\t\t\t\t\t\t{renderIcon()}\n\t\t\t\t\t</div>\n\t\t\t\t\t{showLine && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"absolute left-1/2 -translate-x-1/2 w-[2px] bg-border z-0\"\n\t\t\t\t\t\t\tstyle={{ top: '1.25rem', bottom: '-0.5rem' }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t<div className={contentClassName}>{renderContent()}</div>\n\t\t\t</div>\n\t\t);\n\t},\n\t(prevProps, nextProps) => {\n\t\treturn (\n\t\t\tprevProps.part.id === nextProps.part.id &&\n\t\t\tprevProps.part.content === nextProps.part.content &&\n\t\t\tprevProps.part.contentJson === nextProps.part.contentJson &&\n\t\t\tprevProps.part.ephemeral === nextProps.part.ephemeral &&\n\t\t\tprevProps.part.completedAt === nextProps.part.completedAt &&\n\t\t\tprevProps.showLine === nextProps.showLine &&\n\t\t\tprevProps.isLastToolCall === nextProps.isLastToolCall &&\n\t\t\tprevProps.isLastProgressUpdate === nextProps.isLastProgressUpdate &&\n\t\t\tprevProps.compact === nextProps.compact &&\n\t\t\tprevProps.onNavigateToSession === nextProps.onNavigateToSession &&\n\t\t\tprevProps.pendingApproval?.callId === nextProps.pendingApproval?.callId &&\n\t\t\tprevProps.onApprove === nextProps.onApprove &&\n\t\t\tprevProps.onReject === nextProps.onReject\n\t\t);\n\t},\n);\n",
72
+ "import { memo, useState } from 'react';\nimport { Shield, Check, X } from 'lucide-react';\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport {\n\tprism,\n\tvscDarkPlus,\n} from 'react-syntax-highlighter/dist/esm/styles/prism';\nimport type { PendingToolApproval } from '../../stores/toolApprovalStore';\nimport { DiffView } from './renderers/DiffView';\n\ninterface ToolApprovalCardProps {\n\ttoolName: string;\n\targs: Record<string, unknown> | undefined;\n\tpendingApproval: PendingToolApproval;\n\tonApprove: (callId: string) => void | Promise<void>;\n\tonReject: (callId: string) => void | Promise<void>;\n}\n\nfunction getLanguageFromPath(path: string): string {\n\tconst ext = path.split('.').pop()?.toLowerCase();\n\tconst langMap: Record<string, string> = {\n\t\tjs: 'javascript',\n\t\tjsx: 'jsx',\n\t\tts: 'typescript',\n\t\ttsx: 'tsx',\n\t\tpy: 'python',\n\t\trb: 'ruby',\n\t\tgo: 'go',\n\t\trs: 'rust',\n\t\tjava: 'java',\n\t\tc: 'c',\n\t\tcpp: 'cpp',\n\t\th: 'c',\n\t\thpp: 'cpp',\n\t\tcs: 'csharp',\n\t\tphp: 'php',\n\t\tsh: 'bash',\n\t\tbash: 'bash',\n\t\tzsh: 'bash',\n\t\tsql: 'sql',\n\t\tjson: 'json',\n\t\tyaml: 'yaml',\n\t\tyml: 'yaml',\n\t\txml: 'xml',\n\t\thtml: 'html',\n\t\tcss: 'css',\n\t\tscss: 'scss',\n\t\tmd: 'markdown',\n\t\ttxt: 'text',\n\t\tsvelte: 'svelte',\n\t};\n\treturn langMap[ext || ''] || 'javascript';\n}\n\nfunction normalizeToolTarget(\n\ttoolName: string,\n\targs: Record<string, unknown> | undefined,\n): { key: string; value: string } | null {\n\tif (!args) return null;\n\tconst keyMap: Record<string, string[]> = {\n\t\tread: ['path'],\n\t\twrite: ['path'],\n\t\tedit: ['path'],\n\t\tapply_patch: ['path'],\n\t\tglob: ['pattern'],\n\t\tgrep: ['query', 'pattern'],\n\t\tripgrep: ['query', 'pattern'],\n\t\tbash: ['cmd', 'command'],\n\t\tterminal: ['command'],\n\t\tgit_commit: ['message'],\n\t\tgit_diff: ['file'],\n\t\ttree: ['path'],\n\t\tls: ['path'],\n\t\tweb_search: ['query', 'url'],\n\t\tskill: ['name'],\n\t};\n\tconst keys = keyMap[toolName];\n\tif (!keys) {\n\t\tfor (const [key, value] of Object.entries(args)) {\n\t\t\tif (typeof value === 'string' && value.length > 0 && value.length < 200) {\n\t\t\t\treturn { key, value };\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\tfor (const key of keys) {\n\t\tconst value = args[key];\n\t\tif (typeof value === 'string' && value.length > 0) {\n\t\t\treturn { key, value };\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction getPrimaryCommand(\n\targs: Record<string, unknown> | undefined,\n): string | null {\n\tif (!args) return null;\n\tconst cmd = args.cmd ?? args.command;\n\tif (typeof cmd === 'string' && cmd.length > 0) {\n\t\treturn cmd;\n\t}\n\treturn null;\n}\n\nexport const ToolApprovalCard = memo(function ToolApprovalCard({\n\ttoolName,\n\targs,\n\tpendingApproval,\n\tonApprove,\n\tonReject,\n}: ToolApprovalCardProps) {\n\tconst [isProcessing, setIsProcessing] = useState(false);\n\n\tconst toolLabel = toolName.replace(/_/g, ' ');\n\tconst primary = normalizeToolTarget(toolName, args);\n\tconst command = toolName === 'bash' ? getPrimaryCommand(args) : null;\n\tconst approvalTarget = command || primary?.value;\n\n\tconst filePath = typeof args?.path === 'string' ? args.path : '';\n\tconst language = getLanguageFromPath(filePath);\n\tconst syntaxTheme = document?.documentElement.classList.contains('dark')\n\t\t? vscDarkPlus\n\t\t: prism;\n\n\tconst handleApprove = () => {\n\t\tsetIsProcessing(true);\n\t\tPromise.resolve(onApprove(pendingApproval.callId)).catch(() => {\n\t\t\tsetIsProcessing(false);\n\t\t});\n\t};\n\n\tconst handleReject = () => {\n\t\tsetIsProcessing(true);\n\t\tPromise.resolve(onReject(pendingApproval.callId)).catch(() => {\n\t\t\tsetIsProcessing(false);\n\t\t});\n\t};\n\n\tconst renderContent = () => {\n\t\tif (toolName === 'apply_patch' && args?.patch) {\n\t\t\treturn (\n\t\t\t\t<div className=\"ml-6 max-w-full overflow-hidden\">\n\t\t\t\t\t<DiffView patch={String(args.patch)} />\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\tif (toolName === 'write' && args?.content) {\n\t\t\tconst content = String(args.content);\n\t\t\treturn (\n\t\t\t\t<div className=\"ml-6 max-w-full overflow-hidden\">\n\t\t\t\t\t<div className=\"bg-emerald-500/10 border border-emerald-500/30 rounded-lg overflow-hidden max-h-96\">\n\t\t\t\t\t\t<div className=\"overflow-x-auto overflow-y-auto max-h-96 text-xs\">\n\t\t\t\t\t\t\t<SyntaxHighlighter\n\t\t\t\t\t\t\t\tlanguage={language}\n\t\t\t\t\t\t\t\tstyle={syntaxTheme}\n\t\t\t\t\t\t\t\tcustomStyle={{\n\t\t\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\t\t\tpadding: '0.75rem',\n\t\t\t\t\t\t\t\t\tbackground: 'transparent',\n\t\t\t\t\t\t\t\t\tfontSize: 'inherit',\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tshowLineNumbers\n\t\t\t\t\t\t\t\tlineNumberStyle={{\n\t\t\t\t\t\t\t\t\tminWidth: '2.5em',\n\t\t\t\t\t\t\t\t\tpaddingRight: '1em',\n\t\t\t\t\t\t\t\t\tcolor: 'var(--muted-foreground)',\n\t\t\t\t\t\t\t\t\topacity: 0.4,\n\t\t\t\t\t\t\t\t\tuserSelect: 'none',\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{content}\n\t\t\t\t\t\t\t</SyntaxHighlighter>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\tif (toolName === 'bash' && args?.cmd) {\n\t\t\tconst cmd = String(args.cmd);\n\t\t\treturn (\n\t\t\t\t<div className=\"ml-6 max-w-full overflow-hidden\">\n\t\t\t\t\t<div className=\"bg-card/60 border border-border rounded-lg overflow-hidden\">\n\t\t\t\t\t\t<div className=\"overflow-x-auto text-xs\">\n\t\t\t\t\t\t\t<SyntaxHighlighter\n\t\t\t\t\t\t\t\tlanguage=\"bash\"\n\t\t\t\t\t\t\t\tstyle={syntaxTheme}\n\t\t\t\t\t\t\t\tcustomStyle={{\n\t\t\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\t\t\tpadding: '0.75rem',\n\t\t\t\t\t\t\t\t\tbackground: 'transparent',\n\t\t\t\t\t\t\t\t\tfontSize: 'inherit',\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{cmd}\n\t\t\t\t\t\t\t</SyntaxHighlighter>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t);\n\t\t}\n\n\t\treturn null;\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-2 py-1\">\n\t\t\t<div className=\"flex items-center gap-2 flex-wrap\">\n\t\t\t\t<Shield className=\"h-4 w-4 text-amber-500 flex-shrink-0\" />\n\t\t\t\t<span className=\"font-medium text-foreground text-sm\">{toolLabel}</span>\n\t\t\t\t{approvalTarget && toolName !== 'bash' && (\n\t\t\t\t\t<code className=\"text-xs font-mono text-foreground/80 bg-muted/50 px-1.5 py-0.5 rounded truncate max-w-xs\">\n\t\t\t\t\t\t{approvalTarget}\n\t\t\t\t\t</code>\n\t\t\t\t)}\n\t\t\t\t<span className=\"text-amber-600 dark:text-amber-400 font-medium text-sm\">\n\t\t\t\t\trequires approval\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t{renderContent()}\n\t\t\t<div className=\"flex items-center gap-2 ml-6\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={handleReject}\n\t\t\t\t\tdisabled={isProcessing}\n\t\t\t\t\ttitle=\"Reject (N or Esc)\"\n\t\t\t\t\tclassName=\"flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded border border-border bg-background hover:bg-muted transition-colors disabled:opacity-50\"\n\t\t\t\t>\n\t\t\t\t\t<X className=\"w-3 h-3\" />\n\t\t\t\t\tReject\n\t\t\t\t\t<kbd className=\"ml-1 text-[10px] text-muted-foreground opacity-70\">\n\t\t\t\t\t\tN\n\t\t\t\t\t</kbd>\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={handleApprove}\n\t\t\t\t\tdisabled={isProcessing}\n\t\t\t\t\ttitle=\"Approve (Y)\"\n\t\t\t\t\tclassName=\"flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded bg-amber-600 text-white hover:bg-amber-700 transition-colors disabled:opacity-50\"\n\t\t\t\t>\n\t\t\t\t\t<Check className=\"w-3 h-3\" />\n\t\t\t\t\t{isProcessing ? 'Approving...' : 'Approve'}\n\t\t\t\t\t{!isProcessing && (\n\t\t\t\t\t\t<kbd className=\"ml-1 text-[10px] opacity-70\">Y</kbd>\n\t\t\t\t\t)}\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t);\n});\n",
73
+ "import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport {\n\tprism,\n\tvscDarkPlus,\n} from 'react-syntax-highlighter/dist/esm/styles/prism';\n\ninterface DiffViewProps {\n\tpatch: string;\n}\n\ninterface DiffLine {\n\tcontent: string;\n\tcodeContent: string; // Content without +/- prefix\n\ttype: 'add' | 'remove' | 'context' | 'meta' | 'header';\n\toldLineNum?: number;\n\tnewLineNum?: number;\n}\n\nfunction getLanguageFromPath(path: string): string {\n\tconst ext = path.split('.').pop()?.toLowerCase();\n\tconst langMap: Record<string, string> = {\n\t\tjs: 'javascript',\n\t\tjsx: 'jsx',\n\t\tts: 'typescript',\n\t\ttsx: 'tsx',\n\t\tpy: 'python',\n\t\trb: 'ruby',\n\t\tgo: 'go',\n\t\trs: 'rust',\n\t\tjava: 'java',\n\t\tc: 'c',\n\t\tcpp: 'cpp',\n\t\th: 'c',\n\t\thpp: 'cpp',\n\t\tcs: 'csharp',\n\t\tphp: 'php',\n\t\tsh: 'bash',\n\t\tbash: 'bash',\n\t\tzsh: 'bash',\n\t\tsql: 'sql',\n\t\tjson: 'json',\n\t\tyaml: 'yaml',\n\t\tyml: 'yaml',\n\t\txml: 'xml',\n\t\thtml: 'html',\n\t\tcss: 'css',\n\t\tscss: 'scss',\n\t\tmd: 'markdown',\n\t\ttxt: 'text',\n\t\tsvelte: 'svelte',\n\t};\n\treturn langMap[ext || ''] || 'javascript';\n}\n\nfunction parseDiff(patch: string): { lines: DiffLine[]; filePath: string } {\n\tconst lines = patch.split('\\n');\n\tconst result: DiffLine[] = [];\n\tlet oldLineNum = 0;\n\tlet newLineNum = 0;\n\tlet inHunk = false;\n\tlet filePath = '';\n\n\tfor (const line of lines) {\n\t\t// Extract file path from diff headers\n\t\t// Also enter hunk mode for enveloped format\n\t\tif (\n\t\t\tline.startsWith('*** Update File:') ||\n\t\t\tline.startsWith('*** Add File:')\n\t\t) {\n\t\t\tconst match = line.match(/\\*\\*\\* (?:Update|Add) File: (.+)/);\n\t\t\tif (match) filePath = match[1];\n\t\t\tinHunk = true;\n\t\t\tnewLineNum = 1;\n\t\t\toldLineNum = 1;\n\t\t}\n\t\tif (line.startsWith('+++') || line.startsWith('*** Update File:')) {\n\t\t\tconst match =\n\t\t\t\tline.match(/\\+\\+\\+ b\\/(.+)/) || line.match(/\\*\\*\\* Update File: (.+)/);\n\t\t\tif (match) filePath = match[1];\n\t\t}\n\n\t\t// Parse hunk header to get starting line numbers\n\t\t// Format: @@ -oldStart,oldCount +newStart,newCount @@\n\t\tconst hunkMatch = line.match(/^@@ -(\\d+)(?:,\\d+)? \\+(\\d+)(?:,\\d+)? @@/);\n\t\tif (hunkMatch) {\n\t\t\toldLineNum = Number.parseInt(hunkMatch[1], 10);\n\t\t\tnewLineNum = Number.parseInt(hunkMatch[2], 10);\n\t\t\tinHunk = true;\n\t\t\tresult.push({\n\t\t\t\tcontent: line,\n\t\t\t\tcodeContent: line,\n\t\t\t\ttype: 'header',\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Handle enveloped format @@ comment lines (not standard hunk headers)\n\t\tif (line.startsWith('@@') && !line.match(/^@@ -\\d+/)) {\n\t\t\tinHunk = true;\n\t\t\tresult.push({\n\t\t\t\tcontent: line,\n\t\t\t\tcodeContent: line,\n\t\t\t\ttype: 'header',\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Check if it's a diff metadata line\n\t\tif (\n\t\t\tline.startsWith('***') ||\n\t\t\tline.startsWith('diff ') ||\n\t\t\tline.startsWith('index ') ||\n\t\t\tline.startsWith('---') ||\n\t\t\tline.startsWith('+++')\n\t\t) {\n\t\t\tresult.push({\n\t\t\t\tcontent: line,\n\t\t\t\tcodeContent: line,\n\t\t\t\ttype: 'meta',\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Process actual diff lines\n\t\tif (inHunk) {\n\t\t\tif (line.startsWith('+')) {\n\t\t\t\tresult.push({\n\t\t\t\t\tcontent: line,\n\t\t\t\t\tcodeContent: line.slice(1),\n\t\t\t\t\ttype: 'add',\n\t\t\t\t\tnewLineNum: newLineNum++,\n\t\t\t\t});\n\t\t\t} else if (line.startsWith('-')) {\n\t\t\t\tresult.push({\n\t\t\t\t\tcontent: line,\n\t\t\t\t\tcodeContent: line.slice(1),\n\t\t\t\t\ttype: 'remove',\n\t\t\t\t\toldLineNum: oldLineNum++,\n\t\t\t\t});\n\t\t\t} else if (line.startsWith(' ') || line === '') {\n\t\t\t\tresult.push({\n\t\t\t\t\tcontent: line,\n\t\t\t\t\tcodeContent: line.startsWith(' ') ? line.slice(1) : line,\n\t\t\t\t\ttype: 'context',\n\t\t\t\t\toldLineNum: oldLineNum++,\n\t\t\t\t\tnewLineNum: newLineNum++,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Handle lines that don't start with +, -, or space (edge case)\n\t\t\t\tresult.push({\n\t\t\t\t\tcontent: line,\n\t\t\t\t\tcodeContent: line,\n\t\t\t\t\ttype: 'context',\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\t// Lines before any hunk\n\t\t\tresult.push({\n\t\t\t\tcontent: line,\n\t\t\t\tcodeContent: line,\n\t\t\t\ttype: 'meta',\n\t\t\t});\n\t\t}\n\t}\n\n\treturn { lines: result, filePath };\n}\n\nexport function DiffView({ patch }: DiffViewProps) {\n\tconst { lines: diffLines, filePath } = parseDiff(patch);\n\tconst language = getLanguageFromPath(filePath);\n\tconst syntaxTheme = document?.documentElement.classList.contains('dark')\n\t\t? vscDarkPlus\n\t\t: prism;\n\n\treturn (\n\t\t<div className=\"bg-card/60 border border-border rounded-lg overflow-hidden max-h-96 max-w-full\">\n\t\t\t<div className=\"overflow-x-auto overflow-y-auto max-h-96 text-xs font-mono\">\n\t\t\t\t{diffLines.map((line, i) => {\n\t\t\t\t\tconst key = `line-${i}-${line.content.slice(0, 20)}`;\n\n\t\t\t\t\t// For meta and header lines, span the full width without line numbers\n\t\t\t\t\tif (line.type === 'meta' || line.type === 'header') {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\t\tclassName={`px-3 py-0.5 whitespace-pre-wrap break-all ${\n\t\t\t\t\t\t\t\t\tline.type === 'header'\n\t\t\t\t\t\t\t\t\t\t? 'text-muted-foreground/80 bg-muted/20'\n\t\t\t\t\t\t\t\t\t\t: 'text-muted-foreground/80'\n\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{line.content}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// For diff lines, show line numbers in gutter\n\t\t\t\t\tlet lineClass = '';\n\t\t\t\t\tlet bgClass = '';\n\t\t\t\t\tswitch (line.type) {\n\t\t\t\t\t\tcase 'add':\n\t\t\t\t\t\t\tlineClass = 'text-emerald-700 dark:text-emerald-300';\n\t\t\t\t\t\t\tbgClass = 'bg-emerald-500/10';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'remove':\n\t\t\t\t\t\t\tlineClass = 'text-red-600 dark:text-red-300';\n\t\t\t\t\t\t\tbgClass = 'bg-red-500/10';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tlineClass = 'text-foreground/80';\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply syntax highlighting to code content\n\t\t\t\t\tlet renderedContent: React.ReactNode = line.content;\n\t\t\t\t\tif (line.codeContent.trim() && language !== 'text') {\n\t\t\t\t\t\trenderedContent = (\n\t\t\t\t\t\t\t<SyntaxHighlighter\n\t\t\t\t\t\t\t\tlanguage={language}\n\t\t\t\t\t\t\t\tstyle={syntaxTheme}\n\t\t\t\t\t\t\t\tcustomStyle={{\n\t\t\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t\t\tbackground: 'transparent',\n\t\t\t\t\t\t\t\t\tdisplay: 'inline',\n\t\t\t\t\t\t\t\t\tfontSize: 'inherit',\n\t\t\t\t\t\t\t\t\tlineHeight: 'inherit',\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tcodeTagProps={{\n\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\tfontFamily: 'inherit',\n\t\t\t\t\t\t\t\t\t\tbackground: 'transparent',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tPreTag=\"span\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{line.codeContent}\n\t\t\t\t\t\t\t</SyntaxHighlighter>\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// Add back the +/- prefix\n\t\t\t\t\t\tif (line.type === 'add') {\n\t\t\t\t\t\t\trenderedContent = (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t<span className=\"select-none\">+</span>\n\t\t\t\t\t\t\t\t\t{renderedContent}\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else if (line.type === 'remove') {\n\t\t\t\t\t\t\trenderedContent = (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t<span className=\"select-none\">-</span>\n\t\t\t\t\t\t\t\t\t{renderedContent}\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else if (line.type === 'context') {\n\t\t\t\t\t\t\trenderedContent = (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t<span className=\"select-none\"> </span>\n\t\t\t\t\t\t\t\t\t{renderedContent}\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={key} className={`flex ${bgClass}`}>\n\t\t\t\t\t\t\t{/* Old line number */}\n\t\t\t\t\t\t\t<div className=\"px-2 py-0.5 text-right text-muted-foreground/40 select-none w-12 flex-shrink-0\">\n\t\t\t\t\t\t\t\t{line.oldLineNum || ''}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/* New line number */}\n\t\t\t\t\t\t\t<div className=\"px-2 py-0.5 text-right text-muted-foreground/40 select-none w-12 flex-shrink-0 border-r border-border/50\">\n\t\t\t\t\t\t\t\t{line.newLineNum || ''}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/* Line content */}\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={`px-3 py-0.5 flex-1 min-w-0 whitespace-pre-wrap break-all ${lineClass}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{renderedContent}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n",
74
+ "import { useState } from 'react';\nimport type { ContentJson } from './types';\nimport { ReadRenderer } from './ReadRenderer';\nimport { WriteRenderer } from './WriteRenderer';\nimport { EditRenderer } from './EditRenderer';\nimport { BashRenderer } from './BashRenderer';\nimport { GitStatusRenderer } from './GitStatusRenderer';\nimport { GitDiffRenderer } from './GitDiffRenderer';\nimport { GitCommitRenderer } from './GitCommitRenderer';\nimport { ApplyPatchRenderer } from './ApplyPatchRenderer';\nimport { ListRenderer } from './ListRenderer';\nimport { TreeRenderer } from './TreeRenderer';\nimport { SearchRenderer } from './SearchRenderer';\nimport { FinishRenderer } from './FinishRenderer';\nimport { GenericRenderer } from './GenericRenderer';\nimport { DebugRenderer } from './DebugRenderer';\nimport { TodosRenderer } from './TodosRenderer';\nimport { ProgressUpdateRenderer } from './ProgressUpdateRenderer';\nimport { WebSearchRenderer } from './WebSearchRenderer';\nimport { ErrorRenderer } from './ErrorRenderer';\nimport { DatabaseToolRenderer } from './DatabaseToolRenderer';\nimport { TerminalRenderer } from './TerminalRenderer';\nimport { McpToolRenderer, isMcpTool } from './McpToolRenderer';\nimport { LoadMcpToolsRenderer } from './LoadMcpToolsRenderer';\nimport { SkillRenderer } from './SkillRenderer';\n\ninterface ToolResultRendererProps {\n\ttoolName: string;\n\tcontentJson: ContentJson;\n\ttoolDurationMs?: number | null;\n\tdebug?: boolean;\n\tonNavigateToSession?: (sessionId: string) => void;\n\tcompact?: boolean;\n\tsessionId?: string;\n\tonRetry?: () => void;\n\tonCompact?: () => void;\n}\n\n/**\n * Normalize tool names to canonical form for rendering.\n * Handles both snake_case (canonical) and PascalCase (OAuth) names.\n */\nconst TOOL_NAME_ALIASES: Record<string, string> = {\n\tRead: 'read',\n\tWrite: 'write',\n\tEdit: 'edit',\n\tLs: 'ls',\n\tTree: 'tree',\n\tCd: 'cd',\n\tPwd: 'pwd',\n\n\tGlob: 'glob',\n\tGrep: 'ripgrep',\n\n\tBash: 'bash',\n\tTerminal: 'terminal',\n\n\tGitStatus: 'git_status',\n\tGitDiff: 'git_diff',\n\tGitCommit: 'git_commit',\n\n\tApplyPatch: 'apply_patch',\n\n\tUpdateTodos: 'update_todos',\n\tUpdatePlan: 'update_todos',\n\tProgressUpdate: 'progress_update',\n\tFinish: 'finish',\n\n\tWebSearch: 'websearch',\n\n\tLoadMcpTools: 'load_mcp_tools',\n\n\tSkill: 'skill',\n};\n\nfunction normalizeToolName(name: string): string {\n\treturn TOOL_NAME_ALIASES[name] ?? name;\n}\n\nconst COMPACT_DETAIL_TOOL_NAMES = new Set([\n\t'bash',\n\t'write',\n\t'edit',\n\t'apply_patch',\n\t'terminal',\n]);\n\nexport function ToolResultRenderer({\n\ttoolName,\n\tcontentJson,\n\ttoolDurationMs,\n\tdebug,\n\tonNavigateToSession,\n\tcompact,\n\tsessionId,\n\tonRetry,\n\tonCompact,\n}: ToolResultRendererProps) {\n\tconst [isExpanded, setIsExpanded] = useState(false);\n\tconst normalizedName = normalizeToolName(toolName);\n\tconst rendererCompact =\n\t\tcompact && !COMPACT_DETAIL_TOOL_NAMES.has(normalizedName);\n\n\tconst handleToggle = () => setIsExpanded(!isExpanded);\n\n\tconst props = {\n\t\tcontentJson,\n\t\ttoolDurationMs: toolDurationMs ?? undefined,\n\t\tisExpanded,\n\t\tonToggle: handleToggle,\n\t\tcompact: rendererCompact,\n\t};\n\n\tif (debug) {\n\t\treturn <DebugRenderer {...props} toolName={toolName} />;\n\t}\n\n\tswitch (normalizedName) {\n\t\tcase 'read':\n\t\t\treturn <ReadRenderer {...props} />;\n\t\tcase 'write':\n\t\t\treturn <WriteRenderer {...props} />;\n\t\tcase 'edit':\n\t\t\treturn <EditRenderer {...props} />;\n\t\tcase 'bash':\n\t\t\treturn <BashRenderer {...props} />;\n\t\tcase 'git_status':\n\t\t\treturn <GitStatusRenderer {...props} />;\n\t\tcase 'git_diff':\n\t\t\treturn <GitDiffRenderer {...props} />;\n\t\tcase 'git_commit':\n\t\t\treturn <GitCommitRenderer {...props} />;\n\t\tcase 'apply_patch':\n\t\t\treturn <ApplyPatchRenderer {...props} />;\n\t\tcase 'terminal':\n\t\t\treturn <TerminalRenderer {...props} />;\n\t\tcase 'ls':\n\t\t\treturn <ListRenderer {...props} />;\n\t\tcase 'tree':\n\t\t\treturn <TreeRenderer {...props} />;\n\t\tcase 'ripgrep':\n\t\tcase 'grep':\n\t\tcase 'glob':\n\t\t\treturn <SearchRenderer {...props} />;\n\t\tcase 'websearch':\n\t\t\treturn <WebSearchRenderer {...props} />;\n\t\tcase 'finish':\n\t\t\treturn <FinishRenderer {...props} />;\n\t\tcase 'update_todos':\n\t\tcase 'update_plan':\n\t\t\treturn <TodosRenderer {...props} />;\n\t\tcase 'progress_update':\n\t\t\treturn <ProgressUpdateRenderer {...props} />;\n\t\tcase 'load_mcp_tools':\n\t\t\treturn <LoadMcpToolsRenderer {...props} toolName={toolName} />;\n\t\tcase 'skill':\n\t\t\treturn <SkillRenderer {...props} />;\n\t\tcase 'error':\n\t\t\treturn (\n\t\t\t\t<ErrorRenderer\n\t\t\t\t\t{...props}\n\t\t\t\t\tsessionId={sessionId}\n\t\t\t\t\tonRetry={onRetry}\n\t\t\t\t\tonCompact={onCompact}\n\t\t\t\t/>\n\t\t\t);\n\t\tcase 'query_sessions':\n\t\tcase 'query_messages':\n\t\tcase 'search_history':\n\t\tcase 'get_session_context':\n\t\tcase 'get_parent_session':\n\t\tcase 'present_action':\n\t\t\treturn (\n\t\t\t\t<DatabaseToolRenderer\n\t\t\t\t\ttoolName={toolName}\n\t\t\t\t\t{...props}\n\t\t\t\t\tonNavigateToSession={onNavigateToSession}\n\t\t\t\t/>\n\t\t\t);\n\t\tdefault:\n\t\t\tif (isMcpTool(normalizedName)) {\n\t\t\t\treturn <McpToolRenderer {...props} toolName={toolName} />;\n\t\t\t}\n\t\t\treturn <GenericRenderer {...props} toolName={toolName} />;\n\t}\n}\n\nexport * from './types';\nexport { ReasoningRenderer } from './ReasoningRenderer';\n",
75
+ "import { ChevronRight, AlertCircle } from 'lucide-react';\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport {\n\tprism,\n\tvscDarkPlus,\n} from 'react-syntax-highlighter/dist/esm/styles/prism';\nimport type { RendererProps } from './types';\nimport { formatDuration } from './utils';\nimport { ToolErrorDisplay } from './ToolErrorDisplay';\n\nfunction getLanguageFromPath(path: string): string {\n\tconst ext = path.split('.').pop()?.toLowerCase();\n\tconst langMap: Record<string, string> = {\n\t\tjs: 'javascript',\n\t\tjsx: 'jsx',\n\t\tts: 'typescript',\n\t\ttsx: 'tsx',\n\t\tpy: 'python',\n\t\trb: 'ruby',\n\t\tgo: 'go',\n\t\trs: 'rust',\n\t\tjava: 'java',\n\t\tc: 'c',\n\t\tcpp: 'cpp',\n\t\th: 'c',\n\t\thpp: 'cpp',\n\t\tcs: 'csharp',\n\t\tphp: 'php',\n\t\tsh: 'bash',\n\t\tbash: 'bash',\n\t\tzsh: 'bash',\n\t\tsql: 'sql',\n\t\tjson: 'json',\n\t\tyaml: 'yaml',\n\t\tyml: 'yaml',\n\t\txml: 'xml',\n\t\thtml: 'html',\n\t\tcss: 'css',\n\t\tscss: 'scss',\n\t\tmd: 'markdown',\n\t\ttxt: 'text',\n\t};\n\treturn langMap[ext || ''] || 'text';\n}\n\nfunction parseLineRange(lineRange: string | undefined): number | undefined {\n\tif (!lineRange) return undefined;\n\tconst match = lineRange.match(/@(\\d+)-(\\d+)/);\n\tif (match) {\n\t\treturn Number.parseInt(match[1], 10);\n\t}\n\treturn undefined;\n}\n\nexport function ReadRenderer({\n\tcontentJson,\n\ttoolDurationMs,\n\tisExpanded,\n\tonToggle,\n\tcompact,\n}: RendererProps) {\n\tconst result = contentJson.result || {};\n\tconst args = contentJson.args || {};\n\n\tconst hasToolError =\n\t\ttypeof result === 'object' && 'ok' in result && result.ok === false;\n\tconst errorMessage =\n\t\thasToolError && 'error' in result && typeof result.error === 'string'\n\t\t\t? result.error\n\t\t\t: null;\n\tconst errorStack =\n\t\thasToolError && 'stack' in result && typeof result.stack === 'string'\n\t\t\t? result.stack\n\t\t\t: undefined;\n\n\tconst path = String(result.path || args.path || '');\n\tconst content = String(result.content || '');\n\tconst lineRange = result.lineRange as string | undefined;\n\tconst lines = content.split('\\n');\n\tconst timeStr = formatDuration(toolDurationMs);\n\tconst language = getLanguageFromPath(path);\n\tconst syntaxTheme = document?.documentElement.classList.contains('dark')\n\t\t? vscDarkPlus\n\t\t: prism;\n\n\tconst startingLineNumber = parseLineRange(lineRange);\n\n\tconst displayText = lineRange\n\t\t? `${path}:${lineRange.replace('@', '')}`\n\t\t: path;\n\n\tconst canExpand = content.length > 0 || hasToolError;\n\n\treturn (\n\t\t<div className=\"text-xs\">\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => canExpand && onToggle()}\n\t\t\t\tclassName={`flex items-center gap-2 transition-colors w-full min-w-0 ${\n\t\t\t\t\thasToolError\n\t\t\t\t\t\t? 'text-red-700 dark:text-red-300 hover:text-red-600 dark:hover:text-red-200'\n\t\t\t\t\t\t: canExpand\n\t\t\t\t\t\t\t? 'text-blue-700 dark:text-blue-300 hover:text-blue-600 dark:hover:text-blue-200'\n\t\t\t\t\t\t\t: 'text-blue-700 dark:text-blue-300'\n\t\t\t\t}`}\n\t\t\t>\n\t\t\t\t{canExpand ? (\n\t\t\t\t\tisExpanded ? (\n\t\t\t\t\t\t<ChevronRight className=\"h-3 w-3 flex-shrink-0 rotate-90 transition-transform\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ChevronRight className=\"h-3 w-3 flex-shrink-0 transition-transform\" />\n\t\t\t\t\t)\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"w-3 flex-shrink-0\" />\n\t\t\t\t)}\n\t\t\t\t{hasToolError && (\n\t\t\t\t\t<AlertCircle className=\"h-3 w-3 flex-shrink-0 text-red-600 dark:text-red-400\" />\n\t\t\t\t)}\n\t\t\t\t<span className=\"font-medium flex-shrink-0\">\n\t\t\t\t\tread{hasToolError ? ' error' : ''}\n\t\t\t\t</span>\n\t\t\t\t{!compact && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<span className=\"text-muted-foreground/70 flex-shrink-0\">·</span>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName=\"text-foreground/70 min-w-0 flex-shrink overflow-hidden text-ellipsis whitespace-nowrap\"\n\t\t\t\t\t\t\tdir=\"rtl\"\n\t\t\t\t\t\t\ttitle={displayText}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{`\\u2066${displayText}\\u2069`}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{!hasToolError && lines.length > 0 && !compact && (\n\t\t\t\t\t<span className=\"text-muted-foreground/80 flex-shrink-0 whitespace-nowrap\">\n\t\t\t\t\t\t· {lines.length} lines · {timeStr}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t{hasToolError && !compact && (\n\t\t\t\t\t<span className=\"text-muted-foreground/80 flex-shrink-0\">\n\t\t\t\t\t\t· {timeStr}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</button>\n\t\t\t{isExpanded && hasToolError && errorMessage && (\n\t\t\t\t<ToolErrorDisplay error={errorMessage} stack={errorStack} showStack />\n\t\t\t)}\n\t\t\t{isExpanded && !hasToolError && content && (\n\t\t\t\t<div className=\"mt-2 ml-5 bg-card/60 border border-border rounded-lg overflow-hidden max-h-96 overflow-y-auto max-w-full\">\n\t\t\t\t\t<div className=\"overflow-x-auto max-w-full\">\n\t\t\t\t\t\t<SyntaxHighlighter\n\t\t\t\t\t\t\tlanguage={language}\n\t\t\t\t\t\t\tstyle={syntaxTheme}\n\t\t\t\t\t\t\tcustomStyle={{\n\t\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\t\tpadding: '0.75rem',\n\t\t\t\t\t\t\t\tfontSize: '0.75rem',\n\t\t\t\t\t\t\t\tlineHeight: '1.5',\n\t\t\t\t\t\t\t\tbackground: 'transparent',\n\t\t\t\t\t\t\t\tmaxWidth: '100%',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tshowLineNumbers\n\t\t\t\t\t\t\tstartingLineNumber={startingLineNumber}\n\t\t\t\t\t\t\twrapLines\n\t\t\t\t\t\t\twrapLongLines\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{content}\n\t\t\t\t\t\t</SyntaxHighlighter>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",
76
+ "/**\n * Format a duration in milliseconds to a human-readable string.\n * Shows seconds (with 1 decimal) if >= 1000ms, otherwise shows ms.\n *\n * @example\n * formatDuration(450) // \"450ms\"\n * formatDuration(1234) // \"1.2s\"\n * formatDuration(5678) // \"5.7s\"\n */\nexport function formatDuration(ms: number | undefined): string {\n\tif (!ms) return '';\n\tif (ms >= 1000) {\n\t\treturn `${(ms / 1000).toFixed(1)}s`;\n\t}\n\treturn `${ms}ms`;\n}\n\n/**\n * Check if a tool result is an error response.\n * Handles both the new ok: false pattern and legacy error patterns.\n */\nexport function isToolError(result: unknown): boolean {\n\tif (!result || typeof result !== 'object') return false;\n\tconst obj = result as Record<string, unknown>;\n\treturn obj.ok === false || 'error' in obj || obj.success === false;\n}\n\n/**\n * Extract the error message from a tool result.\n * Checks multiple common fields: error, stderr, message, detail, details, reason.\n */\nexport function getErrorMessage(result: unknown): string | null {\n\tif (!result || typeof result !== 'object') return null;\n\n\tconst obj = result as Record<string, unknown>;\n\tconst keys = ['error', 'stderr', 'message', 'detail', 'details', 'reason'];\n\tfor (const key of keys) {\n\t\tconst value = obj[key];\n\t\tif (typeof value === 'string') {\n\t\t\tconst trimmed = value.trim();\n\t\t\tif (trimmed.length) return trimmed;\n\t\t}\n\t}\n\treturn null;\n}\n\n/**\n * Extract error details from a tool result.\n * Returns the details object if present and valid.\n */\nexport function getErrorDetails(\n\tresult: unknown,\n): Record<string, unknown> | null {\n\tif (!result || typeof result !== 'object') return null;\n\tconst obj = result as Record<string, unknown>;\n\tif (obj.details && typeof obj.details === 'object') {\n\t\treturn obj.details as Record<string, unknown>;\n\t}\n\treturn null;\n}\n",
77
+ "import { AlertCircle } from 'lucide-react';\n\ninterface ToolErrorDisplayProps {\n\terror: string;\n\tstack?: string;\n\tshowStack?: boolean;\n}\n\n/**\n * Shared error display component for tool results with ok: false\n * Matches the structure and colors of ErrorRenderer\n */\nexport function ToolErrorDisplay({\n\terror,\n\tstack,\n\tshowStack = false,\n}: ToolErrorDisplayProps) {\n\treturn (\n\t\t<div className=\"mt-2 ml-5 p-3 bg-red-50 dark:bg-red-950/20 border border-red-200 dark:border-red-800 rounded text-sm\">\n\t\t\t<div className=\"flex items-start gap-2\">\n\t\t\t\t<AlertCircle className=\"h-4 w-4 flex-shrink-0 text-red-600 dark:text-red-400 mt-0.5\" />\n\t\t\t\t<div className=\"flex-1 space-y-2\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div className=\"font-medium text-red-600 dark:text-red-400\">\n\t\t\t\t\t\t\tTool Error:\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"mt-1 text-red-900 dark:text-red-200 whitespace-pre-wrap\">\n\t\t\t\t\t\t\t{error}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t{showStack && stack && (\n\t\t\t\t\t\t<details className=\"mt-2\">\n\t\t\t\t\t\t\t<summary className=\"cursor-pointer text-xs text-red-700 dark:text-red-300 hover:text-red-600 dark:hover:text-red-200\">\n\t\t\t\t\t\t\t\tView stack trace\n\t\t\t\t\t\t\t</summary>\n\t\t\t\t\t\t\t<pre className=\"mt-2 p-2 bg-red-100/50 dark:bg-red-900/20 rounded text-xs overflow-x-auto text-red-800 dark:text-red-300\">\n\t\t\t\t\t\t\t\t{stack}\n\t\t\t\t\t\t\t</pre>\n\t\t\t\t\t\t</details>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n",
78
+ "import { ChevronRight, AlertCircle } from 'lucide-react';\nimport type { RendererProps } from './types';\nimport { DiffView } from './DiffView';\nimport { formatDuration } from './utils';\nimport { ToolErrorDisplay } from './ToolErrorDisplay';\n\nexport function WriteRenderer({\n\tcontentJson,\n\ttoolDurationMs,\n\tisExpanded,\n\tonToggle,\n\tcompact,\n}: RendererProps) {\n\tconst result = contentJson.result || {};\n\tconst args = contentJson.args || {};\n\tconst artifact = contentJson.artifact;\n\n\tconst hasToolError =\n\t\ttypeof result === 'object' && 'ok' in result && result.ok === false;\n\tconst errorMessage =\n\t\thasToolError && 'error' in result && typeof result.error === 'string'\n\t\t\t? result.error\n\t\t\t: null;\n\tconst errorStack =\n\t\thasToolError && 'stack' in result && typeof result.stack === 'string'\n\t\t\t? result.stack\n\t\t\t: undefined;\n\n\tconst path = String(result.path || args.path || '');\n\tconst bytes = Number(result.bytes || 0);\n\tconst patch = artifact?.patch ? String(artifact.patch) : '';\n\tconst timeStr = formatDuration(toolDurationMs);\n\n\tconst canExpand = patch.length > 0 || hasToolError;\n\n\treturn (\n\t\t<div className=\"text-xs\">\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => canExpand && onToggle()}\n\t\t\t\tclassName={`flex items-center gap-2 transition-colors min-w-0 w-full ${\n\t\t\t\t\thasToolError\n\t\t\t\t\t\t? 'text-red-700 dark:text-red-300 hover:text-red-600 dark:hover:text-red-200'\n\t\t\t\t\t\t: canExpand\n\t\t\t\t\t\t\t? 'text-emerald-700 dark:text-emerald-300 hover:text-emerald-600 dark:hover:text-emerald-200'\n\t\t\t\t\t\t\t: 'text-emerald-700 dark:text-emerald-300'\n\t\t\t\t}`}\n\t\t\t>\n\t\t\t\t{canExpand ? (\n\t\t\t\t\tisExpanded ? (\n\t\t\t\t\t\t<ChevronRight className=\"h-3 w-3 flex-shrink-0 rotate-90 transition-transform\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ChevronRight className=\"h-3 w-3 flex-shrink-0 transition-transform\" />\n\t\t\t\t\t)\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"w-3 flex-shrink-0\" />\n\t\t\t\t)}\n\t\t\t\t{hasToolError && (\n\t\t\t\t\t<AlertCircle className=\"h-3 w-3 flex-shrink-0 text-red-600 dark:text-red-400\" />\n\t\t\t\t)}\n\t\t\t\t<span className=\"font-medium flex-shrink-0\">\n\t\t\t\t\twrite{hasToolError ? ' error' : ''}\n\t\t\t\t</span>\n\t\t\t\t{!compact && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<span className=\"text-muted-foreground/70 flex-shrink-0\">·</span>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName=\"text-foreground/70 min-w-0 flex-shrink overflow-hidden text-ellipsis whitespace-nowrap\"\n\t\t\t\t\t\t\tdir=\"rtl\"\n\t\t\t\t\t\t\ttitle={path}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{`\\u2066${path}\\u2069`}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{!hasToolError && bytes > 0 && !compact && (\n\t\t\t\t\t<span className=\"text-muted-foreground/80 whitespace-nowrap flex-shrink-0\">\n\t\t\t\t\t\t· {bytes} bytes · {timeStr}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t{hasToolError && !compact && (\n\t\t\t\t\t<span className=\"text-muted-foreground/80 flex-shrink-0\">\n\t\t\t\t\t\t· {timeStr}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</button>\n\t\t\t{isExpanded && hasToolError && errorMessage && (\n\t\t\t\t<ToolErrorDisplay error={errorMessage} stack={errorStack} showStack />\n\t\t\t)}\n\t\t\t{isExpanded && !hasToolError && patch && (\n\t\t\t\t<div className=\"mt-2 ml-5\">\n\t\t\t\t\t<DiffView patch={patch} />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",
79
+ "import { ChevronRight, AlertCircle } from 'lucide-react';\nimport type { RendererProps } from './types';\nimport { DiffView } from './DiffView';\nimport { formatDuration } from './utils';\nimport { ToolErrorDisplay } from './ToolErrorDisplay';\n\nexport function EditRenderer({\n\tcontentJson,\n\ttoolDurationMs,\n\tisExpanded,\n\tonToggle,\n}: RendererProps) {\n\tconst args = (contentJson.args || {}) as Record<string, unknown>;\n\tconst result = (contentJson.result || {}) as Record<string, unknown>;\n\tconst artifact = contentJson.artifact;\n\tconst hasToolError =\n\t\ttypeof result === 'object' && 'ok' in result && result.ok === false;\n\tconst errorMessage =\n\t\thasToolError && 'error' in result && typeof result.error === 'string'\n\t\t\t? result.error\n\t\t\t: null;\n\tconst errorStack =\n\t\thasToolError && 'stack' in result && typeof result.stack === 'string'\n\t\t\t? result.stack\n\t\t\t: undefined;\n\n\tconst path = String(result.path || args.path || '');\n\tconst opsApplied = Number(result.opsApplied || 0);\n\tconst patch = artifact?.patch ? String(artifact.patch) : '';\n\tconst timeStr = formatDuration(toolDurationMs);\n\n\tconst canExpand = patch.length > 0 || hasToolError;\n\n\treturn (\n\t\t<div className=\"text-xs\">\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => canExpand && onToggle()}\n\t\t\t\tclassName={`flex items-center gap-2 transition-colors min-w-0 w-full ${\n\t\t\t\t\thasToolError\n\t\t\t\t\t\t? 'text-red-700 dark:text-red-300 hover:text-red-600 dark:hover:text-red-200'\n\t\t\t\t\t\t: canExpand\n\t\t\t\t\t\t\t? 'text-purple-700 dark:text-purple-300 hover:text-purple-600 dark:hover:text-purple-200'\n\t\t\t\t\t\t\t: 'text-purple-700 dark:text-purple-300'\n\t\t\t\t}`}\n\t\t\t>\n\t\t\t\t{canExpand ? (\n\t\t\t\t\tisExpanded ? (\n\t\t\t\t\t\t<ChevronRight className=\"h-3 w-3 flex-shrink-0 rotate-90 transition-transform\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ChevronRight className=\"h-3 w-3 flex-shrink-0 transition-transform\" />\n\t\t\t\t\t)\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"w-3 flex-shrink-0\" />\n\t\t\t\t)}\n\t\t\t\t{hasToolError && (\n\t\t\t\t\t<AlertCircle className=\"h-3 w-3 flex-shrink-0 text-red-600 dark:text-red-400\" />\n\t\t\t\t)}\n\t\t\t\t<span className=\"font-medium flex-shrink-0\">\n\t\t\t\t\tedit{hasToolError ? ' error' : ''}\n\t\t\t\t</span>\n\t\t\t\t<span className=\"text-muted-foreground/70 flex-shrink-0\">·</span>\n\t\t\t\t<span\n\t\t\t\t\tclassName=\"text-foreground/70 min-w-0 flex-shrink overflow-hidden text-ellipsis whitespace-nowrap\"\n\t\t\t\t\tdir=\"rtl\"\n\t\t\t\t\ttitle={path}\n\t\t\t\t>\n\t\t\t\t\t{`\\u2066${path}\\u2069`}\n\t\t\t\t</span>\n\t\t\t\t{!hasToolError && opsApplied > 0 && (\n\t\t\t\t\t<span className=\"text-muted-foreground/80 whitespace-nowrap flex-shrink-0\">\n\t\t\t\t\t\t· {opsApplied} ops · {timeStr}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t{hasToolError && (\n\t\t\t\t\t<span className=\"text-muted-foreground/80 flex-shrink-0\">\n\t\t\t\t\t\t· {timeStr}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</button>\n\t\t\t{isExpanded && hasToolError && errorMessage && (\n\t\t\t\t<ToolErrorDisplay error={errorMessage} stack={errorStack} showStack />\n\t\t\t)}\n\t\t\t{isExpanded && !hasToolError && patch && (\n\t\t\t\t<div className=\"mt-2 ml-5\">\n\t\t\t\t\t<DiffView patch={patch} />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",
80
+ "import { Terminal } from 'lucide-react';\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport {\n\tprism,\n\tvscDarkPlus,\n} from 'react-syntax-highlighter/dist/esm/styles/prism';\nimport type { RendererProps } from './types';\nimport { formatDuration } from './utils';\nimport { ToolErrorDisplay } from './ToolErrorDisplay';\nimport {\n\tToolHeader,\n\tToolHeaderSeparator,\n\tToolHeaderMeta,\n\tToolHeaderSuccess,\n\tToolHeaderError,\n\tToolContentBox,\n} from './shared';\n\nexport function BashRenderer({\n\tcontentJson,\n\ttoolDurationMs,\n\tisExpanded,\n\tonToggle,\n\tcompact,\n}: RendererProps) {\n\tconst result = contentJson.result || {};\n\tconst args = contentJson.args || {};\n\n\tconst hasToolError =\n\t\ttypeof result === 'object' && 'ok' in result && result.ok === false;\n\tconst errorMessage =\n\t\thasToolError && 'error' in result && typeof result.error === 'string'\n\t\t\t? result.error\n\t\t\t: null;\n\tconst errorStack =\n\t\thasToolError && 'stack' in result && typeof result.stack === 'string'\n\t\t\t? result.stack\n\t\t\t: undefined;\n\n\tconst stdout = String(result.stdout || '');\n\tconst stderr = String(result.stderr || '');\n\tconst exitCode = Number(result.exitCode ?? 0);\n\tconst cmd = String(args.cmd || '');\n\tconst cwd = args.cwd ? String(args.cwd) : undefined;\n\tconst timeStr = formatDuration(toolDurationMs);\n\tconst syntaxTheme = document?.documentElement.classList.contains('dark')\n\t\t? vscDarkPlus\n\t\t: prism;\n\n\tconst hasOutput = stdout.length > 0 || stderr.length > 0;\n\tconst isError = hasToolError || exitCode !== 0;\n\tconst hasStderr = stderr.length > 0;\n\tconst combinedOutput = stdout + (stdout && stderr ? '\\n' : '') + stderr;\n\n\treturn (\n\t\t<div className=\"text-xs\">\n\t\t\t<ToolHeader\n\t\t\t\ttoolName=\"bash\"\n\t\t\t\tisExpanded={isExpanded}\n\t\t\t\tonToggle={onToggle}\n\t\t\t\tisError={isError}\n\t\t\t\tcolorVariant=\"default\"\n\t\t\t\tcanExpand={true}\n\t\t\t>\n\t\t\t\t{!compact && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName=\"text-foreground/70 min-w-0 truncate font-mono text-[11px]\"\n\t\t\t\t\t\t\ttitle={cmd}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{cmd}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{!hasToolError && !compact && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t{exitCode === 0 ? (\n\t\t\t\t\t\t\t<ToolHeaderSuccess>exit {exitCode}</ToolHeaderSuccess>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<ToolHeaderError>exit {exitCode}</ToolHeaderError>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<ToolHeaderMeta>{timeStr}</ToolHeaderMeta>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{hasToolError && !compact && (\n\t\t\t\t\t<ToolHeaderMeta>· {timeStr}</ToolHeaderMeta>\n\t\t\t\t)}\n\t\t\t</ToolHeader>\n\n\t\t\t{isExpanded && hasToolError && errorMessage && (\n\t\t\t\t<ToolErrorDisplay error={errorMessage} stack={errorStack} showStack />\n\t\t\t)}\n\n\t\t\t{isExpanded && !hasToolError && (\n\t\t\t\t<div className=\"mt-2 ml-5 flex flex-col gap-2 max-w-full\">\n\t\t\t\t\t<ToolContentBox\n\t\t\t\t\t\ttitle=\"command\"\n\t\t\t\t\t\ticon={<Terminal className=\"h-3 w-3\" />}\n\t\t\t\t\t\tsubtitle={cwd && cwd !== '.' ? `in ${cwd}` : undefined}\n\t\t\t\t\t\tcopyText={cmd}\n\t\t\t\t\t\tmaxHeight=\"\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"px-3 py-2 font-mono text-xs bg-muted/10 break-all\">\n\t\t\t\t\t\t\t{cmd}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</ToolContentBox>\n\n\t\t\t\t\t{hasOutput &&\n\t\t\t\t\t\t(exitCode === 0 ? (\n\t\t\t\t\t\t\t<ToolContentBox\n\t\t\t\t\t\t\t\ttitle=\"output\"\n\t\t\t\t\t\t\t\tcopyText={combinedOutput}\n\t\t\t\t\t\t\t\tmaxHeight=\"max-h-[30rem]\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<SyntaxHighlighter\n\t\t\t\t\t\t\t\t\tlanguage=\"bash\"\n\t\t\t\t\t\t\t\t\tstyle={syntaxTheme}\n\t\t\t\t\t\t\t\t\tcustomStyle={{\n\t\t\t\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\t\t\t\tpadding: '0.75rem',\n\t\t\t\t\t\t\t\t\t\tfontSize: '0.75rem',\n\t\t\t\t\t\t\t\t\t\tlineHeight: '1.5',\n\t\t\t\t\t\t\t\t\t\tbackground: 'transparent',\n\t\t\t\t\t\t\t\t\t\tmaxWidth: '100%',\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\twrapLines\n\t\t\t\t\t\t\t\t\twrapLongLines\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{combinedOutput}\n\t\t\t\t\t\t\t\t</SyntaxHighlighter>\n\t\t\t\t\t\t\t</ToolContentBox>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t{stdout && (\n\t\t\t\t\t\t\t\t\t<ToolContentBox\n\t\t\t\t\t\t\t\t\t\ttitle=\"stdout\"\n\t\t\t\t\t\t\t\t\t\tcopyText={stdout}\n\t\t\t\t\t\t\t\t\t\tmaxHeight=\"max-h-60\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<SyntaxHighlighter\n\t\t\t\t\t\t\t\t\t\t\tlanguage=\"bash\"\n\t\t\t\t\t\t\t\t\t\t\tstyle={syntaxTheme}\n\t\t\t\t\t\t\t\t\t\t\tcustomStyle={{\n\t\t\t\t\t\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tpadding: '0.75rem',\n\t\t\t\t\t\t\t\t\t\t\t\tfontSize: '0.75rem',\n\t\t\t\t\t\t\t\t\t\t\t\tlineHeight: '1.5',\n\t\t\t\t\t\t\t\t\t\t\t\tbackground: 'transparent',\n\t\t\t\t\t\t\t\t\t\t\t\tmaxWidth: '100%',\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\twrapLines\n\t\t\t\t\t\t\t\t\t\t\twrapLongLines\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{stdout}\n\t\t\t\t\t\t\t\t\t\t</SyntaxHighlighter>\n\t\t\t\t\t\t\t\t\t</ToolContentBox>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{hasStderr && (\n\t\t\t\t\t\t\t\t\t<ToolContentBox\n\t\t\t\t\t\t\t\t\t\ttitle=\"stderr\"\n\t\t\t\t\t\t\t\t\t\tcopyText={stderr}\n\t\t\t\t\t\t\t\t\t\tvariant=\"error\"\n\t\t\t\t\t\t\t\t\t\tmaxHeight=\"max-h-60\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<SyntaxHighlighter\n\t\t\t\t\t\t\t\t\t\t\tlanguage=\"bash\"\n\t\t\t\t\t\t\t\t\t\t\tstyle={syntaxTheme}\n\t\t\t\t\t\t\t\t\t\t\tcustomStyle={{\n\t\t\t\t\t\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\t\t\t\t\t\tpadding: '0.75rem',\n\t\t\t\t\t\t\t\t\t\t\t\tfontSize: '0.75rem',\n\t\t\t\t\t\t\t\t\t\t\t\tlineHeight: '1.5',\n\t\t\t\t\t\t\t\t\t\t\t\tbackground: 'transparent',\n\t\t\t\t\t\t\t\t\t\t\t\tmaxWidth: '100%',\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\twrapLines\n\t\t\t\t\t\t\t\t\t\t\twrapLongLines\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{stderr}\n\t\t\t\t\t\t\t\t\t\t</SyntaxHighlighter>\n\t\t\t\t\t\t\t\t\t</ToolContentBox>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",
81
+ "import { useState } from 'react';\nimport { Copy, Check } from 'lucide-react';\n\ninterface CopyButtonProps {\n\ttext: string;\n\tclassName?: string;\n\tsize?: 'sm' | 'md' | 'lg';\n}\n\nconst sizeClasses = {\n\tsm: 'h-3 w-3',\n\tmd: 'h-4 w-4',\n\tlg: 'h-5 w-5',\n};\n\nconst paddingClasses = {\n\tsm: 'p-1',\n\tmd: 'p-1.5',\n\tlg: 'p-2',\n};\n\nexport function CopyButton({\n\ttext,\n\tclassName = '',\n\tsize = 'sm',\n}: CopyButtonProps) {\n\tconst [copied, setCopied] = useState(false);\n\n\tconst handleCopy = async (e: React.MouseEvent) => {\n\t\te.stopPropagation();\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(text);\n\t\t\tsetCopied(true);\n\t\t\tsetTimeout(() => setCopied(false), 2000);\n\t\t} catch {}\n\t};\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={handleCopy}\n\t\t\tclassName={`${paddingClasses[size]} rounded hover:bg-muted/50 text-muted-foreground hover:text-foreground transition-colors ${className}`}\n\t\t\ttitle=\"Copy\"\n\t\t>\n\t\t\t{copied ? (\n\t\t\t\t<Check className={`${sizeClasses[size]} text-emerald-500`} />\n\t\t\t) : (\n\t\t\t\t<Copy className={sizeClasses[size]} />\n\t\t\t)}\n\t\t</button>\n\t);\n}\n",
82
+ "import type { ReactNode } from 'react';\nimport { CopyButton } from './CopyButton';\n\ninterface ToolContentBoxProps {\n\ttitle: string;\n\ticon?: ReactNode;\n\tsubtitle?: string;\n\tcopyText?: string;\n\tvariant?: 'default' | 'error';\n\tmaxHeight?: string;\n\tchildren: ReactNode;\n}\n\nexport function ToolContentBox({\n\ttitle,\n\ticon,\n\tsubtitle,\n\tcopyText,\n\tvariant = 'default',\n\tmaxHeight = 'max-h-80',\n\tchildren,\n}: ToolContentBoxProps) {\n\tconst isError = variant === 'error';\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`bg-card/60 border rounded-lg overflow-hidden flex flex-col ${maxHeight} ${\n\t\t\t\tisError ? 'border-red-500/50' : 'border-border'\n\t\t\t}`}\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName={`flex items-center justify-between gap-2 text-xs px-3 py-1.5 border-b border-border sticky top-0 ${\n\t\t\t\t\tisError\n\t\t\t\t\t\t? 'text-red-600 dark:text-red-400 bg-red-500/10'\n\t\t\t\t\t\t: 'text-muted-foreground bg-muted/30'\n\t\t\t\t}`}\n\t\t\t>\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t{icon}\n\t\t\t\t\t<span>{title}</span>\n\t\t\t\t\t{subtitle && (\n\t\t\t\t\t\t<span className=\"text-muted-foreground/60\">{subtitle}</span>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t{copyText && <CopyButton text={copyText} />}\n\t\t\t</div>\n\t\t\t<div className=\"overflow-auto flex-1\">{children}</div>\n\t\t</div>\n\t);\n}\n",
83
+ "import { useState } from 'react';\nimport { ImageIcon, X } from 'lucide-react';\n\ninterface ImageData {\n\tdata: string;\n\tmimeType: string;\n}\n\ninterface ImagePreviewProps {\n\timages: ImageData[];\n}\n\nexport function ImagePreview({ images }: ImagePreviewProps) {\n\tconst [expandedIndex, setExpandedIndex] = useState<number | null>(null);\n\n\tif (images.length === 0) return null;\n\n\treturn (\n\t\t<div className=\"flex flex-wrap gap-2 mt-2\">\n\t\t\t{images.map((img, i) => {\n\t\t\t\tconst src = `data:${img.mimeType};base64,${img.data}`;\n\t\t\t\tconst isExpanded = expandedIndex === i;\n\n\t\t\t\treturn (\n\t\t\t\t\t<div key={`img-${i}-${img.mimeType}`} className=\"relative\">\n\t\t\t\t\t\t{isExpanded ? (\n\t\t\t\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={() => setExpandedIndex(null)}\n\t\t\t\t\t\t\t\t\tclassName=\"absolute top-1 right-1 z-10 p-0.5 rounded bg-black/60 text-white hover:bg-black/80 transition-colors\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<X className=\"h-3 w-3\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tsrc={src}\n\t\t\t\t\t\t\t\t\talt={`Tool result ${i + 1}`}\n\t\t\t\t\t\t\t\t\tclassName=\"max-w-full max-h-[32rem] rounded-lg border border-border object-contain\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => setExpandedIndex(i)}\n\t\t\t\t\t\t\t\tclassName=\"group relative overflow-hidden rounded-lg border border-border hover:border-foreground/30 transition-colors\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tsrc={src}\n\t\t\t\t\t\t\t\t\talt={`Tool result ${i + 1}`}\n\t\t\t\t\t\t\t\t\tclassName=\"w-48 h-32 object-cover\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<div className=\"absolute inset-0 bg-black/0 group-hover:bg-black/10 transition-colors flex items-center justify-center\">\n\t\t\t\t\t\t\t\t\t<ImageIcon className=\"h-5 w-5 text-white opacity-0 group-hover:opacity-80 transition-opacity drop-shadow-lg\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n",
84
+ "import type { ReactNode } from 'react';\nimport { ChevronDown, ChevronRight, AlertCircle } from 'lucide-react';\n\ntype ColorVariant =\n\t| 'default'\n\t| 'blue'\n\t| 'emerald'\n\t| 'purple'\n\t| 'cyan'\n\t| 'amber'\n\t| 'red';\n\nconst colorClasses: Record<\n\tColorVariant,\n\t{ normal: string; hover: string; error: string; errorHover: string }\n> = {\n\tdefault: {\n\t\tnormal: 'text-muted-foreground',\n\t\thover: 'hover:text-foreground',\n\t\terror: 'text-red-700 dark:text-red-300',\n\t\terrorHover: 'hover:text-red-600 dark:hover:text-red-200',\n\t},\n\tblue: {\n\t\tnormal: 'text-blue-700 dark:text-blue-300',\n\t\thover: 'hover:text-blue-600 dark:hover:text-blue-200',\n\t\terror: 'text-red-700 dark:text-red-300',\n\t\terrorHover: 'hover:text-red-600 dark:hover:text-red-200',\n\t},\n\temerald: {\n\t\tnormal: 'text-emerald-700 dark:text-emerald-300',\n\t\thover: 'hover:text-emerald-600 dark:hover:text-emerald-200',\n\t\terror: 'text-red-700 dark:text-red-300',\n\t\terrorHover: 'hover:text-red-600 dark:hover:text-red-200',\n\t},\n\tpurple: {\n\t\tnormal: 'text-purple-700 dark:text-purple-300',\n\t\thover: 'hover:text-purple-600 dark:hover:text-purple-200',\n\t\terror: 'text-red-700 dark:text-red-300',\n\t\terrorHover: 'hover:text-red-600 dark:hover:text-red-200',\n\t},\n\tcyan: {\n\t\tnormal: 'text-cyan-700 dark:text-cyan-300',\n\t\thover: 'hover:text-cyan-600 dark:hover:text-cyan-200',\n\t\terror: 'text-red-700 dark:text-red-300',\n\t\terrorHover: 'hover:text-red-600 dark:hover:text-red-200',\n\t},\n\tamber: {\n\t\tnormal: 'text-amber-700 dark:text-amber-300',\n\t\thover: 'hover:text-amber-600 dark:hover:text-amber-200',\n\t\terror: 'text-red-700 dark:text-red-300',\n\t\terrorHover: 'hover:text-red-600 dark:hover:text-red-200',\n\t},\n\tred: {\n\t\tnormal: 'text-red-700 dark:text-red-300',\n\t\thover: 'hover:text-red-600 dark:hover:text-red-200',\n\t\terror: 'text-red-700 dark:text-red-300',\n\t\terrorHover: 'hover:text-red-600 dark:hover:text-red-200',\n\t},\n};\n\ninterface ToolHeaderProps {\n\ttoolName: string;\n\tisExpanded: boolean;\n\tonToggle: () => void;\n\tisError?: boolean;\n\tcolorVariant?: ColorVariant;\n\tcanExpand?: boolean;\n\tchildren?: ReactNode;\n}\n\nexport function ToolHeader({\n\ttoolName,\n\tisExpanded,\n\tonToggle,\n\tisError = false,\n\tcolorVariant = 'default',\n\tcanExpand = true,\n\tchildren,\n}: ToolHeaderProps) {\n\tconst colors = colorClasses[colorVariant];\n\tconst colorClass = isError\n\t\t? `${colors.error} ${colors.errorHover}`\n\t\t: `${colors.normal} ${colors.hover}`;\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={() => canExpand && onToggle()}\n\t\t\tclassName={`flex items-center gap-2 transition-colors w-full min-w-0 ${colorClass}`}\n\t\t>\n\t\t\t{canExpand ? (\n\t\t\t\tisExpanded ? (\n\t\t\t\t\t<ChevronDown className=\"h-3 w-3 flex-shrink-0\" />\n\t\t\t\t) : (\n\t\t\t\t\t<ChevronRight className=\"h-3 w-3 flex-shrink-0\" />\n\t\t\t\t)\n\t\t\t) : (\n\t\t\t\t<div className=\"w-3 flex-shrink-0\" />\n\t\t\t)}\n\t\t\t{isError && (\n\t\t\t\t<AlertCircle className=\"h-3 w-3 flex-shrink-0 text-red-600 dark:text-red-400\" />\n\t\t\t)}\n\t\t\t<span className=\"font-medium flex-shrink-0\">\n\t\t\t\t{toolName}\n\t\t\t\t{isError ? ' error' : ''}\n\t\t\t</span>\n\t\t\t{children}\n\t\t</button>\n\t);\n}\n\nexport function ToolHeaderSeparator() {\n\treturn <span className=\"text-muted-foreground/70 flex-shrink-0\">·</span>;\n}\n\nexport function ToolHeaderDetail({\n\tchildren,\n\tclassName = '',\n}: {\n\tchildren: ReactNode;\n\tclassName?: string;\n}) {\n\treturn <span className={`text-foreground/70 ${className}`}>{children}</span>;\n}\n\nexport function ToolHeaderMeta({\n\tchildren,\n\tclassName = '',\n}: {\n\tchildren: ReactNode;\n\tclassName?: string;\n}) {\n\treturn (\n\t\t<span\n\t\t\tclassName={`text-muted-foreground/80 flex-shrink-0 whitespace-nowrap ${className}`}\n\t\t>\n\t\t\t{children}\n\t\t</span>\n\t);\n}\n\nexport function ToolHeaderSuccess({ children }: { children: ReactNode }) {\n\treturn (\n\t\t<span className=\"text-emerald-600 dark:text-emerald-400 flex-shrink-0\">\n\t\t\t{children}\n\t\t</span>\n\t);\n}\n\nexport function ToolHeaderError({ children }: { children: ReactNode }) {\n\treturn (\n\t\t<span className=\"text-red-600 dark:text-red-400 flex-shrink-0\">\n\t\t\t{children}\n\t\t</span>\n\t);\n}\n",
85
+ "import type { RendererProps } from './types';\nimport { formatDuration, isToolError, getErrorMessage } from './utils';\nimport { ToolHeader, ToolHeaderSeparator, ToolHeaderMeta } from './shared';\nimport { ToolErrorDisplay } from './ToolErrorDisplay';\n\ninterface StatusLine {\n\tstatus: string;\n\tfile: string;\n\ttype: 'staged' | 'unstaged' | 'untracked' | 'both';\n}\n\nfunction parseStatusLine(line: string): StatusLine | null {\n\tif (!line || line.length < 3) return null;\n\tconst x = line[0];\n\tconst y = line[1];\n\tconst file = line.slice(3);\n\n\tif (x === '?' && y === '?') {\n\t\treturn { status: '??', file, type: 'untracked' };\n\t}\n\n\tlet type: StatusLine['type'] = 'unstaged';\n\tif (x !== ' ' && y !== ' ') type = 'both';\n\telse if (x !== ' ') type = 'staged';\n\n\treturn { status: `${x}${y}`, file, type };\n}\n\nfunction getStatusIcon(status: string): string {\n\tif (status === '??') return '?';\n\tif (status[0] === 'A' || status[1] === 'A') return '+';\n\tif (status[0] === 'M' || status[1] === 'M') return '~';\n\tif (status[0] === 'D' || status[1] === 'D') return '-';\n\tif (status[0] === 'R' || status[1] === 'R') return '→';\n\treturn status;\n}\n\nfunction getStatusColor(type: StatusLine['type']): string {\n\tswitch (type) {\n\t\tcase 'staged':\n\t\t\treturn 'text-emerald-600 dark:text-emerald-400';\n\t\tcase 'unstaged':\n\t\t\treturn 'text-amber-600 dark:text-amber-400';\n\t\tcase 'untracked':\n\t\t\treturn 'text-muted-foreground/60';\n\t\tcase 'both':\n\t\t\treturn 'text-blue-600 dark:text-blue-400';\n\t}\n}\n\nexport function GitStatusRenderer({\n\tcontentJson,\n\ttoolDurationMs,\n\tisExpanded,\n\tonToggle,\n}: RendererProps) {\n\tconst result = contentJson.result || {};\n\tconst hasError = isToolError(result);\n\tconst errorMessage = getErrorMessage(result);\n\tconst staged = Number(result.staged || 0);\n\tconst unstaged = Number(result.unstaged || 0);\n\tconst raw = (result.raw || []) as string[];\n\tconst summary = String(result.summary || '');\n\tconst timeStr = formatDuration(toolDurationMs);\n\n\tconst statusLines = raw.map(parseStatusLine).filter(Boolean) as StatusLine[];\n\tconst hasChanges = staged > 0 || unstaged > 0;\n\tconst canExpand = statusLines.length > 0 || hasError || !!summary;\n\n\treturn (\n\t\t<div className=\"text-xs\">\n\t\t\t<ToolHeader\n\t\t\t\ttoolName=\"git status\"\n\t\t\t\tisExpanded={isExpanded}\n\t\t\t\tonToggle={onToggle}\n\t\t\t\tisError={hasError}\n\t\t\t\tcolorVariant=\"blue\"\n\t\t\t\tcanExpand={canExpand}\n\t\t\t>\n\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t{hasChanges ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{staged > 0 && (\n\t\t\t\t\t\t\t<span className=\"text-emerald-600 dark:text-emerald-400 flex-shrink-0\">\n\t\t\t\t\t\t\t\t{staged} staged\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{unstaged > 0 && (\n\t\t\t\t\t\t\t<span className=\"text-amber-600 dark:text-amber-400 flex-shrink-0\">\n\t\t\t\t\t\t\t\t{unstaged} unstaged\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</>\n\t\t\t\t) : (\n\t\t\t\t\t<span className=\"text-muted-foreground/60 flex-shrink-0\">clean</span>\n\t\t\t\t)}\n\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t<ToolHeaderMeta>{timeStr}</ToolHeaderMeta>\n\t\t\t</ToolHeader>\n\t\t\t{isExpanded && hasError && errorMessage && (\n\t\t\t\t<ToolErrorDisplay error={errorMessage} />\n\t\t\t)}\n\t\t\t{isExpanded && !hasError && (statusLines.length > 0 || summary) && (\n\t\t\t\t<div className=\"mt-2 ml-5\">\n\t\t\t\t\t{statusLines.length > 0 ? (\n\t\t\t\t\t\t<div className=\"bg-card/60 border border-border rounded-lg overflow-hidden max-h-96 overflow-y-auto\">\n\t\t\t\t\t\t\t<div className=\"divide-y divide-border/50\">\n\t\t\t\t\t\t\t\t{statusLines.map((line, i) => (\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tkey={`${line.file}-${i}`}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-2 px-3 py-1.5 font-mono hover:bg-muted/20\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\tclassName={`font-semibold w-6 flex-shrink-0 ${getStatusColor(line.type)}`}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{getStatusIcon(line.status)}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-foreground/80 break-all\">\n\t\t\t\t\t\t\t\t\t\t\t{line.file}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\tsummary && (\n\t\t\t\t\t\t\t<div className=\"bg-card/60 border border-border rounded-lg p-3 text-muted-foreground\">\n\t\t\t\t\t\t\t\t{summary}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",
86
+ "import { GitBranch } from 'lucide-react';\nimport type { RendererProps } from './types';\nimport { DiffView } from './DiffView';\nimport { formatDuration, isToolError, getErrorMessage } from './utils';\nimport { ToolErrorDisplay } from './ToolErrorDisplay';\nimport {\n\tToolHeader,\n\tToolHeaderSeparator,\n\tToolHeaderDetail,\n\tToolHeaderMeta,\n\tToolHeaderSuccess,\n\tToolHeaderError,\n\tToolContentBox,\n} from './shared';\n\nexport function GitDiffRenderer({\n\tcontentJson,\n\ttoolDurationMs,\n\tisExpanded,\n\tonToggle,\n}: RendererProps) {\n\tconst result = contentJson.result || {};\n\tconst args = contentJson.args || {};\n\tconst patch = String(result.patch || result.diff || '');\n\tconst all = args.all || result.all;\n\tconst timeStr = formatDuration(toolDurationMs);\n\n\tconst hasError = isToolError(result) || !!contentJson.error;\n\tconst errorMessage =\n\t\tgetErrorMessage(result) ||\n\t\t(typeof contentJson.error === 'string' ? contentJson.error : null);\n\tconst errorStack =\n\t\tresult && typeof result === 'object' && 'stack' in result\n\t\t\t? String(result.stack)\n\t\t\t: undefined;\n\n\tconst lines = patch.split('\\n');\n\tlet files = 0;\n\tlet additions = 0;\n\tlet deletions = 0;\n\tfor (const line of lines) {\n\t\tif (line.startsWith('diff --git')) files += 1;\n\t\telse if (line.startsWith('+') && !line.startsWith('+++')) additions += 1;\n\t\telse if (line.startsWith('-') && !line.startsWith('---')) deletions += 1;\n\t}\n\n\tconst hasChanges = files > 0;\n\n\treturn (\n\t\t<div className=\"text-xs\">\n\t\t\t<ToolHeader\n\t\t\t\ttoolName=\"git diff\"\n\t\t\t\tisExpanded={isExpanded}\n\t\t\t\tonToggle={onToggle}\n\t\t\t\tisError={hasError}\n\t\t\t\tcolorVariant=\"purple\"\n\t\t\t\tcanExpand={true}\n\t\t\t>\n\t\t\t\t{all && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<span className=\"text-muted-foreground/60\">(all)</span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t{hasChanges ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ToolHeaderDetail>\n\t\t\t\t\t\t\t{files} {files === 1 ? 'file' : 'files'}\n\t\t\t\t\t\t</ToolHeaderDetail>\n\t\t\t\t\t\t{additions > 0 && (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t\t\t<ToolHeaderSuccess>+{additions}</ToolHeaderSuccess>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{deletions > 0 && (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t\t\t<ToolHeaderError>-{deletions}</ToolHeaderError>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</>\n\t\t\t\t) : (\n\t\t\t\t\t<span className=\"text-muted-foreground/60\">no changes</span>\n\t\t\t\t)}\n\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t<ToolHeaderMeta>{timeStr}</ToolHeaderMeta>\n\t\t\t</ToolHeader>\n\n\t\t\t{isExpanded && hasError && errorMessage && (\n\t\t\t\t<ToolErrorDisplay error={errorMessage} stack={errorStack} showStack />\n\t\t\t)}\n\n\t\t\t{isExpanded && !hasError && (\n\t\t\t\t<div className=\"mt-2 ml-5 flex flex-col gap-2 max-w-full\">\n\t\t\t\t\t<ToolContentBox\n\t\t\t\t\t\ttitle=\"options\"\n\t\t\t\t\t\ticon={<GitBranch className=\"h-3 w-3\" />}\n\t\t\t\t\t\tmaxHeight=\"\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"px-3 py-2 font-mono text-xs bg-muted/10\">\n\t\t\t\t\t\t\t{all ? 'git diff (all working tree)' : 'git diff (staged only)'}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</ToolContentBox>\n\n\t\t\t\t\t{patch && <DiffView patch={patch} />}\n\n\t\t\t\t\t{!patch && (\n\t\t\t\t\t\t<ToolContentBox title=\"diff\" maxHeight=\"\">\n\t\t\t\t\t\t\t<div className=\"px-3 py-2 text-muted-foreground/60 italic\">\n\t\t\t\t\t\t\t\tNo changes to show\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</ToolContentBox>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",
87
+ "import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport {\n\tprism,\n\tvscDarkPlus,\n} from 'react-syntax-highlighter/dist/esm/styles/prism';\nimport type { RendererProps } from './types';\nimport { formatDuration } from './utils';\n\nexport function GitCommitRenderer({\n\tcontentJson,\n\ttoolDurationMs,\n}: RendererProps) {\n\tconst result = contentJson.result || {};\n\tconst message = String(result.message || '');\n\tconst timeStr = formatDuration(toolDurationMs);\n\tconst syntaxTheme = document?.documentElement.classList.contains('dark')\n\t\t? vscDarkPlus\n\t\t: prism;\n\n\treturn (\n\t\t<div className=\"text-xs space-y-2\">\n\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t<span className=\"font-medium text-emerald-700 dark:text-emerald-300\">\n\t\t\t\t\tgit commit\n\t\t\t\t</span>\n\t\t\t\t<span className=\"text-muted-foreground/70\">·</span>\n\t\t\t\t<span className=\"text-muted-foreground/80\">{timeStr}</span>\n\t\t\t</div>\n\t\t\t{message && (\n\t\t\t\t<div className=\"bg-card/60 border border-border rounded-lg overflow-hidden max-w-full\">\n\t\t\t\t\t<div className=\"overflow-x-auto max-w-full\">\n\t\t\t\t\t\t<SyntaxHighlighter\n\t\t\t\t\t\t\tlanguage=\"bash\"\n\t\t\t\t\t\t\tstyle={syntaxTheme}\n\t\t\t\t\t\t\tcustomStyle={{\n\t\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\t\tpadding: '0.75rem',\n\t\t\t\t\t\t\t\tfontSize: '0.75rem',\n\t\t\t\t\t\t\t\tlineHeight: '1.5',\n\t\t\t\t\t\t\t\tbackground: 'transparent',\n\t\t\t\t\t\t\t\tmaxWidth: '100%',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\twrapLines\n\t\t\t\t\t\t\twrapLongLines\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{message}\n\t\t\t\t\t\t</SyntaxHighlighter>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",
88
+ "import { ChevronRight } from 'lucide-react';\nimport type { RendererProps } from './types';\nimport { DiffView } from './DiffView';\nimport { formatDuration } from './utils';\nimport { ToolErrorDisplay } from './ToolErrorDisplay';\n\ninterface ApplyPatchChangeHunk {\n\toldStart: number;\n\toldLines: number;\n\tnewStart: number;\n\tnewLines: number;\n\tadditions: number;\n\tdeletions: number;\n\tcontext?: string;\n}\n\ninterface ApplyPatchChange {\n\tfilePath: string;\n\tkind: string;\n\thunks: ApplyPatchChangeHunk[];\n}\n\nexport function ApplyPatchRenderer({\n\tcontentJson,\n\ttoolDurationMs,\n\tisExpanded,\n\tonToggle,\n}: RendererProps) {\n\tconst artifact = contentJson.artifact;\n\tconst timeStr = formatDuration(toolDurationMs);\n\n\tconst formatSpan = (start: number, count: number) => {\n\t\tif (count <= 1) return `${start}`;\n\t\treturn `${start}-${start + count - 1}`;\n\t};\n\n\tconst formatHunkLabel = (hunk: ApplyPatchChangeHunk) => {\n\t\tconst left = `-${formatSpan(hunk.oldStart, hunk.oldLines)}`;\n\t\tconst right = `+${formatSpan(hunk.newStart, hunk.newLines)}`;\n\t\tconst deltaParts: string[] = [];\n\t\tif (hunk.additions > 0) deltaParts.push(`+${hunk.additions}`);\n\t\tif (hunk.deletions > 0) deltaParts.push(`-${hunk.deletions}`);\n\t\tconst delta = deltaParts.length > 0 ? ` (${deltaParts.join(', ')})` : '';\n\t\treturn `${left} ${right}${delta}`;\n\t};\n\tconst summary = artifact?.summary || {};\n\tconst files = Number(summary.files || 0);\n\tconst additions = Number(summary.additions || 0);\n\tconst deletions = Number(summary.deletions || 0);\n\tconst patch = artifact?.patch ? String(artifact.patch) : '';\n\n\tconst changes = Array.isArray(contentJson.result?.changes)\n\t\t? (contentJson.result?.changes as ApplyPatchChange[])\n\t\t: [];\n\n\tconst singleFilePath =\n\t\tfiles === 1 && changes.length > 0 ? changes[0].filePath : null;\n\n\tconst hasError =\n\t\tcontentJson.error ||\n\t\t(contentJson.result &&\n\t\t\t'ok' in contentJson.result &&\n\t\t\tcontentJson.result.ok === false);\n\tconst errorMessage =\n\t\ttypeof contentJson.error === 'string'\n\t\t\t? contentJson.error\n\t\t\t: contentJson.result &&\n\t\t\t\t\t'error' in contentJson.result &&\n\t\t\t\t\ttypeof contentJson.result.error === 'string'\n\t\t\t\t? contentJson.result.error\n\t\t\t\t: null;\n\tconst errorStack =\n\t\tcontentJson.result &&\n\t\ttypeof contentJson.result === 'object' &&\n\t\t'stack' in contentJson.result &&\n\t\ttypeof contentJson.result.stack === 'string'\n\t\t\t? contentJson.result.stack\n\t\t\t: undefined;\n\n\treturn (\n\t\t<div className=\"text-xs\">\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={onToggle}\n\t\t\t\tclassName={`flex items-center gap-2 transition-colors w-full ${\n\t\t\t\t\thasError\n\t\t\t\t\t\t? 'text-red-700 dark:text-red-300 hover:text-red-600 dark:hover:text-red-200'\n\t\t\t\t\t\t: 'text-purple-700 dark:text-purple-300 hover:text-purple-600 dark:hover:text-purple-200'\n\t\t\t\t}`}\n\t\t\t>\n\t\t\t\t<ChevronRight\n\t\t\t\t\tclassName={`h-3 w-3 flex-shrink-0 transition-transform ${isExpanded ? 'rotate-90' : ''}`}\n\t\t\t\t/>\n\t\t\t\t<span className=\"font-medium flex-shrink-0\">\n\t\t\t\t\tapply patch{hasError ? ' error' : ''}\n\t\t\t\t</span>\n\t\t\t\t<span className=\"text-muted-foreground/70 flex-shrink-0\">·</span>\n\t\t\t\t{singleFilePath ? (\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName=\"text-foreground/70 min-w-0 flex-shrink overflow-hidden text-ellipsis whitespace-nowrap\"\n\t\t\t\t\t\tdir=\"rtl\"\n\t\t\t\t\t\ttitle={singleFilePath}\n\t\t\t\t\t>\n\t\t\t\t\t\t{`\\u2066${singleFilePath}\\u2069`}\n\t\t\t\t\t</span>\n\t\t\t\t) : (\n\t\t\t\t\t<span className=\"text-foreground/70 flex-shrink-0\">\n\t\t\t\t\t\t{files} {files === 1 ? 'file' : 'files'}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t<span className=\"text-emerald-600 dark:text-emerald-400 flex-shrink-0\">\n\t\t\t\t\t+{additions}\n\t\t\t\t</span>\n\t\t\t\t<span className=\"text-red-600 dark:text-red-400 flex-shrink-0\">\n\t\t\t\t\t-{deletions}\n\t\t\t\t</span>\n\t\t\t\t<span className=\"text-muted-foreground/80 flex-shrink-0\">\n\t\t\t\t\t· {timeStr}\n\t\t\t\t</span>\n\t\t\t</button>\n\t\t\t{isExpanded && hasError && errorMessage && (\n\t\t\t\t<div>\n\t\t\t\t\t<ToolErrorDisplay error={errorMessage} stack={errorStack} showStack />\n\t\t\t\t\t{patch && (\n\t\t\t\t\t\t<div className=\"mt-2 ml-5\">\n\t\t\t\t\t\t\t<details>\n\t\t\t\t\t\t\t\t<summary className=\"cursor-pointer text-xs text-red-700 dark:text-red-300 hover:text-red-600 dark:hover:text-red-200\">\n\t\t\t\t\t\t\t\t\tShow patch that failed\n\t\t\t\t\t\t\t\t</summary>\n\t\t\t\t\t\t\t\t<div className=\"mt-2\">\n\t\t\t\t\t\t\t\t\t<DiffView patch={patch} />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</details>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{isExpanded && !hasError && changes.length > 0 && (\n\t\t\t\t<div className=\"mt-2 ml-5 space-y-2\">\n\t\t\t\t\t{changes.map((change) => (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={`apply-patch-${change.filePath}-${change.kind}`}\n\t\t\t\t\t\t\tclassName=\"space-y-1\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"font-mono text-foreground/80\">\n\t\t\t\t\t\t\t\t{change.filePath}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"flex flex-wrap gap-2\">\n\t\t\t\t\t\t\t\t{change.hunks.map((hunk, index) => (\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tkey={`apply-patch-${change.filePath}-hunk-${index}`}\n\t\t\t\t\t\t\t\t\t\tclassName=\"rounded bg-muted px-2 py-0.5 text-[0.65rem] font-mono text-muted-foreground\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{formatHunkLabel(hunk)}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{isExpanded && !hasError && patch && (\n\t\t\t\t<div className=\"mt-2 ml-5\">\n\t\t\t\t\t<DiffView patch={patch} />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",
89
+ "import { File, Folder, FolderOpen } from 'lucide-react';\nimport type { RendererProps } from './types';\nimport { formatDuration, isToolError, getErrorMessage } from './utils';\nimport {\n\tToolHeader,\n\tToolHeaderSeparator,\n\tToolHeaderDetail,\n\tToolHeaderMeta,\n\tToolContentBox,\n} from './shared';\nimport { ToolErrorDisplay } from './ToolErrorDisplay';\n\nexport function ListRenderer({\n\tcontentJson,\n\ttoolDurationMs,\n\tisExpanded,\n\tonToggle,\n}: RendererProps) {\n\tconst result = contentJson.result || {};\n\tconst args = (contentJson.args || {}) as Record<string, unknown>;\n\tconst hasError = isToolError(result);\n\tconst errorMessage = getErrorMessage(result);\n\tconst errorStack =\n\t\tresult && typeof result === 'object' && 'stack' in result\n\t\t\t? String(result.stack)\n\t\t\t: undefined;\n\tconst entries = (result.entries as Array<unknown>) || [];\n\tconst timeStr = formatDuration(toolDurationMs);\n\n\tconst path = typeof args.path === 'string' ? args.path : '.';\n\n\treturn (\n\t\t<div className=\"text-xs\">\n\t\t\t<ToolHeader\n\t\t\t\ttoolName=\"ls\"\n\t\t\t\tisExpanded={isExpanded}\n\t\t\t\tonToggle={onToggle}\n\t\t\t\tisError={hasError}\n\t\t\t\tcolorVariant=\"cyan\"\n\t\t\t\tcanExpand={true}\n\t\t\t>\n\t\t\t\t{path && path !== '.' && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<span className=\"text-foreground/70 truncate min-w-0\" title={path}>\n\t\t\t\t\t\t\t{path.length > 30 ? `…${path.slice(-30)}` : path}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t<ToolHeaderDetail>\n\t\t\t\t\t{entries.length} {entries.length === 1 ? 'entry' : 'entries'}\n\t\t\t\t</ToolHeaderDetail>\n\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t<ToolHeaderMeta>{timeStr}</ToolHeaderMeta>\n\t\t\t</ToolHeader>\n\n\t\t\t{isExpanded && hasError && errorMessage && (\n\t\t\t\t<ToolErrorDisplay error={errorMessage} stack={errorStack} showStack />\n\t\t\t)}\n\n\t\t\t{isExpanded && !hasError && (\n\t\t\t\t<div className=\"mt-2 ml-5 flex flex-col gap-2 max-w-full\">\n\t\t\t\t\t<ToolContentBox\n\t\t\t\t\t\ttitle=\"path\"\n\t\t\t\t\t\ticon={<FolderOpen className=\"h-3 w-3\" />}\n\t\t\t\t\t\tcopyText={path}\n\t\t\t\t\t\tmaxHeight=\"\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"px-3 py-2 font-mono text-xs bg-muted/10 break-all\">\n\t\t\t\t\t\t\t{path}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</ToolContentBox>\n\n\t\t\t\t\t{entries.length > 0 && (\n\t\t\t\t\t\t<ToolContentBox\n\t\t\t\t\t\t\ttitle=\"entries\"\n\t\t\t\t\t\t\tcopyText={entries\n\t\t\t\t\t\t\t\t.map((e) => {\n\t\t\t\t\t\t\t\t\tconst entry = e as { name?: string };\n\t\t\t\t\t\t\t\t\treturn entry.name || '';\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.join('\\n')}\n\t\t\t\t\t\t\tmaxHeight=\"max-h-80\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"divide-y divide-border/50\">\n\t\t\t\t\t\t\t\t{entries.map((entry, i) => {\n\t\t\t\t\t\t\t\t\tconst e = entry as {\n\t\t\t\t\t\t\t\t\t\tname?: string;\n\t\t\t\t\t\t\t\t\t\ttype?: string;\n\t\t\t\t\t\t\t\t\t\tisDirectory?: boolean;\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\tconst isDir = e.type === 'dir' || e.isDirectory;\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tkey={`${e.name}-${i}`}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 px-3 py-1 font-mono text-foreground/80 hover:bg-muted/20\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{isDir ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<Folder className=\"h-3 w-3 text-blue-500 flex-shrink-0\" />\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t<File className=\"h-3 w-3 text-muted-foreground flex-shrink-0\" />\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"truncate\">{e.name}</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</ToolContentBox>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{entries.length === 0 && (\n\t\t\t\t\t\t<ToolContentBox title=\"entries\" maxHeight=\"\">\n\t\t\t\t\t\t\t<div className=\"px-3 py-2 text-muted-foreground/60 italic\">\n\t\t\t\t\t\t\t\tDirectory is empty\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</ToolContentBox>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",
90
+ "import { FolderTree } from 'lucide-react';\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport {\n\tprism,\n\tvscDarkPlus,\n} from 'react-syntax-highlighter/dist/esm/styles/prism';\nimport type { RendererProps } from './types';\nimport { formatDuration, isToolError, getErrorMessage } from './utils';\nimport {\n\tToolHeader,\n\tToolHeaderSeparator,\n\tToolHeaderDetail,\n\tToolHeaderMeta,\n\tToolContentBox,\n} from './shared';\nimport { ToolErrorDisplay } from './ToolErrorDisplay';\n\nexport function TreeRenderer({\n\tcontentJson,\n\ttoolDurationMs,\n\tisExpanded,\n\tonToggle,\n}: RendererProps) {\n\tconst result = contentJson.result || {};\n\tconst args = (contentJson.args || {}) as Record<string, unknown>;\n\tconst hasError = isToolError(result);\n\tconst errorMessage = getErrorMessage(result);\n\tconst errorStack =\n\t\tresult && typeof result === 'object' && 'stack' in result\n\t\t\t? String(result.stack)\n\t\t\t: undefined;\n\tconst tree = String(result.tree || '');\n\tconst lines = tree.split('\\n').filter((l) => l.length > 0).length;\n\tconst timeStr = formatDuration(toolDurationMs);\n\tconst syntaxTheme = document?.documentElement.classList.contains('dark')\n\t\t? vscDarkPlus\n\t\t: prism;\n\n\tconst path = typeof args.path === 'string' ? args.path : '.';\n\tconst depth = typeof args.depth === 'number' ? args.depth : undefined;\n\n\treturn (\n\t\t<div className=\"text-xs\">\n\t\t\t<ToolHeader\n\t\t\t\ttoolName=\"tree\"\n\t\t\t\tisExpanded={isExpanded}\n\t\t\t\tonToggle={onToggle}\n\t\t\t\tisError={hasError}\n\t\t\t\tcolorVariant=\"cyan\"\n\t\t\t\tcanExpand={true}\n\t\t\t>\n\t\t\t\t{path && path !== '.' && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<span className=\"text-foreground/70 truncate min-w-0\" title={path}>\n\t\t\t\t\t\t\t{path.length > 30 ? `…${path.slice(-30)}` : path}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t<ToolHeaderDetail>\n\t\t\t\t\t{lines} {lines === 1 ? 'item' : 'items'}\n\t\t\t\t</ToolHeaderDetail>\n\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t<ToolHeaderMeta>{timeStr}</ToolHeaderMeta>\n\t\t\t</ToolHeader>\n\n\t\t\t{isExpanded && hasError && errorMessage && (\n\t\t\t\t<ToolErrorDisplay error={errorMessage} stack={errorStack} showStack />\n\t\t\t)}\n\n\t\t\t{isExpanded && !hasError && (\n\t\t\t\t<div className=\"mt-2 ml-5 flex flex-col gap-2 max-w-full\">\n\t\t\t\t\t<ToolContentBox\n\t\t\t\t\t\ttitle=\"path\"\n\t\t\t\t\t\ticon={<FolderTree className=\"h-3 w-3\" />}\n\t\t\t\t\t\tsubtitle={depth ? `depth: ${depth}` : undefined}\n\t\t\t\t\t\tcopyText={path}\n\t\t\t\t\t\tmaxHeight=\"\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"px-3 py-2 font-mono text-xs bg-muted/10 break-all\">\n\t\t\t\t\t\t\t{path}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</ToolContentBox>\n\n\t\t\t\t\t{tree && (\n\t\t\t\t\t\t<ToolContentBox title=\"tree\" copyText={tree} maxHeight=\"max-h-80\">\n\t\t\t\t\t\t\t<div className=\"overflow-x-auto max-w-full\">\n\t\t\t\t\t\t\t\t<SyntaxHighlighter\n\t\t\t\t\t\t\t\t\tlanguage=\"bash\"\n\t\t\t\t\t\t\t\t\tstyle={syntaxTheme}\n\t\t\t\t\t\t\t\t\tcustomStyle={{\n\t\t\t\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\t\t\t\tpadding: '0.75rem',\n\t\t\t\t\t\t\t\t\t\tfontSize: '0.75rem',\n\t\t\t\t\t\t\t\t\t\tlineHeight: '1.5',\n\t\t\t\t\t\t\t\t\t\tbackground: 'transparent',\n\t\t\t\t\t\t\t\t\t\tmaxWidth: '100%',\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\twrapLines\n\t\t\t\t\t\t\t\t\twrapLongLines\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{tree}\n\t\t\t\t\t\t\t\t</SyntaxHighlighter>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</ToolContentBox>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{!tree && (\n\t\t\t\t\t\t<ToolContentBox title=\"tree\" maxHeight=\"\">\n\t\t\t\t\t\t\t<div className=\"px-3 py-2 text-muted-foreground/60 italic\">\n\t\t\t\t\t\t\t\tNo tree output\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</ToolContentBox>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",
91
+ "import { Search } from 'lucide-react';\nimport type { RendererProps } from './types';\nimport { formatDuration, isToolError, getErrorMessage } from './utils';\nimport { ToolErrorDisplay } from './ToolErrorDisplay';\nimport {\n\tToolHeader,\n\tToolHeaderSeparator,\n\tToolHeaderDetail,\n\tToolHeaderMeta,\n\tToolContentBox,\n} from './shared';\n\nexport function SearchRenderer({\n\tcontentJson,\n\ttoolDurationMs,\n\tisExpanded,\n\tonToggle,\n\tcompact,\n}: RendererProps) {\n\tconst result = contentJson.result || {};\n\tconst args = (contentJson.args || {}) as Record<string, unknown>;\n\tconst matches = (result.matches as Array<unknown>) || [];\n\tconst files = (result.files as Array<unknown>) || [];\n\tconst timeStr = formatDuration(toolDurationMs);\n\n\tconst hasError = isToolError(result) || !!contentJson.error;\n\tconst errorMessage =\n\t\tgetErrorMessage(result) ||\n\t\t(typeof contentJson.error === 'string' ? contentJson.error : null);\n\tconst errorStack =\n\t\tresult && typeof result === 'object' && 'stack' in result\n\t\t\t? String(result.stack)\n\t\t\t: undefined;\n\n\tconst itemCount = matches.length > 0 ? matches.length : files.length;\n\tconst itemLabel =\n\t\tmatches.length > 0\n\t\t\t? matches.length === 1\n\t\t\t\t? 'match'\n\t\t\t\t: 'matches'\n\t\t\t: files.length === 1\n\t\t\t\t? 'file'\n\t\t\t\t: 'files';\n\n\tconst searchTerm = (() => {\n\t\tif (typeof args.pattern === 'string') return args.pattern;\n\t\tif (typeof args.query === 'string') return args.query;\n\t\tif (typeof args.filePattern === 'string') return args.filePattern;\n\t\treturn '';\n\t})();\n\n\tconst searchPath = (() => {\n\t\tif (typeof args.path === 'string' && args.path !== '.') return args.path;\n\t\treturn undefined;\n\t})();\n\n\treturn (\n\t\t<div className=\"text-xs\">\n\t\t\t<ToolHeader\n\t\t\t\ttoolName=\"search\"\n\t\t\t\tisExpanded={isExpanded}\n\t\t\t\tonToggle={onToggle}\n\t\t\t\tisError={hasError}\n\t\t\t\tcolorVariant=\"amber\"\n\t\t\t\tcanExpand={true}\n\t\t\t>\n\t\t\t\t{searchTerm && !compact && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName=\"font-mono text-foreground/90 text-[11px] truncate min-w-0\"\n\t\t\t\t\t\t\ttitle={searchTerm}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t\t{searchTerm.length > 30\n\t\t\t\t\t\t\t\t? `${searchTerm.slice(0, 30)}…`\n\t\t\t\t\t\t\t\t: searchTerm}\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{!compact && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<ToolHeaderDetail>\n\t\t\t\t\t\t\t{itemCount} {itemLabel}\n\t\t\t\t\t\t</ToolHeaderDetail>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<ToolHeaderMeta>{timeStr}</ToolHeaderMeta>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</ToolHeader>\n\n\t\t\t{isExpanded && hasError && errorMessage && (\n\t\t\t\t<ToolErrorDisplay error={errorMessage} stack={errorStack} showStack />\n\t\t\t)}\n\n\t\t\t{isExpanded && !hasError && (\n\t\t\t\t<div className=\"mt-2 ml-5 flex flex-col gap-2 max-w-full\">\n\t\t\t\t\t<ToolContentBox\n\t\t\t\t\t\ttitle=\"query\"\n\t\t\t\t\t\ticon={<Search className=\"h-3 w-3\" />}\n\t\t\t\t\t\tsubtitle={searchPath}\n\t\t\t\t\t\tcopyText={searchTerm}\n\t\t\t\t\t\tmaxHeight=\"\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"px-3 py-2 font-mono text-xs bg-muted/10 break-all\">\n\t\t\t\t\t\t\t{searchTerm || '(empty)'}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</ToolContentBox>\n\n\t\t\t\t\t{matches.length > 0 && (\n\t\t\t\t\t\t<ToolContentBox\n\t\t\t\t\t\t\ttitle=\"results\"\n\t\t\t\t\t\t\tcopyText={matches\n\t\t\t\t\t\t\t\t.map((m) => {\n\t\t\t\t\t\t\t\t\tconst match = m as {\n\t\t\t\t\t\t\t\t\t\tfile?: string;\n\t\t\t\t\t\t\t\t\t\tline?: number;\n\t\t\t\t\t\t\t\t\t\ttext?: string;\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\treturn `${match.file}:${match.line}: ${match.text}`;\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.join('\\n')}\n\t\t\t\t\t\t\tmaxHeight=\"max-h-80\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"divide-y divide-border/50\">\n\t\t\t\t\t\t\t\t{matches.map((match, i) => {\n\t\t\t\t\t\t\t\t\tconst m = match as {\n\t\t\t\t\t\t\t\t\t\tfile?: string;\n\t\t\t\t\t\t\t\t\t\tline?: number;\n\t\t\t\t\t\t\t\t\t\ttext?: string;\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tkey={`${m.file}-${m.line}-${i}`}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"px-3 py-1.5 font-mono hover:bg-muted/20\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"text-blue-600 dark:text-blue-400 truncate\">\n\t\t\t\t\t\t\t\t\t\t\t\t{m.file}:{m.line}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"text-foreground/80 truncate\">\n\t\t\t\t\t\t\t\t\t\t\t\t{m.text}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</ToolContentBox>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{files.length > 0 && matches.length === 0 && (\n\t\t\t\t\t\t<ToolContentBox\n\t\t\t\t\t\t\ttitle=\"files\"\n\t\t\t\t\t\t\tcopyText={files.map(String).join('\\n')}\n\t\t\t\t\t\t\tmaxHeight=\"max-h-80\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"divide-y divide-border/50\">\n\t\t\t\t\t\t\t\t{files.map((file) => (\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tkey={String(file)}\n\t\t\t\t\t\t\t\t\t\tclassName=\"px-3 py-1 font-mono text-foreground/80 truncate hover:bg-muted/20\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{String(file)}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</ToolContentBox>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{itemCount === 0 && (\n\t\t\t\t\t\t<ToolContentBox title=\"results\" maxHeight=\"\">\n\t\t\t\t\t\t\t<div className=\"px-3 py-2 text-muted-foreground/60 italic\">\n\t\t\t\t\t\t\t\tNo results found\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</ToolContentBox>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",
92
+ "import type { RendererProps } from './types';\nimport { formatDuration } from './utils';\n\nexport function FinishRenderer({ toolDurationMs }: RendererProps) {\n\tconst timeStr = formatDuration(toolDurationMs);\n\n\treturn (\n\t\t<div className=\"text-xs\">\n\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t<span className=\"font-medium text-emerald-700 dark:text-emerald-300\">\n\t\t\t\t\tDone\n\t\t\t\t</span>\n\t\t\t\t{timeStr && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<span className=\"text-muted-foreground/70\">·</span>\n\t\t\t\t\t\t<span className=\"text-muted-foreground/80\">{timeStr}</span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n",
93
+ "import { ChevronRight, AlertCircle } from 'lucide-react';\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport {\n\tprism,\n\tvscDarkPlus,\n} from 'react-syntax-highlighter/dist/esm/styles/prism';\nimport type { GenericRendererProps } from './types';\nimport { formatDuration } from './utils';\nimport { ToolErrorDisplay } from './ToolErrorDisplay';\nimport { ImagePreview } from './shared';\n\nexport function GenericRenderer({\n\ttoolName,\n\tcontentJson,\n\ttoolDurationMs,\n\tisExpanded,\n\tonToggle,\n\tcompact,\n}: GenericRendererProps) {\n\tconst result = contentJson.result;\n\tconst timeStr = formatDuration(toolDurationMs);\n\tconst images = Array.isArray(result?.images)\n\t\t? (result.images as Array<{ data: string; mimeType: string }>)\n\t\t: [];\n\tconst hasImages = images.length > 0;\n\tconst hasResult = result && (Object.keys(result).length > 0 || hasImages);\n\tconst syntaxTheme = document?.documentElement.classList.contains('dark')\n\t\t? vscDarkPlus\n\t\t: prism;\n\n\t// Check for errors\n\tconst hasError =\n\t\tcontentJson.error ||\n\t\t(result &&\n\t\t\ttypeof result === 'object' &&\n\t\t\t'ok' in result &&\n\t\t\tresult.ok === false);\n\tconst errorMessage =\n\t\ttypeof contentJson.error === 'string'\n\t\t\t? contentJson.error\n\t\t\t: result &&\n\t\t\t\t\ttypeof result === 'object' &&\n\t\t\t\t\t'error' in result &&\n\t\t\t\t\ttypeof result.error === 'string'\n\t\t\t\t? result.error\n\t\t\t\t: null;\n\tconst errorStack =\n\t\tresult &&\n\t\ttypeof result === 'object' &&\n\t\t'stack' in result &&\n\t\ttypeof result.stack === 'string'\n\t\t\t? result.stack\n\t\t\t: undefined;\n\n\treturn (\n\t\t<div className=\"text-xs\">\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={onToggle}\n\t\t\t\tclassName={`flex items-center gap-2 transition-colors w-full ${\n\t\t\t\t\thasError\n\t\t\t\t\t\t? 'text-red-700 dark:text-red-300 hover:text-red-600 dark:hover:text-red-200'\n\t\t\t\t\t\t: 'text-foreground hover:text-foreground/80'\n\t\t\t\t}`}\n\t\t\t>\n\t\t\t\t<ChevronRight\n\t\t\t\t\tclassName={`h-3 w-3 flex-shrink-0 transition-transform ${isExpanded ? 'rotate-90' : ''}`}\n\t\t\t\t/>\n\t\t\t\t{hasError && (\n\t\t\t\t\t<AlertCircle className=\"h-3 w-3 flex-shrink-0 text-red-600 dark:text-red-400\" />\n\t\t\t\t)}\n\t\t\t\t<span className=\"font-medium flex-shrink-0\">\n\t\t\t\t\t{toolName}\n\t\t\t\t\t{hasError ? ' error' : ''}\n\t\t\t\t</span>\n\t\t\t\t{!compact && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<span className=\"text-muted-foreground/70 flex-shrink-0\">·</span>\n\t\t\t\t\t\t<span className=\"text-muted-foreground/80 flex-shrink-0\">\n\t\t\t\t\t\t\t{timeStr}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</button>\n\t\t\t{isExpanded && hasError && errorMessage && (\n\t\t\t\t<ToolErrorDisplay error={errorMessage} stack={errorStack} showStack />\n\t\t\t)}\n\t\t\t{isExpanded && !hasError && hasResult && (\n\t\t\t\t<div className=\"mt-2 ml-5\">\n\t\t\t\t\t{hasImages && <ImagePreview images={images} />}\n\t\t\t\t\t{!hasImages && (\n\t\t\t\t\t\t<div className=\"bg-card/60 border border-border rounded-lg overflow-hidden max-h-96 overflow-y-auto max-w-full\">\n\t\t\t\t\t\t\t<div className=\"overflow-x-auto max-w-full\">\n\t\t\t\t\t\t\t\t<SyntaxHighlighter\n\t\t\t\t\t\t\t\t\tlanguage=\"json\"\n\t\t\t\t\t\t\t\t\tstyle={syntaxTheme}\n\t\t\t\t\t\t\t\t\tcustomStyle={{\n\t\t\t\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\t\t\t\tpadding: '0.75rem',\n\t\t\t\t\t\t\t\t\t\tfontSize: '0.75rem',\n\t\t\t\t\t\t\t\t\t\tlineHeight: '1.5',\n\t\t\t\t\t\t\t\t\t\tbackground: 'transparent',\n\t\t\t\t\t\t\t\t\t\tmaxWidth: '100%',\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\twrapLines\n\t\t\t\t\t\t\t\t\twrapLongLines\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{JSON.stringify(result, null, 2)}\n\t\t\t\t\t\t\t\t</SyntaxHighlighter>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",
94
+ "import type { RendererProps } from './types';\n\nexport function DebugRenderer({\n\tcontentJson,\n\ttoolDurationMs,\n}: RendererProps & { toolName: string }) {\n\treturn (\n\t\t<div className=\"text-xs\">\n\t\t\t<div className=\"text-muted-foreground\">\n\t\t\t\t<div>Tool: {contentJson.name}</div>\n\t\t\t\t<div>Duration: {toolDurationMs}ms</div>\n\t\t\t\t<pre className=\"mt-2 text-[10px] bg-card border border-border p-2 rounded overflow-x-auto\">\n\t\t\t\t\t{JSON.stringify(contentJson, null, 2)}\n\t\t\t\t</pre>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n",
95
+ "import { CheckCircle2, Circle, ArrowRight, XCircle } from 'lucide-react';\nimport type { RendererProps } from './types';\n\ninterface TodoItem {\n\tstep: string;\n\tstatus: 'pending' | 'in_progress' | 'completed' | 'cancelled';\n}\n\ninterface TodosResult {\n\titems?: TodoItem[];\n\tnote?: string;\n}\n\nexport function TodosRenderer({ contentJson }: RendererProps) {\n\tconst result = (contentJson.result || {}) as TodosResult;\n\tconst items = result.items || [];\n\tconst note = result.note;\n\n\treturn (\n\t\t<div className=\"text-xs\">\n\t\t\t<div className=\"bg-blue-500/10 border border-blue-500/30 dark:bg-blue-500/5 dark:border-blue-500/20 rounded-lg p-3 space-y-2\">\n\t\t\t\t{note && (\n\t\t\t\t\t<div className=\"text-blue-700 dark:text-blue-300 text-sm font-medium mb-3\">\n\t\t\t\t\t\t{note}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t<div className=\"space-y-1.5\">\n\t\t\t\t\t{items.map((item, idx) => (\n\t\t\t\t\t\t<div key={`${item.step}-${idx}`} className=\"flex items-start gap-2\">\n\t\t\t\t\t\t\t{item.status === 'completed' && (\n\t\t\t\t\t\t\t\t<CheckCircle2 className=\"h-4 w-4 text-emerald-600 dark:text-emerald-300 flex-shrink-0 mt-0.5\" />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{item.status === 'in_progress' && (\n\t\t\t\t\t\t\t\t<ArrowRight className=\"h-4 w-4 text-blue-700 dark:text-blue-300 flex-shrink-0 mt-0.5 animate-pulse\" />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{item.status === 'pending' && (\n\t\t\t\t\t\t\t\t<Circle className=\"h-4 w-4 text-muted-foreground flex-shrink-0 mt-0.5\" />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{item.status === 'cancelled' && (\n\t\t\t\t\t\t\t\t<XCircle className=\"h-4 w-4 text-muted-foreground/50 flex-shrink-0 mt-0.5\" />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={`text-sm ${\n\t\t\t\t\t\t\t\t\titem.status === 'completed'\n\t\t\t\t\t\t\t\t\t\t? 'text-muted-foreground line-through'\n\t\t\t\t\t\t\t\t\t\t: item.status === 'in_progress'\n\t\t\t\t\t\t\t\t\t\t\t? 'text-foreground'\n\t\t\t\t\t\t\t\t\t\t\t: item.status === 'cancelled'\n\t\t\t\t\t\t\t\t\t\t\t\t? 'text-muted-foreground/50 line-through'\n\t\t\t\t\t\t\t\t\t\t\t\t: 'text-muted-foreground/80'\n\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{item.step}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n",
96
+ "import type { RendererProps } from './types';\n\nexport function ProgressUpdateRenderer({ contentJson }: RendererProps) {\n\tconst result = contentJson.result || {};\n\tconst message = String(result.message || 'Processing...');\n\tconst stage = result.stage ? String(result.stage) : undefined;\n\tconst pct = result.pct ? Number(result.pct) : undefined;\n\n\treturn (\n\t\t<div className=\"flex items-center gap-2 text-sm text-violet-700 dark:text-violet-300 animate-pulse\">\n\t\t\t{stage && <span className=\"text-muted-foreground/80\">[{stage}]</span>}\n\t\t\t<span>{message}</span>\n\t\t\t{pct !== undefined && (\n\t\t\t\t<span className=\"text-muted-foreground/80\">({pct}%)</span>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",
97
+ "import { Globe, ExternalLink, Link } from 'lucide-react';\nimport type { RendererProps } from './types';\nimport { formatDuration, isToolError, getErrorMessage } from './utils';\nimport { ToolErrorDisplay } from './ToolErrorDisplay';\nimport {\n\tToolHeader,\n\tToolHeaderSeparator,\n\tToolHeaderDetail,\n\tToolHeaderMeta,\n\tToolContentBox,\n} from './shared';\n\ninterface SearchResult {\n\ttitle: string;\n\turl: string;\n\tsnippet: string;\n}\n\ninterface WebContent {\n\turl: string;\n\tcontent: string;\n\ttitle?: string;\n}\n\nexport function WebSearchRenderer({\n\tcontentJson,\n\ttoolDurationMs,\n\tisExpanded,\n\tonToggle,\n}: RendererProps) {\n\tconst result = contentJson.result || {};\n\tconst args = (contentJson.args || {}) as Record<string, unknown>;\n\tconst timeStr = formatDuration(toolDurationMs);\n\n\tconst hasError = isToolError(result) || !!contentJson.error;\n\tconst errorMessage =\n\t\tgetErrorMessage(result) ||\n\t\t(typeof contentJson.error === 'string' ? contentJson.error : null);\n\tconst errorStack =\n\t\tresult && typeof result === 'object' && 'stack' in result\n\t\t\t? String(result.stack)\n\t\t\t: undefined;\n\n\tconst isSearch = 'results' in result;\n\tconst searchResults = (result.results as SearchResult[]) || [];\n\tconst webContent = result as WebContent;\n\n\tconst query = typeof args.query === 'string' ? args.query : undefined;\n\tconst url = typeof args.url === 'string' ? args.url : webContent.url;\n\n\tif (isSearch) {\n\t\treturn (\n\t\t\t<div className=\"text-xs\">\n\t\t\t\t<ToolHeader\n\t\t\t\t\ttoolName=\"web search\"\n\t\t\t\t\tisExpanded={isExpanded}\n\t\t\t\t\tonToggle={onToggle}\n\t\t\t\t\tisError={hasError}\n\t\t\t\t\tcolorVariant=\"purple\"\n\t\t\t\t\tcanExpand={true}\n\t\t\t\t>\n\t\t\t\t\t{query && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName=\"font-mono text-foreground/90 text-[11px] truncate min-w-0\"\n\t\t\t\t\t\t\t\ttitle={query}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\"{query.length > 25 ? `${query.slice(0, 25)}…` : query}\"\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t<ToolHeaderDetail>\n\t\t\t\t\t\t{searchResults.length}{' '}\n\t\t\t\t\t\t{searchResults.length === 1 ? 'result' : 'results'}\n\t\t\t\t\t</ToolHeaderDetail>\n\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t<ToolHeaderMeta>{timeStr}</ToolHeaderMeta>\n\t\t\t\t</ToolHeader>\n\n\t\t\t\t{isExpanded && hasError && errorMessage && (\n\t\t\t\t\t<ToolErrorDisplay error={errorMessage} stack={errorStack} showStack />\n\t\t\t\t)}\n\n\t\t\t\t{isExpanded && !hasError && (\n\t\t\t\t\t<div className=\"mt-2 ml-5 flex flex-col gap-2 max-w-full\">\n\t\t\t\t\t\t<ToolContentBox\n\t\t\t\t\t\t\ttitle=\"query\"\n\t\t\t\t\t\t\ticon={<Globe className=\"h-3 w-3\" />}\n\t\t\t\t\t\t\tcopyText={query}\n\t\t\t\t\t\t\tmaxHeight=\"\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"px-3 py-2 font-mono text-xs bg-muted/10 break-all\">\n\t\t\t\t\t\t\t\t{query || '(empty)'}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</ToolContentBox>\n\n\t\t\t\t\t\t{searchResults.length > 0 && (\n\t\t\t\t\t\t\t<ToolContentBox\n\t\t\t\t\t\t\t\ttitle=\"results\"\n\t\t\t\t\t\t\t\tcopyText={searchResults\n\t\t\t\t\t\t\t\t\t.map((r) => `${r.title}\\n${r.url}`)\n\t\t\t\t\t\t\t\t\t.join('\\n\\n')}\n\t\t\t\t\t\t\t\tmaxHeight=\"max-h-80\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div className=\"divide-y divide-border/50\">\n\t\t\t\t\t\t\t\t\t{searchResults.map((item, i) => (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tkey={`${item.url}-${i}`}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"px-3 py-2 hover:bg-muted/20\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\t\t\thref={item.url}\n\t\t\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1 text-blue-600 dark:text-blue-400 hover:underline font-medium\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{item.title}\n\t\t\t\t\t\t\t\t\t\t\t\t<ExternalLink className=\"h-3 w-3 flex-shrink-0\" />\n\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground text-xs mt-0.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t{item.snippet}\n\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground/60 truncate mt-0.5\">\n\t\t\t\t\t\t\t\t\t\t\t\t{item.url}\n\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</ToolContentBox>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{searchResults.length === 0 && (\n\t\t\t\t\t\t\t<ToolContentBox title=\"results\" maxHeight=\"\">\n\t\t\t\t\t\t\t\t<div className=\"px-3 py-2 text-muted-foreground/60 italic\">\n\t\t\t\t\t\t\t\t\tNo results found\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</ToolContentBox>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst displayUrl = url && url.length > 50 ? `${url.slice(0, 50)}...` : url;\n\n\treturn (\n\t\t<div className=\"text-xs\">\n\t\t\t<ToolHeader\n\t\t\t\ttoolName=\"web fetch\"\n\t\t\t\tisExpanded={isExpanded}\n\t\t\t\tonToggle={onToggle}\n\t\t\t\tisError={hasError}\n\t\t\t\tcolorVariant=\"purple\"\n\t\t\t\tcanExpand={true}\n\t\t\t>\n\t\t\t\t{displayUrl && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<span className=\"text-foreground/70 truncate min-w-0\" title={url}>\n\t\t\t\t\t\t\t{displayUrl}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t<ToolHeaderMeta>{timeStr}</ToolHeaderMeta>\n\t\t\t</ToolHeader>\n\n\t\t\t{isExpanded && hasError && errorMessage && (\n\t\t\t\t<ToolErrorDisplay error={errorMessage} stack={errorStack} showStack />\n\t\t\t)}\n\n\t\t\t{isExpanded && !hasError && (\n\t\t\t\t<div className=\"mt-2 ml-5 flex flex-col gap-2 max-w-full\">\n\t\t\t\t\t<ToolContentBox\n\t\t\t\t\t\ttitle=\"url\"\n\t\t\t\t\t\ticon={<Link className=\"h-3 w-3\" />}\n\t\t\t\t\t\tcopyText={url}\n\t\t\t\t\t\tmaxHeight=\"\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"px-3 py-2 font-mono text-xs bg-muted/10 break-all\">\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref={url}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\t\tclassName=\"text-blue-600 dark:text-blue-400 hover:underline\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{url}\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</ToolContentBox>\n\n\t\t\t\t\t{webContent.content && (\n\t\t\t\t\t\t<ToolContentBox\n\t\t\t\t\t\t\ttitle=\"content\"\n\t\t\t\t\t\t\tcopyText={webContent.content}\n\t\t\t\t\t\t\tmaxHeight=\"max-h-80\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"px-3 py-2 text-xs text-foreground/80 whitespace-pre-wrap break-words\">\n\t\t\t\t\t\t\t\t{webContent.content}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</ToolContentBox>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{!webContent.content && (\n\t\t\t\t\t\t<ToolContentBox title=\"content\" maxHeight=\"\">\n\t\t\t\t\t\t\t<div className=\"px-3 py-2 text-muted-foreground/60 italic\">\n\t\t\t\t\t\t\t\tNo content returned\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</ToolContentBox>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",
98
+ "import type React from 'react';\nimport { useState } from 'react';\nimport { openUrl } from '../../../lib/open-url';\nimport {\n\tChevronDown,\n\tChevronRight,\n\tRefreshCw,\n\tCreditCard,\n\tScissors,\n} from 'lucide-react';\nimport type { ContentJson } from './types';\n\ninterface ErrorRendererProps {\n\tcontentJson: ContentJson;\n\tdebug?: boolean;\n\tsessionId?: string;\n\tonRetry?: () => void;\n\tonCompact?: () => void;\n}\n\nexport function ErrorRenderer({\n\tcontentJson,\n\tdebug: _debug,\n\tsessionId: _sessionId,\n\tonRetry,\n\tonCompact,\n}: ErrorRendererProps) {\n\tconst [showRawDetails, setShowRawDetails] = useState(false);\n\n\t// Check for special error types\n\tconst isBalanceLow =\n\t\tcontentJson.type === 'balance_low' ||\n\t\tcontentJson.errorType === 'balance_low';\n\tconst isContextExceeded =\n\t\tcontentJson.type === 'context_length_exceeded' ||\n\t\tcontentJson.errorType === 'context_length_exceeded';\n\tconst _isRetryable = contentJson.isRetryable === true || isBalanceLow;\n\n\t// Handle different error structures:\n\t// 1. { error: { name, url, statusCode, ... } } - from API errors\n\t// 2. { message, type, details: { ... }, isAborted } - from toErrorPayload\n\t// 3. { message, ... } - simple errors\n\n\tlet errorDetails: Record<string, unknown> | undefined;\n\tlet errorMessage: string | undefined;\n\tlet errorType: string | undefined;\n\tlet isAborted = false;\n\n\t// Check if we have the nested 'error' structure\n\tif (contentJson.error && typeof contentJson.error === 'object') {\n\t\terrorDetails = contentJson.error as Record<string, unknown>;\n\t\t// Try to extract message from nested error\n\t\tif (errorDetails.message && typeof errorDetails.message === 'string') {\n\t\t\terrorMessage = errorDetails.message;\n\t\t}\n\t\tif (errorDetails.type && typeof errorDetails.type === 'string') {\n\t\t\terrorType = errorDetails.type;\n\t\t}\n\t}\n\t// Check if we have the toErrorPayload structure\n\telse if (contentJson.details && typeof contentJson.details === 'object') {\n\t\terrorDetails = contentJson.details as Record<string, unknown>;\n\t\tif (contentJson.message && typeof contentJson.message === 'string') {\n\t\t\terrorMessage = contentJson.message;\n\t\t}\n\t\tif (contentJson.type && typeof contentJson.type === 'string') {\n\t\t\terrorType = contentJson.type;\n\t\t}\n\t\tif (contentJson.isAborted === true) {\n\t\t\tisAborted = true;\n\t\t}\n\t}\n\t// Simple error structure\n\telse {\n\t\tif (contentJson.message && typeof contentJson.message === 'string') {\n\t\t\terrorMessage = contentJson.message;\n\t\t}\n\t\tif (contentJson.type && typeof contentJson.type === 'string') {\n\t\t\terrorType = contentJson.type;\n\t\t}\n\t\tif (contentJson.isAborted === true) {\n\t\t\tisAborted = true;\n\t\t}\n\t\t// Use the whole contentJson as details if we don't have a specific details field\n\t\terrorDetails = contentJson as Record<string, unknown>;\n\t}\n\n\t// Try to extract and parse API error from responseBody if available\n\tlet apiError: { type?: string; message?: string; code?: string } | undefined;\n\tif (\n\t\terrorDetails?.responseBody &&\n\t\ttypeof errorDetails.responseBody === 'string'\n\t) {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(errorDetails.responseBody);\n\t\t\tif (parsed.error && typeof parsed.error === 'object') {\n\t\t\t\tapiError = {\n\t\t\t\t\ttype:\n\t\t\t\t\t\ttypeof parsed.error.type === 'string'\n\t\t\t\t\t\t\t? parsed.error.type\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\ttypeof parsed.error.message === 'string'\n\t\t\t\t\t\t\t? parsed.error.message\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\tcode:\n\t\t\t\t\t\ttypeof parsed.error.code === 'string'\n\t\t\t\t\t\t\t? parsed.error.code\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t};\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore parse errors\n\t\t}\n\t}\n\n\tconst copilotContext =\n\t\tString(errorDetails?.url ?? '').includes('githubcopilot.com') ||\n\t\tString(errorMessage ?? '')\n\t\t\t.toLowerCase()\n\t\t\t.includes('copilot model');\n\n\tconst normalizedErrorMessage = String(\n\t\tapiError?.message ?? errorMessage ?? '',\n\t).toLowerCase();\n\n\tconst isCopilotModelError =\n\t\tcopilotContext &&\n\t\t(apiError?.code === 'model_not_supported' ||\n\t\t\tnormalizedErrorMessage.includes('model is not supported') ||\n\t\t\tnormalizedErrorMessage.includes(\n\t\t\t\t'not available for this account/organization token',\n\t\t\t));\n\n\tconst isCopilotResponsesOnly =\n\t\tapiError?.message\n\t\t\t?.toLowerCase()\n\t\t\t.includes('not accessible via the /chat/completions') &&\n\t\tString(errorDetails?.url ?? '').includes('githubcopilot.com');\n\n\tif (isCopilotResponsesOnly) {\n\t\tconst model = (errorDetails?.requestBodyValues as Record<string, unknown>)\n\t\t\t?.model;\n\t\treturn (\n\t\t\t<div className=\"space-y-3\">\n\t\t\t\t<div className=\"space-y-1\">\n\t\t\t\t\t<div className=\"font-medium text-amber-600 dark:text-amber-400\">\n\t\t\t\t\t\tModel requires Responses API\n\t\t\t\t\t</div>\n\t\t\t\t\t<p className=\"text-sm text-foreground\">\n\t\t\t\t\t\t{model ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<code className=\"px-1 py-0.5 bg-muted rounded text-xs\">\n\t\t\t\t\t\t\t\t\t{String(model)}\n\t\t\t\t\t\t\t\t</code>{' '}\n\t\t\t\t\t\t\t\tmust be sent through the Responses API. If this persists,\n\t\t\t\t\t\t\t\trefresh auth and retry.\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t'This model must be sent through the Responses API. If this persists, refresh auth and retry.'\n\t\t\t\t\t\t)}\n\t\t\t\t\t</p>\n\t\t\t\t\t<p className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\tCodex models (gpt-5.1-codex, gpt-5.2-codex, etc.) require the\n\t\t\t\t\t\tResponses API. Try a chat-compatible model like gpt-5,\n\t\t\t\t\t\tclaude-sonnet-4, or gpt-4.1.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t\t{onRetry && (\n\t\t\t\t\t<div className=\"pt-1\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={onRetry}\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded bg-primary text-primary-foreground hover:bg-primary/90 transition-colors\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<RefreshCw className=\"w-3 h-3\" />\n\t\t\t\t\t\t\tRetry\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (isCopilotModelError) {\n\t\tconst model = (errorDetails?.requestBodyValues as Record<string, unknown>)\n\t\t\t?.model;\n\t\treturn (\n\t\t\t<div className=\"space-y-3\">\n\t\t\t\t<div className=\"space-y-1\">\n\t\t\t\t\t<div className=\"font-medium text-amber-600 dark:text-amber-400\">\n\t\t\t\t\t\tModel not available\n\t\t\t\t\t</div>\n\t\t\t\t\t<p className=\"text-sm text-foreground\">\n\t\t\t\t\t\t{model ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<code className=\"px-1 py-0.5 bg-muted rounded text-xs\">\n\t\t\t\t\t\t\t\t\t{String(model)}\n\t\t\t\t\t\t\t\t</code>{' '}\n\t\t\t\t\t\t\t\tis not available for the current Copilot token.\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t'The requested model is not available for the current Copilot token.'\n\t\t\t\t\t\t)}\n\t\t\t\t\t</p>\n\t\t\t\t\t<p className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\tYour org may restrict third-party OAuth apps, so OAuth and GH tokens\n\t\t\t\t\t\tcan see different model entitlements.\n\t\t\t\t\t</p>\n\t\t\t\t\t<p className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\tCheck model settings at{' '}\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref=\"https://github.com/settings/copilot\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\tclassName=\"underline hover:text-foreground transition-colors\"\n\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\topenUrl('https://github.com/settings/copilot');\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tgithub.com/settings/copilot\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t, then reconnect Copilot with OAuth or token mode.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t\t{onRetry && (\n\t\t\t\t\t<div className=\"pt-1\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={onRetry}\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded bg-primary text-primary-foreground hover:bg-primary/90 transition-colors\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<RefreshCw className=\"w-3 h-3\" />\n\t\t\t\t\t\t\tRetry\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// Special UI for balance_low errors\n\tif (isBalanceLow) {\n\t\treturn (\n\t\t\t<div className=\"space-y-3\">\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<CreditCard className=\"h-4 w-4 text-amber-500\" />\n\t\t\t\t\t<span className=\"font-medium text-foreground\">Balance too low</span>\n\t\t\t\t</div>\n\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\tTop up in the modal, then retry your request.\n\t\t\t\t</p>\n\t\t\t\t{onRetry && (\n\t\t\t\t\t<div className=\"pt-1\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={onRetry}\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded bg-primary text-primary-foreground hover:bg-primary/90 transition-colors\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<RefreshCw className=\"w-3 h-3\" />\n\t\t\t\t\t\t\tRetry\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (isContextExceeded) {\n\t\treturn (\n\t\t\t<div className=\"space-y-3\">\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<Scissors className=\"h-4 w-4 text-amber-500\" />\n\t\t\t\t\t<span className=\"font-medium text-foreground\">\n\t\t\t\t\t\tContext window exceeded\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\tThe conversation is too long for the model. Compact to reduce context\n\t\t\t\t\tsize, then retry.\n\t\t\t\t</p>\n\t\t\t\t<div className=\"flex items-center gap-2 pt-1\">\n\t\t\t\t\t{onCompact && (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={onCompact}\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded bg-primary text-primary-foreground hover:bg-primary/90 transition-colors\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Scissors className=\"w-3 h-3\" />\n\t\t\t\t\t\t\tCompact\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)}\n\t\t\t\t\t{onRetry && (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={onRetry}\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded border border-border text-foreground hover:bg-muted transition-colors\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<RefreshCw className=\"w-3 h-3\" />\n\t\t\t\t\t\t\tRetry\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// Default error UI\n\tconst renderValue = (value: unknown): React.JSX.Element => {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn <span className=\"text-muted-foreground\">null</span>;\n\t\t}\n\t\tif (typeof value === 'boolean') {\n\t\t\treturn (\n\t\t\t\t<span className=\"text-amber-600 dark:text-amber-400\">\n\t\t\t\t\t{String(value)}\n\t\t\t\t</span>\n\t\t\t);\n\t\t}\n\t\tif (typeof value === 'number') {\n\t\t\treturn <span className=\"text-blue-600 dark:text-blue-400\">{value}</span>;\n\t\t}\n\t\tif (typeof value === 'string') {\n\t\t\t// If it looks like JSON, try to format it\n\t\t\tif (value.startsWith('{') || value.startsWith('[')) {\n\t\t\t\ttry {\n\t\t\t\t\tconst parsed = JSON.parse(value);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<pre className=\"mt-1 p-2 bg-muted/50 rounded text-xs overflow-x-auto\">\n\t\t\t\t\t\t\t<code>{JSON.stringify(parsed, null, 2)}</code>\n\t\t\t\t\t\t</pre>\n\t\t\t\t\t);\n\t\t\t\t} catch {\n\t\t\t\t\t// Not valid JSON, render as string\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn <span className=\"text-foreground\">{value}</span>;\n\t\t}\n\t\tif (typeof value === 'object') {\n\t\t\treturn (\n\t\t\t\t<pre className=\"mt-1 p-2 bg-muted/50 rounded text-xs overflow-x-auto\">\n\t\t\t\t\t<code>{JSON.stringify(value, null, 2)}</code>\n\t\t\t\t</pre>\n\t\t\t);\n\t\t}\n\t\treturn <span className=\"text-foreground\">{String(value)}</span>;\n\t};\n\n\tconst importantFields = [\n\t\t'name',\n\t\t'statusCode',\n\t\t'url',\n\t\t'model',\n\t\t'isRetryable',\n\t\t'cause',\n\t];\n\tconst renderedFields = new Set<string>();\n\n\treturn (\n\t\t<div className=\"space-y-2 text-sm\">\n\t\t\t{isAborted && (\n\t\t\t\t<div className=\"text-amber-600 dark:text-amber-400 font-medium\">\n\t\t\t\t\tRequest aborted\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Show API error message first if available */}\n\t\t\t{apiError?.message && (\n\t\t\t\t<div className=\"space-y-1\">\n\t\t\t\t\t<div className=\"font-medium text-red-600 dark:text-red-400\">\n\t\t\t\t\t\tAPI Error:\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"text-foreground\">{apiError.message}</div>\n\t\t\t\t\t{apiError.type && (\n\t\t\t\t\t\t<div className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\tType: {apiError.type}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Show regular error message if no API error */}\n\t\t\t{!apiError?.message && errorMessage && (\n\t\t\t\t<div className=\"space-y-1\">\n\t\t\t\t\t<div className=\"font-medium text-red-600 dark:text-red-400\">\n\t\t\t\t\t\tError:\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"text-foreground\">{errorMessage}</div>\n\t\t\t\t\t{errorType && (\n\t\t\t\t\t\t<div className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\tType: {errorType}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Retry button */}\n\t\t\t{onRetry && (\n\t\t\t\t<div className=\"pt-2\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={onRetry}\n\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded bg-primary text-primary-foreground hover:bg-primary/90 transition-colors\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<RefreshCw className=\"w-3 h-3\" />\n\t\t\t\t\t\tRetry\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Show important details from errorDetails */}\n\t\t\t{errorDetails && (\n\t\t\t\t<div className=\"space-y-1.5\">\n\t\t\t\t\t{importantFields.map((field) => {\n\t\t\t\t\t\tconst value = errorDetails[field];\n\t\t\t\t\t\tif (value === undefined || value === null) return null;\n\t\t\t\t\t\trenderedFields.add(field);\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div key={field} className=\"flex gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"font-medium text-muted-foreground min-w-[100px]\">\n\t\t\t\t\t\t\t\t\t{field}:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{renderValue(value)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Collapsible raw details */}\n\t\t\t{errorDetails && (\n\t\t\t\t<div className=\"mt-3 border-t border-border pt-2\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => setShowRawDetails(!showRawDetails)}\n\t\t\t\t\t\tclassName=\"flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{showRawDetails ? (\n\t\t\t\t\t\t\t<ChevronDown className=\"h-3 w-3\" />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<ChevronRight className=\"h-3 w-3\" />\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{showRawDetails ? 'Hide' : 'View'} Raw Error Details\n\t\t\t\t\t</button>\n\t\t\t\t\t{showRawDetails && (\n\t\t\t\t\t\t<div className=\"mt-2\">\n\t\t\t\t\t\t\t<pre className=\"p-3 bg-muted/50 rounded text-xs overflow-x-auto max-h-96 overflow-y-auto\">\n\t\t\t\t\t\t\t\t<code>{JSON.stringify(errorDetails, null, 2)}</code>\n\t\t\t\t\t\t\t</pre>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{_debug && (\n\t\t\t\t<details className=\"mt-4 text-xs\">\n\t\t\t\t\t<summary className=\"cursor-pointer text-muted-foreground\">\n\t\t\t\t\t\tDebug Info\n\t\t\t\t\t</summary>\n\t\t\t\t\t<pre className=\"mt-2 p-2 bg-muted/30 rounded overflow-x-auto\">\n\t\t\t\t\t\t<code>\n\t\t\t\t\t\t\t{JSON.stringify({ contentJson, errorDetails, apiError }, null, 2)}\n\t\t\t\t\t\t</code>\n\t\t\t\t\t</pre>\n\t\t\t\t</details>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",
99
+ "import { ExternalLink, Link2, Search, Filter } from 'lucide-react';\nimport type { RendererProps } from './types';\nimport { formatDuration } from './utils';\nimport { ToolErrorDisplay } from './ToolErrorDisplay';\nimport {\n\tToolHeader,\n\tToolHeaderSeparator,\n\tToolHeaderMeta,\n\tToolHeaderSuccess,\n\tToolHeaderError,\n\tToolContentBox,\n} from './shared';\n\ninterface SessionResult {\n\tid: string;\n\ttitle?: string | null;\n\tagent?: string;\n\tprovider?: string;\n\tmodel?: string;\n\tcreatedAt?: number;\n\tlastActiveAt?: number;\n\tmessageCount?: number;\n\tsessionType?: string;\n}\n\ninterface MessageResult {\n\tid: string;\n\tsessionId: string;\n\tsessionTitle?: string | null;\n\trole?: string;\n\tcontent?: string;\n\tcontentPreview?: string;\n\tcreatedAt?: number;\n}\n\ninterface SearchResult {\n\tsessionId: string;\n\tsessionTitle?: string | null;\n\tmessageId: string;\n\trole?: string;\n\tmatchedContent?: string;\n\tcreatedAt?: number;\n}\n\ninterface SessionLinkItem {\n\tsessionId: string;\n\ttitle: string;\n\tdescription?: string;\n}\n\ninterface DatabaseToolRendererProps extends RendererProps {\n\ttoolName: string;\n\tonNavigateToSession?: (sessionId: string) => void;\n}\n\nfunction formatDate(timestamp?: number): string {\n\tif (!timestamp) return '';\n\tconst date = new Date(timestamp);\n\treturn date.toLocaleDateString(undefined, {\n\t\tmonth: 'short',\n\t\tday: 'numeric',\n\t\thour: '2-digit',\n\t\tminute: '2-digit',\n\t});\n}\n\nfunction SessionLink({\n\tsession,\n\tonNavigate,\n\tcompact,\n}: {\n\tsession: SessionResult;\n\tonNavigate?: (id: string) => void;\n\tcompact?: boolean;\n}) {\n\tif (compact) {\n\t\treturn (\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => onNavigate?.(session.id)}\n\t\t\t\tdisabled={!onNavigate}\n\t\t\t\tclassName=\"w-full text-left py-1 px-2 rounded text-xs hover:bg-muted/50 transition-colors flex items-center justify-between gap-2\"\n\t\t\t>\n\t\t\t\t<span className=\"truncate text-foreground\">\n\t\t\t\t\t{session.title || 'Untitled'}\n\t\t\t\t</span>\n\t\t\t\t{onNavigate && (\n\t\t\t\t\t<ExternalLink className=\"w-3 h-3 text-muted-foreground flex-shrink-0\" />\n\t\t\t\t)}\n\t\t\t</button>\n\t\t);\n\t}\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={() => onNavigate?.(session.id)}\n\t\t\tdisabled={!onNavigate}\n\t\t\tclassName=\"w-full text-left p-2 rounded-md border border-border hover:bg-muted/50 transition-colors group\"\n\t\t>\n\t\t\t<div className=\"flex items-center justify-between gap-2\">\n\t\t\t\t<span className=\"font-medium text-sm truncate text-foreground\">\n\t\t\t\t\t{session.title || 'Untitled'}\n\t\t\t\t</span>\n\t\t\t\t{onNavigate && (\n\t\t\t\t\t<ExternalLink className=\"w-3 h-3 text-muted-foreground opacity-0 group-hover:opacity-100 transition-opacity flex-shrink-0\" />\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<div className=\"flex items-center gap-2 text-xs text-muted-foreground mt-1\">\n\t\t\t\t{session.agent && (\n\t\t\t\t\t<span className=\"text-violet-600 dark:text-violet-400\">\n\t\t\t\t\t\t{session.agent}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t{session.agent && session.provider && <span>·</span>}\n\t\t\t\t{session.provider && <span>{session.provider}</span>}\n\t\t\t\t{session.messageCount !== undefined && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<span>·</span>\n\t\t\t\t\t\t<span>{session.messageCount} msgs</span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{session.createdAt && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<span>·</span>\n\t\t\t\t\t\t<span>{formatDate(session.createdAt)}</span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</button>\n\t);\n}\n\nfunction MessageLink({\n\tmessage,\n\tonNavigate,\n\tcompact,\n}: {\n\tmessage: MessageResult | SearchResult;\n\tonNavigate?: (sessionId: string) => void;\n\tcompact?: boolean;\n}) {\n\tconst sessionId = 'sessionId' in message ? message.sessionId : '';\n\tconst sessionTitle = 'sessionTitle' in message ? message.sessionTitle : null;\n\tconst content =\n\t\t'content' in message\n\t\t\t? message.content\n\t\t\t: 'contentPreview' in message\n\t\t\t\t? message.contentPreview\n\t\t\t\t: 'matchedContent' in message\n\t\t\t\t\t? message.matchedContent\n\t\t\t\t\t: '';\n\n\tif (compact) {\n\t\treturn (\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => onNavigate?.(sessionId)}\n\t\t\t\tdisabled={!onNavigate || !sessionId}\n\t\t\t\tclassName=\"w-full text-left py-1 px-2 rounded text-xs hover:bg-muted/50 transition-colors flex items-center justify-between gap-2\"\n\t\t\t>\n\t\t\t\t<span className=\"truncate text-foreground/80\">\n\t\t\t\t\t{content?.slice(0, 50) || sessionTitle || sessionId.slice(0, 8)}\n\t\t\t\t</span>\n\t\t\t\t{onNavigate && sessionId && (\n\t\t\t\t\t<ExternalLink className=\"w-3 h-3 text-muted-foreground flex-shrink-0\" />\n\t\t\t\t)}\n\t\t\t</button>\n\t\t);\n\t}\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={() => onNavigate?.(sessionId)}\n\t\t\tdisabled={!onNavigate || !sessionId}\n\t\t\tclassName=\"w-full text-left p-2 rounded-md border border-border hover:bg-muted/50 transition-colors group\"\n\t\t>\n\t\t\t<div className=\"flex items-center justify-between gap-2\">\n\t\t\t\t<span className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t{sessionTitle || sessionId.slice(0, 8)}\n\t\t\t\t</span>\n\t\t\t\t{onNavigate && sessionId && (\n\t\t\t\t\t<ExternalLink className=\"w-3 h-3 text-muted-foreground opacity-0 group-hover:opacity-100 transition-opacity flex-shrink-0\" />\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t{content && (\n\t\t\t\t<div className=\"text-xs text-foreground/80 mt-1 line-clamp-2\">\n\t\t\t\t\t{content}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<div className=\"flex items-center gap-2 text-xs text-muted-foreground mt-1\">\n\t\t\t\t{message.role && <span className=\"capitalize\">{message.role}</span>}\n\t\t\t\t{message.createdAt && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<span>·</span>\n\t\t\t\t\t\t<span>{formatDate(message.createdAt)}</span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</button>\n\t);\n}\n\nfunction ArgsPreview({\n\targs,\n\ttoolName,\n}: {\n\targs: Record<string, unknown>;\n\ttoolName: string;\n}) {\n\tconst renderArg = (key: string, value: unknown) => {\n\t\tif (value === undefined || value === null) return null;\n\t\tif (typeof value === 'boolean' && !value) return null;\n\t\tif (Array.isArray(value) && value.length === 0) return null;\n\n\t\treturn (\n\t\t\t<span\n\t\t\t\tkey={key}\n\t\t\t\tclassName=\"inline-flex items-center gap-1 px-1.5 py-0.5 rounded bg-muted text-muted-foreground\"\n\t\t\t>\n\t\t\t\t<span className=\"opacity-60\">{key}:</span>\n\t\t\t\t<span className=\"text-foreground/80\">\n\t\t\t\t\t{typeof value === 'string' ? value : JSON.stringify(value)}\n\t\t\t\t</span>\n\t\t\t</span>\n\t\t);\n\t};\n\n\tconst importantArgs: Record<string, string[]> = {\n\t\tquery_sessions: ['agent', 'sessionType', 'startDate', 'endDate'],\n\t\tquery_messages: ['sessionId', 'role', 'search', 'toolName'],\n\t\tsearch_history: ['query'],\n\t\tget_session_context: ['sessionId', 'includeMessages'],\n\t\tget_parent_session: ['includeMessages'],\n\t};\n\n\tconst keysToShow = importantArgs[toolName] || Object.keys(args).slice(0, 3);\n\tconst argsToRender = keysToShow\n\t\t.filter((k) => args[k] !== undefined && args[k] !== null)\n\t\t.map((k) => renderArg(k, args[k]))\n\t\t.filter(Boolean);\n\n\tif (argsToRender.length === 0) return null;\n\n\treturn (\n\t\t<div className=\"flex items-center gap-1.5 flex-wrap text-xs mb-2 pb-2 border-b border-border\">\n\t\t\t<Filter className=\"w-3 h-3 text-muted-foreground flex-shrink-0\" />\n\t\t\t{argsToRender}\n\t\t</div>\n\t);\n}\n\nexport function DatabaseToolRenderer({\n\ttoolName,\n\tcontentJson,\n\ttoolDurationMs,\n\tisExpanded,\n\tonToggle,\n\tonNavigateToSession,\n\tcompact,\n}: DatabaseToolRendererProps) {\n\tconst result = contentJson.result || {};\n\tconst args = (contentJson.args || {}) as Record<string, unknown>;\n\n\tconst hasToolError =\n\t\ttypeof result === 'object' && 'ok' in result && result.ok === false;\n\tconst errorMessage =\n\t\thasToolError && 'error' in result && typeof result.error === 'string'\n\t\t\t? result.error\n\t\t\t: null;\n\n\tconst timeStr = formatDuration(toolDurationMs);\n\n\tif (toolName === 'present_action') {\n\t\tconst links = (result as { links?: SessionLinkItem[] }).links || [];\n\t\tconst summary = (result as { summary?: string }).summary;\n\t\tconst title = (result as { title?: string }).title;\n\n\t\tif (links.length === 0 && !summary) return null;\n\n\t\treturn (\n\t\t\t<div className=\"mt-2 mb-1\">\n\t\t\t\t{title && (\n\t\t\t\t\t<div className=\"text-sm font-medium text-foreground mb-1.5\">\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t{summary && (\n\t\t\t\t\t<div className=\"text-xs text-muted-foreground mb-2 flex items-center gap-1.5\">\n\t\t\t\t\t\t<Link2 className=\"w-3.5 h-3.5 text-teal-500\" />\n\t\t\t\t\t\t<span>{summary}</span>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t{links.length > 0 && (\n\t\t\t\t\t<div className=\"space-y-1.5\">\n\t\t\t\t\t\t{links.map((link) => (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tkey={link.sessionId}\n\t\t\t\t\t\t\t\tonClick={() => onNavigateToSession?.(link.sessionId)}\n\t\t\t\t\t\t\t\tdisabled={!onNavigateToSession}\n\t\t\t\t\t\t\t\tclassName=\"w-full text-left px-3 py-2 rounded-lg border border-teal-500/30 bg-teal-500/5 hover:bg-teal-500/10 transition-colors group flex items-center justify-between gap-2\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<div className=\"font-medium text-sm text-foreground\">\n\t\t\t\t\t\t\t\t\t\t{link.title}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t{link.description && (\n\t\t\t\t\t\t\t\t\t\t<div className=\"text-xs text-muted-foreground mt-0.5\">\n\t\t\t\t\t\t\t\t\t\t\t{link.description}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{onNavigateToSession && (\n\t\t\t\t\t\t\t\t\t<ExternalLink className=\"w-4 h-4 text-teal-600 dark:text-teal-400 opacity-60 group-hover:opacity-100 transition-opacity flex-shrink-0\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst getDescription = () => {\n\t\tswitch (toolName) {\n\t\t\tcase 'query_sessions': {\n\t\t\t\tconst sessions =\n\t\t\t\t\t(result as { sessions?: SessionResult[] }).sessions || [];\n\t\t\t\tconst total = (result as { total?: number }).total;\n\t\t\t\treturn `${sessions.length} session${sessions.length !== 1 ? 's' : ''}${total ? ` of ${total}` : ''}`;\n\t\t\t}\n\t\t\tcase 'query_messages': {\n\t\t\t\tconst messages =\n\t\t\t\t\t(result as { messages?: MessageResult[] }).messages || [];\n\t\t\t\treturn `${messages.length} message${messages.length !== 1 ? 's' : ''}`;\n\t\t\t}\n\t\t\tcase 'search_history': {\n\t\t\t\tconst query = args.query as string | undefined;\n\t\t\t\tconst results = (result as { results?: SearchResult[] }).results || [];\n\t\t\t\tconst queryPreview = query\n\t\t\t\t\t? `\"${query.slice(0, 20)}${query.length > 20 ? '…' : ''}\"`\n\t\t\t\t\t: '';\n\t\t\t\treturn `${results.length} result${results.length !== 1 ? 's' : ''}${queryPreview ? ` for ${queryPreview}` : ''}`;\n\t\t\t}\n\t\t\tcase 'get_session_context': {\n\t\t\t\tconst session = (result as { session?: SessionResult }).session;\n\t\t\t\treturn (\n\t\t\t\t\tsession?.title ||\n\t\t\t\t\t(args as { sessionId?: string }).sessionId?.slice(0, 8) ||\n\t\t\t\t\t'session'\n\t\t\t\t);\n\t\t\t}\n\t\t\tcase 'get_parent_session': {\n\t\t\t\tconst parentSession = (result as { parentSession?: SessionResult })\n\t\t\t\t\t.parentSession;\n\t\t\t\treturn parentSession?.title || 'parent session';\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn toolName;\n\t\t}\n\t};\n\n\tconst renderContent = () => {\n\t\tconst hasArgs = Object.keys(args).length > 0 && !compact;\n\n\t\tswitch (toolName) {\n\t\t\tcase 'query_sessions': {\n\t\t\t\tconst sessions =\n\t\t\t\t\t(result as { sessions?: SessionResult[] }).sessions || [];\n\t\t\t\treturn (\n\t\t\t\t\t<div className={compact ? 'p-1' : 'p-2'}>\n\t\t\t\t\t\t{hasArgs && <ArgsPreview args={args} toolName={toolName} />}\n\t\t\t\t\t\t{sessions.length === 0 ? (\n\t\t\t\t\t\t\t<div className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\tNo sessions found\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<div className={compact ? 'space-y-0.5' : 'space-y-2'}>\n\t\t\t\t\t\t\t\t{sessions.slice(0, compact ? 5 : 10).map((session) => (\n\t\t\t\t\t\t\t\t\t<SessionLink\n\t\t\t\t\t\t\t\t\t\tkey={session.id}\n\t\t\t\t\t\t\t\t\t\tsession={session}\n\t\t\t\t\t\t\t\t\t\tonNavigate={onNavigateToSession}\n\t\t\t\t\t\t\t\t\t\tcompact={compact}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t{sessions.length > (compact ? 5 : 10) && (\n\t\t\t\t\t\t\t\t\t<div className=\"text-xs text-muted-foreground text-center\">\n\t\t\t\t\t\t\t\t\t\t+{sessions.length - (compact ? 5 : 10)} more\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcase 'query_messages': {\n\t\t\t\tconst messages =\n\t\t\t\t\t(result as { messages?: MessageResult[] }).messages || [];\n\t\t\t\treturn (\n\t\t\t\t\t<div className={compact ? 'p-1' : 'p-2'}>\n\t\t\t\t\t\t{hasArgs && <ArgsPreview args={args} toolName={toolName} />}\n\t\t\t\t\t\t{messages.length === 0 ? (\n\t\t\t\t\t\t\t<div className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\tNo messages found\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<div className={compact ? 'space-y-0.5' : 'space-y-2'}>\n\t\t\t\t\t\t\t\t{messages.slice(0, compact ? 5 : 10).map((msg) => (\n\t\t\t\t\t\t\t\t\t<MessageLink\n\t\t\t\t\t\t\t\t\t\tkey={msg.id}\n\t\t\t\t\t\t\t\t\t\tmessage={msg}\n\t\t\t\t\t\t\t\t\t\tonNavigate={onNavigateToSession}\n\t\t\t\t\t\t\t\t\t\tcompact={compact}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t{messages.length > (compact ? 5 : 10) && (\n\t\t\t\t\t\t\t\t\t<div className=\"text-xs text-muted-foreground text-center\">\n\t\t\t\t\t\t\t\t\t\t+{messages.length - (compact ? 5 : 10)} more\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcase 'search_history': {\n\t\t\t\tconst results = (result as { results?: SearchResult[] }).results || [];\n\t\t\t\tconst query = args.query as string | undefined;\n\t\t\t\treturn (\n\t\t\t\t\t<div className={compact ? 'p-1' : 'p-2'}>\n\t\t\t\t\t\t{query && !compact && (\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-1.5 text-xs mb-2 pb-2 border-b border-border\">\n\t\t\t\t\t\t\t\t<Search className=\"w-3 h-3 text-muted-foreground flex-shrink-0\" />\n\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">Query:</span>\n\t\t\t\t\t\t\t\t<span className=\"text-foreground font-medium\">\"{query}\"</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{results.length === 0 ? (\n\t\t\t\t\t\t\t<div className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\tNo results found\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<div className={compact ? 'space-y-0.5' : 'space-y-2'}>\n\t\t\t\t\t\t\t\t{results.slice(0, compact ? 5 : 10).map((r, i) => (\n\t\t\t\t\t\t\t\t\t<MessageLink\n\t\t\t\t\t\t\t\t\t\tkey={`${r.sessionId}-${r.messageId}-${i}`}\n\t\t\t\t\t\t\t\t\t\tmessage={r}\n\t\t\t\t\t\t\t\t\t\tonNavigate={onNavigateToSession}\n\t\t\t\t\t\t\t\t\t\tcompact={compact}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t{results.length > (compact ? 5 : 10) && (\n\t\t\t\t\t\t\t\t\t<div className=\"text-xs text-muted-foreground text-center\">\n\t\t\t\t\t\t\t\t\t\t+{results.length - (compact ? 5 : 10)} more\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcase 'get_session_context':\n\t\t\tcase 'get_parent_session': {\n\t\t\t\tconst session =\n\t\t\t\t\ttoolName === 'get_parent_session'\n\t\t\t\t\t\t? (result as { parentSession?: SessionResult }).parentSession\n\t\t\t\t\t\t: (result as { session?: SessionResult }).session;\n\t\t\t\tconst stats = (\n\t\t\t\t\tresult as {\n\t\t\t\t\t\tstats?: { totalMessages?: number; totalToolCalls?: number };\n\t\t\t\t\t}\n\t\t\t\t).stats;\n\t\t\t\tconst messages = (\n\t\t\t\t\tresult as {\n\t\t\t\t\t\tmessages?: Array<{\n\t\t\t\t\t\t\tid: string;\n\t\t\t\t\t\t\trole: string;\n\t\t\t\t\t\t\tcontent: string;\n\t\t\t\t\t\t\tcreatedAt: number;\n\t\t\t\t\t\t}>;\n\t\t\t\t\t}\n\t\t\t\t).messages;\n\n\t\t\t\tif (!session) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={`text-xs text-muted-foreground ${compact ? 'p-1' : 'p-2'}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tSession not found\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (compact) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div className=\"p-1\">\n\t\t\t\t\t\t\t<SessionLink\n\t\t\t\t\t\t\t\tsession={session}\n\t\t\t\t\t\t\t\tonNavigate={onNavigateToSession}\n\t\t\t\t\t\t\t\tcompact\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn (\n\t\t\t\t\t<div className=\"p-2 space-y-3\">\n\t\t\t\t\t\t<SessionLink session={session} onNavigate={onNavigateToSession} />\n\n\t\t\t\t\t\t{stats && (\n\t\t\t\t\t\t\t<div className=\"flex gap-4 text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t{stats.totalMessages !== undefined && (\n\t\t\t\t\t\t\t\t\t<span>{stats.totalMessages} messages</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{stats.totalToolCalls !== undefined && (\n\t\t\t\t\t\t\t\t\t<span>{stats.totalToolCalls} tool calls</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t{messages && messages.length > 0 && (\n\t\t\t\t\t\t\t<div className=\"space-y-1\">\n\t\t\t\t\t\t\t\t<div className=\"text-xs font-medium text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tRecent messages:\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div className=\"space-y-1 max-h-48 overflow-y-auto\">\n\t\t\t\t\t\t\t\t\t{messages.slice(0, 5).map((msg) => (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tkey={msg.id}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-xs p-1.5 rounded bg-muted/30\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-medium capitalize text-foreground/70\">\n\t\t\t\t\t\t\t\t\t\t\t\t{msg.role}:{' '}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-foreground/60 line-clamp-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t{msg.content}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\treturn (\n\t\t\t\t\t<pre className=\"text-xs p-2 overflow-auto max-h-48\">\n\t\t\t\t\t\t{JSON.stringify(result, null, 2)}\n\t\t\t\t\t</pre>\n\t\t\t\t);\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className=\"text-xs\">\n\t\t\t<ToolHeader\n\t\t\t\ttoolName={toolName}\n\t\t\t\tisExpanded={isExpanded}\n\t\t\t\tonToggle={onToggle}\n\t\t\t\tisError={hasToolError}\n\t\t\t\tcolorVariant=\"default\"\n\t\t\t\tcanExpand={true}\n\t\t\t>\n\t\t\t\t{!compact && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<span className=\"text-foreground/70 min-w-0 truncate\">\n\t\t\t\t\t\t\t{getDescription()}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{!hasToolError && !compact && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<ToolHeaderSuccess>Done</ToolHeaderSuccess>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<ToolHeaderMeta>{timeStr}</ToolHeaderMeta>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{hasToolError && !compact && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<ToolHeaderError>Error</ToolHeaderError>\n\t\t\t\t\t\t<ToolHeaderMeta>· {timeStr}</ToolHeaderMeta>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</ToolHeader>\n\n\t\t\t{isExpanded && hasToolError && errorMessage && (\n\t\t\t\t<ToolErrorDisplay error={errorMessage} />\n\t\t\t)}\n\n\t\t\t{isExpanded && !hasToolError && (\n\t\t\t\t<div className={compact ? 'mt-1 ml-3' : 'mt-2 ml-5'}>\n\t\t\t\t\t{compact ? (\n\t\t\t\t\t\t<div className=\"border border-border rounded-md overflow-hidden max-h-48 overflow-y-auto\">\n\t\t\t\t\t\t\t{renderContent()}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ToolContentBox title=\"results\" maxHeight=\"max-h-96\">\n\t\t\t\t\t\t\t{renderContent()}\n\t\t\t\t\t\t</ToolContentBox>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",
100
+ "import { useEffect, useState } from 'react';\nimport { Terminal } from 'lucide-react';\nimport { NERD_FONT_FAMILY, loadNerdFont } from '../../../lib/nerd-font';\nimport type { RendererProps } from './types';\nimport { formatDuration } from './utils';\nimport { ToolErrorDisplay } from './ToolErrorDisplay';\nimport {\n\tToolHeader,\n\tToolHeaderSeparator,\n\tToolHeaderMeta,\n\tToolHeaderSuccess,\n\tToolContentBox,\n} from './shared';\n\nconst ANSI_RE =\n\t/[\\x1B\\x9B][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nq-uy=><~]/g;\nconst CONTROL_RE = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]/g;\n\nfunction cleanTerminalOutput(raw: string): string {\n\treturn raw\n\t\t.replace(ANSI_RE, '')\n\t\t.replace(CONTROL_RE, '')\n\t\t.replace(/\\\\n/g, '\\n')\n\t\t.replace(/\\r\\n/g, '\\n')\n\t\t.replace(/\\r/g, '\\n');\n}\n\nexport function TerminalRenderer({\n\tcontentJson,\n\ttoolDurationMs,\n\tisExpanded,\n\tonToggle,\n\tcompact,\n}: RendererProps) {\n\tconst [, setFontReady] = useState(false);\n\tuseEffect(() => {\n\t\tloadNerdFont().then(() => setFontReady(true));\n\t}, []);\n\n\tconst result = contentJson.result || {};\n\tconst args = contentJson.args || {};\n\n\tconst operation = String(args.operation || args.command || '');\n\tconst hasToolError =\n\t\ttypeof result === 'object' && 'ok' in result && result.ok === false;\n\tconst errorMessage =\n\t\thasToolError && 'error' in result && typeof result.error === 'string'\n\t\t\t? result.error\n\t\t\t: null;\n\tconst errorStack =\n\t\thasToolError && 'stack' in result && typeof result.stack === 'string'\n\t\t\t? result.stack\n\t\t\t: undefined;\n\n\tconst timeStr = formatDuration(toolDurationMs);\n\n\tconst terminalId = String(result.terminalId || args.terminalId || '');\n\tconst shortId =\n\t\tterminalId.length > 12 ? `${terminalId.slice(0, 12)}…` : terminalId;\n\tconst purpose = String(result.purpose || args.purpose || '');\n\tconst command = String(result.command || args.command || '');\n\n\tconst renderStartResult = () => {\n\t\tconst pid = result.pid ? `PID ${result.pid}` : '';\n\t\treturn (\n\t\t\t<div className=\"mt-2 ml-5 flex flex-col gap-1 text-xs\">\n\t\t\t\t{command && (\n\t\t\t\t\t<div className=\"flex items-center gap-2 text-foreground/70\">\n\t\t\t\t\t\t<Terminal className=\"h-3 w-3\" />\n\t\t\t\t\t\t<code className=\"font-mono\">{command}</code>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t\t{purpose && <div className=\"text-muted-foreground/70\">{purpose}</div>}\n\t\t\t\t<div className=\"flex items-center gap-2 text-muted-foreground/60\">\n\t\t\t\t\t{shortId && <span className=\"font-mono\">{shortId}</span>}\n\t\t\t\t\t{pid && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<span>·</span>\n\t\t\t\t\t\t\t<span>{pid}</span>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t};\n\n\tconst renderReadResult = () => {\n\t\tconst rawOutput = String(result.text || result.output || '');\n\t\tconst output = cleanTerminalOutput(rawOutput);\n\t\tconst status = String(result.status || '');\n\t\tconst exitCode = result.exitCode;\n\t\tconst lineCount = typeof result.lines === 'number' ? result.lines : 0;\n\n\t\treturn (\n\t\t\t<div className=\"mt-2 ml-5 flex flex-col gap-2 max-w-full\">\n\t\t\t\t<div className=\"flex items-center gap-2 text-xs text-muted-foreground/70\">\n\t\t\t\t\t{shortId && <span className=\"font-mono\">{shortId}</span>}\n\t\t\t\t\t<span>·</span>\n\t\t\t\t\t<span>{lineCount} lines</span>\n\t\t\t\t\t<span>·</span>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\tstatus === 'running'\n\t\t\t\t\t\t\t\t? 'text-emerald-600 dark:text-emerald-400'\n\t\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\t{status}\n\t\t\t\t\t\t{status === 'exited' && exitCode !== undefined\n\t\t\t\t\t\t\t? ` (${exitCode})`\n\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t{output.trim() && (\n\t\t\t\t\t<ToolContentBox\n\t\t\t\t\t\ttitle=\"output\"\n\t\t\t\t\t\tcopyText={output}\n\t\t\t\t\t\tmaxHeight=\"max-h-[30rem]\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<pre\n\t\t\t\t\t\t\tclassName=\"px-3 py-2 text-xs text-foreground/85 whitespace-pre-wrap break-words overflow-x-auto\"\n\t\t\t\t\t\t\tstyle={{ fontFamily: NERD_FONT_FAMILY }}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{output}\n\t\t\t\t\t\t</pre>\n\t\t\t\t\t</ToolContentBox>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t};\n\n\tconst renderListResult = () => {\n\t\tconst terminals = Array.isArray(result.terminals) ? result.terminals : [];\n\t\tconst count =\n\t\t\ttypeof result.count === 'number' ? result.count : terminals.length;\n\n\t\treturn (\n\t\t\t<div className=\"mt-2 ml-5 flex flex-col gap-1 text-xs\">\n\t\t\t\t<div className=\"text-muted-foreground/70\">\n\t\t\t\t\t{count} terminal{count !== 1 ? 's' : ''}\n\t\t\t\t</div>\n\t\t\t\t{terminals.slice(0, 8).map((t: Record<string, unknown>, i: number) => (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={String(t.id || i)}\n\t\t\t\t\t\tclassName=\"flex items-center gap-2 text-foreground/70 font-mono\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={`h-2 w-2 rounded-full ${t.status === 'running' ? 'bg-emerald-500' : 'bg-muted-foreground/40'}`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<span className=\"truncate max-w-[100px]\">\n\t\t\t\t\t\t\t{String(t.id || '').slice(0, 12)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className=\"text-muted-foreground/60 truncate\">\n\t\t\t\t\t\t\t{String(t.purpose || '')}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t);\n\t};\n\n\tconst renderWriteResult = () => {\n\t\tconst written = String(args.input || '');\n\t\treturn written ? (\n\t\t\t<div className=\"mt-2 ml-5 text-xs\">\n\t\t\t\t<code className=\"font-mono text-foreground/70 whitespace-pre-wrap\">\n\t\t\t\t\t{written}\n\t\t\t\t</code>\n\t\t\t</div>\n\t\t) : null;\n\t};\n\n\tconst label = operation || 'terminal';\n\tconst headerLabel = `terminal ${label}`;\n\tconst hasContent =\n\t\t!hasToolError &&\n\t\t(operation === 'start' ||\n\t\t\toperation === 'read' ||\n\t\t\toperation === 'list' ||\n\t\t\t(operation === 'write' && (args.input || result.message)));\n\n\treturn (\n\t\t<div className=\"text-xs\">\n\t\t\t<ToolHeader\n\t\t\t\ttoolName={headerLabel}\n\t\t\t\tisExpanded={isExpanded}\n\t\t\t\tonToggle={onToggle}\n\t\t\t\tisError={!!hasToolError}\n\t\t\t\tcolorVariant=\"amber\"\n\t\t\t\tcanExpand={!!hasContent || !!hasToolError}\n\t\t\t>\n\t\t\t\t{!compact && shortId && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<span className=\"text-foreground/70 font-mono text-[11px]\">\n\t\t\t\t\t\t\t{shortId}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{!compact && purpose && !shortId && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<span className=\"text-foreground/70 text-[11px] truncate max-w-xs\">\n\t\t\t\t\t\t\t{purpose}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{!hasToolError && !compact && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<ToolHeaderSuccess>ok</ToolHeaderSuccess>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<ToolHeaderMeta>{timeStr}</ToolHeaderMeta>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{hasToolError && !compact && (\n\t\t\t\t\t<ToolHeaderMeta>· {timeStr}</ToolHeaderMeta>\n\t\t\t\t)}\n\t\t\t</ToolHeader>\n\n\t\t\t{isExpanded && hasToolError && errorMessage && (\n\t\t\t\t<ToolErrorDisplay error={errorMessage} stack={errorStack} showStack />\n\t\t\t)}\n\n\t\t\t{isExpanded &&\n\t\t\t\t!hasToolError &&\n\t\t\t\toperation === 'start' &&\n\t\t\t\trenderStartResult()}\n\t\t\t{isExpanded &&\n\t\t\t\t!hasToolError &&\n\t\t\t\toperation === 'read' &&\n\t\t\t\trenderReadResult()}\n\t\t\t{isExpanded &&\n\t\t\t\t!hasToolError &&\n\t\t\t\toperation === 'list' &&\n\t\t\t\trenderListResult()}\n\t\t\t{isExpanded &&\n\t\t\t\t!hasToolError &&\n\t\t\t\toperation === 'write' &&\n\t\t\t\trenderWriteResult()}\n\t\t</div>\n\t);\n}\n",
101
+ "export const NERD_FONT_FAMILY = '\"JetBrainsMono NFM\", monospace';\n\nlet fontsLoaded = false;\nlet loadPromise: Promise<void> | null = null;\n\nexport function loadNerdFont(): Promise<void> {\n\tif (fontsLoaded) return Promise.resolve();\n\tif (loadPromise) return loadPromise;\n\n\tloadPromise = doLoad().then(() => {\n\t\tfontsLoaded = true;\n\t});\n\treturn loadPromise;\n}\n\nexport function isNerdFontLoaded(): boolean {\n\treturn fontsLoaded;\n}\n\nasync function doLoad(): Promise<void> {\n\tif (typeof document === 'undefined' || !('FontFace' in window)) return;\n\n\tconst variants = [\n\t\t{\n\t\t\tfile: 'JetBrainsMonoNerdFontMono-Regular.woff2',\n\t\t\tweight: '400',\n\t\t\tstyle: 'normal',\n\t\t},\n\t\t{\n\t\t\tfile: 'JetBrainsMonoNerdFontMono-Bold.woff2',\n\t\t\tweight: '700',\n\t\t\tstyle: 'normal',\n\t\t},\n\t\t{\n\t\t\tfile: 'JetBrainsMonoNerdFontMono-Italic.woff2',\n\t\t\tweight: '400',\n\t\t\tstyle: 'italic',\n\t\t},\n\t\t{\n\t\t\tfile: 'JetBrainsMonoNerdFontMono-BoldItalic.woff2',\n\t\t\tweight: '700',\n\t\t\tstyle: 'italic',\n\t\t},\n\t];\n\n\tconst loads = variants.map(async (v) => {\n\t\ttry {\n\t\t\tconst url = new URL(`../assets/fonts/${v.file}`, import.meta.url).href;\n\t\t\tconst face = new FontFace(\n\t\t\t\t'JetBrainsMono NFM',\n\t\t\t\t`url(\"${url}\") format(\"woff2\")`,\n\t\t\t\t{ weight: v.weight, style: v.style },\n\t\t\t);\n\t\t\tconst loaded = await face.load();\n\t\t\tdocument.fonts.add(loaded);\n\t\t} catch {\n\t\t\t// variant not available\n\t\t}\n\t});\n\n\tawait Promise.allSettled(loads);\n}\n",
102
+ "import { Plug } from 'lucide-react';\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport {\n\tprism,\n\tvscDarkPlus,\n} from 'react-syntax-highlighter/dist/esm/styles/prism';\nimport type { GenericRendererProps } from './types';\nimport { formatDuration } from './utils';\nimport { ToolErrorDisplay } from './ToolErrorDisplay';\nimport {\n\tToolHeader,\n\tToolHeaderSeparator,\n\tToolHeaderMeta,\n\tToolHeaderSuccess,\n\tToolHeaderError,\n\tToolContentBox,\n\tImagePreview,\n} from './shared';\n\nfunction parseMcpToolName(fullName: string): { server: string; tool: string } {\n\tconst idx = fullName.indexOf('__');\n\tif (idx === -1) return { server: '', tool: fullName };\n\treturn { server: fullName.slice(0, idx), tool: fullName.slice(idx + 2) };\n}\n\nexport function isMcpTool(name: string): boolean {\n\treturn name.includes('__');\n}\n\nexport function McpToolRenderer({\n\ttoolName,\n\tcontentJson,\n\ttoolDurationMs,\n\tisExpanded,\n\tonToggle,\n\tcompact,\n}: GenericRendererProps) {\n\tconst { server, tool } = parseMcpToolName(toolName);\n\tconst result = contentJson.result || {};\n\tconst args = contentJson.args || {};\n\tconst timeStr = formatDuration(toolDurationMs);\n\tconst syntaxTheme = document?.documentElement.classList.contains('dark')\n\t\t? vscDarkPlus\n\t\t: prism;\n\n\tconst hasToolError =\n\t\ttypeof result === 'object' && 'ok' in result && result.ok === false;\n\tconst errorMessage =\n\t\thasToolError && 'error' in result && typeof result.error === 'string'\n\t\t\t? result.error\n\t\t\t: typeof contentJson.error === 'string'\n\t\t\t\t? (contentJson.error as unknown as string)\n\t\t\t\t: null;\n\tconst errorStack =\n\t\thasToolError && 'stack' in result && typeof result.stack === 'string'\n\t\t\t? result.stack\n\t\t\t: undefined;\n\n\tconst resultContent =\n\t\ttypeof result.result === 'string'\n\t\t\t? result.result\n\t\t\t: result.result && typeof result.result === 'object'\n\t\t\t\t? JSON.stringify(result.result, null, 2)\n\t\t\t\t: null;\n\n\tconst images = Array.isArray(result.images)\n\t\t? (result.images as Array<{ data: string; mimeType: string }>)\n\t\t: [];\n\tconst hasImages = images.length > 0;\n\tconst hasContent =\n\t\t!hasToolError &&\n\t\t(resultContent || Object.keys(result).length > 0 || hasImages);\n\tconst displayResult = resultContent || JSON.stringify(result, null, 2);\n\tconst isJsonResult =\n\t\tdisplayResult.startsWith('{') || displayResult.startsWith('[');\n\n\tconst argsPreview = Object.entries(args as Record<string, unknown>)\n\t\t.slice(0, 3)\n\t\t.map(([k, v]) => {\n\t\t\tconst val =\n\t\t\t\ttypeof v === 'string'\n\t\t\t\t\t? v.length > 30\n\t\t\t\t\t\t? `${v.slice(0, 27)}…`\n\t\t\t\t\t\t: v\n\t\t\t\t\t: JSON.stringify(v);\n\t\t\treturn `${k}=${val}`;\n\t\t})\n\t\t.join(' ');\n\n\tconst headerName = server ? `${server} › ${tool}` : tool;\n\n\treturn (\n\t\t<div className=\"text-xs\">\n\t\t\t<ToolHeader\n\t\t\t\ttoolName={headerName}\n\t\t\t\tisExpanded={isExpanded}\n\t\t\t\tonToggle={onToggle}\n\t\t\t\tisError={!!hasToolError}\n\t\t\t\tcolorVariant=\"purple\"\n\t\t\t\tcanExpand={!!hasContent || !!hasToolError || hasImages}\n\t\t\t>\n\t\t\t\t{!compact && argsPreview && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<span className=\"text-foreground/60 truncate max-w-xs font-mono text-[11px]\">\n\t\t\t\t\t\t\t{argsPreview}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{!hasToolError && !compact && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<ToolHeaderSuccess>ok</ToolHeaderSuccess>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<ToolHeaderMeta>{timeStr}</ToolHeaderMeta>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{hasToolError && !compact && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<ToolHeaderError>error</ToolHeaderError>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<ToolHeaderMeta>{timeStr}</ToolHeaderMeta>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</ToolHeader>\n\n\t\t\t{isExpanded && hasToolError && errorMessage && (\n\t\t\t\t<ToolErrorDisplay error={errorMessage} stack={errorStack} showStack />\n\t\t\t)}\n\n\t\t\t{isExpanded && !hasToolError && hasContent && (\n\t\t\t\t<div className=\"mt-2 ml-5 flex flex-col gap-2 max-w-full\">\n\t\t\t\t\t{hasImages && <ImagePreview images={images} />}\n\t\t\t\t\t{displayResult && !hasImages && (\n\t\t\t\t\t\t<ToolContentBox\n\t\t\t\t\t\t\ttitle=\"result\"\n\t\t\t\t\t\t\ticon={<Plug className=\"h-3 w-3\" />}\n\t\t\t\t\t\t\tcopyText={displayResult}\n\t\t\t\t\t\t\tmaxHeight=\"max-h-[30rem]\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<SyntaxHighlighter\n\t\t\t\t\t\t\t\tlanguage={isJsonResult ? 'json' : 'text'}\n\t\t\t\t\t\t\t\tstyle={syntaxTheme}\n\t\t\t\t\t\t\t\tcustomStyle={{\n\t\t\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\t\t\tpadding: '0.75rem',\n\t\t\t\t\t\t\t\t\tfontSize: '0.75rem',\n\t\t\t\t\t\t\t\t\tlineHeight: '1.5',\n\t\t\t\t\t\t\t\t\tbackground: 'transparent',\n\t\t\t\t\t\t\t\t\tmaxWidth: '100%',\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\twrapLines\n\t\t\t\t\t\t\t\twrapLongLines\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{displayResult}\n\t\t\t\t\t\t\t</SyntaxHighlighter>\n\t\t\t\t\t\t</ToolContentBox>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",
103
+ "import { Plug, Check, X } from 'lucide-react';\nimport type { GenericRendererProps } from './types';\nimport { formatDuration } from './utils';\nimport {\n\tToolHeader,\n\tToolHeaderSeparator,\n\tToolHeaderMeta,\n\tToolHeaderSuccess,\n\tToolHeaderError,\n} from './shared';\n\nexport function LoadMcpToolsRenderer({\n\tcontentJson,\n\ttoolDurationMs,\n\tisExpanded,\n\tonToggle,\n\tcompact,\n}: GenericRendererProps) {\n\tconst result = (contentJson.result || {}) as Record<string, unknown>;\n\tconst args = (contentJson.args || {}) as Record<string, unknown>;\n\tconst timeStr = formatDuration(toolDurationMs);\n\n\tconst requested = Array.isArray(args.tools) ? (args.tools as string[]) : [];\n\tconst loaded = Array.isArray(result.loaded)\n\t\t? (result.loaded as string[])\n\t\t: [];\n\tconst notFound = Array.isArray(result.notFound)\n\t\t? (result.notFound as string[])\n\t\t: [];\n\tconst hasError = result.ok === false;\n\tconst hasContent = loaded.length > 0 || notFound.length > 0;\n\n\treturn (\n\t\t<div className=\"text-xs\">\n\t\t\t<ToolHeader\n\t\t\t\ttoolName=\"load_mcp_tools\"\n\t\t\t\tisExpanded={isExpanded}\n\t\t\t\tonToggle={onToggle}\n\t\t\t\tisError={hasError}\n\t\t\t\tcolorVariant=\"purple\"\n\t\t\t\tcanExpand={hasContent}\n\t\t\t>\n\t\t\t\t{!compact && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<span className=\"text-foreground/60 font-mono text-[11px]\">\n\t\t\t\t\t\t\t{requested.length} tool{requested.length !== 1 ? 's' : ''}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{!hasError && !compact && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<ToolHeaderSuccess>{loaded.length} loaded</ToolHeaderSuccess>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<ToolHeaderMeta>{timeStr}</ToolHeaderMeta>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{hasError && !compact && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<ToolHeaderError>error</ToolHeaderError>\n\t\t\t\t\t\t<ToolHeaderSeparator />\n\t\t\t\t\t\t<ToolHeaderMeta>{timeStr}</ToolHeaderMeta>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</ToolHeader>\n\n\t\t\t{isExpanded && hasContent && (\n\t\t\t\t<div className=\"mt-1.5 ml-5 flex flex-col gap-1\">\n\t\t\t\t\t{loaded.map((name) => (\n\t\t\t\t\t\t<div key={name} className=\"flex items-center gap-1.5 text-[11px]\">\n\t\t\t\t\t\t\t<Check className=\"h-3 w-3 text-green-500\" />\n\t\t\t\t\t\t\t<Plug className=\"h-3 w-3 text-purple-400\" />\n\t\t\t\t\t\t\t<span className=\"font-mono text-foreground/70\">{name}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t\t{notFound.map((name) => (\n\t\t\t\t\t\t<div key={name} className=\"flex items-center gap-1.5 text-[11px]\">\n\t\t\t\t\t\t\t<X className=\"h-3 w-3 text-red-400\" />\n\t\t\t\t\t\t\t<span className=\"font-mono text-foreground/40 line-through\">\n\t\t\t\t\t\t\t\t{name}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",
104
+ "import {\n\tChevronRight,\n\tAlertCircle,\n\tBookOpen,\n\tFileText,\n\tShieldAlert,\n} from 'lucide-react';\nimport type { RendererProps } from './types';\nimport { formatDuration } from './utils';\nimport { ToolErrorDisplay } from './ToolErrorDisplay';\n\ninterface SkillFileInfo {\n\trelativePath: string;\n\tsize: number;\n}\n\ninterface SecurityNotice {\n\ttype: string;\n\tdescription: string;\n\tline?: number;\n}\n\nexport function SkillRenderer({\n\tcontentJson,\n\ttoolDurationMs,\n\tisExpanded,\n\tonToggle,\n\tcompact,\n}: RendererProps) {\n\tconst result = contentJson.result || {};\n\tconst timeStr = formatDuration(toolDurationMs);\n\n\tconst hasToolError =\n\t\ttypeof result === 'object' && 'ok' in result && result.ok === false;\n\tconst errorMessage =\n\t\thasToolError && 'error' in result && typeof result.error === 'string'\n\t\t\t? result.error\n\t\t\t: null;\n\n\tconst name = (result as Record<string, unknown>).name as string | undefined;\n\tconst description = (result as Record<string, unknown>).description as\n\t\t| string\n\t\t| undefined;\n\tconst content = (result as Record<string, unknown>).content as\n\t\t| string\n\t\t| undefined;\n\tconst scope = (result as Record<string, unknown>).scope as string | undefined;\n\tconst availableFiles = (result as Record<string, unknown>).availableFiles as\n\t\t| SkillFileInfo[]\n\t\t| undefined;\n\tconst securityNotices = (result as Record<string, unknown>).securityNotices as\n\t\t| SecurityNotice[]\n\t\t| undefined;\n\n\tconst isSubFile = description?.startsWith('Sub-file:');\n\tconst fileCount = availableFiles?.length ?? 0;\n\tconst noticeCount = securityNotices?.length ?? 0;\n\tconst canExpand = !!content || hasToolError;\n\n\treturn (\n\t\t<div className=\"text-xs\">\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => canExpand && onToggle()}\n\t\t\t\tclassName={`flex items-center gap-2 transition-colors w-full min-w-0 ${\n\t\t\t\t\thasToolError\n\t\t\t\t\t\t? 'text-red-700 dark:text-red-300 hover:text-red-600 dark:hover:text-red-200'\n\t\t\t\t\t\t: canExpand\n\t\t\t\t\t\t\t? 'text-violet-700 dark:text-violet-300 hover:text-violet-600 dark:hover:text-violet-200'\n\t\t\t\t\t\t\t: 'text-violet-700 dark:text-violet-300'\n\t\t\t\t}`}\n\t\t\t>\n\t\t\t\t{canExpand ? (\n\t\t\t\t\t<ChevronRight\n\t\t\t\t\t\tclassName={`h-3 w-3 flex-shrink-0 transition-transform ${isExpanded ? 'rotate-90' : ''}`}\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"w-3 flex-shrink-0\" />\n\t\t\t\t)}\n\t\t\t\t{hasToolError && (\n\t\t\t\t\t<AlertCircle className=\"h-3 w-3 flex-shrink-0 text-red-600 dark:text-red-400\" />\n\t\t\t\t)}\n\t\t\t\t{isSubFile ? (\n\t\t\t\t\t<FileText className=\"h-3 w-3 flex-shrink-0\" />\n\t\t\t\t) : (\n\t\t\t\t\t<BookOpen className=\"h-3 w-3 flex-shrink-0\" />\n\t\t\t\t)}\n\t\t\t\t<span className=\"font-medium flex-shrink-0\">\n\t\t\t\t\tskill{hasToolError ? ' error' : ''}\n\t\t\t\t</span>\n\t\t\t\t{name && !compact && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<span className=\"text-muted-foreground/70 flex-shrink-0\">·</span>\n\t\t\t\t\t\t<span className=\"text-foreground/70 truncate\">\n\t\t\t\t\t\t\t{isSubFile ? description?.replace('Sub-file: ', '') : name}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{scope && !compact && !isSubFile && (\n\t\t\t\t\t<span className=\"text-muted-foreground/80 flex-shrink-0\">\n\t\t\t\t\t\t· {scope}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t{fileCount > 0 && !compact && (\n\t\t\t\t\t<span className=\"text-muted-foreground/80 flex-shrink-0\">\n\t\t\t\t\t\t· {fileCount} file{fileCount !== 1 ? 's' : ''}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t{noticeCount > 0 && !compact && (\n\t\t\t\t\t<span className=\"text-amber-600 dark:text-amber-400 flex-shrink-0 flex items-center gap-0.5\">\n\t\t\t\t\t\t· <ShieldAlert className=\"h-3 w-3 inline\" /> {noticeCount}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t\t{timeStr && !compact && (\n\t\t\t\t\t<span className=\"text-muted-foreground/80 flex-shrink-0\">\n\t\t\t\t\t\t· {timeStr}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</button>\n\t\t\t{isExpanded && hasToolError && errorMessage && (\n\t\t\t\t<ToolErrorDisplay error={errorMessage} />\n\t\t\t)}\n\t\t\t{isExpanded && !hasToolError && (\n\t\t\t\t<div className=\"mt-2 ml-5 space-y-2\">\n\t\t\t\t\t{noticeCount > 0 && securityNotices && (\n\t\t\t\t\t\t<div className=\"bg-amber-50 dark:bg-amber-950/30 border border-amber-200 dark:border-amber-800 rounded-lg p-2.5 space-y-1\">\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-1.5 text-amber-700 dark:text-amber-300 font-medium text-[11px]\">\n\t\t\t\t\t\t\t\t<ShieldAlert className=\"h-3 w-3\" />\n\t\t\t\t\t\t\t\tSecurity Notice{noticeCount > 1 ? 's' : ''}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{securityNotices.map((notice, i) => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={`${notice.type}-${notice.line ?? i}`}\n\t\t\t\t\t\t\t\t\tclassName=\"text-amber-600 dark:text-amber-400 text-[11px] leading-snug\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span className=\"font-mono bg-amber-100 dark:bg-amber-900/40 rounded px-1 py-0.5\">\n\t\t\t\t\t\t\t\t\t\t{notice.type}\n\t\t\t\t\t\t\t\t\t</span>{' '}\n\t\t\t\t\t\t\t\t\t{notice.description}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{description && !isSubFile && (\n\t\t\t\t\t\t<p className=\"text-muted-foreground italic\">{description}</p>\n\t\t\t\t\t)}\n\t\t\t\t\t{content && (\n\t\t\t\t\t\t<div className=\"bg-card/60 border border-border rounded-lg overflow-hidden max-h-96 overflow-y-auto max-w-full\">\n\t\t\t\t\t\t\t<div className=\"p-3 whitespace-pre-wrap font-mono text-xs leading-relaxed\">\n\t\t\t\t\t\t\t\t{content}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{fileCount > 0 && availableFiles && (\n\t\t\t\t\t\t<details className=\"group\">\n\t\t\t\t\t\t\t<summary className=\"text-muted-foreground cursor-pointer hover:text-foreground/80 text-[11px] select-none\">\n\t\t\t\t\t\t\t\t{fileCount} available sub-file{fileCount !== 1 ? 's' : ''}\n\t\t\t\t\t\t\t</summary>\n\t\t\t\t\t\t\t<div className=\"mt-1.5 bg-card/40 border border-border rounded-lg p-2 space-y-0.5 max-h-48 overflow-y-auto\">\n\t\t\t\t\t\t\t\t{availableFiles.map((f) => (\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tkey={f.relativePath}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-between gap-2 font-mono text-[11px]\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-foreground/80 truncate\">\n\t\t\t\t\t\t\t\t\t\t\t{f.relativePath}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground/60 flex-shrink-0 tabular-nums\">\n\t\t\t\t\t\t\t\t\t\t\t{formatFileSize(f.size)}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</details>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nfunction formatFileSize(bytes: number): string {\n\tif (bytes < 1024) return `${bytes}B`;\n\tconst kb = bytes / 1024;\n\tif (kb < 1024) return `${kb.toFixed(1)}KB`;\n\treturn `${(kb / 1024).toFixed(1)}MB`;\n}\n",
105
+ "import { useState, useRef, useEffect } from 'react';\nimport { ChevronDown, ChevronRight } from 'lucide-react';\nimport type { MessagePart } from '../../../types/api';\n\ninterface ReasoningRendererProps {\n\tpart: MessagePart;\n}\n\nexport function ReasoningRenderer({ part }: ReasoningRendererProps) {\n\tconst [isExpanded, setIsExpanded] = useState(true);\n\tconst scrollRef = useRef<HTMLDivElement>(null);\n\tconst isHoveredRef = useRef(false);\n\tlet content = '';\n\tconst data = part.contentJson || part.content;\n\tif (data && typeof data === 'object' && 'text' in data) {\n\t\tcontent = String(data.text);\n\t} else if (typeof data === 'string') {\n\t\tcontent = data;\n\t}\n\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: content dependency is intentional - triggers auto-scroll when new reasoning text streams in\n\tuseEffect(() => {\n\t\tif (\n\t\t\tscrollRef.current &&\n\t\t\tisExpanded &&\n\t\t\t!part.completedAt &&\n\t\t\t!isHoveredRef.current\n\t\t) {\n\t\t\tscrollRef.current.scrollTop = scrollRef.current.scrollHeight;\n\t\t}\n\t}, [content, isExpanded, part.completedAt]);\n\n\tif (!content || !content.trim()) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className=\"w-full\">\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={() => setIsExpanded(!isExpanded)}\n\t\t\t\tclassName=\"flex items-center gap-2 text-xs text-muted-foreground hover:text-foreground transition-colors w-full\"\n\t\t\t>\n\t\t\t\t{isExpanded ? (\n\t\t\t\t\t<ChevronDown className=\"h-3 w-3 flex-shrink-0\" />\n\t\t\t\t) : (\n\t\t\t\t\t<ChevronRight className=\"h-3 w-3 flex-shrink-0\" />\n\t\t\t\t)}\n\t\t\t\t<span className=\"font-medium\">Reasoning</span>\n\t\t\t\t{!part.completedAt && (\n\t\t\t\t\t<span className=\"text-muted-foreground/60 animate-pulse\">\n\t\t\t\t\t\tthinking...\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</button>\n\t\t\t{isExpanded && (\n\t\t\t\t<div\n\t\t\t\t\tref={scrollRef}\n\t\t\t\t\tclassName=\"mt-2 p-3 bg-muted/30 rounded-md border border-border max-h-48 overflow-y-auto\"\n\t\t\t\t\trole=\"log\"\n\t\t\t\t\tonMouseEnter={() => {\n\t\t\t\t\t\tisHoveredRef.current = true;\n\t\t\t\t\t}}\n\t\t\t\t\tonMouseLeave={() => {\n\t\t\t\t\t\tisHoveredRef.current = false;\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"text-sm text-muted-foreground whitespace-pre-wrap font-mono\">\n\t\t\t\t\t\t{content}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",
106
+ "import { useEffect, useMemo, useRef, useState } from 'react';\nimport { Brain, Search } from 'lucide-react';\nimport {\n\ttype CompactActivityEntry,\n\tsummarizeCompactActivities,\n} from './compactActivity';\n\nconst MAX_VISIBLE = 3;\nconst ROW_H = 28;\nconst ROW_GAP = 2;\nconst STEP = ROW_H + ROW_GAP;\nconst ANIM_MS = 320;\nconst EASING = 'cubic-bezier(0.25, 1, 0.5, 1)';\n\ninterface CompactActivityGroupProps {\n\tentries: CompactActivityEntry[];\n\ttitleOverride?: string;\n\tshowLine: boolean;\n\tcollapsed: boolean;\n}\n\nexport function CompactActivityGroup({\n\tentries,\n\ttitleOverride,\n\tshowLine,\n\tcollapsed,\n}: CompactActivityGroupProps) {\n\tconst mountedCollapsed = collapsed && entries.length > 0;\n\tconst [showSummary, setShowSummary] = useState(mountedCollapsed);\n\tconst [latched, setLatched] = useState(mountedCollapsed);\n\tconst [rendered, setRendered] = useState<CompactActivityEntry[]>(() =>\n\t\tentries.slice(-MAX_VISIBLE),\n\t);\n\tconst [slideOffset, setSlideOffset] = useState(0);\n\tconst [isSliding, setIsSliding] = useState(false);\n\tconst [newIds, setNewIds] = useState<Set<string>>(new Set());\n\tconst [animHeight, setAnimHeight] = useState(0);\n\tconst prevEntriesRef = useRef(entries);\n\tconst settleRef = useRef<number | undefined>(undefined);\n\tconst clearNewRef = useRef<number | undefined>(undefined);\n\n\tconst summary = useMemo(() => summarizeCompactActivities(entries), [entries]);\n\tconst summaryTitle = titleOverride || summary.title;\n\tconst summaryText = [summaryTitle, ...summary.details].join('\\u00A0· ');\n\tconst hasReasoning = entries.some((e) => e.toolName === 'reasoning');\n\n\tconst visibleCount = Math.min(MAX_VISIBLE, entries.length);\n\tconst targetH =\n\t\tvisibleCount * ROW_H + Math.max(0, visibleCount - 1) * ROW_GAP;\n\n\tuseEffect(() => {\n\t\tif (!collapsed && !latched) {\n\t\t\tsetShowSummary(false);\n\t\t\treturn;\n\t\t}\n\t\tif (!latched && collapsed) {\n\t\t\tsetLatched(true);\n\t\t}\n\t\tif (showSummary) return;\n\t\tif (entries.length === 0) return;\n\t\tconst t = window.setTimeout(() => setShowSummary(true), 500);\n\t\treturn () => window.clearTimeout(t);\n\t}, [collapsed, showSummary, latched, entries.length]);\n\n\tuseEffect(() => {\n\t\tif (showSummary) return;\n\n\t\trequestAnimationFrame(() => {\n\t\t\tsetAnimHeight(targetH);\n\t\t});\n\t}, [targetH, showSummary]);\n\n\tuseEffect(() => {\n\t\tif (settleRef.current) {\n\t\t\twindow.clearTimeout(settleRef.current);\n\t\t\tsettleRef.current = undefined;\n\t\t}\n\t\tif (clearNewRef.current) {\n\t\t\twindow.clearTimeout(clearNewRef.current);\n\t\t\tclearNewRef.current = undefined;\n\t\t}\n\n\t\tconst prev = prevEntriesRef.current;\n\t\tprevEntriesRef.current = entries;\n\t\tconst nextVisible = entries.slice(-MAX_VISIBLE);\n\n\t\tif (showSummary) {\n\t\t\tsetRendered(nextVisible);\n\t\t\tsetNewIds(new Set());\n\t\t\tsetSlideOffset(0);\n\t\t\tsetIsSliding(false);\n\t\t\treturn;\n\t\t}\n\n\t\tconst isAppend =\n\t\t\tentries.length > prev.length &&\n\t\t\tprev.every((e, i) => e.id === entries[i]?.id);\n\t\tconst appendedCount = isAppend ? entries.length - prev.length : 0;\n\n\t\tif (appendedCount === 0) {\n\t\t\tsetRendered(nextVisible);\n\t\t\tsetNewIds(new Set());\n\t\t\tsetSlideOffset(0);\n\t\t\tsetIsSliding(false);\n\t\t\treturn;\n\t\t}\n\n\t\tconst incoming = new Set(entries.slice(prev.length).map((e) => e.id));\n\t\tsetNewIds(incoming);\n\t\tclearNewRef.current = window.setTimeout(() => {\n\t\t\tsetNewIds(new Set());\n\t\t\tclearNewRef.current = undefined;\n\t\t}, ANIM_MS + 60);\n\n\t\tconst needsSlide = prev.length >= MAX_VISIBLE;\n\n\t\tif (!needsSlide) {\n\t\t\tsetRendered(nextVisible);\n\t\t\tsetSlideOffset(0);\n\t\t\tsetIsSliding(false);\n\t\t\treturn;\n\t\t}\n\n\t\tconst slideCount = Math.min(appendedCount, MAX_VISIBLE);\n\t\tconst prevVisible = prev.slice(-MAX_VISIBLE);\n\t\tconst combined = [...prevVisible, ...nextVisible.slice(-slideCount)];\n\t\tconst uniqueMap = new Map<string, CompactActivityEntry>();\n\t\tfor (const e of combined) uniqueMap.set(e.id, e);\n\t\tconst deduped = Array.from(uniqueMap.values());\n\n\t\tsetRendered(deduped);\n\t\tsetSlideOffset(0);\n\t\tsetIsSliding(false);\n\n\t\trequestAnimationFrame(() => {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tsetIsSliding(true);\n\t\t\t\tsetSlideOffset(-(slideCount * STEP));\n\t\t\t});\n\t\t});\n\n\t\tsettleRef.current = window.setTimeout(() => {\n\t\t\tsetRendered(nextVisible);\n\t\t\tsetSlideOffset(0);\n\t\t\tsetIsSliding(false);\n\t\t\tsettleRef.current = undefined;\n\t\t}, ANIM_MS + 10);\n\t}, [entries, showSummary]);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (settleRef.current) window.clearTimeout(settleRef.current);\n\t\t\tif (clearNewRef.current) window.clearTimeout(clearNewRef.current);\n\t\t};\n\t}, []);\n\n\tconst isLive = !showSummary;\n\tconst showMask = entries.length > MAX_VISIBLE;\n\n\treturn (\n\t\t<div className=\"flex gap-3 pb-2 relative max-w-full overflow-hidden\">\n\t\t\t<div className=\"flex-shrink-0 w-6 flex items-start justify-center relative pt-0.5\">\n\t\t\t\t<div className=\"flex h-5 w-5 shrink-0 items-center justify-center rounded-full relative bg-background\">\n\t\t\t\t\t{hasReasoning ? (\n\t\t\t\t\t\t<Brain className=\"h-4 w-4 text-indigo-600 dark:text-indigo-300\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Search className=\"h-4 w-4 text-amber-600 dark:text-amber-300\" />\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t{showLine && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"absolute left-1/2 -translate-x-1/2 w-[2px] bg-border z-0\"\n\t\t\t\t\t\tstyle={{ top: '1.25rem', bottom: '-0.5rem' }}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t<div className=\"flex-1 min-w-0 pt-0.5\">\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"relative rounded-lg overflow-hidden\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tborder: isLive\n\t\t\t\t\t\t\t? '1px solid hsl(var(--border) / 0.6)'\n\t\t\t\t\t\t\t: '1px solid transparent',\n\t\t\t\t\t\tbackground: isLive ? 'hsl(var(--muted) / 0.2)' : 'transparent',\n\t\t\t\t\t\tpadding: isLive ? '8px 12px' : '0px 0px',\n\t\t\t\t\t\ttransition: `border ${ANIM_MS}ms ${EASING}, background ${ANIM_MS}ms ${EASING}, padding ${ANIM_MS}ms ${EASING}`,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\t\topacity: isLive ? 1 : 0,\n\t\t\t\t\t\t\tmaxHeight: isLive ? `${animHeight + 20}px` : '0px',\n\t\t\t\t\t\t\ttransition: `opacity ${ANIM_MS}ms ${EASING}, max-height ${ANIM_MS}ms ${EASING}`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"text-[11px] font-medium uppercase tracking-[0.18em] text-muted-foreground/70 mb-1\">\n\t\t\t\t\t\t\tExploring\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"relative overflow-hidden\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\theight: `${animHeight}px`,\n\t\t\t\t\t\t\t\ttransition: `height ${ANIM_MS}ms ${EASING}`,\n\t\t\t\t\t\t\t\tmaskImage: showMask\n\t\t\t\t\t\t\t\t\t? 'linear-gradient(to bottom, transparent, black 30%, black 100%)'\n\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\tWebkitMaskImage: showMask\n\t\t\t\t\t\t\t\t\t? 'linear-gradient(to bottom, transparent, black 30%, black 100%)'\n\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName=\"will-change-transform\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\ttransform: `translateY(${slideOffset}px)`,\n\t\t\t\t\t\t\t\t\ttransition: isSliding\n\t\t\t\t\t\t\t\t\t\t? `transform ${ANIM_MS}ms ${EASING}`\n\t\t\t\t\t\t\t\t\t\t: 'none',\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{rendered.map((entry, i) => {\n\t\t\t\t\t\t\t\t\tconst isNew = newIds.has(entry.id);\n\t\t\t\t\t\t\t\t\tconst isLatest = entry.id === entries[entries.length - 1]?.id;\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tkey={entry.id}\n\t\t\t\t\t\t\t\t\t\t\tclassName={`flex items-center px-1 text-xs leading-5 ${\n\t\t\t\t\t\t\t\t\t\t\t\tisLatest\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'text-foreground'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: 'text-muted-foreground/70'\n\t\t\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\theight: `${ROW_H}px`,\n\t\t\t\t\t\t\t\t\t\t\t\tmarginTop: i === 0 ? 0 : `${ROW_GAP}px`,\n\t\t\t\t\t\t\t\t\t\t\t\tanimation: isNew\n\t\t\t\t\t\t\t\t\t\t\t\t\t? `ottoEntryIn ${ANIM_MS}ms ${EASING} both`\n\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"block min-w-0 truncate\">\n\t\t\t\t\t\t\t\t\t\t\t\t{entry.label}\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"flex items-center text-xs\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\topacity: showSummary ? 1 : 0,\n\t\t\t\t\t\t\theight: showSummary ? '20px' : '0px',\n\t\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\t\ttransition: `opacity ${ANIM_MS}ms ${EASING}, height ${ANIM_MS}ms ${EASING}`,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName=\"block min-w-0 truncate leading-5 text-foreground\"\n\t\t\t\t\t\t\ttitle={summaryText}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{summaryText}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<style>{`@keyframes ottoEntryIn { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: translateY(0); } }`}</style>\n\t\t</div>\n\t);\n}\n",
107
+ "import type { MessagePart } from '../../types/api';\n\nconst EXPLORATION_TOOL_NAMES = new Set([\n\t'read',\n\t'ls',\n\t'tree',\n\t'ripgrep',\n\t'grep',\n\t'glob',\n\t'websearch',\n\t'skill',\n\t'query_sessions',\n\t'query_messages',\n\t'search_history',\n\t'get_session_context',\n\t'get_parent_session',\n]);\n\ninterface CompactActivityEntry {\n\tid: string;\n\tlabel: string;\n\ttoolName?: string;\n\tpath?: string;\n\tquery?: string;\n\turl?: string;\n\tstartedAt?: number | null;\n\tcompletedAt?: number | null;\n}\n\ninterface CompactActivitySummary {\n\ttitle: string;\n\tdetails: string[];\n}\n\nfunction getPartPayload(part: MessagePart): Record<string, unknown> | null {\n\tif (part.contentJson && typeof part.contentJson === 'object') {\n\t\treturn part.contentJson;\n\t}\n\n\ttry {\n\t\tif (part.content) {\n\t\t\tconst parsed = JSON.parse(part.content);\n\t\t\tif (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n\t\t\t\treturn parsed as Record<string, unknown>;\n\t\t\t}\n\t\t}\n\t} catch {}\n\n\treturn null;\n}\n\nfunction getToolArgs(part: MessagePart): Record<string, unknown> {\n\tconst payload = getPartPayload(part);\n\tconst args = payload?.args;\n\tif (args && typeof args === 'object' && !Array.isArray(args)) {\n\t\treturn args as Record<string, unknown>;\n\t}\n\treturn {};\n}\n\nfunction getToolResult(part: MessagePart): Record<string, unknown> {\n\tconst payload = getPartPayload(part);\n\tconst result = payload?.result;\n\tif (result && typeof result === 'object' && !Array.isArray(result)) {\n\t\treturn result as Record<string, unknown>;\n\t}\n\treturn {};\n}\n\nfunction truncate(value: string, max = 56): string {\n\treturn value.length > max ? `${value.slice(0, max - 1)}…` : value;\n}\n\nfunction getReasoningText(part: MessagePart): string {\n\tconst payload = getPartPayload(part);\n\tconst text = payload?.text;\n\tif (typeof text === 'string' && text.trim()) {\n\t\treturn text.trim();\n\t}\n\tif (typeof part.content === 'string') {\n\t\treturn part.content.trim();\n\t}\n\treturn '';\n}\n\nfunction firstMeaningfulLine(value: string): string {\n\tconst line = value\n\t\t.split('\\n')\n\t\t.map((item) => item.trim())\n\t\t.find(Boolean);\n\treturn line || value.trim();\n}\n\nfunction stripInlineMarkdown(value: string): string {\n\treturn value\n\t\t.replace(/^Reasoning:\\s*/i, '')\n\t\t.replace(/^[-*+]\\s+/, '')\n\t\t.replace(/\\[(.*?)\\]\\((.*?)\\)/g, '$1')\n\t\t.replace(/[*_`#>~]+/g, '')\n\t\t.replace(/\\s+/g, ' ')\n\t\t.trim();\n}\n\nfunction getStringField(\n\trecord: Record<string, unknown>,\n\t...keys: string[]\n): string | undefined {\n\tfor (const key of keys) {\n\t\tconst value = record[key];\n\t\tif (typeof value === 'string' && value.trim()) {\n\t\t\treturn value.trim();\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/**\n * Returns true when a message part represents exploratory activity that should\n * be grouped in the compact thread renderer.\n */\nexport function isCompactActivityPart(part: MessagePart): boolean {\n\tif (part.type === 'reasoning') {\n\t\treturn true;\n\t}\n\n\tif (part.type !== 'tool_call' && part.type !== 'tool_result') {\n\t\treturn false;\n\t}\n\n\treturn Boolean(part.toolName && EXPLORATION_TOOL_NAMES.has(part.toolName));\n}\n\n/**\n * Converts a part into a compact activity entry suitable for the rolling log.\n */\nexport function getCompactActivityEntry(\n\tpart: MessagePart,\n): CompactActivityEntry | null {\n\tif (part.type === 'reasoning') {\n\t\tconst reasoning = stripInlineMarkdown(\n\t\t\tfirstMeaningfulLine(getReasoningText(part)),\n\t\t);\n\t\treturn {\n\t\t\tid: part.id,\n\t\t\tlabel: reasoning ? truncate(reasoning) : 'Thinking through the approach',\n\t\t\ttoolName: 'reasoning',\n\t\t\tstartedAt: part.startedAt,\n\t\t\tcompletedAt: part.completedAt,\n\t\t};\n\t}\n\n\tif (!part.toolName || !EXPLORATION_TOOL_NAMES.has(part.toolName)) {\n\t\treturn null;\n\t}\n\n\tconst args = getToolArgs(part);\n\tconst result = getToolResult(part);\n\n\tif (part.toolName === 'read') {\n\t\tconst path = getStringField(result, 'path') || getStringField(args, 'path');\n\t\treturn {\n\t\t\tid: part.id,\n\t\t\ttoolName: part.toolName,\n\t\t\tpath,\n\t\t\tlabel: path ? `Reading ${truncate(path)}` : 'Reading file contents',\n\t\t\tstartedAt: part.startedAt,\n\t\t\tcompletedAt: part.completedAt,\n\t\t};\n\t}\n\n\tif (part.toolName === 'ls' || part.toolName === 'tree') {\n\t\tconst path = getStringField(args, 'path') || getStringField(result, 'path');\n\t\treturn {\n\t\t\tid: part.id,\n\t\t\ttoolName: part.toolName,\n\t\t\tpath,\n\t\t\tlabel: path ? `Scanning ${truncate(path)}` : 'Scanning the project',\n\t\t\tstartedAt: part.startedAt,\n\t\t\tcompletedAt: part.completedAt,\n\t\t};\n\t}\n\n\tif (\n\t\tpart.toolName === 'ripgrep' ||\n\t\tpart.toolName === 'grep' ||\n\t\tpart.toolName === 'glob'\n\t) {\n\t\tconst query =\n\t\t\tgetStringField(args, 'query', 'pattern', 'filePattern') ||\n\t\t\tgetStringField(result, 'query', 'pattern');\n\t\treturn {\n\t\t\tid: part.id,\n\t\t\ttoolName: part.toolName,\n\t\t\tquery,\n\t\t\tlabel: query ? `Searching for ${truncate(query, 42)}` : 'Searching code',\n\t\t\tstartedAt: part.startedAt,\n\t\t\tcompletedAt: part.completedAt,\n\t\t};\n\t}\n\n\tif (part.toolName === 'websearch') {\n\t\tconst query = getStringField(args, 'query');\n\t\tconst url = getStringField(args, 'url') || getStringField(result, 'url');\n\t\treturn {\n\t\t\tid: part.id,\n\t\t\ttoolName: part.toolName,\n\t\t\tquery,\n\t\t\turl,\n\t\t\tlabel: query\n\t\t\t\t? `Researching ${truncate(query, 42)}`\n\t\t\t\t: url\n\t\t\t\t\t? `Reviewing ${truncate(url, 42)}`\n\t\t\t\t\t: 'Researching references',\n\t\t\tstartedAt: part.startedAt,\n\t\t\tcompletedAt: part.completedAt,\n\t\t};\n\t}\n\n\tif (part.toolName === 'skill') {\n\t\tconst skillName = getStringField(args, 'name');\n\t\treturn {\n\t\t\tid: part.id,\n\t\t\ttoolName: part.toolName,\n\t\t\tlabel: skillName\n\t\t\t\t? `Loading skill ${truncate(skillName, 36)}`\n\t\t\t\t: 'Loading a skill',\n\t\t\tstartedAt: part.startedAt,\n\t\t\tcompletedAt: part.completedAt,\n\t\t};\n\t}\n\n\treturn {\n\t\tid: part.id,\n\t\ttoolName: part.toolName,\n\t\tlabel: 'Reviewing prior context',\n\t\tstartedAt: part.startedAt,\n\t\tcompletedAt: part.completedAt,\n\t};\n}\n\n/**\n * Builds compact activity entries while de-duplicating completed tool calls.\n */\nexport function buildCompactActivityEntries(\n\tparts: MessagePart[],\n): CompactActivityEntry[] {\n\tconst latestToolResults = new Map<string, MessagePart>();\n\n\tfor (const part of parts) {\n\t\tif (part.type === 'tool_result' && part.toolCallId) {\n\t\t\tlatestToolResults.set(part.toolCallId, part);\n\t\t}\n\t}\n\n\tconst entries: CompactActivityEntry[] = [];\n\n\tfor (const part of parts) {\n\t\tif (\n\t\t\tpart.type === 'tool_call' &&\n\t\t\tpart.toolCallId &&\n\t\t\tlatestToolResults.has(part.toolCallId)\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst entry = getCompactActivityEntry(part);\n\t\tif (entry) {\n\t\t\tentries.push(entry);\n\t\t}\n\t}\n\n\treturn entries;\n}\n\nfunction collectReferencedFiles(entries: CompactActivityEntry[]): Set<string> {\n\tconst files = new Set<string>();\n\n\tfor (const entry of entries) {\n\t\tif (entry.path) {\n\t\t\tfiles.add(entry.path);\n\t\t}\n\t}\n\n\treturn files;\n}\n\nfunction computeElapsedMs(entries: CompactActivityEntry[]): number | null {\n\tlet earliest: number | null = null;\n\tlet latest: number | null = null;\n\n\tfor (const entry of entries) {\n\t\tconst start = entry.startedAt ?? null;\n\t\tconst end = entry.completedAt ?? entry.startedAt ?? null;\n\t\tif (start !== null && (earliest === null || start < earliest)) {\n\t\t\tearliest = start;\n\t\t}\n\t\tif (end !== null && (latest === null || end > latest)) {\n\t\t\tlatest = end;\n\t\t}\n\t}\n\n\tif (earliest !== null && latest !== null && latest > earliest) {\n\t\treturn latest - earliest;\n\t}\n\treturn null;\n}\n\nfunction formatDuration(ms: number): string {\n\tconst secs = Math.round(ms / 1000);\n\tif (secs < 60) return `${secs}s`;\n\tconst mins = Math.floor(secs / 60);\n\tconst rem = secs % 60;\n\treturn rem > 0 ? `${mins}m ${rem}s` : `${mins}m`;\n}\n\n/**\n * Summarizes a rolling sequence of exploratory activity for the compact UI.\n */\nexport function summarizeCompactActivities(\n\tentries: CompactActivityEntry[],\n): CompactActivitySummary {\n\tconst files = collectReferencedFiles(entries);\n\tlet searches = 0;\n\tlet scans = 0;\n\tlet webLookups = 0;\n\tlet reasoning = 0;\n\tlet historyLookups = 0;\n\n\tfor (const entry of entries) {\n\t\tswitch (entry.toolName) {\n\t\t\tcase 'reasoning':\n\t\t\t\treasoning += 1;\n\t\t\t\tbreak;\n\t\t\tcase 'read':\n\t\t\t\tbreak;\n\t\t\tcase 'ls':\n\t\t\tcase 'tree':\n\t\t\t\tscans += 1;\n\t\t\t\tbreak;\n\t\t\tcase 'ripgrep':\n\t\t\tcase 'grep':\n\t\t\tcase 'glob':\n\t\t\t\tsearches += 1;\n\t\t\t\tbreak;\n\t\t\tcase 'websearch':\n\t\t\t\twebLookups += 1;\n\t\t\t\tbreak;\n\t\t\tcase 'skill':\n\t\t\tcase 'query_sessions':\n\t\t\tcase 'query_messages':\n\t\t\tcase 'search_history':\n\t\t\tcase 'get_session_context':\n\t\t\tcase 'get_parent_session':\n\t\t\t\thistoryLookups += 1;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tconst hasProjectReview = files.size > 0 || scans > 0;\n\tconst elapsedMs = computeElapsedMs(entries);\n\tconst durationStr = elapsedMs !== null ? formatDuration(elapsedMs) : null;\n\n\tconst isReasoningOnly =\n\t\treasoning > 0 &&\n\t\tfiles.size === 0 &&\n\t\tsearches === 0 &&\n\t\tscans === 0 &&\n\t\twebLookups === 0 &&\n\t\thistoryLookups === 0;\n\n\tconst title = isReasoningOnly\n\t\t? durationStr\n\t\t\t? `Thought for ${durationStr}`\n\t\t\t: 'Thought through the approach'\n\t\t: webLookups > 0\n\t\t\t? hasProjectReview || searches > 0\n\t\t\t\t? 'Researched and reviewed the project'\n\t\t\t\t: 'Researched references'\n\t\t\t: historyLookups > 0 && searches > 0\n\t\t\t\t? 'Reviewed context and searched code'\n\t\t\t\t: hasProjectReview && searches > 0\n\t\t\t\t\t? 'Reviewed files and searched code'\n\t\t\t\t\t: scans > 0\n\t\t\t\t\t\t? 'Explored project structure'\n\t\t\t\t\t\t: files.size > 0\n\t\t\t\t\t\t\t? 'Reviewed project files'\n\t\t\t\t\t\t\t: historyLookups > 0\n\t\t\t\t\t\t\t\t? 'Reviewed prior context'\n\t\t\t\t\t\t\t\t: 'Thought through the approach';\n\n\tconst details: string[] = [];\n\tif (!isReasoningOnly && durationStr) {\n\t\tdetails.push(durationStr);\n\t}\n\tif (files.size > 0) {\n\t\tdetails.push(`${files.size} ${files.size === 1 ? 'file' : 'files'}`);\n\t}\n\tif (searches > 0) {\n\t\tdetails.push(`${searches} ${searches === 1 ? 'search' : 'searches'}`);\n\t}\n\tif (scans > 0 && files.size === 0) {\n\t\tdetails.push(`${scans} ${scans === 1 ? 'scan' : 'scans'}`);\n\t}\n\tif (webLookups > 0) {\n\t\tdetails.push(\n\t\t\t`${webLookups} ${webLookups === 1 ? 'web lookup' : 'web lookups'}`,\n\t\t);\n\t}\n\tif (historyLookups > 0 && title !== 'Reviewed prior context') {\n\t\tdetails.push('prior context');\n\t}\n\tif (reasoning > 0 && !isReasoningOnly) {\n\t\tdetails.push('reasoning');\n\t}\n\tif (details.length === 0 && reasoning === 0) {\n\t\tdetails.push(\n\t\t\t`${entries.length} ${entries.length === 1 ? 'step' : 'steps'}`,\n\t\t);\n\t}\n\n\treturn { title, details };\n}\n\nexport type { CompactActivityEntry, CompactActivitySummary };\n",
108
+ "import { useQuery } from '@tanstack/react-query';\n\nexport type QueueState = {\n\tcurrentMessageId: string | null;\n\tqueuedMessages: Array<{ messageId: string; position: number }>;\n\tqueueLength: number;\n};\n\nconst defaultQueueState: QueueState = {\n\tcurrentMessageId: null,\n\tqueuedMessages: [],\n\tqueueLength: 0,\n};\n\nexport function useQueueState(sessionId: string | undefined): QueueState {\n\tconst { data } = useQuery<QueueState>({\n\t\tqueryKey: ['queueState', sessionId],\n\t\tqueryFn: () => defaultQueueState,\n\t\tenabled: !!sessionId,\n\t\tinitialData: defaultQueueState,\n\t\tstaleTime: Infinity,\n\t});\n\n\treturn data ?? defaultQueueState;\n}\n\nexport function useMessageQueuePosition(\n\tsessionId: string | undefined,\n\tmessageId: string,\n): { isQueued: boolean; isRunning: boolean; position: number | null } {\n\tconst queueState = useQueueState(sessionId);\n\n\tif (!sessionId || !queueState) {\n\t\treturn { isQueued: false, isRunning: false, position: null };\n\t}\n\n\tif (queueState.currentMessageId === messageId) {\n\t\treturn { isQueued: false, isRunning: true, position: null };\n\t}\n\n\tconst queuedItem = queueState.queuedMessages.find(\n\t\t(item) => item.messageId === messageId,\n\t);\n\n\tif (queuedItem) {\n\t\treturn { isQueued: true, isRunning: false, position: queuedItem.position };\n\t}\n\n\treturn { isQueued: false, isRunning: false, position: null };\n}\n",
109
+ "import { useState, useId } from 'react';\nimport { GitBranch, Loader2 } from 'lucide-react';\nimport { Modal } from '../ui/Modal';\nimport { useCreateBranch } from '../../hooks/useBranch';\nimport { useSession } from '../../hooks/useSessions';\nimport type { Message } from '../../types/api';\n\ninterface BranchModalProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n\tsessionId: string;\n\tmessage: Message;\n\tonBranchCreated?: (newSessionId: string) => void;\n}\n\nexport function BranchModal({\n\tisOpen,\n\tonClose,\n\tsessionId,\n\tmessage,\n\tonBranchCreated,\n}: BranchModalProps) {\n\tconst session = useSession(sessionId);\n\tconst createBranch = useCreateBranch(sessionId);\n\n\tconst [title, setTitle] = useState('');\n\tconst [useCurrentConfig, setUseCurrentConfig] = useState(true);\n\tconst titleId = useId();\n\tconst configId = useId();\n\n\tconst messagePreview =\n\t\tmessage.parts?.find((p) => p.type === 'text')?.content || '';\n\tconst parsedPreview = (() => {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(messagePreview);\n\t\t\treturn parsed?.text?.slice(0, 100) || '';\n\t\t} catch {\n\t\t\treturn messagePreview.slice(0, 100);\n\t\t}\n\t})();\n\n\tconst handleSubmit = async (e: React.FormEvent) => {\n\t\te.preventDefault();\n\n\t\ttry {\n\t\t\tconst result = await createBranch.mutateAsync({\n\t\t\t\tfromMessageId: message.id,\n\t\t\t\ttitle: title.trim() || undefined,\n\t\t\t\tprovider: useCurrentConfig ? session?.provider : undefined,\n\t\t\t\tmodel: useCurrentConfig ? session?.model : undefined,\n\t\t\t\tagent: useCurrentConfig ? session?.agent : undefined,\n\t\t\t});\n\n\t\t\tonClose();\n\t\t\tif (onBranchCreated && result.session) {\n\t\t\t\tonBranchCreated(result.session.id);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to create branch:', error);\n\t\t}\n\t};\n\n\treturn (\n\t\t<Modal\n\t\t\tisOpen={isOpen}\n\t\t\tonClose={onClose}\n\t\t\ttitle={\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<GitBranch className=\"h-5 w-5 text-primary\" />\n\t\t\t\t\t<span>Branch Session</span>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\tmaxWidth=\"md\"\n\t\t>\n\t\t\t<form onSubmit={handleSubmit} className=\"space-y-4\">\n\t\t\t\t<div className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t<p>Creating branch from message:</p>\n\t\t\t\t\t<p className=\"mt-1 p-2 bg-muted/50 rounded text-foreground italic truncate\">\n\t\t\t\t\t\t\"{parsedPreview}...\"\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t<label\n\t\t\t\t\t\thtmlFor={titleId}\n\t\t\t\t\t\tclassName=\"block text-sm font-medium text-foreground\"\n\t\t\t\t\t>\n\t\t\t\t\t\tBranch Title (optional)\n\t\t\t\t\t</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid={titleId}\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tvalue={title}\n\t\t\t\t\t\tonChange={(e) => setTitle(e.target.value)}\n\t\t\t\t\t\tplaceholder={`Branch of ${session?.title || 'Untitled'}`}\n\t\t\t\t\t\tclassName=\"w-full px-3 py-2 bg-background border border-border rounded-md text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-primary/50\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<input\n\t\t\t\t\t\tid={configId}\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\tchecked={useCurrentConfig}\n\t\t\t\t\t\tonChange={(e) => setUseCurrentConfig(e.target.checked)}\n\t\t\t\t\t\tclassName=\"h-4 w-4 rounded border-border text-primary focus:ring-primary/50\"\n\t\t\t\t\t/>\n\t\t\t\t\t<label htmlFor={configId} className=\"text-sm text-foreground\">\n\t\t\t\t\t\tUse same provider/model/agent as parent\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\n\t\t\t\t{session && (\n\t\t\t\t\t<div className=\"text-xs text-muted-foreground bg-muted/30 rounded p-2\">\n\t\t\t\t\t\t<div className=\"flex gap-4\">\n\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t<strong>Provider:</strong> {session.provider}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t<strong>Model:</strong> {session.model}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t<strong>Agent:</strong> {session.agent}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<div className=\"flex justify-end gap-2 pt-2\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\tclassName=\"px-4 py-2 text-sm text-muted-foreground hover:text-foreground transition-colors\"\n\t\t\t\t\t>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\tdisabled={createBranch.isPending}\n\t\t\t\t\t\tclassName=\"px-4 py-2 text-sm bg-primary text-primary-foreground rounded-md hover:bg-primary/90 disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-2\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{createBranch.isPending ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<Loader2 className=\"h-4 w-4 animate-spin\" />\n\t\t\t\t\t\t\t\tCreating...\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<GitBranch className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t\tCreate Branch\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\n\t\t\t\t{createBranch.isError && (\n\t\t\t\t\t<p className=\"text-sm text-red-500\">\n\t\t\t\t\t\t{createBranch.error?.message || 'Failed to create branch'}\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\t\t\t</form>\n\t\t</Modal>\n\t);\n}\n",
110
+ "import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiClient } from '../lib/api-client';\nimport type { CreateBranchRequest } from '../types/api';\nimport { sessionsQueryKey } from './useSessions';\n\nexport function useCreateBranch(sessionId: string | undefined) {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: (data: CreateBranchRequest) => {\n\t\t\tif (!sessionId) throw new Error('No session ID');\n\t\t\treturn apiClient.createBranch(sessionId, data);\n\t\t},\n\t\tonSuccess: () => {\n\t\t\tqueryClient.invalidateQueries({ queryKey: sessionsQueryKey });\n\t\t\tif (sessionId) {\n\t\t\t\tqueryClient.invalidateQueries({\n\t\t\t\t\tqueryKey: ['branches', sessionId],\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t});\n}\n\nexport function useBranches(sessionId: string | undefined) {\n\treturn useQuery({\n\t\tqueryKey: ['branches', sessionId],\n\t\tqueryFn: () => {\n\t\t\tif (!sessionId) throw new Error('No session ID');\n\t\t\treturn apiClient.listBranches(sessionId);\n\t\t},\n\t\tenabled: Boolean(sessionId),\n\t});\n}\n\nexport function useParentSession(sessionId: string | undefined) {\n\treturn useQuery({\n\t\tqueryKey: ['parentSession', sessionId],\n\t\tqueryFn: () => {\n\t\t\tif (!sessionId) throw new Error('No session ID');\n\t\t\treturn apiClient.getParentSession(sessionId);\n\t\t},\n\t\tenabled: Boolean(sessionId),\n\t});\n}\n",
111
+ "import { memo, useState, type ComponentPropsWithoutRef } from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport {\n\tUser,\n\tX,\n\tFileText,\n\tFileIcon,\n\tClock,\n\tTrash2,\n\tRotateCcw,\n\tFlaskConical,\n} from 'lucide-react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport type { Message } from '../../types/api';\nimport { useMessageQueuePosition } from '../../hooks/useQueueState';\nimport { useQueueStore } from '../../stores/queueStore';\nimport { apiClient } from '../../lib/api-client';\nimport { parseResearchContext } from '../../lib/parseResearchContext';\n\ninterface UserMessageGroupProps {\n\tsessionId?: string;\n\tmessage: Message;\n\tisFirst: boolean;\n\tnextAssistantMessageId?: string;\n}\n\ninterface ImageData {\n\tdata: string;\n\tmediaType: string;\n}\n\ninterface FileData {\n\ttype: 'image' | 'pdf' | 'text';\n\tname: string;\n\tdata: string;\n\tmediaType: string;\n\ttextContent?: string;\n}\n\nexport const UserMessageGroup = memo(\n\tfunction UserMessageGroup({\n\t\tsessionId,\n\t\tmessage,\n\t\tnextAssistantMessageId,\n\t}: UserMessageGroupProps) {\n\t\tconst [expandedImage, setExpandedImage] = useState<string | null>(null);\n\t\tconst parts = message.parts || [];\n\t\tconst queryClient = useQueryClient();\n\n\t\tconst { isQueued, position } = useMessageQueuePosition(\n\t\t\tsessionId,\n\t\t\tnextAssistantMessageId ?? '',\n\t\t);\n\t\tconst setPendingRestoreText = useQueueStore(\n\t\t\t(state) => state.setPendingRestoreText,\n\t\t);\n\n\t\tconst textParts = parts.filter((p) => p.type === 'text');\n\t\tconst imageParts = parts.filter((p) => p.type === 'image');\n\t\tconst fileParts = parts.filter((p) => p.type === 'file');\n\n\t\tconst firstTextPart = textParts[0];\n\t\tlet rawContent = '';\n\n\t\tif (firstTextPart) {\n\t\t\tconst data = firstTextPart.contentJson || firstTextPart.content;\n\t\t\tif (data && typeof data === 'object' && 'text' in data) {\n\t\t\t\trawContent = String(data.text);\n\t\t\t} else if (typeof data === 'string') {\n\t\t\t\trawContent = data;\n\t\t\t} else if (data) {\n\t\t\t\trawContent = JSON.stringify(data, null, 2);\n\t\t\t}\n\t\t}\n\n\t\tconst { researchContexts: parsedResearchContexts, cleanContent: content } =\n\t\t\tparseResearchContext(rawContent);\n\n\t\tconst images: Array<{ id: string; src: string }> = [];\n\t\tfor (const part of imageParts) {\n\t\t\ttry {\n\t\t\t\tconst data = part.contentJson || JSON.parse(part.content || '{}');\n\t\t\t\tif (data && typeof data === 'object' && 'data' in data) {\n\t\t\t\t\tconst imgData = data as ImageData;\n\t\t\t\t\tconst src = `data:${imgData.mediaType};base64,${imgData.data}`;\n\t\t\t\t\timages.push({ id: part.id, src });\n\t\t\t\t}\n\t\t\t} catch {}\n\t\t}\n\n\t\tconst files: Array<{ id: string; type: string; name: string }> = [];\n\t\tfor (const part of fileParts) {\n\t\t\ttry {\n\t\t\t\tconst data = part.contentJson || JSON.parse(part.content || '{}');\n\t\t\t\tif (data && typeof data === 'object' && 'type' in data) {\n\t\t\t\t\tconst fileData = data as FileData;\n\t\t\t\t\tif (fileData.type === 'image' && fileData.data) {\n\t\t\t\t\t\tconst src = `data:${fileData.mediaType};base64,${fileData.data}`;\n\t\t\t\t\t\timages.push({ id: part.id, src });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfiles.push({\n\t\t\t\t\t\t\tid: part.id,\n\t\t\t\t\t\t\ttype: fileData.type,\n\t\t\t\t\t\t\tname: fileData.name,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {}\n\t\t}\n\n\t\tconst formatTime = (ts?: number) => {\n\t\t\tif (!ts) return '';\n\t\t\tconst date = new Date(ts);\n\t\t\treturn date.toLocaleTimeString([], {\n\t\t\t\thour: '2-digit',\n\t\t\t\tminute: '2-digit',\n\t\t\t});\n\t\t};\n\n\t\tconst hasContent = content.trim().length > 0;\n\t\tconst hasImages = images.length > 0;\n\t\tconst hasFiles = files.length > 0;\n\t\tconst hasResearchContexts = parsedResearchContexts.length > 0;\n\n\t\tif (!hasContent && !hasImages && !hasFiles && !hasResearchContexts)\n\t\t\treturn null;\n\n\t\tconst handleCancel = async () => {\n\t\t\tif (!sessionId || !nextAssistantMessageId) return;\n\t\t\tsetPendingRestoreText(content);\n\t\t\ttry {\n\t\t\t\tawait apiClient.removeFromQueue(sessionId, nextAssistantMessageId);\n\t\t\t\t// Invalidate messages to refresh UI\n\t\t\t\tqueryClient.invalidateQueries({ queryKey: ['messages', sessionId] });\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error('Failed to cancel queued message:', err);\n\t\t\t}\n\t\t};\n\n\t\tconst handleDelete = async () => {\n\t\t\tif (!sessionId || !nextAssistantMessageId) return;\n\t\t\ttry {\n\t\t\t\tawait apiClient.removeFromQueue(sessionId, nextAssistantMessageId);\n\t\t\t\t// Invalidate messages to refresh UI\n\t\t\t\tqueryClient.invalidateQueries({ queryKey: ['messages', sessionId] });\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error('Failed to delete queued message:', err);\n\t\t\t}\n\t\t};\n\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<div className=\"relative pb-8 pt-6\">\n\t\t\t\t\t<div className=\"flex gap-3 md:gap-4 justify-end\">\n\t\t\t\t\t\t<div className=\"flex flex-col items-end min-w-0 flex-1 max-w-[calc(100%-3rem)] md:max-w-2xl\">\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2 text-xs text-muted-foreground pb-2 justify-end\">\n\t\t\t\t\t\t\t\t<span className=\"font-medium text-emerald-700 dark:text-emerald-300\">\n\t\t\t\t\t\t\t\t\tYou\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{message.createdAt && <span>·</span>}\n\t\t\t\t\t\t\t\t{message.createdAt && (\n\t\t\t\t\t\t\t\t\t<span>{formatTime(message.createdAt)}</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{isQueued && (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<span>·</span>\n\t\t\t\t\t\t\t\t\t\t<span className=\"inline-flex items-center gap-1 text-amber-600 dark:text-amber-400\">\n\t\t\t\t\t\t\t\t\t\t\t<Clock className=\"h-3 w-3\" />\n\t\t\t\t\t\t\t\t\t\t\tQueued\n\t\t\t\t\t\t\t\t\t\t\t{position !== null && position > 0\n\t\t\t\t\t\t\t\t\t\t\t\t? ` #${position + 1}`\n\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"inline-block max-w-full text-sm text-foreground leading-relaxed bg-emerald-500/5 border border-emerald-500/20 rounded-xl px-4 py-3 [word-break:break-word] overflow-hidden\">\n\t\t\t\t\t\t\t\t{hasImages && (\n\t\t\t\t\t\t\t\t\t<div className=\"flex flex-wrap gap-2 mb-2\">\n\t\t\t\t\t\t\t\t\t\t{images.map((img) => (\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\tkey={img.id}\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => setExpandedImage(img.src)}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-16 h-16 rounded-lg overflow-hidden bg-muted hover:ring-2 hover:ring-primary/50 transition-all\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\t\t\tsrc={img.src}\n\t\t\t\t\t\t\t\t\t\t\t\t\talt=\"Attachment\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-full h-full object-cover\"\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{hasFiles && (\n\t\t\t\t\t\t\t\t\t<div className=\"flex flex-wrap gap-2 mb-2\">\n\t\t\t\t\t\t\t\t\t\t{files.map((file) => (\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\tkey={file.id}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-2 px-3 py-2 rounded-lg bg-muted/50 border border-border\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{file.type === 'pdf' ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<FileIcon className=\"w-4 h-4 text-red-500 flex-shrink-0\" />\n\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<FileText className=\"w-4 h-4 text-blue-500 flex-shrink-0\" />\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-xs truncate max-w-[150px]\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{file.name}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{hasResearchContexts && (\n\t\t\t\t\t\t\t\t\t<div className=\"flex flex-wrap gap-2 mb-2\">\n\t\t\t\t\t\t\t\t\t\t{parsedResearchContexts.map((ctx) => (\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\tkey={ctx.id}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-2 px-3 py-2 rounded-lg bg-teal-500/10 border border-teal-500/30\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<FlaskConical className=\"w-4 h-4 text-teal-500 flex-shrink-0\" />\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-xs text-teal-600 dark:text-teal-400\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ctx.label}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{hasContent && (\n\t\t\t\t\t\t\t\t\t<div className=\"prose prose-invert prose-sm [&>*:first-child]:mt-0 [&>*:last-child]:mb-0 [&_*]:[word-break:break-word] [&_*]:overflow-wrap-anywhere whitespace-pre-wrap\">\n\t\t\t\t\t\t\t\t\t\t<ReactMarkdown\n\t\t\t\t\t\t\t\t\t\t\tremarkPlugins={[remarkGfm]}\n\t\t\t\t\t\t\t\t\t\t\tcomponents={{\n\t\t\t\t\t\t\t\t\t\t\t\ta: ({\n\t\t\t\t\t\t\t\t\t\t\t\t\thref,\n\t\t\t\t\t\t\t\t\t\t\t\t\tchildren,\n\t\t\t\t\t\t\t\t\t\t\t\t\t...props\n\t\t\t\t\t\t\t\t\t\t\t\t}: ComponentPropsWithoutRef<'a'>) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\t\t\t\t\thref={href}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (window.self !== window.top && href) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twindow.parent.postMessage(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype: 'otto-open-url',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\turl: href,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'*',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{...props}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{content.replace(/\\n/g, ' \\n')}\n\t\t\t\t\t\t\t\t\t\t</ReactMarkdown>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{isQueued && (\n\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2 mt-2\">\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleCancel}\n\t\t\t\t\t\t\t\t\t\tclassName=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs rounded-md bg-muted hover:bg-muted/80 text-muted-foreground hover:text-foreground transition-colors\"\n\t\t\t\t\t\t\t\t\t\ttitle=\"Cancel and restore to input\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<RotateCcw className=\"h-3 w-3\" />\n\t\t\t\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleDelete}\n\t\t\t\t\t\t\t\t\t\tclassName=\"inline-flex items-center gap-1.5 px-2.5 py-1 text-xs rounded-md bg-destructive/10 hover:bg-destructive/20 text-destructive transition-colors\"\n\t\t\t\t\t\t\t\t\t\ttitle=\"Delete from queue\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Trash2 className=\"h-3 w-3\" />\n\t\t\t\t\t\t\t\t\t\tDelete\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"flex-shrink-0 w-8 flex items-start justify-center\">\n\t\t\t\t\t\t\t<div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-full border-2 border-emerald-500/50 bg-emerald-500/20 dark:bg-emerald-500/10 relative bg-background\">\n\t\t\t\t\t\t\t\t<User className=\"h-4 w-4 text-emerald-700 dark:text-emerald-300\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t{expandedImage && (\n\t\t\t\t\t<div\n\t\t\t\t\t\trole=\"dialog\"\n\t\t\t\t\t\taria-modal=\"true\"\n\t\t\t\t\t\tclassName=\"fixed inset-0 z-50 flex items-center justify-center bg-black/80 p-4\"\n\t\t\t\t\t\tonClick={() => setExpandedImage(null)}\n\t\t\t\t\t\tonKeyDown={(e) => e.key === 'Escape' && setExpandedImage(null)}\n\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => setExpandedImage(null)}\n\t\t\t\t\t\t\tclassName=\"absolute top-4 right-4 p-2 rounded-full bg-white/10 hover:bg-white/20 transition-colors\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<X className=\"w-6 h-6 text-white\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc={expandedImage}\n\t\t\t\t\t\t\talt=\"Expanded attachment\"\n\t\t\t\t\t\t\tclassName=\"max-w-full max-h-full object-contain rounded-lg\"\n\t\t\t\t\t\t\tonClick={(e) => e.stopPropagation()}\n\t\t\t\t\t\t\tonKeyDown={(e) => e.key === 'Enter' && e.stopPropagation()}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</>\n\t\t);\n\t},\n\t(prevProps, nextProps) => {\n\t\tconst prevFirstPart = prevProps.message.parts?.[0];\n\t\tconst nextFirstPart = nextProps.message.parts?.[0];\n\n\t\treturn (\n\t\t\tprevProps.message.id === nextProps.message.id &&\n\t\t\tprevFirstPart?.content === nextFirstPart?.content &&\n\t\t\tprevFirstPart?.contentJson === nextFirstPart?.contentJson &&\n\t\t\tprevProps.message.createdAt === nextProps.message.createdAt &&\n\t\t\tprevProps.message.parts?.length === nextProps.message.parts?.length &&\n\t\t\tprevProps.sessionId === nextProps.sessionId &&\n\t\t\tprevProps.nextAssistantMessageId === nextProps.nextAssistantMessageId\n\t\t);\n\t},\n);\n",
112
+ "import { useMemo } from 'react';\nimport {\n\testimateModelCostUsd,\n\ttype ProviderId,\n\tgetModelInfo,\n} from '@ottocode/sdk/browser';\nimport type { Session } from '../../types/api';\nimport {\n\tClock,\n\tDollarSign,\n\tGitBranch,\n\tArrowUpRight,\n\tShare2,\n\tExternalLink,\n\tRefreshCw,\n} from 'lucide-react';\nimport { useParentSession } from '../../hooks/useBranch';\nimport { useShareStatus } from '../../hooks/useShareStatus';\nimport { ProviderLogo } from '../common/ProviderLogo';\nimport { openUrl } from '../../lib/open-url';\nimport { EditableTitle } from './EditableTitle';\n\ninterface SessionHeaderProps {\n\tsession: Session;\n\tonNavigateToSession?: (sessionId: string) => void;\n}\n\nexport function SessionHeader({\n\tsession,\n\tonNavigateToSession,\n}: SessionHeaderProps) {\n\tconst { data: parentData } = useParentSession(\n\t\tsession.sessionType === 'branch' ? session.id : undefined,\n\t);\n\tconst { data: shareStatus } = useShareStatus(session.id);\n\n\tconst estimatedCost = useMemo(() => {\n\t\tconst inputTokens = session.totalInputTokens || 0;\n\t\tconst outputTokens = session.totalOutputTokens || 0;\n\t\tconst cachedInputTokens = session.totalCachedTokens || 0;\n\t\tconst cacheCreationInputTokens = session.totalCacheCreationTokens || 0;\n\t\treturn (\n\t\t\testimateModelCostUsd(session.provider as ProviderId, session.model, {\n\t\t\t\tinputTokens,\n\t\t\t\toutputTokens,\n\t\t\t\tcachedInputTokens,\n\t\t\t\tcacheCreationInputTokens,\n\t\t\t}) ?? 0\n\t\t);\n\t}, [\n\t\tsession.provider,\n\t\tsession.model,\n\t\tsession.totalInputTokens,\n\t\tsession.totalOutputTokens,\n\t\tsession.totalCachedTokens,\n\t\tsession.totalCacheCreationTokens,\n\t]);\n\n\tconst formatDuration = (ms: number | null) => {\n\t\tif (!ms) return '0s';\n\t\tconst seconds = Math.floor(ms / 1000);\n\t\tconst minutes = Math.floor(seconds / 60);\n\t\tconst hours = Math.floor(minutes / 60);\n\t\tif (hours > 0) return `${hours}h ${minutes % 60}m`;\n\t\tif (minutes > 0) return `${minutes}m ${seconds % 60}s`;\n\t\treturn `${seconds}s`;\n\t};\n\n\tconst formatNumber = (num: number) => num.toLocaleString('en-US');\n\n\tconst formatCompactNumber = (num: number) => {\n\t\tif (num >= 1000000) return `${(num / 1000000).toFixed(1)}M`;\n\t\tif (num >= 1000) return `${(num / 1000).toFixed(1)}K`;\n\t\treturn num.toString();\n\t};\n\n\tconst contextTokens = session.currentContextTokens || 0;\n\tconst outputTokens = session.totalOutputTokens || 0;\n\n\tconst isBranch = session.sessionType === 'branch';\n\tconst parentSession = parentData?.parent;\n\n\t// Calculate context usage for color indication\n\tconst contextLimit = useMemo(() => {\n\t\tconst info = getModelInfo(session.provider as ProviderId, session.model);\n\t\treturn info?.limit?.context;\n\t}, [session.provider, session.model]);\n\n\tconst contextUsagePercent = contextLimit\n\t\t? (contextTokens / contextLimit) * 100\n\t\t: 0;\n\n\tconst getContextColorClass = () => {\n\t\tif (contextUsagePercent >= 90) return 'text-red-600 dark:text-red-400';\n\t\tif (contextUsagePercent >= 70) return 'text-amber-600 dark:text-amber-400';\n\t\treturn 'text-foreground';\n\t};\n\n\treturn (\n\t\t<div className=\"border-b border-border bg-background/95 backdrop-blur-sm\">\n\t\t\t<div className=\"max-w-3xl mx-auto px-6 py-6\">\n\t\t\t\t{isBranch && (\n\t\t\t\t\t<div className=\"flex items-center gap-2 mb-3 text-sm\">\n\t\t\t\t\t\t<GitBranch className=\"h-4 w-4 text-violet-500\" />\n\t\t\t\t\t\t<span className=\"text-violet-600 dark:text-violet-400 font-medium\">\n\t\t\t\t\t\t\tBranch\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{parentSession && (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">from</span>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={() => onNavigateToSession?.(parentSession.id)}\n\t\t\t\t\t\t\t\t\tclassName=\"text-primary hover:underline flex items-center gap-1\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{parentSession.title ||\n\t\t\t\t\t\t\t\t\t\t`Session ${parentSession.id.slice(0, 8)}`}\n\t\t\t\t\t\t\t\t\t<ArrowUpRight className=\"h-3 w-3\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{!parentSession && session.parentSessionId && (\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground italic text-xs\">\n\t\t\t\t\t\t\t\t(parent deleted)\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t<EditableTitle\n\t\t\t\t\t\tsessionId={session.id}\n\t\t\t\t\t\ttitle={session.title}\n\t\t\t\t\t\tclassName=\"text-2xl font-semibold text-foreground leading-tight\"\n\t\t\t\t\t/>\n\n\t\t\t\t\t{shareStatus?.shared && (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => openUrl(shareStatus.url)}\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 px-2 py-1 rounded-md bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 hover:bg-emerald-500/20 transition-colors text-xs font-medium flex-shrink-0\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Share2 className=\"h-3 w-3\" />\n\t\t\t\t\t\t\t<span>Shared</span>\n\t\t\t\t\t\t\t{shareStatus.pendingMessages &&\n\t\t\t\t\t\t\tshareStatus.pendingMessages > 0 ? (\n\t\t\t\t\t\t\t\t<span className=\"flex items-center gap-0.5 text-amber-600 dark:text-amber-400\">\n\t\t\t\t\t\t\t\t\t<RefreshCw className=\"h-2.5 w-2.5\" />\n\t\t\t\t\t\t\t\t\t{shareStatus.pendingMessages}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<ExternalLink className=\"h-2.5 w-2.5 opacity-60\" />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"flex flex-wrap items-center gap-x-5 gap-y-2 mt-4 text-sm text-muted-foreground\">\n\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5\"\n\t\t\t\t\t\t\ttitle={`Current context window: ${formatNumber(contextTokens)} tokens`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span className=\"text-xs opacity-70\">ctx</span>\n\t\t\t\t\t\t\t<span className={`font-medium ${getContextColorClass()}`}>\n\t\t\t\t\t\t\t\t{formatCompactNumber(contextTokens)}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5\"\n\t\t\t\t\t\t\ttitle={`Total output: ${formatNumber(outputTokens)} tokens`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span className=\"text-xs opacity-70\">out</span>\n\t\t\t\t\t\t\t<span className=\"font-medium text-foreground\">\n\t\t\t\t\t\t\t\t{formatCompactNumber(outputTokens)}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t<Clock className=\"w-4 h-4\" />\n\t\t\t\t\t\t<span className=\"font-medium text-foreground\">\n\t\t\t\t\t\t\t{formatDuration(session.totalToolTimeMs)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{estimatedCost > 0 && (\n\t\t\t\t\t\t<div className=\"flex items-center gap-1.5\">\n\t\t\t\t\t\t\t<DollarSign className=\"w-4 h-4\" />\n\t\t\t\t\t\t\t<span className=\"font-medium text-foreground\">\n\t\t\t\t\t\t\t\t{estimatedCost.toFixed(4)}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<div className=\"flex items-center gap-2 ml-auto\">\n\t\t\t\t\t\t<ProviderLogo provider={session.provider} size={18} />\n\t\t\t\t\t\t<span className=\"font-medium text-foreground truncate max-w-48\">\n\t\t\t\t\t\t\t{session.model}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n",
113
+ "import { useState, useRef, useEffect, useCallback } from 'react';\nimport { Pencil } from 'lucide-react';\nimport { useUpdateSession } from '../../hooks/useSessions';\n\ninterface EditableTitleProps {\n\tsessionId: string;\n\ttitle: string | null;\n\tclassName?: string;\n}\n\nexport function EditableTitle({\n\tsessionId,\n\ttitle,\n\tclassName = '',\n}: EditableTitleProps) {\n\tconst [isEditing, setIsEditing] = useState(false);\n\tconst [draft, setDraft] = useState(title || '');\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\tconst { mutate: updateSession } = useUpdateSession(sessionId);\n\n\tuseEffect(() => {\n\t\tif (isEditing && inputRef.current) {\n\t\t\tinputRef.current.focus();\n\t\t\tinputRef.current.select();\n\t\t}\n\t}, [isEditing]);\n\n\tuseEffect(() => {\n\t\tsetDraft(title || '');\n\t}, [title]);\n\n\tconst save = useCallback(() => {\n\t\tconst trimmed = draft.trim();\n\t\tif (trimmed && trimmed !== (title || '')) {\n\t\t\tupdateSession({ title: trimmed });\n\t\t}\n\t\tsetIsEditing(false);\n\t}, [draft, title, updateSession]);\n\n\tconst cancel = useCallback(() => {\n\t\tsetDraft(title || '');\n\t\tsetIsEditing(false);\n\t}, [title]);\n\n\tif (isEditing) {\n\t\treturn (\n\t\t\t<input\n\t\t\t\tref={inputRef}\n\t\t\t\ttype=\"text\"\n\t\t\t\tvalue={draft}\n\t\t\t\tonChange={(e) => setDraft(e.target.value)}\n\t\t\t\tonBlur={save}\n\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\tif (e.key === 'Enter') save();\n\t\t\t\t\tif (e.key === 'Escape') cancel();\n\t\t\t\t}}\n\t\t\t\tclassName={`w-full bg-muted/30 text-foreground rounded px-2 py-1 outline-none ring-1 ring-primary/50 focus:ring-primary ${className}`}\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={() => setIsEditing(true)}\n\t\t\tclassName={`group flex items-center gap-2 hover:opacity-80 transition-opacity truncate text-left ${className}`}\n\t\t\ttitle=\"Click to edit title\"\n\t\t>\n\t\t\t<span className=\"truncate\">{title || 'Untitled Session'}</span>\n\t\t\t<Pencil className=\"h-3.5 w-3.5 opacity-0 group-hover:opacity-50 flex-shrink-0 transition-opacity\" />\n\t\t</button>\n\t);\n}\n",
114
+ "import { useMemo } from 'react';\nimport {\n\testimateModelCostUsd,\n\ttype ProviderId,\n\tgetModelInfo,\n} from '@ottocode/sdk/browser';\nimport type { Session } from '../../types/api';\nimport {\n\tDollarSign,\n\tMessageSquare,\n\tGitBranch,\n\tArrowUpRight,\n\tShare2,\n\tExternalLink,\n\tRefreshCw,\n} from 'lucide-react';\nimport { StopButton } from '../chat/StopButton';\nimport { useParentSession } from '../../hooks/useBranch';\nimport { useShareStatus } from '../../hooks/useShareStatus';\nimport { ProviderLogo } from '../common/ProviderLogo';\nimport { openUrl } from '../../lib/open-url';\nimport { UsageRing } from '../common/UsageRing';\nimport { UsageModal } from '../common/UsageModal';\nimport { useProviderUsage } from '../../hooks/useProviderUsage';\nimport { useAllModels } from '../../hooks/useConfig';\nimport { EditableTitle } from './EditableTitle';\n\ninterface LeanHeaderProps {\n\tsession: Session;\n\tisVisible: boolean;\n\tisGenerating?: boolean;\n\tonNavigateToSession?: (sessionId: string) => void;\n}\n\nexport function LeanHeader({\n\tsession,\n\tisVisible,\n\tisGenerating,\n\tonNavigateToSession,\n}: LeanHeaderProps) {\n\tconst { data: parentData } = useParentSession(\n\t\tsession.sessionType === 'branch' ? session.id : undefined,\n\t);\n\tconst { data: shareStatus } = useShareStatus(session.id);\n\n\tconst estimatedCost = useMemo(() => {\n\t\tconst inputTokens = session.totalInputTokens || 0;\n\t\tconst outputTokens = session.totalOutputTokens || 0;\n\t\tconst cachedInputTokens = session.totalCachedTokens || 0;\n\t\tconst cacheCreationInputTokens = session.totalCacheCreationTokens || 0;\n\t\treturn (\n\t\t\testimateModelCostUsd(session.provider as ProviderId, session.model, {\n\t\t\t\tinputTokens,\n\t\t\t\toutputTokens,\n\t\t\t\tcachedInputTokens,\n\t\t\t\tcacheCreationInputTokens,\n\t\t\t}) ?? 0\n\t\t);\n\t}, [\n\t\tsession.provider,\n\t\tsession.model,\n\t\tsession.totalInputTokens,\n\t\tsession.totalOutputTokens,\n\t\tsession.totalCachedTokens,\n\t\tsession.totalCacheCreationTokens,\n\t]);\n\n\tconst formatCompactNumber = (num: number) => {\n\t\tif (num >= 1000000) return `${(num / 1000000).toFixed(1)}M`;\n\t\tif (num >= 1000) return `${(num / 1000).toFixed(1)}K`;\n\t\treturn num.toString();\n\t};\n\n\tconst contextTokens = session.currentContextTokens || 0;\n\n\tconst isBranch = session.sessionType === 'branch';\n\tconst parentSession = parentData?.parent;\n\n\t// Calculate context usage for color indication\n\tconst contextLimit = useMemo(() => {\n\t\tconst info = getModelInfo(session.provider as ProviderId, session.model);\n\t\treturn info?.limit?.context;\n\t}, [session.provider, session.model]);\n\n\tconst contextUsagePercent = contextLimit\n\t\t? (contextTokens / contextLimit) * 100\n\t\t: 0;\n\n\tconst getContextColorClass = () => {\n\t\tif (contextUsagePercent >= 90) return 'text-red-600 dark:text-red-400';\n\t\tif (contextUsagePercent >= 70) return 'text-amber-600 dark:text-amber-400';\n\t\treturn 'text-foreground';\n\t};\n\n\tconst { data: allModels } = useAllModels();\n\tconst providerAuthType = allModels?.[session.provider]?.authType;\n\tconst { usage, isOAuthProvider } = useProviderUsage(\n\t\tsession.provider,\n\t\tproviderAuthType,\n\t);\n\n\treturn (\n\t\t<>\n\t\t\t<div\n\t\t\t\tclassName={`absolute top-0 left-0 right-0 h-14 border-b border-border bg-background/95 backdrop-blur-sm z-10 transition-transform duration-200 ${\n\t\t\t\t\tisVisible ? 'translate-y-0' : '-translate-y-full'\n\t\t\t\t}`}\n\t\t\t>\n\t\t\t\t<div className=\"h-full px-6 flex items-center justify-between gap-4 text-sm\">\n\t\t\t\t\t<div className=\"flex-1 min-w-0 flex items-center gap-2 text-muted-foreground\">\n\t\t\t\t\t\t{isBranch ? (\n\t\t\t\t\t\t\t<GitBranch className=\"w-4 h-4 flex-shrink-0 text-violet-500\" />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<MessageSquare className=\"w-4 h-4 flex-shrink-0\" />\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<EditableTitle\n\t\t\t\t\t\t\tsessionId={session.id}\n\t\t\t\t\t\t\ttitle={session.title}\n\t\t\t\t\t\t\tclassName=\"text-foreground font-medium text-sm\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{shareStatus?.shared && (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => openUrl(shareStatus.url)}\n\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1 px-1.5 py-0.5 rounded bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 hover:bg-emerald-500/20 transition-colors text-xs font-medium flex-shrink-0\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Share2 className=\"h-3 w-3\" />\n\t\t\t\t\t\t\t\t{shareStatus.pendingMessages &&\n\t\t\t\t\t\t\t\tshareStatus.pendingMessages > 0 ? (\n\t\t\t\t\t\t\t\t\t<span className=\"flex items-center gap-0.5 text-amber-600 dark:text-amber-400\">\n\t\t\t\t\t\t\t\t\t\t<RefreshCw className=\"h-2.5 w-2.5\" />\n\t\t\t\t\t\t\t\t\t\t{shareStatus.pendingMessages}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<ExternalLink className=\"h-2.5 w-2.5 opacity-60\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{isBranch && parentSession && (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<span className=\"text-muted-foreground hidden sm:inline\">\n\t\t\t\t\t\t\t\t\tfrom\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={() => onNavigateToSession?.(parentSession.id)}\n\t\t\t\t\t\t\t\t\tclassName=\"text-primary hover:underline flex items-center gap-0.5 truncate max-w-32\"\n\t\t\t\t\t\t\t\t\ttitle={\n\t\t\t\t\t\t\t\t\t\tparentSession.title ||\n\t\t\t\t\t\t\t\t\t\t`Session ${parentSession.id.slice(0, 8)}`\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span className=\"truncate\">\n\t\t\t\t\t\t\t\t\t\t{parentSession.title ||\n\t\t\t\t\t\t\t\t\t\t\t`Session ${parentSession.id.slice(0, 8)}`}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<ArrowUpRight className=\"h-3 w-3 flex-shrink-0\" />\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div className=\"flex-shrink-0 flex items-center gap-5 text-muted-foreground\">\n\t\t\t\t\t\t{isGenerating && <StopButton sessionId={session.id} />}\n\n\t\t\t\t\t\t{isOAuthProvider && usage && (\n\t\t\t\t\t\t\t<UsageRing usage={usage} provider={session.provider} />\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1\"\n\t\t\t\t\t\t\t\ttitle={`Current context window: ${contextTokens.toLocaleString()} tokens`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"text-xs opacity-70\">ctx</span>\n\t\t\t\t\t\t\t\t<span className={`font-medium ${getContextColorClass()}`}>\n\t\t\t\t\t\t\t\t\t{formatCompactNumber(contextTokens)}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{estimatedCost > 0 && (\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-1.5\">\n\t\t\t\t\t\t\t\t<DollarSign className=\"w-4 h-4\" />\n\t\t\t\t\t\t\t\t<span className=\"text-foreground font-medium\">\n\t\t\t\t\t\t\t\t\t{estimatedCost.toFixed(4)}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t<div className=\"hidden sm:flex items-center gap-2\">\n\t\t\t\t\t\t\t<ProviderLogo provider={session.provider} size={16} />\n\t\t\t\t\t\t\t<span className=\"font-medium text-foreground truncate max-w-40\">\n\t\t\t\t\t\t\t\t{session.model}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<UsageModal />\n\t\t</>\n\t);\n}\n",
115
+ "import { memo } from 'react';\nimport type { ProviderUsageResponse } from '../../types/api';\nimport { useUsageStore } from '../../stores/usageStore';\n\ninterface UsageRingProps {\n\tusage: ProviderUsageResponse;\n\tprovider: string;\n}\n\nconst SIZE = 22;\nconst STROKE = 2.5;\nconst RADIUS = (SIZE - STROKE) / 2;\nconst CIRCUMFERENCE = 2 * Math.PI * RADIUS;\n\nfunction getColor(percent: number): string {\n\tif (percent >= 90) return '#ef4444';\n\tif (percent >= 70) return '#f59e0b';\n\treturn '#3b82f6';\n}\n\nexport const UsageRing = memo(function UsageRing({\n\tusage,\n\tprovider,\n}: UsageRingProps) {\n\tconst openModal = useUsageStore((s) => s.openModal);\n\tconst percent = usage.primaryWindow?.usedPercent ?? 0;\n\tconst dashOffset = CIRCUMFERENCE - (percent / 100) * CIRCUMFERENCE;\n\tconst color = getColor(percent);\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={() => openModal(provider)}\n\t\t\tclassName=\"relative flex items-center hover:opacity-80 transition-opacity cursor-pointer\"\n\t\t\ttitle={`Usage: ${Math.round(percent)}% (5h window) — Click for details`}\n\t\t>\n\t\t\t<svg\n\t\t\t\twidth={SIZE}\n\t\t\t\theight={SIZE}\n\t\t\t\tclassName=\"-rotate-90\"\n\t\t\t\trole=\"img\"\n\t\t\t\taria-label=\"Usage ring\"\n\t\t\t>\n\t\t\t\t<circle\n\t\t\t\t\tcx={SIZE / 2}\n\t\t\t\t\tcy={SIZE / 2}\n\t\t\t\t\tr={RADIUS}\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"hsl(var(--muted))\"\n\t\t\t\t\tstrokeWidth={STROKE}\n\t\t\t\t/>\n\t\t\t\t<circle\n\t\t\t\t\tcx={SIZE / 2}\n\t\t\t\t\tcy={SIZE / 2}\n\t\t\t\t\tr={RADIUS}\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke={color}\n\t\t\t\t\tstrokeWidth={STROKE}\n\t\t\t\t\tstrokeDasharray={CIRCUMFERENCE}\n\t\t\t\t\tstrokeDashoffset={dashOffset}\n\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\tclassName=\"transition-all duration-500\"\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t\t<span\n\t\t\t\tclassName=\"absolute inset-0 flex items-center justify-center rotate-0 font-medium text-muted-foreground\"\n\t\t\t\tstyle={{ fontSize: 7 }}\n\t\t\t>\n\t\t\t\t5h\n\t\t\t</span>\n\t\t</button>\n\t);\n});\n",
116
+ "import { create } from 'zustand';\nimport type { ProviderUsageResponse } from '../types/api';\n\ninterface UsageState {\n\tusage: Record<string, ProviderUsageResponse>;\n\tisLoading: Record<string, boolean>;\n\tlastFetched: Record<string, number>;\n\tisModalOpen: boolean;\n\tmodalProvider: string | null;\n\tsetUsage: (provider: string, data: ProviderUsageResponse) => void;\n\tsetLoading: (provider: string, loading: boolean) => void;\n\tsetLastFetched: (provider: string, time: number) => void;\n\topenModal: (provider: string) => void;\n\tcloseModal: () => void;\n}\n\nexport const useUsageStore = create<UsageState>((set) => ({\n\tusage: {},\n\tisLoading: {},\n\tlastFetched: {},\n\tisModalOpen: false,\n\tmodalProvider: null,\n\tsetUsage: (provider, data) =>\n\t\tset((s) => ({ usage: { ...s.usage, [provider]: data } })),\n\tsetLoading: (provider, loading) =>\n\t\tset((s) => ({ isLoading: { ...s.isLoading, [provider]: loading } })),\n\tsetLastFetched: (provider, time) =>\n\t\tset((s) => ({ lastFetched: { ...s.lastFetched, [provider]: time } })),\n\topenModal: (provider) => set({ isModalOpen: true, modalProvider: provider }),\n\tcloseModal: () => set({ isModalOpen: false, modalProvider: null }),\n}));\n",
117
+ "import { memo, useMemo } from 'react';\nimport { Modal } from '../ui/Modal';\nimport { useUsageStore } from '../../stores/usageStore';\nimport { ProviderLogo } from './ProviderLogo';\nimport type { UsageWindow } from '../../types/api';\n\nfunction formatTimeRemaining(resetsAt: string | null): string {\n\tif (!resetsAt) return 'Unknown';\n\tconst now = Date.now();\n\tconst reset = new Date(resetsAt).getTime();\n\tconst diff = reset - now;\n\tif (diff <= 0) return 'Now';\n\tconst days = Math.floor(diff / 86_400_000);\n\tconst hours = Math.floor((diff % 86_400_000) / 3_600_000);\n\tconst minutes = Math.floor((diff % 3_600_000) / 60_000);\n\tif (days > 0) return `${days}d ${hours}h`;\n\tif (hours > 0) return `${hours}h ${minutes}m`;\n\treturn `${minutes}m`;\n}\n\nfunction windowLabel(seconds: number): string {\n\tif (seconds <= 18000) return '5 Hour';\n\tif (seconds <= 86400) return '24 Hour';\n\treturn '7 Day';\n}\n\nfunction UsageBar({\n\tlabel,\n\twindow: w,\n}: {\n\tlabel: string;\n\twindow: UsageWindow;\n}) {\n\tconst percent = Math.min(w.usedPercent, 100);\n\tconst barColor =\n\t\tpercent >= 90\n\t\t\t? 'bg-red-500'\n\t\t\t: percent >= 70\n\t\t\t\t? 'bg-amber-500'\n\t\t\t\t: 'bg-blue-500';\n\n\treturn (\n\t\t<div className=\"space-y-1.5\">\n\t\t\t<div className=\"flex items-center justify-between text-sm\">\n\t\t\t\t<span className=\"text-muted-foreground\">{label}</span>\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<span className=\"font-medium text-foreground\">\n\t\t\t\t\t\t{Math.round(percent)}%\n\t\t\t\t\t</span>\n\t\t\t\t\t{w.resetsAt && (\n\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\tresets in {formatTimeRemaining(w.resetsAt)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"h-2 rounded-full bg-muted overflow-hidden\">\n\t\t\t\t<div\n\t\t\t\t\tclassName={`h-full rounded-full transition-all duration-500 ${barColor}`}\n\t\t\t\t\tstyle={{ width: `${percent}%` }}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nexport const UsageModal = memo(function UsageModal() {\n\tconst isOpen = useUsageStore((s) => s.isModalOpen);\n\tconst provider = useUsageStore((s) => s.modalProvider);\n\tconst closeModal = useUsageStore((s) => s.closeModal);\n\tconst usage = useUsageStore((s) =>\n\t\tprovider ? s.usage[provider] : undefined,\n\t);\n\n\tconst title = useMemo(\n\t\t() => (\n\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t{provider && <ProviderLogo provider={provider} size={20} />}\n\t\t\t\t<span>Usage & Limits</span>\n\t\t\t</div>\n\t\t),\n\t\t[provider],\n\t);\n\n\tif (!usage) return null;\n\n\treturn (\n\t\t<Modal isOpen={isOpen} onClose={closeModal} title={title} maxWidth=\"sm\">\n\t\t\t<div className=\"space-y-5\">\n\t\t\t\t{usage.limitReached && (\n\t\t\t\t\t<div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-red-500/10 border border-red-500/20\">\n\t\t\t\t\t\t<span className=\"w-2 h-2 rounded-full bg-red-500 flex-shrink-0\" />\n\t\t\t\t\t\t<span className=\"text-sm text-red-600 dark:text-red-400 font-medium\">\n\t\t\t\t\t\t\tRate limit reached\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{usage.primaryWindow && (\n\t\t\t\t\t<UsageBar\n\t\t\t\t\t\tlabel={`${windowLabel(usage.primaryWindow.windowSeconds)} Window`}\n\t\t\t\t\t\twindow={usage.primaryWindow}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t{usage.secondaryWindow && (\n\t\t\t\t\t<UsageBar\n\t\t\t\t\t\tlabel={`${windowLabel(usage.secondaryWindow.windowSeconds)} Window`}\n\t\t\t\t\t\twindow={usage.secondaryWindow}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t{usage.sonnetWindow && usage.sonnetWindow.usedPercent > 0 && (\n\t\t\t\t\t<UsageBar\n\t\t\t\t\t\tlabel=\"Sonnet (7 Day)\"\n\t\t\t\t\t\twindow={{\n\t\t\t\t\t\t\tusedPercent: usage.sonnetWindow.usedPercent,\n\t\t\t\t\t\t\twindowSeconds: 604800,\n\t\t\t\t\t\t\tresetsAt: usage.sonnetWindow.resetsAt,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\n\t\t\t\t{usage.extraUsage?.is_enabled && (\n\t\t\t\t\t<div className=\"pt-2 border-t border-border space-y-1\">\n\t\t\t\t\t\t<div className=\"flex items-center justify-between text-sm\">\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">Extra Credits</span>\n\t\t\t\t\t\t\t<span className=\"font-medium text-foreground\">\n\t\t\t\t\t\t\t\t${usage.extraUsage.used_credits.toFixed(2)} / $\n\t\t\t\t\t\t\t\t{usage.extraUsage.monthly_limit}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{usage.credits?.has_credits && (\n\t\t\t\t\t<div className=\"pt-2 border-t border-border space-y-1\">\n\t\t\t\t\t\t<div className=\"flex items-center justify-between text-sm\">\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">Credits</span>\n\t\t\t\t\t\t\t<span className=\"font-medium text-foreground\">\n\t\t\t\t\t\t\t\t{usage.credits.balance !== null\n\t\t\t\t\t\t\t\t\t? `$${usage.credits.balance.toFixed(2)}`\n\t\t\t\t\t\t\t\t\t: 'Available'}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{usage.planType && (\n\t\t\t\t\t<div className=\"pt-2 border-t border-border\">\n\t\t\t\t\t\t<div className=\"flex items-center justify-between text-sm\">\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">Plan</span>\n\t\t\t\t\t\t\t<span className=\"font-medium text-foreground capitalize\">\n\t\t\t\t\t\t\t\t{usage.planType}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</Modal>\n\t);\n});\n",
118
+ "import { useEffect, useCallback } from 'react';\nimport { apiClient } from '../lib/api-client';\nimport { useUsageStore } from '../stores/usageStore';\n\nconst POLL_INTERVAL = 60_000;\nconst STALE_THRESHOLD = 30_000;\n\nexport function useProviderUsage(\n\tprovider: string | undefined,\n\tauthType: string | undefined,\n) {\n\tconst setUsage = useUsageStore((s) => s.setUsage);\n\tconst setLoading = useUsageStore((s) => s.setLoading);\n\tconst setLastFetched = useUsageStore((s) => s.setLastFetched);\n\tconst usage = useUsageStore((s) =>\n\t\tprovider ? s.usage[provider] : undefined,\n\t);\n\tconst lastFetched = useUsageStore((s) =>\n\t\tprovider ? s.lastFetched[provider] : 0,\n\t);\n\n\tconst isOAuthProvider =\n\t\tauthType === 'oauth' && (provider === 'anthropic' || provider === 'openai');\n\n\tconst fetchUsage = useCallback(async () => {\n\t\tif (!provider || !isOAuthProvider) return;\n\n\t\tsetLoading(provider, true);\n\t\ttry {\n\t\t\tconst data = await apiClient.getProviderUsage(provider);\n\t\t\tsetUsage(provider, data);\n\t\t\tsetLastFetched(provider, Date.now());\n\t\t} catch {\n\t\t} finally {\n\t\t\tsetLoading(provider, false);\n\t\t}\n\t}, [provider, isOAuthProvider, setUsage, setLoading, setLastFetched]);\n\n\tuseEffect(() => {\n\t\tif (!isOAuthProvider) return;\n\n\t\tconst isStale = !lastFetched || Date.now() - lastFetched > STALE_THRESHOLD;\n\t\tif (isStale) {\n\t\t\tfetchUsage();\n\t\t}\n\n\t\tconst interval = setInterval(fetchUsage, POLL_INTERVAL);\n\t\treturn () => clearInterval(interval);\n\t}, [isOAuthProvider, fetchUsage, lastFetched]);\n\n\treturn {\n\t\tusage,\n\t\tfetchUsage,\n\t\tisOAuthProvider,\n\t};\n}\n",
119
+ "import { memo, useState } from 'react';\nimport { Wallet, CreditCard, AlertCircle, Loader2, X } from 'lucide-react';\nimport type { PendingTopupApproval } from '../../stores/topupApprovalStore';\nimport { apiClient } from '../../lib/api-client';\nimport { toast } from '../../stores/toastStore';\nimport { useSetuStore } from '../../stores/setuStore';\n\ninterface TopupApprovalCardProps {\n\tpendingTopup: PendingTopupApproval;\n\tonMethodSelected: (method: 'crypto' | 'fiat') => void;\n\tonCancel: () => void;\n}\n\nexport const TopupApprovalCard = memo(function TopupApprovalCard({\n\tpendingTopup,\n\tonMethodSelected,\n\tonCancel,\n}: TopupApprovalCardProps) {\n\tconst [isProcessing, setIsProcessing] = useState(false);\n\tconst [selectedMethod, setSelectedMethod] = useState<\n\t\t'crypto' | 'fiat' | null\n\t>(null);\n\tconst openTopupModal = useSetuStore((s) => s.openTopupModal);\n\tconst hasGoPlan = useSetuStore((s) => !!s.subscription?.active);\n\n\tconst handleSelectCrypto = async () => {\n\t\tsetSelectedMethod('crypto');\n\t\tsetIsProcessing(true);\n\t\ttry {\n\t\t\tawait apiClient.selectTopupMethod(pendingTopup.sessionId, 'crypto');\n\t\t\tonMethodSelected('crypto');\n\t\t} catch (error) {\n\t\t\ttoast.error(\n\t\t\t\terror instanceof Error ? error.message : 'Failed to process payment',\n\t\t\t);\n\t\t\tsetIsProcessing(false);\n\t\t\tsetSelectedMethod(null);\n\t\t}\n\t};\n\n\tconst handleSelectFiat = async () => {\n\t\tsetSelectedMethod('fiat');\n\t\t// Open modal immediately - don't wait for API\n\t\topenTopupModal();\n\t\t// Tell server fiat was selected (this will gracefully pause the request)\n\t\tapiClient.selectTopupMethod(pendingTopup.sessionId, 'fiat').catch(() => {\n\t\t\t// Ignore errors - the server handles fiat selection gracefully\n\t\t});\n\t\tonMethodSelected('fiat');\n\t};\n\n\tconst handleCancel = async () => {\n\t\tsetIsProcessing(true);\n\t\ttry {\n\t\t\tawait apiClient.cancelTopup(pendingTopup.sessionId);\n\t\t\tonCancel();\n\t\t} catch (error) {\n\t\t\ttoast.error(error instanceof Error ? error.message : 'Failed to cancel');\n\t\t\tsetIsProcessing(false);\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-3 py-2\">\n\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t<AlertCircle className=\"h-4 w-4 text-amber-500 flex-shrink-0\" />\n\t\t\t\t<span className=\"font-medium text-foreground text-sm\">\n\t\t\t\t\tInsufficient Balance\n\t\t\t\t</span>\n\t\t\t\t<span className=\"text-amber-600 dark:text-amber-400 font-medium text-sm\">\n\t\t\t\t\tpayment required\n\t\t\t\t</span>\n\t\t\t</div>\n\n\t\t\t{hasGoPlan && (\n\t\t\t\t<p className=\"ml-6 text-xs text-muted-foreground\">\n\t\t\t\t\tGO credits may not apply to this request. Add balance to continue.\n\t\t\t\t</p>\n\t\t\t)}\n\n\t\t\t<div className=\"ml-6 bg-muted/30 rounded-lg p-3 space-y-2 text-sm\">\n\t\t\t\t<div className=\"flex justify-between\">\n\t\t\t\t\t<span className=\"text-muted-foreground\">Request cost</span>\n\t\t\t\t\t<span className=\"font-mono\">\n\t\t\t\t\t\t~${pendingTopup.amountUsd.toFixed(4)}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex justify-between\">\n\t\t\t\t\t<span className=\"text-muted-foreground\">Current balance</span>\n\t\t\t\t\t<span className=\"font-mono\">\n\t\t\t\t\t\t${pendingTopup.currentBalance.toFixed(4)}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div className=\"ml-6 flex flex-wrap items-center gap-2\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={handleCancel}\n\t\t\t\t\tdisabled={isProcessing}\n\t\t\t\t\ttitle=\"Cancel request\"\n\t\t\t\t\tclassName=\"flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded border border-border bg-background hover:bg-muted transition-colors disabled:opacity-50\"\n\t\t\t\t>\n\t\t\t\t\t<X className=\"w-3 h-3\" />\n\t\t\t\t\tCancel\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={handleSelectCrypto}\n\t\t\t\t\tdisabled={isProcessing}\n\t\t\t\t\ttitle=\"Pay with USDC from your wallet\"\n\t\t\t\t\tclassName=\"flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded bg-violet-600 text-white hover:bg-violet-700 transition-colors disabled:opacity-50\"\n\t\t\t\t>\n\t\t\t\t\t{selectedMethod === 'crypto' && isProcessing ? (\n\t\t\t\t\t\t<Loader2 className=\"w-3 h-3 animate-spin\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Wallet className=\"w-3 h-3\" />\n\t\t\t\t\t)}\n\t\t\t\t\tPay with USDC\n\t\t\t\t</button>\n\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={handleSelectFiat}\n\t\t\t\t\tdisabled={isProcessing}\n\t\t\t\t\ttitle=\"Top up with card (min $5)\"\n\t\t\t\t\tclassName=\"flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded border border-violet-500 text-violet-600 dark:text-violet-400 hover:bg-violet-500/10 transition-colors disabled:opacity-50\"\n\t\t\t\t>\n\t\t\t\t\t{selectedMethod === 'fiat' && isProcessing ? (\n\t\t\t\t\t\t<Loader2 className=\"w-3 h-3 animate-spin\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<CreditCard className=\"w-3 h-3\" />\n\t\t\t\t\t)}\n\t\t\t\t\tTop up with Card\n\t\t\t\t\t<span className=\"text-[10px] opacity-70\">(min $5)</span>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<p className=\"ml-6 text-xs text-muted-foreground\">\n\t\t\t\t{selectedMethod === 'crypto'\n\t\t\t\t\t? 'Processing USDC payment from your wallet...'\n\t\t\t\t\t: selectedMethod === 'fiat'\n\t\t\t\t\t\t? 'Opening checkout...'\n\t\t\t\t\t\t: 'Select a payment method to continue your request.'}\n\t\t\t</p>\n\t\t</div>\n\t);\n});\n",
120
+ "import { create } from 'zustand';\n\nexport interface PendingTopupApproval {\n\tsessionId: string;\n\tmessageId: string;\n\tamountUsd: number;\n\tcurrentBalance: number;\n\tminTopupUsd: number;\n\tsuggestedTopupUsd: number;\n}\n\ninterface TopupApprovalState {\n\tpendingTopup: PendingTopupApproval | null;\n\tisProcessing: boolean;\n\tselectedMethod: 'crypto' | 'fiat' | null;\n\tsetPendingTopup: (topup: PendingTopupApproval | null) => void;\n\tsetProcessing: (processing: boolean) => void;\n\tsetSelectedMethod: (method: 'crypto' | 'fiat' | null) => void;\n\tclearPendingTopup: () => void;\n}\n\nexport const useTopupApprovalStore = create<TopupApprovalState>((set) => ({\n\tpendingTopup: null,\n\tisProcessing: false,\n\tselectedMethod: null,\n\tsetPendingTopup: (pendingTopup) =>\n\t\tset({ pendingTopup, isProcessing: false, selectedMethod: null }),\n\tsetProcessing: (isProcessing) => set({ isProcessing }),\n\tsetSelectedMethod: (selectedMethod) => set({ selectedMethod }),\n\tclearPendingTopup: () =>\n\t\tset({ pendingTopup: null, isProcessing: false, selectedMethod: null }),\n}));\n",
121
+ "import { memo, useMemo } from 'react';\nimport { useMessages } from '../../hooks/useMessages';\nimport { useSessionStream } from '../../hooks/useSessionStream';\nimport { useSessions } from '../../hooks/useSessions';\nimport { usePreferences } from '../../hooks/usePreferences';\nimport { MessageThread } from './MessageThread';\nimport { useToolApprovalShortcuts } from '../../hooks/useToolApprovalShortcuts';\nimport { SetuTopupModal } from '../settings/SetuTopupModal';\n\ninterface MessageThreadContainerProps {\n\tsessionId: string;\n\tonSelectSession?: (sessionId: string) => void;\n}\n\nexport const MessageThreadContainer = memo(function MessageThreadContainer({\n\tsessionId,\n\tonSelectSession,\n}: MessageThreadContainerProps) {\n\tconst { data: messages = [], isLoading } = useMessages(sessionId);\n\tconst { data: sessions = [] } = useSessions();\n\tconst { preferences } = usePreferences();\n\n\tuseSessionStream(sessionId);\n\n\t// Enable keyboard shortcuts (Y/N/A) for tool approval in this session\n\tuseToolApprovalShortcuts(sessionId);\n\n\tconst session = useMemo(\n\t\t() => sessions.find((s) => s.id === sessionId),\n\t\t[sessions, sessionId],\n\t);\n\n\tconst isGenerating = useMemo(\n\t\t() =>\n\t\t\tmessages.some((m) => m.role === 'assistant' && m.status === 'pending'),\n\t\t[messages],\n\t);\n\n\tif (isLoading) {\n\t\treturn (\n\t\t\t<div className=\"flex-1 flex items-center justify-center text-muted-foreground\">\n\t\t\t\tLoading messages...\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<MessageThread\n\t\t\t\tmessages={messages}\n\t\t\t\tsessionId={sessionId}\n\t\t\t\tsession={session}\n\t\t\t\tisGenerating={isGenerating}\n\t\t\t\tcompact={preferences.compactThread}\n\t\t\t\tonSelectSession={onSelectSession}\n\t\t\t/>\n\t\t\t<SetuTopupModal />\n\t\t</>\n\t);\n});\n",
122
+ "import { useEffect, useRef } from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { SSEClient } from '../lib/sse-client';\nimport { apiClient } from '../lib/api-client';\nimport type { Message, MessagePart } from '../types/api';\nimport { useToolApprovalStore } from '../stores/toolApprovalStore';\nimport { sessionsQueryKey } from './useSessions';\n\nexport function useSessionStream(sessionId: string | undefined) {\n\tconst queryClient = useQueryClient();\n\tconst clientRef = useRef<SSEClient | null>(null);\n\tconst assistantMessageIdRef = useRef<string | null>(null);\n\tconst lastInvalidationRef = useRef<number>(0);\n\n\tconst {\n\t\taddPendingApproval,\n\t\tremovePendingApproval,\n\t\tupdatePendingApproval,\n\t\tsetPendingApprovals,\n\t} = useToolApprovalStore();\n\n\tuseEffect(() => {\n\t\t// console.log('[useSessionStream] Hook called with sessionId:', sessionId)\n\t\tif (!sessionId) {\n\t\t\tconsole.log('[useSessionStream] No sessionId, skipping');\n\t\t\treturn;\n\t\t}\n\n\t\tassistantMessageIdRef.current = null;\n\t\tlet lastSessionInvalidation = 0;\n\n\t\t// Fetch pending approvals from server for this session\n\t\tapiClient\n\t\t\t.getPendingApprovals(sessionId)\n\t\t\t.then((result) => {\n\t\t\t\tif (result.ok && result.pending.length > 0) {\n\t\t\t\t\tsetPendingApprovals(result.pending);\n\t\t\t\t} else {\n\t\t\t\t\tsetPendingApprovals([]);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tsetPendingApprovals([]);\n\t\t\t});\n\n\t\tconst client = new SSEClient();\n\t\tclientRef.current = client;\n\n\t\tconst url = apiClient.getStreamUrl(sessionId);\n\t\tconsole.log('[useSessionStream] Connecting to stream:', url);\n\t\tclient.connect(url);\n\n\t\tconst resolveAssistantTargetIndex = (messages: Message[]): number => {\n\t\t\tif (assistantMessageIdRef.current) {\n\t\t\t\tconst byId = messages.findIndex(\n\t\t\t\t\t(message) => message.id === assistantMessageIdRef.current,\n\t\t\t\t);\n\t\t\t\tif (byId !== -1) return byId;\n\t\t\t}\n\t\t\tfor (let i = messages.length - 1; i >= 0; i -= 1) {\n\t\t\t\tconst candidate = messages[i];\n\t\t\t\tif (candidate.role === 'assistant' && candidate.status !== 'complete') {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn -1;\n\t\t};\n\n\t\tconst extractText = (part: MessagePart): string => {\n\t\t\tif (\n\t\t\t\tpart.contentJson &&\n\t\t\t\ttypeof part.contentJson === 'object' &&\n\t\t\t\t!Array.isArray(part.contentJson) &&\n\t\t\t\t'text' in part.contentJson\n\t\t\t) {\n\t\t\t\treturn String((part.contentJson as Record<string, unknown>).text ?? '');\n\t\t\t}\n\t\t\tif (typeof part.content === 'string') {\n\t\t\t\ttry {\n\t\t\t\t\tconst parsed = JSON.parse(part.content);\n\t\t\t\t\tif (parsed && typeof parsed.text === 'string') return parsed.text;\n\t\t\t\t} catch {}\n\t\t\t\treturn part.content;\n\t\t\t}\n\t\t\treturn '';\n\t\t};\n\n\t\tconst getOptimisticPartIndex = (\n\t\t\tparts: MessagePart[],\n\t\t\tstepIndex: number | null,\n\t\t): number => {\n\t\t\tif (typeof stepIndex !== 'number') {\n\t\t\t\treturn parts.length;\n\t\t\t}\n\n\t\t\tconst sameStepIndexes = parts\n\t\t\t\t.filter((part) => part.stepIndex === stepIndex)\n\t\t\t\t.map((part) => part.index)\n\t\t\t\t.filter((index): index is number => Number.isFinite(index));\n\n\t\t\tif (sameStepIndexes.length > 0) {\n\t\t\t\treturn Math.max(...sameStepIndexes) + 0.001;\n\t\t\t}\n\n\t\t\tconst previousStepIndexes = parts\n\t\t\t\t.filter(\n\t\t\t\t\t(part) =>\n\t\t\t\t\t\ttypeof part.stepIndex === 'number' && part.stepIndex < stepIndex,\n\t\t\t\t)\n\t\t\t\t.map((part) => part.index)\n\t\t\t\t.filter((index): index is number => Number.isFinite(index));\n\n\t\t\tconst nextStepIndexes = parts\n\t\t\t\t.filter(\n\t\t\t\t\t(part) =>\n\t\t\t\t\t\ttypeof part.stepIndex === 'number' && part.stepIndex > stepIndex,\n\t\t\t\t)\n\t\t\t\t.map((part) => part.index)\n\t\t\t\t.filter((index): index is number => Number.isFinite(index));\n\n\t\t\tconst lowerBound =\n\t\t\t\tpreviousStepIndexes.length > 0\n\t\t\t\t\t? Math.max(...previousStepIndexes)\n\t\t\t\t\t: null;\n\t\t\tconst upperBound =\n\t\t\t\tnextStepIndexes.length > 0 ? Math.min(...nextStepIndexes) : null;\n\n\t\t\tif (lowerBound !== null && upperBound !== null) {\n\t\t\t\treturn (lowerBound + upperBound) / 2;\n\t\t\t}\n\t\t\tif (lowerBound !== null) {\n\t\t\t\treturn lowerBound + 1;\n\t\t\t}\n\t\t\tif (upperBound !== null) {\n\t\t\t\treturn upperBound - 1;\n\t\t\t}\n\n\t\t\treturn parts.length;\n\t\t};\n\n\t\tconst applyReasoningDelta = (\n\t\t\tpayload: Record<string, unknown> | undefined,\n\t\t) => {\n\t\t\tconst messageId =\n\t\t\t\ttypeof payload?.messageId === 'string' ? payload.messageId : null;\n\t\t\tconst partId =\n\t\t\t\ttypeof payload?.partId === 'string' ? payload.partId : null;\n\t\t\tconst delta = typeof payload?.delta === 'string' ? payload.delta : null;\n\t\t\tif (!messageId || !partId || delta === null) return;\n\t\t\tqueryClient.setQueryData<Message[]>(\n\t\t\t\t['messages', sessionId],\n\t\t\t\t(oldMessages) => {\n\t\t\t\t\tif (!oldMessages) return oldMessages;\n\t\t\t\t\tconst nextMessages = [...oldMessages];\n\t\t\t\t\tconst messageIndex = nextMessages.findIndex(\n\t\t\t\t\t\t(message) => message.id === messageId,\n\t\t\t\t\t);\n\t\t\t\t\tif (messageIndex === -1) return oldMessages;\n\t\t\t\t\tconst targetMessage = nextMessages[messageIndex];\n\t\t\t\t\tconst parts = targetMessage.parts ? [...targetMessage.parts] : [];\n\t\t\t\t\tlet partIndex = parts.findIndex((part) => part.id === partId);\n\t\t\t\t\tconst stepIndex =\n\t\t\t\t\t\ttypeof payload?.stepIndex === 'number' ? payload.stepIndex : null;\n\t\t\t\t\tif (partIndex === -1) {\n\t\t\t\t\t\tconst newPart: MessagePart = {\n\t\t\t\t\t\t\tid: partId,\n\t\t\t\t\t\t\tmessageId,\n\t\t\t\t\t\t\tindex: getOptimisticPartIndex(parts, stepIndex),\n\t\t\t\t\t\t\tstepIndex,\n\t\t\t\t\t\t\ttype: 'reasoning',\n\t\t\t\t\t\t\tcontent: JSON.stringify({ text: delta }),\n\t\t\t\t\t\t\tcontentJson: { text: delta },\n\t\t\t\t\t\t\tagent: targetMessage.agent,\n\t\t\t\t\t\t\tprovider: targetMessage.provider,\n\t\t\t\t\t\t\tmodel: targetMessage.model,\n\t\t\t\t\t\t\tstartedAt: Date.now(),\n\t\t\t\t\t\t\tcompletedAt: null,\n\t\t\t\t\t\t\ttoolName: null,\n\t\t\t\t\t\t\ttoolCallId: null,\n\t\t\t\t\t\t\ttoolDurationMs: null,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tparts.push(newPart);\n\t\t\t\t\t\tpartIndex = parts.length - 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst existing = parts[partIndex];\n\t\t\t\t\t\tconst previous = extractText(existing);\n\t\t\t\t\t\tconst nextText = `${previous}${delta}`;\n\t\t\t\t\t\tparts[partIndex] = {\n\t\t\t\t\t\t\t...existing,\n\t\t\t\t\t\t\tcontent: JSON.stringify({ text: nextText }),\n\t\t\t\t\t\t\tcontentJson: { text: nextText },\n\t\t\t\t\t\t\tstepIndex: stepIndex ?? existing.stepIndex ?? null,\n\t\t\t\t\t\t\tcompletedAt: null,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tnextMessages[messageIndex] = { ...targetMessage, parts };\n\t\t\t\t\treturn nextMessages;\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\n\t\tconst applyMessageDelta = (\n\t\t\tpayload: Record<string, unknown> | undefined,\n\t\t) => {\n\t\t\tconst messageId =\n\t\t\t\ttypeof payload?.messageId === 'string' ? payload.messageId : null;\n\t\t\tconst partId =\n\t\t\t\ttypeof payload?.partId === 'string' ? payload.partId : null;\n\t\t\tconst delta = typeof payload?.delta === 'string' ? payload.delta : null;\n\t\t\tif (!messageId || !partId || delta === null) return;\n\t\t\tqueryClient.setQueryData<Message[]>(\n\t\t\t\t['messages', sessionId],\n\t\t\t\t(oldMessages) => {\n\t\t\t\t\tif (!oldMessages) return oldMessages;\n\t\t\t\t\tconst nextMessages = [...oldMessages];\n\t\t\t\t\tconst messageIndex = nextMessages.findIndex(\n\t\t\t\t\t\t(message) => message.id === messageId,\n\t\t\t\t\t);\n\t\t\t\t\tif (messageIndex === -1) return oldMessages;\n\t\t\t\t\tconst targetMessage = nextMessages[messageIndex];\n\t\t\t\t\tconst parts = targetMessage.parts ? [...targetMessage.parts] : [];\n\t\t\t\t\tlet partIndex = parts.findIndex((part) => part.id === partId);\n\t\t\t\t\tconst stepIndex =\n\t\t\t\t\t\ttypeof payload?.stepIndex === 'number' ? payload.stepIndex : null;\n\t\t\t\t\tif (partIndex === -1) {\n\t\t\t\t\t\tconst newPart: MessagePart = {\n\t\t\t\t\t\t\tid: partId,\n\t\t\t\t\t\t\tmessageId,\n\t\t\t\t\t\t\tindex: getOptimisticPartIndex(parts, stepIndex),\n\t\t\t\t\t\t\tstepIndex,\n\t\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\t\tcontent: JSON.stringify({ text: delta }),\n\t\t\t\t\t\t\tcontentJson: { text: delta },\n\t\t\t\t\t\t\tagent: targetMessage.agent,\n\t\t\t\t\t\t\tprovider: targetMessage.provider,\n\t\t\t\t\t\t\tmodel: targetMessage.model,\n\t\t\t\t\t\t\tstartedAt: Date.now(),\n\t\t\t\t\t\t\tcompletedAt: null,\n\t\t\t\t\t\t\ttoolName: null,\n\t\t\t\t\t\t\ttoolCallId: null,\n\t\t\t\t\t\t\ttoolDurationMs: null,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tparts.push(newPart);\n\t\t\t\t\t\tpartIndex = parts.length - 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst existing = parts[partIndex];\n\t\t\t\t\t\tconst previous = extractText(existing);\n\t\t\t\t\t\tconst nextText = `${previous}${delta}`;\n\t\t\t\t\t\tparts[partIndex] = {\n\t\t\t\t\t\t\t...existing,\n\t\t\t\t\t\t\tcontent: JSON.stringify({ text: nextText }),\n\t\t\t\t\t\t\tcontentJson: { text: nextText },\n\t\t\t\t\t\t\tstepIndex: stepIndex ?? existing.stepIndex ?? null,\n\t\t\t\t\t\t\tcompletedAt: null,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tnextMessages[messageIndex] = { ...targetMessage, parts };\n\t\t\t\t\treturn nextMessages;\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\n\t\tconst upsertEphemeralToolCall = (\n\t\t\tpayload: Record<string, unknown> | undefined,\n\t\t) => {\n\t\t\tif (!payload) return;\n\t\t\tconst callId = typeof payload.callId === 'string' ? payload.callId : null;\n\t\t\tconst name = typeof payload.name === 'string' ? payload.name : null;\n\t\t\tif (!name) return;\n\t\t\tqueryClient.setQueryData<Message[]>(\n\t\t\t\t['messages', sessionId],\n\t\t\t\t(oldMessages) => {\n\t\t\t\t\tif (!oldMessages) return oldMessages;\n\t\t\t\t\tconst nextMessages = [...oldMessages];\n\t\t\t\t\tlet targetIndex = resolveAssistantTargetIndex(nextMessages);\n\t\t\t\t\tif (typeof payload.messageId === 'string') {\n\t\t\t\t\t\tconst explicitIndex = nextMessages.findIndex(\n\t\t\t\t\t\t\t(message) => message.id === payload.messageId,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (explicitIndex !== -1) targetIndex = explicitIndex;\n\t\t\t\t\t}\n\t\t\t\t\tif (targetIndex === -1) return oldMessages;\n\t\t\t\t\tconst targetMessage = nextMessages[targetIndex];\n\t\t\t\t\tconst parts = targetMessage.parts ? [...targetMessage.parts] : [];\n\t\t\t\t\tlet partIndex = -1;\n\t\t\t\t\tif (callId) {\n\t\t\t\t\t\tpartIndex = parts.findIndex(\n\t\t\t\t\t\t\t(part) => part.toolCallId === callId && part.ephemeral,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\t// Only fallback to name match if we don't have a callId\n\t\t\t\t\tif (partIndex === -1 && !callId) {\n\t\t\t\t\t\tpartIndex = parts.findIndex(\n\t\t\t\t\t\t\t(part) => part.ephemeral && part.toolName === name,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tconst args = (payload as { args?: unknown }).args;\n\t\t\t\t\tconst stepIndex =\n\t\t\t\t\t\ttypeof payload.stepIndex === 'number' ? payload.stepIndex : null;\n\t\t\t\t\tconst contentJsonBase: Record<string, unknown> = { name };\n\t\t\t\t\tif (callId) contentJsonBase.callId = callId;\n\t\t\t\t\tif (args !== undefined) contentJsonBase.args = args;\n\t\t\t\t\tif (partIndex === -1) {\n\t\t\t\t\t\tconst newPart: MessagePart = {\n\t\t\t\t\t\t\tid: callId\n\t\t\t\t\t\t\t\t? `ephemeral-tool-call-${callId}`\n\t\t\t\t\t\t\t\t: `ephemeral-tool-call-${name}-${Date.now()}`,\n\t\t\t\t\t\t\tmessageId: targetMessage.id,\n\t\t\t\t\t\t\tindex: getOptimisticPartIndex(parts, stepIndex),\n\t\t\t\t\t\t\tstepIndex,\n\t\t\t\t\t\t\ttype: 'tool_call',\n\t\t\t\t\t\t\tcontent: JSON.stringify(contentJsonBase),\n\t\t\t\t\t\t\tcontentJson: contentJsonBase,\n\t\t\t\t\t\t\tagent: targetMessage.agent,\n\t\t\t\t\t\t\tprovider: targetMessage.provider,\n\t\t\t\t\t\t\tmodel: targetMessage.model,\n\t\t\t\t\t\t\tstartedAt: Date.now(),\n\t\t\t\t\t\t\tcompletedAt: null,\n\t\t\t\t\t\t\ttoolName: name,\n\t\t\t\t\t\t\ttoolCallId: callId,\n\t\t\t\t\t\t\ttoolDurationMs: null,\n\t\t\t\t\t\t\tephemeral: true,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tparts.push(newPart);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst existing = parts[partIndex];\n\t\t\t\t\t\tconst nextContentJson: Record<string, unknown> = {\n\t\t\t\t\t\t\t...(typeof existing.contentJson === 'object' &&\n\t\t\t\t\t\t\t!Array.isArray(existing.contentJson)\n\t\t\t\t\t\t\t\t? (existing.contentJson as Record<string, unknown>)\n\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tif (callId) nextContentJson.callId = callId;\n\t\t\t\t\t\tif (args !== undefined) nextContentJson.args = args;\n\t\t\t\t\t\tparts[partIndex] = {\n\t\t\t\t\t\t\t...existing,\n\t\t\t\t\t\t\tcontent: JSON.stringify(nextContentJson),\n\t\t\t\t\t\t\tcontentJson: nextContentJson,\n\t\t\t\t\t\t\tstepIndex: stepIndex ?? existing.stepIndex ?? null,\n\t\t\t\t\t\t\ttoolCallId: callId ?? existing.toolCallId,\n\t\t\t\t\t\t\ttoolName: name,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tnextMessages[targetIndex] = { ...targetMessage, parts };\n\t\t\t\t\treturn nextMessages;\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\n\t\tconst resolveEphemeralToolCall = (\n\t\t\tpayload: Record<string, unknown> | undefined,\n\t\t) => {\n\t\t\tconst callId =\n\t\t\t\ttypeof payload?.callId === 'string' ? payload.callId : null;\n\t\t\tif (!callId) return;\n\t\t\tconst payloadName =\n\t\t\t\ttypeof payload?.name === 'string' ? payload.name : null;\n\t\t\tconst payloadStepIndex =\n\t\t\t\ttypeof payload?.stepIndex === 'number' ? payload.stepIndex : null;\n\t\t\tconst payloadResult = payload?.result;\n\t\t\tconst payloadArtifact = payload?.artifact;\n\t\t\tconst payloadArgs = payload?.args;\n\t\t\tqueryClient.setQueryData<Message[]>(\n\t\t\t\t['messages', sessionId],\n\t\t\t\t(oldMessages) => {\n\t\t\t\t\tif (!oldMessages) return oldMessages;\n\t\t\t\t\tlet changed = false;\n\t\t\t\t\tconst now = Date.now();\n\t\t\t\t\tconst nextMessages = oldMessages.map((message) => {\n\t\t\t\t\t\tif (!message.parts?.length) return message;\n\t\t\t\t\t\tlet messageChanged = false;\n\t\t\t\t\t\tconst updatedParts = message.parts.map((part) => {\n\t\t\t\t\t\t\tif (!(part.ephemeral && part.toolCallId === callId)) {\n\t\t\t\t\t\t\t\treturn part;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tmessageChanged = true;\n\t\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t\t\tconst nextContentJson: Record<string, unknown> = {\n\t\t\t\t\t\t\t\t...(typeof part.contentJson === 'object' &&\n\t\t\t\t\t\t\t\t!Array.isArray(part.contentJson)\n\t\t\t\t\t\t\t\t\t? (part.contentJson as Record<string, unknown>)\n\t\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t\tname: payloadName ?? part.toolName ?? 'tool',\n\t\t\t\t\t\t\t\tcallId,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tif (payloadArgs !== undefined) nextContentJson.args = payloadArgs;\n\t\t\t\t\t\t\tif (payloadResult !== undefined)\n\t\t\t\t\t\t\t\tnextContentJson.result = payloadResult;\n\t\t\t\t\t\t\tif (payloadArtifact !== undefined)\n\t\t\t\t\t\t\t\tnextContentJson.artifact = payloadArtifact;\n\t\t\t\t\t\t\tconst durationMs =\n\t\t\t\t\t\t\t\tpart.startedAt && Number.isFinite(part.startedAt)\n\t\t\t\t\t\t\t\t\t? Math.max(0, now - part.startedAt)\n\t\t\t\t\t\t\t\t\t: part.toolDurationMs;\n\t\t\t\t\t\t\tconst resolvedPart: MessagePart = {\n\t\t\t\t\t\t\t\t...part,\n\t\t\t\t\t\t\t\ttype: 'tool_result',\n\t\t\t\t\t\t\t\tcontent: JSON.stringify(nextContentJson),\n\t\t\t\t\t\t\t\tcontentJson: nextContentJson,\n\t\t\t\t\t\t\t\tstepIndex: payloadStepIndex ?? part.stepIndex ?? null,\n\t\t\t\t\t\t\t\tcompletedAt: now,\n\t\t\t\t\t\t\t\ttoolName: payloadName ?? part.toolName,\n\t\t\t\t\t\t\t\ttoolDurationMs: durationMs ?? null,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\treturn resolvedPart;\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (!messageChanged) return message;\n\t\t\t\t\t\treturn { ...message, parts: updatedParts };\n\t\t\t\t\t});\n\t\t\t\t\treturn changed ? nextMessages : oldMessages;\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\n\t\tconst removeEphemeralToolCall = (\n\t\t\tpayload: Record<string, unknown> | undefined,\n\t\t) => {\n\t\t\tconst callId =\n\t\t\t\ttypeof payload?.callId === 'string' ? payload.callId : null;\n\t\t\tif (!callId) return;\n\t\t\tqueryClient.setQueryData<Message[]>(\n\t\t\t\t['messages', sessionId],\n\t\t\t\t(oldMessages) => {\n\t\t\t\t\tif (!oldMessages) return oldMessages;\n\t\t\t\t\tlet changed = false;\n\t\t\t\t\tconst nextMessages = oldMessages.map((message) => {\n\t\t\t\t\t\tif (!message.parts?.length) return message;\n\t\t\t\t\t\tconst filtered = message.parts.filter(\n\t\t\t\t\t\t\t(part) => !(part.ephemeral && part.toolCallId === callId),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (filtered.length === message.parts.length) return message;\n\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t\treturn { ...message, parts: filtered };\n\t\t\t\t\t});\n\t\t\t\t\treturn changed ? nextMessages : oldMessages;\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\n\t\tconst clearEphemeralForMessage = (messageId: string | null) => {\n\t\t\tif (!messageId) return;\n\t\t\tqueryClient.setQueryData<Message[]>(\n\t\t\t\t['messages', sessionId],\n\t\t\t\t(oldMessages) => {\n\t\t\t\t\tif (!oldMessages) return oldMessages;\n\t\t\t\t\tconst targetIndex = oldMessages.findIndex(\n\t\t\t\t\t\t(message) => message.id === messageId,\n\t\t\t\t\t);\n\t\t\t\t\tif (targetIndex === -1) return oldMessages;\n\t\t\t\t\tconst target = oldMessages[targetIndex];\n\t\t\t\t\tif (\n\t\t\t\t\t\t!target.parts?.some(\n\t\t\t\t\t\t\t(part) => part.ephemeral && part.type === 'tool_call',\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t\t\treturn oldMessages;\n\t\t\t\t\tconst nextMessages = [...oldMessages];\n\t\t\t\t\tnextMessages[targetIndex] = {\n\t\t\t\t\t\t...target,\n\t\t\t\t\t\tparts:\n\t\t\t\t\t\t\ttarget.parts?.filter(\n\t\t\t\t\t\t\t\t(part) => !(part.ephemeral && part.type === 'tool_call'),\n\t\t\t\t\t\t\t) ?? [],\n\t\t\t\t\t};\n\t\t\t\t\treturn nextMessages;\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\n\t\tconst markMessageCompleted = (\n\t\t\tpayload: Record<string, unknown> | undefined,\n\t\t) => {\n\t\t\tconst id = typeof payload?.id === 'string' ? payload.id : null;\n\t\t\tif (!id) return;\n\t\t\tqueryClient.setQueryData<Message[]>(\n\t\t\t\t['messages', sessionId],\n\t\t\t\t(oldMessages) => {\n\t\t\t\t\tif (!oldMessages) return oldMessages;\n\t\t\t\t\tconst nextMessages = [...oldMessages];\n\t\t\t\t\tconst messageIndex = nextMessages.findIndex(\n\t\t\t\t\t\t(message) => message.id === id,\n\t\t\t\t\t);\n\t\t\t\t\tif (messageIndex === -1) return oldMessages;\n\t\t\t\t\tconst existing = nextMessages[messageIndex];\n\t\t\t\t\tnextMessages[messageIndex] = {\n\t\t\t\t\t\t...existing,\n\t\t\t\t\t\tstatus: 'complete',\n\t\t\t\t\t\tcompletedAt: Date.now(),\n\t\t\t\t\t};\n\t\t\t\t\treturn nextMessages;\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\n\t\t// Throttle invalidations to prevent excessive re-renders\n\t\t// Only invalidate at most once every 500ms during streaming\n\t\tconst throttledInvalidate = () => {\n\t\t\tconst now = Date.now();\n\t\t\tif (now - lastInvalidationRef.current < 500) {\n\t\t\t\treturn; // Skip if we invalidated less than 500ms ago\n\t\t\t}\n\t\t\tlastInvalidationRef.current = now;\n\t\t\t// console.log('[useSessionStream] Invalidating messages query (throttled)');\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['messages', sessionId] });\n\t\t};\n\n\t\tconst invalidatingEvents = new Set([\n\t\t\t'message.completed',\n\t\t\t'message.updated',\n\t\t\t'finish-step',\n\t\t\t'error',\n\t\t]);\n\n\t\tconst unsubscribe = client.on('*', (event) => {\n\t\t\t// console.log('[useSessionStream] Event received:', event);\n\t\t\tconst payload = event.payload as Record<string, unknown> | undefined;\n\n\t\t\tswitch (event.type) {\n\t\t\t\tcase 'message.created': {\n\t\t\t\t\tconst role = typeof payload?.role === 'string' ? payload.role : null;\n\t\t\t\t\tconst id = typeof payload?.id === 'string' ? payload.id : null;\n\t\t\t\t\tif (role === 'assistant' && id) {\n\t\t\t\t\t\tassistantMessageIdRef.current = id;\n\t\t\t\t\t}\n\t\t\t\t\tif (id && role) {\n\t\t\t\t\t\tconst agent =\n\t\t\t\t\t\t\ttypeof payload?.agent === 'string' ? payload.agent : '';\n\t\t\t\t\t\tconst provider =\n\t\t\t\t\t\t\ttypeof payload?.provider === 'string' ? payload.provider : '';\n\t\t\t\t\t\tconst model =\n\t\t\t\t\t\t\ttypeof payload?.model === 'string' ? payload.model : '';\n\t\t\t\t\t\tqueryClient.setQueryData<Message[]>(\n\t\t\t\t\t\t\t['messages', sessionId],\n\t\t\t\t\t\t\t(oldMessages) => {\n\t\t\t\t\t\t\t\tif (!oldMessages) return oldMessages;\n\t\t\t\t\t\t\t\tif (oldMessages.some((m) => m.id === id)) return oldMessages;\n\t\t\t\t\t\t\t\tconst newMessage: Message = {\n\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\t\t\t\trole: role as Message['role'],\n\t\t\t\t\t\t\t\t\tstatus: 'pending',\n\t\t\t\t\t\t\t\t\tagent,\n\t\t\t\t\t\t\t\t\tprovider,\n\t\t\t\t\t\t\t\t\tmodel,\n\t\t\t\t\t\t\t\t\tcreatedAt: Date.now(),\n\t\t\t\t\t\t\t\t\tcompletedAt: null,\n\t\t\t\t\t\t\t\t\tlatencyMs: null,\n\t\t\t\t\t\t\t\t\tpromptTokens: null,\n\t\t\t\t\t\t\t\t\tcompletionTokens: null,\n\t\t\t\t\t\t\t\t\ttotalTokens: null,\n\t\t\t\t\t\t\t\t\terror: null,\n\t\t\t\t\t\t\t\t\tparts: [],\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tconst next = [...oldMessages, newMessage];\n\t\t\t\t\t\t\t\tnext.sort((a, b) => a.createdAt - b.createdAt);\n\t\t\t\t\t\t\t\treturn next;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthrottledInvalidate();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'message.part.delta': {\n\t\t\t\t\tapplyMessageDelta(payload);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'reasoning.delta': {\n\t\t\t\t\tapplyReasoningDelta(payload);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'message.completed': {\n\t\t\t\t\tconst id = typeof payload?.id === 'string' ? payload.id : null;\n\t\t\t\t\tif (id && assistantMessageIdRef.current === id) {\n\t\t\t\t\t\tassistantMessageIdRef.current = null;\n\t\t\t\t\t}\n\t\t\t\t\tmarkMessageCompleted(payload);\n\t\t\t\t\tclearEphemeralForMessage(id);\n\t\t\t\t\tqueryClient.invalidateQueries({ queryKey: sessionsQueryKey });\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'tool.delta': {\n\t\t\t\t\tconst channel =\n\t\t\t\t\t\ttypeof payload?.channel === 'string' ? payload.channel : null;\n\t\t\t\t\tif (channel === 'input') {\n\t\t\t\t\t\tupsertEphemeralToolCall(payload);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'tool.call': {\n\t\t\t\t\tupsertEphemeralToolCall(payload);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'tool.result': {\n\t\t\t\t\tresolveEphemeralToolCall(payload);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'tool.approval.required': {\n\t\t\t\t\tconst callId =\n\t\t\t\t\t\ttypeof payload?.callId === 'string' ? payload.callId : null;\n\t\t\t\t\tconst toolName =\n\t\t\t\t\t\ttypeof payload?.toolName === 'string' ? payload.toolName : null;\n\t\t\t\t\tconst messageId =\n\t\t\t\t\t\ttypeof payload?.messageId === 'string' ? payload.messageId : null;\n\t\t\t\t\tconst args = payload?.args;\n\t\t\t\t\tif (callId && toolName && messageId) {\n\t\t\t\t\t\taddPendingApproval({\n\t\t\t\t\t\t\tcallId,\n\t\t\t\t\t\t\ttoolName,\n\t\t\t\t\t\t\targs,\n\t\t\t\t\t\t\tmessageId,\n\t\t\t\t\t\t\tcreatedAt: Date.now(),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'tool.approval.resolved': {\n\t\t\t\t\tconst callId =\n\t\t\t\t\t\ttypeof payload?.callId === 'string' ? payload.callId : null;\n\t\t\t\t\tif (callId) {\n\t\t\t\t\t\tremovePendingApproval(callId);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'tool.approval.updated': {\n\t\t\t\t\tconst callId =\n\t\t\t\t\t\ttypeof payload?.callId === 'string' ? payload.callId : null;\n\t\t\t\t\tconst args = payload?.args;\n\t\t\t\t\tif (callId) {\n\t\t\t\t\t\tupdatePendingApproval(callId, args);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'error': {\n\t\t\t\t\tremoveEphemeralToolCall(payload);\n\t\t\t\t\tconst messageId =\n\t\t\t\t\t\ttypeof payload?.messageId === 'string' ? payload.messageId : null;\n\t\t\t\t\tif (messageId) {\n\t\t\t\t\t\tclearEphemeralForMessage(messageId);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'message.updated': {\n\t\t\t\t\tconst id = typeof payload?.id === 'string' ? payload.id : null;\n\t\t\t\t\tconst status =\n\t\t\t\t\t\ttypeof payload?.status === 'string' ? payload.status : null;\n\t\t\t\t\tif (id && status) {\n\t\t\t\t\t\tqueryClient.setQueryData<Message[]>(\n\t\t\t\t\t\t\t['messages', sessionId],\n\t\t\t\t\t\t\t(oldMessages) => {\n\t\t\t\t\t\t\t\tif (!oldMessages) return oldMessages;\n\t\t\t\t\t\t\t\tconst idx = oldMessages.findIndex((m) => m.id === id);\n\t\t\t\t\t\t\t\tif (idx === -1) return oldMessages;\n\t\t\t\t\t\t\t\tconst next = [...oldMessages];\n\t\t\t\t\t\t\t\tnext[idx] = {\n\t\t\t\t\t\t\t\t\t...next[idx],\n\t\t\t\t\t\t\t\t\tstatus: status as Message['status'],\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\treturn next;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'queue.updated': {\n\t\t\t\t\tconst queueState = {\n\t\t\t\t\t\tcurrentMessageId: payload?.currentMessageId as string | null,\n\t\t\t\t\t\tqueuedMessages: (payload?.queuedMessages ?? []) as Array<{\n\t\t\t\t\t\t\tmessageId: string;\n\t\t\t\t\t\t\tposition: number;\n\t\t\t\t\t\t}>,\n\t\t\t\t\t\tqueueLength: (payload?.queueLength ?? 0) as number,\n\t\t\t\t\t};\n\t\t\t\t\tqueryClient.setQueryData(['queueState', sessionId], queueState);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (invalidatingEvents.has(event.type)) {\n\t\t\t\t// Use throttled invalidation instead of immediate\n\t\t\t\tthrottledInvalidate();\n\t\t\t}\n\n\t\t\tif (event.type === 'finish-step') {\n\t\t\t\tconst now = Date.now();\n\t\t\t\tif (now - lastSessionInvalidation >= 2000) {\n\t\t\t\t\tlastSessionInvalidation = now;\n\t\t\t\t\tqueryClient.invalidateQueries({ queryKey: sessionsQueryKey });\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn () => {\n\t\t\tunsubscribe();\n\t\t\tclient.disconnect();\n\t\t};\n\t}, [\n\t\tsessionId,\n\t\tqueryClient,\n\t\taddPendingApproval,\n\t\tremovePendingApproval,\n\t\tsetPendingApprovals,\n\t\tupdatePendingApproval,\n\t]);\n}\n",
123
+ "import type { SSEEvent } from '../types/api';\n\nexport type SSEEventHandler = (event: SSEEvent) => void;\n\nexport class SSEClient {\n\tprivate abortController: AbortController | null = null;\n\tprivate handlers: Map<string, Set<SSEEventHandler>> = new Map();\n\tprivate running = false;\n\n\tasync connect(url: string) {\n\t\tif (this.abortController) {\n\t\t\tthis.abortController.abort();\n\t\t}\n\n\t\tthis.abortController = new AbortController();\n\t\tthis.running = true;\n\n\t\ttry {\n\t\t\tconst response = await fetch(url, {\n\t\t\t\theaders: { Accept: 'text/event-stream' },\n\t\t\t\tsignal: this.abortController.signal,\n\t\t\t});\n\n\t\t\tif (!response.ok) {\n\t\t\t\tconsole.error('[SSE] Connection failed:', response.status);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst reader = response.body?.getReader();\n\t\t\tif (!reader) {\n\t\t\t\tconsole.error('[SSE] No response body');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst decoder = new TextDecoder();\n\t\t\tlet buffer = '';\n\n\t\t\twhile (this.running) {\n\t\t\t\tconst { done, value } = await reader.read();\n\t\t\t\tif (done) break;\n\n\t\t\t\tbuffer += decoder.decode(value, { stream: true });\n\t\t\t\tlet idx = buffer.indexOf('\\n\\n');\n\n\t\t\t\twhile (idx !== -1) {\n\t\t\t\t\tconst raw = buffer.slice(0, idx);\n\t\t\t\t\tbuffer = buffer.slice(idx + 2);\n\t\t\t\t\tconst lines = raw.split('\\n');\n\n\t\t\t\t\tlet eventType = 'message';\n\t\t\t\t\tlet data = '';\n\n\t\t\t\t\tfor (const line of lines) {\n\t\t\t\t\t\tif (line.startsWith('event: ')) {\n\t\t\t\t\t\t\teventType = line.slice(7).trim();\n\t\t\t\t\t\t} else if (line.startsWith('data: ')) {\n\t\t\t\t\t\t\tdata += (data ? '\\n' : '') + line.slice(6);\n\t\t\t\t\t\t} else if (line.startsWith(':')) {\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (data) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst payload = JSON.parse(data);\n\t\t\t\t\t\t\tthis.emit({ type: eventType, payload });\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconsole.error(`[SSE] Failed to parse ${eventType}:`, error);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tidx = buffer.indexOf('\\n\\n');\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (error instanceof Error && error.name === 'AbortError') {\n\t\t\t} else if (\n\t\t\t\terror instanceof TypeError &&\n\t\t\t\terror.message === 'Load failed'\n\t\t\t) {\n\t\t\t} else {\n\t\t\t\tconsole.error('[SSE] Connection error:', error);\n\t\t\t}\n\t\t}\n\t}\n\n\tdisconnect() {\n\t\tthis.running = false;\n\t\tif (this.abortController) {\n\t\t\tthis.abortController.abort();\n\t\t\tthis.abortController = null;\n\t\t}\n\t}\n\n\ton(eventType: string, handler: SSEEventHandler) {\n\t\tif (!this.handlers.has(eventType)) {\n\t\t\tthis.handlers.set(eventType, new Set());\n\t\t}\n\t\tthis.handlers.get(eventType)?.add(handler);\n\n\t\treturn () => {\n\t\t\tthis.off(eventType, handler);\n\t\t};\n\t}\n\n\toff(eventType: string, handler: SSEEventHandler) {\n\t\tconst handlers = this.handlers.get(eventType);\n\t\tif (handlers) {\n\t\t\thandlers.delete(handler);\n\t\t\tif (handlers.size === 0) {\n\t\t\t\tthis.handlers.delete(eventType);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate emit(event: SSEEvent) {\n\t\tconst handlers = this.handlers.get(event.type);\n\t\tif (handlers) {\n\t\t\tfor (const handler of handlers) {\n\t\t\t\thandler(event);\n\t\t\t}\n\t\t}\n\n\t\tconst allHandlers = this.handlers.get('*');\n\t\tif (allHandlers) {\n\t\t\tfor (const handler of allHandlers) {\n\t\t\t\thandler(event);\n\t\t\t}\n\t\t}\n\t}\n}\n",
124
+ "import { useEffect, useCallback } from 'react';\nimport { useToolApprovalStore } from '../stores/toolApprovalStore';\nimport { apiClient } from '../lib/api-client';\n\n/**\n * Hook for handling keyboard shortcuts for tool approval.\n * Only responds to shortcuts when there are pending approvals for the given session.\n *\n * Shortcuts:\n * - Y: Approve first pending\n * - N or Escape: Reject first pending\n * - A: Approve all pending\n */\nexport function useToolApprovalShortcuts(sessionId: string | undefined) {\n\tconst { pendingApprovals, removePendingApproval } = useToolApprovalStore();\n\n\t// Filter approvals for this session\n\t// Since approvals are tied to messages, and messages to sessions,\n\t// we need to check that the pending approval belongs to this session's messages\n\tconst sessionPendingApprovals = pendingApprovals;\n\n\tconst handleApprove = useCallback(\n\t\tasync (callId: string) => {\n\t\t\tif (!sessionId) return;\n\t\t\ttry {\n\t\t\t\tawait apiClient.approveToolCall(sessionId, callId, true);\n\t\t\t\tremovePendingApproval(callId);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('Failed to approve tool call:', error);\n\t\t\t}\n\t\t},\n\t\t[sessionId, removePendingApproval],\n\t);\n\n\tconst handleReject = useCallback(\n\t\tasync (callId: string) => {\n\t\t\tif (!sessionId) return;\n\t\t\ttry {\n\t\t\t\tawait apiClient.approveToolCall(sessionId, callId, false);\n\t\t\t\tremovePendingApproval(callId);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('Failed to reject tool call:', error);\n\t\t\t}\n\t\t},\n\t\t[sessionId, removePendingApproval],\n\t);\n\n\tconst handleApproveAll = useCallback(async () => {\n\t\tif (!sessionId) return;\n\t\ttry {\n\t\t\tawait Promise.all(\n\t\t\t\tsessionPendingApprovals.map((a) =>\n\t\t\t\t\tapiClient.approveToolCall(sessionId, a.callId, true),\n\t\t\t\t),\n\t\t\t);\n\t\t\tfor (const a of sessionPendingApprovals) {\n\t\t\t\tremovePendingApproval(a.callId);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to approve all tool calls:', error);\n\t\t}\n\t}, [sessionId, sessionPendingApprovals, removePendingApproval]);\n\n\tuseEffect(() => {\n\t\tif (!sessionId || sessionPendingApprovals.length === 0) return;\n\n\t\tconst handleKeyDown = (e: KeyboardEvent) => {\n\t\t\t// Don't trigger if user is typing in an input/textarea\n\t\t\tif (\n\t\t\t\te.target instanceof HTMLInputElement ||\n\t\t\t\te.target instanceof HTMLTextAreaElement ||\n\t\t\t\t(e.target as HTMLElement)?.isContentEditable\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst firstPending = sessionPendingApprovals[0];\n\n\t\t\tif (e.key === 'y' || e.key === 'Y') {\n\t\t\t\te.preventDefault();\n\t\t\t\thandleApprove(firstPending.callId);\n\t\t\t} else if (e.key === 'n' || e.key === 'N' || e.key === 'Escape') {\n\t\t\t\te.preventDefault();\n\t\t\t\thandleReject(firstPending.callId);\n\t\t\t} else if (e.key === 'a' || e.key === 'A') {\n\t\t\t\te.preventDefault();\n\t\t\t\thandleApproveAll();\n\t\t\t}\n\t\t};\n\n\t\twindow.addEventListener('keydown', handleKeyDown);\n\t\treturn () => window.removeEventListener('keydown', handleKeyDown);\n\t}, [\n\t\tsessionId,\n\t\tsessionPendingApprovals,\n\t\thandleApprove,\n\t\thandleReject,\n\t\thandleApproveAll,\n\t]);\n}\n",
125
+ "import { memo, useState, useEffect, useCallback, useRef } from 'react';\nimport {\n\tCreditCard,\n\tWallet,\n\tLoader2,\n\tExternalLink,\n\tRefreshCw,\n} from 'lucide-react';\nimport { Modal } from '../ui/Modal';\nimport { useSetuStore } from '../../stores/setuStore';\nimport { apiClient } from '../../lib/api-client';\nimport { toast } from '../../stores/toastStore';\nimport { StatusIndicator } from '../common/StatusIndicator';\n\nconst PRESET_AMOUNTS = [10, 25, 50, 100];\nconst MIN_AMOUNT = 5;\nconst MIN_AMOUNT_RAZORPAY = 2;\nconst MAX_AMOUNT = 500;\nconst POLL_INTERVAL = 5000;\nconst SUCCESS_PAGE_URL = 'https://share.ottocode.io/checkout/success';\n\ntype ModalView = 'amount' | 'checkout' | 'razorpay-processing' | 'confirmed';\ntype PaymentGateway = 'polar' | 'razorpay';\n\ninterface FeeEstimate {\n\tcreditAmount: number;\n\tchargeAmount: number;\n\tfeeAmount: number;\n}\n\ninterface RazorpayEstimate {\n\tcreditAmountUsd: number;\n\tchargeAmountInr: number;\n\tfeeAmountInr: number;\n\tcurrency: string;\n\texchangeRate: number;\n}\n\ninterface CheckoutInfo {\n\turl: string;\n\tcheckoutId: string;\n\tcreditAmount: number;\n\tchargeAmount: number;\n}\n\ndeclare global {\n\tinterface Window {\n\t\tRazorpay: new (\n\t\t\toptions: Record<string, unknown>,\n\t\t) => {\n\t\t\topen: () => void;\n\t\t\ton: (event: string, handler: () => void) => void;\n\t\t};\n\t}\n}\n\nfunction loadRazorpayScript(): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (window.Razorpay) {\n\t\t\tresolve();\n\t\t\treturn;\n\t\t}\n\t\tconst script = document.createElement('script');\n\t\tscript.src = 'https://checkout.razorpay.com/v1/checkout.js';\n\t\tscript.onload = () => resolve();\n\t\tscript.onerror = () => reject(new Error('Failed to load Razorpay'));\n\t\tdocument.head.appendChild(script);\n\t});\n}\n\nfunction PolarIcon({ className = 'w-5 h-5' }: { className?: string }) {\n\treturn (\n\t\t<svg\n\t\t\tclassName={className}\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tfill=\"currentColor\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t>\n\t\t\t<title>Polar</title>\n\t\t\t<path\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\td=\"M5.08734 21.1119C10.2671 24.6182 17.3085 23.2616 20.8148 18.0818C24.3211 12.9021 22.9645 5.86065 17.7848 2.35436C12.605 -1.15192 5.56353 0.204698 2.05724 5.38446C-1.44904 10.5642 -0.0924184 17.6057 5.08734 21.1119ZM6.58958 21.2045C11.3278 23.6286 17.3384 21.3531 20.0147 16.1221C22.6909 10.891 21.0194 4.68533 16.2811 2.2612C11.543 -0.162919 5.53235 2.11252 2.8561 7.34355C0.179842 12.5745 1.85138 18.7803 6.58958 21.2045Z\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\td=\"M7.93988 22.4416C12.2169 23.8337 17.2485 20.1561 19.1782 14.2276C21.1078 8.29898 19.2047 2.3644 14.9276 0.9723C10.6505 -0.419794 5.61905 3.25775 3.68942 9.18633C1.7598 15.1149 3.6628 21.0495 7.93988 22.4416ZM9.24825 21.991C12.868 22.7631 16.7819 18.796 17.9904 13.1305C19.1988 7.46494 17.244 2.24622 13.6243 1.47416C10.0046 0.702105 6.09064 4.66908 4.88222 10.3347C3.67381 16.0002 5.62854 21.2189 9.24825 21.991Z\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\td=\"M10.2406 22.9252C13.1024 23.2308 15.9585 18.4574 16.6199 12.2635C17.2812 6.06969 15.4974 0.800854 12.6356 0.495275C9.77386 0.189695 6.91772 4.96309 6.25634 11.157C5.59498 17.3508 7.37878 22.6196 10.2406 22.9252ZM11.5798 21.04C13.6508 21.0073 15.264 16.8146 15.1828 11.6754C15.1017 6.53608 13.3568 2.39642 11.2858 2.42914C9.21463 2.46187 7.60148 6.65457 7.68268 11.7939C7.76387 16.9331 9.50864 21.0727 11.5798 21.04Z\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n\nfunction RazorpayIcon({ className = 'w-5 h-5' }: { className?: string }) {\n\treturn (\n\t\t<svg\n\t\t\tclassName={className}\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\tfill=\"currentColor\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t>\n\t\t\t<title>Razorpay</title>\n\t\t\t<path d=\"M22.436 0l-11.91 7.773-1.174 4.276 6.625-4.297L11.65 24h4.391l6.395-24zM14.26 10.098L3.389 17.166 1.564 24h9.008l3.688-13.902Z\" />\n\t\t</svg>\n\t);\n}\n\nexport const SetuTopupModal = memo(function SetuTopupModal() {\n\tconst isOpen = useSetuStore((s) => s.isTopupModalOpen);\n\tconst closeModal = useSetuStore((s) => s.closeTopupModal);\n\tconst balance = useSetuStore((s) => s.balance);\n\tconst setBalance = useSetuStore((s) => s.setBalance);\n\tconst usdcBalance = useSetuStore((s) => s.usdcBalance);\n\tconst subscription = useSetuStore((s) => s.subscription);\n\n\tconst [view, setView] = useState<ModalView>('amount');\n\tconst [gateway, setGateway] = useState<PaymentGateway>('polar');\n\tconst [amount, setAmount] = useState<number>(25);\n\tconst [customAmount, setCustomAmount] = useState<string>('');\n\tconst [isCustom, setIsCustom] = useState(false);\n\tconst [estimate, setEstimate] = useState<FeeEstimate | null>(null);\n\tconst [razorpayEstimate, setRazorpayEstimate] =\n\t\tuseState<RazorpayEstimate | null>(null);\n\tconst [isLoadingEstimate, setIsLoadingEstimate] = useState(false);\n\tconst [isCreatingCheckout, setIsCreatingCheckout] = useState(false);\n\tconst [checkoutInfo, setCheckoutInfo] = useState<CheckoutInfo | null>(null);\n\tconst [isPolling, setIsPolling] = useState(false);\n\tconst [confirmedAmount, setConfirmedAmount] = useState<number | null>(null);\n\tconst [pollCount, setPollCount] = useState(0);\n\tconst [isManualChecking, setIsManualChecking] = useState(false);\n\tconst pollRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n\tconst effectiveAmount = isCustom ? parseFloat(customAmount) || 0 : amount;\n\tconst hasGoPlan = !!subscription?.active;\n\tconst minAmount = gateway === 'razorpay' ? MIN_AMOUNT_RAZORPAY : MIN_AMOUNT;\n\n\tconst fetchEstimate = useCallback(\n\t\tasync (amt: number) => {\n\t\t\tif (amt < minAmount || amt > MAX_AMOUNT) {\n\t\t\t\tsetEstimate(null);\n\t\t\t\tsetRazorpayEstimate(null);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsetIsLoadingEstimate(true);\n\t\t\ttry {\n\t\t\t\tif (gateway === 'polar') {\n\t\t\t\t\tconst result = await apiClient.getPolarTopupEstimate(amt);\n\t\t\t\t\tsetEstimate(result);\n\t\t\t\t\tsetRazorpayEstimate(null);\n\t\t\t\t} else {\n\t\t\t\t\tconst result = await apiClient.getRazorpayTopupEstimate(amt);\n\t\t\t\t\tsetRazorpayEstimate(result);\n\t\t\t\t\tsetEstimate(null);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tsetEstimate(null);\n\t\t\t\tsetRazorpayEstimate(null);\n\t\t\t} finally {\n\t\t\t\tsetIsLoadingEstimate(false);\n\t\t\t}\n\t\t},\n\t\t[gateway, minAmount],\n\t);\n\n\tuseEffect(() => {\n\t\tif (isOpen && effectiveAmount >= minAmount && view === 'amount') {\n\t\t\tconst timeout = setTimeout(() => fetchEstimate(effectiveAmount), 300);\n\t\t\treturn () => clearTimeout(timeout);\n\t\t}\n\t}, [isOpen, effectiveAmount, fetchEstimate, view, minAmount]);\n\n\tconst stopPolling = useCallback(() => {\n\t\tif (pollRef.current) {\n\t\t\tclearInterval(pollRef.current);\n\t\t\tpollRef.current = null;\n\t\t}\n\t\tsetIsPolling(false);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (!isOpen) {\n\t\t\tstopPolling();\n\t\t\tsetView('amount');\n\t\t\tsetCheckoutInfo(null);\n\t\t\tsetConfirmedAmount(null);\n\t\t\tsetPollCount(0);\n\t\t}\n\t}, [isOpen, stopPolling]);\n\n\tuseEffect(() => {\n\t\treturn () => stopPolling();\n\t}, [stopPolling]);\n\n\tconst startPolling = useCallback(\n\t\t(checkoutId: string) => {\n\t\t\tif (pollRef.current) return;\n\t\t\tsetIsPolling(true);\n\t\t\tsetPollCount(0);\n\n\t\t\tconst check = async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst status = await apiClient.getPolarTopupStatus(checkoutId);\n\t\t\t\t\tsetPollCount((c) => c + 1);\n\t\t\t\t\tif (status?.confirmed) {\n\t\t\t\t\t\tstopPolling();\n\t\t\t\t\t\tsetConfirmedAmount(status.amountUsd);\n\t\t\t\t\t\tlocalStorage.removeItem('pendingPolarCheckout');\n\n\t\t\t\t\t\tconst balanceData = await apiClient.getSetuBalance();\n\t\t\t\t\t\tif (balanceData?.balance !== undefined) {\n\t\t\t\t\t\t\tsetBalance(balanceData.balance);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsetView('confirmed');\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\tsetPollCount((c) => c + 1);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tcheck();\n\t\t\tpollRef.current = setInterval(check, POLL_INTERVAL);\n\t\t},\n\t\t[stopPolling, setBalance],\n\t);\n\n\tconst handlePresetClick = (preset: number) => {\n\t\tsetAmount(preset);\n\t\tsetIsCustom(false);\n\t\tsetCustomAmount('');\n\t};\n\n\tconst handleCustomAmountChange = (value: string) => {\n\t\tsetCustomAmount(value);\n\t\tsetIsCustom(true);\n\t};\n\n\tconst openCheckoutUrl = useCallback((url: string) => {\n\t\tif (window.self !== window.top) {\n\t\t\twindow.parent.postMessage({ type: 'otto-open-url', url }, '*');\n\t\t} else {\n\t\t\twindow.open(url, '_blank');\n\t\t}\n\t}, []);\n\n\tconst handlePolarCheckout = async () => {\n\t\tif (effectiveAmount < MIN_AMOUNT || effectiveAmount > MAX_AMOUNT) {\n\t\t\ttoast.error(`Amount must be between $${MIN_AMOUNT} and $${MAX_AMOUNT}`);\n\t\t\treturn;\n\t\t}\n\n\t\tsetIsCreatingCheckout(true);\n\t\ttry {\n\t\t\tconst result = await apiClient.createPolarCheckout(\n\t\t\t\teffectiveAmount,\n\t\t\t\tSUCCESS_PAGE_URL,\n\t\t\t);\n\n\t\t\tif (result.checkoutUrl && result.checkoutId) {\n\t\t\t\tconst info: CheckoutInfo = {\n\t\t\t\t\turl: result.checkoutUrl,\n\t\t\t\t\tcheckoutId: result.checkoutId,\n\t\t\t\t\tcreditAmount: result.creditAmount,\n\t\t\t\t\tchargeAmount: result.chargeAmount,\n\t\t\t\t};\n\t\t\t\tsetCheckoutInfo(info);\n\t\t\t\tlocalStorage.setItem('pendingPolarCheckout', result.checkoutId);\n\t\t\t\tsetView('checkout');\n\t\t\t\topenCheckoutUrl(result.checkoutUrl);\n\t\t\t\tstartPolling(result.checkoutId);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\ttoast.error(\n\t\t\t\terror instanceof Error ? error.message : 'Failed to create checkout',\n\t\t\t);\n\t\t} finally {\n\t\t\tsetIsCreatingCheckout(false);\n\t\t}\n\t};\n\n\tconst handleRazorpayCheckout = async () => {\n\t\tif (effectiveAmount < MIN_AMOUNT_RAZORPAY || effectiveAmount > MAX_AMOUNT) {\n\t\t\ttoast.error(\n\t\t\t\t`Amount must be between $${MIN_AMOUNT_RAZORPAY} and $${MAX_AMOUNT}`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tsetIsCreatingCheckout(true);\n\t\ttry {\n\t\t\tawait loadRazorpayScript();\n\t\t\tconst order = await apiClient.createRazorpayOrder(effectiveAmount);\n\n\t\t\tsetView('razorpay-processing');\n\n\t\t\tconst rzp = new window.Razorpay({\n\t\t\t\tkey: order.keyId,\n\t\t\t\tamount: order.amount,\n\t\t\t\tcurrency: order.currency,\n\t\t\t\tname: 'Setu',\n\t\t\t\tdescription: `Top up $${order.creditAmountUsd.toFixed(2)} credits`,\n\t\t\t\torder_id: order.orderId,\n\t\t\t\thandler: async (response: {\n\t\t\t\t\trazorpay_order_id: string;\n\t\t\t\t\trazorpay_payment_id: string;\n\t\t\t\t\trazorpay_signature: string;\n\t\t\t\t}) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst result = await apiClient.verifyRazorpayPayment({\n\t\t\t\t\t\t\trazorpay_order_id: response.razorpay_order_id,\n\t\t\t\t\t\t\trazorpay_payment_id: response.razorpay_payment_id,\n\t\t\t\t\t\t\trazorpay_signature: response.razorpay_signature,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (result.success) {\n\t\t\t\t\t\t\tsetConfirmedAmount(result.credited);\n\t\t\t\t\t\t\tconst balanceData = await apiClient.getSetuBalance();\n\t\t\t\t\t\t\tif (balanceData?.balance !== undefined) {\n\t\t\t\t\t\t\t\tsetBalance(balanceData.balance);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsetView('confirmed');\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\ttoast.error(\n\t\t\t\t\t\t\terr instanceof Error\n\t\t\t\t\t\t\t\t? err.message\n\t\t\t\t\t\t\t\t: 'Payment verification failed',\n\t\t\t\t\t\t);\n\t\t\t\t\t\tsetView('amount');\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tmodal: {\n\t\t\t\t\tondismiss: () => {\n\t\t\t\t\t\tsetView('amount');\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\ttheme: {\n\t\t\t\t\tcolor: '#7c3aed',\n\t\t\t\t},\n\t\t\t});\n\n\t\t\trzp.on('payment.failed', () => {\n\t\t\t\ttoast.error('Payment failed. Please try again.');\n\t\t\t\tsetView('amount');\n\t\t\t});\n\n\t\t\trzp.open();\n\t\t} catch (error) {\n\t\t\ttoast.error(\n\t\t\t\terror instanceof Error ? error.message : 'Failed to create order',\n\t\t\t);\n\t\t\tsetView('amount');\n\t\t} finally {\n\t\t\tsetIsCreatingCheckout(false);\n\t\t}\n\t};\n\n\tconst handleCheckout = () => {\n\t\tif (gateway === 'polar') {\n\t\t\thandlePolarCheckout();\n\t\t} else {\n\t\t\thandleRazorpayCheckout();\n\t\t}\n\t};\n\n\tconst handleCheckNow = async () => {\n\t\tif (!checkoutInfo) return;\n\t\tsetIsManualChecking(true);\n\t\ttry {\n\t\t\tconst status = await apiClient.getPolarTopupStatus(\n\t\t\t\tcheckoutInfo.checkoutId,\n\t\t\t);\n\t\t\tif (status?.confirmed) {\n\t\t\t\tstopPolling();\n\t\t\t\tsetConfirmedAmount(status.amountUsd);\n\t\t\t\tlocalStorage.removeItem('pendingPolarCheckout');\n\n\t\t\t\tconst balanceData = await apiClient.getSetuBalance();\n\t\t\t\tif (balanceData?.balance !== undefined) {\n\t\t\t\t\tsetBalance(balanceData.balance);\n\t\t\t\t}\n\t\t\t\tsetView('confirmed');\n\t\t\t} else {\n\t\t\t\ttoast.error('Payment not confirmed yet. Keep waiting or try again.');\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconsole.error('[SetuTopupModal] Check failed:', err);\n\t\t\ttoast.error('Failed to check payment status');\n\t\t} finally {\n\t\t\tsetIsManualChecking(false);\n\t\t}\n\t};\n\n\tconst handleDone = () => {\n\t\tcloseModal();\n\t};\n\n\tconst isValidAmount =\n\t\teffectiveAmount >= minAmount && effectiveAmount <= MAX_AMOUNT;\n\n\tconst modalTitle =\n\t\tview === 'confirmed'\n\t\t\t? 'Payment Confirmed'\n\t\t\t: view === 'checkout'\n\t\t\t\t? 'Waiting for Payment'\n\t\t\t\t: view === 'razorpay-processing'\n\t\t\t\t\t? 'Processing Payment'\n\t\t\t\t\t: 'Add Credits';\n\n\treturn (\n\t\t<Modal\n\t\t\tisOpen={isOpen}\n\t\t\tonClose={closeModal}\n\t\t\ttitle={modalTitle}\n\t\t\tmaxWidth=\"md\"\n\t\t>\n\t\t\t<div className=\"space-y-6\">\n\t\t\t\t{view === 'confirmed' && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<div className=\"py-4\">\n\t\t\t\t\t\t\t<StatusIndicator\n\t\t\t\t\t\t\t\tstatus=\"success\"\n\t\t\t\t\t\t\t\tlabel={`+$${confirmedAmount?.toFixed(2) ?? checkoutInfo?.creditAmount.toFixed(2)}`}\n\t\t\t\t\t\t\t\tsublabel=\"Credits added to your balance\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={handleDone}\n\t\t\t\t\t\t\tclassName=\"w-full h-12 bg-foreground text-background rounded-lg font-medium hover:bg-foreground/90 transition-colors flex items-center justify-center gap-2\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tDone\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\n\t\t\t\t{view === 'razorpay-processing' && (\n\t\t\t\t\t<div className=\"py-8\">\n\t\t\t\t\t\t<StatusIndicator\n\t\t\t\t\t\t\tstatus=\"loading\"\n\t\t\t\t\t\t\tlabel=\"Complete payment in the Razorpay window\"\n\t\t\t\t\t\t\tsublabel=\"Do not close this page\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{view === 'checkout' && checkoutInfo && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<div className=\"py-4\">\n\t\t\t\t\t\t\t<StatusIndicator\n\t\t\t\t\t\t\t\tstatus=\"loading\"\n\t\t\t\t\t\t\t\tlabel=\"Complete your payment\"\n\t\t\t\t\t\t\t\tsublabel=\"A checkout window has been opened\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-center gap-2 mt-4 px-3 py-1.5 bg-muted/40 rounded-full w-fit mx-auto\">\n\t\t\t\t\t\t\t\t<div className=\"w-1.5 h-1.5 rounded-full bg-blue-500 animate-pulse\" />\n\t\t\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground font-mono\">\n\t\t\t\t\t\t\t\t\t{isPolling ? `Checking... (${pollCount})` : 'Paused'}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={handleCheckNow}\n\t\t\t\t\t\t\t\tdisabled={isManualChecking}\n\t\t\t\t\t\t\t\tclassName=\"w-full h-12 bg-foreground text-background rounded-lg font-medium hover:bg-foreground/90 transition-colors disabled:opacity-50 flex items-center justify-center gap-2\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{isManualChecking ? (\n\t\t\t\t\t\t\t\t\t<Loader2 className=\"w-4 h-4 animate-spin\" />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<RefreshCw className=\"w-4 h-4\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{isManualChecking ? 'Checking...' : 'Check Now'}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => openCheckoutUrl(checkoutInfo.url)}\n\t\t\t\t\t\t\t\tclassName=\"w-full h-11 bg-transparent border border-border text-foreground rounded-lg font-medium hover:bg-muted/50 transition-colors flex items-center justify-center gap-2\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ExternalLink className=\"w-4 h-4\" />\n\t\t\t\t\t\t\t\tOpen Checkout Again\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground text-center\">\n\t\t\t\t\t\t\tStatus checks automatically every 5 seconds. You can close this\n\t\t\t\t\t\t\tand it will keep checking.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\n\t\t\t\t{view === 'amount' && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{hasGoPlan && (\n\t\t\t\t\t\t\t<div className=\"text-xs text-muted-foreground bg-muted/30 border border-border rounded-lg px-3 py-2\">\n\t\t\t\t\t\t\t\tYou are on GO. Top-ups add extra balance for additional usage.\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<div className=\"flex items-center justify-between py-3 px-4 bg-muted/40 rounded-lg\">\n\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\tCurrent Balance\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span className=\"text-lg font-mono font-semibold\">\n\t\t\t\t\t\t\t\t${balance?.toFixed(2) ?? '0.00'}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div className=\"flex rounded-lg border border-border overflow-hidden\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => setGateway('polar')}\n\t\t\t\t\t\t\t\tclassName={`flex-1 flex items-center justify-center gap-2 py-2.5 text-sm font-medium transition-colors ${\n\t\t\t\t\t\t\t\t\tgateway === 'polar'\n\t\t\t\t\t\t\t\t\t\t? 'bg-foreground text-background'\n\t\t\t\t\t\t\t\t\t\t: 'bg-transparent text-muted-foreground hover:text-foreground'\n\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<PolarIcon className=\"w-3.5 h-3.5\" />\n\t\t\t\t\t\t\t\tPolar\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => setGateway('razorpay')}\n\t\t\t\t\t\t\t\tclassName={`flex-1 flex items-center justify-center gap-2 py-2.5 text-sm font-medium transition-colors ${\n\t\t\t\t\t\t\t\t\tgateway === 'razorpay'\n\t\t\t\t\t\t\t\t\t\t? 'bg-foreground text-background'\n\t\t\t\t\t\t\t\t\t\t: 'bg-transparent text-muted-foreground hover:text-foreground'\n\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<RazorpayIcon className=\"w-3.5 h-3.5\" />\n\t\t\t\t\t\t\t\tRazorpay\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<div className=\"grid grid-cols-4 gap-2\">\n\t\t\t\t\t\t\t\t{PRESET_AMOUNTS.map((preset) => (\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tkey={preset}\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => handlePresetClick(preset)}\n\t\t\t\t\t\t\t\t\t\tclassName={`h-12 text-base font-mono rounded-lg border-2 transition-all ${\n\t\t\t\t\t\t\t\t\t\t\t!isCustom && amount === preset\n\t\t\t\t\t\t\t\t\t\t\t\t? 'bg-foreground text-background border-foreground'\n\t\t\t\t\t\t\t\t\t\t\t\t: 'bg-transparent border-border text-foreground hover:border-foreground/40'\n\t\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t${preset}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t\t\t\t<span className=\"absolute left-4 top-1/2 -translate-y-1/2 text-muted-foreground text-lg\">\n\t\t\t\t\t\t\t\t\t$\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\t\t\tplaceholder=\"Custom\"\n\t\t\t\t\t\t\t\t\tvalue={customAmount}\n\t\t\t\t\t\t\t\t\tonChange={(e) => handleCustomAmountChange(e.target.value)}\n\t\t\t\t\t\t\t\t\tonFocus={() => setIsCustom(true)}\n\t\t\t\t\t\t\t\t\tmin={minAmount}\n\t\t\t\t\t\t\t\t\tmax={MAX_AMOUNT}\n\t\t\t\t\t\t\t\t\tstep=\"1\"\n\t\t\t\t\t\t\t\t\tclassName={`w-full h-12 pl-8 pr-4 text-base font-mono bg-transparent border-2 rounded-lg outline-none transition-all ${\n\t\t\t\t\t\t\t\t\t\tisCustom\n\t\t\t\t\t\t\t\t\t\t\t? 'border-foreground'\n\t\t\t\t\t\t\t\t\t\t\t: 'border-border focus:border-foreground/40'\n\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={`grid transition-all duration-200 ease-out ${\n\t\t\t\t\t\t\t\tisValidAmount\n\t\t\t\t\t\t\t\t\t? 'grid-rows-[1fr] opacity-100'\n\t\t\t\t\t\t\t\t\t: 'grid-rows-[0fr] opacity-0'\n\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"overflow-hidden\">\n\t\t\t\t\t\t\t\t<div className=\"space-y-3 py-4 border-t border-border\">\n\t\t\t\t\t\t\t\t\t{isLoadingEstimate ? (\n\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex justify-between items-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tCredits\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"h-6 w-16 bg-muted/60 rounded animate-pulse\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex justify-between items-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tFee\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"h-4 w-12 bg-muted/60 rounded animate-pulse\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex justify-between items-center pt-3 border-t border-border\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-medium\">Total</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"h-7 w-20 bg-muted/60 rounded animate-pulse\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t) : gateway === 'polar' && estimate ? (\n\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex justify-between items-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tCredits\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-mono text-lg\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t${estimate.creditAmount.toFixed(2)}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex justify-between items-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tFee\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-mono text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t+${estimate.feeAmount.toFixed(2)}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex justify-between items-center pt-3 border-t border-border\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-medium\">Total</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-mono text-xl font-semibold\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t${estimate.chargeAmount.toFixed(2)}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t) : gateway === 'razorpay' && razorpayEstimate ? (\n\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex justify-between items-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tCredits\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-mono text-lg\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t${razorpayEstimate.creditAmountUsd.toFixed(2)}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex justify-between items-center\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tFee\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-mono text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t+₹{razorpayEstimate.feeAmountInr.toFixed(2)}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex justify-between items-center pt-3 border-t border-border\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-medium\">Total</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-mono text-xl font-semibold\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t₹{razorpayEstimate.chargeAmountInr.toFixed(2)}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-[10px] text-muted-foreground text-right\">\n\t\t\t\t\t\t\t\t\t\t\t\t1 USD ≈ {razorpayEstimate.exchangeRate} INR\n\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={handleCheckout}\n\t\t\t\t\t\t\tdisabled={!isValidAmount || isCreatingCheckout}\n\t\t\t\t\t\t\tclassName=\"w-full h-12 bg-foreground text-background rounded-lg font-medium hover:bg-foreground/90 transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{isCreatingCheckout ? (\n\t\t\t\t\t\t\t\t<Loader2 className=\"w-4 h-4 animate-spin\" />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<CreditCard className=\"w-4 h-4\" />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{gateway === 'polar' ? 'Pay with Card' : 'Pay with Razorpay'}\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<div className=\"relative pt-6\">\n\t\t\t\t\t\t\t<div className=\"absolute inset-x-0 top-0 flex items-center\">\n\t\t\t\t\t\t\t\t<div className=\"flex-1 h-px bg-border\" />\n\t\t\t\t\t\t\t\t<span className=\"px-3 text-xs text-muted-foreground\">OR</span>\n\t\t\t\t\t\t\t\t<div className=\"flex-1 h-px bg-border\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"flex items-start gap-3 p-4 bg-muted/30 rounded-lg\">\n\t\t\t\t\t\t\t\t<Wallet className=\"w-5 h-5 text-muted-foreground mt-0.5\" />\n\t\t\t\t\t\t\t\t<div className=\"flex-1 min-w-0\">\n\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t\t\t\t<span className=\"font-medium text-sm\">Pay with USDC</span>\n\t\t\t\t\t\t\t\t\t\t{usdcBalance !== null && (\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-xs font-mono text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t{usdcBalance.toFixed(2)} USDC\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground mt-1\">\n\t\t\t\t\t\t\t\t\t\tSend USDC to your Setu wallet to increase balance.\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</Modal>\n\t);\n});\n",
126
+ "import { memo } from 'react';\nimport { CheckCircle, XCircle } from 'lucide-react';\n\ntype StatusType = 'loading' | 'success' | 'error';\n\ninterface StatusIndicatorProps {\n\tstatus: StatusType;\n\tlabel?: string;\n\tsublabel?: string;\n\tsize?: 'sm' | 'md' | 'lg';\n}\n\nconst OttoWordmarkLogo = ({ height = 22 }: { height?: number }) => {\n\tconst width = Math.round(height * (748 / 303));\n\treturn (\n\t\t<svg\n\t\t\twidth={width}\n\t\t\theight={height}\n\t\t\tviewBox=\"0 0 748 303\"\n\t\t\tfill=\"currentColor\"\n\t\t\tclassName=\"text-foreground\"\n\t\t\taria-label=\"otto\"\n\t\t\trole=\"img\"\n\t\t>\n\t\t\t<path d=\"M192.877 257.682C192.877 263.287 191.783 268.551 189.596 273.473C187.545 278.395 184.674 282.701 180.982 286.393C177.428 289.947 173.189 292.818 168.268 295.006C163.482 297.057 158.287 298.082 152.682 298.082H44.1953C38.7266 298.082 33.5312 297.057 28.6094 295.006C23.6875 292.818 19.3809 289.947 15.6895 286.393C12.1348 282.701 9.26367 278.395 7.07617 273.473C5.02539 268.551 4 263.287 4 257.682V120.074C4 114.469 5.02539 109.205 7.07617 104.283C9.26367 99.3613 12.1348 95.123 15.6895 91.5684C19.3809 87.877 23.6875 85.0059 28.6094 82.9551C33.5312 80.7676 38.7266 79.6738 44.1953 79.6738H152.682C158.287 79.6738 163.482 80.7676 168.268 82.9551C173.189 85.0059 177.428 87.877 180.982 91.5684C184.674 95.123 187.545 99.3613 189.596 104.283C191.783 109.205 192.877 114.469 192.877 120.074V257.682ZM44.1953 120.074V257.682H152.682V120.074H44.1953ZM331.715 4V298.082H289.674V46.041H239.225V4H331.715ZM478.961 4V298.082H436.92V46.041H386.471V4H478.961ZM743.717 257.682C743.717 263.287 742.623 268.551 740.436 273.473C738.385 278.395 735.514 282.701 731.822 286.393C728.268 289.947 724.029 292.818 719.107 295.006C714.322 297.057 709.127 298.082 703.521 298.082H595.035C589.566 298.082 584.371 297.057 579.449 295.006C574.527 292.818 570.221 289.947 566.529 286.393C562.975 282.701 560.104 278.395 557.916 273.473C555.865 268.551 554.84 263.287 554.84 257.682V120.074C554.84 114.469 555.865 109.205 557.916 104.283C560.104 99.3613 562.975 95.123 566.529 91.5684C570.221 87.877 574.527 85.0059 579.449 82.9551C584.371 80.7676 589.566 79.6738 595.035 79.6738H703.521C709.127 79.6738 714.322 80.7676 719.107 82.9551C724.029 85.0059 728.268 87.877 731.822 91.5684C735.514 95.123 738.385 99.3613 740.436 104.283C742.623 109.205 743.717 114.469 743.717 120.074V257.682ZM595.035 120.074V257.682H703.521V120.074H595.035Z\" />\n\t\t</svg>\n\t);\n};\n\nconst sizeConfig = {\n\tsm: { ring: 48, icon: 20, iconSize: 16 },\n\tmd: { ring: 72, icon: 32, iconSize: 24 },\n\tlg: { ring: 96, icon: 40, iconSize: 32 },\n};\n\nexport const StatusIndicator = memo(function StatusIndicator({\n\tstatus,\n\tlabel,\n\tsublabel,\n\tsize = 'md',\n}: StatusIndicatorProps) {\n\tconst { ring, icon, iconSize } = sizeConfig[size];\n\n\tconst ringStyle: React.CSSProperties = {\n\t\tposition: 'relative',\n\t\tdisplay: 'flex',\n\t\talignItems: 'center',\n\t\tjustifyContent: 'center',\n\t\twidth: ring,\n\t\theight: ring,\n\t};\n\n\tconst baseRingStyle: React.CSSProperties = {\n\t\tcontent: '\"\"',\n\t\tposition: 'absolute',\n\t\tinset: 0,\n\t\tborderRadius: '50%',\n\t};\n\n\tconst getBorderColor = () => {\n\t\tif (status === 'success') return 'rgb(34, 197, 94)';\n\t\tif (status === 'error') return 'rgb(239, 68, 68)';\n\t\treturn 'currentColor';\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-col items-center justify-center gap-5\">\n\t\t\t<div style={ringStyle}>\n\t\t\t\t<div\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\t...baseRingStyle,\n\t\t\t\t\t\tborder: '2px solid hsl(var(--muted))',\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t\t{status === 'loading' && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"animate-spin\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...baseRingStyle,\n\t\t\t\t\t\t\tborder: '2px solid transparent',\n\t\t\t\t\t\t\tborderTopColor: 'hsl(var(--foreground))',\n\t\t\t\t\t\t\tanimation: 'spin 1s cubic-bezier(0.4, 0, 0.2, 1) infinite',\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{status === 'success' && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...baseRingStyle,\n\t\t\t\t\t\t\tborder: `2px solid ${getBorderColor()}`,\n\t\t\t\t\t\t\topacity: 0.3,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{status === 'error' && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t...baseRingStyle,\n\t\t\t\t\t\t\tborder: `2px solid ${getBorderColor()}`,\n\t\t\t\t\t\t\topacity: 0.3,\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t<div style={{ position: 'relative', zIndex: 1 }}>\n\t\t\t\t\t{status === 'loading' && (\n\t\t\t\t\t\t<OttoWordmarkLogo height={Math.round(icon * 0.65)} />\n\t\t\t\t\t)}\n\t\t\t\t\t{status === 'success' && (\n\t\t\t\t\t\t<CheckCircle\n\t\t\t\t\t\t\tclassName=\"text-green-500\"\n\t\t\t\t\t\t\tstyle={{ width: iconSize, height: iconSize }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t\t{status === 'error' && (\n\t\t\t\t\t\t<XCircle\n\t\t\t\t\t\t\tclassName=\"text-red-500\"\n\t\t\t\t\t\t\tstyle={{ width: iconSize, height: iconSize }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{label && (\n\t\t\t\t<div className=\"flex flex-col items-center gap-1\">\n\t\t\t\t\t<span className=\"text-sm font-medium text-foreground\">{label}</span>\n\t\t\t\t\t{sublabel && (\n\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground\">{sublabel}</span>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n",
127
+ "import { memo } from 'react';\nimport { MessageSquare, GitBranch } from 'lucide-react';\nimport type { Session } from '../../types/api';\n\ninterface SessionItemProps {\n\tsession: Session;\n\tisActive: boolean;\n\tonClick: () => void;\n}\n\nexport const SessionItem = memo(function SessionItem({\n\tsession,\n\tisActive,\n\tonClick,\n}: SessionItemProps) {\n\tconst formatDate = (timestamp: number) => {\n\t\tconst date = new Date(timestamp);\n\t\tconst now = new Date();\n\t\tconst diffMs = now.getTime() - date.getTime();\n\t\tconst diffMins = Math.floor(diffMs / 60000);\n\t\tconst diffHours = Math.floor(diffMins / 60);\n\t\tconst diffDays = Math.floor(diffHours / 24);\n\n\t\tif (diffMins < 1) return 'just now';\n\t\tif (diffMins < 60) return `${diffMins}m ago`;\n\t\tif (diffHours < 24) return `${diffHours}h ago`;\n\t\tif (diffDays < 7) return `${diffDays}d ago`;\n\t\treturn date.toLocaleDateString();\n\t};\n\n\tconst isBranch = session.sessionType === 'branch';\n\n\tconst baseStyles =\n\t\t'group w-full rounded-lg px-3 py-3 text-left transition-colors duration-150';\n\tconst activeStyles = 'bg-primary/10';\n\tconst inactiveStyles = 'hover:bg-muted/20';\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={onClick}\n\t\t\tclassName={`${baseStyles} ${isActive ? activeStyles : inactiveStyles}`}\n\t\t>\n\t\t\t<div className=\"flex items-start gap-3\">\n\t\t\t\t{isBranch ? (\n\t\t\t\t\t<GitBranch\n\t\t\t\t\t\tclassName={`h-4 w-4 shrink-0 mt-1 text-muted-foreground ${isActive ? 'text-primary' : ''}`}\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<MessageSquare\n\t\t\t\t\t\tclassName={`h-4 w-4 shrink-0 mt-1 text-muted-foreground ${isActive ? 'text-primary' : ''}`}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t<div className=\"min-w-0 flex-1\">\n\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t<h3 className=\"truncate text-sm font-semibold text-foreground\">\n\t\t\t\t\t\t\t{session.title || `Session ${session.id.slice(0, 8)}`}\n\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t{isBranch && (\n\t\t\t\t\t\t\t<span className=\"text-[10px] px-1.5 py-0.5 bg-violet-500/10 text-violet-600 dark:text-violet-400 rounded-full shrink-0\">\n\t\t\t\t\t\t\t\tbranch\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"mt-1 flex items-center gap-2 text-xs text-muted-foreground/80\">\n\t\t\t\t\t\t{session.agent && (\n\t\t\t\t\t\t\t<span className=\"uppercase\">{session.agent}</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{session.agent && <span>•</span>}\n\t\t\t\t\t\t<span>{formatDate(session.lastActiveAt || session.createdAt)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</button>\n\t);\n});\n",
128
+ "import { memo, useMemo, useCallback, useEffect, useRef } from 'react';\nimport { useSessions } from '../../hooks/useSessions';\nimport { SessionItem } from './SessionItem';\nimport { useFocusStore } from '../../stores/focusStore';\nimport { Loader2 } from 'lucide-react';\n\ninterface SessionListContainerProps {\n\tactiveSessionId?: string;\n\tonSelectSession: (sessionId: string) => void;\n}\n\nexport const SessionListContainer = memo(function SessionListContainer({\n\tactiveSessionId,\n\tonSelectSession,\n}: SessionListContainerProps) {\n\tconst {\n\t\tdata: sessions = [],\n\t\tisLoading,\n\t\thasNextPage,\n\t\tfetchNextPage,\n\t\tisFetchingNextPage,\n\t} = useSessions();\n\tconst { currentFocus, sessionIndex } = useFocusStore();\n\tconst itemRefs = useRef<Map<string, HTMLDivElement>>(new Map());\n\tconst scrollContainerRef = useRef<HTMLDivElement>(null);\n\tconst lastScrolledSessionId = useRef<string | undefined>(undefined);\n\n\tconst handleSessionClick = useCallback(\n\t\t(sessionId: string) => {\n\t\t\tlastScrolledSessionId.current = sessionId;\n\t\t\tonSelectSession(sessionId);\n\t\t},\n\t\t[onSelectSession],\n\t);\n\n\tconst sessionSnapshot = useMemo(() => {\n\t\treturn sessions.map((s) => ({\n\t\t\tid: s.id,\n\t\t\ttitle: s.title,\n\t\t\tagent: s.agent,\n\t\t\tcreatedAt: s.createdAt,\n\t\t}));\n\t}, [sessions]);\n\n\tuseEffect(() => {\n\t\tif (currentFocus === 'sessions') {\n\t\t\tconst session = sessionSnapshot[sessionIndex];\n\t\t\tif (session) {\n\t\t\t\tconst element = itemRefs.current.get(session.id);\n\t\t\t\telement?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n\t\t\t}\n\t\t}\n\t}, [currentFocus, sessionIndex, sessionSnapshot]);\n\n\tuseEffect(() => {\n\t\tif (\n\t\t\t!activeSessionId ||\n\t\t\tlastScrolledSessionId.current === activeSessionId ||\n\t\t\tsessions.length === 0\n\t\t)\n\t\t\treturn;\n\n\t\tconst activeIndex = sessions.findIndex((s) => s.id === activeSessionId);\n\t\tif (activeIndex === -1 && hasNextPage) {\n\t\t\tfetchNextPage();\n\t\t\treturn;\n\t\t}\n\n\t\tif (activeIndex !== -1) {\n\t\t\tlastScrolledSessionId.current = activeSessionId;\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tconst element = itemRefs.current.get(activeSessionId);\n\t\t\t\telement?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n\t\t\t});\n\t\t}\n\t}, [activeSessionId, sessions, hasNextPage, fetchNextPage]);\n\n\tuseEffect(() => {\n\t\tconst container = scrollContainerRef.current;\n\t\tif (!container) return;\n\n\t\tconst handleScroll = () => {\n\t\t\tconst { scrollTop, scrollHeight, clientHeight } = container;\n\t\t\tif (\n\t\t\t\tscrollHeight - scrollTop - clientHeight < 100 &&\n\t\t\t\thasNextPage &&\n\t\t\t\t!isFetchingNextPage\n\t\t\t) {\n\t\t\t\tfetchNextPage();\n\t\t\t}\n\t\t};\n\n\t\tcontainer.addEventListener('scroll', handleScroll, { passive: true });\n\t\treturn () => container.removeEventListener('scroll', handleScroll);\n\t}, [hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n\tif (isLoading) {\n\t\treturn (\n\t\t\t<div className=\"flex flex-col gap-2 px-2 py-2\">\n\t\t\t\t<div className=\"h-12 rounded-md bg-muted/30 animate-pulse\" />\n\t\t\t\t<div className=\"h-12 rounded-md bg-muted/30 animate-pulse\" />\n\t\t\t\t<div className=\"h-12 rounded-md bg-muted/30 animate-pulse\" />\n\t\t\t\t<div className=\"h-12 rounded-md bg-muted/30 animate-pulse\" />\n\t\t\t\t<div className=\"h-12 rounded-md bg-muted/30 animate-pulse\" />\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (sessionSnapshot.length === 0) {\n\t\treturn (\n\t\t\t<div className=\"px-4 py-8 text-center text-sm text-muted-foreground/80\">\n\t\t\t\tNo sessions yet. Create one to get started.\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div\n\t\t\tref={scrollContainerRef}\n\t\t\tclassName=\"flex flex-col gap-1 px-2 py-2 h-full overflow-y-auto scrollbar-hide\"\n\t\t>\n\t\t\t{sessionSnapshot.map((session, index) => {\n\t\t\t\tconst fullSession = sessions.find((s) => s.id === session.id);\n\t\t\t\tif (!fullSession) return null;\n\t\t\t\tconst isFocused = currentFocus === 'sessions' && sessionIndex === index;\n\n\t\t\t\treturn (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={session.id}\n\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\tif (el) itemRefs.current.set(session.id, el);\n\t\t\t\t\t\t\telse itemRefs.current.delete(session.id);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName={isFocused ? 'ring-1 ring-primary/40 rounded-md' : ''}\n\t\t\t\t\t>\n\t\t\t\t\t\t<SessionItem\n\t\t\t\t\t\t\tsession={fullSession}\n\t\t\t\t\t\t\tisActive={session.id === activeSessionId}\n\t\t\t\t\t\t\tonClick={() => handleSessionClick(session.id)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t})}\n\t\t\t{isFetchingNextPage && (\n\t\t\t\t<div className=\"flex justify-center py-3\">\n\t\t\t\t\t<Loader2 className=\"h-4 w-4 animate-spin text-muted-foreground\" />\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n",
129
+ "import { create } from 'zustand';\n\ntype FocusArea = 'input' | 'sessions' | 'git' | null;\n\ninterface FocusState {\n\tcurrentFocus: FocusArea;\n\tsessionIndex: number;\n\tgitFileIndex: number;\n\n\tsetFocus: (area: FocusArea) => void;\n\tsetSessionIndex: (index: number) => void;\n\tsetGitFileIndex: (index: number) => void;\n\tresetGitFileIndex: () => void;\n\tresetSessionIndex: () => void;\n}\n\nexport const useFocusStore = create<FocusState>((set) => ({\n\tcurrentFocus: null,\n\tsessionIndex: 0,\n\tgitFileIndex: 0,\n\n\tsetFocus: (area) => set({ currentFocus: area }),\n\tsetSessionIndex: (index) => set({ sessionIndex: index }),\n\tsetGitFileIndex: (index) => set({ gitFileIndex: index }),\n\tresetGitFileIndex: () => set({ gitFileIndex: 0 }),\n\tresetSessionIndex: () => set({ sessionIndex: 0 }),\n}));\n",
130
+ "import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport {\n\tprism,\n\tvscDarkPlus,\n} from 'react-syntax-highlighter/dist/esm/styles/prism';\nimport type { GitDiffResponse } from '../../types/api';\nimport { getRuntimeApiBaseUrl } from '../../lib/config';\n\nconst IMAGE_EXTENSIONS = new Set([\n\t'png',\n\t'jpg',\n\t'jpeg',\n\t'gif',\n\t'svg',\n\t'webp',\n\t'ico',\n\t'bmp',\n\t'avif',\n]);\n\nfunction isImageFile(filePath: string): boolean {\n\tconst ext = filePath.split('.').pop()?.toLowerCase() ?? '';\n\treturn IMAGE_EXTENSIONS.has(ext);\n}\n\ninterface GitDiffViewerProps {\n\tdiff: GitDiffResponse;\n}\n\ninterface DiffLine {\n\toldLineNumber: number | null;\n\tnewLineNumber: number | null;\n\tcontent: string;\n\tcodeContent: string; // Content without +/- prefix\n\ttype: 'header' | 'hunk' | 'add' | 'delete' | 'context' | 'meta';\n}\n\nconst LANGUAGE_MAP: Record<string, string> = {\n\tjs: 'javascript',\n\tjsx: 'jsx',\n\tts: 'typescript',\n\ttsx: 'tsx',\n\tpy: 'python',\n\trb: 'ruby',\n\tgo: 'go',\n\trs: 'rust',\n\tjava: 'java',\n\tc: 'c',\n\tcpp: 'cpp',\n\th: 'c',\n\thpp: 'cpp',\n\tcs: 'csharp',\n\tphp: 'php',\n\tsh: 'bash',\n\tbash: 'bash',\n\tzsh: 'bash',\n\tsql: 'sql',\n\tjson: 'json',\n\tyaml: 'yaml',\n\tyml: 'yaml',\n\txml: 'xml',\n\thtml: 'html',\n\tcss: 'css',\n\tscss: 'scss',\n\tmd: 'markdown',\n\ttxt: 'plaintext',\n\tsvelte: 'svelte',\n};\n\nfunction inferLanguageFromPath(path: string): string {\n\tconst extension = path.split('.').pop()?.toLowerCase() ?? '';\n\tif (!extension) {\n\t\treturn 'plaintext';\n\t}\n\treturn LANGUAGE_MAP[extension] ?? 'plaintext';\n}\n\n/**\n * Get just the filename from a path\n */\nfunction getFileName(path: string): string {\n\tconst parts = path.split('/');\n\treturn parts[parts.length - 1];\n}\n\nexport function GitDiffViewer({ diff }: GitDiffViewerProps) {\n\tconst syntaxTheme = document?.documentElement.classList.contains('dark')\n\t\t? vscDarkPlus\n\t\t: prism;\n\n\tconst resolvedLanguage =\n\t\tdiff.language && diff.language.trim().length > 0\n\t\t\t? diff.language\n\t\t\t: inferLanguageFromPath(diff.file);\n\n\t// Get just the filename for the internal header\n\tconst fileName = getFileName(diff.file);\n\n\t// Handle new files - show full content instead of diff\n\tif (diff.isNewFile && diff.content) {\n\t\treturn (\n\t\t\t<div className=\"flex flex-col h-full bg-background\">\n\t\t\t\t{/* Header with just filename and stats */}\n\t\t\t\t<div className=\"px-4 py-2 bg-muted/50 flex items-center justify-between min-h-10\">\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName=\"font-mono text-sm text-foreground truncate\"\n\t\t\t\t\t\ttitle={diff.file}\n\t\t\t\t\t>\n\t\t\t\t\t\t{fileName}\n\t\t\t\t\t</span>\n\t\t\t\t\t<div className=\"flex items-center gap-3 text-xs flex-shrink-0\">\n\t\t\t\t\t\t<span className=\"text-green-600 dark:text-green-500\">\n\t\t\t\t\t\t\t+{diff.insertions}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className=\"text-muted-foreground\">{resolvedLanguage}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t{/* New file banner */}\n\t\t\t\t<div className=\"px-4 py-3 bg-green-500/10 border-b border-green-500/20\">\n\t\t\t\t\t<p className=\"text-sm text-green-600 dark:text-green-400 font-medium\">\n\t\t\t\t\t\tNew file: {diff.insertions} lines\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Full file content with syntax highlighting */}\n\t\t\t\t<div className=\"flex-1 overflow-auto\">\n\t\t\t\t\t<div className=\"code-with-line-numbers\">\n\t\t\t\t\t\t<SyntaxHighlighter\n\t\t\t\t\t\t\tlanguage={resolvedLanguage}\n\t\t\t\t\t\t\tstyle={syntaxTheme}\n\t\t\t\t\t\t\twrapLines\n\t\t\t\t\t\t\twrapLongLines\n\t\t\t\t\t\t\tlineProps={() => ({\n\t\t\t\t\t\t\t\tclassName: 'code-line',\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\tcustomStyle={{\n\t\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\t\tpadding: '1rem',\n\t\t\t\t\t\t\t\tbackground: 'transparent',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tcodeTagProps={{\n\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{diff.content}\n\t\t\t\t\t\t</SyntaxHighlighter>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// Handle binary files\n\tif (diff.isBinary) {\n\t\tconst isImage = isImageFile(diff.file);\n\t\tconst imageUrl = isImage\n\t\t\t? `${getRuntimeApiBaseUrl()}/v1/files/raw?path=${encodeURIComponent(diff.file)}`\n\t\t\t: null;\n\n\t\treturn (\n\t\t\t<div className=\"flex flex-col h-full bg-background\">\n\t\t\t\t{/* Header with just filename */}\n\t\t\t\t<div className=\"px-4 py-2 bg-muted/50 flex items-center justify-between min-h-10\">\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName=\"font-mono text-sm text-foreground truncate\"\n\t\t\t\t\t\ttitle={diff.file}\n\t\t\t\t\t>\n\t\t\t\t\t\t{fileName}\n\t\t\t\t\t</span>\n\t\t\t\t\t<div className=\"flex items-center gap-3 text-xs flex-shrink-0\">\n\t\t\t\t\t\t<span className=\"text-muted-foreground\">Binary file</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t{imageUrl ? (\n\t\t\t\t\t<div className=\"flex-1 flex items-center justify-center p-4 overflow-auto\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tsrc={imageUrl}\n\t\t\t\t\t\t\talt={fileName}\n\t\t\t\t\t\t\tclassName=\"max-w-full max-h-[60vh] object-contain rounded border border-border\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"flex-1 flex items-center justify-center\">\n\t\t\t\t\t\t<div className=\"p-4 text-center\">\n\t\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\tBinary file - cannot display diff\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// Parse the diff into lines with line numbers (for modified files)\n\tconst lines = diff.diff.split('\\n');\n\tconst diffLines: DiffLine[] = [];\n\n\tlet oldLineNum = 0;\n\tlet newLineNum = 0;\n\n\tfor (const line of lines) {\n\t\tif (line.startsWith('@@')) {\n\t\t\t// Parse hunk header to get starting line numbers\n\t\t\tconst match = line.match(/@@ -(\\d+)(?:,\\d+)? \\+(\\d+)(?:,\\d+)? @@/);\n\t\t\tif (match) {\n\t\t\t\toldLineNum = parseInt(match[1], 10);\n\t\t\t\tnewLineNum = parseInt(match[2], 10);\n\t\t\t}\n\t\t\tdiffLines.push({\n\t\t\t\toldLineNumber: null,\n\t\t\t\tnewLineNumber: null,\n\t\t\t\tcontent: line,\n\t\t\t\tcodeContent: line,\n\t\t\t\ttype: 'hunk',\n\t\t\t});\n\t\t} else if (\n\t\t\tline.startsWith('diff') ||\n\t\t\tline.startsWith('index') ||\n\t\t\tline.startsWith('---') ||\n\t\t\tline.startsWith('+++')\n\t\t) {\n\t\t\tdiffLines.push({\n\t\t\t\toldLineNumber: null,\n\t\t\t\tnewLineNumber: null,\n\t\t\t\tcontent: line,\n\t\t\t\tcodeContent: line,\n\t\t\t\ttype: 'meta',\n\t\t\t});\n\t\t} else if (line.startsWith('+')) {\n\t\t\tdiffLines.push({\n\t\t\t\toldLineNumber: null,\n\t\t\t\tnewLineNumber: newLineNum,\n\t\t\t\tcontent: line,\n\t\t\t\tcodeContent: line.slice(1), // Remove + prefix for syntax highlighting\n\t\t\t\ttype: 'add',\n\t\t\t});\n\t\t\tnewLineNum++;\n\t\t} else if (line.startsWith('-')) {\n\t\t\tdiffLines.push({\n\t\t\t\toldLineNumber: oldLineNum,\n\t\t\t\tnewLineNumber: null,\n\t\t\t\tcontent: line,\n\t\t\t\tcodeContent: line.slice(1), // Remove - prefix for syntax highlighting\n\t\t\t\ttype: 'delete',\n\t\t\t});\n\t\t\toldLineNum++;\n\t\t} else {\n\t\t\t// Context line\n\t\t\tdiffLines.push({\n\t\t\t\toldLineNumber: oldLineNum,\n\t\t\t\tnewLineNumber: newLineNum,\n\t\t\t\tcontent: line,\n\t\t\t\tcodeContent: line,\n\t\t\t\ttype: 'context',\n\t\t\t});\n\t\t\toldLineNum++;\n\t\t\tnewLineNum++;\n\t\t}\n\t}\n\n\t// Render a single diff line with syntax highlighting\n\tconst renderLine = (diffLine: DiffLine, index: number) => {\n\t\tlet rowClassName = 'flex hover:bg-muted/20';\n\t\tlet lineNumberClassName =\n\t\t\t'flex-shrink-0 w-20 px-2 py-0.5 text-xs font-mono select-none border-r border-border';\n\t\tlet contentClassName =\n\t\t\t'flex-1 px-4 py-0.5 font-mono text-xs overflow-x-auto';\n\n\t\t// Apply background colors for add/delete/hunk\n\t\tif (diffLine.type === 'hunk') {\n\t\t\trowClassName += ' bg-blue-500/10';\n\t\t\tlineNumberClassName += ' text-blue-600 dark:text-blue-400';\n\t\t\tcontentClassName += ' text-blue-600 dark:text-blue-400 font-semibold';\n\t\t} else if (diffLine.type === 'add') {\n\t\t\trowClassName += ' bg-green-500/10';\n\t\t\tlineNumberClassName += ' text-green-700 dark:text-green-400';\n\t\t\tcontentClassName += ' text-green-700 dark:text-green-400';\n\t\t} else if (diffLine.type === 'delete') {\n\t\t\trowClassName += ' bg-red-500/10';\n\t\t\tlineNumberClassName += ' text-red-600 dark:text-red-400';\n\t\t\tcontentClassName += ' text-red-600 dark:text-red-400';\n\t\t} else if (diffLine.type === 'meta') {\n\t\t\tcontentClassName += ' text-muted-foreground';\n\t\t\tlineNumberClassName += ' text-muted-foreground';\n\t\t} else {\n\t\t\tcontentClassName += ' text-foreground/80';\n\t\t\tlineNumberClassName += ' text-muted-foreground';\n\t\t}\n\n\t\tconst oldNum =\n\t\t\tdiffLine.oldLineNumber !== null ? diffLine.oldLineNumber.toString() : '';\n\t\tconst newNum =\n\t\t\tdiffLine.newLineNumber !== null ? diffLine.newLineNumber.toString() : '';\n\n\t\t// For code lines (not meta/hunk), apply syntax highlighting\n\t\tlet renderedContent: React.ReactNode = diffLine.content || ' ';\n\n\t\tif (\n\t\t\tdiffLine.type !== 'meta' &&\n\t\t\tdiffLine.type !== 'hunk' &&\n\t\t\tresolvedLanguage !== 'plaintext' &&\n\t\t\tdiffLine.codeContent.trim()\n\t\t) {\n\t\t\trenderedContent = (\n\t\t\t\t<SyntaxHighlighter\n\t\t\t\t\tlanguage={resolvedLanguage}\n\t\t\t\t\tstyle={syntaxTheme}\n\t\t\t\t\tcustomStyle={{\n\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\tbackground: 'transparent',\n\t\t\t\t\t\tdisplay: 'inline',\n\t\t\t\t\t\tfontSize: 'inherit',\n\t\t\t\t\t\tlineHeight: 'inherit',\n\t\t\t\t\t}}\n\t\t\t\t\tcodeTagProps={{\n\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\tfontFamily: 'inherit',\n\t\t\t\t\t\t\tbackground: 'transparent',\n\t\t\t\t\t\t},\n\t\t\t\t\t}}\n\t\t\t\t\tPreTag=\"span\"\n\t\t\t\t>\n\t\t\t\t\t{diffLine.codeContent}\n\t\t\t\t</SyntaxHighlighter>\n\t\t\t);\n\n\t\t\t// Add back the +/- prefix if it was an add/delete\n\t\t\tif (diffLine.type === 'add') {\n\t\t\t\trenderedContent = (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<span className=\"select-none\">+</span>\n\t\t\t\t\t\t{renderedContent}\n\t\t\t\t\t</>\n\t\t\t\t);\n\t\t\t} else if (diffLine.type === 'delete') {\n\t\t\t\trenderedContent = (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<span className=\"select-none\">-</span>\n\t\t\t\t\t\t{renderedContent}\n\t\t\t\t\t</>\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn (\n\t\t\t<div key={index} className={rowClassName}>\n\t\t\t\t{/* Line numbers - using aria-hidden and pointer-events:none for better selection behavior */}\n\t\t\t\t<div\n\t\t\t\t\tclassName={lineNumberClassName}\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\tstyle={{ pointerEvents: 'none' }}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"flex justify-between gap-2\">\n\t\t\t\t\t\t<span className=\"text-right w-8\">{oldNum}</span>\n\t\t\t\t\t\t<span className=\"text-right w-8\">{newNum}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div className={contentClassName}>{renderedContent}</div>\n\t\t\t</div>\n\t\t);\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-col h-full bg-background\">\n\t\t\t{/* Header with just filename and stats */}\n\t\t\t<div className=\"px-4 py-2 bg-muted/50 flex items-center justify-between min-h-10\">\n\t\t\t\t<span\n\t\t\t\t\tclassName=\"font-mono text-sm text-foreground truncate\"\n\t\t\t\t\ttitle={diff.file}\n\t\t\t\t>\n\t\t\t\t\t{fileName}\n\t\t\t\t</span>\n\t\t\t\t<div className=\"flex items-center gap-3 text-xs flex-shrink-0\">\n\t\t\t\t\t{diff.insertions > 0 && (\n\t\t\t\t\t\t<span className=\"text-green-600 dark:text-green-500\">\n\t\t\t\t\t\t\t+{diff.insertions}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t\t{diff.deletions > 0 && (\n\t\t\t\t\t\t<span className=\"text-red-600 dark:text-red-500\">\n\t\t\t\t\t\t\t-{diff.deletions}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t\t<span className=\"text-muted-foreground\">{resolvedLanguage}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Diff content */}\n\t\t\t<div className=\"flex-1 overflow-auto\">\n\t\t\t\t{diff.diff.trim() === '' ? (\n\t\t\t\t\t<div className=\"p-4 text-sm text-muted-foreground\">\n\t\t\t\t\t\tNo changes to display\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"min-w-max\">{diffLines.map(renderLine)}</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n",
131
+ "import { GitCommit, CheckSquare, AlertTriangle } from 'lucide-react';\nimport type { GitStatusResponse } from '../../types/api';\nimport { Button } from '../ui/Button';\nimport { GitFileItem } from './GitFileItem';\nimport { useGitStore } from '../../stores/gitStore';\nimport { useStageFiles, useUnstageFiles } from '../../hooks/useGit';\nimport { useFocusStore } from '../../stores/focusStore';\nimport { useEffect, useRef, useMemo } from 'react';\n\ninterface GitFileListProps {\n\tstatus: GitStatusResponse;\n}\n\nexport function GitFileList({ status }: GitFileListProps) {\n\tconst { openCommitModal, openDiff } = useGitStore();\n\tconst stageFiles = useStageFiles();\n\tconst unstageFiles = useUnstageFiles();\n\tconst { currentFocus, gitFileIndex } = useFocusStore();\n\tconst itemRefs = useRef<Map<number, HTMLDivElement>>(new Map());\n\n\tconst hasConflicts = (status.conflicted?.length ?? 0) > 0;\n\tconst hasStaged = status.staged.length > 0;\n\tconst hasUnstaged = status.unstaged.length > 0 || status.untracked.length > 0;\n\n\tconst unstagedFiles = [...status.unstaged, ...status.untracked];\n\tconst hasUnstagedFiles = unstagedFiles.length > 0;\n\n\tconst _allFiles = useMemo(() => {\n\t\treturn [\n\t\t\t...(status.conflicted ?? []),\n\t\t\t...status.staged,\n\t\t\t...status.unstaged,\n\t\t\t...status.untracked,\n\t\t];\n\t}, [status]);\n\n\tconst unstagedPaths = new Set(status.unstaged.map((f) => f.path));\n\n\tconst handleStageAll = () => {\n\t\tconst filesToStage = unstagedFiles.map((f) => f.path);\n\t\tif (filesToStage.length > 0) {\n\t\t\tstageFiles.mutate(filesToStage);\n\t\t}\n\t};\n\n\tconst _handleUnstageAll = () => {\n\t\tconst filesToUnstage = status.staged.map((f) => f.path);\n\t\tif (filesToUnstage.length > 0) {\n\t\t\tunstageFiles.mutate(filesToUnstage);\n\t\t}\n\t};\n\n\tconst conflictedLength = status.conflicted?.length ?? 0;\n\n\tuseEffect(() => {\n\t\tif (currentFocus === 'git' && gitFileIndex >= 0) {\n\t\t\tconst element = itemRefs.current.get(gitFileIndex);\n\t\t\telement?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n\n\t\t\tconst allFiles = [\n\t\t\t\t...(status.conflicted ?? []),\n\t\t\t\t...status.staged,\n\t\t\t\t...status.unstaged,\n\t\t\t\t...status.untracked,\n\t\t\t];\n\t\t\tconst focusedFile = allFiles[gitFileIndex];\n\t\t\tif (focusedFile) {\n\t\t\t\tconst isStaged = status.staged.includes(focusedFile);\n\t\t\t\topenDiff(focusedFile.path, isStaged);\n\t\t\t}\n\t\t}\n\t}, [\n\t\tcurrentFocus,\n\t\tgitFileIndex,\n\t\tstatus.conflicted,\n\t\tstatus.staged,\n\t\tstatus.unstaged,\n\t\tstatus.untracked,\n\t\topenDiff,\n\t]);\n\n\treturn (\n\t\t<div className=\"flex flex-col\">\n\t\t\t{hasConflicts && (\n\t\t\t\t<div className=\"border-b border-border\">\n\t\t\t\t\t<div className=\"px-3 py-2 bg-red-500/10 flex items-center justify-between\">\n\t\t\t\t\t\t<span className=\"text-xs font-semibold text-red-500 uppercase flex items-center gap-1.5\">\n\t\t\t\t\t\t\t<AlertTriangle className=\"w-3.5 h-3.5\" />\n\t\t\t\t\t\t\tConflicts ({conflictedLength})\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"divide-y divide-border\">\n\t\t\t\t\t\t{status.conflicted?.map((file, index) => {\n\t\t\t\t\t\t\tconst globalIndex = index;\n\t\t\t\t\t\t\tconst isFocused =\n\t\t\t\t\t\t\t\tcurrentFocus === 'git' && gitFileIndex === globalIndex;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={file.path}\n\t\t\t\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\t\t\t\tif (el) itemRefs.current.set(globalIndex, el);\n\t\t\t\t\t\t\t\t\t\telse itemRefs.current.delete(globalIndex);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\t\t\tisFocused ? 'ring-1 ring-inset ring-primary/40' : ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<GitFileItem file={file} staged={false} />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{hasStaged && (\n\t\t\t\t<div className=\"border-b border-border\">\n\t\t\t\t\t<div className=\"px-3 py-2 bg-muted/50 flex items-center justify-between\">\n\t\t\t\t\t\t<span className=\"text-xs font-semibold text-foreground uppercase\">\n\t\t\t\t\t\t\tStaged Changes ({status.staged.length})\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t{status.staged.length > 0 && !hasConflicts && (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\tonClick={openCommitModal}\n\t\t\t\t\t\t\t\t\tclassName=\"h-6 text-xs\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<GitCommit className=\"w-3 h-3 mr-1\" />\n\t\t\t\t\t\t\t\t\tCommit\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{status.staged.length > 0 && hasConflicts && (\n\t\t\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tResolve conflicts first\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"divide-y divide-border\">\n\t\t\t\t\t\t{status.staged.map((file, index) => {\n\t\t\t\t\t\t\tconst globalIndex = conflictedLength + index;\n\t\t\t\t\t\t\tconst isFocused =\n\t\t\t\t\t\t\t\tcurrentFocus === 'git' && gitFileIndex === globalIndex;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={file.path}\n\t\t\t\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\t\t\t\tif (el) itemRefs.current.set(globalIndex, el);\n\t\t\t\t\t\t\t\t\t\telse itemRefs.current.delete(globalIndex);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\t\t\tisFocused ? 'ring-1 ring-inset ring-primary/40' : ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<GitFileItem\n\t\t\t\t\t\t\t\t\t\tfile={file}\n\t\t\t\t\t\t\t\t\t\tstaged={true}\n\t\t\t\t\t\t\t\t\t\tshowModifiedIndicator={unstagedPaths.has(file.path)}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{hasUnstaged && (\n\t\t\t\t<div>\n\t\t\t\t\t<div className=\"px-3 py-2 bg-muted/50 flex items-center justify-between\">\n\t\t\t\t\t\t<span className=\"text-xs font-semibold text-foreground uppercase\">\n\t\t\t\t\t\t\tChanges ({status.unstaged.length + status.untracked.length})\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{hasUnstagedFiles && (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tonClick={handleStageAll}\n\t\t\t\t\t\t\t\ttitle=\"Stage all changes\"\n\t\t\t\t\t\t\t\tclassName=\"h-6 text-xs\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<CheckSquare className=\"w-3 h-3 mr-1\" />\n\t\t\t\t\t\t\t\tStage All\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"divide-y divide-border\">\n\t\t\t\t\t\t{status.unstaged.map((file, index) => {\n\t\t\t\t\t\t\tconst globalIndex =\n\t\t\t\t\t\t\t\tconflictedLength + status.staged.length + index;\n\t\t\t\t\t\t\tconst isFocused =\n\t\t\t\t\t\t\t\tcurrentFocus === 'git' && gitFileIndex === globalIndex;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={file.path}\n\t\t\t\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\t\t\t\tif (el) itemRefs.current.set(globalIndex, el);\n\t\t\t\t\t\t\t\t\t\telse itemRefs.current.delete(globalIndex);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\t\t\tisFocused ? 'ring-1 ring-inset ring-primary/40' : ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<GitFileItem file={file} staged={false} />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t\t{status.untracked.map((file, index) => {\n\t\t\t\t\t\t\tconst globalIndex =\n\t\t\t\t\t\t\t\tconflictedLength +\n\t\t\t\t\t\t\t\tstatus.staged.length +\n\t\t\t\t\t\t\t\tstatus.unstaged.length +\n\t\t\t\t\t\t\t\tindex;\n\t\t\t\t\t\t\tconst isFocused =\n\t\t\t\t\t\t\t\tcurrentFocus === 'git' && gitFileIndex === globalIndex;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={file.path}\n\t\t\t\t\t\t\t\t\tref={(el) => {\n\t\t\t\t\t\t\t\t\t\tif (el) itemRefs.current.set(globalIndex, el);\n\t\t\t\t\t\t\t\t\t\telse itemRefs.current.delete(globalIndex);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\t\t\tisFocused ? 'ring-1 ring-inset ring-primary/40' : ''\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<GitFileItem file={file} staged={false} />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{!hasConflicts && !hasStaged && !hasUnstaged && (\n\t\t\t\t<div className=\"p-4 text-sm text-muted-foreground text-center\">\n\t\t\t\t\tNo changes\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n",
132
+ "import {\n\tFileIcon,\n\tFilePlus,\n\tFileX,\n\tCheck,\n\tAlertCircle,\n\tAlertTriangle,\n\tRotateCcw,\n\tTrash2,\n} from 'lucide-react';\nimport type { GitFileStatus } from '../../types/api';\nimport {\n\tuseStageFiles,\n\tuseUnstageFiles,\n\tuseRestoreFiles,\n\tuseDeleteFiles,\n} from '../../hooks/useGit';\nimport { useGitStore } from '../../stores/gitStore';\nimport { useConfirmationStore } from '../../stores/confirmationStore';\nimport { useState } from 'react';\n\ninterface GitFileItemProps {\n\tfile: GitFileStatus;\n\tstaged: boolean;\n\tshowModifiedIndicator?: boolean;\n}\n\n/**\n * Smart path truncation that shows the most relevant parts\n * - For short paths: show full path\n * - For long paths: show parent directory + filename\n * Examples:\n * \"src/index.ts\" -> \"src/index.ts\"\n * \"packages/web-sdk/src/components/git/GitFileItem.tsx\" -> \"../git/GitFileItem.tsx\"\n * \"docs/git-implementation-rework-plan.md\" -> \"../git-implementation-rework-plan.md\"\n */\nfunction smartTruncatePath(path: string, maxParts = 2): string {\n\tconst parts = path.split('/');\n\n\t// If path is short enough, show it all\n\tif (parts.length <= maxParts + 1) {\n\t\treturn path;\n\t}\n\n\t// Show last N parts with ellipsis\n\tconst truncated = parts.slice(-maxParts);\n\treturn `../${truncated.join('/')}`;\n}\n\nexport function GitFileItem({\n\tfile,\n\tstaged,\n\tshowModifiedIndicator = false,\n}: GitFileItemProps) {\n\tconst { openDiff } = useGitStore();\n\tconst stageFiles = useStageFiles();\n\tconst unstageFiles = useUnstageFiles();\n\tconst restoreFiles = useRestoreFiles();\n\tconst deleteFiles = useDeleteFiles();\n\tconst openConfirmation = useConfirmationStore(\n\t\t(state) => state.openConfirmation,\n\t);\n\tconst [isChecked, setIsChecked] = useState(staged);\n\n\tconst handleCheckChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n\t\te.stopPropagation();\n\t\tconst checked = e.target.checked;\n\t\tsetIsChecked(checked);\n\n\t\ttry {\n\t\t\tif (checked) {\n\t\t\t\tawait stageFiles.mutateAsync([file.path]);\n\t\t\t} else {\n\t\t\t\tawait unstageFiles.mutateAsync([file.path]);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// Revert on error\n\t\t\tsetIsChecked(!checked);\n\t\t\tconsole.error('Failed to stage/unstage file:', error);\n\t\t}\n\t};\n\n\tconst handleRestore = async (e: React.MouseEvent) => {\n\t\te.stopPropagation();\n\t\topenConfirmation({\n\t\t\ttitle: 'Restore File',\n\t\t\tmessage: `Restore ${file.path} to HEAD state? This will discard all changes.`,\n\t\t\tconfirmLabel: 'Restore',\n\t\t\tvariant: 'destructive',\n\t\t\tonConfirm: async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait restoreFiles.mutateAsync([file.path]);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('Failed to restore file:', error);\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t};\n\n\tconst handleDelete = async (e: React.MouseEvent) => {\n\t\te.stopPropagation();\n\t\topenConfirmation({\n\t\t\ttitle: 'Delete File',\n\t\t\tmessage: `Delete ${file.path}? This will permanently remove the untracked file.`,\n\t\t\tconfirmLabel: 'Delete',\n\t\t\tvariant: 'destructive',\n\t\t\tonConfirm: async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait deleteFiles.mutateAsync([file.path]);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('Failed to delete file:', error);\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t};\n\n\tconst handleClick = () => {\n\t\topenDiff(file.path, staged);\n\t};\n\n\t// Status colors and icons\n\tconst getStatusConfig = () => {\n\t\tswitch (file.status) {\n\t\t\tcase 'added':\n\t\t\tcase 'untracked':\n\t\t\t\treturn {\n\t\t\t\t\ticon: FilePlus,\n\t\t\t\t\tcolor: 'text-green-500',\n\t\t\t\t\tlabel: 'A',\n\t\t\t\t\tlabelColor: 'text-green-500',\n\t\t\t\t};\n\t\t\tcase 'deleted':\n\t\t\t\treturn {\n\t\t\t\t\ticon: FileX,\n\t\t\t\t\tcolor: 'text-red-500',\n\t\t\t\t\tlabel: 'D',\n\t\t\t\t\tlabelColor: 'text-red-500',\n\t\t\t\t};\n\t\t\tcase 'modified':\n\t\t\t\treturn {\n\t\t\t\t\ticon: FileIcon,\n\t\t\t\t\tcolor: 'text-blue-500',\n\t\t\t\t\tlabel: 'M',\n\t\t\t\t\tlabelColor: 'text-blue-500',\n\t\t\t\t};\n\t\t\tcase 'renamed':\n\t\t\t\treturn {\n\t\t\t\t\ticon: FileIcon,\n\t\t\t\t\tcolor: 'text-purple-500',\n\t\t\t\t\tlabel: 'R',\n\t\t\t\t\tlabelColor: 'text-purple-500',\n\t\t\t\t};\n\t\t\tcase 'conflicted':\n\t\t\t\treturn {\n\t\t\t\t\ticon: AlertTriangle,\n\t\t\t\t\tcolor: 'text-red-500',\n\t\t\t\t\tlabel: 'C',\n\t\t\t\t\tlabelColor: 'text-red-500',\n\t\t\t\t};\n\t\t\tdefault:\n\t\t\t\treturn {\n\t\t\t\t\ticon: FileIcon,\n\t\t\t\t\tcolor: 'text-muted-foreground',\n\t\t\t\t\tlabel: '?',\n\t\t\t\t\tlabelColor: 'text-muted-foreground',\n\t\t\t\t};\n\t\t}\n\t};\n\n\tconst config = getStatusConfig();\n\tconst Icon = config.icon;\n\n\t// Smart truncation: show enough context without wrapping\n\tconst displayPath = smartTruncatePath(file.path, 2);\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tclassName=\"flex items-center gap-2 px-3 py-1.5 hover:bg-muted/50 cursor-pointer group transition-colors w-full text-left h-9\"\n\t\t\tonClick={handleClick}\n\t\t>\n\t\t\t<input\n\t\t\t\ttype=\"checkbox\"\n\t\t\t\tchecked={isChecked}\n\t\t\t\tonChange={handleCheckChange}\n\t\t\t\tonClick={(e) => e.stopPropagation()}\n\t\t\t\tclassName=\"w-4 h-4 rounded border-border\"\n\t\t\t\taria-label={`${isChecked ? 'Unstage' : 'Stage'} ${file.path}`}\n\t\t\t/>\n\n\t\t\t<div className=\"flex items-center gap-2 flex-1 min-w-0\">\n\t\t\t\t<Icon className={`w-4 h-4 flex-shrink-0 ${config.color}`} />\n\t\t\t\t<div className=\"flex-1 min-w-0\">\n\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName=\"text-sm text-foreground font-mono truncate\"\n\t\t\t\t\t\t\ttitle={`${file.path}\\n${file.absPath}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{displayPath}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<div className=\"flex items-center gap-1 flex-shrink-0\">\n\t\t\t\t\t\t\t<span className={`text-xs font-semibold ${config.labelColor}`}>\n\t\t\t\t\t\t\t\t{config.label}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{showModifiedIndicator && (\n\t\t\t\t\t\t\t\t<div title=\"Also modified in working directory\">\n\t\t\t\t\t\t\t\t\t<AlertCircle className=\"w-3.5 h-3.5 text-orange-500\" />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Stats */}\n\t\t\t{file.insertions !== undefined || file.deletions !== undefined ? (\n\t\t\t\t<div className=\"flex items-center gap-2 text-xs flex-shrink-0\">\n\t\t\t\t\t{file.insertions !== undefined && file.insertions > 0 && (\n\t\t\t\t\t\t<span className=\"text-green-500\">+{file.insertions}</span>\n\t\t\t\t\t)}\n\t\t\t\t\t{file.deletions !== undefined && file.deletions > 0 && (\n\t\t\t\t\t\t<span className=\"text-red-500\">-{file.deletions}</span>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t) : null}\n\n\t\t\t{/* Delete button for untracked files */}\n\t\t\t<div className=\"w-7 flex items-center justify-center flex-shrink-0\">\n\t\t\t\t{!staged && file.status === 'untracked' && (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={handleDelete}\n\t\t\t\t\t\tclassName=\"p-1 hover:bg-destructive/10 rounded opacity-0 group-hover:opacity-100 transition-opacity\"\n\t\t\t\t\t\ttitle=\"Delete untracked file\"\n\t\t\t\t\t\taria-label={`Delete ${file.path}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Trash2 className=\"w-4 h-4 text-destructive\" />\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t\t{!staged && file.status !== 'untracked' && file.status !== 'added' && (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={handleRestore}\n\t\t\t\t\t\tclassName=\"p-1 hover:bg-destructive/10 rounded opacity-0 group-hover:opacity-100 transition-opacity\"\n\t\t\t\t\t\ttitle=\"Restore file to HEAD (Shift+R)\"\n\t\t\t\t\t\taria-label={`Restore ${file.path}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t<RotateCcw className=\"w-4 h-4 text-destructive\" />\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t\t{staged && !showModifiedIndicator && (\n\t\t\t\t\t<Check className=\"w-4 h-4 text-green-500 opacity-0 group-hover:opacity-100 transition-opacity\" />\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</button>\n\t);\n}\n",
133
+ "import { memo, useCallback, useEffect, useState } from 'react';\nimport {\n\tFolderGit2,\n\tChevronRight,\n\tChevronDown,\n\tDownload,\n\tGitBranch,\n\tGlobe,\n\tPlus,\n\tRefreshCw,\n\tSparkles,\n\tTrash2,\n\tUpload,\n\tX,\n} from 'lucide-react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useGitStore } from '../../stores/gitStore';\nimport { usePanelWidthStore } from '../../stores/panelWidthStore';\nimport {\n\tuseGitStatus,\n\tusePullChanges,\n\tusePushCommits,\n\tuseGitInit,\n\tuseGitRemotes,\n\tuseAddRemote,\n\tuseRemoveRemote,\n} from '../../hooks/useGit';\nimport { Button } from '../ui/Button';\nimport { GitFileList } from './GitFileList';\nimport { ResizeHandle } from '../ui/ResizeHandle';\n\nconst PANEL_KEY = 'git';\nconst DEFAULT_WIDTH = 320;\nconst MIN_WIDTH = 320;\nconst MAX_WIDTH = 600;\n\ninterface GitError {\n\tid: string;\n\tmessage: string;\n\tcontext?: string;\n}\n\ninterface GitSidebarProps {\n\tonFixWithAI?: (errorMessage: string) => void;\n}\n\nexport const GitSidebar = memo(function GitSidebar({\n\tonFixWithAI,\n}: GitSidebarProps) {\n\tconst isExpanded = useGitStore((state) => state.isExpanded);\n\tconst collapseSidebar = useGitStore((state) => state.collapseSidebar);\n\tconst panelWidth = usePanelWidthStore(\n\t\t(s) => s.widths[PANEL_KEY] ?? DEFAULT_WIDTH,\n\t);\n\tconst { data: status, isLoading, error, refetch } = useGitStatus();\n\tconst { data: remotes } = useGitRemotes();\n\tconst queryClient = useQueryClient();\n\tconst pushMutation = usePushCommits();\n\tconst pullMutation = usePullChanges();\n\tconst initMutation = useGitInit();\n\tconst addRemoteMutation = useAddRemote();\n\tconst removeRemoteMutation = useRemoveRemote();\n\tconst [errors, setErrors] = useState<GitError[]>([]);\n\tconst [showRemotes, setShowRemotes] = useState(false);\n\tconst [showAddRemote, setShowAddRemote] = useState(false);\n\tconst [remoteName, setRemoteName] = useState('origin');\n\tconst [remoteUrl, setRemoteUrl] = useState('');\n\tconst [confirmRemoveRemote, setConfirmRemoveRemote] = useState<string | null>(\n\t\tnull,\n\t);\n\n\tuseEffect(() => {\n\t\tif (isExpanded) {\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['git', 'status'] });\n\t\t}\n\t}, [isExpanded, queryClient]);\n\n\tconst handleRefresh = () => {\n\t\trefetch();\n\t};\n\n\tconst addError = useCallback((message: string, context?: string) => {\n\t\tconst id = `${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n\t\tsetErrors((prev) => [...prev, { id, message, context }]);\n\t}, []);\n\n\tconst dismissError = useCallback((id: string) => {\n\t\tsetErrors((prev) => prev.filter((e) => e.id !== id));\n\t}, []);\n\n\tconst handlePush = async () => {\n\t\ttry {\n\t\t\tawait pushMutation.mutateAsync();\n\t\t} catch (err) {\n\t\t\taddError(\n\t\t\t\terr instanceof Error ? err.message : 'Failed to push',\n\t\t\t\t'git push',\n\t\t\t);\n\t\t}\n\t};\n\n\tconst handlePull = async () => {\n\t\ttry {\n\t\t\tawait pullMutation.mutateAsync();\n\t\t} catch (err) {\n\t\t\taddError(\n\t\t\t\terr instanceof Error ? err.message : 'Failed to pull',\n\t\t\t\t'git pull',\n\t\t\t);\n\t\t}\n\t};\n\n\tconst handleAddRemote = async () => {\n\t\tif (!remoteName.trim() || !remoteUrl.trim()) return;\n\t\ttry {\n\t\t\tawait addRemoteMutation.mutateAsync({\n\t\t\t\tname: remoteName.trim(),\n\t\t\t\turl: remoteUrl.trim(),\n\t\t\t});\n\t\t\tsetRemoteName('origin');\n\t\t\tsetRemoteUrl('');\n\t\t\tsetShowAddRemote(false);\n\t\t} catch (err) {\n\t\t\taddError(\n\t\t\t\terr instanceof Error ? err.message : 'Failed to add remote',\n\t\t\t\t'git remote add',\n\t\t\t);\n\t\t}\n\t};\n\n\tconst handleRemoveRemote = async (name: string) => {\n\t\tif (confirmRemoveRemote !== name) {\n\t\t\tsetConfirmRemoveRemote(name);\n\t\t\treturn;\n\t\t}\n\t\tsetConfirmRemoveRemote(null);\n\t\ttry {\n\t\t\tawait removeRemoteMutation.mutateAsync(name);\n\t\t} catch (err) {\n\t\t\taddError(\n\t\t\t\terr instanceof Error ? err.message : 'Failed to remove remote',\n\t\t\t\t'git remote remove',\n\t\t\t);\n\t\t}\n\t};\n\n\tconst handleFixWithAI = useCallback(\n\t\t(gitError: GitError) => {\n\t\t\tconst prompt = gitError.context\n\t\t\t\t? `I got a git error during ${gitError.context}:\\n\\n${gitError.message}\\n\\nPlease help me fix this.`\n\t\t\t\t: `I got a git error:\\n\\n${gitError.message}\\n\\nPlease help me fix this.`;\n\t\t\tdismissError(gitError.id);\n\t\t\tonFixWithAI?.(prompt);\n\t\t},\n\t\t[onFixWithAI, dismissError],\n\t);\n\n\tif (!isExpanded) return null;\n\n\tconst allFiles = [\n\t\t...(status?.conflicted || []),\n\t\t...(status?.staged || []),\n\t\t...(status?.unstaged || []),\n\t\t...(status?.untracked || []),\n\t];\n\n\tconst totalChanges = allFiles.length;\n\tconst hasRemotes = status?.remotes && status.remotes.length > 0;\n\tconst hasUpstream = status?.hasUpstream ?? false;\n\tconst canPush = status && hasRemotes && (status.ahead > 0 || !hasUpstream);\n\tconst _canPull = !!status;\n\tconst hasPendingPulls = status && status.behind > 0;\n\tconst isActing = pushMutation.isPending || pullMutation.isPending;\n\tconst isNotGitRepo =\n\t\terror instanceof Error &&\n\t\terror.message.toLowerCase().includes('not a git repository');\n\n\tconst pushTitle = !hasRemotes\n\t\t? 'No remote configured'\n\t\t: !hasUpstream\n\t\t\t? 'Publish branch to remote'\n\t\t\t: canPush\n\t\t\t\t? `Push ${status?.ahead} commit(s) to remote`\n\t\t\t\t: 'Nothing to push';\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"border-l border-border bg-background flex h-full relative\"\n\t\t\tstyle={{ width: panelWidth }}\n\t\t>\n\t\t\t<ResizeHandle\n\t\t\t\tpanelKey={PANEL_KEY}\n\t\t\t\tside=\"right\"\n\t\t\t\tminWidth={MIN_WIDTH}\n\t\t\t\tmaxWidth={MAX_WIDTH}\n\t\t\t\tdefaultWidth={DEFAULT_WIDTH}\n\t\t\t/>\n\t\t\t<div className=\"flex-1 flex flex-col h-full min-w-0 w-full\">\n\t\t\t\t<div className=\"h-14 border-b border-border px-3 flex items-center justify-between\">\n\t\t\t\t\t<div className=\"flex items-center gap-2 flex-1\">\n\t\t\t\t\t\t<GitBranch className=\"w-4 h-4 text-muted-foreground\" />\n\t\t\t\t\t\t<span className=\"font-medium text-foreground\">\n\t\t\t\t\t\t\tGit Changes\n\t\t\t\t\t\t\t{totalChanges > 0 && (\n\t\t\t\t\t\t\t\t<span className=\"ml-2 text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t({totalChanges})\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tonClick={collapseSidebar}\n\t\t\t\t\t\ttitle=\"Close sidebar\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<ChevronRight className=\"w-4 h-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"flex-1 overflow-y-auto\">\n\t\t\t\t\t{isLoading ? (\n\t\t\t\t\t\t<div className=\"p-4 text-sm text-muted-foreground\">\n\t\t\t\t\t\t\tLoading git status...\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : isNotGitRepo ? (\n\t\t\t\t\t\t<div className=\"p-4 flex flex-col items-center justify-center gap-3 text-center\">\n\t\t\t\t\t\t\t<FolderGit2 className=\"w-10 h-10 text-muted-foreground\" />\n\t\t\t\t\t\t\t<div className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\tNo git repository found in this directory.\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\tonClick={() => initMutation.mutate()}\n\t\t\t\t\t\t\t\tdisabled={initMutation.isPending}\n\t\t\t\t\t\t\t\tclassName=\"gap-1.5\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<GitBranch\n\t\t\t\t\t\t\t\t\tclassName={`w-3.5 h-3.5 ${initMutation.isPending ? 'animate-spin' : ''}`}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t{initMutation.isPending\n\t\t\t\t\t\t\t\t\t? 'Initializing...'\n\t\t\t\t\t\t\t\t\t: 'Initialize Repository'}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t{initMutation.isError && (\n\t\t\t\t\t\t\t\t<span className=\"text-xs text-orange-500\">\n\t\t\t\t\t\t\t\t\t{initMutation.error instanceof Error\n\t\t\t\t\t\t\t\t\t\t? initMutation.error.message\n\t\t\t\t\t\t\t\t\t\t: 'Failed to initialize'}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : error ? (\n\t\t\t\t\t\t<div className=\"p-3 text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-orange-500\">\n\t\t\t\t\t\t\t\t\t{error instanceof Error\n\t\t\t\t\t\t\t\t\t\t? error.message\n\t\t\t\t\t\t\t\t\t\t: 'Failed to load git status'}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<Button variant=\"secondary\" size=\"sm\" onClick={handleRefresh}>\n\t\t\t\t\t\t\t\t\tRetry\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : !status || totalChanges === 0 ? (\n\t\t\t\t\t\t<div className=\"p-3 text-sm text-muted-foreground\">\n\t\t\t\t\t\t\tNo changes detected\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<GitFileList status={status} />\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{status && !isNotGitRepo && !error && (\n\t\t\t\t\t<div className=\"border-t border-border\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => setShowRemotes(!showRemotes)}\n\t\t\t\t\t\t\tclassName=\"w-full px-3 py-2 flex items-center gap-2 text-xs text-muted-foreground hover:text-foreground hover:bg-muted/50 transition-colors\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{showRemotes ? (\n\t\t\t\t\t\t\t\t<ChevronDown className=\"w-3 h-3\" />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<ChevronRight className=\"w-3 h-3\" />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t<Globe className=\"w-3 h-3\" />\n\t\t\t\t\t\t\t<span>Remotes</span>\n\t\t\t\t\t\t\t{status.remotes && (\n\t\t\t\t\t\t\t\t<span className=\"ml-auto text-[10px] opacity-60\">\n\t\t\t\t\t\t\t\t\t{status.remotes.length}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t{showRemotes && (\n\t\t\t\t\t\t\t<div className=\"px-3 pb-2 space-y-1\">\n\t\t\t\t\t\t\t\t{remotes && remotes.length > 0 ? (\n\t\t\t\t\t\t\t\t\tremotes\n\t\t\t\t\t\t\t\t\t\t.filter((r) => r.type === 'fetch')\n\t\t\t\t\t\t\t\t\t\t.map((remote) => (\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\tkey={remote.name}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-2 text-xs group\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-medium text-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{remote.name}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"truncate text-muted-foreground flex-1 min-w-0\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{remote.url}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (confirmRemoveRemote === remote.name) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\thandleRemoveRemote(remote.name);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetConfirmRemoveRemote(remote.name);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonBlur={() => setConfirmRemoveRemote(null)}\n\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={removeRemoteMutation.isPending}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={`${confirmRemoveRemote === remote.name ? 'opacity-100 text-red-500' : 'opacity-0 group-hover:opacity-100 text-muted-foreground hover:text-red-500'} transition-all p-0.5`}\n\t\t\t\t\t\t\t\t\t\t\t\t\ttitle={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconfirmRemoveRemote === remote.name\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? `Click again to confirm removing ${remote.name}`\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: `Remove ${remote.name}`\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{confirmRemoveRemote === remote.name ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-[10px] font-medium\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tRemove?\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Trash2 className=\"w-3 h-3\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<div className=\"text-xs text-muted-foreground py-1\">\n\t\t\t\t\t\t\t\t\t\tNo remotes configured\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{showAddRemote ? (\n\t\t\t\t\t\t\t\t\t<div className=\"space-y-1.5 pt-1\">\n\t\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\t\t\tvalue={remoteName}\n\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => setRemoteName(e.target.value)}\n\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"Name (e.g. origin)\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-full text-xs px-2 py-1 rounded border border-border bg-background text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-primary\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\t\t\tvalue={remoteUrl}\n\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => setRemoteUrl(e.target.value)}\n\t\t\t\t\t\t\t\t\t\t\tplaceholder=\"URL (e.g. https://github.com/...)\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-full text-xs px-2 py-1 rounded border border-border bg-background text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-primary\"\n\t\t\t\t\t\t\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (e.key === 'Enter') handleAddRemote();\n\t\t\t\t\t\t\t\t\t\t\t\tif (e.key === 'Escape') setShowAddRemote(false);\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={handleAddRemote}\n\t\t\t\t\t\t\t\t\t\t\t\tdisabled={\n\t\t\t\t\t\t\t\t\t\t\t\t\taddRemoteMutation.isPending ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t!remoteName.trim() ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t!remoteUrl.trim()\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex-1 h-6 text-[10px]\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{addRemoteMutation.isPending ? 'Adding...' : 'Add'}\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => setShowAddRemote(false)}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"h-6 text-[10px]\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => setShowAddRemote(true)}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors pt-1\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Plus className=\"w-3 h-3\" />\n\t\t\t\t\t\t\t\t\t\t<span>Add remote</span>\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{errors.length > 0 && (\n\t\t\t\t\t<div className=\"border-t border-border\">\n\t\t\t\t\t\t{errors.map((gitError) => (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={gitError.id}\n\t\t\t\t\t\t\t\tclassName=\"px-3 py-2 text-xs border-b border-border last:border-b-0 bg-orange-50 dark:bg-orange-950/20 flex items-start gap-2\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"text-orange-500 flex-1 min-w-0 break-words\">\n\t\t\t\t\t\t\t\t\t{gitError.message}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-1 flex-shrink-0\">\n\t\t\t\t\t\t\t\t\t{onFixWithAI && (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleFixWithAI(gitError)}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1 text-[10px] px-1.5 py-0.5 rounded bg-primary/10 text-primary hover:bg-primary/20 transition-colors\"\n\t\t\t\t\t\t\t\t\t\t\ttitle=\"Fix with AI\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<Sparkles className=\"w-3 h-3\" />\n\t\t\t\t\t\t\t\t\t\t\tFix\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => dismissError(gitError.id)}\n\t\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground hover:text-foreground transition-colors p-0.5\"\n\t\t\t\t\t\t\t\t\t\ttitle=\"Dismiss\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<X className=\"w-3 h-3\" />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<div className=\"h-12 border-t border-border flex items-center gap-1 px-2\">\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\tonClick={handlePull}\n\t\t\t\t\t\tdisabled={isActing || !hasRemotes || !hasUpstream}\n\t\t\t\t\t\ttitle={\n\t\t\t\t\t\t\t!hasRemotes\n\t\t\t\t\t\t\t\t? 'No remote configured'\n\t\t\t\t\t\t\t\t: !hasUpstream\n\t\t\t\t\t\t\t\t\t? 'Branch not published yet'\n\t\t\t\t\t\t\t\t\t: hasPendingPulls\n\t\t\t\t\t\t\t\t\t\t? `Pull ${status?.behind} commit(s) from remote`\n\t\t\t\t\t\t\t\t\t\t: 'Pull from remote'\n\t\t\t\t\t\t}\n\t\t\t\t\t\tclassName=\"flex-1 h-8 text-xs gap-1.5\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Download\n\t\t\t\t\t\t\tclassName={`w-3.5 h-3.5 ${pullMutation.isPending ? 'animate-pulse' : ''}`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\tPull\n\t\t\t\t\t\t{hasPendingPulls && (\n\t\t\t\t\t\t\t<span className=\"text-orange-500\">↓{status?.behind}</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\tonClick={handlePush}\n\t\t\t\t\t\tdisabled={!canPush || isActing}\n\t\t\t\t\t\ttitle={pushTitle}\n\t\t\t\t\t\tclassName=\"flex-1 h-8 text-xs gap-1.5\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Upload\n\t\t\t\t\t\t\tclassName={`w-3.5 h-3.5 ${pushMutation.isPending ? 'animate-pulse' : ''}`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{!hasUpstream && hasRemotes ? 'Publish' : 'Push'}\n\t\t\t\t\t\t{hasUpstream && status && status.ahead > 0 && (\n\t\t\t\t\t\t\t<span className=\"text-green-500\">↑{status.ahead}</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"h-12 px-4 border-t border-border text-xs text-muted-foreground flex items-center justify-between gap-2\">\n\t\t\t\t\t<div className=\"flex items-center gap-2 min-w-0 flex-1\">\n\t\t\t\t\t\t<GitBranch className=\"w-3 h-3 flex-shrink-0\" />\n\t\t\t\t\t\t{status?.branch && (\n\t\t\t\t\t\t\t<span className=\"truncate\">{status.branch}</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{status && !hasUpstream && hasRemotes && (\n\t\t\t\t\t\t\t<span className=\"text-[10px] text-orange-500 flex-shrink-0\">\n\t\t\t\t\t\t\t\tunpublished\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tonClick={handleRefresh}\n\t\t\t\t\t\ttitle=\"Refresh git status\"\n\t\t\t\t\t\tclassName=\"h-6 w-6 flex-shrink-0\"\n\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t>\n\t\t\t\t\t\t<RefreshCw\n\t\t\t\t\t\t\tclassName={`w-3 h-3 ${isLoading ? 'animate-spin' : ''}`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n});\n",
134
+ "import { memo } from 'react';\nimport { GitBranch } from 'lucide-react';\nimport { useGitStore } from '../../stores/gitStore';\nimport { useGitStatus } from '../../hooks/useGit';\n\nexport const GitSidebarToggle = memo(function GitSidebarToggle() {\n\t// Use selectors to only subscribe to needed state\n\tconst isExpanded = useGitStore((state) => state.isExpanded);\n\tconst toggleSidebar = useGitStore((state) => state.toggleSidebar);\n\tconst { data: status } = useGitStatus();\n\n\tconst totalChanges =\n\t\t(status?.staged?.length ?? 0) +\n\t\t(status?.unstaged?.length ?? 0) +\n\t\t(status?.untracked?.length ?? 0);\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={toggleSidebar}\n\t\t\tclassName={`relative h-14 w-full transition-colors touch-manipulation flex items-center justify-center border-r-2 ${\n\t\t\t\tisExpanded\n\t\t\t\t\t? 'bg-muted border-primary'\n\t\t\t\t\t: 'border-transparent hover:bg-muted/50'\n\t\t\t}`}\n\t\t\ttitle=\"Git\"\n\t\t>\n\t\t\t<GitBranch className=\"w-5 h-5 text-muted-foreground mx-auto\" />\n\t\t\t{totalChanges > 0 && (\n\t\t\t\t<span className=\"absolute top-1 right-1 w-5 h-5 bg-primary text-primary-foreground text-xs rounded-full flex items-center justify-center font-semibold\">\n\t\t\t\t\t{totalChanges > 9 ? '9+' : totalChanges}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</button>\n\t);\n});\n",
135
+ "import { useEffect, useRef, memo, useState } from 'react';\nimport { X, Maximize2, Minimize2 } from 'lucide-react';\nimport { useGitStore } from '../../stores/gitStore';\nimport { useSidebarStore } from '../../stores/sidebarStore';\nimport { useGitDiff } from '../../hooks/useGit';\nimport { useGitDiffFullFile } from '../../hooks/useFileBrowser';\nimport { Button } from '../ui/Button';\nimport { GitDiffViewer } from './GitDiffViewer';\n\nexport const GitDiffPanel = memo(function GitDiffPanel() {\n\t// Use selectors to only subscribe to needed state\n\tconst isDiffOpen = useGitStore((state) => state.isDiffOpen);\n\tconst selectedFile = useGitStore((state) => state.selectedFile);\n\tconst selectedFileStaged = useGitStore((state) => state.selectedFileStaged);\n\tconst closeDiff = useGitStore((state) => state.closeDiff);\n\n\tconst setCollapsed = useSidebarStore((state) => state.setCollapsed);\n\tconst wasCollapsedRef = useRef<boolean | null>(null);\n\tconst prevDiffOpenRef = useRef(false);\n\n\tconst { data: diff, isLoading } = useGitDiff(\n\t\tselectedFile,\n\t\tselectedFileStaged,\n\t);\n\n\tconst [showFullFile, setShowFullFile] = useState(false);\n\tconst { data: fullFileDiff, isLoading: fullFileLoading } = useGitDiffFullFile(\n\t\tselectedFile,\n\t\tselectedFileStaged,\n\t\tshowFullFile,\n\t);\n\n\tconst activeDiff = showFullFile && fullFileDiff ? fullFileDiff : diff;\n\tconst activeLoading = showFullFile ? fullFileLoading : isLoading;\n\n\tuseEffect(() => {\n\t\tif (!isDiffOpen) setShowFullFile(false);\n\t\tif (isDiffOpen && !prevDiffOpenRef.current) {\n\t\t\t// Diff just opened - save current state and collapse\n\t\t\tconst { isCollapsed } = useSidebarStore.getState();\n\t\t\twasCollapsedRef.current = isCollapsed;\n\t\t\tsetCollapsed(true);\n\t\t} else if (!isDiffOpen && prevDiffOpenRef.current) {\n\t\t\t// Diff just closed - restore previous state\n\t\t\tif (wasCollapsedRef.current !== null) {\n\t\t\t\tsetCollapsed(wasCollapsedRef.current);\n\t\t\t\twasCollapsedRef.current = null;\n\t\t\t}\n\t\t}\n\t\tprevDiffOpenRef.current = isDiffOpen;\n\t}, [isDiffOpen, setCollapsed]);\n\n\t// Handle ESC key\n\tuseEffect(() => {\n\t\tconst handleEscape = (e: KeyboardEvent) => {\n\t\t\tconst target = e.target as HTMLElement;\n\t\t\tconst isInInput =\n\t\t\t\ttarget.tagName === 'INPUT' ||\n\t\t\t\ttarget.tagName === 'TEXTAREA' ||\n\t\t\t\ttarget.isContentEditable;\n\t\t\tif ((e.key === 'Escape' || (e.key === 'q' && !isInInput)) && isDiffOpen) {\n\t\t\t\tcloseDiff();\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener('keydown', handleEscape);\n\t\treturn () => document.removeEventListener('keydown', handleEscape);\n\t}, [isDiffOpen, closeDiff]);\n\n\tif (!isDiffOpen || !selectedFile) return null;\n\n\treturn (\n\t\t<div className=\"absolute inset-0 bg-background z-50 flex flex-col animate-in slide-in-from-left duration-300\">\n\t\t\t{/* Header - Full path display */}\n\t\t\t<div className=\"h-14 border-b border-border px-4 flex items-center gap-3\">\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tonClick={closeDiff}\n\t\t\t\t\ttitle=\"Close diff viewer (ESC)\"\n\t\t\t\t>\n\t\t\t\t\t<X className=\"w-4 h-4\" />\n\t\t\t\t</Button>\n\t\t\t\t<div className=\"flex-1 flex items-center gap-2 min-w-0\">\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName=\"text-sm font-medium text-foreground font-mono truncate\"\n\t\t\t\t\t\ttitle={`${selectedFile}\\n${activeDiff?.absPath || ''}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t{selectedFile}\n\t\t\t\t\t</span>\n\t\t\t\t\t{selectedFileStaged && (\n\t\t\t\t\t\t<span className=\"text-xs px-2 py-0.5 rounded bg-primary/10 text-primary flex-shrink-0\">\n\t\t\t\t\t\t\tStaged\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<Button\n\t\t\t\t\tvariant={showFullFile ? 'secondary' : 'ghost'}\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tonClick={() => setShowFullFile((v) => !v)}\n\t\t\t\t\ttitle={showFullFile ? 'Show diff only' : 'Show full file with diff'}\n\t\t\t\t\tclassName=\"flex items-center gap-1.5 text-xs h-7\"\n\t\t\t\t>\n\t\t\t\t\t{showFullFile ? (\n\t\t\t\t\t\t<Minimize2 className=\"w-3.5 h-3.5\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Maximize2 className=\"w-3.5 h-3.5\" />\n\t\t\t\t\t)}\n\t\t\t\t\t{showFullFile ? 'Diff' : 'Full File'}\n\t\t\t\t</Button>\n\t\t\t</div>\n\n\t\t\t<div className=\"flex-1 overflow-auto\">\n\t\t\t\t{activeLoading ? (\n\t\t\t\t\t<div className=\"h-full flex items-center justify-center text-muted-foreground\">\n\t\t\t\t\t\tLoading diff...\n\t\t\t\t\t</div>\n\t\t\t\t) : activeDiff ? (\n\t\t\t\t\t<GitDiffViewer diff={activeDiff} />\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"h-full flex items-center justify-center text-muted-foreground\">\n\t\t\t\t\t\tNo diff available\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n});\n",
136
+ "import { create } from 'zustand';\nimport { persist } from 'zustand/middleware';\n\ninterface SidebarState {\n\tisCollapsed: boolean;\n\ttoggleCollapse: () => void;\n\tsetCollapsed: (collapsed: boolean) => void;\n}\n\nexport const useSidebarStore = create<SidebarState>()(\n\tpersist(\n\t\t(set) => ({\n\t\t\tisCollapsed: false,\n\t\t\ttoggleCollapse: () =>\n\t\t\t\tset((state) => ({ isCollapsed: !state.isCollapsed })),\n\t\t\tsetCollapsed: (collapsed) => set({ isCollapsed: collapsed }),\n\t\t}),\n\t\t{\n\t\t\tname: 'sidebar-storage',\n\t\t},\n\t),\n);\n",
137
+ "import { useQuery } from '@tanstack/react-query';\nimport { apiClient } from '../lib/api-client';\n\nexport function useFileTree(dirPath: string, enabled = true) {\n\treturn useQuery({\n\t\tqueryKey: ['files', 'tree', dirPath],\n\t\tqueryFn: () => apiClient.getFileTree(dirPath),\n\t\tenabled,\n\t\tstaleTime: 10000,\n\t\tretry: 1,\n\t});\n}\n\nexport function useFileContent(filePath: string | null) {\n\treturn useQuery({\n\t\tqueryKey: ['files', 'read', filePath],\n\t\tqueryFn: () => (filePath ? apiClient.readFileContent(filePath) : null),\n\t\tenabled: !!filePath,\n\t\tstaleTime: 5000,\n\t\tretry: 1,\n\t});\n}\n\nexport function useGitDiffFullFile(\n\tfile: string | null,\n\tstaged = false,\n\tenabled = false,\n) {\n\treturn useQuery({\n\t\tqueryKey: ['git', 'diff', 'fullFile', file, staged],\n\t\tqueryFn: () => (file ? apiClient.getGitDiffFullFile(file, staged) : null),\n\t\tenabled: enabled && !!file,\n\t\tretry: 1,\n\t\trefetchInterval: false,\n\t});\n}\n",
138
+ "import { useState, useId, useEffect, useCallback } from 'react';\nimport { GitCommit, Sparkles, Loader2 } from 'lucide-react';\nimport { useGitStore } from '../../stores/gitStore';\nimport { useCommitChanges, useGenerateCommitMessage } from '../../hooks/useGit';\nimport { Button } from '../ui/Button';\nimport { Textarea } from '../ui/Textarea';\nimport { Modal } from '../ui/Modal';\n\nexport function GitCommitModal() {\n\tconst { isCommitModalOpen, closeCommitModal } = useGitStore();\n\tconst commitSessionId = useGitStore((state) => state.commitSessionId);\n\tconst commitChanges = useCommitChanges();\n\tconst generateMessage = useGenerateCommitMessage(commitSessionId);\n\tconst [message, setMessage] = useState('');\n\tconst messageId = useId();\n\n\tconst handleCommit = useCallback(async () => {\n\t\tif (!message.trim()) return;\n\n\t\ttry {\n\t\t\tawait commitChanges.mutateAsync(message);\n\t\t\tsetMessage('');\n\t\t\tcloseCommitModal();\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to commit:', error);\n\t\t}\n\t}, [message, commitChanges, closeCommitModal]);\n\n\tconst handleClose = () => {\n\t\tsetMessage('');\n\t\tcloseCommitModal();\n\t};\n\n\tconst handleGenerateMessage = useCallback(async () => {\n\t\ttry {\n\t\t\tconst result = await generateMessage.mutateAsync();\n\t\t\tsetMessage(result.message);\n\t\t} catch (error) {\n\t\t\tconsole.error('Failed to generate commit message:', error);\n\t\t}\n\t}, [generateMessage]);\n\n\tuseEffect(() => {\n\t\tif (!isCommitModalOpen) return;\n\n\t\tconst handleKeyDown = (e: KeyboardEvent) => {\n\t\t\tif ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t\tif (message.trim() && !commitChanges.isPending) {\n\t\t\t\t\thandleCommit();\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ((e.metaKey || e.ctrlKey) && e.key === 'g') {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t\thandleGenerateMessage();\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener('keydown', handleKeyDown);\n\t\treturn () => document.removeEventListener('keydown', handleKeyDown);\n\t}, [\n\t\tisCommitModalOpen,\n\t\tmessage,\n\t\tcommitChanges.isPending,\n\t\thandleCommit,\n\t\thandleGenerateMessage,\n\t]);\n\n\treturn (\n\t\t<Modal\n\t\t\tisOpen={isCommitModalOpen}\n\t\t\tonClose={handleClose}\n\t\t\ttitle={\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<GitCommit className=\"w-5 h-5\" />\n\t\t\t\t\t<span>Commit Changes</span>\n\t\t\t\t</div>\n\t\t\t}\n\t\t\tmaxWidth=\"2xl\"\n\t\t>\n\t\t\t<div className=\"space-y-4\">\n\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t<label\n\t\t\t\t\t\thtmlFor={messageId}\n\t\t\t\t\t\tclassName=\"text-sm font-medium text-foreground\"\n\t\t\t\t\t>\n\t\t\t\t\t\tCommit Message\n\t\t\t\t\t</label>\n\t\t\t\t\t<Textarea\n\t\t\t\t\t\tid={messageId}\n\t\t\t\t\t\tvalue={message}\n\t\t\t\t\t\tonChange={(e) => setMessage(e.target.value)}\n\t\t\t\t\t\tplaceholder=\"Enter commit message...\"\n\t\t\t\t\t\trows={6}\n\t\t\t\t\t\tclassName=\"w-full resize-none\"\n\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\tdisabled={generateMessage.isPending}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\tonClick={handleGenerateMessage}\n\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\tdisabled={generateMessage.isPending}\n\t\t\t\t>\n\t\t\t\t\t{generateMessage.isPending ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<Loader2 className=\"w-4 h-4 mr-2 animate-spin\" />\n\t\t\t\t\t\t\tGenerating...\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<Sparkles className=\"w-4 h-4 mr-2\" />\n\t\t\t\t\t\t\tGenerate commit message{' '}\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground ml-1\">(⌘G)</span>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</Button>\n\n\t\t\t\t{generateMessage.isError && (\n\t\t\t\t\t<div className=\"text-sm text-red-600 dark:text-red-400 bg-red-500/10 border border-red-500/20 rounded px-3 py-2\">\n\t\t\t\t\t\t{generateMessage.error?.message ||\n\t\t\t\t\t\t\t'Failed to generate commit message'}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<div className=\"flex items-center justify-end gap-2 pt-4 border-t border-border\">\n\t\t\t\t\t<Button variant=\"ghost\" onClick={handleClose}>\n\t\t\t\t\t\tCancel <span className=\"text-muted-foreground ml-1\">(Esc)</span>\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\tonClick={handleCommit}\n\t\t\t\t\t\tdisabled={!message.trim() || commitChanges.isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\t{commitChanges.isPending ? (\n\t\t\t\t\t\t\t<span>Committing...</span>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<GitCommit className=\"w-4 h-4 mr-2\" />\n\t\t\t\t\t\t\t\tCommit <span className=\"text-muted-foreground ml-1\">(⌘↵)</span>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\n\t\t\t\t{commitChanges.isError && (\n\t\t\t\t\t<div className=\"text-sm text-red-600 dark:text-red-400 bg-red-500/10 border border-red-500/20 rounded px-3 py-2\">\n\t\t\t\t\t\t{commitChanges.error?.message || 'Failed to commit changes'}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</Modal>\n\t);\n}\n",
139
+ "import { memo, useCallback, useRef, useEffect } from 'react';\nimport {\n\tTerminal as TerminalIcon,\n\tMaximize2,\n\tMinimize2,\n\tChevronDown,\n} from 'lucide-react';\nimport { useTerminalStore } from '../../stores/terminalStore';\nimport {\n\tuseTerminals,\n\tuseCreateTerminal,\n\tuseKillTerminal,\n} from '../../hooks/useTerminals';\nimport { TerminalTabBar } from './TerminalTabBar';\nimport { TerminalViewer } from './TerminalViewer';\n\nconst MIN_HEIGHT = 150;\nconst MAX_HEIGHT_RATIO = 0.85;\n\nexport const TerminalsPanel = memo(function TerminalsPanel() {\n\tconst isOpen = useTerminalStore((s) => s.isOpen);\n\tconst panelHeight = useTerminalStore((s) => s.panelHeight);\n\tconst setPanelHeight = useTerminalStore((s) => s.setPanelHeight);\n\tconst activeTabId = useTerminalStore((s) => s.activeTabId);\n\tconst selectTab = useTerminalStore((s) => s.selectTab);\n\tconst closePanel = useTerminalStore((s) => s.closePanel);\n\tconst isMaximized = useTerminalStore((s) => s.isMaximized);\n\tconst toggleMaximize = useTerminalStore((s) => s.toggleMaximize);\n\tconst togglePanel = useTerminalStore((s) => s.togglePanel);\n\n\tconst { data: terminals } = useTerminals();\n\tconst createTerminal = useCreateTerminal();\n\tconst killTerminal = useKillTerminal();\n\n\tconst dragRef = useRef<{\n\t\tstartY: number;\n\t\tstartHeight: number;\n\t} | null>(null);\n\n\tconst terminalsList = terminals?.terminals ?? [];\n\n\tconst autoCreatingRef = useRef(false);\n\tconst terminalsListRef = useRef(terminalsList);\n\tterminalsListRef.current = terminalsList;\n\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: intentional - use ref to avoid re-renders, length triggers recheck\n\tuseEffect(() => {\n\t\tif (\n\t\t\tisOpen &&\n\t\t\tterminalsListRef.current.length > 0 &&\n\t\t\t(!activeTabId ||\n\t\t\t\t!terminalsListRef.current.find((t) => t.id === activeTabId))\n\t\t) {\n\t\t\tselectTab(terminalsListRef.current[0].id);\n\t\t}\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [isOpen, terminalsList.length, activeTabId, selectTab]);\n\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: intentional - avoid re-triggering auto-create on mutation object changes\n\tuseEffect(() => {\n\t\tif (\n\t\t\tisOpen &&\n\t\t\tterminals &&\n\t\t\tterminalsList.length === 0 &&\n\t\t\t!autoCreatingRef.current &&\n\t\t\t!createTerminal.isPending\n\t\t) {\n\t\t\tautoCreatingRef.current = true;\n\t\t\tcreateTerminal\n\t\t\t\t.mutateAsync({\n\t\t\t\t\tcommand: 'bash',\n\t\t\t\t\tpurpose: 'Manual shell',\n\t\t\t\t})\n\t\t\t\t.then((result) => {\n\t\t\t\t\tselectTab(result.terminalId);\n\t\t\t\t})\n\t\t\t\t.catch(() => {})\n\t\t\t\t.finally(() => {\n\t\t\t\t\tautoCreatingRef.current = false;\n\t\t\t\t});\n\t\t}\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [isOpen, terminals, terminalsList.length, selectTab]);\n\n\tconst handleNewTerminal = useCallback(async () => {\n\t\ttry {\n\t\t\tconst result = await createTerminal.mutateAsync({\n\t\t\t\tcommand: 'bash',\n\t\t\t\tpurpose: 'Manual shell',\n\t\t\t});\n\t\t\tselectTab(result.terminalId);\n\t\t} catch {\n\t\t\t// ignore\n\t\t}\n\t}, [createTerminal, selectTab]);\n\n\tconst handleKillTerminal = useCallback(\n\t\tasync (id: string) => {\n\t\t\ttry {\n\t\t\t\tawait killTerminal.mutateAsync(id);\n\t\t\t\tif (activeTabId === id) {\n\t\t\t\t\tconst remaining = terminalsListRef.current.filter((t) => t.id !== id);\n\t\t\t\t\tif (remaining.length > 0) {\n\t\t\t\t\t\tselectTab(remaining[0].id);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tselectTab(null);\n\t\t\t\t\t\tclosePanel();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t},\n\t\t[killTerminal, activeTabId, selectTab, closePanel],\n\t);\n\n\tuseEffect(() => {\n\t\tconst handleKeyDown = (e: KeyboardEvent) => {\n\t\t\tif (e.key === '`' && e.ctrlKey) {\n\t\t\t\te.preventDefault();\n\t\t\t\ttogglePanel();\n\t\t\t}\n\t\t};\n\t\twindow.addEventListener('keydown', handleKeyDown);\n\t\treturn () => window.removeEventListener('keydown', handleKeyDown);\n\t}, [togglePanel]);\n\n\tconst handleResizeStart = useCallback(\n\t\t(e: React.MouseEvent) => {\n\t\t\te.preventDefault();\n\t\t\tdragRef.current = {\n\t\t\t\tstartY: e.clientY,\n\t\t\t\tstartHeight: panelHeight,\n\t\t\t};\n\n\t\t\tconst handleMouseMove = (ev: MouseEvent) => {\n\t\t\t\tif (!dragRef.current) return;\n\t\t\t\tconst delta = dragRef.current.startY - ev.clientY;\n\t\t\t\tconst newHeight = dragRef.current.startHeight + delta;\n\t\t\t\tconst maxH = window.innerHeight * MAX_HEIGHT_RATIO;\n\t\t\t\tsetPanelHeight(Math.min(Math.max(MIN_HEIGHT, newHeight), maxH));\n\t\t\t};\n\n\t\t\tconst handleMouseUp = () => {\n\t\t\t\tdragRef.current = null;\n\t\t\t\tdocument.removeEventListener('mousemove', handleMouseMove);\n\t\t\t\tdocument.removeEventListener('mouseup', handleMouseUp);\n\t\t\t\tdocument.body.style.cursor = '';\n\t\t\t\tdocument.body.style.userSelect = '';\n\t\t\t};\n\n\t\t\tdocument.addEventListener('mousemove', handleMouseMove);\n\t\t\tdocument.addEventListener('mouseup', handleMouseUp);\n\t\t\tdocument.body.style.cursor = 'row-resize';\n\t\t\tdocument.body.style.userSelect = 'none';\n\t\t},\n\t\t[panelHeight, setPanelHeight],\n\t);\n\n\tif (!isOpen) return null;\n\n\tconst height = isMaximized ? '100%' : `${panelHeight}px`;\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"border-t border-border bg-background flex flex-col shrink-0 relative\"\n\t\t\tstyle={{ height, minHeight: MIN_HEIGHT }}\n\t\t>\n\t\t\t{!isMaximized && (\n\t\t\t\t// biome-ignore lint/a11y/noStaticElementInteractions: mouse-only resize handle\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"h-2 w-full cursor-row-resize hover:bg-primary/30 active:bg-primary/50 transition-colors absolute -top-1 left-0 right-0 z-10\"\n\t\t\t\t\tonMouseDown={handleResizeStart}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t<div className=\"h-9 border-b border-border flex items-center shrink-0\">\n\t\t\t\t<div className=\"flex items-center gap-1.5 px-3 shrink-0 border-r border-border h-full\">\n\t\t\t\t\t<TerminalIcon className=\"w-3.5 h-3.5 text-muted-foreground\" />\n\t\t\t\t\t<span className=\"text-xs font-medium text-muted-foreground\">\n\t\t\t\t\t\tTerminal\n\t\t\t\t\t</span>\n\t\t\t\t\t{terminalsList.length > 0 && (\n\t\t\t\t\t\t<span className=\"text-[10px] text-muted-foreground/70\">\n\t\t\t\t\t\t\t({terminalsList.length})\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t<TerminalTabBar\n\t\t\t\t\tterminals={terminalsList}\n\t\t\t\t\tonNewTerminal={handleNewTerminal}\n\t\t\t\t\tonKillTerminal={handleKillTerminal}\n\t\t\t\t\tisCreating={createTerminal.isPending}\n\t\t\t\t/>\n\n\t\t\t\t<div className=\"ml-auto flex items-center gap-0.5 px-2 shrink-0\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"p-1 rounded text-muted-foreground hover:text-foreground hover:bg-muted transition-colors\"\n\t\t\t\t\t\tonClick={toggleMaximize}\n\t\t\t\t\t\ttitle={isMaximized ? 'Restore' : 'Maximize'}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isMaximized ? (\n\t\t\t\t\t\t\t<Minimize2 className=\"w-3.5 h-3.5\" />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<Maximize2 className=\"w-3.5 h-3.5\" />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclassName=\"p-1 rounded text-muted-foreground hover:text-foreground hover:bg-muted transition-colors\"\n\t\t\t\t\t\tonClick={closePanel}\n\t\t\t\t\t\ttitle=\"Close panel\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<ChevronDown className=\"w-3.5 h-3.5\" />\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div className=\"flex-1 min-h-0 overflow-hidden relative\">\n\t\t\t\t{terminalsList.map((t) => (\n\t\t\t\t\t<TerminalViewer\n\t\t\t\t\t\tkey={t.id}\n\t\t\t\t\t\tterminalId={t.id}\n\t\t\t\t\t\tisActive={t.id === activeTabId}\n\t\t\t\t\t\tonExit={handleKillTerminal}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t\t{terminalsList.length === 0 && (\n\t\t\t\t\t<div className=\"flex flex-col items-center justify-center h-full text-muted-foreground\">\n\t\t\t\t\t\t<TerminalIcon className=\"w-8 h-8 mb-2 opacity-40\" />\n\t\t\t\t\t\t<div className=\"text-xs\">No terminals running</div>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n});\n",
140
+ "import { create } from 'zustand';\n\ninterface TerminalState {\n\tisOpen: boolean;\n\tpanelHeight: number;\n\tactiveTabId: string | null;\n\tisMaximized: boolean;\n\n\t/** @deprecated Use isOpen instead */\n\tisExpanded: boolean;\n\t/** @deprecated Use activeTabId instead */\n\tselectedTerminalId: string | null;\n\n\topenPanel: () => void;\n\tclosePanel: () => void;\n\ttogglePanel: () => void;\n\tsetPanelHeight: (height: number) => void;\n\tselectTab: (id: string | null) => void;\n\ttoggleMaximize: () => void;\n\n\t/** @deprecated Use openPanel instead */\n\texpandSidebar: () => void;\n\t/** @deprecated Use closePanel instead */\n\tcollapseSidebar: () => void;\n\t/** @deprecated Use togglePanel instead */\n\ttoggleSidebar: () => void;\n\t/** @deprecated Use selectTab instead */\n\tselectTerminal: (id: string | null) => void;\n}\n\nconst DEFAULT_HEIGHT = 300;\nconst MIN_HEIGHT = 150;\n\nexport const useTerminalStore = create<TerminalState>((set) => ({\n\tisOpen: false,\n\tpanelHeight: DEFAULT_HEIGHT,\n\tactiveTabId: null,\n\tisMaximized: false,\n\n\tget isExpanded() {\n\t\treturn this.isOpen;\n\t},\n\tget selectedTerminalId() {\n\t\treturn this.activeTabId;\n\t},\n\n\topenPanel: () => set({ isOpen: true }),\n\tclosePanel: () => set({ isOpen: false, isMaximized: false }),\n\ttogglePanel: () =>\n\t\tset((s) => ({\n\t\t\tisOpen: !s.isOpen,\n\t\t\tisMaximized: !s.isOpen ? s.isMaximized : false,\n\t\t})),\n\tsetPanelHeight: (height: number) =>\n\t\tset({ panelHeight: Math.max(MIN_HEIGHT, height) }),\n\tselectTab: (id) => set({ activeTabId: id, isOpen: true }),\n\ttoggleMaximize: () => set((s) => ({ isMaximized: !s.isMaximized })),\n\n\texpandSidebar: () => set({ isOpen: true }),\n\tcollapseSidebar: () =>\n\t\tset({ isOpen: false, activeTabId: null, isMaximized: false }),\n\ttoggleSidebar: () =>\n\t\tset((s) => ({\n\t\t\tisOpen: !s.isOpen,\n\t\t\tisMaximized: !s.isOpen ? s.isMaximized : false,\n\t\t})),\n\tselectTerminal: (id) => set({ activeTabId: id, isOpen: true }),\n}));\n",
141
+ "import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport {\n\tgetTerminals,\n\tpostTerminals,\n\tdeleteTerminalsById,\n\tgetTerminalsById,\n} from '@ottocode/api';\n\nexport interface Terminal {\n\tid: string;\n\tpid: number;\n\tcommand: string;\n\targs: string[];\n\tcwd: string;\n\tpurpose: string;\n\tcreatedBy: 'user' | 'llm';\n\ttitle: string;\n\tstatus: 'running' | 'exited';\n\texitCode?: number;\n\tcreatedAt: string;\n\tuptime: number;\n}\n\ninterface TerminalsResponse {\n\tterminals: Terminal[];\n\tcount: number;\n}\n\ninterface CreateTerminalParams {\n\tcommand: string;\n\targs?: string[];\n\tpurpose: string;\n\tcwd?: string;\n\ttitle?: string;\n}\n\ninterface CreateTerminalResponse {\n\tterminalId: string;\n\tpid: number;\n\tpurpose: string;\n\tcommand: string;\n}\n\nexport function useTerminals() {\n\treturn useQuery<TerminalsResponse>({\n\t\tqueryKey: ['terminals'],\n\t\tqueryFn: async () => {\n\t\t\tconst response = await getTerminals();\n\t\t\tif (response.error) {\n\t\t\t\tthrow new Error('Failed to fetch terminals');\n\t\t\t}\n\t\t\treturn response.data as TerminalsResponse;\n\t\t},\n\t\trefetchInterval: 2000,\n\t});\n}\n\nexport function useCreateTerminal() {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation<CreateTerminalResponse, Error, CreateTerminalParams>({\n\t\tmutationFn: async (params) => {\n\t\t\tconst response = await postTerminals({\n\t\t\t\tbody: params,\n\t\t\t});\n\n\t\t\tif (response.error) {\n\t\t\t\tthrow new Error('Failed to create terminal');\n\t\t\t}\n\n\t\t\treturn response.data as CreateTerminalResponse;\n\t\t},\n\t\tonSuccess: async () => {\n\t\t\tawait queryClient.invalidateQueries({ queryKey: ['terminals'] });\n\t\t},\n\t});\n}\n\nexport function useKillTerminal() {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation<void, Error, string>({\n\t\tmutationFn: async (terminalId) => {\n\t\t\tconst response = await deleteTerminalsById({\n\t\t\t\tpath: { id: terminalId },\n\t\t\t});\n\n\t\t\tif (response.error) {\n\t\t\t\tthrow new Error('Failed to kill terminal');\n\t\t\t}\n\t\t},\n\t\tonSuccess: () => {\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['terminals'] });\n\t\t},\n\t});\n}\n\nexport function useTerminalOutput(terminalId: string | null) {\n\treturn useQuery<Terminal>({\n\t\tqueryKey: ['terminal', terminalId],\n\t\tqueryFn: async () => {\n\t\t\tif (!terminalId) throw new Error('No terminal ID');\n\n\t\t\tconst response = await getTerminalsById({\n\t\t\t\tpath: { id: terminalId },\n\t\t\t});\n\t\t\tif (response.error) {\n\t\t\t\tthrow new Error('Failed to fetch terminal');\n\t\t\t}\n\t\t\treturn response.data?.terminal as Terminal;\n\t\t},\n\t\tenabled: !!terminalId,\n\t\trefetchInterval: 1000,\n\t});\n}\n",
142
+ "import { memo } from 'react';\nimport { Plus, X, Bot, User } from 'lucide-react';\nimport { useTerminalStore } from '../../stores/terminalStore';\nimport type { Terminal } from '../../hooks/useTerminals';\n\ninterface TerminalTabBarProps {\n\tterminals: Terminal[];\n\tonNewTerminal: () => void;\n\tonKillTerminal: (id: string) => void;\n\tisCreating?: boolean;\n}\n\nexport const TerminalTabBar = memo(function TerminalTabBar({\n\tterminals,\n\tonNewTerminal,\n\tonKillTerminal,\n\tisCreating,\n}: TerminalTabBarProps) {\n\tconst activeTabId = useTerminalStore((s) => s.activeTabId);\n\tconst selectTab = useTerminalStore((s) => s.selectTab);\n\n\treturn (\n\t\t<div className=\"flex items-center gap-0 overflow-x-auto scrollbar-none\">\n\t\t\t{terminals.map((t) => {\n\t\t\t\tconst isActive = t.id === activeTabId;\n\t\t\t\tconst isRunning = t.status === 'running';\n\n\t\t\t\treturn (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={t.id}\n\t\t\t\t\t\tclassName={`group flex items-center gap-1.5 px-3 h-9 border-r border-border cursor-pointer select-none shrink-0 transition-colors ${\n\t\t\t\t\t\t\tisActive\n\t\t\t\t\t\t\t\t? 'bg-background text-foreground'\n\t\t\t\t\t\t\t\t: 'bg-muted/30 text-muted-foreground hover:bg-muted/60'\n\t\t\t\t\t\t}`}\n\t\t\t\t\t\tonClick={() => selectTab(t.id)}\n\t\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\t\tif (e.key === 'Enter') selectTab(t.id);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\taria-selected={isActive}\n\t\t\t\t\t\ttabIndex={0}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className=\"shrink-0\">\n\t\t\t\t\t\t\t{t.createdBy === 'llm' ? (\n\t\t\t\t\t\t\t\t<Bot className=\"w-3 h-3 text-blue-500\" />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<User className=\"w-3 h-3 text-green-500\" />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className=\"text-xs font-medium truncate max-w-[120px]\">\n\t\t\t\t\t\t\t{t.title || t.purpose}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t{!isRunning && (\n\t\t\t\t\t\t\t<span className=\"w-1.5 h-1.5 rounded-full bg-orange-500 shrink-0\" />\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tclassName=\"shrink-0 p-0.5 rounded opacity-0 group-hover:opacity-100 hover:bg-muted transition-opacity\"\n\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\tonKillTerminal(t.id);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\ttitle=\"Close terminal\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<X className=\"w-3 h-3\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t})}\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName=\"flex items-center justify-center w-8 h-9 shrink-0 text-muted-foreground hover:text-foreground hover:bg-muted/50 transition-colors\"\n\t\t\t\tonClick={onNewTerminal}\n\t\t\t\tdisabled={isCreating}\n\t\t\t\ttitle=\"New terminal\"\n\t\t\t>\n\t\t\t\t<Plus className=\"w-3.5 h-3.5\" />\n\t\t\t</button>\n\t\t</div>\n\t);\n});\n",
143
+ "import { useEffect, useRef, useState, useCallback } from 'react';\nimport { init, Terminal, FitAddon } from 'ghostty-web';\nimport { getRuntimeApiBaseUrl } from '../../lib/config';\nimport { client } from '@ottocode/api';\n\nconst FONT_FAMILY = '\"JetBrainsMono NFM\", monospace';\nconst SSE_RECONNECT_DELAY = 1500;\nconst SSE_MAX_RETRIES = 5;\nconst CURSOR_BLINK_RESUME_DELAY = 600;\n\nfunction resolveBackgroundColor(): string {\n\tif (typeof document === 'undefined') return '#121216';\n\tconst el = document.createElement('div');\n\tel.style.display = 'none';\n\tel.className = 'bg-background';\n\tdocument.body.appendChild(el);\n\tconst computed = getComputedStyle(el).backgroundColor;\n\tdocument.body.removeChild(el);\n\tconst match = computed.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n\tif (match) {\n\t\tconst r = Number(match[1]);\n\t\tconst g = Number(match[2]);\n\t\tconst b = Number(match[3]);\n\t\treturn `#${((1 << 24) | (r << 16) | (g << 8) | b).toString(16).slice(1)}`;\n\t}\n\treturn '#121216';\n}\n\nlet fontsLoaded = false;\n\nasync function loadEmbeddedFont(): Promise<void> {\n\tif (fontsLoaded) return;\n\tif (typeof document === 'undefined' || !('FontFace' in window)) return;\n\n\tconst variants = [\n\t\t{\n\t\t\tfile: 'JetBrainsMonoNerdFontMono-Regular.woff2',\n\t\t\tweight: '400',\n\t\t\tstyle: 'normal',\n\t\t},\n\t\t{\n\t\t\tfile: 'JetBrainsMonoNerdFontMono-Bold.woff2',\n\t\t\tweight: '700',\n\t\t\tstyle: 'normal',\n\t\t},\n\t\t{\n\t\t\tfile: 'JetBrainsMonoNerdFontMono-Italic.woff2',\n\t\t\tweight: '400',\n\t\t\tstyle: 'italic',\n\t\t},\n\t\t{\n\t\t\tfile: 'JetBrainsMonoNerdFontMono-BoldItalic.woff2',\n\t\t\tweight: '700',\n\t\t\tstyle: 'italic',\n\t\t},\n\t];\n\n\tconst loads = variants.map(async (v) => {\n\t\ttry {\n\t\t\tconst url = new URL(`../../assets/fonts/${v.file}`, import.meta.url).href;\n\t\t\tconst face = new FontFace(\n\t\t\t\t'JetBrainsMono NFM',\n\t\t\t\t`url(\"${url}\") format(\"woff2\")`,\n\t\t\t\t{\n\t\t\t\t\tweight: v.weight,\n\t\t\t\t\tstyle: v.style,\n\t\t\t\t},\n\t\t\t);\n\t\t\tconst loaded = await face.load();\n\t\t\tdocument.fonts.add(loaded);\n\t\t} catch {\n\t\t\t// variant not available\n\t\t}\n\t});\n\n\tawait Promise.allSettled(loads);\n\tfontsLoaded = true;\n}\n\nfunction resolveApiBaseUrl(): string {\n\tconst config = client.getConfig?.();\n\tif (\n\t\tconfig &&\n\t\ttypeof config.baseURL === 'string' &&\n\t\tconfig.baseURL.length > 0\n\t) {\n\t\treturn config.baseURL;\n\t}\n\treturn getRuntimeApiBaseUrl();\n}\n\ninterface TerminalViewerProps {\n\tterminalId: string;\n\tisActive: boolean;\n\tonExit?: (terminalId: string) => void;\n}\n\nexport function TerminalViewer({\n\tterminalId,\n\tisActive,\n\tonExit,\n}: TerminalViewerProps) {\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\tconst termRef = useRef<Terminal | null>(null);\n\tconst fitAddonRef = useRef<FitAddon | null>(null);\n\tconst eventSourceRef = useRef<EventSource | null>(null);\n\tconst retryCountRef = useRef(0);\n\tconst retryTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\tconst hasReceivedDataRef = useRef(false);\n\tconst [ready, setReady] = useState(false);\n\tconst onExitRef = useRef(onExit);\n\tonExitRef.current = onExit;\n\tconst blinkTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\tconst userScrolledRef = useRef(false);\n\tconst bgColorRef = useRef('#121216');\n\tconst focusHandlersRef = useRef<{\n\t\tfocusin: () => void;\n\t\tfocusout: () => void;\n\t} | null>(null);\n\n\tconst fitTerminal = useCallback(() => {\n\t\tif (fitAddonRef.current) {\n\t\t\ttry {\n\t\t\t\tfitAddonRef.current.fit();\n\t\t\t} catch {\n\t\t\t\t// container might not be visible yet\n\t\t\t}\n\t\t}\n\t}, []);\n\n\tconst connectSSE = useCallback(\n\t\t(term: Terminal, baseUrl: string, skipHistory: boolean) => {\n\t\t\tif (eventSourceRef.current) {\n\t\t\t\teventSourceRef.current.close();\n\t\t\t\teventSourceRef.current = null;\n\t\t\t}\n\n\t\t\tconst url = `${baseUrl}/v1/terminals/${terminalId}/output${skipHistory ? '?skipHistory=true' : ''}`;\n\t\t\tconst eventSource = new EventSource(url);\n\t\t\teventSourceRef.current = eventSource;\n\n\t\t\tlet gotFirstData = false;\n\n\t\t\teventSource.onmessage = (event) => {\n\t\t\t\ttry {\n\t\t\t\t\tconst data = JSON.parse(event.data);\n\t\t\t\t\tif (data.type === 'data') {\n\t\t\t\t\t\tconst savedY = userScrolledRef.current ? term.getViewportY() : 0;\n\t\t\t\t\t\tterm.write(data.line);\n\t\t\t\t\t\tif (userScrolledRef.current && savedY > 0) {\n\t\t\t\t\t\t\tterm.scrollToLine(savedY);\n\t\t\t\t\t\t}\n\t\t\t\t\t\thasReceivedDataRef.current = true;\n\t\t\t\t\t\tif (!gotFirstData) {\n\t\t\t\t\t\t\tgotFirstData = true;\n\t\t\t\t\t\t\tsetTimeout(() => setReady(true), 200);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (data.type === 'exit') {\n\t\t\t\t\t\tterm.write(\n\t\t\t\t\t\t\t`\\r\\n\\x1b[33m[Process exited with code ${data.exitCode}]\\x1b[0m\\r\\n`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (onExitRef.current) {\n\t\t\t\t\t\t\tonExitRef.current(terminalId);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// ignore parse errors\n\t\t\t\t}\n\t\t\t};\n\n\t\t\teventSource.onerror = () => {\n\t\t\t\teventSource.close();\n\t\t\t\tif (eventSourceRef.current === eventSource) {\n\t\t\t\t\teventSourceRef.current = null;\n\t\t\t\t}\n\n\t\t\t\tif (retryCountRef.current < SSE_MAX_RETRIES) {\n\t\t\t\t\tretryCountRef.current++;\n\t\t\t\t\tretryTimerRef.current = setTimeout(() => {\n\t\t\t\t\t\tif (termRef.current) {\n\t\t\t\t\t\t\tconnectSSE(termRef.current, baseUrl, true);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, SSE_RECONNECT_DELAY);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\teventSource.onopen = () => {\n\t\t\t\tretryCountRef.current = 0;\n\t\t\t};\n\t\t},\n\t\t[terminalId],\n\t);\n\n\tuseEffect(() => {\n\t\tif (!containerRef.current || !terminalId) return;\n\n\t\tlet disposed = false;\n\t\tlet term: Terminal | null = null;\n\t\tlet fitAddon: FitAddon | null = null;\n\t\tlet resizeObserver: ResizeObserver | null = null;\n\n\t\tsetReady(false);\n\t\tretryCountRef.current = 0;\n\t\thasReceivedDataRef.current = false;\n\n\t\tif (eventSourceRef.current) {\n\t\t\teventSourceRef.current.close();\n\t\t\teventSourceRef.current = null;\n\t\t}\n\t\tif (retryTimerRef.current) {\n\t\t\tclearTimeout(retryTimerRef.current);\n\t\t\tretryTimerRef.current = null;\n\t\t}\n\n\t\tconst setup = async () => {\n\t\t\tawait init();\n\t\t\tif (disposed || !containerRef.current) return;\n\n\t\t\tawait loadEmbeddedFont();\n\t\t\tawait document.fonts.ready;\n\n\t\t\tconst bg = resolveBackgroundColor();\n\n\t\t\tterm = new Terminal({\n\t\t\t\ttheme: {\n\t\t\t\t\tbackground: bg,\n\t\t\t\t\tforeground: '#d4d4d4',\n\t\t\t\t\tcursor: '#ffffff',\n\t\t\t\t\tcursorAccent: '#000000',\n\t\t\t\t\tselectionBackground: '#264f78',\n\t\t\t\t\tblack: '#000000',\n\t\t\t\t\tred: '#cd3131',\n\t\t\t\t\tgreen: '#0dbc79',\n\t\t\t\t\tyellow: '#e5e510',\n\t\t\t\t\tblue: '#2472c8',\n\t\t\t\t\tmagenta: '#bc3fbc',\n\t\t\t\t\tcyan: '#11a8cd',\n\t\t\t\t\twhite: '#e5e5e5',\n\t\t\t\t\tbrightBlack: '#666666',\n\t\t\t\t\tbrightRed: '#f14c4c',\n\t\t\t\t\tbrightGreen: '#23d18b',\n\t\t\t\t\tbrightYellow: '#f5f543',\n\t\t\t\t\tbrightBlue: '#3b8eea',\n\t\t\t\t\tbrightMagenta: '#d670d6',\n\t\t\t\t\tbrightCyan: '#29b8db',\n\t\t\t\t\tbrightWhite: '#e5e5e5',\n\t\t\t\t},\n\t\t\t\tfontSize: 13,\n\t\t\t\tfontFamily: FONT_FAMILY,\n\t\t\t\tcursorBlink: true,\n\t\t\t\tconvertEol: true,\n\t\t\t\tscrollback: 5000,\n\t\t\t});\n\n\t\t\tfitAddon = new FitAddon();\n\t\t\tterm.loadAddon(fitAddon);\n\t\t\tterm.open(containerRef.current);\n\n\t\t\tterm.onData(() => {\n\t\t\t\tif (!termRef.current?.renderer) return;\n\t\t\t\ttermRef.current.renderer.setCursorBlink(false);\n\t\t\t\tif (blinkTimerRef.current) clearTimeout(blinkTimerRef.current);\n\t\t\t\tblinkTimerRef.current = setTimeout(() => {\n\t\t\t\t\tif (\n\t\t\t\t\t\ttermRef.current?.renderer &&\n\t\t\t\t\t\tdocument.activeElement &&\n\t\t\t\t\t\tcontainerRef.current?.contains(document.activeElement)\n\t\t\t\t\t) {\n\t\t\t\t\t\ttermRef.current.renderer.setCursorBlink(true);\n\t\t\t\t\t}\n\t\t\t\t}, CURSOR_BLINK_RESUME_DELAY);\n\t\t\t});\n\n\t\t\tbgColorRef.current = bg;\n\n\t\t\tconst handleFocusIn = () => {\n\t\t\t\tif (!termRef.current?.renderer) return;\n\t\t\t\ttermRef.current.renderer.setCursorBlink(true);\n\t\t\t\ttermRef.current.renderer.setTheme({\n\t\t\t\t\tcursor: '#ffffff',\n\t\t\t\t\tcursorAccent: '#000000',\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tconst handleFocusOut = () => {\n\t\t\t\tif (!termRef.current?.renderer) return;\n\t\t\t\ttermRef.current.renderer.setCursorBlink(false);\n\t\t\t\ttermRef.current.renderer.setTheme({\n\t\t\t\t\tcursor: bgColorRef.current,\n\t\t\t\t\tcursorAccent: bgColorRef.current,\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tcontainerRef.current.addEventListener('focusin', handleFocusIn);\n\t\t\tcontainerRef.current.addEventListener('focusout', handleFocusOut);\n\t\t\tfocusHandlersRef.current = {\n\t\t\t\tfocusin: handleFocusIn,\n\t\t\t\tfocusout: handleFocusOut,\n\t\t\t};\n\n\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfitAddon?.fit();\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// container might not be visible\n\t\t\t\t\t}\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tif (disposed) return;\n\n\t\t\tconst baseUrl = resolveApiBaseUrl();\n\n\t\t\tconst sendResize = (cols: number, rows: number) => {\n\t\t\t\tfetch(`${baseUrl}/v1/terminals/${terminalId}/resize`, {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\t\tbody: JSON.stringify({ cols, rows }),\n\t\t\t\t}).catch(() => {});\n\t\t\t};\n\n\t\t\tif (term) {\n\t\t\t\tsendResize(term.cols, term.rows);\n\t\t\t}\n\n\t\t\tconnectSSE(term, baseUrl, false);\n\n\t\t\tterm.onData((data) => {\n\t\t\t\tfetch(`${baseUrl}/v1/terminals/${terminalId}/input`, {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\t\tbody: JSON.stringify({ input: data }),\n\t\t\t\t}).catch(() => {});\n\t\t\t});\n\n\t\t\tterm.onResize(({ cols, rows }) => {\n\t\t\t\tsendResize(cols, rows);\n\t\t\t});\n\n\t\t\tterm.onScroll(() => {\n\t\t\t\tuserScrolledRef.current = term.getViewportY() > 0;\n\t\t\t});\n\n\t\t\ttermRef.current = term;\n\t\t\tfitAddonRef.current = fitAddon;\n\n\t\t\tresizeObserver = new ResizeObserver(() => {\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tif (fitAddonRef.current && !disposed) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tfitAddonRef.current.fit();\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// ignore\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t\tresizeObserver.observe(containerRef.current);\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (!disposed) setReady(true);\n\t\t\t}, 2000);\n\t\t};\n\n\t\tsetup().catch((error) => {\n\t\t\tconsole.error('[TerminalViewer] Failed to initialize:', error);\n\t\t});\n\n\t\treturn () => {\n\t\t\tdisposed = true;\n\t\t\tif (containerRef.current && focusHandlersRef.current) {\n\t\t\t\tcontainerRef.current.removeEventListener(\n\t\t\t\t\t'focusin',\n\t\t\t\t\tfocusHandlersRef.current.focusin,\n\t\t\t\t);\n\t\t\t\tcontainerRef.current.removeEventListener(\n\t\t\t\t\t'focusout',\n\t\t\t\t\tfocusHandlersRef.current.focusout,\n\t\t\t\t);\n\t\t\t\tfocusHandlersRef.current = null;\n\t\t\t}\n\t\t\tif (blinkTimerRef.current) {\n\t\t\t\tclearTimeout(blinkTimerRef.current);\n\t\t\t\tblinkTimerRef.current = null;\n\t\t\t}\n\t\t\tif (retryTimerRef.current) {\n\t\t\t\tclearTimeout(retryTimerRef.current);\n\t\t\t\tretryTimerRef.current = null;\n\t\t\t}\n\t\t\tif (eventSourceRef.current) {\n\t\t\t\teventSourceRef.current.close();\n\t\t\t\teventSourceRef.current = null;\n\t\t\t}\n\t\t\tif (resizeObserver) {\n\t\t\t\tresizeObserver.disconnect();\n\t\t\t}\n\t\t\tif (term) {\n\t\t\t\tterm.dispose();\n\t\t\t}\n\t\t\ttermRef.current = null;\n\t\t\tfitAddonRef.current = null;\n\t\t};\n\t}, [terminalId, connectSSE]);\n\n\tuseEffect(() => {\n\t\tconst term = termRef.current;\n\t\tif (!term) return;\n\t\tif (isActive) {\n\t\t\tfitTerminal();\n\t\t\tterm.focus();\n\t\t} else {\n\t\t\tterm.blur();\n\t\t\tif (term.renderer) {\n\t\t\t\tterm.renderer.setCursorBlink(false);\n\t\t\t\tterm.renderer.setTheme({\n\t\t\t\t\tcursor: bgColorRef.current,\n\t\t\t\t\tcursorAccent: bgColorRef.current,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}, [isActive, fitTerminal]);\n\n\tuseEffect(() => {\n\t\tfitTerminal();\n\t}, [fitTerminal]);\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"flex h-full flex-col overflow-hidden bg-background absolute inset-0\"\n\t\t\tstyle={{ visibility: isActive ? 'visible' : 'hidden' }}\n\t\t\tdata-terminal-viewer\n\t\t>\n\t\t\t<div className=\"relative flex-1 min-h-0 overflow-hidden\">\n\t\t\t\t<div ref={containerRef} className=\"absolute inset-0 bg-background\" />\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"absolute inset-0 bg-background flex items-center justify-center pointer-events-none transition-opacity duration-300\"\n\t\t\t\t\tstyle={{ opacity: ready ? 0 : 1 }}\n\t\t\t\t>\n\t\t\t\t\t<div className=\"flex items-center gap-2 text-muted-foreground\">\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\tclassName=\"animate-spin h-4 w-4\"\n\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\t\tclassName=\"opacity-25\"\n\t\t\t\t\t\t\t\tcx=\"12\"\n\t\t\t\t\t\t\t\tcy=\"12\"\n\t\t\t\t\t\t\t\tr=\"10\"\n\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\tstrokeWidth=\"4\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\tclassName=\"opacity-75\"\n\t\t\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t\t\t\td=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t<span className=\"text-xs\">Loading terminal…</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n",
144
+ "import { memo } from 'react';\nimport { Terminal } from 'lucide-react';\nimport { useTerminalStore } from '../../stores/terminalStore';\nimport { useTerminals } from '../../hooks/useTerminals';\n\nexport const TerminalPanelToggle = memo(function TerminalPanelToggle() {\n\tconst isOpen = useTerminalStore((s) => s.isOpen);\n\tconst togglePanel = useTerminalStore((s) => s.togglePanel);\n\tconst { data } = useTerminals();\n\n\tconst count = data?.count ?? 0;\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={togglePanel}\n\t\t\tclassName={`relative h-14 w-full transition-colors touch-manipulation flex items-center justify-center ${\n\t\t\t\tisOpen ? 'bg-muted border-r-2 border-primary' : 'hover:bg-muted/50'\n\t\t\t}`}\n\t\t\ttitle=\"Terminals\"\n\t\t>\n\t\t\t<Terminal className=\"w-5 h-5 text-muted-foreground mx-auto\" />\n\t\t\t{count > 0 && (\n\t\t\t\t<span className=\"absolute top-1 right-1 w-5 h-5 bg-primary text-primary-foreground text-xs rounded-full flex items-center justify-center font-semibold\">\n\t\t\t\t\t{count > 9 ? '9+' : count}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</button>\n\t);\n});\n",
145
+ "import { memo, useMemo } from 'react';\nimport {\n\tChevronRight,\n\tFilePen,\n\tFileCode,\n\tFilePlus,\n\tFileEdit,\n\tRefreshCw,\n} from 'lucide-react';\nimport { useSessionFilesStore } from '../../stores/sessionFilesStore';\nimport { usePanelWidthStore } from '../../stores/panelWidthStore';\nimport { useSessionFiles } from '../../hooks/useSessionFiles';\nimport { Button } from '../ui/Button';\nimport { ResizeHandle } from '../ui/ResizeHandle';\nimport type { SessionFile, SessionFileOperation } from '../../types/api';\n\nconst PANEL_KEY = 'session-files';\nconst DEFAULT_WIDTH = 320;\nconst MIN_WIDTH = 320;\nconst MAX_WIDTH = 600;\n\ninterface SessionFilesSidebarProps {\n\tsessionId?: string;\n}\n\nfunction getOperationIcon(operation: string) {\n\tswitch (operation) {\n\t\tcase 'write':\n\t\t\treturn <FilePlus className=\"w-3 h-3 text-green-500\" />;\n\t\tcase 'patch':\n\t\t\treturn <FileEdit className=\"w-3 h-3 text-blue-500\" />;\n\t\tcase 'edit':\n\t\t\treturn <FileCode className=\"w-3 h-3 text-yellow-500\" />;\n\t\tdefault:\n\t\t\treturn <FilePen className=\"w-3 h-3 text-muted-foreground\" />;\n\t}\n}\n\nfunction getFileName(path: string): string {\n\treturn path.split('/').pop() || path;\n}\n\nfunction countLinesFromPatch(op: SessionFileOperation): {\n\tadditions: number;\n\tdeletions: number;\n} {\n\tif (op.artifact?.summary) {\n\t\treturn {\n\t\t\tadditions: op.artifact.summary.additions,\n\t\t\tdeletions: op.artifact.summary.deletions,\n\t\t};\n\t}\n\n\tconst patch = op.artifact?.patch || op.patch;\n\tif (patch) {\n\t\tlet additions = 0;\n\t\tlet deletions = 0;\n\t\tconst lines = patch.split('\\n');\n\t\tfor (const line of lines) {\n\t\t\tif (line.startsWith('+') && !line.startsWith('+++')) {\n\t\t\t\tadditions++;\n\t\t\t} else if (line.startsWith('-') && !line.startsWith('---')) {\n\t\t\t\tdeletions++;\n\t\t\t}\n\t\t}\n\t\treturn { additions, deletions };\n\t}\n\n\tif (op.content) {\n\t\tconst lineCount = op.content.split('\\n').length;\n\t\treturn { additions: lineCount, deletions: 0 };\n\t}\n\n\treturn { additions: 0, deletions: 0 };\n}\n\nfunction SessionFileItem({ file }: { file: SessionFile }) {\n\tconst openDiff = useSessionFilesStore((state) => state.openDiff);\n\tconst selectedFile = useSessionFilesStore((state) => state.selectedFile);\n\tconst isSelected = selectedFile === file.path;\n\n\tconst lastOp = file.operations[file.operations.length - 1];\n\n\tconst { totalAdditions, totalDeletions } = useMemo(() => {\n\t\tlet additions = 0;\n\t\tlet deletions = 0;\n\t\tfor (const op of file.operations) {\n\t\t\tconst stats = countLinesFromPatch(op);\n\t\t\tadditions += stats.additions;\n\t\t\tdeletions += stats.deletions;\n\t\t}\n\t\treturn { totalAdditions: additions, totalDeletions: deletions };\n\t}, [file.operations]);\n\n\tconst handleClick = () => {\n\t\tif (file.operations.length > 0) {\n\t\t\topenDiff(file.path, file.operations);\n\t\t}\n\t};\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={handleClick}\n\t\t\tclassName={`w-full text-left px-3 py-2 hover:bg-muted/50 transition-colors ${\n\t\t\t\tisSelected ? 'bg-muted' : ''\n\t\t\t}`}\n\t\t>\n\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t{getOperationIcon(lastOp?.operation || 'write')}\n\t\t\t\t<div className=\"flex-1 min-w-0\">\n\t\t\t\t\t<div className=\"text-sm font-medium truncate\">\n\t\t\t\t\t\t{getFileName(file.path)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex items-center gap-1 text-xs shrink-0\">\n\t\t\t\t\t{file.operationCount > 1 && (\n\t\t\t\t\t\t<span className=\"bg-muted text-muted-foreground px-1 rounded mr-1\">\n\t\t\t\t\t\t\t{file.operationCount}x\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t\t<span className=\"text-green-500\">+{totalAdditions}</span>\n\t\t\t\t\t<span className=\"text-red-500\">-{totalDeletions}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</button>\n\t);\n}\n\nexport const SessionFilesSidebar = memo(function SessionFilesSidebar({\n\tsessionId,\n}: SessionFilesSidebarProps) {\n\tconst isExpanded = useSessionFilesStore((state) => state.isExpanded);\n\tconst collapseSidebar = useSessionFilesStore(\n\t\t(state) => state.collapseSidebar,\n\t);\n\tconst panelWidth = usePanelWidthStore(\n\t\t(s) => s.widths[PANEL_KEY] ?? DEFAULT_WIDTH,\n\t);\n\tconst { data, isLoading, error, refetch } = useSessionFiles(sessionId);\n\n\tif (!isExpanded) return null;\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"border-l border-border bg-background flex h-full relative\"\n\t\t\tstyle={{ width: panelWidth }}\n\t\t>\n\t\t\t<ResizeHandle\n\t\t\t\tpanelKey={PANEL_KEY}\n\t\t\t\tside=\"right\"\n\t\t\t\tminWidth={MIN_WIDTH}\n\t\t\t\tmaxWidth={MAX_WIDTH}\n\t\t\t\tdefaultWidth={DEFAULT_WIDTH}\n\t\t\t/>\n\t\t\t<div className=\"flex-1 flex flex-col h-full min-w-0\">\n\t\t\t\t<div className=\"h-14 border-b border-border px-3 flex items-center justify-between shrink-0\">\n\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t<FilePen className=\"w-4 h-4 text-muted-foreground\" />\n\t\t\t\t\t\t<span className=\"font-medium\">Session Files</span>\n\t\t\t\t\t\t{data && data.totalFiles > 0 && (\n\t\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t({data.totalFiles})\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t\t<Button variant=\"ghost\" size=\"icon\" onClick={collapseSidebar}>\n\t\t\t\t\t\t<ChevronRight className=\"w-4 h-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"flex-1 overflow-y-auto\">\n\t\t\t\t\t{isLoading ? (\n\t\t\t\t\t\t<div className=\"p-4 text-sm text-muted-foreground\">\n\t\t\t\t\t\t\tLoading session files...\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : error ? (\n\t\t\t\t\t\t<div className=\"p-4 text-sm text-orange-500\">\n\t\t\t\t\t\t\t{error instanceof Error ? error.message : 'Failed to load files'}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : !data || data.totalFiles === 0 ? (\n\t\t\t\t\t\t<div className=\"p-4 text-sm text-muted-foreground\">\n\t\t\t\t\t\t\tNo files modified in this session\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div className=\"divide-y divide-border\">\n\t\t\t\t\t\t\t{data.files.map((file) => (\n\t\t\t\t\t\t\t\t<SessionFileItem key={file.path} file={file} />\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"h-12 px-4 border-t border-border text-xs text-muted-foreground flex items-center justify-between gap-2\">\n\t\t\t\t\t<div className=\"flex items-center gap-2 min-w-0 flex-1\">\n\t\t\t\t\t\t<FilePen className=\"w-3 h-3 flex-shrink-0\" />\n\t\t\t\t\t\t{data && data.totalOperations > 0 ? (\n\t\t\t\t\t\t\t<span className=\"truncate\">\n\t\t\t\t\t\t\t\t{data.totalFiles} file{data.totalFiles !== 1 ? 's' : ''} •{' '}\n\t\t\t\t\t\t\t\t{data.totalOperations} op{data.totalOperations !== 1 ? 's' : ''}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span className=\"truncate\">No changes</span>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex items-center gap-1 flex-shrink-0\">\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\tonClick={() => refetch()}\n\t\t\t\t\t\t\ttitle=\"Refresh session files\"\n\t\t\t\t\t\t\tclassName=\"h-6 w-6 transition-transform duration-200 hover:scale-110\"\n\t\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<RefreshCw\n\t\t\t\t\t\t\t\tclassName={`w-3 h-3 ${isLoading ? 'animate-spin' : ''}`}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n});\n",
146
+ "import { useQuery } from '@tanstack/react-query';\nimport { apiClient } from '../lib/api-client';\nimport { useSessionFilesStore } from '../stores/sessionFilesStore';\n\nexport function useSessionFiles(sessionId: string | undefined) {\n\tconst isExpanded = useSessionFilesStore((state) => state.isExpanded);\n\n\treturn useQuery({\n\t\tqueryKey: ['session', sessionId, 'files'],\n\t\tqueryFn: () => (sessionId ? apiClient.getSessionFiles(sessionId) : null),\n\t\tenabled: !!sessionId,\n\t\trefetchInterval: isExpanded ? 5000 : false,\n\t\tretry: 1,\n\t\tstaleTime: 3000,\n\t});\n}\n",
147
+ "import { memo } from 'react';\nimport { FilePen } from 'lucide-react';\nimport { useSessionFilesStore } from '../../stores/sessionFilesStore';\nimport { useSessionFiles } from '../../hooks/useSessionFiles';\n\ninterface SessionFilesSidebarToggleProps {\n\tsessionId?: string;\n}\n\nexport const SessionFilesSidebarToggle = memo(\n\tfunction SessionFilesSidebarToggle({\n\t\tsessionId,\n\t}: SessionFilesSidebarToggleProps) {\n\t\tconst isExpanded = useSessionFilesStore((state) => state.isExpanded);\n\t\tconst toggleSidebar = useSessionFilesStore((state) => state.toggleSidebar);\n\t\tconst { data } = useSessionFiles(sessionId);\n\n\t\tconst fileCount = data?.totalFiles ?? 0;\n\n\t\treturn (\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={toggleSidebar}\n\t\t\t\tclassName={`relative h-14 w-full transition-colors touch-manipulation flex items-center justify-center border-r-2 ${\n\t\t\t\t\tisExpanded\n\t\t\t\t\t\t? 'bg-muted border-primary'\n\t\t\t\t\t\t: 'border-transparent hover:bg-muted/50'\n\t\t\t\t}`}\n\t\t\t\ttitle=\"Session Files\"\n\t\t\t>\n\t\t\t\t<FilePen className=\"w-5 h-5 text-muted-foreground mx-auto\" />\n\t\t\t\t{fileCount > 0 && (\n\t\t\t\t\t<span className=\"absolute top-1 right-1 w-5 h-5 bg-primary text-primary-foreground text-xs rounded-full flex items-center justify-center font-semibold\">\n\t\t\t\t\t\t{fileCount > 9 ? '9+' : fileCount}\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</button>\n\t\t);\n\t},\n);\n",
148
+ "import { useEffect, useMemo, memo, useRef } from 'react';\nimport { X, ChevronLeft, ChevronRight } from 'lucide-react';\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport {\n\tprism,\n\tvscDarkPlus,\n} from 'react-syntax-highlighter/dist/esm/styles/prism';\nimport { useSessionFilesStore } from '../../stores/sessionFilesStore';\nimport { useSidebarStore } from '../../stores/sidebarStore';\nimport { Button } from '../ui/Button';\n\nfunction transformToUnifiedDiff(patch: string): string {\n\tconst lines = patch.split('\\n');\n\tconst result: string[] = [];\n\tlet addCount = 0;\n\tlet removeCount = 0;\n\tconst diffLines: string[] = [];\n\n\tfor (const line of lines) {\n\t\tif (\n\t\t\tline.startsWith('*** Begin Patch') ||\n\t\t\tline.startsWith('*** End Patch') ||\n\t\t\tline.startsWith('*** Update File:') ||\n\t\t\tline.startsWith('*** Add File:') ||\n\t\t\tline.startsWith('*** Delete File:')\n\t\t) {\n\t\t\tif (diffLines.length > 0) {\n\t\t\t\tresult.push(`@@ -1,${removeCount} +1,${addCount} @@`);\n\t\t\t\tresult.push(...diffLines);\n\t\t\t\tdiffLines.length = 0;\n\t\t\t\taddCount = 0;\n\t\t\t\tremoveCount = 0;\n\t\t\t}\n\t\t\tresult.push(line);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (line.match(/^@@ -\\d+(?:,\\d+)? \\+\\d+(?:,\\d+)? @@/)) {\n\t\t\tif (diffLines.length > 0) {\n\t\t\t\tresult.push(`@@ -1,${removeCount} +1,${addCount} @@`);\n\t\t\t\tresult.push(...diffLines);\n\t\t\t\tdiffLines.length = 0;\n\t\t\t\taddCount = 0;\n\t\t\t\tremoveCount = 0;\n\t\t\t}\n\t\t\tresult.push(line);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (line.startsWith('@@')) {\n\t\t\tresult.push(line);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (line.startsWith('+')) {\n\t\t\taddCount++;\n\t\t\tdiffLines.push(line);\n\t\t} else if (line.startsWith('-')) {\n\t\t\tremoveCount++;\n\t\t\tdiffLines.push(line);\n\t\t} else if (line.startsWith(' ') || line.startsWith('\\t')) {\n\t\t\taddCount++;\n\t\t\tremoveCount++;\n\t\t\tdiffLines.push(line.startsWith('\\t') ? ` ${line}` : line);\n\t\t} else if (line.trim() === '') {\n\t\t\tdiffLines.push(' ');\n\t\t\taddCount++;\n\t\t\tremoveCount++;\n\t\t} else {\n\t\t\taddCount++;\n\t\t\tremoveCount++;\n\t\t\tdiffLines.push(` ${line}`);\n\t\t}\n\t}\n\n\tif (diffLines.length > 0) {\n\t\tresult.push(`@@ -1,${removeCount} +1,${addCount} @@`);\n\t\tresult.push(...diffLines);\n\t}\n\n\treturn result.join('\\n');\n}\n\nfunction getLanguageFromPath(path: string): string {\n\tconst ext = path.split('.').pop()?.toLowerCase();\n\tconst langMap: Record<string, string> = {\n\t\tjs: 'javascript',\n\t\tjsx: 'jsx',\n\t\tts: 'typescript',\n\t\ttsx: 'tsx',\n\t\tpy: 'python',\n\t\trb: 'ruby',\n\t\tgo: 'go',\n\t\trs: 'rust',\n\t\tjava: 'java',\n\t\tc: 'c',\n\t\tcpp: 'cpp',\n\t\th: 'c',\n\t\thpp: 'cpp',\n\t\tcs: 'csharp',\n\t\tphp: 'php',\n\t\tsh: 'bash',\n\t\tbash: 'bash',\n\t\tzsh: 'bash',\n\t\tsql: 'sql',\n\t\tjson: 'json',\n\t\tyaml: 'yaml',\n\t\tyml: 'yaml',\n\t\txml: 'xml',\n\t\thtml: 'html',\n\t\tcss: 'css',\n\t\tscss: 'scss',\n\t\tmd: 'markdown',\n\t\ttxt: 'text',\n\t\tsvelte: 'svelte',\n\t};\n\treturn langMap[ext || ''] || 'javascript';\n}\n\ninterface DiffLine {\n\tcontent: string;\n\tcodeContent: string;\n\ttype: 'add' | 'remove' | 'context' | 'meta' | 'header';\n\toldLineNum?: number;\n\tnewLineNum?: number;\n}\n\nfunction parseDiff(patch: string): { lines: DiffLine[]; filePath: string } {\n\tconst lines = patch.split('\\n');\n\tconst result: DiffLine[] = [];\n\tlet oldLineNum = 0;\n\tlet newLineNum = 0;\n\tlet inHunk = false;\n\tlet filePath = '';\n\n\tfor (const line of lines) {\n\t\tif (line.startsWith('+++') || line.startsWith('*** Update File:')) {\n\t\t\tconst match =\n\t\t\t\tline.match(/\\+\\+\\+ b\\/(.+)/) || line.match(/\\*\\*\\* Update File: (.+)/);\n\t\t\tif (match) filePath = match[1];\n\t\t}\n\n\t\tif (line.startsWith('*** Add File:')) {\n\t\t\tconst match = line.match(/\\*\\*\\* Add File: (.+)/);\n\t\t\tif (match) filePath = match[1];\n\t\t}\n\n\t\tconst hunkMatch = line.match(/^@@ -(\\d+)(?:,\\d+)? \\+(\\d+)(?:,\\d+)? @@/);\n\t\tif (hunkMatch) {\n\t\t\toldLineNum = Number.parseInt(hunkMatch[1], 10);\n\t\t\tnewLineNum = Number.parseInt(hunkMatch[2], 10);\n\t\t\tinHunk = true;\n\t\t\tresult.push({\n\t\t\t\tcontent: line,\n\t\t\t\tcodeContent: line,\n\t\t\t\ttype: 'header',\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (\n\t\t\tline.startsWith('***') ||\n\t\t\tline.startsWith('diff ') ||\n\t\t\tline.startsWith('index ') ||\n\t\t\tline.startsWith('---') ||\n\t\t\tline.startsWith('+++') ||\n\t\t\t(line.startsWith('@@') && !inHunk)\n\t\t) {\n\t\t\tresult.push({\n\t\t\t\tcontent: line,\n\t\t\t\tcodeContent: line,\n\t\t\t\ttype: 'meta',\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (inHunk) {\n\t\t\tif (line.startsWith('+')) {\n\t\t\t\tresult.push({\n\t\t\t\t\tcontent: line,\n\t\t\t\t\tcodeContent: line.slice(1),\n\t\t\t\t\ttype: 'add',\n\t\t\t\t\tnewLineNum: newLineNum++,\n\t\t\t\t});\n\t\t\t} else if (line.startsWith('-')) {\n\t\t\t\tresult.push({\n\t\t\t\t\tcontent: line,\n\t\t\t\t\tcodeContent: line.slice(1),\n\t\t\t\t\ttype: 'remove',\n\t\t\t\t\toldLineNum: oldLineNum++,\n\t\t\t\t});\n\t\t\t} else if (line.startsWith(' ') || line === '') {\n\t\t\t\tresult.push({\n\t\t\t\t\tcontent: line,\n\t\t\t\t\tcodeContent: line.startsWith(' ') ? line.slice(1) : line,\n\t\t\t\t\ttype: 'context',\n\t\t\t\t\toldLineNum: oldLineNum++,\n\t\t\t\t\tnewLineNum: newLineNum++,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tresult.push({\n\t\t\t\t\tcontent: line,\n\t\t\t\t\tcodeContent: line,\n\t\t\t\t\ttype: 'context',\n\t\t\t\t\toldLineNum: oldLineNum++,\n\t\t\t\t\tnewLineNum: newLineNum++,\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tresult.push({\n\t\t\t\tcontent: line,\n\t\t\t\tcodeContent: line,\n\t\t\t\ttype: 'meta',\n\t\t\t});\n\t\t}\n\t}\n\n\treturn { lines: result, filePath };\n}\n\nfunction FullHeightDiffView({ patch }: { patch: string }) {\n\tconst { lines: diffLines, filePath } = parseDiff(patch);\n\tconst language = getLanguageFromPath(filePath);\n\tconst syntaxTheme = document?.documentElement.classList.contains('dark')\n\t\t? vscDarkPlus\n\t\t: prism;\n\n\treturn (\n\t\t<div className=\"bg-card/60 border border-border rounded-lg overflow-hidden h-full\">\n\t\t\t<div className=\"overflow-x-auto overflow-y-auto h-full text-xs font-mono\">\n\t\t\t\t{diffLines.map((line, i) => {\n\t\t\t\t\tconst key = `line-${i}-${line.content.slice(0, 20)}`;\n\n\t\t\t\t\tif (line.type === 'meta' || line.type === 'header') {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={key}\n\t\t\t\t\t\t\t\tclassName={`px-3 py-0.5 whitespace-pre-wrap break-all ${\n\t\t\t\t\t\t\t\t\tline.type === 'header'\n\t\t\t\t\t\t\t\t\t\t? 'text-muted-foreground/80 bg-muted/20'\n\t\t\t\t\t\t\t\t\t\t: 'text-muted-foreground/80'\n\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{line.content}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tlet lineClass = '';\n\t\t\t\t\tlet bgClass = '';\n\t\t\t\t\tswitch (line.type) {\n\t\t\t\t\t\tcase 'add':\n\t\t\t\t\t\t\tlineClass = 'text-emerald-700 dark:text-emerald-300';\n\t\t\t\t\t\t\tbgClass = 'bg-emerald-500/10';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'remove':\n\t\t\t\t\t\t\tlineClass = 'text-red-600 dark:text-red-300';\n\t\t\t\t\t\t\tbgClass = 'bg-red-500/10';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tlineClass = 'text-foreground/80';\n\t\t\t\t\t}\n\n\t\t\t\t\tlet renderedContent: React.ReactNode = line.content;\n\t\t\t\t\tif (line.codeContent.trim() && language !== 'text') {\n\t\t\t\t\t\trenderedContent = (\n\t\t\t\t\t\t\t<SyntaxHighlighter\n\t\t\t\t\t\t\t\tlanguage={language}\n\t\t\t\t\t\t\t\tstyle={syntaxTheme}\n\t\t\t\t\t\t\t\tcustomStyle={{\n\t\t\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\t\t\t\tbackground: 'transparent',\n\t\t\t\t\t\t\t\t\tdisplay: 'inline',\n\t\t\t\t\t\t\t\t\tfontSize: 'inherit',\n\t\t\t\t\t\t\t\t\tlineHeight: 'inherit',\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tcodeTagProps={{\n\t\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\t\tfontFamily: 'inherit',\n\t\t\t\t\t\t\t\t\t\tbackground: 'transparent',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tPreTag=\"span\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{line.codeContent}\n\t\t\t\t\t\t\t</SyntaxHighlighter>\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tif (line.type === 'add') {\n\t\t\t\t\t\t\trenderedContent = (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t<span className=\"select-none\">+</span>\n\t\t\t\t\t\t\t\t\t{renderedContent}\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else if (line.type === 'remove') {\n\t\t\t\t\t\t\trenderedContent = (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t<span className=\"select-none\">-</span>\n\t\t\t\t\t\t\t\t\t{renderedContent}\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else if (line.type === 'context') {\n\t\t\t\t\t\t\trenderedContent = (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t<span className=\"select-none\"> </span>\n\t\t\t\t\t\t\t\t\t{renderedContent}\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<div key={key} className={`flex ${bgClass}`}>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName=\"px-2 py-0.5 text-right text-muted-foreground/40 select-none w-12 flex-shrink-0\"\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tstyle={{ pointerEvents: 'none' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{line.oldLineNum || ''}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName=\"px-2 py-0.5 text-right text-muted-foreground/40 select-none w-12 flex-shrink-0 border-r border-border/50\"\n\t\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t\t\tstyle={{ pointerEvents: 'none' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{line.newLineNum || ''}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={`px-3 py-0.5 flex-1 min-w-0 whitespace-pre-wrap break-all ${lineClass}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{renderedContent}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nfunction formatTimestamp(timestamp: number): string {\n\tconst date = new Date(timestamp);\n\treturn date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n}\n\nexport const SessionFilesDiffPanel = memo(function SessionFilesDiffPanel() {\n\tconst isDiffOpen = useSessionFilesStore((state) => state.isDiffOpen);\n\tconst selectedFile = useSessionFilesStore((state) => state.selectedFile);\n\tconst allOperations = useSessionFilesStore((state) => state.allOperations);\n\tconst selectedOperationIndex = useSessionFilesStore(\n\t\t(state) => state.selectedOperationIndex,\n\t);\n\tconst selectOperation = useSessionFilesStore(\n\t\t(state) => state.selectOperation,\n\t);\n\tconst closeDiff = useSessionFilesStore((state) => state.closeDiff);\n\n\tconst setCollapsed = useSidebarStore((state) => state.setCollapsed);\n\tconst wasCollapsedRef = useRef<boolean | null>(null);\n\tconst prevDiffOpenRef = useRef(false);\n\n\tconst selectedOperation = allOperations[selectedOperationIndex];\n\n\tconst patchContent = useMemo(() => {\n\t\tif (!selectedOperation || !selectedFile) return null;\n\n\t\tlet rawPatch: string | null = null;\n\n\t\tif (selectedOperation.artifact?.patch) {\n\t\t\trawPatch = selectedOperation.artifact.patch;\n\t\t} else if (selectedOperation.patch) {\n\t\t\trawPatch = selectedOperation.patch;\n\t\t} else if (selectedOperation.content) {\n\t\t\tconst contentLines = selectedOperation.content.split('\\n');\n\t\t\trawPatch = `*** Add File: ${selectedFile}\\n${contentLines.map((line) => `+${line}`).join('\\n')}`;\n\t\t}\n\n\t\tif (!rawPatch) return null;\n\n\t\tconst hasProperHunkHeader = /@@ -\\d+(?:,\\d+)? \\+\\d+(?:,\\d+)? @@/.test(\n\t\t\trawPatch,\n\t\t);\n\t\tif (!hasProperHunkHeader) {\n\t\t\treturn transformToUnifiedDiff(rawPatch);\n\t\t}\n\n\t\treturn rawPatch;\n\t}, [selectedOperation, selectedFile]);\n\n\tuseEffect(() => {\n\t\t// Only act on transitions\n\t\tif (isDiffOpen && !prevDiffOpenRef.current) {\n\t\t\t// Diff just opened - save current state and collapse\n\t\t\tconst { isCollapsed } = useSidebarStore.getState();\n\t\t\twasCollapsedRef.current = isCollapsed;\n\t\t\tsetCollapsed(true);\n\t\t} else if (!isDiffOpen && prevDiffOpenRef.current) {\n\t\t\t// Diff just closed - restore previous state\n\t\t\tif (wasCollapsedRef.current !== null) {\n\t\t\t\tsetCollapsed(wasCollapsedRef.current);\n\t\t\t\twasCollapsedRef.current = null;\n\t\t\t}\n\t\t}\n\t\tprevDiffOpenRef.current = isDiffOpen;\n\t}, [isDiffOpen, setCollapsed]);\n\n\tuseEffect(() => {\n\t\tconst handleKeyDown = (e: KeyboardEvent) => {\n\t\t\tconst target = e.target as HTMLElement;\n\t\t\tconst isInInput =\n\t\t\t\ttarget.tagName === 'INPUT' ||\n\t\t\t\ttarget.tagName === 'TEXTAREA' ||\n\t\t\t\ttarget.isContentEditable;\n\n\t\t\tif ((e.key === 'Escape' || (e.key === 'q' && !isInInput)) && isDiffOpen) {\n\t\t\t\tcloseDiff();\n\t\t\t}\n\n\t\t\tif (!isInInput && isDiffOpen && allOperations.length > 1) {\n\t\t\t\tif (e.key === 'ArrowLeft' || e.key === '[') {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tselectOperation(Math.max(0, selectedOperationIndex - 1));\n\t\t\t\t} else if (e.key === 'ArrowRight' || e.key === ']') {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tselectOperation(\n\t\t\t\t\t\tMath.min(allOperations.length - 1, selectedOperationIndex + 1),\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener('keydown', handleKeyDown);\n\t\treturn () => document.removeEventListener('keydown', handleKeyDown);\n\t}, [\n\t\tisDiffOpen,\n\t\tcloseDiff,\n\t\tallOperations.length,\n\t\tselectedOperationIndex,\n\t\tselectOperation,\n\t]);\n\n\tif (!isDiffOpen || !selectedFile || !selectedOperation) return null;\n\n\tconst hasMultipleOps = allOperations.length > 1;\n\n\treturn (\n\t\t<div className=\"absolute inset-0 bg-background z-50 flex flex-col animate-in slide-in-from-left duration-300\">\n\t\t\t<div className=\"h-14 border-b border-border px-4 flex items-center gap-3 shrink-0\">\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tonClick={closeDiff}\n\t\t\t\t\ttitle=\"Close diff viewer (ESC)\"\n\t\t\t\t>\n\t\t\t\t\t<X className=\"w-4 h-4\" />\n\t\t\t\t</Button>\n\t\t\t\t<div className=\"flex-1 flex items-center gap-2 min-w-0\">\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName=\"text-sm font-medium text-foreground font-mono truncate\"\n\t\t\t\t\t\ttitle={selectedFile}\n\t\t\t\t\t>\n\t\t\t\t\t\t{selectedFile}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"text-xs px-2 py-0.5 rounded bg-primary/10 text-primary flex-shrink-0 capitalize\">\n\t\t\t\t\t\t{selectedOperation.operation}\n\t\t\t\t\t</span>\n\t\t\t\t\t{selectedOperation.artifact?.summary && (\n\t\t\t\t\t\t<div className=\"flex items-center gap-1 text-xs flex-shrink-0\">\n\t\t\t\t\t\t\t<span className=\"text-green-500\">\n\t\t\t\t\t\t\t\t+{selectedOperation.artifact.summary.additions}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span className=\"text-red-500\">\n\t\t\t\t\t\t\t\t-{selectedOperation.artifact.summary.deletions}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{hasMultipleOps && (\n\t\t\t\t\t<div className=\"flex items-center gap-2 shrink-0\">\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\tselectOperation(Math.max(0, selectedOperationIndex - 1))\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdisabled={selectedOperationIndex === 0}\n\t\t\t\t\t\t\ttitle=\"Previous operation (←)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ChevronLeft className=\"w-4 h-4\" />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground min-w-[60px] text-center\">\n\t\t\t\t\t\t\t{selectedOperationIndex + 1} / {allOperations.length}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\tselectOperation(\n\t\t\t\t\t\t\t\t\tMath.min(\n\t\t\t\t\t\t\t\t\t\tallOperations.length - 1,\n\t\t\t\t\t\t\t\t\t\tselectedOperationIndex + 1,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdisabled={selectedOperationIndex === allOperations.length - 1}\n\t\t\t\t\t\t\ttitle=\"Next operation (→)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ChevronRight className=\"w-4 h-4\" />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t{hasMultipleOps && (\n\t\t\t\t<div className=\"border-b border-border px-4 py-2 flex gap-2 overflow-x-auto shrink-0\">\n\t\t\t\t\t{allOperations.map((op, idx) => (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tkey={op.toolCallId}\n\t\t\t\t\t\t\tonClick={() => selectOperation(idx)}\n\t\t\t\t\t\t\tclassName={`px-3 py-1.5 text-xs rounded-md flex items-center gap-2 shrink-0 transition-colors ${\n\t\t\t\t\t\t\t\tidx === selectedOperationIndex\n\t\t\t\t\t\t\t\t\t? 'bg-primary text-primary-foreground'\n\t\t\t\t\t\t\t\t\t: 'bg-muted hover:bg-muted/80 text-muted-foreground'\n\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span className=\"capitalize\">{op.operation}</span>\n\t\t\t\t\t\t\t<span className=\"opacity-70\">\n\t\t\t\t\t\t\t\t{formatTimestamp(op.timestamp)}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{op.artifact?.summary && (\n\t\t\t\t\t\t\t\t<span className=\"opacity-70\">\n\t\t\t\t\t\t\t\t\t+{op.artifact.summary.additions}/-\n\t\t\t\t\t\t\t\t\t{op.artifact.summary.deletions}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<div className=\"flex-1 overflow-hidden p-4\">\n\t\t\t\t{patchContent ? (\n\t\t\t\t\t<FullHeightDiffView patch={patchContent} />\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"h-full flex items-center justify-center text-muted-foreground\">\n\t\t\t\t\t\tNo diff content available\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n});\n",
149
+ "import { memo, useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport {\n\tChevronRight,\n\tFlaskConical,\n\tPlus,\n\tHistory,\n\tLoader2,\n\tArrowUp,\n\tArrowDownToLine,\n\tExternalLink,\n\tChevronDown,\n\tCheck,\n\tX,\n} from 'lucide-react';\nimport { useResearchStore } from '../../stores/researchStore';\nimport { usePanelWidthStore } from '../../stores/panelWidthStore';\nimport {\n\tuseResearchSessions,\n\tuseCreateResearchSession,\n\tuseInjectContext,\n\tuseExportToSession,\n\ttype ResearchSession,\n} from '../../hooks/useResearch';\nimport { useSession, useUpdateSession } from '../../hooks/useSessions';\nimport { useAllModels } from '../../hooks/useConfig';\nimport { useMessages } from '../../hooks/useMessages';\nimport { useSessionStream } from '../../hooks/useSessionStream';\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiClient } from '../../lib/api-client';\nimport { Button } from '../ui/Button';\nimport { Textarea } from '../ui/Textarea';\nimport { Modal } from '../ui/Modal';\nimport { UnifiedModelSelector } from '../chat/UnifiedModelSelector';\nimport { AssistantMessageGroup } from '../messages/AssistantMessageGroup';\nimport { UserMessageGroup } from '../messages/UserMessageGroup';\nimport { ResizeHandle } from '../ui/ResizeHandle';\n\nconst PANEL_KEY = 'research';\nconst DEFAULT_WIDTH = 384;\nconst MIN_WIDTH = 384;\nconst MAX_WIDTH = 640;\n\ninterface ResearchSidebarProps {\n\tparentSessionId: string | null;\n\tonNavigateToSession?: (sessionId: string) => void;\n}\n\nexport const ResearchSidebar = memo(function ResearchSidebar({\n\tparentSessionId,\n\tonNavigateToSession,\n}: ResearchSidebarProps) {\n\tconst isExpanded = useResearchStore((state) => state.isExpanded);\n\tconst collapseSidebar = useResearchStore((state) => state.collapseSidebar);\n\tconst panelWidth = usePanelWidthStore(\n\t\t(s) => s.widths[PANEL_KEY] ?? DEFAULT_WIDTH,\n\t);\n\tconst activeResearchSessionId = useResearchStore(\n\t\t(state) => state.activeResearchSessionId,\n\t);\n\tconst selectResearchSession = useResearchStore(\n\t\t(state) => state.selectResearchSession,\n\t);\n\n\tconst [showHistory, setShowHistory] = useState(false);\n\tconst [inputValue, setInputValue] = useState('');\n\tconst [showModelSelector, setShowModelSelector] = useState(false);\n\tconst [injectionStatus, setInjectionStatus] = useState<\n\t\t'idle' | 'success' | 'error'\n\t>('idle');\n\tconst textareaRef = useRef<HTMLTextAreaElement>(null);\n\tconst messagesEndRef = useRef<HTMLDivElement>(null);\n\n\tconst {\n\t\tdata: researchData,\n\t\tisLoading,\n\t\trefetch,\n\t} = useResearchSessions(parentSessionId);\n\tconst createMutation = useCreateResearchSession();\n\tconst injectMutation = useInjectContext();\n\tconst exportMutation = useExportToSession();\n\tconst { data: allModels } = useAllModels();\n\n\tconst { data: messagesData } = useMessages(\n\t\tactiveResearchSessionId ?? undefined,\n\t);\n\n\tconst { data: parentMessagesData } = useMessages(\n\t\tparentSessionId ?? undefined,\n\t);\n\n\t// Enable streaming for the active research session\n\tuseSessionStream(activeResearchSessionId ?? undefined);\n\n\tconst updateSession = useUpdateSession(activeResearchSessionId ?? '');\n\n\tconst queryClient = useQueryClient();\n\tconst sendMessage = useMutation({\n\t\tmutationFn: async ({\n\t\t\tsessionId,\n\t\t\tcontent,\n\t\t}: {\n\t\t\tsessionId: string;\n\t\t\tcontent: string;\n\t\t}) => apiClient.sendMessage(sessionId, { content }),\n\t\tonSuccess: (_, { sessionId }) => {\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['messages', sessionId] });\n\t\t},\n\t});\n\n\tuseEffect(() => {\n\t\tif (parentSessionId) {\n\t\t\tuseResearchStore.getState().setParentSessionId(parentSessionId);\n\t\t}\n\t}, [parentSessionId]);\n\n\tuseEffect(() => {\n\t\tif (researchData?.sessions?.length) {\n\t\t\tconst currentIsValid = researchData.sessions.some(\n\t\t\t\t(s) => s.id === activeResearchSessionId,\n\t\t\t);\n\t\t\tif (!currentIsValid) {\n\t\t\t\tselectResearchSession(researchData.sessions[0].id);\n\t\t\t}\n\t\t} else if (researchData?.sessions?.length === 0) {\n\t\t\tselectResearchSession(null);\n\t\t}\n\t}, [researchData, activeResearchSessionId, selectResearchSession]);\n\n\tuseEffect(() => {\n\t\tmessagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n\t}, []);\n\n\tconst adjustTextareaHeight = useCallback(() => {\n\t\tconst textarea = textareaRef.current;\n\t\tif (!textarea) return;\n\t\ttextarea.style.height = 'auto';\n\t\ttextarea.style.height = `${Math.min(textarea.scrollHeight, 120)}px`;\n\t}, []);\n\n\tuseEffect(() => {\n\t\tadjustTextareaHeight();\n\t}, [adjustTextareaHeight]);\n\n\tconst handleCreateNew = useCallback(async () => {\n\t\tif (!parentSessionId) return;\n\t\ttry {\n\t\t\tconst result = await createMutation.mutateAsync({\n\t\t\t\tparentSessionId,\n\t\t\t\tdata: {},\n\t\t\t});\n\t\t\t// Wait for query to refetch before selecting\n\t\t\tawait refetch();\n\t\t\tselectResearchSession(result.session.id);\n\t\t\tsetShowHistory(false);\n\t\t} catch (err) {\n\t\t\tconsole.error('Failed to create research session:', err);\n\t\t}\n\t}, [parentSessionId, createMutation, selectResearchSession, refetch]);\n\n\tconst handleSelectSession = useCallback(\n\t\t(session: ResearchSession) => {\n\t\t\tselectResearchSession(session.id);\n\t\t\tsetShowHistory(false);\n\t\t},\n\t\t[selectResearchSession],\n\t);\n\n\tconst handleInject = useCallback(async () => {\n\t\tif (!parentSessionId || !activeResearchSessionId) return;\n\n\t\t// Check if already injected\n\t\tconst alreadyInjected = parentMessagesData?.some(\n\t\t\t(m) =>\n\t\t\t\tm.role === 'system' &&\n\t\t\t\tm.parts?.some(\n\t\t\t\t\t(p) =>\n\t\t\t\t\t\ttypeof p.content === 'string' &&\n\t\t\t\t\t\tp.content.includes(`from=\"${activeResearchSessionId}\"`),\n\t\t\t\t),\n\t\t);\n\t\tif (alreadyInjected) {\n\t\t\tsetInjectionStatus('error');\n\t\t\tsetTimeout(() => setInjectionStatus('idle'), 3000);\n\t\t\treturn;\n\t\t}\n\n\t\t// Generate a descriptive label with timestamp\n\t\tconst now = new Date();\n\t\tconst timeStr = now.toLocaleTimeString([], {\n\t\t\thour: '2-digit',\n\t\t\tminute: '2-digit',\n\t\t});\n\t\tconst label = `Research ${timeStr}`;\n\n\t\ttry {\n\t\t\tawait injectMutation.mutateAsync({\n\t\t\t\tparentSessionId,\n\t\t\t\tresearchSessionId: activeResearchSessionId,\n\t\t\t\tlabel,\n\t\t\t});\n\t\t\tsetInjectionStatus('success');\n\t\t\tsetTimeout(() => setInjectionStatus('idle'), 5000);\n\t\t\t// Invalidate parent messages to update the UI\n\t\t\tqueryClient.invalidateQueries({\n\t\t\t\tqueryKey: ['messages', parentSessionId],\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tconsole.error('Failed to inject context:', err);\n\t\t\tsetInjectionStatus('error');\n\t\t\tsetTimeout(() => setInjectionStatus('idle'), 3000);\n\t\t}\n\t}, [\n\t\tparentSessionId,\n\t\tactiveResearchSessionId,\n\t\tinjectMutation,\n\t\tparentMessagesData,\n\t\tqueryClient,\n\t]);\n\n\tconst handleExport = useCallback(async () => {\n\t\tif (!activeResearchSessionId) return;\n\t\ttry {\n\t\t\tconst result = await exportMutation.mutateAsync({\n\t\t\t\tresearchId: activeResearchSessionId,\n\t\t\t});\n\t\t\tif (onNavigateToSession && result.newSession?.id) {\n\t\t\t\tonNavigateToSession(result.newSession.id);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconsole.error('Failed to export to session:', err);\n\t\t}\n\t}, [activeResearchSessionId, exportMutation, onNavigateToSession]);\n\n\tconst handleSendMessage = useCallback(async () => {\n\t\tif (!inputValue.trim() || !parentSessionId) return;\n\t\ttry {\n\t\t\tlet sessionId = activeResearchSessionId;\n\n\t\t\tif (!sessionId) {\n\t\t\t\tconst result = await createMutation.mutateAsync({\n\t\t\t\t\tparentSessionId,\n\t\t\t\t\tdata: {},\n\t\t\t\t});\n\t\t\t\tsessionId = result.session.id;\n\t\t\t\tselectResearchSession(sessionId);\n\t\t\t}\n\n\t\t\tawait sendMessage.mutateAsync({\n\t\t\t\tsessionId,\n\t\t\t\tcontent: inputValue,\n\t\t\t});\n\t\t\tsetInputValue('');\n\t\t\tif (textareaRef.current) {\n\t\t\t\ttextareaRef.current.style.height = 'auto';\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tconsole.error('Failed to send message:', err);\n\t\t}\n\t}, [\n\t\tinputValue,\n\t\tparentSessionId,\n\t\tactiveResearchSessionId,\n\t\tcreateMutation,\n\t\tselectResearchSession,\n\t\tsendMessage,\n\t]);\n\n\tconst handleKeyDown = useCallback(\n\t\t(e: React.KeyboardEvent) => {\n\t\t\tif (e.key === 'Enter' && !e.shiftKey) {\n\t\t\t\te.preventDefault();\n\t\t\t\thandleSendMessage();\n\t\t\t}\n\t\t},\n\t\t[handleSendMessage],\n\t);\n\n\tconst isGenerating = useMemo(\n\t\t() =>\n\t\t\tmessagesData?.some(\n\t\t\t\t(m) => m.role === 'assistant' && m.status === 'pending',\n\t\t\t) ?? false,\n\t\t[messagesData],\n\t);\n\n\tconst isAlreadyInjected = useMemo(() => {\n\t\tif (!activeResearchSessionId || !parentMessagesData) return false;\n\t\treturn parentMessagesData.some(\n\t\t\t(m) =>\n\t\t\t\tm.role === 'system' &&\n\t\t\t\tm.parts?.some(\n\t\t\t\t\t(p) =>\n\t\t\t\t\t\ttypeof p.content === 'string' &&\n\t\t\t\t\t\tp.content.includes(`from=\"${activeResearchSessionId}\"`),\n\t\t\t\t),\n\t\t);\n\t}, [activeResearchSessionId, parentMessagesData]);\n\n\tconst handleModelChange = useCallback(\n\t\tasync (newProvider: string, newModel: string) => {\n\t\t\tif (!activeResearchSessionId) {\n\t\t\t\tsetShowModelSelector(false);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait updateSession.mutateAsync({\n\t\t\t\t\tprovider: newProvider,\n\t\t\t\t\tmodel: newModel,\n\t\t\t\t});\n\t\t\t\tawait queryClient.invalidateQueries({\n\t\t\t\t\tqueryKey: ['research', 'sessions', parentSessionId],\n\t\t\t\t});\n\t\t\t\tsetShowModelSelector(false);\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error('Failed to update research session model:', err);\n\t\t\t}\n\t\t},\n\t\t[activeResearchSessionId, updateSession, queryClient, parentSessionId],\n\t);\n\n\tconst parentSession = useSession(parentSessionId ?? '');\n\n\tif (!isExpanded) return null;\n\n\tconst sessions = researchData?.sessions ?? [];\n\tconst activeSession = sessions.find((s) => s.id === activeResearchSessionId);\n\tconst messages = messagesData ?? [];\n\n\tconst effectiveProvider =\n\t\tactiveSession?.provider ?? parentSession?.provider ?? '';\n\tconst effectiveModel = activeSession?.model ?? parentSession?.model ?? '';\n\n\tconst currentProviderLabel =\n\t\tallModels?.[effectiveProvider]?.label ?? effectiveProvider;\n\tconst currentModelLabel =\n\t\tallModels?.[effectiveProvider]?.models.find((m) => m.id === effectiveModel)\n\t\t\t?.label ?? effectiveModel;\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"border-l border-border bg-background flex h-full relative\"\n\t\t\tstyle={{ width: panelWidth }}\n\t\t>\n\t\t\t<ResizeHandle\n\t\t\t\tpanelKey={PANEL_KEY}\n\t\t\t\tside=\"right\"\n\t\t\t\tminWidth={MIN_WIDTH}\n\t\t\t\tmaxWidth={MAX_WIDTH}\n\t\t\t\tdefaultWidth={DEFAULT_WIDTH}\n\t\t\t/>\n\t\t\t<div className=\"flex-1 flex flex-col h-full min-w-0\">\n\t\t\t\t{/* Header */}\n\t\t\t\t<div className=\"h-14 border-b border-border px-3 flex items-center justify-between\">\n\t\t\t\t\t<div className=\"flex items-center gap-2 flex-1\">\n\t\t\t\t\t\t<FlaskConical className=\"w-4 h-4 text-teal-500\" />\n\t\t\t\t\t\t<span className=\"font-medium text-foreground text-sm\">\n\t\t\t\t\t\t\tResearch\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex items-center gap-0.5\">\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\tonClick={() => setShowHistory(!showHistory)}\n\t\t\t\t\t\t\ttitle=\"Research history\"\n\t\t\t\t\t\t\tclassName=\"h-8 w-8\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<History className=\"w-4 h-4\" />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\tonClick={handleCreateNew}\n\t\t\t\t\t\t\tdisabled={!parentSessionId || createMutation.isPending}\n\t\t\t\t\t\t\ttitle=\"New research session\"\n\t\t\t\t\t\t\tclassName=\"h-8 w-8\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{createMutation.isPending ? (\n\t\t\t\t\t\t\t\t<Loader2 className=\"w-4 h-4 animate-spin\" />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<Plus className=\"w-4 h-4\" />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\tonClick={collapseSidebar}\n\t\t\t\t\t\t\ttitle=\"Close sidebar\"\n\t\t\t\t\t\t\tclassName=\"h-8 w-8\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ChevronRight className=\"w-4 h-4\" />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t{showHistory ? (\n\t\t\t\t\t<div className=\"flex-1 overflow-y-auto\">\n\t\t\t\t\t\t<div className=\"p-2 border-b border-border\">\n\t\t\t\t\t\t\t<div className=\"text-xs font-medium text-muted-foreground px-2 py-1\">\n\t\t\t\t\t\t\t\tResearch Sessions\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{isLoading ? (\n\t\t\t\t\t\t\t<div className=\"p-4 text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\tLoading...\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : sessions.length === 0 ? (\n\t\t\t\t\t\t\t<div className=\"p-4 text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\tNo research sessions yet\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<div className=\"p-2 space-y-1\">\n\t\t\t\t\t\t\t\t{sessions.map((session) => (\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tkey={session.id}\n\t\t\t\t\t\t\t\t\t\tonClick={() => handleSelectSession(session)}\n\t\t\t\t\t\t\t\t\t\tclassName={`w-full text-left p-2 rounded-md text-sm transition-colors ${\n\t\t\t\t\t\t\t\t\t\t\tsession.id === activeResearchSessionId\n\t\t\t\t\t\t\t\t\t\t\t\t? 'bg-teal-500/10 border border-teal-500/30 text-foreground'\n\t\t\t\t\t\t\t\t\t\t\t\t: 'hover:bg-muted'\n\t\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<div className=\"font-medium truncate\">\n\t\t\t\t\t\t\t\t\t\t\t{session.title || 'Untitled'}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t{session.messageCount} messages •{' '}\n\t\t\t\t\t\t\t\t\t\t\t{formatRelativeTime(\n\t\t\t\t\t\t\t\t\t\t\t\tsession.lastActiveAt ?? session.createdAt,\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{/* Messages area - using the same components as main chat, but smaller */}\n\t\t\t\t\t\t<div className=\"flex-1 overflow-y-auto px-3 py-3 research-messages text-[13px]\">\n\t\t\t\t\t\t\t{!activeResearchSessionId ? (\n\t\t\t\t\t\t\t\t<div className=\"text-xs text-muted-foreground text-center py-8\">\n\t\t\t\t\t\t\t\t\t<FlaskConical className=\"w-8 h-8 mx-auto mb-2 text-muted-foreground/50\" />\n\t\t\t\t\t\t\t\t\t<p>Start researching by asking a question below.</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : messages.length === 0 ? (\n\t\t\t\t\t\t\t\t<div className=\"text-xs text-muted-foreground text-center py-8\">\n\t\t\t\t\t\t\t\t\t<p>Ask a question to start researching.</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<div className=\"space-y-1.5\">\n\t\t\t\t\t\t\t\t\t{messages.map((msg, index) => {\n\t\t\t\t\t\t\t\t\t\tif (msg.role === 'user') {\n\t\t\t\t\t\t\t\t\t\t\tconst nextMsg = messages[index + 1];\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<UserMessageGroup\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={msg.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\tsessionId={activeResearchSessionId}\n\t\t\t\t\t\t\t\t\t\t\t\t\tmessage={msg}\n\t\t\t\t\t\t\t\t\t\t\t\t\tisFirst={index === 0}\n\t\t\t\t\t\t\t\t\t\t\t\t\tnextAssistantMessageId={\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tnextMsg?.role === 'assistant'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? nextMsg.id\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tif (msg.role === 'assistant') {\n\t\t\t\t\t\t\t\t\t\t\tconst prevMsg = index > 0 ? messages[index - 1] : null;\n\t\t\t\t\t\t\t\t\t\t\tconst nextMsg = messages[index + 1];\n\t\t\t\t\t\t\t\t\t\t\tconst showHeader = prevMsg?.role !== 'assistant';\n\t\t\t\t\t\t\t\t\t\t\tconst hasNextAssistant = nextMsg?.role === 'assistant';\n\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t<AssistantMessageGroup\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={msg.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\tsessionId={activeResearchSessionId}\n\t\t\t\t\t\t\t\t\t\t\t\t\tmessage={msg}\n\t\t\t\t\t\t\t\t\t\t\t\t\tshowHeader={showHeader}\n\t\t\t\t\t\t\t\t\t\t\t\t\thasNextAssistantMessage={hasNextAssistant}\n\t\t\t\t\t\t\t\t\t\t\t\t\tisLastMessage={index === messages.length - 1}\n\t\t\t\t\t\t\t\t\t\t\t\t\tcompact\n\t\t\t\t\t\t\t\t\t\t\t\t\tonNavigateToSession={onNavigateToSession}\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t<div ref={messagesEndRef} />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Input area */}\n\t\t\t\t\t\t<div className=\"p-3 border-t border-border\">\n\t\t\t\t\t\t\t<div className=\"relative flex flex-col rounded-3xl bg-card border border-border focus-within:border-teal-500/60 focus-within:ring-1 focus-within:ring-teal-500/40 p-1\">\n\t\t\t\t\t\t\t\t<div className=\"flex items-end gap-1\">\n\t\t\t\t\t\t\t\t\t<Textarea\n\t\t\t\t\t\t\t\t\t\tref={textareaRef}\n\t\t\t\t\t\t\t\t\t\tvalue={inputValue}\n\t\t\t\t\t\t\t\t\t\tonChange={(e) => setInputValue(e.target.value)}\n\t\t\t\t\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\t\t\t\t\tplaceholder=\"Ask anything...\"\n\t\t\t\t\t\t\t\t\t\tdisabled={\n\t\t\t\t\t\t\t\t\t\t\t!parentSessionId ||\n\t\t\t\t\t\t\t\t\t\t\tsendMessage.isPending ||\n\t\t\t\t\t\t\t\t\t\t\tcreateMutation.isPending\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\trows={1}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex-1 border-0 bg-transparent pl-2 pr-1 py-2 max-h-[120px] overflow-y-auto leading-normal resize-none scrollbar-hide text-sm focus:ring-0 focus:outline-none\"\n\t\t\t\t\t\t\t\t\t\tstyle={{ height: '2.25rem' }}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleSendMessage}\n\t\t\t\t\t\t\t\t\t\tdisabled={\n\t\t\t\t\t\t\t\t\t\t\t!inputValue.trim() ||\n\t\t\t\t\t\t\t\t\t\t\t!parentSessionId ||\n\t\t\t\t\t\t\t\t\t\t\tsendMessage.isPending ||\n\t\t\t\t\t\t\t\t\t\t\tcreateMutation.isPending ||\n\t\t\t\t\t\t\t\t\t\t\tisGenerating\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tclassName={`flex items-center justify-center w-9 h-9 rounded-full transition-colors flex-shrink-0 ${\n\t\t\t\t\t\t\t\t\t\t\tinputValue.trim() && parentSessionId && !isGenerating\n\t\t\t\t\t\t\t\t\t\t\t\t? 'bg-teal-500 hover:bg-teal-600 text-white'\n\t\t\t\t\t\t\t\t\t\t\t\t: 'bg-transparent text-muted-foreground'\n\t\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{sendMessage.isPending || createMutation.isPending ? (\n\t\t\t\t\t\t\t\t\t\t\t<Loader2 className=\"w-4 h-4 animate-spin\" />\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<ArrowUp className=\"w-4 h-4\" />\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t{/* Injection status banner */}\n\t\t\t\t\t\t\t{injectionStatus === 'success' && (\n\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2 mt-2 px-2 py-1.5 text-xs rounded-lg bg-teal-500/10 border border-teal-500/30 text-teal-600 dark:text-teal-400\">\n\t\t\t\t\t\t\t\t\t<Check className=\"w-3 h-3 flex-shrink-0\" />\n\t\t\t\t\t\t\t\t\t<span className=\"flex-1\">\n\t\t\t\t\t\t\t\t\t\tContext injected — will be used on next request\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => setInjectionStatus('idle')}\n\t\t\t\t\t\t\t\t\t\tclassName=\"hover:text-teal-500\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<X className=\"w-3 h-3\" />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{injectionStatus === 'error' && (\n\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2 mt-2 px-2 py-1.5 text-xs rounded-lg bg-red-500/10 border border-red-500/30 text-red-600 dark:text-red-400\">\n\t\t\t\t\t\t\t\t\t<X className=\"w-3 h-3 flex-shrink-0\" />\n\t\t\t\t\t\t\t\t\t<span className=\"flex-1\">Failed to inject context</span>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => setInjectionStatus('idle')}\n\t\t\t\t\t\t\t\t\t\tclassName=\"hover:text-red-500\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<X className=\"w-3 h-3\" />\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{/* Action buttons */}\n\t\t\t\t\t\t\t<div className=\"flex gap-2 mt-2\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={handleInject}\n\t\t\t\t\t\t\t\t\tdisabled={\n\t\t\t\t\t\t\t\t\t\t!activeResearchSessionId ||\n\t\t\t\t\t\t\t\t\t\tinjectMutation.isPending ||\n\t\t\t\t\t\t\t\t\t\tisGenerating ||\n\t\t\t\t\t\t\t\t\t\tisAlreadyInjected\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tclassName={`flex-1 flex items-center justify-center gap-1.5 px-2 py-1.5 text-xs rounded-lg transition-colors disabled:opacity-50 disabled:cursor-not-allowed ${\n\t\t\t\t\t\t\t\t\t\tisAlreadyInjected\n\t\t\t\t\t\t\t\t\t\t\t? 'bg-teal-500/10 text-teal-600 dark:text-teal-400 border border-teal-500/30'\n\t\t\t\t\t\t\t\t\t\t\t: 'bg-muted hover:bg-muted/80 text-muted-foreground hover:text-foreground'\n\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t\ttitle={\n\t\t\t\t\t\t\t\t\t\tisAlreadyInjected\n\t\t\t\t\t\t\t\t\t\t\t? 'Already injected into main session'\n\t\t\t\t\t\t\t\t\t\t\t: 'Inject findings into main session'\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{injectMutation.isPending ? (\n\t\t\t\t\t\t\t\t\t\t<Loader2 className=\"w-3 h-3 animate-spin\" />\n\t\t\t\t\t\t\t\t\t) : isAlreadyInjected ? (\n\t\t\t\t\t\t\t\t\t\t<Check className=\"w-3 h-3\" />\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<ArrowDownToLine className=\"w-3 h-3\" />\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{isAlreadyInjected ? 'Injected' : 'Inject'}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={handleExport}\n\t\t\t\t\t\t\t\t\tdisabled={\n\t\t\t\t\t\t\t\t\t\t!activeResearchSessionId ||\n\t\t\t\t\t\t\t\t\t\texportMutation.isPending ||\n\t\t\t\t\t\t\t\t\t\tisGenerating\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tclassName=\"flex-1 flex items-center justify-center gap-1.5 px-2 py-1.5 text-xs rounded-lg bg-muted hover:bg-muted/80 text-muted-foreground hover:text-foreground transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n\t\t\t\t\t\t\t\t\ttitle=\"Export to new main session\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{exportMutation.isPending ? (\n\t\t\t\t\t\t\t\t\t\t<Loader2 className=\"w-3 h-3 animate-spin\" />\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<ExternalLink className=\"w-3 h-3\" />\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tExport\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\n\t\t\t\t{/* Footer */}\n\t\t\t\t<div className=\"h-12 px-3 border-t border-border text-xs text-muted-foreground flex items-center justify-between\">\n\t\t\t\t\t<span className=\"text-[10px]\">\n\t\t\t\t\t\t{sessions.length} research session{sessions.length !== 1 ? 's' : ''}\n\t\t\t\t\t</span>\n\t\t\t\t\t{(currentProviderLabel || currentModelLabel) && (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => setShowModelSelector(true)}\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-1 text-[10px] hover:text-foreground transition-colors\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span className=\"opacity-60\">{currentProviderLabel}</span>\n\t\t\t\t\t\t\t<span className=\"opacity-40\">/</span>\n\t\t\t\t\t\t\t<span>{currentModelLabel}</span>\n\t\t\t\t\t\t\t<ChevronDown className=\"w-3 h-3 opacity-40\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Model Selector Modal */}\n\t\t\t\t<Modal\n\t\t\t\t\tisOpen={showModelSelector}\n\t\t\t\t\tonClose={() => setShowModelSelector(false)}\n\t\t\t\t\ttitle=\"Select Model for Research\"\n\t\t\t\t\tmaxWidth=\"md\"\n\t\t\t\t>\n\t\t\t\t\t{(effectiveProvider || effectiveModel) && (\n\t\t\t\t\t\t<UnifiedModelSelector\n\t\t\t\t\t\t\tprovider={effectiveProvider}\n\t\t\t\t\t\t\tmodel={effectiveModel}\n\t\t\t\t\t\t\tonChange={handleModelChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</Modal>\n\t\t\t</div>\n\t\t</div>\n\t);\n});\n\nfunction formatRelativeTime(timestamp: number): string {\n\tconst diff = Date.now() - timestamp;\n\tconst minutes = Math.floor(diff / 60000);\n\tif (minutes < 1) return 'just now';\n\tif (minutes < 60) return `${minutes}m ago`;\n\tconst hours = Math.floor(minutes / 60);\n\tif (hours < 24) return `${hours}h ago`;\n\tconst days = Math.floor(hours / 24);\n\treturn `${days}d ago`;\n}\n",
150
+ "import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { API_BASE_URL } from '../lib/config';\nimport { usePendingResearchStore } from '../stores/pendingResearchStore';\nimport { sessionsQueryKey } from './useSessions';\n\nexport interface ResearchSession {\n\tid: string;\n\ttitle: string | null;\n\tcreatedAt: number;\n\tlastActiveAt: number | null;\n\tprovider: string;\n\tmodel: string;\n\tmessageCount: number;\n}\n\nexport interface ResearchSessionsResponse {\n\tsessions: ResearchSession[];\n}\n\nexport interface CreateResearchResponse {\n\tsession: ResearchSession;\n\tparentSessionId: string;\n}\n\nexport interface InjectContextResponse {\n\tcontent: string;\n\tlabel: string;\n\tsessionId: string;\n\tparentSessionId: string;\n\ttokenEstimate: number;\n}\n\nexport interface ExportToSessionResponse {\n\tnewSession: {\n\t\tid: string;\n\t\ttitle: string | null;\n\t\tagent: string;\n\t\tprovider: string;\n\t\tmodel: string;\n\t};\n\tinjectedContext: string;\n}\n\nclass ResearchApiClient {\n\tprivate get baseUrl(): string {\n\t\t// Check for runtime injected URL first\n\t\tconst win = window as Window & { OTTO_SERVER_URL?: string };\n\t\tif (win.OTTO_SERVER_URL) {\n\t\t\treturn win.OTTO_SERVER_URL;\n\t\t}\n\t\t// Check for Vite env var\n\t\tif (import.meta.env?.VITE_API_BASE_URL) {\n\t\t\treturn import.meta.env.VITE_API_BASE_URL;\n\t\t}\n\t\treturn API_BASE_URL;\n\t}\n\n\tasync listResearchSessions(\n\t\tparentSessionId: string,\n\t): Promise<ResearchSessionsResponse> {\n\t\tconst response = await fetch(\n\t\t\t`${this.baseUrl}/v1/sessions/${parentSessionId}/research`,\n\t\t\t{\n\t\t\t\tmethod: 'GET',\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t},\n\t\t);\n\n\t\tif (!response.ok) {\n\t\t\tconst error = await response\n\t\t\t\t.json()\n\t\t\t\t.catch(() => ({ error: 'Failed to fetch research sessions' }));\n\t\t\tthrow new Error(error.error || 'Failed to fetch research sessions');\n\t\t}\n\n\t\treturn response.json();\n\t}\n\n\tasync createResearchSession(\n\t\tparentSessionId: string,\n\t\tdata: { provider?: string; model?: string; title?: string },\n\t): Promise<CreateResearchResponse> {\n\t\tconst response = await fetch(\n\t\t\t`${this.baseUrl}/v1/sessions/${parentSessionId}/research`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\tbody: JSON.stringify(data),\n\t\t\t},\n\t\t);\n\n\t\tif (!response.ok) {\n\t\t\tconst error = await response\n\t\t\t\t.json()\n\t\t\t\t.catch(() => ({ error: 'Failed to create research session' }));\n\t\t\tthrow new Error(error.error || 'Failed to create research session');\n\t\t}\n\n\t\treturn response.json();\n\t}\n\n\tasync deleteResearchSession(\n\t\tresearchId: string,\n\t): Promise<{ success: boolean }> {\n\t\tconst response = await fetch(`${this.baseUrl}/v1/research/${researchId}`, {\n\t\t\tmethod: 'DELETE',\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst error = await response\n\t\t\t\t.json()\n\t\t\t\t.catch(() => ({ error: 'Failed to delete research session' }));\n\t\t\tthrow new Error(error.error || 'Failed to delete research session');\n\t\t}\n\n\t\treturn response.json();\n\t}\n\n\tasync injectContext(\n\t\tparentSessionId: string,\n\t\tresearchSessionId: string,\n\t\tlabel?: string,\n\t): Promise<InjectContextResponse> {\n\t\tconst response = await fetch(\n\t\t\t`${this.baseUrl}/v1/sessions/${parentSessionId}/inject`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\tbody: JSON.stringify({ researchSessionId, label }),\n\t\t\t},\n\t\t);\n\n\t\tif (!response.ok) {\n\t\t\tconst error = await response\n\t\t\t\t.json()\n\t\t\t\t.catch(() => ({ error: 'Failed to inject context' }));\n\t\t\tthrow new Error(error.error || 'Failed to inject context');\n\t\t}\n\n\t\treturn response.json();\n\t}\n\n\tasync exportToNewSession(\n\t\tresearchId: string,\n\t\tdata?: { provider?: string; model?: string; agent?: string },\n\t): Promise<ExportToSessionResponse> {\n\t\tconst response = await fetch(\n\t\t\t`${this.baseUrl}/v1/research/${researchId}/export`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\tbody: JSON.stringify(data ?? {}),\n\t\t\t},\n\t\t);\n\n\t\tif (!response.ok) {\n\t\t\tconst error = await response\n\t\t\t\t.json()\n\t\t\t\t.catch(() => ({ error: 'Failed to export to session' }));\n\t\t\tthrow new Error(error.error || 'Failed to export to session');\n\t\t}\n\n\t\treturn response.json();\n\t}\n}\n\nconst researchApi = new ResearchApiClient();\n\nexport function useResearchSessions(parentSessionId: string | null) {\n\treturn useQuery({\n\t\tqueryKey: ['research', 'sessions', parentSessionId],\n\t\tqueryFn: () => researchApi.listResearchSessions(parentSessionId as string),\n\t\tenabled: !!parentSessionId,\n\t\tstaleTime: 30000,\n\t});\n}\n\nexport function useCreateResearchSession() {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: ({\n\t\t\tparentSessionId,\n\t\t\tdata,\n\t\t}: {\n\t\t\tparentSessionId: string;\n\t\t\tdata?: { provider?: string; model?: string; title?: string };\n\t\t}) => researchApi.createResearchSession(parentSessionId, data ?? {}),\n\t\tonSuccess: (_, { parentSessionId }) => {\n\t\t\tqueryClient.invalidateQueries({\n\t\t\t\tqueryKey: ['research', 'sessions', parentSessionId],\n\t\t\t});\n\t\t},\n\t});\n}\n\nexport function useDeleteResearchSession() {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: (researchId: string) =>\n\t\t\tresearchApi.deleteResearchSession(researchId),\n\t\tonSuccess: () => {\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['research', 'sessions'] });\n\t\t},\n\t});\n}\n\nexport function useInjectContext() {\n\tconst addContext = usePendingResearchStore((state) => state.addContext);\n\n\treturn useMutation({\n\t\tmutationFn: ({\n\t\t\tparentSessionId,\n\t\t\tresearchSessionId,\n\t\t\tlabel,\n\t\t}: {\n\t\t\tparentSessionId: string;\n\t\t\tresearchSessionId: string;\n\t\t\tlabel?: string;\n\t\t}) => researchApi.injectContext(parentSessionId, researchSessionId, label),\n\t\tonSuccess: (data, { parentSessionId }) => {\n\t\t\taddContext(parentSessionId, {\n\t\t\t\tid: data.sessionId,\n\t\t\t\tsessionId: data.sessionId,\n\t\t\t\tlabel: data.label,\n\t\t\t\tcontent: data.content,\n\t\t\t});\n\t\t},\n\t});\n}\n\nexport function useExportToSession() {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: ({\n\t\t\tresearchId,\n\t\t\tdata,\n\t\t}: {\n\t\t\tresearchId: string;\n\t\t\tdata?: { provider?: string; model?: string; agent?: string };\n\t\t}) => researchApi.exportToNewSession(researchId, data),\n\t\tonSuccess: () => {\n\t\t\tqueryClient.invalidateQueries({ queryKey: sessionsQueryKey });\n\t\t},\n\t});\n}\n",
151
+ "import { memo } from 'react';\nimport { FlaskConical } from 'lucide-react';\nimport { useResearchStore } from '../../stores/researchStore';\nimport { useResearchSessions } from '../../hooks/useResearch';\n\ninterface ResearchSidebarToggleProps {\n\tparentSessionId?: string;\n}\n\nexport const ResearchSidebarToggle = memo(function ResearchSidebarToggle({\n\tparentSessionId,\n}: ResearchSidebarToggleProps) {\n\tconst isExpanded = useResearchStore((state) => state.isExpanded);\n\tconst toggleSidebar = useResearchStore((state) => state.toggleSidebar);\n\tconst { data } = useResearchSessions(parentSessionId ?? null);\n\n\tconst sessionCount = data?.sessions?.length ?? 0;\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={toggleSidebar}\n\t\t\tclassName={`relative h-14 w-full transition-colors touch-manipulation flex items-center justify-center border-r-2 ${\n\t\t\t\tisExpanded\n\t\t\t\t\t? 'bg-muted border-primary'\n\t\t\t\t\t: 'border-transparent hover:bg-muted/50'\n\t\t\t}`}\n\t\t\ttitle=\"Research (⌘⇧R)\"\n\t\t>\n\t\t\t<FlaskConical className=\"w-5 h-5 text-muted-foreground mx-auto\" />\n\t\t\t{sessionCount > 0 && (\n\t\t\t\t<span className=\"absolute top-1 right-1 w-5 h-5 bg-primary text-primary-foreground text-xs rounded-full flex items-center justify-center font-semibold\">\n\t\t\t\t\t{sessionCount > 9 ? '9+' : sessionCount}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</button>\n\t);\n});\n",
152
+ "import { memo, useState, useMemo, useCallback } from 'react';\nimport {\n\tSettings,\n\tChevronRight,\n\tWallet,\n\tCpu,\n\tZap,\n\tUser,\n\tChevronDown,\n\tRefreshCw,\n\tPlus,\n\tPencil,\n\tCopy,\n\tCheck,\n\tKey,\n\tLoader2,\n} from 'lucide-react';\nimport { QRCodeSVG } from 'qrcode.react';\nimport { Button } from '../ui/Button';\nimport { useSettingsStore } from '../../stores/settingsStore';\nimport { useOnboardingStore } from '../../stores/onboardingStore';\nimport { useAuthStatus } from '../../hooks/useAuthStatus';\nimport {\n\tuseConfig,\n\tuseAllModels,\n\tuseUpdateDefaults,\n} from '../../hooks/useConfig';\nimport { usePreferences } from '../../hooks/usePreferences';\nimport { useSetuStore } from '../../stores/setuStore';\nimport { SetuTopupModal } from './SetuTopupModal';\nimport { useSetuBalance } from '../../hooks/useSetuBalance';\nimport { useTopupCallback } from '../../hooks/useTopupCallback';\nimport { usePanelWidthStore } from '../../stores/panelWidthStore';\nimport { ResizeHandle } from '../ui/ResizeHandle';\nimport { apiClient } from '../../lib/api-client';\n\nconst SETTINGS_PANEL_KEY = 'settings';\nconst SETTINGS_DEFAULT_WIDTH = 320;\nconst SETTINGS_MIN_WIDTH = 320;\nconst SETTINGS_MAX_WIDTH = 500;\n\ninterface SettingsSectionProps {\n\ttitle: string;\n\ticon: React.ReactNode;\n\tchildren: React.ReactNode;\n\taction?: React.ReactNode;\n}\n\nconst SettingsSection = memo(function SettingsSection({\n\ttitle,\n\ticon,\n\tchildren,\n\taction,\n}: SettingsSectionProps) {\n\treturn (\n\t\t<div className=\"border-b border-border\">\n\t\t\t<div className=\"px-4 py-3 flex items-center gap-2 bg-muted/30\">\n\t\t\t\t{icon}\n\t\t\t\t<span className=\"text-sm font-medium flex-1\">{title}</span>\n\t\t\t\t{action}\n\t\t\t</div>\n\t\t\t<div className=\"px-4 py-3 space-y-3\">{children}</div>\n\t\t</div>\n\t);\n});\n\ninterface SettingRowProps {\n\tlabel: string;\n\tvalue: React.ReactNode;\n}\n\nconst SettingRow = memo(function SettingRow({ label, value }: SettingRowProps) {\n\treturn (\n\t\t<div className=\"flex items-center justify-between text-sm\">\n\t\t\t<span className=\"text-muted-foreground\">{label}</span>\n\t\t\t<span className=\"font-mono text-foreground\">{value}</span>\n\t\t</div>\n\t);\n});\n\ninterface ToggleRowProps {\n\tlabel: string;\n\tchecked: boolean;\n\tonChange: (checked: boolean) => void;\n}\n\nconst ToggleRow = memo(function ToggleRow({\n\tlabel,\n\tchecked,\n\tonChange,\n}: ToggleRowProps) {\n\treturn (\n\t\t<div className=\"flex items-center justify-between text-sm\">\n\t\t\t<span className=\"text-muted-foreground\">{label}</span>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\trole=\"switch\"\n\t\t\t\taria-checked={checked}\n\t\t\t\tonClick={() => onChange(!checked)}\n\t\t\t\tclassName={`relative inline-flex h-6 w-11 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 ${\n\t\t\t\t\tchecked ? 'bg-primary' : 'bg-muted'\n\t\t\t\t}`}\n\t\t\t>\n\t\t\t\t<span\n\t\t\t\t\tclassName={`inline-block h-4 w-4 transform rounded-full transition-transform ${\n\t\t\t\t\t\tchecked ? 'translate-x-6' : 'translate-x-1'\n\t\t\t\t\t} ${checked ? 'bg-primary-foreground' : 'bg-foreground'}`}\n\t\t\t\t/>\n\t\t\t</button>\n\t\t</div>\n\t);\n});\n\ninterface SelectRowProps {\n\tlabel: string;\n\tvalue: string;\n\toptions: Array<{ id: string; label: string }>;\n\tonChange: (value: string) => void;\n\tdisabled?: boolean;\n}\n\nconst SelectRow = memo(function SelectRow({\n\tlabel,\n\tvalue,\n\toptions,\n\tonChange,\n\tdisabled,\n}: SelectRowProps) {\n\tconst [isOpen, setIsOpen] = useState(false);\n\tconst selectedOption = options.find((o) => o.id === value);\n\n\treturn (\n\t\t<div className=\"flex items-center justify-between text-sm\">\n\t\t\t<span className=\"text-muted-foreground\">{label}</span>\n\t\t\t<div className=\"relative\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={() => !disabled && setIsOpen(!isOpen)}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tclassName=\"flex items-center gap-1 px-2 py-1 text-xs font-mono bg-muted hover:bg-muted/80 rounded border border-border disabled:opacity-50\"\n\t\t\t\t>\n\t\t\t\t\t<span className=\"max-w-[120px] truncate\">\n\t\t\t\t\t\t{selectedOption?.label || value || 'Select...'}\n\t\t\t\t\t</span>\n\t\t\t\t\t<ChevronDown className=\"w-3 h-3\" />\n\t\t\t\t</button>\n\t\t\t\t{isOpen && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{/* biome-ignore lint/a11y/noStaticElementInteractions: click-away backdrop pattern */}\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"fixed inset-0 z-40\"\n\t\t\t\t\t\t\tonClick={() => setIsOpen(false)}\n\t\t\t\t\t\t\trole=\"presentation\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div className=\"absolute right-0 top-full mt-1 z-50 min-w-[160px] max-h-[200px] overflow-y-auto bg-popover border border-border rounded-md shadow-lg\">\n\t\t\t\t\t\t\t{options.map((option) => (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={option.id}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\tonChange(option.id);\n\t\t\t\t\t\t\t\t\t\tsetIsOpen(false);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tclassName={`w-full px-3 py-2 text-left text-xs font-mono hover:bg-muted truncate ${\n\t\t\t\t\t\t\t\t\t\toption.id === value ? 'bg-muted/50' : ''\n\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n});\n\nexport const SettingsSidebar = memo(function SettingsSidebar() {\n\tconst isExpanded = useSettingsStore((state) => state.isExpanded);\n\tconst collapseSidebar = useSettingsStore((state) => state.collapseSidebar);\n\tconst panelWidth = usePanelWidthStore(\n\t\t(s) => s.widths[SETTINGS_PANEL_KEY] ?? SETTINGS_DEFAULT_WIDTH,\n\t);\n\n\tconst { data: config } = useConfig();\n\tconst { data: allModels } = useAllModels();\n\tconst { preferences, updatePreferences } = usePreferences();\n\tconst updateDefaults = useUpdateDefaults();\n\tconst setuBalance = useSetuStore((s) => s.balance);\n\tconst setuWallet = useSetuStore((s) => s.walletAddress);\n\tconst setuUsdcBalance = useSetuStore((s) => s.usdcBalance);\n\tconst setuLoading = useSetuStore((s) => s.isLoading);\n\tconst openTopupModal = useSetuStore((s) => s.openTopupModal);\n\n\t// Handle topup success callback from Polar checkout redirect\n\tuseTopupCallback();\n\n\tconst hasSetu = config?.providers?.includes('setu');\n\tconst { fetchBalance: refreshSetuBalance } = useSetuBalance(\n\t\thasSetu ? 'setu' : undefined,\n\t);\n\n\tconst setOnboardingOpen = useOnboardingStore((s) => s.setOpen);\n\tconst setStep = useOnboardingStore((s) => s.setStep);\n\tconst setManageMode = useOnboardingStore((s) => s.setManageMode);\n\tconst { fetchAuthStatus } = useAuthStatus();\n\n\tconst exportSetuPrivateKey = useCallback(async () => {\n\t\treturn await apiClient.exportSetuWallet();\n\t}, []);\n\n\tconst providerOptions = useMemo(() => {\n\t\tif (!config?.providers || !allModels) return [];\n\t\treturn config.providers\n\t\t\t.filter((p) => allModels[p])\n\t\t\t.map((p) => ({\n\t\t\t\tid: p,\n\t\t\t\tlabel: allModels[p]?.label || p,\n\t\t\t}));\n\t}, [config?.providers, allModels]);\n\n\tconst modelOptions = useMemo(() => {\n\t\tconst provider = config?.defaults?.provider;\n\t\tif (!provider || !allModels?.[provider]) return [];\n\t\treturn allModels[provider].models.map((m) => ({\n\t\t\tid: m.id,\n\t\t\tlabel: m.label,\n\t\t}));\n\t}, [config?.defaults?.provider, allModels]);\n\n\tconst agentOptions = useMemo(() => {\n\t\tif (!config?.agents) return [];\n\t\treturn config.agents.map((a) => ({ id: a, label: a }));\n\t}, [config?.agents]);\n\n\tif (!isExpanded) return null;\n\n\tconst handleProviderChange = (provider: string) => {\n\t\tconst firstModel = allModels?.[provider]?.models?.[0]?.id;\n\t\tupdateDefaults.mutate({\n\t\t\tprovider,\n\t\t\tmodel: firstModel || config?.defaults?.model,\n\t\t\tscope: 'global',\n\t\t});\n\t};\n\n\tconst handleModelChange = (model: string) => {\n\t\tupdateDefaults.mutate({ model, scope: 'global' });\n\t};\n\n\tconst handleAgentChange = (agent: string) => {\n\t\tupdateDefaults.mutate({ agent, scope: 'global' });\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"border-l border-border bg-background flex h-full relative\"\n\t\t\tstyle={{ width: panelWidth }}\n\t\t>\n\t\t\t<ResizeHandle\n\t\t\t\tpanelKey={SETTINGS_PANEL_KEY}\n\t\t\t\tside=\"right\"\n\t\t\t\tminWidth={SETTINGS_MIN_WIDTH}\n\t\t\t\tmaxWidth={SETTINGS_MAX_WIDTH}\n\t\t\t\tdefaultWidth={SETTINGS_DEFAULT_WIDTH}\n\t\t\t/>\n\t\t\t<div className=\"flex-1 flex flex-col h-full min-w-0\">\n\t\t\t\t<div className=\"h-14 border-b border-border px-3 flex items-center justify-between shrink-0\">\n\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t<Settings className=\"w-4 h-4\" />\n\t\t\t\t\t\t<span className=\"font-medium\">Settings</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<Button variant=\"ghost\" size=\"icon\" onClick={collapseSidebar}>\n\t\t\t\t\t\t<ChevronRight className=\"w-4 h-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"flex-1 overflow-y-auto\">\n\t\t\t\t\t<SettingsSection\n\t\t\t\t\t\ttitle=\"Default Model\"\n\t\t\t\t\t\ticon={<Cpu className=\"w-4 h-4 text-muted-foreground\" />}\n\t\t\t\t\t>\n\t\t\t\t\t\t<SelectRow\n\t\t\t\t\t\t\tlabel=\"Provider\"\n\t\t\t\t\t\t\tvalue={config?.defaults?.provider ?? ''}\n\t\t\t\t\t\t\toptions={providerOptions}\n\t\t\t\t\t\t\tonChange={handleProviderChange}\n\t\t\t\t\t\t\tdisabled={updateDefaults.isPending}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<SelectRow\n\t\t\t\t\t\t\tlabel=\"Model\"\n\t\t\t\t\t\t\tvalue={config?.defaults?.model ?? ''}\n\t\t\t\t\t\t\toptions={modelOptions}\n\t\t\t\t\t\t\tonChange={handleModelChange}\n\t\t\t\t\t\t\tdisabled={updateDefaults.isPending}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<SelectRow\n\t\t\t\t\t\t\tlabel=\"Agent\"\n\t\t\t\t\t\t\tvalue={config?.defaults?.agent ?? ''}\n\t\t\t\t\t\t\toptions={agentOptions}\n\t\t\t\t\t\t\tonChange={handleAgentChange}\n\t\t\t\t\t\t\tdisabled={updateDefaults.isPending}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</SettingsSection>\n\n\t\t\t\t\t<SettingsSection\n\t\t\t\t\t\ttitle=\"Preferences\"\n\t\t\t\t\t\ticon={<User className=\"w-4 h-4 text-muted-foreground\" />}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ToggleRow\n\t\t\t\t\t\t\tlabel=\"Vim Mode\"\n\t\t\t\t\t\t\tchecked={preferences.vimMode}\n\t\t\t\t\t\t\tonChange={(checked) => updatePreferences({ vimMode: checked })}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<ToggleRow\n\t\t\t\t\t\t\tlabel=\"Compact Thread\"\n\t\t\t\t\t\t\tchecked={preferences.compactThread}\n\t\t\t\t\t\t\tonChange={(checked) =>\n\t\t\t\t\t\t\t\tupdatePreferences({ compactThread: checked })\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<ToggleRow\n\t\t\t\t\t\t\tlabel=\"Show Reasoning\"\n\t\t\t\t\t\t\tchecked={config?.defaults?.reasoningText ?? true}\n\t\t\t\t\t\t\tonChange={(checked) =>\n\t\t\t\t\t\t\t\tupdateDefaults.mutate({\n\t\t\t\t\t\t\t\t\treasoningText: checked,\n\t\t\t\t\t\t\t\t\tscope: 'global',\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<SelectRow\n\t\t\t\t\t\t\tlabel=\"Tool Approval\"\n\t\t\t\t\t\t\tvalue={config?.defaults?.toolApproval ?? 'dangerous'}\n\t\t\t\t\t\t\toptions={[\n\t\t\t\t\t\t\t\t{ id: 'auto', label: 'Auto (no approval)' },\n\t\t\t\t\t\t\t\t{ id: 'dangerous', label: 'Dangerous only' },\n\t\t\t\t\t\t\t\t{ id: 'all', label: 'All tools' },\n\t\t\t\t\t\t\t]}\n\t\t\t\t\t\t\tonChange={(value) =>\n\t\t\t\t\t\t\t\tupdateDefaults.mutate({\n\t\t\t\t\t\t\t\t\ttoolApproval: value as 'auto' | 'dangerous' | 'all',\n\t\t\t\t\t\t\t\t\tscope: 'global',\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdisabled={updateDefaults.isPending}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<ToggleRow\n\t\t\t\t\t\t\tlabel=\"Guided Mode\"\n\t\t\t\t\t\t\tchecked={config?.defaults?.guidedMode ?? false}\n\t\t\t\t\t\t\tonChange={(checked) =>\n\t\t\t\t\t\t\t\tupdateDefaults.mutate({\n\t\t\t\t\t\t\t\t\tguidedMode: checked,\n\t\t\t\t\t\t\t\t\tscope: 'global',\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</SettingsSection>\n\n\t\t\t\t\t<SettingsSection\n\t\t\t\t\t\ttitle=\"Providers\"\n\t\t\t\t\t\ticon={<Zap className=\"w-4 h-4 text-muted-foreground\" />}\n\t\t\t\t\t\taction={\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\tfetchAuthStatus().then(() => {\n\t\t\t\t\t\t\t\t\t\tsetStep('wallet');\n\t\t\t\t\t\t\t\t\t\tsetManageMode(true);\n\t\t\t\t\t\t\t\t\t\tsetOnboardingOpen(true);\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tclassName=\"p-1 hover:bg-muted rounded transition-colors\"\n\t\t\t\t\t\t\t\ttitle=\"Manage providers\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Pencil className=\"w-3.5 h-3.5 text-muted-foreground\" />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"flex flex-wrap gap-2\">\n\t\t\t\t\t\t\t{config?.providers?.map((provider) => (\n\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\tkey={provider}\n\t\t\t\t\t\t\t\t\tclassName=\"px-2 py-1 text-xs bg-muted rounded-md font-mono\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{provider}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)) ?? <span className=\"text-muted-foreground text-sm\">None</span>}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</SettingsSection>\n\n\t\t\t\t\t{config?.providers?.includes('setu') && (\n\t\t\t\t\t\t<SetuWalletSection\n\t\t\t\t\t\t\tsetuWallet={setuWallet}\n\t\t\t\t\t\t\tsetuBalance={setuBalance}\n\t\t\t\t\t\t\tsetuUsdcBalance={setuUsdcBalance}\n\t\t\t\t\t\t\tsetuLoading={setuLoading}\n\t\t\t\t\t\t\trefreshSetuBalance={refreshSetuBalance}\n\t\t\t\t\t\t\topenTopupModal={openTopupModal}\n\t\t\t\t\t\t\tonExportPrivateKey={exportSetuPrivateKey}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<SetuTopupModal />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n});\n\nfunction SetuSubscriptionInfo() {\n\tconst subscription = useSetuStore((s) => s.subscription);\n\tconst payg = useSetuStore((s) => s.payg);\n\n\tif (!subscription?.active) return null;\n\n\tconst formatCredits = (value: number) => {\n\t\tif (value >= 10) return Math.floor(value).toString();\n\t\tif (value >= 1) return value.toFixed(1);\n\t\treturn value.toFixed(2);\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<SettingRow label=\"Plan\" value={subscription.tierName ?? 'GO'} />\n\t\t\t{subscription.creditsIncluded !== undefined &&\n\t\t\t\tsubscription.creditsUsed !== undefined && (\n\t\t\t\t\t<div className=\"space-y-1\">\n\t\t\t\t\t\t<SettingRow\n\t\t\t\t\t\t\tlabel=\"Used\"\n\t\t\t\t\t\t\tvalue={`${formatCredits(subscription.creditsUsed)} / ${formatCredits(subscription.creditsIncluded)}`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div className=\"w-full bg-muted rounded-full h-1.5\">\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName=\"bg-emerald-500 h-1.5 rounded-full transition-all\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\twidth: `${Math.min(100, (subscription.creditsUsed / subscription.creditsIncluded) * 100)}%`,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t{payg && payg.effectiveSpendableUsd > 0 && (\n\t\t\t\t<SettingRow\n\t\t\t\t\tlabel=\"PAYG Balance\"\n\t\t\t\t\tvalue={`$${payg.effectiveSpendableUsd.toFixed(2)}`}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{subscription.periodEnd && (\n\t\t\t\t<SettingRow\n\t\t\t\t\tlabel=\"Renews\"\n\t\t\t\t\tvalue={new Date(subscription.periodEnd)\n\t\t\t\t\t\t.toLocaleDateString('en-US', {\n\t\t\t\t\t\t\tmonth: 'short',\n\t\t\t\t\t\t\tday: 'numeric',\n\t\t\t\t\t\t\tyear: 'numeric',\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.replace(',', '')}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</>\n\t);\n}\n\ninterface SetuWalletSectionProps {\n\tsetuWallet: string | null;\n\tsetuBalance: number | null;\n\tsetuUsdcBalance: number | null;\n\tsetuLoading: boolean;\n\trefreshSetuBalance: () => void;\n\topenTopupModal: () => void;\n\tonExportPrivateKey: () => Promise<{\n\t\tsuccess: boolean;\n\t\tpublicKey: string;\n\t\tprivateKey: string;\n\t}>;\n}\n\nconst SetuWalletSection = memo(function SetuWalletSection({\n\tsetuWallet,\n\tsetuBalance,\n\tsetuUsdcBalance,\n\tsetuLoading,\n\trefreshSetuBalance,\n\topenTopupModal,\n\tonExportPrivateKey,\n}: SetuWalletSectionProps) {\n\tconst hasActiveSubscription = useSetuStore((s) => !!s.subscription?.active);\n\tconst [copied, setCopied] = useState(false);\n\tconst [isExportModalOpen, setIsExportModalOpen] = useState(false);\n\tconst [exportPrivateKey, setExportPrivateKey] = useState<string | null>(null);\n\tconst [isExportingPrivateKey, setIsExportingPrivateKey] = useState(false);\n\tconst [exportPrivateKeyError, setExportPrivateKeyError] = useState<\n\t\tstring | null\n\t>(null);\n\tconst [privateKeyCopied, setPrivateKeyCopied] = useState(false);\n\n\tconst handleCopy = useCallback(async () => {\n\t\tif (!setuWallet) return;\n\t\tawait navigator.clipboard.writeText(setuWallet);\n\t\tsetCopied(true);\n\t\tsetTimeout(() => setCopied(false), 2000);\n\t}, [setuWallet]);\n\n\tconst handleOpenExportPrivateKey = async () => {\n\t\tsetIsExportModalOpen(true);\n\t\tsetPrivateKeyCopied(false);\n\t\tsetExportPrivateKey(null);\n\t\tsetExportPrivateKeyError(null);\n\t\tsetIsExportingPrivateKey(true);\n\t\ttry {\n\t\t\tconst result = await onExportPrivateKey();\n\t\t\tsetExportPrivateKey(result.privateKey);\n\t\t} catch (err) {\n\t\t\tsetExportPrivateKeyError(\n\t\t\t\terr instanceof Error ? err.message : 'Failed to export private key',\n\t\t\t);\n\t\t} finally {\n\t\t\tsetIsExportingPrivateKey(false);\n\t\t}\n\t};\n\n\tconst handleCloseExportPrivateKey = () => {\n\t\tif (isExportingPrivateKey) return;\n\t\tsetIsExportModalOpen(false);\n\t\tsetPrivateKeyCopied(false);\n\t\tsetExportPrivateKey(null);\n\t\tsetExportPrivateKeyError(null);\n\t};\n\n\tconst handleCopyPrivateKey = async () => {\n\t\tif (!exportPrivateKey) return;\n\t\tawait navigator.clipboard.writeText(exportPrivateKey);\n\t\tsetPrivateKeyCopied(true);\n\t\tsetTimeout(() => setPrivateKeyCopied(false), 2000);\n\t};\n\n\tconst truncateWallet = (address: string | null) => {\n\t\tif (!address) return 'Not configured';\n\t\treturn `${address.slice(0, 4)}...${address.slice(-4)}`;\n\t};\n\n\tconst formatBalance = (balance: number | null) => {\n\t\tif (balance === null) return '—';\n\t\treturn `$${balance.toFixed(4)}`;\n\t};\n\n\tconst formatUsdcBalance = (balance: number | null) => {\n\t\tif (balance === null) return '—';\n\t\treturn `${balance.toFixed(2)} USDC`;\n\t};\n\n\tconst isLoaded = setuWallet !== null;\n\n\treturn (\n\t\t<SettingsSection\n\t\t\ttitle=\"Setu Credits\"\n\t\t\ticon={<Wallet className=\"w-4 h-4 text-muted-foreground\" />}\n\t\t\taction={\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={refreshSetuBalance}\n\t\t\t\t\tdisabled={setuLoading}\n\t\t\t\t\tclassName=\"p-1 hover:bg-muted rounded transition-colors disabled:opacity-50\"\n\t\t\t\t\ttitle=\"Refresh balances\"\n\t\t\t\t>\n\t\t\t\t\t<RefreshCw\n\t\t\t\t\t\tclassName={`w-3.5 h-3.5 text-muted-foreground ${setuLoading ? 'animate-spin' : ''}`}\n\t\t\t\t\t/>\n\t\t\t\t</button>\n\t\t\t}\n\t\t>\n\t\t\t{isLoaded ? (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"flex justify-center pb-3\">\n\t\t\t\t\t\t<div className=\"p-2 bg-white rounded-lg\">\n\t\t\t\t\t\t\t<QRCodeSVG\n\t\t\t\t\t\t\t\tvalue={setuWallet}\n\t\t\t\t\t\t\t\tsize={120}\n\t\t\t\t\t\t\t\tlevel=\"M\"\n\t\t\t\t\t\t\t\tincludeMargin={false}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex items-center justify-between text-sm\">\n\t\t\t\t\t\t<span className=\"text-muted-foreground\">Address</span>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={handleCopy}\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 font-mono text-foreground hover:text-muted-foreground transition-colors\"\n\t\t\t\t\t\t\ttitle=\"Copy address\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{truncateWallet(setuWallet)}\n\t\t\t\t\t\t\t{copied ? (\n\t\t\t\t\t\t\t\t<Check className=\"w-3 h-3 text-green-500\" />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<Copy className=\"w-3 h-3 text-muted-foreground\" />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<SetuSubscriptionInfo />\n\t\t\t\t\t{!hasActiveSubscription && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<SettingRow label=\"Balance\" value={formatBalance(setuBalance)} />\n\t\t\t\t\t\t\t<SettingRow\n\t\t\t\t\t\t\t\tlabel=\"USDC\"\n\t\t\t\t\t\t\t\tvalue={formatUsdcBalance(setuUsdcBalance)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<div className=\"flex justify-center pb-3\">\n\t\t\t\t\t\t<div className=\"w-[136px] h-[136px] bg-muted rounded-lg animate-pulse\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex items-center justify-between text-sm\">\n\t\t\t\t\t\t<span className=\"text-muted-foreground\">Address</span>\n\t\t\t\t\t\t<div className=\"w-24 h-4 bg-muted rounded animate-pulse\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex items-center justify-between text-sm\">\n\t\t\t\t\t\t<span className=\"text-muted-foreground\">Balance</span>\n\t\t\t\t\t\t<div className=\"w-16 h-4 bg-muted rounded animate-pulse\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex items-center justify-between text-sm\">\n\t\t\t\t\t\t<span className=\"text-muted-foreground\">USDC</span>\n\t\t\t\t\t\t<div className=\"w-20 h-4 bg-muted rounded animate-pulse\" />\n\t\t\t\t\t</div>\n\t\t\t\t</>\n\t\t\t)}\n\t\t\t<Button\n\t\t\t\tvariant=\"secondary\"\n\t\t\t\tsize=\"sm\"\n\t\t\t\tonClick={openTopupModal}\n\t\t\t\tclassName=\"w-full mt-2 gap-2\"\n\t\t\t>\n\t\t\t\t<Plus className=\"w-4 h-4\" />\n\t\t\t\tTop Up Balance\n\t\t\t</Button>\n\t\t\t<Button\n\t\t\t\tvariant=\"ghost\"\n\t\t\t\tsize=\"sm\"\n\t\t\t\tonClick={handleOpenExportPrivateKey}\n\t\t\t\tclassName=\"w-full gap-2\"\n\t\t\t>\n\t\t\t\t<Key className=\"w-4 h-4\" />\n\t\t\t\tExport Private Key\n\t\t\t</Button>\n\n\t\t\t{isExportModalOpen && (\n\t\t\t\t<div className=\"fixed inset-0 z-[9999] flex items-center justify-center bg-black/60 backdrop-blur-sm\">\n\t\t\t\t\t<div className=\"bg-background border border-border rounded-xl w-full max-w-lg mx-6 shadow-2xl\">\n\t\t\t\t\t\t<div className=\"flex items-center gap-3 p-6 border-b border-border\">\n\t\t\t\t\t\t\t<Key className=\"w-5 h-5 text-muted-foreground\" />\n\t\t\t\t\t\t\t<h3 className=\"text-lg font-semibold\">Export Setu Private Key</h3>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"p-6\">\n\t\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground mb-4\">\n\t\t\t\t\t\t\t\tKeep this private key secret. Anyone with this key can spend\n\t\t\t\t\t\t\t\tfunds from your Setu wallet.\n\t\t\t\t\t\t\t</p>\n\n\t\t\t\t\t\t\t{isExportingPrivateKey && (\n\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t<Loader2 className=\"w-4 h-4 animate-spin\" />\n\t\t\t\t\t\t\t\t\tExporting private key...\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{!isExportingPrivateKey && exportPrivateKey && (\n\t\t\t\t\t\t\t\t<div className=\"space-y-3\">\n\t\t\t\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\t\t\t\treadOnly\n\t\t\t\t\t\t\t\t\t\tvalue={exportPrivateKey}\n\t\t\t\t\t\t\t\t\t\tclassName=\"w-full min-h-[110px] px-4 py-3 bg-muted/50 border border-border rounded-lg text-foreground outline-none font-mono text-xs resize-y\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleCopyPrivateKey}\n\t\t\t\t\t\t\t\t\t\tclassName=\"w-full gap-2\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{privateKeyCopied ? (\n\t\t\t\t\t\t\t\t\t\t\t<Check className=\"w-4 h-4 text-green-500\" />\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<Copy className=\"w-4 h-4\" />\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{privateKeyCopied ? 'Copied' : 'Copy Private Key'}\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{!isExportingPrivateKey && exportPrivateKeyError && (\n\t\t\t\t\t\t\t\t<p className=\"text-sm text-red-500 mt-3\">\n\t\t\t\t\t\t\t\t\t{exportPrivateKeyError}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t<div className=\"flex gap-3 mt-5\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={handleCloseExportPrivateKey}\n\t\t\t\t\t\t\t\t\tdisabled={isExportingPrivateKey}\n\t\t\t\t\t\t\t\t\tclassName=\"flex-1 h-11 px-4 bg-transparent border border-border text-foreground rounded-lg font-medium hover:bg-muted/50 transition-colors disabled:opacity-50\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tClose\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</SettingsSection>\n\t);\n});\n",
153
+ "import { create } from 'zustand';\n\nexport type OnboardingStep = 'wallet' | 'defaults';\n\nexport interface ProviderInfo {\n\tconfigured: boolean;\n\ttype?: 'api' | 'oauth' | 'wallet';\n\tlabel: string;\n\tsupportsOAuth: boolean;\n\tsupportsToken?: boolean;\n\tsupportsGhImport?: boolean;\n\tmodelCount: number;\n\tcostRange?: { min: number; max: number };\n}\n\nexport interface AuthStatus {\n\tonboardingComplete: boolean;\n\tsetu: { configured: boolean; publicKey?: string };\n\tproviders: Record<string, ProviderInfo>;\n\tdefaults: {\n\t\tagent: string;\n\t\tprovider: string;\n\t\tmodel: string;\n\t\ttoolApproval?: 'auto' | 'dangerous' | 'all';\n\t};\n}\n\ninterface OnboardingState {\n\tisOpen: boolean;\n\tcurrentStep: OnboardingStep;\n\tmanageMode: boolean;\n\tisLoading: boolean;\n\terror: string | null;\n\tauthStatus: AuthStatus | null;\n\tsetOpen: (open: boolean) => void;\n\tsetStep: (step: OnboardingStep) => void;\n\tsetManageMode: (manageMode: boolean) => void;\n\tsetLoading: (loading: boolean) => void;\n\tsetError: (error: string | null) => void;\n\tsetAuthStatus: (status: AuthStatus | null) => void;\n\tnextStep: () => void;\n\tprevStep: () => void;\n\treset: () => void;\n}\n\nconst STEPS: OnboardingStep[] = ['wallet', 'defaults'];\n\nexport const useOnboardingStore = create<OnboardingState>((set, get) => ({\n\tisOpen: false,\n\tcurrentStep: 'wallet',\n\tmanageMode: false,\n\tisLoading: false,\n\terror: null,\n\tauthStatus: null,\n\tsetOpen: (isOpen) => set({ isOpen }),\n\tsetStep: (currentStep) => set({ currentStep }),\n\tsetManageMode: (manageMode) => set({ manageMode }),\n\tsetLoading: (isLoading) => set({ isLoading }),\n\tsetError: (error) => set({ error }),\n\tsetAuthStatus: (authStatus) => set({ authStatus }),\n\tnextStep: () => {\n\t\tconst { currentStep } = get();\n\t\tconst currentIndex = STEPS.indexOf(currentStep);\n\t\tif (currentIndex < STEPS.length - 1) {\n\t\t\tset({ currentStep: STEPS[currentIndex + 1] });\n\t\t}\n\t},\n\tprevStep: () => {\n\t\tconst { currentStep } = get();\n\t\tconst currentIndex = STEPS.indexOf(currentStep);\n\t\tif (currentIndex > 0) {\n\t\t\tset({ currentStep: STEPS[currentIndex - 1] });\n\t\t}\n\t},\n\treset: () =>\n\t\tset({\n\t\t\tisOpen: false,\n\t\t\tcurrentStep: 'wallet',\n\t\t\tmanageMode: false,\n\t\t\tisLoading: false,\n\t\t\terror: null,\n\t\t}),\n}));\n",
154
+ "import { useEffect, useCallback, useState, useRef } from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { apiClient } from '../lib/api-client';\nimport { useOnboardingStore } from '../stores/onboardingStore';\n\nconst isInIframe = typeof window !== 'undefined' && window.self !== window.top;\n\nexport function useAuthStatus() {\n\tconst setAuthStatus = useOnboardingStore((s) => s.setAuthStatus);\n\tconst setOpen = useOnboardingStore((s) => s.setOpen);\n\tconst setLoading = useOnboardingStore((s) => s.setLoading);\n\tconst setError = useOnboardingStore((s) => s.setError);\n\tconst authStatus = useOnboardingStore((s) => s.authStatus);\n\tconst isOpen = useOnboardingStore((s) => s.isOpen);\n\tconst queryClient = useQueryClient();\n\n\tconst [initialized, setInitialized] = useState(false);\n\tconst [oauthPolling, setOauthPolling] = useState(false);\n\tconst oauthPollingRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\tconst preOauthProvidersRef = useRef<Set<string>>(new Set());\n\n\tconst fetchAuthStatus = useCallback(async () => {\n\t\tsetLoading(true);\n\t\tsetError(null);\n\t\ttry {\n\t\t\tconst status = await apiClient.getAuthStatus();\n\t\t\tsetAuthStatus(status);\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['config'] });\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['models'] });\n\t\t\treturn status;\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : 'Failed to load';\n\t\t\tsetError(message);\n\t\t\treturn null;\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t}, [setAuthStatus, setLoading, setError, queryClient]);\n\n\tconst checkOnboarding = useCallback(async () => {\n\t\tconst status = await fetchAuthStatus();\n\t\tif (status) {\n\t\t\tconst hasAnyProvider = Object.values(status.providers).some(\n\t\t\t\t(p) => p.configured,\n\t\t\t);\n\t\t\tconst needsOnboarding =\n\t\t\t\t!status.onboardingComplete ||\n\t\t\t\t!hasAnyProvider ||\n\t\t\t\t!status.setu.configured;\n\t\t\tif (needsOnboarding) {\n\t\t\t\tsetOpen(true);\n\t\t\t}\n\t\t}\n\t\tsetInitialized(true);\n\t}, [fetchAuthStatus, setOpen]);\n\n\tconst setupWallet = useCallback(async () => {\n\t\tsetLoading(true);\n\t\tsetError(null);\n\t\ttry {\n\t\t\tconst result = await apiClient.setupSetuWallet();\n\t\t\tawait fetchAuthStatus();\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : 'Setup failed';\n\t\t\tsetError(message);\n\t\t\tthrow err;\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t}, [fetchAuthStatus, setLoading, setError]);\n\n\tconst importWallet = useCallback(\n\t\tasync (privateKey: string) => {\n\t\t\tsetLoading(true);\n\t\t\tsetError(null);\n\t\t\ttry {\n\t\t\t\tconst result = await apiClient.importSetuWallet(privateKey);\n\t\t\t\tawait fetchAuthStatus();\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tconst message = err instanceof Error ? err.message : 'Import failed';\n\t\t\t\tsetError(message);\n\t\t\t\tthrow err;\n\t\t\t} finally {\n\t\t\t\tsetLoading(false);\n\t\t\t}\n\t\t},\n\t\t[fetchAuthStatus, setLoading, setError],\n\t);\n\n\tconst addProvider = useCallback(\n\t\tasync (provider: string, apiKey: string) => {\n\t\t\tsetLoading(true);\n\t\t\tsetError(null);\n\t\t\ttry {\n\t\t\t\tconst result = await apiClient.addProvider(provider, apiKey);\n\t\t\t\tawait fetchAuthStatus();\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tconst message =\n\t\t\t\t\terr instanceof Error ? err.message : 'Failed to add provider';\n\t\t\t\tsetError(message);\n\t\t\t\tthrow err;\n\t\t\t} finally {\n\t\t\t\tsetLoading(false);\n\t\t\t}\n\t\t},\n\t\t[fetchAuthStatus, setLoading, setError],\n\t);\n\n\tconst removeProvider = useCallback(\n\t\tasync (provider: string) => {\n\t\t\tsetLoading(true);\n\t\t\tsetError(null);\n\t\t\ttry {\n\t\t\t\tconst result = await apiClient.removeProvider(provider);\n\t\t\t\tawait fetchAuthStatus();\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tconst message =\n\t\t\t\t\terr instanceof Error ? err.message : 'Failed to remove provider';\n\t\t\t\tsetError(message);\n\t\t\t\tthrow err;\n\t\t\t} finally {\n\t\t\t\tsetLoading(false);\n\t\t\t}\n\t\t},\n\t\t[fetchAuthStatus, setLoading, setError],\n\t);\n\n\tconst completeOnboarding = useCallback(async () => {\n\t\tsetLoading(true);\n\t\tsetError(null);\n\t\ttry {\n\t\t\tawait apiClient.completeOnboarding();\n\t\t\tawait fetchAuthStatus();\n\t\t\tsetOpen(false);\n\t\t} catch (err) {\n\t\t\tconst message =\n\t\t\t\terr instanceof Error ? err.message : 'Failed to complete onboarding';\n\t\t\tsetError(message);\n\t\t\tthrow err;\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t}, [fetchAuthStatus, setLoading, setError, setOpen]);\n\n\tconst snapshotConfiguredProviders = useCallback(() => {\n\t\tconst status = useOnboardingStore.getState().authStatus;\n\t\tif (status) {\n\t\t\tpreOauthProvidersRef.current = new Set(\n\t\t\t\tObject.entries(status.providers)\n\t\t\t\t\t.filter(([, p]) => p.configured)\n\t\t\t\t\t.map(([id]) => id),\n\t\t\t);\n\t\t}\n\t}, []);\n\n\tconst startOAuth = useCallback(\n\t\t(provider: string, mode?: string) => {\n\t\t\tconst url = apiClient.getOAuthStartUrl(provider, mode);\n\t\t\tif (isInIframe) {\n\t\t\t\tsnapshotConfiguredProviders();\n\t\t\t\twindow.parent.postMessage({ type: 'otto-open-url', url }, '*');\n\t\t\t\tsetOauthPolling(true);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst width = 600;\n\t\t\tconst height = 700;\n\t\t\tconst left = window.screenX + (window.outerWidth - width) / 2;\n\t\t\tconst top = window.screenY + (window.outerHeight - height) / 2;\n\t\t\tconst popup = window.open(\n\t\t\t\turl,\n\t\t\t\t'oauth_popup',\n\t\t\t\t`width=${width},height=${height},left=${left},top=${top},toolbar=no,menubar=no`,\n\t\t\t);\n\t\t\treturn popup;\n\t\t},\n\t\t[snapshotConfiguredProviders],\n\t);\n\n\tconst startOAuthManual = useCallback(\n\t\tasync (provider: string, mode?: string) => {\n\t\t\tconst { url, sessionId } = await apiClient.getOAuthUrl(provider, mode);\n\n\t\t\tif (isInIframe) {\n\t\t\t\tsnapshotConfiguredProviders();\n\t\t\t\twindow.parent.postMessage({ type: 'otto-open-url', url }, '*');\n\t\t\t\tsetOauthPolling(true);\n\t\t\t\treturn { popup: null, sessionId };\n\t\t\t}\n\n\t\t\tconst width = 600;\n\t\t\tconst height = 700;\n\t\t\tconst left = window.screenX + (window.outerWidth - width) / 2;\n\t\t\tconst top = window.screenY + (window.outerHeight - height) / 2;\n\t\t\tconst popup = window.open(\n\t\t\t\turl,\n\t\t\t\t'oauth_popup',\n\t\t\t\t`width=${width},height=${height},left=${left},top=${top},toolbar=no,menubar=no`,\n\t\t\t);\n\t\t\treturn { popup, sessionId };\n\t\t},\n\t\t[snapshotConfiguredProviders],\n\t);\n\n\tconst exchangeOAuthCode = useCallback(\n\t\tasync (provider: string, code: string, sessionId: string) => {\n\t\t\tsetLoading(true);\n\t\t\tsetError(null);\n\t\t\ttry {\n\t\t\t\tawait apiClient.exchangeOAuthCode(provider, code, sessionId);\n\t\t\t\tawait fetchAuthStatus();\n\t\t\t\treturn true;\n\t\t\t} catch (err) {\n\t\t\t\tconst message =\n\t\t\t\t\terr instanceof Error ? err.message : 'Failed to exchange code';\n\t\t\t\tsetError(message);\n\t\t\t\tthrow err;\n\t\t\t} finally {\n\t\t\t\tsetLoading(false);\n\t\t\t}\n\t\t},\n\t\t[fetchAuthStatus, setLoading, setError],\n\t);\n\n\tuseEffect(() => {\n\t\tif (!oauthPolling || !isInIframe) return;\n\t\toauthPollingRef.current = setInterval(() => {\n\t\t\tfetchAuthStatus();\n\t\t}, 3000);\n\t\tconst timeout = setTimeout(() => {\n\t\t\tsetOauthPolling(false);\n\t\t}, 300000);\n\t\treturn () => {\n\t\t\tclearInterval(oauthPollingRef.current);\n\t\t\tclearTimeout(timeout);\n\t\t};\n\t}, [oauthPolling, fetchAuthStatus]);\n\n\tuseEffect(() => {\n\t\tif (!oauthPolling || !authStatus) return;\n\t\tconst currentConfigured = Object.entries(authStatus.providers).filter(\n\t\t\t([, p]) => p.configured,\n\t\t);\n\t\tconst hasNewProvider = currentConfigured.some(\n\t\t\t([id]) => !preOauthProvidersRef.current.has(id),\n\t\t);\n\t\tif (hasNewProvider) {\n\t\t\tsetOauthPolling(false);\n\t\t}\n\t}, [authStatus, oauthPolling]);\n\n\tuseEffect(() => {\n\t\tconst handleOAuthMessage = (event: MessageEvent) => {\n\t\t\tif (event.data?.type === 'oauth-success') {\n\t\t\t\tfetchAuthStatus();\n\t\t\t}\n\t\t};\n\n\t\twindow.addEventListener('message', handleOAuthMessage);\n\t\treturn () => window.removeEventListener('message', handleOAuthMessage);\n\t}, [fetchAuthStatus]);\n\n\tconst pollCopilotDeviceFlow = useCallback(\n\t\tasync (sessionId: string) => {\n\t\t\tconst result = await apiClient.pollCopilotDeviceFlow(sessionId);\n\t\t\tif (result.status === 'complete') {\n\t\t\t\tawait fetchAuthStatus();\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\t[fetchAuthStatus],\n\t);\n\n\tconst saveCopilotToken = useCallback(\n\t\tasync (token: string) => {\n\t\t\tsetLoading(true);\n\t\t\tsetError(null);\n\t\t\ttry {\n\t\t\t\tconst result = await apiClient.saveCopilotToken(token);\n\t\t\t\tawait fetchAuthStatus();\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tconst message =\n\t\t\t\t\terr instanceof Error ? err.message : 'Failed to save Copilot token';\n\t\t\t\tsetError(message);\n\t\t\t\tthrow err;\n\t\t\t} finally {\n\t\t\t\tsetLoading(false);\n\t\t\t}\n\t\t},\n\t\t[fetchAuthStatus, setLoading, setError],\n\t);\n\n\tconst importCopilotTokenFromGh = useCallback(async () => {\n\t\tsetLoading(true);\n\t\tsetError(null);\n\t\ttry {\n\t\t\tconst result = await apiClient.importCopilotTokenFromGh();\n\t\t\tawait fetchAuthStatus();\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tconst message =\n\t\t\t\terr instanceof Error\n\t\t\t\t\t? err.message\n\t\t\t\t\t: 'Failed to import Copilot token from GH';\n\t\t\tsetError(message);\n\t\t\tthrow err;\n\t\t} finally {\n\t\t\tsetLoading(false);\n\t\t}\n\t}, [fetchAuthStatus, setLoading, setError]);\n\n\treturn {\n\t\tauthStatus,\n\t\tisOpen,\n\t\tinitialized,\n\t\tfetchAuthStatus,\n\t\tcheckOnboarding,\n\t\tsetupWallet,\n\t\timportWallet,\n\t\taddProvider,\n\t\tremoveProvider,\n\t\tcompleteOnboarding,\n\t\tstartOAuth,\n\t\tstartOAuthManual,\n\t\texchangeOAuthCode,\n\t\tstartCopilotDeviceFlow: apiClient.startCopilotDeviceFlow.bind(apiClient),\n\t\tpollCopilotDeviceFlow,\n\t\tgetCopilotAuthMethods: apiClient.getCopilotAuthMethods.bind(apiClient),\n\t\tsaveCopilotToken,\n\t\timportCopilotTokenFromGh,\n\t\tgetCopilotDiagnostics: apiClient.getCopilotDiagnostics.bind(apiClient),\n\t};\n}\n",
155
+ "import { useEffect, useRef } from 'react';\nimport { useToastStore, toast } from '../stores/toastStore';\nimport { useSetuStore } from '../stores/setuStore';\nimport { apiClient } from '../lib/api-client';\n\nconst STORAGE_KEY = 'pendingPolarCheckout';\n\nexport function useTopupCallback() {\n\tconst hasHandled = useRef(false);\n\tconst loadingToastId = useRef<string | null>(null);\n\tconst setBalance = useSetuStore((s) => s.setBalance);\n\tconst removeToast = useToastStore((s) => s.removeToast);\n\n\tuseEffect(() => {\n\t\tif (hasHandled.current) return;\n\n\t\tconst params = new URLSearchParams(window.location.search);\n\t\tconst topupStatus = params.get('topup');\n\n\t\tconst pendingCheckoutId = localStorage.getItem(STORAGE_KEY);\n\n\t\tif (topupStatus === 'pending' || pendingCheckoutId) {\n\t\t\thasHandled.current = true;\n\n\t\t\tconst url = new URL(window.location.href);\n\t\t\turl.searchParams.delete('topup');\n\t\t\twindow.history.replaceState({}, '', url.toString());\n\n\t\t\tif (!pendingCheckoutId) {\n\t\t\t\ttoast.info('Checking top-up status...');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tloadingToastId.current = toast.loading('Verifying top-up...');\n\n\t\t\tlet attempts = 0;\n\t\t\tconst maxAttempts = 10;\n\t\t\tconst delayMs = 2000;\n\n\t\t\tconst dismissLoading = () => {\n\t\t\t\tif (loadingToastId.current) {\n\t\t\t\t\tremoveToast(loadingToastId.current);\n\t\t\t\t\tloadingToastId.current = null;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst checkStatus = async () => {\n\t\t\t\tattempts++;\n\t\t\t\ttry {\n\t\t\t\t\tconst status = await apiClient.getPolarTopupStatus(pendingCheckoutId);\n\n\t\t\t\t\tif (status?.confirmed) {\n\t\t\t\t\t\tlocalStorage.removeItem(STORAGE_KEY);\n\t\t\t\t\t\tdismissLoading();\n\n\t\t\t\t\t\tconst balanceData = await apiClient.getSetuBalance();\n\t\t\t\t\t\tif (balanceData?.balance !== undefined) {\n\t\t\t\t\t\t\tsetBalance(balanceData.balance);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttoast.success(\n\t\t\t\t\t\t\t`Top-up confirmed! +$${status.amountUsd?.toFixed(2)} credited`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (attempts < maxAttempts) {\n\t\t\t\t\t\tsetTimeout(checkStatus, delayMs);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlocalStorage.removeItem(STORAGE_KEY);\n\t\t\t\t\t\tdismissLoading();\n\t\t\t\t\t\ttoast.info(\n\t\t\t\t\t\t\t'Top-up is still processing. Balance will update automatically.',\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\tif (attempts < maxAttempts) {\n\t\t\t\t\t\tsetTimeout(checkStatus, delayMs);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlocalStorage.removeItem(STORAGE_KEY);\n\t\t\t\t\t\tdismissLoading();\n\t\t\t\t\t\ttoast.error('Could not verify top-up. Please check your balance.');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tsetTimeout(checkStatus, 1500);\n\t\t}\n\t}, [setBalance, removeToast]);\n}\n",
156
+ "import { memo } from 'react';\nimport { Settings } from 'lucide-react';\nimport { useSettingsStore } from '../../stores/settingsStore';\n\nexport const SettingsSidebarToggle = memo(function SettingsSidebarToggle() {\n\tconst isExpanded = useSettingsStore((state) => state.isExpanded);\n\tconst toggleSidebar = useSettingsStore((state) => state.toggleSidebar);\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={toggleSidebar}\n\t\t\tclassName={`relative h-14 w-full transition-colors touch-manipulation flex items-center justify-center border-r-2 ${\n\t\t\t\tisExpanded\n\t\t\t\t\t? 'bg-muted border-primary'\n\t\t\t\t\t: 'border-transparent hover:bg-muted/50'\n\t\t\t}`}\n\t\t\ttitle=\"Settings\"\n\t\t>\n\t\t\t<Settings className=\"w-5 h-5 text-muted-foreground mx-auto\" />\n\t\t</button>\n\t);\n});\n",
157
+ "import { memo, useState } from 'react';\nimport {\n\tGlobe,\n\tChevronRight,\n\tLoader2,\n\tAlertCircle,\n\tCopy,\n\tCheck,\n\tExternalLink,\n\tClock,\n} from 'lucide-react';\nimport { QRCodeSVG } from 'qrcode.react';\nimport { Button } from '../ui/Button';\nimport { useTunnelStore } from '../../stores/tunnelStore';\nimport {\n\tuseStartTunnel,\n\tuseStopTunnel,\n\tuseTunnelStream,\n\tuseTunnelStatus,\n} from '../../hooks/useTunnel';\nimport { openUrl } from '../../lib/open-url';\n\nfunction truncateUrl(url: string): string {\n\ttry {\n\t\tconst parsed = new URL(url);\n\t\tconst host = parsed.hostname;\n\t\tif (host.length > 24) {\n\t\t\treturn `${host.slice(0, 12)}...${host.slice(-8)}`;\n\t\t}\n\t\treturn host;\n\t} catch {\n\t\treturn url.length > 24 ? `${url.slice(0, 12)}...${url.slice(-8)}` : url;\n\t}\n}\n\nexport const TunnelSidebar = memo(function TunnelSidebar() {\n\tconst isExpanded = useTunnelStore((s) => s.isExpanded);\n\tconst collapseSidebar = useTunnelStore((s) => s.collapseSidebar);\n\tconst status = useTunnelStore((s) => s.status);\n\tconst url = useTunnelStore((s) => s.url);\n\tconst error = useTunnelStore((s) => s.error);\n\tconst progress = useTunnelStore((s) => s.progress);\n\n\tconst startTunnel = useStartTunnel();\n\tconst stopTunnel = useStopTunnel();\n\tconst [copied, setCopied] = useState(false);\n\n\tuseTunnelStatus();\n\tuseTunnelStream();\n\n\tconst handleCopyUrl = async () => {\n\t\tif (url) {\n\t\t\tawait navigator.clipboard.writeText(url);\n\t\t\tsetCopied(true);\n\t\t\tsetTimeout(() => setCopied(false), 2000);\n\t\t}\n\t};\n\n\tconst handleStart = () => {\n\t\tstartTunnel.mutate();\n\t};\n\n\tconst handleStop = () => {\n\t\tstopTunnel.mutate();\n\t};\n\n\tif (!isExpanded) return null;\n\n\treturn (\n\t\t<div className=\"w-80 border-l border-border bg-background flex flex-col h-full\">\n\t\t\t<div className=\"h-14 flex items-center justify-between px-3 border-b border-border\">\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<Globe className=\"w-4 h-4 text-muted-foreground\" />\n\t\t\t\t\t<span className=\"font-medium text-sm\">Remote Access</span>\n\t\t\t\t</div>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tonClick={collapseSidebar}\n\t\t\t\t\ttitle=\"Close sidebar\"\n\t\t\t\t>\n\t\t\t\t\t<ChevronRight className=\"w-4 h-4\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\n\t\t\t<div className=\"flex-1 overflow-y-auto p-4\">\n\t\t\t\t{status === 'idle' && (\n\t\t\t\t\t<div className=\"flex flex-col items-center justify-center h-full text-center\">\n\t\t\t\t\t\t<Globe className=\"w-12 h-12 text-muted-foreground/30 mb-4\" />\n\t\t\t\t\t\t<h3 className=\"text-sm font-medium mb-2\">Access from anywhere</h3>\n\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground mb-6 max-w-[200px]\">\n\t\t\t\t\t\t\tStart a secure tunnel to access otto from your phone or another\n\t\t\t\t\t\t\tdevice.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={handleStart}\n\t\t\t\t\t\t\tdisabled={startTunnel.isPending}\n\t\t\t\t\t\t\tclassName=\"px-4 py-2 bg-primary text-primary-foreground rounded-md text-sm font-medium hover:bg-primary/90 transition-colors disabled:opacity-50\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{startTunnel.isPending ? 'Starting...' : 'Start Tunnel'}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{status === 'starting' && (\n\t\t\t\t\t<div className=\"flex flex-col items-center justify-center h-full text-center\">\n\t\t\t\t\t\t<Loader2 className=\"w-8 h-8 text-primary animate-spin mb-4\" />\n\t\t\t\t\t\t<h3 className=\"text-sm font-medium mb-2\">Setting up...</h3>\n\t\t\t\t\t\t{progress && (\n\t\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground max-w-[220px] break-words\">\n\t\t\t\t\t\t\t\t{progress}\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{status === 'connected' && url && (\n\t\t\t\t\t<div className=\"flex flex-col\">\n\t\t\t\t\t\t<div className=\"flex items-center gap-2 mb-4\">\n\t\t\t\t\t\t\t<div className=\"w-2 h-2 rounded-full bg-green-500 animate-pulse\" />\n\t\t\t\t\t\t\t<span className=\"text-xs font-medium text-green-600\">\n\t\t\t\t\t\t\t\tConnected\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div className=\"flex justify-center pb-4\">\n\t\t\t\t\t\t\t<div className=\"p-3 bg-white rounded-lg\">\n\t\t\t\t\t\t\t\t<QRCodeSVG\n\t\t\t\t\t\t\t\t\tvalue={url}\n\t\t\t\t\t\t\t\t\tsize={160}\n\t\t\t\t\t\t\t\t\tlevel=\"M\"\n\t\t\t\t\t\t\t\t\tincludeMargin={false}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground mb-4 text-center\">\n\t\t\t\t\t\t\tScan with your phone camera\n\t\t\t\t\t\t</p>\n\n\t\t\t\t\t\t<div className=\"flex items-center justify-between text-sm mb-4\">\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">URL</span>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={handleCopyUrl}\n\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 font-mono text-foreground hover:text-muted-foreground transition-colors\"\n\t\t\t\t\t\t\t\ttitle=\"Copy URL\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{truncateUrl(url)}\n\t\t\t\t\t\t\t\t{copied ? (\n\t\t\t\t\t\t\t\t\t<Check className=\"w-3 h-3 text-green-500\" />\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<Copy className=\"w-3 h-3 text-muted-foreground\" />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => openUrl(url)}\n\t\t\t\t\t\t\tclassName=\"flex items-center justify-center gap-2 px-4 py-2 border border-border rounded-md text-sm hover:bg-muted transition-colors mb-3\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ExternalLink className=\"w-3.5 h-3.5\" />\n\t\t\t\t\t\t\tOpen in browser\n\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={handleStop}\n\t\t\t\t\t\t\tdisabled={stopTunnel.isPending}\n\t\t\t\t\t\t\tclassName=\"w-full px-4 py-2 text-sm text-muted-foreground hover:text-foreground transition-colors\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{stopTunnel.isPending ? 'Stopping...' : 'Stop Tunnel'}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t{status === 'error' && (\n\t\t\t\t\t<div className=\"flex flex-col items-center justify-center h-full text-center\">\n\t\t\t\t\t\t{error?.includes('Rate limited') ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<Clock className=\"w-8 h-8 text-yellow-500 mb-4\" />\n\t\t\t\t\t\t\t\t<h3 className=\"text-sm font-medium mb-2\">Rate Limited</h3>\n\t\t\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground mb-6 max-w-[220px]\">\n\t\t\t\t\t\t\t\t\tCloudflare limits anonymous tunnel requests. Please wait 5-10\n\t\t\t\t\t\t\t\t\tminutes before trying again.\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<AlertCircle className=\"w-8 h-8 text-destructive mb-4\" />\n\t\t\t\t\t\t\t\t<h3 className=\"text-sm font-medium mb-2\">Connection failed</h3>\n\t\t\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground mb-6 max-w-[200px]\">\n\t\t\t\t\t\t\t\t\t{error || 'Unable to establish tunnel connection.'}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={handleStart}\n\t\t\t\t\t\t\tdisabled={\n\t\t\t\t\t\t\t\tstartTunnel.isPending || error?.includes('Rate limited')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tclassName=\"px-4 py-2 bg-primary text-primary-foreground rounded-md text-sm font-medium hover:bg-primary/90 transition-colors disabled:opacity-50\"\n\t\t\t\t\t\t\ttitle={\n\t\t\t\t\t\t\t\terror?.includes('Rate limited')\n\t\t\t\t\t\t\t\t\t? 'Wait 5-10 minutes'\n\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{error?.includes('Rate limited')\n\t\t\t\t\t\t\t\t? 'Wait & Try Again'\n\t\t\t\t\t\t\t\t: 'Try Again'}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n});\n",
158
+ "import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useEffect, useCallback, useRef } from 'react';\nimport { useTunnelStore } from '../stores/tunnelStore';\nimport { API_BASE_URL } from '../lib/config';\n\ninterface TunnelStatusResponse {\n\tstatus: 'idle' | 'starting' | 'connected' | 'error';\n\turl: string | null;\n\terror: string | null;\n\tbinaryInstalled: boolean;\n\tisRunning: boolean;\n}\n\ninterface TunnelStartResponse {\n\tok: boolean;\n\turl?: string;\n\tmessage?: string;\n\terror?: string;\n}\n\ninterface TunnelQrResponse {\n\tok: boolean;\n\turl?: string;\n\tqrCode?: string;\n\terror?: string;\n}\n\nasync function fetchTunnelStatus(): Promise<TunnelStatusResponse> {\n\tconst response = await fetch(`${API_BASE_URL}/v1/tunnel/status`);\n\tif (!response.ok) {\n\t\tthrow new Error('Failed to fetch tunnel status');\n\t}\n\treturn response.json();\n}\n\nasync function startTunnel(): Promise<TunnelStartResponse> {\n\t// Server uses its own port automatically - no need to pass it\n\tconst response = await fetch(`${API_BASE_URL}/v1/tunnel/start`, {\n\t\tmethod: 'POST',\n\t\theaders: { 'Content-Type': 'application/json' },\n\t\tbody: JSON.stringify({}),\n\t});\n\treturn response.json();\n}\n\nasync function stopTunnel(): Promise<{\n\tok: boolean;\n\tmessage?: string;\n\terror?: string;\n}> {\n\tconst response = await fetch(`${API_BASE_URL}/v1/tunnel/stop`, {\n\t\tmethod: 'POST',\n\t});\n\treturn response.json();\n}\n\nasync function fetchTunnelQr(): Promise<TunnelQrResponse> {\n\tconst response = await fetch(`${API_BASE_URL}/v1/tunnel/qr`);\n\treturn response.json();\n}\n\nexport function useTunnelStatus() {\n\tconst setStatus = useTunnelStore((s) => s.setStatus);\n\tconst setUrl = useTunnelStore((s) => s.setUrl);\n\tconst setError = useTunnelStore((s) => s.setError);\n\n\tconst query = useQuery<TunnelStatusResponse>({\n\t\tqueryKey: ['tunnel', 'status'],\n\t\tqueryFn: fetchTunnelStatus,\n\t\trefetchInterval: 3000,\n\t});\n\n\tuseEffect(() => {\n\t\tif (query.data) {\n\t\t\tsetStatus(query.data.status);\n\t\t\tsetUrl(query.data.url);\n\t\t\tsetError(query.data.error);\n\t\t}\n\t}, [query.data, setStatus, setUrl, setError]);\n\n\treturn query;\n}\n\nexport function useStartTunnel() {\n\tconst queryClient = useQueryClient();\n\tconst setStatus = useTunnelStore((s) => s.setStatus);\n\tconst setUrl = useTunnelStore((s) => s.setUrl);\n\tconst setError = useTunnelStore((s) => s.setError);\n\tconst setProgress = useTunnelStore((s) => s.setProgress);\n\n\treturn useMutation<TunnelStartResponse, Error, void>({\n\t\tmutationFn: () => startTunnel(),\n\t\tonMutate: () => {\n\t\t\tsetStatus('starting');\n\t\t\tsetProgress('Connecting...');\n\t\t\tsetError(null);\n\t\t},\n\t\tonSuccess: (data) => {\n\t\t\tif (data.ok && data.url) {\n\t\t\t\tsetStatus('connected');\n\t\t\t\tsetUrl(data.url);\n\t\t\t\tsetProgress(null);\n\t\t\t} else if (!data.ok) {\n\t\t\t\tsetStatus('error');\n\t\t\t\tsetError(data.error || 'Failed to start tunnel');\n\t\t\t\tsetProgress(null);\n\t\t\t}\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['tunnel'] });\n\t\t},\n\t\tonError: (error) => {\n\t\t\tsetStatus('error');\n\t\t\tsetError(error.message);\n\t\t\tsetProgress(null);\n\t\t},\n\t});\n}\n\nexport function useStopTunnel() {\n\tconst queryClient = useQueryClient();\n\tconst reset = useTunnelStore((s) => s.reset);\n\n\treturn useMutation({\n\t\tmutationFn: stopTunnel,\n\t\tonSuccess: () => {\n\t\t\treset();\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['tunnel'] });\n\t\t},\n\t});\n}\n\nexport function useTunnelQr() {\n\tconst url = useTunnelStore((s) => s.url);\n\tconst setQrCode = useTunnelStore((s) => s.setQrCode);\n\n\tconst query = useQuery<TunnelQrResponse>({\n\t\tqueryKey: ['tunnel', 'qr', url],\n\t\tqueryFn: fetchTunnelQr,\n\t\tenabled: !!url,\n\t});\n\n\tuseEffect(() => {\n\t\tif (query.data?.ok && query.data.qrCode) {\n\t\t\tsetQrCode(query.data.qrCode);\n\t\t}\n\t}, [query.data, setQrCode]);\n\n\treturn query;\n}\n\nexport function useTunnelStream() {\n\tconst setStatus = useTunnelStore((s) => s.setStatus);\n\tconst setUrl = useTunnelStore((s) => s.setUrl);\n\tconst setError = useTunnelStore((s) => s.setError);\n\tconst setProgress = useTunnelStore((s) => s.setProgress);\n\tconst isExpanded = useTunnelStore((s) => s.isExpanded);\n\tconst eventSourceRef = useRef<EventSource | null>(null);\n\n\tconst connect = useCallback(() => {\n\t\tif (eventSourceRef.current) {\n\t\t\teventSourceRef.current.close();\n\t\t}\n\n\t\tconst es = new EventSource(`${API_BASE_URL}/v1/tunnel/stream`);\n\t\teventSourceRef.current = es;\n\n\t\tes.onmessage = (event) => {\n\t\t\ttry {\n\t\t\t\tconst data = JSON.parse(event.data);\n\t\t\t\tif (data.type === 'status') {\n\t\t\t\t\tsetStatus(data.status);\n\t\t\t\t\tsetUrl(data.url);\n\t\t\t\t\tsetError(data.error);\n\t\t\t\t\tsetProgress(data.progress);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// ignore parse errors\n\t\t\t}\n\t\t};\n\n\t\tes.onerror = () => {\n\t\t\tes.close();\n\t\t\teventSourceRef.current = null;\n\t\t};\n\n\t\treturn () => {\n\t\t\tes.close();\n\t\t\teventSourceRef.current = null;\n\t\t};\n\t}, [setStatus, setUrl, setError, setProgress]);\n\n\tuseEffect(() => {\n\t\tif (isExpanded) {\n\t\t\tconst cleanup = connect();\n\t\t\treturn cleanup;\n\t\t}\n\t\treturn () => {\n\t\t\tif (eventSourceRef.current) {\n\t\t\t\teventSourceRef.current.close();\n\t\t\t\teventSourceRef.current = null;\n\t\t\t}\n\t\t};\n\t}, [isExpanded, connect]);\n\n\treturn { connect };\n}\n",
159
+ "import { memo } from 'react';\nimport { Globe } from 'lucide-react';\nimport { useTunnelStore } from '../../stores/tunnelStore';\n\nexport const TunnelSidebarToggle = memo(function TunnelSidebarToggle() {\n\tconst isExpanded = useTunnelStore((state) => state.isExpanded);\n\tconst toggleSidebar = useTunnelStore((state) => state.toggleSidebar);\n\tconst status = useTunnelStore((state) => state.status);\n\n\tconst isConnected = status === 'connected';\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={toggleSidebar}\n\t\t\tclassName={`relative h-14 w-full transition-colors touch-manipulation flex items-center justify-center border-r-2 ${\n\t\t\t\tisExpanded\n\t\t\t\t\t? 'bg-muted border-primary'\n\t\t\t\t\t: 'border-transparent hover:bg-muted/50'\n\t\t\t}`}\n\t\t\ttitle=\"Remote Access\"\n\t\t>\n\t\t\t<Globe className=\"w-5 h-5 text-muted-foreground mx-auto\" />\n\t\t\t{isConnected && (\n\t\t\t\t<span className=\"absolute top-2 right-2 w-2 h-2 bg-green-500 rounded-full animate-pulse\" />\n\t\t\t)}\n\t\t</button>\n\t);\n});\n",
160
+ "import { memo, useState, useCallback, useMemo, useEffect, useRef } from 'react';\nimport {\n\tChevronDown,\n\tChevronRight,\n\tClipboardCopy,\n\tExternalLink,\n\tFolderDot,\n\tGlobe,\n\tLaptop,\n\tLoader2,\n\tLock,\n\tPlug,\n\tPlus,\n\tTrash2,\n\tWrench,\n} from 'lucide-react';\nimport { Button } from '../ui/Button';\nimport { Modal } from '../ui/Modal';\nimport { useMCPStore, type MCPServerInfo } from '../../stores/mcpStore';\nimport { useQueryClient } from '@tanstack/react-query';\nimport {\n\tuseMCPServers,\n\tuseStartMCPServer,\n\tuseStopMCPServer,\n\tuseRemoveMCPServer,\n\tuseAuthenticateMCPServer,\n\tuseMCPAuthStatus,\n\tuseCopilotDevicePoller,\n} from '../../hooks/useMCP';\nimport { openUrl } from '../../lib/open-url';\nimport { AddMCPServerModal } from './AddMCPServerModal';\n\nconst ToggleSwitch = memo(function ToggleSwitch({\n\tchecked,\n\tloading,\n\tonChange,\n\tdisabled,\n}: {\n\tchecked: boolean;\n\tloading: boolean;\n\tonChange: () => void;\n\tdisabled?: boolean;\n}) {\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\trole=\"switch\"\n\t\t\taria-checked={checked}\n\t\t\tdisabled={disabled || loading}\n\t\t\tonClick={(e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\tonChange();\n\t\t\t}}\n\t\t\tclassName={`relative inline-flex h-5 w-9 flex-shrink-0 items-center rounded-full transition-colors duration-200 focus-visible:outline-none disabled:opacity-50 disabled:cursor-not-allowed ${\n\t\t\t\tchecked ? 'bg-green-500' : 'bg-muted-foreground/30'\n\t\t\t}`}\n\t\t>\n\t\t\t<span\n\t\t\t\tclassName={`inline-block h-3.5 w-3.5 rounded-full transition-transform duration-200 ${\n\t\t\t\t\tchecked ? 'translate-x-[18px]' : 'translate-x-[3px]'\n\t\t\t\t} ${loading ? 'bg-transparent' : 'bg-white'}`}\n\t\t\t>\n\t\t\t\t{loading && <Loader2 className=\"w-3.5 h-3.5 animate-spin text-white\" />}\n\t\t\t</span>\n\t\t</button>\n\t);\n});\n\nconst CopilotDeviceAuth = memo(function CopilotDeviceAuth({\n\tuserCode,\n\tverificationUri,\n}: {\n\tuserCode: string;\n\tverificationUri: string;\n}) {\n\tconst [copied, setCopied] = useState(false);\n\n\tconst handleCopy = useCallback(() => {\n\t\tnavigator.clipboard.writeText(userCode).then(() => {\n\t\t\tsetCopied(true);\n\t\t\tsetTimeout(() => setCopied(false), 2000);\n\t\t});\n\t}, [userCode]);\n\n\treturn (\n\t\t<div className=\"px-3 pb-2.5 pt-0\">\n\t\t\t<div className=\"rounded-md bg-yellow-500/10 border border-yellow-500/20 p-2 space-y-1.5\">\n\t\t\t\t<div className=\"flex items-center gap-1.5 text-xs\">\n\t\t\t\t\t<Loader2 className=\"w-3 h-3 animate-spin text-yellow-500 flex-shrink-0\" />\n\t\t\t\t\t<span className=\"text-yellow-500/80\">Enter code at GitHub:</span>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<code className=\"text-sm font-mono font-bold text-yellow-400 tracking-wider\">\n\t\t\t\t\t\t{userCode}\n\t\t\t\t\t</code>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={handleCopy}\n\t\t\t\t\t\tclassName=\"text-yellow-500/60 hover:text-yellow-400 transition-colors\"\n\t\t\t\t\t\ttitle=\"Copy code\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<ClipboardCopy className=\"w-3.5 h-3.5\" />\n\t\t\t\t\t</button>\n\t\t\t\t\t{copied && <span className=\"text-xs text-green-400\">Copied!</span>}\n\t\t\t\t</div>\n\t\t\t\t<a\n\t\t\t\t\thref={verificationUri}\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\topenUrl(verificationUri);\n\t\t\t\t\t}}\n\t\t\t\t\tclassName=\"inline-flex items-center gap-1 text-xs text-yellow-400 hover:text-yellow-300 underline underline-offset-2\"\n\t\t\t\t>\n\t\t\t\t\tOpen GitHub login\n\t\t\t\t\t<ExternalLink className=\"w-3 h-3\" />\n\t\t\t\t</a>\n\t\t\t</div>\n\t\t</div>\n\t);\n});\n\nconst MCPServerCard = memo(function MCPServerCard({\n\tserver,\n\tisLoading,\n\tauthUrl,\n\tcopilotDevice,\n\tonStart,\n\tonStop,\n\tonRemove,\n\tonAuth,\n}: {\n\tserver: MCPServerInfo;\n\tisLoading: boolean;\n\tauthUrl?: string;\n\tcopilotDevice?: { userCode: string; verificationUri: string } | null;\n\tonStart: () => void;\n\tonStop: () => void;\n\tonRemove: () => void;\n\tonAuth: () => void;\n}) {\n\tconst [showTools, setShowTools] = useState(false);\n\tconst hasTools = server.connected && server.tools.length > 0;\n\tconst isRemote = server.transport === 'http' || server.transport === 'sse';\n\tconst isAwaitingAuth = (!!authUrl || !!copilotDevice) && !server.connected;\n\n\tconst handleToggle = useCallback(() => {\n\t\tif (server.authRequired && !server.connected) {\n\t\t\tonAuth();\n\t\t} else if (server.connected) {\n\t\t\tonStop();\n\t\t} else {\n\t\t\tonStart();\n\t\t}\n\t}, [server.connected, server.authRequired, onAuth, onStop, onStart]);\n\n\tconst toggleTools = useCallback(() => {\n\t\tif (hasTools) setShowTools((prev) => !prev);\n\t}, [hasTools]);\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`rounded-lg border transition-colors duration-200 group ${\n\t\t\t\tserver.connected\n\t\t\t\t\t? 'border-green-500/30 bg-green-500/5'\n\t\t\t\t\t: isAwaitingAuth\n\t\t\t\t\t\t? 'border-yellow-500/30 bg-yellow-500/5'\n\t\t\t\t\t\t: 'border-border bg-transparent'\n\t\t\t}`}\n\t\t>\n\t\t\t<div className=\"flex items-center gap-3 px-3 py-2.5\">\n\t\t\t\t<ToggleSwitch\n\t\t\t\t\tchecked={server.connected}\n\t\t\t\t\tloading={isLoading || isAwaitingAuth}\n\t\t\t\t\tonChange={handleToggle}\n\t\t\t\t/>\n\n\t\t\t\t<div className=\"flex-1 min-w-0\">\n\t\t\t\t\t<div className=\"flex items-center gap-1.5\">\n\t\t\t\t\t\t<span className=\"text-sm font-medium truncate\">{server.name}</span>\n\t\t\t\t\t\t{isRemote && (\n\t\t\t\t\t\t\t<Globe className=\"w-3 h-3 text-muted-foreground flex-shrink-0\" />\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{server.authRequired && !server.connected && (\n\t\t\t\t\t\t\t<Lock className=\"w-3 h-3 text-yellow-500 flex-shrink-0\" />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex items-center gap-1.5 mt-0.5\">\n\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground truncate\">\n\t\t\t\t\t\t\t{isRemote\n\t\t\t\t\t\t\t\t? server.url\n\t\t\t\t\t\t\t\t: `${server.command ?? ''} ${server.args.join(' ')}`}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName=\"flex items-center flex-shrink-0 opacity-50\"\n\t\t\t\t\t\t\ttitle={server.scope === 'project' ? 'Project-local' : 'Global'}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{server.scope === 'project' ? (\n\t\t\t\t\t\t\t\t<FolderDot className=\"w-3 h-3\" />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<Laptop className=\"w-3 h-3\" />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"flex items-center gap-0.5 flex-shrink-0\">\n\t\t\t\t\t{hasTools && (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={toggleTools}\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-0.5 text-xs text-muted-foreground hover:text-foreground px-1.5 py-1 rounded transition-colors\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Wrench className=\"w-3 h-3\" />\n\t\t\t\t\t\t\t{server.tools.length}\n\t\t\t\t\t\t\t{showTools ? (\n\t\t\t\t\t\t\t\t<ChevronDown className=\"w-3 h-3\" />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<ChevronRight className=\"w-3 h-3\" />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)}\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tonClick={onRemove}\n\t\t\t\t\t\ttitle=\"Remove server\"\n\t\t\t\t\t\tclassName=\"h-6 w-6 opacity-0 group-hover:opacity-100 transition-opacity\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Trash2 className=\"w-3 h-3 text-muted-foreground hover:text-red-400\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{copilotDevice && !server.connected && (\n\t\t\t\t<CopilotDeviceAuth\n\t\t\t\t\tuserCode={copilotDevice.userCode}\n\t\t\t\t\tverificationUri={copilotDevice.verificationUri}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{!copilotDevice && isAwaitingAuth && authUrl && (\n\t\t\t\t<div className=\"px-3 pb-2.5 pt-0\">\n\t\t\t\t\t<div className=\"flex items-center gap-1.5 text-xs\">\n\t\t\t\t\t\t<Loader2 className=\"w-3 h-3 animate-spin text-yellow-500 flex-shrink-0\" />\n\t\t\t\t\t\t<span className=\"text-yellow-500/80\">Waiting for auth...</span>\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref={authUrl}\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\topenUrl(authUrl);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tclassName=\"inline-flex items-center gap-0.5 text-yellow-400 hover:text-yellow-300 underline underline-offset-2\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tOpen login\n\t\t\t\t\t\t\t<ExternalLink className=\"w-3 h-3\" />\n\t\t\t\t\t\t</a>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{hasTools && showTools && (\n\t\t\t\t<div className=\"px-3 pb-2.5 pt-0\">\n\t\t\t\t\t<div className=\"flex flex-wrap gap-1\">\n\t\t\t\t\t\t{server.tools.map((tool) => (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tkey={tool}\n\t\t\t\t\t\t\t\tclassName=\"text-xs bg-muted px-1.5 py-0.5 rounded\"\n\t\t\t\t\t\t\t\ttitle={tool}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{tool.split('__').pop()}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n\nfunction useAuthPoller(name: string | null, onAuthenticated: () => void) {\n\tconst { data } = useMCPAuthStatus(name);\n\tconst prevAuth = useRef(false);\n\n\tuseEffect(() => {\n\t\tif (data?.authenticated && !prevAuth.current) {\n\t\t\tonAuthenticated();\n\t\t}\n\t\tprevAuth.current = data?.authenticated ?? false;\n\t}, [data?.authenticated, onAuthenticated]);\n}\n\nexport const MCPSidebar = memo(function MCPSidebar() {\n\tconst isExpanded = useMCPStore((s) => s.isExpanded);\n\tconst collapseSidebar = useMCPStore((s) => s.collapseSidebar);\n\tconst servers = useMCPStore((s) => s.servers);\n\tconst loading = useMCPStore((s) => s.loading);\n\tconst authUrls = useMCPStore((s) => s.authUrls);\n\tconst setAuthUrl = useMCPStore((s) => s.setAuthUrl);\n\tconst setLoading = useMCPStore((s) => s.setLoading);\n\tconst setCopilotDevice = useMCPStore((s) => s.setCopilotDevice);\n\n\tconst { isLoading: isFetching } = useMCPServers();\n\tconst startServer = useStartMCPServer();\n\tconst stopServer = useStopMCPServer();\n\tconst removeServer = useRemoveMCPServer();\n\tconst authServer = useAuthenticateMCPServer();\n\tconst copilotDevice = useCopilotDevicePoller();\n\n\tconst [isAddModalOpen, setIsAddModalOpen] = useState(false);\n\tconst [pollingServer, setPollingServer] = useState<string | null>(null);\n\tconst [deleteTarget, setDeleteTarget] = useState<string | null>(null);\n\n\tconst queryClient = useQueryClient();\n\n\tconst handleAuthCompleted = useCallback(() => {\n\t\tif (pollingServer) {\n\t\t\tsetAuthUrl(pollingServer, null);\n\t\t\tsetPollingServer(null);\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['mcp', 'servers'] });\n\t\t}\n\t}, [pollingServer, setAuthUrl, queryClient]);\n\n\tuseAuthPoller(pollingServer, handleAuthCompleted);\n\n\tuseEffect(() => {\n\t\tfor (const name of loading) {\n\t\t\tconst server = servers.find((s) => s.name === name);\n\t\t\tif (server?.connected) {\n\t\t\t\tsetLoading(name, false);\n\t\t\t}\n\t\t}\n\t}, [servers, loading, setLoading]);\n\n\tconst handleCopilotDeviceResponse = useCallback(\n\t\t(\n\t\t\tname: string,\n\t\t\tresult: {\n\t\t\t\tsessionId?: string;\n\t\t\t\tuserCode?: string;\n\t\t\t\tverificationUri?: string;\n\t\t\t\tinterval?: number;\n\t\t\t},\n\t\t) => {\n\t\t\tif (result.sessionId && result.userCode && result.verificationUri) {\n\t\t\t\tsetCopilotDevice({\n\t\t\t\t\tsessionId: result.sessionId,\n\t\t\t\t\tuserCode: result.userCode,\n\t\t\t\t\tverificationUri: result.verificationUri,\n\t\t\t\t\tinterval: result.interval ?? 5,\n\t\t\t\t\tserverName: name,\n\t\t\t\t});\n\t\t\t\topenUrl(result.verificationUri);\n\t\t\t}\n\t\t},\n\t\t[setCopilotDevice],\n\t);\n\n\tconst handleAuth = useCallback(\n\t\tasync (name: string) => {\n\t\t\ttry {\n\t\t\t\tsetLoading(name, true);\n\t\t\t\tconst result = await authServer.mutateAsync(name);\n\t\t\t\tif (result.authType === 'copilot-device') {\n\t\t\t\t\tif (result.authenticated) {\n\t\t\t\t\t\tsetLoading(name, false);\n\t\t\t\t\t\tqueryClient.invalidateQueries({ queryKey: ['mcp', 'servers'] });\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\thandleCopilotDeviceResponse(name, result);\n\t\t\t\t} else if (result.authUrl) {\n\t\t\t\t\tsetAuthUrl(name, result.authUrl);\n\t\t\t\t\tsetPollingServer(name);\n\t\t\t\t\topenUrl(result.authUrl);\n\t\t\t\t} else {\n\t\t\t\t\tsetLoading(name, false);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tsetLoading(name, false);\n\t\t\t\tsetAuthUrl(name, null);\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\tauthServer,\n\t\t\tsetAuthUrl,\n\t\t\tsetLoading,\n\t\t\thandleCopilotDeviceResponse,\n\t\t\tqueryClient,\n\t\t],\n\t);\n\n\tconst handleStart = useCallback(\n\t\tasync (name: string) => {\n\t\t\ttry {\n\t\t\t\tsetLoading(name, true);\n\t\t\t\tconst result = await startServer.mutateAsync(name);\n\t\t\t\tif (result.authType === 'copilot-device' && !result.connected) {\n\t\t\t\t\thandleCopilotDeviceResponse(name, result);\n\t\t\t\t} else if (result.authRequired && result.authUrl) {\n\t\t\t\t\tsetAuthUrl(name, result.authUrl);\n\t\t\t\t\tsetPollingServer(name);\n\t\t\t\t\topenUrl(result.authUrl);\n\t\t\t\t} else {\n\t\t\t\t\tsetLoading(name, false);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tsetLoading(name, false);\n\t\t\t\tsetAuthUrl(name, null);\n\t\t\t}\n\t\t},\n\t\t[startServer, setAuthUrl, setLoading, handleCopilotDeviceResponse],\n\t);\n\n\tconst sortedServers = useMemo(() => {\n\t\treturn [...servers].sort((a, b) => {\n\t\t\tif (a.connected && !b.connected) return -1;\n\t\t\tif (!a.connected && b.connected) return 1;\n\t\t\treturn a.name.localeCompare(b.name);\n\t\t});\n\t}, [servers]);\n\n\tif (!isExpanded) return null;\n\n\tconst connectedCount = servers.filter((s) => s.connected).length;\n\n\treturn (\n\t\t<div className=\"w-80 border-l border-border bg-background flex flex-col h-full\">\n\t\t\t<div className=\"h-14 flex items-center justify-between px-3 border-b border-border\">\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<Plug className=\"w-4 h-4 text-muted-foreground\" />\n\t\t\t\t\t<span className=\"font-medium text-sm\">MCP Servers</span>\n\t\t\t\t\t{connectedCount > 0 && (\n\t\t\t\t\t\t<span className=\"text-xs bg-green-500/20 text-green-400 px-1.5 py-0.5 rounded-full\">\n\t\t\t\t\t\t\t{connectedCount} active\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tonClick={() => setIsAddModalOpen(true)}\n\t\t\t\t\t\ttitle=\"Add MCP server\"\n\t\t\t\t\t\tclassName=\"h-7 w-7\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Plus className=\"w-4 h-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tonClick={collapseSidebar}\n\t\t\t\t\t\ttitle=\"Close sidebar\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<ChevronRight className=\"w-4 h-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div className=\"flex-1 overflow-y-auto\">\n\t\t\t\t{isFetching && servers.length === 0 ? (\n\t\t\t\t\t<div className=\"flex items-center justify-center h-32 text-muted-foreground\">\n\t\t\t\t\t\t<Loader2 className=\"w-4 h-4 animate-spin mr-2\" />\n\t\t\t\t\t\tLoading...\n\t\t\t\t\t</div>\n\t\t\t\t) : servers.length === 0 ? (\n\t\t\t\t\t<div className=\"p-4 text-sm text-muted-foreground space-y-3\">\n\t\t\t\t\t\t<p>No MCP servers configured.</p>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\tonClick={() => setIsAddModalOpen(true)}\n\t\t\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Plus className=\"w-3 h-3 mr-1\" />\n\t\t\t\t\t\t\tAdd MCP Server\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<p className=\"text-xs\">\n\t\t\t\t\t\t\tOr add servers to{' '}\n\t\t\t\t\t\t\t<code className=\"bg-muted px-1 py-0.5 rounded text-xs\">\n\t\t\t\t\t\t\t\t.otto/config.json\n\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"p-2 space-y-1.5\">\n\t\t\t\t\t\t{sortedServers.map((server) => (\n\t\t\t\t\t\t\t<MCPServerCard\n\t\t\t\t\t\t\t\tkey={server.name}\n\t\t\t\t\t\t\t\tserver={server}\n\t\t\t\t\t\t\t\tisLoading={loading.has(server.name)}\n\t\t\t\t\t\t\t\tauthUrl={authUrls.get(server.name)}\n\t\t\t\t\t\t\t\tcopilotDevice={\n\t\t\t\t\t\t\t\t\tcopilotDevice?.serverName === server.name\n\t\t\t\t\t\t\t\t\t\t? copilotDevice\n\t\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonStart={() => handleStart(server.name)}\n\t\t\t\t\t\t\t\tonStop={() => stopServer.mutate(server.name)}\n\t\t\t\t\t\t\t\tonRemove={() => setDeleteTarget(server.name)}\n\t\t\t\t\t\t\t\tonAuth={() => handleAuth(server.name)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\n\t\t\t<AddMCPServerModal\n\t\t\t\tisOpen={isAddModalOpen}\n\t\t\t\tonClose={() => setIsAddModalOpen(false)}\n\t\t\t/>\n\n\t\t\t<Modal\n\t\t\t\tisOpen={!!deleteTarget}\n\t\t\t\tonClose={() => setDeleteTarget(null)}\n\t\t\t\ttitle=\"Remove MCP Server\"\n\t\t\t\tmaxWidth=\"sm\"\n\t\t\t\tshowCloseButton={false}\n\t\t\t>\n\t\t\t\t<p className=\"text-sm text-muted-foreground mb-4\">\n\t\t\t\t\tAre you sure you want to remove{' '}\n\t\t\t\t\t<span className=\"font-medium text-foreground\">{deleteTarget}</span>?\n\t\t\t\t\tThis will stop the server and remove its configuration.\n\t\t\t\t</p>\n\t\t\t\t<div className=\"flex justify-end gap-2\">\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\tonClick={() => setDeleteTarget(null)}\n\t\t\t\t\t>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\tclassName=\"bg-red-500 hover:bg-red-600 text-white\"\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tif (deleteTarget) {\n\t\t\t\t\t\t\t\tremoveServer.mutate(deleteTarget);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsetDeleteTarget(null);\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tRemove\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t</Modal>\n\t\t</div>\n\t);\n});\n",
161
+ "import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useMCPStore, type MCPServerInfo } from '../stores/mcpStore';\nimport { useEffect, useRef, useCallback } from 'react';\nimport {\n\tlistMcpServers,\n\tstartMcpServer,\n\tstopMcpServer,\n\taddMcpServer,\n\tremoveMcpServer,\n\tinitiateMcpAuth,\n\trevokeMcpAuth,\n\tgetMcpAuthStatus,\n\tcompleteMcpAuth,\n} from '@ottocode/api';\n\ninterface MCPServersResponse {\n\tservers: MCPServerInfo[];\n}\n\nexport function useMCPServers() {\n\tconst setServers = useMCPStore((s) => s.setServers);\n\n\tconst query = useQuery({\n\t\tqueryKey: ['mcp', 'servers'],\n\t\tqueryFn: async () => {\n\t\t\tconst { data } = await listMcpServers();\n\t\t\treturn data as MCPServersResponse;\n\t\t},\n\t\trefetchInterval: 10000,\n\t});\n\n\tuseEffect(() => {\n\t\tif (query.data?.servers) {\n\t\t\tsetServers(query.data.servers);\n\t\t}\n\t}, [query.data, setServers]);\n\n\treturn query;\n}\n\nexport function useStartMCPServer() {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: async (name: string) => {\n\t\t\tconst { data, error } = await startMcpServer({\n\t\t\t\tpath: { name },\n\t\t\t});\n\t\t\tif (error) throw new Error('Failed to start server');\n\t\t\tconst result = data as {\n\t\t\t\tok: boolean;\n\t\t\t\terror?: string;\n\t\t\t\tconnected?: boolean;\n\t\t\t\tauthRequired?: boolean;\n\t\t\t\tauthUrl?: string;\n\t\t\t\tauthType?: string;\n\t\t\t\tauthenticated?: boolean;\n\t\t\t\tsessionId?: string;\n\t\t\t\tuserCode?: string;\n\t\t\t\tverificationUri?: string;\n\t\t\t\tinterval?: number;\n\t\t\t};\n\t\t\tif (!result.ok) throw new Error(result.error || 'Failed to start server');\n\t\t\treturn result;\n\t\t},\n\t\tonSettled: () => {\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['mcp', 'servers'] });\n\t\t},\n\t});\n}\n\nexport function useStopMCPServer() {\n\tconst queryClient = useQueryClient();\n\tconst setLoading = useMCPStore((s) => s.setLoading);\n\n\treturn useMutation({\n\t\tmutationFn: async (name: string) => {\n\t\t\tsetLoading(name, true);\n\t\t\tconst { data, error } = await stopMcpServer({\n\t\t\t\tpath: { name },\n\t\t\t});\n\t\t\tif (error) throw new Error('Failed to stop server');\n\t\t\tconst result = data as { ok: boolean; error?: string };\n\t\t\tif (!result.ok) throw new Error(result.error || 'Failed to stop server');\n\t\t\treturn result;\n\t\t},\n\t\tonSettled: (_data, _error, name) => {\n\t\t\tsetLoading(name, false);\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['mcp', 'servers'] });\n\t\t},\n\t});\n}\n\nexport interface AddMCPServerParams {\n\tname: string;\n\ttransport?: 'stdio' | 'http' | 'sse';\n\tcommand?: string;\n\targs?: string[];\n\tenv?: Record<string, string>;\n\turl?: string;\n\theaders?: Record<string, string>;\n\toauth?: Record<string, unknown>;\n\tscope?: 'global' | 'project';\n}\n\nexport function useAddMCPServer() {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: async (params: AddMCPServerParams) => {\n\t\t\tconst { data, error } = await addMcpServer({\n\t\t\t\tbody: params,\n\t\t\t});\n\t\t\tif (error) throw new Error('Failed to add MCP server');\n\t\t\tconst result = data as { ok: boolean; error?: string };\n\t\t\tif (!result.ok)\n\t\t\t\tthrow new Error(result.error || 'Failed to add MCP server');\n\t\t\treturn result;\n\t\t},\n\t\tonSuccess: () => {\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['mcp', 'servers'] });\n\t\t},\n\t});\n}\n\nexport function useRemoveMCPServer() {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: async (name: string) => {\n\t\t\tconst { data, error } = await removeMcpServer({\n\t\t\t\tpath: { name },\n\t\t\t});\n\t\t\tif (error) throw new Error('Failed to remove MCP server');\n\t\t\tconst result = data as { ok: boolean; error?: string };\n\t\t\tif (!result.ok)\n\t\t\t\tthrow new Error(result.error || 'Failed to remove MCP server');\n\t\t\treturn result;\n\t\t},\n\t\tonSuccess: () => {\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['mcp', 'servers'] });\n\t\t},\n\t});\n}\n\nexport function useAuthenticateMCPServer() {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: async (name: string) => {\n\t\t\tconst { data, error } = await initiateMcpAuth({\n\t\t\t\tpath: { name },\n\t\t\t});\n\t\t\tif (error) throw new Error('Failed to initiate auth');\n\t\t\tconst result = data as {\n\t\t\t\tok: boolean;\n\t\t\t\tauthUrl?: string;\n\t\t\t\tauthType?: string;\n\t\t\t\tsessionId?: string;\n\t\t\t\tuserCode?: string;\n\t\t\t\tverificationUri?: string;\n\t\t\t\tinterval?: number;\n\t\t\t\tauthenticated?: boolean;\n\t\t\t\tname: string;\n\t\t\t\terror?: string;\n\t\t\t};\n\t\t\tif (!result.ok)\n\t\t\t\tthrow new Error(result.error || 'Failed to initiate auth');\n\t\t\treturn result;\n\t\t},\n\t\tonSettled: () => {\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['mcp', 'servers'] });\n\t\t},\n\t});\n}\n\nexport function useRevokeMCPAuth() {\n\tconst queryClient = useQueryClient();\n\n\treturn useMutation({\n\t\tmutationFn: async (name: string) => {\n\t\t\tconst { data, error } = await revokeMcpAuth({\n\t\t\t\tpath: { name },\n\t\t\t});\n\t\t\tif (error) throw new Error('Failed to revoke auth');\n\t\t\tconst result = data as { ok: boolean; error?: string };\n\t\t\tif (!result.ok) throw new Error(result.error || 'Failed to revoke auth');\n\t\t\treturn result;\n\t\t},\n\t\tonSuccess: () => {\n\t\t\tqueryClient.invalidateQueries({ queryKey: ['mcp', 'servers'] });\n\t\t},\n\t});\n}\n\nexport function useMCPAuthStatus(name: string | null) {\n\treturn useQuery({\n\t\tqueryKey: ['mcp', 'auth', name],\n\t\tqueryFn: async () => {\n\t\t\tif (!name) return { authenticated: false };\n\t\t\tconst { data } = await getMcpAuthStatus({\n\t\t\t\tpath: { name },\n\t\t\t});\n\t\t\treturn data as {\n\t\t\t\tauthenticated: boolean;\n\t\t\t\texpiresAt?: number;\n\t\t\t};\n\t\t},\n\t\tenabled: !!name,\n\t\trefetchInterval: 3000,\n\t});\n}\n\nexport function useCopilotDevicePoller() {\n\tconst copilotDevice = useMCPStore((s) => s.copilotDevice);\n\tconst setCopilotDevice = useMCPStore((s) => s.setCopilotDevice);\n\tconst setLoading = useMCPStore((s) => s.setLoading);\n\tconst queryClient = useQueryClient();\n\tconst timerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n\tconst stopPolling = useCallback(() => {\n\t\tif (timerRef.current) {\n\t\t\tclearInterval(timerRef.current);\n\t\t\ttimerRef.current = null;\n\t\t}\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (!copilotDevice) {\n\t\t\tstopPolling();\n\t\t\treturn;\n\t\t}\n\n\t\tconst { sessionId, serverName, interval } = copilotDevice;\n\t\tconst pollMs = (interval || 5) * 1000 + 1000;\n\n\t\ttimerRef.current = setInterval(async () => {\n\t\t\ttry {\n\t\t\t\tconst { data } = await completeMcpAuth({\n\t\t\t\t\tpath: { name: serverName },\n\t\t\t\t\tbody: { sessionId },\n\t\t\t\t});\n\n\t\t\t\tconst result = data as {\n\t\t\t\t\tok: boolean;\n\t\t\t\t\tstatus: string;\n\t\t\t\t\terror?: string;\n\t\t\t\t};\n\n\t\t\t\tif (result?.status === 'complete') {\n\t\t\t\t\tstopPolling();\n\t\t\t\t\tsetCopilotDevice(null);\n\t\t\t\t\tsetLoading(serverName, false);\n\t\t\t\t\tqueryClient.invalidateQueries({ queryKey: ['mcp', 'servers'] });\n\t\t\t\t} else if (result?.status === 'error') {\n\t\t\t\t\tstopPolling();\n\t\t\t\t\tsetCopilotDevice(null);\n\t\t\t\t\tsetLoading(serverName, false);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tstopPolling();\n\t\t\t\tsetCopilotDevice(null);\n\t\t\t\tsetLoading(serverName, false);\n\t\t\t}\n\t\t}, pollMs);\n\n\t\treturn stopPolling;\n\t}, [copilotDevice, setCopilotDevice, setLoading, queryClient, stopPolling]);\n\n\treturn copilotDevice;\n}\n",
162
+ "import { memo, useState, useCallback, useRef, useEffect } from 'react';\nimport { Globe, Laptop, Loader2, FolderDot, Terminal } from 'lucide-react';\nimport { Modal } from '../ui/Modal';\nimport { Button } from '../ui/Button';\nimport { Input } from '../ui/Input';\nimport { useAddMCPServer } from '../../hooks/useMCP';\nimport type { MCPScope } from '../../stores/mcpStore';\n\ninterface AddMCPServerModalProps {\n\tisOpen: boolean;\n\tonClose: () => void;\n}\n\ntype ServerMode = 'local' | 'remote';\n\nfunction parseCommandString(input: string): {\n\tcommand: string;\n\targs: string[];\n} {\n\tconst parts = input.trim().split(/\\s+/);\n\treturn { command: parts[0] ?? '', args: parts.slice(1) };\n}\n\nfunction parseEnv(envStr: string): Record<string, string> | undefined {\n\tconst trimmed = envStr.trim();\n\tif (!trimmed) return undefined;\n\tconst env: Record<string, string> = {};\n\tfor (const line of trimmed.split('\\n')) {\n\t\tconst eq = line.indexOf('=');\n\t\tif (eq > 0) {\n\t\t\tenv[line.slice(0, eq).trim()] = line.slice(eq + 1).trim();\n\t\t}\n\t}\n\treturn Object.keys(env).length > 0 ? env : undefined;\n}\n\nfunction parseHeaders(headerStr: string): Record<string, string> | undefined {\n\tconst trimmed = headerStr.trim();\n\tif (!trimmed) return undefined;\n\tconst headers: Record<string, string> = {};\n\tfor (const line of trimmed.split('\\n')) {\n\t\tconst colon = line.indexOf(':');\n\t\tif (colon > 0) {\n\t\t\theaders[line.slice(0, colon).trim()] = line.slice(colon + 1).trim();\n\t\t}\n\t}\n\treturn Object.keys(headers).length > 0 ? headers : undefined;\n}\n\nexport const AddMCPServerModal = memo(function AddMCPServerModal({\n\tisOpen,\n\tonClose,\n}: AddMCPServerModalProps) {\n\tconst [serverMode, setServerMode] = useState<ServerMode>('local');\n\tconst [name, setName] = useState('');\n\tconst [commandStr, setCommandStr] = useState('');\n\tconst [url, setUrl] = useState('');\n\tconst [transport, setTransport] = useState<'http' | 'sse'>('http');\n\tconst [headersStr, setHeadersStr] = useState('');\n\tconst [envStr, setEnvStr] = useState('');\n\tconst [scope, setScope] = useState<MCPScope>('global');\n\tconst [error, setError] = useState<string | null>(null);\n\n\tconst addServer = useAddMCPServer();\n\n\tconst reset = useCallback(() => {\n\t\tsetName('');\n\t\tsetCommandStr('');\n\t\tsetUrl('');\n\t\tsetTransport('http');\n\t\tsetHeadersStr('');\n\t\tsetEnvStr('');\n\t\tsetScope('global');\n\t\tsetError(null);\n\t\tsetServerMode('local');\n\t}, []);\n\n\tconst handleClose = useCallback(() => {\n\t\treset();\n\t\tonClose();\n\t}, [reset, onClose]);\n\n\tconst handleSubmit = useCallback(async () => {\n\t\tsetError(null);\n\t\tconst trimmedName = name.trim();\n\n\t\tif (!trimmedName) {\n\t\t\tsetError('Server name is required');\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tif (serverMode === 'local') {\n\t\t\t\tconst trimmedCmd = commandStr.trim();\n\t\t\t\tif (!trimmedCmd) {\n\t\t\t\t\tsetError('Command is required');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (/^https?:\\/\\//i.test(trimmedCmd)) {\n\t\t\t\t\tsetError(\n\t\t\t\t\t\t'Local commands cannot be URLs. Switch to Remote (HTTP) for remote servers.',\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst { command, args } = parseCommandString(trimmedCmd);\n\t\t\t\tawait addServer.mutateAsync({\n\t\t\t\t\tname: trimmedName,\n\t\t\t\t\ttransport: 'stdio',\n\t\t\t\t\tcommand,\n\t\t\t\t\targs,\n\t\t\t\t\tenv: parseEnv(envStr),\n\t\t\t\t\tscope,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst trimmedUrl = url.trim();\n\t\t\t\tif (!trimmedUrl) {\n\t\t\t\t\tsetError('URL is required');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait addServer.mutateAsync({\n\t\t\t\t\tname: trimmedName,\n\t\t\t\t\ttransport,\n\t\t\t\t\turl: trimmedUrl,\n\t\t\t\t\theaders: parseHeaders(headersStr),\n\t\t\t\t\tscope,\n\t\t\t\t});\n\t\t\t}\n\t\t\thandleClose();\n\t\t} catch (err) {\n\t\t\tsetError(err instanceof Error ? err.message : 'Failed to add server');\n\t\t}\n\t}, [\n\t\tname,\n\t\tserverMode,\n\t\tcommandStr,\n\t\tenvStr,\n\t\turl,\n\t\ttransport,\n\t\theadersStr,\n\t\tscope,\n\t\taddServer,\n\t\thandleClose,\n\t]);\n\n\tconst contentRef = useRef<HTMLDivElement>(null);\n\tconst [contentHeight, setContentHeight] = useState<number | undefined>(\n\t\tundefined,\n\t);\n\n\tuseEffect(() => {\n\t\tconst el = contentRef.current;\n\t\tif (!el) return;\n\t\tconst observer = new ResizeObserver(() => {\n\t\t\tsetContentHeight(el.scrollHeight);\n\t\t});\n\t\tobserver.observe(el);\n\t\treturn () => observer.disconnect();\n\t}, []);\n\n\treturn (\n\t\t<Modal isOpen={isOpen} onClose={handleClose} title=\"Add MCP Server\">\n\t\t\t<div\n\t\t\t\tclassName=\"overflow-hidden transition-[height] duration-200 ease-in-out\"\n\t\t\t\tstyle={{ height: contentHeight !== undefined ? contentHeight : 'auto' }}\n\t\t\t>\n\t\t\t\t<div ref={contentRef} className=\"space-y-4\">\n\t\t\t\t\t<div className=\"relative flex w-full rounded-lg bg-muted p-1\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"absolute top-1 bottom-1 rounded-md bg-background shadow-md border border-border transition-all duration-200 ease-in-out\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tleft: serverMode === 'local' ? '4px' : '50%',\n\t\t\t\t\t\t\t\tright: serverMode === 'remote' ? '4px' : '50%',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => setServerMode('local')}\n\t\t\t\t\t\t\tclassName={`relative z-10 flex items-center justify-center gap-2 flex-1 text-sm font-medium py-2 rounded-md transition-colors duration-200 ${\n\t\t\t\t\t\t\t\tserverMode === 'local'\n\t\t\t\t\t\t\t\t\t? 'text-foreground'\n\t\t\t\t\t\t\t\t\t: 'text-muted-foreground/50'\n\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Terminal className=\"w-4 h-4\" />\n\t\t\t\t\t\t\tLocal (stdio)\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => setServerMode('remote')}\n\t\t\t\t\t\t\tclassName={`relative z-10 flex items-center justify-center gap-2 flex-1 text-sm font-medium py-2 rounded-md transition-colors duration-200 ${\n\t\t\t\t\t\t\t\tserverMode === 'remote'\n\t\t\t\t\t\t\t\t\t? 'text-foreground'\n\t\t\t\t\t\t\t\t\t: 'text-muted-foreground/50'\n\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Globe className=\"w-4 h-4\" />\n\t\t\t\t\t\t\tRemote (HTTP)\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div className=\"text-sm font-medium mb-1\">Name</div>\n\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\tvalue={name}\n\t\t\t\t\t\t\tonChange={(e) => setName(e.target.value)}\n\t\t\t\t\t\t\tplaceholder=\"e.g. github, linear, helius\"\n\t\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{serverMode === 'local' ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<div className=\"text-sm font-medium mb-1\">Command</div>\n\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\tvalue={commandStr}\n\t\t\t\t\t\t\t\t\tonChange={(e) => setCommandStr(e.target.value)}\n\t\t\t\t\t\t\t\t\tplaceholder=\"e.g. npx -y @modelcontextprotocol/server-github\"\n\t\t\t\t\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\t\t\t\t\tif (e.key === 'Enter') handleSubmit();\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground mt-1\">\n\t\t\t\t\t\t\t\t\tLike{' '}\n\t\t\t\t\t\t\t\t\t<code className=\"bg-muted px-1 rounded\">\n\t\t\t\t\t\t\t\t\t\tnpx -y helius-mcp@latest\n\t\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<div className=\"text-sm font-medium mb-1\">\n\t\t\t\t\t\t\t\t\tEnvironment Variables\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\t\t\tvalue={envStr}\n\t\t\t\t\t\t\t\t\tonChange={(e) => setEnvStr(e.target.value)}\n\t\t\t\t\t\t\t\t\tplaceholder={'GITHUB_TOKEN=ghp_xxx\\nAPI_KEY=sk-xxx'}\n\t\t\t\t\t\t\t\t\trows={2}\n\t\t\t\t\t\t\t\t\tclassName=\"w-full bg-muted border border-border rounded-md px-3 py-2 text-sm font-mono resize-none focus:outline-none focus:ring-1 focus:ring-primary\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground mt-1\">\n\t\t\t\t\t\t\t\t\tOne per line: KEY=VALUE\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<div className=\"text-sm font-medium mb-1\">URL</div>\n\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\tvalue={url}\n\t\t\t\t\t\t\t\t\tonChange={(e) => setUrl(e.target.value)}\n\t\t\t\t\t\t\t\t\tplaceholder=\"e.g. https://mcp.linear.app/mcp\"\n\t\t\t\t\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\t\t\t\t\tif (e.key === 'Enter') handleSubmit();\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<div className=\"text-sm font-medium mb-1\">Transport</div>\n\t\t\t\t\t\t\t\t<div className=\"relative flex w-full rounded-lg border border-border bg-muted/50 p-0.5\">\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName=\"absolute top-0.5 bottom-0.5 rounded-md bg-background shadow-md border border-border transition-all duration-200 ease-in-out\"\n\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\tleft: transport === 'http' ? '2px' : '50%',\n\t\t\t\t\t\t\t\t\t\t\tright: transport === 'sse' ? '2px' : '50%',\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => setTransport('http')}\n\t\t\t\t\t\t\t\t\t\tclassName={`relative z-10 flex items-center justify-center gap-1.5 text-xs font-medium py-1.5 rounded-md flex-1 transition-colors duration-200 ${\n\t\t\t\t\t\t\t\t\t\t\ttransport === 'http'\n\t\t\t\t\t\t\t\t\t\t\t\t? 'text-foreground'\n\t\t\t\t\t\t\t\t\t\t\t\t: 'text-muted-foreground/50'\n\t\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tHTTP (recommended)\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => setTransport('sse')}\n\t\t\t\t\t\t\t\t\t\tclassName={`relative z-10 flex items-center justify-center gap-1.5 text-xs font-medium py-1.5 rounded-md flex-1 transition-colors duration-200 ${\n\t\t\t\t\t\t\t\t\t\t\ttransport === 'sse'\n\t\t\t\t\t\t\t\t\t\t\t\t? 'text-foreground'\n\t\t\t\t\t\t\t\t\t\t\t\t: 'text-muted-foreground/50'\n\t\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tSSE (legacy)\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<div className=\"text-sm font-medium mb-1\">Headers</div>\n\t\t\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\t\t\tvalue={headersStr}\n\t\t\t\t\t\t\t\t\tonChange={(e) => setHeadersStr(e.target.value)}\n\t\t\t\t\t\t\t\t\tplaceholder={'Authorization: Bearer xxx'}\n\t\t\t\t\t\t\t\t\trows={2}\n\t\t\t\t\t\t\t\t\tclassName=\"w-full bg-muted border border-border rounded-md px-3 py-2 text-sm font-mono resize-none focus:outline-none focus:ring-1 focus:ring-primary\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground mt-1\">\n\t\t\t\t\t\t\t\t\tOne per line: Header-Name: value\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\tFor OAuth servers (Linear, Notion, etc.), leave headers empty\n\t\t\t\t\t\t\t\tand authenticate after adding.\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div className=\"text-sm font-medium mb-1\">Scope</div>\n\t\t\t\t\t\t<div className=\"relative flex w-full rounded-lg border border-border bg-muted/50 p-0.5\">\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName=\"absolute top-0.5 bottom-0.5 rounded-md bg-background shadow-md border border-border transition-all duration-200 ease-in-out\"\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tleft: scope === 'global' ? '2px' : '50%',\n\t\t\t\t\t\t\t\t\tright: scope === 'project' ? '2px' : '50%',\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => setScope('global')}\n\t\t\t\t\t\t\t\tclassName={`relative z-10 flex items-center justify-center gap-1.5 text-xs font-medium py-1.5 rounded-md flex-1 transition-colors duration-200 ${\n\t\t\t\t\t\t\t\t\tscope === 'global'\n\t\t\t\t\t\t\t\t\t\t? 'text-foreground'\n\t\t\t\t\t\t\t\t\t\t: 'text-muted-foreground/50'\n\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Laptop className=\"w-3 h-3\" />\n\t\t\t\t\t\t\t\tAll projects\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={() => setScope('project')}\n\t\t\t\t\t\t\t\tclassName={`relative z-10 flex items-center justify-center gap-1.5 text-xs font-medium py-1.5 rounded-md flex-1 transition-colors duration-200 ${\n\t\t\t\t\t\t\t\t\tscope === 'project'\n\t\t\t\t\t\t\t\t\t\t? 'text-foreground'\n\t\t\t\t\t\t\t\t\t\t: 'text-muted-foreground/50'\n\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<FolderDot className=\"w-3 h-3\" />\n\t\t\t\t\t\t\t\tThis project only\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground mt-1\">\n\t\t\t\t\t\t\t{scope === 'global'\n\t\t\t\t\t\t\t\t? 'Saved to ~/.config/otto/config.json'\n\t\t\t\t\t\t\t\t: 'Saved to .otto/config.json (project-local)'}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{error && (\n\t\t\t\t\t\t<div className=\"text-sm text-red-400 bg-red-500/10 px-3 py-2 rounded\">\n\t\t\t\t\t\t\t{error}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\n\t\t\t\t\t<div className=\"flex justify-end gap-2 pt-2\">\n\t\t\t\t\t\t<Button variant=\"ghost\" onClick={handleClose}>\n\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\t\tonClick={handleSubmit}\n\t\t\t\t\t\t\tdisabled={addServer.isPending}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{addServer.isPending ? (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t<Loader2 className=\"w-3 h-3 animate-spin mr-1\" />\n\t\t\t\t\t\t\t\t\tAdding...\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t'Add Server'\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</Modal>\n\t);\n});\n",
163
+ "import { memo } from 'react';\nimport { Plug } from 'lucide-react';\nimport { useMCPStore } from '../../stores/mcpStore';\n\nexport const MCPSidebarToggle = memo(function MCPSidebarToggle() {\n\tconst isExpanded = useMCPStore((state) => state.isExpanded);\n\tconst toggleSidebar = useMCPStore((state) => state.toggleSidebar);\n\tconst servers = useMCPStore((state) => state.servers);\n\n\tconst connectedCount = servers.filter((s) => s.connected).length;\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={toggleSidebar}\n\t\t\tclassName={`relative h-14 w-full transition-colors touch-manipulation flex items-center justify-center border-r-2 ${\n\t\t\t\tisExpanded\n\t\t\t\t\t? 'bg-muted border-primary'\n\t\t\t\t\t: 'border-transparent hover:bg-muted/50'\n\t\t\t}`}\n\t\t\ttitle=\"MCP Servers\"\n\t\t>\n\t\t\t<Plug className=\"w-5 h-5 text-muted-foreground mx-auto\" />\n\t\t\t{connectedCount > 0 && (\n\t\t\t\t<span className=\"absolute top-2 right-2 w-2 h-2 bg-green-500 rounded-full\" />\n\t\t\t)}\n\t\t</button>\n\t);\n});\n",
164
+ "import { memo, useMemo } from 'react';\nimport {\n\tChevronRight,\n\tSparkles,\n\tLoader2,\n\tFolderDot,\n\tLaptop,\n\tGlobe,\n\tFileText,\n\tFileCode,\n} from 'lucide-react';\nimport { Button } from '../ui/Button';\nimport { useSkillsStore } from '../../stores/skillsStore';\nimport {\n\tuseSkills,\n\tuseSkillDetail,\n\tuseSkillFiles,\n} from '../../hooks/useSkills';\n\nconst SCOPE_ICONS: Record<string, typeof FolderDot> = {\n\tcwd: FolderDot,\n\tparent: FolderDot,\n\trepo: FolderDot,\n\tuser: Laptop,\n\tsystem: Globe,\n};\n\nconst SCOPE_LABELS: Record<string, string> = {\n\tcwd: 'Project',\n\tparent: 'Parent',\n\trepo: 'Repository',\n\tuser: 'User',\n\tsystem: 'System',\n};\n\nfunction formatSize(bytes: number): string {\n\tif (bytes < 1024) return `${bytes} B`;\n\tif (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n\treturn `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport const SkillsSidebar = memo(function SkillsSidebar() {\n\tconst isExpanded = useSkillsStore((s) => s.isExpanded);\n\tconst collapseSidebar = useSkillsStore((s) => s.collapseSidebar);\n\tconst skills = useSkillsStore((s) => s.skills);\n\tconst selectedSkill = useSkillsStore((s) => s.selectedSkill);\n\tconst selectSkill = useSkillsStore((s) => s.selectSkill);\n\tconst openViewer = useSkillsStore((s) => s.openViewer);\n\tconst viewingFile = useSkillsStore((s) => s.viewingFile);\n\n\tconst { isLoading } = useSkills();\n\tconst { data: skillDetail } = useSkillDetail(selectedSkill);\n\tconst { data: skillFilesData } = useSkillFiles(selectedSkill);\n\tconst skillFiles = skillFilesData?.files ?? [];\n\n\tconst groupedSkills = useMemo(() => {\n\t\tconst groups = new Map<string, typeof skills>();\n\t\tfor (const skill of skills) {\n\t\t\tconst list = groups.get(skill.scope) ?? [];\n\t\t\tlist.push(skill);\n\t\t\tgroups.set(skill.scope, list);\n\t\t}\n\t\treturn groups;\n\t}, [skills]);\n\n\tif (!isExpanded) return null;\n\n\treturn (\n\t\t<div className=\"w-80 border-l border-border bg-background flex flex-col h-full\">\n\t\t\t<div className=\"h-14 flex items-center justify-between px-3 border-b border-border\">\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<Sparkles className=\"w-4 h-4 text-muted-foreground\" />\n\t\t\t\t\t<span className=\"font-medium text-sm\">Skills</span>\n\t\t\t\t</div>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tonClick={collapseSidebar}\n\t\t\t\t\ttitle=\"Close sidebar\"\n\t\t\t\t>\n\t\t\t\t\t<ChevronRight className=\"w-4 h-4\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\n\t\t\t{selectedSkill && skillDetail ? (\n\t\t\t\t<div className=\"flex-1 overflow-y-auto\">\n\t\t\t\t\t<div className=\"p-3 border-b border-border\">\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => selectSkill(null)}\n\t\t\t\t\t\t\tclassName=\"text-xs text-muted-foreground hover:text-foreground transition-colors\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t← Back to list\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"px-3 py-3 border-b border-border\">\n\t\t\t\t\t\t<h3 className=\"font-medium text-sm mb-1\">{skillDetail.name}</h3>\n\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground mb-2\">\n\t\t\t\t\t\t\t{skillDetail.description}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<span className=\"text-[10px] px-1.5 py-0.5 rounded bg-muted text-muted-foreground\">\n\t\t\t\t\t\t\t\t{SCOPE_LABELS[skillDetail.scope] ?? skillDetail.scope}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{skillDetail.license && (\n\t\t\t\t\t\t\t\t<span className=\"text-[10px] px-1.5 py-0.5 rounded bg-muted text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t{skillDetail.license}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div className=\"py-1\">\n\t\t\t\t\t\t<div className=\"flex items-center gap-1.5 px-3 py-2 text-[10px] uppercase tracking-wider text-muted-foreground font-medium\">\n\t\t\t\t\t\t\tFiles\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={() => openViewer(null)}\n\t\t\t\t\t\t\tclassName={`w-full text-left px-3 py-2 hover:bg-accent transition-colors ${\n\t\t\t\t\t\t\t\tviewingFile === null ? 'bg-accent' : ''\n\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<FileText className=\"w-3.5 h-3.5 flex-shrink-0 text-muted-foreground\" />\n\t\t\t\t\t\t\t\t<span className=\"text-sm font-mono truncate flex-1\">\n\t\t\t\t\t\t\t\t\tSKILL.md\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t{skillFiles.map((file) => (\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tkey={file.relativePath}\n\t\t\t\t\t\t\t\tonClick={() => openViewer(file.relativePath)}\n\t\t\t\t\t\t\t\tclassName={`w-full text-left px-3 py-2 hover:bg-accent transition-colors ${\n\t\t\t\t\t\t\t\t\tviewingFile === file.relativePath ? 'bg-accent' : ''\n\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t<FileCode className=\"w-3.5 h-3.5 flex-shrink-0 text-muted-foreground\" />\n\t\t\t\t\t\t\t\t\t<span className=\"text-sm font-mono truncate flex-1\">\n\t\t\t\t\t\t\t\t\t\t{file.relativePath}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<span className=\"text-[10px] text-muted-foreground flex-shrink-0\">\n\t\t\t\t\t\t\t\t\t\t{formatSize(file.size)}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<div className=\"flex-1 overflow-y-auto\">\n\t\t\t\t\t{isLoading ? (\n\t\t\t\t\t\t<div className=\"flex items-center justify-center py-8\">\n\t\t\t\t\t\t\t<Loader2 className=\"w-4 h-4 animate-spin text-muted-foreground\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : skills.length === 0 ? (\n\t\t\t\t\t\t<div className=\"flex flex-col items-center justify-center h-full text-center p-4\">\n\t\t\t\t\t\t\t<Sparkles className=\"w-12 h-12 text-muted-foreground/30 mb-4\" />\n\t\t\t\t\t\t\t<h3 className=\"text-sm font-medium mb-2\">No skills found</h3>\n\t\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground max-w-[220px]\">\n\t\t\t\t\t\t\t\tCreate skills in{' '}\n\t\t\t\t\t\t\t\t<code className=\"text-[10px] bg-muted px-1 rounded\">\n\t\t\t\t\t\t\t\t\t.otto/skills/\n\t\t\t\t\t\t\t\t</code>{' '}\n\t\t\t\t\t\t\t\tor{' '}\n\t\t\t\t\t\t\t\t<code className=\"text-[10px] bg-muted px-1 rounded\">\n\t\t\t\t\t\t\t\t\t~/.config/otto/skills/\n\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<div className=\"py-1\">\n\t\t\t\t\t\t\t{['cwd', 'parent', 'repo', 'user', 'system'].map((scope) => {\n\t\t\t\t\t\t\t\tconst scopeSkills = groupedSkills.get(scope);\n\t\t\t\t\t\t\t\tif (!scopeSkills?.length) return null;\n\t\t\t\t\t\t\t\tconst ScopeIcon = SCOPE_ICONS[scope] ?? Globe;\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<div key={scope}>\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-1.5 px-3 py-2 text-[10px] uppercase tracking-wider text-muted-foreground font-medium\">\n\t\t\t\t\t\t\t\t\t\t\t<ScopeIcon className=\"w-3 h-3\" />\n\t\t\t\t\t\t\t\t\t\t\t{SCOPE_LABELS[scope] ?? scope}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t{scopeSkills.map((skill) => (\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tkey={`${skill.scope}-${skill.name}`}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => selectSkill(skill.name)}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={`w-full text-left px-3 py-2 hover:bg-accent transition-colors ${\n\t\t\t\t\t\t\t\t\t\t\t\t\tselectedSkill === skill.name ? 'bg-accent' : ''\n\t\t\t\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<FileText className=\"w-3.5 h-3.5 flex-shrink-0 text-muted-foreground\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"min-w-0 flex-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"text-sm font-medium truncate\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{skill.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"text-xs text-muted-foreground truncate\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{skill.description}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n",
165
+ "import { useQuery } from '@tanstack/react-query';\nimport { useSkillsStore } from '../stores/skillsStore';\nimport { useEffect } from 'react';\nimport { apiClient } from '../lib/api-client';\n\nexport function useSkills() {\n\tconst setSkills = useSkillsStore((s) => s.setSkills);\n\n\tconst query = useQuery({\n\t\tqueryKey: ['skills'],\n\t\tqueryFn: async () => {\n\t\t\treturn apiClient.listSkills();\n\t\t},\n\t\trefetchInterval: 30000,\n\t});\n\n\tuseEffect(() => {\n\t\tif (query.data?.skills) {\n\t\t\tsetSkills(query.data.skills);\n\t\t}\n\t}, [query.data, setSkills]);\n\n\treturn query;\n}\n\nexport function useSkillDetail(name: string | null) {\n\treturn useQuery({\n\t\tqueryKey: ['skills', name],\n\t\tqueryFn: async () => {\n\t\t\tif (!name) return null;\n\t\t\treturn apiClient.getSkill(name);\n\t\t},\n\t\tenabled: !!name,\n\t});\n}\n\nexport function useSkillFiles(name: string | null) {\n\treturn useQuery({\n\t\tqueryKey: ['skills', name, 'files'],\n\t\tqueryFn: async () => {\n\t\t\tif (!name) return null;\n\t\t\treturn apiClient.getSkillFiles(name);\n\t\t},\n\t\tenabled: !!name,\n\t});\n}\n\nexport function useSkillFileContent(\n\tname: string | null,\n\tfilePath: string | null,\n) {\n\treturn useQuery({\n\t\tqueryKey: ['skills', name, 'files', filePath],\n\t\tqueryFn: async () => {\n\t\t\tif (!name || !filePath) return null;\n\t\t\treturn apiClient.getSkillFileContent(name, filePath);\n\t\t},\n\t\tenabled: !!name && !!filePath,\n\t});\n}\n",
166
+ "import { memo } from 'react';\nimport { Sparkles } from 'lucide-react';\nimport { useSkillsStore } from '../../stores/skillsStore';\n\nexport const SkillsSidebarToggle = memo(function SkillsSidebarToggle() {\n\tconst isExpanded = useSkillsStore((state) => state.isExpanded);\n\tconst toggleSidebar = useSkillsStore((state) => state.toggleSidebar);\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tonClick={toggleSidebar}\n\t\t\tclassName={`relative h-14 w-full transition-colors touch-manipulation flex items-center justify-center border-r-2 ${\n\t\t\t\tisExpanded\n\t\t\t\t\t? 'bg-muted border-primary'\n\t\t\t\t\t: 'border-transparent hover:bg-muted/50'\n\t\t\t}`}\n\t\t\ttitle=\"Skills\"\n\t\t>\n\t\t\t<Sparkles className=\"w-5 h-5 text-muted-foreground mx-auto\" />\n\t\t</button>\n\t);\n});\n",
167
+ "import { memo, useEffect } from 'react';\nimport { X } from 'lucide-react';\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport {\n\tprism,\n\tvscDarkPlus,\n} from 'react-syntax-highlighter/dist/esm/styles/prism';\nimport { useSkillsStore } from '../../stores/skillsStore';\nimport { useSkillDetail, useSkillFileContent } from '../../hooks/useSkills';\nimport { Button } from '../ui/Button';\n\nconst LANGUAGE_MAP: Record<string, string> = {\n\tjs: 'javascript',\n\tjsx: 'jsx',\n\tts: 'typescript',\n\ttsx: 'tsx',\n\tpy: 'python',\n\trb: 'ruby',\n\tgo: 'go',\n\trs: 'rust',\n\tjava: 'java',\n\tc: 'c',\n\tcpp: 'cpp',\n\th: 'c',\n\thpp: 'cpp',\n\tcs: 'csharp',\n\tphp: 'php',\n\tsh: 'bash',\n\tbash: 'bash',\n\tzsh: 'bash',\n\tsql: 'sql',\n\tjson: 'json',\n\tyaml: 'yaml',\n\tyml: 'yaml',\n\txml: 'xml',\n\thtml: 'html',\n\tcss: 'css',\n\tscss: 'scss',\n\tmd: 'markdown',\n\ttxt: 'plaintext',\n\ttoml: 'toml',\n};\n\nfunction inferLanguage(path: string): string {\n\tconst ext = path.split('.').pop()?.toLowerCase() ?? '';\n\treturn LANGUAGE_MAP[ext] ?? 'plaintext';\n}\n\nexport const SkillViewerPanel = memo(function SkillViewerPanel() {\n\tconst isViewerOpen = useSkillsStore((s) => s.isViewerOpen);\n\tconst viewingFile = useSkillsStore((s) => s.viewingFile);\n\tconst selectedSkill = useSkillsStore((s) => s.selectedSkill);\n\tconst closeViewer = useSkillsStore((s) => s.closeViewer);\n\n\tconst { data: skillDetail } = useSkillDetail(selectedSkill);\n\tconst { data: fileData, isLoading: fileLoading } = useSkillFileContent(\n\t\tselectedSkill,\n\t\tviewingFile,\n\t);\n\n\tconst isMainFile = viewingFile === null;\n\tconst content = isMainFile ? skillDetail?.content : fileData?.content;\n\tconst isLoading = isMainFile ? !skillDetail : fileLoading;\n\tconst displayPath = isMainFile ? 'SKILL.md' : (viewingFile ?? '');\n\tconst language = inferLanguage(displayPath);\n\n\tuseEffect(() => {\n\t\tconst handleEscape = (e: KeyboardEvent) => {\n\t\t\tconst target = e.target as HTMLElement;\n\t\t\tconst isInInput =\n\t\t\t\ttarget.tagName === 'INPUT' ||\n\t\t\t\ttarget.tagName === 'TEXTAREA' ||\n\t\t\t\ttarget.isContentEditable;\n\t\t\tif (\n\t\t\t\t(e.key === 'Escape' || (e.key === 'q' && !isInInput)) &&\n\t\t\t\tisViewerOpen\n\t\t\t) {\n\t\t\t\tcloseViewer();\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener('keydown', handleEscape);\n\t\treturn () => document.removeEventListener('keydown', handleEscape);\n\t}, [isViewerOpen, closeViewer]);\n\n\tif (!isViewerOpen || !selectedSkill) return null;\n\n\tconst syntaxTheme = document?.documentElement.classList.contains('dark')\n\t\t? vscDarkPlus\n\t\t: prism;\n\n\treturn (\n\t\t<div className=\"absolute inset-0 bg-background z-50 flex flex-col animate-in slide-in-from-left duration-300\">\n\t\t\t<div className=\"h-14 border-b border-border px-4 flex items-center gap-3\">\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tonClick={closeViewer}\n\t\t\t\t\ttitle=\"Close viewer (ESC)\"\n\t\t\t\t>\n\t\t\t\t\t<X className=\"w-4 h-4\" />\n\t\t\t\t</Button>\n\t\t\t\t<div className=\"flex-1 flex items-center gap-2 min-w-0\">\n\t\t\t\t\t<span className=\"text-xs text-muted-foreground flex-shrink-0\">\n\t\t\t\t\t\t{selectedSkill}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"text-xs text-muted-foreground\">/</span>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName=\"text-sm font-medium text-foreground font-mono truncate\"\n\t\t\t\t\t\ttitle={displayPath}\n\t\t\t\t\t>\n\t\t\t\t\t\t{displayPath}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<span className=\"text-xs text-muted-foreground\">{language}</span>\n\t\t\t</div>\n\n\t\t\t<div className=\"flex-1 overflow-auto\">\n\t\t\t\t{isLoading ? (\n\t\t\t\t\t<div className=\"h-full flex items-center justify-center text-muted-foreground\">\n\t\t\t\t\t\tLoading...\n\t\t\t\t\t</div>\n\t\t\t\t) : content ? (\n\t\t\t\t\t<div className=\"code-with-line-numbers\">\n\t\t\t\t\t\t<SyntaxHighlighter\n\t\t\t\t\t\t\tlanguage={language}\n\t\t\t\t\t\t\tstyle={syntaxTheme}\n\t\t\t\t\t\t\twrapLines\n\t\t\t\t\t\t\twrapLongLines\n\t\t\t\t\t\t\tlineProps={() => ({\n\t\t\t\t\t\t\t\tclassName: 'code-line',\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\tcustomStyle={{\n\t\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\t\tpadding: '1rem',\n\t\t\t\t\t\t\t\tbackground: 'transparent',\n\t\t\t\t\t\t\t\tfontSize: '0.75rem',\n\t\t\t\t\t\t\t\tlineHeight: '1.25rem',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tcodeTagProps={{\n\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{content}\n\t\t\t\t\t\t</SyntaxHighlighter>\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"h-full flex items-center justify-center text-muted-foreground\">\n\t\t\t\t\t\tUnable to load file\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n});\n",
168
+ "import { memo, useCallback } from 'react';\nimport {\n\tChevronRight,\n\tChevronDown,\n\tFolderOpen,\n\tFolder,\n\tFileCode,\n\tFolderTree,\n\tRefreshCw,\n} from 'lucide-react';\nimport { useFileBrowserStore } from '../../stores/fileBrowserStore';\nimport { usePanelWidthStore } from '../../stores/panelWidthStore';\nimport { useFileTree } from '../../hooks/useFileBrowser';\nimport { Button } from '../ui/Button';\nimport { ResizeHandle } from '../ui/ResizeHandle';\n\nconst PANEL_KEY = 'file-browser';\nconst DEFAULT_WIDTH = 320;\nconst MIN_WIDTH = 280;\nconst MAX_WIDTH = 600;\n\nfunction TreeDirectory({ dirPath }: { dirPath: string }) {\n\tconst expandedDirs = useFileBrowserStore((s) => s.expandedDirs);\n\tconst isExpanded = expandedDirs.has(dirPath);\n\n\tconst { data, isLoading } = useFileTree(dirPath, isExpanded);\n\n\tif (!isExpanded) return null;\n\tif (isLoading) {\n\t\treturn (\n\t\t\t<div className=\"pl-4 py-1 text-xs text-muted-foreground\">Loading...</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"pl-3\">\n\t\t\t{data?.items.map((item) => (\n\t\t\t\t<TreeItem\n\t\t\t\t\tkey={item.path}\n\t\t\t\t\tname={item.name}\n\t\t\t\t\tpath={item.path}\n\t\t\t\t\ttype={item.type}\n\t\t\t\t\tgitignored={item.gitignored}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</div>\n\t);\n}\n\nfunction TreeItem({\n\tname,\n\tpath,\n\ttype,\n\tgitignored,\n}: {\n\tname: string;\n\tpath: string;\n\ttype: 'file' | 'directory';\n\tgitignored?: boolean;\n}) {\n\tconst expandedDirs = useFileBrowserStore((s) => s.expandedDirs);\n\tconst toggleDir = useFileBrowserStore((s) => s.toggleDir);\n\tconst openFile = useFileBrowserStore((s) => s.openFile);\n\tconst selectedFile = useFileBrowserStore((s) => s.selectedFile);\n\tconst isExpanded = expandedDirs.has(path);\n\tconst isSelected = selectedFile === path;\n\n\tconst handleClick = useCallback(() => {\n\t\tif (type === 'directory') {\n\t\t\ttoggleDir(path);\n\t\t} else {\n\t\t\topenFile(path);\n\t\t}\n\t}, [type, path, toggleDir, openFile]);\n\n\treturn (\n\t\t<div>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={handleClick}\n\t\t\t\tclassName={`w-full text-left flex items-center gap-1.5 px-2 py-1 text-sm hover:bg-muted/50 rounded transition-colors ${\n\t\t\t\t\tisSelected ? 'bg-muted text-foreground' : 'text-foreground/80'\n\t\t\t\t} ${gitignored ? 'opacity-40' : ''}`}\n\t\t\t>\n\t\t\t\t{type === 'directory' ? (\n\t\t\t\t\t<>\n\t\t\t\t\t\t{isExpanded ? (\n\t\t\t\t\t\t\t<ChevronDown className=\"w-3 h-3 text-muted-foreground flex-shrink-0\" />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<ChevronRight className=\"w-3 h-3 text-muted-foreground flex-shrink-0\" />\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{isExpanded ? (\n\t\t\t\t\t\t\t<FolderOpen className=\"w-3.5 h-3.5 text-blue-500 flex-shrink-0\" />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<Folder className=\"w-3.5 h-3.5 text-blue-500 flex-shrink-0\" />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</>\n\t\t\t\t) : (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<span className=\"w-3 flex-shrink-0\" />\n\t\t\t\t\t\t<FileCode className=\"w-3.5 h-3.5 text-muted-foreground flex-shrink-0\" />\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t<span className=\"truncate\">{name}</span>\n\t\t\t</button>\n\t\t\t{type === 'directory' && <TreeDirectory dirPath={path} />}\n\t\t</div>\n\t);\n}\n\nexport const FileBrowserSidebar = memo(function FileBrowserSidebar() {\n\tconst isExpanded = useFileBrowserStore((s) => s.isExpanded);\n\tconst collapseSidebar = useFileBrowserStore((s) => s.collapseSidebar);\n\tconst panelWidth = usePanelWidthStore(\n\t\t(s) => s.widths[PANEL_KEY] ?? DEFAULT_WIDTH,\n\t);\n\n\tconst { data: rootData, isLoading, refetch } = useFileTree('.');\n\n\tif (!isExpanded) return null;\n\n\treturn (\n\t\t<div\n\t\t\tclassName=\"border-l border-border bg-background flex h-full relative\"\n\t\t\tstyle={{ width: panelWidth }}\n\t\t>\n\t\t\t<ResizeHandle\n\t\t\t\tpanelKey={PANEL_KEY}\n\t\t\t\tside=\"right\"\n\t\t\t\tminWidth={MIN_WIDTH}\n\t\t\t\tmaxWidth={MAX_WIDTH}\n\t\t\t\tdefaultWidth={DEFAULT_WIDTH}\n\t\t\t/>\n\t\t\t<div className=\"flex-1 flex flex-col h-full min-w-0\">\n\t\t\t\t<div className=\"h-14 border-b border-border px-3 flex items-center justify-between shrink-0\">\n\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t<FolderTree className=\"w-4 h-4 text-muted-foreground\" />\n\t\t\t\t\t\t<span className=\"font-medium\">Files</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<Button variant=\"ghost\" size=\"icon\" onClick={collapseSidebar}>\n\t\t\t\t\t\t<ChevronRight className=\"w-4 h-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"flex-1 overflow-y-auto p-1\">\n\t\t\t\t\t{isLoading ? (\n\t\t\t\t\t\t<div className=\"p-4 text-sm text-muted-foreground\">\n\t\t\t\t\t\t\tLoading file tree...\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : !rootData || rootData.items.length === 0 ? (\n\t\t\t\t\t\t<div className=\"p-4 text-sm text-muted-foreground\">\n\t\t\t\t\t\t\tNo files found\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\trootData.items.map((item) => (\n\t\t\t\t\t\t\t<TreeItem\n\t\t\t\t\t\t\t\tkey={item.path}\n\t\t\t\t\t\t\t\tname={item.name}\n\t\t\t\t\t\t\t\tpath={item.path}\n\t\t\t\t\t\t\t\ttype={item.type}\n\t\t\t\t\t\t\t\tgitignored={item.gitignored}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t))\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"h-12 px-4 border-t border-border text-xs text-muted-foreground flex items-center justify-between gap-2\">\n\t\t\t\t\t<div className=\"flex items-center gap-2 min-w-0 flex-1\">\n\t\t\t\t\t\t<FolderTree className=\"w-3 h-3 flex-shrink-0\" />\n\t\t\t\t\t\t<span className=\"truncate\">Project Files</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tonClick={() => refetch()}\n\t\t\t\t\t\ttitle=\"Refresh file tree\"\n\t\t\t\t\t\tclassName=\"h-6 w-6 flex-shrink-0\"\n\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t>\n\t\t\t\t\t\t<RefreshCw\n\t\t\t\t\t\t\tclassName={`w-3 h-3 ${isLoading ? 'animate-spin' : ''}`}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n});\n",
169
+ "import { memo } from 'react';\nimport { FolderTree } from 'lucide-react';\nimport { useFileBrowserStore } from '../../stores/fileBrowserStore';\n\nexport const FileBrowserSidebarToggle = memo(\n\tfunction FileBrowserSidebarToggle() {\n\t\tconst isExpanded = useFileBrowserStore((s) => s.isExpanded);\n\t\tconst toggleSidebar = useFileBrowserStore((s) => s.toggleSidebar);\n\n\t\treturn (\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tonClick={toggleSidebar}\n\t\t\t\tclassName={`relative h-14 w-full transition-colors touch-manipulation flex items-center justify-center border-r-2 ${\n\t\t\t\t\tisExpanded\n\t\t\t\t\t\t? 'bg-muted border-primary'\n\t\t\t\t\t\t: 'border-transparent hover:bg-muted/50'\n\t\t\t\t}`}\n\t\t\t\ttitle=\"Files\"\n\t\t\t>\n\t\t\t\t<FolderTree className=\"w-5 h-5 text-muted-foreground mx-auto\" />\n\t\t\t</button>\n\t\t);\n\t},\n);\n",
170
+ "import { memo, useEffect } from 'react';\nimport { X } from 'lucide-react';\nimport { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport {\n\tprism,\n\tvscDarkPlus,\n} from 'react-syntax-highlighter/dist/esm/styles/prism';\nimport { useFileBrowserStore } from '../../stores/fileBrowserStore';\nimport { useFileContent } from '../../hooks/useFileBrowser';\nimport { Button } from '../ui/Button';\n\nconst LANGUAGE_MAP: Record<string, string> = {\n\tjs: 'javascript',\n\tjsx: 'jsx',\n\tts: 'typescript',\n\ttsx: 'tsx',\n\tpy: 'python',\n\trb: 'ruby',\n\tgo: 'go',\n\trs: 'rust',\n\tjava: 'java',\n\tc: 'c',\n\tcpp: 'cpp',\n\th: 'c',\n\thpp: 'cpp',\n\tcs: 'csharp',\n\tphp: 'php',\n\tsh: 'bash',\n\tbash: 'bash',\n\tzsh: 'bash',\n\tsql: 'sql',\n\tjson: 'json',\n\tyaml: 'yaml',\n\tyml: 'yaml',\n\txml: 'xml',\n\thtml: 'html',\n\tcss: 'css',\n\tscss: 'scss',\n\tmd: 'markdown',\n\ttxt: 'plaintext',\n\tsvelte: 'svelte',\n\ttoml: 'toml',\n\tlock: 'plaintext',\n};\n\nfunction inferLanguage(path: string): string {\n\tconst ext = path.split('.').pop()?.toLowerCase() ?? '';\n\treturn LANGUAGE_MAP[ext] ?? 'plaintext';\n}\n\nexport const FileViewerPanel = memo(function FileViewerPanel() {\n\tconst isViewerOpen = useFileBrowserStore((s) => s.isViewerOpen);\n\tconst selectedFile = useFileBrowserStore((s) => s.selectedFile);\n\tconst closeViewer = useFileBrowserStore((s) => s.closeViewer);\n\n\tconst { data, isLoading } = useFileContent(selectedFile);\n\n\tuseEffect(() => {\n\t\tconst handleEscape = (e: KeyboardEvent) => {\n\t\t\tconst target = e.target as HTMLElement;\n\t\t\tconst isInInput =\n\t\t\t\ttarget.tagName === 'INPUT' ||\n\t\t\t\ttarget.tagName === 'TEXTAREA' ||\n\t\t\t\ttarget.isContentEditable;\n\t\t\tif (\n\t\t\t\t(e.key === 'Escape' || (e.key === 'q' && !isInInput)) &&\n\t\t\t\tisViewerOpen\n\t\t\t) {\n\t\t\t\tcloseViewer();\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener('keydown', handleEscape);\n\t\treturn () => document.removeEventListener('keydown', handleEscape);\n\t}, [isViewerOpen, closeViewer]);\n\n\tif (!isViewerOpen || !selectedFile) return null;\n\n\tconst syntaxTheme = document?.documentElement.classList.contains('dark')\n\t\t? vscDarkPlus\n\t\t: prism;\n\tconst language = inferLanguage(selectedFile);\n\n\treturn (\n\t\t<div className=\"absolute inset-0 bg-background z-50 flex flex-col animate-in slide-in-from-left duration-300\">\n\t\t\t<div className=\"h-14 border-b border-border px-4 flex items-center gap-3\">\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tonClick={closeViewer}\n\t\t\t\t\ttitle=\"Close file viewer (ESC)\"\n\t\t\t\t>\n\t\t\t\t\t<X className=\"w-4 h-4\" />\n\t\t\t\t</Button>\n\t\t\t\t<div className=\"flex-1 flex items-center gap-2 min-w-0\">\n\t\t\t\t\t<span\n\t\t\t\t\t\tclassName=\"text-sm font-medium text-foreground font-mono truncate\"\n\t\t\t\t\t\ttitle={selectedFile}\n\t\t\t\t\t>\n\t\t\t\t\t\t{selectedFile}\n\t\t\t\t\t</span>\n\t\t\t\t\t{data && (\n\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground flex-shrink-0\">\n\t\t\t\t\t\t\t{data.lineCount} lines\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t\t<span className=\"text-xs text-muted-foreground\">{language}</span>\n\t\t\t</div>\n\n\t\t\t<div className=\"flex-1 overflow-auto\">\n\t\t\t\t{isLoading ? (\n\t\t\t\t\t<div className=\"h-full flex items-center justify-center text-muted-foreground\">\n\t\t\t\t\t\tLoading file...\n\t\t\t\t\t</div>\n\t\t\t\t) : data ? (\n\t\t\t\t\t<div className=\"code-with-line-numbers\">\n\t\t\t\t\t\t<SyntaxHighlighter\n\t\t\t\t\t\t\tlanguage={language}\n\t\t\t\t\t\t\tstyle={syntaxTheme}\n\t\t\t\t\t\t\twrapLines\n\t\t\t\t\t\t\twrapLongLines\n\t\t\t\t\t\t\tlineProps={() => ({\n\t\t\t\t\t\t\t\tclassName: 'code-line',\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\tcustomStyle={{\n\t\t\t\t\t\t\t\tmargin: 0,\n\t\t\t\t\t\t\t\tpadding: '1rem',\n\t\t\t\t\t\t\t\tbackground: 'transparent',\n\t\t\t\t\t\t\t\tfontSize: '0.75rem',\n\t\t\t\t\t\t\t\tlineHeight: '1.25rem',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tcodeTagProps={{\n\t\t\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t\t\tflex: 1,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{data.content}\n\t\t\t\t\t\t</SyntaxHighlighter>\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"h-full flex items-center justify-center text-muted-foreground\">\n\t\t\t\t\t\tUnable to load file\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n});\n",
171
+ "import { memo, useState, useEffect, useRef, useCallback, useMemo } from 'react';\nimport { FileCode, Search } from 'lucide-react';\nimport { useFilePickerStore } from '../../stores/filePickerStore';\nimport { useFileBrowserStore } from '../../stores/fileBrowserStore';\nimport { useFiles } from '../../hooks/useFiles';\n\nfunction fuzzyMatch(\n\tquery: string,\n\ttarget: string,\n): { match: boolean; score: number } {\n\tconst q = query.toLowerCase();\n\tconst t = target.toLowerCase();\n\n\tif (q.length === 0) return { match: true, score: 0 };\n\tif (t.includes(q)) return { match: true, score: 100 - t.indexOf(q) };\n\n\tlet qi = 0;\n\tlet score = 0;\n\tlet lastMatchIdx = -1;\n\n\tfor (let ti = 0; ti < t.length && qi < q.length; ti++) {\n\t\tif (t[ti] === q[qi]) {\n\t\t\tscore += 10;\n\t\t\tif (lastMatchIdx === ti - 1) score += 5;\n\t\t\tif (ti === 0 || t[ti - 1] === '/' || t[ti - 1] === '.') score += 8;\n\t\t\tlastMatchIdx = ti;\n\t\t\tqi++;\n\t\t}\n\t}\n\n\treturn { match: qi === q.length, score };\n}\n\nexport const QuickFilePicker = memo(function QuickFilePicker() {\n\tconst isOpen = useFilePickerStore((s) => s.isOpen);\n\tconst close = useFilePickerStore((s) => s.close);\n\tconst openFile = useFileBrowserStore((s) => s.openFile);\n\tconst expandSidebar = useFileBrowserStore((s) => s.expandSidebar);\n\n\tconst [query, setQuery] = useState('');\n\tconst [selectedIndex, setSelectedIndex] = useState(0);\n\tconst inputRef = useRef<HTMLInputElement>(null);\n\tconst listRef = useRef<HTMLDivElement>(null);\n\n\tconst { data: filesData } = useFiles();\n\n\tconst ignoredSet = useMemo(\n\t\t() => new Set(filesData?.ignoredFiles ?? []),\n\t\t[filesData?.ignoredFiles],\n\t);\n\n\tconst filtered = useMemo(() => {\n\t\tif (!filesData?.files) return [];\n\t\tif (!query) return filesData.files.slice(0, 50);\n\n\t\tconst results = filesData.files\n\t\t\t.map((file) => ({ file, ...fuzzyMatch(query, file) }))\n\t\t\t.filter((r) => r.match)\n\t\t\t.sort((a, b) => b.score - a.score)\n\t\t\t.slice(0, 50);\n\n\t\treturn results.map((r) => r.file);\n\t}, [filesData?.files, query]);\n\n\tuseEffect(() => {\n\t\tif (isOpen) {\n\t\t\tsetQuery('');\n\t\t\tsetSelectedIndex(0);\n\t\t\tsetTimeout(() => inputRef.current?.focus(), 0);\n\t\t}\n\t}, [isOpen]);\n\n\tuseEffect(() => {\n\t\tconst item = listRef.current?.children[selectedIndex] as\n\t\t\t| HTMLElement\n\t\t\t| undefined;\n\t\titem?.scrollIntoView({ block: 'nearest' });\n\t}, [selectedIndex]);\n\n\tconst handleSelect = useCallback(\n\t\t(file: string) => {\n\t\t\texpandSidebar();\n\t\t\topenFile(file);\n\t\t\tclose();\n\t\t},\n\t\t[expandSidebar, openFile, close],\n\t);\n\n\tconst handleKeyDown = useCallback(\n\t\t(e: React.KeyboardEvent) => {\n\t\t\tif (e.key === 'ArrowDown' || (e.ctrlKey && e.key === 'j')) {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetSelectedIndex((i) => Math.min(i + 1, filtered.length - 1));\n\t\t\t} else if (e.key === 'ArrowUp' || (e.ctrlKey && e.key === 'k')) {\n\t\t\t\te.preventDefault();\n\t\t\t\tsetSelectedIndex((i) => Math.max(i - 1, 0));\n\t\t\t} else if (e.key === 'Enter' && filtered[selectedIndex]) {\n\t\t\t\te.preventDefault();\n\t\t\t\thandleSelect(filtered[selectedIndex]);\n\t\t\t} else if (e.key === 'Escape') {\n\t\t\t\te.preventDefault();\n\t\t\t\tclose();\n\t\t\t}\n\t\t},\n\t\t[filtered, selectedIndex, handleSelect, close],\n\t);\n\n\tconst handleBackdropClick = useCallback(\n\t\t(e: React.MouseEvent) => {\n\t\t\tif (e.target === e.currentTarget) close();\n\t\t},\n\t\t[close],\n\t);\n\n\tif (!isOpen) return null;\n\n\treturn (\n\t\t<div\n\t\t\trole=\"dialog\"\n\t\t\taria-modal=\"true\"\n\t\t\tclassName=\"fixed inset-0 bg-black/50 flex items-start justify-center z-[60] pt-[15vh]\"\n\t\t\tonClick={handleBackdropClick}\n\t\t\tonKeyDown={(e) => {\n\t\t\t\tif (e.key === 'Escape') close();\n\t\t\t}}\n\t\t>\n\t\t\t<div className=\"bg-background border border-border rounded-lg shadow-2xl w-full max-w-lg overflow-hidden\">\n\t\t\t\t<div className=\"flex items-center gap-2 px-3 border-b border-border\">\n\t\t\t\t\t<Search className=\"w-4 h-4 text-muted-foreground flex-shrink-0\" />\n\t\t\t\t\t<input\n\t\t\t\t\t\tref={inputRef}\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tvalue={query}\n\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\tsetQuery(e.target.value);\n\t\t\t\t\t\t\tsetSelectedIndex(0);\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t\tplaceholder=\"Search files by name...\"\n\t\t\t\t\t\tclassName=\"flex-1 bg-transparent py-3 text-sm text-foreground placeholder-muted-foreground outline-none\"\n\t\t\t\t\t/>\n\t\t\t\t\t<kbd className=\"text-[10px] text-muted-foreground bg-muted px-1.5 py-0.5 rounded border border-border font-mono\">\n\t\t\t\t\t\tESC\n\t\t\t\t\t</kbd>\n\t\t\t\t</div>\n\n\t\t\t\t<div ref={listRef} className=\"max-h-[40vh] overflow-y-auto\">\n\t\t\t\t\t{filtered.length === 0 ? (\n\t\t\t\t\t\t<div className=\"px-4 py-8 text-center text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t{query ? 'No matching files' : 'No files found'}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\tfiltered.map((file, idx) => {\n\t\t\t\t\t\t\tconst isIgnored = ignoredSet.has(file);\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={file}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={() => handleSelect(file)}\n\t\t\t\t\t\t\t\t\tclassName={`w-full text-left flex items-center gap-2 px-3 py-2 text-sm transition-colors ${\n\t\t\t\t\t\t\t\t\t\tidx === selectedIndex\n\t\t\t\t\t\t\t\t\t\t\t? 'bg-accent text-accent-foreground'\n\t\t\t\t\t\t\t\t\t\t\t: 'text-foreground/80 hover:bg-muted/50'\n\t\t\t\t\t\t\t\t\t} ${isIgnored ? 'opacity-40' : ''}`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<FileCode className=\"w-3.5 h-3.5 text-muted-foreground flex-shrink-0\" />\n\t\t\t\t\t\t\t\t\t<HighlightedPath path={file} query={query} />\n\t\t\t\t\t\t\t\t\t{isIgnored && (\n\t\t\t\t\t\t\t\t\t\t<span className=\"ml-auto text-[10px] text-muted-foreground italic\">\n\t\t\t\t\t\t\t\t\t\t\tignored\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{filtered.length > 0 && (\n\t\t\t\t\t<div className=\"px-3 py-2 border-t border-border text-xs text-muted-foreground flex items-center gap-3\">\n\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t<kbd className=\"bg-muted px-1 py-0.5 rounded border border-border font-mono\">\n\t\t\t\t\t\t\t\t↑↓\n\t\t\t\t\t\t\t</kbd>{' '}\n\t\t\t\t\t\t\tnavigate\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t<kbd className=\"bg-muted px-1 py-0.5 rounded border border-border font-mono\">\n\t\t\t\t\t\t\t\t↵\n\t\t\t\t\t\t\t</kbd>{' '}\n\t\t\t\t\t\t\topen\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className=\"ml-auto\">{filtered.length} files</span>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n});\n\nfunction HighlightedPath({ path, query }: { path: string; query: string }) {\n\tif (!query) {\n\t\treturn <span className=\"truncate font-mono text-xs\">{path}</span>;\n\t}\n\n\tconst lowerPath = path.toLowerCase();\n\tconst lowerQuery = query.toLowerCase();\n\tconst idx = lowerPath.indexOf(lowerQuery);\n\n\tif (idx >= 0) {\n\t\treturn (\n\t\t\t<span className=\"truncate font-mono text-xs\">\n\t\t\t\t{path.slice(0, idx)}\n\t\t\t\t<span className=\"text-primary font-semibold\">\n\t\t\t\t\t{path.slice(idx, idx + query.length)}\n\t\t\t\t</span>\n\t\t\t\t{path.slice(idx + query.length)}\n\t\t\t</span>\n\t\t);\n\t}\n\n\treturn <span className=\"truncate font-mono text-xs\">{path}</span>;\n}\n",
172
+ "import { create } from 'zustand';\n\ninterface FilePickerState {\n\tisOpen: boolean;\n\topen: () => void;\n\tclose: () => void;\n\ttoggle: () => void;\n}\n\nexport const useFilePickerStore = create<FilePickerState>((set) => ({\n\tisOpen: false,\n\topen: () => set({ isOpen: true }),\n\tclose: () => set({ isOpen: false }),\n\ttoggle: () => set((state) => ({ isOpen: !state.isOpen })),\n}));\n",
173
+ "import { memo } from 'react';\nimport { ProviderSetupStep } from './steps/ProviderSetupStep';\nimport { DefaultsStep } from './steps/DefaultsStep';\nimport { useOnboardingStore } from '../../stores/onboardingStore';\nimport { useSetuStore } from '../../stores/setuStore';\nimport { useAuthStatus } from '../../hooks/useAuthStatus';\n\ninterface OnboardingModalProps {\n\thideHeader?: boolean;\n}\n\nexport const OnboardingModal = memo(function OnboardingModal({\n\thideHeader = false,\n}: OnboardingModalProps) {\n\tconst isOpen = useOnboardingStore((s) => s.isOpen);\n\tconst currentStep = useOnboardingStore((s) => s.currentStep);\n\tconst manageMode = useOnboardingStore((s) => s.manageMode);\n\tconst authStatus = useOnboardingStore((s) => s.authStatus);\n\tconst nextStep = useOnboardingStore((s) => s.nextStep);\n\tconst prevStep = useOnboardingStore((s) => s.prevStep);\n\tconst reset = useOnboardingStore((s) => s.reset);\n\tconst openTopupModal = useSetuStore((s) => s.openTopupModal);\n\n\tconst {\n\t\tsetupWallet,\n\t\timportWallet,\n\t\taddProvider,\n\t\tremoveProvider,\n\t\tcompleteOnboarding,\n\t\tstartOAuth,\n\t\tstartOAuthManual,\n\t\texchangeOAuthCode,\n\t\tstartCopilotDeviceFlow,\n\t\tpollCopilotDeviceFlow,\n\t\tgetCopilotAuthMethods,\n\t\tsaveCopilotToken,\n\t\timportCopilotTokenFromGh,\n\t\tgetCopilotDiagnostics,\n\t} = useAuthStatus();\n\n\tif (!isOpen || !authStatus) return null;\n\n\treturn (\n\t\t<div className=\"fixed inset-0 z-[9999] bg-background text-foreground overflow-y-auto\">\n\t\t\t{currentStep === 'wallet' && (\n\t\t\t\t<ProviderSetupStep\n\t\t\t\t\tauthStatus={authStatus}\n\t\t\t\t\tonSetupWallet={setupWallet}\n\t\t\t\t\tonImportWallet={importWallet}\n\t\t\t\t\tonAddProvider={addProvider}\n\t\t\t\t\tonRemoveProvider={removeProvider}\n\t\t\t\t\tonStartOAuth={startOAuth}\n\t\t\t\t\tonStartOAuthManual={startOAuthManual}\n\t\t\t\t\tonExchangeOAuthCode={exchangeOAuthCode}\n\t\t\t\t\tonOpenTopup={openTopupModal}\n\t\t\t\t\tonNext={nextStep}\n\t\t\t\t\tmanageMode={manageMode}\n\t\t\t\t\tonClose={reset}\n\t\t\t\t\thideHeader={hideHeader}\n\t\t\t\t\tonStartCopilotDeviceFlow={startCopilotDeviceFlow}\n\t\t\t\t\tonPollCopilotDeviceFlow={pollCopilotDeviceFlow}\n\t\t\t\t\tonGetCopilotAuthMethods={getCopilotAuthMethods}\n\t\t\t\t\tonSaveCopilotToken={saveCopilotToken}\n\t\t\t\t\tonImportCopilotTokenFromGh={importCopilotTokenFromGh}\n\t\t\t\t\tonGetCopilotDiagnostics={getCopilotDiagnostics}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{currentStep === 'defaults' && (\n\t\t\t\t<DefaultsStep\n\t\t\t\t\tauthStatus={authStatus}\n\t\t\t\t\tonComplete={completeOnboarding}\n\t\t\t\t\tonBack={prevStep}\n\t\t\t\t\thideHeader={hideHeader}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n",
174
+ "import { memo, useEffect, useState, useRef } from 'react';\nimport {\n\tCopy,\n\tCheck,\n\tCreditCard,\n\tLoader2,\n\tX,\n\tKey,\n\tExternalLink,\n\tArrowRight,\n\tRefreshCw,\n} from 'lucide-react';\nimport { QRCodeSVG } from 'qrcode.react';\nimport { ProviderLogo } from '../../common/ProviderLogo';\nimport type { AuthStatus } from '../../../stores/onboardingStore';\nimport { useSetuStore } from '../../../stores/setuStore';\nimport { useSetuBalance } from '../../../hooks/useSetuBalance';\nimport { openUrl } from '../../../lib/open-url';\n\ninterface ProviderSetupStepProps {\n\tauthStatus: AuthStatus;\n\tonSetupWallet: () => Promise<unknown>;\n\tonImportWallet: (privateKey: string) => Promise<unknown>;\n\tonAddProvider: (provider: string, apiKey: string) => Promise<unknown>;\n\tonRemoveProvider: (provider: string) => Promise<unknown>;\n\tonStartOAuth: (provider: string, mode?: string) => Window | null;\n\tonStartOAuthManual: (\n\t\tprovider: string,\n\t\tmode?: string,\n\t) => Promise<{ popup: Window | null; sessionId: string }>;\n\tonExchangeOAuthCode: (\n\t\tprovider: string,\n\t\tcode: string,\n\t\tsessionId: string,\n\t) => Promise<boolean>;\n\tonOpenTopup: () => void;\n\tonNext: () => void;\n\tmanageMode?: boolean;\n\tonClose?: () => void;\n\thideHeader?: boolean;\n\tonStartCopilotDeviceFlow?: () => Promise<{\n\t\tsessionId: string;\n\t\tuserCode: string;\n\t\tverificationUri: string;\n\t\tinterval: number;\n\t}>;\n\tonPollCopilotDeviceFlow?: (\n\t\tsessionId: string,\n\t) => Promise<{ status: 'complete' | 'pending' | 'error'; error?: string }>;\n\tonGetCopilotAuthMethods?: () => Promise<{\n\t\toauth: boolean;\n\t\ttoken: boolean;\n\t\tghImport: { available: boolean; authenticated: boolean; reason?: string };\n\t}>;\n\tonSaveCopilotToken?: (token: string) => Promise<{\n\t\tsuccess: boolean;\n\t\tprovider: string;\n\t\tsource: 'token';\n\t\tmodelCount: number;\n\t\thasGpt52Codex: boolean;\n\t\tsampleModels: string[];\n\t}>;\n\tonImportCopilotTokenFromGh?: () => Promise<{\n\t\tsuccess: boolean;\n\t\tprovider: string;\n\t\tsource: 'gh';\n\t\tmodelCount: number;\n\t\thasGpt52Codex: boolean;\n\t\tsampleModels: string[];\n\t}>;\n\tonGetCopilotDiagnostics?: () => Promise<{\n\t\ttokenSources: Array<{\n\t\t\tsource: 'env' | 'stored';\n\t\t\tconfigured: boolean;\n\t\t\tmodelCount?: number;\n\t\t\thasGpt52Codex?: boolean;\n\t\t\trestrictedByOrgPolicy?: boolean;\n\t\t\trestrictedOrg?: string;\n\t\t\terror?: string;\n\t\t}>;\n\t\tmethods: {\n\t\t\toauth: boolean;\n\t\t\ttoken: boolean;\n\t\t\tghImport: { available: boolean; authenticated: boolean; reason?: string };\n\t\t};\n\t}>;\n}\n\nexport const ProviderSetupStep = memo(function ProviderSetupStep({\n\tauthStatus,\n\tonSetupWallet,\n\tonImportWallet,\n\tonAddProvider,\n\tonRemoveProvider,\n\tonStartOAuth,\n\tonStartOAuthManual,\n\tonExchangeOAuthCode,\n\tonOpenTopup,\n\tonNext,\n\tmanageMode = false,\n\tonClose,\n\thideHeader = false,\n\tonStartCopilotDeviceFlow,\n\tonPollCopilotDeviceFlow,\n\tonGetCopilotAuthMethods,\n\tonSaveCopilotToken,\n\tonImportCopilotTokenFromGh,\n\tonGetCopilotDiagnostics,\n}: ProviderSetupStepProps) {\n\tconst [copied, setCopied] = useState(false);\n\tconst [isSettingUp, setIsSettingUp] = useState(false);\n\tconst [isImportModalOpen, setIsImportModalOpen] = useState(false);\n\tconst [importPrivateKey, setImportPrivateKey] = useState('');\n\tconst [isImportingWallet, setIsImportingWallet] = useState(false);\n\tconst [importWalletError, setImportWalletError] = useState<string | null>(\n\t\tnull,\n\t);\n\tconst [addingProvider, setAddingProvider] = useState<string | null>(null);\n\tconst [apiKeyInput, setApiKeyInput] = useState('');\n\tconst [removingProvider, setRemovingProvider] = useState<string | null>(null);\n\tconst [confirmingDelete, setConfirmingDelete] = useState<string | null>(null);\n\tconst [oauthSession, setOauthSession] = useState<{\n\t\tprovider: string;\n\t\tsessionId: string | null;\n\t\tmode?: string;\n\t} | null>(null);\n\tconst [oauthCodeInput, setOauthCodeInput] = useState('');\n\tconst [isExchangingCode, setIsExchangingCode] = useState(false);\n\tconst [isOpeningPopup, setIsOpeningPopup] = useState(false);\n\tconst [copilotDevice, setCopilotDevice] = useState<{\n\t\tsessionId: string;\n\t\tuserCode: string;\n\t\tverificationUri: string;\n\t\tinterval: number;\n\t} | null>(null);\n\tconst [copilotPolling, setCopilotPolling] = useState(false);\n\tconst [copilotError, setCopilotError] = useState<string | null>(null);\n\tconst [copilotAuthMode, setCopilotAuthMode] = useState<'oauth' | 'token'>(\n\t\t'oauth',\n\t);\n\tconst [copilotTokenInput, setCopilotTokenInput] = useState('');\n\tconst [copilotTokenSaving, setCopilotTokenSaving] = useState(false);\n\tconst [copilotGhImporting, setCopilotGhImporting] = useState(false);\n\tconst [copilotAuthMethods, setCopilotAuthMethods] = useState<{\n\t\toauth: boolean;\n\t\ttoken: boolean;\n\t\tghImport: { available: boolean; authenticated: boolean; reason?: string };\n\t} | null>(null);\n\tconst [copilotDiagnostics, setCopilotDiagnostics] = useState<{\n\t\ttokenSources: Array<{\n\t\t\tsource: 'env' | 'stored';\n\t\t\tconfigured: boolean;\n\t\t\tmodelCount?: number;\n\t\t\thasGpt52Codex?: boolean;\n\t\t\trestrictedByOrgPolicy?: boolean;\n\t\t\trestrictedOrg?: string;\n\t\t\terror?: string;\n\t\t}>;\n\t} | null>(null);\n\tconst [copilotCodeCopied, setCopilotCodeCopied] = useState(false);\n\tconst [copilotModalOpen, setCopilotModalOpen] = useState(false);\n\tconst [copilotLoading, setCopilotLoading] = useState(false);\n\tconst copilotPollRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\tconst copilotCancelledRef = useRef(false);\n\tconst copilotPollFnRef = useRef(onPollCopilotDeviceFlow);\n\tcopilotPollFnRef.current = onPollCopilotDeviceFlow;\n\tconst balance = useSetuStore((s) => s.balance);\n\tconst usdcBalance = useSetuStore((s) => s.usdcBalance);\n\tconst payg = useSetuStore((s) => s.payg);\n\tconst subscription = useSetuStore((s) => s.subscription);\n\tconst isBalanceLoading = useSetuStore((s) => s.isLoading);\n\tconst apiKeyInputRef = useRef<HTMLInputElement>(null);\n\tconst oauthCodeInputRef = useRef<HTMLInputElement>(null);\n\tconst importPrivateKeyRef = useRef<HTMLTextAreaElement>(null);\n\tconst isTopupModalOpen = useSetuStore((s) => s.isTopupModalOpen);\n\tconst prevTopupModalOpen = useRef(false);\n\tconst { fetchBalance } = useSetuBalance('setu');\n\tconst effectivePayg = payg?.effectiveSpendableUsd ?? balance ?? 0;\n\tconst setuStatusLabel = subscription?.active\n\t\t? `GO ${(subscription.creditsRemaining ?? 0).toFixed(1)} credits`\n\t\t: `$${effectivePayg.toFixed(2)}`;\n\n\t// Refetch balance when topup modal closes\n\tuseEffect(() => {\n\t\tif (prevTopupModalOpen.current && !isTopupModalOpen) {\n\t\t\t// Modal was closed, refresh balance\n\t\t\tfetchBalance();\n\t\t}\n\t\tprevTopupModalOpen.current = isTopupModalOpen;\n\t}, [isTopupModalOpen, fetchBalance]);\n\n\tuseEffect(() => {\n\t\tif (!authStatus.setu.configured && !isSettingUp) {\n\t\t\tsetIsSettingUp(true);\n\t\t\tonSetupWallet().finally(() => setIsSettingUp(false));\n\t\t}\n\t}, [authStatus.setu.configured, onSetupWallet, isSettingUp]);\n\n\tuseEffect(() => {\n\t\tif (addingProvider && apiKeyInputRef.current) {\n\t\t\tapiKeyInputRef.current.focus();\n\t\t}\n\t}, [addingProvider]);\n\n\tuseEffect(() => {\n\t\tif (oauthSession && oauthCodeInputRef.current) {\n\t\t\toauthCodeInputRef.current.focus();\n\t\t}\n\t}, [oauthSession]);\n\n\tuseEffect(() => {\n\t\tif (isImportModalOpen && importPrivateKeyRef.current) {\n\t\t\timportPrivateKeyRef.current.focus();\n\t\t}\n\t}, [isImportModalOpen]);\n\n\tuseEffect(() => {\n\t\tif (!copilotPolling || !copilotDevice || !copilotPollFnRef.current) return;\n\t\tcopilotCancelledRef.current = false;\n\t\tconst pollIntervalMs = Math.max(\n\t\t\t(copilotDevice.interval || 5) * 1000 + 2000,\n\t\t\t7000,\n\t\t);\n\t\tconst schedulePoll = () => {\n\t\t\tcopilotPollRef.current = setTimeout(async () => {\n\t\t\t\tif (copilotCancelledRef.current) return;\n\t\t\t\ttry {\n\t\t\t\t\tconst pollFn = copilotPollFnRef.current;\n\t\t\t\t\tif (!pollFn) return;\n\t\t\t\t\tconst result = await pollFn(copilotDevice.sessionId);\n\t\t\t\t\tif (copilotCancelledRef.current) return;\n\t\t\t\t\tif (result.status === 'complete') {\n\t\t\t\t\t\tsetCopilotDevice(null);\n\t\t\t\t\t\tsetCopilotPolling(false);\n\t\t\t\t\t\tsetCopilotError(null);\n\t\t\t\t\t\tsetCopilotModalOpen(false);\n\t\t\t\t\t} else if (result.status === 'error') {\n\t\t\t\t\t\tsetCopilotError(result.error || 'Authorization failed');\n\t\t\t\t\t\tsetCopilotPolling(false);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tschedulePoll();\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\tif (!copilotCancelledRef.current) schedulePoll();\n\t\t\t\t}\n\t\t\t}, pollIntervalMs);\n\t\t};\n\t\tschedulePoll();\n\t\tconst timeout = setTimeout(() => {\n\t\t\tsetCopilotPolling(false);\n\t\t\tsetCopilotError('Authorization timed out. Please try again.');\n\t\t}, 300000);\n\t\treturn () => {\n\t\t\tcopilotCancelledRef.current = true;\n\t\t\tif (copilotPollRef.current) clearTimeout(copilotPollRef.current);\n\t\t\tclearTimeout(timeout);\n\t\t};\n\t}, [copilotPolling, copilotDevice]);\n\n\tconst handleCopy = async () => {\n\t\tif (authStatus.setu.publicKey) {\n\t\t\tawait navigator.clipboard.writeText(authStatus.setu.publicKey);\n\t\t\tsetCopied(true);\n\t\t\tsetTimeout(() => setCopied(false), 2000);\n\t\t}\n\t};\n\n\tconst truncateAddress = (addr: string) =>\n\t\t`${addr.slice(0, 8)}...${addr.slice(-6)}`;\n\n\tconst handleAddProvider = async (providerId: string) => {\n\t\tif (!apiKeyInput.trim()) return;\n\t\ttry {\n\t\t\tawait onAddProvider(providerId, apiKeyInput.trim());\n\t\t\tsetAddingProvider(null);\n\t\t\tsetApiKeyInput('');\n\t\t} catch {}\n\t};\n\n\tconst handleRemoveProvider = async (providerId: string) => {\n\t\tif (confirmingDelete === providerId) {\n\t\t\tsetRemovingProvider(providerId);\n\t\t\ttry {\n\t\t\t\tawait onRemoveProvider(providerId);\n\t\t\t} finally {\n\t\t\t\tsetRemovingProvider(null);\n\t\t\t\tsetConfirmingDelete(null);\n\t\t\t}\n\t\t} else {\n\t\t\tsetConfirmingDelete(providerId);\n\t\t}\n\t};\n\n\tconst handleCancelDelete = () => {\n\t\tsetConfirmingDelete(null);\n\t};\n\n\tconst startCopilotDeviceAuthorization = () => {\n\t\tif (!onStartCopilotDeviceFlow) return;\n\t\tsetCopilotLoading(true);\n\t\tsetCopilotError(null);\n\t\tonStartCopilotDeviceFlow()\n\t\t\t.then((data) => {\n\t\t\t\tsetCopilotDevice(data);\n\t\t\t\tsetCopilotLoading(false);\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tsetCopilotError(\n\t\t\t\t\terr instanceof Error ? err.message : 'Failed to start device flow',\n\t\t\t\t);\n\t\t\t\tsetCopilotLoading(false);\n\t\t\t});\n\t};\n\n\tconst handleStartOAuth = async (providerId: string, mode?: string) => {\n\t\tif (providerId === 'anthropic') {\n\t\t\tsetOauthSession({ provider: providerId, sessionId: null, mode });\n\t\t} else if (providerId === 'copilot') {\n\t\t\tsetCopilotAuthMode('oauth');\n\t\t\tsetCopilotTokenInput('');\n\t\t\tsetCopilotDiagnostics(null);\n\t\t\tsetCopilotAuthMethods(null);\n\t\t\tsetCopilotPolling(false);\n\t\t\tsetCopilotDevice(null);\n\t\t\tsetCopilotError(null);\n\t\t\tsetCopilotModalOpen(true);\n\n\t\t\tif (onGetCopilotAuthMethods) {\n\t\t\t\tonGetCopilotAuthMethods()\n\t\t\t\t\t.then((methods) => setCopilotAuthMethods(methods))\n\t\t\t\t\t.catch(() => {});\n\t\t\t}\n\n\t\t\tif (onGetCopilotDiagnostics) {\n\t\t\t\tonGetCopilotDiagnostics()\n\t\t\t\t\t.then((diagnostics) => setCopilotDiagnostics(diagnostics))\n\t\t\t\t\t.catch(() => {});\n\t\t\t}\n\n\t\t\tstartCopilotDeviceAuthorization();\n\t\t} else {\n\t\t\tonStartOAuth(providerId, mode);\n\t\t}\n\t};\n\n\tconst handleOpenPopup = async () => {\n\t\tif (!oauthSession) return;\n\t\tsetIsOpeningPopup(true);\n\t\ttry {\n\t\t\tconst { sessionId } = await onStartOAuthManual(\n\t\t\t\toauthSession.provider,\n\t\t\t\toauthSession.mode,\n\t\t\t);\n\t\t\tsetOauthSession({ ...oauthSession, sessionId });\n\t\t} catch (err) {\n\t\t\tconsole.error('Failed to start OAuth:', err);\n\t\t}\n\t\tsetIsOpeningPopup(false);\n\t};\n\n\tconst handleExchangeCode = async () => {\n\t\tif (!oauthSession || !oauthSession.sessionId || !oauthCodeInput.trim())\n\t\t\treturn;\n\t\tsetIsExchangingCode(true);\n\t\ttry {\n\t\t\tawait onExchangeOAuthCode(\n\t\t\t\toauthSession.provider,\n\t\t\t\toauthCodeInput.trim(),\n\t\t\t\toauthSession.sessionId,\n\t\t\t);\n\t\t\tsetOauthSession(null);\n\t\t\tsetOauthCodeInput('');\n\t\t} catch {}\n\t\tsetIsExchangingCode(false);\n\t};\n\n\tconst handleCancelOAuth = () => {\n\t\tsetOauthSession(null);\n\t\tsetOauthCodeInput('');\n\t};\n\n\tconst handleCopilotOpenGithub = () => {\n\t\tif (!copilotDevice) return;\n\t\topenUrl(copilotDevice.verificationUri);\n\t\tsetCopilotPolling(true);\n\t};\n\n\tconst handleCopilotSwitchMode = (mode: 'oauth' | 'token') => {\n\t\tsetCopilotAuthMode(mode);\n\t\tsetCopilotError(null);\n\t\tif (mode === 'token') {\n\t\t\tsetCopilotPolling(false);\n\t\t}\n\t\tif (mode === 'oauth' && !copilotDevice && !copilotLoading) {\n\t\t\tstartCopilotDeviceAuthorization();\n\t\t}\n\t};\n\n\tconst handleCopilotSaveToken = async () => {\n\t\tif (!copilotTokenInput.trim() || !onSaveCopilotToken) return;\n\t\tsetCopilotTokenSaving(true);\n\t\tsetCopilotError(null);\n\t\ttry {\n\t\t\tawait onSaveCopilotToken(copilotTokenInput.trim());\n\t\t\thandleCancelCopilot();\n\t\t} catch (err) {\n\t\t\tsetCopilotError(\n\t\t\t\terr instanceof Error ? err.message : 'Failed to save Copilot token',\n\t\t\t);\n\t\t} finally {\n\t\t\tsetCopilotTokenSaving(false);\n\t\t}\n\t};\n\n\tconst handleCopilotImportFromGh = async () => {\n\t\tif (!onImportCopilotTokenFromGh) return;\n\t\tsetCopilotGhImporting(true);\n\t\tsetCopilotError(null);\n\t\ttry {\n\t\t\tawait onImportCopilotTokenFromGh();\n\t\t\thandleCancelCopilot();\n\t\t} catch (err) {\n\t\t\tsetCopilotError(\n\t\t\t\terr instanceof Error\n\t\t\t\t\t? err.message\n\t\t\t\t\t: 'Failed to import token from GitHub CLI',\n\t\t\t);\n\t\t} finally {\n\t\t\tsetCopilotGhImporting(false);\n\t\t}\n\t};\n\n\tconst handleCopilotCopyCode = async () => {\n\t\tif (!copilotDevice) return;\n\t\tawait navigator.clipboard.writeText(copilotDevice.userCode);\n\t\tsetCopilotCodeCopied(true);\n\t\tsetTimeout(() => setCopilotCodeCopied(false), 2000);\n\t};\n\n\tconst handleCancelCopilot = () => {\n\t\tsetCopilotDevice(null);\n\t\tsetCopilotPolling(false);\n\t\tsetCopilotError(null);\n\t\tsetCopilotTokenInput('');\n\t\tsetCopilotTokenSaving(false);\n\t\tsetCopilotGhImporting(false);\n\t\tsetCopilotAuthMode('oauth');\n\t\tsetCopilotCodeCopied(false);\n\t\tsetCopilotModalOpen(false);\n\t\tsetCopilotLoading(false);\n\t\tcopilotCancelledRef.current = true;\n\t\tif (copilotPollRef.current) {\n\t\t\tclearTimeout(copilotPollRef.current);\n\t\t\tcopilotPollRef.current = undefined;\n\t\t}\n\t};\n\n\tconst handleOpenImportWallet = () => {\n\t\tsetImportWalletError(null);\n\t\tsetImportPrivateKey('');\n\t\tsetIsImportModalOpen(true);\n\t};\n\n\tconst handleCloseImportWallet = () => {\n\t\tif (isImportingWallet) return;\n\t\tsetIsImportModalOpen(false);\n\t\tsetImportWalletError(null);\n\t\tsetImportPrivateKey('');\n\t};\n\n\tconst handleImportWallet = async () => {\n\t\tif (!importPrivateKey.trim() || isImportingWallet) return;\n\t\tsetIsImportingWallet(true);\n\t\tsetImportWalletError(null);\n\t\ttry {\n\t\t\tawait onImportWallet(importPrivateKey.trim());\n\t\t\tsetIsImportModalOpen(false);\n\t\t\tsetImportPrivateKey('');\n\t\t\tfetchBalance();\n\t\t} catch (err) {\n\t\t\tsetImportWalletError(\n\t\t\t\terr instanceof Error ? err.message : 'Failed to import wallet',\n\t\t\t);\n\t\t} finally {\n\t\t\tsetIsImportingWallet(false);\n\t\t}\n\t};\n\n\tconst configuredProviders = Object.entries(authStatus.providers).filter(\n\t\t([id, info]) => info.configured && id !== 'setu',\n\t);\n\tconst unconfiguredProviders = Object.entries(authStatus.providers).filter(\n\t\t([id, info]) => !info.configured && id !== 'setu',\n\t);\n\n\treturn (\n\t\t<div className=\"min-h-screen flex flex-col\">\n\t\t\t{!hideHeader && (\n\t\t\t\t<div className=\"flex items-center justify-between px-4 sm:px-6 py-4 border-b border-border\">\n\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t<ProviderLogo provider=\"setu\" size={24} />\n\t\t\t\t\t\t<span className=\"font-semibold text-foreground\">otto</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t{!manageMode && (\n\t\t\t\t\t\t<div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t<span className=\"w-2 h-2 rounded-full bg-green-500\" />\n\t\t\t\t\t\t\tStep 1 of 2\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Main Content */}\n\t\t\t<div\n\t\t\t\tclassName={`flex-1 px-4 sm:px-6 lg:px-12 pb-32 ${hideHeader ? 'pt-8 sm:pt-10 lg:pt-14' : 'pt-6 sm:pt-8 lg:pt-12'}`}\n\t\t\t>\n\t\t\t\t<div className=\"max-w-7xl mx-auto\">\n\t\t\t\t\t{/* Header */}\n\t\t\t\t\t<div className=\"mb-10\">\n\t\t\t\t\t\t<h1 className=\"text-2xl sm:text-3xl lg:text-4xl font-semibold text-foreground mb-3\">\n\t\t\t\t\t\t\t{manageMode ? 'Manage Providers' : 'Welcome to otto'}\n\t\t\t\t\t\t</h1>\n\t\t\t\t\t\t<p className=\"text-lg text-muted-foreground max-w-2xl\">\n\t\t\t\t\t\t\t{manageMode\n\t\t\t\t\t\t\t\t? 'Add or remove AI providers. Your changes are saved automatically.'\n\t\t\t\t\t\t\t\t: 'Setu is your default AI provider. GO plan credits are applied automatically.'}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div className=\"grid grid-cols-1 sm:grid-cols-3 gap-6 sm:gap-8\">\n\t\t\t\t\t\t{/* Left Column - Wallet */}\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<div className=\"bg-card rounded-2xl border border-border p-5\">\n\t\t\t\t\t\t\t\t{authStatus.setu.configured && authStatus.setu.publicKey ? (\n\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col h-full\">\n\t\t\t\t\t\t\t\t\t\t{/* Setu Default Provider Badge */}\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2 px-3 py-2 bg-green-500/10 border border-green-500/20 rounded-lg\">\n\t\t\t\t\t\t\t\t\t\t\t<ProviderLogo provider=\"setu\" size={16} />\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-sm font-medium text-green-600 dark:text-green-400\">\n\t\t\t\t\t\t\t\t\t\t\t\tSetu\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-xs text-green-600/60 dark:text-green-500/60 ml-auto\">\n\t\t\t\t\t\t\t\t\t\t\t\tDefault Provider\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex justify-center py-4 mt-4\">\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"bg-white p-2 rounded-lg\">\n\t\t\t\t\t\t\t\t\t\t\t\t<QRCodeSVG\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={authStatus.setu.publicKey}\n\t\t\t\t\t\t\t\t\t\t\t\t\tsize={140}\n\t\t\t\t\t\t\t\t\t\t\t\t\tlevel=\"M\"\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-2 mt-4\">\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={handleCopy}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-full flex items-center justify-center gap-2 px-3 py-2 bg-muted hover:bg-muted/80 rounded-lg text-xs font-mono text-muted-foreground transition-colors\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{truncateAddress(authStatus.setu.publicKey)}\n\t\t\t\t\t\t\t\t\t\t\t\t{copied ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Check className=\"w-3.5 h-3.5 text-green-500\" />\n\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Copy className=\"w-3.5 h-3.5 text-muted-foreground\" />\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-1.5 px-3 py-2 bg-muted/50 rounded-lg\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-between gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-1.5 min-w-0\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"font-mono text-xs sm:text-sm text-foreground truncate\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{setuStatusLabel}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={fetchBalance}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={isBalanceLoading}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"p-0.5 text-muted-foreground hover:text-foreground transition-colors disabled:opacity-50\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<RefreshCw\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={`w-3 h-3 ${isBalanceLoading ? 'animate-spin' : ''}`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-[10px] text-muted-foreground font-mono\">\n\t\t\t\t\t\t\t\t\t\t\t\t\tBalance ${(balance ?? 0).toFixed(2)} • On-chain{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t\t{(usdcBalance ?? 0).toFixed(2)} USDC\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t{/* OR Divider */}\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-4 py-4\">\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex-1 h-px bg-border\" />\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground font-medium\">\n\t\t\t\t\t\t\t\t\t\t\t\tOR\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex-1 h-px bg-border\" />\n\t\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={onOpenTopup}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-full flex items-center justify-center gap-2 px-4 py-2.5 bg-primary text-primary-foreground rounded-lg text-sm font-medium hover:bg-primary/90 transition-colors\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<CreditCard className=\"w-4 h-4\" />\n\t\t\t\t\t\t\t\t\t\t\tTop Up with Card\n\t\t\t\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={handleOpenImportWallet}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-full mt-2 flex items-center justify-center gap-2 px-4 py-2.5 border border-border text-foreground rounded-lg text-sm font-medium hover:bg-muted/50 transition-colors\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<Key className=\"w-4 h-4\" />\n\t\t\t\t\t\t\t\t\t\t\tImport Wallet\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-center py-16\">\n\t\t\t\t\t\t\t\t\t\t<Loader2 className=\"w-8 h-8 animate-spin text-muted-foreground\" />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Right Column - Providers */}\n\t\t\t\t\t\t<div className=\"sm:col-span-2 space-y-6\">\n\t\t\t\t\t\t\t{/* Connected Providers */}\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-between mb-4\">\n\t\t\t\t\t\t\t\t\t<h2 className=\"font-semibold text-foreground\">\n\t\t\t\t\t\t\t\t\t\tConnected Providers\n\t\t\t\t\t\t\t\t\t</h2>\n\t\t\t\t\t\t\t\t\t{configuredProviders.length > 0 && (\n\t\t\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t{configuredProviders.length} active\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t{configuredProviders.length === 0 ? (\n\t\t\t\t\t\t\t\t\t<div className=\"text-sm text-muted-foreground py-4\">\n\t\t\t\t\t\t\t\t\t\tNo providers connected yet. Add one below.\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<div className=\"flex flex-wrap gap-2\">\n\t\t\t\t\t\t\t\t\t\t{configuredProviders.map(([id, info]) => (\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\tkey={id}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={`flex items-center gap-2 pl-3 pr-2 py-2 rounded-full transition-all duration-200 ${\n\t\t\t\t\t\t\t\t\t\t\t\t\tconfirmingDelete === id\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'bg-destructive/10 border border-destructive/30'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'group bg-green-500/10 border border-green-500/20'\n\t\t\t\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<ProviderLogo provider={id} size={16} />\n\t\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={`text-sm font-medium transition-colors ${\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconfirmingDelete === id\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'text-destructive'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'text-green-600 dark:text-green-400'\n\t\t\t\t\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{info.label}\n\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t{confirmingDelete !== id && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-xs text-green-600/60 dark:text-green-500/60\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{info.type === 'oauth' ? 'OAuth' : 'API'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t{confirmingDelete === id ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-1 ml-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"text-xs text-destructive/80 mr-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tRemove?\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleRemoveProvider(id)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={removingProvider === id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"px-2 py-0.5 text-xs bg-destructive text-destructive-foreground rounded hover:bg-destructive/90 transition-colors disabled:opacity-50\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{removingProvider === id ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Loader2 className=\"w-3 h-3 animate-spin\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'Yes'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={handleCancelDelete}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"px-2 py-0.5 text-xs bg-muted text-muted-foreground rounded hover:bg-muted/80 transition-colors\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tNo\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\tid !== 'setu' && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleRemoveProvider(id)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"ml-1 p-1 text-green-600/40 dark:text-green-500/40 hover:text-green-600/80 dark:hover:text-green-500/80 opacity-0 group-hover:opacity-100 transition-opacity\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<X className=\"w-3 h-3\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t{/* Add Providers */}\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<h2 className=\"font-semibold text-foreground mb-4\">\n\t\t\t\t\t\t\t\t\tAdd Providers\n\t\t\t\t\t\t\t\t</h2>\n\t\t\t\t\t\t\t\t<div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3 items-start\">\n\t\t\t\t\t\t\t\t\t{unconfiguredProviders.map(([id, info]) => (\n\t\t\t\t\t\t\t\t\t\t<div key={id}>\n\t\t\t\t\t\t\t\t\t\t\t{addingProvider === id ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2 p-3 bg-card border border-ring rounded-xl overflow-hidden\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"shrink-0\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ProviderLogo provider={id} size={18} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tref={apiKeyInputRef}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={apiKeyInput}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonChange={(e) => setApiKeyInput(e.target.value)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tplaceholder={`${info.label} API key...`}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex-1 min-w-0 bg-transparent text-sm outline-none placeholder:text-muted-foreground text-foreground\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (e.key === 'Enter') handleAddProvider(id);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (e.key === 'Escape') {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetAddingProvider(null);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetApiKeyInput('');\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleAddProvider(id)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdisabled={!apiKeyInput.trim()}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"shrink-0 px-3 py-1.5 bg-primary text-primary-foreground text-sm font-medium rounded-lg disabled:opacity-50\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tAdd\n\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetAddingProvider(null);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetApiKeyInput('');\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"shrink-0 p-1.5 text-muted-foreground hover:text-foreground\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<X className=\"w-4 h-4\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-between p-3 bg-card border border-border hover:border-border/80 rounded-xl transition-colors gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-3 min-w-0\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ProviderLogo provider={id} size={20} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"min-w-0\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"font-medium text-foreground truncate\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{info.label}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{info.modelCount} models\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{id !== 'copilot' && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => setAddingProvider(id)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 px-3 py-1.5 text-sm text-muted-foreground hover:text-foreground hover:bg-muted rounded-lg transition-colors\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Key className=\"w-3.5 h-3.5\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tAPI\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{info.supportsOAuth && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\thandleStartOAuth(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tid === 'anthropic' ? 'max' : undefined,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-1.5 px-3 py-1.5 text-sm text-muted-foreground hover:text-foreground hover:bg-muted rounded-lg transition-colors\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ExternalLink className=\"w-3.5 h-3.5\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{id === 'anthropic'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'Pro'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: id === 'copilot'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'Login'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'OAuth'}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Bottom Bar */}\n\t\t\t<div className=\"fixed bottom-0 left-0 right-0 px-4 sm:px-6 py-4 border-t border-border bg-background\">\n\t\t\t\t<div className=\"max-w-7xl mx-auto flex items-center justify-between\">\n\t\t\t\t\t{!manageMode && (\n\t\t\t\t\t\t<div className=\"text-xs sm:text-sm text-muted-foreground hidden sm:block\">\n\t\t\t\t\t\t\tYou can add more providers later in settings\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t{manageMode ? (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-2 px-6 py-3 bg-primary text-primary-foreground rounded-lg font-medium hover:bg-primary/90 transition-colors ml-auto\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tDone\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={onNext}\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-2 px-6 py-3 bg-primary text-primary-foreground rounded-lg font-medium hover:bg-primary/90 transition-colors\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tContinue\n\t\t\t\t\t\t\t<ArrowRight className=\"w-4 h-4\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{isImportModalOpen && (\n\t\t\t\t<div className=\"fixed inset-0 z-[9999] flex items-center justify-center bg-black/60 backdrop-blur-sm\">\n\t\t\t\t\t<div className=\"bg-background border border-border rounded-xl w-full max-w-lg mx-6 shadow-2xl\">\n\t\t\t\t\t\t<div className=\"flex items-center gap-3 p-6 border-b border-border\">\n\t\t\t\t\t\t\t<ProviderLogo provider=\"setu\" size={24} />\n\t\t\t\t\t\t\t<h3 className=\"text-lg font-semibold\">Import Setu Wallet</h3>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"p-6\">\n\t\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground mb-4\">\n\t\t\t\t\t\t\t\tPaste your base58 private key to replace the current wallet used\n\t\t\t\t\t\t\t\tfor Setu.\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\t\tref={importPrivateKeyRef}\n\t\t\t\t\t\t\t\tvalue={importPrivateKey}\n\t\t\t\t\t\t\t\tonChange={(e) => setImportPrivateKey(e.target.value)}\n\t\t\t\t\t\t\t\tplaceholder=\"Enter private key\"\n\t\t\t\t\t\t\t\tclassName=\"w-full min-h-[110px] px-4 py-3 bg-muted/50 border border-border rounded-lg text-foreground placeholder:text-muted-foreground outline-none focus:border-foreground/30 transition-colors font-mono text-xs resize-y\"\n\t\t\t\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\t\t\t\tif ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\thandleImportWallet();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (e.key === 'Escape') handleCloseImportWallet();\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{importWalletError && (\n\t\t\t\t\t\t\t\t<p className=\"text-sm text-red-500 mt-3\">{importWalletError}</p>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t<div className=\"flex gap-3 mt-5\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={handleCloseImportWallet}\n\t\t\t\t\t\t\t\t\tdisabled={isImportingWallet}\n\t\t\t\t\t\t\t\t\tclassName=\"flex-1 h-11 px-4 bg-transparent border border-border text-foreground rounded-lg font-medium hover:bg-muted/50 transition-colors disabled:opacity-50\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={handleImportWallet}\n\t\t\t\t\t\t\t\t\tdisabled={!importPrivateKey.trim() || isImportingWallet}\n\t\t\t\t\t\t\t\t\tclassName=\"flex-1 h-11 px-4 bg-foreground text-background rounded-lg font-medium hover:bg-foreground/90 transition-colors disabled:opacity-50 flex items-center justify-center gap-2\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{isImportingWallet ? (\n\t\t\t\t\t\t\t\t\t\t<Loader2 className=\"w-4 h-4 animate-spin\" />\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t'Import Wallet'\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* OAuth Code Modal */}\n\t\t\t{oauthSession && (\n\t\t\t\t<div className=\"fixed inset-0 z-[9999] flex items-center justify-center bg-black/60 backdrop-blur-sm\">\n\t\t\t\t\t<div className=\"bg-background border border-border rounded-xl w-full max-w-lg mx-6 shadow-2xl\">\n\t\t\t\t\t\t<div className=\"flex items-center gap-3 p-6 border-b border-border\">\n\t\t\t\t\t\t\t<ProviderLogo provider={oauthSession.provider} size={24} />\n\t\t\t\t\t\t\t<h3 className=\"text-lg font-semibold\">\n\t\t\t\t\t\t\t\tConnect{' '}\n\t\t\t\t\t\t\t\t{authStatus.providers[oauthSession.provider]?.label ||\n\t\t\t\t\t\t\t\t\toauthSession.provider}\n\t\t\t\t\t\t\t</h3>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{!oauthSession.sessionId ? (\n\t\t\t\t\t\t\t<div className=\"p-6\">\n\t\t\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground mb-6\">\n\t\t\t\t\t\t\t\t\tYou'll be redirected to{' '}\n\t\t\t\t\t\t\t\t\t{authStatus.providers[oauthSession.provider]?.label ||\n\t\t\t\t\t\t\t\t\t\toauthSession.provider}{' '}\n\t\t\t\t\t\t\t\t\tto authorize access. After authorizing, copy the code and\n\t\t\t\t\t\t\t\t\treturn here.\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t<div className=\"flex gap-3\">\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleCancelOAuth}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex-1 h-11 px-4 bg-transparent border border-border text-foreground rounded-lg font-medium hover:bg-muted/50 transition-colors\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleOpenPopup}\n\t\t\t\t\t\t\t\t\t\tdisabled={isOpeningPopup}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex-1 h-11 px-4 bg-foreground text-background rounded-lg font-medium hover:bg-foreground/90 transition-colors disabled:opacity-50 flex items-center justify-center gap-2\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{isOpeningPopup ? (\n\t\t\t\t\t\t\t\t\t\t\t<Loader2 className=\"w-4 h-4 animate-spin\" />\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t\tContinue\n\t\t\t\t\t\t\t\t\t\t\t\t<ExternalLink className=\"w-4 h-4\" />\n\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<div className=\"p-6\">\n\t\t\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground mb-4\">\n\t\t\t\t\t\t\t\t\tPaste the authorization code:\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\tref={oauthCodeInputRef}\n\t\t\t\t\t\t\t\t\tvalue={oauthCodeInput}\n\t\t\t\t\t\t\t\t\tonChange={(e) => setOauthCodeInput(e.target.value)}\n\t\t\t\t\t\t\t\t\tplaceholder=\"Paste code here...\"\n\t\t\t\t\t\t\t\t\tclassName=\"w-full h-11 px-4 bg-muted/50 border border-border rounded-lg text-foreground placeholder:text-muted-foreground outline-none focus:border-foreground/30 transition-colors mb-4 font-mono text-sm\"\n\t\t\t\t\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\t\t\t\t\tif (e.key === 'Enter') handleExchangeCode();\n\t\t\t\t\t\t\t\t\t\tif (e.key === 'Escape') handleCancelOAuth();\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<div className=\"flex gap-3\">\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleCancelOAuth}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex-1 h-11 px-4 bg-transparent border border-border text-foreground rounded-lg font-medium hover:bg-muted/50 transition-colors\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleExchangeCode}\n\t\t\t\t\t\t\t\t\t\tdisabled={!oauthCodeInput.trim() || isExchangingCode}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex-1 h-11 px-4 bg-foreground text-background rounded-lg font-medium hover:bg-foreground/90 transition-colors disabled:opacity-50 flex items-center justify-center gap-2\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{isExchangingCode ? (\n\t\t\t\t\t\t\t\t\t\t\t<Loader2 className=\"w-4 h-4 animate-spin\" />\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t'Connect'\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Copilot Device Flow Modal */}\n\t\t\t{copilotModalOpen && (\n\t\t\t\t<div className=\"fixed inset-0 z-[9999] flex items-center justify-center bg-black/60 backdrop-blur-sm\">\n\t\t\t\t\t<div className=\"bg-background border border-border rounded-xl w-full max-w-lg mx-6 shadow-2xl\">\n\t\t\t\t\t\t<div className=\"flex items-center gap-3 p-6 border-b border-border\">\n\t\t\t\t\t\t\t<ProviderLogo provider=\"copilot\" size={24} />\n\t\t\t\t\t\t\t<h3 className=\"text-lg font-semibold\">Connect GitHub Copilot</h3>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"p-6 space-y-4\">\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={() => handleCopilotSwitchMode('oauth')}\n\t\t\t\t\t\t\t\t\tclassName={`px-3 py-1.5 rounded-lg text-sm font-medium transition-colors ${\n\t\t\t\t\t\t\t\t\t\tcopilotAuthMode === 'oauth'\n\t\t\t\t\t\t\t\t\t\t\t? 'bg-foreground text-background'\n\t\t\t\t\t\t\t\t\t\t\t: 'bg-muted text-muted-foreground hover:text-foreground'\n\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tOAuth\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={() => handleCopilotSwitchMode('token')}\n\t\t\t\t\t\t\t\t\tclassName={`px-3 py-1.5 rounded-lg text-sm font-medium transition-colors ${\n\t\t\t\t\t\t\t\t\t\tcopilotAuthMode === 'token'\n\t\t\t\t\t\t\t\t\t\t\t? 'bg-foreground text-background'\n\t\t\t\t\t\t\t\t\t\t\t: 'bg-muted text-muted-foreground hover:text-foreground'\n\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tToken\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t{copilotAuthMode === 'oauth' ? (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\tEnter this code on GitHub to authorize:\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-center gap-3\">\n\t\t\t\t\t\t\t\t\t\t{copilotLoading ? (\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"bg-muted px-6 py-3 rounded-lg animate-pulse\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"h-9 w-48 bg-muted-foreground/20 rounded\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t) : copilotDevice ? (\n\t\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t\t<code className=\"text-3xl font-mono font-bold tracking-widest text-foreground bg-muted px-6 py-3 rounded-lg select-all\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t{copilotDevice.userCode}\n\t\t\t\t\t\t\t\t\t\t\t\t</code>\n\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={handleCopilotCopyCode}\n\t\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"p-2 text-muted-foreground hover:text-foreground transition-colors\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{copilotCodeCopied ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Check className=\"w-5 h-5 text-green-500\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Copy className=\"w-5 h-5\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\tPaste a GitHub token with Copilot model access.\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\t\t\t\t\tvalue={copilotTokenInput}\n\t\t\t\t\t\t\t\t\t\tonChange={(e) => setCopilotTokenInput(e.target.value)}\n\t\t\t\t\t\t\t\t\t\tplaceholder=\"gho_...\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"w-full h-11 px-4 bg-muted/50 border border-border rounded-lg text-foreground placeholder:text-muted-foreground outline-none focus:border-foreground/30 transition-colors\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t{copilotAuthMethods?.ghImport.available && (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={handleCopilotImportFromGh}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={copilotGhImporting}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-full h-10 px-4 bg-muted text-foreground rounded-lg font-medium hover:bg-muted/80 transition-colors disabled:opacity-50 flex items-center justify-center gap-2\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{copilotGhImporting ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<Loader2 className=\"w-4 h-4 animate-spin\" />\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t'Import from GH CLI'\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{copilotAuthMethods?.ghImport.available &&\n\t\t\t\t\t\t\t\t\t\t!copilotAuthMethods.ghImport.authenticated && (\n\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t{copilotAuthMethods.ghImport.reason ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t'GitHub CLI is not authenticated'}\n\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{copilotAuthMethods &&\n\t\t\t\t\t\t\t\t\t\t!copilotAuthMethods.ghImport.available &&\n\t\t\t\t\t\t\t\t\t\tcopilotAuthMethods.ghImport.reason && (\n\t\t\t\t\t\t\t\t\t\t\t<p className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t\t\t{copilotAuthMethods.ghImport.reason}\n\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{copilotDiagnostics &&\n\t\t\t\t\t\t\t\tcopilotDiagnostics.tokenSources.length > 0 && (\n\t\t\t\t\t\t\t\t\t<div className=\"text-xs text-muted-foreground space-y-1\">\n\t\t\t\t\t\t\t\t\t\t{copilotDiagnostics.tokenSources.map((source) => (\n\t\t\t\t\t\t\t\t\t\t\t<div key={source.source}>\n\t\t\t\t\t\t\t\t\t\t\t\t{source.source}:{' '}\n\t\t\t\t\t\t\t\t\t\t\t\t{source.configured\n\t\t\t\t\t\t\t\t\t\t\t\t\t? source.error\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? source.error\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: `${source.modelCount ?? 0} models visible`\n\t\t\t\t\t\t\t\t\t\t\t\t\t: 'not configured'}\n\t\t\t\t\t\t\t\t\t\t\t\t{source.restrictedByOrgPolicy && source.restrictedOrg\n\t\t\t\t\t\t\t\t\t\t\t\t\t? ` (org restriction: ${source.restrictedOrg})`\n\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{copilotError && (\n\t\t\t\t\t\t\t\t<p className=\"text-sm text-red-500 text-center\">\n\t\t\t\t\t\t\t\t\t{copilotError}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t{copilotPolling && copilotAuthMode === 'oauth' && (\n\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-center gap-2 text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t<Loader2 className=\"w-4 h-4 animate-spin\" />\n\t\t\t\t\t\t\t\t\tWaiting for authorization...\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t<div className=\"flex gap-3\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={handleCancelCopilot}\n\t\t\t\t\t\t\t\t\tclassName=\"flex-1 h-11 px-4 bg-transparent border border-border text-foreground rounded-lg font-medium hover:bg-muted/50 transition-colors\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t{copilotAuthMode === 'oauth' ? (\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleCopilotOpenGithub}\n\t\t\t\t\t\t\t\t\t\tdisabled={copilotPolling || copilotLoading}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex-1 h-11 px-4 bg-foreground text-background rounded-lg font-medium hover:bg-foreground/90 transition-colors disabled:opacity-50 flex items-center justify-center gap-2\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{copilotPolling || copilotLoading ? (\n\t\t\t\t\t\t\t\t\t\t\t<Loader2 className=\"w-4 h-4 animate-spin\" />\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t\tOpen GitHub\n\t\t\t\t\t\t\t\t\t\t\t\t<ExternalLink className=\"w-4 h-4\" />\n\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\tonClick={handleCopilotSaveToken}\n\t\t\t\t\t\t\t\t\t\tdisabled={!copilotTokenInput.trim() || copilotTokenSaving}\n\t\t\t\t\t\t\t\t\t\tclassName=\"flex-1 h-11 px-4 bg-foreground text-background rounded-lg font-medium hover:bg-foreground/90 transition-colors disabled:opacity-50 flex items-center justify-center gap-2\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{copilotTokenSaving ? (\n\t\t\t\t\t\t\t\t\t\t\t<Loader2 className=\"w-4 h-4 animate-spin\" />\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t'Save token'\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n});\n",
175
+ "import { memo, useState, useEffect, useId, useRef } from 'react';\nimport { Loader2, ArrowLeft, Sparkles, ChevronDown } from 'lucide-react';\nimport { apiClient } from '../../../lib/api-client';\nimport type { AuthStatus } from '../../../stores/onboardingStore';\nimport { ProviderLogo } from '../../common/ProviderLogo';\n\ninterface DefaultsStepProps {\n\tauthStatus: AuthStatus;\n\tonComplete: () => Promise<void>;\n\tonBack: () => void;\n\thideHeader?: boolean;\n}\n\ninterface ConfigData {\n\tagents: string[];\n\tproviders: string[];\n\tdefaults: {\n\t\tagent: string;\n\t\tprovider: string;\n\t\tmodel: string;\n\t\ttoolApproval?: 'auto' | 'dangerous' | 'all';\n\t};\n}\n\ntype AllModels = Record<\n\tstring,\n\t{\n\t\tlabel: string;\n\t\tmodels: Array<{ id: string; label: string }>;\n\t}\n>;\n\nexport const DefaultsStep = memo(function DefaultsStep({\n\tauthStatus,\n\tonComplete,\n\tonBack,\n\thideHeader = false,\n}: DefaultsStepProps) {\n\tconst [config, setConfig] = useState<ConfigData | null>(null);\n\tconst [allModels, setAllModels] = useState<AllModels | null>(null);\n\tconst [isLoading, setIsLoading] = useState(true);\n\tconst [isSaving, setIsSaving] = useState(false);\n\n\tconst [selectedProvider, setSelectedProvider] = useState('setu');\n\tconst [selectedModel, setSelectedModel] = useState('kimi-k2.5');\n\tconst [selectedAgent, setSelectedAgent] = useState(\n\t\tauthStatus.defaults.agent || 'build',\n\t);\n\tconst [selectedApproval, setSelectedApproval] = useState<\n\t\t'auto' | 'dangerous' | 'all'\n\t>(authStatus.defaults.toolApproval || 'dangerous');\n\tconst [guidedMode, setGuidedMode] = useState(false);\n\tconst hasUserChangedProvider = useRef(false);\n\n\tconst providerId = useId();\n\tconst modelId = useId();\n\tconst agentId = useId();\n\tconst approvalId = useId();\n\n\tuseEffect(() => {\n\t\tconst loadConfig = async () => {\n\t\t\ttry {\n\t\t\t\tconst [configData, modelsData] = await Promise.all([\n\t\t\t\t\tapiClient.getConfig(),\n\t\t\t\t\tapiClient.getAllModels(),\n\t\t\t\t]);\n\t\t\t\tsetConfig(configData);\n\t\t\t\tsetAllModels(modelsData);\n\t\t\t\tconst cfgProvider = configData?.defaults?.provider || 'setu';\n\t\t\t\tconst cfgModel = configData?.defaults?.model || 'kimi-k2.5';\n\t\t\t\tconst providerHasModels = modelsData?.[cfgProvider]?.models?.length > 0;\n\t\t\t\tconst resolvedProvider = providerHasModels ? cfgProvider : 'setu';\n\t\t\t\tconst resolvedModel =\n\t\t\t\t\tproviderHasModels &&\n\t\t\t\t\tmodelsData[cfgProvider].models.some(\n\t\t\t\t\t\t(m: { id: string }) => m.id === cfgModel,\n\t\t\t\t\t)\n\t\t\t\t\t\t? cfgModel\n\t\t\t\t\t\t: modelsData?.[resolvedProvider]?.models?.[0]?.id || 'kimi-k2.5';\n\t\t\t\tsetSelectedProvider(resolvedProvider);\n\t\t\t\tsetSelectedModel(resolvedModel);\n\t\t\t\tif (configData?.defaults?.agent) {\n\t\t\t\t\tsetSelectedAgent(configData.defaults.agent);\n\t\t\t\t}\n\t\t\t\tif (configData?.defaults?.toolApproval) {\n\t\t\t\t\tsetSelectedApproval(configData.defaults.toolApproval);\n\t\t\t\t}\n\t\t\t\tif (configData?.defaults?.guidedMode) {\n\t\t\t\t\tsetGuidedMode(configData.defaults.guidedMode);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t} finally {\n\t\t\t\tsetIsLoading(false);\n\t\t\t}\n\t\t};\n\t\tloadConfig();\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (config?.agents?.length) {\n\t\t\tconst agents = config.agents;\n\t\t\tif (!selectedAgent || !agents.includes(selectedAgent)) {\n\t\t\t\tsetSelectedAgent(agents.includes('build') ? 'build' : agents[0]);\n\t\t\t}\n\t\t}\n\t}, [config, selectedAgent]);\n\n\tuseEffect(() => {\n\t\tif (allModels?.[selectedProvider] && hasUserChangedProvider.current) {\n\t\t\tconst providerModels = allModels[selectedProvider];\n\t\t\tif (!providerModels.models.some((m) => m.id === selectedModel)) {\n\t\t\t\tsetSelectedModel(providerModels.models[0]?.id || '');\n\t\t\t}\n\t\t}\n\t}, [selectedProvider, allModels, selectedModel]);\n\n\tconst handleFinish = async () => {\n\t\tsetIsSaving(true);\n\t\ttry {\n\t\t\tawait apiClient.updateDefaults({\n\t\t\t\tprovider: selectedProvider,\n\t\t\t\tmodel: selectedModel,\n\t\t\t\tagent: selectedAgent,\n\t\t\t\ttoolApproval: selectedApproval,\n\t\t\t\tguidedMode,\n\t\t\t\tscope: 'global',\n\t\t\t});\n\t\t\tawait onComplete();\n\t\t} catch {\n\t\t} finally {\n\t\t\tsetIsSaving(false);\n\t\t}\n\t};\n\n\tif (isLoading) {\n\t\treturn (\n\t\t\t<div className=\"min-h-screen flex items-center justify-center\">\n\t\t\t\t<Loader2 className=\"w-8 h-8 animate-spin text-muted-foreground\" />\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst availableProviders = config?.providers.filter(\n\t\t(p) =>\n\t\t\t(authStatus.providers[p]?.configured || p === 'setu') &&\n\t\t\tallModels?.[p]?.models?.length > 0,\n\t) || ['setu'];\n\n\tconst currentProviderModels = allModels?.[selectedProvider]?.models || [];\n\n\treturn (\n\t\t<div className=\"min-h-screen flex flex-col\">\n\t\t\t{!hideHeader && (\n\t\t\t\t<div className=\"flex items-center justify-between px-6 py-4 border-b border-border\">\n\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t<ProviderLogo provider=\"setu\" size={24} />\n\t\t\t\t\t\t<span className=\"font-semibold text-foreground\">otto</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n\t\t\t\t\t\t<span className=\"w-2 h-2 rounded-full bg-blue-500\" />\n\t\t\t\t\t\tStep 2 of 2\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Main Content */}\n\t\t\t<div\n\t\t\t\tclassName={`flex-1 px-4 sm:px-6 lg:px-12 pb-32 ${hideHeader ? 'pt-8 sm:pt-10 lg:pt-14' : 'pt-6 sm:pt-8 lg:pt-12'}`}\n\t\t\t>\n\t\t\t\t<div className=\"max-w-7xl mx-auto\">\n\t\t\t\t\t{/* Header */}\n\t\t\t\t\t<div className=\"mb-10\">\n\t\t\t\t\t\t<h1 className=\"text-3xl lg:text-4xl font-semibold text-foreground mb-3\">\n\t\t\t\t\t\t\tConfigure Defaults\n\t\t\t\t\t\t</h1>\n\t\t\t\t\t\t<p className=\"text-lg text-muted-foreground\">\n\t\t\t\t\t\t\tSet your preferences. You can change these anytime in settings.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{/* Form */}\n\t\t\t\t\t<div className=\"grid grid-cols-1 md:grid-cols-2 gap-6\">\n\t\t\t\t\t\t{/* Provider */}\n\t\t\t\t\t\t<div className=\"md:col-span-2\">\n\t\t\t\t\t\t\t<label\n\t\t\t\t\t\t\t\thtmlFor={providerId}\n\t\t\t\t\t\t\t\tclassName=\"block text-sm font-medium text-muted-foreground mb-2\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tDefault Provider\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t\t\t\t<select\n\t\t\t\t\t\t\t\t\tid={providerId}\n\t\t\t\t\t\t\t\t\tvalue={selectedProvider}\n\t\t\t\t\t\t\t\t\tonChange={(e) => {\n\t\t\t\t\t\t\t\t\t\thasUserChangedProvider.current = true;\n\t\t\t\t\t\t\t\t\t\tsetSelectedProvider(e.target.value);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tclassName=\"w-full px-4 py-3 bg-card border border-border rounded-xl text-foreground appearance-none cursor-pointer focus:outline-none focus:border-ring transition-colors\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{availableProviders.map((p) => (\n\t\t\t\t\t\t\t\t\t\t<option key={p} value={p}>\n\t\t\t\t\t\t\t\t\t\t\t{authStatus.providers[p]?.label || p}\n\t\t\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t<ChevronDown className=\"absolute right-4 top-1/2 -translate-y-1/2 w-5 h-5 text-muted-foreground pointer-events-none\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Model */}\n\t\t\t\t\t\t<div className=\"md:col-span-2\">\n\t\t\t\t\t\t\t<label\n\t\t\t\t\t\t\t\thtmlFor={modelId}\n\t\t\t\t\t\t\t\tclassName=\"block text-sm font-medium text-muted-foreground mb-2\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tDefault Model\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t\t\t\t<select\n\t\t\t\t\t\t\t\t\tid={modelId}\n\t\t\t\t\t\t\t\t\tvalue={selectedModel}\n\t\t\t\t\t\t\t\t\tonChange={(e) => setSelectedModel(e.target.value)}\n\t\t\t\t\t\t\t\t\tclassName=\"w-full px-4 py-3 bg-card border border-border rounded-xl text-foreground appearance-none cursor-pointer focus:outline-none focus:border-ring transition-colors\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{currentProviderModels.map((m) => (\n\t\t\t\t\t\t\t\t\t\t<option key={m.id} value={m.id}>\n\t\t\t\t\t\t\t\t\t\t\t{m.label || m.id}\n\t\t\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t<ChevronDown className=\"absolute right-4 top-1/2 -translate-y-1/2 w-5 h-5 text-muted-foreground pointer-events-none\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Agent */}\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<label\n\t\t\t\t\t\t\t\thtmlFor={agentId}\n\t\t\t\t\t\t\t\tclassName=\"block text-sm font-medium text-muted-foreground mb-2\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tDefault Agent\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t\t\t\t<select\n\t\t\t\t\t\t\t\t\tid={agentId}\n\t\t\t\t\t\t\t\t\tvalue={selectedAgent}\n\t\t\t\t\t\t\t\t\tonChange={(e) => setSelectedAgent(e.target.value)}\n\t\t\t\t\t\t\t\t\tclassName=\"w-full px-4 py-3 bg-card border border-border rounded-xl text-foreground appearance-none cursor-pointer focus:outline-none focus:border-ring transition-colors\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{(config?.agents || ['build']).map((a) => (\n\t\t\t\t\t\t\t\t\t\t<option key={a} value={a}>\n\t\t\t\t\t\t\t\t\t\t\t{a}\n\t\t\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t<ChevronDown className=\"absolute right-4 top-1/2 -translate-y-1/2 w-5 h-5 text-muted-foreground pointer-events-none\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Tool Approval */}\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<label\n\t\t\t\t\t\t\t\thtmlFor={approvalId}\n\t\t\t\t\t\t\t\tclassName=\"block text-sm font-medium text-muted-foreground mb-2\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tTool Approval\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t\t\t\t<select\n\t\t\t\t\t\t\t\t\tid={approvalId}\n\t\t\t\t\t\t\t\t\tvalue={selectedApproval}\n\t\t\t\t\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\t\t\t\t\tsetSelectedApproval(\n\t\t\t\t\t\t\t\t\t\t\te.target.value as 'auto' | 'dangerous' | 'all',\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tclassName=\"w-full px-4 py-3 bg-card border border-border rounded-xl text-foreground appearance-none cursor-pointer focus:outline-none focus:border-ring transition-colors\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<option value=\"auto\">Auto - run without asking</option>\n\t\t\t\t\t\t\t\t\t<option value=\"dangerous\">\n\t\t\t\t\t\t\t\t\t\tDangerous - approve writes only\n\t\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t\t<option value=\"all\">All - approve every tool</option>\n\t\t\t\t\t\t\t\t</select>\n\t\t\t\t\t\t\t\t<ChevronDown className=\"absolute right-4 top-1/2 -translate-y-1/2 w-5 h-5 text-muted-foreground pointer-events-none\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<p className=\"mt-2 text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\tControls when tool executions need approval\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Guided Mode */}\n\t\t\t\t\t\t<div className=\"md:col-span-2\">\n\t\t\t\t\t\t\t<div className=\"flex items-center justify-between px-4 py-3 bg-card border border-border rounded-xl\">\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<span className=\"text-sm font-medium text-foreground\">\n\t\t\t\t\t\t\t\t\t\tGuided Mode\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground mt-0.5\">\n\t\t\t\t\t\t\t\t\t\tAI will run commands and manage services for you instead of\n\t\t\t\t\t\t\t\t\t\tgiving instructions\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\trole=\"switch\"\n\t\t\t\t\t\t\t\t\taria-checked={guidedMode}\n\t\t\t\t\t\t\t\t\tonClick={() => setGuidedMode(!guidedMode)}\n\t\t\t\t\t\t\t\t\tclassName={`relative inline-flex h-6 w-11 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 ${\n\t\t\t\t\t\t\t\t\t\tguidedMode ? 'bg-primary' : 'bg-muted'\n\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\tclassName={`inline-block h-4 w-4 transform rounded-full transition-transform ${\n\t\t\t\t\t\t\t\t\t\t\tguidedMode ? 'translate-x-6' : 'translate-x-1'\n\t\t\t\t\t\t\t\t\t\t} ${guidedMode ? 'bg-primary-foreground' : 'bg-foreground'}`}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Bottom Bar */}\n\t\t\t<div className=\"fixed bottom-0 left-0 right-0 px-4 sm:px-6 py-4 border-t border-border bg-background\">\n\t\t\t\t<div className=\"max-w-7xl mx-auto flex items-center justify-between\">\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={onBack}\n\t\t\t\t\t\tclassName=\"flex items-center gap-2 px-4 py-3 text-muted-foreground hover:text-foreground transition-colors\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<ArrowLeft className=\"w-4 h-4\" />\n\t\t\t\t\t\tBack\n\t\t\t\t\t</button>\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={handleFinish}\n\t\t\t\t\t\tdisabled={isSaving}\n\t\t\t\t\t\tclassName=\"flex items-center gap-2 px-6 py-3 bg-primary text-primary-foreground rounded-lg font-medium hover:bg-primary/90 transition-colors disabled:opacity-50\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{isSaving ? (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<Loader2 className=\"w-4 h-4 animate-spin\" />\n\t\t\t\t\t\t\t\tSetting up...\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\tStart Using otto\n\t\t\t\t\t\t\t\t<Sparkles className=\"w-4 h-4\" />\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n});\n",
176
+ "import { useEffect, useState, useCallback, useMemo } from 'react';\n\ntype Theme = 'light' | 'dark';\n\nconst STORAGE_KEY = 'otto-theme';\n\nfunction resolveInitialTheme(): Theme {\n\tif (typeof window === 'undefined') {\n\t\treturn 'dark';\n\t}\n\tconst stored = window.localStorage.getItem(STORAGE_KEY) as Theme | null;\n\tif (stored === 'light' || stored === 'dark') {\n\t\treturn stored;\n\t}\n\tif (window.matchMedia?.('(prefers-color-scheme: light)').matches) {\n\t\treturn 'light';\n\t}\n\treturn 'dark';\n}\n\nexport function useTheme() {\n\tconst [theme, setTheme] = useState<Theme>(() => resolveInitialTheme());\n\n\tuseEffect(() => {\n\t\tif (typeof document === 'undefined') return;\n\n\t\tconst root = document.documentElement;\n\t\tif (theme === 'dark') {\n\t\t\troot.classList.add('dark');\n\t\t} else {\n\t\t\troot.classList.remove('dark');\n\t\t}\n\n\t\ttry {\n\t\t\twindow.localStorage.setItem(STORAGE_KEY, theme);\n\t\t} catch (error) {\n\t\t\tconsole.warn('Failed to persist theme preference', error);\n\t\t}\n\n\t\tif (window.parent && window.parent !== window) {\n\t\t\twindow.parent.postMessage({ type: 'otto-set-theme', theme }, '*');\n\t\t}\n\t}, [theme]);\n\n\tuseEffect(() => {\n\t\tif (typeof window === 'undefined') return;\n\t\tconst handler = (e: MessageEvent) => {\n\t\t\tif (\n\t\t\t\te.data?.type === 'otto-set-theme' &&\n\t\t\t\t(e.data.theme === 'light' || e.data.theme === 'dark')\n\t\t\t) {\n\t\t\t\tsetTheme(e.data.theme);\n\t\t\t}\n\t\t};\n\t\twindow.addEventListener('message', handler);\n\t\treturn () => window.removeEventListener('message', handler);\n\t}, []);\n\n\t// Memoize toggleTheme to prevent creating new function reference on every render\n\tconst toggleTheme = useCallback(() => {\n\t\tsetTheme((prev) => (prev === 'dark' ? 'light' : 'dark'));\n\t}, []);\n\n\t// Return a stable object reference\n\treturn useMemo(\n\t\t() => ({ theme, setTheme, toggleTheme }),\n\t\t[theme, toggleTheme],\n\t);\n}\n\nexport type { Theme };\n",
177
+ "import { useEffect, useState } from 'react';\nimport { API_BASE_URL } from '../lib/config';\n\ninterface WindowWithAgiServerUrl extends Window {\n\tOTTO_SERVER_URL?: string;\n}\n\ninterface WorkingDirectoryInfo {\n\tcwd: string;\n\tdirName: string;\n}\n\nexport function useWorkingDirectory() {\n\tconst [dirName, setDirName] = useState<string | null>(null);\n\n\tuseEffect(() => {\n\t\tconst fetchWorkingDirectory = async () => {\n\t\t\ttry {\n\t\t\t\tconst win = window as WindowWithAgiServerUrl;\n\t\t\t\tconst baseUrl = win.OTTO_SERVER_URL || API_BASE_URL;\n\t\t\t\tconst url = `${baseUrl}/v1/config/cwd`;\n\n\t\t\t\tconsole.log('[useWorkingDirectory] Fetching from:', url);\n\n\t\t\t\tconst response = await fetch(url);\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t'[useWorkingDirectory] Failed:',\n\t\t\t\t\t\tresponse.status,\n\t\t\t\t\t\tresponse.statusText,\n\t\t\t\t\t);\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Failed to fetch working directory: ${response.status}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst data: WorkingDirectoryInfo = await response.json();\n\t\t\t\tconsole.log('[useWorkingDirectory] Success:', data);\n\n\t\t\t\tif (data.dirName) {\n\t\t\t\t\tconsole.log('[useWorkingDirectory] Setting title to:', data.dirName);\n\t\t\t\t\tsetDirName(data.dirName);\n\t\t\t\t\tdocument.title = data.dirName;\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[useWorkingDirectory] Error:', error);\n\t\t\t\tdocument.title = 'otto'; // Fallback title\n\t\t\t}\n\t\t};\n\n\t\tfetchWorkingDirectory();\n\t}, []); // Run once on mount\n\n\treturn dirName;\n}\n",
178
+ "import { useEffect, useCallback } from 'react';\nimport { useFocusStore } from '../stores/focusStore';\nimport { useSidebarStore } from '../stores/sidebarStore';\nimport { useGitStore } from '../stores/gitStore';\nimport { useResearchStore } from '../stores/researchStore';\nimport { useFilePickerStore } from '../stores/filePickerStore';\n\ninterface UseKeyboardShortcutsOptions {\n\tsessionIds: string[];\n\tactiveSessionId?: string;\n\tgitFiles: Array<{ path: string; staged: boolean; status?: string }>;\n\tonSelectSession: (sessionId: string) => void;\n\tonNewSession: () => void;\n\tonStageFile?: (path: string) => void;\n\tonUnstageFile?: (path: string) => void;\n\tonRestoreFile?: (path: string) => void;\n\tonDeleteFile?: (path: string) => void;\n\tonStageAll?: () => void;\n\tonUnstageAll?: () => void;\n\tonOpenCommitModal?: () => void;\n\tonViewDiff?: (file: string, staged: boolean) => void;\n\tonReturnToInput?: () => void;\n}\n\nexport function useKeyboardShortcuts({\n\tsessionIds,\n\tactiveSessionId,\n\tgitFiles,\n\tonSelectSession,\n\tonNewSession,\n\tonStageFile,\n\tonUnstageFile,\n\tonRestoreFile,\n\tonDeleteFile,\n\tonStageAll,\n\tonUnstageAll,\n\tonOpenCommitModal,\n\tonViewDiff,\n\tonReturnToInput,\n}: UseKeyboardShortcutsOptions) {\n\tconst {\n\t\tcurrentFocus,\n\t\tsessionIndex,\n\t\tgitFileIndex,\n\t\tsetFocus,\n\t\tsetSessionIndex,\n\t\tsetGitFileIndex,\n\t\tresetGitFileIndex,\n\t} = useFocusStore();\n\tconst {\n\t\tsetCollapsed: setSessionListCollapsed,\n\t\ttoggleCollapse: toggleSessionList,\n\t} = useSidebarStore();\n\tconst { isExpanded: isGitExpanded, toggleSidebar: toggleGit } = useGitStore();\n\tconst closeDiff = useGitStore((state) => state.closeDiff);\n\tconst toggleResearch = useResearchStore((state) => state.toggleSidebar);\n\n\tconst currentSessionIndex = sessionIds.indexOf(activeSessionId || '');\n\n\tconst handleKeyDown = useCallback(\n\t\t(e: KeyboardEvent) => {\n\t\t\tconst target = e.target as HTMLElement;\n\t\t\tconst isInInput =\n\t\t\t\ttarget.tagName === 'INPUT' ||\n\t\t\t\ttarget.tagName === 'TEXTAREA' ||\n\t\t\t\ttarget.isContentEditable;\n\t\t\tconst isInTerminal = !!target.closest('[data-terminal-viewer]');\n\n\t\t\tif ((e.ctrlKey || e.metaKey) && e.key === 'h') {\n\t\t\t\te.preventDefault();\n\n\t\t\t\t// Ctrl+H: center -> left, left -> center, right -> center\n\t\t\t\tif (currentFocus === 'sessions') {\n\t\t\t\t\t// Already on sessions, go back to center\n\t\t\t\t\t(document.activeElement as HTMLElement)?.blur();\n\t\t\t\t\tsetFocus('input');\n\t\t\t\t\tsetSessionListCollapsed(true);\n\t\t\t\t\t// Focus the input after a small delay to ensure sidebar is collapsing\n\t\t\t\t\tsetTimeout(() => onReturnToInput?.(), 50);\n\t\t\t\t} else if (currentFocus === 'git') {\n\t\t\t\t\t// On right sidebar, go back to center (don't jump to left)\n\t\t\t\t\t(document.activeElement as HTMLElement)?.blur();\n\t\t\t\t\tsetFocus('input');\n\t\t\t\t\ttoggleGit();\n\t\t\t\t\tcloseDiff();\n\t\t\t\t\tsetTimeout(() => onReturnToInput?.(), 50);\n\t\t\t\t} else {\n\t\t\t\t\t// From center, go to left sidebar\n\t\t\t\t\t(document.activeElement as HTMLElement)?.blur();\n\t\t\t\t\tsetFocus('sessions');\n\t\t\t\t\tsetSessionListCollapsed(false);\n\t\t\t\t\tif (currentSessionIndex >= 0) {\n\t\t\t\t\t\tsetSessionIndex(currentSessionIndex);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ((e.ctrlKey || e.metaKey) && e.key === 'l') {\n\t\t\t\te.preventDefault();\n\n\t\t\t\t// Ctrl+L: center -> right, right -> center, left -> center\n\t\t\t\tif (currentFocus === 'git') {\n\t\t\t\t\t// Already on git, go back to center\n\t\t\t\t\t(document.activeElement as HTMLElement)?.blur();\n\t\t\t\t\tsetFocus('input');\n\t\t\t\t\ttoggleGit();\n\t\t\t\t\tcloseDiff();\n\t\t\t\t\t// Focus the input after a small delay to ensure sidebar is collapsing\n\t\t\t\t\tsetTimeout(() => onReturnToInput?.(), 50);\n\t\t\t\t} else if (currentFocus === 'sessions') {\n\t\t\t\t\t// On left sidebar, go back to center (don't jump to right)\n\t\t\t\t\t(document.activeElement as HTMLElement)?.blur();\n\t\t\t\t\tsetFocus('input');\n\t\t\t\t\tsetSessionListCollapsed(true);\n\t\t\t\t\tsetTimeout(() => onReturnToInput?.(), 50);\n\t\t\t\t} else {\n\t\t\t\t\t// From center, go to right sidebar\n\t\t\t\t\t(document.activeElement as HTMLElement)?.blur();\n\t\t\t\t\tif (!isGitExpanded) {\n\t\t\t\t\t\ttoggleGit();\n\t\t\t\t\t}\n\t\t\t\t\tsetFocus('git');\n\t\t\t\t\tresetGitFileIndex();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ((e.ctrlKey || e.metaKey) && e.key === '/') {\n\t\t\t\te.preventDefault();\n\t\t\t\ttoggleSessionList();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ((e.ctrlKey || e.metaKey) && e.key === '\\\\') {\n\t\t\t\te.preventDefault();\n\t\t\t\ttoggleGit();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ((e.ctrlKey || e.metaKey) && e.shiftKey && e.key === 'r') {\n\t\t\t\te.preventDefault();\n\t\t\t\ttoggleResearch();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ((e.ctrlKey || e.metaKey) && e.key === 'n') {\n\t\t\t\te.preventDefault();\n\t\t\t\tonNewSession();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ((e.ctrlKey || e.metaKey) && e.key === 'p') {\n\t\t\t\te.preventDefault();\n\t\t\t\tuseFilePickerStore.getState().toggle();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Only handle q when not in input and a sidebar is focused\n\t\t\tif (\n\t\t\t\t(e.key === 'Escape' && !isInTerminal) ||\n\t\t\t\t(e.key === 'q' &&\n\t\t\t\t\t!isInInput &&\n\t\t\t\t\t(currentFocus === 'sessions' || currentFocus === 'git'))\n\t\t\t) {\n\t\t\t\te.preventDefault();\n\t\t\t\t// Close sidebar if focused on one\n\t\t\t\tif (currentFocus === 'sessions') {\n\t\t\t\t\tsetSessionListCollapsed(true);\n\t\t\t\t} else if (currentFocus === 'git') {\n\t\t\t\t\ttoggleGit();\n\t\t\t\t\tcloseDiff();\n\t\t\t\t}\n\t\t\t\tsetFocus('input');\n\t\t\t\tonReturnToInput?.();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (currentFocus === 'sessions' && !isInInput) {\n\t\t\t\tif (e.key === 'j' && sessionIds.length > 0) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst nextIndex = Math.min(sessionIndex + 1, sessionIds.length - 1);\n\t\t\t\t\tsetSessionIndex(nextIndex);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (e.key === 'k' && sessionIds.length > 0) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst prevIndex = Math.max(sessionIndex - 1, 0);\n\t\t\t\t\tsetSessionIndex(prevIndex);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (e.key === 'Enter' && sessionIds[sessionIndex]) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tonSelectSession(sessionIds[sessionIndex]);\n\t\t\t\t\tsetFocus('input');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (currentFocus === 'git' && !isInInput) {\n\t\t\t\tif (e.key === 'j' && gitFiles.length > 0) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst nextIndex = Math.min(gitFileIndex + 1, gitFiles.length - 1);\n\t\t\t\t\tsetGitFileIndex(nextIndex);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (e.key === 'k' && gitFiles.length > 0) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst prevIndex = Math.max(gitFileIndex - 1, 0);\n\t\t\t\t\tsetGitFileIndex(prevIndex);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (e.key === ' ' && gitFiles[gitFileIndex]) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst file = gitFiles[gitFileIndex];\n\t\t\t\t\tif (file.staged) {\n\t\t\t\t\t\tonUnstageFile?.(file.path);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tonStageFile?.(file.path);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (e.key === 'a') {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tonStageAll?.();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (e.key === 'u') {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tonUnstageAll?.();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (e.key === 'R' && gitFiles[gitFileIndex]) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst file = gitFiles[gitFileIndex];\n\t\t\t\t\t// Only allow restore for unstaged, tracked files (not new/untracked)\n\t\t\t\t\tconst canRestore =\n\t\t\t\t\t\t!file.staged &&\n\t\t\t\t\t\tfile.status !== 'untracked' &&\n\t\t\t\t\t\tfile.status !== 'added';\n\t\t\t\t\tif (canRestore) {\n\t\t\t\t\t\tonRestoreFile?.(file.path);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Delete file - Shift+D or Delete (only for untracked files)\n\t\t\t\tif ((e.shiftKey && e.key === 'D') || e.key === 'Backspace') {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst file = gitFiles[gitFileIndex];\n\t\t\t\t\tif (file && !file.staged && file.status === 'untracked') {\n\t\t\t\t\t\tonDeleteFile?.(file.path);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (e.key === 'c') {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tonOpenCommitModal?.();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (e.key === 'Enter' && gitFiles[gitFileIndex]) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst file = gitFiles[gitFileIndex];\n\t\t\t\t\tonViewDiff?.(file.path, file.staged);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\tcurrentFocus,\n\t\t\tsessionIndex,\n\t\t\tgitFileIndex,\n\t\t\tsessionIds,\n\t\t\tgitFiles,\n\t\t\tcurrentSessionIndex,\n\t\t\tisGitExpanded,\n\t\t\tsetFocus,\n\t\t\tsetSessionIndex,\n\t\t\tsetGitFileIndex,\n\t\t\tresetGitFileIndex,\n\t\t\tsetSessionListCollapsed,\n\t\t\ttoggleGit,\n\t\t\ttoggleResearch,\n\t\t\ttoggleSessionList,\n\t\t\tonSelectSession,\n\t\t\tonNewSession,\n\t\t\tonStageFile,\n\t\t\tonUnstageFile,\n\t\t\tonRestoreFile,\n\t\t\tonDeleteFile,\n\t\t\tonStageAll,\n\t\t\tonUnstageAll,\n\t\t\tonOpenCommitModal,\n\t\t\tonViewDiff,\n\t\t\tonReturnToInput,\n\t\t\tcloseDiff,\n\t\t],\n\t);\n\n\tuseEffect(() => {\n\t\twindow.addEventListener('keydown', handleKeyDown);\n\t\treturn () => window.removeEventListener('keydown', handleKeyDown);\n\t}, [handleKeyDown]);\n\n\treturn {\n\t\tcurrentFocus,\n\t\tsessionIndex,\n\t\tgitFileIndex,\n\t};\n}\n",
179
+ "import {\n\tuseState,\n\tuseCallback,\n\tuseEffect,\n\ttype DragEvent,\n\ttype ClipboardEvent,\n} from 'react';\n\nexport interface ImageAttachment {\n\tid: string;\n\tfile: File;\n\tpreview: string;\n\tdata: string;\n\tmediaType: string;\n}\n\nconst SUPPORTED_TYPES = ['image/png', 'image/jpeg', 'image/gif', 'image/webp'];\n\nfunction generateId(): string {\n\treturn `img-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n}\n\nasync function fileToBase64(file: File): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst reader = new FileReader();\n\t\treader.onload = () => {\n\t\t\tconst result = reader.result as string;\n\t\t\tconst base64 = result.split(',')[1];\n\t\t\tresolve(base64);\n\t\t};\n\t\treader.onerror = reject;\n\t\treader.readAsDataURL(file);\n\t});\n}\n\nasync function fileToPreview(file: File): Promise<string> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst reader = new FileReader();\n\t\treader.onload = () => resolve(reader.result as string);\n\t\treader.onerror = reject;\n\t\treader.readAsDataURL(file);\n\t});\n}\n\ninterface UseImageUploadOptions {\n\tmaxImages?: number;\n\tmaxSizeMB?: number;\n\tpageWide?: boolean;\n}\n\nexport function useImageUpload(options: UseImageUploadOptions = {}) {\n\tconst { maxImages = 5, maxSizeMB = 5, pageWide = true } = options;\n\n\tconst [images, setImages] = useState<ImageAttachment[]>([]);\n\tconst [isDragging, setIsDragging] = useState(false);\n\tconst [error, setError] = useState<string | null>(null);\n\n\tconst maxSizeBytes = maxSizeMB * 1024 * 1024;\n\n\tconst validateFile = useCallback(\n\t\t(file: File): string | null => {\n\t\t\tif (!SUPPORTED_TYPES.includes(file.type)) {\n\t\t\t\treturn `Unsupported file type: ${file.type}. Supported: PNG, JPEG, GIF, WebP`;\n\t\t\t}\n\t\t\tif (file.size > maxSizeBytes) {\n\t\t\t\treturn `File too large: ${(file.size / 1024 / 1024).toFixed(1)}MB. Max: ${maxSizeMB}MB`;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\t[maxSizeBytes, maxSizeMB],\n\t);\n\n\tconst addImages = useCallback(\n\t\tasync (files: FileList | File[]) => {\n\t\t\tsetError(null);\n\t\t\tconst fileArray = Array.from(files);\n\t\t\tconst remaining = maxImages - images.length;\n\n\t\t\tif (remaining <= 0) {\n\t\t\t\tsetError(`Maximum ${maxImages} images allowed`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst filesToAdd = fileArray.slice(0, remaining);\n\t\t\tconst newImages: ImageAttachment[] = [];\n\n\t\t\tfor (const file of filesToAdd) {\n\t\t\t\tconst validationError = validateFile(file);\n\t\t\t\tif (validationError) {\n\t\t\t\t\tsetError(validationError);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tconst [preview, data] = await Promise.all([\n\t\t\t\t\t\tfileToPreview(file),\n\t\t\t\t\t\tfileToBase64(file),\n\t\t\t\t\t]);\n\n\t\t\t\t\tnewImages.push({\n\t\t\t\t\t\tid: generateId(),\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tpreview,\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\tmediaType: file.type,\n\t\t\t\t\t});\n\t\t\t\t} catch {\n\t\t\t\t\tsetError('Failed to process image');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (newImages.length > 0) {\n\t\t\t\tsetImages((prev) => [...prev, ...newImages]);\n\t\t\t}\n\t\t},\n\t\t[images.length, maxImages, validateFile],\n\t);\n\n\tconst removeImage = useCallback((id: string) => {\n\t\tsetImages((prev) => prev.filter((img) => img.id !== id));\n\t\tsetError(null);\n\t}, []);\n\n\tconst clearImages = useCallback(() => {\n\t\tsetImages([]);\n\t\tsetError(null);\n\t}, []);\n\n\tconst handleDragEnter = useCallback((e: DragEvent) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\tif (e.dataTransfer.types.includes('Files')) {\n\t\t\tsetIsDragging(true);\n\t\t}\n\t}, []);\n\n\tconst handleDragLeave = useCallback((e: DragEvent) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\tconst rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n\t\tconst x = e.clientX;\n\t\tconst y = e.clientY;\n\t\tif (x < rect.left || x > rect.right || y < rect.top || y > rect.bottom) {\n\t\t\tsetIsDragging(false);\n\t\t}\n\t}, []);\n\n\tconst handleDragOver = useCallback((e: DragEvent) => {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t}, []);\n\n\tconst handleDrop = useCallback(\n\t\t(e: DragEvent) => {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tsetIsDragging(false);\n\n\t\t\tconst files = e.dataTransfer.files;\n\t\t\tif (files.length > 0) {\n\t\t\t\tconst imageFiles = Array.from(files).filter((f) =>\n\t\t\t\t\tf.type.startsWith('image/'),\n\t\t\t\t);\n\t\t\t\tif (imageFiles.length > 0) {\n\t\t\t\t\taddImages(imageFiles);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[addImages],\n\t);\n\n\tconst handlePaste = useCallback(\n\t\t(e: ClipboardEvent) => {\n\t\t\tconst items = e.clipboardData?.items;\n\t\t\tif (!items) return;\n\n\t\t\tconst imageFiles: File[] = [];\n\t\t\tfor (const item of Array.from(items)) {\n\t\t\t\tif (item.type.startsWith('image/')) {\n\t\t\t\t\tconst file = item.getAsFile();\n\t\t\t\t\tif (file) {\n\t\t\t\t\t\timageFiles.push(file);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (imageFiles.length > 0) {\n\t\t\t\te.preventDefault();\n\t\t\t\taddImages(imageFiles);\n\t\t\t}\n\t\t},\n\t\t[addImages],\n\t);\n\n\tuseEffect(() => {\n\t\tif (!pageWide) return;\n\n\t\tlet dragCounter = 0;\n\n\t\tconst onDragEnter = (e: globalThis.DragEvent) => {\n\t\t\te.preventDefault();\n\t\t\tif (e.dataTransfer?.types.includes('Files')) {\n\t\t\t\tdragCounter++;\n\t\t\t\tif (dragCounter === 1) {\n\t\t\t\t\tsetIsDragging(true);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tconst onDragLeave = (e: globalThis.DragEvent) => {\n\t\t\te.preventDefault();\n\t\t\tdragCounter--;\n\t\t\tif (dragCounter === 0) {\n\t\t\t\tsetIsDragging(false);\n\t\t\t}\n\t\t};\n\n\t\tconst onDragOver = (e: globalThis.DragEvent) => {\n\t\t\te.preventDefault();\n\t\t};\n\n\t\tconst onDrop = (e: globalThis.DragEvent) => {\n\t\t\te.preventDefault();\n\t\t\tdragCounter = 0;\n\t\t\tsetIsDragging(false);\n\n\t\t\tconst files = e.dataTransfer?.files;\n\t\t\tif (files && files.length > 0) {\n\t\t\t\tconst imageFiles = Array.from(files).filter((f) =>\n\t\t\t\t\tf.type.startsWith('image/'),\n\t\t\t\t);\n\t\t\t\tif (imageFiles.length > 0) {\n\t\t\t\t\taddImages(imageFiles);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener('dragenter', onDragEnter);\n\t\tdocument.addEventListener('dragleave', onDragLeave);\n\t\tdocument.addEventListener('dragover', onDragOver);\n\t\tdocument.addEventListener('drop', onDrop);\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener('dragenter', onDragEnter);\n\t\t\tdocument.removeEventListener('dragleave', onDragLeave);\n\t\t\tdocument.removeEventListener('dragover', onDragOver);\n\t\t\tdocument.removeEventListener('drop', onDrop);\n\t\t};\n\t}, [pageWide, addImages]);\n\n\treturn {\n\t\timages,\n\t\tisDragging,\n\t\terror,\n\t\taddImages,\n\t\tremoveImage,\n\t\tclearImages,\n\t\thandleDragEnter,\n\t\thandleDragLeave,\n\t\thandleDragOver,\n\t\thandleDrop,\n\t\thandlePaste,\n\t};\n}\n",
180
+ "import { useEffect, useRef } from 'react';\nimport { SSEClient } from '../lib/sse-client';\nimport { apiClient } from '../lib/api-client';\nimport { toast, useToastStore } from '../stores/toastStore';\nimport { useSetuStore } from '../stores/setuStore';\nimport { useTopupApprovalStore } from '../stores/topupApprovalStore';\n\nexport function useSetuPayments(sessionId: string | undefined) {\n\tconst clientRef = useRef<SSEClient | null>(null);\n\tconst loadingToastIdRef = useRef<string | null>(null);\n\tconst setBalance = useSetuStore((s) => s.setBalance);\n\tconst setPaymentPending = useSetuStore((s) => s.setPaymentPending);\n\tconst removeToast = useToastStore((s) => s.removeToast);\n\tconst updateToast = useToastStore((s) => s.updateToast);\n\tconst setPendingTopup = useTopupApprovalStore((s) => s.setPendingTopup);\n\tconst clearPendingTopup = useTopupApprovalStore((s) => s.clearPendingTopup);\n\n\tuseEffect(() => {\n\t\tif (!sessionId) return;\n\n\t\tconst client = new SSEClient();\n\t\tclientRef.current = client;\n\n\t\tconst url = apiClient.getStreamUrl(sessionId);\n\t\tclient.connect(url);\n\n\t\tconst unsubscribe = client.on('*', (event) => {\n\t\t\tconst payload = event.payload as Record<string, unknown> | undefined;\n\n\t\t\tswitch (event.type) {\n\t\t\t\tcase 'setu.topup.required': {\n\t\t\t\t\tconst amountUsd =\n\t\t\t\t\t\ttypeof payload?.amountUsd === 'number' ? payload.amountUsd : 0;\n\t\t\t\t\tconst currentBalance =\n\t\t\t\t\t\ttypeof payload?.currentBalance === 'number'\n\t\t\t\t\t\t\t? payload.currentBalance\n\t\t\t\t\t\t\t: 0;\n\t\t\t\t\tconst minTopupUsd =\n\t\t\t\t\t\ttypeof payload?.minTopupUsd === 'number' ? payload.minTopupUsd : 5;\n\t\t\t\t\tconst suggestedTopupUsd =\n\t\t\t\t\t\ttypeof payload?.suggestedTopupUsd === 'number'\n\t\t\t\t\t\t\t? payload.suggestedTopupUsd\n\t\t\t\t\t\t\t: 10;\n\t\t\t\t\tconst messageId =\n\t\t\t\t\t\ttypeof payload?.messageId === 'string' ? payload.messageId : '';\n\n\t\t\t\t\tsetPendingTopup({\n\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\tmessageId,\n\t\t\t\t\t\tamountUsd,\n\t\t\t\t\t\tcurrentBalance,\n\t\t\t\t\t\tminTopupUsd,\n\t\t\t\t\t\tsuggestedTopupUsd,\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 'setu.topup.method_selected': {\n\t\t\t\t\tconst method = payload?.method;\n\t\t\t\t\tif (method === 'crypto') {\n\t\t\t\t\t\tsetPaymentPending(true);\n\t\t\t\t\t\tloadingToastIdRef.current = toast.loading(\n\t\t\t\t\t\t\t'💳 Processing crypto payment...',\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 'setu.topup.cancelled': {\n\t\t\t\t\tclearPendingTopup();\n\t\t\t\t\tconst reason =\n\t\t\t\t\t\ttypeof payload?.reason === 'string'\n\t\t\t\t\t\t\t? payload.reason\n\t\t\t\t\t\t\t: 'Request cancelled';\n\t\t\t\t\ttoast(`⚠️ ${reason}`);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 'setu.payment.required': {\n\t\t\t\t\tconst amountUsd =\n\t\t\t\t\t\ttypeof payload?.amountUsd === 'number' ? payload.amountUsd : 0;\n\t\t\t\t\tsetPaymentPending(true);\n\t\t\t\t\tif (!loadingToastIdRef.current) {\n\t\t\t\t\t\tloadingToastIdRef.current = toast.loading(\n\t\t\t\t\t\t\t`💳 Payment required: $${amountUsd.toFixed(2)}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 'setu.payment.signing': {\n\t\t\t\t\tif (loadingToastIdRef.current) {\n\t\t\t\t\t\tupdateToast(loadingToastIdRef.current, {\n\t\t\t\t\t\t\tmessage: '✍️ Signing transaction...',\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tloadingToastIdRef.current = toast.loading(\n\t\t\t\t\t\t\t'✍️ Signing transaction...',\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 'setu.payment.complete': {\n\t\t\t\t\tclearPendingTopup();\n\t\t\t\t\tconst rawAmount = payload?.amountUsd;\n\t\t\t\t\tconst rawBalance = payload?.newBalance;\n\t\t\t\t\tconst transactionId =\n\t\t\t\t\t\ttypeof payload?.transactionId === 'string'\n\t\t\t\t\t\t\t? payload.transactionId\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\tconst amountUsd =\n\t\t\t\t\t\ttypeof rawAmount === 'number'\n\t\t\t\t\t\t\t? rawAmount\n\t\t\t\t\t\t\t: typeof rawAmount === 'string'\n\t\t\t\t\t\t\t\t? parseFloat(rawAmount)\n\t\t\t\t\t\t\t\t: 0;\n\t\t\t\t\tconst newBalance =\n\t\t\t\t\t\ttypeof rawBalance === 'number'\n\t\t\t\t\t\t\t? rawBalance\n\t\t\t\t\t\t\t: typeof rawBalance === 'string'\n\t\t\t\t\t\t\t\t? parseFloat(rawBalance)\n\t\t\t\t\t\t\t\t: 0;\n\t\t\t\t\tsetBalance(newBalance);\n\t\t\t\t\tsetPaymentPending(false);\n\t\t\t\t\tif (loadingToastIdRef.current) {\n\t\t\t\t\t\tremoveToast(loadingToastIdRef.current);\n\t\t\t\t\t\tloadingToastIdRef.current = null;\n\t\t\t\t\t}\n\t\t\t\t\tconst message = `✅ Paid $${amountUsd.toFixed(2)}`;\n\t\t\t\t\tif (transactionId) {\n\t\t\t\t\t\ttoast.successWithAction(message, {\n\t\t\t\t\t\t\tlabel: 'View Tx',\n\t\t\t\t\t\t\thref: `https://orbmarkets.io/tx/${transactionId}`,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttoast.success(message);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 'setu.fiat.checkout_created': {\n\t\t\t\t\tclearPendingTopup();\n\t\t\t\t\tsetPaymentPending(false);\n\t\t\t\t\tif (loadingToastIdRef.current) {\n\t\t\t\t\t\tremoveToast(loadingToastIdRef.current);\n\t\t\t\t\t\tloadingToastIdRef.current = null;\n\t\t\t\t\t}\n\t\t\t\t\t// Modal is already opened by TopupApprovalCard\n\t\t\t\t\t// Just show a helpful toast\n\t\t\t\t\ttoast.success('💳 Complete payment, then retry your message');\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 'setu.balance.updated': {\n\t\t\t\t\tconst rawBalance = payload?.balanceRemaining;\n\t\t\t\t\tconst newBalance =\n\t\t\t\t\t\ttypeof rawBalance === 'number'\n\t\t\t\t\t\t\t? rawBalance\n\t\t\t\t\t\t\t: typeof rawBalance === 'string'\n\t\t\t\t\t\t\t\t? parseFloat(rawBalance)\n\t\t\t\t\t\t\t\t: null;\n\t\t\t\t\tif (newBalance !== null && !Number.isNaN(newBalance)) {\n\t\t\t\t\t\tsetBalance(newBalance);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 'setu.payment.error': {\n\t\t\t\t\tclearPendingTopup();\n\t\t\t\t\tconst error =\n\t\t\t\t\t\ttypeof payload?.error === 'string'\n\t\t\t\t\t\t\t? payload.error\n\t\t\t\t\t\t\t: 'Payment failed';\n\t\t\t\t\tsetPaymentPending(false);\n\t\t\t\t\tif (loadingToastIdRef.current) {\n\t\t\t\t\t\tremoveToast(loadingToastIdRef.current);\n\t\t\t\t\t\tloadingToastIdRef.current = null;\n\t\t\t\t\t}\n\t\t\t\t\ttoast.error(`❌ ${error}`);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\n\t\treturn () => {\n\t\t\tunsubscribe();\n\t\t\tclient.disconnect();\n\t\t};\n\t}, [\n\t\tsessionId,\n\t\tsetBalance,\n\t\tsetPaymentPending,\n\t\tremoveToast,\n\t\tupdateToast,\n\t\tsetPendingTopup,\n\t\tclearPendingTopup,\n\t]);\n}\n"
181
+ ],
182
+ "mappings": ";AAAA;AAAA;AAQO,IAAM,SAAS,WACrB,GAAG,YAAY,IAAI,UAAU,WAAW,OAAO,SAAS,SAAS,QAAQ;AAAA,EACxE,MAAM,aACL;AAAA,EAED,MAAM,WAAW;AAAA,IAChB,SAAS;AAAA,IACT,WACC;AAAA,IACD,OAAO;AAAA,EACR;AAAA,EAEA,MAAM,QAAQ;AAAA,IACb,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,EACP;AAAA,EAEA,uBACC,IAAC,UAAD;AAAA,IACC;AAAA,IACA,WAAW,GAAG,cAAc,SAAS,YAAY,MAAM,SAAS;AAAA,OAC5D;AAAA,GACL;AAAA,CAGH;AAEA,OAAO,cAAc;;ACrCrB,uBAAS;AAAA;AAKF,IAAM,OAAO,YACnB,GAAG,YAAY,IAAI,aAAa,SAAS,QAAQ;AAAA,EAChD,uBACC,KAME,OANF;AAAA,IACC;AAAA,IACA,WAAW,gEAAgE;AAAA,OACvE;AAAA,IAHL;AAAA,GAME;AAAA,CAGL;AAEA,KAAK,cAAc;;ACnBnB,uBAAS;AAAA;AAKF,IAAM,QAAQ,YACpB,GAAG,YAAY,OAAO,SAAS,QAAQ;AAAA,EACtC,uBACC,KAAC,SAAD;AAAA,IACC;AAAA,IACA,WAAW,oHAAoH;AAAA,OAC3H;AAAA,GACL;AAAA,CAGH;AAEA,MAAM,cAAc;;ACjBpB,uBAAS;AAAA;AAKF,IAAM,WAAW,YACvB,GAAG,YAAY,OAAO,SAAS,QAAQ;AAAA,EACtC,uBACC,KAAC,YAAD;AAAA,IACC;AAAA,IACA,WAAW,gIAAgI;AAAA,OACvI;AAAA,GACL;AAAA,CAGH;AAEA,SAAS,cAAc;;ACjBvB;;;ACAA;AAwBO,IAAM,uBAAuB,OAA0B,CAAC,SAAS;AAAA,EACvE,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,cAAc;AAAA,EACd,aAAa;AAAA,EACb,SAAS;AAAA,EACT,WAAW,MAAM;AAAA,EACjB,UAAU;AAAA,EAEV,kBAAkB,CAAC,YAClB,IAAI;AAAA,IACH,QAAQ;AAAA,IACR,OAAO,QAAQ,SAAS;AAAA,IACxB,SAAS,QAAQ;AAAA,IACjB,cAAc,QAAQ,gBAAgB;AAAA,IACtC,aAAa,QAAQ,eAAe;AAAA,IACpC,SAAS,QAAQ,WAAW;AAAA,IAC5B,WAAW,QAAQ;AAAA,IACnB,UAAU,QAAQ;AAAA,EACnB,CAAC;AAAA,EAEF,mBAAmB,MAClB,IAAI;AAAA,IACH,QAAQ;AAAA,IACR,WAAW,MAAM;AAAA,IACjB,UAAU;AAAA,EACX,CAAC;AACH,EAAE;;;ADlDF;AACA;AAAA;AAEO,SAAS,kBAAkB,GAAG;AAAA,EACpC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACG,qBAAqB;AAAA,EAEzB,OAAO,cAAc,mBAAmB,SAAS,KAAK;AAAA,EAEtD,UAAU,MAAM;AAAA,IACf,IAAI,CAAC,QAAQ;AAAA,MACZ,gBAAgB,KAAK;AAAA,IACtB;AAAA,KACE,CAAC,MAAM,CAAC;AAAA,EAEX,MAAM,gBAAgB,YAAY,YAAY;AAAA,IAC7C,gBAAgB,IAAI;AAAA,IACpB,IAAI;AAAA,MACH,MAAM,UAAU;AAAA,MAChB,kBAAkB;AAAA,MACjB,OAAO,OAAO;AAAA,MACf,QAAQ,MAAM,+BAA+B,KAAK;AAAA,MAClD,gBAAgB,KAAK;AAAA;AAAA,KAEpB,CAAC,WAAW,iBAAiB,CAAC;AAAA,EAEjC,MAAM,eAAe,YAAY,MAAM;AAAA,IACtC,WAAW;AAAA,IACX,kBAAkB;AAAA,KAChB,CAAC,UAAU,iBAAiB,CAAC;AAAA,EAEhC,MAAM,sBAAsB,CAAC,MAAwC;AAAA,IACpE,IAAI,EAAE,WAAW,EAAE,iBAAiB,CAAC,cAAc;AAAA,MAClD,aAAa;AAAA,IACd;AAAA;AAAA,EAGD,UAAU,MAAM;AAAA,IACf,MAAM,eAAe,CAAC,MAAqB;AAAA,MAC1C,IAAI,UAAU,CAAC,cAAc;AAAA,QAC5B,MAAM,SAAS,EAAE;AAAA,QACjB,MAAM,YACL,OAAO,YAAY,WACnB,OAAO,YAAY,cACnB,OAAO;AAAA,QACR,IAAI,EAAE,QAAQ,YAAa,EAAE,QAAQ,OAAO,CAAC,WAAY;AAAA,UACxD,EAAE,eAAe;AAAA,UACjB,aAAa;AAAA,QACd;AAAA,QACA,IAAI,EAAE,QAAQ,SAAS;AAAA,UACtB,EAAE,eAAe;AAAA,UACjB,cAAc;AAAA,QACf;AAAA,MACD;AAAA;AAAA,IAGD,IAAI,QAAQ;AAAA,MACX,SAAS,iBAAiB,WAAW,YAAY;AAAA,MACjD,OAAO,MAAM,SAAS,oBAAoB,WAAW,YAAY;AAAA,IAClE;AAAA,KACE,CAAC,QAAQ,cAAc,eAAe,YAAY,CAAC;AAAA,EAEtD,IAAI,CAAC;AAAA,IAAQ,OAAO;AAAA,EAEpB,uBACC,KAkEE,OAlEF;AAAA,IACC,MAAK;AAAA,IACL,cAAW;AAAA,IACX,WAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW,CAAC,MAAM;AAAA,MACjB,MAAM,SAAS,EAAE;AAAA,MACjB,MAAM,YACL,OAAO,YAAY,WACnB,OAAO,YAAY,cACnB,OAAO;AAAA,MACR,KACE,EAAE,QAAQ,YAAa,EAAE,QAAQ,OAAO,CAAC,cAC1C,CAAC,cACA;AAAA,QACD,EAAE,eAAe;AAAA,QACjB,aAAa;AAAA,MACd;AAAA;AAAA,IAjBF,0BAoBC,KA6CE,OA7CF;AAAA,MAAK,WAAU;AAAA,MAAf,UA6CE;AAAA,wBA5CD,KAgBE,OAhBF;AAAA,UAAK,WAAU;AAAA,UAAf,UAgBE;AAAA,4BAfD,KAKE,OALF;AAAA,cAAK,WAAU;AAAA,cAAf,UAKE;AAAA,gBAJA,YAAY,iCACZ,KAAC,aAAD;AAAA,kBAAa,WAAU;AAAA,iBAA2B;AAAA,gCAEnD,KAA+C,MAA/C;AAAA,kBAAI,WAAU;AAAA,kBAAd,UAAuC;AAAA,iBAAQ;AAAA;AAAA,aAC9C;AAAA,4BACF,KAQE,UARF;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,UAAU;AAAA,cACV,WAAU;AAAA,cACV,cAAW;AAAA,cALZ,0BAOC,KAAC,GAAD;AAAA,gBAAG,WAAU;AAAA,eAAU;AAAA,aACtB;AAAA;AAAA,SACD;AAAA,wBAEF,KAEE,OAFF;AAAA,UAAK,WAAU;AAAA,UAAf,0BACC,KAAgD,KAAhD;AAAA,YAAG,WAAU;AAAA,YAAb,UAAsC;AAAA,WAAU;AAAA,SAC/C;AAAA,wBAEF,KAqBE,OArBF;AAAA,UAAK,WAAU;AAAA,UAAf,UAqBE;AAAA,4BApBD,KAOE,UAPF;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,UAAU;AAAA,cACV,WAAU;AAAA,cAJX,UAME;AAAA,aACA;AAAA,4BACF,KAWE,UAXF;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,UAAU;AAAA,cACV,WAAW,+EACV,YAAY,gBACT,uEACA;AAAA,cAPL,UAUE,eAAe,kBAAkB;AAAA,aACjC;AAAA;AAAA,SACD;AAAA;AAAA,KACD;AAAA,GACD;AAAA;;AE9IJ,sBAAS,wBAAW;AACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACDA,mBAAS;AAwBT,IAAI,UAAU;AAEP,IAAM,gBAAgB,QAAmB,CAAC,SAAS;AAAA,EACzD,QAAQ,CAAC;AAAA,EACT,UAAU,CAAC,UAAU;AAAA,IACpB,MAAM,KAAK,SAAS,EAAE;AAAA,IACtB,IAAI,CAAC,WAAW;AAAA,MACf,QAAQ,CAAC,GAAG,MAAM,QAAQ,KAAK,OAAO,GAAG,CAAC;AAAA,IAC3C,EAAE;AAAA,IACF,OAAO;AAAA;AAAA,EAER,aAAa,CAAC,OACb,IAAI,CAAC,WAAW;AAAA,IACf,QAAQ,MAAM,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,EAC/C,EAAE;AAAA,EACH,aAAa,CAAC,IAAI,YACjB,IAAI,CAAC,WAAW;AAAA,IACf,QAAQ,MAAM,OAAO,IAAI,CAAC,MAAO,EAAE,OAAO,KAAK,KAAK,MAAM,QAAQ,IAAI,CAAE;AAAA,EACzE,EAAE;AAAA,EACH,aAAa,MAAM,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;AACtC,EAAE;AAEK,SAAS,KAAK,CACpB,SACA,OAAkB,WAClB,WAAW,MACV;AAAA,EACD,MAAM,KAAK,cAAc,SAAS,EAAE,SAAS,EAAE,SAAS,MAAM,SAAS,CAAC;AAAA,EACxE,IAAI,WAAW,GAAG;AAAA,IACjB,WAAW,MAAM;AAAA,MAChB,cAAc,SAAS,EAAE,YAAY,EAAE;AAAA,OACrC,QAAQ;AAAA,EACZ;AAAA,EACA,OAAO;AAAA;AAGR,MAAM,UAAU,CAAC,SAAiB,WAAW,SAC5C,MAAM,SAAS,WAAW,QAAQ;AACnC,MAAM,QAAQ,CAAC,SAAiB,WAAW,SAC1C,MAAM,SAAS,SAAS,QAAQ;AACjC,MAAM,OAAO,CAAC,SAAiB,WAAW,SACzC,MAAM,SAAS,WAAW,QAAQ;AACnC,MAAM,UAAU,CAAC,YAAoB,MAAM,SAAS,WAAW,CAAC;AAEhE,MAAM,oBAAoB,CACzB,SACA,QACA,WAAW,SACP;AAAA,EACJ,MAAM,KAAK,cAAc,SAAS,EAAE,SAAS;AAAA,IAC5C;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACD,CAAC;AAAA,EACD,IAAI,WAAW,GAAG;AAAA,IACjB,WAAW,MAAM;AAAA,MAChB,cAAc,SAAS,EAAE,YAAY,EAAE;AAAA,OACrC,QAAQ;AAAA,EACZ;AAAA,EACA,OAAO;AAAA;;;ACpFD,SAAS,OAAO,CAAC,KAAa;AAAA,EACpC,IAAI,OAAO,SAAS,OAAO,KAAK;AAAA,IAC/B,OAAO,OAAO,YAAY,EAAE,MAAM,iBAAiB,IAAI,GAAG,GAAG;AAAA,EAC9D,EAAO;AAAA,IACN,OAAO,KAAK,KAAK,UAAU,qBAAqB;AAAA;AAAA;;;;AFWlD,IAAM,QAA4C;AAAA,EACjD,yBAAS,KAAC,YAAD;AAAA,IAAY,WAAU;AAAA,GAAU;AAAA,EACzC,yBAAS,KAAC,aAAD;AAAA,IAAa,WAAU;AAAA,GAAyB;AAAA,EACzD,uBAAO,KAAC,SAAD;AAAA,IAAS,WAAU;AAAA,GAAuB;AAAA,EACjD,yBAAS,KAAC,SAAD;AAAA,IAAS,WAAU;AAAA,GAAuB;AACpD;AAEA,SAAS,SAAS,GAAG,iBAA2B;AAAA,EAC/C,OAAO,WAAW,gBAAgB,UAAS,KAAK;AAAA,EAChD,MAAM,cAAc,cAAc,CAAC,MAAM,EAAE,WAAW;AAAA,EAEtD,WAAU,MAAM;AAAA,IACf,sBAAsB,MAAM,aAAa,IAAI,CAAC;AAAA,KAC5C,CAAC,CAAC;AAAA,EAEL,MAAM,gBAAgB,MAAM;AAAA,IAC3B,aAAa,KAAK;AAAA,IAClB,WAAW,MAAM,YAAY,OAAM,EAAE,GAAG,GAAG;AAAA;AAAA,EAG5C,uBAEC,MA0BE,OA1BF;AAAA,IACC,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,MAKR,YAAY,8BAA8B;AAAA;AAAA,IAE7C,SAAS;AAAA,IACT,MAAK;AAAA,IATN,UA0BE;AAAA,MAfA,MAAM,OAAM;AAAA,sBACb,KAA2D,QAA3D;AAAA,QAAM,WAAU;AAAA,QAAhB,UAA2C,OAAM;AAAA,OAAU;AAAA,MAC1D,OAAM,0BACN,MAUE,UAVF;AAAA,QACC,MAAK;AAAA,QACL,SAAS,CAAC,MAAM;AAAA,UACf,EAAE,gBAAgB;AAAA,UAClB,QAAQ,OAAM,QAAQ,IAAI;AAAA;AAAA,QAE3B,WAAU;AAAA,QANX,UAUE;AAAA,UAFA,OAAM,OAAO;AAAA,0BACd,KAAC,cAAD;AAAA,YAAc,WAAU;AAAA,WAAU;AAAA;AAAA,OACjC;AAAA;AAAA,GAEF;AAAA;AAIG,SAAS,OAAO,GAAG;AAAA,EACzB,MAAM,SAAS,cAAc,CAAC,MAAM,EAAE,MAAM;AAAA,EAE5C,IAAI,OAAO,WAAW;AAAA,IAAG,OAAO;AAAA,EAEhC,uBACC,KAIE,OAJF;AAAA,IAAK,WAAU;AAAA,IAAf,UACE,OAAO,IAAI,CAAC,2BACZ,KAAC,WAAD;AAAA,MAA0B,OAAO;AAAA,OAAjB,OAAM,EAAkB,CACxC;AAAA,GACA;AAAA;;AG7EJ,wBAAS,0BAAa;;;ACAtB,mBAAS;AAmBF,IAAM,uBAAuB,QAA0B,CAAC,SAAS;AAAA,EACvE,kBAAkB,CAAC;AAAA,EAEnB,oBAAoB,CAAC,aACpB,IAAI,CAAC,WAAW;AAAA,IACf,kBAAkB,CAAC,GAAG,MAAM,kBAAkB,QAAQ;AAAA,EACvD,EAAE;AAAA,EAEH,uBAAuB,CAAC,WACvB,IAAI,CAAC,WAAW;AAAA,IACf,kBAAkB,MAAM,iBAAiB,OACxC,CAAC,MAAM,EAAE,WAAW,MACrB;AAAA,EACD,EAAE;AAAA,EAEH,uBAAuB,CAAC,QAAQ,SAC/B,IAAI,CAAC,WAAW;AAAA,IACf,kBAAkB,MAAM,iBAAiB,IAAI,CAAC,MAC7C,EAAE,WAAW,SAAS,KAAK,GAAG,KAAK,IAAI,CACxC;AAAA,EACD,EAAE;AAAA,EAEH,uBAAuB,MAAM,IAAI,EAAE,kBAAkB,CAAC,EAAE,CAAC;AAAA,EAEzD,qBAAqB,CAAC,cAAc,IAAI,EAAE,kBAAkB,UAAU,CAAC;AACxE,EAAE;;;AD1CF,6BAAwB;AAAA;AAExB,IAAM,aAA8C;AAAA,EACnD,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA,EACb,MAAM;AAAA,EACN,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,UAAU;AACX;AAOO,SAAS,kBAAkB;AAAA,EACjC;AAAA,EACA;AAAA,GAC2B;AAAA,EAC3B,QAAQ,kBAAkB,0BAA0B,qBAAqB;AAAA,EACzE,OAAO,cAAc,mBAAmB,UAAwB,IAAI;AAAA,EAEpE,MAAM,iBAAiB,aACtB,OAAO,QAAgB,aAAsB;AAAA,IAC5C,gBAAgB,MAAM;AAAA,IACtB,IAAI;AAAA,MACH,MAAM,WAAW,MAAM,MACtB,GAAG,uBAAuB,sBAC1B;AAAA,QACC,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,EAAE,QAAQ,SAAS,CAAC;AAAA,MAC1C,CACD;AAAA,MACA,IAAI,SAAS,IAAI;AAAA,QAChB,sBAAsB,MAAM;AAAA,MAC7B;AAAA,MACC,OAAO,OAAO;AAAA,MACf,QAAQ,MAAM,4BAA4B,KAAK;AAAA,cAC9C;AAAA,MACD,gBAAgB,IAAI;AAAA;AAAA,KAGtB,CAAC,SAAS,WAAW,qBAAqB,CAC3C;AAAA,EAEA,IAAI,iBAAiB,WAAW;AAAA,IAAG,OAAO;AAAA,EAE1C,MAAM,aAAa,CAAC,SAA0B;AAAA,IAC7C,IAAI,CAAC;AAAA,MAAM,OAAO;AAAA,IAClB,IAAI,OAAO,SAAS;AAAA,MAAU,OAAO;AAAA,IACrC,IAAI;AAAA,MACH,MAAM,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,MACxC,OAAO,IAAI,SAAS,MAAM,GAAG,IAAI,MAAM,GAAG,GAAG,SAAS;AAAA,MACrD,MAAM;AAAA,MACP,OAAO,OAAO,IAAI;AAAA;AAAA;AAAA,EAIpB,uBACC,KAsDE,OAtDF;AAAA,IAAK,WAAU;AAAA,IAAf,UACE,iBAAiB,IAAI,CAAC,aAAa;AAAA,MACnC,MAAM,OAAO,WAAW,SAAS,aAAa;AAAA,MAC9C,MAAM,eAAe,iBAAiB,SAAS;AAAA,MAE/C,uBACC,MA6CE,OA7CF;AAAA,QAEC,WAAU;AAAA,QAFX,UA6CE;AAAA,0BAzCD,MAoBE,OApBF;AAAA,YAAK,WAAU;AAAA,YAAf,UAoBE;AAAA,8BAnBD,KAEE,OAFF;AAAA,gBAAK,WAAU;AAAA,gBAAf,0BACC,KAAC,MAAD;AAAA,kBAAM,WAAU;AAAA,iBAAuB;AAAA,eACtC;AAAA,8BACF,MAeE,OAfF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UAeE;AAAA,kCAdD,MAGE,MAHF;AAAA,oBAAI,WAAU;AAAA,oBAAd,UAGE;AAAA,sCAFD,KAAC,QAAD;AAAA,wBAAQ,WAAU;AAAA,uBAAuB;AAAA,sBAD1C;AAAA;AAAA,mBAGE;AAAA,kCACF,KAIE,KAJF;AAAA,oBAAG,WAAU;AAAA,oBAAb,0BACC,KAEE,QAFF;AAAA,sBAAM,WAAU;AAAA,sBAAhB,UACE,SAAS;AAAA,qBACT;AAAA,mBACD;AAAA,kBACD,SAAS,wBACT,KAEE,OAFF;AAAA,oBAAK,WAAU;AAAA,oBAAf,UACE,WAAW,SAAS,IAAI;AAAA,mBACxB;AAAA;AAAA,eAEF;AAAA;AAAA,WACD;AAAA,0BACF,MAmBE,OAnBF;AAAA,YAAK,WAAU;AAAA,YAAf,UAmBE;AAAA,8BAlBD,MAQE,UARF;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM,eAAe,SAAS,QAAQ,KAAK;AAAA,gBACpD,UAAU;AAAA,gBACV,WAAU;AAAA,gBAJX,UAQE;AAAA,kCAFD,KAAC,IAAD;AAAA,oBAAG,WAAU;AAAA,mBAAU;AAAA,kBANxB;AAAA;AAAA,eAQE;AAAA,8BACF,MAQE,UARF;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM,eAAe,SAAS,QAAQ,IAAI;AAAA,gBACnD,UAAU;AAAA,gBACV,WAAU;AAAA,gBAJX,UAQE;AAAA,kCAFD,KAAC,OAAD;AAAA,oBAAO,WAAU;AAAA,mBAAU;AAAA,kBAC1B,eAAe,iBAAiB;AAAA;AAAA,eAChC;AAAA;AAAA,WACD;AAAA;AAAA,SA3CG,SAAS,MA4Cb;AAAA,KAEH;AAAA,GACA;AAAA;;AEtHJ,8BAAe;;;ACAf,mBAAS;AACT;AAQO,IAAM,qBAAqB,QAAwB,EACzD,QACC,CAAC,KAAK,SAAS;AAAA,EACd,QAAQ,CAAC;AAAA,EACT,UAAU,CAAC,KAAK,UACf,IAAI,CAAC,WAAW;AAAA,IACf,QAAQ,KAAK,MAAM,SAAS,MAAM,MAAM;AAAA,EACzC,EAAE;AAAA,EACH,UAAU,CAAC,KAAK,iBAAiB,IAAI,EAAE,OAAO,QAAQ;AACvD,IACA;AAAA,EACC,MAAM;AACP,CACD,CACD;;;;ADXO,IAAM,eAAe,KAAK,SAAS,aAAY;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACqB;AAAA,EACrB,MAAM,UAAU,OAAsD,IAAI;AAAA,EAE1E,MAAM,kBAAkB,aACvB,CAAC,MAAwB;AAAA,IACxB,EAAE,eAAe;AAAA,IACjB,MAAM,eAAe,mBACnB,SAAS,EACT,SAAS,UAAU,YAAY;AAAA,IACjC,QAAQ,UAAU,EAAE,QAAQ,EAAE,SAAS,YAAY,aAAa;AAAA,IAEhE,MAAM,kBAAkB,CAAC,OAAmB;AAAA,MAC3C,IAAI,CAAC,QAAQ;AAAA,QAAS;AAAA,MACtB,MAAM,QAAQ,GAAG,UAAU,QAAQ,QAAQ;AAAA,MAC3C,MAAM,WACL,SAAS,UACN,QAAQ,QAAQ,aAAa,QAC7B,QAAQ,QAAQ,aAAa;AAAA,MACjC,MAAM,UAAU,KAAK,IAAI,KAAK,IAAI,UAAU,QAAQ,GAAG,QAAQ;AAAA,MAC/D,mBAAmB,SAAS,EAAE,SAAS,UAAU,OAAO;AAAA,MACxD,gBAAgB,OAAO;AAAA;AAAA,IAGxB,MAAM,gBAAgB,MAAM;AAAA,MAC3B,QAAQ,UAAU;AAAA,MAClB,SAAS,oBAAoB,aAAa,eAAe;AAAA,MACzD,SAAS,oBAAoB,WAAW,aAAa;AAAA,MACrD,SAAS,KAAK,MAAM,SAAS;AAAA,MAC7B,SAAS,KAAK,MAAM,aAAa;AAAA;AAAA,IAGlC,SAAS,iBAAiB,aAAa,eAAe;AAAA,IACtD,SAAS,iBAAiB,WAAW,aAAa;AAAA,IAClD,SAAS,KAAK,MAAM,SAAS;AAAA,IAC7B,SAAS,KAAK,MAAM,aAAa;AAAA,KAElC,CAAC,UAAU,MAAM,UAAU,UAAU,cAAc,aAAa,CACjE;AAAA,EAEA,uBAEC,KAAC,OAAD;AAAA,IACC,WAAW,wHACV,SAAS,UAAU,WAAW;AAAA,IAE/B,aAAa;AAAA,GACd;AAAA,CAED;;AEnED;AAAA,cACC;AAAA,YACA;AAAA,eACA;AAAA,iBACA;AAAA,UACA;AAAA,gBACA;AAAA;AAAA,aAEA;AAAA;AAID;AAAA;AAAA;AAAA,OAGC;AAAA;AAAA,WAEA;AAAA,cACA;AAAA;AAAA;AAAA,eAGA;AAAA;AAAA;;;ACrBD,sBAAS;AACT;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BA,SAAS,WAAW,CAAC,UAA8B;AAAA,EAClD,MAAM,MAAM,SAAS,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY;AAAA,EAEnD,QAAQ;AAAA,SACF;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,MACJ,OAAO;AAAA,SACH;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,MACJ,OAAO;AAAA,SACH;AAAA,SACA;AAAA,SACA;AAAA,MACJ,OAAO;AAAA,SACH;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,MACJ,OAAO;AAAA,SACH;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,MACJ,OAAO;AAAA,SACH;AAAA,SACA;AAAA,MACJ,OAAO;AAAA;AAAA,MAEP,OAAO;AAAA;AAAA;AAIV,SAAS,gBAAgB,CACxB,UACA,iBACC;AAAA,EACD,MAAM,SAAS,gBAAgB,IAAI,QAAQ;AAAA,EAC3C,IAAI,CAAC,QAAQ;AAAA,IACZ,OAAO;AAAA,EACR;AAAA,EAEA,MAAM,SAGF;AAAA,IACH,OAAO,EAAE,MAAM,MAAM,OAAO,SAAS,WAAW,iBAAiB;AAAA,IACjE,UAAU,EAAE,MAAM,QAAQ,OAAO,YAAY,WAAW,kBAAkB;AAAA,IAC1E,WAAW,EAAE,MAAM,MAAM,OAAO,aAAa,WAAW,gBAAgB;AAAA,EACzE;AAAA,EAEA,OACC,OAAM,WAAW;AAAA,IAChB,MAAM;AAAA,IACN,OAAO;AAAA,IACP,WAAW;AAAA,EACZ;AAAA;AAIK,SAAS,gBAAgB;AAAA,EAC/B;AAAA,EACA,eAAe,CAAC;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACyB;AAAA,EACzB,MAAM,kBAAkB,QACvB,MAAM,IAAI,IAAI,cAAc,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,GAChE,CAAC,YAAY,CACd;AAAA,EAEA,MAAM,OAAO,QACZ,MACC,IAAI,KACH,MAAM,IAAI,CAAC,OAAO;AAAA,IACjB,MAAM;AAAA,IACN,UAAU,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK;AAAA,IAChC,YAAY,EAAE,QAAQ,YAAY,EAAE;AAAA,EACrC,EAAE,GACF;AAAA,IACC,MAAM;AAAA,MACL,EAAE,MAAM,YAAY,QAAQ,EAAE;AAAA,MAC9B,EAAE,MAAM,cAAc,QAAQ,IAAI;AAAA,MAClC,EAAE,MAAM,QAAQ,QAAQ,EAAE;AAAA,IAC3B;AAAA,IACA,WAAW;AAAA,IACX,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,cAAc;AAAA,EACf,CACD,GACD,CAAC,KAAK,CACP;AAAA,EAEA,MAAM,UAAU,QAAQ,MAAM;AAAA,IAC7B,IAAI,CAAC,OAAO;AAAA,MACX,OAAO,MAAM,MAAM,GAAG,EAAE;AAAA,IACzB;AAAA,IACA,MAAM,kBAAkB,MAAM,QAAQ,YAAY,EAAE;AAAA,IACpD,MAAM,gBAAgB,KAAK,OAAO,eAAe;AAAA,IAEjD,cAAc,KAAK,CAAC,GAAG,MAAM;AAAA,MAC5B,MAAM,SAAS,EAAE,SAAS;AAAA,MAC1B,MAAM,SAAS,EAAE,SAAS;AAAA,MAC1B,MAAM,YAAY,KAAK,IAAI,SAAS,MAAM;AAAA,MAC1C,IAAI,YAAY,MAAM;AAAA,QACrB,MAAM,WAAW,gBAAgB,IAAI,EAAE,KAAK,IAAI;AAAA,QAChD,MAAM,WAAW,gBAAgB,IAAI,EAAE,KAAK,IAAI;AAAA,QAChD,IAAI,YAAY,CAAC;AAAA,UAAU,OAAO;AAAA,QAClC,IAAI,CAAC,YAAY;AAAA,UAAU,OAAO;AAAA,MACnC;AAAA,MACA,OAAO,SAAS;AAAA,KAChB;AAAA,IAED,OAAO,cAAc,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI;AAAA,KACtD,CAAC,MAAM,OAAO,OAAO,eAAe,CAAC;AAAA,EAExC,WAAU,MAAM;AAAA,IACf,MAAM,UAAU,SAAS,eAAe,aAAa,eAAe;AAAA,IACpE,SAAS,eAAe,EAAE,OAAO,UAAU,CAAC;AAAA,KAC1C,CAAC,aAAa,CAAC;AAAA,EAElB,WAAU,MAAM;AAAA,IACf,cAAc,QAAQ,cAAc;AAAA,KAClC,CAAC,SAAS,eAAe,aAAa,CAAC;AAAA,EAE1C,WAAU,MAAM;AAAA,IACf,MAAM,qBAAqB,CAAC,MAAkB;AAAA,MAC7C,MAAM,SAAS,EAAE;AAAA,MACjB,IAAI,CAAC,OAAO,QAAQ,2BAA2B,GAAG;AAAA,QACjD,QAAQ;AAAA,MACT;AAAA;AAAA,IAED,SAAS,iBAAiB,aAAa,kBAAkB;AAAA,IACzD,OAAO,MAAM,SAAS,oBAAoB,aAAa,kBAAkB;AAAA,KACvE,CAAC,OAAO,CAAC;AAAA,EAEZ,IAAI,QAAQ,WAAW,GAAG;AAAA,IACzB,uBACC,KAKE,OALF;AAAA,MACC,2BAAuB;AAAA,MACvB,WAAU;AAAA,MAFX,0BAIC,KAAgE,QAAhE;AAAA,QAAM,WAAU;AAAA,QAAhB;AAAA,OAAgE;AAAA,KAC/D;AAAA,EAEJ;AAAA,EAEA,uBACC,KA0CE,OA1CF;AAAA,IACC,2BAAuB;AAAA,IACvB,WAAU;AAAA,IAFX,UAIE,QAAQ,IAAI,CAAC,UAAU,0BACvB,KAmCE,UAnCF;AAAA,MACC,MAAK;AAAA,MAEL,IAAI,aAAa;AAAA,MACjB,aAAa,CAAC,MAAM;AAAA,QACnB,EAAE,eAAe;AAAA,QACjB,SAAS,QAAQ;AAAA;AAAA,MAElB,WAAW,8CACV,UAAU,gBAAgB,cAAc;AAAA,MAT1C,0BAYC,MAsBE,OAtBF;AAAA,QAAK,WAAU;AAAA,QAAf,UAsBE;AAAA,WArBC,MAAM;AAAA,YACP,MAAM,OAAO,YAAY,QAAQ;AAAA,YACjC,uBACC,KAAC,MAAD;AAAA,cAAM,WAAU;AAAA,aAA8C;AAAA,aAE7D;AAAA,0BACH,KAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UACE;AAAA,WACA;AAAA,WACA,MAAM;AAAA,YACP,MAAM,SAAS,iBAAiB,UAAU,eAAe;AAAA,YACzD,OACC,0BACC,KAIE,QAJF;AAAA,cAAM,OAAO,OAAO;AAAA,cAApB,0BACC,KAAC,OAAO,MAAR;AAAA,gBACC,WAAW,6BAA6B,OAAO;AAAA,eAChD;AAAA,aACC;AAAA,aAGF;AAAA;AAAA,OACF;AAAA,OAhCG,QAiCJ,CACF;AAAA,GACA;AAAA;;;AC9OJ,sBAAS,uBAAW;;;ACApB;;;ACAA;AAAA,mBACC;AAAA,kBACA;AAAA,kBACA;AAAA,mBACA;AAAA,kBACA;AAAA,mBACA;AAAA,mBACA;AAAA,qBACA;AAAA,qBACA;AAAA,kBACA;AAAA;;;ACVD;;;ACOA,SAAS,iBAAiB,GAAW;AAAA,EAEpC,MAAM,SAAS,YAAY,KAAK;AAAA,EAChC,IAAI,QAAQ;AAAA,IACX,OAAO;AAAA,EACR;AAAA,EAGA,IAAI,OAAO,WAAW,aAAa;AAAA,IAClC,MAAM,MAAM;AAAA,IACZ,IAAI,IAAI,iBAAiB;AAAA,MACxB,OAAO,IAAI;AAAA,IACZ;AAAA,IACA,IAAI,IAAI,kBAAkB;AAAA,MACzB,OAAO,IAAI;AAAA,IACZ;AAAA,EACD;AAAA,EAGA,OAAO;AAAA;AAGD,SAAS,oBAAoB,GAAW;AAAA,EAC9C,OAAO,kBAAkB;AAAA;AAGnB,IAAM,eAAe,kBAAkB;AAEvC,IAAM,SAAS;AAAA,EACrB,YAAY;AACb;;;ADzBA,SAAS,gBAAgB,GAAwB;AAAA,EAChD,IAAI,OAAO,WAAW,eAAe,OAAO,OAAO,UAAU,YAAY;AAAA,IACxE,OAAO;AAAA,EACR;AAAA,EACA;AAAA;AAGM,SAAS,mBAAmB,CAAC,OAAwB;AAAA,EAC3D,IAAI,CAAC;AAAA,IAAO,OAAO;AAAA,EACnB,IAAI,OAAO,UAAU;AAAA,IAAU,OAAO;AAAA,EACtC,IAAI,SAAS,OAAO,UAAU,UAAU;AAAA,IACvC,MAAM,SAAS;AAAA,IACf,IAAI,OAAO,SAAS,OAAO,OAAO,UAAU,UAAU;AAAA,MACrD,MAAM,aAAa,OAAO;AAAA,MAC1B,IAAI,OAAO,WAAW,YAAY;AAAA,QAAU,OAAO,WAAW;AAAA,IAC/D;AAAA,IACA,IAAI,OAAO,OAAO,UAAU;AAAA,MAAU,OAAO,OAAO;AAAA,IACpD,IAAI,OAAO,OAAO,YAAY;AAAA,MAAU,OAAO,OAAO;AAAA,IACtD,IAAI;AAAA,MACH,OAAO,KAAK,UAAU,KAAK;AAAA,MAC1B,MAAM;AAAA,MACP,OAAO;AAAA;AAAA,EAET;AAAA,EACA,OAAO;AAAA;AAGD,SAAS,kBAAkB,GAAG;AAAA,EACpC,MAAM,MAAM;AAAA,EACZ,MAAM,UAAU,IAAI,mBAAmB;AAAA,EACvC,OAAO,UAAU;AAAA,IAChB;AAAA,IACA,SAAS,iBAAiB;AAAA,EAC3B,CAAC;AAAA;AAGF,mBAAmB;AAEZ,SAAS,UAAU,GAAW;AAAA,EACpC,MAAM,MAAM;AAAA,EACZ,IAAI,IAAI;AAAA,IAAiB,OAAO,IAAI;AAAA,EACpC,OAAO;AAAA;AAGD,SAAS,cAAc,CAAC,YAAiC;AAAA,EAC/D,OAAO;AAAA,OACH;AAAA,IACH,OAAO,WAAW,SAAS;AAAA,IAC3B,WACC,OAAO,WAAW,cAAc,WAC7B,IAAI,KAAK,WAAW,SAAS,EAAE,QAAQ,IACvC,WAAW;AAAA,IACf,cACC,OAAO,WAAW,iBAAiB,WAChC,IAAI,KAAK,WAAW,YAAY,EAAE,QAAQ,IAC1C,WAAW;AAAA,EAChB;AAAA;AAGM,SAAS,cAAc,CAAC,YAAiC;AAAA,EAC/D,OAAO;AAAA,OACH;AAAA,IACH,WACC,OAAO,WAAW,cAAc,WAC7B,IAAI,KAAK,WAAW,SAAS,EAAE,QAAQ,IACvC,WAAW;AAAA,IACf,aAAa,WAAW,cACrB,OAAO,WAAW,gBAAgB,WACjC,IAAI,KAAK,WAAW,WAAW,EAAE,QAAQ,IACzC,WAAW,cACZ;AAAA,EACJ;AAAA;;;ADpDM,IAAM,gBAAgB;AAAA,OACtB,YAAW,GAAuB;AAAA,IACvC,MAAM,OAAO,MAAM,KAAK,gBAAgB,EAAE,OAAO,IAAI,CAAC;AAAA,IACtD,OAAO,KAAK;AAAA;AAAA,OAGP,gBAAe,CACpB,SAA8C,CAAC,GACvB;AAAA,IACxB,QAAQ,QAAQ,IAAI,SAAS,MAAM;AAAA,IACnC,MAAM,WAAW,MAAM,gBAAgB;AAAA,MACtC,OAAO,EAAE,OAAO,OAAO;AAAA,IACxB,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IACvE,MAAM,OAAO,SAAS;AAAA,IACtB,OAAO;AAAA,MACN,QAAQ,MAAM,SAAS,CAAC,GAAG,IAAI,CAAC,MAAM,eAAe,CAAe,CAAC;AAAA,MACrE,SAAS,MAAM,WAAW;AAAA,MAC1B,YAAY,MAAM,cAAc;AAAA,IACjC;AAAA;AAAA,OAGK,cAAa,CAAC,MAA8C;AAAA,IACjE,MAAM,WAAW,MAAM,iBAAiB;AAAA,MACvC,MAAM;AAAA,IACP,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IACvE,IAAI,CAAC,SAAS;AAAA,MAAM,MAAM,IAAI,MAAM,sCAAsC;AAAA,IAC1E,OAAO,eAAe,SAAS,IAAI;AAAA;AAAA,OAG9B,cAAa,CAClB,WACA,MACmB;AAAA,IACnB,MAAM,WAAW,MAAM,iBAAiB;AAAA,MACvC,MAAM,EAAE,UAAU;AAAA,MAElB,MAAM;AAAA,IACP,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IACvE,OAAO,eAAe,SAAS,IAAkB;AAAA;AAAA,OAG5C,cAAa,CAAC,WAAkD;AAAA,IACrE,MAAM,WAAW,MAAM,iBAAiB,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAAA,IAC/D,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IACvE,OAAO,SAAS;AAAA;AAAA,OAGX,aAAY,CAAC,WAAkD;AAAA,IACpE,MAAM,WAAW,MAAM,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAAA,IAC9D,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IACvE,OAAO,SAAS;AAAA;AAAA,OAGX,aAAY,CACjB,WACA,YACwE;AAAA,IACxE,MAAM,WAAW,MAAM,gBAAgB;AAAA,MACtC,MAAM,EAAE,UAAU;AAAA,IACnB,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,yBAAyB;AAAA,IAC7D,OAAO,SAAS;AAAA;AAAA,OAOX,cAAa,CAAC,WAIjB;AAAA,IACF,MAAM,WAAW,MAAM,mBAAmB,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAAA,IACjE,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,2BAA2B;AAAA,IAE/D,OAAO,SAAS;AAAA;AAAA,OAGX,gBAAe,CACpB,WACA,WAME;AAAA,IACF,MAAM,WAAW,MAAM,mBAAmB;AAAA,MACzC,MAAM,EAAE,WAAW,UAAU;AAAA,IAC9B,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,6BAA6B;AAAA,IAEjE,OAAO,SAAS;AAAA;AAAA,OAGX,YAAW,CAAC,WAAuC;AAAA,IACxD,MAAM,WAAW,MAAM,gBAAgB,EAAE,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;AAAA,IAClE,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IACvE,QAAQ,SAAS,QAAQ,CAAC,GAAG,IAAI,cAAc;AAAA;AAAA,OAG1C,YAAW,CAChB,WACA,MAC+B;AAAA,IAC/B,MAAM,WAAW,MAAM,iBAAiB;AAAA,MACvC,MAAM,EAAE,IAAI,UAAU;AAAA,MACtB,MAAM;AAAA,IACP,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IACvE,OAAO,SAAS;AAAA;AAAA,EAGjB,YAAY,CAAC,WAA2B;AAAA,IACvC,OAAO,GAAG,WAAW,iBAAiB;AAAA;AAAA,OAGjC,aAAY,CACjB,WACA,WACmD;AAAA,IACnD,MAAM,WAAW,MAAM,gBAAgB;AAAA,MACtC,MAAM,EAAE,WAAW,UAAU;AAAA,IAC9B,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAElB;;;AGnKA;AAAA,kBACC;AAAA,gBACA;AAAA,kBACA;AAAA,gBACA;AAAA,kBACA;AAAA,kBACA;AAAA,iBACA;AAAA,mBACA;AAAA,2BACA;AAAA,iBACA;AAAA,iBACA;AAAA,iBACA;AAAA,mBACA;AAAA,kBACA;AAAA,qBACA;AAAA;AAgBM,IAAM,WAAW;AAAA,OACjB,YAAW,GAAoD;AAAA,IACpE,MAAM,WAAW,MAAM,eAAe;AAAA,IACtC,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAQ,SAAS,MAAc;AAAA;AAAA,OAG1B,aAAY,GAA+B;AAAA,IAChD,MAAM,WAAW,MAAM,gBAAgB;AAAA,IACvC,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAQ,SAAS,MAAc;AAAA;AAAA,OAG1B,WAAU,CACf,MACA,SAAkB,OACS;AAAA,IAC3B,MAAM,WAAW,MAAM,cAAc;AAAA,MACpC,OAAO,EAAE,MAAM,QAAQ,SAAS,SAAS,QAAQ;AAAA,IAClD,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAQ,SAAS,MAAc;AAAA;AAAA,OAG1B,mBAAkB,CACvB,MACA,SAAS,OACkB;AAAA,IAC3B,MAAM,WAAW,MAAM,cAAc;AAAA,MACpC,OAAO;AAAA,QACN;AAAA,QACA,QAAQ,SAAS,SAAS;AAAA,QAC1B,UAAU;AAAA,MACX;AAAA,IACD,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAQ,SAAS,MAAc;AAAA;AAAA,OAG1B,sBAAqB,CAC1B,WAC4C;AAAA,IAC5C,MAAM,WAAW,MAAM,yBAAyB;AAAA,MAC/C,MAAM,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,IACpC,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAQ,SAAS,MAAc;AAAA;AAAA,OAG1B,WAAU,CAAC,OAA4C;AAAA,IAC5D,MAAM,WAAW,MAAM,cAAc;AAAA,MAEpC,MAAM,EAAE,MAAM;AAAA,IACf,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAQ,SAAS,MAAc;AAAA;AAAA,OAG1B,aAAY,CAAC,OAA8C;AAAA,IAChE,MAAM,WAAW,MAAM,gBAAgB;AAAA,MAEtC,MAAM,EAAE,MAAM;AAAA,IACf,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAQ,SAAS,MAAc;AAAA;AAAA,OAG1B,aAAY,CAAC,OAAkD;AAAA,IACpE,MAAM,WAAW,MAAM,gBAAgB;AAAA,MAEtC,MAAM,EAAE,MAAM;AAAA,IACf,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAQ,SAAS,MAAc;AAAA;AAAA,OAG1B,YAAW,CAAC,OAAiD;AAAA,IAClE,MAAM,WAAW,MAAM,eAAe;AAAA,MAErC,MAAM,EAAE,MAAM;AAAA,IACf,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAQ,SAAS,MAAc;AAAA;AAAA,OAG1B,cAAa,CAAC,SAA6C;AAAA,IAChE,MAAM,WAAW,MAAM,iBAAiB;AAAA,MAEvC,MAAM,EAAE,QAAQ;AAAA,IACjB,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAQ,SAAS,MAAc;AAAA;AAAA,OAG1B,aAAY,GAA2B;AAAA,IAC5C,MAAM,WAAW,MAAM,gBAAgB;AAAA,IACvC,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAQ,SAAS,MAAc;AAAA;AAAA,OAG1B,YAAW,GAA6B;AAAA,IAC7C,MAAM,WAAW,MAAM,eAAe;AAAA,MAErC,MAAM,CAAC;AAAA,IACR,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAQ,SAAS,MAAc;AAAA;AAAA,OAG1B,YAAW,GAA6B;AAAA,IAC7C,MAAM,WAAW,MAAM,eAAe;AAAA,MAErC,MAAM,CAAC;AAAA,IACR,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAQ,SAAS,MAAc;AAAA;AAAA,OAG1B,WAAU,GAA6B;AAAA,IAC5C,MAAM,WAAW,MAAM,iBAAiB;AAAA,IACxC,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAQ,SAAS,MAAc,MAAM;AAAA;AAAA,OAGhC,UAAS,CACd,MACA,KACyC;AAAA,IACzC,MAAM,WAAW,MAAM,gBAAgB;AAAA,MAEtC,MAAM,EAAE,MAAM,IAAI;AAAA,IACnB,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAQ,SAAS,MAAc;AAAA;AAAA,OAG1B,aAAY,CAAC,MAA4C;AAAA,IAC9D,MAAM,WAAW,MAAM,mBAAmB;AAAA,MAEzC,MAAM,EAAE,KAAK;AAAA,IACd,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAQ,SAAS,MAAc;AAAA;AAEjC;;;AC/LA;AAAA,eACC;AAAA,uBACA;AAAA,kBACA;AAAA,oBACA;AAAA;AAKM,IAAM,cAAc;AAAA,OACpB,UAAS,GAWZ;AAAA,IACF,MAAM,WAAW,MAAM,aAAa;AAAA,IACpC,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAAA,OAGX,UAAS,CAAC,YASb;AAAA,IACF,MAAM,WAAW,MAAM,qBAAqB;AAAA,MAE3C,MAAM,EAAE,UAAU,WAAkB;AAAA,IACrC,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAAA,OAGX,aAAY,GAA+B;AAAA,IAChD,MAAM,WAAW,MAAM,gBAAgB;AAAA,IACvC,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IACvE,OAAO,SAAS;AAAA;AAAA,OAGX,eAAc,CAAC,MAkBlB;AAAA,IACF,MAAM,WAAW,MAAM,kBAAkB;AAAA,MAExC,MAAM;AAAA,IACP,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAElB;;;AChFA;AAAA,eACC;AAAA,iBACA;AAAA,cACA;AAAA,qBACA;AAAA;AAKM,IAAM,aAAa;AAAA,OACnB,UAAS,GAAG;AAAA,IACjB,MAAM,WAAW,MAAM,aAAa;AAAA,IACpC,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IACvE,OAAO,SAAS;AAAA;AAAA,OAQX,YAAW,CAAC,UAAU,KAQzB;AAAA,IACF,MAAM,WAAW,MAAM,eAAe;AAAA,MACrC,OAAO,EAAE,MAAM,QAAQ;AAAA,IACxB,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAAA,OAGX,gBAAe,CAAC,UAKnB;AAAA,IACF,MAAM,WAAW,MAAM,YAAY;AAAA,MAClC,OAAO,EAAE,MAAM,SAAS;AAAA,IACzB,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAAA,OAGX,gBAAe,CAAC,WAAkD;AAAA,IACvE,MAAM,WAAW,MAAM,mBAAmB,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAAA,IACjE,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IACvE,OAAO,SAAS;AAAA;AAElB;;;ACzDA;AAAA,kBACC;AAAA,kBACA;AAAA,sBACA;AAAA,oBACA;AAAA,kBACA;AAAA,eACA;AAAA;AAaM,IAAM,gBAAgB;AAAA,OACtB,aAAY,CACjB,WACA,MACwB;AAAA,IACxB,MAAM,WAAW,MAAM,gBAAgB;AAAA,MACtC,MAAM,EAAE,UAAU;AAAA,MAElB,MAAM;AAAA,IACP,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IACvE,OAAO,SAAS;AAAA;AAAA,OAGX,aAAY,CAAC,WAAkD;AAAA,IACpE,MAAM,WAAW,MAAM,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAAA,IAC9D,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IACvE,OAAO,SAAS;AAAA;AAAA,OAGX,iBAAgB,CAAC,WAAmD;AAAA,IACzE,MAAM,WAAW,MAAM,oBAAoB,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAAA,IAClE,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IACvE,OAAO,SAAS;AAAA;AAAA,OAGX,eAAc,CAAC,WAAyC;AAAA,IAC7D,MAAM,WAAW,MAAM,kBAAkB,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAAA,IAChE,IAAI,SAAS;AAAA,MAAO,OAAO,EAAE,QAAQ,MAAM;AAAA,IAC3C,OAAO,SAAS;AAAA;AAAA,OAGX,aAAY,CAAC,WAAkD;AAAA,IACpE,MAAM,WAAW,MAAM,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAAA,IAC9D,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IACvE,OAAO,SAAS;AAAA;AAAA,OAGX,YAAW,CAAC,WAAiD;AAAA,IAClE,MAAM,WAAW,MAAM,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAAA,IAC3D,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IACvE,OAAO,SAAS;AAAA;AAElB;;;AC9DA;AAAA,qBACC;AAAA,yBACA;AAAA;AAGM,IAAM,gBAAgB;AAAA,OACtB,gBAAe,CACpB,WACA,QACA,UAC8D;AAAA,IAC9D,MAAM,WAAW,MAAM,mBAAmB;AAAA,MAEzC,MAAM,EAAE,IAAI,UAAU;AAAA,MAEtB,MAAM,EAAE,QAAQ,UAAU,UAAU;AAAA,IACrC,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,8BAA8B;AAAA,IAElE,OAAO,SAAS;AAAA;AAAA,OAGX,oBAAmB,CAAC,WASvB;AAAA,IACF,MAAM,WAAW,MAAM,uBAAuB;AAAA,MAE7C,MAAM,EAAE,IAAI,UAAU;AAAA,IACvB,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,OAAO,EAAE,IAAI,OAAO,SAAS,CAAC,EAAE;AAAA,IAEpD,OAAO,SAAS;AAAA;AAElB;;;ACxCA;AAAA,oBACC;AAAA,mBACA;AAAA,wBACA;AAAA,yBACA;AAAA,2BACA;AAAA,yBACA;AAAA,8BACA;AAAA,yBACA;AAAA,2BACA;AAAA,uBACA;AAAA,iBACA;AAAA,qBACA;AAAA;AAIM,IAAM,YAAY;AAAA,OAClB,eAAc,GAiCV;AAAA,IACT,IAAI;AAAA,MACH,MAAM,WAAW,MAAM,kBAAkB;AAAA,MACzC,IAAI,SAAS;AAAA,QAAO,OAAO;AAAA,MAE3B,OAAO,SAAS;AAAA,MACf,MAAM;AAAA,MACP,OAAO;AAAA;AAAA;AAAA,OAIH,cAAa,GAIhB;AAAA,IACF,IAAI;AAAA,MACH,MAAM,WAAW,MAAM,iBAAiB;AAAA,MACxC,IAAI,SAAS;AAAA,QAAO,OAAO,EAAE,YAAY,MAAM;AAAA,MAE/C,OAAO,SAAS;AAAA,MACf,MAAM;AAAA,MACP,OAAO,EAAE,YAAY,MAAM;AAAA;AAAA;AAAA,OAIvB,mBAAkB,CAAC,UAAgC,WAI/C;AAAA,IACT,IAAI;AAAA,MACH,MAAM,WAAW,MAAM,sBAAsB;AAAA,QAC5C,OAAO,EAAE,QAAQ;AAAA,MAClB,CAAC;AAAA,MACD,IAAI,SAAS;AAAA,QAAO,OAAO;AAAA,MAE3B,OAAO,SAAS;AAAA,MACf,MAAM;AAAA,MACP,OAAO;AAAA;AAAA;AAAA,OAIH,sBAAqB,CAAC,QASlB;AAAA,IACT,IAAI;AAAA,MACH,MAAM,WAAW,MAAM,yBAAyB;AAAA,QAC/C,OAAO,EAAE,OAAO;AAAA,MACjB,CAAC;AAAA,MACD,IAAI,SAAS;AAAA,QAAO,OAAO;AAAA,MAE3B,OAAO,SAAS;AAAA,MACf,MAAM;AAAA,MACP,OAAO;AAAA;AAAA;AAAA,OAIH,oBAAmB,CACxB,QACA,YAQE;AAAA,IACF,MAAM,WAAW,MAAM,uBAAuB;AAAA,MAC7C,MAAM,EAAE,QAAQ,WAAW;AAAA,IAC5B,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAAA,OAGX,kBAAiB,CACtB,WACA,QACgD;AAAA,IAChD,MAAM,WAAW,MAAM,qBAAqB;AAAA,MAC3C,MAAM,EAAE,WAAW,OAAO;AAAA,IAC3B,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAAA,OAGX,YAAW,CAChB,WACA,QACgC;AAAA,IAChC,MAAM,WAAW,MAAM,eAAe;AAAA,MACrC,MAAM,EAAE,WAAW,OAAO;AAAA,IAC3B,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAAA,OAGX,gBAAe,CAAC,WAOnB;AAAA,IACF,IAAI;AAAA,MACH,MAAM,WAAW,MAAM,mBAAmB;AAAA,QACzC,OAAO,EAAE,UAAU;AAAA,MACpB,CAAC;AAAA,MACD,IAAI,SAAS;AAAA,QAAO,OAAO,EAAE,YAAY,MAAM;AAAA,MAE/C,OAAO,SAAS;AAAA,MACf,MAAM;AAAA,MACP,OAAO,EAAE,YAAY,MAAM;AAAA;AAAA;AAAA,OAIvB,oBAAmB,CAAC,YAKhB;AAAA,IACT,IAAI;AAAA,MACH,MAAM,WAAW,MAAM,uBAAuB;AAAA,QAC7C,OAAO,EAAE,WAAW;AAAA,MACrB,CAAC;AAAA,MACD,IAAI,SAAS;AAAA,QAAO,OAAO;AAAA,MAE3B,OAAO,SAAS;AAAA,MACf,MAAM;AAAA,MACP,OAAO;AAAA;AAAA;AAAA,OAIH,yBAAwB,CAAC,QAMrB;AAAA,IACT,IAAI;AAAA,MACH,MAAM,WAAW,MAAM,4BAA4B;AAAA,QAClD,OAAO,EAAE,OAAO;AAAA,MACjB,CAAC;AAAA,MACD,IAAI,SAAS;AAAA,QAAO,OAAO;AAAA,MAE3B,OAAO,SAAS;AAAA,MACf,MAAM;AAAA,MACP,OAAO;AAAA;AAAA;AAAA,OAIH,oBAAmB,CAAC,QAOvB;AAAA,IACF,MAAM,WAAW,MAAM,uBAAuB;AAAA,MAC7C,MAAM,EAAE,OAAO;AAAA,IAChB,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAAA,OAGX,sBAAqB,CAAC,QAQzB;AAAA,IACF,MAAM,WAAW,MAAM,yBAAyB;AAAA,MAC/C,MAAM;AAAA,IACP,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAElB;;;ACvPA;AAAA,mBACC;AAAA,qBACA;AAAA,sBACA;AAAA,sBACA;AAAA,uBACA;AAAA,oBACA;AAAA,wBACA;AAAA,iBACA;AAAA,uBACA;AAAA,4BACA;AAAA,2BACA;AAAA,2BACA;AAAA,sBACA;AAAA,8BACA;AAAA,2BACA;AAAA,sBACA;AAAA;AAKM,IAAM,YAAY;AAAA,OAClB,cAAa,GAsBhB;AAAA,IACF,MAAM,WAAW,MAAM,iBAAiB;AAAA,IACxC,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAAA,OAGX,gBAAe,GAIlB;AAAA,IACF,MAAM,WAAW,MAAM,mBAAmB;AAAA,IAC1C,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAAA,OAGX,iBAAgB,CAAC,YAGpB;AAAA,IACF,MAAM,WAAW,MAAM,oBAAoB;AAAA,MAC1C,MAAM,EAAE,WAAW;AAAA,IACpB,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAAA,OAGX,iBAAgB,GAInB;AAAA,IACF,MAAM,WAAW,MAAM,oBAAoB;AAAA,IAC3C,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAAA,OAGX,YAAW,CAChB,UACA,QACkD;AAAA,IAClD,MAAM,WAAW,MAAM,qBAAqB;AAAA,MAC3C,MAAM,EAAE,SAAS;AAAA,MACjB,MAAM,EAAE,OAAO;AAAA,IAChB,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAAA,OAGX,eAAc,CACnB,UACkD;AAAA,IAClD,MAAM,WAAW,MAAM,kBAAkB,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAAA,IAC/D,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAAA,OAGX,mBAAkB,GAAkC;AAAA,IACzD,MAAM,WAAW,MAAM,sBAAsB;AAAA,IAC7C,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAAA,EAGjB,gBAAgB,CAAC,UAAkB,MAAuB;AAAA,IACzD,MAAM,UAAU,GAAG,WAAW,aAAa;AAAA,IAC3C,IAAI;AAAA,MAAM,OAAO,GAAG,gBAAgB;AAAA,IACpC,OAAO;AAAA;AAAA,OAGF,YAAW,CAChB,UACA,MACgE;AAAA,IAChE,MAAM,WAAW,MAAM,eAAe;AAAA,MACrC,MAAM,EAAE,SAAS;AAAA,MAEjB,MAAM,EAAE,KAAK;AAAA,IACd,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAAA,OAGX,kBAAiB,CACtB,UACA,MACA,WACkD;AAAA,IAClD,MAAM,WAAW,MAAM,qBAAqB;AAAA,MAC3C,MAAM,EAAE,SAAS;AAAA,MACjB,MAAM,EAAE,MAAM,UAAU;AAAA,IACzB,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAAA,OAGX,uBAAsB,GAKzB;AAAA,IACF,MAAM,WAAW,MAAM,0BAA0B;AAAA,IACjD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAAA,OAGX,sBAAqB,CAC1B,WACwE;AAAA,IACxE,MAAM,WAAW,MAAM,yBAAyB;AAAA,MAC/C,MAAM,EAAE,UAAU;AAAA,IACnB,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAAA,OAGX,sBAAqB,GAIxB;AAAA,IACF,MAAM,WAAW,MAAM,yBAAyB;AAAA,IAChD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAAA,OAGX,iBAAgB,CAAC,OAOpB;AAAA,IACF,MAAM,WAAW,MAAM,oBAAoB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAAA,IAC9D,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAAA,OAGX,yBAAwB,GAO3B;AAAA,IACF,MAAM,WAAW,MAAM,4BAA4B;AAAA,IACnD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAAA,OAGX,sBAAqB,GAiBxB;AAAA,IACF,MAAM,WAAW,MAAM,yBAAyB;AAAA,IAChD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IAEvE,OAAO,SAAS;AAAA;AAAA,OAGX,iBAAgB,CAAC,UAAkD;AAAA,IACxE,MAAM,WAAW,MAAM,oBAAoB;AAAA,MAE1C,MAAM,EAAE,SAAS;AAAA,IAClB,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IACvE,OAAO,SAAS;AAAA;AAElB;;;AClPA;AAAA,gBACC;AAAA,cACA;AAAA,oBACA;AAAA,kBACA;AAAA;AA4BM,IAAM,cAAc;AAAA,OACpB,WAAU,GAAwC;AAAA,IACvD,MAAM,WAAW,MAAM,cAAc;AAAA,IACrC,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IACvE,OAAO,SAAS;AAAA;AAAA,OAGX,SAAQ,CAAC,MAAoC;AAAA,IAClD,MAAM,WAAW,MAAM,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAAA,IACrD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IACvE,OAAO,SAAS;AAAA;AAAA,OAGX,cAAa,CAAC,MAAmD;AAAA,IACtE,MAAM,WAAW,MAAM,kBAAkB,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAAA,IAC3D,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IACvE,OAAO,SAAS;AAAA;AAAA,OAGX,oBAAmB,CACxB,MACA,UAC6C;AAAA,IAC7C,MAAM,WAAW,MAAM,gBAAgB;AAAA,MACtC,MAAM,EAAE,MAAM,SAAS;AAAA,IACxB,CAAC;AAAA,IACD,IAAI,SAAS;AAAA,MAAO,MAAM,IAAI,MAAM,oBAAoB,SAAS,KAAK,CAAC;AAAA,IACvE,OAAO,SAAS;AAAA;AAElB;;;ACjDA,MAAM,UAAU;AAAA,EACf,cAAc,cAAc;AAAA,EAC5B,kBAAkB,cAAc;AAAA,EAChC,gBAAgB,cAAc;AAAA,EAC9B,gBAAgB,cAAc;AAAA,EAC9B,gBAAgB,cAAc;AAAA,EAC9B,eAAe,cAAc;AAAA,EAC7B,eAAe,cAAc;AAAA,EAC7B,gBAAgB,cAAc;AAAA,EAC9B,kBAAkB,cAAc;AAAA,EAChC,cAAc,cAAc;AAAA,EAC5B,cAAc,cAAc;AAAA,EAC5B,eAAe,cAAc;AAAA,EAC7B,eAAe,cAAc;AAAA,EAE7B,cAAc,SAAS;AAAA,EACvB,eAAe,SAAS;AAAA,EACxB,aAAa,SAAS;AAAA,EACtB,qBAAqB,SAAS;AAAA,EAC9B,wBAAwB,SAAS;AAAA,EACjC,aAAa,SAAS;AAAA,EACtB,eAAe,SAAS;AAAA,EACxB,eAAe,SAAS;AAAA,EACxB,cAAc,SAAS;AAAA,EACvB,gBAAgB,SAAS;AAAA,EACzB,eAAe,SAAS;AAAA,EACxB,cAAc,SAAS;AAAA,EACvB,cAAc,SAAS;AAAA,EACvB,aAAa,SAAS;AAAA,EACtB,YAAY,SAAS;AAAA,EACrB,eAAe,SAAS;AAAA,EAExB,YAAY,YAAY;AAAA,EACxB,YAAY,YAAY;AAAA,EACxB,eAAe,YAAY;AAAA,EAC3B,iBAAiB,YAAY;AAAA,EAE7B,YAAY,WAAW;AAAA,EACvB,cAAc,WAAW;AAAA,EACzB,kBAAkB,WAAW;AAAA,EAC7B,kBAAkB,WAAW;AAAA,EAE7B,eAAe,cAAc;AAAA,EAC7B,eAAe,cAAc;AAAA,EAC7B,mBAAmB,cAAc;AAAA,EACjC,iBAAiB,cAAc;AAAA,EAC/B,eAAe,cAAc;AAAA,EAC7B,cAAc,cAAc;AAAA,EAE5B,kBAAkB,cAAc;AAAA,EAChC,sBAAsB,cAAc;AAAA,EAEpC,iBAAiB,UAAU;AAAA,EAC3B,gBAAgB,UAAU;AAAA,EAC1B,qBAAqB,UAAU;AAAA,EAC/B,wBAAwB,UAAU;AAAA,EAClC,sBAAsB,UAAU;AAAA,EAChC,oBAAoB,UAAU;AAAA,EAC9B,cAAc,UAAU;AAAA,EACxB,kBAAkB,UAAU;AAAA,EAC5B,sBAAsB,UAAU;AAAA,EAChC,2BAA2B,UAAU;AAAA,EACrC,sBAAsB,UAAU;AAAA,EAChC,wBAAwB,UAAU;AAAA,EAElC,gBAAgB,UAAU;AAAA,EAC1B,kBAAkB,UAAU;AAAA,EAC5B,mBAAmB,UAAU;AAAA,EAC7B,mBAAmB,UAAU;AAAA,EAC7B,cAAc,UAAU;AAAA,EACxB,iBAAiB,UAAU;AAAA,EAC3B,qBAAqB,UAAU;AAAA,EAC/B,mBAAmB,UAAU;AAAA,EAC7B,cAAc,UAAU;AAAA,EACxB,oBAAoB,UAAU;AAAA,EAC9B,yBAAyB,UAAU;AAAA,EACnC,wBAAwB,UAAU;AAAA,EAClC,wBAAwB,UAAU;AAAA,EAClC,mBAAmB,UAAU;AAAA,EAC7B,2BAA2B,UAAU;AAAA,EACrC,wBAAwB,UAAU;AAAA,EAClC,mBAAmB,UAAU;AAAA,EAE7B,aAAa,YAAY;AAAA,EACzB,WAAW,YAAY;AAAA,EACvB,gBAAgB,YAAY;AAAA,EAC5B,sBAAsB,YAAY;AACnC;AAEO,IAAM,YAAY,IAAI;;;AZlGtB,SAAS,SAAS,GAAG;AAAA,EAC3B,OAAO,SAAS;AAAA,IACf,UAAU,CAAC,QAAQ;AAAA,IACnB,SAAS,MAAM,UAAU,UAAU;AAAA,IACnC,WAAW;AAAA,EACZ,CAAC;AAAA;AAGK,SAAS,SAAS,CAAC,UAAmB;AAAA,EAC5C,OAAO,SAAS;AAAA,IACf,UAAU,CAAC,UAAU,QAAQ;AAAA,IAC7B,SAAS,MAAO,WAAW,UAAU,UAAU,QAAQ,IAAI;AAAA,IAC3D,SAAS,CAAC,CAAC;AAAA,EACZ,CAAC;AAAA;AAGK,SAAS,YAAY,GAAG;AAAA,EAC9B,OAAO,SAAS;AAAA,IACf,UAAU,CAAC,UAAU,KAAK;AAAA,IAC1B,SAAS,MAAM,UAAU,aAAa;AAAA,EACvC,CAAC;AAAA;AAGK,SAAS,iBAAiB,GAAG;AAAA,EACnC,MAAM,cAAc,eAAe;AAAA,EAEnC,OAAO,YAAY;AAAA,IAClB,YAAY,CAAC,SAQP,UAAU,eAAe,IAAI;AAAA,IACnC,WAAW,MAAM;AAAA,MAChB,YAAY,kBAAkB,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC;AAAA;AAAA,EAExD,CAAC;AAAA;;;Aa1CF,wBAAS,yBAAa;AAOtB,IAAM,cAAc;AACpB,IAAM,sBAAmC;AAAA,EACxC,SAAS;AAAA,EACT,eAAe;AAChB;AAEA,SAAS,yBAAyB,GAAgB;AAAA,EACjD,IAAI,OAAO,WAAW,aAAa;AAAA,IAClC,OAAO;AAAA,EACR;AAAA,EACA,IAAI;AAAA,IACH,MAAM,SAAS,OAAO,aAAa,QAAQ,WAAW;AAAA,IACtD,IAAI,QAAQ;AAAA,MACX,MAAM,SAAS,KAAK,MAAM,MAAM;AAAA,MAChC,OAAO;AAAA,WACH;AAAA,WACA;AAAA,MACJ;AAAA,IACD;AAAA,IACC,OAAO,OAAO;AAAA,IACf,QAAQ,KAAK,8BAA8B,KAAK;AAAA;AAAA,EAEjD,OAAO;AAAA;AAGR,IAAI,cAA2B,0BAA0B;AACzD,IAAM,YAAY,IAAI;AAEtB,SAAS,WAAW,GAAgB;AAAA,EACnC,OAAO;AAAA;AAGR,SAAS,iBAAiB,GAAgB;AAAA,EACzC,OAAO;AAAA;AAGR,SAAS,SAAS,CAAC,UAAkC;AAAA,EACpD,UAAU,IAAI,QAAQ;AAAA,EACtB,OAAO,MAAM,UAAU,OAAO,QAAQ;AAAA;AAGvC,SAAS,eAAe,GAAG;AAAA,EAC1B,WAAW,YAAY,WAAW;AAAA,IACjC,SAAS;AAAA,EACV;AAAA;AAGD,SAAS,WAAW,CAAC,SAA+B;AAAA,EACnD,cAAc,KAAK,gBAAgB,QAAQ;AAAA,EAC3C,IAAI,OAAO,WAAW,aAAa;AAAA,IAClC,IAAI;AAAA,MACH,OAAO,aAAa,QAAQ,aAAa,KAAK,UAAU,WAAW,CAAC;AAAA,MACnE,OAAO,OAAO;AAAA,MACf,QAAQ,KAAK,iCAAiC,KAAK;AAAA;AAAA,EAErD;AAAA,EACA,gBAAgB;AAAA;AAGV,SAAS,cAAc,GAAG;AAAA,EAChC,MAAM,qBAAqB,qBAC1B,WACA,aACA,iBACD;AAAA,EAEA,MAAM,oBAAoB,aAAY,CAAC,YAAkC;AAAA,IACxE,YAAY,OAAO;AAAA,KACjB,CAAC,CAAC;AAAA,EAEL,OAAO,SACN,OAAO,EAAE,aAAa,oBAAoB,kBAAkB,IAC5D,CAAC,oBAAoB,iBAAiB,CACvC;AAAA;;;AChFD,qBAAS;AAIF,SAAS,cAAc,CAAC,WAI7B;AAAA,EACD,QAAQ,MAAM,WAAW,UAAU,UAAS;AAAA,IAC3C,UAAU,CAAC,gBAAgB,SAAS;AAAA,IACpC,SAAS,MAAM,UAAU,eAAe,SAAmB;AAAA,IAC3D,SAAS,CAAC,CAAC;AAAA,IACX,WAAW;AAAA,EACZ,CAAC;AAAA,EAED,OAAO,EAAE,MAAM,WAAW,MAA6B;AAAA;;;AChBxD;AAAA,cACC;AAAA;AAAA,UAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBM,IAAM,WAAsB;AAAA,EAClC;AAAA,IACC,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa,CAAC,UACb,MAAM,iBAAiB,qBAAqB;AAAA,IAC7C,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa,CAAC,UACb,MAAM,mBACH,8BACA;AAAA,IACJ,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,EACP;AACD;AAEO,SAAS,qBAAqB,CACpC,KACA,OACS;AAAA,EACT,OAAO,OAAO,IAAI,gBAAgB,aAC/B,IAAI,YAAY,KAAK,IACrB,IAAI;AAAA;AAGD,SAAS,cAAc,CAAC,OAAe,OAAgC;AAAA,EAC7E,MAAM,eAAe,SAAS,OAAO,CAAC,QAAQ;AAAA,IAC7C,IAAI,IAAI,OAAO,WAAW,MAAM;AAAA,MAAU,OAAO;AAAA,IACjD,IAAI,IAAI,OAAO,UAAU,CAAC,MAAM;AAAA,MAAU,OAAO;AAAA,IACjD,OAAO;AAAA,GACP;AAAA,EAED,IAAI,CAAC,OAAO;AAAA,IACX,OAAO;AAAA,EACR;AAAA,EAEA,MAAM,aAAa,MAAM,YAAY;AAAA,EACrC,MAAM,UAAgD,CAAC;AAAA,EAEvD,WAAW,OAAO,cAAc;AAAA,IAC/B,MAAM,OAAO,sBAAsB,KAAK,KAAK;AAAA,IAC7C,MAAM,aAAa,IAAI,MAAM,YAAY,EAAE,SAAS,UAAU;AAAA,IAC9D,MAAM,mBAAmB,KAAK,YAAY,EAAE,SAAS,UAAU;AAAA,IAE/D,IAAI,cAAc,kBAAkB;AAAA,MACnC,MAAM,aAAa,aAAa,KAAK;AAAA,MACrC,QAAQ,KAAK,KAAK,KAAK,WAAW,CAAC;AAAA,IACpC;AAAA,EACD;AAAA,EAEA,OAAO,QAAQ,KAAK,CAAC,GAAG,MAAM;AAAA,IAC7B,MAAM,YAAY,EAAE,aAAa,EAAE;AAAA,IACnC,IAAI,cAAc;AAAA,MAAG,OAAO;AAAA,IAC5B,OAAO,EAAE,MAAM,cAAc,EAAE,KAAK;AAAA,GACpC;AAAA;;;;AhBhJK,SAAS,uBAAuB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACgC;AAAA,EAChC,QAAQ,8BAAgB,eAAe;AAAA,EACvC,QAAQ,MAAM,YAAW,UAAU;AAAA,EACnC,QAAQ,MAAM,gBAAgB,eAAe,SAAS;AAAA,EAEtD,MAAM,QAAQ,SACb,OAAO;AAAA,IACN,gBAAgB,aAAY;AAAA,IAC5B,kBAAkB,SAAQ,UAAU,iBAAiB;AAAA,IACrD,UAAU,aAAa;AAAA,EACxB,IACA,CAAC,aAAY,SAAS,SAAQ,UAAU,eAAe,aAAa,MAAM,CAC3E;AAAA,EAEA,MAAM,UAAU,SAAQ,MAAM,eAAe,OAAO,KAAK,GAAG,CAAC,OAAO,KAAK,CAAC;AAAA,EAE1E,WAAU,MAAM;AAAA,IACf,MAAM,UAAU,SAAS,eAAe,gBAAgB,eAAe;AAAA,IACvE,SAAS,eAAe,EAAE,OAAO,UAAU,CAAC;AAAA,KAC1C,CAAC,aAAa,CAAC;AAAA,EAElB,WAAU,MAAM;AAAA,IACf,cAAc,QAAQ,gBAAgB,EAAE;AAAA,KACtC,CAAC,SAAS,eAAe,aAAa,CAAC;AAAA,EAE1C,WAAU,MAAM;AAAA,IACf,MAAM,qBAAqB,CAAC,MAAkB;AAAA,MAC7C,MAAM,SAAS,EAAE;AAAA,MACjB,IAAI,CAAC,OAAO,QAAQ,sBAAsB,GAAG;AAAA,QAC5C,QAAQ;AAAA,MACT;AAAA;AAAA,IAED,SAAS,iBAAiB,aAAa,kBAAkB;AAAA,IACzD,OAAO,MAAM,SAAS,oBAAoB,aAAa,kBAAkB;AAAA,KACvE,CAAC,OAAO,CAAC;AAAA,EAEZ,IAAI,QAAQ,WAAW,GAAG;AAAA,IACzB,uBACC,MAKE,OALF;AAAA,MACC,sBAAkB;AAAA,MAClB,WAAU;AAAA,MAFX,0BAIC,MAAmE,QAAnE;AAAA,QAAM,WAAU;AAAA,QAAhB;AAAA,OAAmE;AAAA,KAClE;AAAA,EAEJ;AAAA,EAEA,uBACC,MAiCE,OAjCF;AAAA,IACC,sBAAkB;AAAA,IAClB,WAAU;AAAA,IAFX,UAIE,QAAQ,IAAI,CAAC,SAAS,UAAU;AAAA,MAChC,MAAM,OAAO,QAAQ;AAAA,MACrB,uBACC,MAuBE,UAvBF;AAAA,QACC,MAAK;AAAA,QAEL,IAAI,gBAAgB;AAAA,QACpB,aAAa,CAAC,MAAM;AAAA,UACnB,EAAE,eAAe;AAAA,UACjB,SAAS,QAAQ,EAAE;AAAA;AAAA,QAEpB,WAAW,8CACV,UAAU,gBAAgB,cAAc;AAAA,QAT1C,0BAYC,MAUE,OAVF;AAAA,UAAK,WAAU;AAAA,UAAf,UAUE;AAAA,4BATD,MAAC,MAAD;AAAA,cAAM,WAAU;AAAA,aAAqC;AAAA,4BACrD,MAOE,OAPF;AAAA,cAAK,WAAU;AAAA,cAAf,UAOE;AAAA,gCAND,MAEE,OAFF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UACE,QAAQ;AAAA,iBACR;AAAA,gCACF,MAEE,OAFF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UACE,sBAAsB,SAAS,KAAK;AAAA,iBACpC;AAAA;AAAA,aACD;AAAA;AAAA,SACD;AAAA,SApBG,QAAQ,EAqBZ;AAAA,KAEH;AAAA,GACA;AAAA;;;AiBvGJ,sBAAS,sBAAW;;;ACApB,sBAAS;AACT,cAAS;AAAA;AAaT,IAAM,kBAAkB;AAAA,EACvB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AACR;AAEO,SAAS,KAAK;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,gBAAgB;AAAA,EAChB,WAAW;AAAA,GACG;AAAA,EACd,WAAU,MAAM;AAAA,IACf,IAAI,CAAC,UAAU,CAAC;AAAA,MAAe;AAAA,IAE/B,MAAM,eAAe,CAAC,MAAqB;AAAA,MAC1C,MAAM,SAAS,EAAE;AAAA,MACjB,MAAM,YACL,OAAO,YAAY,WACnB,OAAO,YAAY,cACnB,OAAO;AAAA,MACR,IAAI,EAAE,QAAQ,YAAa,EAAE,QAAQ,OAAO,CAAC,WAAY;AAAA,QACxD,EAAE,eAAe;AAAA,QACjB,EAAE,gBAAgB;AAAA,QAClB,QAAQ;AAAA,MACT;AAAA;AAAA,IAGD,SAAS,iBAAiB,WAAW,YAAY;AAAA,IACjD,OAAO,MAAM,SAAS,oBAAoB,WAAW,YAAY;AAAA,KAC/D,CAAC,QAAQ,eAAe,OAAO,CAAC;AAAA,EAEnC,WAAU,MAAM;AAAA,IACf,IAAI,QAAQ;AAAA,MAEX,SAAS,KAAK,MAAM,WAAW;AAAA,MAC/B,OAAO,MAAM;AAAA,QACZ,SAAS,KAAK,MAAM,WAAW;AAAA;AAAA,IAEjC;AAAA,KACE,CAAC,MAAM,CAAC;AAAA,EAEX,IAAI,CAAC;AAAA,IAAQ,OAAO;AAAA,EAEpB,MAAM,sBAAsB,CAAC,MAAqC;AAAA,IACjE,IAAI,wBAAwB,EAAE,WAAW,EAAE,eAAe;AAAA,MACzD,QAAQ;AAAA,IACT;AAAA;AAAA,EAGD,uBACC;AAAA,cA8CE;AAAA,sBA5CD,MAAC,UAAD;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS;AAAA,QACT,WAAW,CAAC,MAAM;AAAA,UACjB,IAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AAAA,YACvC,oBACC,CACD;AAAA,UACD;AAAA;AAAA,QAED,cAAW;AAAA,OACZ;AAAA,sBAGA,MA4BE,OA5BF;AAAA,QACC,WAAW,4EAA4E,gBAAgB;AAAA,QADxG,0BAGC,MAwBE,OAxBF;AAAA,UAAK,WAAU;AAAA,UAAf,UAwBE;AAAA,aAtBC,SAAS,oCACV,MAgBE,OAhBF;AAAA,cAAK,WAAU;AAAA,cAAf,UAgBE;AAAA,gBAfA,yBACA,MAEE,OAFF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UACE;AAAA,iBACA;AAAA,gBAEF,mCACA,MAOE,UAPF;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS;AAAA,kBACT,WAAU;AAAA,kBACV,cAAW;AAAA,kBAJZ,0BAMC,MAAC,IAAD;AAAA,oBAAG,WAAU;AAAA,mBAAU;AAAA,iBACtB;AAAA;AAAA,aAEF;AAAA,4BAIH,MAAiC,OAAjC;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAAiC;AAAA;AAAA,SAChC;AAAA,OACD;AAAA;AAAA,GACD;AAAA;;;ADnHJ,qBAAS;AAAA;AAaT,IAAM,YAA4B;AAAA,EACjC;AAAA,IACC,MAAM,CAAC,QAAQ,GAAG;AAAA,IAClB,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,QAAQ,GAAG;AAAA,IAClB,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,QAAQ,GAAG;AAAA,IAClB,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,QAAQ,IAAI;AAAA,IACnB,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,QAAQ,GAAG;AAAA,IAClB,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,KAAK;AAAA,IACZ,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,GAAG;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,GAAG;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,OAAO;AAAA,IACd,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,OAAO;AAAA,IACd,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,GAAG;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,GAAG;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,GAAG;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,KAAK;AAAA,IACZ,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,OAAO;AAAA,IACd,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,SAAS,OAAO;AAAA,IACvB,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,GAAG;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,GAAG;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AACD;AAEA,IAAM,qBAAqC;AAAA,EAC1C;AAAA,IACC,MAAM,CAAC,GAAG;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,GAAG;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,GAAG;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,GAAG;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,GAAG;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,GAAG;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,KAAK;AAAA,IACZ,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,OAAO;AAAA,IACd,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,GAAG;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,GAAG;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,GAAG;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,GAAG;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,GAAG;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,GAAG;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,KAAK,QAAQ;AAAA,IACpB,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,KAAK,GAAG;AAAA,IACf,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,GAAG;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AAAA,EACA;AAAA,IACC,MAAM,CAAC,GAAG;AAAA,IACV,aAAa;AAAA,IACb,UAAU;AAAA,EACX;AACD;AAEA,IAAM,iBAAiB;AAAA,EACtB;AAAA,IACC,SAAS;AAAA,IACT,aAAa;AAAA,EACd;AAAA,EACA;AAAA,IACC,SAAS;AAAA,IACT,aAAa;AAAA,EACd;AAAA,EACA;AAAA,IACC,SAAS;AAAA,IACT,aAAa;AAAA,EACd;AAAA,EACA;AAAA,IACC,SAAS;AAAA,IACT,aAAa;AAAA,EACd;AAAA,EACA;AAAA,IACC,SAAS;AAAA,IACT,aAAa;AAAA,EACd;AACD;AAEA,SAAS,wBAAwB,CAAC,WAA2B;AAAA,EAC5D,MAAM,UAA0C,CAAC;AAAA,EACjD,WAAW,YAAY,WAAW;AAAA,IACjC,IAAI,CAAC,QAAQ,SAAS,WAAW;AAAA,MAChC,QAAQ,SAAS,YAAY,CAAC;AAAA,IAC/B;AAAA,IACA,QAAQ,SAAS,UAAU,KAAK,QAAQ;AAAA,EACzC;AAAA,EACA,OAAO;AAAA;AAGD,SAAS,cAAc,GAAG,QAAQ,WAAgC;AAAA,EACxE,MAAM,eAAe,CAAC,GAAG,WAAW,GAAG,kBAAkB;AAAA,EACzD,MAAM,mBAAmB,yBAAyB,YAAY;AAAA,EAC9D,MAAM,kBAAkB,QAAuB,IAAI;AAAA,EACnD,MAAM,wBAAwB,QAA2B,IAAI;AAAA,EAE7D,WAAU,MAAM;AAAA,IACf,IAAI,QAAQ;AAAA,MACX,sBAAsB,UAAU,SAAS;AAAA,MACzC,IAAI,sBAAsB,SAAS;AAAA,QAClC,sBAAsB,QAAQ,KAAK;AAAA,MACpC;AAAA,IACD,EAAO;AAAA,MACN,IAAI,sBAAsB,SAAS;AAAA,QAClC,sBAAsB,QAAQ,MAAM;AAAA,QACpC,sBAAsB,UAAU;AAAA,MACjC;AAAA;AAAA,KAEC,CAAC,MAAM,CAAC;AAAA,EAEX,WAAU,MAAM;AAAA,IACf,IAAI,CAAC;AAAA,MAAQ;AAAA,IAEb,MAAM,gBAAgB,CAAC,MAAqB;AAAA,MAC3C,MAAM,SAAS,EAAE;AAAA,MACjB,MAAM,eACL,OAAO,YAAY,WACnB,OAAO,YAAY,cACnB,OAAO;AAAA,MAER,IAAI;AAAA,QAAc;AAAA,MAElB,IAAI,EAAE,QAAQ,KAAK;AAAA,QAClB,EAAE,eAAe;AAAA,QACjB,MAAM,YAAY,gBAAgB;AAAA,QAClC,IAAI,WAAW;AAAA,UACd,UAAU,SAAS,EAAE,KAAK,KAAK,UAAU,SAAS,CAAC;AAAA,QACpD;AAAA,MACD,EAAO,SAAI,EAAE,QAAQ,KAAK;AAAA,QACzB,EAAE,eAAe;AAAA,QACjB,MAAM,YAAY,gBAAgB;AAAA,QAClC,IAAI,WAAW;AAAA,UACd,UAAU,SAAS,EAAE,KAAK,MAAM,UAAU,SAAS,CAAC;AAAA,QACrD;AAAA,MACD,EAAO,SAAI,EAAE,QAAQ,SAAS;AAAA,QAC7B,EAAE,eAAe;AAAA,QACjB,QAAQ;AAAA,MACT;AAAA;AAAA,IAGD,SAAS,iBAAiB,WAAW,aAAa;AAAA,IAClD,OAAO,MAAM,SAAS,oBAAoB,WAAW,aAAa;AAAA,KAChE,CAAC,QAAQ,OAAO,CAAC;AAAA,EAEpB,uBACC,MAiFE,OAjFF;AAAA,IACC;AAAA,IACA;AAAA,IACA,uBACC,MAGE,OAHF;AAAA,MAAK,WAAU;AAAA,MAAf,UAGE;AAAA,wBAFD,MAAC,WAAD;AAAA,UAAU,WAAU;AAAA,SAAU;AAAA,wBAC9B,MAAiC,QAAjC;AAAA;AAAA,SAAiC;AAAA;AAAA,KAChC;AAAA,IAEH,UAAS;AAAA,IACT,eAAe;AAAA,IACf,sBAAsB;AAAA,IAXvB,0BAaC,MAmEE,OAnEF;AAAA,MACC,KAAK;AAAA,MACL,WAAU;AAAA,MAFX,UAmEE;AAAA,QA/DA,OAAO,QAAQ,gBAAgB,EAAE,IAAI,EAAE,UAAU,+BACjD,MA8BE,OA9BF;AAAA,oBA8BE;AAAA,4BA7BD,MAGE,MAHF;AAAA,cAAI,WAAU;AAAA,cAAd,UAGE;AAAA,gCAFD,MAAC,SAAD;AAAA,kBAAS,WAAU;AAAA,iBAAU;AAAA,gBAC5B;AAAA;AAAA,aACA;AAAA,4BACF,MAwBE,OAxBF;AAAA,cAAK,WAAU;AAAA,cAAf,UACE,UAAU,IAAI,CAAC,UAAU,2BACzB,MAoBE,OApBF;AAAA,gBAEC,WAAU;AAAA,gBAFX,UAoBE;AAAA,kCAhBD,MAEE,QAFF;AAAA,oBAAM,WAAU;AAAA,oBAAhB,UACE,SAAS;AAAA,mBACT;AAAA,kCACF,MAYE,OAZF;AAAA,oBAAK,WAAU;AAAA,oBAAf,UACE,SAAS,KAAK,IAAI,CAAC,wBACnB,MAQE,QARF;AAAA,sBAAgB,WAAU;AAAA,sBAA1B,UAQE;AAAA,wCAPD,MAEE,OAFF;AAAA,0BAAK,WAAU;AAAA,0BAAf,UACE;AAAA,yBACA;AAAA,wBACD,SAAS,KAAK,QAAQ,GAAG,IACzB,SAAS,KAAK,SAAS,qBACvB,MAA2C,QAA3C;AAAA,0BAAM,WAAU;AAAA,0BAAhB;AAAA,yBAA2C;AAAA;AAAA,uBANlC,GAQT,CACF;AAAA,mBACA;AAAA;AAAA,iBAlBG,GAAG,YAAY,SAAS,aAmB5B,CACF;AAAA,aACA;AAAA;AAAA,WA7BO,QA8BR,CACF;AAAA,wBAED,MAoBE,OApBF;AAAA,oBAoBE;AAAA,4BAnBD,MAGE,MAHF;AAAA,cAAI,WAAU;AAAA,cAAd,UAGE;AAAA,gCAFD,MAAC,SAAD;AAAA,kBAAS,WAAU;AAAA,iBAAU;AAAA,gBAD9B;AAAA;AAAA,aAGE;AAAA,4BACF,MAcE,OAdF;AAAA,cAAK,WAAU;AAAA,cAAf,UACE,eAAe,IAAI,CAAC,KAAK,2BACzB,MAUE,OAVF;AAAA,gBAEC,WAAU;AAAA,gBAFX,UAUE;AAAA,kCAND,MAEE,QAFF;AAAA,oBAAM,WAAU;AAAA,oBAAhB,UACE,IAAI;AAAA,mBACJ;AAAA,kCACF,MAEE,OAFF;AAAA,oBAAK,WAAU;AAAA,oBAAf,UACE,IAAI;AAAA,mBACJ;AAAA;AAAA,iBARG,IAAI,OASR,CACF;AAAA,aACA;AAAA;AAAA,SACD;AAAA,wBAEF,MAME,OANF;AAAA,UAAK,WAAU;AAAA,UAAf,0BACC,MAIE,KAJF;AAAA,YAAG,WAAU;AAAA,YAAb,UAIE;AAAA,8BAHD,MAAc,UAAd;AAAA;AAAA,eAAc;AAAA,cADf;AAAA,8BAEe,MAA8B,OAA9B;AAAA,gBAAK,WAAU;AAAA,gBAAf;AAAA,eAA8B;AAAA,cAF7C;AAAA;AAAA,WAIE;AAAA,SACD;AAAA;AAAA,KACD;AAAA,GACD;AAAA;;;AEnXJ,iBAAS;;;ACAF,IAAM,gBAAgB;AAAA;AAAA;AAItB,IAAM,aAAa;AAAA;AAAA;AAInB,IAAM,aAAa;AAAA;AAAA;AAInB,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASvB,IAAM,WAAW;AAAA;AAAA;AAIjB,IAAM,eAAe;AAAA;AAAA;AAIrB,IAAM,UAAU;AAAA;AAAA;AAIhB,IAAM,UAAU;AAAA;AAAA;AAIhB,IAAM,WAAW;AAAA;AAAA;AAIjB,IAAM,cAAc;AAAA;AAAA;AAIpB,IAAM,eAAe;AAAA;AAAA;AAAA;AAKrB,IAAM,cAAc;AAAA;AAAA;;;;ADjC3B,IAAM,gBAAwC;AAAA,EAC7C,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,MAAM;AAAA,EACN,UAAU;AAAA,EACV,KAAK;AAAA,EACL,KAAK;AAAA,EACL,cAAc;AAAA,EACd,MAAM;AAAA,EACN,SAAS;AAAA,EACT,UAAU;AAAA,EACV,SAAS;AACV;AAQO,IAAM,eAAe,MAAK,SAAS,aAAY;AAAA,EACrD;AAAA,EACA,YAAY;AAAA,EACZ,OAAO;AAAA,GACc;AAAA,EACrB,MAAM,UAAU,cAAc,SAAS,YAAY;AAAA,EAEnD,IAAI,CAAC,SAAS;AAAA,IACb,uBACC,MAME,QANF;AAAA,MACC,WAAW,mGAAmG;AAAA,MAC9G,OAAO,EAAE,OAAO,MAAM,QAAQ,KAAK;AAAA,MACnC,OAAO;AAAA,MAHR,UAKE,SAAS,MAAM,GAAG,CAAC;AAAA,KACnB;AAAA,EAEJ;AAAA,EAEA,uBACC,MAAC,QAAD;AAAA,IACC,WAAW,sFAAsF;AAAA,IACjG,OAAO,EAAE,OAAO,MAAM,QAAQ,KAAK;AAAA,IACnC,OAAO;AAAA,IAEP,yBAAyB;AAAA,MACxB,QAAQ,QAAQ,QACf,QACA,eAAe,iBAAiB,sBAAsB,iBAAiB,SACxE;AAAA,IACD;AAAA,GACD;AAAA,CAED;;;AExED,qBAAS;AAGF,SAAS,QAAQ,GAAG;AAAA,EAC1B,OAAO,UAAS;AAAA,IACf,UAAU,CAAC,OAAO;AAAA,IAClB,SAAS,YAAY;AAAA,MACpB,MAAM,SAAS,MAAM,UAAU,UAAU;AAAA,MACzC,OAAO;AAAA;AAAA,IAER,WAAW;AAAA,IACX,sBAAsB;AAAA,IACtB,OAAO;AAAA,EACR,CAAC;AAAA;;;ACbF,qBAAS,0BAAU;AAkBZ,SAAS,UAAU;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACuC;AAAA,EACvC,OAAO,SAAS,cAAc,UAC7B,UAAU,WAAW,QACtB;AAAA,EACA,OAAO,eAAe,oBAAoB,UAAiB,EAAE;AAAA,EAE7D,MAAM,oBAAoB,aAAY,CAAC,MAAc,QAAwB;AAAA,IAC5E,OAAO,MAAM,KAAK,UAAU,KAAK,KAAK,KAAK,IAAI;AAAA,MAAG;AAAA,IAClD,OAAO,MAAM,KAAK,UAAU,KAAK,KAAK,KAAK,IAAI;AAAA,MAAG;AAAA,IAClD,OAAO,KAAK,IAAI,KAAK,KAAK,MAAM;AAAA,KAC9B,CAAC,CAAC;AAAA,EAEL,MAAM,kBAAkB,aAAY,CAAC,MAAc,QAAwB;AAAA,IAC1E,IAAI,MAAM,KAAK,UAAU,KAAK,KAAK,KAAK,IAAI;AAAA,MAAG;AAAA,IAC/C,OAAO,MAAM,KAAK,UAAU,KAAK,KAAK,KAAK,IAAI;AAAA,MAAG;AAAA,IAClD,OAAO,MAAM,KAAK,UAAU,KAAK,KAAK,KAAK,IAAI;AAAA,MAAG;AAAA,IAClD,OAAO,KAAK,IAAI,GAAG,MAAM,CAAC;AAAA,KACxB,CAAC,CAAC;AAAA,EAEL,MAAM,oBAAoB,aAAY,CAAC,MAAc,QAAwB;AAAA,IAC5E,MAAM,KAAK,IAAI,GAAG,MAAM,CAAC;AAAA,IACzB,OAAO,MAAM,KAAK,KAAK,KAAK,KAAK,IAAI;AAAA,MAAG;AAAA,IACxC,OAAO,MAAM,KAAK,KAAK,KAAK,KAAK,MAAM,EAAE;AAAA,MAAG;AAAA,IAC5C,OAAO;AAAA,KACL,CAAC,CAAC;AAAA,EAEL,MAAM,sBAAsB,aAC3B,CAAC,MAAmD;AAAA,IACnD,MAAM,WAAW,YAAY;AAAA,IAC7B,IAAI,CAAC;AAAA,MAAU,OAAO;AAAA,IAEtB,MAAM,MAAM,EAAE;AAAA,IAEd,IAAI,QAAQ,KAAK;AAAA,MAChB,EAAE,eAAe;AAAA,MACjB,WAAW,QAAQ;AAAA,MACnB,OAAO;AAAA,IACR;AAAA,IAEA,IAAI,QAAQ,KAAK;AAAA,MAChB,EAAE,eAAe;AAAA,MACjB,WAAW,QAAQ;AAAA,MACnB,MAAM,MAAM,SAAS;AAAA,MACrB,WAAW,MAAM;AAAA,QAChB,SAAS,kBAAkB,MAAM,GAAG,MAAM,CAAC;AAAA,SACzC,CAAC;AAAA,MACJ,OAAO;AAAA,IACR;AAAA,IAEA,IAAI,QAAQ,KAAK;AAAA,MAChB,EAAE,eAAe;AAAA,MACjB,WAAW,QAAQ;AAAA,MACnB,MAAM,OAAO,SAAS;AAAA,MACtB,MAAM,YACL,KAAK,YAAY;AAAA,GAAM,SAAS,iBAAiB,CAAC,IAAI;AAAA,MACvD,WAAW,MAAM;AAAA,QAChB,SAAS,kBAAkB,WAAW,SAAS;AAAA,SAC7C,CAAC;AAAA,MACJ,OAAO;AAAA,IACR;AAAA,IAEA,IAAI,QAAQ,KAAK;AAAA,MAChB,EAAE,eAAe;AAAA,MACjB,WAAW,QAAQ;AAAA,MACnB,MAAM,OAAO,SAAS;AAAA,MACtB,IAAI,UAAU,KAAK,QAAQ;AAAA,GAAM,SAAS,cAAc;AAAA,MACxD,IAAI,YAAY;AAAA,QAAI,UAAU,KAAK;AAAA,MACnC,WAAW,MAAM;AAAA,QAChB,SAAS,kBAAkB,SAAS,OAAO;AAAA,SACzC,CAAC;AAAA,MACJ,OAAO;AAAA,IACR;AAAA,IAEA,IAAI,QAAQ,KAAK;AAAA,MAChB,EAAE,eAAe;AAAA,MACjB,MAAM,OAAO,SAAS;AAAA,MACtB,MAAM,YACL,KAAK,YAAY;AAAA,GAAM,SAAS,iBAAiB,CAAC,IAAI;AAAA,MACvD,SAAS,kBAAkB,WAAW,SAAS;AAAA,MAC/C,OAAO;AAAA,IACR;AAAA,IAEA,IAAI,QAAQ,KAAK;AAAA,MAChB,EAAE,eAAe;AAAA,MACjB,MAAM,OAAO,SAAS;AAAA,MACtB,IAAI,UAAU,KAAK,QAAQ;AAAA,GAAM,SAAS,cAAc;AAAA,MACxD,IAAI,YAAY;AAAA,QAAI,UAAU,KAAK;AAAA,MACnC,SAAS,kBAAkB,SAAS,OAAO;AAAA,MAC3C,OAAO;AAAA,IACR;AAAA,IAEA,IAAI,QAAQ,KAAK;AAAA,MAChB,EAAE,eAAe;AAAA,MACjB,WAAW,QAAQ;AAAA,MACnB,MAAM,OAAO,SAAS;AAAA,MACtB,IAAI,UAAU,KAAK,QAAQ;AAAA,GAAM,SAAS,cAAc;AAAA,MACxD,IAAI,YAAY;AAAA,QAAI,UAAU,KAAK;AAAA,MAEnC,MAAM,WAAW,GAAG,KAAK,MAAM,GAAG,OAAO;AAAA,EAAM,KAAK,MAAM,OAAO;AAAA,MACjE,WAAW,QAAQ;AAAA,MAEnB,WAAW,MAAM;AAAA,QAChB,SAAS,kBAAkB,UAAU,GAAG,UAAU,CAAC;AAAA,SACjD,CAAC;AAAA,MACJ,OAAO;AAAA,IACR;AAAA,IAEA,IAAI,QAAQ,KAAK;AAAA,MAChB,EAAE,eAAe;AAAA,MACjB,WAAW,QAAQ;AAAA,MACnB,MAAM,OAAO,SAAS;AAAA,MACtB,MAAM,YACL,KAAK,YAAY;AAAA,GAAM,SAAS,iBAAiB,CAAC,IAAI;AAAA,MAEvD,MAAM,WAAW,GAAG,KAAK,MAAM,GAAG,SAAS;AAAA,EAAM,KAAK,MAAM,SAAS;AAAA,MACrE,WAAW,QAAQ;AAAA,MAEnB,WAAW,MAAM;AAAA,QAChB,SAAS,kBAAkB,WAAW,SAAS;AAAA,SAC7C,CAAC;AAAA,MACJ,OAAO;AAAA,IACR;AAAA,IAEA,IAAI,kBAAkB,OAAO,IAAI,WAAW,KAAK,QAAQ,UAAU;AAAA,MAClE,EAAE,eAAe;AAAA,MACjB,MAAM,OAAO,SAAS;AAAA,MACtB,MAAM,cAAc,KAAK,MACxB,KAAK,YAAY;AAAA,GAAM,SAAS,iBAAiB,CAAC,IAAI,GACtD,KAAK,QAAQ;AAAA,GAAM,SAAS,cAAc,MAAM,KAC7C,KAAK,SACL,KAAK,QAAQ;AAAA,GAAM,SAAS,cAAc,CAC9C;AAAA,MACA,MAAM,YACL,SAAS,iBACT,KAAK,YAAY;AAAA,GAAM,SAAS,iBAAiB,CAAC,IAClD;AAAA,MACD,MAAM,YAAY,YAAY,QAAQ,KAAK,YAAY,CAAC;AAAA,MAExD,IAAI,cAAc,IAAI;AAAA,QACrB,MAAM,SACL,KAAK,YAAY;AAAA,GAAM,SAAS,iBAAiB,CAAC,IAAI,IAAI;AAAA,QAC3D,SAAS,kBAAkB,QAAQ,MAAM;AAAA,MAC1C;AAAA,MAEA,iBAAiB,EAAE;AAAA,MACnB,OAAO;AAAA,IACR;AAAA,IAEA,IAAI,QAAQ,KAAK;AAAA,MAChB,EAAE,eAAe;AAAA,MACjB,iBAAiB,GAAG;AAAA,MACpB,WAAW,MAAM,iBAAiB,EAAE,GAAG,IAAI;AAAA,MAC3C,OAAO;AAAA,IACR;AAAA,IAEA,IAAI,QAAQ,KAAK;AAAA,MAChB,IAAI,kBAAkB,KAAK;AAAA,QAC1B,EAAE,eAAe;AAAA,QACjB,MAAM,OAAO,SAAS;AAAA,QACtB,MAAM,YACL,KAAK,YAAY;AAAA,GAAM,SAAS,iBAAiB,CAAC,IAAI;AAAA,QACvD,IAAI,UAAU,KAAK,QAAQ;AAAA,GAAM,SAAS,cAAc;AAAA,QACxD,IAAI,YAAY;AAAA,UAAI,UAAU,KAAK;AAAA,QAC9B;AAAA,qBAAW;AAAA,QAEhB,MAAM,WAAW,KAAK,MAAM,GAAG,SAAS,IAAI,KAAK,MAAM,OAAO;AAAA,QAC9D,WAAW,QAAQ;AAAA,QACnB,iBAAiB,EAAE;AAAA,QAEnB,WAAW,MAAM;AAAA,UAChB,SAAS,kBAAkB,WAAW,SAAS;AAAA,WAC7C,CAAC;AAAA,QACJ,OAAO;AAAA,MACR;AAAA,MACA,EAAE,eAAe;AAAA,MACjB,iBAAiB,GAAG;AAAA,MACpB,WAAW,MAAM,iBAAiB,EAAE,GAAG,IAAI;AAAA,MAC3C,OAAO;AAAA,IACR;AAAA,IAEA,IAAI,QAAQ,SAAS;AAAA,MACpB,EAAE,eAAe;AAAA,MACjB,OAAO;AAAA,MACP,OAAO;AAAA,IACR;AAAA,IAEA,IAAI,QAAQ,UAAU;AAAA,MACrB,EAAE,eAAe;AAAA,MACjB,OAAO;AAAA,IACR;AAAA,IAEA,IAAI,QAAQ,KAAK;AAAA,MAChB,EAAE,eAAe;AAAA,MACjB,MAAM,OAAO,SAAS;AAAA,MACtB,MAAM,SAAS,kBAAkB,MAAM,SAAS,cAAc;AAAA,MAC9D,SAAS,kBAAkB,QAAQ,MAAM;AAAA,MACzC,OAAO;AAAA,IACR;AAAA,IAEA,IAAI,QAAQ,KAAK;AAAA,MAChB,EAAE,eAAe;AAAA,MACjB,MAAM,OAAO,SAAS;AAAA,MACtB,MAAM,SAAS,gBAAgB,MAAM,SAAS,cAAc;AAAA,MAC5D,SAAS,kBAAkB,QAAQ,MAAM;AAAA,MACzC,OAAO;AAAA,IACR;AAAA,IAEA,IAAI,QAAQ,KAAK;AAAA,MAChB,EAAE,eAAe;AAAA,MACjB,MAAM,OAAO,SAAS;AAAA,MACtB,MAAM,SAAS,kBAAkB,MAAM,SAAS,cAAc;AAAA,MAC9D,SAAS,kBAAkB,QAAQ,MAAM;AAAA,MACzC,OAAO;AAAA,IACR;AAAA,IAEA,IAAI,QAAQ,KAAK;AAAA,MAChB,EAAE,eAAe;AAAA,MACjB,MAAM,OAAO,SAAS;AAAA,MACtB,MAAM,MAAM,SAAS;AAAA,MACrB,IAAI,MAAM,KAAK,QAAQ;AAAA,QACtB,MAAM,WAAW,KAAK,MAAM,GAAG,GAAG,IAAI,KAAK,MAAM,MAAM,CAAC;AAAA,QACxD,WAAW,QAAQ;AAAA,QACnB,WAAW,MAAM;AAAA,UAChB,SAAS,kBAAkB,KAAK,GAAG;AAAA,WACjC,CAAC;AAAA,MACL;AAAA,MACA,OAAO;AAAA,IACR;AAAA,IAEA,IAAI,QAAQ,KAAK;AAAA,MAChB,EAAE,eAAe;AAAA,MACjB,MAAM,OAAO,SAAS;AAAA,MACtB,MAAM,MAAM,SAAS;AAAA,MACrB,IAAI,MAAM,KAAK,QAAQ;AAAA,QACtB,MAAM,WAAW,KAAK,MAAM,GAAG,GAAG,IAAI,KAAK,MAAM,MAAM,CAAC;AAAA,QACxD,WAAW,QAAQ;AAAA,QACnB,WAAW,QAAQ;AAAA,QACnB,WAAW,MAAM;AAAA,UAChB,SAAS,kBAAkB,KAAK,GAAG;AAAA,WACjC,CAAC;AAAA,MACL,EAAO;AAAA,QACN,WAAW,QAAQ;AAAA;AAAA,MAEpB,OAAO;AAAA,IACR;AAAA,IAEA,IAAI,QAAQ,KAAK;AAAA,MAChB,EAAE,eAAe;AAAA,MACjB,MAAM,OAAO,SAAS;AAAA,MACtB,MAAM,YACL,KAAK,YAAY;AAAA,GAAM,SAAS,iBAAiB,CAAC,IAAI;AAAA,MACvD,IAAI,UAAU,KAAK,QAAQ;AAAA,GAAM,SAAS,cAAc;AAAA,MACxD,IAAI,YAAY;AAAA,QAAI,UAAU,KAAK;AAAA,MAEnC,MAAM,WAAW,KAAK,MAAM,GAAG,SAAS,IAAI,KAAK,MAAM,OAAO;AAAA,MAC9D,WAAW,QAAQ;AAAA,MACnB,WAAW,QAAQ;AAAA,MAEnB,WAAW,MAAM;AAAA,QAChB,SAAS,kBAAkB,WAAW,SAAS;AAAA,SAC7C,CAAC;AAAA,MACJ,OAAO;AAAA,IACR;AAAA,IAEA,IAAI,QAAQ,KAAK;AAAA,MAChB,EAAE,eAAe;AAAA,MACjB,MAAM,MAAM,SAAS;AAAA,MACrB,IAAI,MAAM,GAAG;AAAA,QACZ,SAAS,kBAAkB,MAAM,GAAG,MAAM,CAAC;AAAA,MAC5C;AAAA,MACA,OAAO;AAAA,IACR;AAAA,IAEA,IAAI,QAAQ,KAAK;AAAA,MAChB,EAAE,eAAe;AAAA,MACjB,MAAM,MAAM,SAAS;AAAA,MACrB,IAAI,MAAM,SAAS,MAAM,QAAQ;AAAA,QAChC,SAAS,kBAAkB,MAAM,GAAG,MAAM,CAAC;AAAA,MAC5C;AAAA,MACA,OAAO;AAAA,IACR;AAAA,IAEA,IAAI,QAAQ,KAAK;AAAA,MAChB,EAAE,eAAe;AAAA,MACjB,MAAM,OAAO,SAAS;AAAA,MACtB,MAAM,MAAM,SAAS;AAAA,MACrB,MAAM,YAAY,KAAK,YAAY;AAAA,GAAM,MAAM,CAAC,IAAI;AAAA,MACpD,MAAM,MAAM,MAAM;AAAA,MAClB,MAAM,UAAU,KAAK,QAAQ;AAAA,GAAM,GAAG;AAAA,MACtC,IAAI,YAAY,IAAI;AAAA,QACnB,MAAM,gBAAgB,UAAU;AAAA,QAChC,IAAI,cAAc,KAAK,QAAQ;AAAA,GAAM,aAAa;AAAA,QAClD,IAAI,gBAAgB;AAAA,UAAI,cAAc,KAAK;AAAA,QAC3C,MAAM,cAAc,cAAc;AAAA,QAClC,MAAM,SAAS,gBAAgB,KAAK,IAAI,KAAK,WAAW;AAAA,QACxD,SAAS,kBAAkB,QAAQ,MAAM;AAAA,MAC1C;AAAA,MACA,OAAO;AAAA,IACR;AAAA,IAEA,IAAI,QAAQ,KAAK;AAAA,MAChB,EAAE,eAAe;AAAA,MACjB,MAAM,OAAO,SAAS;AAAA,MACtB,MAAM,MAAM,SAAS;AAAA,MACrB,MAAM,YAAY,KAAK,YAAY;AAAA,GAAM,MAAM,CAAC,IAAI;AAAA,MACpD,IAAI,YAAY,GAAG;AAAA,QAClB,MAAM,MAAM,MAAM;AAAA,QAClB,MAAM,cAAc,YAAY;AAAA,QAChC,MAAM,gBAAgB,KAAK,YAAY;AAAA,GAAM,cAAc,CAAC,IAAI;AAAA,QAChE,MAAM,cAAc,cAAc;AAAA,QAClC,MAAM,SAAS,gBAAgB,KAAK,IAAI,KAAK,WAAW;AAAA,QACxD,SAAS,kBAAkB,QAAQ,MAAM;AAAA,MAC1C;AAAA,MACA,OAAO;AAAA,IACR;AAAA,IAEA,OAAO;AAAA,KAER;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CACD;AAAA,EAEA,OAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAAA;;;ACpWD,qBAAS,0BAAU;AAoBZ,SAAS,cAAc,GAAyB;AAAA,EACtD,OAAO,iBAAiB,sBAAsB,UAAS,KAAK;AAAA,EAC5D,OAAO,cAAc,mBAAmB,UAAS,EAAE;AAAA,EACnD,OAAO,sBAAsB,2BAA2B,UAAS,CAAC;AAAA,EAClE,OAAO,qBAAqB,0BAA0B,UAEpD;AAAA,EAEF,MAAM,mBAAmB,aACxB,CACC,UACA,aACA,eACI;AAAA,IACJ,MAAM,WAAW,YAAY;AAAA,IAC7B,IAAI,CAAC;AAAA,MAAU;AAAA,IAEf,MAAM,QAAQ,SAAS;AAAA,IACvB,MAAM,YAAY,SAAS;AAAA,IAC3B,MAAM,mBAAmB,MAAM,MAAM,GAAG,SAAS;AAAA,IAEjD,MAAM,QAAQ,iBAAiB,MAAM,iBAAiB;AAAA,IACtD,IAAI,CAAC;AAAA,MAAO;AAAA,IAEZ,MAAM,QAAQ,YAAY,MAAM,GAAG,SAAS,MAAM,GAAG;AAAA,IACrD,MAAM,WAAW,GAAG,MAAM,MAAM,GAAG,KAAK,KAAK,YAAY,MAAM,MAAM,SAAS;AAAA,IAE9E,WAAW,QAAQ;AAAA,IACnB,mBAAmB,KAAK;AAAA,IAExB,WAAW,MAAM;AAAA,MAChB,MAAM,eAAe,QAAQ,SAAS,SAAS;AAAA,MAC/C,SAAS,kBAAkB,cAAc,YAAY;AAAA,MACrD,SAAS,MAAM;AAAA,OACb,CAAC;AAAA,KAEL,CAAC,CACF;AAAA,EAEA,MAAM,oBAAoB,aAAY,CAAC,SAA6B;AAAA,IACnE,uBAAuB,IAAI;AAAA,KACzB,CAAC,CAAC;AAAA,EAEL,MAAM,kBAAkB,aAAY,CAAC,OAAe,cAAsB;AAAA,IACzE,MAAM,mBAAmB,MAAM,MAAM,GAAG,SAAS;AAAA,IACjD,MAAM,QAAQ,iBAAiB,MAAM,iBAAiB;AAAA,IAEtD,IAAI,OAAO;AAAA,MACV,mBAAmB,IAAI;AAAA,MACvB,gBAAgB,MAAM,EAAE;AAAA,MACxB,wBAAwB,CAAC;AAAA,IAC1B,EAAO;AAAA,MACN,mBAAmB,KAAK;AAAA;AAAA,KAEvB,CAAC,CAAC;AAAA,EAEL,OAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAAA;;;ACxFD,qBAAS,0BAAU;AA6BZ,SAAS,qBAAqB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GAC6D;AAAA,EAC7D,OAAO,wBAAwB,6BAA6B,UAAS,KAAK;AAAA,EAC1E,OAAO,cAAc,mBAAmB,UAAS,EAAE;AAAA,EACnD,OAAO,sBAAsB,2BAA2B,UAAS,CAAC;AAAA,EAClE,OAAO,wBAAwB,6BAA6B,UAE1D;AAAA,EAEF,MAAM,sBAAsB,aAC3B,OAAO,cAAsB;AAAA,IAC5B,MAAM,aAAa,MAAM;AAAA,MACxB,WAAW,EAAE;AAAA,MACb,0BAA0B,KAAK;AAAA,MAC/B,IAAI,YAAY,SAAS;AAAA,QACxB,YAAY,QAAQ,MAAM,SAAS;AAAA,MACpC;AAAA,MACA,YAAY,SAAS,MAAM;AAAA;AAAA,IAG5B,IAAI,cAAc,QAAQ;AAAA,MACzB,sBAAsB,IAAI;AAAA,MAC1B,WAAW;AAAA,MACX;AAAA,IACD;AAAA,IACA,IAAI,cAAc,OAAO;AAAA,MACxB,kBAAkB,EAAE,SAAS,CAAC,eAAe,CAAC;AAAA,MAC9C,WAAW;AAAA,MACX;AAAA,IACD;AAAA,IACA,IAAI,cAAc,aAAa;AAAA,MAC9B,oBAAoB,CAAC,gBAAgB;AAAA,MACrC,WAAW;AAAA,MACX;AAAA,IACD;AAAA,IACA,IAAI,cAAc,QAAQ;AAAA,MACzB,IAAI,WAAW;AAAA,QACd,IAAI;AAAA,UACH,MAAM,UAAU,aAAa,SAAS;AAAA,UACrC,OAAO,OAAO;AAAA,UACf,QAAQ,MAAM,8BAA8B,KAAK;AAAA;AAAA,MAEnD;AAAA,MACA,WAAW;AAAA,MACX;AAAA,IACD;AAAA,IACA,IAAI,WAAW;AAAA,MACd,UAAU,SAAS;AAAA,IACpB;AAAA,IACA,WAAW;AAAA,KAEZ;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CACD;AAAA,EAEA,MAAM,2BAA2B,aAChC,CAAC,cAAkC;AAAA,IAClC,0BAA0B,SAAS;AAAA,KAEpC,CAAC,CACF;AAAA,EAEA,MAAM,kBAAkB,aAAY,CAAC,UAAkB;AAAA,IACtD,IAAI,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,SAAS,GAAG,GAAG;AAAA,MAClD,0BAA0B,IAAI;AAAA,MAC9B,gBAAgB,MAAM,MAAM,CAAC,CAAC;AAAA,MAC9B,wBAAwB,CAAC;AAAA,IAC1B,EAAO;AAAA,MACN,0BAA0B,KAAK;AAAA;AAAA,KAE9B,CAAC,CAAC;AAAA,EAEL,OAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAAA;;;ACxGM,SAAS,yBAAyB,CAAC,SAAqC;AAAA,EAC9E,OAAO,CAAC,MAA0C;AAAA,IACjD;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACG;AAAA,IAEJ,IAAI,wBAAwB;AAAA,MAC3B,MAAM,QAAQ,SAAS;AAAA,MACvB,IAAI,EAAE,QAAQ,eAAgB,EAAE,WAAW,EAAE,QAAQ,KAAM;AAAA,QAC1D,EAAE,eAAe;AAAA,QACjB,yBAAyB,uBAAuB,KAAK,KAAK;AAAA,MAC3D,EAAO,SAAI,EAAE,QAAQ,aAAc,EAAE,WAAW,EAAE,QAAQ,KAAM;AAAA,QAC/D,EAAE,eAAe;AAAA,QACjB,yBAAyB,uBAAuB,IAAI,SAAS,KAAK;AAAA,MACnE,EAAO,SAAI,EAAE,QAAQ,SAAS;AAAA,QAC7B,EAAE,eAAe;AAAA,QACjB,IAAI,wBAAwB;AAAA,UAC3B,oBAAoB,sBAAsB;AAAA,QAC3C;AAAA,MACD,EAAO,SAAI,EAAE,QAAQ,UAAU;AAAA,QAC9B,EAAE,eAAe;AAAA,QACjB,0BAA0B,KAAK;AAAA,MAChC;AAAA,MACA;AAAA,IACD;AAAA,IAEA,IAAI,iBAAiB;AAAA,MACpB,IAAI,EAAE,QAAQ,eAAgB,EAAE,WAAW,EAAE,QAAQ,KAAM;AAAA,QAC1D,EAAE,eAAe;AAAA,QACjB,yBAAyB,uBAAuB,KAAK,EAAE;AAAA,MACxD,EAAO,SAAI,EAAE,QAAQ,aAAc,EAAE,WAAW,EAAE,QAAQ,KAAM;AAAA,QAC/D,EAAE,eAAe;AAAA,QACjB,yBAAyB,uBAAuB,IAAI,MAAM,EAAE;AAAA,MAC7D,EAAO,SAAI,EAAE,QAAQ,SAAS;AAAA,QAC7B,EAAE,eAAe;AAAA,QACjB,IAAI,qBAAqB;AAAA,UACxB,iBAAiB,mBAAmB;AAAA,QACrC;AAAA,MACD,EAAO,SAAI,EAAE,QAAQ,UAAU;AAAA,QAC9B,EAAE,eAAe;AAAA,QACjB,mBAAmB,KAAK;AAAA,QACxB,IAAI,gBAAgB;AAAA,UACnB,WAAW,QAAQ;AAAA,QACpB;AAAA,MACD;AAAA,MACA;AAAA,IACD;AAAA,IAEA,IAAI,kBAAkB,YAAY,UAAU;AAAA,MAC3C,MAAM,UAAU,oBAAoB,CAAC;AAAA,MACrC,IAAI;AAAA,QAAS;AAAA,IACd;AAAA,IAEA,IAAI,kBAAkB,YAAY,YAAY,EAAE,QAAQ,UAAU;AAAA,MACjE,EAAE,eAAe;AAAA,MACjB,WAAW,QAAQ;AAAA,MACnB;AAAA,IACD;AAAA,IAEA,IAAI,EAAE,QAAQ,OAAO;AAAA,MACpB,EAAE,eAAe;AAAA,MACjB,MAAM,cAAc,CAAC;AAAA,MACrB,cAAc,WAAW;AAAA,MACzB,mBAAmB,WAAW;AAAA,IAC/B,EAAO,SACN,EAAE,QAAQ,WACV,CAAC,EAAE,aACF,CAAC,kBAAkB,YAAY,WAC/B;AAAA,MACD,EAAE,eAAe;AAAA,MACjB,WAAW;AAAA,IACZ;AAAA;AAAA;;;ACrHF,mBAAS;AA2DF,IAAM,eAAe,QAAkB,CAAC,SAAS;AAAA,EACvD,SAAS;AAAA,EACT,aAAa;AAAA,EACb,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,eAAe;AAAA,EACf,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,YAAY,CAAC,YAAY,IAAI,EAAE,QAAQ,CAAC;AAAA,EACxC,gBAAgB,CAAC,gBAAgB,IAAI,EAAE,YAAY,CAAC;AAAA,EACpD,YAAY,CAAC,YAAY,IAAI,EAAE,QAAQ,CAAC;AAAA,EACxC,mBAAmB,CAAC,qBAAqB,IAAI,EAAE,iBAAiB,CAAC;AAAA,EACjE,sBAAsB,CAAC,sBAAsB,IAAI,EAAE,kBAAkB,CAAC;AAAA,EACtE,kBAAkB,CAAC,kBAAkB,IAAI,EAAE,cAAc,CAAC;AAAA,EAC1D,YAAY,CAAC,cAAc,IAAI,EAAE,UAAU,CAAC;AAAA,EAC5C,gBAAgB,MAAM,IAAI,EAAE,kBAAkB,KAAK,CAAC;AAAA,EACpD,iBAAiB,MAAM,IAAI,EAAE,kBAAkB,MAAM,CAAC;AAAA,EACtD,UAAU,CAAC,UAAU,IAAI,EAAE,MAAM,CAAC;AAAA,EAClC,SAAS,CAAC,SAAS,IAAI,EAAE,KAAK,CAAC;AAAA,EAC/B,iBAAiB,CAAC,iBAAiB,IAAI,EAAE,aAAa,CAAC;AAAA,EACvD,WAAW,CAAC,WAAW,IAAI,EAAE,OAAO,CAAC;AACtC,EAAE;;;;A5BjBK,IAAM,YAAY,MACxB,YAGE,SAAS,UAAS;AAAA,EAElB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA,SAAS,CAAC;AAAA,EACV,YAAY,CAAC;AAAA,EACb;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmB,CAAC;AAAA,EACpB;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB;AAAA,EACA;AAAA,EACA,SAAS,CAAC;AAAA,EACV;AAAA,GAED,KACC;AAAA,EACD,OAAO,SAAS,cAAc,UAAS,EAAE;AAAA,EACzC,OAAO,YAAY,iBAAiB,UAAS,sBAAsB,KAAK;AAAA,EACxE,OAAO,oBAAoB,yBAAyB,UAAS,KAAK;AAAA,EAClE,OAAO,mBAAmB,wBAAwB,UAAS,KAAK;AAAA,EAChE,MAAM,cAAc,QAA4B,IAAI;AAAA,EACpD,MAAM,mBAAmB,QAAuB,IAAI;AAAA,EAEpD,QAAQ,MAAM,WAAW,WAAW,iBAAiB,SAAS;AAAA,EAC9D,QAAQ,2BAAa,sBAAsB,eAAe;AAAA,EAC1D,QAAQ,MAAM,eAAe,UAAU;AAAA,EACvC,MAAM,yBAAyB,kBAAkB;AAAA,EACjD,MAAM,QAAQ,WAAW,SAAS,CAAC;AAAA,EACnC,MAAM,eAAe,WAAW,gBAAgB,CAAC;AAAA,EAEjD,MAAM,cAAc,aAAa,CAAC,MAAM,EAAE,OAAO;AAAA,EACjD,MAAM,mBAAmB,aAAa,CAAC,MAAM,EAAE,YAAY;AAAA,EAC3D,MAAM,WAAW,aAAa,CAAC,MAAM,EAAE,IAAI;AAAA,EAC3C,MAAM,SAAS,iBAAiB;AAAA,EAChC,MAAM,kBAAkB,SAAQ,MAAM;AAAA,IACrC,IAAI,CAAC;AAAA,MAAQ,OAAO;AAAA,IAEpB,MAAM,gBACL,UAAU,0BAA0B,YACjC,SAAS,wBACT;AAAA,IAEJ,IAAI,kBAAkB,QAAQ;AAAA,MAC7B,MAAM,UAAU,GAAG,iBAAiB,kBAAkB,QAAQ,CAAC,KAAK;AAAA,MACpE,IACC,kBAAkB,QAClB,kBAAkB,aAClB,gBAAgB,GACf;AAAA,QACD,OAAO,MAAM,cAAa,cAAc,QAAQ,CAAC;AAAA,MAClD;AAAA,MACA,OAAO,MAAM;AAAA,IACd;AAAA,IAEA,IAAI,kBAAkB,QAAQ,kBAAkB,WAAW;AAAA,MAC1D,OAAO,IAAI,cAAc,QAAQ,CAAC;AAAA,IACnC;AAAA,IAEA,OAAO;AAAA,KACL,CAAC,QAAQ,UAAU,aAAa,gBAAgB,CAAC;AAAA,EAEpD,WAAU,MAAM;AAAA,IACf,IAAI,CAAC;AAAA,MAAmB;AAAA,IACxB,MAAM,qBAAqB,CAAC,UAAsB;AAAA,MACjD,IACC,iBAAiB,WACjB,CAAC,iBAAiB,QAAQ,SAAS,MAAM,MAAc,GACtD;AAAA,QACD,qBAAqB,KAAK;AAAA,MAC3B;AAAA;AAAA,IAED,SAAS,iBAAiB,aAAa,kBAAkB;AAAA,IACzD,OAAO,MACN,SAAS,oBAAoB,aAAa,kBAAkB;AAAA,KAC3D,CAAC,iBAAiB,CAAC;AAAA,EAEtB,MAAM,gBAAgB,QAAmB,MAAM,EAAE;AAAA,EAEjD;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,IAClB,mBAAmB;AAAA,IACnB;AAAA,MACG,eAAe;AAAA,EAEnB;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACG,sBAAsB;AAAA,IACzB;AAAA,IACA;AAAA,IACA,qBAAqB,CAAC,YACrB,uBAAuB,OAAO;AAAA,MAC7B,eAAe;AAAA,MACf,OAAO;AAAA,IACR,CAAC;AAAA,IACF,gBAAgB,aAAY;AAAA,IAC5B,kBAAkB,YAAY,UAAU,iBAAiB;AAAA,IACzD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAC;AAAA,EAED,QAAQ,SAAS,YAAY,wBAAwB,WAAW;AAAA,IAC/D,SAAS,aAAY;AAAA,IACrB,QAAQ,MAAM,cAAc,QAAQ;AAAA,IACpC;AAAA,IACA;AAAA,EACD,CAAC;AAAA,EAED,WAAU,MAAM;AAAA,IACf,YAAY,SAAS,MAAM;AAAA,KACzB,CAAC,CAAC;AAAA,EAEL,WAAU,MAAM;AAAA,IACf,IAAI,uBAAuB,WAAW;AAAA,MACrC,cAAc,kBAAkB;AAAA,IACjC;AAAA,KACE,CAAC,kBAAkB,CAAC;AAAA,EAEvB,oBAAoB,KAAK,OAAO;AAAA,IAC/B,OAAO,MAAM;AAAA,MACZ,YAAY,SAAS,MAAM;AAAA;AAAA,IAE5B,UAAU,CAAC,UAAkB;AAAA,MAC5B,WAAW,KAAK;AAAA,MAChB,YAAY,SAAS,MAAM;AAAA;AAAA,EAE7B,EAAE;AAAA,EAEF,MAAM,uBAAuB,aAAY,MAAM;AAAA,IAC9C,MAAM,WAAW,YAAY;AAAA,IAC7B,IAAI,CAAC;AAAA,MAAU;AAAA,IACf,SAAS,MAAM,SAAS;AAAA,IACxB,SAAS,MAAM,SAAS,GAAG,SAAS;AAAA,KAClC,CAAC,CAAC;AAAA,EAGL,WAAU,MAAM;AAAA,IACf,qBAAqB;AAAA,KACnB,CAAC,sBAAsB,OAAO,CAAC;AAAA,EAElC,MAAM,qBAAqB,aAAY,MAAM;AAAA,IAC5C,mBAAmB,KAAK;AAAA,IACxB,uBAAuB,SAAS;AAAA,KAC9B,CAAC,oBAAoB,sBAAsB,CAAC;AAAA,EAE/C,MAAM,qBAAqB,aAAY,MAAM;AAAA,IAC5C,0BAA0B,KAAK;AAAA,IAC/B,0BAA0B,SAAS;AAAA,KACjC,CAAC,2BAA2B,yBAAyB,CAAC;AAAA,EAEzD,MAAM,sBAAsB,aAC3B,CAAC,aAAqB;AAAA,IACrB,WAAW,UAAU,aAAa,UAAU;AAAA,KAE7C,CAAC,UAAU,CACZ;AAAA,EAEA,MAAM,aAAa,aAAY,MAAM;AAAA,IACpC,IAAI,CAAC,QAAQ,KAAK,KAAK;AAAA,MAAU;AAAA,IAEjC,OAAO,OAAO;AAAA,IACd,WAAW,EAAE;AAAA,IACb,mBAAmB,KAAK;AAAA,IACxB,0BAA0B,KAAK;AAAA,IAC/B,uBAAuB,SAAS;AAAA,IAChC,0BAA0B,SAAS;AAAA,IAEnC,IAAI,YAAY,SAAS;AAAA,MACxB,YAAY,QAAQ,MAAM,SAAS;AAAA,IACpC;AAAA,IAEA,IAAI,aAAY,SAAS;AAAA,MACxB,WAAW,QAAQ;AAAA,IACpB;AAAA,IAEA,YAAY,SAAS,MAAM;AAAA,KACzB;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAC;AAAA,EAED,WAAU,MAAM;AAAA,IACf,cAAc,UAAU;AAAA,KACtB,CAAC,UAAU,CAAC;AAAA,EAEf,MAAM,eAAe,aACpB,CAAC,MAAwC;AAAA,IACxC,IAAI,aAAY,WAAW,YAAY,UAAU;AAAA,MAChD;AAAA,IACD;AAAA,IAEA,MAAM,QAAQ,EAAE,OAAO;AAAA,IACvB,WAAW,KAAK;AAAA,IAEhB,gBAAgB,KAAK;AAAA,IAErB,IAAI,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,SAAS,GAAG,GAAG;AAAA,MAClD,mBAAmB,KAAK;AAAA,MACxB,uBAAuB,SAAS;AAAA,IACjC,EAAO;AAAA,MACN,0BAA0B,KAAK;AAAA,MAC/B,0BAA0B,SAAS;AAAA,MACnC,gBAAgB,OAAO,EAAE,OAAO,cAAc;AAAA;AAAA,KAGhD;AAAA,IACC,aAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CACD;AAAA,EAEA,MAAM,gBAAgB,SACrB,MACC,0BAA0B;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB,aAAY;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAC,GACF;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CACD;AAAA,EAEA,WAAU,MAAM;AAAA,IACf,IAAI,CAAC,aAAY,SAAS;AAAA,MACzB,WAAW,QAAQ;AAAA,IACpB;AAAA,KACE,CAAC,aAAY,SAAS,UAAU,CAAC;AAAA,EAEpC,MAAM,sBAAsB,aAC3B,CAAC,MAA2C;AAAA,IAC3C,UAAU,CAA8B;AAAA,KAEzC,CAAC,OAAO,CACT;AAAA,EAEA,MAAM,YAAY,OAAO,SAAS;AAAA,EAClC,MAAM,eAAe,UAAU,SAAS;AAAA,EACxC,MAAM,WAAW,aAAa;AAAA,EAE9B,uBACC;AAAA,cA8SE;AAAA,MA7SA,eACC,MAAM;AAAA,QACN,MAAM,cAAc,iBAAiB;AAAA,QACrC,MAAM,YAAY;AAAA,UACjB,GAAI,gBAAgB,CAAC,QAAQ,IAAI,CAAC;AAAA,UAClC,GAAI,oBAAoB,CAAC,KAAK,IAAI,CAAC;AAAA,UACnC;AAAA,UACA;AAAA,QACD,EAAE,KAAK,IAAI;AAAA,QACX,uBACC,MAoBE,OApBF;AAAA,UAAK,WAAU;AAAA,UAAf,0BACC,MAkBE,OAlBF;AAAA,YACC,WAAW,2EAA2E,cAAc,8BAA8B;AAAA,YADnI,UAkBE;AAAA,8BAfD,MAME,OANF;AAAA,gBACC,WAAW,oBAAoB,cAAc,kBAAkB;AAAA,gBADhE,0BAGC,MAAC,UAAD;AAAA,kBACC,WAAW,aAAa,cAAc,iBAAiB;AAAA,iBACxD;AAAA,eACC;AAAA,8BACF,MAOE,OAPF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UAOE;AAAA,kCAND,MAEE,KAFF;AAAA,oBAAG,WAAU;AAAA,oBAAb;AAAA,mBAEE;AAAA,kCACF,MAEE,KAFF;AAAA,oBAAG,WAAU;AAAA,oBAAb,UAEE;AAAA,sBADA;AAAA,sBADF;AAAA;AAAA,mBAEE;AAAA;AAAA,eACD;AAAA;AAAA,WACD;AAAA,SACD;AAAA,SAED;AAAA,sBACJ,MA2QE,OA3QF;AAAA,QAAK,WAAU;AAAA,QAAf,0BACC,MAyQE,OAzQF;AAAA,UAAK,WAAU;AAAA,UAAf,UAyQE;AAAA,YAxQA,aAAY,WAAW,YAAY,4BACnC,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAEE;AAAA,YAEF,aAAY,WAAW,YAAY,4BACnC,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAEE;AAAA,4BAEH,MAuHE,OAvHF;AAAA,cACC,WAAW,4EACV,aACG,sOACA;AAAA,cAJL,UAuHE;AAAA,gBAhHA,4BACA,MAwCE,OAxCF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAwCE;AAAA,oBAvCA,OAAO,IAAI,CAAC,wBACZ,MAgBE,OAhBF;AAAA,sBAEC,WAAU;AAAA,sBAFX,UAgBE;AAAA,wCAZD,MAAC,OAAD;AAAA,0BACC,KAAK,IAAI;AAAA,0BACT,KAAI;AAAA,0BACJ,WAAU;AAAA,yBACX;AAAA,wCACA,MAME,UANF;AAAA,0BACC,MAAK;AAAA,0BACL,SAAS,MAAM,eAAe,IAAI,EAAE;AAAA,0BACpC,WAAU;AAAA,0BAHX,0BAKC,MAAC,IAAD;AAAA,4BAAG,WAAU;AAAA,2BAAqB;AAAA,yBACjC;AAAA;AAAA,uBAdG,IAAI,EAeR,CACF;AAAA,oBACA,UAAU,IAAI,CAAC,wBACf,MAiBE,OAjBF;AAAA,sBAEC,WAAU;AAAA,sBAFX,UAiBE;AAAA,wBAbA,IAAI,SAAS,wBACb,MAAC,UAAD;AAAA,0BAAU,WAAU;AAAA,yBAAqC,oBAEzD,MAAC,WAAD;AAAA,0BAAU,WAAU;AAAA,yBAAsC;AAAA,wCAE3D,MAA+C,QAA/C;AAAA,0BAAM,WAAU;AAAA,0BAAhB,UAAoC,IAAI;AAAA,yBAAO;AAAA,wCAC/C,MAME,UANF;AAAA,0BACC,MAAK;AAAA,0BACL,SAAS,MAAM,eAAe,IAAI,EAAE;AAAA,0BACpC,WAAU;AAAA,0BAHX,0BAKC,MAAC,IAAD;AAAA,4BAAG,WAAU;AAAA,2BAAqB;AAAA,yBACjC;AAAA;AAAA,uBAfG,IAAI,EAgBR,CACF;AAAA;AAAA,iBACA;AAAA,gBAGF,iBAAiB,SAAS,qBAC1B,MAqBE,OArBF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UACE,iBAAiB,IAAI,CAAC,wBACtB,MAiBE,OAjBF;AAAA,oBAEC,WAAU;AAAA,oBAFX,UAiBE;AAAA,sCAbD,MAAC,cAAD;AAAA,wBAAc,WAAU;AAAA,uBAAsC;AAAA,sCAC9D,MAEE,QAFF;AAAA,wBAAM,WAAU;AAAA,wBAAhB,UACE,IAAI;AAAA,uBACJ;AAAA,sBACD,2CACA,MAME,UANF;AAAA,wBACC,MAAK;AAAA,wBACL,SAAS,MAAM,wBAAwB,IAAI,EAAE;AAAA,wBAC7C,WAAU;AAAA,wBAHX,0BAKC,MAAC,IAAD;AAAA,0BAAG,WAAU;AAAA,yBAAqB;AAAA,uBACjC;AAAA;AAAA,qBAdE,IAAI,EAgBR,CACF;AAAA,iBACA;AAAA,gCAGH,MA0CE,OA1CF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UA0CE;AAAA,oBAzCA,iCACA,MAME,UANF;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,WAAU;AAAA,sBAHX,0BAKC,MAAC,cAAD;AAAA,wBAAc,WAAU;AAAA,uBAAU;AAAA,qBACjC;AAAA,oCAEH,MAAC,UAAD;AAAA,sBACC,KAAK;AAAA,sBACL,OAAO;AAAA,sBACP,UAAU;AAAA,sBACV,WAAW;AAAA,sBACX,SAAS;AAAA,sBACT,aACC,aACG,kCACA;AAAA,sBAEJ;AAAA,sBACA,MAAM;AAAA,sBACN,WAAW,4HACV,aAAY,WAAW,YAAY,WAChC,gBACA;AAAA,sBAEJ,OAAO,EAAE,QAAQ,SAAS;AAAA,qBAC3B;AAAA,oCACA,MAWE,UAXF;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,UAAU,YAAa,CAAC,QAAQ,KAAK,KAAK,CAAC;AAAA,sBAC3C,WAAW,8GACV,QAAQ,KAAK,KAAK,WACf,gFACA;AAAA,sBAPL,0BAUC,MAAC,SAAD;AAAA,wBAAS,WAAU;AAAA,uBAAU;AAAA,qBAC5B;AAAA;AAAA,iBACD;AAAA;AAAA,aACD;AAAA,aAEA,oBACD,iBACA,aACA,gBACA,YACA,0BACA,MAiGE,OAjGF;AAAA,cAAK,WAAU;AAAA,cAAf,UAiGE;AAAA,gCAhGD,MAiCE,OAjCF;AAAA,kBACC,WAAU;AAAA,kBACV,KAAK;AAAA,kBAFN,UAiCE;AAAA,oBA7BA,SAAS,OAAO,SAAS,qBACzB,MASE,UATF;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,MAAM,qBAAqB,CAAC,iBAAiB;AAAA,sBACtD,WAAU;AAAA,sBAHX,UASE;AAAA,wCAJD,MAAiD,QAAjD;AAAA,0BAAM,WAAU;AAAA,0BAAhB,UAAyC;AAAA,yBAAQ;AAAA,wCACjD,MAAC,WAAD;AAAA,0BACC,WAAW,oCAAoC,oBAAoB,eAAe;AAAA,yBACnF;AAAA;AAAA,qBACC;AAAA,oBAEF,qCACA,MAcE,OAdF;AAAA,sBAAK,WAAU;AAAA,sBAAf,UACE,OAAO,IAAI,CAAC,sBACZ,MAUE,UAVF;AAAA,wBAEC,MAAK;AAAA,wBACL,SAAS,MAAM;AAAA,0BACd,gBAAgB,CAAC;AAAA,0BACjB,qBAAqB,KAAK;AAAA;AAAA,wBAE3B,WAAW,0EAA0E,MAAM,QAAQ,6CAA6C;AAAA,wBAPjJ,UASE;AAAA,yBARI,CASJ,CACF;AAAA,qBACA;AAAA;AAAA,iBAEF;AAAA,gCACF,MA+CE,OA/CF;AAAA,kBAAK,WAAU;AAAA,kBAAf,WACG,gBAAgB,aAAa,6BAC9B,MA2CE,OA3CF;AAAA,oBAAK,WAAU;AAAA,oBAAf,UA2CE;AAAA,sCA1CD,MAmBE,UAnBF;AAAA,wBACC,MAAK;AAAA,wBACL,SAAS;AAAA,wBACT,WAAU;AAAA,wBAHX,UAmBE;AAAA,0BAdA,gCACA;AAAA,sCAOE;AAAA,8CAND,MAAC,cAAD;AAAA,gCACC,UAAU;AAAA,gCACV,MAAM;AAAA,gCACN,WAAU;AAAA,+BACX;AAAA,8CACA,MAAgC,QAAhC;AAAA,gCAAM,WAAU;AAAA,gCAAhB;AAAA,+BAAgC;AAAA;AAAA,2BAC/B;AAAA,0BAEF,6BAAa,MAAmB,QAAnB;AAAA,sCAAO;AAAA,2BAAY;AAAA,0BAChC,YAAY,aAAa,2BACzB,MAAoC,QAApC;AAAA,4BAAM,WAAU;AAAA,4BAAhB;AAAA,2BAAoC;AAAA;AAAA,uBAEpC;AAAA,sBACD,UAAU,mCACV;AAAA,kCAmBE;AAAA,0CAlBD,MAEE,QAFF;AAAA,4BAAM,WAAU;AAAA,4BAAhB,UACE;AAAA,2BACA;AAAA,0BACD,oCACA,MAYE,UAZF;AAAA,4BACC,MAAK;AAAA,4BACL,SAAS,CAAC,MAAM;AAAA,8BACf,EAAE,gBAAgB;AAAA,8BAClB,iBAAiB;AAAA;AAAA,4BAElB,UAAU;AAAA,4BACV,WAAU;AAAA,4BAPX,0BASC,MAAC,YAAD;AAAA,8BACC,WAAW,qCAAqC,mBAAmB,iBAAiB;AAAA,6BACrF;AAAA,2BACC;AAAA;AAAA,uBAEF;AAAA;AAAA,mBAEF;AAAA,iBAEF;AAAA,gCACF,MAaE,OAbF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAaE;AAAA,oBAZA,oCACA,MAGE,QAHF;AAAA,sBAAM,WAAU;AAAA,sBAAhB,UAGE;AAAA,wCAFD,MAAC,QAAD;AAAA,0BAAO,WAAU;AAAA,yBAAU;AAAA,wBAD5B;AAAA;AAAA,qBAGE;AAAA,oBAEF,iCACA,MAGE,QAHF;AAAA,sBAAM,WAAU;AAAA,sBAAhB,UAGE;AAAA,wCAFD,MAAC,WAAD;AAAA,0BAAW,WAAU;AAAA,yBAAU;AAAA,wBADhC;AAAA;AAAA,qBAGE;AAAA;AAAA,iBAEF;AAAA;AAAA,aACD;AAAA,YAGF,mBAAmB,CAAC,gCACpB,MAAC,kBAAD;AAAA,cACC;AAAA,cACA;AAAA,cACA,OAAO;AAAA,cACP,eAAe;AAAA,cACf,UAAU;AAAA,cACV,eAAe;AAAA,cACf,SAAS;AAAA,aACV;AAAA,YAGA,0CACA,MAAC,yBAAD;AAAA,cACC,OAAO;AAAA,cACP,eAAe;AAAA,cACf,UAAU;AAAA,cACV,eAAe;AAAA,cACf,SAAS;AAAA,cACT;AAAA,aACD;AAAA,4BAGD,MAAC,gBAAD;AAAA,cACC,QAAQ;AAAA,cACR,SAAS,MAAM,sBAAsB,KAAK;AAAA,aAC3C;AAAA;AAAA,SACC;AAAA,OACD;AAAA;AAAA,GACD;AAAA,CAEH,CACF;;A6B1rBA;AAAA,UACC;AAAA,cACA;AAAA,iBACA;AAAA,eACA;AAAA,YACA;AAAA,gBACA;AAAA,yBACA;AAAA,aACA;AAAA;AAED,2BAAS;;;ACVT,qBAAS,0BAAU,gCAAa;;;ACAhC;AAAA;AAAA,iBAEC;AAAA,oBACA;AAAA;AAED,oBAAS;AAST,IAAM,qBAAqB;AAEpB,IAAM,mBAAmB,CAAC,YAAY,MAAM;AAE5C,SAAS,mBAAmB,GAAG;AAAA,EACrC,OAAO,iBAAiB;AAAA,IACvB,UAAU;AAAA,IACV,SAAS,GAAG,YAAY,QACvB,UAAU,gBAAgB;AAAA,MACzB,OAAO;AAAA,MACP,QAAQ;AAAA,IACT,CAAC;AAAA,IACF,kBAAkB,CAAC,aAAa,SAAS,cAAc;AAAA,IACvD,kBAAkB;AAAA,IAClB,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,sBAAsB;AAAA,EACvB,CAAC;AAAA;AAGK,SAAS,WAAW,GAAG;AAAA,EAC7B,MAAM,QAAQ,oBAAoB;AAAA,EAClC,MAAM,OAAO,SAAmB,MAAM;AAAA,IACrC,IAAI,CAAC,MAAM,MAAM;AAAA,MAAO,OAAO,CAAC;AAAA,IAChC,OAAO,MAAM,KAAK,MAAM,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAAA,KAClD,CAAC,MAAM,IAAI,CAAC;AAAA,EAEf,OAAO;AAAA,IACN;AAAA,IACA,WAAW,MAAM;AAAA,IACjB,SAAS,MAAM;AAAA,IACf,OAAO,MAAM;AAAA,IACb,aAAa,MAAM;AAAA,IACnB,eAAe,MAAM;AAAA,IACrB,oBAAoB,MAAM;AAAA,EAC3B;AAAA;AAGM,SAAS,UAAU,CAAC,WAAmB;AAAA,EAC7C,QAAQ,MAAM,aAAa,YAAY;AAAA,EACvC,OAAO,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS;AAAA;AAGzC,SAAS,gBAAgB,GAAG;AAAA,EAClC,MAAM,cAAc,gBAAe;AAAA,EAEnC,OAAO,aAAY;AAAA,IAClB,YAAY,CAAC,SAA+B,UAAU,cAAc,IAAI;AAAA,IACxE,WAAW,CAAC,eAAe;AAAA,MAC1B,YAAY,aACX,kBACA,CAAC,QAAQ;AAAA,QACR,IAAI,CAAC;AAAA,UAAK,OAAO;AAAA,QACjB,MAAM,YAAY,IAAI,MAAM;AAAA,QAC5B,IAAI,CAAC;AAAA,UAAW,OAAO;AAAA,QACvB,OAAO;AAAA,aACH;AAAA,UACH,OAAO;AAAA,YACN,KAAK,WAAW,OAAO,CAAC,YAAY,GAAG,UAAU,KAAK,EAAE;AAAA,YACxD,GAAG,IAAI,MAAM,MAAM,CAAC;AAAA,UACrB;AAAA,QACD;AAAA,OAEF;AAAA,MACA,YAAY,kBAAkB,EAAE,UAAU,iBAAiB,CAAC;AAAA;AAAA,EAE9D,CAAC;AAAA;AAGK,SAAS,gBAAgB,CAAC,WAAmB;AAAA,EACnD,MAAM,cAAc,gBAAe;AAAA,EAEnC,OAAO,aAAY;AAAA,IAClB,YAAY,CAAC,SACZ,UAAU,cAAc,WAAW,IAAI;AAAA,IACxC,WAAW,YAAY;AAAA,MACtB,MAAM,YAAY,kBAAkB,EAAE,UAAU,iBAAiB,CAAC;AAAA,MAClE,MAAM,YAAY,kBAAkB,EAAE,UAAU,CAAC,WAAW,SAAS,EAAE,CAAC;AAAA;AAAA,EAE1E,CAAC;AAAA;AAGK,SAAS,gBAAgB,GAAG;AAAA,EAClC,MAAM,cAAc,gBAAe;AAAA,EAEnC,OAAO,aAAY;AAAA,IAClB,YAAY,CAAC,cAAsB,UAAU,cAAc,SAAS;AAAA,IACpE,WAAW,MAAM;AAAA,MAChB,YAAY,kBAAkB,EAAE,UAAU,iBAAiB,CAAC;AAAA;AAAA,EAE9D,CAAC;AAAA;;;ADnGK,SAAS,WAAW,CAAC,WAA+B;AAAA,EAC1D,OAAO,UAAS;AAAA,IACf,UAAU,CAAC,YAAY,SAAS;AAAA,IAChC,SAAS,MAAM;AAAA,MACd,IAAI,CAAC,WAAW;AAAA,QACf,MAAM,IAAI,MAAM,wBAAwB;AAAA,MACzC;AAAA,MACA,OAAO,UAAU,YAAY,SAAS;AAAA;AAAA,IAEvC,SAAS,CAAC,CAAC;AAAA,EACZ,CAAC;AAAA;AAGK,SAAS,cAAc,CAAC,WAAmB;AAAA,EACjD,MAAM,cAAc,gBAAe;AAAA,EAEnC,OAAO,aAAY;AAAA,IAClB,YAAY,CAAC,SACZ,UAAU,YAAY,WAAW,IAAI;AAAA,IACtC,WAAW,MAAM;AAAA,MAChB,YAAY,kBAAkB,EAAE,UAAU,CAAC,YAAY,SAAS,EAAE,CAAC;AAAA,MACnE,YAAY,kBAAkB,EAAE,UAAU,iBAAiB,CAAC;AAAA;AAAA,EAE9D,CAAC;AAAA;;;AE5BF,qBAAS,0BAAU,gCAAa;;;ACAhC,mBAAS;;;ACAT,mBAAS;;;ACAT,mBAAS;;;ACAT,mBAAS;;;ACAT,mBAAS;;;ACAT,mBAAS;;;ACAT,mBAAS;;;ACAT,mBAAS;AAiCF,IAAM,iBAAiB,QAAoB,CAAC,SAAS;AAAA,EAC3D,YAAY;AAAA,EACZ,QAAQ,CAAC;AAAA,EACT,eAAe;AAAA,EACf,cAAc;AAAA,EACd,aAAa;AAAA,EAEb,eAAe,MAAM;AAAA,IACpB,IAAI,CAAC,UAAU;AAAA,MACd,MAAM,cAAc,CAAC,MAAM;AAAA,MAC3B,IAAI,aAAa;AAAA,QAChB,YAAY,SAAS,EAAE,gBAAgB;AAAA,QACvC,qBAAqB,SAAS,EAAE,gBAAgB;AAAA,QAChD,iBAAiB,SAAS,EAAE,gBAAgB;AAAA,QAC5C,iBAAiB,SAAS,EAAE,gBAAgB;AAAA,QAC5C,eAAe,SAAS,EAAE,gBAAgB;AAAA,QAC1C,oBAAoB,SAAS,EAAE,gBAAgB;AAAA,QAC/C,YAAY,SAAS,EAAE,gBAAgB;AAAA,MACxC;AAAA,MACA,OAAO,EAAE,YAAY,YAAY;AAAA,KACjC;AAAA;AAAA,EAGF,eAAe,MAAM;AAAA,IACpB,YAAY,SAAS,EAAE,gBAAgB;AAAA,IACvC,qBAAqB,SAAS,EAAE,gBAAgB;AAAA,IAChD,iBAAiB,SAAS,EAAE,gBAAgB;AAAA,IAC5C,iBAAiB,SAAS,EAAE,gBAAgB;AAAA,IAC5C,eAAe,SAAS,EAAE,gBAAgB;AAAA,IAC1C,oBAAoB,SAAS,EAAE,gBAAgB;AAAA,IAC/C,YAAY,SAAS,EAAE,gBAAgB;AAAA,IACvC,IAAI,EAAE,YAAY,KAAK,CAAC;AAAA;AAAA,EAGzB,iBAAiB,MAAM,IAAI,EAAE,YAAY,MAAM,CAAC;AAAA,EAEhD,WAAW,CAAC,WAAW,IAAI,EAAE,OAAO,CAAC;AAAA,EAErC,aAAa,CAAC,SACb,IAAI,EAAE,eAAe,MAAM,cAAc,OAAO,aAAa,KAAK,CAAC;AAAA,EAEpE,YAAY,CAAC,SAAS,IAAI,EAAE,cAAc,MAAM,aAAa,KAAK,CAAC;AAAA,EAEnE,aAAa,MAAM,IAAI,EAAE,cAAc,OAAO,aAAa,KAAK,CAAC;AAClE,EAAE;;;AD1BK,IAAM,cAAc,QAAiB,CAAC,SAAS;AAAA,EACrD,YAAY;AAAA,EACZ,SAAS,CAAC;AAAA,EACV,SAAS,IAAI;AAAA,EACb,UAAU,IAAI;AAAA,EACd,eAAe;AAAA,EAEf,eAAe,MAAM;AAAA,IACpB,IAAI,CAAC,UAAU;AAAA,MACd,MAAM,cAAc,CAAC,MAAM;AAAA,MAC3B,IAAI,aAAa;AAAA,QAChB,YAAY,SAAS,EAAE,gBAAgB;AAAA,QACvC,qBAAqB,SAAS,EAAE,gBAAgB;AAAA,QAChD,iBAAiB,SAAS,EAAE,gBAAgB;AAAA,QAC5C,iBAAiB,SAAS,EAAE,gBAAgB;AAAA,QAC5C,eAAe,SAAS,EAAE,gBAAgB;AAAA,QAC1C,oBAAoB,SAAS,EAAE,gBAAgB;AAAA,QAC/C,eAAe,SAAS,EAAE,gBAAgB;AAAA,MAC3C;AAAA,MACA,OAAO,EAAE,YAAY,YAAY;AAAA,KACjC;AAAA;AAAA,EAGF,eAAe,MAAM;AAAA,IACpB,YAAY,SAAS,EAAE,gBAAgB;AAAA,IACvC,qBAAqB,SAAS,EAAE,gBAAgB;AAAA,IAChD,iBAAiB,SAAS,EAAE,gBAAgB;AAAA,IAC5C,iBAAiB,SAAS,EAAE,gBAAgB;AAAA,IAC5C,eAAe,SAAS,EAAE,gBAAgB;AAAA,IAC1C,oBAAoB,SAAS,EAAE,gBAAgB;AAAA,IAC/C,eAAe,SAAS,EAAE,gBAAgB;AAAA,IAC1C,IAAI,EAAE,YAAY,KAAK,CAAC;AAAA;AAAA,EAGzB,iBAAiB,MAAM,IAAI,EAAE,YAAY,MAAM,CAAC;AAAA,EAEhD,YAAY,CAAC,YAAY,IAAI,EAAE,QAAQ,CAAC;AAAA,EAExC,YAAY,CAAC,MAAM,YAClB,IAAI,CAAC,UAAU;AAAA,IACd,MAAM,OAAO,IAAI,IAAI,MAAM,OAAO;AAAA,IAClC,IAAI;AAAA,MAAS,KAAK,IAAI,IAAI;AAAA,IACrB;AAAA,WAAK,OAAO,IAAI;AAAA,IACrB,OAAO,EAAE,SAAS,KAAK;AAAA,GACvB;AAAA,EAEF,cAAc,CAAC,MAAM,YACpB,IAAI,CAAC,WAAW;AAAA,IACf,SAAS,MAAM,QAAQ,IAAI,CAAC,MAC3B,EAAE,SAAS,OAAO,KAAK,MAAM,QAAQ,IAAI,CAC1C;AAAA,EACD,EAAE;AAAA,EAEH,YAAY,CAAC,MAAM,QAClB,IAAI,CAAC,UAAU;AAAA,IACd,MAAM,OAAO,IAAI,IAAI,MAAM,QAAQ;AAAA,IACnC,IAAI;AAAA,MAAK,KAAK,IAAI,MAAM,GAAG;AAAA,IACtB;AAAA,WAAK,OAAO,IAAI;AAAA,IACrB,OAAO,EAAE,UAAU,KAAK;AAAA,GACxB;AAAA,EAEF,kBAAkB,CAAC,SAAS,IAAI,EAAE,eAAe,KAAK,CAAC;AACxD,EAAE;;;AD1FK,IAAM,sBAAsB,QAAyB,CAAC,SAAS;AAAA,EACrE,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc,IAAI;AAAA,EAElB,eAAe,MAAM;AAAA,IACpB,IAAI,CAAC,UAAU;AAAA,MACd,MAAM,cAAc,CAAC,MAAM;AAAA,MAC3B,IAAI,aAAa;AAAA,QAChB,YAAY,SAAS,EAAE,gBAAgB;AAAA,QACvC,qBAAqB,SAAS,EAAE,gBAAgB;AAAA,QAChD,iBAAiB,SAAS,EAAE,gBAAgB;AAAA,QAC5C,iBAAiB,SAAS,EAAE,gBAAgB;AAAA,QAC5C,eAAe,SAAS,EAAE,gBAAgB;AAAA,QAC1C,YAAY,SAAS,EAAE,gBAAgB;AAAA,QACvC,eAAe,SAAS,EAAE,gBAAgB;AAAA,MAC3C;AAAA,MACA,OAAO,EAAE,YAAY,YAAY;AAAA,KACjC;AAAA;AAAA,EAEF,eAAe,MAAM;AAAA,IACpB,YAAY,SAAS,EAAE,gBAAgB;AAAA,IACvC,qBAAqB,SAAS,EAAE,gBAAgB;AAAA,IAChD,iBAAiB,SAAS,EAAE,gBAAgB;AAAA,IAC5C,iBAAiB,SAAS,EAAE,gBAAgB;AAAA,IAC5C,eAAe,SAAS,EAAE,gBAAgB;AAAA,IAC1C,YAAY,SAAS,EAAE,gBAAgB;AAAA,IACvC,eAAe,SAAS,EAAE,gBAAgB;AAAA,IAC1C,IAAI,EAAE,YAAY,KAAK,CAAC;AAAA;AAAA,EAEzB,iBAAiB,MAChB,IAAI;AAAA,IACH,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,cAAc;AAAA,EACf,CAAC;AAAA,EACF,UAAU,CAAC,SACV,IAAI;AAAA,IACH,cAAc;AAAA,IACd,cAAc;AAAA,EACf,CAAC;AAAA,EACF,aAAa,MACZ,IAAI;AAAA,IACH,cAAc;AAAA,IACd,cAAc;AAAA,EACf,CAAC;AAAA,EACF,WAAW,CAAC,SACX,IAAI,CAAC,UAAU;AAAA,IACd,MAAM,OAAO,IAAI,IAAI,MAAM,YAAY;AAAA,IACvC,IAAI,KAAK,IAAI,IAAI,GAAG;AAAA,MACnB,KAAK,OAAO,IAAI;AAAA,IACjB,EAAO;AAAA,MACN,KAAK,IAAI,IAAI;AAAA;AAAA,IAEd,OAAO,EAAE,cAAc,KAAK;AAAA,GAC5B;AACH,EAAE;;;ADlDK,IAAM,iBAAiB,QAAoB,CAAC,SAAS;AAAA,EAC3D,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,UAAU;AAAA,EAEV,eAAe,MAAM;AAAA,IACpB,IAAI,CAAC,UAAU;AAAA,MACd,MAAM,cAAc,CAAC,MAAM;AAAA,MAC3B,IAAI,aAAa;AAAA,QAChB,YAAY,SAAS,EAAE,gBAAgB;AAAA,QACvC,qBAAqB,SAAS,EAAE,gBAAgB;AAAA,QAChD,iBAAiB,SAAS,EAAE,gBAAgB;AAAA,QAC5C,iBAAiB,SAAS,EAAE,gBAAgB;AAAA,QAC5C,oBAAoB,SAAS,EAAE,gBAAgB;AAAA,QAC/C,YAAY,SAAS,EAAE,gBAAgB;AAAA,QACvC,eAAe,SAAS,EAAE,gBAAgB;AAAA,MAC3C;AAAA,MACA,OAAO,EAAE,YAAY,YAAY;AAAA,KACjC;AAAA;AAAA,EAGF,eAAe,MAAM;AAAA,IACpB,YAAY,SAAS,EAAE,gBAAgB;AAAA,IACvC,qBAAqB,SAAS,EAAE,gBAAgB;AAAA,IAChD,iBAAiB,SAAS,EAAE,gBAAgB;AAAA,IAC5C,iBAAiB,SAAS,EAAE,gBAAgB;AAAA,IAC5C,oBAAoB,SAAS,EAAE,gBAAgB;AAAA,IAC/C,YAAY,SAAS,EAAE,gBAAgB;AAAA,IACvC,eAAe,SAAS,EAAE,gBAAgB;AAAA,IAC1C,IAAI,EAAE,YAAY,KAAK,CAAC;AAAA;AAAA,EAGzB,iBAAiB,MAAM,IAAI,EAAE,YAAY,MAAM,CAAC;AAAA,EAEhD,WAAW,CAAC,WAAW,IAAI,EAAE,OAAO,CAAC;AAAA,EACrC,QAAQ,CAAC,QAAQ,IAAI,EAAE,IAAI,CAAC;AAAA,EAC5B,WAAW,CAAC,WAAW,IAAI,EAAE,OAAO,CAAC;AAAA,EACrC,UAAU,CAAC,UAAU,IAAI,EAAE,MAAM,CAAC;AAAA,EAClC,aAAa,CAAC,aAAa,IAAI,EAAE,SAAS,CAAC;AAAA,EAE3C,OAAO,MACN,IAAI;AAAA,IACH,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,UAAU;AAAA,EACX,CAAC;AACH,EAAE;;;ADjEK,IAAM,mBAAmB,SAAsB,CAAC,SAAS;AAAA,EAC/D,YAAY;AAAA,EAEZ,eAAe,MAAM;AAAA,IACpB,IAAI,CAAC,UAAU;AAAA,MACd,MAAM,cAAc,CAAC,MAAM;AAAA,MAC3B,IAAI,aAAa;AAAA,QAChB,YAAY,SAAS,EAAE,gBAAgB;AAAA,QACvC,qBAAqB,SAAS,EAAE,gBAAgB;AAAA,QAChD,iBAAiB,SAAS,EAAE,gBAAgB;AAAA,QAC5C,eAAe,SAAS,EAAE,gBAAgB;AAAA,QAC1C,oBAAoB,SAAS,EAAE,gBAAgB;AAAA,QAC/C,YAAY,SAAS,EAAE,gBAAgB;AAAA,QACvC,eAAe,SAAS,EAAE,gBAAgB;AAAA,MAC3C;AAAA,MACA,OAAO,EAAE,YAAY,YAAY;AAAA,KACjC;AAAA;AAAA,EAEF,eAAe,MAAM,IAAI,EAAE,YAAY,KAAK,CAAC;AAAA,EAC7C,iBAAiB,MAAM,IAAI,EAAE,YAAY,MAAM,CAAC;AACjD,EAAE;;;ADdK,IAAM,mBAAmB,SAAsB,CAAC,KAAK,SAAS;AAAA,EACpE,YAAY;AAAA,EACZ,yBAAyB;AAAA,EACzB,iBAAiB;AAAA,EAEjB,eAAe,MAAM;AAAA,IACpB,IAAI,CAAC,UAAU;AAAA,MACd,MAAM,cAAc,CAAC,MAAM;AAAA,MAC3B,IAAI,aAAa;AAAA,QAChB,YAAY,SAAS,EAAE,gBAAgB;AAAA,QACvC,qBAAqB,SAAS,EAAE,gBAAgB;AAAA,QAChD,iBAAiB,SAAS,EAAE,gBAAgB;AAAA,QAC5C,eAAe,SAAS,EAAE,gBAAgB;AAAA,QAC1C,oBAAoB,SAAS,EAAE,gBAAgB;AAAA,QAC/C,YAAY,SAAS,EAAE,gBAAgB;AAAA,QACvC,eAAe,SAAS,EAAE,gBAAgB;AAAA,MAC3C;AAAA,MACA,OAAO,EAAE,YAAY,YAAY;AAAA,KACjC;AAAA;AAAA,EAGF,eAAe,MAAM;AAAA,IACpB,YAAY,SAAS,EAAE,gBAAgB;AAAA,IACvC,qBAAqB,SAAS,EAAE,gBAAgB;AAAA,IAChD,iBAAiB,SAAS,EAAE,gBAAgB;AAAA,IAC5C,eAAe,SAAS,EAAE,gBAAgB;AAAA,IAC1C,oBAAoB,SAAS,EAAE,gBAAgB;AAAA,IAC/C,YAAY,SAAS,EAAE,gBAAgB;AAAA,IACvC,eAAe,SAAS,EAAE,gBAAgB;AAAA,IAC1C,IAAI,EAAE,YAAY,KAAK,CAAC;AAAA;AAAA,EAGzB,iBAAiB,MAAM,IAAI,EAAE,YAAY,MAAM,CAAC;AAAA,EAEhD,uBAAuB,CAAC,OAAO,IAAI,EAAE,yBAAyB,GAAG,CAAC;AAAA,EAElE,oBAAoB,CAAC,OAAO;AAAA,IAC3B,MAAM,kBAAkB,IAAI,EAAE;AAAA,IAC9B,IAAI,oBAAoB,IAAI;AAAA,MAC3B,IAAI;AAAA,QACH,iBAAiB;AAAA,QACjB,yBAAyB;AAAA,MAC1B,CAAC;AAAA,IACF;AAAA;AAAA,EAGD,OAAO,MACN,IAAI;AAAA,IACH,yBAAyB;AAAA,IACzB,iBAAiB;AAAA,EAClB,CAAC;AACH,EAAE;;;ADhDK,IAAM,uBAAuB,SAA0B,CAAC,SAAS;AAAA,EACvE,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,eAAe,CAAC;AAAA,EAChB,wBAAwB;AAAA,EACxB,YAAY;AAAA,EAEZ,eAAe,MAAM;AAAA,IACpB,IAAI,CAAC,UAAU;AAAA,MACd,MAAM,cAAc,CAAC,MAAM;AAAA,MAC3B,IAAI,aAAa;AAAA,QAChB,YAAY,SAAS,EAAE,gBAAgB;AAAA,QACvC,iBAAiB,SAAS,EAAE,gBAAgB;AAAA,QAC5C,iBAAiB,SAAS,EAAE,gBAAgB;AAAA,QAC5C,eAAe,SAAS,EAAE,gBAAgB;AAAA,QAC1C,oBAAoB,SAAS,EAAE,gBAAgB;AAAA,QAC/C,YAAY,SAAS,EAAE,gBAAgB;AAAA,QACvC,eAAe,SAAS,EAAE,gBAAgB;AAAA,MAC3C;AAAA,MACA,OAAO,EAAE,YAAY,YAAY;AAAA,KACjC;AAAA;AAAA,EAEF,eAAe,MAAM;AAAA,IACpB,YAAY,SAAS,EAAE,gBAAgB;AAAA,IACvC,iBAAiB,SAAS,EAAE,gBAAgB;AAAA,IAC5C,iBAAiB,SAAS,EAAE,gBAAgB;AAAA,IAC5C,eAAe,SAAS,EAAE,gBAAgB;AAAA,IAC1C,oBAAoB,SAAS,EAAE,gBAAgB;AAAA,IAC/C,YAAY,SAAS,EAAE,gBAAgB;AAAA,IACvC,eAAe,SAAS,EAAE,gBAAgB;AAAA,IAC1C,IAAI,EAAE,YAAY,KAAK,CAAC;AAAA;AAAA,EAEzB,iBAAiB,MAChB,IAAI;AAAA,IACH,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,eAAe,CAAC;AAAA,IAChB,wBAAwB;AAAA,EACzB,CAAC;AAAA,EACF,UAAU,CAAC,MAAM,eAChB,IAAI;AAAA,IACH,cAAc;AAAA,IACd,eAAe;AAAA,IACf,wBAAwB,WAAW,SAAS;AAAA,IAC5C,YAAY;AAAA,IACZ,YAAY;AAAA,EACb,CAAC;AAAA,EACF,iBAAiB,CAAC,UAAU,IAAI,EAAE,wBAAwB,MAAM,CAAC;AAAA,EACjE,WAAW,MACV,IAAI;AAAA,IACH,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,eAAe,CAAC;AAAA,IAChB,wBAAwB;AAAA,EACzB,CAAC;AACH,EAAE;;;ADpCK,IAAM,cAAc,SAAiB,CAAC,SAAS;AAAA,EAErD,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,yBAAyB;AAAA,EAGzB,eAAe,MAAM;AAAA,IACpB,IAAI,CAAC,UAAU;AAAA,MACd,MAAM,cAAc,CAAC,MAAM;AAAA,MAC3B,IAAI,aAAa;AAAA,QAChB,qBAAqB,SAAS,EAAE,gBAAgB;AAAA,QAChD,iBAAiB,SAAS,EAAE,gBAAgB;AAAA,QAC5C,iBAAiB,SAAS,EAAE,gBAAgB;AAAA,QAC5C,eAAe,SAAS,EAAE,gBAAgB;AAAA,QAC1C,oBAAoB,SAAS,EAAE,gBAAgB;AAAA,QAC/C,YAAY,SAAS,EAAE,gBAAgB;AAAA,QACvC,eAAe,SAAS,EAAE,gBAAgB;AAAA,MAC3C;AAAA,MACA,OAAO,EAAE,YAAY,YAAY;AAAA,KACjC;AAAA;AAAA,EAEF,eAAe,MAAM,IAAI,EAAE,YAAY,KAAK,CAAC;AAAA,EAC7C,iBAAiB,MAChB,IAAI,EAAE,YAAY,OAAO,YAAY,OAAO,cAAc,KAAK,CAAC;AAAA,EAGjE,UAAU,CAAC,MAAM,WAChB,IAAI;AAAA,IACH,cAAc;AAAA,IACd,oBAAoB;AAAA,IACpB,YAAY;AAAA,IACZ,YAAY;AAAA,EACb,CAAC;AAAA,EACF,WAAW,MACV,IAAI;AAAA,IACH,YAAY;AAAA,IACZ,cAAc;AAAA,EACf,CAAC;AAAA,EACF,YAAY,CAAC,MAAM,WAClB,IAAI;AAAA,IACH,cAAc;AAAA,IACd,oBAAoB;AAAA,EACrB,CAAC;AAAA,EAGF,iBAAiB,MAChB,IAAI,CAAC,WAAW;AAAA,IACf,mBAAmB;AAAA,IACnB,iBAAiB,MAAM;AAAA,EACxB,EAAE;AAAA,EACH,2BAA2B,CAAC,cAC3B,IAAI,EAAE,mBAAmB,MAAM,iBAAiB,UAAU,CAAC;AAAA,EAC5D,kBAAkB,MACjB,IAAI,EAAE,mBAAmB,OAAO,iBAAiB,KAAK,CAAC;AAAA,EAGxD,oBAAoB,CAAC,cAAc,IAAI,EAAE,iBAAiB,UAAU,CAAC;AAAA,EACrE,yBAAyB,CAAC,cACzB,IAAI,EAAE,yBAAyB,UAAU,CAAC;AAC5C,EAAE;;;AD1GK,SAAS,YAAY,GAAG;AAAA,EAC9B,MAAM,aAAa,YAAY,CAAC,UAAU,MAAM,UAAU;AAAA,EAE1D,OAAO,UAAS;AAAA,IACf,UAAU,CAAC,OAAO,QAAQ;AAAA,IAC1B,SAAS,MAAM,UAAU,aAAa;AAAA,IAGtC,iBAAiB,aAAa,OAAO;AAAA,IACrC,OAAO;AAAA,IAEP,WAAW;AAAA,EACZ,CAAC;AAAA;AAGK,SAAS,UAAU,CAAC,MAAqB,SAAS,OAAO;AAAA,EAC/D,OAAO,UAAS;AAAA,IACf,UAAU,CAAC,OAAO,QAAQ,MAAM,MAAM;AAAA,IACtC,SAAS,MAAO,OAAO,UAAU,WAAW,MAAM,MAAM,IAAI;AAAA,IAC5D,SAAS,CAAC,CAAC;AAAA,IACX,OAAO;AAAA,IAEP,iBAAiB;AAAA,EAClB,CAAC;AAAA;AAGK,SAAS,YAAY,GAAG;AAAA,EAC9B,MAAM,aAAa,YAAY,CAAC,UAAU,MAAM,UAAU;AAAA,EAE1D,OAAO,UAAS;AAAA,IACf,UAAU,CAAC,OAAO,QAAQ;AAAA,IAC1B,SAAS,MAAM,UAAU,aAAa;AAAA,IAEtC,iBAAiB,aAAa,MAAQ;AAAA,IACtC,OAAO;AAAA,IACP,WAAW;AAAA,EACZ,CAAC;AAAA;AAGK,SAAS,wBAAwB,CAAC,WAA2B;AAAA,EACnE,OAAO,aAAY;AAAA,IAClB,YAAY,MAAM,UAAU,sBAAsB,aAAa,SAAS;AAAA,EACzE,CAAC;AAAA;AAGK,SAAS,aAAa,GAAG;AAAA,EAC/B,MAAM,cAAc,gBAAe;AAAA,EAEnC,OAAO,aAAY;AAAA,IAClB,YAAY,CAAC,UAAoB,UAAU,WAAW,KAAK;AAAA,IAC3D,WAAW,MAAM;AAAA,MAChB,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,QAAQ,EAAE,CAAC;AAAA;AAAA,EAE/D,CAAC;AAAA;AAGK,SAAS,eAAe,GAAG;AAAA,EACjC,MAAM,cAAc,gBAAe;AAAA,EAEnC,OAAO,aAAY;AAAA,IAClB,YAAY,CAAC,UAAoB,UAAU,aAAa,KAAK;AAAA,IAC7D,WAAW,MAAM;AAAA,MAChB,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,QAAQ,EAAE,CAAC;AAAA;AAAA,EAE/D,CAAC;AAAA;AAGK,SAAS,eAAe,GAAG;AAAA,EACjC,MAAM,cAAc,gBAAe;AAAA,EAEnC,OAAO,aAAY;AAAA,IAClB,YAAY,CAAC,UAAoB,UAAU,aAAa,KAAK;AAAA,IAC7D,WAAW,MAAM;AAAA,MAChB,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,QAAQ,EAAE,CAAC;AAAA;AAAA,EAE/D,CAAC;AAAA;AAGK,SAAS,cAAc,GAAG;AAAA,EAChC,MAAM,cAAc,gBAAe;AAAA,EAEnC,OAAO,aAAY;AAAA,IAClB,YAAY,CAAC,UAAoB,UAAU,YAAY,KAAK;AAAA,IAC5D,WAAW,MAAM;AAAA,MAChB,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,QAAQ,EAAE,CAAC;AAAA;AAAA,EAE/D,CAAC;AAAA;AAGK,SAAS,gBAAgB,GAAG;AAAA,EAClC,MAAM,cAAc,gBAAe;AAAA,EAEnC,OAAO,aAAY;AAAA,IAClB,YAAY,CAAC,YAAoB,UAAU,cAAc,OAAO;AAAA,IAChE,WAAW,MAAM;AAAA,MAChB,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,QAAQ,EAAE,CAAC;AAAA,MAC7D,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,QAAQ,EAAE,CAAC;AAAA;AAAA,EAE/D,CAAC;AAAA;AAGK,SAAS,cAAc,GAAG;AAAA,EAChC,MAAM,cAAc,gBAAe;AAAA,EAEnC,OAAO,aAAY;AAAA,IAClB,YAAY,MAAM,UAAU,YAAY;AAAA,IACxC,WAAW,MAAM;AAAA,MAChB,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,QAAQ,EAAE,CAAC;AAAA,MAC7D,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,QAAQ,EAAE,CAAC;AAAA;AAAA,EAE/D,CAAC;AAAA;AAGK,SAAS,cAAc,GAAG;AAAA,EAChC,MAAM,cAAc,gBAAe;AAAA,EAEnC,OAAO,aAAY;AAAA,IAClB,YAAY,MAAM,UAAU,YAAY;AAAA,IACxC,WAAW,MAAM;AAAA,MAChB,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,QAAQ,EAAE,CAAC;AAAA,MAC7D,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,QAAQ,EAAE,CAAC;AAAA;AAAA,EAE/D,CAAC;AAAA;AAGK,SAAS,UAAU,GAAG;AAAA,EAC5B,MAAM,cAAc,gBAAe;AAAA,EAEnC,OAAO,aAAY;AAAA,IAClB,YAAY,MAAM,UAAU,YAAY;AAAA,IACxC,WAAW,MAAM;AAAA,MAChB,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,QAAQ,EAAE,CAAC;AAAA,MAC7D,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,QAAQ,EAAE,CAAC;AAAA;AAAA,EAE/D,CAAC;AAAA;AAGK,SAAS,aAAa,GAAG;AAAA,EAC/B,MAAM,aAAa,YAAY,CAAC,UAAU,MAAM,UAAU;AAAA,EAE1D,OAAO,UAAS;AAAA,IACf,UAAU,CAAC,OAAO,SAAS;AAAA,IAC3B,SAAS,MAAM,UAAU,WAAW;AAAA,IACpC,SAAS;AAAA,IACT,OAAO;AAAA,IACP,WAAW;AAAA,EACZ,CAAC;AAAA;AAGK,SAAS,YAAY,GAAG;AAAA,EAC9B,MAAM,cAAc,gBAAe;AAAA,EAEnC,OAAO,aAAY;AAAA,IAClB,YAAY,GAAG,MAAM,UACpB,UAAU,UAAU,MAAM,GAAG;AAAA,IAC9B,WAAW,MAAM;AAAA,MAChB,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,SAAS,EAAE,CAAC;AAAA,MAC9D,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,QAAQ,EAAE,CAAC;AAAA;AAAA,EAE/D,CAAC;AAAA;AAGK,SAAS,eAAe,GAAG;AAAA,EACjC,MAAM,cAAc,gBAAe;AAAA,EAEnC,OAAO,aAAY;AAAA,IAClB,YAAY,CAAC,SAAiB,UAAU,aAAa,IAAI;AAAA,IACzD,WAAW,MAAM;AAAA,MAChB,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,SAAS,EAAE,CAAC;AAAA,MAC9D,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,QAAQ,EAAE,CAAC;AAAA;AAAA,EAE/D,CAAC;AAAA;;;AS/KF;AAAA,cACC;AAAA,iBACA;AAAA,eACA;AAAA;AAkBD,IAAM,cAAc,CAAC,aAAa,cAAc,aAAa,YAAY;AACzE,IAAM,YAAY,CAAC,iBAAiB;AACpC,IAAM,aAAa;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AACA,IAAM,kBAAkB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAEA,IAAM,kBAAkB,CAAC,GAAG,aAAa,GAAG,WAAW,GAAG,UAAU;AAEpE,SAAS,UAAU,GAAW;AAAA,EAC7B,OAAO,QAAQ,KAAK,IAAI,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC;AAAA;AAGnE,SAAS,WAAW,CAAC,MAAuC;AAAA,EAC3D,IAAI,YAAY,SAAS,KAAK,IAAI;AAAA,IAAG,OAAO;AAAA,EAC5C,IAAI,UAAU,SAAS,KAAK,IAAI;AAAA,IAAG,OAAO;AAAA,EAC1C,IAAI,WAAW,SAAS,KAAK,IAAI;AAAA,IAAG,OAAO;AAAA,EAC3C,MAAM,MAAM,KAAK,KAAK,YAAY,EAAE,MAAM,KAAK,KAAK,YAAY,GAAG,CAAC;AAAA,EACpE,IAAI,gBAAgB,SAAS,GAAG;AAAA,IAAG,OAAO;AAAA,EAC1C,OAAO;AAAA;AAGR,SAAS,WAAW,CAAC,MAAqB;AAAA,EACzC,IAAI,gBAAgB,SAAS,KAAK,IAAI;AAAA,IAAG,OAAO;AAAA,EAChD,MAAM,MAAM,KAAK,KAAK,YAAY,EAAE,MAAM,KAAK,KAAK,YAAY,GAAG,CAAC;AAAA,EACpE,OAAO,gBAAgB,SAAS,GAAG;AAAA;AAGpC,eAAe,YAAY,CAAC,MAA6B;AAAA,EACxD,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,IACvC,MAAM,SAAS,IAAI;AAAA,IACnB,OAAO,SAAS,MAAM;AAAA,MACrB,MAAM,SAAS,OAAO;AAAA,MACtB,MAAM,SAAS,OAAO,MAAM,GAAG,EAAE;AAAA,MACjC,QAAQ,MAAM;AAAA;AAAA,IAEf,OAAO,UAAU;AAAA,IACjB,OAAO,cAAc,IAAI;AAAA,GACzB;AAAA;AAGF,eAAe,UAAU,CAAC,MAA6B;AAAA,EACtD,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,IACvC,MAAM,SAAS,IAAI;AAAA,IACnB,OAAO,SAAS,MAAM,QAAQ,OAAO,MAAgB;AAAA,IACrD,OAAO,UAAU;AAAA,IACjB,OAAO,WAAW,IAAI;AAAA,GACtB;AAAA;AAGF,eAAe,aAAa,CAAC,MAA6B;AAAA,EACzD,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,IACvC,MAAM,SAAS,IAAI;AAAA,IACnB,OAAO,SAAS,MAAM,QAAQ,OAAO,MAAgB;AAAA,IACrD,OAAO,UAAU;AAAA,IACjB,OAAO,cAAc,IAAI;AAAA,GACzB;AAAA;AAYK,SAAS,aAAa,CAAC,UAAgC,CAAC,GAAG;AAAA,EACjE;AAAA,IACC,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,0BAA0B;AAAA,IAC1B;AAAA,MACG;AAAA,EAEJ,OAAO,OAAO,YAAY,UAA2B,CAAC,CAAC;AAAA,EACvD,OAAO,YAAY,iBAAiB,UAAS,KAAK;AAAA,EAClD,OAAO,OAAO,YAAY,UAAwB,IAAI;AAAA,EAEtD,MAAM,eAAe,YAAY,OAAO;AAAA,EAExC,MAAM,eAAe,aACpB,CAAC,SAA8B;AAAA,IAC9B,IAAI,CAAC,kBAAkB,YAAY,SAAS,KAAK,IAAI,GAAG;AAAA,MACvD,OAAO;AAAA,IACR;AAAA,IACA,IAAI,CAAC,2BAA2B,UAAU,SAAS,KAAK,IAAI,GAAG;AAAA,MAC9D,OAAO;AAAA,IACR;AAAA,IACA,IAAI,CAAC,YAAY,IAAI,GAAG;AAAA,MACvB,MAAM,MAAM,KAAK,KAAK,MAAM,KAAK,KAAK,YAAY,GAAG,CAAC;AAAA,MACtD,OAAO,0BAA0B,OAAO,KAAK,QAAQ;AAAA,IACtD;AAAA,IACA,IAAI,KAAK,OAAO,cAAc;AAAA,MAC7B,OAAO,oBAAoB,KAAK,OAAO,OAAO,MAAM,QAAQ,CAAC,aAAa;AAAA,IAC3E;AAAA,IACA,OAAO;AAAA,KAER,CAAC,cAAc,WAAW,gBAAgB,uBAAuB,CAClE;AAAA,EAEA,MAAM,WAAW,aAChB,OAAO,eAAkC;AAAA,IACxC,SAAS,IAAI;AAAA,IACb,MAAM,YAAY,MAAM,KAAK,UAAU;AAAA,IACvC,MAAM,YAAY,WAAW,MAAM;AAAA,IAEnC,IAAI,aAAa,GAAG;AAAA,MACnB,MAAM,MAAM,WAAW;AAAA,MACvB,SAAS,GAAG;AAAA,MACZ,UAAU,GAAG;AAAA,MACb;AAAA,IACD;AAAA,IAEA,MAAM,aAAa,UAAU,MAAM,GAAG,SAAS;AAAA,IAC/C,MAAM,WAA6B,CAAC;AAAA,IAEpC,WAAW,QAAQ,YAAY;AAAA,MAC9B,MAAM,kBAAkB,aAAa,IAAI;AAAA,MACzC,IAAI,iBAAiB;AAAA,QACpB,SAAS,eAAe;AAAA,QACxB,UAAU,eAAe;AAAA,QACzB;AAAA,MACD;AAAA,MAEA,MAAM,WAAW,YAAY,IAAI;AAAA,MACjC,IAAI,CAAC;AAAA,QAAU;AAAA,MAEf,IAAI;AAAA,QACH,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI,YAAY,KAAK;AAAA,QAErB,IAAI,aAAa,SAAS;AAAA,UACzB,CAAC,SAAS,IAAI,IAAI,MAAM,QAAQ,IAAI;AAAA,YACnC,cAAc,IAAI;AAAA,YAClB,aAAa,IAAI;AAAA,UAClB,CAAC;AAAA,QACF,EAAO,SAAI,aAAa,OAAO;AAAA,UAC9B,OAAO,MAAM,aAAa,IAAI;AAAA,UAC9B,YAAY;AAAA,QACb,EAAO;AAAA,UACN,cAAc,MAAM,WAAW,IAAI;AAAA,UACnC,OAAO;AAAA,UACP,IAAI,CAAC,WAAW;AAAA,YACf,MAAM,MAAM,KAAK,KAAK,YAAY;AAAA,YAClC,YACC,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,WAAW,IAC5C,kBACA;AAAA,UACL;AAAA;AAAA,QAGD,SAAS,KAAK;AAAA,UACb,IAAI,WAAW;AAAA,UACf;AAAA,UACA,MAAM;AAAA,UACN,MAAM,KAAK;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACD,CAAC;AAAA,QACA,MAAM;AAAA,QACP,MAAM,MAAM,2BAA2B,KAAK;AAAA,QAC5C,SAAS,GAAG;AAAA,QACZ,UAAU,GAAG;AAAA;AAAA,IAEf;AAAA,IAEA,IAAI,SAAS,SAAS,GAAG;AAAA,MACxB,SAAS,CAAC,SAAS,CAAC,GAAG,MAAM,GAAG,QAAQ,CAAC;AAAA,IAC1C;AAAA,KAED,CAAC,MAAM,QAAQ,UAAU,cAAc,OAAO,CAC/C;AAAA,EAEA,MAAM,aAAa,aAAY,CAAC,OAAe;AAAA,IAC9C,SAAS,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;AAAA,IAClD,SAAS,IAAI;AAAA,KACX,CAAC,CAAC;AAAA,EAEL,MAAM,aAAa,aAAY,MAAM;AAAA,IACpC,SAAS,CAAC,CAAC;AAAA,IACX,SAAS,IAAI;AAAA,KACX,CAAC,CAAC;AAAA,EAEL,MAAM,kBAAkB,aAAY,CAAC,MAAiB;AAAA,IACrD,EAAE,eAAe;AAAA,IACjB,EAAE,gBAAgB;AAAA,IAClB,IAAI,EAAE,aAAa,MAAM,SAAS,OAAO,GAAG;AAAA,MAC3C,cAAc,IAAI;AAAA,IACnB;AAAA,KACE,CAAC,CAAC;AAAA,EAEL,MAAM,kBAAkB,aAAY,CAAC,MAAiB;AAAA,IACrD,EAAE,eAAe;AAAA,IACjB,EAAE,gBAAgB;AAAA,IAClB,MAAM,OAAQ,EAAE,cAA8B,sBAAsB;AAAA,IACpE,MAAM,IAAI,EAAE;AAAA,IACZ,MAAM,IAAI,EAAE;AAAA,IACZ,IAAI,IAAI,KAAK,QAAQ,IAAI,KAAK,SAAS,IAAI,KAAK,OAAO,IAAI,KAAK,QAAQ;AAAA,MACvE,cAAc,KAAK;AAAA,IACpB;AAAA,KACE,CAAC,CAAC;AAAA,EAEL,MAAM,iBAAiB,aAAY,CAAC,MAAiB;AAAA,IACpD,EAAE,eAAe;AAAA,IACjB,EAAE,gBAAgB;AAAA,KAChB,CAAC,CAAC;AAAA,EAEL,MAAM,aAAa,aAClB,CAAC,MAAiB;AAAA,IACjB,EAAE,eAAe;AAAA,IACjB,EAAE,gBAAgB;AAAA,IAClB,cAAc,KAAK;AAAA,IAEnB,MAAM,eAAe,EAAE,aAAa;AAAA,IACpC,IAAI,aAAa,SAAS,GAAG;AAAA,MAC5B,SAAS,MAAM,KAAK,YAAY,CAAC;AAAA,IAClC;AAAA,KAED,CAAC,QAAQ,CACV;AAAA,EAEA,MAAM,cAAc,aACnB,CAAC,MAAsB;AAAA,IACtB,MAAM,QAAQ,EAAE,eAAe;AAAA,IAC/B,IAAI,CAAC;AAAA,MAAO;AAAA,IAEZ,MAAM,cAAsB,CAAC;AAAA,IAC7B,WAAW,QAAQ,MAAM,KAAK,KAAK,GAAG;AAAA,MACrC,IAAI,KAAK,SAAS,QAAQ;AAAA,QACzB,MAAM,OAAO,KAAK,UAAU;AAAA,QAC5B,IAAI,MAAM;AAAA,UACT,YAAY,KAAK,IAAI;AAAA,QACtB;AAAA,MACD;AAAA,IACD;AAAA,IAEA,IAAI,YAAY,SAAS,GAAG;AAAA,MAC3B,EAAE,eAAe;AAAA,MACjB,SAAS,WAAW;AAAA,IACrB;AAAA,KAED,CAAC,QAAQ,CACV;AAAA,EAEA,WAAU,MAAM;AAAA,IACf,IAAI,CAAC;AAAA,MAAU;AAAA,IAEf,IAAI,cAAc;AAAA,IAElB,MAAM,cAAc,CAAC,MAA4B;AAAA,MAChD,EAAE,eAAe;AAAA,MACjB,IAAI,EAAE,cAAc,MAAM,SAAS,OAAO,GAAG;AAAA,QAC5C;AAAA,QACA,IAAI,gBAAgB,GAAG;AAAA,UACtB,cAAc,IAAI;AAAA,QACnB;AAAA,MACD;AAAA;AAAA,IAGD,MAAM,cAAc,CAAC,MAA4B;AAAA,MAChD,EAAE,eAAe;AAAA,MACjB;AAAA,MACA,IAAI,gBAAgB,GAAG;AAAA,QACtB,cAAc,KAAK;AAAA,MACpB;AAAA;AAAA,IAGD,MAAM,aAAa,CAAC,MAA4B;AAAA,MAC/C,EAAE,eAAe;AAAA;AAAA,IAGlB,MAAM,SAAS,CAAC,MAA4B;AAAA,MAC3C,EAAE,eAAe;AAAA,MACjB,cAAc;AAAA,MACd,cAAc,KAAK;AAAA,MAEnB,MAAM,eAAe,EAAE,cAAc;AAAA,MACrC,IAAI,gBAAgB,aAAa,SAAS,GAAG;AAAA,QAC5C,SAAS,MAAM,KAAK,YAAY,CAAC;AAAA,MAClC;AAAA;AAAA,IAGD,SAAS,iBAAiB,aAAa,WAAW;AAAA,IAClD,SAAS,iBAAiB,aAAa,WAAW;AAAA,IAClD,SAAS,iBAAiB,YAAY,UAAU;AAAA,IAChD,SAAS,iBAAiB,QAAQ,MAAM;AAAA,IAExC,OAAO,MAAM;AAAA,MACZ,SAAS,oBAAoB,aAAa,WAAW;AAAA,MACrD,SAAS,oBAAoB,aAAa,WAAW;AAAA,MACrD,SAAS,oBAAoB,YAAY,UAAU;AAAA,MACnD,SAAS,oBAAoB,QAAQ,MAAM;AAAA;AAAA,KAE1C,CAAC,UAAU,QAAQ,CAAC;AAAA,EAEvB,MAAM,SAAS,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO;AAAA,EACrD,MAAM,YAAY,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,SAAS,MAAM;AAAA,EAE3E,OAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAAA;;;ACxYD,mBAAS;AAQF,IAAM,gBAAgB,SAAmB,CAAC,KAAK,SAAS;AAAA,EAC9D,oBAAoB;AAAA,EACpB,uBAAuB,CAAC,SAAS,IAAI,EAAE,oBAAoB,KAAK,CAAC;AAAA,EACjE,oBAAoB,MAAM;AAAA,IACzB,MAAM,OAAO,IAAI,EAAE;AAAA,IACnB,IAAI,EAAE,oBAAoB,KAAK,CAAC;AAAA,IAChC,OAAO;AAAA;AAET,EAAE;;;AChBF,mBAAS;AAqBF,IAAM,0BAA0B,SACtC,CAAC,KAAK,SAAS;AAAA,EACd,iBAAiB,IAAI;AAAA,EAErB,YAAY,CAAC,iBAAiB,YAAY;AAAA,IACzC,IAAI,CAAC,UAAU;AAAA,MACd,MAAM,SAAS,IAAI,IAAI,MAAM,eAAe;AAAA,MAC5C,MAAM,WAAW,OAAO,IAAI,eAAe,KAAK,CAAC;AAAA,MACjD,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,EAAE,GAAG;AAAA,QAC/C,OAAO,IAAI,iBAAiB,CAAC,GAAG,UAAU,OAAO,CAAC;AAAA,MACnD;AAAA,MACA,OAAO,EAAE,iBAAiB,OAAO;AAAA,KACjC;AAAA;AAAA,EAGF,eAAe,CAAC,iBAAiB,cAAc;AAAA,IAC9C,IAAI,CAAC,UAAU;AAAA,MACd,MAAM,SAAS,IAAI,IAAI,MAAM,eAAe;AAAA,MAC5C,MAAM,WAAW,OAAO,IAAI,eAAe,KAAK,CAAC;AAAA,MACjD,OAAO,IACN,iBACA,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS,CAC1C;AAAA,MACA,OAAO,EAAE,iBAAiB,OAAO;AAAA,KACjC;AAAA;AAAA,EAGF,aAAa,CAAC,oBAAoB;AAAA,IACjC,OAAO,IAAI,EAAE,gBAAgB,IAAI,eAAe,KAAK,CAAC;AAAA;AAAA,EAGvD,eAAe,CAAC,oBAAoB;AAAA,IACnC,IAAI,CAAC,UAAU;AAAA,MACd,MAAM,SAAS,IAAI,IAAI,MAAM,eAAe;AAAA,MAC5C,OAAO,OAAO,eAAe;AAAA,MAC7B,OAAO,EAAE,iBAAiB,OAAO;AAAA,KACjC;AAAA;AAAA,EAGF,iBAAiB,CAAC,oBAAoB;AAAA,IACrC,MAAM,WAAW,IAAI,EAAE,YAAY,eAAe;AAAA,IAClD,IAAI,EAAE,cAAc,eAAe;AAAA,IACnC,OAAO;AAAA;AAET,EACD;;;ACtDA,IAAM,yBACL;AAEM,SAAS,oBAAoB,CAAC,SAA8B;AAAA,EAClE,MAAM,mBAA4C,CAAC;AAAA,EACnD,IAAI,eAAe;AAAA,EAEnB,MAAM,QAAQ,IAAI,OAAO,sBAAsB;AAAA,EAC/C,IAAI,QAAQ,MAAM,KAAK,OAAO;AAAA,EAE9B,OAAO,UAAU,MAAM;AAAA,IACtB,OAAO,WAAW,MAAM,OAAO,gBAAgB;AAAA,IAC/C,iBAAiB,KAAK;AAAA,MACrB,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA,SAAS,aAAa,KAAK;AAAA,IAC5B,CAAC;AAAA,IACD,eAAe,aAAa,QAAQ,WAAW,EAAE;AAAA,IACjD,QAAQ,MAAM,KAAK,OAAO;AAAA,EAC3B;AAAA,EAEA,eAAe,aAAa,KAAK;AAAA,EAEjC,OAAO;AAAA,IACN;AAAA,IACA;AAAA,EACD;AAAA;AAGM,SAAS,+BAA+B,CAC9C,UACS;AAAA,EACT,IAAI,SAAS,WAAW;AAAA,IAAG,OAAO;AAAA,EAGlC,OAAO,SAAS,IAAI,CAAC,QAAQ,IAAI,OAAO,EAAE,KAAK;AAAA;AAAA,CAAM;AAAA;;;AChDtD,sBAAS,2BAAW;AAIb,SAAS,cAAc,CAAC,cAAkC;AAAA,EAChE,MAAM,aAAa,aAAa,CAAC,MAAM,EAAE,UAAU;AAAA,EACnD,MAAM,iBAAiB,aAAa,CAAC,MAAM,EAAE,cAAc;AAAA,EAC3D,MAAM,mBAAmB,aAAa,CAAC,MAAM,EAAE,gBAAgB;AAAA,EAC/D,MAAM,aAAa,aAAa,CAAC,MAAM,EAAE,UAAU;AAAA,EACnD,MAAM,WAAW,aAAa,CAAC,MAAM,EAAE,QAAQ;AAAA,EAC/C,MAAM,UAAU,aAAa,CAAC,MAAM,EAAE,OAAO;AAAA,EAC7C,MAAM,kBAAkB,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,EAC7D,MAAM,YAAY,aAAa,CAAC,MAAM,EAAE,SAAS;AAAA,EACjD,MAAM,UAAU,aAAa,CAAC,MAAM,EAAE,OAAO;AAAA,EAC7C,MAAM,cAAc,aAAa,CAAC,MAAM,EAAE,WAAW;AAAA,EACrD,MAAM,UAAU,aAAa,CAAC,MAAM,EAAE,OAAO;AAAA,EAE7C,MAAM,eAAe,cAAY,YAAY;AAAA,IAC5C,IAAI,iBAAiB,QAAQ;AAAA,MAC5B;AAAA,IACD;AAAA,IAEA,WAAW,IAAI;AAAA,IACf,IAAI;AAAA,MACH,OAAO,UAAU,UAAU,cAAc,MAAM,QAAQ,IAAI;AAAA,QAC1D,UAAU,eAAe;AAAA,QACzB,UAAU,mBAAmB,OAAO;AAAA,QACpC,UAAU,cAAc;AAAA,MACzB,CAAC;AAAA,MAED,IAAI,UAAU;AAAA,QACb,WAAW,SAAS,OAAO;AAAA,QAC3B,iBAAiB,SAAS,aAAa;AAAA,QACvC,SAAS,SAAS,SAAS,IAAI;AAAA,QAC/B,QAAQ,SAAS,QAAQ,IAAI;AAAA,QAC7B,gBAAgB,SAAS,gBAAgB,IAAI;AAAA,QAC7C,UAAU,SAAS,UAAU,IAAI;AAAA,MAClC,EAAO,SAAI,YAAY,cAAc,WAAW,WAAW;AAAA,QAC1D,iBAAiB,WAAW,SAAS;AAAA,MACtC;AAAA,MAEA,IAAI,UAAU;AAAA,QACb,eAAe,SAAS,WAAW;AAAA,QACnC,IAAI,CAAC,YAAY,SAAS,eAAe;AAAA,UACxC,iBAAiB,SAAS,aAAa;AAAA,QACxC;AAAA,MACD;AAAA,MACC,MAAM,WACN;AAAA,MACD,WAAW,KAAK;AAAA;AAAA,KAEf;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAC;AAAA,EAED,WAAU,MAAM;AAAA,IACf,IAAI,iBAAiB,WAAW,YAAY,QAAQ,gBAAgB,OAAO;AAAA,MAC1E,aAAa;AAAA,IACd;AAAA,KACE,CAAC,cAAc,SAAS,aAAa,YAAY,CAAC;AAAA,EAErD,OAAO;AAAA,IACN;AAAA,EACD;AAAA;;;ACxED,sBAAS,uBAAW;;;ACApB;AAAA,cACC;AAAA,eACA;AAAA,YACA;AAAA,aACA;AAAA,yBACA;AAAA,gBACA;AAAA;AAED;AACA;;AAyBO,IAAM,uBAAuB,YAGlC,SAAS,qBAAoB,GAC5B,UAAU,OAAO,UAAU,WAAW,SACxC,KACC;AAAA,EACD,QAAQ,MAAM,WAAW,cAAc,aAAa;AAAA,EACpD,OAAO,QAAQ,aAAa,UAAS,KAAK;AAAA,EAC1C,OAAO,aAAa,kBAAkB,UAAS,EAAE;AAAA,EACjD,OAAO,kBAAkB,uBAAuB,UAAS,CAAC;AAAA,EAC1D,MAAM,cAAc,QAAuB,IAAI;AAAA,EAC/C,MAAM,iBAAiB,QAAyB,IAAI;AAAA,EACpD,MAAM,WAAW,QAAqC,CAAC,CAAC;AAAA,EAExD,qBAAoB,KAAK,OAAO;AAAA,IAC/B,cAAc,MAAM;AAAA,MACnB,UAAU,IAAI;AAAA;AAAA,EAEhB,EAAE;AAAA,EAEF,MAAM,kBAAkB,SAAQ,MAAM;AAAA,IACrC,IAAI,CAAC;AAAA,MAAW,OAAO,CAAC;AAAA,IACxB,MAAM,YAA8B,CAAC;AAAA,IACrC,YAAY,aAAa,iBAAiB,OAAO,QAAQ,SAAS,GAAG;AAAA,MACpE,WAAW,aAAa,aAAa,QAAQ;AAAA,QAC5C,UAAU,KAAK;AAAA,UACd;AAAA,UACA,eAAe,aAAa;AAAA,UAC5B,SAAS,UAAU;AAAA,UACnB,YAAY,UAAU;AAAA,UACtB,UAAU,UAAU;AAAA,UACpB,eAAe,UAAU;AAAA,UACzB,WAAW,UAAU;AAAA,UACrB,mBAAmB,UAAU;AAAA,QAC9B,CAAC;AAAA,MACF;AAAA,IACD;AAAA,IACA,OAAO;AAAA,KACL,CAAC,SAAS,CAAC;AAAA,EAEd,MAAM,OAAO,SAAQ,MAAM;AAAA,IAC1B,OAAO,IAAI,MAAK,iBAAiB;AAAA,MAChC,MAAM;AAAA,QACL,EAAE,MAAM,cAAc,QAAQ,EAAE;AAAA,QAChC,EAAE,MAAM,WAAW,QAAQ,EAAE;AAAA,QAC7B,EAAE,MAAM,iBAAiB,QAAQ,IAAI;AAAA,MACtC;AAAA,MACA,WAAW;AAAA,MACX,gBAAgB;AAAA,MAChB,cAAc;AAAA,MACd,UAAU;AAAA,MACV,oBAAoB;AAAA,IACrB,CAAC;AAAA,KACC,CAAC,eAAe,CAAC;AAAA,EAEpB,MAAM,iBAAiB,SAAQ,MAAM;AAAA,IACpC,IAAI,CAAC;AAAA,MAAW,OAAO,CAAC;AAAA,IACxB,IAAI,CAAC,YAAY,KAAK;AAAA,MAAG,OAAO;AAAA,IAEhC,MAAM,UAAU,KAAK,OAAO,WAAW;AAAA,IAEvC,MAAM,gBAAgB,QAAQ,KAAK,CAAC,GAAG,MAAM;AAAA,MAC5C,MAAM,SAAS,EAAE,SAAS;AAAA,MAC1B,MAAM,SAAS,EAAE,SAAS;AAAA,MAC1B,IAAI,KAAK,IAAI,SAAS,MAAM,IAAI,OAAO;AAAA,QACtC,MAAM,SAAS,EAAE,KAAK,WAAW,YAAY;AAAA,QAC7C,MAAM,SAAS,EAAE,KAAK,WAAW,YAAY;AAAA,QAC7C,MAAM,QAAQ,YAAY,YAAY;AAAA,QACtC,MAAM,SAAS,OAAO,QAAQ,KAAK;AAAA,QACnC,MAAM,SAAS,OAAO,QAAQ,KAAK;AAAA,QACnC,IAAI,UAAU,KAAK,SAAS;AAAA,UAAG,OAAO;AAAA,QACtC,IAAI,UAAU,KAAK,SAAS;AAAA,UAAG,OAAO;AAAA,QACtC,IAAI,UAAU,KAAK,UAAU;AAAA,UAAG,OAAO,SAAS;AAAA,MACjD;AAAA,MACA,OAAO,SAAS;AAAA,KAChB;AAAA,IAED,MAAM,WAA6B,CAAC;AAAA,IAEpC,WAAW,UAAU,eAAe;AAAA,MACnC,MAAM,OAAO,OAAO;AAAA,MAEpB,IAAI,CAAC,SAAS,KAAK,cAAc;AAAA,QAChC,SAAS,KAAK,eAAe;AAAA,UAC5B,OAAO,KAAK;AAAA,UACZ,QAAQ,CAAC;AAAA,QACV;AAAA,MACD;AAAA,MAEA,MAAM,gBAAgB,SAAS,KAAK,aAAa,OAAO,KACvD,CAAC,MAAM,EAAE,OAAO,KAAK,OACtB;AAAA,MACA,IAAI,CAAC,eAAe;AAAA,QACnB,SAAS,KAAK,aAAa,OAAO,KAAK;AAAA,UACtC,IAAI,KAAK;AAAA,UACT,OAAO,KAAK;AAAA,UACZ,UAAU,KAAK;AAAA,UACf,eAAe,KAAK;AAAA,UACpB,WAAW,KAAK;AAAA,UAChB,mBAAmB,KAAK;AAAA,QACzB,CAAC;AAAA,MACF;AAAA,IACD;AAAA,IAEA,OAAO;AAAA,KACL,CAAC,WAAW,aAAa,IAAI,CAAC;AAAA,EAEjC,MAAM,mBAAmB,SAAQ,MAAM;AAAA,IACtC,MAAM,OAAyB,CAAC;AAAA,IAChC,YAAY,aAAa,iBAAiB,OAAO,QAAQ,cAAc,GAAG;AAAA,MACzE,WAAW,aAAa,aAAa,QAAQ;AAAA,QAC5C,KAAK,KAAK;AAAA,UACT;AAAA,UACA,eAAe,aAAa;AAAA,UAC5B,SAAS,UAAU;AAAA,UACnB,YAAY,UAAU;AAAA,UACtB,UAAU,UAAU;AAAA,UACpB,eAAe,UAAU;AAAA,UACzB,WAAW,UAAU;AAAA,UACrB,mBAAmB,UAAU;AAAA,QAC9B,CAAC;AAAA,MACF;AAAA,IACD;AAAA,IACA,OAAO;AAAA,KACL,CAAC,cAAc,CAAC;AAAA,EAEnB,YAAU,MAAM;AAAA,IACf,IAAI,QAAQ;AAAA,MACX,oBAAoB,CAAC;AAAA,IACtB;AAAA,KACE,CAAC,MAAM,CAAC;AAAA,EAEX,YAAU,MAAM;AAAA,IACf,IACC,UACA,oBAAoB,KACpB,mBAAmB,SAAS,QAAQ,QACnC;AAAA,MACD,SAAS,QAAQ,mBAAmB,eAAe;AAAA,QAClD,OAAO;AAAA,QACP,UAAU;AAAA,MACX,CAAC;AAAA,IACF;AAAA,KACE,CAAC,kBAAkB,MAAM,CAAC;AAAA,EAE7B,YAAU,MAAM;AAAA,IACf,MAAM,qBAAqB,CAAC,UAAsB;AAAA,MACjD,IACC,YAAY,WACZ,CAAC,YAAY,QAAQ,SAAS,MAAM,MAAc,GACjD;AAAA,QACD,UAAU,KAAK;AAAA,MAChB;AAAA;AAAA,IAGD,MAAM,eAAe,CAAC,UAAyB;AAAA,MAC9C,MAAM,SAAS,MAAM;AAAA,MACrB,MAAM,YACL,OAAO,YAAY,WACnB,OAAO,YAAY,cACnB,OAAO;AAAA,MACR,IAAI,MAAM,QAAQ,YAAa,MAAM,QAAQ,OAAO,CAAC,WAAY;AAAA,QAChE,UAAU,KAAK;AAAA,MAChB;AAAA;AAAA,IAGD,IAAI,QAAQ;AAAA,MACX,SAAS,iBAAiB,aAAa,kBAAkB;AAAA,MACzD,SAAS,iBAAiB,WAAW,YAAY;AAAA,MACjD,WAAW,MAAM,eAAe,SAAS,MAAM,GAAG,CAAC;AAAA,IACpD;AAAA,IAEA,OAAO,MAAM;AAAA,MACZ,SAAS,oBAAoB,aAAa,kBAAkB;AAAA,MAC5D,SAAS,oBAAoB,WAAW,YAAY;AAAA;AAAA,KAEnD,CAAC,MAAM,CAAC;AAAA,EAEX,MAAM,eAAe,CACpB,kBACA,eACA,cACI;AAAA,IACJ,IAAI,cAAc;AAAA,MAAO;AAAA,IACzB,SAAS,kBAAkB,aAAa;AAAA,IACxC,UAAU,KAAK;AAAA,IACf,eAAe,EAAE;AAAA;AAAA,EAGlB,MAAM,sBAAsB,CAAC,UAA+B;AAAA,IAC3D,IAAI,iBAAiB,WAAW;AAAA,MAAG;AAAA,IAEnC,IAAI,MAAM,QAAQ,eAAgB,MAAM,WAAW,MAAM,QAAQ,KAAM;AAAA,MACtE,MAAM,eAAe;AAAA,MACrB,oBAAoB,CAAC,SACpB,OAAO,iBAAiB,SAAS,IAAI,OAAO,IAAI,CACjD;AAAA,IACD,EAAO,SACN,MAAM,QAAQ,aACb,MAAM,WAAW,MAAM,QAAQ,KAC/B;AAAA,MACD,MAAM,eAAe;AAAA,MACrB,oBAAoB,CAAC,SACpB,OAAO,IAAI,OAAO,IAAI,iBAAiB,SAAS,CACjD;AAAA,IACD,EAAO,SAAI,MAAM,QAAQ,SAAS;AAAA,MACjC,MAAM,eAAe;AAAA,MACrB,MAAM,cAAc,iBAAiB;AAAA,MACrC,IAAI,eAAe,YAAY,cAAc,OAAO;AAAA,QACnD,aACC,YAAY,aACZ,YAAY,SACZ,YAAY,SACb;AAAA,MACD;AAAA,IACD;AAAA;AAAA,EAGD,MAAM,uBAAuB,YAAY,WAAW,SAAS;AAAA,EAC7D,MAAM,oBACL,YAAY,WAAW,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,GAAG,SAAS;AAAA,EAErE,uBACC,MAkIE,OAlIF;AAAA,IAAK,KAAK;AAAA,IAAa,WAAU;AAAA,IAAjC,UAkIE;AAAA,sBAjID,MAkBE,UAlBF;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM,CAAC,YAAY,UAAU,CAAC,MAAM;AAAA,QAC7C,UAAU,YAAY;AAAA,QACtB,WAAU;AAAA,QAJX,UAkBE;AAAA,0BAZD,MAQE,QARF;AAAA,YAAM,WAAU;AAAA,YAAhB,UAQE;AAAA,8BAPD,MAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UACE;AAAA,eACA;AAAA,8BACF,MAA4D,QAA5D;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAA4D;AAAA,8BAC5D,MAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UACE;AAAA,eACA;AAAA;AAAA,WACD;AAAA,0BACF,MAAC,aAAD;AAAA,YACC,WAAW,oEAAoE,SAAS,eAAe;AAAA,WACxG;AAAA;AAAA,OACC;AAAA,MACD,UAAU,CAAC,aAAa,6BACxB,MA2GE,OA3GF;AAAA,QAAK,WAAU;AAAA,QAAf,UA2GE;AAAA,0BA1GD,MAaE,OAbF;AAAA,YAAK,WAAU;AAAA,YAAf,0BACC,MAWE,OAXF;AAAA,cAAK,WAAU;AAAA,cAAf,UAWE;AAAA,gCAVD,MAAC,QAAD;AAAA,kBAAQ,WAAU;AAAA,iBAAuF;AAAA,gCACzG,MAAC,SAAD;AAAA,kBACC,KAAK;AAAA,kBACL,MAAK;AAAA,kBACL,OAAO;AAAA,kBACP,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK;AAAA,kBAC9C,WAAW;AAAA,kBACX,aAAY;AAAA,kBACZ,WAAU;AAAA,iBACX;AAAA;AAAA,aACC;AAAA,WACD;AAAA,0BAEF,MA0FE,OA1FF;AAAA,YAAK,WAAU;AAAA,YAAf,UACE,OAAO,KAAK,cAAc,EAAE,WAAW,oBACvC,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAEE,IAEF,OAAO,QAAQ,cAAc,EAAE,IAC9B,EAAE,aAAa,kCACd,MA8EE,OA9EF;AAAA,cAEC,WAAU;AAAA,cAFX,UA8EE;AAAA,gCA1ED,MAEE,OAFF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UACE,aAAa;AAAA,iBACb;AAAA,gCACF,MAsEE,OAtEF;AAAA,4BACE,aAAa,OAAO,IAAI,CAAC,cAAc;AAAA,oBACvC,MAAM,aACL,gBAAgB,YAAY,UAAU,OAAO;AAAA,oBAC9C,MAAM,YAAY,iBAAiB,UAClC,CAAC,SACA,KAAK,gBAAgB,eACrB,KAAK,YAAY,UAAU,EAC7B;AAAA,oBACA,MAAM,gBAAgB,cAAc;AAAA,oBACpC,MAAM,cAAc,UAAU,cAAc;AAAA,oBAE5C,uBACC,MAsDE,UAtDF;AAAA,sBAEC,KAAK,CAAC,OAAO;AAAA,wBACZ,IAAI,aAAa,GAAG;AAAA,0BACnB,SAAS,QAAQ,aAAa;AAAA,wBAC/B;AAAA;AAAA,sBAED,MAAK;AAAA,sBACL,UAAU,CAAC;AAAA,sBACX,OAAO,UAAU;AAAA,sBACjB,SAAS,MACR,aACC,aACA,UAAU,IACV,UAAU,SACX;AAAA,sBAED,cAAc,MAAM,oBAAoB,SAAS;AAAA,sBACjD,WAAW,0FACV,gBACG,4BACA,mCAEH,aACG,qDACA,mCAEH,CAAC,cACE,kCACA;AAAA,sBA7BL,UAsDE;AAAA,wCAtBD,MAA8C,QAA9C;AAAA,0BAAM,WAAU;AAAA,0BAAhB,UAA4B,UAAU;AAAA,yBAAQ;AAAA,yBAC5C,CAAC,eACF,UAAU,YACV,UAAU,kCACV,MAgBE,OAhBF;AAAA,0BAAK,WAAU;AAAA,0BAAf,UAgBE;AAAA,4BAfA,CAAC,+BACD,MAEE,QAFF;AAAA,8BAAM,WAAU;AAAA,8BAAhB;AAAA,6BAEE;AAAA,4BAEF,UAAU,4BACV,MAEE,QAFF;AAAA,8BAAM,WAAU;AAAA,8BAAhB;AAAA,6BAEE;AAAA,4BAEF,UAAU,iCACV,MAEE,QAFF;AAAA,8BAAM,WAAU;AAAA,8BAAhB;AAAA,6BAEE;AAAA;AAAA,yBAEF;AAAA;AAAA,uBAnDE,UAAU,EAqDd;AAAA,mBAEH;AAAA,iBACA;AAAA;AAAA,eA5EG,WA6EJ,CAEJ;AAAA,WAEA;AAAA;AAAA,OACD;AAAA;AAAA,GAEF;AAAA,CAEH;;;ACtYD;AAAA,cACC;AAAA,eACA;AAAA,YACA;AAAA,aACA;AAAA,yBACA;AAAA,gBACA;AAAA;AAED,wBAAS,wBAAa;AACtB;AAAA;AAaO,IAAM,uBAAuB,YAGlC,SAAS,qBAAoB,GAC5B,OAAO,QAAQ,UAAU,WAAW,SACtC,KACC;AAAA,EACD,OAAO,QAAQ,aAAa,WAAS,KAAK;AAAA,EAC1C,OAAO,aAAa,kBAAkB,WAAS,EAAE;AAAA,EACjD,OAAO,kBAAkB,uBAAuB,WAAS,CAAC;AAAA,EAC1D,MAAM,cAAc,QAAuB,IAAI;AAAA,EAC/C,MAAM,iBAAiB,QAAyB,IAAI;AAAA,EACpD,MAAM,WAAW,QAAqC,CAAC,CAAC;AAAA,EAExD,qBAAoB,KAAK,OAAO;AAAA,IAC/B,cAAc,MAAM;AAAA,MACnB,UAAU,IAAI;AAAA;AAAA,EAEhB,EAAE;AAAA,EAEF,MAAM,OAAO,SAAQ,MAAM;AAAA,IAC1B,OAAO,IAAI,MAAK,QAAQ;AAAA,MACvB,WAAW;AAAA,MACX,gBAAgB;AAAA,IACjB,CAAC;AAAA,KACC,CAAC,MAAM,CAAC;AAAA,EAEX,MAAM,iBAAiB,SAAQ,MAAM;AAAA,IACpC,IAAI,CAAC,YAAY,KAAK;AAAA,MAAG,OAAO;AAAA,IAChC,MAAM,UAAU,KAAK,OAAO,WAAW;AAAA,IACvC,OAAO,QAAQ,IAAI,CAAC,WAAW,OAAO,IAAI;AAAA,KACxC,CAAC,QAAQ,aAAa,IAAI,CAAC;AAAA,EAE9B,YAAU,MAAM;AAAA,IACf,IAAI,QAAQ;AAAA,MACX,oBAAoB,CAAC;AAAA,IACtB;AAAA,KACE,CAAC,MAAM,CAAC;AAAA,EAEX,YAAU,MAAM;AAAA,IACf,IACC,UACA,oBAAoB,KACpB,mBAAmB,SAAS,QAAQ,QACnC;AAAA,MACD,SAAS,QAAQ,mBAAmB,eAAe;AAAA,QAClD,OAAO;AAAA,QACP,UAAU;AAAA,MACX,CAAC;AAAA,IACF;AAAA,KACE,CAAC,kBAAkB,MAAM,CAAC;AAAA,EAE7B,YAAU,MAAM;AAAA,IACf,MAAM,qBAAqB,CAAC,UAAsB;AAAA,MACjD,IACC,YAAY,WACZ,CAAC,YAAY,QAAQ,SAAS,MAAM,MAAc,GACjD;AAAA,QACD,UAAU,KAAK;AAAA,MAChB;AAAA;AAAA,IAGD,MAAM,eAAe,CAAC,UAAyB;AAAA,MAC9C,MAAM,SAAS,MAAM;AAAA,MACrB,MAAM,YACL,OAAO,YAAY,WACnB,OAAO,YAAY,cACnB,OAAO;AAAA,MACR,IAAI,MAAM,QAAQ,YAAa,MAAM,QAAQ,OAAO,CAAC,WAAY;AAAA,QAChE,UAAU,KAAK;AAAA,MAChB;AAAA;AAAA,IAGD,IAAI,QAAQ;AAAA,MACX,SAAS,iBAAiB,aAAa,kBAAkB;AAAA,MACzD,SAAS,iBAAiB,WAAW,YAAY;AAAA,MACjD,WAAW,MAAM,eAAe,SAAS,MAAM,GAAG,CAAC;AAAA,IACpD;AAAA,IAEA,OAAO,MAAM;AAAA,MACZ,SAAS,oBAAoB,aAAa,kBAAkB;AAAA,MAC5D,SAAS,oBAAoB,WAAW,YAAY;AAAA;AAAA,KAEnD,CAAC,MAAM,CAAC;AAAA,EAEX,MAAM,eAAe,CAAC,kBAA0B;AAAA,IAC/C,SAAS,aAAa;AAAA,IACtB,UAAU,KAAK;AAAA,IACf,eAAe,EAAE;AAAA;AAAA,EAGlB,MAAM,sBAAsB,CAAC,UAA+B;AAAA,IAC3D,IAAI,eAAe,WAAW;AAAA,MAAG;AAAA,IAEjC,IAAI,MAAM,QAAQ,eAAgB,MAAM,WAAW,MAAM,QAAQ,KAAM;AAAA,MACtE,MAAM,eAAe;AAAA,MACrB,oBAAoB,CAAC,SACpB,OAAO,eAAe,SAAS,IAAI,OAAO,IAAI,CAC/C;AAAA,IACD,EAAO,SACN,MAAM,QAAQ,aACb,MAAM,WAAW,MAAM,QAAQ,KAC/B;AAAA,MACD,MAAM,eAAe;AAAA,MACrB,oBAAoB,CAAC,SACpB,OAAO,IAAI,OAAO,IAAI,eAAe,SAAS,CAC/C;AAAA,IACD,EAAO,SAAI,MAAM,QAAQ,SAAS;AAAA,MACjC,MAAM,eAAe;AAAA,MACrB,MAAM,cAAc,eAAe;AAAA,MACnC,IAAI,aAAa;AAAA,QAChB,aAAa,WAAW;AAAA,MACzB;AAAA,IACD;AAAA;AAAA,EAGD,uBACC,OAqEE,OArEF;AAAA,IAAK,KAAK;AAAA,IAAa,WAAU;AAAA,IAAjC,UAqEE;AAAA,sBApED,OAYE,UAZF;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM,CAAC,YAAY,UAAU,CAAC,MAAM;AAAA,QAC7C;AAAA,QACA,WAAU;AAAA,QAJX,UAYE;AAAA,0BAND,MAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UACE;AAAA,WACA;AAAA,0BACF,MAAC,cAAD;AAAA,YACC,WAAW,oEAAoE,SAAS,eAAe;AAAA,WACxG;AAAA;AAAA,OACC;AAAA,MAED,0BACA,OAmDE,OAnDF;AAAA,QAAK,WAAU;AAAA,QAAf,UAmDE;AAAA,0BAlDD,MAaE,OAbF;AAAA,YAAK,WAAU;AAAA,YAAf,0BACC,OAWE,OAXF;AAAA,cAAK,WAAU;AAAA,cAAf,UAWE;AAAA,gCAVD,MAAC,SAAD;AAAA,kBAAQ,WAAU;AAAA,iBAAuF;AAAA,gCACzG,MAAC,SAAD;AAAA,kBACC,KAAK;AAAA,kBACL,MAAK;AAAA,kBACL,OAAO;AAAA,kBACP,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK;AAAA,kBAC9C,WAAW;AAAA,kBACX,aAAY;AAAA,kBACZ,WAAU;AAAA,iBACX;AAAA;AAAA,aACC;AAAA,WACD;AAAA,0BAEF,MAkCE,OAlCF;AAAA,YAAK,WAAU;AAAA,YAAf,UACE,eAAe,WAAW,oBAC1B,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAEE,IAEF,eAAe,IAAI,CAAC,WAAW,UAAU;AAAA,cACxC,MAAM,aAAa,cAAc;AAAA,cACjC,MAAM,gBAAgB,UAAU;AAAA,cAEhC,uBACC,MAmBE,UAnBF;AAAA,gBAEC,KAAK,CAAC,OAAO;AAAA,kBACZ,SAAS,QAAQ,SAAS;AAAA;AAAA,gBAE3B,MAAK;AAAA,gBACL,SAAS,MAAM,aAAa,SAAS;AAAA,gBACrC,cAAc,MAAM,oBAAoB,KAAK;AAAA,gBAC7C,WAAW,wDACV,gBACG,4BACA,mCAEH,aACG,qDACA;AAAA,gBAfL,0BAkBC,MAAwC,QAAxC;AAAA,kBAAM,WAAU;AAAA,kBAAhB,UAA4B;AAAA,iBAAY;AAAA,iBAjBnC,SAkBJ;AAAA,aAEH;AAAA,WAED;AAAA;AAAA,OACD;AAAA;AAAA,GAEF;AAAA,CAEH;;;;AFvLM,SAAS,WAAW;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACoB;AAAA,EACpB,QAAQ,MAAM,SAAQ,WAAW,kBAAkB,UAAU;AAAA,EAC7D,MAAM,iBAAiB,kBAAkB;AAAA,EACzC,MAAM,mBAAmB,SAAQ,UAAU,iBAAiB;AAAA,EAC5D,MAAM,mBAAmB,QAAgC,IAAI;AAAA,EAC7D,MAAM,mBAAmB,QAAgC,IAAI;AAAA,EAE7D,YAAU,MAAM;AAAA,IACf,IAAI,UAAU,cAAc;AAAA,MAC3B,WAAW,MAAM;AAAA,QAChB,IAAI,iBAAiB,SAAS;AAAA,UAC7B,iBAAiB,SAAS,aAAa;AAAA,QACxC,EAAO,SAAI,iBAAiB,SAAS;AAAA,UACpC,iBAAiB,SAAS,aAAa;AAAA,QACxC;AAAA,SACE,GAAG;AAAA,IACP;AAAA,KACE,CAAC,QAAQ,YAAY,CAAC;AAAA,EAEzB,MAAM,cAAc,MAAM;AAAA,IACzB,QAAQ;AAAA,IAER,WAAW,MAAM;AAAA,MAChB,cAAc,SAAS,MAAM;AAAA,OAC3B,GAAG;AAAA;AAAA,EAGP,MAAM,oBAAoB,CACzB,kBACA,kBACI;AAAA,IACJ,IAAI,uBAAuB;AAAA,MAC1B,sBAAsB,kBAAkB,aAAa;AAAA,IACtD,EAAO;AAAA,MACN,iBAAiB,gBAAgB;AAAA,MACjC,cAAc,aAAa;AAAA;AAAA;AAAA,EAI7B,uBACC,MAuEE,OAvEF;AAAA,IACC;AAAA,IACA,SAAS;AAAA,IACT,OAAM;AAAA,IACN,eAAe;AAAA,IACf,sBAAsB;AAAA,IALvB,UAOE,gCACA,MAEE,OAFF;AAAA,MAAK,WAAU;AAAA,MAAf;AAAA,KAEE,IACC,0BACH,OAyDE,OAzDF;AAAA,MAAK,WAAU;AAAA,MAAf,UAyDE;AAAA,wBAxDD,OAUE,OAVF;AAAA,oBAUE;AAAA,4BATD,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAEE;AAAA,4BACF,MAAC,sBAAD;AAAA,cACC,KAAK;AAAA,cACL;AAAA,cACA,QAAQ,QAAO;AAAA,cACf,UAAU;AAAA,aACX;AAAA;AAAA,SACC;AAAA,wBAEF,OAUE,OAVF;AAAA,oBAUE;AAAA,4BATD,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAEE;AAAA,4BACF,MAAC,sBAAD;AAAA,cACC,KAAK;AAAA,cACL;AAAA,cACA;AAAA,cACA,UAAU;AAAA,aACX;AAAA;AAAA,SACC;AAAA,QAED,0CACA,OA6BE,OA7BF;AAAA,UAAK,WAAU;AAAA,UAAf,UA6BE;AAAA,4BA5BD,OAOE,OAPF;AAAA,wBAOE;AAAA,gCAND,MAEE,OAFF;AAAA,kBAAK,WAAU;AAAA,kBAAf;AAAA,iBAEE;AAAA,gCACF,MAEE,OAFF;AAAA,kBAAK,WAAU;AAAA,kBAAf;AAAA,iBAEE;AAAA;AAAA,aACD;AAAA,4BACF,MAmBE,UAnBF;AAAA,cACC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,gBAAc;AAAA,cACd,SAAS,MACR,eAAe,OAAO;AAAA,gBACrB,eAAe,CAAC;AAAA,gBAChB,OAAO;AAAA,cACR,CAAC;AAAA,cAEF,WAAW,oJACV,mBAAmB,eAAe;AAAA,cAXpC,0BAcC,MAAC,QAAD;AAAA,gBACC,WAAW,oEACV,mBAAmB,kBAAkB,mBAClC,mBAAmB,0BAA0B;AAAA,eAClD;AAAA,aACC;AAAA;AAAA,SACD;AAAA;AAAA,KAEF,IACC;AAAA,GACH;AAAA;;;;AjB5GG,IAAM,qBAAqB,MACjC,YACC,SAAS,mBAAkB,GACxB,WAAW,aAAa,cAAc,mBACxC,KACC;AAAA,EACD,MAAM,UAAU,WAAW,SAAS;AAAA,EACpC,OAAO,OAAO,YAAY,WAAS,EAAE;AAAA,EACrC,OAAO,UAAU,eAAe,WAAS,EAAE;AAAA,EAC3C,OAAO,OAAO,YAAY,WAAS,EAAE;AAAA,EACrC,OAAO,cAAc,mBAAmB,WAAS,KAAK;AAAA,EACtD,OAAO,mBAAmB,wBAAwB,WAEhD,IAAI;AAAA,EACN,OAAO,UAAU,eAAe,WAAS,CAAC;AAAA,EAE1C,MAAM,eAAe,QAGlB,IAAI;AAAA,EAEP,MAAM,cAAc,eAAe,SAAS;AAAA,EAC5C,YAAY,SAAS;AAAA,EACrB,MAAM,gBAAgB,iBAAiB,SAAS;AAAA,EAChD,MAAM,gBAAgB,iBAAiB;AAAA,EACvC,QAAQ,MAAM,cAAc,aAAa;AAAA,EACzC,QAAQ,MAAM,YAAW,UAAU;AAAA,EACnC,QAAQ,MAAM,cAAc,aAAa;AAAA,EACzC,MAAM,aAAa,cAAc;AAAA,EACjC,MAAM,4BAA4B,YACjC,CAAC,UAAU,MAAM,yBAClB;AAAA,EACA,MAAM,qBAAqB,YAC1B,CAAC,UAAU,MAAM,kBAClB;AAAA,EACA,MAAM,cAAc,gBAAe;AAAA,EAEnC,MAAM,yBAAyB,YAAY,WAAW,QAAQ,KAC7D,CAAC,MAAM,EAAE,OAAO,KACjB,GAAG;AAAA,EAEH,MAAM,sBAAsB,YAAY,WAAW,QAAQ,KAC1D,CAAC,MAAM,EAAE,OAAO,KACjB,GAAG;AAAA,EAEH,MAAM,0BAA0B,YAAY,WAAW,QAAQ,KAC9D,CAAC,MAAM,EAAE,OAAO,KACjB,GAAG;AAAA,EAEH;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACG,cAAc;AAAA,IACjB,gBAAgB,CAAC,CAAC;AAAA,IAClB,yBAAyB,CAAC,CAAC;AAAA,IAC3B,SAAS,MAAM;AAAA,EAChB,CAAC;AAAA,EAED,MAAM,qBAAqB,wBAC1B,CAAC,UAAU,MAAM,eAClB;AAAA,EACA,MAAM,wBAAwB,wBAC7B,CAAC,UAAU,MAAM,aAClB;AAAA,EACA,MAAM,0BAA0B,wBAC/B,CAAC,UAAU,MAAM,eAClB;AAAA,EAEA,MAAM,0BAA0B,mBAAmB,IAAI,SAAS,KAAK,CAAC;AAAA,EAEtE,MAAM,mBAAmB,SACxB,MACC,wBAAwB,IAAI,CAAC,SAAS;AAAA,IACrC,IAAI,IAAI;AAAA,IACR,OAAO,IAAI;AAAA,EACZ,EAAE,GACH,CAAC,uBAAuB,CACzB;AAAA,EAEA,MAAM,8BAA8B,cACnC,CAAC,cAAsB;AAAA,IACtB,sBAAsB,WAAW,SAAS;AAAA,KAE3C,CAAC,WAAW,qBAAqB,CAClC;AAAA,EAEA,MAAM,mBAAmB,YAAY,WAAW;AAAA,EAEhD,QAAQ,iBAAiB,eAAe,QAAQ;AAAA,EAChD,MAAM,mBAAmB,aAAa,CAAC,MAAM,EAAE,SAAS;AAAA,EAExD,YAAU,MAAM;AAAA,IACf,IAAI,SAAS;AAAA,MACZ,SAAS,QAAQ,KAAK;AAAA,MACtB,YAAY,QAAQ,QAAQ;AAAA,MAC5B,SAAS,QAAQ,KAAK;AAAA,IACvB;AAAA,KACE,CAAC,OAAO,CAAC;AAAA,EAEZ,YAAU,MAAM;AAAA,IACf,mBAAmB,SAAS;AAAA,IAC5B,OAAO,MAAM,mBAAmB,IAAI;AAAA,KAClC,CAAC,WAAW,kBAAkB,CAAC;AAAA,EAElC,YAAU,MAAM;AAAA,IACf,YAAY,CAAC,SAAS,OAAO,CAAC;AAAA,KAC5B,CAAC,CAAC;AAAA,EAEL,MAAM,qBAAqB,cAC1B,CAAC,UAAU,MAAM,kBAClB;AAAA,EACA,MAAM,qBAAqB,cAC1B,CAAC,UAAU,MAAM,kBAClB;AAAA,EAEA,YAAU,MAAM;AAAA,IACf,IAAI,oBAAoB;AAAA,MACvB,MAAM,OAAO,mBAAmB;AAAA,MAChC,IAAI,MAAM;AAAA,QACT,aAAa,SAAS,SAAS,IAAI;AAAA,MACpC;AAAA,IACD;AAAA,KACE,CAAC,oBAAoB,kBAAkB,CAAC;AAAA,EAE3C,qBAAoB,KAAK,OAAO;AAAA,IAC/B,OAAO,MAAM;AAAA,MACZ,aAAa,SAAS,MAAM;AAAA;AAAA,EAE9B,EAAE;AAAA,EAEF,MAAM,oBAAoB,cACzB,OAAO,YAAoB;AAAA,IAC1B,IAAI;AAAA,MACH,MAAM,eAAe,wBAAwB,SAAS;AAAA,MACtD,MAAM,iBACL,gCAAgC,YAAY;AAAA,MAC7C,MAAM,eAAe,iBAClB,GAAG;AAAA;AAAA,EAAqB,YACxB;AAAA,MAEH,MAAM,YACL,OAAO,SAAS,IACb,OAAO,IAAI,CAAC,SAAS;AAAA,QACrB,MAAM,IAAI;AAAA,QACV,WAAW,IAAI;AAAA,MAChB,EAAE,IACD;AAAA,MAEJ,MAAM,WACL,UAAU,SAAS,IAChB,UAAU,IAAI,CAAC,OAAO;AAAA,QACtB,MAAM,EAAE;AAAA,QACR,MAAM,EAAE;AAAA,QACR,MAAM,EAAE;AAAA,QACR,WAAW,EAAE;AAAA,QACb,aAAa,EAAE;AAAA,MAChB,EAAE,IACD;AAAA,MAEJ,MAAM,YAAY,YAAY;AAAA,QAC7B,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO,SAAS;AAAA,QAChB,UAAU,YAAY;AAAA,QACtB,OAAO,SAAS;AAAA,QAChB,aAAa,eAAe;AAAA,MAC7B,CAAC;AAAA,MAED,WAAW;AAAA,MACV,OAAO,OAAO;AAAA,MACf,QAAQ,MAAM,2BAA2B,KAAK;AAAA;AAAA,KAGhD;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CACD;AAAA,EAEA,MAAM,qBAAqB,cAAY,MAAM;AAAA,IAC5C,gBAAgB,CAAC,SAAS,CAAC,IAAI;AAAA,KAC7B,CAAC,CAAC;AAAA,EAEL,MAAM,oBAAoB,cAAY,MAAM;AAAA,IAC3C,gBAAgB,KAAK;AAAA,IACrB,qBAAqB,IAAI;AAAA,KACvB,CAAC,CAAC;AAAA,EAEL,MAAM,gBAAgB,cACrB,OAAO,cAAsB;AAAA,IAC5B,IAAI,cAAc,UAAU;AAAA,MAC3B,qBAAqB,OAAO;AAAA,MAC5B,gBAAgB,IAAI;AAAA,IACrB,EAAO,SAAI,cAAc,UAAU;AAAA,MAClC,qBAAqB,OAAO;AAAA,MAC5B,gBAAgB,IAAI;AAAA,IACrB,EAAO,SAAI,cAAc,OAAO;AAAA,MAC/B,eAAe;AAAA,IAChB,EAAO,SAAI,cAAc,SAAS;AAAA,MACjC,MAAM,gBAAgB,WAAW,UAAU,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC;AAAA,MAClE,MAAM,iBACL,WAAW,WAAW,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC;AAAA,MAC9C,MAAM,cAAc,CAAC,GAAG,eAAe,GAAG,cAAc;AAAA,MACxD,IAAI,YAAY,SAAS,GAAG;AAAA,QAC3B,WAAW,OAAO,WAAW;AAAA,MAC9B;AAAA,IACD,EAAO,SAAI,cAAc,UAAU;AAAA,MAClC,0BAA0B,SAAS;AAAA,IACpC,EAAO,SAAI,cAAc,WAAW;AAAA,MACnC,kBAAkB,UAAU;AAAA,IAC7B,EAAO,SAAI,cAAc,UAAU;AAAA,MAClC,cAAc,OAAO,WAAW;AAAA,QAC/B,WAAW,MAAM;AAAA,UAChB,kBAAkB;AAAA;AAAA,MAEpB,CAAC;AAAA,IACF,EAAO,SAAI,cAAc,SAAS;AAAA,MACjC,MAAM,WAAU,MAAM,QAAQ,oBAAoB;AAAA,MAClD,IAAI;AAAA,QACH,MAAM,SAAS,MAAM,UAAU,aAAa,SAAS;AAAA,QACrD,IAAI,OAAO,QAAQ;AAAA,UAClB,MAAM,kBACL,OAAO,YAAY,mBAChB,mBACA,mBACH,EAAE,OAAO,QAAQ,MAAM,OAAO,IAAI,CACnC;AAAA,UACA,YAAY,kBAAkB;AAAA,YAC7B,UAAU,CAAC,gBAAgB,SAAS;AAAA,UACrC,CAAC;AAAA,QACF;AAAA,QACC,OAAO,OAAO;AAAA,QACf,MAAM,MACL,iBAAiB,QAAQ,MAAM,UAAU,iBAC1C;AAAA,gBACC;AAAA,QACD,cAAc,SAAS,EAAE,YAAY,QAAO;AAAA;AAAA,IAE9C,EAAO,SAAI,cAAc,QAAQ;AAAA,MAChC,MAAM,WAAU,MAAM,QAAQ,oBAAoB;AAAA,MAClD,IAAI;AAAA,QACH,MAAM,SAAS,MAAM,UAAU,YAAY,SAAS;AAAA,QACpD,IAAI,OAAO,QAAQ;AAAA,UAClB,MAAM,MACL,OAAO,cAAc,IAClB,UAAU,OAAO,6BACjB;AAAA,UACJ,MAAM,kBAAkB,KAAK;AAAA,YAC5B,OAAO;AAAA,YACP,MAAM,OAAO;AAAA,UACd,CAAC;AAAA,UACD,YAAY,kBAAkB;AAAA,YAC7B,UAAU,CAAC,gBAAgB,SAAS;AAAA,UACrC,CAAC;AAAA,QACF;AAAA,QACC,OAAO,OAAO;AAAA,QACf,MAAM,MACL,iBAAiB,QAAQ,MAAM,UAAU,gBAC1C;AAAA,gBACC;AAAA,QACD,cAAc,SAAS,EAAE,YAAY,QAAO;AAAA;AAAA,IAE9C;AAAA,KAED;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CACD;AAAA,EAEA,MAAM,oBAAoB,cACzB,OAAO,UAAkB;AAAA,IACxB,SAAS,KAAK;AAAA,IACd,IAAI;AAAA,MACH,MAAM,cAAc,YAAY,EAAE,OAAO,MAAM,CAAC;AAAA,MAC/C,OAAO,OAAO;AAAA,MACf,QAAQ,MAAM,2BAA2B,KAAK;AAAA;AAAA,KAGhD,CAAC,aAAa,CACf;AAAA,EAEA,MAAM,4BAA4B,cACjC,OAAO,aAAqB,aAAqB;AAAA,IAChD,YAAY,WAAW;AAAA,IACvB,SAAS,QAAQ;AAAA,IACjB,IAAI;AAAA,MACH,MAAM,cAAc,YAAY;AAAA,QAC/B,UAAU;AAAA,QACV,OAAO;AAAA,MACR,CAAC;AAAA,MACA,OAAO,OAAO;AAAA,MACf,QAAQ,MAAM,2BAA2B,KAAK;AAAA;AAAA,KAGhD,CAAC,aAAa,CACf;AAAA,EAEA,MAAM,uBAAuB,cAC5B,OAAO,gBAAwB;AAAA,IAC9B,YAAY,WAAW;AAAA,IACvB,IAAI,OAAO;AAAA,MACV,IAAI;AAAA,QACH,MAAM,cAAc,YAAY;AAAA,UAC/B,UAAU;AAAA,UACV;AAAA,QACD,CAAC;AAAA,QACA,OAAO,OAAO;AAAA,QACf,QAAQ,MAAM,8BAA8B,KAAK;AAAA;AAAA,IAEnD;AAAA,KAED,CAAC,OAAO,aAAa,CACtB;AAAA,EAEA,MAAM,oBAAoB,cACzB,OAAO,aAAqB;AAAA,IAC3B,SAAS,QAAQ;AAAA,IACjB,IAAI;AAAA,MACH,MAAM,cAAc,YAAY,EAAE,UAAU,OAAO,SAAS,CAAC;AAAA,MAC5D,OAAO,OAAO;AAAA,MACf,QAAQ,MAAM,2BAA2B,KAAK;AAAA;AAAA,KAGhD,CAAC,UAAU,aAAa,CACzB;AAAA,EAEA,MAAM,uBAAuB,cAC5B,OAAO,eAAwB;AAAA,IAC9B,MAAM,WAAW,aAAa,SAAS;AAAA,IACvC,SAAS,QAAQ;AAAA,IACjB,IAAI;AAAA,MACH,MAAM,cAAc,YAAY,EAAE,OAAO,SAAS,CAAC;AAAA,MAClD,OAAO,OAAO;AAAA,MACf,QAAQ,MAAM,2BAA2B,KAAK;AAAA;AAAA,KAGhD,CAAC,aAAa,CACf;AAAA,EAEA,uBACC;AAAA,cAmDE;AAAA,sBAlDD,MAAC,aAAD;AAAA,QACC,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,cAAc;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,eAAe;AAAA,QACf,kBAAkB;AAAA,QAClB,eAAe;AAAA,QACf,uBAAuB;AAAA,OACxB;AAAA,sBACA,MAAC,WAAD;AAAA,QACC,KAAK;AAAA,QAEL,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,UAAU,YAAY;AAAA,QACtB,eAAe;AAAA,QACf,kBAAkB;AAAA,QAClB,YAAY,UAAU;AAAA,QACtB,kBACC,2BACC,SAAQ,UAAU,iBAAiB;AAAA,QAErC;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAc;AAAA,QACd;AAAA,QACA,SAAS;AAAA,QACT,eAAe;AAAA,QACf,mBAAmB;AAAA,QACnB,WAAW;AAAA,QACX,cAAc;AAAA,QACd,UAAU;AAAA,QACV;AAAA,QACA,yBAAyB;AAAA,QACzB,kBAAkB,aAAa,SAAS,eAAe;AAAA,QACvD;AAAA,QACA,kBAAkB,MAAM;AAAA,UACvB,qBAAqB,OAAO;AAAA,UAC5B,gBAAgB,IAAI;AAAA;AAAA,QAErB;AAAA,QACA,QAAQ,SAAQ;AAAA,QAChB,eAAe;AAAA,SAhCV,QAiCN;AAAA;AAAA,GACC;AAAA,CAGL,CACD;;AoB3cA,sBAAS;AACT;;AAYO,SAAS,cAAc;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACuB;AAAA,EACvB,QAAQ,MAAM,SAAQ,WAAW,kBAAkB,UAAU;AAAA,EAC7D,QAAQ,MAAM,YAAY,WAAW,kBAAkB,UAAU,QAAQ;AAAA,EAEzE,QAAQ,IAAI,2BAA2B;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAC;AAAA,EAGD,YAAU,MAAM;AAAA,IACf,IAAI,WAAU,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO;AAAA,MAC5C,cAAc,QAAO,SAAS,KAAK;AAAA,MACnC,iBAAiB,QAAO,SAAS,QAAQ;AAAA,MACzC,cAAc,QAAO,SAAS,KAAK;AAAA,IACpC;AAAA,KACE;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAC;AAAA,EAGD,YAAU,MAAM;AAAA,IACf,IAAI,cAAc,WAAW,OAAO,SAAS,GAAG;AAAA,MAC/C,MAAM,qBAAqB,WAAW,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;AAAA,MACvE,IAAI,CAAC,oBAAoB;AAAA,QACxB,cAAc,WAAW,WAAW,WAAW,OAAO,GAAG,EAAE;AAAA,MAC5D;AAAA,IACD;AAAA,KACE,CAAC,YAAY,OAAO,aAAa,CAAC;AAAA,EAErC,IAAI,eAAe;AAAA,IAClB,uBACC,OAGE,OAHF;AAAA,MAAK,WAAU;AAAA,MAAf,UAGE;AAAA,wBAFD,MAAC,UAAD;AAAA,UAAU,WAAU;AAAA,SAA6C;AAAA,wBACjE,MAAmE,QAAnE;AAAA,UAAM,WAAU;AAAA,UAAhB;AAAA,SAAmE;AAAA;AAAA,KAClE;AAAA,EAEJ;AAAA,EAEA,IAAI,CAAC;AAAA,IAAQ,OAAO;AAAA,EAEpB,uBACC,MA2CE,OA3CF;AAAA,IAAK,WAAU;AAAA,IAAf,0BACC,MAyCE,OAzCF;AAAA,MAAK,WAAU;AAAA,MAAf,0BACC,OAuCE,OAvCF;AAAA,QAAK,WAAU;AAAA,QAAf,UAuCE;AAAA,0BAtCD,MAAC,UAAD;AAAA,YAAU,WAAU;AAAA,WAAgC;AAAA,0BAEpD,MAUE,UAVF;AAAA,YACC,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,YAC7C,WAAU;AAAA,YAHX,UAKE,QAAO,OAAO,IAAI,CAAC,sBACnB,MAEE,UAFF;AAAA,cAAgB,OAAO;AAAA,cAAvB,UACE;AAAA,eADW,CAEX,CACF;AAAA,WACA;AAAA,0BAEF,MAUE,UAVF;AAAA,YACC,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,iBAAiB,EAAE,OAAO,KAAK;AAAA,YAChD,WAAU;AAAA,YAHX,UAKE,QAAO,UAAU,IAAI,CAAC,sBACtB,MAEE,UAFF;AAAA,cAAgB,OAAO;AAAA,cAAvB,UACE;AAAA,eADW,CAEX,CACF;AAAA,WACA;AAAA,0BAEF,MAWE,UAXF;AAAA,YACC,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,YAC7C,UAAU,iBAAiB,CAAC;AAAA,YAC5B,WAAU;AAAA,YAJX,UAME,YAAY,OAAO,IAAI,CAAC,sBACxB,MAEE,UAFF;AAAA,cAAmB,OAAO,EAAE;AAAA,cAA5B,UACE,EAAE;AAAA,eADS,EAAE,EAEb,CACF;AAAA,WACA;AAAA;AAAA,OACD;AAAA,KACD;AAAA,GACD;AAAA;;AClHJ,uBAAS;AACT,qBAAS;;AASF,SAAS,UAAU,GAAG,WAAW,QAAQ,YAA6B;AAAA,EAC5E,OAAO,YAAY,iBAAiB,WAAS,KAAK;AAAA,EAElD,MAAM,aAAa,YAAY;AAAA,IAC9B,IAAI;AAAA,MAAY;AAAA,IAChB,cAAc,IAAI;AAAA,IAElB,IAAI;AAAA,MACH,MAAM,UAAU,aAAa,SAAS;AAAA,MACtC,SAAS;AAAA,MACR,OAAO,OAAO;AAAA,MACf,QAAQ,MAAM,2BAA2B,KAAK;AAAA,cAC7C;AAAA,MAED,WAAW,MAAM,cAAc,KAAK,GAAG,IAAI;AAAA;AAAA;AAAA,EAI7C,uBACC,OASE,UATF;AAAA,IACC,MAAK;AAAA,IACL,SAAS;AAAA,IACT,UAAU,YAAY;AAAA,IACtB,WAAU;AAAA,IACV,OAAM;AAAA,IALP,UASE;AAAA,sBAFD,MAAC,aAAD;AAAA,QAAY,WAAU;AAAA,OAAU;AAAA,sBAChC,MAAqE,QAArE;AAAA,QAAM,WAAU;AAAA,QAAhB,UAA+B,aAAa,gBAAgB;AAAA,OAAS;AAAA;AAAA,GACpE;AAAA;;ACtCJ,sBAAS,uBAAW,sBAAQ,uBAAU,mBAAS,uBAAM;AACrD;AACA,2BAAS;;;ACFT,iBAAS,mBAAM,2BAAU,0BAAa;AACtC;AAAA,cACC;AAAA,eACA;AAAA,UACA;AAAA,WACA;AAAA,YACA;AAAA;AAAA;;;ACND;AAAA,cACC;AAAA,aACA;AAAA,eACA;AAAA;AAAA,eAEA;AAAA,WACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACA;AAAA,gBACA;AAAA;AAAA,iBAEA;AAAA;AAAA,WAEA;AAAA;AAAA,UAEA;AAAA,cACA;AAAA;AAED;AAAA,cACC;AAAA,UACA;AAAA;AAKD;AACA;;;AC5BA,iBAAS,mBAAM;AACf,mBAAS,kBAAQ,aAAO;AACxB,kBAAS;AACT;AAAA,WACC;AAAA,iBACA;AAAA;;;ACLD,kBAAS;AACT;AAAA;AAAA;AAAA;AAAA;AAiBA,SAAS,mBAAmB,CAAC,MAAsB;AAAA,EAClD,MAAM,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY;AAAA,EAC/C,MAAM,UAAkC;AAAA,IACvC,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,GAAG;AAAA,IACH,KAAK;AAAA,IACL,GAAG;AAAA,IACH,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,QAAQ;AAAA,EACT;AAAA,EACA,OAAO,QAAQ,OAAO,OAAO;AAAA;AAG9B,SAAS,SAAS,CAAC,OAAwD;AAAA,EAC1E,MAAM,QAAQ,MAAM,MAAM;AAAA,CAAI;AAAA,EAC9B,MAAM,SAAqB,CAAC;AAAA,EAC5B,IAAI,aAAa;AAAA,EACjB,IAAI,aAAa;AAAA,EACjB,IAAI,SAAS;AAAA,EACb,IAAI,WAAW;AAAA,EAEf,WAAW,QAAQ,OAAO;AAAA,IAGzB,IACC,KAAK,WAAW,kBAAkB,KAClC,KAAK,WAAW,eAAe,GAC9B;AAAA,MACD,MAAM,QAAQ,KAAK,MAAM,kCAAkC;AAAA,MAC3D,IAAI;AAAA,QAAO,WAAW,MAAM;AAAA,MAC5B,SAAS;AAAA,MACT,aAAa;AAAA,MACb,aAAa;AAAA,IACd;AAAA,IACA,IAAI,KAAK,WAAW,KAAK,KAAK,KAAK,WAAW,kBAAkB,GAAG;AAAA,MAClE,MAAM,QACL,KAAK,MAAM,gBAAgB,KAAK,KAAK,MAAM,0BAA0B;AAAA,MACtE,IAAI;AAAA,QAAO,WAAW,MAAM;AAAA,IAC7B;AAAA,IAIA,MAAM,YAAY,KAAK,MAAM,yCAAyC;AAAA,IACtE,IAAI,WAAW;AAAA,MACd,aAAa,OAAO,SAAS,UAAU,IAAI,EAAE;AAAA,MAC7C,aAAa,OAAO,SAAS,UAAU,IAAI,EAAE;AAAA,MAC7C,SAAS;AAAA,MACT,OAAO,KAAK;AAAA,QACX,SAAS;AAAA,QACT,aAAa;AAAA,QACb,MAAM;AAAA,MACP,CAAC;AAAA,MACD;AAAA,IACD;AAAA,IAGA,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,KAAK,MAAM,UAAU,GAAG;AAAA,MACrD,SAAS;AAAA,MACT,OAAO,KAAK;AAAA,QACX,SAAS;AAAA,QACT,aAAa;AAAA,QACb,MAAM;AAAA,MACP,CAAC;AAAA,MACD;AAAA,IACD;AAAA,IAGA,IACC,KAAK,WAAW,KAAK,KACrB,KAAK,WAAW,OAAO,KACvB,KAAK,WAAW,QAAQ,KACxB,KAAK,WAAW,KAAK,KACrB,KAAK,WAAW,KAAK,GACpB;AAAA,MACD,OAAO,KAAK;AAAA,QACX,SAAS;AAAA,QACT,aAAa;AAAA,QACb,MAAM;AAAA,MACP,CAAC;AAAA,MACD;AAAA,IACD;AAAA,IAGA,IAAI,QAAQ;AAAA,MACX,IAAI,KAAK,WAAW,GAAG,GAAG;AAAA,QACzB,OAAO,KAAK;AAAA,UACX,SAAS;AAAA,UACT,aAAa,KAAK,MAAM,CAAC;AAAA,UACzB,MAAM;AAAA,UACN,YAAY;AAAA,QACb,CAAC;AAAA,MACF,EAAO,SAAI,KAAK,WAAW,GAAG,GAAG;AAAA,QAChC,OAAO,KAAK;AAAA,UACX,SAAS;AAAA,UACT,aAAa,KAAK,MAAM,CAAC;AAAA,UACzB,MAAM;AAAA,UACN,YAAY;AAAA,QACb,CAAC;AAAA,MACF,EAAO,SAAI,KAAK,WAAW,GAAG,KAAK,SAAS,IAAI;AAAA,QAC/C,OAAO,KAAK;AAAA,UACX,SAAS;AAAA,UACT,aAAa,KAAK,WAAW,GAAG,IAAI,KAAK,MAAM,CAAC,IAAI;AAAA,UACpD,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,YAAY;AAAA,QACb,CAAC;AAAA,MACF,EAAO;AAAA,QAEN,OAAO,KAAK;AAAA,UACX,SAAS;AAAA,UACT,aAAa;AAAA,UACb,MAAM;AAAA,QACP,CAAC;AAAA;AAAA,IAEH,EAAO;AAAA,MAEN,OAAO,KAAK;AAAA,QACX,SAAS;AAAA,QACT,aAAa;AAAA,QACb,MAAM;AAAA,MACP,CAAC;AAAA;AAAA,EAEH;AAAA,EAEA,OAAO,EAAE,OAAO,QAAQ,SAAS;AAAA;AAG3B,SAAS,QAAQ,GAAG,SAAwB;AAAA,EAClD,QAAQ,OAAO,WAAW,aAAa,UAAU,KAAK;AAAA,EACtD,MAAM,WAAW,oBAAoB,QAAQ;AAAA,EAC7C,MAAM,cAAc,UAAU,gBAAgB,UAAU,SAAS,MAAM,IACpE,cACA;AAAA,EAEH,uBACC,MA6GE,OA7GF;AAAA,IAAK,WAAU;AAAA,IAAf,0BACC,MA2GE,OA3GF;AAAA,MAAK,WAAU;AAAA,MAAf,UACE,UAAU,IAAI,CAAC,MAAM,MAAM;AAAA,QAC3B,MAAM,MAAM,QAAQ,KAAK,KAAK,QAAQ,MAAM,GAAG,EAAE;AAAA,QAGjD,IAAI,KAAK,SAAS,UAAU,KAAK,SAAS,UAAU;AAAA,UACnD,uBACC,MASE,OATF;AAAA,YAEC,WAAW,6CACV,KAAK,SAAS,WACX,yCACA;AAAA,YALL,UAQE,KAAK;AAAA,aAPD,GAQJ;AAAA,QAEJ;AAAA,QAGA,IAAI,YAAY;AAAA,QAChB,IAAI,UAAU;AAAA,QACd,QAAQ,KAAK;AAAA,eACP;AAAA,YACJ,YAAY;AAAA,YACZ,UAAU;AAAA,YACV;AAAA,eACI;AAAA,YACJ,YAAY;AAAA,YACZ,UAAU;AAAA,YACV;AAAA;AAAA,YAEA,YAAY;AAAA;AAAA,QAId,IAAI,kBAAmC,KAAK;AAAA,QAC5C,IAAI,KAAK,YAAY,KAAK,KAAK,aAAa,QAAQ;AAAA,UACnD,kCACC,MAoBE,mBApBF;AAAA,YACC;AAAA,YACA,OAAO;AAAA,YACP,aAAa;AAAA,cACZ,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,SAAS;AAAA,cACT,UAAU;AAAA,cACV,YAAY;AAAA,YACb;AAAA,YACA,cAAc;AAAA,cACb,OAAO;AAAA,gBACN,YAAY;AAAA,gBACZ,YAAY;AAAA,cACb;AAAA,YACD;AAAA,YACA,QAAO;AAAA,YAjBR,UAmBE,KAAK;AAAA,WACL;AAAA,UAIH,IAAI,KAAK,SAAS,OAAO;AAAA,YACxB,kCACC;AAAA,wBAGE;AAAA,gCAFD,MAAiC,QAAjC;AAAA,kBAAM,WAAU;AAAA,kBAAhB;AAAA,iBAAiC;AAAA,gBAChC;AAAA;AAAA,aACA;AAAA,UAEJ,EAAO,SAAI,KAAK,SAAS,UAAU;AAAA,YAClC,kCACC;AAAA,wBAGE;AAAA,gCAFD,MAAiC,QAAjC;AAAA,kBAAM,WAAU;AAAA,kBAAhB;AAAA,iBAAiC;AAAA,gBAChC;AAAA;AAAA,aACA;AAAA,UAEJ,EAAO,SAAI,KAAK,SAAS,WAAW;AAAA,YACnC,kCACC;AAAA,wBAGE;AAAA,gCAFD,MAAiC,QAAjC;AAAA,kBAAM,WAAU;AAAA,kBAAhB;AAAA,iBAAiC;AAAA,gBAChC;AAAA;AAAA,aACA;AAAA,UAEJ;AAAA,QACD;AAAA,QAEA,uBACC,OAeE,OAfF;AAAA,UAAe,WAAW,QAAQ;AAAA,UAAlC,UAeE;AAAA,4BAbD,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf,UACE,KAAK,cAAc;AAAA,aACnB;AAAA,4BAEF,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf,UACE,KAAK,cAAc;AAAA,aACnB;AAAA,4BAEF,MAIE,OAJF;AAAA,cACC,WAAW,4DAA4D;AAAA,cADxE,UAGE;AAAA,aACA;AAAA;AAAA,WAdO,GAeR;AAAA,OAEH;AAAA,KACA;AAAA,GACD;AAAA;;;;AD3QJ,SAAS,oBAAmB,CAAC,MAAsB;AAAA,EAClD,MAAM,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY;AAAA,EAC/C,MAAM,UAAkC;AAAA,IACvC,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,GAAG;AAAA,IACH,KAAK;AAAA,IACL,GAAG;AAAA,IACH,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,QAAQ;AAAA,EACT;AAAA,EACA,OAAO,QAAQ,OAAO,OAAO;AAAA;AAG9B,SAAS,mBAAmB,CAC3B,UACA,MACwC;AAAA,EACxC,IAAI,CAAC;AAAA,IAAM,OAAO;AAAA,EAClB,MAAM,SAAmC;AAAA,IACxC,MAAM,CAAC,MAAM;AAAA,IACb,OAAO,CAAC,MAAM;AAAA,IACd,MAAM,CAAC,MAAM;AAAA,IACb,aAAa,CAAC,MAAM;AAAA,IACpB,MAAM,CAAC,SAAS;AAAA,IAChB,MAAM,CAAC,SAAS,SAAS;AAAA,IACzB,SAAS,CAAC,SAAS,SAAS;AAAA,IAC5B,MAAM,CAAC,OAAO,SAAS;AAAA,IACvB,UAAU,CAAC,SAAS;AAAA,IACpB,YAAY,CAAC,SAAS;AAAA,IACtB,UAAU,CAAC,MAAM;AAAA,IACjB,MAAM,CAAC,MAAM;AAAA,IACb,IAAI,CAAC,MAAM;AAAA,IACX,YAAY,CAAC,SAAS,KAAK;AAAA,IAC3B,OAAO,CAAC,MAAM;AAAA,EACf;AAAA,EACA,MAAM,OAAO,OAAO;AAAA,EACpB,IAAI,CAAC,MAAM;AAAA,IACV,YAAY,KAAK,UAAU,OAAO,QAAQ,IAAI,GAAG;AAAA,MAChD,IAAI,OAAO,UAAU,YAAY,MAAM,SAAS,KAAK,MAAM,SAAS,KAAK;AAAA,QACxE,OAAO,EAAE,KAAK,MAAM;AAAA,MACrB;AAAA,IACD;AAAA,IACA,OAAO;AAAA,EACR;AAAA,EACA,WAAW,OAAO,MAAM;AAAA,IACvB,MAAM,QAAQ,KAAK;AAAA,IACnB,IAAI,OAAO,UAAU,YAAY,MAAM,SAAS,GAAG;AAAA,MAClD,OAAO,EAAE,KAAK,MAAM;AAAA,IACrB;AAAA,EACD;AAAA,EACA,OAAO;AAAA;AAGR,SAAS,iBAAiB,CACzB,MACgB;AAAA,EAChB,IAAI,CAAC;AAAA,IAAM,OAAO;AAAA,EAClB,MAAM,MAAM,KAAK,OAAO,KAAK;AAAA,EAC7B,IAAI,OAAO,QAAQ,YAAY,IAAI,SAAS,GAAG;AAAA,IAC9C,OAAO;AAAA,EACR;AAAA,EACA,OAAO;AAAA;AAGD,IAAM,mBAAmB,MAAK,SAAS,iBAAgB;AAAA,EAC7D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACyB;AAAA,EACzB,OAAO,cAAc,mBAAmB,WAAS,KAAK;AAAA,EAEtD,MAAM,YAAY,SAAS,QAAQ,MAAM,GAAG;AAAA,EAC5C,MAAM,UAAU,oBAAoB,UAAU,IAAI;AAAA,EAClD,MAAM,UAAU,aAAa,SAAS,kBAAkB,IAAI,IAAI;AAAA,EAChE,MAAM,iBAAiB,WAAW,SAAS;AAAA,EAE3C,MAAM,WAAW,OAAO,MAAM,SAAS,WAAW,KAAK,OAAO;AAAA,EAC9D,MAAM,WAAW,qBAAoB,QAAQ;AAAA,EAC7C,MAAM,cAAc,UAAU,gBAAgB,UAAU,SAAS,MAAM,IACpE,eACA;AAAA,EAEH,MAAM,gBAAgB,MAAM;AAAA,IAC3B,gBAAgB,IAAI;AAAA,IACpB,QAAQ,QAAQ,UAAU,gBAAgB,MAAM,CAAC,EAAE,MAAM,MAAM;AAAA,MAC9D,gBAAgB,KAAK;AAAA,KACrB;AAAA;AAAA,EAGF,MAAM,eAAe,MAAM;AAAA,IAC1B,gBAAgB,IAAI;AAAA,IACpB,QAAQ,QAAQ,SAAS,gBAAgB,MAAM,CAAC,EAAE,MAAM,MAAM;AAAA,MAC7D,gBAAgB,KAAK;AAAA,KACrB;AAAA;AAAA,EAGF,MAAM,gBAAgB,MAAM;AAAA,IAC3B,IAAI,aAAa,iBAAiB,MAAM,OAAO;AAAA,MAC9C,uBACC,MAEE,OAFF;AAAA,QAAK,WAAU;AAAA,QAAf,0BACC,MAAC,UAAD;AAAA,UAAU,OAAO,OAAO,KAAK,KAAK;AAAA,SAAG;AAAA,OACpC;AAAA,IAEJ;AAAA,IAEA,IAAI,aAAa,WAAW,MAAM,SAAS;AAAA,MAC1C,MAAM,UAAU,OAAO,KAAK,OAAO;AAAA,MACnC,uBACC,MAyBE,OAzBF;AAAA,QAAK,WAAU;AAAA,QAAf,0BACC,MAuBE,OAvBF;AAAA,UAAK,WAAU;AAAA,UAAf,0BACC,MAqBE,OArBF;AAAA,YAAK,WAAU;AAAA,YAAf,0BACC,MAmBE,oBAnBF;AAAA,cACC;AAAA,cACA,OAAO;AAAA,cACP,aAAa;AAAA,gBACZ,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,UAAU;AAAA,cACX;AAAA,cACA,iBAAe;AAAA,cACf,iBAAiB;AAAA,gBAChB,UAAU;AAAA,gBACV,cAAc;AAAA,gBACd,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,YAAY;AAAA,cACb;AAAA,cAhBD,UAkBE;AAAA,aACA;AAAA,WACD;AAAA,SACD;AAAA,OACD;AAAA,IAEJ;AAAA,IAEA,IAAI,aAAa,UAAU,MAAM,KAAK;AAAA,MACrC,MAAM,MAAM,OAAO,KAAK,GAAG;AAAA,MAC3B,uBACC,MAiBE,OAjBF;AAAA,QAAK,WAAU;AAAA,QAAf,0BACC,MAeE,OAfF;AAAA,UAAK,WAAU;AAAA,UAAf,0BACC,MAaE,OAbF;AAAA,YAAK,WAAU;AAAA,YAAf,0BACC,MAWE,oBAXF;AAAA,cACC,UAAS;AAAA,cACT,OAAO;AAAA,cACP,aAAa;AAAA,gBACZ,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,UAAU;AAAA,cACX;AAAA,cARD,UAUE;AAAA,aACA;AAAA,WACD;AAAA,SACD;AAAA,OACD;AAAA,IAEJ;AAAA,IAEA,OAAO;AAAA;AAAA,EAGR,uBACC,OA0CE,OA1CF;AAAA,IAAK,WAAU;AAAA,IAAf,UA0CE;AAAA,sBAzCD,OAWE,OAXF;AAAA,QAAK,WAAU;AAAA,QAAf,UAWE;AAAA,0BAVD,MAAC,SAAD;AAAA,YAAQ,WAAU;AAAA,WAAuC;AAAA,0BACzD,MAAmE,QAAnE;AAAA,YAAM,WAAU;AAAA,YAAhB,UAAuD;AAAA,WAAY;AAAA,UAClE,kBAAkB,aAAa,0BAC/B,MAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UACE;AAAA,WACA;AAAA,0BAEH,MAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB;AAAA,WAEE;AAAA;AAAA,OACD;AAAA,MACD,cAAc;AAAA,sBACf,OA2BE,OA3BF;AAAA,QAAK,WAAU;AAAA,QAAf,UA2BE;AAAA,0BA1BD,OAYE,UAZF;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,UAAU;AAAA,YACV,OAAM;AAAA,YACN,WAAU;AAAA,YALX,UAYE;AAAA,8BALD,MAAC,IAAD;AAAA,gBAAG,WAAU;AAAA,eAAU;AAAA,cAPxB;AAAA,8BASC,MAEE,OAFF;AAAA,gBAAK,WAAU;AAAA,gBAAf;AAAA,eAEE;AAAA;AAAA,WACD;AAAA,0BACF,OAYE,UAZF;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,UAAU;AAAA,YACV,OAAM;AAAA,YACN,WAAU;AAAA,YALX,UAYE;AAAA,8BALD,MAAC,QAAD;AAAA,gBAAO,WAAU;AAAA,eAAU;AAAA,cAC1B,eAAe,iBAAiB;AAAA,cAChC,CAAC,gCACD,MAAgD,OAAhD;AAAA,gBAAK,WAAU;AAAA,gBAAf;AAAA,eAAgD;AAAA;AAAA,WAEhD;AAAA;AAAA,OACD;AAAA;AAAA,GACD;AAAA,CAEH;;;AE5PD,qBAAS;;;ACAT,sCAAuB;AACvB,kBAAS;AACT;AAAA,WACC;AAAA,iBACA;AAAA;;;ACKM,SAAS,cAAc,CAAC,IAAgC;AAAA,EAC9D,IAAI,CAAC;AAAA,IAAI,OAAO;AAAA,EAChB,IAAI,MAAM,MAAM;AAAA,IACf,OAAO,IAAI,KAAK,MAAM,QAAQ,CAAC;AAAA,EAChC;AAAA,EACA,OAAO,GAAG;AAAA;AAOJ,SAAS,WAAW,CAAC,QAA0B;AAAA,EACrD,IAAI,CAAC,UAAU,OAAO,WAAW;AAAA,IAAU,OAAO;AAAA,EAClD,MAAM,MAAM;AAAA,EACZ,OAAO,IAAI,OAAO,SAAS,WAAW,OAAO,IAAI,YAAY;AAAA;AAOvD,SAAS,eAAe,CAAC,QAAgC;AAAA,EAC/D,IAAI,CAAC,UAAU,OAAO,WAAW;AAAA,IAAU,OAAO;AAAA,EAElD,MAAM,MAAM;AAAA,EACZ,MAAM,OAAO,CAAC,SAAS,UAAU,WAAW,UAAU,WAAW,QAAQ;AAAA,EACzE,WAAW,OAAO,MAAM;AAAA,IACvB,MAAM,QAAQ,IAAI;AAAA,IAClB,IAAI,OAAO,UAAU,UAAU;AAAA,MAC9B,MAAM,UAAU,MAAM,KAAK;AAAA,MAC3B,IAAI,QAAQ;AAAA,QAAQ,OAAO;AAAA,IAC5B;AAAA,EACD;AAAA,EACA,OAAO;AAAA;;;AC3CR,wBAAS;AAAA;AAYF,SAAS,gBAAgB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,YAAY;AAAA,GACa;AAAA,EACzB,uBACC,MAwBE,OAxBF;AAAA,IAAK,WAAU;AAAA,IAAf,0BACC,OAsBE,OAtBF;AAAA,MAAK,WAAU;AAAA,MAAf,UAsBE;AAAA,wBArBD,MAAC,cAAD;AAAA,UAAa,WAAU;AAAA,SAA8D;AAAA,wBACrF,OAmBE,OAnBF;AAAA,UAAK,WAAU;AAAA,UAAf,UAmBE;AAAA,4BAlBD,OAOE,OAPF;AAAA,wBAOE;AAAA,gCAND,MAEE,OAFF;AAAA,kBAAK,WAAU;AAAA,kBAAf;AAAA,iBAEE;AAAA,gCACF,MAEE,OAFF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UACE;AAAA,iBACA;AAAA;AAAA,aACD;AAAA,YACD,aAAa,yBACb,OAOE,WAPF;AAAA,cAAS,WAAU;AAAA,cAAnB,UAOE;AAAA,gCAND,MAEE,WAFF;AAAA,kBAAS,WAAU;AAAA,kBAAnB;AAAA,iBAEE;AAAA,gCACF,MAEE,OAFF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UACE;AAAA,iBACA;AAAA;AAAA,aACD;AAAA;AAAA,SAEF;AAAA;AAAA,KACD;AAAA,GACD;AAAA;;;;AFhCJ,SAAS,oBAAmB,CAAC,MAAsB;AAAA,EAClD,MAAM,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY;AAAA,EAC/C,MAAM,UAAkC;AAAA,IACvC,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,GAAG;AAAA,IACH,KAAK;AAAA,IACL,GAAG;AAAA,IACH,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,KAAK;AAAA,EACN;AAAA,EACA,OAAO,QAAQ,OAAO,OAAO;AAAA;AAG9B,SAAS,cAAc,CAAC,WAAmD;AAAA,EAC1E,IAAI,CAAC;AAAA,IAAW;AAAA,EAChB,MAAM,QAAQ,UAAU,MAAM,cAAc;AAAA,EAC5C,IAAI,OAAO;AAAA,IACV,OAAO,OAAO,SAAS,MAAM,IAAI,EAAE;AAAA,EACpC;AAAA,EACA;AAAA;AAGM,SAAS,YAAY;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACiB;AAAA,EACjB,MAAM,SAAS,YAAY,UAAU,CAAC;AAAA,EACtC,MAAM,OAAO,YAAY,QAAQ,CAAC;AAAA,EAElC,MAAM,eACL,OAAO,WAAW,YAAY,QAAQ,UAAU,OAAO,OAAO;AAAA,EAC/D,MAAM,eACL,gBAAgB,WAAW,UAAU,OAAO,OAAO,UAAU,WAC1D,OAAO,QACP;AAAA,EACJ,MAAM,aACL,gBAAgB,WAAW,UAAU,OAAO,OAAO,UAAU,WAC1D,OAAO,QACP;AAAA,EAEJ,MAAM,OAAO,OAAO,OAAO,QAAQ,KAAK,QAAQ,EAAE;AAAA,EAClD,MAAM,UAAU,OAAO,OAAO,WAAW,EAAE;AAAA,EAC3C,MAAM,YAAY,OAAO;AAAA,EACzB,MAAM,QAAQ,QAAQ,MAAM;AAAA,CAAI;AAAA,EAChC,MAAM,UAAU,eAAe,cAAc;AAAA,EAC7C,MAAM,WAAW,qBAAoB,IAAI;AAAA,EACzC,MAAM,cAAc,UAAU,gBAAgB,UAAU,SAAS,MAAM,IACpE,eACA;AAAA,EAEH,MAAM,qBAAqB,eAAe,SAAS;AAAA,EAEnD,MAAM,cAAc,YACjB,GAAG,QAAQ,UAAU,QAAQ,KAAK,EAAE,MACpC;AAAA,EAEH,MAAM,YAAY,QAAQ,SAAS,KAAK;AAAA,EAExC,uBACC,OA6EE,OA7EF;AAAA,IAAK,WAAU;AAAA,IAAf,UA6EE;AAAA,sBA5ED,OAgDE,UAhDF;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM,aAAa,SAAS;AAAA,QACrC,WAAW,4DACV,eACG,8EACA,YACC,kFACA;AAAA,QARN,UAgDE;AAAA,UArCA,YACA,6BACC,MAAC,cAAD;AAAA,YAAc,WAAU;AAAA,WAAuD,oBAE/E,MAAC,cAAD;AAAA,YAAc,WAAU;AAAA,WAA6C,oBAGtE,MAAC,OAAD;AAAA,YAAK,WAAU;AAAA,WAAoB;AAAA,UAEnC,gCACA,MAAC,cAAD;AAAA,YAAa,WAAU;AAAA,WAAuD;AAAA,0BAE/E,OAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UAEE;AAAA,cAFF;AAAA,cACM,eAAe,WAAW;AAAA;AAAA,WAC9B;AAAA,UACD,CAAC,2BACD;AAAA,sBASE;AAAA,8BARD,MAA2D,QAA3D;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAA2D;AAAA,8BAC3D,MAME,QANF;AAAA,gBACC,WAAU;AAAA,gBACV,KAAI;AAAA,gBACJ,OAAO;AAAA,gBAHR,UAKE,IAAS;AAAA,eACT;AAAA;AAAA,WACD;AAAA,UAEF,CAAC,gBAAgB,MAAM,SAAS,KAAK,CAAC,2BACtC,OAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UAEE;AAAA,cAFF;AAAA,cACG,MAAM;AAAA,cADT;AAAA,cAC0B;AAAA;AAAA,WACxB;AAAA,UAEF,gBAAgB,CAAC,2BACjB,OAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UAEE;AAAA,cAFF;AAAA,cACG;AAAA;AAAA,WACD;AAAA;AAAA,OAEF;AAAA,MACD,cAAc,gBAAgB,gCAC9B,MAAC,kBAAD;AAAA,QAAkB,OAAO;AAAA,QAAc,OAAO;AAAA,QAAY,WAAS;AAAA,OAAC;AAAA,MAEpE,cAAc,CAAC,gBAAgB,2BAC/B,MAqBE,OArBF;AAAA,QAAK,WAAU;AAAA,QAAf,0BACC,MAmBE,OAnBF;AAAA,UAAK,WAAU;AAAA,UAAf,0BACC,MAiBE,oBAjBF;AAAA,YACC;AAAA,YACA,OAAO;AAAA,YACP,aAAa;AAAA,cACZ,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,UAAU;AAAA,YACX;AAAA,YACA,iBAAe;AAAA,YACf;AAAA,YACA,WAAS;AAAA,YACT,eAAa;AAAA,YAdd,UAgBE;AAAA,WACA;AAAA,SACD;AAAA,OACD;AAAA;AAAA,GAEF;AAAA;;;AG3KJ,yBAAS,8BAAc;;AAMhB,SAAS,aAAa;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACiB;AAAA,EACjB,MAAM,SAAS,YAAY,UAAU,CAAC;AAAA,EACtC,MAAM,OAAO,YAAY,QAAQ,CAAC;AAAA,EAClC,MAAM,WAAW,YAAY;AAAA,EAE7B,MAAM,eACL,OAAO,WAAW,YAAY,QAAQ,UAAU,OAAO,OAAO;AAAA,EAC/D,MAAM,eACL,gBAAgB,WAAW,UAAU,OAAO,OAAO,UAAU,WAC1D,OAAO,QACP;AAAA,EACJ,MAAM,aACL,gBAAgB,WAAW,UAAU,OAAO,OAAO,UAAU,WAC1D,OAAO,QACP;AAAA,EAEJ,MAAM,OAAO,OAAO,OAAO,QAAQ,KAAK,QAAQ,EAAE;AAAA,EAClD,MAAM,QAAQ,OAAO,OAAO,SAAS,CAAC;AAAA,EACtC,MAAM,QAAQ,UAAU,QAAQ,OAAO,SAAS,KAAK,IAAI;AAAA,EACzD,MAAM,UAAU,eAAe,cAAc;AAAA,EAE7C,MAAM,YAAY,MAAM,SAAS,KAAK;AAAA,EAEtC,uBACC,OA0DE,OA1DF;AAAA,IAAK,WAAU;AAAA,IAAf,UA0DE;AAAA,sBAzDD,OAgDE,UAhDF;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM,aAAa,SAAS;AAAA,QACrC,WAAW,4DACV,eACG,8EACA,YACC,8FACA;AAAA,QARN,UAgDE;AAAA,UArCA,YACA,6BACC,MAAC,eAAD;AAAA,YAAc,WAAU;AAAA,WAAuD,oBAE/E,MAAC,eAAD;AAAA,YAAc,WAAU;AAAA,WAA6C,oBAGtE,MAAC,OAAD;AAAA,YAAK,WAAU;AAAA,WAAoB;AAAA,UAEnC,gCACA,MAAC,cAAD;AAAA,YAAa,WAAU;AAAA,WAAuD;AAAA,0BAE/E,OAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UAEE;AAAA,cAFF;AAAA,cACO,eAAe,WAAW;AAAA;AAAA,WAC/B;AAAA,UACD,CAAC,2BACD;AAAA,sBASE;AAAA,8BARD,MAA2D,QAA3D;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAA2D;AAAA,8BAC3D,MAME,QANF;AAAA,gBACC,WAAU;AAAA,gBACV,KAAI;AAAA,gBACJ,OAAO;AAAA,gBAHR,UAKE,IAAS;AAAA,eACT;AAAA;AAAA,WACD;AAAA,UAEF,CAAC,gBAAgB,QAAQ,KAAK,CAAC,2BAC/B,OAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UAEE;AAAA,cAFF;AAAA,cACG;AAAA,cADH;AAAA,cACmB;AAAA;AAAA,WACjB;AAAA,UAEF,gBAAgB,CAAC,2BACjB,OAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UAEE;AAAA,cAFF;AAAA,cACG;AAAA;AAAA,WACD;AAAA;AAAA,OAEF;AAAA,MACD,cAAc,gBAAgB,gCAC9B,MAAC,kBAAD;AAAA,QAAkB,OAAO;AAAA,QAAc,OAAO;AAAA,QAAY,WAAS;AAAA,OAAC;AAAA,MAEpE,cAAc,CAAC,gBAAgB,yBAC/B,MAEE,OAFF;AAAA,QAAK,WAAU;AAAA,QAAf,0BACC,MAAC,UAAD;AAAA,UAAU;AAAA,SAAc;AAAA,OACvB;AAAA;AAAA,GAEF;AAAA;;;AC9FJ,yBAAS,8BAAc;;AAMhB,SAAS,YAAY;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACiB;AAAA,EACjB,MAAM,OAAQ,YAAY,QAAQ,CAAC;AAAA,EACnC,MAAM,SAAU,YAAY,UAAU,CAAC;AAAA,EACvC,MAAM,WAAW,YAAY;AAAA,EAC7B,MAAM,eACL,OAAO,WAAW,YAAY,QAAQ,UAAU,OAAO,OAAO;AAAA,EAC/D,MAAM,eACL,gBAAgB,WAAW,UAAU,OAAO,OAAO,UAAU,WAC1D,OAAO,QACP;AAAA,EACJ,MAAM,aACL,gBAAgB,WAAW,UAAU,OAAO,OAAO,UAAU,WAC1D,OAAO,QACP;AAAA,EAEJ,MAAM,OAAO,OAAO,OAAO,QAAQ,KAAK,QAAQ,EAAE;AAAA,EAClD,MAAM,aAAa,OAAO,OAAO,cAAc,CAAC;AAAA,EAChD,MAAM,QAAQ,UAAU,QAAQ,OAAO,SAAS,KAAK,IAAI;AAAA,EACzD,MAAM,UAAU,eAAe,cAAc;AAAA,EAE7C,MAAM,YAAY,MAAM,SAAS,KAAK;AAAA,EAEtC,uBACC,OAsDE,OAtDF;AAAA,IAAK,WAAU;AAAA,IAAf,UAsDE;AAAA,sBArDD,OA4CE,UA5CF;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM,aAAa,SAAS;AAAA,QACrC,WAAW,4DACV,eACG,8EACA,YACC,0FACA;AAAA,QARN,UA4CE;AAAA,UAjCA,YACA,6BACC,MAAC,eAAD;AAAA,YAAc,WAAU;AAAA,WAAuD,oBAE/E,MAAC,eAAD;AAAA,YAAc,WAAU;AAAA,WAA6C,oBAGtE,MAAC,OAAD;AAAA,YAAK,WAAU;AAAA,WAAoB;AAAA,UAEnC,gCACA,MAAC,cAAD;AAAA,YAAa,WAAU;AAAA,WAAuD;AAAA,0BAE/E,OAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UAEE;AAAA,cAFF;AAAA,cACM,eAAe,WAAW;AAAA;AAAA,WAC9B;AAAA,0BACF,MAA2D,QAA3D;AAAA,YAAM,WAAU;AAAA,YAAhB;AAAA,WAA2D;AAAA,0BAC3D,MAME,QANF;AAAA,YACC,WAAU;AAAA,YACV,KAAI;AAAA,YACJ,OAAO;AAAA,YAHR,UAKE,IAAS;AAAA,WACT;AAAA,UACD,CAAC,gBAAgB,aAAa,qBAC9B,OAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UAEE;AAAA,cAFF;AAAA,cACG;AAAA,cADH;AAAA,cACsB;AAAA;AAAA,WACpB;AAAA,UAEF,gCACA,OAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UAEE;AAAA,cAFF;AAAA,cACG;AAAA;AAAA,WACD;AAAA;AAAA,OAEF;AAAA,MACD,cAAc,gBAAgB,gCAC9B,MAAC,kBAAD;AAAA,QAAkB,OAAO;AAAA,QAAc,OAAO;AAAA,QAAY,WAAS;AAAA,OAAC;AAAA,MAEpE,cAAc,CAAC,gBAAgB,yBAC/B,MAEE,OAFF;AAAA,QAAK,WAAU;AAAA,QAAf,0BACC,MAAC,UAAD;AAAA,UAAU;AAAA,SAAc;AAAA,OACvB;AAAA;AAAA,GAEF;AAAA;;;ACxFJ,qBAAS;AACT,kBAAS;AACT;AAAA,WACC;AAAA,iBACA;AAAA;;;ACJD,qBAAS;AACT,wBAAe;AAAA;AAQf,IAAM,cAAc;AAAA,EACnB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACL;AAEA,IAAM,iBAAiB;AAAA,EACtB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACL;AAEO,SAAS,UAAU;AAAA,EACzB;AAAA,EACA,YAAY;AAAA,EACZ,OAAO;AAAA,GACY;AAAA,EACnB,OAAO,QAAQ,aAAa,WAAS,KAAK;AAAA,EAE1C,MAAM,aAAa,OAAO,MAAwB;AAAA,IACjD,EAAE,gBAAgB;AAAA,IAClB,IAAI;AAAA,MACH,MAAM,UAAU,UAAU,UAAU,IAAI;AAAA,MACxC,UAAU,IAAI;AAAA,MACd,WAAW,MAAM,UAAU,KAAK,GAAG,IAAI;AAAA,MACtC,MAAM;AAAA;AAAA,EAGT,uBACC,MAWE,UAXF;AAAA,IACC,MAAK;AAAA,IACL,SAAS;AAAA,IACT,WAAW,GAAG,eAAe,iGAAiG;AAAA,IAC9H,OAAM;AAAA,IAJP,UAME,yBACA,MAAC,QAAD;AAAA,MAAO,WAAW,GAAG,YAAY;AAAA,KAA0B,oBAE3D,MAAC,MAAD;AAAA,MAAM,WAAW,YAAY;AAAA,KAAO;AAAA,GAEpC;AAAA;;;ACpCG,SAAS,cAAc;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,YAAY;AAAA,EACZ;AAAA,GACuB;AAAA,EACvB,MAAM,UAAU,YAAY;AAAA,EAE5B,uBACC,OAsBE,OAtBF;AAAA,IACC,WAAW,8DAA8D,aACxE,UAAU,sBAAsB;AAAA,IAFlC,UAsBE;AAAA,sBAjBD,OAeE,OAfF;AAAA,QACC,WAAW,mGACV,UACG,iDACA;AAAA,QAJL,UAeE;AAAA,0BARD,OAME,OANF;AAAA,YAAK,WAAU;AAAA,YAAf,UAME;AAAA,cALA;AAAA,8BACD,MAAe,QAAf;AAAA,0BAAO;AAAA,eAAQ;AAAA,cACd,4BACA,MAAuD,QAAvD;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UAA4C;AAAA,eAAW;AAAA;AAAA,WAEvD;AAAA,UACD,4BAAY,MAAC,YAAD;AAAA,YAAY,MAAM;AAAA,WAAU;AAAA;AAAA,OACxC;AAAA,sBACF,MAAkD,OAAlD;AAAA,QAAK,WAAU;AAAA,QAAf;AAAA,OAAkD;AAAA;AAAA,GACjD;AAAA;;AC/CJ,qBAAS;AACT,sBAAS,iBAAW;AAAA;AAWb,SAAS,YAAY,GAAG,UAA6B;AAAA,EAC3D,OAAO,eAAe,oBAAoB,WAAwB,IAAI;AAAA,EAEtE,IAAI,OAAO,WAAW;AAAA,IAAG,OAAO;AAAA,EAEhC,uBACC,MAyCE,OAzCF;AAAA,IAAK,WAAU;AAAA,IAAf,UACE,OAAO,IAAI,CAAC,KAAK,MAAM;AAAA,MACvB,MAAM,MAAM,QAAQ,IAAI,mBAAmB,IAAI;AAAA,MAC/C,MAAM,aAAa,kBAAkB;AAAA,MAErC,uBACC,MAgCE,OAhCF;AAAA,QAAsC,WAAU;AAAA,QAAhD,UACE,6BACA,OAaE,OAbF;AAAA,UAAK,WAAU;AAAA,UAAf,UAaE;AAAA,4BAZD,MAME,UANF;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM,iBAAiB,IAAI;AAAA,cACpC,WAAU;AAAA,cAHX,0BAKC,MAAC,IAAD;AAAA,gBAAG,WAAU;AAAA,eAAU;AAAA,aACtB;AAAA,4BACF,MAAC,OAAD;AAAA,cACC;AAAA,cACA,KAAK,eAAe,IAAI;AAAA,cACxB,WAAU;AAAA,aACX;AAAA;AAAA,SACC,oBAEF,OAaE,UAbF;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,iBAAiB,CAAC;AAAA,UACjC,WAAU;AAAA,UAHX,UAaE;AAAA,4BARD,MAAC,OAAD;AAAA,cACC;AAAA,cACA,KAAK,eAAe,IAAI;AAAA,cACxB,WAAU;AAAA,aACX;AAAA,4BACA,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf,0BACC,MAAC,YAAD;AAAA,gBAAW,WAAU;AAAA,eAAwF;AAAA,aAC5G;AAAA;AAAA,SACD;AAAA,SA9BM,OAAO,KAAK,IAAI,UAgCxB;AAAA,KAEH;AAAA,GACA;AAAA;;AC1DJ,wBAAS,8BAAa,8BAAc;AAAA;AAWpC,IAAM,eAGF;AAAA,EACH,SAAS;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,YAAY;AAAA,EACb;AAAA,EACA,MAAM;AAAA,IACL,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,YAAY;AAAA,EACb;AAAA,EACA,SAAS;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,YAAY;AAAA,EACb;AAAA,EACA,QAAQ;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,YAAY;AAAA,EACb;AAAA,EACA,MAAM;AAAA,IACL,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,YAAY;AAAA,EACb;AAAA,EACA,OAAO;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,YAAY;AAAA,EACb;AAAA,EACA,KAAK;AAAA,IACJ,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,YAAY;AAAA,EACb;AACD;AAYO,SAAS,UAAU;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,eAAe;AAAA,EACf,YAAY;AAAA,EACZ;AAAA,GACmB;AAAA,EACnB,MAAM,SAAS,aAAa;AAAA,EAC5B,MAAM,aAAa,UAChB,GAAG,OAAO,SAAS,OAAO,eAC1B,GAAG,OAAO,UAAU,OAAO;AAAA,EAE9B,uBACC,OAsBE,UAtBF;AAAA,IACC,MAAK;AAAA,IACL,SAAS,MAAM,aAAa,SAAS;AAAA,IACrC,WAAW,4DAA4D;AAAA,IAHxE,UAsBE;AAAA,MAjBA,YACA,6BACC,MAAC,cAAD;AAAA,QAAa,WAAU;AAAA,OAAwB,oBAE/C,MAAC,eAAD;AAAA,QAAc,WAAU;AAAA,OAAwB,oBAGjD,MAAC,OAAD;AAAA,QAAK,WAAU;AAAA,OAAoB;AAAA,MAEnC,2BACA,MAAC,cAAD;AAAA,QAAa,WAAU;AAAA,OAAuD;AAAA,sBAE/E,OAGE,QAHF;AAAA,QAAM,WAAU;AAAA,QAAhB,UAGE;AAAA,UAFA;AAAA,UACA,UAAU,WAAW;AAAA;AAAA,OACrB;AAAA,MACD;AAAA;AAAA,GACA;AAAA;AAIG,SAAS,mBAAmB,GAAG;AAAA,EACrC,uBAAO,MAA2D,QAA3D;AAAA,IAAM,WAAU;AAAA,IAAhB;AAAA,GAA2D;AAAA;AAG5D,SAAS,gBAAgB;AAAA,EAC/B;AAAA,EACA,YAAY;AAAA,GAIV;AAAA,EACF,uBAAO,MAAgE,QAAhE;AAAA,IAAM,WAAW,sBAAsB;AAAA,IAAvC;AAAA,GAAgE;AAAA;AAGjE,SAAS,cAAc;AAAA,EAC7B;AAAA,EACA,YAAY;AAAA,GAIV;AAAA,EACF,uBACC,MAIE,QAJF;AAAA,IACC,WAAW,4DAA4D;AAAA,IADxE;AAAA,GAIE;AAAA;AAIG,SAAS,iBAAiB,GAAG,YAAqC;AAAA,EACxE,uBACC,MAEE,QAFF;AAAA,IAAM,WAAU;AAAA,IAAhB;AAAA,GAEE;AAAA;AAIG,SAAS,eAAe,GAAG,YAAqC;AAAA,EACtE,uBACC,MAEE,QAFF;AAAA,IAAM,WAAU;AAAA,IAAhB;AAAA,GAEE;AAAA;;;AJvIG,SAAS,YAAY;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACiB;AAAA,EACjB,MAAM,SAAS,YAAY,UAAU,CAAC;AAAA,EACtC,MAAM,OAAO,YAAY,QAAQ,CAAC;AAAA,EAElC,MAAM,eACL,OAAO,WAAW,YAAY,QAAQ,UAAU,OAAO,OAAO;AAAA,EAC/D,MAAM,eACL,gBAAgB,WAAW,UAAU,OAAO,OAAO,UAAU,WAC1D,OAAO,QACP;AAAA,EACJ,MAAM,aACL,gBAAgB,WAAW,UAAU,OAAO,OAAO,UAAU,WAC1D,OAAO,QACP;AAAA,EAEJ,MAAM,SAAS,OAAO,OAAO,UAAU,EAAE;AAAA,EACzC,MAAM,SAAS,OAAO,OAAO,UAAU,EAAE;AAAA,EACzC,MAAM,WAAW,OAAO,OAAO,YAAY,CAAC;AAAA,EAC5C,MAAM,MAAM,OAAO,KAAK,OAAO,EAAE;AAAA,EACjC,MAAM,MAAM,KAAK,MAAM,OAAO,KAAK,GAAG,IAAI;AAAA,EAC1C,MAAM,UAAU,eAAe,cAAc;AAAA,EAC7C,MAAM,cAAc,UAAU,gBAAgB,UAAU,SAAS,MAAM,IACpE,eACA;AAAA,EAEH,MAAM,YAAY,OAAO,SAAS,KAAK,OAAO,SAAS;AAAA,EACvD,MAAM,UAAU,gBAAgB,aAAa;AAAA,EAC7C,MAAM,YAAY,OAAO,SAAS;AAAA,EAClC,MAAM,iBAAiB,UAAU,UAAU,SAAS;AAAA,IAAO,MAAM;AAAA,EAEjE,uBACC,OAsIE,OAtIF;AAAA,IAAK,WAAU;AAAA,IAAf,UAsIE;AAAA,sBArID,OAkCE,YAlCF;AAAA,QACC,UAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAa;AAAA,QACb,WAAW;AAAA,QANZ,UAkCE;AAAA,UA1BA,CAAC,2BACD;AAAA,sBAQE;AAAA,8BAPD,MAAC,qBAAD,EAAqB;AAAA,8BACrB,MAKE,QALF;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO;AAAA,gBAFR,UAIE;AAAA,eACA;AAAA;AAAA,WACD;AAAA,UAEF,CAAC,gBAAgB,CAAC,2BAClB;AAAA,sBASE;AAAA,8BARD,MAAC,qBAAD,EAAqB;AAAA,cACpB,aAAa,oBACb,OAAoC,mBAApC;AAAA,0BAAoC;AAAA,kBAApC;AAAA,kBAAyB;AAAA;AAAA,eAAW,oBAEpC,OAAkC,iBAAlC;AAAA,0BAAkC;AAAA,kBAAlC;AAAA,kBAAuB;AAAA;AAAA,eAAW;AAAA,8BAEnC,MAAC,qBAAD,EAAqB;AAAA,8BACrB,MAA2B,gBAA3B;AAAA,0BAAiB;AAAA,eAAU;AAAA;AAAA,WAC1B;AAAA,UAEF,gBAAgB,CAAC,2BACjB,OAA4B,gBAA5B;AAAA,sBAA4B;AAAA,cAA5B;AAAA,cAAkB;AAAA;AAAA,WAAU;AAAA;AAAA,OAE5B;AAAA,MAED,cAAc,gBAAgB,gCAC9B,MAAC,kBAAD;AAAA,QAAkB,OAAO;AAAA,QAAc,OAAO;AAAA,QAAY,WAAS;AAAA,OAAC;AAAA,MAGpE,cAAc,CAAC,gCACf,OA0FE,OA1FF;AAAA,QAAK,WAAU;AAAA,QAAf,UA0FE;AAAA,0BAzFD,MAUE,gBAVF;AAAA,YACC,OAAM;AAAA,YACN,sBAAM,MAAC,WAAD;AAAA,cAAU,WAAU;AAAA,aAAU;AAAA,YACpC,UAAU,OAAO,QAAQ,MAAM,MAAM,QAAQ;AAAA,YAC7C,UAAU;AAAA,YACV,WAAU;AAAA,YALX,0BAOC,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf,UACE;AAAA,aACA;AAAA,WACD;AAAA,UAED,cACC,aAAa,oBACb,MAqBE,gBArBF;AAAA,YACC,OAAM;AAAA,YACN,UAAU;AAAA,YACV,WAAU;AAAA,YAHX,0BAKC,MAeE,oBAfF;AAAA,cACC,UAAS;AAAA,cACT,OAAO;AAAA,cACP,aAAa;AAAA,gBACZ,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,YAAY;AAAA,gBACZ,UAAU;AAAA,cACX;AAAA,cACA,WAAS;AAAA,cACT,eAAa;AAAA,cAZd,UAcE;AAAA,aACA;AAAA,WACD,oBAEF;AAAA,sBAkDE;AAAA,cAjDA,0BACA,MAqBE,gBArBF;AAAA,gBACC,OAAM;AAAA,gBACN,UAAU;AAAA,gBACV,WAAU;AAAA,gBAHX,0BAKC,MAeE,oBAfF;AAAA,kBACC,UAAS;AAAA,kBACT,OAAO;AAAA,kBACP,aAAa;AAAA,oBACZ,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,YAAY;AAAA,oBACZ,UAAU;AAAA,kBACX;AAAA,kBACA,WAAS;AAAA,kBACT,eAAa;AAAA,kBAZd,UAcE;AAAA,iBACA;AAAA,eACD;AAAA,cAEF,6BACA,MAsBE,gBAtBF;AAAA,gBACC,OAAM;AAAA,gBACN,UAAU;AAAA,gBACV,SAAQ;AAAA,gBACR,WAAU;AAAA,gBAJX,0BAMC,MAeE,oBAfF;AAAA,kBACC,UAAS;AAAA,kBACT,OAAO;AAAA,kBACP,aAAa;AAAA,oBACZ,QAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,YAAY;AAAA,oBACZ,YAAY;AAAA,oBACZ,UAAU;AAAA,kBACX;AAAA,kBACA,WAAS;AAAA,kBACT,eAAa;AAAA,kBAZd,UAcE;AAAA,iBACA;AAAA,eACD;AAAA;AAAA,WAEF;AAAA;AAAA,OAEH;AAAA;AAAA,GAEF;AAAA;;;;AKlLJ,SAAS,eAAe,CAAC,MAAiC;AAAA,EACzD,IAAI,CAAC,QAAQ,KAAK,SAAS;AAAA,IAAG,OAAO;AAAA,EACrC,MAAM,IAAI,KAAK;AAAA,EACf,MAAM,IAAI,KAAK;AAAA,EACf,MAAM,OAAO,KAAK,MAAM,CAAC;AAAA,EAEzB,IAAI,MAAM,OAAO,MAAM,KAAK;AAAA,IAC3B,OAAO,EAAE,QAAQ,MAAM,MAAM,MAAM,YAAY;AAAA,EAChD;AAAA,EAEA,IAAI,OAA2B;AAAA,EAC/B,IAAI,MAAM,OAAO,MAAM;AAAA,IAAK,OAAO;AAAA,EAC9B,SAAI,MAAM;AAAA,IAAK,OAAO;AAAA,EAE3B,OAAO,EAAE,QAAQ,GAAG,IAAI,KAAK,MAAM,KAAK;AAAA;AAGzC,SAAS,aAAa,CAAC,QAAwB;AAAA,EAC9C,IAAI,WAAW;AAAA,IAAM,OAAO;AAAA,EAC5B,IAAI,OAAO,OAAO,OAAO,OAAO,OAAO;AAAA,IAAK,OAAO;AAAA,EACnD,IAAI,OAAO,OAAO,OAAO,OAAO,OAAO;AAAA,IAAK,OAAO;AAAA,EACnD,IAAI,OAAO,OAAO,OAAO,OAAO,OAAO;AAAA,IAAK,OAAO;AAAA,EACnD,IAAI,OAAO,OAAO,OAAO,OAAO,OAAO;AAAA,IAAK,OAAO;AAAA,EACnD,OAAO;AAAA;AAGR,SAAS,cAAc,CAAC,MAAkC;AAAA,EACzD,QAAQ;AAAA,SACF;AAAA,MACJ,OAAO;AAAA,SACH;AAAA,MACJ,OAAO;AAAA,SACH;AAAA,MACJ,OAAO;AAAA,SACH;AAAA,MACJ,OAAO;AAAA;AAAA;AAIH,SAAS,iBAAiB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACiB;AAAA,EACjB,MAAM,SAAS,YAAY,UAAU,CAAC;AAAA,EACtC,MAAM,WAAW,YAAY,MAAM;AAAA,EACnC,MAAM,eAAe,gBAAgB,MAAM;AAAA,EAC3C,MAAM,SAAS,OAAO,OAAO,UAAU,CAAC;AAAA,EACxC,MAAM,WAAW,OAAO,OAAO,YAAY,CAAC;AAAA,EAC5C,MAAM,MAAO,OAAO,OAAO,CAAC;AAAA,EAC5B,MAAM,UAAU,OAAO,OAAO,WAAW,EAAE;AAAA,EAC3C,MAAM,UAAU,eAAe,cAAc;AAAA,EAE7C,MAAM,cAAc,IAAI,IAAI,eAAe,EAAE,OAAO,OAAO;AAAA,EAC3D,MAAM,aAAa,SAAS,KAAK,WAAW;AAAA,EAC5C,MAAM,YAAY,YAAY,SAAS,KAAK,YAAY,CAAC,CAAC;AAAA,EAE1D,uBACC,OA+DE,OA/DF;AAAA,IAAK,WAAU;AAAA,IAAf,UA+DE;AAAA,sBA9DD,OA2BE,YA3BF;AAAA,QACC,UAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,cAAa;AAAA,QACb;AAAA,QAND,UA2BE;AAAA,0BAnBD,MAAC,qBAAD,EAAqB;AAAA,UACpB,6BACA;AAAA,sBAWE;AAAA,cAVA,SAAS,qBACT,OAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UAEE;AAAA,kBADA;AAAA,kBADF;AAAA;AAAA,eAEE;AAAA,cAEF,WAAW,qBACX,OAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UAEE;AAAA,kBADA;AAAA,kBADF;AAAA;AAAA,eAEE;AAAA;AAAA,WAEF,oBAEF,MAAgE,QAAhE;AAAA,YAAM,WAAU;AAAA,YAAhB;AAAA,WAAgE;AAAA,0BAEjE,MAAC,qBAAD,EAAqB;AAAA,0BACrB,MAA2B,gBAA3B;AAAA,sBAAiB;AAAA,WAAU;AAAA;AAAA,OAC1B;AAAA,MACD,cAAc,YAAY,gCAC1B,MAAC,kBAAD;AAAA,QAAkB,OAAO;AAAA,OAAc;AAAA,MAEvC,cAAc,CAAC,aAAa,YAAY,SAAS,KAAK,4BACtD,MA4BE,OA5BF;AAAA,QAAK,WAAU;AAAA,QAAf,UACE,YAAY,SAAS,oBACrB,MAkBE,OAlBF;AAAA,UAAK,WAAU;AAAA,UAAf,0BACC,MAgBE,OAhBF;AAAA,YAAK,WAAU;AAAA,YAAf,UACE,YAAY,IAAI,CAAC,MAAM,sBACvB,OAYE,OAZF;AAAA,cAEC,WAAU;AAAA,cAFX,UAYE;AAAA,gCARD,MAIE,QAJF;AAAA,kBACC,WAAW,mCAAmC,eAAe,KAAK,IAAI;AAAA,kBADvE,UAGE,cAAc,KAAK,MAAM;AAAA,iBACzB;AAAA,gCACF,MAEE,QAFF;AAAA,kBAAM,WAAU;AAAA,kBAAhB,UACE,KAAK;AAAA,iBACL;AAAA;AAAA,eAVG,GAAG,KAAK,QAAQ,GAWpB,CACF;AAAA,WACA;AAAA,SACD,IAEF,2BACC,MAEE,OAFF;AAAA,UAAK,WAAU;AAAA,UAAf,UACE;AAAA,SACA;AAAA,OAGH;AAAA;AAAA,GAEF;AAAA;;;ACrIJ,sBAAS;;AAeF,SAAS,eAAe;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACiB;AAAA,EACjB,MAAM,SAAS,YAAY,UAAU,CAAC;AAAA,EACtC,MAAM,OAAO,YAAY,QAAQ,CAAC;AAAA,EAClC,MAAM,QAAQ,OAAO,OAAO,SAAS,OAAO,QAAQ,EAAE;AAAA,EACtD,MAAM,MAAM,KAAK,OAAO,OAAO;AAAA,EAC/B,MAAM,UAAU,eAAe,cAAc;AAAA,EAE7C,MAAM,WAAW,YAAY,MAAM,KAAK,CAAC,CAAC,YAAY;AAAA,EACtD,MAAM,eACL,gBAAgB,MAAM,MACrB,OAAO,YAAY,UAAU,WAAW,YAAY,QAAQ;AAAA,EAC9D,MAAM,aACL,UAAU,OAAO,WAAW,YAAY,WAAW,SAChD,OAAO,OAAO,KAAK,IACnB;AAAA,EAEJ,MAAM,QAAQ,MAAM,MAAM;AAAA,CAAI;AAAA,EAC9B,IAAI,QAAQ;AAAA,EACZ,IAAI,YAAY;AAAA,EAChB,IAAI,YAAY;AAAA,EAChB,WAAW,QAAQ,OAAO;AAAA,IACzB,IAAI,KAAK,WAAW,YAAY;AAAA,MAAG,SAAS;AAAA,IACvC,SAAI,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,KAAK;AAAA,MAAG,aAAa;AAAA,IAClE,SAAI,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,KAAK;AAAA,MAAG,aAAa;AAAA,EACxE;AAAA,EAEA,MAAM,aAAa,QAAQ;AAAA,EAE3B,uBACC,OAoEE,OApEF;AAAA,IAAK,WAAU;AAAA,IAAf,UAoEE;AAAA,sBAnED,OAsCE,YAtCF;AAAA,QACC,UAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,cAAa;AAAA,QACb,WAAW;AAAA,QANZ,UAsCE;AAAA,UA9BA,uBACA;AAAA,sBAGE;AAAA,8BAFD,MAAC,qBAAD,EAAqB;AAAA,8BACrB,MAAkD,QAAlD;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAAkD;AAAA;AAAA,WACjD;AAAA,0BAEH,MAAC,qBAAD,EAAqB;AAAA,UACpB,6BACA;AAAA,sBAgBE;AAAA,8BAfD,OAEE,kBAFF;AAAA,0BAEE;AAAA,kBADA;AAAA,kBADF;AAAA,kBACU,UAAU,IAAI,SAAS;AAAA;AAAA,eAC/B;AAAA,cACD,YAAY,qBACZ;AAAA,0BAGE;AAAA,kCAFD,MAAC,qBAAD,EAAqB;AAAA,kCACrB,OAAiC,mBAAjC;AAAA,8BAAiC;AAAA,sBAAjC;AAAA,sBAAqB;AAAA;AAAA,mBAAY;AAAA;AAAA,eAChC;AAAA,cAEF,YAAY,qBACZ;AAAA,0BAGE;AAAA,kCAFD,MAAC,qBAAD,EAAqB;AAAA,kCACrB,OAA+B,iBAA/B;AAAA,8BAA+B;AAAA,sBAA/B;AAAA,sBAAmB;AAAA;AAAA,mBAAY;AAAA;AAAA,eAC9B;AAAA;AAAA,WAEF,oBAEF,MAAuD,QAAvD;AAAA,YAAM,WAAU;AAAA,YAAhB;AAAA,WAAuD;AAAA,0BAExD,MAAC,qBAAD,EAAqB;AAAA,0BACrB,MAA2B,gBAA3B;AAAA,sBAAiB;AAAA,WAAU;AAAA;AAAA,OAC1B;AAAA,MAED,cAAc,YAAY,gCAC1B,MAAC,kBAAD;AAAA,QAAkB,OAAO;AAAA,QAAc,OAAO;AAAA,QAAY,WAAS;AAAA,OAAC;AAAA,MAGpE,cAAc,CAAC,4BACf,OAoBE,OApBF;AAAA,QAAK,WAAU;AAAA,QAAf,UAoBE;AAAA,0BAnBD,MAQE,gBARF;AAAA,YACC,OAAM;AAAA,YACN,sBAAM,MAAC,YAAD;AAAA,cAAW,WAAU;AAAA,aAAU;AAAA,YACrC,WAAU;AAAA,YAHX,0BAKC,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf,UACE,MAAM,gCAAgC;AAAA,aACtC;AAAA,WACD;AAAA,UAED,yBAAS,MAAC,UAAD;AAAA,YAAU;AAAA,WAAc;AAAA,UAEjC,CAAC,yBACD,MAIE,gBAJF;AAAA,YAAgB,OAAM;AAAA,YAAO,WAAU;AAAA,YAAvC,0BACC,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAEE;AAAA,WACD;AAAA;AAAA,OAEF;AAAA;AAAA,GAEF;AAAA;;;ACrHJ,kBAAS;AACT;AAAA,WACC;AAAA,iBACA;AAAA;;AAKM,SAAS,iBAAiB;AAAA,EAChC;AAAA,EACA;AAAA,GACiB;AAAA,EACjB,MAAM,SAAS,YAAY,UAAU,CAAC;AAAA,EACtC,MAAM,UAAU,OAAO,OAAO,WAAW,EAAE;AAAA,EAC3C,MAAM,UAAU,eAAe,cAAc;AAAA,EAC7C,MAAM,cAAc,UAAU,gBAAgB,UAAU,SAAS,MAAM,IACpE,eACA;AAAA,EAEH,uBACC,OA8BE,OA9BF;AAAA,IAAK,WAAU;AAAA,IAAf,UA8BE;AAAA,sBA7BD,OAME,OANF;AAAA,QAAK,WAAU;AAAA,QAAf,UAME;AAAA,0BALD,MAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB;AAAA,WAEE;AAAA,0BACF,MAA6C,QAA7C;AAAA,YAAM,WAAU;AAAA,YAAhB;AAAA,WAA6C;AAAA,0BAC7C,MAAsD,QAAtD;AAAA,YAAM,WAAU;AAAA,YAAhB,UAA4C;AAAA,WAAU;AAAA;AAAA,OACrD;AAAA,MACD,2BACA,MAmBE,OAnBF;AAAA,QAAK,WAAU;AAAA,QAAf,0BACC,MAiBE,OAjBF;AAAA,UAAK,WAAU;AAAA,UAAf,0BACC,MAeE,oBAfF;AAAA,YACC,UAAS;AAAA,YACT,OAAO;AAAA,YACP,aAAa;AAAA,cACZ,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,UAAU;AAAA,YACX;AAAA,YACA,WAAS;AAAA,YACT,eAAa;AAAA,YAZd,UAcE;AAAA,WACA;AAAA,SACD;AAAA,OACD;AAAA;AAAA,GAEF;AAAA;;;AClDJ,yBAAS;;AAsBF,SAAS,kBAAkB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACiB;AAAA,EACjB,MAAM,WAAW,YAAY;AAAA,EAC7B,MAAM,UAAU,eAAe,cAAc;AAAA,EAE7C,MAAM,aAAa,CAAC,OAAe,UAAkB;AAAA,IACpD,IAAI,SAAS;AAAA,MAAG,OAAO,GAAG;AAAA,IAC1B,OAAO,GAAG,SAAS,QAAQ,QAAQ;AAAA;AAAA,EAGpC,MAAM,kBAAkB,CAAC,SAA+B;AAAA,IACvD,MAAM,OAAO,IAAI,WAAW,KAAK,UAAU,KAAK,QAAQ;AAAA,IACxD,MAAM,QAAQ,IAAI,WAAW,KAAK,UAAU,KAAK,QAAQ;AAAA,IACzD,MAAM,aAAuB,CAAC;AAAA,IAC9B,IAAI,KAAK,YAAY;AAAA,MAAG,WAAW,KAAK,IAAI,KAAK,WAAW;AAAA,IAC5D,IAAI,KAAK,YAAY;AAAA,MAAG,WAAW,KAAK,IAAI,KAAK,WAAW;AAAA,IAC5D,MAAM,QAAQ,WAAW,SAAS,IAAI,KAAK,WAAW,KAAK,IAAI,OAAO;AAAA,IACtE,OAAO,GAAG,QAAQ,QAAQ;AAAA;AAAA,EAE3B,MAAM,UAAU,UAAU,WAAW,CAAC;AAAA,EACtC,MAAM,QAAQ,OAAO,QAAQ,SAAS,CAAC;AAAA,EACvC,MAAM,YAAY,OAAO,QAAQ,aAAa,CAAC;AAAA,EAC/C,MAAM,YAAY,OAAO,QAAQ,aAAa,CAAC;AAAA,EAC/C,MAAM,QAAQ,UAAU,QAAQ,OAAO,SAAS,KAAK,IAAI;AAAA,EAEzD,MAAM,UAAU,MAAM,QAAQ,YAAY,QAAQ,OAAO,IACrD,YAAY,QAAQ,UACrB,CAAC;AAAA,EAEJ,MAAM,iBACL,UAAU,KAAK,QAAQ,SAAS,IAAI,QAAQ,GAAG,WAAW;AAAA,EAE3D,MAAM,WACL,YAAY,SACX,YAAY,UACZ,QAAQ,YAAY,UACpB,YAAY,OAAO,OAAO;AAAA,EAC5B,MAAM,eACL,OAAO,YAAY,UAAU,WAC1B,YAAY,QACZ,YAAY,WACZ,WAAW,YAAY,WACvB,OAAO,YAAY,OAAO,UAAU,WACnC,YAAY,OAAO,QACnB;AAAA,EACL,MAAM,aACL,YAAY,UACZ,OAAO,YAAY,WAAW,YAC9B,WAAW,YAAY,UACvB,OAAO,YAAY,OAAO,UAAU,WACjC,YAAY,OAAO,QACnB;AAAA,EAEJ,uBACC,OAuFE,OAvFF;AAAA,IAAK,WAAU;AAAA,IAAf,UAuFE;AAAA,sBAtFD,OAsCE,UAtCF;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,WAAW,oDACV,WACG,8EACA;AAAA,QANL,UAsCE;AAAA,0BA7BD,MAAC,eAAD;AAAA,YACC,WAAW,8CAA8C,aAAa,cAAc;AAAA,WACrF;AAAA,0BACA,OAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UAEE;AAAA,cAFF;AAAA,cACa,WAAW,WAAW;AAAA;AAAA,WACjC;AAAA,0BACF,MAA2D,QAA3D;AAAA,YAAM,WAAU;AAAA,YAAhB;AAAA,WAA2D;AAAA,UAC1D,iCACA,MAME,QANF;AAAA,YACC,WAAU;AAAA,YACV,KAAI;AAAA,YACJ,OAAO;AAAA,YAHR,UAKE,IAAS;AAAA,WACT,oBAEF,OAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UAEE;AAAA,cADA;AAAA,cADF;AAAA,cACU,UAAU,IAAI,SAAS;AAAA;AAAA,WAC/B;AAAA,0BAEH,OAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UAEE;AAAA,cAFF;AAAA,cACG;AAAA;AAAA,WACD;AAAA,0BACF,OAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UAEE;AAAA,cAFF;AAAA,cACG;AAAA;AAAA,WACD;AAAA,0BACF,OAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UAEE;AAAA,cAFF;AAAA,cACG;AAAA;AAAA,WACD;AAAA;AAAA,OACD;AAAA,MACD,cAAc,YAAY,gCAC1B,OAcE,OAdF;AAAA,kBAcE;AAAA,0BAbD,MAAC,kBAAD;AAAA,YAAkB,OAAO;AAAA,YAAc,OAAO;AAAA,YAAY,WAAS;AAAA,WAAC;AAAA,UACnE,yBACA,MASE,OATF;AAAA,YAAK,WAAU;AAAA,YAAf,0BACC,OAOE,WAPF;AAAA,wBAOE;AAAA,gCAND,MAEE,WAFF;AAAA,kBAAS,WAAU;AAAA,kBAAnB;AAAA,iBAEE;AAAA,gCACF,MAEE,OAFF;AAAA,kBAAK,WAAU;AAAA,kBAAf,0BACC,MAAC,UAAD;AAAA,oBAAU;AAAA,mBAAc;AAAA,iBACvB;AAAA;AAAA,aACD;AAAA,WACD;AAAA;AAAA,OAEF;AAAA,MAEF,cAAc,CAAC,YAAY,QAAQ,SAAS,qBAC5C,MAqBE,OArBF;AAAA,QAAK,WAAU;AAAA,QAAf,UACE,QAAQ,IAAI,CAAC,2BACb,OAiBE,OAjBF;AAAA,UAEC,WAAU;AAAA,UAFX,UAiBE;AAAA,4BAbD,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf,UACE,OAAO;AAAA,aACP;AAAA,4BACF,MASE,OATF;AAAA,cAAK,WAAU;AAAA,cAAf,UACE,OAAO,MAAM,IAAI,CAAC,MAAM,0BACxB,MAKE,QALF;AAAA,gBAEC,WAAU;AAAA,gBAFX,UAIE,gBAAgB,IAAI;AAAA,iBAHhB,eAAe,OAAO,iBAAiB,OAI3C,CACF;AAAA,aACA;AAAA;AAAA,WAfG,eAAe,OAAO,YAAY,OAAO,MAgB7C,CACF;AAAA,OACA;AAAA,MAGF,cAAc,CAAC,YAAY,yBAC3B,MAEE,OAFF;AAAA,QAAK,WAAU;AAAA,QAAf,0BACC,MAAC,UAAD;AAAA,UAAU;AAAA,SAAc;AAAA,OACvB;AAAA;AAAA,GAEF;AAAA;;;ACvKJ,iBAAS;;AAYF,SAAS,YAAY;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACiB;AAAA,EACjB,MAAM,SAAS,YAAY,UAAU,CAAC;AAAA,EACtC,MAAM,OAAQ,YAAY,QAAQ,CAAC;AAAA,EACnC,MAAM,WAAW,YAAY,MAAM;AAAA,EACnC,MAAM,eAAe,gBAAgB,MAAM;AAAA,EAC3C,MAAM,aACL,UAAU,OAAO,WAAW,YAAY,WAAW,SAChD,OAAO,OAAO,KAAK,IACnB;AAAA,EACJ,MAAM,UAAW,OAAO,WAA8B,CAAC;AAAA,EACvD,MAAM,UAAU,eAAe,cAAc;AAAA,EAE7C,MAAM,OAAO,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AAAA,EAEzD,uBACC,OAwFE,OAxFF;AAAA,IAAK,WAAU;AAAA,IAAf,UAwFE;AAAA,sBAvFD,OAsBE,YAtBF;AAAA,QACC,UAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,cAAa;AAAA,QACb,WAAW;AAAA,QANZ,UAsBE;AAAA,UAdA,QAAQ,SAAS,uBACjB;AAAA,sBAKE;AAAA,8BAJD,MAAC,qBAAD,EAAqB;AAAA,8BACrB,MAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAsC,OAAO;AAAA,gBAA7D,UACE,KAAK,SAAS,KAAK,IAAG,KAAK,MAAM,GAAG,MAAM;AAAA,eAC1C;AAAA;AAAA,WACD;AAAA,0BAEH,MAAC,qBAAD,EAAqB;AAAA,0BACrB,OAEE,kBAFF;AAAA,sBAEE;AAAA,cADA,QAAQ;AAAA,cADV;AAAA,cACmB,QAAQ,WAAW,IAAI,UAAU;AAAA;AAAA,WAClD;AAAA,0BACF,MAAC,qBAAD,EAAqB;AAAA,0BACrB,MAA2B,gBAA3B;AAAA,sBAAiB;AAAA,WAAU;AAAA;AAAA,OAC1B;AAAA,MAED,cAAc,YAAY,gCAC1B,MAAC,kBAAD;AAAA,QAAkB,OAAO;AAAA,QAAc,OAAO;AAAA,QAAY,WAAS;AAAA,OAAC;AAAA,MAGpE,cAAc,CAAC,4BACf,OAwDE,OAxDF;AAAA,QAAK,WAAU;AAAA,QAAf,UAwDE;AAAA,0BAvDD,MASE,gBATF;AAAA,YACC,OAAM;AAAA,YACN,sBAAM,MAAC,YAAD;AAAA,cAAY,WAAU;AAAA,aAAU;AAAA,YACtC,UAAU;AAAA,YACV,WAAU;AAAA,YAJX,0BAMC,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf,UACE;AAAA,aACA;AAAA,WACD;AAAA,UAED,QAAQ,SAAS,qBACjB,MAiCE,gBAjCF;AAAA,YACC,OAAM;AAAA,YACN,UAAU,QACR,IAAI,CAAC,MAAM;AAAA,cACX,MAAM,QAAQ;AAAA,cACd,OAAO,MAAM,QAAQ;AAAA,aACrB,EACA,KAAK;AAAA,CAAI;AAAA,YACX,WAAU;AAAA,YARX,0BAUC,MAsBE,OAtBF;AAAA,cAAK,WAAU;AAAA,cAAf,UACE,QAAQ,IAAI,CAAC,OAAO,MAAM;AAAA,gBAC1B,MAAM,IAAI;AAAA,gBAKV,MAAM,QAAQ,EAAE,SAAS,SAAS,EAAE;AAAA,gBACpC,uBACC,OAUE,OAVF;AAAA,kBAEC,WAAU;AAAA,kBAFX,UAUE;AAAA,oBANA,wBACA,MAAC,QAAD;AAAA,sBAAQ,WAAU;AAAA,qBAAsC,oBAExD,MAAC,OAAD;AAAA,sBAAM,WAAU;AAAA,qBAA8C;AAAA,oCAE/D,MAAqC,QAArC;AAAA,sBAAM,WAAU;AAAA,sBAAhB,UAA4B,EAAE;AAAA,qBAAO;AAAA;AAAA,mBARhC,GAAG,EAAE,QAAQ,GASjB;AAAA,eAEH;AAAA,aACA;AAAA,WACD;AAAA,UAGF,QAAQ,WAAW,qBACnB,MAIE,gBAJF;AAAA,YAAgB,OAAM;AAAA,YAAU,WAAU;AAAA,YAA1C,0BACC,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAEE;AAAA,WACD;AAAA;AAAA,OAEF;AAAA;AAAA,GAEF;AAAA;;;ACxHJ;AACA,kBAAS;AACT;AAAA,WACC;AAAA,iBACA;AAAA;;AAaM,SAAS,YAAY;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACiB;AAAA,EACjB,MAAM,SAAS,YAAY,UAAU,CAAC;AAAA,EACtC,MAAM,OAAQ,YAAY,QAAQ,CAAC;AAAA,EACnC,MAAM,WAAW,YAAY,MAAM;AAAA,EACnC,MAAM,eAAe,gBAAgB,MAAM;AAAA,EAC3C,MAAM,aACL,UAAU,OAAO,WAAW,YAAY,WAAW,SAChD,OAAO,OAAO,KAAK,IACnB;AAAA,EACJ,MAAM,OAAO,OAAO,OAAO,QAAQ,EAAE;AAAA,EACrC,MAAM,QAAQ,KAAK,MAAM;AAAA,CAAI,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE;AAAA,EAC3D,MAAM,UAAU,eAAe,cAAc;AAAA,EAC7C,MAAM,cAAc,UAAU,gBAAgB,UAAU,SAAS,MAAM,IACpE,eACA;AAAA,EAEH,MAAM,OAAO,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AAAA,EACzD,MAAM,QAAQ,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAAA,EAE5D,uBACC,OA2EE,OA3EF;AAAA,IAAK,WAAU;AAAA,IAAf,UA2EE;AAAA,sBA1ED,OAsBE,YAtBF;AAAA,QACC,UAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,cAAa;AAAA,QACb,WAAW;AAAA,QANZ,UAsBE;AAAA,UAdA,QAAQ,SAAS,uBACjB;AAAA,sBAKE;AAAA,8BAJD,MAAC,qBAAD,EAAqB;AAAA,8BACrB,MAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAsC,OAAO;AAAA,gBAA7D,UACE,KAAK,SAAS,KAAK,IAAG,KAAK,MAAM,GAAG,MAAM;AAAA,eAC1C;AAAA;AAAA,WACD;AAAA,0BAEH,MAAC,qBAAD,EAAqB;AAAA,0BACrB,OAEE,kBAFF;AAAA,sBAEE;AAAA,cADA;AAAA,cADF;AAAA,cACU,UAAU,IAAI,SAAS;AAAA;AAAA,WAC/B;AAAA,0BACF,MAAC,qBAAD,EAAqB;AAAA,0BACrB,MAA2B,gBAA3B;AAAA,sBAAiB;AAAA,WAAU;AAAA;AAAA,OAC1B;AAAA,MAED,cAAc,YAAY,gCAC1B,MAAC,kBAAD;AAAA,QAAkB,OAAO;AAAA,QAAc,OAAO;AAAA,QAAY,WAAS;AAAA,OAAC;AAAA,MAGpE,cAAc,CAAC,4BACf,OA2CE,OA3CF;AAAA,QAAK,WAAU;AAAA,QAAf,UA2CE;AAAA,0BA1CD,MAUE,gBAVF;AAAA,YACC,OAAM;AAAA,YACN,sBAAM,MAAC,YAAD;AAAA,cAAY,WAAU;AAAA,aAAU;AAAA,YACtC,UAAU,QAAQ,UAAU,UAAU;AAAA,YACtC,UAAU;AAAA,YACV,WAAU;AAAA,YALX,0BAOC,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf,UACE;AAAA,aACA;AAAA,WACD;AAAA,UAED,wBACA,MAmBE,gBAnBF;AAAA,YAAgB,OAAM;AAAA,YAAO,UAAU;AAAA,YAAM,WAAU;AAAA,YAAvD,0BACC,MAiBE,OAjBF;AAAA,cAAK,WAAU;AAAA,cAAf,0BACC,MAeE,oBAfF;AAAA,gBACC,UAAS;AAAA,gBACT,OAAO;AAAA,gBACP,aAAa;AAAA,kBACZ,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,YAAY;AAAA,kBACZ,UAAU;AAAA,gBACX;AAAA,gBACA,WAAS;AAAA,gBACT,eAAa;AAAA,gBAZd,UAcE;AAAA,eACA;AAAA,aACD;AAAA,WACD;AAAA,UAGF,CAAC,wBACD,MAIE,gBAJF;AAAA,YAAgB,OAAM;AAAA,YAAO,WAAU;AAAA,YAAvC,0BACC,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAEE;AAAA,WACD;AAAA;AAAA,OAEF;AAAA;AAAA,GAEF;AAAA;;;ACrHJ,mBAAS;;AAYF,SAAS,cAAc;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACiB;AAAA,EACjB,MAAM,SAAS,YAAY,UAAU,CAAC;AAAA,EACtC,MAAM,OAAQ,YAAY,QAAQ,CAAC;AAAA,EACnC,MAAM,UAAW,OAAO,WAA8B,CAAC;AAAA,EACvD,MAAM,QAAS,OAAO,SAA4B,CAAC;AAAA,EACnD,MAAM,UAAU,eAAe,cAAc;AAAA,EAE7C,MAAM,WAAW,YAAY,MAAM,KAAK,CAAC,CAAC,YAAY;AAAA,EACtD,MAAM,eACL,gBAAgB,MAAM,MACrB,OAAO,YAAY,UAAU,WAAW,YAAY,QAAQ;AAAA,EAC9D,MAAM,aACL,UAAU,OAAO,WAAW,YAAY,WAAW,SAChD,OAAO,OAAO,KAAK,IACnB;AAAA,EAEJ,MAAM,YAAY,QAAQ,SAAS,IAAI,QAAQ,SAAS,MAAM;AAAA,EAC9D,MAAM,YACL,QAAQ,SAAS,IACd,QAAQ,WAAW,IAClB,UACA,YACD,MAAM,WAAW,IAChB,SACA;AAAA,EAEL,MAAM,cAAc,MAAM;AAAA,IACzB,IAAI,OAAO,KAAK,YAAY;AAAA,MAAU,OAAO,KAAK;AAAA,IAClD,IAAI,OAAO,KAAK,UAAU;AAAA,MAAU,OAAO,KAAK;AAAA,IAChD,IAAI,OAAO,KAAK,gBAAgB;AAAA,MAAU,OAAO,KAAK;AAAA,IACtD,OAAO;AAAA,KACL;AAAA,EAEH,MAAM,cAAc,MAAM;AAAA,IACzB,IAAI,OAAO,KAAK,SAAS,YAAY,KAAK,SAAS;AAAA,MAAK,OAAO,KAAK;AAAA,IACpE;AAAA,KACE;AAAA,EAEH,uBACC,OA0HE,OA1HF;AAAA,IAAK,WAAU;AAAA,IAAf,UA0HE;AAAA,sBAzHD,OAiCE,YAjCF;AAAA,QACC,UAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,cAAa;AAAA,QACb,WAAW;AAAA,QANZ,UAiCE;AAAA,UAzBA,cAAc,CAAC,2BACf;AAAA,sBAYE;AAAA,8BAXD,MAAC,qBAAD,EAAqB;AAAA,8BACrB,OASE,QATF;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO;AAAA,gBAFR,UASE;AAAA,kBATF;AAAA,kBAKE,WAAW,SAAS,KAClB,GAAG,WAAW,MAAM,GAAG,EAAE,OACzB;AAAA,kBAPJ;AAAA;AAAA,eASE;AAAA;AAAA,WACD;AAAA,UAEF,CAAC,2BACD;AAAA,sBAOE;AAAA,8BAND,MAAC,qBAAD,EAAqB;AAAA,8BACrB,OAEE,kBAFF;AAAA,0BAEE;AAAA,kBADA;AAAA,kBADF;AAAA,kBACc;AAAA;AAAA,eACZ;AAAA,8BACF,MAAC,qBAAD,EAAqB;AAAA,8BACrB,MAA2B,gBAA3B;AAAA,0BAAiB;AAAA,eAAU;AAAA;AAAA,WAC1B;AAAA;AAAA,OAEF;AAAA,MAED,cAAc,YAAY,gCAC1B,MAAC,kBAAD;AAAA,QAAkB,OAAO;AAAA,QAAc,OAAO;AAAA,QAAY,WAAS;AAAA,OAAC;AAAA,MAGpE,cAAc,CAAC,4BACf,OA+EE,OA/EF;AAAA,QAAK,WAAU;AAAA,QAAf,UA+EE;AAAA,0BA9ED,MAUE,gBAVF;AAAA,YACC,OAAM;AAAA,YACN,sBAAM,MAAC,SAAD;AAAA,cAAQ,WAAU;AAAA,aAAU;AAAA,YAClC,UAAU;AAAA,YACV,UAAU;AAAA,YACV,WAAU;AAAA,YALX,0BAOC,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf,UACE,cAAc;AAAA,aACd;AAAA,WACD;AAAA,UAED,QAAQ,SAAS,qBACjB,MAoCE,gBApCF;AAAA,YACC,OAAM;AAAA,YACN,UAAU,QACR,IAAI,CAAC,MAAM;AAAA,cACX,MAAM,QAAQ;AAAA,cAKd,OAAO,GAAG,MAAM,QAAQ,MAAM,SAAS,MAAM;AAAA,aAC7C,EACA,KAAK;AAAA,CAAI;AAAA,YACX,WAAU;AAAA,YAZX,0BAcC,MAqBE,OArBF;AAAA,cAAK,WAAU;AAAA,cAAf,UACE,QAAQ,IAAI,CAAC,OAAO,MAAM;AAAA,gBAC1B,MAAM,IAAI;AAAA,gBAKV,uBACC,OAUE,OAVF;AAAA,kBAEC,WAAU;AAAA,kBAFX,UAUE;AAAA,oCAND,OAEE,OAFF;AAAA,sBAAK,WAAU;AAAA,sBAAf,UAEE;AAAA,wBADA,EAAE;AAAA,wBADJ;AAAA,wBACW,EAAE;AAAA;AAAA,qBACX;AAAA,oCACF,MAEE,OAFF;AAAA,sBAAK,WAAU;AAAA,sBAAf,UACE,EAAE;AAAA,qBACF;AAAA;AAAA,mBARG,GAAG,EAAE,QAAQ,EAAE,QAAQ,GAS3B;AAAA,eAEH;AAAA,aACA;AAAA,WACD;AAAA,UAGF,MAAM,SAAS,KAAK,QAAQ,WAAW,qBACvC,MAeE,gBAfF;AAAA,YACC,OAAM;AAAA,YACN,UAAU,MAAM,IAAI,MAAM,EAAE,KAAK;AAAA,CAAI;AAAA,YACrC,WAAU;AAAA,YAHX,0BAKC,MASE,OATF;AAAA,cAAK,WAAU;AAAA,cAAf,UACE,MAAM,IAAI,CAAC,yBACX,MAKE,OALF;AAAA,gBAEC,WAAU;AAAA,gBAFX,UAIE,OAAO,IAAI;AAAA,iBAHP,OAAO,IAAI,CAIf,CACF;AAAA,aACA;AAAA,WACD;AAAA,UAGF,cAAc,qBACd,MAIE,gBAJF;AAAA,YAAgB,OAAM;AAAA,YAAU,WAAU;AAAA,YAA1C,0BACC,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAEE;AAAA,WACD;AAAA;AAAA,OAEF;AAAA;AAAA,GAEF;AAAA;;;;AChLG,SAAS,cAAc,GAAG,kBAAiC;AAAA,EACjE,MAAM,UAAU,eAAe,cAAc;AAAA,EAE7C,uBACC,MAYE,OAZF;AAAA,IAAK,WAAU;AAAA,IAAf,0BACC,OAUE,OAVF;AAAA,MAAK,WAAU;AAAA,MAAf,UAUE;AAAA,wBATD,MAEE,QAFF;AAAA,UAAM,WAAU;AAAA,UAAhB;AAAA,SAEE;AAAA,QACD,2BACA;AAAA,oBAGE;AAAA,4BAFD,MAA6C,QAA7C;AAAA,cAAM,WAAU;AAAA,cAAhB;AAAA,aAA6C;AAAA,4BAC7C,MAAsD,QAAtD;AAAA,cAAM,WAAU;AAAA,cAAhB,UAA4C;AAAA,aAAU;AAAA;AAAA,SACrD;AAAA;AAAA,KAEF;AAAA,GACD;AAAA;;;ACnBJ,yBAAS,8BAAc;AACvB,kBAAS;AACT;AAAA,WACC;AAAA,iBACA;AAAA;;AAOM,SAAS,eAAe;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACwB;AAAA,EACxB,MAAM,SAAS,YAAY;AAAA,EAC3B,MAAM,UAAU,eAAe,cAAc;AAAA,EAC7C,MAAM,SAAS,MAAM,QAAQ,QAAQ,MAAM,IACvC,OAAO,SACR,CAAC;AAAA,EACJ,MAAM,YAAY,OAAO,SAAS;AAAA,EAClC,MAAM,YAAY,WAAW,OAAO,KAAK,MAAM,EAAE,SAAS,KAAK;AAAA,EAC/D,MAAM,cAAc,UAAU,gBAAgB,UAAU,SAAS,MAAM,IACpE,eACA;AAAA,EAGH,MAAM,WACL,YAAY,SACX,UACA,OAAO,WAAW,YAClB,QAAQ,UACR,OAAO,OAAO;AAAA,EAChB,MAAM,eACL,OAAO,YAAY,UAAU,WAC1B,YAAY,QACZ,UACA,OAAO,WAAW,aAClB,WAAW,WACX,OAAO,OAAO,UAAU,WACvB,OAAO,QACP;AAAA,EACL,MAAM,aACL,UACA,OAAO,WAAW,YAClB,WAAW,UACX,OAAO,OAAO,UAAU,WACrB,OAAO,QACP;AAAA,EAEJ,uBACC,OA2DE,OA3DF;AAAA,IAAK,WAAU;AAAA,IAAf,UA2DE;AAAA,sBA1DD,OA2BE,UA3BF;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,WAAW,oDACV,WACG,8EACA;AAAA,QANL,UA2BE;AAAA,0BAlBD,MAAC,eAAD;AAAA,YACC,WAAW,8CAA8C,aAAa,cAAc;AAAA,WACrF;AAAA,UACC,4BACA,MAAC,cAAD;AAAA,YAAa,WAAU;AAAA,WAAuD;AAAA,0BAE/E,OAGE,QAHF;AAAA,YAAM,WAAU;AAAA,YAAhB,UAGE;AAAA,cAFA;AAAA,cACA,WAAW,WAAW;AAAA;AAAA,WACtB;AAAA,UACD,CAAC,2BACD;AAAA,sBAKE;AAAA,8BAJD,MAA2D,QAA3D;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAA2D;AAAA,8BAC3D,MAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UACE;AAAA,eACA;AAAA;AAAA,WACD;AAAA;AAAA,OAEF;AAAA,MACD,cAAc,YAAY,gCAC1B,MAAC,kBAAD;AAAA,QAAkB,OAAO;AAAA,QAAc,OAAO;AAAA,QAAY,WAAS;AAAA,OAAC;AAAA,MAEpE,cAAc,CAAC,YAAY,6BAC3B,OAwBE,OAxBF;AAAA,QAAK,WAAU;AAAA,QAAf,UAwBE;AAAA,UAvBA,6BAAa,MAAC,cAAD;AAAA,YAAc;AAAA,WAAgB;AAAA,UAC3C,CAAC,6BACD,MAmBE,OAnBF;AAAA,YAAK,WAAU;AAAA,YAAf,0BACC,MAiBE,OAjBF;AAAA,cAAK,WAAU;AAAA,cAAf,0BACC,MAeE,oBAfF;AAAA,gBACC,UAAS;AAAA,gBACT,OAAO;AAAA,gBACP,aAAa;AAAA,kBACZ,QAAQ;AAAA,kBACR,SAAS;AAAA,kBACT,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,YAAY;AAAA,kBACZ,UAAU;AAAA,gBACX;AAAA,gBACA,WAAS;AAAA,gBACT,eAAa;AAAA,gBAZd,UAcE,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,eAC9B;AAAA,aACD;AAAA,WACD;AAAA;AAAA,OAEF;AAAA;AAAA,GAEF;AAAA;;;;AChHG,SAAS,aAAa;AAAA,EAC5B;AAAA,EACA;AAAA,GACwC;AAAA,EACxC,uBACC,MAQE,OARF;AAAA,IAAK,WAAU;AAAA,IAAf,0BACC,OAME,OANF;AAAA,MAAK,WAAU;AAAA,MAAf,UAME;AAAA,wBALD,OAA+B,OAA/B;AAAA,oBAA+B;AAAA,YAA/B;AAAA,YAAY,YAAY;AAAA;AAAA,SAAO;AAAA,wBAC/B,OAAmC,OAAnC;AAAA,oBAAmC;AAAA,YAAnC;AAAA,YAAgB;AAAA,YAAhB;AAAA;AAAA,SAAmC;AAAA,wBACnC,MAEE,OAFF;AAAA,UAAK,WAAU;AAAA,UAAf,UACE,KAAK,UAAU,aAAa,MAAM,CAAC;AAAA,SACnC;AAAA;AAAA,KACD;AAAA,GACD;AAAA;;;ACfJ,sDAA2C;AAAA;AAapC,SAAS,aAAa,GAAG,eAA8B;AAAA,EAC7D,MAAM,SAAU,YAAY,UAAU,CAAC;AAAA,EACvC,MAAM,QAAQ,OAAO,SAAS,CAAC;AAAA,EAC/B,MAAM,OAAO,OAAO;AAAA,EAEpB,uBACC,MAuCE,OAvCF;AAAA,IAAK,WAAU;AAAA,IAAf,0BACC,OAqCE,OArCF;AAAA,MAAK,WAAU;AAAA,MAAf,UAqCE;AAAA,QApCA,wBACA,MAEE,OAFF;AAAA,UAAK,WAAU;AAAA,UAAf,UACE;AAAA,SACA;AAAA,wBAEH,MA8BE,OA9BF;AAAA,UAAK,WAAU;AAAA,UAAf,UACE,MAAM,IAAI,CAAC,MAAM,wBACjB,OA0BE,OA1BF;AAAA,YAAiC,WAAU;AAAA,YAA3C,UA0BE;AAAA,cAzBA,KAAK,WAAW,+BAChB,MAAC,cAAD;AAAA,gBAAc,WAAU;AAAA,eAAsE;AAAA,cAE9F,KAAK,WAAW,iCAChB,MAAC,YAAD;AAAA,gBAAY,WAAU;AAAA,eAA8E;AAAA,cAEpG,KAAK,WAAW,6BAChB,MAAC,QAAD;AAAA,gBAAQ,WAAU;AAAA,eAAqD;AAAA,cAEvE,KAAK,WAAW,+BAChB,MAAC,UAAD;AAAA,gBAAS,WAAU;AAAA,eAAwD;AAAA,8BAE5E,MAYE,QAZF;AAAA,gBACC,WAAW,WACV,KAAK,WAAW,cACb,uCACA,KAAK,WAAW,gBACf,oBACA,KAAK,WAAW,cACf,0CACA;AAAA,gBARP,UAWE,KAAK;AAAA,eACL;AAAA;AAAA,aAzBO,GAAG,KAAK,QAAQ,KA0BxB,CACF;AAAA,SACA;AAAA;AAAA,KACD;AAAA,GACD;AAAA;;;;ACxDG,SAAS,sBAAsB,GAAG,eAA8B;AAAA,EACtE,MAAM,SAAS,YAAY,UAAU,CAAC;AAAA,EACtC,MAAM,UAAU,OAAO,OAAO,WAAW,eAAe;AAAA,EACxD,MAAM,QAAQ,OAAO,QAAQ,OAAO,OAAO,KAAK,IAAI;AAAA,EACpD,MAAM,MAAM,OAAO,MAAM,OAAO,OAAO,GAAG,IAAI;AAAA,EAE9C,uBACC,OAME,OANF;AAAA,IAAK,WAAU;AAAA,IAAf,UAME;AAAA,MALA,yBAAS,OAAsD,QAAtD;AAAA,QAAM,WAAU;AAAA,QAAhB,UAAsD;AAAA,UAAtD;AAAA,UAA6C;AAAA,UAA7C;AAAA;AAAA,OAAsD;AAAA,sBAChE,MAAiB,QAAjB;AAAA,kBAAO;AAAA,OAAU;AAAA,MAChB,QAAQ,6BACR,OAAqD,QAArD;AAAA,QAAM,WAAU;AAAA,QAAhB,UAAqD;AAAA,UAArD;AAAA,UAA6C;AAAA,UAA7C;AAAA;AAAA,OAAqD;AAAA;AAAA,GAErD;AAAA;;;ACfJ,gCAAgB;;AAwBT,SAAS,iBAAiB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACiB;AAAA,EACjB,MAAM,SAAS,YAAY,UAAU,CAAC;AAAA,EACtC,MAAM,OAAQ,YAAY,QAAQ,CAAC;AAAA,EACnC,MAAM,UAAU,eAAe,cAAc;AAAA,EAE7C,MAAM,WAAW,YAAY,MAAM,KAAK,CAAC,CAAC,YAAY;AAAA,EACtD,MAAM,eACL,gBAAgB,MAAM,MACrB,OAAO,YAAY,UAAU,WAAW,YAAY,QAAQ;AAAA,EAC9D,MAAM,aACL,UAAU,OAAO,WAAW,YAAY,WAAW,SAChD,OAAO,OAAO,KAAK,IACnB;AAAA,EAEJ,MAAM,WAAW,aAAa;AAAA,EAC9B,MAAM,gBAAiB,OAAO,WAA8B,CAAC;AAAA,EAC7D,MAAM,aAAa;AAAA,EAEnB,MAAM,QAAQ,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAAA,EAC5D,MAAM,MAAM,OAAO,KAAK,QAAQ,WAAW,KAAK,MAAM,WAAW;AAAA,EAEjE,IAAI,UAAU;AAAA,IACb,uBACC,OA0FE,OA1FF;AAAA,MAAK,WAAU;AAAA,MAAf,UA0FE;AAAA,wBAzFD,OA0BE,YA1BF;AAAA,UACC,UAAS;AAAA,UACT;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT,cAAa;AAAA,UACb,WAAW;AAAA,UANZ,UA0BE;AAAA,YAlBA,yBACA;AAAA,wBAQE;AAAA,gCAPD,MAAC,qBAAD,EAAqB;AAAA,gCACrB,OAKE,QALF;AAAA,kBACC,WAAU;AAAA,kBACV,OAAO;AAAA,kBAFR,UAKE;AAAA,oBALF;AAAA,oBAIG,MAAM,SAAS,KAAK,GAAG,MAAM,MAAM,GAAG,EAAE,OAAM;AAAA,oBAJjD;AAAA;AAAA,iBAKE;AAAA;AAAA,aACD;AAAA,4BAEH,MAAC,qBAAD,EAAqB;AAAA,4BACrB,OAGE,kBAHF;AAAA,wBAGE;AAAA,gBAFA,cAAc;AAAA,gBAAQ;AAAA,gBACtB,cAAc,WAAW,IAAI,WAAW;AAAA;AAAA,aACxC;AAAA,4BACF,MAAC,qBAAD,EAAqB;AAAA,4BACrB,MAA2B,gBAA3B;AAAA,wBAAiB;AAAA,aAAU;AAAA;AAAA,SAC1B;AAAA,QAED,cAAc,YAAY,gCAC1B,MAAC,kBAAD;AAAA,UAAkB,OAAO;AAAA,UAAc,OAAO;AAAA,UAAY,WAAS;AAAA,SAAC;AAAA,QAGpE,cAAc,CAAC,4BACf,OAsDE,OAtDF;AAAA,UAAK,WAAU;AAAA,UAAf,UAsDE;AAAA,4BArDD,MASE,gBATF;AAAA,cACC,OAAM;AAAA,cACN,sBAAM,MAAC,OAAD;AAAA,gBAAO,WAAU;AAAA,eAAU;AAAA,cACjC,UAAU;AAAA,cACV,WAAU;AAAA,cAJX,0BAMC,MAEE,OAFF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UACE,SAAS;AAAA,eACT;AAAA,aACD;AAAA,YAED,cAAc,SAAS,qBACvB,MA+BE,gBA/BF;AAAA,cACC,OAAM;AAAA,cACN,UAAU,cACR,IAAI,CAAC,MAAM,GAAG,EAAE;AAAA,EAAU,EAAE,KAAK,EACjC,KAAK;AAAA;AAAA,CAAM;AAAA,cACb,WAAU;AAAA,cALX,0BAOC,MAuBE,OAvBF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UACE,cAAc,IAAI,CAAC,MAAM,sBACzB,OAmBE,OAnBF;AAAA,kBAEC,WAAU;AAAA,kBAFX,UAmBE;AAAA,oCAfD,OAQE,KARF;AAAA,sBACC,MAAM,KAAK;AAAA,sBACX,QAAO;AAAA,sBACP,KAAI;AAAA,sBACJ,WAAU;AAAA,sBAJX,UAQE;AAAA,wBAFA,KAAK;AAAA,wCACN,MAAC,eAAD;AAAA,0BAAc,WAAU;AAAA,yBAAwB;AAAA;AAAA,qBAC/C;AAAA,oCACF,MAEE,KAFF;AAAA,sBAAG,WAAU;AAAA,sBAAb,UACE,KAAK;AAAA,qBACL;AAAA,oCACF,MAEE,KAFF;AAAA,sBAAG,WAAU;AAAA,sBAAb,UACE,KAAK;AAAA,qBACL;AAAA;AAAA,mBAjBG,GAAG,KAAK,OAAO,GAkBnB,CACF;AAAA,eACA;AAAA,aACD;AAAA,YAGF,cAAc,WAAW,qBACzB,MAIE,gBAJF;AAAA,cAAgB,OAAM;AAAA,cAAU,WAAU;AAAA,cAA1C,0BACC,MAEE,OAFF;AAAA,gBAAK,WAAU;AAAA,gBAAf;AAAA,eAEE;AAAA,aACD;AAAA;AAAA,SAEF;AAAA;AAAA,KAEF;AAAA,EAEJ;AAAA,EAEA,MAAM,aAAa,OAAO,IAAI,SAAS,KAAK,GAAG,IAAI,MAAM,GAAG,EAAE,SAAS;AAAA,EAEvE,uBACC,OAkEE,OAlEF;AAAA,IAAK,WAAU;AAAA,IAAf,UAkEE;AAAA,sBAjED,OAkBE,YAlBF;AAAA,QACC,UAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,cAAa;AAAA,QACb,WAAW;AAAA,QANZ,UAkBE;AAAA,UAVA,8BACA;AAAA,sBAKE;AAAA,8BAJD,MAAC,qBAAD,EAAqB;AAAA,8BACrB,MAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAsC,OAAO;AAAA,gBAA7D,UACE;AAAA,eACA;AAAA;AAAA,WACD;AAAA,0BAEH,MAAC,qBAAD,EAAqB;AAAA,0BACrB,MAA2B,gBAA3B;AAAA,sBAAiB;AAAA,WAAU;AAAA;AAAA,OAC1B;AAAA,MAED,cAAc,YAAY,gCAC1B,MAAC,kBAAD;AAAA,QAAkB,OAAO;AAAA,QAAc,OAAO;AAAA,QAAY,WAAS;AAAA,OAAC;AAAA,MAGpE,cAAc,CAAC,4BACf,OAsCE,OAtCF;AAAA,QAAK,WAAU;AAAA,QAAf,UAsCE;AAAA,0BArCD,MAgBE,gBAhBF;AAAA,YACC,OAAM;AAAA,YACN,sBAAM,MAAC,MAAD;AAAA,cAAM,WAAU;AAAA,aAAU;AAAA,YAChC,UAAU;AAAA,YACV,WAAU;AAAA,YAJX,0BAMC,MASE,OATF;AAAA,cAAK,WAAU;AAAA,cAAf,0BACC,MAOE,KAPF;AAAA,gBACC,MAAM;AAAA,gBACN,QAAO;AAAA,gBACP,KAAI;AAAA,gBACJ,WAAU;AAAA,gBAJX,UAME;AAAA,eACA;AAAA,aACD;AAAA,WACD;AAAA,UAED,WAAW,2BACX,MAQE,gBARF;AAAA,YACC,OAAM;AAAA,YACN,UAAU,WAAW;AAAA,YACrB,WAAU;AAAA,YAHX,0BAKC,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf,UACE,WAAW;AAAA,aACX;AAAA,WACD;AAAA,UAGF,CAAC,WAAW,2BACZ,MAIE,gBAJF;AAAA,YAAgB,OAAM;AAAA,YAAU,WAAU;AAAA,YAA1C,0BACC,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAEE;AAAA,WACD;AAAA;AAAA,OAEF;AAAA;AAAA,GAEF;AAAA;;;ACtNJ,qBAAS;AAET;AAAA,iBACC;AAAA,kBACA;AAAA,eACA;AAAA,gBACA;AAAA;AAAA;AAAA;AAaM,SAAS,aAAa;AAAA,EAC5B;AAAA,EACA,OAAO;AAAA,EACP,WAAW;AAAA,EACX;AAAA,EACA;AAAA,GACsB;AAAA,EACtB,OAAO,gBAAgB,qBAAqB,WAAS,KAAK;AAAA,EAG1D,MAAM,eACL,YAAY,SAAS,iBACrB,YAAY,cAAc;AAAA,EAC3B,MAAM,oBACL,YAAY,SAAS,6BACrB,YAAY,cAAc;AAAA,EAC3B,MAAM,eAAe,YAAY,gBAAgB,QAAQ;AAAA,EAOzD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI,YAAY;AAAA,EAGhB,IAAI,YAAY,SAAS,OAAO,YAAY,UAAU,UAAU;AAAA,IAC/D,eAAe,YAAY;AAAA,IAE3B,IAAI,aAAa,WAAW,OAAO,aAAa,YAAY,UAAU;AAAA,MACrE,eAAe,aAAa;AAAA,IAC7B;AAAA,IACA,IAAI,aAAa,QAAQ,OAAO,aAAa,SAAS,UAAU;AAAA,MAC/D,YAAY,aAAa;AAAA,IAC1B;AAAA,EACD,EAEK,SAAI,YAAY,WAAW,OAAO,YAAY,YAAY,UAAU;AAAA,IACxE,eAAe,YAAY;AAAA,IAC3B,IAAI,YAAY,WAAW,OAAO,YAAY,YAAY,UAAU;AAAA,MACnE,eAAe,YAAY;AAAA,IAC5B;AAAA,IACA,IAAI,YAAY,QAAQ,OAAO,YAAY,SAAS,UAAU;AAAA,MAC7D,YAAY,YAAY;AAAA,IACzB;AAAA,IACA,IAAI,YAAY,cAAc,MAAM;AAAA,MACnC,YAAY;AAAA,IACb;AAAA,EACD,EAEK;AAAA,IACJ,IAAI,YAAY,WAAW,OAAO,YAAY,YAAY,UAAU;AAAA,MACnE,eAAe,YAAY;AAAA,IAC5B;AAAA,IACA,IAAI,YAAY,QAAQ,OAAO,YAAY,SAAS,UAAU;AAAA,MAC7D,YAAY,YAAY;AAAA,IACzB;AAAA,IACA,IAAI,YAAY,cAAc,MAAM;AAAA,MACnC,YAAY;AAAA,IACb;AAAA,IAEA,eAAe;AAAA;AAAA,EAIhB,IAAI;AAAA,EACJ,IACC,cAAc,gBACd,OAAO,aAAa,iBAAiB,UACpC;AAAA,IACD,IAAI;AAAA,MACH,MAAM,SAAS,KAAK,MAAM,aAAa,YAAY;AAAA,MACnD,IAAI,OAAO,SAAS,OAAO,OAAO,UAAU,UAAU;AAAA,QACrD,WAAW;AAAA,UACV,MACC,OAAO,OAAO,MAAM,SAAS,WAC1B,OAAO,MAAM,OACb;AAAA,UACJ,SACC,OAAO,OAAO,MAAM,YAAY,WAC7B,OAAO,MAAM,UACb;AAAA,UACJ,MACC,OAAO,OAAO,MAAM,SAAS,WAC1B,OAAO,MAAM,OACb;AAAA,QACL;AAAA,MACD;AAAA,MACC,MAAM;AAAA,EAGT;AAAA,EAEA,MAAM,iBACL,OAAO,cAAc,OAAO,EAAE,EAAE,SAAS,mBAAmB,KAC5D,OAAO,gBAAgB,EAAE,EACvB,YAAY,EACZ,SAAS,eAAe;AAAA,EAE3B,MAAM,yBAAyB,OAC9B,UAAU,WAAW,gBAAgB,EACtC,EAAE,YAAY;AAAA,EAEd,MAAM,sBACL,mBACC,UAAU,SAAS,yBACnB,uBAAuB,SAAS,wBAAwB,KACxD,uBAAuB,SACtB,mDACD;AAAA,EAEF,MAAM,yBACL,UAAU,SACP,YAAY,EACb,SAAS,0CAA0C,KACrD,OAAO,cAAc,OAAO,EAAE,EAAE,SAAS,mBAAmB;AAAA,EAE7D,IAAI,wBAAwB;AAAA,IAC3B,MAAM,QAAS,cAAc,mBAC1B;AAAA,IACH,uBACC,OAoCE,OApCF;AAAA,MAAK,WAAU;AAAA,MAAf,UAoCE;AAAA,wBAnCD,OAsBE,OAtBF;AAAA,UAAK,WAAU;AAAA,UAAf,UAsBE;AAAA,4BArBD,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAEE;AAAA,4BACF,MAYE,KAZF;AAAA,cAAG,WAAU;AAAA,cAAb,UACE,wBACA;AAAA,0BAME;AAAA,kCALD,MAEE,QAFF;AAAA,oBAAM,WAAU;AAAA,oBAAhB,UACE,OAAO,KAAK;AAAA,mBACZ;AAAA,kBAAM;AAAA,kBAHT;AAAA;AAAA,eAME,IAEF;AAAA,aAEA;AAAA,4BACF,MAIE,KAJF;AAAA,cAAG,WAAU;AAAA,cAAb;AAAA,aAIE;AAAA;AAAA,SACD;AAAA,QACD,2BACA,MASE,OATF;AAAA,UAAK,WAAU;AAAA,UAAf,0BACC,OAOE,UAPF;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,WAAU;AAAA,YAHX,UAOE;AAAA,8BAFD,MAAC,YAAD;AAAA,gBAAW,WAAU;AAAA,eAAU;AAAA,cALhC;AAAA;AAAA,WAOE;AAAA,SACD;AAAA;AAAA,KAEF;AAAA,EAEJ;AAAA,EAEA,IAAI,qBAAqB;AAAA,IACxB,MAAM,QAAS,cAAc,mBAC1B;AAAA,IACH,uBACC,OAkDE,OAlDF;AAAA,MAAK,WAAU;AAAA,MAAf,UAkDE;AAAA,wBAjDD,OAoCE,OApCF;AAAA,UAAK,WAAU;AAAA,UAAf,UAoCE;AAAA,4BAnCD,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAEE;AAAA,4BACF,MAWE,KAXF;AAAA,cAAG,WAAU;AAAA,cAAb,UACE,wBACA;AAAA,0BAKE;AAAA,kCAJD,MAEE,QAFF;AAAA,oBAAM,WAAU;AAAA,oBAAhB,UACE,OAAO,KAAK;AAAA,mBACZ;AAAA,kBAAM;AAAA,kBAHT;AAAA;AAAA,eAKE,IAEF;AAAA,aAEA;AAAA,4BACF,MAGE,KAHF;AAAA,cAAG,WAAU;AAAA,cAAb;AAAA,aAGE;AAAA,4BACF,OAeE,KAfF;AAAA,cAAG,WAAU;AAAA,cAAb,UAeE;AAAA,gBAfF;AAAA,gBACyB;AAAA,gCACxB,MAWE,KAXF;AAAA,kBACC,MAAK;AAAA,kBACL,QAAO;AAAA,kBACP,KAAI;AAAA,kBACJ,WAAU;AAAA,kBACV,SAAS,CAAC,MAAM;AAAA,oBACf,EAAE,eAAe;AAAA,oBACjB,QAAQ,qCAAqC;AAAA;AAAA,kBAP/C;AAAA,iBAWE;AAAA,gBAbH;AAAA;AAAA,aAeE;AAAA;AAAA,SACD;AAAA,QACD,2BACA,MASE,OATF;AAAA,UAAK,WAAU;AAAA,UAAf,0BACC,OAOE,UAPF;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,WAAU;AAAA,YAHX,UAOE;AAAA,8BAFD,MAAC,YAAD;AAAA,gBAAW,WAAU;AAAA,eAAU;AAAA,cALhC;AAAA;AAAA,WAOE;AAAA,SACD;AAAA;AAAA,KAEF;AAAA,EAEJ;AAAA,EAGA,IAAI,cAAc;AAAA,IACjB,uBACC,OAoBE,OApBF;AAAA,MAAK,WAAU;AAAA,MAAf,UAoBE;AAAA,wBAnBD,OAGE,OAHF;AAAA,UAAK,WAAU;AAAA,UAAf,UAGE;AAAA,4BAFD,MAAC,aAAD;AAAA,cAAY,WAAU;AAAA,aAAyB;AAAA,4BAC/C,MAA+D,QAA/D;AAAA,cAAM,WAAU;AAAA,cAAhB;AAAA,aAA+D;AAAA;AAAA,SAC9D;AAAA,wBACF,MAEE,KAFF;AAAA,UAAG,WAAU;AAAA,UAAb;AAAA,SAEE;AAAA,QACD,2BACA,MASE,OATF;AAAA,UAAK,WAAU;AAAA,UAAf,0BACC,OAOE,UAPF;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,WAAU;AAAA,YAHX,UAOE;AAAA,8BAFD,MAAC,YAAD;AAAA,gBAAW,WAAU;AAAA,eAAU;AAAA,cALhC;AAAA;AAAA,WAOE;AAAA,SACD;AAAA;AAAA,KAEF;AAAA,EAEJ;AAAA,EAEA,IAAI,mBAAmB;AAAA,IACtB,uBACC,OAiCE,OAjCF;AAAA,MAAK,WAAU;AAAA,MAAf,UAiCE;AAAA,wBAhCD,OAKE,OALF;AAAA,UAAK,WAAU;AAAA,UAAf,UAKE;AAAA,4BAJD,MAAC,UAAD;AAAA,cAAU,WAAU;AAAA,aAAyB;AAAA,4BAC7C,MAEE,QAFF;AAAA,cAAM,WAAU;AAAA,cAAhB;AAAA,aAEE;AAAA;AAAA,SACD;AAAA,wBACF,MAGE,KAHF;AAAA,UAAG,WAAU;AAAA,UAAb;AAAA,SAGE;AAAA,wBACF,OAqBE,OArBF;AAAA,UAAK,WAAU;AAAA,UAAf,UAqBE;AAAA,YApBA,6BACA,OAOE,UAPF;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,WAAU;AAAA,cAHX,UAOE;AAAA,gCAFD,MAAC,UAAD;AAAA,kBAAU,WAAU;AAAA,iBAAU;AAAA,gBAL/B;AAAA;AAAA,aAOE;AAAA,YAEF,2BACA,OAOE,UAPF;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,WAAU;AAAA,cAHX,UAOE;AAAA,gCAFD,MAAC,YAAD;AAAA,kBAAW,WAAU;AAAA,iBAAU;AAAA,gBALhC;AAAA;AAAA,aAOE;AAAA;AAAA,SAEF;AAAA;AAAA,KACD;AAAA,EAEJ;AAAA,EAGA,MAAM,cAAc,CAAC,UAAsC;AAAA,IAC1D,IAAI,UAAU,QAAQ,UAAU,WAAW;AAAA,MAC1C,uBAAO,MAA8C,QAA9C;AAAA,QAAM,WAAU;AAAA,QAAhB;AAAA,OAA8C;AAAA,IACtD;AAAA,IACA,IAAI,OAAO,UAAU,WAAW;AAAA,MAC/B,uBACC,MAEE,QAFF;AAAA,QAAM,WAAU;AAAA,QAAhB,UACE,OAAO,KAAK;AAAA,OACZ;AAAA,IAEJ;AAAA,IACA,IAAI,OAAO,UAAU,UAAU;AAAA,MAC9B,uBAAO,MAA4D,QAA5D;AAAA,QAAM,WAAU;AAAA,QAAhB,UAAoD;AAAA,OAAQ;AAAA,IACpE;AAAA,IACA,IAAI,OAAO,UAAU,UAAU;AAAA,MAE9B,IAAI,MAAM,WAAW,GAAG,KAAK,MAAM,WAAW,GAAG,GAAG;AAAA,QACnD,IAAI;AAAA,UACH,MAAM,SAAS,KAAK,MAAM,KAAK;AAAA,UAC/B,uBACC,MAEE,OAFF;AAAA,YAAK,WAAU;AAAA,YAAf,0BACC,MAAyC,QAAzC;AAAA,wBAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,aAAI;AAAA,WACxC;AAAA,UAEF,MAAM;AAAA,MAGT;AAAA,MACA,uBAAO,MAA2C,QAA3C;AAAA,QAAM,WAAU;AAAA,QAAhB,UAAmC;AAAA,OAAQ;AAAA,IACnD;AAAA,IACA,IAAI,OAAO,UAAU,UAAU;AAAA,MAC9B,uBACC,MAEE,OAFF;AAAA,QAAK,WAAU;AAAA,QAAf,0BACC,MAAwC,QAAxC;AAAA,oBAAO,KAAK,UAAU,OAAO,MAAM,CAAC;AAAA,SAAI;AAAA,OACvC;AAAA,IAEJ;AAAA,IACA,uBAAO,MAAmD,QAAnD;AAAA,MAAM,WAAU;AAAA,MAAhB,UAAmC,OAAO,KAAK;AAAA,KAAI;AAAA;AAAA,EAG3D,MAAM,kBAAkB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAAA,EACA,MAAM,iBAAiB,IAAI;AAAA,EAE3B,uBACC,OA2GE,OA3GF;AAAA,IAAK,WAAU;AAAA,IAAf,UA2GE;AAAA,MA1GA,6BACA,MAEE,OAFF;AAAA,QAAK,WAAU;AAAA,QAAf;AAAA,OAEE;AAAA,MAIF,UAAU,2BACV,OAUE,OAVF;AAAA,QAAK,WAAU;AAAA,QAAf,UAUE;AAAA,0BATD,MAEE,OAFF;AAAA,YAAK,WAAU;AAAA,YAAf;AAAA,WAEE;AAAA,0BACF,MAAqD,OAArD;AAAA,YAAK,WAAU;AAAA,YAAf,UAAkC,SAAS;AAAA,WAAU;AAAA,UACpD,SAAS,wBACT,OAEE,OAFF;AAAA,YAAK,WAAU;AAAA,YAAf,UAEE;AAAA,cAFF;AAAA,cACQ,SAAS;AAAA;AAAA,WACf;AAAA;AAAA,OAEF;AAAA,MAIF,CAAC,UAAU,WAAW,gCACtB,OAUE,OAVF;AAAA,QAAK,WAAU;AAAA,QAAf,UAUE;AAAA,0BATD,MAEE,OAFF;AAAA,YAAK,WAAU;AAAA,YAAf;AAAA,WAEE;AAAA,0BACF,MAAiD,OAAjD;AAAA,YAAK,WAAU;AAAA,YAAf,UAAkC;AAAA,WAAe;AAAA,UAChD,6BACA,OAEE,OAFF;AAAA,YAAK,WAAU;AAAA,YAAf,UAEE;AAAA,cAFF;AAAA,cACQ;AAAA;AAAA,WACN;AAAA;AAAA,OAEF;AAAA,MAIF,2BACA,MASE,OATF;AAAA,QAAK,WAAU;AAAA,QAAf,0BACC,OAOE,UAPF;AAAA,UACC,MAAK;AAAA,UACL,SAAS;AAAA,UACT,WAAU;AAAA,UAHX,UAOE;AAAA,4BAFD,MAAC,YAAD;AAAA,cAAW,WAAU;AAAA,aAAU;AAAA,YALhC;AAAA;AAAA,SAOE;AAAA,OACD;AAAA,MAIF,gCACA,MAcE,OAdF;AAAA,QAAK,WAAU;AAAA,QAAf,UACE,gBAAgB,IAAI,CAAC,UAAU;AAAA,UAC/B,MAAM,QAAQ,aAAa;AAAA,UAC3B,IAAI,UAAU,aAAa,UAAU;AAAA,YAAM,OAAO;AAAA,UAClD,eAAe,IAAI,KAAK;AAAA,UACxB,uBACC,OAKE,OALF;AAAA,YAAiB,WAAU;AAAA,YAA3B,UAKE;AAAA,8BAJD,OAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UAEE;AAAA,kBADA;AAAA,kBADF;AAAA;AAAA,eAEE;AAAA,cACD,YAAY,KAAK;AAAA;AAAA,aAJT,KAKR;AAAA,SAEH;AAAA,OACA;AAAA,MAIF,gCACA,OAoBE,OApBF;AAAA,QAAK,WAAU;AAAA,QAAf,UAoBE;AAAA,0BAnBD,OAWE,UAXF;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM,kBAAkB,CAAC,cAAc;AAAA,YAChD,WAAU;AAAA,YAHX,UAWE;AAAA,cANA,iCACA,MAAC,cAAD;AAAA,gBAAa,WAAU;AAAA,eAAU,oBAEjC,MAAC,eAAD;AAAA,gBAAc,WAAU;AAAA,eAAU;AAAA,cAElC,iBAAiB,SAAS;AAAA,cAV5B;AAAA;AAAA,WAWE;AAAA,UACD,kCACA,MAIE,OAJF;AAAA,YAAK,WAAU;AAAA,YAAf,0BACC,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf,0BACC,MAA+C,QAA/C;AAAA,0BAAO,KAAK,UAAU,cAAc,MAAM,CAAC;AAAA,eAAI;AAAA,aAC9C;AAAA,WACD;AAAA;AAAA,OAEF;AAAA,MAGF,0BACA,OASE,WATF;AAAA,QAAS,WAAU;AAAA,QAAnB,UASE;AAAA,0BARD,MAEE,WAFF;AAAA,YAAS,WAAU;AAAA,YAAnB;AAAA,WAEE;AAAA,0BACF,MAIE,OAJF;AAAA,YAAK,WAAU;AAAA,YAAf,0BACC,MAEE,QAFF;AAAA,wBACE,KAAK,UAAU,EAAE,aAAa,cAAc,SAAS,GAAG,MAAM,CAAC;AAAA,aAC/D;AAAA,WACD;AAAA;AAAA,OACD;AAAA;AAAA,GAEF;AAAA;;;ACndJ,yBAAS,gCAAqB;;AAuD9B,SAAS,UAAU,CAAC,WAA4B;AAAA,EAC/C,IAAI,CAAC;AAAA,IAAW,OAAO;AAAA,EACvB,MAAM,OAAO,IAAI,KAAK,SAAS;AAAA,EAC/B,OAAO,KAAK,mBAAmB,WAAW;AAAA,IACzC,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,EACT,CAAC;AAAA;AAGF,SAAS,WAAW;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,GAKE;AAAA,EACF,IAAI,SAAS;AAAA,IACZ,uBACC,OAYE,UAZF;AAAA,MACC,MAAK;AAAA,MACL,SAAS,MAAM,aAAa,QAAQ,EAAE;AAAA,MACtC,UAAU,CAAC;AAAA,MACX,WAAU;AAAA,MAJX,UAYE;AAAA,wBAND,MAEE,QAFF;AAAA,UAAM,WAAU;AAAA,UAAhB,UACE,QAAQ,SAAS;AAAA,SACjB;AAAA,QACD,8BACA,MAAC,eAAD;AAAA,UAAc,WAAU;AAAA,SAA8C;AAAA;AAAA,KAEtE;AAAA,EAEJ;AAAA,EAEA,uBACC,OAmCE,UAnCF;AAAA,IACC,MAAK;AAAA,IACL,SAAS,MAAM,aAAa,QAAQ,EAAE;AAAA,IACtC,UAAU,CAAC;AAAA,IACX,WAAU;AAAA,IAJX,UAmCE;AAAA,sBA7BD,OAOE,OAPF;AAAA,QAAK,WAAU;AAAA,QAAf,UAOE;AAAA,0BAND,MAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UACE,QAAQ,SAAS;AAAA,WACjB;AAAA,UACD,8BACA,MAAC,eAAD;AAAA,YAAc,WAAU;AAAA,WAAmG;AAAA;AAAA,OAE3H;AAAA,sBACF,OAoBE,OApBF;AAAA,QAAK,WAAU;AAAA,QAAf,UAoBE;AAAA,UAnBA,QAAQ,yBACR,MAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UACE,QAAQ;AAAA,WACR;AAAA,UAEF,QAAQ,SAAS,QAAQ,4BAAY,MAAQ,QAAR;AAAA;AAAA,WAAQ;AAAA,UAC7C,QAAQ,4BAAY,MAA0B,QAA1B;AAAA,sBAAO,QAAQ;AAAA,WAAW;AAAA,UAC9C,QAAQ,iBAAiB,6BACzB;AAAA,sBAGE;AAAA,8BAFD,MAAQ,QAAR;AAAA;AAAA,eAAQ;AAAA,8BACR,OAAmC,QAAnC;AAAA,0BAAmC;AAAA,kBAA5B,QAAQ;AAAA,kBAAf;AAAA;AAAA,eAAmC;AAAA;AAAA,WAClC;AAAA,UAEF,QAAQ,6BACR;AAAA,sBAGE;AAAA,8BAFD,MAAQ,QAAR;AAAA;AAAA,eAAQ;AAAA,8BACR,MAAuC,QAAvC;AAAA,0BAAO,WAAW,QAAQ,SAAS;AAAA,eAAI;AAAA;AAAA,WACtC;AAAA;AAAA,OAEF;AAAA;AAAA,GACD;AAAA;AAIJ,SAAS,WAAW;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,GAKE;AAAA,EACF,MAAM,YAAY,eAAe,UAAU,QAAQ,YAAY;AAAA,EAC/D,MAAM,eAAe,kBAAkB,UAAU,QAAQ,eAAe;AAAA,EACxE,MAAM,UACL,aAAa,UACV,QAAQ,WACR,oBAAoB,WACnB,QAAQ,kBACR,oBAAoB,WACnB,QAAQ,iBACR;AAAA,EAEN,IAAI,SAAS;AAAA,IACZ,uBACC,OAYE,UAZF;AAAA,MACC,MAAK;AAAA,MACL,SAAS,MAAM,aAAa,SAAS;AAAA,MACrC,UAAU,CAAC,cAAc,CAAC;AAAA,MAC1B,WAAU;AAAA,MAJX,UAYE;AAAA,wBAND,MAEE,QAFF;AAAA,UAAM,WAAU;AAAA,UAAhB,UACE,SAAS,MAAM,GAAG,EAAE,KAAK,gBAAgB,UAAU,MAAM,GAAG,CAAC;AAAA,SAC7D;AAAA,QACD,cAAc,6BACd,MAAC,eAAD;AAAA,UAAc,WAAU;AAAA,SAA8C;AAAA;AAAA,KAEtE;AAAA,EAEJ;AAAA,EAEA,uBACC,OA4BE,UA5BF;AAAA,IACC,MAAK;AAAA,IACL,SAAS,MAAM,aAAa,SAAS;AAAA,IACrC,UAAU,CAAC,cAAc,CAAC;AAAA,IAC1B,WAAU;AAAA,IAJX,UA4BE;AAAA,sBAtBD,OAOE,OAPF;AAAA,QAAK,WAAU;AAAA,QAAf,UAOE;AAAA,0BAND,MAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UACE,gBAAgB,UAAU,MAAM,GAAG,CAAC;AAAA,WACpC;AAAA,UACD,cAAc,6BACd,MAAC,eAAD;AAAA,YAAc,WAAU;AAAA,WAAmG;AAAA;AAAA,OAE3H;AAAA,MACD,2BACA,MAEE,OAFF;AAAA,QAAK,WAAU;AAAA,QAAf,UACE;AAAA,OACA;AAAA,sBAEH,OAQE,OARF;AAAA,QAAK,WAAU;AAAA,QAAf,UAQE;AAAA,UAPA,QAAQ,wBAAQ,MAA6C,QAA7C;AAAA,YAAM,WAAU;AAAA,YAAhB,UAA8B,QAAQ;AAAA,WAAO;AAAA,UAC7D,QAAQ,6BACR;AAAA,sBAGE;AAAA,8BAFD,MAAQ,QAAR;AAAA;AAAA,eAAQ;AAAA,8BACR,MAAuC,QAAvC;AAAA,0BAAO,WAAW,QAAQ,SAAS;AAAA,eAAI;AAAA;AAAA,WACtC;AAAA;AAAA,OAEF;AAAA;AAAA,GACD;AAAA;AAIJ,SAAS,WAAW;AAAA,EACnB;AAAA,EACA;AAAA,GAIE;AAAA,EACF,MAAM,YAAY,CAAC,KAAa,UAAmB;AAAA,IAClD,IAAI,UAAU,aAAa,UAAU;AAAA,MAAM,OAAO;AAAA,IAClD,IAAI,OAAO,UAAU,aAAa,CAAC;AAAA,MAAO,OAAO;AAAA,IACjD,IAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW;AAAA,MAAG,OAAO;AAAA,IAEvD,uBACC,OAQE,QARF;AAAA,MAEC,WAAU;AAAA,MAFX,UAQE;AAAA,wBAJD,OAAqC,QAArC;AAAA,UAAM,WAAU;AAAA,UAAhB,UAAqC;AAAA,YAAP;AAAA,YAA9B;AAAA;AAAA,SAAqC;AAAA,wBACrC,MAEE,QAFF;AAAA,UAAM,WAAU;AAAA,UAAhB,UACE,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,KAAK;AAAA,SACxD;AAAA;AAAA,OANG,GAOJ;AAAA;AAAA,EAIJ,MAAM,gBAA0C;AAAA,IAC/C,gBAAgB,CAAC,SAAS,eAAe,aAAa,SAAS;AAAA,IAC/D,gBAAgB,CAAC,aAAa,QAAQ,UAAU,UAAU;AAAA,IAC1D,gBAAgB,CAAC,OAAO;AAAA,IACxB,qBAAqB,CAAC,aAAa,iBAAiB;AAAA,IACpD,oBAAoB,CAAC,iBAAiB;AAAA,EACvC;AAAA,EAEA,MAAM,aAAa,cAAc,aAAa,OAAO,KAAK,IAAI,EAAE,MAAM,GAAG,CAAC;AAAA,EAC1E,MAAM,eAAe,WACnB,OAAO,CAAC,MAAM,KAAK,OAAO,aAAa,KAAK,OAAO,IAAI,EACvD,IAAI,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,CAAC,EAChC,OAAO,OAAO;AAAA,EAEhB,IAAI,aAAa,WAAW;AAAA,IAAG,OAAO;AAAA,EAEtC,uBACC,OAGE,OAHF;AAAA,IAAK,WAAU;AAAA,IAAf,UAGE;AAAA,sBAFD,MAAC,QAAD;AAAA,QAAQ,WAAU;AAAA,OAA8C;AAAA,MAC/D;AAAA;AAAA,GACA;AAAA;AAIG,SAAS,oBAAoB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GAC6B;AAAA,EAC7B,MAAM,SAAS,YAAY,UAAU,CAAC;AAAA,EACtC,MAAM,OAAQ,YAAY,QAAQ,CAAC;AAAA,EAEnC,MAAM,eACL,OAAO,WAAW,YAAY,QAAQ,UAAU,OAAO,OAAO;AAAA,EAC/D,MAAM,eACL,gBAAgB,WAAW,UAAU,OAAO,OAAO,UAAU,WAC1D,OAAO,QACP;AAAA,EAEJ,MAAM,UAAU,eAAe,cAAc;AAAA,EAE7C,IAAI,aAAa,kBAAkB;AAAA,IAClC,MAAM,QAAS,OAAyC,SAAS,CAAC;AAAA,IAClE,MAAM,UAAW,OAAgC;AAAA,IACjD,MAAM,QAAS,OAA8B;AAAA,IAE7C,IAAI,MAAM,WAAW,KAAK,CAAC;AAAA,MAAS,OAAO;AAAA,IAE3C,uBACC,OAuCE,OAvCF;AAAA,MAAK,WAAU;AAAA,MAAf,UAuCE;AAAA,QAtCA,yBACA,MAEE,OAFF;AAAA,UAAK,WAAU;AAAA,UAAf,UACE;AAAA,SACA;AAAA,QAEF,2BACA,OAGE,OAHF;AAAA,UAAK,WAAU;AAAA,UAAf,UAGE;AAAA,4BAFD,MAAC,OAAD;AAAA,cAAO,WAAU;AAAA,aAA4B;AAAA,4BAC7C,MAAiB,QAAjB;AAAA,wBAAO;AAAA,aAAU;AAAA;AAAA,SAChB;AAAA,QAEF,MAAM,SAAS,qBACf,MAwBE,OAxBF;AAAA,UAAK,WAAU;AAAA,UAAf,UACE,MAAM,IAAI,CAAC,yBACX,OAoBE,UApBF;AAAA,YACC,MAAK;AAAA,YAEL,SAAS,MAAM,sBAAsB,KAAK,SAAS;AAAA,YACnD,UAAU,CAAC;AAAA,YACX,WAAU;AAAA,YALX,UAoBE;AAAA,8BAbD,OASE,OATF;AAAA,0BASE;AAAA,kCARD,MAEE,OAFF;AAAA,oBAAK,WAAU;AAAA,oBAAf,UACE,KAAK;AAAA,mBACL;AAAA,kBACD,KAAK,+BACL,MAEE,OAFF;AAAA,oBAAK,WAAU;AAAA,oBAAf,UACE,KAAK;AAAA,mBACL;AAAA;AAAA,eAEF;AAAA,cACD,uCACA,MAAC,eAAD;AAAA,gBAAc,WAAU;AAAA,eAA+G;AAAA;AAAA,aAhBnI,KAAK,SAkBT,CACF;AAAA,SACA;AAAA;AAAA,KAEF;AAAA,EAEJ;AAAA,EAEA,MAAM,iBAAiB,MAAM;AAAA,IAC5B,QAAQ;AAAA,WACF,kBAAkB;AAAA,QACtB,MAAM,WACJ,OAA0C,YAAY,CAAC;AAAA,QACzD,MAAM,QAAS,OAA8B;AAAA,QAC7C,OAAO,GAAG,SAAS,iBAAiB,SAAS,WAAW,IAAI,MAAM,KAAK,QAAQ,OAAO,UAAU;AAAA,MACjG;AAAA,WACK,kBAAkB;AAAA,QACtB,MAAM,WACJ,OAA0C,YAAY,CAAC;AAAA,QACzD,OAAO,GAAG,SAAS,iBAAiB,SAAS,WAAW,IAAI,MAAM;AAAA,MACnE;AAAA,WACK,kBAAkB;AAAA,QACtB,MAAM,QAAQ,KAAK;AAAA,QACnB,MAAM,UAAW,OAAwC,WAAW,CAAC;AAAA,QACrE,MAAM,eAAe,QAClB,IAAI,MAAM,MAAM,GAAG,EAAE,IAAI,MAAM,SAAS,KAAK,MAAK,QAClD;AAAA,QACH,OAAO,GAAG,QAAQ,gBAAgB,QAAQ,WAAW,IAAI,MAAM,KAAK,eAAe,QAAQ,iBAAiB;AAAA,MAC7G;AAAA,WACK,uBAAuB;AAAA,QAC3B,MAAM,UAAW,OAAuC;AAAA,QACxD,OACC,SAAS,SACR,KAAgC,WAAW,MAAM,GAAG,CAAC,KACtD;AAAA,MAEF;AAAA,WACK,sBAAsB;AAAA,QAC1B,MAAM,gBAAiB,OACrB;AAAA,QACF,OAAO,eAAe,SAAS;AAAA,MAChC;AAAA;AAAA,QAEC,OAAO;AAAA;AAAA;AAAA,EAIV,MAAM,gBAAgB,MAAM;AAAA,IAC3B,MAAM,UAAU,OAAO,KAAK,IAAI,EAAE,SAAS,KAAK,CAAC;AAAA,IAEjD,QAAQ;AAAA,WACF,kBAAkB;AAAA,QACtB,MAAM,WACJ,OAA0C,YAAY,CAAC;AAAA,QACzD,uBACC,OAuBE,OAvBF;AAAA,UAAK,WAAW,UAAU,QAAQ;AAAA,UAAlC,UAuBE;AAAA,YAtBA,2BAAW,MAAC,aAAD;AAAA,cAAa;AAAA,cAAY;AAAA,aAAoB;AAAA,YACxD,SAAS,WAAW,oBACpB,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAEE,oBAEF,OAcE,OAdF;AAAA,cAAK,WAAW,UAAU,gBAAgB;AAAA,cAA1C,UAcE;AAAA,gBAbA,SAAS,MAAM,GAAG,UAAU,IAAI,EAAE,EAAE,IAAI,CAAC,4BACzC,MAAC,aAAD;AAAA,kBAEC;AAAA,kBACA,YAAY;AAAA,kBACZ;AAAA,mBAHK,QAAQ,EAId,CACA;AAAA,gBACA,SAAS,UAAU,UAAU,IAAI,uBACjC,OAEE,OAFF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAEE;AAAA,oBAFF;AAAA,oBACG,SAAS,UAAU,UAAU,IAAI;AAAA,oBADpC;AAAA;AAAA,iBAEE;AAAA;AAAA,aAEF;AAAA;AAAA,SAEF;AAAA,MAEJ;AAAA,WAEK,kBAAkB;AAAA,QACtB,MAAM,WACJ,OAA0C,YAAY,CAAC;AAAA,QACzD,uBACC,OAuBE,OAvBF;AAAA,UAAK,WAAW,UAAU,QAAQ;AAAA,UAAlC,UAuBE;AAAA,YAtBA,2BAAW,MAAC,aAAD;AAAA,cAAa;AAAA,cAAY;AAAA,aAAoB;AAAA,YACxD,SAAS,WAAW,oBACpB,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAEE,oBAEF,OAcE,OAdF;AAAA,cAAK,WAAW,UAAU,gBAAgB;AAAA,cAA1C,UAcE;AAAA,gBAbA,SAAS,MAAM,GAAG,UAAU,IAAI,EAAE,EAAE,IAAI,CAAC,wBACzC,MAAC,aAAD;AAAA,kBAEC,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ;AAAA,mBAHK,IAAI,EAIV,CACA;AAAA,gBACA,SAAS,UAAU,UAAU,IAAI,uBACjC,OAEE,OAFF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAEE;AAAA,oBAFF;AAAA,oBACG,SAAS,UAAU,UAAU,IAAI;AAAA,oBADpC;AAAA;AAAA,iBAEE;AAAA;AAAA,aAEF;AAAA;AAAA,SAEF;AAAA,MAEJ;AAAA,WAEK,kBAAkB;AAAA,QACtB,MAAM,UAAW,OAAwC,WAAW,CAAC;AAAA,QACrE,MAAM,QAAQ,KAAK;AAAA,QACnB,uBACC,OA6BE,OA7BF;AAAA,UAAK,WAAW,UAAU,QAAQ;AAAA,UAAlC,UA6BE;AAAA,YA5BA,SAAS,CAAC,2BACV,OAIE,OAJF;AAAA,cAAK,WAAU;AAAA,cAAf,UAIE;AAAA,gCAHD,MAAC,SAAD;AAAA,kBAAQ,WAAU;AAAA,iBAA8C;AAAA,gCAChE,MAAgD,QAAhD;AAAA,kBAAM,WAAU;AAAA,kBAAhB;AAAA,iBAAgD;AAAA,gCAChD,OAAyD,QAAzD;AAAA,kBAAM,WAAU;AAAA,kBAAhB,UAAyD;AAAA,oBAAzD;AAAA,oBAAgD;AAAA,oBAAhD;AAAA;AAAA,iBAAyD;AAAA;AAAA,aACxD;AAAA,YAEF,QAAQ,WAAW,oBACnB,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAEE,oBAEF,OAcE,OAdF;AAAA,cAAK,WAAW,UAAU,gBAAgB;AAAA,cAA1C,UAcE;AAAA,gBAbA,QAAQ,MAAM,GAAG,UAAU,IAAI,EAAE,EAAE,IAAI,CAAC,GAAG,sBAC3C,MAAC,aAAD;AAAA,kBAEC,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ;AAAA,mBAHK,GAAG,EAAE,aAAa,EAAE,aAAa,GAIvC,CACA;AAAA,gBACA,QAAQ,UAAU,UAAU,IAAI,uBAChC,OAEE,OAFF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAEE;AAAA,oBAFF;AAAA,oBACG,QAAQ,UAAU,UAAU,IAAI;AAAA,oBADnC;AAAA;AAAA,iBAEE;AAAA;AAAA,aAEF;AAAA;AAAA,SAEF;AAAA,MAEJ;AAAA,WAEK;AAAA,WACA,sBAAsB;AAAA,QAC1B,MAAM,UACL,aAAa,uBACT,OAA6C,gBAC7C,OAAuC;AAAA,QAC5C,MAAM,QACL,OAGC;AAAA,QACF,MAAM,WACL,OAQC;AAAA,QAEF,IAAI,CAAC,SAAS;AAAA,UACb,uBACC,MAIE,OAJF;AAAA,YACC,WAAW,iCAAiC,UAAU,QAAQ;AAAA,YAD/D;AAAA,WAIE;AAAA,QAEJ;AAAA,QAEA,IAAI,SAAS;AAAA,UACZ,uBACC,MAME,OANF;AAAA,YAAK,WAAU;AAAA,YAAf,0BACC,MAAC,aAAD;AAAA,cACC;AAAA,cACA,YAAY;AAAA,cACZ,SAAO;AAAA,aACR;AAAA,WACC;AAAA,QAEJ;AAAA,QAEA,uBACC,OAoCE,OApCF;AAAA,UAAK,WAAU;AAAA,UAAf,UAoCE;AAAA,4BAnCD,MAAC,aAAD;AAAA,cAAa;AAAA,cAAkB,YAAY;AAAA,aAAqB;AAAA,YAE/D,yBACA,OAOE,OAPF;AAAA,cAAK,WAAU;AAAA,cAAf,UAOE;AAAA,gBANA,MAAM,kBAAkB,6BACxB,OAAsC,QAAtC;AAAA,4BAAsC;AAAA,oBAA/B,MAAM;AAAA,oBAAb;AAAA;AAAA,iBAAsC;AAAA,gBAEtC,MAAM,mBAAmB,6BACzB,OAAyC,QAAzC;AAAA,4BAAyC;AAAA,oBAAlC,MAAM;AAAA,oBAAb;AAAA;AAAA,iBAAyC;AAAA;AAAA,aAEzC;AAAA,YAGF,YAAY,SAAS,SAAS,qBAC9B,OAmBE,OAnBF;AAAA,cAAK,WAAU;AAAA,cAAf,UAmBE;AAAA,gCAlBD,MAEE,OAFF;AAAA,kBAAK,WAAU;AAAA,kBAAf;AAAA,iBAEE;AAAA,gCACF,MAcE,OAdF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UACE,SAAS,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,wBAC1B,OAUE,OAVF;AAAA,oBAEC,WAAU;AAAA,oBAFX,UAUE;AAAA,sCAND,OAEE,QAFF;AAAA,wBAAM,WAAU;AAAA,wBAAhB,UAEE;AAAA,0BADA,IAAI;AAAA,0BADN;AAAA,0BACa;AAAA;AAAA,uBACX;AAAA,sCACF,MAEE,QAFF;AAAA,wBAAM,WAAU;AAAA,wBAAhB,UACE,IAAI;AAAA,uBACJ;AAAA;AAAA,qBARG,IAAI,EASR,CACF;AAAA,iBACA;AAAA;AAAA,aACD;AAAA;AAAA,SAEF;AAAA,MAEJ;AAAA;AAAA,QAGC,uBACC,MAEE,OAFF;AAAA,UAAK,WAAU;AAAA,UAAf,UACE,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,SAC9B;AAAA;AAAA;AAAA,EAKN,uBACC,OAmDE,OAnDF;AAAA,IAAK,WAAU;AAAA,IAAf,UAmDE;AAAA,sBAlDD,OA+BE,YA/BF;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,cAAa;AAAA,QACb,WAAW;AAAA,QANZ,UA+BE;AAAA,UAvBA,CAAC,2BACD;AAAA,sBAKE;AAAA,8BAJD,MAAC,qBAAD,EAAqB;AAAA,8BACrB,MAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UACE,eAAe;AAAA,eACf;AAAA;AAAA,WACD;AAAA,UAEF,CAAC,gBAAgB,CAAC,2BAClB;AAAA,sBAKE;AAAA,8BAJD,MAAC,qBAAD,EAAqB;AAAA,8BACrB,MAAyB,mBAAzB;AAAA;AAAA,eAAyB;AAAA,8BACzB,MAAC,qBAAD,EAAqB;AAAA,8BACrB,MAA2B,gBAA3B;AAAA,0BAAiB;AAAA,eAAU;AAAA;AAAA,WAC1B;AAAA,UAEF,gBAAgB,CAAC,2BACjB;AAAA,sBAIE;AAAA,8BAHD,MAAC,qBAAD,EAAqB;AAAA,8BACrB,MAAwB,iBAAxB;AAAA;AAAA,eAAwB;AAAA,8BACxB,OAA4B,gBAA5B;AAAA,0BAA4B;AAAA,kBAA5B;AAAA,kBAAkB;AAAA;AAAA,eAAU;AAAA;AAAA,WAC3B;AAAA;AAAA,OAEF;AAAA,MAED,cAAc,gBAAgB,gCAC9B,MAAC,kBAAD;AAAA,QAAkB,OAAO;AAAA,OAAc;AAAA,MAGvC,cAAc,CAAC,gCACf,MAUE,OAVF;AAAA,QAAK,WAAW,UAAU,cAAc;AAAA,QAAxC,UACE,0BACA,MAEE,OAFF;AAAA,UAAK,WAAU;AAAA,UAAf,UACE,cAAc;AAAA,SACd,oBAEF,MAEE,gBAFF;AAAA,UAAgB,OAAM;AAAA,UAAU,WAAU;AAAA,UAA1C,UACE,cAAc;AAAA,SACd;AAAA,OAEF;AAAA;AAAA,GAEF;AAAA;;;ACrmBJ,sBAAS,yBAAW;AACpB,qBAAS;;;ACDF,IAAM,mBAAmB;AAEhC,IAAI,cAAc;AAClB,IAAI,cAAoC;AAEjC,SAAS,YAAY,GAAkB;AAAA,EAC7C,IAAI;AAAA,IAAa,OAAO,QAAQ,QAAQ;AAAA,EACxC,IAAI;AAAA,IAAa,OAAO;AAAA,EAExB,cAAc,OAAO,EAAE,KAAK,MAAM;AAAA,IACjC,cAAc;AAAA,GACd;AAAA,EACD,OAAO;AAAA;AAOR,eAAe,MAAM,GAAkB;AAAA,EACtC,IAAI,OAAO,aAAa,eAAe,EAAE,cAAc;AAAA,IAAS;AAAA,EAEhE,MAAM,WAAW;AAAA,IAChB;AAAA,MACC,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACR;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACR;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACR;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACR;AAAA,EACD;AAAA,EAEA,MAAM,QAAQ,SAAS,IAAI,OAAO,MAAM;AAAA,IACvC,IAAI;AAAA,MACH,MAAM,MAAM,IAAI,IAAI,mBAAmB,EAAE,QAAQ,YAAY,GAAG,EAAE;AAAA,MAClE,MAAM,OAAO,IAAI,SAChB,qBACA,QAAQ,yBACR,EAAE,QAAQ,EAAE,QAAQ,OAAO,EAAE,MAAM,CACpC;AAAA,MACA,MAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC/B,SAAS,MAAM,IAAI,MAAM;AAAA,MACxB,MAAM;AAAA,GAGR;AAAA,EAED,MAAM,QAAQ,WAAW,KAAK;AAAA;;;;AD9C/B,IAAM,UACL;AACD,IAAM,aAAa;AAEnB,SAAS,mBAAmB,CAAC,KAAqB;AAAA,EACjD,OAAO,IACL,QAAQ,SAAS,EAAE,EACnB,QAAQ,YAAY,EAAE,EACtB,QAAQ,QAAQ;AAAA,CAAI,EACpB,QAAQ,SAAS;AAAA,CAAI,EACrB,QAAQ,OAAO;AAAA,CAAI;AAAA;AAGf,SAAS,gBAAgB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACiB;AAAA,EACjB,SAAS,gBAAgB,WAAS,KAAK;AAAA,EACvC,YAAU,MAAM;AAAA,IACf,aAAa,EAAE,KAAK,MAAM,aAAa,IAAI,CAAC;AAAA,KAC1C,CAAC,CAAC;AAAA,EAEL,MAAM,SAAS,YAAY,UAAU,CAAC;AAAA,EACtC,MAAM,OAAO,YAAY,QAAQ,CAAC;AAAA,EAElC,MAAM,YAAY,OAAO,KAAK,aAAa,KAAK,WAAW,EAAE;AAAA,EAC7D,MAAM,eACL,OAAO,WAAW,YAAY,QAAQ,UAAU,OAAO,OAAO;AAAA,EAC/D,MAAM,eACL,gBAAgB,WAAW,UAAU,OAAO,OAAO,UAAU,WAC1D,OAAO,QACP;AAAA,EACJ,MAAM,aACL,gBAAgB,WAAW,UAAU,OAAO,OAAO,UAAU,WAC1D,OAAO,QACP;AAAA,EAEJ,MAAM,UAAU,eAAe,cAAc;AAAA,EAE7C,MAAM,aAAa,OAAO,OAAO,cAAc,KAAK,cAAc,EAAE;AAAA,EACpE,MAAM,UACL,WAAW,SAAS,KAAK,GAAG,WAAW,MAAM,GAAG,EAAE,OAAM;AAAA,EACzD,MAAM,UAAU,OAAO,OAAO,WAAW,KAAK,WAAW,EAAE;AAAA,EAC3D,MAAM,UAAU,OAAO,OAAO,WAAW,KAAK,WAAW,EAAE;AAAA,EAE3D,MAAM,oBAAoB,MAAM;AAAA,IAC/B,MAAM,MAAM,OAAO,MAAM,OAAO,OAAO,QAAQ;AAAA,IAC/C,uBACC,OAiBE,OAjBF;AAAA,MAAK,WAAU;AAAA,MAAf,UAiBE;AAAA,QAhBA,2BACA,OAGE,OAHF;AAAA,UAAK,WAAU;AAAA,UAAf,UAGE;AAAA,4BAFD,MAAC,WAAD;AAAA,cAAU,WAAU;AAAA,aAAU;AAAA,4BAC9B,MAAuC,QAAvC;AAAA,cAAM,WAAU;AAAA,cAAhB,UAA6B;AAAA,aAAU;AAAA;AAAA,SACtC;AAAA,QAEF,2BAAW,MAAqD,OAArD;AAAA,UAAK,WAAU;AAAA,UAAf,UAA2C;AAAA,SAAU;AAAA,wBACjE,OAQE,OARF;AAAA,UAAK,WAAU;AAAA,UAAf,UAQE;AAAA,YAPA,2BAAW,MAAuC,QAAvC;AAAA,cAAM,WAAU;AAAA,cAAhB,UAA6B;AAAA,aAAU;AAAA,YAClD,uBACA;AAAA,wBAGE;AAAA,gCAFD,MAAQ,QAAR;AAAA;AAAA,iBAAQ;AAAA,gCACR,MAAa,QAAb;AAAA,4BAAO;AAAA,iBAAM;AAAA;AAAA,aACZ;AAAA;AAAA,SAEF;AAAA;AAAA,KACD;AAAA;AAAA,EAIJ,MAAM,mBAAmB,MAAM;AAAA,IAC9B,MAAM,YAAY,OAAO,OAAO,QAAQ,OAAO,UAAU,EAAE;AAAA,IAC3D,MAAM,SAAS,oBAAoB,SAAS;AAAA,IAC5C,MAAM,SAAS,OAAO,OAAO,UAAU,EAAE;AAAA,IACzC,MAAM,WAAW,OAAO;AAAA,IACxB,MAAM,YAAY,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AAAA,IAEpE,uBACC,OAiCE,OAjCF;AAAA,MAAK,WAAU;AAAA,MAAf,UAiCE;AAAA,wBAhCD,OAiBE,OAjBF;AAAA,UAAK,WAAU;AAAA,UAAf,UAiBE;AAAA,YAhBA,2BAAW,MAAuC,QAAvC;AAAA,cAAM,WAAU;AAAA,cAAhB,UAA6B;AAAA,aAAU;AAAA,4BACnD,MAAQ,QAAR;AAAA;AAAA,aAAQ;AAAA,4BACR,OAAyB,QAAzB;AAAA,wBAAyB;AAAA,gBAAlB;AAAA,gBAAP;AAAA;AAAA,aAAyB;AAAA,4BACzB,MAAQ,QAAR;AAAA;AAAA,aAAQ;AAAA,4BACR,OAWE,QAXF;AAAA,cACC,WACC,WAAW,YACR,2CACA;AAAA,cAJL,UAWE;AAAA,gBAJA;AAAA,gBACA,WAAW,YAAY,aAAa,YAClC,KAAK,cACL;AAAA;AAAA,aACF;AAAA;AAAA,SACD;AAAA,QACD,OAAO,KAAK,qBACZ,MAWE,gBAXF;AAAA,UACC,OAAM;AAAA,UACN,UAAU;AAAA,UACV,WAAU;AAAA,UAHX,0BAKC,MAKE,OALF;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,YAAY,iBAAiB;AAAA,YAFvC,UAIE;AAAA,WACA;AAAA,SACD;AAAA;AAAA,KAEF;AAAA;AAAA,EAIJ,MAAM,mBAAmB,MAAM;AAAA,IAC9B,MAAM,YAAY,MAAM,QAAQ,OAAO,SAAS,IAAI,OAAO,YAAY,CAAC;AAAA,IACxE,MAAM,QACL,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ,UAAU;AAAA,IAE7D,uBACC,OAoBE,OApBF;AAAA,MAAK,WAAU;AAAA,MAAf,UAoBE;AAAA,wBAnBD,OAEE,OAFF;AAAA,UAAK,WAAU;AAAA,UAAf,UAEE;AAAA,YADA;AAAA,YADF;AAAA,YACkB,UAAU,IAAI,MAAM;AAAA;AAAA,SACpC;AAAA,QACD,UAAU,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,GAA4B,sBACvD,OAaE,OAbF;AAAA,UAEC,WAAU;AAAA,UAFX,UAaE;AAAA,4BATD,MAAC,QAAD;AAAA,cACC,WAAW,wBAAwB,EAAE,WAAW,YAAY,mBAAmB;AAAA,aAChF;AAAA,4BACA,MAEE,QAFF;AAAA,cAAM,WAAU;AAAA,cAAhB,UACE,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,GAAG,EAAE;AAAA,aAC9B;AAAA,4BACF,MAEE,QAFF;AAAA,cAAM,WAAU;AAAA,cAAhB,UACE,OAAO,EAAE,WAAW,EAAE;AAAA,aACtB;AAAA;AAAA,WAXG,OAAO,EAAE,MAAM,CAAC,CAYpB,CACF;AAAA;AAAA,KACA;AAAA;AAAA,EAIJ,MAAM,oBAAoB,MAAM;AAAA,IAC/B,MAAM,UAAU,OAAO,KAAK,SAAS,EAAE;AAAA,IACvC,OAAO,0BACN,MAIE,OAJF;AAAA,MAAK,WAAU;AAAA,MAAf,0BACC,MAEE,QAFF;AAAA,QAAM,WAAU;AAAA,QAAhB,UACE;AAAA,OACA;AAAA,KACD,IACC;AAAA;AAAA,EAGL,MAAM,QAAQ,aAAa;AAAA,EAC3B,MAAM,cAAc,YAAY;AAAA,EAChC,MAAM,aACL,CAAC,iBACA,cAAc,WACd,cAAc,UACd,cAAc,UACb,cAAc,YAAY,KAAK,SAAS,OAAO;AAAA,EAElD,uBACC,OA0DE,OA1DF;AAAA,IAAK,WAAU;AAAA,IAAf,UA0DE;AAAA,sBAzDD,OAmCE,YAnCF;AAAA,QACC,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA,SAAS,CAAC,CAAC;AAAA,QACX,cAAa;AAAA,QACb,WAAW,CAAC,CAAC,cAAc,CAAC,CAAC;AAAA,QAN9B,UAmCE;AAAA,UA3BA,CAAC,WAAW,2BACZ;AAAA,sBAKE;AAAA,8BAJD,MAAC,qBAAD,EAAqB;AAAA,8BACrB,MAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UACE;AAAA,eACA;AAAA;AAAA,WACD;AAAA,UAEF,CAAC,WAAW,WAAW,CAAC,2BACxB;AAAA,sBAKE;AAAA,8BAJD,MAAC,qBAAD,EAAqB;AAAA,8BACrB,MAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UACE;AAAA,eACA;AAAA;AAAA,WACD;AAAA,UAEF,CAAC,gBAAgB,CAAC,2BAClB;AAAA,sBAKE;AAAA,8BAJD,MAAC,qBAAD,EAAqB;AAAA,8BACrB,MAAuB,mBAAvB;AAAA;AAAA,eAAuB;AAAA,8BACvB,MAAC,qBAAD,EAAqB;AAAA,8BACrB,MAA2B,gBAA3B;AAAA,0BAAiB;AAAA,eAAU;AAAA;AAAA,WAC1B;AAAA,UAEF,gBAAgB,CAAC,2BACjB,OAA4B,gBAA5B;AAAA,sBAA4B;AAAA,cAA5B;AAAA,cAAkB;AAAA;AAAA,WAAU;AAAA;AAAA,OAE5B;AAAA,MAED,cAAc,gBAAgB,gCAC9B,MAAC,kBAAD;AAAA,QAAkB,OAAO;AAAA,QAAc,OAAO;AAAA,QAAY,WAAS;AAAA,OAAC;AAAA,MAGpE,cACA,CAAC,gBACD,cAAc,WACd,kBAAkB;AAAA,MAClB,cACA,CAAC,gBACD,cAAc,UACd,iBAAiB;AAAA,MACjB,cACA,CAAC,gBACD,cAAc,UACd,iBAAiB;AAAA,MACjB,cACA,CAAC,gBACD,cAAc,WACd,kBAAkB;AAAA;AAAA,GAClB;AAAA;;;AEhPJ;AACA,kBAAS;AACT;AAAA,WACC;AAAA,iBACA;AAAA;;AAeD,SAAS,gBAAgB,CAAC,UAAoD;AAAA,EAC7E,MAAM,MAAM,SAAS,QAAQ,IAAI;AAAA,EACjC,IAAI,QAAQ;AAAA,IAAI,OAAO,EAAE,QAAQ,IAAI,MAAM,SAAS;AAAA,EACpD,OAAO,EAAE,QAAQ,SAAS,MAAM,GAAG,GAAG,GAAG,MAAM,SAAS,MAAM,MAAM,CAAC,EAAE;AAAA;AAGjE,SAAS,SAAS,CAAC,MAAuB;AAAA,EAChD,OAAO,KAAK,SAAS,IAAI;AAAA;AAGnB,SAAS,eAAe;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACwB;AAAA,EACxB,QAAQ,QAAQ,SAAS,iBAAiB,QAAQ;AAAA,EAClD,MAAM,SAAS,YAAY,UAAU,CAAC;AAAA,EACtC,MAAM,OAAO,YAAY,QAAQ,CAAC;AAAA,EAClC,MAAM,UAAU,eAAe,cAAc;AAAA,EAC7C,MAAM,cAAc,UAAU,gBAAgB,UAAU,SAAS,MAAM,IACpE,eACA;AAAA,EAEH,MAAM,eACL,OAAO,WAAW,YAAY,QAAQ,UAAU,OAAO,OAAO;AAAA,EAC/D,MAAM,eACL,gBAAgB,WAAW,UAAU,OAAO,OAAO,UAAU,WAC1D,OAAO,QACP,OAAO,YAAY,UAAU,WAC3B,YAAY,QACb;AAAA,EACL,MAAM,aACL,gBAAgB,WAAW,UAAU,OAAO,OAAO,UAAU,WAC1D,OAAO,QACP;AAAA,EAEJ,MAAM,gBACL,OAAO,OAAO,WAAW,WACtB,OAAO,SACP,OAAO,UAAU,OAAO,OAAO,WAAW,WACzC,KAAK,UAAU,OAAO,QAAQ,MAAM,CAAC,IACrC;AAAA,EAEL,MAAM,SAAS,MAAM,QAAQ,OAAO,MAAM,IACtC,OAAO,SACR,CAAC;AAAA,EACJ,MAAM,YAAY,OAAO,SAAS;AAAA,EAClC,MAAM,aACL,CAAC,iBACA,iBAAiB,OAAO,KAAK,MAAM,EAAE,SAAS,KAAK;AAAA,EACrD,MAAM,gBAAgB,iBAAiB,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,EACrE,MAAM,eACL,cAAc,WAAW,GAAG,KAAK,cAAc,WAAW,GAAG;AAAA,EAE9D,MAAM,cAAc,OAAO,QAAQ,IAA+B,EAChE,MAAM,GAAG,CAAC,EACV,IAAI,EAAE,GAAG,OAAO;AAAA,IAChB,MAAM,MACL,OAAO,MAAM,WACV,EAAE,SAAS,KACV,GAAG,EAAE,MAAM,GAAG,EAAE,OAChB,IACD,KAAK,UAAU,CAAC;AAAA,IACpB,OAAO,GAAG,KAAK;AAAA,GACf,EACA,KAAK,IAAI;AAAA,EAEX,MAAM,aAAa,SAAS,GAAG,YAAW,SAAS;AAAA,EAEnD,uBACC,OAqEE,OArEF;AAAA,IAAK,WAAU;AAAA,IAAf,UAqEE;AAAA,sBApED,OAgCE,YAhCF;AAAA,QACC,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA,SAAS,CAAC,CAAC;AAAA,QACX,cAAa;AAAA,QACb,WAAW,CAAC,CAAC,cAAc,CAAC,CAAC,gBAAgB;AAAA,QAN9C,UAgCE;AAAA,UAxBA,CAAC,WAAW,+BACZ;AAAA,sBAKE;AAAA,8BAJD,MAAC,qBAAD,EAAqB;AAAA,8BACrB,MAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UACE;AAAA,eACA;AAAA;AAAA,WACD;AAAA,UAEF,CAAC,gBAAgB,CAAC,2BAClB;AAAA,sBAKE;AAAA,8BAJD,MAAC,qBAAD,EAAqB;AAAA,8BACrB,MAAuB,mBAAvB;AAAA;AAAA,eAAuB;AAAA,8BACvB,MAAC,qBAAD,EAAqB;AAAA,8BACrB,MAA2B,gBAA3B;AAAA,0BAAiB;AAAA,eAAU;AAAA;AAAA,WAC1B;AAAA,UAEF,gBAAgB,CAAC,2BACjB;AAAA,sBAKE;AAAA,8BAJD,MAAC,qBAAD,EAAqB;AAAA,8BACrB,MAAwB,iBAAxB;AAAA;AAAA,eAAwB;AAAA,8BACxB,MAAC,qBAAD,EAAqB;AAAA,8BACrB,MAA2B,gBAA3B;AAAA,0BAAiB;AAAA,eAAU;AAAA;AAAA,WAC1B;AAAA;AAAA,OAEF;AAAA,MAED,cAAc,gBAAgB,gCAC9B,MAAC,kBAAD;AAAA,QAAkB,OAAO;AAAA,QAAc,OAAO;AAAA,QAAY,WAAS;AAAA,OAAC;AAAA,MAGpE,cAAc,CAAC,gBAAgB,8BAC/B,OA2BE,OA3BF;AAAA,QAAK,WAAU;AAAA,QAAf,UA2BE;AAAA,UA1BA,6BAAa,MAAC,cAAD;AAAA,YAAc;AAAA,WAAgB;AAAA,UAC3C,iBAAiB,CAAC,6BAClB,MAsBE,gBAtBF;AAAA,YACC,OAAM;AAAA,YACN,sBAAM,MAAC,MAAD;AAAA,cAAM,WAAU;AAAA,aAAU;AAAA,YAChC,UAAU;AAAA,YACV,WAAU;AAAA,YAJX,0BAMC,MAeE,oBAfF;AAAA,cACC,UAAU,eAAe,SAAS;AAAA,cAClC,OAAO;AAAA,cACP,aAAa;AAAA,gBACZ,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,YAAY;AAAA,gBACZ,UAAU;AAAA,cACX;AAAA,cACA,WAAS;AAAA,cACT,eAAa;AAAA,cAZd,UAcE;AAAA,aACA;AAAA,WACD;AAAA;AAAA,OAEF;AAAA;AAAA,GAEF;AAAA;;;ACjKJ,iBAAS,gBAAM,aAAO;;AAWf,SAAS,oBAAoB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACwB;AAAA,EACxB,MAAM,SAAU,YAAY,UAAU,CAAC;AAAA,EACvC,MAAM,OAAQ,YAAY,QAAQ,CAAC;AAAA,EACnC,MAAM,UAAU,eAAe,cAAc;AAAA,EAE7C,MAAM,YAAY,MAAM,QAAQ,KAAK,KAAK,IAAK,KAAK,QAAqB,CAAC;AAAA,EAC1E,MAAM,SAAS,MAAM,QAAQ,OAAO,MAAM,IACtC,OAAO,SACR,CAAC;AAAA,EACJ,MAAM,WAAW,MAAM,QAAQ,OAAO,QAAQ,IAC1C,OAAO,WACR,CAAC;AAAA,EACJ,MAAM,WAAW,OAAO,OAAO;AAAA,EAC/B,MAAM,aAAa,OAAO,SAAS,KAAK,SAAS,SAAS;AAAA,EAE1D,uBACC,OAsDE,OAtDF;AAAA,IAAK,WAAU;AAAA,IAAf,UAsDE;AAAA,sBArDD,OAgCE,YAhCF;AAAA,QACC,UAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,cAAa;AAAA,QACb,WAAW;AAAA,QANZ,UAgCE;AAAA,UAxBA,CAAC,2BACD;AAAA,sBAKE;AAAA,8BAJD,MAAC,qBAAD,EAAqB;AAAA,8BACrB,OAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UAEE;AAAA,kBADA,UAAU;AAAA,kBADZ;AAAA,kBACyB,UAAU,WAAW,IAAI,MAAM;AAAA;AAAA,eACtD;AAAA;AAAA,WACD;AAAA,UAEF,CAAC,YAAY,CAAC,2BACd;AAAA,sBAKE;AAAA,8BAJD,MAAC,qBAAD,EAAqB;AAAA,8BACrB,OAA2C,mBAA3C;AAAA,0BAA2C;AAAA,kBAAvB,OAAO;AAAA,kBAA3B;AAAA;AAAA,eAA2C;AAAA,8BAC3C,MAAC,qBAAD,EAAqB;AAAA,8BACrB,MAA2B,gBAA3B;AAAA,0BAAiB;AAAA,eAAU;AAAA;AAAA,WAC1B;AAAA,UAEF,YAAY,CAAC,2BACb;AAAA,sBAKE;AAAA,8BAJD,MAAC,qBAAD,EAAqB;AAAA,8BACrB,MAAwB,iBAAxB;AAAA;AAAA,eAAwB;AAAA,8BACxB,MAAC,qBAAD,EAAqB;AAAA,8BACrB,MAA2B,gBAA3B;AAAA,0BAAiB;AAAA,eAAU;AAAA;AAAA,WAC1B;AAAA;AAAA,OAEF;AAAA,MAED,cAAc,8BACd,OAgBE,OAhBF;AAAA,QAAK,WAAU;AAAA,QAAf,UAgBE;AAAA,UAfA,OAAO,IAAI,CAAC,yBACZ,OAIE,OAJF;AAAA,YAAgB,WAAU;AAAA,YAA1B,UAIE;AAAA,8BAHD,MAAC,QAAD;AAAA,gBAAO,WAAU;AAAA,eAAyB;AAAA,8BAC1C,MAAC,OAAD;AAAA,gBAAM,WAAU;AAAA,eAA0B;AAAA,8BAC1C,MAAuD,QAAvD;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UAAgD;AAAA,eAAO;AAAA;AAAA,aAH9C,IAIR,CACF;AAAA,UACA,SAAS,IAAI,CAAC,yBACd,OAKE,OALF;AAAA,YAAgB,WAAU;AAAA,YAA1B,UAKE;AAAA,8BAJD,MAAC,IAAD;AAAA,gBAAG,WAAU;AAAA,eAAuB;AAAA,8BACpC,MAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UACE;AAAA,eACA;AAAA;AAAA,aAJO,IAKR,CACF;AAAA;AAAA,OACA;AAAA;AAAA,GAEF;AAAA;;;ACvFJ;AAAA,kBACC;AAAA,iBACA;AAAA;AAAA,cAEA;AAAA;AAAA;;AAkBM,SAAS,aAAa;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACiB;AAAA,EACjB,MAAM,SAAS,YAAY,UAAU,CAAC;AAAA,EACtC,MAAM,UAAU,eAAe,cAAc;AAAA,EAE7C,MAAM,eACL,OAAO,WAAW,YAAY,QAAQ,UAAU,OAAO,OAAO;AAAA,EAC/D,MAAM,eACL,gBAAgB,WAAW,UAAU,OAAO,OAAO,UAAU,WAC1D,OAAO,QACP;AAAA,EAEJ,MAAM,OAAQ,OAAmC;AAAA,EACjD,MAAM,cAAe,OAAmC;AAAA,EAGxD,MAAM,UAAW,OAAmC;AAAA,EAGpD,MAAM,QAAS,OAAmC;AAAA,EAClD,MAAM,iBAAkB,OAAmC;AAAA,EAG3D,MAAM,kBAAmB,OAAmC;AAAA,EAI5D,MAAM,YAAY,aAAa,WAAW,WAAW;AAAA,EACrD,MAAM,YAAY,gBAAgB,UAAU;AAAA,EAC5C,MAAM,cAAc,iBAAiB,UAAU;AAAA,EAC/C,MAAM,YAAY,CAAC,CAAC,WAAW;AAAA,EAE/B,uBACC,OAqHE,OArHF;AAAA,IAAK,WAAU;AAAA,IAAf,UAqHE;AAAA,sBApHD,OAyDE,UAzDF;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM,aAAa,SAAS;AAAA,QACrC,WAAW,4DACV,eACG,8EACA,YACC,0FACA;AAAA,QARN,UAyDE;AAAA,UA9CA,4BACA,MAAC,eAAD;AAAA,YACC,WAAW,8CAA8C,aAAa,cAAc;AAAA,WACrF,oBAEA,MAAC,OAAD;AAAA,YAAK,WAAU;AAAA,WAAoB;AAAA,UAEnC,gCACA,MAAC,cAAD;AAAA,YAAa,WAAU;AAAA,WAAuD;AAAA,UAE9E,4BACA,MAAC,WAAD;AAAA,YAAU,WAAU;AAAA,WAAwB,oBAE5C,MAAC,UAAD;AAAA,YAAU,WAAU;AAAA,WAAwB;AAAA,0BAE7C,OAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UAEE;AAAA,cAFF;AAAA,cACO,eAAe,WAAW;AAAA;AAAA,WAC/B;AAAA,UACD,QAAQ,CAAC,2BACT;AAAA,sBAKE;AAAA,8BAJD,MAA2D,QAA3D;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAA2D;AAAA,8BAC3D,MAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UACE,YAAY,aAAa,QAAQ,cAAc,EAAE,IAAI;AAAA,eACrD;AAAA;AAAA,WACD;AAAA,UAEF,SAAS,CAAC,WAAW,CAAC,6BACtB,OAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UAEE;AAAA,cAFF;AAAA,cACG;AAAA;AAAA,WACD;AAAA,UAEF,YAAY,KAAK,CAAC,2BAClB,OAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UAEE;AAAA,cAFF;AAAA,cACG;AAAA,cADH;AAAA,cACmB,cAAc,IAAI,MAAM;AAAA;AAAA,WACzC;AAAA,UAEF,cAAc,KAAK,CAAC,2BACpB,OAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UAEE;AAAA,cAFF;AAAA,8BACE,MAAC,aAAD;AAAA,gBAAa,WAAU;AAAA,eAAiB;AAAA,cAD1C;AAAA,cAC8C;AAAA;AAAA,WAC5C;AAAA,UAEF,WAAW,CAAC,2BACZ,OAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UAEE;AAAA,cAFF;AAAA,cACG;AAAA;AAAA,WACD;AAAA;AAAA,OAEF;AAAA,MACD,cAAc,gBAAgB,gCAC9B,MAAC,kBAAD;AAAA,QAAkB,OAAO;AAAA,OAAc;AAAA,MAEvC,cAAc,CAAC,gCACf,OAoDE,OApDF;AAAA,QAAK,WAAU;AAAA,QAAf,UAoDE;AAAA,UAnDA,cAAc,KAAK,mCACnB,OAgBE,OAhBF;AAAA,YAAK,WAAU;AAAA,YAAf,UAgBE;AAAA,8BAfD,OAGE,OAHF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UAGE;AAAA,kCAFD,MAAC,aAAD;AAAA,oBAAa,WAAU;AAAA,mBAAU;AAAA,kBADlC;AAAA,kBAEiB,cAAc,IAAI,MAAM;AAAA;AAAA,eACvC;AAAA,cACD,gBAAgB,IAAI,CAAC,QAAQ,sBAC7B,OAQE,OARF;AAAA,gBAEC,WAAU;AAAA,gBAFX,UAQE;AAAA,kCAJD,MAEE,QAFF;AAAA,oBAAM,WAAU;AAAA,oBAAhB,UACE,OAAO;AAAA,mBACP;AAAA,kBAAM;AAAA,kBACP,OAAO;AAAA;AAAA,iBANH,GAAG,OAAO,QAAQ,OAAO,QAAQ,GAOrC,CACF;AAAA;AAAA,WACA;AAAA,UAEF,eAAe,CAAC,6BAChB,MAA2D,KAA3D;AAAA,YAAG,WAAU;AAAA,YAAb,UAA6C;AAAA,WAAc;AAAA,UAE3D,2BACA,MAIE,OAJF;AAAA,YAAK,WAAU;AAAA,YAAf,0BACC,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf,UACE;AAAA,aACA;AAAA,WACD;AAAA,UAEF,YAAY,KAAK,kCACjB,OAmBE,WAnBF;AAAA,YAAS,WAAU;AAAA,YAAnB,UAmBE;AAAA,8BAlBD,OAEE,WAFF;AAAA,gBAAS,WAAU;AAAA,gBAAnB,UAEE;AAAA,kBADA;AAAA,kBADF;AAAA,kBACgC,cAAc,IAAI,MAAM;AAAA;AAAA,eACtD;AAAA,8BACF,MAcE,OAdF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UACE,eAAe,IAAI,CAAC,sBACpB,OAUE,OAVF;AAAA,kBAEC,WAAU;AAAA,kBAFX,UAUE;AAAA,oCAND,MAEE,QAFF;AAAA,sBAAM,WAAU;AAAA,sBAAhB,UACE,EAAE;AAAA,qBACF;AAAA,oCACF,MAEE,QAFF;AAAA,sBAAM,WAAU;AAAA,sBAAhB,UACE,eAAe,EAAE,IAAI;AAAA,qBACrB;AAAA;AAAA,mBARG,EAAE,YASN,CACF;AAAA,eACA;AAAA;AAAA,WACD;AAAA;AAAA,OAEF;AAAA;AAAA,GAEF;AAAA;AAIJ,SAAS,cAAc,CAAC,OAAuB;AAAA,EAC9C,IAAI,QAAQ;AAAA,IAAM,OAAO,GAAG;AAAA,EAC5B,MAAM,KAAK,QAAQ;AAAA,EACnB,IAAI,KAAK;AAAA,IAAM,OAAO,GAAG,GAAG,QAAQ,CAAC;AAAA,EACrC,OAAO,IAAI,KAAK,MAAM,QAAQ,CAAC;AAAA;;ACzLhC,qBAAS,sBAAU,sBAAQ;AAC3B,wBAAS,8BAAa;AAAA;AAOf,SAAS,iBAAiB,GAAG,QAAgC;AAAA,EACnE,OAAO,YAAY,iBAAiB,WAAS,IAAI;AAAA,EACjD,MAAM,YAAY,QAAuB,IAAI;AAAA,EAC7C,MAAM,eAAe,QAAO,KAAK;AAAA,EACjC,IAAI,UAAU;AAAA,EACd,MAAM,OAAO,KAAK,eAAe,KAAK;AAAA,EACtC,IAAI,QAAQ,OAAO,SAAS,YAAY,UAAU,MAAM;AAAA,IACvD,UAAU,OAAO,KAAK,IAAI;AAAA,EAC3B,EAAO,SAAI,OAAO,SAAS,UAAU;AAAA,IACpC,UAAU;AAAA,EACX;AAAA,EAGA,YAAU,MAAM;AAAA,IACf,IACC,UAAU,WACV,cACA,CAAC,KAAK,eACN,CAAC,aAAa,SACb;AAAA,MACD,UAAU,QAAQ,YAAY,UAAU,QAAQ;AAAA,IACjD;AAAA,KACE,CAAC,SAAS,YAAY,KAAK,WAAW,CAAC;AAAA,EAE1C,IAAI,CAAC,WAAW,CAAC,QAAQ,KAAK,GAAG;AAAA,IAChC,OAAO;AAAA,EACR;AAAA,EAEA,uBACC,OAmCE,OAnCF;AAAA,IAAK,WAAU;AAAA,IAAf,UAmCE;AAAA,sBAlCD,OAgBE,UAhBF;AAAA,QACC,MAAK;AAAA,QACL,SAAS,MAAM,cAAc,CAAC,UAAU;AAAA,QACxC,WAAU;AAAA,QAHX,UAgBE;AAAA,UAXA,6BACA,MAAC,cAAD;AAAA,YAAa,WAAU;AAAA,WAAwB,oBAE/C,MAAC,eAAD;AAAA,YAAc,WAAU;AAAA,WAAwB;AAAA,0BAEjD,MAAyC,QAAzC;AAAA,YAAM,WAAU;AAAA,YAAhB;AAAA,WAAyC;AAAA,UACxC,CAAC,KAAK,+BACN,MAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB;AAAA,WAEE;AAAA;AAAA,OAEF;AAAA,MACD,8BACA,MAcE,OAdF;AAAA,QACC,KAAK;AAAA,QACL,WAAU;AAAA,QACV,MAAK;AAAA,QACL,cAAc,MAAM;AAAA,UACnB,aAAa,UAAU;AAAA;AAAA,QAExB,cAAc,MAAM;AAAA,UACnB,aAAa,UAAU;AAAA;AAAA,QARzB,0BAWC,MAEE,OAFF;AAAA,UAAK,WAAU;AAAA,UAAf,UACE;AAAA,SACA;AAAA,OACD;AAAA;AAAA,GAEF;AAAA;;;;A/B9BJ,IAAM,oBAA4C;AAAA,EACjD,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,KAAK;AAAA,EAEL,MAAM;AAAA,EACN,MAAM;AAAA,EAEN,MAAM;AAAA,EACN,UAAU;AAAA,EAEV,WAAW;AAAA,EACX,SAAS;AAAA,EACT,WAAW;AAAA,EAEX,YAAY;AAAA,EAEZ,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EAER,WAAW;AAAA,EAEX,cAAc;AAAA,EAEd,OAAO;AACR;AAEA,SAAS,iBAAiB,CAAC,MAAsB;AAAA,EAChD,OAAO,kBAAkB,SAAS;AAAA;AAGnC,IAAM,4BAA4B,IAAI,IAAI;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,CAAC;AAEM,SAAS,kBAAkB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GAC2B;AAAA,EAC3B,OAAO,YAAY,iBAAiB,WAAS,KAAK;AAAA,EAClD,MAAM,iBAAiB,kBAAkB,QAAQ;AAAA,EACjD,MAAM,kBACL,WAAW,CAAC,0BAA0B,IAAI,cAAc;AAAA,EAEzD,MAAM,eAAe,MAAM,cAAc,CAAC,UAAU;AAAA,EAEpD,MAAM,QAAQ;AAAA,IACb;AAAA,IACA,gBAAgB,kBAAkB;AAAA,IAClC;AAAA,IACA,UAAU;AAAA,IACV,SAAS;AAAA,EACV;AAAA,EAEA,IAAI,OAAO;AAAA,IACV,uBAAO,MAAC,eAAD;AAAA,SAAmB;AAAA,MAAO;AAAA,KAAoB;AAAA,EACtD;AAAA,EAEA,QAAQ;AAAA,SACF;AAAA,MACJ,uBAAO,MAAC,cAAD;AAAA,WAAkB;AAAA,OAAO;AAAA,SAC5B;AAAA,MACJ,uBAAO,MAAC,eAAD;AAAA,WAAmB;AAAA,OAAO;AAAA,SAC7B;AAAA,MACJ,uBAAO,MAAC,cAAD;AAAA,WAAkB;AAAA,OAAO;AAAA,SAC5B;AAAA,MACJ,uBAAO,MAAC,cAAD;AAAA,WAAkB;AAAA,OAAO;AAAA,SAC5B;AAAA,MACJ,uBAAO,MAAC,mBAAD;AAAA,WAAuB;AAAA,OAAO;AAAA,SACjC;AAAA,MACJ,uBAAO,MAAC,iBAAD;AAAA,WAAqB;AAAA,OAAO;AAAA,SAC/B;AAAA,MACJ,uBAAO,MAAC,mBAAD;AAAA,WAAuB;AAAA,OAAO;AAAA,SACjC;AAAA,MACJ,uBAAO,MAAC,oBAAD;AAAA,WAAwB;AAAA,OAAO;AAAA,SAClC;AAAA,MACJ,uBAAO,MAAC,kBAAD;AAAA,WAAsB;AAAA,OAAO;AAAA,SAChC;AAAA,MACJ,uBAAO,MAAC,cAAD;AAAA,WAAkB;AAAA,OAAO;AAAA,SAC5B;AAAA,MACJ,uBAAO,MAAC,cAAD;AAAA,WAAkB;AAAA,OAAO;AAAA,SAC5B;AAAA,SACA;AAAA,SACA;AAAA,MACJ,uBAAO,MAAC,gBAAD;AAAA,WAAoB;AAAA,OAAO;AAAA,SAC9B;AAAA,MACJ,uBAAO,MAAC,mBAAD;AAAA,WAAuB;AAAA,OAAO;AAAA,SACjC;AAAA,MACJ,uBAAO,MAAC,gBAAD;AAAA,WAAoB;AAAA,OAAO;AAAA,SAC9B;AAAA,SACA;AAAA,MACJ,uBAAO,MAAC,eAAD;AAAA,WAAmB;AAAA,OAAO;AAAA,SAC7B;AAAA,MACJ,uBAAO,MAAC,wBAAD;AAAA,WAA4B;AAAA,OAAO;AAAA,SACtC;AAAA,MACJ,uBAAO,MAAC,sBAAD;AAAA,WAA0B;AAAA,QAAO;AAAA,OAAoB;AAAA,SACxD;AAAA,MACJ,uBAAO,MAAC,eAAD;AAAA,WAAmB;AAAA,OAAO;AAAA,SAC7B;AAAA,MACJ,uBACC,MAAC,eAAD;AAAA,WACK;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,OACD;AAAA,SAEG;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,MACJ,uBACC,MAAC,sBAAD;AAAA,QACC;AAAA,WACI;AAAA,QACJ;AAAA,OACD;AAAA;AAAA,MAGD,IAAI,UAAU,cAAc,GAAG;AAAA,QAC9B,uBAAO,MAAC,iBAAD;AAAA,aAAqB;AAAA,UAAO;AAAA,SAAoB;AAAA,MACxD;AAAA,MACA,uBAAO,MAAC,iBAAD;AAAA,WAAqB;AAAA,QAAO;AAAA,OAAoB;AAAA;AAAA;;;;AHjJ1D,SAAS,kBAAkB,CAAC,MAAmD;AAAA,EAC9E,MAAM,WAAW,KAAK;AAAA,EACtB,IAAI,YAAY,OAAO,aAAa,UAAU;AAAA,IAC7C,OAAO;AAAA,EACR;AAAA,EACA,IAAI;AAAA,IACH,IAAI,KAAK,SAAS;AAAA,MACjB,MAAM,SAAS,KAAK,MAAM,KAAK,OAAO;AAAA,MACtC,IAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG;AAAA,QACnE,OAAO;AAAA,MACR;AAAA,IACD;AAAA,IACC,MAAM;AAAA,EACR,OAAO;AAAA;AAGR,SAAS,eAAe,CACvB,MACsC;AAAA,EACtC,MAAM,UAAU,mBAAmB,IAAI;AAAA,EACvC,IAAI,CAAC;AAAA,IAAS;AAAA,EAEd,MAAM,OAAQ,QAA+B;AAAA,EAC7C,IAAI,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,GAAG;AAAA,IAC7D,OAAO;AAAA,EACR;AAAA,EAEA;AAAA;AAGD,SAAS,kBAAiB,CACzB,MACgB;AAAA,EAChB,IAAI,CAAC;AAAA,IAAM,OAAO;AAAA,EAClB,MAAM,aAAa,CAAC,OAAO,WAAW,UAAU,OAAO;AAAA,EACvD,WAAW,OAAO,YAAY;AAAA,IAC7B,MAAM,QAAQ,KAAK;AAAA,IACnB,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,GAAG;AAAA,MACzD,OAAO,MAAM,KAAK;AAAA,IACnB;AAAA,EACD;AAAA,EACA,OAAO;AAAA;AAGR,SAAS,uBAAuB,CAAC,OAA8B;AAAA,EAC9D,MAAM,QAAQ,MAAM,MACnB,sDACD;AAAA,EACA,OAAO,QAAQ,IAAI,KAAK,KAAK;AAAA;AAG9B,SAAS,oBAAmB,CAC3B,UACA,MACwC;AAAA,EACxC,IAAI,CAAC;AAAA,IAAM,OAAO;AAAA,EAClB,MAAM,aAAa;AAAA,IAClB,EAAE,KAAK,QAAQ,OAAO,KAAK;AAAA,IAC3B,EAAE,KAAK,QAAQ,OAAO,KAAK;AAAA,IAC3B,EAAE,KAAK,UAAU,OAAO,KAAK;AAAA,IAC7B,EAAE,KAAK,OAAO,OAAO,KAAK;AAAA,IAC1B,EAAE,KAAK,SAAS,OAAO,KAAK;AAAA,IAC5B,EAAE,KAAK,WAAW,OAAO,KAAK;AAAA,IAC9B,EAAE,KAAK,QAAQ,OAAO,KAAK;AAAA,IAC3B,EAAE,KAAK,OAAO,OAAO,KAAK;AAAA,EAC3B;AAAA,EACA,aAAa,SAAS,YAAY;AAAA,IACjC,MAAM,QAAQ,KAAK;AAAA,IACnB,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,GAAG;AAAA,MACzD,OAAO,EAAE,KAAK,OAAO,MAAM,KAAK,EAAE;AAAA,IACnC;AAAA,EACD;AAAA,EACA,IAAI,aAAa,QAAQ;AAAA,IACxB,MAAM,UAAU,KAAK;AAAA,IACrB,IAAI,OAAO,YAAY,YAAY,QAAQ,KAAK,EAAE,SAAS,GAAG;AAAA,MAC7D,OAAO,EAAE,KAAK,WAAW,OAAO,QAAQ,KAAK,EAAE;AAAA,IAChD;AAAA,EACD;AAAA,EACA,IAAI,aAAa,eAAe;AAAA,IAC/B,MAAM,QAAQ,KAAK;AAAA,IACnB,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,GAAG;AAAA,MACzD,MAAM,SAAS,wBAAwB,KAAK;AAAA,MAC5C,IAAI,QAAQ;AAAA,QACX,OAAO,EAAE,KAAK,SAAS,OAAO,OAAO;AAAA,MACtC;AAAA,IACD;AAAA,EACD;AAAA,EACA,OAAO;AAAA;AAGR,SAAS,iBAAiB,CACzB,MACA,SACgB;AAAA,EAChB,IAAI,CAAC;AAAA,IAAM,OAAO;AAAA,EAClB,MAAM,SAAmB,CAAC;AAAA,EAC1B,YAAY,KAAK,UAAU,OAAO,QAAQ,IAAI,GAAG;AAAA,IAChD,IAAI,WAAW,QAAQ;AAAA,MAAS;AAAA,IAChC,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU;AAAA,MAC3D,MAAM,WAAW,GAAG,OAAO,OAAO,KAAK;AAAA,MACvC,OAAO,KAAK,QAAQ;AAAA,IACrB;AAAA,IACA,IAAI,OAAO,UAAU;AAAA,MAAG;AAAA,EACzB;AAAA,EACA,IAAI,CAAC,OAAO;AAAA,IAAQ,OAAO;AAAA,EAC3B,MAAM,SAAS,OAAO,KAAK,IAAI;AAAA,EAC/B,OAAO,OAAO,SAAS,MAAM,GAAG,OAAO,MAAM,GAAG,GAAG,OAAM;AAAA;AAmBnD,IAAM,kBAAkB,MAC9B,SAAS,gBAAe;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACwB;AAAA,EAGxB,IAAI,KAAK,SAAS,aAAa;AAAA,IAC9B,MAAM,WAAW,KAAK,YAAY;AAAA,IAClC,IAAI,aAAa;AAAA,MAAmB,OAAO;AAAA,IAC3C,IAAI,CAAC,kBAAkB,CAAC;AAAA,MAAiB,OAAO;AAAA,EACjD;AAAA,EAEA,IACC,KAAK,SAAS,iBACd,KAAK,aAAa,qBAClB,CAAC,sBACA;AAAA,IACD,OAAO;AAAA,EACR;AAAA,EAEA,IAAI,KAAK,SAAS,QAAQ;AAAA,IACzB,MAAM,OAAO,KAAK,eAAe,KAAK;AAAA,IACtC,IAAI,UAAU;AAAA,IACd,IAAI,QAAQ,OAAO,SAAS,YAAY,UAAU,MAAM;AAAA,MACvD,UAAU,OAAO,KAAK,IAAI;AAAA,IAC3B,EAAO,SAAI,OAAO,SAAS,UAAU;AAAA,MACpC,UAAU;AAAA,IACX;AAAA,IACA,IAAI,CAAC,WAAW,CAAC,QAAQ,KAAK,GAAG;AAAA,MAChC,OAAO;AAAA,IACR;AAAA,EACD;AAAA,EAEA,IAAI,KAAK,SAAS,aAAa;AAAA,IAC9B,MAAM,OAAO,KAAK,eAAe,KAAK;AAAA,IACtC,IAAI,UAAU;AAAA,IACd,IAAI,QAAQ,OAAO,SAAS,YAAY,UAAU,MAAM;AAAA,MACvD,UAAU,OAAO,KAAK,IAAI;AAAA,IAC3B,EAAO,SAAI,OAAO,SAAS,UAAU;AAAA,MACpC,UAAU;AAAA,IACX;AAAA,IACA,IAAI,CAAC,WAAW,CAAC,QAAQ,KAAK,GAAG;AAAA,MAChC,OAAO;AAAA,IACR;AAAA,EACD;AAAA,EAEA,MAAM,gBACL,KAAK,SAAS,eAAe,KAAK,SAAS;AAAA,EAE5C,MAAM,iBAAiB,CAAC,UAAU,WAAW,YAAY;AAAA,EAEzD,IAAI,iBAAiB,KAAK,SAAS,aAAa;AAAA,IAC/C,eAAe,KAAK,UAAU,WAAW,MAAM;AAAA,EAChD,EAAO,SAAI,KAAK,SAAS,SAAS;AAAA,IACjC,eAAe,KAAK,QAAQ;AAAA,EAC7B,EAAO,SAAI,KAAK,SAAS,QAAQ;AAAA,IAChC,eAAe,KAAK,MAAM;AAAA,IAC1B,eAAe,KAAK,SAAS;AAAA,EAC9B,EAAO;AAAA,IACN,eAAe,KAAK,MAAM;AAAA;AAAA,EAG3B,MAAM,mBAAmB,eAAe,KAAK,GAAG;AAAA,EAEhD,MAAM,aAAa,MAAM;AAAA,IACxB,IAAI,KAAK,SAAS,aAAa;AAAA,MAC9B,uBACC,MAAC,QAAD;AAAA,QAAO,WAAU;AAAA,OAA+C;AAAA,IAElE;AAAA,IAEA,IAAI,KAAK,SAAS,aAAa;AAAA,MAC9B,uBACC,MAAC,UAAD;AAAA,QAAS,WAAU;AAAA,OAA0D;AAAA,IAE/E;AAAA,IAEA,IAAI,KAAK,SAAS,SAAS;AAAA,MAC1B,MAAM,UAAU,mBAAmB,IAAI;AAAA,MACvC,MAAM,YAAY,SAAS,cAAc;AAAA,MACzC,OAAO,4BACN,MAAC,UAAD;AAAA,QAAU,WAAU;AAAA,OAA6C,oBAEjE,MAAC,cAAD;AAAA,QAAa,WAAU;AAAA,OAAyC;AAAA,IAElE;AAAA,IAEA,IAAI,KAAK,SAAS,eAAe;AAAA,MAChC,MAAM,WAAW,KAAK,YAAY;AAAA,MAClC,IAAI,aAAa;AAAA,QAChB,uBACC,MAAC,WAAD;AAAA,UAAU,WAAU;AAAA,SAA2C;AAAA,MAEjE,IAAI,aAAa;AAAA,QAChB,uBACC,MAAC,WAAD;AAAA,UAAU,WAAU;AAAA,SAAiD;AAAA,MAEvE,IAAI,aAAa;AAAA,QAChB,uBACC,MAAC,WAAD;AAAA,UAAU,WAAU;AAAA,SAA+C;AAAA,MAErE,IAAI,aAAa;AAAA,QAChB,uBAAO,MAAC,MAAD;AAAA,UAAM,WAAU;AAAA,SAA2C;AAAA,MACnE,IAAI,aAAa;AAAA,QAChB,uBACC,MAAC,aAAD;AAAA,UAAY,WAAU;AAAA,SAA2C;AAAA,MAEnE,IAAI,aAAa;AAAA,QAChB,uBAAO,MAAC,WAAD;AAAA,UAAU,WAAU;AAAA,SAAgC;AAAA,MAC5D,IACC,aAAa,aACb,aAAa,UACb,aAAa;AAAA,QAEb,uBACC,MAAC,SAAD;AAAA,UAAQ,WAAU;AAAA,SAA6C;AAAA,MAEjE,IAAI,aAAa;AAAA,QAChB,uBACC,MAAC,MAAD;AAAA,UAAM,WAAU;AAAA,SAA+C;AAAA,MAEjE,IAAI,aAAa;AAAA,QAChB,uBACC,MAAC,YAAD;AAAA,UAAW,WAAU;AAAA,SAA2C;AAAA,MAElE,IAAI,aAAa;AAAA,QAChB,uBACC,MAAC,MAAD;AAAA,UAAM,WAAU;AAAA,SAA+C;AAAA,MAEjE,IAAI,aAAa;AAAA,QAChB,uBACC,MAAC,YAAD;AAAA,UAAW,WAAU;AAAA,SAAiD;AAAA,MAExE,IAAI,aAAa;AAAA,QAChB,uBACC,MAAC,QAAD;AAAA,UAAO,WAAU;AAAA,SAAiD;AAAA,MAEpE,IACC,aAAa,oBACb,aAAa,oBACb,aAAa,oBACb,aAAa,yBACb,aAAa;AAAA,QAEb,uBACC,MAAC,UAAD;AAAA,UAAU,WAAU;AAAA,SAA2C;AAAA,MAEjE,IAAI,aAAa;AAAA,QAChB,uBACC,MAAC,WAAD;AAAA,UAAU,WAAU;AAAA,SAA6C;AAAA,MAEnE,IAAI,aAAa;AAAA,QAChB,uBACC,MAAC,WAAD;AAAA,UAAU,WAAU;AAAA,SAA+C;AAAA,MAErE,IAAI,SAAS,SAAS,IAAI;AAAA,QACzB,uBACC,MAAC,OAAD;AAAA,UAAM,WAAU;AAAA,SAA+C;AAAA,MAEjE,uBAAO,MAAC,WAAD;AAAA,QAAU,WAAU;AAAA,OAAgC;AAAA,IAC5D;AAAA,IAEA,uBACC,MAAC,WAAD;AAAA,MAAU,WAAU;AAAA,KAA+C;AAAA;AAAA,EAIrE,MAAM,mBAAmB,MAAM;AAAA,IAC9B,MAAM,WAAW,KAAK,YAAY;AAAA,IAElC,IAAI;AAAA,IACJ,IAAI;AAAA,MACH,IAAI,KAAK,eAAe,OAAO,KAAK,gBAAgB,UAAU;AAAA,QAC7D,cAAc,KAAK;AAAA,MACpB,EAAO,SAAI,OAAO,KAAK,YAAY,UAAU;AAAA,QAC5C,cAAc,KAAK,MAAM,KAAK,OAAO;AAAA,MACtC,EAAO;AAAA,QACN,cAAc,CAAC;AAAA;AAAA,MAEf,MAAM;AAAA,MACP,cAAc,EAAE,QAAQ,KAAK,QAAQ;AAAA;AAAA,IAGtC,uBACC,MAAC,oBAAD;AAAA,MACC;AAAA,MACA;AAAA,MACA,gBAAgB,KAAK;AAAA,MACrB,OAAO;AAAA,MACP;AAAA,MACA;AAAA,KACD;AAAA;AAAA,EAIF,MAAM,gBAAgB,MAAM;AAAA,IAC3B,IAAI,KAAK,SAAS,aAAa;AAAA,MAC9B,uBAAO,MAAC,mBAAD;AAAA,QAAmB;AAAA,OAAY;AAAA,IACvC;AAAA,IAEA,IAAI,KAAK,SAAS,QAAQ;AAAA,MACzB,IAAI,UAAU;AAAA,MACd,MAAM,OAAO,KAAK,eAAe,KAAK;AAAA,MACtC,IAAI,QAAQ,OAAO,SAAS,YAAY,UAAU,MAAM;AAAA,QACvD,UAAU,OAAO,KAAK,IAAI;AAAA,MAC3B,EAAO,SAAI,OAAO,SAAS,UAAU;AAAA,QACpC,UAAU;AAAA,MACX,EAAO,SAAI,MAAM;AAAA,QAChB,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,MACvC;AAAA,MAEA,uBACC,OAgGE,OAhGF;AAAA,QAAK,WAAU;AAAA,QAAf,UAgGE;AAAA,0BA/FD,MAME,OANF;AAAA,YAAK,WAAU;AAAA,YAAf,0BACC,MAAC,YAAD;AAAA,cACC,MAAM;AAAA,cACN,WAAU;AAAA,cACV,MAAK;AAAA,aACN;AAAA,WACC;AAAA,0BACF,MA8EE,OA9EF;AAAA,YAAK,WAAU;AAAA,YAAf,0BACC,MA4EE,eA5EF;AAAA,cACC,eAAe,CAAC,SAAS;AAAA,cACzB,YAAY;AAAA,gBACX,GAAG;AAAA,kBACF;AAAA,kBACA;AAAA,qBACG;AAAA,sCAEH,MAmBE,KAnBF;AAAA,kBACC;AAAA,kBACA,QAAO;AAAA,kBACP,KAAI;AAAA,kBACJ,SAAS,CAAC,MAAM;AAAA,oBACf,IAAI,OAAO,SAAS,OAAO,OAAO,MAAM;AAAA,sBACvC,EAAE,eAAe;AAAA,sBACjB,OAAO,OAAO,YACb;AAAA,wBACC,MAAM;AAAA,wBACN,KAAK;AAAA,sBACN,GACA,GACD;AAAA,oBACD;AAAA;AAAA,qBAEG;AAAA,kBAhBL;AAAA,iBAmBE;AAAA,gBAEH,KAAK;AAAA,kBACJ;AAAA,qBACG;AAAA,sBACmC;AAAA,kBACtC,MAAM,eAAe,MAAM;AAAA,oBAC1B,IAAI,CAAC;AAAA,sBAAU,OAAO;AAAA,oBACtB,MAAM,QAAQ,MAAM,QAAQ,QAAQ,IACjC,SAAS,KACT;AAAA,oBACH,IACC,SACA,OAAO,UAAU,YACjB,WAAW,OACV;AAAA,sBACD,MAAM,YAAY,MAAM;AAAA,sBACxB,IAAI,OAAO,UAAU,aAAa,UAAU;AAAA,wBAC3C,OAAO,UAAU;AAAA,sBAClB;AAAA,oBACD;AAAA,oBACA,OAAO;AAAA,qBACL;AAAA,kBACH,uBACC,OAWE,OAXF;AAAA,oBAAK,WAAU;AAAA,oBAAf,UAWE;AAAA,sCAVD,MAME,OANF;AAAA,wBAAK,WAAU;AAAA,wBAAf,0BACC,MAAC,YAAD;AAAA,0BACC,MAAM;AAAA,0BACN,WAAU;AAAA,0BACV,MAAK;AAAA,yBACN;AAAA,uBACC;AAAA,sCACF,MAEE,OAFF;AAAA,2BAAS;AAAA,wBAAO,WAAU;AAAA,wBAA1B;AAAA,uBAEE;AAAA;AAAA,mBACD;AAAA;AAAA,gBAGJ,OAAO;AAAA,kBACN;AAAA,qBACG;AAAA,sCAEH,MAEE,OAFF;AAAA,kBAAK,WAAU;AAAA,kBAAf,0BACC,MAA8B,SAA9B;AAAA,uBAAW;AAAA,oBAAX;AAAA,mBAA8B;AAAA,iBAC7B;AAAA,cAEJ;AAAA,cAzED,UA2EE;AAAA,aACA;AAAA,WACD;AAAA,UACD,QAAQ,SAAS,uBACjB,MAME,OANF;AAAA,YAAK,WAAU;AAAA,YAAf,0BACC,MAAC,YAAD;AAAA,cACC,MAAM;AAAA,cACN,WAAU;AAAA,cACV,MAAK;AAAA,aACN;AAAA,WACC;AAAA;AAAA,OAEF;AAAA,IAEJ;AAAA,IAEA,IAAI,KAAK,SAAS,SAAS;AAAA,MAC1B,IAAI;AAAA,MACJ,IAAI;AAAA,QACH,IAAI,KAAK,eAAe,OAAO,KAAK,gBAAgB,UAAU;AAAA,UAC7D,cAAc,KAAK;AAAA,QACpB,EAAO,SAAI,OAAO,KAAK,YAAY,UAAU;AAAA,UAC5C,cAAc,KAAK,MAAM,KAAK,OAAO;AAAA,QACtC,EAAO;AAAA,UACN,cAAc,CAAC;AAAA;AAAA,QAEf,MAAM;AAAA,QACP,cAAc;AAAA,UACb,SAAS,KAAK,WAAW;AAAA,QAC1B;AAAA;AAAA,MAGD,uBACC,MAAC,oBAAD;AAAA,QACC,UAAS;AAAA,QACT;AAAA,QACA,gBAAgB,KAAK;AAAA,QACrB,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,OACD;AAAA,IAEF;AAAA,IAEA,IAAI,KAAK,SAAS,aAAa;AAAA,MAC9B,MAAM,UAAU,mBAAmB,IAAI;AAAA,MACvC,MAAM,cACL,KAAK,aACJ,OAAQ,SAAgC,SAAS,WAC7C,QAA+B,OACjC;AAAA,MACJ,MAAM,YAAY,YAAY,SAAS,IAAI,IACxC,YAAY,QAAQ,MAAM,KAAI,IAC9B,YAAY,QAAQ,MAAM,GAAG;AAAA,MAGhC,MAAM,WAAW,gBAAgB,IAAI;AAAA,MACrC,MAAM,eAAe,iBAAiB;AAAA,MAGtC,MAAM,OAAO,YAAY;AAAA,MACzB,MAAM,UAAU,qBAAoB,aAAa,IAAI;AAAA,MACrD,MAAM,cAAc,kBAAkB,MAAM,SAAS,GAAG;AAAA,MACxD,MAAM,UAAU,gBAAgB,SAAS,mBAAkB,IAAI,IAAI;AAAA,MACnE,MAAM,WAAoD,CAAC;AAAA,MAC3D,IAAI,SAAS;AAAA,QACZ,SAAS,KAAK;AAAA,UACb,KAAK;AAAA,UACL,sBACC,MAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UACE;AAAA,WACA;AAAA,QAEJ,CAAC;AAAA,MACF,EAAO,SAAI,SAAS;AAAA,QACnB,SAAS,KAAK;AAAA,UACb,KAAK;AAAA,UACL,sBACC,MAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UACE,QAAQ;AAAA,WACR;AAAA,QAEJ,CAAC;AAAA,MACF;AAAA,MACA,IAAI,aAAa;AAAA,QAChB,SAAS,KAAK;AAAA,UACb,KAAK;AAAA,UACL,sBACC,MAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB,UACE;AAAA,WACA;AAAA,QAEJ,CAAC;AAAA,MACF;AAAA,MAGA,MAAM,qBACL,mBAAmB,gBAAgB,WAAW,KAAK;AAAA,MAEpD,IAAI,sBAAsB,aAAa,UAAU;AAAA,QAChD,uBACC,MAAC,kBAAD;AAAA,UACC,UAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,SACD;AAAA,MAEF,EAAO,SAAI,SAAS,WAAW,GAAG;AAAA,QACjC,SAAS,KAAK;AAAA,UACb,KAAK;AAAA,UACL,sBAAM,MAAoD,QAApD;AAAA,YAAM,WAAU;AAAA,YAAhB;AAAA,WAAoD;AAAA,QAC3D,CAAC;AAAA,MACF;AAAA,MAEA,MAAM,mBAAmB;AAAA,QACxB;AAAA,MACD;AAAA,MACA,IAAI,KAAK;AAAA,QAAW,iBAAiB,KAAK,eAAe;AAAA,MACzD,uBACC,OAQE,OARF;AAAA,QAAK,WAAW,iBAAiB,KAAK,GAAG;AAAA,QAAzC,UAQE;AAAA,0BAPD,MAA2D,QAA3D;AAAA,YAAM,WAAU;AAAA,YAAhB,UAA+C;AAAA,WAAY;AAAA,UAC1D,SAAS,IAAI,CAAC,4BACd,OAGE,YAHF;AAAA,sBAGE;AAAA,8BAFD,MAA6C,QAA7C;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAA6C;AAAA,cAC5C,QAAQ;AAAA;AAAA,aAFK,QAAQ,GAGrB,CACF;AAAA;AAAA,OACA;AAAA,IAEJ;AAAA,IAEA,IAAI,KAAK,SAAS,eAAe;AAAA,MAChC,OAAO,iBAAiB;AAAA,IACzB;AAAA,IAEA,OAAO;AAAA;AAAA,EAGR,uBACC,OAcE,OAdF;AAAA,IAAK,WAAU;AAAA,IAAf,UAcE;AAAA,sBAbD,OAUE,OAVF;AAAA,QAAK,WAAU;AAAA,QAAf,UAUE;AAAA,0BATD,MAEE,OAFF;AAAA,YAAK,WAAU;AAAA,YAAf,UACE,WAAW;AAAA,WACX;AAAA,UACD,4BACA,MAAC,OAAD;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,KAAK,WAAW,QAAQ,UAAU;AAAA,WAC5C;AAAA;AAAA,OAEA;AAAA,sBAEF,MAAqD,OAArD;AAAA,QAAK,WAAW;AAAA,QAAhB,UAAmC,cAAc;AAAA,OAAI;AAAA;AAAA,GACpD;AAAA,GAGJ,CAAC,WAAW,cAAc;AAAA,EACzB,OACC,UAAU,KAAK,OAAO,UAAU,KAAK,MACrC,UAAU,KAAK,YAAY,UAAU,KAAK,WAC1C,UAAU,KAAK,gBAAgB,UAAU,KAAK,eAC9C,UAAU,KAAK,cAAc,UAAU,KAAK,aAC5C,UAAU,KAAK,gBAAgB,UAAU,KAAK,eAC9C,UAAU,aAAa,UAAU,YACjC,UAAU,mBAAmB,UAAU,kBACvC,UAAU,yBAAyB,UAAU,wBAC7C,UAAU,YAAY,UAAU,WAChC,UAAU,wBAAwB,UAAU,uBAC5C,UAAU,iBAAiB,WAAW,UAAU,iBAAiB,UACjE,UAAU,cAAc,UAAU,aAClC,UAAU,aAAa,UAAU;AAAA,CAGpC;;;AmCvoBA,sBAAS,wBAAW,oBAAS,qBAAQ;AACrC,kBAAS,kBAAO;;;ACChB,IAAM,yBAAyB,IAAI,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,CAAC;AAkBD,SAAS,cAAc,CAAC,MAAmD;AAAA,EAC1E,IAAI,KAAK,eAAe,OAAO,KAAK,gBAAgB,UAAU;AAAA,IAC7D,OAAO,KAAK;AAAA,EACb;AAAA,EAEA,IAAI;AAAA,IACH,IAAI,KAAK,SAAS;AAAA,MACjB,MAAM,SAAS,KAAK,MAAM,KAAK,OAAO;AAAA,MACtC,IAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG;AAAA,QACnE,OAAO;AAAA,MACR;AAAA,IACD;AAAA,IACC,MAAM;AAAA,EAER,OAAO;AAAA;AAGR,SAAS,WAAW,CAAC,MAA4C;AAAA,EAChE,MAAM,UAAU,eAAe,IAAI;AAAA,EACnC,MAAM,OAAO,SAAS;AAAA,EACtB,IAAI,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,GAAG;AAAA,IAC7D,OAAO;AAAA,EACR;AAAA,EACA,OAAO,CAAC;AAAA;AAGT,SAAS,aAAa,CAAC,MAA4C;AAAA,EAClE,MAAM,UAAU,eAAe,IAAI;AAAA,EACnC,MAAM,SAAS,SAAS;AAAA,EACxB,IAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG;AAAA,IACnE,OAAO;AAAA,EACR;AAAA,EACA,OAAO,CAAC;AAAA;AAGT,SAAS,QAAQ,CAAC,OAAe,MAAM,IAAY;AAAA,EAClD,OAAO,MAAM,SAAS,MAAM,GAAG,MAAM,MAAM,GAAG,MAAM,CAAC,OAAM;AAAA;AAG5D,SAAS,gBAAgB,CAAC,MAA2B;AAAA,EACpD,MAAM,UAAU,eAAe,IAAI;AAAA,EACnC,MAAM,OAAO,SAAS;AAAA,EACtB,IAAI,OAAO,SAAS,YAAY,KAAK,KAAK,GAAG;AAAA,IAC5C,OAAO,KAAK,KAAK;AAAA,EAClB;AAAA,EACA,IAAI,OAAO,KAAK,YAAY,UAAU;AAAA,IACrC,OAAO,KAAK,QAAQ,KAAK;AAAA,EAC1B;AAAA,EACA,OAAO;AAAA;AAGR,SAAS,mBAAmB,CAAC,OAAuB;AAAA,EACnD,MAAM,OAAO,MACX,MAAM;AAAA,CAAI,EACV,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,KAAK,OAAO;AAAA,EACd,OAAO,QAAQ,MAAM,KAAK;AAAA;AAG3B,SAAS,mBAAmB,CAAC,OAAuB;AAAA,EACnD,OAAO,MACL,QAAQ,mBAAmB,EAAE,EAC7B,QAAQ,aAAa,EAAE,EACvB,QAAQ,uBAAuB,IAAI,EACnC,QAAQ,cAAc,EAAE,EACxB,QAAQ,QAAQ,GAAG,EACnB,KAAK;AAAA;AAGR,SAAS,cAAc,CACtB,WACG,MACkB;AAAA,EACrB,WAAW,OAAO,MAAM;AAAA,IACvB,MAAM,QAAQ,OAAO;AAAA,IACrB,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,GAAG;AAAA,MAC9C,OAAO,MAAM,KAAK;AAAA,IACnB;AAAA,EACD;AAAA,EACA;AAAA;AAOM,SAAS,qBAAqB,CAAC,MAA4B;AAAA,EACjE,IAAI,KAAK,SAAS,aAAa;AAAA,IAC9B,OAAO;AAAA,EACR;AAAA,EAEA,IAAI,KAAK,SAAS,eAAe,KAAK,SAAS,eAAe;AAAA,IAC7D,OAAO;AAAA,EACR;AAAA,EAEA,OAAO,QAAQ,KAAK,YAAY,uBAAuB,IAAI,KAAK,QAAQ,CAAC;AAAA;AAMnE,SAAS,uBAAuB,CACtC,MAC8B;AAAA,EAC9B,IAAI,KAAK,SAAS,aAAa;AAAA,IAC9B,MAAM,YAAY,oBACjB,oBAAoB,iBAAiB,IAAI,CAAC,CAC3C;AAAA,IACA,OAAO;AAAA,MACN,IAAI,KAAK;AAAA,MACT,OAAO,YAAY,SAAS,SAAS,IAAI;AAAA,MACzC,UAAU;AAAA,MACV,WAAW,KAAK;AAAA,MAChB,aAAa,KAAK;AAAA,IACnB;AAAA,EACD;AAAA,EAEA,IAAI,CAAC,KAAK,YAAY,CAAC,uBAAuB,IAAI,KAAK,QAAQ,GAAG;AAAA,IACjE,OAAO;AAAA,EACR;AAAA,EAEA,MAAM,OAAO,YAAY,IAAI;AAAA,EAC7B,MAAM,SAAS,cAAc,IAAI;AAAA,EAEjC,IAAI,KAAK,aAAa,QAAQ;AAAA,IAC7B,MAAM,OAAO,eAAe,QAAQ,MAAM,KAAK,eAAe,MAAM,MAAM;AAAA,IAC1E,OAAO;AAAA,MACN,IAAI,KAAK;AAAA,MACT,UAAU,KAAK;AAAA,MACf;AAAA,MACA,OAAO,OAAO,WAAW,SAAS,IAAI,MAAM;AAAA,MAC5C,WAAW,KAAK;AAAA,MAChB,aAAa,KAAK;AAAA,IACnB;AAAA,EACD;AAAA,EAEA,IAAI,KAAK,aAAa,QAAQ,KAAK,aAAa,QAAQ;AAAA,IACvD,MAAM,OAAO,eAAe,MAAM,MAAM,KAAK,eAAe,QAAQ,MAAM;AAAA,IAC1E,OAAO;AAAA,MACN,IAAI,KAAK;AAAA,MACT,UAAU,KAAK;AAAA,MACf;AAAA,MACA,OAAO,OAAO,YAAY,SAAS,IAAI,MAAM;AAAA,MAC7C,WAAW,KAAK;AAAA,MAChB,aAAa,KAAK;AAAA,IACnB;AAAA,EACD;AAAA,EAEA,IACC,KAAK,aAAa,aAClB,KAAK,aAAa,UAClB,KAAK,aAAa,QACjB;AAAA,IACD,MAAM,QACL,eAAe,MAAM,SAAS,WAAW,aAAa,KACtD,eAAe,QAAQ,SAAS,SAAS;AAAA,IAC1C,OAAO;AAAA,MACN,IAAI,KAAK;AAAA,MACT,UAAU,KAAK;AAAA,MACf;AAAA,MACA,OAAO,QAAQ,iBAAiB,SAAS,OAAO,EAAE,MAAM;AAAA,MACxD,WAAW,KAAK;AAAA,MAChB,aAAa,KAAK;AAAA,IACnB;AAAA,EACD;AAAA,EAEA,IAAI,KAAK,aAAa,aAAa;AAAA,IAClC,MAAM,QAAQ,eAAe,MAAM,OAAO;AAAA,IAC1C,MAAM,MAAM,eAAe,MAAM,KAAK,KAAK,eAAe,QAAQ,KAAK;AAAA,IACvE,OAAO;AAAA,MACN,IAAI,KAAK;AAAA,MACT,UAAU,KAAK;AAAA,MACf;AAAA,MACA;AAAA,MACA,OAAO,QACJ,eAAe,SAAS,OAAO,EAAE,MACjC,MACC,aAAa,SAAS,KAAK,EAAE,MAC7B;AAAA,MACJ,WAAW,KAAK;AAAA,MAChB,aAAa,KAAK;AAAA,IACnB;AAAA,EACD;AAAA,EAEA,IAAI,KAAK,aAAa,SAAS;AAAA,IAC9B,MAAM,YAAY,eAAe,MAAM,MAAM;AAAA,IAC7C,OAAO;AAAA,MACN,IAAI,KAAK;AAAA,MACT,UAAU,KAAK;AAAA,MACf,OAAO,YACJ,iBAAiB,SAAS,WAAW,EAAE,MACvC;AAAA,MACH,WAAW,KAAK;AAAA,MAChB,aAAa,KAAK;AAAA,IACnB;AAAA,EACD;AAAA,EAEA,OAAO;AAAA,IACN,IAAI,KAAK;AAAA,IACT,UAAU,KAAK;AAAA,IACf,OAAO;AAAA,IACP,WAAW,KAAK;AAAA,IAChB,aAAa,KAAK;AAAA,EACnB;AAAA;AAMM,SAAS,2BAA2B,CAC1C,OACyB;AAAA,EACzB,MAAM,oBAAoB,IAAI;AAAA,EAE9B,WAAW,QAAQ,OAAO;AAAA,IACzB,IAAI,KAAK,SAAS,iBAAiB,KAAK,YAAY;AAAA,MACnD,kBAAkB,IAAI,KAAK,YAAY,IAAI;AAAA,IAC5C;AAAA,EACD;AAAA,EAEA,MAAM,UAAkC,CAAC;AAAA,EAEzC,WAAW,QAAQ,OAAO;AAAA,IACzB,IACC,KAAK,SAAS,eACd,KAAK,cACL,kBAAkB,IAAI,KAAK,UAAU,GACpC;AAAA,MACD;AAAA,IACD;AAAA,IAEA,MAAM,QAAQ,wBAAwB,IAAI;AAAA,IAC1C,IAAI,OAAO;AAAA,MACV,QAAQ,KAAK,KAAK;AAAA,IACnB;AAAA,EACD;AAAA,EAEA,OAAO;AAAA;AAGR,SAAS,sBAAsB,CAAC,SAA8C;AAAA,EAC7E,MAAM,QAAQ,IAAI;AAAA,EAElB,WAAW,SAAS,SAAS;AAAA,IAC5B,IAAI,MAAM,MAAM;AAAA,MACf,MAAM,IAAI,MAAM,IAAI;AAAA,IACrB;AAAA,EACD;AAAA,EAEA,OAAO;AAAA;AAGR,SAAS,gBAAgB,CAAC,SAAgD;AAAA,EACzE,IAAI,WAA0B;AAAA,EAC9B,IAAI,SAAwB;AAAA,EAE5B,WAAW,SAAS,SAAS;AAAA,IAC5B,MAAM,QAAQ,MAAM,aAAa;AAAA,IACjC,MAAM,MAAM,MAAM,eAAe,MAAM,aAAa;AAAA,IACpD,IAAI,UAAU,SAAS,aAAa,QAAQ,QAAQ,WAAW;AAAA,MAC9D,WAAW;AAAA,IACZ;AAAA,IACA,IAAI,QAAQ,SAAS,WAAW,QAAQ,MAAM,SAAS;AAAA,MACtD,SAAS;AAAA,IACV;AAAA,EACD;AAAA,EAEA,IAAI,aAAa,QAAQ,WAAW,QAAQ,SAAS,UAAU;AAAA,IAC9D,OAAO,SAAS;AAAA,EACjB;AAAA,EACA,OAAO;AAAA;AAGR,SAAS,eAAc,CAAC,IAAoB;AAAA,EAC3C,MAAM,OAAO,KAAK,MAAM,KAAK,IAAI;AAAA,EACjC,IAAI,OAAO;AAAA,IAAI,OAAO,GAAG;AAAA,EACzB,MAAM,OAAO,KAAK,MAAM,OAAO,EAAE;AAAA,EACjC,MAAM,MAAM,OAAO;AAAA,EACnB,OAAO,MAAM,IAAI,GAAG,SAAS,SAAS,GAAG;AAAA;AAMnC,SAAS,0BAA0B,CACzC,SACyB;AAAA,EACzB,MAAM,QAAQ,uBAAuB,OAAO;AAAA,EAC5C,IAAI,WAAW;AAAA,EACf,IAAI,QAAQ;AAAA,EACZ,IAAI,aAAa;AAAA,EACjB,IAAI,YAAY;AAAA,EAChB,IAAI,iBAAiB;AAAA,EAErB,WAAW,SAAS,SAAS;AAAA,IAC5B,QAAQ,MAAM;AAAA,WACR;AAAA,QACJ,aAAa;AAAA,QACb;AAAA,WACI;AAAA,QACJ;AAAA,WACI;AAAA,WACA;AAAA,QACJ,SAAS;AAAA,QACT;AAAA,WACI;AAAA,WACA;AAAA,WACA;AAAA,QACJ,YAAY;AAAA,QACZ;AAAA,WACI;AAAA,QACJ,cAAc;AAAA,QACd;AAAA,WACI;AAAA,WACA;AAAA,WACA;AAAA,WACA;AAAA,WACA;AAAA,WACA;AAAA,QACJ,kBAAkB;AAAA,QAClB;AAAA;AAAA,EAEH;AAAA,EACA,MAAM,mBAAmB,MAAM,OAAO,KAAK,QAAQ;AAAA,EACnD,MAAM,YAAY,iBAAiB,OAAO;AAAA,EAC1C,MAAM,cAAc,cAAc,OAAO,gBAAe,SAAS,IAAI;AAAA,EAErE,MAAM,kBACL,YAAY,KACZ,MAAM,SAAS,KACf,aAAa,KACb,UAAU,KACV,eAAe,KACf,mBAAmB;AAAA,EAEpB,MAAM,QAAQ,kBACX,cACC,eAAe,gBACf,iCACD,aAAa,IACZ,oBAAoB,WAAW,IAC9B,wCACA,0BACD,iBAAiB,KAAK,WAAW,IAChC,uCACA,oBAAoB,WAAW,IAC9B,qCACA,QAAQ,IACP,+BACA,MAAM,OAAO,IACZ,2BACA,iBAAiB,IAChB,2BACA;AAAA,EAET,MAAM,UAAoB,CAAC;AAAA,EAC3B,IAAI,CAAC,mBAAmB,aAAa;AAAA,IACpC,QAAQ,KAAK,WAAW;AAAA,EACzB;AAAA,EACA,IAAI,MAAM,OAAO,GAAG;AAAA,IACnB,QAAQ,KAAK,GAAG,MAAM,QAAQ,MAAM,SAAS,IAAI,SAAS,SAAS;AAAA,EACpE;AAAA,EACA,IAAI,WAAW,GAAG;AAAA,IACjB,QAAQ,KAAK,GAAG,YAAY,aAAa,IAAI,WAAW,YAAY;AAAA,EACrE;AAAA,EACA,IAAI,QAAQ,KAAK,MAAM,SAAS,GAAG;AAAA,IAClC,QAAQ,KAAK,GAAG,SAAS,UAAU,IAAI,SAAS,SAAS;AAAA,EAC1D;AAAA,EACA,IAAI,aAAa,GAAG;AAAA,IACnB,QAAQ,KACP,GAAG,cAAc,eAAe,IAAI,eAAe,eACpD;AAAA,EACD;AAAA,EACA,IAAI,iBAAiB,KAAK,UAAU,0BAA0B;AAAA,IAC7D,QAAQ,KAAK,eAAe;AAAA,EAC7B;AAAA,EACA,IAAI,YAAY,KAAK,CAAC,iBAAiB;AAAA,IACtC,QAAQ,KAAK,WAAW;AAAA,EACzB;AAAA,EACA,IAAI,QAAQ,WAAW,KAAK,cAAc,GAAG;AAAA,IAC5C,QAAQ,KACP,GAAG,QAAQ,UAAU,QAAQ,WAAW,IAAI,SAAS,SACtD;AAAA,EACD;AAAA,EAEA,OAAO,EAAE,OAAO,QAAQ;AAAA;;;;AD5ZzB,IAAM,cAAc;AACpB,IAAM,QAAQ;AACd,IAAM,UAAU;AAChB,IAAM,OAAO,QAAQ;AACrB,IAAM,UAAU;AAChB,IAAM,SAAS;AASR,SAAS,oBAAoB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GAC6B;AAAA,EAC7B,MAAM,mBAAmB,aAAa,QAAQ,SAAS;AAAA,EACvD,OAAO,aAAa,kBAAkB,WAAS,gBAAgB;AAAA,EAC/D,OAAO,SAAS,cAAc,WAAS,gBAAgB;AAAA,EACvD,OAAO,UAAU,eAAe,WAAiC,MAChE,QAAQ,MAAM,CAAC,WAAW,CAC3B;AAAA,EACA,OAAO,aAAa,kBAAkB,WAAS,CAAC;AAAA,EAChD,OAAO,WAAW,gBAAgB,WAAS,KAAK;AAAA,EAChD,OAAO,QAAQ,aAAa,WAAsB,IAAI,GAAK;AAAA,EAC3D,OAAO,YAAY,iBAAiB,WAAS,CAAC;AAAA,EAC9C,MAAM,iBAAiB,QAAO,OAAO;AAAA,EACrC,MAAM,YAAY,QAA2B,SAAS;AAAA,EACtD,MAAM,cAAc,QAA2B,SAAS;AAAA,EAExD,MAAM,UAAU,SAAQ,MAAM,2BAA2B,OAAO,GAAG,CAAC,OAAO,CAAC;AAAA,EAC5E,MAAM,eAAe,iBAAiB,QAAQ;AAAA,EAC9C,MAAM,cAAc,CAAC,cAAc,GAAG,QAAQ,OAAO,EAAE,KAAK,KAAS;AAAA,EACrE,MAAM,eAAe,QAAQ,KAAK,CAAC,MAAM,EAAE,aAAa,WAAW;AAAA,EAEnE,MAAM,eAAe,KAAK,IAAI,aAAa,QAAQ,MAAM;AAAA,EACzD,MAAM,UACL,eAAe,QAAQ,KAAK,IAAI,GAAG,eAAe,CAAC,IAAI;AAAA,EAExD,YAAU,MAAM;AAAA,IACf,IAAI,CAAC,aAAa,CAAC,SAAS;AAAA,MAC3B,eAAe,KAAK;AAAA,MACpB;AAAA,IACD;AAAA,IACA,IAAI,CAAC,WAAW,WAAW;AAAA,MAC1B,WAAW,IAAI;AAAA,IAChB;AAAA,IACA,IAAI;AAAA,MAAa;AAAA,IACjB,IAAI,QAAQ,WAAW;AAAA,MAAG;AAAA,IAC1B,MAAM,IAAI,OAAO,WAAW,MAAM,eAAe,IAAI,GAAG,GAAG;AAAA,IAC3D,OAAO,MAAM,OAAO,aAAa,CAAC;AAAA,KAChC,CAAC,WAAW,aAAa,SAAS,QAAQ,MAAM,CAAC;AAAA,EAEpD,YAAU,MAAM;AAAA,IACf,IAAI;AAAA,MAAa;AAAA,IAEjB,sBAAsB,MAAM;AAAA,MAC3B,cAAc,OAAO;AAAA,KACrB;AAAA,KACC,CAAC,SAAS,WAAW,CAAC;AAAA,EAEzB,YAAU,MAAM;AAAA,IACf,IAAI,UAAU,SAAS;AAAA,MACtB,OAAO,aAAa,UAAU,OAAO;AAAA,MACrC,UAAU,UAAU;AAAA,IACrB;AAAA,IACA,IAAI,YAAY,SAAS;AAAA,MACxB,OAAO,aAAa,YAAY,OAAO;AAAA,MACvC,YAAY,UAAU;AAAA,IACvB;AAAA,IAEA,MAAM,OAAO,eAAe;AAAA,IAC5B,eAAe,UAAU;AAAA,IACzB,MAAM,cAAc,QAAQ,MAAM,CAAC,WAAW;AAAA,IAE9C,IAAI,aAAa;AAAA,MAChB,YAAY,WAAW;AAAA,MACvB,UAAU,IAAI,GAAK;AAAA,MACnB,eAAe,CAAC;AAAA,MAChB,aAAa,KAAK;AAAA,MAClB;AAAA,IACD;AAAA,IAEA,MAAM,WACL,QAAQ,SAAS,KAAK,UACtB,KAAK,MAAM,CAAC,GAAG,MAAM,EAAE,OAAO,QAAQ,IAAI,EAAE;AAAA,IAC7C,MAAM,gBAAgB,WAAW,QAAQ,SAAS,KAAK,SAAS;AAAA,IAEhE,IAAI,kBAAkB,GAAG;AAAA,MACxB,YAAY,WAAW;AAAA,MACvB,UAAU,IAAI,GAAK;AAAA,MACnB,eAAe,CAAC;AAAA,MAChB,aAAa,KAAK;AAAA,MAClB;AAAA,IACD;AAAA,IAEA,MAAM,WAAW,IAAI,IAAI,QAAQ,MAAM,KAAK,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAAA,IACpE,UAAU,QAAQ;AAAA,IAClB,YAAY,UAAU,OAAO,WAAW,MAAM;AAAA,MAC7C,UAAU,IAAI,GAAK;AAAA,MACnB,YAAY,UAAU;AAAA,OACpB,UAAU,EAAE;AAAA,IAEf,MAAM,aAAa,KAAK,UAAU;AAAA,IAElC,IAAI,CAAC,YAAY;AAAA,MAChB,YAAY,WAAW;AAAA,MACvB,eAAe,CAAC;AAAA,MAChB,aAAa,KAAK;AAAA,MAClB;AAAA,IACD;AAAA,IAEA,MAAM,aAAa,KAAK,IAAI,eAAe,WAAW;AAAA,IACtD,MAAM,cAAc,KAAK,MAAM,CAAC,WAAW;AAAA,IAC3C,MAAM,WAAW,CAAC,GAAG,aAAa,GAAG,YAAY,MAAM,CAAC,UAAU,CAAC;AAAA,IACnE,MAAM,YAAY,IAAI;AAAA,IACtB,WAAW,KAAK;AAAA,MAAU,UAAU,IAAI,EAAE,IAAI,CAAC;AAAA,IAC/C,MAAM,UAAU,MAAM,KAAK,UAAU,OAAO,CAAC;AAAA,IAE7C,YAAY,OAAO;AAAA,IACnB,eAAe,CAAC;AAAA,IAChB,aAAa,KAAK;AAAA,IAElB,sBAAsB,MAAM;AAAA,MAC3B,sBAAsB,MAAM;AAAA,QAC3B,aAAa,IAAI;AAAA,QACjB,eAAe,EAAE,aAAa,KAAK;AAAA,OACnC;AAAA,KACD;AAAA,IAED,UAAU,UAAU,OAAO,WAAW,MAAM;AAAA,MAC3C,YAAY,WAAW;AAAA,MACvB,eAAe,CAAC;AAAA,MAChB,aAAa,KAAK;AAAA,MAClB,UAAU,UAAU;AAAA,OAClB,UAAU,EAAE;AAAA,KACb,CAAC,SAAS,WAAW,CAAC;AAAA,EAEzB,YAAU,MAAM;AAAA,IACf,OAAO,MAAM;AAAA,MACZ,IAAI,UAAU;AAAA,QAAS,OAAO,aAAa,UAAU,OAAO;AAAA,MAC5D,IAAI,YAAY;AAAA,QAAS,OAAO,aAAa,YAAY,OAAO;AAAA;AAAA,KAE/D,CAAC,CAAC;AAAA,EAEL,MAAM,SAAS,CAAC;AAAA,EAChB,MAAM,WAAW,QAAQ,SAAS;AAAA,EAElC,uBACC,OA+GE,OA/GF;AAAA,IAAK,WAAU;AAAA,IAAf,UA+GE;AAAA,sBA9GD,OAcE,OAdF;AAAA,QAAK,WAAU;AAAA,QAAf,UAcE;AAAA,0BAbD,MAME,OANF;AAAA,YAAK,WAAU;AAAA,YAAf,UACE,+BACA,MAAC,QAAD;AAAA,cAAO,WAAU;AAAA,aAA+C,oBAEhE,MAAC,SAAD;AAAA,cAAQ,WAAU;AAAA,aAA6C;AAAA,WAE/D;AAAA,UACD,4BACA,MAAC,OAAD;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,KAAK,WAAW,QAAQ,UAAU;AAAA,WAC5C;AAAA;AAAA,OAEA;AAAA,sBAEF,MA2FE,OA3FF;AAAA,QAAK,WAAU;AAAA,QAAf,0BACC,OAyFE,OAzFF;AAAA,UACC,WAAU;AAAA,UACV,OAAO;AAAA,YACN,QAAQ,SACL,uCACA;AAAA,YACH,YAAY,SAAS,4BAA4B;AAAA,YACjD,SAAS,SAAS,aAAa;AAAA,YAC/B,YAAY,UAAU,aAAa,sBAAsB,aAAa,mBAAmB,aAAa;AAAA,UACvG;AAAA,UATD,UAyFE;AAAA,4BA9ED,OA4DE,OA5DF;AAAA,cACC,OAAO;AAAA,gBACN,UAAU;AAAA,gBACV,SAAS,SAAS,IAAI;AAAA,gBACtB,WAAW,SAAS,GAAG,aAAa,SAAS;AAAA,gBAC7C,YAAY,WAAW,aAAa,sBAAsB,aAAa;AAAA,cACxE;AAAA,cAND,UA4DE;AAAA,gCApDD,MAEE,OAFF;AAAA,kBAAK,WAAU;AAAA,kBAAf;AAAA,iBAEE;AAAA,gCACF,MAgDE,OAhDF;AAAA,kBACC,WAAU;AAAA,kBACV,OAAO;AAAA,oBACN,QAAQ,GAAG;AAAA,oBACX,YAAY,UAAU,aAAa;AAAA,oBACnC,WAAW,WACR,mEACA;AAAA,oBACH,iBAAiB,WACd,mEACA;AAAA,kBACJ;AAAA,kBAXD,0BAaC,MAkCE,OAlCF;AAAA,oBACC,WAAU;AAAA,oBACV,OAAO;AAAA,sBACN,WAAW,cAAc;AAAA,sBACzB,YAAY,YACT,aAAa,aAAa,WAC1B;AAAA,oBACJ;AAAA,oBAPD,UASE,SAAS,IAAI,CAAC,OAAO,MAAM;AAAA,sBAC3B,MAAM,QAAQ,OAAO,IAAI,MAAM,EAAE;AAAA,sBACjC,MAAM,WAAW,MAAM,OAAO,QAAQ,QAAQ,SAAS,IAAI;AAAA,sBAC3D,uBACC,MAkBE,OAlBF;AAAA,wBAEC,WAAW,4CACV,WACG,oBACA;AAAA,wBAEJ,OAAO;AAAA,0BACN,QAAQ,GAAG;AAAA,0BACX,WAAW,MAAM,IAAI,IAAI,GAAG;AAAA,0BAC5B,WAAW,QACR,eAAe,aAAa,gBAC5B;AAAA,wBACJ;AAAA,wBAbD,0BAeC,MAEE,QAFF;AAAA,0BAAM,WAAU;AAAA,0BAAhB,UACE,MAAM;AAAA,yBACN;AAAA,yBAhBG,MAAM,EAiBV;AAAA,qBAEH;AAAA,mBACA;AAAA,iBACD;AAAA;AAAA,aACD;AAAA,4BAEF,MAeE,OAfF;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,gBACN,SAAS,cAAc,IAAI;AAAA,gBAC3B,QAAQ,cAAc,SAAS;AAAA,gBAC/B,UAAU;AAAA,gBACV,YAAY,WAAW,aAAa,kBAAkB,aAAa;AAAA,cACpE;AAAA,cAPD,0BASC,MAKE,QALF;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO;AAAA,gBAFR,UAIE;AAAA,eACA;AAAA,aACD;AAAA;AAAA,SACD;AAAA,OACD;AAAA,sBAEF,MAAqI,SAArI;AAAA,kBAAQ;AAAA,OAA6H;AAAA;AAAA,GACpI;AAAA;;;AE/QJ,qBAAS;AAQT,IAAM,oBAAgC;AAAA,EACrC,kBAAkB;AAAA,EAClB,gBAAgB,CAAC;AAAA,EACjB,aAAa;AACd;AAEO,SAAS,aAAa,CAAC,WAA2C;AAAA,EACxE,QAAQ,SAAS,UAAqB;AAAA,IACrC,UAAU,CAAC,cAAc,SAAS;AAAA,IAClC,SAAS,MAAM;AAAA,IACf,SAAS,CAAC,CAAC;AAAA,IACX,aAAa;AAAA,IACb,WAAW;AAAA,EACZ,CAAC;AAAA,EAED,OAAO,QAAQ;AAAA;AAGT,SAAS,uBAAuB,CACtC,WACA,WACqE;AAAA,EACrE,MAAM,aAAa,cAAc,SAAS;AAAA,EAE1C,IAAI,CAAC,aAAa,CAAC,YAAY;AAAA,IAC9B,OAAO,EAAE,UAAU,OAAO,WAAW,OAAO,UAAU,KAAK;AAAA,EAC5D;AAAA,EAEA,IAAI,WAAW,qBAAqB,WAAW;AAAA,IAC9C,OAAO,EAAE,UAAU,OAAO,WAAW,MAAM,UAAU,KAAK;AAAA,EAC3D;AAAA,EAEA,MAAM,aAAa,WAAW,eAAe,KAC5C,CAAC,SAAS,KAAK,cAAc,SAC9B;AAAA,EAEA,IAAI,YAAY;AAAA,IACf,OAAO,EAAE,UAAU,MAAM,WAAW,OAAO,UAAU,WAAW,SAAS;AAAA,EAC1E;AAAA,EAEA,OAAO,EAAE,UAAU,OAAO,WAAW,OAAO,UAAU,KAAK;AAAA;;;AChD5D,qBAAS;AACT,sBAAS,uBAAW;;;ACDpB,qBAAS,0BAAU,gCAAa;AAKzB,SAAS,eAAe,CAAC,WAA+B;AAAA,EAC9D,MAAM,cAAc,gBAAe;AAAA,EAEnC,OAAO,aAAY;AAAA,IAClB,YAAY,CAAC,SAA8B;AAAA,MAC1C,IAAI,CAAC;AAAA,QAAW,MAAM,IAAI,MAAM,eAAe;AAAA,MAC/C,OAAO,UAAU,aAAa,WAAW,IAAI;AAAA;AAAA,IAE9C,WAAW,MAAM;AAAA,MAChB,YAAY,kBAAkB,EAAE,UAAU,iBAAiB,CAAC;AAAA,MAC5D,IAAI,WAAW;AAAA,QACd,YAAY,kBAAkB;AAAA,UAC7B,UAAU,CAAC,YAAY,SAAS;AAAA,QACjC,CAAC;AAAA,MACF;AAAA;AAAA,EAEF,CAAC;AAAA;AAGK,SAAS,WAAW,CAAC,WAA+B;AAAA,EAC1D,OAAO,UAAS;AAAA,IACf,UAAU,CAAC,YAAY,SAAS;AAAA,IAChC,SAAS,MAAM;AAAA,MACd,IAAI,CAAC;AAAA,QAAW,MAAM,IAAI,MAAM,eAAe;AAAA,MAC/C,OAAO,UAAU,aAAa,SAAS;AAAA;AAAA,IAExC,SAAS,QAAQ,SAAS;AAAA,EAC3B,CAAC;AAAA;AAGK,SAAS,gBAAgB,CAAC,WAA+B;AAAA,EAC/D,OAAO,UAAS;AAAA,IACf,UAAU,CAAC,iBAAiB,SAAS;AAAA,IACrC,SAAS,MAAM;AAAA,MACd,IAAI,CAAC;AAAA,QAAW,MAAM,IAAI,MAAM,eAAe;AAAA,MAC/C,OAAO,UAAU,iBAAiB,SAAS;AAAA;AAAA,IAE5C,SAAS,QAAQ,SAAS;AAAA,EAC3B,CAAC;AAAA;;;;AD5BK,SAAS,WAAW;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACoB;AAAA,EACpB,MAAM,UAAU,WAAW,SAAS;AAAA,EACpC,MAAM,eAAe,gBAAgB,SAAS;AAAA,EAE9C,OAAO,OAAO,YAAY,WAAS,EAAE;AAAA,EACrC,OAAO,kBAAkB,uBAAuB,WAAS,IAAI;AAAA,EAC7D,MAAM,UAAU,MAAM;AAAA,EACtB,MAAM,WAAW,MAAM;AAAA,EAEvB,MAAM,iBACL,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,GAAG,WAAW;AAAA,EAC3D,MAAM,iBAAiB,MAAM;AAAA,IAC5B,IAAI;AAAA,MACH,MAAM,SAAS,KAAK,MAAM,cAAc;AAAA,MACxC,OAAO,QAAQ,MAAM,MAAM,GAAG,GAAG,KAAK;AAAA,MACrC,MAAM;AAAA,MACP,OAAO,eAAe,MAAM,GAAG,GAAG;AAAA;AAAA,KAEjC;AAAA,EAEH,MAAM,eAAe,OAAO,MAAuB;AAAA,IAClD,EAAE,eAAe;AAAA,IAEjB,IAAI;AAAA,MACH,MAAM,SAAS,MAAM,aAAa,YAAY;AAAA,QAC7C,eAAe,QAAQ;AAAA,QACvB,OAAO,MAAM,KAAK,KAAK;AAAA,QACvB,UAAU,mBAAmB,SAAS,WAAW;AAAA,QACjD,OAAO,mBAAmB,SAAS,QAAQ;AAAA,QAC3C,OAAO,mBAAmB,SAAS,QAAQ;AAAA,MAC5C,CAAC;AAAA,MAED,QAAQ;AAAA,MACR,IAAI,mBAAmB,OAAO,SAAS;AAAA,QACtC,gBAAgB,OAAO,QAAQ,EAAE;AAAA,MAClC;AAAA,MACC,OAAO,OAAO;AAAA,MACf,QAAQ,MAAM,4BAA4B,KAAK;AAAA;AAAA;AAAA,EAIjD,uBACC,MAkGE,OAlGF;AAAA,IACC;AAAA,IACA;AAAA,IACA,uBACC,OAGE,OAHF;AAAA,MAAK,WAAU;AAAA,MAAf,UAGE;AAAA,wBAFD,MAAC,YAAD;AAAA,UAAW,WAAU;AAAA,SAAuB;AAAA,wBAC5C,MAAsB,QAAtB;AAAA;AAAA,SAAsB;AAAA;AAAA,KACrB;AAAA,IAEH,UAAS;AAAA,IATV,0BAWC,OAsFE,QAtFF;AAAA,MAAM,UAAU;AAAA,MAAc,WAAU;AAAA,MAAxC,UAsFE;AAAA,wBArFD,OAKE,OALF;AAAA,UAAK,WAAU;AAAA,UAAf,UAKE;AAAA,4BAJD,MAAkC,KAAlC;AAAA;AAAA,aAAkC;AAAA,4BAClC,OAEE,KAFF;AAAA,cAAG,WAAU;AAAA,cAAb,UAEE;AAAA,gBAFF;AAAA,gBACG;AAAA,gBADH;AAAA;AAAA,aAEE;AAAA;AAAA,SACD;AAAA,wBAEF,OAeE,OAfF;AAAA,UAAK,WAAU;AAAA,UAAf,UAeE;AAAA,4BAdD,MAKE,SALF;AAAA,cACC,SAAS;AAAA,cACT,WAAU;AAAA,cAFX;AAAA,aAKE;AAAA,4BACF,MAAC,SAAD;AAAA,cACC,IAAI;AAAA,cACJ,MAAK;AAAA,cACL,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,cACxC,aAAa,aAAa,SAAS,SAAS;AAAA,cAC5C,WAAU;AAAA,aACX;AAAA;AAAA,SACC;AAAA,wBAEF,OAWE,OAXF;AAAA,UAAK,WAAU;AAAA,UAAf,UAWE;AAAA,4BAVD,MAAC,SAAD;AAAA,cACC,IAAI;AAAA,cACJ,MAAK;AAAA,cACL,SAAS;AAAA,cACT,UAAU,CAAC,MAAM,oBAAoB,EAAE,OAAO,OAAO;AAAA,cACrD,WAAU;AAAA,aACX;AAAA,4BACA,MAEE,SAFF;AAAA,cAAO,SAAS;AAAA,cAAU,WAAU;AAAA,cAApC;AAAA,aAEE;AAAA;AAAA,SACD;AAAA,QAED,2BACA,MAYE,OAZF;AAAA,UAAK,WAAU;AAAA,UAAf,0BACC,OAUE,OAVF;AAAA,YAAK,WAAU;AAAA,YAAf,UAUE;AAAA,8BATD,OAEE,QAFF;AAAA,0BAEE;AAAA,kCADD,MAAmB,UAAnB;AAAA;AAAA,mBAAmB;AAAA,kBADpB;AAAA,kBAC6B,QAAQ;AAAA;AAAA,eACnC;AAAA,8BACF,OAEE,QAFF;AAAA,0BAEE;AAAA,kCADD,MAAgB,UAAhB;AAAA;AAAA,mBAAgB;AAAA,kBADjB;AAAA,kBAC0B,QAAQ;AAAA;AAAA,eAChC;AAAA,8BACF,OAEE,QAFF;AAAA,0BAEE;AAAA,kCADD,MAAgB,UAAhB;AAAA;AAAA,mBAAgB;AAAA,kBADjB;AAAA,kBAC0B,QAAQ;AAAA;AAAA,eAChC;AAAA;AAAA,WACD;AAAA,SACD;AAAA,wBAGH,OAyBE,OAzBF;AAAA,UAAK,WAAU;AAAA,UAAf,UAyBE;AAAA,4BAxBD,MAME,UANF;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,WAAU;AAAA,cAHX;AAAA,aAME;AAAA,4BACF,MAgBE,UAhBF;AAAA,cACC,MAAK;AAAA,cACL,UAAU,aAAa;AAAA,cACvB,WAAU;AAAA,cAHX,UAKE,aAAa,4BACb;AAAA,0BAGE;AAAA,kCAFD,MAAC,UAAD;AAAA,oBAAS,WAAU;AAAA,mBAAuB;AAAA,kBAD3C;AAAA;AAAA,eAGE,oBAEF;AAAA,0BAGE;AAAA,kCAFD,MAAC,YAAD;AAAA,oBAAW,WAAU;AAAA,mBAAU;AAAA,kBADhC;AAAA;AAAA,eAGE;AAAA,aAEF;AAAA;AAAA,SACD;AAAA,QAED,aAAa,2BACb,MAEE,KAFF;AAAA,UAAG,WAAU;AAAA,UAAb,UACE,aAAa,OAAO,WAAW;AAAA,SAC/B;AAAA;AAAA,KAEF;AAAA,GACD;AAAA;;;;AvC5HJ,IAAM,kBAAkB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AAEA,SAAS,iBAAiB,CAAC,WAAmB;AAAA,EAC7C,MAAM,OAAO,UACX,MAAM,EAAE,EACR,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,WAAW,CAAC,GAAG,CAAC;AAAA,EACnD,OAAO,gBAAgB,OAAO,gBAAgB;AAAA;AAgBxC,IAAM,wBAAwB,MACpC,SAAS,sBAAqB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,GAC8B;AAAA,EAC9B,QAAQ,aAAa,wBAAwB,WAAW,QAAQ,EAAE;AAAA,EAClE,OAAO,WAAW,gBAAgB,WAAS,KAAK;AAAA,EAChD,OAAO,iBAAiB,sBAAsB,WAAS,KAAK;AAAA,EAC5D,OAAO,QAAQ,aAAa,WAAS,KAAK;AAAA,EAG1C,QAAQ,kBAAkB,0BAA0B,qBAAqB;AAAA,EAEzE,MAAM,gBAAgB,cACrB,OAAO,WAAmB;AAAA,IACzB,IAAI,CAAC;AAAA,MAAW;AAAA,IAChB,IAAI;AAAA,MACH,MAAM,UAAU,gBAAgB,WAAW,QAAQ,IAAI;AAAA,MACvD,sBAAsB,MAAM;AAAA,MAC3B,OAAO,OAAO;AAAA,MACf,QAAQ,MAAM,gCAAgC,KAAK;AAAA;AAAA,KAGrD,CAAC,WAAW,qBAAqB,CAClC;AAAA,EAEA,MAAM,eAAe,cACpB,OAAO,WAAmB;AAAA,IACzB,IAAI,CAAC;AAAA,MAAW;AAAA,IAChB,IAAI;AAAA,MACH,MAAM,UAAU,gBAAgB,WAAW,QAAQ,KAAK;AAAA,MACxD,sBAAsB,MAAM;AAAA,MAC3B,OAAO,OAAO;AAAA,MACf,QAAQ,MAAM,+BAA+B,KAAK;AAAA;AAAA,KAGpD,CAAC,WAAW,qBAAqB,CAClC;AAAA,EAGA,MAAM,0BAA0B,UAAQ,MAAM;AAAA,IAC7C,OAAO,iBAAiB,OAAO,CAAC,MAAM,EAAE,cAAc,QAAQ,EAAE;AAAA,KAC9D,CAAC,kBAAkB,QAAQ,EAAE,CAAC;AAAA,EAEjC,MAAM,mBAAmB,cAAY,YAAY;AAAA,IAChD,IAAI,CAAC;AAAA,MAAW;AAAA,IAChB,IAAI;AAAA,MACH,MAAM,QAAQ,IACb,wBAAwB,IAAI,CAAC,MAC5B,UAAU,gBAAgB,WAAW,EAAE,QAAQ,IAAI,CACpD,CACD;AAAA,MACA,WAAW,KAAK,yBAAyB;AAAA,QACxC,sBAAsB,EAAE,MAAM;AAAA,MAC/B;AAAA,MACC,OAAO,OAAO;AAAA,MACf,QAAQ,MAAM,qCAAqC,KAAK;AAAA;AAAA,KAEvD,CAAC,WAAW,yBAAyB,qBAAqB,CAAC;AAAA,EAG9D,MAAM,QAAQ,UAAQ,MAAM;AAAA,IAC3B,MAAM,WAAW,QAAQ,SAAS,CAAC;AAAA,IACnC,OAAO,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM;AAAA,MACnC,MAAM,aAAa,EAAE,SAAS,MAAM,EAAE,SAAS;AAAA,MAC/C,IAAI,cAAc;AAAA,QAAG,OAAO;AAAA,MAC5B,MAAM,YAAY,EAAE,aAAa,MAAM,EAAE,aAAa;AAAA,MACtD,IAAI,aAAa;AAAA,QAAG,OAAO;AAAA,MAE3B,QAAQ,EAAE,aAAa,MAAM,EAAE,aAAa;AAAA,KAC5C;AAAA,KACC,CAAC,QAAQ,KAAK,CAAC;AAAA,EAElB,MAAM,YAAY,MAAM,KAAK,CAAC,SAAS,KAAK,aAAa,QAAQ;AAAA,EACjE,MAAM,4BAA4B,MAAM,OACvC,CAAC,WAAW,MAAM,UACjB,KAAK,SAAS,iBAAiB,KAAK,aAAa,oBAC9C,QACA,WACJ,EACD;AAAA,EACA,MAAM,2BACL,6BAA6B,IAAI,MAAM,6BAA6B;AAAA,EACrE,MAAM,cAAc,UAAQ,MAAM;AAAA,IACjC,MAAM,QAA+B,CAAC;AAAA,IACtC,IAAI,gBAA+B,CAAC;AAAA,IACpC,IAAI,mBAAmB;AAAA,IACvB,IAAI;AAAA,IAEJ,MAAM,qBAAqB,CAAC,cAAuB;AAAA,MAClD,IAAI,cAAc,WAAW,GAAG;AAAA,QAC/B,IAAI,WAAW;AAAA,UACd,eAAe;AAAA,QAChB;AAAA,QACA;AAAA,MACD;AAAA,MAEA,MAAM,UAAU,4BAA4B,aAAa;AAAA,MACzD,IAAI,QAAQ,SAAS,GAAG;AAAA,QACvB,MAAM,KAAK;AAAA,UACV,MAAM;AAAA,UACN,IAAI,WAAW,cAAc,GAAG;AAAA,UAChC;AAAA,UACA,eAAe;AAAA,QAChB,CAAC;AAAA,MACF,EAAO;AAAA,QACN,YAAY,QAAQ,SAAS,cAAc,QAAQ,GAAG;AAAA,UACrD,MAAM,KAAK;AAAA,YACV,MAAM;AAAA,YACN,OAAO,mBAAmB;AAAA,YAC1B;AAAA,UACD,CAAC;AAAA,QACF;AAAA;AAAA,MAGD,gBAAgB,CAAC;AAAA,MACjB,mBAAmB;AAAA,MACnB,eAAe;AAAA;AAAA,IAGhB,YAAY,OAAO,SAAS,MAAM,QAAQ,GAAG;AAAA,MAC5C,MAAM,oBACJ,KAAK,SAAS,iBAAiB,KAAK,SAAS,gBAC9C,KAAK,aAAa;AAAA,MAEnB,IAAI,kBAAkB;AAAA,QACrB,IAAI;AAAA,QACJ,MAAM,UACL,KAAK,eAAe,OAAO,KAAK,gBAAgB,WAC7C,KAAK,cACL;AAAA,QACJ,IAAI,SAAS;AAAA,UACZ,MAAM,SACJ,QAAoC,QACpC,QAAoC;AAAA,UACtC,IAAI,UAAU,OAAO,WAAW,UAAU;AAAA,YACzC,MAAM,IAAK,OAAmC;AAAA,YAC9C,IAAI,OAAO,MAAM,YAAY,EAAE,KAAK,GAAG;AAAA,cACtC,MAAM,EAAE,KAAK;AAAA,YACd;AAAA,UACD;AAAA,QACD;AAAA,QACA,IAAI,KAAK;AAAA,UACR,mBAAmB,GAAG;AAAA,QACvB;AAAA,QACA;AAAA,MACD;AAAA,MAEA,IAAI,WAAW,sBAAsB,IAAI,GAAG;AAAA,QAC3C,IAAI,cAAc,WAAW,GAAG;AAAA,UAC/B,mBAAmB;AAAA,QACpB;AAAA,QACA,cAAc,KAAK,IAAI;AAAA,QACvB;AAAA,MACD;AAAA,MAEA,mBAAmB;AAAA,MACnB,MAAM,KAAK,EAAE,MAAM,QAAQ,OAAO,KAAK,CAAC;AAAA,IACzC;AAAA,IAEA,mBAAmB;AAAA,IACnB,OAAO;AAAA,KACL,CAAC,OAAO,OAAO,CAAC;AAAA,EACnB,MAAM,6BAA6B,YAAY,SAAS;AAAA,EACxD,MAAM,wBAAwB,MAAM,UACnC,CAAC,SACA,EAAE,KAAK,SAAS,iBAAiB,KAAK,aAAa,kBACrD;AAAA,EACA,MAAM,2BACL,QAAQ,WAAW,aACnB,CAAC,aACD,QAAQ,wBAAwB;AAAA,EACjC,MAAM,4BACL,QAAQ,WAAW,aACnB,CAAC,aACD,CAAC,4BACD,CAAC;AAAA,EACF,MAAM,aAAa,CAAC,OAAgB;AAAA,IACnC,IAAI,CAAC;AAAA,MAAI,OAAO;AAAA,IAChB,MAAM,OAAO,IAAI,KAAK,EAAE;AAAA,IACxB,OAAO,KAAK,mBAAmB,CAAC,GAAG;AAAA,MAClC,MAAM;AAAA,MACN,QAAQ;AAAA,IACT,CAAC;AAAA;AAAA,EAGF,MAAM,aAAa,QAAQ,WAAW;AAAA,EAEtC,MAAM,aAAa,cAAY,MAAM;AAAA,IACpC,MAAM,YAAY,MAChB,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,EAC/B,IAAI,CAAC,MAAM;AAAA,MACX,IAAI;AAAA,QACH,MAAM,SAAS,KAAK,MAAM,EAAE,WAAW,IAAI;AAAA,QAC3C,OAAO,QAAQ,QAAQ;AAAA,QACtB,MAAM;AAAA,QACP,OAAO,EAAE,WAAW;AAAA;AAAA,KAErB,EACA,KAAK;AAAA,CAAI;AAAA,IAEX,UAAU,UAAU,UAAU,SAAS;AAAA,IACvC,UAAU,IAAI;AAAA,IACd,WAAW,MAAM,UAAU,KAAK,GAAG,IAAI;AAAA,KACrC,CAAC,KAAK,CAAC;AAAA,EAEV,MAAM,oBAAoB,cAAY,MAAM;AAAA,IAC3C,mBAAmB,IAAI;AAAA,KACrB,CAAC,CAAC;AAAA,EAEL,IAAI,UAAU;AAAA,IACb,OAAO;AAAA,EACR;AAAA,EAEA,uBAEC,OAyNE,OAzNF;AAAA,IACC,WAAU;AAAA,IACV,cAAc,MAAM,aAAa,IAAI;AAAA,IACrC,cAAc,MAAM,aAAa,KAAK;AAAA,IAHvC,UAyNE;AAAA,MApNA,8BACA,OA2DE,OA3DF;AAAA,QAAK,WAAU;AAAA,QAAf,UA2DE;AAAA,0BA1DD,OA+CE,OA/CF;AAAA,YAAK,WAAU;AAAA,YAAf,UA+CE;AAAA,8BA9CD,MAEE,OAFF;AAAA,gBAAK,WAAU;AAAA,gBAAf,0BACC,MAAC,WAAD;AAAA,kBAAU,WAAU;AAAA,iBAAmD;AAAA,eACtE;AAAA,8BACF,OA0CE,OA1CF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UA0CE;AAAA,kBAzCA,QAAQ,yBACR,MAKE,QALF;AAAA,oBACC,WAAW,oDAAoD,UAAU,wCAAwC;AAAA,oBACjH,OAAO,QAAQ;AAAA,oBAFhB,UAIE,QAAQ;AAAA,mBACR;AAAA,kBAEF,QAAQ,4BACR;AAAA,8BASE;AAAA,sBARA,QAAQ,yBACR,MAA6C,QAA7C;AAAA,wBAAM,WAAU;AAAA,wBAAhB;AAAA,uBAA6C;AAAA,sCAE9C,MAAC,cAAD;AAAA,wBACC,UAAU,QAAQ;AAAA,wBAClB,MAAM;AAAA,wBACN,WAAU;AAAA,uBACX;AAAA;AAAA,mBACC;AAAA,kBAEF,QAAQ,yBACR;AAAA,8BAUE;AAAA,sCATD,MAEE,QAFF;AAAA,wBAAM,WAAU;AAAA,wBAAhB;AAAA,uBAEE;AAAA,sCACF,MAKE,QALF;AAAA,wBACC,WAAW,0CAA0C,UAAU,2BAA2B;AAAA,wBAC1F,OAAO,QAAQ;AAAA,wBAFhB,UAIE,QAAQ;AAAA,uBACR;AAAA;AAAA,mBACD;AAAA,kBAEF,QAAQ,6BACR;AAAA,8BAKE;AAAA,sCAJD,MAA6C,QAA7C;AAAA,wBAAM,WAAU;AAAA,wBAAhB;AAAA,uBAA6C;AAAA,sCAC7C,MAEE,QAFF;AAAA,wBAAM,WAAU;AAAA,wBAAhB,UACE,WAAW,QAAQ,SAAS;AAAA,uBAC5B;AAAA;AAAA,mBACD;AAAA;AAAA,eAEF;AAAA;AAAA,WACD;AAAA,UACD,aAAa,cAAc,aAAa,oCACxC,MAOE,UAPF;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,WAAU;AAAA,YACV,OAAM;AAAA,YAJP,0BAMC,MAAC,YAAD;AAAA,cAAW,WAAU;AAAA,aAAU;AAAA,WAC9B;AAAA;AAAA,OAEF;AAAA,sBAGH,OAmGE,OAnGF;AAAA,QAAK,WAAU;AAAA,QAAf,UAmGE;AAAA,UAlGA,YAAY,IAAI,CAAC,MAAM,gBAAgB;AAAA,YACvC,MAAM,sBACL,cAAc,YAAY,SAAS,KACnC,2BACA;AAAA,YAED,IAAI,KAAK,SAAS,SAAS;AAAA,cAC1B,uBACC,MAAC,sBAAD;AAAA,gBAEC,SAAS,KAAK;AAAA,gBACd,eAAe,KAAK;AAAA,gBACpB,UAAU;AAAA,gBACV,WACC,QAAQ,WAAW,aACnB,cAAc,YAAY,SAAS;AAAA,iBAN/B,KAAK,EAQX;AAAA,YAEF;AAAA,YAEA,QAAQ,MAAM,UAAU;AAAA,YACxB,MAAM,aAAa,UAAU,MAAM,SAAS;AAAA,YAE5C,MAAM,kBACL,KAAK,SAAS,eAAe,KAAK,aAC9B,iBAAiB,KAAK,CAAC,MAAM,EAAE,WAAW,KAAK,UAAU,KAC3D,OACC;AAAA,YACJ,MAAM,eACL,KAAK,SAAS,iBAAiB,KAAK,aAAa;AAAA,YAClD,MAAM,WAAW,uBAAuB,CAAC;AAAA,YACzC,MAAM,iBAAiB,KAAK,SAAS,eAAe;AAAA,YAEpD,uBACC,MAAC,iBAAD;AAAA,cAEC;AAAA,cACA;AAAA,cACA,aAAa,UAAU,yBAAyB,CAAC;AAAA,cACjD;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,WAAW;AAAA,cACX,UAAU;AAAA,cACV;AAAA,cACA;AAAA,cACA;AAAA,eAZK,KAAK,EAaX;AAAA,WAED;AAAA,UAGA,wBAAwB,SAAS,qBACjC,OAeE,OAfF;AAAA,YAAK,WAAU;AAAA,YAAf,UAeE;AAAA,8BAdD,MAAC,SAAD;AAAA,gBAAQ,WAAU;AAAA,eAA2D;AAAA,8BAC7E,OAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UAEE;AAAA,kBADA,wBAAwB;AAAA,kBAD1B;AAAA;AAAA,eAEE;AAAA,8BACF,OASE,UATF;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,OAAM;AAAA,gBACN,WAAU;AAAA,gBAJX,UASE;AAAA,kCAHD,MAAC,YAAD;AAAA,oBAAY,WAAU;AAAA,mBAAc;AAAA,kBANrC;AAAA,kCAQC,MAAgD,OAAhD;AAAA,oBAAK,WAAU;AAAA,oBAAf;AAAA,mBAAgD;AAAA;AAAA,eAC/C;AAAA;AAAA,WACD;AAAA,UAGF,4BAA4B,4CAC5B,MAAC,iBAAD;AAAA,YAEC,MAAM;AAAA,YACN,UAAU;AAAA,YACV,aAAa,CAAC,8BAA8B,CAAC;AAAA,YAC7C,sBAAoB;AAAA,YACpB;AAAA,aALK,yBAAyB,EAM/B;AAAA,UAGA,6CACA,OAWE,OAXF;AAAA,YAAK,WAAU;AAAA,YAAf,UAWE;AAAA,8BAVD,MAIE,OAJF;AAAA,gBAAK,WAAU;AAAA,gBAAf,0BACC,MAEE,OAFF;AAAA,kBAAK,WAAU;AAAA,kBAAf,0BACC,MAAC,WAAD;AAAA,oBAAU,WAAU;AAAA,mBAAU;AAAA,iBAC7B;AAAA,eACD;AAAA,8BACF,MAIE,OAJF;AAAA,gBAAK,WAAU;AAAA,gBAAf,0BACC,MAEE,OAFF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UACE,kBAAkB,QAAQ,EAAE;AAAA,iBAC5B;AAAA,eACD;AAAA;AAAA,WACD;AAAA;AAAA,OAEF;AAAA,MAED,cAAc,6BACd,MAmCE,OAnCF;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,kBAAkB,YAAY,QAAQ,MAAM;AAAA,QAFtD,0BAIC,MA8BE,OA9BF;AAAA,UAAK,WAAU;AAAA,UAAf,0BACC,OA4BE,OA5BF;AAAA,YAAK,WAAU;AAAA,YAAf,UA4BE;AAAA,cA3BA,oCACA,OAOE,UAPF;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,WAAU;AAAA,gBAHX,UAOE;AAAA,kCAFD,MAAC,YAAD;AAAA,oBAAW,WAAU;AAAA,mBAAU;AAAA,kBALhC;AAAA;AAAA,eAOE;AAAA,8BAEH,MAgBE,UAhBF;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,WAAU;AAAA,gBAHX,UAKE,yBACA;AAAA,4BAGE;AAAA,oCAFD,MAAC,QAAD;AAAA,sBAAO,WAAU;AAAA,qBAAyB;AAAA,oBAD3C;AAAA;AAAA,iBAGE,oBAEF;AAAA,4BAGE;AAAA,oCAFD,MAAC,OAAD;AAAA,sBAAM,WAAU;AAAA,qBAAU;AAAA,oBAD3B;AAAA;AAAA,iBAGE;AAAA,eAEF;AAAA;AAAA,WACD;AAAA,SACD;AAAA,OACD;AAAA,MAGF,mBAAmB,6BACnB,MAAC,aAAD;AAAA,QACC,QAAQ;AAAA,QACR,SAAS,MAAM,mBAAmB,KAAK;AAAA,QACvC;AAAA,QACA;AAAA,QACA;AAAA,OACD;AAAA;AAAA,GAEA;AAAA,GAGJ,CAAC,WAAW,cAAc;AAAA,EACzB,MAAM,YAAY,UAAU,QAAQ,SAAS,CAAC;AAAA,EAC9C,MAAM,YAAY,UAAU,QAAQ,SAAS,CAAC;AAAA,EAE9C,IAAI,UAAU,WAAW,UAAU,QAAQ;AAAA,IAC1C,OAAO;AAAA,EACR;AAAA,EAEA,SAAS,IAAI,EAAG,IAAI,UAAU,QAAQ,KAAK;AAAA,IAC1C,MAAM,WAAW,UAAU;AAAA,IAC3B,MAAM,WAAW,UAAU;AAAA,IAC3B,IACC,SAAS,OAAO,SAAS,MACzB,SAAS,UAAU,SAAS,SAC5B,SAAS,cAAc,SAAS,aAChC,SAAS,SAAS,SAAS,QAC3B,SAAS,YAAY,SAAS,WAC9B,SAAS,gBAAgB,SAAS,eAClC,SAAS,aAAa,SAAS,YAC/B,SAAS,eAAe,SAAS,cACjC,SAAS,cAAc,SAAS,aAChC,SAAS,gBAAgB,SAAS,eAClC,SAAS,cAAc,SAAS,WAC/B;AAAA,MACD,OAAO;AAAA,IACR;AAAA,EACD;AAAA,EAEA,OACC,UAAU,QAAQ,OAAO,UAAU,QAAQ,MAC3C,UAAU,QAAQ,WAAW,UAAU,QAAQ,UAC/C,UAAU,QAAQ,gBAAgB,UAAU,QAAQ,eACpD,UAAU,eAAe,UAAU,cACnC,UAAU,4BAA4B,UAAU,2BAChD,UAAU,kBAAkB,UAAU,iBACtC,UAAU,cAAc,UAAU,aAClC,UAAU,YAAY,UAAU,WAChC,UAAU,wBAAwB,UAAU;AAAA,CAG/C;;;AyCxiBA,iBAAS,mBAAM;AACf,2BAAS;AACT;AAAA;AAAA,OAEC;AAAA,cACA;AAAA,cACA;AAAA;AAAA,YAEA;AAAA;AAAA,kBAEA;AAAA;AAED;AACA;;AA2BO,IAAM,mBAAmB,MAC/B,SAAS,iBAAgB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,GACyB;AAAA,EACzB,OAAO,eAAe,oBAAoB,WAAwB,IAAI;AAAA,EACtE,MAAM,QAAQ,QAAQ,SAAS,CAAC;AAAA,EAChC,MAAM,cAAc,gBAAe;AAAA,EAEnC,QAAQ,UAAU,aAAa,wBAC9B,WACA,0BAA0B,EAC3B;AAAA,EACA,MAAM,wBAAwB,cAC7B,CAAC,UAAU,MAAM,qBAClB;AAAA,EAEA,MAAM,YAAY,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AAAA,EACvD,MAAM,aAAa,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO;AAAA,EACzD,MAAM,YAAY,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AAAA,EAEvD,MAAM,gBAAgB,UAAU;AAAA,EAChC,IAAI,aAAa;AAAA,EAEjB,IAAI,eAAe;AAAA,IAClB,MAAM,OAAO,cAAc,eAAe,cAAc;AAAA,IACxD,IAAI,QAAQ,OAAO,SAAS,YAAY,UAAU,MAAM;AAAA,MACvD,aAAa,OAAO,KAAK,IAAI;AAAA,IAC9B,EAAO,SAAI,OAAO,SAAS,UAAU;AAAA,MACpC,aAAa;AAAA,IACd,EAAO,SAAI,MAAM;AAAA,MAChB,aAAa,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,IAC1C;AAAA,EACD;AAAA,EAEA,QAAQ,kBAAkB,wBAAwB,cAAc,YAC/D,qBAAqB,UAAU;AAAA,EAEhC,MAAM,SAA6C,CAAC;AAAA,EACpD,WAAW,QAAQ,YAAY;AAAA,IAC9B,IAAI;AAAA,MACH,MAAM,OAAO,KAAK,eAAe,KAAK,MAAM,KAAK,WAAW,IAAI;AAAA,MAChE,IAAI,QAAQ,OAAO,SAAS,YAAY,UAAU,MAAM;AAAA,QACvD,MAAM,UAAU;AAAA,QAChB,MAAM,MAAM,QAAQ,QAAQ,oBAAoB,QAAQ;AAAA,QACxD,OAAO,KAAK,EAAE,IAAI,KAAK,IAAI,IAAI,CAAC;AAAA,MACjC;AAAA,MACC,MAAM;AAAA,EACT;AAAA,EAEA,MAAM,QAA2D,CAAC;AAAA,EAClE,WAAW,QAAQ,WAAW;AAAA,IAC7B,IAAI;AAAA,MACH,MAAM,OAAO,KAAK,eAAe,KAAK,MAAM,KAAK,WAAW,IAAI;AAAA,MAChE,IAAI,QAAQ,OAAO,SAAS,YAAY,UAAU,MAAM;AAAA,QACvD,MAAM,WAAW;AAAA,QACjB,IAAI,SAAS,SAAS,WAAW,SAAS,MAAM;AAAA,UAC/C,MAAM,MAAM,QAAQ,SAAS,oBAAoB,SAAS;AAAA,UAC1D,OAAO,KAAK,EAAE,IAAI,KAAK,IAAI,IAAI,CAAC;AAAA,QACjC,EAAO;AAAA,UACN,MAAM,KAAK;AAAA,YACV,IAAI,KAAK;AAAA,YACT,MAAM,SAAS;AAAA,YACf,MAAM,SAAS;AAAA,UAChB,CAAC;AAAA;AAAA,MAEH;AAAA,MACC,MAAM;AAAA,EACT;AAAA,EAEA,MAAM,aAAa,CAAC,OAAgB;AAAA,IACnC,IAAI,CAAC;AAAA,MAAI,OAAO;AAAA,IAChB,MAAM,OAAO,IAAI,KAAK,EAAE;AAAA,IACxB,OAAO,KAAK,mBAAmB,CAAC,GAAG;AAAA,MAClC,MAAM;AAAA,MACN,QAAQ;AAAA,IACT,CAAC;AAAA;AAAA,EAGF,MAAM,aAAa,QAAQ,KAAK,EAAE,SAAS;AAAA,EAC3C,MAAM,YAAY,OAAO,SAAS;AAAA,EAClC,MAAM,WAAW,MAAM,SAAS;AAAA,EAChC,MAAM,sBAAsB,uBAAuB,SAAS;AAAA,EAE5D,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,YAAY,CAAC;AAAA,IAC9C,OAAO;AAAA,EAER,MAAM,eAAe,YAAY;AAAA,IAChC,IAAI,CAAC,aAAa,CAAC;AAAA,MAAwB;AAAA,IAC3C,sBAAsB,OAAO;AAAA,IAC7B,IAAI;AAAA,MACH,MAAM,UAAU,gBAAgB,WAAW,sBAAsB;AAAA,MAEjE,YAAY,kBAAkB,EAAE,UAAU,CAAC,YAAY,SAAS,EAAE,CAAC;AAAA,MAClE,OAAO,KAAK;AAAA,MACb,QAAQ,MAAM,oCAAoC,GAAG;AAAA;AAAA;AAAA,EAIvD,MAAM,eAAe,YAAY;AAAA,IAChC,IAAI,CAAC,aAAa,CAAC;AAAA,MAAwB;AAAA,IAC3C,IAAI;AAAA,MACH,MAAM,UAAU,gBAAgB,WAAW,sBAAsB;AAAA,MAEjE,YAAY,kBAAkB,EAAE,UAAU,CAAC,YAAY,SAAS,EAAE,CAAC;AAAA,MAClE,OAAO,KAAK;AAAA,MACb,QAAQ,MAAM,oCAAoC,GAAG;AAAA;AAAA;AAAA,EAIvD,uBACC;AAAA,cA4KE;AAAA,sBA3KD,MAgJE,OAhJF;AAAA,QAAK,WAAU;AAAA,QAAf,0BACC,OA8IE,OA9IF;AAAA,UAAK,WAAU;AAAA,UAAf,UA8IE;AAAA,4BA7ID,OAuIE,OAvIF;AAAA,cAAK,WAAU;AAAA,cAAf,UAuIE;AAAA,gCAtID,OAoBE,OApBF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAoBE;AAAA,oCAnBD,MAEE,QAFF;AAAA,sBAAM,WAAU;AAAA,sBAAhB;AAAA,qBAEE;AAAA,oBACD,QAAQ,6BAAa,MAAQ,QAAR;AAAA;AAAA,qBAAQ;AAAA,oBAC7B,QAAQ,6BACR,MAAuC,QAAvC;AAAA,gCAAO,WAAW,QAAQ,SAAS;AAAA,qBAAI;AAAA,oBAEvC,4BACA;AAAA,gCASE;AAAA,wCARD,MAAQ,QAAR;AAAA;AAAA,yBAAQ;AAAA,wCACR,OAME,QANF;AAAA,0BAAM,WAAU;AAAA,0BAAhB,UAME;AAAA,4CALD,MAAC,OAAD;AAAA,8BAAO,WAAU;AAAA,6BAAU;AAAA,4BAD5B;AAAA,4BAGE,aAAa,QAAQ,WAAW,IAC9B,KAAK,WAAW,MAChB;AAAA;AAAA,yBACF;AAAA;AAAA,qBACD;AAAA;AAAA,iBAEF;AAAA,gCACF,OA0FE,OA1FF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UA0FE;AAAA,oBAzFA,6BACA,MAeE,OAfF;AAAA,sBAAK,WAAU;AAAA,sBAAf,UACE,OAAO,IAAI,CAAC,wBACZ,MAWE,UAXF;AAAA,wBAEC,MAAK;AAAA,wBACL,SAAS,MAAM,iBAAiB,IAAI,GAAG;AAAA,wBACvC,WAAU;AAAA,wBAJX,0BAMC,MAAC,OAAD;AAAA,0BACC,KAAK,IAAI;AAAA,0BACT,KAAI;AAAA,0BACJ,WAAU;AAAA,yBACX;AAAA,yBATK,IAAI,EAUR,CACF;AAAA,qBACA;AAAA,oBAEF,4BACA,MAgBE,OAhBF;AAAA,sBAAK,WAAU;AAAA,sBAAf,UACE,MAAM,IAAI,CAAC,yBACX,OAYE,OAZF;AAAA,wBAEC,WAAU;AAAA,wBAFX,UAYE;AAAA,0BARA,KAAK,SAAS,wBACd,MAAC,WAAD;AAAA,4BAAU,WAAU;AAAA,2BAAqC,oBAEzD,MAAC,WAAD;AAAA,4BAAU,WAAU;AAAA,2BAAsC;AAAA,0CAE3D,MAEE,QAFF;AAAA,4BAAM,WAAU;AAAA,4BAAhB,UACE,KAAK;AAAA,2BACL;AAAA;AAAA,yBAVG,KAAK,EAWT,CACF;AAAA,qBACA;AAAA,oBAEF,uCACA,MAYE,OAZF;AAAA,sBAAK,WAAU;AAAA,sBAAf,UACE,uBAAuB,IAAI,CAAC,wBAC5B,OAQE,OARF;AAAA,wBAEC,WAAU;AAAA,wBAFX,UAQE;AAAA,0CAJD,MAAC,eAAD;AAAA,4BAAc,WAAU;AAAA,2BAAsC;AAAA,0CAC9D,MAEE,QAFF;AAAA,4BAAM,WAAU;AAAA,4BAAhB,UACE,IAAI;AAAA,2BACJ;AAAA;AAAA,yBANG,IAAI,EAOR,CACF;AAAA,qBACA;AAAA,oBAEF,8BACA,MAkCE,OAlCF;AAAA,sBAAK,WAAU;AAAA,sBAAf,0BACC,MAgCE,gBAhCF;AAAA,wBACC,eAAe,CAAC,UAAS;AAAA,wBACzB,YAAY;AAAA,0BACX,GAAG;AAAA,4BACF;AAAA,4BACA;AAAA,+BACG;AAAA,gDAEH,MAmBE,KAnBF;AAAA,4BACC;AAAA,4BACA,QAAO;AAAA,4BACP,KAAI;AAAA,4BACJ,SAAS,CAAC,MAAM;AAAA,8BACf,IAAI,OAAO,SAAS,OAAO,OAAO,MAAM;AAAA,gCACvC,EAAE,eAAe;AAAA,gCACjB,OAAO,OAAO,YACb;AAAA,kCACC,MAAM;AAAA,kCACN,KAAK;AAAA,gCACN,GACA,GACD;AAAA,8BACD;AAAA;AAAA,+BAEG;AAAA,4BAhBL;AAAA,2BAmBE;AAAA,wBAEJ;AAAA,wBA7BD,UA+BE,QAAQ,QAAQ,OAAO;AAAA,CAAM;AAAA,uBAC7B;AAAA,qBACD;AAAA;AAAA,iBAEF;AAAA,gBACD,4BACA,OAmBE,OAnBF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAmBE;AAAA,oCAlBD,OAQE,UARF;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,WAAU;AAAA,sBACV,OAAM;AAAA,sBAJP,UAQE;AAAA,wCAFD,MAAC,WAAD;AAAA,0BAAW,WAAU;AAAA,yBAAU;AAAA,wBANhC;AAAA;AAAA,qBAQE;AAAA,oCACF,OAQE,UARF;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,WAAU;AAAA,sBACV,OAAM;AAAA,sBAJP,UAQE;AAAA,wCAFD,MAAC,SAAD;AAAA,0BAAQ,WAAU;AAAA,yBAAU;AAAA,wBAN7B;AAAA;AAAA,qBAQE;AAAA;AAAA,iBACD;AAAA;AAAA,aAEF;AAAA,4BACF,MAIE,OAJF;AAAA,cAAK,WAAU;AAAA,cAAf,0BACC,MAEE,OAFF;AAAA,gBAAK,WAAU;AAAA,gBAAf,0BACC,MAAC,MAAD;AAAA,kBAAM,WAAU;AAAA,iBAAiD;AAAA,eAChE;AAAA,aACD;AAAA;AAAA,SACD;AAAA,OACD;AAAA,MAED,iCACA,OAsBE,OAtBF;AAAA,QACC,MAAK;AAAA,QACL,cAAW;AAAA,QACX,WAAU;AAAA,QACV,SAAS,MAAM,iBAAiB,IAAI;AAAA,QACpC,WAAW,CAAC,MAAM,EAAE,QAAQ,YAAY,iBAAiB,IAAI;AAAA,QAC7D,UAAU;AAAA,QANX,UAsBE;AAAA,0BAdD,MAME,UANF;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM,iBAAiB,IAAI;AAAA,YACpC,WAAU;AAAA,YAHX,0BAKC,MAAC,IAAD;AAAA,cAAG,WAAU;AAAA,aAAqB;AAAA,WACjC;AAAA,0BACF,MAAC,OAAD;AAAA,YACC,KAAK;AAAA,YACL,KAAI;AAAA,YACJ,WAAU;AAAA,YACV,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,YAClC,WAAW,CAAC,MAAM,EAAE,QAAQ,WAAW,EAAE,gBAAgB;AAAA,WAC1D;AAAA;AAAA,OACC;AAAA;AAAA,GAEF;AAAA,GAGJ,CAAC,WAAW,cAAc;AAAA,EACzB,MAAM,gBAAgB,UAAU,QAAQ,QAAQ;AAAA,EAChD,MAAM,gBAAgB,UAAU,QAAQ,QAAQ;AAAA,EAEhD,OACC,UAAU,QAAQ,OAAO,UAAU,QAAQ,MAC3C,eAAe,YAAY,eAAe,WAC1C,eAAe,gBAAgB,eAAe,eAC9C,UAAU,QAAQ,cAAc,UAAU,QAAQ,aAClD,UAAU,QAAQ,OAAO,WAAW,UAAU,QAAQ,OAAO,UAC7D,UAAU,cAAc,UAAU,aAClC,UAAU,2BAA2B,UAAU;AAAA,CAGlD;;;ACrVA,oBAAS;AACT;AAAA;AAAA;AAAA;AAMA;AAAA,WACC;AAAA;AAAA,eAEA;AAAA;AAAA,YAEA;AAAA,kBACA;AAAA,eACA;AAAA;;;ACdD,qBAAS,sBAAU,uBAAQ,4BAAW;AACtC,mBAAS;;AASF,SAAS,aAAa;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,YAAY;AAAA,GACU;AAAA,EACtB,OAAO,WAAW,gBAAgB,WAAS,KAAK;AAAA,EAChD,OAAO,OAAO,YAAY,WAAS,SAAS,EAAE;AAAA,EAC9C,MAAM,WAAW,SAAyB,IAAI;AAAA,EAC9C,QAAQ,QAAQ,kBAAkB,iBAAiB,SAAS;AAAA,EAE5D,YAAU,MAAM;AAAA,IACf,IAAI,aAAa,SAAS,SAAS;AAAA,MAClC,SAAS,QAAQ,MAAM;AAAA,MACvB,SAAS,QAAQ,OAAO;AAAA,IACzB;AAAA,KACE,CAAC,SAAS,CAAC;AAAA,EAEd,YAAU,MAAM;AAAA,IACf,SAAS,SAAS,EAAE;AAAA,KAClB,CAAC,KAAK,CAAC;AAAA,EAEV,MAAM,OAAO,cAAY,MAAM;AAAA,IAC9B,MAAM,UAAU,MAAM,KAAK;AAAA,IAC3B,IAAI,WAAW,aAAa,SAAS,KAAK;AAAA,MACzC,cAAc,EAAE,OAAO,QAAQ,CAAC;AAAA,IACjC;AAAA,IACA,aAAa,KAAK;AAAA,KAChB,CAAC,OAAO,OAAO,aAAa,CAAC;AAAA,EAEhC,MAAM,SAAS,cAAY,MAAM;AAAA,IAChC,SAAS,SAAS,EAAE;AAAA,IACpB,aAAa,KAAK;AAAA,KAChB,CAAC,KAAK,CAAC;AAAA,EAEV,IAAI,WAAW;AAAA,IACd,uBACC,MAAC,SAAD;AAAA,MACC,KAAK;AAAA,MACL,MAAK;AAAA,MACL,OAAO;AAAA,MACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,MACxC,QAAQ;AAAA,MACR,WAAW,CAAC,MAAM;AAAA,QACjB,IAAI,EAAE,QAAQ;AAAA,UAAS,KAAK;AAAA,QAC5B,IAAI,EAAE,QAAQ;AAAA,UAAU,OAAO;AAAA;AAAA,MAEhC,WAAW,+GAA+G;AAAA,KAC3H;AAAA,EAEF;AAAA,EAEA,uBACC,OAQE,UARF;AAAA,IACC,MAAK;AAAA,IACL,SAAS,MAAM,aAAa,IAAI;AAAA,IAChC,WAAW,wFAAwF;AAAA,IACnG,OAAM;AAAA,IAJP,UAQE;AAAA,sBAFD,MAA0D,QAA1D;AAAA,QAAM,WAAU;AAAA,QAAhB,UAA4B,SAAS;AAAA,OAAqB;AAAA,sBAC1D,MAAC,SAAD;AAAA,QAAQ,WAAU;AAAA,OAAgF;AAAA;AAAA,GACjG;AAAA;;;;AD3CG,SAAS,aAAa;AAAA,EAC5B;AAAA,EACA;AAAA,GACsB;AAAA,EACtB,QAAQ,MAAM,eAAe,iBAC5B,QAAQ,gBAAgB,WAAW,QAAQ,KAAK,SACjD;AAAA,EACA,QAAQ,MAAM,gBAAgB,eAAe,QAAQ,EAAE;AAAA,EAEvD,MAAM,gBAAgB,UAAQ,MAAM;AAAA,IACnC,MAAM,cAAc,QAAQ,oBAAoB;AAAA,IAChD,MAAM,gBAAe,QAAQ,qBAAqB;AAAA,IAClD,MAAM,oBAAoB,QAAQ,qBAAqB;AAAA,IACvD,MAAM,2BAA2B,QAAQ,4BAA4B;AAAA,IACrE,OACC,qBAAqB,QAAQ,UAAwB,QAAQ,OAAO;AAAA,MACnE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD,CAAC,KAAK;AAAA,KAEL;AAAA,IACF,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACT,CAAC;AAAA,EAED,MAAM,kBAAiB,CAAC,OAAsB;AAAA,IAC7C,IAAI,CAAC;AAAA,MAAI,OAAO;AAAA,IAChB,MAAM,UAAU,KAAK,MAAM,KAAK,IAAI;AAAA,IACpC,MAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AAAA,IACvC,MAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AAAA,IACrC,IAAI,QAAQ;AAAA,MAAG,OAAO,GAAG,UAAU,UAAU;AAAA,IAC7C,IAAI,UAAU;AAAA,MAAG,OAAO,GAAG,YAAY,UAAU;AAAA,IACjD,OAAO,GAAG;AAAA;AAAA,EAGX,MAAM,eAAe,CAAC,QAAgB,IAAI,eAAe,OAAO;AAAA,EAEhE,MAAM,sBAAsB,CAAC,QAAgB;AAAA,IAC5C,IAAI,OAAO;AAAA,MAAS,OAAO,IAAI,MAAM,KAAS,QAAQ,CAAC;AAAA,IACvD,IAAI,OAAO;AAAA,MAAM,OAAO,IAAI,MAAM,MAAM,QAAQ,CAAC;AAAA,IACjD,OAAO,IAAI,SAAS;AAAA;AAAA,EAGrB,MAAM,gBAAgB,QAAQ,wBAAwB;AAAA,EACtD,MAAM,eAAe,QAAQ,qBAAqB;AAAA,EAElD,MAAM,WAAW,QAAQ,gBAAgB;AAAA,EACzC,MAAM,gBAAgB,YAAY;AAAA,EAGlC,MAAM,eAAe,UAAQ,MAAM;AAAA,IAClC,MAAM,OAAO,aAAa,QAAQ,UAAwB,QAAQ,KAAK;AAAA,IACvE,OAAO,MAAM,OAAO;AAAA,KAClB,CAAC,QAAQ,UAAU,QAAQ,KAAK,CAAC;AAAA,EAEpC,MAAM,sBAAsB,eACxB,gBAAgB,eAAgB,MACjC;AAAA,EAEH,MAAM,uBAAuB,MAAM;AAAA,IAClC,IAAI,uBAAuB;AAAA,MAAI,OAAO;AAAA,IACtC,IAAI,uBAAuB;AAAA,MAAI,OAAO;AAAA,IACtC,OAAO;AAAA;AAAA,EAGR,uBACC,MAwGE,OAxGF;AAAA,IAAK,WAAU;AAAA,IAAf,0BACC,OAsGE,OAtGF;AAAA,MAAK,WAAU;AAAA,MAAf,UAsGE;AAAA,QArGA,4BACA,OAwBE,OAxBF;AAAA,UAAK,WAAU;AAAA,UAAf,UAwBE;AAAA,4BAvBD,MAAC,YAAD;AAAA,cAAW,WAAU;AAAA,aAA0B;AAAA,4BAC/C,MAEE,QAFF;AAAA,cAAM,WAAU;AAAA,cAAhB;AAAA,aAEE;AAAA,YACD,iCACA;AAAA,wBAWE;AAAA,gCAVD,MAA8C,QAA9C;AAAA,kBAAM,WAAU;AAAA,kBAAhB;AAAA,iBAA8C;AAAA,gCAC9C,OAQE,UARF;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,MAAM,sBAAsB,cAAc,EAAE;AAAA,kBACrD,WAAU;AAAA,kBAHX,UAQE;AAAA,oBAHA,cAAc,SACd,WAAW,cAAc,GAAG,MAAM,GAAG,CAAC;AAAA,oCACvC,MAAC,cAAD;AAAA,sBAAc,WAAU;AAAA,qBAAU;AAAA;AAAA,iBACjC;AAAA;AAAA,aACD;AAAA,YAEF,CAAC,iBAAiB,QAAQ,mCAC1B,MAEE,QAFF;AAAA,cAAM,WAAU;AAAA,cAAhB;AAAA,aAEE;AAAA;AAAA,SAEF;AAAA,wBAGH,OA0BE,OA1BF;AAAA,UAAK,WAAU;AAAA,UAAf,UA0BE;AAAA,4BAzBD,MAAC,eAAD;AAAA,cACC,WAAW,QAAQ;AAAA,cACnB,OAAO,QAAQ;AAAA,cACf,WAAU;AAAA,aACX;AAAA,YAEC,aAAa,0BACb,OAgBE,UAhBF;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM,QAAQ,YAAY,GAAG;AAAA,cACtC,WAAU;AAAA,cAHX,UAgBE;AAAA,gCAXD,MAAC,SAAD;AAAA,kBAAQ,WAAU;AAAA,iBAAU;AAAA,gCAC5B,MAAc,QAAd;AAAA;AAAA,iBAAc;AAAA,gBACb,YAAY,mBACb,YAAY,kBAAkB,oBAC7B,OAGE,QAHF;AAAA,kBAAM,WAAU;AAAA,kBAAhB,UAGE;AAAA,oCAFD,MAAC,YAAD;AAAA,sBAAW,WAAU;AAAA,qBAAc;AAAA,oBAClC,YAAY;AAAA;AAAA,iBACZ,oBAEF,MAAC,eAAD;AAAA,kBAAc,WAAU;AAAA,iBAAyB;AAAA;AAAA,aAEjD;AAAA;AAAA,SAEF;AAAA,wBAEF,OA4CE,OA5CF;AAAA,UAAK,WAAU;AAAA,UAAf,UA4CE;AAAA,4BA3CD,OAmBE,OAnBF;AAAA,cAAK,WAAU;AAAA,cAAf,UAmBE;AAAA,gCAlBD,OAQE,OARF;AAAA,kBACC,WAAU;AAAA,kBACV,OAAO,2BAA2B,aAAa,aAAa;AAAA,kBAF7D,UAQE;AAAA,oCAJD,MAA0C,QAA1C;AAAA,sBAAM,WAAU;AAAA,sBAAhB;AAAA,qBAA0C;AAAA,oCAC1C,MAEE,QAFF;AAAA,sBAAM,WAAW,eAAe,qBAAqB;AAAA,sBAArD,UACE,oBAAoB,aAAa;AAAA,qBACjC;AAAA;AAAA,iBACD;AAAA,gCACF,OAQE,OARF;AAAA,kBACC,WAAU;AAAA,kBACV,OAAO,iBAAiB,aAAa,YAAY;AAAA,kBAFlD,UAQE;AAAA,oCAJD,MAA0C,QAA1C;AAAA,sBAAM,WAAU;AAAA,sBAAhB;AAAA,qBAA0C;AAAA,oCAC1C,MAEE,QAFF;AAAA,sBAAM,WAAU;AAAA,sBAAhB,UACE,oBAAoB,YAAY;AAAA,qBAChC;AAAA;AAAA,iBACD;AAAA;AAAA,aACD;AAAA,4BAEF,OAKE,OALF;AAAA,cAAK,WAAU;AAAA,cAAf,UAKE;AAAA,gCAJD,MAAC,QAAD;AAAA,kBAAO,WAAU;AAAA,iBAAU;AAAA,gCAC3B,MAEE,QAFF;AAAA,kBAAM,WAAU;AAAA,kBAAhB,UACE,gBAAe,QAAQ,eAAe;AAAA,iBACtC;AAAA;AAAA,aACD;AAAA,YAED,gBAAgB,qBAChB,OAKE,OALF;AAAA,cAAK,WAAU;AAAA,cAAf,UAKE;AAAA,gCAJD,MAAC,YAAD;AAAA,kBAAY,WAAU;AAAA,iBAAU;AAAA,gCAChC,MAEE,QAFF;AAAA,kBAAM,WAAU;AAAA,kBAAhB,UACE,cAAc,QAAQ,CAAC;AAAA,iBACvB;AAAA;AAAA,aACD;AAAA,4BAGH,OAKE,OALF;AAAA,cAAK,WAAU;AAAA,cAAf,UAKE;AAAA,gCAJD,MAAC,cAAD;AAAA,kBAAc,UAAU,QAAQ;AAAA,kBAAU,MAAM;AAAA,iBAAI;AAAA,gCACpD,MAEE,QAFF;AAAA,kBAAM,WAAU;AAAA,kBAAhB,UACE,QAAQ;AAAA,iBACR;AAAA;AAAA,aACD;AAAA;AAAA,SACD;AAAA;AAAA,KACD;AAAA,GACD;AAAA;;;AE3MJ,oBAAS;AACT;AAAA,0BACC;AAAA,kBAEA;AAAA;AAGD;AAAA,gBACC;AAAA;AAAA,eAEA;AAAA,kBACA;AAAA,YACA;AAAA,kBACA;AAAA,eACA;AAAA;;;ACdD,iBAAS;;;ACAT,mBAAS;AAgBF,IAAM,gBAAgB,SAAmB,CAAC,SAAS;AAAA,EACzD,OAAO,CAAC;AAAA,EACR,WAAW,CAAC;AAAA,EACZ,aAAa,CAAC;AAAA,EACd,aAAa;AAAA,EACb,eAAe;AAAA,EACf,UAAU,CAAC,UAAU,SACpB,IAAI,CAAC,OAAO,EAAE,OAAO,KAAK,EAAE,QAAQ,WAAW,KAAK,EAAE,EAAE;AAAA,EACzD,YAAY,CAAC,UAAU,YACtB,IAAI,CAAC,OAAO,EAAE,WAAW,KAAK,EAAE,YAAY,WAAW,QAAQ,EAAE,EAAE;AAAA,EACpE,gBAAgB,CAAC,UAAU,SAC1B,IAAI,CAAC,OAAO,EAAE,aAAa,KAAK,EAAE,cAAc,WAAW,KAAK,EAAE,EAAE;AAAA,EACrE,WAAW,CAAC,aAAa,IAAI,EAAE,aAAa,MAAM,eAAe,SAAS,CAAC;AAAA,EAC3E,YAAY,MAAM,IAAI,EAAE,aAAa,OAAO,eAAe,KAAK,CAAC;AAClE,EAAE;;;;ADrBF,IAAM,OAAO;AACb,IAAM,SAAS;AACf,IAAM,UAAU,OAAO,UAAU;AACjC,IAAM,gBAAgB,IAAI,KAAK,KAAK;AAEpC,SAAS,QAAQ,CAAC,SAAyB;AAAA,EAC1C,IAAI,WAAW;AAAA,IAAI,OAAO;AAAA,EAC1B,IAAI,WAAW;AAAA,IAAI,OAAO;AAAA,EAC1B,OAAO;AAAA;AAGD,IAAM,YAAY,MAAK,SAAS,UAAS;AAAA,EAC/C;AAAA,EACA;AAAA,GACkB;AAAA,EAClB,MAAM,YAAY,cAAc,CAAC,MAAM,EAAE,SAAS;AAAA,EAClD,MAAM,UAAU,MAAM,eAAe,eAAe;AAAA,EACpD,MAAM,aAAa,gBAAiB,UAAU,MAAO;AAAA,EACrD,MAAM,QAAQ,SAAS,OAAO;AAAA,EAE9B,uBACC,OAwCE,UAxCF;AAAA,IACC,MAAK;AAAA,IACL,SAAS,MAAM,UAAU,QAAQ;AAAA,IACjC,WAAU;AAAA,IACV,OAAO,UAAU,KAAK,MAAM,OAAO;AAAA,IAJpC,UAwCE;AAAA,sBAlCD,OA2BE,OA3BF;AAAA,QACC,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,WAAU;AAAA,QACV,MAAK;AAAA,QACL,cAAW;AAAA,QALZ,UA2BE;AAAA,0BApBD,MAAC,UAAD;AAAA,YACC,IAAI,OAAO;AAAA,YACX,IAAI,OAAO;AAAA,YACX,GAAG;AAAA,YACH,MAAK;AAAA,YACL,QAAO;AAAA,YACP,aAAa;AAAA,WACd;AAAA,0BACA,MAAC,UAAD;AAAA,YACC,IAAI,OAAO;AAAA,YACX,IAAI,OAAO;AAAA,YACX,GAAG;AAAA,YACH,MAAK;AAAA,YACL,QAAQ;AAAA,YACR,aAAa;AAAA,YACb,iBAAiB;AAAA,YACjB,kBAAkB;AAAA,YAClB,eAAc;AAAA,YACd,WAAU;AAAA,WACX;AAAA;AAAA,OACC;AAAA,sBACF,MAKE,QALF;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,UAAU,EAAE;AAAA,QAFtB;AAAA,OAKE;AAAA;AAAA,GACD;AAAA,CAEH;;;AExED,iBAAS,mBAAM;;AAMf,SAAS,mBAAmB,CAAC,UAAiC;AAAA,EAC7D,IAAI,CAAC;AAAA,IAAU,OAAO;AAAA,EACtB,MAAM,MAAM,KAAK,IAAI;AAAA,EACrB,MAAM,QAAQ,IAAI,KAAK,QAAQ,EAAE,QAAQ;AAAA,EACzC,MAAM,OAAO,QAAQ;AAAA,EACrB,IAAI,QAAQ;AAAA,IAAG,OAAO;AAAA,EACtB,MAAM,OAAO,KAAK,MAAM,OAAO,QAAU;AAAA,EACzC,MAAM,QAAQ,KAAK,MAAO,OAAO,WAAc,OAAS;AAAA,EACxD,MAAM,UAAU,KAAK,MAAO,OAAO,UAAa,KAAM;AAAA,EACtD,IAAI,OAAO;AAAA,IAAG,OAAO,GAAG,SAAS;AAAA,EACjC,IAAI,QAAQ;AAAA,IAAG,OAAO,GAAG,UAAU;AAAA,EACnC,OAAO,GAAG;AAAA;AAGX,SAAS,WAAW,CAAC,SAAyB;AAAA,EAC7C,IAAI,WAAW;AAAA,IAAO,OAAO;AAAA,EAC7B,IAAI,WAAW;AAAA,IAAO,OAAO;AAAA,EAC7B,OAAO;AAAA;AAGR,SAAS,QAAQ;AAAA,EAChB;AAAA,EACA,QAAQ;AAAA,GAIN;AAAA,EACF,MAAM,UAAU,KAAK,IAAI,EAAE,aAAa,GAAG;AAAA,EAC3C,MAAM,WACL,WAAW,KACR,eACA,WAAW,KACV,iBACA;AAAA,EAEL,uBACC,OAoBE,OApBF;AAAA,IAAK,WAAU;AAAA,IAAf,UAoBE;AAAA,sBAnBD,OAYE,OAZF;AAAA,QAAK,WAAU;AAAA,QAAf,UAYE;AAAA,0BAXD,MAAiD,QAAjD;AAAA,YAAM,WAAU;AAAA,YAAhB,UAAyC;AAAA,WAAQ;AAAA,0BACjD,OASE,OATF;AAAA,YAAK,WAAU;AAAA,YAAf,UASE;AAAA,8BARD,OAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UAEE;AAAA,kBADA,KAAK,MAAM,OAAO;AAAA,kBADpB;AAAA;AAAA,eAEE;AAAA,cACD,EAAE,4BACF,OAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UAEE;AAAA,kBAFF;AAAA,kBACY,oBAAoB,EAAE,QAAQ;AAAA;AAAA,eACxC;AAAA;AAAA,WAEF;AAAA;AAAA,OACD;AAAA,sBACF,MAKE,OALF;AAAA,QAAK,WAAU;AAAA,QAAf,0BACC,MAAC,OAAD;AAAA,UACC,WAAW,mDAAmD;AAAA,UAC9D,OAAO,EAAE,OAAO,GAAG,WAAW;AAAA,SAC/B;AAAA,OACC;AAAA;AAAA,GACD;AAAA;AAIG,IAAM,aAAa,OAAK,SAAS,WAAU,GAAG;AAAA,EACpD,MAAM,SAAS,cAAc,CAAC,MAAM,EAAE,WAAW;AAAA,EACjD,MAAM,WAAW,cAAc,CAAC,MAAM,EAAE,aAAa;AAAA,EACrD,MAAM,aAAa,cAAc,CAAC,MAAM,EAAE,UAAU;AAAA,EACpD,MAAM,QAAQ,cAAc,CAAC,MAC5B,WAAW,EAAE,MAAM,YAAY,SAChC;AAAA,EAEA,MAAM,QAAQ,UACb,sBACC,OAGE,OAHF;AAAA,IAAK,WAAU;AAAA,IAAf,UAGE;AAAA,MAFA,4BAAY,MAAC,cAAD;AAAA,QAAc;AAAA,QAAoB,MAAM;AAAA,OAAI;AAAA,sBACzD,MAAsB,QAAtB;AAAA;AAAA,OAAsB;AAAA;AAAA,GACrB,GAEH,CAAC,QAAQ,CACV;AAAA,EAEA,IAAI,CAAC;AAAA,IAAO,OAAO;AAAA,EAEnB,uBACC,MAwEE,OAxEF;AAAA,IAAO;AAAA,IAAgB,SAAS;AAAA,IAAY;AAAA,IAAc,UAAS;AAAA,IAAnE,0BACC,OAsEE,OAtEF;AAAA,MAAK,WAAU;AAAA,MAAf,UAsEE;AAAA,QArEA,MAAM,gCACN,OAKE,OALF;AAAA,UAAK,WAAU;AAAA,UAAf,UAKE;AAAA,4BAJD,MAAC,QAAD;AAAA,cAAM,WAAU;AAAA,aAAgD;AAAA,4BAChE,MAEE,QAFF;AAAA,cAAM,WAAU;AAAA,cAAhB;AAAA,aAEE;AAAA;AAAA,SACD;AAAA,QAGF,MAAM,iCACN,MAAC,UAAD;AAAA,UACC,OAAO,GAAG,YAAY,MAAM,cAAc,aAAa;AAAA,UACvD,QAAQ,MAAM;AAAA,SACf;AAAA,QAGA,MAAM,mCACN,MAAC,UAAD;AAAA,UACC,OAAO,GAAG,YAAY,MAAM,gBAAgB,aAAa;AAAA,UACzD,QAAQ,MAAM;AAAA,SACf;AAAA,QAGA,MAAM,gBAAgB,MAAM,aAAa,cAAc,qBACvD,MAAC,UAAD;AAAA,UACC,OAAM;AAAA,UACN,QAAQ;AAAA,YACP,aAAa,MAAM,aAAa;AAAA,YAChC,eAAe;AAAA,YACf,UAAU,MAAM,aAAa;AAAA,UAC9B;AAAA,SACD;AAAA,QAGA,MAAM,YAAY,8BAClB,MAQE,OARF;AAAA,UAAK,WAAU;AAAA,UAAf,0BACC,OAME,OANF;AAAA,YAAK,WAAU;AAAA,YAAf,UAME;AAAA,8BALD,MAAuD,QAAvD;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAAuD;AAAA,8BACvD,OAGE,QAHF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UAGE;AAAA,kBAHF;AAAA,kBACG,MAAM,WAAW,aAAa,QAAQ,CAAC;AAAA,kBAD1C;AAAA,kBAEE,MAAM,WAAW;AAAA;AAAA,eACjB;AAAA;AAAA,WACD;AAAA,SACD;AAAA,QAGF,MAAM,SAAS,+BACf,MASE,OATF;AAAA,UAAK,WAAU;AAAA,UAAf,0BACC,OAOE,OAPF;AAAA,YAAK,WAAU;AAAA,YAAf,UAOE;AAAA,8BAND,MAAiD,QAAjD;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAAiD;AAAA,8BACjD,MAIE,QAJF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UACE,MAAM,QAAQ,YAAY,OACxB,IAAI,MAAM,QAAQ,QAAQ,QAAQ,CAAC,MACnC;AAAA,eACF;AAAA;AAAA,WACD;AAAA,SACD;AAAA,QAGF,MAAM,4BACN,MAOE,OAPF;AAAA,UAAK,WAAU;AAAA,UAAf,0BACC,OAKE,OALF;AAAA,YAAK,WAAU;AAAA,YAAf,UAKE;AAAA,8BAJD,MAA8C,QAA9C;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAA8C;AAAA,8BAC9C,MAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UACE,MAAM;AAAA,eACN;AAAA;AAAA,WACD;AAAA,SACD;AAAA;AAAA,KAEF;AAAA,GACD;AAAA,CAEH;;;ACjKD,sBAAS,4BAAW;AAIpB,IAAM,gBAAgB;AACtB,IAAM,kBAAkB;AAEjB,SAAS,gBAAgB,CAC/B,UACA,UACC;AAAA,EACD,MAAM,WAAW,cAAc,CAAC,MAAM,EAAE,QAAQ;AAAA,EAChD,MAAM,aAAa,cAAc,CAAC,MAAM,EAAE,UAAU;AAAA,EACpD,MAAM,iBAAiB,cAAc,CAAC,MAAM,EAAE,cAAc;AAAA,EAC5D,MAAM,QAAQ,cAAc,CAAC,MAC5B,WAAW,EAAE,MAAM,YAAY,SAChC;AAAA,EACA,MAAM,cAAc,cAAc,CAAC,MAClC,WAAW,EAAE,YAAY,YAAY,CACtC;AAAA,EAEA,MAAM,kBACL,aAAa,YAAY,aAAa,eAAe,aAAa;AAAA,EAEnE,MAAM,aAAa,cAAY,YAAY;AAAA,IAC1C,IAAI,CAAC,YAAY,CAAC;AAAA,MAAiB;AAAA,IAEnC,WAAW,UAAU,IAAI;AAAA,IACzB,IAAI;AAAA,MACH,MAAM,OAAO,MAAM,UAAU,iBAAiB,QAAQ;AAAA,MACtD,SAAS,UAAU,IAAI;AAAA,MACvB,eAAe,UAAU,KAAK,IAAI,CAAC;AAAA,MAClC,MAAM,WACN;AAAA,MACD,WAAW,UAAU,KAAK;AAAA;AAAA,KAEzB,CAAC,UAAU,iBAAiB,UAAU,YAAY,cAAc,CAAC;AAAA,EAEpE,YAAU,MAAM;AAAA,IACf,IAAI,CAAC;AAAA,MAAiB;AAAA,IAEtB,MAAM,UAAU,CAAC,eAAe,KAAK,IAAI,IAAI,cAAc;AAAA,IAC3D,IAAI,SAAS;AAAA,MACZ,WAAW;AAAA,IACZ;AAAA,IAEA,MAAM,WAAW,YAAY,YAAY,aAAa;AAAA,IACtD,OAAO,MAAM,cAAc,QAAQ;AAAA,KACjC,CAAC,iBAAiB,YAAY,WAAW,CAAC;AAAA,EAE7C,OAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAAA;;;;AJpBM,SAAS,UAAU;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACmB;AAAA,EACnB,QAAQ,MAAM,eAAe,iBAC5B,QAAQ,gBAAgB,WAAW,QAAQ,KAAK,SACjD;AAAA,EACA,QAAQ,MAAM,gBAAgB,eAAe,QAAQ,EAAE;AAAA,EAEvD,MAAM,gBAAgB,UAAQ,MAAM;AAAA,IACnC,MAAM,cAAc,QAAQ,oBAAoB;AAAA,IAChD,MAAM,eAAe,QAAQ,qBAAqB;AAAA,IAClD,MAAM,oBAAoB,QAAQ,qBAAqB;AAAA,IACvD,MAAM,2BAA2B,QAAQ,4BAA4B;AAAA,IACrE,OACC,sBAAqB,QAAQ,UAAwB,QAAQ,OAAO;AAAA,MACnE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD,CAAC,KAAK;AAAA,KAEL;AAAA,IACF,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACT,CAAC;AAAA,EAED,MAAM,sBAAsB,CAAC,QAAgB;AAAA,IAC5C,IAAI,OAAO;AAAA,MAAS,OAAO,IAAI,MAAM,KAAS,QAAQ,CAAC;AAAA,IACvD,IAAI,OAAO;AAAA,MAAM,OAAO,IAAI,MAAM,MAAM,QAAQ,CAAC;AAAA,IACjD,OAAO,IAAI,SAAS;AAAA;AAAA,EAGrB,MAAM,gBAAgB,QAAQ,wBAAwB;AAAA,EAEtD,MAAM,WAAW,QAAQ,gBAAgB;AAAA,EACzC,MAAM,gBAAgB,YAAY;AAAA,EAGlC,MAAM,eAAe,UAAQ,MAAM;AAAA,IAClC,MAAM,OAAO,cAAa,QAAQ,UAAwB,QAAQ,KAAK;AAAA,IACvE,OAAO,MAAM,OAAO;AAAA,KAClB,CAAC,QAAQ,UAAU,QAAQ,KAAK,CAAC;AAAA,EAEpC,MAAM,sBAAsB,eACxB,gBAAgB,eAAgB,MACjC;AAAA,EAEH,MAAM,uBAAuB,MAAM;AAAA,IAClC,IAAI,uBAAuB;AAAA,MAAI,OAAO;AAAA,IACtC,IAAI,uBAAuB;AAAA,MAAI,OAAO;AAAA,IACtC,OAAO;AAAA;AAAA,EAGR,QAAQ,MAAM,cAAc,aAAa;AAAA,EACzC,MAAM,mBAAmB,YAAY,QAAQ,WAAW;AAAA,EACxD,QAAQ,OAAO,oBAAoB,iBAClC,QAAQ,UACR,gBACD;AAAA,EAEA,uBACC;AAAA,cAkGE;AAAA,sBAjGD,MA+FE,OA/FF;AAAA,QACC,WAAW,sIACV,YAAY,kBAAkB;AAAA,QAFhC,0BAKC,OAyFE,OAzFF;AAAA,UAAK,WAAU;AAAA,UAAf,UAyFE;AAAA,4BAxFD,OAmDE,OAnDF;AAAA,cAAK,WAAU;AAAA,cAAf,UAmDE;AAAA,gBAlDA,2BACA,MAAC,YAAD;AAAA,kBAAW,WAAU;AAAA,iBAAwC,oBAE7D,MAAC,eAAD;AAAA,kBAAe,WAAU;AAAA,iBAAwB;AAAA,gCAElD,MAAC,eAAD;AAAA,kBACC,WAAW,QAAQ;AAAA,kBACnB,OAAO,QAAQ;AAAA,kBACf,WAAU;AAAA,iBACX;AAAA,gBACC,aAAa,0BACb,OAeE,UAfF;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,MAAM,QAAQ,YAAY,GAAG;AAAA,kBACtC,WAAU;AAAA,kBAHX,UAeE;AAAA,oCAVD,MAAC,SAAD;AAAA,sBAAQ,WAAU;AAAA,qBAAU;AAAA,oBAC3B,YAAY,mBACb,YAAY,kBAAkB,oBAC7B,OAGE,QAHF;AAAA,sBAAM,WAAU;AAAA,sBAAhB,UAGE;AAAA,wCAFD,MAAC,YAAD;AAAA,0BAAW,WAAU;AAAA,yBAAc;AAAA,wBAClC,YAAY;AAAA;AAAA,qBACZ,oBAEF,MAAC,eAAD;AAAA,sBAAc,WAAU;AAAA,qBAAyB;AAAA;AAAA,iBAEjD;AAAA,gBAEF,YAAY,iCACZ;AAAA,4BAmBE;AAAA,oCAlBD,MAEE,QAFF;AAAA,sBAAM,WAAU;AAAA,sBAAhB;AAAA,qBAEE;AAAA,oCACF,OAcE,UAdF;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,MAAM,sBAAsB,cAAc,EAAE;AAAA,sBACrD,WAAU;AAAA,sBACV,OACC,cAAc,SACd,WAAW,cAAc,GAAG,MAAM,GAAG,CAAC;AAAA,sBANxC,UAcE;AAAA,wCALD,MAGE,QAHF;AAAA,0BAAM,WAAU;AAAA,0BAAhB,UACE,cAAc,SACd,WAAW,cAAc,GAAG,MAAM,GAAG,CAAC;AAAA,yBACtC;AAAA,wCACF,MAAC,eAAD;AAAA,0BAAc,WAAU;AAAA,yBAAwB;AAAA;AAAA,qBAC/C;AAAA;AAAA,iBACD;AAAA;AAAA,aAEF;AAAA,4BAEF,OAkCE,OAlCF;AAAA,cAAK,WAAU;AAAA,cAAf,UAkCE;AAAA,gBAjCA,gCAAgB,MAAC,YAAD;AAAA,kBAAY,WAAW,QAAQ;AAAA,iBAAI;AAAA,gBAEnD,mBAAmB,yBACnB,MAAC,WAAD;AAAA,kBAAW;AAAA,kBAAc,UAAU,QAAQ;AAAA,iBAAU;AAAA,gCAGtD,MAUE,OAVF;AAAA,kBAAK,WAAU;AAAA,kBAAf,0BACC,OAQE,OARF;AAAA,oBACC,WAAU;AAAA,oBACV,OAAO,2BAA2B,cAAc,eAAe;AAAA,oBAFhE,UAQE;AAAA,sCAJD,MAA0C,QAA1C;AAAA,wBAAM,WAAU;AAAA,wBAAhB;AAAA,uBAA0C;AAAA,sCAC1C,MAEE,QAFF;AAAA,wBAAM,WAAW,eAAe,qBAAqB;AAAA,wBAArD,UACE,oBAAoB,aAAa;AAAA,uBACjC;AAAA;AAAA,mBACD;AAAA,iBACD;AAAA,gBAED,gBAAgB,qBAChB,OAKE,OALF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAKE;AAAA,oCAJD,MAAC,aAAD;AAAA,sBAAY,WAAU;AAAA,qBAAU;AAAA,oCAChC,MAEE,QAFF;AAAA,sBAAM,WAAU;AAAA,sBAAhB,UACE,cAAc,QAAQ,CAAC;AAAA,qBACvB;AAAA;AAAA,iBACD;AAAA,gCAGH,OAKE,OALF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAKE;AAAA,oCAJD,MAAC,cAAD;AAAA,sBAAc,UAAU,QAAQ;AAAA,sBAAU,MAAM;AAAA,qBAAI;AAAA,oCACpD,MAEE,QAFF;AAAA,sBAAM,WAAU;AAAA,sBAAhB,UACE,QAAQ;AAAA,qBACR;AAAA;AAAA,iBACD;AAAA;AAAA,aACD;AAAA;AAAA,SACD;AAAA,OACD;AAAA,sBACF,MAAC,YAAD,EAAY;AAAA;AAAA,GACX;AAAA;;;AKxMJ,iBAAS,oBAAM;AACf,+BAAiB,4BAAY,0BAAa,eAAS;;AAY5C,IAAM,oBAAoB,OAAK,SAAS,kBAAiB;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,GAC0B;AAAA,EAC1B,OAAO,cAAc,mBAAmB,WAAS,KAAK;AAAA,EACtD,OAAO,gBAAgB,qBAAqB,WAE1C,IAAI;AAAA,EACN,MAAM,iBAAiB,aAAa,CAAC,MAAM,EAAE,cAAc;AAAA,EAC3D,MAAM,YAAY,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,cAAc,MAAM;AAAA,EAE9D,MAAM,qBAAqB,YAAY;AAAA,IACtC,kBAAkB,QAAQ;AAAA,IAC1B,gBAAgB,IAAI;AAAA,IACpB,IAAI;AAAA,MACH,MAAM,UAAU,kBAAkB,aAAa,WAAW,QAAQ;AAAA,MAClE,iBAAiB,QAAQ;AAAA,MACxB,OAAO,OAAO;AAAA,MACf,MAAM,MACL,iBAAiB,QAAQ,MAAM,UAAU,2BAC1C;AAAA,MACA,gBAAgB,KAAK;AAAA,MACrB,kBAAkB,IAAI;AAAA;AAAA;AAAA,EAIxB,MAAM,mBAAmB,YAAY;AAAA,IACpC,kBAAkB,MAAM;AAAA,IAExB,eAAe;AAAA,IAEf,UAAU,kBAAkB,aAAa,WAAW,MAAM,EAAE,MAAM,MAAM,EAEvE;AAAA,IACD,iBAAiB,MAAM;AAAA;AAAA,EAGxB,MAAM,eAAe,YAAY;AAAA,IAChC,gBAAgB,IAAI;AAAA,IACpB,IAAI;AAAA,MACH,MAAM,UAAU,YAAY,aAAa,SAAS;AAAA,MAClD,SAAS;AAAA,MACR,OAAO,OAAO;AAAA,MACf,MAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,kBAAkB;AAAA,MACvE,gBAAgB,KAAK;AAAA;AAAA;AAAA,EAIvB,uBACC,OAmFE,OAnFF;AAAA,IAAK,WAAU;AAAA,IAAf,UAmFE;AAAA,sBAlFD,OAQE,OARF;AAAA,QAAK,WAAU;AAAA,QAAf,UAQE;AAAA,0BAPD,MAAC,eAAD;AAAA,YAAa,WAAU;AAAA,WAAuC;AAAA,0BAC9D,MAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB;AAAA,WAEE;AAAA,0BACF,MAEE,QAFF;AAAA,YAAM,WAAU;AAAA,YAAhB;AAAA,WAEE;AAAA;AAAA,OACD;AAAA,MAED,6BACA,MAEE,KAFF;AAAA,QAAG,WAAU;AAAA,QAAb;AAAA,OAEE;AAAA,sBAGH,OAaE,OAbF;AAAA,QAAK,WAAU;AAAA,QAAf,UAaE;AAAA,0BAZD,OAKE,OALF;AAAA,YAAK,WAAU;AAAA,YAAf,UAKE;AAAA,8BAJD,MAAsD,QAAtD;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAAsD;AAAA,8BACtD,OAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UAEE;AAAA,kBAFF;AAAA,kBACI,aAAa,UAAU,QAAQ,CAAC;AAAA;AAAA,eAClC;AAAA;AAAA,WACD;AAAA,0BACF,OAKE,OALF;AAAA,YAAK,WAAU;AAAA,YAAf,UAKE;AAAA,8BAJD,MAAyD,QAAzD;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAAyD;AAAA,8BACzD,OAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UAEE;AAAA,kBAFF;AAAA,kBACG,aAAa,eAAe,QAAQ,CAAC;AAAA;AAAA,eACtC;AAAA;AAAA,WACD;AAAA;AAAA,OACD;AAAA,sBAEF,OA0CE,OA1CF;AAAA,QAAK,WAAU;AAAA,QAAf,UA0CE;AAAA,0BAzCD,OASE,UATF;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,UAAU;AAAA,YACV,OAAM;AAAA,YACN,WAAU;AAAA,YALX,UASE;AAAA,8BAFD,MAAC,IAAD;AAAA,gBAAG,WAAU;AAAA,eAAU;AAAA,cAPxB;AAAA;AAAA,WASE;AAAA,0BAEF,OAaE,UAbF;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,UAAU;AAAA,YACV,OAAM;AAAA,YACN,WAAU;AAAA,YALX,UAaE;AAAA,cANA,mBAAmB,YAAY,+BAC/B,MAAC,UAAD;AAAA,gBAAS,WAAU;AAAA,eAAuB,oBAE1C,MAAC,QAAD;AAAA,gBAAQ,WAAU;AAAA,eAAU;AAAA,cAV9B;AAAA;AAAA,WAaE;AAAA,0BAEF,OAcE,UAdF;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,UAAU;AAAA,YACV,OAAM;AAAA,YACN,WAAU;AAAA,YALX,UAcE;AAAA,cAPA,mBAAmB,UAAU,+BAC7B,MAAC,UAAD;AAAA,gBAAS,WAAU;AAAA,eAAuB,oBAE1C,MAAC,aAAD;AAAA,gBAAY,WAAU;AAAA,eAAU;AAAA,cAVlC;AAAA,8BAaC,MAAmD,QAAnD;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAAmD;AAAA;AAAA,WAClD;AAAA;AAAA,OACD;AAAA,sBAEF,MAME,KANF;AAAA,QAAG,WAAU;AAAA,QAAb,UACE,mBAAmB,WACjB,gDACA,mBAAmB,SAClB,wBACA;AAAA,OACH;AAAA;AAAA,GACD;AAAA,CAEH;;;ACpJD,mBAAS;AAqBF,IAAM,wBAAwB,SAA2B,CAAC,SAAS;AAAA,EACzE,cAAc;AAAA,EACd,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,iBAAiB,CAAC,iBACjB,IAAI,EAAE,cAAc,cAAc,OAAO,gBAAgB,KAAK,CAAC;AAAA,EAChE,eAAe,CAAC,iBAAiB,IAAI,EAAE,aAAa,CAAC;AAAA,EACrD,mBAAmB,CAAC,mBAAmB,IAAI,EAAE,eAAe,CAAC;AAAA,EAC7D,mBAAmB,MAClB,IAAI,EAAE,cAAc,MAAM,cAAc,OAAO,gBAAgB,KAAK,CAAC;AACvE,EAAE;;;;AnDRK,IAAM,gBAAgB,OAAK,SAAS,cAAa;AAAA,EACvD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,oBAAoB;AAAA,EACpB;AAAA,GACsB;AAAA,EACtB,MAAM,cAAc,gBAAe;AAAA,EACnC,MAAM,YAAY,SAAuB,IAAI;AAAA,EAC7C,MAAM,qBAAqB,SAAuB,IAAI;AAAA,EACtD,MAAM,mBAAmB,SAAuB,IAAI;AAAA,EACpD,OAAO,YAAY,iBAAiB,WAAS,IAAI;AAAA,EACjD,MAAM,gBAAgB,SAAO,IAAI;AAAA,EACjC,OAAO,gBAAgB,qBAAqB,WAAS,KAAK;AAAA,EAC1D,MAAM,mBAAmB,SAAO,KAAK;AAAA,EACrC,MAAM,uBAAuB,SAE3B,SAAS;AAAA,EACX,MAAM,kBAAkB,SAAO,CAAC;AAAA,EAChC,MAAM,oBAAoB,SAA2B,SAAS;AAAA,EAC9D,MAAM,uBAAuB,SAAO,KAAK;AAAA,EACzC,MAAM,mBAAmB,SAA2B,SAAS,EAAE;AAAA,EAC/D,MAAM,wBAAwB,SAAO,SAAS,MAAM;AAAA,EACpD,MAAM,sBAAsB,SAAO,YAAY;AAAA,EAC/C,MAAM,sBAAsB,SAAO,CAAC;AAAA,EACpC,MAAM,mBAAmB,SAAO,CAAC;AAAA,EAEjC,MAAM,eAAe,sBAAsB,CAAC,MAAM,EAAE,YAAY;AAAA,EAChE,MAAM,oBAAoB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB;AAAA,EAE1E,MAAM,oBACL,gBAAgB,aAAa,cAAc;AAAA,EAE5C,MAAM,eAAe,cAAY,MAAM;AAAA,IACtC,MAAM,YAAY,mBAAmB;AAAA,IACrC,IAAI,CAAC;AAAA,MAAW;AAAA,IAEhB,QAAQ,WAAW,cAAc,iBAAiB;AAAA,IAClD,MAAM,qBAAqB,eAAe,YAAY;AAAA,IAEtD,MAAM,wBAAwB,eAAe,oBAAoB;AAAA,IACjE,MAAM,iBAAiB,YAAY,iBAAiB,UAAU;AAAA,IAE9D,oBAAoB,UAAU;AAAA,IAC9B,iBAAiB,UAAU;AAAA,IAE3B,IAAI,qBAAqB,KAAK;AAAA,MAC7B,cAAc,UAAU;AAAA,MACxB,cAAc,IAAI;AAAA,IACnB,EAAO,SAAI,gBAAgB;AAAA,MAC1B,cAAc,UAAU;AAAA,MACxB,cAAc,KAAK;AAAA,MACnB,iBAAiB,UAAU;AAAA,IAC5B,EAAO,SAAI,CAAC,yBAAyB,cAAc,SAAS;AAAA,MAC3D,cAAc,UAAU;AAAA,MACxB,cAAc,KAAK;AAAA,IACpB;AAAA,IACA,IACC,kBACC,CAAC,cAAc,WAAW,sBAAsB,KAChD;AAAA,MACD,IAAI,qBAAqB,SAAS;AAAA,QACjC,aAAa,qBAAqB,OAAO;AAAA,MAC1C;AAAA,MACA,qBAAqB,UAAU,WAAW,MAAM;AAAA,QAC/C,iBAAiB,UAAU;AAAA,SACzB,GAAG;AAAA,IACP;AAAA,IAEA,MAAM,gBAAgB,iBAAiB;AAAA,IACvC,IAAI,eAAe;AAAA,MAClB,MAAM,aAAa,cAAc,sBAAsB;AAAA,MACvD,MAAM,gBAAgB,UAAU,sBAAsB;AAAA,MACtD,kBAAkB,WAAW,SAAS,cAAc,GAAG;AAAA,IACxD;AAAA,KACE,CAAC,CAAC;AAAA,EAGL,YAAU,MAAM;AAAA,IACf,IAAI;AAAA,MAAmB;AAAA,IAEvB,MAAM,iBAAiB,SAAS,OAAO,iBAAiB;AAAA,IACxD,iBAAiB,UAAU,SAAS;AAAA,IAEpC,IAAI,gBAAgB;AAAA,MACnB,qBAAqB,UAAU;AAAA,IAChC;AAAA,IAEA,IAAI,CAAC,qBAAqB,WAAW,SAAS,SAAS,GAAG;AAAA,MACzD,qBAAqB,UAAU;AAAA,MAC/B,MAAM,YAAY,mBAAmB;AAAA,MACrC,IAAI,WAAW;AAAA,QACd,UAAU,YAAY,UAAU;AAAA,MACjC;AAAA,IACD;AAAA,KACE,CAAC,SAAS,QAAQ,SAAS,IAAI,iBAAiB,CAAC;AAAA,EAEpD,YAAU,MAAM;AAAA,IACf,IAAI;AAAA,MAAmB;AAAA,IAEvB,MAAM,wBAAwB,gBAAgB,CAAC,oBAAoB;AAAA,IACnE,MAAM,gBAAgB,SAAS,SAAS,sBAAsB;AAAA,IAE9D,oBAAoB,UAAU;AAAA,IAC9B,sBAAsB,UAAU,SAAS;AAAA,IAGzC,IAAI,uBAAuB;AAAA,MAC1B,iBAAiB,UAAU;AAAA,MAC3B,cAAc,UAAU;AAAA,MACxB,cAAc,IAAI;AAAA,MAClB,sBAAsB,MAAM;AAAA,QAC3B,sBAAsB,MAAM;AAAA,UAC3B,MAAM,YAAY,mBAAmB;AAAA,UACrC,IAAI,WAAW;AAAA,YACd,UAAU,YAAY,UAAU;AAAA,UACjC;AAAA,SACA;AAAA,OACD;AAAA,IACF,EAAO,SAAI,iBAAiB,CAAC,iBAAiB,WAAW,CAAC,cAAc;AAAA,MACvE,cAAc,UAAU;AAAA,MACxB,cAAc,IAAI;AAAA,IACnB;AAAA,KACE,CAAC,SAAS,QAAQ,cAAc,iBAAiB,CAAC;AAAA,EAGrD,YAAU,MAAM;AAAA,IACf,IAAI;AAAA,MAAmB;AAAA,IAEvB,MAAM,YAAY,mBAAmB;AAAA,IACrC,IAAI,CAAC,aAAa,CAAC,cAAc,iBAAiB;AAAA,MAAS;AAAA,IAE3D,gBAAgB,UAAU,UAAU,eAAe,UAAU;AAAA,IAE7D,MAAM,UAAU,MAAM;AAAA,MACrB,MAAM,KAAK,mBAAmB;AAAA,MAC9B,IAAI,CAAC,MAAM,iBAAiB;AAAA,QAAS;AAAA,MAErC,MAAM,UAAU,GAAG;AAAA,MACnB,MAAM,SAAS,GAAG,eAAe,GAAG;AAAA,MACpC,MAAM,OAAO,SAAS;AAAA,MAEtB,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG;AAAA,QACvB,GAAG,YAAY,GAAG,eAAe,GAAG;AAAA,QACpC;AAAA,MACD;AAAA,MAGA,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI;AAAA,QACxB,GAAG,YAAY,GAAG,eAAe,GAAG;AAAA,QACpC;AAAA,MACD;AAAA,MAEA,GAAG,YAAY,UAAU,OAAO;AAAA,MAChC,kBAAkB,UAAU,sBAAsB,OAAO;AAAA;AAAA,IAG1D,IAAI,kBAAkB,SAAS;AAAA,MAC9B,qBAAqB,kBAAkB,OAAO;AAAA,IAC/C;AAAA,IACA,kBAAkB,UAAU,sBAAsB,OAAO;AAAA,KACvD,CAAC,UAAU,UAAU,CAAC;AAAA,EAEzB,YAAU,MAAM;AAAA,IACf,OAAO,MAAM;AAAA,MACZ,IAAI,qBAAqB,SAAS;AAAA,QACjC,aAAa,qBAAqB,OAAO;AAAA,MAC1C;AAAA,MACA,IAAI,kBAAkB,SAAS;AAAA,QAC9B,qBAAqB,kBAAkB,OAAO;AAAA,MAC/C;AAAA;AAAA,KAEC,CAAC,CAAC;AAAA,EAEL,MAAM,iBAAiB,MAAM;AAAA,IAC5B,iBAAiB,UAAU;AAAA,IAC3B,cAAc,UAAU;AAAA,IACxB,cAAc,IAAI;AAAA,IAClB,MAAM,YAAY,mBAAmB;AAAA,IACrC,IAAI,WAAW;AAAA,MACd,UAAU,YAAY,UAAU;AAAA,IACjC;AAAA;AAAA,EAGD,MAAM,mBAAmB,UAAQ,MAAM;AAAA,IACtC,OAAO,SACL,OAAO,CAAC,YAAY,QAAQ,SAAS,QAAQ,EAC7C,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAAA,KACxC,CAAC,QAAQ,CAAC;AAAA,EAGb,MAAM,qBAAqB,cAC1B,CAAC,cAAsB;AAAA,IACtB,OAAO,YAAY;AAAA,MAClB,IAAI,CAAC;AAAA,QAAW;AAAA,MAChB,IAAI,CAAC;AAAA,QAAW;AAAA,MAEhB,YAAY,aACX,CAAC,YAAY,SAAS,GACtB,CAAC,gBAAgB;AAAA,QAChB,IAAI,CAAC;AAAA,UAAa,OAAO;AAAA,QACzB,OAAO,YAAY,IAAI,CAAC,QAAQ;AAAA,UAC/B,IAAI,IAAI,OAAO;AAAA,YAAW,OAAO;AAAA,UACjC,MAAM,cACL,IAAI,OAAO,OACV,CAAC,SAA8C;AAAA,YAC9C,IAAI,KAAK,SAAS;AAAA,cAAS,OAAO;AAAA,YAClC,IAAI,KAAK,SAAS,eAAe,KAAK,aAAa;AAAA,cAClD,OAAO;AAAA,YACR,OAAO;AAAA,WAET,KAAK,CAAC;AAAA,UACP,OAAO;AAAA,eACH;AAAA,YACH,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,OAAO;AAAA,UACR;AAAA,SACA;AAAA,OAEH;AAAA,MAEA,IAAI;AAAA,QACH,MAAM,UAAU,aAAa,WAAW,SAAS;AAAA,QAChD,OAAO,OAAO;AAAA,QACf,MAAM,MACL,iBAAiB,QAAQ,MAAM,UAAU,iBAC1C;AAAA;AAAA;AAAA,KAIH,CAAC,WAAW,WAAW,CACxB;AAAA,EAEA,MAAM,gBAAgB,cAAY,YAAY;AAAA,IAC7C,IAAI,CAAC;AAAA,MAAW;AAAA,IAChB,IAAI;AAAA,MACH,MAAM,UAAU,YAAY,WAAW,EAAE,SAAS,WAAW,CAAC;AAAA,MAC7D,OAAO,OAAO;AAAA,MACf,MAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,mBAAmB;AAAA;AAAA,KAEvE,CAAC,SAAS,CAAC;AAAA,EAEd,IAAI,SAAS,WAAW,GAAG;AAAA,IAC1B,uBACC,MAEE,OAFF;AAAA,MAAK,WAAU;AAAA,MAAf;AAAA,KAEE;AAAA,EAEJ;AAAA,EAEA,uBACC,OA8GE,OA9GF;AAAA,IAAK,WAAU;AAAA,IAAf,UA8GE;AAAA,MA5GA,2BACA,MAAC,YAAD;AAAA,QACC;AAAA,QACA,WAAW;AAAA,QACX;AAAA,QACA,qBAAqB;AAAA,OACtB;AAAA,sBAGD,OAsFE,OAtFF;AAAA,QACC,KAAK;AAAA,QACL,WAAU;AAAA,QACV,UAAU;AAAA,QAHX,UAsFE;AAAA,0BAhFD,MAOE,OAPF;AAAA,YAAK,KAAK;AAAA,YAAV,UACE,2BACA,MAAC,eAAD;AAAA,cACC;AAAA,cACA,qBAAqB;AAAA,aACtB;AAAA,WAEA;AAAA,0BAGF,MAqEE,OArEF;AAAA,YAAK,WAAW,UAAU,cAAc;AAAA,YAAxC,0BACC,OAmEE,OAnEF;AAAA,cACC,WACC,UACG,gCACA;AAAA,cAJL,UAmEE;AAAA,gBA5DA,iBAAiB,IAAI,CAAC,SAAS,QAAQ;AAAA,kBACvC,MAAM,cAAc,iBAAiB,MAAM;AAAA,kBAC3C,MAAM,cAAc,iBAAiB,MAAM;AAAA,kBAC3C,MAAM,gBAAgB,QAAQ,iBAAiB,SAAS;AAAA,kBAExD,IAAI,QAAQ,SAAS,QAAQ;AAAA,oBAC5B,MAAM,uBACL,eAAe,YAAY,SAAS,cACjC,cACA;AAAA,oBACJ,uBACC,MAAC,kBAAD;AAAA,sBAEC;AAAA,sBACA;AAAA,sBACA,SAAS,QAAQ;AAAA,sBACjB,wBAAwB,sBAAsB;AAAA,uBAJzC,QAAQ,EAKd;AAAA,kBAEF;AAAA,kBAEA,IAAI,QAAQ,SAAS,aAAa;AAAA,oBACjC,MAAM,aACL,CAAC,eAAe,YAAY,SAAS;AAAA,oBACtC,MAAM,kBACL,eAAe,YAAY,SAAS;AAAA,oBAErC,uBACC,MAAC,uBAAD;AAAA,sBAEC;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA,yBAAyB;AAAA,sBACzB;AAAA,sBACA,iBAAiB;AAAA,sBACjB,SACC,gBAAgB,mBAAmB,QAAQ,EAAE,IAAI;AAAA,sBAElD;AAAA,sBACA,WAAW,gBAAgB,gBAAgB;AAAA,uBAXtC,QAAQ,EAYd;AAAA,kBAEF;AAAA,kBAEA,OAAO;AAAA,iBACP;AAAA,gBAGA,qBAAqB,gCACrB,MAME,OANF;AAAA,kBAAK,WAAU;AAAA,kBAAf,0BACC,MAAC,mBAAD;AAAA,oBACC;AAAA,oBACA,kBAAkB,MAAM,kBAAkB;AAAA,oBAC1C,UAAU,MAAM,kBAAkB;AAAA,mBACnC;AAAA,iBACC;AAAA,gCAGH,MAAC,OAAD;AAAA,kBAAK,KAAK;AAAA,iBAAW;AAAA;AAAA,aACpB;AAAA,WACD;AAAA;AAAA,OACD;AAAA,MAGD,CAAC,8BACD,OAOE,UAPF;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,WAAU;AAAA,QAHX,UAOE;AAAA,0BAFD,MAAC,WAAD;AAAA,YAAW,WAAU;AAAA,WAAU;AAAA,0BAC/B,MAAwB,QAAxB;AAAA;AAAA,WAAwB;AAAA;AAAA,OACvB;AAAA;AAAA,GAEF;AAAA,CAEH;;AoDrYD,iBAAS,mBAAM;;;ACAf,sBAAS,uBAAW;AACpB,2BAAS;;;ACGF,MAAM,UAAU;AAAA,EACd,kBAA0C;AAAA,EAC1C,WAA8C,IAAI;AAAA,EAClD,UAAU;AAAA,OAEZ,QAAO,CAAC,KAAa;AAAA,IAC1B,IAAI,KAAK,iBAAiB;AAAA,MACzB,KAAK,gBAAgB,MAAM;AAAA,IAC5B;AAAA,IAEA,KAAK,kBAAkB,IAAI;AAAA,IAC3B,KAAK,UAAU;AAAA,IAEf,IAAI;AAAA,MACH,MAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QACjC,SAAS,EAAE,QAAQ,oBAAoB;AAAA,QACvC,QAAQ,KAAK,gBAAgB;AAAA,MAC9B,CAAC;AAAA,MAED,IAAI,CAAC,SAAS,IAAI;AAAA,QACjB,QAAQ,MAAM,4BAA4B,SAAS,MAAM;AAAA,QACzD;AAAA,MACD;AAAA,MAEA,MAAM,SAAS,SAAS,MAAM,UAAU;AAAA,MACxC,IAAI,CAAC,QAAQ;AAAA,QACZ,QAAQ,MAAM,wBAAwB;AAAA,QACtC;AAAA,MACD;AAAA,MAEA,MAAM,UAAU,IAAI;AAAA,MACpB,IAAI,SAAS;AAAA,MAEb,OAAO,KAAK,SAAS;AAAA,QACpB,QAAQ,MAAM,UAAU,MAAM,OAAO,KAAK;AAAA,QAC1C,IAAI;AAAA,UAAM;AAAA,QAEV,UAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAAA,QAChD,IAAI,MAAM,OAAO,QAAQ;AAAA;AAAA,CAAM;AAAA,QAE/B,OAAO,QAAQ,IAAI;AAAA,UAClB,MAAM,MAAM,OAAO,MAAM,GAAG,GAAG;AAAA,UAC/B,SAAS,OAAO,MAAM,MAAM,CAAC;AAAA,UAC7B,MAAM,QAAQ,IAAI,MAAM;AAAA,CAAI;AAAA,UAE5B,IAAI,YAAY;AAAA,UAChB,IAAI,OAAO;AAAA,UAEX,WAAW,QAAQ,OAAO;AAAA,YACzB,IAAI,KAAK,WAAW,SAAS,GAAG;AAAA,cAC/B,YAAY,KAAK,MAAM,CAAC,EAAE,KAAK;AAAA,YAChC,EAAO,SAAI,KAAK,WAAW,QAAQ,GAAG;AAAA,cACrC,SAAS,OAAO;AAAA,IAAO,MAAM,KAAK,MAAM,CAAC;AAAA,YAC1C,EAAO,SAAI,KAAK,WAAW,GAAG,GAAG,CACjC;AAAA,UACD;AAAA,UAEA,IAAI,MAAM;AAAA,YACT,IAAI;AAAA,cACH,MAAM,UAAU,KAAK,MAAM,IAAI;AAAA,cAC/B,KAAK,KAAK,EAAE,MAAM,WAAW,QAAQ,CAAC;AAAA,cACrC,OAAO,OAAO;AAAA,cACf,QAAQ,MAAM,yBAAyB,cAAc,KAAK;AAAA;AAAA,UAE5D;AAAA,UAEA,MAAM,OAAO,QAAQ;AAAA;AAAA,CAAM;AAAA,QAC5B;AAAA,MACD;AAAA,MACC,OAAO,OAAO;AAAA,MACf,IAAI,iBAAiB,SAAS,MAAM,SAAS,cAAc,CAC3D,EAAO,SACN,iBAAiB,aACjB,MAAM,YAAY,eACjB,CACF,EAAO;AAAA,QACN,QAAQ,MAAM,2BAA2B,KAAK;AAAA;AAAA;AAAA;AAAA,EAKjD,UAAU,GAAG;AAAA,IACZ,KAAK,UAAU;AAAA,IACf,IAAI,KAAK,iBAAiB;AAAA,MACzB,KAAK,gBAAgB,MAAM;AAAA,MAC3B,KAAK,kBAAkB;AAAA,IACxB;AAAA;AAAA,EAGD,EAAE,CAAC,WAAmB,SAA0B;AAAA,IAC/C,IAAI,CAAC,KAAK,SAAS,IAAI,SAAS,GAAG;AAAA,MAClC,KAAK,SAAS,IAAI,WAAW,IAAI,GAAK;AAAA,IACvC;AAAA,IACA,KAAK,SAAS,IAAI,SAAS,GAAG,IAAI,OAAO;AAAA,IAEzC,OAAO,MAAM;AAAA,MACZ,KAAK,IAAI,WAAW,OAAO;AAAA;AAAA;AAAA,EAI7B,GAAG,CAAC,WAAmB,SAA0B;AAAA,IAChD,MAAM,WAAW,KAAK,SAAS,IAAI,SAAS;AAAA,IAC5C,IAAI,UAAU;AAAA,MACb,SAAS,OAAO,OAAO;AAAA,MACvB,IAAI,SAAS,SAAS,GAAG;AAAA,QACxB,KAAK,SAAS,OAAO,SAAS;AAAA,MAC/B;AAAA,IACD;AAAA;AAAA,EAGO,IAAI,CAAC,OAAiB;AAAA,IAC7B,MAAM,WAAW,KAAK,SAAS,IAAI,MAAM,IAAI;AAAA,IAC7C,IAAI,UAAU;AAAA,MACb,WAAW,WAAW,UAAU;AAAA,QAC/B,QAAQ,KAAK;AAAA,MACd;AAAA,IACD;AAAA,IAEA,MAAM,cAAc,KAAK,SAAS,IAAI,GAAG;AAAA,IACzC,IAAI,aAAa;AAAA,MAChB,WAAW,WAAW,aAAa;AAAA,QAClC,QAAQ,KAAK;AAAA,MACd;AAAA,IACD;AAAA;AAEF;;;ADzHO,SAAS,gBAAgB,CAAC,WAA+B;AAAA,EAC/D,MAAM,cAAc,gBAAe;AAAA,EACnC,MAAM,YAAY,SAAyB,IAAI;AAAA,EAC/C,MAAM,wBAAwB,SAAsB,IAAI;AAAA,EACxD,MAAM,sBAAsB,SAAe,CAAC;AAAA,EAE5C;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACG,qBAAqB;AAAA,EAEzB,YAAU,MAAM;AAAA,IAEf,IAAI,CAAC,WAAW;AAAA,MACf,QAAQ,IAAI,2CAA2C;AAAA,MACvD;AAAA,IACD;AAAA,IAEA,sBAAsB,UAAU;AAAA,IAChC,IAAI,0BAA0B;AAAA,IAG9B,UACE,oBAAoB,SAAS,EAC7B,KAAK,CAAC,WAAW;AAAA,MACjB,IAAI,OAAO,MAAM,OAAO,QAAQ,SAAS,GAAG;AAAA,QAC3C,oBAAoB,OAAO,OAAO;AAAA,MACnC,EAAO;AAAA,QACN,oBAAoB,CAAC,CAAC;AAAA;AAAA,KAEvB,EACA,MAAM,MAAM;AAAA,MACZ,oBAAoB,CAAC,CAAC;AAAA,KACtB;AAAA,IAEF,MAAM,UAAS,IAAI;AAAA,IACnB,UAAU,UAAU;AAAA,IAEpB,MAAM,MAAM,UAAU,aAAa,SAAS;AAAA,IAC5C,QAAQ,IAAI,4CAA4C,GAAG;AAAA,IAC3D,QAAO,QAAQ,GAAG;AAAA,IAElB,MAAM,8BAA8B,CAAC,aAAgC;AAAA,MACpE,IAAI,sBAAsB,SAAS;AAAA,QAClC,MAAM,OAAO,SAAS,UACrB,CAAC,YAAY,QAAQ,OAAO,sBAAsB,OACnD;AAAA,QACA,IAAI,SAAS;AAAA,UAAI,OAAO;AAAA,MACzB;AAAA,MACA,SAAS,IAAI,SAAS,SAAS,EAAG,KAAK,GAAG,KAAK,GAAG;AAAA,QACjD,MAAM,YAAY,SAAS;AAAA,QAC3B,IAAI,UAAU,SAAS,eAAe,UAAU,WAAW,YAAY;AAAA,UACtE,OAAO;AAAA,QACR;AAAA,MACD;AAAA,MACA,OAAO;AAAA;AAAA,IAGR,MAAM,cAAc,CAAC,SAA8B;AAAA,MAClD,IACC,KAAK,eACL,OAAO,KAAK,gBAAgB,YAC5B,CAAC,MAAM,QAAQ,KAAK,WAAW,KAC/B,UAAU,KAAK,aACd;AAAA,QACD,OAAO,OAAQ,KAAK,YAAwC,QAAQ,EAAE;AAAA,MACvE;AAAA,MACA,IAAI,OAAO,KAAK,YAAY,UAAU;AAAA,QACrC,IAAI;AAAA,UACH,MAAM,SAAS,KAAK,MAAM,KAAK,OAAO;AAAA,UACtC,IAAI,UAAU,OAAO,OAAO,SAAS;AAAA,YAAU,OAAO,OAAO;AAAA,UAC5D,MAAM;AAAA,QACR,OAAO,KAAK;AAAA,MACb;AAAA,MACA,OAAO;AAAA;AAAA,IAGR,MAAM,yBAAyB,CAC9B,OACA,cACY;AAAA,MACZ,IAAI,OAAO,cAAc,UAAU;AAAA,QAClC,OAAO,MAAM;AAAA,MACd;AAAA,MAEA,MAAM,kBAAkB,MACtB,OAAO,CAAC,SAAS,KAAK,cAAc,SAAS,EAC7C,IAAI,CAAC,SAAS,KAAK,KAAK,EACxB,OAAO,CAAC,UAA2B,OAAO,SAAS,KAAK,CAAC;AAAA,MAE3D,IAAI,gBAAgB,SAAS,GAAG;AAAA,QAC/B,OAAO,KAAK,IAAI,GAAG,eAAe,IAAI;AAAA,MACvC;AAAA,MAEA,MAAM,sBAAsB,MAC1B,OACA,CAAC,SACA,OAAO,KAAK,cAAc,YAAY,KAAK,YAAY,SACzD,EACC,IAAI,CAAC,SAAS,KAAK,KAAK,EACxB,OAAO,CAAC,UAA2B,OAAO,SAAS,KAAK,CAAC;AAAA,MAE3D,MAAM,kBAAkB,MACtB,OACA,CAAC,SACA,OAAO,KAAK,cAAc,YAAY,KAAK,YAAY,SACzD,EACC,IAAI,CAAC,SAAS,KAAK,KAAK,EACxB,OAAO,CAAC,UAA2B,OAAO,SAAS,KAAK,CAAC;AAAA,MAE3D,MAAM,aACL,oBAAoB,SAAS,IAC1B,KAAK,IAAI,GAAG,mBAAmB,IAC/B;AAAA,MACJ,MAAM,aACL,gBAAgB,SAAS,IAAI,KAAK,IAAI,GAAG,eAAe,IAAI;AAAA,MAE7D,IAAI,eAAe,QAAQ,eAAe,MAAM;AAAA,QAC/C,QAAQ,aAAa,cAAc;AAAA,MACpC;AAAA,MACA,IAAI,eAAe,MAAM;AAAA,QACxB,OAAO,aAAa;AAAA,MACrB;AAAA,MACA,IAAI,eAAe,MAAM;AAAA,QACxB,OAAO,aAAa;AAAA,MACrB;AAAA,MAEA,OAAO,MAAM;AAAA;AAAA,IAGd,MAAM,sBAAsB,CAC3B,YACI;AAAA,MACJ,MAAM,YACL,OAAO,SAAS,cAAc,WAAW,QAAQ,YAAY;AAAA,MAC9D,MAAM,SACL,OAAO,SAAS,WAAW,WAAW,QAAQ,SAAS;AAAA,MACxD,MAAM,QAAQ,OAAO,SAAS,UAAU,WAAW,QAAQ,QAAQ;AAAA,MACnE,IAAI,CAAC,aAAa,CAAC,UAAU,UAAU;AAAA,QAAM;AAAA,MAC7C,YAAY,aACX,CAAC,YAAY,SAAS,GACtB,CAAC,gBAAgB;AAAA,QAChB,IAAI,CAAC;AAAA,UAAa,OAAO;AAAA,QACzB,MAAM,eAAe,CAAC,GAAG,WAAW;AAAA,QACpC,MAAM,eAAe,aAAa,UACjC,CAAC,YAAY,QAAQ,OAAO,SAC7B;AAAA,QACA,IAAI,iBAAiB;AAAA,UAAI,OAAO;AAAA,QAChC,MAAM,gBAAgB,aAAa;AAAA,QACnC,MAAM,QAAQ,cAAc,QAAQ,CAAC,GAAG,cAAc,KAAK,IAAI,CAAC;AAAA,QAChE,IAAI,YAAY,MAAM,UAAU,CAAC,SAAS,KAAK,OAAO,MAAM;AAAA,QAC5D,MAAM,YACL,OAAO,SAAS,cAAc,WAAW,QAAQ,YAAY;AAAA,QAC9D,IAAI,cAAc,IAAI;AAAA,UACrB,MAAM,UAAuB;AAAA,YAC5B,IAAI;AAAA,YACJ;AAAA,YACA,OAAO,uBAAuB,OAAO,SAAS;AAAA,YAC9C;AAAA,YACA,MAAM;AAAA,YACN,SAAS,KAAK,UAAU,EAAE,MAAM,MAAM,CAAC;AAAA,YACvC,aAAa,EAAE,MAAM,MAAM;AAAA,YAC3B,OAAO,cAAc;AAAA,YACrB,UAAU,cAAc;AAAA,YACxB,OAAO,cAAc;AAAA,YACrB,WAAW,KAAK,IAAI;AAAA,YACpB,aAAa;AAAA,YACb,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,gBAAgB;AAAA,UACjB;AAAA,UACA,MAAM,KAAK,OAAO;AAAA,UAClB,YAAY,MAAM,SAAS;AAAA,QAC5B,EAAO;AAAA,UACN,MAAM,WAAW,MAAM;AAAA,UACvB,MAAM,WAAW,YAAY,QAAQ;AAAA,UACrC,MAAM,WAAW,GAAG,WAAW;AAAA,UAC/B,MAAM,aAAa;AAAA,eACf;AAAA,YACH,SAAS,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAAA,YAC1C,aAAa,EAAE,MAAM,SAAS;AAAA,YAC9B,WAAW,aAAa,SAAS,aAAa;AAAA,YAC9C,aAAa;AAAA,UACd;AAAA;AAAA,QAED,aAAa,gBAAgB,KAAK,eAAe,MAAM;AAAA,QACvD,OAAO;AAAA,OAET;AAAA;AAAA,IAGD,MAAM,oBAAoB,CACzB,YACI;AAAA,MACJ,MAAM,YACL,OAAO,SAAS,cAAc,WAAW,QAAQ,YAAY;AAAA,MAC9D,MAAM,SACL,OAAO,SAAS,WAAW,WAAW,QAAQ,SAAS;AAAA,MACxD,MAAM,QAAQ,OAAO,SAAS,UAAU,WAAW,QAAQ,QAAQ;AAAA,MACnE,IAAI,CAAC,aAAa,CAAC,UAAU,UAAU;AAAA,QAAM;AAAA,MAC7C,YAAY,aACX,CAAC,YAAY,SAAS,GACtB,CAAC,gBAAgB;AAAA,QAChB,IAAI,CAAC;AAAA,UAAa,OAAO;AAAA,QACzB,MAAM,eAAe,CAAC,GAAG,WAAW;AAAA,QACpC,MAAM,eAAe,aAAa,UACjC,CAAC,YAAY,QAAQ,OAAO,SAC7B;AAAA,QACA,IAAI,iBAAiB;AAAA,UAAI,OAAO;AAAA,QAChC,MAAM,gBAAgB,aAAa;AAAA,QACnC,MAAM,QAAQ,cAAc,QAAQ,CAAC,GAAG,cAAc,KAAK,IAAI,CAAC;AAAA,QAChE,IAAI,YAAY,MAAM,UAAU,CAAC,SAAS,KAAK,OAAO,MAAM;AAAA,QAC5D,MAAM,YACL,OAAO,SAAS,cAAc,WAAW,QAAQ,YAAY;AAAA,QAC9D,IAAI,cAAc,IAAI;AAAA,UACrB,MAAM,UAAuB;AAAA,YAC5B,IAAI;AAAA,YACJ;AAAA,YACA,OAAO,uBAAuB,OAAO,SAAS;AAAA,YAC9C;AAAA,YACA,MAAM;AAAA,YACN,SAAS,KAAK,UAAU,EAAE,MAAM,MAAM,CAAC;AAAA,YACvC,aAAa,EAAE,MAAM,MAAM;AAAA,YAC3B,OAAO,cAAc;AAAA,YACrB,UAAU,cAAc;AAAA,YACxB,OAAO,cAAc;AAAA,YACrB,WAAW,KAAK,IAAI;AAAA,YACpB,aAAa;AAAA,YACb,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,gBAAgB;AAAA,UACjB;AAAA,UACA,MAAM,KAAK,OAAO;AAAA,UAClB,YAAY,MAAM,SAAS;AAAA,QAC5B,EAAO;AAAA,UACN,MAAM,WAAW,MAAM;AAAA,UACvB,MAAM,WAAW,YAAY,QAAQ;AAAA,UACrC,MAAM,WAAW,GAAG,WAAW;AAAA,UAC/B,MAAM,aAAa;AAAA,eACf;AAAA,YACH,SAAS,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAAA,YAC1C,aAAa,EAAE,MAAM,SAAS;AAAA,YAC9B,WAAW,aAAa,SAAS,aAAa;AAAA,YAC9C,aAAa;AAAA,UACd;AAAA;AAAA,QAED,aAAa,gBAAgB,KAAK,eAAe,MAAM;AAAA,QACvD,OAAO;AAAA,OAET;AAAA;AAAA,IAGD,MAAM,0BAA0B,CAC/B,YACI;AAAA,MACJ,IAAI,CAAC;AAAA,QAAS;AAAA,MACd,MAAM,SAAS,OAAO,QAAQ,WAAW,WAAW,QAAQ,SAAS;AAAA,MACrE,MAAM,OAAO,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO;AAAA,MAC/D,IAAI,CAAC;AAAA,QAAM;AAAA,MACX,YAAY,aACX,CAAC,YAAY,SAAS,GACtB,CAAC,gBAAgB;AAAA,QAChB,IAAI,CAAC;AAAA,UAAa,OAAO;AAAA,QACzB,MAAM,eAAe,CAAC,GAAG,WAAW;AAAA,QACpC,IAAI,cAAc,4BAA4B,YAAY;AAAA,QAC1D,IAAI,OAAO,QAAQ,cAAc,UAAU;AAAA,UAC1C,MAAM,gBAAgB,aAAa,UAClC,CAAC,YAAY,QAAQ,OAAO,QAAQ,SACrC;AAAA,UACA,IAAI,kBAAkB;AAAA,YAAI,cAAc;AAAA,QACzC;AAAA,QACA,IAAI,gBAAgB;AAAA,UAAI,OAAO;AAAA,QAC/B,MAAM,gBAAgB,aAAa;AAAA,QACnC,MAAM,QAAQ,cAAc,QAAQ,CAAC,GAAG,cAAc,KAAK,IAAI,CAAC;AAAA,QAChE,IAAI,YAAY;AAAA,QAChB,IAAI,QAAQ;AAAA,UACX,YAAY,MAAM,UACjB,CAAC,SAAS,KAAK,eAAe,UAAU,KAAK,SAC9C;AAAA,QACD;AAAA,QAEA,IAAI,cAAc,MAAM,CAAC,QAAQ;AAAA,UAChC,YAAY,MAAM,UACjB,CAAC,SAAS,KAAK,aAAa,KAAK,aAAa,IAC/C;AAAA,QACD;AAAA,QACA,MAAM,OAAQ,QAA+B;AAAA,QAC7C,MAAM,YACL,OAAO,QAAQ,cAAc,WAAW,QAAQ,YAAY;AAAA,QAC7D,MAAM,kBAA2C,EAAE,KAAK;AAAA,QACxD,IAAI;AAAA,UAAQ,gBAAgB,SAAS;AAAA,QACrC,IAAI,SAAS;AAAA,UAAW,gBAAgB,OAAO;AAAA,QAC/C,IAAI,cAAc,IAAI;AAAA,UACrB,MAAM,UAAuB;AAAA,YAC5B,IAAI,SACD,uBAAuB,WACvB,uBAAuB,QAAQ,KAAK,IAAI;AAAA,YAC3C,WAAW,cAAc;AAAA,YACzB,OAAO,uBAAuB,OAAO,SAAS;AAAA,YAC9C;AAAA,YACA,MAAM;AAAA,YACN,SAAS,KAAK,UAAU,eAAe;AAAA,YACvC,aAAa;AAAA,YACb,OAAO,cAAc;AAAA,YACrB,UAAU,cAAc;AAAA,YACxB,OAAO,cAAc;AAAA,YACrB,WAAW,KAAK,IAAI;AAAA,YACpB,aAAa;AAAA,YACb,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,gBAAgB;AAAA,YAChB,WAAW;AAAA,UACZ;AAAA,UACA,MAAM,KAAK,OAAO;AAAA,QACnB,EAAO;AAAA,UACN,MAAM,WAAW,MAAM;AAAA,UACvB,MAAM,kBAA2C;AAAA,eAC5C,OAAO,SAAS,gBAAgB,YACpC,CAAC,MAAM,QAAQ,SAAS,WAAW,IAC/B,SAAS,cACV,CAAC;AAAA,YACJ;AAAA,UACD;AAAA,UACA,IAAI;AAAA,YAAQ,gBAAgB,SAAS;AAAA,UACrC,IAAI,SAAS;AAAA,YAAW,gBAAgB,OAAO;AAAA,UAC/C,MAAM,aAAa;AAAA,eACf;AAAA,YACH,SAAS,KAAK,UAAU,eAAe;AAAA,YACvC,aAAa;AAAA,YACb,WAAW,aAAa,SAAS,aAAa;AAAA,YAC9C,YAAY,UAAU,SAAS;AAAA,YAC/B,UAAU;AAAA,UACX;AAAA;AAAA,QAED,aAAa,eAAe,KAAK,eAAe,MAAM;AAAA,QACtD,OAAO;AAAA,OAET;AAAA;AAAA,IAGD,MAAM,2BAA2B,CAChC,YACI;AAAA,MACJ,MAAM,SACL,OAAO,SAAS,WAAW,WAAW,QAAQ,SAAS;AAAA,MACxD,IAAI,CAAC;AAAA,QAAQ;AAAA,MACb,MAAM,cACL,OAAO,SAAS,SAAS,WAAW,QAAQ,OAAO;AAAA,MACpD,MAAM,mBACL,OAAO,SAAS,cAAc,WAAW,QAAQ,YAAY;AAAA,MAC9D,MAAM,gBAAgB,SAAS;AAAA,MAC/B,MAAM,kBAAkB,SAAS;AAAA,MACjC,MAAM,cAAc,SAAS;AAAA,MAC7B,YAAY,aACX,CAAC,YAAY,SAAS,GACtB,CAAC,gBAAgB;AAAA,QAChB,IAAI,CAAC;AAAA,UAAa,OAAO;AAAA,QACzB,IAAI,UAAU;AAAA,QACd,MAAM,MAAM,KAAK,IAAI;AAAA,QACrB,MAAM,eAAe,YAAY,IAAI,CAAC,YAAY;AAAA,UACjD,IAAI,CAAC,QAAQ,OAAO;AAAA,YAAQ,OAAO;AAAA,UACnC,IAAI,iBAAiB;AAAA,UACrB,MAAM,eAAe,QAAQ,MAAM,IAAI,CAAC,SAAS;AAAA,YAChD,IAAI,EAAE,KAAK,aAAa,KAAK,eAAe,SAAS;AAAA,cACpD,OAAO;AAAA,YACR;AAAA,YACA,iBAAiB;AAAA,YACjB,UAAU;AAAA,YACV,MAAM,kBAA2C;AAAA,iBAC5C,OAAO,KAAK,gBAAgB,YAChC,CAAC,MAAM,QAAQ,KAAK,WAAW,IAC3B,KAAK,cACN,CAAC;AAAA,cACJ,MAAM,eAAe,KAAK,YAAY;AAAA,cACtC;AAAA,YACD;AAAA,YACA,IAAI,gBAAgB;AAAA,cAAW,gBAAgB,OAAO;AAAA,YACtD,IAAI,kBAAkB;AAAA,cACrB,gBAAgB,SAAS;AAAA,YAC1B,IAAI,oBAAoB;AAAA,cACvB,gBAAgB,WAAW;AAAA,YAC5B,MAAM,aACL,KAAK,aAAa,OAAO,SAAS,KAAK,SAAS,IAC7C,KAAK,IAAI,GAAG,MAAM,KAAK,SAAS,IAChC,KAAK;AAAA,YACT,MAAM,eAA4B;AAAA,iBAC9B;AAAA,cACH,MAAM;AAAA,cACN,SAAS,KAAK,UAAU,eAAe;AAAA,cACvC,aAAa;AAAA,cACb,WAAW,oBAAoB,KAAK,aAAa;AAAA,cACjD,aAAa;AAAA,cACb,UAAU,eAAe,KAAK;AAAA,cAC9B,gBAAgB,cAAc;AAAA,YAC/B;AAAA,YACA,OAAO;AAAA,WACP;AAAA,UACD,IAAI,CAAC;AAAA,YAAgB,OAAO;AAAA,UAC5B,OAAO,KAAK,SAAS,OAAO,aAAa;AAAA,SACzC;AAAA,QACD,OAAO,UAAU,eAAe;AAAA,OAElC;AAAA;AAAA,IAGD,MAAM,0BAA0B,CAC/B,YACI;AAAA,MACJ,MAAM,SACL,OAAO,SAAS,WAAW,WAAW,QAAQ,SAAS;AAAA,MACxD,IAAI,CAAC;AAAA,QAAQ;AAAA,MACb,YAAY,aACX,CAAC,YAAY,SAAS,GACtB,CAAC,gBAAgB;AAAA,QAChB,IAAI,CAAC;AAAA,UAAa,OAAO;AAAA,QACzB,IAAI,UAAU;AAAA,QACd,MAAM,eAAe,YAAY,IAAI,CAAC,YAAY;AAAA,UACjD,IAAI,CAAC,QAAQ,OAAO;AAAA,YAAQ,OAAO;AAAA,UACnC,MAAM,WAAW,QAAQ,MAAM,OAC9B,CAAC,SAAS,EAAE,KAAK,aAAa,KAAK,eAAe,OACnD;AAAA,UACA,IAAI,SAAS,WAAW,QAAQ,MAAM;AAAA,YAAQ,OAAO;AAAA,UACrD,UAAU;AAAA,UACV,OAAO,KAAK,SAAS,OAAO,SAAS;AAAA,SACrC;AAAA,QACD,OAAO,UAAU,eAAe;AAAA,OAElC;AAAA;AAAA,IAGD,MAAM,2BAA2B,CAAC,cAA6B;AAAA,MAC9D,IAAI,CAAC;AAAA,QAAW;AAAA,MAChB,YAAY,aACX,CAAC,YAAY,SAAS,GACtB,CAAC,gBAAgB;AAAA,QAChB,IAAI,CAAC;AAAA,UAAa,OAAO;AAAA,QACzB,MAAM,cAAc,YAAY,UAC/B,CAAC,YAAY,QAAQ,OAAO,SAC7B;AAAA,QACA,IAAI,gBAAgB;AAAA,UAAI,OAAO;AAAA,QAC/B,MAAM,SAAS,YAAY;AAAA,QAC3B,IACC,CAAC,OAAO,OAAO,KACd,CAAC,SAAS,KAAK,aAAa,KAAK,SAAS,WAC3C;AAAA,UAEA,OAAO;AAAA,QACR,MAAM,eAAe,CAAC,GAAG,WAAW;AAAA,QACpC,aAAa,eAAe;AAAA,aACxB;AAAA,UACH,OACC,OAAO,OAAO,OACb,CAAC,SAAS,EAAE,KAAK,aAAa,KAAK,SAAS,YAC7C,KAAK,CAAC;AAAA,QACR;AAAA,QACA,OAAO;AAAA,OAET;AAAA;AAAA,IAGD,MAAM,uBAAuB,CAC5B,YACI;AAAA,MACJ,MAAM,KAAK,OAAO,SAAS,OAAO,WAAW,QAAQ,KAAK;AAAA,MAC1D,IAAI,CAAC;AAAA,QAAI;AAAA,MACT,YAAY,aACX,CAAC,YAAY,SAAS,GACtB,CAAC,gBAAgB;AAAA,QAChB,IAAI,CAAC;AAAA,UAAa,OAAO;AAAA,QACzB,MAAM,eAAe,CAAC,GAAG,WAAW;AAAA,QACpC,MAAM,eAAe,aAAa,UACjC,CAAC,YAAY,QAAQ,OAAO,EAC7B;AAAA,QACA,IAAI,iBAAiB;AAAA,UAAI,OAAO;AAAA,QAChC,MAAM,WAAW,aAAa;AAAA,QAC9B,aAAa,gBAAgB;AAAA,aACzB;AAAA,UACH,QAAQ;AAAA,UACR,aAAa,KAAK,IAAI;AAAA,QACvB;AAAA,QACA,OAAO;AAAA,OAET;AAAA;AAAA,IAKD,MAAM,sBAAsB,MAAM;AAAA,MACjC,MAAM,MAAM,KAAK,IAAI;AAAA,MACrB,IAAI,MAAM,oBAAoB,UAAU,KAAK;AAAA,QAC5C;AAAA,MACD;AAAA,MACA,oBAAoB,UAAU;AAAA,MAE9B,YAAY,kBAAkB,EAAE,UAAU,CAAC,YAAY,SAAS,EAAE,CAAC;AAAA;AAAA,IAGpE,MAAM,qBAAqB,IAAI,IAAI;AAAA,MAClC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD,CAAC;AAAA,IAED,MAAM,cAAc,QAAO,GAAG,KAAK,CAAC,UAAU;AAAA,MAE7C,MAAM,UAAU,MAAM;AAAA,MAEtB,QAAQ,MAAM;AAAA,aACR,mBAAmB;AAAA,UACvB,MAAM,OAAO,OAAO,SAAS,SAAS,WAAW,QAAQ,OAAO;AAAA,UAChE,MAAM,KAAK,OAAO,SAAS,OAAO,WAAW,QAAQ,KAAK;AAAA,UAC1D,IAAI,SAAS,eAAe,IAAI;AAAA,YAC/B,sBAAsB,UAAU;AAAA,UACjC;AAAA,UACA,IAAI,MAAM,MAAM;AAAA,YACf,MAAM,QACL,OAAO,SAAS,UAAU,WAAW,QAAQ,QAAQ;AAAA,YACtD,MAAM,WACL,OAAO,SAAS,aAAa,WAAW,QAAQ,WAAW;AAAA,YAC5D,MAAM,QACL,OAAO,SAAS,UAAU,WAAW,QAAQ,QAAQ;AAAA,YACtD,YAAY,aACX,CAAC,YAAY,SAAS,GACtB,CAAC,gBAAgB;AAAA,cAChB,IAAI,CAAC;AAAA,gBAAa,OAAO;AAAA,cACzB,IAAI,YAAY,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,gBAAG,OAAO;AAAA,cACjD,MAAM,aAAsB;AAAA,gBAC3B;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,QAAQ;AAAA,gBACR;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,WAAW,KAAK,IAAI;AAAA,gBACpB,aAAa;AAAA,gBACb,WAAW;AAAA,gBACX,cAAc;AAAA,gBACd,kBAAkB;AAAA,gBAClB,aAAa;AAAA,gBACb,OAAO;AAAA,gBACP,OAAO,CAAC;AAAA,cACT;AAAA,cACA,MAAM,OAAO,CAAC,GAAG,aAAa,UAAU;AAAA,cACxC,KAAK,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAAA,cAC7C,OAAO;AAAA,aAET;AAAA,YACA,oBAAoB;AAAA,UACrB;AAAA,UACA;AAAA,QACD;AAAA,aACK,sBAAsB;AAAA,UAC1B,kBAAkB,OAAO;AAAA,UACzB;AAAA,QACD;AAAA,aACK,mBAAmB;AAAA,UACvB,oBAAoB,OAAO;AAAA,UAC3B;AAAA,QACD;AAAA,aACK,qBAAqB;AAAA,UACzB,MAAM,KAAK,OAAO,SAAS,OAAO,WAAW,QAAQ,KAAK;AAAA,UAC1D,IAAI,MAAM,sBAAsB,YAAY,IAAI;AAAA,YAC/C,sBAAsB,UAAU;AAAA,UACjC;AAAA,UACA,qBAAqB,OAAO;AAAA,UAC5B,yBAAyB,EAAE;AAAA,UAC3B,YAAY,kBAAkB,EAAE,UAAU,iBAAiB,CAAC;AAAA,UAC5D;AAAA,QACD;AAAA,aACK,cAAc;AAAA,UAClB,MAAM,UACL,OAAO,SAAS,YAAY,WAAW,QAAQ,UAAU;AAAA,UAC1D,IAAI,YAAY,SAAS;AAAA,YACxB,wBAAwB,OAAO;AAAA,UAChC;AAAA,UACA;AAAA,QACD;AAAA,aACK,aAAa;AAAA,UACjB,wBAAwB,OAAO;AAAA,UAC/B;AAAA,QACD;AAAA,aACK,eAAe;AAAA,UACnB,yBAAyB,OAAO;AAAA,UAChC;AAAA,QACD;AAAA,aACK,0BAA0B;AAAA,UAC9B,MAAM,SACL,OAAO,SAAS,WAAW,WAAW,QAAQ,SAAS;AAAA,UACxD,MAAM,WACL,OAAO,SAAS,aAAa,WAAW,QAAQ,WAAW;AAAA,UAC5D,MAAM,YACL,OAAO,SAAS,cAAc,WAAW,QAAQ,YAAY;AAAA,UAC9D,MAAM,OAAO,SAAS;AAAA,UACtB,IAAI,UAAU,YAAY,WAAW;AAAA,YACpC,mBAAmB;AAAA,cAClB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,WAAW,KAAK,IAAI;AAAA,YACrB,CAAC;AAAA,UACF;AAAA,UACA;AAAA,QACD;AAAA,aACK,0BAA0B;AAAA,UAC9B,MAAM,SACL,OAAO,SAAS,WAAW,WAAW,QAAQ,SAAS;AAAA,UACxD,IAAI,QAAQ;AAAA,YACX,sBAAsB,MAAM;AAAA,UAC7B;AAAA,UACA;AAAA,QACD;AAAA,aACK,yBAAyB;AAAA,UAC7B,MAAM,SACL,OAAO,SAAS,WAAW,WAAW,QAAQ,SAAS;AAAA,UACxD,MAAM,OAAO,SAAS;AAAA,UACtB,IAAI,QAAQ;AAAA,YACX,sBAAsB,QAAQ,IAAI;AAAA,UACnC;AAAA,UACA;AAAA,QACD;AAAA,aACK,SAAS;AAAA,UACb,wBAAwB,OAAO;AAAA,UAC/B,MAAM,YACL,OAAO,SAAS,cAAc,WAAW,QAAQ,YAAY;AAAA,UAC9D,IAAI,WAAW;AAAA,YACd,yBAAyB,SAAS;AAAA,UACnC;AAAA,UACA;AAAA,QACD;AAAA,aACK,mBAAmB;AAAA,UACvB,MAAM,KAAK,OAAO,SAAS,OAAO,WAAW,QAAQ,KAAK;AAAA,UAC1D,MAAM,SACL,OAAO,SAAS,WAAW,WAAW,QAAQ,SAAS;AAAA,UACxD,IAAI,MAAM,QAAQ;AAAA,YACjB,YAAY,aACX,CAAC,YAAY,SAAS,GACtB,CAAC,gBAAgB;AAAA,cAChB,IAAI,CAAC;AAAA,gBAAa,OAAO;AAAA,cACzB,MAAM,MAAM,YAAY,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,cACpD,IAAI,QAAQ;AAAA,gBAAI,OAAO;AAAA,cACvB,MAAM,OAAO,CAAC,GAAG,WAAW;AAAA,cAC5B,KAAK,OAAO;AAAA,mBACR,KAAK;AAAA,gBACR;AAAA,cACD;AAAA,cACA,OAAO;AAAA,aAET;AAAA,UACD;AAAA,UACA;AAAA,QACD;AAAA,aACK,iBAAiB;AAAA,UACrB,MAAM,aAAa;AAAA,YAClB,kBAAkB,SAAS;AAAA,YAC3B,gBAAiB,SAAS,kBAAkB,CAAC;AAAA,YAI7C,aAAc,SAAS,eAAe;AAAA,UACvC;AAAA,UACA,YAAY,aAAa,CAAC,cAAc,SAAS,GAAG,UAAU;AAAA,UAC9D;AAAA,QACD;AAAA;AAAA,UAEC;AAAA;AAAA,MAGF,IAAI,mBAAmB,IAAI,MAAM,IAAI,GAAG;AAAA,QAEvC,oBAAoB;AAAA,MACrB;AAAA,MAEA,IAAI,MAAM,SAAS,eAAe;AAAA,QACjC,MAAM,MAAM,KAAK,IAAI;AAAA,QACrB,IAAI,MAAM,2BAA2B,MAAM;AAAA,UAC1C,0BAA0B;AAAA,UAC1B,YAAY,kBAAkB,EAAE,UAAU,iBAAiB,CAAC;AAAA,QAC7D;AAAA,MACD;AAAA,KACA;AAAA,IAED,OAAO,MAAM;AAAA,MACZ,YAAY;AAAA,MACZ,QAAO,WAAW;AAAA;AAAA,KAEjB;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAC;AAAA;;;AEjsBF,sBAAS,4BAAW;AAab,SAAS,wBAAwB,CAAC,WAA+B;AAAA,EACvE,QAAQ,kBAAkB,0BAA0B,qBAAqB;AAAA,EAKzE,MAAM,0BAA0B;AAAA,EAEhC,MAAM,gBAAgB,cACrB,OAAO,WAAmB;AAAA,IACzB,IAAI,CAAC;AAAA,MAAW;AAAA,IAChB,IAAI;AAAA,MACH,MAAM,UAAU,gBAAgB,WAAW,QAAQ,IAAI;AAAA,MACvD,sBAAsB,MAAM;AAAA,MAC3B,OAAO,OAAO;AAAA,MACf,QAAQ,MAAM,gCAAgC,KAAK;AAAA;AAAA,KAGrD,CAAC,WAAW,qBAAqB,CAClC;AAAA,EAEA,MAAM,eAAe,cACpB,OAAO,WAAmB;AAAA,IACzB,IAAI,CAAC;AAAA,MAAW;AAAA,IAChB,IAAI;AAAA,MACH,MAAM,UAAU,gBAAgB,WAAW,QAAQ,KAAK;AAAA,MACxD,sBAAsB,MAAM;AAAA,MAC3B,OAAO,OAAO;AAAA,MACf,QAAQ,MAAM,+BAA+B,KAAK;AAAA;AAAA,KAGpD,CAAC,WAAW,qBAAqB,CAClC;AAAA,EAEA,MAAM,mBAAmB,cAAY,YAAY;AAAA,IAChD,IAAI,CAAC;AAAA,MAAW;AAAA,IAChB,IAAI;AAAA,MACH,MAAM,QAAQ,IACb,wBAAwB,IAAI,CAAC,MAC5B,UAAU,gBAAgB,WAAW,EAAE,QAAQ,IAAI,CACpD,CACD;AAAA,MACA,WAAW,KAAK,yBAAyB;AAAA,QACxC,sBAAsB,EAAE,MAAM;AAAA,MAC/B;AAAA,MACC,OAAO,OAAO;AAAA,MACf,QAAQ,MAAM,qCAAqC,KAAK;AAAA;AAAA,KAEvD,CAAC,WAAW,yBAAyB,qBAAqB,CAAC;AAAA,EAE9D,YAAU,MAAM;AAAA,IACf,IAAI,CAAC,aAAa,wBAAwB,WAAW;AAAA,MAAG;AAAA,IAExD,MAAM,gBAAgB,CAAC,MAAqB;AAAA,MAE3C,IACC,EAAE,kBAAkB,oBACpB,EAAE,kBAAkB,uBACnB,EAAE,QAAwB,mBAC1B;AAAA,QACD;AAAA,MACD;AAAA,MAEA,MAAM,eAAe,wBAAwB;AAAA,MAE7C,IAAI,EAAE,QAAQ,OAAO,EAAE,QAAQ,KAAK;AAAA,QACnC,EAAE,eAAe;AAAA,QACjB,cAAc,aAAa,MAAM;AAAA,MAClC,EAAO,SAAI,EAAE,QAAQ,OAAO,EAAE,QAAQ,OAAO,EAAE,QAAQ,UAAU;AAAA,QAChE,EAAE,eAAe;AAAA,QACjB,aAAa,aAAa,MAAM;AAAA,MACjC,EAAO,SAAI,EAAE,QAAQ,OAAO,EAAE,QAAQ,KAAK;AAAA,QAC1C,EAAE,eAAe;AAAA,QACjB,iBAAiB;AAAA,MAClB;AAAA;AAAA,IAGD,OAAO,iBAAiB,WAAW,aAAa;AAAA,IAChD,OAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,KAC9D;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAC;AAAA;;;AClGF,iBAAS,oBAAM,yBAAU,4BAAW,yBAAa;AACjD;AAAA,gBACC;AAAA,YACA;AAAA,aACA;AAAA,kBACA;AAAA,eACA;AAAA;;;ACND,iBAAS;AACT,wBAAS,yBAAa;AAAA;AAWtB,IAAM,mBAAmB,GAAG,SAAS,SAA8B;AAAA,EAClE,MAAM,QAAQ,KAAK,MAAM,UAAU,MAAM,IAAI;AAAA,EAC7C,uBACC,MAUE,OAVF;AAAA,IACC;AAAA,IACA;AAAA,IACA,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,WAAU;AAAA,IACV,cAAW;AAAA,IACX,MAAK;AAAA,IAPN,0BASC,MAAC,QAAD;AAAA,MAAM,GAAE;AAAA,KAAixD;AAAA,GACxxD;AAAA;AAIJ,IAAM,aAAa;AAAA,EAClB,IAAI,EAAE,MAAM,IAAI,MAAM,IAAI,UAAU,GAAG;AAAA,EACvC,IAAI,EAAE,MAAM,IAAI,MAAM,IAAI,UAAU,GAAG;AAAA,EACvC,IAAI,EAAE,MAAM,IAAI,MAAM,IAAI,UAAU,GAAG;AACxC;AAEO,IAAM,kBAAkB,OAAK,SAAS,gBAAe;AAAA,EAC3D;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,GACiB;AAAA,EACxB,QAAQ,MAAM,MAAM,aAAa,WAAW;AAAA,EAE5C,MAAM,YAAiC;AAAA,IACtC,UAAU;AAAA,IACV,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,OAAO;AAAA,IACP,QAAQ;AAAA,EACT;AAAA,EAEA,MAAM,gBAAqC;AAAA,IAC1C,SAAS;AAAA,IACT,UAAU;AAAA,IACV,OAAO;AAAA,IACP,cAAc;AAAA,EACf;AAAA,EAEA,MAAM,iBAAiB,MAAM;AAAA,IAC5B,IAAI,WAAW;AAAA,MAAW,OAAO;AAAA,IACjC,IAAI,WAAW;AAAA,MAAS,OAAO;AAAA,IAC/B,OAAO;AAAA;AAAA,EAGR,uBACC,OA+DE,OA/DF;AAAA,IAAK,WAAU;AAAA,IAAf,UA+DE;AAAA,sBA9DD,OAqDE,OArDF;AAAA,QAAK,OAAO;AAAA,QAAZ,UAqDE;AAAA,0BApDD,MAAC,OAAD;AAAA,YACC,OAAO;AAAA,iBACH;AAAA,cACH,QAAQ;AAAA,YACT;AAAA,WACD;AAAA,UACC,WAAW,6BACX,MAAC,OAAD;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,iBACH;AAAA,cACH,QAAQ;AAAA,cACR,gBAAgB;AAAA,cAChB,WAAW;AAAA,YACZ;AAAA,WACD;AAAA,UAEA,WAAW,6BACX,MAAC,OAAD;AAAA,YACC,OAAO;AAAA,iBACH;AAAA,cACH,QAAQ,aAAa,eAAe;AAAA,cACpC,SAAS;AAAA,YACV;AAAA,WACD;AAAA,UAEA,WAAW,2BACX,MAAC,OAAD;AAAA,YACC,OAAO;AAAA,iBACH;AAAA,cACH,QAAQ,aAAa,eAAe;AAAA,cACpC,SAAS;AAAA,YACV;AAAA,WACD;AAAA,0BAED,OAgBE,OAhBF;AAAA,YAAK,OAAO,EAAE,UAAU,YAAY,QAAQ,EAAE;AAAA,YAA9C,UAgBE;AAAA,cAfA,WAAW,6BACX,MAAC,kBAAD;AAAA,gBAAkB,QAAQ,KAAK,MAAM,OAAO,IAAI;AAAA,eAAG;AAAA,cAEnD,WAAW,6BACX,MAAC,cAAD;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO,EAAE,OAAO,UAAU,QAAQ,SAAS;AAAA,eAC5C;AAAA,cAEA,WAAW,2BACX,MAAC,UAAD;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO,EAAE,OAAO,UAAU,QAAQ,SAAS;AAAA,eAC5C;AAAA;AAAA,WAEA;AAAA;AAAA,OACD;AAAA,MACD,yBACA,OAKE,OALF;AAAA,QAAK,WAAU;AAAA,QAAf,UAKE;AAAA,0BAJD,MAA+D,QAA/D;AAAA,YAAM,WAAU;AAAA,YAAhB,UAAuD;AAAA,WAAQ;AAAA,UAC9D,4BACA,MAA4D,QAA5D;AAAA,YAAM,WAAU;AAAA,YAAhB,UAAiD;AAAA,WAAW;AAAA;AAAA,OAE5D;AAAA;AAAA,GAEF;AAAA,CAEH;;;;ADrHD,IAAM,iBAAiB,CAAC,IAAI,IAAI,IAAI,GAAG;AACvC,IAAM,aAAa;AACnB,IAAM,sBAAsB;AAC5B,IAAM,aAAa;AACnB,IAAM,iBAAgB;AACtB,IAAM,mBAAmB;AAqCzB,SAAS,kBAAkB,GAAkB;AAAA,EAC5C,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,IACvC,IAAI,OAAO,UAAU;AAAA,MACpB,QAAQ;AAAA,MACR;AAAA,IACD;AAAA,IACA,MAAM,SAAS,SAAS,cAAc,QAAQ;AAAA,IAC9C,OAAO,MAAM;AAAA,IACb,OAAO,SAAS,MAAM,QAAQ;AAAA,IAC9B,OAAO,UAAU,MAAM,OAAO,IAAI,MAAM,yBAAyB,CAAC;AAAA,IAClE,SAAS,KAAK,YAAY,MAAM;AAAA,GAChC;AAAA;AAGF,SAAS,SAAS,GAAG,YAAY,aAAqC;AAAA,EACrE,uBACC,OAsBE,OAtBF;AAAA,IACC;AAAA,IACA,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IAJP,UAsBE;AAAA,sBAhBD,MAAc,SAAd;AAAA;AAAA,OAAc;AAAA,sBACd,MAAC,QAAD;AAAA,QACC,UAAS;AAAA,QACT,UAAS;AAAA,QACT,GAAE;AAAA,OACH;AAAA,sBACA,MAAC,QAAD;AAAA,QACC,UAAS;AAAA,QACT,UAAS;AAAA,QACT,GAAE;AAAA,OACH;AAAA,sBACA,MAAC,QAAD;AAAA,QACC,UAAS;AAAA,QACT,UAAS;AAAA,QACT,GAAE;AAAA,OACH;AAAA;AAAA,GACC;AAAA;AAIJ,SAAS,YAAY,GAAG,YAAY,aAAqC;AAAA,EACxE,uBACC,OAQE,OARF;AAAA,IACC;AAAA,IACA,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IAJP,UAQE;AAAA,sBAFD,MAAiB,SAAjB;AAAA;AAAA,OAAiB;AAAA,sBACjB,MAAC,QAAD;AAAA,QAAM,GAAE;AAAA,OAAiI;AAAA;AAAA,GACxI;AAAA;AAIG,IAAM,iBAAiB,OAAK,SAAS,eAAc,GAAG;AAAA,EAC5D,MAAM,SAAS,aAAa,CAAC,MAAM,EAAE,gBAAgB;AAAA,EACrD,MAAM,aAAa,aAAa,CAAC,MAAM,EAAE,eAAe;AAAA,EACxD,MAAM,UAAU,aAAa,CAAC,MAAM,EAAE,OAAO;AAAA,EAC7C,MAAM,aAAa,aAAa,CAAC,MAAM,EAAE,UAAU;AAAA,EACnD,MAAM,cAAc,aAAa,CAAC,MAAM,EAAE,WAAW;AAAA,EACrD,MAAM,eAAe,aAAa,CAAC,MAAM,EAAE,YAAY;AAAA,EAEvD,OAAO,MAAM,WAAW,WAAoB,QAAQ;AAAA,EACpD,OAAO,SAAS,cAAc,WAAyB,OAAO;AAAA,EAC9D,OAAO,QAAQ,aAAa,WAAiB,EAAE;AAAA,EAC/C,OAAO,cAAc,mBAAmB,WAAiB,EAAE;AAAA,EAC3D,OAAO,UAAU,eAAe,WAAS,KAAK;AAAA,EAC9C,OAAO,UAAU,eAAe,WAA6B,IAAI;AAAA,EACjE,OAAO,kBAAkB,uBACxB,WAAkC,IAAI;AAAA,EACvC,OAAO,mBAAmB,wBAAwB,WAAS,KAAK;AAAA,EAChE,OAAO,oBAAoB,yBAAyB,WAAS,KAAK;AAAA,EAClE,OAAO,cAAc,mBAAmB,WAA8B,IAAI;AAAA,EAC1E,OAAO,WAAW,gBAAgB,WAAS,KAAK;AAAA,EAChD,OAAO,iBAAiB,sBAAsB,WAAwB,IAAI;AAAA,EAC1E,OAAO,WAAW,gBAAgB,WAAS,CAAC;AAAA,EAC5C,OAAO,kBAAkB,uBAAuB,WAAS,KAAK;AAAA,EAC9D,MAAM,UAAU,SAA8C,IAAI;AAAA,EAElE,MAAM,kBAAkB,WAAW,WAAW,YAAY,KAAK,IAAI;AAAA,EACnE,MAAM,YAAY,CAAC,CAAC,cAAc;AAAA,EAClC,MAAM,YAAY,YAAY,aAAa,sBAAsB;AAAA,EAEjE,MAAM,gBAAgB,cACrB,OAAO,QAAgB;AAAA,IACtB,IAAI,MAAM,aAAa,MAAM,YAAY;AAAA,MACxC,YAAY,IAAI;AAAA,MAChB,oBAAoB,IAAI;AAAA,MACxB;AAAA,IACD;AAAA,IACA,qBAAqB,IAAI;AAAA,IACzB,IAAI;AAAA,MACH,IAAI,YAAY,SAAS;AAAA,QACxB,MAAM,SAAS,MAAM,UAAU,sBAAsB,GAAG;AAAA,QACxD,YAAY,MAAM;AAAA,QAClB,oBAAoB,IAAI;AAAA,MACzB,EAAO;AAAA,QACN,MAAM,SAAS,MAAM,UAAU,yBAAyB,GAAG;AAAA,QAC3D,oBAAoB,MAAM;AAAA,QAC1B,YAAY,IAAI;AAAA;AAAA,MAEhB,MAAM;AAAA,MACP,YAAY,IAAI;AAAA,MAChB,oBAAoB,IAAI;AAAA,cACvB;AAAA,MACD,qBAAqB,KAAK;AAAA;AAAA,KAG5B,CAAC,SAAS,SAAS,CACpB;AAAA,EAEA,YAAU,MAAM;AAAA,IACf,IAAI,UAAU,mBAAmB,aAAa,SAAS,UAAU;AAAA,MAChE,MAAM,UAAU,WAAW,MAAM,cAAc,eAAe,GAAG,GAAG;AAAA,MACpE,OAAO,MAAM,aAAa,OAAO;AAAA,IAClC;AAAA,KACE,CAAC,QAAQ,iBAAiB,eAAe,MAAM,SAAS,CAAC;AAAA,EAE5D,MAAM,cAAc,cAAY,MAAM;AAAA,IACrC,IAAI,QAAQ,SAAS;AAAA,MACpB,cAAc,QAAQ,OAAO;AAAA,MAC7B,QAAQ,UAAU;AAAA,IACnB;AAAA,IACA,aAAa,KAAK;AAAA,KAChB,CAAC,CAAC;AAAA,EAEL,YAAU,MAAM;AAAA,IACf,IAAI,CAAC,QAAQ;AAAA,MACZ,YAAY;AAAA,MACZ,QAAQ,QAAQ;AAAA,MAChB,gBAAgB,IAAI;AAAA,MACpB,mBAAmB,IAAI;AAAA,MACvB,aAAa,CAAC;AAAA,IACf;AAAA,KACE,CAAC,QAAQ,WAAW,CAAC;AAAA,EAExB,YAAU,MAAM;AAAA,IACf,OAAO,MAAM,YAAY;AAAA,KACvB,CAAC,WAAW,CAAC;AAAA,EAEhB,MAAM,eAAe,cACpB,CAAC,eAAuB;AAAA,IACvB,IAAI,QAAQ;AAAA,MAAS;AAAA,IACrB,aAAa,IAAI;AAAA,IACjB,aAAa,CAAC;AAAA,IAEd,MAAM,QAAQ,YAAY;AAAA,MACzB,IAAI;AAAA,QACH,MAAM,SAAS,MAAM,UAAU,oBAAoB,UAAU;AAAA,QAC7D,aAAa,CAAC,MAAM,IAAI,CAAC;AAAA,QACzB,IAAI,QAAQ,WAAW;AAAA,UACtB,YAAY;AAAA,UACZ,mBAAmB,OAAO,SAAS;AAAA,UACnC,aAAa,WAAW,sBAAsB;AAAA,UAE9C,MAAM,cAAc,MAAM,UAAU,eAAe;AAAA,UACnD,IAAI,aAAa,YAAY,WAAW;AAAA,YACvC,WAAW,YAAY,OAAO;AAAA,UAC/B;AAAA,UACA,QAAQ,WAAW;AAAA,QACpB;AAAA,QACC,MAAM;AAAA,QACP,aAAa,CAAC,MAAM,IAAI,CAAC;AAAA;AAAA;AAAA,IAI3B,MAAM;AAAA,IACN,QAAQ,UAAU,YAAY,OAAO,cAAa;AAAA,KAEnD,CAAC,aAAa,UAAU,CACzB;AAAA,EAEA,MAAM,oBAAoB,CAAC,WAAmB;AAAA,IAC7C,UAAU,MAAM;AAAA,IAChB,YAAY,KAAK;AAAA,IACjB,gBAAgB,EAAE;AAAA;AAAA,EAGnB,MAAM,2BAA2B,CAAC,UAAkB;AAAA,IACnD,gBAAgB,KAAK;AAAA,IACrB,YAAY,IAAI;AAAA;AAAA,EAGjB,MAAM,kBAAkB,cAAY,CAAC,QAAgB;AAAA,IACpD,IAAI,OAAO,SAAS,OAAO,KAAK;AAAA,MAC/B,OAAO,OAAO,YAAY,EAAE,MAAM,iBAAiB,IAAI,GAAG,GAAG;AAAA,IAC9D,EAAO;AAAA,MACN,OAAO,KAAK,KAAK,QAAQ;AAAA;AAAA,KAExB,CAAC,CAAC;AAAA,EAEL,MAAM,sBAAsB,YAAY;AAAA,IACvC,IAAI,kBAAkB,cAAc,kBAAkB,YAAY;AAAA,MACjE,MAAM,MAAM,2BAA2B,mBAAmB,YAAY;AAAA,MACtE;AAAA,IACD;AAAA,IAEA,sBAAsB,IAAI;AAAA,IAC1B,IAAI;AAAA,MACH,MAAM,SAAS,MAAM,UAAU,oBAC9B,iBACA,gBACD;AAAA,MAEA,IAAI,OAAO,eAAe,OAAO,YAAY;AAAA,QAC5C,MAAM,OAAqB;AAAA,UAC1B,KAAK,OAAO;AAAA,UACZ,YAAY,OAAO;AAAA,UACnB,cAAc,OAAO;AAAA,UACrB,cAAc,OAAO;AAAA,QACtB;AAAA,QACA,gBAAgB,IAAI;AAAA,QACpB,aAAa,QAAQ,wBAAwB,OAAO,UAAU;AAAA,QAC9D,QAAQ,UAAU;AAAA,QAClB,gBAAgB,OAAO,WAAW;AAAA,QAClC,aAAa,OAAO,UAAU;AAAA,MAC/B;AAAA,MACC,OAAO,OAAO;AAAA,MACf,MAAM,MACL,iBAAiB,QAAQ,MAAM,UAAU,2BAC1C;AAAA,cACC;AAAA,MACD,sBAAsB,KAAK;AAAA;AAAA;AAAA,EAI7B,MAAM,yBAAyB,YAAY;AAAA,IAC1C,IAAI,kBAAkB,uBAAuB,kBAAkB,YAAY;AAAA,MAC1E,MAAM,MACL,2BAA2B,4BAA4B,YACxD;AAAA,MACA;AAAA,IACD;AAAA,IAEA,sBAAsB,IAAI;AAAA,IAC1B,IAAI;AAAA,MACH,MAAM,mBAAmB;AAAA,MACzB,MAAM,QAAQ,MAAM,UAAU,oBAAoB,eAAe;AAAA,MAEjE,QAAQ,qBAAqB;AAAA,MAE7B,MAAM,MAAM,IAAI,OAAO,SAAS;AAAA,QAC/B,KAAK,MAAM;AAAA,QACX,QAAQ,MAAM;AAAA,QACd,UAAU,MAAM;AAAA,QAChB,MAAM;AAAA,QACN,aAAa,WAAW,MAAM,gBAAgB,QAAQ,CAAC;AAAA,QACvD,UAAU,MAAM;AAAA,QAChB,SAAS,OAAO,aAIV;AAAA,UACL,IAAI;AAAA,YACH,MAAM,SAAS,MAAM,UAAU,sBAAsB;AAAA,cACpD,mBAAmB,SAAS;AAAA,cAC5B,qBAAqB,SAAS;AAAA,cAC9B,oBAAoB,SAAS;AAAA,YAC9B,CAAC;AAAA,YAED,IAAI,OAAO,SAAS;AAAA,cACnB,mBAAmB,OAAO,QAAQ;AAAA,cAClC,MAAM,cAAc,MAAM,UAAU,eAAe;AAAA,cACnD,IAAI,aAAa,YAAY,WAAW;AAAA,gBACvC,WAAW,YAAY,OAAO;AAAA,cAC/B;AAAA,cACA,QAAQ,WAAW;AAAA,YACpB;AAAA,YACC,OAAO,KAAK;AAAA,YACb,MAAM,MACL,eAAe,QACZ,IAAI,UACJ,6BACJ;AAAA,YACA,QAAQ,QAAQ;AAAA;AAAA;AAAA,QAGlB,OAAO;AAAA,UACN,WAAW,MAAM;AAAA,YAChB,QAAQ,QAAQ;AAAA;AAAA,QAElB;AAAA,QACA,OAAO;AAAA,UACN,OAAO;AAAA,QACR;AAAA,MACD,CAAC;AAAA,MAED,IAAI,GAAG,kBAAkB,MAAM;AAAA,QAC9B,MAAM,MAAM,mCAAmC;AAAA,QAC/C,QAAQ,QAAQ;AAAA,OAChB;AAAA,MAED,IAAI,KAAK;AAAA,MACR,OAAO,OAAO;AAAA,MACf,MAAM,MACL,iBAAiB,QAAQ,MAAM,UAAU,wBAC1C;AAAA,MACA,QAAQ,QAAQ;AAAA,cACf;AAAA,MACD,sBAAsB,KAAK;AAAA;AAAA;AAAA,EAI7B,MAAM,iBAAiB,MAAM;AAAA,IAC5B,IAAI,YAAY,SAAS;AAAA,MACxB,oBAAoB;AAAA,IACrB,EAAO;AAAA,MACN,uBAAuB;AAAA;AAAA;AAAA,EAIzB,MAAM,iBAAiB,YAAY;AAAA,IAClC,IAAI,CAAC;AAAA,MAAc;AAAA,IACnB,oBAAoB,IAAI;AAAA,IACxB,IAAI;AAAA,MACH,MAAM,SAAS,MAAM,UAAU,oBAC9B,aAAa,UACd;AAAA,MACA,IAAI,QAAQ,WAAW;AAAA,QACtB,YAAY;AAAA,QACZ,mBAAmB,OAAO,SAAS;AAAA,QACnC,aAAa,WAAW,sBAAsB;AAAA,QAE9C,MAAM,cAAc,MAAM,UAAU,eAAe;AAAA,QACnD,IAAI,aAAa,YAAY,WAAW;AAAA,UACvC,WAAW,YAAY,OAAO;AAAA,QAC/B;AAAA,QACA,QAAQ,WAAW;AAAA,MACpB,EAAO;AAAA,QACN,MAAM,MAAM,uDAAuD;AAAA;AAAA,MAEnE,OAAO,KAAK;AAAA,MACb,QAAQ,MAAM,kCAAkC,GAAG;AAAA,MACnD,MAAM,MAAM,gCAAgC;AAAA,cAC3C;AAAA,MACD,oBAAoB,KAAK;AAAA;AAAA;AAAA,EAI3B,MAAM,aAAa,MAAM;AAAA,IACxB,WAAW;AAAA;AAAA,EAGZ,MAAM,gBACL,mBAAmB,aAAa,mBAAmB;AAAA,EAEpD,MAAM,aACL,SAAS,cACN,sBACA,SAAS,aACR,wBACA,SAAS,wBACR,uBACA;AAAA,EAEN,uBACC,MAqSE,OArSF;AAAA,IACC;AAAA,IACA,SAAS;AAAA,IACT,OAAO;AAAA,IACP,UAAS;AAAA,IAJV,0BAMC,OA8RE,OA9RF;AAAA,MAAK,WAAU;AAAA,MAAf,UA8RE;AAAA,QA7RA,SAAS,+BACT;AAAA,oBAgBE;AAAA,4BAfD,MAME,OANF;AAAA,cAAK,WAAU;AAAA,cAAf,0BACC,MAAC,iBAAD;AAAA,gBACC,QAAO;AAAA,gBACP,OAAO,KAAK,iBAAiB,QAAQ,CAAC,KAAK,cAAc,aAAa,QAAQ,CAAC;AAAA,gBAC/E,UAAS;AAAA,eACV;AAAA,aACC;AAAA,4BAEF,MAME,UANF;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,WAAU;AAAA,cAHX;AAAA,aAME;AAAA;AAAA,SACD;AAAA,QAGF,SAAS,yCACT,MAME,OANF;AAAA,UAAK,WAAU;AAAA,UAAf,0BACC,MAAC,iBAAD;AAAA,YACC,QAAO;AAAA,YACP,OAAM;AAAA,YACN,UAAS;AAAA,WACV;AAAA,SACC;AAAA,QAGF,SAAS,cAAc,gCACvB;AAAA,oBA2CE;AAAA,4BA1CD,OAYE,OAZF;AAAA,cAAK,WAAU;AAAA,cAAf,UAYE;AAAA,gCAXD,MAAC,iBAAD;AAAA,kBACC,QAAO;AAAA,kBACP,OAAM;AAAA,kBACN,UAAS;AAAA,iBACV;AAAA,gCACA,OAKE,OALF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAKE;AAAA,oCAJD,MAAC,OAAD;AAAA,sBAAK,WAAU;AAAA,qBAAqD;AAAA,oCACpE,MAEE,QAFF;AAAA,sBAAM,WAAU;AAAA,sBAAhB,UACE,YAAY,gBAAgB,eAAe;AAAA,qBAC3C;AAAA;AAAA,iBACD;AAAA;AAAA,aACD;AAAA,4BAEF,OAsBE,OAtBF;AAAA,cAAK,WAAU;AAAA,cAAf,UAsBE;AAAA,gCArBD,OAYE,UAZF;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS;AAAA,kBACT,UAAU;AAAA,kBACV,WAAU;AAAA,kBAJX,UAYE;AAAA,oBANA,mCACA,MAAC,UAAD;AAAA,sBAAS,WAAU;AAAA,qBAAuB,oBAE1C,MAAC,YAAD;AAAA,sBAAW,WAAU;AAAA,qBAAU;AAAA,oBAE/B,mBAAmB,gBAAgB;AAAA;AAAA,iBACnC;AAAA,gCACF,OAOE,UAPF;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,MAAM,gBAAgB,aAAa,GAAG;AAAA,kBAC/C,WAAU;AAAA,kBAHX,UAOE;AAAA,oCAFD,MAAC,eAAD;AAAA,sBAAc,WAAU;AAAA,qBAAU;AAAA,oBALnC;AAAA;AAAA,iBAOE;AAAA;AAAA,aACD;AAAA,4BAEF,MAGE,KAHF;AAAA,cAAG,WAAU;AAAA,cAAb;AAAA,aAGE;AAAA;AAAA,SACD;AAAA,QAGF,SAAS,4BACT;AAAA,oBA6ME;AAAA,YA5MA,6BACA,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAEE;AAAA,4BAEH,OAOE,OAPF;AAAA,cAAK,WAAU;AAAA,cAAf,UAOE;AAAA,gCAND,MAEE,QAFF;AAAA,kBAAM,WAAU;AAAA,kBAAhB;AAAA,iBAEE;AAAA,gCACF,OAEE,QAFF;AAAA,kBAAM,WAAU;AAAA,kBAAhB,UAEE;AAAA,oBAFF;AAAA,oBACG,SAAS,QAAQ,CAAC,KAAK;AAAA;AAAA,iBACxB;AAAA;AAAA,aACD;AAAA,4BAEF,OAyBE,OAzBF;AAAA,cAAK,WAAU;AAAA,cAAf,UAyBE;AAAA,gCAxBD,OAWE,UAXF;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,MAAM,WAAW,OAAO;AAAA,kBACjC,WAAW,8FACV,YAAY,UACT,kCACA;AAAA,kBANL,UAWE;AAAA,oCAFD,MAAC,WAAD;AAAA,sBAAW,WAAU;AAAA,qBAAc;AAAA,oBATpC;AAAA;AAAA,iBAWE;AAAA,gCACF,OAWE,UAXF;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,MAAM,WAAW,UAAU;AAAA,kBACpC,WAAW,8FACV,YAAY,aACT,kCACA;AAAA,kBANL,UAWE;AAAA,oCAFD,MAAC,cAAD;AAAA,sBAAc,WAAU;AAAA,qBAAc;AAAA,oBATvC;AAAA;AAAA,iBAWE;AAAA;AAAA,aACD;AAAA,4BAEF,OAsCE,OAtCF;AAAA,cAAK,WAAU;AAAA,cAAf,UAsCE;AAAA,gCArCD,MAeE,OAfF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UACE,eAAe,IAAI,CAAC,2BACpB,OAWE,UAXF;AAAA,oBAEC,MAAK;AAAA,oBACL,SAAS,MAAM,kBAAkB,MAAM;AAAA,oBACvC,WAAW,+DACV,CAAC,YAAY,WAAW,SACrB,oDACA;AAAA,oBAPL,UAWE;AAAA,sBAXF;AAAA,sBAUG;AAAA;AAAA,qBATG,MAUJ,CACF;AAAA,iBACA;AAAA,gCAEF,OAmBE,OAnBF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAmBE;AAAA,oCAlBD,MAEE,QAFF;AAAA,sBAAM,WAAU;AAAA,sBAAhB;AAAA,qBAEE;AAAA,oCACF,MAAC,SAAD;AAAA,sBACC,MAAK;AAAA,sBACL,aAAY;AAAA,sBACZ,OAAO;AAAA,sBACP,UAAU,CAAC,MAAM,yBAAyB,EAAE,OAAO,KAAK;AAAA,sBACxD,SAAS,MAAM,YAAY,IAAI;AAAA,sBAC/B,KAAK;AAAA,sBACL,KAAK;AAAA,sBACL,MAAK;AAAA,sBACL,WAAW,4GACV,WACG,sBACA;AAAA,qBAEL;AAAA;AAAA,iBACC;AAAA;AAAA,aACD;AAAA,4BAEF,MAoFE,OApFF;AAAA,cACC,WAAW,6CACV,gBACG,gCACA;AAAA,cAJL,0BAOC,MA4EE,OA5EF;AAAA,gBAAK,WAAU;AAAA,gBAAf,0BACC,MA0EE,OA1EF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UACE,oCACA;AAAA,8BAiBE;AAAA,sCAhBD,OAKE,OALF;AAAA,wBAAK,WAAU;AAAA,wBAAf,UAKE;AAAA,0CAJD,MAEE,QAFF;AAAA,4BAAM,WAAU;AAAA,4BAAhB;AAAA,2BAEE;AAAA,0CACF,MAAC,OAAD;AAAA,4BAAK,WAAU;AAAA,2BAA6C;AAAA;AAAA,uBAC3D;AAAA,sCACF,OAKE,OALF;AAAA,wBAAK,WAAU;AAAA,wBAAf,UAKE;AAAA,0CAJD,MAEE,QAFF;AAAA,4BAAM,WAAU;AAAA,4BAAhB;AAAA,2BAEE;AAAA,0CACF,MAAC,OAAD;AAAA,4BAAK,WAAU;AAAA,2BAA6C;AAAA;AAAA,uBAC3D;AAAA,sCACF,OAGE,OAHF;AAAA,wBAAK,WAAU;AAAA,wBAAf,UAGE;AAAA,0CAFD,MAAqC,QAArC;AAAA,4BAAM,WAAU;AAAA,4BAAhB;AAAA,2BAAqC;AAAA,0CACrC,MAAC,OAAD;AAAA,4BAAK,WAAU;AAAA,2BAA6C;AAAA;AAAA,uBAC3D;AAAA;AAAA,mBACD,IACC,YAAY,WAAW,2BAC1B;AAAA,8BAuBE;AAAA,sCAtBD,OAOE,OAPF;AAAA,wBAAK,WAAU;AAAA,wBAAf,UAOE;AAAA,0CAND,MAEE,QAFF;AAAA,4BAAM,WAAU;AAAA,4BAAhB;AAAA,2BAEE;AAAA,0CACF,OAEE,QAFF;AAAA,4BAAM,WAAU;AAAA,4BAAhB,UAEE;AAAA,8BAFF;AAAA,8BACG,SAAS,aAAa,QAAQ,CAAC;AAAA;AAAA,2BAChC;AAAA;AAAA,uBACD;AAAA,sCACF,OAOE,OAPF;AAAA,wBAAK,WAAU;AAAA,wBAAf,UAOE;AAAA,0CAND,MAEE,QAFF;AAAA,4BAAM,WAAU;AAAA,4BAAhB;AAAA,2BAEE;AAAA,0CACF,OAEE,QAFF;AAAA,4BAAM,WAAU;AAAA,4BAAhB,UAEE;AAAA,8BAFF;AAAA,8BACI,SAAS,UAAU,QAAQ,CAAC;AAAA;AAAA,2BAC9B;AAAA;AAAA,uBACD;AAAA,sCACF,OAKE,OALF;AAAA,wBAAK,WAAU;AAAA,wBAAf,UAKE;AAAA,0CAJD,MAAqC,QAArC;AAAA,4BAAM,WAAU;AAAA,4BAAhB;AAAA,2BAAqC;AAAA,0CACrC,OAEE,QAFF;AAAA,4BAAM,WAAU;AAAA,4BAAhB,UAEE;AAAA,8BAFF;AAAA,8BACG,SAAS,aAAa,QAAQ,CAAC;AAAA;AAAA,2BAChC;AAAA;AAAA,uBACD;AAAA;AAAA,mBACD,IACC,YAAY,cAAc,mCAC7B;AAAA,8BA0BE;AAAA,sCAzBD,OAOE,OAPF;AAAA,wBAAK,WAAU;AAAA,wBAAf,UAOE;AAAA,0CAND,MAEE,QAFF;AAAA,4BAAM,WAAU;AAAA,4BAAhB;AAAA,2BAEE;AAAA,0CACF,OAEE,QAFF;AAAA,4BAAM,WAAU;AAAA,4BAAhB,UAEE;AAAA,8BAFF;AAAA,8BACG,iBAAiB,gBAAgB,QAAQ,CAAC;AAAA;AAAA,2BAC3C;AAAA;AAAA,uBACD;AAAA,sCACF,OAOE,OAPF;AAAA,wBAAK,WAAU;AAAA,wBAAf,UAOE;AAAA,0CAND,MAEE,QAFF;AAAA,4BAAM,WAAU;AAAA,4BAAhB;AAAA,2BAEE;AAAA,0CACF,OAEE,QAFF;AAAA,4BAAM,WAAU;AAAA,4BAAhB,UAEE;AAAA,8BAFF;AAAA,8BACG,iBAAiB,aAAa,QAAQ,CAAC;AAAA;AAAA,2BACxC;AAAA;AAAA,uBACD;AAAA,sCACF,OAKE,OALF;AAAA,wBAAK,WAAU;AAAA,wBAAf,UAKE;AAAA,0CAJD,MAAqC,QAArC;AAAA,4BAAM,WAAU;AAAA,4BAAhB;AAAA,2BAAqC;AAAA,0CACrC,OAEE,QAFF;AAAA,4BAAM,WAAU;AAAA,4BAAhB,UAEE;AAAA,8BAFF;AAAA,8BACE,iBAAiB,gBAAgB,QAAQ,CAAC;AAAA;AAAA,2BAC1C;AAAA;AAAA,uBACD;AAAA,sCACF,OAEE,KAFF;AAAA,wBAAG,WAAU;AAAA,wBAAb,UAEE;AAAA,0BAFF;AAAA,0BACS,iBAAiB;AAAA,0BAD1B;AAAA;AAAA,uBAEE;AAAA;AAAA,mBACD,IACC;AAAA,iBACH;AAAA,eACD;AAAA,aACD;AAAA,4BAEF,OAYE,UAZF;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,UAAU,CAAC,iBAAiB;AAAA,cAC5B,WAAU;AAAA,cAJX,UAYE;AAAA,gBANA,qCACA,MAAC,UAAD;AAAA,kBAAS,WAAU;AAAA,iBAAuB,oBAE1C,MAAC,aAAD;AAAA,kBAAY,WAAU;AAAA,iBAAU;AAAA,gBAEhC,YAAY,UAAU,kBAAkB;AAAA;AAAA,aACxC;AAAA,4BAEF,OAsBE,OAtBF;AAAA,cAAK,WAAU;AAAA,cAAf,UAsBE;AAAA,gCArBD,OAIE,OAJF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAIE;AAAA,oCAHD,MAAC,OAAD;AAAA,sBAAK,WAAU;AAAA,qBAAwB;AAAA,oCACvC,MAAyD,QAAzD;AAAA,sBAAM,WAAU;AAAA,sBAAhB;AAAA,qBAAyD;AAAA,oCACzD,MAAC,OAAD;AAAA,sBAAK,WAAU;AAAA,qBAAwB;AAAA;AAAA,iBACtC;AAAA,gCACF,OAeE,OAfF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAeE;AAAA,oCAdD,MAAC,SAAD;AAAA,sBAAQ,WAAU;AAAA,qBAAuC;AAAA,oCACzD,OAYE,OAZF;AAAA,sBAAK,WAAU;AAAA,sBAAf,UAYE;AAAA,wCAXD,OAOE,OAPF;AAAA,0BAAK,WAAU;AAAA,0BAAf,UAOE;AAAA,4CAND,MAAqD,QAArD;AAAA,8BAAM,WAAU;AAAA,8BAAhB;AAAA,6BAAqD;AAAA,4BACpD,gBAAgB,wBAChB,OAEE,QAFF;AAAA,8BAAM,WAAU;AAAA,8BAAhB,UAEE;AAAA,gCADA,YAAY,QAAQ,CAAC;AAAA,gCADvB;AAAA;AAAA,6BAEE;AAAA;AAAA,yBAEF;AAAA,wCACF,MAEE,KAFF;AAAA,0BAAG,WAAU;AAAA,0BAAb;AAAA,yBAEE;AAAA;AAAA,qBACD;AAAA;AAAA,iBACD;AAAA;AAAA,aACD;AAAA;AAAA,SACD;AAAA;AAAA,KAEF;AAAA,GACD;AAAA,CAEH;;;;AJvrBM,IAAM,yBAAyB,OAAK,SAAS,uBAAsB;AAAA,EACzE;AAAA,EACA;AAAA,GAC+B;AAAA,EAC/B,QAAQ,MAAM,WAAW,CAAC,GAAG,cAAc,YAAY,SAAS;AAAA,EAChE,QAAQ,MAAM,WAAW,CAAC,MAAM,YAAY;AAAA,EAC5C,QAAQ,8BAAgB,eAAe;AAAA,EAEvC,iBAAiB,SAAS;AAAA,EAG1B,yBAAyB,SAAS;AAAA,EAElC,MAAM,UAAU,UACf,MAAM,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,SAAS,GAC7C,CAAC,UAAU,SAAS,CACrB;AAAA,EAEA,MAAM,eAAe,UACpB,MACC,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,WAAW,SAAS,GACtE,CAAC,QAAQ,CACV;AAAA,EAEA,IAAI,WAAW;AAAA,IACd,uBACC,MAEE,OAFF;AAAA,MAAK,WAAU;AAAA,MAAf;AAAA,KAEE;AAAA,EAEJ;AAAA,EAEA,uBACC;AAAA,cAUE;AAAA,sBATD,MAAC,eAAD;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,aAAY;AAAA,QACrB;AAAA,OACD;AAAA,sBACA,MAAC,gBAAD,EAAgB;AAAA;AAAA,GACf;AAAA,CAEH;;AM3DD,iBAAS;AACT,0BAAS,6BAAe;AAAA;AASjB,IAAM,cAAc,OAAK,SAAS,YAAW;AAAA,EACnD;AAAA,EACA;AAAA,EACA;AAAA,GACoB;AAAA,EACpB,MAAM,cAAa,CAAC,cAAsB;AAAA,IACzC,MAAM,OAAO,IAAI,KAAK,SAAS;AAAA,IAC/B,MAAM,MAAM,IAAI;AAAA,IAChB,MAAM,SAAS,IAAI,QAAQ,IAAI,KAAK,QAAQ;AAAA,IAC5C,MAAM,WAAW,KAAK,MAAM,SAAS,KAAK;AAAA,IAC1C,MAAM,YAAY,KAAK,MAAM,WAAW,EAAE;AAAA,IAC1C,MAAM,WAAW,KAAK,MAAM,YAAY,EAAE;AAAA,IAE1C,IAAI,WAAW;AAAA,MAAG,OAAO;AAAA,IACzB,IAAI,WAAW;AAAA,MAAI,OAAO,GAAG;AAAA,IAC7B,IAAI,YAAY;AAAA,MAAI,OAAO,GAAG;AAAA,IAC9B,IAAI,WAAW;AAAA,MAAG,OAAO,GAAG;AAAA,IAC5B,OAAO,KAAK,mBAAmB;AAAA;AAAA,EAGhC,MAAM,WAAW,QAAQ,gBAAgB;AAAA,EAEzC,MAAM,aACL;AAAA,EACD,MAAM,eAAe;AAAA,EACrB,MAAM,iBAAiB;AAAA,EAEvB,uBACC,MAmCE,UAnCF;AAAA,IACC,MAAK;AAAA,IACL;AAAA,IACA,WAAW,GAAG,cAAc,WAAW,eAAe;AAAA,IAHvD,0BAKC,OA6BE,OA7BF;AAAA,MAAK,WAAU;AAAA,MAAf,UA6BE;AAAA,QA5BA,2BACA,MAAC,YAAD;AAAA,UACC,WAAW,+CAA+C,WAAW,iBAAiB;AAAA,SACvF,oBAEA,MAAC,gBAAD;AAAA,UACC,WAAW,+CAA+C,WAAW,iBAAiB;AAAA,SACvF;AAAA,wBAED,OAkBE,OAlBF;AAAA,UAAK,WAAU;AAAA,UAAf,UAkBE;AAAA,4BAjBD,OASE,OATF;AAAA,cAAK,WAAU;AAAA,cAAf,UASE;AAAA,gCARD,MAEE,MAFF;AAAA,kBAAI,WAAU;AAAA,kBAAd,UACE,QAAQ,SAAS,WAAW,QAAQ,GAAG,MAAM,GAAG,CAAC;AAAA,iBACjD;AAAA,gBACD,4BACA,MAEE,QAFF;AAAA,kBAAM,WAAU;AAAA,kBAAhB;AAAA,iBAEE;AAAA;AAAA,aAEF;AAAA,4BACF,OAME,OANF;AAAA,cAAK,WAAU;AAAA,cAAf,UAME;AAAA,gBALA,QAAQ,yBACR,MAA6C,QAA7C;AAAA,kBAAM,WAAU;AAAA,kBAAhB,UAA6B,QAAQ;AAAA,iBAAQ;AAAA,gBAE7C,QAAQ,yBAAS,MAAQ,QAAR;AAAA;AAAA,iBAAQ;AAAA,gCAC1B,MAA+D,QAA/D;AAAA,4BAAO,YAAW,QAAQ,gBAAgB,QAAQ,SAAS;AAAA,iBAAI;AAAA;AAAA,aAC9D;AAAA;AAAA,SACD;AAAA;AAAA,KACD;AAAA,GACD;AAAA,CAEH;;AC3ED,iBAAS,mBAAM,0BAAS,4BAAa,uBAAW;;;ACAhD,mBAAS;AAgBF,IAAM,gBAAgB,SAAmB,CAAC,SAAS;AAAA,EACzD,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EAEd,UAAU,CAAC,SAAS,IAAI,EAAE,cAAc,KAAK,CAAC;AAAA,EAC9C,iBAAiB,CAAC,UAAU,IAAI,EAAE,cAAc,MAAM,CAAC;AAAA,EACvD,iBAAiB,CAAC,UAAU,IAAI,EAAE,cAAc,MAAM,CAAC;AAAA,EACvD,mBAAmB,MAAM,IAAI,EAAE,cAAc,EAAE,CAAC;AAAA,EAChD,mBAAmB,MAAM,IAAI,EAAE,cAAc,EAAE,CAAC;AACjD,EAAE;;;ADtBF,oBAAS;AAAA;AAOF,IAAM,uBAAuB,OAAK,SAAS,qBAAoB;AAAA,EACrE;AAAA,EACA;AAAA,GAC6B;AAAA,EAC7B;AAAA,IACC,MAAM,WAAW,CAAC;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACG,YAAY;AAAA,EAChB,QAAQ,cAAc,iBAAiB,cAAc;AAAA,EACrD,MAAM,WAAW,SAAoC,IAAI,GAAK;AAAA,EAC9D,MAAM,qBAAqB,SAAuB,IAAI;AAAA,EACtD,MAAM,wBAAwB,SAA2B,SAAS;AAAA,EAElE,MAAM,qBAAqB,cAC1B,CAAC,cAAsB;AAAA,IACtB,sBAAsB,UAAU;AAAA,IAChC,gBAAgB,SAAS;AAAA,KAE1B,CAAC,eAAe,CACjB;AAAA,EAEA,MAAM,kBAAkB,UAAQ,MAAM;AAAA,IACrC,OAAO,SAAS,IAAI,CAAC,OAAO;AAAA,MAC3B,IAAI,EAAE;AAAA,MACN,OAAO,EAAE;AAAA,MACT,OAAO,EAAE;AAAA,MACT,WAAW,EAAE;AAAA,IACd,EAAE;AAAA,KACA,CAAC,QAAQ,CAAC;AAAA,EAEb,YAAU,MAAM;AAAA,IACf,IAAI,iBAAiB,YAAY;AAAA,MAChC,MAAM,UAAU,gBAAgB;AAAA,MAChC,IAAI,SAAS;AAAA,QACZ,MAAM,UAAU,SAAS,QAAQ,IAAI,QAAQ,EAAE;AAAA,QAC/C,SAAS,eAAe,EAAE,OAAO,WAAW,UAAU,SAAS,CAAC;AAAA,MACjE;AAAA,IACD;AAAA,KACE,CAAC,cAAc,cAAc,eAAe,CAAC;AAAA,EAEhD,YAAU,MAAM;AAAA,IACf,IACC,CAAC,mBACD,sBAAsB,YAAY,mBAClC,SAAS,WAAW;AAAA,MAEpB;AAAA,IAED,MAAM,cAAc,SAAS,UAAU,CAAC,MAAM,EAAE,OAAO,eAAe;AAAA,IACtE,IAAI,gBAAgB,MAAM,aAAa;AAAA,MACtC,cAAc;AAAA,MACd;AAAA,IACD;AAAA,IAEA,IAAI,gBAAgB,IAAI;AAAA,MACvB,sBAAsB,UAAU;AAAA,MAChC,sBAAsB,MAAM;AAAA,QAC3B,MAAM,UAAU,SAAS,QAAQ,IAAI,eAAe;AAAA,QACpD,SAAS,eAAe,EAAE,OAAO,WAAW,UAAU,SAAS,CAAC;AAAA,OAChE;AAAA,IACF;AAAA,KACE,CAAC,iBAAiB,UAAU,aAAa,aAAa,CAAC;AAAA,EAE1D,YAAU,MAAM;AAAA,IACf,MAAM,YAAY,mBAAmB;AAAA,IACrC,IAAI,CAAC;AAAA,MAAW;AAAA,IAEhB,MAAM,eAAe,MAAM;AAAA,MAC1B,QAAQ,WAAW,cAAc,iBAAiB;AAAA,MAClD,IACC,eAAe,YAAY,eAAe,OAC1C,eACA,CAAC,oBACA;AAAA,QACD,cAAc;AAAA,MACf;AAAA;AAAA,IAGD,UAAU,iBAAiB,UAAU,cAAc,EAAE,SAAS,KAAK,CAAC;AAAA,IACpE,OAAO,MAAM,UAAU,oBAAoB,UAAU,YAAY;AAAA,KAC/D,CAAC,aAAa,oBAAoB,aAAa,CAAC;AAAA,EAEnD,IAAI,WAAW;AAAA,IACd,uBACC,OAME,OANF;AAAA,MAAK,WAAU;AAAA,MAAf,UAME;AAAA,wBALD,MAAC,OAAD;AAAA,UAAK,WAAU;AAAA,SAA4C;AAAA,wBAC3D,MAAC,OAAD;AAAA,UAAK,WAAU;AAAA,SAA4C;AAAA,wBAC3D,MAAC,OAAD;AAAA,UAAK,WAAU;AAAA,SAA4C;AAAA,wBAC3D,MAAC,OAAD;AAAA,UAAK,WAAU;AAAA,SAA4C;AAAA,wBAC3D,MAAC,OAAD;AAAA,UAAK,WAAU;AAAA,SAA4C;AAAA;AAAA,KAC1D;AAAA,EAEJ;AAAA,EAEA,IAAI,gBAAgB,WAAW,GAAG;AAAA,IACjC,uBACC,MAEE,OAFF;AAAA,MAAK,WAAU;AAAA,MAAf;AAAA,KAEE;AAAA,EAEJ;AAAA,EAEA,uBACC,OA+BE,OA/BF;AAAA,IACC,KAAK;AAAA,IACL,WAAU;AAAA,IAFX,UA+BE;AAAA,MA3BA,gBAAgB,IAAI,CAAC,SAAS,UAAU;AAAA,QACxC,MAAM,cAAc,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ,EAAE;AAAA,QAC5D,IAAI,CAAC;AAAA,UAAa,OAAO;AAAA,QACzB,MAAM,YAAY,iBAAiB,cAAc,iBAAiB;AAAA,QAElE,uBACC,MAaE,OAbF;AAAA,UAEC,KAAK,CAAC,OAAO;AAAA,YACZ,IAAI;AAAA,cAAI,SAAS,QAAQ,IAAI,QAAQ,IAAI,EAAE;AAAA,YACtC;AAAA,uBAAS,QAAQ,OAAO,QAAQ,EAAE;AAAA;AAAA,UAExC,WAAW,YAAY,sCAAsC;AAAA,UAN9D,0BAQC,MAAC,aAAD;AAAA,YACC,SAAS;AAAA,YACT,UAAU,QAAQ,OAAO;AAAA,YACzB,SAAS,MAAM,mBAAmB,QAAQ,EAAE;AAAA,WAC7C;AAAA,WAXK,QAAQ,EAYZ;AAAA,OAEH;AAAA,MACA,sCACA,MAEE,OAFF;AAAA,QAAK,WAAU;AAAA,QAAf,0BACC,MAAC,UAAD;AAAA,UAAS,WAAU;AAAA,SAA6C;AAAA,OAC/D;AAAA;AAAA,GAEF;AAAA,CAEH;;AEtJD,kBAAS;AACT;AAAA,WACC;AAAA,iBACA;AAAA;;AAKD,IAAM,mBAAmB,IAAI,IAAI;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,CAAC;AAED,SAAS,WAAW,CAAC,UAA2B;AAAA,EAC/C,MAAM,MAAM,SAAS,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY,KAAK;AAAA,EACxD,OAAO,iBAAiB,IAAI,GAAG;AAAA;AAehC,IAAM,eAAuC;AAAA,EAC5C,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,GAAG;AAAA,EACH,KAAK;AAAA,EACL,GAAG;AAAA,EACH,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,QAAQ;AACT;AAEA,SAAS,qBAAqB,CAAC,MAAsB;AAAA,EACpD,MAAM,YAAY,KAAK,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY,KAAK;AAAA,EAC1D,IAAI,CAAC,WAAW;AAAA,IACf,OAAO;AAAA,EACR;AAAA,EACA,OAAO,aAAa,cAAc;AAAA;AAMnC,SAAS,WAAW,CAAC,MAAsB;AAAA,EAC1C,MAAM,QAAQ,KAAK,MAAM,GAAG;AAAA,EAC5B,OAAO,MAAM,MAAM,SAAS;AAAA;AAGtB,SAAS,aAAa,GAAG,QAA4B;AAAA,EAC3D,MAAM,cAAc,UAAU,gBAAgB,UAAU,SAAS,MAAM,IACpE,eACA;AAAA,EAEH,MAAM,mBACL,KAAK,YAAY,KAAK,SAAS,KAAK,EAAE,SAAS,IAC5C,KAAK,WACL,sBAAsB,KAAK,IAAI;AAAA,EAGnC,MAAM,WAAW,YAAY,KAAK,IAAI;AAAA,EAGtC,IAAI,KAAK,aAAa,KAAK,SAAS;AAAA,IACnC,uBACC,OAkDE,OAlDF;AAAA,MAAK,WAAU;AAAA,MAAf,UAkDE;AAAA,wBAhDD,OAaE,OAbF;AAAA,UAAK,WAAU;AAAA,UAAf,UAaE;AAAA,4BAZD,MAKE,QALF;AAAA,cACC,WAAU;AAAA,cACV,OAAO,KAAK;AAAA,cAFb,UAIE;AAAA,aACA;AAAA,4BACF,OAKE,OALF;AAAA,cAAK,WAAU;AAAA,cAAf,UAKE;AAAA,gCAJD,OAEE,QAFF;AAAA,kBAAM,WAAU;AAAA,kBAAhB,UAEE;AAAA,oBAFF;AAAA,oBACG,KAAK;AAAA;AAAA,iBACN;AAAA,gCACF,MAA4D,QAA5D;AAAA,kBAAM,WAAU;AAAA,kBAAhB,UAAyC;AAAA,iBAAmB;AAAA;AAAA,aAC3D;AAAA;AAAA,SACD;AAAA,wBAGF,MAIE,OAJF;AAAA,UAAK,WAAU;AAAA,UAAf,0BACC,OAEE,KAFF;AAAA,YAAG,WAAU;AAAA,YAAb,UAEE;AAAA,cAFF;AAAA,cACY,KAAK;AAAA,cADjB;AAAA;AAAA,WAEE;AAAA,SACD;AAAA,wBAGF,MAwBE,OAxBF;AAAA,UAAK,WAAU;AAAA,UAAf,0BACC,MAsBE,OAtBF;AAAA,YAAK,WAAU;AAAA,YAAf,0BACC,MAoBE,oBApBF;AAAA,cACC,UAAU;AAAA,cACV,OAAO;AAAA,cACP,WAAS;AAAA,cACT,eAAa;AAAA,cACb,WAAW,OAAO;AAAA,gBACjB,WAAW;AAAA,cACZ;AAAA,cACA,aAAa;AAAA,gBACZ,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,YAAY;AAAA,cACb;AAAA,cACA,cAAc;AAAA,gBACb,OAAO;AAAA,kBACN,MAAM;AAAA,gBACP;AAAA,cACD;AAAA,cAjBD,UAmBE,KAAK;AAAA,aACL;AAAA,WACD;AAAA,SACD;AAAA;AAAA,KACD;AAAA,EAEJ;AAAA,EAGA,IAAI,KAAK,UAAU;AAAA,IAClB,MAAM,UAAU,YAAY,KAAK,IAAI;AAAA,IACrC,MAAM,WAAW,UACd,GAAG,qBAAqB,uBAAuB,mBAAmB,KAAK,IAAI,MAC3E;AAAA,IAEH,uBACC,OA+BE,OA/BF;AAAA,MAAK,WAAU;AAAA,MAAf,UA+BE;AAAA,wBA7BD,OAUE,OAVF;AAAA,UAAK,WAAU;AAAA,UAAf,UAUE;AAAA,4BATD,MAKE,QALF;AAAA,cACC,WAAU;AAAA,cACV,OAAO,KAAK;AAAA,cAFb,UAIE;AAAA,aACA;AAAA,4BACF,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf,0BACC,MAAqD,QAArD;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAAqD;AAAA,aACpD;AAAA;AAAA,SACD;AAAA,QAED,2BACA,MAME,OANF;AAAA,UAAK,WAAU;AAAA,UAAf,0BACC,MAAC,OAAD;AAAA,YACC,KAAK;AAAA,YACL,KAAK;AAAA,YACL,WAAU;AAAA,WACX;AAAA,SACC,oBAEF,MAME,OANF;AAAA,UAAK,WAAU;AAAA,UAAf,0BACC,MAIE,OAJF;AAAA,YAAK,WAAU;AAAA,YAAf,0BACC,MAEE,KAFF;AAAA,cAAG,WAAU;AAAA,cAAb;AAAA,aAEE;AAAA,WACD;AAAA,SACD;AAAA;AAAA,KAEF;AAAA,EAEJ;AAAA,EAGA,MAAM,QAAQ,KAAK,KAAK,MAAM;AAAA,CAAI;AAAA,EAClC,MAAM,YAAwB,CAAC;AAAA,EAE/B,IAAI,aAAa;AAAA,EACjB,IAAI,aAAa;AAAA,EAEjB,WAAW,QAAQ,OAAO;AAAA,IACzB,IAAI,KAAK,WAAW,IAAI,GAAG;AAAA,MAE1B,MAAM,QAAQ,KAAK,MAAM,wCAAwC;AAAA,MACjE,IAAI,OAAO;AAAA,QACV,aAAa,SAAS,MAAM,IAAI,EAAE;AAAA,QAClC,aAAa,SAAS,MAAM,IAAI,EAAE;AAAA,MACnC;AAAA,MACA,UAAU,KAAK;AAAA,QACd,eAAe;AAAA,QACf,eAAe;AAAA,QACf,SAAS;AAAA,QACT,aAAa;AAAA,QACb,MAAM;AAAA,MACP,CAAC;AAAA,IACF,EAAO,SACN,KAAK,WAAW,MAAM,KACtB,KAAK,WAAW,OAAO,KACvB,KAAK,WAAW,KAAK,KACrB,KAAK,WAAW,KAAK,GACpB;AAAA,MACD,UAAU,KAAK;AAAA,QACd,eAAe;AAAA,QACf,eAAe;AAAA,QACf,SAAS;AAAA,QACT,aAAa;AAAA,QACb,MAAM;AAAA,MACP,CAAC;AAAA,IACF,EAAO,SAAI,KAAK,WAAW,GAAG,GAAG;AAAA,MAChC,UAAU,KAAK;AAAA,QACd,eAAe;AAAA,QACf,eAAe;AAAA,QACf,SAAS;AAAA,QACT,aAAa,KAAK,MAAM,CAAC;AAAA,QACzB,MAAM;AAAA,MACP,CAAC;AAAA,MACD;AAAA,IACD,EAAO,SAAI,KAAK,WAAW,GAAG,GAAG;AAAA,MAChC,UAAU,KAAK;AAAA,QACd,eAAe;AAAA,QACf,eAAe;AAAA,QACf,SAAS;AAAA,QACT,aAAa,KAAK,MAAM,CAAC;AAAA,QACzB,MAAM;AAAA,MACP,CAAC;AAAA,MACD;AAAA,IACD,EAAO;AAAA,MAEN,UAAU,KAAK;AAAA,QACd,eAAe;AAAA,QACf,eAAe;AAAA,QACf,SAAS;AAAA,QACT,aAAa;AAAA,QACb,MAAM;AAAA,MACP,CAAC;AAAA,MACD;AAAA,MACA;AAAA;AAAA,EAEF;AAAA,EAGA,MAAM,aAAa,CAAC,UAAoB,UAAkB;AAAA,IACzD,IAAI,eAAe;AAAA,IACnB,IAAI,sBACH;AAAA,IACD,IAAI,mBACH;AAAA,IAGD,IAAI,SAAS,SAAS,QAAQ;AAAA,MAC7B,gBAAgB;AAAA,MAChB,uBAAuB;AAAA,MACvB,oBAAoB;AAAA,IACrB,EAAO,SAAI,SAAS,SAAS,OAAO;AAAA,MACnC,gBAAgB;AAAA,MAChB,uBAAuB;AAAA,MACvB,oBAAoB;AAAA,IACrB,EAAO,SAAI,SAAS,SAAS,UAAU;AAAA,MACtC,gBAAgB;AAAA,MAChB,uBAAuB;AAAA,MACvB,oBAAoB;AAAA,IACrB,EAAO,SAAI,SAAS,SAAS,QAAQ;AAAA,MACpC,oBAAoB;AAAA,MACpB,uBAAuB;AAAA,IACxB,EAAO;AAAA,MACN,oBAAoB;AAAA,MACpB,uBAAuB;AAAA;AAAA,IAGxB,MAAM,SACL,SAAS,kBAAkB,OAAO,SAAS,cAAc,SAAS,IAAI;AAAA,IACvE,MAAM,SACL,SAAS,kBAAkB,OAAO,SAAS,cAAc,SAAS,IAAI;AAAA,IAGvE,IAAI,kBAAmC,SAAS,WAAW;AAAA,IAE3D,IACC,SAAS,SAAS,UAClB,SAAS,SAAS,UAClB,qBAAqB,eACrB,SAAS,YAAY,KAAK,GACzB;AAAA,MACD,kCACC,MAoBE,oBApBF;AAAA,QACC,UAAU;AAAA,QACV,OAAO;AAAA,QACP,aAAa;AAAA,UACZ,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,UAAU;AAAA,UACV,YAAY;AAAA,QACb;AAAA,QACA,cAAc;AAAA,UACb,OAAO;AAAA,YACN,YAAY;AAAA,YACZ,YAAY;AAAA,UACb;AAAA,QACD;AAAA,QACA,QAAO;AAAA,QAjBR,UAmBE,SAAS;AAAA,OACT;AAAA,MAIH,IAAI,SAAS,SAAS,OAAO;AAAA,QAC5B,kCACC;AAAA,oBAGE;AAAA,4BAFD,MAAiC,QAAjC;AAAA,cAAM,WAAU;AAAA,cAAhB;AAAA,aAAiC;AAAA,YAChC;AAAA;AAAA,SACA;AAAA,MAEJ,EAAO,SAAI,SAAS,SAAS,UAAU;AAAA,QACtC,kCACC;AAAA,oBAGE;AAAA,4BAFD,MAAiC,QAAjC;AAAA,cAAM,WAAU;AAAA,cAAhB;AAAA,aAAiC;AAAA,YAChC;AAAA;AAAA,SACA;AAAA,MAEJ;AAAA,IACD;AAAA,IAEA,uBACC,OAaE,OAbF;AAAA,MAAiB,WAAW;AAAA,MAA5B,UAaE;AAAA,wBAXD,MASE,OATF;AAAA,UACC,WAAW;AAAA,UACX,eAAY;AAAA,UACZ,OAAO,EAAE,eAAe,OAAO;AAAA,UAHhC,0BAKC,OAGE,OAHF;AAAA,YAAK,WAAU;AAAA,YAAf,UAGE;AAAA,8BAFD,MAA2C,QAA3C;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UAAkC;AAAA,eAAS;AAAA,8BAC3C,MAA2C,QAA3C;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UAAkC;AAAA,eAAS;AAAA;AAAA,WAC1C;AAAA,SACD;AAAA,wBACF,MAAqD,OAArD;AAAA,UAAK,WAAW;AAAA,UAAhB,UAAmC;AAAA,SAAkB;AAAA;AAAA,OAZ5C,KAaR;AAAA;AAAA,EAIJ,uBACC,OAkCE,OAlCF;AAAA,IAAK,WAAU;AAAA,IAAf,UAkCE;AAAA,sBAhCD,OAoBE,OApBF;AAAA,QAAK,WAAU;AAAA,QAAf,UAoBE;AAAA,0BAnBD,MAKE,QALF;AAAA,YACC,WAAU;AAAA,YACV,OAAO,KAAK;AAAA,YAFb,UAIE;AAAA,WACA;AAAA,0BACF,OAYE,OAZF;AAAA,YAAK,WAAU;AAAA,YAAf,UAYE;AAAA,cAXA,KAAK,aAAa,qBAClB,OAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UAEE;AAAA,kBAFF;AAAA,kBACG,KAAK;AAAA;AAAA,eACN;AAAA,cAEF,KAAK,YAAY,qBACjB,OAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UAEE;AAAA,kBAFF;AAAA,kBACG,KAAK;AAAA;AAAA,eACN;AAAA,8BAEH,MAA4D,QAA5D;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UAAyC;AAAA,eAAmB;AAAA;AAAA,WAC3D;AAAA;AAAA,OACD;AAAA,sBAGF,MAQE,OARF;AAAA,QAAK,WAAU;AAAA,QAAf,UACE,KAAK,KAAK,KAAK,MAAM,qBACrB,MAEE,OAFF;AAAA,UAAK,WAAU;AAAA,UAAf;AAAA,SAEE,oBAEF,MAAwD,OAAxD;AAAA,UAAK,WAAU;AAAA,UAAf,UAA4B,UAAU,IAAI,UAAU;AAAA,SAAI;AAAA,OAExD;AAAA;AAAA,GACD;AAAA;;ACnZJ,sBAAS,0CAAwB;;;ACAjC;AAAA,cACC;AAAA;AAAA;AAAA,WAGA;AAAA,iBACA;AAAA;AAAA,eAEA;AAAA,YACA;AAAA;AAWD,qBAAS;AAAA;AAiBT,SAAS,iBAAiB,CAAC,MAAc,WAAW,GAAW;AAAA,EAC9D,MAAM,QAAQ,KAAK,MAAM,GAAG;AAAA,EAG5B,IAAI,MAAM,UAAU,WAAW,GAAG;AAAA,IACjC,OAAO;AAAA,EACR;AAAA,EAGA,MAAM,YAAY,MAAM,MAAM,CAAC,QAAQ;AAAA,EACvC,OAAO,MAAM,UAAU,KAAK,GAAG;AAAA;AAGzB,SAAS,WAAW;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,wBAAwB;AAAA,GACJ;AAAA,EACpB,QAAQ,aAAa,YAAY;AAAA,EACjC,MAAM,aAAa,cAAc;AAAA,EACjC,MAAM,eAAe,gBAAgB;AAAA,EACrC,MAAM,eAAe,gBAAgB;AAAA,EACrC,MAAM,cAAc,eAAe;AAAA,EACnC,MAAM,mBAAmB,qBACxB,CAAC,UAAU,MAAM,gBAClB;AAAA,EACA,OAAO,WAAW,gBAAgB,WAAS,MAAM;AAAA,EAEjD,MAAM,oBAAoB,OAAO,MAA2C;AAAA,IAC3E,EAAE,gBAAgB;AAAA,IAClB,MAAM,UAAU,EAAE,OAAO;AAAA,IACzB,aAAa,OAAO;AAAA,IAEpB,IAAI;AAAA,MACH,IAAI,SAAS;AAAA,QACZ,MAAM,WAAW,YAAY,CAAC,KAAK,IAAI,CAAC;AAAA,MACzC,EAAO;AAAA,QACN,MAAM,aAAa,YAAY,CAAC,KAAK,IAAI,CAAC;AAAA;AAAA,MAE1C,OAAO,OAAO;AAAA,MAEf,aAAa,CAAC,OAAO;AAAA,MACrB,QAAQ,MAAM,iCAAiC,KAAK;AAAA;AAAA;AAAA,EAItD,MAAM,gBAAgB,OAAO,MAAwB;AAAA,IACpD,EAAE,gBAAgB;AAAA,IAClB,iBAAiB;AAAA,MAChB,OAAO;AAAA,MACP,SAAS,WAAW,KAAK;AAAA,MACzB,cAAc;AAAA,MACd,SAAS;AAAA,MACT,WAAW,YAAY;AAAA,QACtB,IAAI;AAAA,UACH,MAAM,aAAa,YAAY,CAAC,KAAK,IAAI,CAAC;AAAA,UACzC,OAAO,OAAO;AAAA,UACf,QAAQ,MAAM,2BAA2B,KAAK;AAAA,UAC9C,MAAM;AAAA;AAAA;AAAA,IAGT,CAAC;AAAA;AAAA,EAGF,MAAM,eAAe,OAAO,MAAwB;AAAA,IACnD,EAAE,gBAAgB;AAAA,IAClB,iBAAiB;AAAA,MAChB,OAAO;AAAA,MACP,SAAS,UAAU,KAAK;AAAA,MACxB,cAAc;AAAA,MACd,SAAS;AAAA,MACT,WAAW,YAAY;AAAA,QACtB,IAAI;AAAA,UACH,MAAM,YAAY,YAAY,CAAC,KAAK,IAAI,CAAC;AAAA,UACxC,OAAO,OAAO;AAAA,UACf,QAAQ,MAAM,0BAA0B,KAAK;AAAA,UAC7C,MAAM;AAAA;AAAA;AAAA,IAGT,CAAC;AAAA;AAAA,EAGF,MAAM,cAAc,MAAM;AAAA,IACzB,SAAS,KAAK,MAAM,MAAM;AAAA;AAAA,EAI3B,MAAM,kBAAkB,MAAM;AAAA,IAC7B,QAAQ,KAAK;AAAA,WACP;AAAA,WACA;AAAA,QACJ,OAAO;AAAA,UACN,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,UACP,YAAY;AAAA,QACb;AAAA,WACI;AAAA,QACJ,OAAO;AAAA,UACN,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,UACP,YAAY;AAAA,QACb;AAAA,WACI;AAAA,QACJ,OAAO;AAAA,UACN,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,UACP,YAAY;AAAA,QACb;AAAA,WACI;AAAA,QACJ,OAAO;AAAA,UACN,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,UACP,YAAY;AAAA,QACb;AAAA,WACI;AAAA,QACJ,OAAO;AAAA,UACN,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,UACP,YAAY;AAAA,QACb;AAAA;AAAA,QAEA,OAAO;AAAA,UACN,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,UACP,YAAY;AAAA,QACb;AAAA;AAAA;AAAA,EAIH,MAAM,UAAS,gBAAgB;AAAA,EAC/B,MAAM,OAAO,QAAO;AAAA,EAGpB,MAAM,cAAc,kBAAkB,KAAK,MAAM,CAAC;AAAA,EAElD,uBACC,OA8EE,UA9EF;AAAA,IACC,MAAK;AAAA,IACL,WAAU;AAAA,IACV,SAAS;AAAA,IAHV,UA8EE;AAAA,sBAzED,MAAC,SAAD;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,QAClC,WAAU;AAAA,QACV,cAAY,GAAG,YAAY,YAAY,WAAW,KAAK;AAAA,OACxD;AAAA,sBAEA,OAsBE,OAtBF;AAAA,QAAK,WAAU;AAAA,QAAf,UAsBE;AAAA,0BArBD,MAAC,MAAD;AAAA,YAAM,WAAW,yBAAyB,QAAO;AAAA,WAAS;AAAA,0BAC1D,MAmBE,OAnBF;AAAA,YAAK,WAAU;AAAA,YAAf,0BACC,OAiBE,OAjBF;AAAA,cAAK,WAAU;AAAA,cAAf,UAiBE;AAAA,gCAhBD,MAKE,QALF;AAAA,kBACC,WAAU;AAAA,kBACV,OAAO,GAAG,KAAK;AAAA,EAAS,KAAK;AAAA,kBAF9B,UAIE;AAAA,iBACA;AAAA,gCACF,OASE,OATF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UASE;AAAA,oCARD,MAEE,QAFF;AAAA,sBAAM,WAAW,yBAAyB,QAAO;AAAA,sBAAjD,UACE,QAAO;AAAA,qBACP;AAAA,oBACD,yCACA,MAEE,OAFF;AAAA,sBAAK,OAAM;AAAA,sBAAX,0BACC,MAAC,eAAD;AAAA,wBAAa,WAAU;AAAA,uBAA8B;AAAA,qBACpD;AAAA;AAAA,iBAEF;AAAA;AAAA,aACD;AAAA,WACD;AAAA;AAAA,OACD;AAAA,MAGD,KAAK,eAAe,aAAa,KAAK,cAAc,4BACpD,OAOE,OAPF;AAAA,QAAK,WAAU;AAAA,QAAf,UAOE;AAAA,UANA,KAAK,eAAe,aAAa,KAAK,aAAa,qBACnD,OAAqD,QAArD;AAAA,YAAM,WAAU;AAAA,YAAhB,UAAqD;AAAA,cAArD;AAAA,cAAmC,KAAK;AAAA;AAAA,WAAa;AAAA,UAErD,KAAK,cAAc,aAAa,KAAK,YAAY,qBACjD,OAAkD,QAAlD;AAAA,YAAM,WAAU;AAAA,YAAhB,UAAkD;AAAA,cAAlD;AAAA,cAAiC,KAAK;AAAA;AAAA,WAAY;AAAA;AAAA,OAElD,IACC;AAAA,sBAGJ,OA0BE,OA1BF;AAAA,QAAK,WAAU;AAAA,QAAf,UA0BE;AAAA,UAzBA,CAAC,UAAU,KAAK,WAAW,+BAC3B,MAQE,UARF;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,WAAU;AAAA,YACV,OAAM;AAAA,YACN,cAAY,UAAU,KAAK;AAAA,YAL5B,0BAOC,MAAC,SAAD;AAAA,cAAQ,WAAU;AAAA,aAA2B;AAAA,WAC5C;AAAA,UAEF,CAAC,UAAU,KAAK,WAAW,eAAe,KAAK,WAAW,2BAC1D,MAQE,UARF;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,WAAU;AAAA,YACV,OAAM;AAAA,YACN,cAAY,WAAW,KAAK;AAAA,YAL7B,0BAOC,MAAC,YAAD;AAAA,cAAW,WAAU;AAAA,aAA2B;AAAA,WAC/C;AAAA,UAEF,UAAU,CAAC,yCACX,MAAC,QAAD;AAAA,YAAO,WAAU;AAAA,WAA8E;AAAA;AAAA,OAE/F;AAAA;AAAA,GACD;AAAA;;;ADzPJ,sBAAS,uBAAW,qBAAQ;AAAA;AAMrB,SAAS,WAAW,GAAG,UAA4B;AAAA,EACzD,QAAQ,iBAAiB,aAAa,YAAY;AAAA,EAClD,MAAM,aAAa,cAAc;AAAA,EACjC,MAAM,eAAe,gBAAgB;AAAA,EACrC,QAAQ,cAAc,iBAAiB,cAAc;AAAA,EACrD,MAAM,WAAW,SAAoC,IAAI,GAAK;AAAA,EAE9D,MAAM,gBAAgB,OAAO,YAAY,UAAU,KAAK;AAAA,EACxD,MAAM,YAAY,OAAO,OAAO,SAAS;AAAA,EACzC,MAAM,cAAc,OAAO,SAAS,SAAS,KAAK,OAAO,UAAU,SAAS;AAAA,EAE5E,MAAM,gBAAgB,CAAC,GAAG,OAAO,UAAU,GAAG,OAAO,SAAS;AAAA,EAC9D,MAAM,mBAAmB,cAAc,SAAS;AAAA,EAEhD,MAAM,YAAY,UAAQ,MAAM;AAAA,IAC/B,OAAO;AAAA,MACN,GAAI,OAAO,cAAc,CAAC;AAAA,MAC1B,GAAG,OAAO;AAAA,MACV,GAAG,OAAO;AAAA,MACV,GAAG,OAAO;AAAA,IACX;AAAA,KACE,CAAC,MAAM,CAAC;AAAA,EAEX,MAAM,gBAAgB,IAAI,IAAI,OAAO,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAAA,EAEhE,MAAM,iBAAiB,MAAM;AAAA,IAC5B,MAAM,eAAe,cAAc,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IACpD,IAAI,aAAa,SAAS,GAAG;AAAA,MAC5B,WAAW,OAAO,YAAY;AAAA,IAC/B;AAAA;AAAA,EAGD,MAAM,oBAAoB,MAAM;AAAA,IAC/B,MAAM,iBAAiB,OAAO,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IACtD,IAAI,eAAe,SAAS,GAAG;AAAA,MAC9B,aAAa,OAAO,cAAc;AAAA,IACnC;AAAA;AAAA,EAGD,MAAM,mBAAmB,OAAO,YAAY,UAAU;AAAA,EAEtD,YAAU,MAAM;AAAA,IACf,IAAI,iBAAiB,SAAS,gBAAgB,GAAG;AAAA,MAChD,MAAM,UAAU,SAAS,QAAQ,IAAI,YAAY;AAAA,MACjD,SAAS,eAAe,EAAE,OAAO,WAAW,UAAU,SAAS,CAAC;AAAA,MAEhE,MAAM,WAAW;AAAA,QAChB,GAAI,OAAO,cAAc,CAAC;AAAA,QAC1B,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,QACV,GAAG,OAAO;AAAA,MACX;AAAA,MACA,MAAM,cAAc,SAAS;AAAA,MAC7B,IAAI,aAAa;AAAA,QAChB,MAAM,WAAW,OAAO,OAAO,SAAS,WAAW;AAAA,QACnD,SAAS,YAAY,MAAM,QAAQ;AAAA,MACpC;AAAA,IACD;AAAA,KACE;AAAA,IACF;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP;AAAA,EACD,CAAC;AAAA,EAED,uBACC,OA8JE,OA9JF;AAAA,IAAK,WAAU;AAAA,IAAf,UA8JE;AAAA,MA7JA,gCACA,OA4BE,OA5BF;AAAA,QAAK,WAAU;AAAA,QAAf,UA4BE;AAAA,0BA3BD,MAKE,OALF;AAAA,YAAK,WAAU;AAAA,YAAf,0BACC,OAGE,QAHF;AAAA,cAAM,WAAU;AAAA,cAAhB,UAGE;AAAA,gCAFD,MAAC,gBAAD;AAAA,kBAAe,WAAU;AAAA,iBAAc;AAAA,gBADxC;AAAA,gBAEa;AAAA,gBAFb;AAAA;AAAA,aAGE;AAAA,WACD;AAAA,0BACF,MAoBE,OApBF;AAAA,YAAK,WAAU;AAAA,YAAf,UACE,OAAO,YAAY,IAAI,CAAC,MAAM,UAAU;AAAA,cACxC,MAAM,cAAc;AAAA,cACpB,MAAM,YACL,iBAAiB,SAAS,iBAAiB;AAAA,cAC5C,uBACC,MAWE,OAXF;AAAA,gBAEC,KAAK,CAAC,OAAO;AAAA,kBACZ,IAAI;AAAA,oBAAI,SAAS,QAAQ,IAAI,aAAa,EAAE;AAAA,kBACvC;AAAA,6BAAS,QAAQ,OAAO,WAAW;AAAA;AAAA,gBAEzC,WACC,YAAY,sCAAsC;AAAA,gBAPpD,0BAUC,MAAC,aAAD;AAAA,kBAAa;AAAA,kBAAY,QAAQ;AAAA,iBAAO;AAAA,iBATnC,KAAK,IAUT;AAAA,aAEH;AAAA,WACA;AAAA;AAAA,OACD;AAAA,MAGF,6BACA,OAiDE,OAjDF;AAAA,QAAK,WAAU;AAAA,QAAf,UAiDE;AAAA,0BAhDD,OAsBE,OAtBF;AAAA,YAAK,WAAU;AAAA,YAAf,UAsBE;AAAA,8BArBD,OAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UAEE;AAAA,kBAFF;AAAA,kBACkB,OAAO,OAAO;AAAA,kBADhC;AAAA;AAAA,eAEE;AAAA,8BACF,OAiBE,OAjBF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UAiBE;AAAA,kBAhBA,OAAO,OAAO,SAAS,KAAK,CAAC,gCAC7B,OAQE,QARF;AAAA,oBACC,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,SAAS;AAAA,oBACT,WAAU;AAAA,oBAJX,UAQE;AAAA,sCAFD,MAAC,YAAD;AAAA,wBAAW,WAAU;AAAA,uBAAe;AAAA,sBANrC;AAAA;AAAA,mBAQE;AAAA,kBAEF,OAAO,OAAO,SAAS,KAAK,gCAC5B,MAEE,QAFF;AAAA,oBAAM,WAAU;AAAA,oBAAhB;AAAA,mBAEE;AAAA;AAAA,eAEF;AAAA;AAAA,WACD;AAAA,0BACF,MAwBE,OAxBF;AAAA,YAAK,WAAU;AAAA,YAAf,UACE,OAAO,OAAO,IAAI,CAAC,MAAM,UAAU;AAAA,cACnC,MAAM,cAAc,mBAAmB;AAAA,cACvC,MAAM,YACL,iBAAiB,SAAS,iBAAiB;AAAA,cAC5C,uBACC,MAeE,OAfF;AAAA,gBAEC,KAAK,CAAC,OAAO;AAAA,kBACZ,IAAI;AAAA,oBAAI,SAAS,QAAQ,IAAI,aAAa,EAAE;AAAA,kBACvC;AAAA,6BAAS,QAAQ,OAAO,WAAW;AAAA;AAAA,gBAEzC,WACC,YAAY,sCAAsC;AAAA,gBAPpD,0BAUC,MAAC,aAAD;AAAA,kBACC;AAAA,kBACA,QAAQ;AAAA,kBACR,uBAAuB,cAAc,IAAI,KAAK,IAAI;AAAA,iBACnD;AAAA,iBAbK,KAAK,IAcT;AAAA,aAEH;AAAA,WACA;AAAA;AAAA,OACD;AAAA,MAGF,+BACA,OA+DE,OA/DF;AAAA,kBA+DE;AAAA,0BA9DD,OAgBE,OAhBF;AAAA,YAAK,WAAU;AAAA,YAAf,UAgBE;AAAA,8BAfD,OAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UAEE;AAAA,kBAFF;AAAA,kBACW,OAAO,SAAS,SAAS,OAAO,UAAU;AAAA,kBADrD;AAAA;AAAA,eAEE;AAAA,cACD,oCACA,OASE,QATF;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,OAAM;AAAA,gBACN,WAAU;AAAA,gBALX,UASE;AAAA,kCAFD,MAAC,aAAD;AAAA,oBAAa,WAAU;AAAA,mBAAe;AAAA,kBAPvC;AAAA;AAAA,eASE;AAAA;AAAA,WAEF;AAAA,0BACF,OA4CE,OA5CF;AAAA,YAAK,WAAU;AAAA,YAAf,UA4CE;AAAA,cA3CA,OAAO,SAAS,IAAI,CAAC,MAAM,UAAU;AAAA,gBACrC,MAAM,cACL,mBAAmB,OAAO,OAAO,SAAS;AAAA,gBAC3C,MAAM,YACL,iBAAiB,SAAS,iBAAiB;AAAA,gBAC5C,uBACC,MAWE,OAXF;AAAA,kBAEC,KAAK,CAAC,OAAO;AAAA,oBACZ,IAAI;AAAA,sBAAI,SAAS,QAAQ,IAAI,aAAa,EAAE;AAAA,oBACvC;AAAA,+BAAS,QAAQ,OAAO,WAAW;AAAA;AAAA,kBAEzC,WACC,YAAY,sCAAsC;AAAA,kBAPpD,0BAUC,MAAC,aAAD;AAAA,oBAAa;AAAA,oBAAY,QAAQ;AAAA,mBAAO;AAAA,mBATnC,KAAK,IAUT;AAAA,eAEH;AAAA,cACA,OAAO,UAAU,IAAI,CAAC,MAAM,UAAU;AAAA,gBACtC,MAAM,cACL,mBACA,OAAO,OAAO,SACd,OAAO,SAAS,SAChB;AAAA,gBACD,MAAM,YACL,iBAAiB,SAAS,iBAAiB;AAAA,gBAC5C,uBACC,MAWE,OAXF;AAAA,kBAEC,KAAK,CAAC,OAAO;AAAA,oBACZ,IAAI;AAAA,sBAAI,SAAS,QAAQ,IAAI,aAAa,EAAE;AAAA,oBACvC;AAAA,+BAAS,QAAQ,OAAO,WAAW;AAAA;AAAA,kBAEzC,WACC,YAAY,sCAAsC;AAAA,kBAPpD,0BAUC,MAAC,aAAD;AAAA,oBAAa;AAAA,oBAAY,QAAQ;AAAA,mBAAO;AAAA,mBATnC,KAAK,IAUT;AAAA,eAEH;AAAA;AAAA,WACA;AAAA;AAAA,OACD;AAAA,MAGF,CAAC,gBAAgB,CAAC,aAAa,CAAC,+BAChC,MAEE,OAFF;AAAA,QAAK,WAAU;AAAA,QAAf;AAAA,OAEE;AAAA;AAAA,GAEF;AAAA;;AEhPJ,iBAAS,uBAAM,4BAAa,yBAAW;AACvC;AAAA;AAAA,kBAEC;AAAA,iBACA;AAAA;AAAA,eAEA;AAAA,WACA;AAAA,UACA;AAAA,eACA;AAAA,cACA;AAAA,YACA;AAAA;AAAA,OAEA;AAAA;AAED,2BAAS;;AAgBT,IAAM,YAAY;AAClB,IAAM,gBAAgB;AACtB,IAAM,YAAY;AAClB,IAAM,YAAY;AAYX,IAAM,aAAa,OAAK,SAAS,WAAU;AAAA,EACjD;AAAA,GACmB;AAAA,EACnB,MAAM,aAAa,YAAY,CAAC,UAAU,MAAM,UAAU;AAAA,EAC1D,MAAM,kBAAkB,YAAY,CAAC,UAAU,MAAM,eAAe;AAAA,EACpE,MAAM,aAAa,mBAClB,CAAC,MAAM,EAAE,OAAO,cAAc,aAC/B;AAAA,EACA,QAAQ,MAAM,QAAQ,WAAW,OAAO,YAAY,aAAa;AAAA,EACjE,QAAQ,MAAM,YAAY,cAAc;AAAA,EACxC,MAAM,cAAc,iBAAe;AAAA,EACnC,MAAM,eAAe,eAAe;AAAA,EACpC,MAAM,eAAe,eAAe;AAAA,EACpC,MAAM,eAAe,WAAW;AAAA,EAChC,MAAM,oBAAoB,aAAa;AAAA,EACvC,MAAM,uBAAuB,gBAAgB;AAAA,EAC7C,OAAO,QAAQ,aAAa,WAAqB,CAAC,CAAC;AAAA,EACnD,OAAO,aAAa,kBAAkB,WAAS,KAAK;AAAA,EACpD,OAAO,eAAe,oBAAoB,WAAS,KAAK;AAAA,EACxD,OAAO,YAAY,iBAAiB,WAAS,QAAQ;AAAA,EACrD,OAAO,WAAW,gBAAgB,WAAS,EAAE;AAAA,EAC7C,OAAO,qBAAqB,0BAA0B,WACrD,IACD;AAAA,EAEA,YAAU,MAAM;AAAA,IACf,IAAI,YAAY;AAAA,MACf,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,QAAQ,EAAE,CAAC;AAAA,IAC9D;AAAA,KACE,CAAC,YAAY,WAAW,CAAC;AAAA,EAE5B,MAAM,gBAAgB,MAAM;AAAA,IAC3B,QAAQ;AAAA;AAAA,EAGT,MAAM,WAAW,cAAY,CAAC,SAAiB,YAAqB;AAAA,IACnE,MAAM,KAAK,GAAG,KAAK,IAAI,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC;AAAA,IACjE,UAAU,CAAC,SAAS,CAAC,GAAG,MAAM,EAAE,IAAI,SAAS,QAAQ,CAAC,CAAC;AAAA,KACrD,CAAC,CAAC;AAAA,EAEL,MAAM,eAAe,cAAY,CAAC,OAAe;AAAA,IAChD,UAAU,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;AAAA,KACjD,CAAC,CAAC;AAAA,EAEL,MAAM,aAAa,YAAY;AAAA,IAC9B,IAAI;AAAA,MACH,MAAM,aAAa,YAAY;AAAA,MAC9B,OAAO,KAAK;AAAA,MACb,SACC,eAAe,QAAQ,IAAI,UAAU,kBACrC,UACD;AAAA;AAAA;AAAA,EAIF,MAAM,aAAa,YAAY;AAAA,IAC9B,IAAI;AAAA,MACH,MAAM,aAAa,YAAY;AAAA,MAC9B,OAAO,KAAK;AAAA,MACb,SACC,eAAe,QAAQ,IAAI,UAAU,kBACrC,UACD;AAAA;AAAA;AAAA,EAIF,MAAM,kBAAkB,YAAY;AAAA,IACnC,IAAI,CAAC,WAAW,KAAK,KAAK,CAAC,UAAU,KAAK;AAAA,MAAG;AAAA,IAC7C,IAAI;AAAA,MACH,MAAM,kBAAkB,YAAY;AAAA,QACnC,MAAM,WAAW,KAAK;AAAA,QACtB,KAAK,UAAU,KAAK;AAAA,MACrB,CAAC;AAAA,MACD,cAAc,QAAQ;AAAA,MACtB,aAAa,EAAE;AAAA,MACf,iBAAiB,KAAK;AAAA,MACrB,OAAO,KAAK;AAAA,MACb,SACC,eAAe,QAAQ,IAAI,UAAU,wBACrC,gBACD;AAAA;AAAA;AAAA,EAIF,MAAM,qBAAqB,OAAO,SAAiB;AAAA,IAClD,IAAI,wBAAwB,MAAM;AAAA,MACjC,uBAAuB,IAAI;AAAA,MAC3B;AAAA,IACD;AAAA,IACA,uBAAuB,IAAI;AAAA,IAC3B,IAAI;AAAA,MACH,MAAM,qBAAqB,YAAY,IAAI;AAAA,MAC1C,OAAO,KAAK;AAAA,MACb,SACC,eAAe,QAAQ,IAAI,UAAU,2BACrC,mBACD;AAAA;AAAA;AAAA,EAIF,MAAM,kBAAkB,cACvB,CAAC,aAAuB;AAAA,IACvB,MAAM,SAAS,SAAS,UACrB,4BAA4B,SAAS;AAAA;AAAA,EAAe,SAAS;AAAA;AAAA,4BAC7D;AAAA;AAAA,EAAyB,SAAS;AAAA;AAAA;AAAA,IACrC,aAAa,SAAS,EAAE;AAAA,IACxB,cAAc,MAAM;AAAA,KAErB,CAAC,aAAa,YAAY,CAC3B;AAAA,EAEA,IAAI,CAAC;AAAA,IAAY,OAAO;AAAA,EAExB,MAAM,WAAW;AAAA,IAChB,GAAI,QAAQ,cAAc,CAAC;AAAA,IAC3B,GAAI,QAAQ,UAAU,CAAC;AAAA,IACvB,GAAI,QAAQ,YAAY,CAAC;AAAA,IACzB,GAAI,QAAQ,aAAa,CAAC;AAAA,EAC3B;AAAA,EAEA,MAAM,eAAe,SAAS;AAAA,EAC9B,MAAM,aAAa,QAAQ,WAAW,OAAO,QAAQ,SAAS;AAAA,EAC9D,MAAM,cAAc,QAAQ,eAAe;AAAA,EAC3C,MAAM,UAAU,UAAU,eAAe,OAAO,QAAQ,KAAK,CAAC;AAAA,EAC9D,MAAM,WAAW,CAAC,CAAC;AAAA,EACnB,MAAM,kBAAkB,UAAU,OAAO,SAAS;AAAA,EAClD,MAAM,WAAW,aAAa,aAAa,aAAa;AAAA,EACxD,MAAM,eACL,iBAAiB,SACjB,MAAM,QAAQ,YAAY,EAAE,SAAS,sBAAsB;AAAA,EAE5D,MAAM,YAAY,CAAC,aAChB,yBACA,CAAC,cACA,6BACA,UACC,QAAQ,QAAQ,8BAChB;AAAA,EAEL,uBACC,OAkUE,OAlUF;AAAA,IACC,WAAU;AAAA,IACV,OAAO,EAAE,OAAO,WAAW;AAAA,IAF5B,UAkUE;AAAA,sBA9TD,MAAC,cAAD;AAAA,QACC,UAAU;AAAA,QACV,MAAK;AAAA,QACL,UAAU;AAAA,QACV,UAAU;AAAA,QACV,cAAc;AAAA,OACf;AAAA,sBACA,OAsTE,OAtTF;AAAA,QAAK,WAAU;AAAA,QAAf,UAsTE;AAAA,0BArTD,OAoBE,OApBF;AAAA,YAAK,WAAU;AAAA,YAAf,UAoBE;AAAA,8BAnBD,OAUE,OAVF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UAUE;AAAA,kCATD,MAAC,YAAD;AAAA,oBAAW,WAAU;AAAA,mBAAgC;AAAA,kCACrD,OAOE,QAPF;AAAA,oBAAM,WAAU;AAAA,oBAAhB,UAOE;AAAA,sBAPF;AAAA,sBAEE,eAAe,qBACf,OAEE,QAFF;AAAA,wBAAM,WAAU;AAAA,wBAAhB,UAEE;AAAA,0BAFF;AAAA,0BACG;AAAA,0BADH;AAAA;AAAA,uBAEE;AAAA;AAAA,mBAEF;AAAA;AAAA,eACD;AAAA,8BACF,MAOE,QAPF;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,OAAM;AAAA,gBAJP,0BAMC,MAAC,gBAAD;AAAA,kBAAc,WAAU;AAAA,iBAAU;AAAA,eACjC;AAAA;AAAA,WACD;AAAA,0BAEF,MAqDE,OArDF;AAAA,YAAK,WAAU;AAAA,YAAf,UACE,4BACA,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAEE,IACC,+BACH,OA0BE,OA1BF;AAAA,cAAK,WAAU;AAAA,cAAf,UA0BE;AAAA,gCAzBD,MAAC,YAAD;AAAA,kBAAY,WAAU;AAAA,iBAAkC;AAAA,gCACxD,MAEE,OAFF;AAAA,kBAAK,WAAU;AAAA,kBAAf;AAAA,iBAEE;AAAA,gCACF,OAaE,QAbF;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS,MAAM,aAAa,OAAO;AAAA,kBACnC,UAAU,aAAa;AAAA,kBACvB,WAAU;AAAA,kBALX,UAaE;AAAA,oCAND,MAAC,YAAD;AAAA,sBACC,WAAW,eAAe,aAAa,YAAY,iBAAiB;AAAA,qBACrE;AAAA,oBACC,aAAa,YACX,oBACA;AAAA;AAAA,iBACF;AAAA,gBACD,aAAa,2BACb,MAIE,QAJF;AAAA,kBAAM,WAAU;AAAA,kBAAhB,UACE,aAAa,iBAAiB,QAC5B,aAAa,MAAM,UACnB;AAAA,iBACF;AAAA;AAAA,aAEF,IACC,wBACH,MAWE,OAXF;AAAA,cAAK,WAAU;AAAA,cAAf,0BACC,OASE,OATF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UASE;AAAA,kCARD,MAIE,QAJF;AAAA,oBAAM,WAAU;AAAA,oBAAhB,UACE,iBAAiB,QACf,MAAM,UACN;AAAA,mBACF;AAAA,kCACF,MAEE,QAFF;AAAA,oBAAQ,SAAQ;AAAA,oBAAY,MAAK;AAAA,oBAAK,SAAS;AAAA,oBAA/C;AAAA,mBAEE;AAAA;AAAA,eACD;AAAA,aACD,IACC,CAAC,UAAU,iBAAiB,oBAC/B,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAEE,oBAEF,MAAC,aAAD;AAAA,cAAa;AAAA,aAAgB;AAAA,WAE7B;AAAA,UAED,UAAU,CAAC,gBAAgB,CAAC,yBAC5B,OA4HE,OA5HF;AAAA,YAAK,WAAU;AAAA,YAAf,UA4HE;AAAA,8BA3HD,OAiBE,UAjBF;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM,eAAe,CAAC,WAAW;AAAA,gBAC1C,WAAU;AAAA,gBAHX,UAiBE;AAAA,kBAZA,8BACA,MAAC,cAAD;AAAA,oBAAa,WAAU;AAAA,mBAAU,oBAEjC,MAAC,gBAAD;AAAA,oBAAc,WAAU;AAAA,mBAAU;AAAA,kCAEnC,MAAC,QAAD;AAAA,oBAAO,WAAU;AAAA,mBAAU;AAAA,kCAC3B,MAAe,QAAf;AAAA;AAAA,mBAAe;AAAA,kBACd,OAAO,2BACP,MAEE,QAFF;AAAA,oBAAM,WAAU;AAAA,oBAAhB,UACE,OAAO,QAAQ;AAAA,mBACf;AAAA;AAAA,eAEF;AAAA,cACD,+BACA,OAsGE,OAtGF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UAsGE;AAAA,kBArGA,WAAW,QAAQ,SAAS,IAC5B,QACE,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,EAChC,IAAI,CAAC,2BACL,OAoCE,OApCF;AAAA,oBAEC,WAAU;AAAA,oBAFX,UAoCE;AAAA,sCAhCD,MAEE,QAFF;AAAA,wBAAM,WAAU;AAAA,wBAAhB,UACE,OAAO;AAAA,uBACP;AAAA,sCACF,MAEE,QAFF;AAAA,wBAAM,WAAU;AAAA,wBAAhB,UACE,OAAO;AAAA,uBACP;AAAA,sCACF,MAyBE,UAzBF;AAAA,wBACC,MAAK;AAAA,wBACL,SAAS,MAAM;AAAA,0BACd,IAAI,wBAAwB,OAAO,MAAM;AAAA,4BACxC,mBAAmB,OAAO,IAAI;AAAA,0BAC/B,EAAO;AAAA,4BACN,uBAAuB,OAAO,IAAI;AAAA;AAAA;AAAA,wBAGpC,QAAQ,MAAM,uBAAuB,IAAI;AAAA,wBACzC,UAAU,qBAAqB;AAAA,wBAC/B,WAAW,GAAG,wBAAwB,OAAO,OAAO,6BAA6B;AAAA,wBACjF,OACC,wBAAwB,OAAO,OAC5B,mCAAmC,OAAO,SAC1C,UAAU,OAAO;AAAA,wBAftB,UAkBE,wBAAwB,OAAO,uBAC/B,MAEE,QAFF;AAAA,0BAAM,WAAU;AAAA,0BAAhB;AAAA,yBAEE,oBAEF,MAAC,SAAD;AAAA,0BAAQ,WAAU;AAAA,yBAAU;AAAA,uBAE5B;AAAA;AAAA,qBAlCG,OAAO,IAmCX,CACF,oBAEF,MAEE,OAFF;AAAA,oBAAK,WAAU;AAAA,oBAAf;AAAA,mBAEE;AAAA,kBAEF,gCACA,OA0CE,OA1CF;AAAA,oBAAK,WAAU;AAAA,oBAAf,UA0CE;AAAA,sCAzCD,MAAC,SAAD;AAAA,wBACC,MAAK;AAAA,wBACL,OAAO;AAAA,wBACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,wBAC7C,aAAY;AAAA,wBACZ,WAAU;AAAA,uBACX;AAAA,sCACA,MAAC,SAAD;AAAA,wBACC,MAAK;AAAA,wBACL,OAAO;AAAA,wBACP,UAAU,CAAC,MAAM,aAAa,EAAE,OAAO,KAAK;AAAA,wBAC5C,aAAY;AAAA,wBACZ,WAAU;AAAA,wBACV,WAAW,CAAC,MAAM;AAAA,0BACjB,IAAI,EAAE,QAAQ;AAAA,4BAAS,gBAAgB;AAAA,0BACvC,IAAI,EAAE,QAAQ;AAAA,4BAAU,iBAAiB,KAAK;AAAA;AAAA,uBAEhD;AAAA,sCACA,OAsBE,OAtBF;AAAA,wBAAK,WAAU;AAAA,wBAAf,UAsBE;AAAA,0CArBD,MAYE,QAZF;AAAA,4BACC,SAAQ;AAAA,4BACR,MAAK;AAAA,4BACL,SAAS;AAAA,4BACT,UACC,kBAAkB,aAClB,CAAC,WAAW,KAAK,KACjB,CAAC,UAAU,KAAK;AAAA,4BAEjB,WAAU;AAAA,4BATX,UAWE,kBAAkB,YAAY,cAAc;AAAA,2BAC5C;AAAA,0CACF,MAOE,QAPF;AAAA,4BACC,SAAQ;AAAA,4BACR,MAAK;AAAA,4BACL,SAAS,MAAM,iBAAiB,KAAK;AAAA,4BACrC,WAAU;AAAA,4BAJX;AAAA,2BAOE;AAAA;AAAA,uBACD;AAAA;AAAA,mBACD,oBAEF,OAOE,UAPF;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM,iBAAiB,IAAI;AAAA,oBACpC,WAAU;AAAA,oBAHX,UAOE;AAAA,sCAFD,MAAC,OAAD;AAAA,wBAAM,WAAU;AAAA,uBAAU;AAAA,sCAC1B,MAAkB,QAAlB;AAAA;AAAA,uBAAkB;AAAA;AAAA,mBACjB;AAAA;AAAA,eAEF;AAAA;AAAA,WAEF;AAAA,UAGF,OAAO,SAAS,qBAChB,MAgCE,OAhCF;AAAA,YAAK,WAAU;AAAA,YAAf,UACE,OAAO,IAAI,CAAC,6BACZ,OA4BE,OA5BF;AAAA,cAEC,WAAU;AAAA,cAFX,UA4BE;AAAA,gCAxBD,MAEE,QAFF;AAAA,kBAAM,WAAU;AAAA,kBAAhB,UACE,SAAS;AAAA,iBACT;AAAA,gCACF,OAoBE,OApBF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAoBE;AAAA,oBAnBA,+BACA,OAQE,UARF;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,MAAM,gBAAgB,QAAQ;AAAA,sBACvC,WAAU;AAAA,sBACV,OAAM;AAAA,sBAJP,UAQE;AAAA,wCAFD,MAAC,WAAD;AAAA,0BAAU,WAAU;AAAA,yBAAU;AAAA,wBAN/B;AAAA;AAAA,qBAQE;AAAA,oCAEH,MAOE,UAPF;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,MAAM,aAAa,SAAS,EAAE;AAAA,sBACvC,WAAU;AAAA,sBACV,OAAM;AAAA,sBAJP,0BAMC,MAAC,KAAD;AAAA,wBAAG,WAAU;AAAA,uBAAU;AAAA,qBACtB;AAAA;AAAA,iBACD;AAAA;AAAA,eA1BG,SAAS,EA2Bb,CACF;AAAA,WACA;AAAA,0BAGH,OAyCE,OAzCF;AAAA,YAAK,WAAU;AAAA,YAAf,UAyCE;AAAA,8BAxCD,OAuBE,QAvBF;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,UAAU,YAAY,CAAC,cAAc,CAAC;AAAA,gBACtC,OACC,CAAC,aACE,yBACA,CAAC,cACA,6BACA,kBACC,QAAQ,QAAQ,iCAChB;AAAA,gBAEN,WAAU;AAAA,gBAdX,UAuBE;AAAA,kCAPD,MAAC,UAAD;AAAA,oBACC,WAAW,eAAe,aAAa,YAAY,kBAAkB;AAAA,mBACtE;AAAA,kBAlBD;AAAA,kBAoBE,mCACA,OAAoD,QAApD;AAAA,oBAAM,WAAU;AAAA,oBAAhB,UAAoD;AAAA,sBAApD;AAAA,sBAAmC,QAAQ;AAAA;AAAA,mBAAS;AAAA;AAAA,eAEpD;AAAA,8BACF,OAeE,QAfF;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,UAAU,CAAC,WAAW;AAAA,gBACtB,OAAO;AAAA,gBACP,WAAU;AAAA,gBANX,UAeE;AAAA,kCAPD,MAAC,QAAD;AAAA,oBACC,WAAW,eAAe,aAAa,YAAY,kBAAkB;AAAA,mBACtE;AAAA,kBACC,CAAC,eAAe,aAAa,YAAY;AAAA,kBACzC,eAAe,UAAU,OAAO,QAAQ,qBACxC,OAAiD,QAAjD;AAAA,oBAAM,WAAU;AAAA,oBAAhB,UAAiD;AAAA,sBAAjD;AAAA,sBAAkC,OAAO;AAAA;AAAA,mBAAQ;AAAA;AAAA,eAEjD;AAAA;AAAA,WACD;AAAA,0BAEF,OAwBE,OAxBF;AAAA,YAAK,WAAU;AAAA,YAAf,UAwBE;AAAA,8BAvBD,OAUE,OAVF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UAUE;AAAA,kCATD,MAAC,YAAD;AAAA,oBAAW,WAAU;AAAA,mBAAwB;AAAA,kBAC5C,QAAQ,0BACR,MAA4C,QAA5C;AAAA,oBAAM,WAAU;AAAA,oBAAhB,UAA4B,OAAO;AAAA,mBAAS;AAAA,kBAE5C,UAAU,CAAC,eAAe,8BAC1B,MAEE,QAFF;AAAA,oBAAM,WAAU;AAAA,oBAAhB;AAAA,mBAEE;AAAA;AAAA,eAEF;AAAA,8BACF,MAWE,QAXF;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,OAAM;AAAA,gBACN,WAAU;AAAA,gBACV,UAAU;AAAA,gBANX,0BAQC,MAAC,YAAD;AAAA,kBACC,WAAW,WAAW,YAAY,iBAAiB;AAAA,iBACpD;AAAA,eACC;AAAA;AAAA,WACD;AAAA;AAAA,OACD;AAAA;AAAA,GACD;AAAA,CAEH;;AC9fD,iBAAS;AACT,sBAAS;;AAIF,IAAM,mBAAmB,OAAK,SAAS,iBAAgB,GAAG;AAAA,EAEhE,MAAM,aAAa,YAAY,CAAC,UAAU,MAAM,UAAU;AAAA,EAC1D,MAAM,gBAAgB,YAAY,CAAC,UAAU,MAAM,aAAa;AAAA,EAChE,QAAQ,MAAM,WAAW,aAAa;AAAA,EAEtC,MAAM,gBACJ,QAAQ,QAAQ,UAAU,MAC1B,QAAQ,UAAU,UAAU,MAC5B,QAAQ,WAAW,UAAU;AAAA,EAE/B,uBACC,OAgBE,UAhBF;AAAA,IACC,MAAK;AAAA,IACL,SAAS;AAAA,IACT,WAAW,yGACV,aACG,4BACA;AAAA,IAEJ,OAAM;AAAA,IARP,UAgBE;AAAA,sBAND,MAAC,aAAD;AAAA,QAAW,WAAU;AAAA,OAAwC;AAAA,MAC5D,eAAe,qBACf,MAEE,QAFF;AAAA,QAAM,WAAU;AAAA,QAAhB,UACE,eAAe,IAAI,OAAO;AAAA,OAC1B;AAAA;AAAA,GAEF;AAAA,CAEH;;ACnCD,sBAAS,uBAAW,kBAAQ,oBAAM;AAClC,cAAS,6BAAc;;;ACDvB,mBAAS;AACT,oBAAS;AAQF,IAAM,kBAAkB,SAAqB,EACnD,SACC,CAAC,SAAS;AAAA,EACT,aAAa;AAAA,EACb,gBAAgB,MACf,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,MAAM,YAAY,EAAE;AAAA,EACrD,cAAc,CAAC,cAAc,IAAI,EAAE,aAAa,UAAU,CAAC;AAC5D,IACA;AAAA,EACC,MAAM;AACP,CACD,CACD;;;ACrBA,qBAAS;AAGF,SAAS,WAAW,CAAC,SAAiB,UAAU,MAAM;AAAA,EAC5D,OAAO,UAAS;AAAA,IACf,UAAU,CAAC,SAAS,QAAQ,OAAO;AAAA,IACnC,SAAS,MAAM,UAAU,YAAY,OAAO;AAAA,IAC5C;AAAA,IACA,WAAW;AAAA,IACX,OAAO;AAAA,EACR,CAAC;AAAA;AAGK,SAAS,cAAc,CAAC,UAAyB;AAAA,EACvD,OAAO,UAAS;AAAA,IACf,UAAU,CAAC,SAAS,QAAQ,QAAQ;AAAA,IACpC,SAAS,MAAO,WAAW,UAAU,gBAAgB,QAAQ,IAAI;AAAA,IACjE,SAAS,CAAC,CAAC;AAAA,IACX,WAAW;AAAA,IACX,OAAO;AAAA,EACR,CAAC;AAAA;AAGK,SAAS,kBAAkB,CACjC,MACA,SAAS,OACT,UAAU,OACT;AAAA,EACD,OAAO,UAAS;AAAA,IACf,UAAU,CAAC,OAAO,QAAQ,YAAY,MAAM,MAAM;AAAA,IAClD,SAAS,MAAO,OAAO,UAAU,mBAAmB,MAAM,MAAM,IAAI;AAAA,IACpE,SAAS,WAAW,CAAC,CAAC;AAAA,IACtB,OAAO;AAAA,IACP,iBAAiB;AAAA,EAClB,CAAC;AAAA;;;;AFzBK,IAAM,eAAe,OAAK,SAAS,aAAY,GAAG;AAAA,EAExD,MAAM,aAAa,YAAY,CAAC,UAAU,MAAM,UAAU;AAAA,EAC1D,MAAM,eAAe,YAAY,CAAC,UAAU,MAAM,YAAY;AAAA,EAC9D,MAAM,qBAAqB,YAAY,CAAC,UAAU,MAAM,kBAAkB;AAAA,EAC1E,MAAM,YAAY,YAAY,CAAC,UAAU,MAAM,SAAS;AAAA,EAExD,MAAM,eAAe,gBAAgB,CAAC,UAAU,MAAM,YAAY;AAAA,EAClE,MAAM,kBAAkB,SAAuB,IAAI;AAAA,EACnD,MAAM,kBAAkB,SAAO,KAAK;AAAA,EAEpC,QAAQ,MAAM,MAAM,cAAc,WACjC,cACA,kBACD;AAAA,EAEA,OAAO,cAAc,mBAAmB,WAAS,KAAK;AAAA,EACtD,QAAQ,MAAM,cAAc,WAAW,oBAAoB,mBAC1D,cACA,oBACA,YACD;AAAA,EAEA,MAAM,aAAa,gBAAgB,eAAe,eAAe;AAAA,EACjE,MAAM,gBAAgB,eAAe,kBAAkB;AAAA,EAEvD,YAAU,MAAM;AAAA,IACf,IAAI,CAAC;AAAA,MAAY,gBAAgB,KAAK;AAAA,IACtC,IAAI,cAAc,CAAC,gBAAgB,SAAS;AAAA,MAE3C,QAAQ,gBAAgB,gBAAgB,SAAS;AAAA,MACjD,gBAAgB,UAAU;AAAA,MAC1B,aAAa,IAAI;AAAA,IAClB,EAAO,SAAI,CAAC,cAAc,gBAAgB,SAAS;AAAA,MAElD,IAAI,gBAAgB,YAAY,MAAM;AAAA,QACrC,aAAa,gBAAgB,OAAO;AAAA,QACpC,gBAAgB,UAAU;AAAA,MAC3B;AAAA,IACD;AAAA,IACA,gBAAgB,UAAU;AAAA,KACxB,CAAC,YAAY,YAAY,CAAC;AAAA,EAG7B,YAAU,MAAM;AAAA,IACf,MAAM,eAAe,CAAC,MAAqB;AAAA,MAC1C,MAAM,SAAS,EAAE;AAAA,MACjB,MAAM,YACL,OAAO,YAAY,WACnB,OAAO,YAAY,cACnB,OAAO;AAAA,MACR,KAAK,EAAE,QAAQ,YAAa,EAAE,QAAQ,OAAO,CAAC,cAAe,YAAY;AAAA,QACxE,UAAU;AAAA,MACX;AAAA;AAAA,IAGD,SAAS,iBAAiB,WAAW,YAAY;AAAA,IACjD,OAAO,MAAM,SAAS,oBAAoB,WAAW,YAAY;AAAA,KAC/D,CAAC,YAAY,SAAS,CAAC;AAAA,EAE1B,IAAI,CAAC,cAAc,CAAC;AAAA,IAAc,OAAO;AAAA,EAEzC,uBACC,OAqDE,OArDF;AAAA,IAAK,WAAU;AAAA,IAAf,UAqDE;AAAA,sBAnDD,OAoCE,OApCF;AAAA,QAAK,WAAU;AAAA,QAAf,UAoCE;AAAA,0BAnCD,MAOE,QAPF;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS;AAAA,YACT,OAAM;AAAA,YAJP,0BAMC,MAAC,KAAD;AAAA,cAAG,WAAU;AAAA,aAAU;AAAA,WACtB;AAAA,0BACF,OAYE,OAZF;AAAA,YAAK,WAAU;AAAA,YAAf,UAYE;AAAA,8BAXD,MAKE,QALF;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO,GAAG;AAAA,EAAiB,YAAY,WAAW;AAAA,gBAFnD,UAIE;AAAA,eACA;AAAA,cACD,sCACA,MAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAEE;AAAA;AAAA,WAEF;AAAA,0BACF,OAaE,QAbF;AAAA,YACC,SAAS,eAAe,cAAc;AAAA,YACtC,MAAK;AAAA,YACL,SAAS,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAAA,YACxC,OAAO,eAAe,mBAAmB;AAAA,YACzC,WAAU;AAAA,YALX,UAaE;AAAA,cANA,+BACA,MAAC,YAAD;AAAA,gBAAW,WAAU;AAAA,eAAc,oBAEnC,MAAC,WAAD;AAAA,gBAAW,WAAU;AAAA,eAAc;AAAA,cAEnC,eAAe,SAAS;AAAA;AAAA,WACxB;AAAA;AAAA,OACD;AAAA,sBAEF,MAYE,OAZF;AAAA,QAAK,WAAU;AAAA,QAAf,UACE,gCACA,MAEE,OAFF;AAAA,UAAK,WAAU;AAAA,UAAf;AAAA,SAEE,IACC,6BACH,MAAC,eAAD;AAAA,UAAe,MAAM;AAAA,SAAY,oBAEjC,MAEE,OAFF;AAAA,UAAK,WAAU;AAAA,UAAf;AAAA,SAEE;AAAA,OAEF;AAAA;AAAA,GACD;AAAA,CAEH;;AG/HD,qBAAS,qBAAU,qBAAO,4BAAW;AACrC,sBAAS,wBAAW,sBAAU;;AAOvB,SAAS,cAAc,GAAG;AAAA,EAChC,QAAQ,mBAAmB,qBAAqB,YAAY;AAAA,EAC5D,MAAM,kBAAkB,YAAY,CAAC,UAAU,MAAM,eAAe;AAAA,EACpE,MAAM,gBAAgB,iBAAiB;AAAA,EACvC,MAAM,kBAAkB,yBAAyB,eAAe;AAAA,EAChE,OAAO,SAAS,cAAc,WAAS,EAAE;AAAA,EACzC,MAAM,YAAY,OAAM;AAAA,EAExB,MAAM,eAAe,cAAY,YAAY;AAAA,IAC5C,IAAI,CAAC,QAAQ,KAAK;AAAA,MAAG;AAAA,IAErB,IAAI;AAAA,MACH,MAAM,cAAc,YAAY,OAAO;AAAA,MACvC,WAAW,EAAE;AAAA,MACb,iBAAiB;AAAA,MAChB,OAAO,OAAO;AAAA,MACf,QAAQ,MAAM,qBAAqB,KAAK;AAAA;AAAA,KAEvC,CAAC,SAAS,eAAe,gBAAgB,CAAC;AAAA,EAE7C,MAAM,cAAc,MAAM;AAAA,IACzB,WAAW,EAAE;AAAA,IACb,iBAAiB;AAAA;AAAA,EAGlB,MAAM,wBAAwB,cAAY,YAAY;AAAA,IACrD,IAAI;AAAA,MACH,MAAM,SAAS,MAAM,gBAAgB,YAAY;AAAA,MACjD,WAAW,OAAO,OAAO;AAAA,MACxB,OAAO,OAAO;AAAA,MACf,QAAQ,MAAM,sCAAsC,KAAK;AAAA;AAAA,KAExD,CAAC,eAAe,CAAC;AAAA,EAEpB,YAAU,MAAM;AAAA,IACf,IAAI,CAAC;AAAA,MAAmB;AAAA,IAExB,MAAM,gBAAgB,CAAC,MAAqB;AAAA,MAC3C,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,SAAS;AAAA,QAClD,EAAE,eAAe;AAAA,QACjB,EAAE,gBAAgB;AAAA,QAClB,IAAI,QAAQ,KAAK,KAAK,CAAC,cAAc,WAAW;AAAA,UAC/C,aAAa;AAAA,QACd;AAAA,MACD;AAAA,MACA,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,KAAK;AAAA,QAC9C,EAAE,eAAe;AAAA,QACjB,EAAE,gBAAgB;AAAA,QAClB,sBAAsB;AAAA,MACvB;AAAA;AAAA,IAGD,SAAS,iBAAiB,WAAW,aAAa;AAAA,IAClD,OAAO,MAAM,SAAS,oBAAoB,WAAW,aAAa;AAAA,KAChE;AAAA,IACF;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,EACD,CAAC;AAAA,EAED,uBACC,MAoFE,OApFF;AAAA,IACC,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,uBACC,OAGE,OAHF;AAAA,MAAK,WAAU;AAAA,MAAf,UAGE;AAAA,wBAFD,MAAC,YAAD;AAAA,UAAW,WAAU;AAAA,SAAU;AAAA,wBAC/B,MAAsB,QAAtB;AAAA;AAAA,SAAsB;AAAA;AAAA,KACrB;AAAA,IAEH,UAAS;AAAA,IATV,0BAWC,OAwEE,OAxEF;AAAA,MAAK,WAAU;AAAA,MAAf,UAwEE;AAAA,wBAvED,OAiBE,OAjBF;AAAA,UAAK,WAAU;AAAA,UAAf,UAiBE;AAAA,4BAhBD,MAKE,SALF;AAAA,cACC,SAAS;AAAA,cACT,WAAU;AAAA,cAFX;AAAA,aAKE;AAAA,4BACF,MAAC,UAAD;AAAA,cACC,IAAI;AAAA,cACJ,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,WAAW,EAAE,OAAO,KAAK;AAAA,cAC1C,aAAY;AAAA,cACZ,MAAM;AAAA,cACN,WAAU;AAAA,cACV,WAAS;AAAA,cACT,UAAU,gBAAgB;AAAA,aAC3B;AAAA;AAAA,SACC;AAAA,wBAEF,MAkBE,QAlBF;AAAA,UACC,SAAQ;AAAA,UACR,SAAS;AAAA,UACT,WAAU;AAAA,UACV,UAAU,gBAAgB;AAAA,UAJ3B,UAME,gBAAgB,4BAChB;AAAA,sBAGE;AAAA,8BAFD,MAAC,UAAD;AAAA,gBAAS,WAAU;AAAA,eAA4B;AAAA,cADhD;AAAA;AAAA,WAGE,oBAEF;AAAA,sBAIE;AAAA,8BAHD,MAAC,WAAD;AAAA,gBAAU,WAAU;AAAA,eAAe;AAAA,cADpC;AAAA,cAEyB;AAAA,8BACxB,MAAkD,QAAlD;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAAkD;AAAA;AAAA,WACjD;AAAA,SAEF;AAAA,QAED,gBAAgB,2BAChB,MAGE,OAHF;AAAA,UAAK,WAAU;AAAA,UAAf,UACE,gBAAgB,OAAO,WACvB;AAAA,SACA;AAAA,wBAGH,OAkBE,OAlBF;AAAA,UAAK,WAAU;AAAA,UAAf,UAkBE;AAAA,4BAjBD,OAEE,QAFF;AAAA,cAAQ,SAAQ;AAAA,cAAQ,SAAS;AAAA,cAAjC,UAEE;AAAA,gBAFF;AAAA,gCACQ,MAAoD,QAApD;AAAA,kBAAM,WAAU;AAAA,kBAAhB;AAAA,iBAAoD;AAAA;AAAA,aAC1D;AAAA,4BACF,MAaE,QAbF;AAAA,cACC,SAAQ;AAAA,cACR,SAAS;AAAA,cACT,UAAU,CAAC,QAAQ,KAAK,KAAK,cAAc;AAAA,cAH5C,UAKE,cAAc,4BACd,MAAqB,QAArB;AAAA;AAAA,eAAqB,oBAErB;AAAA,0BAGE;AAAA,kCAFD,MAAC,YAAD;AAAA,oBAAW,WAAU;AAAA,mBAAe;AAAA,kBADrC;AAAA,kCAEQ,MAAkD,QAAlD;AAAA,oBAAM,WAAU;AAAA,oBAAhB;AAAA,mBAAkD;AAAA;AAAA,eACxD;AAAA,aAEF;AAAA;AAAA,SACD;AAAA,QAED,cAAc,2BACd,MAEE,OAFF;AAAA,UAAK,WAAU;AAAA,UAAf,UACE,cAAc,OAAO,WAAW;AAAA,SAChC;AAAA;AAAA,KAEF;AAAA,GACD;AAAA;;AC3JJ,iBAAS,uBAAM,yBAAa,uBAAQ;AACpC;AAAA,cACC;AAAA,eACA;AAAA,eACA;AAAA,iBACA;AAAA;;;ACLD,mBAAS;AA8BT,IAAM,iBAAiB;AACvB,IAAM,aAAa;AAEZ,IAAM,mBAAmB,SAAsB,CAAC,SAAS;AAAA,EAC/D,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,MAET,UAAU,GAAG;AAAA,IAChB,OAAO,KAAK;AAAA;AAAA,MAET,kBAAkB,GAAG;AAAA,IACxB,OAAO,KAAK;AAAA;AAAA,EAGb,WAAW,MAAM,IAAI,EAAE,QAAQ,KAAK,CAAC;AAAA,EACrC,YAAY,MAAM,IAAI,EAAE,QAAQ,OAAO,aAAa,MAAM,CAAC;AAAA,EAC3D,aAAa,MACZ,IAAI,CAAC,OAAO;AAAA,IACX,QAAQ,CAAC,EAAE;AAAA,IACX,aAAa,CAAC,EAAE,SAAS,EAAE,cAAc;AAAA,EAC1C,EAAE;AAAA,EACH,gBAAgB,CAAC,WAChB,IAAI,EAAE,aAAa,KAAK,IAAI,YAAY,MAAM,EAAE,CAAC;AAAA,EAClD,WAAW,CAAC,OAAO,IAAI,EAAE,aAAa,IAAI,QAAQ,KAAK,CAAC;AAAA,EACxD,gBAAgB,MAAM,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,YAAY,EAAE;AAAA,EAElE,eAAe,MAAM,IAAI,EAAE,QAAQ,KAAK,CAAC;AAAA,EACzC,iBAAiB,MAChB,IAAI,EAAE,QAAQ,OAAO,aAAa,MAAM,aAAa,MAAM,CAAC;AAAA,EAC7D,eAAe,MACd,IAAI,CAAC,OAAO;AAAA,IACX,QAAQ,CAAC,EAAE;AAAA,IACX,aAAa,CAAC,EAAE,SAAS,EAAE,cAAc;AAAA,EAC1C,EAAE;AAAA,EACH,gBAAgB,CAAC,OAAO,IAAI,EAAE,aAAa,IAAI,QAAQ,KAAK,CAAC;AAC9D,EAAE;;;ACnEF,qBAAS,0BAAU,gCAAa;AAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AA0CO,SAAS,YAAY,GAAG;AAAA,EAC9B,OAAO,UAA4B;AAAA,IAClC,UAAU,CAAC,WAAW;AAAA,IACtB,SAAS,YAAY;AAAA,MACpB,MAAM,WAAW,MAAM,aAAa;AAAA,MACpC,IAAI,SAAS,OAAO;AAAA,QACnB,MAAM,IAAI,MAAM,2BAA2B;AAAA,MAC5C;AAAA,MACA,OAAO,SAAS;AAAA;AAAA,IAEjB,iBAAiB;AAAA,EAClB,CAAC;AAAA;AAGK,SAAS,iBAAiB,GAAG;AAAA,EACnC,MAAM,cAAc,iBAAe;AAAA,EAEnC,OAAO,aAAiE;AAAA,IACvE,YAAY,OAAO,WAAW;AAAA,MAC7B,MAAM,WAAW,MAAM,cAAc;AAAA,QACpC,MAAM;AAAA,MACP,CAAC;AAAA,MAED,IAAI,SAAS,OAAO;AAAA,QACnB,MAAM,IAAI,MAAM,2BAA2B;AAAA,MAC5C;AAAA,MAEA,OAAO,SAAS;AAAA;AAAA,IAEjB,WAAW,YAAY;AAAA,MACtB,MAAM,YAAY,kBAAkB,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC;AAAA;AAAA,EAEjE,CAAC;AAAA;AAGK,SAAS,eAAe,GAAG;AAAA,EACjC,MAAM,cAAc,iBAAe;AAAA,EAEnC,OAAO,aAAiC;AAAA,IACvC,YAAY,OAAO,eAAe;AAAA,MACjC,MAAM,WAAW,MAAM,oBAAoB;AAAA,QAC1C,MAAM,EAAE,IAAI,WAAW;AAAA,MACxB,CAAC;AAAA,MAED,IAAI,SAAS,OAAO;AAAA,QACnB,MAAM,IAAI,MAAM,yBAAyB;AAAA,MAC1C;AAAA;AAAA,IAED,WAAW,MAAM;AAAA,MAChB,YAAY,kBAAkB,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC;AAAA;AAAA,EAE3D,CAAC;AAAA;;;AC9FF,iBAAS;AACT,iBAAS,YAAM,kBAAQ;;AAWhB,IAAM,iBAAiB,OAAK,SAAS,eAAc;AAAA,EACzD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACuB;AAAA,EACvB,MAAM,cAAc,iBAAiB,CAAC,MAAM,EAAE,WAAW;AAAA,EACzD,MAAM,YAAY,iBAAiB,CAAC,MAAM,EAAE,SAAS;AAAA,EAErD,uBACC,OAyDE,OAzDF;AAAA,IAAK,WAAU;AAAA,IAAf,UAyDE;AAAA,MAxDA,UAAU,IAAI,CAAC,MAAM;AAAA,QACrB,MAAM,WAAW,EAAE,OAAO;AAAA,QAC1B,MAAM,YAAY,EAAE,WAAW;AAAA,QAE/B,uBACC,OAuCE,OAvCF;AAAA,UAEC,WAAW,yHACV,WACG,kCACA;AAAA,UAEJ,SAAS,MAAM,UAAU,EAAE,EAAE;AAAA,UAC7B,WAAW,CAAC,MAAM;AAAA,YACjB,IAAI,EAAE,QAAQ;AAAA,cAAS,UAAU,EAAE,EAAE;AAAA;AAAA,UAEtC,MAAK;AAAA,UACL,iBAAe;AAAA,UACf,UAAU;AAAA,UAbX,UAuCE;AAAA,4BAxBD,MAME,QANF;AAAA,cAAM,WAAU;AAAA,cAAhB,UACE,EAAE,cAAc,wBAChB,MAAC,KAAD;AAAA,gBAAK,WAAU;AAAA,eAAwB,oBAEvC,MAAC,OAAD;AAAA,gBAAM,WAAU;AAAA,eAAyB;AAAA,aAEzC;AAAA,4BACF,MAEE,QAFF;AAAA,cAAM,WAAU;AAAA,cAAhB,UACE,EAAE,SAAS,EAAE;AAAA,aACb;AAAA,YACD,CAAC,6BACD,MAAC,QAAD;AAAA,cAAM,WAAU;AAAA,aAAkD;AAAA,4BAEnE,MAUE,UAVF;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS,CAAC,MAAM;AAAA,gBACf,EAAE,gBAAgB;AAAA,gBAClB,eAAe,EAAE,EAAE;AAAA;AAAA,cAEpB,OAAM;AAAA,cAPP,0BASC,MAAC,KAAD;AAAA,gBAAG,WAAU;AAAA,eAAU;AAAA,aACtB;AAAA;AAAA,WArCG,EAAE,EAsCN;AAAA,OAEH;AAAA,sBACD,MAQE,UARF;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS;AAAA,QACT,UAAU;AAAA,QACV,OAAM;AAAA,QALP,0BAOC,MAAC,OAAD;AAAA,UAAM,WAAU;AAAA,SAAc;AAAA,OAC7B;AAAA;AAAA,GACD;AAAA,CAEH;;;ACjFD,sBAAS,uBAAW,sBAAQ,2BAAU;AACtC,2BAAe;AAEf,mBAAS;AAAA;AAET,IAAM,cAAc;AACpB,IAAM,sBAAsB;AAC5B,IAAM,kBAAkB;AACxB,IAAM,4BAA4B;AAElC,SAAS,sBAAsB,GAAW;AAAA,EACzC,IAAI,OAAO,aAAa;AAAA,IAAa,OAAO;AAAA,EAC5C,MAAM,KAAK,SAAS,cAAc,KAAK;AAAA,EACvC,GAAG,MAAM,UAAU;AAAA,EACnB,GAAG,YAAY;AAAA,EACf,SAAS,KAAK,YAAY,EAAE;AAAA,EAC5B,MAAM,WAAW,iBAAiB,EAAE,EAAE;AAAA,EACtC,SAAS,KAAK,YAAY,EAAE;AAAA,EAC5B,MAAM,QAAQ,SAAS,MAAM,gCAAgC;AAAA,EAC7D,IAAI,OAAO;AAAA,IACV,MAAM,IAAI,OAAO,MAAM,EAAE;AAAA,IACzB,MAAM,IAAI,OAAO,MAAM,EAAE;AAAA,IACzB,MAAM,IAAI,OAAO,MAAM,EAAE;AAAA,IACzB,OAAO,KAAM,KAAK,KAAO,KAAK,KAAO,KAAK,IAAK,GAAG,SAAS,EAAE,EAAE,MAAM,CAAC;AAAA,EACvE;AAAA,EACA,OAAO;AAAA;AAGR,IAAI,eAAc;AAElB,eAAe,gBAAgB,GAAkB;AAAA,EAChD,IAAI;AAAA,IAAa;AAAA,EACjB,IAAI,OAAO,aAAa,eAAe,EAAE,cAAc;AAAA,IAAS;AAAA,EAEhE,MAAM,WAAW;AAAA,IAChB;AAAA,MACC,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACR;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACR;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACR;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACR;AAAA,EACD;AAAA,EAEA,MAAM,QAAQ,SAAS,IAAI,OAAO,MAAM;AAAA,IACvC,IAAI;AAAA,MACH,MAAM,MAAM,IAAI,IAAI,sBAAsB,EAAE,QAAQ,YAAY,GAAG,EAAE;AAAA,MACrE,MAAM,OAAO,IAAI,SAChB,qBACA,QAAQ,yBACR;AAAA,QACC,QAAQ,EAAE;AAAA,QACV,OAAO,EAAE;AAAA,MACV,CACD;AAAA,MACA,MAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC/B,SAAS,MAAM,IAAI,MAAM;AAAA,MACxB,MAAM;AAAA,GAGR;AAAA,EAED,MAAM,QAAQ,WAAW,KAAK;AAAA,EAC9B,eAAc;AAAA;AAGf,SAAS,iBAAiB,GAAW;AAAA,EACpC,MAAM,UAAS,QAAO,YAAY;AAAA,EAClC,IACC,WACA,OAAO,QAAO,YAAY,YAC1B,QAAO,QAAQ,SAAS,GACvB;AAAA,IACD,OAAO,QAAO;AAAA,EACf;AAAA,EACA,OAAO,qBAAqB;AAAA;AAStB,SAAS,cAAc;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,GACuB;AAAA,EACvB,MAAM,eAAe,SAAuB,IAAI;AAAA,EAChD,MAAM,UAAU,SAAwB,IAAI;AAAA,EAC5C,MAAM,cAAc,SAAwB,IAAI;AAAA,EAChD,MAAM,iBAAiB,SAA2B,IAAI;AAAA,EACtD,MAAM,gBAAgB,SAAO,CAAC;AAAA,EAC9B,MAAM,gBAAgB,SAA6C,IAAI;AAAA,EACvE,MAAM,qBAAqB,SAAO,KAAK;AAAA,EACvC,OAAO,OAAO,YAAY,WAAS,KAAK;AAAA,EACxC,MAAM,YAAY,SAAO,MAAM;AAAA,EAC/B,UAAU,UAAU;AAAA,EACpB,MAAM,gBAAgB,SAA6C,IAAI;AAAA,EACvE,MAAM,kBAAkB,SAAO,KAAK;AAAA,EACpC,MAAM,aAAa,SAAO,SAAS;AAAA,EACnC,MAAM,mBAAmB,SAGf,IAAI;AAAA,EAEd,MAAM,cAAc,cAAY,MAAM;AAAA,IACrC,IAAI,YAAY,SAAS;AAAA,MACxB,IAAI;AAAA,QACH,YAAY,QAAQ,IAAI;AAAA,QACvB,MAAM;AAAA,IAGT;AAAA,KACE,CAAC,CAAC;AAAA,EAEL,MAAM,aAAa,cAClB,CAAC,MAAgB,SAAiB,gBAAyB;AAAA,IAC1D,IAAI,eAAe,SAAS;AAAA,MAC3B,eAAe,QAAQ,MAAM;AAAA,MAC7B,eAAe,UAAU;AAAA,IAC1B;AAAA,IAEA,MAAM,MAAM,GAAG,wBAAwB,oBAAoB,cAAc,sBAAsB;AAAA,IAC/F,MAAM,cAAc,IAAI,YAAY,GAAG;AAAA,IACvC,eAAe,UAAU;AAAA,IAEzB,IAAI,eAAe;AAAA,IAEnB,YAAY,YAAY,CAAC,UAAU;AAAA,MAClC,IAAI;AAAA,QACH,MAAM,OAAO,KAAK,MAAM,MAAM,IAAI;AAAA,QAClC,IAAI,KAAK,SAAS,QAAQ;AAAA,UACzB,MAAM,SAAS,gBAAgB,UAAU,KAAK,aAAa,IAAI;AAAA,UAC/D,KAAK,MAAM,KAAK,IAAI;AAAA,UACpB,IAAI,gBAAgB,WAAW,SAAS,GAAG;AAAA,YAC1C,KAAK,aAAa,MAAM;AAAA,UACzB;AAAA,UACA,mBAAmB,UAAU;AAAA,UAC7B,IAAI,CAAC,cAAc;AAAA,YAClB,eAAe;AAAA,YACf,WAAW,MAAM,SAAS,IAAI,GAAG,GAAG;AAAA,UACrC;AAAA,QACD,EAAO,SAAI,KAAK,SAAS,QAAQ;AAAA,UAChC,KAAK,MACJ;AAAA,oCAAyC,KAAK;AAAA,CAC/C;AAAA,UACA,IAAI,UAAU,SAAS;AAAA,YACtB,UAAU,QAAQ,UAAU;AAAA,UAC7B;AAAA,QACD;AAAA,QACC,MAAM;AAAA;AAAA,IAKT,YAAY,UAAU,MAAM;AAAA,MAC3B,YAAY,MAAM;AAAA,MAClB,IAAI,eAAe,YAAY,aAAa;AAAA,QAC3C,eAAe,UAAU;AAAA,MAC1B;AAAA,MAEA,IAAI,cAAc,UAAU,iBAAiB;AAAA,QAC5C,cAAc;AAAA,QACd,cAAc,UAAU,WAAW,MAAM;AAAA,UACxC,IAAI,QAAQ,SAAS;AAAA,YACpB,WAAW,QAAQ,SAAS,SAAS,IAAI;AAAA,UAC1C;AAAA,WACE,mBAAmB;AAAA,MACvB;AAAA;AAAA,IAGD,YAAY,SAAS,MAAM;AAAA,MAC1B,cAAc,UAAU;AAAA;AAAA,KAG1B,CAAC,UAAU,CACZ;AAAA,EAEA,YAAU,MAAM;AAAA,IACf,IAAI,CAAC,aAAa,WAAW,CAAC;AAAA,MAAY;AAAA,IAE1C,IAAI,WAAW;AAAA,IACf,IAAI,OAAwB;AAAA,IAC5B,IAAI,WAA4B;AAAA,IAChC,IAAI,iBAAwC;AAAA,IAE5C,SAAS,KAAK;AAAA,IACd,cAAc,UAAU;AAAA,IACxB,mBAAmB,UAAU;AAAA,IAE7B,IAAI,eAAe,SAAS;AAAA,MAC3B,eAAe,QAAQ,MAAM;AAAA,MAC7B,eAAe,UAAU;AAAA,IAC1B;AAAA,IACA,IAAI,cAAc,SAAS;AAAA,MAC1B,aAAa,cAAc,OAAO;AAAA,MAClC,cAAc,UAAU;AAAA,IACzB;AAAA,IAEA,MAAM,QAAQ,YAAY;AAAA,MACzB,MAAM,KAAK;AAAA,MACX,IAAI,YAAY,CAAC,aAAa;AAAA,QAAS;AAAA,MAEvC,MAAM,iBAAiB;AAAA,MACvB,MAAM,SAAS,MAAM;AAAA,MAErB,MAAM,KAAK,uBAAuB;AAAA,MAElC,OAAO,IAAI,UAAS;AAAA,QACnB,OAAO;AAAA,UACN,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,qBAAqB;AAAA,UACrB,OAAO;AAAA,UACP,KAAK;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,SAAS;AAAA,UACT,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa;AAAA,UACb,WAAW;AAAA,UACX,aAAa;AAAA,UACb,cAAc;AAAA,UACd,YAAY;AAAA,UACZ,eAAe;AAAA,UACf,YAAY;AAAA,UACZ,aAAa;AAAA,QACd;AAAA,QACA,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,YAAY;AAAA,MACb,CAAC;AAAA,MAED,WAAW,IAAI;AAAA,MACf,KAAK,UAAU,QAAQ;AAAA,MACvB,KAAK,KAAK,aAAa,OAAO;AAAA,MAE9B,KAAK,OAAO,MAAM;AAAA,QACjB,IAAI,CAAC,QAAQ,SAAS;AAAA,UAAU;AAAA,QAChC,QAAQ,QAAQ,SAAS,eAAe,KAAK;AAAA,QAC7C,IAAI,cAAc;AAAA,UAAS,aAAa,cAAc,OAAO;AAAA,QAC7D,cAAc,UAAU,WAAW,MAAM;AAAA,UACxC,IACC,QAAQ,SAAS,YACjB,SAAS,iBACT,aAAa,SAAS,SAAS,SAAS,aAAa,GACpD;AAAA,YACD,QAAQ,QAAQ,SAAS,eAAe,IAAI;AAAA,UAC7C;AAAA,WACE,yBAAyB;AAAA,OAC5B;AAAA,MAED,WAAW,UAAU;AAAA,MAErB,MAAM,gBAAgB,MAAM;AAAA,QAC3B,IAAI,CAAC,QAAQ,SAAS;AAAA,UAAU;AAAA,QAChC,QAAQ,QAAQ,SAAS,eAAe,IAAI;AAAA,QAC5C,QAAQ,QAAQ,SAAS,SAAS;AAAA,UACjC,QAAQ;AAAA,UACR,cAAc;AAAA,QACf,CAAC;AAAA;AAAA,MAGF,MAAM,iBAAiB,MAAM;AAAA,QAC5B,IAAI,CAAC,QAAQ,SAAS;AAAA,UAAU;AAAA,QAChC,QAAQ,QAAQ,SAAS,eAAe,KAAK;AAAA,QAC7C,QAAQ,QAAQ,SAAS,SAAS;AAAA,UACjC,QAAQ,WAAW;AAAA,UACnB,cAAc,WAAW;AAAA,QAC1B,CAAC;AAAA;AAAA,MAGF,aAAa,QAAQ,iBAAiB,WAAW,aAAa;AAAA,MAC9D,aAAa,QAAQ,iBAAiB,YAAY,cAAc;AAAA,MAChE,iBAAiB,UAAU;AAAA,QAC1B,SAAS;AAAA,QACT,UAAU;AAAA,MACX;AAAA,MAEA,MAAM,IAAI,QAAc,CAAC,YAAY;AAAA,QACpC,sBAAsB,MAAM;AAAA,UAC3B,IAAI;AAAA,YACH,UAAU,IAAI;AAAA,YACb,MAAM;AAAA,UAGR,QAAQ;AAAA,SACR;AAAA,OACD;AAAA,MAED,IAAI;AAAA,QAAU;AAAA,MAEd,MAAM,UAAU,kBAAkB;AAAA,MAElC,MAAM,aAAa,CAAC,MAAc,SAAiB;AAAA,QAClD,MAAM,GAAG,wBAAwB,qBAAqB;AAAA,UACrD,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU,EAAE,MAAM,KAAK,CAAC;AAAA,QACpC,CAAC,EAAE,MAAM,MAAM,EAAE;AAAA;AAAA,MAGlB,IAAI,MAAM;AAAA,QACT,WAAW,KAAK,MAAM,KAAK,IAAI;AAAA,MAChC;AAAA,MAEA,WAAW,MAAM,SAAS,KAAK;AAAA,MAE/B,KAAK,OAAO,CAAC,SAAS;AAAA,QACrB,MAAM,GAAG,wBAAwB,oBAAoB;AAAA,UACpD,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU,EAAE,OAAO,KAAK,CAAC;AAAA,QACrC,CAAC,EAAE,MAAM,MAAM,EAAE;AAAA,OACjB;AAAA,MAED,KAAK,SAAS,GAAG,MAAM,WAAW;AAAA,QACjC,WAAW,MAAM,IAAI;AAAA,OACrB;AAAA,MAED,KAAK,SAAS,MAAM;AAAA,QACnB,gBAAgB,UAAU,KAAK,aAAa,IAAI;AAAA,OAChD;AAAA,MAED,QAAQ,UAAU;AAAA,MAClB,YAAY,UAAU;AAAA,MAEtB,iBAAiB,IAAI,eAAe,MAAM;AAAA,QACzC,sBAAsB,MAAM;AAAA,UAC3B,IAAI,YAAY,WAAW,CAAC,UAAU;AAAA,YACrC,IAAI;AAAA,cACH,YAAY,QAAQ,IAAI;AAAA,cACvB,MAAM;AAAA,UAGT;AAAA,SACA;AAAA,OACD;AAAA,MACD,eAAe,QAAQ,aAAa,OAAO;AAAA,MAE3C,WAAW,MAAM;AAAA,QAChB,IAAI,CAAC;AAAA,UAAU,SAAS,IAAI;AAAA,SAC1B,IAAI;AAAA;AAAA,IAGR,MAAM,EAAE,MAAM,CAAC,UAAU;AAAA,MACxB,QAAQ,MAAM,0CAA0C,KAAK;AAAA,KAC7D;AAAA,IAED,OAAO,MAAM;AAAA,MACZ,WAAW;AAAA,MACX,IAAI,aAAa,WAAW,iBAAiB,SAAS;AAAA,QACrD,aAAa,QAAQ,oBACpB,WACA,iBAAiB,QAAQ,OAC1B;AAAA,QACA,aAAa,QAAQ,oBACpB,YACA,iBAAiB,QAAQ,QAC1B;AAAA,QACA,iBAAiB,UAAU;AAAA,MAC5B;AAAA,MACA,IAAI,cAAc,SAAS;AAAA,QAC1B,aAAa,cAAc,OAAO;AAAA,QAClC,cAAc,UAAU;AAAA,MACzB;AAAA,MACA,IAAI,cAAc,SAAS;AAAA,QAC1B,aAAa,cAAc,OAAO;AAAA,QAClC,cAAc,UAAU;AAAA,MACzB;AAAA,MACA,IAAI,eAAe,SAAS;AAAA,QAC3B,eAAe,QAAQ,MAAM;AAAA,QAC7B,eAAe,UAAU;AAAA,MAC1B;AAAA,MACA,IAAI,gBAAgB;AAAA,QACnB,eAAe,WAAW;AAAA,MAC3B;AAAA,MACA,IAAI,MAAM;AAAA,QACT,KAAK,QAAQ;AAAA,MACd;AAAA,MACA,QAAQ,UAAU;AAAA,MAClB,YAAY,UAAU;AAAA;AAAA,KAErB,CAAC,YAAY,UAAU,CAAC;AAAA,EAE3B,YAAU,MAAM;AAAA,IACf,MAAM,OAAO,QAAQ;AAAA,IACrB,IAAI,CAAC;AAAA,MAAM;AAAA,IACX,IAAI,UAAU;AAAA,MACb,YAAY;AAAA,MACZ,KAAK,MAAM;AAAA,IACZ,EAAO;AAAA,MACN,KAAK,KAAK;AAAA,MACV,IAAI,KAAK,UAAU;AAAA,QAClB,KAAK,SAAS,eAAe,KAAK;AAAA,QAClC,KAAK,SAAS,SAAS;AAAA,UACtB,QAAQ,WAAW;AAAA,UACnB,cAAc,WAAW;AAAA,QAC1B,CAAC;AAAA,MACF;AAAA;AAAA,KAEC,CAAC,UAAU,WAAW,CAAC;AAAA,EAE1B,YAAU,MAAM;AAAA,IACf,YAAY;AAAA,KACV,CAAC,WAAW,CAAC;AAAA,EAEhB,uBACC,MAoCE,OApCF;AAAA,IACC,WAAU;AAAA,IACV,OAAO,EAAE,YAAY,WAAW,YAAY,SAAS;AAAA,IACrD,wBAAoB;AAAA,IAHrB,0BAKC,OA8BE,OA9BF;AAAA,MAAK,WAAU;AAAA,MAAf,UA8BE;AAAA,wBA7BD,MAAC,OAAD;AAAA,UAAK,KAAK;AAAA,UAAc,WAAU;AAAA,SAAiC;AAAA,wBACnE,MA2BE,OA3BF;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,SAAS,QAAQ,IAAI,EAAE;AAAA,UAFjC,0BAIC,OAsBE,OAtBF;AAAA,YAAK,WAAU;AAAA,YAAf,UAsBE;AAAA,8BArBD,OAmBE,OAnBF;AAAA,gBACC,WAAU;AAAA,gBACV,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,eAAY;AAAA,gBAJb,UAmBE;AAAA,kCAbD,MAAC,UAAD;AAAA,oBACC,WAAU;AAAA,oBACV,IAAG;AAAA,oBACH,IAAG;AAAA,oBACH,GAAE;AAAA,oBACF,QAAO;AAAA,oBACP,aAAY;AAAA,mBACb;AAAA,kCACA,MAAC,QAAD;AAAA,oBACC,WAAU;AAAA,oBACV,MAAK;AAAA,oBACL,GAAE;AAAA,mBACH;AAAA;AAAA,eACC;AAAA,8BACF,MAA4C,QAA5C;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAA4C;AAAA;AAAA,WAC3C;AAAA,SACD;AAAA;AAAA,KACD;AAAA,GACD;AAAA;;;;AJjcJ,IAAM,cAAa;AACnB,IAAM,mBAAmB;AAElB,IAAM,iBAAiB,OAAK,SAAS,eAAc,GAAG;AAAA,EAC5D,MAAM,SAAS,iBAAiB,CAAC,MAAM,EAAE,MAAM;AAAA,EAC/C,MAAM,cAAc,iBAAiB,CAAC,MAAM,EAAE,WAAW;AAAA,EACzD,MAAM,iBAAiB,iBAAiB,CAAC,MAAM,EAAE,cAAc;AAAA,EAC/D,MAAM,cAAc,iBAAiB,CAAC,MAAM,EAAE,WAAW;AAAA,EACzD,MAAM,YAAY,iBAAiB,CAAC,MAAM,EAAE,SAAS;AAAA,EACrD,MAAM,aAAa,iBAAiB,CAAC,MAAM,EAAE,UAAU;AAAA,EACvD,MAAM,cAAc,iBAAiB,CAAC,MAAM,EAAE,WAAW;AAAA,EACzD,MAAM,iBAAiB,iBAAiB,CAAC,MAAM,EAAE,cAAc;AAAA,EAC/D,MAAM,cAAc,iBAAiB,CAAC,MAAM,EAAE,WAAW;AAAA,EAEzD,QAAQ,MAAM,cAAc,aAAa;AAAA,EACzC,MAAM,iBAAiB,kBAAkB;AAAA,EACzC,MAAM,eAAe,gBAAgB;AAAA,EAErC,MAAM,UAAU,SAGN,IAAI;AAAA,EAEd,MAAM,gBAAgB,WAAW,aAAa,CAAC;AAAA,EAE/C,MAAM,kBAAkB,SAAO,KAAK;AAAA,EACpC,MAAM,mBAAmB,SAAO,aAAa;AAAA,EAC7C,iBAAiB,UAAU;AAAA,EAG3B,YAAU,MAAM;AAAA,IACf,IACC,UACA,iBAAiB,QAAQ,SAAS,MACjC,CAAC,eACD,CAAC,iBAAiB,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,WAAW,IAC1D;AAAA,MACD,UAAU,iBAAiB,QAAQ,GAAG,EAAE;AAAA,IACzC;AAAA,KAEE,CAAC,QAAQ,cAAc,QAAQ,aAAa,SAAS,CAAC;AAAA,EAGzD,YAAU,MAAM;AAAA,IACf,IACC,UACA,aACA,cAAc,WAAW,KACzB,CAAC,gBAAgB,WACjB,CAAC,eAAe,WACf;AAAA,MACD,gBAAgB,UAAU;AAAA,MAC1B,eACE,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,SAAS;AAAA,MACV,CAAC,EACA,KAAK,CAAC,WAAW;AAAA,QACjB,UAAU,OAAO,UAAU;AAAA,OAC3B,EACA,MAAM,MAAM,EAAE,EACd,QAAQ,MAAM;AAAA,QACd,gBAAgB,UAAU;AAAA,OAC1B;AAAA,IACH;AAAA,KAEE,CAAC,QAAQ,WAAW,cAAc,QAAQ,SAAS,CAAC;AAAA,EAEvD,MAAM,oBAAoB,cAAY,YAAY;AAAA,IACjD,IAAI;AAAA,MACH,MAAM,SAAS,MAAM,eAAe,YAAY;AAAA,QAC/C,SAAS;AAAA,QACT,SAAS;AAAA,MACV,CAAC;AAAA,MACD,UAAU,OAAO,UAAU;AAAA,MAC1B,MAAM;AAAA,KAGN,CAAC,gBAAgB,SAAS,CAAC;AAAA,EAE9B,MAAM,qBAAqB,cAC1B,OAAO,OAAe;AAAA,IACrB,IAAI;AAAA,MACH,MAAM,aAAa,YAAY,EAAE;AAAA,MACjC,IAAI,gBAAgB,IAAI;AAAA,QACvB,MAAM,YAAY,iBAAiB,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,QACpE,IAAI,UAAU,SAAS,GAAG;AAAA,UACzB,UAAU,UAAU,GAAG,EAAE;AAAA,QAC1B,EAAO;AAAA,UACN,UAAU,IAAI;AAAA,UACd,WAAW;AAAA;AAAA,MAEb;AAAA,MACC,MAAM;AAAA,KAIT,CAAC,cAAc,aAAa,WAAW,UAAU,CAClD;AAAA,EAEA,YAAU,MAAM;AAAA,IACf,MAAM,gBAAgB,CAAC,MAAqB;AAAA,MAC3C,IAAI,EAAE,QAAQ,OAAO,EAAE,SAAS;AAAA,QAC/B,EAAE,eAAe;AAAA,QACjB,YAAY;AAAA,MACb;AAAA;AAAA,IAED,OAAO,iBAAiB,WAAW,aAAa;AAAA,IAChD,OAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,KAC9D,CAAC,WAAW,CAAC;AAAA,EAEhB,MAAM,oBAAoB,cACzB,CAAC,MAAwB;AAAA,IACxB,EAAE,eAAe;AAAA,IACjB,QAAQ,UAAU;AAAA,MACjB,QAAQ,EAAE;AAAA,MACV,aAAa;AAAA,IACd;AAAA,IAEA,MAAM,kBAAkB,CAAC,OAAmB;AAAA,MAC3C,IAAI,CAAC,QAAQ;AAAA,QAAS;AAAA,MACtB,MAAM,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AAAA,MAC1C,MAAM,YAAY,QAAQ,QAAQ,cAAc;AAAA,MAChD,MAAM,OAAO,OAAO,cAAc;AAAA,MAClC,eAAe,KAAK,IAAI,KAAK,IAAI,aAAY,SAAS,GAAG,IAAI,CAAC;AAAA;AAAA,IAG/D,MAAM,gBAAgB,MAAM;AAAA,MAC3B,QAAQ,UAAU;AAAA,MAClB,SAAS,oBAAoB,aAAa,eAAe;AAAA,MACzD,SAAS,oBAAoB,WAAW,aAAa;AAAA,MACrD,SAAS,KAAK,MAAM,SAAS;AAAA,MAC7B,SAAS,KAAK,MAAM,aAAa;AAAA;AAAA,IAGlC,SAAS,iBAAiB,aAAa,eAAe;AAAA,IACtD,SAAS,iBAAiB,WAAW,aAAa;AAAA,IAClD,SAAS,KAAK,MAAM,SAAS;AAAA,IAC7B,SAAS,KAAK,MAAM,aAAa;AAAA,KAElC,CAAC,aAAa,cAAc,CAC7B;AAAA,EAEA,IAAI,CAAC;AAAA,IAAQ,OAAO;AAAA,EAEpB,MAAM,SAAS,cAAc,SAAS,GAAG;AAAA,EAEzC,uBACC,OAwEE,OAxEF;AAAA,IACC,WAAU;AAAA,IACV,OAAO,EAAE,QAAQ,WAAW,YAAW;AAAA,IAFxC,UAwEE;AAAA,MApEA,CAAC,+BAED,MAAC,OAAD;AAAA,QACC,WAAU;AAAA,QACV,aAAa;AAAA,OACd;AAAA,sBAGD,OA0CE,OA1CF;AAAA,QAAK,WAAU;AAAA,QAAf,UA0CE;AAAA,0BAzCD,OAUE,OAVF;AAAA,YAAK,WAAU;AAAA,YAAf,UAUE;AAAA,8BATD,MAAC,cAAD;AAAA,gBAAc,WAAU;AAAA,eAAoC;AAAA,8BAC5D,MAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAEE;AAAA,cACD,cAAc,SAAS,qBACvB,OAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UAEE;AAAA,kBAFF;AAAA,kBACG,cAAc;AAAA,kBADjB;AAAA;AAAA,eAEE;AAAA;AAAA,WAEF;AAAA,0BAEF,MAAC,gBAAD;AAAA,YACC,WAAW;AAAA,YACX,eAAe;AAAA,YACf,gBAAgB;AAAA,YAChB,YAAY,eAAe;AAAA,WAC5B;AAAA,0BAEA,OAqBE,OArBF;AAAA,YAAK,WAAU;AAAA,YAAf,UAqBE;AAAA,8BApBD,MAWE,UAXF;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS;AAAA,gBACT,OAAO,cAAc,YAAY;AAAA,gBAJlC,UAME,8BACA,MAAC,YAAD;AAAA,kBAAW,WAAU;AAAA,iBAAc,oBAEnC,MAAC,YAAD;AAAA,kBAAW,WAAU;AAAA,iBAAc;AAAA,eAEnC;AAAA,8BACF,MAOE,UAPF;AAAA,gBACC,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS;AAAA,gBACT,OAAM;AAAA,gBAJP,0BAMC,MAAC,cAAD;AAAA,kBAAa,WAAU;AAAA,iBAAc;AAAA,eACpC;AAAA;AAAA,WACD;AAAA;AAAA,OACD;AAAA,sBAEF,OAeE,OAfF;AAAA,QAAK,WAAU;AAAA,QAAf,UAeE;AAAA,UAdA,cAAc,IAAI,CAAC,sBACnB,MAAC,gBAAD;AAAA,YAEC,YAAY,EAAE;AAAA,YACd,UAAU,EAAE,OAAO;AAAA,YACnB,QAAQ;AAAA,aAHH,EAAE,EAIR,CACA;AAAA,UACA,cAAc,WAAW,qBACzB,OAGE,OAHF;AAAA,YAAK,WAAU;AAAA,YAAf,UAGE;AAAA,8BAFD,MAAC,cAAD;AAAA,gBAAc,WAAU;AAAA,eAA0B;AAAA,8BAClD,MAA+C,OAA/C;AAAA,gBAAK,WAAU;AAAA,gBAAf;AAAA,eAA+C;AAAA;AAAA,WAC9C;AAAA;AAAA,OAEF;AAAA;AAAA,GACD;AAAA,CAEH;;AK9OD,iBAAS;AACT,qBAAS;;AAIF,IAAM,sBAAsB,OAAK,SAAS,oBAAmB,GAAG;AAAA,EACtE,MAAM,SAAS,iBAAiB,CAAC,MAAM,EAAE,MAAM;AAAA,EAC/C,MAAM,cAAc,iBAAiB,CAAC,MAAM,EAAE,WAAW;AAAA,EACzD,QAAQ,SAAS,aAAa;AAAA,EAE9B,MAAM,QAAQ,MAAM,SAAS;AAAA,EAE7B,uBACC,OAcE,UAdF;AAAA,IACC,MAAK;AAAA,IACL,SAAS;AAAA,IACT,WAAW,8FACV,SAAS,uCAAuC;AAAA,IAEjD,OAAM;AAAA,IANP,UAcE;AAAA,sBAND,MAAC,WAAD;AAAA,QAAU,WAAU;AAAA,OAAwC;AAAA,MAC3D,QAAQ,qBACR,MAEE,QAFF;AAAA,QAAM,WAAU;AAAA,QAAhB,UACE,QAAQ,IAAI,OAAO;AAAA,OACnB;AAAA;AAAA,GAEF;AAAA,CAEH;;AC7BD,iBAAS,mBAAM;AACf;AAAA,kBACC;AAAA;AAAA,cAEA;AAAA,cACA;AAAA,cACA;AAAA,eACA;AAAA;;;ACPD,qBAAS;AAIF,SAAS,eAAe,CAAC,WAA+B;AAAA,EAC9D,MAAM,aAAa,qBAAqB,CAAC,UAAU,MAAM,UAAU;AAAA,EAEnE,OAAO,WAAS;AAAA,IACf,UAAU,CAAC,WAAW,WAAW,OAAO;AAAA,IACxC,SAAS,MAAO,YAAY,UAAU,gBAAgB,SAAS,IAAI;AAAA,IACnE,SAAS,CAAC,CAAC;AAAA,IACX,iBAAiB,aAAa,OAAO;AAAA,IACrC,OAAO;AAAA,IACP,WAAW;AAAA,EACZ,CAAC;AAAA;;;;ADEF,IAAM,aAAY;AAClB,IAAM,iBAAgB;AACtB,IAAM,aAAY;AAClB,IAAM,aAAY;AAMlB,SAAS,gBAAgB,CAAC,WAAmB;AAAA,EAC5C,QAAQ;AAAA,SACF;AAAA,MACJ,uBAAO,MAAC,WAAD;AAAA,QAAU,WAAU;AAAA,OAAyB;AAAA,SAChD;AAAA,MACJ,uBAAO,MAAC,WAAD;AAAA,QAAU,WAAU;AAAA,OAAwB;AAAA,SAC/C;AAAA,MACJ,uBAAO,MAAC,WAAD;AAAA,QAAU,WAAU;AAAA,OAA0B;AAAA;AAAA,MAErD,uBAAO,MAAC,SAAD;AAAA,QAAS,WAAU;AAAA,OAAgC;AAAA;AAAA;AAI7D,SAAS,YAAW,CAAC,MAAsB;AAAA,EAC1C,OAAO,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK;AAAA;AAGjC,SAAS,mBAAmB,CAAC,IAG3B;AAAA,EACD,IAAI,GAAG,UAAU,SAAS;AAAA,IACzB,OAAO;AAAA,MACN,WAAW,GAAG,SAAS,QAAQ;AAAA,MAC/B,WAAW,GAAG,SAAS,QAAQ;AAAA,IAChC;AAAA,EACD;AAAA,EAEA,MAAM,QAAQ,GAAG,UAAU,SAAS,GAAG;AAAA,EACvC,IAAI,OAAO;AAAA,IACV,IAAI,YAAY;AAAA,IAChB,IAAI,YAAY;AAAA,IAChB,MAAM,QAAQ,MAAM,MAAM;AAAA,CAAI;AAAA,IAC9B,WAAW,QAAQ,OAAO;AAAA,MACzB,IAAI,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,KAAK,GAAG;AAAA,QACpD;AAAA,MACD,EAAO,SAAI,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,KAAK,GAAG;AAAA,QAC3D;AAAA,MACD;AAAA,IACD;AAAA,IACA,OAAO,EAAE,WAAW,UAAU;AAAA,EAC/B;AAAA,EAEA,IAAI,GAAG,SAAS;AAAA,IACf,MAAM,YAAY,GAAG,QAAQ,MAAM;AAAA,CAAI,EAAE;AAAA,IACzC,OAAO,EAAE,WAAW,WAAW,WAAW,EAAE;AAAA,EAC7C;AAAA,EAEA,OAAO,EAAE,WAAW,GAAG,WAAW,EAAE;AAAA;AAGrC,SAAS,eAAe,GAAG,QAA+B;AAAA,EACzD,MAAM,WAAW,qBAAqB,CAAC,UAAU,MAAM,QAAQ;AAAA,EAC/D,MAAM,eAAe,qBAAqB,CAAC,UAAU,MAAM,YAAY;AAAA,EACvE,MAAM,aAAa,iBAAiB,KAAK;AAAA,EAEzC,MAAM,SAAS,KAAK,WAAW,KAAK,WAAW,SAAS;AAAA,EAExD,QAAQ,gBAAgB,mBAAmB,UAAQ,MAAM;AAAA,IACxD,IAAI,YAAY;AAAA,IAChB,IAAI,YAAY;AAAA,IAChB,WAAW,MAAM,KAAK,YAAY;AAAA,MACjC,MAAM,QAAQ,oBAAoB,EAAE;AAAA,MACpC,aAAa,MAAM;AAAA,MACnB,aAAa,MAAM;AAAA,IACpB;AAAA,IACA,OAAO,EAAE,gBAAgB,WAAW,gBAAgB,UAAU;AAAA,KAC5D,CAAC,KAAK,UAAU,CAAC;AAAA,EAEpB,MAAM,cAAc,MAAM;AAAA,IACzB,IAAI,KAAK,WAAW,SAAS,GAAG;AAAA,MAC/B,SAAS,KAAK,MAAM,KAAK,UAAU;AAAA,IACpC;AAAA;AAAA,EAGD,uBACC,MAwBE,UAxBF;AAAA,IACC,MAAK;AAAA,IACL,SAAS;AAAA,IACT,WAAW,kEACV,aAAa,aAAa;AAAA,IAJ5B,0BAOC,OAgBE,OAhBF;AAAA,MAAK,WAAU;AAAA,MAAf,UAgBE;AAAA,QAfA,iBAAiB,QAAQ,aAAa,OAAO;AAAA,wBAC9C,MAIE,OAJF;AAAA,UAAK,WAAU;AAAA,UAAf,0BACC,MAEE,OAFF;AAAA,YAAK,WAAU;AAAA,YAAf,UACE,aAAY,KAAK,IAAI;AAAA,WACrB;AAAA,SACD;AAAA,wBACF,OAQE,OARF;AAAA,UAAK,WAAU;AAAA,UAAf,UAQE;AAAA,YAPA,KAAK,iBAAiB,qBACtB,OAEE,QAFF;AAAA,cAAM,WAAU;AAAA,cAAhB,UAEE;AAAA,gBADA,KAAK;AAAA,gBADP;AAAA;AAAA,aAEE;AAAA,4BAEH,OAAoD,QAApD;AAAA,cAAM,WAAU;AAAA,cAAhB,UAAoD;AAAA,gBAApD;AAAA,gBAAmC;AAAA;AAAA,aAAiB;AAAA,4BACpD,OAAkD,QAAlD;AAAA,cAAM,WAAU;AAAA,cAAhB,UAAkD;AAAA,gBAAlD;AAAA,gBAAiC;AAAA;AAAA,aAAiB;AAAA;AAAA,SACjD;AAAA;AAAA,KACD;AAAA,GACD;AAAA;AAIG,IAAM,sBAAsB,OAAK,SAAS,oBAAmB;AAAA,EACnE;AAAA,GAC4B;AAAA,EAC5B,MAAM,aAAa,qBAAqB,CAAC,UAAU,MAAM,UAAU;AAAA,EACnE,MAAM,kBAAkB,qBACvB,CAAC,UAAU,MAAM,eAClB;AAAA,EACA,MAAM,aAAa,mBAClB,CAAC,MAAM,EAAE,OAAO,eAAc,cAC/B;AAAA,EACA,QAAQ,MAAM,WAAW,OAAO,YAAY,gBAAgB,SAAS;AAAA,EAErE,IAAI,CAAC;AAAA,IAAY,OAAO;AAAA,EAExB,uBACC,OA6EE,OA7EF;AAAA,IACC,WAAU;AAAA,IACV,OAAO,EAAE,OAAO,WAAW;AAAA,IAF5B,UA6EE;AAAA,sBAzED,MAAC,cAAD;AAAA,QACC,UAAU;AAAA,QACV,MAAK;AAAA,QACL,UAAU;AAAA,QACV,UAAU;AAAA,QACV,cAAc;AAAA,OACf;AAAA,sBACA,OAiEE,OAjEF;AAAA,QAAK,WAAU;AAAA,QAAf,UAiEE;AAAA,0BAhED,OAaE,OAbF;AAAA,YAAK,WAAU;AAAA,YAAf,UAaE;AAAA,8BAZD,OAQE,OARF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UAQE;AAAA,kCAPD,MAAC,SAAD;AAAA,oBAAS,WAAU;AAAA,mBAAgC;AAAA,kCACnD,MAA6C,QAA7C;AAAA,oBAAM,WAAU;AAAA,oBAAhB;AAAA,mBAA6C;AAAA,kBAC5C,QAAQ,KAAK,aAAa,qBAC1B,OAEE,QAFF;AAAA,oBAAM,WAAU;AAAA,oBAAhB,UAEE;AAAA,sBAFF;AAAA,sBACG,KAAK;AAAA,sBADR;AAAA;AAAA,mBAEE;AAAA;AAAA,eAEF;AAAA,8BACF,MAEE,QAFF;AAAA,gBAAQ,SAAQ;AAAA,gBAAQ,MAAK;AAAA,gBAAO,SAAS;AAAA,gBAA7C,0BACC,MAAC,gBAAD;AAAA,kBAAc,WAAU;AAAA,iBAAU;AAAA,eACjC;AAAA;AAAA,WACD;AAAA,0BAEF,MAoBE,OApBF;AAAA,YAAK,WAAU;AAAA,YAAf,UACE,4BACA,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAEE,IACC,wBACH,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf,UACE,iBAAiB,QAAQ,MAAM,UAAU;AAAA,aACzC,IACC,CAAC,QAAQ,KAAK,eAAe,oBAChC,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAEE,oBAEF,MAIE,OAJF;AAAA,cAAK,WAAU;AAAA,cAAf,UACE,KAAK,MAAM,IAAI,CAAC,yBAChB,MAAC,iBAAD;AAAA,gBAAiC;AAAA,iBAAX,KAAK,IAAkB,CAC7C;AAAA,aACA;AAAA,WAEF;AAAA,0BAEF,OA0BE,OA1BF;AAAA,YAAK,WAAU;AAAA,YAAf,UA0BE;AAAA,8BAzBD,OAUE,OAVF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UAUE;AAAA,kCATD,MAAC,SAAD;AAAA,oBAAS,WAAU;AAAA,mBAAwB;AAAA,kBAC1C,QAAQ,KAAK,kBAAkB,oBAC/B,OAGE,QAHF;AAAA,oBAAM,WAAU;AAAA,oBAAhB,UAGE;AAAA,sBAFA,KAAK;AAAA,sBADP;AAAA,sBACwB,KAAK,eAAe,IAAI,MAAM;AAAA,sBADtD;AAAA,sBAC2D;AAAA,sBACzD,KAAK;AAAA,sBAFP;AAAA,sBAE2B,KAAK,oBAAoB,IAAI,MAAM;AAAA;AAAA,mBAC5D,oBAEF,MAAuC,QAAvC;AAAA,oBAAM,WAAU;AAAA,oBAAhB;AAAA,mBAAuC;AAAA;AAAA,eAEvC;AAAA,8BACF,MAaE,OAbF;AAAA,gBAAK,WAAU;AAAA,gBAAf,0BACC,MAWE,QAXF;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAAS,MAAM,QAAQ;AAAA,kBACvB,OAAM;AAAA,kBACN,WAAU;AAAA,kBACV,UAAU;AAAA,kBANX,0BAQC,MAAC,YAAD;AAAA,oBACC,WAAW,WAAW,YAAY,iBAAiB;AAAA,mBACpD;AAAA,iBACC;AAAA,eACD;AAAA;AAAA,WACD;AAAA;AAAA,OACD;AAAA;AAAA,GACD;AAAA,CAEH;;AE/ND,iBAAS;AACT,oBAAS;;AAQF,IAAM,4BAA4B,OACxC,SAAS,0BAAyB;AAAA,EACjC;AAAA,GACkC;AAAA,EAClC,MAAM,aAAa,qBAAqB,CAAC,UAAU,MAAM,UAAU;AAAA,EACnE,MAAM,gBAAgB,qBAAqB,CAAC,UAAU,MAAM,aAAa;AAAA,EACzE,QAAQ,SAAS,gBAAgB,SAAS;AAAA,EAE1C,MAAM,YAAY,MAAM,cAAc;AAAA,EAEtC,uBACC,OAgBE,UAhBF;AAAA,IACC,MAAK;AAAA,IACL,SAAS;AAAA,IACT,WAAW,yGACV,aACG,4BACA;AAAA,IAEJ,OAAM;AAAA,IARP,UAgBE;AAAA,sBAND,MAAC,UAAD;AAAA,QAAS,WAAU;AAAA,OAAwC;AAAA,MAC1D,YAAY,qBACZ,MAEE,QAFF;AAAA,QAAM,WAAU;AAAA,QAAhB,UACE,YAAY,IAAI,OAAO;AAAA,OACvB;AAAA;AAAA,GAEF;AAAA,CAGL;;ACvCA,sBAAS,wBAAW,mBAAS,kBAAM;AACnC,cAAS,kCAAgB;AACzB,kBAAS;AACT;AAAA,WACC;AAAA,iBACA;AAAA;;AAMD,SAAS,sBAAsB,CAAC,OAAuB;AAAA,EACtD,MAAM,QAAQ,MAAM,MAAM;AAAA,CAAI;AAAA,EAC9B,MAAM,SAAmB,CAAC;AAAA,EAC1B,IAAI,WAAW;AAAA,EACf,IAAI,cAAc;AAAA,EAClB,MAAM,YAAsB,CAAC;AAAA,EAE7B,WAAW,QAAQ,OAAO;AAAA,IACzB,IACC,KAAK,WAAW,iBAAiB,KACjC,KAAK,WAAW,eAAe,KAC/B,KAAK,WAAW,kBAAkB,KAClC,KAAK,WAAW,eAAe,KAC/B,KAAK,WAAW,kBAAkB,GACjC;AAAA,MACD,IAAI,UAAU,SAAS,GAAG;AAAA,QACzB,OAAO,KAAK,SAAS,kBAAkB,aAAa;AAAA,QACpD,OAAO,KAAK,GAAG,SAAS;AAAA,QACxB,UAAU,SAAS;AAAA,QACnB,WAAW;AAAA,QACX,cAAc;AAAA,MACf;AAAA,MACA,OAAO,KAAK,IAAI;AAAA,MAChB;AAAA,IACD;AAAA,IAEA,IAAI,KAAK,MAAM,qCAAqC,GAAG;AAAA,MACtD,IAAI,UAAU,SAAS,GAAG;AAAA,QACzB,OAAO,KAAK,SAAS,kBAAkB,aAAa;AAAA,QACpD,OAAO,KAAK,GAAG,SAAS;AAAA,QACxB,UAAU,SAAS;AAAA,QACnB,WAAW;AAAA,QACX,cAAc;AAAA,MACf;AAAA,MACA,OAAO,KAAK,IAAI;AAAA,MAChB;AAAA,IACD;AAAA,IAEA,IAAI,KAAK,WAAW,IAAI,GAAG;AAAA,MAC1B,OAAO,KAAK,IAAI;AAAA,MAChB;AAAA,IACD;AAAA,IAEA,IAAI,KAAK,WAAW,GAAG,GAAG;AAAA,MACzB;AAAA,MACA,UAAU,KAAK,IAAI;AAAA,IACpB,EAAO,SAAI,KAAK,WAAW,GAAG,GAAG;AAAA,MAChC;AAAA,MACA,UAAU,KAAK,IAAI;AAAA,IACpB,EAAO,SAAI,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,IAAI,GAAG;AAAA,MACzD;AAAA,MACA;AAAA,MACA,UAAU,KAAK,KAAK,WAAW,IAAI,IAAI,IAAI,SAAS,IAAI;AAAA,IACzD,EAAO,SAAI,KAAK,KAAK,MAAM,IAAI;AAAA,MAC9B,UAAU,KAAK,GAAG;AAAA,MAClB;AAAA,MACA;AAAA,IACD,EAAO;AAAA,MACN;AAAA,MACA;AAAA,MACA,UAAU,KAAK,IAAI,MAAM;AAAA;AAAA,EAE3B;AAAA,EAEA,IAAI,UAAU,SAAS,GAAG;AAAA,IACzB,OAAO,KAAK,SAAS,kBAAkB,aAAa;AAAA,IACpD,OAAO,KAAK,GAAG,SAAS;AAAA,EACzB;AAAA,EAEA,OAAO,OAAO,KAAK;AAAA,CAAI;AAAA;AAGxB,SAAS,oBAAmB,CAAC,MAAsB;AAAA,EAClD,MAAM,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY;AAAA,EAC/C,MAAM,UAAkC;AAAA,IACvC,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,GAAG;AAAA,IACH,KAAK;AAAA,IACL,GAAG;AAAA,IACH,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,QAAQ;AAAA,EACT;AAAA,EACA,OAAO,QAAQ,OAAO,OAAO;AAAA;AAW9B,SAAS,UAAS,CAAC,OAAwD;AAAA,EAC1E,MAAM,QAAQ,MAAM,MAAM;AAAA,CAAI;AAAA,EAC9B,MAAM,SAAqB,CAAC;AAAA,EAC5B,IAAI,aAAa;AAAA,EACjB,IAAI,aAAa;AAAA,EACjB,IAAI,SAAS;AAAA,EACb,IAAI,WAAW;AAAA,EAEf,WAAW,QAAQ,OAAO;AAAA,IACzB,IAAI,KAAK,WAAW,KAAK,KAAK,KAAK,WAAW,kBAAkB,GAAG;AAAA,MAClE,MAAM,QACL,KAAK,MAAM,gBAAgB,KAAK,KAAK,MAAM,0BAA0B;AAAA,MACtE,IAAI;AAAA,QAAO,WAAW,MAAM;AAAA,IAC7B;AAAA,IAEA,IAAI,KAAK,WAAW,eAAe,GAAG;AAAA,MACrC,MAAM,QAAQ,KAAK,MAAM,uBAAuB;AAAA,MAChD,IAAI;AAAA,QAAO,WAAW,MAAM;AAAA,IAC7B;AAAA,IAEA,MAAM,YAAY,KAAK,MAAM,yCAAyC;AAAA,IACtE,IAAI,WAAW;AAAA,MACd,aAAa,OAAO,SAAS,UAAU,IAAI,EAAE;AAAA,MAC7C,aAAa,OAAO,SAAS,UAAU,IAAI,EAAE;AAAA,MAC7C,SAAS;AAAA,MACT,OAAO,KAAK;AAAA,QACX,SAAS;AAAA,QACT,aAAa;AAAA,QACb,MAAM;AAAA,MACP,CAAC;AAAA,MACD;AAAA,IACD;AAAA,IAEA,IACC,KAAK,WAAW,KAAK,KACrB,KAAK,WAAW,OAAO,KACvB,KAAK,WAAW,QAAQ,KACxB,KAAK,WAAW,KAAK,KACrB,KAAK,WAAW,KAAK,KACpB,KAAK,WAAW,IAAI,KAAK,CAAC,QAC1B;AAAA,MACD,OAAO,KAAK;AAAA,QACX,SAAS;AAAA,QACT,aAAa;AAAA,QACb,MAAM;AAAA,MACP,CAAC;AAAA,MACD;AAAA,IACD;AAAA,IAEA,IAAI,QAAQ;AAAA,MACX,IAAI,KAAK,WAAW,GAAG,GAAG;AAAA,QACzB,OAAO,KAAK;AAAA,UACX,SAAS;AAAA,UACT,aAAa,KAAK,MAAM,CAAC;AAAA,UACzB,MAAM;AAAA,UACN,YAAY;AAAA,QACb,CAAC;AAAA,MACF,EAAO,SAAI,KAAK,WAAW,GAAG,GAAG;AAAA,QAChC,OAAO,KAAK;AAAA,UACX,SAAS;AAAA,UACT,aAAa,KAAK,MAAM,CAAC;AAAA,UACzB,MAAM;AAAA,UACN,YAAY;AAAA,QACb,CAAC;AAAA,MACF,EAAO,SAAI,KAAK,WAAW,GAAG,KAAK,SAAS,IAAI;AAAA,QAC/C,OAAO,KAAK;AAAA,UACX,SAAS;AAAA,UACT,aAAa,KAAK,WAAW,GAAG,IAAI,KAAK,MAAM,CAAC,IAAI;AAAA,UACpD,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,YAAY;AAAA,QACb,CAAC;AAAA,MACF,EAAO;AAAA,QACN,OAAO,KAAK;AAAA,UACX,SAAS;AAAA,UACT,aAAa;AAAA,UACb,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,YAAY;AAAA,QACb,CAAC;AAAA;AAAA,IAEH,EAAO;AAAA,MACN,OAAO,KAAK;AAAA,QACX,SAAS;AAAA,QACT,aAAa;AAAA,QACb,MAAM;AAAA,MACP,CAAC;AAAA;AAAA,EAEH;AAAA,EAEA,OAAO,EAAE,OAAO,QAAQ,SAAS;AAAA;AAGlC,SAAS,kBAAkB,GAAG,SAA4B;AAAA,EACzD,QAAQ,OAAO,WAAW,aAAa,WAAU,KAAK;AAAA,EACtD,MAAM,WAAW,qBAAoB,QAAQ;AAAA,EAC7C,MAAM,cAAc,UAAU,gBAAgB,UAAU,SAAS,MAAM,IACpE,gBACA;AAAA,EAEH,uBACC,MA8GE,OA9GF;AAAA,IAAK,WAAU;AAAA,IAAf,0BACC,MA4GE,OA5GF;AAAA,MAAK,WAAU;AAAA,MAAf,UACE,UAAU,IAAI,CAAC,MAAM,MAAM;AAAA,QAC3B,MAAM,MAAM,QAAQ,KAAK,KAAK,QAAQ,MAAM,GAAG,EAAE;AAAA,QAEjD,IAAI,KAAK,SAAS,UAAU,KAAK,SAAS,UAAU;AAAA,UACnD,uBACC,MASE,OATF;AAAA,YAEC,WAAW,6CACV,KAAK,SAAS,WACX,yCACA;AAAA,YALL,UAQE,KAAK;AAAA,aAPD,GAQJ;AAAA,QAEJ;AAAA,QAEA,IAAI,YAAY;AAAA,QAChB,IAAI,UAAU;AAAA,QACd,QAAQ,KAAK;AAAA,eACP;AAAA,YACJ,YAAY;AAAA,YACZ,UAAU;AAAA,YACV;AAAA,eACI;AAAA,YACJ,YAAY;AAAA,YACZ,UAAU;AAAA,YACV;AAAA;AAAA,YAEA,YAAY;AAAA;AAAA,QAGd,IAAI,kBAAmC,KAAK;AAAA,QAC5C,IAAI,KAAK,YAAY,KAAK,KAAK,aAAa,QAAQ;AAAA,UACnD,kCACC,MAoBE,qBApBF;AAAA,YACC;AAAA,YACA,OAAO;AAAA,YACP,aAAa;AAAA,cACZ,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,SAAS;AAAA,cACT,UAAU;AAAA,cACV,YAAY;AAAA,YACb;AAAA,YACA,cAAc;AAAA,cACb,OAAO;AAAA,gBACN,YAAY;AAAA,gBACZ,YAAY;AAAA,cACb;AAAA,YACD;AAAA,YACA,QAAO;AAAA,YAjBR,UAmBE,KAAK;AAAA,WACL;AAAA,UAGH,IAAI,KAAK,SAAS,OAAO;AAAA,YACxB,kCACC;AAAA,wBAGE;AAAA,gCAFD,MAAiC,QAAjC;AAAA,kBAAM,WAAU;AAAA,kBAAhB;AAAA,iBAAiC;AAAA,gBAChC;AAAA;AAAA,aACA;AAAA,UAEJ,EAAO,SAAI,KAAK,SAAS,UAAU;AAAA,YAClC,kCACC;AAAA,wBAGE;AAAA,gCAFD,MAAiC,QAAjC;AAAA,kBAAM,WAAU;AAAA,kBAAhB;AAAA,iBAAiC;AAAA,gBAChC;AAAA;AAAA,aACA;AAAA,UAEJ,EAAO,SAAI,KAAK,SAAS,WAAW;AAAA,YACnC,kCACC;AAAA,wBAGE;AAAA,gCAFD,MAAiC,QAAjC;AAAA,kBAAM,WAAU;AAAA,kBAAhB;AAAA,iBAAiC;AAAA,gBAChC;AAAA;AAAA,aACA;AAAA,UAEJ;AAAA,QACD;AAAA,QAEA,uBACC,OAoBE,OApBF;AAAA,UAAe,WAAW,QAAQ;AAAA,UAAlC,UAoBE;AAAA,4BAnBD,MAME,OANF;AAAA,cACC,WAAU;AAAA,cACV,eAAY;AAAA,cACZ,OAAO,EAAE,eAAe,OAAO;AAAA,cAHhC,UAKE,KAAK,cAAc;AAAA,aACnB;AAAA,4BACF,MAME,OANF;AAAA,cACC,WAAU;AAAA,cACV,eAAY;AAAA,cACZ,OAAO,EAAE,eAAe,OAAO;AAAA,cAHhC,UAKE,KAAK,cAAc;AAAA,aACnB;AAAA,4BACF,MAIE,OAJF;AAAA,cACC,WAAW,4DAA4D;AAAA,cADxE,UAGE;AAAA,aACA;AAAA;AAAA,WAnBO,GAoBR;AAAA,OAEH;AAAA,KACA;AAAA,GACD;AAAA;AAIJ,SAAS,eAAe,CAAC,WAA2B;AAAA,EACnD,MAAM,OAAO,IAAI,KAAK,SAAS;AAAA,EAC/B,OAAO,KAAK,mBAAmB,CAAC,GAAG,EAAE,MAAM,WAAW,QAAQ,UAAU,CAAC;AAAA;AAGnE,IAAM,wBAAwB,OAAK,SAAS,sBAAqB,GAAG;AAAA,EAC1E,MAAM,aAAa,qBAAqB,CAAC,UAAU,MAAM,UAAU;AAAA,EACnE,MAAM,eAAe,qBAAqB,CAAC,UAAU,MAAM,YAAY;AAAA,EACvE,MAAM,gBAAgB,qBAAqB,CAAC,UAAU,MAAM,aAAa;AAAA,EACzE,MAAM,yBAAyB,qBAC9B,CAAC,UAAU,MAAM,sBAClB;AAAA,EACA,MAAM,kBAAkB,qBACvB,CAAC,UAAU,MAAM,eAClB;AAAA,EACA,MAAM,YAAY,qBAAqB,CAAC,UAAU,MAAM,SAAS;AAAA,EAEjE,MAAM,eAAe,gBAAgB,CAAC,UAAU,MAAM,YAAY;AAAA,EAClE,MAAM,kBAAkB,SAAuB,IAAI;AAAA,EACnD,MAAM,kBAAkB,SAAO,KAAK;AAAA,EAEpC,MAAM,oBAAoB,cAAc;AAAA,EAExC,MAAM,eAAe,UAAQ,MAAM;AAAA,IAClC,IAAI,CAAC,qBAAqB,CAAC;AAAA,MAAc,OAAO;AAAA,IAEhD,IAAI,WAA0B;AAAA,IAE9B,IAAI,kBAAkB,UAAU,OAAO;AAAA,MACtC,WAAW,kBAAkB,SAAS;AAAA,IACvC,EAAO,SAAI,kBAAkB,OAAO;AAAA,MACnC,WAAW,kBAAkB;AAAA,IAC9B,EAAO,SAAI,kBAAkB,SAAS;AAAA,MACrC,MAAM,eAAe,kBAAkB,QAAQ,MAAM;AAAA,CAAI;AAAA,MACzD,WAAW,iBAAiB;AAAA,EAAiB,aAAa,IAAI,CAAC,SAAS,IAAI,MAAM,EAAE,KAAK;AAAA,CAAI;AAAA,IAC9F;AAAA,IAEA,IAAI,CAAC;AAAA,MAAU,OAAO;AAAA,IAEtB,MAAM,sBAAsB,qCAAqC,KAChE,QACD;AAAA,IACA,IAAI,CAAC,qBAAqB;AAAA,MACzB,OAAO,uBAAuB,QAAQ;AAAA,IACvC;AAAA,IAEA,OAAO;AAAA,KACL,CAAC,mBAAmB,YAAY,CAAC;AAAA,EAEpC,YAAU,MAAM;AAAA,IAEf,IAAI,cAAc,CAAC,gBAAgB,SAAS;AAAA,MAE3C,QAAQ,gBAAgB,gBAAgB,SAAS;AAAA,MACjD,gBAAgB,UAAU;AAAA,MAC1B,aAAa,IAAI;AAAA,IAClB,EAAO,SAAI,CAAC,cAAc,gBAAgB,SAAS;AAAA,MAElD,IAAI,gBAAgB,YAAY,MAAM;AAAA,QACrC,aAAa,gBAAgB,OAAO;AAAA,QACpC,gBAAgB,UAAU;AAAA,MAC3B;AAAA,IACD;AAAA,IACA,gBAAgB,UAAU;AAAA,KACxB,CAAC,YAAY,YAAY,CAAC;AAAA,EAE7B,YAAU,MAAM;AAAA,IACf,MAAM,gBAAgB,CAAC,MAAqB;AAAA,MAC3C,MAAM,SAAS,EAAE;AAAA,MACjB,MAAM,YACL,OAAO,YAAY,WACnB,OAAO,YAAY,cACnB,OAAO;AAAA,MAER,KAAK,EAAE,QAAQ,YAAa,EAAE,QAAQ,OAAO,CAAC,cAAe,YAAY;AAAA,QACxE,UAAU;AAAA,MACX;AAAA,MAEA,IAAI,CAAC,aAAa,cAAc,cAAc,SAAS,GAAG;AAAA,QACzD,IAAI,EAAE,QAAQ,eAAe,EAAE,QAAQ,KAAK;AAAA,UAC3C,EAAE,eAAe;AAAA,UACjB,gBAAgB,KAAK,IAAI,GAAG,yBAAyB,CAAC,CAAC;AAAA,QACxD,EAAO,SAAI,EAAE,QAAQ,gBAAgB,EAAE,QAAQ,KAAK;AAAA,UACnD,EAAE,eAAe;AAAA,UACjB,gBACC,KAAK,IAAI,cAAc,SAAS,GAAG,yBAAyB,CAAC,CAC9D;AAAA,QACD;AAAA,MACD;AAAA;AAAA,IAGD,SAAS,iBAAiB,WAAW,aAAa;AAAA,IAClD,OAAO,MAAM,SAAS,oBAAoB,WAAW,aAAa;AAAA,KAChE;AAAA,IACF;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,EACD,CAAC;AAAA,EAED,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC;AAAA,IAAmB,OAAO;AAAA,EAE/D,MAAM,iBAAiB,cAAc,SAAS;AAAA,EAE9C,uBACC,OAyGE,OAzGF;AAAA,IAAK,WAAU;AAAA,IAAf,UAyGE;AAAA,sBAxGD,OAiEE,OAjEF;AAAA,QAAK,WAAU;AAAA,QAAf,UAiEE;AAAA,0BAhED,MAOE,QAPF;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS;AAAA,YACT,OAAM;AAAA,YAJP,0BAMC,MAAC,KAAD;AAAA,cAAG,WAAU;AAAA,aAAU;AAAA,WACtB;AAAA,0BACF,OAoBE,OApBF;AAAA,YAAK,WAAU;AAAA,YAAf,UAoBE;AAAA,8BAnBD,MAKE,QALF;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO;AAAA,gBAFR,UAIE;AAAA,eACA;AAAA,8BACF,MAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UACE,kBAAkB;AAAA,eAClB;AAAA,cACD,kBAAkB,UAAU,2BAC5B,OAOE,OAPF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UAOE;AAAA,kCAND,OAEE,QAFF;AAAA,oBAAM,WAAU;AAAA,oBAAhB,UAEE;AAAA,sBAFF;AAAA,sBACG,kBAAkB,SAAS,QAAQ;AAAA;AAAA,mBACpC;AAAA,kCACF,OAEE,QAFF;AAAA,oBAAM,WAAU;AAAA,oBAAhB,UAEE;AAAA,sBAFF;AAAA,sBACG,kBAAkB,SAAS,QAAQ;AAAA;AAAA,mBACpC;AAAA;AAAA,eACD;AAAA;AAAA,WAEF;AAAA,UAED,kCACA,OA+BE,OA/BF;AAAA,YAAK,WAAU;AAAA,YAAf,UA+BE;AAAA,8BA9BD,MAUE,QAVF;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,SAAS,MACR,gBAAgB,KAAK,IAAI,GAAG,yBAAyB,CAAC,CAAC;AAAA,gBAExD,UAAU,2BAA2B;AAAA,gBACrC,OAAM;AAAA,gBAPP,0BASC,MAAC,aAAD;AAAA,kBAAa,WAAU;AAAA,iBAAU;AAAA,eAChC;AAAA,8BACF,OAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UAEE;AAAA,kBADA,yBAAyB;AAAA,kBAD3B;AAAA,kBACiC,cAAc;AAAA;AAAA,eAC7C;AAAA,8BACF,MAeE,QAfF;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,SAAS,MACR,gBACC,KAAK,IACJ,cAAc,SAAS,GACvB,yBAAyB,CAC1B,CACD;AAAA,gBAED,UAAU,2BAA2B,cAAc,SAAS;AAAA,gBAC5D,OAAM;AAAA,gBAZP,0BAcC,MAAC,gBAAD;AAAA,kBAAc,WAAU;AAAA,iBAAU;AAAA,eACjC;AAAA;AAAA,WACD;AAAA;AAAA,OAEF;AAAA,MAED,kCACA,MAwBE,OAxBF;AAAA,QAAK,WAAU;AAAA,QAAf,UACE,cAAc,IAAI,CAAC,IAAI,wBACvB,OAoBE,UApBF;AAAA,UACC,MAAK;AAAA,UAEL,SAAS,MAAM,gBAAgB,GAAG;AAAA,UAClC,WAAW,qFACV,QAAQ,yBACL,uCACA;AAAA,UAPL,UAoBE;AAAA,4BAVD,MAA6C,QAA7C;AAAA,cAAM,WAAU;AAAA,cAAhB,UAA8B,GAAG;AAAA,aAAY;AAAA,4BAC7C,MAEE,QAFF;AAAA,cAAM,WAAU;AAAA,cAAhB,UACE,gBAAgB,GAAG,SAAS;AAAA,aAC5B;AAAA,YACD,GAAG,UAAU,2BACb,OAGE,QAHF;AAAA,cAAM,WAAU;AAAA,cAAhB,UAGE;AAAA,gBAHF;AAAA,gBACG,GAAG,SAAS,QAAQ;AAAA,gBADvB;AAAA,gBAEE,GAAG,SAAS,QAAQ;AAAA;AAAA,aACpB;AAAA;AAAA,WAhBE,GAAG,UAkBP,CACF;AAAA,OACA;AAAA,sBAGH,MAQE,OARF;AAAA,QAAK,WAAU;AAAA,QAAf,UACE,+BACA,MAAC,oBAAD;AAAA,UAAoB,OAAO;AAAA,SAAc,oBAEzC,MAEE,OAFF;AAAA,UAAK,WAAU;AAAA,UAAf;AAAA,SAEE;AAAA,OAEF;AAAA;AAAA,GACD;AAAA,CAEH;;AC3iBD,iBAAS,oBAAM,yBAAU,4BAAW,yBAAa,qBAAQ;AACzD;AAAA,kBACC;AAAA,kBACA;AAAA,UACA;AAAA;AAAA,aAEA;AAAA,aACA;AAAA;AAAA,kBAEA;AAAA,iBACA;AAAA,WACA;AAAA,OACA;AAAA;;;ACZD,qBAAS,2BAAU,gCAAa;AA2ChC,MAAM,kBAAkB;AAAA,MACX,OAAO,GAAW;AAAA,IAE7B,MAAM,MAAM;AAAA,IACZ,IAAI,IAAI,iBAAiB;AAAA,MACxB,OAAO,IAAI;AAAA,IACZ;AAAA,IAEA,IAAI,YAAY,KAAK,mBAAmB;AAAA,MACvC,OAAO,YAAY,IAAI;AAAA,IACxB;AAAA,IACA,OAAO;AAAA;AAAA,OAGF,qBAAoB,CACzB,iBACoC;AAAA,IACpC,MAAM,WAAW,MAAM,MACtB,GAAG,KAAK,uBAAuB,4BAC/B;AAAA,MACC,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC/C,CACD;AAAA,IAEA,IAAI,CAAC,SAAS,IAAI;AAAA,MACjB,MAAM,QAAQ,MAAM,SAClB,KAAK,EACL,MAAM,OAAO,EAAE,OAAO,oCAAoC,EAAE;AAAA,MAC9D,MAAM,IAAI,MAAM,MAAM,SAAS,mCAAmC;AAAA,IACnE;AAAA,IAEA,OAAO,SAAS,KAAK;AAAA;AAAA,OAGhB,sBAAqB,CAC1B,iBACA,MACkC;AAAA,IAClC,MAAM,WAAW,MAAM,MACtB,GAAG,KAAK,uBAAuB,4BAC/B;AAAA,MACC,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,IAAI;AAAA,IAC1B,CACD;AAAA,IAEA,IAAI,CAAC,SAAS,IAAI;AAAA,MACjB,MAAM,QAAQ,MAAM,SAClB,KAAK,EACL,MAAM,OAAO,EAAE,OAAO,oCAAoC,EAAE;AAAA,MAC9D,MAAM,IAAI,MAAM,MAAM,SAAS,mCAAmC;AAAA,IACnE;AAAA,IAEA,OAAO,SAAS,KAAK;AAAA;AAAA,OAGhB,sBAAqB,CAC1B,YACgC;AAAA,IAChC,MAAM,WAAW,MAAM,MAAM,GAAG,KAAK,uBAAuB,cAAc;AAAA,MACzE,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC/C,CAAC;AAAA,IAED,IAAI,CAAC,SAAS,IAAI;AAAA,MACjB,MAAM,QAAQ,MAAM,SAClB,KAAK,EACL,MAAM,OAAO,EAAE,OAAO,oCAAoC,EAAE;AAAA,MAC9D,MAAM,IAAI,MAAM,MAAM,SAAS,mCAAmC;AAAA,IACnE;AAAA,IAEA,OAAO,SAAS,KAAK;AAAA;AAAA,OAGhB,cAAa,CAClB,iBACA,mBACA,OACiC;AAAA,IACjC,MAAM,WAAW,MAAM,MACtB,GAAG,KAAK,uBAAuB,0BAC/B;AAAA,MACC,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,EAAE,mBAAmB,MAAM,CAAC;AAAA,IAClD,CACD;AAAA,IAEA,IAAI,CAAC,SAAS,IAAI;AAAA,MACjB,MAAM,QAAQ,MAAM,SAClB,KAAK,EACL,MAAM,OAAO,EAAE,OAAO,2BAA2B,EAAE;AAAA,MACrD,MAAM,IAAI,MAAM,MAAM,SAAS,0BAA0B;AAAA,IAC1D;AAAA,IAEA,OAAO,SAAS,KAAK;AAAA;AAAA,OAGhB,mBAAkB,CACvB,YACA,MACmC;AAAA,IACnC,MAAM,WAAW,MAAM,MACtB,GAAG,KAAK,uBAAuB,qBAC/B;AAAA,MACC,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU,QAAQ,CAAC,CAAC;AAAA,IAChC,CACD;AAAA,IAEA,IAAI,CAAC,SAAS,IAAI;AAAA,MACjB,MAAM,QAAQ,MAAM,SAClB,KAAK,EACL,MAAM,OAAO,EAAE,OAAO,8BAA8B,EAAE;AAAA,MACxD,MAAM,IAAI,MAAM,MAAM,SAAS,6BAA6B;AAAA,IAC7D;AAAA,IAEA,OAAO,SAAS,KAAK;AAAA;AAEvB;AAEA,IAAM,cAAc,IAAI;AAEjB,SAAS,mBAAmB,CAAC,iBAAgC;AAAA,EACnE,OAAO,WAAS;AAAA,IACf,UAAU,CAAC,YAAY,YAAY,eAAe;AAAA,IAClD,SAAS,MAAM,YAAY,qBAAqB,eAAyB;AAAA,IACzE,SAAS,CAAC,CAAC;AAAA,IACX,WAAW;AAAA,EACZ,CAAC;AAAA;AAGK,SAAS,wBAAwB,GAAG;AAAA,EAC1C,MAAM,cAAc,iBAAe;AAAA,EAEnC,OAAO,aAAY;AAAA,IAClB,YAAY;AAAA,MACX;AAAA,MACA;AAAA,UAIK,YAAY,sBAAsB,iBAAiB,QAAQ,CAAC,CAAC;AAAA,IACnE,WAAW,CAAC,KAAK,sBAAsB;AAAA,MACtC,YAAY,kBAAkB;AAAA,QAC7B,UAAU,CAAC,YAAY,YAAY,eAAe;AAAA,MACnD,CAAC;AAAA;AAAA,EAEH,CAAC;AAAA;AAGK,SAAS,wBAAwB,GAAG;AAAA,EAC1C,MAAM,cAAc,iBAAe;AAAA,EAEnC,OAAO,aAAY;AAAA,IAClB,YAAY,CAAC,eACZ,YAAY,sBAAsB,UAAU;AAAA,IAC7C,WAAW,MAAM;AAAA,MAChB,YAAY,kBAAkB,EAAE,UAAU,CAAC,YAAY,UAAU,EAAE,CAAC;AAAA;AAAA,EAEtE,CAAC;AAAA;AAGK,SAAS,gBAAgB,GAAG;AAAA,EAClC,MAAM,aAAa,wBAAwB,CAAC,UAAU,MAAM,UAAU;AAAA,EAEtE,OAAO,aAAY;AAAA,IAClB,YAAY;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,UAKK,YAAY,cAAc,iBAAiB,mBAAmB,KAAK;AAAA,IACzE,WAAW,CAAC,QAAQ,sBAAsB;AAAA,MACzC,WAAW,iBAAiB;AAAA,QAC3B,IAAI,KAAK;AAAA,QACT,WAAW,KAAK;AAAA,QAChB,OAAO,KAAK;AAAA,QACZ,SAAS,KAAK;AAAA,MACf,CAAC;AAAA;AAAA,EAEH,CAAC;AAAA;AAGK,SAAS,kBAAkB,GAAG;AAAA,EACpC,MAAM,cAAc,iBAAe;AAAA,EAEnC,OAAO,aAAY;AAAA,IAClB,YAAY;AAAA,MACX;AAAA,MACA;AAAA,UAIK,YAAY,mBAAmB,YAAY,IAAI;AAAA,IACrD,WAAW,MAAM;AAAA,MAChB,YAAY,kBAAkB,EAAE,UAAU,iBAAiB,CAAC;AAAA;AAAA,EAE9D,CAAC;AAAA;;;AD5NF,wBAAS,gCAAa;;AAUtB,IAAM,aAAY;AAClB,IAAM,iBAAgB;AACtB,IAAM,aAAY;AAClB,IAAM,aAAY;AAOX,IAAM,kBAAkB,OAAK,SAAS,gBAAe;AAAA,EAC3D;AAAA,EACA;AAAA,GACwB;AAAA,EACxB,MAAM,aAAa,iBAAiB,CAAC,UAAU,MAAM,UAAU;AAAA,EAC/D,MAAM,kBAAkB,iBAAiB,CAAC,UAAU,MAAM,eAAe;AAAA,EACzE,MAAM,aAAa,mBAClB,CAAC,MAAM,EAAE,OAAO,eAAc,cAC/B;AAAA,EACA,MAAM,0BAA0B,iBAC/B,CAAC,UAAU,MAAM,uBAClB;AAAA,EACA,MAAM,wBAAwB,iBAC7B,CAAC,UAAU,MAAM,qBAClB;AAAA,EAEA,OAAO,aAAa,kBAAkB,WAAS,KAAK;AAAA,EACpD,OAAO,YAAY,iBAAiB,WAAS,EAAE;AAAA,EAC/C,OAAO,mBAAmB,wBAAwB,WAAS,KAAK;AAAA,EAChE,OAAO,iBAAiB,sBAAsB,WAE5C,MAAM;AAAA,EACR,MAAM,cAAc,SAA4B,IAAI;AAAA,EACpD,MAAM,iBAAiB,SAAuB,IAAI;AAAA,EAElD;AAAA,IACC,MAAM;AAAA,IACN;AAAA,IACA;AAAA,MACG,oBAAoB,eAAe;AAAA,EACvC,MAAM,iBAAiB,yBAAyB;AAAA,EAChD,MAAM,iBAAiB,iBAAiB;AAAA,EACxC,MAAM,iBAAiB,mBAAmB;AAAA,EAC1C,QAAQ,MAAM,cAAc,aAAa;AAAA,EAEzC,QAAQ,MAAM,iBAAiB,YAC9B,2BAA2B,SAC5B;AAAA,EAEA,QAAQ,MAAM,uBAAuB,YACpC,mBAAmB,SACpB;AAAA,EAGA,iBAAiB,2BAA2B,SAAS;AAAA,EAErD,MAAM,gBAAgB,iBAAiB,2BAA2B,EAAE;AAAA,EAEpE,MAAM,cAAc,iBAAe;AAAA,EACnC,MAAM,cAAc,aAAY;AAAA,IAC/B,YAAY;AAAA,MACX;AAAA,MACA;AAAA,UAIK,UAAU,YAAY,WAAW,EAAE,QAAQ,CAAC;AAAA,IAClD,WAAW,CAAC,KAAK,gBAAgB;AAAA,MAChC,YAAY,kBAAkB,EAAE,UAAU,CAAC,YAAY,SAAS,EAAE,CAAC;AAAA;AAAA,EAErE,CAAC;AAAA,EAED,YAAU,MAAM;AAAA,IACf,IAAI,iBAAiB;AAAA,MACpB,iBAAiB,SAAS,EAAE,mBAAmB,eAAe;AAAA,IAC/D;AAAA,KACE,CAAC,eAAe,CAAC;AAAA,EAEpB,YAAU,MAAM;AAAA,IACf,IAAI,cAAc,UAAU,QAAQ;AAAA,MACnC,MAAM,iBAAiB,aAAa,SAAS,KAC5C,CAAC,MAAM,EAAE,OAAO,uBACjB;AAAA,MACA,IAAI,CAAC,gBAAgB;AAAA,QACpB,sBAAsB,aAAa,SAAS,GAAG,EAAE;AAAA,MAClD;AAAA,IACD,EAAO,SAAI,cAAc,UAAU,WAAW,GAAG;AAAA,MAChD,sBAAsB,IAAI;AAAA,IAC3B;AAAA,KACE,CAAC,cAAc,yBAAyB,qBAAqB,CAAC;AAAA,EAEjE,YAAU,MAAM;AAAA,IACf,eAAe,SAAS,eAAe,EAAE,UAAU,SAAS,CAAC;AAAA,KAC3D,CAAC,CAAC;AAAA,EAEL,MAAM,uBAAuB,cAAY,MAAM;AAAA,IAC9C,MAAM,WAAW,YAAY;AAAA,IAC7B,IAAI,CAAC;AAAA,MAAU;AAAA,IACf,SAAS,MAAM,SAAS;AAAA,IACxB,SAAS,MAAM,SAAS,GAAG,KAAK,IAAI,SAAS,cAAc,GAAG;AAAA,KAC5D,CAAC,CAAC;AAAA,EAEL,YAAU,MAAM;AAAA,IACf,qBAAqB;AAAA,KACnB,CAAC,oBAAoB,CAAC;AAAA,EAEzB,MAAM,kBAAkB,cAAY,YAAY;AAAA,IAC/C,IAAI,CAAC;AAAA,MAAiB;AAAA,IACtB,IAAI;AAAA,MACH,MAAM,SAAS,MAAM,eAAe,YAAY;AAAA,QAC/C;AAAA,QACA,MAAM,CAAC;AAAA,MACR,CAAC;AAAA,MAED,MAAM,QAAQ;AAAA,MACd,sBAAsB,OAAO,QAAQ,EAAE;AAAA,MACvC,eAAe,KAAK;AAAA,MACnB,OAAO,KAAK;AAAA,MACb,QAAQ,MAAM,sCAAsC,GAAG;AAAA;AAAA,KAEtD,CAAC,iBAAiB,gBAAgB,uBAAuB,OAAO,CAAC;AAAA,EAEpE,MAAM,sBAAsB,cAC3B,CAAC,YAA6B;AAAA,IAC7B,sBAAsB,QAAQ,EAAE;AAAA,IAChC,eAAe,KAAK;AAAA,KAErB,CAAC,qBAAqB,CACvB;AAAA,EAEA,MAAM,eAAe,cAAY,YAAY;AAAA,IAC5C,IAAI,CAAC,mBAAmB,CAAC;AAAA,MAAyB;AAAA,IAGlD,MAAM,kBAAkB,oBAAoB,KAC3C,CAAC,MACA,EAAE,SAAS,YACX,EAAE,OAAO,KACR,CAAC,MACA,OAAO,EAAE,YAAY,YACrB,EAAE,QAAQ,SAAS,SAAS,0BAA0B,CACxD,CACF;AAAA,IACA,IAAI,iBAAiB;AAAA,MACpB,mBAAmB,OAAO;AAAA,MAC1B,WAAW,MAAM,mBAAmB,MAAM,GAAG,IAAI;AAAA,MACjD;AAAA,IACD;AAAA,IAGA,MAAM,MAAM,IAAI;AAAA,IAChB,MAAM,UAAU,IAAI,mBAAmB,CAAC,GAAG;AAAA,MAC1C,MAAM;AAAA,MACN,QAAQ;AAAA,IACT,CAAC;AAAA,IACD,MAAM,QAAQ,YAAY;AAAA,IAE1B,IAAI;AAAA,MACH,MAAM,eAAe,YAAY;AAAA,QAChC;AAAA,QACA,mBAAmB;AAAA,QACnB;AAAA,MACD,CAAC;AAAA,MACD,mBAAmB,SAAS;AAAA,MAC5B,WAAW,MAAM,mBAAmB,MAAM,GAAG,IAAI;AAAA,MAEjD,YAAY,kBAAkB;AAAA,QAC7B,UAAU,CAAC,YAAY,eAAe;AAAA,MACvC,CAAC;AAAA,MACA,OAAO,KAAK;AAAA,MACb,QAAQ,MAAM,6BAA6B,GAAG;AAAA,MAC9C,mBAAmB,OAAO;AAAA,MAC1B,WAAW,MAAM,mBAAmB,MAAM,GAAG,IAAI;AAAA;AAAA,KAEhD;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAC;AAAA,EAED,MAAM,eAAe,cAAY,YAAY;AAAA,IAC5C,IAAI,CAAC;AAAA,MAAyB;AAAA,IAC9B,IAAI;AAAA,MACH,MAAM,SAAS,MAAM,eAAe,YAAY;AAAA,QAC/C,YAAY;AAAA,MACb,CAAC;AAAA,MACD,IAAI,uBAAuB,OAAO,YAAY,IAAI;AAAA,QACjD,oBAAoB,OAAO,WAAW,EAAE;AAAA,MACzC;AAAA,MACC,OAAO,KAAK;AAAA,MACb,QAAQ,MAAM,gCAAgC,GAAG;AAAA;AAAA,KAEhD,CAAC,yBAAyB,gBAAgB,mBAAmB,CAAC;AAAA,EAEjE,MAAM,oBAAoB,cAAY,YAAY;AAAA,IACjD,IAAI,CAAC,WAAW,KAAK,KAAK,CAAC;AAAA,MAAiB;AAAA,IAC5C,IAAI;AAAA,MACH,IAAI,YAAY;AAAA,MAEhB,IAAI,CAAC,WAAW;AAAA,QACf,MAAM,SAAS,MAAM,eAAe,YAAY;AAAA,UAC/C;AAAA,UACA,MAAM,CAAC;AAAA,QACR,CAAC;AAAA,QACD,YAAY,OAAO,QAAQ;AAAA,QAC3B,sBAAsB,SAAS;AAAA,MAChC;AAAA,MAEA,MAAM,YAAY,YAAY;AAAA,QAC7B;AAAA,QACA,SAAS;AAAA,MACV,CAAC;AAAA,MACD,cAAc,EAAE;AAAA,MAChB,IAAI,YAAY,SAAS;AAAA,QACxB,YAAY,QAAQ,MAAM,SAAS;AAAA,MACpC;AAAA,MACC,OAAO,KAAK;AAAA,MACb,QAAQ,MAAM,2BAA2B,GAAG;AAAA;AAAA,KAE3C;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAC;AAAA,EAED,MAAM,gBAAgB,cACrB,CAAC,MAA2B;AAAA,IAC3B,IAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,UAAU;AAAA,MACrC,EAAE,eAAe;AAAA,MACjB,kBAAkB;AAAA,IACnB;AAAA,KAED,CAAC,iBAAiB,CACnB;AAAA,EAEA,MAAM,eAAe,UACpB,MACC,cAAc,KACb,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,WAAW,SAC/C,KAAK,OACN,CAAC,YAAY,CACd;AAAA,EAEA,MAAM,oBAAoB,UAAQ,MAAM;AAAA,IACvC,IAAI,CAAC,2BAA2B,CAAC;AAAA,MAAoB,OAAO;AAAA,IAC5D,OAAO,mBAAmB,KACzB,CAAC,MACA,EAAE,SAAS,YACX,EAAE,OAAO,KACR,CAAC,MACA,OAAO,EAAE,YAAY,YACrB,EAAE,QAAQ,SAAS,SAAS,0BAA0B,CACxD,CACF;AAAA,KACE,CAAC,yBAAyB,kBAAkB,CAAC;AAAA,EAEhD,MAAM,oBAAoB,cACzB,OAAO,aAAqB,aAAqB;AAAA,IAChD,IAAI,CAAC,yBAAyB;AAAA,MAC7B,qBAAqB,KAAK;AAAA,MAC1B;AAAA,IACD;AAAA,IACA,IAAI;AAAA,MACH,MAAM,cAAc,YAAY;AAAA,QAC/B,UAAU;AAAA,QACV,OAAO;AAAA,MACR,CAAC;AAAA,MACD,MAAM,YAAY,kBAAkB;AAAA,QACnC,UAAU,CAAC,YAAY,YAAY,eAAe;AAAA,MACnD,CAAC;AAAA,MACD,qBAAqB,KAAK;AAAA,MACzB,OAAO,KAAK;AAAA,MACb,QAAQ,MAAM,4CAA4C,GAAG;AAAA;AAAA,KAG/D,CAAC,yBAAyB,eAAe,aAAa,eAAe,CACtE;AAAA,EAEA,MAAM,gBAAgB,WAAW,mBAAmB,EAAE;AAAA,EAEtD,IAAI,CAAC;AAAA,IAAY,OAAO;AAAA,EAExB,MAAM,WAAW,cAAc,YAAY,CAAC;AAAA,EAC5C,MAAM,gBAAgB,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,uBAAuB;AAAA,EAC3E,MAAM,WAAW,gBAAgB,CAAC;AAAA,EAElC,MAAM,oBACL,eAAe,YAAY,eAAe,YAAY;AAAA,EACvD,MAAM,iBAAiB,eAAe,SAAS,eAAe,SAAS;AAAA,EAEvE,MAAM,uBACL,YAAY,oBAAoB,SAAS;AAAA,EAC1C,MAAM,oBACL,YAAY,oBAAoB,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,cAAc,GACvE,SAAS;AAAA,EAEb,uBACC,OA8TE,OA9TF;AAAA,IACC,WAAU;AAAA,IACV,OAAO,EAAE,OAAO,WAAW;AAAA,IAF5B,UA8TE;AAAA,sBA1TD,MAAC,cAAD;AAAA,QACC,UAAU;AAAA,QACV,MAAK;AAAA,QACL,UAAU;AAAA,QACV,UAAU;AAAA,QACV,cAAc;AAAA,OACf;AAAA,sBACA,OAkTE,OAlTF;AAAA,QAAK,WAAU;AAAA,QAAf,UAkTE;AAAA,0BAhTD,OAyCE,OAzCF;AAAA,YAAK,WAAU;AAAA,YAAf,UAyCE;AAAA,8BAxCD,OAKE,OALF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UAKE;AAAA,kCAJD,MAAC,eAAD;AAAA,oBAAc,WAAU;AAAA,mBAAwB;AAAA,kCAChD,MAEE,QAFF;AAAA,oBAAM,WAAU;AAAA,oBAAhB;AAAA,mBAEE;AAAA;AAAA,eACD;AAAA,8BACF,OAiCE,OAjCF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UAiCE;AAAA,kCAhCD,MAQE,QARF;AAAA,oBACC,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,SAAS,MAAM,eAAe,CAAC,WAAW;AAAA,oBAC1C,OAAM;AAAA,oBACN,WAAU;AAAA,oBALX,0BAOC,MAAC,SAAD;AAAA,sBAAS,WAAU;AAAA,qBAAU;AAAA,mBAC5B;AAAA,kCACF,MAaE,QAbF;AAAA,oBACC,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,SAAS;AAAA,oBACT,UAAU,CAAC,mBAAmB,eAAe;AAAA,oBAC7C,OAAM;AAAA,oBACN,WAAU;AAAA,oBANX,UAQE,eAAe,4BACf,MAAC,UAAD;AAAA,sBAAS,WAAU;AAAA,qBAAuB,oBAE1C,MAAC,OAAD;AAAA,sBAAM,WAAU;AAAA,qBAAU;AAAA,mBAE1B;AAAA,kCACF,MAQE,QARF;AAAA,oBACC,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,SAAS;AAAA,oBACT,OAAM;AAAA,oBACN,WAAU;AAAA,oBALX,0BAOC,MAAC,gBAAD;AAAA,sBAAc,WAAU;AAAA,qBAAU;AAAA,mBACjC;AAAA;AAAA,eACD;AAAA;AAAA,WACD;AAAA,UAED,8BACA,OAwCE,OAxCF;AAAA,YAAK,WAAU;AAAA,YAAf,UAwCE;AAAA,8BAvCD,MAIE,OAJF;AAAA,gBAAK,WAAU;AAAA,gBAAf,0BACC,MAEE,OAFF;AAAA,kBAAK,WAAU;AAAA,kBAAf;AAAA,iBAEE;AAAA,eACD;AAAA,cACD,4BACA,MAEE,OAFF;AAAA,gBAAK,WAAU;AAAA,gBAAf;AAAA,eAEE,IACC,SAAS,WAAW,oBACvB,MAEE,OAFF;AAAA,gBAAK,WAAU;AAAA,gBAAf;AAAA,eAEE,oBAEF,MAuBE,OAvBF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UACE,SAAS,IAAI,CAAC,4BACd,OAmBE,UAnBF;AAAA,kBACC,MAAK;AAAA,kBAEL,SAAS,MAAM,oBAAoB,OAAO;AAAA,kBAC1C,WAAW,6DACV,QAAQ,OAAO,0BACZ,6DACA;AAAA,kBAPL,UAmBE;AAAA,oCATD,MAEE,OAFF;AAAA,sBAAK,WAAU;AAAA,sBAAf,UACE,QAAQ,SAAS;AAAA,qBACjB;AAAA,oCACF,OAKE,OALF;AAAA,sBAAK,WAAU;AAAA,sBAAf,UAKE;AAAA,wBAJA,QAAQ;AAAA,wBADV;AAAA,wBACkC;AAAA,wBAChC,mBACA,QAAQ,gBAAgB,QAAQ,SACjC;AAAA;AAAA,qBACC;AAAA;AAAA,mBAhBG,QAAQ,EAiBZ,CACF;AAAA,eACA;AAAA;AAAA,WAEF,oBAEF;AAAA,sBAqLE;AAAA,8BAnLD,MAoDE,OApDF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UACE,CAAC,0CACD,OAGE,OAHF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAGE;AAAA,oCAFD,MAAC,eAAD;AAAA,sBAAc,WAAU;AAAA,qBAAgD;AAAA,oCACxE,MAAkD,KAAlD;AAAA;AAAA,qBAAkD;AAAA;AAAA,iBACjD,IACC,SAAS,WAAW,oBACvB,MAEE,OAFF;AAAA,kBAAK,WAAU;AAAA,kBAAf,0BACC,MAAyC,KAAzC;AAAA;AAAA,mBAAyC;AAAA,iBACxC,oBAEF,OAuCE,OAvCF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAuCE;AAAA,oBAtCA,SAAS,IAAI,CAAC,KAAK,UAAU;AAAA,sBAC7B,IAAI,IAAI,SAAS,QAAQ;AAAA,wBACxB,MAAM,UAAU,SAAS,QAAQ;AAAA,wBACjC,uBACC,MAAC,kBAAD;AAAA,0BAEC,WAAW;AAAA,0BACX,SAAS;AAAA,0BACT,SAAS,UAAU;AAAA,0BACnB,wBACC,SAAS,SAAS,cACf,QAAQ,KACR;AAAA,2BAPC,IAAI,EASV;AAAA,sBAEF;AAAA,sBACA,IAAI,IAAI,SAAS,aAAa;AAAA,wBAC7B,MAAM,UAAU,QAAQ,IAAI,SAAS,QAAQ,KAAK;AAAA,wBAClD,MAAM,UAAU,SAAS,QAAQ;AAAA,wBACjC,MAAM,aAAa,SAAS,SAAS;AAAA,wBACrC,MAAM,mBAAmB,SAAS,SAAS;AAAA,wBAC3C,uBACC,MAAC,uBAAD;AAAA,0BAEC,WAAW;AAAA,0BACX,SAAS;AAAA,0BACT;AAAA,0BACA,yBAAyB;AAAA,0BACzB,eAAe,UAAU,SAAS,SAAS;AAAA,0BAC3C,SAAO;AAAA,0BACP;AAAA,2BAPK,IAAI,EAQV;AAAA,sBAEF;AAAA,sBACA,OAAO;AAAA,qBACP;AAAA,oCACD,MAAC,OAAD;AAAA,sBAAK,KAAK;AAAA,qBAAgB;AAAA;AAAA,iBACzB;AAAA,eAEF;AAAA,8BAGF,OA2HE,OA3HF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UA2HE;AAAA,kCA1HD,MAwCE,OAxCF;AAAA,oBAAK,WAAU;AAAA,oBAAf,0BACC,OAsCE,OAtCF;AAAA,sBAAK,WAAU;AAAA,sBAAf,UAsCE;AAAA,wCArCD,MAAC,UAAD;AAAA,0BACC,KAAK;AAAA,0BACL,OAAO;AAAA,0BACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,0BAC7C,WAAW;AAAA,0BACX,aAAY;AAAA,0BACZ,UACC,CAAC,mBACD,YAAY,aACZ,eAAe;AAAA,0BAEhB,MAAM;AAAA,0BACN,WAAU;AAAA,0BACV,OAAO,EAAE,QAAQ,UAAU;AAAA,yBAC5B;AAAA,wCACA,MAqBE,UArBF;AAAA,0BACC,MAAK;AAAA,0BACL,SAAS;AAAA,0BACT,UACC,CAAC,WAAW,KAAK,KACjB,CAAC,mBACD,YAAY,aACZ,eAAe,aACf;AAAA,0BAED,WAAW,yFACV,WAAW,KAAK,KAAK,mBAAmB,CAAC,eACtC,6CACA;AAAA,0BAbL,UAgBE,YAAY,aAAa,eAAe,4BACxC,MAAC,UAAD;AAAA,4BAAS,WAAU;AAAA,2BAAuB,oBAE1C,MAAC,UAAD;AAAA,4BAAS,WAAU;AAAA,2BAAU;AAAA,yBAE7B;AAAA;AAAA,qBACD;AAAA,mBACD;AAAA,kBAGD,oBAAoB,6BACpB,OAYE,OAZF;AAAA,oBAAK,WAAU;AAAA,oBAAf,UAYE;AAAA,sCAXD,MAAC,QAAD;AAAA,wBAAO,WAAU;AAAA,uBAAwB;AAAA,sCACzC,MAEE,QAFF;AAAA,wBAAM,WAAU;AAAA,wBAAhB;AAAA,uBAEE;AAAA,sCACF,MAME,UANF;AAAA,wBACC,MAAK;AAAA,wBACL,SAAS,MAAM,mBAAmB,MAAM;AAAA,wBACxC,WAAU;AAAA,wBAHX,0BAKC,MAAC,KAAD;AAAA,0BAAG,WAAU;AAAA,yBAAU;AAAA,uBACtB;AAAA;AAAA,mBACD;AAAA,kBAEF,oBAAoB,2BACpB,OAUE,OAVF;AAAA,oBAAK,WAAU;AAAA,oBAAf,UAUE;AAAA,sCATD,MAAC,KAAD;AAAA,wBAAG,WAAU;AAAA,uBAAwB;AAAA,sCACrC,MAAmD,QAAnD;AAAA,wBAAM,WAAU;AAAA,wBAAhB;AAAA,uBAAmD;AAAA,sCACnD,MAME,UANF;AAAA,wBACC,MAAK;AAAA,wBACL,SAAS,MAAM,mBAAmB,MAAM;AAAA,wBACxC,WAAU;AAAA,wBAHX,0BAKC,MAAC,KAAD;AAAA,0BAAG,WAAU;AAAA,yBAAU;AAAA,uBACtB;AAAA;AAAA,mBACD;AAAA,kCAIH,OAgDE,OAhDF;AAAA,oBAAK,WAAU;AAAA,oBAAf,UAgDE;AAAA,sCA/CD,OA4BE,UA5BF;AAAA,wBACC,MAAK;AAAA,wBACL,SAAS;AAAA,wBACT,UACC,CAAC,2BACD,eAAe,aACf,gBACA;AAAA,wBAED,WAAW,oJACV,oBACG,8EACA;AAAA,wBAEJ,OACC,oBACG,uCACA;AAAA,wBAjBL,UA4BE;AAAA,0BARA,eAAe,4BACf,MAAC,UAAD;AAAA,4BAAS,WAAU;AAAA,2BAAuB,IACvC,oCACH,MAAC,QAAD;AAAA,4BAAO,WAAU;AAAA,2BAAU,oBAE3B,MAAC,iBAAD;AAAA,4BAAiB,WAAU;AAAA,2BAAU;AAAA,0BAErC,oBAAoB,aAAa;AAAA;AAAA,uBACjC;AAAA,sCACF,OAiBE,UAjBF;AAAA,wBACC,MAAK;AAAA,wBACL,SAAS;AAAA,wBACT,UACC,CAAC,2BACD,eAAe,aACf;AAAA,wBAED,WAAU;AAAA,wBACV,OAAM;AAAA,wBATP,UAiBE;AAAA,0BANA,eAAe,4BACf,MAAC,UAAD;AAAA,4BAAS,WAAU;AAAA,2BAAuB,oBAE1C,MAAC,eAAD;AAAA,4BAAc,WAAU;AAAA,2BAAU;AAAA,0BAdpC;AAAA;AAAA,uBAiBE;AAAA;AAAA,mBACD;AAAA;AAAA,eACD;AAAA;AAAA,WACD;AAAA,0BAIH,OAgBE,OAhBF;AAAA,YAAK,WAAU;AAAA,YAAf,UAgBE;AAAA,8BAfD,OAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UAEE;AAAA,kBADA,SAAS;AAAA,kBADX;AAAA,kBACoC,SAAS,WAAW,IAAI,MAAM;AAAA;AAAA,eAChE;AAAA,eACA,wBAAwB,sCACzB,OASE,UATF;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM,qBAAqB,IAAI;AAAA,gBACxC,WAAU;AAAA,gBAHX,UASE;AAAA,kCAJD,MAAqD,QAArD;AAAA,oBAAM,WAAU;AAAA,oBAAhB,UAA8B;AAAA,mBAAuB;AAAA,kCACrD,MAAgC,QAAhC;AAAA,oBAAM,WAAU;AAAA,oBAAhB;AAAA,mBAAgC;AAAA,kCAChC,MAA2B,QAA3B;AAAA,8BAAO;AAAA,mBAAoB;AAAA,kCAC3B,MAAC,cAAD;AAAA,oBAAa,WAAU;AAAA,mBAAqB;AAAA;AAAA,eAC3C;AAAA;AAAA,WAEF;AAAA,0BAGF,MAaE,OAbF;AAAA,YACC,QAAQ;AAAA,YACR,SAAS,MAAM,qBAAqB,KAAK;AAAA,YACzC,OAAM;AAAA,YACN,UAAS;AAAA,YAJV,WAMG,qBAAqB,mCACtB,MAAC,sBAAD;AAAA,cACC,UAAU;AAAA,cACV,OAAO;AAAA,cACP,UAAU;AAAA,aACX;AAAA,WAEA;AAAA;AAAA,OACD;AAAA;AAAA,GACD;AAAA,CAEH;AAED,SAAS,kBAAkB,CAAC,WAA2B;AAAA,EACtD,MAAM,OAAO,KAAK,IAAI,IAAI;AAAA,EAC1B,MAAM,UAAU,KAAK,MAAM,OAAO,KAAK;AAAA,EACvC,IAAI,UAAU;AAAA,IAAG,OAAO;AAAA,EACxB,IAAI,UAAU;AAAA,IAAI,OAAO,GAAG;AAAA,EAC5B,MAAM,QAAQ,KAAK,MAAM,UAAU,EAAE;AAAA,EACrC,IAAI,QAAQ;AAAA,IAAI,OAAO,GAAG;AAAA,EAC1B,MAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;AAAA,EAClC,OAAO,GAAG;AAAA;;AE7pBX,iBAAS;AACT,yBAAS;;AAQF,IAAM,wBAAwB,OAAK,SAAS,sBAAqB;AAAA,EACvE;AAAA,GAC8B;AAAA,EAC9B,MAAM,aAAa,iBAAiB,CAAC,UAAU,MAAM,UAAU;AAAA,EAC/D,MAAM,gBAAgB,iBAAiB,CAAC,UAAU,MAAM,aAAa;AAAA,EACrE,QAAQ,SAAS,oBAAoB,mBAAmB,IAAI;AAAA,EAE5D,MAAM,eAAe,MAAM,UAAU,UAAU;AAAA,EAE/C,uBACC,OAgBE,UAhBF;AAAA,IACC,MAAK;AAAA,IACL,SAAS;AAAA,IACT,WAAW,yGACV,aACG,4BACA;AAAA,IAEJ,OAAM;AAAA,IARP,UAgBE;AAAA,sBAND,MAAC,eAAD;AAAA,QAAc,WAAU;AAAA,OAAwC;AAAA,MAC/D,eAAe,qBACf,MAEE,QAFF;AAAA,QAAM,WAAU;AAAA,QAAhB,UACE,eAAe,IAAI,OAAO;AAAA,OAC1B;AAAA;AAAA,GAEF;AAAA,CAEH;;ACrCD,iBAAS,oBAAM,uBAAU,0BAAS;AAClC;AAAA,cACC;AAAA,kBACA;AAAA,YACA;AAAA;AAAA;AAAA,UAGA;AAAA,iBACA;AAAA,eACA;AAAA,UACA;AAAA,YACA;AAAA,UACA;AAAA,WACA;AAAA;AAAA,aAEA;AAAA;AAED;;;ACjBA,mBAAS;AA6CT,IAAM,QAA0B,CAAC,UAAU,UAAU;AAE9C,IAAM,qBAAqB,SAAwB,CAAC,KAAK,SAAS;AAAA,EACxE,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,SAAS,CAAC,WAAW,IAAI,EAAE,OAAO,CAAC;AAAA,EACnC,SAAS,CAAC,gBAAgB,IAAI,EAAE,YAAY,CAAC;AAAA,EAC7C,eAAe,CAAC,eAAe,IAAI,EAAE,WAAW,CAAC;AAAA,EACjD,YAAY,CAAC,cAAc,IAAI,EAAE,UAAU,CAAC;AAAA,EAC5C,UAAU,CAAC,UAAU,IAAI,EAAE,MAAM,CAAC;AAAA,EAClC,eAAe,CAAC,eAAe,IAAI,EAAE,WAAW,CAAC;AAAA,EACjD,UAAU,MAAM;AAAA,IACf,QAAQ,gBAAgB,IAAI;AAAA,IAC5B,MAAM,eAAe,MAAM,QAAQ,WAAW;AAAA,IAC9C,IAAI,eAAe,MAAM,SAAS,GAAG;AAAA,MACpC,IAAI,EAAE,aAAa,MAAM,eAAe,GAAG,CAAC;AAAA,IAC7C;AAAA;AAAA,EAED,UAAU,MAAM;AAAA,IACf,QAAQ,gBAAgB,IAAI;AAAA,IAC5B,MAAM,eAAe,MAAM,QAAQ,WAAW;AAAA,IAC9C,IAAI,eAAe,GAAG;AAAA,MACrB,IAAI,EAAE,aAAa,MAAM,eAAe,GAAG,CAAC;AAAA,IAC7C;AAAA;AAAA,EAED,OAAO,MACN,IAAI;AAAA,IACH,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,OAAO;AAAA,EACR,CAAC;AACH,EAAE;;;AClFF,sBAAS,4BAAW,2BAAa,sBAAU;AAC3C,2BAAS;AAIT,IAAM,aAAa,OAAO,WAAW,eAAe,OAAO,SAAS,OAAO;AAEpE,SAAS,aAAa,GAAG;AAAA,EAC/B,MAAM,gBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa;AAAA,EAC/D,MAAM,UAAU,mBAAmB,CAAC,MAAM,EAAE,OAAO;AAAA,EACnD,MAAM,aAAa,mBAAmB,CAAC,MAAM,EAAE,UAAU;AAAA,EACzD,MAAM,WAAW,mBAAmB,CAAC,MAAM,EAAE,QAAQ;AAAA,EACrD,MAAM,aAAa,mBAAmB,CAAC,MAAM,EAAE,UAAU;AAAA,EACzD,MAAM,SAAS,mBAAmB,CAAC,MAAM,EAAE,MAAM;AAAA,EACjD,MAAM,cAAc,iBAAe;AAAA,EAEnC,OAAO,aAAa,kBAAkB,WAAS,KAAK;AAAA,EACpD,OAAO,cAAc,mBAAmB,WAAS,KAAK;AAAA,EACtD,MAAM,kBAAkB,SAA8C,IAAI;AAAA,EAC1E,MAAM,uBAAuB,SAAoB,IAAI,GAAK;AAAA,EAE1D,MAAM,kBAAkB,cAAY,YAAY;AAAA,IAC/C,WAAW,IAAI;AAAA,IACf,SAAS,IAAI;AAAA,IACb,IAAI;AAAA,MACH,MAAM,SAAS,MAAM,UAAU,cAAc;AAAA,MAC7C,cAAc,MAAM;AAAA,MACpB,YAAY,kBAAkB,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC;AAAA,MACtD,YAAY,kBAAkB,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC;AAAA,MACtD,OAAO;AAAA,MACN,OAAO,KAAK;AAAA,MACb,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU;AAAA,MACrD,SAAS,OAAO;AAAA,MAChB,OAAO;AAAA,cACN;AAAA,MACD,WAAW,KAAK;AAAA;AAAA,KAEf,CAAC,eAAe,YAAY,UAAU,WAAW,CAAC;AAAA,EAErD,MAAM,kBAAkB,cAAY,YAAY;AAAA,IAC/C,MAAM,SAAS,MAAM,gBAAgB;AAAA,IACrC,IAAI,QAAQ;AAAA,MACX,MAAM,iBAAiB,OAAO,OAAO,OAAO,SAAS,EAAE,KACtD,CAAC,MAAM,EAAE,UACV;AAAA,MACA,MAAM,kBACL,CAAC,OAAO,sBACR,CAAC,kBACD,CAAC,OAAO,KAAK;AAAA,MACd,IAAI,iBAAiB;AAAA,QACpB,QAAQ,IAAI;AAAA,MACb;AAAA,IACD;AAAA,IACA,eAAe,IAAI;AAAA,KACjB,CAAC,iBAAiB,OAAO,CAAC;AAAA,EAE7B,MAAM,cAAc,cAAY,YAAY;AAAA,IAC3C,WAAW,IAAI;AAAA,IACf,SAAS,IAAI;AAAA,IACb,IAAI;AAAA,MACH,MAAM,SAAS,MAAM,UAAU,gBAAgB;AAAA,MAC/C,MAAM,gBAAgB;AAAA,MACtB,OAAO;AAAA,MACN,OAAO,KAAK;AAAA,MACb,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU;AAAA,MACrD,SAAS,OAAO;AAAA,MAChB,MAAM;AAAA,cACL;AAAA,MACD,WAAW,KAAK;AAAA;AAAA,KAEf,CAAC,iBAAiB,YAAY,QAAQ,CAAC;AAAA,EAE1C,MAAM,eAAe,cACpB,OAAO,eAAuB;AAAA,IAC7B,WAAW,IAAI;AAAA,IACf,SAAS,IAAI;AAAA,IACb,IAAI;AAAA,MACH,MAAM,SAAS,MAAM,UAAU,iBAAiB,UAAU;AAAA,MAC1D,MAAM,gBAAgB;AAAA,MACtB,OAAO;AAAA,MACN,OAAO,KAAK;AAAA,MACb,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU;AAAA,MACrD,SAAS,OAAO;AAAA,MAChB,MAAM;AAAA,cACL;AAAA,MACD,WAAW,KAAK;AAAA;AAAA,KAGlB,CAAC,iBAAiB,YAAY,QAAQ,CACvC;AAAA,EAEA,MAAM,cAAc,cACnB,OAAO,UAAkB,WAAmB;AAAA,IAC3C,WAAW,IAAI;AAAA,IACf,SAAS,IAAI;AAAA,IACb,IAAI;AAAA,MACH,MAAM,SAAS,MAAM,UAAU,YAAY,UAAU,MAAM;AAAA,MAC3D,MAAM,gBAAgB;AAAA,MACtB,OAAO;AAAA,MACN,OAAO,KAAK;AAAA,MACb,MAAM,UACL,eAAe,QAAQ,IAAI,UAAU;AAAA,MACtC,SAAS,OAAO;AAAA,MAChB,MAAM;AAAA,cACL;AAAA,MACD,WAAW,KAAK;AAAA;AAAA,KAGlB,CAAC,iBAAiB,YAAY,QAAQ,CACvC;AAAA,EAEA,MAAM,iBAAiB,cACtB,OAAO,aAAqB;AAAA,IAC3B,WAAW,IAAI;AAAA,IACf,SAAS,IAAI;AAAA,IACb,IAAI;AAAA,MACH,MAAM,SAAS,MAAM,UAAU,eAAe,QAAQ;AAAA,MACtD,MAAM,gBAAgB;AAAA,MACtB,OAAO;AAAA,MACN,OAAO,KAAK;AAAA,MACb,MAAM,UACL,eAAe,QAAQ,IAAI,UAAU;AAAA,MACtC,SAAS,OAAO;AAAA,MAChB,MAAM;AAAA,cACL;AAAA,MACD,WAAW,KAAK;AAAA;AAAA,KAGlB,CAAC,iBAAiB,YAAY,QAAQ,CACvC;AAAA,EAEA,MAAM,qBAAqB,cAAY,YAAY;AAAA,IAClD,WAAW,IAAI;AAAA,IACf,SAAS,IAAI;AAAA,IACb,IAAI;AAAA,MACH,MAAM,UAAU,mBAAmB;AAAA,MACnC,MAAM,gBAAgB;AAAA,MACtB,QAAQ,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACb,MAAM,UACL,eAAe,QAAQ,IAAI,UAAU;AAAA,MACtC,SAAS,OAAO;AAAA,MAChB,MAAM;AAAA,cACL;AAAA,MACD,WAAW,KAAK;AAAA;AAAA,KAEf,CAAC,iBAAiB,YAAY,UAAU,OAAO,CAAC;AAAA,EAEnD,MAAM,8BAA8B,cAAY,MAAM;AAAA,IACrD,MAAM,SAAS,mBAAmB,SAAS,EAAE;AAAA,IAC7C,IAAI,QAAQ;AAAA,MACX,qBAAqB,UAAU,IAAI,IAClC,OAAO,QAAQ,OAAO,SAAS,EAC7B,OAAO,IAAI,OAAO,EAAE,UAAU,EAC9B,IAAI,EAAE,QAAQ,EAAE,CACnB;AAAA,IACD;AAAA,KACE,CAAC,CAAC;AAAA,EAEL,MAAM,aAAa,cAClB,CAAC,UAAkB,SAAkB;AAAA,IACpC,MAAM,MAAM,UAAU,iBAAiB,UAAU,IAAI;AAAA,IACrD,IAAI,YAAY;AAAA,MACf,4BAA4B;AAAA,MAC5B,OAAO,OAAO,YAAY,EAAE,MAAM,iBAAiB,IAAI,GAAG,GAAG;AAAA,MAC7D,gBAAgB,IAAI;AAAA,MACpB,OAAO;AAAA,IACR;AAAA,IACA,MAAM,QAAQ;AAAA,IACd,MAAM,SAAS;AAAA,IACf,MAAM,OAAO,OAAO,WAAW,OAAO,aAAa,SAAS;AAAA,IAC5D,MAAM,MAAM,OAAO,WAAW,OAAO,cAAc,UAAU;AAAA,IAC7D,MAAM,QAAQ,OAAO,KACpB,KACA,eACA,SAAS,gBAAgB,eAAe,YAAY,2BACrD;AAAA,IACA,OAAO;AAAA,KAER,CAAC,2BAA2B,CAC7B;AAAA,EAEA,MAAM,mBAAmB,cACxB,OAAO,UAAkB,SAAkB;AAAA,IAC1C,QAAQ,KAAK,cAAc,MAAM,UAAU,YAAY,UAAU,IAAI;AAAA,IAErE,IAAI,YAAY;AAAA,MACf,4BAA4B;AAAA,MAC5B,OAAO,OAAO,YAAY,EAAE,MAAM,iBAAiB,IAAI,GAAG,GAAG;AAAA,MAC7D,gBAAgB,IAAI;AAAA,MACpB,OAAO,EAAE,OAAO,MAAM,UAAU;AAAA,IACjC;AAAA,IAEA,MAAM,QAAQ;AAAA,IACd,MAAM,SAAS;AAAA,IACf,MAAM,OAAO,OAAO,WAAW,OAAO,aAAa,SAAS;AAAA,IAC5D,MAAM,MAAM,OAAO,WAAW,OAAO,cAAc,UAAU;AAAA,IAC7D,MAAM,QAAQ,OAAO,KACpB,KACA,eACA,SAAS,gBAAgB,eAAe,YAAY,2BACrD;AAAA,IACA,OAAO,EAAE,OAAO,UAAU;AAAA,KAE3B,CAAC,2BAA2B,CAC7B;AAAA,EAEA,MAAM,oBAAoB,cACzB,OAAO,UAAkB,MAAc,cAAsB;AAAA,IAC5D,WAAW,IAAI;AAAA,IACf,SAAS,IAAI;AAAA,IACb,IAAI;AAAA,MACH,MAAM,UAAU,kBAAkB,UAAU,MAAM,SAAS;AAAA,MAC3D,MAAM,gBAAgB;AAAA,MACtB,OAAO;AAAA,MACN,OAAO,KAAK;AAAA,MACb,MAAM,UACL,eAAe,QAAQ,IAAI,UAAU;AAAA,MACtC,SAAS,OAAO;AAAA,MAChB,MAAM;AAAA,cACL;AAAA,MACD,WAAW,KAAK;AAAA;AAAA,KAGlB,CAAC,iBAAiB,YAAY,QAAQ,CACvC;AAAA,EAEA,YAAU,MAAM;AAAA,IACf,IAAI,CAAC,gBAAgB,CAAC;AAAA,MAAY;AAAA,IAClC,gBAAgB,UAAU,YAAY,MAAM;AAAA,MAC3C,gBAAgB;AAAA,OACd,IAAI;AAAA,IACP,MAAM,UAAU,WAAW,MAAM;AAAA,MAChC,gBAAgB,KAAK;AAAA,OACnB,MAAM;AAAA,IACT,OAAO,MAAM;AAAA,MACZ,cAAc,gBAAgB,OAAO;AAAA,MACrC,aAAa,OAAO;AAAA;AAAA,KAEnB,CAAC,cAAc,eAAe,CAAC;AAAA,EAElC,YAAU,MAAM;AAAA,IACf,IAAI,CAAC,gBAAgB,CAAC;AAAA,MAAY;AAAA,IAClC,MAAM,oBAAoB,OAAO,QAAQ,WAAW,SAAS,EAAE,OAC9D,IAAI,OAAO,EAAE,UACd;AAAA,IACA,MAAM,iBAAiB,kBAAkB,KACxC,EAAE,QAAQ,CAAC,qBAAqB,QAAQ,IAAI,EAAE,CAC/C;AAAA,IACA,IAAI,gBAAgB;AAAA,MACnB,gBAAgB,KAAK;AAAA,IACtB;AAAA,KACE,CAAC,YAAY,YAAY,CAAC;AAAA,EAE7B,YAAU,MAAM;AAAA,IACf,MAAM,qBAAqB,CAAC,UAAwB;AAAA,MACnD,IAAI,MAAM,MAAM,SAAS,iBAAiB;AAAA,QACzC,gBAAgB;AAAA,MACjB;AAAA;AAAA,IAGD,OAAO,iBAAiB,WAAW,kBAAkB;AAAA,IACrD,OAAO,MAAM,OAAO,oBAAoB,WAAW,kBAAkB;AAAA,KACnE,CAAC,eAAe,CAAC;AAAA,EAEpB,MAAM,wBAAwB,cAC7B,OAAO,cAAsB;AAAA,IAC5B,MAAM,SAAS,MAAM,UAAU,sBAAsB,SAAS;AAAA,IAC9D,IAAI,OAAO,WAAW,YAAY;AAAA,MACjC,MAAM,gBAAgB;AAAA,IACvB;AAAA,IACA,OAAO;AAAA,KAER,CAAC,eAAe,CACjB;AAAA,EAEA,MAAM,mBAAmB,cACxB,OAAO,UAAkB;AAAA,IACxB,WAAW,IAAI;AAAA,IACf,SAAS,IAAI;AAAA,IACb,IAAI;AAAA,MACH,MAAM,SAAS,MAAM,UAAU,iBAAiB,KAAK;AAAA,MACrD,MAAM,gBAAgB;AAAA,MACtB,OAAO;AAAA,MACN,OAAO,KAAK;AAAA,MACb,MAAM,UACL,eAAe,QAAQ,IAAI,UAAU;AAAA,MACtC,SAAS,OAAO;AAAA,MAChB,MAAM;AAAA,cACL;AAAA,MACD,WAAW,KAAK;AAAA;AAAA,KAGlB,CAAC,iBAAiB,YAAY,QAAQ,CACvC;AAAA,EAEA,MAAM,2BAA2B,cAAY,YAAY;AAAA,IACxD,WAAW,IAAI;AAAA,IACf,SAAS,IAAI;AAAA,IACb,IAAI;AAAA,MACH,MAAM,SAAS,MAAM,UAAU,yBAAyB;AAAA,MACxD,MAAM,gBAAgB;AAAA,MACtB,OAAO;AAAA,MACN,OAAO,KAAK;AAAA,MACb,MAAM,UACL,eAAe,QACZ,IAAI,UACJ;AAAA,MACJ,SAAS,OAAO;AAAA,MAChB,MAAM;AAAA,cACL;AAAA,MACD,WAAW,KAAK;AAAA;AAAA,KAEf,CAAC,iBAAiB,YAAY,QAAQ,CAAC;AAAA,EAE1C,OAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,wBAAwB,UAAU,uBAAuB,KAAK,SAAS;AAAA,IACvE;AAAA,IACA,uBAAuB,UAAU,sBAAsB,KAAK,SAAS;AAAA,IACrE;AAAA,IACA;AAAA,IACA,uBAAuB,UAAU,sBAAsB,KAAK,SAAS;AAAA,EACtE;AAAA;;;AC/UD,sBAAS,uBAAW;AAKpB,IAAM,eAAc;AAEb,SAAS,gBAAgB,GAAG;AAAA,EAClC,MAAM,aAAa,SAAO,KAAK;AAAA,EAC/B,MAAM,iBAAiB,SAAsB,IAAI;AAAA,EACjD,MAAM,aAAa,aAAa,CAAC,MAAM,EAAE,UAAU;AAAA,EACnD,MAAM,cAAc,cAAc,CAAC,MAAM,EAAE,WAAW;AAAA,EAEtD,YAAU,MAAM;AAAA,IACf,IAAI,WAAW;AAAA,MAAS;AAAA,IAExB,MAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM;AAAA,IACzD,MAAM,cAAc,OAAO,IAAI,OAAO;AAAA,IAEtC,MAAM,oBAAoB,aAAa,QAAQ,YAAW;AAAA,IAE1D,IAAI,gBAAgB,aAAa,mBAAmB;AAAA,MACnD,WAAW,UAAU;AAAA,MAErB,MAAM,MAAM,IAAI,IAAI,OAAO,SAAS,IAAI;AAAA,MACxC,IAAI,aAAa,OAAO,OAAO;AAAA,MAC/B,OAAO,QAAQ,aAAa,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC;AAAA,MAElD,IAAI,CAAC,mBAAmB;AAAA,QACvB,MAAM,KAAK,2BAA2B;AAAA,QACtC;AAAA,MACD;AAAA,MAEA,eAAe,UAAU,MAAM,QAAQ,qBAAqB;AAAA,MAE5D,IAAI,WAAW;AAAA,MACf,MAAM,cAAc;AAAA,MACpB,MAAM,UAAU;AAAA,MAEhB,MAAM,iBAAiB,MAAM;AAAA,QAC5B,IAAI,eAAe,SAAS;AAAA,UAC3B,YAAY,eAAe,OAAO;AAAA,UAClC,eAAe,UAAU;AAAA,QAC1B;AAAA;AAAA,MAGD,MAAM,cAAc,YAAY;AAAA,QAC/B;AAAA,QACA,IAAI;AAAA,UACH,MAAM,SAAS,MAAM,UAAU,oBAAoB,iBAAiB;AAAA,UAEpE,IAAI,QAAQ,WAAW;AAAA,YACtB,aAAa,WAAW,YAAW;AAAA,YACnC,eAAe;AAAA,YAEf,MAAM,cAAc,MAAM,UAAU,eAAe;AAAA,YACnD,IAAI,aAAa,YAAY,WAAW;AAAA,cACvC,WAAW,YAAY,OAAO;AAAA,YAC/B;AAAA,YAEA,MAAM,QACL,uBAAuB,OAAO,WAAW,QAAQ,CAAC,YACnD;AAAA,YACA;AAAA,UACD;AAAA,UAEA,IAAI,WAAW,aAAa;AAAA,YAC3B,WAAW,aAAa,OAAO;AAAA,UAChC,EAAO;AAAA,YACN,aAAa,WAAW,YAAW;AAAA,YACnC,eAAe;AAAA,YACf,MAAM,KACL,gEACD;AAAA;AAAA,UAEA,MAAM;AAAA,UACP,IAAI,WAAW,aAAa;AAAA,YAC3B,WAAW,aAAa,OAAO;AAAA,UAChC,EAAO;AAAA,YACN,aAAa,WAAW,YAAW;AAAA,YACnC,eAAe;AAAA,YACf,MAAM,MAAM,qDAAqD;AAAA;AAAA;AAAA;AAAA,MAKpE,WAAW,aAAa,IAAI;AAAA,IAC7B;AAAA,KACE,CAAC,YAAY,WAAW,CAAC;AAAA;;;;AHpD7B,IAAM,qBAAqB;AAC3B,IAAM,yBAAyB;AAC/B,IAAM,qBAAqB;AAC3B,IAAM,qBAAqB;AAS3B,IAAM,kBAAkB,OAAK,SAAS,gBAAe;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACwB;AAAA,EACxB,uBACC,OAOE,OAPF;AAAA,IAAK,WAAU;AAAA,IAAf,UAOE;AAAA,sBAND,OAIE,OAJF;AAAA,QAAK,WAAU;AAAA,QAAf,UAIE;AAAA,UAHA;AAAA,0BACD,MAAsD,QAAtD;AAAA,YAAM,WAAU;AAAA,YAAhB,UAA8C;AAAA,WAAQ;AAAA,UACrD;AAAA;AAAA,OACA;AAAA,sBACF,MAAiD,OAAjD;AAAA,QAAK,WAAU;AAAA,QAAf;AAAA,OAAiD;AAAA;AAAA,GAChD;AAAA,CAEH;AAOD,IAAM,aAAa,OAAK,SAAS,WAAU,GAAG,OAAO,SAA0B;AAAA,EAC9E,uBACC,OAGE,OAHF;AAAA,IAAK,WAAU;AAAA,IAAf,UAGE;AAAA,sBAFD,MAAiD,QAAjD;AAAA,QAAM,WAAU;AAAA,QAAhB,UAAyC;AAAA,OAAQ;AAAA,sBACjD,MAAqD,QAArD;AAAA,QAAM,WAAU;AAAA,QAAhB,UAA6C;AAAA,OAAQ;AAAA;AAAA,GACpD;AAAA,CAEH;AAQD,IAAM,YAAY,OAAK,SAAS,UAAS;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,GACkB;AAAA,EAClB,uBACC,OAiBE,OAjBF;AAAA,IAAK,WAAU;AAAA,IAAf,UAiBE;AAAA,sBAhBD,MAAiD,QAAjD;AAAA,QAAM,WAAU;AAAA,QAAhB,UAAyC;AAAA,OAAQ;AAAA,sBACjD,MAcE,UAdF;AAAA,QACC,MAAK;AAAA,QACL,MAAK;AAAA,QACL,gBAAc;AAAA,QACd,SAAS,MAAM,SAAS,CAAC,OAAO;AAAA,QAChC,WAAW,oJACV,UAAU,eAAe;AAAA,QAN3B,0BASC,MAAC,QAAD;AAAA,UACC,WAAW,oEACV,UAAU,kBAAkB,mBACzB,UAAU,0BAA0B;AAAA,SACzC;AAAA,OACC;AAAA;AAAA,GACD;AAAA,CAEH;AAUD,IAAM,YAAY,OAAK,SAAS,UAAS;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACkB;AAAA,EAClB,OAAO,QAAQ,aAAa,WAAS,KAAK;AAAA,EAC1C,MAAM,iBAAiB,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK;AAAA,EAEzD,uBACC,OA0CE,OA1CF;AAAA,IAAK,WAAU;AAAA,IAAf,UA0CE;AAAA,sBAzCD,MAAiD,QAAjD;AAAA,QAAM,WAAU;AAAA,QAAhB,UAAyC;AAAA,OAAQ;AAAA,sBACjD,OAuCE,OAvCF;AAAA,QAAK,WAAU;AAAA,QAAf,UAuCE;AAAA,0BAtCD,OAUE,UAVF;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM,CAAC,YAAY,UAAU,CAAC,MAAM;AAAA,YAC7C;AAAA,YACA,WAAU;AAAA,YAJX,UAUE;AAAA,8BAJD,MAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UACE,gBAAgB,SAAS,SAAS;AAAA,eAClC;AAAA,8BACF,MAAC,cAAD;AAAA,gBAAa,WAAU;AAAA,eAAU;AAAA;AAAA,WAChC;AAAA,UACD,0BACA;AAAA,sBAwBE;AAAA,8BAtBD,MAAC,OAAD;AAAA,gBACC,WAAU;AAAA,gBACV,SAAS,MAAM,UAAU,KAAK;AAAA,gBAC9B,MAAK;AAAA,eACN;AAAA,8BACA,MAgBE,OAhBF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UACE,QAAQ,IAAI,CAAC,2BACb,MAYE,UAZF;AAAA,kBAEC,MAAK;AAAA,kBACL,SAAS,MAAM;AAAA,oBACd,SAAS,OAAO,EAAE;AAAA,oBAClB,UAAU,KAAK;AAAA;AAAA,kBAEhB,WAAW,wEACV,OAAO,OAAO,QAAQ,gBAAgB;AAAA,kBARxC,UAWE,OAAO;AAAA,mBAVH,OAAO,EAWX,CACF;AAAA,eACA;AAAA;AAAA,WACD;AAAA;AAAA,OAEF;AAAA;AAAA,GACD;AAAA,CAEH;AAEM,IAAM,kBAAkB,OAAK,SAAS,gBAAe,GAAG;AAAA,EAC9D,MAAM,aAAa,iBAAiB,CAAC,UAAU,MAAM,UAAU;AAAA,EAC/D,MAAM,kBAAkB,iBAAiB,CAAC,UAAU,MAAM,eAAe;AAAA,EACzE,MAAM,aAAa,mBAClB,CAAC,MAAM,EAAE,OAAO,uBAAuB,sBACxC;AAAA,EAEA,QAAQ,MAAM,YAAW,UAAU;AAAA,EACnC,QAAQ,MAAM,cAAc,aAAa;AAAA,EACzC,QAAQ,2BAAa,sBAAsB,eAAe;AAAA,EAC1D,MAAM,iBAAiB,kBAAkB;AAAA,EACzC,MAAM,cAAc,aAAa,CAAC,MAAM,EAAE,OAAO;AAAA,EACjD,MAAM,aAAa,aAAa,CAAC,MAAM,EAAE,aAAa;AAAA,EACtD,MAAM,kBAAkB,aAAa,CAAC,MAAM,EAAE,WAAW;AAAA,EACzD,MAAM,cAAc,aAAa,CAAC,MAAM,EAAE,SAAS;AAAA,EACnD,MAAM,iBAAiB,aAAa,CAAC,MAAM,EAAE,cAAc;AAAA,EAG3D,iBAAiB;AAAA,EAEjB,MAAM,UAAU,SAAQ,WAAW,SAAS,MAAM;AAAA,EAClD,QAAQ,cAAc,uBAAuB,eAC5C,UAAU,SAAS,SACpB;AAAA,EAEA,MAAM,oBAAoB,mBAAmB,CAAC,MAAM,EAAE,OAAO;AAAA,EAC7D,MAAM,UAAU,mBAAmB,CAAC,MAAM,EAAE,OAAO;AAAA,EACnD,MAAM,gBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa;AAAA,EAC/D,QAAQ,oBAAoB,cAAc;AAAA,EAE1C,MAAM,uBAAuB,cAAY,YAAY;AAAA,IACpD,OAAO,MAAM,UAAU,iBAAiB;AAAA,KACtC,CAAC,CAAC;AAAA,EAEL,MAAM,kBAAkB,UAAQ,MAAM;AAAA,IACrC,IAAI,CAAC,SAAQ,aAAa,CAAC;AAAA,MAAW,OAAO,CAAC;AAAA,IAC9C,OAAO,QAAO,UACZ,OAAO,CAAC,MAAM,UAAU,EAAE,EAC1B,IAAI,CAAC,OAAO;AAAA,MACZ,IAAI;AAAA,MACJ,OAAO,UAAU,IAAI,SAAS;AAAA,IAC/B,EAAE;AAAA,KACD,CAAC,SAAQ,WAAW,SAAS,CAAC;AAAA,EAEjC,MAAM,eAAe,UAAQ,MAAM;AAAA,IAClC,MAAM,WAAW,SAAQ,UAAU;AAAA,IACnC,IAAI,CAAC,YAAY,CAAC,YAAY;AAAA,MAAW,OAAO,CAAC;AAAA,IACjD,OAAO,UAAU,UAAU,OAAO,IAAI,CAAC,OAAO;AAAA,MAC7C,IAAI,EAAE;AAAA,MACN,OAAO,EAAE;AAAA,IACV,EAAE;AAAA,KACA,CAAC,SAAQ,UAAU,UAAU,SAAS,CAAC;AAAA,EAE1C,MAAM,eAAe,UAAQ,MAAM;AAAA,IAClC,IAAI,CAAC,SAAQ;AAAA,MAAQ,OAAO,CAAC;AAAA,IAC7B,OAAO,QAAO,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,OAAO,EAAE,EAAE;AAAA,KACnD,CAAC,SAAQ,MAAM,CAAC;AAAA,EAEnB,IAAI,CAAC;AAAA,IAAY,OAAO;AAAA,EAExB,MAAM,uBAAuB,CAAC,aAAqB;AAAA,IAClD,MAAM,aAAa,YAAY,WAAW,SAAS,IAAI;AAAA,IACvD,eAAe,OAAO;AAAA,MACrB;AAAA,MACA,OAAO,cAAc,SAAQ,UAAU;AAAA,MACvC,OAAO;AAAA,IACR,CAAC;AAAA;AAAA,EAGF,MAAM,oBAAoB,CAAC,UAAkB;AAAA,IAC5C,eAAe,OAAO,EAAE,OAAO,OAAO,SAAS,CAAC;AAAA;AAAA,EAGjD,MAAM,oBAAoB,CAAC,UAAkB;AAAA,IAC5C,eAAe,OAAO,EAAE,OAAO,OAAO,SAAS,CAAC;AAAA;AAAA,EAGjD,uBACC,OAuJE,OAvJF;AAAA,IACC,WAAU;AAAA,IACV,OAAO,EAAE,OAAO,WAAW;AAAA,IAF5B,UAuJE;AAAA,sBAnJD,MAAC,cAAD;AAAA,QACC,UAAU;AAAA,QACV,MAAK;AAAA,QACL,UAAU;AAAA,QACV,UAAU;AAAA,QACV,cAAc;AAAA,OACf;AAAA,sBACA,OA2IE,OA3IF;AAAA,QAAK,WAAU;AAAA,QAAf,UA2IE;AAAA,0BA1ID,OAQE,OARF;AAAA,YAAK,WAAU;AAAA,YAAf,UAQE;AAAA,8BAPD,OAGE,OAHF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UAGE;AAAA,kCAFD,MAAC,WAAD;AAAA,oBAAU,WAAU;AAAA,mBAAU;AAAA,kCAC9B,MAAwC,QAAxC;AAAA,oBAAM,WAAU;AAAA,oBAAhB;AAAA,mBAAwC;AAAA;AAAA,eACvC;AAAA,8BACF,MAEE,QAFF;AAAA,gBAAQ,SAAQ;AAAA,gBAAQ,MAAK;AAAA,gBAAO,SAAS;AAAA,gBAA7C,0BACC,MAAC,gBAAD;AAAA,kBAAc,WAAU;AAAA,iBAAU;AAAA,eACjC;AAAA;AAAA,WACD;AAAA,0BAEF,OA+HE,OA/HF;AAAA,YAAK,WAAU;AAAA,YAAf,UA+HE;AAAA,8BA9HD,OAyBE,iBAzBF;AAAA,gBACC,OAAM;AAAA,gBACN,sBAAM,MAAC,KAAD;AAAA,kBAAK,WAAU;AAAA,iBAAgC;AAAA,gBAFtD,UAyBE;AAAA,kCArBD,MAAC,WAAD;AAAA,oBACC,OAAM;AAAA,oBACN,OAAO,SAAQ,UAAU,YAAY;AAAA,oBACrC,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,UAAU,eAAe;AAAA,mBAC1B;AAAA,kCACA,MAAC,WAAD;AAAA,oBACC,OAAM;AAAA,oBACN,OAAO,SAAQ,UAAU,SAAS;AAAA,oBAClC,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,UAAU,eAAe;AAAA,mBAC1B;AAAA,kCACA,MAAC,WAAD;AAAA,oBACC,OAAM;AAAA,oBACN,OAAO,SAAQ,UAAU,SAAS;AAAA,oBAClC,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,UAAU,eAAe;AAAA,mBAC1B;AAAA;AAAA,eACC;AAAA,8BAEF,OAoDE,iBApDF;AAAA,gBACC,OAAM;AAAA,gBACN,sBAAM,MAAC,OAAD;AAAA,kBAAM,WAAU;AAAA,iBAAgC;AAAA,gBAFvD,UAoDE;AAAA,kCAhDD,MAAC,WAAD;AAAA,oBACC,OAAM;AAAA,oBACN,SAAS,aAAY;AAAA,oBACrB,UAAU,CAAC,YAAY,kBAAkB,EAAE,SAAS,QAAQ,CAAC;AAAA,mBAC9D;AAAA,kCACA,MAAC,WAAD;AAAA,oBACC,OAAM;AAAA,oBACN,SAAS,aAAY;AAAA,oBACrB,UAAU,CAAC,YACV,kBAAkB,EAAE,eAAe,QAAQ,CAAC;AAAA,mBAE9C;AAAA,kCACA,MAAC,WAAD;AAAA,oBACC,OAAM;AAAA,oBACN,SAAS,SAAQ,UAAU,iBAAiB;AAAA,oBAC5C,UAAU,CAAC,YACV,eAAe,OAAO;AAAA,sBACrB,eAAe;AAAA,sBACf,OAAO;AAAA,oBACR,CAAC;AAAA,mBAEH;AAAA,kCACA,MAAC,WAAD;AAAA,oBACC,OAAM;AAAA,oBACN,OAAO,SAAQ,UAAU,gBAAgB;AAAA,oBACzC,SAAS;AAAA,sBACR,EAAE,IAAI,QAAQ,OAAO,qBAAqB;AAAA,sBAC1C,EAAE,IAAI,aAAa,OAAO,iBAAiB;AAAA,sBAC3C,EAAE,IAAI,OAAO,OAAO,YAAY;AAAA,oBACjC;AAAA,oBACA,UAAU,CAAC,UACV,eAAe,OAAO;AAAA,sBACrB,cAAc;AAAA,sBACd,OAAO;AAAA,oBACR,CAAC;AAAA,oBAEF,UAAU,eAAe;AAAA,mBAC1B;AAAA,kCACA,MAAC,WAAD;AAAA,oBACC,OAAM;AAAA,oBACN,SAAS,SAAQ,UAAU,cAAc;AAAA,oBACzC,UAAU,CAAC,YACV,eAAe,OAAO;AAAA,sBACrB,YAAY;AAAA,sBACZ,OAAO;AAAA,oBACR,CAAC;AAAA,mBAEH;AAAA;AAAA,eACC;AAAA,8BAEF,MA8BE,iBA9BF;AAAA,gBACC,OAAM;AAAA,gBACN,sBAAM,MAAC,KAAD;AAAA,kBAAK,WAAU;AAAA,iBAAgC;AAAA,gBACrD,wBACC,MAaE,UAbF;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,MAAM;AAAA,oBACd,gBAAgB,EAAE,KAAK,MAAM;AAAA,sBAC5B,QAAQ,QAAQ;AAAA,sBAChB,cAAc,IAAI;AAAA,sBAClB,kBAAkB,IAAI;AAAA,qBACtB;AAAA;AAAA,kBAEF,WAAU;AAAA,kBACV,OAAM;AAAA,kBAVP,0BAYC,MAAC,SAAD;AAAA,oBAAQ,WAAU;AAAA,mBAAoC;AAAA,iBACrD;AAAA,gBAjBJ,0BAoBC,MASE,OATF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UACE,SAAQ,WAAW,IAAI,CAAC,6BACxB,MAKE,QALF;AAAA,oBAEC,WAAU;AAAA,oBAFX,UAIE;AAAA,qBAHI,QAIJ,CACF,qBAAK,MAAsD,QAAtD;AAAA,oBAAM,WAAU;AAAA,oBAAhB;AAAA,mBAAsD;AAAA,iBAC3D;AAAA,eACD;AAAA,cAED,SAAQ,WAAW,SAAS,MAAM,qBAClC,MAAC,mBAAD;AAAA,gBACC;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,oBAAoB;AAAA,eACrB;AAAA,8BAGD,MAAC,gBAAD,EAAgB;AAAA;AAAA,WACf;AAAA;AAAA,OACD;AAAA;AAAA,GACD;AAAA,CAEH;AAED,SAAS,oBAAoB,GAAG;AAAA,EAC/B,MAAM,eAAe,aAAa,CAAC,MAAM,EAAE,YAAY;AAAA,EACvD,MAAM,OAAO,aAAa,CAAC,MAAM,EAAE,IAAI;AAAA,EAEvC,IAAI,CAAC,cAAc;AAAA,IAAQ,OAAO;AAAA,EAElC,MAAM,gBAAgB,CAAC,UAAkB;AAAA,IACxC,IAAI,SAAS;AAAA,MAAI,OAAO,KAAK,MAAM,KAAK,EAAE,SAAS;AAAA,IACnD,IAAI,SAAS;AAAA,MAAG,OAAO,MAAM,QAAQ,CAAC;AAAA,IACtC,OAAO,MAAM,QAAQ,CAAC;AAAA;AAAA,EAGvB,uBACC;AAAA,cAqCE;AAAA,sBApCD,MAAC,YAAD;AAAA,QAAY,OAAM;AAAA,QAAO,OAAO,aAAa,YAAY;AAAA,OAAM;AAAA,MAC9D,aAAa,oBAAoB,aACjC,aAAa,gBAAgB,6BAC5B,OAaE,OAbF;AAAA,QAAK,WAAU;AAAA,QAAf,UAaE;AAAA,0BAZD,MAAC,YAAD;AAAA,YACC,OAAM;AAAA,YACN,OAAO,GAAG,cAAc,aAAa,WAAW,OAAO,cAAc,aAAa,eAAe;AAAA,WAClG;AAAA,0BACA,MAOE,OAPF;AAAA,YAAK,WAAU;AAAA,YAAf,0BACC,MAAC,OAAD;AAAA,cACC,WAAU;AAAA,cACV,OAAO;AAAA,gBACN,OAAO,GAAG,KAAK,IAAI,KAAM,aAAa,cAAc,aAAa,kBAAmB,GAAG;AAAA,cACxF;AAAA,aACD;AAAA,WACC;AAAA;AAAA,OACD;AAAA,MAEH,QAAQ,KAAK,wBAAwB,qBACrC,MAAC,YAAD;AAAA,QACC,OAAM;AAAA,QACN,OAAO,IAAI,KAAK,sBAAsB,QAAQ,CAAC;AAAA,OAChD;AAAA,MAEA,aAAa,6BACb,MAAC,YAAD;AAAA,QACC,OAAM;AAAA,QACN,OAAO,IAAI,KAAK,aAAa,SAAS,EACpC,mBAAmB,SAAS;AAAA,UAC5B,OAAO;AAAA,UACP,KAAK;AAAA,UACL,MAAM;AAAA,QACP,CAAC,EACA,QAAQ,KAAK,EAAE;AAAA,OAClB;AAAA;AAAA,GAEA;AAAA;AAkBJ,IAAM,oBAAoB,OAAK,SAAS,kBAAiB;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GAC0B;AAAA,EAC1B,MAAM,wBAAwB,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,cAAc,MAAM;AAAA,EAC1E,OAAO,QAAQ,aAAa,WAAS,KAAK;AAAA,EAC1C,OAAO,mBAAmB,wBAAwB,WAAS,KAAK;AAAA,EAChE,OAAO,kBAAkB,uBAAuB,WAAwB,IAAI;AAAA,EAC5E,OAAO,uBAAuB,4BAA4B,WAAS,KAAK;AAAA,EACxE,OAAO,uBAAuB,4BAA4B,WAExD,IAAI;AAAA,EACN,OAAO,kBAAkB,uBAAuB,WAAS,KAAK;AAAA,EAE9D,MAAM,aAAa,cAAY,YAAY;AAAA,IAC1C,IAAI,CAAC;AAAA,MAAY;AAAA,IACjB,MAAM,UAAU,UAAU,UAAU,UAAU;AAAA,IAC9C,UAAU,IAAI;AAAA,IACd,WAAW,MAAM,UAAU,KAAK,GAAG,IAAI;AAAA,KACrC,CAAC,UAAU,CAAC;AAAA,EAEf,MAAM,6BAA6B,YAAY;AAAA,IAC9C,qBAAqB,IAAI;AAAA,IACzB,oBAAoB,KAAK;AAAA,IACzB,oBAAoB,IAAI;AAAA,IACxB,yBAAyB,IAAI;AAAA,IAC7B,yBAAyB,IAAI;AAAA,IAC7B,IAAI;AAAA,MACH,MAAM,SAAS,MAAM,mBAAmB;AAAA,MACxC,oBAAoB,OAAO,UAAU;AAAA,MACpC,OAAO,KAAK;AAAA,MACb,yBACC,eAAe,QAAQ,IAAI,UAAU,8BACtC;AAAA,cACC;AAAA,MACD,yBAAyB,KAAK;AAAA;AAAA;AAAA,EAIhC,MAAM,8BAA8B,MAAM;AAAA,IACzC,IAAI;AAAA,MAAuB;AAAA,IAC3B,qBAAqB,KAAK;AAAA,IAC1B,oBAAoB,KAAK;AAAA,IACzB,oBAAoB,IAAI;AAAA,IACxB,yBAAyB,IAAI;AAAA;AAAA,EAG9B,MAAM,uBAAuB,YAAY;AAAA,IACxC,IAAI,CAAC;AAAA,MAAkB;AAAA,IACvB,MAAM,UAAU,UAAU,UAAU,gBAAgB;AAAA,IACpD,oBAAoB,IAAI;AAAA,IACxB,WAAW,MAAM,oBAAoB,KAAK,GAAG,IAAI;AAAA;AAAA,EAGlD,MAAM,iBAAiB,CAAC,YAA2B;AAAA,IAClD,IAAI,CAAC;AAAA,MAAS,OAAO;AAAA,IACrB,OAAO,GAAG,QAAQ,MAAM,GAAG,CAAC,OAAO,QAAQ,MAAM,EAAE;AAAA;AAAA,EAGpD,MAAM,gBAAgB,CAAC,YAA2B;AAAA,IACjD,IAAI,YAAY;AAAA,MAAM,OAAO;AAAA,IAC7B,OAAO,IAAI,QAAQ,QAAQ,CAAC;AAAA;AAAA,EAG7B,MAAM,oBAAoB,CAAC,YAA2B;AAAA,IACrD,IAAI,YAAY;AAAA,MAAM,OAAO;AAAA,IAC7B,OAAO,GAAG,QAAQ,QAAQ,CAAC;AAAA;AAAA,EAG5B,MAAM,WAAW,eAAe;AAAA,EAEhC,uBACC,OA4JE,iBA5JF;AAAA,IACC,OAAM;AAAA,IACN,sBAAM,MAAC,SAAD;AAAA,MAAQ,WAAU;AAAA,KAAgC;AAAA,IACxD,wBACC,MAUE,UAVF;AAAA,MACC,MAAK;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,MACV,WAAU;AAAA,MACV,OAAM;AAAA,MALP,0BAOC,MAAC,YAAD;AAAA,QACC,WAAW,qCAAqC,cAAc,iBAAiB;AAAA,OAChF;AAAA,KACC;AAAA,IAdJ,UA4JE;AAAA,MA3IA,2BACA;AAAA,kBAqCE;AAAA,0BApCD,MASE,OATF;AAAA,YAAK,WAAU;AAAA,YAAf,0BACC,MAOE,OAPF;AAAA,cAAK,WAAU;AAAA,cAAf,0BACC,MAAC,WAAD;AAAA,gBACC,OAAO;AAAA,gBACP,MAAM;AAAA,gBACN,OAAM;AAAA,gBACN,eAAe;AAAA,eAChB;AAAA,aACC;AAAA,WACD;AAAA,0BACF,OAeE,OAfF;AAAA,YAAK,WAAU;AAAA,YAAf,UAeE;AAAA,8BAdD,MAAiD,QAAjD;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAAiD;AAAA,8BACjD,OAYE,UAZF;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,WAAU;AAAA,gBACV,OAAM;AAAA,gBAJP,UAYE;AAAA,kBANA,eAAe,UAAU;AAAA,kBACzB,yBACA,MAAC,SAAD;AAAA,oBAAO,WAAU;AAAA,mBAAyB,oBAE1C,MAAC,OAAD;AAAA,oBAAM,WAAU;AAAA,mBAAgC;AAAA;AAAA,eAEhD;AAAA;AAAA,WACD;AAAA,0BACF,MAAC,sBAAD,EAAsB;AAAA,UACrB,CAAC,yCACD;AAAA,sBAME;AAAA,8BALD,MAAC,YAAD;AAAA,gBAAY,OAAM;AAAA,gBAAU,OAAO,cAAc,WAAW;AAAA,eAAG;AAAA,8BAC/D,MAAC,YAAD;AAAA,gBACC,OAAM;AAAA,gBACN,OAAO,kBAAkB,eAAe;AAAA,eACzC;AAAA;AAAA,WACC;AAAA;AAAA,OAEF,oBAEF;AAAA,kBAgBE;AAAA,0BAfD,MAEE,OAFF;AAAA,YAAK,WAAU;AAAA,YAAf,0BACC,MAAC,OAAD;AAAA,cAAK,WAAU;AAAA,aAAwD;AAAA,WACtE;AAAA,0BACF,OAGE,OAHF;AAAA,YAAK,WAAU;AAAA,YAAf,UAGE;AAAA,8BAFD,MAAiD,QAAjD;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAAiD;AAAA,8BACjD,MAAC,OAAD;AAAA,gBAAK,WAAU;AAAA,eAA0C;AAAA;AAAA,WACxD;AAAA,0BACF,OAGE,OAHF;AAAA,YAAK,WAAU;AAAA,YAAf,UAGE;AAAA,8BAFD,MAAiD,QAAjD;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAAiD;AAAA,8BACjD,MAAC,OAAD;AAAA,gBAAK,WAAU;AAAA,eAA0C;AAAA;AAAA,WACxD;AAAA,0BACF,OAGE,OAHF;AAAA,YAAK,WAAU;AAAA,YAAf,UAGE;AAAA,8BAFD,MAA8C,QAA9C;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAA8C;AAAA,8BAC9C,MAAC,OAAD;AAAA,gBAAK,WAAU;AAAA,eAA0C;AAAA;AAAA,WACxD;AAAA;AAAA,OACD;AAAA,sBAEH,OAQE,QARF;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,SAAS;AAAA,QACT,WAAU;AAAA,QAJX,UAQE;AAAA,0BAFD,MAAC,OAAD;AAAA,YAAM,WAAU;AAAA,WAAU;AAAA,UAN3B;AAAA;AAAA,OAQE;AAAA,sBACF,OAQE,QARF;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,SAAS;AAAA,QACT,WAAU;AAAA,QAJX,UAQE;AAAA,0BAFD,MAAC,KAAD;AAAA,YAAK,WAAU;AAAA,WAAU;AAAA,UAN1B;AAAA;AAAA,OAQE;AAAA,MAED,qCACA,MA2DE,OA3DF;AAAA,QAAK,WAAU;AAAA,QAAf,0BACC,OAyDE,OAzDF;AAAA,UAAK,WAAU;AAAA,UAAf,UAyDE;AAAA,4BAxDD,OAGE,OAHF;AAAA,cAAK,WAAU;AAAA,cAAf,UAGE;AAAA,gCAFD,MAAC,KAAD;AAAA,kBAAK,WAAU;AAAA,iBAAgC;AAAA,gCAC/C,MAA+D,MAA/D;AAAA,kBAAI,WAAU;AAAA,kBAAd;AAAA,iBAA+D;AAAA;AAAA,aAC9D;AAAA,4BACF,OAmDE,OAnDF;AAAA,cAAK,WAAU;AAAA,cAAf,UAmDE;AAAA,gCAlDD,MAGE,KAHF;AAAA,kBAAG,WAAU;AAAA,kBAAb;AAAA,iBAGE;AAAA,gBAED,yCACA,OAGE,OAHF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAGE;AAAA,oCAFD,MAAC,UAAD;AAAA,sBAAS,WAAU;AAAA,qBAAuB;AAAA,oBAD3C;AAAA;AAAA,iBAGE;AAAA,gBAGF,CAAC,yBAAyB,oCAC1B,OAmBE,OAnBF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAmBE;AAAA,oCAlBD,MAAC,YAAD;AAAA,sBACC,UAAQ;AAAA,sBACR,OAAO;AAAA,sBACP,WAAU;AAAA,qBACX;AAAA,oCACA,OAYE,QAZF;AAAA,sBACC,SAAQ;AAAA,sBACR,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,WAAU;AAAA,sBAJX,UAYE;AAAA,wBANA,mCACA,MAAC,SAAD;AAAA,0BAAO,WAAU;AAAA,yBAAyB,oBAE1C,MAAC,OAAD;AAAA,0BAAM,WAAU;AAAA,yBAAU;AAAA,wBAE1B,mBAAmB,WAAW;AAAA;AAAA,qBAC9B;AAAA;AAAA,iBACD;AAAA,gBAGF,CAAC,yBAAyB,yCAC1B,MAEE,KAFF;AAAA,kBAAG,WAAU;AAAA,kBAAb,UACE;AAAA,iBACA;AAAA,gCAEH,MASE,OATF;AAAA,kBAAK,WAAU;AAAA,kBAAf,0BACC,MAOE,UAPF;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS;AAAA,oBACT,UAAU;AAAA,oBACV,WAAU;AAAA,oBAJX;AAAA,mBAOE;AAAA,iBACD;AAAA;AAAA,aACD;AAAA;AAAA,SACD;AAAA,OACD;AAAA;AAAA,GAEF;AAAA,CAEH;;AI1sBD,iBAAS;AACT,qBAAS;;AAGF,IAAM,wBAAwB,OAAK,SAAS,sBAAqB,GAAG;AAAA,EAC1E,MAAM,aAAa,iBAAiB,CAAC,UAAU,MAAM,UAAU;AAAA,EAC/D,MAAM,gBAAgB,iBAAiB,CAAC,UAAU,MAAM,aAAa;AAAA,EAErE,uBACC,MAWE,UAXF;AAAA,IACC,MAAK;AAAA,IACL,SAAS;AAAA,IACT,WAAW,yGACV,aACG,4BACA;AAAA,IAEJ,OAAM;AAAA,IARP,0BAUC,MAAC,WAAD;AAAA,MAAU,WAAU;AAAA,KAAwC;AAAA,GAC3D;AAAA,CAEH;;ACtBD,iBAAS,oBAAM;AACf;AAAA,WACC;AAAA,kBACA;AAAA,aACA;AAAA,iBACA;AAAA,UACA;AAAA,WACA;AAAA,kBACA;AAAA,WACA;AAAA;AAED,sBAAS;;;ACXT,qBAAS,2BAAU,gCAAa;AAChC,sBAAS,4BAAW,yBAAa;AA0BjC,eAAe,iBAAiB,GAAkC;AAAA,EACjE,MAAM,WAAW,MAAM,MAAM,GAAG,+BAA+B;AAAA,EAC/D,IAAI,CAAC,SAAS,IAAI;AAAA,IACjB,MAAM,IAAI,MAAM,+BAA+B;AAAA,EAChD;AAAA,EACA,OAAO,SAAS,KAAK;AAAA;AAGtB,eAAe,WAAW,GAAiC;AAAA,EAE1D,MAAM,WAAW,MAAM,MAAM,GAAG,gCAAgC;AAAA,IAC/D,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,CAAC,CAAC;AAAA,EACxB,CAAC;AAAA,EACD,OAAO,SAAS,KAAK;AAAA;AAGtB,eAAe,UAAU,GAItB;AAAA,EACF,MAAM,WAAW,MAAM,MAAM,GAAG,+BAA+B;AAAA,IAC9D,QAAQ;AAAA,EACT,CAAC;AAAA,EACD,OAAO,SAAS,KAAK;AAAA;AAGtB,eAAe,aAAa,GAA8B;AAAA,EACzD,MAAM,WAAW,MAAM,MAAM,GAAG,2BAA2B;AAAA,EAC3D,OAAO,SAAS,KAAK;AAAA;AAGf,SAAS,eAAe,GAAG;AAAA,EACjC,MAAM,YAAY,eAAe,CAAC,MAAM,EAAE,SAAS;AAAA,EACnD,MAAM,SAAS,eAAe,CAAC,MAAM,EAAE,MAAM;AAAA,EAC7C,MAAM,WAAW,eAAe,CAAC,MAAM,EAAE,QAAQ;AAAA,EAEjD,MAAM,QAAQ,WAA+B;AAAA,IAC5C,UAAU,CAAC,UAAU,QAAQ;AAAA,IAC7B,SAAS;AAAA,IACT,iBAAiB;AAAA,EAClB,CAAC;AAAA,EAED,YAAU,MAAM;AAAA,IACf,IAAI,MAAM,MAAM;AAAA,MACf,UAAU,MAAM,KAAK,MAAM;AAAA,MAC3B,OAAO,MAAM,KAAK,GAAG;AAAA,MACrB,SAAS,MAAM,KAAK,KAAK;AAAA,IAC1B;AAAA,KACE,CAAC,MAAM,MAAM,WAAW,QAAQ,QAAQ,CAAC;AAAA,EAE5C,OAAO;AAAA;AAGD,SAAS,cAAc,GAAG;AAAA,EAChC,MAAM,cAAc,iBAAe;AAAA,EACnC,MAAM,YAAY,eAAe,CAAC,MAAM,EAAE,SAAS;AAAA,EACnD,MAAM,SAAS,eAAe,CAAC,MAAM,EAAE,MAAM;AAAA,EAC7C,MAAM,WAAW,eAAe,CAAC,MAAM,EAAE,QAAQ;AAAA,EACjD,MAAM,cAAc,eAAe,CAAC,MAAM,EAAE,WAAW;AAAA,EAEvD,OAAO,aAA8C;AAAA,IACpD,YAAY,MAAM,YAAY;AAAA,IAC9B,UAAU,MAAM;AAAA,MACf,UAAU,UAAU;AAAA,MACpB,YAAY,eAAe;AAAA,MAC3B,SAAS,IAAI;AAAA;AAAA,IAEd,WAAW,CAAC,SAAS;AAAA,MACpB,IAAI,KAAK,MAAM,KAAK,KAAK;AAAA,QACxB,UAAU,WAAW;AAAA,QACrB,OAAO,KAAK,GAAG;AAAA,QACf,YAAY,IAAI;AAAA,MACjB,EAAO,SAAI,CAAC,KAAK,IAAI;AAAA,QACpB,UAAU,OAAO;AAAA,QACjB,SAAS,KAAK,SAAS,wBAAwB;AAAA,QAC/C,YAAY,IAAI;AAAA,MACjB;AAAA,MACA,YAAY,kBAAkB,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC;AAAA;AAAA,IAEvD,SAAS,CAAC,UAAU;AAAA,MACnB,UAAU,OAAO;AAAA,MACjB,SAAS,MAAM,OAAO;AAAA,MACtB,YAAY,IAAI;AAAA;AAAA,EAElB,CAAC;AAAA;AAGK,SAAS,aAAa,GAAG;AAAA,EAC/B,MAAM,cAAc,iBAAe;AAAA,EACnC,MAAM,QAAQ,eAAe,CAAC,MAAM,EAAE,KAAK;AAAA,EAE3C,OAAO,aAAY;AAAA,IAClB,YAAY;AAAA,IACZ,WAAW,MAAM;AAAA,MAChB,MAAM;AAAA,MACN,YAAY,kBAAkB,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC;AAAA;AAAA,EAExD,CAAC;AAAA;AAGK,SAAS,WAAW,GAAG;AAAA,EAC7B,MAAM,MAAM,eAAe,CAAC,MAAM,EAAE,GAAG;AAAA,EACvC,MAAM,YAAY,eAAe,CAAC,MAAM,EAAE,SAAS;AAAA,EAEnD,MAAM,QAAQ,WAA2B;AAAA,IACxC,UAAU,CAAC,UAAU,MAAM,GAAG;AAAA,IAC9B,SAAS;AAAA,IACT,SAAS,CAAC,CAAC;AAAA,EACZ,CAAC;AAAA,EAED,YAAU,MAAM;AAAA,IACf,IAAI,MAAM,MAAM,MAAM,MAAM,KAAK,QAAQ;AAAA,MACxC,UAAU,MAAM,KAAK,MAAM;AAAA,IAC5B;AAAA,KACE,CAAC,MAAM,MAAM,SAAS,CAAC;AAAA,EAE1B,OAAO;AAAA;AAGD,SAAS,eAAe,GAAG;AAAA,EACjC,MAAM,YAAY,eAAe,CAAC,MAAM,EAAE,SAAS;AAAA,EACnD,MAAM,SAAS,eAAe,CAAC,MAAM,EAAE,MAAM;AAAA,EAC7C,MAAM,WAAW,eAAe,CAAC,MAAM,EAAE,QAAQ;AAAA,EACjD,MAAM,cAAc,eAAe,CAAC,MAAM,EAAE,WAAW;AAAA,EACvD,MAAM,aAAa,eAAe,CAAC,MAAM,EAAE,UAAU;AAAA,EACrD,MAAM,iBAAiB,SAA2B,IAAI;AAAA,EAEtD,MAAM,UAAU,cAAY,MAAM;AAAA,IACjC,IAAI,eAAe,SAAS;AAAA,MAC3B,eAAe,QAAQ,MAAM;AAAA,IAC9B;AAAA,IAEA,MAAM,KAAK,IAAI,YAAY,GAAG,+BAA+B;AAAA,IAC7D,eAAe,UAAU;AAAA,IAEzB,GAAG,YAAY,CAAC,UAAU;AAAA,MACzB,IAAI;AAAA,QACH,MAAM,OAAO,KAAK,MAAM,MAAM,IAAI;AAAA,QAClC,IAAI,KAAK,SAAS,UAAU;AAAA,UAC3B,UAAU,KAAK,MAAM;AAAA,UACrB,OAAO,KAAK,GAAG;AAAA,UACf,SAAS,KAAK,KAAK;AAAA,UACnB,YAAY,KAAK,QAAQ;AAAA,QAC1B;AAAA,QACC,MAAM;AAAA;AAAA,IAKT,GAAG,UAAU,MAAM;AAAA,MAClB,GAAG,MAAM;AAAA,MACT,eAAe,UAAU;AAAA;AAAA,IAG1B,OAAO,MAAM;AAAA,MACZ,GAAG,MAAM;AAAA,MACT,eAAe,UAAU;AAAA;AAAA,KAExB,CAAC,WAAW,QAAQ,UAAU,WAAW,CAAC;AAAA,EAE7C,YAAU,MAAM;AAAA,IACf,IAAI,YAAY;AAAA,MACf,MAAM,UAAU,QAAQ;AAAA,MACxB,OAAO;AAAA,IACR;AAAA,IACA,OAAO,MAAM;AAAA,MACZ,IAAI,eAAe,SAAS;AAAA,QAC3B,eAAe,QAAQ,MAAM;AAAA,QAC7B,eAAe,UAAU;AAAA,MAC1B;AAAA;AAAA,KAEC,CAAC,YAAY,OAAO,CAAC;AAAA,EAExB,OAAO,EAAE,QAAQ;AAAA;;;;ADrLlB,SAAS,WAAW,CAAC,KAAqB;AAAA,EACzC,IAAI;AAAA,IACH,MAAM,SAAS,IAAI,IAAI,GAAG;AAAA,IAC1B,MAAM,OAAO,OAAO;AAAA,IACpB,IAAI,KAAK,SAAS,IAAI;AAAA,MACrB,OAAO,GAAG,KAAK,MAAM,GAAG,EAAE,OAAO,KAAK,MAAM,EAAE;AAAA,IAC/C;AAAA,IACA,OAAO;AAAA,IACN,MAAM;AAAA,IACP,OAAO,IAAI,SAAS,KAAK,GAAG,IAAI,MAAM,GAAG,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM;AAAA;AAAA;AAI/D,IAAM,gBAAgB,OAAK,SAAS,cAAa,GAAG;AAAA,EAC1D,MAAM,aAAa,eAAe,CAAC,MAAM,EAAE,UAAU;AAAA,EACrD,MAAM,kBAAkB,eAAe,CAAC,MAAM,EAAE,eAAe;AAAA,EAC/D,MAAM,SAAS,eAAe,CAAC,MAAM,EAAE,MAAM;AAAA,EAC7C,MAAM,MAAM,eAAe,CAAC,MAAM,EAAE,GAAG;AAAA,EACvC,MAAM,QAAQ,eAAe,CAAC,MAAM,EAAE,KAAK;AAAA,EAC3C,MAAM,WAAW,eAAe,CAAC,MAAM,EAAE,QAAQ;AAAA,EAEjD,MAAM,eAAc,eAAe;AAAA,EACnC,MAAM,cAAa,cAAc;AAAA,EACjC,OAAO,QAAQ,aAAa,WAAS,KAAK;AAAA,EAE1C,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAEhB,MAAM,gBAAgB,YAAY;AAAA,IACjC,IAAI,KAAK;AAAA,MACR,MAAM,UAAU,UAAU,UAAU,GAAG;AAAA,MACvC,UAAU,IAAI;AAAA,MACd,WAAW,MAAM,UAAU,KAAK,GAAG,IAAI;AAAA,IACxC;AAAA;AAAA,EAGD,MAAM,cAAc,MAAM;AAAA,IACzB,aAAY,OAAO;AAAA;AAAA,EAGpB,MAAM,aAAa,MAAM;AAAA,IACxB,YAAW,OAAO;AAAA;AAAA,EAGnB,IAAI,CAAC;AAAA,IAAY,OAAO;AAAA,EAExB,uBACC,OAqJE,OArJF;AAAA,IAAK,WAAU;AAAA,IAAf,UAqJE;AAAA,sBApJD,OAaE,OAbF;AAAA,QAAK,WAAU;AAAA,QAAf,UAaE;AAAA,0BAZD,OAGE,OAHF;AAAA,YAAK,WAAU;AAAA,YAAf,UAGE;AAAA,8BAFD,MAAC,QAAD;AAAA,gBAAO,WAAU;AAAA,eAAgC;AAAA,8BACjD,MAAqD,QAArD;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAAqD;AAAA;AAAA,WACpD;AAAA,0BACF,MAOE,QAPF;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS;AAAA,YACT,OAAM;AAAA,YAJP,0BAMC,MAAC,gBAAD;AAAA,cAAc,WAAU;AAAA,aAAU;AAAA,WACjC;AAAA;AAAA,OACD;AAAA,sBAEF,OAoIE,OApIF;AAAA,QAAK,WAAU;AAAA,QAAf,UAoIE;AAAA,UAnIA,WAAW,0BACX,OAeE,OAfF;AAAA,YAAK,WAAU;AAAA,YAAf,UAeE;AAAA,8BAdD,MAAC,QAAD;AAAA,gBAAO,WAAU;AAAA,eAA0C;AAAA,8BAC3D,MAA+D,MAA/D;AAAA,gBAAI,WAAU;AAAA,gBAAd;AAAA,eAA+D;AAAA,8BAC/D,MAGE,KAHF;AAAA,gBAAG,WAAU;AAAA,gBAAb;AAAA,eAGE;AAAA,8BACF,MAOE,UAPF;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,UAAU,aAAY;AAAA,gBACtB,WAAU;AAAA,gBAJX,UAME,aAAY,YAAY,gBAAgB;AAAA,eACxC;AAAA;AAAA,WACD;AAAA,UAGF,WAAW,8BACX,OAQE,OARF;AAAA,YAAK,WAAU;AAAA,YAAf,UAQE;AAAA,8BAPD,MAAC,WAAD;AAAA,gBAAS,WAAU;AAAA,eAAyC;AAAA,8BAC5D,MAAwD,MAAxD;AAAA,gBAAI,WAAU;AAAA,gBAAd;AAAA,eAAwD;AAAA,cACvD,4BACA,MAEE,KAFF;AAAA,gBAAG,WAAU;AAAA,gBAAb,UACE;AAAA,eACA;AAAA;AAAA,WAEF;AAAA,UAGF,WAAW,eAAe,uBAC1B,OAyDE,OAzDF;AAAA,YAAK,WAAU;AAAA,YAAf,UAyDE;AAAA,8BAxDD,OAKE,OALF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UAKE;AAAA,kCAJD,MAAC,OAAD;AAAA,oBAAK,WAAU;AAAA,mBAAkD;AAAA,kCACjE,MAEE,QAFF;AAAA,oBAAM,WAAU;AAAA,oBAAhB;AAAA,mBAEE;AAAA;AAAA,eACD;AAAA,8BAEF,MASE,OATF;AAAA,gBAAK,WAAU;AAAA,gBAAf,0BACC,MAOE,OAPF;AAAA,kBAAK,WAAU;AAAA,kBAAf,0BACC,MAAC,YAAD;AAAA,oBACC,OAAO;AAAA,oBACP,MAAM;AAAA,oBACN,OAAM;AAAA,oBACN,eAAe;AAAA,mBAChB;AAAA,iBACC;AAAA,eACD;AAAA,8BAEF,MAEE,KAFF;AAAA,gBAAG,WAAU;AAAA,gBAAb;AAAA,eAEE;AAAA,8BAEF,OAeE,OAfF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UAeE;AAAA,kCAdD,MAA6C,QAA7C;AAAA,oBAAM,WAAU;AAAA,oBAAhB;AAAA,mBAA6C;AAAA,kCAC7C,OAYE,UAZF;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS;AAAA,oBACT,WAAU;AAAA,oBACV,OAAM;AAAA,oBAJP,UAYE;AAAA,sBANA,YAAY,GAAG;AAAA,sBACf,yBACA,MAAC,SAAD;AAAA,wBAAO,WAAU;AAAA,uBAAyB,oBAE1C,MAAC,OAAD;AAAA,wBAAM,WAAU;AAAA,uBAAgC;AAAA;AAAA,mBAEhD;AAAA;AAAA,eACD;AAAA,8BAEF,OAOE,UAPF;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM,QAAQ,GAAG;AAAA,gBAC1B,WAAU;AAAA,gBAHX,UAOE;AAAA,kCAFD,MAAC,eAAD;AAAA,oBAAc,WAAU;AAAA,mBAAc;AAAA,kBALvC;AAAA;AAAA,eAOE;AAAA,8BAEF,MAOE,UAPF;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,UAAU,YAAW;AAAA,gBACrB,WAAU;AAAA,gBAJX,UAME,YAAW,YAAY,gBAAgB;AAAA,eACvC;AAAA;AAAA,WACD;AAAA,UAGF,WAAW,2BACX,OAoCE,OApCF;AAAA,YAAK,WAAU;AAAA,YAAf,UAoCE;AAAA,cAnCA,OAAO,SAAS,cAAc,oBAC9B;AAAA,0BAOE;AAAA,kCAND,MAAC,QAAD;AAAA,oBAAO,WAAU;AAAA,mBAA+B;AAAA,kCAChD,MAAuD,MAAvD;AAAA,oBAAI,WAAU;AAAA,oBAAd;AAAA,mBAAuD;AAAA,kCACvD,MAGE,KAHF;AAAA,oBAAG,WAAU;AAAA,oBAAb;AAAA,mBAGE;AAAA;AAAA,eACD,oBAEF;AAAA,0BAME;AAAA,kCALD,MAAC,eAAD;AAAA,oBAAa,WAAU;AAAA,mBAAgC;AAAA,kCACvD,MAA4D,MAA5D;AAAA,oBAAI,WAAU;AAAA,oBAAd;AAAA,mBAA4D;AAAA,kCAC5D,MAEE,KAFF;AAAA,oBAAG,WAAU;AAAA,oBAAb,UACE,SAAS;AAAA,mBACT;AAAA;AAAA,eACD;AAAA,8BAEH,MAgBE,UAhBF;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,UACC,aAAY,aAAa,OAAO,SAAS,cAAc;AAAA,gBAExD,WAAU;AAAA,gBACV,OACC,OAAO,SAAS,cAAc,IAC3B,sBACA;AAAA,gBAVL,UAaE,OAAO,SAAS,cAAc,IAC5B,qBACA;AAAA,eACF;AAAA;AAAA,WACD;AAAA;AAAA,OAEF;AAAA;AAAA,GACD;AAAA,CAEH;;AE5ND,iBAAS;AACT,kBAAS;;AAGF,IAAM,sBAAsB,OAAK,SAAS,oBAAmB,GAAG;AAAA,EACtE,MAAM,aAAa,eAAe,CAAC,UAAU,MAAM,UAAU;AAAA,EAC7D,MAAM,gBAAgB,eAAe,CAAC,UAAU,MAAM,aAAa;AAAA,EACnE,MAAM,SAAS,eAAe,CAAC,UAAU,MAAM,MAAM;AAAA,EAErD,MAAM,cAAc,WAAW;AAAA,EAE/B,uBACC,OAcE,UAdF;AAAA,IACC,MAAK;AAAA,IACL,SAAS;AAAA,IACT,WAAW,yGACV,aACG,4BACA;AAAA,IAEJ,OAAM;AAAA,IARP,UAcE;AAAA,sBAJD,MAAC,QAAD;AAAA,QAAO,WAAU;AAAA,OAAwC;AAAA,MACxD,+BACA,MAAC,QAAD;AAAA,QAAM,WAAU;AAAA,OAAyE;AAAA;AAAA,GAEzF;AAAA,CAEH;;AC5BD,iBAAS,oBAAM,2BAAU,0BAAa,wBAAS,uBAAW;AAC1D;AAAA,iBACC;AAAA,kBACA;AAAA;AAAA,kBAEA;AAAA,eACA;AAAA,WACA;AAAA,YACA;AAAA,aACA;AAAA;AAAA,UAEA;AAAA,UACA;AAAA,YACA;AAAA;AAAA;AAMD,2BAAS;;;ACnBT,qBAAS,2BAAU,iCAAa;AAEhC,sBAAS,uBAAW,yBAAQ;AAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBO,SAAS,aAAa,GAAG;AAAA,EAC/B,MAAM,aAAa,YAAY,CAAC,MAAM,EAAE,UAAU;AAAA,EAElD,MAAM,QAAQ,WAAS;AAAA,IACtB,UAAU,CAAC,OAAO,SAAS;AAAA,IAC3B,SAAS,YAAY;AAAA,MACpB,QAAQ,SAAS,MAAM,eAAe;AAAA,MACtC,OAAO;AAAA;AAAA,IAER,iBAAiB;AAAA,EAClB,CAAC;AAAA,EAED,YAAU,MAAM;AAAA,IACf,IAAI,MAAM,MAAM,SAAS;AAAA,MACxB,WAAW,MAAM,KAAK,OAAO;AAAA,IAC9B;AAAA,KACE,CAAC,MAAM,MAAM,UAAU,CAAC;AAAA,EAE3B,OAAO;AAAA;AAGD,SAAS,iBAAiB,GAAG;AAAA,EACnC,MAAM,cAAc,iBAAe;AAAA,EAEnC,OAAO,cAAY;AAAA,IAClB,YAAY,OAAO,SAAiB;AAAA,MACnC,QAAQ,MAAM,UAAU,MAAM,eAAe;AAAA,QAC5C,MAAM,EAAE,KAAK;AAAA,MACd,CAAC;AAAA,MACD,IAAI;AAAA,QAAO,MAAM,IAAI,MAAM,wBAAwB;AAAA,MACnD,MAAM,SAAS;AAAA,MAaf,IAAI,CAAC,OAAO;AAAA,QAAI,MAAM,IAAI,MAAM,OAAO,SAAS,wBAAwB;AAAA,MACxE,OAAO;AAAA;AAAA,IAER,WAAW,MAAM;AAAA,MAChB,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,SAAS,EAAE,CAAC;AAAA;AAAA,EAEhE,CAAC;AAAA;AAGK,SAAS,gBAAgB,GAAG;AAAA,EAClC,MAAM,cAAc,iBAAe;AAAA,EACnC,MAAM,aAAa,YAAY,CAAC,MAAM,EAAE,UAAU;AAAA,EAElD,OAAO,cAAY;AAAA,IAClB,YAAY,OAAO,SAAiB;AAAA,MACnC,WAAW,MAAM,IAAI;AAAA,MACrB,QAAQ,MAAM,UAAU,MAAM,cAAc;AAAA,QAC3C,MAAM,EAAE,KAAK;AAAA,MACd,CAAC;AAAA,MACD,IAAI;AAAA,QAAO,MAAM,IAAI,MAAM,uBAAuB;AAAA,MAClD,MAAM,SAAS;AAAA,MACf,IAAI,CAAC,OAAO;AAAA,QAAI,MAAM,IAAI,MAAM,OAAO,SAAS,uBAAuB;AAAA,MACvE,OAAO;AAAA;AAAA,IAER,WAAW,CAAC,OAAO,QAAQ,SAAS;AAAA,MACnC,WAAW,MAAM,KAAK;AAAA,MACtB,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,SAAS,EAAE,CAAC;AAAA;AAAA,EAEhE,CAAC;AAAA;AAeK,SAAS,eAAe,GAAG;AAAA,EACjC,MAAM,cAAc,iBAAe;AAAA,EAEnC,OAAO,cAAY;AAAA,IAClB,YAAY,OAAO,WAA+B;AAAA,MACjD,QAAQ,MAAM,UAAU,MAAM,aAAa;AAAA,QAC1C,MAAM;AAAA,MACP,CAAC;AAAA,MACD,IAAI;AAAA,QAAO,MAAM,IAAI,MAAM,0BAA0B;AAAA,MACrD,MAAM,SAAS;AAAA,MACf,IAAI,CAAC,OAAO;AAAA,QACX,MAAM,IAAI,MAAM,OAAO,SAAS,0BAA0B;AAAA,MAC3D,OAAO;AAAA;AAAA,IAER,WAAW,MAAM;AAAA,MAChB,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,SAAS,EAAE,CAAC;AAAA;AAAA,EAEhE,CAAC;AAAA;AAGK,SAAS,kBAAkB,GAAG;AAAA,EACpC,MAAM,cAAc,iBAAe;AAAA,EAEnC,OAAO,cAAY;AAAA,IAClB,YAAY,OAAO,SAAiB;AAAA,MACnC,QAAQ,MAAM,UAAU,MAAM,gBAAgB;AAAA,QAC7C,MAAM,EAAE,KAAK;AAAA,MACd,CAAC;AAAA,MACD,IAAI;AAAA,QAAO,MAAM,IAAI,MAAM,6BAA6B;AAAA,MACxD,MAAM,SAAS;AAAA,MACf,IAAI,CAAC,OAAO;AAAA,QACX,MAAM,IAAI,MAAM,OAAO,SAAS,6BAA6B;AAAA,MAC9D,OAAO;AAAA;AAAA,IAER,WAAW,MAAM;AAAA,MAChB,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,SAAS,EAAE,CAAC;AAAA;AAAA,EAEhE,CAAC;AAAA;AAGK,SAAS,wBAAwB,GAAG;AAAA,EAC1C,MAAM,cAAc,iBAAe;AAAA,EAEnC,OAAO,cAAY;AAAA,IAClB,YAAY,OAAO,SAAiB;AAAA,MACnC,QAAQ,MAAM,UAAU,MAAM,gBAAgB;AAAA,QAC7C,MAAM,EAAE,KAAK;AAAA,MACd,CAAC;AAAA,MACD,IAAI;AAAA,QAAO,MAAM,IAAI,MAAM,yBAAyB;AAAA,MACpD,MAAM,SAAS;AAAA,MAYf,IAAI,CAAC,OAAO;AAAA,QACX,MAAM,IAAI,MAAM,OAAO,SAAS,yBAAyB;AAAA,MAC1D,OAAO;AAAA;AAAA,IAER,WAAW,MAAM;AAAA,MAChB,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,SAAS,EAAE,CAAC;AAAA;AAAA,EAEhE,CAAC;AAAA;AAGK,SAAS,gBAAgB,GAAG;AAAA,EAClC,MAAM,cAAc,iBAAe;AAAA,EAEnC,OAAO,cAAY;AAAA,IAClB,YAAY,OAAO,SAAiB;AAAA,MACnC,QAAQ,MAAM,UAAU,MAAM,cAAc;AAAA,QAC3C,MAAM,EAAE,KAAK;AAAA,MACd,CAAC;AAAA,MACD,IAAI;AAAA,QAAO,MAAM,IAAI,MAAM,uBAAuB;AAAA,MAClD,MAAM,SAAS;AAAA,MACf,IAAI,CAAC,OAAO;AAAA,QAAI,MAAM,IAAI,MAAM,OAAO,SAAS,uBAAuB;AAAA,MACvE,OAAO;AAAA;AAAA,IAER,WAAW,MAAM;AAAA,MAChB,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,SAAS,EAAE,CAAC;AAAA;AAAA,EAEhE,CAAC;AAAA;AAGK,SAAS,gBAAgB,CAAC,MAAqB;AAAA,EACrD,OAAO,WAAS;AAAA,IACf,UAAU,CAAC,OAAO,QAAQ,IAAI;AAAA,IAC9B,SAAS,YAAY;AAAA,MACpB,IAAI,CAAC;AAAA,QAAM,OAAO,EAAE,eAAe,MAAM;AAAA,MACzC,QAAQ,SAAS,MAAM,iBAAiB;AAAA,QACvC,MAAM,EAAE,KAAK;AAAA,MACd,CAAC;AAAA,MACD,OAAO;AAAA;AAAA,IAKR,SAAS,CAAC,CAAC;AAAA,IACX,iBAAiB;AAAA,EAClB,CAAC;AAAA;AAGK,SAAS,sBAAsB,GAAG;AAAA,EACxC,MAAM,gBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa;AAAA,EACxD,MAAM,mBAAmB,YAAY,CAAC,MAAM,EAAE,gBAAgB;AAAA,EAC9D,MAAM,aAAa,YAAY,CAAC,MAAM,EAAE,UAAU;AAAA,EAClD,MAAM,cAAc,iBAAe;AAAA,EACnC,MAAM,WAAW,SAA8C,IAAI;AAAA,EAEnE,MAAM,cAAc,cAAY,MAAM;AAAA,IACrC,IAAI,SAAS,SAAS;AAAA,MACrB,cAAc,SAAS,OAAO;AAAA,MAC9B,SAAS,UAAU;AAAA,IACpB;AAAA,KACE,CAAC,CAAC;AAAA,EAEL,YAAU,MAAM;AAAA,IACf,IAAI,CAAC,eAAe;AAAA,MACnB,YAAY;AAAA,MACZ;AAAA,IACD;AAAA,IAEA,QAAQ,WAAW,YAAY,aAAa;AAAA,IAC5C,MAAM,UAAU,YAAY,KAAK,OAAO;AAAA,IAExC,SAAS,UAAU,YAAY,YAAY;AAAA,MAC1C,IAAI;AAAA,QACH,QAAQ,SAAS,MAAM,gBAAgB;AAAA,UACtC,MAAM,EAAE,MAAM,WAAW;AAAA,UACzB,MAAM,EAAE,UAAU;AAAA,QACnB,CAAC;AAAA,QAED,MAAM,SAAS;AAAA,QAMf,IAAI,QAAQ,WAAW,YAAY;AAAA,UAClC,YAAY;AAAA,UACZ,iBAAiB,IAAI;AAAA,UACrB,WAAW,YAAY,KAAK;AAAA,UAC5B,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,SAAS,EAAE,CAAC;AAAA,QAC/D,EAAO,SAAI,QAAQ,WAAW,SAAS;AAAA,UACtC,YAAY;AAAA,UACZ,iBAAiB,IAAI;AAAA,UACrB,WAAW,YAAY,KAAK;AAAA,QAC7B;AAAA,QACC,MAAM;AAAA,QACP,YAAY;AAAA,QACZ,iBAAiB,IAAI;AAAA,QACrB,WAAW,YAAY,KAAK;AAAA;AAAA,OAE3B,MAAM;AAAA,IAET,OAAO;AAAA,KACL,CAAC,eAAe,kBAAkB,YAAY,aAAa,WAAW,CAAC;AAAA,EAE1E,OAAO;AAAA;;;AC7QR,iBAAS,oBAAM,2BAAU,yBAAa,uBAAQ;AAC9C,kBAAS,2BAAe,kCAAoB;;AAc5C,SAAS,kBAAkB,CAAC,OAG1B;AAAA,EACD,MAAM,QAAQ,MAAM,KAAK,EAAE,MAAM,KAAK;AAAA,EACtC,OAAO,EAAE,SAAS,MAAM,MAAM,IAAI,MAAM,MAAM,MAAM,CAAC,EAAE;AAAA;AAGxD,SAAS,QAAQ,CAAC,QAAoD;AAAA,EACrE,MAAM,UAAU,OAAO,KAAK;AAAA,EAC5B,IAAI,CAAC;AAAA,IAAS;AAAA,EACd,MAAM,MAA8B,CAAC;AAAA,EACrC,WAAW,QAAQ,QAAQ,MAAM;AAAA,CAAI,GAAG;AAAA,IACvC,MAAM,KAAK,KAAK,QAAQ,GAAG;AAAA,IAC3B,IAAI,KAAK,GAAG;AAAA,MACX,IAAI,KAAK,MAAM,GAAG,EAAE,EAAE,KAAK,KAAK,KAAK,MAAM,KAAK,CAAC,EAAE,KAAK;AAAA,IACzD;AAAA,EACD;AAAA,EACA,OAAO,OAAO,KAAK,GAAG,EAAE,SAAS,IAAI,MAAM;AAAA;AAG5C,SAAS,YAAY,CAAC,WAAuD;AAAA,EAC5E,MAAM,UAAU,UAAU,KAAK;AAAA,EAC/B,IAAI,CAAC;AAAA,IAAS;AAAA,EACd,MAAM,UAAkC,CAAC;AAAA,EACzC,WAAW,QAAQ,QAAQ,MAAM;AAAA,CAAI,GAAG;AAAA,IACvC,MAAM,QAAQ,KAAK,QAAQ,GAAG;AAAA,IAC9B,IAAI,QAAQ,GAAG;AAAA,MACd,QAAQ,KAAK,MAAM,GAAG,KAAK,EAAE,KAAK,KAAK,KAAK,MAAM,QAAQ,CAAC,EAAE,KAAK;AAAA,IACnE;AAAA,EACD;AAAA,EACA,OAAO,OAAO,KAAK,OAAO,EAAE,SAAS,IAAI,UAAU;AAAA;AAG7C,IAAM,oBAAoB,OAAK,SAAS,kBAAiB;AAAA,EAC/D;AAAA,EACA;AAAA,GAC0B;AAAA,EAC1B,OAAO,YAAY,iBAAiB,WAAqB,OAAO;AAAA,EAChE,OAAO,MAAM,WAAW,WAAS,EAAE;AAAA,EACnC,OAAO,YAAY,iBAAiB,WAAS,EAAE;AAAA,EAC/C,OAAO,KAAK,UAAU,WAAS,EAAE;AAAA,EACjC,OAAO,WAAW,gBAAgB,WAAyB,MAAM;AAAA,EACjE,OAAO,YAAY,iBAAiB,WAAS,EAAE;AAAA,EAC/C,OAAO,QAAQ,aAAa,WAAS,EAAE;AAAA,EACvC,OAAO,OAAO,YAAY,WAAmB,QAAQ;AAAA,EACrD,OAAO,OAAO,YAAY,WAAwB,IAAI;AAAA,EAEtD,MAAM,YAAY,gBAAgB;AAAA,EAElC,MAAM,QAAQ,cAAY,MAAM;AAAA,IAC/B,QAAQ,EAAE;AAAA,IACV,cAAc,EAAE;AAAA,IAChB,OAAO,EAAE;AAAA,IACT,aAAa,MAAM;AAAA,IACnB,cAAc,EAAE;AAAA,IAChB,UAAU,EAAE;AAAA,IACZ,SAAS,QAAQ;AAAA,IACjB,SAAS,IAAI;AAAA,IACb,cAAc,OAAO;AAAA,KACnB,CAAC,CAAC;AAAA,EAEL,MAAM,cAAc,cAAY,MAAM;AAAA,IACrC,MAAM;AAAA,IACN,QAAQ;AAAA,KACN,CAAC,OAAO,OAAO,CAAC;AAAA,EAEnB,MAAM,eAAe,cAAY,YAAY;AAAA,IAC5C,SAAS,IAAI;AAAA,IACb,MAAM,cAAc,KAAK,KAAK;AAAA,IAE9B,IAAI,CAAC,aAAa;AAAA,MACjB,SAAS,yBAAyB;AAAA,MAClC;AAAA,IACD;AAAA,IAEA,IAAI;AAAA,MACH,IAAI,eAAe,SAAS;AAAA,QAC3B,MAAM,aAAa,WAAW,KAAK;AAAA,QACnC,IAAI,CAAC,YAAY;AAAA,UAChB,SAAS,qBAAqB;AAAA,UAC9B;AAAA,QACD;AAAA,QACA,IAAI,gBAAgB,KAAK,UAAU,GAAG;AAAA,UACrC,SACC,4EACD;AAAA,UACA;AAAA,QACD;AAAA,QACA,QAAQ,SAAS,SAAS,mBAAmB,UAAU;AAAA,QACvD,MAAM,UAAU,YAAY;AAAA,UAC3B,MAAM;AAAA,UACN,WAAW;AAAA,UACX;AAAA,UACA;AAAA,UACA,KAAK,SAAS,MAAM;AAAA,UACpB;AAAA,QACD,CAAC;AAAA,MACF,EAAO;AAAA,QACN,MAAM,aAAa,IAAI,KAAK;AAAA,QAC5B,IAAI,CAAC,YAAY;AAAA,UAChB,SAAS,iBAAiB;AAAA,UAC1B;AAAA,QACD;AAAA,QACA,MAAM,UAAU,YAAY;AAAA,UAC3B,MAAM;AAAA,UACN;AAAA,UACA,KAAK;AAAA,UACL,SAAS,aAAa,UAAU;AAAA,UAChC;AAAA,QACD,CAAC;AAAA;AAAA,MAEF,YAAY;AAAA,MACX,OAAO,KAAK;AAAA,MACb,SAAS,eAAe,QAAQ,IAAI,UAAU,sBAAsB;AAAA;AAAA,KAEnE;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAC;AAAA,EAED,MAAM,aAAa,SAAuB,IAAI;AAAA,EAC9C,OAAO,eAAe,oBAAoB,WACzC,SACD;AAAA,EAEA,YAAU,MAAM;AAAA,IACf,MAAM,KAAK,WAAW;AAAA,IACtB,IAAI,CAAC;AAAA,MAAI;AAAA,IACT,MAAM,WAAW,IAAI,eAAe,MAAM;AAAA,MACzC,iBAAiB,GAAG,YAAY;AAAA,KAChC;AAAA,IACD,SAAS,QAAQ,EAAE;AAAA,IACnB,OAAO,MAAM,SAAS,WAAW;AAAA,KAC/B,CAAC,CAAC;AAAA,EAEL,uBACC,MA6NE,OA7NF;AAAA,IAAO;AAAA,IAAgB,SAAS;AAAA,IAAa,OAAM;AAAA,IAAnD,0BACC,MA2NE,OA3NF;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,QAAQ,kBAAkB,YAAY,gBAAgB,OAAO;AAAA,MAFvE,0BAIC,OAsNE,OAtNF;AAAA,QAAK,KAAK;AAAA,QAAY,WAAU;AAAA,QAAhC,UAsNE;AAAA,0BArND,OAgCE,OAhCF;AAAA,YAAK,WAAU;AAAA,YAAf,UAgCE;AAAA,8BA/BD,MAAC,OAAD;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO;AAAA,kBACN,MAAM,eAAe,UAAU,QAAQ;AAAA,kBACvC,OAAO,eAAe,WAAW,QAAQ;AAAA,gBAC1C;AAAA,eACD;AAAA,8BACA,OAWE,UAXF;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM,cAAc,OAAO;AAAA,gBACpC,WAAW,kIACV,eAAe,UACZ,oBACA;AAAA,gBANL,UAWE;AAAA,kCAFD,MAAC,WAAD;AAAA,oBAAU,WAAU;AAAA,mBAAU;AAAA,kBAT/B;AAAA;AAAA,eAWE;AAAA,8BACF,OAWE,UAXF;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM,cAAc,QAAQ;AAAA,gBACrC,WAAW,kIACV,eAAe,WACZ,oBACA;AAAA,gBANL,UAWE;AAAA,kCAFD,MAAC,QAAD;AAAA,oBAAO,WAAU;AAAA,mBAAU;AAAA,kBAT5B;AAAA;AAAA,eAWE;AAAA;AAAA,WACD;AAAA,0BAEF,OAQE,OARF;AAAA,sBAQE;AAAA,8BAPD,MAAgD,OAAhD;AAAA,gBAAK,WAAU;AAAA,gBAAf;AAAA,eAAgD;AAAA,8BAChD,MAAC,OAAD;AAAA,gBACC,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,KAAK;AAAA,gBACvC,aAAY;AAAA,gBACZ,WAAS;AAAA,eACV;AAAA;AAAA,WACC;AAAA,UAED,eAAe,0BACf;AAAA,sBAiCE;AAAA,8BAhCD,OAgBE,OAhBF;AAAA,0BAgBE;AAAA,kCAfD,MAAmD,OAAnD;AAAA,oBAAK,WAAU;AAAA,oBAAf;AAAA,mBAAmD;AAAA,kCACnD,MAAC,OAAD;AAAA,oBACC,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,oBAC7C,aAAY;AAAA,oBACZ,WAAW,CAAC,MAAM;AAAA,sBACjB,IAAI,EAAE,QAAQ;AAAA,wBAAS,aAAa;AAAA;AAAA,mBAEtC;AAAA,kCACA,OAKE,KALF;AAAA,oBAAG,WAAU;AAAA,oBAAb,UAKE;AAAA,sBALF;AAAA,sBACM;AAAA,sCACL,MAEE,QAFF;AAAA,wBAAM,WAAU;AAAA,wBAAhB;AAAA,uBAEE;AAAA;AAAA,mBACD;AAAA;AAAA,eACD;AAAA,8BACF,OAcE,OAdF;AAAA,0BAcE;AAAA,kCAbD,MAEE,OAFF;AAAA,oBAAK,WAAU;AAAA,oBAAf;AAAA,mBAEE;AAAA,kCACF,MAAC,YAAD;AAAA,oBACC,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,KAAK;AAAA,oBACzC,aAAa;AAAA;AAAA,oBACb,MAAM;AAAA,oBACN,WAAU;AAAA,mBACX;AAAA,kCACA,MAEE,KAFF;AAAA,oBAAG,WAAU;AAAA,oBAAb;AAAA,mBAEE;AAAA;AAAA,eACD;AAAA;AAAA,WACD,oBAEF;AAAA,sBA+DE;AAAA,8BA9DD,OAUE,OAVF;AAAA,0BAUE;AAAA,kCATD,MAA+C,OAA/C;AAAA,oBAAK,WAAU;AAAA,oBAAf;AAAA,mBAA+C;AAAA,kCAC/C,MAAC,OAAD;AAAA,oBACC,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM,OAAO,EAAE,OAAO,KAAK;AAAA,oBACtC,aAAY;AAAA,oBACZ,WAAW,CAAC,MAAM;AAAA,sBACjB,IAAI,EAAE,QAAQ;AAAA,wBAAS,aAAa;AAAA;AAAA,mBAEtC;AAAA;AAAA,eACC;AAAA,8BACF,OAiCE,OAjCF;AAAA,0BAiCE;AAAA,kCAhCD,MAAqD,OAArD;AAAA,oBAAK,WAAU;AAAA,oBAAf;AAAA,mBAAqD;AAAA,kCACrD,OA8BE,OA9BF;AAAA,oBAAK,WAAU;AAAA,oBAAf,UA8BE;AAAA,sCA7BD,MAAC,OAAD;AAAA,wBACC,WAAU;AAAA,wBACV,OAAO;AAAA,0BACN,MAAM,cAAc,SAAS,QAAQ;AAAA,0BACrC,OAAO,cAAc,QAAQ,QAAQ;AAAA,wBACtC;AAAA,uBACD;AAAA,sCACA,MAUE,UAVF;AAAA,wBACC,MAAK;AAAA,wBACL,SAAS,MAAM,aAAa,MAAM;AAAA,wBAClC,WAAW,sIACV,cAAc,SACX,oBACA;AAAA,wBANL;AAAA,uBAUE;AAAA,sCACF,MAUE,UAVF;AAAA,wBACC,MAAK;AAAA,wBACL,SAAS,MAAM,aAAa,KAAK;AAAA,wBACjC,WAAW,sIACV,cAAc,QACX,oBACA;AAAA,wBANL;AAAA,uBAUE;AAAA;AAAA,mBACD;AAAA;AAAA,eACD;AAAA,8BACF,OAYE,OAZF;AAAA,0BAYE;AAAA,kCAXD,MAAmD,OAAnD;AAAA,oBAAK,WAAU;AAAA,oBAAf;AAAA,mBAAmD;AAAA,kCACnD,MAAC,YAAD;AAAA,oBACC,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,oBAC7C,aAAa;AAAA,oBACb,MAAM;AAAA,oBACN,WAAU;AAAA,mBACX;AAAA,kCACA,MAEE,KAFF;AAAA,oBAAG,WAAU;AAAA,oBAAb;AAAA,mBAEE;AAAA;AAAA,eACD;AAAA,8BACF,MAGE,KAHF;AAAA,gBAAG,WAAU;AAAA,gBAAb;AAAA,eAGE;AAAA;AAAA,WACD;AAAA,0BAGH,OAwCE,OAxCF;AAAA,sBAwCE;AAAA,8BAvCD,MAAiD,OAAjD;AAAA,gBAAK,WAAU;AAAA,gBAAf;AAAA,eAAiD;AAAA,8BACjD,OAgCE,OAhCF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UAgCE;AAAA,kCA/BD,MAAC,OAAD;AAAA,oBACC,WAAU;AAAA,oBACV,OAAO;AAAA,sBACN,MAAM,UAAU,WAAW,QAAQ;AAAA,sBACnC,OAAO,UAAU,YAAY,QAAQ;AAAA,oBACtC;AAAA,mBACD;AAAA,kCACA,OAWE,UAXF;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM,SAAS,QAAQ;AAAA,oBAChC,WAAW,sIACV,UAAU,WACP,oBACA;AAAA,oBANL,UAWE;AAAA,sCAFD,MAAC,QAAD;AAAA,wBAAQ,WAAU;AAAA,uBAAU;AAAA,sBAT7B;AAAA;AAAA,mBAWE;AAAA,kCACF,OAWE,UAXF;AAAA,oBACC,MAAK;AAAA,oBACL,SAAS,MAAM,SAAS,SAAS;AAAA,oBACjC,WAAW,sIACV,UAAU,YACP,oBACA;AAAA,oBANL,UAWE;AAAA,sCAFD,MAAC,WAAD;AAAA,wBAAW,WAAU;AAAA,uBAAU;AAAA,sBAThC;AAAA;AAAA,mBAWE;AAAA;AAAA,eACD;AAAA,8BACF,MAIE,KAJF;AAAA,gBAAG,WAAU;AAAA,gBAAb,UACE,UAAU,WACR,wCACA;AAAA,eACF;AAAA;AAAA,WACD;AAAA,UAED,yBACA,MAEE,OAFF;AAAA,YAAK,WAAU;AAAA,YAAf,UACE;AAAA,WACA;AAAA,0BAGH,OAkBE,OAlBF;AAAA,YAAK,WAAU;AAAA,YAAf,UAkBE;AAAA,8BAjBD,MAEE,QAFF;AAAA,gBAAQ,SAAQ;AAAA,gBAAQ,SAAS;AAAA,gBAAjC;AAAA,eAEE;AAAA,8BACF,MAaE,QAbF;AAAA,gBACC,SAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,UAAU,UAAU;AAAA,gBAHrB,UAKE,UAAU,4BACV;AAAA,4BAGE;AAAA,oCAFD,MAAC,WAAD;AAAA,sBAAS,WAAU;AAAA,qBAA4B;AAAA,oBADhD;AAAA;AAAA,iBAGE,IAEF;AAAA,eAEA;AAAA;AAAA,WACD;AAAA;AAAA,OACD;AAAA,KACD;AAAA,GACD;AAAA,CAEH;;;;AF/VD,IAAM,eAAe,OAAK,SAAS,aAAY;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GAME;AAAA,EACF,uBACC,MAoBE,UApBF;AAAA,IACC,MAAK;AAAA,IACL,MAAK;AAAA,IACL,gBAAc;AAAA,IACd,UAAU,YAAY;AAAA,IACtB,SAAS,CAAC,MAAM;AAAA,MACf,EAAE,gBAAgB;AAAA,MAClB,SAAS;AAAA;AAAA,IAEV,WAAW,kLACV,UAAU,iBAAiB;AAAA,IAV7B,0BAaC,MAME,QANF;AAAA,MACC,WAAW,2EACV,UAAU,uBAAuB,uBAC9B,UAAU,mBAAmB;AAAA,MAHlC,UAKE,2BAAW,MAAC,WAAD;AAAA,QAAS,WAAU;AAAA,OAAsC;AAAA,KACpE;AAAA,GACD;AAAA,CAEH;AAED,IAAM,oBAAoB,OAAK,SAAS,kBAAiB;AAAA,EACxD;AAAA,EACA;AAAA,GAIE;AAAA,EACF,OAAO,QAAQ,aAAa,WAAS,KAAK;AAAA,EAE1C,MAAM,aAAa,cAAY,MAAM;AAAA,IACpC,UAAU,UAAU,UAAU,QAAQ,EAAE,KAAK,MAAM;AAAA,MAClD,UAAU,IAAI;AAAA,MACd,WAAW,MAAM,UAAU,KAAK,GAAG,IAAI;AAAA,KACvC;AAAA,KACC,CAAC,QAAQ,CAAC;AAAA,EAEb,uBACC,MAkCE,OAlCF;AAAA,IAAK,WAAU;AAAA,IAAf,0BACC,OAgCE,OAhCF;AAAA,MAAK,WAAU;AAAA,MAAf,UAgCE;AAAA,wBA/BD,OAGE,OAHF;AAAA,UAAK,WAAU;AAAA,UAAf,UAGE;AAAA,4BAFD,MAAC,WAAD;AAAA,cAAS,WAAU;AAAA,aAAqD;AAAA,4BACxE,MAA4D,QAA5D;AAAA,cAAM,WAAU;AAAA,cAAhB;AAAA,aAA4D;AAAA;AAAA,SAC3D;AAAA,wBACF,OAaE,OAbF;AAAA,UAAK,WAAU;AAAA,UAAf,UAaE;AAAA,4BAZD,MAEE,QAFF;AAAA,cAAM,WAAU;AAAA,cAAhB,UACE;AAAA,aACA;AAAA,4BACF,MAOE,UAPF;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,WAAU;AAAA,cACV,OAAM;AAAA,cAJP,0BAMC,MAAC,eAAD;AAAA,gBAAe,WAAU;AAAA,eAAc;AAAA,aACtC;AAAA,YACD,0BAAU,MAAkD,QAAlD;AAAA,cAAM,WAAU;AAAA,cAAhB;AAAA,aAAkD;AAAA;AAAA,SAC5D;AAAA,wBACF,OAYE,KAZF;AAAA,UACC,MAAM;AAAA,UACN,QAAO;AAAA,UACP,KAAI;AAAA,UACJ,SAAS,CAAC,MAAM;AAAA,YACf,EAAE,eAAe;AAAA,YACjB,QAAQ,eAAe;AAAA;AAAA,UAExB,WAAU;AAAA,UARX,UAYE;AAAA,YAZF;AAAA,4BAWC,MAAC,eAAD;AAAA,cAAc,WAAU;AAAA,aAAU;AAAA;AAAA,SACjC;AAAA;AAAA,KACD;AAAA,GACD;AAAA,CAEH;AAED,IAAM,gBAAgB,OAAK,SAAS,cAAa;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GAUE;AAAA,EACF,OAAO,WAAW,gBAAgB,WAAS,KAAK;AAAA,EAChD,MAAM,WAAW,OAAO,aAAa,OAAO,MAAM,SAAS;AAAA,EAC3D,MAAM,WAAW,OAAO,cAAc,UAAU,OAAO,cAAc;AAAA,EACrE,MAAM,kBAAkB,CAAC,CAAC,WAAW,CAAC,CAAC,kBAAkB,CAAC,OAAO;AAAA,EAEjE,MAAM,eAAe,cAAY,MAAM;AAAA,IACtC,IAAI,OAAO,gBAAgB,CAAC,OAAO,WAAW;AAAA,MAC7C,OAAO;AAAA,IACR,EAAO,SAAI,OAAO,WAAW;AAAA,MAC5B,OAAO;AAAA,IACR,EAAO;AAAA,MACN,QAAQ;AAAA;AAAA,KAEP,CAAC,OAAO,WAAW,OAAO,cAAc,QAAQ,QAAQ,OAAO,CAAC;AAAA,EAEnE,MAAM,cAAc,cAAY,MAAM;AAAA,IACrC,IAAI;AAAA,MAAU,aAAa,CAAC,SAAS,CAAC,IAAI;AAAA,KACxC,CAAC,QAAQ,CAAC;AAAA,EAEb,uBACC,OAqHE,OArHF;AAAA,IACC,WAAW,0DACV,OAAO,YACJ,uCACA,iBACC,yCACA;AAAA,IANN,UAqHE;AAAA,sBA5GD,OA8DE,OA9DF;AAAA,QAAK,WAAU;AAAA,QAAf,UA8DE;AAAA,0BA7DD,MAAC,cAAD;AAAA,YACC,SAAS,OAAO;AAAA,YAChB,SAAS,aAAa;AAAA,YACtB,UAAU;AAAA,WACX;AAAA,0BAEA,OA2BE,OA3BF;AAAA,YAAK,WAAU;AAAA,YAAf,UA2BE;AAAA,8BA1BD,OAQE,OARF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UAQE;AAAA,kCAPD,MAA8D,QAA9D;AAAA,oBAAM,WAAU;AAAA,oBAAhB,UAAgD,OAAO;AAAA,mBAAO;AAAA,kBAC7D,4BACA,MAAC,QAAD;AAAA,oBAAO,WAAU;AAAA,mBAA8C;AAAA,kBAE/D,OAAO,gBAAgB,CAAC,OAAO,6BAC/B,MAAC,MAAD;AAAA,oBAAM,WAAU;AAAA,mBAAwC;AAAA;AAAA,eAExD;AAAA,8BACF,OAgBE,OAhBF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UAgBE;AAAA,kCAfD,MAIE,QAJF;AAAA,oBAAM,WAAU;AAAA,oBAAhB,UACE,WACE,OAAO,MACP,GAAG,OAAO,WAAW,MAAM,OAAO,KAAK,KAAK,GAAG;AAAA,mBACjD;AAAA,kCACF,MASE,QATF;AAAA,oBACC,WAAU;AAAA,oBACV,OAAO,OAAO,UAAU,YAAY,kBAAkB;AAAA,oBAFvD,UAIE,OAAO,UAAU,4BACjB,MAAC,YAAD;AAAA,sBAAW,WAAU;AAAA,qBAAU,oBAE/B,MAAC,SAAD;AAAA,sBAAQ,WAAU;AAAA,qBAAU;AAAA,mBAE5B;AAAA;AAAA,eACD;AAAA;AAAA,WACD;AAAA,0BAEF,OAyBE,OAzBF;AAAA,YAAK,WAAU;AAAA,YAAf,UAyBE;AAAA,cAxBA,4BACA,OAYE,UAZF;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,WAAU;AAAA,gBAHX,UAYE;AAAA,kCAPD,MAAC,QAAD;AAAA,oBAAQ,WAAU;AAAA,mBAAU;AAAA,kBAC3B,OAAO,MAAM;AAAA,kBACb,4BACA,MAAC,eAAD;AAAA,oBAAa,WAAU;AAAA,mBAAU,oBAEjC,MAAC,gBAAD;AAAA,oBAAc,WAAU;AAAA,mBAAU;AAAA;AAAA,eAElC;AAAA,8BAEH,MAQE,QARF;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,OAAM;AAAA,gBACN,WAAU;AAAA,gBALX,0BAOC,MAAC,SAAD;AAAA,kBAAQ,WAAU;AAAA,iBAAmD;AAAA,eACpE;AAAA;AAAA,WACD;AAAA;AAAA,OACD;AAAA,MAED,iBAAiB,CAAC,OAAO,6BACzB,MAAC,mBAAD;AAAA,QACC,UAAU,cAAc;AAAA,QACxB,iBAAiB,cAAc;AAAA,OAChC;AAAA,MAGA,CAAC,iBAAiB,kBAAkB,2BACpC,MAkBE,OAlBF;AAAA,QAAK,WAAU;AAAA,QAAf,0BACC,OAgBE,OAhBF;AAAA,UAAK,WAAU;AAAA,UAAf,UAgBE;AAAA,4BAfD,MAAC,WAAD;AAAA,cAAS,WAAU;AAAA,aAAqD;AAAA,4BACxE,MAA0D,QAA1D;AAAA,cAAM,WAAU;AAAA,cAAhB;AAAA,aAA0D;AAAA,4BAC1D,OAYE,KAZF;AAAA,cACC,MAAM;AAAA,cACN,QAAO;AAAA,cACP,KAAI;AAAA,cACJ,SAAS,CAAC,MAAM;AAAA,gBACf,EAAE,eAAe;AAAA,gBACjB,QAAQ,OAAO;AAAA;AAAA,cAEhB,WAAU;AAAA,cARX,UAYE;AAAA,gBAZF;AAAA,gCAWC,MAAC,eAAD;AAAA,kBAAc,WAAU;AAAA,iBAAU;AAAA;AAAA,aACjC;AAAA;AAAA,SACD;AAAA,OACD;AAAA,MAGF,YAAY,6BACZ,MAYE,OAZF;AAAA,QAAK,WAAU;AAAA,QAAf,0BACC,MAUE,OAVF;AAAA,UAAK,WAAU;AAAA,UAAf,UACE,OAAO,MAAM,IAAI,CAAC,yBAClB,MAME,QANF;AAAA,YAEC,WAAU;AAAA,YACV,OAAO;AAAA,YAHR,UAKE,KAAK,MAAM,IAAI,EAAE,IAAI;AAAA,aAJjB,IAKJ,CACF;AAAA,SACA;AAAA,OACD;AAAA;AAAA,GAEF;AAAA,CAEH;AAED,SAAS,aAAa,CAAC,MAAqB,iBAA6B;AAAA,EACxE,QAAQ,SAAS,iBAAiB,IAAI;AAAA,EACtC,MAAM,WAAW,SAAO,KAAK;AAAA,EAE7B,YAAU,MAAM;AAAA,IACf,IAAI,MAAM,iBAAiB,CAAC,SAAS,SAAS;AAAA,MAC7C,gBAAgB;AAAA,IACjB;AAAA,IACA,SAAS,UAAU,MAAM,iBAAiB;AAAA,KACxC,CAAC,MAAM,eAAe,eAAe,CAAC;AAAA;AAGnC,IAAM,aAAa,OAAK,SAAS,WAAU,GAAG;AAAA,EACpD,MAAM,aAAa,YAAY,CAAC,MAAM,EAAE,UAAU;AAAA,EAClD,MAAM,kBAAkB,YAAY,CAAC,MAAM,EAAE,eAAe;AAAA,EAC5D,MAAM,UAAU,YAAY,CAAC,MAAM,EAAE,OAAO;AAAA,EAC5C,MAAM,UAAU,YAAY,CAAC,MAAM,EAAE,OAAO;AAAA,EAC5C,MAAM,WAAW,YAAY,CAAC,MAAM,EAAE,QAAQ;AAAA,EAC9C,MAAM,aAAa,YAAY,CAAC,MAAM,EAAE,UAAU;AAAA,EAClD,MAAM,aAAa,YAAY,CAAC,MAAM,EAAE,UAAU;AAAA,EAClD,MAAM,mBAAmB,YAAY,CAAC,MAAM,EAAE,gBAAgB;AAAA,EAE9D,QAAQ,WAAW,eAAe,cAAc;AAAA,EAChD,MAAM,cAAc,kBAAkB;AAAA,EACtC,MAAM,aAAa,iBAAiB;AAAA,EACpC,MAAM,eAAe,mBAAmB;AAAA,EACxC,MAAM,aAAa,yBAAyB;AAAA,EAC5C,MAAM,gBAAgB,uBAAuB;AAAA,EAE7C,OAAO,gBAAgB,qBAAqB,WAAS,KAAK;AAAA,EAC1D,OAAO,eAAe,oBAAoB,WAAwB,IAAI;AAAA,EACtE,OAAO,cAAc,mBAAmB,WAAwB,IAAI;AAAA,EAEpE,MAAM,cAAc,iBAAe;AAAA,EAEnC,MAAM,sBAAsB,cAAY,MAAM;AAAA,IAC7C,IAAI,eAAe;AAAA,MAClB,WAAW,eAAe,IAAI;AAAA,MAC9B,iBAAiB,IAAI;AAAA,MACrB,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,SAAS,EAAE,CAAC;AAAA,IAC/D;AAAA,KACE,CAAC,eAAe,YAAY,WAAW,CAAC;AAAA,EAE3C,cAAc,eAAe,mBAAmB;AAAA,EAEhD,YAAU,MAAM;AAAA,IACf,WAAW,QAAQ,SAAS;AAAA,MAC3B,MAAM,SAAS,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAAA,MAClD,IAAI,QAAQ,WAAW;AAAA,QACtB,WAAW,MAAM,KAAK;AAAA,MACvB;AAAA,IACD;AAAA,KACE,CAAC,SAAS,SAAS,UAAU,CAAC;AAAA,EAEjC,MAAM,8BAA8B,cACnC,CACC,MACA,WAMI;AAAA,IACJ,IAAI,OAAO,aAAa,OAAO,YAAY,OAAO,iBAAiB;AAAA,MAClE,iBAAiB;AAAA,QAChB,WAAW,OAAO;AAAA,QAClB,UAAU,OAAO;AAAA,QACjB,iBAAiB,OAAO;AAAA,QACxB,UAAU,OAAO,YAAY;AAAA,QAC7B,YAAY;AAAA,MACb,CAAC;AAAA,MACD,QAAQ,OAAO,eAAe;AAAA,IAC/B;AAAA,KAED,CAAC,gBAAgB,CAClB;AAAA,EAEA,MAAM,aAAa,cAClB,OAAO,SAAiB;AAAA,IACvB,IAAI;AAAA,MACH,WAAW,MAAM,IAAI;AAAA,MACrB,MAAM,SAAS,MAAM,WAAW,YAAY,IAAI;AAAA,MAChD,IAAI,OAAO,aAAa,kBAAkB;AAAA,QACzC,IAAI,OAAO,eAAe;AAAA,UACzB,WAAW,MAAM,KAAK;AAAA,UACtB,YAAY,kBAAkB,EAAE,UAAU,CAAC,OAAO,SAAS,EAAE,CAAC;AAAA,UAC9D;AAAA,QACD;AAAA,QACA,4BAA4B,MAAM,MAAM;AAAA,MACzC,EAAO,SAAI,OAAO,SAAS;AAAA,QAC1B,WAAW,MAAM,OAAO,OAAO;AAAA,QAC/B,iBAAiB,IAAI;AAAA,QACrB,QAAQ,OAAO,OAAO;AAAA,MACvB,EAAO;AAAA,QACN,WAAW,MAAM,KAAK;AAAA;AAAA,MAEtB,MAAM;AAAA,MACP,WAAW,MAAM,KAAK;AAAA,MACtB,WAAW,MAAM,IAAI;AAAA;AAAA,KAGvB;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CACD;AAAA,EAEA,MAAM,cAAc,cACnB,OAAO,SAAiB;AAAA,IACvB,IAAI;AAAA,MACH,WAAW,MAAM,IAAI;AAAA,MACrB,MAAM,SAAS,MAAM,YAAY,YAAY,IAAI;AAAA,MACjD,IAAI,OAAO,aAAa,oBAAoB,CAAC,OAAO,WAAW;AAAA,QAC9D,4BAA4B,MAAM,MAAM;AAAA,MACzC,EAAO,SAAI,OAAO,gBAAgB,OAAO,SAAS;AAAA,QACjD,WAAW,MAAM,OAAO,OAAO;AAAA,QAC/B,iBAAiB,IAAI;AAAA,QACrB,QAAQ,OAAO,OAAO;AAAA,MACvB,EAAO;AAAA,QACN,WAAW,MAAM,KAAK;AAAA;AAAA,MAEtB,MAAM;AAAA,MACP,WAAW,MAAM,KAAK;AAAA,MACtB,WAAW,MAAM,IAAI;AAAA;AAAA,KAGvB,CAAC,aAAa,YAAY,YAAY,2BAA2B,CAClE;AAAA,EAEA,MAAM,gBAAgB,UAAQ,MAAM;AAAA,IACnC,OAAO,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM;AAAA,MAClC,IAAI,EAAE,aAAa,CAAC,EAAE;AAAA,QAAW,OAAO;AAAA,MACxC,IAAI,CAAC,EAAE,aAAa,EAAE;AAAA,QAAW,OAAO;AAAA,MACxC,OAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,KAClC;AAAA,KACC,CAAC,OAAO,CAAC;AAAA,EAEZ,IAAI,CAAC;AAAA,IAAY,OAAO;AAAA,EAExB,MAAM,iBAAiB,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE;AAAA,EAE1D,uBACC,OAwHE,OAxHF;AAAA,IAAK,WAAU;AAAA,IAAf,UAwHE;AAAA,sBAvHD,OA6BE,OA7BF;AAAA,QAAK,WAAU;AAAA,QAAf,UA6BE;AAAA,0BA5BD,OAQE,OARF;AAAA,YAAK,WAAU;AAAA,YAAf,UAQE;AAAA,8BAPD,MAAC,OAAD;AAAA,gBAAM,WAAU;AAAA,eAAgC;AAAA,8BAChD,MAAmD,QAAnD;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAAmD;AAAA,cAClD,iBAAiB,qBACjB,OAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UAEE;AAAA,kBADA;AAAA,kBADF;AAAA;AAAA,eAEE;AAAA;AAAA,WAEF;AAAA,0BACF,OAkBE,OAlBF;AAAA,YAAK,WAAU;AAAA,YAAf,UAkBE;AAAA,8BAjBD,MAQE,QARF;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,SAAS,MAAM,kBAAkB,IAAI;AAAA,gBACrC,OAAM;AAAA,gBACN,WAAU;AAAA,gBALX,0BAOC,MAAC,OAAD;AAAA,kBAAM,WAAU;AAAA,iBAAU;AAAA,eACzB;AAAA,8BACF,MAOE,QAPF;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,SAAS;AAAA,gBACT,OAAM;AAAA,gBAJP,0BAMC,MAAC,gBAAD;AAAA,kBAAc,WAAU;AAAA,iBAAU;AAAA,eACjC;AAAA;AAAA,WACD;AAAA;AAAA,OACD;AAAA,sBAEF,MA8CE,OA9CF;AAAA,QAAK,WAAU;AAAA,QAAf,UACE,cAAc,QAAQ,WAAW,oBACjC,OAGE,OAHF;AAAA,UAAK,WAAU;AAAA,UAAf,UAGE;AAAA,4BAFD,MAAC,WAAD;AAAA,cAAS,WAAU;AAAA,aAA4B;AAAA,YADhD;AAAA;AAAA,SAGE,IACC,QAAQ,WAAW,oBACtB,OAiBE,OAjBF;AAAA,UAAK,WAAU;AAAA,UAAf,UAiBE;AAAA,4BAhBD,MAA+B,KAA/B;AAAA;AAAA,aAA+B;AAAA,4BAC/B,OAQE,QARF;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,SAAS,MAAM,kBAAkB,IAAI;AAAA,cACrC,WAAU;AAAA,cAJX,UAQE;AAAA,gCAFD,MAAC,OAAD;AAAA,kBAAM,WAAU;AAAA,iBAAe;AAAA,gBANhC;AAAA;AAAA,aAQE;AAAA,4BACF,OAKE,KALF;AAAA,cAAG,WAAU;AAAA,cAAb,UAKE;AAAA,gBALF;AAAA,gBACmB;AAAA,gCAClB,MAEE,QAFF;AAAA,kBAAM,WAAU;AAAA,kBAAhB;AAAA,iBAEE;AAAA;AAAA,aACD;AAAA;AAAA,SACD,oBAEF,MAkBE,OAlBF;AAAA,UAAK,WAAU;AAAA,UAAf,UACE,cAAc,IAAI,CAAC,2BACnB,MAAC,eAAD;AAAA,YAEC;AAAA,YACA,WAAW,QAAQ,IAAI,OAAO,IAAI;AAAA,YAClC,SAAS,SAAS,IAAI,OAAO,IAAI;AAAA,YACjC,eACC,eAAe,eAAe,OAAO,OAClC,gBACA;AAAA,YAEJ,SAAS,MAAM,YAAY,OAAO,IAAI;AAAA,YACtC,QAAQ,MAAM,WAAW,OAAO,OAAO,IAAI;AAAA,YAC3C,UAAU,MAAM,gBAAgB,OAAO,IAAI;AAAA,YAC3C,QAAQ,MAAM,WAAW,OAAO,IAAI;AAAA,aAZ/B,OAAO,IAab,CACA;AAAA,SACA;AAAA,OAEF;AAAA,sBAEF,MAAC,mBAAD;AAAA,QACC,QAAQ;AAAA,QACR,SAAS,MAAM,kBAAkB,KAAK;AAAA,OACvC;AAAA,sBAEA,OAkCE,OAlCF;AAAA,QACC,QAAQ,CAAC,CAAC;AAAA,QACV,SAAS,MAAM,gBAAgB,IAAI;AAAA,QACnC,OAAM;AAAA,QACN,UAAS;AAAA,QACT,iBAAiB;AAAA,QALlB,UAkCE;AAAA,0BA3BD,OAIE,KAJF;AAAA,YAAG,WAAU;AAAA,YAAb,UAIE;AAAA,cAJF;AAAA,cACiC;AAAA,8BAChC,MAA8D,QAA9D;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UAA+C;AAAA,eAAe;AAAA,cAF/D;AAAA;AAAA,WAIE;AAAA,0BACF,OAqBE,OArBF;AAAA,YAAK,WAAU;AAAA,YAAf,UAqBE;AAAA,8BApBD,MAME,QANF;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,SAAS,MAAM,gBAAgB,IAAI;AAAA,gBAHpC;AAAA,eAME;AAAA,8BACF,MAYE,QAZF;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,WAAU;AAAA,gBACV,SAAS,MAAM;AAAA,kBACd,IAAI,cAAc;AAAA,oBACjB,aAAa,OAAO,YAAY;AAAA,kBACjC;AAAA,kBACA,gBAAgB,IAAI;AAAA;AAAA,gBARtB;AAAA,eAYE;AAAA;AAAA,WACD;AAAA;AAAA,OACD;AAAA;AAAA,GACD;AAAA,CAEH;;AGviBD,iBAAS;AACT,iBAAS;;AAGF,IAAM,mBAAmB,OAAK,SAAS,iBAAgB,GAAG;AAAA,EAChE,MAAM,aAAa,YAAY,CAAC,UAAU,MAAM,UAAU;AAAA,EAC1D,MAAM,gBAAgB,YAAY,CAAC,UAAU,MAAM,aAAa;AAAA,EAChE,MAAM,UAAU,YAAY,CAAC,UAAU,MAAM,OAAO;AAAA,EAEpD,MAAM,iBAAiB,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE;AAAA,EAE1D,uBACC,OAcE,UAdF;AAAA,IACC,MAAK;AAAA,IACL,SAAS;AAAA,IACT,WAAW,yGACV,aACG,4BACA;AAAA,IAEJ,OAAM;AAAA,IARP,UAcE;AAAA,sBAJD,MAAC,OAAD;AAAA,QAAM,WAAU;AAAA,OAAwC;AAAA,MACvD,iBAAiB,qBACjB,MAAC,QAAD;AAAA,QAAM,WAAU;AAAA,OAA2D;AAAA;AAAA,GAE3E;AAAA,CAEH;;AC5BD,iBAAS,mBAAM;AACf;AAAA,kBACC;AAAA,cACA;AAAA,aACA;AAAA,eACA;AAAA,YACA;AAAA,WACA;AAAA,cACA;AAAA,cACA;AAAA;;;ACTD,qBAAS;AAET,sBAAS;AAGF,SAAS,SAAS,GAAG;AAAA,EAC3B,MAAM,YAAY,eAAe,CAAC,MAAM,EAAE,SAAS;AAAA,EAEnD,MAAM,QAAQ,WAAS;AAAA,IACtB,UAAU,CAAC,QAAQ;AAAA,IACnB,SAAS,YAAY;AAAA,MACpB,OAAO,UAAU,WAAW;AAAA;AAAA,IAE7B,iBAAiB;AAAA,EAClB,CAAC;AAAA,EAED,YAAU,MAAM;AAAA,IACf,IAAI,MAAM,MAAM,QAAQ;AAAA,MACvB,UAAU,MAAM,KAAK,MAAM;AAAA,IAC5B;AAAA,KACE,CAAC,MAAM,MAAM,SAAS,CAAC;AAAA,EAE1B,OAAO;AAAA;AAGD,SAAS,cAAc,CAAC,MAAqB;AAAA,EACnD,OAAO,WAAS;AAAA,IACf,UAAU,CAAC,UAAU,IAAI;AAAA,IACzB,SAAS,YAAY;AAAA,MACpB,IAAI,CAAC;AAAA,QAAM,OAAO;AAAA,MAClB,OAAO,UAAU,SAAS,IAAI;AAAA;AAAA,IAE/B,SAAS,CAAC,CAAC;AAAA,EACZ,CAAC;AAAA;AAGK,SAAS,aAAa,CAAC,MAAqB;AAAA,EAClD,OAAO,WAAS;AAAA,IACf,UAAU,CAAC,UAAU,MAAM,OAAO;AAAA,IAClC,SAAS,YAAY;AAAA,MACpB,IAAI,CAAC;AAAA,QAAM,OAAO;AAAA,MAClB,OAAO,UAAU,cAAc,IAAI;AAAA;AAAA,IAEpC,SAAS,CAAC,CAAC;AAAA,EACZ,CAAC;AAAA;AAGK,SAAS,mBAAmB,CAClC,MACA,UACC;AAAA,EACD,OAAO,WAAS;AAAA,IACf,UAAU,CAAC,UAAU,MAAM,SAAS,QAAQ;AAAA,IAC5C,SAAS,YAAY;AAAA,MACpB,IAAI,CAAC,QAAQ,CAAC;AAAA,QAAU,OAAO;AAAA,MAC/B,OAAO,UAAU,oBAAoB,MAAM,QAAQ;AAAA;AAAA,IAEpD,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC;AAAA,EACtB,CAAC;AAAA;;;;ADvCF,IAAM,cAAgD;AAAA,EACrD,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AACT;AAEA,IAAM,eAAuC;AAAA,EAC5C,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AACT;AAEA,SAAS,UAAU,CAAC,OAAuB;AAAA,EAC1C,IAAI,QAAQ;AAAA,IAAM,OAAO,GAAG;AAAA,EAC5B,IAAI,QAAQ,OAAO;AAAA,IAAM,OAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC;AAAA,EAC3D,OAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,CAAC;AAAA;AAGrC,IAAM,gBAAgB,OAAK,SAAS,cAAa,GAAG;AAAA,EAC1D,MAAM,aAAa,eAAe,CAAC,MAAM,EAAE,UAAU;AAAA,EACrD,MAAM,kBAAkB,eAAe,CAAC,MAAM,EAAE,eAAe;AAAA,EAC/D,MAAM,SAAS,eAAe,CAAC,MAAM,EAAE,MAAM;AAAA,EAC7C,MAAM,gBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa;AAAA,EAC3D,MAAM,cAAc,eAAe,CAAC,MAAM,EAAE,WAAW;AAAA,EACvD,MAAM,aAAa,eAAe,CAAC,MAAM,EAAE,UAAU;AAAA,EACrD,MAAM,cAAc,eAAe,CAAC,MAAM,EAAE,WAAW;AAAA,EAEvD,QAAQ,cAAc,UAAU;AAAA,EAChC,QAAQ,MAAM,gBAAgB,eAAe,aAAa;AAAA,EAC1D,QAAQ,MAAM,mBAAmB,cAAc,aAAa;AAAA,EAC5D,MAAM,aAAa,gBAAgB,SAAS,CAAC;AAAA,EAE7C,MAAM,gBAAgB,UAAQ,MAAM;AAAA,IACnC,MAAM,SAAS,IAAI;AAAA,IACnB,WAAW,SAAS,QAAQ;AAAA,MAC3B,MAAM,OAAO,OAAO,IAAI,MAAM,KAAK,KAAK,CAAC;AAAA,MACzC,KAAK,KAAK,KAAK;AAAA,MACf,OAAO,IAAI,MAAM,OAAO,IAAI;AAAA,IAC7B;AAAA,IACA,OAAO;AAAA,KACL,CAAC,MAAM,CAAC;AAAA,EAEX,IAAI,CAAC;AAAA,IAAY,OAAO;AAAA,EAExB,uBACC,OAkJE,OAlJF;AAAA,IAAK,WAAU;AAAA,IAAf,UAkJE;AAAA,sBAjJD,OAaE,OAbF;AAAA,QAAK,WAAU;AAAA,QAAf,UAaE;AAAA,0BAZD,OAGE,OAHF;AAAA,YAAK,WAAU;AAAA,YAAf,UAGE;AAAA,8BAFD,MAAC,WAAD;AAAA,gBAAU,WAAU;AAAA,eAAgC;AAAA,8BACpD,MAA8C,QAA9C;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAA8C;AAAA;AAAA,WAC7C;AAAA,0BACF,MAOE,QAPF;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS;AAAA,YACT,OAAM;AAAA,YAJP,0BAMC,MAAC,gBAAD;AAAA,cAAc,WAAU;AAAA,aAAU;AAAA,WACjC;AAAA;AAAA,OACD;AAAA,MAED,iBAAiB,8BACjB,OAkEE,OAlEF;AAAA,QAAK,WAAU;AAAA,QAAf,UAkEE;AAAA,0BAjED,MAQE,OARF;AAAA,YAAK,WAAU;AAAA,YAAf,0BACC,MAME,UANF;AAAA,cACC,MAAK;AAAA,cACL,SAAS,MAAM,YAAY,IAAI;AAAA,cAC/B,WAAU;AAAA,cAHX;AAAA,aAME;AAAA,WACD;AAAA,0BACF,OAeE,OAfF;AAAA,YAAK,WAAU;AAAA,YAAf,UAeE;AAAA,8BAdD,MAA6D,MAA7D;AAAA,gBAAI,WAAU;AAAA,gBAAd,UAA0C,YAAY;AAAA,eAAO;AAAA,8BAC7D,MAEE,KAFF;AAAA,gBAAG,WAAU;AAAA,gBAAb,UACE,YAAY;AAAA,eACZ;AAAA,8BACF,OASE,OATF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UASE;AAAA,kCARD,MAEE,QAFF;AAAA,oBAAM,WAAU;AAAA,oBAAhB,UACE,aAAa,YAAY,UAAU,YAAY;AAAA,mBAC/C;AAAA,kBACD,YAAY,2BACZ,MAEE,QAFF;AAAA,oBAAM,WAAU;AAAA,oBAAhB,UACE,YAAY;AAAA,mBACZ;AAAA;AAAA,eAEF;AAAA;AAAA,WACD;AAAA,0BAEF,OAsCE,OAtCF;AAAA,YAAK,WAAU;AAAA,YAAf,UAsCE;AAAA,8BArCD,MAEE,OAFF;AAAA,gBAAK,WAAU;AAAA,gBAAf;AAAA,eAEE;AAAA,8BACF,MAaE,UAbF;AAAA,gBACC,MAAK;AAAA,gBACL,SAAS,MAAM,WAAW,IAAI;AAAA,gBAC9B,WAAW,gEACV,gBAAgB,OAAO,cAAc;AAAA,gBAJvC,0BAOC,OAKE,OALF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAKE;AAAA,oCAJD,MAAC,WAAD;AAAA,sBAAU,WAAU;AAAA,qBAAkD;AAAA,oCACtE,MAEE,QAFF;AAAA,sBAAM,WAAU;AAAA,sBAAhB;AAAA,qBAEE;AAAA;AAAA,iBACD;AAAA,eACD;AAAA,cACD,WAAW,IAAI,CAAC,yBAChB,MAiBE,UAjBF;AAAA,gBACC,MAAK;AAAA,gBAEL,SAAS,MAAM,WAAW,KAAK,YAAY;AAAA,gBAC3C,WAAW,gEACV,gBAAgB,KAAK,eAAe,cAAc;AAAA,gBALpD,0BAQC,OAQE,OARF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAQE;AAAA,oCAPD,MAAC,WAAD;AAAA,sBAAU,WAAU;AAAA,qBAAkD;AAAA,oCACtE,MAEE,QAFF;AAAA,sBAAM,WAAU;AAAA,sBAAhB,UACE,KAAK;AAAA,qBACL;AAAA,oCACF,MAEE,QAFF;AAAA,sBAAM,WAAU;AAAA,sBAAhB,UACE,WAAW,KAAK,IAAI;AAAA,qBACpB;AAAA;AAAA,iBACD;AAAA,iBAdG,KAAK,YAeT,CACF;AAAA;AAAA,WACA;AAAA;AAAA,OACD,oBAEF,MA2DE,OA3DF;AAAA,QAAK,WAAU;AAAA,QAAf,UACE,4BACA,MAEE,OAFF;AAAA,UAAK,WAAU;AAAA,UAAf,0BACC,MAAC,WAAD;AAAA,YAAS,WAAU;AAAA,WAA6C;AAAA,SAC/D,IACC,OAAO,WAAW,oBACrB,OAaE,OAbF;AAAA,UAAK,WAAU;AAAA,UAAf,UAaE;AAAA,4BAZD,MAAC,WAAD;AAAA,cAAU,WAAU;AAAA,aAA0C;AAAA,4BAC9D,MAA0D,MAA1D;AAAA,cAAI,WAAU;AAAA,cAAd;AAAA,aAA0D;AAAA,4BAC1D,OASE,KATF;AAAA,cAAG,WAAU;AAAA,cAAb,UASE;AAAA,gBATF;AAAA,gBACkB;AAAA,gCACjB,MAEE,QAFF;AAAA,kBAAM,WAAU;AAAA,kBAAhB;AAAA,iBAEE;AAAA,gBAAM;AAAA,gBAJT;AAAA,gBAKI;AAAA,gCACH,MAEE,QAFF;AAAA,kBAAM,WAAU;AAAA,kBAAhB;AAAA,iBAEE;AAAA;AAAA,aACD;AAAA;AAAA,SACD,oBAEF,MAoCE,OApCF;AAAA,UAAK,WAAU;AAAA,UAAf,UACE,CAAC,OAAO,UAAU,QAAQ,QAAQ,QAAQ,EAAE,IAAI,CAAC,UAAU;AAAA,YAC3D,MAAM,cAAc,cAAc,IAAI,KAAK;AAAA,YAC3C,IAAI,CAAC,aAAa;AAAA,cAAQ,OAAO;AAAA,YACjC,MAAM,YAAY,YAAY,UAAU;AAAA,YACxC,uBACC,OA2BE,OA3BF;AAAA,wBA2BE;AAAA,gCA1BD,OAGE,OAHF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAGE;AAAA,oCAFD,MAAC,WAAD;AAAA,sBAAW,WAAU;AAAA,qBAAU;AAAA,oBAC9B,aAAa,UAAU;AAAA;AAAA,iBACvB;AAAA,gBACD,YAAY,IAAI,CAAC,0BACjB,MAmBE,UAnBF;AAAA,kBACC,MAAK;AAAA,kBAEL,SAAS,MAAM,YAAY,MAAM,IAAI;AAAA,kBACrC,WAAW,gEACV,kBAAkB,MAAM,OAAO,cAAc;AAAA,kBAL/C,0BAQC,OAUE,OAVF;AAAA,oBAAK,WAAU;AAAA,oBAAf,UAUE;AAAA,sCATD,MAAC,WAAD;AAAA,wBAAU,WAAU;AAAA,uBAAkD;AAAA,sCACtE,OAOE,OAPF;AAAA,wBAAK,WAAU;AAAA,wBAAf,UAOE;AAAA,0CAND,MAEE,OAFF;AAAA,4BAAK,WAAU;AAAA,4BAAf,UACE,MAAM;AAAA,2BACN;AAAA,0CACF,MAEE,OAFF;AAAA,4BAAK,WAAU;AAAA,4BAAf,UACE,MAAM;AAAA,2BACN;AAAA;AAAA,uBACD;AAAA;AAAA,mBACD;AAAA,mBAhBG,GAAG,MAAM,SAAS,MAAM,MAiB5B,CACF;AAAA;AAAA,eA1BQ,KA2BR;AAAA,WAEH;AAAA,SACA;AAAA,OAEF;AAAA;AAAA,GAEF;AAAA,CAEH;;AExND,iBAAS;AACT,qBAAS;;AAGF,IAAM,sBAAsB,OAAK,SAAS,oBAAmB,GAAG;AAAA,EACtE,MAAM,aAAa,eAAe,CAAC,UAAU,MAAM,UAAU;AAAA,EAC7D,MAAM,gBAAgB,eAAe,CAAC,UAAU,MAAM,aAAa;AAAA,EAEnE,uBACC,MAWE,UAXF;AAAA,IACC,MAAK;AAAA,IACL,SAAS;AAAA,IACT,WAAW,yGACV,aACG,4BACA;AAAA,IAEJ,OAAM;AAAA,IARP,0BAUC,MAAC,WAAD;AAAA,MAAU,WAAU;AAAA,KAAwC;AAAA,GAC3D;AAAA,CAEH;;ACtBD,iBAAS,qBAAM;AACf,cAAS;AACT,kBAAS;AACT;AAAA,WACC;AAAA,iBACA;AAAA;;AAMD,IAAM,gBAAuC;AAAA,EAC5C,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,GAAG;AAAA,EACH,KAAK;AAAA,EACL,GAAG;AAAA,EACH,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,MAAM;AACP;AAEA,SAAS,aAAa,CAAC,MAAsB;AAAA,EAC5C,MAAM,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY,KAAK;AAAA,EACpD,OAAO,cAAa,QAAQ;AAAA;AAGtB,IAAM,mBAAmB,OAAK,SAAS,iBAAgB,GAAG;AAAA,EAChE,MAAM,eAAe,eAAe,CAAC,MAAM,EAAE,YAAY;AAAA,EACzD,MAAM,cAAc,eAAe,CAAC,MAAM,EAAE,WAAW;AAAA,EACvD,MAAM,gBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa;AAAA,EAC3D,MAAM,cAAc,eAAe,CAAC,MAAM,EAAE,WAAW;AAAA,EAEvD,QAAQ,MAAM,gBAAgB,eAAe,aAAa;AAAA,EAC1D,QAAQ,MAAM,UAAU,WAAW,gBAAgB,oBAClD,eACA,WACD;AAAA,EAEA,MAAM,aAAa,gBAAgB;AAAA,EACnC,MAAM,UAAU,aAAa,aAAa,UAAU,UAAU;AAAA,EAC9D,MAAM,YAAY,aAAa,CAAC,cAAc;AAAA,EAC9C,MAAM,cAAc,aAAa,aAAc,eAAe;AAAA,EAC9D,MAAM,WAAW,cAAc,WAAW;AAAA,EAE1C,YAAU,MAAM;AAAA,IACf,MAAM,eAAe,CAAC,MAAqB;AAAA,MAC1C,MAAM,SAAS,EAAE;AAAA,MACjB,MAAM,YACL,OAAO,YAAY,WACnB,OAAO,YAAY,cACnB,OAAO;AAAA,MACR,KACE,EAAE,QAAQ,YAAa,EAAE,QAAQ,OAAO,CAAC,cAC1C,cACC;AAAA,QACD,YAAY;AAAA,MACb;AAAA;AAAA,IAGD,SAAS,iBAAiB,WAAW,YAAY;AAAA,IACjD,OAAO,MAAM,SAAS,oBAAoB,WAAW,YAAY;AAAA,KAC/D,CAAC,cAAc,WAAW,CAAC;AAAA,EAE9B,IAAI,CAAC,gBAAgB,CAAC;AAAA,IAAe,OAAO;AAAA,EAE5C,MAAM,cAAc,UAAU,gBAAgB,UAAU,SAAS,MAAM,IACpE,gBACA;AAAA,EAEH,uBACC,OA8DE,OA9DF;AAAA,IAAK,WAAU;AAAA,IAAf,UA8DE;AAAA,sBA7DD,OAsBE,OAtBF;AAAA,QAAK,WAAU;AAAA,QAAf,UAsBE;AAAA,0BArBD,MAOE,QAPF;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS;AAAA,YACT,OAAM;AAAA,YAJP,0BAMC,MAAC,KAAD;AAAA,cAAG,WAAU;AAAA,aAAU;AAAA,WACtB;AAAA,0BACF,OAWE,OAXF;AAAA,YAAK,WAAU;AAAA,YAAf,UAWE;AAAA,8BAVD,MAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UACE;AAAA,eACA;AAAA,8BACF,MAAmD,QAAnD;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAAmD;AAAA,8BACnD,MAKE,QALF;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO;AAAA,gBAFR,UAIE;AAAA,eACA;AAAA;AAAA,WACD;AAAA,0BACF,MAA4D,QAA5D;AAAA,YAAM,WAAU;AAAA,YAAhB,UAAiD;AAAA,WAAW;AAAA;AAAA,OAC3D;AAAA,sBAEF,MAoCE,OApCF;AAAA,QAAK,WAAU;AAAA,QAAf,UACE,4BACA,MAEE,OAFF;AAAA,UAAK,WAAU;AAAA,UAAf;AAAA,SAEE,IACC,0BACH,MAwBE,OAxBF;AAAA,UAAK,WAAU;AAAA,UAAf,0BACC,MAsBE,qBAtBF;AAAA,YACC;AAAA,YACA,OAAO;AAAA,YACP,WAAS;AAAA,YACT,eAAa;AAAA,YACb,WAAW,OAAO;AAAA,cACjB,WAAW;AAAA,YACZ;AAAA,YACA,aAAa;AAAA,cACZ,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,YAAY;AAAA,YACb;AAAA,YACA,cAAc;AAAA,cACb,OAAO;AAAA,gBACN,MAAM;AAAA,cACP;AAAA,YACD;AAAA,YAnBD,UAqBE;AAAA,WACA;AAAA,SACD,oBAEF,MAEE,OAFF;AAAA,UAAK,WAAU;AAAA,UAAf;AAAA,SAEE;AAAA,OAEF;AAAA;AAAA,GACD;AAAA,CAEH;;AC5JD,iBAAS,uBAAM;AACf;AAAA,kBACC;AAAA,iBACA;AAAA,gBACA;AAAA,YACA;AAAA,cACA;AAAA,gBACA;AAAA,eACA;AAAA;;AAQD,IAAM,aAAY;AAClB,IAAM,iBAAgB;AACtB,IAAM,aAAY;AAClB,IAAM,aAAY;AAElB,SAAS,aAAa,GAAG,WAAgC;AAAA,EACxD,MAAM,eAAe,oBAAoB,CAAC,MAAM,EAAE,YAAY;AAAA,EAC9D,MAAM,aAAa,aAAa,IAAI,OAAO;AAAA,EAE3C,QAAQ,MAAM,cAAc,YAAY,SAAS,UAAU;AAAA,EAE3D,IAAI,CAAC;AAAA,IAAY,OAAO;AAAA,EACxB,IAAI,WAAW;AAAA,IACd,uBACC,MAAqE,OAArE;AAAA,MAAK,WAAU;AAAA,MAAf;AAAA,KAAqE;AAAA,EAEvE;AAAA,EAEA,uBACC,MAUE,OAVF;AAAA,IAAK,WAAU;AAAA,IAAf,UACE,MAAM,MAAM,IAAI,CAAC,yBACjB,MAAC,UAAD;AAAA,MAEC,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,YAAY,KAAK;AAAA,OAJZ,KAAK,IAKX,CACA;AAAA,GACA;AAAA;AAIJ,SAAS,QAAQ;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GAME;AAAA,EACF,MAAM,eAAe,oBAAoB,CAAC,MAAM,EAAE,YAAY;AAAA,EAC9D,MAAM,YAAY,oBAAoB,CAAC,MAAM,EAAE,SAAS;AAAA,EACxD,MAAM,WAAW,oBAAoB,CAAC,MAAM,EAAE,QAAQ;AAAA,EACtD,MAAM,eAAe,oBAAoB,CAAC,MAAM,EAAE,YAAY;AAAA,EAC9D,MAAM,aAAa,aAAa,IAAI,IAAI;AAAA,EACxC,MAAM,aAAa,iBAAiB;AAAA,EAEpC,MAAM,cAAc,cAAY,MAAM;AAAA,IACrC,IAAI,SAAS,aAAa;AAAA,MACzB,UAAU,IAAI;AAAA,IACf,EAAO;AAAA,MACN,SAAS,IAAI;AAAA;AAAA,KAEZ,CAAC,MAAM,MAAM,WAAW,QAAQ,CAAC;AAAA,EAEpC,uBACC,OA8BE,OA9BF;AAAA,cA8BE;AAAA,sBA7BD,OA2BE,UA3BF;AAAA,QACC,MAAK;AAAA,QACL,SAAS;AAAA,QACT,WAAW,4GACV,aAAa,6BAA6B,wBACvC,aAAa,eAAe;AAAA,QALjC,UA2BE;AAAA,UApBA,SAAS,8BACT;AAAA,sBAWE;AAAA,cAVA,6BACA,MAAC,eAAD;AAAA,gBAAa,WAAU;AAAA,eAA8C,oBAErE,MAAC,gBAAD;AAAA,gBAAc,WAAU;AAAA,eAA8C;AAAA,cAEtE,6BACA,MAAC,aAAD;AAAA,gBAAY,WAAU;AAAA,eAA0C,oBAEhE,MAAC,SAAD;AAAA,gBAAQ,WAAU;AAAA,eAA0C;AAAA;AAAA,WAE5D,oBAEF;AAAA,sBAGE;AAAA,8BAFD,MAAC,QAAD;AAAA,gBAAM,WAAU;AAAA,eAAoB;AAAA,8BACpC,MAAC,WAAD;AAAA,gBAAU,WAAU;AAAA,eAAkD;AAAA;AAAA,WACrE;AAAA,0BAEH,MAAmC,QAAnC;AAAA,YAAM,WAAU;AAAA,YAAhB,UAA4B;AAAA,WAAO;AAAA;AAAA,OAClC;AAAA,MACD,SAAS,+BAAe,MAAC,eAAD;AAAA,QAAe,SAAS;AAAA,OAAM;AAAA;AAAA,GACtD;AAAA;AAIG,IAAM,qBAAqB,OAAK,SAAS,mBAAkB,GAAG;AAAA,EACpE,MAAM,aAAa,oBAAoB,CAAC,MAAM,EAAE,UAAU;AAAA,EAC1D,MAAM,kBAAkB,oBAAoB,CAAC,MAAM,EAAE,eAAe;AAAA,EACpE,MAAM,aAAa,mBAClB,CAAC,MAAM,EAAE,OAAO,eAAc,cAC/B;AAAA,EAEA,QAAQ,MAAM,UAAU,WAAW,YAAY,YAAY,GAAG;AAAA,EAE9D,IAAI,CAAC;AAAA,IAAY,OAAO;AAAA,EAExB,uBACC,OA+DE,OA/DF;AAAA,IACC,WAAU;AAAA,IACV,OAAO,EAAE,OAAO,WAAW;AAAA,IAF5B,UA+DE;AAAA,sBA3DD,MAAC,cAAD;AAAA,QACC,UAAU;AAAA,QACV,MAAK;AAAA,QACL,UAAU;AAAA,QACV,UAAU;AAAA,QACV,cAAc;AAAA,OACf;AAAA,sBACA,OAmDE,OAnDF;AAAA,QAAK,WAAU;AAAA,QAAf,UAmDE;AAAA,0BAlDD,OAQE,OARF;AAAA,YAAK,WAAU;AAAA,YAAf,UAQE;AAAA,8BAPD,OAGE,OAHF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UAGE;AAAA,kCAFD,MAAC,aAAD;AAAA,oBAAY,WAAU;AAAA,mBAAgC;AAAA,kCACtD,MAAqC,QAArC;AAAA,oBAAM,WAAU;AAAA,oBAAhB;AAAA,mBAAqC;AAAA;AAAA,eACpC;AAAA,8BACF,MAEE,QAFF;AAAA,gBAAQ,SAAQ;AAAA,gBAAQ,MAAK;AAAA,gBAAO,SAAS;AAAA,gBAA7C,0BACC,MAAC,gBAAD;AAAA,kBAAc,WAAU;AAAA,iBAAU;AAAA,eACjC;AAAA;AAAA,WACD;AAAA,0BAEF,MAoBE,OApBF;AAAA,YAAK,WAAU;AAAA,YAAf,UACE,4BACA,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAEE,IACC,CAAC,YAAY,SAAS,MAAM,WAAW,oBAC1C,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAEE,IAEF,SAAS,MAAM,IAAI,CAAC,yBACnB,MAAC,UAAD;AAAA,cAEC,MAAM,KAAK;AAAA,cACX,MAAM,KAAK;AAAA,cACX,MAAM,KAAK;AAAA,cACX,YAAY,KAAK;AAAA,eAJZ,KAAK,IAKX,CACA;AAAA,WAED;AAAA,0BAEF,OAiBE,OAjBF;AAAA,YAAK,WAAU;AAAA,YAAf,UAiBE;AAAA,8BAhBD,OAGE,OAHF;AAAA,gBAAK,WAAU;AAAA,gBAAf,UAGE;AAAA,kCAFD,MAAC,aAAD;AAAA,oBAAY,WAAU;AAAA,mBAAwB;AAAA,kCAC9C,MAA0C,QAA1C;AAAA,oBAAM,WAAU;AAAA,oBAAhB;AAAA,mBAA0C;AAAA;AAAA,eACzC;AAAA,8BACF,MAWE,QAXF;AAAA,gBACC,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,SAAS,MAAM,QAAQ;AAAA,gBACvB,OAAM;AAAA,gBACN,WAAU;AAAA,gBACV,UAAU;AAAA,gBANX,0BAQC,MAAC,aAAD;AAAA,kBACC,WAAW,WAAW,YAAY,iBAAiB;AAAA,iBACpD;AAAA,eACC;AAAA;AAAA,WACD;AAAA;AAAA,OACD;AAAA;AAAA,GACD;AAAA,CAEH;;AC3LD,iBAAS;AACT,uBAAS;;AAGF,IAAM,2BAA2B,OACvC,SAAS,yBAAwB,GAAG;AAAA,EACnC,MAAM,aAAa,oBAAoB,CAAC,MAAM,EAAE,UAAU;AAAA,EAC1D,MAAM,gBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa;AAAA,EAEhE,uBACC,MAWE,UAXF;AAAA,IACC,MAAK;AAAA,IACL,SAAS;AAAA,IACT,WAAW,yGACV,aACG,4BACA;AAAA,IAEJ,OAAM;AAAA,IARP,0BAUC,MAAC,aAAD;AAAA,MAAY,WAAU;AAAA,KAAwC;AAAA,GAC7D;AAAA,CAGL;;ACxBA,iBAAS,qBAAM;AACf,cAAS;AACT,kBAAS;AACT;AAAA,WACC;AAAA,iBACA;AAAA;;AAMD,IAAM,gBAAuC;AAAA,EAC5C,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,GAAG;AAAA,EACH,KAAK;AAAA,EACL,GAAG;AAAA,EACH,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AACP;AAEA,SAAS,cAAa,CAAC,MAAsB;AAAA,EAC5C,MAAM,MAAM,KAAK,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY,KAAK;AAAA,EACpD,OAAO,cAAa,QAAQ;AAAA;AAGtB,IAAM,kBAAkB,OAAK,SAAS,gBAAe,GAAG;AAAA,EAC9D,MAAM,eAAe,oBAAoB,CAAC,MAAM,EAAE,YAAY;AAAA,EAC9D,MAAM,eAAe,oBAAoB,CAAC,MAAM,EAAE,YAAY;AAAA,EAC9D,MAAM,cAAc,oBAAoB,CAAC,MAAM,EAAE,WAAW;AAAA,EAE5D,QAAQ,MAAM,cAAc,eAAe,YAAY;AAAA,EAEvD,YAAU,MAAM;AAAA,IACf,MAAM,eAAe,CAAC,MAAqB;AAAA,MAC1C,MAAM,SAAS,EAAE;AAAA,MACjB,MAAM,YACL,OAAO,YAAY,WACnB,OAAO,YAAY,cACnB,OAAO;AAAA,MACR,KACE,EAAE,QAAQ,YAAa,EAAE,QAAQ,OAAO,CAAC,cAC1C,cACC;AAAA,QACD,YAAY;AAAA,MACb;AAAA;AAAA,IAGD,SAAS,iBAAiB,WAAW,YAAY;AAAA,IACjD,OAAO,MAAM,SAAS,oBAAoB,WAAW,YAAY;AAAA,KAC/D,CAAC,cAAc,WAAW,CAAC;AAAA,EAE9B,IAAI,CAAC,gBAAgB,CAAC;AAAA,IAAc,OAAO;AAAA,EAE3C,MAAM,cAAc,UAAU,gBAAgB,UAAU,SAAS,MAAM,IACpE,gBACA;AAAA,EACH,MAAM,WAAW,eAAc,YAAY;AAAA,EAE3C,uBACC,OA+DE,OA/DF;AAAA,IAAK,WAAU;AAAA,IAAf,UA+DE;AAAA,sBA9DD,OAuBE,OAvBF;AAAA,QAAK,WAAU;AAAA,QAAf,UAuBE;AAAA,0BAtBD,MAOE,QAPF;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS;AAAA,YACT,OAAM;AAAA,YAJP,0BAMC,MAAC,KAAD;AAAA,cAAG,WAAU;AAAA,aAAU;AAAA,WACtB;AAAA,0BACF,OAYE,OAZF;AAAA,YAAK,WAAU;AAAA,YAAf,UAYE;AAAA,8BAXD,MAKE,QALF;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO;AAAA,gBAFR,UAIE;AAAA,eACA;AAAA,cACD,wBACA,OAEE,QAFF;AAAA,gBAAM,WAAU;AAAA,gBAAhB,UAEE;AAAA,kBADA,KAAK;AAAA,kBADP;AAAA;AAAA,eAEE;AAAA;AAAA,WAEF;AAAA,0BACF,MAA4D,QAA5D;AAAA,YAAM,WAAU;AAAA,YAAhB,UAAiD;AAAA,WAAW;AAAA;AAAA,OAC3D;AAAA,sBAEF,MAoCE,OApCF;AAAA,QAAK,WAAU;AAAA,QAAf,UACE,4BACA,MAEE,OAFF;AAAA,UAAK,WAAU;AAAA,UAAf;AAAA,SAEE,IACC,uBACH,MAwBE,OAxBF;AAAA,UAAK,WAAU;AAAA,UAAf,0BACC,MAsBE,qBAtBF;AAAA,YACC;AAAA,YACA,OAAO;AAAA,YACP,WAAS;AAAA,YACT,eAAa;AAAA,YACb,WAAW,OAAO;AAAA,cACjB,WAAW;AAAA,YACZ;AAAA,YACA,aAAa;AAAA,cACZ,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,YAAY;AAAA,YACb;AAAA,YACA,cAAc;AAAA,cACb,OAAO;AAAA,gBACN,MAAM;AAAA,cACP;AAAA,YACD;AAAA,YAnBD,UAqBE,KAAK;AAAA,WACL;AAAA,SACD,oBAEF,MAEE,OAFF;AAAA,UAAK,WAAU;AAAA,UAAf;AAAA,SAEE;AAAA,OAEF;AAAA;AAAA,GACD;AAAA,CAEH;;ACrJD,iBAAS,oBAAM,yBAAU,uBAAW,yBAAQ,0BAAa;AACzD,qBAAS,qBAAU;;;ACDnB,mBAAS;AASF,IAAM,qBAAqB,SAAwB,CAAC,SAAS;AAAA,EACnE,QAAQ;AAAA,EACR,MAAM,MAAM,IAAI,EAAE,QAAQ,KAAK,CAAC;AAAA,EAChC,OAAO,MAAM,IAAI,EAAE,QAAQ,MAAM,CAAC;AAAA,EAClC,QAAQ,MAAM,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,OAAO,EAAE;AACzD,EAAE;;;;ADRF,SAAS,UAAU,CAClB,OACA,QACoC;AAAA,EACpC,MAAM,IAAI,MAAM,YAAY;AAAA,EAC5B,MAAM,IAAI,OAAO,YAAY;AAAA,EAE7B,IAAI,EAAE,WAAW;AAAA,IAAG,OAAO,EAAE,OAAO,MAAM,OAAO,EAAE;AAAA,EACnD,IAAI,EAAE,SAAS,CAAC;AAAA,IAAG,OAAO,EAAE,OAAO,MAAM,OAAO,MAAM,EAAE,QAAQ,CAAC,EAAE;AAAA,EAEnE,IAAI,KAAK;AAAA,EACT,IAAI,QAAQ;AAAA,EACZ,IAAI,eAAe;AAAA,EAEnB,SAAS,KAAK,EAAG,KAAK,EAAE,UAAU,KAAK,EAAE,QAAQ,MAAM;AAAA,IACtD,IAAI,EAAE,QAAQ,EAAE,KAAK;AAAA,MACpB,SAAS;AAAA,MACT,IAAI,iBAAiB,KAAK;AAAA,QAAG,SAAS;AAAA,MACtC,IAAI,OAAO,KAAK,EAAE,KAAK,OAAO,OAAO,EAAE,KAAK,OAAO;AAAA,QAAK,SAAS;AAAA,MACjE,eAAe;AAAA,MACf;AAAA,IACD;AAAA,EACD;AAAA,EAEA,OAAO,EAAE,OAAO,OAAO,EAAE,QAAQ,MAAM;AAAA;AAGjC,IAAM,kBAAkB,OAAK,SAAS,gBAAe,GAAG;AAAA,EAC9D,MAAM,SAAS,mBAAmB,CAAC,MAAM,EAAE,MAAM;AAAA,EACjD,MAAM,QAAQ,mBAAmB,CAAC,MAAM,EAAE,KAAK;AAAA,EAC/C,MAAM,WAAW,oBAAoB,CAAC,MAAM,EAAE,QAAQ;AAAA,EACtD,MAAM,gBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa;AAAA,EAEhE,OAAO,OAAO,YAAY,WAAS,EAAE;AAAA,EACrC,OAAO,eAAe,oBAAoB,WAAS,CAAC;AAAA,EACpD,MAAM,WAAW,SAAyB,IAAI;AAAA,EAC9C,MAAM,UAAU,SAAuB,IAAI;AAAA,EAE3C,QAAQ,MAAM,cAAc,SAAS;AAAA,EAErC,MAAM,aAAa,UAClB,MAAM,IAAI,IAAI,WAAW,gBAAgB,CAAC,CAAC,GAC3C,CAAC,WAAW,YAAY,CACzB;AAAA,EAEA,MAAM,WAAW,UAAQ,MAAM;AAAA,IAC9B,IAAI,CAAC,WAAW;AAAA,MAAO,OAAO,CAAC;AAAA,IAC/B,IAAI,CAAC;AAAA,MAAO,OAAO,UAAU,MAAM,MAAM,GAAG,EAAE;AAAA,IAE9C,MAAM,UAAU,UAAU,MACxB,IAAI,CAAC,UAAU,EAAE,SAAS,WAAW,OAAO,IAAI,EAAE,EAAE,EACpD,OAAO,CAAC,MAAM,EAAE,KAAK,EACrB,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,MAAM,GAAG,EAAE;AAAA,IAEb,OAAO,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,KAC9B,CAAC,WAAW,OAAO,KAAK,CAAC;AAAA,EAE5B,YAAU,MAAM;AAAA,IACf,IAAI,QAAQ;AAAA,MACX,SAAS,EAAE;AAAA,MACX,iBAAiB,CAAC;AAAA,MAClB,WAAW,MAAM,SAAS,SAAS,MAAM,GAAG,CAAC;AAAA,IAC9C;AAAA,KACE,CAAC,MAAM,CAAC;AAAA,EAEX,YAAU,MAAM;AAAA,IACf,MAAM,OAAO,QAAQ,SAAS,SAAS;AAAA,IAGvC,MAAM,eAAe,EAAE,OAAO,UAAU,CAAC;AAAA,KACvC,CAAC,aAAa,CAAC;AAAA,EAElB,MAAM,eAAe,cACpB,CAAC,SAAiB;AAAA,IACjB,cAAc;AAAA,IACd,SAAS,IAAI;AAAA,IACb,MAAM;AAAA,KAEP,CAAC,eAAe,UAAU,KAAK,CAChC;AAAA,EAEA,MAAM,gBAAgB,cACrB,CAAC,MAA2B;AAAA,IAC3B,IAAI,EAAE,QAAQ,eAAgB,EAAE,WAAW,EAAE,QAAQ,KAAM;AAAA,MAC1D,EAAE,eAAe;AAAA,MACjB,iBAAiB,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,SAAS,SAAS,CAAC,CAAC;AAAA,IAC7D,EAAO,SAAI,EAAE,QAAQ,aAAc,EAAE,WAAW,EAAE,QAAQ,KAAM;AAAA,MAC/D,EAAE,eAAe;AAAA,MACjB,iBAAiB,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,IAC3C,EAAO,SAAI,EAAE,QAAQ,WAAW,SAAS,gBAAgB;AAAA,MACxD,EAAE,eAAe;AAAA,MACjB,aAAa,SAAS,cAAc;AAAA,IACrC,EAAO,SAAI,EAAE,QAAQ,UAAU;AAAA,MAC9B,EAAE,eAAe;AAAA,MACjB,MAAM;AAAA,IACP;AAAA,KAED,CAAC,UAAU,eAAe,cAAc,KAAK,CAC9C;AAAA,EAEA,MAAM,sBAAsB,cAC3B,CAAC,MAAwB;AAAA,IACxB,IAAI,EAAE,WAAW,EAAE;AAAA,MAAe,MAAM;AAAA,KAEzC,CAAC,KAAK,CACP;AAAA,EAEA,IAAI,CAAC;AAAA,IAAQ,OAAO;AAAA,EAEpB,uBACC,MA+EE,OA/EF;AAAA,IACC,MAAK;AAAA,IACL,cAAW;AAAA,IACX,WAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW,CAAC,MAAM;AAAA,MACjB,IAAI,EAAE,QAAQ;AAAA,QAAU,MAAM;AAAA;AAAA,IANhC,0BASC,OAqEE,OArEF;AAAA,MAAK,WAAU;AAAA,MAAf,UAqEE;AAAA,wBApED,OAiBE,OAjBF;AAAA,UAAK,WAAU;AAAA,UAAf,UAiBE;AAAA,4BAhBD,MAAC,SAAD;AAAA,cAAQ,WAAU;AAAA,aAA8C;AAAA,4BAChE,MAAC,SAAD;AAAA,cACC,KAAK;AAAA,cACL,MAAK;AAAA,cACL,OAAO;AAAA,cACP,UAAU,CAAC,MAAM;AAAA,gBAChB,SAAS,EAAE,OAAO,KAAK;AAAA,gBACvB,iBAAiB,CAAC;AAAA;AAAA,cAEnB,WAAW;AAAA,cACX,aAAY;AAAA,cACZ,WAAU;AAAA,aACX;AAAA,4BACA,MAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAEE;AAAA;AAAA,SACD;AAAA,wBAEF,MA8BE,OA9BF;AAAA,UAAK,KAAK;AAAA,UAAS,WAAU;AAAA,UAA7B,UACE,SAAS,WAAW,oBACpB,MAEE,OAFF;AAAA,YAAK,WAAU;AAAA,YAAf,UACE,QAAQ,sBAAsB;AAAA,WAC9B,IAEF,SAAS,IAAI,CAAC,MAAM,QAAQ;AAAA,YAC3B,MAAM,YAAY,WAAW,IAAI,IAAI;AAAA,YACrC,uBACC,OAiBE,UAjBF;AAAA,cAEC,MAAK;AAAA,cACL,SAAS,MAAM,aAAa,IAAI;AAAA,cAChC,WAAW,gFACV,QAAQ,gBACL,qCACA,0CACA,YAAY,eAAe;AAAA,cARhC,UAiBE;AAAA,gCAPD,MAAC,WAAD;AAAA,kBAAU,WAAU;AAAA,iBAAkD;AAAA,gCACtE,MAAC,iBAAD;AAAA,kBAAiB,MAAM;AAAA,kBAAM;AAAA,iBAAc;AAAA,gBAC1C,6BACA,MAEE,QAFF;AAAA,kBAAM,WAAU;AAAA,kBAAhB;AAAA,iBAEE;AAAA;AAAA,eAdE,IAgBJ;AAAA,WAEH;AAAA,SAED;AAAA,QAED,SAAS,SAAS,qBAClB,OAcE,OAdF;AAAA,UAAK,WAAU;AAAA,UAAf,UAcE;AAAA,4BAbD,OAKE,QALF;AAAA,wBAKE;AAAA,gCAJD,MAEE,OAFF;AAAA,kBAAK,WAAU;AAAA,kBAAf;AAAA,iBAEE;AAAA,gBAAK;AAAA,gBAHR;AAAA;AAAA,aAKE;AAAA,4BACF,OAKE,QALF;AAAA,wBAKE;AAAA,gCAJD,MAEE,OAFF;AAAA,kBAAK,WAAU;AAAA,kBAAf;AAAA,iBAEE;AAAA,gBAAK;AAAA,gBAHR;AAAA;AAAA,aAKE;AAAA,4BACF,OAAmD,QAAnD;AAAA,cAAM,WAAU;AAAA,cAAhB,UAAmD;AAAA,gBAAxB,SAAS;AAAA,gBAApC;AAAA;AAAA,aAAmD;AAAA;AAAA,SAClD;AAAA;AAAA,KAEF;AAAA,GACD;AAAA,CAEH;AAED,SAAS,eAAe,GAAG,MAAM,SAA0C;AAAA,EAC1E,IAAI,CAAC,OAAO;AAAA,IACX,uBAAO,MAAqD,QAArD;AAAA,MAAM,WAAU;AAAA,MAAhB,UAA8C;AAAA,KAAO;AAAA,EAC7D;AAAA,EAEA,MAAM,YAAY,KAAK,YAAY;AAAA,EACnC,MAAM,aAAa,MAAM,YAAY;AAAA,EACrC,MAAM,MAAM,UAAU,QAAQ,UAAU;AAAA,EAExC,IAAI,OAAO,GAAG;AAAA,IACb,uBACC,OAME,QANF;AAAA,MAAM,WAAU;AAAA,MAAhB,UAME;AAAA,QALA,KAAK,MAAM,GAAG,GAAG;AAAA,wBAClB,MAEE,QAFF;AAAA,UAAM,WAAU;AAAA,UAAhB,UACE,KAAK,MAAM,KAAK,MAAM,MAAM,MAAM;AAAA,SAClC;AAAA,QACD,KAAK,MAAM,MAAM,MAAM,MAAM;AAAA;AAAA,KAC7B;AAAA,EAEJ;AAAA,EAEA,uBAAO,MAAqD,QAArD;AAAA,IAAM,WAAU;AAAA,IAAhB,UAA8C;AAAA,GAAO;AAAA;;AE7N7D,iBAAS;;;ACAT,iBAAS,qBAAM,yBAAW,sBAAU;AACpC;AAAA,UACC;AAAA,WACA;AAAA,gBACA;AAAA,aACA;AAAA,OACA;AAAA,SACA;AAAA,kBACA;AAAA,gBACA;AAAA,eACA;AAAA;AAED,sBAAS;;AA4EF,IAAM,oBAAoB,OAAK,SAAS,kBAAiB;AAAA,EAC/D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GAC0B;AAAA,EAC1B,OAAO,QAAQ,aAAa,WAAS,KAAK;AAAA,EAC1C,OAAO,aAAa,kBAAkB,WAAS,KAAK;AAAA,EACpD,OAAO,mBAAmB,wBAAwB,WAAS,KAAK;AAAA,EAChE,OAAO,kBAAkB,uBAAuB,WAAS,EAAE;AAAA,EAC3D,OAAO,mBAAmB,wBAAwB,WAAS,KAAK;AAAA,EAChE,OAAO,mBAAmB,wBAAwB,WACjD,IACD;AAAA,EACA,OAAO,gBAAgB,qBAAqB,WAAwB,IAAI;AAAA,EACxE,OAAO,aAAa,kBAAkB,WAAS,EAAE;AAAA,EACjD,OAAO,kBAAkB,uBAAuB,WAAwB,IAAI;AAAA,EAC5E,OAAO,kBAAkB,uBAAuB,WAAwB,IAAI;AAAA,EAC5E,OAAO,cAAc,mBAAmB,WAI9B,IAAI;AAAA,EACd,OAAO,gBAAgB,qBAAqB,WAAS,EAAE;AAAA,EACvD,OAAO,kBAAkB,uBAAuB,WAAS,KAAK;AAAA,EAC9D,OAAO,gBAAgB,qBAAqB,WAAS,KAAK;AAAA,EAC1D,OAAO,eAAe,oBAAoB,WAKhC,IAAI;AAAA,EACd,OAAO,gBAAgB,qBAAqB,WAAS,KAAK;AAAA,EAC1D,OAAO,cAAc,mBAAmB,WAAwB,IAAI;AAAA,EACpE,OAAO,iBAAiB,sBAAsB,WAC7C,OACD;AAAA,EACA,OAAO,mBAAmB,wBAAwB,WAAS,EAAE;AAAA,EAC7D,OAAO,oBAAoB,yBAAyB,WAAS,KAAK;AAAA,EAClE,OAAO,oBAAoB,yBAAyB,WAAS,KAAK;AAAA,EAClE,OAAO,oBAAoB,yBAAyB,WAI1C,IAAI;AAAA,EACd,OAAO,oBAAoB,yBAAyB,WAU1C,IAAI;AAAA,EACd,OAAO,mBAAmB,wBAAwB,WAAS,KAAK;AAAA,EAChE,OAAO,kBAAkB,uBAAuB,WAAS,KAAK;AAAA,EAC9D,OAAO,gBAAgB,qBAAqB,WAAS,KAAK;AAAA,EAC1D,MAAM,iBAAiB,SAAsC,SAAS;AAAA,EACtE,MAAM,sBAAsB,SAAO,KAAK;AAAA,EACxC,MAAM,mBAAmB,SAAO,uBAAuB;AAAA,EACvD,iBAAiB,UAAU;AAAA,EAC3B,MAAM,UAAU,aAAa,CAAC,MAAM,EAAE,OAAO;AAAA,EAC7C,MAAM,cAAc,aAAa,CAAC,MAAM,EAAE,WAAW;AAAA,EACrD,MAAM,OAAO,aAAa,CAAC,MAAM,EAAE,IAAI;AAAA,EACvC,MAAM,eAAe,aAAa,CAAC,MAAM,EAAE,YAAY;AAAA,EACvD,MAAM,mBAAmB,aAAa,CAAC,MAAM,EAAE,SAAS;AAAA,EACxD,MAAM,iBAAiB,SAAyB,IAAI;AAAA,EACpD,MAAM,oBAAoB,SAAyB,IAAI;AAAA,EACvD,MAAM,sBAAsB,SAA4B,IAAI;AAAA,EAC5D,MAAM,mBAAmB,aAAa,CAAC,MAAM,EAAE,gBAAgB;AAAA,EAC/D,MAAM,qBAAqB,SAAO,KAAK;AAAA,EACvC,QAAQ,iBAAiB,eAAe,MAAM;AAAA,EAC9C,MAAM,gBAAgB,MAAM,yBAAyB,WAAW;AAAA,EAChE,MAAM,kBAAkB,cAAc,SACnC,OAAO,aAAa,oBAAoB,GAAG,QAAQ,CAAC,cACpD,IAAI,cAAc,QAAQ,CAAC;AAAA,EAG9B,YAAU,MAAM;AAAA,IACf,IAAI,mBAAmB,WAAW,CAAC,kBAAkB;AAAA,MAEpD,aAAa;AAAA,IACd;AAAA,IACA,mBAAmB,UAAU;AAAA,KAC3B,CAAC,kBAAkB,YAAY,CAAC;AAAA,EAEnC,YAAU,MAAM;AAAA,IACf,IAAI,CAAC,WAAW,KAAK,cAAc,CAAC,aAAa;AAAA,MAChD,eAAe,IAAI;AAAA,MACnB,cAAc,EAAE,QAAQ,MAAM,eAAe,KAAK,CAAC;AAAA,IACpD;AAAA,KACE,CAAC,WAAW,KAAK,YAAY,eAAe,WAAW,CAAC;AAAA,EAE3D,YAAU,MAAM;AAAA,IACf,IAAI,kBAAkB,eAAe,SAAS;AAAA,MAC7C,eAAe,QAAQ,MAAM;AAAA,IAC9B;AAAA,KACE,CAAC,cAAc,CAAC;AAAA,EAEnB,YAAU,MAAM;AAAA,IACf,IAAI,gBAAgB,kBAAkB,SAAS;AAAA,MAC9C,kBAAkB,QAAQ,MAAM;AAAA,IACjC;AAAA,KACE,CAAC,YAAY,CAAC;AAAA,EAEjB,YAAU,MAAM;AAAA,IACf,IAAI,qBAAqB,oBAAoB,SAAS;AAAA,MACrD,oBAAoB,QAAQ,MAAM;AAAA,IACnC;AAAA,KACE,CAAC,iBAAiB,CAAC;AAAA,EAEtB,YAAU,MAAM;AAAA,IACf,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,iBAAiB;AAAA,MAAS;AAAA,IACpE,oBAAoB,UAAU;AAAA,IAC9B,MAAM,iBAAiB,KAAK,KAC1B,cAAc,YAAY,KAAK,OAAO,MACvC,IACD;AAAA,IACA,MAAM,eAAe,MAAM;AAAA,MAC1B,eAAe,UAAU,WAAW,YAAY;AAAA,QAC/C,IAAI,oBAAoB;AAAA,UAAS;AAAA,QACjC,IAAI;AAAA,UACH,MAAM,SAAS,iBAAiB;AAAA,UAChC,IAAI,CAAC;AAAA,YAAQ;AAAA,UACb,MAAM,SAAS,MAAM,OAAO,cAAc,SAAS;AAAA,UACnD,IAAI,oBAAoB;AAAA,YAAS;AAAA,UACjC,IAAI,OAAO,WAAW,YAAY;AAAA,YACjC,iBAAiB,IAAI;AAAA,YACrB,kBAAkB,KAAK;AAAA,YACvB,gBAAgB,IAAI;AAAA,YACpB,oBAAoB,KAAK;AAAA,UAC1B,EAAO,SAAI,OAAO,WAAW,SAAS;AAAA,YACrC,gBAAgB,OAAO,SAAS,sBAAsB;AAAA,YACtD,kBAAkB,KAAK;AAAA,UACxB,EAAO;AAAA,YACN,aAAa;AAAA;AAAA,UAEb,MAAM;AAAA,UACP,IAAI,CAAC,oBAAoB;AAAA,YAAS,aAAa;AAAA;AAAA,SAE9C,cAAc;AAAA;AAAA,IAElB,aAAa;AAAA,IACb,MAAM,UAAU,WAAW,MAAM;AAAA,MAChC,kBAAkB,KAAK;AAAA,MACvB,gBAAgB,4CAA4C;AAAA,OAC1D,MAAM;AAAA,IACT,OAAO,MAAM;AAAA,MACZ,oBAAoB,UAAU;AAAA,MAC9B,IAAI,eAAe;AAAA,QAAS,aAAa,eAAe,OAAO;AAAA,MAC/D,aAAa,OAAO;AAAA;AAAA,KAEnB,CAAC,gBAAgB,aAAa,CAAC;AAAA,EAElC,MAAM,aAAa,YAAY;AAAA,IAC9B,IAAI,WAAW,KAAK,WAAW;AAAA,MAC9B,MAAM,UAAU,UAAU,UAAU,WAAW,KAAK,SAAS;AAAA,MAC7D,UAAU,IAAI;AAAA,MACd,WAAW,MAAM,UAAU,KAAK,GAAG,IAAI;AAAA,IACxC;AAAA;AAAA,EAGD,MAAM,kBAAkB,CAAC,SACxB,GAAG,KAAK,MAAM,GAAG,CAAC,OAAO,KAAK,MAAM,EAAE;AAAA,EAEvC,MAAM,oBAAoB,OAAO,eAAuB;AAAA,IACvD,IAAI,CAAC,YAAY,KAAK;AAAA,MAAG;AAAA,IACzB,IAAI;AAAA,MACH,MAAM,cAAc,YAAY,YAAY,KAAK,CAAC;AAAA,MAClD,kBAAkB,IAAI;AAAA,MACtB,eAAe,EAAE;AAAA,MAChB,MAAM;AAAA;AAAA,EAGT,MAAM,uBAAuB,OAAO,eAAuB;AAAA,IAC1D,IAAI,qBAAqB,YAAY;AAAA,MACpC,oBAAoB,UAAU;AAAA,MAC9B,IAAI;AAAA,QACH,MAAM,iBAAiB,UAAU;AAAA,gBAChC;AAAA,QACD,oBAAoB,IAAI;AAAA,QACxB,oBAAoB,IAAI;AAAA;AAAA,IAE1B,EAAO;AAAA,MACN,oBAAoB,UAAU;AAAA;AAAA;AAAA,EAIhC,MAAM,qBAAqB,MAAM;AAAA,IAChC,oBAAoB,IAAI;AAAA;AAAA,EAGzB,MAAM,kCAAkC,MAAM;AAAA,IAC7C,IAAI,CAAC;AAAA,MAA0B;AAAA,IAC/B,kBAAkB,IAAI;AAAA,IACtB,gBAAgB,IAAI;AAAA,IACpB,yBAAyB,EACvB,KAAK,CAAC,SAAS;AAAA,MACf,iBAAiB,IAAI;AAAA,MACrB,kBAAkB,KAAK;AAAA,KACvB,EACA,MAAM,CAAC,QAAQ;AAAA,MACf,gBACC,eAAe,QAAQ,IAAI,UAAU,6BACtC;AAAA,MACA,kBAAkB,KAAK;AAAA,KACvB;AAAA;AAAA,EAGH,MAAM,mBAAmB,OAAO,YAAoB,SAAkB;AAAA,IACrE,IAAI,eAAe,aAAa;AAAA,MAC/B,gBAAgB,EAAE,UAAU,YAAY,WAAW,MAAM,KAAK,CAAC;AAAA,IAChE,EAAO,SAAI,eAAe,WAAW;AAAA,MACpC,mBAAmB,OAAO;AAAA,MAC1B,qBAAqB,EAAE;AAAA,MACvB,sBAAsB,IAAI;AAAA,MAC1B,sBAAsB,IAAI;AAAA,MAC1B,kBAAkB,KAAK;AAAA,MACvB,iBAAiB,IAAI;AAAA,MACrB,gBAAgB,IAAI;AAAA,MACpB,oBAAoB,IAAI;AAAA,MAExB,IAAI,yBAAyB;AAAA,QAC5B,wBAAwB,EACtB,KAAK,CAAC,YAAY,sBAAsB,OAAO,CAAC,EAChD,MAAM,MAAM,EAAE;AAAA,MACjB;AAAA,MAEA,IAAI,yBAAyB;AAAA,QAC5B,wBAAwB,EACtB,KAAK,CAAC,gBAAgB,sBAAsB,WAAW,CAAC,EACxD,MAAM,MAAM,EAAE;AAAA,MACjB;AAAA,MAEA,gCAAgC;AAAA,IACjC,EAAO;AAAA,MACN,aAAa,YAAY,IAAI;AAAA;AAAA;AAAA,EAI/B,MAAM,kBAAkB,YAAY;AAAA,IACnC,IAAI,CAAC;AAAA,MAAc;AAAA,IACnB,kBAAkB,IAAI;AAAA,IACtB,IAAI;AAAA,MACH,QAAQ,cAAc,MAAM,mBAC3B,aAAa,UACb,aAAa,IACd;AAAA,MACA,gBAAgB,KAAK,cAAc,UAAU,CAAC;AAAA,MAC7C,OAAO,KAAK;AAAA,MACb,QAAQ,MAAM,0BAA0B,GAAG;AAAA;AAAA,IAE5C,kBAAkB,KAAK;AAAA;AAAA,EAGxB,MAAM,qBAAqB,YAAY;AAAA,IACtC,IAAI,CAAC,gBAAgB,CAAC,aAAa,aAAa,CAAC,eAAe,KAAK;AAAA,MACpE;AAAA,IACD,oBAAoB,IAAI;AAAA,IACxB,IAAI;AAAA,MACH,MAAM,oBACL,aAAa,UACb,eAAe,KAAK,GACpB,aAAa,SACd;AAAA,MACA,gBAAgB,IAAI;AAAA,MACpB,kBAAkB,EAAE;AAAA,MACnB,MAAM;AAAA,IACR,oBAAoB,KAAK;AAAA;AAAA,EAG1B,MAAM,oBAAoB,MAAM;AAAA,IAC/B,gBAAgB,IAAI;AAAA,IACpB,kBAAkB,EAAE;AAAA;AAAA,EAGrB,MAAM,0BAA0B,MAAM;AAAA,IACrC,IAAI,CAAC;AAAA,MAAe;AAAA,IACpB,QAAQ,cAAc,eAAe;AAAA,IACrC,kBAAkB,IAAI;AAAA;AAAA,EAGvB,MAAM,0BAA0B,CAAC,SAA4B;AAAA,IAC5D,mBAAmB,IAAI;AAAA,IACvB,gBAAgB,IAAI;AAAA,IACpB,IAAI,SAAS,SAAS;AAAA,MACrB,kBAAkB,KAAK;AAAA,IACxB;AAAA,IACA,IAAI,SAAS,WAAW,CAAC,iBAAiB,CAAC,gBAAgB;AAAA,MAC1D,gCAAgC;AAAA,IACjC;AAAA;AAAA,EAGD,MAAM,yBAAyB,YAAY;AAAA,IAC1C,IAAI,CAAC,kBAAkB,KAAK,KAAK,CAAC;AAAA,MAAoB;AAAA,IACtD,sBAAsB,IAAI;AAAA,IAC1B,gBAAgB,IAAI;AAAA,IACpB,IAAI;AAAA,MACH,MAAM,mBAAmB,kBAAkB,KAAK,CAAC;AAAA,MACjD,oBAAoB;AAAA,MACnB,OAAO,KAAK;AAAA,MACb,gBACC,eAAe,QAAQ,IAAI,UAAU,8BACtC;AAAA,cACC;AAAA,MACD,sBAAsB,KAAK;AAAA;AAAA;AAAA,EAI7B,MAAM,4BAA4B,YAAY;AAAA,IAC7C,IAAI,CAAC;AAAA,MAA4B;AAAA,IACjC,sBAAsB,IAAI;AAAA,IAC1B,gBAAgB,IAAI;AAAA,IACpB,IAAI;AAAA,MACH,MAAM,2BAA2B;AAAA,MACjC,oBAAoB;AAAA,MACnB,OAAO,KAAK;AAAA,MACb,gBACC,eAAe,QACZ,IAAI,UACJ,wCACJ;AAAA,cACC;AAAA,MACD,sBAAsB,KAAK;AAAA;AAAA;AAAA,EAI7B,MAAM,wBAAwB,YAAY;AAAA,IACzC,IAAI,CAAC;AAAA,MAAe;AAAA,IACpB,MAAM,UAAU,UAAU,UAAU,cAAc,QAAQ;AAAA,IAC1D,qBAAqB,IAAI;AAAA,IACzB,WAAW,MAAM,qBAAqB,KAAK,GAAG,IAAI;AAAA;AAAA,EAGnD,MAAM,sBAAsB,MAAM;AAAA,IACjC,iBAAiB,IAAI;AAAA,IACrB,kBAAkB,KAAK;AAAA,IACvB,gBAAgB,IAAI;AAAA,IACpB,qBAAqB,EAAE;AAAA,IACvB,sBAAsB,KAAK;AAAA,IAC3B,sBAAsB,KAAK;AAAA,IAC3B,mBAAmB,OAAO;AAAA,IAC1B,qBAAqB,KAAK;AAAA,IAC1B,oBAAoB,KAAK;AAAA,IACzB,kBAAkB,KAAK;AAAA,IACvB,oBAAoB,UAAU;AAAA,IAC9B,IAAI,eAAe,SAAS;AAAA,MAC3B,aAAa,eAAe,OAAO;AAAA,MACnC,eAAe,UAAU;AAAA,IAC1B;AAAA;AAAA,EAGD,MAAM,yBAAyB,MAAM;AAAA,IACpC,qBAAqB,IAAI;AAAA,IACzB,oBAAoB,EAAE;AAAA,IACtB,qBAAqB,IAAI;AAAA;AAAA,EAG1B,MAAM,0BAA0B,MAAM;AAAA,IACrC,IAAI;AAAA,MAAmB;AAAA,IACvB,qBAAqB,KAAK;AAAA,IAC1B,qBAAqB,IAAI;AAAA,IACzB,oBAAoB,EAAE;AAAA;AAAA,EAGvB,MAAM,qBAAqB,YAAY;AAAA,IACtC,IAAI,CAAC,iBAAiB,KAAK,KAAK;AAAA,MAAmB;AAAA,IACnD,qBAAqB,IAAI;AAAA,IACzB,qBAAqB,IAAI;AAAA,IACzB,IAAI;AAAA,MACH,MAAM,eAAe,iBAAiB,KAAK,CAAC;AAAA,MAC5C,qBAAqB,KAAK;AAAA,MAC1B,oBAAoB,EAAE;AAAA,MACtB,aAAa;AAAA,MACZ,OAAO,KAAK;AAAA,MACb,qBACC,eAAe,QAAQ,IAAI,UAAU,yBACtC;AAAA,cACC;AAAA,MACD,qBAAqB,KAAK;AAAA;AAAA;AAAA,EAI5B,MAAM,sBAAsB,OAAO,QAAQ,WAAW,SAAS,EAAE,OAChE,EAAE,IAAI,UAAU,KAAK,cAAc,OAAO,MAC3C;AAAA,EACA,MAAM,wBAAwB,OAAO,QAAQ,WAAW,SAAS,EAAE,OAClE,EAAE,IAAI,UAAU,CAAC,KAAK,cAAc,OAAO,MAC5C;AAAA,EAEA,uBACC,OAyqBE,OAzqBF;AAAA,IAAK,WAAU;AAAA,IAAf,UAyqBE;AAAA,MAxqBA,CAAC,8BACD,OAWE,OAXF;AAAA,QAAK,WAAU;AAAA,QAAf,UAWE;AAAA,0BAVD,OAGE,OAHF;AAAA,YAAK,WAAU;AAAA,YAAf,UAGE;AAAA,8BAFD,OAAC,cAAD;AAAA,gBAAc,UAAS;AAAA,gBAAO,MAAM;AAAA,eAAI;AAAA,8BACxC,OAAsD,QAAtD;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAAsD;AAAA;AAAA,WACrD;AAAA,UACD,CAAC,8BACD,OAGE,OAHF;AAAA,YAAK,WAAU;AAAA,YAAf,UAGE;AAAA,8BAFD,OAAC,QAAD;AAAA,gBAAM,WAAU;AAAA,eAAoC;AAAA,cADrD;AAAA;AAAA,WAGE;AAAA;AAAA,OAEF;AAAA,sBAIH,OAgTE,OAhTF;AAAA,QACC,WAAW,sCAAsC,aAAa,2BAA2B;AAAA,QAD1F,0BAGC,OA4SE,OA5SF;AAAA,UAAK,WAAU;AAAA,UAAf,UA4SE;AAAA,4BA1SD,OASE,OATF;AAAA,cAAK,WAAU;AAAA,cAAf,UASE;AAAA,gCARD,OAEE,MAFF;AAAA,kBAAI,WAAU;AAAA,kBAAd,UACE,aAAa,qBAAqB;AAAA,iBAClC;AAAA,gCACF,OAIE,KAJF;AAAA,kBAAG,WAAU;AAAA,kBAAb,UACE,aACE,sEACA;AAAA,iBACF;AAAA;AAAA,aACD;AAAA,4BAEF,OA8RE,OA9RF;AAAA,cAAK,WAAU;AAAA,cAAf,UA8RE;AAAA,gCA5RD,OAiGE,OAjGF;AAAA,4CACC,OA+FE,OA/FF;AAAA,oBAAK,WAAU;AAAA,oBAAf,UACE,WAAW,KAAK,cAAc,WAAW,KAAK,4BAC9C,OAuFE,OAvFF;AAAA,sBAAK,WAAU;AAAA,sBAAf,UAuFE;AAAA,wCArFD,OAQE,OARF;AAAA,0BAAK,WAAU;AAAA,0BAAf,UAQE;AAAA,4CAPD,OAAC,cAAD;AAAA,8BAAc,UAAS;AAAA,8BAAO,MAAM;AAAA,6BAAI;AAAA,4CACxC,OAEE,QAFF;AAAA,8BAAM,WAAU;AAAA,8BAAhB;AAAA,6BAEE;AAAA,4CACF,OAEE,QAFF;AAAA,8BAAM,WAAU;AAAA,8BAAhB;AAAA,6BAEE;AAAA;AAAA,yBACD;AAAA,wCAEF,OAQE,OARF;AAAA,0BAAK,WAAU;AAAA,0BAAf,0BACC,OAME,OANF;AAAA,4BAAK,WAAU;AAAA,4BAAf,0BACC,OAAC,YAAD;AAAA,8BACC,OAAO,WAAW,KAAK;AAAA,8BACvB,MAAM;AAAA,8BACN,OAAM;AAAA,6BACP;AAAA,2BACC;AAAA,yBACD;AAAA,wCAEF,OAqCE,OArCF;AAAA,0BAAK,WAAU;AAAA,0BAAf,UAqCE;AAAA,4CApCD,OAWE,UAXF;AAAA,8BACC,MAAK;AAAA,8BACL,SAAS;AAAA,8BACT,WAAU;AAAA,8BAHX,UAWE;AAAA,gCANA,gBAAgB,WAAW,KAAK,SAAS;AAAA,gCACzC,yBACA,OAAC,SAAD;AAAA,kCAAO,WAAU;AAAA,iCAA6B,oBAE9C,OAAC,OAAD;AAAA,kCAAM,WAAU;AAAA,iCAAoC;AAAA;AAAA,6BAEpD;AAAA,4CAEF,OAsBE,OAtBF;AAAA,8BAAK,WAAU;AAAA,8BAAf,UAsBE;AAAA,gDArBD,OAgBE,OAhBF;AAAA,kCAAK,WAAU;AAAA,kCAAf,UAgBE;AAAA,oDAfD,OAIE,OAJF;AAAA,sCAAK,WAAU;AAAA,sCAAf,0BACC,OAEE,QAFF;AAAA,wCAAM,WAAU;AAAA,wCAAhB,UACE;AAAA,uCACA;AAAA,qCACD;AAAA,oDACF,OASE,UATF;AAAA,sCACC,MAAK;AAAA,sCACL,SAAS;AAAA,sCACT,UAAU;AAAA,sCACV,WAAU;AAAA,sCAJX,0BAMC,OAAC,aAAD;AAAA,wCACC,WAAW,WAAW,mBAAmB,iBAAiB;AAAA,uCAC3D;AAAA,qCACC;AAAA;AAAA,iCACD;AAAA,gDACF,OAGE,QAHF;AAAA,kCAAM,WAAU;AAAA,kCAAhB,UAGE;AAAA,oCAHF;AAAA,qCACY,WAAW,GAAG,QAAQ,CAAC;AAAA,oCADnC;AAAA,oCACgD;AAAA,qCAC7C,eAAe,GAAG,QAAQ,CAAC;AAAA,oCAF9B;AAAA;AAAA,iCAGE;AAAA;AAAA,6BACD;AAAA;AAAA,yBACD;AAAA,wCAGF,OAME,OANF;AAAA,0BAAK,WAAU;AAAA,0BAAf,UAME;AAAA,4CALD,OAAC,OAAD;AAAA,8BAAK,WAAU;AAAA,6BAAwB;AAAA,4CACvC,OAEE,QAFF;AAAA,8BAAM,WAAU;AAAA,8BAAhB;AAAA,6BAEE;AAAA,4CACF,OAAC,OAAD;AAAA,8BAAK,WAAU;AAAA,6BAAwB;AAAA;AAAA,yBACtC;AAAA,wCAEF,OAOE,UAPF;AAAA,0BACC,MAAK;AAAA,0BACL,SAAS;AAAA,0BACT,WAAU;AAAA,0BAHX,UAOE;AAAA,4CAFD,OAAC,aAAD;AAAA,8BAAY,WAAU;AAAA,6BAAU;AAAA,4BALjC;AAAA;AAAA,yBAOE;AAAA,wCAEF,OAOE,UAPF;AAAA,0BACC,MAAK;AAAA,0BACL,SAAS;AAAA,0BACT,WAAU;AAAA,0BAHX,UAOE;AAAA,4CAFD,OAAC,MAAD;AAAA,8BAAK,WAAU;AAAA,6BAAU;AAAA,4BAL1B;AAAA;AAAA,yBAOE;AAAA;AAAA,qBACD,oBAEF,OAEE,OAFF;AAAA,sBAAK,WAAU;AAAA,sBAAf,0BACC,OAAC,WAAD;AAAA,wBAAS,WAAU;AAAA,uBAA6C;AAAA,qBAC/D;AAAA,mBAEF;AAAA,iBACD;AAAA,gCAGF,OAuLE,OAvLF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAuLE;AAAA,oCArLD,OAkFE,OAlFF;AAAA,gCAkFE;AAAA,wCAjFD,OASE,OATF;AAAA,0BAAK,WAAU;AAAA,0BAAf,UASE;AAAA,4CARD,OAEE,MAFF;AAAA,8BAAI,WAAU;AAAA,8BAAd;AAAA,6BAEE;AAAA,4BACD,oBAAoB,SAAS,qBAC7B,OAEE,QAFF;AAAA,8BAAM,WAAU;AAAA,8BAAhB,UAEE;AAAA,gCADA,oBAAoB;AAAA,gCADtB;AAAA;AAAA,6BAEE;AAAA;AAAA,yBAEF;AAAA,wBAED,oBAAoB,WAAW,oBAC/B,OAEE,OAFF;AAAA,0BAAK,WAAU;AAAA,0BAAf;AAAA,yBAEE,oBAEF,OA+DE,OA/DF;AAAA,0BAAK,WAAU;AAAA,0BAAf,UACE,oBAAoB,IAAI,EAAE,IAAI,0BAC9B,OA2DE,OA3DF;AAAA,4BAEC,WAAW,mFACV,qBAAqB,KAClB,mDACA;AAAA,4BALL,UA2DE;AAAA,8CAnDD,OAAC,cAAD;AAAA,gCAAc,UAAU;AAAA,gCAAI,MAAM;AAAA,+BAAI;AAAA,8CACtC,OAQE,QARF;AAAA,gCACC,WAAW,yCACV,qBAAqB,KAClB,qBACA;AAAA,gCAJL,UAOE,KAAK;AAAA,+BACL;AAAA,8BACD,qBAAqB,sBACrB,OAEE,QAFF;AAAA,gCAAM,WAAU;AAAA,gCAAhB,UACE,KAAK,SAAS,UAAU,UAAU;AAAA,+BAClC;AAAA,8BAEF,qBAAqB,qBACrB,OAuBE,OAvBF;AAAA,gCAAK,WAAU;AAAA,gCAAf,UAuBE;AAAA,kDAtBD,OAEE,QAFF;AAAA,oCAAM,WAAU;AAAA,oCAAhB;AAAA,mCAEE;AAAA,kDACF,OAWE,UAXF;AAAA,oCACC,MAAK;AAAA,oCACL,SAAS,MAAM,qBAAqB,EAAE;AAAA,oCACtC,UAAU,qBAAqB;AAAA,oCAC/B,WAAU;AAAA,oCAJX,UAME,qBAAqB,qBACrB,OAAC,WAAD;AAAA,sCAAS,WAAU;AAAA,qCAAuB,IAE1C;AAAA,mCAEA;AAAA,kDACF,OAME,UANF;AAAA,oCACC,MAAK;AAAA,oCACL,SAAS;AAAA,oCACT,WAAU;AAAA,oCAHX;AAAA,mCAME;AAAA;AAAA,+BACD,IAEF,OAAO,0BACN,OAME,UANF;AAAA,gCACC,MAAK;AAAA,gCACL,SAAS,MAAM,qBAAqB,EAAE;AAAA,gCACtC,WAAU;AAAA,gCAHX,0BAKC,OAAC,KAAD;AAAA,kCAAG,WAAU;AAAA,iCAAU;AAAA,+BACtB;AAAA;AAAA,6BAvDC,EA0DJ,CACF;AAAA,yBACA;AAAA;AAAA,qBAEF;AAAA,oCAGF,OA+FE,OA/FF;AAAA,gCA+FE;AAAA,wCA9FD,OAEE,MAFF;AAAA,0BAAI,WAAU;AAAA,0BAAd;AAAA,yBAEE;AAAA,wCACF,OA0FE,OA1FF;AAAA,0BAAK,WAAU;AAAA,0BAAf,UACE,sBAAsB,IAAI,EAAE,IAAI,0BAChC,OAsFE,OAtFF;AAAA,sCACE,mBAAmB,qBACnB,OAqCE,OArCF;AAAA,8BAAK,WAAU;AAAA,8BAAf,UAqCE;AAAA,gDApCD,OAEE,OAFF;AAAA,kCAAK,WAAU;AAAA,kCAAf,0BACC,OAAC,cAAD;AAAA,oCAAc,UAAU;AAAA,oCAAI,MAAM;AAAA,mCAAI;AAAA,iCACrC;AAAA,gDACF,OAAC,SAAD;AAAA,kCACC,KAAK;AAAA,kCACL,MAAK;AAAA,kCACL,OAAO;AAAA,kCACP,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK;AAAA,kCAC9C,aAAa,GAAG,KAAK;AAAA,kCACrB,WAAU;AAAA,kCACV,WAAW,CAAC,MAAM;AAAA,oCACjB,IAAI,EAAE,QAAQ;AAAA,sCAAS,kBAAkB,EAAE;AAAA,oCAC3C,IAAI,EAAE,QAAQ,UAAU;AAAA,sCACvB,kBAAkB,IAAI;AAAA,sCACtB,eAAe,EAAE;AAAA,oCAClB;AAAA;AAAA,iCAEF;AAAA,gDACA,OAOE,UAPF;AAAA,kCACC,MAAK;AAAA,kCACL,SAAS,MAAM,kBAAkB,EAAE;AAAA,kCACnC,UAAU,CAAC,YAAY,KAAK;AAAA,kCAC5B,WAAU;AAAA,kCAJX;AAAA,iCAOE;AAAA,gDACF,OASE,UATF;AAAA,kCACC,MAAK;AAAA,kCACL,SAAS,MAAM;AAAA,oCACd,kBAAkB,IAAI;AAAA,oCACtB,eAAe,EAAE;AAAA;AAAA,kCAElB,WAAU;AAAA,kCANX,0BAQC,OAAC,KAAD;AAAA,oCAAG,WAAU;AAAA,mCAAU;AAAA,iCACtB;AAAA;AAAA,6BACD,oBAEF,OA2CE,OA3CF;AAAA,8BAAK,WAAU;AAAA,8BAAf,UA2CE;AAAA,gDA1CD,OAUE,OAVF;AAAA,kCAAK,WAAU;AAAA,kCAAf,UAUE;AAAA,oDATD,OAAC,cAAD;AAAA,sCAAc,UAAU;AAAA,sCAAI,MAAM;AAAA,qCAAI;AAAA,oDACtC,OAOE,OAPF;AAAA,sCAAK,WAAU;AAAA,sCAAf,UAOE;AAAA,wDAND,OAEE,OAFF;AAAA,0CAAK,WAAU;AAAA,0CAAf,UACE,KAAK;AAAA,yCACL;AAAA,wDACF,OAEE,OAFF;AAAA,0CAAK,WAAU;AAAA,0CAAf,UAEE;AAAA,4CADA,KAAK;AAAA,4CADP;AAAA;AAAA,yCAEE;AAAA;AAAA,qCACD;AAAA;AAAA,iCACD;AAAA,gDACF,OA8BE,OA9BF;AAAA,kCAAK,WAAU;AAAA,kCAAf,UA8BE;AAAA,oCA7BA,OAAO,6BACP,OAOE,UAPF;AAAA,sCACC,MAAK;AAAA,sCACL,SAAS,MAAM,kBAAkB,EAAE;AAAA,sCACnC,WAAU;AAAA,sCAHX,UAOE;AAAA,wDAFD,OAAC,MAAD;AAAA,0CAAK,WAAU;AAAA,yCAAc;AAAA,wCAL9B;AAAA;AAAA,qCAOE;AAAA,oCAEF,KAAK,iCACL,OAgBE,UAhBF;AAAA,sCACC,MAAK;AAAA,sCACL,SAAS,MACR,iBACC,IACA,OAAO,cAAc,QAAQ,SAC9B;AAAA,sCAED,WAAU;AAAA,sCARX,UAgBE;AAAA,wDAND,OAAC,gBAAD;AAAA,0CAAc,WAAU;AAAA,yCAAc;AAAA,wCACrC,OAAO,cACL,QACA,OAAO,YACN,UACA;AAAA;AAAA,qCACH;AAAA;AAAA,iCAEF;AAAA;AAAA,6BACD;AAAA,6BApFM,EAsFR,CACF;AAAA,yBACA;AAAA;AAAA,qBACD;AAAA;AAAA,iBACD;AAAA;AAAA,aACD;AAAA;AAAA,SACD;AAAA,OACD;AAAA,sBAGF,OA0BE,OA1BF;AAAA,QAAK,WAAU;AAAA,QAAf,0BACC,OAwBE,OAxBF;AAAA,UAAK,WAAU;AAAA,UAAf,UAwBE;AAAA,YAvBA,CAAC,8BACD,OAEE,OAFF;AAAA,cAAK,WAAU;AAAA,cAAf;AAAA,aAEE;AAAA,YAEF,6BACA,OAME,UANF;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,WAAU;AAAA,cAHX;AAAA,aAME,oBAEF,OAOE,UAPF;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,WAAU;AAAA,cAHX,UAOE;AAAA,gBAPF;AAAA,gCAMC,OAAC,aAAD;AAAA,kBAAY,WAAU;AAAA,iBAAU;AAAA;AAAA,aAC/B;AAAA;AAAA,SAEF;AAAA,OACD;AAAA,MAED,qCACA,OAoDE,OApDF;AAAA,QAAK,WAAU;AAAA,QAAf,0BACC,OAkDE,OAlDF;AAAA,UAAK,WAAU;AAAA,UAAf,UAkDE;AAAA,4BAjDD,OAGE,OAHF;AAAA,cAAK,WAAU;AAAA,cAAf,UAGE;AAAA,gCAFD,OAAC,cAAD;AAAA,kBAAc,UAAS;AAAA,kBAAO,MAAM;AAAA,iBAAI;AAAA,gCACxC,OAA0D,MAA1D;AAAA,kBAAI,WAAU;AAAA,kBAAd;AAAA,iBAA0D;AAAA;AAAA,aACzD;AAAA,4BACF,OA4CE,OA5CF;AAAA,cAAK,WAAU;AAAA,cAAf,UA4CE;AAAA,gCA3CD,OAGE,KAHF;AAAA,kBAAG,WAAU;AAAA,kBAAb;AAAA,iBAGE;AAAA,gCACF,OAAC,YAAD;AAAA,kBACC,KAAK;AAAA,kBACL,OAAO;AAAA,kBACP,UAAU,CAAC,MAAM,oBAAoB,EAAE,OAAO,KAAK;AAAA,kBACnD,aAAY;AAAA,kBACZ,WAAU;AAAA,kBACV,WAAW,CAAC,MAAM;AAAA,oBACjB,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,SAAS;AAAA,sBAClD,EAAE,eAAe;AAAA,sBACjB,mBAAmB;AAAA,oBACpB;AAAA,oBACA,IAAI,EAAE,QAAQ;AAAA,sBAAU,wBAAwB;AAAA;AAAA,iBAElD;AAAA,gBACC,qCACA,OAA8D,KAA9D;AAAA,kBAAG,WAAU;AAAA,kBAAb,UAA0C;AAAA,iBAAoB;AAAA,gCAE/D,OAqBE,OArBF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAqBE;AAAA,oCApBD,OAOE,UAPF;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,UAAU;AAAA,sBACV,WAAU;AAAA,sBAJX;AAAA,qBAOE;AAAA,oCACF,OAWE,UAXF;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,UAAU,CAAC,iBAAiB,KAAK,KAAK;AAAA,sBACtC,WAAU;AAAA,sBAJX,UAME,oCACA,OAAC,WAAD;AAAA,wBAAS,WAAU;AAAA,uBAAuB,IAE1C;AAAA,qBAEA;AAAA;AAAA,iBACD;AAAA;AAAA,aACD;AAAA;AAAA,SACD;AAAA,OACD;AAAA,MAIF,gCACA,OAsFE,OAtFF;AAAA,QAAK,WAAU;AAAA,QAAf,0BACC,OAoFE,OApFF;AAAA,UAAK,WAAU;AAAA,UAAf,UAoFE;AAAA,4BAnFD,OAOE,OAPF;AAAA,cAAK,WAAU;AAAA,cAAf,UAOE;AAAA,gCAND,OAAC,cAAD;AAAA,kBAAc,UAAU,aAAa;AAAA,kBAAU,MAAM;AAAA,iBAAI;AAAA,gCACzD,OAIE,MAJF;AAAA,kBAAI,WAAU;AAAA,kBAAd,UAIE;AAAA,oBAJF;AAAA,oBACS;AAAA,oBACP,WAAW,UAAU,aAAa,WAAW,SAC7C,aAAa;AAAA;AAAA,iBACb;AAAA;AAAA,aACD;AAAA,YAED,CAAC,aAAa,4BACd,OAgCE,OAhCF;AAAA,cAAK,WAAU;AAAA,cAAf,UAgCE;AAAA,gCA/BD,OAME,KANF;AAAA,kBAAG,WAAU;AAAA,kBAAb,UAME;AAAA,oBANF;AAAA,oBACyB;AAAA,oBACvB,WAAW,UAAU,aAAa,WAAW,SAC7C,aAAa;AAAA,oBAAU;AAAA,oBAHzB;AAAA;AAAA,iBAME;AAAA,gCACF,OAuBE,OAvBF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAuBE;AAAA,oCAtBD,OAME,UANF;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,WAAU;AAAA,sBAHX;AAAA,qBAME;AAAA,oCACF,OAcE,UAdF;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,UAAU;AAAA,sBACV,WAAU;AAAA,sBAJX,UAME,iCACA,OAAC,WAAD;AAAA,wBAAS,WAAU;AAAA,uBAAuB,oBAE1C;AAAA,kCAGE;AAAA,0BAHF;AAAA,0CAEC,OAAC,gBAAD;AAAA,4BAAc,WAAU;AAAA,2BAAU;AAAA;AAAA,uBACjC;AAAA,qBAEF;AAAA;AAAA,iBACD;AAAA;AAAA,aACD,oBAEF,OAqCE,OArCF;AAAA,cAAK,WAAU;AAAA,cAAf,UAqCE;AAAA,gCApCD,OAEE,KAFF;AAAA,kBAAG,WAAU;AAAA,kBAAb;AAAA,iBAEE;AAAA,gCACF,OAAC,SAAD;AAAA,kBACC,MAAK;AAAA,kBACL,KAAK;AAAA,kBACL,OAAO;AAAA,kBACP,UAAU,CAAC,MAAM,kBAAkB,EAAE,OAAO,KAAK;AAAA,kBACjD,aAAY;AAAA,kBACZ,WAAU;AAAA,kBACV,WAAW,CAAC,MAAM;AAAA,oBACjB,IAAI,EAAE,QAAQ;AAAA,sBAAS,mBAAmB;AAAA,oBAC1C,IAAI,EAAE,QAAQ;AAAA,sBAAU,kBAAkB;AAAA;AAAA,iBAE5C;AAAA,gCACA,OAoBE,OApBF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAoBE;AAAA,oCAnBD,OAME,UANF;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,WAAU;AAAA,sBAHX;AAAA,qBAME;AAAA,oCACF,OAWE,UAXF;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,UAAU,CAAC,eAAe,KAAK,KAAK;AAAA,sBACpC,WAAU;AAAA,sBAJX,UAME,mCACA,OAAC,WAAD;AAAA,wBAAS,WAAU;AAAA,uBAAuB,IAE1C;AAAA,qBAEA;AAAA;AAAA,iBACD;AAAA;AAAA,aACD;AAAA;AAAA,SAEF;AAAA,OACD;AAAA,MAIF,oCACA,OAkLE,OAlLF;AAAA,QAAK,WAAU;AAAA,QAAf,0BACC,OAgLE,OAhLF;AAAA,UAAK,WAAU;AAAA,UAAf,UAgLE;AAAA,4BA/KD,OAGE,OAHF;AAAA,cAAK,WAAU;AAAA,cAAf,UAGE;AAAA,gCAFD,OAAC,cAAD;AAAA,kBAAc,UAAS;AAAA,kBAAU,MAAM;AAAA,iBAAI;AAAA,gCAC3C,OAA8D,MAA9D;AAAA,kBAAI,WAAU;AAAA,kBAAd;AAAA,iBAA8D;AAAA;AAAA,aAC7D;AAAA,4BACF,OA0KE,OA1KF;AAAA,cAAK,WAAU;AAAA,cAAf,UA0KE;AAAA,gCAzKD,OAuBE,OAvBF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAuBE;AAAA,oCAtBD,OAUE,UAVF;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,MAAM,wBAAwB,OAAO;AAAA,sBAC9C,WAAW,gEACV,oBAAoB,UACjB,kCACA;AAAA,sBANL;AAAA,qBAUE;AAAA,oCACF,OAUE,UAVF;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS,MAAM,wBAAwB,OAAO;AAAA,sBAC9C,WAAW,gEACV,oBAAoB,UACjB,kCACA;AAAA,sBANL;AAAA,qBAUE;AAAA;AAAA,iBACD;AAAA,gBAED,oBAAoB,0BACpB;AAAA,4BA4BE;AAAA,oCA3BD,OAEE,KAFF;AAAA,sBAAG,WAAU;AAAA,sBAAb;AAAA,qBAEE;AAAA,oCACF,OAuBE,OAvBF;AAAA,sBAAK,WAAU;AAAA,sBAAf,UACE,iCACA,OAEE,OAFF;AAAA,wBAAK,WAAU;AAAA,wBAAf,0BACC,OAAC,OAAD;AAAA,0BAAK,WAAU;AAAA,yBAA0C;AAAA,uBACxD,IACC,gCACH;AAAA,kCAeE;AAAA,0CAdD,OAEE,QAFF;AAAA,4BAAM,WAAU;AAAA,4BAAhB,UACE,cAAc;AAAA,2BACd;AAAA,0CACF,OAUE,UAVF;AAAA,4BACC,MAAK;AAAA,4BACL,SAAS;AAAA,4BACT,WAAU;AAAA,4BAHX,UAKE,oCACA,OAAC,SAAD;AAAA,8BAAO,WAAU;AAAA,6BAAyB,oBAE1C,OAAC,OAAD;AAAA,8BAAM,WAAU;AAAA,6BAAU;AAAA,2BAE1B;AAAA;AAAA,uBACD,IACC;AAAA,qBACH;AAAA;AAAA,iBACD,oBAEF;AAAA,4BAuCE;AAAA,oCAtCD,OAEE,KAFF;AAAA,sBAAG,WAAU;AAAA,sBAAb;AAAA,qBAEE;AAAA,oCACF,OAAC,SAAD;AAAA,sBACC,MAAK;AAAA,sBACL,OAAO;AAAA,sBACP,UAAU,CAAC,MAAM,qBAAqB,EAAE,OAAO,KAAK;AAAA,sBACpD,aAAY;AAAA,sBACZ,WAAU;AAAA,qBACX;AAAA,oBACC,oBAAoB,SAAS,6BAC7B,OAWE,UAXF;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,UAAU;AAAA,sBACV,WAAU;AAAA,sBAJX,UAME,qCACA,OAAC,WAAD;AAAA,wBAAS,WAAU;AAAA,uBAAuB,IAE1C;AAAA,qBAEA;AAAA,oBAEF,oBAAoB,SAAS,aAC7B,CAAC,mBAAmB,SAAS,iCAC5B,OAGE,KAHF;AAAA,sBAAG,WAAU;AAAA,sBAAb,UACE,mBAAmB,SAAS,UAC5B;AAAA,qBACA;AAAA,oBAEH,sBACA,CAAC,mBAAmB,SAAS,aAC7B,mBAAmB,SAAS,0BAC3B,OAEE,KAFF;AAAA,sBAAG,WAAU;AAAA,sBAAb,UACE,mBAAmB,SAAS;AAAA,qBAC5B;AAAA;AAAA,iBAEH;AAAA,gBAGF,sBACA,mBAAmB,aAAa,SAAS,qBACxC,OAcE,OAdF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UACE,mBAAmB,aAAa,IAAI,CAAC,2BACrC,OAUE,OAVF;AAAA,8BAUE;AAAA,sBATA,OAAO;AAAA,sBADT;AAAA,sBACkB;AAAA,sBAChB,OAAO,aACL,OAAO,QACN,OAAO,QACP,GAAG,OAAO,cAAc,qBACzB;AAAA,sBACF,OAAO,yBAAyB,OAAO,gBACrC,sBAAsB,OAAO,mBAC7B;AAAA;AAAA,qBATM,OAAO,MAUf,CACF;AAAA,iBACA;AAAA,gBAGH,gCACA,OAEE,KAFF;AAAA,kBAAG,WAAU;AAAA,kBAAb,UACE;AAAA,iBACA;AAAA,gBAGF,kBAAkB,oBAAoB,2BACtC,OAGE,OAHF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAGE;AAAA,oCAFD,OAAC,WAAD;AAAA,sBAAS,WAAU;AAAA,qBAAuB;AAAA,oBAD3C;AAAA;AAAA,iBAGE;AAAA,gCAGH,OAsCE,OAtCF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAsCE;AAAA,oCArCD,OAME,UANF;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,WAAU;AAAA,sBAHX;AAAA,qBAME;AAAA,oBACD,oBAAoB,0BACpB,OAcE,UAdF;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,UAAU,kBAAkB;AAAA,sBAC5B,WAAU;AAAA,sBAJX,UAME,kBAAkB,iCAClB,OAAC,WAAD;AAAA,wBAAS,WAAU;AAAA,uBAAuB,oBAE1C;AAAA,kCAGE;AAAA,0BAHF;AAAA,0CAEC,OAAC,gBAAD;AAAA,4BAAc,WAAU;AAAA,2BAAU;AAAA;AAAA,uBACjC;AAAA,qBAEF,oBAEF,OAWE,UAXF;AAAA,sBACC,MAAK;AAAA,sBACL,SAAS;AAAA,sBACT,UAAU,CAAC,kBAAkB,KAAK,KAAK;AAAA,sBACvC,WAAU;AAAA,sBAJX,UAME,qCACA,OAAC,WAAD;AAAA,wBAAS,WAAU;AAAA,uBAAuB,IAE1C;AAAA,qBAEA;AAAA;AAAA,iBAEF;AAAA;AAAA,aACD;AAAA;AAAA,SACD;AAAA,OACD;AAAA;AAAA,GAEF;AAAA,CAEH;;;AC3pCD,iBAAS,oBAAM,yBAAU,sBAAW,kBAAO;AAC3C,oBAAS,kCAAoB,0BAAU;;AA+BhC,IAAM,eAAe,OAAK,SAAS,aAAY;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,GACQ;AAAA,EACrB,OAAO,SAAQ,aAAa,WAA4B,IAAI;AAAA,EAC5D,OAAO,WAAW,gBAAgB,WAA2B,IAAI;AAAA,EACjE,OAAO,WAAW,gBAAgB,WAAS,IAAI;AAAA,EAC/C,OAAO,UAAU,eAAe,WAAS,KAAK;AAAA,EAE9C,OAAO,kBAAkB,uBAAuB,WAAS,MAAM;AAAA,EAC/D,OAAO,eAAe,oBAAoB,WAAS,WAAW;AAAA,EAC9D,OAAO,eAAe,oBAAoB,WACzC,WAAW,SAAS,SAAS,OAC9B;AAAA,EACA,OAAO,kBAAkB,uBAAuB,WAE9C,WAAW,SAAS,gBAAgB,WAAW;AAAA,EACjD,OAAO,YAAY,iBAAiB,WAAS,KAAK;AAAA,EAClD,MAAM,yBAAyB,SAAO,KAAK;AAAA,EAE3C,MAAM,aAAa,OAAM;AAAA,EACzB,MAAM,UAAU,OAAM;AAAA,EACtB,MAAM,UAAU,OAAM;AAAA,EACtB,MAAM,aAAa,OAAM;AAAA,EAEzB,YAAU,MAAM;AAAA,IACf,MAAM,aAAa,YAAY;AAAA,MAC9B,IAAI;AAAA,QACH,OAAO,YAAY,cAAc,MAAM,QAAQ,IAAI;AAAA,UAClD,UAAU,UAAU;AAAA,UACpB,UAAU,aAAa;AAAA,QACxB,CAAC;AAAA,QACD,UAAU,UAAU;AAAA,QACpB,aAAa,UAAU;AAAA,QACvB,MAAM,cAAc,YAAY,UAAU,YAAY;AAAA,QACtD,MAAM,WAAW,YAAY,UAAU,SAAS;AAAA,QAChD,MAAM,oBAAoB,aAAa,cAAc,QAAQ,SAAS;AAAA,QACtE,MAAM,mBAAmB,oBAAoB,cAAc;AAAA,QAC3D,MAAM,gBACL,qBACA,WAAW,aAAa,OAAO,KAC9B,CAAC,MAAsB,EAAE,OAAO,QACjC,IACG,WACA,aAAa,mBAAmB,SAAS,IAAI,MAAM;AAAA,QACvD,oBAAoB,gBAAgB;AAAA,QACpC,iBAAiB,aAAa;AAAA,QAC9B,IAAI,YAAY,UAAU,OAAO;AAAA,UAChC,iBAAiB,WAAW,SAAS,KAAK;AAAA,QAC3C;AAAA,QACA,IAAI,YAAY,UAAU,cAAc;AAAA,UACvC,oBAAoB,WAAW,SAAS,YAAY;AAAA,QACrD;AAAA,QACA,IAAI,YAAY,UAAU,YAAY;AAAA,UACrC,cAAc,WAAW,SAAS,UAAU;AAAA,QAC7C;AAAA,QACC,MAAM,WACN;AAAA,QACD,aAAa,KAAK;AAAA;AAAA;AAAA,IAGpB,WAAW;AAAA,KACT,CAAC,CAAC;AAAA,EAEL,YAAU,MAAM;AAAA,IACf,IAAI,SAAQ,QAAQ,QAAQ;AAAA,MAC3B,MAAM,SAAS,QAAO;AAAA,MACtB,IAAI,CAAC,iBAAiB,CAAC,OAAO,SAAS,aAAa,GAAG;AAAA,QACtD,iBAAiB,OAAO,SAAS,OAAO,IAAI,UAAU,OAAO,EAAE;AAAA,MAChE;AAAA,IACD;AAAA,KACE,CAAC,SAAQ,aAAa,CAAC;AAAA,EAE1B,YAAU,MAAM;AAAA,IACf,IAAI,YAAY,qBAAqB,uBAAuB,SAAS;AAAA,MACpE,MAAM,iBAAiB,UAAU;AAAA,MACjC,IAAI,CAAC,eAAe,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,aAAa,GAAG;AAAA,QAC/D,iBAAiB,eAAe,OAAO,IAAI,MAAM,EAAE;AAAA,MACpD;AAAA,IACD;AAAA,KACE,CAAC,kBAAkB,WAAW,aAAa,CAAC;AAAA,EAE/C,MAAM,eAAe,YAAY;AAAA,IAChC,YAAY,IAAI;AAAA,IAChB,IAAI;AAAA,MACH,MAAM,UAAU,eAAe;AAAA,QAC9B,UAAU;AAAA,QACV,OAAO;AAAA,QACP,OAAO;AAAA,QACP,cAAc;AAAA,QACd;AAAA,QACA,OAAO;AAAA,MACR,CAAC;AAAA,MACD,MAAM,WAAW;AAAA,MAChB,MAAM,WACN;AAAA,MACD,YAAY,KAAK;AAAA;AAAA;AAAA,EAInB,IAAI,WAAW;AAAA,IACd,uBACC,OAEE,OAFF;AAAA,MAAK,WAAU;AAAA,MAAf,0BACC,OAAC,WAAD;AAAA,QAAS,WAAU;AAAA,OAA6C;AAAA,KAC/D;AAAA,EAEJ;AAAA,EAEA,MAAM,qBAAqB,SAAQ,UAAU,OAC5C,CAAC,OACC,WAAW,UAAU,IAAI,cAAc,MAAM,WAC9C,YAAY,IAAI,QAAQ,SAAS,CACnC,KAAK,CAAC,MAAM;AAAA,EAEZ,MAAM,wBAAwB,YAAY,mBAAmB,UAAU,CAAC;AAAA,EAExE,uBACC,OA6ME,OA7MF;AAAA,IAAK,WAAU;AAAA,IAAf,UA6ME;AAAA,MA5MA,CAAC,8BACD,OASE,OATF;AAAA,QAAK,WAAU;AAAA,QAAf,UASE;AAAA,0BARD,OAGE,OAHF;AAAA,YAAK,WAAU;AAAA,YAAf,UAGE;AAAA,8BAFD,OAAC,cAAD;AAAA,gBAAc,UAAS;AAAA,gBAAO,MAAM;AAAA,eAAI;AAAA,8BACxC,OAAsD,QAAtD;AAAA,gBAAM,WAAU;AAAA,gBAAhB;AAAA,eAAsD;AAAA;AAAA,WACrD;AAAA,0BACF,OAGE,OAHF;AAAA,YAAK,WAAU;AAAA,YAAf,UAGE;AAAA,8BAFD,OAAC,QAAD;AAAA,gBAAM,WAAU;AAAA,eAAmC;AAAA,cADpD;AAAA;AAAA,WAGE;AAAA;AAAA,OACD;AAAA,sBAIH,OA6JE,OA7JF;AAAA,QACC,WAAW,sCAAsC,aAAa,2BAA2B;AAAA,QAD1F,0BAGC,OAyJE,OAzJF;AAAA,UAAK,WAAU;AAAA,UAAf,UAyJE;AAAA,4BAvJD,OAOE,OAPF;AAAA,cAAK,WAAU;AAAA,cAAf,UAOE;AAAA,gCAND,OAEE,MAFF;AAAA,kBAAI,WAAU;AAAA,kBAAd;AAAA,iBAEE;AAAA,gCACF,OAEE,KAFF;AAAA,kBAAG,WAAU;AAAA,kBAAb;AAAA,iBAEE;AAAA;AAAA,aACD;AAAA,4BAGF,OA4IE,OA5IF;AAAA,cAAK,WAAU;AAAA,cAAf,UA4IE;AAAA,gCA1ID,OAyBE,OAzBF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAyBE;AAAA,oCAxBD,OAKE,SALF;AAAA,sBACC,SAAS;AAAA,sBACT,WAAU;AAAA,sBAFX;AAAA,qBAKE;AAAA,oCACF,OAiBE,OAjBF;AAAA,sBAAK,WAAU;AAAA,sBAAf,UAiBE;AAAA,wCAhBD,OAcE,UAdF;AAAA,0BACC,IAAI;AAAA,0BACJ,OAAO;AAAA,0BACP,UAAU,CAAC,MAAM;AAAA,4BAChB,uBAAuB,UAAU;AAAA,4BACjC,oBAAoB,EAAE,OAAO,KAAK;AAAA;AAAA,0BAEnC,WAAU;AAAA,0BAPX,UASE,mBAAmB,IAAI,CAAC,sBACxB,OAEE,UAFF;AAAA,4BAAgB,OAAO;AAAA,4BAAvB,UACE,WAAW,UAAU,IAAI,SAAS;AAAA,6BADvB,CAEX,CACF;AAAA,yBACA;AAAA,wCACF,OAAC,eAAD;AAAA,0BAAa,WAAU;AAAA,yBAA8F;AAAA;AAAA,qBACpH;AAAA;AAAA,iBACD;AAAA,gCAGF,OAsBE,OAtBF;AAAA,kBAAK,WAAU;AAAA,kBAAf,UAsBE;AAAA,oCArBD,OAKE,SALF;AAAA,sBACC,SAAS;AAAA,sBACT,WAAU;AAAA,sBAFX;AAAA,qBAKE;AAAA,oCACF,OAcE,OAdF;AAAA,sBAAK,WAAU;AAAA,sBAAf,UAcE;AAAA,wCAbD,OAWE,UAXF;AAAA,0BACC,IAAI;AAAA,0BACJ,OAAO;AAAA,0BACP,UAAU,CAAC,MAAM,iBAAiB,EAAE,OAAO,KAAK;AAAA,0BAChD,WAAU;AAAA,0BAJX,UAME,sBAAsB,IAAI,CAAC,sBAC3B,OAEE,UAFF;AAAA,4BAAmB,OAAO,EAAE;AAAA,4BAA5B,UACE,EAAE,SAAS,EAAE;AAAA,6BADF,EAAE,EAEb,CACF;AAAA,yBACA;AAAA,wCACF,OAAC,eAAD;AAAA,0BAAa,WAAU;AAAA,yBAA8F;AAAA;AAAA,qBACpH;AAAA;AAAA,iBACD;AAAA,gCAGF,OAsBE,OAtBF;AAAA,4BAsBE;AAAA,oCArBD,OAKE,SALF;AAAA,sBACC,SAAS;AAAA,sBACT,WAAU;AAAA,sBAFX;AAAA,qBAKE;AAAA,oCACF,OAcE,OAdF;AAAA,sBAAK,WAAU;AAAA,sBAAf,UAcE;AAAA,wCAbD,OAWE,UAXF;AAAA,0BACC,IAAI;AAAA,0BACJ,OAAO;AAAA,0BACP,UAAU,CAAC,MAAM,iBAAiB,EAAE,OAAO,KAAK;AAAA,0BAChD,WAAU;AAAA,0BAJX,WAMG,SAAQ,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC,sBACnC,OAEE,UAFF;AAAA,4BAAgB,OAAO;AAAA,4BAAvB,UACE;AAAA,6BADW,CAEX,CACF;AAAA,yBACA;AAAA,wCACF,OAAC,eAAD;AAAA,0BAAa,WAAU;AAAA,yBAA8F;AAAA;AAAA,qBACpH;AAAA;AAAA,iBACD;AAAA,gCAGF,OA6BE,OA7BF;AAAA,4BA6BE;AAAA,oCA5BD,OAKE,SALF;AAAA,sBACC,SAAS;AAAA,sBACT,WAAU;AAAA,sBAFX;AAAA,qBAKE;AAAA,oCACF,OAkBE,OAlBF;AAAA,sBAAK,WAAU;AAAA,sBAAf,UAkBE;AAAA,wCAjBD,OAeE,UAfF;AAAA,0BACC,IAAI;AAAA,0BACJ,OAAO;AAAA,0BACP,UAAU,CAAC,MACV,oBACC,EAAE,OAAO,KACV;AAAA,0BAED,WAAU;AAAA,0BARX,UAeE;AAAA,4CALD,OAAgD,UAAhD;AAAA,8BAAQ,OAAM;AAAA,8BAAd;AAAA,6BAAgD;AAAA,4CAChD,OAEE,UAFF;AAAA,8BAAQ,OAAM;AAAA,8BAAd;AAAA,6BAEE;AAAA,4CACF,OAA8C,UAA9C;AAAA,8BAAQ,OAAM;AAAA,8BAAd;AAAA,6BAA8C;AAAA;AAAA,yBAC7C;AAAA,wCACF,OAAC,eAAD;AAAA,0BAAa,WAAU;AAAA,yBAA8F;AAAA;AAAA,qBACpH;AAAA,oCACF,OAEE,KAFF;AAAA,sBAAG,WAAU;AAAA,sBAAb;AAAA,qBAEE;AAAA;AAAA,iBACD;AAAA,gCAGF,OA2BE,OA3BF;AAAA,kBAAK,WAAU;AAAA,kBAAf,0BACC,OAyBE,OAzBF;AAAA,oBAAK,WAAU;AAAA,oBAAf,UAyBE;AAAA,sCAxBD,OAQE,OARF;AAAA,kCAQE;AAAA,0CAPD,OAEE,QAFF;AAAA,4BAAM,WAAU;AAAA,4BAAhB;AAAA,2BAEE;AAAA,0CACF,OAGE,KAHF;AAAA,4BAAG,WAAU;AAAA,4BAAb;AAAA,2BAGE;AAAA;AAAA,uBACD;AAAA,sCACF,OAcE,UAdF;AAAA,wBACC,MAAK;AAAA,wBACL,MAAK;AAAA,wBACL,gBAAc;AAAA,wBACd,SAAS,MAAM,cAAc,CAAC,UAAU;AAAA,wBACxC,WAAW,oJACV,aAAa,eAAe;AAAA,wBAN9B,0BASC,OAAC,QAAD;AAAA,0BACC,WAAW,oEACV,aAAa,kBAAkB,mBAC5B,aAAa,0BAA0B;AAAA,yBAC5C;AAAA,uBACC;AAAA;AAAA,mBACD;AAAA,iBACD;AAAA;AAAA,aACD;AAAA;AAAA,SACD;AAAA,OACD;AAAA,sBAGF,OA6BE,OA7BF;AAAA,QAAK,WAAU;AAAA,QAAf,0BACC,OA2BE,OA3BF;AAAA,UAAK,WAAU;AAAA,UAAf,UA2BE;AAAA,4BA1BD,OAOE,UAPF;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,WAAU;AAAA,cAHX,UAOE;AAAA,gCAFD,OAAC,WAAD;AAAA,kBAAW,WAAU;AAAA,iBAAU;AAAA,gBALhC;AAAA;AAAA,aAOE;AAAA,4BACF,OAiBE,UAjBF;AAAA,cACC,MAAK;AAAA,cACL,SAAS;AAAA,cACT,UAAU;AAAA,cACV,WAAU;AAAA,cAJX,UAME,2BACA;AAAA,0BAGE;AAAA,kCAFD,OAAC,WAAD;AAAA,oBAAS,WAAU;AAAA,mBAAuB;AAAA,kBAD3C;AAAA;AAAA,eAGE,oBAEF;AAAA,0BAGE;AAAA,kBAHF;AAAA,kCAEC,OAAC,WAAD;AAAA,oBAAU,WAAU;AAAA,mBAAU;AAAA;AAAA,eAC7B;AAAA,aAEF;AAAA;AAAA,SACD;AAAA,OACD;AAAA;AAAA,GACD;AAAA,CAEH;;;;AF3VM,IAAM,kBAAkB,OAAK,SAAS,gBAAe;AAAA,EAC3D,aAAa;AAAA,GACW;AAAA,EACxB,MAAM,SAAS,mBAAmB,CAAC,MAAM,EAAE,MAAM;AAAA,EACjD,MAAM,cAAc,mBAAmB,CAAC,MAAM,EAAE,WAAW;AAAA,EAC3D,MAAM,aAAa,mBAAmB,CAAC,MAAM,EAAE,UAAU;AAAA,EACzD,MAAM,aAAa,mBAAmB,CAAC,MAAM,EAAE,UAAU;AAAA,EACzD,MAAM,WAAW,mBAAmB,CAAC,MAAM,EAAE,QAAQ;AAAA,EACrD,MAAM,WAAW,mBAAmB,CAAC,MAAM,EAAE,QAAQ;AAAA,EACrD,MAAM,QAAQ,mBAAmB,CAAC,MAAM,EAAE,KAAK;AAAA,EAC/C,MAAM,iBAAiB,aAAa,CAAC,MAAM,EAAE,cAAc;AAAA,EAE3D;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACG,cAAc;AAAA,EAElB,IAAI,CAAC,UAAU,CAAC;AAAA,IAAY,OAAO;AAAA,EAEnC,uBACC,OAiCE,OAjCF;AAAA,IAAK,WAAU;AAAA,IAAf,UAiCE;AAAA,MAhCA,gBAAgB,4BAChB,OAAC,mBAAD;AAAA,QACC;AAAA,QACA,eAAe;AAAA,QACf,gBAAgB;AAAA,QAChB,eAAe;AAAA,QACf,kBAAkB;AAAA,QAClB,cAAc;AAAA,QACd,oBAAoB;AAAA,QACpB,qBAAqB;AAAA,QACrB,aAAa;AAAA,QACb,QAAQ;AAAA,QACR;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA,0BAA0B;AAAA,QAC1B,yBAAyB;AAAA,QACzB,yBAAyB;AAAA,QACzB,oBAAoB;AAAA,QACpB,4BAA4B;AAAA,QAC5B,yBAAyB;AAAA,OAC1B;AAAA,MAGA,gBAAgB,8BAChB,OAAC,cAAD;AAAA,QACC;AAAA,QACA,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR;AAAA,OACD;AAAA;AAAA,GAEA;AAAA,CAEH;;AG9ED,sBAAS,yBAAW,2BAAU,0BAAa;AAI3C,IAAM,eAAc;AAEpB,SAAS,mBAAmB,GAAU;AAAA,EACrC,IAAI,OAAO,WAAW,aAAa;AAAA,IAClC,OAAO;AAAA,EACR;AAAA,EACA,MAAM,SAAS,OAAO,aAAa,QAAQ,YAAW;AAAA,EACtD,IAAI,WAAW,WAAW,WAAW,QAAQ;AAAA,IAC5C,OAAO;AAAA,EACR;AAAA,EACA,IAAI,OAAO,aAAa,+BAA+B,EAAE,SAAS;AAAA,IACjE,OAAO;AAAA,EACR;AAAA,EACA,OAAO;AAAA;AAGD,SAAS,QAAQ,GAAG;AAAA,EAC1B,OAAO,OAAO,YAAY,WAAgB,MAAM,oBAAoB,CAAC;AAAA,EAErE,YAAU,MAAM;AAAA,IACf,IAAI,OAAO,aAAa;AAAA,MAAa;AAAA,IAErC,MAAM,OAAO,SAAS;AAAA,IACtB,IAAI,UAAU,QAAQ;AAAA,MACrB,KAAK,UAAU,IAAI,MAAM;AAAA,IAC1B,EAAO;AAAA,MACN,KAAK,UAAU,OAAO,MAAM;AAAA;AAAA,IAG7B,IAAI;AAAA,MACH,OAAO,aAAa,QAAQ,cAAa,KAAK;AAAA,MAC7C,OAAO,OAAO;AAAA,MACf,QAAQ,KAAK,sCAAsC,KAAK;AAAA;AAAA,IAGzD,IAAI,OAAO,UAAU,OAAO,WAAW,QAAQ;AAAA,MAC9C,OAAO,OAAO,YAAY,EAAE,MAAM,kBAAkB,MAAM,GAAG,GAAG;AAAA,IACjE;AAAA,KACE,CAAC,KAAK,CAAC;AAAA,EAEV,YAAU,MAAM;AAAA,IACf,IAAI,OAAO,WAAW;AAAA,MAAa;AAAA,IACnC,MAAM,UAAU,CAAC,MAAoB;AAAA,MACpC,IACC,EAAE,MAAM,SAAS,qBAChB,EAAE,KAAK,UAAU,WAAW,EAAE,KAAK,UAAU,SAC7C;AAAA,QACD,SAAS,EAAE,KAAK,KAAK;AAAA,MACtB;AAAA;AAAA,IAED,OAAO,iBAAiB,WAAW,OAAO;AAAA,IAC1C,OAAO,MAAM,OAAO,oBAAoB,WAAW,OAAO;AAAA,KACxD,CAAC,CAAC;AAAA,EAGL,MAAM,cAAc,cAAY,MAAM;AAAA,IACrC,SAAS,CAAC,SAAU,SAAS,SAAS,UAAU,MAAO;AAAA,KACrD,CAAC,CAAC;AAAA,EAGL,OAAO,UACN,OAAO,EAAE,OAAO,UAAU,YAAY,IACtC,CAAC,OAAO,WAAW,CACpB;AAAA;;ACnED,sBAAS,yBAAW;AAYb,SAAS,mBAAmB,GAAG;AAAA,EACrC,OAAO,SAAS,cAAc,WAAwB,IAAI;AAAA,EAE1D,YAAU,MAAM;AAAA,IACf,MAAM,wBAAwB,YAAY;AAAA,MACzC,IAAI;AAAA,QACH,MAAM,MAAM;AAAA,QACZ,MAAM,UAAU,IAAI,mBAAmB;AAAA,QACvC,MAAM,MAAM,GAAG;AAAA,QAEf,QAAQ,IAAI,wCAAwC,GAAG;AAAA,QAEvD,MAAM,WAAW,MAAM,MAAM,GAAG;AAAA,QAChC,IAAI,CAAC,SAAS,IAAI;AAAA,UACjB,QAAQ,MACP,iCACA,SAAS,QACT,SAAS,UACV;AAAA,UACA,MAAM,IAAI,MACT,sCAAsC,SAAS,QAChD;AAAA,QACD;AAAA,QAEA,MAAM,OAA6B,MAAM,SAAS,KAAK;AAAA,QACvD,QAAQ,IAAI,kCAAkC,IAAI;AAAA,QAElD,IAAI,KAAK,SAAS;AAAA,UACjB,QAAQ,IAAI,2CAA2C,KAAK,OAAO;AAAA,UACnE,WAAW,KAAK,OAAO;AAAA,UACvB,SAAS,QAAQ,KAAK;AAAA,QACvB;AAAA,QACC,OAAO,OAAO;AAAA,QACf,QAAQ,MAAM,gCAAgC,KAAK;AAAA,QACnD,SAAS,QAAQ;AAAA;AAAA;AAAA,IAInB,sBAAsB;AAAA,KACpB,CAAC,CAAC;AAAA,EAEL,OAAO;AAAA;;ACrDR,sBAAS,4BAAW;AAwBb,SAAS,oBAAoB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GAC+B;AAAA,EAC/B;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACG,cAAc;AAAA,EAClB;AAAA,IACC,cAAc;AAAA,IACd,gBAAgB;AAAA,MACb,gBAAgB;AAAA,EACpB,QAAQ,YAAY,eAAe,eAAe,cAAc,YAAY;AAAA,EAC5E,MAAM,YAAY,YAAY,CAAC,UAAU,MAAM,SAAS;AAAA,EACxD,MAAM,iBAAiB,iBAAiB,CAAC,UAAU,MAAM,aAAa;AAAA,EAEtE,MAAM,sBAAsB,WAAW,QAAQ,mBAAmB,EAAE;AAAA,EAEpE,MAAM,gBAAgB,cACrB,CAAC,MAAqB;AAAA,IACrB,MAAM,SAAS,EAAE;AAAA,IACjB,MAAM,YACL,OAAO,YAAY,WACnB,OAAO,YAAY,cACnB,OAAO;AAAA,IACR,MAAM,eAAe,CAAC,CAAC,OAAO,QAAQ,wBAAwB;AAAA,IAE9D,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,KAAK;AAAA,MAC9C,EAAE,eAAe;AAAA,MAGjB,IAAI,iBAAiB,YAAY;AAAA,QAE/B,SAAS,eAA+B,KAAK;AAAA,QAC9C,SAAS,OAAO;AAAA,QAChB,wBAAwB,IAAI;AAAA,QAE5B,WAAW,MAAM,kBAAkB,GAAG,EAAE;AAAA,MACzC,EAAO,SAAI,iBAAiB,OAAO;AAAA,QAEjC,SAAS,eAA+B,KAAK;AAAA,QAC9C,SAAS,OAAO;AAAA,QAChB,UAAU;AAAA,QACV,UAAU;AAAA,QACV,WAAW,MAAM,kBAAkB,GAAG,EAAE;AAAA,MACzC,EAAO;AAAA,QAEL,SAAS,eAA+B,KAAK;AAAA,QAC9C,SAAS,UAAU;AAAA,QACnB,wBAAwB,KAAK;AAAA,QAC7B,IAAI,uBAAuB,GAAG;AAAA,UAC7B,gBAAgB,mBAAmB;AAAA,QACpC;AAAA;AAAA,MAED;AAAA,IACD;AAAA,IAEA,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,KAAK;AAAA,MAC9C,EAAE,eAAe;AAAA,MAGjB,IAAI,iBAAiB,OAAO;AAAA,QAE1B,SAAS,eAA+B,KAAK;AAAA,QAC9C,SAAS,OAAO;AAAA,QAChB,UAAU;AAAA,QACV,UAAU;AAAA,QAEV,WAAW,MAAM,kBAAkB,GAAG,EAAE;AAAA,MACzC,EAAO,SAAI,iBAAiB,YAAY;AAAA,QAEtC,SAAS,eAA+B,KAAK;AAAA,QAC9C,SAAS,OAAO;AAAA,QAChB,wBAAwB,IAAI;AAAA,QAC5B,WAAW,MAAM,kBAAkB,GAAG,EAAE;AAAA,MACzC,EAAO;AAAA,QAEL,SAAS,eAA+B,KAAK;AAAA,QAC9C,IAAI,CAAC,eAAe;AAAA,UACnB,UAAU;AAAA,QACX;AAAA,QACA,SAAS,KAAK;AAAA,QACd,kBAAkB;AAAA;AAAA,MAEnB;AAAA,IACD;AAAA,IAEA,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,KAAK;AAAA,MAC9C,EAAE,eAAe;AAAA,MACjB,kBAAkB;AAAA,MAClB;AAAA,IACD;AAAA,IAEA,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,MAAM;AAAA,MAC/C,EAAE,eAAe;AAAA,MACjB,UAAU;AAAA,MACV;AAAA,IACD;AAAA,IAEA,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,KAAK;AAAA,MAC5D,EAAE,eAAe;AAAA,MACjB,eAAe;AAAA,MACf;AAAA,IACD;AAAA,IAEA,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,KAAK;AAAA,MAC9C,EAAE,eAAe;AAAA,MACjB,aAAa;AAAA,MACb;AAAA,IACD;AAAA,IAEA,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,KAAK;AAAA,MAC9C,EAAE,eAAe;AAAA,MACjB,mBAAmB,SAAS,EAAE,OAAO;AAAA,MACrC;AAAA,IACD;AAAA,IAGA,IACE,EAAE,QAAQ,YAAY,CAAC,gBACvB,EAAE,QAAQ,OACV,CAAC,cACA,iBAAiB,cAAc,iBAAiB,QACjD;AAAA,MACD,EAAE,eAAe;AAAA,MAEjB,IAAI,iBAAiB,YAAY;AAAA,QAChC,wBAAwB,IAAI;AAAA,MAC7B,EAAO,SAAI,iBAAiB,OAAO;AAAA,QAClC,UAAU;AAAA,QACV,UAAU;AAAA,MACX;AAAA,MACA,SAAS,OAAO;AAAA,MAChB,kBAAkB;AAAA,MAClB;AAAA,IACD;AAAA,IAEA,IAAI,iBAAiB,cAAc,CAAC,WAAW;AAAA,MAC9C,IAAI,EAAE,QAAQ,OAAO,WAAW,SAAS,GAAG;AAAA,QAC3C,EAAE,eAAe;AAAA,QACjB,MAAM,YAAY,KAAK,IAAI,eAAe,GAAG,WAAW,SAAS,CAAC;AAAA,QAClE,gBAAgB,SAAS;AAAA,QACzB;AAAA,MACD;AAAA,MAEA,IAAI,EAAE,QAAQ,OAAO,WAAW,SAAS,GAAG;AAAA,QAC3C,EAAE,eAAe;AAAA,QACjB,MAAM,YAAY,KAAK,IAAI,eAAe,GAAG,CAAC;AAAA,QAC9C,gBAAgB,SAAS;AAAA,QACzB;AAAA,MACD;AAAA,MAEA,IAAI,EAAE,QAAQ,WAAW,WAAW,eAAe;AAAA,QAClD,EAAE,eAAe;AAAA,QACjB,gBAAgB,WAAW,aAAa;AAAA,QACxC,SAAS,OAAO;AAAA,QAChB;AAAA,MACD;AAAA,IACD;AAAA,IAEA,IAAI,iBAAiB,SAAS,CAAC,WAAW;AAAA,MACzC,IAAI,EAAE,QAAQ,OAAO,SAAS,SAAS,GAAG;AAAA,QACzC,EAAE,eAAe;AAAA,QACjB,MAAM,YAAY,KAAK,IAAI,eAAe,GAAG,SAAS,SAAS,CAAC;AAAA,QAChE,gBAAgB,SAAS;AAAA,QACzB;AAAA,MACD;AAAA,MAEA,IAAI,EAAE,QAAQ,OAAO,SAAS,SAAS,GAAG;AAAA,QACzC,EAAE,eAAe;AAAA,QACjB,MAAM,YAAY,KAAK,IAAI,eAAe,GAAG,CAAC;AAAA,QAC9C,gBAAgB,SAAS;AAAA,QACzB;AAAA,MACD;AAAA,MAEA,IAAI,EAAE,QAAQ,OAAO,SAAS,eAAe;AAAA,QAC5C,EAAE,eAAe;AAAA,QACjB,MAAM,OAAO,SAAS;AAAA,QACtB,IAAI,KAAK,QAAQ;AAAA,UAChB,gBAAgB,KAAK,IAAI;AAAA,QAC1B,EAAO;AAAA,UACN,cAAc,KAAK,IAAI;AAAA;AAAA,QAExB;AAAA,MACD;AAAA,MAEA,IAAI,EAAE,QAAQ,KAAK;AAAA,QAClB,EAAE,eAAe;AAAA,QACjB,aAAa;AAAA,QACb;AAAA,MACD;AAAA,MAEA,IAAI,EAAE,QAAQ,KAAK;AAAA,QAClB,EAAE,eAAe;AAAA,QACjB,eAAe;AAAA,QACf;AAAA,MACD;AAAA,MAEA,IAAI,EAAE,QAAQ,OAAO,SAAS,eAAe;AAAA,QAC5C,EAAE,eAAe;AAAA,QACjB,MAAM,OAAO,SAAS;AAAA,QAEtB,MAAM,aACL,CAAC,KAAK,UACN,KAAK,WAAW,eAChB,KAAK,WAAW;AAAA,QACjB,IAAI,YAAY;AAAA,UACf,gBAAgB,KAAK,IAAI;AAAA,QAC1B;AAAA,QACA;AAAA,MACD;AAAA,MAGA,IAAK,EAAE,YAAY,EAAE,QAAQ,OAAQ,EAAE,QAAQ,aAAa;AAAA,QAC3D,EAAE,eAAe;AAAA,QACjB,MAAM,OAAO,SAAS;AAAA,QACtB,IAAI,QAAQ,CAAC,KAAK,UAAU,KAAK,WAAW,aAAa;AAAA,UACxD,eAAe,KAAK,IAAI;AAAA,QACzB;AAAA,QACA;AAAA,MACD;AAAA,MAEA,IAAI,EAAE,QAAQ,KAAK;AAAA,QAClB,EAAE,eAAe;AAAA,QACjB,oBAAoB;AAAA,QACpB;AAAA,MACD;AAAA,MAEA,IAAI,EAAE,QAAQ,WAAW,SAAS,eAAe;AAAA,QAChD,EAAE,eAAe;AAAA,QACjB,MAAM,OAAO,SAAS;AAAA,QACtB,aAAa,KAAK,MAAM,KAAK,MAAM;AAAA,QACnC;AAAA,MACD;AAAA,IACD;AAAA,KAED;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CACD;AAAA,EAEA,YAAU,MAAM;AAAA,IACf,OAAO,iBAAiB,WAAW,aAAa;AAAA,IAChD,OAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,KAC9D,CAAC,aAAa,CAAC;AAAA,EAElB,OAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAAA;;AC7TD;AAAA,cACC;AAAA,iBACA;AAAA,eACA;AAAA;AAaD,IAAM,mBAAkB,CAAC,aAAa,cAAc,aAAa,YAAY;AAE7E,SAAS,WAAU,GAAW;AAAA,EAC7B,OAAO,OAAO,KAAK,IAAI,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC;AAAA;AAGlE,eAAe,aAAY,CAAC,MAA6B;AAAA,EACxD,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,IACvC,MAAM,SAAS,IAAI;AAAA,IACnB,OAAO,SAAS,MAAM;AAAA,MACrB,MAAM,SAAS,OAAO;AAAA,MACtB,MAAM,SAAS,OAAO,MAAM,GAAG,EAAE;AAAA,MACjC,QAAQ,MAAM;AAAA;AAAA,IAEf,OAAO,UAAU;AAAA,IACjB,OAAO,cAAc,IAAI;AAAA,GACzB;AAAA;AAGF,eAAe,cAAa,CAAC,MAA6B;AAAA,EACzD,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAAA,IACvC,MAAM,SAAS,IAAI;AAAA,IACnB,OAAO,SAAS,MAAM,QAAQ,OAAO,MAAgB;AAAA,IACrD,OAAO,UAAU;AAAA,IACjB,OAAO,cAAc,IAAI;AAAA,GACzB;AAAA;AASK,SAAS,cAAc,CAAC,UAAiC,CAAC,GAAG;AAAA,EACnE,QAAQ,YAAY,GAAG,YAAY,GAAG,WAAW,SAAS;AAAA,EAE1D,OAAO,QAAQ,aAAa,WAA4B,CAAC,CAAC;AAAA,EAC1D,OAAO,YAAY,iBAAiB,WAAS,KAAK;AAAA,EAClD,OAAO,OAAO,YAAY,WAAwB,IAAI;AAAA,EAEtD,MAAM,eAAe,YAAY,OAAO;AAAA,EAExC,MAAM,eAAe,cACpB,CAAC,SAA8B;AAAA,IAC9B,IAAI,CAAC,iBAAgB,SAAS,KAAK,IAAI,GAAG;AAAA,MACzC,OAAO,0BAA0B,KAAK;AAAA,IACvC;AAAA,IACA,IAAI,KAAK,OAAO,cAAc;AAAA,MAC7B,OAAO,oBAAoB,KAAK,OAAO,OAAO,MAAM,QAAQ,CAAC,aAAa;AAAA,IAC3E;AAAA,IACA,OAAO;AAAA,KAER,CAAC,cAAc,SAAS,CACzB;AAAA,EAEA,MAAM,YAAY,cACjB,OAAO,UAA6B;AAAA,IACnC,SAAS,IAAI;AAAA,IACb,MAAM,YAAY,MAAM,KAAK,KAAK;AAAA,IAClC,MAAM,YAAY,YAAY,OAAO;AAAA,IAErC,IAAI,aAAa,GAAG;AAAA,MACnB,SAAS,WAAW,0BAA0B;AAAA,MAC9C;AAAA,IACD;AAAA,IAEA,MAAM,aAAa,UAAU,MAAM,GAAG,SAAS;AAAA,IAC/C,MAAM,YAA+B,CAAC;AAAA,IAEtC,WAAW,QAAQ,YAAY;AAAA,MAC9B,MAAM,kBAAkB,aAAa,IAAI;AAAA,MACzC,IAAI,iBAAiB;AAAA,QACpB,SAAS,eAAe;AAAA,QACxB;AAAA,MACD;AAAA,MAEA,IAAI;AAAA,QACH,OAAO,SAAS,QAAQ,MAAM,QAAQ,IAAI;AAAA,UACzC,eAAc,IAAI;AAAA,UAClB,cAAa,IAAI;AAAA,QAClB,CAAC;AAAA,QAED,UAAU,KAAK;AAAA,UACd,IAAI,YAAW;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW,KAAK;AAAA,QACjB,CAAC;AAAA,QACA,MAAM;AAAA,QACP,SAAS,yBAAyB;AAAA;AAAA,IAEpC;AAAA,IAEA,IAAI,UAAU,SAAS,GAAG;AAAA,MACzB,UAAU,CAAC,SAAS,CAAC,GAAG,MAAM,GAAG,SAAS,CAAC;AAAA,IAC5C;AAAA,KAED,CAAC,OAAO,QAAQ,WAAW,YAAY,CACxC;AAAA,EAEA,MAAM,cAAc,cAAY,CAAC,OAAe;AAAA,IAC/C,UAAU,CAAC,SAAS,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,EAAE,CAAC;AAAA,IACvD,SAAS,IAAI;AAAA,KACX,CAAC,CAAC;AAAA,EAEL,MAAM,cAAc,cAAY,MAAM;AAAA,IACrC,UAAU,CAAC,CAAC;AAAA,IACZ,SAAS,IAAI;AAAA,KACX,CAAC,CAAC;AAAA,EAEL,MAAM,kBAAkB,cAAY,CAAC,MAAiB;AAAA,IACrD,EAAE,eAAe;AAAA,IACjB,EAAE,gBAAgB;AAAA,IAClB,IAAI,EAAE,aAAa,MAAM,SAAS,OAAO,GAAG;AAAA,MAC3C,cAAc,IAAI;AAAA,IACnB;AAAA,KACE,CAAC,CAAC;AAAA,EAEL,MAAM,kBAAkB,cAAY,CAAC,MAAiB;AAAA,IACrD,EAAE,eAAe;AAAA,IACjB,EAAE,gBAAgB;AAAA,IAClB,MAAM,OAAQ,EAAE,cAA8B,sBAAsB;AAAA,IACpE,MAAM,IAAI,EAAE;AAAA,IACZ,MAAM,IAAI,EAAE;AAAA,IACZ,IAAI,IAAI,KAAK,QAAQ,IAAI,KAAK,SAAS,IAAI,KAAK,OAAO,IAAI,KAAK,QAAQ;AAAA,MACvE,cAAc,KAAK;AAAA,IACpB;AAAA,KACE,CAAC,CAAC;AAAA,EAEL,MAAM,iBAAiB,cAAY,CAAC,MAAiB;AAAA,IACpD,EAAE,eAAe;AAAA,IACjB,EAAE,gBAAgB;AAAA,KAChB,CAAC,CAAC;AAAA,EAEL,MAAM,aAAa,cAClB,CAAC,MAAiB;AAAA,IACjB,EAAE,eAAe;AAAA,IACjB,EAAE,gBAAgB;AAAA,IAClB,cAAc,KAAK;AAAA,IAEnB,MAAM,QAAQ,EAAE,aAAa;AAAA,IAC7B,IAAI,MAAM,SAAS,GAAG;AAAA,MACrB,MAAM,aAAa,MAAM,KAAK,KAAK,EAAE,OAAO,CAAC,MAC5C,EAAE,KAAK,WAAW,QAAQ,CAC3B;AAAA,MACA,IAAI,WAAW,SAAS,GAAG;AAAA,QAC1B,UAAU,UAAU;AAAA,MACrB;AAAA,IACD;AAAA,KAED,CAAC,SAAS,CACX;AAAA,EAEA,MAAM,cAAc,cACnB,CAAC,MAAsB;AAAA,IACtB,MAAM,QAAQ,EAAE,eAAe;AAAA,IAC/B,IAAI,CAAC;AAAA,MAAO;AAAA,IAEZ,MAAM,aAAqB,CAAC;AAAA,IAC5B,WAAW,QAAQ,MAAM,KAAK,KAAK,GAAG;AAAA,MACrC,IAAI,KAAK,KAAK,WAAW,QAAQ,GAAG;AAAA,QACnC,MAAM,OAAO,KAAK,UAAU;AAAA,QAC5B,IAAI,MAAM;AAAA,UACT,WAAW,KAAK,IAAI;AAAA,QACrB;AAAA,MACD;AAAA,IACD;AAAA,IAEA,IAAI,WAAW,SAAS,GAAG;AAAA,MAC1B,EAAE,eAAe;AAAA,MACjB,UAAU,UAAU;AAAA,IACrB;AAAA,KAED,CAAC,SAAS,CACX;AAAA,EAEA,YAAU,MAAM;AAAA,IACf,IAAI,CAAC;AAAA,MAAU;AAAA,IAEf,IAAI,cAAc;AAAA,IAElB,MAAM,cAAc,CAAC,MAA4B;AAAA,MAChD,EAAE,eAAe;AAAA,MACjB,IAAI,EAAE,cAAc,MAAM,SAAS,OAAO,GAAG;AAAA,QAC5C;AAAA,QACA,IAAI,gBAAgB,GAAG;AAAA,UACtB,cAAc,IAAI;AAAA,QACnB;AAAA,MACD;AAAA;AAAA,IAGD,MAAM,cAAc,CAAC,MAA4B;AAAA,MAChD,EAAE,eAAe;AAAA,MACjB;AAAA,MACA,IAAI,gBAAgB,GAAG;AAAA,QACtB,cAAc,KAAK;AAAA,MACpB;AAAA;AAAA,IAGD,MAAM,aAAa,CAAC,MAA4B;AAAA,MAC/C,EAAE,eAAe;AAAA;AAAA,IAGlB,MAAM,SAAS,CAAC,MAA4B;AAAA,MAC3C,EAAE,eAAe;AAAA,MACjB,cAAc;AAAA,MACd,cAAc,KAAK;AAAA,MAEnB,MAAM,QAAQ,EAAE,cAAc;AAAA,MAC9B,IAAI,SAAS,MAAM,SAAS,GAAG;AAAA,QAC9B,MAAM,aAAa,MAAM,KAAK,KAAK,EAAE,OAAO,CAAC,MAC5C,EAAE,KAAK,WAAW,QAAQ,CAC3B;AAAA,QACA,IAAI,WAAW,SAAS,GAAG;AAAA,UAC1B,UAAU,UAAU;AAAA,QACrB;AAAA,MACD;AAAA;AAAA,IAGD,SAAS,iBAAiB,aAAa,WAAW;AAAA,IAClD,SAAS,iBAAiB,aAAa,WAAW;AAAA,IAClD,SAAS,iBAAiB,YAAY,UAAU;AAAA,IAChD,SAAS,iBAAiB,QAAQ,MAAM;AAAA,IAExC,OAAO,MAAM;AAAA,MACZ,SAAS,oBAAoB,aAAa,WAAW;AAAA,MACrD,SAAS,oBAAoB,aAAa,WAAW;AAAA,MACrD,SAAS,oBAAoB,YAAY,UAAU;AAAA,MACnD,SAAS,oBAAoB,QAAQ,MAAM;AAAA;AAAA,KAE1C,CAAC,UAAU,SAAS,CAAC;AAAA,EAExB,OAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAAA;;ACtQD,sBAAS,uBAAW;AAOb,SAAS,eAAe,CAAC,WAA+B;AAAA,EAC9D,MAAM,YAAY,SAAyB,IAAI;AAAA,EAC/C,MAAM,oBAAoB,SAAsB,IAAI;AAAA,EACpD,MAAM,aAAa,aAAa,CAAC,MAAM,EAAE,UAAU;AAAA,EACnD,MAAM,oBAAoB,aAAa,CAAC,MAAM,EAAE,iBAAiB;AAAA,EACjE,MAAM,cAAc,cAAc,CAAC,MAAM,EAAE,WAAW;AAAA,EACtD,MAAM,cAAc,cAAc,CAAC,MAAM,EAAE,WAAW;AAAA,EACtD,MAAM,kBAAkB,sBAAsB,CAAC,MAAM,EAAE,eAAe;AAAA,EACtE,MAAM,oBAAoB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB;AAAA,EAE1E,YAAU,MAAM;AAAA,IACf,IAAI,CAAC;AAAA,MAAW;AAAA,IAEhB,MAAM,UAAS,IAAI;AAAA,IACnB,UAAU,UAAU;AAAA,IAEpB,MAAM,MAAM,UAAU,aAAa,SAAS;AAAA,IAC5C,QAAO,QAAQ,GAAG;AAAA,IAElB,MAAM,cAAc,QAAO,GAAG,KAAK,CAAC,UAAU;AAAA,MAC7C,MAAM,UAAU,MAAM;AAAA,MAEtB,QAAQ,MAAM;AAAA,aACR,uBAAuB;AAAA,UAC3B,MAAM,YACL,OAAO,SAAS,cAAc,WAAW,QAAQ,YAAY;AAAA,UAC9D,MAAM,iBACL,OAAO,SAAS,mBAAmB,WAChC,QAAQ,iBACR;AAAA,UACJ,MAAM,cACL,OAAO,SAAS,gBAAgB,WAAW,QAAQ,cAAc;AAAA,UAClE,MAAM,oBACL,OAAO,SAAS,sBAAsB,WACnC,QAAQ,oBACR;AAAA,UACJ,MAAM,YACL,OAAO,SAAS,cAAc,WAAW,QAAQ,YAAY;AAAA,UAE9D,gBAAgB;AAAA,YACf;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACD,CAAC;AAAA,UACD;AAAA,QACD;AAAA,aAEK,8BAA8B;AAAA,UAClC,MAAM,SAAS,SAAS;AAAA,UACxB,IAAI,WAAW,UAAU;AAAA,YACxB,kBAAkB,IAAI;AAAA,YACtB,kBAAkB,UAAU,MAAM,QACjC,2CACD;AAAA,UACD;AAAA,UACA;AAAA,QACD;AAAA,aAEK,wBAAwB;AAAA,UAC5B,kBAAkB;AAAA,UAClB,MAAM,SACL,OAAO,SAAS,WAAW,WACxB,QAAQ,SACR;AAAA,UACJ,MAAM,MAAK,QAAQ;AAAA,UACnB;AAAA,QACD;AAAA,aAEK,yBAAyB;AAAA,UAC7B,MAAM,YACL,OAAO,SAAS,cAAc,WAAW,QAAQ,YAAY;AAAA,UAC9D,kBAAkB,IAAI;AAAA,UACtB,IAAI,CAAC,kBAAkB,SAAS;AAAA,YAC/B,kBAAkB,UAAU,MAAM,QACjC,mCAAwB,UAAU,QAAQ,CAAC,GAC5C;AAAA,UACD;AAAA,UACA;AAAA,QACD;AAAA,aAEK,wBAAwB;AAAA,UAC5B,IAAI,kBAAkB,SAAS;AAAA,YAC9B,YAAY,kBAAkB,SAAS;AAAA,cACtC,SAAS;AAAA,YACV,CAAC;AAAA,UACF,EAAO;AAAA,YACN,kBAAkB,UAAU,MAAM,QACjC,2BACD;AAAA;AAAA,UAED;AAAA,QACD;AAAA,aAEK,yBAAyB;AAAA,UAC7B,kBAAkB;AAAA,UAClB,MAAM,YAAY,SAAS;AAAA,UAC3B,MAAM,aAAa,SAAS;AAAA,UAC5B,MAAM,gBACL,OAAO,SAAS,kBAAkB,WAC/B,QAAQ,gBACR;AAAA,UACJ,MAAM,YACL,OAAO,cAAc,WAClB,YACA,OAAO,cAAc,WACpB,WAAW,SAAS,IACpB;AAAA,UACL,MAAM,aACL,OAAO,eAAe,WACnB,aACA,OAAO,eAAe,WACrB,WAAW,UAAU,IACrB;AAAA,UACL,WAAW,UAAU;AAAA,UACrB,kBAAkB,KAAK;AAAA,UACvB,IAAI,kBAAkB,SAAS;AAAA,YAC9B,YAAY,kBAAkB,OAAO;AAAA,YACrC,kBAAkB,UAAU;AAAA,UAC7B;AAAA,UACA,MAAM,UAAU,WAAU,UAAU,QAAQ,CAAC;AAAA,UAC7C,IAAI,eAAe;AAAA,YAClB,MAAM,kBAAkB,SAAS;AAAA,cAChC,OAAO;AAAA,cACP,MAAM,4BAA4B;AAAA,YACnC,CAAC;AAAA,UACF,EAAO;AAAA,YACN,MAAM,QAAQ,OAAO;AAAA;AAAA,UAEtB;AAAA,QACD;AAAA,aAEK,8BAA8B;AAAA,UAClC,kBAAkB;AAAA,UAClB,kBAAkB,KAAK;AAAA,UACvB,IAAI,kBAAkB,SAAS;AAAA,YAC9B,YAAY,kBAAkB,OAAO;AAAA,YACrC,kBAAkB,UAAU;AAAA,UAC7B;AAAA,UAGA,MAAM,QAAQ,wDAA6C;AAAA,UAC3D;AAAA,QACD;AAAA,aAEK,wBAAwB;AAAA,UAC5B,MAAM,aAAa,SAAS;AAAA,UAC5B,MAAM,aACL,OAAO,eAAe,WACnB,aACA,OAAO,eAAe,WACrB,WAAW,UAAU,IACrB;AAAA,UACL,IAAI,eAAe,QAAQ,CAAC,OAAO,MAAM,UAAU,GAAG;AAAA,YACrD,WAAW,UAAU;AAAA,UACtB;AAAA,UACA;AAAA,QACD;AAAA,aAEK,sBAAsB;AAAA,UAC1B,kBAAkB;AAAA,UAClB,MAAM,QACL,OAAO,SAAS,UAAU,WACvB,QAAQ,QACR;AAAA,UACJ,kBAAkB,KAAK;AAAA,UACvB,IAAI,kBAAkB,SAAS;AAAA,YAC9B,YAAY,kBAAkB,OAAO;AAAA,YACrC,kBAAkB,UAAU;AAAA,UAC7B;AAAA,UACA,MAAM,MAAM,KAAI,OAAO;AAAA,UACvB;AAAA,QACD;AAAA;AAAA,UAGC;AAAA;AAAA,KAEF;AAAA,IAED,OAAO,MAAM;AAAA,MACZ,YAAY;AAAA,MACZ,QAAO,WAAW;AAAA;AAAA,KAEjB;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAC;AAAA;",
183
+ "debugId": "3725EF3C0537634264756E2164756E21",
184
+ "names": []
185
+ }