@theruansilva/omp-web 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +181 -0
  3. package/dist/cli/doctor.js +118 -0
  4. package/dist/cli/doctor.js.map +1 -0
  5. package/dist/cli/serviceTemplates.js +55 -0
  6. package/dist/cli/serviceTemplates.js.map +1 -0
  7. package/dist/cli/types.js +2 -0
  8. package/dist/cli/types.js.map +1 -0
  9. package/dist/cli.js +872 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/client/assets/CodeViewer-CJNBz-Ox.js +4 -0
  12. package/dist/client/assets/TerminalPanel-B9-LUv7E.js +126 -0
  13. package/dist/client/assets/UnifiedDiffViewer-BUqme4se.js +34 -0
  14. package/dist/client/assets/index-DGBYb2j9.css +1 -0
  15. package/dist/client/assets/index-uWm_YNRB.js +4427 -0
  16. package/dist/client/assets/vendor-editor-core-D9EJm1dE.js +10 -0
  17. package/dist/client/assets/vendor-editor-languages-N6dcxgRO.js +26 -0
  18. package/dist/client/assets/vendor-terminal-DDGTF8rc.css +1 -0
  19. package/dist/client/assets/vendor-terminal-DjQ08hXu.js +16 -0
  20. package/dist/client/favicon-16x16.png +0 -0
  21. package/dist/client/favicon-180x180.png +0 -0
  22. package/dist/client/favicon-192x192.png +0 -0
  23. package/dist/client/favicon-32x32.png +0 -0
  24. package/dist/client/favicon-512x512.png +0 -0
  25. package/dist/client/favicon.ico +0 -0
  26. package/dist/client/favicon.png +0 -0
  27. package/dist/client/favicon.svg +11 -0
  28. package/dist/client/index.html +68 -0
  29. package/dist/client/manifest.webmanifest +36 -0
  30. package/dist/client-react/assets/index-BQ6zLLfz.js +51 -0
  31. package/dist/client-react/assets/index-Befs78HG.css +1 -0
  32. package/dist/client-react/index.html +16 -0
  33. package/dist/config.js +272 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/docker/ompWebDockerCommandPlan.js +211 -0
  36. package/dist/docker/ompWebDockerCommandPlan.js.map +1 -0
  37. package/dist/docker/piWebDockerCommandPlan.js +211 -0
  38. package/dist/docker/piWebDockerCommandPlan.js.map +1 -0
  39. package/dist/omp-web-plugins/info/omp-web-plugin.js +51 -0
  40. package/dist/omp-web-plugins/info/package.json +9 -0
  41. package/dist/omp-web-plugins/schedule-prompts/omp-web-plugin.js +43 -0
  42. package/dist/omp-web-plugins/schedule-prompts/package.json +9 -0
  43. package/dist/omp-web-plugins/schedule-prompts/schedulePromptsPanelElement.js +242 -0
  44. package/dist/omp-web-plugins/schedule-prompts/types.js +2 -0
  45. package/dist/omp-web-plugins/updates/omp-web-plugin.js +173 -0
  46. package/dist/omp-web-plugins/updates/package.json +9 -0
  47. package/dist/omp-web-plugins/updates/updatesLogic.js +97 -0
  48. package/dist/ompWebVersionReport.js +217 -0
  49. package/dist/ompWebVersionReport.js.map +1 -0
  50. package/dist/pi-web-plugins/info/package.json +9 -0
  51. package/dist/pi-web-plugins/info/pi-web-plugin.js +51 -0
  52. package/dist/pi-web-plugins/schedule-prompts/package.json +9 -0
  53. package/dist/pi-web-plugins/schedule-prompts/pi-web-plugin.js +43 -0
  54. package/dist/pi-web-plugins/schedule-prompts/schedulePromptsPanelElement.js +226 -0
  55. package/dist/pi-web-plugins/schedule-prompts/types.js +2 -0
  56. package/dist/pi-web-plugins/updates/package.json +9 -0
  57. package/dist/pi-web-plugins/updates/pi-web-plugin.js +173 -0
  58. package/dist/pi-web-plugins/updates/updatesLogic.js +97 -0
  59. package/dist/piWebVersionReport.js +225 -0
  60. package/dist/piWebVersionReport.js.map +1 -0
  61. package/dist/plugin-api/unstable.d.ts +22 -0
  62. package/dist/plugin-api.d.ts +197 -0
  63. package/dist/server/activity/workspaceActivityRoutes.js +4 -0
  64. package/dist/server/activity/workspaceActivityRoutes.js.map +1 -0
  65. package/dist/server/activity/workspaceActivityService.js +98 -0
  66. package/dist/server/activity/workspaceActivityService.js.map +1 -0
  67. package/dist/server/app.js +217 -0
  68. package/dist/server/app.js.map +1 -0
  69. package/dist/server/configRoutes.js +278 -0
  70. package/dist/server/configRoutes.js.map +1 -0
  71. package/dist/server/diagnostics/nodePtySpawnHelper.js +130 -0
  72. package/dist/server/diagnostics/nodePtySpawnHelper.js.map +1 -0
  73. package/dist/server/git/gitEnv.js +15 -0
  74. package/dist/server/git/gitEnv.js.map +1 -0
  75. package/dist/server/git/gitService.js +119 -0
  76. package/dist/server/git/gitService.js.map +1 -0
  77. package/dist/server/gitRoutes.js +29 -0
  78. package/dist/server/gitRoutes.js.map +1 -0
  79. package/dist/server/index.js +16 -0
  80. package/dist/server/index.js.map +1 -0
  81. package/dist/server/machines/machineClient.js +162 -0
  82. package/dist/server/machines/machineClient.js.map +1 -0
  83. package/dist/server/machines/machinePluginProxyRoutes.js +151 -0
  84. package/dist/server/machines/machinePluginProxyRoutes.js.map +1 -0
  85. package/dist/server/machines/machineProxyRoutes.js +152 -0
  86. package/dist/server/machines/machineProxyRoutes.js.map +1 -0
  87. package/dist/server/machines/machineRoutes.js +61 -0
  88. package/dist/server/machines/machineRoutes.js.map +1 -0
  89. package/dist/server/machines/machineService.js +230 -0
  90. package/dist/server/machines/machineService.js.map +1 -0
  91. package/dist/server/machines/machineStore.js +123 -0
  92. package/dist/server/machines/machineStore.js.map +1 -0
  93. package/dist/server/machines/proxyUtils.js +39 -0
  94. package/dist/server/machines/proxyUtils.js.map +1 -0
  95. package/dist/server/ompWebPluginService.js +298 -0
  96. package/dist/server/ompWebPluginService.js.map +1 -0
  97. package/dist/server/ompWebStatus.js +604 -0
  98. package/dist/server/ompWebStatus.js.map +1 -0
  99. package/dist/server/ompWebStatusCache.js +31 -0
  100. package/dist/server/ompWebStatusCache.js.map +1 -0
  101. package/dist/server/piPackageRoutes.js +85 -0
  102. package/dist/server/piPackageRoutes.js.map +1 -0
  103. package/dist/server/piPackageService.js +65 -0
  104. package/dist/server/piPackageService.js.map +1 -0
  105. package/dist/server/piWebPluginService.js +283 -0
  106. package/dist/server/piWebPluginService.js.map +1 -0
  107. package/dist/server/piWebStatus.js +602 -0
  108. package/dist/server/piWebStatus.js.map +1 -0
  109. package/dist/server/piWebStatusCache.js +32 -0
  110. package/dist/server/piWebStatusCache.js.map +1 -0
  111. package/dist/server/projects/directorySuggestions.js +37 -0
  112. package/dist/server/projects/directorySuggestions.js.map +1 -0
  113. package/dist/server/projects/projectService.js +31 -0
  114. package/dist/server/projects/projectService.js.map +1 -0
  115. package/dist/server/push/PushNotificationService.js +137 -0
  116. package/dist/server/push/PushNotificationService.js.map +1 -0
  117. package/dist/server/push/pushRoutes.js +50 -0
  118. package/dist/server/push/pushRoutes.js.map +1 -0
  119. package/dist/server/realtime/honoRealtimeSocket.js +32 -0
  120. package/dist/server/realtime/honoRealtimeSocket.js.map +1 -0
  121. package/dist/server/realtime/sessionEventHub.js +39 -0
  122. package/dist/server/realtime/sessionEventHub.js.map +1 -0
  123. package/dist/server/sessiond/sessionProxyRoutes.js +85 -0
  124. package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -0
  125. package/dist/server/sessiond.js +104 -0
  126. package/dist/server/sessiond.js.map +1 -0
  127. package/dist/server/sessions/attachmentService.js +112 -0
  128. package/dist/server/sessions/attachmentService.js.map +1 -0
  129. package/dist/server/sessions/authProviderOptions.js +52 -0
  130. package/dist/server/sessions/authProviderOptions.js.map +1 -0
  131. package/dist/server/sessions/authRoutes.js +75 -0
  132. package/dist/server/sessions/authRoutes.js.map +1 -0
  133. package/dist/server/sessions/authService.js +105 -0
  134. package/dist/server/sessions/authService.js.map +1 -0
  135. package/dist/server/sessions/builtinCommands.js +31 -0
  136. package/dist/server/sessions/builtinCommands.js.map +1 -0
  137. package/dist/server/sessions/editPreview.js +196 -0
  138. package/dist/server/sessions/editPreview.js.map +1 -0
  139. package/dist/server/sessions/editTool.js +46 -0
  140. package/dist/server/sessions/editTool.js.map +1 -0
  141. package/dist/server/sessions/messagePaging.js +41 -0
  142. package/dist/server/sessions/messagePaging.js.map +1 -0
  143. package/dist/server/sessions/oauthLoginFlowService.js +136 -0
  144. package/dist/server/sessions/oauthLoginFlowService.js.map +1 -0
  145. package/dist/server/sessions/piAgentSession.js +472 -0
  146. package/dist/server/sessions/piAgentSession.js.map +1 -0
  147. package/dist/server/sessions/piSessionManagerGateway.js +133 -0
  148. package/dist/server/sessions/piSessionManagerGateway.js.map +1 -0
  149. package/dist/server/sessions/piSessionService.js +1737 -0
  150. package/dist/server/sessions/piSessionService.js.map +1 -0
  151. package/dist/server/sessions/schedulePrompt/schedulePromptService.js +46 -0
  152. package/dist/server/sessions/schedulePrompt/schedulePromptService.js.map +1 -0
  153. package/dist/server/sessions/schedulePrompt/scheduler.js +317 -0
  154. package/dist/server/sessions/schedulePrompt/scheduler.js.map +1 -0
  155. package/dist/server/sessions/schedulePrompt/storage.js +118 -0
  156. package/dist/server/sessions/schedulePrompt/storage.js.map +1 -0
  157. package/dist/server/sessions/schedulePrompt/tool.js +251 -0
  158. package/dist/server/sessions/schedulePrompt/tool.js.map +1 -0
  159. package/dist/server/sessions/schedulePrompt/types.js +2 -0
  160. package/dist/server/sessions/schedulePrompt/types.js.map +1 -0
  161. package/dist/server/sessions/sessionArchiveHelpers.js +186 -0
  162. package/dist/server/sessions/sessionArchiveHelpers.js.map +1 -0
  163. package/dist/server/sessions/sessionArchiveStore.js +254 -0
  164. package/dist/server/sessions/sessionArchiveStore.js.map +1 -0
  165. package/dist/server/sessions/sessionArchiveTree.js +35 -0
  166. package/dist/server/sessions/sessionArchiveTree.js.map +1 -0
  167. package/dist/server/sessions/sessionCleanup.js +157 -0
  168. package/dist/server/sessions/sessionCleanup.js.map +1 -0
  169. package/dist/server/sessions/sessionCommandService.js +349 -0
  170. package/dist/server/sessions/sessionCommandService.js.map +1 -0
  171. package/dist/server/sessions/sessionEventMapper.js +115 -0
  172. package/dist/server/sessions/sessionEventMapper.js.map +1 -0
  173. package/dist/server/sessions/sessionNameGenerator.js +61 -0
  174. package/dist/server/sessions/sessionNameGenerator.js.map +1 -0
  175. package/dist/server/sessions/sessionRoutes.js +419 -0
  176. package/dist/server/sessions/sessionRoutes.js.map +1 -0
  177. package/dist/server/sessions/sessionRuntimeStore.js +2 -0
  178. package/dist/server/sessions/sessionRuntimeStore.js.map +1 -0
  179. package/dist/server/sessions/spawnSessionTool.js +41 -0
  180. package/dist/server/sessions/spawnSessionTool.js.map +1 -0
  181. package/dist/server/sessions/spawnSubsessionTool.js +203 -0
  182. package/dist/server/sessions/spawnSubsessionTool.js.map +1 -0
  183. package/dist/server/sessions/spawnTargetResolver.js +36 -0
  184. package/dist/server/sessions/spawnTargetResolver.js.map +1 -0
  185. package/dist/server/sessions/subsessionLinks.js +171 -0
  186. package/dist/server/sessions/subsessionLinks.js.map +1 -0
  187. package/dist/server/sessions/subsessionTranscript.js +233 -0
  188. package/dist/server/sessions/subsessionTranscript.js.map +1 -0
  189. package/dist/server/storage/projectStore.js +83 -0
  190. package/dist/server/storage/projectStore.js.map +1 -0
  191. package/dist/server/terminalProxyRoutes.js +168 -0
  192. package/dist/server/terminalProxyRoutes.js.map +1 -0
  193. package/dist/server/terminals/terminalRoutes.js +177 -0
  194. package/dist/server/terminals/terminalRoutes.js.map +1 -0
  195. package/dist/server/terminals/terminalService.js +309 -0
  196. package/dist/server/terminals/terminalService.js.map +1 -0
  197. package/dist/server/terminals/terminalSize.js +17 -0
  198. package/dist/server/terminals/terminalSize.js.map +1 -0
  199. package/dist/server/testUtils.js +43 -0
  200. package/dist/server/testUtils.js.map +1 -0
  201. package/dist/server/types.js +2 -0
  202. package/dist/server/types.js.map +1 -0
  203. package/dist/server/utils.js +2 -0
  204. package/dist/server/utils.js.map +1 -0
  205. package/dist/server/webSocketBridge.js +55 -0
  206. package/dist/server/webSocketBridge.js.map +1 -0
  207. package/dist/server/workingDirectory.js +44 -0
  208. package/dist/server/workingDirectory.js.map +1 -0
  209. package/dist/server/workspaceExplorerRoutes.js +148 -0
  210. package/dist/server/workspaceExplorerRoutes.js.map +1 -0
  211. package/dist/server/workspaces/effectivePathAccess.js +27 -0
  212. package/dist/server/workspaces/effectivePathAccess.js.map +1 -0
  213. package/dist/server/workspaces/fileContentService.js +200 -0
  214. package/dist/server/workspaces/fileContentService.js.map +1 -0
  215. package/dist/server/workspaces/fileSuggestions.js +512 -0
  216. package/dist/server/workspaces/fileSuggestions.js.map +1 -0
  217. package/dist/server/workspaces/fileTreeService.js +27 -0
  218. package/dist/server/workspaces/fileTreeService.js.map +1 -0
  219. package/dist/server/workspaces/gitWorktreeDiscovery.js +34 -0
  220. package/dist/server/workspaces/gitWorktreeDiscovery.js.map +1 -0
  221. package/dist/server/workspaces/imagePreviewService.js +40 -0
  222. package/dist/server/workspaces/imagePreviewService.js.map +1 -0
  223. package/dist/server/workspaces/pathAccessPolicy.js +87 -0
  224. package/dist/server/workspaces/pathAccessPolicy.js.map +1 -0
  225. package/dist/server/workspaces/pathSafety.js +54 -0
  226. package/dist/server/workspaces/pathSafety.js.map +1 -0
  227. package/dist/server/workspaces/projectOmpWebConfig.js +56 -0
  228. package/dist/server/workspaces/projectOmpWebConfig.js.map +1 -0
  229. package/dist/server/workspaces/projectPiWebConfig.js +61 -0
  230. package/dist/server/workspaces/projectPiWebConfig.js.map +1 -0
  231. package/dist/server/workspaces/workspaceContext.js +8 -0
  232. package/dist/server/workspaces/workspaceContext.js.map +1 -0
  233. package/dist/server/workspaces/workspaceDeletionRoutes.js +113 -0
  234. package/dist/server/workspaces/workspaceDeletionRoutes.js.map +1 -0
  235. package/dist/server/workspaces/workspaceService.js +39 -0
  236. package/dist/server/workspaces/workspaceService.js.map +1 -0
  237. package/dist/sessiond/config.js +9 -0
  238. package/dist/sessiond/config.js.map +1 -0
  239. package/dist/sessiond/sessionDaemonClient.js +34 -0
  240. package/dist/sessiond/sessionDaemonClient.js.map +1 -0
  241. package/dist/shared/activity.js +26 -0
  242. package/dist/shared/activity.js.map +1 -0
  243. package/dist/shared/apiTypes.d.ts +769 -0
  244. package/dist/shared/apiTypes.js +11 -0
  245. package/dist/shared/apiTypes.js.map +1 -0
  246. package/dist/shared/capabilities.js +52 -0
  247. package/dist/shared/capabilities.js.map +1 -0
  248. package/dist/shared/federatedRoutes.js +81 -0
  249. package/dist/shared/federatedRoutes.js.map +1 -0
  250. package/dist/shared/machinePluginIds.js +41 -0
  251. package/dist/shared/machinePluginIds.js.map +1 -0
  252. package/dist/shared/ompWebStatusParsing.js +100 -0
  253. package/dist/shared/ompWebStatusParsing.js.map +1 -0
  254. package/dist/shared/piWebStatusParsing.js +102 -0
  255. package/dist/shared/piWebStatusParsing.js.map +1 -0
  256. package/dist/shared/pluginIds.js +5 -0
  257. package/dist/shared/pluginIds.js.map +1 -0
  258. package/dist/shared/promptAttachments.js +90 -0
  259. package/dist/shared/promptAttachments.js.map +1 -0
  260. package/dist/shared/thinkingLevels.d.ts +19 -0
  261. package/dist/shared/thinkingLevels.js +24 -0
  262. package/dist/shared/thinkingLevels.js.map +1 -0
  263. package/dist/shared/utils.js +10 -0
  264. package/dist/shared/utils.js.map +1 -0
  265. package/dist/shared/workspaceDeletion.js +12 -0
  266. package/dist/shared/workspaceDeletion.js.map +1 -0
  267. package/dist/shared/workspaceFiles.js +3 -0
  268. package/dist/shared/workspaceFiles.js.map +1 -0
  269. package/docs/assets/favicon.svg +11 -0
  270. package/docs/assets/omp-web-banner.png +0 -0
  271. package/docs/assets/omp-web-desktop.png +0 -0
  272. package/docs/assets/omp-web-mobile.png +0 -0
  273. package/docs/assets/omp-web-tablet.png +0 -0
  274. package/docs/config.md +208 -0
  275. package/docs/plugins.md +916 -0
  276. package/extensions/omp-web.ts +133 -0
  277. package/install.sh +5 -0
  278. package/package.json +134 -0
  279. package/plugin-api/unstable.d.ts +1 -0
  280. package/plugin-api.d.ts +1 -0
