@projectcor/maia-components 2.28.0 → 2.30.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 (658) hide show
  1. package/lib/App.js +55 -0
  2. package/lib/components/atoms/ActionableButton.js +60 -0
  3. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.js +89 -0
  4. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.styles.js +21 -0
  5. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.js +9 -0
  6. package/lib/components/atoms/AgentActivityIndicator/index.js +2 -0
  7. package/lib/components/atoms/ApprovalBox/ApprovalBox.js +209 -0
  8. package/lib/components/atoms/ApprovalBox/ApprovalBox.styles.js +93 -0
  9. package/lib/components/atoms/ApprovalBox/index.js +2 -0
  10. package/lib/components/atoms/AttachmentCard/AttachmentCard.js +218 -0
  11. package/lib/components/atoms/AttachmentCard/AttachmentCard.styles.js +52 -0
  12. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +448 -0
  13. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.styles.js +58 -0
  14. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.js +55 -0
  15. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.styles.js +14 -0
  16. package/lib/components/atoms/AttachmentCard/index.js +4 -0
  17. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +442 -0
  18. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.styles.js +119 -0
  19. package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.js +222 -0
  20. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +313 -0
  21. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +128 -0
  22. package/lib/components/atoms/AttachmentPreviewModal/index.js +2 -0
  23. package/lib/components/atoms/Backdrop/Backdrop.js +17 -0
  24. package/lib/components/atoms/Backdrop/Backdrop.styles.js +9 -0
  25. package/lib/components/atoms/Backdrop/index.js +2 -0
  26. package/lib/components/atoms/CardItem.js +7 -0
  27. package/lib/components/atoms/CardMenu/CardMenu.js +131 -0
  28. package/lib/components/atoms/CardMenu/index.js +2 -0
  29. package/lib/components/atoms/CardMenu/styles.js +21 -0
  30. package/lib/components/atoms/ChatClientSelector/ChatClientSelector.js +77 -0
  31. package/lib/components/atoms/ChatClientSelector/index.js +2 -0
  32. package/lib/components/atoms/ChatDisclaimerMessage/ChatDisclaimerMessage.js +9 -0
  33. package/lib/components/atoms/ChatDisclaimerMessage/index.js +2 -0
  34. package/lib/components/atoms/ChatDisclaimerMessage/styles.js +6 -0
  35. package/lib/components/atoms/Checkbox/Checkbox.js +34 -0
  36. package/lib/components/atoms/Checkbox/index.js +2 -0
  37. package/lib/components/atoms/Checkbox/styles.js +39 -0
  38. package/lib/components/atoms/Chip/Chip.js +150 -0
  39. package/lib/components/atoms/Chip/index.js +2 -0
  40. package/lib/components/atoms/Chip/styles.js +43 -0
  41. package/lib/components/atoms/ChipLlm/ChipLlm.js +45 -0
  42. package/lib/components/atoms/ChipLlm/ChipLlm.style.js +21 -0
  43. package/lib/components/atoms/ChipLlm/index.js +2 -0
  44. package/lib/components/atoms/ChipStatus/ChipStatus.interface.js +2 -0
  45. package/lib/components/atoms/ChipStatus/ChipStatus.js +14 -0
  46. package/lib/components/atoms/ChipStatus/ChipStatus.styles.js +27 -0
  47. package/lib/components/atoms/ChipStatus/index.js +2 -0
  48. package/lib/components/atoms/ClearButton.js +6 -0
  49. package/lib/components/atoms/ClientSelector/ClientSelector.js +146 -0
  50. package/lib/components/atoms/ClientSelector/ClientSelector.styles.js +15 -0
  51. package/lib/components/atoms/ClientSelector/index.js +2 -0
  52. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.js +38 -0
  53. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.styles.js +188 -0
  54. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.js +39 -0
  55. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +434 -0
  56. package/lib/components/atoms/ContextMentionChip/index.js +4 -0
  57. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +411 -0
  58. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.styles.js +10 -0
  59. package/lib/components/atoms/ContextMentionEditor/index.js +2 -0
  60. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +309 -0
  61. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +157 -0
  62. package/lib/components/atoms/ContextMentionItem/index.js +2 -0
  63. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +307 -0
  64. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.styles.js +108 -0
  65. package/lib/components/atoms/ContextMentionPopover/index.js +3 -0
  66. package/lib/components/atoms/CopyToClipboard.js +70 -0
  67. package/lib/components/atoms/EditableLabel/EditableLabel.js +110 -0
  68. package/lib/components/atoms/EditableLabel/index.js +2 -0
  69. package/lib/components/atoms/EditableLabel/styles.js +7 -0
  70. package/lib/components/atoms/EmptySearchClients/EmptySearchClients.js +22 -0
  71. package/lib/components/atoms/EmptySearchClients/EmptySearchClients.styles.js +18 -0
  72. package/lib/components/atoms/EmptySearchClients/index.js +2 -0
  73. package/lib/components/atoms/EmptySearchProjects/EmptySearchProjects.js +19 -0
  74. package/lib/components/atoms/EmptySearchProjects/EmptySearchProjects.styles.js +15 -0
  75. package/lib/components/atoms/EmptySearchProjects/index.js +2 -0
  76. package/lib/components/atoms/EntitySelector/EntitySelector.js +247 -0
  77. package/lib/components/atoms/EntitySelector/EntitySelector.skeleton.js +38 -0
  78. package/lib/components/atoms/EntitySelector/EntitySelector.styles.js +67 -0
  79. package/lib/components/atoms/EntitySelector/index.js +2 -0
  80. package/lib/components/atoms/ErrorSearchClients/ErrorSearchClients.js +14 -0
  81. package/lib/components/atoms/ErrorSearchClients/ErrorSearchClients.styles.js +15 -0
  82. package/lib/components/atoms/ErrorSearchFaqs/ErrorSearchFaqs.js +14 -0
  83. package/lib/components/atoms/ErrorSearchFaqs/ErrorSearchFaqs.style.js +15 -0
  84. package/lib/components/atoms/ErrorSearchFaqs/index.js +2 -0
  85. package/lib/components/atoms/ErrorSearchProjects/ErrorSearchProjects.js +18 -0
  86. package/lib/components/atoms/ErrorSearchProjects/ErrorSearchProjects.style.js +15 -0
  87. package/lib/components/atoms/ErrorSearchProjects/index.js +2 -0
  88. package/lib/components/atoms/Expand/Expand.js +32 -0
  89. package/lib/components/atoms/Expand/index.js +2 -0
  90. package/lib/components/atoms/Fade/Fade.js +56 -0
  91. package/lib/components/atoms/Fade/index.js +2 -0
  92. package/lib/components/atoms/FeedbackButton/FeedbackButton.js +59 -0
  93. package/lib/components/atoms/FeedbackButton/FeedbackButton.styles.js +14 -0
  94. package/lib/components/atoms/FeedbackButton/index.js +2 -0
  95. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.js +138 -0
  96. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.skeleton.js +44 -0
  97. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.styles.js +43 -0
  98. package/lib/components/atoms/FrequentlyAskedQuestions/index.js +2 -0
  99. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +122 -0
  100. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.skeleton.js +43 -0
  101. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +62 -0
  102. package/lib/components/atoms/FrequentlyUsedActions/index.js +2 -0
  103. package/lib/components/atoms/GoBackButton.js +24 -0
  104. package/lib/components/atoms/HelpButton.js +44 -0
  105. package/lib/components/atoms/IconButton.js +56 -0
  106. package/lib/components/atoms/ImagePreview/ImagePreview.js +96 -0
  107. package/lib/components/atoms/ImagePreview/ImagePreview.styles.js +70 -0
  108. package/lib/components/atoms/Input/CustomInput.interface.js +2 -0
  109. package/lib/components/atoms/Input/CustomInput.js +91 -0
  110. package/lib/components/atoms/Input/CustomInput.styles.js +39 -0
  111. package/lib/components/atoms/Input/index.js +2 -0
  112. package/lib/components/atoms/ListMenuOption/ListMenuOption.js +41 -0
  113. package/lib/components/atoms/ListMenuOption/index.js +2 -0
  114. package/lib/components/atoms/ListMenuOption/styles.js +9 -0
  115. package/lib/components/atoms/Loader.js +41 -0
  116. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.js +11 -0
  117. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.style.js +6 -0
  118. package/lib/components/atoms/LoadingFaqs/index.js +2 -0
  119. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.js +11 -0
  120. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.styles.js +6 -0
  121. package/lib/components/atoms/LoadingSearchClients/index.js +2 -0
  122. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.js +14 -0
  123. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.style.js +10 -0
  124. package/lib/components/atoms/LoadingSearchProjects/index.js +2 -0
  125. package/lib/components/atoms/LoadingText/LoadingText.js +18 -0
  126. package/lib/components/atoms/LoadingText/index.js +2 -0
  127. package/lib/components/atoms/LoadingText/styles.js +7 -0
  128. package/lib/components/atoms/MAIAButton/MAIAButton.js +33 -0
  129. package/lib/components/atoms/MAIAButton/index.js +2 -0
  130. package/lib/components/atoms/MAIAError/MAIAError.js +15 -0
  131. package/lib/components/atoms/MAIAError/index.js +2 -0
  132. package/lib/components/atoms/MAIAInput/MAIAInput.js +1058 -0
  133. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +266 -0
  134. package/lib/components/atoms/MAIAInput/index.js +2 -0
  135. package/lib/components/atoms/MAIAInput/maiaInputLayout.js +25 -0
  136. package/lib/components/atoms/MAIAInput/styles.js +182 -0
  137. package/lib/components/atoms/MAIAMessage/MAIAMessage.interfaces.js +2 -0
  138. package/lib/components/atoms/MAIAMessage/MAIAMessage.js +22 -0
  139. package/lib/components/atoms/MAIAMessage/index.js +2 -0
  140. package/lib/components/atoms/MAIAMessage/styles.js +7 -0
  141. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.config.js +23 -0
  142. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.interfaces.js +2 -0
  143. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.js +51 -0
  144. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.styles.js +26 -0
  145. package/lib/components/atoms/MaiaStreamdown/index.js +2 -0
  146. package/lib/components/atoms/MaiaWrapper/MaiaWrapper.js +18 -0
  147. package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.js +84 -0
  148. package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.js +15 -0
  149. package/lib/components/atoms/MaiaWrapper/index.js +3 -0
  150. package/lib/components/atoms/MaiaWrapper/styles.js +21 -0
  151. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.interface.js +2 -0
  152. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.js +84 -0
  153. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.styles.js +53 -0
  154. package/lib/components/atoms/ModalClientAccess/index.js +2 -0
  155. package/lib/components/atoms/ModalInfo/ModalInfo.js +52 -0
  156. package/lib/components/atoms/ModalInfo/ModalInfoContent.js +7 -0
  157. package/lib/components/atoms/ModalInfo/index.js +3 -0
  158. package/lib/components/atoms/ModalInfo/styles.js +7 -0
  159. package/lib/components/atoms/ModalProject/ModalProject.interface.js +2 -0
  160. package/lib/components/atoms/ModalProject/ModalProject.js +112 -0
  161. package/lib/components/atoms/ModalProject/ModalProject.style.js +59 -0
  162. package/lib/components/atoms/ModalProject/index.js +2 -0
  163. package/lib/components/atoms/NextPageLoader.js +33 -0
  164. package/lib/components/atoms/OnboardingModalButton/OnboardingModal.js +28 -0
  165. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +180 -0
  166. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.styles.js +34 -0
  167. package/lib/components/atoms/OnboardingModalButton/index.js +3 -0
  168. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.js +131 -0
  169. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.styles.js +59 -0
  170. package/lib/components/atoms/OptionAccessibility/index.js +2 -0
  171. package/lib/components/atoms/OptionCorPermission/OptionCorPermission.js +27 -0
  172. package/lib/components/atoms/OptionCorPermission/OptionCorPermission.styles.js +18 -0
  173. package/lib/components/atoms/OptionCorPermission/index.js +2 -0
  174. package/lib/components/atoms/PrimaryButton.js +31 -0
  175. package/lib/components/atoms/ProjectSelector/ProjectSelector.js +77 -0
  176. package/lib/components/atoms/ProjectSelector/ProjectSelector.styles.js +61 -0
  177. package/lib/components/atoms/ProjectSelector/index.js +2 -0
  178. package/lib/components/atoms/SecondaryButton.js +20 -0
  179. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.js +20 -0
  180. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.styles.js +20 -0
  181. package/lib/components/atoms/SessionGeneratingDot/index.js +2 -0
  182. package/lib/components/atoms/Skeleton/Skeleton.js +36 -0
  183. package/lib/components/atoms/Skeleton/index.js +2 -0
  184. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.js +16 -0
  185. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.styles.js +24 -0
  186. package/lib/components/atoms/SlashCommandChip/buildSlashChipElement.js +18 -0
  187. package/lib/components/atoms/SlashCommandChip/index.js +4 -0
  188. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +210 -0
  189. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.styles.js +53 -0
  190. package/lib/components/atoms/SlashCommandDropdown/index.js +2 -0
  191. package/lib/components/atoms/Switch/Switch.js +27 -0
  192. package/lib/components/atoms/Switch/Switch.styles.js +22 -0
  193. package/lib/components/atoms/Switch/index.js +2 -0
  194. package/lib/components/atoms/TextArea/CustomTextArea.interface.js +2 -0
  195. package/lib/components/atoms/TextArea/CustomTextArea.js +93 -0
  196. package/lib/components/atoms/TextArea/CustomTextArea.styles.js +25 -0
  197. package/lib/components/atoms/TextArea/TextArea.interfaces.js +2 -0
  198. package/lib/components/atoms/TextArea/TextArea.js +172 -0
  199. package/lib/components/atoms/TextArea/TextArea.styles.js +16 -0
  200. package/lib/components/atoms/TextArea/index.js +2 -0
  201. package/lib/components/atoms/ThirdButton.js +19 -0
  202. package/lib/components/atoms/VideoModal/VideoModal.js +76 -0
  203. package/lib/components/atoms/VideoModal/index.js +2 -0
  204. package/lib/components/atoms/WithAppCfg.js +26 -0
  205. package/lib/components/atoms/WithFeatureValidation.js +23 -0
  206. package/lib/components/atoms/WrapperCenterIcon/WrapperCenterIcon.js +9 -0
  207. package/lib/components/atoms/WrapperCenterIcon/WrapperCenterIcon.styles.js +6 -0
  208. package/lib/components/atoms/WrapperCenterIcon/index.js +2 -0
  209. package/lib/components/atoms/icons/AIIcon.js +23 -0
  210. package/lib/components/atoms/icons/AacFile.js +39 -0
  211. package/lib/components/atoms/icons/AccessibilityIcon.js +42 -0
  212. package/lib/components/atoms/icons/ActionAssignIcon.js +111 -0
  213. package/lib/components/atoms/icons/ActionCalendarIcon.js +112 -0
  214. package/lib/components/atoms/icons/ActionChargeHoursIcon.js +111 -0
  215. package/lib/components/atoms/icons/ActionChatIcon.js +71 -0
  216. package/lib/components/atoms/icons/ActionCreateIcon.js +91 -0
  217. package/lib/components/atoms/icons/ActionCreateReworkIcon.js +39 -0
  218. package/lib/components/atoms/icons/ActionCreateSubtaskIcon.js +37 -0
  219. package/lib/components/atoms/icons/ActionEditIcon.js +39 -0
  220. package/lib/components/atoms/icons/ActionSummaryMessagesIcon.js +88 -0
  221. package/lib/components/atoms/icons/ActionSummaryTaskIcon.js +37 -0
  222. package/lib/components/atoms/icons/ActionTimeBackIcon.js +112 -0
  223. package/lib/components/atoms/icons/AgentMaiaIcon.js +31 -0
  224. package/lib/components/atoms/icons/Brain.js +77 -0
  225. package/lib/components/atoms/icons/CorAccessIcon.js +41 -0
  226. package/lib/components/atoms/icons/CorLogo.js +76 -0
  227. package/lib/components/atoms/icons/CsvFile.js +41 -0
  228. package/lib/components/atoms/icons/DocFile.js +41 -0
  229. package/lib/components/atoms/icons/DocxFile.js +41 -0
  230. package/lib/components/atoms/icons/EmptyClientIllustration.js +67 -0
  231. package/lib/components/atoms/icons/EmptyHistory.js +46 -0
  232. package/lib/components/atoms/icons/EmptySearchIllustration.js +37 -0
  233. package/lib/components/atoms/icons/EmptyState.js +84 -0
  234. package/lib/components/atoms/icons/EmptyStateAgents.js +58 -0
  235. package/lib/components/atoms/icons/ErrorIcon.js +14 -0
  236. package/lib/components/atoms/icons/ErrorSearchIllustration.js +52 -0
  237. package/lib/components/atoms/icons/ErrorState.js +51 -0
  238. package/lib/components/atoms/icons/FaqChevronIcon.js +39 -0
  239. package/lib/components/atoms/icons/FaqsIcon.js +51 -0
  240. package/lib/components/atoms/icons/FlacIcon.js +39 -0
  241. package/lib/components/atoms/icons/FolderIcon.js +29 -0
  242. package/lib/components/atoms/icons/HomeIcon.js +30 -0
  243. package/lib/components/atoms/icons/ImageFile.js +46 -0
  244. package/lib/components/atoms/icons/M4aFile.js +39 -0
  245. package/lib/components/atoms/icons/MAIAIcon.js +20 -0
  246. package/lib/components/atoms/icons/MAIAIsologo.js +65 -0
  247. package/lib/components/atoms/icons/MDFile.js +41 -0
  248. package/lib/components/atoms/icons/MaiaChatLayoutFloatingIcon.js +41 -0
  249. package/lib/components/atoms/icons/MaiaChatLayoutFullscreenIcon.js +41 -0
  250. package/lib/components/atoms/icons/MaiaChatLayoutMenuIcon.js +33 -0
  251. package/lib/components/atoms/icons/MaiaChatLayoutSidebarIcon.js +41 -0
  252. package/lib/components/atoms/icons/MaiaInputAddIcon.js +42 -0
  253. package/lib/components/atoms/icons/MaiaInputAttachIcon.js +29 -0
  254. package/lib/components/atoms/icons/MaiaInputAttachmentImageIcon.js +33 -0
  255. package/lib/components/atoms/icons/MaiaInputDeepSearchIcon.js +35 -0
  256. package/lib/components/atoms/icons/MaiaInputMentionIcon.js +44 -0
  257. package/lib/components/atoms/icons/MaiaInputRobotIcon.js +29 -0
  258. package/lib/components/atoms/icons/MaiaInputSendIcon.js +29 -0
  259. package/lib/components/atoms/icons/MaiaInputSlashIcon.js +29 -0
  260. package/lib/components/atoms/icons/MaiaInputWebSearchIcon.js +35 -0
  261. package/lib/components/atoms/icons/MaiaSettingsProject.js +111 -0
  262. package/lib/components/atoms/icons/MaiaSettingsProjectV2.js +193 -0
  263. package/lib/components/atoms/icons/MaiaSparkleIcon.js +75 -0
  264. package/lib/components/atoms/icons/MaiaStoreIcon.js +31 -0
  265. package/lib/components/atoms/icons/Mp3File.js +39 -0
  266. package/lib/components/atoms/icons/Mp4File.js +39 -0
  267. package/lib/components/atoms/icons/MyAgentsNavIcon.js +51 -0
  268. package/lib/components/atoms/icons/NewChat.js +29 -0
  269. package/lib/components/atoms/icons/NotionIcon.js +36 -0
  270. package/lib/components/atoms/icons/OgaFile.js +39 -0
  271. package/lib/components/atoms/icons/OggFile.js +39 -0
  272. package/lib/components/atoms/icons/PdfFile.js +39 -0
  273. package/lib/components/atoms/icons/PptFile.js +47 -0
  274. package/lib/components/atoms/icons/PptxFile.js +49 -0
  275. package/lib/components/atoms/icons/RetryIcon.js +34 -0
  276. package/lib/components/atoms/icons/SkillIcon.js +30 -0
  277. package/lib/components/atoms/icons/SkillsNavIcon.js +27 -0
  278. package/lib/components/atoms/icons/SubtaskIcon.js +36 -0
  279. package/lib/components/atoms/icons/TaskLinkIcon.js +27 -0
  280. package/lib/components/atoms/icons/TelescopeIcon.js +60 -0
  281. package/lib/components/atoms/icons/TemplateGradientIcon.js +42 -0
  282. package/lib/components/atoms/icons/TextFile.js +41 -0
  283. package/lib/components/atoms/icons/WavFile.js +39 -0
  284. package/lib/components/atoms/icons/WebmFile.js +50 -0
  285. package/lib/components/atoms/icons/XlsFile.js +42 -0
  286. package/lib/components/atoms/icons/XlsxFile.js +42 -0
  287. package/lib/components/atoms/icons/index.js +50 -0
  288. package/lib/components/atoms/index.js +42 -0
  289. package/lib/components/index.js +11 -0
  290. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.interface.js +2 -0
  291. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +149 -0
  292. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.styles.js +53 -0
  293. package/lib/components/molecules/AbmSection/AbmGeneralSection.js +415 -0
  294. package/lib/components/molecules/AbmSection/AbmGeneralSection.styles.js +152 -0
  295. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +374 -0
  296. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.styles.js +106 -0
  297. package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +92 -0
  298. package/lib/components/molecules/AbmSection/AbmLoaderFiles.styles.js +57 -0
  299. package/lib/components/molecules/AbmSection/index.js +4 -0
  300. package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.js +52 -0
  301. package/lib/components/molecules/ChatAIClientSelector/index.js +2 -0
  302. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +117 -0
  303. package/lib/components/molecules/ChatAIContent/ChatAIContent.skeleton.js +187 -0
  304. package/lib/components/molecules/ChatAIContent/ChatAIContent.styles.js +6 -0
  305. package/lib/components/molecules/ChatAIContent/index.js +2 -0
  306. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.js +241 -0
  307. package/lib/components/molecules/ChatAIHistory/index.js +2 -0
  308. package/lib/components/molecules/ChatAIHistory/styles.js +22 -0
  309. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +649 -0
  310. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.js +115 -0
  311. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.styles.js +95 -0
  312. package/lib/components/molecules/ChatAIHome/index.js +2 -0
  313. package/lib/components/molecules/ChatAIHome/styles.js +335 -0
  314. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.js +137 -0
  315. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +853 -0
  316. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.js +47 -0
  317. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.styles.js +37 -0
  318. package/lib/components/molecules/ChatAIMessages/README.md +101 -0
  319. package/lib/components/molecules/ChatAIMessages/index.js +2 -0
  320. package/lib/components/molecules/ChatAIMessages/newStyles.js +131 -0
  321. package/lib/components/molecules/ChatAIMessages/styles.js +94 -0
  322. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +1217 -0
  323. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +58 -0
  324. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +127 -0
  325. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.styles.js +34 -0
  326. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/index.js +2 -0
  327. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +189 -0
  328. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +26 -0
  329. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/index.js +2 -0
  330. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +448 -0
  331. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.styles.js +108 -0
  332. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/index.js +2 -0
  333. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.js +48 -0
  334. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.styles.js +38 -0
  335. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/index.js +2 -0
  336. package/lib/components/molecules/ChatAIModal/constants.js +40 -0
  337. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.js +16 -0
  338. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.styles.js +12 -0
  339. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/constants.js +13 -0
  340. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/index.js +3 -0
  341. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.js +57 -0
  342. package/lib/components/molecules/ChatAIModal/index.js +2 -0
  343. package/lib/components/molecules/ChatAIModal/layout.js +74 -0
  344. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +457 -0
  345. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.styles.js +218 -0
  346. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +357 -0
  347. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.styles.js +145 -0
  348. package/lib/components/molecules/ChatAIMySkills/index.js +2 -0
  349. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.js +48 -0
  350. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.styles.js +49 -0
  351. package/lib/components/molecules/ChatAIProjectSelector/index.js +2 -0
  352. package/lib/components/molecules/ChatFooter/ChatFooter.js +337 -0
  353. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.js +32 -0
  354. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.styles.js +14 -0
  355. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +201 -0
  356. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.styles.js +51 -0
  357. package/lib/components/molecules/ChatFooter/index.js +2 -0
  358. package/lib/components/molecules/ChatFooter/styles.js +23 -0
  359. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.js +62 -0
  360. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.styles.js +6 -0
  361. package/lib/components/molecules/ContextMentionInput/index.js +2 -0
  362. package/lib/components/molecules/MessageFeedback/MessageFeedback.js +118 -0
  363. package/lib/components/molecules/MessageFeedback/index.js +2 -0
  364. package/lib/components/molecules/MessageFeedback/styles.js +14 -0
  365. package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.js +127 -0
  366. package/lib/components/molecules/ProjectSummaryChat/index.js +2 -0
  367. package/lib/components/molecules/ProjectSummaryChat/styles.js +8 -0
  368. package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.js +152 -0
  369. package/lib/components/molecules/ProjectSummaryConfig/index.js +2 -0
  370. package/lib/components/molecules/ProjectSummaryConfig/styles.js +86 -0
  371. package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.js +49 -0
  372. package/lib/components/molecules/ProjectSummaryContent/index.js +2 -0
  373. package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.js +19 -0
  374. package/lib/components/molecules/ProjectSummaryModal/index.js +2 -0
  375. package/lib/components/molecules/ProjectSummaryModal/styles.js +2 -0
  376. package/lib/components/molecules/Sidebar/Sidebar.js +715 -0
  377. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +157 -0
  378. package/lib/components/molecules/Sidebar/Sidebar.skeleton.js +48 -0
  379. package/lib/components/molecules/Sidebar/Sidebar.styles.js +75 -0
  380. package/lib/components/molecules/Sidebar/index.js +2 -0
  381. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +1420 -0
  382. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.styles.js +93 -0
  383. package/lib/components/organisms/AbmAgentModal/index.js +2 -0
  384. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.js +175 -0
  385. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.styles.js +34 -0
  386. package/lib/components/organisms/AbmSkillGenerateModal/index.js +2 -0
  387. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +432 -0
  388. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.styles.js +98 -0
  389. package/lib/components/organisms/AbmSkillModal/index.js +2 -0
  390. package/lib/components/organisms/ChatAI/ChatAI.js +167 -0
  391. package/lib/components/organisms/ChatAI/index.js +2 -0
  392. package/lib/components/organisms/ChatAI/styles.js +7 -0
  393. package/lib/components/organisms/ClientAIButton/ClientAIButton.js +23 -0
  394. package/lib/components/organisms/ClientAIButton/index.js +2 -0
  395. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.js +86 -0
  396. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.styles.js +39 -0
  397. package/lib/components/organisms/DeleteAgentModal/index.js +2 -0
  398. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.js +122 -0
  399. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.styles.js +47 -0
  400. package/lib/components/organisms/DeleteQuestionModal/index.js +2 -0
  401. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.js +138 -0
  402. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.styles.js +69 -0
  403. package/lib/components/organisms/EditQuestionModal/index.js +2 -0
  404. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.js +113 -0
  405. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.styles.js +54 -0
  406. package/lib/components/organisms/ModalFileExceeds/index.js +2 -0
  407. package/lib/components/organisms/ProjectAIButton/ProjectAIButton.js +26 -0
  408. package/lib/components/organisms/ProjectAIButton/index.js +2 -0
  409. package/lib/components/organisms/ProjectSummary/ProjectSummary.js +60 -0
  410. package/lib/components/organisms/ProjectSummary/index.js +2 -0
  411. package/lib/components/organisms/ProjectSummary/styles.js +7 -0
  412. package/lib/components/organisms/SnackBar/Snackbar.interface.js +2 -0
  413. package/lib/components/organisms/SnackBar/Snackbar.js +73 -0
  414. package/lib/components/organisms/SnackBar/Snackbar.styles.js +9 -0
  415. package/lib/components/organisms/SnackBar/index.js +2 -0
  416. package/lib/components/organisms/SourcesInformation/SourceItem.js +18 -0
  417. package/lib/components/organisms/SourcesInformation/SourceItem.styles.js +14 -0
  418. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.js +66 -0
  419. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.styles.js +27 -0
  420. package/lib/components/organisms/SourcesInformation/index.js +2 -0
  421. package/lib/constants/config.js +13 -0
  422. package/lib/constants/formatExtensions.js +55 -0
  423. package/lib/constants/gqlClient.js +4 -0
  424. package/lib/constants/maiaHourAgentAccess.js +15 -0
  425. package/lib/constants/maiaTaskPanelAccess.js +24 -0
  426. package/lib/constants/maiaTaskPanelOutsideClick.js +9 -0
  427. package/lib/constants/maiaTaskPanelZIndex.js +19 -0
  428. package/lib/constants/permissions/config.js +72 -0
  429. package/lib/constants/permissions/index.js +3 -0
  430. package/lib/constants/permissions/types.js +2 -0
  431. package/lib/constants/permissions/utils.js +18 -0
  432. package/lib/constants/plannerSyncEvents.js +15 -0
  433. package/lib/constants/taskLinkIcon.js +15 -0
  434. package/lib/constants/taskUrls.js +11 -0
  435. package/lib/context/cor-user.js +31 -0
  436. package/lib/context/global-context.js +39 -0
  437. package/lib/dev/DevChatAI.js +101 -0
  438. package/lib/dev/DevContextMentionInput.js +67 -0
  439. package/lib/dev/ProjectSummary.js +9 -0
  440. package/lib/dev/Providers.js +27 -0
  441. package/lib/exports.js +2 -0
  442. package/lib/hooks/README.md +192 -0
  443. package/lib/hooks/index.js +30 -0
  444. package/lib/hooks/useAccessClient/index.js +2 -0
  445. package/lib/hooks/useAccessClient/useAccessClient.js +81 -0
  446. package/lib/hooks/useAgentModel/index.js +2 -0
  447. package/lib/hooks/useAgentModel/useAgentModel.js +62 -0
  448. package/lib/hooks/useAgentModel/useCreateAgent.js +128 -0
  449. package/lib/hooks/useAgentModel/useDeleteAgent.js +88 -0
  450. package/lib/hooks/useAgentModel/useUpdateAgent.js +129 -0
  451. package/lib/hooks/useAgentSuggestions.js +60 -0
  452. package/lib/hooks/useCaretPosition.js +65 -0
  453. package/lib/hooks/useChatManager/index.js +2 -0
  454. package/lib/hooks/useChatManager/useChatManager.interface.js +2 -0
  455. package/lib/hooks/useChatManager/useChatManager.js +1782 -0
  456. package/lib/hooks/useChatMessages/index.js +2 -0
  457. package/lib/hooks/useChatMessages/useChatMessages.interface.js +2 -0
  458. package/lib/hooks/useChatMessages/useChatMessages.js +722 -0
  459. package/lib/hooks/useChats/index.js +2 -0
  460. package/lib/hooks/useChats/useChats.interfaces.js +2 -0
  461. package/lib/hooks/useChats/useChats.js +187 -0
  462. package/lib/hooks/useClientSearch.js +163 -0
  463. package/lib/hooks/useContextMentions.js +463 -0
  464. package/lib/hooks/useContextPinPopover.js +228 -0
  465. package/lib/hooks/useDebounce.js +18 -0
  466. package/lib/hooks/useEntitySearch.js +1239 -0
  467. package/lib/hooks/useEvent.js +93 -0
  468. package/lib/hooks/useFrequentlyAskedQuestions.js +150 -0
  469. package/lib/hooks/useFrequentlyUsedActions.js +94 -0
  470. package/lib/hooks/useKnowledge/deleteKnowledge.js +69 -0
  471. package/lib/hooks/useKnowledge/downloadKnowledge.js +81 -0
  472. package/lib/hooks/useKnowledge/index.js +4 -0
  473. package/lib/hooks/useKnowledge/saveKnowledge.js +107 -0
  474. package/lib/hooks/useKnowledge/useKnowledgeOperations.js +156 -0
  475. package/lib/hooks/useMaiaTaskPanelZIndex.js +17 -0
  476. package/lib/hooks/useMentionAllowedTypes.js +136 -0
  477. package/lib/hooks/useMentionPopover.js +366 -0
  478. package/lib/hooks/useMinimizedPillBottomOffset.js +110 -0
  479. package/lib/hooks/useModal/index.js +2 -0
  480. package/lib/hooks/useModal/useModal.interfaces.js +2 -0
  481. package/lib/hooks/useModal/useModal.js +47 -0
  482. package/lib/hooks/useOnboardingNavigation.js +20 -0
  483. package/lib/hooks/useOrchestratorStream/index.js +2 -0
  484. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +2 -0
  485. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +269 -0
  486. package/lib/hooks/useProjectSearch.js +183 -0
  487. package/lib/hooks/useProjectSummary.js +101 -0
  488. package/lib/hooks/useProjectSummaryConfig.js +211 -0
  489. package/lib/hooks/useProjects.js +46 -0
  490. package/lib/hooks/useRecentClientsSearch.js +150 -0
  491. package/lib/hooks/useRecentContexts.js +86 -0
  492. package/lib/hooks/useResize.js +29 -0
  493. package/lib/hooks/useSlashCommands.js +84 -0
  494. package/lib/hooks/useSmoothStreamText/index.js +2 -0
  495. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.js +197 -0
  496. package/lib/hooks/useSnackBarManager/useSnackBarManager.js +41 -0
  497. package/lib/hooks/useStreamResponse.js +112 -0
  498. package/lib/hooks/useStreamdownStyles.js +13 -0
  499. package/lib/hooks/useStreamingMessage/index.js +2 -0
  500. package/lib/hooks/useStreamingMessage/useStreamingMessage.js +18 -0
  501. package/lib/hooks/useT.js +17 -0
  502. package/lib/hooks/useTabTaskDefault.js +33 -0
  503. package/lib/hooks/useTaskPanel.js +22 -0
  504. package/lib/hooks/useTextOverflowEllipsisTooltip.js +34 -0
  505. package/lib/hooks/useToggle.js +19 -0
  506. package/lib/hooks/useToggleFavorite/index.js +2 -0
  507. package/lib/hooks/useToggleFavorite/useToggleFavorite.js +83 -0
  508. package/lib/index.css +76 -0
  509. package/lib/index.js +30 -0
  510. package/lib/lang/br/index.js +761 -0
  511. package/lib/lang/en/index.js +761 -0
  512. package/lib/lang/es/index.js +762 -0
  513. package/lib/lang/fr/index.js +582 -0
  514. package/lib/lang/index.js +24 -0
  515. package/lib/lang/utils.js +33 -0
  516. package/lib/mocks/mockChats.js +395 -0
  517. package/lib/mocks/mockOrchestrator.js +5 -0
  518. package/lib/mocks/mockProject.js +11 -0
  519. package/lib/mocks/mockProjectSummary.js +6 -0
  520. package/lib/mocks/mockedUser.js +169 -0
  521. package/lib/services/apolloClient.js +3 -0
  522. package/lib/services/appcues.js +19 -0
  523. package/lib/services/corpilot/ProjectSummary/getProjectSummary.js +31 -0
  524. package/lib/services/corpilot/ProjectSummary/index.js +5 -0
  525. package/lib/services/corpilot/client.js +27 -0
  526. package/lib/services/corpilot/index.js +5 -0
  527. package/lib/services/maia/Access/updateAccess.js +59 -0
  528. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +46 -0
  529. package/lib/services/maia/Actions/getSlashCommands.js +39 -0
  530. package/lib/services/maia/Actions/index.js +7 -0
  531. package/lib/services/maia/Agents/createAgent.js +39 -0
  532. package/lib/services/maia/Agents/deleteAgent.js +38 -0
  533. package/lib/services/maia/Agents/fetchAgentDetail.js +122 -0
  534. package/lib/services/maia/Agents/getAgentById.js +162 -0
  535. package/lib/services/maia/Agents/getAgentModels.js +112 -0
  536. package/lib/services/maia/Agents/getAgentSuggestions.js +44 -0
  537. package/lib/services/maia/Agents/getAgents.js +718 -0
  538. package/lib/services/maia/Agents/setAgentToolGroups.js +42 -0
  539. package/lib/services/maia/Agents/toggleFavorite.js +34 -0
  540. package/lib/services/maia/Agents/updateAgent.js +39 -0
  541. package/lib/services/maia/Chats/deleteChat.js +32 -0
  542. package/lib/services/maia/Chats/getChatMessages.js +144 -0
  543. package/lib/services/maia/Chats/getChatsByUserId.js +82 -0
  544. package/lib/services/maia/Chats/index.js +15 -0
  545. package/lib/services/maia/Chats/markSessionAsRead.js +32 -0
  546. package/lib/services/maia/Chats/patchChat.js +43 -0
  547. package/lib/services/maia/Chats/wasHelpfulChat.js +31 -0
  548. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.js +55 -0
  549. package/lib/services/maia/Faqs/index.js +5 -0
  550. package/lib/services/maia/Knowledge/delete.js +41 -0
  551. package/lib/services/maia/Knowledge/download.js +48 -0
  552. package/lib/services/maia/Knowledge/index.js +3 -0
  553. package/lib/services/maia/Knowledge/save.js +43 -0
  554. package/lib/services/maia/Orchestrator/index.js +7 -0
  555. package/lib/services/maia/Orchestrator/orchestrator.js +246 -0
  556. package/lib/services/maia/RecentClients/getRecentClients.js +43 -0
  557. package/lib/services/maia/RecentClients/index.js +6 -0
  558. package/lib/services/maia/RecentContexts/getRecentContexts.js +54 -0
  559. package/lib/services/maia/RecentContexts/index.js +6 -0
  560. package/lib/services/maia/RecentProjects/getRecentProjects.js +55 -0
  561. package/lib/services/maia/RecentProjects/index.js +6 -0
  562. package/lib/services/maia/RecentTasks/getRecentTasks.js +54 -0
  563. package/lib/services/maia/RecentTasks/index.js +6 -0
  564. package/lib/services/maia/RecentUsers/getRecentUsers.js +59 -0
  565. package/lib/services/maia/RecentUsers/index.js +6 -0
  566. package/lib/services/maia/Skills/createSkill.js +39 -0
  567. package/lib/services/maia/Skills/deleteSkill.js +38 -0
  568. package/lib/services/maia/Skills/generateSkill.js +41 -0
  569. package/lib/services/maia/Skills/getSkills.js +90 -0
  570. package/lib/services/maia/Skills/updateSkill.js +39 -0
  571. package/lib/services/maia/client.js +27 -0
  572. package/lib/services/maia/index.js +17 -0
  573. package/lib/services/query/ClientSearchQuery.js +5 -0
  574. package/lib/services/query/entitySearchQuery.js +18 -0
  575. package/lib/services/query/index.js +2 -0
  576. package/lib/services/query/projectSearchByValueQuery.js +5 -0
  577. package/lib/services/query/taskUserTabQuery.js +8 -0
  578. package/lib/services/query/usersDirectoryQuery.js +19 -0
  579. package/lib/services/types.js +6 -0
  580. package/lib/services/utils/fetchCOR.js +117 -0
  581. package/lib/services/utils/getCookie.js +10 -0
  582. package/lib/services/utils/index.js +3 -0
  583. package/lib/services/utils/mapChatMessages.js +287 -0
  584. package/lib/services/utils/validateIsMaia.js +4 -0
  585. package/lib/store/chatsSidebarOptimistic.js +92 -0
  586. package/lib/store/chatsStore.types.js +2 -0
  587. package/lib/store/chatsStoreLifecycle.js +8 -0
  588. package/lib/store/faqsStore.types.js +2 -0
  589. package/lib/store/index.js +4 -0
  590. package/lib/store/maiaLastChatPersistence.js +35 -0
  591. package/lib/store/sessions/activeView.js +22 -0
  592. package/lib/store/sessions/index.js +9 -0
  593. package/lib/store/sessions/sessionHitlContext.js +15 -0
  594. package/lib/store/sessions/sessionNotificationSound.js +57 -0
  595. package/lib/store/sessions/sessionNotifications.js +110 -0
  596. package/lib/store/sessions/sessionNotifications.types.js +2 -0
  597. package/lib/store/sessions/sessionStreamManager.js +715 -0
  598. package/lib/store/sessions/sessionStreamingText.js +80 -0
  599. package/lib/store/sessions/sessions.types.js +35 -0
  600. package/lib/store/sessions/useSessionMeta.js +39 -0
  601. package/lib/store/sessions/useSessionStreamingText.js +18 -0
  602. package/lib/store/sessions/useSessionsStore.js +197 -0
  603. package/lib/store/useChatsStore.js +387 -0
  604. package/lib/store/useFaqsStore.js +27 -0
  605. package/lib/streamdownStyles.js +9 -0
  606. package/lib/styles/StyledCleanContainer.js +7 -0
  607. package/lib/styles/cascade.js +14 -0
  608. package/lib/styles/config.js +47 -0
  609. package/lib/styles/shared/scrollable.js +3 -0
  610. package/lib/styles/transitions.js +21 -0
  611. package/lib/types/Action.js +2 -0
  612. package/lib/types/AgentSuggestion.js +2 -0
  613. package/lib/types/Chat.js +10 -0
  614. package/lib/types/Client.js +2 -0
  615. package/lib/types/FrequentlyAskedQuestion.js +2 -0
  616. package/lib/types/Project.js +2 -0
  617. package/lib/types/ProjectSummaryConfigKeys.js +9 -0
  618. package/lib/types/Task.js +2 -0
  619. package/lib/types/agent.js +2 -0
  620. package/lib/types/agentModal.js +2 -0
  621. package/lib/types/contextMention.js +37 -0
  622. package/lib/types/global.d.js +2 -0
  623. package/lib/types/skill.js +2 -0
  624. package/lib/types/streamActivity.js +2 -0
  625. package/lib/types/userType.d.js +2 -0
  626. package/lib/utils/actionCategoryMap.js +37 -0
  627. package/lib/utils/actionIconMap.js +61 -0
  628. package/lib/utils/agentDisplayName.js +42 -0
  629. package/lib/utils/chatInputFiles.js +52 -0
  630. package/lib/utils/contextMentionIcons.js +134 -0
  631. package/lib/utils/contextMentionLabel.js +4 -0
  632. package/lib/utils/contextMentionTriggers.js +54 -0
  633. package/lib/utils/contextMentionTypeLabel.js +17 -0
  634. package/lib/utils/corConnectorMentionTypes.js +41 -0
  635. package/lib/utils/ensureStreamdownStyles.js +21 -0
  636. package/lib/utils/entityLinkRender.js +135 -0
  637. package/lib/utils/fileDownloadHelper.js +40 -0
  638. package/lib/utils/formatQuickActionMessage.js +16 -0
  639. package/lib/utils/formatUnreadCount.js +6 -0
  640. package/lib/utils/getUnitFileSize.js +13 -0
  641. package/lib/utils/hitlAnalytics.js +65 -0
  642. package/lib/utils/hoursPlannerQuickActionType.js +64 -0
  643. package/lib/utils/imagePreprocessor.js +108 -0
  644. package/lib/utils/index.js +3 -0
  645. package/lib/utils/maiaHostOpen.js +19 -0
  646. package/lib/utils/maiaStreamdownRehypePlugins.js +27 -0
  647. package/lib/utils/mapBackendLang.js +8 -0
  648. package/lib/utils/normalizeAgentConnectors.js +70 -0
  649. package/lib/utils/openTaskInCorPanel.js +22 -0
  650. package/lib/utils/orchestratorSubagents.js +11 -0
  651. package/lib/utils/renderContextMentions.js +399 -0
  652. package/lib/utils/retryCompletion.js +85 -0
  653. package/lib/utils/slashCommandMarker.js +30 -0
  654. package/lib/utils/sortManagerHoursHomeFuas.js +14 -0
  655. package/lib/utils/sseStreamContent.js +17 -0
  656. package/lib/utils/streamActivityMessages.js +359 -0
  657. package/lib/utils/validateTrimmedFields.js +8 -0
  658. package/package.json +1 -1
