@projectcor/maia-components 2.44.3 → 2.44.5-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. package/lib/App.js +44 -19
  2. package/lib/components/atoms/ActionableButton.spec.js +111 -0
  3. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.spec.js +52 -0
  4. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.spec.js +11 -0
  5. package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +135 -0
  6. package/lib/components/atoms/AttachmentCard/AttachmentCard.spec.js +123 -0
  7. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +65 -0
  8. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.spec.js +66 -0
  9. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +5 -51
  10. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.spec.js +211 -0
  11. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.spec.js +78 -0
  12. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.js +55 -0
  13. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.spec.js +41 -0
  14. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +18 -76
  15. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.spec.js +253 -0
  16. package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.spec.js +80 -0
  17. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.js +31 -0
  18. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.spec.js +33 -0
  19. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +3 -31
  20. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.spec.js +25 -0
  21. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.js +4 -0
  22. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.spec.js +11 -0
  23. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +2 -4
  24. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.spec.js +77 -0
  25. package/lib/components/atoms/Backdrop/Backdrop.spec.js +28 -0
  26. package/lib/components/atoms/CardMenu/CardMenu.spec.js +56 -0
  27. package/lib/components/atoms/ChatClientSelector/ChatClientSelector.spec.js +67 -0
  28. package/lib/components/atoms/Checkbox/Checkbox.spec.js +27 -0
  29. package/lib/components/atoms/Chip/Chip.spec.js +82 -0
  30. package/lib/components/atoms/ChipLlm/ChipLlm.spec.js +26 -0
  31. package/lib/components/atoms/ClientSelector/ClientSelector.spec.js +88 -0
  32. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +29 -0
  33. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.spec.js +46 -0
  34. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.js +227 -0
  35. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.spec.js +77 -0
  36. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +15 -255
  37. package/lib/components/atoms/ContextMentionChip/buildChipElement.spec.js +81 -0
  38. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.js +31 -0
  39. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.spec.js +48 -0
  40. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +5 -34
  41. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.spec.js +231 -0
  42. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.spec.js +107 -0
  43. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.spec.js +136 -0
  44. package/lib/components/atoms/CopyToClipboard.spec.js +74 -0
  45. package/lib/components/atoms/EditableLabel/EditableLabel.spec.js +76 -0
  46. package/lib/components/atoms/EntitySelector/EntitySelector.spec.js +86 -0
  47. package/lib/components/atoms/Expand/Expand.spec.js +57 -0
  48. package/lib/components/atoms/Fade/Fade.spec.js +31 -0
  49. package/lib/components/atoms/FeedbackButton/FeedbackButton.spec.js +75 -0
  50. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.spec.js +104 -0
  51. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +3 -1
  52. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.spec.js +91 -0
  53. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +19 -7
  54. package/lib/components/atoms/HelpButton.spec.js +87 -0
  55. package/lib/components/atoms/ImagePreview/ImagePreview.spec.js +96 -0
  56. package/lib/components/atoms/ListMenuOption/ListMenuOption.spec.js +54 -0
  57. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.spec.js +21 -0
  58. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.spec.js +20 -0
  59. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.spec.js +26 -0
  60. package/lib/components/atoms/LoadingText/LoadingText.spec.js +25 -0
  61. package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +42 -0
  62. package/lib/components/atoms/MAIAError/MAIAError.spec.js +27 -0
  63. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +12 -0
  64. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.spec.js +26 -0
  65. package/lib/components/atoms/MAIAInput/MAIAInput.js +4 -10
  66. package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +430 -0
  67. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.js +50 -0
  68. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.spec.js +20 -0
  69. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +8 -60
  70. package/lib/components/atoms/MAIAInput/MAIAInputEditor.spec.js +53 -0
  71. package/lib/components/atoms/MAIAInput/maiaInputLayout.spec.js +22 -0
  72. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.spec.js +64 -0
  73. package/lib/components/atoms/MaiaWrapper/MaiaWrapper.spec.js +43 -0
  74. package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.spec.js +114 -0
  75. package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.spec.js +51 -0
  76. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.spec.js +48 -0
  77. package/lib/components/atoms/ModalProject/ModalProject.spec.js +66 -0
  78. package/lib/components/atoms/NextPageLoader.spec.js +37 -0
  79. package/lib/components/atoms/OnboardingModalButton/OnboardingModal.spec.js +20 -0
  80. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.js +17 -0
  81. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.spec.js +35 -0
  82. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +3 -15
  83. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.spec.js +47 -0
  84. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.spec.js +86 -0
  85. package/lib/components/atoms/PrimaryButton.spec.js +42 -0
  86. package/lib/components/atoms/ProjectSelector/ProjectSelector.spec.js +69 -0
  87. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +7 -2
  88. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +69 -0
  89. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +21 -16
  90. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +7 -5
  91. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +59 -0
  92. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +72 -52
  93. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +132 -0
  94. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.spec.js +162 -0
  95. package/lib/components/atoms/ReasoningBlock/reasoningLeading.js +6 -1
  96. package/lib/components/atoms/ReasoningBlock/reasoningLeading.spec.js +70 -0
  97. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +36 -15
  98. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +120 -0
  99. package/lib/components/atoms/ReasoningBlock/reasoningMotion.js +4 -0
  100. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.js +10 -0
  101. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.spec.js +31 -0
  102. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +52 -0
  103. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +90 -0
  104. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.spec.js +16 -0
  105. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +107 -0
  106. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.spec.js +24 -0
  107. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +85 -0
  108. package/lib/components/atoms/Switch/Switch.spec.js +41 -0
  109. package/lib/components/atoms/TextArea/CustomTextArea.spec.js +52 -0
  110. package/lib/components/atoms/TextArea/TextArea.spec.js +68 -0
  111. package/lib/components/atoms/ThirdButton.spec.js +29 -0
  112. package/lib/components/atoms/VideoModal/VideoModal.spec.js +68 -0
  113. package/lib/components/atoms/WithAppCfg.spec.js +60 -0
  114. package/lib/components/index.js +2 -1
  115. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.js +37 -0
  116. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.spec.js +53 -0
  117. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +5 -29
  118. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +371 -0
  119. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.js +39 -0
  120. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.spec.js +57 -0
  121. package/lib/components/molecules/AbmSection/AbmGeneralSection.js +6 -40
  122. package/lib/components/molecules/AbmSection/AbmGeneralSection.spec.js +227 -0
  123. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +86 -0
  124. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.spec.js +108 -0
  125. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +18 -90
  126. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.spec.js +254 -0
  127. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.js +17 -0
  128. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.spec.js +50 -0
  129. package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +5 -15
  130. package/lib/components/molecules/AbmSection/AbmLoaderFiles.spec.js +94 -0
  131. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +83 -0
  132. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +30 -0
  133. package/lib/components/molecules/AgentInputBlock/index.js +5 -0
  134. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +52 -0
  135. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +76 -0
  136. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +20 -0
  137. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +34 -0
  138. package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +36 -0
  139. package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.spec.js +66 -0
  140. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +7 -3
  141. package/lib/components/molecules/ChatAIContent/ChatAIContent.spec.js +145 -0
  142. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.spec.js +204 -0
  143. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +21 -6
  144. package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +246 -0
  145. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.spec.js +86 -0
  146. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +104 -0
  147. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.js +54 -0
  148. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.spec.js +77 -0
  149. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +19 -47
  150. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +410 -0
  151. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +46 -0
  152. package/lib/components/molecules/ChatAIMessages/newStyles.js +29 -26
  153. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +147 -4
  154. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +471 -0
  155. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +64 -108
  156. package/lib/components/molecules/ChatAIModal/ChatAIModal.spec.js +659 -0
  157. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.js +5 -0
  158. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.spec.js +33 -0
  159. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +3 -2
  160. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.spec.js +116 -0
  161. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +15 -153
  162. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.spec.js +134 -0
  163. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +2 -26
  164. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.js +30 -0
  165. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.spec.js +95 -0
  166. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +76 -86
  167. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.spec.js +241 -0
  168. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +37 -0
  169. package/lib/components/molecules/ChatAIModal/constants.spec.js +16 -0
  170. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.spec.js +22 -0
  171. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.spec.js +67 -0
  172. package/lib/components/molecules/ChatAIModal/layout.spec.js +72 -0
  173. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.spec.js +172 -0
  174. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +128 -0
  175. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.spec.js +66 -0
  176. package/lib/components/molecules/ChatFooter/ChatFooter.js +5 -3
  177. package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +355 -0
  178. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.spec.js +10 -0
  179. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.js +48 -0
  180. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.spec.js +82 -0
  181. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +9 -44
  182. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.spec.js +139 -0
  183. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +84 -0
  184. package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +116 -0
  185. package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.spec.js +126 -0
  186. package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.spec.js +115 -0
  187. package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.spec.js +79 -0
  188. package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.spec.js +37 -0
  189. package/lib/components/molecules/Sidebar/Sidebar.js +41 -23
  190. package/lib/components/molecules/Sidebar/Sidebar.spec.js +453 -0
  191. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.js +198 -0
  192. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.spec.js +385 -0
  193. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +56 -171
  194. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +1125 -0
  195. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.spec.js +112 -0
  196. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +405 -0
  197. package/lib/components/organisms/ChatAI/ChatAI.spec.js +174 -0
  198. package/lib/components/organisms/ChatAIPage/ChatAIPage.js +525 -0
  199. package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +231 -0
  200. package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +16 -0
  201. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +253 -0
  202. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +139 -0
  203. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +13 -0
  204. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +267 -0
  205. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +261 -0
  206. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +194 -0
  207. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +105 -0
  208. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +73 -0
  209. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +38 -0
  210. package/lib/components/organisms/ChatAIPage/getDaypart.js +9 -0
  211. package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +19 -0
  212. package/lib/components/organisms/ChatAIPage/index.js +3 -0
  213. package/lib/components/organisms/ClientAIButton/ClientAIButton.spec.js +53 -0
  214. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +59 -0
  215. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +79 -0
  216. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +86 -0
  217. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.spec.js +49 -0
  218. package/lib/components/organisms/ProjectAIButton/ProjectAIButton.spec.js +67 -0
  219. package/lib/components/organisms/ProjectSummary/ProjectSummary.spec.js +117 -0
  220. package/lib/components/organisms/SnackBar/Snackbar.spec.js +66 -0
  221. package/lib/components/organisms/SourcesInformation/SourceItem.spec.js +19 -0
  222. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.spec.js +52 -0
  223. package/lib/constants/maiaExternalConnectorsAccess.spec.js +29 -0
  224. package/lib/constants/permissions/index.js +2 -2
  225. package/lib/constants/permissions/utils.js +4 -1
  226. package/lib/constants/permissions/utils.spec.js +128 -0
  227. package/lib/dev/DevMaiaPage.js +30 -0
  228. package/lib/dev/DevReasoningTimeline.js +68 -37
  229. package/lib/dev/Providers.js +5 -3
  230. package/lib/hooks/frequentlyUsedActionsCache.js +17 -0
  231. package/lib/hooks/frequentlyUsedActionsCache.spec.js +25 -0
  232. package/lib/hooks/useAccessClient/useAccessClient.spec.js +149 -0
  233. package/lib/hooks/useAgentModel/useAgentModel.spec.js +83 -0
  234. package/lib/hooks/useAgentModel/useCreateAgent.spec.js +231 -0
  235. package/lib/hooks/useAgentModel/useDeleteAgent.spec.js +183 -0
  236. package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +313 -0
  237. package/lib/hooks/useAgentSuggestions.spec.js +89 -0
  238. package/lib/hooks/useCaretPosition.spec.js +58 -0
  239. package/lib/hooks/useChatManager/useChatManager.helpers.js +353 -0
  240. package/lib/hooks/useChatManager/useChatManager.helpers.spec.js +506 -0
  241. package/lib/hooks/useChatManager/useChatManager.js +76 -351
  242. package/lib/hooks/useChatManager/useChatManager.spec.js +1261 -0
  243. package/lib/hooks/useChatMessages/useChatMessages.helpers.js +109 -0
  244. package/lib/hooks/useChatMessages/useChatMessages.helpers.spec.js +176 -0
  245. package/lib/hooks/useChatMessages/useChatMessages.js +12 -82
  246. package/lib/hooks/useChatMessages/useChatMessages.spec.js +379 -0
  247. package/lib/hooks/useChats/useChats.spec.js +208 -0
  248. package/lib/hooks/useClientSearch.helpers.js +36 -0
  249. package/lib/hooks/useClientSearch.helpers.spec.js +52 -0
  250. package/lib/hooks/useClientSearch.js +4 -32
  251. package/lib/hooks/useClientSearch.spec.js +86 -0
  252. package/lib/hooks/useContextMentions.helpers.js +152 -0
  253. package/lib/hooks/useContextMentions.helpers.spec.js +143 -0
  254. package/lib/hooks/useContextMentions.js +2 -163
  255. package/lib/hooks/useContextMentions.spec.js +239 -0
  256. package/lib/hooks/useContextMentions.types.js +2 -0
  257. package/lib/hooks/useContextPinPopover.helpers.js +95 -0
  258. package/lib/hooks/useContextPinPopover.helpers.spec.js +115 -0
  259. package/lib/hooks/useContextPinPopover.js +16 -75
  260. package/lib/hooks/useContextPinPopover.spec.js +159 -0
  261. package/lib/hooks/useContinueLegacyContextInNewChat/index.js +2 -0
  262. package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +93 -0
  263. package/lib/hooks/useDebounce.spec.js +42 -0
  264. package/lib/hooks/useEntitySearch.helpers.js +359 -0
  265. package/lib/hooks/useEntitySearch.helpers.spec.js +321 -0
  266. package/lib/hooks/useEntitySearch.js +38 -391
  267. package/lib/hooks/useEntitySearch.spec.js +443 -0
  268. package/lib/hooks/useEvent.spec.js +45 -0
  269. package/lib/hooks/useFrequentlyAskedQuestions.spec.js +222 -0
  270. package/lib/hooks/useFrequentlyUsedActions.js +60 -22
  271. package/lib/hooks/useFrequentlyUsedActions.spec.js +135 -0
  272. package/lib/hooks/useIsMaiaPageRoute.js +26 -0
  273. package/lib/hooks/useIsMaiaPageRoute.spec.js +26 -0
  274. package/lib/hooks/useKnowledge/deleteKnowledge.spec.js +122 -0
  275. package/lib/hooks/useKnowledge/downloadKnowledge.spec.js +148 -0
  276. package/lib/hooks/useKnowledge/saveKnowledge.spec.js +104 -0
  277. package/lib/hooks/useKnowledge/useKnowledgeOperations.spec.js +178 -0
  278. package/lib/hooks/useMaiaChatSessionMeta/index.js +2 -0
  279. package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +24 -0
  280. package/lib/hooks/useMentionAllowedTypes.spec.js +89 -0
  281. package/lib/hooks/useMentionPopover.helpers.js +41 -0
  282. package/lib/hooks/useMentionPopover.helpers.spec.js +71 -0
  283. package/lib/hooks/useMentionPopover.js +9 -35
  284. package/lib/hooks/useMentionPopover.spec.js +215 -0
  285. package/lib/hooks/useMinimizedPillBottomOffset.helpers.js +47 -0
  286. package/lib/hooks/useMinimizedPillBottomOffset.helpers.spec.js +132 -0
  287. package/lib/hooks/useMinimizedPillBottomOffset.js +15 -45
  288. package/lib/hooks/useMinimizedPillBottomOffset.spec.js +89 -0
  289. package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +67 -0
  290. package/lib/hooks/useModal/useModal.spec.js +73 -0
  291. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.spec.js +192 -0
  292. package/lib/hooks/useProjectSearch.helpers.js +61 -0
  293. package/lib/hooks/useProjectSearch.helpers.spec.js +70 -0
  294. package/lib/hooks/useProjectSearch.js +4 -58
  295. package/lib/hooks/useProjectSearch.spec.js +91 -0
  296. package/lib/hooks/useProjectSummary.spec.js +193 -0
  297. package/lib/hooks/useProjectSummaryConfig.helpers.js +62 -0
  298. package/lib/hooks/useProjectSummaryConfig.helpers.spec.js +92 -0
  299. package/lib/hooks/useProjectSummaryConfig.js +14 -52
  300. package/lib/hooks/useProjectSummaryConfig.spec.js +133 -0
  301. package/lib/hooks/useReasoningTrace/reasoningStore.spec.js +112 -0
  302. package/lib/hooks/useRecentClientsSearch.helpers.js +33 -0
  303. package/lib/hooks/useRecentClientsSearch.helpers.spec.js +33 -0
  304. package/lib/hooks/useRecentClientsSearch.js +4 -32
  305. package/lib/hooks/useRecentClientsSearch.spec.js +85 -0
  306. package/lib/hooks/useRecentContexts.spec.js +139 -0
  307. package/lib/hooks/useResize.spec.js +37 -0
  308. package/lib/hooks/useSkillsCatalog.spec.js +88 -0
  309. package/lib/hooks/useSlashCommands.spec.js +139 -0
  310. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.spec.js +101 -0
  311. package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +33 -0
  312. package/lib/hooks/useStreamResponse.spec.js +199 -0
  313. package/lib/hooks/useT.spec.js +20 -0
  314. package/lib/hooks/useToggle.spec.js +33 -0
  315. package/lib/hooks/useToggleFavorite/useToggleFavorite.spec.js +171 -0
  316. package/lib/index.js +5 -2
  317. package/lib/lang/br/index.js +26 -1
  318. package/lib/lang/en/index.js +26 -1
  319. package/lib/lang/es/index.js +26 -1
  320. package/lib/lang/fr/index.js +26 -1
  321. package/lib/services/maia/Access/updateAccess.spec.js +137 -0
  322. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
  323. package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +56 -0
  324. package/lib/services/maia/Actions/getSlashCommands.spec.js +91 -0
  325. package/lib/services/maia/Agents/connectors.spec.js +359 -0
  326. package/lib/services/maia/Agents/createAgent.spec.js +55 -0
  327. package/lib/services/maia/Agents/deleteAgent.spec.js +57 -0
  328. package/lib/services/maia/Agents/fetchAgentDetail.spec.js +108 -0
  329. package/lib/services/maia/Agents/getAgentById.spec.js +190 -0
  330. package/lib/services/maia/Agents/getAgentModels.spec.js +190 -0
  331. package/lib/services/maia/Agents/getAgentSuggestions.spec.js +89 -0
  332. package/lib/services/maia/Agents/getAgents.helpers.js +181 -0
  333. package/lib/services/maia/Agents/getAgents.helpers.spec.js +211 -0
  334. package/lib/services/maia/Agents/getAgents.js +78 -242
  335. package/lib/services/maia/Agents/getAgents.spec.js +697 -0
  336. package/lib/services/maia/Agents/setAgentToolGroups.spec.js +45 -0
  337. package/lib/services/maia/Agents/toggleFavorite.spec.js +59 -0
  338. package/lib/services/maia/Agents/updateAgent.spec.js +48 -0
  339. package/lib/services/maia/Chats/deleteChat.spec.js +31 -0
  340. package/lib/services/maia/Chats/getChatMessages.spec.js +150 -0
  341. package/lib/services/maia/Chats/getChatsByUserId.spec.js +149 -0
  342. package/lib/services/maia/Chats/markSessionAsRead.spec.js +30 -0
  343. package/lib/services/maia/Chats/patchChat.spec.js +41 -0
  344. package/lib/services/maia/Chats/wasHelpfulChat.spec.js +28 -0
  345. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +58 -0
  346. package/lib/services/maia/Knowledge/delete.spec.js +45 -0
  347. package/lib/services/maia/Knowledge/download.spec.js +78 -0
  348. package/lib/services/maia/Knowledge/save.spec.js +58 -0
  349. package/lib/services/maia/Orchestrator/orchestrator.helpers.js +130 -0
  350. package/lib/services/maia/Orchestrator/orchestrator.helpers.spec.js +153 -0
  351. package/lib/services/maia/Orchestrator/orchestrator.js +38 -121
  352. package/lib/services/maia/Orchestrator/orchestrator.spec.js +181 -0
  353. package/lib/services/maia/RecentClients/getRecentClients.spec.js +52 -0
  354. package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +103 -0
  355. package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +82 -0
  356. package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +63 -0
  357. package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +82 -0
  358. package/lib/services/maia/Skills/createSkill.spec.js +68 -0
  359. package/lib/services/maia/Skills/deleteSkill.spec.js +42 -0
  360. package/lib/services/maia/Skills/generateSkill.spec.js +48 -0
  361. package/lib/services/maia/Skills/getSkills.spec.js +152 -0
  362. package/lib/services/maia/Skills/updateSkill.spec.js +62 -0
  363. package/lib/services/maia/client.spec.js +56 -0
  364. package/lib/services/utils/fetchCOR.spec.js +211 -0
  365. package/lib/services/utils/getCookie.spec.js +20 -0
  366. package/lib/services/utils/mapChatMessages.spec.js +254 -0
  367. package/lib/store/chatsSidebarOptimistic.spec.js +112 -0
  368. package/lib/store/maiaLastChatPersistence.spec.js +22 -0
  369. package/lib/store/maiaPanelSessionPersistence.spec.js +62 -0
  370. package/lib/store/sessions/sessionNotificationSound.spec.js +145 -0
  371. package/lib/store/sessions/sessionNotifications.helpers.js +45 -0
  372. package/lib/store/sessions/sessionNotifications.helpers.spec.js +63 -0
  373. package/lib/store/sessions/sessionNotifications.js +35 -41
  374. package/lib/store/sessions/sessionNotifications.spec.js +106 -0
  375. package/lib/store/sessions/sessionStreamManager.js +40 -52
  376. package/lib/store/sessions/sessionStreamManager.spec.js +503 -0
  377. package/lib/store/sessions/sessions.types.spec.js +16 -0
  378. package/lib/store/sessions/useSessionsStore.spec.js +135 -0
  379. package/lib/store/useChatsStore.spec.js +619 -0
  380. package/lib/store/useFaqsStore.spec.js +57 -0
  381. package/lib/styles/cascade.js +29 -3
  382. package/lib/styles/transitions.js +3 -1
  383. package/lib/test/mockSseStream.js +121 -0
  384. package/lib/test/streamdownCodeMock.js +6 -0
  385. package/lib/test/streamdownMock.js +12 -0
  386. package/lib/types/agentModal.js +1 -1
  387. package/lib/types/global.d.js +1 -1
  388. package/lib/utils/actionCategoryMap.spec.js +18 -0
  389. package/lib/utils/agentDisplayName.spec.js +44 -0
  390. package/lib/utils/autoApproveStorage.spec.js +25 -0
  391. package/lib/utils/chatInputFiles.spec.js +39 -0
  392. package/lib/utils/contextMentionIcons.spec.js +41 -0
  393. package/lib/utils/contextMentionLabel.spec.js +13 -0
  394. package/lib/utils/contextMentionTriggers.spec.js +38 -0
  395. package/lib/utils/contextMentionTypeLabel.spec.js +14 -0
  396. package/lib/utils/corConnectorMentionTypes.spec.js +23 -0
  397. package/lib/utils/entityLinkRender.spec.js +72 -0
  398. package/lib/utils/fileDownloadHelper.spec.js +67 -0
  399. package/lib/utils/formatQuickActionMessage.spec.js +27 -0
  400. package/lib/utils/formatUnreadCount.spec.js +12 -0
  401. package/lib/utils/getUnitFileSize.spec.js +18 -0
  402. package/lib/utils/hitlAnalytics.spec.js +100 -0
  403. package/lib/utils/hoursPlannerQuickActionType.js +74 -1
  404. package/lib/utils/hoursPlannerQuickActionType.spec.js +64 -0
  405. package/lib/utils/imagePreprocessor.helpers.js +28 -0
  406. package/lib/utils/imagePreprocessor.helpers.spec.js +28 -0
  407. package/lib/utils/imagePreprocessor.js +12 -37
  408. package/lib/utils/imagePreprocessor.spec.js +112 -0
  409. package/lib/utils/maiaPageRoute.js +24 -0
  410. package/lib/utils/maiaPageRoute.spec.js +23 -0
  411. package/lib/utils/mapBackendLang.spec.js +19 -0
  412. package/lib/utils/navigateContextEntity.spec.js +50 -0
  413. package/lib/utils/normalizeAgentConnectors.spec.js +107 -0
  414. package/lib/utils/orchestratorSubagents.spec.js +32 -0
  415. package/lib/utils/reasoningMappers.spec.js +103 -0
  416. package/lib/utils/recentContextsHomeLimit.spec.js +32 -0
  417. package/lib/utils/renderContextMentions.spec.js +158 -0
  418. package/lib/utils/retryCompletion.spec.js +99 -0
  419. package/lib/utils/skillContentSize.spec.js +13 -0
  420. package/lib/utils/slashCommandMarker.spec.js +43 -0
  421. package/lib/utils/sortManagerHoursHomeFuas.spec.js +51 -0
  422. package/lib/utils/sseStreamContent.spec.js +31 -0
  423. package/lib/utils/streamActivityMessages.js +32 -19
  424. package/lib/utils/streamActivityMessages.spec.js +227 -0
  425. package/lib/utils/validateTrimmedFields.spec.js +26 -0
  426. package/package.json +1 -1
  427. package/README.md +0 -2
@@ -9,7 +9,8 @@ var SEARCH_MESSAGE_KEYS = ['chat.activity.search.scanning', 'chat.activity.searc
9
9
  var DEEP_SEARCH_MESSAGE_KEYS = ['chat.activity.deepSearch.exploring', 'chat.activity.deepSearch.crossChecking'];
10
10
  var ATTACHMENT_MESSAGE_KEYS = ['chat.activity.attachment.reading', 'chat.activity.attachment.extracting'];
11
11
  var ATTACHMENT_MESSAGE_KEYS_PLURAL = ['chat.activity.attachment.readingPlural', 'chat.activity.attachment.extractingPlural'];
12
- export var WRITING_ACTIVITY_MESSAGE_KEY = 'chat.activity.writing.composing';
12
+ export var THINKING_ACTIVITY_MESSAGE_KEY = 'chat.activity.thinking.label';
13
+ export var WRITING_ACTIVITY_MESSAGE_KEY = 'chat.activity.writing.label';
13
14
  var TOOL_ACTION_IDS = {
14
15
  create_task: 'createTask',
15
16
  clone_task: 'createTask',
@@ -245,19 +246,6 @@ export var resolveHitlNodeStreamActivity = function resolveHitlNodeStreamActivit
245
246
  }
246
247
  return mapNodeMessageToStreamActivity(nodeMessage, t, options);
247
248
  };
248
- export var resolveInitialHitlStreamActivity = function resolveInitialHitlStreamActivity(t, context) {
249
- var pendingActions = resolvePendingActionsForThread(context);
250
- var detectedTools = detectToolsFromPendingActions(pendingActions);
251
- if (detectedTools.length >= 1) {
252
- return mapHitlToolNameToStreamActivity(detectedTools[0], t, {
253
- useResumingFallback: true
254
- });
255
- }
256
- return {
257
- phase: 'processing',
258
- message: t('chat.processing')
259
- };
260
- };
261
249
  export var ACTIVITY_MESSAGE_ROTATE_MS = 3200;
262
250
  var ROTATABLE_PHASES = ['generating', 'thinking', 'search', 'deep_search', 'attachment'];