@@ -0,0 +1 @@
1
+ :root,[data-color-scheme=default]{--bg-base: #0e0e0e;--bg-1: #1a1a1a;--bg-2: #262626;--bg-3: #333333;--bg-4: #404040;--bg-5: #4d4d4d;--bg-6: #5a5a5a;--bg-8: #737373;--bg-9: #a6a6a6;--bg-10: #d9d9d9;--bg-hover: #1f1f1f;--bg-active: #2d2d2d;--text-primary: #e5e5e5;--text-secondary: #a6a6a6;--text-disabled: #737373;--primary: #4d9fff;--primary-hover: #6aafff;--success: #23c343;--warning: #ff9a2e;--danger: #f76560;--info: #4d9fff;--border-base: #333333;--border-light: #262626;--brand: #a1aacb;--brand-light: #3d4150;--brand-hover: #6a749b;--message-user-bg: #1e2a3a;--message-tips-bg: #1a2333;--workspace-btn-bg: #1f1f1f;--fill: #1a1a1a;--inverse: #ffffff;--shadow-soft: 0 2px 12px rgba(0,0,0,.4);--shadow-card: 0 4px 20px rgba(0,0,0,.35);--radius-sm: 6px;--radius-md: 10px;--radius-lg: 14px;--sider-width: 260px;--titlebar-height: 42px}[data-theme=light]{--bg-base: #ffffff;--bg-1: #f9fafb;--bg-2: #f2f3f5;--bg-3: #e5e6eb;--bg-4: #c9cdd4;--bg-5: #adb4c1;--bg-6: #86909c;--bg-8: #4e5969;--bg-9: #1d2129;--bg-10: #0c0e12;--bg-hover: #f3f4f6;--bg-active: #e5e6eb;--text-primary: #1d2129;--text-secondary: #86909c;--text-disabled: #c9cdd4;--primary: #165dff;--primary-hover: #4080ff;--success: #00b42a;--warning: #ff7d00;--danger: #f53f3f;--info: #165dff;--border-base: #e5e6eb;--border-light: #f2f3f5;--brand: #7583b2;--brand-light: #eff0f6;--brand-hover: #b5bcd6;--message-user-bg: #e9efff;--message-tips-bg: #f0f4ff;--workspace-btn-bg: #eff0f1;--fill: #f7f8fa;--shadow-soft: 0 2px 12px rgba(0,0,0,.06);--shadow-card: 0 4px 20px rgba(0,0,0,.08)}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html,body,#root{height:100%;overflow:hidden}body{font-family:Inter,system-ui,-apple-system,sans-serif;background:var(--bg-base);color:var(--text-primary);-webkit-font-smoothing:antialiased}::-webkit-scrollbar{width:5px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:transparent;border-radius:3px}*:hover::-webkit-scrollbar-thumb{background:#80808033}[data-theme=dark] *:hover::-webkit-scrollbar-thumb{background:#ffffff26}.app-shell{display:grid;grid-template-columns:var(--sider-width) 1fr;height:100vh}.sider{display:flex;flex-direction:column;background:var(--bg-1);border-right:1px solid var(--border-base);height:100vh;overflow:hidden}.sider-header{flex:0 0 auto;display:flex;align-items:center;justify-content:space-between;height:var(--titlebar-height);padding:0 12px;border-bottom:1px solid var(--border-base)}.sider-brand{font-size:13px;font-weight:600;color:var(--text-primary);letter-spacing:.2px}.sider-actions{display:flex;gap:4px}.sider-scroll{flex:1 1 auto;overflow-y:auto;overflow-x:hidden;scrollbar-width:none;padding:4px 6px}.sider-scroll::-webkit-scrollbar{width:0}.sider-section{margin-bottom:4px}.sider-section-header{display:flex;align-items:center;justify-content:space-between;padding:8px 8px 4px;font-size:11px;font-weight:600;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.5px;-webkit-user-select:none;user-select:none}.sider-section-count{font-weight:400;opacity:.6}.sider-item{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:var(--radius-sm);cursor:pointer;transition:background-color .15s ease;font-size:13px;color:var(--text-secondary);line-height:20px;min-height:32px}.sider-item:hover{background:var(--bg-hover);color:var(--text-primary)}.sider-item.active{background:color-mix(in srgb,var(--primary) 12%,transparent);color:var(--primary)}.sider-item-icon{flex:0 0 auto;width:18px;height:18px;display:flex;align-items:center;justify-content:center;opacity:.7}.sider-item.active .sider-item-icon{opacity:1}.sider-item-label{flex:1 1 auto;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sider-item-meta{flex:0 0 auto;font-size:11px;opacity:.5}.sider-footer{flex:0 0 auto;padding:8px 6px 12px;border-top:1px solid var(--border-base)}.sider-footer-btn{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:var(--radius-sm);cursor:pointer;transition:background-color .15s;font-size:13px;color:var(--text-secondary);width:100%}.sider-footer-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.sider-footer-btn.active{background:color-mix(in srgb,var(--primary) 12%,transparent);color:var(--primary)}.main-area{display:flex;flex-direction:column;height:100vh;overflow:hidden;background:var(--bg-base)}.main-header{flex:0 0 auto;display:flex;align-items:center;justify-content:space-between;height:var(--titlebar-height);padding:0 16px;border-bottom:1px solid var(--border-base);background:var(--bg-base)}.main-header-title{display:flex;align-items:center;gap:8px;min-width:0}.main-header-title strong{font-size:14px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.main-header-badge{font-size:11px;color:var(--text-secondary);background:var(--bg-2);border:1px solid var(--border-light);border-radius:var(--radius-sm);padding:2px 8px;white-space:nowrap}.main-header-actions{display:flex;gap:4px}.chat-area{flex:1 1 auto;overflow-y:auto;padding:24px 0;display:flex;flex-direction:column;gap:2px;scroll-behavior:smooth}.message-row{max-width:800px;width:100%;margin:0 auto;padding:12px 24px}.message-row.user{background:var(--message-user-bg)}.message-row.assistant{background:transparent}.message-row.system{background:var(--message-tips-bg)}.message-row.tool{background:var(--bg-2);font-size:12px;color:var(--text-secondary);border-radius:var(--radius-sm);margin:2px auto}.message-row.bash{background:var(--bg-2);font-family:SF Mono,Cascadia Code,Fira Code,monospace;font-size:12px;color:var(--text-secondary);border-radius:var(--radius-sm);white-space:pre-wrap}.message-sender{font-size:12px;font-weight:600;color:var(--text-secondary);margin-bottom:6px;display:flex;align-items:center;gap:6px}.message-sender-dot{width:6px;height:6px;border-radius:50%;background:var(--primary)}.message-row.user .message-sender-dot{background:var(--brand)}.message-body{font-size:14px;line-height:1.7;color:var(--text-primary);white-space:pre-wrap;word-break:break-word}.message-body code{font-family:JetBrains Mono,Fira Code,monospace;background:var(--bg-2);border:1px solid var(--border-light);border-radius:4px;padding:1px 5px;font-size:13px}.message-body pre{background:var(--bg-2);border:1px solid var(--border-base);border-radius:var(--radius-sm);padding:12px;overflow-x:auto;margin:8px 0}.message-body pre code{background:transparent;border:none;padding:0;font-size:13px;line-height:1.5}.tool-card{background:var(--bg-2);border:1px solid var(--border-base);border-radius:var(--radius-sm);margin:6px 0;overflow:hidden}.tool-card-header{display:flex;align-items:center;gap:6px;padding:6px 10px;font-size:12px;color:var(--text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none}.tool-card-header:hover{background:var(--bg-hover)}.tool-card-name{font-weight:500;color:var(--primary)}.tool-card-status{margin-left:auto;font-size:11px}.tool-card-body{padding:8px 10px;font-size:12px;line-height:1.5;color:var(--text-secondary);font-family:JetBrains Mono,Fira Code,monospace;max-height:200px;overflow-y:auto;white-space:pre-wrap}.sendbox-wrapper{flex:0 0 auto;padding:0 24px 20px;display:flex;justify-content:center}.sendbox{width:100%;max-width:800px;background:var(--bg-2);border:1px solid var(--border-base);border-radius:var(--radius-lg);padding:12px 14px;display:flex;flex-direction:column;gap:8px;box-shadow:var(--shadow-card);transition:border-color .2s}.sendbox:focus-within{border-color:var(--primary)}.sendbox-input{width:100%;min-height:20px;max-height:200px;border:none;background:transparent;color:var(--text-primary);font-family:inherit;font-size:14px;line-height:1.5;resize:none;outline:none}.sendbox-input::placeholder{color:var(--text-disabled)}.sendbox-toolbar{display:flex;align-items:center;gap:8px}.sendbox-model-btn{display:inline-flex;align-items:center;gap:4px;font-size:12px;color:var(--text-secondary);background:transparent;border:none;padding:4px 8px;border-radius:var(--radius-sm);cursor:pointer;transition:color .15s}.sendbox-model-btn:hover{color:var(--text-primary);background:var(--bg-hover)}.sendbox-send-btn{margin-left:auto;width:28px;height:28px;border-radius:50%;border:none;background:var(--bg-4);color:var(--text-disabled);display:flex;align-items:center;justify-content:center;cursor:not-allowed;transition:background-color .2s,color .2s;flex-shrink:0}.sendbox-send-btn.active{background:var(--primary);color:var(--inverse);cursor:pointer}.sendbox-send-btn.active:hover{background:var(--primary-hover)}.sendbox-attach-btn{width:28px;height:28px;border-radius:50%;border:none;background:transparent;color:var(--text-secondary);display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0}.sendbox-attach-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.empty-state{flex:1 1 auto;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;color:var(--text-secondary);padding:40px}.empty-state-icon{width:48px;height:48px;border-radius:var(--radius-md);background:var(--bg-2);border:1px solid var(--border-base);display:flex;align-items:center;justify-content:center;color:var(--text-disabled)}.empty-state h3{font-size:16px;font-weight:600;color:var(--text-primary)}.empty-state p{font-size:13px;text-align:center;max-width:360px;line-height:1.5}.btn-icon{width:28px;height:28px;border-radius:var(--radius-sm);border:none;background:transparent;color:var(--text-secondary);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:background-color .15s,color .15s}.btn-icon:hover{background:var(--bg-hover);color:var(--text-primary)}.btn-icon:active{background:var(--bg-active)}.btn-primary{display:inline-flex;align-items:center;gap:6px;padding:5px 12px;border-radius:var(--radius-sm);border:none;background:var(--primary);color:var(--inverse);font-size:12px;font-weight:500;cursor:pointer;transition:background-color .15s;white-space:nowrap}.btn-primary:hover{background:var(--primary-hover)}.btn-primary:disabled{opacity:.4;cursor:not-allowed}
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" data-theme="dark" data-color-scheme="default">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>OMP</title>
7
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
8
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
9
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet" />
10
+ <script type="module" crossorigin src="/assets/index-BQ6zLLfz.js"></script>
11
+ <link rel="stylesheet" crossorigin href="/assets/index-Befs78HG.css">
12
+ </head>
13
+ <body>
14
+ <div id="root"></div>
15
+ </body>
16
+ </html>
package/dist/config.js ADDED
@@ -0,0 +1,272 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { dirname, isAbsolute, join, resolve } from "node:path";
4
+ import { isOmpWebPluginId, ompWebPluginIdPattern } from "./shared/pluginIds.js";
5
+ import { isRecord } from "./server/utils.js";
6
+ export function defaultOmpWebConfigPath(env = process.env) {
7
+ const xdgConfigHome = env["XDG_CONFIG_HOME"];
8
+ return join(xdgConfigHome !== undefined && xdgConfigHome !== "" ? xdgConfigHome : join(homedir(), ".config"), "omp-web", "config.json");
9
+ }
10
+ export function defaultOmpWebDataDir() {
11
+ return join(homedir(), ".omp-web");
12
+ }
13
+ /**
14
+ * Default maximum HTTP body size (bytes) for the web/API and session daemon.
15
+ * Generous headroom for base64 image attachments (well above pi's 4.5MB
16
+ * per-image inline limit so several images fit in one request).
17
+ */
18
+ export const DEFAULT_MAX_UPLOAD_BYTES = 64 * 1024 * 1024;
19
+ export const DEFAULT_UPLOADS_FOLDER = ".omp-web/uploads";
20
+ export function effectiveUploadsConfig(config = {}) {
21
+ return { defaultFolder: config.uploads?.defaultFolder ?? DEFAULT_UPLOADS_FOLDER };
22
+ }
23
+ export function maxUploadBytes(env = process.env, config = {}) {
24
+ const fromEnv = env["OMP_WEB_MAX_UPLOAD_BYTES"];
25
+ if (fromEnv !== undefined && fromEnv !== "") {
26
+ const parsed = Number(fromEnv);
27
+ if (Number.isInteger(parsed) && parsed > 0)
28
+ return parsed;
29
+ }
30
+ if (config.maxUploadBytes !== undefined)
31
+ return config.maxUploadBytes;
32
+ return DEFAULT_MAX_UPLOAD_BYTES;
33
+ }
34
+ export function ompWebDataDir(env = process.env, cwd = process.cwd()) {
35
+ const configured = env["OMP_WEB_DATA_DIR"];
36
+ if (configured === undefined || configured === "")
37
+ return defaultOmpWebDataDir();
38
+ return resolve(cwd, configured);
39
+ }
40
+ export function ompWebConfigPath(env = process.env, cwd = process.cwd()) {
41
+ const configured = env["OMP_WEB_CONFIG"];
42
+ if (configured === undefined || configured === "")
43
+ return defaultOmpWebConfigPath(env);
44
+ return resolve(cwd, configured);
45
+ }
46
+ export function loadOmpWebConfig(options = {}) {
47
+ const env = options.env ?? process.env;
48
+ const path = ompWebConfigPath(env, options.cwd ?? process.cwd());
49
+ if (!existsSync(path))
50
+ return { path, exists: false, config: {} };
51
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
52
+ if (!isRecord(parsed))
53
+ throw new Error(`PI WEB config must be a JSON object: ${path}`);
54
+ return { path, exists: true, config: parseOmpWebConfig(parsed, path) };
55
+ }
56
+ export function effectiveOmpWebConfig(options = {}) {
57
+ const loaded = loadOmpWebConfig(options);
58
+ const env = options.env ?? process.env;
59
+ const host = env["OMP_WEB_HOST"];
60
+ const port = env["OMP_WEB_PORT"] ?? env["PORT"];
61
+ const allowedHosts = env["OMP_WEB_ALLOWED_HOSTS"];
62
+ const maxUpload = env["OMP_WEB_MAX_UPLOAD_BYTES"];
63
+ return {
64
+ ...loaded,
65
+ config: {
66
+ ...loaded.config,
67
+ ...(host !== undefined && host !== "" ? { host } : {}),
68
+ ...(port !== undefined && port !== "" ? { port: parsePort(port, "OMP_WEB_PORT") } : {}),
69
+ ...(allowedHosts !== undefined && allowedHosts !== "" ? { allowedHosts: parseAllowedHostsEnv(allowedHosts) } : {}),
70
+ ...(maxUpload !== undefined && maxUpload !== "" ? { maxUploadBytes: parseMaxUploadBytes(maxUpload, "OMP_WEB_MAX_UPLOAD_BYTES") } : {}),
71
+ uploads: effectiveUploadsConfig(loaded.config),
72
+ // Always resolved (on by default) so the effective config is the single
73
+ // source of truth for the runtime state and the settings UI toggle.
74
+ spawnSessions: spawnSessionsEnabled(env, loaded.config),
75
+ // Beta capability, resolved off by default.
76
+ subsessions: subsessionsEnabled(env, loaded.config),
77
+ },
78
+ };
79
+ }
80
+ export function saveOmpWebConfig(config, options = {}) {
81
+ const env = options.env ?? process.env;
82
+ const path = ompWebConfigPath(env, options.cwd ?? process.cwd());
83
+ const normalized = parseOmpWebConfig(ompWebConfigRecord(config), path);
84
+ const existing = readExistingConfigObject(path);
85
+ delete existing["host"];
86
+ delete existing["port"];
87
+ delete existing["allowedHosts"];
88
+ delete existing["shortcuts"];
89
+ delete existing["plugins"];
90
+ delete existing["pathAccess"];
91
+ delete existing["uploads"];
92
+ delete existing["maxUploadBytes"];
93
+ delete existing["spawnSessions"];
94
+ delete existing["subsessions"];
95
+ const merged = { ...existing, ...ompWebConfigRecord(normalized) };
96
+ mkdirSync(dirname(path), { recursive: true });
97
+ writeFileSync(path, `${JSON.stringify(merged, null, 2)}\n`, "utf8");
98
+ return { path, exists: true, config: normalized };
99
+ }
100
+ function readExistingConfigObject(path) {
101
+ if (!existsSync(path))
102
+ return {};
103
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
104
+ if (!isRecord(parsed))
105
+ throw new Error(`PI WEB config must be a JSON object: ${path}`);
106
+ return parsed;
107
+ }
108
+ function ompWebConfigRecord(config) {
109
+ return {
110
+ ...(config.host !== undefined ? { host: config.host } : {}),
111
+ ...(config.port !== undefined ? { port: config.port } : {}),
112
+ ...(config.allowedHosts !== undefined ? { allowedHosts: config.allowedHosts } : {}),
113
+ ...(config.shortcuts !== undefined ? { shortcuts: config.shortcuts } : {}),
114
+ ...(config.plugins !== undefined ? { plugins: config.plugins } : {}),
115
+ ...(config.pathAccess !== undefined ? { pathAccess: config.pathAccess } : {}),
116
+ ...(config.uploads !== undefined ? { uploads: config.uploads } : {}),
117
+ ...(config.maxUploadBytes !== undefined ? { maxUploadBytes: config.maxUploadBytes } : {}),
118
+ ...(config.spawnSessions !== undefined ? { spawnSessions: config.spawnSessions } : {}),
119
+ ...(config.subsessions !== undefined ? { subsessions: config.subsessions } : {}),
120
+ };
121
+ }
122
+ function parseOmpWebConfig(value, path) {
123
+ return {
124
+ ...(value["host"] !== undefined ? { host: parseString(value["host"], "host", path) } : {}),
125
+ ...(value["port"] !== undefined ? { port: parsePort(value["port"], "port", path) } : {}),
126
+ ...(value["allowedHosts"] !== undefined ? { allowedHosts: parseAllowedHosts(value["allowedHosts"], path) } : {}),
127
+ ...(value["shortcuts"] !== undefined ? { shortcuts: parseShortcuts(value["shortcuts"], path) } : {}),
128
+ ...(value["plugins"] !== undefined ? { plugins: parsePlugins(value["plugins"], path) } : {}),
129
+ ...(value["pathAccess"] !== undefined ? { pathAccess: parsePathAccessConfig(value["pathAccess"], path) } : {}),
130
+ ...(value["uploads"] !== undefined ? { uploads: parseUploadsConfig(value["uploads"], path) } : {}),
131
+ ...(value["maxUploadBytes"] !== undefined ? { maxUploadBytes: parseMaxUploadBytes(value["maxUploadBytes"], "maxUploadBytes", path) } : {}),
132
+ ...(value["spawnSessions"] !== undefined ? { spawnSessions: parseSpawnSessions(value["spawnSessions"], path) } : {}),
133
+ ...(value["subsessions"] !== undefined ? { subsessions: parseSubsessions(value["subsessions"], path) } : {}),
134
+ };
135
+ }
136
+ function parseMaxUploadBytes(value, key, path = "environment") {
137
+ const bytes = typeof value === "number" ? value : typeof value === "string" && value !== "" ? Number(value) : NaN;
138
+ if (!Number.isInteger(bytes) || bytes < 1)
139
+ throw new Error(`PI WEB config ${key} must be a positive integer: ${path}`);
140
+ return bytes;
141
+ }
142
+ function parseSpawnSessions(value, path) {
143
+ if (typeof value !== "boolean")
144
+ throw new Error(`PI WEB config spawnSessions must be a boolean: ${path}`);
145
+ return value;
146
+ }
147
+ /**
148
+ * Whether LLMs may start new sessions via the spawn_session tool. On by default
149
+ * (spawned sessions appear in the session list, so humans notice them); set the
150
+ * env var `OMP_WEB_SPAWN_SESSIONS` or the `spawnSessions` config key to `false`
151
+ * to disable. The env var takes precedence over the config file.
152
+ */
153
+ export function spawnSessionsEnabled(env = process.env, config = {}) {
154
+ const fromEnv = env["OMP_WEB_SPAWN_SESSIONS"];
155
+ if (fromEnv !== undefined && fromEnv !== "")
156
+ return fromEnv === "1" || fromEnv.toLowerCase() === "true";
157
+ return config.spawnSessions ?? true;
158
+ }
159
+ function parseSubsessions(value, path) {
160
+ if (typeof value !== "boolean")
161
+ throw new Error(`PI WEB config subsessions must be a boolean: ${path}`);
162
+ return value;
163
+ }
164
+ /**
165
+ * Beta: whether LLMs may start tracked child sessions via the spawn_subsession
166
+ * family of tools. Off by default while the capability stabilizes, so it can
167
+ * ship in main without affecting releases; enable with the env var
168
+ * `OMP_WEB_SUBSESSIONS` or the `subsessions` config key. The env var takes
169
+ * precedence over the config file. Subsessions also require spawnSessions to be
170
+ * enabled (they share the same project-scope resolver).
171
+ */
172
+ export function subsessionsEnabled(env = process.env, config = {}) {
173
+ const fromEnv = env["OMP_WEB_SUBSESSIONS"];
174
+ if (fromEnv !== undefined && fromEnv !== "")
175
+ return fromEnv === "1" || fromEnv.toLowerCase() === "true";
176
+ return config.subsessions ?? false;
177
+ }
178
+ function parseString(value, key, path) {
179
+ if (typeof value !== "string" || value === "")
180
+ throw new Error(`PI WEB config ${key} must be a non-empty string: ${path}`);
181
+ return value;
182
+ }
183
+ function parsePort(value, key, path = "environment") {
184
+ const port = typeof value === "number" ? value : typeof value === "string" && value !== "" ? Number(value) : NaN;
185
+ if (!Number.isInteger(port) || port < 1 || port > 65535)
186
+ throw new Error(`PI WEB config ${key} must be an integer from 1 to 65535: ${path}`);
187
+ return port;
188
+ }
189
+ function parseAllowedHosts(value, path) {
190
+ if (value === true)
191
+ return true;
192
+ if (!isNonEmptyStringArray(value)) {
193
+ throw new Error(`PI WEB config allowedHosts must be true or an array of non-empty strings: ${path}`);
194
+ }
195
+ return value;
196
+ }
197
+ function parseAllowedHostsEnv(value) {
198
+ if (value === "true")
199
+ return true;
200
+ return value.split(",").map((host) => host.trim()).filter((host) => host !== "");
201
+ }
202
+ export function parsePathAccessConfig(value, path) {
203
+ if (!isRecord(value))
204
+ throw new Error(`PI WEB config pathAccess must be an object: ${path}`);
205
+ const allowedPaths = value["allowedPaths"];
206
+ return {
207
+ ...(allowedPaths !== undefined ? { allowedPaths: parseAllowedPaths(allowedPaths, path) } : {}),
208
+ };
209
+ }
210
+ function parseAllowedPaths(value, path) {
211
+ if (!isNonEmptyStringArray(value))
212
+ throw new Error(`PI WEB config pathAccess.allowedPaths must be an array of non-empty strings: ${path}`);
213
+ return value;
214
+ }
215
+ export function parseUploadsConfig(value, path) {
216
+ if (!isRecord(value))
217
+ throw new Error(`PI WEB config uploads must be an object: ${path}`);
218
+ const defaultFolder = value["defaultFolder"];
219
+ return {
220
+ ...(defaultFolder !== undefined ? { defaultFolder: parseWorkspaceRelativeFolder(defaultFolder, "uploads.defaultFolder", path) } : {}),
221
+ };
222
+ }
223
+ function parseWorkspaceRelativeFolder(value, key, path) {
224
+ if (typeof value !== "string" || value.trim() === "")
225
+ throw new Error(`PI WEB config ${key} must be a non-empty workspace-relative path: ${path}`);
226
+ if (isAbsoluteLike(value))
227
+ throw new Error(`PI WEB config ${key} must be workspace-relative: ${path}`);
228
+ const parts = value.split(/[\\/]+/).filter((part) => part !== "" && part !== ".");
229
+ if (parts.length === 0)
230
+ throw new Error(`PI WEB config ${key} must be a non-empty workspace-relative path: ${path}`);
231
+ if (parts.some((part) => part === ".."))
232
+ throw new Error(`PI WEB config ${key} must not contain path traversal: ${path}`);
233
+ return parts.join("/");
234
+ }
235
+ function isAbsoluteLike(value) {
236
+ const withForwardSlashes = value.replace(/\\/g, "/");
237
+ return isAbsolute(value) || withForwardSlashes.startsWith("/") || /^[A-Za-z]:\//.test(withForwardSlashes);
238
+ }
239
+ function parseShortcuts(value, path) {
240
+ if (!isRecord(value))
241
+ throw new Error(`PI WEB config shortcuts must be an object: ${path}`);
242
+ return Object.fromEntries(Object.entries(value).map(([actionId, shortcut]) => {
243
+ if (shortcut !== null && (typeof shortcut !== "string" || shortcut === "")) {
244
+ throw new Error(`PI WEB config shortcut values must be non-empty strings or null: ${path}`);
245
+ }
246
+ return [actionId, shortcut];
247
+ }));
248
+ }
249
+ function parsePlugins(value, path) {
250
+ if (!isRecord(value) || Array.isArray(value))
251
+ throw new Error(`PI WEB config plugins must be an object: ${path}`);
252
+ return Object.fromEntries(Object.entries(value).map(([pluginId, config]) => {
253
+ if (!isOmpWebPluginId(pluginId))
254
+ throw new Error(`PI WEB config plugin ids must match ${ompWebPluginIdPattern.source}: ${path}`);
255
+ if (!isRecord(config) || Array.isArray(config))
256
+ throw new Error(`PI WEB config plugin entries must be objects: ${path}`);
257
+ const enabled = config["enabled"];
258
+ if (enabled !== undefined && typeof enabled !== "boolean")
259
+ throw new Error(`PI WEB config plugin enabled values must be booleans: ${path}`);
260
+ const settings = config["settings"];
261
+ if (settings !== undefined && (!isRecord(settings) || Array.isArray(settings)))
262
+ throw new Error(`PI WEB config plugin settings must be objects: ${path}`);
263
+ return [pluginId, config];
264
+ }));
265
+ }
266
+ function isNonEmptyStringArray(value) {
267
+ return Array.isArray(value) && value.every((item) => typeof item === "string" && item !== "");
268
+ }
269
+ export function exampleOmpWebConfig(config = {}) {
270
+ return `${JSON.stringify({ host: config.host ?? "127.0.0.1", port: config.port ?? 8504, allowedHosts: config.allowedHosts ?? [] }, null, 2)}\n`;
271
+ }
272
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE/D,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAc7C,MAAM,UAAU,uBAAuB,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC3E,MAAM,aAAa,GAAG,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC7C,OAAO,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;AACzI,CAAC;AAED,MAAM,UAAU,oBAAoB;IACnC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACpC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEzD,MAAM,CAAC,MAAM,sBAAsB,GAAG,kBAAkB,CAAC;AAEzD,MAAM,UAAU,sBAAsB,CAAC,SAA8C,EAAE;IACtF,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,aAAa,IAAI,sBAAsB,EAAE,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAyB,OAAO,CAAC,GAAG,EAAE,SAA6B,EAAE;IACnG,MAAM,OAAO,GAAG,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAChD,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC;IAC3D,CAAC;IACD,IAAI,MAAM,CAAC,cAAc,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,cAAc,CAAC;IACtE,OAAO,wBAAwB,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAyB,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IACtF,MAAM,UAAU,GAAG,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAC3C,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,EAAE;QAAE,OAAO,oBAAoB,EAAE,CAAC;IACjF,OAAO,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAyB,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IACzF,MAAM,UAAU,GAAG,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACzC,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,EAAE;QAAE,OAAO,uBAAuB,CAAC,GAAG,CAAC,CAAC;IACvF,OAAO,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,UAAuB,EAAE;IACzD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACjE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAElE,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/D,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,EAAE,CAAC,CAAC;IAEvF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,UAAuB,EAAE;IAC9D,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,IAAI,GAAG,GAAG,CAAC,cAAc,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,GAAG,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAElD,OAAO;QACN,GAAG,MAAM;QACT,MAAM,EAAE;YACP,GAAG,MAAM,CAAC,MAAM;YAChB,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtD,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvF,GAAG,CAAC,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,oBAAoB,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClH,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,mBAAmB,CAAC,SAAS,EAAE,0BAA0B,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtI,OAAO,EAAE,sBAAsB,CAAC,MAAM,CAAC,MAAM,CAAC;YAC9C,wEAAwE;YACxE,oEAAoE;YACpE,aAAa,EAAE,oBAAoB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC;YACvD,4CAA4C;YAC5C,WAAW,EAAE,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC;SACnD;KACD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAA0B,EAAE,UAAuB,EAAE;IACrF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;IACvE,MAAM,QAAQ,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAChD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;IACxB,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;IACxB,OAAO,QAAQ,CAAC,cAAc,CAAC,CAAC;IAChC,OAAO,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC7B,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC3B,OAAO,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC9B,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC3B,OAAO,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAClC,OAAO,QAAQ,CAAC,eAAe,CAAC,CAAC;IACjC,OAAO,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;IAClE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACnD,CAAC;AAED,SAAS,wBAAwB,CAAC,IAAY;IAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/D,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,EAAE,CAAC,CAAC;IACvF,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,MAA0B;IACrD,OAAO;QACN,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,GAAG,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,GAAG,CAAC,MAAM,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzF,GAAG,CAAC,MAAM,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtF,GAAG,CAAC,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChF,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,KAA8B,EAAE,IAAY;IACtE,OAAO;QACN,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1F,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxF,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,iBAAiB,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChH,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5F,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,qBAAqB,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9G,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClG,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,mBAAmB,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1I,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,kBAAkB,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpH,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,gBAAgB,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5G,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc,EAAE,GAAW,EAAE,IAAI,GAAG,aAAa;IAC7E,MAAM,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAClH,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,gCAAgC,IAAI,EAAE,CAAC,CAAC;IACvH,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc,EAAE,IAAY;IACvD,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,IAAI,EAAE,CAAC,CAAC;IAC1G,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAyB,OAAO,CAAC,GAAG,EAAE,SAA6B,EAAE;IACzG,MAAM,OAAO,GAAG,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAC9C,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,OAAO,KAAK,GAAG,IAAI,OAAO,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;IACxG,OAAO,MAAM,CAAC,aAAa,IAAI,IAAI,CAAC;AACrC,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc,EAAE,IAAY;IACrD,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,IAAI,EAAE,CAAC,CAAC;IACxG,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAyB,OAAO,CAAC,GAAG,EAAE,SAA6B,EAAE;IACvG,MAAM,OAAO,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAC3C,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,OAAO,KAAK,GAAG,IAAI,OAAO,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;IACxG,OAAO,MAAM,CAAC,WAAW,IAAI,KAAK,CAAC;AACpC,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,GAAW,EAAE,IAAY;IAC7D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,gCAAgC,IAAI,EAAE,CAAC,CAAC;IAC3H,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,KAAc,EAAE,GAAW,EAAE,IAAI,GAAG,aAAa;IACnE,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACjH,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,wCAAwC,IAAI,EAAE,CAAC,CAAC;IAC7I,OAAO,IAAI,CAAC;AACb,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc,EAAE,IAAY;IACtD,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,6EAA6E,IAAI,EAAE,CAAC,CAAC;IACtG,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IAC1C,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAClC,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAc,EAAE,IAAY;IACjE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,IAAI,EAAE,CAAC,CAAC;IAC7F,MAAM,YAAY,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;IAC3C,OAAO;QACN,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,iBAAiB,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9F,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc,EAAE,IAAY;IACtD,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gFAAgF,IAAI,EAAE,CAAC,CAAC;IAC3I,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc,EAAE,IAAY;IAC9D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,IAAI,EAAE,CAAC,CAAC;IAC1F,MAAM,aAAa,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC;IAC7C,OAAO;QACN,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,4BAA4B,CAAC,aAAa,EAAE,uBAAuB,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrI,CAAC;AACH,CAAC;AAED,SAAS,4BAA4B,CAAC,KAAc,EAAE,GAAW,EAAE,IAAY;IAC9E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,iDAAiD,IAAI,EAAE,CAAC,CAAC;IACnJ,IAAI,cAAc,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,gCAAgC,IAAI,EAAE,CAAC,CAAC;IACvG,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC;IAClF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,iDAAiD,IAAI,EAAE,CAAC,CAAC;IACrH,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,qCAAqC,IAAI,EAAE,CAAC,CAAC;IAC1H,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACpC,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACrD,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;AAC3G,CAAC;AAED,SAAS,cAAc,CAAC,KAAc,EAAE,IAAY;IACnD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,IAAI,EAAE,CAAC,CAAC;IAC5F,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE;QAC5E,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,EAAE,CAAC,EAAE,CAAC;YAC5E,MAAM,IAAI,KAAK,CAAC,oEAAoE,IAAI,EAAE,CAAC,CAAC;QAC7F,CAAC;QACD,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,KAAc,EAAE,IAAY;IACjD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,IAAI,EAAE,CAAC,CAAC;IAClH,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE;QAC1E,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,qBAAqB,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;QACjI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,IAAI,EAAE,CAAC,CAAC;QACzH,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QAClC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,IAAI,EAAE,CAAC,CAAC;QAC5I,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACpC,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,IAAI,EAAE,CAAC,CAAC;QAC1J,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC,CAAC;AACL,CAAC;AAGD,SAAS,qBAAqB,CAAC,KAAc;IAC5C,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC;AAC/F,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAA6B,EAAE;IAClE,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AACjJ,CAAC"}
@@ -0,0 +1,211 @@
1
+ export const OMP_WEB_DOCKER_USER_COMMANDS = [
2
+ "install",
3
+ "start",
4
+ "stop",
5
+ "restart",
6
+ "restart-web",
7
+ "restart-sessiond",
8
+ "update",
9
+ "status",
10
+ "logs",
11
+ "shell",
12
+ "doctor",
13
+ "cli",
14
+ ];
15
+ const noArgumentCommands = new Set([
16
+ "start",
17
+ "stop",
18
+ "restart",
19
+ "restart-web",
20
+ "restart-sessiond",
21
+ "update",
22
+ "status",
23
+ "doctor",
24
+ "help",
25
+ ]);
26
+ const commands = new Set([...OMP_WEB_DOCKER_USER_COMMANDS, "help"]);
27
+ const logsTargets = new Set(["web", "sessiond", "data-init"]);
28
+ const shellTargets = new Set(["web", "sessiond"]);
29
+ export function ompWebDockerCommandPrefix(mode) {
30
+ return mode === "dev" ? "omp-web-docker --dev" : "omp-web-docker";
31
+ }
32
+ export function ompWebDockerCommand(mode, command) {
33
+ return `${ompWebDockerCommandPrefix(mode)} ${command}`;
34
+ }
35
+ export function planOmpWebDockerRuntimeHostCommand(plan) {
36
+ if (plan.mode !== "runtime")
37
+ return undefined;
38
+ switch (plan.command) {
39
+ case "install":
40
+ return { kind: "installer", action: "install", args: [...plan.args], useRuntimeRootAsInstallDir: false };
41
+ case "update":
42
+ return { kind: "installer", action: "update", args: [], useRuntimeRootAsInstallDir: true };
43
+ case "start":
44
+ return composeHostPlan("up", "-d");
45
+ case "stop":
46
+ return composeHostPlan("down");
47
+ case "restart":
48
+ return composeHostPlan("restart", "web", "sessiond");
49
+ case "restart-web":
50
+ return composeHostPlan("restart", "web");
51
+ case "restart-sessiond":
52
+ return composeHostPlan("restart", "sessiond");
53
+ case "status":
54
+ return composeHostPlan("ps");
55
+ case "logs":
56
+ return plan.target === undefined ? composeHostPlan("logs", "-f") : composeHostPlan("logs", "-f", plan.target);
57
+ case "shell":
58
+ return composeHostPlan("exec", plan.target ?? "web", "bash");
59
+ case "cli":
60
+ return { kind: "compose", args: ["exec", "web", "omp-web", ...plan.args] };
61
+ case "doctor":
62
+ return { kind: "diagnostics" };
63
+ case "help":
64
+ return { kind: "usage" };
65
+ }
66
+ }
67
+ export function planOmpWebDockerDevHostCommand(plan) {
68
+ if (plan.mode !== "dev")
69
+ return undefined;
70
+ switch (plan.command) {
71
+ case "install":
72
+ return undefined;
73
+ case "start":
74
+ return devComposeHostPlan("up", "-d", "--build");
75
+ case "stop":
76
+ return devComposeHostPlan("down");
77
+ case "restart":
78
+ return devComposeHostPlan("restart", "web", "sessiond");
79
+ case "restart-web":
80
+ return devComposeHostPlan("restart", "web");
81
+ case "restart-sessiond":
82
+ return devComposeHostPlan("restart", "sessiond");
83
+ case "update":
84
+ return {
85
+ kind: "composeSequence",
86
+ usesGeneratedEnv: true,
87
+ steps: [
88
+ { args: ["build", "--pull"] },
89
+ { args: ["up", "-d", "--force-recreate", "--remove-orphans"] },
90
+ ],
91
+ };
92
+ case "status":
93
+ return devComposeHostPlan("ps");
94
+ case "logs":
95
+ return plan.target === undefined ? devComposeHostPlan("logs", "-f") : devComposeHostPlan("logs", "-f", plan.target);
96
+ case "shell":
97
+ return devComposeHostPlan("exec", plan.target ?? "web", "bash");
98
+ case "cli":
99
+ return { kind: "compose", args: ["exec", "web", "omp-web", ...plan.args], usesGeneratedEnv: true };
100
+ case "doctor":
101
+ return { kind: "diagnostics", usesGeneratedEnv: true };
102
+ case "help":
103
+ return { kind: "usage" };
104
+ }
105
+ }
106
+ export function validateOmpWebDockerDevRootSafety(plan, uid) {
107
+ if (plan.mode !== "dev" || plan.allowRoot || plan.command === "help" || uid !== 0)
108
+ return undefined;
109
+ return "refusing to run Docker development mode as root; retry with --allow-root if this is intentional";
110
+ }
111
+ export function parseOmpWebDockerArgs(argv) {
112
+ let mode = "runtime";
113
+ let allowRoot = false;
114
+ let index = 0;
115
+ for (; index < argv.length; index += 1) {
116
+ const arg = argv[index];
117
+ if (arg === undefined)
118
+ break;
119
+ if (arg === "--") {
120
+ index += 1;
121
+ break;
122
+ }
123
+ if (arg === "--dev") {
124
+ mode = "dev";
125
+ continue;
126
+ }
127
+ if (arg === "--allow-root") {
128
+ allowRoot = true;
129
+ continue;
130
+ }
131
+ if (arg === "--help" || arg === "-h") {
132
+ return { ok: true, plan: { mode, command: "help", allowRoot, args: [] } };
133
+ }
134
+ if (arg.startsWith("-")) {
135
+ return { ok: false, errors: [`Unknown global option: ${arg}`] };
136
+ }
137
+ break;
138
+ }
139
+ const commandValue = argv[index];
140
+ if (commandValue === undefined)
141
+ return { ok: false, errors: ["Missing command"] };
142
+ if (!isOmpWebDockerCommand(commandValue))
143
+ return { ok: false, errors: [`Unknown command: ${commandValue}`] };
144
+ const args = argv.slice(index + 1);
145
+ const plan = { mode, command: commandValue, allowRoot, args };
146
+ return validatePlan(withDefaultTarget(plan));
147
+ }
148
+ function composeHostPlan(...args) {
149
+ return { kind: "compose", args };
150
+ }
151
+ function devComposeHostPlan(...args) {
152
+ return { kind: "compose", args, usesGeneratedEnv: true };
153
+ }
154
+ function withDefaultTarget(plan) {
155
+ if (plan.command === "shell" && plan.target === undefined && plan.args.length === 0)
156
+ return { ...plan, target: "web" };
157
+ return plan;
158
+ }
159
+ function validatePlan(plan) {
160
+ const errors = [];
161
+ if (plan.command === "install" && plan.mode === "dev") {
162
+ errors.push("install is only available in runtime mode");
163
+ }
164
+ if (noArgumentCommands.has(plan.command) && plan.args.length > 0) {
165
+ errors.push(`${plan.command} does not accept positional arguments`);
166
+ }
167
+ if (plan.command === "logs") {
168
+ validateOptionalTarget(plan.args, isLogsTarget, "logs", errors);
169
+ if (plan.args[0] === "data-init" && plan.mode !== "dev")
170
+ errors.push("logs data-init is only available in development mode");
171
+ }
172
+ if (plan.command === "shell") {
173
+ validateOptionalTarget(plan.args, isShellTarget, "shell", errors);
174
+ }
175
+ if (plan.command === "cli" && plan.args.length === 0) {
176
+ errors.push("cli requires omp-web arguments");
177
+ }
178
+ if (errors.length > 0)
179
+ return { ok: false, errors };
180
+ const target = targetFrom(plan.command, plan.args);
181
+ return { ok: true, plan: target === undefined ? plan : { ...plan, target } };
182
+ }
183
+ function validateOptionalTarget(args, isAllowed, command, errors) {
184
+ if (args.length > 1) {
185
+ errors.push(`${command} accepts at most one target`);
186
+ return;
187
+ }
188
+ const [target] = args;
189
+ if (target !== undefined && !isAllowed(target))
190
+ errors.push(`Invalid ${command} target: ${target}`);
191
+ }
192
+ function targetFrom(command, args) {
193
+ const [target] = args;
194
+ if (target === undefined)
195
+ return command === "shell" ? "web" : undefined;
196
+ if (command === "logs" && isLogsTarget(target))
197
+ return target;
198
+ if (command === "shell" && isShellTarget(target))
199
+ return target;
200
+ return undefined;
201
+ }
202
+ function isOmpWebDockerCommand(value) {
203
+ return commands.has(value);
204
+ }
205
+ function isLogsTarget(value) {
206
+ return logsTargets.has(value);
207
+ }
208
+ function isShellTarget(value) {
209
+ return shellTargets.has(value);
210
+ }
211
+ //# sourceMappingURL=ompWebDockerCommandPlan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ompWebDockerCommandPlan.js","sourceRoot":"","sources":["../../src/docker/ompWebDockerCommandPlan.ts"],"names":[],"mappings":"AA+BA,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,SAAS;IACT,OAAO;IACP,MAAM;IACN,SAAS;IACT,aAAa;IACb,kBAAkB;IAClB,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,OAAO;IACP,QAAQ;IACR,KAAK;CAC6D,CAAC;AAkBrE,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAsB;IACtD,OAAO;IACP,MAAM;IACN,SAAS;IACT,aAAa;IACb,kBAAkB;IAClB,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,MAAM;CACP,CAAC,CAAC;AAEH,MAAM,QAAQ,GAAwB,IAAI,GAAG,CAAC,CAAC,GAAG,4BAA4B,EAAE,MAAM,CAAC,CAAC,CAAC;AAEzF,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;AACnF,MAAM,YAAY,GAAwB,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;AAEvE,MAAM,UAAU,yBAAyB,CAAC,IAAkC;IAC1E,OAAO,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,gBAAgB,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAkC,EAAE,OAA6C;IACnH,OAAO,GAAG,yBAAyB,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,IAA6B;IAC9E,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAE9C,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,KAAK,SAAS;YACZ,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,0BAA0B,EAAE,KAAK,EAAE,CAAC;QAC3G,KAAK,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,0BAA0B,EAAE,IAAI,EAAE,CAAC;QAC7F,KAAK,OAAO;YACV,OAAO,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACrC,KAAK,MAAM;YACT,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;QACjC,KAAK,SAAS;YACZ,OAAO,eAAe,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QACvD,KAAK,aAAa;YAChB,OAAO,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC3C,KAAK,kBAAkB;YACrB,OAAO,eAAe,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAChD,KAAK,QAAQ;YACX,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/B,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAChH,KAAK,OAAO;YACV,OAAO,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE,MAAM,CAAC,CAAC;QAC/D,KAAK,KAAK;YACR,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7E,KAAK,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;QACjC,KAAK,MAAM;YACT,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,IAA6B;IAC1E,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IAE1C,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,OAAO;YACV,OAAO,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACnD,KAAK,MAAM;YACT,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACpC,KAAK,SAAS;YACZ,OAAO,kBAAkB,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QAC1D,KAAK,aAAa;YAChB,OAAO,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC9C,KAAK,kBAAkB;YACrB,OAAO,kBAAkB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACnD,KAAK,QAAQ;YACX,OAAO;gBACL,IAAI,EAAE,iBAAiB;gBACvB,gBAAgB,EAAE,IAAI;gBACtB,KAAK,EAAE;oBACL,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;oBAC7B,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,EAAE;iBAC/D;aACF,CAAC;QACJ,KAAK,QAAQ;YACX,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAClC,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACtH,KAAK,OAAO;YACV,OAAO,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE,MAAM,CAAC,CAAC;QAClE,KAAK,KAAK;YACR,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;QACrG,KAAK,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;QACzD,KAAK,MAAM;YACT,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,IAA6B,EAAE,GAAW;IAC1F,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACpG,OAAO,iGAAiG,CAAC;AAC3G,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAuB;IAC3D,IAAI,IAAI,GAAqB,SAAS,CAAC;IACvC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,OAAO,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,GAAG,KAAK,SAAS;YAAE,MAAM;QAC7B,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,KAAK,IAAI,CAAC,CAAC;YACX,MAAM;QACR,CAAC;QACD,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpB,IAAI,GAAG,KAAK,CAAC;YACb,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;YAC3B,SAAS,GAAG,IAAI,CAAC;YACjB,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACrC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;QAC5E,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,0BAA0B,GAAG,EAAE,CAAC,EAAE,CAAC;QAClE,CAAC;QACD,MAAM;IACR,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;IAClF,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,oBAAoB,YAAY,EAAE,CAAC,EAAE,CAAC;IAE7G,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACnC,MAAM,IAAI,GAA4B,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACvF,OAAO,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,eAAe,CAAC,GAAG,IAAc;IACxC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAG,IAAc;IAC3C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;AAC3D,CAAC;AAED,SAAS,iBAAiB,CAAC,IAA6B;IACtD,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IACvH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,IAA6B;IACjD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,uCAAuC,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;QAC5B,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAChE,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;YAAE,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;IAC/H,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;QAC7B,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAEpD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;AAC/E,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAuB,EAAE,SAAqC,EAAE,OAAe,EAAE,MAAgB;IAC/H,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,6BAA6B,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IACD,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACtB,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,WAAW,OAAO,YAAY,MAAM,EAAE,CAAC,CAAC;AACtG,CAAC;AAED,SAAS,UAAU,CAAC,OAA4B,EAAE,IAAuB;IACvE,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACtB,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACzE,IAAI,OAAO,KAAK,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9D,IAAI,OAAO,KAAK,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAChE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAa;IAC1C,OAAO,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC"}