mumucc 0.4.2 → 0.4.3

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 (645) hide show
  1. package/AGENTS.md +297 -0
  2. package/bin/mumucc +3 -8
  3. package/bun.lock +44 -141
  4. package/defaults/mcp-servers.json +0 -6
  5. package/package.json +3 -3
  6. package/shims/bun-bundle.ts +0 -3
  7. package/shims/globals.d.ts +15 -0
  8. package/shims/globals.ts +1 -1
  9. package/src/QueryEngine.ts +1 -0
  10. package/src/assistant/gate.ts +4 -1
  11. package/src/assistant/index.ts +29 -1
  12. package/src/assistant/sessionDiscovery.ts +10 -1
  13. package/src/bootstrap/state.ts +6 -1
  14. package/src/buddy/CompanionSprite.tsx +1 -0
  15. package/src/buddy/observer.ts +6 -0
  16. package/src/buddy/useBuddyNotification.tsx +1 -0
  17. package/src/cli/handlers/util.tsx +1 -0
  18. package/src/cli/print.ts +4 -1
  19. package/src/cli/structuredIO.ts +6 -1
  20. package/src/commands/add-dir/add-dir.tsx +1 -0
  21. package/src/commands/branch/branch.ts +1 -0
  22. package/src/commands/bridge/bridge.tsx +2 -1
  23. package/src/commands/btw/btw.tsx +1 -0
  24. package/src/commands/buddy/index.ts +2 -1
  25. package/src/commands/chrome/chrome.tsx +1 -0
  26. package/src/commands/clear/caches.ts +1 -0
  27. package/src/commands/compact/compact.ts +1 -0
  28. package/src/commands/context/context-noninteractive.ts +1 -0
  29. package/src/commands/context/context.tsx +1 -0
  30. package/src/commands/copy/copy.tsx +2 -1
  31. package/src/commands/effort/effort.tsx +1 -0
  32. package/src/commands/extra-usage/extra-usage.tsx +1 -0
  33. package/src/commands/fast/fast.tsx +1 -0
  34. package/src/commands/fork/index.ts +2 -1
  35. package/src/commands/ide/ide.tsx +2 -1
  36. package/src/commands/insights.ts +1 -0
  37. package/src/commands/install-github-app/ApiKeyStep.tsx +1 -0
  38. package/src/commands/install-github-app/CheckExistingSecretStep.tsx +1 -0
  39. package/src/commands/install-github-app/ChooseRepoStep.tsx +1 -0
  40. package/src/commands/install-github-app/CreatingStep.tsx +1 -0
  41. package/src/commands/install-github-app/ErrorStep.tsx +1 -0
  42. package/src/commands/install-github-app/ExistingWorkflowStep.tsx +1 -0
  43. package/src/commands/install-github-app/InstallAppStep.tsx +1 -0
  44. package/src/commands/install-github-app/OAuthFlowStep.tsx +1 -0
  45. package/src/commands/install-github-app/SuccessStep.tsx +1 -0
  46. package/src/commands/install-github-app/WarningsStep.tsx +1 -0
  47. package/src/commands/install-github-app/install-github-app.tsx +2 -1
  48. package/src/commands/install.tsx +1 -0
  49. package/src/commands/login/CodexLogin.tsx +39 -12
  50. package/src/commands/login/CustomProviderLogin.tsx +45 -9
  51. package/src/commands/login/ThirdPartyLogin.tsx +24 -6
  52. package/src/commands/login/login.tsx +37 -10
  53. package/src/commands/login/profileDefaults.ts +25 -0
  54. package/src/commands/mcp/mcp.tsx +1 -0
  55. package/src/commands/mobile/mobile.tsx +1 -0
  56. package/src/commands/model/model.tsx +14 -3
  57. package/src/commands/peers/index.ts +2 -1
  58. package/src/commands/permissions/permissions.tsx +1 -0
  59. package/src/commands/plan/plan.tsx +1 -0
  60. package/src/commands/plugin/DiscoverPlugins.tsx +1 -0
  61. package/src/commands/plugin/ManageMarketplaces.tsx +1 -0
  62. package/src/commands/plugin/ManagePlugins.tsx +1 -0
  63. package/src/commands/plugin/PluginOptionsDialog.tsx +1 -0
  64. package/src/commands/plugin/PluginSettings.tsx +2 -1
  65. package/src/commands/plugin/UnifiedInstalledCell.tsx +1 -0
  66. package/src/commands/plugin/ValidatePlugin.tsx +1 -0
  67. package/src/commands/plugin/pluginDetailsHelpers.tsx +1 -0
  68. package/src/commands/rate-limit-options/rate-limit-options.tsx +1 -0
  69. package/src/commands/remote-setup/remote-setup.tsx +1 -0
  70. package/src/commands/resume/resume.tsx +1 -0
  71. package/src/commands/review/UltrareviewOverageDialog.tsx +1 -0
  72. package/src/commands/review/ultrareviewCommand.tsx +1 -0
  73. package/src/commands/session/session.tsx +1 -0
  74. package/src/commands/tag/tag.tsx +1 -0
  75. package/src/commands/terminalSetup/terminalSetup.tsx +1 -0
  76. package/src/commands/theme/theme.tsx +1 -0
  77. package/src/commands/thinkback/thinkback.tsx +2 -1
  78. package/src/commands/ultraplan.tsx +11 -1
  79. package/src/commands/upgrade/upgrade.tsx +1 -0
  80. package/src/commands/workflows/index.ts +2 -1
  81. package/src/components/AgentProgressLine.tsx +1 -0
  82. package/src/components/App.tsx +1 -0
  83. package/src/components/ApproveApiKey.tsx +1 -0
  84. package/src/components/AutoModeOptInDialog.tsx +1 -0
  85. package/src/components/AutoUpdater.tsx +1 -0
  86. package/src/components/AutoUpdaterWrapper.tsx +1 -0
  87. package/src/components/AwsAuthStatusBox.tsx +1 -0
  88. package/src/components/BaseTextInput.tsx +1 -0
  89. package/src/components/BashModeProgress.tsx +1 -0
  90. package/src/components/BridgeDialog.tsx +2 -1
  91. package/src/components/BypassPermissionsModeDialog.tsx +1 -0
  92. package/src/components/ChannelDowngradeDialog.tsx +1 -0
  93. package/src/components/ClaudeInChromeOnboarding.tsx +1 -0
  94. package/src/components/ClaudeMdExternalIncludesDialog.tsx +1 -0
  95. package/src/components/ClickableImageRef.tsx +1 -0
  96. package/src/components/CompactSummary.tsx +1 -0
  97. package/src/components/ConfigurableShortcutHint.tsx +1 -0
  98. package/src/components/ConsoleOAuthFlow.tsx +1 -0
  99. package/src/components/ContextSuggestions.tsx +1 -0
  100. package/src/components/ContextVisualization.tsx +2 -1
  101. package/src/components/CoordinatorAgentStatus.tsx +3 -4
  102. package/src/components/CostThresholdDialog.tsx +1 -0
  103. package/src/components/CtrlOToExpand.tsx +1 -0
  104. package/src/components/CustomSelect/SelectMulti.tsx +1 -0
  105. package/src/components/CustomSelect/select-input-option.tsx +1 -0
  106. package/src/components/CustomSelect/select-option.tsx +1 -0
  107. package/src/components/CustomSelect/select.tsx +2 -1
  108. package/src/components/CustomSelect/use-multi-select-state.ts +1 -0
  109. package/src/components/DesktopHandoff.tsx +1 -0
  110. package/src/components/DesktopUpsell/DesktopUpsellStartup.tsx +1 -0
  111. package/src/components/DevBar.tsx +1 -0
  112. package/src/components/DevChannelsDialog.tsx +1 -0
  113. package/src/components/DiagnosticsDisplay.tsx +1 -0
  114. package/src/components/EffortCallout.tsx +1 -0
  115. package/src/components/ExitFlow.tsx +1 -0
  116. package/src/components/FallbackToolUseErrorMessage.tsx +1 -0
  117. package/src/components/FastIcon.tsx +1 -0
  118. package/src/components/Feedback.tsx +1 -0
  119. package/src/components/FeedbackSurvey/FeedbackSurvey.tsx +1 -0
  120. package/src/components/FeedbackSurvey/FeedbackSurveyView.tsx +1 -0
  121. package/src/components/FeedbackSurvey/TranscriptSharePrompt.tsx +1 -0
  122. package/src/components/FeedbackSurvey/useFrustrationDetection.ts +6 -1
  123. package/src/components/FeedbackSurvey/useMemorySurvey.tsx +1 -0
  124. package/src/components/FeedbackSurvey/usePostCompactSurvey.tsx +2 -1
  125. package/src/components/FileEditToolDiff.tsx +1 -0
  126. package/src/components/FileEditToolUpdatedMessage.tsx +1 -0
  127. package/src/components/FileEditToolUseRejectedMessage.tsx +1 -0
  128. package/src/components/FilePathLink.tsx +1 -0
  129. package/src/components/FullscreenLayout.tsx +1 -0
  130. package/src/components/GlobalSearchDialog.tsx +2 -1
  131. package/src/components/HelpV2/Commands.tsx +1 -0
  132. package/src/components/HelpV2/HelpV2.tsx +1 -0
  133. package/src/components/HighlightedCode/Fallback.tsx +1 -0
  134. package/src/components/HighlightedCode.tsx +1 -0
  135. package/src/components/HistorySearchDialog.tsx +1 -0
  136. package/src/components/IdeAutoConnectDialog.tsx +1 -0
  137. package/src/components/IdeOnboardingDialog.tsx +1 -0
  138. package/src/components/IdeStatusIndicator.tsx +1 -0
  139. package/src/components/IdleReturnDialog.tsx +1 -0
  140. package/src/components/InvalidConfigDialog.tsx +1 -0
  141. package/src/components/InvalidSettingsDialog.tsx +1 -0
  142. package/src/components/KeybindingWarnings.tsx +1 -0
  143. package/src/components/LanguagePicker.tsx +1 -0
  144. package/src/components/LogSelector.tsx +2 -1
  145. package/src/components/LogoV2/ChannelsNotice.tsx +6 -5
  146. package/src/components/LogoV2/Clawd.tsx +1 -0
  147. package/src/components/LogoV2/CondensedLogo.tsx +1 -0
  148. package/src/components/LogoV2/Feed.tsx +1 -0
  149. package/src/components/LogoV2/FeedColumn.tsx +1 -0
  150. package/src/components/LogoV2/LogoV2.tsx +2 -1
  151. package/src/components/LogoV2/OverageCreditUpsell.tsx +1 -0
  152. package/src/components/LogoV2/WelcomeV2.tsx +1 -0
  153. package/src/components/LogoV2/feedConfigs.tsx +1 -0
  154. package/src/components/MCPServerApprovalDialog.tsx +1 -0
  155. package/src/components/MCPServerDesktopImportDialog.tsx +1 -0
  156. package/src/components/MCPServerMultiselectDialog.tsx +1 -0
  157. package/src/components/ManagedSettingsSecurityDialog/ManagedSettingsSecurityDialog.tsx +1 -0
  158. package/src/components/Markdown.tsx +1 -0
  159. package/src/components/MemoryUsageIndicator.tsx +1 -0
  160. package/src/components/Message.tsx +2 -1
  161. package/src/components/MessageModel.tsx +1 -0
  162. package/src/components/MessageResponse.tsx +1 -0
  163. package/src/components/MessageRow.tsx +1 -0
  164. package/src/components/MessageSelector.tsx +2 -1
  165. package/src/components/MessageTimestamp.tsx +1 -0
  166. package/src/components/Messages.tsx +1 -0
  167. package/src/components/ModelPicker.tsx +4 -3
  168. package/src/components/NativeAutoUpdater.tsx +1 -0
  169. package/src/components/NotebookEditToolUseRejectedMessage.tsx +1 -0
  170. package/src/components/Onboarding.tsx +1 -0
  171. package/src/components/OutputStylePicker.tsx +1 -0
  172. package/src/components/PackageManagerAutoUpdater.tsx +1 -0
  173. package/src/components/PrBadge.tsx +1 -0
  174. package/src/components/PromptInput/HistorySearchInput.tsx +1 -0
  175. package/src/components/PromptInput/Notifications.tsx +1 -0
  176. package/src/components/PromptInput/PromptInput.tsx +10 -8
  177. package/src/components/PromptInput/PromptInputFooter.tsx +1 -0
  178. package/src/components/PromptInput/PromptInputFooterLeftSide.tsx +1 -0
  179. package/src/components/PromptInput/PromptInputFooterSuggestions.tsx +1 -0
  180. package/src/components/PromptInput/PromptInputHelpMenu.tsx +1 -0
  181. package/src/components/PromptInput/PromptInputModeIndicator.tsx +1 -0
  182. package/src/components/PromptInput/PromptInputStashNotice.tsx +1 -0
  183. package/src/components/PromptInput/SandboxPromptFooterHint.tsx +1 -0
  184. package/src/components/PromptInput/ShimmeredInput.tsx +1 -0
  185. package/src/components/PromptInput/VoiceIndicator.tsx +1 -0
  186. package/src/components/QuickOpenDialog.tsx +2 -1
  187. package/src/components/RemoteEnvironmentDialog.tsx +2 -1
  188. package/src/components/ResumeTask.tsx +1 -0
  189. package/src/components/SandboxViolationExpandedView.tsx +1 -0
  190. package/src/components/SearchBox.tsx +1 -0
  191. package/src/components/SessionBackgroundHint.tsx +1 -0
  192. package/src/components/SessionPreview.tsx +1 -0
  193. package/src/components/Settings/Config.tsx +1 -0
  194. package/src/components/Settings/Settings.tsx +1 -0
  195. package/src/components/Settings/Status.tsx +2 -1
  196. package/src/components/Settings/Usage.tsx +1 -0
  197. package/src/components/ShowInIDEPrompt.tsx +1 -0
  198. package/src/components/SkillImprovementSurvey.tsx +1 -0
  199. package/src/components/Spinner/FlashingChar.tsx +1 -0
  200. package/src/components/Spinner/GlimmerMessage.tsx +1 -0
  201. package/src/components/Spinner/ShimmerChar.tsx +1 -0
  202. package/src/components/Spinner/SpinnerAnimationRow.tsx +1 -0
  203. package/src/components/Spinner/SpinnerGlyph.tsx +1 -0
  204. package/src/components/Spinner/TeammateSpinnerTree.tsx +1 -0
  205. package/src/components/Spinner/utils.ts +1 -0
  206. package/src/components/Spinner.tsx +2 -1
  207. package/src/components/Stats.tsx +2 -1
  208. package/src/components/StatusNotices.tsx +1 -0
  209. package/src/components/StructuredDiff/Fallback.tsx +1 -0
  210. package/src/components/StructuredDiff.tsx +2 -1
  211. package/src/components/StructuredDiffList.tsx +1 -0
  212. package/src/components/TaskListV2.tsx +1 -0
  213. package/src/components/TeammateViewHeader.tsx +1 -0
  214. package/src/components/TeleportError.tsx +1 -0
  215. package/src/components/TeleportProgress.tsx +1 -0
  216. package/src/components/TeleportRepoMismatchDialog.tsx +1 -0
  217. package/src/components/TeleportResumeWrapper.tsx +1 -0
  218. package/src/components/TextInput.tsx +1 -0
  219. package/src/components/ThemePicker.tsx +1 -0
  220. package/src/components/ThinkingToggle.tsx +1 -0
  221. package/src/components/TokenWarning.tsx +1 -0
  222. package/src/components/ToolUseLoader.tsx +1 -0
  223. package/src/components/TrustDialog/TrustDialog.tsx +1 -0
  224. package/src/components/ValidationErrorsList.tsx +1 -0
  225. package/src/components/VimTextInput.tsx +1 -0
  226. package/src/components/VirtualMessageList.tsx +1 -0
  227. package/src/components/WorkflowMultiselectDialog.tsx +1 -0
  228. package/src/components/agents/AgentDetail.tsx +1 -0
  229. package/src/components/agents/AgentEditor.tsx +1 -0
  230. package/src/components/agents/AgentNavigationFooter.tsx +1 -0
  231. package/src/components/agents/AgentsList.tsx +2 -1
  232. package/src/components/agents/AgentsMenu.tsx +2 -1
  233. package/src/components/agents/ColorPicker.tsx +1 -0
  234. package/src/components/agents/ModelSelector.tsx +1 -0
  235. package/src/components/agents/ToolSelector.tsx +2 -1
  236. package/src/components/agents/generateAgent.ts +1 -0
  237. package/src/components/agents/new-agent-creation/CreateAgentWizard.tsx +1 -0
  238. package/src/components/agents/new-agent-creation/wizard-steps/ColorStep.tsx +1 -0
  239. package/src/components/agents/new-agent-creation/wizard-steps/ConfirmStep.tsx +1 -0
  240. package/src/components/agents/new-agent-creation/wizard-steps/DescriptionStep.tsx +1 -0
  241. package/src/components/agents/new-agent-creation/wizard-steps/LocationStep.tsx +1 -0
  242. package/src/components/agents/new-agent-creation/wizard-steps/MemoryStep.tsx +1 -0
  243. package/src/components/agents/new-agent-creation/wizard-steps/MethodStep.tsx +1 -0
  244. package/src/components/agents/new-agent-creation/wizard-steps/ModelStep.tsx +1 -0
  245. package/src/components/agents/new-agent-creation/wizard-steps/PromptStep.tsx +1 -0
  246. package/src/components/agents/new-agent-creation/wizard-steps/ToolsStep.tsx +1 -0
  247. package/src/components/agents/new-agent-creation/wizard-steps/TypeStep.tsx +1 -0
  248. package/src/components/design-system/Byline.tsx +1 -0
  249. package/src/components/design-system/Dialog.tsx +1 -0
  250. package/src/components/design-system/Divider.tsx +1 -0
  251. package/src/components/design-system/FuzzyPicker.tsx +1 -0
  252. package/src/components/design-system/KeyboardShortcutHint.tsx +1 -0
  253. package/src/components/design-system/ListItem.tsx +1 -0
  254. package/src/components/design-system/LoadingState.tsx +1 -0
  255. package/src/components/design-system/Pane.tsx +1 -0
  256. package/src/components/design-system/ProgressBar.tsx +1 -0
  257. package/src/components/design-system/Ratchet.tsx +1 -0
  258. package/src/components/design-system/StatusIcon.tsx +1 -0
  259. package/src/components/design-system/Tabs.tsx +2 -1
  260. package/src/components/design-system/ThemeProvider.tsx +1 -0
  261. package/src/components/design-system/ThemedBox.tsx +1 -0
  262. package/src/components/design-system/ThemedText.tsx +1 -0
  263. package/src/components/diff/DiffDetailView.tsx +1 -0
  264. package/src/components/diff/DiffDialog.tsx +1 -0
  265. package/src/components/diff/DiffFileList.tsx +1 -0
  266. package/src/components/grove/Grove.tsx +2 -1
  267. package/src/components/hooks/HooksConfigMenu.tsx +2 -1
  268. package/src/components/hooks/PromptDialog.tsx +1 -0
  269. package/src/components/hooks/SelectEventMode.tsx +1 -0
  270. package/src/components/hooks/SelectHookMode.tsx +1 -0
  271. package/src/components/hooks/SelectMatcherMode.tsx +1 -0
  272. package/src/components/hooks/ViewHookMode.tsx +1 -0
  273. package/src/components/mcp/CapabilitiesSection.tsx +1 -0
  274. package/src/components/mcp/ElicitationDialog.tsx +1 -0
  275. package/src/components/mcp/MCPAgentServerMenu.tsx +1 -0
  276. package/src/components/mcp/MCPListPanel.tsx +2 -1
  277. package/src/components/mcp/MCPReconnect.tsx +1 -0
  278. package/src/components/mcp/MCPRemoteServerMenu.tsx +1 -0
  279. package/src/components/mcp/MCPSettings.tsx +2 -1
  280. package/src/components/mcp/MCPStdioServerMenu.tsx +1 -0
  281. package/src/components/mcp/MCPToolDetailView.tsx +1 -0
  282. package/src/components/mcp/MCPToolListView.tsx +1 -0
  283. package/src/components/mcp/McpParsingWarnings.tsx +1 -0
  284. package/src/components/memory/MemoryFileSelector.tsx +2 -1
  285. package/src/components/memory/MemoryUpdateNotification.tsx +1 -0
  286. package/src/components/messageActions.tsx +1 -0
  287. package/src/components/messages/AdvisorMessage.tsx +1 -0
  288. package/src/components/messages/AssistantRedactedThinkingMessage.tsx +1 -0
  289. package/src/components/messages/AssistantTextMessage.tsx +1 -0
  290. package/src/components/messages/AssistantThinkingMessage.tsx +1 -0
  291. package/src/components/messages/AssistantToolUseMessage.tsx +1 -0
  292. package/src/components/messages/AttachmentMessage.tsx +2 -1
  293. package/src/components/messages/CollapsedReadSearchContent.tsx +2 -1
  294. package/src/components/messages/GroupedToolUseContent.tsx +1 -0
  295. package/src/components/messages/HighlightedThinkingText.tsx +1 -0
  296. package/src/components/messages/HookProgressMessage.tsx +1 -0
  297. package/src/components/messages/PlanApprovalMessage.tsx +1 -0
  298. package/src/components/messages/RateLimitMessage.tsx +1 -0
  299. package/src/components/messages/ShutdownMessage.tsx +1 -0
  300. package/src/components/messages/SystemAPIErrorMessage.tsx +1 -0
  301. package/src/components/messages/SystemTextMessage.tsx +2 -1
  302. package/src/components/messages/TaskAssignmentMessage.tsx +1 -0
  303. package/src/components/messages/UserAgentNotificationMessage.tsx +1 -0
  304. package/src/components/messages/UserBashInputMessage.tsx +1 -0
  305. package/src/components/messages/UserBashOutputMessage.tsx +1 -0
  306. package/src/components/messages/UserChannelMessage.tsx +1 -0
  307. package/src/components/messages/UserCommandMessage.tsx +1 -0
  308. package/src/components/messages/UserImageMessage.tsx +1 -0
  309. package/src/components/messages/UserLocalCommandOutputMessage.tsx +1 -0
  310. package/src/components/messages/UserMemoryInputMessage.tsx +1 -0
  311. package/src/components/messages/UserPlanMessage.tsx +1 -0
  312. package/src/components/messages/UserResourceUpdateMessage.tsx +1 -0
  313. package/src/components/messages/UserTeammateMessage.tsx +1 -0
  314. package/src/components/messages/UserTextMessage.tsx +1 -0
  315. package/src/components/messages/UserToolResultMessage/RejectedPlanMessage.tsx +1 -0
  316. package/src/components/messages/UserToolResultMessage/UserToolErrorMessage.tsx +1 -0
  317. package/src/components/messages/UserToolResultMessage/UserToolRejectMessage.tsx +1 -0
  318. package/src/components/messages/UserToolResultMessage/UserToolResultMessage.tsx +1 -0
  319. package/src/components/messages/UserToolResultMessage/utils.tsx +1 -0
  320. package/src/components/messages/nullRenderingAttachments.ts +1 -0
  321. package/src/components/messages/teamMemCollapsed.tsx +1 -0
  322. package/src/components/permissions/AskUserQuestionPermissionRequest/AskUserQuestionPermissionRequest.tsx +2 -1
  323. package/src/components/permissions/AskUserQuestionPermissionRequest/PreviewBox.tsx +1 -0
  324. package/src/components/permissions/AskUserQuestionPermissionRequest/QuestionNavigationBar.tsx +2 -1
  325. package/src/components/permissions/AskUserQuestionPermissionRequest/QuestionView.tsx +2 -1
  326. package/src/components/permissions/AskUserQuestionPermissionRequest/SubmitQuestionsView.tsx +1 -0
  327. package/src/components/permissions/BashPermissionRequest/BashPermissionRequest.tsx +1 -0
  328. package/src/components/permissions/BashPermissionRequest/bashToolUseOptions.tsx +1 -0
  329. package/src/components/permissions/ComputerUseApproval/ComputerUseApproval.tsx +2 -1
  330. package/src/components/permissions/EnterPlanModePermissionRequest/EnterPlanModePermissionRequest.tsx +1 -0
  331. package/src/components/permissions/ExitPlanModePermissionRequest/ExitPlanModePermissionRequest.tsx +1 -0
  332. package/src/components/permissions/FallbackPermissionRequest.tsx +1 -0
  333. package/src/components/permissions/FileEditPermissionRequest/FileEditPermissionRequest.tsx +1 -0
  334. package/src/components/permissions/FilePermissionDialog/FilePermissionDialog.tsx +1 -0
  335. package/src/components/permissions/FileWritePermissionRequest/FileWritePermissionRequest.tsx +1 -0
  336. package/src/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.tsx +1 -0
  337. package/src/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.tsx +1 -0
  338. package/src/components/permissions/NotebookEditPermissionRequest/NotebookEditPermissionRequest.tsx +1 -0
  339. package/src/components/permissions/NotebookEditPermissionRequest/NotebookEditToolDiff.tsx +2 -1
  340. package/src/components/permissions/PermissionDecisionDebugInfo.tsx +2 -1
  341. package/src/components/permissions/PermissionDialog.tsx +1 -0
  342. package/src/components/permissions/PermissionExplanation.tsx +2 -1
  343. package/src/components/permissions/PermissionPrompt.tsx +2 -1
  344. package/src/components/permissions/PermissionRequest.tsx +1 -0
  345. package/src/components/permissions/PermissionRequestTitle.tsx +1 -0
  346. package/src/components/permissions/PermissionRuleExplanation.tsx +1 -0
  347. package/src/components/permissions/SandboxPermissionRequest.tsx +1 -0
  348. package/src/components/permissions/SedEditPermissionRequest/SedEditPermissionRequest.tsx +1 -0
  349. package/src/components/permissions/SkillPermissionRequest/SkillPermissionRequest.tsx +1 -0
  350. package/src/components/permissions/WebFetchPermissionRequest/WebFetchPermissionRequest.tsx +1 -0
  351. package/src/components/permissions/WorkerBadge.tsx +1 -0
  352. package/src/components/permissions/WorkerPendingPermission.tsx +1 -0
  353. package/src/components/permissions/rules/AddPermissionRules.tsx +1 -0
  354. package/src/components/permissions/rules/AddWorkspaceDirectory.tsx +2 -1
  355. package/src/components/permissions/rules/PermissionRuleDescription.tsx +1 -0
  356. package/src/components/permissions/rules/PermissionRuleInput.tsx +1 -0
  357. package/src/components/permissions/rules/PermissionRuleList.tsx +2 -1
  358. package/src/components/permissions/rules/RecentDenialsTab.tsx +1 -0
  359. package/src/components/permissions/rules/RemoveWorkspaceDirectory.tsx +1 -0
  360. package/src/components/permissions/rules/WorkspaceTab.tsx +1 -0
  361. package/src/components/sandbox/SandboxConfigTab.tsx +1 -0
  362. package/src/components/sandbox/SandboxDependenciesTab.tsx +1 -0
  363. package/src/components/sandbox/SandboxDoctorSection.tsx +1 -0
  364. package/src/components/sandbox/SandboxOverridesTab.tsx +1 -0
  365. package/src/components/sandbox/SandboxSettings.tsx +1 -0
  366. package/src/components/shell/ExpandShellOutputContext.tsx +1 -0
  367. package/src/components/shell/OutputLine.tsx +1 -0
  368. package/src/components/shell/ShellProgressMessage.tsx +1 -0
  369. package/src/components/shell/ShellTimeDisplay.tsx +1 -0
  370. package/src/components/skills/SkillsMenu.tsx +1 -0
  371. package/src/components/tasks/AsyncAgentDetailDialog.tsx +1 -0
  372. package/src/components/tasks/BackgroundTask.tsx +1 -0
  373. package/src/components/tasks/BackgroundTaskStatus.tsx +2 -1
  374. package/src/components/tasks/BackgroundTasksDialog.tsx +2 -1
  375. package/src/components/tasks/DreamDetailDialog.tsx +1 -0
  376. package/src/components/tasks/InProcessTeammateDetailDialog.tsx +1 -0
  377. package/src/components/tasks/RemoteSessionDetailDialog.tsx +2 -1
  378. package/src/components/tasks/RemoteSessionProgress.tsx +1 -0
  379. package/src/components/tasks/ShellDetailDialog.tsx +2 -1
  380. package/src/components/tasks/ShellProgress.tsx +1 -0
  381. package/src/components/tasks/taskStatusUtils.tsx +1 -0
  382. package/src/components/teams/TeamStatus.tsx +1 -0
  383. package/src/components/teams/TeamsDialog.tsx +2 -1
  384. package/src/components/ui/OrderedList.tsx +1 -0
  385. package/src/components/ui/OrderedListItem.tsx +1 -0
  386. package/src/components/ui/TreeSelect.tsx +2 -1
  387. package/src/components/wizard/WizardDialogLayout.tsx +1 -0
  388. package/src/components/wizard/WizardProvider.tsx +2 -1
  389. package/src/components/wizard/useWizard.ts +1 -0
  390. package/src/constants/betas.ts +1 -0
  391. package/src/constants/prompts.ts +1 -0
  392. package/src/context/QueuedMessageContext.tsx +1 -0
  393. package/src/context/fpsMetrics.tsx +1 -0
  394. package/src/context/mailbox.tsx +1 -0
  395. package/src/context/modalContext.tsx +1 -0
  396. package/src/context/overlayContext.tsx +1 -0
  397. package/src/context/promptOverlayContext.tsx +1 -0
  398. package/src/context/stats.tsx +1 -0
  399. package/src/context/voice.tsx +1 -0
  400. package/src/cost-tracker.ts +1 -0
  401. package/src/dialogLaunchers.tsx +1 -0
  402. package/src/entrypoints/agentSdkTypes.ts +4 -17
  403. package/src/entrypoints/cli.tsx +1 -0
  404. package/src/entrypoints/sdk/controlTypes.ts +86 -10
  405. package/src/entrypoints/sdk/coreTypes.generated.ts +99 -2
  406. package/src/entrypoints/sdk/runtimeTypes.ts +53 -18
  407. package/src/entrypoints/sdk/settingsTypes.generated.ts +2 -1
  408. package/src/hooks/notifs/useAntOrgWarningNotification.ts +1 -1
  409. package/src/hooks/notifs/useCanSwitchToExistingSubscription.tsx +1 -0
  410. package/src/hooks/notifs/useDeprecationWarningNotification.tsx +1 -0
  411. package/src/hooks/notifs/useFastModeNotification.tsx +1 -0
  412. package/src/hooks/notifs/useIDEStatusIndicator.tsx +1 -0
  413. package/src/hooks/notifs/useInstallMessages.tsx +1 -0
  414. package/src/hooks/notifs/useLspInitializationNotification.tsx +1 -0
  415. package/src/hooks/notifs/useMcpConnectivityStatus.tsx +1 -0
  416. package/src/hooks/notifs/useNpmDeprecationNotification.tsx +1 -0
  417. package/src/hooks/notifs/usePluginAutoupdateNotification.tsx +1 -0
  418. package/src/hooks/notifs/usePluginInstallationStatus.tsx +1 -0
  419. package/src/hooks/notifs/useRateLimitWarningNotification.tsx +1 -0
  420. package/src/hooks/useCanUseTool.tsx +2 -1
  421. package/src/hooks/useChromeExtensionNotification.tsx +1 -0
  422. package/src/hooks/useClaudeCodeHintRecommendation.tsx +1 -0
  423. package/src/hooks/useCommandKeybindings.tsx +1 -0
  424. package/src/hooks/useDiffData.ts +1 -0
  425. package/src/hooks/useIDEIntegration.tsx +1 -0
  426. package/src/hooks/useLspPluginRecommendation.tsx +1 -0
  427. package/src/hooks/useOfficialMarketplaceNotification.tsx +1 -0
  428. package/src/hooks/usePluginRecommendationBase.tsx +1 -0
  429. package/src/hooks/usePromptsFromClaudeInChrome.tsx +1 -0
  430. package/src/hooks/useRemoteSession.ts +1 -0
  431. package/src/hooks/useReplBridge.tsx +1 -0
  432. package/src/hooks/useSSHSession.ts +1 -0
  433. package/src/hooks/useTeleportResume.tsx +1 -0
  434. package/src/hooks/useTurnDiffs.ts +1 -0
  435. package/src/hooks/useTypeahead.tsx +1 -0
  436. package/src/hooks/useVoiceIntegration.tsx +1 -0
  437. package/src/ink/Ansi.tsx +1 -0
  438. package/src/ink/bidi.ts +1 -0
  439. package/src/ink/components/AlternateScreen.tsx +1 -0
  440. package/src/ink/components/Box.tsx +1 -0
  441. package/src/ink/components/Button.tsx +1 -0
  442. package/src/ink/components/ClockContext.tsx +1 -0
  443. package/src/ink/components/Link.tsx +1 -0
  444. package/src/ink/components/Newline.tsx +1 -0
  445. package/src/ink/components/NoSelect.tsx +1 -0
  446. package/src/ink/components/RawAnsi.tsx +1 -0
  447. package/src/ink/components/ScrollBox.tsx +1 -0
  448. package/src/ink/components/TerminalFocusContext.tsx +1 -0
  449. package/src/ink/components/Text.tsx +1 -0
  450. package/src/ink/ink.tsx +1 -0
  451. package/src/ink/reconciler.ts +1 -0
  452. package/src/ink/render-to-screen.ts +1 -0
  453. package/src/interactiveHelpers.tsx +4 -4
  454. package/src/keybindings/KeybindingContext.tsx +2 -1
  455. package/src/keybindings/KeybindingProviderSetup.tsx +1 -0
  456. package/src/keybindings/parser.ts +1 -0
  457. package/src/keybindings/template.ts +1 -0
  458. package/src/keybindings/validate.ts +1 -0
  459. package/src/main.tsx +5 -7
  460. package/src/memdir/findRelevantMemories.ts +1 -0
  461. package/src/native-ts/color-diff/index.ts +1 -0
  462. package/src/proactive/index.ts +26 -1
  463. package/src/proactive/useProactive.ts +13 -1
  464. package/src/query/stopHooks.ts +1 -0
  465. package/src/query.ts +1 -0
  466. package/src/remote/SessionsWebSocket.ts +1 -0
  467. package/src/screens/Doctor.tsx +2 -1
  468. package/src/screens/REPL.tsx +13 -6
  469. package/src/screens/ResumeConversation.tsx +1 -0
  470. package/src/services/AgentSummary/agentSummary.ts +1 -0
  471. package/src/services/PromptSuggestion/promptSuggestion.ts +1 -0
  472. package/src/services/api/claude.ts +33 -31
  473. package/src/services/api/client.ts +34 -31
  474. package/src/services/api/errors.ts +1 -0
  475. package/src/services/api/logging.ts +1 -0
  476. package/src/services/api/openaiShim.ts +35 -8
  477. package/src/services/api/withRetry.ts +1 -0
  478. package/src/services/autoDream/autoDream.ts +1 -0
  479. package/src/services/claudeAiLimits.ts +1 -0
  480. package/src/services/compact/autoCompact.ts +1 -0
  481. package/src/services/compact/cachedMicrocompact.ts +56 -4
  482. package/src/services/compact/compact.ts +1 -0
  483. package/src/services/compact/microCompact.ts +1 -0
  484. package/src/services/compact/postCompactCleanup.ts +1 -0
  485. package/src/services/compact/reactiveCompact.ts +16 -1
  486. package/src/services/compact/sessionMemoryCompact.ts +1 -0
  487. package/src/services/compact/snipCompact.ts +18 -1
  488. package/src/services/compact/snipProjection.ts +6 -1
  489. package/src/services/contextCollapse/index.ts +33 -1
  490. package/src/services/extractMemories/extractMemories.ts +1 -0
  491. package/src/services/mcp/MCPConnectionManager.tsx +1 -0
  492. package/src/services/mcp/channelAllowlist.ts +1 -1
  493. package/src/services/mcp/channelNotification.ts +90 -4
  494. package/src/services/mcp/channelPermissions.ts +1 -1
  495. package/src/services/mcp/client.ts +1 -0
  496. package/src/services/mcp/useManageMCPConnections.ts +5 -3
  497. package/src/services/notifier.ts +1 -0
  498. package/src/services/rateLimitMocking.ts +1 -0
  499. package/src/services/skillSearch/localSearch.ts +1 -1
  500. package/src/services/skillSearch/prefetch.ts +10 -1
  501. package/src/services/tips/tipRegistry.ts +1 -0
  502. package/src/services/toolUseSummary/toolUseSummaryGenerator.ts +1 -0
  503. package/src/services/tools/StreamingToolExecutor.ts +1 -0
  504. package/src/services/tools/toolOrchestration.ts +1 -0
  505. package/src/services/vcr.ts +1 -0
  506. package/src/services/voice.ts +1 -0
  507. package/src/setup.ts +1 -0
  508. package/src/skills/bundled/claudeInChrome.ts +1 -0
  509. package/src/skills/bundled/keybindings.ts +1 -0
  510. package/src/skills/bundled/skillify.ts +1 -0
  511. package/src/state/AppState.tsx +10 -7
  512. package/src/tasks/LocalMainSessionTask.ts +1 -0
  513. package/src/tasks/LocalShellTask/LocalShellTask.tsx +1 -0
  514. package/src/tasks/LocalShellTask/killShellTasks.ts +1 -0
  515. package/src/tasks/RemoteAgentTask/RemoteAgentTask.tsx +1 -0
  516. package/src/tools/AgentTool/AgentTool.tsx +30 -3
  517. package/src/tools/AgentTool/UI.tsx +2 -1
  518. package/src/tools/AgentTool/agentToolUtils.ts +1 -0
  519. package/src/tools/AgentTool/builtInAgents.ts +1 -0
  520. package/src/tools/AgentTool/forkSubagent.ts +1 -0
  521. package/src/tools/AgentTool/loadAgentsDir.ts +9 -0
  522. package/src/tools/AgentTool/runAgent.ts +2 -0
  523. package/src/tools/AskUserQuestionTool/AskUserQuestionTool.tsx +1 -0
  524. package/src/tools/BashTool/BashTool.tsx +1 -0
  525. package/src/tools/BashTool/BashToolResultMessage.tsx +1 -0
  526. package/src/tools/BashTool/UI.tsx +1 -0
  527. package/src/tools/BriefTool/UI.tsx +1 -0
  528. package/src/tools/FileEditTool/UI.tsx +1 -0
  529. package/src/tools/FileEditTool/utils.ts +1 -0
  530. package/src/tools/FileReadTool/FileReadTool.ts +1 -0
  531. package/src/tools/FileReadTool/imageProcessor.ts +1 -0
  532. package/src/tools/FileWriteTool/UI.tsx +2 -1
  533. package/src/tools/GrepTool/UI.tsx +1 -0
  534. package/src/tools/LSPTool/UI.tsx +1 -0
  535. package/src/tools/MCPTool/UI.tsx +1 -0
  536. package/src/tools/NotebookEditTool/NotebookEditTool.ts +1 -0
  537. package/src/tools/NotebookEditTool/UI.tsx +1 -0
  538. package/src/tools/PowerShellTool/PowerShellTool.tsx +1 -0
  539. package/src/tools/SendMessageTool/SendMessageTool.ts +1 -0
  540. package/src/tools/SkillTool/SkillTool.ts +1 -0
  541. package/src/tools/TaskOutputTool/TaskOutputTool.tsx +1 -0
  542. package/src/tools/TaskStopTool/UI.tsx +1 -0
  543. package/src/tools/ToolSearchTool/prompt.ts +1 -0
  544. package/src/tools/TungstenTool/TungstenLiveMonitor.ts +3 -0
  545. package/src/tools/WebBrowserTool/WebBrowserPanel.ts +3 -1
  546. package/src/tools/WebFetchTool/utils.ts +1 -0
  547. package/src/tools/WebSearchTool/WebSearchTool.ts +1 -0
  548. package/src/tools/WorkflowTool/createWorkflowCommand.ts +3 -1
  549. package/src/tools/testing/TestingPermissionTool.tsx +1 -0
  550. package/src/tools/utils.ts +1 -0
  551. package/src/types/commands-js.d.ts +13 -0
  552. package/src/types/diff.d.ts +1 -0
  553. package/src/types/hooks.ts +1 -0
  554. package/src/types/macro.d.ts +15 -0
  555. package/src/types/markdown.d.ts +4 -0
  556. package/src/types/message.ts +56 -107
  557. package/src/types/react-compiler-runtime.d.ts +4 -0
  558. package/src/types/utils.ts +3 -3
  559. package/src/utils/advisor.ts +1 -0
  560. package/src/utils/asciicast.ts +1 -0
  561. package/src/utils/attachments.ts +1 -0
  562. package/src/utils/attribution.ts +1 -0
  563. package/src/utils/autoRunIssue.tsx +1 -0
  564. package/src/utils/claudeInChrome/mcpServer.ts +1 -0
  565. package/src/utils/claudeInChrome/setup.ts +1 -0
  566. package/src/utils/claudemd.ts +1 -0
  567. package/src/utils/cleanup.ts +1 -0
  568. package/src/utils/cliHighlight.ts +1 -0
  569. package/src/utils/collapseReadSearch.ts +1 -0
  570. package/src/utils/computerUse/executor.ts +1 -0
  571. package/src/utils/computerUse/gates.ts +1 -0
  572. package/src/utils/computerUse/hostAdapter.ts +1 -0
  573. package/src/utils/computerUse/inputLoader.ts +1 -0
  574. package/src/utils/computerUse/mcpServer.ts +1 -0
  575. package/src/utils/computerUse/setup.ts +1 -0
  576. package/src/utils/computerUse/swiftLoader.ts +1 -0
  577. package/src/utils/computerUse/wrapper.tsx +2 -1
  578. package/src/utils/context.ts +1 -0
  579. package/src/utils/contextAnalysis.ts +1 -0
  580. package/src/utils/conversationRecovery.ts +1 -0
  581. package/src/utils/deepLink/protocolHandler.ts +1 -0
  582. package/src/utils/diff.ts +1 -0
  583. package/src/utils/effort.ts +1 -0
  584. package/src/utils/envUtils.ts +1 -0
  585. package/src/utils/execFileNoThrowPortable.ts +1 -0
  586. package/src/utils/fileHistory.ts +1 -0
  587. package/src/utils/filePersistence/filePersistence.ts +1 -0
  588. package/src/utils/filePersistence/outputsScanner.ts +1 -0
  589. package/src/utils/gitDiff.ts +1 -0
  590. package/src/utils/groupToolUses.ts +1 -0
  591. package/src/utils/hooks/hooksConfigManager.ts +1 -0
  592. package/src/utils/hooks/skillImprovement.ts +1 -0
  593. package/src/utils/hooks.ts +1 -0
  594. package/src/utils/imagePaste.ts +1 -0
  595. package/src/utils/log.ts +1 -0
  596. package/src/utils/logoV2Utils.ts +6 -6
  597. package/src/utils/messageQueueManager.ts +1 -0
  598. package/src/utils/messages.ts +122 -100
  599. package/src/utils/model/agent.ts +43 -2
  600. package/src/utils/model/configs.ts +1 -1
  601. package/src/utils/model/deprecation.ts +1 -0
  602. package/src/utils/model/fetchModels.ts +11 -1
  603. package/src/utils/model/model.ts +31 -0
  604. package/src/utils/model/modelCapabilities.ts +1 -0
  605. package/src/utils/model/modelOptions.ts +68 -14
  606. package/src/utils/model/modelStrings.ts +1 -0
  607. package/src/utils/model/platformProfiles.ts +524 -0
  608. package/src/utils/model/thirdPartyProviders.ts +158 -15
  609. package/src/utils/modelCost.ts +1 -0
  610. package/src/utils/notebook.ts +1 -0
  611. package/src/utils/permissions/classifierDecision.ts +1 -0
  612. package/src/utils/permissions/pathValidation.ts +1 -0
  613. package/src/utils/permissions/permissionExplainer.ts +1 -0
  614. package/src/utils/plugins/loadPluginHooks.ts +1 -0
  615. package/src/utils/plugins/lspPluginIntegration.ts +1 -0
  616. package/src/utils/plugins/pluginLoader.ts +1 -0
  617. package/src/utils/preflightChecks.tsx +2 -1
  618. package/src/utils/processUserInput/processSlashCommand.tsx +13 -3
  619. package/src/utils/queryHelpers.ts +1 -0
  620. package/src/utils/readFileInRange.ts +1 -0
  621. package/src/utils/sandbox/sandbox-adapter.ts +24 -22
  622. package/src/utils/sessionFileAccessHooks.ts +1 -0
  623. package/src/utils/sessionRestore.ts +1 -0
  624. package/src/utils/sessionStorage.ts +84 -46
  625. package/src/utils/settings/types.ts +72 -0
  626. package/src/utils/shell/prefix.ts +1 -0
  627. package/src/utils/sideQuery.ts +1 -0
  628. package/src/utils/sliceAnsi.ts +1 -0
  629. package/src/utils/staticRender.tsx +1 -0
  630. package/src/utils/stats.ts +1 -0
  631. package/src/utils/status.tsx +1 -0
  632. package/src/utils/swarm/It2SetupPrompt.tsx +2 -1
  633. package/src/utils/swarm/teammateModel.ts +1 -0
  634. package/src/utils/taskSummary.ts +6 -1
  635. package/src/utils/textHighlighting.ts +1 -0
  636. package/src/utils/thinking.ts +1 -0
  637. package/src/utils/toolResultStorage.ts +1 -0
  638. package/src/utils/transcriptSearch.ts +1 -0
  639. package/src/utils/worktree.ts +1 -0
  640. package/stubs/@anthropic-ai/mcpb/index.d.ts +23 -1
  641. package/stubs/@anthropic-ai/sandbox-runtime/index.d.ts +39 -1
  642. package/.gitignore.bak +0 -11
  643. package/bin/mumuclaw +0 -154
  644. package/bin/opencc +0 -50
  645. package/src/channels/heartbeat-channel.mjs +0 -280