263
251
  var getMessageKeysForPhase = function getMessageKeysForPhase(phase) {
@@ -320,26 +308,51 @@ export var advanceStreamActivityMessage = function advanceStreamActivityMessage(
320
308
  export var canRotateStreamActivityPhase = function canRotateStreamActivityPhase(phase) {
321
309
  return ROTATABLE_PHASES.includes(phase);
322
310
  };
311
+ export var getThinkingStreamActivity = function getThinkingStreamActivity(t) {
312
+ return {
313
+ phase: 'thinking',
314
+ message: t(THINKING_ACTIVITY_MESSAGE_KEY)
315
+ };
316
+ };
323
317
  export var getWritingStreamActivity = function getWritingStreamActivity(t) {
324
318
  return {
325
319
  phase: 'writing',
326
320
  message: t(WRITING_ACTIVITY_MESSAGE_KEY)
327
321
  };
328
322
  };
323
+ export var resolveInitialHitlStreamActivity = function resolveInitialHitlStreamActivity(t, context) {
324
+ var pendingActions = resolvePendingActionsForThread(context);
325
+ var detectedTools = detectToolsFromPendingActions(pendingActions);
326
+ if (detectedTools.length >= 1) {
327
+ return mapHitlToolNameToStreamActivity(detectedTools[0], t, {
328
+ useResumingFallback: true
329
+ });
330
+ }
331
+ return {
332
+ phase: 'processing',
333
+ message: t('chat.processing')
334
+ };
335
+ };
336
+
337
+ /** Tras el primer evento del stream el indicador en vivo solo alterna pensando / escribiendo. */
338
+ export var toIndicatorStreamActivity = function toIndicatorStreamActivity(activity, t) {
339
+ if (!activity) return null;
340
+ return activity.phase === 'writing' ? getWritingStreamActivity(t) : getThinkingStreamActivity(t);
341
+ };
329
342
  export var getInitialStreamActivity = function getInitialStreamActivity(t, options) {
330
- if (options.isWebSearchActive) {
343
+ if (options !== null && options !== void 0 && options.isWebSearchActive) {
331
344
  return {
332
345
  phase: 'search',
333
346
  message: t(SEARCH_MESSAGE_KEYS[0])
334
347
  };
335
348
  }
336
- if (options.isDeepSearchActive) {
349
+ if (options !== null && options !== void 0 && options.isDeepSearchActive) {
337
350
  return {
338
351
  phase: 'deep_search',
339
352
  message: t(DEEP_SEARCH_MESSAGE_KEYS[0])
340
353
  };
341
354
  }
342
- if (options.hasAttachments) {
355
+ if (options !== null && options !== void 0 && options.hasAttachments) {
343
356
  var _options$attachmentsC;
344
357
  var attachmentsCount = (_options$attachmentsC = options.attachmentsCount) !== null && _options$attachmentsC !== void 0 ? _options$attachmentsC : 0;
345
358
  return {
@@ -383,7 +396,7 @@ export var resolveStreamLoadingDisplay = function resolveStreamLoadingDisplay(pa
383
396
  };
384
397
  }
385
398
  if (params.loadingMessage) {
386
- if (params.loadingMessage === params.t('chat.writing') || params.loadingMessage === params.t(WRITING_ACTIVITY_MESSAGE_KEY)) {
399
+ if (params.loadingMessage === params.t('chat.writing') || params.loadingMessage === params.t(WRITING_ACTIVITY_MESSAGE_KEY) || params.loadingMessage === params.t('chat.activity.writing.composing')) {
387
400
  return getWritingStreamActivity(params.t);
388
401
  }
389
402
  if (params.loadingMessage === params.t('chat.generating')) {
@@ -421,4 +434,4 @@ export var isStreamingPlaceholderMessageId = function isStreamingPlaceholderMess
421
434
  export var streamingPlaceholderMessageId = function streamingPlaceholderMessageId(messageId) {
422
435
  return "answer-".concat(messageId, "-streaming");
423
436
  };
424
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJub3JtYWxpemVIaXRsVG9vbE5hbWUiLCJUSElOS0lOR19NRVNTQUdFX0tFWVMiLCJHRU5FUkFUSU5HX01FU1NBR0VfS0VZUyIsIlNFQVJDSF9NRVNTQUdFX0tFWVMiLCJERUVQX1NFQVJDSF9NRVNTQUdFX0tFWVMiLCJBVFRBQ0hNRU5UX01FU1NBR0VfS0VZUyIsIkFUVEFDSE1FTlRfTUVTU0FHRV9LRVlTX1BMVVJBTCIsIldSSVRJTkdfQUNUSVZJVFlfTUVTU0FHRV9LRVkiLCJUT09MX0FDVElPTl9JRFMiLCJjcmVhdGVfdGFzayIsImNsb25lX3Rhc2siLCJjcmVhdGVfdGFza3NfYmF0Y2giLCJjcmVhdGVfYWdlbnQiLCJlZGl0X2FnZW50IiwiZWRpdF90YXNrIiwiZWRpdF90YXNrc19iYXRjaCIsImRlbGV0ZV90YXNrIiwiZGVsZXRlX3Rhc2tzX2JhdGNoIiwidGFza19hc3NpZ24iLCJ0YXNrX3VuYXNzaWduIiwiYXNzaWduX3Rhc2tfbGFiZWwiLCJjcmVhdGVfbGFiZWxzIiwiZWRpdF9wcm9qZWN0IiwiY3JlYXRlX2NoZWNrbGlzdF9pdGVtIiwidXBkYXRlX3Rhc2tfdHlwZSIsInVwZGF0ZV9lc3RpbWF0ZWRfaG91cnMiLCJ1cGRhdGVfZGVsaXZlcmFibGUiLCJjcmVhdGVfaG91ciIsImNyZWF0ZV9ob3VycyIsImNyZWF0ZV9jaGVja2xpc3QiLCJnZXRfdGFza19kYXRlX2hvdXJzIiwiY29uZmlndXJlX2FnZW50X2FjY2VzcyIsInNlbmRfdGFza19tZXNzYWdlIiwiZGVsZXRlX2NoZWNrbGlzdF9pdGVtIiwicmVtb3ZlX3Rhc2tfdHlwZSIsInJlbW92ZV90YXNrX2xhYmVsIiwiY291bnRfZGVsaXZlcmFibGUiLCJjcmVhdGVfcmV3b3JrIiwidXBkYXRlX3Jld29yayIsImdldF9wcm9qZWN0X3dpdGhfdGFza3NfaW5mbyIsImdldF90YXNrIiwiZ2V0X3Rhc2tfaGlzdG9yeSIsImdldF90YXNrX2xhYmVscyIsImdldF90YXNrX3R5cGVzIiwiZ2V0X3Rhc2tfdHlwZV9jYXRlZ29yaWVzIiwiZ2V0X3Byb2plY3RfZmVlX2NvbnN1bXB0aW9uIiwiZ2V0X3Byb2plY3RfdGFiX2V2b2x1dGlvbiIsImdldF9wcm9qZWN0X3RhYl9ldm9sdXRpb25fY29zdHMiLCJnZXRfcHJvamVjdF9wZXJmb3JtYW5jZV90YWJfdGltZV9ieV9ncm91cGVkIiwiZ2V0X2RlbGl2ZXJhYmxlX2J5X3Byb2plY3RfaWQiLCJnZXRfcmV3b3JrX2J5X3Byb2plY3RfaWQiLCJnZXRfY29udHJhY3QiLCJsaXN0X3Byb2plY3RzIiwiZ2V0X2NsaWVudCIsImdldF9jbGllbnRfc3RhdHVzZXMiLCJnZXRfY2xpZW50c193aXRoX2ZpbHRlcnMiLCJsaXN0X2NsaWVudHMiLCJnZXRfaG91cnMiLCJnZXRfaG91cnNfY2FwYWNpdHkiLCJnZXRfcHJvamVjdF9ob3Vyc19ieV91c2VyX2FuZF90YXNrIiwiZ2V0X3Byb2plY3RfaG91cnNfYnlfdXNlcl9tb250aGx5IiwiZ2V0X3dvcmtpbmdfdGltZSIsImdldF9jaGFyZ2luZ19wZXJpb2QiLCJzdW1tYXJpemVfaG91cnMiLCJyZWNvbW1lbmRfaG91cnNfZnJvbV9wbGFubmVyIiwiZ2V0X3BsYW5uZXIiLCJsaXN0X3VzZXJzIiwiZ2V0X2Rhc2hib2FyZF9ieV9jb21wYW55IiwiZ2V0X2Rhc2hib2FyZF9kYXRhIiwiZ2V0X3JlY2VudF9hY3Rpdml0eSIsImxpc3RfY29udHJhY3RzIiwibGlzdF9mZWVzIiwibGlzdF9pbnZvaWNlcyIsImNoZWNrbGlzdCIsInJld29ya3MiLCJ0YXZpbHlfc2VhcmNoIiwiZ2V0X3VzZXJfaWQiLCJnZXRfY2xpZW50X2lkX2Jhc2VkX29uX25hbWUiLCJnZXRfcHJvamVjdF9pZF9iYXNlZF9vbl9uYW1lIiwiZ2V0X3Rhc2tfaWRfYmFzZWRfb25fdGl0bGUiLCJnZXRfdXNlcl9wb3NpdGlvbl9pZF9iYXNlZF9vbl9uYW1lIiwiZ2V0X2xhYmVsX2NvbG9ycyIsImdldF9tb2RlbHMiLCJjcmVhdGVfcHJvamVjdCIsImNyZWF0ZV9jbGllbnQiLCJlZGl0X2NsaWVudCIsImNyZWF0ZV91c2VyIiwiZWRpdF91c2VyIiwiY3JlYXRlX3Rhc2tfdHlwZSIsImVkaXRfaG91ciIsImNyZWF0ZV9hbGxvY2F0aW9uIiwiZWRpdF9hbGxvY2F0aW9uIiwiZGVsZXRlX2FsbG9jYXRpb24iLCJoYW5kb2ZmX3RvX29yY2hlc3RyYXRvciIsImFjdGlvbk1lc3NhZ2VLZXkiLCJhY3Rpb25JZCIsInRlbnNlIiwiY29uY2F0IiwicmVzb2x2ZVRvb2xBY3Rpb25MYWJlbCIsInRvb2xOYW1lIiwidCIsIkhJVExfVE9PTF9OQU1FU19CWV9TUEVDSUZJQ0lUWSIsIk9iamVjdCIsImtleXMiLCJzb3J0IiwiYSIsImIiLCJsZW5ndGgiLCJsb29rc0xpa2VSYXdUb29sTmFtZSIsIm1lc3NhZ2UiLCJ0ZXN0IiwidHJpbSIsImlzR2VuZXJpY1Jlc3VtZU5vZGVNZXNzYWdlIiwibm9ybWFsaXplZCIsInRvTG93ZXJDYXNlIiwic3RhcnRzV2l0aCIsIm1hcEhpdGxUb29sTmFtZVRvU3RyZWFtQWN0aXZpdHkiLCJvcHRpb25zIiwicGhhc2UiLCJ1c2VSZXN1bWluZ0ZhbGxiYWNrIiwicmVzb2x2ZVRvb2xTdGVwUGFzdExhYmVsIiwiX3Jlc29sdmVUb29sQWN0aW9uTGFiIiwicmVzb2x2ZUhpdGxUb29sRnJvbU5vZGVNZXNzYWdlIiwibm9kZU1lc3NhZ2UiLCJhc1Rvb2xOYW1lIiwicmVwbGFjZSIsIm1hdGNoZWRUb29sIiwiZmluZCIsImluY2x1ZGVzIiwibWFwTm9kZU1lc3NhZ2VUb1N0cmVhbUFjdGl2aXR5IiwiaGl0bFRvb2wiLCJ0cmltbWVkTWVzc2FnZSIsInJlc29sdmVQZW5kaW5nQWN0aW9uc0ZvclRocmVhZCIsImNvbnRleHQiLCJ0aHJlYWRJZCIsIl9yZWYiLCJfY29udGV4dCRwZW5kaW5nQWN0aW8iLCJfY29udGV4dCRhcHByb3ZhbCIsIl9jb250ZXh0JHRocmVhZElkcyIsInBlbmRpbmciLCJwZW5kaW5nQWN0aW9ucyIsImFwcHJvdmFsIiwicGVuZGluZ19hY3Rpb25zIiwiZm9yVGhyZWFkIiwiZmlsdGVyIiwiYWN0aW9uIiwidGhyZWFkX2lkIiwidGhyZWFkSWRzIiwiX2NvbnRleHQkdGhyZWFkSWRzMiIsImRldGVjdFRvb2xzRnJvbVBlbmRpbmdBY3Rpb25zIiwiYWN0aW9ucyIsIl90b0NvbnN1bWFibGVBcnJheSIsIlNldCIsIm1hcCIsInRvb2xfbmFtZSIsIkJvb2xlYW4iLCJyZXNvbHZlSGl0bE5vZGVTdHJlYW1BY3Rpdml0eSIsInBlbmRpbmdGb3JUaHJlYWQiLCJkZXRlY3RlZFRvb2xzIiwidHJpbW1lZE5vZGVNZXNzYWdlIiwiaXNSYXciLCJpc0dlbmVyaWMiLCJub2RlTWVzc2FnZUNvbnRhaW5zVG9vbCIsInNvbWUiLCJ0b29sIiwiYWN0aXZpdHlGcm9tTm9kZU1lc3NhZ2UiLCJyZXNvbHZlSW5pdGlhbEhpdGxTdHJlYW1BY3Rpdml0eSIsIkFDVElWSVRZX01FU1NBR0VfUk9UQVRFX01TIiwiUk9UQVRBQkxFX1BIQVNFUyIsImdldE1lc3NhZ2VLZXlzRm9yUGhhc2UiLCJhdHRhY2htZW50c0NvdW50IiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwiZ2V0U3RyZWFtQWN0aXZpdHlNZXNzYWdlQXRJbmRleCIsImluZGV4IiwiY2xhbXBlZEluZGV4IiwiTWF0aCIsIm1pbiIsIm1heCIsImdldFRoaW5raW5nTG9hZGluZ01lc3NhZ2UiLCJnZXRHZW5lcmF0aW5nTG9hZGluZ01lc3NhZ2UiLCJjYW5BZHZhbmNlU3RyZWFtQWN0aXZpdHlNZXNzYWdlIiwiY3VycmVudEluZGV4IiwiYWR2YW5jZVN0cmVhbUFjdGl2aXR5TWVzc2FnZSIsImFjdGl2aXR5IiwibmV4dEluZGV4IiwiX29iamVjdFNwcmVhZCIsImNhblJvdGF0ZVN0cmVhbUFjdGl2aXR5UGhhc2UiLCJnZXRXcml0aW5nU3RyZWFtQWN0aXZpdHkiLCJnZXRJbml0aWFsU3RyZWFtQWN0aXZpdHkiLCJpc1dlYlNlYXJjaEFjdGl2ZSIsImlzRGVlcFNlYXJjaEFjdGl2ZSIsImhhc0F0dGFjaG1lbnRzIiwiX29wdGlvbnMkYXR0YWNobWVudHNDIiwicmVzb2x2ZVN0cmVhbUxvYWRpbmdEaXNwbGF5IiwicGFyYW1zIiwic3RyZWFtQWN0aXZpdHkiLCJhY3RpdmVLZXlzIiwiYWN0aXZlTG9hZGluZ3MiLCJmaXJzdEtleSIsInJhdyIsInRyaW1tZWQiLCJsb2FkaW5nTWVzc2FnZSIsIndhaXRpbmdSZXNwb25zZSIsImlzU3RyZWFtaW5nUGxhY2Vob2xkZXJNZXNzYWdlSWQiLCJtZXNzYWdlSWQiLCJzdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zdHJlYW1BY3Rpdml0eU1lc3NhZ2VzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3RyZWFtQWN0aXZpdHksIFN0cmVhbUFjdGl2aXR5UGhhc2UgfSBmcm9tICcuLi90eXBlcy9zdHJlYW1BY3Rpdml0eSdcbmltcG9ydCB0eXBlIHsgQXBwcm92YWxSZXF1ZXN0LCBQZW5kaW5nQWN0aW9uIH0gZnJvbSAnLi4vdHlwZXMvQ2hhdCdcbmltcG9ydCB7IG5vcm1hbGl6ZUhpdGxUb29sTmFtZSB9IGZyb20gJy4vaGl0bEFuYWx5dGljcydcblxudHlwZSBUcmFuc2xhdGVGbiA9IChrZXk6IHN0cmluZykgPT4gc3RyaW5nXG5cbmNvbnN0IFRISU5LSU5HX01FU1NBR0VfS0VZUyA9IFtcbiAgJ2NoYXQuYWN0aXZpdHkudGhpbmtpbmcuYW5hbHl6aW5nJyxcbiAgJ2NoYXQuYWN0aXZpdHkudGhpbmtpbmcucmV2aWV3aW5nJyxcbiAgJ2NoYXQuYWN0aXZpdHkudGhpbmtpbmcucGxhbm5pbmcnLFxuXSBhcyBjb25zdFxuXG5jb25zdCBHRU5FUkFUSU5HX01FU1NBR0VfS0VZUyA9IFtcbiAgJ2NoYXQuYWN0aXZpdHkuZ2VuZXJhdGluZy5jb25zaWRlcmluZycsXG4gICdjaGF0LmFjdGl2aXR5LmdlbmVyYXRpbmcuYWxtb3N0UmVhZHknLFxuICAnY2hhdC5hY3Rpdml0eS5nZW5lcmF0aW5nLnByZXBhcmluZycsXG5dIGFzIGNvbnN0XG5cbmNvbnN0IFNFQVJDSF9NRVNTQUdFX0tFWVMgPSBbJ2NoYXQuYWN0aXZpdHkuc2VhcmNoLnNjYW5uaW5nJywgJ2NoYXQuYWN0aXZpdHkuc2VhcmNoLnN1bW1hcml6aW5nJ10gYXMgY29uc3RcblxuY29uc3QgREVFUF9TRUFSQ0hfTUVTU0FHRV9LRVlTID0gW1xuICAnY2hhdC5hY3Rpdml0eS5kZWVwU2VhcmNoLmV4cGxvcmluZycsXG4gICdjaGF0LmFjdGl2aXR5LmRlZXBTZWFyY2guY3Jvc3NDaGVja2luZycsXG5dIGFzIGNvbnN0XG5cbmNvbnN0IEFUVEFDSE1FTlRfTUVTU0FHRV9LRVlTID0gWydjaGF0LmFjdGl2aXR5LmF0dGFjaG1lbnQucmVhZGluZycsICdjaGF0LmFjdGl2aXR5LmF0dGFjaG1lbnQuZXh0cmFjdGluZyddIGFzIGNvbnN0XG5cbmNvbnN0IEFUVEFDSE1FTlRfTUVTU0FHRV9LRVlTX1BMVVJBTCA9IFtcbiAgJ2NoYXQuYWN0aXZpdHkuYXR0YWNobWVudC5yZWFkaW5nUGx1cmFsJyxcbiAgJ2NoYXQuYWN0aXZpdHkuYXR0YWNobWVudC5leHRyYWN0aW5nUGx1cmFsJyxcbl0gYXMgY29uc3RcblxuZXhwb3J0IGNvbnN0IFdSSVRJTkdfQUNUSVZJVFlfTUVTU0FHRV9LRVkgPSAnY2hhdC5hY3Rpdml0eS53cml0aW5nLmNvbXBvc2luZycgYXMgY29uc3RcblxuZXhwb3J0IHR5cGUgQWN0aW9uVGVuc2UgPSAncHJlc2VudCcgfCAncGFzdCdcblxuY29uc3QgVE9PTF9BQ1RJT05fSURTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBjcmVhdGVfdGFzazogJ2NyZWF0ZVRhc2snLFxuICBjbG9uZV90YXNrOiAnY3JlYXRlVGFzaycsXG4gIGNyZWF0ZV90YXNrc19iYXRjaDogJ2NyZWF0ZVRhc2tzQmF0Y2gnLFxuICBjcmVhdGVfYWdlbnQ6ICdjcmVhdGVBZ2VudCcsXG4gIGVkaXRfYWdlbnQ6ICdlZGl0QWdlbnQnLFxuICBlZGl0X3Rhc2s6ICdlZGl0VGFzaycsXG4gIGVkaXRfdGFza3NfYmF0Y2g6ICdlZGl0VGFza3NCYXRjaCcsXG4gIGRlbGV0ZV90YXNrOiAnZGVsZXRlVGFzaycsXG4gIGRlbGV0ZV90YXNrc19iYXRjaDogJ2RlbGV0ZVRhc2tzQmF0Y2gnLFxuICB0YXNrX2Fzc2lnbjogJ2Fzc2lnblVzZXInLFxuICB0YXNrX3VuYXNzaWduOiAndW5hc3NpZ25Vc2VyJyxcbiAgYXNzaWduX3Rhc2tfbGFiZWw6ICdhc3NpZ25MYWJlbCcsXG4gIGNyZWF0ZV9sYWJlbHM6ICdjcmVhdGVMYWJlbCcsXG4gIGVkaXRfcHJvamVjdDogJ2VkaXRQcm9qZWN0JyxcbiAgY3JlYXRlX2NoZWNrbGlzdF9pdGVtOiAnY3JlYXRlQ2hlY2tsaXN0SXRlbScsXG4gIHVwZGF0ZV90YXNrX3R5cGU6ICd1cGRhdGVUYXNrVHlwZScsXG4gIHVwZGF0ZV9lc3RpbWF0ZWRfaG91cnM6ICd1cGRhdGVFc3RpbWF0ZWRIb3VycycsXG4gIHVwZGF0ZV9kZWxpdmVyYWJsZTogJ3VwZGF0ZURlbGl2ZXJhYmxlJyxcbiAgY3JlYXRlX2hvdXI6ICdsb2dIb3VycycsXG4gIGNyZWF0ZV9ob3VyczogJ2xvZ0hvdXJzJyxcbiAgY3JlYXRlX2NoZWNrbGlzdDogJ2NyZWF0ZUNoZWNrbGlzdCcsXG4gIGdldF90YXNrX2RhdGVfaG91cnM6ICdxdWVyeUhvdXJzJyxcbiAgY29uZmlndXJlX2FnZW50X2FjY2VzczogJ2NvbmZpZ3VyZUFnZW50QWNjZXNzJyxcbiAgc2VuZF90YXNrX21lc3NhZ2U6ICdzZW5kVGFza01lc3NhZ2UnLFxuICBkZWxldGVfY2hlY2tsaXN0X2l0ZW06ICdkZWxldGVDaGVja2xpc3RJdGVtJyxcbiAgcmVtb3ZlX3Rhc2tfdHlwZTogJ3JlbW92ZVRhc2tUeXBlJyxcbiAgcmVtb3ZlX3Rhc2tfbGFiZWw6ICdyZW1vdmVMYWJlbCcsXG4gIGNvdW50X2RlbGl2ZXJhYmxlOiAndXBkYXRlRGVsaXZlcmFibGVDb3VudCcsXG4gIGNyZWF0ZV9yZXdvcms6ICdjcmVhdGVSZXdvcmsnLFxuICB1cGRhdGVfcmV3b3JrOiAndXBkYXRlUmV3b3JrJyxcbiAgZ2V0X3Byb2plY3Rfd2l0aF90YXNrc19pbmZvOiAncmVhZFByb2plY3RUYXNrcycsXG4gIGdldF90YXNrOiAncmVhZFRhc2snLFxuICBnZXRfdGFza19oaXN0b3J5OiAncmVhZFRhc2snLFxuICBnZXRfdGFza19sYWJlbHM6ICdyZWFkVGFzaycsXG4gIGdldF90YXNrX3R5cGVzOiAncmVhZFRhc2tUeXBlcycsXG4gIGdldF90YXNrX3R5cGVfY2F0ZWdvcmllczogJ3JlYWRUYXNrVHlwZXMnLFxuICBnZXRfcHJvamVjdF9mZWVfY29uc3VtcHRpb246ICdyZWFkUHJvamVjdCcsXG4gIGdldF9wcm9qZWN0X3RhYl9ldm9sdXRpb246ICdyZWFkUHJvamVjdCcsXG4gIGdldF9wcm9qZWN0X3RhYl9ldm9sdXRpb25fY29zdHM6ICdyZWFkUHJvamVjdCcsXG4gIGdldF9wcm9qZWN0X3BlcmZvcm1hbmNlX3RhYl90aW1lX2J5X2dyb3VwZWQ6ICdyZWFkUHJvamVjdCcsXG4gIGdldF9kZWxpdmVyYWJsZV9ieV9wcm9qZWN0X2lkOiAncmVhZFByb2plY3QnLFxuICBnZXRfcmV3b3JrX2J5X3Byb2plY3RfaWQ6ICdyZWFkUHJvamVjdCcsXG4gIGdldF9jb250cmFjdDogJ3JlYWRQcm9qZWN0JyxcbiAgbGlzdF9wcm9qZWN0czogJ2xpc3RQcm9qZWN0cycsXG4gIGdldF9jbGllbnQ6ICdyZWFkQ2xpZW50JyxcbiAgZ2V0X2NsaWVudF9zdGF0dXNlczogJ3JlYWRDbGllbnQnLFxuICBnZXRfY2xpZW50c193aXRoX2ZpbHRlcnM6ICdyZWFkQ2xpZW50JyxcbiAgbGlzdF9jbGllbnRzOiAncmVhZENsaWVudCcsXG4gIGdldF9ob3VyczogJ3JlYWRIb3VycycsXG4gIGdldF9ob3Vyc19jYXBhY2l0eTogJ3JlYWRIb3VycycsXG4gIGdldF9wcm9qZWN0X2hvdXJzX2J5X3VzZXJfYW5kX3Rhc2s6ICdyZWFkSG91cnMnLFxuICBnZXRfcHJvamVjdF9ob3Vyc19ieV91c2VyX21vbnRobHk6ICdyZWFkSG91cnMnLFxuICBnZXRfd29ya2luZ190aW1lOiAncmVhZEhvdXJzJyxcbiAgZ2V0X2NoYXJnaW5nX3BlcmlvZDogJ3JlYWRIb3VycycsXG4gIHN1bW1hcml6ZV9ob3VyczogJ3JlYWRIb3VycycsXG4gIHJlY29tbWVuZF9ob3Vyc19mcm9tX3BsYW5uZXI6ICdyZWFkSG91cnMnLFxuICBnZXRfcGxhbm5lcjogJ3JlYWRQbGFubmVyJyxcbiAgbGlzdF91c2VyczogJ3JlYWRVc2VycycsXG4gIGdldF9kYXNoYm9hcmRfYnlfY29tcGFueTogJ3JlYWRNZXRyaWNzJyxcbiAgZ2V0X2Rhc2hib2FyZF9kYXRhOiAncmVhZE1ldHJpY3MnLFxuICBnZXRfcmVjZW50X2FjdGl2aXR5OiAncmVhZE1ldHJpY3MnLFxuICBsaXN0X2NvbnRyYWN0czogJ3JlYWRCaWxsaW5nJyxcbiAgbGlzdF9mZWVzOiAncmVhZEJpbGxpbmcnLFxuICBsaXN0X2ludm9pY2VzOiAncmVhZEJpbGxpbmcnLFxuICBjaGVja2xpc3Q6ICdyZWFkQ2hlY2tsaXN0JyxcbiAgcmV3b3JrczogJ3JlYWRSZXdvcmtzJyxcbiAgdGF2aWx5X3NlYXJjaDogJ3NlYXJjaFdlYicsXG4gIGdldF91c2VyX2lkOiAncmVhZFJlZmVyZW5jZXMnLFxuICBnZXRfY2xpZW50X2lkX2Jhc2VkX29uX25hbWU6ICdyZWFkUmVmZXJlbmNlcycsXG4gIGdldF9wcm9qZWN0X2lkX2Jhc2VkX29uX25hbWU6ICdyZWFkUmVmZXJlbmNlcycsXG4gIGdldF90YXNrX2lkX2Jhc2VkX29uX3RpdGxlOiAncmVhZFJlZmVyZW5jZXMnLFxuICBnZXRfdXNlcl9wb3NpdGlvbl9pZF9iYXNlZF9vbl9uYW1lOiAncmVhZFJlZmVyZW5jZXMnLFxuICBnZXRfbGFiZWxfY29sb3JzOiAncmVhZFJlZmVyZW5jZXMnLFxuICBnZXRfbW9kZWxzOiAncmVhZFJlZmVyZW5jZXMnLFxuICBjcmVhdGVfcHJvamVjdDogJ2NyZWF0ZVByb2plY3QnLFxuICBjcmVhdGVfY2xpZW50OiAnY3JlYXRlQ2xpZW50JyxcbiAgZWRpdF9jbGllbnQ6ICdlZGl0Q2xpZW50JyxcbiAgY3JlYXRlX3VzZXI6ICdjcmVhdGVVc2VyJyxcbiAgZWRpdF91c2VyOiAnZWRpdFVzZXInLFxuICBjcmVhdGVfdGFza190eXBlOiAnY3JlYXRlVGFza1R5cGUnLFxuICBlZGl0X2hvdXI6ICdlZGl0SG91cnMnLFxuICBjcmVhdGVfYWxsb2NhdGlvbjogJ2NyZWF0ZUFsbG9jYXRpb24nLFxuICBlZGl0X2FsbG9jYXRpb246ICdlZGl0QWxsb2NhdGlvbicsXG4gIGRlbGV0ZV9hbGxvY2F0aW9uOiAnZGVsZXRlQWxsb2NhdGlvbicsXG5cbiAgaGFuZG9mZl90b19vcmNoZXN0cmF0b3I6ICdhc2tBbm90aGVyU3BlY2lhbGlzdCcsXG59XG5cbmNvbnN0IGFjdGlvbk1lc3NhZ2VLZXkgPSAoYWN0aW9uSWQ6IHN0cmluZywgdGVuc2U6IEFjdGlvblRlbnNlKTogc3RyaW5nID0+IGBjaGF0LmFjdGl2aXR5LmFjdGlvbnMuJHthY3Rpb25JZH0uJHt0ZW5zZX1gXG5cbmV4cG9ydCBjb25zdCByZXNvbHZlVG9vbEFjdGlvbkxhYmVsID0gKHRvb2xOYW1lOiBzdHJpbmcsIHQ6IFRyYW5zbGF0ZUZuLCB0ZW5zZTogQWN0aW9uVGVuc2UpOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgY29uc3QgYWN0aW9uSWQgPSBUT09MX0FDVElPTl9JRFNbbm9ybWFsaXplSGl0bFRvb2xOYW1lKHRvb2xOYW1lKV1cbiAgcmV0dXJuIGFjdGlvbklkID8gdChhY3Rpb25NZXNzYWdlS2V5KGFjdGlvbklkLCB0ZW5zZSkpIDogbnVsbFxufVxuXG5jb25zdCBISVRMX1RPT0xfTkFNRVNfQllfU1BFQ0lGSUNJVFkgPSBPYmplY3Qua2V5cyhUT09MX0FDVElPTl9JRFMpLnNvcnQoKGEsIGIpID0+IGIubGVuZ3RoIC0gYS5sZW5ndGgpXG5cbi8qKlxuICogRGV0ZWN0YSBpZGVudGlmaWNhZG9yZXMgY3J1ZG9zIGRlIHRvb2wgKHNuYWtlX2Nhc2UgLyBrZWJhYi1jYXNlIHNpbiBlc3BhY2lvcykgcXVlIGVsIGJhY2tlbmRcbiAqIHB1ZWRlIGVudmlhciBjdWFuZG8gYcO6biBubyBoYXkgdHJhZHVjY2nDs24uIE5vIGRlYmVuIG1vc3RyYXJzZSBhbCB1c3VhcmlvOiBzZSB1c2EgdW4gZmFsbGJhY2tcbiAqIGdlbsOpcmljbyBoYXN0YSBxdWUgZWwgbm9tYnJlIHNlIGFncmVndWUgYWwgZGljY2lvbmFyaW8uXG4gKi9cbmNvbnN0IGxvb2tzTGlrZVJhd1Rvb2xOYW1lID0gKG1lc3NhZ2U6IHN0cmluZyk6IGJvb2xlYW4gPT4gL15bYS16MC05XSsoPzpbXy1dW2EtejAtOV0rKSskL2kudGVzdChtZXNzYWdlLnRyaW0oKSlcblxuLyoqIE1lbnNhamVzIGdlbsOpcmljb3MgZGVsIGJhY2tlbmQgY3VhbmRvIG5vIGhheSBkZXRhbGxlIGRlIHRvb2wgKGNvbnRpbnVlLXRocmVhZCkuICovXG5jb25zdCBpc0dlbmVyaWNSZXN1bWVOb2RlTWVzc2FnZSA9IChtZXNzYWdlOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG1lc3NhZ2UudHJpbSgpLnRvTG93ZXJDYXNlKClcbiAgcmV0dXJuIChcbiAgICBub3JtYWxpemVkLnN0YXJ0c1dpdGgoJ2VqZWN1dGFuZG8gYWNjacOzbiBhcHJvYmFkYScpIHx8XG4gICAgbm9ybWFsaXplZC5zdGFydHNXaXRoKCdleGVjdXRpbmcgYXBwcm92ZWQgYWN0aW9uJykgfHxcbiAgICBub3JtYWxpemVkLnN0YXJ0c1dpdGgoJ2V4ZWN1dGFuZG8gYcOnw6NvIGFwcm92YWRhJylcbiAgKVxufVxuXG5leHBvcnQgY29uc3QgbWFwSGl0bFRvb2xOYW1lVG9TdHJlYW1BY3Rpdml0eSA9IChcbiAgdG9vbE5hbWU6IHN0cmluZyxcbiAgdDogVHJhbnNsYXRlRm4sXG4gIG9wdGlvbnM/OiB7IHVzZVJlc3VtaW5nRmFsbGJhY2s/OiBib29sZWFuIH1cbik6IFN0cmVhbUFjdGl2aXR5ID0+IHtcbiAgY29uc3QgbWVzc2FnZSA9IHJlc29sdmVUb29sQWN0aW9uTGFiZWwodG9vbE5hbWUsIHQsICdwcmVzZW50JylcbiAgaWYgKG1lc3NhZ2UpIHtcbiAgICByZXR1cm4geyBwaGFzZTogJ2FjdGlvbicsIG1lc3NhZ2UgfVxuICB9XG4gIGlmIChvcHRpb25zPy51c2VSZXN1bWluZ0ZhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHsgcGhhc2U6ICdhY3Rpb24nLCBtZXNzYWdlOiB0KCdjaGF0LmFjdGl2aXR5LnJlc3VtaW5nQWN0aW9uJykgfVxuICB9XG4gIHJldHVybiB7IHBoYXNlOiAnYWN0aW9uJywgbWVzc2FnZTogdCgnY2hhdC5leGVjdXRpbmdBY3Rpb24nKSB9XG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlVG9vbFN0ZXBQYXN0TGFiZWwgPSAodG9vbE5hbWU6IHN0cmluZywgdDogVHJhbnNsYXRlRm4pOiBzdHJpbmcgPT5cbiAgcmVzb2x2ZVRvb2xBY3Rpb25MYWJlbCh0b29sTmFtZSwgdCwgJ3Bhc3QnKSA/PyB0KCdjaGF0LmFjdGl2aXR5LmV4ZWN1dGVkQWN0aW9uJylcblxuY29uc3QgcmVzb2x2ZUhpdGxUb29sRnJvbU5vZGVNZXNzYWdlID0gKG5vZGVNZXNzYWdlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vZGVNZXNzYWdlLnRvTG93ZXJDYXNlKCkudHJpbSgpXG4gIGlmICghbm9ybWFsaXplZCkgcmV0dXJuIG51bGxcblxuICBpZiAoVE9PTF9BQ1RJT05fSURTW25vcm1hbGl6ZWRdKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRcbiAgfVxuXG4gIGNvbnN0IGFzVG9vbE5hbWUgPSBub3JtYWxpemVIaXRsVG9vbE5hbWUobm9ybWFsaXplZC5yZXBsYWNlKC9cXHMrL2csICdfJykpXG4gIGlmIChUT09MX0FDVElPTl9JRFNbYXNUb29sTmFtZV0pIHtcbiAgICByZXR1cm4gYXNUb29sTmFtZVxuICB9XG5cbiAgY29uc3QgbWF0Y2hlZFRvb2wgPSBISVRMX1RPT0xfTkFNRVNfQllfU1BFQ0lGSUNJVFkuZmluZCh0b29sTmFtZSA9PiBub3JtYWxpemVkLmluY2x1ZGVzKHRvb2xOYW1lKSlcbiAgcmV0dXJuIG1hdGNoZWRUb29sID8/IG51bGxcbn1cblxuZXhwb3J0IGNvbnN0IG1hcE5vZGVNZXNzYWdlVG9TdHJlYW1BY3Rpdml0eSA9IChcbiAgbm9kZU1lc3NhZ2U6IHN0cmluZyxcbiAgdDogVHJhbnNsYXRlRm4sXG4gIG9wdGlvbnM/OiB7IHVzZVJlc3VtaW5nRmFsbGJhY2s/OiBib29sZWFuIH1cbik6IFN0cmVhbUFjdGl2aXR5ID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vZGVNZXNzYWdlLnRvTG93ZXJDYXNlKClcblxuICBjb25zdCBoaXRsVG9vbCA9IHJlc29sdmVIaXRsVG9vbEZyb21Ob2RlTWVzc2FnZShub2RlTWVzc2FnZSlcbiAgaWYgKGhpdGxUb29sKSB7XG4gICAgcmV0dXJuIG1hcEhpdGxUb29sTmFtZVRvU3RyZWFtQWN0aXZpdHkoaGl0bFRvb2wsIHQsIG9wdGlvbnMpXG4gIH1cblxuICBpZiAoXG4gICAgbm9ybWFsaXplZC5pbmNsdWRlcygncmVzcG9uc2VfZmlsZV9nZW5lcmF0aW9uJykgfHxcbiAgICBub3JtYWxpemVkLmluY2x1ZGVzKCdnZW5lcmFuZG8gYXJjaGl2bycpIHx8XG4gICAgbm9ybWFsaXplZC5pbmNsdWRlcygnZ2VuZXJhdGluZyBmaWxlJylcbiAgKSB7XG4gICAgcmV0dXJuIHsgcGhhc2U6ICdhY3Rpb24nLCBtZXNzYWdlOiB0KCdjaGF0LmFjdGl2aXR5LmdlbmVyYXRpbmdGaWxlJykgfVxuICB9XG4gIGlmIChcbiAgICBub3JtYWxpemVkLmluY2x1ZGVzKCd0YXZpbHknKSB8fFxuICAgIG5vcm1hbGl6ZWQuaW5jbHVkZXMoJ3NlYXJjaF93ZWInKSB8fFxuICAgIG5vcm1hbGl6ZWQuaW5jbHVkZXMoJ2J1c2NhbmRvIGVuIGxhIHdlYicpIHx8XG4gICAgbm9ybWFsaXplZC5pbmNsdWRlcygnc2VhcmNoaW5nIHRoZSB3ZWInKVxuICApIHtcbiAgICByZXR1cm4geyBwaGFzZTogJ3NlYXJjaCcsIG1lc3NhZ2U6IHQoU0VBUkNIX01FU1NBR0VfS0VZU1swXSkgfVxuICB9XG5cbiAgY29uc3QgdHJpbW1lZE1lc3NhZ2UgPSBub2RlTWVzc2FnZS50cmltKClcbiAgaWYgKHRyaW1tZWRNZXNzYWdlICYmICFpc0dlbmVyaWNSZXN1bWVOb2RlTWVzc2FnZSh0cmltbWVkTWVzc2FnZSkgJiYgIWxvb2tzTGlrZVJhd1Rvb2xOYW1lKHRyaW1tZWRNZXNzYWdlKSkge1xuICAgIHJldHVybiB7IHBoYXNlOiAnYWN0aW9uJywgbWVzc2FnZTogdHJpbW1lZE1lc3NhZ2UgfVxuICB9XG5cbiAgaWYgKGlzR2VuZXJpY1Jlc3VtZU5vZGVNZXNzYWdlKHRyaW1tZWRNZXNzYWdlKSB8fCBvcHRpb25zPy51c2VSZXN1bWluZ0ZhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHsgcGhhc2U6ICdhY3Rpb24nLCBtZXNzYWdlOiB0KCdjaGF0LmFjdGl2aXR5LnJlc3VtaW5nQWN0aW9uJykgfVxuICB9XG4gIHJldHVybiB7IHBoYXNlOiAnYWN0aW9uJywgbWVzc2FnZTogdCgnY2hhdC5leGVjdXRpbmdBY3Rpb24nKSB9XG59XG5cbmV4cG9ydCB0eXBlIEhpdGxFeGVjdXRpb25Db250ZXh0ID0ge1xuICBtZXNzYWdlSWQ/OiBzdHJpbmdcbiAgbWVzc2FnZVRleHQ/OiBzdHJpbmdcbiAgYXBwcm92YWw/OiBBcHByb3ZhbFJlcXVlc3RcbiAgcGVuZGluZ0FjdGlvbnM/OiBQZW5kaW5nQWN0aW9uW11cbiAgdGhyZWFkSWRzPzogc3RyaW5nW11cbn1cblxuY29uc3QgcmVzb2x2ZVBlbmRpbmdBY3Rpb25zRm9yVGhyZWFkID0gKFxuICBjb250ZXh0OiBIaXRsRXhlY3V0aW9uQ29udGV4dCB8IG51bGwgfCB1bmRlZmluZWQsXG4gIHRocmVhZElkPzogc3RyaW5nXG4pOiBQZW5kaW5nQWN0aW9uW10gPT4ge1xuICBjb25zdCBwZW5kaW5nID0gY29udGV4dD8ucGVuZGluZ0FjdGlvbnMgPz8gY29udGV4dD8uYXBwcm92YWw/LnBlbmRpbmdfYWN0aW9ucyA/PyBbXVxuICBpZiAoIXBlbmRpbmcubGVuZ3RoKSByZXR1cm4gW11cblxuICBpZiAodGhyZWFkSWQpIHtcbiAgICBjb25zdCBmb3JUaHJlYWQgPSBwZW5kaW5nLmZpbHRlcihhY3Rpb24gPT4gYWN0aW9uLnRocmVhZF9pZCA9PT0gdGhyZWFkSWQpXG4gICAgaWYgKGZvclRocmVhZC5sZW5ndGgpIHJldHVybiBmb3JUaHJlYWRcbiAgfVxuXG4gIGlmIChjb250ZXh0Py50aHJlYWRJZHM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBwZW5kaW5nLmZpbHRlcihhY3Rpb24gPT4gY29udGV4dC50aHJlYWRJZHM/LmluY2x1ZGVzKGFjdGlvbi50aHJlYWRfaWQpKVxuICB9XG5cbiAgcmV0dXJuIHBlbmRpbmdcbn1cblxuY29uc3QgZGV0ZWN0VG9vbHNGcm9tUGVuZGluZ0FjdGlvbnMgPSAoYWN0aW9uczogUGVuZGluZ0FjdGlvbltdKTogc3RyaW5nW10gPT4gW1xuICAuLi5uZXcgU2V0KGFjdGlvbnMubWFwKGFjdGlvbiA9PiBub3JtYWxpemVIaXRsVG9vbE5hbWUoYWN0aW9uLnRvb2xfbmFtZSkpLmZpbHRlcihCb29sZWFuKSksXG5dXG5cbi8qKiBSZXN1ZWx2ZSBpbmRpY2Fkb3IgSElUTCBwcmlvcml6YW5kbyBwZW5kaW5nX2FjdGlvbnMgZGVsIG1lbnNhamUgZGUgYXByb2JhY2nDs24gYW50ZXJpb3IuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZUhpdGxOb2RlU3RyZWFtQWN0aXZpdHkgPSAoXG4gIG5vZGVNZXNzYWdlOiBzdHJpbmcsXG4gIHQ6IFRyYW5zbGF0ZUZuLFxuICBjb250ZXh0PzogSGl0bEV4ZWN1dGlvbkNvbnRleHQgfCBudWxsLFxuICB0aHJlYWRJZD86IHN0cmluZyxcbiAgb3B0aW9ucz86IHsgdXNlUmVzdW1pbmdGYWxsYmFjaz86IGJvb2xlYW4gfVxuKTogU3RyZWFtQWN0aXZpdHkgPT4ge1xuICBjb25zdCBwZW5kaW5nRm9yVGhyZWFkID0gcmVzb2x2ZVBlbmRpbmdBY3Rpb25zRm9yVGhyZWFkKGNvbnRleHQsIHRocmVhZElkKVxuICBjb25zdCBkZXRlY3RlZFRvb2xzID0gZGV0ZWN0VG9vbHNGcm9tUGVuZGluZ0FjdGlvbnMocGVuZGluZ0ZvclRocmVhZClcblxuICBjb25zdCB0cmltbWVkTm9kZU1lc3NhZ2UgPSBub2RlTWVzc2FnZS50cmltKClcbiAgY29uc3QgaXNSYXcgPSBsb29rc0xpa2VSYXdUb29sTmFtZSh0cmltbWVkTm9kZU1lc3NhZ2UpXG4gIGNvbnN0IGlzR2VuZXJpYyA9IGlzR2VuZXJpY1Jlc3VtZU5vZGVNZXNzYWdlKHRyaW1tZWROb2RlTWVzc2FnZSlcbiAgLy8gRWwgYmFja2VuZCBlbnbDrWEgZnJhc2VzIGNvbW8gXCJFamVjdXRhbmRvIGFzc2lnbl90YXNrX2xhYmVsLi4uXCIgcXVlIGNvbnRpZW5lbiBlbCBub21icmVcbiAgLy8gY3J1ZG8gZGUgbGEgdG9vbCDigJQgbm8gc29uIG1lbnNhamVzIGxlZ2libGVzLiBTaSBlbCBtZW5zYWplIGNvbnRpZW5lIGFsZ3VubyBkZSBsb3MgdG9vbHNcbiAgLy8gZGV0ZWN0YWRvcywgcHJlZmVyaW1vcyBlbCBtYXBlbyBkZWwgZGljY2lvbmFyaW8uXG4gIGNvbnN0IG5vZGVNZXNzYWdlQ29udGFpbnNUb29sID1cbiAgICBkZXRlY3RlZFRvb2xzLmxlbmd0aCA+PSAxICYmIGRldGVjdGVkVG9vbHMuc29tZSh0b29sID0+IHRyaW1tZWROb2RlTWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRvb2wpKVxuICBjb25zdCBhY3Rpdml0eUZyb21Ob2RlTWVzc2FnZSA9XG4gICAgdHJpbW1lZE5vZGVNZXNzYWdlICYmICFpc0dlbmVyaWMgJiYgIWlzUmF3ICYmICFub2RlTWVzc2FnZUNvbnRhaW5zVG9vbFxuICAgICAgPyB7IHBoYXNlOiAnYWN0aW9uJyBhcyBjb25zdCwgbWVzc2FnZTogdHJpbW1lZE5vZGVNZXNzYWdlIH1cbiAgICAgIDogbnVsbFxuXG4gIGlmIChkZXRlY3RlZFRvb2xzLmxlbmd0aCA+PSAxKSB7XG4gICAgaWYgKGFjdGl2aXR5RnJvbU5vZGVNZXNzYWdlKSB7XG4gICAgICByZXR1cm4gYWN0aXZpdHlGcm9tTm9kZU1lc3NhZ2VcbiAgICB9XG4gICAgcmV0dXJuIG1hcEhpdGxUb29sTmFtZVRvU3RyZWFtQWN0aXZpdHkoZGV0ZWN0ZWRUb29sc1swXSwgdCwgb3B0aW9ucylcbiAgfVxuXG4gIHJldHVybiBtYXBOb2RlTWVzc2FnZVRvU3RyZWFtQWN0aXZpdHkobm9kZU1lc3NhZ2UsIHQsIG9wdGlvbnMpXG59XG5cbmV4cG9ydCBjb25zdCByZXNvbHZlSW5pdGlhbEhpdGxTdHJlYW1BY3Rpdml0eSA9IChcbiAgdDogVHJhbnNsYXRlRm4sXG4gIGNvbnRleHQ/OiBIaXRsRXhlY3V0aW9uQ29udGV4dCB8IG51bGxcbik6IFN0cmVhbUFjdGl2aXR5ID0+IHtcbiAgY29uc3QgcGVuZGluZ0FjdGlvbnMgPSByZXNvbHZlUGVuZGluZ0FjdGlvbnNGb3JUaHJlYWQoY29udGV4dClcbiAgY29uc3QgZGV0ZWN0ZWRUb29scyA9IGRldGVjdFRvb2xzRnJvbVBlbmRpbmdBY3Rpb25zKHBlbmRpbmdBY3Rpb25zKVxuXG4gIGlmIChkZXRlY3RlZFRvb2xzLmxlbmd0aCA+PSAxKSB7XG4gICAgcmV0dXJuIG1hcEhpdGxUb29sTmFtZVRvU3RyZWFtQWN0aXZpdHkoZGV0ZWN0ZWRUb29sc1swXSwgdCwgeyB1c2VSZXN1bWluZ0ZhbGxiYWNrOiB0cnVlIH0pXG4gIH1cblxuICByZXR1cm4geyBwaGFzZTogJ3Byb2Nlc3NpbmcnLCBtZXNzYWdlOiB0KCdjaGF0LnByb2Nlc3NpbmcnKSB9XG59XG5cbmV4cG9ydCBjb25zdCBBQ1RJVklUWV9NRVNTQUdFX1JPVEFURV9NUyA9IDMyMDBcblxuY29uc3QgUk9UQVRBQkxFX1BIQVNFUzogU3RyZWFtQWN0aXZpdHlQaGFzZVtdID0gWydnZW5lcmF0aW5nJywgJ3RoaW5raW5nJywgJ3NlYXJjaCcsICdkZWVwX3NlYXJjaCcsICdhdHRhY2htZW50J11cblxuY29uc3QgZ2V0TWVzc2FnZUtleXNGb3JQaGFzZSA9IChwaGFzZTogU3RyZWFtQWN0aXZpdHlQaGFzZSwgYXR0YWNobWVudHNDb3VudCA9IDApOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGwgPT4ge1xuICBzd2l0Y2ggKHBoYXNlKSB7XG4gICAgY2FzZSAnZ2VuZXJhdGluZyc6XG4gICAgICByZXR1cm4gR0VORVJBVElOR19NRVNTQUdFX0tFWVNcbiAgICBjYXNlICd0aGlua2luZyc6XG4gICAgICByZXR1cm4gVEhJTktJTkdfTUVTU0FHRV9LRVlTXG4gICAgY2FzZSAnc2VhcmNoJzpcbiAgICAgIHJldHVybiBTRUFSQ0hfTUVTU0FHRV9LRVlTXG4gICAgY2FzZSAnZGVlcF9zZWFyY2gnOlxuICAgICAgcmV0dXJuIERFRVBfU0VBUkNIX01FU1NBR0VfS0VZU1xuICAgIGNhc2UgJ2F0dGFjaG1lbnQnOlxuICAgICAgcmV0dXJuIGF0dGFjaG1lbnRzQ291bnQgPiAxID8gQVRUQUNITUVOVF9NRVNTQUdFX0tFWVNfUExVUkFMIDogQVRUQUNITUVOVF9NRVNTQUdFX0tFWVNcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0U3RyZWFtQWN0aXZpdHlNZXNzYWdlQXRJbmRleCA9IChcbiAgcGhhc2U6IFN0cmVhbUFjdGl2aXR5UGhhc2UsXG4gIGluZGV4OiBudW1iZXIsXG4gIHQ6IFRyYW5zbGF0ZUZuLFxuICBhdHRhY2htZW50c0NvdW50ID0gMFxuKTogc3RyaW5nID0+IHtcbiAgaWYgKHBoYXNlID09PSAnd3JpdGluZycpIHtcbiAgICByZXR1cm4gdChXUklUSU5HX0FDVElWSVRZX01FU1NBR0VfS0VZKVxuICB9XG5cbiAgY29uc3Qga2V5cyA9IGdldE1lc3NhZ2VLZXlzRm9yUGhhc2UocGhhc2UsIGF0dGFjaG1lbnRzQ291bnQpXG4gIGlmICgha2V5cz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBjb25zdCBjbGFtcGVkSW5kZXggPSBNYXRoLm1pbihNYXRoLm1heCgwLCBpbmRleCksIGtleXMubGVuZ3RoIC0gMSlcbiAgcmV0dXJuIHQoa2V5c1tjbGFtcGVkSW5kZXhdKVxufVxuXG5leHBvcnQgY29uc3QgZ2V0VGhpbmtpbmdMb2FkaW5nTWVzc2FnZSA9IChpbmRleDogbnVtYmVyLCB0OiBUcmFuc2xhdGVGbik6IHN0cmluZyA9PlxuICBnZXRTdHJlYW1BY3Rpdml0eU1lc3NhZ2VBdEluZGV4KCd0aGlua2luZycsIGluZGV4LCB0KVxuXG5leHBvcnQgY29uc3QgZ2V0R2VuZXJhdGluZ0xvYWRpbmdNZXNzYWdlID0gKGluZGV4OiBudW1iZXIsIHQ6IFRyYW5zbGF0ZUZuKTogc3RyaW5nID0+XG4gIGdldFN0cmVhbUFjdGl2aXR5TWVzc2FnZUF0SW5kZXgoJ2dlbmVyYXRpbmcnLCBpbmRleCwgdClcblxuZXhwb3J0IGNvbnN0IGNhbkFkdmFuY2VTdHJlYW1BY3Rpdml0eU1lc3NhZ2UgPSAocGhhc2U6IFN0cmVhbUFjdGl2aXR5UGhhc2UsIGN1cnJlbnRJbmRleDogbnVtYmVyKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGtleXMgPSBnZXRNZXNzYWdlS2V5c0ZvclBoYXNlKHBoYXNlKVxuICBpZiAoIWtleXMpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gY3VycmVudEluZGV4IDwga2V5cy5sZW5ndGggLSAxXG59XG5cbmV4cG9ydCBjb25zdCBhZHZhbmNlU3RyZWFtQWN0aXZpdHlNZXNzYWdlID0gKFxuICBhY3Rpdml0eTogU3RyZWFtQWN0aXZpdHksXG4gIGN1cnJlbnRJbmRleDogbnVtYmVyLFxuICB0OiBUcmFuc2xhdGVGblxuKTogeyBhY3Rpdml0eTogU3RyZWFtQWN0aXZpdHk7IG5leHRJbmRleDogbnVtYmVyIH0gfCBudWxsID0+IHtcbiAgaWYgKCFjYW5BZHZhbmNlU3RyZWFtQWN0aXZpdHlNZXNzYWdlKGFjdGl2aXR5LnBoYXNlLCBjdXJyZW50SW5kZXgpKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IG5leHRJbmRleCA9IGN1cnJlbnRJbmRleCArIDFcbiAgcmV0dXJuIHtcbiAgICBhY3Rpdml0eToge1xuICAgICAgcGhhc2U6IGFjdGl2aXR5LnBoYXNlLFxuICAgICAgbWVzc2FnZTogZ2V0U3RyZWFtQWN0aXZpdHlNZXNzYWdlQXRJbmRleChhY3Rpdml0eS5waGFzZSwgbmV4dEluZGV4LCB0LCBhY3Rpdml0eS5hdHRhY2htZW50c0NvdW50KSxcbiAgICAgIC4uLihhY3Rpdml0eS5hdHRhY2htZW50c0NvdW50ICE9IG51bGwgJiYgeyBhdHRhY2htZW50c0NvdW50OiBhY3Rpdml0eS5hdHRhY2htZW50c0NvdW50IH0pLFxuICAgIH0sXG4gICAgbmV4dEluZGV4LFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBjYW5Sb3RhdGVTdHJlYW1BY3Rpdml0eVBoYXNlID0gKHBoYXNlOiBTdHJlYW1BY3Rpdml0eVBoYXNlKTogYm9vbGVhbiA9PiBST1RBVEFCTEVfUEhBU0VTLmluY2x1ZGVzKHBoYXNlKVxuXG5leHBvcnQgY29uc3QgZ2V0V3JpdGluZ1N0cmVhbUFjdGl2aXR5ID0gKHQ6IFRyYW5zbGF0ZUZuKTogU3RyZWFtQWN0aXZpdHkgPT4gKHtcbiAgcGhhc2U6ICd3cml0aW5nJyxcbiAgbWVzc2FnZTogdChXUklUSU5HX0FDVElWSVRZX01FU1NBR0VfS0VZKSxcbn0pXG5cbmV4cG9ydCBjb25zdCBnZXRJbml0aWFsU3RyZWFtQWN0aXZpdHkgPSAoXG4gIHQ6IFRyYW5zbGF0ZUZuLFxuICBvcHRpb25zOiB7XG4gICAgaXNXZWJTZWFyY2hBY3RpdmU/OiBib29sZWFuXG4gICAgaXNEZWVwU2VhcmNoQWN0aXZlPzogYm9vbGVhblxuICAgIGhhc0F0dGFjaG1lbnRzPzogYm9vbGVhblxuICAgIGF0dGFjaG1lbnRzQ291bnQ/OiBudW1iZXJcbiAgfVxuKTogU3RyZWFtQWN0aXZpdHkgPT4ge1xuICBpZiAob3B0aW9ucy5pc1dlYlNlYXJjaEFjdGl2ZSkge1xuICAgIHJldHVybiB7IHBoYXNlOiAnc2VhcmNoJywgbWVzc2FnZTogdChTRUFSQ0hfTUVTU0FHRV9LRVlTWzBdKSB9XG4gIH1cbiAgaWYgKG9wdGlvbnMuaXNEZWVwU2VhcmNoQWN0aXZlKSB7XG4gICAgcmV0dXJuIHsgcGhhc2U6ICdkZWVwX3NlYXJjaCcsIG1lc3NhZ2U6IHQoREVFUF9TRUFSQ0hfTUVTU0FHRV9LRVlTWzBdKSB9XG4gIH1cbiAgaWYgKG9wdGlvbnMuaGFzQXR0YWNobWVudHMpIHtcbiAgICBjb25zdCBhdHRhY2htZW50c0NvdW50ID0gb3B0aW9ucy5hdHRhY2htZW50c0NvdW50ID8/IDBcbiAgICByZXR1cm4ge1xuICAgICAgcGhhc2U6ICdhdHRhY2htZW50JyxcbiAgICAgIG1lc3NhZ2U6IGdldFN0cmVhbUFjdGl2aXR5TWVzc2FnZUF0SW5kZXgoJ2F0dGFjaG1lbnQnLCAwLCB0LCBhdHRhY2htZW50c0NvdW50KSxcbiAgICAgIGF0dGFjaG1lbnRzQ291bnQsXG4gICAgfVxuICB9XG4gIHJldHVybiB7IHBoYXNlOiAnZ2VuZXJhdGluZycsIG1lc3NhZ2U6IHQoR0VORVJBVElOR19NRVNTQUdFX0tFWVNbMF0pIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVTdHJlYW1Mb2FkaW5nRGlzcGxheSA9IChwYXJhbXM6IHtcbiAgc3RyZWFtQWN0aXZpdHk6IFN0cmVhbUFjdGl2aXR5IHwgbnVsbFxuICBsb2FkaW5nTWVzc2FnZTogc3RyaW5nIHwgbnVsbFxuICBhY3RpdmVMb2FkaW5nczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICB3YWl0aW5nUmVzcG9uc2U6IGJvb2xlYW5cbiAgaXNXZWJTZWFyY2hBY3RpdmU6IGJvb2xlYW5cbiAgaXNEZWVwU2VhcmNoQWN0aXZlOiBib29sZWFuXG4gIGhhc0F0dGFjaG1lbnRzOiBib29sZWFuXG4gIGF0dGFjaG1lbnRzQ291bnQ/OiBudW1iZXJcbiAgdDogVHJhbnNsYXRlRm5cbn0pOiBTdHJlYW1BY3Rpdml0eSB8IG51bGwgPT4ge1xuICBpZiAocGFyYW1zLnN0cmVhbUFjdGl2aXR5KSB7XG4gICAgcmV0dXJuIHBhcmFtcy5zdHJlYW1BY3Rpdml0eVxuICB9XG5cbiAgY29uc3QgYWN0aXZlS2V5cyA9IE9iamVjdC5rZXlzKHBhcmFtcy5hY3RpdmVMb2FkaW5ncylcbiAgaWYgKGFjdGl2ZUtleXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGZpcnN0S2V5ID0gYWN0aXZlS2V5c1swXVxuICAgIGNvbnN0IHJhdyA9IHBhcmFtcy5hY3RpdmVMb2FkaW5nc1tmaXJzdEtleV1cbiAgICBpZiAocmF3ICYmIHJhdyAhPT0gcGFyYW1zLnQoJ2NoYXQucHJvY2Vzc2luZycpKSB7XG4gICAgICBjb25zdCBoaXRsVG9vbCA9IHJlc29sdmVIaXRsVG9vbEZyb21Ob2RlTWVzc2FnZShyYXcpXG4gICAgICBpZiAoaGl0bFRvb2wpIHtcbiAgICAgICAgcmV0dXJuIG1hcEhpdGxUb29sTmFtZVRvU3RyZWFtQWN0aXZpdHkoaGl0bFRvb2wsIHBhcmFtcy50KVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0cmltbWVkID0gcmF3LnRyaW0oKVxuICAgICAgaWYgKHRyaW1tZWQgJiYgIWlzR2VuZXJpY1Jlc3VtZU5vZGVNZXNzYWdlKHRyaW1tZWQpKSB7XG4gICAgICAgIHJldHVybiB7IHBoYXNlOiAnYWN0aW9uJywgbWVzc2FnZTogdHJpbW1lZCB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtYXBOb2RlTWVzc2FnZVRvU3RyZWFtQWN0aXZpdHkocmF3LCBwYXJhbXMudCwgeyB1c2VSZXN1bWluZ0ZhbGxiYWNrOiB0cnVlIH0pXG4gICAgfVxuICAgIHJldHVybiB7IHBoYXNlOiAncHJvY2Vzc2luZycsIG1lc3NhZ2U6IHBhcmFtcy50KCdjaGF0LnByb2Nlc3NpbmcnKSB9XG4gIH1cblxuICBpZiAocGFyYW1zLmxvYWRpbmdNZXNzYWdlKSB7XG4gICAgaWYgKFxuICAgICAgcGFyYW1zLmxvYWRpbmdNZXNzYWdlID09PSBwYXJhbXMudCgnY2hhdC53cml0aW5nJykgfHxcbiAgICAgIHBhcmFtcy5sb2FkaW5nTWVzc2FnZSA9PT0gcGFyYW1zLnQoV1JJVElOR19BQ1RJVklUWV9NRVNTQUdFX0tFWSlcbiAgICApIHtcbiAgICAgIHJldHVybiBnZXRXcml0aW5nU3RyZWFtQWN0aXZpdHkocGFyYW1zLnQpXG4gICAgfVxuICAgIGlmIChwYXJhbXMubG9hZGluZ01lc3NhZ2UgPT09IHBhcmFtcy50KCdjaGF0LmdlbmVyYXRpbmcnKSkge1xuICAgICAgcmV0dXJuIHsgcGhhc2U6ICdnZW5lcmF0aW5nJywgbWVzc2FnZTogcGFyYW1zLmxvYWRpbmdNZXNzYWdlIH1cbiAgICB9XG4gICAgaWYgKFxuICAgICAgcGFyYW1zLmxvYWRpbmdNZXNzYWdlID09PSBwYXJhbXMudCgnY2hhdC5nZW5lcmF0aW5nV2ViU2VhcmNoJykgfHxcbiAgICAgIHBhcmFtcy5sb2FkaW5nTWVzc2FnZSA9PT0gcGFyYW1zLnQoJ2NoYXQuZ2VuZXJhdGluZ0RlZXBTZWFyY2gnKSB8fFxuICAgICAgcGFyYW1zLmxvYWRpbmdNZXNzYWdlID09PSBwYXJhbXMudCgnY2hhdC5nZW5lcmF0aW5nQXR0YWNobWVudCcpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5KHBhcmFtcy50LCB7XG4gICAgICAgIGlzV2ViU2VhcmNoQWN0aXZlOiBwYXJhbXMubG9hZGluZ01lc3NhZ2UgPT09IHBhcmFtcy50KCdjaGF0LmdlbmVyYXRpbmdXZWJTZWFyY2gnKSxcbiAgICAgICAgaXNEZWVwU2VhcmNoQWN0aXZlOiBwYXJhbXMubG9hZGluZ01lc3NhZ2UgPT09IHBhcmFtcy50KCdjaGF0LmdlbmVyYXRpbmdEZWVwU2VhcmNoJyksXG4gICAgICAgIGhhc0F0dGFjaG1lbnRzOiBwYXJhbXMubG9hZGluZ01lc3NhZ2UgPT09IHBhcmFtcy50KCdjaGF0LmdlbmVyYXRpbmdBdHRhY2htZW50JyksXG4gICAgICAgIGF0dGFjaG1lbnRzQ291bnQ6IHBhcmFtcy5hdHRhY2htZW50c0NvdW50LFxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIHsgcGhhc2U6ICdhY3Rpb24nLCBtZXNzYWdlOiBwYXJhbXMubG9hZGluZ01lc3NhZ2UgfVxuICB9XG5cbiAgaWYgKHBhcmFtcy53YWl0aW5nUmVzcG9uc2UpIHtcbiAgICByZXR1cm4gZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5KHBhcmFtcy50LCB7XG4gICAgICBpc1dlYlNlYXJjaEFjdGl2ZTogcGFyYW1zLmlzV2ViU2VhcmNoQWN0aXZlLFxuICAgICAgaXNEZWVwU2VhcmNoQWN0aXZlOiBwYXJhbXMuaXNEZWVwU2VhcmNoQWN0aXZlLFxuICAgICAgaGFzQXR0YWNobWVudHM6IHBhcmFtcy5oYXNBdHRhY2htZW50cyxcbiAgICAgIGF0dGFjaG1lbnRzQ291bnQ6IHBhcmFtcy5hdHRhY2htZW50c0NvdW50LFxuICAgIH0pXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5leHBvcnQgY29uc3QgaXNTdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZCA9IChtZXNzYWdlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4gPT5cbiAgdHlwZW9mIG1lc3NhZ2VJZCA9PT0gJ3N0cmluZycgJiYgbWVzc2FnZUlkLmluY2x1ZGVzKCctc3RyZWFtaW5nJylcblxuZXhwb3J0IGNvbnN0IHN0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkID0gKG1lc3NhZ2VJZDogc3RyaW5nKTogc3RyaW5nID0+IGBhbnN3ZXItJHttZXNzYWdlSWR9LXN0cmVhbWluZ2BcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUVBLFNBQVNBLHFCQUFxQixRQUFRLGlCQUFpQjtBQUl2RCxJQUFNQyxxQkFBcUIsR0FBRyxDQUM1QixrQ0FBa0MsRUFDbEMsa0NBQWtDLEVBQ2xDLGlDQUFpQyxDQUN6QjtBQUVWLElBQU1DLHVCQUF1QixHQUFHLENBQzlCLHNDQUFzQyxFQUN0QyxzQ0FBc0MsRUFDdEMsb0NBQW9DLENBQzVCO0FBRVYsSUFBTUMsbUJB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QUMsSUFDOUQrRixNQUFNLENBQUNPLGNBQWMsS0FBS1AsTUFBTSxDQUFDL0YsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLElBQy9EK0YsTUFBTSxDQUFDTyxjQUFjLEtBQUtQLE1BQU0sQ0FBQy9GLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxFQUMvRDtNQUNBLE9BQU95Rix3QkFBd0IsQ0FBQ00sTUFBTSxDQUFDL0YsQ0FBQyxFQUFFO1FBQ3hDMEYsaUJBQWlCLEVBQUVLLE1BQU0sQ0FBQ08sY0FBYyxLQUFLUCxNQUFNLENBQUMvRixDQUFDLENBQUMsMEJBQTBCLENBQUM7UUFDakYyRixrQkFBa0IsRUFBRUksTUFBTSxDQUFDTyxjQUFjLEtBQUtQLE1BQU0sQ0FBQy9GLENBQUMsQ0FBQywyQkFBMkIsQ0FBQztRQUNuRjRGLGNBQWMsRUFBRUcsTUFBTSxDQUFDTyxjQUFjLEtBQUtQLE1BQU0sQ0FBQy9GLENBQUMsQ0FBQywyQkFBMkIsQ0FBQztRQUMvRXNFLGdCQUFnQixFQUFFeUIsTUFBTSxDQUFDekI7TUFDM0IsQ0FBQyxDQUFDO0lBQ0o7SUFDQSxPQUFPO01BQUVwRCxLQUFLLEVBQUUsUUFBUTtNQUFFVCxPQUFPLEVBQUVzRixNQUFNLENBQUNPO0lBQWUsQ0FBQztFQUM1RDtFQUVBLElBQUlQLE1BQU0sQ0FBQ1EsZUFBZSxFQUFFO0lBQzFCLE9BQU9kLHdCQUF3QixDQUFDTSxNQUFNLENBQUMvRixDQUFDLEVBQUU7TUFDeEMwRixpQkFBaUIsRUFBRUssTUFBTSxDQUFDTCxpQkFBaUI7TUFDM0NDLGtCQUFrQixFQUFFSSxNQUFNLENBQUNKLGtCQUFrQjtNQUM3Q0MsY0FBYyxFQUFFRyxNQUFNLENBQUNILGNBQWM7TUFDckN0QixnQkFBZ0IsRUFBRXlCLE1BQU0sQ0FBQ3pCO0lBQzNCLENBQUMsQ0FBQztFQUNKO0VBRUEsT0FBTyxJQUFJO0FBQ2IsQ0FBQztBQUVELE9BQU8sSUFBTWtDLCtCQUErQixHQUFHLFNBQWxDQSwrQkFBK0JBLENBQUlDLFNBQTZCO0VBQUEsT0FDM0UsT0FBT0EsU0FBUyxLQUFLLFFBQVEsSUFBSUEsU0FBUyxDQUFDN0UsUUFBUSxDQUFDLFlBQVksQ0FBQztBQUFBO0FBRW5FLE9BQU8sSUFBTThFLDZCQUE2QixHQUFHLFNBQWhDQSw2QkFBNkJBLENBQUlELFNBQWlCO0VBQUEsaUJBQUE1RyxNQUFBLENBQXVCNEcsU0FBUztBQUFBLENBQVkiLCJpZ25vcmVMaXN0IjpbXX0=
437
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJub3JtYWxpemVIaXRsVG9vbE5hbWUiLCJUSElOS0lOR19NRVNTQUdFX0tFWVMiLCJHRU5FUkFUSU5HX01FU1NBR0VfS0VZUyIsIlNFQVJDSF9NRVNTQUdFX0tFWVMiLCJERUVQX1NFQVJDSF9NRVNTQUdFX0tFWVMiLCJBVFRBQ0hNRU5UX01FU1NBR0VfS0VZUyIsIkFUVEFDSE1FTlRfTUVTU0FHRV9LRVlTX1BMVVJBTCIsIlRISU5LSU5HX0FDVElWSVRZX01FU1NBR0VfS0VZIiwiV1JJVElOR19BQ1RJVklUWV9NRVNTQUdFX0tFWSIsIlRPT0xfQUNUSU9OX0lEUyIsImNyZWF0ZV90YXNrIiwiY2xvbmVfdGFzayIsImNyZWF0ZV90YXNrc19iYXRjaCIsImNyZWF0ZV9hZ2VudCIsImVkaXRfYWdlbnQiLCJlZGl0X3Rhc2siLCJlZGl0X3Rhc2tzX2JhdGNoIiwiZGVsZXRlX3Rhc2siLCJkZWxldGVfdGFza3NfYmF0Y2giLCJ0YXNrX2Fzc2lnbiIsInRhc2tfdW5hc3NpZ24iLCJhc3NpZ25fdGFza19sYWJlbCIsImNyZWF0ZV9sYWJlbHMiLCJlZGl0X3Byb2plY3QiLCJjcmVhdGVfY2hlY2tsaXN0X2l0ZW0iLCJ1cGRhdGVfdGFza190eXBlIiwidXBkYXRlX2VzdGltYXRlZF9ob3VycyIsInVwZGF0ZV9kZWxpdmVyYWJsZSIsImNyZWF0ZV9ob3VyIiwiY3JlYXRlX2hvdXJzIiwiY3JlYXRlX2NoZWNrbGlzdCIsImdldF90YXNrX2RhdGVfaG91cnMiLCJjb25maWd1cmVfYWdlbnRfYWNjZXNzIiwic2VuZF90YXNrX21lc3NhZ2UiLCJkZWxldGVfY2hlY2tsaXN0X2l0ZW0iLCJyZW1vdmVfdGFza190eXBlIiwicmVtb3ZlX3Rhc2tfbGFiZWwiLCJjb3VudF9kZWxpdmVyYWJsZSIsImNyZWF0ZV9yZXdvcmsiLCJ1cGRhdGVfcmV3b3JrIiwiZ2V0X3Byb2plY3Rfd2l0aF90YXNrc19pbmZvIiwiZ2V0X3Rhc2siLCJnZXRfdGFza19oaXN0b3J5IiwiZ2V0X3Rhc2tfbGFiZWxzIiwiZ2V0X3Rhc2tfdHlwZXMiLCJnZXRfdGFza190eXBlX2NhdGVnb3JpZXMiLCJnZXRfcHJvamVjdF9mZWVfY29uc3VtcHRpb24iLCJnZXRfcHJvamVjdF90YWJfZXZvbHV0aW9uIiwiZ2V0X3Byb2plY3RfdGFiX2V2b2x1dGlvbl9jb3N0cyIsImdldF9wcm9qZWN0X3BlcmZvcm1hbmNlX3RhYl90aW1lX2J5X2dyb3VwZWQiLCJnZXRfZGVsaXZlcmFibGVfYnlfcHJvamVjdF9pZCIsImdldF9yZXdvcmtfYnlfcHJvamVjdF9pZCIsImdldF9jb250cmFjdCIsImxpc3RfcHJvamVjdHMiLCJnZXRfY2xpZW50IiwiZ2V0X2NsaWVudF9zdGF0dXNlcyIsImdldF9jbGllbnRzX3dpdGhfZmlsdGVycyIsImxpc3RfY2xpZW50cyIsImdldF9ob3VycyIsImdldF9ob3Vyc19jYXBhY2l0eSIsImdldF9wcm9qZWN0X2hvdXJzX2J5X3VzZXJfYW5kX3Rhc2siLCJnZXRfcHJvamVjdF9ob3Vyc19ieV91c2VyX21vbnRobHkiLCJnZXRfd29ya2luZ190aW1lIiwiZ2V0X2NoYXJnaW5nX3BlcmlvZCIsInN1bW1hcml6ZV9ob3VycyIsInJlY29tbWVuZF9ob3Vyc19mcm9tX3BsYW5uZXIiLCJnZXRfcGxhbm5lciIsImxpc3RfdXNlcnMiLCJnZXRfZGFzaGJvYXJkX2J5X2NvbXBhbnkiLCJnZXRfZGFzaGJvYXJkX2RhdGEiLCJnZXRfcmVjZW50X2FjdGl2aXR5IiwibGlzdF9jb250cmFjdHMiLCJsaXN0X2ZlZXMiLCJsaXN0X2ludm9pY2VzIiwiY2hlY2tsaXN0IiwicmV3b3JrcyIsInRhdmlseV9zZWFyY2giLCJnZXRfdXNlcl9pZCIsImdldF9jbGllbnRfaWRfYmFzZWRfb25fbmFtZSIsImdldF9wcm9qZWN0X2lkX2Jhc2VkX29uX25hbWUiLCJnZXRfdGFza19pZF9iYXNlZF9vbl90aXRsZSIsImdldF91c2VyX3Bvc2l0aW9uX2lkX2Jhc2VkX29uX25hbWUiLCJnZXRfbGFiZWxfY29sb3JzIiwiZ2V0X21vZGVscyIsImNyZWF0ZV9wcm9qZWN0IiwiY3JlYXRlX2NsaWVudCIsImVkaXRfY2xpZW50IiwiY3JlYXRlX3VzZXIiLCJlZGl0X3VzZXIiLCJjcmVhdGVfdGFza190eXBlIiwiZWRpdF9ob3VyIiwiY3JlYXRlX2FsbG9jYXRpb24iLCJlZGl0X2FsbG9jYXRpb24iLCJkZWxldGVfYWxsb2NhdGlvbiIsImhhbmRvZmZfdG9fb3JjaGVzdHJhdG9yIiwiYWN0aW9uTWVzc2FnZUtleSIsImFjdGlvbklkIiwidGVuc2UiLCJjb25jYXQiLCJyZXNvbHZlVG9vbEFjdGlvbkxhYmVsIiwidG9vbE5hbWUiLCJ0IiwiSElUTF9UT09MX05BTUVTX0JZX1NQRUNJRklDSVRZIiwiT2JqZWN0Iiwia2V5cyIsInNvcnQiLCJhIiwiYiIsImxlbmd0aCIsImxvb2tzTGlrZVJhd1Rvb2xOYW1lIiwibWVzc2FnZSIsInRlc3QiLCJ0cmltIiwiaXNHZW5lcmljUmVzdW1lTm9kZU1lc3NhZ2UiLCJub3JtYWxpemVkIiwidG9Mb3dlckNhc2UiLCJzdGFydHNXaXRoIiwibWFwSGl0bFRvb2xOYW1lVG9TdHJlYW1BY3Rpdml0eSIsIm9wdGlvbnMiLCJwaGFzZSIsInVzZVJlc3VtaW5nRmFsbGJhY2siLCJyZXNvbHZlVG9vbFN0ZXBQYXN0TGFiZWwiLCJfcmVzb2x2ZVRvb2xBY3Rpb25MYWIiLCJyZXNvbHZlSGl0bFRvb2xGcm9tTm9kZU1lc3NhZ2UiLCJub2RlTWVzc2FnZSIsImFzVG9vbE5hbWUiLCJyZXBsYWNlIiwibWF0Y2hlZFRvb2wiLCJmaW5kIiwiaW5jbHVkZXMiLCJtYXBOb2RlTWVzc2FnZVRvU3RyZWFtQWN0aXZpdHkiLCJoaXRsVG9vbCIsInRyaW1tZWRNZXNzYWdlIiwicmVzb2x2ZVBlbmRpbmdBY3Rpb25zRm9yVGhyZWFkIiwiY29udGV4dCIsInRocmVhZElkIiwiX3JlZiIsIl9jb250ZXh0JHBlbmRpbmdBY3RpbyIsIl9jb250ZXh0JGFwcHJvdmFsIiwiX2NvbnRleHQkdGhyZWFkSWRzIiwicGVuZGluZyIsInBlbmRpbmdBY3Rpb25zIiwiYXBwcm92YWwiLCJwZW5kaW5nX2FjdGlvbnMiLCJmb3JUaHJlYWQiLCJmaWx0ZXIiLCJhY3Rpb24iLCJ0aHJlYWRfaWQiLCJ0aHJlYWRJZHMiLCJfY29udGV4dCR0aHJlYWRJZHMyIiwiZGV0ZWN0VG9vbHNGcm9tUGVuZGluZ0FjdGlvbnMiLCJhY3Rpb25zIiwiX3RvQ29uc3VtYWJsZUFycmF5IiwiU2V0IiwibWFwIiwidG9vbF9uYW1lIiwiQm9vbGVhbiIsInJlc29sdmVIaXRsTm9kZVN0cmVhbUFjdGl2aXR5IiwicGVuZGluZ0ZvclRocmVhZCIsImRldGVjdGVkVG9vbHMiLCJ0cmltbWVkTm9kZU1lc3NhZ2UiLCJpc1JhdyIsImlzR2VuZXJpYyIsIm5vZGVNZXNzYWdlQ29udGFpbnNUb29sIiwic29tZSIsInRvb2wiLCJhY3Rpdml0eUZyb21Ob2RlTWVzc2FnZSIsIkFDVElWSVRZX01FU1NBR0VfUk9UQVRFX01TIiwiUk9UQVRBQkxFX1BIQVNFUyIsImdldE1lc3NhZ2VLZXlzRm9yUGhhc2UiLCJhdHRhY2htZW50c0NvdW50IiwiYXJndW1lbnRzIiwidW5kZWZpbmVkIiwiZ2V0U3RyZWFtQWN0aXZpdHlNZXNzYWdlQXRJbmRleCIsImluZGV4IiwiY2xhbXBlZEluZGV4IiwiTWF0aCIsIm1pbiIsIm1heCIsImdldFRoaW5raW5nTG9hZGluZ01lc3NhZ2UiLCJnZXRHZW5lcmF0aW5nTG9hZGluZ01lc3NhZ2UiLCJjYW5BZHZhbmNlU3RyZWFtQWN0aXZpdHlNZXNzYWdlIiwiY3VycmVudEluZGV4IiwiYWR2YW5jZVN0cmVhbUFjdGl2aXR5TWVzc2FnZSIsImFjdGl2aXR5IiwibmV4dEluZGV4IiwiX29iamVjdFNwcmVhZCIsImNhblJvdGF0ZVN0cmVhbUFjdGl2aXR5UGhhc2UiLCJnZXRUaGlua2luZ1N0cmVhbUFjdGl2aXR5IiwiZ2V0V3JpdGluZ1N0cmVhbUFjdGl2aXR5IiwicmVzb2x2ZUluaXRpYWxIaXRsU3RyZWFtQWN0aXZpdHkiLCJ0b0luZGljYXRvclN0cmVhbUFjdGl2aXR5IiwiZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5IiwiaXNXZWJTZWFyY2hBY3RpdmUiLCJpc0RlZXBTZWFyY2hBY3RpdmUiLCJoYXNBdHRhY2htZW50cyIsIl9vcHRpb25zJGF0dGFjaG1lbnRzQyIsInJlc29sdmVTdHJlYW1Mb2FkaW5nRGlzcGxheSIsInBhcmFtcyIsInN0cmVhbUFjdGl2aXR5IiwiYWN0aXZlS2V5cyIsImFjdGl2ZUxvYWRpbmdzIiwiZmlyc3RLZXkiLCJyYXciLCJ0cmltbWVkIiwibG9hZGluZ01lc3NhZ2UiLCJ3YWl0aW5nUmVzcG9uc2UiLCJpc1N0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkIiwibWVzc2FnZUlkIiwic3RyZWFtaW5nUGxhY2Vob2xkZXJNZXNzYWdlSWQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvc3RyZWFtQWN0aXZpdHlNZXNzYWdlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFN0cmVhbUFjdGl2aXR5LCBTdHJlYW1BY3Rpdml0eVBoYXNlIH0gZnJvbSAnLi4vdHlwZXMvc3RyZWFtQWN0aXZpdHknXG5pbXBvcnQgdHlwZSB7IEFwcHJvdmFsUmVxdWVzdCwgUGVuZGluZ0FjdGlvbiB9IGZyb20gJy4uL3R5cGVzL0NoYXQnXG5pbXBvcnQgeyBub3JtYWxpemVIaXRsVG9vbE5hbWUgfSBmcm9tICcuL2hpdGxBbmFseXRpY3MnXG5cbnR5cGUgVHJhbnNsYXRlRm4gPSAoa2V5OiBzdHJpbmcpID0+IHN0cmluZ1xuXG5jb25zdCBUSElOS0lOR19NRVNTQUdFX0tFWVMgPSBbXG4gICdjaGF0LmFjdGl2aXR5LnRoaW5raW5nLmFuYWx5emluZycsXG4gICdjaGF0LmFjdGl2aXR5LnRoaW5raW5nLnJldmlld2luZycsXG4gICdjaGF0LmFjdGl2aXR5LnRoaW5raW5nLnBsYW5uaW5nJyxcbl0gYXMgY29uc3RcblxuY29uc3QgR0VORVJBVElOR19NRVNTQUdFX0tFWVMgPSBbXG4gICdjaGF0LmFjdGl2aXR5LmdlbmVyYXRpbmcuY29uc2lkZXJpbmcnLFxuICAnY2hhdC5hY3Rpdml0eS5nZW5lcmF0aW5nLmFsbW9zdFJlYWR5JyxcbiAgJ2NoYXQuYWN0aXZpdHkuZ2VuZXJhdGluZy5wcmVwYXJpbmcnLFxuXSBhcyBjb25zdFxuXG5jb25zdCBTRUFSQ0hfTUVTU0FHRV9LRVlTID0gWydjaGF0LmFjdGl2aXR5LnNlYXJjaC5zY2FubmluZycsICdjaGF0LmFjdGl2aXR5LnNlYXJjaC5zdW1tYXJpemluZyddIGFzIGNvbnN0XG5cbmNvbnN0IERFRVBfU0VBUkNIX01FU1NBR0VfS0VZUyA9IFtcbiAgJ2NoYXQuYWN0aXZpdHkuZGVlcFNlYXJjaC5leHBsb3JpbmcnLFxuICAnY2hhdC5hY3Rpdml0eS5kZWVwU2VhcmNoLmNyb3NzQ2hlY2tpbmcnLFxuXSBhcyBjb25zdFxuXG5jb25zdCBBVFRBQ0hNRU5UX01FU1NBR0VfS0VZUyA9IFsnY2hhdC5hY3Rpdml0eS5hdHRhY2htZW50LnJlYWRpbmcnLCAnY2hhdC5hY3Rpdml0eS5hdHRhY2htZW50LmV4dHJhY3RpbmcnXSBhcyBjb25zdFxuXG5jb25zdCBBVFRBQ0hNRU5UX01FU1NBR0VfS0VZU19QTFVSQUwgPSBbXG4gICdjaGF0LmFjdGl2aXR5LmF0dGFjaG1lbnQucmVhZGluZ1BsdXJhbCcsXG4gICdjaGF0LmFjdGl2aXR5LmF0dGFjaG1lbnQuZXh0cmFjdGluZ1BsdXJhbCcsXG5dIGFzIGNvbnN0XG5cbmV4cG9ydCBjb25zdCBUSElOS0lOR19BQ1RJVklUWV9NRVNTQUdFX0tFWSA9ICdjaGF0LmFjdGl2aXR5LnRoaW5raW5nLmxhYmVsJyBhcyBjb25zdFxuZXhwb3J0IGNvbnN0IFdSSVRJTkdfQUNUSVZJVFlfTUVTU0FHRV9LRVkgPSAnY2hhdC5hY3Rpdml0eS53cml0aW5nLmxhYmVsJyBhcyBjb25zdFxuXG5leHBvcnQgdHlwZSBBY3Rpb25UZW5zZSA9ICdwcmVzZW50JyB8ICdwYXN0J1xuXG5jb25zdCBUT09MX0FDVElPTl9JRFM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gIGNyZWF0ZV90YXNrOiAnY3JlYXRlVGFzaycsXG4gIGNsb25lX3Rhc2s6ICdjcmVhdGVUYXNrJyxcbiAgY3JlYXRlX3Rhc2tzX2JhdGNoOiAnY3JlYXRlVGFza3NCYXRjaCcsXG4gIGNyZWF0ZV9hZ2VudDogJ2NyZWF0ZUFnZW50JyxcbiAgZWRpdF9hZ2VudDogJ2VkaXRBZ2VudCcsXG4gIGVkaXRfdGFzazogJ2VkaXRUYXNrJyxcbiAgZWRpdF90YXNrc19iYXRjaDogJ2VkaXRUYXNrc0JhdGNoJyxcbiAgZGVsZXRlX3Rhc2s6ICdkZWxldGVUYXNrJyxcbiAgZGVsZXRlX3Rhc2tzX2JhdGNoOiAnZGVsZXRlVGFza3NCYXRjaCcsXG4gIHRhc2tfYXNzaWduOiAnYXNzaWduVXNlcicsXG4gIHRhc2tfdW5hc3NpZ246ICd1bmFzc2lnblVzZXInLFxuICBhc3NpZ25fdGFza19sYWJlbDogJ2Fzc2lnbkxhYmVsJyxcbiAgY3JlYXRlX2xhYmVsczogJ2NyZWF0ZUxhYmVsJyxcbiAgZWRpdF9wcm9qZWN0OiAnZWRpdFByb2plY3QnLFxuICBjcmVhdGVfY2hlY2tsaXN0X2l0ZW06ICdjcmVhdGVDaGVja2xpc3RJdGVtJyxcbiAgdXBkYXRlX3Rhc2tfdHlwZTogJ3VwZGF0ZVRhc2tUeXBlJyxcbiAgdXBkYXRlX2VzdGltYXRlZF9ob3VyczogJ3VwZGF0ZUVzdGltYXRlZEhvdXJzJyxcbiAgdXBkYXRlX2RlbGl2ZXJhYmxlOiAndXBkYXRlRGVsaXZlcmFibGUnLFxuICBjcmVhdGVfaG91cjogJ2xvZ0hvdXJzJyxcbiAgY3JlYXRlX2hvdXJzOiAnbG9nSG91cnMnLFxuICBjcmVhdGVfY2hlY2tsaXN0OiAnY3JlYXRlQ2hlY2tsaXN0JyxcbiAgZ2V0X3Rhc2tfZGF0ZV9ob3VyczogJ3F1ZXJ5SG91cnMnLFxuICBjb25maWd1cmVfYWdlbnRfYWNjZXNzOiAnY29uZmlndXJlQWdlbnRBY2Nlc3MnLFxuICBzZW5kX3Rhc2tfbWVzc2FnZTogJ3NlbmRUYXNrTWVzc2FnZScsXG4gIGRlbGV0ZV9jaGVja2xpc3RfaXRlbTogJ2RlbGV0ZUNoZWNrbGlzdEl0ZW0nLFxuICByZW1vdmVfdGFza190eXBlOiAncmVtb3ZlVGFza1R5cGUnLFxuICByZW1vdmVfdGFza19sYWJlbDogJ3JlbW92ZUxhYmVsJyxcbiAgY291bnRfZGVsaXZlcmFibGU6ICd1cGRhdGVEZWxpdmVyYWJsZUNvdW50JyxcbiAgY3JlYXRlX3Jld29yazogJ2NyZWF0ZVJld29yaycsXG4gIHVwZGF0ZV9yZXdvcms6ICd1cGRhdGVSZXdvcmsnLFxuICBnZXRfcHJvamVjdF93aXRoX3Rhc2tzX2luZm86ICdyZWFkUHJvamVjdFRhc2tzJyxcbiAgZ2V0X3Rhc2s6ICdyZWFkVGFzaycsXG4gIGdldF90YXNrX2hpc3Rvcnk6ICdyZWFkVGFzaycsXG4gIGdldF90YXNrX2xhYmVsczogJ3JlYWRUYXNrJyxcbiAgZ2V0X3Rhc2tfdHlwZXM6ICdyZWFkVGFza1R5cGVzJyxcbiAgZ2V0X3Rhc2tfdHlwZV9jYXRlZ29yaWVzOiAncmVhZFRhc2tUeXBlcycsXG4gIGdldF9wcm9qZWN0X2ZlZV9jb25zdW1wdGlvbjogJ3JlYWRQcm9qZWN0JyxcbiAgZ2V0X3Byb2plY3RfdGFiX2V2b2x1dGlvbjogJ3JlYWRQcm9qZWN0JyxcbiAgZ2V0X3Byb2plY3RfdGFiX2V2b2x1dGlvbl9jb3N0czogJ3JlYWRQcm9qZWN0JyxcbiAgZ2V0X3Byb2plY3RfcGVyZm9ybWFuY2VfdGFiX3RpbWVfYnlfZ3JvdXBlZDogJ3JlYWRQcm9qZWN0JyxcbiAgZ2V0X2RlbGl2ZXJhYmxlX2J5X3Byb2plY3RfaWQ6ICdyZWFkUHJvamVjdCcsXG4gIGdldF9yZXdvcmtfYnlfcHJvamVjdF9pZDogJ3JlYWRQcm9qZWN0JyxcbiAgZ2V0X2NvbnRyYWN0OiAncmVhZFByb2plY3QnLFxuICBsaXN0X3Byb2plY3RzOiAnbGlzdFByb2plY3RzJyxcbiAgZ2V0X2NsaWVudDogJ3JlYWRDbGllbnQnLFxuICBnZXRfY2xpZW50X3N0YXR1c2VzOiAncmVhZENsaWVudCcsXG4gIGdldF9jbGllbnRzX3dpdGhfZmlsdGVyczogJ3JlYWRDbGllbnQnLFxuICBsaXN0X2NsaWVudHM6ICdyZWFkQ2xpZW50JyxcbiAgZ2V0X2hvdXJzOiAncmVhZEhvdXJzJyxcbiAgZ2V0X2hvdXJzX2NhcGFjaXR5OiAncmVhZEhvdXJzJyxcbiAgZ2V0X3Byb2plY3RfaG91cnNfYnlfdXNlcl9hbmRfdGFzazogJ3JlYWRIb3VycycsXG4gIGdldF9wcm9qZWN0X2hvdXJzX2J5X3VzZXJfbW9udGhseTogJ3JlYWRIb3VycycsXG4gIGdldF93b3JraW5nX3RpbWU6ICdyZWFkSG91cnMnLFxuICBnZXRfY2hhcmdpbmdfcGVyaW9kOiAncmVhZEhvdXJzJyxcbiAgc3VtbWFyaXplX2hvdXJzOiAncmVhZEhvdXJzJyxcbiAgcmVjb21tZW5kX2hvdXJzX2Zyb21fcGxhbm5lcjogJ3JlYWRIb3VycycsXG4gIGdldF9wbGFubmVyOiAncmVhZFBsYW5uZXInLFxuICBsaXN0X3VzZXJzOiAncmVhZFVzZXJzJyxcbiAgZ2V0X2Rhc2hib2FyZF9ieV9jb21wYW55OiAncmVhZE1ldHJpY3MnLFxuICBnZXRfZGFzaGJvYXJkX2RhdGE6ICdyZWFkTWV0cmljcycsXG4gIGdldF9yZWNlbnRfYWN0aXZpdHk6ICdyZWFkTWV0cmljcycsXG4gIGxpc3RfY29udHJhY3RzOiAncmVhZEJpbGxpbmcnLFxuICBsaXN0X2ZlZXM6ICdyZWFkQmlsbGluZycsXG4gIGxpc3RfaW52b2ljZXM6ICdyZWFkQmlsbGluZycsXG4gIGNoZWNrbGlzdDogJ3JlYWRDaGVja2xpc3QnLFxuICByZXdvcmtzOiAncmVhZFJld29ya3MnLFxuICB0YXZpbHlfc2VhcmNoOiAnc2VhcmNoV2ViJyxcbiAgZ2V0X3VzZXJfaWQ6ICdyZWFkUmVmZXJlbmNlcycsXG4gIGdldF9jbGllbnRfaWRfYmFzZWRfb25fbmFtZTogJ3JlYWRSZWZlcmVuY2VzJyxcbiAgZ2V0X3Byb2plY3RfaWRfYmFzZWRfb25fbmFtZTogJ3JlYWRSZWZlcmVuY2VzJyxcbiAgZ2V0X3Rhc2tfaWRfYmFzZWRfb25fdGl0bGU6ICdyZWFkUmVmZXJlbmNlcycsXG4gIGdldF91c2VyX3Bvc2l0aW9uX2lkX2Jhc2VkX29uX25hbWU6ICdyZWFkUmVmZXJlbmNlcycsXG4gIGdldF9sYWJlbF9jb2xvcnM6ICdyZWFkUmVmZXJlbmNlcycsXG4gIGdldF9tb2RlbHM6ICdyZWFkUmVmZXJlbmNlcycsXG4gIGNyZWF0ZV9wcm9qZWN0OiAnY3JlYXRlUHJvamVjdCcsXG4gIGNyZWF0ZV9jbGllbnQ6ICdjcmVhdGVDbGllbnQnLFxuICBlZGl0X2NsaWVudDogJ2VkaXRDbGllbnQnLFxuICBjcmVhdGVfdXNlcjogJ2NyZWF0ZVVzZXInLFxuICBlZGl0X3VzZXI6ICdlZGl0VXNlcicsXG4gIGNyZWF0ZV90YXNrX3R5cGU6ICdjcmVhdGVUYXNrVHlwZScsXG4gIGVkaXRfaG91cjogJ2VkaXRIb3VycycsXG4gIGNyZWF0ZV9hbGxvY2F0aW9uOiAnY3JlYXRlQWxsb2NhdGlvbicsXG4gIGVkaXRfYWxsb2NhdGlvbjogJ2VkaXRBbGxvY2F0aW9uJyxcbiAgZGVsZXRlX2FsbG9jYXRpb246ICdkZWxldGVBbGxvY2F0aW9uJyxcblxuICBoYW5kb2ZmX3RvX29yY2hlc3RyYXRvcjogJ2Fza0Fub3RoZXJTcGVjaWFsaXN0Jyxcbn1cblxuY29uc3QgYWN0aW9uTWVzc2FnZUtleSA9IChhY3Rpb25JZDogc3RyaW5nLCB0ZW5zZTogQWN0aW9uVGVuc2UpOiBzdHJpbmcgPT4gYGNoYXQuYWN0aXZpdHkuYWN0aW9ucy4ke2FjdGlvbklkfS4ke3RlbnNlfWBcblxuZXhwb3J0IGNvbnN0IHJlc29sdmVUb29sQWN0aW9uTGFiZWwgPSAodG9vbE5hbWU6IHN0cmluZywgdDogVHJhbnNsYXRlRm4sIHRlbnNlOiBBY3Rpb25UZW5zZSk6IHN0cmluZyB8IG51bGwgPT4ge1xuICBjb25zdCBhY3Rpb25JZCA9IFRPT0xfQUNUSU9OX0lEU1tub3JtYWxpemVIaXRsVG9vbE5hbWUodG9vbE5hbWUpXVxuICByZXR1cm4gYWN0aW9uSWQgPyB0KGFjdGlvbk1lc3NhZ2VLZXkoYWN0aW9uSWQsIHRlbnNlKSkgOiBudWxsXG59XG5cbmNvbnN0IEhJVExfVE9PTF9OQU1FU19CWV9TUEVDSUZJQ0lUWSA9IE9iamVjdC5rZXlzKFRPT0xfQUNUSU9OX0lEUykuc29ydCgoYSwgYikgPT4gYi5sZW5ndGggLSBhLmxlbmd0aClcblxuLyoqXG4gKiBEZXRlY3RhIGlkZW50aWZpY2Fkb3JlcyBjcnVkb3MgZGUgdG9vbCAoc25ha2VfY2FzZSAvIGtlYmFiLWNhc2Ugc2luIGVzcGFjaW9zKSBxdWUgZWwgYmFja2VuZFxuICogcHVlZGUgZW52aWFyIGN1YW5kbyBhw7puIG5vIGhheSB0cmFkdWNjacOzbi4gTm8gZGViZW4gbW9zdHJhcnNlIGFsIHVzdWFyaW86IHNlIHVzYSB1biBmYWxsYmFja1xuICogZ2Vuw6lyaWNvIGhhc3RhIHF1ZSBlbCBub21icmUgc2UgYWdyZWd1ZSBhbCBkaWNjaW9uYXJpby5cbiAqL1xuY29uc3QgbG9va3NMaWtlUmF3VG9vbE5hbWUgPSAobWVzc2FnZTogc3RyaW5nKTogYm9vbGVhbiA9PiAvXlthLXowLTldKyg/OltfLV1bYS16MC05XSspKyQvaS50ZXN0KG1lc3NhZ2UudHJpbSgpKVxuXG4vKiogTWVuc2FqZXMgZ2Vuw6lyaWNvcyBkZWwgYmFja2VuZCBjdWFuZG8gbm8gaGF5IGRldGFsbGUgZGUgdG9vbCAoY29udGludWUtdGhyZWFkKS4gKi9cbmNvbnN0IGlzR2VuZXJpY1Jlc3VtZU5vZGVNZXNzYWdlID0gKG1lc3NhZ2U6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBub3JtYWxpemVkID0gbWVzc2FnZS50cmltKCkudG9Mb3dlckNhc2UoKVxuICByZXR1cm4gKFxuICAgIG5vcm1hbGl6ZWQuc3RhcnRzV2l0aCgnZWplY3V0YW5kbyBhY2Npw7NuIGFwcm9iYWRhJykgfHxcbiAgICBub3JtYWxpemVkLnN0YXJ0c1dpdGgoJ2V4ZWN1dGluZyBhcHByb3ZlZCBhY3Rpb24nKSB8fFxuICAgIG5vcm1hbGl6ZWQuc3RhcnRzV2l0aCgnZXhlY3V0YW5kbyBhw6fDo28gYXByb3ZhZGEnKVxuICApXG59XG5cbmV4cG9ydCBjb25zdCBtYXBIaXRsVG9vbE5hbWVUb1N0cmVhbUFjdGl2aXR5ID0gKFxuICB0b29sTmFtZTogc3RyaW5nLFxuICB0OiBUcmFuc2xhdGVGbixcbiAgb3B0aW9ucz86IHsgdXNlUmVzdW1pbmdGYWxsYmFjaz86IGJvb2xlYW4gfVxuKTogU3RyZWFtQWN0aXZpdHkgPT4ge1xuICBjb25zdCBtZXNzYWdlID0gcmVzb2x2ZVRvb2xBY3Rpb25MYWJlbCh0b29sTmFtZSwgdCwgJ3ByZXNlbnQnKVxuICBpZiAobWVzc2FnZSkge1xuICAgIHJldHVybiB7IHBoYXNlOiAnYWN0aW9uJywgbWVzc2FnZSB9XG4gIH1cbiAgaWYgKG9wdGlvbnM/LnVzZVJlc3VtaW5nRmFsbGJhY2spIHtcbiAgICByZXR1cm4geyBwaGFzZTogJ2FjdGlvbicsIG1lc3NhZ2U6IHQoJ2NoYXQuYWN0aXZpdHkucmVzdW1pbmdBY3Rpb24nKSB9XG4gIH1cbiAgcmV0dXJuIHsgcGhhc2U6ICdhY3Rpb24nLCBtZXNzYWdlOiB0KCdjaGF0LmV4ZWN1dGluZ0FjdGlvbicpIH1cbn1cblxuZXhwb3J0IGNvbnN0IHJlc29sdmVUb29sU3RlcFBhc3RMYWJlbCA9ICh0b29sTmFtZTogc3RyaW5nLCB0OiBUcmFuc2xhdGVGbik6IHN0cmluZyA9PlxuICByZXNvbHZlVG9vbEFjdGlvbkxhYmVsKHRvb2xOYW1lLCB0LCAncGFzdCcpID8/IHQoJ2NoYXQuYWN0aXZpdHkuZXhlY3V0ZWRBY3Rpb24nKVxuXG5jb25zdCByZXNvbHZlSGl0bFRvb2xGcm9tTm9kZU1lc3NhZ2UgPSAobm9kZU1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB8IG51bGwgPT4ge1xuICBjb25zdCBub3JtYWxpemVkID0gbm9kZU1lc3NhZ2UudG9Mb3dlckNhc2UoKS50cmltKClcbiAgaWYgKCFub3JtYWxpemVkKSByZXR1cm4gbnVsbFxuXG4gIGlmIChUT09MX0FDVElPTl9JRFNbbm9ybWFsaXplZF0pIHtcbiAgICByZXR1cm4gbm9ybWFsaXplZFxuICB9XG5cbiAgY29uc3QgYXNUb29sTmFtZSA9IG5vcm1hbGl6ZUhpdGxUb29sTmFtZShub3JtYWxpemVkLnJlcGxhY2UoL1xccysvZywgJ18nKSlcbiAgaWYgKFRPT0xfQUNUSU9OX0lEU1thc1Rvb2xOYW1lXSkge1xuICAgIHJldHVybiBhc1Rvb2xOYW1lXG4gIH1cblxuICBjb25zdCBtYXRjaGVkVG9vbCA9IEhJVExfVE9PTF9OQU1FU19CWV9TUEVDSUZJQ0lUWS5maW5kKHRvb2xOYW1lID0+IG5vcm1hbGl6ZWQuaW5jbHVkZXModG9vbE5hbWUpKVxuICByZXR1cm4gbWF0Y2hlZFRvb2wgPz8gbnVsbFxufVxuXG5leHBvcnQgY29uc3QgbWFwTm9kZU1lc3NhZ2VUb1N0cmVhbUFjdGl2aXR5ID0gKFxuICBub2RlTWVzc2FnZTogc3RyaW5nLFxuICB0OiBUcmFuc2xhdGVGbixcbiAgb3B0aW9ucz86IHsgdXNlUmVzdW1pbmdGYWxsYmFjaz86IGJvb2xlYW4gfVxuKTogU3RyZWFtQWN0aXZpdHkgPT4ge1xuICBjb25zdCBub3JtYWxpemVkID0gbm9kZU1lc3NhZ2UudG9Mb3dlckNhc2UoKVxuXG4gIGNvbnN0IGhpdGxUb29sID0gcmVzb2x2ZUhpdGxUb29sRnJvbU5vZGVNZXNzYWdlKG5vZGVNZXNzYWdlKVxuICBpZiAoaGl0bFRvb2wpIHtcbiAgICByZXR1cm4gbWFwSGl0bFRvb2xOYW1lVG9TdHJlYW1BY3Rpdml0eShoaXRsVG9vbCwgdCwgb3B0aW9ucylcbiAgfVxuXG4gIGlmIChcbiAgICBub3JtYWxpemVkLmluY2x1ZGVzKCdyZXNwb25zZV9maWxlX2dlbmVyYXRpb24nKSB8fFxuICAgIG5vcm1hbGl6ZWQuaW5jbHVkZXMoJ2dlbmVyYW5kbyBhcmNoaXZvJykgfHxcbiAgICBub3JtYWxpemVkLmluY2x1ZGVzKCdnZW5lcmF0aW5nIGZpbGUnKVxuICApIHtcbiAgICByZXR1cm4geyBwaGFzZTogJ2FjdGlvbicsIG1lc3NhZ2U6IHQoJ2NoYXQuYWN0aXZpdHkuZ2VuZXJhdGluZ0ZpbGUnKSB9XG4gIH1cbiAgaWYgKFxuICAgIG5vcm1hbGl6ZWQuaW5jbHVkZXMoJ3RhdmlseScpIHx8XG4gICAgbm9ybWFsaXplZC5pbmNsdWRlcygnc2VhcmNoX3dlYicpIHx8XG4gICAgbm9ybWFsaXplZC5pbmNsdWRlcygnYnVzY2FuZG8gZW4gbGEgd2ViJykgfHxcbiAgICBub3JtYWxpemVkLmluY2x1ZGVzKCdzZWFyY2hpbmcgdGhlIHdlYicpXG4gICkge1xuICAgIHJldHVybiB7IHBoYXNlOiAnc2VhcmNoJywgbWVzc2FnZTogdChTRUFSQ0hfTUVTU0FHRV9LRVlTWzBdKSB9XG4gIH1cblxuICBjb25zdCB0cmltbWVkTWVzc2FnZSA9IG5vZGVNZXNzYWdlLnRyaW0oKVxuICBpZiAodHJpbW1lZE1lc3NhZ2UgJiYgIWlzR2VuZXJpY1Jlc3VtZU5vZGVNZXNzYWdlKHRyaW1tZWRNZXNzYWdlKSAmJiAhbG9va3NMaWtlUmF3VG9vbE5hbWUodHJpbW1lZE1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIHsgcGhhc2U6ICdhY3Rpb24nLCBtZXNzYWdlOiB0cmltbWVkTWVzc2FnZSB9XG4gIH1cblxuICBpZiAoaXNHZW5lcmljUmVzdW1lTm9kZU1lc3NhZ2UodHJpbW1lZE1lc3NhZ2UpIHx8IG9wdGlvbnM/LnVzZVJlc3VtaW5nRmFsbGJhY2spIHtcbiAgICByZXR1cm4geyBwaGFzZTogJ2FjdGlvbicsIG1lc3NhZ2U6IHQoJ2NoYXQuYWN0aXZpdHkucmVzdW1pbmdBY3Rpb24nKSB9XG4gIH1cbiAgcmV0dXJuIHsgcGhhc2U6ICdhY3Rpb24nLCBtZXNzYWdlOiB0KCdjaGF0LmV4ZWN1dGluZ0FjdGlvbicpIH1cbn1cblxuZXhwb3J0IHR5cGUgSGl0bEV4ZWN1dGlvbkNvbnRleHQgPSB7XG4gIG1lc3NhZ2VJZD86IHN0cmluZ1xuICBtZXNzYWdlVGV4dD86IHN0cmluZ1xuICBhcHByb3ZhbD86IEFwcHJvdmFsUmVxdWVzdFxuICBwZW5kaW5nQWN0aW9ucz86IFBlbmRpbmdBY3Rpb25bXVxuICB0aHJlYWRJZHM/OiBzdHJpbmdbXVxufVxuXG5jb25zdCByZXNvbHZlUGVuZGluZ0FjdGlvbnNGb3JUaHJlYWQgPSAoXG4gIGNvbnRleHQ6IEhpdGxFeGVjdXRpb25Db250ZXh0IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgdGhyZWFkSWQ/OiBzdHJpbmdcbik6IFBlbmRpbmdBY3Rpb25bXSA9PiB7XG4gIGNvbnN0IHBlbmRpbmcgPSBjb250ZXh0Py5wZW5kaW5nQWN0aW9ucyA/PyBjb250ZXh0Py5hcHByb3ZhbD8ucGVuZGluZ19hY3Rpb25zID8/IFtdXG4gIGlmICghcGVuZGluZy5sZW5ndGgpIHJldHVybiBbXVxuXG4gIGlmICh0aHJlYWRJZCkge1xuICAgIGNvbnN0IGZvclRocmVhZCA9IHBlbmRpbmcuZmlsdGVyKGFjdGlvbiA9PiBhY3Rpb24udGhyZWFkX2lkID09PSB0aHJlYWRJZClcbiAgICBpZiAoZm9yVGhyZWFkLmxlbmd0aCkgcmV0dXJuIGZvclRocmVhZFxuICB9XG5cbiAgaWYgKGNvbnRleHQ/LnRocmVhZElkcz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHBlbmRpbmcuZmlsdGVyKGFjdGlvbiA9PiBjb250ZXh0LnRocmVhZElkcz8uaW5jbHVkZXMoYWN0aW9uLnRocmVhZF9pZCkpXG4gIH1cblxuICByZXR1cm4gcGVuZGluZ1xufVxuXG5jb25zdCBkZXRlY3RUb29sc0Zyb21QZW5kaW5nQWN0aW9ucyA9IChhY3Rpb25zOiBQZW5kaW5nQWN0aW9uW10pOiBzdHJpbmdbXSA9PiBbXG4gIC4uLm5ldyBTZXQoYWN0aW9ucy5tYXAoYWN0aW9uID0+IG5vcm1hbGl6ZUhpdGxUb29sTmFtZShhY3Rpb24udG9vbF9uYW1lKSkuZmlsdGVyKEJvb2xlYW4pKSxcbl1cblxuLyoqIFJlc3VlbHZlIGluZGljYWRvciBISVRMIHByaW9yaXphbmRvIHBlbmRpbmdfYWN0aW9ucyBkZWwgbWVuc2FqZSBkZSBhcHJvYmFjacOzbiBhbnRlcmlvci4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlSGl0bE5vZGVTdHJlYW1BY3Rpdml0eSA9IChcbiAgbm9kZU1lc3NhZ2U6IHN0cmluZyxcbiAgdDogVHJhbnNsYXRlRm4sXG4gIGNvbnRleHQ/OiBIaXRsRXhlY3V0aW9uQ29udGV4dCB8IG51bGwsXG4gIHRocmVhZElkPzogc3RyaW5nLFxuICBvcHRpb25zPzogeyB1c2VSZXN1bWluZ0ZhbGxiYWNrPzogYm9vbGVhbiB9XG4pOiBTdHJlYW1BY3Rpdml0eSA9PiB7XG4gIGNvbnN0IHBlbmRpbmdGb3JUaHJlYWQgPSByZXNvbHZlUGVuZGluZ0FjdGlvbnNGb3JUaHJlYWQoY29udGV4dCwgdGhyZWFkSWQpXG4gIGNvbnN0IGRldGVjdGVkVG9vbHMgPSBkZXRlY3RUb29sc0Zyb21QZW5kaW5nQWN0aW9ucyhwZW5kaW5nRm9yVGhyZWFkKVxuXG4gIGNvbnN0IHRyaW1tZWROb2RlTWVzc2FnZSA9IG5vZGVNZXNzYWdlLnRyaW0oKVxuICBjb25zdCBpc1JhdyA9IGxvb2tzTGlrZVJhd1Rvb2xOYW1lKHRyaW1tZWROb2RlTWVzc2FnZSlcbiAgY29uc3QgaXNHZW5lcmljID0gaXNHZW5lcmljUmVzdW1lTm9kZU1lc3NhZ2UodHJpbW1lZE5vZGVNZXNzYWdlKVxuICAvLyBFbCBiYWNrZW5kIGVudsOtYSBmcmFzZXMgY29tbyBcIkVqZWN1dGFuZG8gYXNzaWduX3Rhc2tfbGFiZWwuLi5cIiBxdWUgY29udGllbmVuIGVsIG5vbWJyZVxuICAvLyBjcnVkbyBkZSBsYSB0b29sIOKAlCBubyBzb24gbWVuc2FqZXMgbGVnaWJsZXMuIFNpIGVsIG1lbnNhamUgY29udGllbmUgYWxndW5vIGRlIGxvcyB0b29sc1xuICAvLyBkZXRlY3RhZG9zLCBwcmVmZXJpbW9zIGVsIG1hcGVvIGRlbCBkaWNjaW9uYXJpby5cbiAgY29uc3Qgbm9kZU1lc3NhZ2VDb250YWluc1Rvb2wgPVxuICAgIGRldGVjdGVkVG9vbHMubGVuZ3RoID49IDEgJiYgZGV0ZWN0ZWRUb29scy5zb21lKHRvb2wgPT4gdHJpbW1lZE5vZGVNZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModG9vbCkpXG4gIGNvbnN0IGFjdGl2aXR5RnJvbU5vZGVNZXNzYWdlID1cbiAgICB0cmltbWVkTm9kZU1lc3NhZ2UgJiYgIWlzR2VuZXJpYyAmJiAhaXNSYXcgJiYgIW5vZGVNZXNzYWdlQ29udGFpbnNUb29sXG4gICAgICA/IHsgcGhhc2U6ICdhY3Rpb24nIGFzIGNvbnN0LCBtZXNzYWdlOiB0cmltbWVkTm9kZU1lc3NhZ2UgfVxuICAgICAgOiBudWxsXG5cbiAgaWYgKGRldGVjdGVkVG9vbHMubGVuZ3RoID49IDEpIHtcbiAgICBpZiAoYWN0aXZpdHlGcm9tTm9kZU1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiBhY3Rpdml0eUZyb21Ob2RlTWVzc2FnZVxuICAgIH1cbiAgICByZXR1cm4gbWFwSGl0bFRvb2xOYW1lVG9TdHJlYW1BY3Rpdml0eShkZXRlY3RlZFRvb2xzWzBdLCB0LCBvcHRpb25zKVxuICB9XG5cbiAgcmV0dXJuIG1hcE5vZGVNZXNzYWdlVG9TdHJlYW1BY3Rpdml0eShub2RlTWVzc2FnZSwgdCwgb3B0aW9ucylcbn1cblxuZXhwb3J0IGNvbnN0IEFDVElWSVRZX01FU1NBR0VfUk9UQVRFX01TID0gMzIwMFxuXG5jb25zdCBST1RBVEFCTEVfUEhBU0VTOiBTdHJlYW1BY3Rpdml0eVBoYXNlW10gPSBbJ2dlbmVyYXRpbmcnLCAndGhpbmtpbmcnLCAnc2VhcmNoJywgJ2RlZXBfc2VhcmNoJywgJ2F0dGFjaG1lbnQnXVxuXG5jb25zdCBnZXRNZXNzYWdlS2V5c0ZvclBoYXNlID0gKHBoYXNlOiBTdHJlYW1BY3Rpdml0eVBoYXNlLCBhdHRhY2htZW50c0NvdW50ID0gMCk6IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbCA9PiB7XG4gIHN3aXRjaCAocGhhc2UpIHtcbiAgICBjYXNlICdnZW5lcmF0aW5nJzpcbiAgICAgIHJldHVybiBHRU5FUkFUSU5HX01FU1NBR0VfS0VZU1xuICAgIGNhc2UgJ3RoaW5raW5nJzpcbiAgICAgIHJldHVybiBUSElOS0lOR19NRVNTQUdFX0tFWVNcbiAgICBjYXNlICdzZWFyY2gnOlxuICAgICAgcmV0dXJuIFNFQVJDSF9NRVNTQUdFX0tFWVNcbiAgICBjYXNlICdkZWVwX3NlYXJjaCc6XG4gICAgICByZXR1cm4gREVFUF9TRUFSQ0hfTUVTU0FHRV9LRVlTXG4gICAgY2FzZSAnYXR0YWNobWVudCc6XG4gICAgICByZXR1cm4gYXR0YWNobWVudHNDb3VudCA+IDEgPyBBVFRBQ0hNRU5UX01FU1NBR0VfS0VZU19QTFVSQUwgOiBBVFRBQ0hNRU5UX01FU1NBR0VfS0VZU1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBnZXRTdHJlYW1BY3Rpdml0eU1lc3NhZ2VBdEluZGV4ID0gKFxuICBwaGFzZTogU3RyZWFtQWN0aXZpdHlQaGFzZSxcbiAgaW5kZXg6IG51bWJlcixcbiAgdDogVHJhbnNsYXRlRm4sXG4gIGF0dGFjaG1lbnRzQ291bnQgPSAwXG4pOiBzdHJpbmcgPT4ge1xuICBpZiAocGhhc2UgPT09ICd3cml0aW5nJykge1xuICAgIHJldHVybiB0KFdSSVRJTkdfQUNUSVZJVFlfTUVTU0FHRV9LRVkpXG4gIH1cblxuICBjb25zdCBrZXlzID0gZ2V0TWVzc2FnZUtleXNGb3JQaGFzZShwaGFzZSwgYXR0YWNobWVudHNDb3VudClcbiAgaWYgKCFrZXlzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGNvbnN0IGNsYW1wZWRJbmRleCA9IE1hdGgubWluKE1hdGgubWF4KDAsIGluZGV4KSwga2V5cy5sZW5ndGggLSAxKVxuICByZXR1cm4gdChrZXlzW2NsYW1wZWRJbmRleF0pXG59XG5cbmV4cG9ydCBjb25zdCBnZXRUaGlua2luZ0xvYWRpbmdNZXNzYWdlID0gKGluZGV4OiBudW1iZXIsIHQ6IFRyYW5zbGF0ZUZuKTogc3RyaW5nID0+XG4gIGdldFN0cmVhbUFjdGl2aXR5TWVzc2FnZUF0SW5kZXgoJ3RoaW5raW5nJywgaW5kZXgsIHQpXG5cbmV4cG9ydCBjb25zdCBnZXRHZW5lcmF0aW5nTG9hZGluZ01lc3NhZ2UgPSAoaW5kZXg6IG51bWJlciwgdDogVHJhbnNsYXRlRm4pOiBzdHJpbmcgPT5cbiAgZ2V0U3RyZWFtQWN0aXZpdHlNZXNzYWdlQXRJbmRleCgnZ2VuZXJhdGluZycsIGluZGV4LCB0KVxuXG5leHBvcnQgY29uc3QgY2FuQWR2YW5jZVN0cmVhbUFjdGl2aXR5TWVzc2FnZSA9IChwaGFzZTogU3RyZWFtQWN0aXZpdHlQaGFzZSwgY3VycmVudEluZGV4OiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgY29uc3Qga2V5cyA9IGdldE1lc3NhZ2VLZXlzRm9yUGhhc2UocGhhc2UpXG4gIGlmICgha2V5cykge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiBjdXJyZW50SW5kZXggPCBrZXlzLmxlbmd0aCAtIDFcbn1cblxuZXhwb3J0IGNvbnN0IGFkdmFuY2VTdHJlYW1BY3Rpdml0eU1lc3NhZ2UgPSAoXG4gIGFjdGl2aXR5OiBTdHJlYW1BY3Rpdml0eSxcbiAgY3VycmVudEluZGV4OiBudW1iZXIsXG4gIHQ6IFRyYW5zbGF0ZUZuXG4pOiB7IGFjdGl2aXR5OiBTdHJlYW1BY3Rpdml0eTsgbmV4dEluZGV4OiBudW1iZXIgfSB8IG51bGwgPT4ge1xuICBpZiAoIWNhbkFkdmFuY2VTdHJlYW1BY3Rpdml0eU1lc3NhZ2UoYWN0aXZpdHkucGhhc2UsIGN1cnJlbnRJbmRleCkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgbmV4dEluZGV4ID0gY3VycmVudEluZGV4ICsgMVxuICByZXR1cm4ge1xuICAgIGFjdGl2aXR5OiB7XG4gICAgICBwaGFzZTogYWN0aXZpdHkucGhhc2UsXG4gICAgICBtZXNzYWdlOiBnZXRTdHJlYW1BY3Rpdml0eU1lc3NhZ2VBdEluZGV4KGFjdGl2aXR5LnBoYXNlLCBuZXh0SW5kZXgsIHQsIGFjdGl2aXR5LmF0dGFjaG1lbnRzQ291bnQpLFxuICAgICAgLi4uKGFjdGl2aXR5LmF0dGFjaG1lbnRzQ291bnQgIT0gbnVsbCAmJiB7IGF0dGFjaG1lbnRzQ291bnQ6IGFjdGl2aXR5LmF0dGFjaG1lbnRzQ291bnQgfSksXG4gICAgfSxcbiAgICBuZXh0SW5kZXgsXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGNhblJvdGF0ZVN0cmVhbUFjdGl2aXR5UGhhc2UgPSAocGhhc2U6IFN0cmVhbUFjdGl2aXR5UGhhc2UpOiBib29sZWFuID0+IFJPVEFUQUJMRV9QSEFTRVMuaW5jbHVkZXMocGhhc2UpXG5cbmV4cG9ydCBjb25zdCBnZXRUaGlua2luZ1N0cmVhbUFjdGl2aXR5ID0gKHQ6IFRyYW5zbGF0ZUZuKTogU3RyZWFtQWN0aXZpdHkgPT4gKHtcbiAgcGhhc2U6ICd0aGlua2luZycsXG4gIG1lc3NhZ2U6IHQoVEhJTktJTkdfQUNUSVZJVFlfTUVTU0FHRV9LRVkpLFxufSlcblxuZXhwb3J0IGNvbnN0IGdldFdyaXRpbmdTdHJlYW1BY3Rpdml0eSA9ICh0OiBUcmFuc2xhdGVGbik6IFN0cmVhbUFjdGl2aXR5ID0+ICh7XG4gIHBoYXNlOiAnd3JpdGluZycsXG4gIG1lc3NhZ2U6IHQoV1JJVElOR19BQ1RJVklUWV9NRVNTQUdFX0tFWSksXG59KVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZUluaXRpYWxIaXRsU3RyZWFtQWN0aXZpdHkgPSAoXG4gIHQ6IFRyYW5zbGF0ZUZuLFxuICBjb250ZXh0PzogSGl0bEV4ZWN1dGlvbkNvbnRleHQgfCBudWxsXG4pOiBTdHJlYW1BY3Rpdml0eSA9PiB7XG4gIGNvbnN0IHBlbmRpbmdBY3Rpb25zID0gcmVzb2x2ZVBlbmRpbmdBY3Rpb25zRm9yVGhyZWFkKGNvbnRleHQpXG4gIGNvbnN0IGRldGVjdGVkVG9vbHMgPSBkZXRlY3RUb29sc0Zyb21QZW5kaW5nQWN0aW9ucyhwZW5kaW5nQWN0aW9ucylcblxuICBpZiAoZGV0ZWN0ZWRUb29scy5sZW5ndGggPj0gMSkge1xuICAgIHJldHVybiBtYXBIaXRsVG9vbE5hbWVUb1N0cmVhbUFjdGl2aXR5KGRldGVjdGVkVG9vbHNbMF0sIHQsIHsgdXNlUmVzdW1pbmdGYWxsYmFjazogdHJ1ZSB9KVxuICB9XG5cbiAgcmV0dXJuIHsgcGhhc2U6ICdwcm9jZXNzaW5nJywgbWVzc2FnZTogdCgnY2hhdC5wcm9jZXNzaW5nJykgfVxufVxuXG4vKiogVHJhcyBlbCBwcmltZXIgZXZlbnRvIGRlbCBzdHJlYW0gZWwgaW5kaWNhZG9yIGVuIHZpdm8gc29sbyBhbHRlcm5hIHBlbnNhbmRvIC8gZXNjcmliaWVuZG8uICovXG5leHBvcnQgY29uc3QgdG9JbmRpY2F0b3JTdHJlYW1BY3Rpdml0eSA9IChcbiAgYWN0aXZpdHk6IFN0cmVhbUFjdGl2aXR5IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgdDogVHJhbnNsYXRlRm5cbik6IFN0cmVhbUFjdGl2aXR5IHwgbnVsbCA9PiB7XG4gIGlmICghYWN0aXZpdHkpIHJldHVybiBudWxsXG4gIHJldHVybiBhY3Rpdml0eS5waGFzZSA9PT0gJ3dyaXRpbmcnID8gZ2V0V3JpdGluZ1N0cmVhbUFjdGl2aXR5KHQpIDogZ2V0VGhpbmtpbmdTdHJlYW1BY3Rpdml0eSh0KVxufVxuXG5leHBvcnQgY29uc3QgZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5ID0gKFxuICB0OiBUcmFuc2xhdGVGbixcbiAgb3B0aW9ucz86IHtcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZT86IGJvb2xlYW5cbiAgICBpc0RlZXBTZWFyY2hBY3RpdmU/OiBib29sZWFuXG4gICAgaGFzQXR0YWNobWVudHM/OiBib29sZWFuXG4gICAgYXR0YWNobWVudHNDb3VudD86IG51bWJlclxuICB9XG4pOiBTdHJlYW1BY3Rpdml0eSA9PiB7XG4gIGlmIChvcHRpb25zPy5pc1dlYlNlYXJjaEFjdGl2ZSkge1xuICAgIHJldHVybiB7IHBoYXNlOiAnc2VhcmNoJywgbWVzc2FnZTogdChTRUFSQ0hfTUVTU0FHRV9LRVlTWzBdKSB9XG4gIH1cbiAgaWYgKG9wdGlvbnM/LmlzRGVlcFNlYXJjaEFjdGl2ZSkge1xuICAgIHJldHVybiB7IHBoYXNlOiAnZGVlcF9zZWFyY2gnLCBtZXNzYWdlOiB0KERFRVBfU0VBUkNIX01FU1NBR0VfS0VZU1swXSkgfVxuICB9XG4gIGlmIChvcHRpb25zPy5oYXNBdHRhY2htZW50cykge1xuICAgIGNvbnN0IGF0dGFjaG1lbnRzQ291bnQgPSBvcHRpb25zLmF0dGFjaG1lbnRzQ291bnQgPz8gMFxuICAgIHJldHVybiB7XG4gICAgICBwaGFzZTogJ2F0dGFjaG1lbnQnLFxuICAgICAgbWVzc2FnZTogZ2V0U3RyZWFtQWN0aXZpdHlNZXNzYWdlQXRJbmRleCgnYXR0YWNobWVudCcsIDAsIHQsIGF0dGFjaG1lbnRzQ291bnQpLFxuICAgICAgYXR0YWNobWVudHNDb3VudCxcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgcGhhc2U6ICdnZW5lcmF0aW5nJywgbWVzc2FnZTogdChHRU5FUkFUSU5HX01FU1NBR0VfS0VZU1swXSkgfVxufVxuXG5leHBvcnQgY29uc3QgcmVzb2x2ZVN0cmVhbUxvYWRpbmdEaXNwbGF5ID0gKHBhcmFtczoge1xuICBzdHJlYW1BY3Rpdml0eTogU3RyZWFtQWN0aXZpdHkgfCBudWxsXG4gIGxvYWRpbmdNZXNzYWdlOiBzdHJpbmcgfCBudWxsXG4gIGFjdGl2ZUxvYWRpbmdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIHdhaXRpbmdSZXNwb25zZTogYm9vbGVhblxuICBpc1dlYlNlYXJjaEFjdGl2ZTogYm9vbGVhblxuICBpc0RlZXBTZWFyY2hBY3RpdmU6IGJvb2xlYW5cbiAgaGFzQXR0YWNobWVudHM6IGJvb2xlYW5cbiAgYXR0YWNobWVudHNDb3VudD86IG51bWJlclxuICB0OiBUcmFuc2xhdGVGblxufSk6IFN0cmVhbUFjdGl2aXR5IHwgbnVsbCA9PiB7XG4gIGlmIChwYXJhbXMuc3RyZWFtQWN0aXZpdHkpIHtcbiAgICByZXR1cm4gcGFyYW1zLnN0cmVhbUFjdGl2aXR5XG4gIH1cblxuICBjb25zdCBhY3RpdmVLZXlzID0gT2JqZWN0LmtleXMocGFyYW1zLmFjdGl2ZUxvYWRpbmdzKVxuICBpZiAoYWN0aXZlS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZmlyc3RLZXkgPSBhY3RpdmVLZXlzWzBdXG4gICAgY29uc3QgcmF3ID0gcGFyYW1zLmFjdGl2ZUxvYWRpbmdzW2ZpcnN0S2V5XVxuICAgIGlmIChyYXcgJiYgcmF3ICE9PSBwYXJhbXMudCgnY2hhdC5wcm9jZXNzaW5nJykpIHtcbiAgICAgIGNvbnN0IGhpdGxUb29sID0gcmVzb2x2ZUhpdGxUb29sRnJvbU5vZGVNZXNzYWdlKHJhdylcbiAgICAgIGlmIChoaXRsVG9vbCkge1xuICAgICAgICByZXR1cm4gbWFwSGl0bFRvb2xOYW1lVG9TdHJlYW1BY3Rpdml0eShoaXRsVG9vbCwgcGFyYW1zLnQpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyaW1tZWQgPSByYXcudHJpbSgpXG4gICAgICBpZiAodHJpbW1lZCAmJiAhaXNHZW5lcmljUmVzdW1lTm9kZU1lc3NhZ2UodHJpbW1lZCkpIHtcbiAgICAgICAgcmV0dXJuIHsgcGhhc2U6ICdhY3Rpb24nLCBtZXNzYWdlOiB0cmltbWVkIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1hcE5vZGVNZXNzYWdlVG9TdHJlYW1BY3Rpdml0eShyYXcsIHBhcmFtcy50LCB7IHVzZVJlc3VtaW5nRmFsbGJhY2s6IHRydWUgfSlcbiAgICB9XG4gICAgcmV0dXJuIHsgcGhhc2U6ICdwcm9jZXNzaW5nJywgbWVzc2FnZTogcGFyYW1zLnQoJ2NoYXQucHJvY2Vzc2luZycpIH1cbiAgfVxuXG4gIGlmIChwYXJhbXMubG9hZGluZ01lc3NhZ2UpIHtcbiAgICBpZiAoXG4gICAgICBwYXJhbXMubG9hZGluZ01lc3NhZ2UgPT09IHBhcmFtcy50KCdjaGF0LndyaXRpbmcnKSB8fFxuICAgICAgcGFyYW1zLmxvYWRpbmdNZXNzYWdlID09PSBwYXJhbXMudChXUklUSU5HX0FDVElWSVRZX01FU1NBR0VfS0VZKSB8fFxuICAgICAgcGFyYW1zLmxvYWRpbmdNZXNzYWdlID09PSBwYXJhbXMudCgnY2hhdC5hY3Rpdml0eS53cml0aW5nLmNvbXBvc2luZycpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZ2V0V3JpdGluZ1N0cmVhbUFjdGl2aXR5KHBhcmFtcy50KVxuICAgIH1cbiAgICBpZiAocGFyYW1zLmxvYWRpbmdNZXNzYWdlID09PSBwYXJhbXMudCgnY2hhdC5nZW5lcmF0aW5nJykpIHtcbiAgICAgIHJldHVybiB7IHBoYXNlOiAnZ2VuZXJhdGluZycsIG1lc3NhZ2U6IHBhcmFtcy5sb2FkaW5nTWVzc2FnZSB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHBhcmFtcy5sb2FkaW5nTWVzc2FnZSA9PT0gcGFyYW1zLnQoJ2NoYXQuZ2VuZXJhdGluZ1dlYlNlYXJjaCcpIHx8XG4gICAgICBwYXJhbXMubG9hZGluZ01lc3NhZ2UgPT09IHBhcmFtcy50KCdjaGF0LmdlbmVyYXRpbmdEZWVwU2VhcmNoJykgfHxcbiAgICAgIHBhcmFtcy5sb2FkaW5nTWVzc2FnZSA9PT0gcGFyYW1zLnQoJ2NoYXQuZ2VuZXJhdGluZ0F0dGFjaG1lbnQnKVxuICAgICkge1xuICAgICAgcmV0dXJuIGdldEluaXRpYWxTdHJlYW1BY3Rpdml0eShwYXJhbXMudCwge1xuICAgICAgICBpc1dlYlNlYXJjaEFjdGl2ZTogcGFyYW1zLmxvYWRpbmdNZXNzYWdlID09PSBwYXJhbXMudCgnY2hhdC5nZW5lcmF0aW5nV2ViU2VhcmNoJyksXG4gICAgICAgIGlzRGVlcFNlYXJjaEFjdGl2ZTogcGFyYW1zLmxvYWRpbmdNZXNzYWdlID09PSBwYXJhbXMudCgnY2hhdC5nZW5lcmF0aW5nRGVlcFNlYXJjaCcpLFxuICAgICAgICBoYXNBdHRhY2htZW50czogcGFyYW1zLmxvYWRpbmdNZXNzYWdlID09PSBwYXJhbXMudCgnY2hhdC5nZW5lcmF0aW5nQXR0YWNobWVudCcpLFxuICAgICAgICBhdHRhY2htZW50c0NvdW50OiBwYXJhbXMuYXR0YWNobWVudHNDb3VudCxcbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiB7IHBoYXNlOiAnYWN0aW9uJywgbWVzc2FnZTogcGFyYW1zLmxvYWRpbmdNZXNzYWdlIH1cbiAgfVxuXG4gIGlmIChwYXJhbXMud2FpdGluZ1Jlc3BvbnNlKSB7XG4gICAgcmV0dXJuIGdldEluaXRpYWxTdHJlYW1BY3Rpdml0eShwYXJhbXMudCwge1xuICAgICAgaXNXZWJTZWFyY2hBY3RpdmU6IHBhcmFtcy5pc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICAgIGlzRGVlcFNlYXJjaEFjdGl2ZTogcGFyYW1zLmlzRGVlcFNlYXJjaEFjdGl2ZSxcbiAgICAgIGhhc0F0dGFjaG1lbnRzOiBwYXJhbXMuaGFzQXR0YWNobWVudHMsXG4gICAgICBhdHRhY2htZW50c0NvdW50OiBwYXJhbXMuYXR0YWNobWVudHNDb3VudCxcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGNvbnN0IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXJNZXNzYWdlSWQgPSAobWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuID0+XG4gIHR5cGVvZiBtZXNzYWdlSWQgPT09ICdzdHJpbmcnICYmIG1lc3NhZ2VJZC5pbmNsdWRlcygnLXN0cmVhbWluZycpXG5cbmV4cG9ydCBjb25zdCBzdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZCA9IChtZXNzYWdlSWQ6IHN0cmluZyk6IHN0cmluZyA9PiBgYW5zd2VyLSR7bWVzc2FnZUlkfS1zdHJlYW1pbmdgXG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFFQSxTQUFTQSxxQkFBcUIsUUFBUSxpQkFBaUI7QUFJdkQsSUFBTUMscUJBQXFCLEdBQUcsQ0FDNUIsa0NBQWtDLEVBQ2xDLGtDQUFrQyxFQUNsQyxpQ0FBaUMsQ0FDekI7QUFFVixJQUFNQyx1QkFBdUIsR0FBRyxDQUM5QixzQ0FBc0MsRUFDdEMsc0NBQXNDLEVBQ3RDLG9DQUFvQyxDQUM1QjtBQUVWLElBQU1DLG1CQUFtQixHQUFHLENBQUMsK0JBQStCLEVBQUUsa0NBQWtDLENBQVU7QUFFMUcsSUFBTUMsd0JBQXdCLEdBQUcsQ0FDL0Isb0NBQW9DLEVBQ3BDLHdDQUF3QyxDQUNoQztBQUVWLElBQU1DLHVCQUF1QixHQUFH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
@@ -0,0 +1,227 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
+ import { advanceStreamActivityMessage, canAdvanceStreamActivityMessage, canRotateStreamActivityPhase, getGeneratingLoadingMessage, getInitialStreamActivity, getStreamActivityMessageAtIndex, getThinkingLoadingMessage, getThinkingStreamActivity, getWritingStreamActivity, isStreamingPlaceholderMessageId, mapHitlToolNameToStreamActivity, mapNodeMessageToStreamActivity, resolveHitlNodeStreamActivity, resolveInitialHitlStreamActivity, resolveStreamLoadingDisplay, resolveToolActionLabel, resolveToolStepPastLabel, streamingPlaceholderMessageId } from './streamActivityMessages';
5
+ var t = function t(key) {
6
+ return key;
7
+ };
8
+ describe('streamActivityMessages', function () {
9
+ describe('resolveToolActionLabel', function () {
10
+ it('maps known tools and returns null for unknown ones', function () {
11
+ expect(resolveToolActionLabel('create_task', t, 'present')).toBe('chat.activity.actions.createTask.present');
12
+ expect(resolveToolActionLabel('assign', t, 'past')).toBe('chat.activity.actions.assignUser.past');
13
+ expect(resolveToolActionLabel('unknown_tool', t, 'present')).toBeNull();
14
+ });
15
+ });
16
+ describe('mapHitlToolNameToStreamActivity', function () {
17
+ it('uses the dictionary or a fallback', function () {
18
+ expect(mapHitlToolNameToStreamActivity('edit_task', t)).toEqual({
19
+ phase: 'action',
20
+ message: 'chat.activity.actions.editTask.present'
21
+ });
22
+ expect(mapHitlToolNameToStreamActivity('unknown_tool', t, {
23
+ useResumingFallback: true
24
+ })).toEqual({
25
+ phase: 'action',
26
+ message: 'chat.activity.resumingAction'
27
+ });
28
+ });
29
+ });
30
+ describe('mapNodeMessageToStreamActivity', function () {
31
+ it('maps file generation and web search phrases', function () {
32
+ expect(mapNodeMessageToStreamActivity('Generating file now', t).message).toBe('chat.activity.generatingFile');
33
+ expect(mapNodeMessageToStreamActivity('searching the web', t)).toEqual({
34
+ phase: 'search',
35
+ message: 'chat.activity.search.scanning'
36
+ });
37
+ });
38
+ it('keeps a readable node message and hides raw tool names', function () {
39
+ expect(mapNodeMessageToStreamActivity('Revisando el proyecto', t)).toEqual({
40
+ phase: 'action',
41
+ message: 'Revisando el proyecto'
42
+ });
43
+ expect(mapNodeMessageToStreamActivity('foo_bar_unknown', t).message).toBe('chat.executingAction');
44
+ });
45
+ });
46
+ describe('activity rotation and placeholders', function () {
47
+ it('returns the message for a phase index and knows when it can advance', function () {
48
+ expect(getStreamActivityMessageAtIndex('thinking', 0, t)).toBe('chat.activity.thinking.analyzing');
49
+ expect(canAdvanceStreamActivityMessage('thinking', 0)).toBe(true);
50
+ expect(canAdvanceStreamActivityMessage('thinking', 2)).toBe(false);
51
+ });
52
+ it('picks the initial phase from search, attachments or generating', function () {
53
+ expect(getInitialStreamActivity(t, {
54
+ isWebSearchActive: true
55
+ }).phase).toBe('search');
56
+ expect(getInitialStreamActivity(t, {
57
+ hasAttachments: true,
58
+ attachmentsCount: 2
59
+ }).phase).toBe('attachment');
60
+ expect(getInitialStreamActivity(t, {})).toEqual({
61
+ phase: 'generating',
62
+ message: 'chat.activity.generating.considering'
63
+ });
64
+ });
65
+ it('builds and detects streaming placeholder ids', function () {
66
+ expect(streamingPlaceholderMessageId('abc')).toBe('answer-abc-streaming');
67
+ expect(isStreamingPlaceholderMessageId('answer-abc-streaming')).toBe(true);
68
+ expect(isStreamingPlaceholderMessageId('answer-abc')).toBe(false);
69
+ });
70
+ });
71
+ describe('HITL stream activity', function () {
72
+ it('resolves initial activity from pending actions', function () {
73
+ expect(resolveInitialHitlStreamActivity(t, {
74
+ pendingActions: [{
75
+ tool_name: 'edit_task',
76
+ thread_id: 't1',
77
+ tool_call_id: 'c1',
78
+ tool_args: {}
79
+ }]
80
+ })).toEqual({
81
+ phase: 'action',
82
+ message: 'chat.activity.actions.editTask.present'
83
+ });
84
+ expect(resolveInitialHitlStreamActivity(t, {})).toEqual({
85
+ phase: 'processing',
86
+ message: 'chat.processing'
87
+ });
88
+ });
89
+ it('prefers readable node messages when tools are detected', function () {
90
+ expect(resolveHitlNodeStreamActivity('Revisando datos', t, {
91
+ pendingActions: [{
92
+ tool_name: 'edit_task',
93
+ thread_id: 't1',
94
+ tool_call_id: 'c1',
95
+ tool_args: {}
96
+ }]
97
+ })).toEqual({
98
+ phase: 'action',
99
+ message: 'Revisando datos'
100
+ });
101
+ });
102
+ it('maps tool names when the node message is raw', function () {
103
+ expect(resolveHitlNodeStreamActivity('edit_task', t, {
104
+ pendingActions: [{
105
+ tool_name: 'edit_task',
106
+ thread_id: 't1',
107
+ tool_call_id: 'c1',
108
+ tool_args: {}
109
+ }]
110
+ })).toEqual({
111
+ phase: 'action',
112
+ message: 'chat.activity.actions.editTask.present'
113
+ });
114
+ });
115
+ });
116
+ describe('rotation helpers', function () {
117
+ it('exposes thinking and generating loaders and advances indices', function () {
118
+ expect(getThinkingLoadingMessage(1, t)).toBe('chat.activity.thinking.reviewing');
119
+ expect(getGeneratingLoadingMessage(0, t)).toBe('chat.activity.generating.considering');
120
+ expect(canRotateStreamActivityPhase('thinking')).toBe(true);
121
+ expect(canRotateStreamActivityPhase('writing')).toBe(false);
122
+ expect(getWritingStreamActivity(t)).toEqual({
123
+ phase: 'writing',
124
+ message: 'chat.activity.writing.label'
125
+ });
126
+ var advanced = advanceStreamActivityMessage({
127
+ phase: 'thinking',
128
+ message: 'a'
129
+ }, 0, t);
130
+ expect(advanced === null || advanced === void 0 ? void 0 : advanced.nextIndex).toBe(1);
131
+ expect(advanced === null || advanced === void 0 ? void 0 : advanced.activity.message).toBe('chat.activity.thinking.reviewing');
132
+ });
133
+ it('returns past tense labels for known tools', function () {
134
+ expect(resolveToolStepPastLabel('create_task', t)).toBe('chat.activity.actions.createTask.past');
135
+ });
136
+ });
137
+ describe('resolveStreamLoadingDisplay', function () {
138
+ var base = {
139
+ streamActivity: null,
140
+ loadingMessage: null,
141
+ activeLoadings: {},
142
+ waitingResponse: false,
143
+ isWebSearchActive: false,
144
+ isDeepSearchActive: false,
145
+ hasAttachments: false,
146
+ t: t
147
+ };
148
+ it('prefers an explicit stream activity before the first token', function () {
149
+ var streamActivity = {
150
+ phase: 'action',
151
+ message: 'Creando tarea'
152
+ };
153
+ expect(resolveStreamLoadingDisplay(_objectSpread(_objectSpread({}, base), {}, {
154
+ streamActivity: streamActivity
155
+ }))).toEqual(streamActivity);
156
+ });
157
+ it('returns the initial generating activity while waiting', function () {
158
+ expect(resolveStreamLoadingDisplay(_objectSpread(_objectSpread({}, base), {}, {
159
+ waitingResponse: true
160
+ }))).toEqual({
161
+ phase: 'generating',
162
+ message: 'chat.activity.generating.considering'
163
+ });
164
+ });
165
+ it('maps active loadings and loading messages', function () {
166
+ expect(resolveStreamLoadingDisplay(_objectSpread(_objectSpread({}, base), {}, {
167
+ activeLoadings: {
168
+ node: 'Revisando proyecto'
169
+ }
170
+ }))).toEqual({
171
+ phase: 'action',
172
+ message: 'Revisando proyecto'
173
+ });
174
+ expect(resolveStreamLoadingDisplay(_objectSpread(_objectSpread({}, base), {}, {
175
+ activeLoadings: {
176
+ node: 'chat.processing'
177
+ }
178
+ }))).toEqual({
179
+ phase: 'processing',
180
+ message: 'chat.processing'
181
+ });
182
+ expect(resolveStreamLoadingDisplay(_objectSpread(_objectSpread({}, base), {}, {
183
+ loadingMessage: 'chat.writing'
184
+ }))).toEqual({
185
+ phase: 'writing',
186
+ message: 'chat.activity.writing.label'
187
+ });
188
+ expect(resolveStreamLoadingDisplay(_objectSpread(_objectSpread({}, base), {}, {
189
+ loadingMessage: 'chat.generatingWebSearch'
190
+ }))).toEqual({
191
+ phase: 'search',
192
+ message: 'chat.activity.search.scanning'
193
+ });
194
+ });
195
+ it('keeps writing when the stream is composing', function () {
196
+ expect(resolveStreamLoadingDisplay(_objectSpread(_objectSpread({}, base), {}, {
197
+ streamActivity: getWritingStreamActivity(t)
198
+ }))).toEqual(getWritingStreamActivity(t));
199
+ });
200
+ });
201
+ describe('thinking and writing indicator', function () {
202
+ it('exposes thinking and writing labels for the live indicator after the first stream event', function () {
203
+ expect(getThinkingStreamActivity(t)).toEqual({
204
+ phase: 'thinking',
205
+ message: 'chat.activity.thinking.label'
206
+ });
207
+ expect(getWritingStreamActivity(t)).toEqual({
208
+ phase: 'writing',
209
+ message: 'chat.activity.writing.label'
210
+ });
211
+ });
212
+ it('resumes HITL with the pending tool label before the first token', function () {
213
+ expect(resolveInitialHitlStreamActivity(t, {
214
+ pendingActions: [{
215
+ tool_name: 'create_task',
216
+ tool_call_id: '1',
217
+ tool_args: {},
218
+ thread_id: 't1'
219
+ }]
220
+ })).toEqual({
221
+ phase: 'action',
222
+ message: 'chat.activity.actions.createTask.present'
223
+ });
224
+ });
225
+ });
226
+ });
227
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhZHZhbmNlU3RyZWFtQWN0aXZpdHlNZXNzYWdlIiwiY2FuQWR2YW5jZVN0cmVhbUFjdGl2aXR5TWVzc2FnZSIsImNhblJvdGF0ZVN0cmVhbUFjdGl2aXR5UGhhc2UiLCJnZXRHZW5lcmF0aW5nTG9hZGluZ01lc3NhZ2UiLCJnZXRJbml0aWFsU3RyZWFtQWN0aXZpdHkiLCJnZXRTdHJlYW1BY3Rpdml0eU1lc3NhZ2VBdEluZGV4IiwiZ2V0VGhpbmtpbmdMb2FkaW5nTWVzc2FnZSIsImdldFRoaW5raW5nU3RyZWFtQWN0aXZpdHkiLCJnZXRXcml0aW5nU3RyZWFtQWN0aXZpdHkiLCJpc1N0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkIiwibWFwSGl0bFRvb2xOYW1lVG9TdHJlYW1BY3Rpdml0eSIsIm1hcE5vZGVNZXNzYWdlVG9TdHJlYW1BY3Rpdml0eSIsInJlc29sdmVIaXRsTm9kZVN0cmVhbUFjdGl2aXR5IiwicmVzb2x2ZUluaXRpYWxIaXRsU3RyZWFtQWN0aXZpdHkiLCJyZXNvbHZlU3RyZWFtTG9hZGluZ0Rpc3BsYXkiLCJyZXNvbHZlVG9vbEFjdGlvbkxhYmVsIiwicmVzb2x2ZVRvb2xTdGVwUGFzdExhYmVsIiwic3RyZWFtaW5nUGxhY2Vob2xkZXJNZXNzYWdlSWQiLCJ0Iiwia2V5IiwiZGVzY3JpYmUiLCJpdCIsImV4cGVjdCIsInRvQmUiLCJ0b0JlTnVsbCIsInRvRXF1YWwiLCJwaGFzZSIsIm1lc3NhZ2UiLCJ1c2VSZXN1bWluZ0ZhbGxiYWNrIiwiaXNXZWJTZWFyY2hBY3RpdmUiLCJoYXNBdHRhY2htZW50cyIsImF0dGFjaG1lbnRzQ291bnQiLCJwZW5kaW5nQWN0aW9ucyIsInRvb2xfbmFtZSIsInRocmVhZF9pZCIsInRvb2xfY2FsbF9pZCIsInRvb2xfYXJncyIsImFkdmFuY2VkIiwibmV4dEluZGV4IiwiYWN0aXZpdHkiLCJiYXNlIiwic3RyZWFtQWN0aXZpdHkiLCJsb2FkaW5nTWVzc2FnZSIsImFjdGl2ZUxvYWRpbmdzIiwid2FpdGluZ1Jlc3BvbnNlIiwiaXNEZWVwU2VhcmNoQWN0aXZlIiwiX29iamVjdFNwcmVhZCIsIm5vZGUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvc3RyZWFtQWN0aXZpdHlNZXNzYWdlcy5zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGFkdmFuY2VTdHJlYW1BY3Rpdml0eU1lc3NhZ2UsXG4gIGNhbkFkdmFuY2VTdHJlYW1BY3Rpdml0eU1lc3NhZ2UsXG4gIGNhblJvdGF0ZVN0cmVhbUFjdGl2aXR5UGhhc2UsXG4gIGdldEdlbmVyYXRpbmdMb2FkaW5nTWVzc2FnZSxcbiAgZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5LFxuICBnZXRTdHJlYW1BY3Rpdml0eU1lc3NhZ2VBdEluZGV4LFxuICBnZXRUaGlua2luZ0xvYWRpbmdNZXNzYWdlLFxuICBnZXRUaGlua2luZ1N0cmVhbUFjdGl2aXR5LFxuICBnZXRXcml0aW5nU3RyZWFtQWN0aXZpdHksXG4gIGlzU3RyZWFtaW5nUGxhY2Vob2xkZXJNZXNzYWdlSWQsXG4gIG1hcEhpdGxUb29sTmFtZVRvU3RyZWFtQWN0aXZpdHksXG4gIG1hcE5vZGVNZXNzYWdlVG9TdHJlYW1BY3Rpdml0eSxcbiAgcmVzb2x2ZUhpdGxOb2RlU3RyZWFtQWN0aXZpdHksXG4gIHJlc29sdmVJbml0aWFsSGl0bFN0cmVhbUFjdGl2aXR5LFxuICByZXNvbHZlU3RyZWFtTG9hZGluZ0Rpc3BsYXksXG4gIHJlc29sdmVUb29sQWN0aW9uTGFiZWwsXG4gIHJlc29sdmVUb29sU3RlcFBhc3RMYWJlbCxcbiAgc3RyZWFtaW5nUGxhY2Vob2xkZXJNZXNzYWdlSWQsXG59IGZyb20gJy4vc3RyZWFtQWN0aXZpdHlNZXNzYWdlcydcblxuY29uc3QgdCA9IChrZXk6IHN0cmluZykgPT4ga2V5XG5cbmRlc2NyaWJlKCdzdHJlYW1BY3Rpdml0eU1lc3NhZ2VzJywgKCkgPT4ge1xuICBkZXNjcmliZSgncmVzb2x2ZVRvb2xBY3Rpb25MYWJlbCcsICgpID0+IHtcbiAgICBpdCgnbWFwcyBrbm93biB0b29scyBhbmQgcmV0dXJucyBudWxsIGZvciB1bmtub3duIG9uZXMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZVRvb2xBY3Rpb25MYWJlbCgnY3JlYXRlX3Rhc2snLCB0LCAncHJlc2VudCcpKS50b0JlKCdjaGF0LmFjdGl2aXR5LmFjdGlvbnMuY3JlYXRlVGFzay5wcmVzZW50JylcbiAgICAgIGV4cGVjdChyZXNvbHZlVG9vbEFjdGlvbkxhYmVsKCdhc3NpZ24nLCB0LCAncGFzdCcpKS50b0JlKCdjaGF0LmFjdGl2aXR5LmFjdGlvbnMuYXNzaWduVXNlci5wYXN0JylcbiAgICAgIGV4cGVjdChyZXNvbHZlVG9vbEFjdGlvbkxhYmVsKCd1bmtub3duX3Rvb2wnLCB0LCAncHJlc2VudCcpKS50b0JlTnVsbCgpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnbWFwSGl0bFRvb2xOYW1lVG9TdHJlYW1BY3Rpdml0eScsICgpID0+IHtcbiAgICBpdCgndXNlcyB0aGUgZGljdGlvbmFyeSBvciBhIGZhbGxiYWNrJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KG1hcEhpdGxUb29sTmFtZVRvU3RyZWFtQWN0aXZpdHkoJ2VkaXRfdGFzaycsIHQpKS50b0VxdWFsKHtcbiAgICAgICAgcGhhc2U6ICdhY3Rpb24nLFxuICAgICAgICBtZXNzYWdlOiAnY2hhdC5hY3Rpdml0eS5hY3Rpb25zLmVkaXRUYXNrLnByZXNlbnQnLFxuICAgICAgfSlcbiAgICAgIGV4cGVjdChtYXBIaXRsVG9vbE5hbWVUb1N0cmVhbUFjdGl2aXR5KCd1bmtub3duX3Rvb2wnLCB0LCB7IHVzZVJlc3VtaW5nRmFsbGJhY2s6IHRydWUgfSkpLnRvRXF1YWwoe1xuICAgICAgICBwaGFzZTogJ2FjdGlvbicsXG4gICAgICAgIG1lc3NhZ2U6ICdjaGF0LmFjdGl2aXR5LnJlc3VtaW5nQWN0aW9uJyxcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnbWFwTm9kZU1lc3NhZ2VUb1N0cmVhbUFjdGl2aXR5JywgKCkgPT4ge1xuICAgIGl0KCdtYXBzIGZpbGUgZ2VuZXJhdGlvbiBhbmQgd2ViIHNlYXJjaCBwaHJhc2VzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KG1hcE5vZGVNZXNzYWdlVG9TdHJlYW1BY3Rpdml0eSgnR2VuZXJhdGluZyBmaWxlIG5vdycsIHQpLm1lc3NhZ2UpLnRvQmUoJ2NoYXQuYWN0aXZpdHkuZ2VuZXJhdGluZ0ZpbGUnKVxuICAgICAgZXhwZWN0KG1hcE5vZGVNZXNzYWdlVG9TdHJlYW1BY3Rpdml0eSgnc2VhcmNoaW5nIHRoZSB3ZWInLCB0KSkudG9FcXVhbCh7XG4gICAgICAgIHBoYXNlOiAnc2VhcmNoJyxcbiAgICAgICAgbWVzc2FnZTogJ2NoYXQuYWN0aXZpdHkuc2VhcmNoLnNjYW5uaW5nJyxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdrZWVwcyBhIHJlYWRhYmxlIG5vZGUgbWVzc2FnZSBhbmQgaGlkZXMgcmF3IHRvb2wgbmFtZXMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QobWFwTm9kZU1lc3NhZ2VUb1N0cmVhbUFjdGl2aXR5KCdSZXZpc2FuZG8gZWwgcHJveWVjdG8nLCB0KSkudG9FcXVhbCh7XG4gICAgICAgIHBoYXNlOiAnYWN0aW9uJyxcbiAgICAgICAgbWVzc2FnZTogJ1JldmlzYW5kbyBlbCBwcm95ZWN0bycsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KG1hcE5vZGVNZXNzYWdlVG9TdHJlYW1BY3Rpdml0eSgnZm9vX2Jhcl91bmtub3duJywgdCkubWVzc2FnZSkudG9CZSgnY2hhdC5leGVjdXRpbmdBY3Rpb24nKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2FjdGl2aXR5IHJvdGF0aW9uIGFuZCBwbGFjZWhvbGRlcnMnLCAoKSA9PiB7XG4gICAgaXQoJ3JldHVybnMgdGhlIG1lc3NhZ2UgZm9yIGEgcGhhc2UgaW5kZXggYW5kIGtub3dzIHdoZW4gaXQgY2FuIGFkdmFuY2UnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZ2V0U3RyZWFtQWN0aXZpdHlNZXNzYWdlQXRJbmRleCgndGhpbmtpbmcnLCAwLCB0KSkudG9CZSgnY2hhdC5hY3Rpdml0eS50aGlua2luZy5hbmFseXppbmcnKVxuICAgICAgZXhwZWN0KGNhbkFkdmFuY2VTdHJlYW1BY3Rpdml0eU1lc3NhZ2UoJ3RoaW5raW5nJywgMCkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChjYW5BZHZhbmNlU3RyZWFtQWN0aXZpdHlNZXNzYWdlKCd0aGlua2luZycsIDIpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgncGlja3MgdGhlIGluaXRpYWwgcGhhc2UgZnJvbSBzZWFyY2gsIGF0dGFjaG1lbnRzIG9yIGdlbmVyYXRpbmcnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5KHQsIHsgaXNXZWJTZWFyY2hBY3RpdmU6IHRydWUgfSkucGhhc2UpLnRvQmUoJ3NlYXJjaCcpXG4gICAgICBleHBlY3QoZ2V0SW5pdGlhbFN0cmVhbUFjdGl2aXR5KHQsIHsgaGFzQXR0YWNobWVudHM6IHRydWUsIGF0dGFjaG1lbnRzQ291bnQ6IDIgfSkucGhhc2UpLnRvQmUoJ2F0dGFjaG1lbnQnKVxuICAgICAgZXhwZWN0KGdldEluaXRpYWxTdHJlYW1BY3Rpdml0eSh0LCB7fSkpLnRvRXF1YWwoe1xuICAgICAgICBwaGFzZTogJ2dlbmVyYXRpbmcnLFxuICAgICAgICBtZXNzYWdlOiAnY2hhdC5hY3Rpdml0eS5nZW5lcmF0aW5nLmNvbnNpZGVyaW5nJyxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdidWlsZHMgYW5kIGRldGVjdHMgc3RyZWFtaW5nIHBsYWNlaG9sZGVyIGlkcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZCgnYWJjJykpLnRvQmUoJ2Fuc3dlci1hYmMtc3RyZWFtaW5nJylcbiAgICAgIGV4cGVjdChpc1N0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkKCdhbnN3ZXItYWJjLXN0cmVhbWluZycpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoaXNTdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZCgnYW5zd2VyLWFiYycpKS50b0JlKGZhbHNlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ0hJVEwgc3RyZWFtIGFjdGl2aXR5JywgKCkgPT4ge1xuICAgIGl0KCdyZXNvbHZlcyBpbml0aWFsIGFjdGl2aXR5IGZyb20gcGVuZGluZyBhY3Rpb25zJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlSW5pdGlhbEhpdGxTdHJlYW1BY3Rpdml0eSh0LCB7XG4gICAgICAgICAgcGVuZGluZ0FjdGlvbnM6IFt7IHRvb2xfbmFtZTogJ2VkaXRfdGFzaycsIHRocmVhZF9pZDogJ3QxJywgdG9vbF9jYWxsX2lkOiAnYzEnLCB0b29sX2FyZ3M6IHt9IH1dLFxuICAgICAgICB9KVxuICAgICAgKS50b0VxdWFsKHtcbiAgICAgICAgcGhhc2U6ICdhY3Rpb24nLFxuICAgICAgICBtZXNzYWdlOiAnY2hhdC5hY3Rpdml0eS5hY3Rpb25zLmVkaXRUYXNrLnByZXNlbnQnLFxuICAgICAgfSlcblxuICAgICAgZXhwZWN0KHJlc29sdmVJbml0aWFsSGl0bFN0cmVhbUFjdGl2aXR5KHQsIHt9KSkudG9FcXVhbCh7XG4gICAgICAgIHBoYXNlOiAncHJvY2Vzc2luZycsXG4gICAgICAgIG1lc3NhZ2U6ICdjaGF0LnByb2Nlc3NpbmcnLFxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3ByZWZlcnMgcmVhZGFibGUgbm9kZSBtZXNzYWdlcyB3aGVuIHRvb2xzIGFyZSBkZXRlY3RlZCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUhpdGxOb2RlU3RyZWFtQWN0aXZpdHkoJ1JldmlzYW5kbyBkYXRvcycsIHQsIHtcbiAgICAgICAgICBwZW5kaW5nQWN0aW9uczogW3sgdG9vbF9uYW1lOiAnZWRpdF90YXNrJywgdGhyZWFkX2lkOiAndDEnLCB0b29sX2NhbGxfaWQ6ICdjMScsIHRvb2xfYXJnczoge30gfV0sXG4gICAgICAgIH0pXG4gICAgICApLnRvRXF1YWwoeyBwaGFzZTogJ2FjdGlvbicsIG1lc3NhZ2U6ICdSZXZpc2FuZG8gZGF0b3MnIH0pXG4gICAgfSlcblxuICAgIGl0KCdtYXBzIHRvb2wgbmFtZXMgd2hlbiB0aGUgbm9kZSBtZXNzYWdlIGlzIHJhdycsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUhpdGxOb2RlU3RyZWFtQWN0aXZpdHkoJ2VkaXRfdGFzaycsIHQsIHtcbiAgICAgICAgICBwZW5kaW5nQWN0aW9uczogW3sgdG9vbF9uYW1lOiAnZWRpdF90YXNrJywgdGhyZWFkX2lkOiAndDEnLCB0b29sX2NhbGxfaWQ6ICdjMScsIHRvb2xfYXJnczoge30gfV0sXG4gICAgICAgIH0pXG4gICAgICApLnRvRXF1YWwoe1xuICAgICAgICBwaGFzZTogJ2FjdGlvbicsXG4gICAgICAgIG1lc3NhZ2U6ICdjaGF0LmFjdGl2aXR5LmFjdGlvbnMuZWRpdFRhc2sucHJlc2VudCcsXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ3JvdGF0aW9uIGhlbHBlcnMnLCAoKSA9PiB7XG4gICAgaXQoJ2V4cG9zZXMgdGhpbmtpbmcgYW5kIGdlbmVyYXRpbmcgbG9hZGVycyBhbmQgYWR2YW5jZXMgaW5kaWNlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChnZXRUaGlua2luZ0xvYWRpbmdNZXNzYWdlKDEsIHQpKS50b0JlKCdjaGF0LmFjdGl2aXR5LnRoaW5raW5nLnJldmlld2luZycpXG4gICAgICBleHBlY3QoZ2V0R2VuZXJhdGluZ0xvYWRpbmdNZXNzYWdlKDAsIHQpKS50b0JlKCdjaGF0LmFjdGl2aXR5LmdlbmVyYXRpbmcuY29uc2lkZXJpbmcnKVxuICAgICAgZXhwZWN0KGNhblJvdGF0ZVN0cmVhbUFjdGl2aXR5UGhhc2UoJ3RoaW5raW5nJykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChjYW5Sb3RhdGVTdHJlYW1BY3Rpdml0eVBoYXNlKCd3cml0aW5nJykpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3QoZ2V0V3JpdGluZ1N0cmVhbUFjdGl2aXR5KHQpKS50b0VxdWFsKHtcbiAgICAgICAgcGhhc2U6ICd3cml0aW5nJyxcbiAgICAgICAgbWVzc2FnZTogJ2NoYXQuYWN0aXZpdHkud3JpdGluZy5sYWJlbCcsXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBhZHZhbmNlZCA9IGFkdmFuY2VTdHJlYW1BY3Rpdml0eU1lc3NhZ2UoeyBwaGFzZTogJ3RoaW5raW5nJywgbWVzc2FnZTogJ2EnIH0sIDAsIHQpXG4gICAgICBleHBlY3QoYWR2YW5jZWQ/Lm5leHRJbmRleCkudG9CZSgxKVxuICAgICAgZXhwZWN0KGFkdmFuY2VkPy5hY3Rpdml0eS5tZXNzYWdlKS50b0JlKCdjaGF0LmFjdGl2aXR5LnRoaW5raW5nLnJldmlld2luZycpXG4gICAgfSlcblxuICAgIGl0KCdyZXR1cm5zIHBhc3QgdGVuc2UgbGFiZWxzIGZvciBrbm93biB0b29scycsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlVG9vbFN0ZXBQYXN0TGFiZWwoJ2NyZWF0ZV90YXNrJywgdCkpLnRvQmUoJ2NoYXQuYWN0aXZpdHkuYWN0aW9ucy5jcmVhdGVUYXNrLnBhc3QnKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ3Jlc29sdmVTdHJlYW1Mb2FkaW5nRGlzcGxheScsICgpID0+IHtcbiAgICBjb25zdCBiYXNlID0ge1xuICAgICAgc3RyZWFtQWN0aXZpdHk6IG51bGwsXG4gICAgICBsb2FkaW5nTWVzc2FnZTogbnVsbCxcbiAgICAgIGFjdGl2ZUxvYWRpbmdzOiB7fSxcbiAgICAgIHdhaXRpbmdSZXNwb25zZTogZmFsc2UsXG4gICAgICBpc1dlYlNlYXJjaEFjdGl2ZTogZmFsc2UsXG4gICAgICBpc0RlZXBTZWFyY2hBY3RpdmU6IGZhbHNlLFxuICAgICAgaGFzQXR0YWNobWVudHM6IGZhbHNlLFxuICAgICAgdCxcbiAgICB9XG5cbiAgICBpdCgncHJlZmVycyBhbiBleHBsaWNpdCBzdHJlYW0gYWN0aXZpdHkgYmVmb3JlIHRoZSBmaXJzdCB0b2tlbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHN0cmVhbUFjdGl2aXR5ID0geyBwaGFzZTogJ2FjdGlvbicgYXMgY29uc3QsIG1lc3NhZ2U6ICdDcmVhbmRvIHRhcmVhJyB9XG4gICAgICBleHBlY3QocmVzb2x2ZVN0cmVhbUxvYWRpbmdEaXNwbGF5KHsgLi4uYmFzZSwgc3RyZWFtQWN0aXZpdHkgfSkpLnRvRXF1YWwoc3RyZWFtQWN0aXZpdHkpXG4gICAgfSlcblxuICAgIGl0KCdyZXR1cm5zIHRoZSBpbml0aWFsIGdlbmVyYXRpbmcgYWN0aXZpdHkgd2hpbGUgd2FpdGluZycsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlU3RyZWFtTG9hZGluZ0Rpc3BsYXkoeyAuLi5iYXNlLCB3YWl0aW5nUmVzcG9uc2U6IHRydWUgfSkpLnRvRXF1YWwoe1xuICAgICAgICBwaGFzZTogJ2dlbmVyYXRpbmcnLFxuICAgICAgICBtZXNzYWdlOiAnY2hhdC5hY3Rpdml0eS5nZW5lcmF0aW5nLmNvbnNpZGVyaW5nJyxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdtYXBzIGFjdGl2ZSBsb2FkaW5ncyBhbmQgbG9hZGluZyBtZXNzYWdlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZVN0cmVhbUxvYWRpbmdEaXNwbGF5KHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIGFjdGl2ZUxvYWRpbmdzOiB7IG5vZGU6ICdSZXZpc2FuZG8gcHJveWVjdG8nIH0sXG4gICAgICAgIH0pXG4gICAgICApLnRvRXF1YWwoeyBwaGFzZTogJ2FjdGlvbicsIG1lc3NhZ2U6ICdSZXZpc2FuZG8gcHJveWVjdG8nIH0pXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZVN0cmVhbUxvYWRpbmdEaXNwbGF5KHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIGFjdGl2ZUxvYWRpbmdzOiB7IG5vZGU6ICdjaGF0LnByb2Nlc3NpbmcnIH0sXG4gICAgICAgIH0pXG4gICAgICApLnRvRXF1YWwoeyBwaGFzZTogJ3Byb2Nlc3NpbmcnLCBtZXNzYWdlOiAnY2hhdC5wcm9jZXNzaW5nJyB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVTdHJlYW1Mb2FkaW5nRGlzcGxheSh7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBsb2FkaW5nTWVzc2FnZTogJ2NoYXQud3JpdGluZycsXG4gICAgICAgIH0pXG4gICAgICApLnRvRXF1YWwoeyBwaGFzZTogJ3dyaXRpbmcnLCBtZXNzYWdlOiAnY2hhdC5hY3Rpdml0eS53cml0aW5nLmxhYmVsJyB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVTdHJlYW1Mb2FkaW5nRGlzcGxheSh7XG4gICAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgICBsb2FkaW5nTWVzc2FnZTogJ2NoYXQuZ2VuZXJhdGluZ1dlYlNlYXJjaCcsXG4gICAgICAgIH0pXG4gICAgICApLnRvRXF1YWwoeyBwaGFzZTogJ3NlYXJjaCcsIG1lc3NhZ2U6ICdjaGF0LmFjdGl2aXR5LnNlYXJjaC5zY2FubmluZycgfSlcbiAgICB9KVxuXG4gICAgaXQoJ2tlZXBzIHdyaXRpbmcgd2hlbiB0aGUgc3RyZWFtIGlzIGNvbXBvc2luZycsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZVN0cmVhbUxvYWRpbmdEaXNwbGF5KHtcbiAgICAgICAgICAuLi5iYXNlLFxuICAgICAgICAgIHN0cmVhbUFjdGl2aXR5OiBnZXRXcml0aW5nU3RyZWFtQWN0aXZpdHkodCksXG4gICAgICAgIH0pXG4gICAgICApLnRvRXF1YWwoZ2V0V3JpdGluZ1N0cmVhbUFjdGl2aXR5KHQpKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ3RoaW5raW5nIGFuZCB3cml0aW5nIGluZGljYXRvcicsICgpID0+IHtcbiAgICBpdCgnZXhwb3NlcyB0aGlua2luZyBhbmQgd3JpdGluZyBsYWJlbHMgZm9yIHRoZSBsaXZlIGluZGljYXRvciBhZnRlciB0aGUgZmlyc3Qgc3RyZWFtIGV2ZW50JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGdldFRoaW5raW5nU3RyZWFtQWN0aXZpdHkodCkpLnRvRXF1YWwoe1xuICAgICAgICBwaGFzZTogJ3RoaW5raW5nJyxcbiAgICAgICAgbWVzc2FnZTogJ2NoYXQuYWN0aXZpdHkudGhpbmtpbmcubGFiZWwnLFxuICAgICAgfSlcbiAgICAgIGV4cGVjdChnZXRXcml0aW5nU3RyZWFtQWN0aXZpdHkodCkpLnRvRXF1YWwoe1xuICAgICAgICBwaGFzZTogJ3dyaXRpbmcnLFxuICAgICAgICBtZXNzYWdlOiAnY2hhdC5hY3Rpdml0eS53cml0aW5nLmxhYmVsJyxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGl0KCdyZXN1bWVzIEhJVEwgd2l0aCB0aGUgcGVuZGluZyB0b29sIGxhYmVsIGJlZm9yZSB0aGUgZmlyc3QgdG9rZW4nLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVJbml0aWFsSGl0bFN0cmVhbUFjdGl2aXR5KHQsIHtcbiAgICAgICAgICBwZW5kaW5nQWN0aW9uczogW3sgdG9vbF9uYW1lOiAnY3JlYXRlX3Rhc2snLCB0b29sX2NhbGxfaWQ6ICcxJywgdG9vbF9hcmdzOiB7fSwgdGhyZWFkX2lkOiAndDEnIH1dLFxuICAgICAgICB9KVxuICAgICAgKS50b0VxdWFsKHtcbiAgICAgICAgcGhhc2U6ICdhY3Rpb24nLFxuICAgICAgICBtZXNzYWdlOiAnY2hhdC5hY3Rpdml0eS5hY3Rpb25zLmNyZWF0ZVRhc2sucHJlc2VudCcsXG4gICAgICB9KVxuICAgIH0pXG4gIH0pXG59KVxuIl0sIm1hcHBpbmdzIjoiOzs7QUFBQSxTQUNFQSw0QkFBNEIsRUFDNUJDLCtCQUErQixFQUMvQkMsNEJBQTRCLEVBQzVCQywyQkFBMkIsRUFDM0JDLHdCQUF3QixFQUN4QkMsK0JBQStCLEVBQy9CQyx5QkFBeUIsRUFDekJDLHlCQUF5QixFQUN6QkMsd0JBQXdCLEVBQ3hCQywrQkFBK0IsRUFDL0JDLCtCQUErQixFQUMvQkMsOEJBQThCLEVBQzlCQyw2QkFBNkIsRUFDN0JDLGdDQUFnQyxFQUNoQ0MsMkJBQTJCLEVBQzNCQyxzQkFBc0IsRUFDdEJDLHdCQUF3QixFQUN4QkMsNkJBQTZCLFFBQ3hCLDBCQUEwQjtBQUVqQyxJQUFNQyxDQUFDLEdBQUcsU0FBSkEsQ0FBQ0EsQ0FBSUMsR0FBVztFQUFBLE9BQUtBLEdBQUc7QUFBQTtBQUU5QkMsUUFBUSxDQUFDLHdCQUF3QixFQUFFLFlBQU07RUFDdkNBLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxZQUFNO0lBQ3ZDQyxFQUFFLENBQUMsb0RBQW9ELEVBQUUsWUFBTTtNQUM3REMsTUFBTSxDQUFDUCxzQkFBc0IsQ0FBQyxhQUFhLEVBQUVHLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDSyxJQUFJLENBQUMsMENBQTBDLENBQUM7TUFDNUdELE1BQU0sQ0FBQ1Asc0JBQXNCLENBQUMsUUFBUSxFQUFFRyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQ0ssSUFBSSxDQUFDLHVDQUF1QyxDQUFDO01BQ2pHRCxNQUFNLENBQUNQLHNCQUFzQixDQUFDLGNBQWMsRUFBRUcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUNNLFFBQVEsQ0FBQyxDQUFDO0lBQ3pFLENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztFQUVGSixRQUFRLENBQUMsaUNBQWlDLEVBQUUsWUFBTTtJQUNoREMsRUFBRSxDQUFDLG1DQUFtQyxFQUFFLFlBQU07TUFDNUNDLE1BQU0sQ0FBQ1osK0JBQStCLENBQUMsV0FBVyxFQUFFUSxDQUFDLENBQUMsQ0FBQyxDQUFDTyxPQUFPLENBQUM7UUFDOURDLEtBQUssRUFBRSxRQUFRO1FBQ2ZDLE9BQU8sRUFBRTtNQUNYLENBQUMsQ0FBQztNQUNGTCxNQUFNLENBQUNaLCtCQUErQixDQUFDLGNBQWMsRUFBRVEsQ0FBQyxFQUFFO1FBQUVVLG1CQUFtQixFQUFFO01BQUssQ0FBQyxDQUFDLENBQUMsQ0FBQ0gsT0FBTyxDQUFDO1FBQ2hHQyxLQUFLLEVBQUUsUUFBUTtRQUNmQyxPQUFPLEVBQUU7TUFDWCxDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRlAsUUFBUSxDQUFDLGdDQUFnQyxFQUFFLFlBQU07SUFDL0NDLEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRSxZQUFNO01BQ3REQyxNQUFNLENBQUNYLDhCQUE4QixDQUFDLHFCQUFxQixFQUFFTyxDQUFDLENBQUMsQ0FBQ1MsT0FBTyxDQUFDLENBQUNKLElBQUksQ0FBQyw4QkFBOEIsQ0FBQztNQUM3R0QsTUFBTSxDQUFDWCw4QkFBOEIsQ0FBQyxtQkFBbUIsRUFBRU8sQ0FBQyxDQUFDLENBQUMsQ0FBQ08sT0FBTyxDQUFDO1FBQ3JFQyxLQUFLLEVBQUUsUUFBUTtRQUNmQyxPQUFPLEVBQUU7TUFDWCxDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRk4sRUFBRSxDQUFDLHdEQUF3RCxFQUFFLFlBQU07TUFDakVDLE1BQU0sQ0FBQ1gsOEJBQThCLENBQUMsdUJBQXVCLEVBQUVPLENBQUMsQ0FBQyxDQUFDLENBQUNPLE9BQU8sQ0FBQztRQUN6RUMsS0FBSyxFQUFFLFFBQVE7UUFDZkMsT0FBTyxFQUFFO01BQ1gsQ0FBQyxDQUFDO01BQ0ZMLE1BQU0sQ0FBQ1gsOEJBQThCLENBQUMsaUJBQWlCLEVBQUVPLENBQUMsQ0FBQyxDQUFDUyxPQUFPLENBQUMsQ0FBQ0osSUFBSSxDQUFDLHNCQUFzQixDQUFDO0lBQ25HLENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztFQUVGSCxRQUFRLENBQUMsb0NBQW9DLEVBQUUsWUFBTTtJQUNuREMsRUFBRSxDQUFDLHFFQUFxRSxFQUFFLFlBQU07TUFDOUVDLE1BQU0sQ0FBQ2pCLCtCQUErQixDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUVhLENBQUMsQ0FBQyxDQUFDLENBQUNLLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQztNQUNsR0QsTUFBTSxDQUFDckIsK0JBQStCLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUNzQixJQUFJLENBQUMsSUFBSSxDQUFDO01BQ2pFRCxNQUFNLENBQUNyQiwrQkFBK0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQ3NCLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEUsQ0FBQyxDQUFDO0lBRUZGLEVBQUUsQ0FBQyxnRUFBZ0UsRUFBRSxZQUFNO01BQ3pFQyxNQUFNLENBQUNsQix3QkFBd0IsQ0FBQ2MsQ0FBQyxFQUFFO1FBQUVXLGlCQUFpQixFQUFFO01BQUssQ0FBQyxDQUFDLENBQUNILEtBQUssQ0FBQyxDQUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDO01BQ3JGRCxNQUFNLENBQUNsQix3QkFBd0IsQ0FBQ2MsQ0FBQyxFQUFFO1FBQUVZLGNBQWMsRUFBRSxJQUFJO1FBQUVDLGdCQUFnQixFQUFFO01BQUUsQ0FBQyxDQUFDLENBQUNMLEtBQUssQ0FBQyxDQUFDSCxJQUFJLENBQUMsWUFBWSxDQUFDO01BQzNHRCxNQUFNLENBQUNsQix3QkFBd0IsQ0FBQ2MsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQ08sT0FBTyxDQUFDO1FBQzlDQyxLQUFLLEVBQUUsWUFBWTtRQUNuQkMsT0FBTyxFQUFFO01BQ1gsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0lBRUZOLEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxZQUFNO01BQ3ZEQyxNQUFNLENBQUNMLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUNNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztNQUN6RUQsTUFBTSxDQUFDYiwrQkFBK0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUNjLElBQUksQ0FBQyxJQUFJLENBQUM7TUFDMUVELE1BQU0sQ0FBQ2IsK0JBQStCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQ2MsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNuRSxDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRkgsUUFBUSxDQUFDLHNCQUFzQixFQUFFLFlBQU07SUFDckNDLEVBQUUsQ0FBQyxnREFBZ0QsRUFBRSxZQUFNO01BQ3pEQyxNQUFNLENBQ0pULGdDQUFnQyxDQUFDSyxDQUFDLEVBQUU7UUFDbENjLGNBQWMsRUFBRSxDQUFDO1VBQUVDLFNBQVMsRUFBRSxXQUFXO1VBQUVDLFNBQVMsRUFBRSxJQUFJO1VBQUVDLFlBQVksRUFBRSxJQUFJO1VBQUVDLFNBQVMsRUFBRSxDQUFDO1FBQUUsQ0FBQztNQUNqRyxDQUFDLENBQ0gsQ0FBQyxDQUFDWCxPQUFPLENBQUM7UUFDUkMsS0FBSyxFQUFFLFFBQVE7UUFDZkMsT0FBTyxFQUFFO01BQ1gsQ0FBQyxDQUFDO01BRUZMLE1BQU0sQ0FBQ1QsZ0NBQWdDLENBQUNLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUNPLE9BQU8sQ0FBQztRQUN0REMsS0FBSyxFQUFFLFlBQVk7UUFDbkJDLE9BQU8sRUFBRTtNQUNYLENBQUMsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGTixFQUFFLENBQUMsd0RBQXdELEVBQUUsWUFBTTtNQUNqRUMsTUFBTSxDQUNKViw2QkFBNkIsQ0FBQyxpQkFBaUIsRUFBRU0sQ0FBQyxFQUFFO1FBQ2xEYyxjQUFjLEVBQUUsQ0FBQztVQUFFQyxTQUFTLEVBQUUsV0FBVztVQUFFQyxTQUFTLEVBQUUsSUFBSTtVQUFFQyxZQUFZLEVBQUUsSUFBSTtVQUFFQyxTQUFTLEVBQUUsQ0FBQztRQUFFLENBQUM7TUFDakcsQ0FBQyxDQUNILENBQUMsQ0FBQ1gsT0FBTyxDQUFDO1FBQUVDLEtBQUssRUFBRSxRQUFRO1FBQUVDLE9BQU8sRUFBRTtNQUFrQixDQUFDLENBQUM7SUFDNUQsQ0FBQyxDQUFDO0lBRUZOLEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxZQUFNO01BQ3ZEQyxNQUFNLENBQ0pWLDZCQUE2QixDQUFDLFdBQVcsRUFBRU0sQ0FBQyxFQUFFO1FBQzVDYyxjQUFjLEVBQUUsQ0FBQztVQUFFQyxTQUFTLEVBQUUsV0FBVztVQUFFQyxTQUFTLEVBQUUsSUFBSTtVQUFFQyxZQUFZLEVBQUUsSUFBSTtVQUFFQyxTQUFTLEVBQUUsQ0FBQztRQUFFLENBQUM7TUFDakcsQ0FBQyxDQUNILENBQUMsQ0FBQ1gsT0FBTyxDQUFDO1FBQ1JDLEtBQUssRUFBRSxRQUFRO1FBQ2ZDLE9BQU8sRUFBRTtNQUNYLENBQUMsQ0FBQztJQUNKLENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztFQUVGUCxRQUFRLENBQUMsa0JBQWtCLEVBQUUsWUFBTTtJQUNqQ0MsRUFBRSxDQUFDLDhEQUE4RCxFQUFFLFlBQU07TUFDdkVDLE1BQU0sQ0FBQ2hCLHlCQUF5QixDQUFDLENBQUMsRUFBRVksQ0FBQyxDQUFDLENBQUMsQ0FBQ0ssSUFBSSxDQUFDLGtDQUFrQyxDQUFDO01BQ2hGRCxNQUFNLENBQUNuQiwyQkFBMkIsQ0FBQyxDQUFDLEVBQUVlLENBQUMsQ0FBQyxDQUFDLENBQUNLLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQztNQUN0RkQsTUFBTSxDQUFDcEIsNEJBQTRCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQ3FCLElBQUksQ0FBQyxJQUFJLENBQUM7TUFDM0RELE1BQU0sQ0FBQ3BCLDRCQUE0QixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUNxQixJQUFJLENBQUMsS0FBSyxDQUFDO01BQzNERCxNQUFNLENBQUNkLHdCQUF3QixDQUFDVSxDQUFDLENBQUMsQ0FBQyxDQUFDTyxPQUFPLENBQUM7UUFDMUNDLEtBQUssRUFBRSxTQUFTO1FBQ2hCQyxPQUFPLEVBQUU7TUFDWCxDQUFDLENBQUM7TUFFRixJQUFNVSxRQUFRLEdBQUdyQyw0QkFBNEIsQ0FBQztRQUFFMEIsS0FBSyxFQUFFLFVBQVU7UUFBRUMsT0FBTyxFQUFFO01BQUksQ0FBQyxFQUFFLENBQUMsRUFBRVQsQ0FBQyxDQUFDO01BQ3hGSSxNQUFNLENBQUNlLFFBQVEsYUFBUkEsUUFBUSx1QkFBUkEsUUFBUSxDQUFFQyxTQUFTLENBQUMsQ0FBQ2YsSUFBSSxDQUFDLENBQUMsQ0FBQztNQUNuQ0QsTUFBTSxDQUFDZSxRQUFRLGFBQVJBLFFBQVEsdUJBQVJBLFFBQVEsQ0FBRUUsUUFBUSxDQUFDWixPQUFPLENBQUMsQ0FBQ0osSUFBSSxDQUFDLGtDQUFrQyxDQUFDO0lBQzdFLENBQUMsQ0FBQztJQUVGRixFQUFFLENBQUMsMkNBQTJDLEVBQUUsWUFBTTtNQUNwREMsTUFBTSxDQUFDTix3QkFBd0IsQ0FBQyxhQUFhLEVBQUVFLENBQUMsQ0FBQyxDQUFDLENBQUNLLElBQUksQ0FBQyx1Q0FBdUMsQ0FBQztJQUNsRyxDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7RUFFRkgsUUFBUSxDQUFDLDZCQUE2QixFQUFFLFlBQU07SUFDNUMsSUFBTW9CLElBQUksR0FBRztNQUNYQyxjQUFjLEVBQUUsSUFBSTtNQUNwQkMsY0FBYyxFQUFFLElBQUk7TUFDcEJDLGNBQWMsRUFBRSxDQUFDLENBQUM7TUFDbEJDLGVBQWUsRUFBRSxLQUFLO01BQ3RCZixpQkFBaUIsRUFBRSxLQUFLO01BQ3hCZ0Isa0JBQWtCLEVBQUUsS0FBSztNQUN6QmYsY0FBYyxFQUFFLEtBQUs7TUFDckJaLENBQUMsRUFBREE7SUFDRixDQUFDO0lBRURHLEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxZQUFNO01BQ3JFLElBQU1vQixjQUFjLEdBQUc7UUFBRWYsS0FBSyxFQUFFLFFBQWlCO1FBQUVDLE9BQU8sRUFBRTtNQUFnQixDQUFDO01BQzdFTCxNQUFNLENBQUNSLDJCQUEyQixDQUFBZ0MsYUFBQSxDQUFBQSxhQUFBLEtBQU1OLElBQUk7UUFBRUMsY0FBYyxFQUFkQTtNQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUNoQixPQUFPLENBQUNnQixjQUFjLENBQUM7SUFDMUYsQ0FBQyxDQUFDO0lBRUZwQixFQUFFLENBQUMsdURBQXVELEVBQUUsWUFBTTtNQUNoRUMsTUFBTSxDQUFDUiwyQkFBMkIsQ0FBQWdDLGFBQUEsQ0FBQUEsYUFBQSxLQUFNTixJQUFJO1FBQUVJLGVBQWUsRUFBRTtNQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUNuQixPQUFPLENBQUM7UUFDOUVDLEtBQUssRUFBRSxZQUFZO1FBQ25CQyxPQUFPLEVBQUU7TUFDWCxDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRk4sRUFBRSxDQUFDLDJDQUEyQyxFQUFFLFlBQU07TUFDcERDLE1BQU0sQ0FDSlIsMkJBQTJCLENBQUFnQyxhQUFBLENBQUFBLGFBQUEsS0FDdEJOLElBQUk7UUFDUEcsY0FBYyxFQUFFO1VBQUVJLElBQUksRUFBRTtRQUFxQjtNQUFDLEVBQy9DLENBQ0gsQ0FBQyxDQUFDdEIsT0FBTyxDQUFDO1FBQUVDLEtBQUssRUFBRSxRQUFRO1FBQUVDLE9BQU8sRUFBRTtNQUFxQixDQUFDLENBQUM7TUFFN0RMLE1BQU0sQ0FDSlIsMkJBQTJCLENBQUFnQyxhQUFBLENBQUFBLGFBQUEsS0FDdEJOLElBQUk7UUFDUEcsY0FBYyxFQUFFO1VBQUVJLElBQUksRUFBRTtRQUFrQjtNQUFDLEVBQzVDLENBQ0gsQ0FBQyxDQUFDdEIsT0FBTyxDQUFDO1FBQUVDLEtBQUssRUFBRSxZQUFZO1FBQUVDLE9BQU8sRUFBRTtNQUFrQixDQUFDLENBQUM7TUFFOURMLE1BQU0sQ0FDSlIsMkJBQTJCLENBQUFnQyxhQUFBLENBQUFBLGFBQUEsS0FDdEJOLElBQUk7UUFDUEUsY0FBYyxFQUFFO01BQWMsRUFDL0IsQ0FDSCxDQUFDLENBQUNqQixPQUFPLENBQUM7UUFBRUMsS0FBSyxFQUFFLFNBQVM7UUFBRUMsT0FBTyxFQUFFO01BQThCLENBQUMsQ0FBQztNQUV2RUwsTUFBTSxDQUNKUiwyQkFBMkIsQ0FBQWdDLGFBQUEsQ0FBQUEsYUFBQSxLQUN0Qk4sSUFBSTtRQUNQRSxjQUFjLEVBQUU7TUFBMEIsRUFDM0MsQ0FDSCxDQUFDLENBQUNqQixPQUFPLENBQUM7UUFBRUMsS0FBSyxFQUFFLFFBQVE7UUFBRUMsT0FBTyxFQUFFO01BQWdDLENBQUMsQ0FBQztJQUMxRSxDQUFDLENBQUM7SUFFRk4sRUFBRSxDQUFDLDRDQUE0QyxFQUFFLFlBQU07TUFDckRDLE1BQU0sQ0FDSlIsMkJBQTJCLENBQUFnQyxhQUFBLENBQUFBLGFBQUEsS0FDdEJOLElBQUk7UUFDUEMsY0FBYyxFQUFFakMsd0JBQXdCLENBQUNVLENBQUM7TUFBQyxFQUM1QyxDQUNILENBQUMsQ0FBQ08sT0FBTyxDQUFDakIsd0JBQXdCLENBQUNVLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQztFQUVGRSxRQUFRLENBQUMsZ0NBQWdDLEVBQUUsWUFBTTtJQUMvQ0MsRUFBRSxDQUFDLHlGQUF5RixFQUFFLFlBQU07TUFDbEdDLE1BQU0sQ0FBQ2YseUJBQXlCLENBQUNXLENBQUMsQ0FBQyxDQUFDLENBQUNPLE9BQU8sQ0FBQztRQUMzQ0MsS0FBSyxFQUFFLFVBQVU7UUFDakJDLE9BQU8sRUFBRTtNQUNYLENBQUMsQ0FBQztNQUNGTCxNQUFNLENBQUNkLHdCQUF3QixDQUFDVSxDQUFDLENBQUMsQ0FBQyxDQUFDTyxPQUFPLENBQUM7UUFDMUNDLEtBQUssRUFBRSxTQUFTO1FBQ2hCQyxPQUFPLEVBQUU7TUFDWCxDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7SUFFRk4sRUFBRSxDQUFDLGlFQUFpRSxFQUFFLFlBQU07TUFDMUVDLE1BQU0sQ0FDSlQsZ0NBQWdDLENBQUNLLENBQUMsRUFBRTtRQUNsQ2MsY0FBYyxFQUFFLENBQUM7VUFBRUMsU0FBUyxFQUFFLGFBQWE7VUFBRUUsWUFBWSxFQUFFLEdBQUc7VUFBRUMsU0FBUyxFQUFFLENBQUMsQ0FBQztVQUFFRixTQUFTLEVBQUU7UUFBSyxDQUFDO01BQ2xHLENBQUMsQ0FDSCxDQUFDLENBQUNULE9BQU8sQ0FBQztRQUNSQyxLQUFLLEVBQUUsUUFBUTtRQUNmQyxPQUFPLEVBQUU7TUFDWCxDQUFDLENBQUM7SUFDSixDQUFDLENBQUM7RUFDSixDQUFDLENBQUM7QUFDSixDQUFDLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
@@ -0,0 +1,26 @@
1
+ import { validateTrimmedFields } from './validateTrimmedFields';
2
+ describe('validateTrimmedFields', function () {
3
+ it('returns true when fields have no leading or trailing spaces', function () {
4
+ expect(validateTrimmedFields({
5
+ name: 'Maia',
6
+ title: 'Agent'
7
+ }, ['name', 'title'])).toBe(true);
8
+ });
9
+ it('returns false when a field has leading spaces', function () {
10
+ expect(validateTrimmedFields({
11
+ name: ' Maia'
12
+ }, ['name'])).toBe(false);
13
+ });
14
+ it('returns false when a field has trailing spaces', function () {
15
+ expect(validateTrimmedFields({
16
+ name: 'Maia '
17
+ }, ['name'])).toBe(false);
18
+ });
19
+ it('treats empty and missing values as valid', function () {
20
+ expect(validateTrimmedFields({
21
+ name: '',
22
+ title: undefined
23
+ }, ['name', 'title'])).toBe(true);
24
+ });
25
+ });
26
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ2YWxpZGF0ZVRyaW1tZWRGaWVsZHMiLCJkZXNjcmliZSIsIml0IiwiZXhwZWN0IiwibmFtZSIsInRpdGxlIiwidG9CZSIsInVuZGVmaW5lZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy92YWxpZGF0ZVRyaW1tZWRGaWVsZHMuc3BlYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB2YWxpZGF0ZVRyaW1tZWRGaWVsZHMgfSBmcm9tICcuL3ZhbGlkYXRlVHJpbW1lZEZpZWxkcydcblxuZGVzY3JpYmUoJ3ZhbGlkYXRlVHJpbW1lZEZpZWxkcycsICgpID0+IHtcbiAgaXQoJ3JldHVybnMgdHJ1ZSB3aGVuIGZpZWxkcyBoYXZlIG5vIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzJywgKCkgPT4ge1xuICAgIGV4cGVjdCh2YWxpZGF0ZVRyaW1tZWRGaWVsZHMoeyBuYW1lOiAnTWFpYScsIHRpdGxlOiAnQWdlbnQnIH0sIFsnbmFtZScsICd0aXRsZSddKSkudG9CZSh0cnVlKVxuICB9KVxuXG4gIGl0KCdyZXR1cm5zIGZhbHNlIHdoZW4gYSBmaWVsZCBoYXMgbGVhZGluZyBzcGFjZXMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHZhbGlkYXRlVHJpbW1lZEZpZWxkcyh7IG5hbWU6ICcgTWFpYScgfSwgWyduYW1lJ10pKS50b0JlKGZhbHNlKVxuICB9KVxuXG4gIGl0KCdyZXR1cm5zIGZhbHNlIHdoZW4gYSBmaWVsZCBoYXMgdHJhaWxpbmcgc3BhY2VzJywgKCkgPT4ge1xuICAgIGV4cGVjdCh2YWxpZGF0ZVRyaW1tZWRGaWVsZHMoeyBuYW1lOiAnTWFpYSAnIH0sIFsnbmFtZSddKSkudG9CZShmYWxzZSlcbiAgfSlcblxuICBpdCgndHJlYXRzIGVtcHR5IGFuZCBtaXNzaW5nIHZhbHVlcyBhcyB2YWxpZCcsICgpID0+IHtcbiAgICBleHBlY3QodmFsaWRhdGVUcmltbWVkRmllbGRzKHsgbmFtZTogJycsIHRpdGxlOiB1bmRlZmluZWQgfSwgWyduYW1lJywgJ3RpdGxlJ10pKS50b0JlKHRydWUpXG4gIH0pXG59KVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxxQkFBcUIsUUFBUSx5QkFBeUI7QUFFL0RDLFFBQVEsQ0FBQyx1QkFBdUIsRUFBRSxZQUFNO0VBQ3RDQyxFQUFFLENBQUMsNkRBQTZELEVBQUUsWUFBTTtJQUN0RUMsTUFBTSxDQUFDSCxxQkFBcUIsQ0FBQztNQUFFSSxJQUFJLEVBQUUsTUFBTTtNQUFFQyxLQUFLLEVBQUU7SUFBUSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDQyxJQUFJLENBQUMsSUFBSSxDQUFDO0VBQy9GLENBQUMsQ0FBQztFQUVGSixFQUFFLENBQUMsK0NBQStDLEVBQUUsWUFBTTtJQUN4REMsTUFBTSxDQUFDSCxxQkFBcUIsQ0FBQztNQUFFSSxJQUFJLEVBQUU7SUFBUSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUNFLElBQUksQ0FBQyxLQUFLLENBQUM7RUFDeEUsQ0FBQyxDQUFDO0VBRUZKLEVBQUUsQ0FBQyxnREFBZ0QsRUFBRSxZQUFNO0lBQ3pEQyxNQUFNLENBQUNILHFCQUFxQixDQUFDO01BQUVJLElBQUksRUFBRTtJQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQ0UsSUFBSSxDQUFDLEtBQUssQ0FBQztFQUN4RSxDQUFDLENBQUM7RUFFRkosRUFBRSxDQUFDLDBDQUEwQyxFQUFFLFlBQU07SUFDbkRDLE1BQU0sQ0FBQ0gscUJBQXFCLENBQUM7TUFBRUksSUFBSSxFQUFFLEVBQUU7TUFBRUMsS0FBSyxFQUFFRTtJQUFVLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUNELElBQUksQ0FBQyxJQUFJLENBQUM7RUFDN0YsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwiaWdub3JlTGlzdCI6W119
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@projectcor/maia-components",
3
- "version": "2.44.3",
3
+ "version": "2.44.5-0",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "repository": {