@@ -0,0 +1,1217 @@
1
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
5
+ 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; }
6
+ 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; }
7
+ /* eslint-disable no-nested-ternary */
8
+ /* eslint-disable @typescript-eslint/indent */
9
+ /* eslint-disable react/jsx-no-useless-fragment */
10
+ /* eslint-disable @typescript-eslint/no-explicit-any */
11
+ /* eslint-disable react/no-array-index-key */
12
+ /* eslint-disable jsx-a11y/click-events-have-key-events */
13
+ /* eslint-disable jsx-a11y/no-static-element-interactions */
14
+ /* eslint-disable react/function-component-definition */
15
+ /* eslint-disable react/require-default-props */
16
+ /* eslint-disable no-console */
17
+ import { useCallback, useMemo, useState, useRef, useEffect, useLayoutEffect } from 'react';
18
+ import ReactDOM from 'react-dom';
19
+ import moment from 'moment';
20
+ import { useTranslation } from 'react-i18next';
21
+ import { useUser } from '../../../context/cor-user';
22
+ import { canAccessToChatAI } from '../../../constants/permissions';
23
+ import { MAIAError } from '../../atoms/MAIAError';
24
+ import { useMaiaTaskPanelZIndex } from '../../../hooks/useMaiaTaskPanelZIndex';
25
+ import { ChatAIContent } from '../ChatAIContent';
26
+ import { buildHandlers, options } from './constants';
27
+ import { Sidebar } from '../Sidebar';
28
+ import { useGetAgents } from '../../../services/maia/Agents/getAgents';
29
+ import { useGetSkills } from '../../../services/maia/Skills/getSkills';
30
+ import { useGlobalContext } from '../../../context/global-context';
31
+ import { ChatAIModalHeader } from './components/ChatAiModalHeader/ChatAiModalHeader';
32
+ import { Snackbar } from '../../organisms/SnackBar/Snackbar';
33
+ import { ProjectSummaryContent } from '../ProjectSummaryContent';
34
+ import { AbmAgentModal } from '../../organisms/AbmAgentModal/AbmAgentModal';
35
+ import { AbmSkillModal } from '../../organisms/AbmSkillModal/AbmSkillModal';
36
+ import { AbmSkillGenerateModal } from '../../organisms/AbmSkillGenerateModal/AbmSkillGenerateModal';
37
+ import { SECTIONS } from '../../../constants/config';
38
+ import { SCCAIMContent, SCCAIMContentWrapper, SCCAIMMinimizedHide, SCCAIMWrapper } from './ChatAIModal.styles';
39
+ import { MaiaMinimizedPill } from './components/MaiaMinimizedPill';
40
+ import { getMaiaFloatingPanelWidthPx, resolveInitialMaiaChatLayoutMode, setStoredMaiaChatLayoutMode } from './layout';
41
+ import { FloatingPanelMotion, useFloatingPanelDragTilt } from './floatingPanelMotion';
42
+ import { ChatAiModalFooter } from './components/ChatAiModalFooter';
43
+ import { validateIsMaia } from '../../../services/utils/validateIsMaia';
44
+ import { isMarketplaceGlobalCloneAgent } from '../../../utils/agentDisplayName';
45
+ import { useFaqsStore } from '../../../store/useFaqsStore';
46
+ import { getChatsStoreState, useChatsStore } from '../../../store/useChatsStore';
47
+ import { readLastActiveChatId, writeLastActiveChatId } from '../../../store/maiaLastChatPersistence';
48
+ import { useSessionsStore } from '../../../store/sessions/useSessionsStore';
49
+ import { isActiveSessionStatus } from '../../../store/sessions/sessions.types';
50
+ import { fetchMaia } from '../../../services/maia/client';
51
+ import { mapCORLang } from '../../../lang/utils';
52
+ import { EVENTS, useEvent } from '../../../hooks/useEvent';
53
+ import { MAIA_OPEN_FROM_HOST_EVENT } from '../../../utils/maiaHostOpen';
54
+
55
+ /** Metadata de la session abierta (emitida por useChatMessages al cargar una conversación). */
56
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
57
+ var LEGACY_CONTEXT_ENTITIES = ['project', 'task', 'client'];
58
+ /** Home global del orchestrator (solo header). Planner es home de FUAs, no de contextos. */
59
+ var isGlobalMaiaSection = function isGlobalMaiaSection(section) {
60
+ return section === 'header';
61
+ };
62
+ var resolveAiChatBackDestination = function resolveAiChatBackDestination(section, agentType, currentOption, homeOption) {
63
+ if (isGlobalMaiaSection(section) && agentType === 'orchestrator' && currentOption === homeOption) {
64
+ return 'global_context_home';
65
+ }
66
+ if (section === 'task') return 'task_home';
67
+ if (section === 'planner') return 'planner_home';
68
+ if (section === 'project') return 'project_home';
69
+ if (section === 'client') return 'client_home';
70
+ return 'global_context_home';
71
+ };
72
+ export var ID_MODAL_CHAT_AGENT = 'modals-portal-maia-chat-agent';
73
+ var validateAccessByFeature = function validateAccessByFeature(section, user) {
74
+ if (!section || !canAccessToChatAI(user)) {
75
+ return false;
76
+ }
77
+
78
+ // Planner y task abren siempre el chat (home de FUAs), nunca resumen de proyectos.
79
+ if (section === 'planner' || section === 'task') {
80
+ return true;
81
+ }
82
+ if (section === 'header') {
83
+ return Boolean(window.MAIA_CHAT_AI_FEATURE_ACCESS || window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS);
84
+ }
85
+ return Boolean(window.MAIA_CHAT_AI_FEATURE_ACCESS);
86
+ };
87
+ export var ChatAIModal = function ChatAIModal() {
88
+ var _user$permissions, _user$permissions2, _user$permissions3, _agents$data;
89
+ var user = useUser();
90
+ var _useTranslation = useTranslation([SECTIONS.abmAgent]),
91
+ i18n = _useTranslation.i18n;
92
+ var amplitudEvent = useEvent();
93
+
94
+ // MAIA vive montada en todas las pantallas: el panel arranca siempre cerrado (pill visible)
95
+ // y sólo se abre por acción del usuario — navegar o refrescar no lo reabre.
96
+ var _useState = useState(true),
97
+ _useState2 = _slicedToArray(_useState, 2),
98
+ isMinimized = _useState2[0],
99
+ setIsMinimized = _useState2[1];
100
+ var setChatViewVisible = useChatsStore(function (state) {
101
+ return state.setChatViewVisible;
102
+ });
103
+ var unreadCount = useChatsStore(function (state) {
104
+ return state.unreadCount;
105
+ });
106
+ var activeChatId = useChatsStore(function (state) {
107
+ return state.activeChatId;
108
+ });
109
+ // Los "..." del pill salen del motor, no de isStreaming/isWriting: esos reflejan
110
+ // la sesión activa y quedan stale cuando una respuesta termina en background.
111
+ var hasActiveStream = useSessionsStore(function (state) {
112
+ return Object.values(state.meta).some(function (meta) {
113
+ return isActiveSessionStatus(meta.status);
114
+ });
115
+ });
116
+
117
+ /** goToChat / handleGoHome se definen más abajo; los refs evitan depender del orden de declaración. */
118
+ var goToChatRef = useRef(null);
119
+ var goHomeRef = useRef(null);
120
+
121
+ // Monta cerrada: el chat no está a la vista, así que las respuestas que lleguen
122
+ // tienen que quedar como no leídas.
123
+ useEffect(function () {
124
+ setChatViewVisible(false);
125
+ // Sólo al montar: después lo manejan minimizar/restaurar.
126
+ }, []);
127
+
128
+ // Persistimos la conversación abierta para poder volver a ella desde el pill después
129
+ // de navegar o refrescar. El takeover desde un host la limpia (va al Home).
130
+ useEffect(function () {
131
+ if (activeChatId) {
132
+ writeLastActiveChatId(user.id, activeChatId);
133
+ }
134
+ }, [activeChatId, user.id]);
135
+ var handleMinimize = useCallback(function () {
136
+ amplitudEvent(EVENTS.aiChatMinimize);
137
+ setIsMinimized(true);
138
+ setChatViewVisible(false);
139
+ }, [amplitudEvent, setChatViewVisible]);
140
+ var focusChatInput = useCallback(function () {
141
+ window.setTimeout(function () {
142
+ document.dispatchEvent(new CustomEvent('maia-input-refocus'));
143
+ }, 100);
144
+ }, []);
145
+ var _useState3 = useState({
146
+ message: '',
147
+ attachments: []
148
+ }),
149
+ _useState4 = _slicedToArray(_useState3, 2),
150
+ userInitialMessage = _useState4[0],
151
+ setUserInitialMessage = _useState4[1];
152
+ var _useState5 = useState(null),
153
+ _useState6 = _slicedToArray(_useState5, 2),
154
+ initialChatId = _useState6[0],
155
+ setInitialChatId = _useState6[1];
156
+ var _useState7 = useState(0),
157
+ _useState8 = _slicedToArray(_useState7, 2),
158
+ newChatKey = _useState8[0],
159
+ setNewChatKey = _useState8[1];
160
+ var _useState9 = useState(null),
161
+ _useState0 = _slicedToArray(_useState9, 2),
162
+ sessionMeta = _useState0[0],
163
+ setSessionMeta = _useState0[1];
164
+ var _useState1 = useState(null),
165
+ _useState10 = _slicedToArray(_useState1, 2),
166
+ sendMessageFunction = _useState10[0],
167
+ setSendMessageFunction = _useState10[1];
168
+ var _useState11 = useState(null),
169
+ _useState12 = _slicedToArray(_useState11, 2),
170
+ stopGenerationFunction = _useState12[0],
171
+ setStopGenerationFunction = _useState12[1];
172
+ var _useState13 = useState(false),
173
+ _useState14 = _slicedToArray(_useState13, 2),
174
+ isStreaming = _useState14[0],
175
+ setIsStreaming = _useState14[1];
176
+ var _useState15 = useState(false),
177
+ _useState16 = _slicedToArray(_useState15, 2),
178
+ isWriting = _useState16[0],
179
+ setIsWriting = _useState16[1];
180
+ var _useState17 = useState(false),
181
+ _useState18 = _slicedToArray(_useState17, 2),
182
+ refetchChats = _useState18[0],
183
+ setRefetchChats = _useState18[1];
184
+ var _useState19 = useState(options.home),
185
+ _useState20 = _slicedToArray(_useState19, 2),
186
+ currentOption = _useState20[0],
187
+ setCurrentOption = _useState20[1];
188
+ var _useState21 = useState(false),
189
+ _useState22 = _slicedToArray(_useState21, 2),
190
+ hasError = _useState22[0],
191
+ setHasError = _useState22[1];
192
+ // En project/client/task: el usuario reinició el contexto del orchestrator (lo limpió y pasó por
193
+ // el selector de contextos recientes). Habilita el botón "volver" en el home paso 2 de esas
194
+ // secciones. Se resetea al cerrar/reabrir el modal (el componente se desmonta).
195
+ var _useState23 = useState(false),
196
+ _useState24 = _slicedToArray(_useState23, 2),
197
+ didResetContextInSection = _useState24[0],
198
+ setDidResetContextInSection = _useState24[1];
199
+ var prevHasPinnedContextRef = useRef(false);
200
+ var handlers = useMemo(function () {
201
+ return buildHandlers(setCurrentOption, setHasError);
202
+ }, []);
203
+ var _useState25 = useState(false),
204
+ _useState26 = _slicedToArray(_useState25, 2),
205
+ sidebarHasError = _useState26[0],
206
+ setSidebarHasError = _useState26[1];
207
+ var resetSelectedChatRef = useRef(null);
208
+ var lang = i18n.language === 'br' ? 'pt-br' : i18n.language;
209
+ moment.locale(lang);
210
+ var _useGlobalContext = useGlobalContext(),
211
+ selectAgent = _useGlobalContext.selectAgent,
212
+ clearAgent = _useGlobalContext.clearAgent,
213
+ section = _useGlobalContext.section,
214
+ agent = _useGlobalContext.agent,
215
+ project = _useGlobalContext.project,
216
+ client = _useGlobalContext.client,
217
+ task = _useGlobalContext.task,
218
+ chipsProject = _useGlobalContext.chipsProject,
219
+ toggleWebSearch = _useGlobalContext.toggleWebSearch,
220
+ isWebSearchActive = _useGlobalContext.isWebSearchActive,
221
+ setChipsProject = _useGlobalContext.setChipsProject,
222
+ setClient = _useGlobalContext.setClient,
223
+ setProject = _useGlobalContext.setProject,
224
+ bannerEntryFaq = _useGlobalContext.bannerEntryFaq,
225
+ setTask = _useGlobalContext.setTask;
226
+
227
+ // Z-index para tooltips en section 'task' (modal flotante elevado)
228
+ var tooltipZIndex = useMaiaTaskPanelZIndex(1500, 'overlay');
229
+ var _useGetAgents = useGetAgents({
230
+ selectAgent: selectAgent,
231
+ section: section,
232
+ agent: agent,
233
+ handleGoHome: handlers.home
234
+ }),
235
+ agents = _useGetAgents.agents,
236
+ loading = _useGetAgents.loading,
237
+ loadingMore = _useGetAgents.loadingMore,
238
+ agentError = _useGetAgents.error,
239
+ handleGetAgents = _useGetAgents.handleGetAgents,
240
+ loadMoreAgents = _useGetAgents.loadMoreAgents,
241
+ searchCustomAgents = _useGetAgents.searchCustomAgents,
242
+ searchLoading = _useGetAgents.searchLoading,
243
+ addAgent = _useGetAgents.addAgent,
244
+ removeAgent = _useGetAgents.removeAgent,
245
+ updateAgent = _useGetAgents.updateAgent,
246
+ updateAgentFavorite = _useGetAgents.updateAgentFavorite,
247
+ selectFirstAgent = _useGetAgents.selectFirstAgent,
248
+ sortAgentsList = _useGetAgents.sortAgentsList;
249
+ var _useGetSkills = useGetSkills(),
250
+ skills = _useGetSkills.skills,
251
+ loadingSkills = _useGetSkills.loading,
252
+ handleGetSkills = _useGetSkills.handleGetSkills,
253
+ addSkill = _useGetSkills.addSkill,
254
+ updateSkillInList = _useGetSkills.updateSkillInList,
255
+ removeSkill = _useGetSkills.removeSkill;
256
+ var isMAIA = validateIsMaia(agent);
257
+ var userHasPermissions = ((user === null || user === void 0 || (_user$permissions = user.permissions) === null || _user$permissions === void 0 || (_user$permissions = _user$permissions.ai_agents) === null || _user$permissions === void 0 ? void 0 : _user$permissions.create) || (user === null || user === void 0 || (_user$permissions2 = user.permissions) === null || _user$permissions2 === void 0 || (_user$permissions2 = _user$permissions2.ai_agents) === null || _user$permissions2 === void 0 ? void 0 : _user$permissions2.edit) || (user === null || user === void 0 || (_user$permissions3 = user.permissions) === null || _user$permissions3 === void 0 || (_user$permissions3 = _user$permissions3.ai_agents) === null || _user$permissions3 === void 0 ? void 0 : _user$permissions3["delete"])) && window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS;
258
+ var computedCurrentOption = useMemo(function () {
259
+ var isGlobalSpecialist = isMAIA && (agent === null || agent === void 0 ? void 0 : agent.entity) === 'global';
260
+ var isProjectSpecialist = isMAIA && ((agent === null || agent === void 0 ? void 0 : agent.entity) === 'project' || (agent === null || agent === void 0 ? void 0 : agent.entity) == null);
261
+ var isClientSpecialist = isMAIA && (agent === null || agent === void 0 ? void 0 : agent.entity) === 'client';
262
+ var isMaiaker = isMarketplaceGlobalCloneAgent(agent);
263
+ if (currentOption === options.myAgents && window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS) {
264
+ return options.myAgents;
265
+ }
266
+ if (currentOption === options.mySkills && window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS) {
267
+ return options.mySkills;
268
+ }
269
+
270
+ // El orchestrator (MAIA) muestra su home con FAQs/acciones frecuentes; el resto de
271
+ // los global specialists (clones globales no-maiaker) siguen yendo directo al chat.
272
+ if (isGlobalSpecialist && !isMaiaker && (agent === null || agent === void 0 ? void 0 : agent.type) !== 'orchestrator' && currentOption === options.home) {
273
+ return options.chat;
274
+ }
275
+ var shouldShowProjectSelector = currentOption !== options.chat && isProjectSpecialist && !project;
276
+ var shouldShowClientSelector = currentOption !== options.chat && isClientSpecialist && !client;
277
+ if (shouldShowProjectSelector) {
278
+ return options.projectSelector;
279
+ }
280
+ if (shouldShowClientSelector) {
281
+ return options.clientSelector;
282
+ }
283
+ return currentOption;
284
+ }, [currentOption, project, client, isMAIA, agent === null || agent === void 0 ? void 0 : agent.entity, agent === null || agent === void 0 ? void 0 : agent.name, agent === null || agent === void 0 ? void 0 : agent.type]);
285
+ var isMaiakerAgentSelected = useMemo(function () {
286
+ return isMarketplaceGlobalCloneAgent(agent);
287
+ }, [agent]);
288
+ var sidebarAgentsNavActive = useMemo(function () {
289
+ if (computedCurrentOption === options.mySkills) return 'mySkills';
290
+ if (computedCurrentOption === options.myAgents) return 'myAgents';
291
+ if (isMaiakerAgentSelected) return 'maiaker';
292
+ return null;
293
+ }, [computedCurrentOption, isMaiakerAgentSelected]);
294
+
295
+ /* Reactivar con la fila “Mis agentes” en Sidebar: myAgentsCount prop
296
+ const sidebarMyAgentsCount = useMemo(() => {
297
+ return agents.data.filter(
298
+ a => !(a.type === 'orchestrator' || (a.type === 'clone' && a.entity === 'global' && /(maiaker|marketplace)/i.test(a.name || '')))
299
+ )
300
+ .length
301
+ }, [agents.data])
302
+ */
303
+
304
+ var agentsFetchedRef = useRef(false);
305
+ var selector = document.querySelector("#".concat(ID_MODAL_CHAT_AGENT));
306
+
307
+ // Task panel, planner y banner de proyecto abren en flotante por default (no tapar el contexto detrás).
308
+ // Fuera de esos contextos se respeta la preferencia guardada en localStorage.
309
+ var _useState27 = useState(function () {
310
+ return resolveInitialMaiaChatLayoutMode({
311
+ section: section,
312
+ bannerEntryFaq: bannerEntryFaq
313
+ });
314
+ }),
315
+ _useState28 = _slicedToArray(_useState27, 2),
316
+ layoutMode = _useState28[0],
317
+ setLayoutMode = _useState28[1];
318
+ var handleLayoutModeChange = useCallback(function (mode) {
319
+ setStoredMaiaChatLayoutMode(mode);
320
+ setLayoutMode(mode);
321
+ }, []);
322
+ var expanded = layoutMode === 'fullscreen';
323
+ var isFloating = layoutMode === 'floating';
324
+ var contentWrapperRef = useRef(null);
325
+ var _useState29 = useState(null),
326
+ _useState30 = _slicedToArray(_useState29, 2),
327
+ dragPosition = _useState30[0],
328
+ setDragPosition = _useState30[1];
329
+ var _useFloatingPanelDrag = useFloatingPanelDragTilt(isFloating),
330
+ tiltMotion = _useFloatingPanelDrag.tiltMotion,
331
+ startPointerTracking = _useFloatingPanelDrag.startPointerTracking,
332
+ samplePointerMove = _useFloatingPanelDrag.samplePointerMove,
333
+ endPointerTracking = _useFloatingPanelDrag.endPointerTracking;
334
+ var dragStateRef = useRef(null);
335
+ var clampDragPosition = useCallback(function (x, y) {
336
+ var contentWrapper = contentWrapperRef.current;
337
+ if (!contentWrapper) {
338
+ return {
339
+ x: x,
340
+ y: y
341
+ };
342
+ }
343
+ var _contentWrapper$getBo = contentWrapper.getBoundingClientRect(),
344
+ width = _contentWrapper$getBo.width,
345
+ height = _contentWrapper$getBo.height;
346
+ var offset = 16;
347
+ var maxX = Math.max(offset, window.innerWidth - width - offset);
348
+ var maxY = Math.max(offset, window.innerHeight - height - offset);
349
+ return {
350
+ x: Math.min(Math.max(x, offset), maxX),
351
+ y: Math.min(Math.max(y, offset), maxY)
352
+ };
353
+ }, []);
354
+ useLayoutEffect(function () {
355
+ if (layoutMode !== 'floating') {
356
+ setDragPosition(null);
357
+ return;
358
+ }
359
+ setDragPosition(function (prev) {
360
+ if (prev) {
361
+ return clampDragPosition(prev.x, prev.y);
362
+ }
363
+ var pad = 16;
364
+ var x = window.innerWidth - getMaiaFloatingPanelWidthPx() - pad;
365
+ return clampDragPosition(x, pad);
366
+ });
367
+ }, [layoutMode, clampDragPosition]);
368
+ var handleDragEnd = useCallback(function (event) {
369
+ var _dragStateRef$current;
370
+ endPointerTracking();
371
+ if (((_dragStateRef$current = dragStateRef.current) === null || _dragStateRef$current === void 0 ? void 0 : _dragStateRef$current.pointerId) !== event.pointerId) {
372
+ return;
373
+ }
374
+ dragStateRef.current = null;
375
+ document.body.style.userSelect = '';
376
+ document.body.style.cursor = '';
377
+ }, [endPointerTracking]);
378
+ var handleDragMove = useCallback(function (event) {
379
+ var dragState = dragStateRef.current;
380
+ if (!dragState || dragState.pointerId !== event.pointerId) {
381
+ return;
382
+ }
383
+ samplePointerMove(event.clientX, event.clientY);
384
+ var nextPosition = clampDragPosition(event.clientX - dragState.offsetX, event.clientY - dragState.offsetY);
385
+ setDragPosition(function (prev) {
386
+ if (prev && prev.x === nextPosition.x && prev.y === nextPosition.y) {
387
+ return prev;
388
+ }
389
+ return nextPosition;
390
+ });
391
+ }, [clampDragPosition, samplePointerMove]);
392
+ var resolvedDragPosition = useMemo(function () {
393
+ if (layoutMode !== 'floating') {
394
+ return dragPosition;
395
+ }
396
+ if (dragPosition) {
397
+ return dragPosition;
398
+ }
399
+ var pad = 16;
400
+ var x = typeof window !== 'undefined' ? window.innerWidth - getMaiaFloatingPanelWidthPx() - pad : pad;
401
+ return clampDragPosition(x, pad);
402
+ }, [layoutMode, dragPosition, clampDragPosition]);
403
+ var handleDragStart = useCallback(function (event) {
404
+ if (!isFloating || event.button !== 0) {
405
+ return;
406
+ }
407
+ var target = event.target;
408
+ if (target.closest('button, a, input, textarea, select, [role="button"], [data-no-drag="true"]')) {
409
+ return;
410
+ }
411
+ var contentWrapper = contentWrapperRef.current;
412
+ if (!contentWrapper) {
413
+ return;
414
+ }
415
+ var rect = contentWrapper.getBoundingClientRect();
416
+ var initialPosition = resolvedDragPosition !== null && resolvedDragPosition !== void 0 ? resolvedDragPosition : clampDragPosition(rect.left, rect.top);
417
+ var pointerOffsetX = event.clientX - initialPosition.x;
418
+ var pointerOffsetY = event.clientY - initialPosition.y;
419
+ setDragPosition(initialPosition);
420
+ dragStateRef.current = {
421
+ pointerId: event.pointerId,
422
+ offsetX: pointerOffsetX,
423
+ offsetY: pointerOffsetY
424
+ };
425
+ event.currentTarget.setPointerCapture(event.pointerId);
426
+ event.preventDefault();
427
+ document.body.style.userSelect = 'none';
428
+ document.body.style.cursor = 'grabbing';
429
+ amplitudEvent(EVENTS.aiChatDraggable);
430
+ startPointerTracking(event.clientX, event.clientY);
431
+ }, [clampDragPosition, isFloating, resolvedDragPosition, startPointerTracking]);
432
+ var startChat = useCallback(function (message, attachments, faqId, agentSuggestionId, mentions, fuaId, scId, contextData) {
433
+ if (sidebarHasError) {
434
+ setSidebarHasError(false);
435
+ }
436
+ setInitialChatId(null);
437
+ setNewChatKey(function (prev) {
438
+ return prev + 1;
439
+ });
440
+ setUserInitialMessage(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
441
+ message: message || '',
442
+ attachments: attachments || []
443
+ }, faqId ? {
444
+ faqId: faqId
445
+ } : {}), agentSuggestionId ? {
446
+ agentSuggestionId: agentSuggestionId
447
+ } : {}), mentions && mentions.length > 0 ? {
448
+ mentions: mentions
449
+ } : {}), fuaId ? {
450
+ fuaId: fuaId
451
+ } : {}), scId ? {
452
+ scId: scId
453
+ } : {}), contextData ? {
454
+ contextData: contextData
455
+ } : {}));
456
+ handlers.chat();
457
+ }, [handlers, sidebarHasError]);
458
+ var bannerFaqAutoSentRef = useRef(false);
459
+ useEffect(function () {
460
+ var _bannerEntryFaq$faqTi;
461
+ var entityReady = section === 'project' ? Boolean(project === null || project === void 0 ? void 0 : project.id) : section === 'client' ? Boolean(client === null || client === void 0 ? void 0 : client.id) : true;
462
+ if (!(bannerEntryFaq !== null && bannerEntryFaq !== void 0 && (_bannerEntryFaq$faqTi = bannerEntryFaq.faqTitle) !== null && _bannerEntryFaq$faqTi !== void 0 && _bannerEntryFaq$faqTi.trim()) || bannerFaqAutoSentRef.current || loading || !(agent !== null && agent !== void 0 && agent.id) || !entityReady) {
463
+ return;
464
+ }
465
+ bannerFaqAutoSentRef.current = true;
466
+ startChat(bannerEntryFaq.faqTitle, [], bannerEntryFaq.faqId, undefined, undefined, undefined, undefined, bannerEntryFaq.contextData);
467
+ }, [bannerEntryFaq === null || bannerEntryFaq === void 0 ? void 0 : bannerEntryFaq.faqId, bannerEntryFaq === null || bannerEntryFaq === void 0 ? void 0 : bannerEntryFaq.faqTitle, bannerEntryFaq === null || bannerEntryFaq === void 0 ? void 0 : bannerEntryFaq.contextData, loading, agent === null || agent === void 0 ? void 0 : agent.id, agent === null || agent === void 0 ? void 0 : agent.entity, project === null || project === void 0 ? void 0 : project.id, client === null || client === void 0 ? void 0 : client.id, section, startChat]);
468
+ var goToChat = useCallback(function (chat) {
469
+ setUserInitialMessage({
470
+ message: '',
471
+ attachments: []
472
+ });
473
+ setInitialChatId(chat.sessionExternalId);
474
+ var selectedAgent = agents.data.find(function (agentItem) {
475
+ return agentItem.id === chat.agentId;
476
+ });
477
+ if (selectedAgent) {
478
+ selectAgent(selectedAgent);
479
+ }
480
+ // Dispatch event to clear the input textarea
481
+ document.dispatchEvent(new CustomEvent('chat-session-changed'));
482
+ handlers.chat();
483
+ }, [handlers, agents, selectAgent]);
484
+ goToChatRef.current = goToChat;
485
+
486
+ /** Los agentes se piden recién al abrir el panel: en modo pill no hace falta ninguna request. */
487
+ var ensureAgentsLoaded = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
488
+ return _regeneratorRuntime.wrap(function (_context) {
489
+ while (1) switch (_context.prev = _context.next) {
490
+ case 0:
491
+ if (!agentsFetchedRef.current) {
492
+ _context.next = 1;
493
+ break;
494
+ }
495
+ return _context.abrupt("return");
496
+ case 1:
497
+ agentsFetchedRef.current = true;
498
+ _context.next = 2;
499
+ return handleGetAgents();
500
+ case 2:
501
+ case "end":
502
+ return _context.stop();
503
+ }
504
+ }, _callee);
505
+ })), [handleGetAgents]);
506
+ var handleRestoreFromMinimized = useCallback(function () {
507
+ setIsMinimized(false);
508
+ setChatViewVisible(true);
509
+ amplitudEvent(EVENTS.aiChatOpen, {
510
+ option: 'minimize'
511
+ });
512
+
513
+ // goToChat necesita la lista de agentes para seleccionar el de la conversación.
514
+ ensureAgentsLoaded().then(function () {
515
+ var _chats$find;
516
+ // Prioridad al reabrir: primer chat sin leer → última conversación abierta → Home.
517
+ var _getChatsStoreState = getChatsStoreState(),
518
+ chats = _getChatsStoreState.chats;
519
+ var lastActiveChatId = readLastActiveChatId(user.id);
520
+ var target = (_chats$find = chats.find(function (chat) {
521
+ return chat.isRead === false;
522
+ })) !== null && _chats$find !== void 0 ? _chats$find : lastActiveChatId ? chats.find(function (chat) {
523
+ return chat.sessionExternalId === lastActiveChatId;
524
+ }) : undefined;
525
+ if (target) {
526
+ var _goToChatRef$current;
527
+ (_goToChatRef$current = goToChatRef.current) === null || _goToChatRef$current === void 0 || _goToChatRef$current.call(goToChatRef, target);
528
+ } else {
529
+ var _goHomeRef$current;
530
+ (_goHomeRef$current = goHomeRef.current) === null || _goHomeRef$current === void 0 || _goHomeRef$current.call(goHomeRef);
531
+ }
532
+ focusChatInput();
533
+ });
534
+ }, [amplitudEvent, ensureAgentsLoaded, focusChatInput, setChatViewVisible, user.id]);
535
+
536
+ /**
537
+ * Toma control desde un host (header, proyecto, cliente…): abre el panel, descarta la
538
+ * conversación abierta y aplica el contexto del host. NO vuelve a la última conversación
539
+ * — eso sólo lo hace el pill (`handleRestoreFromMinimized`).
540
+ */
541
+ var applyExpandedHostTakeover = useCallback(function (detail) {
542
+ var _resetSelectedChatRef;
543
+ setIsMinimized(false);
544
+ setChatViewVisible(true);
545
+ writeLastActiveChatId(user.id, null);
546
+ ensureAgentsLoaded();
547
+ setInitialChatId(null);
548
+ setNewChatKey(function (prev) {
549
+ return prev + 1;
550
+ });
551
+ setUserInitialMessage({
552
+ message: '',
553
+ attachments: []
554
+ });
555
+ setCurrentOption(options.home);
556
+ setDidResetContextInSection(false);
557
+ setHasError(false);
558
+ setIsWriting(false);
559
+ useFaqsStore.getState().clearFaqs();
560
+ bannerFaqAutoSentRef.current = false;
561
+ (_resetSelectedChatRef = resetSelectedChatRef.current) === null || _resetSelectedChatRef === void 0 || _resetSelectedChatRef.call(resetSelectedChatRef);
562
+ getChatsStoreState().setActiveChatId(null);
563
+ document.dispatchEvent(new CustomEvent('chat-session-changed'));
564
+ if (detail.section === 'project' || detail.section === 'task') {
565
+ var _detail$project;
566
+ setProject === null || setProject === void 0 || setProject((_detail$project = detail.project) !== null && _detail$project !== void 0 ? _detail$project : null);
567
+ } else {
568
+ setProject === null || setProject === void 0 || setProject(null);
569
+ }
570
+ if (detail.section === 'client') {
571
+ var _detail$client;
572
+ setClient === null || setClient === void 0 || setClient((_detail$client = detail.client) !== null && _detail$client !== void 0 ? _detail$client : null);
573
+ } else if (detail.section === 'header' || detail.section === 'planner') {
574
+ setClient === null || setClient === void 0 || setClient(null);
575
+ }
576
+ if (detail.section === 'task') {
577
+ var _detail$task;
578
+ setTask === null || setTask === void 0 || setTask((_detail$task = detail.task) !== null && _detail$task !== void 0 ? _detail$task : null);
579
+ } else {
580
+ setTask === null || setTask === void 0 || setTask(null);
581
+ }
582
+ if (detail.section === 'header' || detail.section === 'planner') {
583
+ setChipsProject(null);
584
+ }
585
+ var nextLayout = resolveInitialMaiaChatLayoutMode({
586
+ section: detail.section,
587
+ bannerEntryFaq: detail.faq
588
+ });
589
+ setLayoutMode(nextLayout);
590
+ setDragPosition(null);
591
+ focusChatInput();
592
+ }, [ensureAgentsLoaded, focusChatInput, setChatViewVisible, setChipsProject, setClient, setProject, setTask, user.id]);
593
+ var handleSendMessageReady = useCallback(function (sendMessage, stopGeneration, streaming, writing) {
594
+ setSendMessageFunction(function () {
595
+ return sendMessage;
596
+ });
597
+ setStopGenerationFunction(function () {
598
+ return stopGeneration;
599
+ });
600
+ setIsStreaming(streaming);
601
+ setIsWriting(writing);
602
+ }, []);
603
+ var handleSendMessage = useCallback(function (message, attachments, faqId, agentSuggestionId, mentions, fuaId, scId) {
604
+ if (sidebarHasError) {
605
+ setSidebarHasError(false);
606
+ }
607
+ if (sendMessageFunction && computedCurrentOption === options.chat) {
608
+ sendMessageFunction(message, attachments, faqId, agentSuggestionId, mentions, fuaId, scId);
609
+ } else {
610
+ startChat(message, attachments, faqId, agentSuggestionId, mentions, fuaId, scId);
611
+ }
612
+ }, [sendMessageFunction, startChat, computedCurrentOption, sidebarHasError]);
613
+ var handleGoHome = useCallback(function () {
614
+ // Si estamos en una conversación y vamos a home, resetear initialChatId y incrementar newChatKey
615
+ if (currentOption === options.chat) {
616
+ // No cortamos la generación: la sesión sigue respondiendo en background.
617
+ setInitialChatId(null);
618
+ setNewChatKey(function (prev) {
619
+ return prev + 1;
620
+ });
621
+ setIsWriting(false);
622
+ // No borrar el cliente si es agente de clientes (igual que el proyecto se mantiene)
623
+ if ((agent === null || agent === void 0 ? void 0 : agent.entity) !== 'client') {
624
+ setClient === null || setClient === void 0 || setClient(null);
625
+ }
626
+ if (section !== 'task') {
627
+ setTask === null || setTask === void 0 || setTask(null);
628
+ }
629
+ }
630
+ if ((!agent || agent !== null && agent !== void 0 && agent.is_deleted || agent !== null && agent !== void 0 && agent.has_not_permissions || agent !== null && agent !== void 0 && agent.has_not_access || agent !== null && agent !== void 0 && agent.project_deleted) && agents.data.length > 0) {
631
+ selectAgent(agents.data[0]);
632
+ }
633
+ // Orchestrator en home global (header/planner): al iniciar un chat nuevo se debe volver al paso 1
634
+ // (lista de contextos recientes), por lo que hay que limpiar todo el contexto pineado.
635
+ if (isGlobalMaiaSection(section) && (agent === null || agent === void 0 ? void 0 : agent.type) === 'orchestrator') {
636
+ setProject(null);
637
+ setClient === null || setClient === void 0 || setClient(null);
638
+ setTask === null || setTask === void 0 || setTask(null);
639
+ }
640
+ setCurrentOption(options.home);
641
+ setChipsProject(null);
642
+ setHasError(false);
643
+ isWebSearchActive && toggleWebSearch();
644
+ if (resetSelectedChatRef.current) {
645
+ resetSelectedChatRef.current();
646
+ }
647
+ }, [options.home, options.chat, currentOption, isWebSearchActive, toggleWebSearch, agent, agents, selectAgent, setProject, setClient, setTask, stopGenerationFunction, section]);
648
+ goHomeRef.current = handleGoHome;
649
+ var handleStartNewChat = useCallback(function () {
650
+ var fromMyAgents = computedCurrentOption === options.myAgents;
651
+ var fromMaiakerHome = computedCurrentOption === options.home && isMaiakerAgentSelected;
652
+ if (fromMyAgents || fromMaiakerHome) {
653
+ var _resetSelectedChatRef2;
654
+ var firstAgent = agents.data[0];
655
+ if (firstAgent) {
656
+ setProject(null);
657
+ setClient === null || setClient === void 0 || setClient(null);
658
+ setTask === null || setTask === void 0 || setTask(null);
659
+ selectAgent(firstAgent);
660
+ }
661
+ setInitialChatId(null);
662
+ setNewChatKey(function (prev) {
663
+ return prev + 1;
664
+ });
665
+ setCurrentOption(options.home);
666
+ setChipsProject(null);
667
+ setHasError(false);
668
+ if (isWebSearchActive) toggleWebSearch();
669
+ (_resetSelectedChatRef2 = resetSelectedChatRef.current) === null || _resetSelectedChatRef2 === void 0 || _resetSelectedChatRef2.call(resetSelectedChatRef);
670
+ document.dispatchEvent(new CustomEvent('chat-session-changed'));
671
+ return;
672
+ }
673
+ handleGoHome();
674
+ }, [agents.data, computedCurrentOption, handleGoHome, isMaiakerAgentSelected, isWebSearchActive, selectAgent, setClient, setProject, setTask, toggleWebSearch]);
675
+ var handleResetChat = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
676
+ return _regeneratorRuntime.wrap(function (_context2) {
677
+ while (1) switch (_context2.prev = _context2.next) {
678
+ case 0:
679
+ setUserInitialMessage({
680
+ message: '',
681
+ attachments: []
682
+ });
683
+ setInitialChatId(null);
684
+ // Dispatch event to clear the input textarea
685
+ document.dispatchEvent(new CustomEvent('chat-session-changed'));
686
+ handleGoHome();
687
+ case 1:
688
+ case "end":
689
+ return _context2.stop();
690
+ }
691
+ }, _callee2);
692
+ })), [handleGoHome]);
693
+
694
+ // Botón "volver" del header (solo orchestrator):
695
+ // - Desde el chat (header o project/client/task): inicia una conversación nueva conservando el
696
+ // contexto pineado y vuelve al home (paso 2 con FAQs/FUAs).
697
+ // - En el home paso 2 (FAQs/FUAs con contexto): limpia el contexto pineado y vuelve al paso 1
698
+ // (selector de contextos recientes). En header siempre; en project/client/task solo si el
699
+ // usuario reinició el contexto (didResetContextInSection).
700
+ var handleBack = useCallback(function () {
701
+ var to = resolveAiChatBackDestination(section, agent === null || agent === void 0 ? void 0 : agent.type, computedCurrentOption, options.home);
702
+ amplitudEvent(EVENTS.aiChatBack, {
703
+ to: to
704
+ });
705
+
706
+ // Desde el chat → nueva conversación SIN borrar el contexto pineado, volviendo al home.
707
+ if (computedCurrentOption === options.chat) {
708
+ // No cortamos la generación: la sesión sigue respondiendo en background.
709
+ setIsWriting(false);
710
+ setUserInitialMessage({
711
+ message: '',
712
+ attachments: []
713
+ });
714
+ setInitialChatId(null);
715
+ setNewChatKey(function (prev) {
716
+ return prev + 1;
717
+ });
718
+ setHasError(false);
719
+ isWebSearchActive && toggleWebSearch();
720
+ if (resetSelectedChatRef.current) {
721
+ resetSelectedChatRef.current();
722
+ }
723
+ setCurrentOption(options.home);
724
+ document.dispatchEvent(new CustomEvent('chat-session-changed'));
725
+ return;
726
+ }
727
+
728
+ // Home paso 2 (contexto pineado) → limpiar el contexto y volver al paso 1 (contextos recientes).
729
+ if (computedCurrentOption === options.home && (isGlobalMaiaSection(section) || didResetContextInSection)) {
730
+ setProject(null);
731
+ setClient === null || setClient === void 0 || setClient(null);
732
+ setTask === null || setTask === void 0 || setTask(null);
733
+ setChipsProject(null);
734
+ }
735
+ }, [computedCurrentOption, section, agent === null || agent === void 0 ? void 0 : agent.type, amplitudEvent, options.home, stopGenerationFunction, isWebSearchActive, toggleWebSearch, didResetContextInSection, setProject, setClient, setTask, setChipsProject]);
736
+
737
+ // Detecta el reinicio de contexto en project/client/task: contexto pineado → vacío con el
738
+ // orchestrator (p. ej. al reseleccionar MAIA en el listado). Solo la transición cuenta, así una
739
+ // apertura fresca (contexto pineado desde la sección) no lo activa.
740
+ useEffect(function () {
741
+ var pinned = !!(task !== null && task !== void 0 && task.id || chipsProject !== null && chipsProject !== void 0 && chipsProject.projectId || client !== null && client !== void 0 && client.id || project !== null && project !== void 0 && project.id);
742
+ var wasPinned = prevHasPinnedContextRef.current;
743
+ prevHasPinnedContextRef.current = pinned;
744
+ if (!isGlobalMaiaSection(section) && (agent === null || agent === void 0 ? void 0 : agent.type) === 'orchestrator' && wasPinned && !pinned) {
745
+ setDidResetContextInSection(true);
746
+ }
747
+ }, [task === null || task === void 0 ? void 0 : task.id, chipsProject === null || chipsProject === void 0 ? void 0 : chipsProject.projectId, client === null || client === void 0 ? void 0 : client.id, project === null || project === void 0 ? void 0 : project.id, section, agent === null || agent === void 0 ? void 0 : agent.type]);
748
+ useEffect(function () {
749
+ var onMergeCreatedAgent = function onMergeCreatedAgent(evt) {
750
+ var _ref3 = evt.detail || {},
751
+ nextAgent = _ref3.agent;
752
+ if (nextAgent !== null && nextAgent !== void 0 && nextAgent.id) {
753
+ addAgent(nextAgent, {
754
+ navigateHome: false
755
+ });
756
+ }
757
+ };
758
+ document.addEventListener('maia-merge-created-agent-into-list', onMergeCreatedAgent);
759
+ return function () {
760
+ document.removeEventListener('maia-merge-created-agent-into-list', onMergeCreatedAgent);
761
+ };
762
+ }, [addAgent]);
763
+ useEffect(function () {
764
+ var onSyncEditedAgent = function onSyncEditedAgent(evt) {
765
+ var _ref4 = evt.detail || {},
766
+ nextAgent = _ref4.agent;
767
+ if (!(nextAgent !== null && nextAgent !== void 0 && nextAgent.id)) return;
768
+ updateAgent(nextAgent);
769
+ if ((agent === null || agent === void 0 ? void 0 : agent.id) === nextAgent.id) {
770
+ selectAgent(nextAgent);
771
+ }
772
+ };
773
+ document.addEventListener('maia-sync-edited-agent-from-chat', onSyncEditedAgent);
774
+ return function () {
775
+ document.removeEventListener('maia-sync-edited-agent-from-chat', onSyncEditedAgent);
776
+ };
777
+ }, [updateAgent, selectAgent, agent === null || agent === void 0 ? void 0 : agent.id]);
778
+ useEffect(function () {
779
+ var openChatView = function openChatView() {
780
+ setHasError(false);
781
+ setInitialChatId(null);
782
+ setNewChatKey(function (prev) {
783
+ return prev + 1;
784
+ });
785
+ setUserInitialMessage({
786
+ message: '',
787
+ attachments: []
788
+ });
789
+ setCurrentOption(options.chat);
790
+ document.dispatchEvent(new CustomEvent('chat-session-changed'));
791
+ };
792
+ document.addEventListener('maia-open-chat-view', openChatView);
793
+ return function () {
794
+ document.removeEventListener('maia-open-chat-view', openChatView);
795
+ };
796
+ }, []);
797
+
798
+ /**
799
+ * El ícono de MAIA del header lleva siempre al Home. Si MAIA ya está montada pero
800
+ * minimizada, el host no puede resolverlo cambiando `isOpen` (ya está en true),
801
+ * así que avisa por evento y acá restauramos y vamos al Home.
802
+ */
803
+ useEffect(function () {
804
+ var openHome = function openHome() {
805
+ applyExpandedHostTakeover({
806
+ section: 'header',
807
+ entity: {
808
+ projectId: null,
809
+ clientId: null
810
+ }
811
+ });
812
+ };
813
+ document.addEventListener('maia-open-home', openHome);
814
+ return function () {
815
+ document.removeEventListener('maia-open-home', openHome);
816
+ };
817
+ }, [applyExpandedHostTakeover]);
818
+
819
+ /**
820
+ * Otro host (proyecto, cliente, banner, header…) pide abrir MAIA mientras ya hay una
821
+ * instancia montada. Expande si estaba minimizado, aplica el contexto del host nuevo
822
+ * y va al home — sin restaurar la conversación previa (eso lo hace el pill).
823
+ */
824
+ useEffect(function () {
825
+ var openFromHost = function openFromHost(event) {
826
+ var _ref5 = event,
827
+ detail = _ref5.detail;
828
+ if (!detail) return;
829
+ applyExpandedHostTakeover(detail);
830
+ };
831
+ document.addEventListener(MAIA_OPEN_FROM_HOST_EVENT, openFromHost);
832
+ return function () {
833
+ document.removeEventListener(MAIA_OPEN_FROM_HOST_EVENT, openFromHost);
834
+ };
835
+ }, [applyExpandedHostTakeover]);
836
+
837
+ /** Mismo flujo que ChatAIMyAgents.handleUseAgent + onBack (handlers.home).
838
+ * El detail puede traer opcionalmente `project`, `client`, `task` para flows que
839
+ * necesitan preservar contexto (ej. selector de agentes desde una tarea). Si no vienen,
840
+ * se mantiene el comportamiento original de limpiar project/client. */
841
+ useEffect(function () {
842
+ var openNewChatWithAgent = function openNewChatWithAgent(event) {
843
+ var _detail$project2, _detail$client2;
844
+ var _ref6 = event,
845
+ detail = _ref6.detail;
846
+ var nextAgent = detail === null || detail === void 0 ? void 0 : detail.agent;
847
+ if (!nextAgent) return;
848
+ setProject((_detail$project2 = detail === null || detail === void 0 ? void 0 : detail.project) !== null && _detail$project2 !== void 0 ? _detail$project2 : null);
849
+ setClient === null || setClient === void 0 || setClient((_detail$client2 = detail === null || detail === void 0 ? void 0 : detail.client) !== null && _detail$client2 !== void 0 ? _detail$client2 : null);
850
+ if ((detail === null || detail === void 0 ? void 0 : detail.task) !== undefined) {
851
+ setTask === null || setTask === void 0 || setTask(detail.task);
852
+ }
853
+ selectAgent(nextAgent);
854
+ setHasError(false);
855
+ setCurrentOption(options.home);
856
+ };
857
+ document.addEventListener('maia-open-new-chat-with-agent', openNewChatWithAgent);
858
+ return function () {
859
+ document.removeEventListener('maia-open-new-chat-with-agent', openNewChatWithAgent);
860
+ };
861
+ }, [selectAgent, setClient, setProject, setTask]);
862
+
863
+ // Metadata de la session abierta (agent_type/agent_entity + contexto), emitida por useChatMessages.
864
+ useEffect(function () {
865
+ var onSessionMeta = function onSessionMeta(evt) {
866
+ var _ref7 = evt,
867
+ detail = _ref7.detail;
868
+ if (detail) setSessionMeta(detail);
869
+ };
870
+ document.addEventListener('maia-chat-session-meta', onSessionMeta);
871
+ return function () {
872
+ document.removeEventListener('maia-chat-session-meta', onSessionMeta);
873
+ };
874
+ }, []);
875
+
876
+ // Al cambiar de conversación limpiamos la metadata; el load de la nueva session la vuelve a emitir.
877
+ useEffect(function () {
878
+ setSessionMeta(null);
879
+ }, [initialChatId]);
880
+
881
+ // Cartel "continuar en un chat nuevo": se muestra al abrir una conversación de un clone legacy
882
+ // (agent_type === 'clone' con entity project/task/client). El input se reemplaza por el cartel.
883
+ var legacyContextSession = useMemo(function () {
884
+ if (computedCurrentOption !== options.chat) return null;
885
+ if (!sessionMeta || sessionMeta.agentType !== 'clone') return null;
886
+ var entity = sessionMeta.agentEntity;
887
+ if (!entity || !LEGACY_CONTEXT_ENTITIES.includes(entity)) return null;
888
+ var contextName = entity === 'task' ? sessionMeta.taskName : entity === 'project' ? sessionMeta.projectName : sessionMeta.clientName;
889
+ return {
890
+ entityType: entity,
891
+ contextName: contextName || ''
892
+ };
893
+ }, [computedCurrentOption, sessionMeta]);
894
+
895
+ // Marca el agente de la conversación legacy para que header, selector y avatar muestren el logo
896
+ // MAIA y el nombre tachado (agente obsoleto), sin depender del `type` resuelto de la sesión vieja.
897
+ useEffect(function () {
898
+ if (legacyContextSession && agent && !agent.is_legacy_context) {
899
+ selectAgent(_objectSpread(_objectSpread({}, agent), {}, {
900
+ is_legacy_context: true
901
+ }));
902
+ }
903
+ }, [legacyContextSession, agent, selectAgent]);
904
+
905
+ // Abre un chat nuevo con el orchestrator seteando el contexto del clone legacy (mismo criterio
906
+ // que clickear un contexto reciente en el home → paso 2 con FAQs/acciones de ese contexto).
907
+ var handleContinueLegacyContextInNewChat = useCallback(function () {
908
+ if (!sessionMeta) return;
909
+ var agentEntity = sessionMeta.agentEntity,
910
+ pId = sessionMeta.projectId,
911
+ pName = sessionMeta.projectName,
912
+ cId = sessionMeta.clientId,
913
+ cName = sessionMeta.clientName,
914
+ tId = sessionMeta.taskId,
915
+ tName = sessionMeta.taskName;
916
+ var orchestrator = agents.data.find(function (a) {
917
+ return a.type === 'orchestrator';
918
+ });
919
+ if (!orchestrator) return;
920
+
921
+ // Reset del chat → conversación nueva (la anterior sigue en background)
922
+ setIsWriting(false);
923
+ setUserInitialMessage({
924
+ message: '',
925
+ attachments: []
926
+ });
927
+ setInitialChatId(null);
928
+ setNewChatKey(function (prev) {
929
+ return prev + 1;
930
+ });
931
+ setHasError(false);
932
+
933
+ // Setear contexto (mismo criterio que handleSelectRecentContext del home)
934
+ setTask === null || setTask === void 0 || setTask(null);
935
+ setProject(null);
936
+ setClient === null || setClient === void 0 || setClient(null);
937
+ setChipsProject(null);
938
+ if (agentEntity === 'client' && cId != null) {
939
+ setClient === null || setClient === void 0 || setClient({
940
+ id: cId,
941
+ name: cName || ''
942
+ });
943
+ } else if (agentEntity === 'project' && pId != null) {
944
+ setProject(_objectSpread({
945
+ id: pId,
946
+ name: pName || ''
947
+ }, cId != null ? {
948
+ clientId: cId,
949
+ client: {
950
+ id: cId,
951
+ name: cName || ''
952
+ }
953
+ } : {}));
954
+ setChipsProject({
955
+ projectId: String(pId),
956
+ projectName: pName || '',
957
+ clientName: cName || ''
958
+ });
959
+ } else if (agentEntity === 'task' && tId != null) {
960
+ setTask === null || setTask === void 0 || setTask(_objectSpread(_objectSpread({
961
+ id: tId,
962
+ name: tName || ''
963
+ }, pId != null ? {
964
+ projectId: pId
965
+ } : {}), cId != null ? {
966
+ clientId: cId
967
+ } : {}));
968
+ if (cId != null) setClient === null || setClient === void 0 || setClient({
969
+ id: cId,
970
+ name: cName || ''
971
+ });
972
+ if (pId != null) {
973
+ setProject(_objectSpread({
974
+ id: pId,
975
+ name: pName || ''
976
+ }, cId != null ? {
977
+ clientId: cId,
978
+ client: {
979
+ id: cId,
980
+ name: cName || ''
981
+ }
982
+ } : {}));
983
+ setChipsProject({
984
+ projectId: String(pId),
985
+ projectName: pName || '',
986
+ clientName: cName || ''
987
+ });
988
+ }
989
+ }
990
+ selectAgent(orchestrator);
991
+ setSessionMeta(null);
992
+ setCurrentOption(options.home);
993
+ document.dispatchEvent(new CustomEvent('chat-session-changed'));
994
+ }, [sessionMeta, agents.data, selectAgent, setClient, setProject, setTask, setChipsProject, stopGenerationFunction]);
995
+ var showNewChat = computedCurrentOption !== options.chat;
996
+ var hideHeaderAgentSelector = computedCurrentOption === options.mySkills;
997
+ var isMyAgentsSection = computedCurrentOption === options.myAgents;
998
+
999
+ // Botón "volver": solo para el orchestrator.
1000
+ // - En el chat: disponible en todas las secciones (header y project/client/task).
1001
+ // - En el home paso 2 (FAQs/FUAs con contexto pineado): en el header siempre; en
1002
+ // project/client/task solo si el usuario reinició el contexto (pasó por el selector de
1003
+ // contextos recientes). En el paso 1 (sin contexto) NO se muestra.
1004
+ var hasPinnedContext = !!(task !== null && task !== void 0 && task.id || chipsProject !== null && chipsProject !== void 0 && chipsProject.projectId || client !== null && client !== void 0 && client.id || project !== null && project !== void 0 && project.id);
1005
+ var isChatView = computedCurrentOption === options.chat;
1006
+ var isHomeStep2 = computedCurrentOption === options.home && hasPinnedContext;
1007
+ var isHeaderHomeStep2 = isGlobalMaiaSection(section) && isHomeStep2;
1008
+ var isSectionResetHomeStep2 = !isGlobalMaiaSection(section) && isHomeStep2 && didResetContextInSection;
1009
+ var showBackButton = (agent === null || agent === void 0 ? void 0 : agent.type) === 'orchestrator' && !hasError && !loading && (isChatView || isHeaderHomeStep2 || isSectionResetHomeStep2);
1010
+ var handleOpenMarketplace = useCallback(function () {
1011
+ if (!window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS) {
1012
+ return;
1013
+ }
1014
+ clearAgent();
1015
+ setCurrentOption(options.myAgents);
1016
+ }, [clearAgent]);
1017
+ var handleOpenSkills = useCallback(function () {
1018
+ if (!window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS) {
1019
+ return;
1020
+ }
1021
+ setHasError(false);
1022
+ setCurrentOption(options.mySkills);
1023
+ handleGetSkills();
1024
+ }, [handleGetSkills]);
1025
+ var handleGoToMaiaker = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
1026
+ var maiakerAgent, response, data, _t;
1027
+ return _regeneratorRuntime.wrap(function (_context3) {
1028
+ while (1) switch (_context3.prev = _context3.next) {
1029
+ case 0:
1030
+ setHasError(false);
1031
+ maiakerAgent = agents.data.find(function (a) {
1032
+ return isMarketplaceGlobalCloneAgent(a);
1033
+ });
1034
+ if (maiakerAgent) {
1035
+ _context3.next = 5;
1036
+ break;
1037
+ }
1038
+ _context3.prev = 1;
1039
+ _context3.next = 2;
1040
+ return fetchMaia({
1041
+ path: "agents?agent_type=clone&entity=global&lang=".concat(mapCORLang(i18n.language)),
1042
+ method: 'GET'
1043
+ });
1044
+ case 2:
1045
+ response = _context3.sent;
1046
+ _context3.next = 3;
1047
+ return response.json();
1048
+ case 3:
1049
+ data = _context3.sent;
1050
+ maiakerAgent = (data.data || []).find(function (a) {
1051
+ return isMarketplaceGlobalCloneAgent(a);
1052
+ });
1053
+ _context3.next = 5;
1054
+ break;
1055
+ case 4:
1056
+ _context3.prev = 4;
1057
+ _t = _context3["catch"](1);
1058
+ return _context3.abrupt("return");
1059
+ case 5:
1060
+ if (maiakerAgent) {
1061
+ _context3.next = 6;
1062
+ break;
1063
+ }
1064
+ return _context3.abrupt("return");
1065
+ case 6:
1066
+ setProject(null);
1067
+ setClient === null || setClient === void 0 || setClient(null);
1068
+ setTask === null || setTask === void 0 || setTask(null);
1069
+ selectAgent(maiakerAgent);
1070
+ setCurrentOption(options.home);
1071
+ if (resetSelectedChatRef.current) {
1072
+ resetSelectedChatRef.current();
1073
+ }
1074
+ case 7:
1075
+ case "end":
1076
+ return _context3.stop();
1077
+ }
1078
+ }, _callee3, null, [[1, 4]]);
1079
+ })), [agents.data, i18n.language, selectAgent, setClient, setProject, setTask]);
1080
+ var handleDeleteAgentFromMyAgents = useCallback(function (agentId) {
1081
+ removeAgent(agentId);
1082
+ if ((agent === null || agent === void 0 ? void 0 : agent.id) === agentId) {
1083
+ selectFirstAgent(agentId);
1084
+ }
1085
+ }, [agent === null || agent === void 0 ? void 0 : agent.id, removeAgent, selectFirstAgent]);
1086
+
1087
+ // El footer (input) se oculta solo en el home marketplace de Maiaker (browse de agentes).
1088
+ // El home del orchestrator sí permite escribir, así que mantiene el footer.
1089
+ var isMaiakerCreatorHome = computedCurrentOption === options.home && isMaiakerAgentSelected;
1090
+ var modalPanel = /*#__PURE__*/_jsxs(_Fragment, {
1091
+ children: [validateAccessByFeature(section, user) && !isFloating ? /*#__PURE__*/_jsx(Sidebar, {
1092
+ onGoToChat: goToChat,
1093
+ onError: function onError() {
1094
+ return setSidebarHasError(true);
1095
+ },
1096
+ handleGoToHome: handleGoHome,
1097
+ handleStartNewChat: handleStartNewChat,
1098
+ handleOpenMarketplace: handleOpenMarketplace,
1099
+ showNewChat: showNewChat,
1100
+ refetchChats: refetchChats,
1101
+ handleSetRefetchChats: setRefetchChats,
1102
+ hasError: sidebarHasError,
1103
+ resetSelectedChatRef: resetSelectedChatRef,
1104
+ agentsNavActive: sidebarAgentsNavActive,
1105
+ handleOpenSkills: handleOpenSkills,
1106
+ isLegacyContextSession: !!legacyContextSession
1107
+ }) : null, /*#__PURE__*/_jsxs(SCCAIMContent, {
1108
+ expanded: expanded,
1109
+ floating: isFloating,
1110
+ children: [/*#__PURE__*/_jsx(ChatAIModalHeader, {
1111
+ layoutMode: layoutMode,
1112
+ onLayoutModeChange: handleLayoutModeChange,
1113
+ expanded: expanded,
1114
+ draggable: isFloating,
1115
+ onDragStart: handleDragStart,
1116
+ onDragMove: handleDragMove,
1117
+ onDragEnd: handleDragEnd,
1118
+ handleMinimize: handleMinimize,
1119
+ agents: agents.data,
1120
+ hasError: !!agentError,
1121
+ loading: loading,
1122
+ loadingMore: loadingMore,
1123
+ hasMore: agents.has_more,
1124
+ handleResetChat: handleResetChat,
1125
+ onAgentUpdate: updateAgentFavorite,
1126
+ loadMoreAgents: loadMoreAgents,
1127
+ sortAgentsList: sortAgentsList,
1128
+ isMyAgentsSection: isMyAgentsSection,
1129
+ isMaiakerSection: isMaiakerCreatorHome,
1130
+ hideAgentSelector: hideHeaderAgentSelector,
1131
+ showBackButton: showBackButton,
1132
+ onBack: handleBack
1133
+ }), hasError ? /*#__PURE__*/_jsx(MAIAError, {}) : validateAccessByFeature(section, user) ? /*#__PURE__*/_jsx(ChatAIContent, {
1134
+ currentOption: computedCurrentOption,
1135
+ handlers: _objectSpread(_objectSpread({}, handlers), {}, {
1136
+ chat: startChat,
1137
+ home: handlers.home,
1138
+ handleGoHome: handleGoHome
1139
+ }),
1140
+ onError: function onError() {
1141
+ return setHasError(true);
1142
+ },
1143
+ refs: {
1144
+ userInitialMessage: userInitialMessage,
1145
+ initialChatId: initialChatId
1146
+ },
1147
+ onSendMessageReady: handleSendMessageReady,
1148
+ expanded: expanded,
1149
+ floating: isFloating,
1150
+ agents: agents.data,
1151
+ loadingAgents: loading,
1152
+ onDeleteAgent: handleDeleteAgentFromMyAgents,
1153
+ onFavoriteAgentUpdate: updateAgentFavorite,
1154
+ hasMoreAgents: !!agents.has_more,
1155
+ loadingMoreAgents: loadingMore,
1156
+ onLoadMoreAgents: loadMoreAgents,
1157
+ onGoToMaiaker: handleGoToMaiaker,
1158
+ skills: skills,
1159
+ loadingSkills: loadingSkills,
1160
+ onDeleteSkill: removeSkill,
1161
+ onSearchAgents: searchCustomAgents,
1162
+ searchLoadingAgents: searchLoading,
1163
+ agentError: agentError
1164
+ }) : /*#__PURE__*/_jsx(ProjectSummaryContent, {
1165
+ onRestartSummary: handlers.home
1166
+ }), (computedCurrentOption === options.home && !!(agents !== null && agents !== void 0 && (_agents$data = agents.data) !== null && _agents$data !== void 0 && _agents$data.length) || computedCurrentOption === options.chat) && !isMaiakerCreatorHome && !hasError && !loading && validateAccessByFeature(section, user) && /*#__PURE__*/_jsx(ChatAiModalFooter, {
1167
+ agent: agent,
1168
+ handleSendMessage: handleSendMessage,
1169
+ handleStopGeneration: stopGenerationFunction,
1170
+ isStreaming: isStreaming,
1171
+ isWriting: isWriting,
1172
+ chatId: initialChatId,
1173
+ newChatKey: newChatKey,
1174
+ tooltipZIndex: tooltipZIndex,
1175
+ legacyContextSession: legacyContextSession,
1176
+ onContinueInNewChat: handleContinueLegacyContextInNewChat,
1177
+ layoutMode: layoutMode
1178
+ })]
1179
+ })]
1180
+ });
1181
+ var contentWrapper = /*#__PURE__*/_jsx(SCCAIMContentWrapper, {
1182
+ expanded: expanded,
1183
+ floating: isFloating,
1184
+ ref: contentWrapperRef,
1185
+ children: modalPanel
1186
+ });
1187
+ return selector && /*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/_jsxs(SCCAIMWrapper, {
1188
+ expanded: expanded,
1189
+ layoutMode: layoutMode,
1190
+ dragPosition: resolvedDragPosition,
1191
+ elevated: section === 'task',
1192
+ $minimized: isMinimized,
1193
+ children: [/*#__PURE__*/_jsx(SCCAIMMinimizedHide, {
1194
+ $hidden: isMinimized,
1195
+ children: /*#__PURE__*/_jsx(FloatingPanelMotion, {
1196
+ tilt: tiltMotion,
1197
+ expanded: expanded,
1198
+ children: contentWrapper
1199
+ })
1200
+ }), isMinimized && /*#__PURE__*/_jsx(MaiaMinimizedPill, {
1201
+ unreadCount: unreadCount,
1202
+ isStreaming: hasActiveStream,
1203
+ onRestore: handleRestoreFromMinimized
1204
+ }), userHasPermissions && /*#__PURE__*/_jsx(AbmAgentModal, {
1205
+ addAgent: addAgent,
1206
+ updateAgent: updateAgent,
1207
+ removeAgent: removeAgent,
1208
+ updateAgentFavorite: updateAgentFavorite,
1209
+ selectFirstAgent: selectFirstAgent
1210
+ }), userHasPermissions && /*#__PURE__*/_jsx(AbmSkillModal, {
1211
+ addSkill: addSkill,
1212
+ updateSkillInList: updateSkillInList,
1213
+ removeSkill: removeSkill
1214
+ }), userHasPermissions && /*#__PURE__*/_jsx(AbmSkillGenerateModal, {}), /*#__PURE__*/_jsx(Snackbar, {})]
1215
+ }), selector);
1216
+ };
1217
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsInVzZVJlZiIsInVzZUVmZmVjdCIsInVzZUxheW91dEVmZmVjdCIsIlJlYWN0RE9NIiwibW9tZW50IiwidXNlVHJhbnNsYXRpb24iLCJ1c2VVc2VyIiwiY2FuQWNjZXNzVG9DaGF0QUkiLCJNQUlBRXJyb3IiLCJ1c2VNYWlhVGFza1BhbmVsWkluZGV4IiwiQ2hhdEFJQ29udGVudCIsImJ1aWxkSGFuZGxlcnMiLCJvcHRpb25zIiwiU2lkZWJhciIsInVzZUdldEFnZW50cyIsInVzZUdldFNraWxscyIsInVzZUdsb2JhbENvbnRleHQiLCJDaGF0QUlNb2RhbEhlYWRlciIsIlNuYWNrYmFyIiwiUHJvamVjdFN1bW1hcnlDb250ZW50IiwiQWJtQWdlbnRNb2RhbCIsIkFibVNraWxsTW9kYWwiLCJBYm1Ta2lsbEdlbmVyYXRlTW9kYWwiLCJTRUNUSU9OUyIsIlNDQ0FJTUNvbnRlbnQiLCJTQ0NBSU1Db250ZW50V3JhcHBlciIsIlNDQ0FJTU1pbmltaXplZEhpZGUiLCJTQ0NBSU1XcmFwcGVyIiwiTWFpYU1pbmltaXplZFBpbGwiLCJnZXRNYWlhRmxvYXRpbmdQYW5lbFdpZHRoUHgiLCJyZXNvbHZlSW5pdGlhbE1haWFDaGF0TGF5b3V0TW9kZSIsInNldFN0b3JlZE1haWFDaGF0TGF5b3V0TW9kZSIsIkZsb2F0aW5nUGFuZWxNb3Rpb24iLCJ1c2VGbG9hdGluZ1BhbmVsRHJhZ1RpbHQiLCJDaGF0QWlNb2RhbEZvb3RlciIsInZhbGlkYXRlSXNNYWlhIiwiaXNNYXJrZXRwbGFjZUdsb2JhbENsb25lQWdlbnQiLCJ1c2VGYXFzU3RvcmUiLCJnZXRDaGF0c1N0b3JlU3RhdGUiLCJ1c2VDaGF0c1N0b3JlIiwicmVhZExhc3RBY3RpdmVDaGF0SWQiLCJ3cml0ZUxhc3RBY3RpdmVDaGF0SWQiLCJ1c2VTZXNzaW9uc1N0b3JlIiwiaXNBY3RpdmVTZXNzaW9uU3RhdHVzIiwiZmV0Y2hNYWlhIiwibWFwQ09STGFuZyIsIkVWRU5UUyIsInVzZUV2ZW50IiwiTUFJQV9PUEVOX0ZST01fSE9TVF9FVkVOVCIsImpzeCIsIl9qc3giLCJqc3hzIiwiX2pzeHMiLCJGcmFnbWVudCIsIl9GcmFnbWVudCIsIkxFR0FDWV9DT05URVhUX0VOVElUSUVTIiwiaXNHbG9iYWxNYWlhU2VjdGlvbiIsInNlY3Rpb24iLCJyZXNvbHZlQWlDaGF0QmFja0Rlc3RpbmF0aW9uIiwiYWdlbnRUeXBlIiwiY3VycmVudE9wdGlvbiIsImhvbWVPcHRpb24iLCJJRF9NT0RBTF9DSEFUX0FHRU5UIiwidmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUiLCJ1c2VyIiwiQm9vbGVhbiIsIndpbmRvdyIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTUyIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMiLCJDaGF0QUlNb2RhbCIsIl91c2VyJHBlcm1pc3Npb25zIiwiX3VzZXIkcGVybWlzc2lvbnMyIiwiX3VzZXIkcGVybWlzc2lvbnMzIiwiX2FnZW50cyRkYXRhIiwiX3VzZVRyYW5zbGF0aW9uIiwiYWJtQWdlbnQiLCJpMThuIiwiYW1wbGl0dWRFdmVudCIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsImlzTWluaW1pemVkIiwic2V0SXNNaW5pbWl6ZWQiLCJzZXRDaGF0Vmlld1Zpc2libGUiLCJzdGF0ZSIsInVucmVhZENvdW50IiwiYWN0aXZlQ2hhdElkIiwiaGFzQWN0aXZlU3RyZWFtIiwiT2JqZWN0IiwidmFsdWVzIiwibWV0YSIsInNvbWUiLCJzdGF0dXMiLCJnb1RvQ2hhdFJlZiIsImdvSG9tZVJlZiIsImlkIiwiaGFuZGxlTWluaW1pemUiLCJhaUNoYXRNaW5pbWl6ZSIsImZvY3VzQ2hhdElucHV0Iiwic2V0VGltZW91dCIsImRvY3VtZW50IiwiZGlzcGF0Y2hFdmVudCIsIkN1c3RvbUV2ZW50IiwiX3VzZVN0YXRlMyIsIm1lc3NhZ2UiLCJhdHRhY2htZW50cyIsIl91c2VTdGF0ZTQiLCJ1c2VySW5pdGlhbE1lc3NhZ2UiLCJzZXRVc2VySW5pdGlhbE1lc3NhZ2UiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsImluaXRpYWxDaGF0SWQiLCJzZXRJbml0aWFsQ2hhdElkIiwiX3VzZVN0YXRlNyIsIl91c2VTdGF0ZTgiLCJuZXdDaGF0S2V5Iiwic2V0TmV3Q2hhdEtleSIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUwIiwic2Vzc2lvbk1ldGEiLCJzZXRTZXNzaW9uTWV0YSIsIl91c2VTdGF0ZTEiLCJfdXNlU3RhdGUxMCIsInNlbmRNZXNzYWdlRnVuY3Rpb24iLCJzZXRTZW5kTWVzc2FnZUZ1bmN0aW9uIiwiX3VzZVN0YXRlMTEiLCJfdXNlU3RhdGUxMiIsInN0b3BHZW5lcmF0aW9uRnVuY3Rpb24iLCJzZXRTdG9wR2VuZXJhdGlvbkZ1bmN0aW9uIiwiX3VzZVN0YXRlMTMiLCJfdXNlU3RhdGUxNCIsImlzU3RyZWFtaW5nIiwic2V0SXNTdHJlYW1pbmciLCJfdXNlU3RhdGUxNSIsIl91c2VTdGF0ZTE2IiwiaXNXcml0aW5nIiwic2V0SXNXcml0aW5nIiwiX3VzZVN0YXRlMTciLCJfdXNlU3RhdGUxOCIsInJlZmV0Y2hDaGF0cyIsInNldFJlZmV0Y2hDaGF0cyIsIl91c2VTdGF0ZTE5IiwiaG9tZSIsIl91c2VTdGF0ZTIwIiwic2V0Q3VycmVudE9wdGlvbiIsIl91c2VTdGF0ZTIxIiwiX3VzZVN0YXRlMjIiLCJoYXNFcnJvciIsInNldEhhc0Vycm9yIiwiX3VzZVN0YXRlMjMiLCJfdXNlU3RhdGUyNCIsImRpZFJlc2V0Q29udGV4dEluU2VjdGlvbiIsInNldERpZFJlc2V0Q29udGV4dEluU2VjdGlvbiIsInByZXZIYXNQaW5uZWRDb250ZXh0UmVmIiwiaGFuZGxlcnMiLCJfdXNlU3RhdGUyNSIsIl91c2VTdGF0ZTI2Iiwic2lkZWJhckhhc0Vycm9yIiwic2V0U2lkZWJhckhhc0Vycm9yIiwicmVzZXRTZWxlY3RlZENoYXRSZWYiLCJsYW5nIiwibGFuZ3VhZ2UiLCJsb2NhbGUiLCJfdXNlR2xvYmFsQ29udGV4dCIsInNlbGVjdEFnZW50IiwiY2xlYXJBZ2VudCIsImFnZW50IiwicHJvamVjdCIsImNsaWVudCIsInRhc2siLCJjaGlwc1Byb2plY3QiLCJ0b2dnbGVXZWJTZWFyY2giLCJpc1dlYlNlYXJjaEFjdGl2ZSIsInNldENoaXBzUHJvamVjdCIsInNldENsaWVudCIsInNldFByb2plY3QiLCJiYW5uZXJFbnRyeUZhcSIsInNldFRhc2siLCJ0b29sdGlwWkluZGV4IiwiX3VzZUdldEFnZW50cyIsImhhbmRsZUdvSG9tZSIsImFnZW50cyIsImxvYWRpbmciLCJsb2FkaW5nTW9yZSIsImFnZW50RXJyb3IiLCJlcnJvciIsImhhbmRsZUdldEFnZW50cyIsImxvYWRNb3JlQWdlbnRzIiwic2VhcmNoQ3VzdG9tQWdlbnRzIiwic2VhcmNoTG9hZGluZyIsImFkZEFnZW50IiwicmVtb3ZlQWdlbnQiLCJ1cGRhdGVBZ2VudCIsInVwZGF0ZUFnZW50RmF2b3JpdGUiLCJzZWxlY3RGaXJzdEFnZW50Iiwic29ydEFnZW50c0xpc3QiLCJfdXNlR2V0U2tpbGxzIiwic2tpbGxzIiwibG9hZGluZ1NraWxscyIsImhhbmRsZUdldFNraWxscyIsImFkZFNraWxsIiwidXBkYXRlU2tpbGxJbkxpc3QiLCJyZW1vdmVTa2lsbCIsImlzTUFJQSIsInVzZXJIYXNQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwiYWlfYWdlbnRzIiwiY3JlYXRlIiwiZWRpdCIsImNvbXB1dGVkQ3VycmVudE9wdGlvbiIsImlzR2xvYmFsU3BlY2lhbGlzdCIsImVudGl0eSIsImlzUHJvamVjdFNwZWNpYWxpc3QiLCJpc0NsaWVudFNwZWNpYWxpc3QiLCJpc01haWFrZXIiLCJteUFnZW50cyIsIm15U2tpbGxzIiwidHlwZSIsImNoYXQiLCJzaG91bGRTaG93UHJvamVjdFNlbGVjdG9yIiwic2hvdWxkU2hvd0NsaWVudFNlbGVjdG9yIiwicHJvamVjdFNlbGVjdG9yIiwiY2xpZW50U2VsZWN0b3IiLCJuYW1lIiwiaXNNYWlha2VyQWdlbnRTZWxlY3RlZCIsInNpZGViYXJBZ2VudHNOYXZBY3RpdmUiLCJhZ2VudHNGZXRjaGVkUmVmIiwic2VsZWN0b3IiLCJxdWVyeVNlbGVjdG9yIiwiY29uY2F0IiwiX3VzZVN0YXRlMjciLCJfdXNlU3RhdGUyOCIsImxheW91dE1vZGUiLCJzZXRMYXlvdXRNb2RlIiwiaGFuZGxlTGF5b3V0TW9kZUNoYW5nZSIsIm1vZGUiLCJleHBhbmRlZCIsImlzRmxvYXRpbmciLCJjb250ZW50V3JhcHBlclJlZiIsIl91c2VTdGF0ZTI5IiwiX3VzZVN0YXRlMzAiLCJkcmFnUG9zaXRpb24iLCJzZXREcmFnUG9zaXRpb24iLCJfdXNlRmxvYXRpbmdQYW5lbERyYWciLCJ0aWx0TW90aW9uIiwic3RhcnRQb2ludGVyVHJhY2tpbmciLCJzYW1wbGVQb2ludGVyTW92ZSIsImVuZFBvaW50ZXJUcmFja2luZyIsImRyYWdTdGF0ZVJlZiIsImNsYW1wRHJhZ1Bvc2l0aW9uIiwieCIsInkiLCJjb250ZW50V3JhcHBlciIsImN1cnJlbnQiLCJfY29udGVudFdyYXBwZXIkZ2V0Qm8iLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ3aWR0aCIsImhlaWdodCIsIm9mZnNldCIsIm1heFgiLCJNYXRoIiwibWF4IiwiaW5uZXJXaWR0aCIsIm1heFkiLCJpbm5lckhlaWdodCIsIm1pbiIsInByZXYiLCJwYWQiLCJoYW5kbGVEcmFnRW5kIiwiZXZlbnQiLCJfZHJhZ1N0YXRlUmVmJGN1cnJlbnQiLCJwb2ludGVySWQiLCJib2R5Iiwic3R5bGUiLCJ1c2VyU2VsZWN0IiwiY3Vyc29yIiwiaGFuZGxlRHJhZ01vdmUiLCJkcmFnU3RhdGUiLCJjbGllbnRYIiwiY2xpZW50WSIsIm5leHRQb3NpdGlvbiIsIm9mZnNldFgiLCJvZmZzZXRZIiwicmVzb2x2ZWREcmFnUG9zaXRpb24iLCJoYW5kbGVEcmFnU3RhcnQiLCJidXR0b24iLCJ0YXJnZXQiLCJjbG9zZXN0IiwicmVjdCIsImluaXRpYWxQb3NpdGlvbiIsImxlZnQiLCJ0b3AiLCJwb2ludGVyT2Zmc2V0WCIsInBvaW50ZXJPZmZzZXRZIiwiY3VycmVudFRhcmdldCIsInNldFBvaW50ZXJDYXB0dXJlIiwicHJldmVudERlZmF1bHQiLCJhaUNoYXREcmFnZ2FibGUiLCJzdGFydENoYXQiLCJmYXFJZCIsImFnZW50U3VnZ2VzdGlvbklkIiwibWVudGlvbnMiLCJmdWFJZCIsInNjSWQiLCJjb250ZXh0RGF0YSIsIl9vYmplY3RTcHJlYWQiLCJsZW5ndGgiLCJiYW5uZXJGYXFBdXRvU2VudFJlZiIsIl9iYW5uZXJFbnRyeUZhcSRmYXFUaSIsImVudGl0eVJlYWR5IiwiZmFxVGl0bGUiLCJ0cmltIiwidW5kZWZpbmVkIiwiZ29Ub0NoYXQiLCJzZXNzaW9uRXh0ZXJuYWxJZCIsInNlbGVjdGVkQWdlbnQiLCJkYXRhIiwiZmluZCIsImFnZW50SXRlbSIsImFnZW50SWQiLCJlbnN1cmVBZ2VudHNMb2FkZWQiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZSIsIndyYXAiLCJfY29udGV4dCIsIm5leHQiLCJhYnJ1cHQiLCJzdG9wIiwiaGFuZGxlUmVzdG9yZUZyb21NaW5pbWl6ZWQiLCJhaUNoYXRPcGVuIiwib3B0aW9uIiwidGhlbiIsIl9jaGF0cyRmaW5kIiwiX2dldENoYXRzU3RvcmVTdGF0ZSIsImNoYXRzIiwibGFzdEFjdGl2ZUNoYXRJZCIsImlzUmVhZCIsIl9nb1RvQ2hhdFJlZiRjdXJyZW50IiwiY2FsbCIsIl9nb0hvbWVSZWYkY3VycmVudCIsImFwcGx5RXhwYW5kZWRIb3N0VGFrZW92ZXIiLCJkZXRhaWwiLCJfcmVzZXRTZWxlY3RlZENoYXRSZWYiLCJnZXRTdGF0ZSIsImNsZWFyRmFxcyIsInNldEFjdGl2ZUNoYXRJZCIsIl9kZXRhaWwkcHJvamVjdCIsIl9kZXRhaWwkY2xpZW50IiwiX2RldGFpbCR0YXNrIiwibmV4dExheW91dCIsImZhcSIsImhhbmRsZVNlbmRNZXNzYWdlUmVhZHkiLCJzZW5kTWVzc2FnZSIsInN0b3BHZW5lcmF0aW9uIiwic3RyZWFtaW5nIiwid3JpdGluZyIsImhhbmRsZVNlbmRNZXNzYWdlIiwiaXNfZGVsZXRlZCIsImhhc19ub3RfcGVybWlzc2lvbnMiLCJoYXNfbm90X2FjY2VzcyIsInByb2plY3RfZGVsZXRlZCIsImhhbmRsZVN0YXJ0TmV3Q2hhdCIsImZyb21NeUFnZW50cyIsImZyb21NYWlha2VySG9tZSIsIl9yZXNldFNlbGVjdGVkQ2hhdFJlZjIiLCJmaXJzdEFnZW50IiwiaGFuZGxlUmVzZXRDaGF0IiwiX2NhbGxlZTIiLCJfY29udGV4dDIiLCJoYW5kbGVCYWNrIiwidG8iLCJhaUNoYXRCYWNrIiwicGlubmVkIiwicHJvamVjdElkIiwid2FzUGlubmVkIiwib25NZXJnZUNyZWF0ZWRBZ2VudCIsImV2dCIsIl9yZWYzIiwibmV4dEFnZW50IiwibmF2aWdhdGVIb21lIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJvblN5bmNFZGl0ZWRBZ2VudCIsIl9yZWY0Iiwib3BlbkNoYXRWaWV3Iiwib3BlbkhvbWUiLCJjbGllbnRJZCIsIm9wZW5Gcm9tSG9zdCIsIl9yZWY1Iiwib3Blbk5ld0NoYXRXaXRoQWdlbnQiLCJfZGV0YWlsJHByb2plY3QyIiwiX2RldGFpbCRjbGllbnQyIiwiX3JlZjYiLCJvblNlc3Npb25NZXRhIiwiX3JlZjciLCJsZWdhY3lDb250ZXh0U2Vzc2lvbiIsImFnZW50RW50aXR5IiwiaW5jbHVkZXMiLCJjb250ZXh0TmFtZSIsInRhc2tOYW1lIiwicHJvamVjdE5hbWUiLCJjbGllbnROYW1lIiwiZW50aXR5VHlwZSIsImlzX2xlZ2FjeV9jb250ZXh0IiwiaGFuZGxlQ29udGludWVMZWdhY3lDb250ZXh0SW5OZXdDaGF0IiwicElkIiwicE5hbWUiLCJjSWQiLCJjTmFtZSIsInRJZCIsInRhc2tJZCIsInROYW1lIiwib3JjaGVzdHJhdG9yIiwiYSIsIlN0cmluZyIsInNob3dOZXdDaGF0IiwiaGlkZUhlYWRlckFnZW50U2VsZWN0b3IiLCJpc015QWdlbnRzU2VjdGlvbiIsImhhc1Bpbm5lZENvbnRleHQiLCJpc0NoYXRWaWV3IiwiaXNIb21lU3RlcDIiLCJpc0hlYWRlckhvbWVTdGVwMiIsImlzU2VjdGlvblJlc2V0SG9tZVN0ZXAyIiwic2hvd0JhY2tCdXR0b24iLCJoYW5kbGVPcGVuTWFya2V0cGxhY2UiLCJoYW5kbGVPcGVuU2tpbGxzIiwiaGFuZGxlR29Ub01haWFrZXIiLCJfY2FsbGVlMyIsIm1haWFrZXJBZ2VudCIsInJlc3BvbnNlIiwiX3QiLCJfY29udGV4dDMiLCJwYXRoIiwibWV0aG9kIiwic2VudCIsImpzb24iLCJoYW5kbGVEZWxldGVBZ2VudEZyb21NeUFnZW50cyIsImlzTWFpYWtlckNyZWF0b3JIb21lIiwibW9kYWxQYW5lbCIsImNoaWxkcmVuIiwib25Hb1RvQ2hhdCIsIm9uRXJyb3IiLCJoYW5kbGVHb1RvSG9tZSIsImhhbmRsZVNldFJlZmV0Y2hDaGF0cyIsImFnZW50c05hdkFjdGl2ZSIsImlzTGVnYWN5Q29udGV4dFNlc3Npb24iLCJmbG9hdGluZyIsIm9uTGF5b3V0TW9kZUNoYW5nZSIsImRyYWdnYWJsZSIsIm9uRHJhZ1N0YXJ0Iiwib25EcmFnTW92ZSIsIm9uRHJhZ0VuZCIsImhhc01vcmUiLCJoYXNfbW9yZSIsIm9uQWdlbnRVcGRhdGUiLCJpc01haWFrZXJTZWN0aW9uIiwiaGlkZUFnZW50U2VsZWN0b3IiLCJvbkJhY2siLCJyZWZzIiwib25TZW5kTWVzc2FnZVJlYWR5IiwibG9hZGluZ0FnZW50cyIsIm9uRGVsZXRlQWdlbnQiLCJvbkZhdm9yaXRlQWdlbnRVcGRhdGUiLCJoYXNNb3JlQWdlbnRzIiwibG9hZGluZ01vcmVBZ2VudHMiLCJvbkxvYWRNb3JlQWdlbnRzIiwib25Hb1RvTWFpYWtlciIsIm9uRGVsZXRlU2tpbGwiLCJvblNlYXJjaEFnZW50cyIsInNlYXJjaExvYWRpbmdBZ2VudHMiLCJvblJlc3RhcnRTdW1tYXJ5IiwiaGFuZGxlU3RvcEdlbmVyYXRpb24iLCJjaGF0SWQiLCJvbkNvbnRpbnVlSW5OZXdDaGF0IiwicmVmIiwiY3JlYXRlUG9ydGFsIiwiZWxldmF0ZWQiLCIkbWluaW1pemVkIiwiJGhpZGRlbiIsInRpbHQiLCJvblJlc3RvcmUiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9tb2xlY3VsZXMvQ2hhdEFJTW9kYWwvQ2hhdEFJTW9kYWwudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvaW5kZW50ICovXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9qc3gtbm8tdXNlbGVzcy1mcmFnbWVudCAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3Qvbm8tYXJyYXktaW5kZXgta2V5ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBqc3gtYTExeS9jbGljay1ldmVudHMtaGF2ZS1rZXktZXZlbnRzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBqc3gtYTExeS9uby1zdGF0aWMtZWxlbWVudC1pbnRlcmFjdGlvbnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L2Z1bmN0aW9uLWNvbXBvbmVudC1kZWZpbml0aW9uICovXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9yZXF1aXJlLWRlZmF1bHQtcHJvcHMgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbmltcG9ydCB7XG4gIHVzZUNhbGxiYWNrLFxuICB1c2VNZW1vLFxuICB1c2VTdGF0ZSxcbiAgdXNlUmVmLFxuICB1c2VFZmZlY3QsXG4gIHVzZUxheW91dEVmZmVjdCxcbiAgUG9pbnRlckV2ZW50IGFzIFJlYWN0UG9pbnRlckV2ZW50LFxufSBmcm9tICdyZWFjdCdcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCdcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAncmVhY3QtaTE4bmV4dCdcbmltcG9ydCB7IHVzZVVzZXIgfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0L2Nvci11c2VyJ1xuaW1wb3J0IHsgY2FuQWNjZXNzVG9DaGF0QUkgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvcGVybWlzc2lvbnMnXG5pbXBvcnQgeyBNQUlBRXJyb3IgfSBmcm9tICcuLi8uLi9hdG9tcy9NQUlBRXJyb3InXG5pbXBvcnQgeyB1c2VNYWlhVGFza1BhbmVsWkluZGV4IH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlTWFpYVRhc2tQYW5lbFpJbmRleCdcblxuaW1wb3J0IHsgQ2hhdEFJQ29udGVudCB9IGZyb20gJy4uL0NoYXRBSUNvbnRlbnQnXG5pbXBvcnQgeyBidWlsZEhhbmRsZXJzLCBvcHRpb25zIH0gZnJvbSAnLi9jb25zdGFudHMnXG5pbXBvcnQgeyBTaWRlYmFyIH0gZnJvbSAnLi4vU2lkZWJhcidcbmltcG9ydCB7IHVzZUdldEFnZW50cyB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL21haWEvQWdlbnRzL2dldEFnZW50cydcbmltcG9ydCB7IHVzZUdldFNraWxscyB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL21haWEvU2tpbGxzL2dldFNraWxscydcbmltcG9ydCB7IHVzZUdsb2JhbENvbnRleHQsIHR5cGUgU2VjdGlvbiB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHQvZ2xvYmFsLWNvbnRleHQnXG5pbXBvcnQgeyBBdHRhY2htZW50RmlsZSB9IGZyb20gJy4uL0NoYXRGb290ZXIvQ2hhdEZvb3RlcidcbmltcG9ydCB7IENvbnRleHRNZW50aW9uIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvY29udGV4dE1lbnRpb24nXG5pbXBvcnQgeyBDaGF0QUlNb2RhbEhlYWRlciB9IGZyb20gJy4vY29tcG9uZW50cy9DaGF0QWlNb2RhbEhlYWRlci9DaGF0QWlNb2RhbEhlYWRlcidcbmltcG9ydCB7IFNuYWNrYmFyIH0gZnJvbSAnLi4vLi4vb3JnYW5pc21zL1NuYWNrQmFyL1NuYWNrYmFyJ1xuaW1wb3J0IHsgUHJvamVjdFN1bW1hcnlDb250ZW50IH0gZnJvbSAnLi4vUHJvamVjdFN1bW1hcnlDb250ZW50J1xuaW1wb3J0IHsgQWJtQWdlbnRNb2RhbCB9IGZyb20gJy4uLy4uL29yZ2FuaXNtcy9BYm1BZ2VudE1vZGFsL0FibUFnZW50TW9kYWwnXG5pbXBvcnQgeyBBYm1Ta2lsbE1vZGFsIH0gZnJvbSAnLi4vLi4vb3JnYW5pc21zL0FibVNraWxsTW9kYWwvQWJtU2tpbGxNb2RhbCdcbmltcG9ydCB7IEFibVNraWxsR2VuZXJhdGVNb2RhbCB9IGZyb20gJy4uLy4uL29yZ2FuaXNtcy9BYm1Ta2lsbEdlbmVyYXRlTW9kYWwvQWJtU2tpbGxHZW5lcmF0ZU1vZGFsJ1xuaW1wb3J0IHsgU0VDVElPTlMgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvY29uZmlnJ1xuaW1wb3J0IHsgU0NDQUlNQ29udGVudCwgU0NDQUlNQ29udGVudFdyYXBwZXIsIFNDQ0FJTU1pbmltaXplZEhpZGUsIFNDQ0FJTVdyYXBwZXIgfSBmcm9tICcuL0NoYXRBSU1vZGFsLnN0eWxlcydcbmltcG9ydCB7IE1haWFNaW5pbWl6ZWRQaWxsIH0gZnJvbSAnLi9jb21wb25lbnRzL01haWFNaW5pbWl6ZWRQaWxsJ1xuaW1wb3J0IHtcbiAgZ2V0TWFpYUZsb2F0aW5nUGFuZWxXaWR0aFB4LFxuICBNYWlhQ2hhdE1vZGFsTGF5b3V0TW9kZSxcbiAgcmVzb2x2ZUluaXRpYWxNYWlhQ2hhdExheW91dE1vZGUsXG4gIHNldFN0b3JlZE1haWFDaGF0TGF5b3V0TW9kZSxcbn0gZnJvbSAnLi9sYXlvdXQnXG5pbXBvcnQgeyBGbG9hdGluZ1BhbmVsTW90aW9uLCB1c2VGbG9hdGluZ1BhbmVsRHJhZ1RpbHQgfSBmcm9tICcuL2Zsb2F0aW5nUGFuZWxNb3Rpb24nXG5pbXBvcnQgeyBDaGF0QWlNb2RhbEZvb3RlciB9IGZyb20gJy4vY29tcG9uZW50cy9DaGF0QWlNb2RhbEZvb3RlcidcbmltcG9ydCB7IHZhbGlkYXRlSXNNYWlhIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdXRpbHMvdmFsaWRhdGVJc01haWEnXG5pbXBvcnQgeyBpc01hcmtldHBsYWNlR2xvYmFsQ2xvbmVBZ2VudCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2FnZW50RGlzcGxheU5hbWUnXG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2FnZW50J1xuaW1wb3J0IHsgUHJvamVjdCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL1Byb2plY3QnXG5pbXBvcnQgeyBDbGllbnQgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9DbGllbnQnXG5pbXBvcnQgeyBUYXNrIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvVGFzaydcbmltcG9ydCB7IHVzZUZhcXNTdG9yZSB9IGZyb20gJy4uLy4uLy4uL3N0b3JlL3VzZUZhcXNTdG9yZSdcbmltcG9ydCB7IGdldENoYXRzU3RvcmVTdGF0ZSwgdXNlQ2hhdHNTdG9yZSB9IGZyb20gJy4uLy4uLy4uL3N0b3JlL3VzZUNoYXRzU3RvcmUnXG5pbXBvcnQgdHlwZSB7IENoYXRMaXN0SXRlbSB9IGZyb20gJy4uLy4uLy4uL3N0b3JlL2NoYXRzU3RvcmUudHlwZXMnXG5pbXBvcnQgeyByZWFkTGFzdEFjdGl2ZUNoYXRJZCwgd3JpdGVMYXN0QWN0aXZlQ2hhdElkIH0gZnJvbSAnLi4vLi4vLi4vc3RvcmUvbWFpYUxhc3RDaGF0UGVyc2lzdGVuY2UnXG5pbXBvcnQgeyB1c2VTZXNzaW9uc1N0b3JlIH0gZnJvbSAnLi4vLi4vLi4vc3RvcmUvc2Vzc2lvbnMvdXNlU2Vzc2lvbnNTdG9yZSdcbmltcG9ydCB7IGlzQWN0aXZlU2Vzc2lvblN0YXR1cyB9IGZyb20gJy4uLy4uLy4uL3N0b3JlL3Nlc3Npb25zL3Nlc3Npb25zLnR5cGVzJ1xuaW1wb3J0IHsgZmV0Y2hNYWlhIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbWFpYS9jbGllbnQnXG5pbXBvcnQgeyBtYXBDT1JMYW5nIH0gZnJvbSAnLi4vLi4vLi4vbGFuZy91dGlscydcbmltcG9ydCB7IEVWRU5UUywgdXNlRXZlbnQgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VFdmVudCdcbmltcG9ydCB7IE1BSUFfT1BFTl9GUk9NX0hPU1RfRVZFTlQsIHR5cGUgTWFpYUhvc3RPcGVuRGV0YWlsIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvbWFpYUhvc3RPcGVuJ1xuXG4vKiogTWV0YWRhdGEgZGUgbGEgc2Vzc2lvbiBhYmllcnRhIChlbWl0aWRhIHBvciB1c2VDaGF0TWVzc2FnZXMgYWwgY2FyZ2FyIHVuYSBjb252ZXJzYWNpw7NuKS4gKi9cbnR5cGUgU2Vzc2lvbk1ldGEgPSB7XG4gIGNoYXRJZDogc3RyaW5nXG4gIGFnZW50VHlwZT86IHN0cmluZ1xuICBhZ2VudEVudGl0eT86IHN0cmluZ1xuICBwcm9qZWN0SWQ/OiBudW1iZXJcbiAgcHJvamVjdE5hbWU/OiBzdHJpbmdcbiAgY2xpZW50SWQ/OiBudW1iZXJcbiAgY2xpZW50TmFtZT86IHN0cmluZ1xuICB0YXNrSWQ/OiBudW1iZXJcbiAgdGFza05hbWU/OiBzdHJpbmdcbn1cblxuY29uc3QgTEVHQUNZX0NPTlRFWFRfRU5USVRJRVMgPSBbJ3Byb2plY3QnLCAndGFzaycsICdjbGllbnQnXSBhcyBjb25zdFxudHlwZSBMZWdhY3lDb250ZXh0RW50aXR5ID0gKHR5cGVvZiBMRUdBQ1lfQ09OVEVYVF9FTlRJVElFUylbbnVtYmVyXVxuXG50eXBlIEFpQ2hhdEJhY2tEZXN0aW5hdGlvbiA9ICdnbG9iYWxfY29udGV4dF9ob21lJyB8ICd0YXNrX2hvbWUnIHwgJ3BsYW5uZXJfaG9tZScgfCAncHJvamVjdF9ob21lJyB8ICdjbGllbnRfaG9tZSdcblxuLyoqIEhvbWUgZ2xvYmFsIGRlbCBvcmNoZXN0cmF0b3IgKHNvbG8gaGVhZGVyKS4gUGxhbm5lciBlcyBob21lIGRlIEZVQXMsIG5vIGRlIGNvbnRleHRvcy4gKi9cbmNvbnN0IGlzR2xvYmFsTWFpYVNlY3Rpb24gPSAoc2VjdGlvbjogU2VjdGlvbik6IGJvb2xlYW4gPT4gc2VjdGlvbiA9PT0gJ2hlYWRlcidcblxuY29uc3QgcmVzb2x2ZUFpQ2hhdEJhY2tEZXN0aW5hdGlvbiA9IChcbiAgc2VjdGlvbjogU2VjdGlvbixcbiAgYWdlbnRUeXBlOiBBZ2VudFsndHlwZSddIHwgdW5kZWZpbmVkLFxuICBjdXJyZW50T3B0aW9uOiBzdHJpbmcsXG4gIGhvbWVPcHRpb246IHN0cmluZ1xuKTogQWlDaGF0QmFja0Rlc3RpbmF0aW9uID0+IHtcbiAgaWYgKGlzR2xvYmFsTWFpYVNlY3Rpb24oc2VjdGlvbikgJiYgYWdlbnRUeXBlID09PSAnb3JjaGVzdHJhdG9yJyAmJiBjdXJyZW50T3B0aW9uID09PSBob21lT3B0aW9uKSB7XG4gICAgcmV0dXJuICdnbG9iYWxfY29udGV4dF9ob21lJ1xuICB9XG4gIGlmIChzZWN0aW9uID09PSAndGFzaycpIHJldHVybiAndGFza19ob21lJ1xuICBpZiAoc2VjdGlvbiA9PT0gJ3BsYW5uZXInKSByZXR1cm4gJ3BsYW5uZXJfaG9tZSdcbiAgaWYgKHNlY3Rpb24gPT09ICdwcm9qZWN0JykgcmV0dXJuICdwcm9qZWN0X2hvbWUnXG4gIGlmIChzZWN0aW9uID09PSAnY2xpZW50JykgcmV0dXJuICdjbGllbnRfaG9tZSdcbiAgcmV0dXJuICdnbG9iYWxfY29udGV4dF9ob21lJ1xufVxuXG5leHBvcnQgY29uc3QgSURfTU9EQUxfQ0hBVF9BR0VOVCA9ICdtb2RhbHMtcG9ydGFsLW1haWEtY2hhdC1hZ2VudCdcblxuY29uc3QgdmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUgPSAoc2VjdGlvbjogU2VjdGlvbiB8IG51bGwgfCB1bmRlZmluZWQsIHVzZXI6IFJldHVyblR5cGU8dHlwZW9mIHVzZVVzZXI+KSA9PiB7XG4gIGlmICghc2VjdGlvbiB8fCAhY2FuQWNjZXNzVG9DaGF0QUkodXNlcikpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8vIFBsYW5uZXIgeSB0YXNrIGFicmVuIHNpZW1wcmUgZWwgY2hhdCAoaG9tZSBkZSBGVUFzKSwgbnVuY2EgcmVzdW1lbiBkZSBwcm95ZWN0b3MuXG4gIGlmIChzZWN0aW9uID09PSAncGxhbm5lcicgfHwgc2VjdGlvbiA9PT0gJ3Rhc2snKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmIChzZWN0aW9uID09PSAnaGVhZGVyJykge1xuICAgIHJldHVybiBCb29sZWFuKHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MgfHwgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMpXG4gIH1cblxuICByZXR1cm4gQm9vbGVhbih3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTKVxufVxuXG5leHBvcnQgY29uc3QgQ2hhdEFJTW9kYWwgPSAoKSA9PiB7XG4gIGNvbnN0IHVzZXIgPSB1c2VVc2VyKClcbiAgY29uc3QgeyBpMThuIH0gPSB1c2VUcmFuc2xhdGlvbihbU0VDVElPTlMuYWJtQWdlbnRdKVxuICBjb25zdCBhbXBsaXR1ZEV2ZW50ID0gdXNlRXZlbnQoKVxuXG4gIC8vIE1BSUEgdml2ZSBtb250YWRhIGVuIHRvZGFzIGxhcyBwYW50YWxsYXM6IGVsIHBhbmVsIGFycmFuY2Egc2llbXByZSBjZXJyYWRvIChwaWxsIHZpc2libGUpXG4gIC8vIHkgc8OzbG8gc2UgYWJyZSBwb3IgYWNjacOzbiBkZWwgdXN1YXJpbyDigJQgbmF2ZWdhciBvIHJlZnJlc2NhciBubyBsbyByZWFicmUuXG4gIGNvbnN0IFtpc01pbmltaXplZCwgc2V0SXNNaW5pbWl6ZWRdID0gdXNlU3RhdGUodHJ1ZSlcbiAgY29uc3Qgc2V0Q2hhdFZpZXdWaXNpYmxlID0gdXNlQ2hhdHNTdG9yZShzdGF0ZSA9PiBzdGF0ZS5zZXRDaGF0Vmlld1Zpc2libGUpXG4gIGNvbnN0IHVucmVhZENvdW50ID0gdXNlQ2hhdHNTdG9yZShzdGF0ZSA9PiBzdGF0ZS51bnJlYWRDb3VudClcbiAgY29uc3QgYWN0aXZlQ2hhdElkID0gdXNlQ2hhdHNTdG9yZShzdGF0ZSA9PiBzdGF0ZS5hY3RpdmVDaGF0SWQpXG4gIC8vIExvcyBcIi4uLlwiIGRlbCBwaWxsIHNhbGVuIGRlbCBtb3Rvciwgbm8gZGUgaXNTdHJlYW1pbmcvaXNXcml0aW5nOiBlc29zIHJlZmxlamFuXG4gIC8vIGxhIHNlc2nDs24gYWN0aXZhIHkgcXVlZGFuIHN0YWxlIGN1YW5kbyB1bmEgcmVzcHVlc3RhIHRlcm1pbmEgZW4gYmFja2dyb3VuZC5cbiAgY29uc3QgaGFzQWN0aXZlU3RyZWFtID0gdXNlU2Vzc2lvbnNTdG9yZShzdGF0ZSA9PlxuICAgIE9iamVjdC52YWx1ZXMoc3RhdGUubWV0YSkuc29tZShtZXRhID0+IGlzQWN0aXZlU2Vzc2lvblN0YXR1cyhtZXRhLnN0YXR1cykpXG4gIClcblxuICAvKiogZ29Ub0NoYXQgLyBoYW5kbGVHb0hvbWUgc2UgZGVmaW5lbiBtw6FzIGFiYWpvOyBsb3MgcmVmcyBldml0YW4gZGVwZW5kZXIgZGVsIG9yZGVuIGRlIGRlY2xhcmFjacOzbi4gKi9cbiAgY29uc3QgZ29Ub0NoYXRSZWYgPSB1c2VSZWY8KChjaGF0OiBDaGF0TGlzdEl0ZW0pID0+IHZvaWQpIHwgbnVsbD4obnVsbClcbiAgY29uc3QgZ29Ib21lUmVmID0gdXNlUmVmPCgoKSA9PiB2b2lkKSB8IG51bGw+KG51bGwpXG5cbiAgLy8gTW9udGEgY2VycmFkYTogZWwgY2hhdCBubyBlc3TDoSBhIGxhIHZpc3RhLCBhc8OtIHF1ZSBsYXMgcmVzcHVlc3RhcyBxdWUgbGxlZ3VlblxuICAvLyB0aWVuZW4gcXVlIHF1ZWRhciBjb21vIG5vIGxlw61kYXMuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgc2V0Q2hhdFZpZXdWaXNpYmxlKGZhbHNlKVxuICAgIC8vIFPDs2xvIGFsIG1vbnRhcjogZGVzcHXDqXMgbG8gbWFuZWphbiBtaW5pbWl6YXIvcmVzdGF1cmFyLlxuICB9LCBbXSlcblxuICAvLyBQZXJzaXN0aW1vcyBsYSBjb252ZXJzYWNpw7NuIGFiaWVydGEgcGFyYSBwb2RlciB2b2x2ZXIgYSBlbGxhIGRlc2RlIGVsIHBpbGwgZGVzcHXDqXNcbiAgLy8gZGUgbmF2ZWdhciBvIHJlZnJlc2Nhci4gRWwgdGFrZW92ZXIgZGVzZGUgdW4gaG9zdCBsYSBsaW1waWEgKHZhIGFsIEhvbWUpLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChhY3RpdmVDaGF0SWQpIHtcbiAgICAgIHdyaXRlTGFzdEFjdGl2ZUNoYXRJZCh1c2VyLmlkLCBhY3RpdmVDaGF0SWQpXG4gICAgfVxuICB9LCBbYWN0aXZlQ2hhdElkLCB1c2VyLmlkXSlcblxuICBjb25zdCBoYW5kbGVNaW5pbWl6ZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBhbXBsaXR1ZEV2ZW50KEVWRU5UUy5haUNoYXRNaW5pbWl6ZSlcbiAgICBzZXRJc01pbmltaXplZCh0cnVlKVxuICAgIHNldENoYXRWaWV3VmlzaWJsZShmYWxzZSlcbiAgfSwgW2FtcGxpdHVkRXZlbnQsIHNldENoYXRWaWV3VmlzaWJsZV0pXG5cbiAgY29uc3QgZm9jdXNDaGF0SW5wdXQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ21haWEtaW5wdXQtcmVmb2N1cycpKVxuICAgIH0sIDEwMClcbiAgfSwgW10pXG5cbiAgY29uc3QgW3VzZXJJbml0aWFsTWVzc2FnZSwgc2V0VXNlckluaXRpYWxNZXNzYWdlXSA9IHVzZVN0YXRlPHtcbiAgICBtZXNzYWdlOiBzdHJpbmdcbiAgICBhdHRhY2htZW50czogQXR0YWNobWVudEZpbGVbXVxuICAgIGZhcUlkPzogc3RyaW5nXG4gICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmdcbiAgICBtZW50aW9ucz86IENvbnRleHRNZW50aW9uW11cbiAgICBmdWFJZD86IHN0cmluZ1xuICAgIHNjSWQ/OiBzdHJpbmdcbiAgICBjb250ZXh0RGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIH0+KHtcbiAgICBtZXNzYWdlOiAnJyxcbiAgICBhdHRhY2htZW50czogW10sXG4gIH0pXG4gIGNvbnN0IFtpbml0aWFsQ2hhdElkLCBzZXRJbml0aWFsQ2hhdElkXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtuZXdDaGF0S2V5LCBzZXROZXdDaGF0S2V5XSA9IHVzZVN0YXRlKDApXG4gIGNvbnN0IFtzZXNzaW9uTWV0YSwgc2V0U2Vzc2lvbk1ldGFdID0gdXNlU3RhdGU8U2Vzc2lvbk1ldGEgfCBudWxsPihudWxsKVxuICBjb25zdCBbc2VuZE1lc3NhZ2VGdW5jdGlvbiwgc2V0U2VuZE1lc3NhZ2VGdW5jdGlvbl0gPSB1c2VTdGF0ZTxcbiAgICB8ICgoXG4gICAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgICAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdLFxuICAgICAgICBmYXFJZD86IHN0cmluZyxcbiAgICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmcsXG4gICAgICAgIG1lbnRpb25zPzogQ29udGV4dE1lbnRpb25bXSxcbiAgICAgICAgZnVhSWQ/OiBzdHJpbmcsXG4gICAgICAgIHNjSWQ/OiBzdHJpbmdcbiAgICAgICkgPT4gdm9pZClcbiAgICB8IG51bGxcbiAgPihudWxsKVxuICBjb25zdCBbc3RvcEdlbmVyYXRpb25GdW5jdGlvbiwgc2V0U3RvcEdlbmVyYXRpb25GdW5jdGlvbl0gPSB1c2VTdGF0ZTwoKCkgPT4gdm9pZCkgfCBudWxsPihudWxsKVxuICBjb25zdCBbaXNTdHJlYW1pbmcsIHNldElzU3RyZWFtaW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbaXNXcml0aW5nLCBzZXRJc1dyaXRpbmddID0gdXNlU3RhdGUoZmFsc2UpXG5cbiAgY29uc3QgW3JlZmV0Y2hDaGF0cywgc2V0UmVmZXRjaENoYXRzXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbY3VycmVudE9wdGlvbiwgc2V0Q3VycmVudE9wdGlvbl0gPSB1c2VTdGF0ZShvcHRpb25zLmhvbWUpXG4gIGNvbnN0IFtoYXNFcnJvciwgc2V0SGFzRXJyb3JdID0gdXNlU3RhdGUoZmFsc2UpXG4gIC8vIEVuIHByb2plY3QvY2xpZW50L3Rhc2s6IGVsIHVzdWFyaW8gcmVpbmljacOzIGVsIGNvbnRleHRvIGRlbCBvcmNoZXN0cmF0b3IgKGxvIGxpbXBpw7MgeSBwYXPDsyBwb3JcbiAgLy8gZWwgc2VsZWN0b3IgZGUgY29udGV4dG9zIHJlY2llbnRlcykuIEhhYmlsaXRhIGVsIGJvdMOzbiBcInZvbHZlclwiIGVuIGVsIGhvbWUgcGFzbyAyIGRlIGVzYXNcbiAgLy8gc2VjY2lvbmVzLiBTZSByZXNldGVhIGFsIGNlcnJhci9yZWFicmlyIGVsIG1vZGFsIChlbCBjb21wb25lbnRlIHNlIGRlc21vbnRhKS5cbiAgY29uc3QgW2RpZFJlc2V0Q29udGV4dEluU2VjdGlvbiwgc2V0RGlkUmVzZXRDb250ZXh0SW5TZWN0aW9uXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBwcmV2SGFzUGlubmVkQ29udGV4dFJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgaGFuZGxlcnMgPSB1c2VNZW1vKCgpID0+IGJ1aWxkSGFuZGxlcnMoc2V0Q3VycmVudE9wdGlvbiwgc2V0SGFzRXJyb3IpLCBbXSlcbiAgY29uc3QgW3NpZGViYXJIYXNFcnJvciwgc2V0U2lkZWJhckhhc0Vycm9yXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCByZXNldFNlbGVjdGVkQ2hhdFJlZiA9IHVzZVJlZjwoKCkgPT4gdm9pZCkgfCBudWxsPihudWxsKVxuICBjb25zdCBsYW5nID0gaTE4bi5sYW5ndWFnZSA9PT0gJ2JyJyA/ICdwdC1icicgOiBpMThuLmxhbmd1YWdlXG5cbiAgbW9tZW50LmxvY2FsZShsYW5nKVxuXG4gIGNvbnN0IHtcbiAgICBzZWxlY3RBZ2VudCxcbiAgICBjbGVhckFnZW50LFxuICAgIHNlY3Rpb24sXG4gICAgYWdlbnQsXG4gICAgcHJvamVjdCxcbiAgICBjbGllbnQsXG4gICAgdGFzayxcbiAgICBjaGlwc1Byb2plY3QsXG4gICAgdG9nZ2xlV2ViU2VhcmNoLFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIHNldENoaXBzUHJvamVjdCxcbiAgICBzZXRDbGllbnQsXG4gICAgc2V0UHJvamVjdCxcbiAgICBiYW5uZXJFbnRyeUZhcSxcbiAgICBzZXRUYXNrLFxuICB9ID0gdXNlR2xvYmFsQ29udGV4dCgpXG5cbiAgLy8gWi1pbmRleCBwYXJhIHRvb2x0aXBzIGVuIHNlY3Rpb24gJ3Rhc2snIChtb2RhbCBmbG90YW50ZSBlbGV2YWRvKVxuICBjb25zdCB0b29sdGlwWkluZGV4ID0gdXNlTWFpYVRhc2tQYW5lbFpJbmRleCgxNTAwLCAnb3ZlcmxheScpXG5cbiAgY29uc3Qge1xuICAgIGFnZW50cyxcbiAgICBsb2FkaW5nLFxuICAgIGxvYWRpbmdNb3JlLFxuICAgIGVycm9yOiBhZ2VudEVycm9yLFxuICAgIGhhbmRsZUdldEFnZW50cyxcbiAgICBsb2FkTW9yZUFnZW50cyxcbiAgICBzZWFyY2hDdXN0b21BZ2VudHMsXG4gICAgc2VhcmNoTG9hZGluZyxcbiAgICBhZGRBZ2VudCxcbiAgICByZW1vdmVBZ2VudCxcbiAgICB1cGRhdGVBZ2VudCxcbiAgICB1cGRhdGVBZ2VudEZhdm9yaXRlLFxuICAgIHNlbGVjdEZpcnN0QWdlbnQsXG4gICAgc29ydEFnZW50c0xpc3QsXG4gIH0gPSB1c2VHZXRBZ2VudHMoeyBzZWxlY3RBZ2VudCwgc2VjdGlvbiwgYWdlbnQsIGhhbmRsZUdvSG9tZTogaGFuZGxlcnMuaG9tZSB9KVxuXG4gIGNvbnN0IHsgc2tpbGxzLCBsb2FkaW5nOiBsb2FkaW5nU2tpbGxzLCBoYW5kbGVHZXRTa2lsbHMsIGFkZFNraWxsLCB1cGRhdGVTa2lsbEluTGlzdCwgcmVtb3ZlU2tpbGwgfSA9IHVzZUdldFNraWxscygpXG5cbiAgY29uc3QgaXNNQUlBID0gdmFsaWRhdGVJc01haWEoYWdlbnQgYXMgQWdlbnQpXG5cbiAgY29uc3QgdXNlckhhc1Blcm1pc3Npb25zID1cbiAgICAodXNlcj8ucGVybWlzc2lvbnM/LmFpX2FnZW50cz8uY3JlYXRlIHx8XG4gICAgICB1c2VyPy5wZXJtaXNzaW9ucz8uYWlfYWdlbnRzPy5lZGl0IHx8XG4gICAgICB1c2VyPy5wZXJtaXNzaW9ucz8uYWlfYWdlbnRzPy5kZWxldGUpICYmXG4gICAgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFNcblxuICBjb25zdCBjb21wdXRlZEN1cnJlbnRPcHRpb24gPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBpc0dsb2JhbFNwZWNpYWxpc3QgPSBpc01BSUEgJiYgYWdlbnQ/LmVudGl0eSA9PT0gJ2dsb2JhbCdcbiAgICBjb25zdCBpc1Byb2plY3RTcGVjaWFsaXN0ID0gaXNNQUlBICYmIChhZ2VudD8uZW50aXR5ID09PSAncHJvamVjdCcgfHwgYWdlbnQ/LmVudGl0eSA9PSBudWxsKVxuICAgIGNvbnN0IGlzQ2xpZW50U3BlY2lhbGlzdCA9IGlzTUFJQSAmJiBhZ2VudD8uZW50aXR5ID09PSAnY2xpZW50J1xuICAgIGNvbnN0IGlzTWFpYWtlciA9IGlzTWFya2V0cGxhY2VHbG9iYWxDbG9uZUFnZW50KGFnZW50KVxuXG4gICAgaWYgKGN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMubXlBZ2VudHMgJiYgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLm15QWdlbnRzXG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMubXlTa2lsbHMgJiYgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLm15U2tpbGxzXG4gICAgfVxuXG4gICAgLy8gRWwgb3JjaGVzdHJhdG9yIChNQUlBKSBtdWVzdHJhIHN1IGhvbWUgY29uIEZBUXMvYWNjaW9uZXMgZnJlY3VlbnRlczsgZWwgcmVzdG8gZGVcbiAgICAvLyBsb3MgZ2xvYmFsIHNwZWNpYWxpc3RzIChjbG9uZXMgZ2xvYmFsZXMgbm8tbWFpYWtlcikgc2lndWVuIHllbmRvIGRpcmVjdG8gYWwgY2hhdC5cbiAgICBpZiAoaXNHbG9iYWxTcGVjaWFsaXN0ICYmICFpc01haWFrZXIgJiYgYWdlbnQ/LnR5cGUgIT09ICdvcmNoZXN0cmF0b3InICYmIGN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuaG9tZSkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuY2hhdFxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFNob3dQcm9qZWN0U2VsZWN0b3IgPSBjdXJyZW50T3B0aW9uICE9PSBvcHRpb25zLmNoYXQgJiYgaXNQcm9qZWN0U3BlY2lhbGlzdCAmJiAhcHJvamVjdFxuICAgIGNvbnN0IHNob3VsZFNob3dDbGllbnRTZWxlY3RvciA9IGN1cnJlbnRPcHRpb24gIT09IG9wdGlvbnMuY2hhdCAmJiBpc0NsaWVudFNwZWNpYWxpc3QgJiYgIWNsaWVudFxuXG4gICAgaWYgKHNob3VsZFNob3dQcm9qZWN0U2VsZWN0b3IpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLnByb2plY3RTZWxlY3RvclxuICAgIH1cbiAgICBpZiAoc2hvdWxkU2hvd0NsaWVudFNlbGVjdG9yKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5jbGllbnRTZWxlY3RvclxuICAgIH1cbiAgICByZXR1cm4gY3VycmVudE9wdGlvblxuICB9LCBbY3VycmVudE9wdGlvbiwgcHJvamVjdCwgY2xpZW50LCBpc01BSUEsIGFnZW50Py5lbnRpdHksIGFnZW50Py5uYW1lLCBhZ2VudD8udHlwZV0pXG5cbiAgY29uc3QgaXNNYWlha2VyQWdlbnRTZWxlY3RlZCA9IHVzZU1lbW8oKCkgPT4gaXNNYXJrZXRwbGFjZUdsb2JhbENsb25lQWdlbnQoYWdlbnQpLCBbYWdlbnRdKVxuXG4gIGNvbnN0IHNpZGViYXJBZ2VudHNOYXZBY3RpdmUgPSB1c2VNZW1vKCgpOiAnbWFpYWtlcicgfCAnbXlBZ2VudHMnIHwgJ215U2tpbGxzJyB8IG51bGwgPT4ge1xuICAgIGlmIChjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMubXlTa2lsbHMpIHJldHVybiAnbXlTa2lsbHMnXG4gICAgaWYgKGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5teUFnZW50cykgcmV0dXJuICdteUFnZW50cydcbiAgICBpZiAoaXNNYWlha2VyQWdlbnRTZWxlY3RlZCkgcmV0dXJuICdtYWlha2VyJ1xuICAgIHJldHVybiBudWxsXG4gIH0sIFtjb21wdXRlZEN1cnJlbnRPcHRpb24sIGlzTWFpYWtlckFnZW50U2VsZWN0ZWRdKVxuXG4gIC8qIFJlYWN0aXZhciBjb24gbGEgZmlsYSDigJxNaXMgYWdlbnRlc+KAnSBlbiBTaWRlYmFyOiBteUFnZW50c0NvdW50IHByb3BcbiAgY29uc3Qgc2lkZWJhck15QWdlbnRzQ291bnQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4gYWdlbnRzLmRhdGEuZmlsdGVyKFxuICAgICAgYSA9PiAhKGEudHlwZSA9PT0gJ29yY2hlc3RyYXRvcicgfHwgKGEudHlwZSA9PT0gJ2Nsb25lJyAmJiBhLmVudGl0eSA9PT0gJ2dsb2JhbCcgJiYgLyhtYWlha2VyfG1hcmtldHBsYWNlKS9pLnRlc3QoYS5uYW1lIHx8ICcnKSkpXG4gICAgKVxuICAgICAgLmxlbmd0aFxuICB9LCBbYWdlbnRzLmRhdGFdKVxuICAqL1xuXG4gIGNvbnN0IGFnZW50c0ZldGNoZWRSZWYgPSB1c2VSZWYoZmFsc2UpXG5cbiAgY29uc3Qgc2VsZWN0b3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtJRF9NT0RBTF9DSEFUX0FHRU5UfWApXG5cbiAgLy8gVGFzayBwYW5lbCwgcGxhbm5lciB5IGJhbm5lciBkZSBwcm95ZWN0byBhYnJlbiBlbiBmbG90YW50ZSBwb3IgZGVmYXVsdCAobm8gdGFwYXIgZWwgY29udGV4dG8gZGV0csOhcykuXG4gIC8vIEZ1ZXJhIGRlIGVzb3MgY29udGV4dG9zIHNlIHJlc3BldGEgbGEgcHJlZmVyZW5jaWEgZ3VhcmRhZGEgZW4gbG9jYWxTdG9yYWdlLlxuICBjb25zdCBbbGF5b3V0TW9kZSwgc2V0TGF5b3V0TW9kZV0gPSB1c2VTdGF0ZTxNYWlhQ2hhdE1vZGFsTGF5b3V0TW9kZT4oKCkgPT5cbiAgICByZXNvbHZlSW5pdGlhbE1haWFDaGF0TGF5b3V0TW9kZSh7IHNlY3Rpb24sIGJhbm5lckVudHJ5RmFxIH0pXG4gIClcblxuICBjb25zdCBoYW5kbGVMYXlvdXRNb2RlQ2hhbmdlID0gdXNlQ2FsbGJhY2soKG1vZGU6IE1haWFDaGF0TW9kYWxMYXlvdXRNb2RlKSA9PiB7XG4gICAgc2V0U3RvcmVkTWFpYUNoYXRMYXlvdXRNb2RlKG1vZGUpXG4gICAgc2V0TGF5b3V0TW9kZShtb2RlKVxuICB9LCBbXSlcbiAgY29uc3QgZXhwYW5kZWQgPSBsYXlvdXRNb2RlID09PSAnZnVsbHNjcmVlbidcbiAgY29uc3QgaXNGbG9hdGluZyA9IGxheW91dE1vZGUgPT09ICdmbG9hdGluZydcbiAgY29uc3QgY29udGVudFdyYXBwZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpXG4gIGNvbnN0IFtkcmFnUG9zaXRpb24sIHNldERyYWdQb3NpdGlvbl0gPSB1c2VTdGF0ZTx7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsPihudWxsKVxuICBjb25zdCB7IHRpbHRNb3Rpb24sIHN0YXJ0UG9pbnRlclRyYWNraW5nLCBzYW1wbGVQb2ludGVyTW92ZSwgZW5kUG9pbnRlclRyYWNraW5nIH0gPVxuICAgIHVzZUZsb2F0aW5nUGFuZWxEcmFnVGlsdChpc0Zsb2F0aW5nKVxuICBjb25zdCBkcmFnU3RhdGVSZWYgPSB1c2VSZWY8e1xuICAgIHBvaW50ZXJJZDogbnVtYmVyXG4gICAgb2Zmc2V0WDogbnVtYmVyXG4gICAgb2Zmc2V0WTogbnVtYmVyXG4gIH0gfCBudWxsPihudWxsKVxuXG4gIGNvbnN0IGNsYW1wRHJhZ1Bvc2l0aW9uID0gdXNlQ2FsbGJhY2soKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgY29udGVudFdyYXBwZXIgPSBjb250ZW50V3JhcHBlclJlZi5jdXJyZW50XG4gICAgaWYgKCFjb250ZW50V3JhcHBlcikge1xuICAgICAgcmV0dXJuIHsgeCwgeSB9XG4gICAgfVxuXG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBjb250ZW50V3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgIGNvbnN0IG9mZnNldCA9IDE2XG4gICAgY29uc3QgbWF4WCA9IE1hdGgubWF4KG9mZnNldCwgd2luZG93LmlubmVyV2lkdGggLSB3aWR0aCAtIG9mZnNldClcbiAgICBjb25zdCBtYXhZID0gTWF0aC5tYXgob2Zmc2V0LCB3aW5kb3cuaW5uZXJIZWlnaHQgLSBoZWlnaHQgLSBvZmZzZXQpXG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogTWF0aC5taW4oTWF0aC5tYXgoeCwgb2Zmc2V0KSwgbWF4WCksXG4gICAgICB5OiBNYXRoLm1pbihNYXRoLm1heCh5LCBvZmZzZXQpLCBtYXhZKSxcbiAgICB9XG4gIH0sIFtdKVxuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGxheW91dE1vZGUgIT09ICdmbG9hdGluZycpIHtcbiAgICAgIHNldERyYWdQb3NpdGlvbihudWxsKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc2V0RHJhZ1Bvc2l0aW9uKHByZXYgPT4ge1xuICAgICAgaWYgKHByZXYpIHtcbiAgICAgICAgcmV0dXJuIGNsYW1wRHJhZ1Bvc2l0aW9uKHByZXYueCwgcHJldi55KVxuICAgICAgfVxuICAgICAgY29uc3QgcGFkID0gMTZcbiAgICAgIGNvbnN0IHggPSB3aW5kb3cuaW5uZXJXaWR0aCAtIGdldE1haWFGbG9hdGluZ1BhbmVsV2lkdGhQeCgpIC0gcGFkXG4gICAgICByZXR1cm4gY2xhbXBEcmFnUG9zaXRpb24oeCwgcGFkKVxuICAgIH0pXG4gIH0sIFtsYXlvdXRNb2RlLCBjbGFtcERyYWdQb3NpdGlvbl0pXG5cbiAgY29uc3QgaGFuZGxlRHJhZ0VuZCA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogUmVhY3RQb2ludGVyRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgICBlbmRQb2ludGVyVHJhY2tpbmcoKVxuICAgICAgaWYgKGRyYWdTdGF0ZVJlZi5jdXJyZW50Py5wb2ludGVySWQgIT09IGV2ZW50LnBvaW50ZXJJZCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZHJhZ1N0YXRlUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnVzZXJTZWxlY3QgPSAnJ1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnJ1xuICAgIH0sXG4gICAgW2VuZFBvaW50ZXJUcmFja2luZ11cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZURyYWdNb3ZlID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50OiBSZWFjdFBvaW50ZXJFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHtcbiAgICAgIGNvbnN0IGRyYWdTdGF0ZSA9IGRyYWdTdGF0ZVJlZi5jdXJyZW50XG4gICAgICBpZiAoIWRyYWdTdGF0ZSB8fCBkcmFnU3RhdGUucG9pbnRlcklkICE9PSBldmVudC5wb2ludGVySWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHNhbXBsZVBvaW50ZXJNb3ZlKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpXG5cbiAgICAgIGNvbnN0IG5leHRQb3NpdGlvbiA9IGNsYW1wRHJhZ1Bvc2l0aW9uKGV2ZW50LmNsaWVudFggLSBkcmFnU3RhdGUub2Zmc2V0WCwgZXZlbnQuY2xpZW50WSAtIGRyYWdTdGF0ZS5vZmZzZXRZKVxuXG4gICAgICBzZXREcmFnUG9zaXRpb24ocHJldiA9PiB7XG4gICAgICAgIGlmIChwcmV2ICYmIHByZXYueCA9PT0gbmV4dFBvc2l0aW9uLnggJiYgcHJldi55ID09PSBuZXh0UG9zaXRpb24ueSkge1xuICAgICAgICAgIHJldHVybiBwcmV2XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5leHRQb3NpdGlvblxuICAgICAgfSlcbiAgICB9LFxuICAgIFtjbGFtcERyYWdQb3NpdGlvbiwgc2FtcGxlUG9pbnRlck1vdmVdXG4gIClcblxuICBjb25zdCByZXNvbHZlZERyYWdQb3NpdGlvbiA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChsYXlvdXRNb2RlICE9PSAnZmxvYXRpbmcnKSB7XG4gICAgICByZXR1cm4gZHJhZ1Bvc2l0aW9uXG4gICAgfVxuICAgIGlmIChkcmFnUG9zaXRpb24pIHtcbiAgICAgIHJldHVybiBkcmFnUG9zaXRpb25cbiAgICB9XG4gICAgY29uc3QgcGFkID0gMTZcbiAgICBjb25zdCB4ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cuaW5uZXJXaWR0aCAtIGdldE1haWFGbG9hdGluZ1BhbmVsV2lkdGhQeCgpIC0gcGFkIDogcGFkXG4gICAgcmV0dXJuIGNsYW1wRHJhZ1Bvc2l0aW9uKHgsIHBhZClcbiAgfSwgW2xheW91dE1vZGUsIGRyYWdQb3NpdGlvbiwgY2xhbXBEcmFnUG9zaXRpb25dKVxuXG4gIGNvbnN0IGhhbmRsZURyYWdTdGFydCA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudDogUmVhY3RQb2ludGVyRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgICBpZiAoIWlzRmxvYXRpbmcgfHwgZXZlbnQuYnV0dG9uICE9PSAwKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnRcbiAgICAgIGlmICh0YXJnZXQuY2xvc2VzdCgnYnV0dG9uLCBhLCBpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCwgW3JvbGU9XCJidXR0b25cIl0sIFtkYXRhLW5vLWRyYWc9XCJ0cnVlXCJdJykpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbnRlbnRXcmFwcGVyID0gY29udGVudFdyYXBwZXJSZWYuY3VycmVudFxuICAgICAgaWYgKCFjb250ZW50V3JhcHBlcikge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVjdCA9IGNvbnRlbnRXcmFwcGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICBjb25zdCBpbml0aWFsUG9zaXRpb24gPSByZXNvbHZlZERyYWdQb3NpdGlvbiA/PyBjbGFtcERyYWdQb3NpdGlvbihyZWN0LmxlZnQsIHJlY3QudG9wKVxuICAgICAgY29uc3QgcG9pbnRlck9mZnNldFggPSBldmVudC5jbGllbnRYIC0gaW5pdGlhbFBvc2l0aW9uLnhcbiAgICAgIGNvbnN0IHBvaW50ZXJPZmZzZXRZID0gZXZlbnQuY2xpZW50WSAtIGluaXRpYWxQb3NpdGlvbi55XG5cbiAgICAgIHNldERyYWdQb3NpdGlvbihpbml0aWFsUG9zaXRpb24pXG4gICAgICBkcmFnU3RhdGVSZWYuY3VycmVudCA9IHtcbiAgICAgICAgcG9pbnRlcklkOiBldmVudC5wb2ludGVySWQsXG4gICAgICAgIG9mZnNldFg6IHBvaW50ZXJPZmZzZXRYLFxuICAgICAgICBvZmZzZXRZOiBwb2ludGVyT2Zmc2V0WSxcbiAgICAgIH1cblxuICAgICAgZXZlbnQuY3VycmVudFRhcmdldC5zZXRQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUudXNlclNlbGVjdCA9ICdub25lJ1xuICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnZ3JhYmJpbmcnXG4gICAgICBhbXBsaXR1ZEV2ZW50KEVWRU5UUy5haUNoYXREcmFnZ2FibGUpXG4gICAgICBzdGFydFBvaW50ZXJUcmFja2luZyhldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKVxuICAgIH0sXG4gICAgW2NsYW1wRHJhZ1Bvc2l0aW9uLCBpc0Zsb2F0aW5nLCByZXNvbHZlZERyYWdQb3NpdGlvbiwgc3RhcnRQb2ludGVyVHJhY2tpbmddXG4gIClcblxuICBjb25zdCBzdGFydENoYXQgPSB1c2VDYWxsYmFjayhcbiAgICAoXG4gICAgICBtZXNzYWdlPzogc3RyaW5nLFxuICAgICAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdLFxuICAgICAgZmFxSWQ/OiBzdHJpbmcsXG4gICAgICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZyxcbiAgICAgIG1lbnRpb25zPzogQ29udGV4dE1lbnRpb25bXSxcbiAgICAgIGZ1YUlkPzogc3RyaW5nLFxuICAgICAgc2NJZD86IHN0cmluZyxcbiAgICAgIGNvbnRleHREYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICApID0+IHtcbiAgICAgIGlmIChzaWRlYmFySGFzRXJyb3IpIHtcbiAgICAgICAgc2V0U2lkZWJhckhhc0Vycm9yKGZhbHNlKVxuICAgICAgfVxuICAgICAgc2V0SW5pdGlhbENoYXRJZChudWxsKVxuICAgICAgc2V0TmV3Q2hhdEtleShwcmV2ID0+IHByZXYgKyAxKVxuICAgICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHtcbiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCAnJyxcbiAgICAgICAgYXR0YWNobWVudHM6IGF0dGFjaG1lbnRzIHx8IFtdLFxuICAgICAgICAuLi4oZmFxSWQgPyB7IGZhcUlkIH0gOiB7fSksXG4gICAgICAgIC4uLihhZ2VudFN1Z2dlc3Rpb25JZCA/IHsgYWdlbnRTdWdnZXN0aW9uSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKG1lbnRpb25zICYmIG1lbnRpb25zLmxlbmd0aCA+IDAgPyB7IG1lbnRpb25zIH0gOiB7fSksXG4gICAgICAgIC4uLihmdWFJZCA/IHsgZnVhSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNjSWQgPyB7IHNjSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKGNvbnRleHREYXRhID8geyBjb250ZXh0RGF0YSB9IDoge30pLFxuICAgICAgfSlcbiAgICAgIGhhbmRsZXJzLmNoYXQoKVxuICAgIH0sXG4gICAgW2hhbmRsZXJzLCBzaWRlYmFySGFzRXJyb3JdXG4gIClcblxuICBjb25zdCBiYW5uZXJGYXFBdXRvU2VudFJlZiA9IHVzZVJlZihmYWxzZSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGVudGl0eVJlYWR5ID0gc2VjdGlvbiA9PT0gJ3Byb2plY3QnID8gQm9vbGVhbihwcm9qZWN0Py5pZCkgOiBzZWN0aW9uID09PSAnY2xpZW50JyA/IEJvb2xlYW4oY2xpZW50Py5pZCkgOiB0cnVlXG5cbiAgICBpZiAoIWJhbm5lckVudHJ5RmFxPy5mYXFUaXRsZT8udHJpbSgpIHx8IGJhbm5lckZhcUF1dG9TZW50UmVmLmN1cnJlbnQgfHwgbG9hZGluZyB8fCAhYWdlbnQ/LmlkIHx8ICFlbnRpdHlSZWFkeSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgYmFubmVyRmFxQXV0b1NlbnRSZWYuY3VycmVudCA9IHRydWVcbiAgICBzdGFydENoYXQoXG4gICAgICBiYW5uZXJFbnRyeUZhcS5mYXFUaXRsZSxcbiAgICAgIFtdLFxuICAgICAgYmFubmVyRW50cnlGYXEuZmFxSWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBiYW5uZXJFbnRyeUZhcS5jb250ZXh0RGF0YVxuICAgIClcbiAgfSwgW1xuICAgIGJhbm5lckVudHJ5RmFxPy5mYXFJZCxcbiAgICBiYW5uZXJFbnRyeUZhcT8uZmFxVGl0bGUsXG4gICAgYmFubmVyRW50cnlGYXE/LmNvbnRleHREYXRhLFxuICAgIGxvYWRpbmcsXG4gICAgYWdlbnQ/LmlkLFxuICAgIGFnZW50Py5lbnRpdHksXG4gICAgcHJvamVjdD8uaWQsXG4gICAgY2xpZW50Py5pZCxcbiAgICBzZWN0aW9uLFxuICAgIHN0YXJ0Q2hhdCxcbiAgXSlcblxuICBjb25zdCBnb1RvQ2hhdCA9IHVzZUNhbGxiYWNrKFxuICAgIChjaGF0OiBhbnkpID0+IHtcbiAgICAgIHNldFVzZXJJbml0aWFsTWVzc2FnZSh7IG1lc3NhZ2U6ICcnLCBhdHRhY2htZW50czogW10gfSlcbiAgICAgIHNldEluaXRpYWxDaGF0SWQoY2hhdC5zZXNzaW9uRXh0ZXJuYWxJZClcbiAgICAgIGNvbnN0IHNlbGVjdGVkQWdlbnQgPSBhZ2VudHMuZGF0YS5maW5kKGFnZW50SXRlbSA9PiBhZ2VudEl0ZW0uaWQgPT09IGNoYXQuYWdlbnRJZClcbiAgICAgIGlmIChzZWxlY3RlZEFnZW50KSB7XG4gICAgICAgIHNlbGVjdEFnZW50KHNlbGVjdGVkQWdlbnQpXG4gICAgICB9XG4gICAgICAvLyBEaXNwYXRjaCBldmVudCB0byBjbGVhciB0aGUgaW5wdXQgdGV4dGFyZWFcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjaGF0LXNlc3Npb24tY2hhbmdlZCcpKVxuICAgICAgaGFuZGxlcnMuY2hhdCgpXG4gICAgfSxcbiAgICBbaGFuZGxlcnMsIGFnZW50cywgc2VsZWN0QWdlbnRdXG4gIClcblxuICBnb1RvQ2hhdFJlZi5jdXJyZW50ID0gZ29Ub0NoYXRcblxuICAvKiogTG9zIGFnZW50ZXMgc2UgcGlkZW4gcmVjacOpbiBhbCBhYnJpciBlbCBwYW5lbDogZW4gbW9kbyBwaWxsIG5vIGhhY2UgZmFsdGEgbmluZ3VuYSByZXF1ZXN0LiAqL1xuICBjb25zdCBlbnN1cmVBZ2VudHNMb2FkZWQgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgaWYgKGFnZW50c0ZldGNoZWRSZWYuY3VycmVudCkgcmV0dXJuXG4gICAgYWdlbnRzRmV0Y2hlZFJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgIGF3YWl0IGhhbmRsZUdldEFnZW50cygpXG4gIH0sIFtoYW5kbGVHZXRBZ2VudHNdKVxuXG4gIGNvbnN0IGhhbmRsZVJlc3RvcmVGcm9tTWluaW1pemVkID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldElzTWluaW1pemVkKGZhbHNlKVxuICAgIHNldENoYXRWaWV3VmlzaWJsZSh0cnVlKVxuICAgIGFtcGxpdHVkRXZlbnQoRVZFTlRTLmFpQ2hhdE9wZW4sIHsgb3B0aW9uOiAnbWluaW1pemUnIH0pXG5cbiAgICAvLyBnb1RvQ2hhdCBuZWNlc2l0YSBsYSBsaXN0YSBkZSBhZ2VudGVzIHBhcmEgc2VsZWNjaW9uYXIgZWwgZGUgbGEgY29udmVyc2FjacOzbi5cbiAgICBlbnN1cmVBZ2VudHNMb2FkZWQoKS50aGVuKCgpID0+IHtcbiAgICAgIC8vIFByaW9yaWRhZCBhbCByZWFicmlyOiBwcmltZXIgY2hhdCBzaW4gbGVlciDihpIgw7psdGltYSBjb252ZXJzYWNpw7NuIGFiaWVydGEg4oaSIEhvbWUuXG4gICAgICBjb25zdCB7IGNoYXRzIH0gPSBnZXRDaGF0c1N0b3JlU3RhdGUoKVxuICAgICAgY29uc3QgbGFzdEFjdGl2ZUNoYXRJZCA9IHJlYWRMYXN0QWN0aXZlQ2hhdElkKHVzZXIuaWQpXG4gICAgICBjb25zdCB0YXJnZXQgPVxuICAgICAgICBjaGF0cy5maW5kKGNoYXQgPT4gY2hhdC5pc1JlYWQgPT09IGZhbHNlKSA/P1xuICAgICAgICAobGFzdEFjdGl2ZUNoYXRJZCA/IGNoYXRzLmZpbmQoY2hhdCA9PiBjaGF0LnNlc3Npb25FeHRlcm5hbElkID09PSBsYXN0QWN0aXZlQ2hhdElkKSA6IHVuZGVmaW5lZClcblxuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBnb1RvQ2hhdFJlZi5jdXJyZW50Py4odGFyZ2V0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ29Ib21lUmVmLmN1cnJlbnQ/LigpXG4gICAgICB9XG5cbiAgICAgIGZvY3VzQ2hhdElucHV0KClcbiAgICB9KVxuICB9LCBbYW1wbGl0dWRFdmVudCwgZW5zdXJlQWdlbnRzTG9hZGVkLCBmb2N1c0NoYXRJbnB1dCwgc2V0Q2hhdFZpZXdWaXNpYmxlLCB1c2VyLmlkXSlcblxuICAvKipcbiAgICogVG9tYSBjb250cm9sIGRlc2RlIHVuIGhvc3QgKGhlYWRlciwgcHJveWVjdG8sIGNsaWVudGXigKYpOiBhYnJlIGVsIHBhbmVsLCBkZXNjYXJ0YSBsYVxuICAgKiBjb252ZXJzYWNpw7NuIGFiaWVydGEgeSBhcGxpY2EgZWwgY29udGV4dG8gZGVsIGhvc3QuIE5PIHZ1ZWx2ZSBhIGxhIMO6bHRpbWEgY29udmVyc2FjacOzblxuICAgKiDigJQgZXNvIHPDs2xvIGxvIGhhY2UgZWwgcGlsbCAoYGhhbmRsZVJlc3RvcmVGcm9tTWluaW1pemVkYCkuXG4gICAqL1xuICBjb25zdCBhcHBseUV4cGFuZGVkSG9zdFRha2VvdmVyID0gdXNlQ2FsbGJhY2soXG4gICAgKGRldGFpbDogTWFpYUhvc3RPcGVuRGV0YWlsKSA9PiB7XG4gICAgICBzZXRJc01pbmltaXplZChmYWxzZSlcbiAgICAgIHNldENoYXRWaWV3VmlzaWJsZSh0cnVlKVxuICAgICAgd3JpdGVMYXN0QWN0aXZlQ2hhdElkKHVzZXIuaWQsIG51bGwpXG4gICAgICBlbnN1cmVBZ2VudHNMb2FkZWQoKVxuXG4gICAgICBzZXRJbml0aWFsQ2hhdElkKG51bGwpXG4gICAgICBzZXROZXdDaGF0S2V5KHByZXYgPT4gcHJldiArIDEpXG4gICAgICBzZXRVc2VySW5pdGlhbE1lc3NhZ2UoeyBtZXNzYWdlOiAnJywgYXR0YWNobWVudHM6IFtdIH0pXG4gICAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICAgIHNldERpZFJlc2V0Q29udGV4dEluU2VjdGlvbihmYWxzZSlcbiAgICAgIHNldEhhc0Vycm9yKGZhbHNlKVxuICAgICAgc2V0SXNXcml0aW5nKGZhbHNlKVxuICAgICAgdXNlRmFxc1N0b3JlLmdldFN0YXRlKCkuY2xlYXJGYXFzKClcbiAgICAgIGJhbm5lckZhcUF1dG9TZW50UmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgcmVzZXRTZWxlY3RlZENoYXRSZWYuY3VycmVudD8uKClcbiAgICAgIGdldENoYXRzU3RvcmVTdGF0ZSgpLnNldEFjdGl2ZUNoYXRJZChudWxsKVxuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2NoYXQtc2Vzc2lvbi1jaGFuZ2VkJykpXG5cbiAgICAgIGlmIChkZXRhaWwuc2VjdGlvbiA9PT0gJ3Byb2plY3QnIHx8IGRldGFpbC5zZWN0aW9uID09PSAndGFzaycpIHtcbiAgICAgICAgc2V0UHJvamVjdD8uKGRldGFpbC5wcm9qZWN0ID8/IG51bGwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRQcm9qZWN0Py4obnVsbClcbiAgICAgIH1cblxuICAgICAgaWYgKGRldGFpbC5zZWN0aW9uID09PSAnY2xpZW50Jykge1xuICAgICAgICBzZXRDbGllbnQ/LihkZXRhaWwuY2xpZW50ID8/IG51bGwpXG4gICAgICB9IGVsc2UgaWYgKGRldGFpbC5zZWN0aW9uID09PSAnaGVhZGVyJyB8fCBkZXRhaWwuc2VjdGlvbiA9PT0gJ3BsYW5uZXInKSB7XG4gICAgICAgIHNldENsaWVudD8uKG51bGwpXG4gICAgICB9XG5cbiAgICAgIGlmIChkZXRhaWwuc2VjdGlvbiA9PT0gJ3Rhc2snKSB7XG4gICAgICAgIHNldFRhc2s/LihkZXRhaWwudGFzayA/PyBudWxsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0VGFzaz8uKG51bGwpXG4gICAgICB9XG5cbiAgICAgIGlmIChkZXRhaWwuc2VjdGlvbiA9PT0gJ2hlYWRlcicgfHwgZGV0YWlsLnNlY3Rpb24gPT09ICdwbGFubmVyJykge1xuICAgICAgICBzZXRDaGlwc1Byb2plY3QobnVsbClcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV4dExheW91dCA9IHJlc29sdmVJbml0aWFsTWFpYUNoYXRMYXlvdXRNb2RlKHtcbiAgICAgICAgc2VjdGlvbjogZGV0YWlsLnNlY3Rpb24gYXMgU2VjdGlvbixcbiAgICAgICAgYmFubmVyRW50cnlGYXE6IGRldGFpbC5mYXEsXG4gICAgICB9KVxuICAgICAgc2V0TGF5b3V0TW9kZShuZXh0TGF5b3V0KVxuICAgICAgc2V0RHJhZ1Bvc2l0aW9uKG51bGwpXG5cbiAgICAgIGZvY3VzQ2hhdElucHV0KClcbiAgICB9LFxuICAgIFtlbnN1cmVBZ2VudHNMb2FkZWQsIGZvY3VzQ2hhdElucHV0LCBzZXRDaGF0Vmlld1Zpc2libGUsIHNldENoaXBzUHJvamVjdCwgc2V0Q2xpZW50LCBzZXRQcm9qZWN0LCBzZXRUYXNrLCB1c2VyLmlkXVxuICApXG5cbiAgY29uc3QgaGFuZGxlU2VuZE1lc3NhZ2VSZWFkeSA9IHVzZUNhbGxiYWNrKFxuICAgIChcbiAgICAgIHNlbmRNZXNzYWdlOiAoXG4gICAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgICAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdLFxuICAgICAgICBmYXFJZD86IHN0cmluZyxcbiAgICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmcsXG4gICAgICAgIG1lbnRpb25zPzogQ29udGV4dE1lbnRpb25bXSxcbiAgICAgICAgZnVhSWQ/OiBzdHJpbmcsXG4gICAgICAgIHNjSWQ/OiBzdHJpbmdcbiAgICAgICkgPT4gdm9pZCxcbiAgICAgIHN0b3BHZW5lcmF0aW9uOiAoKSA9PiB2b2lkLFxuICAgICAgc3RyZWFtaW5nOiBib29sZWFuLFxuICAgICAgd3JpdGluZzogYm9vbGVhblxuICAgICkgPT4ge1xuICAgICAgc2V0U2VuZE1lc3NhZ2VGdW5jdGlvbigoKSA9PiBzZW5kTWVzc2FnZSlcbiAgICAgIHNldFN0b3BHZW5lcmF0aW9uRnVuY3Rpb24oKCkgPT4gc3RvcEdlbmVyYXRpb24pXG4gICAgICBzZXRJc1N0cmVhbWluZyhzdHJlYW1pbmcpXG4gICAgICBzZXRJc1dyaXRpbmcod3JpdGluZylcbiAgICB9LFxuICAgIFtdXG4gIClcblxuICBjb25zdCBoYW5kbGVTZW5kTWVzc2FnZSA9IHVzZUNhbGxiYWNrKFxuICAgIChcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXSxcbiAgICAgIGZhcUlkPzogc3RyaW5nLFxuICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmcsXG4gICAgICBtZW50aW9ucz86IENvbnRleHRNZW50aW9uW10sXG4gICAgICBmdWFJZD86IHN0cmluZyxcbiAgICAgIHNjSWQ/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIGlmIChzaWRlYmFySGFzRXJyb3IpIHtcbiAgICAgICAgc2V0U2lkZWJhckhhc0Vycm9yKGZhbHNlKVxuICAgICAgfVxuICAgICAgaWYgKHNlbmRNZXNzYWdlRnVuY3Rpb24gJiYgY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLmNoYXQpIHtcbiAgICAgICAgc2VuZE1lc3NhZ2VGdW5jdGlvbihtZXNzYWdlLCBhdHRhY2htZW50cywgZmFxSWQsIGFnZW50U3VnZ2VzdGlvbklkLCBtZW50aW9ucywgZnVhSWQsIHNjSWQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGFydENoYXQobWVzc2FnZSwgYXR0YWNobWVudHMsIGZhcUlkLCBhZ2VudFN1Z2dlc3Rpb25JZCwgbWVudGlvbnMsIGZ1YUlkLCBzY0lkKVxuICAgICAgfVxuICAgIH0sXG4gICAgW3NlbmRNZXNzYWdlRnVuY3Rpb24sIHN0YXJ0Q2hhdCwgY29tcHV0ZWRDdXJyZW50T3B0aW9uLCBzaWRlYmFySGFzRXJyb3JdXG4gIClcblxuICBjb25zdCBoYW5kbGVHb0hvbWUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgLy8gU2kgZXN0YW1vcyBlbiB1bmEgY29udmVyc2FjacOzbiB5IHZhbW9zIGEgaG9tZSwgcmVzZXRlYXIgaW5pdGlhbENoYXRJZCB5IGluY3JlbWVudGFyIG5ld0NoYXRLZXlcbiAgICBpZiAoY3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5jaGF0KSB7XG4gICAgICAvLyBObyBjb3J0YW1vcyBsYSBnZW5lcmFjacOzbjogbGEgc2VzacOzbiBzaWd1ZSByZXNwb25kaWVuZG8gZW4gYmFja2dyb3VuZC5cbiAgICAgIHNldEluaXRpYWxDaGF0SWQobnVsbClcbiAgICAgIHNldE5ld0NoYXRLZXkocHJldiA9PiBwcmV2ICsgMSlcbiAgICAgIHNldElzV3JpdGluZyhmYWxzZSlcbiAgICAgIC8vIE5vIGJvcnJhciBlbCBjbGllbnRlIHNpIGVzIGFnZW50ZSBkZSBjbGllbnRlcyAoaWd1YWwgcXVlIGVsIHByb3llY3RvIHNlIG1hbnRpZW5lKVxuICAgICAgaWYgKGFnZW50Py5lbnRpdHkgIT09ICdjbGllbnQnKSB7XG4gICAgICAgIHNldENsaWVudD8uKG51bGwpXG4gICAgICB9XG4gICAgICBpZiAoc2VjdGlvbiAhPT0gJ3Rhc2snKSB7XG4gICAgICAgIHNldFRhc2s/LihudWxsKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXG4gICAgICAoIWFnZW50IHx8IGFnZW50Py5pc19kZWxldGVkIHx8IGFnZW50Py5oYXNfbm90X3Blcm1pc3Npb25zIHx8IGFnZW50Py5oYXNfbm90X2FjY2VzcyB8fCBhZ2VudD8ucHJvamVjdF9kZWxldGVkKSAmJlxuICAgICAgYWdlbnRzLmRhdGEubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgc2VsZWN0QWdlbnQoYWdlbnRzLmRhdGFbMF0pXG4gICAgfVxuICAgIC8vIE9yY2hlc3RyYXRvciBlbiBob21lIGdsb2JhbCAoaGVhZGVyL3BsYW5uZXIpOiBhbCBpbmljaWFyIHVuIGNoYXQgbnVldm8gc2UgZGViZSB2b2x2ZXIgYWwgcGFzbyAxXG4gICAgLy8gKGxpc3RhIGRlIGNvbnRleHRvcyByZWNpZW50ZXMpLCBwb3IgbG8gcXVlIGhheSBxdWUgbGltcGlhciB0b2RvIGVsIGNvbnRleHRvIHBpbmVhZG8uXG4gICAgaWYgKGlzR2xvYmFsTWFpYVNlY3Rpb24oc2VjdGlvbikgJiYgYWdlbnQ/LnR5cGUgPT09ICdvcmNoZXN0cmF0b3InKSB7XG4gICAgICBzZXRQcm9qZWN0KG51bGwpXG4gICAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgICAgc2V0VGFzaz8uKG51bGwpXG4gICAgfVxuICAgIHNldEN1cnJlbnRPcHRpb24ob3B0aW9ucy5ob21lKVxuICAgIHNldENoaXBzUHJvamVjdChudWxsKVxuICAgIHNldEhhc0Vycm9yKGZhbHNlKVxuICAgIGlzV2ViU2VhcmNoQWN0aXZlICYmIHRvZ2dsZVdlYlNlYXJjaCgpXG4gICAgaWYgKHJlc2V0U2VsZWN0ZWRDaGF0UmVmLmN1cnJlbnQpIHtcbiAgICAgIHJlc2V0U2VsZWN0ZWRDaGF0UmVmLmN1cnJlbnQoKVxuICAgIH1cbiAgfSwgW1xuICAgIG9wdGlvbnMuaG9tZSxcbiAgICBvcHRpb25zLmNoYXQsXG4gICAgY3VycmVudE9wdGlvbixcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICB0b2dnbGVXZWJTZWFyY2gsXG4gICAgYWdlbnQsXG4gICAgYWdlbnRzLFxuICAgIHNlbGVjdEFnZW50LFxuICAgIHNldFByb2plY3QsXG4gICAgc2V0Q2xpZW50LFxuICAgIHNldFRhc2ssXG4gICAgc3RvcEdlbmVyYXRpb25GdW5jdGlvbixcbiAgICBzZWN0aW9uLFxuICBdKVxuXG4gIGdvSG9tZVJlZi5jdXJyZW50ID0gaGFuZGxlR29Ib21lXG5cbiAgY29uc3QgaGFuZGxlU3RhcnROZXdDaGF0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IGZyb21NeUFnZW50cyA9IGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5teUFnZW50c1xuICAgIGNvbnN0IGZyb21NYWlha2VySG9tZSA9IGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5ob21lICYmIGlzTWFpYWtlckFnZW50U2VsZWN0ZWRcblxuICAgIGlmIChmcm9tTXlBZ2VudHMgfHwgZnJvbU1haWFrZXJIb21lKSB7XG4gICAgICBjb25zdCBmaXJzdEFnZW50ID0gYWdlbnRzLmRhdGFbMF1cbiAgICAgIGlmIChmaXJzdEFnZW50KSB7XG4gICAgICAgIHNldFByb2plY3QobnVsbClcbiAgICAgICAgc2V0Q2xpZW50Py4obnVsbClcbiAgICAgICAgc2V0VGFzaz8uKG51bGwpXG4gICAgICAgIHNlbGVjdEFnZW50KGZpcnN0QWdlbnQpXG4gICAgICB9XG4gICAgICBzZXRJbml0aWFsQ2hhdElkKG51bGwpXG4gICAgICBzZXROZXdDaGF0S2V5KHByZXYgPT4gcHJldiArIDEpXG4gICAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICAgIHNldENoaXBzUHJvamVjdChudWxsKVxuICAgICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgICBpZiAoaXNXZWJTZWFyY2hBY3RpdmUpIHRvZ2dsZVdlYlNlYXJjaCgpXG4gICAgICByZXNldFNlbGVjdGVkQ2hhdFJlZi5jdXJyZW50Py4oKVxuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2NoYXQtc2Vzc2lvbi1jaGFuZ2VkJykpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBoYW5kbGVHb0hvbWUoKVxuICB9LCBbXG4gICAgYWdlbnRzLmRhdGEsXG4gICAgY29tcHV0ZWRDdXJyZW50T3B0aW9uLFxuICAgIGhhbmRsZUdvSG9tZSxcbiAgICBpc01haWFrZXJBZ2VudFNlbGVjdGVkLFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIHNlbGVjdEFnZW50LFxuICAgIHNldENsaWVudCxcbiAgICBzZXRQcm9qZWN0LFxuICAgIHNldFRhc2ssXG4gICAgdG9nZ2xlV2ViU2VhcmNoLFxuICBdKVxuXG4gIGNvbnN0IGhhbmRsZVJlc2V0Q2hhdCA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBzZXRVc2VySW5pdGlhbE1lc3NhZ2UoeyBtZXNzYWdlOiAnJywgYXR0YWNobWVudHM6IFtdIH0pXG4gICAgc2V0SW5pdGlhbENoYXRJZChudWxsKVxuICAgIC8vIERpc3BhdGNoIGV2ZW50IHRvIGNsZWFyIHRoZSBpbnB1dCB0ZXh0YXJlYVxuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjaGF0LXNlc3Npb24tY2hhbmdlZCcpKVxuICAgIGhhbmRsZUdvSG9tZSgpXG4gIH0sIFtoYW5kbGVHb0hvbWVdKVxuXG4gIC8vIEJvdMOzbiBcInZvbHZlclwiIGRlbCBoZWFkZXIgKHNvbG8gb3JjaGVzdHJhdG9yKTpcbiAgLy8gLSBEZXNkZSBlbCBjaGF0IChoZWFkZXIgbyBwcm9qZWN0L2NsaWVudC90YXNrKTogaW5pY2lhIHVuYSBjb252ZXJzYWNpw7NuIG51ZXZhIGNvbnNlcnZhbmRvIGVsXG4gIC8vICAgY29udGV4dG8gcGluZWFkbyB5IHZ1ZWx2ZSBhbCBob21lIChwYXNvIDIgY29uIEZBUXMvRlVBcykuXG4gIC8vIC0gRW4gZWwgaG9tZSBwYXNvIDIgKEZBUXMvRlVBcyBjb24gY29udGV4dG8pOiBsaW1waWEgZWwgY29udGV4dG8gcGluZWFkbyB5IHZ1ZWx2ZSBhbCBwYXNvIDFcbiAgLy8gICAoc2VsZWN0b3IgZGUgY29udGV4dG9zIHJlY2llbnRlcykuIEVuIGhlYWRlciBzaWVtcHJlOyBlbiBwcm9qZWN0L2NsaWVudC90YXNrIHNvbG8gc2kgZWxcbiAgLy8gICB1c3VhcmlvIHJlaW5pY2nDsyBlbCBjb250ZXh0byAoZGlkUmVzZXRDb250ZXh0SW5TZWN0aW9uKS5cbiAgY29uc3QgaGFuZGxlQmFjayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCB0byA9IHJlc29sdmVBaUNoYXRCYWNrRGVzdGluYXRpb24oc2VjdGlvbiwgYWdlbnQ/LnR5cGUsIGNvbXB1dGVkQ3VycmVudE9wdGlvbiwgb3B0aW9ucy5ob21lKVxuICAgIGFtcGxpdHVkRXZlbnQoRVZFTlRTLmFpQ2hhdEJhY2ssIHsgdG8gfSlcblxuICAgIC8vIERlc2RlIGVsIGNoYXQg4oaSIG51ZXZhIGNvbnZlcnNhY2nDs24gU0lOIGJvcnJhciBlbCBjb250ZXh0byBwaW5lYWRvLCB2b2x2aWVuZG8gYWwgaG9tZS5cbiAgICBpZiAoY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLmNoYXQpIHtcbiAgICAgIC8vIE5vIGNvcnRhbW9zIGxhIGdlbmVyYWNpw7NuOiBsYSBzZXNpw7NuIHNpZ3VlIHJlc3BvbmRpZW5kbyBlbiBiYWNrZ3JvdW5kLlxuICAgICAgc2V0SXNXcml0aW5nKGZhbHNlKVxuICAgICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICAgICAgc2V0SW5pdGlhbENoYXRJZChudWxsKVxuICAgICAgc2V0TmV3Q2hhdEtleShwcmV2ID0+IHByZXYgKyAxKVxuICAgICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgICBpc1dlYlNlYXJjaEFjdGl2ZSAmJiB0b2dnbGVXZWJTZWFyY2goKVxuICAgICAgaWYgKHJlc2V0U2VsZWN0ZWRDaGF0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgcmVzZXRTZWxlY3RlZENoYXRSZWYuY3VycmVudCgpXG4gICAgICB9XG4gICAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjaGF0LXNlc3Npb24tY2hhbmdlZCcpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gSG9tZSBwYXNvIDIgKGNvbnRleHRvIHBpbmVhZG8pIOKGkiBsaW1waWFyIGVsIGNvbnRleHRvIHkgdm9sdmVyIGFsIHBhc28gMSAoY29udGV4dG9zIHJlY2llbnRlcykuXG4gICAgaWYgKGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5ob21lICYmIChpc0dsb2JhbE1haWFTZWN0aW9uKHNlY3Rpb24pIHx8IGRpZFJlc2V0Q29udGV4dEluU2VjdGlvbikpIHtcbiAgICAgIHNldFByb2plY3QobnVsbClcbiAgICAgIHNldENsaWVudD8uKG51bGwpXG4gICAgICBzZXRUYXNrPy4obnVsbClcbiAgICAgIHNldENoaXBzUHJvamVjdChudWxsKVxuICAgIH1cbiAgfSwgW1xuICAgIGNvbXB1dGVkQ3VycmVudE9wdGlvbixcbiAgICBzZWN0aW9uLFxuICAgIGFnZW50Py50eXBlLFxuICAgIGFtcGxpdHVkRXZlbnQsXG4gICAgb3B0aW9ucy5ob21lLFxuICAgIHN0b3BHZW5lcmF0aW9uRnVuY3Rpb24sXG4gICAgaXNXZWJTZWFyY2hBY3RpdmUsXG4gICAgdG9nZ2xlV2ViU2VhcmNoLFxuICAgIGRpZFJlc2V0Q29udGV4dEluU2VjdGlvbixcbiAgICBzZXRQcm9qZWN0LFxuICAgIHNldENsaWVudCxcbiAgICBzZXRUYXNrLFxuICAgIHNldENoaXBzUHJvamVjdCxcbiAgXSlcblxuICAvLyBEZXRlY3RhIGVsIHJlaW5pY2lvIGRlIGNvbnRleHRvIGVuIHByb2plY3QvY2xpZW50L3Rhc2s6IGNvbnRleHRvIHBpbmVhZG8g4oaSIHZhY8OtbyBjb24gZWxcbiAgLy8gb3JjaGVzdHJhdG9yIChwLiBlai4gYWwgcmVzZWxlY2Npb25hciBNQUlBIGVuIGVsIGxpc3RhZG8pLiBTb2xvIGxhIHRyYW5zaWNpw7NuIGN1ZW50YSwgYXPDrSB1bmFcbiAgLy8gYXBlcnR1cmEgZnJlc2NhIChjb250ZXh0byBwaW5lYWRvIGRlc2RlIGxhIHNlY2Npw7NuKSBubyBsbyBhY3RpdmEuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgcGlubmVkID0gISEodGFzaz8uaWQgfHwgY2hpcHNQcm9qZWN0Py5wcm9qZWN0SWQgfHwgY2xpZW50Py5pZCB8fCBwcm9qZWN0Py5pZClcbiAgICBjb25zdCB3YXNQaW5uZWQgPSBwcmV2SGFzUGlubmVkQ29udGV4dFJlZi5jdXJyZW50XG4gICAgcHJldkhhc1Bpbm5lZENvbnRleHRSZWYuY3VycmVudCA9IHBpbm5lZFxuICAgIGlmICghaXNHbG9iYWxNYWlhU2VjdGlvbihzZWN0aW9uKSAmJiBhZ2VudD8udHlwZSA9PT0gJ29yY2hlc3RyYXRvcicgJiYgd2FzUGlubmVkICYmICFwaW5uZWQpIHtcbiAgICAgIHNldERpZFJlc2V0Q29udGV4dEluU2VjdGlvbih0cnVlKVxuICAgIH1cbiAgfSwgW3Rhc2s/LmlkLCBjaGlwc1Byb2plY3Q/LnByb2plY3RJZCwgY2xpZW50Py5pZCwgcHJvamVjdD8uaWQsIHNlY3Rpb24sIGFnZW50Py50eXBlXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9uTWVyZ2VDcmVhdGVkQWdlbnQgPSAoZXZ0OiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgeyBhZ2VudDogbmV4dEFnZW50IH0gPSAoZXZ0IGFzIEN1c3RvbUV2ZW50PHsgYWdlbnQ6IEFnZW50IH0+KS5kZXRhaWwgfHwge31cbiAgICAgIGlmIChuZXh0QWdlbnQ/LmlkKSB7XG4gICAgICAgIGFkZEFnZW50KG5leHRBZ2VudCwgeyBuYXZpZ2F0ZUhvbWU6IGZhbHNlIH0pXG4gICAgICB9XG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21haWEtbWVyZ2UtY3JlYXRlZC1hZ2VudC1pbnRvLWxpc3QnLCBvbk1lcmdlQ3JlYXRlZEFnZW50KVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLW1lcmdlLWNyZWF0ZWQtYWdlbnQtaW50by1saXN0Jywgb25NZXJnZUNyZWF0ZWRBZ2VudClcbiAgICB9XG4gIH0sIFthZGRBZ2VudF0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBvblN5bmNFZGl0ZWRBZ2VudCA9IChldnQ6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB7IGFnZW50OiBuZXh0QWdlbnQgfSA9IChldnQgYXMgQ3VzdG9tRXZlbnQ8eyBhZ2VudDogQWdlbnQgfT4pLmRldGFpbCB8fCB7fVxuICAgICAgaWYgKCFuZXh0QWdlbnQ/LmlkKSByZXR1cm5cbiAgICAgIHVwZGF0ZUFnZW50KG5leHRBZ2VudClcbiAgICAgIGlmIChhZ2VudD8uaWQgPT09IG5leHRBZ2VudC5pZCkge1xuICAgICAgICBzZWxlY3RBZ2VudChuZXh0QWdlbnQpXG4gICAgICB9XG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21haWEtc3luYy1lZGl0ZWQtYWdlbnQtZnJvbS1jaGF0Jywgb25TeW5jRWRpdGVkQWdlbnQpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21haWEtc3luYy1lZGl0ZWQtYWdlbnQtZnJvbS1jaGF0Jywgb25TeW5jRWRpdGVkQWdlbnQpXG4gICAgfVxuICB9LCBbdXBkYXRlQWdlbnQsIHNlbGVjdEFnZW50LCBhZ2VudD8uaWRdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb3BlbkNoYXRWaWV3ID0gKCkgPT4ge1xuICAgICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgICBzZXRJbml0aWFsQ2hhdElkKG51bGwpXG4gICAgICBzZXROZXdDaGF0S2V5KHByZXYgPT4gcHJldiArIDEpXG4gICAgICBzZXRVc2VySW5pdGlhbE1lc3NhZ2UoeyBtZXNzYWdlOiAnJywgYXR0YWNobWVudHM6IFtdIH0pXG4gICAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuY2hhdClcbiAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjaGF0LXNlc3Npb24tY2hhbmdlZCcpKVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4tY2hhdC12aWV3Jywgb3BlbkNoYXRWaWV3KVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4tY2hhdC12aWV3Jywgb3BlbkNoYXRWaWV3KVxuICAgIH1cbiAgfSwgW10pXG5cbiAgLyoqXG4gICAqIEVsIMOtY29ubyBkZSBNQUlBIGRlbCBoZWFkZXIgbGxldmEgc2llbXByZSBhbCBIb21lLiBTaSBNQUlBIHlhIGVzdMOhIG1vbnRhZGEgcGVyb1xuICAgKiBtaW5pbWl6YWRhLCBlbCBob3N0IG5vIHB1ZWRlIHJlc29sdmVybG8gY2FtYmlhbmRvIGBpc09wZW5gICh5YSBlc3TDoSBlbiB0cnVlKSxcbiAgICogYXPDrSBxdWUgYXZpc2EgcG9yIGV2ZW50byB5IGFjw6EgcmVzdGF1cmFtb3MgeSB2YW1vcyBhbCBIb21lLlxuICAgKi9cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBvcGVuSG9tZSA9ICgpID0+IHtcbiAgICAgIGFwcGx5RXhwYW5kZWRIb3N0VGFrZW92ZXIoe1xuICAgICAgICBzZWN0aW9uOiAnaGVhZGVyJyxcbiAgICAgICAgZW50aXR5OiB7IHByb2plY3RJZDogbnVsbCwgY2xpZW50SWQ6IG51bGwgfSxcbiAgICAgIH0pXG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21haWEtb3Blbi1ob21lJywgb3BlbkhvbWUpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21haWEtb3Blbi1ob21lJywgb3BlbkhvbWUpXG4gICAgfVxuICB9LCBbYXBwbHlFeHBhbmRlZEhvc3RUYWtlb3Zlcl0pXG5cbiAgLyoqXG4gICAqIE90cm8gaG9zdCAocHJveWVjdG8sIGNsaWVudGUsIGJhbm5lciwgaGVhZGVy4oCmKSBwaWRlIGFicmlyIE1BSUEgbWllbnRyYXMgeWEgaGF5IHVuYVxuICAgKiBpbnN0YW5jaWEgbW9udGFkYS4gRXhwYW5kZSBzaSBlc3RhYmEgbWluaW1pemFkbywgYXBsaWNhIGVsIGNvbnRleHRvIGRlbCBob3N0IG51ZXZvXG4gICAqIHkgdmEgYWwgaG9tZSDigJQgc2luIHJlc3RhdXJhciBsYSBjb252ZXJzYWNpw7NuIHByZXZpYSAoZXNvIGxvIGhhY2UgZWwgcGlsbCkuXG4gICAqL1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9wZW5Gcm9tSG9zdCA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHsgZGV0YWlsIH0gPSBldmVudCBhcyBDdXN0b21FdmVudDxNYWlhSG9zdE9wZW5EZXRhaWw+XG4gICAgICBpZiAoIWRldGFpbCkgcmV0dXJuXG4gICAgICBhcHBseUV4cGFuZGVkSG9zdFRha2VvdmVyKGRldGFpbClcbiAgICB9XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKE1BSUFfT1BFTl9GUk9NX0hPU1RfRVZFTlQsIG9wZW5Gcm9tSG9zdClcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihNQUlBX09QRU5fRlJPTV9IT1NUX0VWRU5ULCBvcGVuRnJvbUhvc3QpXG4gICAgfVxuICB9LCBbYXBwbHlFeHBhbmRlZEhvc3RUYWtlb3Zlcl0pXG5cbiAgLyoqIE1pc21vIGZsdWpvIHF1ZSBDaGF0QUlNeUFnZW50cy5oYW5kbGVVc2VBZ2VudCArIG9uQmFjayAoaGFuZGxlcnMuaG9tZSkuXG4gICAqICBFbCBkZXRhaWwgcHVlZGUgdHJhZXIgb3BjaW9uYWxtZW50ZSBgcHJvamVjdGAsIGBjbGllbnRgLCBgdGFza2AgcGFyYSBmbG93cyBxdWVcbiAgICogIG5lY2VzaXRhbiBwcmVzZXJ2YXIgY29udGV4dG8gKGVqLiBzZWxlY3RvciBkZSBhZ2VudGVzIGRlc2RlIHVuYSB0YXJlYSkuIFNpIG5vIHZpZW5lbixcbiAgICogIHNlIG1hbnRpZW5lIGVsIGNvbXBvcnRhbWllbnRvIG9yaWdpbmFsIGRlIGxpbXBpYXIgcHJvamVjdC9jbGllbnQuICovXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb3Blbk5ld0NoYXRXaXRoQWdlbnQgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB7IGRldGFpbCB9ID0gZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8e1xuICAgICAgICBhZ2VudDogQWdlbnRcbiAgICAgICAgcHJvamVjdD86IFByb2plY3QgfCBudWxsXG4gICAgICAgIGNsaWVudD86IENsaWVudCB8IG51bGxcbiAgICAgICAgdGFzaz86IFRhc2sgfCBudWxsXG4gICAgICB9PlxuICAgICAgY29uc3QgbmV4dEFnZW50ID0gZGV0YWlsPy5hZ2VudFxuICAgICAgaWYgKCFuZXh0QWdlbnQpIHJldHVyblxuXG4gICAgICBzZXRQcm9qZWN0KGRldGFpbD8ucHJvamVjdCA/PyBudWxsKVxuICAgICAgc2V0Q2xpZW50Py4oZGV0YWlsPy5jbGllbnQgPz8gbnVsbClcbiAgICAgIGlmIChkZXRhaWw/LnRhc2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzZXRUYXNrPy4oZGV0YWlsLnRhc2spXG4gICAgICB9XG4gICAgICBzZWxlY3RBZ2VudChuZXh0QWdlbnQpXG4gICAgICBzZXRIYXNFcnJvcihmYWxzZSlcbiAgICAgIHNldEN1cnJlbnRPcHRpb24ob3B0aW9ucy5ob21lKVxuICAgIH1cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21haWEtb3Blbi1uZXctY2hhdC13aXRoLWFnZW50Jywgb3Blbk5ld0NoYXRXaXRoQWdlbnQpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21haWEtb3Blbi1uZXctY2hhdC13aXRoLWFnZW50Jywgb3Blbk5ld0NoYXRXaXRoQWdlbnQpXG4gICAgfVxuICB9LCBbc2VsZWN0QWdlbnQsIHNldENsaWVudCwgc2V0UHJvamVjdCwgc2V0VGFza10pXG5cbiAgLy8gTWV0YWRhdGEgZGUgbGEgc2Vzc2lvbiBhYmllcnRhIChhZ2VudF90eXBlL2FnZW50X2VudGl0eSArIGNvbnRleHRvKSwgZW1pdGlkYSBwb3IgdXNlQ2hhdE1lc3NhZ2VzLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9uU2Vzc2lvbk1ldGEgPSAoZXZ0OiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgeyBkZXRhaWwgfSA9IGV2dCBhcyBDdXN0b21FdmVudDxTZXNzaW9uTWV0YT5cbiAgICAgIGlmIChkZXRhaWwpIHNldFNlc3Npb25NZXRhKGRldGFpbClcbiAgICB9XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbWFpYS1jaGF0LXNlc3Npb24tbWV0YScsIG9uU2Vzc2lvbk1ldGEpXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21haWEtY2hhdC1zZXNzaW9uLW1ldGEnLCBvblNlc3Npb25NZXRhKVxuICAgIH1cbiAgfSwgW10pXG5cbiAgLy8gQWwgY2FtYmlhciBkZSBjb252ZXJzYWNpw7NuIGxpbXBpYW1vcyBsYSBtZXRhZGF0YTsgZWwgbG9hZCBkZSBsYSBudWV2YSBzZXNzaW9uIGxhIHZ1ZWx2ZSBhIGVtaXRpci5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZXRTZXNzaW9uTWV0YShudWxsKVxuICB9LCBbaW5pdGlhbENoYXRJZF0pXG5cbiAgLy8gQ2FydGVsIFwiY29udGludWFyIGVuIHVuIGNoYXQgbnVldm9cIjogc2UgbXVlc3RyYSBhbCBhYnJpciB1bmEgY29udmVyc2FjacOzbiBkZSB1biBjbG9uZSBsZWdhY3lcbiAgLy8gKGFnZW50X3R5cGUgPT09ICdjbG9uZScgY29uIGVudGl0eSBwcm9qZWN0L3Rhc2svY2xpZW50KS4gRWwgaW5wdXQgc2UgcmVlbXBsYXphIHBvciBlbCBjYXJ0ZWwuXG4gIGNvbnN0IGxlZ2FjeUNvbnRleHRTZXNzaW9uID0gdXNlTWVtbzx7IGVudGl0eVR5cGU6IExlZ2FjeUNvbnRleHRFbnRpdHk7IGNvbnRleHROYW1lOiBzdHJpbmcgfSB8IG51bGw+KCgpID0+IHtcbiAgICBpZiAoY29tcHV0ZWRDdXJyZW50T3B0aW9uICE9PSBvcHRpb25zLmNoYXQpIHJldHVybiBudWxsXG4gICAgaWYgKCFzZXNzaW9uTWV0YSB8fCBzZXNzaW9uTWV0YS5hZ2VudFR5cGUgIT09ICdjbG9uZScpIHJldHVybiBudWxsXG4gICAgY29uc3QgZW50aXR5ID0gc2Vzc2lvbk1ldGEuYWdlbnRFbnRpdHlcbiAgICBpZiAoIWVudGl0eSB8fCAhTEVHQUNZX0NPTlRFWFRfRU5USVRJRVMuaW5jbHVkZXMoZW50aXR5IGFzIExlZ2FjeUNvbnRleHRFbnRpdHkpKSByZXR1cm4gbnVsbFxuICAgIGNvbnN0IGNvbnRleHROYW1lID1cbiAgICAgIGVudGl0eSA9PT0gJ3Rhc2snID8gc2Vzc2lvbk1ldGEudGFza05hbWUgOiBlbnRpdHkgPT09ICdwcm9qZWN0JyA/IHNlc3Npb25NZXRhLnByb2plY3ROYW1lIDogc2Vzc2lvbk1ldGEuY2xpZW50TmFtZVxuICAgIHJldHVybiB7IGVudGl0eVR5cGU6IGVudGl0eSBhcyBMZWdhY3lDb250ZXh0RW50aXR5LCBjb250ZXh0TmFtZTogY29udGV4dE5hbWUgfHwgJycgfVxuICB9LCBbY29tcHV0ZWRDdXJyZW50T3B0aW9uLCBzZXNzaW9uTWV0YV0pXG5cbiAgLy8gTWFyY2EgZWwgYWdlbnRlIGRlIGxhIGNvbnZlcnNhY2nDs24gbGVnYWN5IHBhcmEgcXVlIGhlYWRlciwgc2VsZWN0b3IgeSBhdmF0YXIgbXVlc3RyZW4gZWwgbG9nb1xuICAvLyBNQUlBIHkgZWwgbm9tYnJlIHRhY2hhZG8gKGFnZW50ZSBvYnNvbGV0byksIHNpbiBkZXBlbmRlciBkZWwgYHR5cGVgIHJlc3VlbHRvIGRlIGxhIHNlc2nDs24gdmllamEuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGxlZ2FjeUNvbnRleHRTZXNzaW9uICYmIGFnZW50ICYmICFhZ2VudC5pc19sZWdhY3lfY29udGV4dCkge1xuICAgICAgc2VsZWN0QWdlbnQoeyAuLi5hZ2VudCwgaXNfbGVnYWN5X2NvbnRleHQ6IHRydWUgfSlcbiAgICB9XG4gIH0sIFtsZWdhY3lDb250ZXh0U2Vzc2lvbiwgYWdlbnQsIHNlbGVjdEFnZW50XSlcblxuICAvLyBBYnJlIHVuIGNoYXQgbnVldm8gY29uIGVsIG9yY2hlc3RyYXRvciBzZXRlYW5kbyBlbCBjb250ZXh0byBkZWwgY2xvbmUgbGVnYWN5IChtaXNtbyBjcml0ZXJpb1xuICAvLyBxdWUgY2xpY2tlYXIgdW4gY29udGV4dG8gcmVjaWVudGUgZW4gZWwgaG9tZSDihpIgcGFzbyAyIGNvbiBGQVFzL2FjY2lvbmVzIGRlIGVzZSBjb250ZXh0bykuXG4gIGNvbnN0IGhhbmRsZUNvbnRpbnVlTGVnYWN5Q29udGV4dEluTmV3Q2hhdCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoIXNlc3Npb25NZXRhKSByZXR1cm5cbiAgICBjb25zdCB7XG4gICAgICBhZ2VudEVudGl0eSxcbiAgICAgIHByb2plY3RJZDogcElkLFxuICAgICAgcHJvamVjdE5hbWU6IHBOYW1lLFxuICAgICAgY2xpZW50SWQ6IGNJZCxcbiAgICAgIGNsaWVudE5hbWU6IGNOYW1lLFxuICAgICAgdGFza0lkOiB0SWQsXG4gICAgICB0YXNrTmFtZTogdE5hbWUsXG4gICAgfSA9IHNlc3Npb25NZXRhXG5cbiAgICBjb25zdCBvcmNoZXN0cmF0b3IgPSBhZ2VudHMuZGF0YS5maW5kKChhOiBBZ2VudCkgPT4gYS50eXBlID09PSAnb3JjaGVzdHJhdG9yJylcbiAgICBpZiAoIW9yY2hlc3RyYXRvcikgcmV0dXJuXG5cbiAgICAvLyBSZXNldCBkZWwgY2hhdCDihpIgY29udmVyc2FjacOzbiBudWV2YSAobGEgYW50ZXJpb3Igc2lndWUgZW4gYmFja2dyb3VuZClcbiAgICBzZXRJc1dyaXRpbmcoZmFsc2UpXG4gICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICAgIHNldEluaXRpYWxDaGF0SWQobnVsbClcbiAgICBzZXROZXdDaGF0S2V5KHByZXYgPT4gcHJldiArIDEpXG4gICAgc2V0SGFzRXJyb3IoZmFsc2UpXG5cbiAgICAvLyBTZXRlYXIgY29udGV4dG8gKG1pc21vIGNyaXRlcmlvIHF1ZSBoYW5kbGVTZWxlY3RSZWNlbnRDb250ZXh0IGRlbCBob21lKVxuICAgIHNldFRhc2s/LihudWxsKVxuICAgIHNldFByb2plY3QobnVsbClcbiAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgIHNldENoaXBzUHJvamVjdChudWxsKVxuXG4gICAgaWYgKGFnZW50RW50aXR5ID09PSAnY2xpZW50JyAmJiBjSWQgIT0gbnVsbCkge1xuICAgICAgc2V0Q2xpZW50Py4oeyBpZDogY0lkLCBuYW1lOiBjTmFtZSB8fCAnJyB9KVxuICAgIH0gZWxzZSBpZiAoYWdlbnRFbnRpdHkgPT09ICdwcm9qZWN0JyAmJiBwSWQgIT0gbnVsbCkge1xuICAgICAgc2V0UHJvamVjdCh7XG4gICAgICAgIGlkOiBwSWQsXG4gICAgICAgIG5hbWU6IHBOYW1lIHx8ICcnLFxuICAgICAgICAuLi4oY0lkICE9IG51bGwgPyB7IGNsaWVudElkOiBjSWQsIGNsaWVudDogeyBpZDogY0lkLCBuYW1lOiBjTmFtZSB8fCAnJyB9IH0gOiB7fSksXG4gICAgICB9KVxuICAgICAgc2V0Q2hpcHNQcm9qZWN0KHsgcHJvamVjdElkOiBTdHJpbmcocElkKSwgcHJvamVjdE5hbWU6IHBOYW1lIHx8ICcnLCBjbGllbnROYW1lOiBjTmFtZSB8fCAnJyB9KVxuICAgIH0gZWxzZSBpZiAoYWdlbnRFbnRpdHkgPT09ICd0YXNrJyAmJiB0SWQgIT0gbnVsbCkge1xuICAgICAgc2V0VGFzaz8uKHtcbiAgICAgICAgaWQ6IHRJZCxcbiAgICAgICAgbmFtZTogdE5hbWUgfHwgJycsXG4gICAgICAgIC4uLihwSWQgIT0gbnVsbCA/IHsgcHJvamVjdElkOiBwSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKGNJZCAhPSBudWxsID8geyBjbGllbnRJZDogY0lkIH0gOiB7fSksXG4gICAgICB9KVxuICAgICAgaWYgKGNJZCAhPSBudWxsKSBzZXRDbGllbnQ/Lih7IGlkOiBjSWQsIG5hbWU6IGNOYW1lIHx8ICcnIH0pXG4gICAgICBpZiAocElkICE9IG51bGwpIHtcbiAgICAgICAgc2V0UHJvamVjdCh7XG4gICAgICAgICAgaWQ6IHBJZCxcbiAgICAgICAgICBuYW1lOiBwTmFtZSB8fCAnJyxcbiAgICAgICAgICAuLi4oY0lkICE9IG51bGwgPyB7IGNsaWVudElkOiBjSWQsIGNsaWVudDogeyBpZDogY0lkLCBuYW1lOiBjTmFtZSB8fCAnJyB9IH0gOiB7fSksXG4gICAgICAgIH0pXG4gICAgICAgIHNldENoaXBzUHJvamVjdCh7IHByb2plY3RJZDogU3RyaW5nKHBJZCksIHByb2plY3ROYW1lOiBwTmFtZSB8fCAnJywgY2xpZW50TmFtZTogY05hbWUgfHwgJycgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZWxlY3RBZ2VudChvcmNoZXN0cmF0b3IpXG4gICAgc2V0U2Vzc2lvbk1ldGEobnVsbClcbiAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2hhdC1zZXNzaW9uLWNoYW5nZWQnKSlcbiAgfSwgW3Nlc3Npb25NZXRhLCBhZ2VudHMuZGF0YSwgc2VsZWN0QWdlbnQsIHNldENsaWVudCwgc2V0UHJvamVjdCwgc2V0VGFzaywgc2V0Q2hpcHNQcm9qZWN0LCBzdG9wR2VuZXJhdGlvbkZ1bmN0aW9uXSlcblxuICBjb25zdCBzaG93TmV3Q2hhdCA9IGNvbXB1dGVkQ3VycmVudE9wdGlvbiAhPT0gb3B0aW9ucy5jaGF0XG4gIGNvbnN0IGhpZGVIZWFkZXJBZ2VudFNlbGVjdG9yID0gY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLm15U2tpbGxzXG4gIGNvbnN0IGlzTXlBZ2VudHNTZWN0aW9uID0gY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLm15QWdlbnRzXG5cbiAgLy8gQm90w7NuIFwidm9sdmVyXCI6IHNvbG8gcGFyYSBlbCBvcmNoZXN0cmF0b3IuXG4gIC8vIC0gRW4gZWwgY2hhdDogZGlzcG9uaWJsZSBlbiB0b2RhcyBsYXMgc2VjY2lvbmVzIChoZWFkZXIgeSBwcm9qZWN0L2NsaWVudC90YXNrKS5cbiAgLy8gLSBFbiBlbCBob21lIHBhc28gMiAoRkFRcy9GVUFzIGNvbiBjb250ZXh0byBwaW5lYWRvKTogZW4gZWwgaGVhZGVyIHNpZW1wcmU7IGVuXG4gIC8vICAgcHJvamVjdC9jbGllbnQvdGFzayBzb2xvIHNpIGVsIHVzdWFyaW8gcmVpbmljacOzIGVsIGNvbnRleHRvIChwYXPDsyBwb3IgZWwgc2VsZWN0b3IgZGVcbiAgLy8gICBjb250ZXh0b3MgcmVjaWVudGVzKS4gRW4gZWwgcGFzbyAxIChzaW4gY29udGV4dG8pIE5PIHNlIG11ZXN0cmEuXG4gIGNvbnN0IGhhc1Bpbm5lZENvbnRleHQgPSAhISh0YXNrPy5pZCB8fCBjaGlwc1Byb2plY3Q/LnByb2plY3RJZCB8fCBjbGllbnQ/LmlkIHx8IHByb2plY3Q/LmlkKVxuICBjb25zdCBpc0NoYXRWaWV3ID0gY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLmNoYXRcbiAgY29uc3QgaXNIb21lU3RlcDIgPSBjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuaG9tZSAmJiBoYXNQaW5uZWRDb250ZXh0XG4gIGNvbnN0IGlzSGVhZGVySG9tZVN0ZXAyID0gaXNHbG9iYWxNYWlhU2VjdGlvbihzZWN0aW9uKSAmJiBpc0hvbWVTdGVwMlxuICBjb25zdCBpc1NlY3Rpb25SZXNldEhvbWVTdGVwMiA9ICFpc0dsb2JhbE1haWFTZWN0aW9uKHNlY3Rpb24pICYmIGlzSG9tZVN0ZXAyICYmIGRpZFJlc2V0Q29udGV4dEluU2VjdGlvblxuICBjb25zdCBzaG93QmFja0J1dHRvbiA9XG4gICAgYWdlbnQ/LnR5cGUgPT09ICdvcmNoZXN0cmF0b3InICYmXG4gICAgIWhhc0Vycm9yICYmXG4gICAgIWxvYWRpbmcgJiZcbiAgICAoaXNDaGF0VmlldyB8fCBpc0hlYWRlckhvbWVTdGVwMiB8fCBpc1NlY3Rpb25SZXNldEhvbWVTdGVwMilcbiAgY29uc3QgaGFuZGxlT3Blbk1hcmtldHBsYWNlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmICghd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjbGVhckFnZW50KClcbiAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMubXlBZ2VudHMpXG4gIH0sIFtjbGVhckFnZW50XSlcblxuICBjb25zdCBoYW5kbGVPcGVuU2tpbGxzID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGlmICghd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBzZXRIYXNFcnJvcihmYWxzZSlcbiAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMubXlTa2lsbHMpXG4gICAgaGFuZGxlR2V0U2tpbGxzKClcbiAgfSwgW2hhbmRsZUdldFNraWxsc10pXG5cbiAgY29uc3QgaGFuZGxlR29Ub01haWFrZXIgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgbGV0IG1haWFrZXJBZ2VudCA9IGFnZW50cy5kYXRhLmZpbmQoKGE6IEFnZW50KSA9PiBpc01hcmtldHBsYWNlR2xvYmFsQ2xvbmVBZ2VudChhKSlcbiAgICBpZiAoIW1haWFrZXJBZ2VudCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaE1haWEoe1xuICAgICAgICAgIHBhdGg6IGBhZ2VudHM/YWdlbnRfdHlwZT1jbG9uZSZlbnRpdHk9Z2xvYmFsJmxhbmc9JHttYXBDT1JMYW5nKGkxOG4ubGFuZ3VhZ2UpfWAsXG4gICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICAgICAgICBtYWlha2VyQWdlbnQgPSAoZGF0YS5kYXRhIHx8IFtdKS5maW5kKChhOiBBZ2VudCkgPT4gaXNNYXJrZXRwbGFjZUdsb2JhbENsb25lQWdlbnQoYSkpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuICAgIGlmICghbWFpYWtlckFnZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgc2V0UHJvamVjdChudWxsKVxuICAgIHNldENsaWVudD8uKG51bGwpXG4gICAgc2V0VGFzaz8uKG51bGwpXG4gICAgc2VsZWN0QWdlbnQobWFpYWtlckFnZW50KVxuICAgIHNldEN1cnJlbnRPcHRpb24ob3B0aW9ucy5ob21lKVxuICAgIGlmIChyZXNldFNlbGVjdGVkQ2hhdFJlZi5jdXJyZW50KSB7XG4gICAgICByZXNldFNlbGVjdGVkQ2hhdFJlZi5jdXJyZW50KClcbiAgICB9XG4gIH0sIFthZ2VudHMuZGF0YSwgaTE4bi5sYW5ndWFnZSwgc2VsZWN0QWdlbnQsIHNldENsaWVudCwgc2V0UHJvamVjdCwgc2V0VGFza10pXG4gIGNvbnN0IGhhbmRsZURlbGV0ZUFnZW50RnJvbU15QWdlbnRzID0gdXNlQ2FsbGJhY2soXG4gICAgKGFnZW50SWQ6IHN0cmluZykgPT4ge1xuICAgICAgcmVtb3ZlQWdlbnQoYWdlbnRJZClcbiAgICAgIGlmIChhZ2VudD8uaWQgPT09IGFnZW50SWQpIHtcbiAgICAgICAgc2VsZWN0Rmlyc3RBZ2VudChhZ2VudElkKVxuICAgICAgfVxuICAgIH0sXG4gICAgW2FnZW50Py5pZCwgcmVtb3ZlQWdlbnQsIHNlbGVjdEZpcnN0QWdlbnRdXG4gIClcblxuICAvLyBFbCBmb290ZXIgKGlucHV0KSBzZSBvY3VsdGEgc29sbyBlbiBlbCBob21lIG1hcmtldHBsYWNlIGRlIE1haWFrZXIgKGJyb3dzZSBkZSBhZ2VudGVzKS5cbiAgLy8gRWwgaG9tZSBkZWwgb3JjaGVzdHJhdG9yIHPDrSBwZXJtaXRlIGVzY3JpYmlyLCBhc8OtIHF1ZSBtYW50aWVuZSBlbCBmb290ZXIuXG4gIGNvbnN0IGlzTWFpYWtlckNyZWF0b3JIb21lID0gY29tcHV0ZWRDdXJyZW50T3B0aW9uID09PSBvcHRpb25zLmhvbWUgJiYgaXNNYWlha2VyQWdlbnRTZWxlY3RlZFxuXG4gIGNvbnN0IG1vZGFsUGFuZWwgPSAoXG4gICAgPD5cbiAgICAgIHt2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZShzZWN0aW9uLCB1c2VyKSAmJiAhaXNGbG9hdGluZyA/IChcbiAgICAgICAgPFNpZGViYXJcbiAgICAgICAgICBvbkdvVG9DaGF0PXtnb1RvQ2hhdH1cbiAgICAgICAgICBvbkVycm9yPXsoKSA9PiBzZXRTaWRlYmFySGFzRXJyb3IodHJ1ZSl9XG4gICAgICAgICAgaGFuZGxlR29Ub0hvbWU9e2hhbmRsZUdvSG9tZX1cbiAgICAgICAgICBoYW5kbGVTdGFydE5ld0NoYXQ9e2hhbmRsZVN0YXJ0TmV3Q2hhdH1cbiAgICAgICAgICBoYW5kbGVPcGVuTWFya2V0cGxhY2U9e2hhbmRsZU9wZW5NYXJrZXRwbGFjZX1cbiAgICAgICAgICBzaG93TmV3Q2hhdD17c2hvd05ld0NoYXR9XG4gICAgICAgICAgcmVmZXRjaENoYXRzPXtyZWZldGNoQ2hhdHN9XG4gICAgICAgICAgaGFuZGxlU2V0UmVmZXRjaENoYXRzPXtzZXRSZWZldGNoQ2hhdHN9XG4gICAgICAgICAgaGFzRXJyb3I9e3NpZGViYXJIYXNFcnJvcn1cbiAgICAgICAgICByZXNldFNlbGVjdGVkQ2hhdFJlZj17cmVzZXRTZWxlY3RlZENoYXRSZWZ9XG4gICAgICAgICAgYWdlbnRzTmF2QWN0aXZlPXtzaWRlYmFyQWdlbnRzTmF2QWN0aXZlfVxuICAgICAgICAgIGhhbmRsZU9wZW5Ta2lsbHM9e2hhbmRsZU9wZW5Ta2lsbHN9XG4gICAgICAgICAgaXNMZWdhY3lDb250ZXh0U2Vzc2lvbj17ISFsZWdhY3lDb250ZXh0U2Vzc2lvbn1cbiAgICAgICAgLz5cbiAgICAgICkgOiBudWxsfVxuICAgICAgPFNDQ0FJTUNvbnRlbnQgZXhwYW5kZWQ9e2V4cGFuZGVkfSBmbG9hdGluZz17aXNGbG9hdGluZ30+XG4gICAgICAgIDxDaGF0QUlNb2RhbEhlYWRlclxuICAgICAgICAgIGxheW91dE1vZGU9e2xheW91dE1vZGV9XG4gICAgICAgICAgb25MYXlvdXRNb2RlQ2hhbmdlPXtoYW5kbGVMYXlvdXRNb2RlQ2hhbmdlfVxuICAgICAgICAgIGV4cGFuZGVkPXtleHBhbmRlZH1cbiAgICAgICAgICBkcmFnZ2FibGU9e2lzRmxvYXRpbmd9XG4gICAgICAgICAgb25EcmFnU3RhcnQ9e2hhbmRsZURyYWdTdGFydH1cbiAgICAgICAgICBvbkRyYWdNb3ZlPXtoYW5kbGVEcmFnTW92ZX1cbiAgICAgICAgICBvbkRyYWdFbmQ9e2hhbmRsZURyYWdFbmR9XG4gICAgICAgICAgaGFuZGxlTWluaW1pemU9e2hhbmRsZU1pbmltaXplfVxuICAgICAgICAgIGFnZW50cz17YWdlbnRzLmRhdGF9XG4gICAgICAgICAgaGFzRXJyb3I9eyEhYWdlbnRFcnJvcn1cbiAgICAgICAgICBsb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgICAgIGxvYWRpbmdNb3JlPXtsb2FkaW5nTW9yZX1cbiAgICAgICAgICBoYXNNb3JlPXthZ2VudHMuaGFzX21vcmV9XG4gICAgICAgICAgaGFuZGxlUmVzZXRDaGF0PXtoYW5kbGVSZXNldENoYXR9XG4gICAgICAgICAgb25BZ2VudFVwZGF0ZT17dXBkYXRlQWdlbnRGYXZvcml0ZX1cbiAgICAgICAgICBsb2FkTW9yZUFnZW50cz17bG9hZE1vcmVBZ2VudHN9XG4gICAgICAgICAgc29ydEFnZW50c0xpc3Q9e3NvcnRBZ2VudHNMaXN0fVxuICAgICAgICAgIGlzTXlBZ2VudHNTZWN0aW9uPXtpc015QWdlbnRzU2VjdGlvbn1cbiAgICAgICAgICBpc01haWFrZXJTZWN0aW9uPXtpc01haWFrZXJDcmVhdG9ySG9tZX1cbiAgICAgICAgICBoaWRlQWdlbnRTZWxlY3Rvcj17aGlkZUhlYWRlckFnZW50U2VsZWN0b3J9XG4gICAgICAgICAgc2hvd0JhY2tCdXR0b249e3Nob3dCYWNrQnV0dG9ufVxuICAgICAgICAgIG9uQmFjaz17aGFuZGxlQmFja31cbiAgICAgICAgLz5cbiAgICAgICAge2hhc0Vycm9yID8gKFxuICAgICAgICAgIDxNQUlBRXJyb3IgLz5cbiAgICAgICAgKSA6IHZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlKHNlY3Rpb24sIHVzZXIpID8gKFxuICAgICAgICAgIDxDaGF0QUlDb250ZW50XG4gICAgICAgICAgICBjdXJyZW50T3B0aW9uPXtjb21wdXRlZEN1cnJlbnRPcHRpb259XG4gICAgICAgICAgICBoYW5kbGVycz17eyAuLi5oYW5kbGVycywgY2hhdDogc3RhcnRDaGF0LCBob21lOiBoYW5kbGVycy5ob21lLCBoYW5kbGVHb0hvbWUgfX1cbiAgICAgICAgICAgIG9uRXJyb3I9eygpID0+IHNldEhhc0Vycm9yKHRydWUpfVxuICAgICAgICAgICAgcmVmcz17eyB1c2VySW5pdGlhbE1lc3NhZ2UsIGluaXRpYWxDaGF0SWQgfX1cbiAgICAgICAgICAgIG9uU2VuZE1lc3NhZ2VSZWFkeT17aGFuZGxlU2VuZE1lc3NhZ2VSZWFkeX1cbiAgICAgICAgICAgIGV4cGFuZGVkPXtleHBhbmRlZH1cbiAgICAgICAgICAgIGZsb2F0aW5nPXtpc0Zsb2F0aW5nfVxuICAgICAgICAgICAgYWdlbnRzPXthZ2VudHMuZGF0YX1cbiAgICAgICAgICAgIGxvYWRpbmdBZ2VudHM9e2xvYWRpbmd9XG4gICAgICAgICAgICBvbkRlbGV0ZUFnZW50PXtoYW5kbGVEZWxldGVBZ2VudEZyb21NeUFnZW50c31cbiAgICAgICAgICAgIG9uRmF2b3JpdGVBZ2VudFVwZGF0ZT17dXBkYXRlQWdlbnRGYXZvcml0ZX1cbiAgICAgICAgICAgIGhhc01vcmVBZ2VudHM9eyEhYWdlbnRzLmhhc19tb3JlfVxuICAgICAgICAgICAgbG9hZGluZ01vcmVBZ2VudHM9e2xvYWRpbmdNb3JlfVxuICAgICAgICAgICAgb25Mb2FkTW9yZUFnZW50cz17bG9hZE1vcmVBZ2VudHN9XG4gICAgICAgICAgICBvbkdvVG9NYWlha2VyPXtoYW5kbGVHb1RvTWFpYWtlcn1cbiAgICAgICAgICAgIHNraWxscz17c2tpbGxzfVxuICAgICAgICAgICAgbG9hZGluZ1NraWxscz17bG9hZGluZ1NraWxsc31cbiAgICAgICAgICAgIG9uRGVsZXRlU2tpbGw9e3JlbW92ZVNraWxsfVxuICAgICAgICAgICAgb25TZWFyY2hBZ2VudHM9e3NlYXJjaEN1c3RvbUFnZW50c31cbiAgICAgICAgICAgIHNlYXJjaExvYWRpbmdBZ2VudHM9e3NlYXJjaExvYWRpbmd9XG4gICAgICAgICAgICBhZ2VudEVycm9yPXthZ2VudEVycm9yfVxuICAgICAgICAgIC8+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPFByb2plY3RTdW1tYXJ5Q29udGVudCBvblJlc3RhcnRTdW1tYXJ5PXtoYW5kbGVycy5ob21lfSAvPlxuICAgICAgICApfVxuICAgICAgICB7KChjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuaG9tZSAmJiAhIWFnZW50cz8uZGF0YT8ubGVuZ3RoKSB8fFxuICAgICAgICAgIGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5jaGF0KSAmJlxuICAgICAgICAgICFpc01haWFrZXJDcmVhdG9ySG9tZSAmJlxuICAgICAgICAgICFoYXNFcnJvciAmJlxuICAgICAgICAgICFsb2FkaW5nICYmXG4gICAgICAgICAgdmFsaWRhdGVBY2Nlc3NCeUZlYXR1cmUoc2VjdGlvbiwgdXNlcikgJiYgKFxuICAgICAgICAgICAgPENoYXRBaU1vZGFsRm9vdGVyXG4gICAgICAgICAgICAgIGFnZW50PXthZ2VudH1cbiAgICAgICAgICAgICAgaGFuZGxlU2VuZE1lc3NhZ2U9e2hhbmRsZVNlbmRNZXNzYWdlfVxuICAgICAgICAgICAgICBoYW5kbGVTdG9wR2VuZXJhdGlvbj17c3RvcEdlbmVyYXRpb25GdW5jdGlvbn1cbiAgICAgICAgICAgICAgaXNTdHJlYW1pbmc9e2lzU3RyZWFtaW5nfVxuICAgICAgICAgICAgICBpc1dyaXRpbmc9e2lzV3JpdGluZ31cbiAgICAgICAgICAgICAgY2hhdElkPXtpbml0aWFsQ2hhdElkfVxuICAgICAgICAgICAgICBuZXdDaGF0S2V5PXtuZXdDaGF0S2V5fVxuICAgICAgICAgICAgICB0b29sdGlwWkluZGV4PXt0b29sdGlwWkluZGV4fVxuICAgICAgICAgICAgICBsZWdhY3lDb250ZXh0U2Vzc2lvbj17bGVnYWN5Q29udGV4dFNlc3Npb259XG4gICAgICAgICAgICAgIG9uQ29udGludWVJbk5ld0NoYXQ9e2hhbmRsZUNvbnRpbnVlTGVnYWN5Q29udGV4dEluTmV3Q2hhdH1cbiAgICAgICAgICAgICAgbGF5b3V0TW9kZT17bGF5b3V0TW9kZX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKX1cbiAgICAgIDwvU0NDQUlNQ29udGVudD5cbiAgICA8Lz5cbiAgKVxuXG4gIGNvbnN0IGNvbnRlbnRXcmFwcGVyID0gKFxuICAgIDxTQ0NBSU1Db250ZW50V3JhcHBlciBleHBhbmRlZD17ZXhwYW5kZWR9IGZsb2F0aW5nPXtpc0Zsb2F0aW5nfSByZWY9e2NvbnRlbnRXcmFwcGVyUmVmfT5cbiAgICAgIHttb2RhbFBhbmVsfVxuICAgIDwvU0NDQUlNQ29udGVudFdyYXBwZXI+XG4gIClcblxuICByZXR1cm4gKFxuICAgIHNlbGVjdG9yICYmXG4gICAgUmVhY3RET00uY3JlYXRlUG9ydGFsKFxuICAgICAgPFNDQ0FJTVdyYXBwZXJcbiAgICAgICAgZXhwYW5kZWQ9e2V4cGFuZGVkfVxuICAgICAgICBsYXlvdXRNb2RlPXtsYXlvdXRNb2RlfVxuICAgICAgICBkcmFnUG9zaXRpb249e3Jlc29sdmVkRHJhZ1Bvc2l0aW9ufVxuICAgICAgICBlbGV2YXRlZD17c2VjdGlvbiA9PT0gJ3Rhc2snfVxuICAgICAgICAkbWluaW1pemVkPXtpc01pbmltaXplZH1cbiAgICAgID5cbiAgICAgICAgPFNDQ0FJTU1pbmltaXplZEhpZGUgJGhpZGRlbj17aXNNaW5pbWl6ZWR9PlxuICAgICAgICAgIDxGbG9hdGluZ1BhbmVsTW90aW9uIHRpbHQ9e3RpbHRNb3Rpb259IGV4cGFuZGVkPXtleHBhbmRlZH0+XG4gICAgICAgICAgICB7Y29udGVudFdyYXBwZXJ9XG4gICAgICAgICAgPC9GbG9hdGluZ1BhbmVsTW90aW9uPlxuICAgICAgICA8L1NDQ0FJTU1pbmltaXplZEhpZGU+XG4gICAgICAgIHtpc01pbmltaXplZCAmJiAoXG4gICAgICAgICAgPE1haWFNaW5pbWl6ZWRQaWxsXG4gICAgICAgICAgICB1bnJlYWRDb3VudD17dW5yZWFkQ291bnR9XG4gICAgICAgICAgICBpc1N0cmVhbWluZz17aGFzQWN0aXZlU3RyZWFtfVxuICAgICAgICAgICAgb25SZXN0b3JlPXtoYW5kbGVSZXN0b3JlRnJvbU1pbmltaXplZH1cbiAgICAgICAgICAvPlxuICAgICAgICApfVxuICAgICAgICB7dXNlckhhc1Blcm1pc3Npb25zICYmIChcbiAgICAgICAgICA8QWJtQWdlbnRNb2RhbFxuICAgICAgICAgICAgYWRkQWdlbnQ9e2FkZEFnZW50fVxuICAgICAgICAgICAgdXBkYXRlQWdlbnQ9e3VwZGF0ZUFnZW50fVxuICAgICAgICAgICAgcmVtb3ZlQWdlbnQ9e3JlbW92ZUFnZW50fVxuICAgICAgICAgICAgdXBkYXRlQWdlbnRGYXZvcml0ZT17dXBkYXRlQWdlbnRGYXZvcml0ZX1cbiAgICAgICAgICAgIHNlbGVjdEZpcnN0QWdlbnQ9e3NlbGVjdEZpcnN0QWdlbnR9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgICAge3VzZXJIYXNQZXJtaXNzaW9ucyAmJiAoXG4gICAgICAgICAgPEFibVNraWxsTW9kYWwgYWRkU2tpbGw9e2FkZFNraWxsfSB1cGRhdGVTa2lsbEluTGlzdD17dXBkYXRlU2tpbGxJbkxpc3R9IHJlbW92ZVNraWxsPXtyZW1vdmVTa2lsbH0gLz5cbiAgICAgICAgKX1cbiAgICAgICAge3VzZXJIYXNQZXJtaXNzaW9ucyAmJiA8QWJtU2tpbGxHZW5lcmF0ZU1vZGFsIC8+fVxuICAgICAgICA8U25hY2tiYXIgLz5cbiAgICAgIDwvU0NDQUlNV3JhcHBlcj4sXG4gICAgICBzZWxlY3RvclxuICAgIClcbiAgKVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQ0VBLFdBQVcsRUFDWEMsT0FBTyxFQUNQQyxRQUFRLEVBQ1JDLE1BQU0sRUFDTkMsU0FBUyxFQUNUQyxlQUFlLFFBRVYsT0FBTztBQUNkLE9BQU9DLFFBQVEsTUFBTSxXQUFXO0FBQ2hDLE9BQU9DLE1BQU0sTUFBTSxRQUFRO0FBQzNCLFNBQVNDLGNBQWMsUUFBUSxlQUFlO0FBQzlD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