@@ -1,3 +1,4 @@
1
+ // @ts-nocheck
1
2
  import { execa } from 'execa';
2
3
  import React, { useCallback, useState } from 'react';
3
4
  import { type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS, logEvent } from 'src/services/analytics/index.js';
@@ -584,4 +585,4 @@ function InstallGitHubApp(props: {
584
585
  export async function call(onDone: LocalJSXCommandOnDone): Promise<React.ReactNode> {
585
586
  return <InstallGitHubApp onDone={onDone} />;
586
587
  }
587
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleGVjYSIsIlJlYWN0IiwidXNlQ2FsbGJhY2siLCJ1c2VTdGF0ZSIsIkFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMiLCJsb2dFdmVudCIsIldvcmtmbG93TXVsdGlzZWxlY3REaWFsb2ciLCJHSVRIVUJfQUNUSU9OX1NFVFVQX0RPQ1NfVVJMIiwidXNlRXhpdE9uQ3RybENEV2l0aEtleWJpbmRpbmdzIiwiS2V5Ym9hcmRFdmVudCIsIkJveCIsIkxvY2FsSlNYQ29tbWFuZE9uRG9uZSIsImdldEFudGhyb3BpY0FwaUtleSIsImlzQW50aHJvcGljQXV0aEVuYWJsZWQiLCJvcGVuQnJvd3NlciIsImV4ZWNGaWxlTm9UaHJvdyIsImdldEdpdGh1YlJlcG8iLCJwbHVyYWwiLCJBcGlLZXlTdGVwIiwiQ2hlY2tFeGlzdGluZ1NlY3JldFN0ZXAiLCJDaGVja0dpdEh1YlN0ZXAiLCJDaG9vc2VSZXBvU3RlcCIsIkNyZWF0aW5nU3RlcCIsIkVycm9yU3RlcCIsIkV4aXN0aW5nV29ya2Zsb3dTdGVwIiwiSW5zdGFsbEFwcFN0ZXAiLCJPQXV0aEZsb3dTdGVwIiwiU3VjY2Vzc1N0ZXAiLCJzZXR1cEdpdEh1YkFjdGlvbnMiLCJTdGF0ZSIsIldhcm5pbmciLCJXb3JrZmxvdyIsIldhcm5pbmdzU3RlcCIsIklOSVRJQUxfU1RBVEUiLCJzdGVwIiwic2VsZWN0ZWRSZXBvTmFtZSIsImN1cnJlbnRSZXBvIiwidXNlQ3VycmVudFJlcG8iLCJhcGlLZXlPck9BdXRoVG9rZW4iLCJ1c2VFeGlzdGluZ0tleSIsImN1cnJlbnRXb3JrZmxvd0luc3RhbGxTdGVwIiwid2FybmluZ3MiLCJzZWNyZXRFeGlzdHMiLCJzZWNyZXROYW1lIiwidXNlRXhpc3RpbmdTZWNyZXQiLCJ3b3JrZmxvd0V4aXN0cyIsInNlbGVjdGVkV29ya2Zsb3dzIiwic2VsZWN0ZWRBcGlLZXlPcHRpb24iLCJhdXRoVHlwZSIsIkluc3RhbGxHaXRIdWJBcHAiLCJwcm9wcyIsIm9uRG9uZSIsIm1lc3NhZ2UiLCJSZWFjdE5vZGUiLCJleGlzdGluZ0FwaUtleSIsInN0YXRlIiwic2V0U3RhdGUiLCJ1c2VFZmZlY3QiLCJjaGVja0dpdEh1YkNMSSIsImdoVmVyc2lvblJlc3VsdCIsInNoZWxsIiwicmVqZWN0IiwiZXhpdENvZGUiLCJwdXNoIiwidGl0bGUiLCJpbnN0cnVjdGlvbnMiLCJhdXRoUmVzdWx0IiwidG9rZW5TY29wZXNNYXRjaCIsInN0ZG91dCIsIm1hdGNoIiwic2NvcGVzIiwibWlzc2luZ1Njb3BlcyIsImluY2x1ZGVzIiwibGVuZ3RoIiwicHJldiIsImVycm9yIiwiam9pbiIsImVycm9yUmVhc29uIiwiZXJyb3JJbnN0cnVjdGlvbnMiLCJydW5TZXR1cEdpdEh1YkFjdGlvbnMiLCJ3b3JrZmxvd0FjdGlvbiIsImVycm9yTWVzc2FnZSIsIkVycm9yIiwicmVhc29uIiwib3BlbkdpdEh1YkFwcEluc3RhbGxhdGlvbiIsImluc3RhbGxVcmwiLCJjaGVja1JlcG9zaXRvcnlQZXJtaXNzaW9ucyIsInJlcG9OYW1lIiwiUHJvbWlzZSIsImhhc0FjY2VzcyIsInJlc3VsdCIsImNvZGUiLCJoYXNBZG1pbiIsInRyaW0iLCJzdGRlcnIiLCJjaGVja0V4aXN0aW5nV29ya2Zsb3dGaWxlIiwiY2hlY2tGaWxlUmVzdWx0IiwiY2hlY2tFeGlzdGluZ1NlY3JldCIsImNoZWNrU2VjcmV0c1Jlc3VsdCIsImxpbmVzIiwic3BsaXQiLCJoYXNBbnRocm9waWNLZXkiLCJzb21lIiwibGluZSIsInRlc3QiLCJoYW5kbGVTdWJtaXQiLCJzZXRUaW1lb3V0IiwicmVwb1dhcm5pbmdzIiwicmVwbGFjZSIsInBlcm1pc3Npb25DaGVjayIsImFsbFdhcm5pbmdzIiwiYXBpS2V5VG9Vc2UiLCJoYW5kbGVSZXBvVXJsQ2hhbmdlIiwidmFsdWUiLCJoYW5kbGVBcGlLZXlDaGFuZ2UiLCJoYW5kbGVBcGlLZXlPcHRpb25DaGFuZ2UiLCJvcHRpb24iLCJoYW5kbGVDcmVhdGVPQXV0aFRva2VuIiwiaGFuZGxlT0F1dGhTdWNjZXNzIiwidG9rZW4iLCJoYW5kbGVPQXV0aENhbmNlbCIsImhhbmRsZVNlY3JldE5hbWVDaGFuZ2UiLCJoYW5kbGVUb2dnbGVVc2VDdXJyZW50UmVwbyIsImhhbmRsZVRvZ2dsZVVzZUV4aXN0aW5nS2V5IiwiaGFuZGxlVG9nZ2xlVXNlRXhpc3RpbmdTZWNyZXQiLCJoYW5kbGVXb3JrZmxvd0FjdGlvbiIsImFjdGlvbiIsImhhbmRsZURpc21pc3NLZXlEb3duIiwiZSIsInByZXZlbnREZWZhdWx0IiwidW5kZWZpbmVkIiwiY2FsbCJdLCJzb3VyY2VzIjpbImluc3RhbGwtZ2l0aHViLWFwcC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY2EgfSBmcm9tICdleGVjYSdcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7XG4gIHR5cGUgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgbG9nRXZlbnQsXG59IGZyb20gJ3NyYy9zZXJ2aWNlcy9hbmFseXRpY3MvaW5kZXguanMnXG5pbXBvcnQgeyBXb3JrZmxvd011bHRpc2VsZWN0RGlhbG9nIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9Xb3JrZmxvd011bHRpc2VsZWN0RGlhbG9nLmpzJ1xuaW1wb3J0IHsgR0lUSFVCX0FDVElPTl9TRVRVUF9ET0NTX1VSTCB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9naXRodWItYXBwLmpzJ1xuaW1wb3J0IHsgdXNlRXhpdE9uQ3RybENEV2l0aEtleWJpbmRpbmdzIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlRXhpdE9uQ3RybENEV2l0aEtleWJpbmRpbmdzLmpzJ1xuaW1wb3J0IHR5cGUgeyBLZXlib2FyZEV2ZW50IH0gZnJvbSAnLi4vLi4vaW5rL2V2ZW50cy9rZXlib2FyZC1ldmVudC5qcydcbmltcG9ydCB7IEJveCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB0eXBlIHsgTG9jYWxKU1hDb21tYW5kT25Eb25lIH0gZnJvbSAnLi4vLi4vdHlwZXMvY29tbWFuZC5qcydcbmltcG9ydCB7IGdldEFudGhyb3BpY0FwaUtleSwgaXNBbnRocm9waWNBdXRoRW5hYmxlZCB9IGZyb20gJy4uLy4uL3V0aWxzL2F1dGguanMnXG5pbXBvcnQgeyBvcGVuQnJvd3NlciB9IGZyb20gJy4uLy4uL3V0aWxzL2Jyb3dzZXIuanMnXG5pbXBvcnQgeyBleGVjRmlsZU5vVGhyb3cgfSBmcm9tICcuLi8uLi91dGlscy9leGVjRmlsZU5vVGhyb3cuanMnXG5pbXBvcnQgeyBnZXRHaXRodWJSZXBvIH0gZnJvbSAnLi4vLi4vdXRpbHMvZ2l0LmpzJ1xuaW1wb3J0IHsgcGx1cmFsIH0gZnJvbSAnLi4vLi4vdXRpbHMvc3RyaW5nVXRpbHMuanMnXG5pbXBvcnQgeyBBcGlLZXlTdGVwIH0gZnJvbSAnLi9BcGlLZXlTdGVwLmpzJ1xuaW1wb3J0IHsgQ2hlY2tFeGlzdGluZ1NlY3JldFN0ZXAgfSBmcm9tICcuL0NoZWNrRXhpc3RpbmdTZWNyZXRTdGVwLmpzJ1xuaW1wb3J0IHsgQ2hlY2tHaXRIdWJTdGVwIH0gZnJvbSAnLi9DaGVja0dpdEh1YlN0ZXAuanMnXG5pbXBvcnQgeyBDaG9vc2VSZXBvU3RlcCB9IGZyb20gJy4vQ2hvb3NlUmVwb1N0ZXAuanMnXG5pbXBvcnQgeyBDcmVhdGluZ1N0ZXAgfSBmcm9tICcuL0NyZWF0aW5nU3RlcC5qcydcbmltcG9ydCB7IEVycm9yU3RlcCB9IGZyb20gJy4vRXJyb3JTdGVwLmpzJ1xuaW1wb3J0IHsgRXhpc3RpbmdXb3JrZmxvd1N0ZXAgfSBmcm9tICcuL0V4aXN0aW5nV29ya2Zsb3dTdGVwLmpzJ1xuaW1wb3J0IHsgSW5zdGFsbEFwcFN0ZXAgfSBmcm9tICcuL0luc3RhbGxBcHBTdGVwLmpzJ1xuaW1wb3J0IHsgT0F1dGhGbG93U3RlcCB9IGZyb20gJy4vT0F1dGhGbG93U3RlcC5qcydcbmltcG9ydCB7IFN1Y2Nlc3NTdGVwIH0gZnJvbSAnLi9TdWNjZXNzU3RlcC5qcydcbmltcG9ydCB7IHNldHVwR2l0SHViQWN0aW9ucyB9IGZyb20gJy4vc2V0dXBHaXRIdWJBY3Rpb25zLmpzJ1xuaW1wb3J0IHR5cGUgeyBTdGF0ZSwgV2FybmluZywgV29ya2Zsb3cgfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHsgV2FybmluZ3NTdGVwIH0gZnJvbSAnLi9XYXJuaW5nc1N0ZXAuanMnXG5cbmNvbnN0IElOSVRJQUxfU1RBVEU6IFN0YXRlID0ge1xuICBzdGVwOiAnY2hlY2stZ2gnLFxuICBzZWxlY3RlZFJlcG9OYW1lOiAnJyxcbiAgY3VycmVudFJlcG86ICcnLFxuICB1c2VDdXJyZW50UmVwbzogZmFsc2UsIC8vIERlZmF1bHQgdG8gZmFsc2UsIHdpbGwgYmUgc2V0IHRvIHRydWUgaWYgcmVwbyBkZXRlY3RlZFxuICBhcGlLZXlPck9BdXRoVG9rZW46ICcnLFxuICB1c2VFeGlzdGluZ0tleTogdHJ1ZSxcbiAgY3VycmVudFdvcmtmbG93SW5zdGFsbFN0ZXA6IDAsXG4gIHdhcm5pbmdzOiBbXSxcbiAgc2VjcmV0RXhpc3RzOiBmYWxzZSxcbiAgc2VjcmV0TmFtZTogJ0FOVEhST1BJQ19BUElfS0VZJyxcbiAgdXNlRXhpc3RpbmdTZWNyZXQ6IHRydWUsXG4gIHdvcmtmbG93RXhpc3RzOiBmYWxzZSxcbiAgc2VsZWN0ZWRXb3JrZmxvd3M6IFsnY2xhdWRlJywgJ2NsYXVkZS1yZXZpZXcnXSBhcyBXb3JrZmxvd1tdLFxuICBzZWxlY3RlZEFwaUtleU9wdGlvbjogJ25ldycgYXMgJ2V4aXN0aW5nJyB8ICduZXcnIHwgJ29hdXRoJyxcbiAgYXV0aFR5cGU6ICdhcGlfa2V5Jyxcbn1cblxuZnVuY3Rpb24gSW5zdGFsbEdpdEh1YkFwcChwcm9wczoge1xuICBvbkRvbmU6IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWRcbn0pOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCBbZXhpc3RpbmdBcGlLZXldID0gdXNlU3RhdGUoKCkgPT4gZ2V0QW50aHJvcGljQXBpS2V5KCkpXG4gIGNvbnN0IFtzdGF0ZSwgc2V0U3RhdGVdID0gdXNlU3RhdGUoe1xuICAgIC4uLklOSVRJQUxfU1RBVEUsXG4gICAgdXNlRXhpc3RpbmdLZXk6ICEhZXhpc3RpbmdBcGlLZXksXG4gICAgc2VsZWN0ZWRBcGlLZXlPcHRpb246IChleGlzdGluZ0FwaUtleVxuICAgICAgPyAnZXhpc3RpbmcnXG4gICAgICA6IGlzQW50aHJvcGljQXV0aEVuYWJsZWQoKVxuICAgICAgICA/ICdvYXV0aCdcbiAgICAgICAgOiAnbmV3JykgYXMgJ2V4aXN0aW5nJyB8ICduZXcnIHwgJ29hdXRoJyxcbiAgfSlcbiAgdXNlRXhpdE9uQ3RybENEV2l0aEtleWJpbmRpbmdzKClcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxvZ0V2ZW50KCd0ZW5ndV9pbnN0YWxsX2dpdGh1Yl9hcHBfc3RhcnRlZCcsIHt9KVxuICB9LCBbXSlcblxuICBjb25zdCBjaGVja0dpdEh1YkNMSSA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB3YXJuaW5nczogV2FybmluZ1tdID0gW11cblxuICAgIC8vIENoZWNrIGlmIGdoIGlzIGluc3RhbGxlZFxuICAgIGNvbnN0IGdoVmVyc2lvblJlc3VsdCA9IGF3YWl0IGV4ZWNhKCdnaCAtLXZlcnNpb24nLCB7XG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHJlamVjdDogZmFsc2UsXG4gICAgfSlcbiAgICBpZiAoZ2hWZXJzaW9uUmVzdWx0LmV4aXRDb2RlICE9PSAwKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgdGl0bGU6ICdHaXRIdWIgQ0xJIG5vdCBmb3VuZCcsXG4gICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgJ0dpdEh1YiBDTEkgKGdoKSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgaW5zdGFsbGVkIG9yIGFjY2Vzc2libGUuJyxcbiAgICAgICAgaW5zdHJ1Y3Rpb25zOiBbXG4gICAgICAgICAgJ0luc3RhbGwgR2l0SHViIENMSSBmcm9tIGh0dHBzOi8vY2xpLmdpdGh1Yi5jb20vJyxcbiAgICAgICAgICAnbWFjT1M6IGJyZXcgaW5zdGFsbCBnaCcsXG4gICAgICAgICAgJ1dpbmRvd3M6IHdpbmdldCBpbnN0YWxsIC0taWQgR2l0SHViLmNsaScsXG4gICAgICAgICAgJ0xpbnV4OiBTZWUgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBhdCBodHRwczovL2dpdGh1Yi5jb20vY2xpL2NsaSNpbnN0YWxsYXRpb24nLFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBDaGVjayBhdXRoIHN0YXR1c1xuICAgIGNvbnN0IGF1dGhSZXN1bHQgPSBhd2FpdCBleGVjYSgnZ2ggYXV0aCBzdGF0dXMgLWEnLCB7XG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHJlamVjdDogZmFsc2UsXG4gICAgfSlcbiAgICBpZiAoYXV0aFJlc3VsdC5leGl0Q29kZSAhPT0gMCkge1xuICAgICAgd2FybmluZ3MucHVzaCh7XG4gICAgICAgIHRpdGxlOiAnR2l0SHViIENMSSBub3QgYXV0aGVudGljYXRlZCcsXG4gICAgICAgIG1lc3NhZ2U6ICdHaXRIdWIgQ0xJIGRvZXMgbm90IGFwcGVhciB0byBiZSBhdXRoZW50aWNhdGVkLicsXG4gICAgICAgIGluc3RydWN0aW9uczogW1xuICAgICAgICAgICdSdW46IGdoIGF1dGggbG9naW4nLFxuICAgICAgICAgICdGb2xsb3cgdGhlIHByb21wdHMgdG8gYXV0aGVudGljYXRlIHdpdGggR2l0SHViJyxcbiAgICAgICAgICAnT3Igc2V0IHVwIGF1dGhlbnRpY2F0aW9uIHVzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBvciBvdGhlciBtZXRob2RzJyxcbiAgICAgICAgXSxcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENoZWNrIGlmIHJlcXVpcmVkIHNjb3BlcyBhcmUgcHJlc2VudCBpbiB0aGUgVG9rZW4gc2NvcGVzIGxpbmVcbiAgICAgIGNvbnN0IHRva2VuU2NvcGVzTWF0Y2ggPSBhdXRoUmVzdWx0LnN0ZG91dC5tYXRjaCgvVG9rZW4gc2NvcGVzOi4qJC9tKVxuICAgICAgaWYgKHRva2VuU2NvcGVzTWF0Y2gpIHtcbiAgICAgICAgY29uc3Qgc2NvcGVzID0gdG9rZW5TY29wZXNNYXRjaFswXVxuICAgICAgICBjb25zdCBtaXNzaW5nU2NvcGVzOiBzdHJpbmdbXSA9IFtdXG5cbiAgICAgICAgaWYgKCFzY29wZXMuaW5jbHVkZXMoJ3JlcG8nKSkge1xuICAgICAgICAgIG1pc3NpbmdTY29wZXMucHVzaCgncmVwbycpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzY29wZXMuaW5jbHVkZXMoJ3dvcmtmbG93JykpIHtcbiAgICAgICAgICBtaXNzaW5nU2NvcGVzLnB1c2goJ3dvcmtmbG93JylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtaXNzaW5nU2NvcGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBNaXNzaW5nIHJlcXVpcmVkIHNjb3BlcyAtIGV4aXQgaW1tZWRpYXRlbHlcbiAgICAgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgc3RlcDogJ2Vycm9yJyxcbiAgICAgICAgICAgIGVycm9yOiBgR2l0SHViIENMSSBpcyBtaXNzaW5nIHJlcXVpcmVkIHBlcm1pc3Npb25zOiAke21pc3NpbmdTY29wZXMuam9pbignLCAnKX0uYCxcbiAgICAgICAgICAgIGVycm9yUmVhc29uOiAnTWlzc2luZyByZXF1aXJlZCBzY29wZXMnLFxuICAgICAgICAgICAgZXJyb3JJbnN0cnVjdGlvbnM6IFtcbiAgICAgICAgICAgICAgYFlvdXIgR2l0SHViIENMSSBhdXRoZW50aWNhdGlvbiBpcyBtaXNzaW5nIHRoZSBcIiR7bWlzc2luZ1Njb3Blcy5qb2luKCdcIiBhbmQgXCInKX1cIiAke3BsdXJhbChtaXNzaW5nU2NvcGVzLmxlbmd0aCwgJ3Njb3BlJyl9IG5lZWRlZCB0byBtYW5hZ2UgR2l0SHViIEFjdGlvbnMgYW5kIHNlY3JldHMuYCxcbiAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICdUbyBmaXggdGhpcywgcnVuOicsXG4gICAgICAgICAgICAgICcgIGdoIGF1dGggcmVmcmVzaCAtaCBnaXRodWIuY29tIC1zIHJlcG8sd29ya2Zsb3cnLFxuICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgJ1RoaXMgd2lsbCBhZGQgdGhlIG5lY2Vzc2FyeSBwZXJtaXNzaW9ucyB0byBtYW5hZ2Ugd29ya2Zsb3dzIGFuZCBzZWNyZXRzLicsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgaW4gYSBnaXQgcmVwbyBhbmQgZ2V0IHJlbW90ZSBVUkxcbiAgICBjb25zdCBjdXJyZW50UmVwbyA9IChhd2FpdCBnZXRHaXRodWJSZXBvKCkpID8/ICcnXG5cbiAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0ZXBfY29tcGxldGVkJywge1xuICAgICAgc3RlcDogJ2NoZWNrLWdoJyBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgIH0pXG5cbiAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAuLi5wcmV2LFxuICAgICAgd2FybmluZ3MsXG4gICAgICBjdXJyZW50UmVwbyxcbiAgICAgIHNlbGVjdGVkUmVwb05hbWU6IGN1cnJlbnRSZXBvLFxuICAgICAgdXNlQ3VycmVudFJlcG86ICEhY3VycmVudFJlcG8sIC8vIFNldCB0byBmYWxzZSBpZiBubyByZXBvIGRldGVjdGVkXG4gICAgICBzdGVwOiB3YXJuaW5ncy5sZW5ndGggPiAwID8gJ3dhcm5pbmdzJyA6ICdjaG9vc2UtcmVwbycsXG4gICAgfSkpXG4gIH0sIFtdKVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHN0YXRlLnN0ZXAgPT09ICdjaGVjay1naCcpIHtcbiAgICAgIHZvaWQgY2hlY2tHaXRIdWJDTEkoKVxuICAgIH1cbiAgfSwgW3N0YXRlLnN0ZXAsIGNoZWNrR2l0SHViQ0xJXSlcblxuICBjb25zdCBydW5TZXR1cEdpdEh1YkFjdGlvbnMgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoYXBpS2V5T3JPQXV0aFRva2VuOiBzdHJpbmcgfCBudWxsLCBzZWNyZXROYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgc3RlcDogJ2NyZWF0aW5nJyxcbiAgICAgICAgY3VycmVudFdvcmtmbG93SW5zdGFsbFN0ZXA6IDAsXG4gICAgICB9KSlcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2V0dXBHaXRIdWJBY3Rpb25zKFxuICAgICAgICAgIHN0YXRlLnNlbGVjdGVkUmVwb05hbWUsXG4gICAgICAgICAgYXBpS2V5T3JPQXV0aFRva2VuLFxuICAgICAgICAgIHNlY3JldE5hbWUsXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoe1xuICAgICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgICBjdXJyZW50V29ya2Zsb3dJbnN0YWxsU3RlcDogcHJldi5jdXJyZW50V29ya2Zsb3dJbnN0YWxsU3RlcCArIDEsXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXRlLndvcmtmbG93QWN0aW9uID09PSAnc2tpcCcsXG4gICAgICAgICAgc3RhdGUuc2VsZWN0ZWRXb3JrZmxvd3MsXG4gICAgICAgICAgc3RhdGUuYXV0aFR5cGUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdXNlQ3VycmVudFJlcG86IHN0YXRlLnVzZUN1cnJlbnRSZXBvLFxuICAgICAgICAgICAgd29ya2Zsb3dFeGlzdHM6IHN0YXRlLndvcmtmbG93RXhpc3RzLFxuICAgICAgICAgICAgc2VjcmV0RXhpc3RzOiBzdGF0ZS5zZWNyZXRFeGlzdHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0ZXBfY29tcGxldGVkJywge1xuICAgICAgICAgIHN0ZXA6ICdjcmVhdGluZycgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgICAgfSlcbiAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzdGVwOiAnc3VjY2VzcycgfSkpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPVxuICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgID8gZXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgOiAnRmFpbGVkIHRvIHNldCB1cCBHaXRIdWIgQWN0aW9ucydcblxuICAgICAgICBpZiAoZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCd3b3JrZmxvdyBmaWxlIGFscmVhZHkgZXhpc3RzJykpIHtcbiAgICAgICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX2Vycm9yJywge1xuICAgICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgICAnd29ya2Zsb3dfZmlsZV9leGlzdHMnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgc3RlcDogJ2Vycm9yJyxcbiAgICAgICAgICAgIGVycm9yOiAnQSBDbGF1ZGUgd29ya2Zsb3cgZmlsZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIHJlcG9zaXRvcnkuJyxcbiAgICAgICAgICAgIGVycm9yUmVhc29uOiAnV29ya2Zsb3cgZmlsZSBjb25mbGljdCcsXG4gICAgICAgICAgICBlcnJvckluc3RydWN0aW9uczogW1xuICAgICAgICAgICAgICAnVGhlIGZpbGUgLmdpdGh1Yi93b3JrZmxvd3MvY2xhdWRlLnltbCBhbHJlYWR5IGV4aXN0cycsXG4gICAgICAgICAgICAgICdZb3UgY2FuIGVpdGhlcjonLFxuICAgICAgICAgICAgICAnICAxLiBEZWxldGUgdGhlIGV4aXN0aW5nIGZpbGUgYW5kIHJ1biB0aGlzIGNvbW1hbmQgYWdhaW4nLFxuICAgICAgICAgICAgICAnICAyLiBVcGRhdGUgdGhlIGV4aXN0aW5nIGZpbGUgbWFudWFsbHkgdXNpbmcgdGhlIHRlbXBsYXRlIGZyb206JyxcbiAgICAgICAgICAgICAgYCAgICAgJHtHSVRIVUJfQUNUSU9OX1NFVFVQX0RPQ1NfVVJMfWAsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ0V2ZW50KCd0ZW5ndV9pbnN0YWxsX2dpdGh1Yl9hcHBfZXJyb3InLCB7XG4gICAgICAgICAgICByZWFzb246XG4gICAgICAgICAgICAgICdzZXR1cF9naXRodWJfYWN0aW9uc19mYWlsZWQnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAgICBzdGVwOiAnZXJyb3InLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yTWVzc2FnZSxcbiAgICAgICAgICAgIGVycm9yUmVhc29uOiAnR2l0SHViIEFjdGlvbnMgc2V0dXAgZmFpbGVkJyxcbiAgICAgICAgICAgIGVycm9ySW5zdHJ1Y3Rpb25zOiBbXSxcbiAgICAgICAgICB9KSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgc3RhdGUuc2VsZWN0ZWRSZXBvTmFtZSxcbiAgICAgIHN0YXRlLndvcmtmbG93QWN0aW9uLFxuICAgICAgc3RhdGUuc2VsZWN0ZWRXb3JrZmxvd3MsXG4gICAgICBzdGF0ZS51c2VDdXJyZW50UmVwbyxcbiAgICAgIHN0YXRlLndvcmtmbG93RXhpc3RzLFxuICAgICAgc3RhdGUuc2VjcmV0RXhpc3RzLFxuICAgICAgc3RhdGUuYXV0aFR5cGUsXG4gICAgXSxcbiAgKVxuXG4gIGFzeW5jIGZ1bmN0aW9uIG9wZW5HaXRIdWJBcHBJbnN0YWxsYXRpb24oKSB7XG4gICAgY29uc3QgaW5zdGFsbFVybCA9ICdodHRwczovL2dpdGh1Yi5jb20vYXBwcy9jbGF1ZGUnXG4gICAgYXdhaXQgb3BlbkJyb3dzZXIoaW5zdGFsbFVybClcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNoZWNrUmVwb3NpdG9yeVBlcm1pc3Npb25zKFxuICAgIHJlcG9OYW1lOiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBoYXNBY2Nlc3M6IGJvb2xlYW47IGVycm9yPzogc3RyaW5nIH0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY0ZpbGVOb1Rocm93KCdnaCcsIFtcbiAgICAgICAgJ2FwaScsXG4gICAgICAgIGByZXBvcy8ke3JlcG9OYW1lfWAsXG4gICAgICAgICctLWpxJyxcbiAgICAgICAgJy5wZXJtaXNzaW9ucy5hZG1pbicsXG4gICAgICBdKVxuXG4gICAgICBpZiAocmVzdWx0LmNvZGUgPT09IDApIHtcbiAgICAgICAgY29uc3QgaGFzQWRtaW4gPSByZXN1bHQuc3Rkb3V0LnRyaW0oKSA9PT0gJ3RydWUnXG4gICAgICAgIHJldHVybiB7IGhhc0FjY2VzczogaGFzQWRtaW4gfVxuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHJlc3VsdC5zdGRlcnIuaW5jbHVkZXMoJzQwNCcpIHx8XG4gICAgICAgIHJlc3VsdC5zdGRlcnIuaW5jbHVkZXMoJ05vdCBGb3VuZCcpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBoYXNBY2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiAncmVwb3NpdG9yeV9ub3RfZm91bmQnLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGhhc0FjY2VzczogZmFsc2UgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHsgaGFzQWNjZXNzOiBmYWxzZSB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY2hlY2tFeGlzdGluZ1dvcmtmbG93RmlsZShyZXBvTmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY2hlY2tGaWxlUmVzdWx0ID0gYXdhaXQgZXhlY0ZpbGVOb1Rocm93KCdnaCcsIFtcbiAgICAgICdhcGknLFxuICAgICAgYHJlcG9zLyR7cmVwb05hbWV9L2NvbnRlbnRzLy5naXRodWIvd29ya2Zsb3dzL2NsYXVkZS55bWxgLFxuICAgICAgJy0tanEnLFxuICAgICAgJy5zaGEnLFxuICAgIF0pXG5cbiAgICByZXR1cm4gY2hlY2tGaWxlUmVzdWx0LmNvZGUgPT09IDBcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNoZWNrRXhpc3RpbmdTZWNyZXQoKSB7XG4gICAgY29uc3QgY2hlY2tTZWNyZXRzUmVzdWx0ID0gYXdhaXQgZXhlY0ZpbGVOb1Rocm93KCdnaCcsIFtcbiAgICAgICdzZWNyZXQnLFxuICAgICAgJ2xpc3QnLFxuICAgICAgJy0tYXBwJyxcbiAgICAgICdhY3Rpb25zJyxcbiAgICAgICctLXJlcG8nLFxuICAgICAgc3RhdGUuc2VsZWN0ZWRSZXBvTmFtZSxcbiAgICBdKVxuXG4gICAgaWYgKGNoZWNrU2VjcmV0c1Jlc3VsdC5jb2RlID09PSAwKSB7XG4gICAgICBjb25zdCBsaW5lcyA9IGNoZWNrU2VjcmV0c1Jlc3VsdC5zdGRvdXQuc3BsaXQoJ1xcbicpXG4gICAgICBjb25zdCBoYXNBbnRocm9waWNLZXkgPSBsaW5lcy5zb21lKChsaW5lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIC9eQU5USFJPUElDX0FQSV9LRVlcXHMrLy50ZXN0KGxpbmUpXG4gICAgICB9KVxuXG4gICAgICBpZiAoaGFzQW50aHJvcGljS2V5KSB7XG4gICAgICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgIHNlY3JldEV4aXN0czogdHJ1ZSxcbiAgICAgICAgICBzdGVwOiAnY2hlY2stZXhpc3Rpbmctc2VjcmV0JyxcbiAgICAgICAgfSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBObyBleGlzdGluZyBzZWNyZXQgZm91bmRcbiAgICAgICAgaWYgKGV4aXN0aW5nQXBpS2V5KSB7XG4gICAgICAgICAgLy8gVXNlciBoYXMgbG9jYWwga2V5LCBza2lwIHRvIGNyZWF0aW5nIHdpdGggaXRcbiAgICAgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgYXBpS2V5T3JPQXV0aFRva2VuOiBleGlzdGluZ0FwaUtleSxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nS2V5OiB0cnVlLFxuICAgICAgICAgIH0pKVxuICAgICAgICAgIGF3YWl0IHJ1blNldHVwR2l0SHViQWN0aW9ucyhleGlzdGluZ0FwaUtleSwgc3RhdGUuc2VjcmV0TmFtZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBObyBsb2NhbCBrZXksIGdvIHRvIEFQSSBrZXkgc3RlcFxuICAgICAgICAgIHNldFN0YXRlKHByZXYgPT4gKHsgLi4ucHJldiwgc3RlcDogJ2FwaS1rZXknIH0pKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEVycm9yIGNoZWNraW5nIHNlY3JldHNcbiAgICAgIGlmIChleGlzdGluZ0FwaUtleSkge1xuICAgICAgICAvLyBVc2VyIGhhcyBsb2NhbCBrZXksIHNraXAgdG8gY3JlYXRpbmcgd2l0aCBpdFxuICAgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICBhcGlLZXlPck9BdXRoVG9rZW46IGV4aXN0aW5nQXBpS2V5LFxuICAgICAgICAgIHVzZUV4aXN0aW5nS2V5OiB0cnVlLFxuICAgICAgICB9KSlcbiAgICAgICAgYXdhaXQgcnVuU2V0dXBHaXRIdWJBY3Rpb25zKGV4aXN0aW5nQXBpS2V5LCBzdGF0ZS5zZWNyZXROYW1lKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm8gbG9jYWwga2V5LCBnbyB0byBBUEkga2V5IHN0ZXBcbiAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzdGVwOiAnYXBpLWtleScgfSkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlU3VibWl0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmIChzdGF0ZS5zdGVwID09PSAnd2FybmluZ3MnKSB7XG4gICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0ZXBfY29tcGxldGVkJywge1xuICAgICAgICBzdGVwOiAnd2FybmluZ3MnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICB9KVxuICAgICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzdGVwOiAnaW5zdGFsbC1hcHAnIH0pKVxuICAgICAgc2V0VGltZW91dChvcGVuR2l0SHViQXBwSW5zdGFsbGF0aW9uLCAwKVxuICAgIH0gZWxzZSBpZiAoc3RhdGUuc3RlcCA9PT0gJ2Nob29zZS1yZXBvJykge1xuICAgICAgbGV0IHJlcG9OYW1lID0gc3RhdGUudXNlQ3VycmVudFJlcG9cbiAgICAgICAgPyBzdGF0ZS5jdXJyZW50UmVwb1xuICAgICAgICA6IHN0YXRlLnNlbGVjdGVkUmVwb05hbWVcblxuICAgICAgaWYgKCFyZXBvTmFtZS50cmltKCkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcG9XYXJuaW5nczogV2FybmluZ1tdID0gW11cblxuICAgICAgaWYgKHJlcG9OYW1lLmluY2x1ZGVzKCdnaXRodWIuY29tJykpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSByZXBvTmFtZS5tYXRjaCgvZ2l0aHViXFwuY29tWzovXShbXi9dK1xcL1teL10rKShcXC5naXQpPyQvKVxuICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgcmVwb1dhcm5pbmdzLnB1c2goe1xuICAgICAgICAgICAgdGl0bGU6ICdJbnZhbGlkIEdpdEh1YiBVUkwgZm9ybWF0JyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdUaGUgcmVwb3NpdG9yeSBVUkwgZm9ybWF0IGFwcGVhcnMgdG8gYmUgaW52YWxpZC4nLFxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBbXG4gICAgICAgICAgICAgICdVc2UgZm9ybWF0OiBvd25lci9yZXBvIG9yIGh0dHBzOi8vZ2l0aHViLmNvbS9vd25lci9yZXBvJyxcbiAgICAgICAgICAgICAgJ0V4YW1wbGU6IGFudGhyb3BpY3MvY2xhdWRlLWNsaScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVwb05hbWUgPSBtYXRjaFsxXT8ucmVwbGFjZSgvXFwuZ2l0JC8sICcnKSB8fCAnJ1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghcmVwb05hbWUuaW5jbHVkZXMoJy8nKSkge1xuICAgICAgICByZXBvV2FybmluZ3MucHVzaCh7XG4gICAgICAgICAgdGl0bGU6ICdSZXBvc2l0b3J5IGZvcm1hdCB3YXJuaW5nJyxcbiAgICAgICAgICBtZXNzYWdlOiAnUmVwb3NpdG9yeSBzaG91bGQgYmUgaW4gZm9ybWF0IFwib3duZXIvcmVwb1wiJyxcbiAgICAgICAgICBpbnN0cnVjdGlvbnM6IFtcbiAgICAgICAgICAgICdVc2UgZm9ybWF0OiBvd25lci9yZXBvJyxcbiAgICAgICAgICAgICdFeGFtcGxlOiBhbnRocm9waWNzL2NsYXVkZS1jbGknLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBlcm1pc3Npb25DaGVjayA9IGF3YWl0IGNoZWNrUmVwb3NpdG9yeVBlcm1pc3Npb25zKHJlcG9OYW1lKVxuXG4gICAgICBpZiAocGVybWlzc2lvbkNoZWNrLmVycm9yID09PSAncmVwb3NpdG9yeV9ub3RfZm91bmQnKSB7XG4gICAgICAgIHJlcG9XYXJuaW5ncy5wdXNoKHtcbiAgICAgICAgICB0aXRsZTogJ1JlcG9zaXRvcnkgbm90IGZvdW5kJyxcbiAgICAgICAgICBtZXNzYWdlOiBgUmVwb3NpdG9yeSAke3JlcG9OYW1lfSB3YXMgbm90IGZvdW5kIG9yIHlvdSBkb24ndCBoYXZlIGFjY2Vzcy5gLFxuICAgICAgICAgIGluc3RydWN0aW9uczogW1xuICAgICAgICAgICAgYENoZWNrIHRoYXQgdGhlIHJlcG9zaXRvcnkgbmFtZSBpcyBjb3JyZWN0OiAke3JlcG9OYW1lfWAsXG4gICAgICAgICAgICAnRW5zdXJlIHlvdSBoYXZlIGFjY2VzcyB0byB0aGlzIHJlcG9zaXRvcnknLFxuICAgICAgICAgICAgJ0ZvciBwcml2YXRlIHJlcG9zaXRvcmllcywgbWFrZSBzdXJlIHlvdXIgR2l0SHViIHRva2VuIGhhcyB0aGUgXCJyZXBvXCIgc2NvcGUnLFxuICAgICAgICAgICAgJ1lvdSBjYW4gYWRkIHRoZSByZXBvIHNjb3BlIHdpdGg6IGdoIGF1dGggcmVmcmVzaCAtaCBnaXRodWIuY29tIC1zIHJlcG8sd29ya2Zsb3cnLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2UgaWYgKCFwZXJtaXNzaW9uQ2hlY2suaGFzQWNjZXNzKSB7XG4gICAgICAgIHJlcG9XYXJuaW5ncy5wdXNoKHtcbiAgICAgICAgICB0aXRsZTogJ0FkbWluIHBlcm1pc3Npb25zIHJlcXVpcmVkJyxcbiAgICAgICAgICBtZXNzYWdlOiBgWW91IG1pZ2h0IG5lZWQgYWRtaW4gcGVybWlzc2lvbnMgb24gJHtyZXBvTmFtZX0gdG8gc2V0IHVwIEdpdEh1YiBBY3Rpb25zLmAsXG4gICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBbXG4gICAgICAgICAgICAnUmVwb3NpdG9yeSBhZG1pbnMgY2FuIGluc3RhbGwgR2l0SHViIEFwcHMgYW5kIHNldCBzZWNyZXRzJyxcbiAgICAgICAgICAgICdBc2sgYSByZXBvc2l0b3J5IGFkbWluIHRvIHJ1biB0aGlzIGNvbW1hbmQgaWYgc2V0dXAgZmFpbHMnLFxuICAgICAgICAgICAgJ0FsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIHRoZSBtYW51YWwgc2V0dXAgaW5zdHJ1Y3Rpb25zJyxcbiAgICAgICAgICBdLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCB3b3JrZmxvd0V4aXN0cyA9IGF3YWl0IGNoZWNrRXhpc3RpbmdXb3JrZmxvd0ZpbGUocmVwb05hbWUpXG5cbiAgICAgIGlmIChyZXBvV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBhbGxXYXJuaW5ncyA9IFsuLi5zdGF0ZS53YXJuaW5ncywgLi4ucmVwb1dhcm5pbmdzXVxuICAgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICBzZWxlY3RlZFJlcG9OYW1lOiByZXBvTmFtZSxcbiAgICAgICAgICB3b3JrZmxvd0V4aXN0cyxcbiAgICAgICAgICB3YXJuaW5nczogYWxsV2FybmluZ3MsXG4gICAgICAgICAgc3RlcDogJ3dhcm5pbmdzJyxcbiAgICAgICAgfSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0ZXBfY29tcGxldGVkJywge1xuICAgICAgICAgIHN0ZXA6ICdjaG9vc2UtcmVwbycgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgICAgfSlcbiAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoe1xuICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAgc2VsZWN0ZWRSZXBvTmFtZTogcmVwb05hbWUsXG4gICAgICAgICAgd29ya2Zsb3dFeGlzdHMsXG4gICAgICAgICAgc3RlcDogJ2luc3RhbGwtYXBwJyxcbiAgICAgICAgfSkpXG4gICAgICAgIHNldFRpbWVvdXQob3BlbkdpdEh1YkFwcEluc3RhbGxhdGlvbiwgMClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0YXRlLnN0ZXAgPT09ICdpbnN0YWxsLWFwcCcpIHtcbiAgICAgIGxvZ0V2ZW50KCd0ZW5ndV9pbnN0YWxsX2dpdGh1Yl9hcHBfc3RlcF9jb21wbGV0ZWQnLCB7XG4gICAgICAgIHN0ZXA6ICdpbnN0YWxsLWFwcCcgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgIH0pXG4gICAgICBpZiAoc3RhdGUud29ya2Zsb3dFeGlzdHMpIHtcbiAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzdGVwOiAnY2hlY2stZXhpc3Rpbmctd29ya2Zsb3cnIH0pKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzdGVwOiAnc2VsZWN0LXdvcmtmbG93cycgfSkpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5zdGVwID09PSAnY2hlY2stZXhpc3Rpbmctd29ya2Zsb3cnKSB7XG4gICAgICByZXR1cm5cbiAgICB9IGVsc2UgaWYgKHN0YXRlLnN0ZXAgPT09ICdzZWxlY3Qtd29ya2Zsb3dzJykge1xuICAgICAgLy8gSGFuZGxlZCBieSB0aGUgV29ya2Zsb3dNdWx0aXNlbGVjdERpYWxvZyBjb21wb25lbnRcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSBpZiAoc3RhdGUuc3RlcCA9PT0gJ2NoZWNrLWV4aXN0aW5nLXNlY3JldCcpIHtcbiAgICAgIGxvZ0V2ZW50KCd0ZW5ndV9pbnN0YWxsX2dpdGh1Yl9hcHBfc3RlcF9jb21wbGV0ZWQnLCB7XG4gICAgICAgIHN0ZXA6ICdjaGVjay1leGlzdGluZy1zZWNyZXQnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICB9KVxuICAgICAgaWYgKHN0YXRlLnVzZUV4aXN0aW5nU2VjcmV0KSB7XG4gICAgICAgIGF3YWl0IHJ1blNldHVwR2l0SHViQWN0aW9ucyhudWxsLCBzdGF0ZS5zZWNyZXROYW1lKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXNlciB3YW50cyB0byB1c2UgYSBuZXcgc2VjcmV0IG5hbWUgd2l0aCB0aGVpciBBUEkga2V5XG4gICAgICAgIGF3YWl0IHJ1blNldHVwR2l0SHViQWN0aW9ucyhzdGF0ZS5hcGlLZXlPck9BdXRoVG9rZW4sIHN0YXRlLnNlY3JldE5hbWUpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5zdGVwID09PSAnYXBpLWtleScpIHtcbiAgICAgIC8vIEluIHRoZSBuZXcgZmxvdywgYXBpLWtleSBzdGVwIG9ubHkgYXBwZWFycyB3aGVuIHVzZXIgaGFzIG5vIGV4aXN0aW5nIGtleVxuICAgICAgLy8gVGhleSBlaXRoZXIgZW50ZXJlZCBhIG5ldyBrZXkgb3Igd2lsbCBjcmVhdGUgT0F1dGggdG9rZW5cbiAgICAgIGlmIChzdGF0ZS5zZWxlY3RlZEFwaUtleU9wdGlvbiA9PT0gJ29hdXRoJykge1xuICAgICAgICAvLyBPQXV0aCBmbG93IGFscmVhZHkgaGFuZGxlZCBieSBoYW5kbGVDcmVhdGVPQXV0aFRva2VuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBJZiB1c2VyIHNlbGVjdGVkICdleGlzdGluZycgb3B0aW9uLCB1c2UgdGhlIGV4aXN0aW5nIEFQSSBrZXlcbiAgICAgIGNvbnN0IGFwaUtleVRvVXNlID1cbiAgICAgICAgc3RhdGUuc2VsZWN0ZWRBcGlLZXlPcHRpb24gPT09ICdleGlzdGluZydcbiAgICAgICAgICA/IGV4aXN0aW5nQXBpS2V5XG4gICAgICAgICAgOiBzdGF0ZS5hcGlLZXlPck9BdXRoVG9rZW5cblxuICAgICAgaWYgKCFhcGlLZXlUb1VzZSkge1xuICAgICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX2Vycm9yJywge1xuICAgICAgICAgIHJlYXNvbjpcbiAgICAgICAgICAgICdhcGlfa2V5X21pc3NpbmcnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgIH0pXG4gICAgICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgIHN0ZXA6ICdlcnJvcicsXG4gICAgICAgICAgZXJyb3I6ICdBUEkga2V5IGlzIHJlcXVpcmVkJyxcbiAgICAgICAgfSkpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZSB0aGUgQVBJIGtleSBiZWluZyB1c2VkIChlaXRoZXIgZXhpc3Rpbmcgb3IgbmV3bHkgZW50ZXJlZClcbiAgICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgYXBpS2V5T3JPQXV0aFRva2VuOiBhcGlLZXlUb1VzZSxcbiAgICAgICAgdXNlRXhpc3RpbmdLZXk6IHN0YXRlLnNlbGVjdGVkQXBpS2V5T3B0aW9uID09PSAnZXhpc3RpbmcnLFxuICAgICAgfSkpXG5cbiAgICAgIC8vIENoZWNrIGlmIEFOVEhST1BJQ19BUElfS0VZIHNlY3JldCBhbHJlYWR5IGV4aXN0c1xuICAgICAgY29uc3QgY2hlY2tTZWNyZXRzUmVzdWx0ID0gYXdhaXQgZXhlY0ZpbGVOb1Rocm93KCdnaCcsIFtcbiAgICAgICAgJ3NlY3JldCcsXG4gICAgICAgICdsaXN0JyxcbiAgICAgICAgJy0tYXBwJyxcbiAgICAgICAgJ2FjdGlvbnMnLFxuICAgICAgICAnLS1yZXBvJyxcbiAgICAgICAgc3RhdGUuc2VsZWN0ZWRSZXBvTmFtZSxcbiAgICAgIF0pXG5cbiAgICAgIGlmIChjaGVja1NlY3JldHNSZXN1bHQuY29kZSA9PT0gMCkge1xuICAgICAgICBjb25zdCBsaW5lcyA9IGNoZWNrU2VjcmV0c1Jlc3VsdC5zdGRvdXQuc3BsaXQoJ1xcbicpXG4gICAgICAgIGNvbnN0IGhhc0FudGhyb3BpY0tleSA9IGxpbmVzLnNvbWUoKGxpbmU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHJldHVybiAvXkFOVEhST1BJQ19BUElfS0VZXFxzKy8udGVzdChsaW5lKVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChoYXNBbnRocm9waWNLZXkpIHtcbiAgICAgICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0ZXBfY29tcGxldGVkJywge1xuICAgICAgICAgICAgc3RlcDogJ2FwaS1rZXknIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgc2VjcmV0RXhpc3RzOiB0cnVlLFxuICAgICAgICAgICAgc3RlcDogJ2NoZWNrLWV4aXN0aW5nLXNlY3JldCcsXG4gICAgICAgICAgfSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nRXZlbnQoJ3Rlbmd1X2luc3RhbGxfZ2l0aHViX2FwcF9zdGVwX2NvbXBsZXRlZCcsIHtcbiAgICAgICAgICAgIHN0ZXA6ICdhcGkta2V5JyBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLy8gTm8gZXhpc3Rpbmcgc2VjcmV0LCBwcm9jZWVkIHRvIGNyZWF0aW5nXG4gICAgICAgICAgYXdhaXQgcnVuU2V0dXBHaXRIdWJBY3Rpb25zKGFwaUtleVRvVXNlLCBzdGF0ZS5zZWNyZXROYW1lKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0ZXBfY29tcGxldGVkJywge1xuICAgICAgICAgIHN0ZXA6ICdhcGkta2V5JyBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgICAgICB9KVxuICAgICAgICAvLyBFcnJvciBjaGVja2luZyBzZWNyZXRzLCBwcm9jZWVkIGFueXdheVxuICAgICAgICBhd2FpdCBydW5TZXR1cEdpdEh1YkFjdGlvbnMoYXBpS2V5VG9Vc2UsIHN0YXRlLnNlY3JldE5hbWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlUmVwb1VybENoYW5nZSA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzZWxlY3RlZFJlcG9OYW1lOiB2YWx1ZSB9KSlcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUFwaUtleUNoYW5nZSA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBhcGlLZXlPck9BdXRoVG9rZW46IHZhbHVlIH0pKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlQXBpS2V5T3B0aW9uQ2hhbmdlID0gKG9wdGlvbjogJ2V4aXN0aW5nJyB8ICduZXcnIHwgJ29hdXRoJykgPT4ge1xuICAgIHNldFN0YXRlKHByZXYgPT4gKHsgLi4ucHJldiwgc2VsZWN0ZWRBcGlLZXlPcHRpb246IG9wdGlvbiB9KSlcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUNyZWF0ZU9BdXRoVG9rZW4gPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgbG9nRXZlbnQoJ3Rlbmd1X2luc3RhbGxfZ2l0aHViX2FwcF9zdGVwX2NvbXBsZXRlZCcsIHtcbiAgICAgIHN0ZXA6ICdhcGkta2V5JyBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgIH0pXG4gICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzdGVwOiAnb2F1dGgtZmxvdycgfSkpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IGhhbmRsZU9BdXRoU3VjY2VzcyA9IHVzZUNhbGxiYWNrKFxuICAgICh0b2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0ZXBfY29tcGxldGVkJywge1xuICAgICAgICBzdGVwOiAnb2F1dGgtZmxvdycgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgIH0pXG4gICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIGFwaUtleU9yT0F1dGhUb2tlbjogdG9rZW4sXG4gICAgICAgIHVzZUV4aXN0aW5nS2V5OiBmYWxzZSxcbiAgICAgICAgc2VjcmV0TmFtZTogJ0NMQVVERV9DT0RFX09BVVRIX1RPS0VOJyxcbiAgICAgICAgYXV0aFR5cGU6ICdvYXV0aF90b2tlbicsXG4gICAgICB9KSlcbiAgICAgIHZvaWQgcnVuU2V0dXBHaXRIdWJBY3Rpb25zKHRva2VuLCAnQ0xBVURFX0NPREVfT0FVVEhfVE9LRU4nKVxuICAgIH0sXG4gICAgW3J1blNldHVwR2l0SHViQWN0aW9uc10sXG4gIClcblxuICBjb25zdCBoYW5kbGVPQXV0aENhbmNlbCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRTdGF0ZShwcmV2ID0+ICh7IC4uLnByZXYsIHN0ZXA6ICdhcGkta2V5JyB9KSlcbiAgfSwgW10pXG5cbiAgY29uc3QgaGFuZGxlU2VjcmV0TmFtZUNoYW5nZSA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKHZhbHVlICYmICEvXlthLXpBLVowLTlfXSskLy50ZXN0KHZhbHVlKSkgcmV0dXJuXG4gICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzZWNyZXROYW1lOiB2YWx1ZSB9KSlcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVRvZ2dsZVVzZUN1cnJlbnRSZXBvID0gKHVzZUN1cnJlbnRSZXBvOiBib29sZWFuKSA9PiB7XG4gICAgc2V0U3RhdGUocHJldiA9PiAoe1xuICAgICAgLi4ucHJldixcbiAgICAgIHVzZUN1cnJlbnRSZXBvLFxuICAgICAgc2VsZWN0ZWRSZXBvTmFtZTogdXNlQ3VycmVudFJlcG8gPyBwcmV2LmN1cnJlbnRSZXBvIDogJycsXG4gICAgfSkpXG4gIH1cblxuICBjb25zdCBoYW5kbGVUb2dnbGVVc2VFeGlzdGluZ0tleSA9ICh1c2VFeGlzdGluZ0tleTogYm9vbGVhbikgPT4ge1xuICAgIHNldFN0YXRlKHByZXYgPT4gKHsgLi4ucHJldiwgdXNlRXhpc3RpbmdLZXkgfSkpXG4gIH1cblxuICBjb25zdCBoYW5kbGVUb2dnbGVVc2VFeGlzdGluZ1NlY3JldCA9ICh1c2VFeGlzdGluZ1NlY3JldDogYm9vbGVhbikgPT4ge1xuICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgIC4uLnByZXYsXG4gICAgICB1c2VFeGlzdGluZ1NlY3JldCxcbiAgICAgIHNlY3JldE5hbWU6IHVzZUV4aXN0aW5nU2VjcmV0ID8gJ0FOVEhST1BJQ19BUElfS0VZJyA6ICcnLFxuICAgIH0pKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlV29ya2Zsb3dBY3Rpb24gPSBhc3luYyAoYWN0aW9uOiAndXBkYXRlJyB8ICdza2lwJyB8ICdleGl0JykgPT4ge1xuICAgIGlmIChhY3Rpb24gPT09ICdleGl0Jykge1xuICAgICAgcHJvcHMub25Eb25lKCdJbnN0YWxsYXRpb24gY2FuY2VsbGVkIGJ5IHVzZXInKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbG9nRXZlbnQoJ3Rlbmd1X2luc3RhbGxfZ2l0aHViX2FwcF9zdGVwX2NvbXBsZXRlZCcsIHtcbiAgICAgIHN0ZXA6ICdjaGVjay1leGlzdGluZy13b3JrZmxvdycgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICB9KVxuXG4gICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCB3b3JrZmxvd0FjdGlvbjogYWN0aW9uIH0pKVxuXG4gICAgaWYgKGFjdGlvbiA9PT0gJ3NraXAnIHx8IGFjdGlvbiA9PT0gJ3VwZGF0ZScpIHtcbiAgICAgIC8vIENoZWNrIGlmIHVzZXIgaGFzIGV4aXN0aW5nIGxvY2FsIEFQSSBrZXlcbiAgICAgIGlmIChleGlzdGluZ0FwaUtleSkge1xuICAgICAgICBhd2FpdCBjaGVja0V4aXN0aW5nU2VjcmV0KClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vIGxvY2FsIGtleSwgZ28gc3RyYWlnaHQgdG8gQVBJIGtleSBzdGVwXG4gICAgICAgIHNldFN0YXRlKHByZXYgPT4gKHsgLi4ucHJldiwgc3RlcDogJ2FwaS1rZXknIH0pKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZURpc21pc3NLZXlEb3duKGU6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICBpZiAoc3RhdGUuc3RlcCA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX2NvbXBsZXRlZCcsIHt9KVxuICAgIH1cbiAgICBwcm9wcy5vbkRvbmUoXG4gICAgICBzdGF0ZS5zdGVwID09PSAnc3VjY2VzcydcbiAgICAgICAgPyAnR2l0SHViIEFjdGlvbnMgc2V0dXAgY29tcGxldGUhJ1xuICAgICAgICA6IHN0YXRlLmVycm9yXG4gICAgICAgICAgPyBgQ291bGRuJ3QgaW5zdGFsbCBHaXRIdWIgQXBwOiAke3N0YXRlLmVycm9yfVxcbkZvciBtYW51YWwgc2V0dXAgaW5zdHJ1Y3Rpb25zLCBzZWU6ICR7R0lUSFVCX0FDVElPTl9TRVRVUF9ET0NTX1VSTH1gXG4gICAgICAgICAgOiBgR2l0SHViIEFwcCBpbnN0YWxsYXRpb24gZmFpbGVkXFxuRm9yIG1hbnVhbCBzZXR1cCBpbnN0cnVjdGlvbnMsIHNlZTogJHtHSVRIVUJfQUNUSU9OX1NFVFVQX0RPQ1NfVVJMfWAsXG4gICAgKVxuICB9XG5cbiAgc3dpdGNoIChzdGF0ZS5zdGVwKSB7XG4gICAgY2FzZSAnY2hlY2stZ2gnOlxuICAgICAgcmV0dXJuIDxDaGVja0dpdEh1YlN0ZXAgLz5cbiAgICBjYXNlICd3YXJuaW5ncyc6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8V2FybmluZ3NTdGVwIHdhcm5pbmdzPXtzdGF0ZS53YXJuaW5nc30gb25Db250aW51ZT17aGFuZGxlU3VibWl0fSAvPlxuICAgICAgKVxuICAgIGNhc2UgJ2Nob29zZS1yZXBvJzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxDaG9vc2VSZXBvU3RlcFxuICAgICAgICAgIGN1cnJlbnRSZXBvPXtzdGF0ZS5jdXJyZW50UmVwb31cbiAgICAgICAgICB1c2VDdXJyZW50UmVwbz17c3RhdGUudXNlQ3VycmVudFJlcG99XG4gICAgICAgICAgcmVwb1VybD17c3RhdGUuc2VsZWN0ZWRSZXBvTmFtZX1cbiAgICAgICAgICBvblJlcG9VcmxDaGFuZ2U9e2hhbmRsZVJlcG9VcmxDaGFuZ2V9XG4gICAgICAgICAgb25Ub2dnbGVVc2VDdXJyZW50UmVwbz17aGFuZGxlVG9nZ2xlVXNlQ3VycmVudFJlcG99XG4gICAgICAgICAgb25TdWJtaXQ9e2hhbmRsZVN1Ym1pdH1cbiAgICAgICAgLz5cbiAgICAgIClcbiAgICBjYXNlICdpbnN0YWxsLWFwcCc6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8SW5zdGFsbEFwcFN0ZXBcbiAgICAgICAgICByZXBvVXJsPXtzdGF0ZS5zZWxlY3RlZFJlcG9OYW1lfVxuICAgICAgICAgIG9uU3VibWl0PXtoYW5kbGVTdWJtaXR9XG4gICAgICAgIC8+XG4gICAgICApXG4gICAgY2FzZSAnY2hlY2stZXhpc3Rpbmctd29ya2Zsb3cnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPEV4aXN0aW5nV29ya2Zsb3dTdGVwXG4gICAgICAgICAgcmVwb05hbWU9e3N0YXRlLnNlbGVjdGVkUmVwb05hbWV9XG4gICAgICAgICAgb25TZWxlY3RBY3Rpb249e2hhbmRsZVdvcmtmbG93QWN0aW9ufVxuICAgICAgICAvPlxuICAgICAgKVxuICAgIGNhc2UgJ2NoZWNrLWV4aXN0aW5nLXNlY3JldCc6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8Q2hlY2tFeGlzdGluZ1NlY3JldFN0ZXBcbiAgICAgICAgICB1c2VFeGlzdGluZ1NlY3JldD17c3RhdGUudXNlRXhpc3RpbmdTZWNyZXR9XG4gICAgICAgICAgc2VjcmV0TmFtZT17c3RhdGUuc2VjcmV0TmFtZX1cbiAgICAgICAgICBvblRvZ2dsZVVzZUV4aXN0aW5nU2VjcmV0PXtoYW5kbGVUb2dnbGVVc2VFeGlzdGluZ1NlY3JldH1cbiAgICAgICAgICBvblNlY3JldE5hbWVDaGFuZ2U9e2hhbmRsZVNlY3JldE5hbWVDaGFuZ2V9XG4gICAgICAgICAgb25TdWJtaXQ9e2hhbmRsZVN1Ym1pdH1cbiAgICAgICAgLz5cbiAgICAgIClcbiAgICBjYXNlICdhcGkta2V5JzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxBcGlLZXlTdGVwXG4gICAgICAgICAgZXhpc3RpbmdBcGlLZXk9e2V4aXN0aW5nQXBpS2V5fVxuICAgICAgICAgIHVzZUV4aXN0aW5nS2V5PXtzdGF0ZS51c2VFeGlzdGluZ0tleX1cbiAgICAgICAgICBhcGlLZXlPck9BdXRoVG9rZW49e3N0YXRlLmFwaUtleU9yT0F1dGhUb2tlbn1cbiAgICAgICAgICBvbkFwaUtleUNoYW5nZT17aGFuZGxlQXBpS2V5Q2hhbmdlfVxuICAgICAgICAgIG9uVG9nZ2xlVXNlRXhpc3RpbmdLZXk9e2hhbmRsZVRvZ2dsZVVzZUV4aXN0aW5nS2V5fVxuICAgICAgICAgIG9uU3VibWl0PXtoYW5kbGVTdWJtaXR9XG4gICAgICAgICAgb25DcmVhdGVPQXV0aFRva2VuPXtcbiAgICAgICAgICAgIGlzQW50aHJvcGljQXV0aEVuYWJsZWQoKSA/IGhhbmRsZUNyZWF0ZU9BdXRoVG9rZW4gOiB1bmRlZmluZWRcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZWN0ZWRPcHRpb249e3N0YXRlLnNlbGVjdGVkQXBpS2V5T3B0aW9ufVxuICAgICAgICAgIG9uU2VsZWN0T3B0aW9uPXtoYW5kbGVBcGlLZXlPcHRpb25DaGFuZ2V9XG4gICAgICAgIC8+XG4gICAgICApXG4gICAgY2FzZSAnY3JlYXRpbmcnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPENyZWF0aW5nU3RlcFxuICAgICAgICAgIGN1cnJlbnRXb3JrZmxvd0luc3RhbGxTdGVwPXtzdGF0ZS5jdXJyZW50V29ya2Zsb3dJbnN0YWxsU3RlcH1cbiAgICAgICAgICBzZWNyZXRFeGlzdHM9e3N0YXRlLnNlY3JldEV4aXN0c31cbiAgICAgICAgICB1c2VFeGlzdGluZ1NlY3JldD17c3RhdGUudXNlRXhpc3RpbmdTZWNyZXR9XG4gICAgICAgICAgc2VjcmV0TmFtZT17c3RhdGUuc2VjcmV0TmFtZX1cbiAgICAgICAgICBza2lwV29ya2Zsb3c9e3N0YXRlLndvcmtmbG93QWN0aW9uID09PSAnc2tpcCd9XG4gICAgICAgICAgc2VsZWN0ZWRXb3JrZmxvd3M9e3N0YXRlLnNlbGVjdGVkV29ya2Zsb3dzfVxuICAgICAgICAvPlxuICAgICAgKVxuICAgIGNhc2UgJ3N1Y2Nlc3MnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPEJveCB0YWJJbmRleD17MH0gYXV0b0ZvY3VzIG9uS2V5RG93bj17aGFuZGxlRGlzbWlzc0tleURvd259PlxuICAgICAgICAgIDxTdWNjZXNzU3RlcFxuICAgICAgICAgICAgc2VjcmV0RXhpc3RzPXtzdGF0ZS5zZWNyZXRFeGlzdHN9XG4gICAgICAgICAgICB1c2VFeGlzdGluZ1NlY3JldD17c3RhdGUudXNlRXhpc3RpbmdTZWNyZXR9XG4gICAgICAgICAgICBzZWNyZXROYW1lPXtzdGF0ZS5zZWNyZXROYW1lfVxuICAgICAgICAgICAgc2tpcFdvcmtmbG93PXtzdGF0ZS53b3JrZmxvd0FjdGlvbiA9PT0gJ3NraXAnfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvQm94PlxuICAgICAgKVxuICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxCb3ggdGFiSW5kZXg9ezB9IGF1dG9Gb2N1cyBvbktleURvd249e2hhbmRsZURpc21pc3NLZXlEb3dufT5cbiAgICAgICAgICA8RXJyb3JTdGVwXG4gICAgICAgICAgICBlcnJvcj17c3RhdGUuZXJyb3J9XG4gICAgICAgICAgICBlcnJvclJlYXNvbj17c3RhdGUuZXJyb3JSZWFzb259XG4gICAgICAgICAgICBlcnJvckluc3RydWN0aW9ucz17c3RhdGUuZXJyb3JJbnN0cnVjdGlvbnN9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9Cb3g+XG4gICAgICApXG4gICAgY2FzZSAnc2VsZWN0LXdvcmtmbG93cyc6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8V29ya2Zsb3dNdWx0aXNlbGVjdERpYWxvZ1xuICAgICAgICAgIGRlZmF1bHRTZWxlY3Rpb25zPXtzdGF0ZS5zZWxlY3RlZFdvcmtmbG93c31cbiAgICAgICAgICBvblN1Ym1pdD17c2VsZWN0ZWRXb3JrZmxvd3MgPT4ge1xuICAgICAgICAgICAgbG9nRXZlbnQoJ3Rlbmd1X2luc3RhbGxfZ2l0aHViX2FwcF9zdGVwX2NvbXBsZXRlZCcsIHtcbiAgICAgICAgICAgICAgc3RlcDogJ3NlbGVjdC13b3JrZmxvd3MnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoe1xuICAgICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgICBzZWxlY3RlZFdvcmtmbG93cyxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdXNlciBoYXMgZXhpc3RpbmcgbG9jYWwgQVBJIGtleVxuICAgICAgICAgICAgaWYgKGV4aXN0aW5nQXBpS2V5KSB7XG4gICAgICAgICAgICAgIHZvaWQgY2hlY2tFeGlzdGluZ1NlY3JldCgpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBObyBsb2NhbCBrZXksIGdvIHN0cmFpZ2h0IHRvIEFQSSBrZXkgc3RlcFxuICAgICAgICAgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7IC4uLnByZXYsIHN0ZXA6ICdhcGkta2V5JyB9KSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9fVxuICAgICAgICAvPlxuICAgICAgKVxuICAgIGNhc2UgJ29hdXRoLWZsb3cnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPE9BdXRoRmxvd1N0ZXBcbiAgICAgICAgICBvblN1Y2Nlc3M9e2hhbmRsZU9BdXRoU3VjY2Vzc31cbiAgICAgICAgICBvbkNhbmNlbD17aGFuZGxlT0F1dGhDYW5jZWx9XG4gICAgICAgIC8+XG4gICAgICApXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhbGwoXG4gIG9uRG9uZTogTG9jYWxKU1hDb21tYW5kT25Eb25lLFxuKTogUHJvbWlzZTxSZWFjdC5SZWFjdE5vZGU+IHtcbiAgcmV0dXJuIDxJbnN0YWxsR2l0SHViQXBwIG9uRG9uZT17b25Eb25lfSAvPlxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxLQUFLLFFBQVEsT0FBTztBQUM3QixPQUFPQyxLQUFLLElBQUlDLFdBQVcsRUFBRUMsUUFBUSxRQUFRLE9BQU87QUFDcEQsU0FDRSxLQUFLQywwREFBMEQsRUFDL0RDLFFBQVEsUUFDSCxpQ0FBaUM7QUFDeEMsU0FBU0MseUJBQXlCLFFBQVEsK0NBQStDO0FBQ3pGLFNBQVNDLDRCQUE0QixRQUFRLCtCQUErQjtBQUM1RSxT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O0FBRTFELFFBQVEsRUFBRSxHQUFHLENBQUM7SUFFVixLQUFLLE9BQU87TUFDVixPQUNFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQytDLG9CQUFvQixDQUFDO0FBQ3BFLFVBQVUsQ0FBQyxTQUFTLENBQ1IsS0FBSyxDQUFDLENBQUN4RSxLQUFLLENBQUNvQixLQUFLLENBQUMsQ0FDbkIsV0FBVyxDQUFDLENBQUNwQixLQUFLLENBQUNzQixXQUFXLENBQUMsQ0FDL0IsaUJBQWlCLENBQUMsQ0FBQ3RCLEtBQUssQ0FBQ3VCLGlCQUFpQixDQUFDO0FBRXZELFFBQVEsRUFBRSxHQUFHLENBQUM7SUFFVixLQUFLLGtCQUFrQjtNQUNyQixPQUNFLENBQUMseUJBQXlCLENBQ3hCLGlCQUFpQixDQUFDLENBQUN2QixLQUFLLENBQUNULGlCQUFpQixDQUFDLENBQzNDLFFBQVEsQ0FBQyxDQUFDQSxpQkFBaUIsSUFBSTtRQUM3QnpDLFFBQVEsQ0FBQyx5Q0FBeUMsRUFBRTtVQUNsRDZCLElBQUksRUFBRSxrQkFBa0IsSUFBSTlCO1FBQzlCLENBQUMsQ0FBQztRQUNGb0QsUUFBUSxDQUFDa0IsT0FBSSxLQUFLO1VBQ2hCLEdBQUdBLE9BQUk7VUFDUDVCO1FBQ0YsQ0FBQyxDQUFDLENBQUM7UUFDSDtRQUNBLElBQUlRLGNBQWMsRUFBRTtVQUNsQixLQUFLMkMsbUJBQW1CLENBQUMsQ0FBQztRQUM1QixDQUFDLE1BQU07VUFDTDtVQUNBekMsUUFBUSxDQUFDa0IsT0FBSSxLQUFLO1lBQUUsR0FBR0EsT0FBSTtZQUFFeEMsSUFBSSxFQUFFO1VBQVUsQ0FBQyxDQUFDLENBQUM7UUFDbEQ7TUFDRixDQUFDLENBQUMsR0FDRjtJQUVOLEtBQUssWUFBWTtNQUNmLE9BQ0UsQ0FBQyxhQUFhLENBQ1osU0FBUyxDQUFDLENBQUNvRixrQkFBa0IsQ0FBQyxDQUM5QixRQUFRLENBQUMsQ0FBQ0UsaUJBQWlCLENBQUMsR0FDNUI7RUFFUjtBQUNGO0FBRUEsT0FBTyxlQUFlVyxJQUFJQSxDQUN4QmhGLE1BQU0sRUFBRXhDLHFCQUFxQixDQUM5QixFQUFFNkUsT0FBTyxDQUFDdkYsS0FBSyxDQUFDb0QsU0FBUyxDQUFDLENBQUM7RUFDMUIsT0FBTyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDRixNQUFNLENBQUMsR0FBRztBQUM3QyIsImlnbm9yZUxpc3QiOltdfQ==
588
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJleGVjYSIsIlJlYWN0IiwidXNlQ2FsbGJhY2siLCJ1c2VTdGF0ZSIsIkFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMiLCJsb2dFdmVudCIsIldvcmtmbG93TXVsdGlzZWxlY3REaWFsb2ciLCJHSVRIVUJfQUNUSU9OX1NFVFVQX0RPQ1NfVVJMIiwidXNlRXhpdE9uQ3RybENEV2l0aEtleWJpbmRpbmdzIiwiS2V5Ym9hcmRFdmVudCIsIkJveCIsIkxvY2FsSlNYQ29tbWFuZE9uRG9uZSIsImdldEFudGhyb3BpY0FwaUtleSIsImlzQW50aHJvcGljQXV0aEVuYWJsZWQiLCJvcGVuQnJvd3NlciIsImV4ZWNGaWxlTm9UaHJvdyIsImdldEdpdGh1YlJlcG8iLCJwbHVyYWwiLCJBcGlLZXlTdGVwIiwiQ2hlY2tFeGlzdGluZ1NlY3JldFN0ZXAiLCJDaGVja0dpdEh1YlN0ZXAiLCJDaG9vc2VSZXBvU3RlcCIsIkNyZWF0aW5nU3RlcCIsIkVycm9yU3RlcCIsIkV4aXN0aW5nV29ya2Zsb3dTdGVwIiwiSW5zdGFsbEFwcFN0ZXAiLCJPQXV0aEZsb3dTdGVwIiwiU3VjY2Vzc1N0ZXAiLCJzZXR1cEdpdEh1YkFjdGlvbnMiLCJTdGF0ZSIsIldhcm5pbmciLCJXb3JrZmxvdyIsIldhcm5pbmdzU3RlcCIsIklOSVRJQUxfU1RBVEUiLCJzdGVwIiwic2VsZWN0ZWRSZXBvTmFtZSIsImN1cnJlbnRSZXBvIiwidXNlQ3VycmVudFJlcG8iLCJhcGlLZXlPck9BdXRoVG9rZW4iLCJ1c2VFeGlzdGluZ0tleSIsImN1cnJlbnRXb3JrZmxvd0luc3RhbGxTdGVwIiwid2FybmluZ3MiLCJzZWNyZXRFeGlzdHMiLCJzZWNyZXROYW1lIiwidXNlRXhpc3RpbmdTZWNyZXQiLCJ3b3JrZmxvd0V4aXN0cyIsInNlbGVjdGVkV29ya2Zsb3dzIiwic2VsZWN0ZWRBcGlLZXlPcHRpb24iLCJhdXRoVHlwZSIsIkluc3RhbGxHaXRIdWJBcHAiLCJwcm9wcyIsIm9uRG9uZSIsIm1lc3NhZ2UiLCJSZWFjdE5vZGUiLCJleGlzdGluZ0FwaUtleSIsInN0YXRlIiwic2V0U3RhdGUiLCJ1c2VFZmZlY3QiLCJjaGVja0dpdEh1YkNMSSIsImdoVmVyc2lvblJlc3VsdCIsInNoZWxsIiwicmVqZWN0IiwiZXhpdENvZGUiLCJwdXNoIiwidGl0bGUiLCJpbnN0cnVjdGlvbnMiLCJhdXRoUmVzdWx0IiwidG9rZW5TY29wZXNNYXRjaCIsInN0ZG91dCIsIm1hdGNoIiwic2NvcGVzIiwibWlzc2luZ1Njb3BlcyIsImluY2x1ZGVzIiwibGVuZ3RoIiwicHJldiIsImVycm9yIiwiam9pbiIsImVycm9yUmVhc29uIiwiZXJyb3JJbnN0cnVjdGlvbnMiLCJydW5TZXR1cEdpdEh1YkFjdGlvbnMiLCJ3b3JrZmxvd0FjdGlvbiIsImVycm9yTWVzc2FnZSIsIkVycm9yIiwicmVhc29uIiwib3BlbkdpdEh1YkFwcEluc3RhbGxhdGlvbiIsImluc3RhbGxVcmwiLCJjaGVja1JlcG9zaXRvcnlQZXJtaXNzaW9ucyIsInJlcG9OYW1lIiwiUHJvbWlzZSIsImhhc0FjY2VzcyIsInJlc3VsdCIsImNvZGUiLCJoYXNBZG1pbiIsInRyaW0iLCJzdGRlcnIiLCJjaGVja0V4aXN0aW5nV29ya2Zsb3dGaWxlIiwiY2hlY2tGaWxlUmVzdWx0IiwiY2hlY2tFeGlzdGluZ1NlY3JldCIsImNoZWNrU2VjcmV0c1Jlc3VsdCIsImxpbmVzIiwic3BsaXQiLCJoYXNBbnRocm9waWNLZXkiLCJzb21lIiwibGluZSIsInRlc3QiLCJoYW5kbGVTdWJtaXQiLCJzZXRUaW1lb3V0IiwicmVwb1dhcm5pbmdzIiwicmVwbGFjZSIsInBlcm1pc3Npb25DaGVjayIsImFsbFdhcm5pbmdzIiwiYXBpS2V5VG9Vc2UiLCJoYW5kbGVSZXBvVXJsQ2hhbmdlIiwidmFsdWUiLCJoYW5kbGVBcGlLZXlDaGFuZ2UiLCJoYW5kbGVBcGlLZXlPcHRpb25DaGFuZ2UiLCJvcHRpb24iLCJoYW5kbGVDcmVhdGVPQXV0aFRva2VuIiwiaGFuZGxlT0F1dGhTdWNjZXNzIiwidG9rZW4iLCJoYW5kbGVPQXV0aENhbmNlbCIsImhhbmRsZVNlY3JldE5hbWVDaGFuZ2UiLCJoYW5kbGVUb2dnbGVVc2VDdXJyZW50UmVwbyIsImhhbmRsZVRvZ2dsZVVzZUV4aXN0aW5nS2V5IiwiaGFuZGxlVG9nZ2xlVXNlRXhpc3RpbmdTZWNyZXQiLCJoYW5kbGVXb3JrZmxvd0FjdGlvbiIsImFjdGlvbiIsImhhbmRsZURpc21pc3NLZXlEb3duIiwiZSIsInByZXZlbnREZWZhdWx0IiwidW5kZWZpbmVkIiwiY2FsbCJdLCJzb3VyY2VzIjpbImluc3RhbGwtZ2l0aHViLWFwcC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY2EgfSBmcm9tICdleGVjYSdcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7XG4gIHR5cGUgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgbG9nRXZlbnQsXG59IGZyb20gJ3NyYy9zZXJ2aWNlcy9hbmFseXRpY3MvaW5kZXguanMnXG5pbXBvcnQgeyBXb3JrZmxvd011bHRpc2VsZWN0RGlhbG9nIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9Xb3JrZmxvd011bHRpc2VsZWN0RGlhbG9nLmpzJ1xuaW1wb3J0IHsgR0lUSFVCX0FDVElPTl9TRVRVUF9ET0NTX1VSTCB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9naXRodWItYXBwLmpzJ1xuaW1wb3J0IHsgdXNlRXhpdE9uQ3RybENEV2l0aEtleWJpbmRpbmdzIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlRXhpdE9uQ3RybENEV2l0aEtleWJpbmRpbmdzLmpzJ1xuaW1wb3J0IHR5cGUgeyBLZXlib2FyZEV2ZW50IH0gZnJvbSAnLi4vLi4vaW5rL2V2ZW50cy9rZXlib2FyZC1ldmVudC5qcydcbmltcG9ydCB7IEJveCB9IGZyb20gJy4uLy4uL2luay5qcydcbmltcG9ydCB0eXBlIHsgTG9jYWxKU1hDb21tYW5kT25Eb25lIH0gZnJvbSAnLi4vLi4vdHlwZXMvY29tbWFuZC5qcydcbmltcG9ydCB7IGdldEFudGhyb3BpY0FwaUtleSwgaXNBbnRocm9waWNBdXRoRW5hYmxlZCB9IGZyb20gJy4uLy4uL3V0aWxzL2F1dGguanMnXG5pbXBvcnQgeyBvcGVuQnJvd3NlciB9IGZyb20gJy4uLy4uL3V0aWxzL2Jyb3dzZXIuanMnXG5pbXBvcnQgeyBleGVjRmlsZU5vVGhyb3cgfSBmcm9tICcuLi8uLi91dGlscy9leGVjRmlsZU5vVGhyb3cuanMnXG5pbXBvcnQgeyBnZXRHaXRodWJSZXBvIH0gZnJvbSAnLi4vLi4vdXRpbHMvZ2l0LmpzJ1xuaW1wb3J0IHsgcGx1cmFsIH0gZnJvbSAnLi4vLi4vdXRpbHMvc3RyaW5nVXRpbHMuanMnXG5pbXBvcnQgeyBBcGlLZXlTdGVwIH0gZnJvbSAnLi9BcGlLZXlTdGVwLmpzJ1xuaW1wb3J0IHsgQ2hlY2tFeGlzdGluZ1NlY3JldFN0ZXAgfSBmcm9tICcuL0NoZWNrRXhpc3RpbmdTZWNyZXRTdGVwLmpzJ1xuaW1wb3J0IHsgQ2hlY2tHaXRIdWJTdGVwIH0gZnJvbSAnLi9DaGVja0dpdEh1YlN0ZXAuanMnXG5pbXBvcnQgeyBDaG9vc2VSZXBvU3RlcCB9IGZyb20gJy4vQ2hvb3NlUmVwb1N0ZXAuanMnXG5pbXBvcnQgeyBDcmVhdGluZ1N0ZXAgfSBmcm9tICcuL0NyZWF0aW5nU3RlcC5qcydcbmltcG9ydCB7IEVycm9yU3RlcCB9IGZyb20gJy4vRXJyb3JTdGVwLmpzJ1xuaW1wb3J0IHsgRXhpc3RpbmdXb3JrZmxvd1N0ZXAgfSBmcm9tICcuL0V4aXN0aW5nV29ya2Zsb3dTdGVwLmpzJ1xuaW1wb3J0IHsgSW5zdGFsbEFwcFN0ZXAgfSBmcm9tICcuL0luc3RhbGxBcHBTdGVwLmpzJ1xuaW1wb3J0IHsgT0F1dGhGbG93U3RlcCB9IGZyb20gJy4vT0F1dGhGbG93U3RlcC5qcydcbmltcG9ydCB7IFN1Y2Nlc3NTdGVwIH0gZnJvbSAnLi9TdWNjZXNzU3RlcC5qcydcbmltcG9ydCB7IHNldHVwR2l0SHViQWN0aW9ucyB9IGZyb20gJy4vc2V0dXBHaXRIdWJBY3Rpb25zLmpzJ1xuaW1wb3J0IHR5cGUgeyBTdGF0ZSwgV2FybmluZywgV29ya2Zsb3cgfSBmcm9tICcuL3R5cGVzLmpzJ1xuaW1wb3J0IHsgV2FybmluZ3NTdGVwIH0gZnJvbSAnLi9XYXJuaW5nc1N0ZXAuanMnXG5cbmNvbnN0IElOSVRJQUxfU1RBVEU6IFN0YXRlID0ge1xuICBzdGVwOiAnY2hlY2stZ2gnLFxuICBzZWxlY3RlZFJlcG9OYW1lOiAnJyxcbiAgY3VycmVudFJlcG86ICcnLFxuICB1c2VDdXJyZW50UmVwbzogZmFsc2UsIC8vIERlZmF1bHQgdG8gZmFsc2UsIHdpbGwgYmUgc2V0IHRvIHRydWUgaWYgcmVwbyBkZXRlY3RlZFxuICBhcGlLZXlPck9BdXRoVG9rZW46ICcnLFxuICB1c2VFeGlzdGluZ0tleTogdHJ1ZSxcbiAgY3VycmVudFdvcmtmbG93SW5zdGFsbFN0ZXA6IDAsXG4gIHdhcm5pbmdzOiBbXSxcbiAgc2VjcmV0RXhpc3RzOiBmYWxzZSxcbiAgc2VjcmV0TmFtZTogJ0FOVEhST1BJQ19BUElfS0VZJyxcbiAgdXNlRXhpc3RpbmdTZWNyZXQ6IHRydWUsXG4gIHdvcmtmbG93RXhpc3RzOiBmYWxzZSxcbiAgc2VsZWN0ZWRXb3JrZmxvd3M6IFsnY2xhdWRlJywgJ2NsYXVkZS1yZXZpZXcnXSBhcyBXb3JrZmxvd1tdLFxuICBzZWxlY3RlZEFwaUtleU9wdGlvbjogJ25ldycgYXMgJ2V4aXN0aW5nJyB8ICduZXcnIHwgJ29hdXRoJyxcbiAgYXV0aFR5cGU6ICdhcGlfa2V5Jyxcbn1cblxuZnVuY3Rpb24gSW5zdGFsbEdpdEh1YkFwcChwcm9wczoge1xuICBvbkRvbmU6IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWRcbn0pOiBSZWFjdC5SZWFjdE5vZGUge1xuICBjb25zdCBbZXhpc3RpbmdBcGlLZXldID0gdXNlU3RhdGUoKCkgPT4gZ2V0QW50aHJvcGljQXBpS2V5KCkpXG4gIGNvbnN0IFtzdGF0ZSwgc2V0U3RhdGVdID0gdXNlU3RhdGUoe1xuICAgIC4uLklOSVRJQUxfU1RBVEUsXG4gICAgdXNlRXhpc3RpbmdLZXk6ICEhZXhpc3RpbmdBcGlLZXksXG4gICAgc2VsZWN0ZWRBcGlLZXlPcHRpb246IChleGlzdGluZ0FwaUtleVxuICAgICAgPyAnZXhpc3RpbmcnXG4gICAgICA6IGlzQW50aHJvcGljQXV0aEVuYWJsZWQoKVxuICAgICAgICA/ICdvYXV0aCdcbiAgICAgICAgOiAnbmV3JykgYXMgJ2V4aXN0aW5nJyB8ICduZXcnIHwgJ29hdXRoJyxcbiAgfSlcbiAgdXNlRXhpdE9uQ3RybENEV2l0aEtleWJpbmRpbmdzKClcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxvZ0V2ZW50KCd0ZW5ndV9pbnN0YWxsX2dpdGh1Yl9hcHBfc3RhcnRlZCcsIHt9KVxuICB9LCBbXSlcblxuICBjb25zdCBjaGVja0dpdEh1YkNMSSA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB3YXJuaW5nczogV2FybmluZ1tdID0gW11cblxuICAgIC8vIENoZWNrIGlmIGdoIGlzIGluc3RhbGxlZFxuICAgIGNvbnN0IGdoVmVyc2lvblJlc3VsdCA9IGF3YWl0IGV4ZWNhKCdnaCAtLXZlcnNpb24nLCB7XG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHJlamVjdDogZmFsc2UsXG4gICAgfSlcbiAgICBpZiAoZ2hWZXJzaW9uUmVzdWx0LmV4aXRDb2RlICE9PSAwKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKHtcbiAgICAgICAgdGl0bGU6ICdHaXRIdWIgQ0xJIG5vdCBmb3VuZCcsXG4gICAgICAgIG1lc3NhZ2U6XG4gICAgICAgICAgJ0dpdEh1YiBDTEkgKGdoKSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgaW5zdGFsbGVkIG9yIGFjY2Vzc2libGUuJyxcbiAgICAgICAgaW5zdHJ1Y3Rpb25zOiBbXG4gICAgICAgICAgJ0luc3RhbGwgR2l0SHViIENMSSBmcm9tIGh0dHBzOi8vY2xpLmdpdGh1Yi5jb20vJyxcbiAgICAgICAgICAnbWFjT1M6IGJyZXcgaW5zdGFsbCBnaCcsXG4gICAgICAgICAgJ1dpbmRvd3M6IHdpbmdldCBpbnN0YWxsIC0taWQgR2l0SHViLmNsaScsXG4gICAgICAgICAgJ0xpbnV4OiBTZWUgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBhdCBodHRwczovL2dpdGh1Yi5jb20vY2xpL2NsaSNpbnN0YWxsYXRpb24nLFxuICAgICAgICBdLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBDaGVjayBhdXRoIHN0YXR1c1xuICAgIGNvbnN0IGF1dGhSZXN1bHQgPSBhd2FpdCBleGVjYSgnZ2ggYXV0aCBzdGF0dXMgLWEnLCB7XG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHJlamVjdDogZmFsc2UsXG4gICAgfSlcbiAgICBpZiAoYXV0aFJlc3VsdC5leGl0Q29kZSAhPT0gMCkge1xuICAgICAgd2FybmluZ3MucHVzaCh7XG4gICAgICAgIHRpdGxlOiAnR2l0SHViIENMSSBub3QgYXV0aGVudGljYXRlZCcsXG4gICAgICAgIG1lc3NhZ2U6ICdHaXRIdWIgQ0xJIGRvZXMgbm90IGFwcGVhciB0byBiZSBhdXRoZW50aWNhdGVkLicsXG4gICAgICAgIGluc3RydWN0aW9uczogW1xuICAgICAgICAgICdSdW46IGdoIGF1dGggbG9naW4nLFxuICAgICAgICAgICdGb2xsb3cgdGhlIHByb21wdHMgdG8gYXV0aGVudGljYXRlIHdpdGggR2l0SHViJyxcbiAgICAgICAgICAnT3Igc2V0IHVwIGF1dGhlbnRpY2F0aW9uIHVzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBvciBvdGhlciBtZXRob2RzJyxcbiAgICAgICAgXSxcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENoZWNrIGlmIHJlcXVpcmVkIHNjb3BlcyBhcmUgcHJlc2VudCBpbiB0aGUgVG9rZW4gc2NvcGVzIGxpbmVcbiAgICAgIGNvbnN0IHRva2VuU2NvcGVzTWF0Y2ggPSBhdXRoUmVzdWx0LnN0ZG91dC5tYXRjaCgvVG9rZW4gc2NvcGVzOi4qJC9tKVxuICAgICAgaWYgKHRva2VuU2NvcGVzTWF0Y2gpIHtcbiAgICAgICAgY29uc3Qgc2NvcGVzID0gdG9rZW5TY29wZXNNYXRjaFswXVxuICAgICAgICBjb25zdCBtaXNzaW5nU2NvcGVzOiBzdHJpbmdbXSA9IFtdXG5cbiAgICAgICAgaWYgKCFzY29wZXMuaW5jbHVkZXMoJ3JlcG8nKSkge1xuICAgICAgICAgIG1pc3NpbmdTY29wZXMucHVzaCgncmVwbycpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzY29wZXMuaW5jbHVkZXMoJ3dvcmtmbG93JykpIHtcbiAgICAgICAgICBtaXNzaW5nU2NvcGVzLnB1c2goJ3dvcmtmbG93JylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtaXNzaW5nU2NvcGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBNaXNzaW5nIHJlcXVpcmVkIHNjb3BlcyAtIGV4aXQgaW1tZWRpYXRlbHlcbiAgICAgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgc3RlcDogJ2Vycm9yJyxcbiAgICAgICAgICAgIGVycm9yOiBgR2l0SHViIENMSSBpcyBtaXNzaW5nIHJlcXVpcmVkIHBlcm1pc3Npb25zOiAke21pc3NpbmdTY29wZXMuam9pbignLCAnKX0uYCxcbiAgICAgICAgICAgIGVycm9yUmVhc29uOiAnTWlzc2luZyByZXF1aXJlZCBzY29wZXMnLFxuICAgICAgICAgICAgZXJyb3JJbnN0cnVjdGlvbnM6IFtcbiAgICAgICAgICAgICAgYFlvdXIgR2l0SHViIENMSSBhdXRoZW50aWNhdGlvbiBpcyBtaXNzaW5nIHRoZSBcIiR7bWlzc2luZ1Njb3Blcy5qb2luKCdcIiBhbmQgXCInKX1cIiAke3BsdXJhbChtaXNzaW5nU2NvcGVzLmxlbmd0aCwgJ3Njb3BlJyl9IG5lZWRlZCB0byBtYW5hZ2UgR2l0SHViIEFjdGlvbnMgYW5kIHNlY3JldHMuYCxcbiAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICdUbyBmaXggdGhpcywgcnVuOicsXG4gICAgICAgICAgICAgICcgIGdoIGF1dGggcmVmcmVzaCAtaCBnaXRodWIuY29tIC1zIHJlcG8sd29ya2Zsb3cnLFxuICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgJ1RoaXMgd2lsbCBhZGQgdGhlIG5lY2Vzc2FyeSBwZXJtaXNzaW9ucyB0byBtYW5hZ2Ugd29ya2Zsb3dzIGFuZCBzZWNyZXRzLicsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgaW4gYSBnaXQgcmVwbyBhbmQgZ2V0IHJlbW90ZSBVUkxcbiAgICBjb25zdCBjdXJyZW50UmVwbyA9IChhd2FpdCBnZXRHaXRodWJSZXBvKCkpID8/ICcnXG5cbiAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0ZXBfY29tcGxldGVkJywge1xuICAgICAgc3RlcDogJ2NoZWNrLWdoJyBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgIH0pXG5cbiAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAuLi5wcmV2LFxuICAgICAgd2FybmluZ3MsXG4gICAgICBjdXJyZW50UmVwbyxcbiAgICAgIHNlbGVjdGVkUmVwb05hbWU6IGN1cnJlbnRSZXBvLFxuICAgICAgdXNlQ3VycmVudFJlcG86ICEhY3VycmVudFJlcG8sIC8vIFNldCB0byBmYWxzZSBpZiBubyByZXBvIGRldGVjdGVkXG4gICAgICBzdGVwOiB3YXJuaW5ncy5sZW5ndGggPiAwID8gJ3dhcm5pbmdzJyA6ICdjaG9vc2UtcmVwbycsXG4gICAgfSkpXG4gIH0sIFtdKVxuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHN0YXRlLnN0ZXAgPT09ICdjaGVjay1naCcpIHtcbiAgICAgIHZvaWQgY2hlY2tHaXRIdWJDTEkoKVxuICAgIH1cbiAgfSwgW3N0YXRlLnN0ZXAsIGNoZWNrR2l0SHViQ0xJXSlcblxuICBjb25zdCBydW5TZXR1cEdpdEh1YkFjdGlvbnMgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoYXBpS2V5T3JPQXV0aFRva2VuOiBzdHJpbmcgfCBudWxsLCBzZWNyZXROYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgc3RlcDogJ2NyZWF0aW5nJyxcbiAgICAgICAgY3VycmVudFdvcmtmbG93SW5zdGFsbFN0ZXA6IDAsXG4gICAgICB9KSlcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2V0dXBHaXRIdWJBY3Rpb25zKFxuICAgICAgICAgIHN0YXRlLnNlbGVjdGVkUmVwb05hbWUsXG4gICAgICAgICAgYXBpS2V5T3JPQXV0aFRva2VuLFxuICAgICAgICAgIHNlY3JldE5hbWUsXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoe1xuICAgICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgICBjdXJyZW50V29ya2Zsb3dJbnN0YWxsU3RlcDogcHJldi5jdXJyZW50V29ya2Zsb3dJbnN0YWxsU3RlcCArIDEsXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXRlLndvcmtmbG93QWN0aW9uID09PSAnc2tpcCcsXG4gICAgICAgICAgc3RhdGUuc2VsZWN0ZWRXb3JrZmxvd3MsXG4gICAgICAgICAgc3RhdGUuYXV0aFR5cGUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdXNlQ3VycmVudFJlcG86IHN0YXRlLnVzZUN1cnJlbnRSZXBvLFxuICAgICAgICAgICAgd29ya2Zsb3dFeGlzdHM6IHN0YXRlLndvcmtmbG93RXhpc3RzLFxuICAgICAgICAgICAgc2VjcmV0RXhpc3RzOiBzdGF0ZS5zZWNyZXRFeGlzdHMsXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0ZXBfY29tcGxldGVkJywge1xuICAgICAgICAgIHN0ZXA6ICdjcmVhdGluZycgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgICAgfSlcbiAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzdGVwOiAnc3VjY2VzcycgfSkpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPVxuICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3JcbiAgICAgICAgICAgID8gZXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgOiAnRmFpbGVkIHRvIHNldCB1cCBHaXRIdWIgQWN0aW9ucydcblxuICAgICAgICBpZiAoZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCd3b3JrZmxvdyBmaWxlIGFscmVhZHkgZXhpc3RzJykpIHtcbiAgICAgICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX2Vycm9yJywge1xuICAgICAgICAgICAgcmVhc29uOlxuICAgICAgICAgICAgICAnd29ya2Zsb3dfZmlsZV9leGlzdHMnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgc3RlcDogJ2Vycm9yJyxcbiAgICAgICAgICAgIGVycm9yOiAnQSBDbGF1ZGUgd29ya2Zsb3cgZmlsZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIHJlcG9zaXRvcnkuJyxcbiAgICAgICAgICAgIGVycm9yUmVhc29uOiAnV29ya2Zsb3cgZmlsZSBjb25mbGljdCcsXG4gICAgICAgICAgICBlcnJvckluc3RydWN0aW9uczogW1xuICAgICAgICAgICAgICAnVGhlIGZpbGUgLmdpdGh1Yi93b3JrZmxvd3MvY2xhdWRlLnltbCBhbHJlYWR5IGV4aXN0cycsXG4gICAgICAgICAgICAgICdZb3UgY2FuIGVpdGhlcjonLFxuICAgICAgICAgICAgICAnICAxLiBEZWxldGUgdGhlIGV4aXN0aW5nIGZpbGUgYW5kIHJ1biB0aGlzIGNvbW1hbmQgYWdhaW4nLFxuICAgICAgICAgICAgICAnICAyLiBVcGRhdGUgdGhlIGV4aXN0aW5nIGZpbGUgbWFudWFsbHkgdXNpbmcgdGhlIHRlbXBsYXRlIGZyb206JyxcbiAgICAgICAgICAgICAgYCAgICAgJHtHSVRIVUJfQUNUSU9OX1NFVFVQX0RPQ1NfVVJMfWAsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ0V2ZW50KCd0ZW5ndV9pbnN0YWxsX2dpdGh1Yl9hcHBfZXJyb3InLCB7XG4gICAgICAgICAgICByZWFzb246XG4gICAgICAgICAgICAgICdzZXR1cF9naXRodWJfYWN0aW9uc19mYWlsZWQnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAgICBzdGVwOiAnZXJyb3InLFxuICAgICAgICAgICAgZXJyb3I6IGVycm9yTWVzc2FnZSxcbiAgICAgICAgICAgIGVycm9yUmVhc29uOiAnR2l0SHViIEFjdGlvbnMgc2V0dXAgZmFpbGVkJyxcbiAgICAgICAgICAgIGVycm9ySW5zdHJ1Y3Rpb25zOiBbXSxcbiAgICAgICAgICB9KSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW1xuICAgICAgc3RhdGUuc2VsZWN0ZWRSZXBvTmFtZSxcbiAgICAgIHN0YXRlLndvcmtmbG93QWN0aW9uLFxuICAgICAgc3RhdGUuc2VsZWN0ZWRXb3JrZmxvd3MsXG4gICAgICBzdGF0ZS51c2VDdXJyZW50UmVwbyxcbiAgICAgIHN0YXRlLndvcmtmbG93RXhpc3RzLFxuICAgICAgc3RhdGUuc2VjcmV0RXhpc3RzLFxuICAgICAgc3RhdGUuYXV0aFR5cGUsXG4gICAgXSxcbiAgKVxuXG4gIGFzeW5jIGZ1bmN0aW9uIG9wZW5HaXRIdWJBcHBJbnN0YWxsYXRpb24oKSB7XG4gICAgY29uc3QgaW5zdGFsbFVybCA9ICdodHRwczovL2dpdGh1Yi5jb20vYXBwcy9jbGF1ZGUnXG4gICAgYXdhaXQgb3BlbkJyb3dzZXIoaW5zdGFsbFVybClcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNoZWNrUmVwb3NpdG9yeVBlcm1pc3Npb25zKFxuICAgIHJlcG9OYW1lOiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBoYXNBY2Nlc3M6IGJvb2xlYW47IGVycm9yPzogc3RyaW5nIH0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY0ZpbGVOb1Rocm93KCdnaCcsIFtcbiAgICAgICAgJ2FwaScsXG4gICAgICAgIGByZXBvcy8ke3JlcG9OYW1lfWAsXG4gICAgICAgICctLWpxJyxcbiAgICAgICAgJy5wZXJtaXNzaW9ucy5hZG1pbicsXG4gICAgICBdKVxuXG4gICAgICBpZiAocmVzdWx0LmNvZGUgPT09IDApIHtcbiAgICAgICAgY29uc3QgaGFzQWRtaW4gPSByZXN1bHQuc3Rkb3V0LnRyaW0oKSA9PT0gJ3RydWUnXG4gICAgICAgIHJldHVybiB7IGhhc0FjY2VzczogaGFzQWRtaW4gfVxuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHJlc3VsdC5zdGRlcnIuaW5jbHVkZXMoJzQwNCcpIHx8XG4gICAgICAgIHJlc3VsdC5zdGRlcnIuaW5jbHVkZXMoJ05vdCBGb3VuZCcpXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBoYXNBY2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiAncmVwb3NpdG9yeV9ub3RfZm91bmQnLFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGhhc0FjY2VzczogZmFsc2UgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHsgaGFzQWNjZXNzOiBmYWxzZSB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY2hlY2tFeGlzdGluZ1dvcmtmbG93RmlsZShyZXBvTmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY2hlY2tGaWxlUmVzdWx0ID0gYXdhaXQgZXhlY0ZpbGVOb1Rocm93KCdnaCcsIFtcbiAgICAgICdhcGknLFxuICAgICAgYHJlcG9zLyR7cmVwb05hbWV9L2NvbnRlbnRzLy5naXRodWIvd29ya2Zsb3dzL2NsYXVkZS55bWxgLFxuICAgICAgJy0tanEnLFxuICAgICAgJy5zaGEnLFxuICAgIF0pXG5cbiAgICByZXR1cm4gY2hlY2tGaWxlUmVzdWx0LmNvZGUgPT09IDBcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNoZWNrRXhpc3RpbmdTZWNyZXQoKSB7XG4gICAgY29uc3QgY2hlY2tTZWNyZXRzUmVzdWx0ID0gYXdhaXQgZXhlY0ZpbGVOb1Rocm93KCdnaCcsIFtcbiAgICAgICdzZWNyZXQnLFxuICAgICAgJ2xpc3QnLFxuICAgICAgJy0tYXBwJyxcbiAgICAgICdhY3Rpb25zJyxcbiAgICAgICctLXJlcG8nLFxuICAgICAgc3RhdGUuc2VsZWN0ZWRSZXBvTmFtZSxcbiAgICBdKVxuXG4gICAgaWYgKGNoZWNrU2VjcmV0c1Jlc3VsdC5jb2RlID09PSAwKSB7XG4gICAgICBjb25zdCBsaW5lcyA9IGNoZWNrU2VjcmV0c1Jlc3VsdC5zdGRvdXQuc3BsaXQoJ1xcbicpXG4gICAgICBjb25zdCBoYXNBbnRocm9waWNLZXkgPSBsaW5lcy5zb21lKChsaW5lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuIC9eQU5USFJPUElDX0FQSV9LRVlcXHMrLy50ZXN0KGxpbmUpXG4gICAgICB9KVxuXG4gICAgICBpZiAoaGFzQW50aHJvcGljS2V5KSB7XG4gICAgICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgIHNlY3JldEV4aXN0czogdHJ1ZSxcbiAgICAgICAgICBzdGVwOiAnY2hlY2stZXhpc3Rpbmctc2VjcmV0JyxcbiAgICAgICAgfSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBObyBleGlzdGluZyBzZWNyZXQgZm91bmRcbiAgICAgICAgaWYgKGV4aXN0aW5nQXBpS2V5KSB7XG4gICAgICAgICAgLy8gVXNlciBoYXMgbG9jYWwga2V5LCBza2lwIHRvIGNyZWF0aW5nIHdpdGggaXRcbiAgICAgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgYXBpS2V5T3JPQXV0aFRva2VuOiBleGlzdGluZ0FwaUtleSxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nS2V5OiB0cnVlLFxuICAgICAgICAgIH0pKVxuICAgICAgICAgIGF3YWl0IHJ1blNldHVwR2l0SHViQWN0aW9ucyhleGlzdGluZ0FwaUtleSwgc3RhdGUuc2VjcmV0TmFtZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBObyBsb2NhbCBrZXksIGdvIHRvIEFQSSBrZXkgc3RlcFxuICAgICAgICAgIHNldFN0YXRlKHByZXYgPT4gKHsgLi4ucHJldiwgc3RlcDogJ2FwaS1rZXknIH0pKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEVycm9yIGNoZWNraW5nIHNlY3JldHNcbiAgICAgIGlmIChleGlzdGluZ0FwaUtleSkge1xuICAgICAgICAvLyBVc2VyIGhhcyBsb2NhbCBrZXksIHNraXAgdG8gY3JlYXRpbmcgd2l0aCBpdFxuICAgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICBhcGlLZXlPck9BdXRoVG9rZW46IGV4aXN0aW5nQXBpS2V5LFxuICAgICAgICAgIHVzZUV4aXN0aW5nS2V5OiB0cnVlLFxuICAgICAgICB9KSlcbiAgICAgICAgYXdhaXQgcnVuU2V0dXBHaXRIdWJBY3Rpb25zKGV4aXN0aW5nQXBpS2V5LCBzdGF0ZS5zZWNyZXROYW1lKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm8gbG9jYWwga2V5LCBnbyB0byBBUEkga2V5IHN0ZXBcbiAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzdGVwOiAnYXBpLWtleScgfSkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlU3VibWl0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmIChzdGF0ZS5zdGVwID09PSAnd2FybmluZ3MnKSB7XG4gICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0ZXBfY29tcGxldGVkJywge1xuICAgICAgICBzdGVwOiAnd2FybmluZ3MnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICB9KVxuICAgICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzdGVwOiAnaW5zdGFsbC1hcHAnIH0pKVxuICAgICAgc2V0VGltZW91dChvcGVuR2l0SHViQXBwSW5zdGFsbGF0aW9uLCAwKVxuICAgIH0gZWxzZSBpZiAoc3RhdGUuc3RlcCA9PT0gJ2Nob29zZS1yZXBvJykge1xuICAgICAgbGV0IHJlcG9OYW1lID0gc3RhdGUudXNlQ3VycmVudFJlcG9cbiAgICAgICAgPyBzdGF0ZS5jdXJyZW50UmVwb1xuICAgICAgICA6IHN0YXRlLnNlbGVjdGVkUmVwb05hbWVcblxuICAgICAgaWYgKCFyZXBvTmFtZS50cmltKCkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcG9XYXJuaW5nczogV2FybmluZ1tdID0gW11cblxuICAgICAgaWYgKHJlcG9OYW1lLmluY2x1ZGVzKCdnaXRodWIuY29tJykpIHtcbiAgICAgICAgY29uc3QgbWF0Y2ggPSByZXBvTmFtZS5tYXRjaCgvZ2l0aHViXFwuY29tWzovXShbXi9dK1xcL1teL10rKShcXC5naXQpPyQvKVxuICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgcmVwb1dhcm5pbmdzLnB1c2goe1xuICAgICAgICAgICAgdGl0bGU6ICdJbnZhbGlkIEdpdEh1YiBVUkwgZm9ybWF0JyxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdUaGUgcmVwb3NpdG9yeSBVUkwgZm9ybWF0IGFwcGVhcnMgdG8gYmUgaW52YWxpZC4nLFxuICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBbXG4gICAgICAgICAgICAgICdVc2UgZm9ybWF0OiBvd25lci9yZXBvIG9yIGh0dHBzOi8vZ2l0aHViLmNvbS9vd25lci9yZXBvJyxcbiAgICAgICAgICAgICAgJ0V4YW1wbGU6IGFudGhyb3BpY3MvY2xhdWRlLWNsaScsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVwb05hbWUgPSBtYXRjaFsxXT8ucmVwbGFjZSgvXFwuZ2l0JC8sICcnKSB8fCAnJ1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghcmVwb05hbWUuaW5jbHVkZXMoJy8nKSkge1xuICAgICAgICByZXBvV2FybmluZ3MucHVzaCh7XG4gICAgICAgICAgdGl0bGU6ICdSZXBvc2l0b3J5IGZvcm1hdCB3YXJuaW5nJyxcbiAgICAgICAgICBtZXNzYWdlOiAnUmVwb3NpdG9yeSBzaG91bGQgYmUgaW4gZm9ybWF0IFwib3duZXIvcmVwb1wiJyxcbiAgICAgICAgICBpbnN0cnVjdGlvbnM6IFtcbiAgICAgICAgICAgICdVc2UgZm9ybWF0OiBvd25lci9yZXBvJyxcbiAgICAgICAgICAgICdFeGFtcGxlOiBhbnRocm9waWNzL2NsYXVkZS1jbGknLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBlcm1pc3Npb25DaGVjayA9IGF3YWl0IGNoZWNrUmVwb3NpdG9yeVBlcm1pc3Npb25zKHJlcG9OYW1lKVxuXG4gICAgICBpZiAocGVybWlzc2lvbkNoZWNrLmVycm9yID09PSAncmVwb3NpdG9yeV9ub3RfZm91bmQnKSB7XG4gICAgICAgIHJlcG9XYXJuaW5ncy5wdXNoKHtcbiAgICAgICAgICB0aXRsZTogJ1JlcG9zaXRvcnkgbm90IGZvdW5kJyxcbiAgICAgICAgICBtZXNzYWdlOiBgUmVwb3NpdG9yeSAke3JlcG9OYW1lfSB3YXMgbm90IGZvdW5kIG9yIHlvdSBkb24ndCBoYXZlIGFjY2Vzcy5gLFxuICAgICAgICAgIGluc3RydWN0aW9uczogW1xuICAgICAgICAgICAgYENoZWNrIHRoYXQgdGhlIHJlcG9zaXRvcnkgbmFtZSBpcyBjb3JyZWN0OiAke3JlcG9OYW1lfWAsXG4gICAgICAgICAgICAnRW5zdXJlIHlvdSBoYXZlIGFjY2VzcyB0byB0aGlzIHJlcG9zaXRvcnknLFxuICAgICAgICAgICAgJ0ZvciBwcml2YXRlIHJlcG9zaXRvcmllcywgbWFrZSBzdXJlIHlvdXIgR2l0SHViIHRva2VuIGhhcyB0aGUgXCJyZXBvXCIgc2NvcGUnLFxuICAgICAgICAgICAgJ1lvdSBjYW4gYWRkIHRoZSByZXBvIHNjb3BlIHdpdGg6IGdoIGF1dGggcmVmcmVzaCAtaCBnaXRodWIuY29tIC1zIHJlcG8sd29ya2Zsb3cnLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2UgaWYgKCFwZXJtaXNzaW9uQ2hlY2suaGFzQWNjZXNzKSB7XG4gICAgICAgIHJlcG9XYXJuaW5ncy5wdXNoKHtcbiAgICAgICAgICB0aXRsZTogJ0FkbWluIHBlcm1pc3Npb25zIHJlcXVpcmVkJyxcbiAgICAgICAgICBtZXNzYWdlOiBgWW91IG1pZ2h0IG5lZWQgYWRtaW4gcGVybWlzc2lvbnMgb24gJHtyZXBvTmFtZX0gdG8gc2V0IHVwIEdpdEh1YiBBY3Rpb25zLmAsXG4gICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBbXG4gICAgICAgICAgICAnUmVwb3NpdG9yeSBhZG1pbnMgY2FuIGluc3RhbGwgR2l0SHViIEFwcHMgYW5kIHNldCBzZWNyZXRzJyxcbiAgICAgICAgICAgICdBc2sgYSByZXBvc2l0b3J5IGFkbWluIHRvIHJ1biB0aGlzIGNvbW1hbmQgaWYgc2V0dXAgZmFpbHMnLFxuICAgICAgICAgICAgJ0FsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIHRoZSBtYW51YWwgc2V0dXAgaW5zdHJ1Y3Rpb25zJyxcbiAgICAgICAgICBdLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCB3b3JrZmxvd0V4aXN0cyA9IGF3YWl0IGNoZWNrRXhpc3RpbmdXb3JrZmxvd0ZpbGUocmVwb05hbWUpXG5cbiAgICAgIGlmIChyZXBvV2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBhbGxXYXJuaW5ncyA9IFsuLi5zdGF0ZS53YXJuaW5ncywgLi4ucmVwb1dhcm5pbmdzXVxuICAgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICBzZWxlY3RlZFJlcG9OYW1lOiByZXBvTmFtZSxcbiAgICAgICAgICB3b3JrZmxvd0V4aXN0cyxcbiAgICAgICAgICB3YXJuaW5nczogYWxsV2FybmluZ3MsXG4gICAgICAgICAgc3RlcDogJ3dhcm5pbmdzJyxcbiAgICAgICAgfSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0ZXBfY29tcGxldGVkJywge1xuICAgICAgICAgIHN0ZXA6ICdjaG9vc2UtcmVwbycgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgICAgfSlcbiAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoe1xuICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAgc2VsZWN0ZWRSZXBvTmFtZTogcmVwb05hbWUsXG4gICAgICAgICAgd29ya2Zsb3dFeGlzdHMsXG4gICAgICAgICAgc3RlcDogJ2luc3RhbGwtYXBwJyxcbiAgICAgICAgfSkpXG4gICAgICAgIHNldFRpbWVvdXQob3BlbkdpdEh1YkFwcEluc3RhbGxhdGlvbiwgMClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0YXRlLnN0ZXAgPT09ICdpbnN0YWxsLWFwcCcpIHtcbiAgICAgIGxvZ0V2ZW50KCd0ZW5ndV9pbnN0YWxsX2dpdGh1Yl9hcHBfc3RlcF9jb21wbGV0ZWQnLCB7XG4gICAgICAgIHN0ZXA6ICdpbnN0YWxsLWFwcCcgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgIH0pXG4gICAgICBpZiAoc3RhdGUud29ya2Zsb3dFeGlzdHMpIHtcbiAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzdGVwOiAnY2hlY2stZXhpc3Rpbmctd29ya2Zsb3cnIH0pKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzdGVwOiAnc2VsZWN0LXdvcmtmbG93cycgfSkpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5zdGVwID09PSAnY2hlY2stZXhpc3Rpbmctd29ya2Zsb3cnKSB7XG4gICAgICByZXR1cm5cbiAgICB9IGVsc2UgaWYgKHN0YXRlLnN0ZXAgPT09ICdzZWxlY3Qtd29ya2Zsb3dzJykge1xuICAgICAgLy8gSGFuZGxlZCBieSB0aGUgV29ya2Zsb3dNdWx0aXNlbGVjdERpYWxvZyBjb21wb25lbnRcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSBpZiAoc3RhdGUuc3RlcCA9PT0gJ2NoZWNrLWV4aXN0aW5nLXNlY3JldCcpIHtcbiAgICAgIGxvZ0V2ZW50KCd0ZW5ndV9pbnN0YWxsX2dpdGh1Yl9hcHBfc3RlcF9jb21wbGV0ZWQnLCB7XG4gICAgICAgIHN0ZXA6ICdjaGVjay1leGlzdGluZy1zZWNyZXQnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICB9KVxuICAgICAgaWYgKHN0YXRlLnVzZUV4aXN0aW5nU2VjcmV0KSB7XG4gICAgICAgIGF3YWl0IHJ1blNldHVwR2l0SHViQWN0aW9ucyhudWxsLCBzdGF0ZS5zZWNyZXROYW1lKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVXNlciB3YW50cyB0byB1c2UgYSBuZXcgc2VjcmV0IG5hbWUgd2l0aCB0aGVpciBBUEkga2V5XG4gICAgICAgIGF3YWl0IHJ1blNldHVwR2l0SHViQWN0aW9ucyhzdGF0ZS5hcGlLZXlPck9BdXRoVG9rZW4sIHN0YXRlLnNlY3JldE5hbWUpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzdGF0ZS5zdGVwID09PSAnYXBpLWtleScpIHtcbiAgICAgIC8vIEluIHRoZSBuZXcgZmxvdywgYXBpLWtleSBzdGVwIG9ubHkgYXBwZWFycyB3aGVuIHVzZXIgaGFzIG5vIGV4aXN0aW5nIGtleVxuICAgICAgLy8gVGhleSBlaXRoZXIgZW50ZXJlZCBhIG5ldyBrZXkgb3Igd2lsbCBjcmVhdGUgT0F1dGggdG9rZW5cbiAgICAgIGlmIChzdGF0ZS5zZWxlY3RlZEFwaUtleU9wdGlvbiA9PT0gJ29hdXRoJykge1xuICAgICAgICAvLyBPQXV0aCBmbG93IGFscmVhZHkgaGFuZGxlZCBieSBoYW5kbGVDcmVhdGVPQXV0aFRva2VuXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBJZiB1c2VyIHNlbGVjdGVkICdleGlzdGluZycgb3B0aW9uLCB1c2UgdGhlIGV4aXN0aW5nIEFQSSBrZXlcbiAgICAgIGNvbnN0IGFwaUtleVRvVXNlID1cbiAgICAgICAgc3RhdGUuc2VsZWN0ZWRBcGlLZXlPcHRpb24gPT09ICdleGlzdGluZydcbiAgICAgICAgICA/IGV4aXN0aW5nQXBpS2V5XG4gICAgICAgICAgOiBzdGF0ZS5hcGlLZXlPck9BdXRoVG9rZW5cblxuICAgICAgaWYgKCFhcGlLZXlUb1VzZSkge1xuICAgICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX2Vycm9yJywge1xuICAgICAgICAgIHJlYXNvbjpcbiAgICAgICAgICAgICdhcGlfa2V5X21pc3NpbmcnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgIH0pXG4gICAgICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgIHN0ZXA6ICdlcnJvcicsXG4gICAgICAgICAgZXJyb3I6ICdBUEkga2V5IGlzIHJlcXVpcmVkJyxcbiAgICAgICAgfSkpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZSB0aGUgQVBJIGtleSBiZWluZyB1c2VkIChlaXRoZXIgZXhpc3Rpbmcgb3IgbmV3bHkgZW50ZXJlZClcbiAgICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgYXBpS2V5T3JPQXV0aFRva2VuOiBhcGlLZXlUb1VzZSxcbiAgICAgICAgdXNlRXhpc3RpbmdLZXk6IHN0YXRlLnNlbGVjdGVkQXBpS2V5T3B0aW9uID09PSAnZXhpc3RpbmcnLFxuICAgICAgfSkpXG5cbiAgICAgIC8vIENoZWNrIGlmIEFOVEhST1BJQ19BUElfS0VZIHNlY3JldCBhbHJlYWR5IGV4aXN0c1xuICAgICAgY29uc3QgY2hlY2tTZWNyZXRzUmVzdWx0ID0gYXdhaXQgZXhlY0ZpbGVOb1Rocm93KCdnaCcsIFtcbiAgICAgICAgJ3NlY3JldCcsXG4gICAgICAgICdsaXN0JyxcbiAgICAgICAgJy0tYXBwJyxcbiAgICAgICAgJ2FjdGlvbnMnLFxuICAgICAgICAnLS1yZXBvJyxcbiAgICAgICAgc3RhdGUuc2VsZWN0ZWRSZXBvTmFtZSxcbiAgICAgIF0pXG5cbiAgICAgIGlmIChjaGVja1NlY3JldHNSZXN1bHQuY29kZSA9PT0gMCkge1xuICAgICAgICBjb25zdCBsaW5lcyA9IGNoZWNrU2VjcmV0c1Jlc3VsdC5zdGRvdXQuc3BsaXQoJ1xcbicpXG4gICAgICAgIGNvbnN0IGhhc0FudGhyb3BpY0tleSA9IGxpbmVzLnNvbWUoKGxpbmU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHJldHVybiAvXkFOVEhST1BJQ19BUElfS0VZXFxzKy8udGVzdChsaW5lKVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmIChoYXNBbnRocm9waWNLZXkpIHtcbiAgICAgICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0ZXBfY29tcGxldGVkJywge1xuICAgICAgICAgICAgc3RlcDogJ2FwaS1rZXknIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgc2VjcmV0RXhpc3RzOiB0cnVlLFxuICAgICAgICAgICAgc3RlcDogJ2NoZWNrLWV4aXN0aW5nLXNlY3JldCcsXG4gICAgICAgICAgfSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nRXZlbnQoJ3Rlbmd1X2luc3RhbGxfZ2l0aHViX2FwcF9zdGVwX2NvbXBsZXRlZCcsIHtcbiAgICAgICAgICAgIHN0ZXA6ICdhcGkta2V5JyBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLy8gTm8gZXhpc3Rpbmcgc2VjcmV0LCBwcm9jZWVkIHRvIGNyZWF0aW5nXG4gICAgICAgICAgYXdhaXQgcnVuU2V0dXBHaXRIdWJBY3Rpb25zKGFwaUtleVRvVXNlLCBzdGF0ZS5zZWNyZXROYW1lKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0ZXBfY29tcGxldGVkJywge1xuICAgICAgICAgIHN0ZXA6ICdhcGkta2V5JyBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgICAgICB9KVxuICAgICAgICAvLyBFcnJvciBjaGVja2luZyBzZWNyZXRzLCBwcm9jZWVkIGFueXdheVxuICAgICAgICBhd2FpdCBydW5TZXR1cEdpdEh1YkFjdGlvbnMoYXBpS2V5VG9Vc2UsIHN0YXRlLnNlY3JldE5hbWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlUmVwb1VybENoYW5nZSA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzZWxlY3RlZFJlcG9OYW1lOiB2YWx1ZSB9KSlcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUFwaUtleUNoYW5nZSA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBhcGlLZXlPck9BdXRoVG9rZW46IHZhbHVlIH0pKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlQXBpS2V5T3B0aW9uQ2hhbmdlID0gKG9wdGlvbjogJ2V4aXN0aW5nJyB8ICduZXcnIHwgJ29hdXRoJykgPT4ge1xuICAgIHNldFN0YXRlKHByZXYgPT4gKHsgLi4ucHJldiwgc2VsZWN0ZWRBcGlLZXlPcHRpb246IG9wdGlvbiB9KSlcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUNyZWF0ZU9BdXRoVG9rZW4gPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgbG9nRXZlbnQoJ3Rlbmd1X2luc3RhbGxfZ2l0aHViX2FwcF9zdGVwX2NvbXBsZXRlZCcsIHtcbiAgICAgIHN0ZXA6ICdhcGkta2V5JyBhcyBBbmFseXRpY3NNZXRhZGF0YV9JX1ZFUklGSUVEX1RISVNfSVNfTk9UX0NPREVfT1JfRklMRVBBVEhTLFxuICAgIH0pXG4gICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzdGVwOiAnb2F1dGgtZmxvdycgfSkpXG4gIH0sIFtdKVxuXG4gIGNvbnN0IGhhbmRsZU9BdXRoU3VjY2VzcyA9IHVzZUNhbGxiYWNrKFxuICAgICh0b2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX3N0ZXBfY29tcGxldGVkJywge1xuICAgICAgICBzdGVwOiAnb2F1dGgtZmxvdycgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICAgIH0pXG4gICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIGFwaUtleU9yT0F1dGhUb2tlbjogdG9rZW4sXG4gICAgICAgIHVzZUV4aXN0aW5nS2V5OiBmYWxzZSxcbiAgICAgICAgc2VjcmV0TmFtZTogJ0NMQVVERV9DT0RFX09BVVRIX1RPS0VOJyxcbiAgICAgICAgYXV0aFR5cGU6ICdvYXV0aF90b2tlbicsXG4gICAgICB9KSlcbiAgICAgIHZvaWQgcnVuU2V0dXBHaXRIdWJBY3Rpb25zKHRva2VuLCAnQ0xBVURFX0NPREVfT0FVVEhfVE9LRU4nKVxuICAgIH0sXG4gICAgW3J1blNldHVwR2l0SHViQWN0aW9uc10sXG4gIClcblxuICBjb25zdCBoYW5kbGVPQXV0aENhbmNlbCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRTdGF0ZShwcmV2ID0+ICh7IC4uLnByZXYsIHN0ZXA6ICdhcGkta2V5JyB9KSlcbiAgfSwgW10pXG5cbiAgY29uc3QgaGFuZGxlU2VjcmV0TmFtZUNoYW5nZSA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKHZhbHVlICYmICEvXlthLXpBLVowLTlfXSskLy50ZXN0KHZhbHVlKSkgcmV0dXJuXG4gICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCBzZWNyZXROYW1lOiB2YWx1ZSB9KSlcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVRvZ2dsZVVzZUN1cnJlbnRSZXBvID0gKHVzZUN1cnJlbnRSZXBvOiBib29sZWFuKSA9PiB7XG4gICAgc2V0U3RhdGUocHJldiA9PiAoe1xuICAgICAgLi4ucHJldixcbiAgICAgIHVzZUN1cnJlbnRSZXBvLFxuICAgICAgc2VsZWN0ZWRSZXBvTmFtZTogdXNlQ3VycmVudFJlcG8gPyBwcmV2LmN1cnJlbnRSZXBvIDogJycsXG4gICAgfSkpXG4gIH1cblxuICBjb25zdCBoYW5kbGVUb2dnbGVVc2VFeGlzdGluZ0tleSA9ICh1c2VFeGlzdGluZ0tleTogYm9vbGVhbikgPT4ge1xuICAgIHNldFN0YXRlKHByZXYgPT4gKHsgLi4ucHJldiwgdXNlRXhpc3RpbmdLZXkgfSkpXG4gIH1cblxuICBjb25zdCBoYW5kbGVUb2dnbGVVc2VFeGlzdGluZ1NlY3JldCA9ICh1c2VFeGlzdGluZ1NlY3JldDogYm9vbGVhbikgPT4ge1xuICAgIHNldFN0YXRlKHByZXYgPT4gKHtcbiAgICAgIC4uLnByZXYsXG4gICAgICB1c2VFeGlzdGluZ1NlY3JldCxcbiAgICAgIHNlY3JldE5hbWU6IHVzZUV4aXN0aW5nU2VjcmV0ID8gJ0FOVEhST1BJQ19BUElfS0VZJyA6ICcnLFxuICAgIH0pKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlV29ya2Zsb3dBY3Rpb24gPSBhc3luYyAoYWN0aW9uOiAndXBkYXRlJyB8ICdza2lwJyB8ICdleGl0JykgPT4ge1xuICAgIGlmIChhY3Rpb24gPT09ICdleGl0Jykge1xuICAgICAgcHJvcHMub25Eb25lKCdJbnN0YWxsYXRpb24gY2FuY2VsbGVkIGJ5IHVzZXInKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgbG9nRXZlbnQoJ3Rlbmd1X2luc3RhbGxfZ2l0aHViX2FwcF9zdGVwX2NvbXBsZXRlZCcsIHtcbiAgICAgIHN0ZXA6ICdjaGVjay1leGlzdGluZy13b3JrZmxvdycgYXMgQW5hbHl0aWNzTWV0YWRhdGFfSV9WRVJJRklFRF9USElTX0lTX05PVF9DT0RFX09SX0ZJTEVQQVRIUyxcbiAgICB9KVxuXG4gICAgc2V0U3RhdGUocHJldiA9PiAoeyAuLi5wcmV2LCB3b3JrZmxvd0FjdGlvbjogYWN0aW9uIH0pKVxuXG4gICAgaWYgKGFjdGlvbiA9PT0gJ3NraXAnIHx8IGFjdGlvbiA9PT0gJ3VwZGF0ZScpIHtcbiAgICAgIC8vIENoZWNrIGlmIHVzZXIgaGFzIGV4aXN0aW5nIGxvY2FsIEFQSSBrZXlcbiAgICAgIGlmIChleGlzdGluZ0FwaUtleSkge1xuICAgICAgICBhd2FpdCBjaGVja0V4aXN0aW5nU2VjcmV0KClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vIGxvY2FsIGtleSwgZ28gc3RyYWlnaHQgdG8gQVBJIGtleSBzdGVwXG4gICAgICAgIHNldFN0YXRlKHByZXYgPT4gKHsgLi4ucHJldiwgc3RlcDogJ2FwaS1rZXknIH0pKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZURpc21pc3NLZXlEb3duKGU6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICBpZiAoc3RhdGUuc3RlcCA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICBsb2dFdmVudCgndGVuZ3VfaW5zdGFsbF9naXRodWJfYXBwX2NvbXBsZXRlZCcsIHt9KVxuICAgIH1cbiAgICBwcm9wcy5vbkRvbmUoXG4gICAgICBzdGF0ZS5zdGVwID09PSAnc3VjY2VzcydcbiAgICAgICAgPyAnR2l0SHViIEFjdGlvbnMgc2V0dXAgY29tcGxldGUhJ1xuICAgICAgICA6IHN0YXRlLmVycm9yXG4gICAgICAgICAgPyBgQ291bGRuJ3QgaW5zdGFsbCBHaXRIdWIgQXBwOiAke3N0YXRlLmVycm9yfVxcbkZvciBtYW51YWwgc2V0dXAgaW5zdHJ1Y3Rpb25zLCBzZWU6ICR7R0lUSFVCX0FDVElPTl9TRVRVUF9ET0NTX1VSTH1gXG4gICAgICAgICAgOiBgR2l0SHViIEFwcCBpbnN0YWxsYXRpb24gZmFpbGVkXFxuRm9yIG1hbnVhbCBzZXR1cCBpbnN0cnVjdGlvbnMsIHNlZTogJHtHSVRIVUJfQUNUSU9OX1NFVFVQX0RPQ1NfVVJMfWAsXG4gICAgKVxuICB9XG5cbiAgc3dpdGNoIChzdGF0ZS5zdGVwKSB7XG4gICAgY2FzZSAnY2hlY2stZ2gnOlxuICAgICAgcmV0dXJuIDxDaGVja0dpdEh1YlN0ZXAgLz5cbiAgICBjYXNlICd3YXJuaW5ncyc6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8V2FybmluZ3NTdGVwIHdhcm5pbmdzPXtzdGF0ZS53YXJuaW5nc30gb25Db250aW51ZT17aGFuZGxlU3VibWl0fSAvPlxuICAgICAgKVxuICAgIGNhc2UgJ2Nob29zZS1yZXBvJzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxDaG9vc2VSZXBvU3RlcFxuICAgICAgICAgIGN1cnJlbnRSZXBvPXtzdGF0ZS5jdXJyZW50UmVwb31cbiAgICAgICAgICB1c2VDdXJyZW50UmVwbz17c3RhdGUudXNlQ3VycmVudFJlcG99XG4gICAgICAgICAgcmVwb1VybD17c3RhdGUuc2VsZWN0ZWRSZXBvTmFtZX1cbiAgICAgICAgICBvblJlcG9VcmxDaGFuZ2U9e2hhbmRsZVJlcG9VcmxDaGFuZ2V9XG4gICAgICAgICAgb25Ub2dnbGVVc2VDdXJyZW50UmVwbz17aGFuZGxlVG9nZ2xlVXNlQ3VycmVudFJlcG99XG4gICAgICAgICAgb25TdWJtaXQ9e2hhbmRsZVN1Ym1pdH1cbiAgICAgICAgLz5cbiAgICAgIClcbiAgICBjYXNlICdpbnN0YWxsLWFwcCc6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8SW5zdGFsbEFwcFN0ZXBcbiAgICAgICAgICByZXBvVXJsPXtzdGF0ZS5zZWxlY3RlZFJlcG9OYW1lfVxuICAgICAgICAgIG9uU3VibWl0PXtoYW5kbGVTdWJtaXR9XG4gICAgICAgIC8+XG4gICAgICApXG4gICAgY2FzZSAnY2hlY2stZXhpc3Rpbmctd29ya2Zsb3cnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPEV4aXN0aW5nV29ya2Zsb3dTdGVwXG4gICAgICAgICAgcmVwb05hbWU9e3N0YXRlLnNlbGVjdGVkUmVwb05hbWV9XG4gICAgICAgICAgb25TZWxlY3RBY3Rpb249e2hhbmRsZVdvcmtmbG93QWN0aW9ufVxuICAgICAgICAvPlxuICAgICAgKVxuICAgIGNhc2UgJ2NoZWNrLWV4aXN0aW5nLXNlY3JldCc6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8Q2hlY2tFeGlzdGluZ1NlY3JldFN0ZXBcbiAgICAgICAgICB1c2VFeGlzdGluZ1NlY3JldD17c3RhdGUudXNlRXhpc3RpbmdTZWNyZXR9XG4gICAgICAgICAgc2VjcmV0TmFtZT17c3RhdGUuc2VjcmV0TmFtZX1cbiAgICAgICAgICBvblRvZ2dsZVVzZUV4aXN0aW5nU2VjcmV0PXtoYW5kbGVUb2dnbGVVc2VFeGlzdGluZ1NlY3JldH1cbiAgICAgICAgICBvblNlY3JldE5hbWVDaGFuZ2U9e2hhbmRsZVNlY3JldE5hbWVDaGFuZ2V9XG4gICAgICAgICAgb25TdWJtaXQ9e2hhbmRsZVN1Ym1pdH1cbiAgICAgICAgLz5cbiAgICAgIClcbiAgICBjYXNlICdhcGkta2V5JzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxBcGlLZXlTdGVwXG4gICAgICAgICAgZXhpc3RpbmdBcGlLZXk9e2V4aXN0aW5nQXBpS2V5fVxuICAgICAgICAgIHVzZUV4aXN0aW5nS2V5PXtzdGF0ZS51c2VFeGlzdGluZ0tleX1cbiAgICAgICAgICBhcGlLZXlPck9BdXRoVG9rZW49e3N0YXRlLmFwaUtleU9yT0F1dGhUb2tlbn1cbiAgICAgICAgICBvbkFwaUtleUNoYW5nZT17aGFuZGxlQXBpS2V5Q2hhbmdlfVxuICAgICAgICAgIG9uVG9nZ2xlVXNlRXhpc3RpbmdLZXk9e2hhbmRsZVRvZ2dsZVVzZUV4aXN0aW5nS2V5fVxuICAgICAgICAgIG9uU3VibWl0PXtoYW5kbGVTdWJtaXR9XG4gICAgICAgICAgb25DcmVhdGVPQXV0aFRva2VuPXtcbiAgICAgICAgICAgIGlzQW50aHJvcGljQXV0aEVuYWJsZWQoKSA/IGhhbmRsZUNyZWF0ZU9BdXRoVG9rZW4gOiB1bmRlZmluZWRcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZWN0ZWRPcHRpb249e3N0YXRlLnNlbGVjdGVkQXBpS2V5T3B0aW9ufVxuICAgICAgICAgIG9uU2VsZWN0T3B0aW9uPXtoYW5kbGVBcGlLZXlPcHRpb25DaGFuZ2V9XG4gICAgICAgIC8+XG4gICAgICApXG4gICAgY2FzZSAnY3JlYXRpbmcnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPENyZWF0aW5nU3RlcFxuICAgICAgICAgIGN1cnJlbnRXb3JrZmxvd0luc3RhbGxTdGVwPXtzdGF0ZS5jdXJyZW50V29ya2Zsb3dJbnN0YWxsU3RlcH1cbiAgICAgICAgICBzZWNyZXRFeGlzdHM9e3N0YXRlLnNlY3JldEV4aXN0c31cbiAgICAgICAgICB1c2VFeGlzdGluZ1NlY3JldD17c3RhdGUudXNlRXhpc3RpbmdTZWNyZXR9XG4gICAgICAgICAgc2VjcmV0TmFtZT17c3RhdGUuc2VjcmV0TmFtZX1cbiAgICAgICAgICBza2lwV29ya2Zsb3c9e3N0YXRlLndvcmtmbG93QWN0aW9uID09PSAnc2tpcCd9XG4gICAgICAgICAgc2VsZWN0ZWRXb3JrZmxvd3M9e3N0YXRlLnNlbGVjdGVkV29ya2Zsb3dzfVxuICAgICAgICAvPlxuICAgICAgKVxuICAgIGNhc2UgJ3N1Y2Nlc3MnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPEJveCB0YWJJbmRleD17MH0gYXV0b0ZvY3VzIG9uS2V5RG93bj17aGFuZGxlRGlzbWlzc0tleURvd259PlxuICAgICAgICAgIDxTdWNjZXNzU3RlcFxuICAgICAgICAgICAgc2VjcmV0RXhpc3RzPXtzdGF0ZS5zZWNyZXRFeGlzdHN9XG4gICAgICAgICAgICB1c2VFeGlzdGluZ1NlY3JldD17c3RhdGUudXNlRXhpc3RpbmdTZWNyZXR9XG4gICAgICAgICAgICBzZWNyZXROYW1lPXtzdGF0ZS5zZWNyZXROYW1lfVxuICAgICAgICAgICAgc2tpcFdvcmtmbG93PXtzdGF0ZS53b3JrZmxvd0FjdGlvbiA9PT0gJ3NraXAnfVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvQm94PlxuICAgICAgKVxuICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxCb3ggdGFiSW5kZXg9ezB9IGF1dG9Gb2N1cyBvbktleURvd249e2hhbmRsZURpc21pc3NLZXlEb3dufT5cbiAgICAgICAgICA8RXJyb3JTdGVwXG4gICAgICAgICAgICBlcnJvcj17c3RhdGUuZXJyb3J9XG4gICAgICAgICAgICBlcnJvclJlYXNvbj17c3RhdGUuZXJyb3JSZWFzb259XG4gICAgICAgICAgICBlcnJvckluc3RydWN0aW9ucz17c3RhdGUuZXJyb3JJbnN0cnVjdGlvbnN9XG4gICAgICAgICAgLz5cbiAgICAgICAgPC9Cb3g+XG4gICAgICApXG4gICAgY2FzZSAnc2VsZWN0LXdvcmtmbG93cyc6XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8V29ya2Zsb3dNdWx0aXNlbGVjdERpYWxvZ1xuICAgICAgICAgIGRlZmF1bHRTZWxlY3Rpb25zPXtzdGF0ZS5zZWxlY3RlZFdvcmtmbG93c31cbiAgICAgICAgICBvblN1Ym1pdD17c2VsZWN0ZWRXb3JrZmxvd3MgPT4ge1xuICAgICAgICAgICAgbG9nRXZlbnQoJ3Rlbmd1X2luc3RhbGxfZ2l0aHViX2FwcF9zdGVwX2NvbXBsZXRlZCcsIHtcbiAgICAgICAgICAgICAgc3RlcDogJ3NlbGVjdC13b3JrZmxvd3MnIGFzIEFuYWx5dGljc01ldGFkYXRhX0lfVkVSSUZJRURfVEhJU19JU19OT1RfQ09ERV9PUl9GSUxFUEFUSFMsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgc2V0U3RhdGUocHJldiA9PiAoe1xuICAgICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgICBzZWxlY3RlZFdvcmtmbG93cyxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdXNlciBoYXMgZXhpc3RpbmcgbG9jYWwgQVBJIGtleVxuICAgICAgICAgICAgaWYgKGV4aXN0aW5nQXBpS2V5KSB7XG4gICAgICAgICAgICAgIHZvaWQgY2hlY2tFeGlzdGluZ1NlY3JldCgpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBObyBsb2NhbCBrZXksIGdvIHN0cmFpZ2h0IHRvIEFQSSBrZXkgc3RlcFxuICAgICAgICAgICAgICBzZXRTdGF0ZShwcmV2ID0+ICh7IC4uLnByZXYsIHN0ZXA6ICdhcGkta2V5JyB9KSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9fVxuICAgICAgICAvPlxuICAgICAgKVxuICAgIGNhc2UgJ29hdXRoLWZsb3cnOlxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPE9BdXRoRmxvd1N0ZXBcbiAgICAgICAgICBvblN1Y2Nlc3M9e2hhbmRsZU9BdXRoU3VjY2Vzc31cbiAgICAgICAgICBvbkNhbmNlbD17aGFuZGxlT0F1dGhDYW5jZWx9XG4gICAgICAgIC8+XG4gICAgICApXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhbGwoXG4gIG9uRG9uZTogTG9jYWxKU1hDb21tYW5kT25Eb25lLFxuKTogUHJvbWlzZTxSZWFjdC5SZWFjdE5vZGU+IHtcbiAgcmV0dXJuIDxJbnN0YWxsR2l0SHViQXBwIG9uRG9uZT17b25Eb25lfSAvPlxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxLQUFLLFFBQVEsT0FBTztBQUM3QixPQUFPQyxLQUFLLElBQUlDLFdBQVcsRUFBRUMsUUFBUSxRQUFRLE9BQU87QUFDcEQsU0FDRSxLQUFLQywwREFBMEQsRUFDL0RDLFFBQVEsUUFDSCxpQ0FBaUM7QUFDeEMsU0FBU0MseUJBQXlCLFFBQVEsK0NBQStDO0FBQ3pGLFNBQVNDLDRCQUE0QixRQUFRLCtCQUErQjtBQUM1RSxT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O0FBRTFELFFBQVEsRUFBRSxHQUFHLENBQUM7SUFFVixLQUFLLE9BQU87TUFDVixPQUNFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQytDLG9CQUFvQixDQUFDO0FBQ3BFLFVBQVUsQ0FBQyxTQUFTLENBQ1IsS0FBSyxDQUFDLENBQUN4RSxLQUFLLENBQUNvQixLQUFLLENBQUMsQ0FDbkIsV0FBVyxDQUFDLENBQUNwQixLQUFLLENBQUNzQixXQUFXLENBQUMsQ0FDL0IsaUJBQWlCLENBQUMsQ0FBQ3RCLEtBQUssQ0FBQ3VCLGlCQUFpQixDQUFDO0FBRXZELFFBQVEsRUFBRSxHQUFHLENBQUM7SUFFVixLQUFLLGtCQUFrQjtNQUNyQixPQUNFLENBQUMseUJBQXlCLENBQ3hCLGlCQUFpQixDQUFDLENBQUN2QixLQUFLLENBQUNULGlCQUFpQixDQUFDLENBQzNDLFFBQVEsQ0FBQyxDQUFDQSxpQkFBaUIsSUFBSTtRQUM3QnpDLFFBQVEsQ0FBQyx5Q0FBeUMsRUFBRTtVQUNsRDZCLElBQUksRUFBRSxrQkFBa0IsSUFBSTlCO1FBQzlCLENBQUMsQ0FBQztRQUNGb0QsUUFBUSxDQUFDa0IsT0FBSSxLQUFLO1VBQ2hCLEdBQUdBLE9BQUk7VUFDUDVCO1FBQ0YsQ0FBQyxDQUFDLENBQUM7UUFDSDtRQUNBLElBQUlRLGNBQWMsRUFBRTtVQUNsQixLQUFLMkMsbUJBQW1CLENBQUMsQ0FBQztRQUM1QixDQUFDLE1BQU07VUFDTDtVQUNBekMsUUFBUSxDQUFDa0IsT0FBSSxLQUFLO1lBQUUsR0FBR0EsT0FBSTtZQUFFeEMsSUFBSSxFQUFFO1VBQVUsQ0FBQyxDQUFDLENBQUM7UUFDbEQ7TUFDRixDQUFDLENBQUMsR0FDRjtJQUVOLEtBQUssWUFBWTtNQUNmLE9BQ0UsQ0FBQyxhQUFhLENBQ1osU0FBUyxDQUFDLENBQUNvRixrQkFBa0IsQ0FBQyxDQUM5QixRQUFRLENBQUMsQ0FBQ0UsaUJBQWlCLENBQUMsR0FDNUI7RUFFUjtBQUNGO0FBRUEsT0FBTyxlQUFlVyxJQUFJQSxDQUN4QmhGLE1BQU0sRUFBRXhDLHFCQUFxQixDQUM5QixFQUFFNkUsT0FBTyxDQUFDdkYsS0FBSyxDQUFDb0QsU0FBUyxDQUFDLENBQUM7RUFDMUIsT0FBTyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDRixNQUFNLENBQUMsR0FBRztBQUM3QyIsImlnbm9yZUxpc3QiOltdfQ==
@@ -1,3 +1,4 @@
1
+ // @ts-nocheck
1
2
  import { c as _c } from "react/compiler-runtime";
2
3
  import { homedir } from 'node:os';
3
4
  import { join } from 'node:path';
@@ -23,6 +23,8 @@ import {
23
23
  saveProviderToSettings,
24
24
  type ThirdPartyProviderConfig,
25
25
  } from '../../utils/model/thirdPartyProviders.js'
26
+ import { syncLegacyProviderToPlatformSettings } from '../../utils/model/platformProfiles.js'
27
+ import { setMainAndSubagentDefaultProfile } from './profileDefaults.js'
26
28
 
27
29
  type Step =
28
30
  | 'choose-method'
@@ -151,7 +153,7 @@ export function CodexLogin({ onDone }: CodexLoginProps): React.ReactNode {
151
153
  const [detectedAuth, setDetectedAuth] = React.useState<ReturnType<typeof detectCodexAuth>>(null)
152
154
 
153
155
  const handleCancel = React.useCallback(() => {
154
- onDone(false, 'Codex/GPT login cancelled')
156
+ onDone(false, 'Codex/OpenAI profile login cancelled')
155
157
  }, [onDone])
156
158
 
157
159
  const saveCodexProvider = React.useCallback(
@@ -168,6 +170,7 @@ export function CodexLogin({ onDone }: CodexLoginProps): React.ReactNode {
168
170
  baseUrl: 'https://chatgpt.com/backend-api/codex',
169
171
  apiFormat: 'openai',
170
172
  apiKey: key,
173
+ accountId,
171
174
  models: [
172
175
  { id: 'codexplan', displayName: 'Codex Plan (GPT-5.4)' },
173
176
  { id: 'codexspark', displayName: 'Codex Spark' },
@@ -195,7 +198,10 @@ export function CodexLogin({ onDone }: CodexLoginProps): React.ReactNode {
195
198
  let lastError: Error | null = null
196
199
  for (const provider of providers) {
197
200
  const result = saveProviderToSettings(provider)
198
- if (result.error) lastError = result.error
201
+ const syncResult = syncLegacyProviderToPlatformSettings(provider)
202
+ if (result.error ?? syncResult.error) {
203
+ lastError = result.error ?? syncResult.error
204
+ }
199
205
  }
200
206
 
201
207
  return lastError
@@ -240,15 +246,26 @@ export function CodexLogin({ onDone }: CodexLoginProps): React.ReactNode {
240
246
  setStep('choose-method')
241
247
  return
242
248
  }
249
+ const defaultProfileId = detectedAuth.accountId ? 'codex' : 'openai'
250
+ const defaultProfileResult =
251
+ setMainAndSubagentDefaultProfile(defaultProfileId)
252
+ if (defaultProfileResult.error) {
253
+ setError(
254
+ `Profiles saved, but failed to set default profile: ${defaultProfileResult.error.message}`,
255
+ )
256
+ setStep('choose-method')
257
+ return
258
+ }
243
259
  setStep('done')
244
260
  const models = detectedAuth.accountId
245
261
  ? 'codex:codexplan, codex:gpt-5.4, openai:gpt-4o'
246
262
  : 'openai:gpt-4o, openai:gpt-4o-mini'
247
263
  onDone(
248
264
  true,
249
- `Codex/GPT configured from ${detectedAuth.source}!\n` +
265
+ `Codex/OpenAI profiles configured from ${detectedAuth.source}.\n` +
266
+ ` Default profile updated: main="${defaultProfileId}", subagent="${defaultProfileId}"\n` +
250
267
  ` Available models: ${models}\n` +
251
- ` Use: /model openai:gpt-4o`,
268
+ ` Use: /model ${defaultProfileId}:${defaultProfileId === 'codex' ? 'codexplan' : 'gpt-4o'}`,
252
269
  )
253
270
  } else {
254
271
  setStep('choose-method')
@@ -273,11 +290,21 @@ export function CodexLogin({ onDone }: CodexLoginProps): React.ReactNode {
273
290
  setStep('api-key-input')
274
291
  return
275
292
  }
293
+ const defaultProfileResult =
294
+ setMainAndSubagentDefaultProfile('openai')
295
+ if (defaultProfileResult.error) {
296
+ setError(
297
+ `OpenAI profile saved, but failed to set defaults: ${defaultProfileResult.error.message}`,
298
+ )
299
+ setStep('api-key-input')
300
+ return
301
+ }
276
302
 
277
303
  setStep('done')
278
304
  onDone(
279
305
  true,
280
- `OpenAI API key configured!\n` +
306
+ `OpenAI profile configured.\n` +
307
+ ` Default profile updated: main="openai", subagent="openai"\n` +
281
308
  ` Available models: openai:gpt-4o, openai:gpt-4o-mini, openai:o3, openai:o4-mini\n` +
282
309
  ` Use: /model openai:gpt-4o`,
283
310
  )
@@ -289,7 +316,7 @@ export function CodexLogin({ onDone }: CodexLoginProps): React.ReactNode {
289
316
  return (
290
317
  <Dialog title="Codex / GPT Login" onCancel={handleCancel} color="permission">
291
318
  <Box flexDirection="column">
292
- <Text>Choose how to authenticate with OpenAI/Codex:</Text>
319
+ <Text>Choose how to connect OpenAI/Codex accounts and profiles:</Text>
293
320
  <Text> </Text>
294
321
  {error && (
295
322
  <>
@@ -302,12 +329,12 @@ export function CodexLogin({ onDone }: CodexLoginProps): React.ReactNode {
302
329
  {
303
330
  label: 'Auto-detect Codex auth',
304
331
  value: 'detect',
305
- description: 'Read existing ~/.codex/auth.json (requires Codex CLI login)',
332
+ description: 'Read ~/.codex/auth.json and configure codex/openai profiles',
306
333
  },
307
334
  {
308
335
  label: 'Enter OpenAI API Key',
309
336
  value: 'api-key',
310
- description: 'Use your OpenAI API key (sk-...) for GPT models',
337
+ description: 'Configure openai profile with API key (sk-...)',
311
338
  },
312
339
  {
313
340
  label: 'Setup guide (Codex CLI)',
@@ -330,7 +357,7 @@ export function CodexLogin({ onDone }: CodexLoginProps): React.ReactNode {
330
357
  return (
331
358
  <Dialog title="Codex Auth Detected" onCancel={handleCancel} color="permission">
332
359
  <Box flexDirection="column">
333
- <Text color="green">Found Codex credentials!</Text>
360
+ <Text color="green">Found Codex credentials for profile setup.</Text>
334
361
  <Text> </Text>
335
362
  <Text>Source: {detectedAuth.source}</Text>
336
363
  <Text>Token: {keyPreview}</Text>
@@ -356,7 +383,7 @@ export function CodexLogin({ onDone }: CodexLoginProps): React.ReactNode {
356
383
  return (
357
384
  <Dialog title="OpenAI API Key" onCancel={handleCancel} color="permission">
358
385
  <Box flexDirection="column">
359
- <Text>Enter your OpenAI API key:</Text>
386
+ <Text>Enter your OpenAI API key for the openai profile:</Text>
360
387
  <Text dimColor> Get one at: platform.openai.com/api-keys</Text>
361
388
  <Text> </Text>
362
389
  {error && <Text color="red">{error}</Text>}
@@ -381,7 +408,7 @@ export function CodexLogin({ onDone }: CodexLoginProps): React.ReactNode {
381
408
  return (
382
409
  <Dialog title="Codex CLI Setup Guide" onCancel={handleCancel} color="permission">
383
410
  <Box flexDirection="column">
384
- <Text bold>To use GPT models with your ChatGPT subscription:</Text>
411
+ <Text bold>To create a codex profile from your ChatGPT subscription:</Text>
385
412
  <Text> </Text>
386
413
  <Text>1. Install Codex CLI:</Text>
387
414
  <Text color="cyan"> npm install -g @openai/codex</Text>
@@ -415,7 +442,7 @@ export function CodexLogin({ onDone }: CodexLoginProps): React.ReactNode {
415
442
  if (step === 'saving') {
416
443
  return (
417
444
  <Dialog title="Saving..." onCancel={handleCancel} color="permission">
418
- <Text>Saving Codex/GPT configuration...</Text>
445
+ <Text>Saving Codex/OpenAI profiles and defaults...</Text>
419
446
  </Dialog>
420
447
  )
421
448
  }
@@ -15,11 +15,14 @@ import TextInput from '../../components/TextInput.js'
15
15
  import { Select } from '../../components/CustomSelect/index.js'
16
16
  import { ProviderModelSelector } from '../../components/ProviderModelSelector.js'
17
17
  import {
18
+ getThirdPartyProviders,
18
19
  saveProviderToSettings,
19
20
  type ThirdPartyProviderConfig,
20
21
  type ThirdPartyModelConfig,
21
22
  type ApiFormat,
22
23
  } from '../../utils/model/thirdPartyProviders.js'
24
+ import { syncLegacyProviderToPlatformSettings } from '../../utils/model/platformProfiles.js'
25
+ import { setMainAndSubagentDefaultProfile } from './profileDefaults.js'
23
26
 
24
27
  type Step = 'name' | 'url' | 'format' | 'api-key' | 'select-models' | 'saving' | 'done'
25
28
 
@@ -43,7 +46,7 @@ export function CustomProviderLogin({
43
46
  const [keyCursor, setKeyCursor] = React.useState(0)
44
47
 
45
48
  const handleCancel = React.useCallback(() => {
46
- onDone(false, 'Custom provider setup cancelled')
49
+ onDone(false, 'Custom profile setup cancelled')
47
50
  }, [onDone])
48
51
 
49
52
  const handleNameSubmit = React.useCallback((value: string) => {
@@ -98,6 +101,25 @@ export function CustomProviderLogin({
98
101
  .replace(/[^a-z0-9]+/g, '-')
99
102
  .replace(/^-|-$/g, '')
100
103
 
104
+ if (!providerId) {
105
+ setError(
106
+ 'Provider name must contain at least one English letter or number so a stable ID can be generated',
107
+ )
108
+ setStep('name')
109
+ return
110
+ }
111
+
112
+ const conflictingProvider = getThirdPartyProviders().find(
113
+ provider => provider.id === providerId && provider.name !== providerName,
114
+ )
115
+ if (conflictingProvider) {
116
+ setError(
117
+ `Provider ID "${providerId}" is already used by "${conflictingProvider.name}". Choose a different name.`,
118
+ )
119
+ setStep('name')
120
+ return
121
+ }
122
+
101
123
  const providerConfig: ThirdPartyProviderConfig = {
102
124
  id: providerId,
103
125
  name: providerName,
@@ -108,8 +130,20 @@ export function CustomProviderLogin({
108
130
  }
109
131
 
110
132
  const result = saveProviderToSettings(providerConfig)
111
- if (result.error) {
112
- setError(`Failed to save: ${result.error.message}`)
133
+ const syncResult = syncLegacyProviderToPlatformSettings(providerConfig)
134
+ const errorResult = result.error ?? syncResult.error
135
+ if (errorResult) {
136
+ setError(`Failed to save: ${errorResult.message}`)
137
+ setStep('select-models')
138
+ return
139
+ }
140
+
141
+ const defaultProfileResult =
142
+ setMainAndSubagentDefaultProfile(providerId)
143
+ if (defaultProfileResult.error) {
144
+ setError(
145
+ `Profile saved, but failed to set default profile: ${defaultProfileResult.error.message}`,
146
+ )
113
147
  setStep('select-models')
114
148
  return
115
149
  }
@@ -118,23 +152,25 @@ export function CustomProviderLogin({
118
152
  const modelNames = models.map(m => m.id).join(', ')
119
153
  onDone(
120
154
  true,
121
- `Custom provider "${providerName}" configured!\n` +
155
+ `Custom profile "${providerName}" configured!\n` +
156
+ ` Profile ID: ${providerId}\n` +
122
157
  ` URL: ${baseUrl}\n` +
123
158
  ` Format: ${apiFormat}\n` +
124
159
  ` Models: ${modelNames}\n` +
160
+ ` Default profile updated: main="${providerId}", subagent="${providerId}"\n` +
125
161
  ` Use with: /model ${providerId}:${models[0]?.id ?? 'model-id'}`,
126
162
  )
127
163
  },
128
164
  [providerName, baseUrl, apiFormat, apiKey, onDone],
129
165
  )
130
166
 
131
- const dialogTitle = `Custom Provider Setup (${step})`
167
+ const dialogTitle = `Custom Profile Setup (${step})`
132
168
 
133
169
  if (step === 'name') {
134
170
  return (
135
171
  <Dialog title={dialogTitle} onCancel={handleCancel} color="permission">
136
172
  <Box flexDirection="column">
137
- <Text>Enter a name for this provider:</Text>
173
+ <Text>Enter a name for this profile/provider:</Text>
138
174
  <Text dimColor> (e.g., "My OpenAI", "Local Ollama", "DeepSeek")</Text>
139
175
  <Text> </Text>
140
176
  {error && <Text color="red">{error}</Text>}
@@ -158,7 +194,7 @@ export function CustomProviderLogin({
158
194
  return (
159
195
  <Dialog title={dialogTitle} onCancel={handleCancel} color="permission">
160
196
  <Box flexDirection="column">
161
- <Text bold>Provider: {providerName}</Text>
197
+ <Text bold>Profile: {providerName}</Text>
162
198
  <Text> </Text>
163
199
  <Text>Enter the API base URL:</Text>
164
200
  <Text dimColor> Common examples:</Text>
@@ -189,7 +225,7 @@ export function CustomProviderLogin({
189
225
  return (
190
226
  <Dialog title={dialogTitle} onCancel={handleCancel} color="permission">
191
227
  <Box flexDirection="column">
192
- <Text bold>Provider: {providerName}</Text>
228
+ <Text bold>Profile: {providerName}</Text>
193
229
  <Text>URL: {baseUrl}</Text>
194
230
  <Text> </Text>
195
231
  <Text>Select the API format:</Text>
@@ -218,7 +254,7 @@ export function CustomProviderLogin({
218
254
  return (
219
255
  <Dialog title={dialogTitle} onCancel={handleCancel} color="permission">
220
256
  <Box flexDirection="column">
221
- <Text bold>Provider: {providerName}</Text>
257
+ <Text bold>Profile: {providerName}</Text>
222
258
  <Text>URL: {baseUrl}</Text>
223
259
  <Text>Format: {apiFormat}</Text>
224
260
  <Text> </Text>