@projectcor/maia-components 2.29.0 → 2.30.1-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (669) hide show
  1. package/CHANGELOG.md +656 -0
  2. package/lib/App.js +55 -0
  3. package/lib/components/atoms/ActionableButton.js +60 -0
  4. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.js +89 -0
  5. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.styles.js +21 -0
  6. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.js +9 -0
  7. package/lib/components/atoms/AgentActivityIndicator/index.js +2 -0
  8. package/lib/components/atoms/ApprovalBox/ApprovalBox.js +209 -0
  9. package/lib/components/atoms/ApprovalBox/ApprovalBox.styles.js +93 -0
  10. package/lib/components/atoms/ApprovalBox/index.js +2 -0
  11. package/lib/components/atoms/AttachmentCard/AttachmentCard.js +218 -0
  12. package/lib/components/atoms/AttachmentCard/AttachmentCard.styles.js +52 -0
  13. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +448 -0
  14. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.styles.js +58 -0
  15. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.js +55 -0
  16. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.styles.js +14 -0
  17. package/lib/components/atoms/AttachmentCard/index.js +4 -0
  18. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +442 -0
  19. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.styles.js +119 -0
  20. package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.js +222 -0
  21. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +313 -0
  22. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +128 -0
  23. package/lib/components/atoms/AttachmentPreviewModal/index.js +2 -0
  24. package/lib/components/atoms/Backdrop/Backdrop.js +17 -0
  25. package/lib/components/atoms/Backdrop/Backdrop.styles.js +9 -0
  26. package/lib/components/atoms/Backdrop/index.js +2 -0
  27. package/lib/components/atoms/CardItem.js +7 -0
  28. package/lib/components/atoms/CardMenu/CardMenu.js +131 -0
  29. package/lib/components/atoms/CardMenu/index.js +2 -0
  30. package/lib/components/atoms/CardMenu/styles.js +21 -0
  31. package/lib/components/atoms/ChatClientSelector/ChatClientSelector.js +77 -0
  32. package/lib/components/atoms/ChatClientSelector/index.js +2 -0
  33. package/lib/components/atoms/ChatDisclaimerMessage/ChatDisclaimerMessage.js +9 -0
  34. package/lib/components/atoms/ChatDisclaimerMessage/index.js +2 -0
  35. package/lib/components/atoms/ChatDisclaimerMessage/styles.js +6 -0
  36. package/lib/components/atoms/Checkbox/Checkbox.js +34 -0
  37. package/lib/components/atoms/Checkbox/index.js +2 -0
  38. package/lib/components/atoms/Checkbox/styles.js +39 -0
  39. package/lib/components/atoms/Chip/Chip.js +150 -0
  40. package/lib/components/atoms/Chip/index.js +2 -0
  41. package/lib/components/atoms/Chip/styles.js +43 -0
  42. package/lib/components/atoms/ChipLlm/ChipLlm.js +45 -0
  43. package/lib/components/atoms/ChipLlm/ChipLlm.style.js +21 -0
  44. package/lib/components/atoms/ChipLlm/index.js +2 -0
  45. package/lib/components/atoms/ChipStatus/ChipStatus.interface.js +2 -0
  46. package/lib/components/atoms/ChipStatus/ChipStatus.js +14 -0
  47. package/lib/components/atoms/ChipStatus/ChipStatus.styles.js +27 -0
  48. package/lib/components/atoms/ChipStatus/index.js +2 -0
  49. package/lib/components/atoms/ClearButton.js +6 -0
  50. package/lib/components/atoms/ClientSelector/ClientSelector.js +146 -0
  51. package/lib/components/atoms/ClientSelector/ClientSelector.styles.js +15 -0
  52. package/lib/components/atoms/ClientSelector/index.js +2 -0
  53. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.js +38 -0
  54. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.styles.js +188 -0
  55. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.js +39 -0
  56. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +445 -0
  57. package/lib/components/atoms/ContextMentionChip/index.js +4 -0
  58. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +533 -0
  59. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.styles.js +10 -0
  60. package/lib/components/atoms/ContextMentionEditor/index.js +2 -0
  61. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +282 -0
  62. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +148 -0
  63. package/lib/components/atoms/ContextMentionItem/index.js +2 -0
  64. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +290 -0
  65. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.styles.js +108 -0
  66. package/lib/components/atoms/ContextMentionPopover/index.js +3 -0
  67. package/lib/components/atoms/CopyToClipboard.js +70 -0
  68. package/lib/components/atoms/EditableLabel/EditableLabel.js +110 -0
  69. package/lib/components/atoms/EditableLabel/index.js +2 -0
  70. package/lib/components/atoms/EditableLabel/styles.js +7 -0
  71. package/lib/components/atoms/EmptySearchClients/EmptySearchClients.js +22 -0
  72. package/lib/components/atoms/EmptySearchClients/EmptySearchClients.styles.js +18 -0
  73. package/lib/components/atoms/EmptySearchClients/index.js +2 -0
  74. package/lib/components/atoms/EmptySearchProjects/EmptySearchProjects.js +19 -0
  75. package/lib/components/atoms/EmptySearchProjects/EmptySearchProjects.styles.js +15 -0
  76. package/lib/components/atoms/EmptySearchProjects/index.js +2 -0
  77. package/lib/components/atoms/EntitySelector/EntitySelector.js +247 -0
  78. package/lib/components/atoms/EntitySelector/EntitySelector.skeleton.js +38 -0
  79. package/lib/components/atoms/EntitySelector/EntitySelector.styles.js +67 -0
  80. package/lib/components/atoms/EntitySelector/index.js +2 -0
  81. package/lib/components/atoms/ErrorSearchClients/ErrorSearchClients.js +14 -0
  82. package/lib/components/atoms/ErrorSearchClients/ErrorSearchClients.styles.js +15 -0
  83. package/lib/components/atoms/ErrorSearchFaqs/ErrorSearchFaqs.js +14 -0
  84. package/lib/components/atoms/ErrorSearchFaqs/ErrorSearchFaqs.style.js +15 -0
  85. package/lib/components/atoms/ErrorSearchFaqs/index.js +2 -0
  86. package/lib/components/atoms/ErrorSearchProjects/ErrorSearchProjects.js +18 -0
  87. package/lib/components/atoms/ErrorSearchProjects/ErrorSearchProjects.style.js +15 -0
  88. package/lib/components/atoms/ErrorSearchProjects/index.js +2 -0
  89. package/lib/components/atoms/Expand/Expand.js +32 -0
  90. package/lib/components/atoms/Expand/index.js +2 -0
  91. package/lib/components/atoms/Fade/Fade.js +56 -0
  92. package/lib/components/atoms/Fade/index.js +2 -0
  93. package/lib/components/atoms/FeedbackButton/FeedbackButton.js +59 -0
  94. package/lib/components/atoms/FeedbackButton/FeedbackButton.styles.js +14 -0
  95. package/lib/components/atoms/FeedbackButton/index.js +2 -0
  96. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.js +138 -0
  97. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.skeleton.js +44 -0
  98. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.styles.js +43 -0
  99. package/lib/components/atoms/FrequentlyAskedQuestions/index.js +2 -0
  100. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +122 -0
  101. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.skeleton.js +43 -0
  102. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +62 -0
  103. package/lib/components/atoms/FrequentlyUsedActions/index.js +2 -0
  104. package/lib/components/atoms/GoBackButton.js +24 -0
  105. package/lib/components/atoms/HelpButton.js +44 -0
  106. package/lib/components/atoms/IconButton.js +56 -0
  107. package/lib/components/atoms/ImagePreview/ImagePreview.js +96 -0
  108. package/lib/components/atoms/ImagePreview/ImagePreview.styles.js +70 -0
  109. package/lib/components/atoms/Input/CustomInput.interface.js +2 -0
  110. package/lib/components/atoms/Input/CustomInput.js +91 -0
  111. package/lib/components/atoms/Input/CustomInput.styles.js +39 -0
  112. package/lib/components/atoms/Input/index.js +2 -0
  113. package/lib/components/atoms/ListMenuOption/ListMenuOption.js +41 -0
  114. package/lib/components/atoms/ListMenuOption/index.js +2 -0
  115. package/lib/components/atoms/ListMenuOption/styles.js +9 -0
  116. package/lib/components/atoms/Loader.js +41 -0
  117. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.js +11 -0
  118. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.style.js +6 -0
  119. package/lib/components/atoms/LoadingFaqs/index.js +2 -0
  120. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.js +11 -0
  121. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.styles.js +6 -0
  122. package/lib/components/atoms/LoadingSearchClients/index.js +2 -0
  123. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.js +14 -0
  124. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.style.js +10 -0
  125. package/lib/components/atoms/LoadingSearchProjects/index.js +2 -0
  126. package/lib/components/atoms/LoadingText/LoadingText.js +18 -0
  127. package/lib/components/atoms/LoadingText/index.js +2 -0
  128. package/lib/components/atoms/LoadingText/styles.js +7 -0
  129. package/lib/components/atoms/MAIAButton/MAIAButton.js +33 -0
  130. package/lib/components/atoms/MAIAButton/index.js +2 -0
  131. package/lib/components/atoms/MAIAError/MAIAError.js +15 -0
  132. package/lib/components/atoms/MAIAError/index.js +2 -0
  133. package/lib/components/atoms/MAIAInput/MAIAInput.js +1233 -0
  134. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +266 -0
  135. package/lib/components/atoms/MAIAInput/index.js +2 -0
  136. package/lib/components/atoms/MAIAInput/maiaInputLayout.js +25 -0
  137. package/lib/components/atoms/MAIAInput/styles.js +186 -0
  138. package/lib/components/atoms/MAIAMessage/MAIAMessage.interfaces.js +2 -0
  139. package/lib/components/atoms/MAIAMessage/MAIAMessage.js +22 -0
  140. package/lib/components/atoms/MAIAMessage/index.js +2 -0
  141. package/lib/components/atoms/MAIAMessage/styles.js +7 -0
  142. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.config.js +23 -0
  143. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.interfaces.js +2 -0
  144. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.js +51 -0
  145. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.styles.js +26 -0
  146. package/lib/components/atoms/MaiaStreamdown/index.js +2 -0
  147. package/lib/components/atoms/MaiaWrapper/MaiaWrapper.js +18 -0
  148. package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.js +84 -0
  149. package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.js +15 -0
  150. package/lib/components/atoms/MaiaWrapper/index.js +3 -0
  151. package/lib/components/atoms/MaiaWrapper/styles.js +21 -0
  152. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.interface.js +2 -0
  153. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.js +84 -0
  154. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.styles.js +53 -0
  155. package/lib/components/atoms/ModalClientAccess/index.js +2 -0
  156. package/lib/components/atoms/ModalInfo/ModalInfo.js +52 -0
  157. package/lib/components/atoms/ModalInfo/ModalInfoContent.js +7 -0
  158. package/lib/components/atoms/ModalInfo/index.js +3 -0
  159. package/lib/components/atoms/ModalInfo/styles.js +7 -0
  160. package/lib/components/atoms/ModalProject/ModalProject.interface.js +2 -0
  161. package/lib/components/atoms/ModalProject/ModalProject.js +112 -0
  162. package/lib/components/atoms/ModalProject/ModalProject.style.js +59 -0
  163. package/lib/components/atoms/ModalProject/index.js +2 -0
  164. package/lib/components/atoms/NextPageLoader.js +33 -0
  165. package/lib/components/atoms/OnboardingModalButton/OnboardingModal.js +28 -0
  166. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +180 -0
  167. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.styles.js +34 -0
  168. package/lib/components/atoms/OnboardingModalButton/index.js +3 -0
  169. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.js +131 -0
  170. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.styles.js +59 -0
  171. package/lib/components/atoms/OptionAccessibility/index.js +2 -0
  172. package/lib/components/atoms/OptionCorPermission/OptionCorPermission.js +27 -0
  173. package/lib/components/atoms/OptionCorPermission/OptionCorPermission.styles.js +18 -0
  174. package/lib/components/atoms/OptionCorPermission/index.js +2 -0
  175. package/lib/components/atoms/PrimaryButton.js +31 -0
  176. package/lib/components/atoms/ProjectSelector/ProjectSelector.js +77 -0
  177. package/lib/components/atoms/ProjectSelector/ProjectSelector.styles.js +61 -0
  178. package/lib/components/atoms/ProjectSelector/index.js +2 -0
  179. package/lib/components/atoms/SecondaryButton.js +20 -0
  180. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.js +20 -0
  181. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.styles.js +20 -0
  182. package/lib/components/atoms/SessionGeneratingDot/index.js +2 -0
  183. package/lib/components/atoms/Skeleton/Skeleton.js +36 -0
  184. package/lib/components/atoms/Skeleton/index.js +2 -0
  185. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.js +208 -0
  186. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.styles.js +77 -0
  187. package/lib/components/atoms/SkillsDropdown/index.js +2 -0
  188. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.js +16 -0
  189. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.styles.js +24 -0
  190. package/lib/components/atoms/SlashCommandChip/buildSlashChipElement.js +18 -0
  191. package/lib/components/atoms/SlashCommandChip/index.js +4 -0
  192. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +210 -0
  193. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.styles.js +53 -0
  194. package/lib/components/atoms/SlashCommandDropdown/index.js +2 -0
  195. package/lib/components/atoms/Switch/Switch.js +27 -0
  196. package/lib/components/atoms/Switch/Switch.styles.js +22 -0
  197. package/lib/components/atoms/Switch/index.js +2 -0
  198. package/lib/components/atoms/TextArea/CustomTextArea.interface.js +2 -0
  199. package/lib/components/atoms/TextArea/CustomTextArea.js +93 -0
  200. package/lib/components/atoms/TextArea/CustomTextArea.styles.js +25 -0
  201. package/lib/components/atoms/TextArea/TextArea.interfaces.js +2 -0
  202. package/lib/components/atoms/TextArea/TextArea.js +172 -0
  203. package/lib/components/atoms/TextArea/TextArea.styles.js +16 -0
  204. package/lib/components/atoms/TextArea/index.js +2 -0
  205. package/lib/components/atoms/ThirdButton.js +19 -0
  206. package/lib/components/atoms/VideoModal/VideoModal.js +76 -0
  207. package/lib/components/atoms/VideoModal/index.js +2 -0
  208. package/lib/components/atoms/WithAppCfg.js +26 -0
  209. package/lib/components/atoms/WithFeatureValidation.js +23 -0
  210. package/lib/components/atoms/WrapperCenterIcon/WrapperCenterIcon.js +9 -0
  211. package/lib/components/atoms/WrapperCenterIcon/WrapperCenterIcon.styles.js +6 -0
  212. package/lib/components/atoms/WrapperCenterIcon/index.js +2 -0
  213. package/lib/components/atoms/icons/AIIcon.js +23 -0
  214. package/lib/components/atoms/icons/AacFile.js +39 -0
  215. package/lib/components/atoms/icons/AccessibilityIcon.js +42 -0
  216. package/lib/components/atoms/icons/ActionAssignIcon.js +111 -0
  217. package/lib/components/atoms/icons/ActionCalendarIcon.js +112 -0
  218. package/lib/components/atoms/icons/ActionChargeHoursIcon.js +111 -0
  219. package/lib/components/atoms/icons/ActionChatIcon.js +71 -0
  220. package/lib/components/atoms/icons/ActionCreateIcon.js +91 -0
  221. package/lib/components/atoms/icons/ActionCreateReworkIcon.js +39 -0
  222. package/lib/components/atoms/icons/ActionCreateSubtaskIcon.js +37 -0
  223. package/lib/components/atoms/icons/ActionEditIcon.js +39 -0
  224. package/lib/components/atoms/icons/ActionSummaryMessagesIcon.js +88 -0
  225. package/lib/components/atoms/icons/ActionSummaryTaskIcon.js +37 -0
  226. package/lib/components/atoms/icons/ActionTimeBackIcon.js +112 -0
  227. package/lib/components/atoms/icons/AgentMaiaIcon.js +31 -0
  228. package/lib/components/atoms/icons/Brain.js +77 -0
  229. package/lib/components/atoms/icons/CorAccessIcon.js +41 -0
  230. package/lib/components/atoms/icons/CorLogo.js +76 -0
  231. package/lib/components/atoms/icons/CsvFile.js +41 -0
  232. package/lib/components/atoms/icons/DocFile.js +41 -0
  233. package/lib/components/atoms/icons/DocxFile.js +41 -0
  234. package/lib/components/atoms/icons/EmptyClientIllustration.js +67 -0
  235. package/lib/components/atoms/icons/EmptyHistory.js +46 -0
  236. package/lib/components/atoms/icons/EmptySearchIllustration.js +37 -0
  237. package/lib/components/atoms/icons/EmptyState.js +84 -0
  238. package/lib/components/atoms/icons/EmptyStateAgents.js +58 -0
  239. package/lib/components/atoms/icons/ErrorIcon.js +14 -0
  240. package/lib/components/atoms/icons/ErrorSearchIllustration.js +52 -0
  241. package/lib/components/atoms/icons/ErrorState.js +51 -0
  242. package/lib/components/atoms/icons/FaqChevronIcon.js +39 -0
  243. package/lib/components/atoms/icons/FaqsIcon.js +51 -0
  244. package/lib/components/atoms/icons/FlacIcon.js +39 -0
  245. package/lib/components/atoms/icons/FolderIcon.js +29 -0
  246. package/lib/components/atoms/icons/HomeIcon.js +30 -0
  247. package/lib/components/atoms/icons/ImageFile.js +46 -0
  248. package/lib/components/atoms/icons/M4aFile.js +39 -0
  249. package/lib/components/atoms/icons/MAIAIcon.js +20 -0
  250. package/lib/components/atoms/icons/MAIAIsologo.js +65 -0
  251. package/lib/components/atoms/icons/MDFile.js +41 -0
  252. package/lib/components/atoms/icons/MaiaChatLayoutFloatingIcon.js +41 -0
  253. package/lib/components/atoms/icons/MaiaChatLayoutFullscreenIcon.js +41 -0
  254. package/lib/components/atoms/icons/MaiaChatLayoutMenuIcon.js +33 -0
  255. package/lib/components/atoms/icons/MaiaChatLayoutSidebarIcon.js +41 -0
  256. package/lib/components/atoms/icons/MaiaInputAddIcon.js +42 -0
  257. package/lib/components/atoms/icons/MaiaInputAttachIcon.js +29 -0
  258. package/lib/components/atoms/icons/MaiaInputAttachmentImageIcon.js +33 -0
  259. package/lib/components/atoms/icons/MaiaInputDeepSearchIcon.js +35 -0
  260. package/lib/components/atoms/icons/MaiaInputMentionIcon.js +44 -0
  261. package/lib/components/atoms/icons/MaiaInputRobotIcon.js +29 -0
  262. package/lib/components/atoms/icons/MaiaInputSendIcon.js +29 -0
  263. package/lib/components/atoms/icons/MaiaInputSlashIcon.js +29 -0
  264. package/lib/components/atoms/icons/MaiaInputWebSearchIcon.js +35 -0
  265. package/lib/components/atoms/icons/MaiaSettingsProject.js +111 -0
  266. package/lib/components/atoms/icons/MaiaSettingsProjectV2.js +193 -0
  267. package/lib/components/atoms/icons/MaiaSparkleIcon.js +75 -0
  268. package/lib/components/atoms/icons/MaiaStoreIcon.js +31 -0
  269. package/lib/components/atoms/icons/Mp3File.js +39 -0
  270. package/lib/components/atoms/icons/Mp4File.js +39 -0
  271. package/lib/components/atoms/icons/MyAgentsNavIcon.js +51 -0
  272. package/lib/components/atoms/icons/NewChat.js +29 -0
  273. package/lib/components/atoms/icons/NotionIcon.js +36 -0
  274. package/lib/components/atoms/icons/OgaFile.js +39 -0
  275. package/lib/components/atoms/icons/OggFile.js +39 -0
  276. package/lib/components/atoms/icons/PdfFile.js +39 -0
  277. package/lib/components/atoms/icons/PlusIcon.js +29 -0
  278. package/lib/components/atoms/icons/PptFile.js +47 -0
  279. package/lib/components/atoms/icons/PptxFile.js +49 -0
  280. package/lib/components/atoms/icons/RetryIcon.js +34 -0
  281. package/lib/components/atoms/icons/SkillCreatedByIcon.js +20 -0
  282. package/lib/components/atoms/icons/SkillIcon.js +30 -0
  283. package/lib/components/atoms/icons/SkillVisibilityEveryoneIcon.js +23 -0
  284. package/lib/components/atoms/icons/SkillVisibilityOnlyMeIcon.js +23 -0
  285. package/lib/components/atoms/icons/SkillsNavIcon.js +24 -0
  286. package/lib/components/atoms/icons/SubtaskIcon.js +36 -0
  287. package/lib/components/atoms/icons/TaskLinkIcon.js +27 -0
  288. package/lib/components/atoms/icons/TelescopeIcon.js +60 -0
  289. package/lib/components/atoms/icons/TemplateGradientIcon.js +42 -0
  290. package/lib/components/atoms/icons/TextFile.js +41 -0
  291. package/lib/components/atoms/icons/WavFile.js +39 -0
  292. package/lib/components/atoms/icons/WebmFile.js +50 -0
  293. package/lib/components/atoms/icons/XlsFile.js +42 -0
  294. package/lib/components/atoms/icons/XlsxFile.js +42 -0
  295. package/lib/components/atoms/icons/index.js +54 -0
  296. package/lib/components/atoms/index.js +42 -0
  297. package/lib/components/index.js +11 -0
  298. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.interface.js +2 -0
  299. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +236 -0
  300. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.styles.js +53 -0
  301. package/lib/components/molecules/AbmSection/AbmGeneralSection.js +415 -0
  302. package/lib/components/molecules/AbmSection/AbmGeneralSection.styles.js +152 -0
  303. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +374 -0
  304. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.styles.js +106 -0
  305. package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +92 -0
  306. package/lib/components/molecules/AbmSection/AbmLoaderFiles.styles.js +57 -0
  307. package/lib/components/molecules/AbmSection/index.js +4 -0
  308. package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.js +52 -0
  309. package/lib/components/molecules/ChatAIClientSelector/index.js +2 -0
  310. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +119 -0
  311. package/lib/components/molecules/ChatAIContent/ChatAIContent.skeleton.js +187 -0
  312. package/lib/components/molecules/ChatAIContent/ChatAIContent.styles.js +6 -0
  313. package/lib/components/molecules/ChatAIContent/index.js +2 -0
  314. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.js +241 -0
  315. package/lib/components/molecules/ChatAIHistory/index.js +2 -0
  316. package/lib/components/molecules/ChatAIHistory/styles.js +22 -0
  317. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +649 -0
  318. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.js +115 -0
  319. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.styles.js +95 -0
  320. package/lib/components/molecules/ChatAIHome/index.js +2 -0
  321. package/lib/components/molecules/ChatAIHome/styles.js +335 -0
  322. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.js +137 -0
  323. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +853 -0
  324. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.js +47 -0
  325. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.styles.js +37 -0
  326. package/lib/components/molecules/ChatAIMessages/README.md +101 -0
  327. package/lib/components/molecules/ChatAIMessages/index.js +2 -0
  328. package/lib/components/molecules/ChatAIMessages/newStyles.js +131 -0
  329. package/lib/components/molecules/ChatAIMessages/styles.js +94 -0
  330. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +1254 -0
  331. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +58 -0
  332. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +127 -0
  333. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.styles.js +34 -0
  334. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/index.js +2 -0
  335. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +189 -0
  336. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +26 -0
  337. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/index.js +2 -0
  338. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +453 -0
  339. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.styles.js +108 -0
  340. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/index.js +2 -0
  341. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.js +48 -0
  342. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.styles.js +38 -0
  343. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/index.js +2 -0
  344. package/lib/components/molecules/ChatAIModal/constants.js +40 -0
  345. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.js +16 -0
  346. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.styles.js +12 -0
  347. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/constants.js +13 -0
  348. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/index.js +3 -0
  349. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.js +57 -0
  350. package/lib/components/molecules/ChatAIModal/index.js +2 -0
  351. package/lib/components/molecules/ChatAIModal/layout.js +74 -0
  352. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +457 -0
  353. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.styles.js +218 -0
  354. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +430 -0
  355. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.styles.js +169 -0
  356. package/lib/components/molecules/ChatAIMySkills/index.js +2 -0
  357. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.js +48 -0
  358. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.styles.js +49 -0
  359. package/lib/components/molecules/ChatAIProjectSelector/index.js +2 -0
  360. package/lib/components/molecules/ChatFooter/ChatFooter.js +337 -0
  361. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.js +32 -0
  362. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.styles.js +14 -0
  363. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +201 -0
  364. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.styles.js +51 -0
  365. package/lib/components/molecules/ChatFooter/index.js +2 -0
  366. package/lib/components/molecules/ChatFooter/styles.js +23 -0
  367. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.js +60 -0
  368. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.styles.js +6 -0
  369. package/lib/components/molecules/ContextMentionInput/index.js +2 -0
  370. package/lib/components/molecules/MessageFeedback/MessageFeedback.js +118 -0
  371. package/lib/components/molecules/MessageFeedback/index.js +2 -0
  372. package/lib/components/molecules/MessageFeedback/styles.js +14 -0
  373. package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.js +127 -0
  374. package/lib/components/molecules/ProjectSummaryChat/index.js +2 -0
  375. package/lib/components/molecules/ProjectSummaryChat/styles.js +8 -0
  376. package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.js +152 -0
  377. package/lib/components/molecules/ProjectSummaryConfig/index.js +2 -0
  378. package/lib/components/molecules/ProjectSummaryConfig/styles.js +86 -0
  379. package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.js +49 -0
  380. package/lib/components/molecules/ProjectSummaryContent/index.js +2 -0
  381. package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.js +19 -0
  382. package/lib/components/molecules/ProjectSummaryModal/index.js +2 -0
  383. package/lib/components/molecules/ProjectSummaryModal/styles.js +2 -0
  384. package/lib/components/molecules/Sidebar/Sidebar.js +716 -0
  385. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +157 -0
  386. package/lib/components/molecules/Sidebar/Sidebar.skeleton.js +48 -0
  387. package/lib/components/molecules/Sidebar/Sidebar.styles.js +75 -0
  388. package/lib/components/molecules/Sidebar/index.js +2 -0
  389. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +1449 -0
  390. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.styles.js +93 -0
  391. package/lib/components/organisms/AbmAgentModal/index.js +2 -0
  392. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.js +182 -0
  393. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.styles.js +34 -0
  394. package/lib/components/organisms/AbmSkillGenerateModal/index.js +2 -0
  395. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +585 -0
  396. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.styles.js +154 -0
  397. package/lib/components/organisms/AbmSkillModal/index.js +2 -0
  398. package/lib/components/organisms/ChatAI/ChatAI.js +167 -0
  399. package/lib/components/organisms/ChatAI/index.js +2 -0
  400. package/lib/components/organisms/ChatAI/styles.js +7 -0
  401. package/lib/components/organisms/ClientAIButton/ClientAIButton.js +23 -0
  402. package/lib/components/organisms/ClientAIButton/index.js +2 -0
  403. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.js +86 -0
  404. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.styles.js +39 -0
  405. package/lib/components/organisms/DeleteAgentModal/index.js +2 -0
  406. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.js +122 -0
  407. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.styles.js +47 -0
  408. package/lib/components/organisms/DeleteQuestionModal/index.js +2 -0
  409. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.js +138 -0
  410. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.styles.js +69 -0
  411. package/lib/components/organisms/EditQuestionModal/index.js +2 -0
  412. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.js +113 -0
  413. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.styles.js +54 -0
  414. package/lib/components/organisms/ModalFileExceeds/index.js +2 -0
  415. package/lib/components/organisms/ProjectAIButton/ProjectAIButton.js +26 -0
  416. package/lib/components/organisms/ProjectAIButton/index.js +2 -0
  417. package/lib/components/organisms/ProjectSummary/ProjectSummary.js +60 -0
  418. package/lib/components/organisms/ProjectSummary/index.js +2 -0
  419. package/lib/components/organisms/ProjectSummary/styles.js +7 -0
  420. package/lib/components/organisms/SnackBar/Snackbar.interface.js +2 -0
  421. package/lib/components/organisms/SnackBar/Snackbar.js +73 -0
  422. package/lib/components/organisms/SnackBar/Snackbar.styles.js +9 -0
  423. package/lib/components/organisms/SnackBar/index.js +2 -0
  424. package/lib/components/organisms/SourcesInformation/SourceItem.js +18 -0
  425. package/lib/components/organisms/SourcesInformation/SourceItem.styles.js +14 -0
  426. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.js +66 -0
  427. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.styles.js +27 -0
  428. package/lib/components/organisms/SourcesInformation/index.js +2 -0
  429. package/lib/constants/config.js +10 -0
  430. package/lib/constants/formatExtensions.js +55 -0
  431. package/lib/constants/gqlClient.js +4 -0
  432. package/lib/constants/maiaHourAgentAccess.js +15 -0
  433. package/lib/constants/maiaTaskPanelAccess.js +24 -0
  434. package/lib/constants/maiaTaskPanelOutsideClick.js +9 -0
  435. package/lib/constants/maiaTaskPanelZIndex.js +19 -0
  436. package/lib/constants/permissions/config.js +72 -0
  437. package/lib/constants/permissions/index.js +3 -0
  438. package/lib/constants/permissions/types.js +2 -0
  439. package/lib/constants/permissions/utils.js +18 -0
  440. package/lib/constants/plannerSyncEvents.js +15 -0
  441. package/lib/constants/taskLinkIcon.js +15 -0
  442. package/lib/constants/taskUrls.js +11 -0
  443. package/lib/context/cor-user.js +31 -0
  444. package/lib/context/global-context.js +39 -0
  445. package/lib/dev/DevChatAI.js +101 -0
  446. package/lib/dev/DevContextMentionInput.js +67 -0
  447. package/lib/dev/ProjectSummary.js +9 -0
  448. package/lib/dev/Providers.js +27 -0
  449. package/lib/exports.js +2 -0
  450. package/lib/hooks/README.md +192 -0
  451. package/lib/hooks/index.js +30 -0
  452. package/lib/hooks/useAccessClient/index.js +2 -0
  453. package/lib/hooks/useAccessClient/useAccessClient.js +81 -0
  454. package/lib/hooks/useAgentModel/index.js +2 -0
  455. package/lib/hooks/useAgentModel/useAgentModel.js +62 -0
  456. package/lib/hooks/useAgentModel/useCreateAgent.js +175 -0
  457. package/lib/hooks/useAgentModel/useDeleteAgent.js +88 -0
  458. package/lib/hooks/useAgentModel/useUpdateAgent.js +176 -0
  459. package/lib/hooks/useAgentSuggestions.js +60 -0
  460. package/lib/hooks/useCaretPosition.js +65 -0
  461. package/lib/hooks/useChatManager/index.js +2 -0
  462. package/lib/hooks/useChatManager/useChatManager.interface.js +2 -0
  463. package/lib/hooks/useChatManager/useChatManager.js +1782 -0
  464. package/lib/hooks/useChatMessages/index.js +2 -0
  465. package/lib/hooks/useChatMessages/useChatMessages.interface.js +2 -0
  466. package/lib/hooks/useChatMessages/useChatMessages.js +722 -0
  467. package/lib/hooks/useChats/index.js +2 -0
  468. package/lib/hooks/useChats/useChats.interfaces.js +2 -0
  469. package/lib/hooks/useChats/useChats.js +187 -0
  470. package/lib/hooks/useClientSearch.js +163 -0
  471. package/lib/hooks/useContextMentions.js +500 -0
  472. package/lib/hooks/useContextPinPopover.js +228 -0
  473. package/lib/hooks/useDebounce.js +18 -0
  474. package/lib/hooks/useEntitySearch.js +1053 -0
  475. package/lib/hooks/useEvent.js +94 -0
  476. package/lib/hooks/useFrequentlyAskedQuestions.js +150 -0
  477. package/lib/hooks/useFrequentlyUsedActions.js +94 -0
  478. package/lib/hooks/useKnowledge/deleteKnowledge.js +69 -0
  479. package/lib/hooks/useKnowledge/downloadKnowledge.js +81 -0
  480. package/lib/hooks/useKnowledge/index.js +4 -0
  481. package/lib/hooks/useKnowledge/saveKnowledge.js +107 -0
  482. package/lib/hooks/useKnowledge/useKnowledgeOperations.js +156 -0
  483. package/lib/hooks/useMaiaTaskPanelZIndex.js +17 -0
  484. package/lib/hooks/useMentionAllowedTypes.js +120 -0
  485. package/lib/hooks/useMentionPopover.js +342 -0
  486. package/lib/hooks/useMinimizedPillBottomOffset.js +110 -0
  487. package/lib/hooks/useModal/index.js +2 -0
  488. package/lib/hooks/useModal/useModal.interfaces.js +2 -0
  489. package/lib/hooks/useModal/useModal.js +47 -0
  490. package/lib/hooks/useOnboardingNavigation.js +20 -0
  491. package/lib/hooks/useOrchestratorStream/index.js +2 -0
  492. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +2 -0
  493. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +269 -0
  494. package/lib/hooks/useProjectSearch.js +183 -0
  495. package/lib/hooks/useProjectSummary.js +101 -0
  496. package/lib/hooks/useProjectSummaryConfig.js +211 -0
  497. package/lib/hooks/useProjects.js +46 -0
  498. package/lib/hooks/useRecentClientsSearch.js +150 -0
  499. package/lib/hooks/useRecentContexts.js +86 -0
  500. package/lib/hooks/useResize.js +29 -0
  501. package/lib/hooks/useSkillsCatalog.js +66 -0
  502. package/lib/hooks/useSlashCommands.js +84 -0
  503. package/lib/hooks/useSmoothStreamText/index.js +2 -0
  504. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.js +197 -0
  505. package/lib/hooks/useSnackBarManager/useSnackBarManager.js +41 -0
  506. package/lib/hooks/useStreamResponse.js +112 -0
  507. package/lib/hooks/useStreamdownStyles.js +13 -0
  508. package/lib/hooks/useStreamingMessage/index.js +2 -0
  509. package/lib/hooks/useStreamingMessage/useStreamingMessage.js +18 -0
  510. package/lib/hooks/useT.js +17 -0
  511. package/lib/hooks/useTabTaskDefault.js +33 -0
  512. package/lib/hooks/useTaskPanel.js +22 -0
  513. package/lib/hooks/useTextOverflowEllipsisTooltip.js +34 -0
  514. package/lib/hooks/useToggle.js +19 -0
  515. package/lib/hooks/useToggleFavorite/index.js +2 -0
  516. package/lib/hooks/useToggleFavorite/useToggleFavorite.js +83 -0
  517. package/lib/index.css +76 -0
  518. package/lib/index.js +30 -0
  519. package/lib/lang/br/index.js +793 -0
  520. package/lib/lang/en/index.js +793 -0
  521. package/lib/lang/es/index.js +794 -0
  522. package/lib/lang/fr/index.js +614 -0
  523. package/lib/lang/index.js +24 -0
  524. package/lib/lang/utils.js +33 -0
  525. package/lib/mocks/mockChats.js +395 -0
  526. package/lib/mocks/mockOrchestrator.js +5 -0
  527. package/lib/mocks/mockProject.js +11 -0
  528. package/lib/mocks/mockProjectSummary.js +6 -0
  529. package/lib/mocks/mockedUser.js +169 -0
  530. package/lib/services/apolloClient.js +3 -0
  531. package/lib/services/appcues.js +19 -0
  532. package/lib/services/corpilot/ProjectSummary/getProjectSummary.js +31 -0
  533. package/lib/services/corpilot/ProjectSummary/index.js +5 -0
  534. package/lib/services/corpilot/client.js +27 -0
  535. package/lib/services/corpilot/index.js +5 -0
  536. package/lib/services/maia/Access/updateAccess.js +59 -0
  537. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +46 -0
  538. package/lib/services/maia/Actions/getSlashCommands.js +39 -0
  539. package/lib/services/maia/Actions/index.js +7 -0
  540. package/lib/services/maia/Agents/connectors.js +250 -0
  541. package/lib/services/maia/Agents/createAgent.js +39 -0
  542. package/lib/services/maia/Agents/deleteAgent.js +38 -0
  543. package/lib/services/maia/Agents/fetchAgentDetail.js +122 -0
  544. package/lib/services/maia/Agents/getAgentById.js +162 -0
  545. package/lib/services/maia/Agents/getAgentModels.js +112 -0
  546. package/lib/services/maia/Agents/getAgentSuggestions.js +44 -0
  547. package/lib/services/maia/Agents/getAgents.js +718 -0
  548. package/lib/services/maia/Agents/setAgentToolGroups.js +42 -0
  549. package/lib/services/maia/Agents/toggleFavorite.js +34 -0
  550. package/lib/services/maia/Agents/updateAgent.js +39 -0
  551. package/lib/services/maia/Chats/deleteChat.js +32 -0
  552. package/lib/services/maia/Chats/getChatMessages.js +144 -0
  553. package/lib/services/maia/Chats/getChatsByUserId.js +82 -0
  554. package/lib/services/maia/Chats/index.js +15 -0
  555. package/lib/services/maia/Chats/markSessionAsRead.js +32 -0
  556. package/lib/services/maia/Chats/patchChat.js +43 -0
  557. package/lib/services/maia/Chats/wasHelpfulChat.js +31 -0
  558. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.js +55 -0
  559. package/lib/services/maia/Faqs/index.js +5 -0
  560. package/lib/services/maia/Knowledge/delete.js +41 -0
  561. package/lib/services/maia/Knowledge/download.js +48 -0
  562. package/lib/services/maia/Knowledge/index.js +3 -0
  563. package/lib/services/maia/Knowledge/save.js +43 -0
  564. package/lib/services/maia/Orchestrator/index.js +7 -0
  565. package/lib/services/maia/Orchestrator/orchestrator.js +246 -0
  566. package/lib/services/maia/RecentClients/getRecentClients.js +43 -0
  567. package/lib/services/maia/RecentClients/index.js +6 -0
  568. package/lib/services/maia/RecentContexts/getRecentContexts.js +54 -0
  569. package/lib/services/maia/RecentContexts/index.js +6 -0
  570. package/lib/services/maia/RecentProjects/getRecentProjects.js +55 -0
  571. package/lib/services/maia/RecentProjects/index.js +6 -0
  572. package/lib/services/maia/RecentTasks/getRecentTasks.js +54 -0
  573. package/lib/services/maia/RecentTasks/index.js +6 -0
  574. package/lib/services/maia/RecentUsers/getRecentUsers.js +59 -0
  575. package/lib/services/maia/RecentUsers/index.js +6 -0
  576. package/lib/services/maia/Skills/createSkill.js +39 -0
  577. package/lib/services/maia/Skills/deleteSkill.js +38 -0
  578. package/lib/services/maia/Skills/generateSkill.js +41 -0
  579. package/lib/services/maia/Skills/getSkills.js +120 -0
  580. package/lib/services/maia/Skills/updateSkill.js +39 -0
  581. package/lib/services/maia/client.js +27 -0
  582. package/lib/services/maia/index.js +17 -0
  583. package/lib/services/query/ClientSearchQuery.js +5 -0
  584. package/lib/services/query/entitySearchQuery.js +18 -0
  585. package/lib/services/query/index.js +2 -0
  586. package/lib/services/query/projectSearchByValueQuery.js +5 -0
  587. package/lib/services/query/taskUserTabQuery.js +8 -0
  588. package/lib/services/query/usersDirectoryQuery.js +19 -0
  589. package/lib/services/types.js +6 -0
  590. package/lib/services/utils/fetchCOR.js +117 -0
  591. package/lib/services/utils/getCookie.js +10 -0
  592. package/lib/services/utils/index.js +3 -0
  593. package/lib/services/utils/mapChatMessages.js +287 -0
  594. package/lib/services/utils/validateIsMaia.js +4 -0
  595. package/lib/store/chatsSidebarOptimistic.js +92 -0
  596. package/lib/store/chatsStore.types.js +2 -0
  597. package/lib/store/chatsStoreLifecycle.js +8 -0
  598. package/lib/store/faqsStore.types.js +2 -0
  599. package/lib/store/index.js +4 -0
  600. package/lib/store/maiaLastChatPersistence.js +35 -0
  601. package/lib/store/sessions/activeView.js +22 -0
  602. package/lib/store/sessions/index.js +9 -0
  603. package/lib/store/sessions/sessionHitlContext.js +15 -0
  604. package/lib/store/sessions/sessionNotificationSound.js +57 -0
  605. package/lib/store/sessions/sessionNotifications.js +110 -0
  606. package/lib/store/sessions/sessionNotifications.types.js +2 -0
  607. package/lib/store/sessions/sessionStreamManager.js +715 -0
  608. package/lib/store/sessions/sessionStreamingText.js +80 -0
  609. package/lib/store/sessions/sessions.types.js +35 -0
  610. package/lib/store/sessions/useSessionMeta.js +39 -0
  611. package/lib/store/sessions/useSessionStreamingText.js +18 -0
  612. package/lib/store/sessions/useSessionsStore.js +197 -0
  613. package/lib/store/useChatsStore.js +387 -0
  614. package/lib/store/useFaqsStore.js +27 -0
  615. package/lib/streamdownStyles.js +9 -0
  616. package/lib/styles/StyledCleanContainer.js +7 -0
  617. package/lib/styles/cascade.js +14 -0
  618. package/lib/styles/config.js +47 -0
  619. package/lib/styles/shared/scrollable.js +3 -0
  620. package/lib/styles/transitions.js +21 -0
  621. package/lib/types/Action.js +2 -0
  622. package/lib/types/AgentSuggestion.js +2 -0
  623. package/lib/types/Chat.js +10 -0
  624. package/lib/types/Client.js +2 -0
  625. package/lib/types/FrequentlyAskedQuestion.js +2 -0
  626. package/lib/types/Project.js +2 -0
  627. package/lib/types/ProjectSummaryConfigKeys.js +9 -0
  628. package/lib/types/Task.js +2 -0
  629. package/lib/types/agent.js +2 -0
  630. package/lib/types/agentModal.js +2 -0
  631. package/lib/types/contextMention.js +37 -0
  632. package/lib/types/global.d.js +2 -0
  633. package/lib/types/skill.js +2 -0
  634. package/lib/types/streamActivity.js +2 -0
  635. package/lib/types/userType.d.js +2 -0
  636. package/lib/utils/actionCategoryMap.js +37 -0
  637. package/lib/utils/actionIconMap.js +61 -0
  638. package/lib/utils/agentDisplayName.js +42 -0
  639. package/lib/utils/chatInputFiles.js +52 -0
  640. package/lib/utils/contextMentionIcons.js +134 -0
  641. package/lib/utils/contextMentionLabel.js +4 -0
  642. package/lib/utils/contextMentionTriggers.js +51 -0
  643. package/lib/utils/contextMentionTypeLabel.js +17 -0
  644. package/lib/utils/corConnectorMentionTypes.js +41 -0
  645. package/lib/utils/ensureStreamdownStyles.js +21 -0
  646. package/lib/utils/entityLinkRender.js +135 -0
  647. package/lib/utils/fileDownloadHelper.js +40 -0
  648. package/lib/utils/formatQuickActionMessage.js +16 -0
  649. package/lib/utils/formatUnreadCount.js +6 -0
  650. package/lib/utils/getUnitFileSize.js +13 -0
  651. package/lib/utils/hitlAnalytics.js +65 -0
  652. package/lib/utils/hoursPlannerQuickActionType.js +64 -0
  653. package/lib/utils/imagePreprocessor.js +108 -0
  654. package/lib/utils/index.js +3 -0
  655. package/lib/utils/maiaHostOpen.js +19 -0
  656. package/lib/utils/maiaStreamdownRehypePlugins.js +27 -0
  657. package/lib/utils/mapBackendLang.js +8 -0
  658. package/lib/utils/normalizeAgentConnectors.js +95 -0
  659. package/lib/utils/openTaskInCorPanel.js +22 -0
  660. package/lib/utils/orchestratorSubagents.js +11 -0
  661. package/lib/utils/renderContextMentions.js +420 -0
  662. package/lib/utils/retryCompletion.js +85 -0
  663. package/lib/utils/slashCommandMarker.js +30 -0
  664. package/lib/utils/sortManagerHoursHomeFuas.js +14 -0
  665. package/lib/utils/sseStreamContent.js +17 -0
  666. package/lib/utils/streamActivityMessages.js +359 -0
  667. package/lib/utils/validateTrimmedFields.js +8 -0
  668. package/package.json +1 -1
  669. package/README.md +0 -2
