@xelauvas/xela-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1920) hide show
  1. package/README.md +200 -0
  2. package/bin/xela +100 -0
  3. package/package.json +88 -0
  4. package/src/QueryEngine.ts +1295 -0
  5. package/src/Task.ts +125 -0
  6. package/src/Tool.ts +792 -0
  7. package/src/_shims/_generated_stubs/_universal_stub.mjs +168 -0
  8. package/src/_shims/_generated_stubs/text_stub.mjs +1 -0
  9. package/src/_shims/bun_bundle.js +9 -0
  10. package/src/_shims/cjs_stub.cjs +23 -0
  11. package/src/_shims/empty_stub.js +33 -0
  12. package/src/_shims/loader.js +352 -0
  13. package/src/_shims/openai_adapter.ts +486 -0
  14. package/src/_shims/react_compiler_runtime.js +17 -0
  15. package/src/_shims/register.js +148 -0
  16. package/src/assistant/sessionHistory.ts +87 -0
  17. package/src/bootstrap/state.ts +1759 -0
  18. package/src/bridge/bridgeApi.ts +539 -0
  19. package/src/bridge/bridgeConfig.ts +48 -0
  20. package/src/bridge/bridgeDebug.ts +135 -0
  21. package/src/bridge/bridgeEnabled.ts +202 -0
  22. package/src/bridge/bridgeMain.ts +2999 -0
  23. package/src/bridge/bridgeMessaging.ts +461 -0
  24. package/src/bridge/bridgePermissionCallbacks.ts +43 -0
  25. package/src/bridge/bridgePointer.ts +210 -0
  26. package/src/bridge/bridgeStatusUtil.ts +163 -0
  27. package/src/bridge/bridgeUI.ts +530 -0
  28. package/src/bridge/capacityWake.ts +56 -0
  29. package/src/bridge/codeSessionApi.ts +168 -0
  30. package/src/bridge/createSession.ts +384 -0
  31. package/src/bridge/debugUtils.ts +141 -0
  32. package/src/bridge/envLessBridgeConfig.ts +165 -0
  33. package/src/bridge/flushGate.ts +71 -0
  34. package/src/bridge/inboundAttachments.ts +175 -0
  35. package/src/bridge/inboundMessages.ts +80 -0
  36. package/src/bridge/initReplBridge.ts +569 -0
  37. package/src/bridge/jwtUtils.ts +256 -0
  38. package/src/bridge/pollConfig.ts +110 -0
  39. package/src/bridge/pollConfigDefaults.ts +82 -0
  40. package/src/bridge/remoteBridgeCore.ts +1008 -0
  41. package/src/bridge/replBridge.ts +2406 -0
  42. package/src/bridge/replBridgeHandle.ts +36 -0
  43. package/src/bridge/replBridgeTransport.ts +370 -0
  44. package/src/bridge/sessionIdCompat.ts +57 -0
  45. package/src/bridge/sessionRunner.ts +550 -0
  46. package/src/bridge/trustedDevice.ts +210 -0
  47. package/src/bridge/types.ts +262 -0
  48. package/src/bridge/workSecret.ts +127 -0
  49. package/src/buddy/CompanionSprite.tsx +371 -0
  50. package/src/buddy/companion.ts +133 -0
  51. package/src/buddy/prompt.ts +36 -0
  52. package/src/buddy/sprites.ts +514 -0
  53. package/src/buddy/types.ts +148 -0
  54. package/src/buddy/useBuddyNotification.tsx +98 -0
  55. package/src/cli/exit.ts +31 -0
  56. package/src/cli/handlers/agents.ts +70 -0
  57. package/src/cli/handlers/auth.ts +330 -0
  58. package/src/cli/handlers/autoMode.ts +170 -0
  59. package/src/cli/handlers/mcp.tsx +362 -0
  60. package/src/cli/handlers/plugins.ts +878 -0
  61. package/src/cli/handlers/util.tsx +110 -0
  62. package/src/cli/ndjsonSafeStringify.ts +32 -0
  63. package/src/cli/print.ts +5594 -0
  64. package/src/cli/remoteIO.ts +255 -0
  65. package/src/cli/structuredIO.ts +859 -0
  66. package/src/cli/transports/HybridTransport.ts +282 -0
  67. package/src/cli/transports/SSETransport.ts +711 -0
  68. package/src/cli/transports/SerialBatchEventUploader.ts +275 -0
  69. package/src/cli/transports/WebSocketTransport.ts +800 -0
  70. package/src/cli/transports/WorkerStateUploader.ts +131 -0
  71. package/src/cli/transports/ccrClient.ts +998 -0
  72. package/src/cli/transports/transportUtils.ts +45 -0
  73. package/src/cli/update.ts +422 -0
  74. package/src/commands/add-dir/add-dir.tsx +126 -0
  75. package/src/commands/add-dir/index.ts +11 -0
  76. package/src/commands/add-dir/validation.ts +110 -0
  77. package/src/commands/advisor.ts +109 -0
  78. package/src/commands/agents/agents.tsx +12 -0
  79. package/src/commands/agents/index.ts +10 -0
  80. package/src/commands/ant-trace/index.js +1 -0
  81. package/src/commands/autofix-pr/index.js +1 -0
  82. package/src/commands/backfill-sessions/index.js +1 -0
  83. package/src/commands/branch/branch.ts +296 -0
  84. package/src/commands/branch/index.ts +14 -0
  85. package/src/commands/break-cache/index.js +1 -0
  86. package/src/commands/bridge/bridge.tsx +509 -0
  87. package/src/commands/bridge/index.ts +26 -0
  88. package/src/commands/bridge-kick.ts +200 -0
  89. package/src/commands/brief.ts +130 -0
  90. package/src/commands/btw/btw.tsx +243 -0
  91. package/src/commands/btw/index.ts +13 -0
  92. package/src/commands/bughunter/index.js +1 -0
  93. package/src/commands/chrome/chrome.tsx +285 -0
  94. package/src/commands/chrome/index.ts +13 -0
  95. package/src/commands/clear/caches.ts +144 -0
  96. package/src/commands/clear/clear.ts +7 -0
  97. package/src/commands/clear/conversation.ts +251 -0
  98. package/src/commands/clear/index.ts +19 -0
  99. package/src/commands/color/color.ts +93 -0
  100. package/src/commands/color/index.ts +16 -0
  101. package/src/commands/commit-push-pr.ts +158 -0
  102. package/src/commands/commit.ts +92 -0
  103. package/src/commands/compact/compact.ts +287 -0
  104. package/src/commands/compact/index.ts +15 -0
  105. package/src/commands/config/config.tsx +7 -0
  106. package/src/commands/config/index.ts +11 -0
  107. package/src/commands/context/context-noninteractive.ts +325 -0
  108. package/src/commands/context/context.tsx +64 -0
  109. package/src/commands/context/index.ts +24 -0
  110. package/src/commands/copy/copy.tsx +371 -0
  111. package/src/commands/copy/index.ts +15 -0
  112. package/src/commands/cost/cost.ts +24 -0
  113. package/src/commands/cost/index.ts +23 -0
  114. package/src/commands/createMovedToPluginCommand.ts +65 -0
  115. package/src/commands/ctx_viz/index.js +1 -0
  116. package/src/commands/debug-tool-call/index.js +1 -0
  117. package/src/commands/desktop/desktop.tsx +9 -0
  118. package/src/commands/desktop/index.ts +26 -0
  119. package/src/commands/diff/diff.tsx +9 -0
  120. package/src/commands/diff/index.ts +8 -0
  121. package/src/commands/doctor/doctor.tsx +7 -0
  122. package/src/commands/doctor/index.ts +12 -0
  123. package/src/commands/effort/effort.tsx +183 -0
  124. package/src/commands/effort/index.ts +13 -0
  125. package/src/commands/env/index.js +1 -0
  126. package/src/commands/exit/exit.tsx +33 -0
  127. package/src/commands/exit/index.ts +12 -0
  128. package/src/commands/export/export.tsx +91 -0
  129. package/src/commands/export/index.ts +11 -0
  130. package/src/commands/extra-usage/extra-usage-core.ts +118 -0
  131. package/src/commands/extra-usage/extra-usage-noninteractive.ts +16 -0
  132. package/src/commands/extra-usage/extra-usage.tsx +17 -0
  133. package/src/commands/extra-usage/index.ts +31 -0
  134. package/src/commands/fast/fast.tsx +269 -0
  135. package/src/commands/fast/index.ts +26 -0
  136. package/src/commands/feedback/feedback.tsx +25 -0
  137. package/src/commands/feedback/index.ts +26 -0
  138. package/src/commands/files/files.ts +19 -0
  139. package/src/commands/files/index.ts +12 -0
  140. package/src/commands/good-claude/index.js +1 -0
  141. package/src/commands/heapdump/heapdump.ts +17 -0
  142. package/src/commands/heapdump/index.ts +12 -0
  143. package/src/commands/help/help.tsx +11 -0
  144. package/src/commands/help/index.ts +10 -0
  145. package/src/commands/hooks/hooks.tsx +13 -0
  146. package/src/commands/hooks/index.ts +11 -0
  147. package/src/commands/ide/ide.tsx +646 -0
  148. package/src/commands/ide/index.ts +11 -0
  149. package/src/commands/init-verifiers.ts +262 -0
  150. package/src/commands/init.ts +256 -0
  151. package/src/commands/insights.ts +3200 -0
  152. package/src/commands/install-github-app/ApiKeyStep.tsx +231 -0
  153. package/src/commands/install-github-app/CheckExistingSecretStep.tsx +190 -0
  154. package/src/commands/install-github-app/CheckGitHubStep.tsx +15 -0
  155. package/src/commands/install-github-app/ChooseRepoStep.tsx +211 -0
  156. package/src/commands/install-github-app/CreatingStep.tsx +65 -0
  157. package/src/commands/install-github-app/ErrorStep.tsx +85 -0
  158. package/src/commands/install-github-app/ExistingWorkflowStep.tsx +103 -0
  159. package/src/commands/install-github-app/InstallAppStep.tsx +94 -0
  160. package/src/commands/install-github-app/OAuthFlowStep.tsx +276 -0
  161. package/src/commands/install-github-app/SuccessStep.tsx +96 -0
  162. package/src/commands/install-github-app/WarningsStep.tsx +73 -0
  163. package/src/commands/install-github-app/index.ts +13 -0
  164. package/src/commands/install-github-app/install-github-app.tsx +587 -0
  165. package/src/commands/install-github-app/setupGitHubActions.ts +325 -0
  166. package/src/commands/install-slack-app/index.ts +12 -0
  167. package/src/commands/install-slack-app/install-slack-app.ts +30 -0
  168. package/src/commands/install.tsx +300 -0
  169. package/src/commands/issue/index.js +1 -0
  170. package/src/commands/keybindings/index.ts +13 -0
  171. package/src/commands/keybindings/keybindings.ts +53 -0
  172. package/src/commands/login/index.ts +14 -0
  173. package/src/commands/login/login.tsx +104 -0
  174. package/src/commands/logout/index.ts +10 -0
  175. package/src/commands/logout/logout.tsx +82 -0
  176. package/src/commands/mcp/addCommand.ts +280 -0
  177. package/src/commands/mcp/index.ts +12 -0
  178. package/src/commands/mcp/mcp.tsx +85 -0
  179. package/src/commands/mcp/xaaIdpCommand.ts +266 -0
  180. package/src/commands/memory/index.ts +10 -0
  181. package/src/commands/memory/memory.tsx +90 -0
  182. package/src/commands/mobile/index.ts +11 -0
  183. package/src/commands/mobile/mobile.tsx +274 -0
  184. package/src/commands/mock-limits/index.js +1 -0
  185. package/src/commands/model/index.ts +16 -0
  186. package/src/commands/model/model.tsx +297 -0
  187. package/src/commands/oauth-refresh/index.js +1 -0
  188. package/src/commands/onboarding/index.js +1 -0
  189. package/src/commands/output-style/index.ts +11 -0
  190. package/src/commands/output-style/output-style.tsx +7 -0
  191. package/src/commands/passes/index.ts +22 -0
  192. package/src/commands/passes/passes.tsx +24 -0
  193. package/src/commands/perf-issue/index.js +1 -0
  194. package/src/commands/permissions/index.ts +11 -0
  195. package/src/commands/permissions/permissions.tsx +10 -0
  196. package/src/commands/plan/index.ts +11 -0
  197. package/src/commands/plan/plan.tsx +122 -0
  198. package/src/commands/plugin/AddMarketplace.tsx +162 -0
  199. package/src/commands/plugin/BrowseMarketplace.tsx +802 -0
  200. package/src/commands/plugin/DiscoverPlugins.tsx +781 -0
  201. package/src/commands/plugin/ManageMarketplaces.tsx +838 -0
  202. package/src/commands/plugin/ManagePlugins.tsx +2215 -0
  203. package/src/commands/plugin/PluginErrors.tsx +124 -0
  204. package/src/commands/plugin/PluginOptionsDialog.tsx +357 -0
  205. package/src/commands/plugin/PluginOptionsFlow.tsx +135 -0
  206. package/src/commands/plugin/PluginSettings.tsx +1072 -0
  207. package/src/commands/plugin/PluginTrustWarning.tsx +32 -0
  208. package/src/commands/plugin/UnifiedInstalledCell.tsx +565 -0
  209. package/src/commands/plugin/ValidatePlugin.tsx +98 -0
  210. package/src/commands/plugin/index.tsx +11 -0
  211. package/src/commands/plugin/parseArgs.ts +103 -0
  212. package/src/commands/plugin/plugin.tsx +7 -0
  213. package/src/commands/plugin/pluginDetailsHelpers.tsx +117 -0
  214. package/src/commands/plugin/usePagination.ts +171 -0
  215. package/src/commands/pr_comments/index.ts +50 -0
  216. package/src/commands/privacy-settings/index.ts +14 -0
  217. package/src/commands/privacy-settings/privacy-settings.tsx +58 -0
  218. package/src/commands/rate-limit-options/index.ts +19 -0
  219. package/src/commands/rate-limit-options/rate-limit-options.tsx +210 -0
  220. package/src/commands/release-notes/index.ts +11 -0
  221. package/src/commands/release-notes/release-notes.ts +50 -0
  222. package/src/commands/reload-plugins/index.ts +18 -0
  223. package/src/commands/reload-plugins/reload-plugins.ts +61 -0
  224. package/src/commands/remote-env/index.ts +15 -0
  225. package/src/commands/remote-env/remote-env.tsx +7 -0
  226. package/src/commands/remote-setup/api.ts +182 -0
  227. package/src/commands/remote-setup/index.ts +20 -0
  228. package/src/commands/remote-setup/remote-setup.tsx +187 -0
  229. package/src/commands/rename/generateSessionName.ts +67 -0
  230. package/src/commands/rename/index.ts +12 -0
  231. package/src/commands/rename/rename.ts +87 -0
  232. package/src/commands/reset-limits/index.js +4 -0
  233. package/src/commands/resume/index.ts +12 -0
  234. package/src/commands/resume/resume.tsx +275 -0
  235. package/src/commands/review/UltrareviewOverageDialog.tsx +96 -0
  236. package/src/commands/review/reviewRemote.ts +316 -0
  237. package/src/commands/review/ultrareviewCommand.tsx +58 -0
  238. package/src/commands/review/ultrareviewEnabled.ts +14 -0
  239. package/src/commands/review.ts +57 -0
  240. package/src/commands/rewind/index.ts +13 -0
  241. package/src/commands/rewind/rewind.ts +13 -0
  242. package/src/commands/sandbox-toggle/index.ts +50 -0
  243. package/src/commands/sandbox-toggle/sandbox-toggle.tsx +83 -0
  244. package/src/commands/security-review.ts +243 -0
  245. package/src/commands/session/index.ts +16 -0
  246. package/src/commands/session/session.tsx +140 -0
  247. package/src/commands/share/index.js +1 -0
  248. package/src/commands/skills/index.ts +10 -0
  249. package/src/commands/skills/skills.tsx +8 -0
  250. package/src/commands/stats/index.ts +10 -0
  251. package/src/commands/stats/stats.tsx +7 -0
  252. package/src/commands/status/index.ts +12 -0
  253. package/src/commands/status/status.tsx +8 -0
  254. package/src/commands/statusline.tsx +24 -0
  255. package/src/commands/stickers/index.ts +11 -0
  256. package/src/commands/stickers/stickers.ts +16 -0
  257. package/src/commands/summary/index.js +1 -0
  258. package/src/commands/tag/index.ts +12 -0
  259. package/src/commands/tag/tag.tsx +215 -0
  260. package/src/commands/tasks/index.ts +11 -0
  261. package/src/commands/tasks/tasks.tsx +8 -0
  262. package/src/commands/teleport/index.js +1 -0
  263. package/src/commands/terminalSetup/index.ts +23 -0
  264. package/src/commands/terminalSetup/terminalSetup.tsx +531 -0
  265. package/src/commands/theme/index.ts +10 -0
  266. package/src/commands/theme/theme.tsx +57 -0
  267. package/src/commands/thinkback/index.ts +13 -0
  268. package/src/commands/thinkback/thinkback.tsx +554 -0
  269. package/src/commands/thinkback-play/index.ts +17 -0
  270. package/src/commands/thinkback-play/thinkback-play.ts +43 -0
  271. package/src/commands/ultraplan.tsx +471 -0
  272. package/src/commands/upgrade/index.ts +16 -0
  273. package/src/commands/upgrade/upgrade.tsx +38 -0
  274. package/src/commands/usage/index.ts +9 -0
  275. package/src/commands/usage/usage.tsx +7 -0
  276. package/src/commands/version.ts +22 -0
  277. package/src/commands/vim/index.ts +11 -0
  278. package/src/commands/vim/vim.ts +38 -0
  279. package/src/commands/voice/index.ts +20 -0
  280. package/src/commands/voice/voice.ts +150 -0
  281. package/src/commands.ts +754 -0
  282. package/src/components/AgentProgressLine.tsx +136 -0
  283. package/src/components/App.tsx +56 -0
  284. package/src/components/ApproveApiKey.tsx +123 -0
  285. package/src/components/AutoModeOptInDialog.tsx +142 -0
  286. package/src/components/AutoUpdater.tsx +198 -0
  287. package/src/components/AutoUpdaterWrapper.tsx +91 -0
  288. package/src/components/AwsAuthStatusBox.tsx +82 -0
  289. package/src/components/BaseTextInput.tsx +136 -0
  290. package/src/components/BashModeProgress.tsx +56 -0
  291. package/src/components/BridgeDialog.tsx +401 -0
  292. package/src/components/BypassPermissionsModeDialog.tsx +87 -0
  293. package/src/components/ChannelDowngradeDialog.tsx +102 -0
  294. package/src/components/ClaudeCodeHint/PluginHintMenu.tsx +78 -0
  295. package/src/components/ClaudeInChromeOnboarding.tsx +121 -0
  296. package/src/components/ClaudeMdExternalIncludesDialog.tsx +137 -0
  297. package/src/components/ClickableImageRef.tsx +73 -0
  298. package/src/components/CompactSummary.tsx +118 -0
  299. package/src/components/ConfigurableShortcutHint.tsx +57 -0
  300. package/src/components/ConsoleOAuthFlow.tsx +631 -0
  301. package/src/components/ContextSuggestions.tsx +47 -0
  302. package/src/components/ContextVisualization.tsx +489 -0
  303. package/src/components/CoordinatorAgentStatus.tsx +273 -0
  304. package/src/components/CostThresholdDialog.tsx +50 -0
  305. package/src/components/CtrlOToExpand.tsx +51 -0
  306. package/src/components/CustomSelect/SelectMulti.tsx +213 -0
  307. package/src/components/CustomSelect/index.ts +3 -0
  308. package/src/components/CustomSelect/option-map.ts +50 -0
  309. package/src/components/CustomSelect/select-input-option.tsx +488 -0
  310. package/src/components/CustomSelect/select-option.tsx +68 -0
  311. package/src/components/CustomSelect/select.tsx +690 -0
  312. package/src/components/CustomSelect/use-multi-select-state.ts +414 -0
  313. package/src/components/CustomSelect/use-select-input.ts +287 -0
  314. package/src/components/CustomSelect/use-select-navigation.ts +653 -0
  315. package/src/components/CustomSelect/use-select-state.ts +157 -0
  316. package/src/components/DesktopHandoff.tsx +193 -0
  317. package/src/components/DesktopUpsell/DesktopUpsellStartup.tsx +171 -0
  318. package/src/components/DevBar.tsx +49 -0
  319. package/src/components/DevChannelsDialog.tsx +105 -0
  320. package/src/components/DiagnosticsDisplay.tsx +95 -0
  321. package/src/components/EffortCallout.tsx +265 -0
  322. package/src/components/EffortIndicator.ts +42 -0
  323. package/src/components/ExitFlow.tsx +48 -0
  324. package/src/components/ExportDialog.tsx +128 -0
  325. package/src/components/FallbackToolUseErrorMessage.tsx +116 -0
  326. package/src/components/FallbackToolUseRejectedMessage.tsx +16 -0
  327. package/src/components/FastIcon.tsx +46 -0
  328. package/src/components/Feedback.tsx +592 -0
  329. package/src/components/FeedbackSurvey/FeedbackSurvey.tsx +174 -0
  330. package/src/components/FeedbackSurvey/FeedbackSurveyView.tsx +108 -0
  331. package/src/components/FeedbackSurvey/TranscriptSharePrompt.tsx +88 -0
  332. package/src/components/FeedbackSurvey/submitTranscriptShare.ts +112 -0
  333. package/src/components/FeedbackSurvey/useDebouncedDigitInput.ts +82 -0
  334. package/src/components/FeedbackSurvey/useFeedbackSurvey.tsx +296 -0
  335. package/src/components/FeedbackSurvey/useMemorySurvey.tsx +213 -0
  336. package/src/components/FeedbackSurvey/usePostCompactSurvey.tsx +206 -0
  337. package/src/components/FeedbackSurvey/useSurveyState.tsx +100 -0
  338. package/src/components/FileEditToolDiff.tsx +181 -0
  339. package/src/components/FileEditToolUpdatedMessage.tsx +124 -0
  340. package/src/components/FileEditToolUseRejectedMessage.tsx +170 -0
  341. package/src/components/FilePathLink.tsx +43 -0
  342. package/src/components/FullscreenLayout.tsx +637 -0
  343. package/src/components/GlobalSearchDialog.tsx +343 -0
  344. package/src/components/HelpV2/Commands.tsx +82 -0
  345. package/src/components/HelpV2/General.tsx +23 -0
  346. package/src/components/HelpV2/HelpV2.tsx +184 -0
  347. package/src/components/HighlightedCode/Fallback.tsx +193 -0
  348. package/src/components/HighlightedCode.tsx +190 -0
  349. package/src/components/HistorySearchDialog.tsx +118 -0
  350. package/src/components/IdeAutoConnectDialog.tsx +154 -0
  351. package/src/components/IdeOnboardingDialog.tsx +167 -0
  352. package/src/components/IdeStatusIndicator.tsx +58 -0
  353. package/src/components/IdleReturnDialog.tsx +118 -0
  354. package/src/components/InterruptedByUser.tsx +15 -0
  355. package/src/components/InvalidConfigDialog.tsx +156 -0
  356. package/src/components/InvalidSettingsDialog.tsx +89 -0
  357. package/src/components/KeybindingWarnings.tsx +55 -0
  358. package/src/components/LanguagePicker.tsx +86 -0
  359. package/src/components/LogSelector.tsx +1575 -0
  360. package/src/components/LogoV2/AnimatedAsterisk.tsx +50 -0
  361. package/src/components/LogoV2/AnimatedClawd.tsx +124 -0
  362. package/src/components/LogoV2/ChannelsNotice.tsx +266 -0
  363. package/src/components/LogoV2/Clawd.tsx +240 -0
  364. package/src/components/LogoV2/CondensedLogo.tsx +161 -0
  365. package/src/components/LogoV2/EmergencyTip.tsx +58 -0
  366. package/src/components/LogoV2/Feed.tsx +112 -0
  367. package/src/components/LogoV2/FeedColumn.tsx +59 -0
  368. package/src/components/LogoV2/GuestPassesUpsell.tsx +70 -0
  369. package/src/components/LogoV2/LogoV2.tsx +543 -0
  370. package/src/components/LogoV2/Opus1mMergeNotice.tsx +55 -0
  371. package/src/components/LogoV2/OverageCreditUpsell.tsx +166 -0
  372. package/src/components/LogoV2/VoiceModeNotice.tsx +68 -0
  373. package/src/components/LogoV2/WelcomeV2.tsx +433 -0
  374. package/src/components/LogoV2/feedConfigs.tsx +92 -0
  375. package/src/components/LspRecommendation/LspRecommendationMenu.tsx +88 -0
  376. package/src/components/MCPServerApprovalDialog.tsx +115 -0
  377. package/src/components/MCPServerDesktopImportDialog.tsx +203 -0
  378. package/src/components/MCPServerDialogCopy.tsx +15 -0
  379. package/src/components/MCPServerMultiselectDialog.tsx +133 -0
  380. package/src/components/ManagedSettingsSecurityDialog/ManagedSettingsSecurityDialog.tsx +149 -0
  381. package/src/components/ManagedSettingsSecurityDialog/utils.ts +144 -0
  382. package/src/components/Markdown.tsx +236 -0
  383. package/src/components/MarkdownTable.tsx +322 -0
  384. package/src/components/MemoryUsageIndicator.tsx +37 -0
  385. package/src/components/Message.tsx +627 -0
  386. package/src/components/MessageModel.tsx +43 -0
  387. package/src/components/MessageResponse.tsx +78 -0
  388. package/src/components/MessageRow.tsx +383 -0
  389. package/src/components/MessageSelector.tsx +831 -0
  390. package/src/components/MessageTimestamp.tsx +63 -0
  391. package/src/components/Messages.tsx +834 -0
  392. package/src/components/ModelPicker.tsx +448 -0
  393. package/src/components/NativeAutoUpdater.tsx +193 -0
  394. package/src/components/NotebookEditToolUseRejectedMessage.tsx +92 -0
  395. package/src/components/OffscreenFreeze.tsx +44 -0
  396. package/src/components/Onboarding.tsx +244 -0
  397. package/src/components/OutputStylePicker.tsx +112 -0
  398. package/src/components/PackageManagerAutoUpdater.tsx +104 -0
  399. package/src/components/Passes/Passes.tsx +184 -0
  400. package/src/components/PrBadge.tsx +97 -0
  401. package/src/components/PressEnterToContinue.tsx +15 -0
  402. package/src/components/PromptInput/HistorySearchInput.tsx +51 -0
  403. package/src/components/PromptInput/IssueFlagBanner.tsx +12 -0
  404. package/src/components/PromptInput/Notifications.tsx +332 -0
  405. package/src/components/PromptInput/PromptInput.tsx +2339 -0
  406. package/src/components/PromptInput/PromptInputFooter.tsx +191 -0
  407. package/src/components/PromptInput/PromptInputFooterLeftSide.tsx +517 -0
  408. package/src/components/PromptInput/PromptInputFooterSuggestions.tsx +293 -0
  409. package/src/components/PromptInput/PromptInputHelpMenu.tsx +358 -0
  410. package/src/components/PromptInput/PromptInputModeIndicator.tsx +93 -0
  411. package/src/components/PromptInput/PromptInputQueuedCommands.tsx +117 -0
  412. package/src/components/PromptInput/PromptInputStashNotice.tsx +25 -0
  413. package/src/components/PromptInput/SandboxPromptFooterHint.tsx +64 -0
  414. package/src/components/PromptInput/ShimmeredInput.tsx +143 -0
  415. package/src/components/PromptInput/VoiceIndicator.tsx +137 -0
  416. package/src/components/PromptInput/inputModes.ts +33 -0
  417. package/src/components/PromptInput/inputPaste.ts +90 -0
  418. package/src/components/PromptInput/useMaybeTruncateInput.ts +58 -0
  419. package/src/components/PromptInput/usePromptInputPlaceholder.ts +76 -0
  420. package/src/components/PromptInput/useShowFastIconHint.ts +31 -0
  421. package/src/components/PromptInput/useSwarmBanner.ts +155 -0
  422. package/src/components/PromptInput/utils.ts +60 -0
  423. package/src/components/QuickOpenDialog.tsx +244 -0
  424. package/src/components/RemoteCallout.tsx +76 -0
  425. package/src/components/RemoteEnvironmentDialog.tsx +340 -0
  426. package/src/components/ResumeTask.tsx +268 -0
  427. package/src/components/SandboxViolationExpandedView.tsx +99 -0
  428. package/src/components/ScrollKeybindingHandler.tsx +1012 -0
  429. package/src/components/SearchBox.tsx +72 -0
  430. package/src/components/SentryErrorBoundary.ts +28 -0
  431. package/src/components/SessionBackgroundHint.tsx +108 -0
  432. package/src/components/SessionPreview.tsx +194 -0
  433. package/src/components/Settings/Config.tsx +1822 -0
  434. package/src/components/Settings/Settings.tsx +137 -0
  435. package/src/components/Settings/Status.tsx +241 -0
  436. package/src/components/Settings/Usage.tsx +377 -0
  437. package/src/components/ShowInIDEPrompt.tsx +170 -0
  438. package/src/components/SkillImprovementSurvey.tsx +152 -0
  439. package/src/components/Spinner/FlashingChar.tsx +61 -0
  440. package/src/components/Spinner/GlimmerMessage.tsx +328 -0
  441. package/src/components/Spinner/ShimmerChar.tsx +36 -0
  442. package/src/components/Spinner/SpinnerAnimationRow.tsx +265 -0
  443. package/src/components/Spinner/SpinnerGlyph.tsx +80 -0
  444. package/src/components/Spinner/TeammateSpinnerLine.tsx +233 -0
  445. package/src/components/Spinner/TeammateSpinnerTree.tsx +272 -0
  446. package/src/components/Spinner/index.ts +10 -0
  447. package/src/components/Spinner/teammateSelectHint.ts +1 -0
  448. package/src/components/Spinner/useShimmerAnimation.ts +31 -0
  449. package/src/components/Spinner/useStalledAnimation.ts +75 -0
  450. package/src/components/Spinner/utils.ts +84 -0
  451. package/src/components/Spinner.tsx +562 -0
  452. package/src/components/Stats.tsx +1228 -0
  453. package/src/components/StatusLine.tsx +324 -0
  454. package/src/components/StatusNotices.tsx +55 -0
  455. package/src/components/StructuredDiff/Fallback.tsx +487 -0
  456. package/src/components/StructuredDiff/colorDiff.ts +37 -0
  457. package/src/components/StructuredDiff.tsx +190 -0
  458. package/src/components/StructuredDiffList.tsx +30 -0
  459. package/src/components/TagTabs.tsx +139 -0
  460. package/src/components/TaskListV2.tsx +378 -0
  461. package/src/components/TeammateViewHeader.tsx +82 -0
  462. package/src/components/TeleportError.tsx +189 -0
  463. package/src/components/TeleportProgress.tsx +140 -0
  464. package/src/components/TeleportRepoMismatchDialog.tsx +104 -0
  465. package/src/components/TeleportResumeWrapper.tsx +167 -0
  466. package/src/components/TeleportStash.tsx +116 -0
  467. package/src/components/TextInput.tsx +124 -0
  468. package/src/components/ThemePicker.tsx +333 -0
  469. package/src/components/ThinkingToggle.tsx +153 -0
  470. package/src/components/TokenWarning.tsx +179 -0
  471. package/src/components/ToolUseLoader.tsx +42 -0
  472. package/src/components/TrustDialog/TrustDialog.tsx +290 -0
  473. package/src/components/TrustDialog/utils.ts +245 -0
  474. package/src/components/ValidationErrorsList.tsx +148 -0
  475. package/src/components/VimTextInput.tsx +140 -0
  476. package/src/components/VirtualMessageList.tsx +1082 -0
  477. package/src/components/WorkflowMultiselectDialog.tsx +128 -0
  478. package/src/components/WorktreeExitDialog.tsx +231 -0
  479. package/src/components/agents/AgentDetail.tsx +220 -0
  480. package/src/components/agents/AgentEditor.tsx +178 -0
  481. package/src/components/agents/AgentNavigationFooter.tsx +26 -0
  482. package/src/components/agents/AgentsList.tsx +440 -0
  483. package/src/components/agents/AgentsMenu.tsx +800 -0
  484. package/src/components/agents/ColorPicker.tsx +112 -0
  485. package/src/components/agents/ModelSelector.tsx +68 -0
  486. package/src/components/agents/ToolSelector.tsx +562 -0
  487. package/src/components/agents/agentFileUtils.ts +272 -0
  488. package/src/components/agents/generateAgent.ts +197 -0
  489. package/src/components/agents/new-agent-creation/CreateAgentWizard.tsx +97 -0
  490. package/src/components/agents/new-agent-creation/wizard-steps/ColorStep.tsx +84 -0
  491. package/src/components/agents/new-agent-creation/wizard-steps/ConfirmStep.tsx +378 -0
  492. package/src/components/agents/new-agent-creation/wizard-steps/ConfirmStepWrapper.tsx +74 -0
  493. package/src/components/agents/new-agent-creation/wizard-steps/DescriptionStep.tsx +123 -0
  494. package/src/components/agents/new-agent-creation/wizard-steps/GenerateStep.tsx +143 -0
  495. package/src/components/agents/new-agent-creation/wizard-steps/LocationStep.tsx +80 -0
  496. package/src/components/agents/new-agent-creation/wizard-steps/MemoryStep.tsx +113 -0
  497. package/src/components/agents/new-agent-creation/wizard-steps/MethodStep.tsx +80 -0
  498. package/src/components/agents/new-agent-creation/wizard-steps/ModelStep.tsx +52 -0
  499. package/src/components/agents/new-agent-creation/wizard-steps/PromptStep.tsx +128 -0
  500. package/src/components/agents/new-agent-creation/wizard-steps/ToolsStep.tsx +61 -0
  501. package/src/components/agents/new-agent-creation/wizard-steps/TypeStep.tsx +103 -0
  502. package/src/components/agents/types.ts +27 -0
  503. package/src/components/agents/utils.ts +18 -0
  504. package/src/components/agents/validateAgent.ts +109 -0
  505. package/src/components/design-system/Byline.tsx +77 -0
  506. package/src/components/design-system/Dialog.tsx +138 -0
  507. package/src/components/design-system/Divider.tsx +149 -0
  508. package/src/components/design-system/FuzzyPicker.tsx +312 -0
  509. package/src/components/design-system/KeyboardShortcutHint.tsx +81 -0
  510. package/src/components/design-system/ListItem.tsx +244 -0
  511. package/src/components/design-system/LoadingState.tsx +94 -0
  512. package/src/components/design-system/Pane.tsx +77 -0
  513. package/src/components/design-system/ProgressBar.tsx +86 -0
  514. package/src/components/design-system/Ratchet.tsx +80 -0
  515. package/src/components/design-system/StatusIcon.tsx +95 -0
  516. package/src/components/design-system/Tabs.tsx +340 -0
  517. package/src/components/design-system/ThemeProvider.tsx +174 -0
  518. package/src/components/design-system/ThemedBox.tsx +156 -0
  519. package/src/components/design-system/ThemedText.tsx +124 -0
  520. package/src/components/design-system/color.ts +30 -0
  521. package/src/components/diff/DiffDetailView.tsx +281 -0
  522. package/src/components/diff/DiffDialog.tsx +383 -0
  523. package/src/components/diff/DiffFileList.tsx +292 -0
  524. package/src/components/grove/Grove.tsx +463 -0
  525. package/src/components/hooks/HooksConfigMenu.tsx +578 -0
  526. package/src/components/hooks/PromptDialog.tsx +90 -0
  527. package/src/components/hooks/SelectEventMode.tsx +127 -0
  528. package/src/components/hooks/SelectHookMode.tsx +112 -0
  529. package/src/components/hooks/SelectMatcherMode.tsx +144 -0
  530. package/src/components/hooks/ViewHookMode.tsx +199 -0
  531. package/src/components/mcp/CapabilitiesSection.tsx +61 -0
  532. package/src/components/mcp/ElicitationDialog.tsx +1169 -0
  533. package/src/components/mcp/MCPAgentServerMenu.tsx +183 -0
  534. package/src/components/mcp/MCPListPanel.tsx +504 -0
  535. package/src/components/mcp/MCPReconnect.tsx +167 -0
  536. package/src/components/mcp/MCPRemoteServerMenu.tsx +649 -0
  537. package/src/components/mcp/MCPSettings.tsx +398 -0
  538. package/src/components/mcp/MCPStdioServerMenu.tsx +177 -0
  539. package/src/components/mcp/MCPToolDetailView.tsx +212 -0
  540. package/src/components/mcp/MCPToolListView.tsx +141 -0
  541. package/src/components/mcp/McpParsingWarnings.tsx +213 -0
  542. package/src/components/mcp/index.ts +9 -0
  543. package/src/components/mcp/utils/reconnectHelpers.tsx +49 -0
  544. package/src/components/memory/MemoryFileSelector.tsx +438 -0
  545. package/src/components/memory/MemoryUpdateNotification.tsx +45 -0
  546. package/src/components/messageActions.tsx +450 -0
  547. package/src/components/messages/AdvisorMessage.tsx +158 -0
  548. package/src/components/messages/AssistantRedactedThinkingMessage.tsx +31 -0
  549. package/src/components/messages/AssistantTextMessage.tsx +270 -0
  550. package/src/components/messages/AssistantThinkingMessage.tsx +86 -0
  551. package/src/components/messages/AssistantToolUseMessage.tsx +368 -0
  552. package/src/components/messages/AttachmentMessage.tsx +536 -0
  553. package/src/components/messages/CollapsedReadSearchContent.tsx +484 -0
  554. package/src/components/messages/CompactBoundaryMessage.tsx +18 -0
  555. package/src/components/messages/GroupedToolUseContent.tsx +58 -0
  556. package/src/components/messages/HighlightedThinkingText.tsx +162 -0
  557. package/src/components/messages/HookProgressMessage.tsx +116 -0
  558. package/src/components/messages/PlanApprovalMessage.tsx +222 -0
  559. package/src/components/messages/RateLimitMessage.tsx +161 -0
  560. package/src/components/messages/ShutdownMessage.tsx +132 -0
  561. package/src/components/messages/SystemAPIErrorMessage.tsx +141 -0
  562. package/src/components/messages/SystemTextMessage.tsx +827 -0
  563. package/src/components/messages/TaskAssignmentMessage.tsx +76 -0
  564. package/src/components/messages/UserAgentNotificationMessage.tsx +83 -0
  565. package/src/components/messages/UserBashInputMessage.tsx +58 -0
  566. package/src/components/messages/UserBashOutputMessage.tsx +54 -0
  567. package/src/components/messages/UserChannelMessage.tsx +137 -0
  568. package/src/components/messages/UserCommandMessage.tsx +108 -0
  569. package/src/components/messages/UserImageMessage.tsx +59 -0
  570. package/src/components/messages/UserLocalCommandOutputMessage.tsx +167 -0
  571. package/src/components/messages/UserMemoryInputMessage.tsx +75 -0
  572. package/src/components/messages/UserPlanMessage.tsx +42 -0
  573. package/src/components/messages/UserPromptMessage.tsx +80 -0
  574. package/src/components/messages/UserResourceUpdateMessage.tsx +121 -0
  575. package/src/components/messages/UserTeammateMessage.tsx +206 -0
  576. package/src/components/messages/UserTextMessage.tsx +275 -0
  577. package/src/components/messages/UserToolResultMessage/RejectedPlanMessage.tsx +31 -0
  578. package/src/components/messages/UserToolResultMessage/RejectedToolUseMessage.tsx +16 -0
  579. package/src/components/messages/UserToolResultMessage/UserToolCanceledMessage.tsx +16 -0
  580. package/src/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +103 -0
  581. package/src/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +95 -0
  582. package/src/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +106 -0
  583. package/src/components/messages/UserToolResultMessage/UserToolSuccessMessage.tsx +104 -0
  584. package/src/components/messages/UserToolResultMessage/utils.tsx +44 -0
  585. package/src/components/messages/nullRenderingAttachments.ts +70 -0
  586. package/src/components/messages/teamMemCollapsed.tsx +140 -0
  587. package/src/components/messages/teamMemSaved.ts +19 -0
  588. package/src/components/permissions/AskUserQuestionPermissionRequest/AskUserQuestionPermissionRequest.tsx +645 -0
  589. package/src/components/permissions/AskUserQuestionPermissionRequest/PreviewBox.tsx +229 -0
  590. package/src/components/permissions/AskUserQuestionPermissionRequest/PreviewQuestionView.tsx +328 -0
  591. package/src/components/permissions/AskUserQuestionPermissionRequest/QuestionNavigationBar.tsx +178 -0
  592. package/src/components/permissions/AskUserQuestionPermissionRequest/QuestionView.tsx +465 -0
  593. package/src/components/permissions/AskUserQuestionPermissionRequest/SubmitQuestionsView.tsx +144 -0
  594. package/src/components/permissions/AskUserQuestionPermissionRequest/use-multiple-choice-state.ts +179 -0
  595. package/src/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +482 -0
  596. package/src/components/permissions/BashPermissionRequest/bashToolUseOptions.tsx +147 -0
  597. package/src/components/permissions/ComputerUseApproval/ComputerUseApproval.tsx +441 -0
  598. package/src/components/permissions/EnterPlanModePermissionRequest/EnterPlanModePermissionRequest.tsx +122 -0
  599. package/src/components/permissions/ExitPlanModePermissionRequest/ExitPlanModePermissionRequest.tsx +768 -0
  600. package/src/components/permissions/FallbackPermissionRequest.tsx +333 -0
  601. package/src/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +182 -0
  602. package/src/components/permissions/FilePermissionDialog/FilePermissionDialog.tsx +204 -0
  603. package/src/components/permissions/FilePermissionDialog/ideDiffConfig.ts +42 -0
  604. package/src/components/permissions/FilePermissionDialog/permissionOptions.tsx +177 -0
  605. package/src/components/permissions/FilePermissionDialog/useFilePermissionDialog.ts +212 -0
  606. package/src/components/permissions/FilePermissionDialog/usePermissionHandler.ts +185 -0
  607. package/src/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +161 -0
  608. package/src/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +89 -0
  609. package/src/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +115 -0
  610. package/src/components/permissions/NotebookEditPermissionRequest/NotebookEditPermissionRequest.tsx +166 -0
  611. package/src/components/permissions/NotebookEditPermissionRequest/NotebookEditToolDiff.tsx +235 -0
  612. package/src/components/permissions/PermissionDecisionDebugInfo.tsx +460 -0
  613. package/src/components/permissions/PermissionDialog.tsx +72 -0
  614. package/src/components/permissions/PermissionExplanation.tsx +272 -0
  615. package/src/components/permissions/PermissionPrompt.tsx +336 -0
  616. package/src/components/permissions/PermissionRequest.tsx +217 -0
  617. package/src/components/permissions/PermissionRequestTitle.tsx +66 -0
  618. package/src/components/permissions/PermissionRuleExplanation.tsx +121 -0
  619. package/src/components/permissions/PowerShellPermissionRequest/PowerShellPermissionRequest.tsx +235 -0
  620. package/src/components/permissions/PowerShellPermissionRequest/powershellToolUseOptions.tsx +91 -0
  621. package/src/components/permissions/SandboxPermissionRequest.tsx +163 -0
  622. package/src/components/permissions/SedEditPermissionRequest/SedEditPermissionRequest.tsx +230 -0
  623. package/src/components/permissions/SkillPermissionRequest/SkillPermissionRequest.tsx +369 -0
  624. package/src/components/permissions/WebFetchPermissionRequest/WebFetchPermissionRequest.tsx +258 -0
  625. package/src/components/permissions/WorkerBadge.tsx +49 -0
  626. package/src/components/permissions/WorkerPendingPermission.tsx +105 -0
  627. package/src/components/permissions/hooks.ts +209 -0
  628. package/src/components/permissions/rules/AddPermissionRules.tsx +180 -0
  629. package/src/components/permissions/rules/AddWorkspaceDirectory.tsx +340 -0
  630. package/src/components/permissions/rules/PermissionRuleDescription.tsx +76 -0
  631. package/src/components/permissions/rules/PermissionRuleInput.tsx +138 -0
  632. package/src/components/permissions/rules/PermissionRuleList.tsx +1179 -0
  633. package/src/components/permissions/rules/RecentDenialsTab.tsx +207 -0
  634. package/src/components/permissions/rules/RemoveWorkspaceDirectory.tsx +110 -0
  635. package/src/components/permissions/rules/WorkspaceTab.tsx +150 -0
  636. package/src/components/permissions/shellPermissionHelpers.tsx +164 -0
  637. package/src/components/permissions/useShellPermissionFeedback.ts +148 -0
  638. package/src/components/permissions/utils.ts +25 -0
  639. package/src/components/sandbox/SandboxConfigTab.tsx +45 -0
  640. package/src/components/sandbox/SandboxDependenciesTab.tsx +120 -0
  641. package/src/components/sandbox/SandboxDoctorSection.tsx +46 -0
  642. package/src/components/sandbox/SandboxOverridesTab.tsx +193 -0
  643. package/src/components/sandbox/SandboxSettings.tsx +296 -0
  644. package/src/components/shell/ExpandShellOutputContext.tsx +36 -0
  645. package/src/components/shell/OutputLine.tsx +118 -0
  646. package/src/components/shell/ShellProgressMessage.tsx +150 -0
  647. package/src/components/shell/ShellTimeDisplay.tsx +74 -0
  648. package/src/components/skills/SkillsMenu.tsx +237 -0
  649. package/src/components/tasks/AsyncAgentDetailDialog.tsx +229 -0
  650. package/src/components/tasks/BackgroundTask.tsx +345 -0
  651. package/src/components/tasks/BackgroundTaskStatus.tsx +429 -0
  652. package/src/components/tasks/BackgroundTasksDialog.tsx +652 -0
  653. package/src/components/tasks/DreamDetailDialog.tsx +251 -0
  654. package/src/components/tasks/InProcessTeammateDetailDialog.tsx +266 -0
  655. package/src/components/tasks/RemoteSessionDetailDialog.tsx +904 -0
  656. package/src/components/tasks/RemoteSessionProgress.tsx +243 -0
  657. package/src/components/tasks/ShellDetailDialog.tsx +404 -0
  658. package/src/components/tasks/ShellProgress.tsx +87 -0
  659. package/src/components/tasks/renderToolActivity.tsx +33 -0
  660. package/src/components/tasks/taskStatusUtils.tsx +107 -0
  661. package/src/components/teams/TeamStatus.tsx +80 -0
  662. package/src/components/teams/TeamsDialog.tsx +715 -0
  663. package/src/components/ui/OrderedList.tsx +71 -0
  664. package/src/components/ui/OrderedListItem.tsx +45 -0
  665. package/src/components/ui/TreeSelect.tsx +397 -0
  666. package/src/components/wizard/WizardDialogLayout.tsx +65 -0
  667. package/src/components/wizard/WizardNavigationFooter.tsx +24 -0
  668. package/src/components/wizard/WizardProvider.tsx +213 -0
  669. package/src/components/wizard/index.ts +9 -0
  670. package/src/components/wizard/useWizard.ts +13 -0
  671. package/src/constants/apiLimits.ts +94 -0
  672. package/src/constants/betas.ts +52 -0
  673. package/src/constants/common.ts +33 -0
  674. package/src/constants/cyberRiskInstruction.ts +24 -0
  675. package/src/constants/errorIds.ts +15 -0
  676. package/src/constants/figures.ts +45 -0
  677. package/src/constants/files.ts +156 -0
  678. package/src/constants/github-app.ts +144 -0
  679. package/src/constants/keys.ts +11 -0
  680. package/src/constants/messages.ts +1 -0
  681. package/src/constants/oauth.ts +234 -0
  682. package/src/constants/outputStyles.ts +216 -0
  683. package/src/constants/product.ts +76 -0
  684. package/src/constants/prompts.ts +914 -0
  685. package/src/constants/spinnerVerbs.ts +204 -0
  686. package/src/constants/system.ts +95 -0
  687. package/src/constants/systemPromptSections.ts +68 -0
  688. package/src/constants/toolLimits.ts +56 -0
  689. package/src/constants/tools.ts +112 -0
  690. package/src/constants/turnCompletionVerbs.ts +12 -0
  691. package/src/constants/xml.ts +86 -0
  692. package/src/context/QueuedMessageContext.tsx +63 -0
  693. package/src/context/fpsMetrics.tsx +30 -0
  694. package/src/context/mailbox.tsx +38 -0
  695. package/src/context/modalContext.tsx +58 -0
  696. package/src/context/notifications.tsx +240 -0
  697. package/src/context/overlayContext.tsx +151 -0
  698. package/src/context/promptOverlayContext.tsx +125 -0
  699. package/src/context/stats.tsx +220 -0
  700. package/src/context/voice.tsx +88 -0
  701. package/src/context.ts +189 -0
  702. package/src/coordinator/coordinatorMode.ts +369 -0
  703. package/src/cost-tracker.ts +323 -0
  704. package/src/costHook.ts +22 -0
  705. package/src/dialogLaunchers.tsx +133 -0
  706. package/src/entrypoints/agentSdkTypes.ts +443 -0
  707. package/src/entrypoints/cli.tsx +303 -0
  708. package/src/entrypoints/init.ts +340 -0
  709. package/src/entrypoints/mcp.ts +196 -0
  710. package/src/entrypoints/sandboxTypes.ts +156 -0
  711. package/src/entrypoints/sdk/controlSchemas.ts +663 -0
  712. package/src/entrypoints/sdk/coreSchemas.ts +1889 -0
  713. package/src/entrypoints/sdk/coreTypes.ts +62 -0
  714. package/src/history.ts +464 -0
  715. package/src/hooks/fileSuggestions.ts +811 -0
  716. package/src/hooks/notifs/useAutoModeUnavailableNotification.ts +56 -0
  717. package/src/hooks/notifs/useCanSwitchToExistingSubscription.tsx +60 -0
  718. package/src/hooks/notifs/useDeprecationWarningNotification.tsx +44 -0
  719. package/src/hooks/notifs/useFastModeNotification.tsx +162 -0
  720. package/src/hooks/notifs/useIDEStatusIndicator.tsx +186 -0
  721. package/src/hooks/notifs/useInstallMessages.tsx +26 -0
  722. package/src/hooks/notifs/useLspInitializationNotification.tsx +143 -0
  723. package/src/hooks/notifs/useMcpConnectivityStatus.tsx +88 -0
  724. package/src/hooks/notifs/useModelMigrationNotifications.tsx +52 -0
  725. package/src/hooks/notifs/useNpmDeprecationNotification.tsx +25 -0
  726. package/src/hooks/notifs/usePluginAutoupdateNotification.tsx +83 -0
  727. package/src/hooks/notifs/usePluginInstallationStatus.tsx +128 -0
  728. package/src/hooks/notifs/useRateLimitWarningNotification.tsx +114 -0
  729. package/src/hooks/notifs/useSettingsErrors.tsx +69 -0
  730. package/src/hooks/notifs/useStartupNotification.ts +41 -0
  731. package/src/hooks/notifs/useTeammateShutdownNotification.ts +78 -0
  732. package/src/hooks/renderPlaceholder.ts +51 -0
  733. package/src/hooks/toolPermission/PermissionContext.ts +388 -0
  734. package/src/hooks/toolPermission/handlers/coordinatorHandler.ts +65 -0
  735. package/src/hooks/toolPermission/handlers/interactiveHandler.ts +536 -0
  736. package/src/hooks/toolPermission/handlers/swarmWorkerHandler.ts +159 -0
  737. package/src/hooks/toolPermission/permissionLogging.ts +238 -0
  738. package/src/hooks/unifiedSuggestions.ts +202 -0
  739. package/src/hooks/useAfterFirstRender.ts +17 -0
  740. package/src/hooks/useApiKeyVerification.ts +84 -0
  741. package/src/hooks/useArrowKeyHistory.tsx +229 -0
  742. package/src/hooks/useAssistantHistory.ts +250 -0
  743. package/src/hooks/useAwaySummary.ts +125 -0
  744. package/src/hooks/useBackgroundTaskNavigation.ts +251 -0
  745. package/src/hooks/useBlink.ts +34 -0
  746. package/src/hooks/useCanUseTool.tsx +204 -0
  747. package/src/hooks/useCancelRequest.ts +276 -0
  748. package/src/hooks/useChromeExtensionNotification.tsx +50 -0
  749. package/src/hooks/useClaudeCodeHintRecommendation.tsx +129 -0
  750. package/src/hooks/useClipboardImageHint.ts +77 -0
  751. package/src/hooks/useCommandKeybindings.tsx +108 -0
  752. package/src/hooks/useCommandQueue.ts +15 -0
  753. package/src/hooks/useCopyOnSelect.ts +98 -0
  754. package/src/hooks/useDeferredHookMessages.ts +46 -0
  755. package/src/hooks/useDiffData.ts +110 -0
  756. package/src/hooks/useDiffInIDE.ts +379 -0
  757. package/src/hooks/useDirectConnect.ts +229 -0
  758. package/src/hooks/useDoublePress.ts +62 -0
  759. package/src/hooks/useDynamicConfig.ts +22 -0
  760. package/src/hooks/useElapsedTime.ts +37 -0
  761. package/src/hooks/useExitOnCtrlCD.ts +95 -0
  762. package/src/hooks/useExitOnCtrlCDWithKeybindings.ts +24 -0
  763. package/src/hooks/useFileHistorySnapshotInit.ts +25 -0
  764. package/src/hooks/useGlobalKeybindings.tsx +249 -0
  765. package/src/hooks/useHistorySearch.ts +303 -0
  766. package/src/hooks/useIDEIntegration.tsx +70 -0
  767. package/src/hooks/useIdeAtMentioned.ts +76 -0
  768. package/src/hooks/useIdeConnectionStatus.ts +33 -0
  769. package/src/hooks/useIdeLogging.ts +41 -0
  770. package/src/hooks/useIdeSelection.ts +150 -0
  771. package/src/hooks/useInboxPoller.ts +969 -0
  772. package/src/hooks/useInputBuffer.ts +132 -0
  773. package/src/hooks/useIssueFlagBanner.ts +133 -0
  774. package/src/hooks/useLogMessages.ts +119 -0
  775. package/src/hooks/useLspPluginRecommendation.tsx +194 -0
  776. package/src/hooks/useMailboxBridge.ts +21 -0
  777. package/src/hooks/useMainLoopModel.ts +34 -0
  778. package/src/hooks/useManagePlugins.ts +304 -0
  779. package/src/hooks/useMemoryUsage.ts +39 -0
  780. package/src/hooks/useMergedClients.ts +23 -0
  781. package/src/hooks/useMergedCommands.ts +15 -0
  782. package/src/hooks/useMergedTools.ts +44 -0
  783. package/src/hooks/useMinDisplayTime.ts +35 -0
  784. package/src/hooks/useNotifyAfterTimeout.ts +65 -0
  785. package/src/hooks/useOfficialMarketplaceNotification.tsx +48 -0
  786. package/src/hooks/usePasteHandler.ts +285 -0
  787. package/src/hooks/usePluginRecommendationBase.tsx +105 -0
  788. package/src/hooks/usePrStatus.ts +106 -0
  789. package/src/hooks/usePromptSuggestion.ts +177 -0
  790. package/src/hooks/usePromptsFromClaudeInChrome.tsx +71 -0
  791. package/src/hooks/useQueueProcessor.ts +68 -0
  792. package/src/hooks/useRemoteSession.ts +605 -0
  793. package/src/hooks/useReplBridge.tsx +723 -0
  794. package/src/hooks/useSSHSession.ts +241 -0
  795. package/src/hooks/useScheduledTasks.ts +139 -0
  796. package/src/hooks/useSearchInput.ts +364 -0
  797. package/src/hooks/useSessionBackgrounding.ts +158 -0
  798. package/src/hooks/useSettings.ts +17 -0
  799. package/src/hooks/useSettingsChange.ts +25 -0
  800. package/src/hooks/useSkillImprovementSurvey.ts +105 -0
  801. package/src/hooks/useSkillsChange.ts +62 -0
  802. package/src/hooks/useSwarmInitialization.ts +81 -0
  803. package/src/hooks/useSwarmPermissionPoller.ts +330 -0
  804. package/src/hooks/useTaskListWatcher.ts +221 -0
  805. package/src/hooks/useTasksV2.ts +250 -0
  806. package/src/hooks/useTeammateViewAutoExit.ts +63 -0
  807. package/src/hooks/useTeleportResume.tsx +85 -0
  808. package/src/hooks/useTerminalSize.ts +15 -0
  809. package/src/hooks/useTextInput.ts +529 -0
  810. package/src/hooks/useTimeout.ts +14 -0
  811. package/src/hooks/useTurnDiffs.ts +213 -0
  812. package/src/hooks/useTypeahead.tsx +1385 -0
  813. package/src/hooks/useUpdateNotification.ts +34 -0
  814. package/src/hooks/useVimInput.ts +316 -0
  815. package/src/hooks/useVirtualScroll.ts +721 -0
  816. package/src/hooks/useVoice.ts +1144 -0
  817. package/src/hooks/useVoiceEnabled.ts +25 -0
  818. package/src/hooks/useVoiceIntegration.tsx +677 -0
  819. package/src/ink/Ansi.tsx +292 -0
  820. package/src/ink/bidi.ts +139 -0
  821. package/src/ink/clearTerminal.ts +74 -0
  822. package/src/ink/colorize.ts +231 -0
  823. package/src/ink/components/AlternateScreen.tsx +80 -0
  824. package/src/ink/components/App.tsx +659 -0
  825. package/src/ink/components/AppContext.ts +21 -0
  826. package/src/ink/components/Box.tsx +214 -0
  827. package/src/ink/components/Button.tsx +192 -0
  828. package/src/ink/components/ClockContext.tsx +112 -0
  829. package/src/ink/components/CursorDeclarationContext.ts +32 -0
  830. package/src/ink/components/ErrorOverview.tsx +109 -0
  831. package/src/ink/components/Link.tsx +42 -0
  832. package/src/ink/components/Newline.tsx +39 -0
  833. package/src/ink/components/NoSelect.tsx +68 -0
  834. package/src/ink/components/RawAnsi.tsx +57 -0
  835. package/src/ink/components/ScrollBox.tsx +237 -0
  836. package/src/ink/components/Spacer.tsx +20 -0
  837. package/src/ink/components/StdinContext.ts +49 -0
  838. package/src/ink/components/TerminalFocusContext.tsx +52 -0
  839. package/src/ink/components/TerminalSizeContext.tsx +7 -0
  840. package/src/ink/components/Text.tsx +254 -0
  841. package/src/ink/constants.ts +2 -0
  842. package/src/ink/dom.ts +484 -0
  843. package/src/ink/events/click-event.ts +38 -0
  844. package/src/ink/events/dispatcher.ts +233 -0
  845. package/src/ink/events/emitter.ts +39 -0
  846. package/src/ink/events/event-handlers.ts +73 -0
  847. package/src/ink/events/event.ts +11 -0
  848. package/src/ink/events/focus-event.ts +21 -0
  849. package/src/ink/events/input-event.ts +205 -0
  850. package/src/ink/events/keyboard-event.ts +51 -0
  851. package/src/ink/events/terminal-event.ts +107 -0
  852. package/src/ink/events/terminal-focus-event.ts +19 -0
  853. package/src/ink/focus.ts +181 -0
  854. package/src/ink/frame.ts +124 -0
  855. package/src/ink/get-max-width.ts +27 -0
  856. package/src/ink/hit-test.ts +130 -0
  857. package/src/ink/hooks/use-animation-frame.ts +57 -0
  858. package/src/ink/hooks/use-app.ts +8 -0
  859. package/src/ink/hooks/use-declared-cursor.ts +73 -0
  860. package/src/ink/hooks/use-input.ts +92 -0
  861. package/src/ink/hooks/use-interval.ts +67 -0
  862. package/src/ink/hooks/use-search-highlight.ts +53 -0
  863. package/src/ink/hooks/use-selection.ts +104 -0
  864. package/src/ink/hooks/use-stdin.ts +8 -0
  865. package/src/ink/hooks/use-tab-status.ts +72 -0
  866. package/src/ink/hooks/use-terminal-focus.ts +16 -0
  867. package/src/ink/hooks/use-terminal-title.ts +31 -0
  868. package/src/ink/hooks/use-terminal-viewport.ts +96 -0
  869. package/src/ink/ink.tsx +1728 -0
  870. package/src/ink/instances.ts +10 -0
  871. package/src/ink/layout/engine.ts +6 -0
  872. package/src/ink/layout/geometry.ts +97 -0
  873. package/src/ink/layout/node.ts +152 -0
  874. package/src/ink/layout/yoga.ts +308 -0
  875. package/src/ink/line-width-cache.ts +24 -0
  876. package/src/ink/log-update.ts +773 -0
  877. package/src/ink/measure-element.ts +23 -0
  878. package/src/ink/measure-text.ts +47 -0
  879. package/src/ink/node-cache.ts +54 -0
  880. package/src/ink/optimizer.ts +93 -0
  881. package/src/ink/output.ts +797 -0
  882. package/src/ink/parse-keypress.ts +801 -0
  883. package/src/ink/reconciler.ts +512 -0
  884. package/src/ink/render-border.ts +231 -0
  885. package/src/ink/render-node-to-output.ts +1462 -0
  886. package/src/ink/render-to-screen.ts +231 -0
  887. package/src/ink/renderer.ts +178 -0
  888. package/src/ink/root.ts +184 -0
  889. package/src/ink/screen.ts +1486 -0
  890. package/src/ink/searchHighlight.ts +93 -0
  891. package/src/ink/selection.ts +917 -0
  892. package/src/ink/squash-text-nodes.ts +92 -0
  893. package/src/ink/stringWidth.ts +222 -0
  894. package/src/ink/styles.ts +771 -0
  895. package/src/ink/supports-hyperlinks.ts +57 -0
  896. package/src/ink/tabstops.ts +46 -0
  897. package/src/ink/terminal-focus-state.ts +47 -0
  898. package/src/ink/terminal-querier.ts +212 -0
  899. package/src/ink/terminal.ts +248 -0
  900. package/src/ink/termio/ansi.ts +75 -0
  901. package/src/ink/termio/csi.ts +319 -0
  902. package/src/ink/termio/dec.ts +60 -0
  903. package/src/ink/termio/esc.ts +67 -0
  904. package/src/ink/termio/osc.ts +493 -0
  905. package/src/ink/termio/parser.ts +394 -0
  906. package/src/ink/termio/sgr.ts +308 -0
  907. package/src/ink/termio/tokenize.ts +319 -0
  908. package/src/ink/termio/types.ts +236 -0
  909. package/src/ink/termio.ts +42 -0
  910. package/src/ink/useTerminalNotification.ts +126 -0
  911. package/src/ink/warn.ts +9 -0
  912. package/src/ink/widest-line.ts +19 -0
  913. package/src/ink/wrap-text.ts +74 -0
  914. package/src/ink/wrapAnsi.ts +20 -0
  915. package/src/ink.ts +85 -0
  916. package/src/interactiveHelpers.tsx +367 -0
  917. package/src/keybindings/KeybindingContext.tsx +243 -0
  918. package/src/keybindings/KeybindingProviderSetup.tsx +308 -0
  919. package/src/keybindings/defaultBindings.ts +340 -0
  920. package/src/keybindings/loadUserBindings.ts +472 -0
  921. package/src/keybindings/match.ts +120 -0
  922. package/src/keybindings/parser.ts +203 -0
  923. package/src/keybindings/reservedShortcuts.ts +127 -0
  924. package/src/keybindings/resolver.ts +244 -0
  925. package/src/keybindings/schema.ts +236 -0
  926. package/src/keybindings/shortcutFormat.ts +63 -0
  927. package/src/keybindings/template.ts +52 -0
  928. package/src/keybindings/useKeybinding.ts +196 -0
  929. package/src/keybindings/useShortcutDisplay.ts +59 -0
  930. package/src/keybindings/validate.ts +498 -0
  931. package/src/main.tsx +4684 -0
  932. package/src/memdir/findRelevantMemories.ts +141 -0
  933. package/src/memdir/memdir.ts +507 -0
  934. package/src/memdir/memoryAge.ts +53 -0
  935. package/src/memdir/memoryScan.ts +94 -0
  936. package/src/memdir/memoryTypes.ts +271 -0
  937. package/src/memdir/paths.ts +278 -0
  938. package/src/memdir/teamMemPaths.ts +292 -0
  939. package/src/memdir/teamMemPrompts.ts +100 -0
  940. package/src/migrations/migrateAutoUpdatesToSettings.ts +61 -0
  941. package/src/migrations/migrateBypassPermissionsAcceptedToSettings.ts +40 -0
  942. package/src/migrations/migrateEnableAllProjectMcpServersToSettings.ts +118 -0
  943. package/src/migrations/migrateFennecToOpus.ts +45 -0
  944. package/src/migrations/migrateLegacyOpusToCurrent.ts +57 -0
  945. package/src/migrations/migrateOpusToOpus1m.ts +43 -0
  946. package/src/migrations/migrateReplBridgeEnabledToRemoteControlAtStartup.ts +22 -0
  947. package/src/migrations/migrateSonnet1mToSonnet45.ts +48 -0
  948. package/src/migrations/migrateSonnet45ToSonnet46.ts +67 -0
  949. package/src/migrations/resetAutoModeOptInForDefaultOffer.ts +51 -0
  950. package/src/migrations/resetProToOpusDefault.ts +51 -0
  951. package/src/moreright/useMoreRight.tsx +26 -0
  952. package/src/native-ts/color-diff/index.ts +999 -0
  953. package/src/native-ts/file-index/index.ts +370 -0
  954. package/src/native-ts/yoga-layout/enums.ts +134 -0
  955. package/src/native-ts/yoga-layout/index.ts +2578 -0
  956. package/src/outputStyles/loadOutputStylesDir.ts +98 -0
  957. package/src/plugins/builtinPlugins.ts +159 -0
  958. package/src/plugins/bundled/index.ts +23 -0
  959. package/src/projectOnboardingState.ts +83 -0
  960. package/src/query/config.ts +46 -0
  961. package/src/query/deps.ts +40 -0
  962. package/src/query/stopHooks.ts +473 -0
  963. package/src/query/tokenBudget.ts +93 -0
  964. package/src/query.ts +1729 -0
  965. package/src/remote/RemoteSessionManager.ts +343 -0
  966. package/src/remote/SessionsWebSocket.ts +404 -0
  967. package/src/remote/remotePermissionBridge.ts +78 -0
  968. package/src/remote/sdkMessageAdapter.ts +302 -0
  969. package/src/replLauncher.tsx +23 -0
  970. package/src/schemas/hooks.ts +222 -0
  971. package/src/screens/Doctor.tsx +575 -0
  972. package/src/screens/REPL.tsx +5006 -0
  973. package/src/screens/ResumeConversation.tsx +399 -0
  974. package/src/server/createDirectConnectSession.ts +88 -0
  975. package/src/server/directConnectManager.ts +213 -0
  976. package/src/server/types.ts +57 -0
  977. package/src/services/AgentSummary/agentSummary.ts +179 -0
  978. package/src/services/MagicDocs/magicDocs.ts +254 -0
  979. package/src/services/MagicDocs/prompts.ts +127 -0
  980. package/src/services/PromptSuggestion/promptSuggestion.ts +523 -0
  981. package/src/services/PromptSuggestion/speculation.ts +991 -0
  982. package/src/services/SessionMemory/prompts.ts +324 -0
  983. package/src/services/SessionMemory/sessionMemory.ts +495 -0
  984. package/src/services/SessionMemory/sessionMemoryUtils.ts +207 -0
  985. package/src/services/analytics/config.ts +38 -0
  986. package/src/services/analytics/datadog.ts +307 -0
  987. package/src/services/analytics/firstPartyEventLogger.ts +449 -0
  988. package/src/services/analytics/firstPartyEventLoggingExporter.ts +806 -0
  989. package/src/services/analytics/growthbook.ts +1157 -0
  990. package/src/services/analytics/index.ts +173 -0
  991. package/src/services/analytics/metadata.ts +973 -0
  992. package/src/services/analytics/sink.ts +114 -0
  993. package/src/services/analytics/sinkKillswitch.ts +25 -0
  994. package/src/services/api/adminRequests.ts +119 -0
  995. package/src/services/api/bootstrap.ts +142 -0
  996. package/src/services/api/claude.ts +3433 -0
  997. package/src/services/api/client.ts +395 -0
  998. package/src/services/api/dumpPrompts.ts +226 -0
  999. package/src/services/api/emptyUsage.ts +22 -0
  1000. package/src/services/api/errorUtils.ts +260 -0
  1001. package/src/services/api/errors.ts +1207 -0
  1002. package/src/services/api/filesApi.ts +748 -0
  1003. package/src/services/api/firstTokenDate.ts +60 -0
  1004. package/src/services/api/grove.ts +357 -0
  1005. package/src/services/api/logging.ts +788 -0
  1006. package/src/services/api/metricsOptOut.ts +159 -0
  1007. package/src/services/api/overageCreditGrant.ts +137 -0
  1008. package/src/services/api/promptCacheBreakDetection.ts +727 -0
  1009. package/src/services/api/referral.ts +281 -0
  1010. package/src/services/api/sessionIngress.ts +514 -0
  1011. package/src/services/api/ultrareviewQuota.ts +38 -0
  1012. package/src/services/api/usage.ts +63 -0
  1013. package/src/services/api/withRetry.ts +826 -0
  1014. package/src/services/autoDream/autoDream.ts +324 -0
  1015. package/src/services/autoDream/config.ts +21 -0
  1016. package/src/services/autoDream/consolidationLock.ts +140 -0
  1017. package/src/services/autoDream/consolidationPrompt.ts +65 -0
  1018. package/src/services/awaySummary.ts +74 -0
  1019. package/src/services/claudeAiLimits.ts +515 -0
  1020. package/src/services/claudeAiLimitsHook.ts +23 -0
  1021. package/src/services/compact/apiMicrocompact.ts +153 -0
  1022. package/src/services/compact/autoCompact.ts +351 -0
  1023. package/src/services/compact/compact.ts +1705 -0
  1024. package/src/services/compact/compactWarningHook.ts +16 -0
  1025. package/src/services/compact/compactWarningState.ts +18 -0
  1026. package/src/services/compact/grouping.ts +63 -0
  1027. package/src/services/compact/microCompact.ts +530 -0
  1028. package/src/services/compact/postCompactCleanup.ts +77 -0
  1029. package/src/services/compact/prompt.ts +374 -0
  1030. package/src/services/compact/sessionMemoryCompact.ts +630 -0
  1031. package/src/services/compact/timeBasedMCConfig.ts +43 -0
  1032. package/src/services/diagnosticTracking.ts +397 -0
  1033. package/src/services/extractMemories/extractMemories.ts +615 -0
  1034. package/src/services/extractMemories/prompts.ts +154 -0
  1035. package/src/services/internalLogging.ts +90 -0
  1036. package/src/services/lsp/LSPClient.ts +447 -0
  1037. package/src/services/lsp/LSPDiagnosticRegistry.ts +386 -0
  1038. package/src/services/lsp/LSPServerInstance.ts +511 -0
  1039. package/src/services/lsp/LSPServerManager.ts +420 -0
  1040. package/src/services/lsp/config.ts +79 -0
  1041. package/src/services/lsp/manager.ts +289 -0
  1042. package/src/services/lsp/passiveFeedback.ts +328 -0
  1043. package/src/services/mcp/InProcessTransport.ts +63 -0
  1044. package/src/services/mcp/MCPConnectionManager.tsx +73 -0
  1045. package/src/services/mcp/SdkControlTransport.ts +136 -0
  1046. package/src/services/mcp/auth.ts +2465 -0
  1047. package/src/services/mcp/channelAllowlist.ts +76 -0
  1048. package/src/services/mcp/channelNotification.ts +316 -0
  1049. package/src/services/mcp/channelPermissions.ts +240 -0
  1050. package/src/services/mcp/claudeai.ts +164 -0
  1051. package/src/services/mcp/client.ts +3348 -0
  1052. package/src/services/mcp/config.ts +1578 -0
  1053. package/src/services/mcp/elicitationHandler.ts +313 -0
  1054. package/src/services/mcp/envExpansion.ts +38 -0
  1055. package/src/services/mcp/headersHelper.ts +138 -0
  1056. package/src/services/mcp/mcpStringUtils.ts +106 -0
  1057. package/src/services/mcp/normalization.ts +23 -0
  1058. package/src/services/mcp/oauthPort.ts +78 -0
  1059. package/src/services/mcp/officialRegistry.ts +72 -0
  1060. package/src/services/mcp/types.ts +258 -0
  1061. package/src/services/mcp/useManageMCPConnections.ts +1141 -0
  1062. package/src/services/mcp/utils.ts +575 -0
  1063. package/src/services/mcp/vscodeSdkMcp.ts +112 -0
  1064. package/src/services/mcp/xaa.ts +511 -0
  1065. package/src/services/mcp/xaaIdpLogin.ts +487 -0
  1066. package/src/services/mcpServerApproval.tsx +41 -0
  1067. package/src/services/mockRateLimits.ts +882 -0
  1068. package/src/services/notifier.ts +156 -0
  1069. package/src/services/oauth/auth-code-listener.ts +211 -0
  1070. package/src/services/oauth/client.ts +566 -0
  1071. package/src/services/oauth/crypto.ts +23 -0
  1072. package/src/services/oauth/getOauthProfile.ts +53 -0
  1073. package/src/services/oauth/index.ts +198 -0
  1074. package/src/services/plugins/PluginInstallationManager.ts +184 -0
  1075. package/src/services/plugins/pluginCliCommands.ts +344 -0
  1076. package/src/services/plugins/pluginOperations.ts +1088 -0
  1077. package/src/services/policyLimits/index.ts +664 -0
  1078. package/src/services/policyLimits/types.ts +27 -0
  1079. package/src/services/preventSleep.ts +165 -0
  1080. package/src/services/rateLimitMessages.ts +344 -0
  1081. package/src/services/rateLimitMocking.ts +144 -0
  1082. package/src/services/remoteManagedSettings/index.ts +639 -0
  1083. package/src/services/remoteManagedSettings/securityCheck.tsx +74 -0
  1084. package/src/services/remoteManagedSettings/syncCache.ts +112 -0
  1085. package/src/services/remoteManagedSettings/syncCacheState.ts +96 -0
  1086. package/src/services/remoteManagedSettings/types.ts +31 -0
  1087. package/src/services/settingsSync/index.ts +581 -0
  1088. package/src/services/settingsSync/types.ts +67 -0
  1089. package/src/services/teamMemorySync/index.ts +1256 -0
  1090. package/src/services/teamMemorySync/secretScanner.ts +324 -0
  1091. package/src/services/teamMemorySync/teamMemSecretGuard.ts +44 -0
  1092. package/src/services/teamMemorySync/types.ts +156 -0
  1093. package/src/services/teamMemorySync/watcher.ts +387 -0
  1094. package/src/services/tips/tipHistory.ts +17 -0
  1095. package/src/services/tips/tipRegistry.ts +686 -0
  1096. package/src/services/tips/tipScheduler.ts +58 -0
  1097. package/src/services/tokenEstimation.ts +495 -0
  1098. package/src/services/toolUseSummary/toolUseSummaryGenerator.ts +112 -0
  1099. package/src/services/tools/StreamingToolExecutor.ts +530 -0
  1100. package/src/services/tools/toolExecution.ts +1745 -0
  1101. package/src/services/tools/toolHooks.ts +650 -0
  1102. package/src/services/tools/toolOrchestration.ts +188 -0
  1103. package/src/services/vcr.ts +406 -0
  1104. package/src/services/voice.ts +525 -0
  1105. package/src/services/voiceKeyterms.ts +106 -0
  1106. package/src/services/voiceStreamSTT.ts +544 -0
  1107. package/src/setup.ts +477 -0
  1108. package/src/skills/bundled/batch.ts +124 -0
  1109. package/src/skills/bundled/claudeApi.ts +196 -0
  1110. package/src/skills/bundled/claudeApiContent.ts +75 -0
  1111. package/src/skills/bundled/claudeInChrome.ts +34 -0
  1112. package/src/skills/bundled/debug.ts +103 -0
  1113. package/src/skills/bundled/index.ts +79 -0
  1114. package/src/skills/bundled/keybindings.ts +339 -0
  1115. package/src/skills/bundled/loop.ts +92 -0
  1116. package/src/skills/bundled/loremIpsum.ts +282 -0
  1117. package/src/skills/bundled/remember.ts +82 -0
  1118. package/src/skills/bundled/scheduleRemoteAgents.ts +447 -0
  1119. package/src/skills/bundled/simplify.ts +69 -0
  1120. package/src/skills/bundled/skillify.ts +197 -0
  1121. package/src/skills/bundled/stuck.ts +79 -0
  1122. package/src/skills/bundled/updateConfig.ts +475 -0
  1123. package/src/skills/bundled/verify.ts +30 -0
  1124. package/src/skills/bundled/verifyContent.ts +13 -0
  1125. package/src/skills/bundledSkills.ts +220 -0
  1126. package/src/skills/loadSkillsDir.ts +1086 -0
  1127. package/src/skills/mcpSkillBuilders.ts +44 -0
  1128. package/src/state/AppState.tsx +200 -0
  1129. package/src/state/AppStateStore.ts +569 -0
  1130. package/src/state/onChangeAppState.ts +171 -0
  1131. package/src/state/selectors.ts +76 -0
  1132. package/src/state/store.ts +34 -0
  1133. package/src/state/teammateViewHelpers.ts +141 -0
  1134. package/src/tasks/DreamTask/DreamTask.ts +157 -0
  1135. package/src/tasks/InProcessTeammateTask/InProcessTeammateTask.tsx +126 -0
  1136. package/src/tasks/InProcessTeammateTask/types.ts +121 -0
  1137. package/src/tasks/LocalAgentTask/LocalAgentTask.tsx +683 -0
  1138. package/src/tasks/LocalMainSessionTask.ts +479 -0
  1139. package/src/tasks/LocalShellTask/LocalShellTask.tsx +523 -0
  1140. package/src/tasks/LocalShellTask/guards.ts +41 -0
  1141. package/src/tasks/LocalShellTask/killShellTasks.ts +76 -0
  1142. package/src/tasks/RemoteAgentTask/RemoteAgentTask.tsx +856 -0
  1143. package/src/tasks/pillLabel.ts +82 -0
  1144. package/src/tasks/stopTask.ts +100 -0
  1145. package/src/tasks/types.ts +46 -0
  1146. package/src/tasks.ts +39 -0
  1147. package/src/tools/AgentTool/AgentTool.tsx +1398 -0
  1148. package/src/tools/AgentTool/UI.tsx +872 -0
  1149. package/src/tools/AgentTool/agentColorManager.ts +66 -0
  1150. package/src/tools/AgentTool/agentDisplay.ts +104 -0
  1151. package/src/tools/AgentTool/agentMemory.ts +177 -0
  1152. package/src/tools/AgentTool/agentMemorySnapshot.ts +197 -0
  1153. package/src/tools/AgentTool/agentToolUtils.ts +686 -0
  1154. package/src/tools/AgentTool/built-in/claudeCodeGuideAgent.ts +205 -0
  1155. package/src/tools/AgentTool/built-in/exploreAgent.ts +83 -0
  1156. package/src/tools/AgentTool/built-in/generalPurposeAgent.ts +34 -0
  1157. package/src/tools/AgentTool/built-in/planAgent.ts +92 -0
  1158. package/src/tools/AgentTool/built-in/statuslineSetup.ts +144 -0
  1159. package/src/tools/AgentTool/built-in/verificationAgent.ts +152 -0
  1160. package/src/tools/AgentTool/builtInAgents.ts +72 -0
  1161. package/src/tools/AgentTool/constants.ts +12 -0
  1162. package/src/tools/AgentTool/forkSubagent.ts +210 -0
  1163. package/src/tools/AgentTool/loadAgentsDir.ts +755 -0
  1164. package/src/tools/AgentTool/prompt.ts +287 -0
  1165. package/src/tools/AgentTool/resumeAgent.ts +265 -0
  1166. package/src/tools/AgentTool/runAgent.ts +973 -0
  1167. package/src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +266 -0
  1168. package/src/tools/AskUserQuestionTool/prompt.ts +44 -0
  1169. package/src/tools/BashTool/BashTool.tsx +1144 -0
  1170. package/src/tools/BashTool/BashToolResultMessage.tsx +191 -0
  1171. package/src/tools/BashTool/UI.tsx +185 -0
  1172. package/src/tools/BashTool/bashCommandHelpers.ts +265 -0
  1173. package/src/tools/BashTool/bashPermissions.ts +2621 -0
  1174. package/src/tools/BashTool/bashSecurity.ts +2592 -0
  1175. package/src/tools/BashTool/commandSemantics.ts +140 -0
  1176. package/src/tools/BashTool/commentLabel.ts +13 -0
  1177. package/src/tools/BashTool/destructiveCommandWarning.ts +102 -0
  1178. package/src/tools/BashTool/modeValidation.ts +115 -0
  1179. package/src/tools/BashTool/pathValidation.ts +1303 -0
  1180. package/src/tools/BashTool/prompt.ts +369 -0
  1181. package/src/tools/BashTool/readOnlyValidation.ts +1990 -0
  1182. package/src/tools/BashTool/sedEditParser.ts +322 -0
  1183. package/src/tools/BashTool/sedValidation.ts +684 -0
  1184. package/src/tools/BashTool/shouldUseSandbox.ts +153 -0
  1185. package/src/tools/BashTool/toolName.ts +2 -0
  1186. package/src/tools/BashTool/utils.ts +223 -0
  1187. package/src/tools/BriefTool/BriefTool.ts +204 -0
  1188. package/src/tools/BriefTool/UI.tsx +101 -0
  1189. package/src/tools/BriefTool/attachments.ts +110 -0
  1190. package/src/tools/BriefTool/prompt.ts +22 -0
  1191. package/src/tools/BriefTool/upload.ts +174 -0
  1192. package/src/tools/ConfigTool/ConfigTool.ts +467 -0
  1193. package/src/tools/ConfigTool/UI.tsx +38 -0
  1194. package/src/tools/ConfigTool/constants.ts +1 -0
  1195. package/src/tools/ConfigTool/prompt.ts +93 -0
  1196. package/src/tools/ConfigTool/supportedSettings.ts +211 -0
  1197. package/src/tools/EnterPlanModeTool/EnterPlanModeTool.ts +126 -0
  1198. package/src/tools/EnterPlanModeTool/UI.tsx +33 -0
  1199. package/src/tools/EnterPlanModeTool/constants.ts +1 -0
  1200. package/src/tools/EnterPlanModeTool/prompt.ts +170 -0
  1201. package/src/tools/EnterWorktreeTool/EnterWorktreeTool.ts +127 -0
  1202. package/src/tools/EnterWorktreeTool/UI.tsx +20 -0
  1203. package/src/tools/EnterWorktreeTool/constants.ts +1 -0
  1204. package/src/tools/EnterWorktreeTool/prompt.ts +30 -0
  1205. package/src/tools/ExitPlanModeTool/ExitPlanModeV2Tool.ts +493 -0
  1206. package/src/tools/ExitPlanModeTool/UI.tsx +82 -0
  1207. package/src/tools/ExitPlanModeTool/constants.ts +2 -0
  1208. package/src/tools/ExitPlanModeTool/prompt.ts +29 -0
  1209. package/src/tools/ExitWorktreeTool/ExitWorktreeTool.ts +329 -0
  1210. package/src/tools/ExitWorktreeTool/UI.tsx +25 -0
  1211. package/src/tools/ExitWorktreeTool/constants.ts +1 -0
  1212. package/src/tools/ExitWorktreeTool/prompt.ts +32 -0
  1213. package/src/tools/FileEditTool/FileEditTool.ts +625 -0
  1214. package/src/tools/FileEditTool/UI.tsx +289 -0
  1215. package/src/tools/FileEditTool/constants.ts +11 -0
  1216. package/src/tools/FileEditTool/prompt.ts +28 -0
  1217. package/src/tools/FileEditTool/types.ts +85 -0
  1218. package/src/tools/FileEditTool/utils.ts +775 -0
  1219. package/src/tools/FileReadTool/FileReadTool.ts +1183 -0
  1220. package/src/tools/FileReadTool/UI.tsx +185 -0
  1221. package/src/tools/FileReadTool/imageProcessor.ts +94 -0
  1222. package/src/tools/FileReadTool/limits.ts +92 -0
  1223. package/src/tools/FileReadTool/prompt.ts +49 -0
  1224. package/src/tools/FileWriteTool/FileWriteTool.ts +434 -0
  1225. package/src/tools/FileWriteTool/UI.tsx +405 -0
  1226. package/src/tools/FileWriteTool/prompt.ts +18 -0
  1227. package/src/tools/GlobTool/GlobTool.ts +198 -0
  1228. package/src/tools/GlobTool/UI.tsx +63 -0
  1229. package/src/tools/GlobTool/prompt.ts +7 -0
  1230. package/src/tools/GrepTool/GrepTool.ts +577 -0
  1231. package/src/tools/GrepTool/UI.tsx +201 -0
  1232. package/src/tools/GrepTool/prompt.ts +18 -0
  1233. package/src/tools/LSPTool/LSPTool.ts +860 -0
  1234. package/src/tools/LSPTool/UI.tsx +228 -0
  1235. package/src/tools/LSPTool/formatters.ts +592 -0
  1236. package/src/tools/LSPTool/prompt.ts +21 -0
  1237. package/src/tools/LSPTool/schemas.ts +215 -0
  1238. package/src/tools/LSPTool/symbolContext.ts +90 -0
  1239. package/src/tools/ListMcpResourcesTool/ListMcpResourcesTool.ts +123 -0
  1240. package/src/tools/ListMcpResourcesTool/UI.tsx +29 -0
  1241. package/src/tools/ListMcpResourcesTool/prompt.ts +20 -0
  1242. package/src/tools/MCPTool/MCPTool.ts +77 -0
  1243. package/src/tools/MCPTool/UI.tsx +403 -0
  1244. package/src/tools/MCPTool/classifyForCollapse.ts +604 -0
  1245. package/src/tools/MCPTool/prompt.ts +3 -0
  1246. package/src/tools/McpAuthTool/McpAuthTool.ts +215 -0
  1247. package/src/tools/NotebookEditTool/NotebookEditTool.ts +490 -0
  1248. package/src/tools/NotebookEditTool/UI.tsx +93 -0
  1249. package/src/tools/NotebookEditTool/constants.ts +2 -0
  1250. package/src/tools/NotebookEditTool/prompt.ts +3 -0
  1251. package/src/tools/PowerShellTool/PowerShellTool.tsx +1001 -0
  1252. package/src/tools/PowerShellTool/UI.tsx +131 -0
  1253. package/src/tools/PowerShellTool/clmTypes.ts +211 -0
  1254. package/src/tools/PowerShellTool/commandSemantics.ts +142 -0
  1255. package/src/tools/PowerShellTool/commonParameters.ts +30 -0
  1256. package/src/tools/PowerShellTool/destructiveCommandWarning.ts +109 -0
  1257. package/src/tools/PowerShellTool/gitSafety.ts +176 -0
  1258. package/src/tools/PowerShellTool/modeValidation.ts +404 -0
  1259. package/src/tools/PowerShellTool/pathValidation.ts +2049 -0
  1260. package/src/tools/PowerShellTool/powershellPermissions.ts +1648 -0
  1261. package/src/tools/PowerShellTool/powershellSecurity.ts +1090 -0
  1262. package/src/tools/PowerShellTool/prompt.ts +145 -0
  1263. package/src/tools/PowerShellTool/readOnlyValidation.ts +1823 -0
  1264. package/src/tools/PowerShellTool/toolName.ts +2 -0
  1265. package/src/tools/REPLTool/constants.ts +46 -0
  1266. package/src/tools/REPLTool/primitiveTools.ts +39 -0
  1267. package/src/tools/ReadMcpResourceTool/ReadMcpResourceTool.ts +158 -0
  1268. package/src/tools/ReadMcpResourceTool/UI.tsx +37 -0
  1269. package/src/tools/ReadMcpResourceTool/prompt.ts +16 -0
  1270. package/src/tools/RemoteTriggerTool/RemoteTriggerTool.ts +161 -0
  1271. package/src/tools/RemoteTriggerTool/UI.tsx +17 -0
  1272. package/src/tools/RemoteTriggerTool/prompt.ts +15 -0
  1273. package/src/tools/ScheduleCronTool/CronCreateTool.ts +157 -0
  1274. package/src/tools/ScheduleCronTool/CronDeleteTool.ts +95 -0
  1275. package/src/tools/ScheduleCronTool/CronListTool.ts +97 -0
  1276. package/src/tools/ScheduleCronTool/UI.tsx +60 -0
  1277. package/src/tools/ScheduleCronTool/prompt.ts +135 -0
  1278. package/src/tools/SendMessageTool/SendMessageTool.ts +917 -0
  1279. package/src/tools/SendMessageTool/UI.tsx +31 -0
  1280. package/src/tools/SendMessageTool/constants.ts +1 -0
  1281. package/src/tools/SendMessageTool/prompt.ts +49 -0
  1282. package/src/tools/SkillTool/SkillTool.ts +1108 -0
  1283. package/src/tools/SkillTool/UI.tsx +128 -0
  1284. package/src/tools/SkillTool/constants.ts +1 -0
  1285. package/src/tools/SkillTool/prompt.ts +241 -0
  1286. package/src/tools/SleepTool/prompt.ts +17 -0
  1287. package/src/tools/SyntheticOutputTool/SyntheticOutputTool.ts +163 -0
  1288. package/src/tools/TaskCreateTool/TaskCreateTool.ts +138 -0
  1289. package/src/tools/TaskCreateTool/constants.ts +1 -0
  1290. package/src/tools/TaskCreateTool/prompt.ts +56 -0
  1291. package/src/tools/TaskGetTool/TaskGetTool.ts +128 -0
  1292. package/src/tools/TaskGetTool/constants.ts +1 -0
  1293. package/src/tools/TaskGetTool/prompt.ts +24 -0
  1294. package/src/tools/TaskListTool/TaskListTool.ts +116 -0
  1295. package/src/tools/TaskListTool/constants.ts +1 -0
  1296. package/src/tools/TaskListTool/prompt.ts +49 -0
  1297. package/src/tools/TaskOutputTool/TaskOutputTool.tsx +584 -0
  1298. package/src/tools/TaskOutputTool/constants.ts +1 -0
  1299. package/src/tools/TaskStopTool/TaskStopTool.ts +131 -0
  1300. package/src/tools/TaskStopTool/UI.tsx +41 -0
  1301. package/src/tools/TaskStopTool/prompt.ts +8 -0
  1302. package/src/tools/TaskUpdateTool/TaskUpdateTool.ts +406 -0
  1303. package/src/tools/TaskUpdateTool/constants.ts +1 -0
  1304. package/src/tools/TaskUpdateTool/prompt.ts +77 -0
  1305. package/src/tools/TeamCreateTool/TeamCreateTool.ts +240 -0
  1306. package/src/tools/TeamCreateTool/UI.tsx +6 -0
  1307. package/src/tools/TeamCreateTool/constants.ts +1 -0
  1308. package/src/tools/TeamCreateTool/prompt.ts +113 -0
  1309. package/src/tools/TeamDeleteTool/TeamDeleteTool.ts +139 -0
  1310. package/src/tools/TeamDeleteTool/UI.tsx +20 -0
  1311. package/src/tools/TeamDeleteTool/constants.ts +1 -0
  1312. package/src/tools/TeamDeleteTool/prompt.ts +16 -0
  1313. package/src/tools/TodoWriteTool/TodoWriteTool.ts +115 -0
  1314. package/src/tools/TodoWriteTool/constants.ts +1 -0
  1315. package/src/tools/TodoWriteTool/prompt.ts +184 -0
  1316. package/src/tools/ToolSearchTool/ToolSearchTool.ts +471 -0
  1317. package/src/tools/ToolSearchTool/constants.ts +1 -0
  1318. package/src/tools/ToolSearchTool/prompt.ts +121 -0
  1319. package/src/tools/TungstenTool/TungstenTool.js +2 -0
  1320. package/src/tools/TungstenTool/TungstenTool.ts +1 -0
  1321. package/src/tools/WebFetchTool/UI.tsx +72 -0
  1322. package/src/tools/WebFetchTool/WebFetchTool.ts +318 -0
  1323. package/src/tools/WebFetchTool/preapproved.ts +166 -0
  1324. package/src/tools/WebFetchTool/prompt.ts +46 -0
  1325. package/src/tools/WebFetchTool/utils.ts +530 -0
  1326. package/src/tools/WebSearchTool/UI.tsx +101 -0
  1327. package/src/tools/WebSearchTool/WebSearchTool.ts +435 -0
  1328. package/src/tools/WebSearchTool/prompt.ts +34 -0
  1329. package/src/tools/shared/gitOperationTracking.ts +277 -0
  1330. package/src/tools/shared/spawnMultiAgent.ts +1093 -0
  1331. package/src/tools/testing/TestingPermissionTool.tsx +74 -0
  1332. package/src/tools/utils.ts +40 -0
  1333. package/src/tools.ts +389 -0
  1334. package/src/types/command.ts +216 -0
  1335. package/src/types/connectorText.js +5 -0
  1336. package/src/types/connectorText.ts +1 -0
  1337. package/src/types/generated/events_mono/claude_code/v1/claude_code_internal_event.ts +865 -0
  1338. package/src/types/generated/events_mono/common/v1/auth.ts +100 -0
  1339. package/src/types/generated/events_mono/growthbook/v1/growthbook_experiment_event.ts +223 -0
  1340. package/src/types/generated/google/protobuf/timestamp.ts +187 -0
  1341. package/src/types/hooks.ts +290 -0
  1342. package/src/types/ids.ts +44 -0
  1343. package/src/types/logs.ts +330 -0
  1344. package/src/types/permissions.ts +441 -0
  1345. package/src/types/plugin.ts +363 -0
  1346. package/src/types/textInputTypes.ts +387 -0
  1347. package/src/upstreamproxy/relay.ts +455 -0
  1348. package/src/upstreamproxy/upstreamproxy.ts +285 -0
  1349. package/src/utils/CircularBuffer.ts +84 -0
  1350. package/src/utils/Cursor.ts +1530 -0
  1351. package/src/utils/QueryGuard.ts +121 -0
  1352. package/src/utils/Shell.ts +474 -0
  1353. package/src/utils/ShellCommand.ts +465 -0
  1354. package/src/utils/abortController.ts +99 -0
  1355. package/src/utils/activityManager.ts +164 -0
  1356. package/src/utils/advisor.ts +145 -0
  1357. package/src/utils/agentContext.ts +178 -0
  1358. package/src/utils/agentId.ts +99 -0
  1359. package/src/utils/agentSwarmsEnabled.ts +44 -0
  1360. package/src/utils/agenticSessionSearch.ts +307 -0
  1361. package/src/utils/analyzeContext.ts +1382 -0
  1362. package/src/utils/ansiToPng.ts +334 -0
  1363. package/src/utils/ansiToSvg.ts +272 -0
  1364. package/src/utils/api.ts +718 -0
  1365. package/src/utils/apiPreconnect.ts +72 -0
  1366. package/src/utils/appleTerminalBackup.ts +124 -0
  1367. package/src/utils/argumentSubstitution.ts +145 -0
  1368. package/src/utils/array.ts +13 -0
  1369. package/src/utils/asciicast.ts +239 -0
  1370. package/src/utils/attachments.ts +3997 -0
  1371. package/src/utils/attribution.ts +393 -0
  1372. package/src/utils/auth.ts +2007 -0
  1373. package/src/utils/authFileDescriptor.ts +196 -0
  1374. package/src/utils/authPortable.ts +19 -0
  1375. package/src/utils/autoModeDenials.ts +26 -0
  1376. package/src/utils/autoRunIssue.tsx +122 -0
  1377. package/src/utils/autoUpdater.ts +562 -0
  1378. package/src/utils/aws.ts +74 -0
  1379. package/src/utils/awsAuthStatusManager.ts +81 -0
  1380. package/src/utils/background/remote/preconditions.ts +235 -0
  1381. package/src/utils/background/remote/remoteSession.ts +98 -0
  1382. package/src/utils/backgroundHousekeeping.ts +94 -0
  1383. package/src/utils/bash/ParsedCommand.ts +318 -0
  1384. package/src/utils/bash/ShellSnapshot.ts +582 -0
  1385. package/src/utils/bash/ast.ts +2679 -0
  1386. package/src/utils/bash/bashParser.ts +4436 -0
  1387. package/src/utils/bash/bashPipeCommand.ts +294 -0
  1388. package/src/utils/bash/commands.ts +1339 -0
  1389. package/src/utils/bash/heredoc.ts +733 -0
  1390. package/src/utils/bash/parser.ts +230 -0
  1391. package/src/utils/bash/prefix.ts +204 -0
  1392. package/src/utils/bash/registry.ts +53 -0
  1393. package/src/utils/bash/shellCompletion.ts +259 -0
  1394. package/src/utils/bash/shellPrefix.ts +28 -0
  1395. package/src/utils/bash/shellQuote.ts +304 -0
  1396. package/src/utils/bash/shellQuoting.ts +128 -0
  1397. package/src/utils/bash/specs/alias.ts +14 -0
  1398. package/src/utils/bash/specs/index.ts +18 -0
  1399. package/src/utils/bash/specs/nohup.ts +13 -0
  1400. package/src/utils/bash/specs/pyright.ts +91 -0
  1401. package/src/utils/bash/specs/sleep.ts +13 -0
  1402. package/src/utils/bash/specs/srun.ts +31 -0
  1403. package/src/utils/bash/specs/time.ts +13 -0
  1404. package/src/utils/bash/specs/timeout.ts +20 -0
  1405. package/src/utils/bash/treeSitterAnalysis.ts +506 -0
  1406. package/src/utils/betas.ts +438 -0
  1407. package/src/utils/billing.ts +78 -0
  1408. package/src/utils/binaryCheck.ts +53 -0
  1409. package/src/utils/browser.ts +68 -0
  1410. package/src/utils/bufferedWriter.ts +100 -0
  1411. package/src/utils/bundledMode.ts +22 -0
  1412. package/src/utils/caCerts.ts +115 -0
  1413. package/src/utils/caCertsConfig.ts +88 -0
  1414. package/src/utils/cachePaths.ts +38 -0
  1415. package/src/utils/classifierApprovals.ts +88 -0
  1416. package/src/utils/classifierApprovalsHook.ts +17 -0
  1417. package/src/utils/claudeCodeHints.ts +193 -0
  1418. package/src/utils/claudeDesktop.ts +152 -0
  1419. package/src/utils/claudeInChrome/chromeNativeHost.ts +527 -0
  1420. package/src/utils/claudeInChrome/common.ts +540 -0
  1421. package/src/utils/claudeInChrome/mcpServer.ts +293 -0
  1422. package/src/utils/claudeInChrome/prompt.ts +83 -0
  1423. package/src/utils/claudeInChrome/setup.ts +400 -0
  1424. package/src/utils/claudeInChrome/setupPortable.ts +233 -0
  1425. package/src/utils/claudeInChrome/toolRendering.tsx +262 -0
  1426. package/src/utils/claudemd.ts +1479 -0
  1427. package/src/utils/cleanup.ts +602 -0
  1428. package/src/utils/cleanupRegistry.ts +25 -0
  1429. package/src/utils/cliArgs.ts +60 -0
  1430. package/src/utils/cliHighlight.ts +54 -0
  1431. package/src/utils/codeIndexing.ts +206 -0
  1432. package/src/utils/collapseBackgroundBashNotifications.ts +84 -0
  1433. package/src/utils/collapseHookSummaries.ts +59 -0
  1434. package/src/utils/collapseReadSearch.ts +1109 -0
  1435. package/src/utils/collapseTeammateShutdowns.ts +55 -0
  1436. package/src/utils/combinedAbortSignal.ts +47 -0
  1437. package/src/utils/commandLifecycle.ts +21 -0
  1438. package/src/utils/commitAttribution.ts +961 -0
  1439. package/src/utils/completionCache.ts +166 -0
  1440. package/src/utils/computerUse/appNames.ts +196 -0
  1441. package/src/utils/computerUse/cleanup.ts +86 -0
  1442. package/src/utils/computerUse/common.ts +61 -0
  1443. package/src/utils/computerUse/computerUseLock.ts +215 -0
  1444. package/src/utils/computerUse/drainRunLoop.ts +79 -0
  1445. package/src/utils/computerUse/escHotkey.ts +54 -0
  1446. package/src/utils/computerUse/executor.ts +658 -0
  1447. package/src/utils/computerUse/gates.ts +72 -0
  1448. package/src/utils/computerUse/hostAdapter.ts +69 -0
  1449. package/src/utils/computerUse/inputLoader.ts +30 -0
  1450. package/src/utils/computerUse/mcpServer.ts +106 -0
  1451. package/src/utils/computerUse/setup.ts +53 -0
  1452. package/src/utils/computerUse/swiftLoader.ts +23 -0
  1453. package/src/utils/computerUse/toolRendering.tsx +125 -0
  1454. package/src/utils/computerUse/wrapper.tsx +336 -0
  1455. package/src/utils/concurrentSessions.ts +204 -0
  1456. package/src/utils/config.ts +1817 -0
  1457. package/src/utils/configConstants.ts +21 -0
  1458. package/src/utils/contentArray.ts +51 -0
  1459. package/src/utils/context.ts +221 -0
  1460. package/src/utils/contextAnalysis.ts +272 -0
  1461. package/src/utils/contextSuggestions.ts +235 -0
  1462. package/src/utils/controlMessageCompat.ts +32 -0
  1463. package/src/utils/conversationRecovery.ts +597 -0
  1464. package/src/utils/cron.ts +308 -0
  1465. package/src/utils/cronJitterConfig.ts +75 -0
  1466. package/src/utils/cronScheduler.ts +565 -0
  1467. package/src/utils/cronTasks.ts +458 -0
  1468. package/src/utils/cronTasksLock.ts +195 -0
  1469. package/src/utils/crossProjectResume.ts +75 -0
  1470. package/src/utils/crypto.ts +13 -0
  1471. package/src/utils/cwd.ts +32 -0
  1472. package/src/utils/debug.ts +268 -0
  1473. package/src/utils/debugFilter.ts +157 -0
  1474. package/src/utils/deepLink/banner.ts +123 -0
  1475. package/src/utils/deepLink/parseDeepLink.ts +170 -0
  1476. package/src/utils/deepLink/protocolHandler.ts +136 -0
  1477. package/src/utils/deepLink/registerProtocol.ts +348 -0
  1478. package/src/utils/deepLink/terminalLauncher.ts +557 -0
  1479. package/src/utils/deepLink/terminalPreference.ts +54 -0
  1480. package/src/utils/desktopDeepLink.ts +236 -0
  1481. package/src/utils/detectRepository.ts +178 -0
  1482. package/src/utils/diagLogs.ts +94 -0
  1483. package/src/utils/diff.ts +177 -0
  1484. package/src/utils/directMemberMessage.ts +69 -0
  1485. package/src/utils/displayTags.ts +51 -0
  1486. package/src/utils/doctorContextWarnings.ts +265 -0
  1487. package/src/utils/doctorDiagnostic.ts +625 -0
  1488. package/src/utils/dxt/helpers.ts +88 -0
  1489. package/src/utils/dxt/zip.ts +226 -0
  1490. package/src/utils/earlyInput.ts +191 -0
  1491. package/src/utils/editor.ts +183 -0
  1492. package/src/utils/effort.ts +329 -0
  1493. package/src/utils/embeddedTools.ts +29 -0
  1494. package/src/utils/env.ts +347 -0
  1495. package/src/utils/envDynamic.ts +151 -0
  1496. package/src/utils/envUtils.ts +183 -0
  1497. package/src/utils/envValidation.ts +38 -0
  1498. package/src/utils/errorLogSink.ts +235 -0
  1499. package/src/utils/errors.ts +238 -0
  1500. package/src/utils/exampleCommands.ts +184 -0
  1501. package/src/utils/execFileNoThrow.ts +150 -0
  1502. package/src/utils/execFileNoThrowPortable.ts +89 -0
  1503. package/src/utils/execSyncWrapper.ts +38 -0
  1504. package/src/utils/exportRenderer.tsx +98 -0
  1505. package/src/utils/extraUsage.ts +23 -0
  1506. package/src/utils/fastMode.ts +532 -0
  1507. package/src/utils/file.ts +584 -0
  1508. package/src/utils/fileHistory.ts +1115 -0
  1509. package/src/utils/fileOperationAnalytics.ts +71 -0
  1510. package/src/utils/filePersistence/filePersistence.ts +287 -0
  1511. package/src/utils/filePersistence/outputsScanner.ts +126 -0
  1512. package/src/utils/fileRead.ts +102 -0
  1513. package/src/utils/fileReadCache.ts +96 -0
  1514. package/src/utils/fileStateCache.ts +142 -0
  1515. package/src/utils/findExecutable.ts +17 -0
  1516. package/src/utils/fingerprint.ts +76 -0
  1517. package/src/utils/forkedAgent.ts +689 -0
  1518. package/src/utils/format.ts +308 -0
  1519. package/src/utils/formatBriefTimestamp.ts +81 -0
  1520. package/src/utils/fpsTracker.ts +47 -0
  1521. package/src/utils/frontmatterParser.ts +370 -0
  1522. package/src/utils/fsOperations.ts +770 -0
  1523. package/src/utils/fullscreen.ts +202 -0
  1524. package/src/utils/generatedFiles.ts +136 -0
  1525. package/src/utils/generators.ts +88 -0
  1526. package/src/utils/genericProcessUtils.ts +184 -0
  1527. package/src/utils/getWorktreePaths.ts +70 -0
  1528. package/src/utils/getWorktreePathsPortable.ts +27 -0
  1529. package/src/utils/ghPrStatus.ts +106 -0
  1530. package/src/utils/git/gitConfigParser.ts +277 -0
  1531. package/src/utils/git/gitFilesystem.ts +699 -0
  1532. package/src/utils/git/gitignore.ts +99 -0
  1533. package/src/utils/git.ts +926 -0
  1534. package/src/utils/gitDiff.ts +532 -0
  1535. package/src/utils/gitSettings.ts +18 -0
  1536. package/src/utils/github/ghAuthStatus.ts +29 -0
  1537. package/src/utils/githubRepoPathMapping.ts +162 -0
  1538. package/src/utils/glob.ts +130 -0
  1539. package/src/utils/gracefulShutdown.ts +529 -0
  1540. package/src/utils/groupToolUses.ts +182 -0
  1541. package/src/utils/handlePromptSubmit.ts +610 -0
  1542. package/src/utils/hash.ts +46 -0
  1543. package/src/utils/headlessProfiler.ts +178 -0
  1544. package/src/utils/heapDumpService.ts +303 -0
  1545. package/src/utils/heatmap.ts +198 -0
  1546. package/src/utils/highlightMatch.tsx +28 -0
  1547. package/src/utils/hooks/AsyncHookRegistry.ts +309 -0
  1548. package/src/utils/hooks/apiQueryHookHelper.ts +141 -0
  1549. package/src/utils/hooks/execAgentHook.ts +339 -0
  1550. package/src/utils/hooks/execHttpHook.ts +242 -0
  1551. package/src/utils/hooks/execPromptHook.ts +211 -0
  1552. package/src/utils/hooks/fileChangedWatcher.ts +191 -0
  1553. package/src/utils/hooks/hookEvents.ts +192 -0
  1554. package/src/utils/hooks/hookHelpers.ts +83 -0
  1555. package/src/utils/hooks/hooksConfigManager.ts +400 -0
  1556. package/src/utils/hooks/hooksConfigSnapshot.ts +133 -0
  1557. package/src/utils/hooks/hooksSettings.ts +271 -0
  1558. package/src/utils/hooks/postSamplingHooks.ts +70 -0
  1559. package/src/utils/hooks/registerFrontmatterHooks.ts +67 -0
  1560. package/src/utils/hooks/registerSkillHooks.ts +64 -0
  1561. package/src/utils/hooks/sessionHooks.ts +447 -0
  1562. package/src/utils/hooks/skillImprovement.ts +267 -0
  1563. package/src/utils/hooks/ssrfGuard.ts +294 -0
  1564. package/src/utils/hooks.ts +5022 -0
  1565. package/src/utils/horizontalScroll.ts +137 -0
  1566. package/src/utils/http.ts +136 -0
  1567. package/src/utils/hyperlink.ts +39 -0
  1568. package/src/utils/iTermBackup.ts +73 -0
  1569. package/src/utils/ide.ts +1494 -0
  1570. package/src/utils/idePathConversion.ts +90 -0
  1571. package/src/utils/idleTimeout.ts +53 -0
  1572. package/src/utils/imagePaste.ts +416 -0
  1573. package/src/utils/imageResizer.ts +880 -0
  1574. package/src/utils/imageStore.ts +167 -0
  1575. package/src/utils/imageValidation.ts +104 -0
  1576. package/src/utils/immediateCommand.ts +15 -0
  1577. package/src/utils/inProcessTeammateHelpers.ts +102 -0
  1578. package/src/utils/ink.ts +26 -0
  1579. package/src/utils/intl.ts +94 -0
  1580. package/src/utils/jetbrains.ts +191 -0
  1581. package/src/utils/json.ts +277 -0
  1582. package/src/utils/jsonRead.ts +16 -0
  1583. package/src/utils/keyboardShortcuts.ts +14 -0
  1584. package/src/utils/lazySchema.ts +8 -0
  1585. package/src/utils/listSessionsImpl.ts +454 -0
  1586. package/src/utils/localInstaller.ts +162 -0
  1587. package/src/utils/lockfile.ts +43 -0
  1588. package/src/utils/log.ts +362 -0
  1589. package/src/utils/logoV2Utils.ts +350 -0
  1590. package/src/utils/mailbox.ts +73 -0
  1591. package/src/utils/managedEnv.ts +199 -0
  1592. package/src/utils/managedEnvConstants.ts +191 -0
  1593. package/src/utils/markdown.ts +381 -0
  1594. package/src/utils/markdownConfigLoader.ts +600 -0
  1595. package/src/utils/mcp/dateTimeParser.ts +121 -0
  1596. package/src/utils/mcp/elicitationValidation.ts +336 -0
  1597. package/src/utils/mcpInstructionsDelta.ts +130 -0
  1598. package/src/utils/mcpOutputStorage.ts +189 -0
  1599. package/src/utils/mcpValidation.ts +208 -0
  1600. package/src/utils/mcpWebSocketTransport.ts +200 -0
  1601. package/src/utils/memoize.ts +269 -0
  1602. package/src/utils/memory/types.ts +12 -0
  1603. package/src/utils/memory/versions.ts +8 -0
  1604. package/src/utils/memoryFileDetection.ts +289 -0
  1605. package/src/utils/messagePredicates.ts +8 -0
  1606. package/src/utils/messageQueueManager.ts +547 -0
  1607. package/src/utils/messages/mappers.ts +290 -0
  1608. package/src/utils/messages/systemInit.ts +96 -0
  1609. package/src/utils/messages.ts +5512 -0
  1610. package/src/utils/model/agent.ts +157 -0
  1611. package/src/utils/model/aliases.ts +25 -0
  1612. package/src/utils/model/antModels.ts +64 -0
  1613. package/src/utils/model/bedrock.ts +265 -0
  1614. package/src/utils/model/check1mAccess.ts +72 -0
  1615. package/src/utils/model/configs.ts +118 -0
  1616. package/src/utils/model/contextWindowUpgradeCheck.ts +47 -0
  1617. package/src/utils/model/deprecation.ts +101 -0
  1618. package/src/utils/model/model.ts +634 -0
  1619. package/src/utils/model/modelAllowlist.ts +170 -0
  1620. package/src/utils/model/modelCapabilities.ts +118 -0
  1621. package/src/utils/model/modelOptions.ts +540 -0
  1622. package/src/utils/model/modelStrings.ts +166 -0
  1623. package/src/utils/model/modelSupportOverrides.ts +50 -0
  1624. package/src/utils/model/providers.ts +46 -0
  1625. package/src/utils/model/validateModel.ts +159 -0
  1626. package/src/utils/modelCost.ts +235 -0
  1627. package/src/utils/modifiers.ts +36 -0
  1628. package/src/utils/mtls.ts +179 -0
  1629. package/src/utils/nativeInstaller/download.ts +523 -0
  1630. package/src/utils/nativeInstaller/index.ts +18 -0
  1631. package/src/utils/nativeInstaller/installer.ts +1708 -0
  1632. package/src/utils/nativeInstaller/packageManagers.ts +336 -0
  1633. package/src/utils/nativeInstaller/pidLock.ts +433 -0
  1634. package/src/utils/notebook.ts +224 -0
  1635. package/src/utils/objectGroupBy.ts +18 -0
  1636. package/src/utils/pasteStore.ts +104 -0
  1637. package/src/utils/path.ts +155 -0
  1638. package/src/utils/pdf.ts +300 -0
  1639. package/src/utils/pdfUtils.ts +70 -0
  1640. package/src/utils/peerAddress.ts +21 -0
  1641. package/src/utils/permissions/PermissionMode.ts +141 -0
  1642. package/src/utils/permissions/PermissionPromptToolResultSchema.ts +127 -0
  1643. package/src/utils/permissions/PermissionResult.ts +35 -0
  1644. package/src/utils/permissions/PermissionRule.ts +40 -0
  1645. package/src/utils/permissions/PermissionUpdate.ts +389 -0
  1646. package/src/utils/permissions/PermissionUpdateSchema.ts +78 -0
  1647. package/src/utils/permissions/autoModeState.ts +39 -0
  1648. package/src/utils/permissions/bashClassifier.ts +61 -0
  1649. package/src/utils/permissions/bypassPermissionsKillswitch.ts +155 -0
  1650. package/src/utils/permissions/classifierDecision.ts +98 -0
  1651. package/src/utils/permissions/classifierShared.ts +39 -0
  1652. package/src/utils/permissions/dangerousPatterns.ts +80 -0
  1653. package/src/utils/permissions/denialTracking.ts +45 -0
  1654. package/src/utils/permissions/filesystem.ts +1777 -0
  1655. package/src/utils/permissions/getNextPermissionMode.ts +101 -0
  1656. package/src/utils/permissions/pathValidation.ts +485 -0
  1657. package/src/utils/permissions/permissionExplainer.ts +250 -0
  1658. package/src/utils/permissions/permissionRuleParser.ts +198 -0
  1659. package/src/utils/permissions/permissionSetup.ts +1532 -0
  1660. package/src/utils/permissions/permissions.ts +1486 -0
  1661. package/src/utils/permissions/permissionsLoader.ts +296 -0
  1662. package/src/utils/permissions/shadowedRuleDetection.ts +234 -0
  1663. package/src/utils/permissions/shellRuleMatching.ts +228 -0
  1664. package/src/utils/permissions/yoloClassifier.ts +1495 -0
  1665. package/src/utils/planModeV2.ts +95 -0
  1666. package/src/utils/plans.ts +397 -0
  1667. package/src/utils/platform.ts +150 -0
  1668. package/src/utils/plugins/addDirPluginSettings.ts +71 -0
  1669. package/src/utils/plugins/cacheUtils.ts +196 -0
  1670. package/src/utils/plugins/dependencyResolver.ts +305 -0
  1671. package/src/utils/plugins/fetchTelemetry.ts +135 -0
  1672. package/src/utils/plugins/gitAvailability.ts +69 -0
  1673. package/src/utils/plugins/headlessPluginInstall.ts +174 -0
  1674. package/src/utils/plugins/hintRecommendation.ts +164 -0
  1675. package/src/utils/plugins/installCounts.ts +292 -0
  1676. package/src/utils/plugins/installedPluginsManager.ts +1268 -0
  1677. package/src/utils/plugins/loadPluginAgents.ts +348 -0
  1678. package/src/utils/plugins/loadPluginCommands.ts +946 -0
  1679. package/src/utils/plugins/loadPluginHooks.ts +287 -0
  1680. package/src/utils/plugins/loadPluginOutputStyles.ts +178 -0
  1681. package/src/utils/plugins/lspPluginIntegration.ts +387 -0
  1682. package/src/utils/plugins/lspRecommendation.ts +374 -0
  1683. package/src/utils/plugins/managedPlugins.ts +27 -0
  1684. package/src/utils/plugins/marketplaceHelpers.ts +592 -0
  1685. package/src/utils/plugins/marketplaceManager.ts +2643 -0
  1686. package/src/utils/plugins/mcpPluginIntegration.ts +634 -0
  1687. package/src/utils/plugins/mcpbHandler.ts +968 -0
  1688. package/src/utils/plugins/officialMarketplace.ts +25 -0
  1689. package/src/utils/plugins/officialMarketplaceGcs.ts +216 -0
  1690. package/src/utils/plugins/officialMarketplaceStartupCheck.ts +439 -0
  1691. package/src/utils/plugins/orphanedPluginFilter.ts +114 -0
  1692. package/src/utils/plugins/parseMarketplaceInput.ts +162 -0
  1693. package/src/utils/plugins/performStartupChecks.tsx +70 -0
  1694. package/src/utils/plugins/pluginAutoupdate.ts +284 -0
  1695. package/src/utils/plugins/pluginBlocklist.ts +127 -0
  1696. package/src/utils/plugins/pluginDirectories.ts +178 -0
  1697. package/src/utils/plugins/pluginFlagging.ts +208 -0
  1698. package/src/utils/plugins/pluginIdentifier.ts +123 -0
  1699. package/src/utils/plugins/pluginInstallationHelpers.ts +595 -0
  1700. package/src/utils/plugins/pluginLoader.ts +3302 -0
  1701. package/src/utils/plugins/pluginOptionsStorage.ts +400 -0
  1702. package/src/utils/plugins/pluginPolicy.ts +20 -0
  1703. package/src/utils/plugins/pluginStartupCheck.ts +341 -0
  1704. package/src/utils/plugins/pluginVersioning.ts +157 -0
  1705. package/src/utils/plugins/reconciler.ts +265 -0
  1706. package/src/utils/plugins/refresh.ts +215 -0
  1707. package/src/utils/plugins/schemas.ts +1681 -0
  1708. package/src/utils/plugins/validatePlugin.ts +903 -0
  1709. package/src/utils/plugins/walkPluginMarkdown.ts +69 -0
  1710. package/src/utils/plugins/zipCache.ts +406 -0
  1711. package/src/utils/plugins/zipCacheAdapters.ts +164 -0
  1712. package/src/utils/powershell/dangerousCmdlets.ts +185 -0
  1713. package/src/utils/powershell/parser.ts +1804 -0
  1714. package/src/utils/powershell/staticPrefix.ts +316 -0
  1715. package/src/utils/preflightChecks.tsx +151 -0
  1716. package/src/utils/privacyLevel.ts +55 -0
  1717. package/src/utils/process.ts +68 -0
  1718. package/src/utils/processUserInput/processBashCommand.tsx +140 -0
  1719. package/src/utils/processUserInput/processSlashCommand.tsx +922 -0
  1720. package/src/utils/processUserInput/processTextPrompt.ts +100 -0
  1721. package/src/utils/processUserInput/processUserInput.ts +605 -0
  1722. package/src/utils/profilerBase.ts +46 -0
  1723. package/src/utils/promptCategory.ts +49 -0
  1724. package/src/utils/promptEditor.ts +188 -0
  1725. package/src/utils/promptShellExecution.ts +183 -0
  1726. package/src/utils/proxy.ts +426 -0
  1727. package/src/utils/queryContext.ts +179 -0
  1728. package/src/utils/queryHelpers.ts +552 -0
  1729. package/src/utils/queryProfiler.ts +301 -0
  1730. package/src/utils/queueProcessor.ts +95 -0
  1731. package/src/utils/readEditContext.ts +227 -0
  1732. package/src/utils/readFileInRange.ts +383 -0
  1733. package/src/utils/releaseNotes.ts +360 -0
  1734. package/src/utils/renderOptions.ts +77 -0
  1735. package/src/utils/ripgrep.ts +679 -0
  1736. package/src/utils/sandbox/sandbox-adapter.ts +985 -0
  1737. package/src/utils/sandbox/sandbox-ui-utils.ts +12 -0
  1738. package/src/utils/sanitization.ts +91 -0
  1739. package/src/utils/screenshotClipboard.ts +121 -0
  1740. package/src/utils/sdkEventQueue.ts +134 -0
  1741. package/src/utils/secureStorage/fallbackStorage.ts +70 -0
  1742. package/src/utils/secureStorage/index.ts +17 -0
  1743. package/src/utils/secureStorage/keychainPrefetch.ts +116 -0
  1744. package/src/utils/secureStorage/macOsKeychainHelpers.ts +111 -0
  1745. package/src/utils/secureStorage/macOsKeychainStorage.ts +231 -0
  1746. package/src/utils/secureStorage/plainTextStorage.ts +84 -0
  1747. package/src/utils/semanticBoolean.ts +29 -0
  1748. package/src/utils/semanticNumber.ts +36 -0
  1749. package/src/utils/semver.ts +59 -0
  1750. package/src/utils/sequential.ts +56 -0
  1751. package/src/utils/sessionActivity.ts +133 -0
  1752. package/src/utils/sessionEnvVars.ts +22 -0
  1753. package/src/utils/sessionEnvironment.ts +166 -0
  1754. package/src/utils/sessionFileAccessHooks.ts +250 -0
  1755. package/src/utils/sessionIngressAuth.ts +140 -0
  1756. package/src/utils/sessionRestore.ts +551 -0
  1757. package/src/utils/sessionStart.ts +232 -0
  1758. package/src/utils/sessionState.ts +150 -0
  1759. package/src/utils/sessionStorage.ts +5105 -0
  1760. package/src/utils/sessionStoragePortable.ts +793 -0
  1761. package/src/utils/sessionTitle.ts +129 -0
  1762. package/src/utils/sessionUrl.ts +64 -0
  1763. package/src/utils/set.ts +53 -0
  1764. package/src/utils/settings/allErrors.ts +32 -0
  1765. package/src/utils/settings/applySettingsChange.ts +92 -0
  1766. package/src/utils/settings/changeDetector.ts +488 -0
  1767. package/src/utils/settings/constants.ts +202 -0
  1768. package/src/utils/settings/internalWrites.ts +37 -0
  1769. package/src/utils/settings/managedPath.ts +34 -0
  1770. package/src/utils/settings/mdm/constants.ts +81 -0
  1771. package/src/utils/settings/mdm/rawRead.ts +130 -0
  1772. package/src/utils/settings/mdm/settings.ts +316 -0
  1773. package/src/utils/settings/permissionValidation.ts +262 -0
  1774. package/src/utils/settings/pluginOnlyPolicy.ts +60 -0
  1775. package/src/utils/settings/schemaOutput.ts +8 -0
  1776. package/src/utils/settings/settings.ts +1015 -0
  1777. package/src/utils/settings/settingsCache.ts +80 -0
  1778. package/src/utils/settings/toolValidationConfig.ts +103 -0
  1779. package/src/utils/settings/types.ts +1148 -0
  1780. package/src/utils/settings/validateEditTool.ts +45 -0
  1781. package/src/utils/settings/validation.ts +265 -0
  1782. package/src/utils/settings/validationTips.ts +164 -0
  1783. package/src/utils/shell/bashProvider.ts +255 -0
  1784. package/src/utils/shell/outputLimits.ts +14 -0
  1785. package/src/utils/shell/powershellDetection.ts +107 -0
  1786. package/src/utils/shell/powershellProvider.ts +123 -0
  1787. package/src/utils/shell/prefix.ts +367 -0
  1788. package/src/utils/shell/readOnlyCommandValidation.ts +1893 -0
  1789. package/src/utils/shell/resolveDefaultShell.ts +14 -0
  1790. package/src/utils/shell/shellProvider.ts +33 -0
  1791. package/src/utils/shell/shellToolUtils.ts +22 -0
  1792. package/src/utils/shell/specPrefix.ts +241 -0
  1793. package/src/utils/shellConfig.ts +167 -0
  1794. package/src/utils/sideQuery.ts +222 -0
  1795. package/src/utils/sideQuestion.ts +155 -0
  1796. package/src/utils/signal.ts +43 -0
  1797. package/src/utils/sinks.ts +16 -0
  1798. package/src/utils/skills/skillChangeDetector.ts +311 -0
  1799. package/src/utils/slashCommandParsing.ts +60 -0
  1800. package/src/utils/sleep.ts +84 -0
  1801. package/src/utils/sliceAnsi.ts +91 -0
  1802. package/src/utils/slowOperations.ts +286 -0
  1803. package/src/utils/standaloneAgent.ts +23 -0
  1804. package/src/utils/startupProfiler.ts +194 -0
  1805. package/src/utils/staticRender.tsx +116 -0
  1806. package/src/utils/stats.ts +1061 -0
  1807. package/src/utils/statsCache.ts +434 -0
  1808. package/src/utils/status.tsx +362 -0
  1809. package/src/utils/statusNoticeDefinitions.tsx +198 -0
  1810. package/src/utils/statusNoticeHelpers.ts +20 -0
  1811. package/src/utils/stream.ts +76 -0
  1812. package/src/utils/streamJsonStdoutGuard.ts +123 -0
  1813. package/src/utils/streamlinedTransform.ts +201 -0
  1814. package/src/utils/stringUtils.ts +235 -0
  1815. package/src/utils/subprocessEnv.ts +99 -0
  1816. package/src/utils/suggestions/commandSuggestions.ts +567 -0
  1817. package/src/utils/suggestions/directoryCompletion.ts +263 -0
  1818. package/src/utils/suggestions/shellHistoryCompletion.ts +119 -0
  1819. package/src/utils/suggestions/skillUsageTracking.ts +55 -0
  1820. package/src/utils/suggestions/slackChannelSuggestions.ts +209 -0
  1821. package/src/utils/swarm/It2SetupPrompt.tsx +380 -0
  1822. package/src/utils/swarm/backends/ITermBackend.ts +370 -0
  1823. package/src/utils/swarm/backends/InProcessBackend.ts +339 -0
  1824. package/src/utils/swarm/backends/PaneBackendExecutor.ts +354 -0
  1825. package/src/utils/swarm/backends/TmuxBackend.ts +764 -0
  1826. package/src/utils/swarm/backends/detection.ts +128 -0
  1827. package/src/utils/swarm/backends/it2Setup.ts +245 -0
  1828. package/src/utils/swarm/backends/registry.ts +464 -0
  1829. package/src/utils/swarm/backends/teammateModeSnapshot.ts +87 -0
  1830. package/src/utils/swarm/backends/types.ts +311 -0
  1831. package/src/utils/swarm/constants.ts +33 -0
  1832. package/src/utils/swarm/inProcessRunner.ts +1552 -0
  1833. package/src/utils/swarm/leaderPermissionBridge.ts +54 -0
  1834. package/src/utils/swarm/permissionSync.ts +928 -0
  1835. package/src/utils/swarm/reconnection.ts +119 -0
  1836. package/src/utils/swarm/spawnInProcess.ts +328 -0
  1837. package/src/utils/swarm/spawnUtils.ts +146 -0
  1838. package/src/utils/swarm/teamHelpers.ts +683 -0
  1839. package/src/utils/swarm/teammateInit.ts +129 -0
  1840. package/src/utils/swarm/teammateLayoutManager.ts +107 -0
  1841. package/src/utils/swarm/teammateModel.ts +10 -0
  1842. package/src/utils/swarm/teammatePromptAddendum.ts +18 -0
  1843. package/src/utils/systemDirectories.ts +74 -0
  1844. package/src/utils/systemPrompt.ts +123 -0
  1845. package/src/utils/systemPromptType.ts +14 -0
  1846. package/src/utils/systemTheme.ts +119 -0
  1847. package/src/utils/taggedId.ts +54 -0
  1848. package/src/utils/task/TaskOutput.ts +390 -0
  1849. package/src/utils/task/diskOutput.ts +451 -0
  1850. package/src/utils/task/framework.ts +308 -0
  1851. package/src/utils/task/outputFormatting.ts +38 -0
  1852. package/src/utils/task/sdkProgress.ts +36 -0
  1853. package/src/utils/tasks.ts +862 -0
  1854. package/src/utils/teamDiscovery.ts +81 -0
  1855. package/src/utils/teamMemoryOps.ts +88 -0
  1856. package/src/utils/teammate.ts +292 -0
  1857. package/src/utils/teammateContext.ts +96 -0
  1858. package/src/utils/teammateMailbox.ts +1183 -0
  1859. package/src/utils/telemetry/betaSessionTracing.ts +491 -0
  1860. package/src/utils/telemetry/bigqueryExporter.ts +252 -0
  1861. package/src/utils/telemetry/events.ts +75 -0
  1862. package/src/utils/telemetry/instrumentation.ts +825 -0
  1863. package/src/utils/telemetry/logger.ts +26 -0
  1864. package/src/utils/telemetry/perfettoTracing.ts +1120 -0
  1865. package/src/utils/telemetry/pluginTelemetry.ts +289 -0
  1866. package/src/utils/telemetry/sessionTracing.ts +927 -0
  1867. package/src/utils/telemetry/skillLoadedEvent.ts +39 -0
  1868. package/src/utils/telemetryAttributes.ts +71 -0
  1869. package/src/utils/teleport/api.ts +466 -0
  1870. package/src/utils/teleport/environmentSelection.ts +77 -0
  1871. package/src/utils/teleport/environments.ts +120 -0
  1872. package/src/utils/teleport/gitBundle.ts +292 -0
  1873. package/src/utils/teleport.tsx +1226 -0
  1874. package/src/utils/tempfile.ts +31 -0
  1875. package/src/utils/terminal.ts +131 -0
  1876. package/src/utils/terminalPanel.ts +191 -0
  1877. package/src/utils/textHighlighting.ts +166 -0
  1878. package/src/utils/theme.ts +639 -0
  1879. package/src/utils/thinking.ts +162 -0
  1880. package/src/utils/timeouts.ts +39 -0
  1881. package/src/utils/tmuxSocket.ts +427 -0
  1882. package/src/utils/todo/types.ts +18 -0
  1883. package/src/utils/tokenBudget.ts +73 -0
  1884. package/src/utils/tokens.ts +261 -0
  1885. package/src/utils/toolErrors.ts +132 -0
  1886. package/src/utils/toolPool.ts +79 -0
  1887. package/src/utils/toolResultStorage.ts +1040 -0
  1888. package/src/utils/toolSchemaCache.ts +26 -0
  1889. package/src/utils/toolSearch.ts +756 -0
  1890. package/src/utils/transcriptSearch.ts +202 -0
  1891. package/src/utils/treeify.ts +170 -0
  1892. package/src/utils/truncate.ts +179 -0
  1893. package/src/utils/ultraplan/ccrSession.ts +349 -0
  1894. package/src/utils/ultraplan/keyword.ts +127 -0
  1895. package/src/utils/ultraplan/prompt.txt +1 -0
  1896. package/src/utils/unaryLogging.ts +39 -0
  1897. package/src/utils/undercover.ts +89 -0
  1898. package/src/utils/user.ts +194 -0
  1899. package/src/utils/userAgent.ts +10 -0
  1900. package/src/utils/userPromptKeywords.ts +27 -0
  1901. package/src/utils/uuid.ts +27 -0
  1902. package/src/utils/warningHandler.ts +121 -0
  1903. package/src/utils/which.ts +82 -0
  1904. package/src/utils/windowsPaths.ts +173 -0
  1905. package/src/utils/withResolvers.ts +13 -0
  1906. package/src/utils/words.ts +800 -0
  1907. package/src/utils/workloadContext.ts +57 -0
  1908. package/src/utils/worktree.ts +1519 -0
  1909. package/src/utils/worktreeModeEnabled.ts +11 -0
  1910. package/src/utils/xdg.ts +65 -0
  1911. package/src/utils/xml.ts +16 -0
  1912. package/src/utils/yaml.ts +15 -0
  1913. package/src/utils/zodToJsonSchema.ts +23 -0
  1914. package/src/vim/motions.ts +82 -0
  1915. package/src/vim/operators.ts +556 -0
  1916. package/src/vim/textObjects.ts +186 -0
  1917. package/src/vim/transitions.ts +490 -0
  1918. package/src/vim/types.ts +199 -0
  1919. package/src/voice/voiceModeEnabled.ts +54 -0
  1920. package/start.js +1 -0
@@ -0,0 +1,1082 @@
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import type { RefObject } from 'react';
3
+ import * as React from 'react';
4
+ import { useCallback, useContext, useEffect, useImperativeHandle, useRef, useState, useSyncExternalStore } from 'react';
5
+ import { useVirtualScroll } from '../hooks/useVirtualScroll.js';
6
+ import type { ScrollBoxHandle } from '../ink/components/ScrollBox.js';
7
+ import type { DOMElement } from '../ink/dom.js';
8
+ import type { MatchPosition } from '../ink/render-to-screen.js';
9
+ import { Box } from '../ink.js';
10
+ import type { RenderableMessage } from '../types/message.js';
11
+ import { TextHoverColorContext } from './design-system/ThemedText.js';
12
+ import { ScrollChromeContext } from './FullscreenLayout.js';
13
+
14
+ // Rows of breathing room above the target when we scrollTo.
15
+ const HEADROOM = 3;
16
+ import { logForDebugging } from '../utils/debug.js';
17
+ import { sleep } from '../utils/sleep.js';
18
+ import { renderableSearchText } from '../utils/transcriptSearch.js';
19
+ import { isNavigableMessage, type MessageActionsNav, type MessageActionsState, type NavigableMessage, stripSystemReminders, toolCallOf } from './messageActions.js';
20
+
21
+ // Fallback extractor: lower + cache here for callers without the
22
+ // Messages.tsx tool-lookup path (tests, static contexts). Messages.tsx
23
+ // provides its own lowering cache that also handles tool extractSearchText.
24
+ const fallbackLowerCache = new WeakMap<RenderableMessage, string>();
25
+ function defaultExtractSearchText(msg: RenderableMessage): string {
26
+ const cached = fallbackLowerCache.get(msg);
27
+ if (cached !== undefined) return cached;
28
+ const lowered = renderableSearchText(msg);
29
+ fallbackLowerCache.set(msg, lowered);
30
+ return lowered;
31
+ }
32
+ export type StickyPrompt = {
33
+ text: string;
34
+ scrollTo: () => void;
35
+ }
36
+ // Click sets this — header HIDES but padding stays collapsed (0) so
37
+ // the content ❯ lands at screen row 0 instead of row 1. Cleared on
38
+ // the next sticky-prompt compute (user scrolls again).
39
+ | 'clicked';
40
+
41
+ /** Huge pasted prompts (cat file | claude) can be MBs. Header wraps into
42
+ * 2 rows via overflow:hidden — this just bounds the React prop size. */
43
+ const STICKY_TEXT_CAP = 500;
44
+
45
+ /** Imperative handle for transcript navigation. Methods compute matches
46
+ * HERE (renderableMessages indices are only valid inside this component —
47
+ * Messages.tsx filters and reorders, REPL can't compute externally). */
48
+ export type JumpHandle = {
49
+ jumpToIndex: (i: number) => void;
50
+ setSearchQuery: (q: string) => void;
51
+ nextMatch: () => void;
52
+ prevMatch: () => void;
53
+ /** Capture current scrollTop as the incsearch anchor. Typing jumps
54
+ * around as preview; 0-matches snaps back here. Enter/n/N never
55
+ * restore (they don't call setSearchQuery with empty). Next / call
56
+ * overwrites. */
57
+ setAnchor: () => void;
58
+ /** Warm the search-text cache by extracting every message's text.
59
+ * Returns elapsed ms, or 0 if already warm (subsequent / in same
60
+ * transcript session). Yields before work so the caller can paint
61
+ * "indexing…" first. Caller shows "indexed in Xms" on resolve. */
62
+ warmSearchIndex: () => Promise<number>;
63
+ /** Manual scroll (j/k/PgUp/wheel) exited the search context. Clear
64
+ * positions (yellow goes away, inverse highlights stay). Next n/N
65
+ * re-establishes via step()→jump(). Wired from ScrollKeybindingHandler's
66
+ * onScroll — only fires for keyboard/wheel, not programmatic scrollTo. */
67
+ disarmSearch: () => void;
68
+ };
69
+ type Props = {
70
+ messages: RenderableMessage[];
71
+ scrollRef: RefObject<ScrollBoxHandle | null>;
72
+ /** Invalidates heightCache on change — cached heights from a different
73
+ * width are wrong (text rewrap → black screen on scroll-up after widen). */
74
+ columns: number;
75
+ itemKey: (msg: RenderableMessage) => string;
76
+ renderItem: (msg: RenderableMessage, index: number) => React.ReactNode;
77
+ /** Fires when a message Box is clicked (toggle per-message verbose). */
78
+ onItemClick?: (msg: RenderableMessage) => void;
79
+ /** Per-item filter — suppress hover/click for messages where the verbose
80
+ * toggle does nothing (text, file edits, etc). Defaults to all-clickable. */
81
+ isItemClickable?: (msg: RenderableMessage) => boolean;
82
+ /** Expanded items get a persistent grey bg (not just on hover). */
83
+ isItemExpanded?: (msg: RenderableMessage) => boolean;
84
+ /** PRE-LOWERED search text. Messages.tsx caches the lowered result
85
+ * once at warm time so setSearchQuery's per-keystroke loop does
86
+ * only indexOf (zero toLowerCase alloc). Falls back to a lowering
87
+ * wrapper on renderableSearchText for callers without the cache. */
88
+ extractSearchText?: (msg: RenderableMessage) => string;
89
+ /** Enable the sticky-prompt tracker. StickyTracker writes via
90
+ * ScrollChromeContext (not a callback prop) so state lives in
91
+ * FullscreenLayout instead of REPL. */
92
+ trackStickyPrompt?: boolean;
93
+ selectedIndex?: number;
94
+ /** Nav handle lives here because height measurement lives here. */
95
+ cursorNavRef?: React.Ref<MessageActionsNav>;
96
+ setCursor?: (c: MessageActionsState | null) => void;
97
+ jumpRef?: RefObject<JumpHandle | null>;
98
+ /** Fires when search matches change (query edit, n/N). current is
99
+ * 1-based for "3/47" display; 0 means no matches. */
100
+ onSearchMatchesChange?: (count: number, current: number) => void;
101
+ /** Paint existing DOM subtree to fresh Screen, scan. Element from the
102
+ * main tree (all providers). Message-relative positions (row 0 = el
103
+ * top). Works for any height — closes the tall-message gap. */
104
+ scanElement?: (el: DOMElement) => MatchPosition[];
105
+ /** Position-based CURRENT highlight. Positions known upfront (from
106
+ * scanElement), navigation = index arithmetic + scrollTo. rowOffset
107
+ * = message's current screen-top; positions stay stable. */
108
+ setPositions?: (state: {
109
+ positions: MatchPosition[];
110
+ rowOffset: number;
111
+ currentIdx: number;
112
+ } | null) => void;
113
+ };
114
+
115
+ /**
116
+ * Returns the text of a real user prompt, or null for anything else.
117
+ * "Real" = what the human typed: not tool results, not XML-wrapped payloads
118
+ * (<bash-stdout>, <command-message>, <teammate-message>, etc.), not meta.
119
+ *
120
+ * Two shapes land here: NormalizedUserMessage (normal prompts) and
121
+ * AttachmentMessage with type==='queued_command' (prompts sent mid-turn
122
+ * while a tool was executing — they get drained as attachments on the
123
+ * next turn, see query.ts:1410). Both render as ❯-prefixed UserTextMessage
124
+ * in the UI so both should stick.
125
+ *
126
+ * Leading <system-reminder> blocks are stripped before checking — they get
127
+ * prepended to the stored text for Claude's context (memory updates, auto
128
+ * mode reminders) but aren't what the user typed. Without stripping, any
129
+ * prompt that happened to get a reminder is rejected by the startsWith('<')
130
+ * check. Shows up on `cc -c` resumes where memory-update reminders are dense.
131
+ */
132
+ const promptTextCache = new WeakMap<RenderableMessage, string | null>();
133
+ function stickyPromptText(msg: RenderableMessage): string | null {
134
+ // Cache keyed on message object — messages are append-only and don't
135
+ // mutate, so a WeakMap hit is always valid. The walk (StickyTracker,
136
+ // per-scroll-tick) calls this 5-50+ times with the SAME messages every
137
+ // tick; the system-reminder strip allocates a fresh string on each
138
+ // parse. WeakMap self-GCs on compaction/clear (messages[] replaced).
139
+ const cached = promptTextCache.get(msg);
140
+ if (cached !== undefined) return cached;
141
+ const result = computeStickyPromptText(msg);
142
+ promptTextCache.set(msg, result);
143
+ return result;
144
+ }
145
+ function computeStickyPromptText(msg: RenderableMessage): string | null {
146
+ let raw: string | null = null;
147
+ if (msg.type === 'user') {
148
+ if (msg.isMeta || msg.isVisibleInTranscriptOnly) return null;
149
+ const block = msg.message.content[0];
150
+ if (block?.type !== 'text') return null;
151
+ raw = block.text;
152
+ } else if (msg.type === 'attachment' && msg.attachment.type === 'queued_command' && msg.attachment.commandMode !== 'task-notification' && !msg.attachment.isMeta) {
153
+ const p = msg.attachment.prompt;
154
+ raw = typeof p === 'string' ? p : p.flatMap(b => b.type === 'text' ? [b.text] : []).join('\n');
155
+ }
156
+ if (raw === null) return null;
157
+ const t = stripSystemReminders(raw);
158
+ if (t.startsWith('<') || t === '') return null;
159
+ return t;
160
+ }
161
+
162
+ /**
163
+ * Virtualized message list for fullscreen mode. Split from Messages.tsx so
164
+ * useVirtualScroll is called unconditionally (rules-of-hooks) — Messages.tsx
165
+ * conditionally renders either this or a plain .map().
166
+ *
167
+ * The wrapping <Box ref> is the measurement anchor — MessageRow doesn't take
168
+ * a ref. Single-child column Box passes Yoga height through unchanged.
169
+ */
170
+ type VirtualItemProps = {
171
+ itemKey: string;
172
+ msg: RenderableMessage;
173
+ idx: number;
174
+ measureRef: (key: string) => (el: DOMElement | null) => void;
175
+ expanded: boolean | undefined;
176
+ hovered: boolean;
177
+ clickable: boolean;
178
+ onClickK: (msg: RenderableMessage, cellIsBlank: boolean) => void;
179
+ onEnterK: (k: string) => void;
180
+ onLeaveK: (k: string) => void;
181
+ renderItem: (msg: RenderableMessage, idx: number) => React.ReactNode;
182
+ };
183
+
184
+ // Item wrapper with stable click handlers. The per-item closures were the
185
+ // `operationNewArrowFunction` leafs → `FunctionExecutable::finalizeUnconditionally`
186
+ // GC cleanup (16% of GC time during fast scroll). 3 closures × 60 mounted ×
187
+ // 10 commits/sec = 1800 closures/sec. With stable onClickK/onEnterK/onLeaveK
188
+ // threaded via itemKey, the closures here are per-item-per-render but CHEAP
189
+ // (just wrap the stable callback with k bound) and don't close over msg/idx
190
+ // which lets JIT inline them. The bigger win is inside: MessageRow.memo
191
+ // bails for unchanged msgs, skipping marked.lexer + formatToken.
192
+ //
193
+ // NOT React.memo'd — renderItem captures changing state (cursor, selectedIdx,
194
+ // verbose). Memoing with a comparator that ignores renderItem would use a
195
+ // STALE closure on bail (wrong selection highlight, stale verbose). Including
196
+ // renderItem in the comparator defeats memo since it's fresh each render.
197
+ function VirtualItem(t0) {
198
+ const $ = _c(30);
199
+ const {
200
+ itemKey: k,
201
+ msg,
202
+ idx,
203
+ measureRef,
204
+ expanded,
205
+ hovered,
206
+ clickable,
207
+ onClickK,
208
+ onEnterK,
209
+ onLeaveK,
210
+ renderItem
211
+ } = t0;
212
+ let t1;
213
+ if ($[0] !== k || $[1] !== measureRef) {
214
+ t1 = measureRef(k);
215
+ $[0] = k;
216
+ $[1] = measureRef;
217
+ $[2] = t1;
218
+ } else {
219
+ t1 = $[2];
220
+ }
221
+ const t2 = expanded ? "userMessageBackgroundHover" : undefined;
222
+ const t3 = expanded ? 1 : undefined;
223
+ let t4;
224
+ if ($[3] !== clickable || $[4] !== msg || $[5] !== onClickK) {
225
+ t4 = clickable ? e => onClickK(msg, e.cellIsBlank) : undefined;
226
+ $[3] = clickable;
227
+ $[4] = msg;
228
+ $[5] = onClickK;
229
+ $[6] = t4;
230
+ } else {
231
+ t4 = $[6];
232
+ }
233
+ let t5;
234
+ if ($[7] !== clickable || $[8] !== k || $[9] !== onEnterK) {
235
+ t5 = clickable ? () => onEnterK(k) : undefined;
236
+ $[7] = clickable;
237
+ $[8] = k;
238
+ $[9] = onEnterK;
239
+ $[10] = t5;
240
+ } else {
241
+ t5 = $[10];
242
+ }
243
+ let t6;
244
+ if ($[11] !== clickable || $[12] !== k || $[13] !== onLeaveK) {
245
+ t6 = clickable ? () => onLeaveK(k) : undefined;
246
+ $[11] = clickable;
247
+ $[12] = k;
248
+ $[13] = onLeaveK;
249
+ $[14] = t6;
250
+ } else {
251
+ t6 = $[14];
252
+ }
253
+ const t7 = hovered && !expanded ? "text" : undefined;
254
+ let t8;
255
+ if ($[15] !== idx || $[16] !== msg || $[17] !== renderItem) {
256
+ t8 = renderItem(msg, idx);
257
+ $[15] = idx;
258
+ $[16] = msg;
259
+ $[17] = renderItem;
260
+ $[18] = t8;
261
+ } else {
262
+ t8 = $[18];
263
+ }
264
+ let t9;
265
+ if ($[19] !== t7 || $[20] !== t8) {
266
+ t9 = <TextHoverColorContext.Provider value={t7}>{t8}</TextHoverColorContext.Provider>;
267
+ $[19] = t7;
268
+ $[20] = t8;
269
+ $[21] = t9;
270
+ } else {
271
+ t9 = $[21];
272
+ }
273
+ let t10;
274
+ if ($[22] !== t1 || $[23] !== t2 || $[24] !== t3 || $[25] !== t4 || $[26] !== t5 || $[27] !== t6 || $[28] !== t9) {
275
+ t10 = <Box ref={t1} flexDirection="column" backgroundColor={t2} paddingBottom={t3} onClick={t4} onMouseEnter={t5} onMouseLeave={t6}>{t9}</Box>;
276
+ $[22] = t1;
277
+ $[23] = t2;
278
+ $[24] = t3;
279
+ $[25] = t4;
280
+ $[26] = t5;
281
+ $[27] = t6;
282
+ $[28] = t9;
283
+ $[29] = t10;
284
+ } else {
285
+ t10 = $[29];
286
+ }
287
+ return t10;
288
+ }
289
+ export function VirtualMessageList({
290
+ messages,
291
+ scrollRef,
292
+ columns,
293
+ itemKey,
294
+ renderItem,
295
+ onItemClick,
296
+ isItemClickable,
297
+ isItemExpanded,
298
+ extractSearchText = defaultExtractSearchText,
299
+ trackStickyPrompt,
300
+ selectedIndex,
301
+ cursorNavRef,
302
+ setCursor,
303
+ jumpRef,
304
+ onSearchMatchesChange,
305
+ scanElement,
306
+ setPositions
307
+ }: Props): React.ReactNode {
308
+ // Incremental key array. Streaming appends one message at a time; rebuilding
309
+ // the full string array on every commit allocates O(n) per message (~1MB
310
+ // churn at 27k messages). Append-only delta push when the prefix matches;
311
+ // fall back to full rebuild on compaction, /clear, or itemKey change.
312
+ const keysRef = useRef<string[]>([]);
313
+ const prevMessagesRef = useRef<typeof messages>(messages);
314
+ const prevItemKeyRef = useRef(itemKey);
315
+ if (prevItemKeyRef.current !== itemKey || messages.length < keysRef.current.length || messages[0] !== prevMessagesRef.current[0]) {
316
+ keysRef.current = messages.map(m => itemKey(m));
317
+ } else {
318
+ for (let i = keysRef.current.length; i < messages.length; i++) {
319
+ keysRef.current.push(itemKey(messages[i]!));
320
+ }
321
+ }
322
+ prevMessagesRef.current = messages;
323
+ prevItemKeyRef.current = itemKey;
324
+ const keys = keysRef.current;
325
+ const {
326
+ range,
327
+ topSpacer,
328
+ bottomSpacer,
329
+ measureRef,
330
+ spacerRef,
331
+ offsets,
332
+ getItemTop,
333
+ getItemElement,
334
+ getItemHeight,
335
+ scrollToIndex
336
+ } = useVirtualScroll(scrollRef, keys, columns);
337
+ const [start, end] = range;
338
+
339
+ // Unmeasured (undefined height) falls through — assume visible.
340
+ const isVisible = useCallback((i: number) => {
341
+ const h = getItemHeight(i);
342
+ if (h === 0) return false;
343
+ return isNavigableMessage(messages[i]!);
344
+ }, [getItemHeight, messages]);
345
+ useImperativeHandle(cursorNavRef, (): MessageActionsNav => {
346
+ const select = (m: NavigableMessage) => setCursor?.({
347
+ uuid: m.uuid,
348
+ msgType: m.type,
349
+ expanded: false,
350
+ toolName: toolCallOf(m)?.name
351
+ });
352
+ const selIdx = selectedIndex ?? -1;
353
+ const scan = (from: number, dir: 1 | -1, pred: (i: number) => boolean = isVisible) => {
354
+ for (let i = from; i >= 0 && i < messages.length; i += dir) {
355
+ if (pred(i)) {
356
+ select(messages[i]!);
357
+ return true;
358
+ }
359
+ }
360
+ return false;
361
+ };
362
+ const isUser = (i: number) => isVisible(i) && messages[i]!.type === 'user';
363
+ return {
364
+ // Entry via shift+↑ = same semantic as in-cursor shift+↑ (prevUser).
365
+ enterCursor: () => scan(messages.length - 1, -1, isUser),
366
+ navigatePrev: () => scan(selIdx - 1, -1),
367
+ navigateNext: () => {
368
+ if (scan(selIdx + 1, 1)) return;
369
+ // Past last visible → exit + repin. Last message's TOP is at viewport
370
+ // top (selection-scroll effect); its BOTTOM may be below the fold.
371
+ scrollRef.current?.scrollToBottom();
372
+ setCursor?.(null);
373
+ },
374
+ // type:'user' only — queued_command attachments look like prompts but have no raw UserMessage to rewind to.
375
+ navigatePrevUser: () => scan(selIdx - 1, -1, isUser),
376
+ navigateNextUser: () => scan(selIdx + 1, 1, isUser),
377
+ navigateTop: () => scan(0, 1),
378
+ navigateBottom: () => scan(messages.length - 1, -1),
379
+ getSelected: () => selIdx >= 0 ? messages[selIdx] ?? null : null
380
+ };
381
+ }, [messages, selectedIndex, setCursor, isVisible]);
382
+ // Two-phase jump + search engine. Read-through-ref so the handle stays
383
+ // stable across renders — offsets/messages identity changes every render,
384
+ // can't go in useImperativeHandle deps without recreating the handle.
385
+ const jumpState = useRef({
386
+ offsets,
387
+ start,
388
+ getItemElement,
389
+ getItemTop,
390
+ messages,
391
+ scrollToIndex
392
+ });
393
+ jumpState.current = {
394
+ offsets,
395
+ start,
396
+ getItemElement,
397
+ getItemTop,
398
+ messages,
399
+ scrollToIndex
400
+ };
401
+
402
+ // Keep cursor-selected message visible. offsets rebuilds every render
403
+ // — as a bare dep this re-pinned on every mousewheel tick. Read through
404
+ // jumpState instead; past-overscan jumps land via scrollToIndex, next
405
+ // nav is precise.
406
+ useEffect(() => {
407
+ if (selectedIndex === undefined) return;
408
+ const s = jumpState.current;
409
+ const el = s.getItemElement(selectedIndex);
410
+ if (el) {
411
+ scrollRef.current?.scrollToElement(el, 1);
412
+ } else {
413
+ s.scrollToIndex(selectedIndex);
414
+ }
415
+ }, [selectedIndex, scrollRef]);
416
+
417
+ // Pending seek request. jump() sets this + bumps seekGen. The seek
418
+ // effect fires post-paint (passive effect — after resetAfterCommit),
419
+ // checks if target is mounted. Yes → scan+highlight. No → re-estimate
420
+ // with a fresher anchor (start moved toward idx) and scrollTo again.
421
+ const scanRequestRef = useRef<{
422
+ idx: number;
423
+ wantLast: boolean;
424
+ tries: number;
425
+ } | null>(null);
426
+ // Message-relative positions from scanElement. Row 0 = message top.
427
+ // Stable across scroll — highlight computes rowOffset fresh. msgIdx
428
+ // for computing rowOffset = getItemTop(msgIdx) - scrollTop.
429
+ const elementPositions = useRef<{
430
+ msgIdx: number;
431
+ positions: MatchPosition[];
432
+ }>({
433
+ msgIdx: -1,
434
+ positions: []
435
+ });
436
+ // Wraparound guard. Auto-advance stops if ptr wraps back to here.
437
+ const startPtrRef = useRef(-1);
438
+ // Phantom-burst cap. Resets on scan success.
439
+ const phantomBurstRef = useRef(0);
440
+ // One-deep queue: n/N arriving mid-seek gets stored (not dropped) and
441
+ // fires after the seek completes. Holding n stays smooth without
442
+ // queueing 30 jumps. Latest press overwrites — we want the direction
443
+ // the user is going NOW, not where they were 10 keypresses ago.
444
+ const pendingStepRef = useRef<1 | -1 | 0>(0);
445
+ // step + highlight via ref so the seek effect reads latest without
446
+ // closure-capture or deps churn.
447
+ const stepRef = useRef<(d: 1 | -1) => void>(() => {});
448
+ const highlightRef = useRef<(ord: number) => void>(() => {});
449
+ const searchState = useRef({
450
+ matches: [] as number[],
451
+ // deduplicated msg indices
452
+ ptr: 0,
453
+ screenOrd: 0,
454
+ // Cumulative engine-occurrence count before each matches[k]. Lets us
455
+ // compute a global current index: prefixSum[ptr] + screenOrd + 1.
456
+ // Engine-counted (indexOf on extractSearchText), not render-counted —
457
+ // close enough for the badge; exact counts would need scanElement on
458
+ // every matched message (~1-3ms × N). total = prefixSum[matches.length].
459
+ prefixSum: [] as number[]
460
+ });
461
+ // scrollTop at the moment / was pressed. Incsearch preview-jumps snap
462
+ // back here when matches drop to 0. -1 = no anchor (before first /).
463
+ const searchAnchor = useRef(-1);
464
+ const indexWarmed = useRef(false);
465
+
466
+ // Scroll target for message i: land at MESSAGE TOP. est = top - HEADROOM
467
+ // so lo = top - est = HEADROOM ≥ 0 (or lo = top if est clamped to 0).
468
+ // Post-clamp read-back in jump() handles the scrollHeight boundary.
469
+ // No frac (render transform didn't respect it), no monotone clamp
470
+ // (was a safety net for frac garbage — without frac, est IS the next
471
+ // message's top, spam-n/N converges because message tops are ordered).
472
+ function targetFor(i: number): number {
473
+ const top = jumpState.current.getItemTop(i);
474
+ return Math.max(0, top - HEADROOM);
475
+ }
476
+
477
+ // Highlight positions[ord]. Positions are MESSAGE-RELATIVE (row 0 =
478
+ // element top, from scanElement). Compute rowOffset = getItemTop -
479
+ // scrollTop fresh. If ord's position is off-viewport, scroll to bring
480
+ // it in, recompute rowOffset. setPositions triggers overlay write.
481
+ function highlight(ord: number): void {
482
+ const s = scrollRef.current;
483
+ const {
484
+ msgIdx,
485
+ positions
486
+ } = elementPositions.current;
487
+ if (!s || positions.length === 0 || msgIdx < 0) {
488
+ setPositions?.(null);
489
+ return;
490
+ }
491
+ const idx = Math.max(0, Math.min(ord, positions.length - 1));
492
+ const p = positions[idx]!;
493
+ const top = jumpState.current.getItemTop(msgIdx);
494
+ // lo = item's position within scroll content (wrapper-relative).
495
+ // viewportTop = where the scroll content starts on SCREEN (after
496
+ // ScrollBox padding/border + any chrome above). Highlight writes to
497
+ // screen-absolute, so rowOffset = viewportTop + lo. Observed: off-by-
498
+ // 1+ without viewportTop (FullscreenLayout has paddingTop=1 on the
499
+ // ScrollBox, plus any header above).
500
+ const vpTop = s.getViewportTop();
501
+ let lo = top - s.getScrollTop();
502
+ const vp = s.getViewportHeight();
503
+ let screenRow = vpTop + lo + p.row;
504
+ // Off viewport → scroll to bring it in (HEADROOM from top).
505
+ // scrollTo commits sync; read-back after gives fresh lo.
506
+ if (screenRow < vpTop || screenRow >= vpTop + vp) {
507
+ s.scrollTo(Math.max(0, top + p.row - HEADROOM));
508
+ lo = top - s.getScrollTop();
509
+ screenRow = vpTop + lo + p.row;
510
+ }
511
+ setPositions?.({
512
+ positions,
513
+ rowOffset: vpTop + lo,
514
+ currentIdx: idx
515
+ });
516
+ // Badge: global current = sum of occurrences before this msg + ord+1.
517
+ // prefixSum[ptr] is engine-counted (indexOf on extractSearchText);
518
+ // may drift from render-count for ghost messages but close enough —
519
+ // badge is a rough location hint, not a proof.
520
+ const st = searchState.current;
521
+ const total = st.prefixSum.at(-1) ?? 0;
522
+ const current = (st.prefixSum[st.ptr] ?? 0) + idx + 1;
523
+ onSearchMatchesChange?.(total, current);
524
+ logForDebugging(`highlight(i=${msgIdx}, ord=${idx}/${positions.length}): ` + `pos={row:${p.row},col:${p.col}} lo=${lo} screenRow=${screenRow} ` + `badge=${current}/${total}`);
525
+ }
526
+ highlightRef.current = highlight;
527
+
528
+ // Seek effect. jump() sets scanRequestRef + scrollToIndex + bump.
529
+ // bump → re-render → useVirtualScroll mounts the target (scrollToIndex
530
+ // guarantees this — scrollTop and topSpacer agree via the same
531
+ // offsets value) → resetAfterCommit paints → this passive effect
532
+ // fires POST-PAINT with the element mounted. Precise scrollTo + scan.
533
+ //
534
+ // Dep is ONLY seekGen — effect doesn't re-run on random renders
535
+ // (onSearchMatchesChange churn during incsearch).
536
+ const [seekGen, setSeekGen] = useState(0);
537
+ const bumpSeek = useCallback(() => setSeekGen(g => g + 1), []);
538
+ useEffect(() => {
539
+ const req = scanRequestRef.current;
540
+ if (!req) return;
541
+ const {
542
+ idx,
543
+ wantLast,
544
+ tries
545
+ } = req;
546
+ const s = scrollRef.current;
547
+ if (!s) return;
548
+ const {
549
+ getItemElement,
550
+ getItemTop,
551
+ scrollToIndex
552
+ } = jumpState.current;
553
+ const el = getItemElement(idx);
554
+ const h = el?.yogaNode?.getComputedHeight() ?? 0;
555
+ if (!el || h === 0) {
556
+ // Not mounted after scrollToIndex. Shouldn't happen — scrollToIndex
557
+ // guarantees mount by construction (scrollTop and topSpacer agree
558
+ // via the same offsets value). Sanity: retry once, then skip.
559
+ if (tries > 1) {
560
+ scanRequestRef.current = null;
561
+ logForDebugging(`seek(i=${idx}): no mount after scrollToIndex, skip`);
562
+ stepRef.current(wantLast ? -1 : 1);
563
+ return;
564
+ }
565
+ scanRequestRef.current = {
566
+ idx,
567
+ wantLast,
568
+ tries: tries + 1
569
+ };
570
+ scrollToIndex(idx);
571
+ bumpSeek();
572
+ return;
573
+ }
574
+ scanRequestRef.current = null;
575
+ // Precise scrollTo — scrollToIndex got us in the neighborhood
576
+ // (item is mounted, maybe a few-dozen rows off due to overscan
577
+ // estimate drift). Now land it at top-HEADROOM.
578
+ s.scrollTo(Math.max(0, getItemTop(idx) - HEADROOM));
579
+ const positions = scanElement?.(el) ?? [];
580
+ elementPositions.current = {
581
+ msgIdx: idx,
582
+ positions
583
+ };
584
+ logForDebugging(`seek(i=${idx} t=${tries}): ${positions.length} positions`);
585
+ if (positions.length === 0) {
586
+ // Phantom — engine matched, render didn't. Auto-advance.
587
+ if (++phantomBurstRef.current > 20) {
588
+ phantomBurstRef.current = 0;
589
+ return;
590
+ }
591
+ stepRef.current(wantLast ? -1 : 1);
592
+ return;
593
+ }
594
+ phantomBurstRef.current = 0;
595
+ const ord = wantLast ? positions.length - 1 : 0;
596
+ searchState.current.screenOrd = ord;
597
+ startPtrRef.current = -1;
598
+ highlightRef.current(ord);
599
+ const pending = pendingStepRef.current;
600
+ if (pending) {
601
+ pendingStepRef.current = 0;
602
+ stepRef.current(pending);
603
+ }
604
+ // eslint-disable-next-line react-hooks/exhaustive-deps
605
+ }, [seekGen]);
606
+
607
+ // Scroll to message i's top, arm scanPending. scan-effect reads fresh
608
+ // screen next tick. wantLast: N-into-message — screenOrd = length-1.
609
+ function jump(i: number, wantLast: boolean): void {
610
+ const s = scrollRef.current;
611
+ if (!s) return;
612
+ const js = jumpState.current;
613
+ const {
614
+ getItemElement,
615
+ scrollToIndex
616
+ } = js;
617
+ // offsets is a Float64Array whose .length is the allocated buffer (only
618
+ // grows) — messages.length is the logical item count.
619
+ if (i < 0 || i >= js.messages.length) return;
620
+ // Clear stale highlight before scroll. Between now and the seek
621
+ // effect's highlight, inverse-only from scan-highlight shows.
622
+ setPositions?.(null);
623
+ elementPositions.current = {
624
+ msgIdx: -1,
625
+ positions: []
626
+ };
627
+ scanRequestRef.current = {
628
+ idx: i,
629
+ wantLast,
630
+ tries: 0
631
+ };
632
+ const el = getItemElement(i);
633
+ const h = el?.yogaNode?.getComputedHeight() ?? 0;
634
+ // Mounted → precise scrollTo. Unmounted → scrollToIndex mounts it
635
+ // (scrollTop and topSpacer agree via the same offsets value — exact
636
+ // by construction, no estimation). Seek effect does the precise
637
+ // scrollTo after paint either way.
638
+ if (el && h > 0) {
639
+ s.scrollTo(targetFor(i));
640
+ } else {
641
+ scrollToIndex(i);
642
+ }
643
+ bumpSeek();
644
+ }
645
+
646
+ // Advance screenOrd within elementPositions. Exhausted → ptr advances,
647
+ // jump to next matches[ptr], re-scan. Phantom (scan found 0 after
648
+ // jump) triggers auto-advance from scan-effect. Wraparound guard stops
649
+ // if every message is a phantom.
650
+ function step(delta: 1 | -1): void {
651
+ const st = searchState.current;
652
+ const {
653
+ matches,
654
+ prefixSum
655
+ } = st;
656
+ const total = prefixSum.at(-1) ?? 0;
657
+ if (matches.length === 0) return;
658
+
659
+ // Seek in-flight — queue this press (one-deep, latest overwrites).
660
+ // The seek effect fires it after highlight.
661
+ if (scanRequestRef.current) {
662
+ pendingStepRef.current = delta;
663
+ return;
664
+ }
665
+ if (startPtrRef.current < 0) startPtrRef.current = st.ptr;
666
+ const {
667
+ positions
668
+ } = elementPositions.current;
669
+ const newOrd = st.screenOrd + delta;
670
+ if (newOrd >= 0 && newOrd < positions.length) {
671
+ st.screenOrd = newOrd;
672
+ highlight(newOrd); // updates badge internally
673
+ startPtrRef.current = -1;
674
+ return;
675
+ }
676
+
677
+ // Exhausted visible. Advance ptr → jump → re-scan.
678
+ const ptr = (st.ptr + delta + matches.length) % matches.length;
679
+ if (ptr === startPtrRef.current) {
680
+ setPositions?.(null);
681
+ startPtrRef.current = -1;
682
+ logForDebugging(`step: wraparound at ptr=${ptr}, all ${matches.length} msgs phantoms`);
683
+ return;
684
+ }
685
+ st.ptr = ptr;
686
+ st.screenOrd = 0; // resolved after scan (wantLast → length-1)
687
+ jump(matches[ptr]!, delta < 0);
688
+ // screenOrd will resolve after scan. Best-effort: prefixSum[ptr] + 0
689
+ // for n (first pos), prefixSum[ptr+1] for N (last pos = count-1).
690
+ // The scan-effect's highlight will be the real value; this is a
691
+ // pre-scan placeholder so the badge updates immediately.
692
+ const placeholder = delta < 0 ? prefixSum[ptr + 1] ?? total : prefixSum[ptr]! + 1;
693
+ onSearchMatchesChange?.(total, placeholder);
694
+ }
695
+ stepRef.current = step;
696
+ useImperativeHandle(jumpRef, () => ({
697
+ // Non-search jump (sticky header click, etc). No scan, no positions.
698
+ jumpToIndex: (i: number) => {
699
+ const s = scrollRef.current;
700
+ if (s) s.scrollTo(targetFor(i));
701
+ },
702
+ setSearchQuery: (q: string) => {
703
+ // New search invalidates everything.
704
+ scanRequestRef.current = null;
705
+ elementPositions.current = {
706
+ msgIdx: -1,
707
+ positions: []
708
+ };
709
+ startPtrRef.current = -1;
710
+ setPositions?.(null);
711
+ const lq = q.toLowerCase();
712
+ // One entry per MESSAGE (deduplicated). Boolean "does this msg
713
+ // contain the query". ~10ms for 9k messages with cached lowered.
714
+ const matches: number[] = [];
715
+ // Per-message occurrence count → prefixSum for global current
716
+ // index. Engine-counted (cheap indexOf loop); may differ from
717
+ // render-count (scanElement) for ghost/phantom messages but close
718
+ // enough for the badge. The badge is a rough location hint.
719
+ const prefixSum: number[] = [0];
720
+ if (lq) {
721
+ const msgs = jumpState.current.messages;
722
+ for (let i = 0; i < msgs.length; i++) {
723
+ const text = extractSearchText(msgs[i]!);
724
+ let pos = text.indexOf(lq);
725
+ let cnt = 0;
726
+ while (pos >= 0) {
727
+ cnt++;
728
+ pos = text.indexOf(lq, pos + lq.length);
729
+ }
730
+ if (cnt > 0) {
731
+ matches.push(i);
732
+ prefixSum.push(prefixSum.at(-1)! + cnt);
733
+ }
734
+ }
735
+ }
736
+ const total = prefixSum.at(-1)!;
737
+ // Nearest MESSAGE to the anchor. <= so ties go to later.
738
+ let ptr = 0;
739
+ const s = scrollRef.current;
740
+ const {
741
+ offsets,
742
+ start,
743
+ getItemTop
744
+ } = jumpState.current;
745
+ const firstTop = getItemTop(start);
746
+ const origin = firstTop >= 0 ? firstTop - offsets[start]! : 0;
747
+ if (matches.length > 0 && s) {
748
+ const curTop = searchAnchor.current >= 0 ? searchAnchor.current : s.getScrollTop();
749
+ let best = Infinity;
750
+ for (let k = 0; k < matches.length; k++) {
751
+ const d = Math.abs(origin + offsets[matches[k]!]! - curTop);
752
+ if (d <= best) {
753
+ best = d;
754
+ ptr = k;
755
+ }
756
+ }
757
+ logForDebugging(`setSearchQuery('${q}'): ${matches.length} msgs · ptr=${ptr} ` + `msgIdx=${matches[ptr]} curTop=${curTop} origin=${origin}`);
758
+ }
759
+ searchState.current = {
760
+ matches,
761
+ ptr,
762
+ screenOrd: 0,
763
+ prefixSum
764
+ };
765
+ if (matches.length > 0) {
766
+ // wantLast=true: preview the LAST occurrence in the nearest
767
+ // message. At sticky-bottom (common / entry), nearest is the
768
+ // last msg; its last occurrence is closest to where the user
769
+ // was — minimal view movement. n advances forward from there.
770
+ jump(matches[ptr]!, true);
771
+ } else if (searchAnchor.current >= 0 && s) {
772
+ // /foob → 0 matches → snap back to anchor. less/vim incsearch.
773
+ s.scrollTo(searchAnchor.current);
774
+ }
775
+ // Global occurrence count + 1-based current. wantLast=true so the
776
+ // scan will land on the last occurrence in matches[ptr]. Placeholder
777
+ // = prefixSum[ptr+1] (count through this msg). highlight() updates
778
+ // to the exact value after scan completes.
779
+ onSearchMatchesChange?.(total, matches.length > 0 ? prefixSum[ptr + 1] ?? total : 0);
780
+ },
781
+ nextMatch: () => step(1),
782
+ prevMatch: () => step(-1),
783
+ setAnchor: () => {
784
+ const s = scrollRef.current;
785
+ if (s) searchAnchor.current = s.getScrollTop();
786
+ },
787
+ disarmSearch: () => {
788
+ // Manual scroll invalidates screen-absolute positions.
789
+ setPositions?.(null);
790
+ scanRequestRef.current = null;
791
+ elementPositions.current = {
792
+ msgIdx: -1,
793
+ positions: []
794
+ };
795
+ startPtrRef.current = -1;
796
+ },
797
+ warmSearchIndex: async () => {
798
+ if (indexWarmed.current) return 0;
799
+ const msgs = jumpState.current.messages;
800
+ const CHUNK = 500;
801
+ let workMs = 0;
802
+ const wallStart = performance.now();
803
+ for (let i = 0; i < msgs.length; i += CHUNK) {
804
+ await sleep(0);
805
+ const t0 = performance.now();
806
+ const end = Math.min(i + CHUNK, msgs.length);
807
+ for (let j = i; j < end; j++) {
808
+ extractSearchText(msgs[j]!);
809
+ }
810
+ workMs += performance.now() - t0;
811
+ }
812
+ const wallMs = Math.round(performance.now() - wallStart);
813
+ logForDebugging(`warmSearchIndex: ${msgs.length} msgs · work=${Math.round(workMs)}ms wall=${wallMs}ms chunks=${Math.ceil(msgs.length / CHUNK)}`);
814
+ indexWarmed.current = true;
815
+ return Math.round(workMs);
816
+ }
817
+ }),
818
+ // Closures over refs + callbacks. scrollRef stable; others are
819
+ // useCallback([]) or prop-drilled from REPL (stable).
820
+ // eslint-disable-next-line react-hooks/exhaustive-deps
821
+ [scrollRef]);
822
+
823
+ // StickyTracker goes AFTER the list content. It returns null (no DOM node)
824
+ // so order shouldn't matter for layout — but putting it first means every
825
+ // fine-grained commit from its own scroll subscription reconciles THROUGH
826
+ // the sibling items (React walks children in order). After the items, it's
827
+ // a leaf reconcile. Defensive: also avoids any Yoga child-index quirks if
828
+ // the Ink reconciler ever materializes a placeholder for null returns.
829
+ const [hoveredKey, setHoveredKey] = useState<string | null>(null);
830
+ // Stable click/hover handlers — called with k, dispatch from a ref so
831
+ // closure identity doesn't change per render. The per-item handler
832
+ // closures (`e => ...`, `() => setHoveredKey(k)`) were the
833
+ // `operationNewArrowFunction` leafs in the scroll CPU profile; their
834
+ // cleanup was 16% of GC time (`FunctionExecutable::finalizeUnconditionally`).
835
+ // Allocating 3 closures × 60 mounted items × 10 commits/sec during fast
836
+ // scroll = 1800 short-lived closures/sec. With stable refs the item
837
+ // wrapper props don't change → VirtualItem.memo bails for the ~35
838
+ // unchanged items, only ~25 fresh items pay createElement cost.
839
+ const handlersRef = useRef({
840
+ onItemClick,
841
+ setHoveredKey
842
+ });
843
+ handlersRef.current = {
844
+ onItemClick,
845
+ setHoveredKey
846
+ };
847
+ const onClickK = useCallback((msg: RenderableMessage, cellIsBlank: boolean) => {
848
+ const h = handlersRef.current;
849
+ if (!cellIsBlank && h.onItemClick) h.onItemClick(msg);
850
+ }, []);
851
+ const onEnterK = useCallback((k: string) => {
852
+ handlersRef.current.setHoveredKey(k);
853
+ }, []);
854
+ const onLeaveK = useCallback((k: string) => {
855
+ handlersRef.current.setHoveredKey(prev => prev === k ? null : prev);
856
+ }, []);
857
+ return <>
858
+ <Box ref={spacerRef} height={topSpacer} flexShrink={0} />
859
+ {messages.slice(start, end).map((msg, i) => {
860
+ const idx = start + i;
861
+ const k = keys[idx]!;
862
+ const clickable = !!onItemClick && (isItemClickable?.(msg) ?? true);
863
+ const hovered = clickable && hoveredKey === k;
864
+ const expanded = isItemExpanded?.(msg);
865
+ return <VirtualItem key={k} itemKey={k} msg={msg} idx={idx} measureRef={measureRef} expanded={expanded} hovered={hovered} clickable={clickable} onClickK={onClickK} onEnterK={onEnterK} onLeaveK={onLeaveK} renderItem={renderItem} />;
866
+ })}
867
+ {bottomSpacer > 0 && <Box height={bottomSpacer} flexShrink={0} />}
868
+ {trackStickyPrompt && <StickyTracker messages={messages} start={start} end={end} offsets={offsets} getItemTop={getItemTop} getItemElement={getItemElement} scrollRef={scrollRef} />}
869
+ </>;
870
+ }
871
+ const NOOP_UNSUB = () => {};
872
+
873
+ /**
874
+ * Effect-only child that tracks the last user-prompt scrolled above the
875
+ * viewport top and fires onChange when it changes.
876
+ *
877
+ * Rendered as a separate component (not a hook in VirtualMessageList) so it
878
+ * can subscribe to scroll at FINER granularity than SCROLL_QUANTUM=40. The
879
+ * list needs the coarse quantum to avoid per-wheel-tick Yoga relayouts; this
880
+ * tracker is just a walk + comparison and can afford to run every tick. When
881
+ * it re-renders alone, the list's reconciled output is unchanged (same props
882
+ * from the parent's last commit) — no Yoga work. Without this split, the
883
+ * header lags by ~one conversation turn (40 rows ≈ one prompt + response).
884
+ *
885
+ * firstVisible derivation: item Boxes are direct Yoga children of the
886
+ * ScrollBox content wrapper (fragments collapse in the Ink DOM), so
887
+ * yoga.getComputedTop is content-wrapper-relative — same coordinate space as
888
+ * scrollTop. Compare against scrollTop + pendingDelta (the scroll TARGET —
889
+ * scrollBy only sets pendingDelta, committed scrollTop lags). Walk backward
890
+ * from the mount-range end; break when an item's top is above target.
891
+ */
892
+ function StickyTracker({
893
+ messages,
894
+ start,
895
+ end,
896
+ offsets,
897
+ getItemTop,
898
+ getItemElement,
899
+ scrollRef
900
+ }: {
901
+ messages: RenderableMessage[];
902
+ start: number;
903
+ end: number;
904
+ offsets: ArrayLike<number>;
905
+ getItemTop: (index: number) => number;
906
+ getItemElement: (index: number) => DOMElement | null;
907
+ scrollRef: RefObject<ScrollBoxHandle | null>;
908
+ }): null {
909
+ const {
910
+ setStickyPrompt
911
+ } = useContext(ScrollChromeContext);
912
+ // Fine-grained subscription — snapshot is unquantized scrollTop+delta so
913
+ // every scroll action (wheel tick, PgUp, drag) triggers a re-render of
914
+ // THIS component only. Sticky bit folded into the sign so sticky→broken
915
+ // also triggers (scrollToBottom sets sticky without moving scrollTop).
916
+ const subscribe = useCallback((listener: () => void) => scrollRef.current?.subscribe(listener) ?? NOOP_UNSUB, [scrollRef]);
917
+ useSyncExternalStore(subscribe, () => {
918
+ const s = scrollRef.current;
919
+ if (!s) return NaN;
920
+ const t = s.getScrollTop() + s.getPendingDelta();
921
+ return s.isSticky() ? -1 - t : t;
922
+ });
923
+
924
+ // Read live scroll state on every render.
925
+ const isSticky = scrollRef.current?.isSticky() ?? true;
926
+ const target = Math.max(0, (scrollRef.current?.getScrollTop() ?? 0) + (scrollRef.current?.getPendingDelta() ?? 0));
927
+
928
+ // Walk the mounted range to find the first item at-or-below the viewport
929
+ // top. `range` is from the parent's coarse-quantum render (may be slightly
930
+ // stale) but overscan guarantees it spans well past the viewport in both
931
+ // directions. Items without a Yoga layout yet (newly mounted this frame)
932
+ // are treated as at-or-below — they're somewhere in view, and assuming
933
+ // otherwise would show a sticky for a prompt that's actually on screen.
934
+ let firstVisible = start;
935
+ let firstVisibleTop = -1;
936
+ for (let i = end - 1; i >= start; i--) {
937
+ const top = getItemTop(i);
938
+ if (top >= 0) {
939
+ if (top < target) break;
940
+ firstVisibleTop = top;
941
+ }
942
+ firstVisible = i;
943
+ }
944
+ let idx = -1;
945
+ let text: string | null = null;
946
+ if (firstVisible > 0 && !isSticky) {
947
+ for (let i = firstVisible - 1; i >= 0; i--) {
948
+ const t = stickyPromptText(messages[i]!);
949
+ if (t === null) continue;
950
+ // The prompt's wrapping Box top is above target (that's why it's in
951
+ // the [0, firstVisible) range), but its ❯ is at top+1 (marginTop=1).
952
+ // If the ❯ is at-or-below target, it's VISIBLE at viewport top —
953
+ // showing the same text in the header would duplicate it. Happens
954
+ // in the 1-row gap between Box top scrolling past and ❯ scrolling
955
+ // past. Skip to the next-older prompt (its ❯ is definitely above).
956
+ const top = getItemTop(i);
957
+ if (top >= 0 && top + 1 >= target) continue;
958
+ idx = i;
959
+ text = t;
960
+ break;
961
+ }
962
+ }
963
+ const baseOffset = firstVisibleTop >= 0 ? firstVisibleTop - offsets[firstVisible]! : 0;
964
+ const estimate = idx >= 0 ? Math.max(0, baseOffset + offsets[idx]!) : -1;
965
+
966
+ // For click-jumps to items not yet mounted (user scrolled far past,
967
+ // prompt is in the topSpacer). Click handler scrolls to the estimate
968
+ // to mount it; this anchors by element once it appears. scrollToElement
969
+ // defers the Yoga-position read to render time (render-node-to-output
970
+ // reads el.yogaNode.getComputedTop() in the SAME calculateLayout pass
971
+ // that produces scrollHeight) — no throttle race. Cap retries: a /clear
972
+ // race could unmount the item mid-sequence.
973
+ const pending = useRef({
974
+ idx: -1,
975
+ tries: 0
976
+ });
977
+ // Suppression state machine. The click handler arms; the onChange effect
978
+ // consumes (armed→force) then fires-and-clears on the render AFTER that
979
+ // (force→none). The force step poisons the dedup: after click, idx often
980
+ // recomputes to the SAME prompt (its top is still above target), so
981
+ // without force the last.idx===idx guard would hold 'clicked' until the
982
+ // user crossed a prompt boundary. Previously encoded in last.idx as
983
+ // -1/-2/-3 which overlapped with real indices — too clever.
984
+ type Suppress = 'none' | 'armed' | 'force';
985
+ const suppress = useRef<Suppress>('none');
986
+ // Dedup on idx only — estimate derives from firstVisibleTop which shifts
987
+ // every scroll tick, so including it in the key made the guard dead
988
+ // (setStickyPrompt fired a fresh {text,scrollTo} per-frame). The scrollTo
989
+ // closure still captures the current estimate; it just doesn't need to
990
+ // re-fire when only estimate moved.
991
+ const lastIdx = useRef(-1);
992
+
993
+ // setStickyPrompt effect FIRST — must see pending.idx before the
994
+ // correction effect below clears it. On the estimate-fallback path, the
995
+ // render that mounts the item is ALSO the render where correction clears
996
+ // pending; if this ran second, the pending gate would be dead and
997
+ // setStickyPrompt(prevPrompt) would fire mid-jump, re-mounting the
998
+ // header over 'clicked'.
999
+ useEffect(() => {
1000
+ // Hold while two-phase correction is in flight.
1001
+ if (pending.current.idx >= 0) return;
1002
+ if (suppress.current === 'armed') {
1003
+ suppress.current = 'force';
1004
+ return;
1005
+ }
1006
+ const force = suppress.current === 'force';
1007
+ suppress.current = 'none';
1008
+ if (!force && lastIdx.current === idx) return;
1009
+ lastIdx.current = idx;
1010
+ if (text === null) {
1011
+ setStickyPrompt(null);
1012
+ return;
1013
+ }
1014
+ // First paragraph only (split on blank line) — a prompt like
1015
+ // "still seeing bugs:\n\n1. foo\n2. bar" previews as just the
1016
+ // lead-in. trimStart so a leading blank line (queued_command mid-
1017
+ // turn messages sometimes have one) doesn't find paraEnd at 0.
1018
+ const trimmed = text.trimStart();
1019
+ const paraEnd = trimmed.search(/\n\s*\n/);
1020
+ const collapsed = (paraEnd >= 0 ? trimmed.slice(0, paraEnd) : trimmed).slice(0, STICKY_TEXT_CAP).replace(/\s+/g, ' ').trim();
1021
+ if (collapsed === '') {
1022
+ setStickyPrompt(null);
1023
+ return;
1024
+ }
1025
+ const capturedIdx = idx;
1026
+ const capturedEstimate = estimate;
1027
+ setStickyPrompt({
1028
+ text: collapsed,
1029
+ scrollTo: () => {
1030
+ // Hide header, keep padding collapsed — FullscreenLayout's
1031
+ // 'clicked' sentinel → scrollBox_y=0 + pad=0 → viewportTop=0.
1032
+ setStickyPrompt('clicked');
1033
+ suppress.current = 'armed';
1034
+ // scrollToElement anchors by DOMElement ref, not a number:
1035
+ // render-node-to-output reads el.yogaNode.getComputedTop() at
1036
+ // paint time (same Yoga pass as scrollHeight). No staleness from
1037
+ // the throttled render — the ref is stable, the position read is
1038
+ // deferred. offset=1 = UserPromptMessage marginTop.
1039
+ const el = getItemElement(capturedIdx);
1040
+ if (el) {
1041
+ scrollRef.current?.scrollToElement(el, 1);
1042
+ } else {
1043
+ // Not mounted (scrolled far past — in topSpacer). Jump to
1044
+ // estimate to mount it; correction effect re-anchors once it
1045
+ // appears. Estimate is DEFAULT_ESTIMATE-based — lands short.
1046
+ scrollRef.current?.scrollTo(capturedEstimate);
1047
+ pending.current = {
1048
+ idx: capturedIdx,
1049
+ tries: 0
1050
+ };
1051
+ }
1052
+ }
1053
+ });
1054
+ // No deps — must run every render. Suppression state lives in a ref
1055
+ // (not idx/estimate), so a deps-gated effect would never see it tick.
1056
+ // Body's own guards short-circuit when nothing changed.
1057
+ // eslint-disable-next-line react-hooks/exhaustive-deps
1058
+ });
1059
+
1060
+ // Correction: for click-jumps to unmounted items. Click handler scrolled
1061
+ // to the estimate; this re-anchors by element once the item appears.
1062
+ // scrollToElement defers the Yoga read to paint time — deterministic.
1063
+ // SECOND so it clears pending AFTER the onChange gate above has seen it.
1064
+ useEffect(() => {
1065
+ if (pending.current.idx < 0) return;
1066
+ const el = getItemElement(pending.current.idx);
1067
+ if (el) {
1068
+ scrollRef.current?.scrollToElement(el, 1);
1069
+ pending.current = {
1070
+ idx: -1,
1071
+ tries: 0
1072
+ };
1073
+ } else if (++pending.current.tries > 5) {
1074
+ pending.current = {
1075
+ idx: -1,
1076
+ tries: 0
1077
+ };
1078
+ }
1079
+ });
1080
+ return null;
1081
+ }
1082
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWZPYmplY3QiLCJSZWFjdCIsInVzZUNhbGxiYWNrIiwidXNlQ29udGV4dCIsInVzZUVmZmVjdCIsInVzZUltcGVyYXRpdmVIYW5kbGUiLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsInVzZVN5bmNFeHRlcm5hbFN0b3JlIiwidXNlVmlydHVhbFNjcm9sbCIsIlNjcm9sbEJveEhhbmRsZSIsIkRPTUVsZW1lbnQiLCJNYXRjaFBvc2l0aW9uIiwiQm94IiwiUmVuZGVyYWJsZU1lc3NhZ2UiLCJUZXh0SG92ZXJDb2xvckNvbnRleHQiLCJTY3JvbGxDaHJvbWVDb250ZXh0IiwiSEVBRFJPT00iLCJsb2dGb3JEZWJ1Z2dpbmciLCJzbGVlcCIsInJlbmRlcmFibGVTZWFyY2hUZXh0IiwiaXNOYXZpZ2FibGVNZXNzYWdlIiwiTWVzc2FnZUFjdGlvbnNOYXYiLCJNZXNzYWdlQWN0aW9uc1N0YXRlIiwiTmF2aWdhYmxlTWVzc2FnZSIsInN0cmlwU3lzdGVtUmVtaW5kZXJzIiwidG9vbENhbGxPZiIsImZhbGxiYWNrTG93ZXJDYWNoZSIsIldlYWtNYXAiLCJkZWZhdWx0RXh0cmFjdFNlYXJjaFRleHQiLCJtc2ciLCJjYWNoZWQiLCJnZXQiLCJ1bmRlZmluZWQiLCJsb3dlcmVkIiwic2V0IiwiU3RpY2t5UHJvbXB0IiwidGV4dCIsInNjcm9sbFRvIiwiU1RJQ0tZX1RFWFRfQ0FQIiwiSnVtcEhhbmRsZSIsImp1bXBUb0luZGV4IiwiaSIsInNldFNlYXJjaFF1ZXJ5IiwicSIsIm5leHRNYXRjaCIsInByZXZNYXRjaCIsInNldEFuY2hvciIsIndhcm1TZWFyY2hJbmRleCIsIlByb21pc2UiLCJkaXNhcm1TZWFyY2giLCJQcm9wcyIsIm1lc3NhZ2VzIiwic2Nyb2xsUmVmIiwiY29sdW1ucyIsIml0ZW1LZXkiLCJyZW5kZXJJdGVtIiwiaW5kZXgiLCJSZWFjdE5vZGUiLCJvbkl0ZW1DbGljayIsImlzSXRlbUNsaWNrYWJsZSIsImlzSXRlbUV4cGFuZGVkIiwiZXh0cmFjdFNlYXJjaFRleHQiLCJ0cmFja1N0aWNreVByb21wdCIsInNlbGVjdGVkSW5kZXgiLCJjdXJzb3JOYXZSZWYiLCJSZWYiLCJzZXRDdXJzb3IiLCJjIiwianVtcFJlZiIsIm9uU2VhcmNoTWF0Y2hlc0NoYW5nZSIsImNvdW50IiwiY3VycmVudCIsInNjYW5FbGVtZW50IiwiZWwiLCJzZXRQb3NpdGlvbnMiLCJzdGF0ZSIsInBvc2l0aW9ucyIsInJvd09mZnNldCIsImN1cnJlbnRJZHgiLCJwcm9tcHRUZXh0Q2FjaGUiLCJzdGlja3lQcm9tcHRUZXh0IiwicmVzdWx0IiwiY29tcHV0ZVN0aWNreVByb21wdFRleHQiLCJyYXciLCJ0eXBlIiwiaXNNZXRhIiwiaXNWaXNpYmxlSW5UcmFuc2NyaXB0T25seSIsImJsb2NrIiwibWVzc2FnZSIsImNvbnRlbnQiLCJhdHRhY2htZW50IiwiY29tbWFuZE1vZGUiLCJwIiwicHJvbXB0IiwiZmxhdE1hcCIsImIiLCJqb2luIiwidCIsInN0YXJ0c1dpdGgiLCJWaXJ0dWFsSXRlbVByb3BzIiwiaWR4IiwibWVhc3VyZVJlZiIsImtleSIsImV4cGFuZGVkIiwiaG92ZXJlZCIsImNsaWNrYWJsZSIsIm9uQ2xpY2tLIiwiY2VsbElzQmxhbmsiLCJvbkVudGVySyIsImsiLCJvbkxlYXZlSyIsIlZpcnR1YWxJdGVtIiwidDAiLCIkIiwiX2MiLCJ0MSIsInQyIiwidDMiLCJ0NCIsImUiLCJ0NSIsInQ2IiwidDciLCJ0OCIsInQ5IiwidDEwIiwiVmlydHVhbE1lc3NhZ2VMaXN0Iiwia2V5c1JlZiIsInByZXZNZXNzYWdlc1JlZiIsInByZXZJdGVtS2V5UmVmIiwibGVuZ3RoIiwibWFwIiwibSIsInB1c2giLCJrZXlzIiwicmFuZ2UiLCJ0b3BTcGFjZXIiLCJib3R0b21TcGFjZXIiLCJzcGFjZXJSZWYiLCJvZmZzZXRzIiwiZ2V0SXRlbVRvcCIsImdldEl0ZW1FbGVtZW50IiwiZ2V0SXRlbUhlaWdodCIsInNjcm9sbFRvSW5kZXgiLCJzdGFydCIsImVuZCIsImlzVmlzaWJsZSIsImgiLCJzZWxlY3QiLCJ1dWlkIiwibXNnVHlwZSIsInRvb2xOYW1lIiwibmFtZSIsInNlbElkeCIsInNjYW4iLCJmcm9tIiwiZGlyIiwicHJlZCIsImlzVXNlciIsImVudGVyQ3Vyc29yIiwibmF2aWdhdGVQcmV2IiwibmF2aWdhdGVOZXh0Iiwic2Nyb2xsVG9Cb3R0b20iLCJuYXZpZ2F0ZVByZXZVc2VyIiwibmF2aWdhdGVOZXh0VXNlciIsIm5hdmlnYXRlVG9wIiwibmF2aWdhdGVCb3R0b20iLCJnZXRTZWxlY3RlZCIsImp1bXBTdGF0ZSIsInMiLCJzY3JvbGxUb0VsZW1lbnQiLCJzY2FuUmVxdWVzdFJlZiIsIndhbnRMYXN0IiwidHJpZXMiLCJlbGVtZW50UG9zaXRpb25zIiwibXNnSWR4Iiwic3RhcnRQdHJSZWYiLCJwaGFudG9tQnVyc3RSZWYiLCJwZW5kaW5nU3RlcFJlZiIsInN0ZXBSZWYiLCJkIiwiaGlnaGxpZ2h0UmVmIiwib3JkIiwic2VhcmNoU3RhdGUiLCJtYXRjaGVzIiwicHRyIiwic2NyZWVuT3JkIiwicHJlZml4U3VtIiwic2VhcmNoQW5jaG9yIiwiaW5kZXhXYXJtZWQiLCJ0YXJnZXRGb3IiLCJ0b3AiLCJNYXRoIiwibWF4IiwiaGlnaGxpZ2h0IiwibWluIiwidnBUb3AiLCJnZXRWaWV3cG9ydFRvcCIsImxvIiwiZ2V0U2Nyb2xsVG9wIiwidnAiLCJnZXRWaWV3cG9ydEhlaWdodCIsInNjcmVlblJvdyIsInJvdyIsInN0IiwidG90YWwiLCJhdCIsImNvbCIsInNlZWtHZW4iLCJzZXRTZWVrR2VuIiwiYnVtcFNlZWsiLCJnIiwicmVxIiwieW9nYU5vZGUiLCJnZXRDb21wdXRlZEhlaWdodCIsInBlbmRpbmciLCJqdW1wIiwianMiLCJzdGVwIiwiZGVsdGEiLCJuZXdPcmQiLCJwbGFjZWhvbGRlciIsImxxIiwidG9Mb3dlckNhc2UiLCJtc2dzIiwicG9zIiwiaW5kZXhPZiIsImNudCIsImZpcnN0VG9wIiwib3JpZ2luIiwiY3VyVG9wIiwiYmVzdCIsIkluZmluaXR5IiwiYWJzIiwiQ0hVTksiLCJ3b3JrTXMiLCJ3YWxsU3RhcnQiLCJwZXJmb3JtYW5jZSIsIm5vdyIsImoiLCJ3YWxsTXMiLCJyb3VuZCIsImNlaWwiLCJob3ZlcmVkS2V5Iiwic2V0SG92ZXJlZEtleSIsImhhbmRsZXJzUmVmIiwicHJldiIsInNsaWNlIiwiTk9PUF9VTlNVQiIsIlN0aWNreVRyYWNrZXIiLCJBcnJheUxpa2UiLCJzZXRTdGlja3lQcm9tcHQiLCJzdWJzY3JpYmUiLCJsaXN0ZW5lciIsIk5hTiIsImdldFBlbmRpbmdEZWx0YSIsImlzU3RpY2t5IiwidGFyZ2V0IiwiZmlyc3RWaXNpYmxlIiwiZmlyc3RWaXNpYmxlVG9wIiwiYmFzZU9mZnNldCIsImVzdGltYXRlIiwiU3VwcHJlc3MiLCJzdXBwcmVzcyIsImxhc3RJZHgiLCJmb3JjZSIsInRyaW1tZWQiLCJ0cmltU3RhcnQiLCJwYXJhRW5kIiwic2VhcmNoIiwiY29sbGFwc2VkIiwicmVwbGFjZSIsInRyaW0iLCJjYXB0dXJlZElkeCIsImNhcHR1cmVkRXN0aW1hdGUiXSwic291cmNlcyI6WyJWaXJ0dWFsTWVzc2FnZUxpc3QudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUmVmT2JqZWN0IH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7XG4gIHVzZUNhbGxiYWNrLFxuICB1c2VDb250ZXh0LFxuICB1c2VFZmZlY3QsXG4gIHVzZUltcGVyYXRpdmVIYW5kbGUsXG4gIHVzZVJlZixcbiAgdXNlU3RhdGUsXG4gIHVzZVN5bmNFeHRlcm5hbFN0b3JlLFxufSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZVZpcnR1YWxTY3JvbGwgfSBmcm9tICcuLi9ob29rcy91c2VWaXJ0dWFsU2Nyb2xsLmpzJ1xuaW1wb3J0IHR5cGUgeyBTY3JvbGxCb3hIYW5kbGUgfSBmcm9tICcuLi9pbmsvY29tcG9uZW50cy9TY3JvbGxCb3guanMnXG5pbXBvcnQgdHlwZSB7IERPTUVsZW1lbnQgfSBmcm9tICcuLi9pbmsvZG9tLmpzJ1xuaW1wb3J0IHR5cGUgeyBNYXRjaFBvc2l0aW9uIH0gZnJvbSAnLi4vaW5rL3JlbmRlci10by1zY3JlZW4uanMnXG5pbXBvcnQgeyBCb3ggfSBmcm9tICcuLi9pbmsuanMnXG5pbXBvcnQgdHlwZSB7IFJlbmRlcmFibGVNZXNzYWdlIH0gZnJvbSAnLi4vdHlwZXMvbWVzc2FnZS5qcydcbmltcG9ydCB7IFRleHRIb3ZlckNvbG9yQ29udGV4dCB9IGZyb20gJy4vZGVzaWduLXN5c3RlbS9UaGVtZWRUZXh0LmpzJ1xuaW1wb3J0IHsgU2Nyb2xsQ2hyb21lQ29udGV4dCB9IGZyb20gJy4vRnVsbHNjcmVlbkxheW91dC5qcydcblxuLy8gUm93cyBvZiBicmVhdGhpbmcgcm9vbSBhYm92ZSB0aGUgdGFyZ2V0IHdoZW4gd2Ugc2Nyb2xsVG8uXG5jb25zdCBIRUFEUk9PTSA9IDNcblxuaW1wb3J0IHsgbG9nRm9yRGVidWdnaW5nIH0gZnJvbSAnLi4vdXRpbHMvZGVidWcuanMnXG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4uL3V0aWxzL3NsZWVwLmpzJ1xuaW1wb3J0IHsgcmVuZGVyYWJsZVNlYXJjaFRleHQgfSBmcm9tICcuLi91dGlscy90cmFuc2NyaXB0U2VhcmNoLmpzJ1xuaW1wb3J0IHtcbiAgaXNOYXZpZ2FibGVNZXNzYWdlLFxuICB0eXBlIE1lc3NhZ2VBY3Rpb25zTmF2LFxuICB0eXBlIE1lc3NhZ2VBY3Rpb25zU3RhdGUsXG4gIHR5cGUgTmF2aWdhYmxlTWVzc2FnZSxcbiAgc3RyaXBTeXN0ZW1SZW1pbmRlcnMsXG4gIHRvb2xDYWxsT2YsXG59IGZyb20gJy4vbWVzc2FnZUFjdGlvbnMuanMnXG5cbi8vIEZhbGxiYWNrIGV4dHJhY3RvcjogbG93ZXIgKyBjYWNoZSBoZXJlIGZvciBjYWxsZXJzIHdpdGhvdXQgdGhlXG4vLyBNZXNzYWdlcy50c3ggdG9vbC1sb29rdXAgcGF0aCAodGVzdHMsIHN0YXRpYyBjb250ZXh0cykuIE1lc3NhZ2VzLnRzeFxuLy8gcHJvdmlkZXMgaXRzIG93biBsb3dlcmluZyBjYWNoZSB0aGF0IGFsc28gaGFuZGxlcyB0b29sIGV4dHJhY3RTZWFyY2hUZXh0LlxuY29uc3QgZmFsbGJhY2tMb3dlckNhY2hlID0gbmV3IFdlYWtNYXA8UmVuZGVyYWJsZU1lc3NhZ2UsIHN0cmluZz4oKVxuZnVuY3Rpb24gZGVmYXVsdEV4dHJhY3RTZWFyY2hUZXh0KG1zZzogUmVuZGVyYWJsZU1lc3NhZ2UpOiBzdHJpbmcge1xuICBjb25zdCBjYWNoZWQgPSBmYWxsYmFja0xvd2VyQ2FjaGUuZ2V0KG1zZylcbiAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gY2FjaGVkXG4gIGNvbnN0IGxvd2VyZWQgPSByZW5kZXJhYmxlU2VhcmNoVGV4dChtc2cpXG4gIGZhbGxiYWNrTG93ZXJDYWNoZS5zZXQobXNnLCBsb3dlcmVkKVxuICByZXR1cm4gbG93ZXJlZFxufVxuXG5leHBvcnQgdHlwZSBTdGlja3lQcm9tcHQgPVxuICB8IHsgdGV4dDogc3RyaW5nOyBzY3JvbGxUbzogKCkgPT4gdm9pZCB9XG4gIC8vIENsaWNrIHNldHMgdGhpcyDigJQgaGVhZGVyIEhJREVTIGJ1dCBwYWRkaW5nIHN0YXlzIGNvbGxhcHNlZCAoMCkgc29cbiAgLy8gdGhlIGNvbnRlbnQg4p2vIGxhbmRzIGF0IHNjcmVlbiByb3cgMCBpbnN0ZWFkIG9mIHJvdyAxLiBDbGVhcmVkIG9uXG4gIC8vIHRoZSBuZXh0IHN0aWNreS1wcm9tcHQgY29tcHV0ZSAodXNlciBzY3JvbGxzIGFnYWluKS5cbiAgfCAnY2xpY2tlZCdcblxuLyoqIEh1Z2UgcGFzdGVkIHByb21wdHMgKGNhdCBmaWxlIHwgY2xhdWRlKSBjYW4gYmUgTUJzLiBIZWFkZXIgd3JhcHMgaW50b1xuICogIDIgcm93cyB2aWEgb3ZlcmZsb3c6aGlkZGVuIOKAlCB0aGlzIGp1c3QgYm91bmRzIHRoZSBSZWFjdCBwcm9wIHNpemUuICovXG5jb25zdCBTVElDS1lfVEVYVF9DQVAgPSA1MDBcblxuLyoqIEltcGVyYXRpdmUgaGFuZGxlIGZvciB0cmFuc2NyaXB0IG5hdmlnYXRpb24uIE1ldGhvZHMgY29tcHV0ZSBtYXRjaGVzXG4gKiAgSEVSRSAocmVuZGVyYWJsZU1lc3NhZ2VzIGluZGljZXMgYXJlIG9ubHkgdmFsaWQgaW5zaWRlIHRoaXMgY29tcG9uZW50IOKAlFxuICogIE1lc3NhZ2VzLnRzeCBmaWx0ZXJzIGFuZCByZW9yZGVycywgUkVQTCBjYW4ndCBjb21wdXRlIGV4dGVybmFsbHkpLiAqL1xuZXhwb3J0IHR5cGUgSnVtcEhhbmRsZSA9IHtcbiAganVtcFRvSW5kZXg6IChpOiBudW1iZXIpID0+IHZvaWRcbiAgc2V0U2VhcmNoUXVlcnk6IChxOiBzdHJpbmcpID0+IHZvaWRcbiAgbmV4dE1hdGNoOiAoKSA9PiB2b2lkXG4gIHByZXZNYXRjaDogKCkgPT4gdm9pZFxuICAvKiogQ2FwdHVyZSBjdXJyZW50IHNjcm9sbFRvcCBhcyB0aGUgaW5jc2VhcmNoIGFuY2hvci4gVHlwaW5nIGp1bXBzXG4gICAqICBhcm91bmQgYXMgcHJldmlldzsgMC1tYXRjaGVzIHNuYXBzIGJhY2sgaGVyZS4gRW50ZXIvbi9OIG5ldmVyXG4gICAqICByZXN0b3JlICh0aGV5IGRvbid0IGNhbGwgc2V0U2VhcmNoUXVlcnkgd2l0aCBlbXB0eSkuIE5leHQgLyBjYWxsXG4gICAqICBvdmVyd3JpdGVzLiAqL1xuICBzZXRBbmNob3I6ICgpID0+IHZvaWRcbiAgLyoqIFdhcm0gdGhlIHNlYXJjaC10ZXh0IGNhY2hlIGJ5IGV4dHJhY3RpbmcgZXZlcnkgbWVzc2FnZSdzIHRleHQuXG4gICAqICBSZXR1cm5zIGVsYXBzZWQgbXMsIG9yIDAgaWYgYWxyZWFkeSB3YXJtIChzdWJzZXF1ZW50IC8gaW4gc2FtZVxuICAgKiAgdHJhbnNjcmlwdCBzZXNzaW9uKS4gWWllbGRzIGJlZm9yZSB3b3JrIHNvIHRoZSBjYWxsZXIgY2FuIHBhaW50XG4gICAqICBcImluZGV4aW5n4oCmXCIgZmlyc3QuIENhbGxlciBzaG93cyBcImluZGV4ZWQgaW4gWG1zXCIgb24gcmVzb2x2ZS4gKi9cbiAgd2FybVNlYXJjaEluZGV4OiAoKSA9PiBQcm9taXNlPG51bWJlcj5cbiAgLyoqIE1hbnVhbCBzY3JvbGwgKGovay9QZ1VwL3doZWVsKSBleGl0ZWQgdGhlIHNlYXJjaCBjb250ZXh0LiBDbGVhclxuICAgKiAgcG9zaXRpb25zICh5ZWxsb3cgZ29lcyBhd2F5LCBpbnZlcnNlIGhpZ2hsaWdodHMgc3RheSkuIE5leHQgbi9OXG4gICAqICByZS1lc3RhYmxpc2hlcyB2aWEgc3RlcCgp4oaSanVtcCgpLiBXaXJlZCBmcm9tIFNjcm9sbEtleWJpbmRpbmdIYW5kbGVyJ3NcbiAgICogIG9uU2Nyb2xsIOKAlCBvbmx5IGZpcmVzIGZvciBrZXlib2FyZC93aGVlbCwgbm90IHByb2dyYW1tYXRpYyBzY3JvbGxUby4gKi9cbiAgZGlzYXJtU2VhcmNoOiAoKSA9PiB2b2lkXG59XG5cbnR5cGUgUHJvcHMgPSB7XG4gIG1lc3NhZ2VzOiBSZW5kZXJhYmxlTWVzc2FnZVtdXG4gIHNjcm9sbFJlZjogUmVmT2JqZWN0PFNjcm9sbEJveEhhbmRsZSB8IG51bGw+XG4gIC8qKiBJbnZhbGlkYXRlcyBoZWlnaHRDYWNoZSBvbiBjaGFuZ2Ug4oCUIGNhY2hlZCBoZWlnaHRzIGZyb20gYSBkaWZmZXJlbnRcbiAgICogIHdpZHRoIGFyZSB3cm9uZyAodGV4dCByZXdyYXAg4oaSIGJsYWNrIHNjcmVlbiBvbiBzY3JvbGwtdXAgYWZ0ZXIgd2lkZW4pLiAqL1xuICBjb2x1bW5zOiBudW1iZXJcbiAgaXRlbUtleTogKG1zZzogUmVuZGVyYWJsZU1lc3NhZ2UpID0+IHN0cmluZ1xuICByZW5kZXJJdGVtOiAobXNnOiBSZW5kZXJhYmxlTWVzc2FnZSwgaW5kZXg6IG51bWJlcikgPT4gUmVhY3QuUmVhY3ROb2RlXG4gIC8qKiBGaXJlcyB3aGVuIGEgbWVzc2FnZSBCb3ggaXMgY2xpY2tlZCAodG9nZ2xlIHBlci1tZXNzYWdlIHZlcmJvc2UpLiAqL1xuICBvbkl0ZW1DbGljaz86IChtc2c6IFJlbmRlcmFibGVNZXNzYWdlKSA9PiB2b2lkXG4gIC8qKiBQZXItaXRlbSBmaWx0ZXIg4oCUIHN1cHByZXNzIGhvdmVyL2NsaWNrIGZvciBtZXNzYWdlcyB3aGVyZSB0aGUgdmVyYm9zZVxuICAgKiAgdG9nZ2xlIGRvZXMgbm90aGluZyAodGV4dCwgZmlsZSBlZGl0cywgZXRjKS4gRGVmYXVsdHMgdG8gYWxsLWNsaWNrYWJsZS4gKi9cbiAgaXNJdGVtQ2xpY2thYmxlPzogKG1zZzogUmVuZGVyYWJsZU1lc3NhZ2UpID0+IGJvb2xlYW5cbiAgLyoqIEV4cGFuZGVkIGl0ZW1zIGdldCBhIHBlcnNpc3RlbnQgZ3JleSBiZyAobm90IGp1c3Qgb24gaG92ZXIpLiAqL1xuICBpc0l0ZW1FeHBhbmRlZD86IChtc2c6IFJlbmRlcmFibGVNZXNzYWdlKSA9PiBib29sZWFuXG4gIC8qKiBQUkUtTE9XRVJFRCBzZWFyY2ggdGV4dC4gTWVzc2FnZXMudHN4IGNhY2hlcyB0aGUgbG93ZXJlZCByZXN1bHRcbiAgICogIG9uY2UgYXQgd2FybSB0aW1lIHNvIHNldFNlYXJjaFF1ZXJ5J3MgcGVyLWtleXN0cm9rZSBsb29wIGRvZXNcbiAgICogIG9ubHkgaW5kZXhPZiAoemVybyB0b0xvd2VyQ2FzZSBhbGxvYykuIEZhbGxzIGJhY2sgdG8gYSBsb3dlcmluZ1xuICAgKiAgd3JhcHBlciBvbiByZW5kZXJhYmxlU2VhcmNoVGV4dCBmb3IgY2FsbGVycyB3aXRob3V0IHRoZSBjYWNoZS4gKi9cbiAgZXh0cmFjdFNlYXJjaFRleHQ/OiAobXNnOiBSZW5kZXJhYmxlTWVzc2FnZSkgPT4gc3RyaW5nXG4gIC8qKiBFbmFibGUgdGhlIHN0aWNreS1wcm9tcHQgdHJhY2tlci4gU3RpY2t5VHJhY2tlciB3cml0ZXMgdmlhXG4gICAqICBTY3JvbGxDaHJvbWVDb250ZXh0IChub3QgYSBjYWxsYmFjayBwcm9wKSBzbyBzdGF0ZSBsaXZlcyBpblxuICAgKiAgRnVsbHNjcmVlbkxheW91dCBpbnN0ZWFkIG9mIFJFUEwuICovXG4gIHRyYWNrU3RpY2t5UHJvbXB0PzogYm9vbGVhblxuICBzZWxlY3RlZEluZGV4PzogbnVtYmVyXG4gIC8qKiBOYXYgaGFuZGxlIGxpdmVzIGhlcmUgYmVjYXVzZSBoZWlnaHQgbWVhc3VyZW1lbnQgbGl2ZXMgaGVyZS4gKi9cbiAgY3Vyc29yTmF2UmVmPzogUmVhY3QuUmVmPE1lc3NhZ2VBY3Rpb25zTmF2PlxuICBzZXRDdXJzb3I/OiAoYzogTWVzc2FnZUFjdGlvbnNTdGF0ZSB8IG51bGwpID0+IHZvaWRcbiAganVtcFJlZj86IFJlZk9iamVjdDxKdW1wSGFuZGxlIHwgbnVsbD5cbiAgLyoqIEZpcmVzIHdoZW4gc2VhcmNoIG1hdGNoZXMgY2hhbmdlIChxdWVyeSBlZGl0LCBuL04pLiBjdXJyZW50IGlzXG4gICAqICAxLWJhc2VkIGZvciBcIjMvNDdcIiBkaXNwbGF5OyAwIG1lYW5zIG5vIG1hdGNoZXMuICovXG4gIG9uU2VhcmNoTWF0Y2hlc0NoYW5nZT86IChjb3VudDogbnVtYmVyLCBjdXJyZW50OiBudW1iZXIpID0+IHZvaWRcbiAgLyoqIFBhaW50IGV4aXN0aW5nIERPTSBzdWJ0cmVlIHRvIGZyZXNoIFNjcmVlbiwgc2Nhbi4gRWxlbWVudCBmcm9tIHRoZVxuICAgKiAgbWFpbiB0cmVlIChhbGwgcHJvdmlkZXJzKS4gTWVzc2FnZS1yZWxhdGl2ZSBwb3NpdGlvbnMgKHJvdyAwID0gZWxcbiAgICogIHRvcCkuIFdvcmtzIGZvciBhbnkgaGVpZ2h0IOKAlCBjbG9zZXMgdGhlIHRhbGwtbWVzc2FnZSBnYXAuICovXG4gIHNjYW5FbGVtZW50PzogKGVsOiBET01FbGVtZW50KSA9PiBNYXRjaFBvc2l0aW9uW11cbiAgLyoqIFBvc2l0aW9uLWJhc2VkIENVUlJFTlQgaGlnaGxpZ2h0LiBQb3NpdGlvbnMga25vd24gdXBmcm9udCAoZnJvbVxuICAgKiAgc2NhbkVsZW1lbnQpLCBuYXZpZ2F0aW9uID0gaW5kZXggYXJpdGhtZXRpYyArIHNjcm9sbFRvLiByb3dPZmZzZXRcbiAgICogID0gbWVzc2FnZSdzIGN1cnJlbnQgc2NyZWVuLXRvcDsgcG9zaXRpb25zIHN0YXkgc3RhYmxlLiAqL1xuICBzZXRQb3NpdGlvbnM/OiAoXG4gICAgc3RhdGU6IHtcbiAgICAgIHBvc2l0aW9uczogTWF0Y2hQb3NpdGlvbltdXG4gICAgICByb3dPZmZzZXQ6IG51bWJlclxuICAgICAgY3VycmVudElkeDogbnVtYmVyXG4gICAgfSB8IG51bGwsXG4gICkgPT4gdm9pZFxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHRleHQgb2YgYSByZWFsIHVzZXIgcHJvbXB0LCBvciBudWxsIGZvciBhbnl0aGluZyBlbHNlLlxuICogXCJSZWFsXCIgPSB3aGF0IHRoZSBodW1hbiB0eXBlZDogbm90IHRvb2wgcmVzdWx0cywgbm90IFhNTC13cmFwcGVkIHBheWxvYWRzXG4gKiAoPGJhc2gtc3Rkb3V0PiwgPGNvbW1hbmQtbWVzc2FnZT4sIDx0ZWFtbWF0ZS1tZXNzYWdlPiwgZXRjLiksIG5vdCBtZXRhLlxuICpcbiAqIFR3byBzaGFwZXMgbGFuZCBoZXJlOiBOb3JtYWxpemVkVXNlck1lc3NhZ2UgKG5vcm1hbCBwcm9tcHRzKSBhbmRcbiAqIEF0dGFjaG1lbnRNZXNzYWdlIHdpdGggdHlwZT09PSdxdWV1ZWRfY29tbWFuZCcgKHByb21wdHMgc2VudCBtaWQtdHVyblxuICogd2hpbGUgYSB0b29sIHdhcyBleGVjdXRpbmcg4oCUIHRoZXkgZ2V0IGRyYWluZWQgYXMgYXR0YWNobWVudHMgb24gdGhlXG4gKiBuZXh0IHR1cm4sIHNlZSBxdWVyeS50czoxNDEwKS4gQm90aCByZW5kZXIgYXMg4p2vLXByZWZpeGVkIFVzZXJUZXh0TWVzc2FnZVxuICogaW4gdGhlIFVJIHNvIGJvdGggc2hvdWxkIHN0aWNrLlxuICpcbiAqIExlYWRpbmcgPHN5c3RlbS1yZW1pbmRlcj4gYmxvY2tzIGFyZSBzdHJpcHBlZCBiZWZvcmUgY2hlY2tpbmcg4oCUIHRoZXkgZ2V0XG4gKiBwcmVwZW5kZWQgdG8gdGhlIHN0b3JlZCB0ZXh0IGZvciBDbGF1ZGUncyBjb250ZXh0IChtZW1vcnkgdXBkYXRlcywgYXV0b1xuICogbW9kZSByZW1pbmRlcnMpIGJ1dCBhcmVuJ3Qgd2hhdCB0aGUgdXNlciB0eXBlZC4gV2l0aG91dCBzdHJpcHBpbmcsIGFueVxuICogcHJvbXB0IHRoYXQgaGFwcGVuZWQgdG8gZ2V0IGEgcmVtaW5kZXIgaXMgcmVqZWN0ZWQgYnkgdGhlIHN0YXJ0c1dpdGgoJzwnKVxuICogY2hlY2suIFNob3dzIHVwIG9uIGBjYyAtY2AgcmVzdW1lcyB3aGVyZSBtZW1vcnktdXBkYXRlIHJlbWluZGVycyBhcmUgZGVuc2UuXG4gKi9cbmNvbnN0IHByb21wdFRleHRDYWNoZSA9IG5ldyBXZWFrTWFwPFJlbmRlcmFibGVNZXNzYWdlLCBzdHJpbmcgfCBudWxsPigpXG5cbmZ1bmN0aW9uIHN0aWNreVByb21wdFRleHQobXNnOiBSZW5kZXJhYmxlTWVzc2FnZSk6IHN0cmluZyB8IG51bGwge1xuICAvLyBDYWNoZSBrZXllZCBvbiBtZXNzYWdlIG9iamVjdCDigJQgbWVzc2FnZXMgYXJlIGFwcGVuZC1vbmx5IGFuZCBkb24ndFxuICAvLyBtdXRhdGUsIHNvIGEgV2Vha01hcCBoaXQgaXMgYWx3YXlzIHZhbGlkLiBUaGUgd2FsayAoU3RpY2t5VHJhY2tlcixcbiAgLy8gcGVyLXNjcm9sbC10aWNrKSBjYWxscyB0aGlzIDUtNTArIHRpbWVzIHdpdGggdGhlIFNBTUUgbWVzc2FnZXMgZXZlcnlcbiAgLy8gdGljazsgdGhlIHN5c3RlbS1yZW1pbmRlciBzdHJpcCBhbGxvY2F0ZXMgYSBmcmVzaCBzdHJpbmcgb24gZWFjaFxuICAvLyBwYXJzZS4gV2Vha01hcCBzZWxmLUdDcyBvbiBjb21wYWN0aW9uL2NsZWFyIChtZXNzYWdlc1tdIHJlcGxhY2VkKS5cbiAgY29uc3QgY2FjaGVkID0gcHJvbXB0VGV4dENhY2hlLmdldChtc2cpXG4gIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNhY2hlZFxuICBjb25zdCByZXN1bHQgPSBjb21wdXRlU3RpY2t5UHJvbXB0VGV4dChtc2cpXG4gIHByb21wdFRleHRDYWNoZS5zZXQobXNnLCByZXN1bHQpXG4gIHJldHVybiByZXN1bHRcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVN0aWNreVByb21wdFRleHQobXNnOiBSZW5kZXJhYmxlTWVzc2FnZSk6IHN0cmluZyB8IG51bGwge1xuICBsZXQgcmF3OiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBpZiAobXNnLnR5cGUgPT09ICd1c2VyJykge1xuICAgIGlmIChtc2cuaXNNZXRhIHx8IG1zZy5pc1Zpc2libGVJblRyYW5zY3JpcHRPbmx5KSByZXR1cm4gbnVsbFxuICAgIGNvbnN0IGJsb2NrID0gbXNnLm1lc3NhZ2UuY29udGVudFswXVxuICAgIGlmIChibG9jaz8udHlwZSAhPT0gJ3RleHQnKSByZXR1cm4gbnVsbFxuICAgIHJhdyA9IGJsb2NrLnRleHRcbiAgfSBlbHNlIGlmIChcbiAgICBtc2cudHlwZSA9PT0gJ2F0dGFjaG1lbnQnICYmXG4gICAgbXNnLmF0dGFjaG1lbnQudHlwZSA9PT0gJ3F1ZXVlZF9jb21tYW5kJyAmJlxuICAgIG1zZy5hdHRhY2htZW50LmNvbW1hbmRNb2RlICE9PSAndGFzay1ub3RpZmljYXRpb24nICYmXG4gICAgIW1zZy5hdHRhY2htZW50LmlzTWV0YVxuICApIHtcbiAgICBjb25zdCBwID0gbXNnLmF0dGFjaG1lbnQucHJvbXB0XG4gICAgcmF3ID1cbiAgICAgIHR5cGVvZiBwID09PSAnc3RyaW5nJ1xuICAgICAgICA/IHBcbiAgICAgICAgOiBwLmZsYXRNYXAoYiA9PiAoYi50eXBlID09PSAndGV4dCcgPyBbYi50ZXh0XSA6IFtdKSkuam9pbignXFxuJylcbiAgfVxuICBpZiAocmF3ID09PSBudWxsKSByZXR1cm4gbnVsbFxuXG4gIGNvbnN0IHQgPSBzdHJpcFN5c3RlbVJlbWluZGVycyhyYXcpXG4gIGlmICh0LnN0YXJ0c1dpdGgoJzwnKSB8fCB0ID09PSAnJykgcmV0dXJuIG51bGxcbiAgcmV0dXJuIHRcbn1cblxuLyoqXG4gKiBWaXJ0dWFsaXplZCBtZXNzYWdlIGxpc3QgZm9yIGZ1bGxzY3JlZW4gbW9kZS4gU3BsaXQgZnJvbSBNZXNzYWdlcy50c3ggc29cbiAqIHVzZVZpcnR1YWxTY3JvbGwgaXMgY2FsbGVkIHVuY29uZGl0aW9uYWxseSAocnVsZXMtb2YtaG9va3MpIOKAlCBNZXNzYWdlcy50c3hcbiAqIGNvbmRpdGlvbmFsbHkgcmVuZGVycyBlaXRoZXIgdGhpcyBvciBhIHBsYWluIC5tYXAoKS5cbiAqXG4gKiBUaGUgd3JhcHBpbmcgPEJveCByZWY+IGlzIHRoZSBtZWFzdXJlbWVudCBhbmNob3Ig4oCUIE1lc3NhZ2VSb3cgZG9lc24ndCB0YWtlXG4gKiBhIHJlZi4gU2luZ2xlLWNoaWxkIGNvbHVtbiBCb3ggcGFzc2VzIFlvZ2EgaGVpZ2h0IHRocm91Z2ggdW5jaGFuZ2VkLlxuICovXG50eXBlIFZpcnR1YWxJdGVtUHJvcHMgPSB7XG4gIGl0ZW1LZXk6IHN0cmluZ1xuICBtc2c6IFJlbmRlcmFibGVNZXNzYWdlXG4gIGlkeDogbnVtYmVyXG4gIG1lYXN1cmVSZWY6IChrZXk6IHN0cmluZykgPT4gKGVsOiBET01FbGVtZW50IHwgbnVsbCkgPT4gdm9pZFxuICBleHBhbmRlZDogYm9vbGVhbiB8IHVuZGVmaW5lZFxuICBob3ZlcmVkOiBib29sZWFuXG4gIGNsaWNrYWJsZTogYm9vbGVhblxuICBvbkNsaWNrSzogKG1zZzogUmVuZGVyYWJsZU1lc3NhZ2UsIGNlbGxJc0JsYW5rOiBib29sZWFuKSA9PiB2b2lkXG4gIG9uRW50ZXJLOiAoazogc3RyaW5nKSA9PiB2b2lkXG4gIG9uTGVhdmVLOiAoazogc3RyaW5nKSA9PiB2b2lkXG4gIHJlbmRlckl0ZW06IChtc2c6IFJlbmRlcmFibGVNZXNzYWdlLCBpZHg6IG51bWJlcikgPT4gUmVhY3QuUmVhY3ROb2RlXG59XG5cbi8vIEl0ZW0gd3JhcHBlciB3aXRoIHN0YWJsZSBjbGljayBoYW5kbGVycy4gVGhlIHBlci1pdGVtIGNsb3N1cmVzIHdlcmUgdGhlXG4vLyBgb3BlcmF0aW9uTmV3QXJyb3dGdW5jdGlvbmAgbGVhZnMg4oaSIGBGdW5jdGlvbkV4ZWN1dGFibGU6OmZpbmFsaXplVW5jb25kaXRpb25hbGx5YFxuLy8gR0MgY2xlYW51cCAoMTYlIG9mIEdDIHRpbWUgZHVyaW5nIGZhc3Qgc2Nyb2xsKS4gMyBjbG9zdXJlcyDDlyA2MCBtb3VudGVkIMOXXG4vLyAxMCBjb21taXRzL3NlYyA9IDE4MDAgY2xvc3VyZXMvc2VjLiBXaXRoIHN0YWJsZSBvbkNsaWNrSy9vbkVudGVySy9vbkxlYXZlS1xuLy8gdGhyZWFkZWQgdmlhIGl0ZW1LZXksIHRoZSBjbG9zdXJlcyBoZXJlIGFyZSBwZXItaXRlbS1wZXItcmVuZGVyIGJ1dCBDSEVBUFxuLy8gKGp1c3Qgd3JhcCB0aGUgc3RhYmxlIGNhbGxiYWNrIHdpdGggayBib3VuZCkgYW5kIGRvbid0IGNsb3NlIG92ZXIgbXNnL2lkeFxuLy8gd2hpY2ggbGV0cyBKSVQgaW5saW5lIHRoZW0uIFRoZSBiaWdnZXIgd2luIGlzIGluc2lkZTogTWVzc2FnZVJvdy5tZW1vXG4vLyBiYWlscyBmb3IgdW5jaGFuZ2VkIG1zZ3MsIHNraXBwaW5nIG1hcmtlZC5sZXhlciArIGZvcm1hdFRva2VuLlxuLy9cbi8vIE5PVCBSZWFjdC5tZW1vJ2Qg4oCUIHJlbmRlckl0ZW0gY2FwdHVyZXMgY2hhbmdpbmcgc3RhdGUgKGN1cnNvciwgc2VsZWN0ZWRJZHgsXG4vLyB2ZXJib3NlKS4gTWVtb2luZyB3aXRoIGEgY29tcGFyYXRvciB0aGF0IGlnbm9yZXMgcmVuZGVySXRlbSB3b3VsZCB1c2UgYVxuLy8gU1RBTEUgY2xvc3VyZSBvbiBiYWlsICh3cm9uZyBzZWxlY3Rpb24gaGlnaGxpZ2h0LCBzdGFsZSB2ZXJib3NlKS4gSW5jbHVkaW5nXG4vLyByZW5kZXJJdGVtIGluIHRoZSBjb21wYXJhdG9yIGRlZmVhdHMgbWVtbyBzaW5jZSBpdCdzIGZyZXNoIGVhY2ggcmVuZGVyLlxuZnVuY3Rpb24gVmlydHVhbEl0ZW0oe1xuICBpdGVtS2V5OiBrLFxuICBtc2csXG4gIGlkeCxcbiAgbWVhc3VyZVJlZixcbiAgZXhwYW5kZWQsXG4gIGhvdmVyZWQsXG4gIGNsaWNrYWJsZSxcbiAgb25DbGlja0ssXG4gIG9uRW50ZXJLLFxuICBvbkxlYXZlSyxcbiAgcmVuZGVySXRlbSxcbn06IFZpcnR1YWxJdGVtUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICByZXR1cm4gKFxuICAgIDxCb3hcbiAgICAgIHJlZj17bWVhc3VyZVJlZihrKX1cbiAgICAgIGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIlxuICAgICAgYmFja2dyb3VuZENvbG9yPXtleHBhbmRlZCA/ICd1c2VyTWVzc2FnZUJhY2tncm91bmRIb3ZlcicgOiB1bmRlZmluZWR9XG4gICAgICAvLyBiZyBoZXJlIG1hc2tzIHVzZVZpcnR1YWxTY3JvbGwncyBvbmUtZnJhbWUgb2Zmc2V0IGxhZyBvbiBleHBhbmQg4oCUXG4gICAgICAvLyBkb24ndCBtb3ZlIHRvIHRoZSBtYXJnaW5lZCBCb3ggaW5zaWRlLiBwYWRkaW5nQm90dG9tIG1pcnJvcnMgdGhlXG4gICAgICAvLyB0aW50ZWQgbWFyZ2luVG9wLlxuICAgICAgcGFkZGluZ0JvdHRvbT17ZXhwYW5kZWQgPyAxIDogdW5kZWZpbmVkfVxuICAgICAgb25DbGljaz17Y2xpY2thYmxlID8gZSA9PiBvbkNsaWNrSyhtc2csIGUuY2VsbElzQmxhbmspIDogdW5kZWZpbmVkfVxuICAgICAgb25Nb3VzZUVudGVyPXtjbGlja2FibGUgPyAoKSA9PiBvbkVudGVySyhrKSA6IHVuZGVmaW5lZH1cbiAgICAgIG9uTW91c2VMZWF2ZT17Y2xpY2thYmxlID8gKCkgPT4gb25MZWF2ZUsoaykgOiB1bmRlZmluZWR9XG4gICAgPlxuICAgICAgPFRleHRIb3ZlckNvbG9yQ29udGV4dC5Qcm92aWRlclxuICAgICAgICB2YWx1ZT17aG92ZXJlZCAmJiAhZXhwYW5kZWQgPyAndGV4dCcgOiB1bmRlZmluZWR9XG4gICAgICA+XG4gICAgICAgIHtyZW5kZXJJdGVtKG1zZywgaWR4KX1cbiAgICAgIDwvVGV4dEhvdmVyQ29sb3JDb250ZXh0LlByb3ZpZGVyPlxuICAgIDwvQm94PlxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBWaXJ0dWFsTWVzc2FnZUxpc3Qoe1xuICBtZXNzYWdlcyxcbiAgc2Nyb2xsUmVmLFxuICBjb2x1bW5zLFxuICBpdGVtS2V5LFxuICByZW5kZXJJdGVtLFxuICBvbkl0ZW1DbGljayxcbiAgaXNJdGVtQ2xpY2thYmxlLFxuICBpc0l0ZW1FeHBhbmRlZCxcbiAgZXh0cmFjdFNlYXJjaFRleHQgPSBkZWZhdWx0RXh0cmFjdFNlYXJjaFRleHQsXG4gIHRyYWNrU3RpY2t5UHJvbXB0LFxuICBzZWxlY3RlZEluZGV4LFxuICBjdXJzb3JOYXZSZWYsXG4gIHNldEN1cnNvcixcbiAganVtcFJlZixcbiAgb25TZWFyY2hNYXRjaGVzQ2hhbmdlLFxuICBzY2FuRWxlbWVudCxcbiAgc2V0UG9zaXRpb25zLFxufTogUHJvcHMpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAvLyBJbmNyZW1lbnRhbCBrZXkgYXJyYXkuIFN0cmVhbWluZyBhcHBlbmRzIG9uZSBtZXNzYWdlIGF0IGEgdGltZTsgcmVidWlsZGluZ1xuICAvLyB0aGUgZnVsbCBzdHJpbmcgYXJyYXkgb24gZXZlcnkgY29tbWl0IGFsbG9jYXRlcyBPKG4pIHBlciBtZXNzYWdlICh+MU1CXG4gIC8vIGNodXJuIGF0IDI3ayBtZXNzYWdlcykuIEFwcGVuZC1vbmx5IGRlbHRhIHB1c2ggd2hlbiB0aGUgcHJlZml4IG1hdGNoZXM7XG4gIC8vIGZhbGwgYmFjayB0byBmdWxsIHJlYnVpbGQgb24gY29tcGFjdGlvbiwgL2NsZWFyLCBvciBpdGVtS2V5IGNoYW5nZS5cbiAgY29uc3Qga2V5c1JlZiA9IHVzZVJlZjxzdHJpbmdbXT4oW10pXG4gIGNvbnN0IHByZXZNZXNzYWdlc1JlZiA9IHVzZVJlZjx0eXBlb2YgbWVzc2FnZXM+KG1lc3NhZ2VzKVxuICBjb25zdCBwcmV2SXRlbUtleVJlZiA9IHVzZVJlZihpdGVtS2V5KVxuICBpZiAoXG4gICAgcHJldkl0ZW1LZXlSZWYuY3VycmVudCAhPT0gaXRlbUtleSB8fFxuICAgIG1lc3NhZ2VzLmxlbmd0aCA8IGtleXNSZWYuY3VycmVudC5sZW5ndGggfHxcbiAgICBtZXNzYWdlc1swXSAhPT0gcHJldk1lc3NhZ2VzUmVmLmN1cnJlbnRbMF1cbiAgKSB7XG4gICAga2V5c1JlZi5jdXJyZW50ID0gbWVzc2FnZXMubWFwKG0gPT4gaXRlbUtleShtKSlcbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBpID0ga2V5c1JlZi5jdXJyZW50Lmxlbmd0aDsgaSA8IG1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXlzUmVmLmN1cnJlbnQucHVzaChpdGVtS2V5KG1lc3NhZ2VzW2ldISkpXG4gICAgfVxuICB9XG4gIHByZXZNZXNzYWdlc1JlZi5jdXJyZW50ID0gbWVzc2FnZXNcbiAgcHJldkl0ZW1LZXlSZWYuY3VycmVudCA9IGl0ZW1LZXlcbiAgY29uc3Qga2V5cyA9IGtleXNSZWYuY3VycmVudFxuICBjb25zdCB7XG4gICAgcmFuZ2UsXG4gICAgdG9wU3BhY2VyLFxuICAgIGJvdHRvbVNwYWNlcixcbiAgICBtZWFzdXJlUmVmLFxuICAgIHNwYWNlclJlZixcbiAgICBvZmZzZXRzLFxuICAgIGdldEl0ZW1Ub3AsXG4gICAgZ2V0SXRlbUVsZW1lbnQsXG4gICAgZ2V0SXRlbUhlaWdodCxcbiAgICBzY3JvbGxUb0luZGV4LFxuICB9ID0gdXNlVmlydHVhbFNjcm9sbChzY3JvbGxSZWYsIGtleXMsIGNvbHVtbnMpXG4gIGNvbnN0IFtzdGFydCwgZW5kXSA9IHJhbmdlXG5cbiAgLy8gVW5tZWFzdXJlZCAodW5kZWZpbmVkIGhlaWdodCkgZmFsbHMgdGhyb3VnaCDigJQgYXNzdW1lIHZpc2libGUuXG4gIGNvbnN0IGlzVmlzaWJsZSA9IHVzZUNhbGxiYWNrKFxuICAgIChpOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IGggPSBnZXRJdGVtSGVpZ2h0KGkpXG4gICAgICBpZiAoaCA9PT0gMCkgcmV0dXJuIGZhbHNlXG4gICAgICByZXR1cm4gaXNOYXZpZ2FibGVNZXNzYWdlKG1lc3NhZ2VzW2ldISlcbiAgICB9LFxuICAgIFtnZXRJdGVtSGVpZ2h0LCBtZXNzYWdlc10sXG4gIClcbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZShjdXJzb3JOYXZSZWYsICgpOiBNZXNzYWdlQWN0aW9uc05hdiA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ID0gKG06IE5hdmlnYWJsZU1lc3NhZ2UpID0+XG4gICAgICBzZXRDdXJzb3I/Lih7XG4gICAgICAgIHV1aWQ6IG0udXVpZCxcbiAgICAgICAgbXNnVHlwZTogbS50eXBlLFxuICAgICAgICBleHBhbmRlZDogZmFsc2UsXG4gICAgICAgIHRvb2xOYW1lOiB0b29sQ2FsbE9mKG0pPy5uYW1lLFxuICAgICAgfSlcbiAgICBjb25zdCBzZWxJZHggPSBzZWxlY3RlZEluZGV4ID8/IC0xXG4gICAgY29uc3Qgc2NhbiA9IChcbiAgICAgIGZyb206IG51bWJlcixcbiAgICAgIGRpcjogMSB8IC0xLFxuICAgICAgcHJlZDogKGk6IG51bWJlcikgPT4gYm9vbGVhbiA9IGlzVmlzaWJsZSxcbiAgICApID0+IHtcbiAgICAgIGZvciAobGV0IGkgPSBmcm9tOyBpID49IDAgJiYgaSA8IG1lc3NhZ2VzLmxlbmd0aDsgaSArPSBkaXIpIHtcbiAgICAgICAgaWYgKHByZWQoaSkpIHtcbiAgICAgICAgICBzZWxlY3QobWVzc2FnZXNbaV0hKVxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBjb25zdCBpc1VzZXIgPSAoaTogbnVtYmVyKSA9PiBpc1Zpc2libGUoaSkgJiYgbWVzc2FnZXNbaV0hLnR5cGUgPT09ICd1c2VyJ1xuICAgIHJldHVybiB7XG4gICAgICAvLyBFbnRyeSB2aWEgc2hpZnQr4oaRID0gc2FtZSBzZW1hbnRpYyBhcyBpbi1jdXJzb3Igc2hpZnQr4oaRIChwcmV2VXNlcikuXG4gICAgICBlbnRlckN1cnNvcjogKCkgPT4gc2NhbihtZXNzYWdlcy5sZW5ndGggLSAxLCAtMSwgaXNVc2VyKSxcbiAgICAgIG5hdmlnYXRlUHJldjogKCkgPT4gc2NhbihzZWxJZHggLSAxLCAtMSksXG4gICAgICBuYXZpZ2F0ZU5leHQ6ICgpID0+IHtcbiAgICAgICAgaWYgKHNjYW4oc2VsSWR4ICsgMSwgMSkpIHJldHVyblxuICAgICAgICAvLyBQYXN0IGxhc3QgdmlzaWJsZSDihpIgZXhpdCArIHJlcGluLiBMYXN0IG1lc3NhZ2UncyBUT1AgaXMgYXQgdmlld3BvcnRcbiAgICAgICAgLy8gdG9wIChzZWxlY3Rpb24tc2Nyb2xsIGVmZmVjdCk7IGl0cyBCT1RUT00gbWF5IGJlIGJlbG93IHRoZSBmb2xkLlxuICAgICAgICBzY3JvbGxSZWYuY3VycmVudD8uc2Nyb2xsVG9Cb3R0b20oKVxuICAgICAgICBzZXRDdXJzb3I/LihudWxsKVxuICAgICAgfSxcbiAgICAgIC8vIHR5cGU6J3VzZXInIG9ubHkg4oCUIHF1ZXVlZF9jb21tYW5kIGF0dGFjaG1lbnRzIGxvb2sgbGlrZSBwcm9tcHRzIGJ1dCBoYXZlIG5vIHJhdyBVc2VyTWVzc2FnZSB0byByZXdpbmQgdG8uXG4gICAgICBuYXZpZ2F0ZVByZXZVc2VyOiAoKSA9PiBzY2FuKHNlbElkeCAtIDEsIC0xLCBpc1VzZXIpLFxuICAgICAgbmF2aWdhdGVOZXh0VXNlcjogKCkgPT4gc2NhbihzZWxJZHggKyAxLCAxLCBpc1VzZXIpLFxuICAgICAgbmF2aWdhdGVUb3A6ICgpID0+IHNjYW4oMCwgMSksXG4gICAgICBuYXZpZ2F0ZUJvdHRvbTogKCkgPT4gc2NhbihtZXNzYWdlcy5sZW5ndGggLSAxLCAtMSksXG4gICAgICBnZXRTZWxlY3RlZDogKCkgPT4gKHNlbElkeCA+PSAwID8gKG1lc3NhZ2VzW3NlbElkeF0gPz8gbnVsbCkgOiBudWxsKSxcbiAgICB9XG4gIH0sIFttZXNzYWdlcywgc2VsZWN0ZWRJbmRleCwgc2V0Q3Vyc29yLCBpc1Zpc2libGVdKVxuICAvLyBUd28tcGhhc2UganVtcCArIHNlYXJjaCBlbmdpbmUuIFJlYWQtdGhyb3VnaC1yZWYgc28gdGhlIGhhbmRsZSBzdGF5c1xuICAvLyBzdGFibGUgYWNyb3NzIHJlbmRlcnMg4oCUIG9mZnNldHMvbWVzc2FnZXMgaWRlbnRpdHkgY2hhbmdlcyBldmVyeSByZW5kZXIsXG4gIC8vIGNhbid0IGdvIGluIHVzZUltcGVyYXRpdmVIYW5kbGUgZGVwcyB3aXRob3V0IHJlY3JlYXRpbmcgdGhlIGhhbmRsZS5cbiAgY29uc3QganVtcFN0YXRlID0gdXNlUmVmKHtcbiAgICBvZmZzZXRzLFxuICAgIHN0YXJ0LFxuICAgIGdldEl0ZW1FbGVtZW50LFxuICAgIGdldEl0ZW1Ub3AsXG4gICAgbWVzc2FnZXMsXG4gICAgc2Nyb2xsVG9JbmRleCxcbiAgfSlcbiAganVtcFN0YXRlLmN1cnJlbnQgPSB7XG4gICAgb2Zmc2V0cyxcbiAgICBzdGFydCxcbiAgICBnZXRJdGVtRWxlbWVudCxcbiAgICBnZXRJdGVtVG9wLFxuICAgIG1lc3NhZ2VzLFxuICAgIHNjcm9sbFRvSW5kZXgsXG4gIH1cblxuICAvLyBLZWVwIGN1cnNvci1zZWxlY3RlZCBtZXNzYWdlIHZpc2libGUuIG9mZnNldHMgcmVidWlsZHMgZXZlcnkgcmVuZGVyXG4gIC8vIOKAlCBhcyBhIGJhcmUgZGVwIHRoaXMgcmUtcGlubmVkIG9uIGV2ZXJ5IG1vdXNld2hlZWwgdGljay4gUmVhZCB0aHJvdWdoXG4gIC8vIGp1bXBTdGF0ZSBpbnN0ZWFkOyBwYXN0LW92ZXJzY2FuIGp1bXBzIGxhbmQgdmlhIHNjcm9sbFRvSW5kZXgsIG5leHRcbiAgLy8gbmF2IGlzIHByZWNpc2UuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHNlbGVjdGVkSW5kZXggPT09IHVuZGVmaW5lZCkgcmV0dXJuXG4gICAgY29uc3QgcyA9IGp1bXBTdGF0ZS5jdXJyZW50XG4gICAgY29uc3QgZWwgPSBzLmdldEl0ZW1FbGVtZW50KHNlbGVjdGVkSW5kZXgpXG4gICAgaWYgKGVsKSB7XG4gICAgICBzY3JvbGxSZWYuY3VycmVudD8uc2Nyb2xsVG9FbGVtZW50KGVsLCAxKVxuICAgIH0gZWxzZSB7XG4gICAgICBzLnNjcm9sbFRvSW5kZXgoc2VsZWN0ZWRJbmRleClcbiAgICB9XG4gIH0sIFtzZWxlY3RlZEluZGV4LCBzY3JvbGxSZWZdKVxuXG4gIC8vIFBlbmRpbmcgc2VlayByZXF1ZXN0LiBqdW1wKCkgc2V0cyB0aGlzICsgYnVtcHMgc2Vla0dlbi4gVGhlIHNlZWtcbiAgLy8gZWZmZWN0IGZpcmVzIHBvc3QtcGFpbnQgKHBhc3NpdmUgZWZmZWN0IOKAlCBhZnRlciByZXNldEFmdGVyQ29tbWl0KSxcbiAgLy8gY2hlY2tzIGlmIHRhcmdldCBpcyBtb3VudGVkLiBZZXMg4oaSIHNjYW4raGlnaGxpZ2h0LiBObyDihpIgcmUtZXN0aW1hdGVcbiAgLy8gd2l0aCBhIGZyZXNoZXIgYW5jaG9yIChzdGFydCBtb3ZlZCB0b3dhcmQgaWR4KSBhbmQgc2Nyb2xsVG8gYWdhaW4uXG4gIGNvbnN0IHNjYW5SZXF1ZXN0UmVmID0gdXNlUmVmPHtcbiAgICBpZHg6IG51bWJlclxuICAgIHdhbnRMYXN0OiBib29sZWFuXG4gICAgdHJpZXM6IG51bWJlclxuICB9IHwgbnVsbD4obnVsbClcbiAgLy8gTWVzc2FnZS1yZWxhdGl2ZSBwb3NpdGlvbnMgZnJvbSBzY2FuRWxlbWVudC4gUm93IDAgPSBtZXNzYWdlIHRvcC5cbiAgLy8gU3RhYmxlIGFjcm9zcyBzY3JvbGwg4oCUIGhpZ2hsaWdodCBjb21wdXRlcyByb3dPZmZzZXQgZnJlc2guIG1zZ0lkeFxuICAvLyBmb3IgY29tcHV0aW5nIHJvd09mZnNldCA9IGdldEl0ZW1Ub3AobXNnSWR4KSAtIHNjcm9sbFRvcC5cbiAgY29uc3QgZWxlbWVudFBvc2l0aW9ucyA9IHVzZVJlZjx7XG4gICAgbXNnSWR4OiBudW1iZXJcbiAgICBwb3NpdGlvbnM6IE1hdGNoUG9zaXRpb25bXVxuICB9Pih7IG1zZ0lkeDogLTEsIHBvc2l0aW9uczogW10gfSlcbiAgLy8gV3JhcGFyb3VuZCBndWFyZC4gQXV0by1hZHZhbmNlIHN0b3BzIGlmIHB0ciB3cmFwcyBiYWNrIHRvIGhlcmUuXG4gIGNvbnN0IHN0YXJ0UHRyUmVmID0gdXNlUmVmKC0xKVxuICAvLyBQaGFudG9tLWJ1cnN0IGNhcC4gUmVzZXRzIG9uIHNjYW4gc3VjY2Vzcy5cbiAgY29uc3QgcGhhbnRvbUJ1cnN0UmVmID0gdXNlUmVmKDApXG4gIC8vIE9uZS1kZWVwIHF1ZXVlOiBuL04gYXJyaXZpbmcgbWlkLXNlZWsgZ2V0cyBzdG9yZWQgKG5vdCBkcm9wcGVkKSBhbmRcbiAgLy8gZmlyZXMgYWZ0ZXIgdGhlIHNlZWsgY29tcGxldGVzLiBIb2xkaW5nIG4gc3RheXMgc21vb3RoIHdpdGhvdXRcbiAgLy8gcXVldWVpbmcgMzAganVtcHMuIExhdGVzdCBwcmVzcyBvdmVyd3JpdGVzIOKAlCB3ZSB3YW50IHRoZSBkaXJlY3Rpb25cbiAgLy8gdGhlIHVzZXIgaXMgZ29pbmcgTk9XLCBub3Qgd2hlcmUgdGhleSB3ZXJlIDEwIGtleXByZXNzZXMgYWdvLlxuICBjb25zdCBwZW5kaW5nU3RlcFJlZiA9IHVzZVJlZjwxIHwgLTEgfCAwPigwKVxuICAvLyBzdGVwICsgaGlnaGxpZ2h0IHZpYSByZWYgc28gdGhlIHNlZWsgZWZmZWN0IHJlYWRzIGxhdGVzdCB3aXRob3V0XG4gIC8vIGNsb3N1cmUtY2FwdHVyZSBvciBkZXBzIGNodXJuLlxuICBjb25zdCBzdGVwUmVmID0gdXNlUmVmPChkOiAxIHwgLTEpID0+IHZvaWQ+KCgpID0+IHt9KVxuICBjb25zdCBoaWdobGlnaHRSZWYgPSB1c2VSZWY8KG9yZDogbnVtYmVyKSA9PiB2b2lkPigoKSA9PiB7fSlcbiAgY29uc3Qgc2VhcmNoU3RhdGUgPSB1c2VSZWYoe1xuICAgIG1hdGNoZXM6IFtdIGFzIG51bWJlcltdLCAvLyBkZWR1cGxpY2F0ZWQgbXNnIGluZGljZXNcbiAgICBwdHI6IDAsXG4gICAgc2NyZWVuT3JkOiAwLFxuICAgIC8vIEN1bXVsYXRpdmUgZW5naW5lLW9jY3VycmVuY2UgY291bnQgYmVmb3JlIGVhY2ggbWF0Y2hlc1trXS4gTGV0cyB1c1xuICAgIC8vIGNvbXB1dGUgYSBnbG9iYWwgY3VycmVudCBpbmRleDogcHJlZml4U3VtW3B0cl0gKyBzY3JlZW5PcmQgKyAxLlxuICAgIC8vIEVuZ2luZS1jb3VudGVkIChpbmRleE9mIG9uIGV4dHJhY3RTZWFyY2hUZXh0KSwgbm90IHJlbmRlci1jb3VudGVkIOKAlFxuICAgIC8vIGNsb3NlIGVub3VnaCBmb3IgdGhlIGJhZGdlOyBleGFjdCBjb3VudHMgd291bGQgbmVlZCBzY2FuRWxlbWVudCBvblxuICAgIC8vIGV2ZXJ5IG1hdGNoZWQgbWVzc2FnZSAofjEtM21zIMOXIE4pLiB0b3RhbCA9IHByZWZpeFN1bVttYXRjaGVzLmxlbmd0aF0uXG4gICAgcHJlZml4U3VtOiBbXSBhcyBudW1iZXJbXSxcbiAgfSlcbiAgLy8gc2Nyb2xsVG9wIGF0IHRoZSBtb21lbnQgLyB3YXMgcHJlc3NlZC4gSW5jc2VhcmNoIHByZXZpZXctanVtcHMgc25hcFxuICAvLyBiYWNrIGhlcmUgd2hlbiBtYXRjaGVzIGRyb3AgdG8gMC4gLTEgPSBubyBhbmNob3IgKGJlZm9yZSBmaXJzdCAvKS5cbiAgY29uc3Qgc2VhcmNoQW5jaG9yID0gdXNlUmVmKC0xKVxuICBjb25zdCBpbmRleFdhcm1lZCA9IHVzZVJlZihmYWxzZSlcblxuICAvLyBTY3JvbGwgdGFyZ2V0IGZvciBtZXNzYWdlIGk6IGxhbmQgYXQgTUVTU0FHRSBUT1AuIGVzdCA9IHRvcCAtIEhFQURST09NXG4gIC8vIHNvIGxvID0gdG9wIC0gZXN0ID0gSEVBRFJPT00g4omlIDAgKG9yIGxvID0gdG9wIGlmIGVzdCBjbGFtcGVkIHRvIDApLlxuICAvLyBQb3N0LWNsYW1wIHJlYWQtYmFjayBpbiBqdW1wKCkgaGFuZGxlcyB0aGUgc2Nyb2xsSGVpZ2h0IGJvdW5kYXJ5LlxuICAvLyBObyBmcmFjIChyZW5kZXIgdHJhbnNmb3JtIGRpZG4ndCByZXNwZWN0IGl0KSwgbm8gbW9ub3RvbmUgY2xhbXBcbiAgLy8gKHdhcyBhIHNhZmV0eSBuZXQgZm9yIGZyYWMgZ2FyYmFnZSDigJQgd2l0aG91dCBmcmFjLCBlc3QgSVMgdGhlIG5leHRcbiAgLy8gbWVzc2FnZSdzIHRvcCwgc3BhbS1uL04gY29udmVyZ2VzIGJlY2F1c2UgbWVzc2FnZSB0b3BzIGFyZSBvcmRlcmVkKS5cbiAgZnVuY3Rpb24gdGFyZ2V0Rm9yKGk6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgdG9wID0ganVtcFN0YXRlLmN1cnJlbnQuZ2V0SXRlbVRvcChpKVxuICAgIHJldHVybiBNYXRoLm1heCgwLCB0b3AgLSBIRUFEUk9PTSlcbiAgfVxuXG4gIC8vIEhpZ2hsaWdodCBwb3NpdGlvbnNbb3JkXS4gUG9zaXRpb25zIGFyZSBNRVNTQUdFLVJFTEFUSVZFIChyb3cgMCA9XG4gIC8vIGVsZW1lbnQgdG9wLCBmcm9tIHNjYW5FbGVtZW50KS4gQ29tcHV0ZSByb3dPZmZzZXQgPSBnZXRJdGVtVG9wIC1cbiAgLy8gc2Nyb2xsVG9wIGZyZXNoLiBJZiBvcmQncyBwb3NpdGlvbiBpcyBvZmYtdmlld3BvcnQsIHNjcm9sbCB0byBicmluZ1xuICAvLyBpdCBpbiwgcmVjb21wdXRlIHJvd09mZnNldC4gc2V0UG9zaXRpb25zIHRyaWdnZXJzIG92ZXJsYXkgd3JpdGUuXG4gIGZ1bmN0aW9uIGhpZ2hsaWdodChvcmQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHMgPSBzY3JvbGxSZWYuY3VycmVudFxuICAgIGNvbnN0IHsgbXNnSWR4LCBwb3NpdGlvbnMgfSA9IGVsZW1lbnRQb3NpdGlvbnMuY3VycmVudFxuICAgIGlmICghcyB8fCBwb3NpdGlvbnMubGVuZ3RoID09PSAwIHx8IG1zZ0lkeCA8IDApIHtcbiAgICAgIHNldFBvc2l0aW9ucz8uKG51bGwpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgaWR4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4ob3JkLCBwb3NpdGlvbnMubGVuZ3RoIC0gMSkpXG4gICAgY29uc3QgcCA9IHBvc2l0aW9uc1tpZHhdIVxuICAgIGNvbnN0IHRvcCA9IGp1bXBTdGF0ZS5jdXJyZW50LmdldEl0ZW1Ub3AobXNnSWR4KVxuICAgIC8vIGxvID0gaXRlbSdzIHBvc2l0aW9uIHdpdGhpbiBzY3JvbGwgY29udGVudCAod3JhcHBlci1yZWxhdGl2ZSkuXG4gICAgLy8gdmlld3BvcnRUb3AgPSB3aGVyZSB0aGUgc2Nyb2xsIGNvbnRlbnQgc3RhcnRzIG9uIFNDUkVFTiAoYWZ0ZXJcbiAgICAvLyBTY3JvbGxCb3ggcGFkZGluZy9ib3JkZXIgKyBhbnkgY2hyb21lIGFib3ZlKS4gSGlnaGxpZ2h0IHdyaXRlcyB0b1xuICAgIC8vIHNjcmVlbi1hYnNvbHV0ZSwgc28gcm93T2Zmc2V0ID0gdmlld3BvcnRUb3AgKyBsby4gT2JzZXJ2ZWQ6IG9mZi1ieS1cbiAgICAvLyAxKyB3aXRob3V0IHZpZXdwb3J0VG9wIChGdWxsc2NyZWVuTGF5b3V0IGhhcyBwYWRkaW5nVG9wPTEgb24gdGhlXG4gICAgLy8gU2Nyb2xsQm94LCBwbHVzIGFueSBoZWFkZXIgYWJvdmUpLlxuICAgIGNvbnN0IHZwVG9wID0gcy5nZXRWaWV3cG9ydFRvcCgpXG4gICAgbGV0IGxvID0gdG9wIC0gcy5nZXRTY3JvbGxUb3AoKVxuICAgIGNvbnN0IHZwID0gcy5nZXRWaWV3cG9ydEhlaWdodCgpXG4gICAgbGV0IHNjcmVlblJvdyA9IHZwVG9wICsgbG8gKyBwLnJvd1xuICAgIC8vIE9mZiB2aWV3cG9ydCDihpIgc2Nyb2xsIHRvIGJyaW5nIGl0IGluIChIRUFEUk9PTSBmcm9tIHRvcCkuXG4gICAgLy8gc2Nyb2xsVG8gY29tbWl0cyBzeW5jOyByZWFkLWJhY2sgYWZ0ZXIgZ2l2ZXMgZnJlc2ggbG8uXG4gICAgaWYgKHNjcmVlblJvdyA8IHZwVG9wIHx8IHNjcmVlblJvdyA+PSB2cFRvcCArIHZwKSB7XG4gICAgICBzLnNjcm9sbFRvKE1hdGgubWF4KDAsIHRvcCArIHAucm93IC0gSEVBRFJPT00pKVxuICAgICAgbG8gPSB0b3AgLSBzLmdldFNjcm9sbFRvcCgpXG4gICAgICBzY3JlZW5Sb3cgPSB2cFRvcCArIGxvICsgcC5yb3dcbiAgICB9XG4gICAgc2V0UG9zaXRpb25zPy4oeyBwb3NpdGlvbnMsIHJvd09mZnNldDogdnBUb3AgKyBsbywgY3VycmVudElkeDogaWR4IH0pXG4gICAgLy8gQmFkZ2U6IGdsb2JhbCBjdXJyZW50ID0gc3VtIG9mIG9jY3VycmVuY2VzIGJlZm9yZSB0aGlzIG1zZyArIG9yZCsxLlxuICAgIC8vIHByZWZpeFN1bVtwdHJdIGlzIGVuZ2luZS1jb3VudGVkIChpbmRleE9mIG9uIGV4dHJhY3RTZWFyY2hUZXh0KTtcbiAgICAvLyBtYXkgZHJpZnQgZnJvbSByZW5kZXItY291bnQgZm9yIGdob3N0IG1lc3NhZ2VzIGJ1dCBjbG9zZSBlbm91Z2gg4oCUXG4gICAgLy8gYmFkZ2UgaXMgYSByb3VnaCBsb2NhdGlvbiBoaW50LCBub3QgYSBwcm9vZi5cbiAgICBjb25zdCBzdCA9IHNlYXJjaFN0YXRlLmN1cnJlbnRcbiAgICBjb25zdCB0b3RhbCA9IHN0LnByZWZpeFN1bS5hdCgtMSkgPz8gMFxuICAgIGNvbnN0IGN1cnJlbnQgPSAoc3QucHJlZml4U3VtW3N0LnB0cl0gPz8gMCkgKyBpZHggKyAxXG4gICAgb25TZWFyY2hNYXRjaGVzQ2hhbmdlPy4odG90YWwsIGN1cnJlbnQpXG4gICAgbG9nRm9yRGVidWdnaW5nKFxuICAgICAgYGhpZ2hsaWdodChpPSR7bXNnSWR4fSwgb3JkPSR7aWR4fS8ke3Bvc2l0aW9ucy5sZW5ndGh9KTogYCArXG4gICAgICAgIGBwb3M9e3Jvdzoke3Aucm93fSxjb2w6JHtwLmNvbH19IGxvPSR7bG99IHNjcmVlblJvdz0ke3NjcmVlblJvd30gYCArXG4gICAgICAgIGBiYWRnZT0ke2N1cnJlbnR9LyR7dG90YWx9YCxcbiAgICApXG4gIH1cbiAgaGlnaGxpZ2h0UmVmLmN1cnJlbnQgPSBoaWdobGlnaHRcblxuICAvLyBTZWVrIGVmZmVjdC4ganVtcCgpIHNldHMgc2NhblJlcXVlc3RSZWYgKyBzY3JvbGxUb0luZGV4ICsgYnVtcC5cbiAgLy8gYnVtcCDihpIgcmUtcmVuZGVyIOKGkiB1c2VWaXJ0dWFsU2Nyb2xsIG1vdW50cyB0aGUgdGFyZ2V0IChzY3JvbGxUb0luZGV4XG4gIC8vIGd1YXJhbnRlZXMgdGhpcyDigJQgc2Nyb2xsVG9wIGFuZCB0b3BTcGFjZXIgYWdyZWUgdmlhIHRoZSBzYW1lXG4gIC8vIG9mZnNldHMgdmFsdWUpIOKGkiByZXNldEFmdGVyQ29tbWl0IHBhaW50cyDihpIgdGhpcyBwYXNzaXZlIGVmZmVjdFxuICAvLyBmaXJlcyBQT1NULVBBSU5UIHdpdGggdGhlIGVsZW1lbnQgbW91bnRlZC4gUHJlY2lzZSBzY3JvbGxUbyArIHNjYW4uXG4gIC8vXG4gIC8vIERlcCBpcyBPTkxZIHNlZWtHZW4g4oCUIGVmZmVjdCBkb2Vzbid0IHJlLXJ1biBvbiByYW5kb20gcmVuZGVyc1xuICAvLyAob25TZWFyY2hNYXRjaGVzQ2hhbmdlIGNodXJuIGR1cmluZyBpbmNzZWFyY2gpLlxuICBjb25zdCBbc2Vla0dlbiwgc2V0U2Vla0dlbl0gPSB1c2VTdGF0ZSgwKVxuICBjb25zdCBidW1wU2VlayA9IHVzZUNhbGxiYWNrKCgpID0+IHNldFNlZWtHZW4oZyA9PiBnICsgMSksIFtdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgcmVxID0gc2NhblJlcXVlc3RSZWYuY3VycmVudFxuICAgIGlmICghcmVxKSByZXR1cm5cbiAgICBjb25zdCB7IGlkeCwgd2FudExhc3QsIHRyaWVzIH0gPSByZXFcbiAgICBjb25zdCBzID0gc2Nyb2xsUmVmLmN1cnJlbnRcbiAgICBpZiAoIXMpIHJldHVyblxuICAgIGNvbnN0IHsgZ2V0SXRlbUVsZW1lbnQsIGdldEl0ZW1Ub3AsIHNjcm9sbFRvSW5kZXggfSA9IGp1bXBTdGF0ZS5jdXJyZW50XG4gICAgY29uc3QgZWwgPSBnZXRJdGVtRWxlbWVudChpZHgpXG4gICAgY29uc3QgaCA9IGVsPy55b2dhTm9kZT8uZ2V0Q29tcHV0ZWRIZWlnaHQoKSA/PyAwXG5cbiAgICBpZiAoIWVsIHx8IGggPT09IDApIHtcbiAgICAgIC8vIE5vdCBtb3VudGVkIGFmdGVyIHNjcm9sbFRvSW5kZXguIFNob3VsZG4ndCBoYXBwZW4g4oCUIHNjcm9sbFRvSW5kZXhcbiAgICAgIC8vIGd1YXJhbnRlZXMgbW91bnQgYnkgY29uc3RydWN0aW9uIChzY3JvbGxUb3AgYW5kIHRvcFNwYWNlciBhZ3JlZVxuICAgICAgLy8gdmlhIHRoZSBzYW1lIG9mZnNldHMgdmFsdWUpLiBTYW5pdHk6IHJldHJ5IG9uY2UsIHRoZW4gc2tpcC5cbiAgICAgIGlmICh0cmllcyA+IDEpIHtcbiAgICAgICAgc2NhblJlcXVlc3RSZWYuY3VycmVudCA9IG51bGxcbiAgICAgICAgbG9nRm9yRGVidWdnaW5nKGBzZWVrKGk9JHtpZHh9KTogbm8gbW91bnQgYWZ0ZXIgc2Nyb2xsVG9JbmRleCwgc2tpcGApXG4gICAgICAgIHN0ZXBSZWYuY3VycmVudCh3YW50TGFzdCA/IC0xIDogMSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBzY2FuUmVxdWVzdFJlZi5jdXJyZW50ID0geyBpZHgsIHdhbnRMYXN0LCB0cmllczogdHJpZXMgKyAxIH1cbiAgICAgIHNjcm9sbFRvSW5kZXgoaWR4KVxuICAgICAgYnVtcFNlZWsoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc2NhblJlcXVlc3RSZWYuY3VycmVudCA9IG51bGxcbiAgICAvLyBQcmVjaXNlIHNjcm9sbFRvIOKAlCBzY3JvbGxUb0luZGV4IGdvdCB1cyBpbiB0aGUgbmVpZ2hib3Job29kXG4gICAgLy8gKGl0ZW0gaXMgbW91bnRlZCwgbWF5YmUgYSBmZXctZG96ZW4gcm93cyBvZmYgZHVlIHRvIG92ZXJzY2FuXG4gICAgLy8gZXN0aW1hdGUgZHJpZnQpLiBOb3cgbGFuZCBpdCBhdCB0b3AtSEVBRFJPT00uXG4gICAgcy5zY3JvbGxUbyhNYXRoLm1heCgwLCBnZXRJdGVtVG9wKGlkeCkgLSBIRUFEUk9PTSkpXG4gICAgY29uc3QgcG9zaXRpb25zID0gc2NhbkVsZW1lbnQ/LihlbCkgPz8gW11cbiAgICBlbGVtZW50UG9zaXRpb25zLmN1cnJlbnQgPSB7IG1zZ0lkeDogaWR4LCBwb3NpdGlvbnMgfVxuICAgIGxvZ0ZvckRlYnVnZ2luZyhgc2VlayhpPSR7aWR4fSB0PSR7dHJpZXN9KTogJHtwb3NpdGlvbnMubGVuZ3RofSBwb3NpdGlvbnNgKVxuICAgIGlmIChwb3NpdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBQaGFudG9tIOKAlCBlbmdpbmUgbWF0Y2hlZCwgcmVuZGVyIGRpZG4ndC4gQXV0by1hZHZhbmNlLlxuICAgICAgaWYgKCsrcGhhbnRvbUJ1cnN0UmVmLmN1cnJlbnQgPiAyMCkge1xuICAgICAgICBwaGFudG9tQnVyc3RSZWYuY3VycmVudCA9IDBcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBzdGVwUmVmLmN1cnJlbnQod2FudExhc3QgPyAtMSA6IDEpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcGhhbnRvbUJ1cnN0UmVmLmN1cnJlbnQgPSAwXG4gICAgY29uc3Qgb3JkID0gd2FudExhc3QgPyBwb3NpdGlvbnMubGVuZ3RoIC0gMSA6IDBcbiAgICBzZWFyY2hTdGF0ZS5jdXJyZW50LnNjcmVlbk9yZCA9IG9yZFxuICAgIHN0YXJ0UHRyUmVmLmN1cnJlbnQgPSAtMVxuICAgIGhpZ2hsaWdodFJlZi5jdXJyZW50KG9yZClcbiAgICBjb25zdCBwZW5kaW5nID0gcGVuZGluZ1N0ZXBSZWYuY3VycmVudFxuICAgIGlmIChwZW5kaW5nKSB7XG4gICAgICBwZW5kaW5nU3RlcFJlZi5jdXJyZW50ID0gMFxuICAgICAgc3RlcFJlZi5jdXJyZW50KHBlbmRpbmcpXG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW3NlZWtHZW5dKVxuXG4gIC8vIFNjcm9sbCB0byBtZXNzYWdlIGkncyB0b3AsIGFybSBzY2FuUGVuZGluZy4gc2Nhbi1lZmZlY3QgcmVhZHMgZnJlc2hcbiAgLy8gc2NyZWVuIG5leHQgdGljay4gd2FudExhc3Q6IE4taW50by1tZXNzYWdlIOKAlCBzY3JlZW5PcmQgPSBsZW5ndGgtMS5cbiAgZnVuY3Rpb24ganVtcChpOiBudW1iZXIsIHdhbnRMYXN0OiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgcyA9IHNjcm9sbFJlZi5jdXJyZW50XG4gICAgaWYgKCFzKSByZXR1cm5cbiAgICBjb25zdCBqcyA9IGp1bXBTdGF0ZS5jdXJyZW50XG4gICAgY29uc3QgeyBnZXRJdGVtRWxlbWVudCwgc2Nyb2xsVG9JbmRleCB9ID0ganNcbiAgICAvLyBvZmZzZXRzIGlzIGEgRmxvYXQ2NEFycmF5IHdob3NlIC5sZW5ndGggaXMgdGhlIGFsbG9jYXRlZCBidWZmZXIgKG9ubHlcbiAgICAvLyBncm93cykg4oCUIG1lc3NhZ2VzLmxlbmd0aCBpcyB0aGUgbG9naWNhbCBpdGVtIGNvdW50LlxuICAgIGlmIChpIDwgMCB8fCBpID49IGpzLm1lc3NhZ2VzLmxlbmd0aCkgcmV0dXJuXG4gICAgLy8gQ2xlYXIgc3RhbGUgaGlnaGxpZ2h0IGJlZm9yZSBzY3JvbGwuIEJldHdlZW4gbm93IGFuZCB0aGUgc2Vla1xuICAgIC8vIGVmZmVjdCdzIGhpZ2hsaWdodCwgaW52ZXJzZS1vbmx5IGZyb20gc2Nhbi1oaWdobGlnaHQgc2hvd3MuXG4gICAgc2V0UG9zaXRpb25zPy4obnVsbClcbiAgICBlbGVtZW50UG9zaXRpb25zLmN1cnJlbnQgPSB7IG1zZ0lkeDogLTEsIHBvc2l0aW9uczogW10gfVxuICAgIHNjYW5SZXF1ZXN0UmVmLmN1cnJlbnQgPSB7IGlkeDogaSwgd2FudExhc3QsIHRyaWVzOiAwIH1cbiAgICBjb25zdCBlbCA9IGdldEl0ZW1FbGVtZW50KGkpXG4gICAgY29uc3QgaCA9IGVsPy55b2dhTm9kZT8uZ2V0Q29tcHV0ZWRIZWlnaHQoKSA/PyAwXG4gICAgLy8gTW91bnRlZCDihpIgcHJlY2lzZSBzY3JvbGxUby4gVW5tb3VudGVkIOKGkiBzY3JvbGxUb0luZGV4IG1vdW50cyBpdFxuICAgIC8vIChzY3JvbGxUb3AgYW5kIHRvcFNwYWNlciBhZ3JlZSB2aWEgdGhlIHNhbWUgb2Zmc2V0cyB2YWx1ZSDigJQgZXhhY3RcbiAgICAvLyBieSBjb25zdHJ1Y3Rpb24sIG5vIGVzdGltYXRpb24pLiBTZWVrIGVmZmVjdCBkb2VzIHRoZSBwcmVjaXNlXG4gICAgLy8gc2Nyb2xsVG8gYWZ0ZXIgcGFpbnQgZWl0aGVyIHdheS5cbiAgICBpZiAoZWwgJiYgaCA+IDApIHtcbiAgICAgIHMuc2Nyb2xsVG8odGFyZ2V0Rm9yKGkpKVxuICAgIH0gZWxzZSB7XG4gICAgICBzY3JvbGxUb0luZGV4KGkpXG4gICAgfVxuICAgIGJ1bXBTZWVrKClcbiAgfVxuXG4gIC8vIEFkdmFuY2Ugc2NyZWVuT3JkIHdpdGhpbiBlbGVtZW50UG9zaXRpb25zLiBFeGhhdXN0ZWQg4oaSIHB0ciBhZHZhbmNlcyxcbiAgLy8ganVtcCB0byBuZXh0IG1hdGNoZXNbcHRyXSwgcmUtc2Nhbi4gUGhhbnRvbSAoc2NhbiBmb3VuZCAwIGFmdGVyXG4gIC8vIGp1bXApIHRyaWdnZXJzIGF1dG8tYWR2YW5jZSBmcm9tIHNjYW4tZWZmZWN0LiBXcmFwYXJvdW5kIGd1YXJkIHN0b3BzXG4gIC8vIGlmIGV2ZXJ5IG1lc3NhZ2UgaXMgYSBwaGFudG9tLlxuICBmdW5jdGlvbiBzdGVwKGRlbHRhOiAxIHwgLTEpOiB2b2lkIHtcbiAgICBjb25zdCBzdCA9IHNlYXJjaFN0YXRlLmN1cnJlbnRcbiAgICBjb25zdCB7IG1hdGNoZXMsIHByZWZpeFN1bSB9ID0gc3RcbiAgICBjb25zdCB0b3RhbCA9IHByZWZpeFN1bS5hdCgtMSkgPz8gMFxuICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICAvLyBTZWVrIGluLWZsaWdodCDigJQgcXVldWUgdGhpcyBwcmVzcyAob25lLWRlZXAsIGxhdGVzdCBvdmVyd3JpdGVzKS5cbiAgICAvLyBUaGUgc2VlayBlZmZlY3QgZmlyZXMgaXQgYWZ0ZXIgaGlnaGxpZ2h0LlxuICAgIGlmIChzY2FuUmVxdWVzdFJlZi5jdXJyZW50KSB7XG4gICAgICBwZW5kaW5nU3RlcFJlZi5jdXJyZW50ID0gZGVsdGFcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChzdGFydFB0clJlZi5jdXJyZW50IDwgMCkgc3RhcnRQdHJSZWYuY3VycmVudCA9IHN0LnB0clxuXG4gICAgY29uc3QgeyBwb3NpdGlvbnMgfSA9IGVsZW1lbnRQb3NpdGlvbnMuY3VycmVudFxuICAgIGNvbnN0IG5ld09yZCA9IHN0LnNjcmVlbk9yZCArIGRlbHRhXG4gICAgaWYgKG5ld09yZCA+PSAwICYmIG5ld09yZCA8IHBvc2l0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHN0LnNjcmVlbk9yZCA9IG5ld09yZFxuICAgICAgaGlnaGxpZ2h0KG5ld09yZCkgLy8gdXBkYXRlcyBiYWRnZSBpbnRlcm5hbGx5XG4gICAgICBzdGFydFB0clJlZi5jdXJyZW50ID0gLTFcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIEV4aGF1c3RlZCB2aXNpYmxlLiBBZHZhbmNlIHB0ciDihpIganVtcCDihpIgcmUtc2Nhbi5cbiAgICBjb25zdCBwdHIgPSAoc3QucHRyICsgZGVsdGEgKyBtYXRjaGVzLmxlbmd0aCkgJSBtYXRjaGVzLmxlbmd0aFxuICAgIGlmIChwdHIgPT09IHN0YXJ0UHRyUmVmLmN1cnJlbnQpIHtcbiAgICAgIHNldFBvc2l0aW9ucz8uKG51bGwpXG4gICAgICBzdGFydFB0clJlZi5jdXJyZW50ID0gLTFcbiAgICAgIGxvZ0ZvckRlYnVnZ2luZyhcbiAgICAgICAgYHN0ZXA6IHdyYXBhcm91bmQgYXQgcHRyPSR7cHRyfSwgYWxsICR7bWF0Y2hlcy5sZW5ndGh9IG1zZ3MgcGhhbnRvbXNgLFxuICAgICAgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHN0LnB0ciA9IHB0clxuICAgIHN0LnNjcmVlbk9yZCA9IDAgLy8gcmVzb2x2ZWQgYWZ0ZXIgc2NhbiAod2FudExhc3Qg4oaSIGxlbmd0aC0xKVxuICAgIGp1bXAobWF0Y2hlc1twdHJdISwgZGVsdGEgPCAwKVxuICAgIC8vIHNjcmVlbk9yZCB3aWxsIHJlc29sdmUgYWZ0ZXIgc2Nhbi4gQmVzdC1lZmZvcnQ6IHByZWZpeFN1bVtwdHJdICsgMFxuICAgIC8vIGZvciBuIChmaXJzdCBwb3MpLCBwcmVmaXhTdW1bcHRyKzFdIGZvciBOIChsYXN0IHBvcyA9IGNvdW50LTEpLlxuICAgIC8vIFRoZSBzY2FuLWVmZmVjdCdzIGhpZ2hsaWdodCB3aWxsIGJlIHRoZSByZWFsIHZhbHVlOyB0aGlzIGlzIGFcbiAgICAvLyBwcmUtc2NhbiBwbGFjZWhvbGRlciBzbyB0aGUgYmFkZ2UgdXBkYXRlcyBpbW1lZGlhdGVseS5cbiAgICBjb25zdCBwbGFjZWhvbGRlciA9XG4gICAgICBkZWx0YSA8IDAgPyAocHJlZml4U3VtW3B0ciArIDFdID8/IHRvdGFsKSA6IHByZWZpeFN1bVtwdHJdISArIDFcbiAgICBvblNlYXJjaE1hdGNoZXNDaGFuZ2U/Lih0b3RhbCwgcGxhY2Vob2xkZXIpXG4gIH1cbiAgc3RlcFJlZi5jdXJyZW50ID0gc3RlcFxuXG4gIHVzZUltcGVyYXRpdmVIYW5kbGUoXG4gICAganVtcFJlZixcbiAgICAoKSA9PiAoe1xuICAgICAgLy8gTm9uLXNlYXJjaCBqdW1wIChzdGlja3kgaGVhZGVyIGNsaWNrLCBldGMpLiBObyBzY2FuLCBubyBwb3NpdGlvbnMuXG4gICAgICBqdW1wVG9JbmRleDogKGk6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBzID0gc2Nyb2xsUmVmLmN1cnJlbnRcbiAgICAgICAgaWYgKHMpIHMuc2Nyb2xsVG8odGFyZ2V0Rm9yKGkpKVxuICAgICAgfSxcbiAgICAgIHNldFNlYXJjaFF1ZXJ5OiAocTogc3RyaW5nKSA9PiB7XG4gICAgICAgIC8vIE5ldyBzZWFyY2ggaW52YWxpZGF0ZXMgZXZlcnl0aGluZy5cbiAgICAgICAgc2NhblJlcXVlc3RSZWYuY3VycmVudCA9IG51bGxcbiAgICAgICAgZWxlbWVudFBvc2l0aW9ucy5jdXJyZW50ID0geyBtc2dJZHg6IC0xLCBwb3NpdGlvbnM6IFtdIH1cbiAgICAgICAgc3RhcnRQdHJSZWYuY3VycmVudCA9IC0xXG4gICAgICAgIHNldFBvc2l0aW9ucz8uKG51bGwpXG4gICAgICAgIGNvbnN0IGxxID0gcS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIC8vIE9uZSBlbnRyeSBwZXIgTUVTU0FHRSAoZGVkdXBsaWNhdGVkKS4gQm9vbGVhbiBcImRvZXMgdGhpcyBtc2dcbiAgICAgICAgLy8gY29udGFpbiB0aGUgcXVlcnlcIi4gfjEwbXMgZm9yIDlrIG1lc3NhZ2VzIHdpdGggY2FjaGVkIGxvd2VyZWQuXG4gICAgICAgIGNvbnN0IG1hdGNoZXM6IG51bWJlcltdID0gW11cbiAgICAgICAgLy8gUGVyLW1lc3NhZ2Ugb2NjdXJyZW5jZSBjb3VudCDihpIgcHJlZml4U3VtIGZvciBnbG9iYWwgY3VycmVudFxuICAgICAgICAvLyBpbmRleC4gRW5naW5lLWNvdW50ZWQgKGNoZWFwIGluZGV4T2YgbG9vcCk7IG1heSBkaWZmZXIgZnJvbVxuICAgICAgICAvLyByZW5kZXItY291bnQgKHNjYW5FbGVtZW50KSBmb3IgZ2hvc3QvcGhhbnRvbSBtZXNzYWdlcyBidXQgY2xvc2VcbiAgICAgICAgLy8gZW5vdWdoIGZvciB0aGUgYmFkZ2UuIFRoZSBiYWRnZSBpcyBhIHJvdWdoIGxvY2F0aW9uIGhpbnQuXG4gICAgICAgIGNvbnN0IHByZWZpeFN1bTogbnVtYmVyW10gPSBbMF1cbiAgICAgICAgaWYgKGxxKSB7XG4gICAgICAgICAgY29uc3QgbXNncyA9IGp1bXBTdGF0ZS5jdXJyZW50Lm1lc3NhZ2VzXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtc2dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gZXh0cmFjdFNlYXJjaFRleHQobXNnc1tpXSEpXG4gICAgICAgICAgICBsZXQgcG9zID0gdGV4dC5pbmRleE9mKGxxKVxuICAgICAgICAgICAgbGV0IGNudCA9IDBcbiAgICAgICAgICAgIHdoaWxlIChwb3MgPj0gMCkge1xuICAgICAgICAgICAgICBjbnQrK1xuICAgICAgICAgICAgICBwb3MgPSB0ZXh0LmluZGV4T2YobHEsIHBvcyArIGxxLmxlbmd0aClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjbnQgPiAwKSB7XG4gICAgICAgICAgICAgIG1hdGNoZXMucHVzaChpKVxuICAgICAgICAgICAgICBwcmVmaXhTdW0ucHVzaChwcmVmaXhTdW0uYXQoLTEpISArIGNudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG90YWwgPSBwcmVmaXhTdW0uYXQoLTEpIVxuICAgICAgICAvLyBOZWFyZXN0IE1FU1NBR0UgdG8gdGhlIGFuY2hvci4gPD0gc28gdGllcyBnbyB0byBsYXRlci5cbiAgICAgICAgbGV0IHB0ciA9IDBcbiAgICAgICAgY29uc3QgcyA9IHNjcm9sbFJlZi5jdXJyZW50XG4gICAgICAgIGNvbnN0IHsgb2Zmc2V0cywgc3RhcnQsIGdldEl0ZW1Ub3AgfSA9IGp1bXBTdGF0ZS5jdXJyZW50XG4gICAgICAgIGNvbnN0IGZpcnN0VG9wID0gZ2V0SXRlbVRvcChzdGFydClcbiAgICAgICAgY29uc3Qgb3JpZ2luID0gZmlyc3RUb3AgPj0gMCA/IGZpcnN0VG9wIC0gb2Zmc2V0c1tzdGFydF0hIDogMFxuICAgICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPiAwICYmIHMpIHtcbiAgICAgICAgICBjb25zdCBjdXJUb3AgPVxuICAgICAgICAgICAgc2VhcmNoQW5jaG9yLmN1cnJlbnQgPj0gMCA/IHNlYXJjaEFuY2hvci5jdXJyZW50IDogcy5nZXRTY3JvbGxUb3AoKVxuICAgICAgICAgIGxldCBiZXN0ID0gSW5maW5pdHlcbiAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1hdGNoZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBNYXRoLmFicyhvcmlnaW4gKyBvZmZzZXRzW21hdGNoZXNba10hXSEgLSBjdXJUb3ApXG4gICAgICAgICAgICBpZiAoZCA8PSBiZXN0KSB7XG4gICAgICAgICAgICAgIGJlc3QgPSBkXG4gICAgICAgICAgICAgIHB0ciA9IGtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgbG9nRm9yRGVidWdnaW5nKFxuICAgICAgICAgICAgYHNldFNlYXJjaFF1ZXJ5KCcke3F9Jyk6ICR7bWF0Y2hlcy5sZW5ndGh9IG1zZ3MgwrcgcHRyPSR7cHRyfSBgICtcbiAgICAgICAgICAgICAgYG1zZ0lkeD0ke21hdGNoZXNbcHRyXX0gY3VyVG9wPSR7Y3VyVG9wfSBvcmlnaW49JHtvcmlnaW59YCxcbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgICAgc2VhcmNoU3RhdGUuY3VycmVudCA9IHsgbWF0Y2hlcywgcHRyLCBzY3JlZW5PcmQ6IDAsIHByZWZpeFN1bSB9XG4gICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyB3YW50TGFzdD10cnVlOiBwcmV2aWV3IHRoZSBMQVNUIG9jY3VycmVuY2UgaW4gdGhlIG5lYXJlc3RcbiAgICAgICAgICAvLyBtZXNzYWdlLiBBdCBzdGlja3ktYm90dG9tIChjb21tb24gLyBlbnRyeSksIG5lYXJlc3QgaXMgdGhlXG4gICAgICAgICAgLy8gbGFzdCBtc2c7IGl0cyBsYXN0IG9jY3VycmVuY2UgaXMgY2xvc2VzdCB0byB3aGVyZSB0aGUgdXNlclxuICAgICAgICAgIC8vIHdhcyDigJQgbWluaW1hbCB2aWV3IG1vdmVtZW50LiBuIGFkdmFuY2VzIGZvcndhcmQgZnJvbSB0aGVyZS5cbiAgICAgICAgICBqdW1wKG1hdGNoZXNbcHRyXSEsIHRydWUpXG4gICAgICAgIH0gZWxzZSBpZiAoc2VhcmNoQW5jaG9yLmN1cnJlbnQgPj0gMCAmJiBzKSB7XG4gICAgICAgICAgLy8gL2Zvb2Ig4oaSIDAgbWF0Y2hlcyDihpIgc25hcCBiYWNrIHRvIGFuY2hvci4gbGVzcy92aW0gaW5jc2VhcmNoLlxuICAgICAgICAgIHMuc2Nyb2xsVG8oc2VhcmNoQW5jaG9yLmN1cnJlbnQpXG4gICAgICAgIH1cbiAgICAgICAgLy8gR2xvYmFsIG9jY3VycmVuY2UgY291bnQgKyAxLWJhc2VkIGN1cnJlbnQuIHdhbnRMYXN0PXRydWUgc28gdGhlXG4gICAgICAgIC8vIHNjYW4gd2lsbCBsYW5kIG9uIHRoZSBsYXN0IG9jY3VycmVuY2UgaW4gbWF0Y2hlc1twdHJdLiBQbGFjZWhvbGRlclxuICAgICAgICAvLyA9IHByZWZpeFN1bVtwdHIrMV0gKGNvdW50IHRocm91Z2ggdGhpcyBtc2cpLiBoaWdobGlnaHQoKSB1cGRhdGVzXG4gICAgICAgIC8vIHRvIHRoZSBleGFjdCB2YWx1ZSBhZnRlciBzY2FuIGNvbXBsZXRlcy5cbiAgICAgICAgb25TZWFyY2hNYXRjaGVzQ2hhbmdlPy4oXG4gICAgICAgICAgdG90YWwsXG4gICAgICAgICAgbWF0Y2hlcy5sZW5ndGggPiAwID8gKHByZWZpeFN1bVtwdHIgKyAxXSA/PyB0b3RhbCkgOiAwLFxuICAgICAgICApXG4gICAgICB9LFxuICAgICAgbmV4dE1hdGNoOiAoKSA9PiBzdGVwKDEpLFxuICAgICAgcHJldk1hdGNoOiAoKSA9PiBzdGVwKC0xKSxcbiAgICAgIHNldEFuY2hvcjogKCkgPT4ge1xuICAgICAgICBjb25zdCBzID0gc2Nyb2xsUmVmLmN1cnJlbnRcbiAgICAgICAgaWYgKHMpIHNlYXJjaEFuY2hvci5jdXJyZW50ID0gcy5nZXRTY3JvbGxUb3AoKVxuICAgICAgfSxcbiAgICAgIGRpc2FybVNlYXJjaDogKCkgPT4ge1xuICAgICAgICAvLyBNYW51YWwgc2Nyb2xsIGludmFsaWRhdGVzIHNjcmVlbi1hYnNvbHV0ZSBwb3NpdGlvbnMuXG4gICAgICAgIHNldFBvc2l0aW9ucz8uKG51bGwpXG4gICAgICAgIHNjYW5SZXF1ZXN0UmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICAgIGVsZW1lbnRQb3NpdGlvbnMuY3VycmVudCA9IHsgbXNnSWR4OiAtMSwgcG9zaXRpb25zOiBbXSB9XG4gICAgICAgIHN0YXJ0UHRyUmVmLmN1cnJlbnQgPSAtMVxuICAgICAgfSxcbiAgICAgIHdhcm1TZWFyY2hJbmRleDogYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoaW5kZXhXYXJtZWQuY3VycmVudCkgcmV0dXJuIDBcbiAgICAgICAgY29uc3QgbXNncyA9IGp1bXBTdGF0ZS5jdXJyZW50Lm1lc3NhZ2VzXG4gICAgICAgIGNvbnN0IENIVU5LID0gNTAwXG4gICAgICAgIGxldCB3b3JrTXMgPSAwXG4gICAgICAgIGNvbnN0IHdhbGxTdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkgKz0gQ0hVTkspIHtcbiAgICAgICAgICBhd2FpdCBzbGVlcCgwKVxuICAgICAgICAgIGNvbnN0IHQwID0gcGVyZm9ybWFuY2Uubm93KClcbiAgICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihpICsgQ0hVTkssIG1zZ3MubGVuZ3RoKVxuICAgICAgICAgIGZvciAobGV0IGogPSBpOyBqIDwgZW5kOyBqKyspIHtcbiAgICAgICAgICAgIGV4dHJhY3RTZWFyY2hUZXh0KG1zZ3Nbal0hKVxuICAgICAgICAgIH1cbiAgICAgICAgICB3b3JrTXMgKz0gcGVyZm9ybWFuY2Uubm93KCkgLSB0MFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdhbGxNcyA9IE1hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCkgLSB3YWxsU3RhcnQpXG4gICAgICAgIGxvZ0ZvckRlYnVnZ2luZyhcbiAgICAgICAgICBgd2FybVNlYXJjaEluZGV4OiAke21zZ3MubGVuZ3RofSBtc2dzIMK3IHdvcms9JHtNYXRoLnJvdW5kKHdvcmtNcyl9bXMgd2FsbD0ke3dhbGxNc31tcyBjaHVua3M9JHtNYXRoLmNlaWwobXNncy5sZW5ndGggLyBDSFVOSyl9YCxcbiAgICAgICAgKVxuICAgICAgICBpbmRleFdhcm1lZC5jdXJyZW50ID0gdHJ1ZVxuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh3b3JrTXMpXG4gICAgICB9LFxuICAgIH0pLFxuICAgIC8vIENsb3N1cmVzIG92ZXIgcmVmcyArIGNhbGxiYWNrcy4gc2Nyb2xsUmVmIHN0YWJsZTsgb3RoZXJzIGFyZVxuICAgIC8vIHVzZUNhbGxiYWNrKFtdKSBvciBwcm9wLWRyaWxsZWQgZnJvbSBSRVBMIChzdGFibGUpLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbc2Nyb2xsUmVmXSxcbiAgKVxuXG4gIC8vIFN0aWNreVRyYWNrZXIgZ29lcyBBRlRFUiB0aGUgbGlzdCBjb250ZW50LiBJdCByZXR1cm5zIG51bGwgKG5vIERPTSBub2RlKVxuICAvLyBzbyBvcmRlciBzaG91bGRuJ3QgbWF0dGVyIGZvciBsYXlvdXQg4oCUIGJ1dCBwdXR0aW5nIGl0IGZpcnN0IG1lYW5zIGV2ZXJ5XG4gIC8vIGZpbmUtZ3JhaW5lZCBjb21taXQgZnJvbSBpdHMgb3duIHNjcm9sbCBzdWJzY3JpcHRpb24gcmVjb25jaWxlcyBUSFJPVUdIXG4gIC8vIHRoZSBzaWJsaW5nIGl0ZW1zIChSZWFjdCB3YWxrcyBjaGlsZHJlbiBpbiBvcmRlcikuIEFmdGVyIHRoZSBpdGVtcywgaXQnc1xuICAvLyBhIGxlYWYgcmVjb25jaWxlLiBEZWZlbnNpdmU6IGFsc28gYXZvaWRzIGFueSBZb2dhIGNoaWxkLWluZGV4IHF1aXJrcyBpZlxuICAvLyB0aGUgSW5rIHJlY29uY2lsZXIgZXZlciBtYXRlcmlhbGl6ZXMgYSBwbGFjZWhvbGRlciBmb3IgbnVsbCByZXR1cm5zLlxuICBjb25zdCBbaG92ZXJlZEtleSwgc2V0SG92ZXJlZEtleV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuICAvLyBTdGFibGUgY2xpY2svaG92ZXIgaGFuZGxlcnMg4oCUIGNhbGxlZCB3aXRoIGssIGRpc3BhdGNoIGZyb20gYSByZWYgc29cbiAgLy8gY2xvc3VyZSBpZGVudGl0eSBkb2Vzbid0IGNoYW5nZSBwZXIgcmVuZGVyLiBUaGUgcGVyLWl0ZW0gaGFuZGxlclxuICAvLyBjbG9zdXJlcyAoYGUgPT4gLi4uYCwgYCgpID0+IHNldEhvdmVyZWRLZXkoaylgKSB3ZXJlIHRoZVxuICAvLyBgb3BlcmF0aW9uTmV3QXJyb3dGdW5jdGlvbmAgbGVhZnMgaW4gdGhlIHNjcm9sbCBDUFUgcHJvZmlsZTsgdGhlaXJcbiAgLy8gY2xlYW51cCB3YXMgMTYlIG9mIEdDIHRpbWUgKGBGdW5jdGlvbkV4ZWN1dGFibGU6OmZpbmFsaXplVW5jb25kaXRpb25hbGx5YCkuXG4gIC8vIEFsbG9jYXRpbmcgMyBjbG9zdXJlcyDDlyA2MCBtb3VudGVkIGl0ZW1zIMOXIDEwIGNvbW1pdHMvc2VjIGR1cmluZyBmYXN0XG4gIC8vIHNjcm9sbCA9IDE4MDAgc2hvcnQtbGl2ZWQgY2xvc3VyZXMvc2VjLiBXaXRoIHN0YWJsZSByZWZzIHRoZSBpdGVtXG4gIC8vIHdyYXBwZXIgcHJvcHMgZG9uJ3QgY2hhbmdlIOKGkiBWaXJ0dWFsSXRlbS5tZW1vIGJhaWxzIGZvciB0aGUgfjM1XG4gIC8vIHVuY2hhbmdlZCBpdGVtcywgb25seSB+MjUgZnJlc2ggaXRlbXMgcGF5IGNyZWF0ZUVsZW1lbnQgY29zdC5cbiAgY29uc3QgaGFuZGxlcnNSZWYgPSB1c2VSZWYoeyBvbkl0ZW1DbGljaywgc2V0SG92ZXJlZEtleSB9KVxuICBoYW5kbGVyc1JlZi5jdXJyZW50ID0geyBvbkl0ZW1DbGljaywgc2V0SG92ZXJlZEtleSB9XG4gIGNvbnN0IG9uQ2xpY2tLID0gdXNlQ2FsbGJhY2soXG4gICAgKG1zZzogUmVuZGVyYWJsZU1lc3NhZ2UsIGNlbGxJc0JsYW5rOiBib29sZWFuKSA9PiB7XG4gICAgICBjb25zdCBoID0gaGFuZGxlcnNSZWYuY3VycmVudFxuICAgICAgaWYgKCFjZWxsSXNCbGFuayAmJiBoLm9uSXRlbUNsaWNrKSBoLm9uSXRlbUNsaWNrKG1zZylcbiAgICB9LFxuICAgIFtdLFxuICApXG4gIGNvbnN0IG9uRW50ZXJLID0gdXNlQ2FsbGJhY2soKGs6IHN0cmluZykgPT4ge1xuICAgIGhhbmRsZXJzUmVmLmN1cnJlbnQuc2V0SG92ZXJlZEtleShrKVxuICB9LCBbXSlcbiAgY29uc3Qgb25MZWF2ZUsgPSB1c2VDYWxsYmFjaygoazogc3RyaW5nKSA9PiB7XG4gICAgaGFuZGxlcnNSZWYuY3VycmVudC5zZXRIb3ZlcmVkS2V5KHByZXYgPT4gKHByZXYgPT09IGsgPyBudWxsIDogcHJldikpXG4gIH0sIFtdKVxuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxCb3ggcmVmPXtzcGFjZXJSZWZ9IGhlaWdodD17dG9wU3BhY2VyfSBmbGV4U2hyaW5rPXswfSAvPlxuICAgICAge21lc3NhZ2VzLnNsaWNlKHN0YXJ0LCBlbmQpLm1hcCgobXNnLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHN0YXJ0ICsgaVxuICAgICAgICBjb25zdCBrID0ga2V5c1tpZHhdIVxuICAgICAgICBjb25zdCBjbGlja2FibGUgPSAhIW9uSXRlbUNsaWNrICYmIChpc0l0ZW1DbGlja2FibGU/Lihtc2cpID8/IHRydWUpXG4gICAgICAgIGNvbnN0IGhvdmVyZWQgPSBjbGlja2FibGUgJiYgaG92ZXJlZEtleSA9PT0ga1xuICAgICAgICBjb25zdCBleHBhbmRlZCA9IGlzSXRlbUV4cGFuZGVkPy4obXNnKVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxWaXJ0dWFsSXRlbVxuICAgICAgICAgICAga2V5PXtrfVxuICAgICAgICAgICAgaXRlbUtleT17a31cbiAgICAgICAgICAgIG1zZz17bXNnfVxuICAgICAgICAgICAgaWR4PXtpZHh9XG4gICAgICAgICAgICBtZWFzdXJlUmVmPXttZWFzdXJlUmVmfVxuICAgICAgICAgICAgZXhwYW5kZWQ9e2V4cGFuZGVkfVxuICAgICAgICAgICAgaG92ZXJlZD17aG92ZXJlZH1cbiAgICAgICAgICAgIGNsaWNrYWJsZT17Y2xpY2thYmxlfVxuICAgICAgICAgICAgb25DbGlja0s9e29uQ2xpY2tLfVxuICAgICAgICAgICAgb25FbnRlcks9e29uRW50ZXJLfVxuICAgICAgICAgICAgb25MZWF2ZUs9e29uTGVhdmVLfVxuICAgICAgICAgICAgcmVuZGVySXRlbT17cmVuZGVySXRlbX1cbiAgICAgICAgICAvPlxuICAgICAgICApXG4gICAgICB9KX1cbiAgICAgIHtib3R0b21TcGFjZXIgPiAwICYmIDxCb3ggaGVpZ2h0PXtib3R0b21TcGFjZXJ9IGZsZXhTaHJpbms9ezB9IC8+fVxuICAgICAge3RyYWNrU3RpY2t5UHJvbXB0ICYmIChcbiAgICAgICAgPFN0aWNreVRyYWNrZXJcbiAgICAgICAgICBtZXNzYWdlcz17bWVzc2FnZXN9XG4gICAgICAgICAgc3RhcnQ9e3N0YXJ0fVxuICAgICAgICAgIGVuZD17ZW5kfVxuICAgICAgICAgIG9mZnNldHM9e29mZnNldHN9XG4gICAgICAgICAgZ2V0SXRlbVRvcD17Z2V0SXRlbVRvcH1cbiAgICAgICAgICBnZXRJdGVtRWxlbWVudD17Z2V0SXRlbUVsZW1lbnR9XG4gICAgICAgICAgc2Nyb2xsUmVmPXtzY3JvbGxSZWZ9XG4gICAgICAgIC8+XG4gICAgICApfVxuICAgIDwvPlxuICApXG59XG5cbmNvbnN0IE5PT1BfVU5TVUIgPSAoKSA9PiB7fVxuXG4vKipcbiAqIEVmZmVjdC1vbmx5IGNoaWxkIHRoYXQgdHJhY2tzIHRoZSBsYXN0IHVzZXItcHJvbXB0IHNjcm9sbGVkIGFib3ZlIHRoZVxuICogdmlld3BvcnQgdG9wIGFuZCBmaXJlcyBvbkNoYW5nZSB3aGVuIGl0IGNoYW5nZXMuXG4gKlxuICogUmVuZGVyZWQgYXMgYSBzZXBhcmF0ZSBjb21wb25lbnQgKG5vdCBhIGhvb2sgaW4gVmlydHVhbE1lc3NhZ2VMaXN0KSBzbyBpdFxuICogY2FuIHN1YnNjcmliZSB0byBzY3JvbGwgYXQgRklORVIgZ3JhbnVsYXJpdHkgdGhhbiBTQ1JPTExfUVVBTlRVTT00MC4gVGhlXG4gKiBsaXN0IG5lZWRzIHRoZSBjb2Fyc2UgcXVhbnR1bSB0byBhdm9pZCBwZXItd2hlZWwtdGljayBZb2dhIHJlbGF5b3V0czsgdGhpc1xuICogdHJhY2tlciBpcyBqdXN0IGEgd2FsayArIGNvbXBhcmlzb24gYW5kIGNhbiBhZmZvcmQgdG8gcnVuIGV2ZXJ5IHRpY2suIFdoZW5cbiAqIGl0IHJlLXJlbmRlcnMgYWxvbmUsIHRoZSBsaXN0J3MgcmVjb25jaWxlZCBvdXRwdXQgaXMgdW5jaGFuZ2VkIChzYW1lIHByb3BzXG4gKiBmcm9tIHRoZSBwYXJlbnQncyBsYXN0IGNvbW1pdCkg4oCUIG5vIFlvZ2Egd29yay4gV2l0aG91dCB0aGlzIHNwbGl0LCB0aGVcbiAqIGhlYWRlciBsYWdzIGJ5IH5vbmUgY29udmVyc2F0aW9uIHR1cm4gKDQwIHJvd3Mg4omIIG9uZSBwcm9tcHQgKyByZXNwb25zZSkuXG4gKlxuICogZmlyc3RWaXNpYmxlIGRlcml2YXRpb246IGl0ZW0gQm94ZXMgYXJlIGRpcmVjdCBZb2dhIGNoaWxkcmVuIG9mIHRoZVxuICogU2Nyb2xsQm94IGNvbnRlbnQgd3JhcHBlciAoZnJhZ21lbnRzIGNvbGxhcHNlIGluIHRoZSBJbmsgRE9NKSwgc29cbiAqIHlvZ2EuZ2V0Q29tcHV0ZWRUb3AgaXMgY29udGVudC13cmFwcGVyLXJlbGF0aXZlIOKAlCBzYW1lIGNvb3JkaW5hdGUgc3BhY2UgYXNcbiAqIHNjcm9sbFRvcC4gQ29tcGFyZSBhZ2FpbnN0IHNjcm9sbFRvcCArIHBlbmRpbmdEZWx0YSAodGhlIHNjcm9sbCBUQVJHRVQg4oCUXG4gKiBzY3JvbGxCeSBvbmx5IHNldHMgcGVuZGluZ0RlbHRhLCBjb21taXR0ZWQgc2Nyb2xsVG9wIGxhZ3MpLiBXYWxrIGJhY2t3YXJkXG4gKiBmcm9tIHRoZSBtb3VudC1yYW5nZSBlbmQ7IGJyZWFrIHdoZW4gYW4gaXRlbSdzIHRvcCBpcyBhYm92ZSB0YXJnZXQuXG4gKi9cbmZ1bmN0aW9uIFN0aWNreVRyYWNrZXIoe1xuICBtZXNzYWdlcyxcbiAgc3RhcnQsXG4gIGVuZCxcbiAgb2Zmc2V0cyxcbiAgZ2V0SXRlbVRvcCxcbiAgZ2V0SXRlbUVsZW1lbnQsXG4gIHNjcm9sbFJlZixcbn06IHtcbiAgbWVzc2FnZXM6IFJlbmRlcmFibGVNZXNzYWdlW11cbiAgc3RhcnQ6IG51bWJlclxuICBlbmQ6IG51bWJlclxuICBvZmZzZXRzOiBBcnJheUxpa2U8bnVtYmVyPlxuICBnZXRJdGVtVG9wOiAoaW5kZXg6IG51bWJlcikgPT4gbnVtYmVyXG4gIGdldEl0ZW1FbGVtZW50OiAoaW5kZXg6IG51bWJlcikgPT4gRE9NRWxlbWVudCB8IG51bGxcbiAgc2Nyb2xsUmVmOiBSZWZPYmplY3Q8U2Nyb2xsQm94SGFuZGxlIHwgbnVsbD5cbn0pOiBudWxsIHtcbiAgY29uc3QgeyBzZXRTdGlja3lQcm9tcHQgfSA9IHVzZUNvbnRleHQoU2Nyb2xsQ2hyb21lQ29udGV4dClcbiAgLy8gRmluZS1ncmFpbmVkIHN1YnNjcmlwdGlvbiDigJQgc25hcHNob3QgaXMgdW5xdWFudGl6ZWQgc2Nyb2xsVG9wK2RlbHRhIHNvXG4gIC8vIGV2ZXJ5IHNjcm9sbCBhY3Rpb24gKHdoZWVsIHRpY2ssIFBnVXAsIGRyYWcpIHRyaWdnZXJzIGEgcmUtcmVuZGVyIG9mXG4gIC8vIFRISVMgY29tcG9uZW50IG9ubHkuIFN0aWNreSBiaXQgZm9sZGVkIGludG8gdGhlIHNpZ24gc28gc3RpY2t54oaSYnJva2VuXG4gIC8vIGFsc28gdHJpZ2dlcnMgKHNjcm9sbFRvQm90dG9tIHNldHMgc3RpY2t5IHdpdGhvdXQgbW92aW5nIHNjcm9sbFRvcCkuXG4gIGNvbnN0IHN1YnNjcmliZSA9IHVzZUNhbGxiYWNrKFxuICAgIChsaXN0ZW5lcjogKCkgPT4gdm9pZCkgPT5cbiAgICAgIHNjcm9sbFJlZi5jdXJyZW50Py5zdWJzY3JpYmUobGlzdGVuZXIpID8/IE5PT1BfVU5TVUIsXG4gICAgW3Njcm9sbFJlZl0sXG4gIClcbiAgdXNlU3luY0V4dGVybmFsU3RvcmUoc3Vic2NyaWJlLCAoKSA9PiB7XG4gICAgY29uc3QgcyA9IHNjcm9sbFJlZi5jdXJyZW50XG4gICAgaWYgKCFzKSByZXR1cm4gTmFOXG4gICAgY29uc3QgdCA9IHMuZ2V0U2Nyb2xsVG9wKCkgKyBzLmdldFBlbmRpbmdEZWx0YSgpXG4gICAgcmV0dXJuIHMuaXNTdGlja3koKSA/IC0xIC0gdCA6IHRcbiAgfSlcblxuICAvLyBSZWFkIGxpdmUgc2Nyb2xsIHN0YXRlIG9uIGV2ZXJ5IHJlbmRlci5cbiAgY29uc3QgaXNTdGlja3kgPSBzY3JvbGxSZWYuY3VycmVudD8uaXNTdGlja3koKSA/PyB0cnVlXG4gIGNvbnN0IHRhcmdldCA9IE1hdGgubWF4KFxuICAgIDAsXG4gICAgKHNjcm9sbFJlZi5jdXJyZW50Py5nZXRTY3JvbGxUb3AoKSA/PyAwKSArXG4gICAgICAoc2Nyb2xsUmVmLmN1cnJlbnQ/LmdldFBlbmRpbmdEZWx0YSgpID8/IDApLFxuICApXG5cbiAgLy8gV2FsayB0aGUgbW91bnRlZCByYW5nZSB0byBmaW5kIHRoZSBmaXJzdCBpdGVtIGF0LW9yLWJlbG93IHRoZSB2aWV3cG9ydFxuICAvLyB0b3AuIGByYW5nZWAgaXMgZnJvbSB0aGUgcGFyZW50J3MgY29hcnNlLXF1YW50dW0gcmVuZGVyIChtYXkgYmUgc2xpZ2h0bHlcbiAgLy8gc3RhbGUpIGJ1dCBvdmVyc2NhbiBndWFyYW50ZWVzIGl0IHNwYW5zIHdlbGwgcGFzdCB0aGUgdmlld3BvcnQgaW4gYm90aFxuICAvLyBkaXJlY3Rpb25zLiBJdGVtcyB3aXRob3V0IGEgWW9nYSBsYXlvdXQgeWV0IChuZXdseSBtb3VudGVkIHRoaXMgZnJhbWUpXG4gIC8vIGFyZSB0cmVhdGVkIGFzIGF0LW9yLWJlbG93IOKAlCB0aGV5J3JlIHNvbWV3aGVyZSBpbiB2aWV3LCBhbmQgYXNzdW1pbmdcbiAgLy8gb3RoZXJ3aXNlIHdvdWxkIHNob3cgYSBzdGlja3kgZm9yIGEgcHJvbXB0IHRoYXQncyBhY3R1YWxseSBvbiBzY3JlZW4uXG4gIGxldCBmaXJzdFZpc2libGUgPSBzdGFydFxuICBsZXQgZmlyc3RWaXNpYmxlVG9wID0gLTFcbiAgZm9yIChsZXQgaSA9IGVuZCAtIDE7IGkgPj0gc3RhcnQ7IGktLSkge1xuICAgIGNvbnN0IHRvcCA9IGdldEl0ZW1Ub3AoaSlcbiAgICBpZiAodG9wID49IDApIHtcbiAgICAgIGlmICh0b3AgPCB0YXJnZXQpIGJyZWFrXG4gICAgICBmaXJzdFZpc2libGVUb3AgPSB0b3BcbiAgICB9XG4gICAgZmlyc3RWaXNpYmxlID0gaVxuICB9XG5cbiAgbGV0IGlkeCA9IC0xXG4gIGxldCB0ZXh0OiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICBpZiAoZmlyc3RWaXNpYmxlID4gMCAmJiAhaXNTdGlja3kpIHtcbiAgICBmb3IgKGxldCBpID0gZmlyc3RWaXNpYmxlIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IHQgPSBzdGlja3lQcm9tcHRUZXh0KG1lc3NhZ2VzW2ldISlcbiAgICAgIGlmICh0ID09PSBudWxsKSBjb250aW51ZVxuICAgICAgLy8gVGhlIHByb21wdCdzIHdyYXBwaW5nIEJveCB0b3AgaXMgYWJvdmUgdGFyZ2V0ICh0aGF0J3Mgd2h5IGl0J3MgaW5cbiAgICAgIC8vIHRoZSBbMCwgZmlyc3RWaXNpYmxlKSByYW5nZSksIGJ1dCBpdHMg4p2vIGlzIGF0IHRvcCsxIChtYXJnaW5Ub3A9MSkuXG4gICAgICAvLyBJZiB0aGUg4p2vIGlzIGF0LW9yLWJlbG93IHRhcmdldCwgaXQncyBWSVNJQkxFIGF0IHZpZXdwb3J0IHRvcCDigJRcbiAgICAgIC8vIHNob3dpbmcgdGhlIHNhbWUgdGV4dCBpbiB0aGUgaGVhZGVyIHdvdWxkIGR1cGxpY2F0ZSBpdC4gSGFwcGVuc1xuICAgICAgLy8gaW4gdGhlIDEtcm93IGdhcCBiZXR3ZWVuIEJveCB0b3Agc2Nyb2xsaW5nIHBhc3QgYW5kIOKdryBzY3JvbGxpbmdcbiAgICAgIC8vIHBhc3QuIFNraXAgdG8gdGhlIG5leHQtb2xkZXIgcHJvbXB0IChpdHMg4p2vIGlzIGRlZmluaXRlbHkgYWJvdmUpLlxuICAgICAgY29uc3QgdG9wID0gZ2V0SXRlbVRvcChpKVxuICAgICAgaWYgKHRvcCA+PSAwICYmIHRvcCArIDEgPj0gdGFyZ2V0KSBjb250aW51ZVxuICAgICAgaWR4ID0gaVxuICAgICAgdGV4dCA9IHRcbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgY29uc3QgYmFzZU9mZnNldCA9XG4gICAgZmlyc3RWaXNpYmxlVG9wID49IDAgPyBmaXJzdFZpc2libGVUb3AgLSBvZmZzZXRzW2ZpcnN0VmlzaWJsZV0hIDogMFxuICBjb25zdCBlc3RpbWF0ZSA9IGlkeCA+PSAwID8gTWF0aC5tYXgoMCwgYmFzZU9mZnNldCArIG9mZnNldHNbaWR4XSEpIDogLTFcblxuICAvLyBGb3IgY2xpY2stanVtcHMgdG8gaXRlbXMgbm90IHlldCBtb3VudGVkICh1c2VyIHNjcm9sbGVkIGZhciBwYXN0LFxuICAvLyBwcm9tcHQgaXMgaW4gdGhlIHRvcFNwYWNlcikuIENsaWNrIGhhbmRsZXIgc2Nyb2xscyB0byB0aGUgZXN0aW1hdGVcbiAgLy8gdG8gbW91bnQgaXQ7IHRoaXMgYW5jaG9ycyBieSBlbGVtZW50IG9uY2UgaXQgYXBwZWFycy4gc2Nyb2xsVG9FbGVtZW50XG4gIC8vIGRlZmVycyB0aGUgWW9nYS1wb3NpdGlvbiByZWFkIHRvIHJlbmRlciB0aW1lIChyZW5kZXItbm9kZS10by1vdXRwdXRcbiAgLy8gcmVhZHMgZWwueW9nYU5vZGUuZ2V0Q29tcHV0ZWRUb3AoKSBpbiB0aGUgU0FNRSBjYWxjdWxhdGVMYXlvdXQgcGFzc1xuICAvLyB0aGF0IHByb2R1Y2VzIHNjcm9sbEhlaWdodCkg4oCUIG5vIHRocm90dGxlIHJhY2UuIENhcCByZXRyaWVzOiBhIC9jbGVhclxuICAvLyByYWNlIGNvdWxkIHVubW91bnQgdGhlIGl0ZW0gbWlkLXNlcXVlbmNlLlxuICBjb25zdCBwZW5kaW5nID0gdXNlUmVmKHsgaWR4OiAtMSwgdHJpZXM6IDAgfSlcbiAgLy8gU3VwcHJlc3Npb24gc3RhdGUgbWFjaGluZS4gVGhlIGNsaWNrIGhhbmRsZXIgYXJtczsgdGhlIG9uQ2hhbmdlIGVmZmVjdFxuICAvLyBjb25zdW1lcyAoYXJtZWTihpJmb3JjZSkgdGhlbiBmaXJlcy1hbmQtY2xlYXJzIG9uIHRoZSByZW5kZXIgQUZURVIgdGhhdFxuICAvLyAoZm9yY2XihpJub25lKS4gVGhlIGZvcmNlIHN0ZXAgcG9pc29ucyB0aGUgZGVkdXA6IGFmdGVyIGNsaWNrLCBpZHggb2Z0ZW5cbiAgLy8gcmVjb21wdXRlcyB0byB0aGUgU0FNRSBwcm9tcHQgKGl0cyB0b3AgaXMgc3RpbGwgYWJvdmUgdGFyZ2V0KSwgc29cbiAgLy8gd2l0aG91dCBmb3JjZSB0aGUgbGFzdC5pZHg9PT1pZHggZ3VhcmQgd291bGQgaG9sZCAnY2xpY2tlZCcgdW50aWwgdGhlXG4gIC8vIHVzZXIgY3Jvc3NlZCBhIHByb21wdCBib3VuZGFyeS4gUHJldmlvdXNseSBlbmNvZGVkIGluIGxhc3QuaWR4IGFzXG4gIC8vIC0xLy0yLy0zIHdoaWNoIG92ZXJsYXBwZWQgd2l0aCByZWFsIGluZGljZXMg4oCUIHRvbyBjbGV2ZXIuXG4gIHR5cGUgU3VwcHJlc3MgPSAnbm9uZScgfCAnYXJtZWQnIHwgJ2ZvcmNlJ1xuICBjb25zdCBzdXBwcmVzcyA9IHVzZVJlZjxTdXBwcmVzcz4oJ25vbmUnKVxuICAvLyBEZWR1cCBvbiBpZHggb25seSDigJQgZXN0aW1hdGUgZGVyaXZlcyBmcm9tIGZpcnN0VmlzaWJsZVRvcCB3aGljaCBzaGlmdHNcbiAgLy8gZXZlcnkgc2Nyb2xsIHRpY2ssIHNvIGluY2x1ZGluZyBpdCBpbiB0aGUga2V5IG1hZGUgdGhlIGd1YXJkIGRlYWRcbiAgLy8gKHNldFN0aWNreVByb21wdCBmaXJlZCBhIGZyZXNoIHt0ZXh0LHNjcm9sbFRvfSBwZXItZnJhbWUpLiBUaGUgc2Nyb2xsVG9cbiAgLy8gY2xvc3VyZSBzdGlsbCBjYXB0dXJlcyB0aGUgY3VycmVudCBlc3RpbWF0ZTsgaXQganVzdCBkb2Vzbid0IG5lZWQgdG9cbiAgLy8gcmUtZmlyZSB3aGVuIG9ubHkgZXN0aW1hdGUgbW92ZWQuXG4gIGNvbnN0IGxhc3RJZHggPSB1c2VSZWYoLTEpXG5cbiAgLy8gc2V0U3RpY2t5UHJvbXB0IGVmZmVjdCBGSVJTVCDigJQgbXVzdCBzZWUgcGVuZGluZy5pZHggYmVmb3JlIHRoZVxuICAvLyBjb3JyZWN0aW9uIGVmZmVjdCBiZWxvdyBjbGVhcnMgaXQuIE9uIHRoZSBlc3RpbWF0ZS1mYWxsYmFjayBwYXRoLCB0aGVcbiAgLy8gcmVuZGVyIHRoYXQgbW91bnRzIHRoZSBpdGVtIGlzIEFMU08gdGhlIHJlbmRlciB3aGVyZSBjb3JyZWN0aW9uIGNsZWFyc1xuICAvLyBwZW5kaW5nOyBpZiB0aGlzIHJhbiBzZWNvbmQsIHRoZSBwZW5kaW5nIGdhdGUgd291bGQgYmUgZGVhZCBhbmRcbiAgLy8gc2V0U3RpY2t5UHJvbXB0KHByZXZQcm9tcHQpIHdvdWxkIGZpcmUgbWlkLWp1bXAsIHJlLW1vdW50aW5nIHRoZVxuICAvLyBoZWFkZXIgb3ZlciAnY2xpY2tlZCcuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gSG9sZCB3aGlsZSB0d28tcGhhc2UgY29ycmVjdGlvbiBpcyBpbiBmbGlnaHQuXG4gICAgaWYgKHBlbmRpbmcuY3VycmVudC5pZHggPj0gMCkgcmV0dXJuXG4gICAgaWYgKHN1cHByZXNzLmN1cnJlbnQgPT09ICdhcm1lZCcpIHtcbiAgICAgIHN1cHByZXNzLmN1cnJlbnQgPSAnZm9yY2UnXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgZm9yY2UgPSBzdXBwcmVzcy5jdXJyZW50ID09PSAnZm9yY2UnXG4gICAgc3VwcHJlc3MuY3VycmVudCA9ICdub25lJ1xuICAgIGlmICghZm9yY2UgJiYgbGFzdElkeC5jdXJyZW50ID09PSBpZHgpIHJldHVyblxuICAgIGxhc3RJZHguY3VycmVudCA9IGlkeFxuICAgIGlmICh0ZXh0ID09PSBudWxsKSB7XG4gICAgICBzZXRTdGlja3lQcm9tcHQobnVsbClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICAvLyBGaXJzdCBwYXJhZ3JhcGggb25seSAoc3BsaXQgb24gYmxhbmsgbGluZSkg4oCUIGEgcHJvbXB0IGxpa2VcbiAgICAvLyBcInN0aWxsIHNlZWluZyBidWdzOlxcblxcbjEuIGZvb1xcbjIuIGJhclwiIHByZXZpZXdzIGFzIGp1c3QgdGhlXG4gICAgLy8gbGVhZC1pbi4gdHJpbVN0YXJ0IHNvIGEgbGVhZGluZyBibGFuayBsaW5lIChxdWV1ZWRfY29tbWFuZCBtaWQtXG4gICAgLy8gdHVybiBtZXNzYWdlcyBzb21ldGltZXMgaGF2ZSBvbmUpIGRvZXNuJ3QgZmluZCBwYXJhRW5kIGF0IDAuXG4gICAgY29uc3QgdHJpbW1lZCA9IHRleHQudHJpbVN0YXJ0KClcbiAgICBjb25zdCBwYXJhRW5kID0gdHJpbW1lZC5zZWFyY2goL1xcblxccypcXG4vKVxuICAgIGNvbnN0IGNvbGxhcHNlZCA9IChwYXJhRW5kID49IDAgPyB0cmltbWVkLnNsaWNlKDAsIHBhcmFFbmQpIDogdHJpbW1lZClcbiAgICAgIC5zbGljZSgwLCBTVElDS1lfVEVYVF9DQVApXG4gICAgICAucmVwbGFjZSgvXFxzKy9nLCAnICcpXG4gICAgICAudHJpbSgpXG4gICAgaWYgKGNvbGxhcHNlZCA9PT0gJycpIHtcbiAgICAgIHNldFN0aWNreVByb21wdChudWxsKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGNhcHR1cmVkSWR4ID0gaWR4XG4gICAgY29uc3QgY2FwdHVyZWRFc3RpbWF0ZSA9IGVzdGltYXRlXG4gICAgc2V0U3RpY2t5UHJvbXB0KHtcbiAgICAgIHRleHQ6IGNvbGxhcHNlZCxcbiAgICAgIHNjcm9sbFRvOiAoKSA9PiB7XG4gICAgICAgIC8vIEhpZGUgaGVhZGVyLCBrZWVwIHBhZGRpbmcgY29sbGFwc2VkIOKAlCBGdWxsc2NyZWVuTGF5b3V0J3NcbiAgICAgICAgLy8gJ2NsaWNrZWQnIHNlbnRpbmVsIOKGkiBzY3JvbGxCb3hfeT0wICsgcGFkPTAg4oaSIHZpZXdwb3J0VG9wPTAuXG4gICAgICAgIHNldFN0aWNreVByb21wdCgnY2xpY2tlZCcpXG4gICAgICAgIHN1cHByZXNzLmN1cnJlbnQgPSAnYXJtZWQnXG4gICAgICAgIC8vIHNjcm9sbFRvRWxlbWVudCBhbmNob3JzIGJ5IERPTUVsZW1lbnQgcmVmLCBub3QgYSBudW1iZXI6XG4gICAgICAgIC8vIHJlbmRlci1ub2RlLXRvLW91dHB1dCByZWFkcyBlbC55b2dhTm9kZS5nZXRDb21wdXRlZFRvcCgpIGF0XG4gICAgICAgIC8vIHBhaW50IHRpbWUgKHNhbWUgWW9nYSBwYXNzIGFzIHNjcm9sbEhlaWdodCkuIE5vIHN0YWxlbmVzcyBmcm9tXG4gICAgICAgIC8vIHRoZSB0aHJvdHRsZWQgcmVuZGVyIOKAlCB0aGUgcmVmIGlzIHN0YWJsZSwgdGhlIHBvc2l0aW9uIHJlYWQgaXNcbiAgICAgICAgLy8gZGVmZXJyZWQuIG9mZnNldD0xID0gVXNlclByb21wdE1lc3NhZ2UgbWFyZ2luVG9wLlxuICAgICAgICBjb25zdCBlbCA9IGdldEl0ZW1FbGVtZW50KGNhcHR1cmVkSWR4KVxuICAgICAgICBpZiAoZWwpIHtcbiAgICAgICAgICBzY3JvbGxSZWYuY3VycmVudD8uc2Nyb2xsVG9FbGVtZW50KGVsLCAxKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vdCBtb3VudGVkIChzY3JvbGxlZCBmYXIgcGFzdCDigJQgaW4gdG9wU3BhY2VyKS4gSnVtcCB0b1xuICAgICAgICAgIC8vIGVzdGltYXRlIHRvIG1vdW50IGl0OyBjb3JyZWN0aW9uIGVmZmVjdCByZS1hbmNob3JzIG9uY2UgaXRcbiAgICAgICAgICAvLyBhcHBlYXJzLiBFc3RpbWF0ZSBpcyBERUZBVUxUX0VTVElNQVRFLWJhc2VkIOKAlCBsYW5kcyBzaG9ydC5cbiAgICAgICAgICBzY3JvbGxSZWYuY3VycmVudD8uc2Nyb2xsVG8oY2FwdHVyZWRFc3RpbWF0ZSlcbiAgICAgICAgICBwZW5kaW5nLmN1cnJlbnQgPSB7IGlkeDogY2FwdHVyZWRJZHgsIHRyaWVzOiAwIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KVxuICAgIC8vIE5vIGRlcHMg4oCUIG11c3QgcnVuIGV2ZXJ5IHJlbmRlci4gU3VwcHJlc3Npb24gc3RhdGUgbGl2ZXMgaW4gYSByZWZcbiAgICAvLyAobm90IGlkeC9lc3RpbWF0ZSksIHNvIGEgZGVwcy1nYXRlZCBlZmZlY3Qgd291bGQgbmV2ZXIgc2VlIGl0IHRpY2suXG4gICAgLy8gQm9keSdzIG93biBndWFyZHMgc2hvcnQtY2lyY3VpdCB3aGVuIG5vdGhpbmcgY2hhbmdlZC5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0pXG5cbiAgLy8gQ29ycmVjdGlvbjogZm9yIGNsaWNrLWp1bXBzIHRvIHVubW91bnRlZCBpdGVtcy4gQ2xpY2sgaGFuZGxlciBzY3JvbGxlZFxuICAvLyB0byB0aGUgZXN0aW1hdGU7IHRoaXMgcmUtYW5jaG9ycyBieSBlbGVtZW50IG9uY2UgdGhlIGl0ZW0gYXBwZWFycy5cbiAgLy8gc2Nyb2xsVG9FbGVtZW50IGRlZmVycyB0aGUgWW9nYSByZWFkIHRvIHBhaW50IHRpbWUg4oCUIGRldGVybWluaXN0aWMuXG4gIC8vIFNFQ09ORCBzbyBpdCBjbGVhcnMgcGVuZGluZyBBRlRFUiB0aGUgb25DaGFuZ2UgZ2F0ZSBhYm92ZSBoYXMgc2VlbiBpdC5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAocGVuZGluZy5jdXJyZW50LmlkeCA8IDApIHJldHVyblxuICAgIGNvbnN0IGVsID0gZ2V0SXRlbUVsZW1lbnQocGVuZGluZy5jdXJyZW50LmlkeClcbiAgICBpZiAoZWwpIHtcbiAgICAgIHNjcm9sbFJlZi5jdXJyZW50Py5zY3JvbGxUb0VsZW1lbnQoZWwsIDEpXG4gICAgICBwZW5kaW5nLmN1cnJlbnQgPSB7IGlkeDogLTEsIHRyaWVzOiAwIH1cbiAgICB9IGVsc2UgaWYgKCsrcGVuZGluZy5jdXJyZW50LnRyaWVzID4gNSkge1xuICAgICAgcGVuZGluZy5jdXJyZW50ID0geyBpZHg6IC0xLCB0cmllczogMCB9XG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBudWxsXG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQSxjQUFjQSxTQUFTLFFBQVEsT0FBTztBQUN0QyxPQUFPLEtBQUtDLEtB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