@@ -0,0 +1,1233 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
+ 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; }
4
+ 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; }
5
+ /* eslint-disable no-restricted-syntax */
6
+ /* eslint-disable no-continue */
7
+ /* eslint-disable no-void */
8
+ /* eslint-disable react/no-array-index-key */
9
+ /* eslint-disable no-lonely-if */
10
+ /* eslint-disable @typescript-eslint/no-explicit-any */
11
+ /* eslint-disable prefer-destructuring */
12
+ /* eslint-disable jsx-a11y/click-events-have-key-events */
13
+ /* eslint-disable jsx-a11y/no-static-element-interactions */
14
+ import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';
15
+ import { createPortal } from 'react-dom';
16
+ import { Popover } from '@mui/material';
17
+ import { Check } from '@projectcor/icons/lib/components/Check';
18
+ import { Cross } from '@projectcor/icons/lib/components/Cross';
19
+ import { Tooltip } from '@projectcor/tooltipv2/lib/components/Tooltip';
20
+ import { ActiveToolChipIconButton, ActiveToolChipLabel, ActiveToolChipRoot, PlusMenuDivider, PlusMenuInnerColumn, PlusMenuItemButton, PlusMenuItemLabel, PlusMenuPaper, PlusMenuToolsRow, PlusToggleButton, SkillsToggleButton, SCInputChipsRow, SCInputMetaIconButton, SCInputMetaIndicators, SCMIAttachment, SCMIAttachmentDeleteIcon, SCMIAttachmentFileIcon, SCMIAttachmentIcon, SCMIAttachmentName, StyledMAIAInputWrapper, StyledMAIASendButton, StyledMAIAMainToolbarGrid, SCInputEditorCell, SCInputToolbarRow, StyledMAIAPlusToolbarCell, StyledMAIASendToolbarCell, StyledMAIAStopButton, StyledMAIAStopIcon, StyledMAIADropOverlay } from './styles';
21
+ import { getMaiaInputEditorMaxHeight, MAIA_INPUT_TOOLBAR_ROW_HEIGHT_PX } from './maiaInputLayout';
22
+ import { useGlobalContext } from '../../../context/global-context';
23
+ import { ModalFileExceeds } from '../../organisms/ModalFileExceeds';
24
+ import { SlashCommandDropdown } from '../SlashCommandDropdown';
25
+ import { SkillsDropdown } from '../SkillsDropdown';
26
+ import { useSlashCommands } from '../../../hooks/useSlashCommands';
27
+ import { useSkillsCatalog } from '../../../hooks/useSkillsCatalog';
28
+ import { canAccessToSkills } from '../../../constants/permissions';
29
+ import { useUser } from '../../../context/cor-user';
30
+ import { resolveQuickActionType } from '../../../utils/hoursPlannerQuickActionType';
31
+ import { useT } from '../../../hooks/useT';
32
+ import { MaiaInputAddIcon } from '../icons/MaiaInputAddIcon';
33
+ import { MaiaInputAttachIcon } from '../icons/MaiaInputAttachIcon';
34
+ import { MaiaInputAttachmentImageIcon } from '../icons/MaiaInputAttachmentImageIcon';
35
+ import { MaiaInputDeepSearchIcon } from '../icons/MaiaInputDeepSearchIcon';
36
+ import { CorAccessIcon } from '../icons/CorAccessIcon';
37
+ import { MaiaInputMentionIcon } from '../icons/MaiaInputMentionIcon';
38
+ import { MaiaInputRobotIcon } from '../icons/MaiaInputRobotIcon';
39
+ import { MaiaInputSendIcon } from '../icons/MaiaInputSendIcon';
40
+ import { MaiaInputSlashIcon } from '../icons/MaiaInputSlashIcon';
41
+ import { SkillIcon } from '../icons/SkillIcon';
42
+ import { MaiaInputWebSearchIcon } from '../icons/MaiaInputWebSearchIcon';
43
+ import { EVENTS, useEvent } from '../../../hooks/useEvent';
44
+ import { getChatToolsMenuAgentType } from '../../../utils/hitlAnalytics';
45
+ import { MAIA_CHAT_INPUT_UI } from '../../../styles/config';
46
+ import { allowedFileTypes, fileTypes, getMaxAttachmentSizeMb, MAX_CHAT_INPUT_ATTACHMENTS } from '../../../constants/formatExtensions';
47
+ import { APPCUES_EVENTS, trackAppcuesEvent } from '../../../services/appcues';
48
+ import { Chip } from '../Chip';
49
+ import { ContextMentionEditor } from '../ContextMentionEditor';
50
+ import { useMaiaTaskPanelZIndex } from '../../../hooks/useMaiaTaskPanelZIndex';
51
+ // eslint-disable-next-line import/no-cycle
52
+ import { useMentionPopover } from '../../../hooks/useMentionPopover';
53
+ import { useCaretPosition } from '../../../hooks/useCaretPosition';
54
+ import { dataTransferHasFiles, filesFromDataTransfer } from '../../../utils/chatInputFiles';
55
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
56
+ var TOOL_CHIP_EXIT_MS = 220;
57
+ var SLASH_DROPDOWN_WIDTH_PX = 340;
58
+ var SLASH_DROPDOWN_MAX_HEIGHT_PX = 416;
59
+ var SKILLS_DROPDOWN_WIDTH_PX = 339;
60
+ var SLASH_DROPDOWN_GAP_PX = 4;
61
+ var SLASH_DROPDOWN_VIEWPORT_PAD_PX = 8;
62
+ export var MAIAInput = function MAIAInput(_ref) {
63
+ var _agent$entity, _contextChip$items, _contextChip$items2, _agent$connectors, _agent$model_display_, _contextChip$items3;
64
+ var onSendMessage = _ref.onSendMessage,
65
+ className = _ref.className,
66
+ disabled = _ref.disabled,
67
+ isStreaming = _ref.isStreaming,
68
+ isWriting = _ref.isWriting,
69
+ onStopGeneration = _ref.onStopGeneration,
70
+ placeholder = _ref.placeholder,
71
+ onChange = _ref.onChange,
72
+ onFocus = _ref.onFocus,
73
+ _ref$alignButtons = _ref.alignButtons,
74
+ alignButtons = _ref$alignButtons === void 0 ? 'vertical' : _ref$alignButtons,
75
+ onFileAttach = _ref.onFileAttach,
76
+ onDeleteAttachment = _ref.onDeleteAttachment,
77
+ _ref$attachments = _ref.attachments,
78
+ attachments = _ref$attachments === void 0 ? [] : _ref$attachments,
79
+ chatId = _ref.chatId,
80
+ newChatKey = _ref.newChatKey,
81
+ tooltipZIndex = _ref.tooltipZIndex,
82
+ externalPopoverAnchorRef = _ref.popoverAnchorRef,
83
+ layoutMode = _ref.layoutMode,
84
+ contextChip = _ref.contextChip;
85
+ var _useT = useT(),
86
+ t = _useT.t;
87
+ var editorRef = useRef(null);
88
+ var fileInputRef = useRef(null);
89
+ var chipsRowRef = useRef(null);
90
+ var toolbarRowRef = useRef(null);
91
+ var internalWrapperRef = useRef(null);
92
+ var wrapperRef = externalPopoverAnchorRef !== null && externalPopoverAnchorRef !== void 0 ? externalPopoverAnchorRef : internalWrapperRef;
93
+ var _useState = useState(false),
94
+ _useState2 = _slicedToArray(_useState, 2),
95
+ hasTypingPresence = _useState2[0],
96
+ setHasTypingPresence = _useState2[1];
97
+ var _useState3 = useState(0),
98
+ _useState4 = _slicedToArray(_useState3, 2),
99
+ chipsRowHeight = _useState4[0],
100
+ setChipsRowHeight = _useState4[1];
101
+ var _useState5 = useState(MAIA_INPUT_TOOLBAR_ROW_HEIGHT_PX),
102
+ _useState6 = _slicedToArray(_useState5, 2),
103
+ toolbarRowHeight = _useState6[0],
104
+ setToolbarRowHeight = _useState6[1];
105
+ var _useState7 = useState({
106
+ isOpen: false,
107
+ excludedFiles: [],
108
+ exceededFiles: [],
109
+ fileSizes: {}
110
+ }),
111
+ _useState8 = _slicedToArray(_useState7, 2),
112
+ modalProps = _useState8[0],
113
+ setModalProps = _useState8[1];
114
+ var eventAmplitude = useEvent();
115
+ var _useGlobalContext = useGlobalContext(),
116
+ toggleWebSearch = _useGlobalContext.toggleWebSearch,
117
+ isWebSearchActive = _useGlobalContext.isWebSearchActive,
118
+ toggleDeepSearch = _useGlobalContext.toggleDeepSearch,
119
+ isDeepSearchActive = _useGlobalContext.isDeepSearchActive,
120
+ agent = _useGlobalContext.agent,
121
+ initialDraft = _useGlobalContext.initialDraft,
122
+ deepLinkSendPendingRef = _useGlobalContext.deepLinkSendPendingRef;
123
+ var plusMenuZIndex = useMaiaTaskPanelZIndex(1300, 'overlay');
124
+ var initialDraftAppliedRef = useRef(false);
125
+ var _useMentionPopover = useMentionPopover({
126
+ editorRef: editorRef,
127
+ popoverAnchorRef: wrapperRef
128
+ }),
129
+ popoverOpen = _useMentionPopover.popoverOpen,
130
+ resetMentionOpenTracking = _useMentionPopover.resetMentionOpenTracking,
131
+ handleTrigger = _useMentionPopover.handleTrigger,
132
+ handlePopoverKeyDown = _useMentionPopover.handleKeyDown,
133
+ popoverNode = _useMentionPopover.popoverNode;
134
+ var _useState9 = useState(null),
135
+ _useState0 = _slicedToArray(_useState9, 2),
136
+ plusMenuAnchor = _useState0[0],
137
+ setPlusMenuAnchor = _useState0[1];
138
+ var _useState1 = useState(false),
139
+ _useState10 = _slicedToArray(_useState1, 2),
140
+ activeToolChipHovered = _useState10[0],
141
+ setActiveToolChipHovered = _useState10[1];
142
+ var _useState11 = useState(false),
143
+ _useState12 = _slicedToArray(_useState11, 2),
144
+ toolChipExiting = _useState12[0],
145
+ setToolChipExiting = _useState12[1];
146
+ var _useState13 = useState(false),
147
+ _useState14 = _slicedToArray(_useState13, 2),
148
+ isFileDragActive = _useState14[0],
149
+ setIsFileDragActive = _useState14[1];
150
+ var toolChipExitTimerRef = useRef(null);
151
+ var fileDragCounterRef = useRef(0);
152
+ var searchModeActiveRef = useRef({
153
+ web: false,
154
+ deep: false
155
+ });
156
+ var plusMenuOpen = Boolean(plusMenuAnchor);
157
+
158
+ // Inicializar las referencias como undefined para detectar el primer cambio correctamente
159
+ var previousAgentIdRef = useRef(undefined);
160
+ var previousChatIdRef = useRef(undefined);
161
+ var previousNewChatKeyRef = useRef(undefined);
162
+ var previousLayoutModeRef = useRef(undefined);
163
+ var analyticsAgentType = getChatToolsMenuAgentType(agent);
164
+ var analyticsCloneEntityPayload = (agent === null || agent === void 0 ? void 0 : agent.type) === 'clone' ? {
165
+ entity: (_agent$entity = agent.entity) !== null && _agent$entity !== void 0 ? _agent$entity : null
166
+ } : {};
167
+
168
+ // Slash commands aplican a clones especialistas y al orchestrator global (este agrega los de sus subagentes).
169
+ // Los custom y los clone global/maiaker no los tienen habilitados.
170
+ var _useSlashCommands = useSlashCommands((agent === null || agent === void 0 ? void 0 : agent.type) === 'orchestrator' && (agent === null || agent === void 0 ? void 0 : agent.entity) === 'global' || (agent === null || agent === void 0 ? void 0 : agent.type) === 'clone' && (agent === null || agent === void 0 ? void 0 : agent.entity) !== 'global' ? agent === null || agent === void 0 ? void 0 : agent.id : undefined),
171
+ slashCommands = _useSlashCommands.commands;
172
+ var _useState15 = useState(false),
173
+ _useState16 = _slicedToArray(_useState15, 2),
174
+ showSlashDropdown = _useState16[0],
175
+ setShowSlashDropdown = _useState16[1];
176
+ var _useState17 = useState(''),
177
+ _useState18 = _slicedToArray(_useState17, 2),
178
+ slashQuery = _useState18[0],
179
+ setSlashQuery = _useState18[1];
180
+ var slashMenuWasOpenRef = useRef(false);
181
+ var slashDropdownZIndex = useMaiaTaskPanelZIndex(1200, 'overlay');
182
+ var getCaretRect = useCaretPosition();
183
+ var _useState19 = useState({
184
+ bottom: 0,
185
+ left: 0,
186
+ maxHeight: SLASH_DROPDOWN_MAX_HEIGHT_PX
187
+ }),
188
+ _useState20 = _slicedToArray(_useState19, 2),
189
+ slashDropdownPos = _useState20[0],
190
+ setSlashDropdownPos = _useState20[1];
191
+ var user = useUser();
192
+ var showSkillsButton = canAccessToSkills(user);
193
+ var skillsButtonRef = useRef(null);
194
+ var skillsMenuWasOpenRef = useRef(false);
195
+ var _useSkillsCatalog = useSkillsCatalog(),
196
+ skills = _useSkillsCatalog.skills,
197
+ skillsLoading = _useSkillsCatalog.loading,
198
+ skillsError = _useSkillsCatalog.error,
199
+ fetchSkills = _useSkillsCatalog.fetchSkills;
200
+ var _useState21 = useState(false),
201
+ _useState22 = _slicedToArray(_useState21, 2),
202
+ showSkillsDropdown = _useState22[0],
203
+ setShowSkillsDropdown = _useState22[1];
204
+ var _useState23 = useState(''),
205
+ _useState24 = _slicedToArray(_useState23, 2),
206
+ skillsQuery = _useState24[0],
207
+ setSkillsQuery = _useState24[1];
208
+ var _useState25 = useState({
209
+ bottom: 0,
210
+ left: 0,
211
+ maxHeight: SLASH_DROPDOWN_MAX_HEIGHT_PX
212
+ }),
213
+ _useState26 = _slicedToArray(_useState25, 2),
214
+ skillsDropdownPos = _useState26[0],
215
+ setSkillsDropdownPos = _useState26[1];
216
+ var positionSlashDropdown = useCallback(function () {
217
+ var _wrapperRef$current, _caret$top, _caret$left;
218
+ var wrapperRect = (_wrapperRef$current = wrapperRef.current) === null || _wrapperRef$current === void 0 ? void 0 : _wrapperRef$current.getBoundingClientRect();
219
+ var caret = getCaretRect('/');
220
+ var topSource = (_caret$top = caret === null || caret === void 0 ? void 0 : caret.top) !== null && _caret$top !== void 0 ? _caret$top : wrapperRect && wrapperRect.width > 0 ? wrapperRect.top : null;
221
+ var leftSource = (_caret$left = caret === null || caret === void 0 ? void 0 : caret.left) !== null && _caret$left !== void 0 ? _caret$left : wrapperRect && wrapperRect.width > 0 ? wrapperRect.left : null;
222
+ if (topSource == null || leftSource == null) return;
223
+ var viewportH = window.innerHeight;
224
+ var viewportW = window.innerWidth;
225
+ var left = Math.max(SLASH_DROPDOWN_VIEWPORT_PAD_PX, Math.min(viewportW - SLASH_DROPDOWN_WIDTH_PX - SLASH_DROPDOWN_VIEWPORT_PAD_PX, leftSource));
226
+ var availableHeightPx = topSource - SLASH_DROPDOWN_GAP_PX - SLASH_DROPDOWN_VIEWPORT_PAD_PX;
227
+ var maxHeight = Math.min(SLASH_DROPDOWN_MAX_HEIGHT_PX, Math.max(0, availableHeightPx));
228
+ setSlashDropdownPos({
229
+ left: left,
230
+ bottom: viewportH - topSource + SLASH_DROPDOWN_GAP_PX,
231
+ maxHeight: maxHeight
232
+ });
233
+ }, [wrapperRef, getCaretRect]);
234
+ useLayoutEffect(function () {
235
+ if (!showSlashDropdown) return undefined;
236
+ positionSlashDropdown();
237
+ var handler = function handler() {
238
+ return positionSlashDropdown();
239
+ };
240
+ window.addEventListener('scroll', handler, true);
241
+ window.addEventListener('resize', handler);
242
+ return function () {
243
+ window.removeEventListener('scroll', handler, true);
244
+ window.removeEventListener('resize', handler);
245
+ };
246
+ }, [showSlashDropdown, slashQuery, positionSlashDropdown]);
247
+
248
+ /** El popover de skills se ancla al `#` que lo abrió; si no hay caret, al borde del input. */
249
+ var positionSkillsDropdown = useCallback(function () {
250
+ var _wrapperRef$current2, _caret$top2, _caret$left2;
251
+ var wrapperRect = (_wrapperRef$current2 = wrapperRef.current) === null || _wrapperRef$current2 === void 0 ? void 0 : _wrapperRef$current2.getBoundingClientRect();
252
+ var caret = getCaretRect('#');
253
+ var topSource = (_caret$top2 = caret === null || caret === void 0 ? void 0 : caret.top) !== null && _caret$top2 !== void 0 ? _caret$top2 : wrapperRect && wrapperRect.width > 0 ? wrapperRect.top : null;
254
+ var leftSource = (_caret$left2 = caret === null || caret === void 0 ? void 0 : caret.left) !== null && _caret$left2 !== void 0 ? _caret$left2 : wrapperRect && wrapperRect.width > 0 ? wrapperRect.left : null;
255
+ if (topSource == null || leftSource == null) return;
256
+ var viewportH = window.innerHeight;
257
+ var viewportW = window.innerWidth;
258
+ var left = Math.max(SLASH_DROPDOWN_VIEWPORT_PAD_PX, Math.min(viewportW - SKILLS_DROPDOWN_WIDTH_PX - SLASH_DROPDOWN_VIEWPORT_PAD_PX, leftSource));
259
+ var availableHeightPx = topSource - SLASH_DROPDOWN_GAP_PX - SLASH_DROPDOWN_VIEWPORT_PAD_PX;
260
+ setSkillsDropdownPos({
261
+ left: left,
262
+ bottom: viewportH - topSource + SLASH_DROPDOWN_GAP_PX,
263
+ maxHeight: Math.min(SLASH_DROPDOWN_MAX_HEIGHT_PX, Math.max(0, availableHeightPx))
264
+ });
265
+ }, [wrapperRef, getCaretRect]);
266
+ useLayoutEffect(function () {
267
+ if (!showSkillsDropdown) return undefined;
268
+ positionSkillsDropdown();
269
+ var handler = function handler() {
270
+ return positionSkillsDropdown();
271
+ };
272
+ window.addEventListener('scroll', handler, true);
273
+ window.addEventListener('resize', handler);
274
+ return function () {
275
+ window.removeEventListener('scroll', handler, true);
276
+ window.removeEventListener('resize', handler);
277
+ };
278
+ }, [showSkillsDropdown, skillsQuery, positionSkillsDropdown]);
279
+
280
+ /** Tras elegir o quitar búsqueda web/profunda: volver al textarea (Popover/menu puede robar foco). */
281
+ var scheduleInputFocusAfterToolAction = function scheduleInputFocusAfterToolAction() {
282
+ if (disabled) {
283
+ return;
284
+ }
285
+ requestAnimationFrame(function () {
286
+ window.setTimeout(function () {
287
+ var _editorRef$current;
288
+ (_editorRef$current = editorRef.current) === null || _editorRef$current === void 0 || _editorRef$current.focus();
289
+ }, 0);
290
+ });
291
+ };
292
+ var closePlusMenu = function closePlusMenu() {
293
+ setPlusMenuAnchor(null);
294
+ scheduleInputFocusAfterToolAction();
295
+ };
296
+ var cancelPendingToolChipExit = function cancelPendingToolChipExit() {
297
+ if (toolChipExitTimerRef.current !== null) {
298
+ clearTimeout(toolChipExitTimerRef.current);
299
+ toolChipExitTimerRef.current = null;
300
+ }
301
+ setToolChipExiting(false);
302
+ };
303
+ var handlePlusButtonMouseDown = function handlePlusButtonMouseDown(e) {
304
+ // Evita que el botón robe el foco del input al abrir el menú.
305
+ e.preventDefault();
306
+ };
307
+ var handlePlusButtonClick = function handlePlusButtonClick(e) {
308
+ e.stopPropagation();
309
+ if (plusMenuAnchor) {
310
+ closePlusMenu();
311
+ return;
312
+ }
313
+ setPlusMenuAnchor(e.currentTarget);
314
+ eventAmplitude(EVENTS.aiChatPlusOpen, _objectSpread({
315
+ agent_type: analyticsAgentType
316
+ }, analyticsCloneEntityPayload));
317
+ };
318
+ var handleMentionButtonClick = function handleMentionButtonClick(e) {
319
+ var _editorRef$current2;
320
+ e.stopPropagation();
321
+ if (disabled) return;
322
+ closePlusMenu();
323
+ (_editorRef$current2 = editorRef.current) === null || _editorRef$current2 === void 0 || _editorRef$current2.insertMentionTrigger();
324
+ };
325
+ var handlePlusMenuAttach = function handlePlusMenuAttach() {
326
+ var _fileInputRef$current;
327
+ closePlusMenu();
328
+ eventAmplitude(EVENTS.aiChatTools, _objectSpread({
329
+ agent_type: analyticsAgentType,
330
+ option: 'files'
331
+ }, analyticsCloneEntityPayload));
332
+ if (attachments.length >= MAX_CHAT_INPUT_ATTACHMENTS) return;
333
+ (_fileInputRef$current = fileInputRef.current) === null || _fileInputRef$current === void 0 || _fileInputRef$current.click();
334
+ };
335
+ var beginToolChipExit = function beginToolChipExit() {
336
+ if (toolChipExitTimerRef.current !== null) {
337
+ return;
338
+ }
339
+ var wasWeb = isWebSearchActive;
340
+ var wasDeep = isDeepSearchActive;
341
+ if (!wasWeb && !wasDeep) {
342
+ return;
343
+ }
344
+ setToolChipExiting(true);
345
+ toolChipExitTimerRef.current = setTimeout(function () {
346
+ toolChipExitTimerRef.current = null;
347
+ var _searchModeActiveRef$ = searchModeActiveRef.current,
348
+ web = _searchModeActiveRef$.web,
349
+ deep = _searchModeActiveRef$.deep;
350
+ if (wasWeb && web) {
351
+ toggleWebSearch();
352
+ } else if (wasDeep && deep) {
353
+ toggleDeepSearch();
354
+ }
355
+ setToolChipExiting(false);
356
+ scheduleInputFocusAfterToolAction();
357
+ }, TOOL_CHIP_EXIT_MS);
358
+ };
359
+ var handlePlusMenuWebSearch = function handlePlusMenuWebSearch() {
360
+ closePlusMenu();
361
+ if (isWebSearchActive) {
362
+ beginToolChipExit();
363
+ return;
364
+ }
365
+ cancelPendingToolChipExit();
366
+ if (isDeepSearchActive) {
367
+ toggleDeepSearch();
368
+ }
369
+ toggleWebSearch();
370
+ eventAmplitude(EVENTS.aiChatTools, _objectSpread({
371
+ agent_type: analyticsAgentType,
372
+ option: 'search'
373
+ }, analyticsCloneEntityPayload));
374
+ scheduleInputFocusAfterToolAction();
375
+ };
376
+ var handlePlusMenuDeepSearch = function handlePlusMenuDeepSearch() {
377
+ closePlusMenu();
378
+ if (isDeepSearchActive) {
379
+ beginToolChipExit();
380
+ return;
381
+ }
382
+ cancelPendingToolChipExit();
383
+ if (isWebSearchActive) {
384
+ toggleWebSearch();
385
+ }
386
+ toggleDeepSearch();
387
+ eventAmplitude(EVENTS.aiChatTools, _objectSpread({
388
+ agent_type: analyticsAgentType,
389
+ option: 'deep_search'
390
+ }, analyticsCloneEntityPayload));
391
+ scheduleInputFocusAfterToolAction();
392
+ };
393
+ var handlePlusMenuQuickActions = function handlePlusMenuQuickActions() {
394
+ var _editorRef$current3;
395
+ setPlusMenuAnchor(null);
396
+ if (disabled) return;
397
+ (_editorRef$current3 = editorRef.current) === null || _editorRef$current3 === void 0 || _editorRef$current3.insertSlashTrigger();
398
+ };
399
+ useEffect(function () {
400
+ if (!disabled) {
401
+ var _editorRef$current4;
402
+ (_editorRef$current4 = editorRef.current) === null || _editorRef$current4 === void 0 || _editorRef$current4.focus();
403
+ }
404
+ }, [disabled]);
405
+ useEffect(function () {
406
+ initialDraftAppliedRef.current = false;
407
+ }, [initialDraft]);
408
+ useEffect(function () {
409
+ var _editorRef$current5;
410
+ var draft = initialDraft === null || initialDraft === void 0 ? void 0 : initialDraft.trim();
411
+ if (!draft || initialDraftAppliedRef.current || disabled) {
412
+ return;
413
+ }
414
+ initialDraftAppliedRef.current = true;
415
+ if (deepLinkSendPendingRef) {
416
+ deepLinkSendPendingRef.current = true;
417
+ }
418
+ (_editorRef$current5 = editorRef.current) === null || _editorRef$current5 === void 0 || _editorRef$current5.setPlainText(draft);
419
+ setHasTypingPresence(true);
420
+ if (!disabled) {
421
+ var _editorRef$current6;
422
+ (_editorRef$current6 = editorRef.current) === null || _editorRef$current6 === void 0 || _editorRef$current6.focus();
423
+ }
424
+ }, [initialDraft, disabled, deepLinkSendPendingRef]);
425
+ var sendDisabled = useMemo(function () {
426
+ return !hasTypingPresence && attachments.length === 0;
427
+ }, [hasTypingPresence, attachments.length]);
428
+ useEffect(function () {
429
+ searchModeActiveRef.current = {
430
+ web: isWebSearchActive,
431
+ deep: isDeepSearchActive
432
+ };
433
+ }, [isWebSearchActive, isDeepSearchActive]);
434
+ useEffect(function () {
435
+ return function () {
436
+ if (toolChipExitTimerRef.current !== null) {
437
+ clearTimeout(toolChipExitTimerRef.current);
438
+ }
439
+ };
440
+ }, []);
441
+ useEffect(function () {
442
+ if (!isWebSearchActive && !isDeepSearchActive) {
443
+ setActiveToolChipHovered(false);
444
+ }
445
+ }, [isWebSearchActive, isDeepSearchActive]);
446
+
447
+ // Auto-focus cuando cambia el agente o la conversación, o al montar el componente
448
+ useEffect(function () {
449
+ var agentChanged = previousAgentIdRef.current !== (agent === null || agent === void 0 ? void 0 : agent.id);
450
+ var previousChatId = previousChatIdRef.current;
451
+ var currentChatId = chatId;
452
+ var chatChanged = previousChatId !== currentChatId;
453
+ var changedFromNewChatToOldChat = (previousChatId === undefined || previousChatId === null) && currentChatId !== undefined && currentChatId !== null;
454
+ var newChatStarted = previousNewChatKeyRef.current !== newChatKey;
455
+ var isInitialMount = previousAgentIdRef.current === undefined && previousChatIdRef.current === undefined;
456
+ if ((agentChanged || chatChanged || changedFromNewChatToOldChat || newChatStarted || isInitialMount) && !disabled) {
457
+ var delay = isInitialMount || changedFromNewChatToOldChat ? 200 : 100;
458
+ setTimeout(function () {
459
+ var _editorRef$current7;
460
+ if (!disabled) (_editorRef$current7 = editorRef.current) === null || _editorRef$current7 === void 0 || _editorRef$current7.focus();
461
+ }, delay);
462
+ }
463
+ previousAgentIdRef.current = agent === null || agent === void 0 ? void 0 : agent.id;
464
+ previousChatIdRef.current = chatId;
465
+ previousNewChatKeyRef.current = newChatKey;
466
+ }, [agent === null || agent === void 0 ? void 0 : agent.id, chatId, newChatKey, disabled]);
467
+
468
+ // Auto-focus cuando cambia la disposición del modal (sidebar / fullscreen / floating)
469
+ useEffect(function () {
470
+ if (!layoutMode) {
471
+ return undefined;
472
+ }
473
+ var previousLayoutMode = previousLayoutModeRef.current;
474
+ previousLayoutModeRef.current = layoutMode;
475
+ if (previousLayoutMode === undefined || previousLayoutMode === layoutMode || disabled) {
476
+ return undefined;
477
+ }
478
+ var timeoutId = window.setTimeout(function () {
479
+ if (!disabled) {
480
+ var _editorRef$current8;
481
+ (_editorRef$current8 = editorRef.current) === null || _editorRef$current8 === void 0 || _editorRef$current8.focus();
482
+ }
483
+ }, 200);
484
+ return function () {
485
+ return window.clearTimeout(timeoutId);
486
+ };
487
+ }, [layoutMode, disabled]);
488
+
489
+ // Appcues: notify that the input is visible for specialist agents (clone + project/client)
490
+ useEffect(function () {
491
+ var isSpecialistAgent = (agent === null || agent === void 0 ? void 0 : agent.type) === 'clone' && ((agent === null || agent === void 0 ? void 0 : agent.entity) === 'project' || (agent === null || agent === void 0 ? void 0 : agent.entity) === 'client');
492
+ if (!wrapperRef.current || !isSpecialistAgent) return undefined;
493
+ var observer = new IntersectionObserver(function (_ref2) {
494
+ var _ref3 = _slicedToArray(_ref2, 1),
495
+ entry = _ref3[0];
496
+ if (entry.isIntersecting) {
497
+ trackAppcuesEvent(APPCUES_EVENTS.maiaContextMentionInit);
498
+ observer.disconnect();
499
+ }
500
+ }, {
501
+ threshold: 0.1
502
+ });
503
+ observer.observe(wrapperRef.current);
504
+ return function () {
505
+ return observer.disconnect();
506
+ };
507
+ }, [agent === null || agent === void 0 ? void 0 : agent.id, agent === null || agent === void 0 ? void 0 : agent.type, agent === null || agent === void 0 ? void 0 : agent.entity]);
508
+
509
+ // Clear input when session changes (user switches to a different chat)
510
+ useEffect(function () {
511
+ var handleSessionChange = function handleSessionChange() {
512
+ var _editorRef$current9;
513
+ if (deepLinkSendPendingRef) {
514
+ deepLinkSendPendingRef.current = false;
515
+ }
516
+ (_editorRef$current9 = editorRef.current) === null || _editorRef$current9 === void 0 || _editorRef$current9.clear();
517
+ setHasTypingPresence(false);
518
+ setShowSlashDropdown(false);
519
+ setSlashQuery('');
520
+ resetMentionOpenTracking();
521
+ };
522
+ document.addEventListener('chat-session-changed', handleSessionChange);
523
+ return function () {
524
+ return document.removeEventListener('chat-session-changed', handleSessionChange);
525
+ };
526
+ }, [resetMentionOpenTracking, deepLinkSendPendingRef]);
527
+
528
+ // Mantener foco al seleccionar un contexto reciente (el click en el pill lo roba al input).
529
+ useEffect(function () {
530
+ var handleRefocus = function handleRefocus() {
531
+ if (disabled) return;
532
+ requestAnimationFrame(function () {
533
+ var _editorRef$current0;
534
+ (_editorRef$current0 = editorRef.current) === null || _editorRef$current0 === void 0 || _editorRef$current0.focus();
535
+ });
536
+ };
537
+ document.addEventListener('maia-input-refocus', handleRefocus);
538
+ return function () {
539
+ return document.removeEventListener('maia-input-refocus', handleRefocus);
540
+ };
541
+ }, [disabled]);
542
+ useEffect(function () {
543
+ var handleInsertSkillMention = function handleInsertSkillMention(event) {
544
+ var _editorRef$current1, _editorRef$current10;
545
+ var _ref4 = event.detail || {},
546
+ skill = _ref4.skill;
547
+ if (!skill || disabled) return;
548
+ var normalizedName = skill.name.replace(/^(@\/|#)/, '');
549
+ (_editorRef$current1 = editorRef.current) === null || _editorRef$current1 === void 0 || _editorRef$current1.clear();
550
+ (_editorRef$current10 = editorRef.current) === null || _editorRef$current10 === void 0 || _editorRef$current10.appendMentionAtEnd({
551
+ id: skill.id,
552
+ type: 'skill',
553
+ label: "#".concat(normalizedName)
554
+ });
555
+ requestAnimationFrame(function () {
556
+ var _editorRef$current11;
557
+ (_editorRef$current11 = editorRef.current) === null || _editorRef$current11 === void 0 || _editorRef$current11.focus();
558
+ });
559
+ };
560
+ document.addEventListener('maia-insert-skill-mention', handleInsertSkillMention);
561
+ return function () {
562
+ return document.removeEventListener('maia-insert-skill-mention', handleInsertSkillMention);
563
+ };
564
+ }, [disabled]);
565
+ var handleSendMessage = useCallback(function () {
566
+ var _editorRef$current12, _state$text, _state$mentions, _editorRef$current13;
567
+ var state = (_editorRef$current12 = editorRef.current) === null || _editorRef$current12 === void 0 ? void 0 : _editorRef$current12.serialize();
568
+ var text = (_state$text = state === null || state === void 0 ? void 0 : state.text) !== null && _state$text !== void 0 ? _state$text : '';
569
+ if (!text.trim() && !attachments.length) return;
570
+ var mentions = (_state$mentions = state === null || state === void 0 ? void 0 : state.mentions) !== null && _state$mentions !== void 0 ? _state$mentions : [];
571
+ onSendMessage(text, attachments, mentions);
572
+ (_editorRef$current13 = editorRef.current) === null || _editorRef$current13 === void 0 || _editorRef$current13.clear();
573
+ setHasTypingPresence(false);
574
+ setShowSlashDropdown(false);
575
+ setSlashQuery('');
576
+ setShowSkillsDropdown(false);
577
+ setSkillsQuery('');
578
+ skillsMenuWasOpenRef.current = false;
579
+ resetMentionOpenTracking();
580
+ }, [attachments, onSendMessage, resetMentionOpenTracking]);
581
+ var handleSelectSlashCommand = useCallback(function (command) {
582
+ var _editorRef$current14, _state$text2, _editorRef$current16;
583
+ eventAmplitude(EVENTS.aiChatQuickActionSelect, {
584
+ type_quick_action: resolveQuickActionType(command),
585
+ origin_quick_action: 'slash_menu'
586
+ });
587
+ var state = (_editorRef$current14 = editorRef.current) === null || _editorRef$current14 === void 0 ? void 0 : _editorRef$current14.serialize();
588
+ var text = (_state$text2 = state === null || state === void 0 ? void 0 : state.text) !== null && _state$text2 !== void 0 ? _state$text2 : '';
589
+ var triggerPart = "/".concat(slashQuery);
590
+ var beforeTrigger = text.endsWith(triggerPart) ? text.slice(0, -triggerPart.length) : text;
591
+ var isEmptyBeforeTrigger = beforeTrigger.trim() === '';
592
+ if (isEmptyBeforeTrigger) {
593
+ var _editorRef$current15;
594
+ onSendMessage(command.title, attachments, undefined, undefined, undefined, undefined, command.id);
595
+ (_editorRef$current15 = editorRef.current) === null || _editorRef$current15 === void 0 || _editorRef$current15.clear();
596
+ setHasTypingPresence(false);
597
+ setShowSlashDropdown(false);
598
+ setSlashQuery('');
599
+ slashMenuWasOpenRef.current = false;
600
+ resetMentionOpenTracking();
601
+ return;
602
+ }
603
+ (_editorRef$current16 = editorRef.current) === null || _editorRef$current16 === void 0 || _editorRef$current16.insertSlashCommand({
604
+ id: command.id,
605
+ label: command.title
606
+ });
607
+ setShowSlashDropdown(false);
608
+ setSlashQuery('');
609
+ slashMenuWasOpenRef.current = false;
610
+ }, [attachments, onSendMessage, resetMentionOpenTracking, slashQuery, eventAmplitude]);
611
+ var handleCloseSlashDropdown = function handleCloseSlashDropdown() {
612
+ setShowSlashDropdown(false);
613
+ slashMenuWasOpenRef.current = false;
614
+ };
615
+ var handleCloseSkillsDropdown = useCallback(function () {
616
+ setShowSkillsDropdown(false);
617
+ setSkillsQuery('');
618
+ skillsMenuWasOpenRef.current = false;
619
+ }, []);
620
+
621
+ /** Abre el listado desde el botón: inserta `#` en el editor para que el trigger quede activo. */
622
+ var handleSkillsButtonClick = function handleSkillsButtonClick(e) {
623
+ var _editorRef$current17;
624
+ e.stopPropagation();
625
+ if (disabled) return;
626
+ if (showSkillsDropdown) {
627
+ handleCloseSkillsDropdown();
628
+ return;
629
+ }
630
+ closePlusMenu();
631
+ (_editorRef$current17 = editorRef.current) === null || _editorRef$current17 === void 0 || _editorRef$current17.insertSkillTrigger();
632
+ };
633
+ var handleSelectSkill = useCallback(function (skill) {
634
+ var _editorRef$current18;
635
+ (_editorRef$current18 = editorRef.current) === null || _editorRef$current18 === void 0 || _editorRef$current18.insertSkillMention({
636
+ id: skill.id,
637
+ type: 'skill',
638
+ label: "#".concat(skill.name)
639
+ });
640
+ setShowSkillsDropdown(false);
641
+ setSkillsQuery('');
642
+ skillsMenuWasOpenRef.current = false;
643
+ }, []);
644
+ var handleCreateSkill = useCallback(function () {
645
+ setShowSkillsDropdown(false);
646
+ setSkillsQuery('');
647
+ skillsMenuWasOpenRef.current = false;
648
+ document.dispatchEvent(new CustomEvent('abm-skill-modal-set-values', {
649
+ detail: {
650
+ skillValues: {
651
+ values: {
652
+ isEditing: false,
653
+ intent: 'write'
654
+ },
655
+ isOpen: true
656
+ }
657
+ }
658
+ }));
659
+ }, []);
660
+ var handleEditorInput = useCallback(function (_ref5) {
661
+ var text = _ref5.text,
662
+ trigger = _ref5.trigger,
663
+ slashTrigger = _ref5.slashTrigger,
664
+ hashTrigger = _ref5.hashTrigger;
665
+ setHasTypingPresence(text.trim().length > 0);
666
+ onChange === null || onChange === void 0 || onChange();
667
+ handleTrigger(trigger);
668
+ if (slashTrigger !== null && slashTrigger !== void 0 && slashTrigger.active && slashCommands.length > 0) {
669
+ if (!slashMenuWasOpenRef.current) {
670
+ eventAmplitude(EVENTS.aiChatQuickActionOpen);
671
+ slashMenuWasOpenRef.current = true;
672
+ }
673
+ setShowSlashDropdown(true);
674
+ setSlashQuery(slashTrigger.query);
675
+ } else {
676
+ slashMenuWasOpenRef.current = false;
677
+ setShowSlashDropdown(false);
678
+ setSlashQuery('');
679
+ }
680
+ if (hashTrigger !== null && hashTrigger !== void 0 && hashTrigger.active && showSkillsButton) {
681
+ // Fetch on-open: una sola llamada por apertura del listado.
682
+ if (!skillsMenuWasOpenRef.current) {
683
+ skillsMenuWasOpenRef.current = true;
684
+ void fetchSkills();
685
+ }
686
+ setShowSkillsDropdown(true);
687
+ setSkillsQuery(hashTrigger.query);
688
+ } else {
689
+ skillsMenuWasOpenRef.current = false;
690
+ setShowSkillsDropdown(false);
691
+ setSkillsQuery('');
692
+ }
693
+ }, [onChange, handleTrigger, slashCommands, eventAmplitude, showSkillsButton, fetchSkills]);
694
+ var handleKeyDown = useCallback(function (e) {
695
+ if (handlePopoverKeyDown(e)) return;
696
+ if (e.key === 'Enter' && !e.shiftKey && !popoverOpen) {
697
+ e.preventDefault();
698
+ if (!sendDisabled && !disabled) handleSendMessage();
699
+ }
700
+ }, [handlePopoverKeyDown, popoverOpen, sendDisabled, disabled, handleSendMessage]);
701
+ var addFiles = function addFiles(incoming) {
702
+ if (!incoming.length || disabled) return;
703
+ var exceededFiles = [];
704
+ var excludedFiles = [];
705
+ var fileSizes = {};
706
+ var filesInserted = attachments.length;
707
+ var isNewFormat = function isNewFormat(extension) {
708
+ return ['.png', '.jpg', '.jpeg', '.pdf'].includes(extension);
709
+ };
710
+ var isOldFormat = function isOldFormat(extension) {
711
+ return ['.txt', '.md', '.csv', '.doc', '.docx', '.xlsx', '.xls', '.ppt', '.pptx'].includes(extension);
712
+ };
713
+ var isAudioFormat = function isAudioFormat(extension) {
714
+ return ['.flac', '.m4a', '.mp3', '.mp4', '.oga', '.ogg', '.wav', '.webm'].includes(extension);
715
+ };
716
+ var exceedsMaxSize = function exceedsMaxSize(extension, size) {
717
+ return size > getMaxAttachmentSizeMb(extension) * 1024 * 1024;
718
+ };
719
+ incoming.forEach(function (file) {
720
+ var _fileNameParts$pop;
721
+ var excludedFile = false;
722
+ var fileNameParts = file.name.split('.');
723
+ var fileExtension = fileNameParts.length > 1 ? ".".concat((_fileNameParts$pop = fileNameParts.pop()) === null || _fileNameParts$pop === void 0 ? void 0 : _fileNameParts$pop.toLowerCase()) : '';
724
+ if (!(allowedFileTypes !== null && allowedFileTypes !== void 0 && allowedFileTypes.includes(fileExtension))) {
725
+ return;
726
+ }
727
+ fileSizes[file.name] = file.size;
728
+ if (isNewFormat(fileExtension)) {
729
+ if (exceedsMaxSize(fileExtension, file.size)) {
730
+ exceededFiles.push(file.name);
731
+ excludedFile = true;
732
+ }
733
+ if (filesInserted + 1 > MAX_CHAT_INPUT_ATTACHMENTS) {
734
+ excludedFiles.push(file.name);
735
+ excludedFile = true;
736
+ }
737
+ } else if (isOldFormat(fileExtension)) {
738
+ if (exceedsMaxSize(fileExtension, file.size)) {
739
+ exceededFiles.push(file.name);
740
+ excludedFile = true;
741
+ }
742
+ if (filesInserted + 1 > MAX_CHAT_INPUT_ATTACHMENTS) {
743
+ excludedFiles.push(file.name);
744
+ excludedFile = true;
745
+ }
746
+ } else if (isAudioFormat(fileExtension)) {
747
+ if (exceedsMaxSize(fileExtension, file.size)) {
748
+ exceededFiles.push(file.name);
749
+ excludedFile = true;
750
+ }
751
+ if (filesInserted + 1 > MAX_CHAT_INPUT_ATTACHMENTS) {
752
+ excludedFiles.push(file.name);
753
+ excludedFile = true;
754
+ }
755
+ }
756
+ if (!excludedFile) {
757
+ filesInserted += 1;
758
+ var typeFile = file.type || fileTypes[fileExtension];
759
+ var parsedFile = new File([file], file.name, {
760
+ type: typeFile
761
+ });
762
+ onFileAttach === null || onFileAttach === void 0 || onFileAttach(parsedFile);
763
+ }
764
+ });
765
+ if (excludedFiles.length || exceededFiles.length) {
766
+ setModalProps({
767
+ isOpen: true,
768
+ excludedFiles: excludedFiles,
769
+ exceededFiles: exceededFiles,
770
+ fileSizes: fileSizes
771
+ });
772
+ }
773
+ };
774
+ var handleFileSelect = function handleFileSelect(e) {
775
+ var files = e.target.files;
776
+ if (files) {
777
+ addFiles(Array.from(files));
778
+ }
779
+ if (fileInputRef.current) {
780
+ fileInputRef.current.value = '';
781
+ }
782
+ };
783
+ var resetFileDrag = function resetFileDrag() {
784
+ fileDragCounterRef.current = 0;
785
+ setIsFileDragActive(false);
786
+ };
787
+ var handleDragEnter = function handleDragEnter(e) {
788
+ if (!dataTransferHasFiles(e.dataTransfer)) return;
789
+ e.preventDefault();
790
+ e.stopPropagation();
791
+ if (disabled) return;
792
+ fileDragCounterRef.current += 1;
793
+ setIsFileDragActive(true);
794
+ };
795
+ var handleDragLeave = function handleDragLeave(e) {
796
+ if (!isFileDragActive && !dataTransferHasFiles(e.dataTransfer)) return;
797
+ e.preventDefault();
798
+ e.stopPropagation();
799
+ fileDragCounterRef.current = Math.max(0, fileDragCounterRef.current - 1);
800
+ if (fileDragCounterRef.current === 0) {
801
+ setIsFileDragActive(false);
802
+ }
803
+ };
804
+ var handleDragOver = function handleDragOver(e) {
805
+ if (!dataTransferHasFiles(e.dataTransfer)) return;
806
+ e.preventDefault();
807
+ e.stopPropagation();
808
+ if (disabled) return;
809
+ e.dataTransfer.dropEffect = 'copy';
810
+ };
811
+ var handleDrop = function handleDrop(e) {
812
+ if (!dataTransferHasFiles(e.dataTransfer)) {
813
+ resetFileDrag();
814
+ return;
815
+ }
816
+ e.preventDefault();
817
+ e.stopPropagation();
818
+ resetFileDrag();
819
+ if (disabled) return;
820
+ addFiles(filesFromDataTransfer(e.dataTransfer));
821
+ };
822
+ var handlePasteFiles = function handlePasteFiles(files) {
823
+ addFiles(files);
824
+ };
825
+ var handleWrapperPaste = function handleWrapperPaste(e) {
826
+ var _wrapperRef$current3;
827
+ var editorEl = (_wrapperRef$current3 = wrapperRef.current) === null || _wrapperRef$current3 === void 0 ? void 0 : _wrapperRef$current3.querySelector('[contenteditable="true"]');
828
+ if (editorEl && editorEl.contains(e.target)) return;
829
+ var files = filesFromDataTransfer(e.clipboardData);
830
+ if (!files.length) return;
831
+ e.preventDefault();
832
+ addFiles(files);
833
+ };
834
+ var handleDeleteAttachment = function handleDeleteAttachment(fileId) {
835
+ onDeleteAttachment === null || onDeleteAttachment === void 0 || onDeleteAttachment(fileId);
836
+ };
837
+ var handleStopGeneration = function handleStopGeneration() {
838
+ eventAmplitude(EVENTS.aiChatStopResponse);
839
+ onStopGeneration === null || onStopGeneration === void 0 || onStopGeneration();
840
+ };
841
+ var showChipsRow = Boolean((contextChip === null || contextChip === void 0 || (_contextChip$items = contextChip.items) === null || _contextChip$items === void 0 ? void 0 : _contextChip$items.length) || attachments.length);
842
+ useLayoutEffect(function () {
843
+ var chipsEl = chipsRowRef.current;
844
+ var toolbarEl = toolbarRowRef.current;
845
+ var updateHeights = function updateHeights() {
846
+ var nextChips = showChipsRow && chipsEl ? Math.ceil(chipsEl.getBoundingClientRect().height) : 0;
847
+ var nextToolbar = toolbarEl ? Math.ceil(toolbarEl.getBoundingClientRect().height) : MAIA_INPUT_TOOLBAR_ROW_HEIGHT_PX;
848
+ setChipsRowHeight(function (prev) {
849
+ return prev === nextChips ? prev : nextChips;
850
+ });
851
+ setToolbarRowHeight(function (prev) {
852
+ return prev === nextToolbar ? prev : nextToolbar;
853
+ });
854
+ };
855
+ updateHeights();
856
+ var observer = new ResizeObserver(updateHeights);
857
+ if (showChipsRow && chipsEl) observer.observe(chipsEl);
858
+ if (toolbarEl) observer.observe(toolbarEl);
859
+ return function () {
860
+ return observer.disconnect();
861
+ };
862
+ }, [showChipsRow, contextChip === null || contextChip === void 0 || (_contextChip$items2 = contextChip.items) === null || _contextChip$items2 === void 0 ? void 0 : _contextChip$items2.length, attachments.length]);
863
+ var editorMaxHeight = useMemo(function () {
864
+ return getMaiaInputEditorMaxHeight({
865
+ chipsRowHeightPx: chipsRowHeight,
866
+ toolbarRowHeightPx: toolbarRowHeight
867
+ });
868
+ }, [chipsRowHeight, toolbarRowHeight]);
869
+ var toolbarIconColor = '#808080';
870
+ var plusMenuIconColor = MAIA_CHAT_INPUT_UI.menuIcon;
871
+ var isCustomAgent = (agent === null || agent === void 0 ? void 0 : agent.type) === 'custom';
872
+ var hasCorAccess = Boolean(isCustomAgent && (agent === null || agent === void 0 || (_agent$connectors = agent.connectors) === null || _agent$connectors === void 0 ? void 0 : _agent$connectors.some(function (connector) {
873
+ return connector.group === 'COR' && connector.slugs.some(function (slug) {
874
+ return typeof slug === 'string' && slug.trim().length > 0;
875
+ });
876
+ })));
877
+ var agentModelName = isCustomAgent ? (agent === null || agent === void 0 || (_agent$model_display_ = agent.model_display_name) === null || _agent$model_display_ === void 0 ? void 0 : _agent$model_display_.trim()) || null : null;
878
+ var showCustomMetaIndicators = hasCorAccess || Boolean(agentModelName);
879
+ var showMentionButton = (agent === null || agent === void 0 ? void 0 : agent.type) === 'orchestrator' || hasCorAccess;
880
+ var activeToolChipLeadingIcon;
881
+ if (activeToolChipHovered) {
882
+ activeToolChipLeadingIcon = /*#__PURE__*/_jsx(Cross, {
883
+ color: MAIA_CHAT_INPUT_UI.chipCloseIcon,
884
+ width: 18,
885
+ height: 18
886
+ });
887
+ } else if (isWebSearchActive) {
888
+ activeToolChipLeadingIcon = /*#__PURE__*/_jsx(MaiaInputWebSearchIcon, {
889
+ color: plusMenuIconColor,
890
+ width: 18,
891
+ height: 18
892
+ });
893
+ } else {
894
+ activeToolChipLeadingIcon = /*#__PURE__*/_jsx(MaiaInputDeepSearchIcon, {
895
+ color: plusMenuIconColor,
896
+ width: 18,
897
+ height: 18
898
+ });
899
+ }
900
+ return /*#__PURE__*/_jsxs(_Fragment, {
901
+ children: [/*#__PURE__*/_jsxs(StyledMAIAInputWrapper, {
902
+ ref: wrapperRef,
903
+ disabled: false,
904
+ alignButtons: alignButtons,
905
+ hasAttachments: !!attachments.length,
906
+ $fileDragActive: isFileDragActive,
907
+ "data-appcues": "maia_chat_input",
908
+ "data-maia-streaming": isStreaming ? 'true' : 'false',
909
+ onPaste: handleWrapperPaste,
910
+ onDragEnter: handleDragEnter,
911
+ onDragLeave: handleDragLeave,
912
+ onDragOver: handleDragOver,
913
+ onDrop: handleDrop,
914
+ children: [showChipsRow && /*#__PURE__*/_jsxs(SCInputChipsRow, {
915
+ ref: chipsRowRef,
916
+ children: [contextChip !== null && contextChip !== void 0 && (_contextChip$items3 = contextChip.items) !== null && _contextChip$items3 !== void 0 && _contextChip$items3.length ? /*#__PURE__*/_jsx(Chip, {
917
+ items: contextChip.items,
918
+ type: contextChip.type,
919
+ leadingIcon: contextChip.leadingIcon,
920
+ tooltipZIndex: tooltipZIndex
921
+ }) : null, attachments.map(function (attachment, index) {
922
+ var _attachment$type;
923
+ var isImage = ((_attachment$type = attachment.type) === null || _attachment$type === void 0 ? void 0 : _attachment$type.startsWith('image/')) || /\.(png|jpe?g|gif|webp|bmp|svg)$/i.test(attachment.name || '');
924
+ var chipIcon = isImage ? /*#__PURE__*/_jsx(MaiaInputAttachmentImageIcon, {
925
+ color: "#808080",
926
+ width: 12,
927
+ height: 12
928
+ }) : /*#__PURE__*/_jsx(MaiaInputAttachIcon, {
929
+ color: "#808080",
930
+ width: 13,
931
+ height: 13
932
+ });
933
+ return /*#__PURE__*/_jsx(Tooltip, {
934
+ title: attachment.name,
935
+ zIndex: tooltipZIndex,
936
+ children: /*#__PURE__*/_jsxs(SCMIAttachment, {
937
+ children: [/*#__PURE__*/_jsxs(SCMIAttachmentIcon, {
938
+ children: [/*#__PURE__*/_jsx(SCMIAttachmentFileIcon, {
939
+ children: chipIcon
940
+ }), /*#__PURE__*/_jsx(SCMIAttachmentDeleteIcon, {
941
+ type: "button",
942
+ "aria-label": t('chat.removeAttachmentAria', {
943
+ defaultValue: 'Quitar archivo'
944
+ }),
945
+ onClick: function onClick() {
946
+ return handleDeleteAttachment(attachment.id);
947
+ },
948
+ children: /*#__PURE__*/_jsx(Cross, {
949
+ color: "#666666",
950
+ width: 14,
951
+ height: 14
952
+ })
953
+ })]
954
+ }), /*#__PURE__*/_jsx(SCMIAttachmentName, {
955
+ children: attachment.name
956
+ })]
957
+ })
958
+ }, "".concat(attachment.id, "-").concat(index));
959
+ })]
960
+ }), /*#__PURE__*/_jsxs(StyledMAIAMainToolbarGrid, {
961
+ children: [/*#__PURE__*/_jsx(SCInputEditorCell, {
962
+ children: /*#__PURE__*/_jsx(ContextMentionEditor, {
963
+ ref: editorRef,
964
+ disabled: disabled,
965
+ placeholder: placeholder,
966
+ maxHeight: editorMaxHeight,
967
+ onInput: handleEditorInput,
968
+ onKeyDown: handleKeyDown,
969
+ onFocus: onFocus,
970
+ onPasteFiles: handlePasteFiles
971
+ })
972
+ }), /*#__PURE__*/_jsxs(SCInputToolbarRow, {
973
+ ref: toolbarRowRef,
974
+ children: [/*#__PURE__*/_jsx(StyledMAIAPlusToolbarCell, {
975
+ children: /*#__PURE__*/_jsxs(PlusMenuToolsRow, {
976
+ children: [/*#__PURE__*/_jsx(PlusToggleButton, {
977
+ type: "button",
978
+ $menuOpen: plusMenuOpen,
979
+ onMouseDown: handlePlusButtonMouseDown,
980
+ onClick: handlePlusButtonClick,
981
+ "aria-label": t('chat.openPlusMenuAria'),
982
+ "aria-haspopup": "true",
983
+ "aria-expanded": plusMenuOpen,
984
+ children: /*#__PURE__*/_jsx(MaiaInputAddIcon, {
985
+ color: toolbarIconColor,
986
+ width: 18,
987
+ height: 18
988
+ })
989
+ }), showMentionButton && /*#__PURE__*/_jsx(PlusToggleButton, {
990
+ type: "button",
991
+ $menuOpen: false,
992
+ onClick: handleMentionButtonClick,
993
+ disabled: disabled,
994
+ "aria-label": t('chat.openMentionAria'),
995
+ children: /*#__PURE__*/_jsx(MaiaInputMentionIcon, {
996
+ color: toolbarIconColor,
997
+ width: 18,
998
+ height: 18
999
+ })
1000
+ }), showSkillsButton && /*#__PURE__*/_jsxs(SkillsToggleButton, {
1001
+ ref: skillsButtonRef,
1002
+ type: "button",
1003
+ onMouseDown: handlePlusButtonMouseDown,
1004
+ onClick: handleSkillsButtonClick,
1005
+ disabled: disabled,
1006
+ "aria-haspopup": "listbox",
1007
+ "aria-expanded": showSkillsDropdown,
1008
+ children: [/*#__PURE__*/_jsx(SkillIcon, {
1009
+ width: 16,
1010
+ height: 16,
1011
+ color: toolbarIconColor
1012
+ }), t('mySkills.dropdownButton')]
1013
+ }), /*#__PURE__*/_jsx(Popover, {
1014
+ open: plusMenuOpen,
1015
+ anchorEl: plusMenuAnchor,
1016
+ onClose: closePlusMenu,
1017
+ disableAutoFocus: true,
1018
+ disableEnforceFocus: true,
1019
+ disableRestoreFocus: true,
1020
+ anchorOrigin: {
1021
+ vertical: 'top',
1022
+ horizontal: 'left'
1023
+ },
1024
+ transformOrigin: {
1025
+ vertical: 'bottom',
1026
+ horizontal: 'left'
1027
+ },
1028
+ sx: {
1029
+ zIndex: plusMenuZIndex
1030
+ },
1031
+ slotProps: {
1032
+ paper: {
1033
+ elevation: 0,
1034
+ sx: {
1035
+ overflow: 'visible',
1036
+ borderRadius: '4px',
1037
+ boxShadow: 'none',
1038
+ backgroundColor: 'transparent',
1039
+ marginTop: '-4px'
1040
+ }
1041
+ }
1042
+ },
1043
+ children: /*#__PURE__*/_jsx(PlusMenuPaper, {
1044
+ children: /*#__PURE__*/_jsxs(PlusMenuInnerColumn, {
1045
+ children: [/*#__PURE__*/_jsxs(PlusMenuItemButton, {
1046
+ type: "button",
1047
+ onClick: handlePlusMenuAttach,
1048
+ children: [/*#__PURE__*/_jsx(MaiaInputAttachIcon, {
1049
+ color: plusMenuIconColor,
1050
+ width: 21,
1051
+ height: 20
1052
+ }), /*#__PURE__*/_jsx(PlusMenuItemLabel, {
1053
+ children: t('chat.plusMenuAttach')
1054
+ })]
1055
+ }), /*#__PURE__*/_jsx(PlusMenuDivider, {}), /*#__PURE__*/_jsxs(PlusMenuItemButton, {
1056
+ type: "button",
1057
+ onClick: handlePlusMenuWebSearch,
1058
+ children: [/*#__PURE__*/_jsx(MaiaInputWebSearchIcon, {
1059
+ color: plusMenuIconColor,
1060
+ width: 20,
1061
+ height: 20
1062
+ }), /*#__PURE__*/_jsx(PlusMenuItemLabel, {
1063
+ children: t('chat.searchWeb')
1064
+ }), isWebSearchActive ? /*#__PURE__*/_jsx(Check, {
1065
+ color: plusMenuIconColor,
1066
+ width: 16,
1067
+ height: 16
1068
+ }) : null]
1069
+ }), /*#__PURE__*/_jsxs(PlusMenuItemButton, {
1070
+ type: "button",
1071
+ onClick: handlePlusMenuDeepSearch,
1072
+ children: [/*#__PURE__*/_jsx(MaiaInputDeepSearchIcon, {
1073
+ color: plusMenuIconColor,
1074
+ width: 20,
1075
+ height: 20
1076
+ }), /*#__PURE__*/_jsx(PlusMenuItemLabel, {
1077
+ children: t('chat.plusMenuDeepInvestigation')
1078
+ }), isDeepSearchActive ? /*#__PURE__*/_jsx(Check, {
1079
+ color: plusMenuIconColor,
1080
+ width: 16,
1081
+ height: 16
1082
+ }) : null]
1083
+ }), /*#__PURE__*/_jsx(PlusMenuDivider, {}), /*#__PURE__*/_jsxs(PlusMenuItemButton, {
1084
+ type: "button",
1085
+ onClick: handlePlusMenuQuickActions,
1086
+ children: [/*#__PURE__*/_jsx(MaiaInputSlashIcon, {
1087
+ color: plusMenuIconColor,
1088
+ width: 20,
1089
+ height: 20
1090
+ }), /*#__PURE__*/_jsx(PlusMenuItemLabel, {
1091
+ children: t('chat.plusMenuQuickActions')
1092
+ })]
1093
+ })]
1094
+ })
1095
+ })
1096
+ }), (isWebSearchActive || isDeepSearchActive) && /*#__PURE__*/_jsxs(ActiveToolChipRoot, {
1097
+ $hovered: activeToolChipHovered,
1098
+ $exiting: toolChipExiting,
1099
+ onMouseEnter: function onMouseEnter() {
1100
+ return setActiveToolChipHovered(true);
1101
+ },
1102
+ onMouseLeave: function onMouseLeave() {
1103
+ return setActiveToolChipHovered(false);
1104
+ },
1105
+ children: [/*#__PURE__*/_jsx(ActiveToolChipIconButton, {
1106
+ type: "button",
1107
+ $closeShown: activeToolChipHovered,
1108
+ "aria-label": t('chat.removeActiveToolAria'),
1109
+ onClick: function onClick(e) {
1110
+ e.stopPropagation();
1111
+ beginToolChipExit();
1112
+ },
1113
+ children: activeToolChipLeadingIcon
1114
+ }), /*#__PURE__*/_jsx(ActiveToolChipLabel, {
1115
+ children: isWebSearchActive ? t('chat.searchWeb') : t('chat.plusMenuDeepInvestigation')
1116
+ })]
1117
+ })]
1118
+ })
1119
+ }), /*#__PURE__*/_jsxs(StyledMAIASendToolbarCell, {
1120
+ children: [showCustomMetaIndicators && /*#__PURE__*/_jsxs(SCInputMetaIndicators, {
1121
+ children: [hasCorAccess && /*#__PURE__*/_jsx(Tooltip, _objectSpread(_objectSpread({
1122
+ title: t('chat.footer.corAccessTooltip')
1123
+ }, tooltipZIndex != null ? {
1124
+ zIndex: tooltipZIndex
1125
+ } : {}), {}, {
1126
+ children: /*#__PURE__*/_jsx(SCInputMetaIconButton, {
1127
+ "aria-label": t('chat.footer.corAccessLabel'),
1128
+ children: /*#__PURE__*/_jsx(CorAccessIcon, {
1129
+ width: 15,
1130
+ height: 14,
1131
+ color: toolbarIconColor
1132
+ })
1133
+ })
1134
+ })), agentModelName && /*#__PURE__*/_jsx(Tooltip, _objectSpread(_objectSpread({
1135
+ title: t('chipLlm.tooltip', {
1136
+ model: agentModelName
1137
+ })
1138
+ }, tooltipZIndex != null ? {
1139
+ zIndex: tooltipZIndex
1140
+ } : {}), {}, {
1141
+ children: /*#__PURE__*/_jsx(SCInputMetaIconButton, {
1142
+ "aria-label": agentModelName,
1143
+ children: /*#__PURE__*/_jsx(MaiaInputRobotIcon, {
1144
+ width: 18,
1145
+ height: 18,
1146
+ color: toolbarIconColor
1147
+ })
1148
+ })
1149
+ }))]
1150
+ }), isWriting ? /*#__PURE__*/_jsx(Tooltip, {
1151
+ title: t('chat.stop'),
1152
+ zIndex: tooltipZIndex,
1153
+ children: /*#__PURE__*/_jsx(StyledMAIAStopButton, {
1154
+ disabled: false,
1155
+ onClick: handleStopGeneration,
1156
+ className: className,
1157
+ children: /*#__PURE__*/_jsx(StyledMAIAStopIcon, {})
1158
+ })
1159
+ }) : /*#__PURE__*/_jsx(Tooltip, {
1160
+ title: t('chat.send'),
1161
+ zIndex: tooltipZIndex,
1162
+ children: /*#__PURE__*/_jsx("span", {
1163
+ style: {
1164
+ display: 'inline-flex',
1165
+ alignItems: 'center'
1166
+ },
1167
+ children: /*#__PURE__*/_jsx(StyledMAIASendButton, {
1168
+ onClick: handleSendMessage,
1169
+ className: className,
1170
+ disabled: sendDisabled || disabled,
1171
+ hasValues: hasTypingPresence || attachments.length > 0,
1172
+ children: /*#__PURE__*/_jsx(MaiaInputSendIcon, {
1173
+ color: "#BFBFBF",
1174
+ width: 16,
1175
+ height: 16
1176
+ })
1177
+ })
1178
+ })
1179
+ })]
1180
+ })]
1181
+ })]
1182
+ }), /*#__PURE__*/_jsx("input", {
1183
+ ref: fileInputRef,
1184
+ type: "file",
1185
+ multiple: true,
1186
+ accept: ".txt,.md,.csv,.doc,.docx,.ppt,.pptx,.png,.jpg,.jpeg,.pdf,.xlsx,.xls,.flac,.m4a,.mp3,.mp4,.oga,.ogg,.wav,.webm",
1187
+ onChange: handleFileSelect,
1188
+ style: {
1189
+ display: 'none'
1190
+ }
1191
+ }), isFileDragActive && /*#__PURE__*/_jsx(StyledMAIADropOverlay, {
1192
+ children: t('chat.dropFilesHere')
1193
+ })]
1194
+ }), modalProps.isOpen && /*#__PURE__*/_jsx(ModalFileExceeds, {
1195
+ onClose: function onClose() {
1196
+ return setModalProps({
1197
+ isOpen: false,
1198
+ excludedFiles: [],
1199
+ exceededFiles: [],
1200
+ fileSizes: {}
1201
+ });
1202
+ },
1203
+ excludedFiles: modalProps.excludedFiles,
1204
+ exceededFiles: modalProps.exceededFiles,
1205
+ fileSizes: modalProps.fileSizes
1206
+ }), popoverNode && /*#__PURE__*/createPortal(popoverNode, document.body), showSlashDropdown && /*#__PURE__*/createPortal(/*#__PURE__*/_jsx(SlashCommandDropdown, {
1207
+ commands: slashCommands,
1208
+ query: slashQuery,
1209
+ onSelect: handleSelectSlashCommand,
1210
+ onClose: handleCloseSlashDropdown,
1211
+ bottom: slashDropdownPos.bottom,
1212
+ left: slashDropdownPos.left,
1213
+ maxHeight: slashDropdownPos.maxHeight,
1214
+ zIndex: slashDropdownZIndex,
1215
+ anchorRef: wrapperRef
1216
+ }), document.body), showSkillsDropdown && /*#__PURE__*/createPortal(/*#__PURE__*/_jsx(SkillsDropdown, {
1217
+ skills: skills,
1218
+ query: skillsQuery,
1219
+ loading: skillsLoading,
1220
+ error: skillsError,
1221
+ canCreate: showSkillsButton,
1222
+ onSelect: handleSelectSkill,
1223
+ onCreate: handleCreateSkill,
1224
+ onClose: handleCloseSkillsDropdown,
1225
+ bottom: skillsDropdownPos.bottom,
1226
+ left: skillsDropdownPos.left,
1227
+ maxHeight: skillsDropdownPos.maxHeight,
1228
+ zIndex: slashDropdownZIndex,
1229
+ anchorRef: wrapperRef
1230
+ }), document.body)]
1231
+ });
1232
+ };
1233
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZUxheW91dEVmZmVjdCIsInVzZU1lbW8iLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsImNyZWF0ZVBvcnRhbCIsIlBvcG92ZXIiLCJDaGVjayIsIkNyb3NzIiwiVG9vbHRpcCIsIkFjdGl2ZVRvb2xDaGlwSWNvbkJ1dHRvbiIsIkFjdGl2ZVRvb2xDaGlwTGFiZWwiLCJBY3RpdmVUb29sQ2hpcFJvb3QiLCJQbHVzTWVudURpdmlkZXIiLCJQbHVzTWVudUlubmVyQ29sdW1uIiwiUGx1c01lbnVJdGVtQnV0dG9uIiwiUGx1c01lbnVJdGVtTGFiZWwiLCJQbHVzTWVudVBhcGVyIiwiUGx1c01lbnVUb29sc1JvdyIsIlBsdXNUb2dnbGVCdXR0b24iLCJTa2lsbHNUb2dnbGVCdXR0b24iLCJTQ0lucHV0Q2hpcHNSb3ciLCJTQ0lucHV0TWV0YUljb25CdXR0b24iLCJTQ0lucHV0TWV0YUluZGljYXRvcnMiLCJTQ01JQXR0YWNobWVudCIsIlNDTUlBdHRhY2htZW50RGVsZXRlSWNvbiIsIlNDTUlBdHRhY2htZW50RmlsZUljb24iLCJTQ01JQXR0YWNobWVudEljb24iLCJTQ01JQXR0YWNobWVudE5hbWUiLCJTdHlsZWRNQUlBSW5wdXRXcmFwcGVyIiwiU3R5bGVkTUFJQVNlbmRCdXR0b24iLCJTdHlsZWRNQUlBTWFpblRvb2xiYXJHcmlkIiwiU0NJbnB1dEVkaXRvckNlbGwiLCJTQ0lucHV0VG9vbGJhclJvdyIsIlN0eWxlZE1BSUFQbHVzVG9vbGJhckNlbGwiLCJTdHlsZWRNQUlBU2VuZFRvb2xiYXJDZWxsIiwiU3R5bGVkTUFJQVN0b3BCdXR0b24iLCJTdHlsZWRNQUlBU3RvcEljb24iLCJTdHlsZWRNQUlBRHJvcE92ZXJsYXkiLCJnZXRNYWlhSW5wdXRFZGl0b3JNYXhIZWlnaHQiLCJNQUlBX0lOUFVUX1RPT0xCQVJfUk9XX0hFSUdIVF9QWCIsInVzZUdsb2JhbENvbnRleHQiLCJNb2RhbEZpbGVFeGNlZWRzIiwiU2xhc2hDb21tYW5kRHJvcGRvd24iLCJTa2lsbHNEcm9wZG93biIsInVzZVNsYXNoQ29tbWFuZHMiLCJ1c2VTa2lsbHNDYXRhbG9nIiwiY2FuQWNjZXNzVG9Ta2lsbHMiLCJ1c2VVc2VyIiwicmVzb2x2ZVF1aWNrQWN0aW9uVHlwZSIsInVzZVQiLCJNYWlhSW5wdXRBZGRJY29uIiwiTWFpYUlucHV0QXR0YWNoSWNvbiIsIk1haWFJbnB1dEF0dGFjaG1lbnRJbWFnZUljb24iLCJNYWlhSW5wdXREZWVwU2VhcmNoSWNvbiIsIkNvckFjY2Vzc0ljb24iLCJNYWlhSW5wdXRNZW50aW9uSWNvbiIsIk1haWFJbnB1dFJvYm90SWNvbiIsIk1haWFJbnB1dFNlbmRJY29uIiwiTWFpYUlucHV0U2xhc2hJY29uIiwiU2tpbGxJY29uIiwiTWFpYUlucHV0V2ViU2VhcmNoSWNvbiIsIkVWRU5UUyIsInVzZUV2ZW50IiwiZ2V0Q2hhdFRvb2xzTWVudUFnZW50VHlwZSIsIk1BSUFfQ0hBVF9JTlBVVF9VSSIsImFsbG93ZWRGaWxlVHlwZXMiLCJmaWxlVHlwZXMiLCJnZXRNYXhBdHRhY2htZW50U2l6ZU1iIiwiTUFYX0NIQVRfSU5QVVRfQVRUQUNITUVOVFMiLCJBUFBDVUVTX0VWRU5UUyIsInRyYWNrQXBwY3Vlc0V2ZW50IiwiQ2hpcCIsIkNvbnRleHRNZW50aW9uRWRpdG9yIiwidXNlTWFpYVRhc2tQYW5lbFpJbmRleCIsInVzZU1lbnRpb25Qb3BvdmVyIiwidXNlQ2FyZXRQb3NpdGlvbiIsImRhdGFUcmFuc2Zlckhhc0ZpbGVzIiwiZmlsZXNGcm9tRGF0YVRyYW5zZmVyIiwianN4IiwiX2pzeCIsImpzeHMiLCJfanN4cyIsIkZyYWdtZW50IiwiX0ZyYWdtZW50IiwiVE9PTF9DSElQX0VYSVRfTVMiLCJTTEFTSF9EUk9QRE9XTl9XSURUSF9QWCIsIlNMQVNIX0RST1BET1dOX01BWF9IRUlHSFRfUFgiLCJTS0lMTFNfRFJPUERPV05fV0lEVEhfUFgiLCJTTEFTSF9EUk9QRE9XTl9HQVBfUFgiLCJTTEFTSF9EUk9QRE9XTl9WSUVXUE9SVF9QQURfUFgiLCJNQUlBSW5wdXQiLCJfcmVmIiwiX2FnZW50JGVudGl0eSIsIl9jb250ZXh0Q2hpcCRpdGVtcyIsIl9jb250ZXh0Q2hpcCRpdGVtczIiLCJfYWdlbnQkY29ubmVjdG9ycyIsIl9hZ2VudCRtb2RlbF9kaXNwbGF5XyIsIl9jb250ZXh0Q2hpcCRpdGVtczMiLCJvblNlbmRNZXNzYWdlIiwiY2xhc3NOYW1lIiwiZGlzYWJsZWQiLCJpc1N0cmVhbWluZyIsImlzV3JpdGluZyIsIm9uU3RvcEdlbmVyYXRpb24iLCJwbGFjZWhvbGRlciIsIm9uQ2hhbmdlIiwib25Gb2N1cyIsIl9yZWYkYWxpZ25CdXR0b25zIiwiYWxpZ25CdXR0b25zIiwib25GaWxlQXR0YWNoIiwib25EZWxldGVBdHRhY2htZW50IiwiX3JlZiRhdHRhY2htZW50cyIsImF0dGFjaG1lbnRzIiwiY2hhdElkIiwibmV3Q2hhdEtleSIsInRvb2x0aXBaSW5kZXgiLCJleHRlcm5hbFBvcG92ZXJBbmNob3JSZWYiLCJwb3BvdmVyQW5jaG9yUmVmIiwibGF5b3V0TW9kZSIsImNvbnRleHRDaGlwIiwiX3VzZVQiLCJ0IiwiZWRpdG9yUmVmIiwiZmlsZUlucHV0UmVmIiwiY2hpcHNSb3dSZWYiLCJ0b29sYmFyUm93UmVmIiwiaW50ZXJuYWxXcmFwcGVyUmVmIiwid3JhcHBlclJlZiIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsImhhc1R5cGluZ1ByZXNlbmNlIiwic2V0SGFzVHlwaW5nUHJlc2VuY2UiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsImNoaXBzUm93SGVpZ2h0Iiwic2V0Q2hpcHNSb3dIZWlnaHQiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsInRvb2xiYXJSb3dIZWlnaHQiLCJzZXRUb29sYmFyUm93SGVpZ2h0IiwiX3VzZVN0YXRlNyIsImlzT3BlbiIsImV4Y2x1ZGVkRmlsZXMiLCJleGNlZWRlZEZpbGVzIiwiZmlsZVNpemVzIiwiX3VzZVN0YXRlOCIsIm1vZGFsUHJvcHMiLCJzZXRNb2RhbFByb3BzIiwiZXZlbnRBbXBsaXR1ZGUiLCJfdXNlR2xvYmFsQ29udGV4dCIsInRvZ2dsZVdlYlNlYXJjaCIsImlzV2ViU2VhcmNoQWN0aXZlIiwidG9nZ2xlRGVlcFNlYXJjaCIsImlzRGVlcFNlYXJjaEFjdGl2ZSIsImFnZW50IiwiaW5pdGlhbERyYWZ0IiwiZGVlcExpbmtTZW5kUGVuZGluZ1JlZiIsInBsdXNNZW51WkluZGV4IiwiaW5pdGlhbERyYWZ0QXBwbGllZFJlZiIsIl91c2VNZW50aW9uUG9wb3ZlciIsInBvcG92ZXJPcGVuIiwicmVzZXRNZW50aW9uT3BlblRyYWNraW5nIiwiaGFuZGxlVHJpZ2dlciIsImhhbmRsZVBvcG92ZXJLZXlEb3duIiwiaGFuZGxlS2V5RG93biIsInBvcG92ZXJOb2RlIiwiX3VzZVN0YXRlOSIsIl91c2VTdGF0ZTAiLCJwbHVzTWVudUFuY2hvciIsInNldFBsdXNNZW51QW5jaG9yIiwiX3VzZVN0YXRlMSIsIl91c2VTdGF0ZTEwIiwiYWN0aXZlVG9vbENoaXBIb3ZlcmVkIiwic2V0QWN0aXZlVG9vbENoaXBIb3ZlcmVkIiwiX3VzZVN0YXRlMTEiLCJfdXNlU3RhdGUxMiIsInRvb2xDaGlwRXhpdGluZyIsInNldFRvb2xDaGlwRXhpdGluZyIsIl91c2VTdGF0ZTEzIiwiX3VzZVN0YXRlMTQiLCJpc0ZpbGVEcmFnQWN0aXZlIiwic2V0SXNGaWxlRHJhZ0FjdGl2ZSIsInRvb2xDaGlwRXhpdFRpbWVyUmVmIiwiZmlsZURyYWdDb3VudGVyUmVmIiwic2VhcmNoTW9kZUFjdGl2ZVJlZiIsIndlYiIsImRlZXAiLCJwbHVzTWVudU9wZW4iLCJCb29sZWFuIiwicHJldmlvdXNBZ2VudElkUmVmIiwidW5kZWZpbmVkIiwicHJldmlvdXNDaGF0SWRSZWYiLCJwcmV2aW91c05ld0NoYXRLZXlSZWYiLCJwcmV2aW91c0xheW91dE1vZGVSZWYiLCJhbmFseXRpY3NBZ2VudFR5cGUiLCJhbmFseXRpY3NDbG9uZUVudGl0eVBheWxvYWQiLCJ0eXBlIiwiZW50aXR5IiwiX3VzZVNsYXNoQ29tbWFuZHMiLCJpZCIsInNsYXNoQ29tbWFuZHMiLCJjb21tYW5kcyIsIl91c2VTdGF0ZTE1IiwiX3VzZVN0YXRlMTYiLCJzaG93U2xhc2hEcm9wZG93biIsInNldFNob3dTbGFzaERyb3Bkb3duIiwiX3VzZVN0YXRlMTciLCJfdXNlU3RhdGUxOCIsInNsYXNoUXVlcnkiLCJzZXRTbGFzaFF1ZXJ5Iiwic2xhc2hNZW51V2FzT3BlblJlZiIsInNsYXNoRHJvcGRvd25aSW5kZXgiLCJnZXRDYXJldFJlY3QiLCJfdXNlU3RhdGUxOSIsImJvdHRvbSIsImxlZnQiLCJtYXhIZWlnaHQiLCJfdXNlU3RhdGUyMCIsInNsYXNoRHJvcGRvd25Qb3MiLCJzZXRTbGFzaERyb3Bkb3duUG9zIiwidXNlciIsInNob3dTa2lsbHNCdXR0b24iLCJza2lsbHNCdXR0b25SZWYiLCJza2lsbHNNZW51V2FzT3BlblJlZiIsIl91c2VTa2lsbHNDYXRhbG9nIiwic2tpbGxzIiwic2tpbGxzTG9hZGluZyIsImxvYWRpbmciLCJza2lsbHNFcnJvciIsImVycm9yIiwiZmV0Y2hTa2lsbHMiLCJfdXNlU3RhdGUyMSIsIl91c2VTdGF0ZTIyIiwic2hvd1NraWxsc0Ryb3Bkb3duIiwic2V0U2hvd1NraWxsc0Ryb3Bkb3duIiwiX3VzZVN0YXRlMjMiLCJfdXNlU3RhdGUyNCIsInNraWxsc1F1ZXJ5Iiwic2V0U2tpbGxzUXVlcnkiLCJfdXNlU3RhdGUyNSIsIl91c2VTdGF0ZTI2Iiwic2tpbGxzRHJvcGRvd25Qb3MiLCJzZXRTa2lsbHNEcm9wZG93blBvcyIsInBvc2l0aW9uU2xhc2hEcm9wZG93biIsIl93cmFwcGVyUmVmJGN1cnJlbnQiLCJfY2FyZXQkdG9wIiwiX2NhcmV0JGxlZnQiLCJ3cmFwcGVyUmVjdCIsImN1cnJlbnQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJjYXJldCIsInRvcFNvdXJjZSIsInRvcCIsIndpZHRoIiwibGVmdFNvdXJjZSIsInZpZXdwb3J0SCIsIndpbmRvdyIsImlubmVySGVpZ2h0Iiwidmlld3BvcnRXIiwiaW5uZXJXaWR0aCIsIk1hdGgiLCJtYXgiLCJtaW4iLCJhdmFpbGFibGVIZWlnaHRQeCIsImhhbmRsZXIiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInBvc2l0aW9uU2tpbGxzRHJvcGRvd24iLCJfd3JhcHBlclJlZiRjdXJyZW50MiIsIl9jYXJldCR0b3AyIiwiX2NhcmV0JGxlZnQyIiwic2NoZWR1bGVJbnB1dEZvY3VzQWZ0ZXJUb29sQWN0aW9uIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwic2V0VGltZW91dCIsIl9lZGl0b3JSZWYkY3VycmVudCIsImZvY3VzIiwiY2xvc2VQbHVzTWVudSIsImNhbmNlbFBlbmRpbmdUb29sQ2hpcEV4aXQiLCJjbGVhclRpbWVvdXQiLCJoYW5kbGVQbHVzQnV0dG9uTW91c2VEb3duIiwiZSIsInByZXZlbnREZWZhdWx0IiwiaGFuZGxlUGx1c0J1dHRvbkNsaWNrIiwic3RvcFByb3BhZ2F0aW9uIiwiY3VycmVudFRhcmdldCIsImFpQ2hhdFBsdXNPcGVuIiwiX29iamVjdFNwcmVhZCIsImFnZW50X3R5cGUiLCJoYW5kbGVNZW50aW9uQnV0dG9uQ2xpY2siLCJfZWRpdG9yUmVmJGN1cnJlbnQyIiwiaW5zZXJ0TWVudGlvblRyaWdnZXIiLCJoYW5kbGVQbHVzTWVudUF0dGFjaCIsIl9maWxlSW5wdXRSZWYkY3VycmVudCIsImFpQ2hhdFRvb2xzIiwib3B0aW9uIiwibGVuZ3RoIiwiY2xpY2siLCJiZWdpblRvb2xDaGlwRXhpdCIsIndhc1dlYiIsIndhc0RlZXAiLCJfc2VhcmNoTW9kZUFjdGl2ZVJlZiQiLCJoYW5kbGVQbHVzTWVudVdlYlNlYXJjaCIsImhhbmRsZVBsdXNNZW51RGVlcFNlYXJjaCIsImhhbmRsZVBsdXNNZW51UXVpY2tBY3Rpb25zIiwiX2VkaXRvclJlZiRjdXJyZW50MyIsImluc2VydFNsYXNoVHJpZ2dlciIsIl9lZGl0b3JSZWYkY3VycmVudDQiLCJfZWRpdG9yUmVmJGN1cnJlbnQ1IiwiZHJhZnQiLCJ0cmltIiwic2V0UGxhaW5UZXh0IiwiX2VkaXRvclJlZiRjdXJyZW50NiIsInNlbmREaXNhYmxlZCIsImFnZW50Q2hhbmdlZCIsInByZXZpb3VzQ2hhdElkIiwiY3VycmVudENoYXRJZCIsImNoYXRDaGFuZ2VkIiwiY2hhbmdlZEZyb21OZXdDaGF0VG9PbGRDaGF0IiwibmV3Q2hhdFN0YXJ0ZWQiLCJpc0luaXRpYWxNb3VudCIsImRlbGF5IiwiX2VkaXRvclJlZiRjdXJyZW50NyIsInByZXZpb3VzTGF5b3V0TW9kZSIsInRpbWVvdXRJZCIsIl9lZGl0b3JSZWYkY3VycmVudDgiLCJpc1NwZWNpYWxpc3RBZ2VudCIsIm9ic2VydmVyIiwiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiLCJfcmVmMiIsIl9yZWYzIiwiZW50cnkiLCJpc0ludGVyc2VjdGluZyIsIm1haWFDb250ZXh0TWVudGlvbkluaXQiLCJkaXNjb25uZWN0IiwidGhyZXNob2xkIiwib2JzZXJ2ZSIsImhhbmRsZVNlc3Npb25DaGFuZ2UiLCJfZWRpdG9yUmVmJGN1cnJlbnQ5IiwiY2xlYXIiLCJkb2N1bWVudCIsImhhbmRsZVJlZm9jdXMiLCJfZWRpdG9yUmVmJGN1cnJlbnQwIiwiaGFuZGxlSW5zZXJ0U2tpbGxNZW50aW9uIiwiZXZlbnQiLCJfZWRpdG9yUmVmJGN1cnJlbnQxIiwiX2VkaXRvclJlZiRjdXJyZW50MTAiLCJfcmVmNCIsImRldGFpbCIsInNraWxsIiwibm9ybWFsaXplZE5hbWUiLCJuYW1lIiwicmVwbGFjZSIsImFwcGVuZE1lbnRpb25BdEVuZCIsImxhYmVsIiwiY29uY2F0IiwiX2VkaXRvclJlZiRjdXJyZW50MTEiLCJoYW5kbGVTZW5kTWVzc2FnZSIsIl9lZGl0b3JSZWYkY3VycmVudDEyIiwiX3N0YXRlJHRleHQiLCJfc3RhdGUkbWVudGlvbnMiLCJfZWRpdG9yUmVmJGN1cnJlbnQxMyIsInN0YXRlIiwic2VyaWFsaXplIiwidGV4dCIsIm1lbnRpb25zIiwiaGFuZGxlU2VsZWN0U2xhc2hDb21tYW5kIiwiY29tbWFuZCIsIl9lZGl0b3JSZWYkY3VycmVudDE0IiwiX3N0YXRlJHRleHQyIiwiX2VkaXRvclJlZiRjdXJyZW50MTYiLCJhaUNoYXRRdWlja0FjdGlvblNlbGVjdCIsInR5cGVfcXVpY2tfYWN0aW9uIiwib3JpZ2luX3F1aWNrX2FjdGlvbiIsInRyaWdnZXJQYXJ0IiwiYmVmb3JlVHJpZ2dlciIsImVuZHNXaXRoIiwic2xpY2UiLCJpc0VtcHR5QmVmb3JlVHJpZ2dlciIsIl9lZGl0b3JSZWYkY3VycmVudDE1IiwidGl0bGUiLCJpbnNlcnRTbGFzaENvbW1hbmQiLCJoYW5kbGVDbG9zZVNsYXNoRHJvcGRvd24iLCJoYW5kbGVDbG9zZVNraWxsc0Ryb3Bkb3duIiwiaGFuZGxlU2tpbGxzQnV0dG9uQ2xpY2siLCJfZWRpdG9yUmVmJGN1cnJlbnQxNyIsImluc2VydFNraWxsVHJpZ2dlciIsImhhbmRsZVNlbGVjdFNraWxsIiwiX2VkaXRvclJlZiRjdXJyZW50MTgiLCJpbnNlcnRTa2lsbE1lbnRpb24iLCJoYW5kbGVDcmVhdGVTa2lsbCIsImRpc3BhdGNoRXZlbnQiLCJDdXN0b21FdmVudCIsInNraWxsVmFsdWVzIiwidmFsdWVzIiwiaXNFZGl0aW5nIiwiaW50ZW50IiwiaGFuZGxlRWRpdG9ySW5wdXQiLCJfcmVmNSIsInRyaWdnZXIiLCJzbGFzaFRyaWdnZXIiLCJoYXNoVHJpZ2dlciIsImFjdGl2ZSIsImFpQ2hhdFF1aWNrQWN0aW9uT3BlbiIsInF1ZXJ5Iiwia2V5Iiwic2hpZnRLZXkiLCJhZGRGaWxlcyIsImluY29taW5nIiwiZmlsZXNJbnNlcnRlZCIsImlzTmV3Rm9ybWF0IiwiZXh0ZW5zaW9uIiwiaW5jbHVkZXMiLCJpc09sZEZvcm1hdCIsImlzQXVkaW9Gb3JtYXQiLCJleGNlZWRzTWF4U2l6ZSIsInNpemUiLCJmb3JFYWNoIiwiZmlsZSIsIl9maWxlTmFtZVBhcnRzJHBvcCIsImV4Y2x1ZGVkRmlsZSIsImZpbGVOYW1lUGFydHMiLCJzcGxpdCIsImZpbGVFeHRlbnNpb24iLCJwb3AiLCJ0b0xvd2VyQ2FzZSIsInB1c2giLCJ0eXBlRmlsZSIsInBhcnNlZEZpbGUiLCJGaWxlIiwiaGFuZGxlRmlsZVNlbGVjdCIsImZpbGVzIiwidGFyZ2V0IiwiQXJyYXkiLCJmcm9tIiwidmFsdWUiLCJyZXNldEZpbGVEcmFnIiwiaGFuZGxlRHJhZ0VudGVyIiwiZGF0YVRyYW5zZmVyIiwiaGFuZGxlRHJhZ0xlYXZlIiwiaGFuZGxlRHJhZ092ZXIiLCJkcm9wRWZmZWN0IiwiaGFuZGxlRHJvcCIsImhhbmRsZVBhc3RlRmlsZXMiLCJoYW5kbGVXcmFwcGVyUGFzdGUiLCJfd3JhcHBlclJlZiRjdXJyZW50MyIsImVkaXRvckVsIiwicXVlcnlTZWxlY3RvciIsImNvbnRhaW5zIiwiY2xpcGJvYXJkRGF0YSIsImhhbmRsZURlbGV0ZUF0dGFjaG1lbnQiLCJmaWxlSWQiLCJoYW5kbGVTdG9wR2VuZXJhdGlvbiIsImFpQ2hhdFN0b3BSZXNwb25zZSIsInNob3dDaGlwc1JvdyIsIml0ZW1zIiwiY2hpcHNFbCIsInRvb2xiYXJFbCIsInVwZGF0ZUhlaWdodHMiLCJuZXh0Q2hpcHMiLCJjZWlsIiwiaGVpZ2h0IiwibmV4dFRvb2xiYXIiLCJwcmV2IiwiUmVzaXplT2JzZXJ2ZXIiLCJlZGl0b3JNYXhIZWlnaHQiLCJjaGlwc1Jvd0hlaWdodFB4IiwidG9vbGJhclJvd0hlaWdodFB4IiwidG9vbGJhckljb25Db2xvciIsInBsdXNNZW51SWNvbkNvbG9yIiwibWVudUljb24iLCJpc0N1c3RvbUFnZW50IiwiaGFzQ29yQWNjZXNzIiwiY29ubmVjdG9ycyIsInNvbWUiLCJjb25uZWN0b3IiLCJncm91cCIsInNsdWdzIiwic2x1ZyIsImFnZW50TW9kZWxOYW1lIiwibW9kZWxfZGlzcGxheV9uYW1lIiwic2hvd0N1c3RvbU1ldGFJbmRpY2F0b3JzIiwic2hvd01lbnRpb25CdXR0b24iLCJhY3RpdmVUb29sQ2hpcExlYWRpbmdJY29uIiwiY29sb3IiLCJjaGlwQ2xvc2VJY29uIiwiY2hpbGRyZW4iLCJyZWYiLCJoYXNBdHRhY2htZW50cyIsIiRmaWxlRHJhZ0FjdGl2ZSIsIm9uUGFzdGUiLCJvbkRyYWdFbnRlciIsIm9uRHJhZ0xlYXZlIiwib25EcmFnT3ZlciIsIm9uRHJvcCIsImxlYWRpbmdJY29uIiwibWFwIiwiYXR0YWNobWVudCIsImluZGV4IiwiX2F0dGFjaG1lbnQkdHlwZSIsImlzSW1hZ2UiLCJzdGFydHNXaXRoIiwidGVzdCIsImNoaXBJY29uIiwiekluZGV4IiwiZGVmYXVsdFZhbHVlIiwib25DbGljayIsIm9uSW5wdXQiLCJvbktleURvd24iLCJvblBhc3RlRmlsZXMiLCIkbWVudU9wZW4iLCJvbk1vdXNlRG93biIsIm9wZW4iLCJhbmNob3JFbCIsIm9uQ2xvc2UiLCJkaXNhYmxlQXV0b0ZvY3VzIiwiZGlzYWJsZUVuZm9yY2VGb2N1cyIsImRpc2FibGVSZXN0b3JlRm9jdXMiLCJhbmNob3JPcmlnaW4iLCJ2ZXJ0aWNhbCIsImhvcml6b250YWwiLCJ0cmFuc2Zvcm1PcmlnaW4iLCJzeCIsInNsb3RQcm9wcyIsInBhcGVyIiwiZWxldmF0aW9uIiwib3ZlcmZsb3ciLCJib3JkZXJSYWRpdXMiLCJib3hTaGFkb3ciLCJiYWNrZ3JvdW5kQ29sb3IiLCJtYXJnaW5Ub3AiLCIkaG92ZXJlZCIsIiRleGl0aW5nIiwib25Nb3VzZUVudGVyIiwib25Nb3VzZUxlYXZlIiwiJGNsb3NlU2hvd24iLCJtb2RlbCIsInN0eWxlIiwiZGlzcGxheSIsImFsaWduSXRlbXMiLCJoYXNWYWx1ZXMiLCJtdWx0aXBsZSIsImFjY2VwdCIsImJvZHkiLCJvblNlbGVjdCIsImFuY2hvclJlZiIsImNhbkNyZWF0ZSIsIm9uQ3JlYXRlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvYXRvbXMvTUFJQUlucHV0L01BSUFJbnB1dC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tcmVzdHJpY3RlZC1zeW50YXggKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnRpbnVlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby12b2lkICovXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9uby1hcnJheS1pbmRleC1rZXkgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLWxvbmVseS1pZiAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLyogZXNsaW50LWRpc2FibGUgcHJlZmVyLWRlc3RydWN0dXJpbmcgKi9cbi8qIGVzbGludC1kaXNhYmxlIGpzeC1hMTF5L2NsaWNrLWV2ZW50cy1oYXZlLWtleS1ldmVudHMgKi9cbi8qIGVzbGludC1kaXNhYmxlIGpzeC1hMTF5L25vLXN0YXRpYy1lbGVtZW50LWludGVyYWN0aW9ucyAqL1xuaW1wb3J0IHtcbiAgQ2hhbmdlRXZlbnQsXG4gIENsaXBib2FyZEV2ZW50LFxuICBEcmFnRXZlbnQsXG4gIEtleWJvYXJkRXZlbnQsXG4gIE1vdXNlRXZlbnQsXG4gIFJlYWN0Tm9kZSxcbiAgTXV0YWJsZVJlZk9iamVjdCxcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTGF5b3V0RWZmZWN0LFxuICB1c2VNZW1vLFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxufSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGNyZWF0ZVBvcnRhbCB9IGZyb20gJ3JlYWN0LWRvbSdcbmltcG9ydCB7IFBvcG92ZXIgfSBmcm9tICdAbXVpL21hdGVyaWFsJ1xuaW1wb3J0IHsgQ2hlY2sgfSBmcm9tICdAcHJvamVjdGNvci9pY29ucy9saWIvY29tcG9uZW50cy9DaGVjaydcbmltcG9ydCB7IENyb3NzIH0gZnJvbSAnQHByb2plY3Rjb3IvaWNvbnMvbGliL2NvbXBvbmVudHMvQ3Jvc3MnXG5pbXBvcnQgeyBUb29sdGlwIH0gZnJvbSAnQHByb2plY3Rjb3IvdG9vbHRpcHYyL2xpYi9jb21wb25lbnRzL1Rvb2x0aXAnXG5cbmltcG9ydCB7XG4gIEFjdGl2ZVRvb2xDaGlwSWNvbkJ1dHRvbixcbiAgQWN0aXZlVG9vbENoaXBMYWJlbCxcbiAgQWN0aXZlVG9vbENoaXBSb290LFxuICBQbHVzTWVudURpdmlkZXIsXG4gIFBsdXNNZW51SW5uZXJDb2x1bW4sXG4gIFBsdXNNZW51SXRlbUJ1dHRvbixcbiAgUGx1c01lbnVJdGVtTGFiZWwsXG4gIFBsdXNNZW51UGFwZXIsXG4gIFBsdXNNZW51VG9vbHNSb3csXG4gIFBsdXNUb2dnbGVCdXR0b24sXG4gIFNraWxsc1RvZ2dsZUJ1dHRvbixcbiAgU0NJbnB1dENoaXBzUm93LFxuICBTQ0lucHV0TWV0YUljb25CdXR0b24sXG4gIFNDSW5wdXRNZXRhSW5kaWNhdG9ycyxcbiAgU0NNSUF0dGFjaG1lbnQsXG4gIFNDTUlBdHRhY2htZW50RGVsZXRlSWNvbixcbiAgU0NNSUF0dGFjaG1lbnRGaWxlSWNvbixcbiAgU0NNSUF0dGFjaG1lbnRJY29uLFxuICBTQ01JQXR0YWNobWVudE5hbWUsXG4gIFN0eWxlZE1BSUFJbnB1dFdyYXBwZXIsXG4gIFN0eWxlZE1BSUFTZW5kQnV0dG9uLFxuICBTdHlsZWRNQUlBTWFpblRvb2xiYXJHcmlkLFxuICBTQ0lucHV0RWRpdG9yQ2VsbCxcbiAgU0NJbnB1dFRvb2xiYXJSb3csXG4gIFN0eWxlZE1BSUFQbHVzVG9vbGJhckNlbGwsXG4gIFN0eWxlZE1BSUFTZW5kVG9vbGJhckNlbGwsXG4gIFN0eWxlZE1BSUFTdG9wQnV0dG9uLFxuICBTdHlsZWRNQUlBU3RvcEljb24sXG4gIFN0eWxlZE1BSUFEcm9wT3ZlcmxheSxcbn0gZnJvbSAnLi9zdHlsZXMnXG5pbXBvcnQgeyBnZXRNYWlhSW5wdXRFZGl0b3JNYXhIZWlnaHQsIE1BSUFfSU5QVVRfVE9PTEJBUl9ST1dfSEVJR0hUX1BYIH0gZnJvbSAnLi9tYWlhSW5wdXRMYXlvdXQnXG5pbXBvcnQgeyB1c2VHbG9iYWxDb250ZXh0IH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9nbG9iYWwtY29udGV4dCdcbmltcG9ydCB7IE1vZGFsRmlsZUV4Y2VlZHMgfSBmcm9tICcuLi8uLi9vcmdhbmlzbXMvTW9kYWxGaWxlRXhjZWVkcydcbmltcG9ydCB7IFNsYXNoQ29tbWFuZERyb3Bkb3duIH0gZnJvbSAnLi4vU2xhc2hDb21tYW5kRHJvcGRvd24nXG5pbXBvcnQgeyBTa2lsbHNEcm9wZG93biB9IGZyb20gJy4uL1NraWxsc0Ryb3Bkb3duJ1xuaW1wb3J0IHsgdXNlU2xhc2hDb21tYW5kcyB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVNsYXNoQ29tbWFuZHMnXG5pbXBvcnQgeyB1c2VTa2lsbHNDYXRhbG9nIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlU2tpbGxzQ2F0YWxvZydcbmltcG9ydCB7IGNhbkFjY2Vzc1RvU2tpbGxzIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL3Blcm1pc3Npb25zJ1xuaW1wb3J0IHsgdXNlVXNlciB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHQvY29yLXVzZXInXG5pbXBvcnQgdHlwZSB7IFNraWxsIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvc2tpbGwnXG5pbXBvcnQgeyByZXNvbHZlUXVpY2tBY3Rpb25UeXBlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvaG91cnNQbGFubmVyUXVpY2tBY3Rpb25UeXBlJ1xuaW1wb3J0IHR5cGUgeyBBY3Rpb24gfSBmcm9tICcuLi8uLi8uLi90eXBlcy9BY3Rpb24nXG5pbXBvcnQgeyB1c2VUIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlVCdcbmltcG9ydCB7IE1haWFJbnB1dEFkZEljb24gfSBmcm9tICcuLi9pY29ucy9NYWlhSW5wdXRBZGRJY29uJ1xuaW1wb3J0IHsgTWFpYUlucHV0QXR0YWNoSWNvbiB9IGZyb20gJy4uL2ljb25zL01haWFJbnB1dEF0dGFjaEljb24nXG5pbXBvcnQgeyBNYWlhSW5wdXRBdHRhY2htZW50SW1hZ2VJY29uIH0gZnJvbSAnLi4vaWNvbnMvTWFpYUlucHV0QXR0YWNobWVudEltYWdlSWNvbidcbmltcG9ydCB7IE1haWFJbnB1dERlZXBTZWFyY2hJY29uIH0gZnJvbSAnLi4vaWNvbnMvTWFpYUlucHV0RGVlcFNlYXJjaEljb24nXG5pbXBvcnQgeyBDb3JBY2Nlc3NJY29uIH0gZnJvbSAnLi4vaWNvbnMvQ29yQWNjZXNzSWNvbidcbmltcG9ydCB7IE1haWFJbnB1dE1lbnRpb25JY29uIH0gZnJvbSAnLi4vaWNvbnMvTWFpYUlucHV0TWVudGlvbkljb24nXG5pbXBvcnQgeyBNYWlhSW5wdXRSb2JvdEljb24gfSBmcm9tICcuLi9pY29ucy9NYWlhSW5wdXRSb2JvdEljb24nXG5pbXBvcnQgeyBNYWlhSW5wdXRTZW5kSWNvbiB9IGZyb20gJy4uL2ljb25zL01haWFJbnB1dFNlbmRJY29uJ1xuaW1wb3J0IHsgTWFpYUlucHV0U2xhc2hJY29uIH0gZnJvbSAnLi4vaWNvbnMvTWFpYUlucHV0U2xhc2hJY29uJ1xuaW1wb3J0IHsgU2tpbGxJY29uIH0gZnJvbSAnLi4vaWNvbnMvU2tpbGxJY29uJ1xuaW1wb3J0IHsgTWFpYUlucHV0V2ViU2VhcmNoSWNvbiB9IGZyb20gJy4uL2ljb25zL01haWFJbnB1dFdlYlNlYXJjaEljb24nXG5pbXBvcnQgeyBFVkVOVFMsIHVzZUV2ZW50IH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlRXZlbnQnXG5pbXBvcnQgeyBnZXRDaGF0VG9vbHNNZW51QWdlbnRUeXBlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvaGl0bEFuYWx5dGljcydcbmltcG9ydCB7IE1BSUFfQ0hBVF9JTlBVVF9VSSB9IGZyb20gJy4uLy4uLy4uL3N0eWxlcy9jb25maWcnXG5pbXBvcnQge1xuICBhbGxvd2VkRmlsZVR5cGVzLFxuICBmaWxlVHlwZXMsXG4gIGdldE1heEF0dGFjaG1lbnRTaXplTWIsXG4gIE1BWF9DSEFUX0lOUFVUX0FUVEFDSE1FTlRTLFxufSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvZm9ybWF0RXh0ZW5zaW9ucydcbmltcG9ydCB7IEFQUENVRVNfRVZFTlRTLCB0cmFja0FwcGN1ZXNFdmVudCB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2FwcGN1ZXMnXG5pbXBvcnQgeyBDaGlwIH0gZnJvbSAnLi4vQ2hpcCdcbmltcG9ydCB7IENvbnRleHRNZW50aW9uRWRpdG9yLCBDb250ZXh0TWVudGlvbkVkaXRvckhhbmRsZSB9IGZyb20gJy4uL0NvbnRleHRNZW50aW9uRWRpdG9yJ1xuaW1wb3J0IHsgdXNlTWFpYVRhc2tQYW5lbFpJbmRleCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZU1haWFUYXNrUGFuZWxaSW5kZXgnXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWN5Y2xlXG5pbXBvcnQgeyB1c2VNZW50aW9uUG9wb3ZlciB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZU1lbnRpb25Qb3BvdmVyJ1xuaW1wb3J0IHsgdXNlQ2FyZXRQb3NpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZUNhcmV0UG9zaXRpb24nXG5pbXBvcnQgeyBDb250ZXh0RW50aXR5VHlwZSwgQ29udGV4dE1lbnRpb24gfSBmcm9tICcuLi8uLi8uLi90eXBlcy9jb250ZXh0TWVudGlvbidcbmltcG9ydCB7IGRhdGFUcmFuc2Zlckhhc0ZpbGVzLCBmaWxlc0Zyb21EYXRhVHJhbnNmZXIgfSBmcm9tICcuLi8uLi8uLi91dGlscy9jaGF0SW5wdXRGaWxlcydcblxuY29uc3QgVE9PTF9DSElQX0VYSVRfTVMgPSAyMjBcbmNvbnN0IFNMQVNIX0RST1BET1dOX1dJRFRIX1BYID0gMzQwXG5jb25zdCBTTEFTSF9EUk9QRE9XTl9NQVhfSEVJR0hUX1BYID0gNDE2XG5jb25zdCBTS0lMTFNfRFJPUERPV05fV0lEVEhfUFggPSAzMzlcbmNvbnN0IFNMQVNIX0RST1BET1dOX0dBUF9QWCA9IDRcbmNvbnN0IFNMQVNIX0RST1BET1dOX1ZJRVdQT1JUX1BBRF9QWCA9IDhcblxudHlwZSBBdHRhY2htZW50RmlsZSA9IHtcbiAgZmlsZTogRmlsZVxuICBvcmlnaW5hbEZpbGU/OiBGaWxlXG4gIGlkOiBzdHJpbmdcbiAgbmFtZTogc3RyaW5nXG4gIHNpemU6IG51bWJlclxuICB0eXBlOiBzdHJpbmdcbiAgaWNvbj86IFJlYWN0Tm9kZVxufVxuXG50eXBlIE1BSUFJbnB1dFByb3BzID0ge1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgZGlzYWJsZWQ/OiBib29sZWFuXG4gIG9uU2VuZE1lc3NhZ2U6IChcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdLFxuICAgIG1lbnRpb25zPzogQ29udGV4dE1lbnRpb25bXSxcbiAgICBmYXFJZD86IHN0cmluZyxcbiAgICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZyxcbiAgICBmdWFJZD86IHN0cmluZyxcbiAgICBzY0lkPzogc3RyaW5nXG4gICkgPT4gdm9pZFxuICBvblN0b3BHZW5lcmF0aW9uPzogKCgpID0+IHZvaWQpIHwgbnVsbFxuICBpc1N0cmVhbWluZz86IGJvb2xlYW5cbiAgaXNXcml0aW5nPzogYm9vbGVhblxuICBwbGFjZWhvbGRlcj86IHN0cmluZ1xuICBvbkNoYW5nZT86ICgpID0+IHZvaWRcbiAgb25Gb2N1cz86ICgpID0+IHZvaWRcbiAgYWxpZ25CdXR0b25zPzogJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJ1xuICBvbkZpbGVBdHRhY2g/OiAoZmlsZTogRmlsZSkgPT4gdm9pZFxuICBvbkRlbGV0ZUF0dGFjaG1lbnQ/OiAoZmlsZUlkOiBzdHJpbmcpID0+IHZvaWRcbiAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdXG4gIGNoYXRJZD86IHN0cmluZ1xuICBuZXdDaGF0S2V5PzogbnVtYmVyXG4gIHRvb2x0aXBaSW5kZXg/OiBudW1iZXJcbiAgLyoqIEV4cG9uZSBlbCB3cmFwcGVyIGRlbCBpbnB1dCBwYXJhIGFuY2xhciBwb3BvdmVycyAobWVuY2lvbmVzLCBwaW4gZGUgY29udGV4dG8pLiAqL1xuICBwb3BvdmVyQW5jaG9yUmVmPzogTXV0YWJsZVJlZk9iamVjdDxIVE1MRGl2RWxlbWVudCB8IG51bGw+XG4gIGxheW91dE1vZGU/OiAnc2lkZWJhcicgfCAnZnVsbHNjcmVlbicgfCAnZmxvYXRpbmcnXG4gIC8qKiBDaGlwIGRlIGNvbnRleHRvICh0YXJlYS9wcm95ZWN0by9jbGllbnRlL2dsb2JhbCkgbW9zdHJhZG8gZW4gbGEgdG9vbGJhciBkZWwgaW5wdXQuICovXG4gIGNvbnRleHRDaGlwPzoge1xuICAgIGl0ZW1zOiBzdHJpbmdbXVxuICAgIHR5cGU/OiBDb250ZXh0RW50aXR5VHlwZVxuICAgIGxlYWRpbmdJY29uPzogUmVhY3ROb2RlXG4gIH0gfCBudWxsXG59XG5cbmV4cG9ydCBjb25zdCBNQUlBSW5wdXQgPSAoe1xuICBvblNlbmRNZXNzYWdlLFxuICBjbGFzc05hbWUsXG4gIGRpc2FibGVkLFxuICBpc1N0cmVhbWluZyxcbiAgaXNXcml0aW5nLFxuICBvblN0b3BHZW5lcmF0aW9uLFxuICBwbGFjZWhvbGRlcixcbiAgb25DaGFuZ2UsXG4gIG9uRm9jdXMsXG4gIGFsaWduQnV0dG9ucyA9ICd2ZXJ0aWNhbCcsXG4gIG9uRmlsZUF0dGFjaCxcbiAgb25EZWxldGVBdHRhY2htZW50LFxuICBhdHRhY2htZW50cyA9IFtdLFxuICBjaGF0SWQsXG4gIG5ld0NoYXRLZXksXG4gIHRvb2x0aXBaSW5kZXgsXG4gIHBvcG92ZXJBbmNob3JSZWY6IGV4dGVybmFsUG9wb3ZlckFuY2hvclJlZixcbiAgbGF5b3V0TW9kZSxcbiAgY29udGV4dENoaXAsXG59OiBNQUlBSW5wdXRQcm9wcykgPT4ge1xuICBjb25zdCB7IHQgfSA9IHVzZVQoKVxuICBjb25zdCBlZGl0b3JSZWYgPSB1c2VSZWY8Q29udGV4dE1lbnRpb25FZGl0b3JIYW5kbGU+KG51bGwpXG4gIGNvbnN0IGZpbGVJbnB1dFJlZiA9IHVzZVJlZjxIVE1MSW5wdXRFbGVtZW50PihudWxsKVxuICBjb25zdCBjaGlwc1Jvd1JlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbClcbiAgY29uc3QgdG9vbGJhclJvd1JlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbClcbiAgY29uc3QgaW50ZXJuYWxXcmFwcGVyUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKVxuICBjb25zdCB3cmFwcGVyUmVmID0gZXh0ZXJuYWxQb3BvdmVyQW5jaG9yUmVmID8/IGludGVybmFsV3JhcHBlclJlZlxuICBjb25zdCBbaGFzVHlwaW5nUHJlc2VuY2UsIHNldEhhc1R5cGluZ1ByZXNlbmNlXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbY2hpcHNSb3dIZWlnaHQsIHNldENoaXBzUm93SGVpZ2h0XSA9IHVzZVN0YXRlKDApXG4gIGNvbnN0IFt0b29sYmFyUm93SGVpZ2h0LCBzZXRUb29sYmFyUm93SGVpZ2h0XSA9IHVzZVN0YXRlKE1BSUFfSU5QVVRfVE9PTEJBUl9ST1dfSEVJR0hUX1BYKVxuICBjb25zdCBbbW9kYWxQcm9wcywgc2V0TW9kYWxQcm9wc10gPSB1c2VTdGF0ZSh7XG4gICAgaXNPcGVuOiBmYWxzZSxcbiAgICBleGNsdWRlZEZpbGVzOiBbXSBhcyBzdHJpbmdbXSxcbiAgICBleGNlZWRlZEZpbGVzOiBbXSBhcyBzdHJpbmdbXSxcbiAgICBmaWxlU2l6ZXM6IHt9IGFzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4sXG4gIH0pXG4gIGNvbnN0IGV2ZW50QW1wbGl0dWRlID0gdXNlRXZlbnQoKVxuICBjb25zdCB7XG4gICAgdG9nZ2xlV2ViU2VhcmNoLFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIHRvZ2dsZURlZXBTZWFyY2gsXG4gICAgaXNEZWVwU2VhcmNoQWN0aXZlLFxuICAgIGFnZW50LFxuICAgIGluaXRpYWxEcmFmdCxcbiAgICBkZWVwTGlua1NlbmRQZW5kaW5nUmVmLFxuICB9ID0gdXNlR2xvYmFsQ29udGV4dCgpXG4gIGNvbnN0IHBsdXNNZW51WkluZGV4ID0gdXNlTWFpYVRhc2tQYW5lbFpJbmRleCgxMzAwLCAnb3ZlcmxheScpXG4gIGNvbnN0IGluaXRpYWxEcmFmdEFwcGxpZWRSZWYgPSB1c2VSZWYoZmFsc2UpXG5cbiAgY29uc3Qge1xuICAgIHBvcG92ZXJPcGVuLFxuICAgIHJlc2V0TWVudGlvbk9wZW5UcmFja2luZyxcbiAgICBoYW5kbGVUcmlnZ2VyLFxuICAgIGhhbmRsZUtleURvd246IGhhbmRsZVBvcG92ZXJLZXlEb3duLFxuICAgIHBvcG92ZXJOb2RlLFxuICB9ID0gdXNlTWVudGlvblBvcG92ZXIoe1xuICAgIGVkaXRvclJlZixcbiAgICBwb3BvdmVyQW5jaG9yUmVmOiB3cmFwcGVyUmVmLFxuICB9KVxuXG4gIGNvbnN0IFtwbHVzTWVudUFuY2hvciwgc2V0UGx1c01lbnVBbmNob3JdID0gdXNlU3RhdGU8SFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsPihudWxsKVxuICBjb25zdCBbYWN0aXZlVG9vbENoaXBIb3ZlcmVkLCBzZXRBY3RpdmVUb29sQ2hpcEhvdmVyZWRdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFt0b29sQ2hpcEV4aXRpbmcsIHNldFRvb2xDaGlwRXhpdGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2lzRmlsZURyYWdBY3RpdmUsIHNldElzRmlsZURyYWdBY3RpdmVdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IHRvb2xDaGlwRXhpdFRpbWVyUmVmID0gdXNlUmVmPFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbD4obnVsbClcbiAgY29uc3QgZmlsZURyYWdDb3VudGVyUmVmID0gdXNlUmVmKDApXG4gIGNvbnN0IHNlYXJjaE1vZGVBY3RpdmVSZWYgPSB1c2VSZWYoeyB3ZWI6IGZhbHNlLCBkZWVwOiBmYWxzZSB9KVxuICBjb25zdCBwbHVzTWVudU9wZW4gPSBCb29sZWFuKHBsdXNNZW51QW5jaG9yKVxuXG4gIC8vIEluaWNpYWxpemFyIGxhcyByZWZlcmVuY2lhcyBjb21vIHVuZGVmaW5lZCBwYXJhIGRldGVjdGFyIGVsIHByaW1lciBjYW1iaW8gY29ycmVjdGFtZW50ZVxuICBjb25zdCBwcmV2aW91c0FnZW50SWRSZWYgPSB1c2VSZWY8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXG4gIGNvbnN0IHByZXZpb3VzQ2hhdElkUmVmID0gdXNlUmVmPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKVxuICBjb25zdCBwcmV2aW91c05ld0NoYXRLZXlSZWYgPSB1c2VSZWY8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXG4gIGNvbnN0IHByZXZpb3VzTGF5b3V0TW9kZVJlZiA9IHVzZVJlZjxNQUlBSW5wdXRQcm9wc1snbGF5b3V0TW9kZSddPih1bmRlZmluZWQpXG5cbiAgY29uc3QgYW5hbHl0aWNzQWdlbnRUeXBlID0gZ2V0Q2hhdFRvb2xzTWVudUFnZW50VHlwZShhZ2VudClcbiAgY29uc3QgYW5hbHl0aWNzQ2xvbmVFbnRpdHlQYXlsb2FkID0gYWdlbnQ/LnR5cGUgPT09ICdjbG9uZScgPyB7IGVudGl0eTogYWdlbnQuZW50aXR5ID8/IG51bGwgfSA6IHt9XG5cbiAgLy8gU2xhc2ggY29tbWFuZHMgYXBsaWNhbiBhIGNsb25lcyBlc3BlY2lhbGlzdGFzIHkgYWwgb3JjaGVzdHJhdG9yIGdsb2JhbCAoZXN0ZSBhZ3JlZ2EgbG9zIGRlIHN1cyBzdWJhZ2VudGVzKS5cbiAgLy8gTG9zIGN1c3RvbSB5IGxvcyBjbG9uZSBnbG9iYWwvbWFpYWtlciBubyBsb3MgdGllbmVuIGhhYmlsaXRhZG9zLlxuICBjb25zdCB7IGNvbW1hbmRzOiBzbGFzaENvbW1hbmRzIH0gPSB1c2VTbGFzaENvbW1hbmRzKFxuICAgIChhZ2VudD8udHlwZSA9PT0gJ29yY2hlc3RyYXRvcicgJiYgYWdlbnQ/LmVudGl0eSA9PT0gJ2dsb2JhbCcpIHx8XG4gICAgICAoYWdlbnQ/LnR5cGUgPT09ICdjbG9uZScgJiYgYWdlbnQ/LmVudGl0eSAhPT0gJ2dsb2JhbCcpXG4gICAgICA/IGFnZW50Py5pZFxuICAgICAgOiB1bmRlZmluZWRcbiAgKVxuICBjb25zdCBbc2hvd1NsYXNoRHJvcGRvd24sIHNldFNob3dTbGFzaERyb3Bkb3duXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbc2xhc2hRdWVyeSwgc2V0U2xhc2hRdWVyeV0gPSB1c2VTdGF0ZSgnJylcbiAgY29uc3Qgc2xhc2hNZW51V2FzT3BlblJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3Qgc2xhc2hEcm9wZG93blpJbmRleCA9IHVzZU1haWFUYXNrUGFuZWxaSW5kZXgoMTIwMCwgJ292ZXJsYXknKVxuICBjb25zdCBnZXRDYXJldFJlY3QgPSB1c2VDYXJldFBvc2l0aW9uKClcbiAgY29uc3QgW3NsYXNoRHJvcGRvd25Qb3MsIHNldFNsYXNoRHJvcGRvd25Qb3NdID0gdXNlU3RhdGUoe1xuICAgIGJvdHRvbTogMCxcbiAgICBsZWZ0OiAwLFxuICAgIG1heEhlaWdodDogU0xBU0hfRFJPUERPV05fTUFYX0hFSUdIVF9QWCxcbiAgfSlcblxuICBjb25zdCB1c2VyID0gdXNlVXNlcigpXG4gIGNvbnN0IHNob3dTa2lsbHNCdXR0b24gPSBjYW5BY2Nlc3NUb1NraWxscyh1c2VyKVxuICBjb25zdCBza2lsbHNCdXR0b25SZWYgPSB1c2VSZWY8SFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsPihudWxsKVxuICBjb25zdCBza2lsbHNNZW51V2FzT3BlblJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgeyBza2lsbHMsIGxvYWRpbmc6IHNraWxsc0xvYWRpbmcsIGVycm9yOiBza2lsbHNFcnJvciwgZmV0Y2hTa2lsbHMgfSA9IHVzZVNraWxsc0NhdGFsb2coKVxuICBjb25zdCBbc2hvd1NraWxsc0Ryb3Bkb3duLCBzZXRTaG93U2tpbGxzRHJvcGRvd25dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtza2lsbHNRdWVyeSwgc2V0U2tpbGxzUXVlcnldID0gdXNlU3RhdGUoJycpXG4gIGNvbnN0IFtza2lsbHNEcm9wZG93blBvcywgc2V0U2tpbGxzRHJvcGRvd25Qb3NdID0gdXNlU3RhdGUoe1xuICAgIGJvdHRvbTogMCxcbiAgICBsZWZ0OiAwLFxuICAgIG1heEhlaWdodDogU0xBU0hfRFJPUERPV05fTUFYX0hFSUdIVF9QWCxcbiAgfSlcblxuICBjb25zdCBwb3NpdGlvblNsYXNoRHJvcGRvd24gPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3Qgd3JhcHBlclJlY3QgPSB3cmFwcGVyUmVmLmN1cnJlbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgY29uc3QgY2FyZXQgPSBnZXRDYXJldFJlY3QoJy8nKVxuICAgIGNvbnN0IHRvcFNvdXJjZSA9IGNhcmV0Py50b3AgPz8gKHdyYXBwZXJSZWN0ICYmIHdyYXBwZXJSZWN0LndpZHRoID4gMCA/IHdyYXBwZXJSZWN0LnRvcCA6IG51bGwpXG4gICAgY29uc3QgbGVmdFNvdXJjZSA9IGNhcmV0Py5sZWZ0ID8/ICh3cmFwcGVyUmVjdCAmJiB3cmFwcGVyUmVjdC53aWR0aCA+IDAgPyB3cmFwcGVyUmVjdC5sZWZ0IDogbnVsbClcbiAgICBpZiAodG9wU291cmNlID09IG51bGwgfHwgbGVmdFNvdXJjZSA9PSBudWxsKSByZXR1cm5cblxuICAgIGNvbnN0IHZpZXdwb3J0SCA9IHdpbmRvdy5pbm5lckhlaWdodFxuICAgIGNvbnN0IHZpZXdwb3J0VyA9IHdpbmRvdy5pbm5lcldpZHRoXG4gICAgY29uc3QgbGVmdCA9IE1hdGgubWF4KFxuICAgICAgU0xBU0hfRFJPUERPV05fVklFV1BPUlRfUEFEX1BYLFxuICAgICAgTWF0aC5taW4odmlld3BvcnRXIC0gU0xBU0hfRFJPUERPV05fV0lEVEhfUFggLSBTTEFTSF9EUk9QRE9XTl9WSUVXUE9SVF9QQURfUFgsIGxlZnRTb3VyY2UpXG4gICAgKVxuICAgIGNvbnN0IGF2YWlsYWJsZUhlaWdodFB4ID0gdG9wU291cmNlIC0gU0xBU0hfRFJPUERPV05fR0FQX1BYIC0gU0xBU0hfRFJPUERPV05fVklFV1BPUlRfUEFEX1BYXG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gTWF0aC5taW4oU0xBU0hfRFJPUERPV05fTUFYX0hFSUdIVF9QWCwgTWF0aC5tYXgoMCwgYXZhaWxhYmxlSGVpZ2h0UHgpKVxuXG4gICAgc2V0U2xhc2hEcm9wZG93blBvcyh7XG4gICAgICBsZWZ0LFxuICAgICAgYm90dG9tOiB2aWV3cG9ydEggLSB0b3BTb3VyY2UgKyBTTEFTSF9EUk9QRE9XTl9HQVBfUFgsXG4gICAgICBtYXhIZWlnaHQsXG4gICAgfSlcbiAgfSwgW3dyYXBwZXJSZWYsIGdldENhcmV0UmVjdF0pXG5cbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXNob3dTbGFzaERyb3Bkb3duKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICBwb3NpdGlvblNsYXNoRHJvcGRvd24oKVxuXG4gICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHBvc2l0aW9uU2xhc2hEcm9wZG93bigpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGhhbmRsZXIsIHRydWUpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGhhbmRsZXIpXG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGhhbmRsZXIsIHRydWUpXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaGFuZGxlcilcbiAgICB9XG4gIH0sIFtzaG93U2xhc2hEcm9wZG93biwgc2xhc2hRdWVyeSwgcG9zaXRpb25TbGFzaERyb3Bkb3duXSlcblxuICAvKiogRWwgcG9wb3ZlciBkZSBza2lsbHMgc2UgYW5jbGEgYWwgYCNgIHF1ZSBsbyBhYnJpw7M7IHNpIG5vIGhheSBjYXJldCwgYWwgYm9yZGUgZGVsIGlucHV0LiAqL1xuICBjb25zdCBwb3NpdGlvblNraWxsc0Ryb3Bkb3duID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IHdyYXBwZXJSZWN0ID0gd3JhcHBlclJlZi5jdXJyZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgIGNvbnN0IGNhcmV0ID0gZ2V0Q2FyZXRSZWN0KCcjJylcbiAgICBjb25zdCB0b3BTb3VyY2UgPSBjYXJldD8udG9wID8/ICh3cmFwcGVyUmVjdCAmJiB3cmFwcGVyUmVjdC53aWR0aCA+IDAgPyB3cmFwcGVyUmVjdC50b3AgOiBudWxsKVxuICAgIGNvbnN0IGxlZnRTb3VyY2UgPSBjYXJldD8ubGVmdCA/PyAod3JhcHBlclJlY3QgJiYgd3JhcHBlclJlY3Qud2lkdGggPiAwID8gd3JhcHBlclJlY3QubGVmdCA6IG51bGwpXG4gICAgaWYgKHRvcFNvdXJjZSA9PSBudWxsIHx8IGxlZnRTb3VyY2UgPT0gbnVsbCkgcmV0dXJuXG5cbiAgICBjb25zdCB2aWV3cG9ydEggPSB3aW5kb3cuaW5uZXJIZWlnaHRcbiAgICBjb25zdCB2aWV3cG9ydFcgPSB3aW5kb3cuaW5uZXJXaWR0aFxuICAgIGNvbnN0IGxlZnQgPSBNYXRoLm1heChcbiAgICAgIFNMQVNIX0RST1BET1dOX1ZJRVdQT1JUX1BBRF9QWCxcbiAgICAgIE1hdGgubWluKHZpZXdwb3J0VyAtIFNLSUxMU19EUk9QRE9XTl9XSURUSF9QWCAtIFNMQVNIX0RST1BET1dOX1ZJRVdQT1JUX1BBRF9QWCwgbGVmdFNvdXJjZSlcbiAgICApXG4gICAgY29uc3QgYXZhaWxhYmxlSGVpZ2h0UHggPSB0b3BTb3VyY2UgLSBTTEFTSF9EUk9QRE9XTl9HQVBfUFggLSBTTEFTSF9EUk9QRE9XTl9WSUVXUE9SVF9QQURfUFhcblxuICAgIHNldFNraWxsc0Ryb3Bkb3duUG9zKHtcbiAgICAgIGxlZnQsXG4gICAgICBib3R0b206IHZpZXdwb3J0SCAtIHRvcFNvdXJjZSArIFNMQVNIX0RST1BET1dOX0dBUF9QWCxcbiAgICAgIG1heEhlaWdodDogTWF0aC5taW4oU0xBU0hfRFJPUERPV05fTUFYX0hFSUdIVF9QWCwgTWF0aC5tYXgoMCwgYXZhaWxhYmxlSGVpZ2h0UHgpKSxcbiAgICB9KVxuICB9LCBbd3JhcHBlclJlZiwgZ2V0Q2FyZXRSZWN0XSlcblxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghc2hvd1NraWxsc0Ryb3Bkb3duKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICBwb3NpdGlvblNraWxsc0Ryb3Bkb3duKClcblxuICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiBwb3NpdGlvblNraWxsc0Ryb3Bkb3duKClcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaGFuZGxlciwgdHJ1ZSlcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaGFuZGxlcilcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaGFuZGxlciwgdHJ1ZSlcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBoYW5kbGVyKVxuICAgIH1cbiAgfSwgW3Nob3dTa2lsbHNEcm9wZG93biwgc2tpbGxzUXVlcnksIHBvc2l0aW9uU2tpbGxzRHJvcGRvd25dKVxuXG4gIC8qKiBUcmFzIGVsZWdpciBvIHF1aXRhciBiw7pzcXVlZGEgd2ViL3Byb2Z1bmRhOiB2b2x2ZXIgYWwgdGV4dGFyZWEgKFBvcG92ZXIvbWVudSBwdWVkZSByb2JhciBmb2NvKS4gKi9cbiAgY29uc3Qgc2NoZWR1bGVJbnB1dEZvY3VzQWZ0ZXJUb29sQWN0aW9uID0gKCkgPT4ge1xuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGVkaXRvclJlZi5jdXJyZW50Py5mb2N1cygpXG4gICAgICB9LCAwKVxuICAgIH0pXG4gIH1cblxuICBjb25zdCBjbG9zZVBsdXNNZW51ID0gKCkgPT4ge1xuICAgIHNldFBsdXNNZW51QW5jaG9yKG51bGwpXG4gICAgc2NoZWR1bGVJbnB1dEZvY3VzQWZ0ZXJUb29sQWN0aW9uKClcbiAgfVxuXG4gIGNvbnN0IGNhbmNlbFBlbmRpbmdUb29sQ2hpcEV4aXQgPSAoKSA9PiB7XG4gICAgaWYgKHRvb2xDaGlwRXhpdFRpbWVyUmVmLmN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0b29sQ2hpcEV4aXRUaW1lclJlZi5jdXJyZW50KVxuICAgICAgdG9vbENoaXBFeGl0VGltZXJSZWYuY3VycmVudCA9IG51bGxcbiAgICB9XG4gICAgc2V0VG9vbENoaXBFeGl0aW5nKGZhbHNlKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlUGx1c0J1dHRvbk1vdXNlRG93biA9IChlOiBNb3VzZUV2ZW50PEhUTUxCdXR0b25FbGVtZW50PikgPT4ge1xuICAgIC8vIEV2aXRhIHF1ZSBlbCBib3TDs24gcm9iZSBlbCBmb2NvIGRlbCBpbnB1dCBhbCBhYnJpciBlbCBtZW7Dui5cbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVBsdXNCdXR0b25DbGljayA9IChlOiBNb3VzZUV2ZW50PEhUTUxCdXR0b25FbGVtZW50PikgPT4ge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICBpZiAocGx1c01lbnVBbmNob3IpIHtcbiAgICAgIGNsb3NlUGx1c01lbnUoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHNldFBsdXNNZW51QW5jaG9yKGUuY3VycmVudFRhcmdldClcbiAgICBldmVudEFtcGxpdHVkZShFVkVOVFMuYWlDaGF0UGx1c09wZW4sIHsgYWdlbnRfdHlwZTogYW5hbHl0aWNzQWdlbnRUeXBlLCAuLi5hbmFseXRpY3NDbG9uZUVudGl0eVBheWxvYWQgfSlcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZU1lbnRpb25CdXR0b25DbGljayA9IChlOiBNb3VzZUV2ZW50PEhUTUxCdXR0b25FbGVtZW50PikgPT4ge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVyblxuICAgIGNsb3NlUGx1c01lbnUoKVxuICAgIGVkaXRvclJlZi5jdXJyZW50Py5pbnNlcnRNZW50aW9uVHJpZ2dlcigpXG4gIH1cblxuICBjb25zdCBoYW5kbGVQbHVzTWVudUF0dGFjaCA9ICgpID0+IHtcbiAgICBjbG9zZVBsdXNNZW51KClcbiAgICBldmVudEFtcGxpdHVkZShFVkVOVFMuYWlDaGF0VG9vbHMsIHtcbiAgICAgIGFnZW50X3R5cGU6IGFuYWx5dGljc0FnZW50VHlwZSxcbiAgICAgIG9wdGlvbjogJ2ZpbGVzJyxcbiAgICAgIC4uLmFuYWx5dGljc0Nsb25lRW50aXR5UGF5bG9hZCxcbiAgICB9KVxuICAgIGlmIChhdHRhY2htZW50cy5sZW5ndGggPj0gTUFYX0NIQVRfSU5QVVRfQVRUQUNITUVOVFMpIHJldHVyblxuICAgIGZpbGVJbnB1dFJlZi5jdXJyZW50Py5jbGljaygpXG4gIH1cblxuICBjb25zdCBiZWdpblRvb2xDaGlwRXhpdCA9ICgpID0+IHtcbiAgICBpZiAodG9vbENoaXBFeGl0VGltZXJSZWYuY3VycmVudCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHdhc1dlYiA9IGlzV2ViU2VhcmNoQWN0aXZlXG4gICAgY29uc3Qgd2FzRGVlcCA9IGlzRGVlcFNlYXJjaEFjdGl2ZVxuICAgIGlmICghd2FzV2ViICYmICF3YXNEZWVwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgc2V0VG9vbENoaXBFeGl0aW5nKHRydWUpXG4gICAgdG9vbENoaXBFeGl0VGltZXJSZWYuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdG9vbENoaXBFeGl0VGltZXJSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIGNvbnN0IHsgd2ViLCBkZWVwIH0gPSBzZWFyY2hNb2RlQWN0aXZlUmVmLmN1cnJlbnRcbiAgICAgIGlmICh3YXNXZWIgJiYgd2ViKSB7XG4gICAgICAgIHRvZ2dsZVdlYlNlYXJjaCgpXG4gICAgICB9IGVsc2UgaWYgKHdhc0RlZXAgJiYgZGVlcCkge1xuICAgICAgICB0b2dnbGVEZWVwU2VhcmNoKClcbiAgICAgIH1cbiAgICAgIHNldFRvb2xDaGlwRXhpdGluZyhmYWxzZSlcbiAgICAgIHNjaGVkdWxlSW5wdXRGb2N1c0FmdGVyVG9vbEFjdGlvbigpXG4gICAgfSwgVE9PTF9DSElQX0VYSVRfTVMpXG4gIH1cblxuICBjb25zdCBoYW5kbGVQbHVzTWVudVdlYlNlYXJjaCA9ICgpID0+IHtcbiAgICBjbG9zZVBsdXNNZW51KClcbiAgICBpZiAoaXNXZWJTZWFyY2hBY3RpdmUpIHtcbiAgICAgIGJlZ2luVG9vbENoaXBFeGl0KClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjYW5jZWxQZW5kaW5nVG9vbENoaXBFeGl0KClcbiAgICBpZiAoaXNEZWVwU2VhcmNoQWN0aXZlKSB7XG4gICAgICB0b2dnbGVEZWVwU2VhcmNoKClcbiAgICB9XG4gICAgdG9nZ2xlV2ViU2VhcmNoKClcbiAgICBldmVudEFtcGxpdHVkZShFVkVOVFMuYWlDaGF0VG9vbHMsIHtcbiAgICAgIGFnZW50X3R5cGU6IGFuYWx5dGljc0FnZW50VHlwZSxcbiAgICAgIG9wdGlvbjogJ3NlYXJjaCcsXG4gICAgICAuLi5hbmFseXRpY3NDbG9uZUVudGl0eVBheWxvYWQsXG4gICAgfSlcbiAgICBzY2hlZHVsZUlucHV0Rm9jdXNBZnRlclRvb2xBY3Rpb24oKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlUGx1c01lbnVEZWVwU2VhcmNoID0gKCkgPT4ge1xuICAgIGNsb3NlUGx1c01lbnUoKVxuICAgIGlmIChpc0RlZXBTZWFyY2hBY3RpdmUpIHtcbiAgICAgIGJlZ2luVG9vbENoaXBFeGl0KClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjYW5jZWxQZW5kaW5nVG9vbENoaXBFeGl0KClcbiAgICBpZiAoaXNXZWJTZWFyY2hBY3RpdmUpIHtcbiAgICAgIHRvZ2dsZVdlYlNlYXJjaCgpXG4gICAgfVxuICAgIHRvZ2dsZURlZXBTZWFyY2goKVxuICAgIGV2ZW50QW1wbGl0dWRlKEVWRU5UUy5haUNoYXRUb29scywge1xuICAgICAgYWdlbnRfdHlwZTogYW5hbHl0aWNzQWdlbnRUeXBlLFxuICAgICAgb3B0aW9uOiAnZGVlcF9zZWFyY2gnLFxuICAgICAgLi4uYW5hbHl0aWNzQ2xvbmVFbnRpdHlQYXlsb2FkLFxuICAgIH0pXG4gICAgc2NoZWR1bGVJbnB1dEZvY3VzQWZ0ZXJUb29sQWN0aW9uKClcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVBsdXNNZW51UXVpY2tBY3Rpb25zID0gKCkgPT4ge1xuICAgIHNldFBsdXNNZW51QW5jaG9yKG51bGwpXG4gICAgaWYgKGRpc2FibGVkKSByZXR1cm5cbiAgICBlZGl0b3JSZWYuY3VycmVudD8uaW5zZXJ0U2xhc2hUcmlnZ2VyKClcbiAgfVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmZvY3VzKClcbiAgICB9XG4gIH0sIFtkaXNhYmxlZF0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpbml0aWFsRHJhZnRBcHBsaWVkUmVmLmN1cnJlbnQgPSBmYWxzZVxuICB9LCBbaW5pdGlhbERyYWZ0XSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGRyYWZ0ID0gaW5pdGlhbERyYWZ0Py50cmltKClcbiAgICBpZiAoIWRyYWZ0IHx8IGluaXRpYWxEcmFmdEFwcGxpZWRSZWYuY3VycmVudCB8fCBkaXNhYmxlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGluaXRpYWxEcmFmdEFwcGxpZWRSZWYuY3VycmVudCA9IHRydWVcbiAgICBpZiAoZGVlcExpbmtTZW5kUGVuZGluZ1JlZikge1xuICAgICAgZGVlcExpbmtTZW5kUGVuZGluZ1JlZi5jdXJyZW50ID0gdHJ1ZVxuICAgIH1cbiAgICBlZGl0b3JSZWYuY3VycmVudD8uc2V0UGxhaW5UZXh0KGRyYWZ0KVxuICAgIHNldEhhc1R5cGluZ1ByZXNlbmNlKHRydWUpXG4gICAgaWYgKCFkaXNhYmxlZCkge1xuICAgICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmZvY3VzKClcbiAgICB9XG4gIH0sIFtpbml0aWFsRHJhZnQsIGRpc2FibGVkLCBkZWVwTGlua1NlbmRQZW5kaW5nUmVmXSlcblxuICBjb25zdCBzZW5kRGlzYWJsZWQgPSB1c2VNZW1vKFxuICAgICgpID0+ICFoYXNUeXBpbmdQcmVzZW5jZSAmJiBhdHRhY2htZW50cy5sZW5ndGggPT09IDAsXG4gICAgW2hhc1R5cGluZ1ByZXNlbmNlLCBhdHRhY2htZW50cy5sZW5ndGhdXG4gIClcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHNlYXJjaE1vZGVBY3RpdmVSZWYuY3VycmVudCA9IHsgd2ViOiBpc1dlYlNlYXJjaEFjdGl2ZSwgZGVlcDogaXNEZWVwU2VhcmNoQWN0aXZlIH1cbiAgfSwgW2lzV2ViU2VhcmNoQWN0aXZlLCBpc0RlZXBTZWFyY2hBY3RpdmVdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmICh0b29sQ2hpcEV4aXRUaW1lclJlZi5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0b29sQ2hpcEV4aXRUaW1lclJlZi5jdXJyZW50KVxuICAgICAgfVxuICAgIH1cbiAgfSwgW10pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWlzV2ViU2VhcmNoQWN0aXZlICYmICFpc0RlZXBTZWFyY2hBY3RpdmUpIHtcbiAgICAgIHNldEFjdGl2ZVRvb2xDaGlwSG92ZXJlZChmYWxzZSlcbiAgICB9XG4gIH0sIFtpc1dlYlNlYXJjaEFjdGl2ZSwgaXNEZWVwU2VhcmNoQWN0aXZlXSlcblxuICAvLyBBdXRvLWZvY3VzIGN1YW5kbyBjYW1iaWEgZWwgYWdlbnRlIG8gbGEgY29udmVyc2FjacOzbiwgbyBhbCBtb250YXIgZWwgY29tcG9uZW50ZVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGFnZW50Q2hhbmdlZCA9IHByZXZpb3VzQWdlbnRJZFJlZi5jdXJyZW50ICE9PSBhZ2VudD8uaWRcbiAgICBjb25zdCBwcmV2aW91c0NoYXRJZCA9IHByZXZpb3VzQ2hhdElkUmVmLmN1cnJlbnRcbiAgICBjb25zdCBjdXJyZW50Q2hhdElkID0gY2hhdElkXG4gICAgY29uc3QgY2hhdENoYW5nZWQgPSBwcmV2aW91c0NoYXRJZCAhPT0gY3VycmVudENoYXRJZFxuICAgIGNvbnN0IGNoYW5nZWRGcm9tTmV3Q2hhdFRvT2xkQ2hhdCA9XG4gICAgICAocHJldmlvdXNDaGF0SWQgPT09IHVuZGVmaW5lZCB8fCBwcmV2aW91c0NoYXRJZCA9PT0gbnVsbCkgJiYgY3VycmVudENoYXRJZCAhPT0gdW5kZWZpbmVkICYmIGN1cnJlbnRDaGF0SWQgIT09IG51bGxcbiAgICBjb25zdCBuZXdDaGF0U3RhcnRlZCA9IHByZXZpb3VzTmV3Q2hhdEtleVJlZi5jdXJyZW50ICE9PSBuZXdDaGF0S2V5XG4gICAgY29uc3QgaXNJbml0aWFsTW91bnQgPSBwcmV2aW91c0FnZW50SWRSZWYuY3VycmVudCA9PT0gdW5kZWZpbmVkICYmIHByZXZpb3VzQ2hhdElkUmVmLmN1cnJlbnQgPT09IHVuZGVmaW5lZFxuXG4gICAgaWYgKChhZ2VudENoYW5nZWQgfHwgY2hhdENoYW5nZWQgfHwgY2hhbmdlZEZyb21OZXdDaGF0VG9PbGRDaGF0IHx8IG5ld0NoYXRTdGFydGVkIHx8IGlzSW5pdGlhbE1vdW50KSAmJiAhZGlzYWJsZWQpIHtcbiAgICAgIGNvbnN0IGRlbGF5ID0gaXNJbml0aWFsTW91bnQgfHwgY2hhbmdlZEZyb21OZXdDaGF0VG9PbGRDaGF0ID8gMjAwIDogMTAwXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKCFkaXNhYmxlZCkgZWRpdG9yUmVmLmN1cnJlbnQ/LmZvY3VzKClcbiAgICAgIH0sIGRlbGF5KVxuICAgIH1cblxuICAgIHByZXZpb3VzQWdlbnRJZFJlZi5jdXJyZW50ID0gYWdlbnQ/LmlkXG4gICAgcHJldmlvdXNDaGF0SWRSZWYuY3VycmVudCA9IGNoYXRJZFxuICAgIHByZXZpb3VzTmV3Q2hhdEtleVJlZi5jdXJyZW50ID0gbmV3Q2hhdEtleVxuICB9LCBbYWdlbnQ/LmlkLCBjaGF0SWQsIG5ld0NoYXRLZXksIGRpc2FibGVkXSlcblxuICAvLyBBdXRvLWZvY3VzIGN1YW5kbyBjYW1iaWEgbGEgZGlzcG9zaWNpw7NuIGRlbCBtb2RhbCAoc2lkZWJhciAvIGZ1bGxzY3JlZW4gLyBmbG9hdGluZylcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWxheW91dE1vZGUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBjb25zdCBwcmV2aW91c0xheW91dE1vZGUgPSBwcmV2aW91c0xheW91dE1vZGVSZWYuY3VycmVudFxuICAgIHByZXZpb3VzTGF5b3V0TW9kZVJlZi5jdXJyZW50ID0gbGF5b3V0TW9kZVxuXG4gICAgaWYgKHByZXZpb3VzTGF5b3V0TW9kZSA9PT0gdW5kZWZpbmVkIHx8IHByZXZpb3VzTGF5b3V0TW9kZSA9PT0gbGF5b3V0TW9kZSB8fCBkaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGNvbnN0IHRpbWVvdXRJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICghZGlzYWJsZWQpIHtcbiAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmZvY3VzKClcbiAgICAgIH1cbiAgICB9LCAyMDApXG5cbiAgICByZXR1cm4gKCkgPT4gd2luZG93LmNsZWFyVGltZW91dCh0aW1lb3V0SWQpXG4gIH0sIFtsYXlvdXRNb2RlLCBkaXNhYmxlZF0pXG5cbiAgLy8gQXBwY3Vlczogbm90aWZ5IHRoYXQgdGhlIGlucHV0IGlzIHZpc2libGUgZm9yIHNwZWNpYWxpc3QgYWdlbnRzIChjbG9uZSArIHByb2plY3QvY2xpZW50KVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGlzU3BlY2lhbGlzdEFnZW50ID0gYWdlbnQ/LnR5cGUgPT09ICdjbG9uZScgJiYgKGFnZW50Py5lbnRpdHkgPT09ICdwcm9qZWN0JyB8fCBhZ2VudD8uZW50aXR5ID09PSAnY2xpZW50JylcbiAgICBpZiAoIXdyYXBwZXJSZWYuY3VycmVudCB8fCAhaXNTcGVjaWFsaXN0QWdlbnQpIHJldHVybiB1bmRlZmluZWRcblxuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKFxuICAgICAgKFtlbnRyeV0pID0+IHtcbiAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgdHJhY2tBcHBjdWVzRXZlbnQoQVBQQ1VFU19FVkVOVFMubWFpYUNvbnRleHRNZW50aW9uSW5pdClcbiAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHsgdGhyZXNob2xkOiAwLjEgfVxuICAgIClcblxuICAgIG9ic2VydmVyLm9ic2VydmUod3JhcHBlclJlZi5jdXJyZW50KVxuICAgIHJldHVybiAoKSA9PiBvYnNlcnZlci5kaXNjb25uZWN0KClcbiAgfSwgW2FnZW50Py5pZCwgYWdlbnQ/LnR5cGUsIGFnZW50Py5lbnRpdHldKVxuXG4gIC8vIENsZWFyIGlucHV0IHdoZW4gc2Vzc2lvbiBjaGFuZ2VzICh1c2VyIHN3aXRjaGVzIHRvIGEgZGlmZmVyZW50IGNoYXQpXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlU2Vzc2lvbkNoYW5nZSA9ICgpID0+IHtcbiAgICAgIGlmIChkZWVwTGlua1NlbmRQZW5kaW5nUmVmKSB7XG4gICAgICAgIGRlZXBMaW5rU2VuZFBlbmRpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICB9XG4gICAgICBlZGl0b3JSZWYuY3VycmVudD8uY2xlYXIoKVxuICAgICAgc2V0SGFzVHlwaW5nUHJlc2VuY2UoZmFsc2UpXG4gICAgICBzZXRTaG93U2xhc2hEcm9wZG93bihmYWxzZSlcbiAgICAgIHNldFNsYXNoUXVlcnkoJycpXG4gICAgICByZXNldE1lbnRpb25PcGVuVHJhY2tpbmcoKVxuICAgIH1cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYXQtc2Vzc2lvbi1jaGFuZ2VkJywgaGFuZGxlU2Vzc2lvbkNoYW5nZSlcbiAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhdC1zZXNzaW9uLWNoYW5nZWQnLCBoYW5kbGVTZXNzaW9uQ2hhbmdlKVxuICB9LCBbcmVzZXRNZW50aW9uT3BlblRyYWNraW5nLCBkZWVwTGlua1NlbmRQZW5kaW5nUmVmXSlcblxuICAvLyBNYW50ZW5lciBmb2NvIGFsIHNlbGVjY2lvbmFyIHVuIGNvbnRleHRvIHJlY2llbnRlIChlbCBjbGljayBlbiBlbCBwaWxsIGxvIHJvYmEgYWwgaW5wdXQpLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZVJlZm9jdXMgPSAoKSA9PiB7XG4gICAgICBpZiAoZGlzYWJsZWQpIHJldHVyblxuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmZvY3VzKClcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbWFpYS1pbnB1dC1yZWZvY3VzJywgaGFuZGxlUmVmb2N1cylcbiAgICByZXR1cm4gKCkgPT4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWFpYS1pbnB1dC1yZWZvY3VzJywgaGFuZGxlUmVmb2N1cylcbiAgfSwgW2Rpc2FibGVkXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZUluc2VydFNraWxsTWVudGlvbiA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHsgc2tpbGwgfSA9IChldmVudCBhcyBDdXN0b21FdmVudDx7IHNraWxsOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9IH0+KS5kZXRhaWwgfHwge31cbiAgICAgIGlmICghc2tpbGwgfHwgZGlzYWJsZWQpIHJldHVyblxuXG4gICAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHNraWxsLm5hbWUucmVwbGFjZSgvXihAXFwvfCMpLywgJycpXG4gICAgICBlZGl0b3JSZWYuY3VycmVudD8uY2xlYXIoKVxuICAgICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmFwcGVuZE1lbnRpb25BdEVuZCh7XG4gICAgICAgIGlkOiBza2lsbC5pZCxcbiAgICAgICAgdHlwZTogJ3NraWxsJyxcbiAgICAgICAgbGFiZWw6IGAjJHtub3JtYWxpemVkTmFtZX1gLFxuICAgICAgfSlcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIGVkaXRvclJlZi5jdXJyZW50Py5mb2N1cygpXG4gICAgICB9KVxuICAgIH1cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21haWEtaW5zZXJ0LXNraWxsLW1lbnRpb24nLCBoYW5kbGVJbnNlcnRTa2lsbE1lbnRpb24pXG4gICAgcmV0dXJuICgpID0+IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21haWEtaW5zZXJ0LXNraWxsLW1lbnRpb24nLCBoYW5kbGVJbnNlcnRTa2lsbE1lbnRpb24pXG4gIH0sIFtkaXNhYmxlZF0pXG5cbiAgY29uc3QgaGFuZGxlU2VuZE1lc3NhZ2UgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSBlZGl0b3JSZWYuY3VycmVudD8uc2VyaWFsaXplKClcbiAgICBjb25zdCB0ZXh0ID0gc3RhdGU/LnRleHQgPz8gJydcbiAgICBpZiAoIXRleHQudHJpbSgpICYmICFhdHRhY2htZW50cy5sZW5ndGgpIHJldHVyblxuICAgIGNvbnN0IG1lbnRpb25zID0gc3RhdGU/Lm1lbnRpb25zID8/IFtdXG4gICAgb25TZW5kTWVzc2FnZSh0ZXh0LCBhdHRhY2htZW50cywgbWVudGlvbnMpXG4gICAgZWRpdG9yUmVmLmN1cnJlbnQ/LmNsZWFyKClcbiAgICBzZXRIYXNUeXBpbmdQcmVzZW5jZShmYWxzZSlcbiAgICBzZXRTaG93U2xhc2hEcm9wZG93bihmYWxzZSlcbiAgICBzZXRTbGFzaFF1ZXJ5KCcnKVxuICAgIHNldFNob3dTa2lsbHNEcm9wZG93bihmYWxzZSlcbiAgICBzZXRTa2lsbHNRdWVyeSgnJylcbiAgICBza2lsbHNNZW51V2FzT3BlblJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICByZXNldE1lbnRpb25PcGVuVHJhY2tpbmcoKVxuICB9LCBbYXR0YWNobWVudHMsIG9uU2VuZE1lc3NhZ2UsIHJlc2V0TWVudGlvbk9wZW5UcmFja2luZ10pXG5cbiAgY29uc3QgaGFuZGxlU2VsZWN0U2xhc2hDb21tYW5kID0gdXNlQ2FsbGJhY2soXG4gICAgKGNvbW1hbmQ6IEFjdGlvbikgPT4ge1xuICAgICAgZXZlbnRBbXBsaXR1ZGUoRVZFTlRTLmFpQ2hhdFF1aWNrQWN0aW9uU2VsZWN0LCB7XG4gICAgICAgIHR5cGVfcXVpY2tfYWN0aW9uOiByZXNvbHZlUXVpY2tBY3Rpb25UeXBlKGNvbW1hbmQpLFxuICAgICAgICBvcmlnaW5fcXVpY2tfYWN0aW9uOiAnc2xhc2hfbWVudScsXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBzdGF0ZSA9IGVkaXRvclJlZi5jdXJyZW50Py5zZXJpYWxpemUoKVxuICAgICAgY29uc3QgdGV4dCA9IHN0YXRlPy50ZXh0ID8/ICcnXG4gICAgICBjb25zdCB0cmlnZ2VyUGFydCA9IGAvJHtzbGFzaFF1ZXJ5fWBcbiAgICAgIGNvbnN0IGJlZm9yZVRyaWdnZXIgPSB0ZXh0LmVuZHNXaXRoKHRyaWdnZXJQYXJ0KSA/IHRleHQuc2xpY2UoMCwgLXRyaWdnZXJQYXJ0Lmxlbmd0aCkgOiB0ZXh0XG4gICAgICBjb25zdCBpc0VtcHR5QmVmb3JlVHJpZ2dlciA9IGJlZm9yZVRyaWdnZXIudHJpbSgpID09PSAnJ1xuXG4gICAgICBpZiAoaXNFbXB0eUJlZm9yZVRyaWdnZXIpIHtcbiAgICAgICAgb25TZW5kTWVzc2FnZShjb21tYW5kLnRpdGxlLCBhdHRhY2htZW50cywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBjb21tYW5kLmlkKVxuICAgICAgICBlZGl0b3JSZWYuY3VycmVudD8uY2xlYXIoKVxuICAgICAgICBzZXRIYXNUeXBpbmdQcmVzZW5jZShmYWxzZSlcbiAgICAgICAgc2V0U2hvd1NsYXNoRHJvcGRvd24oZmFsc2UpXG4gICAgICAgIHNldFNsYXNoUXVlcnkoJycpXG4gICAgICAgIHNsYXNoTWVudVdhc09wZW5SZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICAgIHJlc2V0TWVudGlvbk9wZW5UcmFja2luZygpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBlZGl0b3JSZWYuY3VycmVudD8uaW5zZXJ0U2xhc2hDb21tYW5kKHsgaWQ6IGNvbW1hbmQuaWQsIGxhYmVsOiBjb21tYW5kLnRpdGxlIH0pXG4gICAgICBzZXRTaG93U2xhc2hEcm9wZG93bihmYWxzZSlcbiAgICAgIHNldFNsYXNoUXVlcnkoJycpXG4gICAgICBzbGFzaE1lbnVXYXNPcGVuUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgIH0sXG4gICAgW2F0dGFjaG1lbnRzLCBvblNlbmRNZXNzYWdlLCByZXNldE1lbnRpb25PcGVuVHJhY2tpbmcsIHNsYXNoUXVlcnksIGV2ZW50QW1wbGl0dWRlXVxuICApXG5cbiAgY29uc3QgaGFuZGxlQ2xvc2VTbGFzaERyb3Bkb3duID0gKCkgPT4ge1xuICAgIHNldFNob3dTbGFzaERyb3Bkb3duKGZhbHNlKVxuICAgIHNsYXNoTWVudVdhc09wZW5SZWYuY3VycmVudCA9IGZhbHNlXG4gIH1cblxuICBjb25zdCBoYW5kbGVDbG9zZVNraWxsc0Ryb3Bkb3duID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldFNob3dTa2lsbHNEcm9wZG93bihmYWxzZSlcbiAgICBzZXRTa2lsbHNRdWVyeSgnJylcbiAgICBza2lsbHNNZW51V2FzT3BlblJlZi5jdXJyZW50ID0gZmFsc2VcbiAgfSwgW10pXG5cbiAgLyoqIEFicmUgZWwgbGlzdGFkbyBkZXNkZSBlbCBib3TDs246IGluc2VydGEgYCNgIGVuIGVsIGVkaXRvciBwYXJhIHF1ZSBlbCB0cmlnZ2VyIHF1ZWRlIGFjdGl2by4gKi9cbiAgY29uc3QgaGFuZGxlU2tpbGxzQnV0dG9uQ2xpY2sgPSAoZTogTW91c2VFdmVudDxIVE1MQnV0dG9uRWxlbWVudD4pID0+IHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgaWYgKGRpc2FibGVkKSByZXR1cm5cbiAgICBpZiAoc2hvd1NraWxsc0Ryb3Bkb3duKSB7XG4gICAgICBoYW5kbGVDbG9zZVNraWxsc0Ryb3Bkb3duKClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjbG9zZVBsdXNNZW51KClcbiAgICBlZGl0b3JSZWYuY3VycmVudD8uaW5zZXJ0U2tpbGxUcmlnZ2VyKClcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdFNraWxsID0gdXNlQ2FsbGJhY2soKHNraWxsOiBTa2lsbCkgPT4ge1xuICAgIGVkaXRvclJlZi5jdXJyZW50Py5pbnNlcnRTa2lsbE1lbnRpb24oeyBpZDogc2tpbGwuaWQsIHR5cGU6ICdza2lsbCcsIGxhYmVsOiBgIyR7c2tpbGwubmFtZX1gIH0pXG4gICAgc2V0U2hvd1NraWxsc0Ryb3Bkb3duKGZhbHNlKVxuICAgIHNldFNraWxsc1F1ZXJ5KCcnKVxuICAgIHNraWxsc01lbnVXYXNPcGVuUmVmLmN1cnJlbnQgPSBmYWxzZVxuICB9LCBbXSlcblxuICBjb25zdCBoYW5kbGVDcmVhdGVTa2lsbCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRTaG93U2tpbGxzRHJvcGRvd24oZmFsc2UpXG4gICAgc2V0U2tpbGxzUXVlcnkoJycpXG4gICAgc2tpbGxzTWVudVdhc09wZW5SZWYuY3VycmVudCA9IGZhbHNlXG4gICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyBDdXN0b21FdmVudCgnYWJtLXNraWxsLW1vZGFsLXNldC12YWx1ZXMnLCB7XG4gICAgICAgIGRldGFpbDogeyBza2lsbFZhbHVlczogeyB2YWx1ZXM6IHsgaXNFZGl0aW5nOiBmYWxzZSwgaW50ZW50OiAnd3JpdGUnIH0sIGlzT3BlbjogdHJ1ZSB9IH0sXG4gICAgICB9KVxuICAgIClcbiAgfSwgW10pXG5cbiAgY29uc3QgaGFuZGxlRWRpdG9ySW5wdXQgPSB1c2VDYWxsYmFjayhcbiAgICAoe1xuICAgICAgdGV4dCxcbiAgICAgIHRyaWdnZXIsXG4gICAgICBzbGFzaFRyaWdnZXIsXG4gICAgICBoYXNoVHJpZ2dlcixcbiAgICB9OiB7XG4gICAgICB0ZXh0OiBzdHJpbmdcbiAgICAgIG1lbnRpb25zOiBDb250ZXh0TWVudGlvbltdXG4gICAgICB0cmlnZ2VyOiB7IGFjdGl2ZTogYm9vbGVhbjsgcXVlcnk6IHN0cmluZzsgYXRSdW5MZW5ndGg6IG51bWJlciB9XG4gICAgICBzbGFzaFRyaWdnZXI/OiB7IGFjdGl2ZTogYm9vbGVhbjsgcXVlcnk6IHN0cmluZyB9XG4gICAgICBoYXNoVHJpZ2dlcj86IHsgYWN0aXZlOiBib29sZWFuOyBxdWVyeTogc3RyaW5nIH1cbiAgICB9KSA9PiB7XG4gICAgICBzZXRIYXNUeXBpbmdQcmVzZW5jZSh0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgb25DaGFuZ2U/LigpXG4gICAgICBoYW5kbGVUcmlnZ2VyKHRyaWdnZXIpXG5cbiAgICAgIGlmIChzbGFzaFRyaWdnZXI/LmFjdGl2ZSAmJiBzbGFzaENvbW1hbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKCFzbGFzaE1lbnVXYXNPcGVuUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBldmVudEFtcGxpdHVkZShFVkVOVFMuYWlDaGF0UXVpY2tBY3Rpb25PcGVuKVxuICAgICAgICAgIHNsYXNoTWVudVdhc09wZW5SZWYuY3VycmVudCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgICBzZXRTaG93U2xhc2hEcm9wZG93bih0cnVlKVxuICAgICAgICBzZXRTbGFzaFF1ZXJ5KHNsYXNoVHJpZ2dlci5xdWVyeSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNsYXNoTWVudVdhc09wZW5SZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICAgIHNldFNob3dTbGFzaERyb3Bkb3duKGZhbHNlKVxuICAgICAgICBzZXRTbGFzaFF1ZXJ5KCcnKVxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzaFRyaWdnZXI/LmFjdGl2ZSAmJiBzaG93U2tpbGxzQnV0dG9uKSB7XG4gICAgICAgIC8vIEZldGNoIG9uLW9wZW46IHVuYSBzb2xhIGxsYW1hZGEgcG9yIGFwZXJ0dXJhIGRlbCBsaXN0YWRvLlxuICAgICAgICBpZiAoIXNraWxsc01lbnVXYXNPcGVuUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICBza2lsbHNNZW51V2FzT3BlblJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgICAgIHZvaWQgZmV0Y2hTa2lsbHMoKVxuICAgICAgICB9XG4gICAgICAgIHNldFNob3dTa2lsbHNEcm9wZG93bih0cnVlKVxuICAgICAgICBzZXRTa2lsbHNRdWVyeShoYXNoVHJpZ2dlci5xdWVyeSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNraWxsc01lbnVXYXNPcGVuUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICBzZXRTaG93U2tpbGxzRHJvcGRvd24oZmFsc2UpXG4gICAgICAgIHNldFNraWxsc1F1ZXJ5KCcnKVxuICAgICAgfVxuICAgIH0sXG4gICAgW29uQ2hhbmdlLCBoYW5kbGVUcmlnZ2VyLCBzbGFzaENvbW1hbmRzLCBldmVudEFtcGxpdHVkZSwgc2hvd1NraWxsc0J1dHRvbiwgZmV0Y2hTa2lsbHNdXG4gIClcblxuICBjb25zdCBoYW5kbGVLZXlEb3duID0gdXNlQ2FsbGJhY2soXG4gICAgKGU6IEtleWJvYXJkRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgICBpZiAoaGFuZGxlUG9wb3ZlcktleURvd24oZSkpIHJldHVyblxuICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInICYmICFlLnNoaWZ0S2V5ICYmICFwb3BvdmVyT3Blbikge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgaWYgKCFzZW5kRGlzYWJsZWQgJiYgIWRpc2FibGVkKSBoYW5kbGVTZW5kTWVzc2FnZSgpXG4gICAgICB9XG4gICAgfSxcbiAgICBbaGFuZGxlUG9wb3ZlcktleURvd24sIHBvcG92ZXJPcGVuLCBzZW5kRGlzYWJsZWQsIGRpc2FibGVkLCBoYW5kbGVTZW5kTWVzc2FnZV1cbiAgKVxuXG4gIGNvbnN0IGFkZEZpbGVzID0gKGluY29taW5nOiBGaWxlW10pID0+IHtcbiAgICBpZiAoIWluY29taW5nLmxlbmd0aCB8fCBkaXNhYmxlZCkgcmV0dXJuXG5cbiAgICBjb25zdCBleGNlZWRlZEZpbGVzOiBzdHJpbmdbXSA9IFtdXG4gICAgY29uc3QgZXhjbHVkZWRGaWxlczogc3RyaW5nW10gPSBbXVxuICAgIGNvbnN0IGZpbGVTaXplczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9XG4gICAgbGV0IGZpbGVzSW5zZXJ0ZWQgPSBhdHRhY2htZW50cy5sZW5ndGhcblxuICAgIGNvbnN0IGlzTmV3Rm9ybWF0ID0gKGV4dGVuc2lvbjogc3RyaW5nKSA9PiBbJy5wbmcnLCAnLmpwZycsICcuanBlZycsICcucGRmJ10uaW5jbHVkZXMoZXh0ZW5zaW9uKVxuICAgIGNvbnN0IGlzT2xkRm9ybWF0ID0gKGV4dGVuc2lvbjogc3RyaW5nKSA9PlxuICAgICAgWycudHh0JywgJy5tZCcsICcuY3N2JywgJy5kb2MnLCAnLmRvY3gnLCAnLnhsc3gnLCAnLnhscycsICcucHB0JywgJy5wcHR4J10uaW5jbHVkZXMoZXh0ZW5zaW9uKVxuICAgIGNvbnN0IGlzQXVkaW9Gb3JtYXQgPSAoZXh0ZW5zaW9uOiBzdHJpbmcpID0+XG4gICAgICBbJy5mbGFjJywgJy5tNGEnLCAnLm1wMycsICcubXA0JywgJy5vZ2EnLCAnLm9nZycsICcud2F2JywgJy53ZWJtJ10uaW5jbHVkZXMoZXh0ZW5zaW9uKVxuXG4gICAgY29uc3QgZXhjZWVkc01heFNpemUgPSAoZXh0ZW5zaW9uOiBzdHJpbmcsIHNpemU6IG51bWJlcikgPT4gc2l6ZSA+IGdldE1heEF0dGFjaG1lbnRTaXplTWIoZXh0ZW5zaW9uKSAqIDEwMjQgKiAxMDI0XG5cbiAgICBpbmNvbWluZy5mb3JFYWNoKGZpbGUgPT4ge1xuICAgICAgbGV0IGV4Y2x1ZGVkRmlsZSA9IGZhbHNlXG4gICAgICBjb25zdCBmaWxlTmFtZVBhcnRzID0gZmlsZS5uYW1lLnNwbGl0KCcuJylcbiAgICAgIGNvbnN0IGZpbGVFeHRlbnNpb24gPSBmaWxlTmFtZVBhcnRzLmxlbmd0aCA+IDEgPyBgLiR7ZmlsZU5hbWVQYXJ0cy5wb3AoKT8udG9Mb3dlckNhc2UoKX1gIDogJydcblxuICAgICAgaWYgKCFhbGxvd2VkRmlsZVR5cGVzPy5pbmNsdWRlcyhmaWxlRXh0ZW5zaW9uKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZmlsZVNpemVzW2ZpbGUubmFtZV0gPSBmaWxlLnNpemVcblxuICAgICAgaWYgKGlzTmV3Rm9ybWF0KGZpbGVFeHRlbnNpb24pKSB7XG4gICAgICAgIGlmIChleGNlZWRzTWF4U2l6ZShmaWxlRXh0ZW5zaW9uLCBmaWxlLnNpemUpKSB7XG4gICAgICAgICAgZXhjZWVkZWRGaWxlcy5wdXNoKGZpbGUubmFtZSlcbiAgICAgICAgICBleGNsdWRlZEZpbGUgPSB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsZXNJbnNlcnRlZCArIDEgPiBNQVhfQ0hBVF9JTlBVVF9BVFRBQ0hNRU5UUykge1xuICAgICAgICAgIGV4Y2x1ZGVkRmlsZXMucHVzaChmaWxlLm5hbWUpXG4gICAgICAgICAgZXhjbHVkZWRGaWxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzT2xkRm9ybWF0KGZpbGVFeHRlbnNpb24pKSB7XG4gICAgICAgIGlmIChleGNlZWRzTWF4U2l6ZShmaWxlRXh0ZW5zaW9uLCBmaWxlLnNpemUpKSB7XG4gICAgICAgICAgZXhjZWVkZWRGaWxlcy5wdXNoKGZpbGUubmFtZSlcbiAgICAgICAgICBleGNsdWRlZEZpbGUgPSB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsZXNJbnNlcnRlZCArIDEgPiBNQVhfQ0hBVF9JTlBVVF9BVFRBQ0hNRU5UUykge1xuICAgICAgICAgIGV4Y2x1ZGVkRmlsZXMucHVzaChmaWxlLm5hbWUpXG4gICAgICAgICAgZXhjbHVkZWRGaWxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzQXVkaW9Gb3JtYXQoZmlsZUV4dGVuc2lvbikpIHtcbiAgICAgICAgaWYgKGV4Y2VlZHNNYXhTaXplKGZpbGVFeHRlbnNpb24sIGZpbGUuc2l6ZSkpIHtcbiAgICAgICAgICBleGNlZWRlZEZpbGVzLnB1c2goZmlsZS5uYW1lKVxuICAgICAgICAgIGV4Y2x1ZGVkRmlsZSA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWxlc0luc2VydGVkICsgMSA+IE1BWF9DSEFUX0lOUFVUX0FUVEFDSE1FTlRTKSB7XG4gICAgICAgICAgZXhjbHVkZWRGaWxlcy5wdXNoKGZpbGUubmFtZSlcbiAgICAgICAgICBleGNsdWRlZEZpbGUgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFleGNsdWRlZEZpbGUpIHtcbiAgICAgICAgZmlsZXNJbnNlcnRlZCArPSAxXG4gICAgICAgIGNvbnN0IHR5cGVGaWxlID0gZmlsZS50eXBlIHx8IGZpbGVUeXBlc1tmaWxlRXh0ZW5zaW9uXVxuICAgICAgICBjb25zdCBwYXJzZWRGaWxlID0gbmV3IEZpbGUoW2ZpbGVdLCBmaWxlLm5hbWUsIHsgdHlwZTogdHlwZUZpbGUgfSlcbiAgICAgICAgb25GaWxlQXR0YWNoPy4ocGFyc2VkRmlsZSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKGV4Y2x1ZGVkRmlsZXMubGVuZ3RoIHx8IGV4Y2VlZGVkRmlsZXMubGVuZ3RoKSB7XG4gICAgICBzZXRNb2RhbFByb3BzKHsgaXNPcGVuOiB0cnVlLCBleGNsdWRlZEZpbGVzLCBleGNlZWRlZEZpbGVzLCBmaWxlU2l6ZXMgfSlcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYW5kbGVGaWxlU2VsZWN0ID0gKGU6IENoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+KSA9PiB7XG4gICAgY29uc3QgZmlsZXMgPSBlLnRhcmdldC5maWxlc1xuICAgIGlmIChmaWxlcykge1xuICAgICAgYWRkRmlsZXMoQXJyYXkuZnJvbShmaWxlcykpXG4gICAgfVxuICAgIGlmIChmaWxlSW5wdXRSZWYuY3VycmVudCkge1xuICAgICAgZmlsZUlucHV0UmVmLmN1cnJlbnQudmFsdWUgPSAnJ1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc2V0RmlsZURyYWcgPSAoKSA9PiB7XG4gICAgZmlsZURyYWdDb3VudGVyUmVmLmN1cnJlbnQgPSAwXG4gICAgc2V0SXNGaWxlRHJhZ0FjdGl2ZShmYWxzZSlcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZURyYWdFbnRlciA9IChlOiBEcmFnRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgaWYgKCFkYXRhVHJhbnNmZXJIYXNGaWxlcyhlLmRhdGFUcmFuc2ZlcikpIHJldHVyblxuICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVyblxuICAgIGZpbGVEcmFnQ291bnRlclJlZi5jdXJyZW50ICs9IDFcbiAgICBzZXRJc0ZpbGVEcmFnQWN0aXZlKHRydWUpXG4gIH1cblxuICBjb25zdCBoYW5kbGVEcmFnTGVhdmUgPSAoZTogRHJhZ0V2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgIGlmICghaXNGaWxlRHJhZ0FjdGl2ZSAmJiAhZGF0YVRyYW5zZmVySGFzRmlsZXMoZS5kYXRhVHJhbnNmZXIpKSByZXR1cm5cbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgZmlsZURyYWdDb3VudGVyUmVmLmN1cnJlbnQgPSBNYXRoLm1heCgwLCBmaWxlRHJhZ0NvdW50ZXJSZWYuY3VycmVudCAtIDEpXG4gICAgaWYgKGZpbGVEcmFnQ291bnRlclJlZi5jdXJyZW50ID09PSAwKSB7XG4gICAgICBzZXRJc0ZpbGVEcmFnQWN0aXZlKGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGhhbmRsZURyYWdPdmVyID0gKGU6IERyYWdFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHtcbiAgICBpZiAoIWRhdGFUcmFuc2Zlckhhc0ZpbGVzKGUuZGF0YVRyYW5zZmVyKSkgcmV0dXJuXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgIGlmIChkaXNhYmxlZCkgcmV0dXJuXG4gICAgZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdjb3B5J1xuICB9XG5cbiAgY29uc3QgaGFuZGxlRHJvcCA9IChlOiBEcmFnRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgaWYgKCFkYXRhVHJhbnNmZXJIYXNGaWxlcyhlLmRhdGFUcmFuc2ZlcikpIHtcbiAgICAgIHJlc2V0RmlsZURyYWcoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICByZXNldEZpbGVEcmFnKClcbiAgICBpZiAoZGlzYWJsZWQpIHJldHVyblxuICAgIGFkZEZpbGVzKGZpbGVzRnJvbURhdGFUcmFuc2ZlcihlLmRhdGFUcmFuc2ZlcikpXG4gIH1cblxuICBjb25zdCBoYW5kbGVQYXN0ZUZpbGVzID0gKGZpbGVzOiBGaWxlW10pID0+IHtcbiAgICBhZGRGaWxlcyhmaWxlcylcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZVdyYXBwZXJQYXN0ZSA9IChlOiBDbGlwYm9hcmRFdmVudDxIVE1MRGl2RWxlbWVudD4pID0+IHtcbiAgICBjb25zdCBlZGl0b3JFbCA9IHdyYXBwZXJSZWYuY3VycmVudD8ucXVlcnlTZWxlY3RvcignW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0nKVxuICAgIGlmIChlZGl0b3JFbCAmJiBlZGl0b3JFbC5jb250YWlucyhlLnRhcmdldCBhcyBOb2RlKSkgcmV0dXJuXG4gICAgY29uc3QgZmlsZXMgPSBmaWxlc0Zyb21EYXRhVHJhbnNmZXIoZS5jbGlwYm9hcmREYXRhKVxuICAgIGlmICghZmlsZXMubGVuZ3RoKSByZXR1cm5cbiAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICBhZGRGaWxlcyhmaWxlcylcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZURlbGV0ZUF0dGFjaG1lbnQgPSAoZmlsZUlkOiBzdHJpbmcpID0+IHtcbiAgICBvbkRlbGV0ZUF0dGFjaG1lbnQ/LihmaWxlSWQpXG4gIH1cblxuICBjb25zdCBoYW5kbGVTdG9wR2VuZXJhdGlvbiA9ICgpID0+IHtcbiAgICBldmVudEFtcGxpdHVkZShFVkVOVFMuYWlDaGF0U3RvcFJlc3BvbnNlKVxuICAgIG9uU3RvcEdlbmVyYXRpb24/LigpXG4gIH1cblxuICBjb25zdCBzaG93Q2hpcHNSb3cgPSBCb29sZWFuKGNvbnRleHRDaGlwPy5pdGVtcz8ubGVuZ3RoIHx8IGF0dGFjaG1lbnRzLmxlbmd0aClcblxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGNoaXBzRWwgPSBjaGlwc1Jvd1JlZi5jdXJyZW50XG4gICAgY29uc3QgdG9vbGJhckVsID0gdG9vbGJhclJvd1JlZi5jdXJyZW50XG5cbiAgICBjb25zdCB1cGRhdGVIZWlnaHRzID0gKCkgPT4ge1xuICAgICAgY29uc3QgbmV4dENoaXBzID0gc2hvd0NoaXBzUm93ICYmIGNoaXBzRWwgPyBNYXRoLmNlaWwoY2hpcHNFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpIDogMFxuICAgICAgY29uc3QgbmV4dFRvb2xiYXIgPSB0b29sYmFyRWxcbiAgICAgICAgPyBNYXRoLmNlaWwodG9vbGJhckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodClcbiAgICAgICAgOiBNQUlBX0lOUFVUX1RPT0xCQVJfUk9XX0hFSUdIVF9QWFxuXG4gICAgICBzZXRDaGlwc1Jvd0hlaWdodChwcmV2ID0+IChwcmV2ID09PSBuZXh0Q2hpcHMgPyBwcmV2IDogbmV4dENoaXBzKSlcbiAgICAgIHNldFRvb2xiYXJSb3dIZWlnaHQocHJldiA9PiAocHJldiA9PT0gbmV4dFRvb2xiYXIgPyBwcmV2IDogbmV4dFRvb2xiYXIpKVxuICAgIH1cblxuICAgIHVwZGF0ZUhlaWdodHMoKVxuXG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIodXBkYXRlSGVpZ2h0cylcbiAgICBpZiAoc2hvd0NoaXBzUm93ICYmIGNoaXBzRWwpIG9ic2VydmVyLm9ic2VydmUoY2hpcHNFbClcbiAgICBpZiAodG9vbGJhckVsKSBvYnNlcnZlci5vYnNlcnZlKHRvb2xiYXJFbClcblxuICAgIHJldHVybiAoKSA9PiBvYnNlcnZlci5kaXNjb25uZWN0KClcbiAgfSwgW3Nob3dDaGlwc1JvdywgY29udGV4dENoaXA/Lml0ZW1zPy5sZW5ndGgsIGF0dGFjaG1lbnRzLmxlbmd0aF0pXG5cbiAgY29uc3QgZWRpdG9yTWF4SGVpZ2h0ID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgZ2V0TWFpYUlucHV0RWRpdG9yTWF4SGVpZ2h0KHtcbiAgICAgICAgY2hpcHNSb3dIZWlnaHRQeDogY2hpcHNSb3dIZWlnaHQsXG4gICAgICAgIHRvb2xiYXJSb3dIZWlnaHRQeDogdG9vbGJhclJvd0hlaWdodCxcbiAgICAgIH0pLFxuICAgIFtjaGlwc1Jvd0hlaWdodCwgdG9vbGJhclJvd0hlaWdodF1cbiAgKVxuXG4gIGNvbnN0IHRvb2xiYXJJY29uQ29sb3IgPSAnIzgwODA4MCdcbiAgY29uc3QgcGx1c01lbnVJY29uQ29sb3IgPSBNQUlBX0NIQVRfSU5QVVRfVUkubWVudUljb25cbiAgY29uc3QgaXNDdXN0b21BZ2VudCA9IGFnZW50Py50eXBlID09PSAnY3VzdG9tJ1xuICBjb25zdCBoYXNDb3JBY2Nlc3MgPSBCb29sZWFuKFxuICAgIGlzQ3VzdG9tQWdlbnQgJiZcbiAgICBhZ2VudD8uY29ubmVjdG9ycz8uc29tZShcbiAgICAgIGNvbm5lY3RvciA9PlxuICAgICAgICBjb25uZWN0b3IuZ3JvdXAgPT09ICdDT1InICYmIGNvbm5lY3Rvci5zbHVncy5zb21lKHNsdWcgPT4gdHlwZW9mIHNsdWcgPT09ICdzdHJpbmcnICYmIHNsdWcudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgKVxuICApXG4gIGNvbnN0IGFnZW50TW9kZWxOYW1lID0gaXNDdXN0b21BZ2VudCA/IGFnZW50Py5tb2RlbF9kaXNwbGF5X25hbWU/LnRyaW0oKSB8fCBudWxsIDogbnVsbFxuICBjb25zdCBzaG93Q3VzdG9tTWV0YUluZGljYXRvcnMgPSBoYXNDb3JBY2Nlc3MgfHwgQm9vbGVhbihhZ2VudE1vZGVsTmFtZSlcbiAgY29uc3Qgc2hvd01lbnRpb25CdXR0b24gPSBhZ2VudD8udHlwZSA9PT0gJ29yY2hlc3RyYXRvcicgfHwgaGFzQ29yQWNjZXNzXG5cbiAgbGV0IGFjdGl2ZVRvb2xDaGlwTGVhZGluZ0ljb246IFJlYWN0Tm9kZVxuICBpZiAoYWN0aXZlVG9vbENoaXBIb3ZlcmVkKSB7XG4gICAgYWN0aXZlVG9vbENoaXBMZWFkaW5nSWNvbiA9IDxDcm9zcyBjb2xvcj17TUFJQV9DSEFUX0lOUFVUX1VJLmNoaXBDbG9zZUljb259IHdpZHRoPXsxOH0gaGVpZ2h0PXsxOH0gLz5cbiAgfSBlbHNlIGlmIChpc1dlYlNlYXJjaEFjdGl2ZSkge1xuICAgIGFjdGl2ZVRvb2xDaGlwTGVhZGluZ0ljb24gPSA8TWFpYUlucHV0V2ViU2VhcmNoSWNvbiBjb2xvcj17cGx1c01lbnVJY29uQ29sb3J9IHdpZHRoPXsxOH0gaGVpZ2h0PXsxOH0gLz5cbiAgfSBlbHNlIHtcbiAgICBhY3RpdmVUb29sQ2hpcExlYWRpbmdJY29uID0gPE1haWFJbnB1dERlZXBTZWFyY2hJY29uIGNvbG9yPXtwbHVzTWVudUljb25Db2xvcn0gd2lkdGg9ezE4fSBoZWlnaHQ9ezE4fSAvPlxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPFN0eWxlZE1BSUFJbnB1dFdyYXBwZXJcbiAgICAgICAgcmVmPXt3cmFwcGVyUmVmfVxuICAgICAgICBkaXNhYmxlZD17ZmFsc2V9XG4gICAgICAgIGFsaWduQnV0dG9ucz17YWxpZ25CdXR0b25zfVxuICAgICAgICBoYXNBdHRhY2htZW50cz17ISFhdHRhY2htZW50cy5sZW5ndGh9XG4gICAgICAgICRmaWxlRHJhZ0FjdGl2ZT17aXNGaWxlRHJhZ0FjdGl2ZX1cbiAgICAgICAgZGF0YS1hcHBjdWVzPVwibWFpYV9jaGF0X2lucHV0XCJcbiAgICAgICAgZGF0YS1tYWlhLXN0cmVhbWluZz17aXNTdHJlYW1pbmcgPyAndHJ1ZScgOiAnZmFsc2UnfVxuICAgICAgICBvblBhc3RlPXtoYW5kbGVXcmFwcGVyUGFzdGV9XG4gICAgICAgIG9uRHJhZ0VudGVyPXtoYW5kbGVEcmFnRW50ZXJ9XG4gICAgICAgIG9uRHJhZ0xlYXZlPXtoYW5kbGVEcmFnTGVhdmV9XG4gICAgICAgIG9uRHJhZ092ZXI9e2hhbmRsZURyYWdPdmVyfVxuICAgICAgICBvbkRyb3A9e2hhbmRsZURyb3B9XG4gICAgICA+XG4gICAgICAgIHtzaG93Q2hpcHNSb3cgJiYgKFxuICAgICAgICAgIDxTQ0lucHV0Q2hpcHNSb3cgcmVmPXtjaGlwc1Jvd1JlZn0+XG4gICAgICAgICAgICB7Y29udGV4dENoaXA/Lml0ZW1zPy5sZW5ndGggPyAoXG4gICAgICAgICAgICAgIDxDaGlwXG4gICAgICAgICAgICAgICAgaXRlbXM9e2NvbnRleHRDaGlwLml0ZW1zfVxuICAgICAgICAgICAgICAgIHR5cGU9e2NvbnRleHRDaGlwLnR5cGV9XG4gICAgICAgICAgICAgICAgbGVhZGluZ0ljb249e2NvbnRleHRDaGlwLmxlYWRpbmdJY29ufVxuICAgICAgICAgICAgICAgIHRvb2x0aXBaSW5kZXg9e3Rvb2x0aXBaSW5kZXh9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgIHthdHRhY2htZW50cy5tYXAoKGF0dGFjaG1lbnQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGlzSW1hZ2UgPVxuICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQudHlwZT8uc3RhcnRzV2l0aCgnaW1hZ2UvJykgfHwgL1xcLihwbmd8anBlP2d8Z2lmfHdlYnB8Ym1wfHN2ZykkL2kudGVzdChhdHRhY2htZW50Lm5hbWUgfHwgJycpXG4gICAgICAgICAgICAgIGNvbnN0IGNoaXBJY29uID0gaXNJbWFnZSA/IChcbiAgICAgICAgICAgICAgICA8TWFpYUlucHV0QXR0YWNobWVudEltYWdlSWNvbiBjb2xvcj1cIiM4MDgwODBcIiB3aWR0aD17MTJ9IGhlaWdodD17MTJ9IC8+XG4gICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgPE1haWFJbnB1dEF0dGFjaEljb24gY29sb3I9XCIjODA4MDgwXCIgd2lkdGg9ezEzfSBoZWlnaHQ9ezEzfSAvPlxuICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8VG9vbHRpcCB0aXRsZT17YXR0YWNobWVudC5uYW1lfSBrZXk9e2Ake2F0dGFjaG1lbnQuaWR9LSR7aW5kZXh9YH0gekluZGV4PXt0b29sdGlwWkluZGV4fT5cbiAgICAgICAgICAgICAgICAgIDxTQ01JQXR0YWNobWVudD5cbiAgICAgICAgICAgICAgICAgICAgPFNDTUlBdHRhY2htZW50SWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8U0NNSUF0dGFjaG1lbnRGaWxlSWNvbj57Y2hpcEljb259PC9TQ01JQXR0YWNobWVudEZpbGVJY29uPlxuICAgICAgICAgICAgICAgICAgICAgIDxTQ01JQXR0YWNobWVudERlbGV0ZUljb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD17dCgnY2hhdC5yZW1vdmVBdHRhY2htZW50QXJpYScsIHsgZGVmYXVsdFZhbHVlOiAnUXVpdGFyIGFyY2hpdm8nIH0pfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlRGVsZXRlQXR0YWNobWVudChhdHRhY2htZW50LmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Q3Jvc3MgY29sb3I9XCIjNjY2NjY2XCIgd2lkdGg9ezE0fSBoZWlnaHQ9ezE0fSAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvU0NNSUF0dGFjaG1lbnREZWxldGVJY29uPlxuICAgICAgICAgICAgICAgICAgICA8L1NDTUlBdHRhY2htZW50SWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPFNDTUlBdHRhY2htZW50TmFtZT57YXR0YWNobWVudC5uYW1lfTwvU0NNSUF0dGFjaG1lbnROYW1lPlxuICAgICAgICAgICAgICAgICAgPC9TQ01JQXR0YWNobWVudD5cbiAgICAgICAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgIDwvU0NJbnB1dENoaXBzUm93PlxuICAgICAgICApfVxuICAgICAgICA8U3R5bGVkTUFJQU1haW5Ub29sYmFyR3JpZD5cbiAgICAgICAgICA8U0NJbnB1dEVkaXRvckNlbGw+XG4gICAgICAgICAgICA8Q29udGV4dE1lbnRpb25FZGl0b3JcbiAgICAgICAgICAgICAgcmVmPXtlZGl0b3JSZWZ9XG4gICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3BsYWNlaG9sZGVyfVxuICAgICAgICAgICAgICBtYXhIZWlnaHQ9e2VkaXRvck1heEhlaWdodH1cbiAgICAgICAgICAgICAgb25JbnB1dD17aGFuZGxlRWRpdG9ySW5wdXR9XG4gICAgICAgICAgICAgIG9uS2V5RG93bj17aGFuZGxlS2V5RG93bn1cbiAgICAgICAgICAgICAgb25Gb2N1cz17b25Gb2N1c31cbiAgICAgICAgICAgICAgb25QYXN0ZUZpbGVzPXtoYW5kbGVQYXN0ZUZpbGVzfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L1NDSW5wdXRFZGl0b3JDZWxsPlxuICAgICAgICAgIDxTQ0lucHV0VG9vbGJhclJvdyByZWY9e3Rvb2xiYXJSb3dSZWZ9PlxuICAgICAgICAgICAgPFN0eWxlZE1BSUFQbHVzVG9vbGJhckNlbGw+XG4gICAgICAgICAgICAgIDxQbHVzTWVudVRvb2xzUm93PlxuICAgICAgICAgICAgICAgIDxQbHVzVG9nZ2xlQnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICRtZW51T3Blbj17cGx1c01lbnVPcGVufVxuICAgICAgICAgICAgICAgICAgb25Nb3VzZURvd249e2hhbmRsZVBsdXNCdXR0b25Nb3VzZURvd259XG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVQbHVzQnV0dG9uQ2xpY2t9XG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXt0KCdjaGF0Lm9wZW5QbHVzTWVudUFyaWEnKX1cbiAgICAgICAgICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9e3BsdXNNZW51T3Blbn1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8TWFpYUlucHV0QWRkSWNvbiBjb2xvcj17dG9vbGJhckljb25Db2xvcn0gd2lkdGg9ezE4fSBoZWlnaHQ9ezE4fSAvPlxuICAgICAgICAgICAgICAgIDwvUGx1c1RvZ2dsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgICB7c2hvd01lbnRpb25CdXR0b24gJiYgKFxuICAgICAgICAgICAgICAgICAgPFBsdXNUb2dnbGVCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICRtZW51T3Blbj17ZmFsc2V9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZU1lbnRpb25CdXR0b25DbGlja31cbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2Rpc2FibGVkfVxuICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXt0KCdjaGF0Lm9wZW5NZW50aW9uQXJpYScpfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8TWFpYUlucHV0TWVudGlvbkljb24gY29sb3I9e3Rvb2xiYXJJY29uQ29sb3J9IHdpZHRoPXsxOH0gaGVpZ2h0PXsxOH0gLz5cbiAgICAgICAgICAgICAgICAgIDwvUGx1c1RvZ2dsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIHtzaG93U2tpbGxzQnV0dG9uICYmIChcbiAgICAgICAgICAgICAgICAgIDxTa2lsbHNUb2dnbGVCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgcmVmPXtza2lsbHNCdXR0b25SZWZ9XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBvbk1vdXNlRG93bj17aGFuZGxlUGx1c0J1dHRvbk1vdXNlRG93bn1cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlU2tpbGxzQnV0dG9uQ2xpY2t9XG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgYXJpYS1oYXNwb3B1cD1cImxpc3Rib3hcIlxuICAgICAgICAgICAgICAgICAgICBhcmlhLWV4cGFuZGVkPXtzaG93U2tpbGxzRHJvcGRvd259XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxTa2lsbEljb24gd2lkdGg9ezE2fSBoZWlnaHQ9ezE2fSBjb2xvcj17dG9vbGJhckljb25Db2xvcn0gLz5cbiAgICAgICAgICAgICAgICAgICAge3QoJ215U2tpbGxzLmRyb3Bkb3duQnV0dG9uJyl9XG4gICAgICAgICAgICAgICAgICA8L1NraWxsc1RvZ2dsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDxQb3BvdmVyXG4gICAgICAgICAgICAgICAgICBvcGVuPXtwbHVzTWVudU9wZW59XG4gICAgICAgICAgICAgICAgICBhbmNob3JFbD17cGx1c01lbnVBbmNob3J9XG4gICAgICAgICAgICAgICAgICBvbkNsb3NlPXtjbG9zZVBsdXNNZW51fVxuICAgICAgICAgICAgICAgICAgZGlzYWJsZUF1dG9Gb2N1c1xuICAgICAgICAgICAgICAgICAgZGlzYWJsZUVuZm9yY2VGb2N1c1xuICAgICAgICAgICAgICAgICAgZGlzYWJsZVJlc3RvcmVGb2N1c1xuICAgICAgICAgICAgICAgICAgYW5jaG9yT3JpZ2luPXt7IHZlcnRpY2FsOiAndG9wJywgaG9yaXpvbnRhbDogJ2xlZnQnIH19XG4gICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW49e3sgdmVydGljYWw6ICdib3R0b20nLCBob3Jpem9udGFsOiAnbGVmdCcgfX1cbiAgICAgICAgICAgICAgICAgIHN4PXt7IHpJbmRleDogcGx1c01lbnVaSW5kZXggfX1cbiAgICAgICAgICAgICAgICAgIHNsb3RQcm9wcz17e1xuICAgICAgICAgICAgICAgICAgICBwYXBlcjoge1xuICAgICAgICAgICAgICAgICAgICAgIGVsZXZhdGlvbjogMCxcbiAgICAgICAgICAgICAgICAgICAgICBzeDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6ICd2aXNpYmxlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzRweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBib3hTaGFkb3c6ICdub25lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpblRvcDogJy00cHgnLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxQbHVzTWVudVBhcGVyPlxuICAgICAgICAgICAgICAgICAgICA8UGx1c01lbnVJbm5lckNvbHVtbj5cbiAgICAgICAgICAgICAgICAgICAgICA8UGx1c01lbnVJdGVtQnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbkNsaWNrPXtoYW5kbGVQbHVzTWVudUF0dGFjaH0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8TWFpYUlucHV0QXR0YWNoSWNvbiBjb2xvcj17cGx1c01lbnVJY29uQ29sb3J9IHdpZHRoPXsyMX0gaGVpZ2h0PXsyMH0gLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxQbHVzTWVudUl0ZW1MYWJlbD57dCgnY2hhdC5wbHVzTWVudUF0dGFjaCcpfTwvUGx1c01lbnVJdGVtTGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPC9QbHVzTWVudUl0ZW1CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPFBsdXNNZW51RGl2aWRlciAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxQbHVzTWVudUl0ZW1CdXR0b24gdHlwZT1cImJ1dHRvblwiIG9uQ2xpY2s9e2hhbmRsZVBsdXNNZW51V2ViU2VhcmNofT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxNYWlhSW5wdXRXZWJTZWFyY2hJY29uIGNvbG9yPXtwbHVzTWVudUljb25Db2xvcn0gd2lkdGg9ezIwfSBoZWlnaHQ9ezIwfSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFBsdXNNZW51SXRlbUxhYmVsPnt0KCdjaGF0LnNlYXJjaFdlYicpfTwvUGx1c01lbnVJdGVtTGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICB7aXNXZWJTZWFyY2hBY3RpdmUgPyA8Q2hlY2sgY29sb3I9e3BsdXNNZW51SWNvbkNvbG9yfSB3aWR0aD17MTZ9IGhlaWdodD17MTZ9IC8+IDogbnVsbH1cbiAgICAgICAgICAgICAgICAgICAgICA8L1BsdXNNZW51SXRlbUJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8UGx1c01lbnVJdGVtQnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbkNsaWNrPXtoYW5kbGVQbHVzTWVudURlZXBTZWFyY2h9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPE1haWFJbnB1dERlZXBTZWFyY2hJY29uIGNvbG9yPXtwbHVzTWVudUljb25Db2xvcn0gd2lkdGg9ezIwfSBoZWlnaHQ9ezIwfSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFBsdXNNZW51SXRlbUxhYmVsPnt0KCdjaGF0LnBsdXNNZW51RGVlcEludmVzdGlnYXRpb24nKX08L1BsdXNNZW51SXRlbUxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAge2lzRGVlcFNlYXJjaEFjdGl2ZSA/IDxDaGVjayBjb2xvcj17cGx1c01lbnVJY29uQ29sb3J9IHdpZHRoPXsxNn0gaGVpZ2h0PXsxNn0gLz4gOiBudWxsfVxuICAgICAgICAgICAgICAgICAgICAgIDwvUGx1c01lbnVJdGVtQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxQbHVzTWVudURpdmlkZXIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8UGx1c01lbnVJdGVtQnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbkNsaWNrPXtoYW5kbGVQbHVzTWVudVF1aWNrQWN0aW9uc30+XG4gICAgICAgICAgICAgICAgICAgICAgICA8TWFpYUlucHV0U2xhc2hJY29uIGNvbG9yPXtwbHVzTWVudUljb25Db2xvcn0gd2lkdGg9ezIwfSBoZWlnaHQ9ezIwfSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFBsdXNNZW51SXRlbUxhYmVsPnt0KCdjaGF0LnBsdXNNZW51UXVpY2tBY3Rpb25zJyl9PC9QbHVzTWVudUl0ZW1MYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICA8L1BsdXNNZW51SXRlbUJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9QbHVzTWVudUlubmVyQ29sdW1uPlxuICAgICAgICAgICAgICAgICAgPC9QbHVzTWVudVBhcGVyPlxuICAgICAgICAgICAgICAgIDwvUG9wb3Zlcj5cbiAgICAgICAgICAgICAgICB7KGlzV2ViU2VhcmNoQWN0aXZlIHx8IGlzRGVlcFNlYXJjaEFjdGl2ZSkgJiYgKFxuICAgICAgICAgICAgICAgICAgPEFjdGl2ZVRvb2xDaGlwUm9vdFxuICAgICAgICAgICAgICAgICAgICAkaG92ZXJlZD17YWN0aXZlVG9vbENoaXBIb3ZlcmVkfVxuICAgICAgICAgICAgICAgICAgICAkZXhpdGluZz17dG9vbENoaXBFeGl0aW5nfVxuICAgICAgICAgICAgICAgICAgICBvbk1vdXNlRW50ZXI9eygpID0+IHNldEFjdGl2ZVRvb2xDaGlwSG92ZXJlZCh0cnVlKX1cbiAgICAgICAgICAgICAgICAgICAgb25Nb3VzZUxlYXZlPXsoKSA9PiBzZXRBY3RpdmVUb29sQ2hpcEhvdmVyZWQoZmFsc2UpfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8QWN0aXZlVG9vbENoaXBJY29uQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgJGNsb3NlU2hvd249e2FjdGl2ZVRvb2xDaGlwSG92ZXJlZH1cbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXt0KCdjaGF0LnJlbW92ZUFjdGl2ZVRvb2xBcmlhJyl9XG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgICAgICAgICAgICAgICBiZWdpblRvb2xDaGlwRXhpdCgpXG4gICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHthY3RpdmVUb29sQ2hpcExlYWRpbmdJY29ufVxuICAgICAgICAgICAgICAgICAgICA8L0FjdGl2ZVRvb2xDaGlwSWNvbkJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPEFjdGl2ZVRvb2xDaGlwTGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAge2lzV2ViU2VhcmNoQWN0aXZlID8gdCgnY2hhdC5zZWFyY2hXZWInKSA6IHQoJ2NoYXQucGx1c01lbnVEZWVwSW52ZXN0aWdhdGlvbicpfVxuICAgICAgICAgICAgICAgICAgICA8L0FjdGl2ZVRvb2xDaGlwTGFiZWw+XG4gICAgICAgICAgICAgICAgICA8L0FjdGl2ZVRvb2xDaGlwUm9vdD5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L1BsdXNNZW51VG9vbHNSb3c+XG4gICAgICAgICAgICA8L1N0eWxlZE1BSUFQbHVzVG9vbGJhckNlbGw+XG4gICAgICAgICAgICA8U3R5bGVkTUFJQVNlbmRUb29sYmFyQ2VsbD5cbiAgICAgICAgICAgICAge3Nob3dDdXN0b21NZXRhSW5kaWNhdG9ycyAmJiAoXG4gICAgICAgICAgICAgICAgPFNDSW5wdXRNZXRhSW5kaWNhdG9ycz5cbiAgICAgICAgICAgICAgICAgIHtoYXNDb3JBY2Nlc3MgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8VG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXt0KCdjaGF0LmZvb3Rlci5jb3JBY2Nlc3NUb29sdGlwJyl9XG4gICAgICAgICAgICAgICAgICAgICAgey4uLih0b29sdGlwWkluZGV4ICE9IG51bGwgPyB7IHpJbmRleDogdG9vbHRpcFpJbmRleCB9IDoge30pfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPFNDSW5wdXRNZXRhSWNvbkJ1dHRvbiBhcmlhLWxhYmVsPXt0KCdjaGF0LmZvb3Rlci5jb3JBY2Nlc3NMYWJlbCcpfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxDb3JBY2Nlc3NJY29uIHdpZHRoPXsxNX0gaGVpZ2h0PXsxNH0gY29sb3I9e3Rvb2xiYXJJY29uQ29sb3J9IC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9TQ0lucHV0TWV0YUljb25CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICB7YWdlbnRNb2RlbE5hbWUgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8VG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXt0KCdjaGlwTGxtLnRvb2x0aXAnLCB7IG1vZGVsOiBhZ2VudE1vZGVsTmFtZSB9KX1cbiAgICAgICAgICAgICAgICAgICAgICB7Li4uKHRvb2x0aXBaSW5kZXggIT0gbnVsbCA/IHsgekluZGV4OiB0b29sdGlwWkluZGV4IH0gOiB7fSl9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8U0NJbnB1dE1ldGFJY29uQnV0dG9uIGFyaWEtbGFiZWw9e2FnZW50TW9kZWxOYW1lfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxNYWlhSW5wdXRSb2JvdEljb24gd2lkdGg9ezE4fSBoZWlnaHQ9ezE4fSBjb2xvcj17dG9vbGJhckljb25Db2xvcn0gLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L1NDSW5wdXRNZXRhSWNvbkJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L1NDSW5wdXRNZXRhSW5kaWNhdG9ycz5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAge2lzV3JpdGluZyA/IChcbiAgICAgICAgICAgICAgICA8VG9vbHRpcCB0aXRsZT17dCgnY2hhdC5zdG9wJyl9IHpJbmRleD17dG9vbHRpcFpJbmRleH0+XG4gICAgICAgICAgICAgICAgICA8U3R5bGVkTUFJQVN0b3BCdXR0b24gZGlzYWJsZWQ9e2ZhbHNlfSBvbkNsaWNrPXtoYW5kbGVTdG9wR2VuZXJhdGlvbn0gY2xhc3NOYW1lPXtjbGFzc05hbWV9PlxuICAgICAgICAgICAgICAgICAgICA8U3R5bGVkTUFJQVN0b3BJY29uIC8+XG4gICAgICAgICAgICAgICAgICA8L1N0eWxlZE1BSUFTdG9wQnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICA8VG9vbHRpcCB0aXRsZT17dCgnY2hhdC5zZW5kJyl9IHpJbmRleD17dG9vbHRpcFpJbmRleH0+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT17eyBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLCBhbGlnbkl0ZW1zOiAnY2VudGVyJyB9fT5cbiAgICAgICAgICAgICAgICAgICAgPFN0eWxlZE1BSUFTZW5kQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlU2VuZE1lc3NhZ2V9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3NlbmREaXNhYmxlZCB8fCBkaXNhYmxlZH1cbiAgICAgICAgICAgICAgICAgICAgICBoYXNWYWx1ZXM9e2hhc1R5cGluZ1ByZXNlbmNlIHx8IGF0dGFjaG1lbnRzLmxlbmd0aCA+IDB9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8TWFpYUlucHV0U2VuZEljb24gY29sb3I9XCIjQkZCRkJGXCIgd2lkdGg9ezE2fSBoZWlnaHQ9ezE2fSAvPlxuICAgICAgICAgICAgICAgICAgICA8L1N0eWxlZE1BSUFTZW5kQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvU3R5bGVkTUFJQVNlbmRUb29sYmFyQ2VsbD5cbiAgICAgICAgICA8L1NDSW5wdXRUb29sYmFyUm93PlxuICAgICAgICA8L1N0eWxlZE1BSUFNYWluVG9vbGJhckdyaWQ+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIHJlZj17ZmlsZUlucHV0UmVmfVxuICAgICAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgIGFjY2VwdD1cIi50eHQsLm1kLC5jc3YsLmRvYywuZG9jeCwucHB0LC5wcHR4LC5wbmcsLmpwZywuanBlZywucGRmLC54bHN4LC54bHMsLmZsYWMsLm00YSwubXAzLC5tcDQsLm9nYSwub2dnLC53YXYsLndlYm1cIlxuICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVGaWxlU2VsZWN0fVxuICAgICAgICAgIHN0eWxlPXt7IGRpc3BsYXk6ICdub25lJyB9fVxuICAgICAgICAvPlxuICAgICAgICB7aXNGaWxlRHJhZ0FjdGl2ZSAmJiA8U3R5bGVkTUFJQURyb3BPdmVybGF5Pnt0KCdjaGF0LmRyb3BGaWxlc0hlcmUnKX08L1N0eWxlZE1BSUFEcm9wT3ZlcmxheT59XG4gICAgICA8L1N0eWxlZE1BSUFJbnB1dFdyYXBwZXI+XG4gICAgICB7bW9kYWxQcm9wcy5pc09wZW4gJiYgKFxuICAgICAgICA8TW9kYWxGaWxlRXhjZWVkc1xuICAgICAgICAgIG9uQ2xvc2U9eygpID0+IHNldE1vZGFsUHJvcHMoeyBpc09wZW46IGZhbHNlLCBleGNsdWRlZEZpbGVzOiBbXSwgZXhjZWVkZWRGaWxlczogW10sIGZpbGVTaXplczoge30gfSl9XG4gICAgICAgICAgZXhjbHVkZWRGaWxlcz17bW9kYWxQcm9wcy5leGNsdWRlZEZpbGVzfVxuICAgICAgICAgIGV4Y2VlZGVkRmlsZXM9e21vZGFsUHJvcHMuZXhjZWVkZWRGaWxlc31cbiAgICAgICAgICBmaWxlU2l6ZXM9e21vZGFsUHJvcHMuZmlsZVNpemVzfVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICAgIHtwb3BvdmVyTm9kZSAmJiBjcmVhdGVQb3J0YWwocG9wb3Zlck5vZGUsIGRvY3VtZW50LmJvZHkpfVxuICAgICAge3Nob3dTbGFzaERyb3Bkb3duICYmXG4gICAgICAgIGNyZWF0ZVBvcnRhbChcbiAgICAgICAgICA8U2xhc2hDb21tYW5kRHJvcGRvd25cbiAgICAgICAgICAgIGNvbW1hbmRzPXtzbGFzaENvbW1hbmRzfVxuICAgICAgICAgICAgcXVlcnk9e3NsYXNoUXVlcnl9XG4gICAgICAgICAgICBvblNlbGVjdD17aGFuZGxlU2VsZWN0U2xhc2hDb21tYW5kfVxuICAgICAgICAgICAgb25DbG9zZT17aGFuZGxlQ2xvc2VTbGFzaERyb3Bkb3dufVxuICAgICAgICAgICAgYm90dG9tPXtzbGFzaERyb3Bkb3duUG9zLmJvdHRvbX1cbiAgICAgICAgICAgIGxlZnQ9e3NsYXNoRHJvcGRvd25Qb3MubGVmdH1cbiAgICAgICAgICAgIG1heEhlaWdodD17c2xhc2hEcm9wZG93blBvcy5tYXhIZWlnaHR9XG4gICAgICAgICAgICB6SW5kZXg9e3NsYXNoRHJvcGRvd25aSW5kZXh9XG4gICAgICAgICAgICBhbmNob3JSZWY9e3dyYXBwZXJSZWZ9XG4gICAgICAgICAgLz4sXG4gICAgICAgICAgZG9jdW1lbnQuYm9keVxuICAgICAgICApfVxuICAgICAge3Nob3dTa2lsbHNEcm9wZG93biAmJlxuICAgICAgICBjcmVhdGVQb3J0YWwoXG4gICAgICAgICAgPFNraWxsc0Ryb3Bkb3duXG4gICAgICAgICAgICBza2lsbHM9e3NraWxsc31cbiAgICAgICAgICAgIHF1ZXJ5PXtza2lsbHNRdWVyeX1cbiAgICAgICAgICAgIGxvYWRpbmc9e3NraWxsc0xvYWRpbmd9XG4gICAgICAgICAgICBlcnJvcj17c2tpbGxzRXJyb3J9XG4gICAgICAgICAgICBjYW5DcmVhdGU9e3Nob3dTa2lsbHNCdXR0b259XG4gICAgICAgICAgICBvblNlbGVjdD17aGFuZGxlU2VsZWN0U2tpbGx9XG4gICAgICAgICAgICBvbkNyZWF0ZT17aGFuZGxlQ3JlYXRlU2tpbGx9XG4gICAgICAgICAgICBvbkNsb3NlPXtoYW5kbGVDbG9zZVNraWxsc0Ryb3Bkb3dufVxuICAgICAgICAgICAgYm90dG9tPXtza2lsbHNEcm9wZG93blBvcy5ib3R0b219XG4gICAgICAgICAgICBsZWZ0PXtza2lsbHNEcm9wZG93blBvcy5sZWZ0fVxuICAgICAgICAgICAgbWF4SGVpZ2h0PXtza2lsbHNEcm9wZG93blBvcy5tYXhIZWlnaHR9XG4gICAgICAgICAgICB6SW5kZXg9e3NsYXNoRHJvcGRvd25aSW5kZXh9XG4gICAgICAgICAgICBhbmNob3JSZWY9e3dyYXBwZXJSZWZ9XG4gICAgICAgICAgLz4sXG4gICAgICAgICAgZG9jdW1lbnQuYm9keVxuICAgICAgICApfVxuICAgIDwvPlxuICApXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQVFFQSxXQUFXLEVBQ1hDLFNBQVMsRUFDVEMsZUFBZSxFQUNmQyxPQUFPLEVBQ1BDLE1BQU0sRUFDTkMsUUFBUSxRQUNILE9BQU87QUFDZCxTQUFTQyxZQUFZLFFBQVEsV0FBVztBQUN4QyxTQUFTQyxPQUFPLFFBQVEsZUFBZTtBQUN2QyxTQUFTQyxLQUFLLFFBQVEsd0NBQXdDO0FBQzlELFNBQVNDLEtBQUssUUFBUSx3Q0FBd0M7QUFDOUQsU0FBU0MsT0FBTyxRQUFRLDhDQUE4QztBQUV0RSxTQUNFQyx3QkFBd0IsRUFDeEJDLG1CQUFtQixFQUNuQkMsa0JBQWtCLEVBQ2xCQyxlQUFlLEVBQ2ZDLG1CQUFtQixFQUNuQkMsa0JBQWtCLEVBQ2xCQyxpQkFBaUIsRUFDakJDLGFBQWEsRUFDYkMsZ0JBQWdCLEVBQ2hCQyxnQkFBZ0IsRUFDaEJDLGtCQUFrQixFQUNsQkMsZUFBZSxFQUNmQyxxQkFBcUIsRUFDckJDLHFCQUFxQixFQUNyQkMsY0FBYyxFQUNkQyx3QkFBd0IsRUFDeEJDLHNCQUFzQixFQUN0QkMsa0JBQWtCLEVBQ2xCQyxrQkFBa0IsRUFDbEJDLHNCQUFzQixFQUN0QkMsb0JBQW9CLEVBQ3BCQyx5QkFBeUIsRUFDekJDLGlCQUFpQixFQUNqQkMsaUJBQWlCLEVBQ2pCQyx5QkFBeUIsRUFDekJDLHlCQUF5QixFQUN6QkMsb0JBQW9CLEVBQ3BCQyxrQkFBa0IsRUFDbEJDLHFCQUFxQixRQUNo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