@projectcor/maia-components 2.50.1-2 → 2.51.1

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 (429) hide show
  1. package/README.md +2 -0
  2. package/lib/App.js +19 -44
  3. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +1 -3
  4. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.js +1 -3
  5. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +14 -24
  6. package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.js +10 -28
  7. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +15 -19
  8. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +4 -8
  9. package/lib/components/atoms/ClientSelector/ClientSelector.js +13 -15
  10. package/lib/components/atoms/Fade/Fade.js +6 -10
  11. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +1 -3
  12. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +7 -19
  13. package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.js +2 -3
  14. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +2 -3
  15. package/lib/components/atoms/MAIAInput/MAIAInput.js +99 -123
  16. package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.js +4 -9
  17. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.js +5 -4
  18. package/lib/components/atoms/OptionCorPermission/OptionCorPermission.js +26 -28
  19. package/lib/components/atoms/OptionCorPermission/OptionCorPermission.styles.js +14 -15
  20. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +2 -7
  21. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +24 -41
  22. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +10 -25
  23. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +43 -78
  24. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.js +11 -9
  25. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +15 -37
  26. package/lib/components/index.js +1 -2
  27. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +8 -6
  28. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +4 -6
  29. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +16 -25
  30. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +3 -7
  31. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +72 -93
  32. package/lib/components/molecules/ChatAIHome/styles.js +78 -85
  33. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +14 -30
  34. package/lib/components/molecules/ChatAIMessages/newStyles.js +35 -32
  35. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +3 -9
  36. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +20 -25
  37. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +2 -2
  38. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +153 -15
  39. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +26 -2
  40. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +367 -63
  41. package/lib/components/molecules/ChatFooter/ChatFooter.js +4 -10
  42. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +2 -5
  43. package/lib/components/molecules/Sidebar/Sidebar.js +49 -57
  44. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +2 -2
  45. package/lib/components/organisms/ChatAI/ChatAI.js +14 -1
  46. package/lib/components/organisms/ProjectSummary/ProjectSummary.js +7 -11
  47. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.js +1 -4
  48. package/lib/constants/permissions/index.js +2 -2
  49. package/lib/constants/permissions/utils.js +1 -4
  50. package/lib/dev/DevReasoningTimeline.js +37 -68
  51. package/lib/dev/Providers.js +3 -5
  52. package/lib/hooks/useAgentModel/useUpdateAgent.js +6 -7
  53. package/lib/hooks/useChatManager/useChatManager.helpers.js +3 -3
  54. package/lib/hooks/useChatManager/useChatManager.js +7 -8
  55. package/lib/hooks/useEntitySearch.js +1 -3
  56. package/lib/hooks/useFrequentlyUsedActions.js +22 -61
  57. package/lib/hooks/useKnowledge/downloadKnowledge.js +4 -4
  58. package/lib/hooks/useKnowledge/useKnowledgeOperations.js +15 -16
  59. package/lib/hooks/useProjectSummaryConfig.js +5 -10
  60. package/lib/index.js +2 -5
  61. package/lib/lang/br/index.js +2 -27
  62. package/lib/lang/en/index.js +2 -27
  63. package/lib/lang/es/index.js +2 -27
  64. package/lib/lang/fr/index.js +2 -27
  65. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
  66. package/lib/services/maia/Agents/connectors.js +1 -3
  67. package/lib/services/maia/Chats/getChatsByUserId.js +6 -5
  68. package/lib/store/sessions/sessionStreamManager.js +55 -51
  69. package/lib/store/useChatsStore.js +7 -6
  70. package/lib/styles/cascade.js +3 -29
  71. package/lib/styles/transitions.js +1 -3
  72. package/lib/types/global.d.js +1 -1
  73. package/lib/utils/hoursPlannerQuickActionType.js +1 -116
  74. package/lib/utils/imagePreprocessor.js +3 -14
  75. package/lib/utils/navigateContextEntity.js +2 -2
  76. package/lib/utils/openTaskInCorPanel.js +2 -2
  77. package/lib/utils/streamActivityMessages.helpers.js +4 -5
  78. package/lib/utils/streamActivityMessages.js +20 -32
  79. package/package.json +1 -1
  80. package/lib/components/atoms/ActionableButton.spec.js +0 -111
  81. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.spec.js +0 -52
  82. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.spec.js +0 -11
  83. package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.spec.js +0 -63
  84. package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +0 -183
  85. package/lib/components/atoms/AttachmentCard/AttachmentCard.spec.js +0 -123
  86. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.spec.js +0 -139
  87. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.spec.js +0 -385
  88. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.spec.js +0 -78
  89. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.spec.js +0 -94
  90. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.spec.js +0 -396
  91. package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.spec.js +0 -80
  92. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.spec.js +0 -526
  93. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.spec.js +0 -169
  94. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.spec.js +0 -11
  95. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.spec.js +0 -77
  96. package/lib/components/atoms/Backdrop/Backdrop.spec.js +0 -28
  97. package/lib/components/atoms/CardMenu/CardMenu.spec.js +0 -56
  98. package/lib/components/atoms/ChatClientSelector/ChatClientSelector.spec.js +0 -67
  99. package/lib/components/atoms/Checkbox/Checkbox.spec.js +0 -27
  100. package/lib/components/atoms/Chip/Chip.spec.js +0 -82
  101. package/lib/components/atoms/ChipLlm/ChipLlm.spec.js +0 -26
  102. package/lib/components/atoms/ClientSelector/ClientSelector.helpers.spec.js +0 -45
  103. package/lib/components/atoms/ClientSelector/ClientSelector.spec.js +0 -133
  104. package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.spec.js +0 -107
  105. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +0 -29
  106. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.spec.js +0 -46
  107. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.spec.js +0 -109
  108. package/lib/components/atoms/ContextMentionChip/buildChipElement.spec.js +0 -81
  109. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.spec.js +0 -92
  110. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.spec.js +0 -319
  111. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.spec.js +0 -107
  112. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.spec.js +0 -136
  113. package/lib/components/atoms/CopyToClipboard.spec.js +0 -74
  114. package/lib/components/atoms/EditableLabel/EditableLabel.spec.js +0 -76
  115. package/lib/components/atoms/EntitySelector/EntitySelector.spec.js +0 -86
  116. package/lib/components/atoms/Expand/Expand.spec.js +0 -57
  117. package/lib/components/atoms/Fade/Fade.spec.js +0 -66
  118. package/lib/components/atoms/FeedbackButton/FeedbackButton.spec.js +0 -75
  119. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.spec.js +0 -104
  120. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.spec.js +0 -91
  121. package/lib/components/atoms/HelpButton.spec.js +0 -87
  122. package/lib/components/atoms/ImagePreview/ImagePreview.spec.js +0 -96
  123. package/lib/components/atoms/ListMenuOption/ListMenuOption.spec.js +0 -54
  124. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.spec.js +0 -21
  125. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.spec.js +0 -20
  126. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.spec.js +0 -26
  127. package/lib/components/atoms/LoadingText/LoadingText.spec.js +0 -25
  128. package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +0 -42
  129. package/lib/components/atoms/MAIAError/MAIAError.spec.js +0 -27
  130. package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.spec.js +0 -113
  131. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.spec.js +0 -381
  132. package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +0 -719
  133. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.spec.js +0 -92
  134. package/lib/components/atoms/MAIAInput/MAIAInputEditor.spec.js +0 -193
  135. package/lib/components/atoms/MAIAInput/maiaInputLayout.spec.js +0 -32
  136. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.spec.js +0 -64
  137. package/lib/components/atoms/MaiaWrapper/MaiaWrapper.spec.js +0 -43
  138. package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.spec.js +0 -114
  139. package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.spec.js +0 -51
  140. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.spec.js +0 -48
  141. package/lib/components/atoms/ModalProject/ModalProject.spec.js +0 -66
  142. package/lib/components/atoms/NextPageLoader.spec.js +0 -37
  143. package/lib/components/atoms/OnboardingModalButton/OnboardingModal.spec.js +0 -20
  144. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.spec.js +0 -35
  145. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.spec.js +0 -47
  146. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.spec.js +0 -146
  147. package/lib/components/atoms/PrimaryButton.spec.js +0 -42
  148. package/lib/components/atoms/ProjectSelector/ProjectSelector.spec.js +0 -69
  149. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +0 -69
  150. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +0 -59
  151. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +0 -170
  152. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.spec.js +0 -199
  153. package/lib/components/atoms/ReasoningBlock/reasoningLeading.spec.js +0 -70
  154. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +0 -120
  155. package/lib/components/atoms/ReasoningBlock/reasoningMotion.js +0 -8
  156. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.spec.js +0 -31
  157. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +0 -52
  158. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +0 -90
  159. package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.js +0 -29
  160. package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.spec.js +0 -38
  161. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.spec.js +0 -16
  162. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +0 -107
  163. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.spec.js +0 -24
  164. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.spec.js +0 -71
  165. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +0 -120
  166. package/lib/components/atoms/Switch/Switch.spec.js +0 -41
  167. package/lib/components/atoms/TextArea/CustomTextArea.spec.js +0 -52
  168. package/lib/components/atoms/TextArea/TextArea.helpers.spec.js +0 -25
  169. package/lib/components/atoms/TextArea/TextArea.spec.js +0 -126
  170. package/lib/components/atoms/ThirdButton.spec.js +0 -29
  171. package/lib/components/atoms/VideoModal/VideoModal.spec.js +0 -68
  172. package/lib/components/atoms/WithAppCfg.spec.js +0 -82
  173. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.spec.js +0 -53
  174. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +0 -742
  175. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.spec.js +0 -107
  176. package/lib/components/molecules/AbmSection/AbmGeneralSection.spec.js +0 -256
  177. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.spec.js +0 -175
  178. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.spec.js +0 -318
  179. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.spec.js +0 -50
  180. package/lib/components/molecules/AbmSection/AbmLoaderFiles.spec.js +0 -94
  181. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +0 -83
  182. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +0 -30
  183. package/lib/components/molecules/AgentInputBlock/index.js +0 -5
  184. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +0 -52
  185. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +0 -76
  186. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +0 -20
  187. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +0 -34
  188. package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +0 -36
  189. package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.spec.js +0 -66
  190. package/lib/components/molecules/ChatAIContent/ChatAIContent.spec.js +0 -145
  191. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.spec.js +0 -204
  192. package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.spec.js +0 -622
  193. package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +0 -264
  194. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.spec.js +0 -86
  195. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +0 -104
  196. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.spec.js +0 -742
  197. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +0 -541
  198. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +0 -46
  199. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +0 -1394
  200. package/lib/components/molecules/ChatAIModal/ChatAIModal.spec.js +0 -1401
  201. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.spec.js +0 -33
  202. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.spec.js +0 -116
  203. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.spec.js +0 -134
  204. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.spec.js +0 -142
  205. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.spec.js +0 -241
  206. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.utils.js +0 -69
  207. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.utils.spec.js +0 -144
  208. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeaderAgentDropdown.js +0 -95
  209. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeaderAgentSelector.js +0 -174
  210. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeaderLayoutMenu.js +0 -99
  211. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeaderLayoutMenu.spec.js +0 -65
  212. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +0 -37
  213. package/lib/components/molecules/ChatAIModal/constants.spec.js +0 -16
  214. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.spec.js +0 -22
  215. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.spec.js +0 -67
  216. package/lib/components/molecules/ChatAIModal/layout.spec.js +0 -72
  217. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.spec.js +0 -93
  218. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.spec.js +0 -297
  219. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.spec.js +0 -62
  220. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +0 -221
  221. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.spec.js +0 -66
  222. package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +0 -369
  223. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.spec.js +0 -10
  224. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.spec.js +0 -104
  225. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.spec.js +0 -139
  226. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +0 -84
  227. package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +0 -116
  228. package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.spec.js +0 -126
  229. package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.spec.js +0 -115
  230. package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.spec.js +0 -79
  231. package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.spec.js +0 -37
  232. package/lib/components/molecules/Sidebar/Sidebar.helpers.spec.js +0 -119
  233. package/lib/components/molecules/Sidebar/Sidebar.spec.js +0 -464
  234. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.spec.js +0 -1067
  235. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +0 -1236
  236. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.spec.js +0 -112
  237. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.spec.js +0 -77
  238. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +0 -503
  239. package/lib/components/organisms/ChatAI/ChatAI.spec.js +0 -174
  240. package/lib/components/organisms/ChatAIPage/ChatAIPage.js +0 -525
  241. package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +0 -246
  242. package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +0 -16
  243. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +0 -253
  244. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +0 -291
  245. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +0 -13
  246. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +0 -284
  247. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +0 -343
  248. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +0 -197
  249. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +0 -94
  250. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +0 -69
  251. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +0 -38
  252. package/lib/components/organisms/ChatAIPage/getDaypart.js +0 -9
  253. package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +0 -19
  254. package/lib/components/organisms/ChatAIPage/index.js +0 -3
  255. package/lib/components/organisms/ClientAIButton/ClientAIButton.spec.js +0 -53
  256. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +0 -59
  257. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +0 -79
  258. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +0 -86
  259. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.spec.js +0 -49
  260. package/lib/components/organisms/ProjectAIButton/ProjectAIButton.spec.js +0 -67
  261. package/lib/components/organisms/ProjectSummary/ProjectSummary.spec.js +0 -117
  262. package/lib/components/organisms/SnackBar/Snackbar.spec.js +0 -66
  263. package/lib/components/organisms/SourcesInformation/SourceItem.spec.js +0 -19
  264. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.spec.js +0 -52
  265. package/lib/constants/formatExtensions.spec.js +0 -15
  266. package/lib/constants/maiaExternalConnectorsAccess.spec.js +0 -29
  267. package/lib/constants/maiaFeatureAccess.spec.js +0 -30
  268. package/lib/constants/maiaHourAgentAccess.spec.js +0 -30
  269. package/lib/constants/maiaTaskPanelAccess.spec.js +0 -41
  270. package/lib/constants/permissions/clientRoleAccess.spec.js +0 -65
  271. package/lib/constants/permissions/utils.spec.js +0 -128
  272. package/lib/constants/plannerSyncEvents.spec.js +0 -31
  273. package/lib/constants/taskUrls.spec.js +0 -9
  274. package/lib/dev/DevMaiaPage.js +0 -30
  275. package/lib/hooks/frequentlyUsedActionsCache.js +0 -17
  276. package/lib/hooks/frequentlyUsedActionsCache.spec.js +0 -25
  277. package/lib/hooks/useAccessClient/useAccessClient.spec.js +0 -149
  278. package/lib/hooks/useAgentModel/useAgentModel.spec.js +0 -83
  279. package/lib/hooks/useAgentModel/useCreateAgent.helpers.spec.js +0 -268
  280. package/lib/hooks/useAgentModel/useCreateAgent.spec.js +0 -314
  281. package/lib/hooks/useAgentModel/useDeleteAgent.spec.js +0 -183
  282. package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +0 -374
  283. package/lib/hooks/useAgentSuggestions.spec.js +0 -89
  284. package/lib/hooks/useCaretPosition.spec.js +0 -58
  285. package/lib/hooks/useChatManager/useChatManager.helpers.spec.js +0 -2027
  286. package/lib/hooks/useChatManager/useChatManager.spec.js +0 -2409
  287. package/lib/hooks/useChatMessages/useChatMessages.helpers.spec.js +0 -491
  288. package/lib/hooks/useChatMessages/useChatMessages.spec.js +0 -729
  289. package/lib/hooks/useChats/useChats.spec.js +0 -208
  290. package/lib/hooks/useClientSearch.helpers.spec.js +0 -52
  291. package/lib/hooks/useClientSearch.spec.js +0 -86
  292. package/lib/hooks/useContextMentions.helpers.spec.js +0 -267
  293. package/lib/hooks/useContextMentions.spec.js +0 -338
  294. package/lib/hooks/useContextPinPopover.helpers.spec.js +0 -183
  295. package/lib/hooks/useContextPinPopover.spec.js +0 -159
  296. package/lib/hooks/useContinueLegacyContextInNewChat/index.js +0 -2
  297. package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +0 -93
  298. package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.spec.js +0 -257
  299. package/lib/hooks/useDebounce.spec.js +0 -42
  300. package/lib/hooks/useEntitySearch.helpers.spec.js +0 -723
  301. package/lib/hooks/useEntitySearch.spec.js +0 -718
  302. package/lib/hooks/useEvent.spec.js +0 -45
  303. package/lib/hooks/useFrequentlyAskedQuestions.spec.js +0 -222
  304. package/lib/hooks/useFrequentlyUsedActions.spec.js +0 -293
  305. package/lib/hooks/useIsMaiaPageRoute.spec.js +0 -26
  306. package/lib/hooks/useKnowledge/deleteKnowledge.spec.js +0 -122
  307. package/lib/hooks/useKnowledge/downloadKnowledge.spec.js +0 -148
  308. package/lib/hooks/useKnowledge/saveKnowledge.spec.js +0 -104
  309. package/lib/hooks/useKnowledge/useKnowledgeOperations.spec.js +0 -178
  310. package/lib/hooks/useMaiaChatSessionMeta/index.js +0 -2
  311. package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +0 -24
  312. package/lib/hooks/useMentionAllowedTypes.spec.js +0 -89
  313. package/lib/hooks/useMentionPopover.helpers.spec.js +0 -100
  314. package/lib/hooks/useMentionPopover.spec.js +0 -392
  315. package/lib/hooks/useMinimizedPillBottomOffset.helpers.spec.js +0 -176
  316. package/lib/hooks/useMinimizedPillBottomOffset.spec.js +0 -89
  317. package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +0 -67
  318. package/lib/hooks/useModal/useModal.spec.js +0 -73
  319. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.spec.js +0 -138
  320. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.spec.js +0 -417
  321. package/lib/hooks/useProjectSearch.helpers.spec.js +0 -89
  322. package/lib/hooks/useProjectSearch.spec.js +0 -91
  323. package/lib/hooks/useProjectSummary.spec.js +0 -193
  324. package/lib/hooks/useProjectSummaryConfig.helpers.spec.js +0 -151
  325. package/lib/hooks/useProjectSummaryConfig.spec.js +0 -133
  326. package/lib/hooks/useReasoningTrace/reasoningStore.spec.js +0 -112
  327. package/lib/hooks/useRecentClientsSearch.helpers.spec.js +0 -33
  328. package/lib/hooks/useRecentClientsSearch.spec.js +0 -85
  329. package/lib/hooks/useRecentContexts.spec.js +0 -139
  330. package/lib/hooks/useResize.spec.js +0 -37
  331. package/lib/hooks/useSkillsCatalog.spec.js +0 -88
  332. package/lib/hooks/useSlashCommands.spec.js +0 -139
  333. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.spec.js +0 -101
  334. package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +0 -33
  335. package/lib/hooks/useStreamResponse.spec.js +0 -199
  336. package/lib/hooks/useT.spec.js +0 -20
  337. package/lib/hooks/useToggle.spec.js +0 -33
  338. package/lib/hooks/useToggleFavorite/useToggleFavorite.spec.js +0 -171
  339. package/lib/services/appcues.spec.js +0 -37
  340. package/lib/services/maia/Access/updateAccess.spec.js +0 -137
  341. package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +0 -121
  342. package/lib/services/maia/Actions/getSlashCommands.spec.js +0 -91
  343. package/lib/services/maia/Agents/connectors.spec.js +0 -496
  344. package/lib/services/maia/Agents/createAgent.spec.js +0 -55
  345. package/lib/services/maia/Agents/deleteAgent.spec.js +0 -57
  346. package/lib/services/maia/Agents/fetchAgentDetail.spec.js +0 -108
  347. package/lib/services/maia/Agents/getAgentById.spec.js +0 -190
  348. package/lib/services/maia/Agents/getAgentModels.spec.js +0 -190
  349. package/lib/services/maia/Agents/getAgentSuggestions.spec.js +0 -89
  350. package/lib/services/maia/Agents/getAgents.helpers.spec.js +0 -325
  351. package/lib/services/maia/Agents/getAgents.spec.js +0 -1135
  352. package/lib/services/maia/Agents/setAgentToolGroups.spec.js +0 -45
  353. package/lib/services/maia/Agents/toggleFavorite.spec.js +0 -59
  354. package/lib/services/maia/Agents/updateAgent.spec.js +0 -48
  355. package/lib/services/maia/Chats/deleteChat.spec.js +0 -31
  356. package/lib/services/maia/Chats/getChatMessages.spec.js +0 -150
  357. package/lib/services/maia/Chats/getChatsByUserId.spec.js +0 -149
  358. package/lib/services/maia/Chats/markSessionAsRead.spec.js +0 -30
  359. package/lib/services/maia/Chats/patchChat.spec.js +0 -41
  360. package/lib/services/maia/Chats/wasHelpfulChat.spec.js +0 -28
  361. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +0 -58
  362. package/lib/services/maia/Knowledge/delete.spec.js +0 -45
  363. package/lib/services/maia/Knowledge/download.spec.js +0 -78
  364. package/lib/services/maia/Knowledge/save.spec.js +0 -58
  365. package/lib/services/maia/Orchestrator/orchestrator.helpers.spec.js +0 -225
  366. package/lib/services/maia/Orchestrator/orchestrator.spec.js +0 -181
  367. package/lib/services/maia/RecentClients/getRecentClients.spec.js +0 -52
  368. package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +0 -103
  369. package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +0 -82
  370. package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +0 -63
  371. package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +0 -82
  372. package/lib/services/maia/Skills/createSkill.spec.js +0 -68
  373. package/lib/services/maia/Skills/deleteSkill.spec.js +0 -42
  374. package/lib/services/maia/Skills/generateSkill.spec.js +0 -48
  375. package/lib/services/maia/Skills/getSkills.spec.js +0 -152
  376. package/lib/services/maia/Skills/updateSkill.spec.js +0 -62
  377. package/lib/services/maia/client.spec.js +0 -56
  378. package/lib/services/utils/fetchCOR.spec.js +0 -211
  379. package/lib/services/utils/getCookie.spec.js +0 -20
  380. package/lib/services/utils/mapChatMessages.helpers.spec.js +0 -336
  381. package/lib/services/utils/mapChatMessages.spec.js +0 -254
  382. package/lib/store/chatsSidebarOptimistic.spec.js +0 -145
  383. package/lib/store/maiaLastChatPersistence.spec.js +0 -22
  384. package/lib/store/maiaPanelSessionPersistence.spec.js +0 -62
  385. package/lib/store/sessions/sessionNotificationSound.spec.js +0 -145
  386. package/lib/store/sessions/sessionNotifications.helpers.spec.js +0 -63
  387. package/lib/store/sessions/sessionNotifications.spec.js +0 -106
  388. package/lib/store/sessions/sessionStreamManager.helpers.spec.js +0 -177
  389. package/lib/store/sessions/sessionStreamManager.spec.js +0 -939
  390. package/lib/store/sessions/sessions.types.spec.js +0 -16
  391. package/lib/store/sessions/useSessionsStore.spec.js +0 -135
  392. package/lib/store/useChatsStore.spec.js +0 -619
  393. package/lib/store/useFaqsStore.spec.js +0 -57
  394. package/lib/utils/actionCategoryMap.spec.js +0 -18
  395. package/lib/utils/agentDisplayName.spec.js +0 -48
  396. package/lib/utils/autoApproveStorage.spec.js +0 -25
  397. package/lib/utils/chatInputFiles.spec.js +0 -39
  398. package/lib/utils/contextMentionIcons.spec.js +0 -41
  399. package/lib/utils/contextMentionLabel.spec.js +0 -13
  400. package/lib/utils/contextMentionTriggers.spec.js +0 -44
  401. package/lib/utils/contextMentionTypeLabel.spec.js +0 -14
  402. package/lib/utils/corConnectorMentionTypes.spec.js +0 -23
  403. package/lib/utils/entityLinkRender.spec.js +0 -72
  404. package/lib/utils/fileDownloadHelper.spec.js +0 -67
  405. package/lib/utils/formatQuickActionMessage.spec.js +0 -27
  406. package/lib/utils/formatUnreadCount.spec.js +0 -12
  407. package/lib/utils/getUnitFileSize.spec.js +0 -18
  408. package/lib/utils/hitlAnalytics.spec.js +0 -136
  409. package/lib/utils/hoursPlannerQuickActionType.spec.js +0 -124
  410. package/lib/utils/imagePreprocessor.helpers.spec.js +0 -28
  411. package/lib/utils/imagePreprocessor.spec.js +0 -112
  412. package/lib/utils/maiaPageRoute.spec.js +0 -23
  413. package/lib/utils/mapBackendLang.spec.js +0 -19
  414. package/lib/utils/navigateContextEntity.spec.js +0 -50
  415. package/lib/utils/normalizeAgentConnectors.spec.js +0 -98
  416. package/lib/utils/openTaskInCorPanel.spec.js +0 -43
  417. package/lib/utils/orchestratorSubagents.spec.js +0 -32
  418. package/lib/utils/reasoningMappers.spec.js +0 -103
  419. package/lib/utils/recentContextsHomeLimit.spec.js +0 -32
  420. package/lib/utils/renderContextMentions.helpers.spec.js +0 -87
  421. package/lib/utils/renderContextMentions.spec.js +0 -268
  422. package/lib/utils/retryCompletion.spec.js +0 -181
  423. package/lib/utils/skillContentSize.spec.js +0 -13
  424. package/lib/utils/slashCommandMarker.spec.js +0 -43
  425. package/lib/utils/sortManagerHoursHomeFuas.spec.js +0 -51
  426. package/lib/utils/sseStreamContent.spec.js +0 -31
  427. package/lib/utils/streamActivityMessages.helpers.spec.js +0 -84
  428. package/lib/utils/streamActivityMessages.spec.js +0 -336
  429. package/lib/utils/validateTrimmedFields.spec.js +0 -26
@@ -1,742 +0,0 @@
1
- import { Feedback } from '../MessageFeedback/MessageFeedback';
2
- import { ChatHistoryRole } from '../../../types/Chat';
3
- import { canOpenAttachmentPreview, canRetryAssistantMessage, computeDistanceFromBottom, computeRemovableTurnSpace, computeReservedTurnSpace, computeSyncedTurnSpacerHeight, computeTurnScrollDurationMs, computeTurnScrollTargetTop, countUserMessageAttachments, easeOutExpoScrollProgress, extractFeedbackSessionId, findLastQuestionId, hasInitialUserMessageInList, hasMessageLevelStreamIndicator, isActiveStreamingState, isAnswerOrQuestionChatMessageId, isApprovalChatMessage, isAssistantChatMessage, isAudioAttachment, isContainerAtScrollBottom, isCurrentUserMessage, isNearScrollBottom, isNewChatMessageEvent, isRetrySuggestionSelection, isScrollingUpward, resolveAttachmentDownloadBlobStrategy, resolveAttachmentDownloadFileName, resolveAttachmentDownloadUrl, resolveChatListItemStreamingFlags, resolveDisableFeedbackFromWasHelpful, resolveMessageAttachments, resolveRetryAttachmentsFromUserMessage, resolveScrollNearBottomThreshold, shouldAutoScrollOnMessagesChange, shouldDrainTurnSpaceOnScroll, shouldHideAssistantSuggestions, shouldHideEmptyStreamingBody, shouldIgnoreSuggestionClick, shouldOpenMessageOption, shouldPersistMaiaPanelScroll, shouldReleaseTurnSpace, shouldRenderAssistantFeedback, shouldRenderAssistantSuggestions, shouldRenderChangeProjectMessage, shouldRenderCreateAgentActions, shouldRenderMessageTextBody, shouldRunStreamTurnSyncEffect, shouldShowApprovalActions, shouldShowBottomScrollGradient, shouldShowGlobalStreamLoadingIndicator, shouldShowMessageAttachmentsRow, shouldShowScrollToBottom, shouldShowStreamActivityIndicator, shouldShowStreamingMessageBody, shouldShowTopScrollGradient, shouldSkipEmptyChatListMessage, shouldSkipTurnScrollAnimation, shouldSkipTurnSpaceReservation, shouldUpdateSpacerHeight, turnAnchorOffset, buildSmoothStreamTextOptions, computeMeasureTurnLayout, detectJustFinishedLoadingMessages, processChatMessagesScrollFrame, readSmoothStreamWindowFlags, resolveContainerAtBottom, resolveStreamingMessageHookId, resolveCreateAgentActionsAgentId, resolveLastUserMessageForAttachments, resolveFeedbackPropsForCancelled, resolveReserveTurnSpacePlan, resolveScrollToBottomTargetTop, resolveMessageListItemKey, resolvePendingScrollTopFromSession, resolveReasoningTraceHookId, resolveScrollOnParentMode, resolveStreamingRawText, resolveStreamingTextHookId, resolveSuggestionAnalyticsAgentType, shouldApplyPendingScrollRestore, shouldClearLastReservedQuestion, shouldClearScrollRestoreWithoutChat, shouldInitializeChat, shouldRenderMentionInlineNodes, shouldRestoreScrollOnExpandedChange, shouldRunSessionCacheScrollToBottom, shouldScheduleTurnSpaceReservation, shouldScrollToBottomAfterLoad, shouldSkipMessagesScrollEffect, shouldUpdateScrollAffordancesOnLoadEnd } from './ChatAIMessages.helpers';
4
- describe('ChatAIMessages.helpers', function () {
5
- describe('turnAnchorOffset', function () {
6
- it('caps the offset at 200px', function () {
7
- expect(turnAnchorOffset(500)).toBe(90);
8
- expect(turnAnchorOffset(2000)).toBe(200);
9
- });
10
- });
11
- describe('computeTurnScrollDurationMs', function () {
12
- it('scales duration with scroll distance', function () {
13
- expect(computeTurnScrollDurationMs(0)).toBe(600);
14
- expect(computeTurnScrollDurationMs(1200)).toBe(800);
15
- });
16
- });
17
- describe('scroll affordances', function () {
18
- it('computes distance from bottom excluding spacer height', function () {
19
- expect(computeDistanceFromBottom(1000, 200, 300, 400)).toBe(100);
20
- });
21
- it('shows the scroll button only when far enough from the bottom', function () {
22
- expect(shouldShowScrollToBottom(60)).toBe(true);
23
- expect(shouldShowScrollToBottom(20)).toBe(false);
24
- });
25
- it('toggles top and bottom scroll gradients past the threshold', function () {
26
- expect(shouldShowTopScrollGradient(0)).toBe(false);
27
- expect(shouldShowTopScrollGradient(2)).toBe(true);
28
- expect(shouldShowBottomScrollGradient(0)).toBe(false);
29
- expect(shouldShowBottomScrollGradient(5)).toBe(true);
30
- });
31
- it('detects upward scroll and near-bottom with adaptive threshold', function () {
32
- expect(isScrollingUpward(10, 20)).toBe(true);
33
- expect(isNearScrollBottom(500, 400, 100, 50)).toBe(true);
34
- expect(resolveScrollNearBottomThreshold(39, true, false)).toBe(15);
35
- expect(resolveScrollNearBottomThreshold(15, false, true)).toBe(39);
36
- expect(resolveScrollNearBottomThreshold(25, false, false)).toBe(25);
37
- });
38
- it('skips tiny turn scroll animations and eases progress', function () {
39
- expect(shouldSkipTurnScrollAnimation(0.5)).toBe(true);
40
- expect(shouldSkipTurnScrollAnimation(10)).toBe(false);
41
- expect(easeOutExpoScrollProgress(1)).toBe(1);
42
- expect(easeOutExpoScrollProgress(0)).toBe(0);
43
- });
44
- it('computes turn scroll targets and reservation skips', function () {
45
- expect(computeTurnScrollTargetTop(300, 500)).toBe(210);
46
- expect(shouldSkipTurnSpaceReservation(100, 50)).toBe(true);
47
- expect(shouldSkipTurnSpaceReservation(50, 100)).toBe(false);
48
- });
49
- it('updates spacer height only when the delta is meaningful', function () {
50
- expect(shouldUpdateSpacerHeight(100, 100.5)).toBe(false);
51
- expect(shouldUpdateSpacerHeight(100, 102)).toBe(true);
52
- });
53
- it('syncs turn spacer height without growing reserved space', function () {
54
- expect(computeSyncedTurnSpacerHeight(800, 600, 200)).toBe(56);
55
- expect(computeSyncedTurnSpacerHeight(800, 600, 40)).toBe(40);
56
- });
57
- it('drains or releases turn space based on anchor state', function () {
58
- expect(shouldDrainTurnSpaceOnScroll(null)).toBe(true);
59
- expect(shouldDrainTurnSpaceOnScroll('question-1')).toBe(false);
60
- expect(shouldReleaseTurnSpace(null, 0)).toBe(false);
61
- expect(shouldReleaseTurnSpace('question-1', 0)).toBe(true);
62
- expect(shouldReleaseTurnSpace(null, 50)).toBe(true);
63
- });
64
- it('persists panel scroll only for active sessions scrolled away from top', function () {
65
- expect(shouldPersistMaiaPanelScroll('chat-1', 10)).toBe(true);
66
- expect(shouldPersistMaiaPanelScroll('chat-1', 0)).toBe(false);
67
- expect(shouldPersistMaiaPanelScroll(null, 10)).toBe(false);
68
- });
69
- it('detects bottom alignment with tolerance', function () {
70
- expect(isContainerAtScrollBottom(1000, 900, 100)).toBe(true);
71
- expect(isContainerAtScrollBottom(1000, 700, 100)).toBe(false);
72
- });
73
- });
74
- describe('message list scroll decisions', function () {
75
- it('detects new message events', function () {
76
- expect(isNewChatMessageEvent('a', 'a', 3, 3)).toBe(false);
77
- expect(isNewChatMessageEvent('b', 'a', 3, 3)).toBe(true);
78
- expect(isNewChatMessageEvent('a', 'a', 4, 3)).toBe(true);
79
- });
80
- it('classifies approval and answer/question ids', function () {
81
- expect(isApprovalChatMessage({
82
- id: 'approval-1'
83
- })).toBe(true);
84
- expect(isApprovalChatMessage({
85
- id: 'answer-1',
86
- approval: {}
87
- })).toBe(true);
88
- expect(isApprovalChatMessage({
89
- id: 'answer-1'
90
- })).toBe(false);
91
- expect(isAnswerOrQuestionChatMessageId('question-9')).toBe(true);
92
- expect(isAnswerOrQuestionChatMessageId('other')).toBe(false);
93
- });
94
- it('finds the initial user message marker', function () {
95
- expect(hasInitialUserMessageInList([{
96
- id: 'user-initial-message'
97
- }])).toBe(true);
98
- expect(hasInitialUserMessageInList([{
99
- id: 'question-1'
100
- }])).toBe(false);
101
- });
102
- it('returns scroll, sync-turn or affordances-only', function () {
103
- expect(shouldAutoScrollOnMessagesChange({
104
- isNewMessage: false,
105
- anchoredTurnId: null,
106
- waitingResponse: false,
107
- isWriting: false,
108
- isAtBottom: true,
109
- isAnswerOrQuestion: true,
110
- isApproval: false,
111
- hasInitialMessage: false,
112
- messagesLength: 2,
113
- prevMessagesLength: 2
114
- })).toBe('affordances-only');
115
- expect(shouldAutoScrollOnMessagesChange({
116
- isNewMessage: true,
117
- anchoredTurnId: 'question-1',
118
- waitingResponse: false,
119
- isWriting: false,
120
- isAtBottom: false,
121
- isAnswerOrQuestion: false,
122
- isApproval: false,
123
- hasInitialMessage: false,
124
- messagesLength: 3,
125
- prevMessagesLength: 2
126
- })).toBe('sync-turn');
127
- expect(shouldAutoScrollOnMessagesChange({
128
- isNewMessage: true,
129
- anchoredTurnId: null,
130
- waitingResponse: true,
131
- isWriting: false,
132
- isAtBottom: true,
133
- isAnswerOrQuestion: true,
134
- isApproval: false,
135
- hasInitialMessage: false,
136
- messagesLength: 3,
137
- prevMessagesLength: 2
138
- })).toBe('affordances-only');
139
- expect(shouldAutoScrollOnMessagesChange({
140
- isNewMessage: true,
141
- anchoredTurnId: null,
142
- waitingResponse: false,
143
- isWriting: false,
144
- isAtBottom: true,
145
- isAnswerOrQuestion: true,
146
- isApproval: false,
147
- hasInitialMessage: false,
148
- messagesLength: 3,
149
- prevMessagesLength: 2
150
- })).toBe('scroll');
151
- expect(shouldAutoScrollOnMessagesChange({
152
- isNewMessage: true,
153
- anchoredTurnId: null,
154
- waitingResponse: false,
155
- isWriting: false,
156
- isAtBottom: false,
157
- isAnswerOrQuestion: false,
158
- isApproval: false,
159
- hasInitialMessage: false,
160
- messagesLength: 4,
161
- prevMessagesLength: 3
162
- })).toBe('scroll');
163
- });
164
- it('controls stream sync and global loading indicators', function () {
165
- expect(shouldRunStreamTurnSyncEffect(false, false)).toBe(false);
166
- expect(shouldRunStreamTurnSyncEffect(true, false)).toBe(true);
167
- expect(hasMessageLevelStreamIndicator('answer-turn-1-streaming', true, false)).toBe(true);
168
- expect(hasMessageLevelStreamIndicator('answer-1', true, false)).toBe(false);
169
- expect(shouldShowGlobalStreamLoadingIndicator(false, {
170
- type: 'writing'
171
- })).toBe(true);
172
- expect(shouldShowGlobalStreamLoadingIndicator(true, {
173
- type: 'writing'
174
- })).toBe(false);
175
- });
176
- });
177
- describe('message item rendering guards', function () {
178
- it('resolves user and assistant roles', function () {
179
- expect(isCurrentUserMessage(ChatHistoryRole.USER, '9', '9')).toBe(true);
180
- expect(isCurrentUserMessage(ChatHistoryRole.ASSISTANT, '1', '1')).toBe(true);
181
- expect(isAssistantChatMessage(ChatHistoryRole.ASSISTANT, 'assistant')).toBe(true);
182
- expect(isAssistantChatMessage(ChatHistoryRole.USER, 'assistant')).toBe(true);
183
- });
184
- it('derives streaming body and activity indicator flags', function () {
185
- expect(isActiveStreamingState(false, true)).toBe(true);
186
- expect(shouldShowStreamingMessageBody(true, true, false)).toBe(true);
187
- expect(shouldShowStreamingMessageBody(true, true, true)).toBe(false);
188
- expect(shouldShowStreamActivityIndicator(true, true, {
189
- type: 'writing'
190
- })).toBe(true);
191
- expect(shouldShowStreamActivityIndicator(false, true, {
192
- type: 'writing'
193
- })).toBe(false);
194
- });
195
- it('guards change-project, attachments, text body and approval UI', function () {
196
- expect(shouldRenderChangeProjectMessage(true, [{
197
- id: 1
198
- }])).toBe(true);
199
- expect(shouldRenderChangeProjectMessage(true, null)).toBe(false);
200
- expect(shouldShowMessageAttachmentsRow(0)).toBe(false);
201
- expect(shouldShowMessageAttachmentsRow(2)).toBe(true);
202
- expect(shouldRenderMessageTextBody({
203
- messageText: '',
204
- showStreamingBody: true,
205
- isAssistant: true,
206
- attachmentCount: 1
207
- })).toBe(false);
208
- expect(shouldRenderMessageTextBody({
209
- messageText: 'hola',
210
- showStreamingBody: false,
211
- isAssistant: false,
212
- attachmentCount: 0
213
- })).toBe(true);
214
- expect(shouldShowApprovalActions({
215
- pending_actions: []
216
- })).toBe(true);
217
- expect(shouldShowApprovalActions({})).toBe(false);
218
- });
219
- it('hides empty streaming bodies and controls assistant chrome', function () {
220
- expect(shouldHideEmptyStreamingBody('', false)).toBe(true);
221
- expect(shouldHideEmptyStreamingBody('', true)).toBe(false);
222
- expect(shouldRenderAssistantFeedback({
223
- isAssistant: true,
224
- isError: false,
225
- isStreaming: false,
226
- isFrontendCancelled: true,
227
- onRetry: function onRetry() {
228
- return undefined;
229
- }
230
- })).toBe(true);
231
- expect(shouldRenderAssistantFeedback({
232
- isAssistant: true,
233
- isError: true,
234
- isStreaming: false
235
- })).toBe(false);
236
- expect(shouldRenderAssistantSuggestions({
237
- isAssistant: true,
238
- isError: true,
239
- suggestionsLength: 2
240
- })).toBe(true);
241
- expect(shouldRenderAssistantSuggestions({
242
- isAssistant: true,
243
- isError: true,
244
- suggestionsLength: 0
245
- })).toBe(false);
246
- expect(shouldHideAssistantSuggestions(true, true, false)).toBe(true);
247
- expect(shouldHideAssistantSuggestions(false, false, false)).toBe(true);
248
- expect(shouldRenderCreateAgentActions({
249
- isAssistant: true,
250
- agentId: 'agent-1'
251
- })).toBe(true);
252
- });
253
- it('resolves list streaming flags for the last assistant placeholder only', function () {
254
- expect(resolveChatListItemStreamingFlags({
255
- role: ChatHistoryRole.ASSISTANT,
256
- userId: 'assistant',
257
- messageId: 'answer-turn-1-streaming',
258
- isLastMessage: true,
259
- waitingResponse: true,
260
- isWriting: false
261
- })).toEqual({
262
- isStreamingPlaceholder: true,
263
- isStreaming: true
264
- });
265
- expect(resolveChatListItemStreamingFlags({
266
- role: ChatHistoryRole.ASSISTANT,
267
- userId: 'assistant',
268
- messageId: 'answer-turn-1-streaming',
269
- isLastMessage: false,
270
- waitingResponse: true,
271
- isWriting: false
272
- })).toEqual({
273
- isStreamingPlaceholder: false,
274
- isStreaming: false
275
- });
276
- expect(resolveChatListItemStreamingFlags({
277
- role: ChatHistoryRole.ASSISTANT,
278
- userId: 'assistant',
279
- messageId: 'answer-turn-1-streaming',
280
- isLastMessage: true,
281
- waitingResponse: false,
282
- isWriting: true
283
- }).isStreaming).toBe(true);
284
- });
285
- });
286
- describe('suggestions and attachments', function () {
287
- it('ignores empty or already-selected suggestions', function () {
288
- expect(shouldIgnoreSuggestionClick(' ', false)).toBe(true);
289
- expect(shouldIgnoreSuggestionClick('retry', true)).toBe(true);
290
- expect(shouldIgnoreSuggestionClick('go', false)).toBe(false);
291
- });
292
- it('detects retry suggestion selection', function () {
293
- expect(isRetrySuggestionSelection(true, 'Reintentar', 'Reintentar')).toBe(true);
294
- expect(isRetrySuggestionSelection(false, 'Reintentar', 'Reintentar')).toBe(false);
295
- });
296
- it('resolves retry attachments from user message sources', function () {
297
- var attachments = [{
298
- id: '1',
299
- name: 'a.pdf',
300
- size: 1,
301
- type: 'pdf'
302
- }];
303
- expect(resolveRetryAttachmentsFromUserMessage({
304
- attachments: attachments
305
- })).toEqual(attachments);
306
- expect(resolveRetryAttachmentsFromUserMessage({
307
- sources: attachments
308
- })).toEqual(attachments);
309
- expect(resolveRetryAttachmentsFromUserMessage({})).toEqual([]);
310
- });
311
- it('counts attachments from attachments or sources', function () {
312
- expect(countUserMessageAttachments({
313
- attachments: [{
314
- id: '1',
315
- name: 'a',
316
- size: 1,
317
- type: 'pdf'
318
- }]
319
- })).toBe(1);
320
- expect(countUserMessageAttachments({
321
- sources: [{
322
- id: '2'
323
- }]
324
- })).toBe(1);
325
- expect(countUserMessageAttachments(null)).toBe(0);
326
- });
327
- it('picks attachment download strategy', function () {
328
- expect(resolveAttachmentDownloadBlobStrategy('https://a.test', null)).toBe('remote-url');
329
- expect(resolveAttachmentDownloadBlobStrategy(undefined, new File(['x'], 'a.txt'))).toBe('local-file');
330
- expect(resolveAttachmentDownloadBlobStrategy(undefined, null)).toBeNull();
331
- });
332
- it('blocks selecting another project option after one is chosen', function () {
333
- expect(shouldOpenMessageOption(null)).toBe(true);
334
- expect(shouldOpenMessageOption({
335
- id: 1
336
- })).toBe(false);
337
- });
338
- });
339
- describe('extractFeedbackSessionId', function () {
340
- it('removes answer segments from the message id', function () {
341
- expect(extractFeedbackSessionId('question-1-answer-stream-2')).toBe('question-1-stream-2');
342
- });
343
- });
344
- describe('attachments', function () {
345
- it('detects audio attachments by mime type, extension or name', function () {
346
- expect(isAudioAttachment({
347
- type: 'audio/mpeg',
348
- name: 'voice.mp3'
349
- })).toBe(true);
350
- expect(isAudioAttachment({
351
- type: 'mp3',
352
- name: 'voice.mp3'
353
- })).toBe(true);
354
- expect(isAudioAttachment({
355
- type: 'text/plain',
356
- name: 'notes.txt'
357
- })).toBe(false);
358
- });
359
- it('allows preview for local files and remote urls', function () {
360
- expect(canOpenAttachmentPreview({
361
- id: '1',
362
- name: 'a.pdf',
363
- size: 1,
364
- type: 'application/pdf',
365
- file: new File(['x'], 'a.pdf')
366
- })).toBe(true);
367
- expect(canOpenAttachmentPreview({
368
- id: '2',
369
- name: 'b.pdf',
370
- size: 1,
371
- type: 'application/pdf',
372
- url_original: 'https://example.com/b.pdf'
373
- })).toBe(true);
374
- });
375
- });
376
- describe('list message visibility', function () {
377
- it('skips empty messages unless streaming or rich content is present', function () {
378
- expect(shouldSkipEmptyChatListMessage({
379
- isStreamingPlaceholder: false,
380
- isStreaming: false,
381
- attachmentCount: 0,
382
- sourceCount: 0,
383
- messageText: '',
384
- hasApproval: false
385
- })).toBe(true);
386
- expect(shouldSkipEmptyChatListMessage({
387
- isStreamingPlaceholder: true,
388
- isStreaming: false,
389
- attachmentCount: 0,
390
- sourceCount: 0,
391
- messageText: '',
392
- hasApproval: false
393
- })).toBe(false);
394
- expect(shouldSkipEmptyChatListMessage({
395
- isStreamingPlaceholder: false,
396
- isStreaming: true,
397
- attachmentCount: 0,
398
- sourceCount: 0,
399
- messageText: '',
400
- hasApproval: false
401
- })).toBe(false);
402
- expect(shouldSkipEmptyChatListMessage({
403
- isStreamingPlaceholder: false,
404
- isStreaming: false,
405
- attachmentCount: 0,
406
- sourceCount: 1,
407
- messageText: '',
408
- hasApproval: false
409
- })).toBe(false);
410
- expect(shouldSkipEmptyChatListMessage({
411
- isStreamingPlaceholder: false,
412
- isStreaming: false,
413
- attachmentCount: 0,
414
- sourceCount: 0,
415
- messageText: 'hola',
416
- hasApproval: false
417
- })).toBe(false);
418
- expect(shouldSkipEmptyChatListMessage({
419
- isStreamingPlaceholder: false,
420
- isStreaming: false,
421
- attachmentCount: 0,
422
- sourceCount: 0,
423
- messageText: '',
424
- projectName: 'Proyecto',
425
- hasApproval: false
426
- })).toBe(false);
427
- expect(shouldSkipEmptyChatListMessage({
428
- isStreamingPlaceholder: false,
429
- isStreaming: false,
430
- attachmentCount: 1,
431
- sourceCount: 0,
432
- messageText: '',
433
- hasApproval: false
434
- })).toBe(false);
435
- expect(shouldSkipEmptyChatListMessage({
436
- isStreamingPlaceholder: false,
437
- isStreaming: false,
438
- attachmentCount: 0,
439
- sourceCount: 0,
440
- messageText: '',
441
- hasApproval: true
442
- })).toBe(false);
443
- });
444
- });
445
- describe('retry and feedback helpers', function () {
446
- it('maps wasHelpful to feedback enum', function () {
447
- expect(resolveDisableFeedbackFromWasHelpful(undefined)).toBeNull();
448
- expect(resolveDisableFeedbackFromWasHelpful(true)).toBe(Feedback.THUMBS_UP);
449
- expect(resolveDisableFeedbackFromWasHelpful(false)).toBe(Feedback.THUMBS_DOWN);
450
- });
451
- it('allows retry for frontend-cancelled turns with a user message', function () {
452
- expect(canRetryAssistantMessage({
453
- hasUserMessageForRetry: true,
454
- isStreaming: false,
455
- isError: false,
456
- hasApproval: false,
457
- isFrontendCancelled: true,
458
- turnId: null
459
- })).toBe(true);
460
- });
461
- it('blocks retry when streaming, error, approval or missing user message', function () {
462
- expect(canRetryAssistantMessage({
463
- hasUserMessageForRetry: false,
464
- isStreaming: false,
465
- isError: false,
466
- hasApproval: false,
467
- turnId: 'turn-1'
468
- })).toBe(false);
469
- expect(canRetryAssistantMessage({
470
- hasUserMessageForRetry: true,
471
- isStreaming: true,
472
- isError: false,
473
- hasApproval: false,
474
- turnId: 'turn-1'
475
- })).toBe(false);
476
- expect(canRetryAssistantMessage({
477
- hasUserMessageForRetry: true,
478
- isStreaming: false,
479
- isError: true,
480
- hasApproval: false,
481
- turnId: 'turn-1'
482
- })).toBe(false);
483
- expect(canRetryAssistantMessage({
484
- hasUserMessageForRetry: true,
485
- isStreaming: false,
486
- isError: false,
487
- hasApproval: true,
488
- turnId: 'turn-1'
489
- })).toBe(false);
490
- expect(canRetryAssistantMessage({
491
- hasUserMessageForRetry: true,
492
- isStreaming: false,
493
- isError: false,
494
- hasApproval: false,
495
- isCancelled: true,
496
- turnId: null
497
- })).toBe(false);
498
- expect(canRetryAssistantMessage({
499
- hasUserMessageForRetry: true,
500
- isStreaming: false,
501
- isError: false,
502
- hasApproval: false,
503
- isCancelled: false,
504
- turnId: 'turn-1'
505
- })).toBe(true);
506
- });
507
- });
508
- describe('attachment download helpers', function () {
509
- it('builds file names and picks the first available url', function () {
510
- expect(resolveAttachmentDownloadFileName({
511
- name: 'brief.pdf',
512
- type: 'pdf'
513
- })).toBe('brief.pdf');
514
- expect(resolveAttachmentDownloadFileName({
515
- name: 'brief',
516
- type: 'pdf'
517
- })).toBe('brief.pdf');
518
- expect(resolveAttachmentDownloadUrl({
519
- url_original: 'https://a.test/o',
520
- url_file: 'https://a.test/f'
521
- })).toBe('https://a.test/o');
522
- });
523
- it('falls back to user sources when attachments are missing', function () {
524
- var sources = [{
525
- id: 's1',
526
- name: 'a.pdf',
527
- size: 1,
528
- type: 'pdf'
529
- }];
530
- expect(resolveMessageAttachments(undefined, false, sources)).toEqual(sources);
531
- expect(resolveMessageAttachments([], true, sources)).toEqual([]);
532
- });
533
- });
534
- describe('turn space helpers', function () {
535
- it('finds the latest question id', function () {
536
- expect(findLastQuestionId([{
537
- id: 'answer-1'
538
- }, {
539
- id: 'question-9'
540
- }, {
541
- id: 'question-10'
542
- }])).toBe('question-10');
543
- });
544
- it('computes reserved and removable spacer heights', function () {
545
- expect(computeReservedTurnSpace(800, 600, 800)).toBe(56);
546
- expect(computeRemovableTurnSpace(1200, 800, 200, 300)).toBe(100);
547
- expect(computeRemovableTurnSpace(1200, 800, 200, 0)).toBe(0);
548
- });
549
- });
550
- describe('branch coverage gaps', function () {
551
- it('hasMessageLevelStreamIndicator requires placeholder id and active stream', function () {
552
- expect(hasMessageLevelStreamIndicator(undefined, true, true)).toBe(false);
553
- expect(hasMessageLevelStreamIndicator('answer-turn-1-streaming', false, false)).toBe(false);
554
- });
555
- it('shouldHideAssistantSuggestions respects disabled chips on the last message', function () {
556
- expect(shouldHideAssistantSuggestions(false, true, true)).toBe(true);
557
- });
558
- it('resolveChatListItemStreamingFlags only streams the last assistant placeholder', function () {
559
- expect(resolveChatListItemStreamingFlags({
560
- role: ChatHistoryRole.ASSISTANT,
561
- userId: 'assistant',
562
- messageId: 'answer-turn-1-streaming',
563
- isLastMessage: false,
564
- waitingResponse: true,
565
- isWriting: false
566
- })).toMatchObject({
567
- isStreamingPlaceholder: false,
568
- isStreaming: false
569
- });
570
- });
571
- it('isAudioAttachment detects extension-only files', function () {
572
- expect(isAudioAttachment({
573
- type: '',
574
- name: 'voice.wav'
575
- })).toBe(true);
576
- expect(isAudioAttachment({
577
- type: 'audio/webm',
578
- name: 'clip'
579
- })).toBe(true);
580
- });
581
- it('canOpenAttachmentPreview accepts originalFile and url_file', function () {
582
- expect(canOpenAttachmentPreview({
583
- id: '1',
584
- name: 'a.pdf',
585
- type: 'pdf',
586
- size: 1,
587
- file: undefined,
588
- originalFile: new File([], 'a.pdf')
589
- })).toBe(true);
590
- expect(canOpenAttachmentPreview({
591
- id: '2',
592
- name: 'b.pdf',
593
- type: 'pdf',
594
- size: 1,
595
- file: undefined,
596
- url_file: 'https://cdn/file'
597
- })).toBe(true);
598
- });
599
- it('resolveMessageAttachments ignores empty attachment arrays for assistants', function () {
600
- expect(resolveMessageAttachments([], true, [{
601
- id: 's1'
602
- }])).toEqual([]);
603
- });
604
- it('resolveAttachmentDownloadUrl falls back to url_file and thumbnail', function () {
605
- expect(resolveAttachmentDownloadUrl({
606
- url_file: 'https://cdn/file'
607
- })).toBe('https://cdn/file');
608
- expect(resolveAttachmentDownloadUrl({
609
- url_thumbnail: 'https://cdn/thumb'
610
- })).toBe('https://cdn/thumb');
611
- });
612
- });
613
- describe('streaming and scroll lifecycle helpers', function () {
614
- it('builds smooth stream options from window flags', function () {
615
- expect(buildSmoothStreamTextOptions({
616
- streamLagMs: 100
617
- }, true)).toMatchObject({
618
- enabled: true,
619
- targetLagMs: 100
620
- });
621
- expect(buildSmoothStreamTextOptions({
622
- streamLagMs: 100,
623
- streamAdapt: true,
624
- streamBufferMs: 200,
625
- streamMinBuffer: 10,
626
- streamWarmupMs: 50
627
- }, true)).toMatchObject({
628
- adaptToBackendRate: true,
629
- targetBufferMs: 200,
630
- minBufferChars: 10,
631
- warmupMs: 50
632
- });
633
- expect(buildSmoothStreamTextOptions({}, false).enabled).toBe(false);
634
- });
635
- it('readSmoothStreamWindowFlags returns empty when window is unavailable', function () {
636
- var originalWindow = global.window;
637
- // @ts-expect-error simulating non-browser runtime
638
- delete global.window;
639
- expect(readSmoothStreamWindowFlags()).toEqual({});
640
- global.window = originalWindow;
641
- });
642
- it('resolves streaming raw text and hook ids', function () {
643
- expect(resolveStreamingRawText(true, 'live', 'final')).toBe('live');
644
- expect(resolveStreamingMessageHookId(false, 'id-1')).toBeNull();
645
- expect(resolveStreamingTextHookId(true, false, 'id-1')).toBe('id-1');
646
- expect(resolveReasoningTraceHookId(true, true, 'id-1')).toBe('id-1');
647
- });
648
- it('guards chat init, turn reservation and scroll effects', function () {
649
- expect(shouldInitializeChat(false)).toBe(true);
650
- expect(shouldClearLastReservedQuestion(true)).toBe(true);
651
- expect(shouldScheduleTurnSpaceReservation(false, false, 'question-1', null)).toBe(true);
652
- expect(shouldSkipMessagesScrollEffect(false, false, false, false)).toBe(true);
653
- expect(shouldRunSessionCacheScrollToBottom(false, 'chat-1', 2, null)).toBe(true);
654
- expect(detectJustFinishedLoadingMessages(true, false)).toBe(true);
655
- expect(shouldScrollToBottomAfterLoad(true, 0)).toBe(false);
656
- expect(shouldUpdateScrollAffordancesOnLoadEnd(false)).toBe(true);
657
- });
658
- it('restores scroll position from session snapshot', function () {
659
- expect(resolvePendingScrollTopFromSession(null, 'chat-1')).toBeNull();
660
- expect(resolvePendingScrollTopFromSession({
661
- scrollSessionId: 'chat-1',
662
- scrollTop: 120
663
- }, 'chat-1')).toBe(120);
664
- expect(shouldApplyPendingScrollRestore(false, 50, true)).toBe(true);
665
- expect(shouldClearScrollRestoreWithoutChat(null)).toBe(true);
666
- expect(shouldRestoreScrollOnExpandedChange(false, true, true)).toBe(true);
667
- });
668
- it('resolves list keys, analytics and cancelled feedback props', function () {
669
- expect(resolveMessageListItemKey(undefined, 3)).toBe('msg-3');
670
- expect(resolveSuggestionAnalyticsAgentType(true, 'clone')).toBe('marketplace');
671
- expect(resolveFeedbackPropsForCancelled(true, [{
672
- id: 1
673
- }], function () {
674
- return undefined;
675
- }).sources).toBeUndefined();
676
- expect(shouldRenderMentionInlineNodes(true, ['node'])).toBe(true);
677
- expect(resolveScrollOnParentMode(true)).toBe(true);
678
- });
679
- it('processes scroll frames and turn reservation plans', function () {
680
- var _resolveLastUserMessa;
681
- var frame = processChatMessagesScrollFrame({
682
- scrollTop: 200,
683
- scrollHeight: 1000,
684
- clientHeight: 400,
685
- lastScrollTop: 250,
686
- scrollThreshold: 39,
687
- anchoredTurnId: null,
688
- initialChatId: 'chat-1'
689
- });
690
- expect(frame.shouldDrainTurnSpace).toBe(true);
691
- expect(frame.shouldScheduleScrollPersist).toBe(true);
692
- expect(computeMeasureTurnLayout({
693
- containerTop: 10,
694
- questionTop: 50,
695
- contentBottom: 250,
696
- scrollTop: 100
697
- })).toMatchObject({
698
- questionTop: 140,
699
- turnHeight: 200
700
- });
701
- expect(resolveReserveTurnSpacePlan({
702
- currentScrollTop: 500,
703
- targetScrollTop: 200,
704
- clientHeight: 400,
705
- turnHeight: 120
706
- }).kind).toBe('skip-reservation');
707
- expect(resolveReserveTurnSpacePlan({
708
- currentScrollTop: 50,
709
- targetScrollTop: 200,
710
- clientHeight: 400,
711
- turnHeight: 120
712
- }).kind).toBe('reserve');
713
- expect(resolveScrollToBottomTargetTop(900, 300)).toBe(600);
714
- expect(resolveContainerAtBottom({
715
- scrollHeight: 100,
716
- scrollTop: 0,
717
- clientHeight: 100
718
- })).toBe(true);
719
- expect(resolveContainerAtBottom(null)).toBe(false);
720
- expect(resolveStreamingMessageHookId(true, 'id-1')).toBe('id-1');
721
- expect(isAudioAttachment({
722
- type: undefined,
723
- name: undefined
724
- })).toBe(false);
725
- expect(resolveCreateAgentActionsAgentId({
726
- agentId: 'a1'
727
- })).toBe('a1');
728
- expect((_resolveLastUserMessa = resolveLastUserMessageForAttachments([{
729
- role: ChatHistoryRole.ASSISTANT,
730
- user: {
731
- id: 'assistant'
732
- }
733
- }, {
734
- role: ChatHistoryRole.USER,
735
- user: {
736
- id: '7'
737
- }
738
- }], '7')) === null || _resolveLastUserMessa === void 0 ? void 0 : _resolveLastUserMessa.user.id).toBe('7');
739
- });
740
- });
741
- });
742
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGZWVkYmFjayIsIkNoYXRIaXN0b3J5Um9sZSIsImNhbk9wZW5BdHRhY2htZW50UHJldmlldyIsImNhblJldHJ5QXNzaXN0YW50TWVzc2FnZSIsImNvbXB1dGVEaXN0YW5jZUZyb21Cb3R0b20iLCJjb21wdXRlUmVtb3ZhYmxlVHVyblNwYWNlIiwiY29tcHV0ZVJlc2VydmVkVHVyblNwYWNlIiwiY29tcHV0ZVN5bmNlZFR1cm5TcGFjZXJIZWlnaHQiLCJjb21wdXRlVHVyblNjcm9sbER1cmF0aW9uTXMiLCJjb21wdXRlVHVyblNjcm9sbFRhcmdldFRvcCIsImNvdW50VXNlck1lc3NhZ2VBdHRhY2htZW50cyIsImVhc2VPdXRFeHBvU2Nyb2xsUHJvZ3Jlc3MiLCJleHRyYWN0RmVlZGJhY2tTZXNzaW9uSWQiLCJmaW5kTGFzdFF1ZXN0aW9uSWQiLCJoYXNJbml0aWFsVXNlck1lc3NhZ2VJbkxpc3QiLCJoYXNNZXNzYWdlTGV2ZWxTdHJlYW1JbmRpY2F0b3IiLCJpc0FjdGl2ZVN0cmVhbWluZ1N0YXRlIiwiaXNBbnN3ZXJPclF1ZXN0aW9uQ2hhdE1lc3NhZ2VJZCIsImlzQXBwcm92YWxDaGF0TWVzc2FnZSIsImlzQXNzaXN0YW50Q2hhdE1lc3NhZ2UiLCJpc0F1ZGlvQXR0YWNobWVudCIsImlzQ29udGFpbmVyQXRTY3JvbGxCb3R0b20iLCJpc0N1cnJlbnRVc2VyTWVzc2FnZSIsImlzTmVhclNjcm9sbEJvdHRvbSIsImlzTmV3Q2hhdE1lc3NhZ2VFdmVudCIsImlzUmV0cnlTdWdnZXN0aW9uU2VsZWN0aW9uIiwiaXNTY3JvbGxpbmdVcHdhcmQiLCJyZXNvbHZlQXR0YWNobWVudERvd25sb2FkQmxvYlN0cmF0ZWd5IiwicmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZEZpbGVOYW1lIiwicmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZFVybCIsInJlc29sdmVDaGF0TGlzdEl0ZW1TdHJlYW1pbmdGbGFncyIsInJlc29sdmVEaXNhYmxlRmVlZGJhY2tGcm9tV2FzSGVscGZ1bCIsInJlc29sdmVNZXNzYWdlQXR0YWNobWVudHMiLCJyZXNvbHZlUmV0cnlBdHRhY2htZW50c0Zyb21Vc2VyTWVzc2FnZSIsInJlc29sdmVTY3JvbGxOZWFyQm90dG9tVGhyZXNob2xkIiwic2hvdWxkQXV0b1Njcm9sbE9uTWVzc2FnZXNDaGFuZ2UiLCJzaG91bGREcmFpblR1cm5TcGFjZU9uU2Nyb2xsIiwic2hvdWxkSGlkZUFzc2lzdGFudFN1Z2dlc3Rpb25zIiwic2hvdWxkSGlkZUVtcHR5U3RyZWFtaW5nQm9keSIsInNob3VsZElnbm9yZVN1Z2dlc3Rpb25DbGljayIsInNob3VsZE9wZW5NZXNzYWdlT3B0aW9uIiwic2hvdWxkUGVyc2lzdE1haWFQYW5lbFNjcm9sbCIsInNob3VsZFJlbGVhc2VUdXJuU3BhY2UiLCJzaG91bGRSZW5kZXJBc3Npc3RhbnRGZWVkYmFjayIsInNob3VsZFJlbmRlckFzc2lzdGFudFN1Z2dlc3Rpb25zIiwic2hvdWxkUmVuZGVyQ2hhbmdlUHJvamVjdE1lc3NhZ2UiLCJzaG91bGRSZW5kZXJDcmVhdGVBZ2VudEFjdGlvbnMiLCJzaG91bGRSZW5kZXJNZXNzYWdlVGV4dEJvZHkiLCJzaG91bGRSdW5TdHJlYW1UdXJuU3luY0VmZmVjdCIsInNob3VsZFNob3dBcHByb3ZhbEFjdGlvbnMiLCJzaG91bGRTaG93Qm90dG9tU2Nyb2xsR3JhZGllbnQiLCJzaG91bGRTaG93R2xvYmFsU3RyZWFtTG9hZGluZ0luZGljYXRvciIsInNob3VsZFNob3dNZXNzYWdlQXR0YWNobWVudHNSb3ciLCJzaG91bGRTaG93U2Nyb2xsVG9Cb3R0b20iLCJzaG91bGRTaG93U3RyZWFtQWN0aXZpdHlJbmRpY2F0b3IiLCJzaG91bGRTaG93U3RyZWFtaW5nTWVzc2FnZUJvZHkiLCJzaG91bGRTaG93VG9wU2Nyb2xsR3JhZGllbnQiLCJzaG91bGRTa2lwRW1wdHlDaGF0TGlzdE1lc3NhZ2UiLCJzaG91bGRTa2lwVHVyblNjcm9sbEFuaW1hdGlvbiIsInNob3VsZFNraXBUdXJuU3BhY2VSZXNlcnZhdGlvbiIsInNob3VsZFVwZGF0ZVNwYWNlckhlaWdodCIsInR1cm5BbmNob3JPZmZzZXQiLCJidWlsZFNtb290aFN0cmVhbVRleHRPcHRpb25zIiwiY29tcHV0ZU1lYXN1cmVUdXJuTGF5b3V0IiwiZGV0ZWN0SnVzdEZpbmlzaGVkTG9hZGluZ01lc3NhZ2VzIiwicHJvY2Vzc0NoYXRNZXNzYWdlc1Njcm9sbEZyYW1lIiwicmVhZFNtb290aFN0cmVhbVdpbmRvd0ZsYWdzIiwicmVzb2x2ZUNvbnRhaW5lckF0Qm90dG9tIiwicmVzb2x2ZVN0cmVhbWluZ01lc3NhZ2VIb29rSWQiLCJyZXNvbHZlQ3JlYXRlQWdlbnRBY3Rpb25zQWdlbnRJZCIsInJlc29sdmVMYXN0VXNlck1lc3NhZ2VGb3JBdHRhY2htZW50cyIsInJlc29sdmVGZWVkYmFja1Byb3BzRm9yQ2FuY2VsbGVkIiwicmVzb2x2ZVJlc2VydmVUdXJuU3BhY2VQbGFuIiwicmVzb2x2ZVNjcm9sbFRvQm90dG9tVGFyZ2V0VG9wIiwicmVzb2x2ZU1lc3NhZ2VMaXN0SXRlbUtleSIsInJlc29sdmVQZW5kaW5nU2Nyb2xsVG9wRnJvbVNlc3Npb24iLCJyZXNvbHZlUmVhc29uaW5nVHJhY2VIb29rSWQiLCJyZXNvbHZlU2Nyb2xsT25QYXJlbnRNb2RlIiwicmVzb2x2ZVN0cmVhbWluZ1Jhd1RleHQiLCJyZXNvbHZlU3RyZWFtaW5nVGV4dEhvb2tJZCIsInJlc29sdmVTdWdnZXN0aW9uQW5hbHl0aWNzQWdlbnRUeXBlIiwic2hvdWxkQXBwbHlQZW5kaW5nU2Nyb2xsUmVzdG9yZSIsInNob3VsZENsZWFyTGFzdFJlc2VydmVkUXVlc3Rpb24iLCJzaG91bGRDbGVhclNjcm9sbFJlc3RvcmVXaXRob3V0Q2hhdCIsInNob3VsZEluaXRpYWxpemVDaGF0Iiwic2hvdWxkUmVuZGVyTWVudGlvbklubGluZU5vZGVzIiwic2hvdWxkUmVzdG9yZVNjcm9sbE9uRXhwYW5kZWRDaGFuZ2UiLCJzaG91bGRSdW5TZXNzaW9uQ2FjaGVTY3JvbGxUb0JvdHRvbSIsInNob3VsZFNjaGVkdWxlVHVyblNwYWNlUmVzZXJ2YXRpb24iLCJzaG91bGRTY3JvbGxUb0JvdHRvbUFmdGVyTG9hZCIsInNob3VsZFNraXBNZXNzYWdlc1Njcm9sbEVmZmVjdCIsInNob3VsZFVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzT25Mb2FkRW5kIiwiZGVzY3JpYmUiLCJpdCIsImV4cGVjdCIsInRvQmUiLCJpZCIsImFwcHJvdmFsIiwiaXNOZXdNZXNzYWdlIiwiYW5jaG9yZWRUdXJuSWQiLCJ3YWl0aW5nUmVzcG9uc2UiLCJpc1dyaXRpbmciLCJpc0F0Qm90dG9tIiwiaXNBbnN3ZXJPclF1ZXN0aW9uIiwiaXNBcHByb3ZhbCIsImhhc0luaXRpYWxNZXNzYWdlIiwibWVzc2FnZXNMZW5ndGgiLCJwcmV2TWVzc2FnZXNMZW5ndGgiLCJ0eXBlIiwiVVNFUiIsIkFTU0lTVEFOVCIsIm1lc3NhZ2VUZXh0Iiwic2hvd1N0cmVhbWluZ0JvZHkiLCJpc0Fzc2lzdGFudCIsImF0dGFjaG1lbnRDb3VudCIsInBlbmRpbmdfYWN0aW9ucyIsImlzRXJyb3IiLCJpc1N0cmVhbWluZyIsImlzRnJvbnRlbmRDYW5jZWxsZWQiLCJvblJldHJ5IiwidW5kZWZpbmVkIiwic3VnZ2VzdGlvbnNMZW5ndGgiLCJhZ2VudElkIiwicm9sZSIsInVzZXJJZCIsIm1lc3NhZ2VJZCIsImlzTGFzdE1lc3NhZ2UiLCJ0b0VxdWFsIiwiaXNTdHJlYW1pbmdQbGFjZWhvbGRlciIsImF0dGFjaG1lbnRzIiwibmFtZSIsInNpemUiLCJzb3VyY2VzIiwiRmlsZSIsInRvQmVOdWxsIiwiZmlsZSIsInVybF9vcmlnaW5hbCIsInNvdXJjZUNvdW50IiwiaGFzQXBwcm92YWwiLCJwcm9qZWN0TmFtZSIsIlRIVU1CU19VUCIsIlRIVU1CU19ET1dOIiwiaGFzVXNlck1lc3NhZ2VGb3JSZXRyeSIsInR1cm5JZCIsImlzQ2FuY2VsbGVkIiwidXJsX2ZpbGUiLCJ0b01hdGNoT2JqZWN0Iiwib3JpZ2luYWxGaWxlIiwidXJsX3RodW1ibmFpbCIsInN0cmVhbUxhZ01zIiwiZW5hYmxlZCIsInRhcmdldExhZ01zIiwic3RyZWFtQWRhcHQiLCJzdHJlYW1CdWZmZXJNcyIsInN0cmVhbU1pbkJ1ZmZlciIsInN0cmVhbVdhcm11cE1zIiwiYWRhcHRUb0JhY2tlbmRSYXRlIiwidGFyZ2V0QnVmZmVyTXMiLCJtaW5CdWZmZXJDaGFycyIsIndhcm11cE1zIiwib3JpZ2luYWxXaW5kb3ciLCJnbG9iYWwiLCJ3aW5kb3ciLCJzY3JvbGxTZXNzaW9uSWQiLCJzY3JvbGxUb3AiLCJ0b0JlVW5kZWZpbmVkIiwiX3Jlc29sdmVMYXN0VXNlck1lc3NhIiwiZnJhbWUiLCJzY3JvbGxIZWlnaHQiLCJjbGllbnRIZWlnaHQiLCJsYXN0U2Nyb2xsVG9wIiwic2Nyb2xsVGhyZXNob2xkIiwiaW5pdGlhbENoYXRJZCIsInNob3VsZERyYWluVHVyblNwYWNlIiwic2hvdWxkU2NoZWR1bGVTY3JvbGxQZXJzaXN0IiwiY29udGFpbmVyVG9wIiwicXVlc3Rpb25Ub3AiLCJjb250ZW50Qm90dG9tIiwidHVybkhlaWdodCIsImN1cnJlbnRTY3JvbGxUb3AiLCJ0YXJnZXRTY3JvbGxUb3AiLCJraW5kIiwidXNlciJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21vbGVjdWxlcy9DaGF0QUlNZXNzYWdlcy9DaGF0QUlNZXNzYWdlcy5oZWxwZXJzLnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmVlZGJhY2sgfSBmcm9tICcuLi9NZXNzYWdlRmVlZGJhY2svTWVzc2FnZUZlZWRiYWNrJ1xuaW1wb3J0IHsgQ2hhdEhpc3RvcnlSb2xlIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvQ2hhdCdcbmltcG9ydCB7XG4gIGNhbk9wZW5BdHRhY2htZW50UHJldmlldyxcbiAgY2FuUmV0cnlBc3Npc3RhbnRNZXNzYWdlLFxuICBjb21wdXRlRGlzdGFuY2VGcm9tQm90dG9tLFxuICBjb21wdXRlUmVtb3ZhYmxlVHVyblNwYWNlLFxuICBjb21wdXRlUmVzZXJ2ZWRUdXJuU3BhY2UsXG4gIGNvbXB1dGVTeW5jZWRUdXJuU3BhY2VySGVpZ2h0LFxuICBjb21wdXRlVHVyblNjcm9sbER1cmF0aW9uTXMsXG4gIGNvbXB1dGVUdXJuU2Nyb2xsVGFyZ2V0VG9wLFxuICBjb3VudFVzZXJNZXNzYWdlQXR0YWNobWVudHMsXG4gIGVhc2VPdXRFeHBvU2Nyb2xsUHJvZ3Jlc3MsXG4gIGV4dHJhY3RGZWVkYmFja1Nlc3Npb25JZCxcbiAgZmluZExhc3RRdWVzdGlvbklkLFxuICBoYXNJbml0aWFsVXNlck1lc3NhZ2VJbkxpc3QsXG4gIGhhc01lc3NhZ2VMZXZlbFN0cmVhbUluZGljYXRvcixcbiAgaXNBY3RpdmVTdHJlYW1pbmdTdGF0ZSxcbiAgaXNBbnN3ZXJPclF1ZXN0aW9uQ2hhdE1lc3NhZ2VJZCxcbiAgaXNBcHByb3ZhbENoYXRNZXNzYWdlLFxuICBpc0Fzc2lzdGFudENoYXRNZXNzYWdlLFxuICBpc0F1ZGlvQXR0YWNobWVudCxcbiAgaXNDb250YWluZXJBdFNjcm9sbEJvdHRvbSxcbiAgaXNDdXJyZW50VXNlck1lc3NhZ2UsXG4gIGlzTmVhclNjcm9sbEJvdHRvbSxcbiAgaXNOZXdDaGF0TWVzc2FnZUV2ZW50LFxuICBpc1JldHJ5U3VnZ2VzdGlvblNlbGVjdGlvbixcbiAgaXNTY3JvbGxpbmdVcHdhcmQsXG4gIHJlc29sdmVBdHRhY2htZW50RG93bmxvYWRCbG9iU3RyYXRlZ3ksXG4gIHJlc29sdmVBdHRhY2htZW50RG93bmxvYWRGaWxlTmFtZSxcbiAgcmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZFVybCxcbiAgcmVzb2x2ZUNoYXRMaXN0SXRlbVN0cmVhbWluZ0ZsYWdzLFxuICByZXNvbHZlRGlzYWJsZUZlZWRiYWNrRnJvbVdhc0hlbHBmdWwsXG4gIHJlc29sdmVNZXNzYWdlQXR0YWNobWVudHMsXG4gIHJlc29sdmVSZXRyeUF0dGFjaG1lbnRzRnJvbVVzZXJNZXNzYWdlLFxuICByZXNvbHZlU2Nyb2xsTmVhckJvdHRvbVRocmVzaG9sZCxcbiAgc2hvdWxkQXV0b1Njcm9sbE9uTWVzc2FnZXNDaGFuZ2UsXG4gIHNob3VsZERyYWluVHVyblNwYWNlT25TY3JvbGwsXG4gIHNob3VsZEhpZGVBc3Npc3RhbnRTdWdnZXN0aW9ucyxcbiAgc2hvdWxkSGlkZUVtcHR5U3RyZWFtaW5nQm9keSxcbiAgc2hvdWxkSWdub3JlU3VnZ2VzdGlvbkNsaWNrLFxuICBzaG91bGRPcGVuTWVzc2FnZU9wdGlvbixcbiAgc2hvdWxkUGVyc2lzdE1haWFQYW5lbFNjcm9sbCxcbiAgc2hvdWxkUmVsZWFzZVR1cm5TcGFjZSxcbiAgc2hvdWxkUmVuZGVyQXNzaXN0YW50RmVlZGJhY2ssXG4gIHNob3VsZFJlbmRlckFzc2lzdGFudFN1Z2dlc3Rpb25zLFxuICBzaG91bGRSZW5kZXJDaGFuZ2VQcm9qZWN0TWVzc2FnZSxcbiAgc2hvdWxkUmVuZGVyQ3JlYXRlQWdlbnRBY3Rpb25zLFxuICBzaG91bGRSZW5kZXJNZXNzYWdlVGV4dEJvZHksXG4gIHNob3VsZFJ1blN0cmVhbVR1cm5TeW5jRWZmZWN0LFxuICBzaG91bGRTaG93QXBwcm92YWxBY3Rpb25zLFxuICBzaG91bGRTaG93Qm90dG9tU2Nyb2xsR3JhZGllbnQsXG4gIHNob3VsZFNob3dHbG9iYWxTdHJlYW1Mb2FkaW5nSW5kaWNhdG9yLFxuICBzaG91bGRTaG93TWVzc2FnZUF0dGFjaG1lbnRzUm93LFxuICBzaG91bGRTaG93U2Nyb2xsVG9Cb3R0b20sXG4gIHNob3VsZFNob3dTdHJlYW1BY3Rpdml0eUluZGljYXRvcixcbiAgc2hvdWxkU2hvd1N0cmVhbWluZ01lc3NhZ2VCb2R5LFxuICBzaG91bGRTaG93VG9wU2Nyb2xsR3JhZGllbnQsXG4gIHNob3VsZFNraXBFbXB0eUNoYXRMaXN0TWVzc2FnZSxcbiAgc2hvdWxkU2tpcFR1cm5TY3JvbGxBbmltYXRpb24sXG4gIHNob3VsZFNraXBUdXJuU3BhY2VSZXNlcnZhdGlvbixcbiAgc2hvdWxkVXBkYXRlU3BhY2VySGVpZ2h0LFxuICB0dXJuQW5jaG9yT2Zmc2V0LFxuICBidWlsZFNtb290aFN0cmVhbVRleHRPcHRpb25zLFxuICBjb21wdXRlTWVhc3VyZVR1cm5MYXlvdXQsXG4gIGRldGVjdEp1c3RGaW5pc2hlZExvYWRpbmdNZXNzYWdlcyxcbiAgcHJvY2Vzc0NoYXRNZXNzYWdlc1Njcm9sbEZyYW1lLFxuICByZWFkU21vb3RoU3RyZWFtV2luZG93RmxhZ3MsXG4gIHJlc29sdmVDb250YWluZXJBdEJvdHRvbSxcbiAgcmVzb2x2ZVN0cmVhbWluZ01lc3NhZ2VIb29rSWQsXG4gIHJlc29sdmVDcmVhdGVBZ2VudEFjdGlvbnNBZ2VudElkLFxuICByZXNvbHZlTGFzdFVzZXJNZXNzYWdlRm9yQXR0YWNobWVudHMsXG4gIHJlc29sdmVGZWVkYmFja1Byb3BzRm9yQ2FuY2VsbGVkLFxuICByZXNvbHZlUmVzZXJ2ZVR1cm5TcGFjZVBsYW4sXG4gIHJlc29sdmVTY3JvbGxUb0JvdHRvbVRhcmdldFRvcCxcbiAgcmVzb2x2ZU1lc3NhZ2VMaXN0SXRlbUtleSxcbiAgcmVzb2x2ZVBlbmRpbmdTY3JvbGxUb3BGcm9tU2Vzc2lvbixcbiAgcmVzb2x2ZVJlYXNvbmluZ1RyYWNlSG9va0lkLFxuICByZXNvbHZlU2Nyb2xsT25QYXJlbnRNb2RlLFxuICByZXNvbHZlU3RyZWFtaW5nUmF3VGV4dCxcbiAgcmVzb2x2ZVN0cmVhbWluZ1RleHRIb29rSWQsXG4gIHJlc29sdmVTdWdnZXN0aW9uQW5hbHl0aWNzQWdlbnRUeXBlLFxuICBzaG91bGRBcHBseVBlbmRpbmdTY3JvbGxSZXN0b3JlLFxuICBzaG91bGRDbGVhckxhc3RSZXNlcnZlZFF1ZXN0aW9uLFxuICBzaG91bGRDbGVhclNjcm9sbFJlc3RvcmVXaXRob3V0Q2hhdCxcbiAgc2hvdWxkSW5pdGlhbGl6ZUNoYXQsXG4gIHNob3VsZFJlbmRlck1lbnRpb25JbmxpbmVOb2RlcyxcbiAgc2hvdWxkUmVzdG9yZVNjcm9sbE9uRXhwYW5kZWRDaGFuZ2UsXG4gIHNob3VsZFJ1blNlc3Npb25DYWNoZVNjcm9sbFRvQm90dG9tLFxuICBzaG91bGRTY2hlZHVsZVR1cm5TcGFjZVJlc2VydmF0aW9uLFxuICBzaG91bGRTY3JvbGxUb0JvdHRvbUFmdGVyTG9hZCxcbiAgc2hvdWxkU2tpcE1lc3NhZ2VzU2Nyb2xsRWZmZWN0LFxuICBzaG91bGRVcGRhdGVTY3JvbGxBZmZvcmRhbmNlc09uTG9hZEVuZCxcbn0gZnJvbSAnLi9DaGF0QUlNZXNzYWdlcy5oZWxwZXJzJ1xuXG5kZXNjcmliZSgnQ2hhdEFJTWVzc2FnZXMuaGVscGVycycsICgpID0+IHtcbiAgZGVzY3JpYmUoJ3R1cm5BbmNob3JPZmZzZXQnLCAoKSA9PiB7XG4gICAgaXQoJ2NhcHMgdGhlIG9mZnNldCBhdCAyMDBweCcsICgpID0+IHtcbiAgICAgIGV4cGVjdCh0dXJuQW5jaG9yT2Zmc2V0KDUwMCkpLnRvQmUoOTApXG4gICAgICBleHBlY3QodHVybkFuY2hvck9mZnNldCgyMDAwKSkudG9CZSgyMDApXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnY29tcHV0ZVR1cm5TY3JvbGxEdXJhdGlvbk1zJywgKCkgPT4ge1xuICAgIGl0KCdzY2FsZXMgZHVyYXRpb24gd2l0aCBzY3JvbGwgZGlzdGFuY2UnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY29tcHV0ZVR1cm5TY3JvbGxEdXJhdGlvbk1zKDApKS50b0JlKDYwMClcbiAgICAgIGV4cGVjdChjb21wdXRlVHVyblNjcm9sbER1cmF0aW9uTXMoMTIwMCkpLnRvQmUoODAwKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ3Njcm9sbCBhZmZvcmRhbmNlcycsICgpID0+IHtcbiAgICBpdCgnY29tcHV0ZXMgZGlzdGFuY2UgZnJvbSBib3R0b20gZXhjbHVkaW5nIHNwYWNlciBoZWlnaHQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY29tcHV0ZURpc3RhbmNlRnJvbUJvdHRvbSgxMDAwLCAyMDAsIDMwMCwgNDAwKSkudG9CZSgxMDApXG4gICAgfSlcblxuICAgIGl0KCdzaG93cyB0aGUgc2Nyb2xsIGJ1dHRvbiBvbmx5IHdoZW4gZmFyIGVub3VnaCBmcm9tIHRoZSBib3R0b20nLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd1Njcm9sbFRvQm90dG9tKDYwKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFNob3dTY3JvbGxUb0JvdHRvbSgyMCkpLnRvQmUoZmFsc2UpXG4gICAgfSlcblxuICAgIGl0KCd0b2dnbGVzIHRvcCBhbmQgYm90dG9tIHNjcm9sbCBncmFkaWVudHMgcGFzdCB0aGUgdGhyZXNob2xkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNob3VsZFNob3dUb3BTY3JvbGxHcmFkaWVudCgwKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRTaG93VG9wU2Nyb2xsR3JhZGllbnQoMikpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTaG93Qm90dG9tU2Nyb2xsR3JhZGllbnQoMCkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd0JvdHRvbVNjcm9sbEdyYWRpZW50KDUpKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIGl0KCdkZXRlY3RzIHVwd2FyZCBzY3JvbGwgYW5kIG5lYXItYm90dG9tIHdpdGggYWRhcHRpdmUgdGhyZXNob2xkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzU2Nyb2xsaW5nVXB3YXJkKDEwLCAyMCkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChpc05lYXJTY3JvbGxCb3R0b20oNTAwLCA0MDAsIDEwMCwgNTApKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QocmVzb2x2ZVNjcm9sbE5lYXJCb3R0b21UaHJlc2hvbGQoMzksIHRydWUsIGZhbHNlKSkudG9CZSgxNSlcbiAgICAgIGV4cGVjdChyZXNvbHZlU2Nyb2xsTmVhckJvdHRvbVRocmVzaG9sZCgxNSwgZmFsc2UsIHRydWUpKS50b0JlKDM5KVxuICAgICAgZXhwZWN0KHJlc29sdmVTY3JvbGxOZWFyQm90dG9tVGhyZXNob2xkKDI1LCBmYWxzZSwgZmFsc2UpKS50b0JlKDI1KVxuICAgIH0pXG5cbiAgICBpdCgnc2tpcHMgdGlueSB0dXJuIHNjcm9sbCBhbmltYXRpb25zIGFuZCBlYXNlcyBwcm9ncmVzcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRTa2lwVHVyblNjcm9sbEFuaW1hdGlvbigwLjUpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU2tpcFR1cm5TY3JvbGxBbmltYXRpb24oMTApKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KGVhc2VPdXRFeHBvU2Nyb2xsUHJvZ3Jlc3MoMSkpLnRvQmUoMSlcbiAgICAgIGV4cGVjdChlYXNlT3V0RXhwb1Njcm9sbFByb2dyZXNzKDApKS50b0JlKDApXG4gICAgfSlcblxuICAgIGl0KCdjb21wdXRlcyB0dXJuIHNjcm9sbCB0YXJnZXRzIGFuZCByZXNlcnZhdGlvbiBza2lwcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChjb21wdXRlVHVyblNjcm9sbFRhcmdldFRvcCgzMDAsIDUwMCkpLnRvQmUoMjEwKVxuICAgICAgZXhwZWN0KHNob3VsZFNraXBUdXJuU3BhY2VSZXNlcnZhdGlvbigxMDAsIDUwKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFNraXBUdXJuU3BhY2VSZXNlcnZhdGlvbig1MCwgMTAwKSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ3VwZGF0ZXMgc3BhY2VyIGhlaWdodCBvbmx5IHdoZW4gdGhlIGRlbHRhIGlzIG1lYW5pbmdmdWwnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkVXBkYXRlU3BhY2VySGVpZ2h0KDEwMCwgMTAwLjUpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFVwZGF0ZVNwYWNlckhlaWdodCgxMDAsIDEwMikpLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ3N5bmNzIHR1cm4gc3BhY2VyIGhlaWdodCB3aXRob3V0IGdyb3dpbmcgcmVzZXJ2ZWQgc3BhY2UnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY29tcHV0ZVN5bmNlZFR1cm5TcGFjZXJIZWlnaHQoODAwLCA2MDAsIDIwMCkpLnRvQmUoNTYpXG4gICAgICBleHBlY3QoY29tcHV0ZVN5bmNlZFR1cm5TcGFjZXJIZWlnaHQoODAwLCA2MDAsIDQwKSkudG9CZSg0MClcbiAgICB9KVxuXG4gICAgaXQoJ2RyYWlucyBvciByZWxlYXNlcyB0dXJuIHNwYWNlIGJhc2VkIG9uIGFuY2hvciBzdGF0ZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGREcmFpblR1cm5TcGFjZU9uU2Nyb2xsKG51bGwpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkRHJhaW5UdXJuU3BhY2VPblNjcm9sbCgncXVlc3Rpb24tMScpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFJlbGVhc2VUdXJuU3BhY2UobnVsbCwgMCkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkUmVsZWFzZVR1cm5TcGFjZSgncXVlc3Rpb24tMScsIDApKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkUmVsZWFzZVR1cm5TcGFjZShudWxsLCA1MCkpLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ3BlcnNpc3RzIHBhbmVsIHNjcm9sbCBvbmx5IGZvciBhY3RpdmUgc2Vzc2lvbnMgc2Nyb2xsZWQgYXdheSBmcm9tIHRvcCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRQZXJzaXN0TWFpYVBhbmVsU2Nyb2xsKCdjaGF0LTEnLCAxMCkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRQZXJzaXN0TWFpYVBhbmVsU2Nyb2xsKCdjaGF0LTEnLCAwKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRQZXJzaXN0TWFpYVBhbmVsU2Nyb2xsKG51bGwsIDEwKSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ2RldGVjdHMgYm90dG9tIGFsaWdubWVudCB3aXRoIHRvbGVyYW5jZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0NvbnRhaW5lckF0U2Nyb2xsQm90dG9tKDEwMDAsIDkwMCwgMTAwKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KGlzQ29udGFpbmVyQXRTY3JvbGxCb3R0b20oMTAwMCwgNzAwLCAxMDApKS50b0JlKGZhbHNlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ21lc3NhZ2UgbGlzdCBzY3JvbGwgZGVjaXNpb25zJywgKCkgPT4ge1xuICAgIGl0KCdkZXRlY3RzIG5ldyBtZXNzYWdlIGV2ZW50cycsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc05ld0NoYXRNZXNzYWdlRXZlbnQoJ2EnLCAnYScsIDMsIDMpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KGlzTmV3Q2hhdE1lc3NhZ2VFdmVudCgnYicsICdhJywgMywgMykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChpc05ld0NoYXRNZXNzYWdlRXZlbnQoJ2EnLCAnYScsIDQsIDMpKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIGl0KCdjbGFzc2lmaWVzIGFwcHJvdmFsIGFuZCBhbnN3ZXIvcXVlc3Rpb24gaWRzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzQXBwcm92YWxDaGF0TWVzc2FnZSh7IGlkOiAnYXBwcm92YWwtMScgfSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChpc0FwcHJvdmFsQ2hhdE1lc3NhZ2UoeyBpZDogJ2Fuc3dlci0xJywgYXBwcm92YWw6IHt9IH0pKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoaXNBcHByb3ZhbENoYXRNZXNzYWdlKHsgaWQ6ICdhbnN3ZXItMScgfSkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3QoaXNBbnN3ZXJPclF1ZXN0aW9uQ2hhdE1lc3NhZ2VJZCgncXVlc3Rpb24tOScpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoaXNBbnN3ZXJPclF1ZXN0aW9uQ2hhdE1lc3NhZ2VJZCgnb3RoZXInKSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ2ZpbmRzIHRoZSBpbml0aWFsIHVzZXIgbWVzc2FnZSBtYXJrZXInLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaGFzSW5pdGlhbFVzZXJNZXNzYWdlSW5MaXN0KFt7IGlkOiAndXNlci1pbml0aWFsLW1lc3NhZ2UnIH1dKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KGhhc0luaXRpYWxVc2VyTWVzc2FnZUluTGlzdChbeyBpZDogJ3F1ZXN0aW9uLTEnIH1dKSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ3JldHVybnMgc2Nyb2xsLCBzeW5jLXR1cm4gb3IgYWZmb3JkYW5jZXMtb25seScsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkQXV0b1Njcm9sbE9uTWVzc2FnZXNDaGFuZ2Uoe1xuICAgICAgICAgIGlzTmV3TWVzc2FnZTogZmFsc2UsXG4gICAgICAgICAgYW5jaG9yZWRUdXJuSWQ6IG51bGwsXG4gICAgICAgICAgd2FpdGluZ1Jlc3BvbnNlOiBmYWxzZSxcbiAgICAgICAgICBpc1dyaXRpbmc6IGZhbHNlLFxuICAgICAgICAgIGlzQXRCb3R0b206IHRydWUsXG4gICAgICAgICAgaXNBbnN3ZXJPclF1ZXN0aW9uOiB0cnVlLFxuICAgICAgICAgIGlzQXBwcm92YWw6IGZhbHNlLFxuICAgICAgICAgIGhhc0luaXRpYWxNZXNzYWdlOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlc0xlbmd0aDogMixcbiAgICAgICAgICBwcmV2TWVzc2FnZXNMZW5ndGg6IDIsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoJ2FmZm9yZGFuY2VzLW9ubHknKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZEF1dG9TY3JvbGxPbk1lc3NhZ2VzQ2hhbmdlKHtcbiAgICAgICAgICBpc05ld01lc3NhZ2U6IHRydWUsXG4gICAgICAgICAgYW5jaG9yZWRUdXJuSWQ6ICdxdWVzdGlvbi0xJyxcbiAgICAgICAgICB3YWl0aW5nUmVzcG9uc2U6IGZhbHNlLFxuICAgICAgICAgIGlzV3JpdGluZzogZmFsc2UsXG4gICAgICAgICAgaXNBdEJvdHRvbTogZmFsc2UsXG4gICAgICAgICAgaXNBbnN3ZXJPclF1ZXN0aW9uOiBmYWxzZSxcbiAgICAgICAgICBpc0FwcHJvdmFsOiBmYWxzZSxcbiAgICAgICAgICBoYXNJbml0aWFsTWVzc2FnZTogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZXNMZW5ndGg6IDMsXG4gICAgICAgICAgcHJldk1lc3NhZ2VzTGVuZ3RoOiAyLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKCdzeW5jLXR1cm4nKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZEF1dG9TY3JvbGxPbk1lc3NhZ2VzQ2hhbmdlKHtcbiAgICAgICAgICBpc05ld01lc3NhZ2U6IHRydWUsXG4gICAgICAgICAgYW5jaG9yZWRUdXJuSWQ6IG51bGwsXG4gICAgICAgICAgd2FpdGluZ1Jlc3BvbnNlOiB0cnVlLFxuICAgICAgICAgIGlzV3JpdGluZzogZmFsc2UsXG4gICAgICAgICAgaXNBdEJvdHRvbTogdHJ1ZSxcbiAgICAgICAgICBpc0Fuc3dlck9yUXVlc3Rpb246IHRydWUsXG4gICAgICAgICAgaXNBcHByb3ZhbDogZmFsc2UsXG4gICAgICAgICAgaGFzSW5pdGlhbE1lc3NhZ2U6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2VzTGVuZ3RoOiAzLFxuICAgICAgICAgIHByZXZNZXNzYWdlc0xlbmd0aDogMixcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSgnYWZmb3JkYW5jZXMtb25seScpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkQXV0b1Njcm9sbE9uTWVzc2FnZXNDaGFuZ2Uoe1xuICAgICAgICAgIGlzTmV3TWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICBhbmNob3JlZFR1cm5JZDogbnVsbCxcbiAgICAgICAgICB3YWl0aW5nUmVzcG9uc2U6IGZhbHNlLFxuICAgICAgICAgIGlzV3JpdGluZzogZmFsc2UsXG4gICAgICAgICAgaXNBdEJvdHRvbTogdHJ1ZSxcbiAgICAgICAgICBpc0Fuc3dlck9yUXVlc3Rpb246IHRydWUsXG4gICAgICAgICAgaXNBcHByb3ZhbDogZmFsc2UsXG4gICAgICAgICAgaGFzSW5pdGlhbE1lc3NhZ2U6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2VzTGVuZ3RoOiAzLFxuICAgICAgICAgIHByZXZNZXNzYWdlc0xlbmd0aDogMixcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSgnc2Nyb2xsJylcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBzaG91bGRBdXRvU2Nyb2xsT25NZXNzYWdlc0NoYW5nZSh7XG4gICAgICAgICAgaXNOZXdNZXNzYWdlOiB0cnVlLFxuICAgICAgICAgIGFuY2hvcmVkVHVybklkOiBudWxsLFxuICAgICAgICAgIHdhaXRpbmdSZXNwb25zZTogZmFsc2UsXG4gICAgICAgICAgaXNXcml0aW5nOiBmYWxzZSxcbiAgICAgICAgICBpc0F0Qm90dG9tOiBmYWxzZSxcbiAgICAgICAgICBpc0Fuc3dlck9yUXVlc3Rpb246IGZhbHNlLFxuICAgICAgICAgIGlzQXBwcm92YWw6IGZhbHNlLFxuICAgICAgICAgIGhhc0luaXRpYWxNZXNzYWdlOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlc0xlbmd0aDogNCxcbiAgICAgICAgICBwcmV2TWVzc2FnZXNMZW5ndGg6IDMsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoJ3Njcm9sbCcpXG4gICAgfSlcblxuICAgIGl0KCdjb250cm9scyBzdHJlYW0gc3luYyBhbmQgZ2xvYmFsIGxvYWRpbmcgaW5kaWNhdG9ycycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRSdW5TdHJlYW1UdXJuU3luY0VmZmVjdChmYWxzZSwgZmFsc2UpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFJ1blN0cmVhbVR1cm5TeW5jRWZmZWN0KHRydWUsIGZhbHNlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KGhhc01lc3NhZ2VMZXZlbFN0cmVhbUluZGljYXRvcignYW5zd2VyLXR1cm4tMS1zdHJlYW1pbmcnLCB0cnVlLCBmYWxzZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChoYXNNZXNzYWdlTGV2ZWxTdHJlYW1JbmRpY2F0b3IoJ2Fuc3dlci0xJywgdHJ1ZSwgZmFsc2UpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFNob3dHbG9iYWxTdHJlYW1Mb2FkaW5nSW5kaWNhdG9yKGZhbHNlLCB7IHR5cGU6ICd3cml0aW5nJyB9KSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFNob3dHbG9iYWxTdHJlYW1Mb2FkaW5nSW5kaWNhdG9yKHRydWUsIHsgdHlwZTogJ3dyaXRpbmcnIH0pKS50b0JlKGZhbHNlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ21lc3NhZ2UgaXRlbSByZW5kZXJpbmcgZ3VhcmRzJywgKCkgPT4ge1xuICAgIGl0KCdyZXNvbHZlcyB1c2VyIGFuZCBhc3Npc3RhbnQgcm9sZXMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNDdXJyZW50VXNlck1lc3NhZ2UoQ2hhdEhpc3RvcnlSb2xlLlVTRVIsICc5JywgJzknKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KGlzQ3VycmVudFVzZXJNZXNzYWdlKENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsICcxJywgJzEnKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KGlzQXNzaXN0YW50Q2hhdE1lc3NhZ2UoQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCwgJ2Fzc2lzdGFudCcpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoaXNBc3Npc3RhbnRDaGF0TWVzc2FnZShDaGF0SGlzdG9yeVJvbGUuVVNFUiwgJ2Fzc2lzdGFudCcpKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIGl0KCdkZXJpdmVzIHN0cmVhbWluZyBib2R5IGFuZCBhY3Rpdml0eSBpbmRpY2F0b3IgZmxhZ3MnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNBY3RpdmVTdHJlYW1pbmdTdGF0ZShmYWxzZSwgdHJ1ZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTaG93U3RyZWFtaW5nTWVzc2FnZUJvZHkodHJ1ZSwgdHJ1ZSwgZmFsc2UpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd1N0cmVhbWluZ01lc3NhZ2VCb2R5KHRydWUsIHRydWUsIHRydWUpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFNob3dTdHJlYW1BY3Rpdml0eUluZGljYXRvcih0cnVlLCB0cnVlLCB7IHR5cGU6ICd3cml0aW5nJyB9KSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFNob3dTdHJlYW1BY3Rpdml0eUluZGljYXRvcihmYWxzZSwgdHJ1ZSwgeyB0eXBlOiAnd3JpdGluZycgfSkpLnRvQmUoZmFsc2UpXG4gICAgfSlcblxuICAgIGl0KCdndWFyZHMgY2hhbmdlLXByb2plY3QsIGF0dGFjaG1lbnRzLCB0ZXh0IGJvZHkgYW5kIGFwcHJvdmFsIFVJJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNob3VsZFJlbmRlckNoYW5nZVByb2plY3RNZXNzYWdlKHRydWUsIFt7IGlkOiAxIH1dKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFJlbmRlckNoYW5nZVByb2plY3RNZXNzYWdlKHRydWUsIG51bGwpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFNob3dNZXNzYWdlQXR0YWNobWVudHNSb3coMCkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd01lc3NhZ2VBdHRhY2htZW50c1JvdygyKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KFxuICAgICAgICBzaG91bGRSZW5kZXJNZXNzYWdlVGV4dEJvZHkoe1xuICAgICAgICAgIG1lc3NhZ2VUZXh0OiAnJyxcbiAgICAgICAgICBzaG93U3RyZWFtaW5nQm9keTogdHJ1ZSxcbiAgICAgICAgICBpc0Fzc2lzdGFudDogdHJ1ZSxcbiAgICAgICAgICBhdHRhY2htZW50Q291bnQ6IDEsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFJlbmRlck1lc3NhZ2VUZXh0Qm9keSh7XG4gICAgICAgICAgbWVzc2FnZVRleHQ6ICdob2xhJyxcbiAgICAgICAgICBzaG93U3RyZWFtaW5nQm9keTogZmFsc2UsXG4gICAgICAgICAgaXNBc3Npc3RhbnQ6IGZhbHNlLFxuICAgICAgICAgIGF0dGFjaG1lbnRDb3VudDogMCxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFNob3dBcHByb3ZhbEFjdGlvbnMoeyBwZW5kaW5nX2FjdGlvbnM6IFtdIH0pKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd0FwcHJvdmFsQWN0aW9ucyh7fSkpLnRvQmUoZmFsc2UpXG4gICAgfSlcblxuICAgIGl0KCdoaWRlcyBlbXB0eSBzdHJlYW1pbmcgYm9kaWVzIGFuZCBjb250cm9scyBhc3Npc3RhbnQgY2hyb21lJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNob3VsZEhpZGVFbXB0eVN0cmVhbWluZ0JvZHkoJycsIGZhbHNlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZEhpZGVFbXB0eVN0cmVhbWluZ0JvZHkoJycsIHRydWUpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KFxuICAgICAgICBzaG91bGRSZW5kZXJBc3Npc3RhbnRGZWVkYmFjayh7XG4gICAgICAgICAgaXNBc3Npc3RhbnQ6IHRydWUsXG4gICAgICAgICAgaXNFcnJvcjogZmFsc2UsXG4gICAgICAgICAgaXNTdHJlYW1pbmc6IGZhbHNlLFxuICAgICAgICAgIGlzRnJvbnRlbmRDYW5jZWxsZWQ6IHRydWUsXG4gICAgICAgICAgb25SZXRyeTogKCkgPT4gdW5kZWZpbmVkLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFJlbmRlckFzc2lzdGFudEZlZWRiYWNrKHtcbiAgICAgICAgICBpc0Fzc2lzdGFudDogdHJ1ZSxcbiAgICAgICAgICBpc0Vycm9yOiB0cnVlLFxuICAgICAgICAgIGlzU3RyZWFtaW5nOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkUmVuZGVyQXNzaXN0YW50U3VnZ2VzdGlvbnMoe1xuICAgICAgICAgIGlzQXNzaXN0YW50OiB0cnVlLFxuICAgICAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgICAgICAgc3VnZ2VzdGlvbnNMZW5ndGg6IDIsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkUmVuZGVyQXNzaXN0YW50U3VnZ2VzdGlvbnMoe1xuICAgICAgICAgIGlzQXNzaXN0YW50OiB0cnVlLFxuICAgICAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgICAgICAgc3VnZ2VzdGlvbnNMZW5ndGg6IDAsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkSGlkZUFzc2lzdGFudFN1Z2dlc3Rpb25zKHRydWUsIHRydWUsIGZhbHNlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZEhpZGVBc3Npc3RhbnRTdWdnZXN0aW9ucyhmYWxzZSwgZmFsc2UsIGZhbHNlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KFxuICAgICAgICBzaG91bGRSZW5kZXJDcmVhdGVBZ2VudEFjdGlvbnMoe1xuICAgICAgICAgIGlzQXNzaXN0YW50OiB0cnVlLFxuICAgICAgICAgIGFnZW50SWQ6ICdhZ2VudC0xJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgncmVzb2x2ZXMgbGlzdCBzdHJlYW1pbmcgZmxhZ3MgZm9yIHRoZSBsYXN0IGFzc2lzdGFudCBwbGFjZWhvbGRlciBvbmx5JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlQ2hhdExpc3RJdGVtU3RyZWFtaW5nRmxhZ3Moe1xuICAgICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICAgICAgdXNlcklkOiAnYXNzaXN0YW50JyxcbiAgICAgICAgICBtZXNzYWdlSWQ6ICdhbnN3ZXItdHVybi0xLXN0cmVhbWluZycsXG4gICAgICAgICAgaXNMYXN0TWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICB3YWl0aW5nUmVzcG9uc2U6IHRydWUsXG4gICAgICAgICAgaXNXcml0aW5nOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICkudG9FcXVhbCh7IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXI6IHRydWUsIGlzU3RyZWFtaW5nOiB0cnVlIH0pXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUNoYXRMaXN0SXRlbVN0cmVhbWluZ0ZsYWdzKHtcbiAgICAgICAgICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgICAgIHVzZXJJZDogJ2Fzc2lzdGFudCcsXG4gICAgICAgICAgbWVzc2FnZUlkOiAnYW5zd2VyLXR1cm4tMS1zdHJlYW1pbmcnLFxuICAgICAgICAgIGlzTGFzdE1lc3NhZ2U6IGZhbHNlLFxuICAgICAgICAgIHdhaXRpbmdSZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgICBpc1dyaXRpbmc6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0VxdWFsKHsgaXNTdHJlYW1pbmdQbGFjZWhvbGRlcjogZmFsc2UsIGlzU3RyZWFtaW5nOiBmYWxzZSB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVDaGF0TGlzdEl0ZW1TdHJlYW1pbmdGbGFncyh7XG4gICAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgICB1c2VySWQ6ICdhc3Npc3RhbnQnLFxuICAgICAgICAgIG1lc3NhZ2VJZDogJ2Fuc3dlci10dXJuLTEtc3RyZWFtaW5nJyxcbiAgICAgICAgICBpc0xhc3RNZXNzYWdlOiB0cnVlLFxuICAgICAgICAgIHdhaXRpbmdSZXNwb25zZTogZmFsc2UsXG4gICAgICAgICAgaXNXcml0aW5nOiB0cnVlLFxuICAgICAgICB9KS5pc1N0cmVhbWluZ1xuICAgICAgKS50b0JlKHRydWUpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnc3VnZ2VzdGlvbnMgYW5kIGF0dGFjaG1lbnRzJywgKCkgPT4ge1xuICAgIGl0KCdpZ25vcmVzIGVtcHR5IG9yIGFscmVhZHktc2VsZWN0ZWQgc3VnZ2VzdGlvbnMnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkSWdub3JlU3VnZ2VzdGlvbkNsaWNrKCcgICcsIGZhbHNlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZElnbm9yZVN1Z2dlc3Rpb25DbGljaygncmV0cnknLCB0cnVlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZElnbm9yZVN1Z2dlc3Rpb25DbGljaygnZ28nLCBmYWxzZSkpLnRvQmUoZmFsc2UpXG4gICAgfSlcblxuICAgIGl0KCdkZXRlY3RzIHJldHJ5IHN1Z2dlc3Rpb24gc2VsZWN0aW9uJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzUmV0cnlTdWdnZXN0aW9uU2VsZWN0aW9uKHRydWUsICdSZWludGVudGFyJywgJ1JlaW50ZW50YXInKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KGlzUmV0cnlTdWdnZXN0aW9uU2VsZWN0aW9uKGZhbHNlLCAnUmVpbnRlbnRhcicsICdSZWludGVudGFyJykpLnRvQmUoZmFsc2UpXG4gICAgfSlcblxuICAgIGl0KCdyZXNvbHZlcyByZXRyeSBhdHRhY2htZW50cyBmcm9tIHVzZXIgbWVzc2FnZSBzb3VyY2VzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYXR0YWNobWVudHMgPSBbeyBpZDogJzEnLCBuYW1lOiAnYS5wZGYnLCBzaXplOiAxLCB0eXBlOiAncGRmJyB9XVxuICAgICAgZXhwZWN0KHJlc29sdmVSZXRyeUF0dGFjaG1lbnRzRnJvbVVzZXJNZXNzYWdlKHsgYXR0YWNobWVudHMgfSkpLnRvRXF1YWwoYXR0YWNobWVudHMpXG4gICAgICBleHBlY3QocmVzb2x2ZVJldHJ5QXR0YWNobWVudHNGcm9tVXNlck1lc3NhZ2UoeyBzb3VyY2VzOiBhdHRhY2htZW50cyB9KSkudG9FcXVhbChhdHRhY2htZW50cylcbiAgICAgIGV4cGVjdChyZXNvbHZlUmV0cnlBdHRhY2htZW50c0Zyb21Vc2VyTWVzc2FnZSh7fSkpLnRvRXF1YWwoW10pXG4gICAgfSlcblxuICAgIGl0KCdjb3VudHMgYXR0YWNobWVudHMgZnJvbSBhdHRhY2htZW50cyBvciBzb3VyY2VzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNvdW50VXNlck1lc3NhZ2VBdHRhY2htZW50cyh7IGF0dGFjaG1lbnRzOiBbeyBpZDogJzEnLCBuYW1lOiAnYScsIHNpemU6IDEsIHR5cGU6ICdwZGYnIH1dIH0pKS50b0JlKDEpXG4gICAgICBleHBlY3QoY291bnRVc2VyTWVzc2FnZUF0dGFjaG1lbnRzKHsgc291cmNlczogW3sgaWQ6ICcyJyB9XSB9KSkudG9CZSgxKVxuICAgICAgZXhwZWN0KGNvdW50VXNlck1lc3NhZ2VBdHRhY2htZW50cyhudWxsKSkudG9CZSgwKVxuICAgIH0pXG5cbiAgICBpdCgncGlja3MgYXR0YWNobWVudCBkb3dubG9hZCBzdHJhdGVneScsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQXR0YWNobWVudERvd25sb2FkQmxvYlN0cmF0ZWd5KCdodHRwczovL2EudGVzdCcsIG51bGwpKS50b0JlKCdyZW1vdGUtdXJsJylcbiAgICAgIGV4cGVjdChyZXNvbHZlQXR0YWNobWVudERvd25sb2FkQmxvYlN0cmF0ZWd5KHVuZGVmaW5lZCwgbmV3IEZpbGUoWyd4J10sICdhLnR4dCcpKSkudG9CZSgnbG9jYWwtZmlsZScpXG4gICAgICBleHBlY3QocmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZEJsb2JTdHJhdGVneSh1bmRlZmluZWQsIG51bGwpKS50b0JlTnVsbCgpXG4gICAgfSlcblxuICAgIGl0KCdibG9ja3Mgc2VsZWN0aW5nIGFub3RoZXIgcHJvamVjdCBvcHRpb24gYWZ0ZXIgb25lIGlzIGNob3NlbicsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRPcGVuTWVzc2FnZU9wdGlvbihudWxsKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZE9wZW5NZXNzYWdlT3B0aW9uKHsgaWQ6IDEgfSkpLnRvQmUoZmFsc2UpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnZXh0cmFjdEZlZWRiYWNrU2Vzc2lvbklkJywgKCkgPT4ge1xuICAgIGl0KCdyZW1vdmVzIGFuc3dlciBzZWdtZW50cyBmcm9tIHRoZSBtZXNzYWdlIGlkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGV4dHJhY3RGZWVkYmFja1Nlc3Npb25JZCgncXVlc3Rpb24tMS1hbnN3ZXItc3RyZWFtLTInKSkudG9CZSgncXVlc3Rpb24tMS1zdHJlYW0tMicpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnYXR0YWNobWVudHMnLCAoKSA9PiB7XG4gICAgaXQoJ2RldGVjdHMgYXVkaW8gYXR0YWNobWVudHMgYnkgbWltZSB0eXBlLCBleHRlbnNpb24gb3IgbmFtZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0F1ZGlvQXR0YWNobWVudCh7IHR5cGU6ICdhdWRpby9tcGVnJywgbmFtZTogJ3ZvaWNlLm1wMycgfSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChpc0F1ZGlvQXR0YWNobWVudCh7IHR5cGU6ICdtcDMnLCBuYW1lOiAndm9pY2UubXAzJyB9KSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KGlzQXVkaW9BdHRhY2htZW50KHsgdHlwZTogJ3RleHQvcGxhaW4nLCBuYW1lOiAnbm90ZXMudHh0JyB9KSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ2FsbG93cyBwcmV2aWV3IGZvciBsb2NhbCBmaWxlcyBhbmQgcmVtb3RlIHVybHMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGNhbk9wZW5BdHRhY2htZW50UHJldmlldyh7XG4gICAgICAgICAgaWQ6ICcxJyxcbiAgICAgICAgICBuYW1lOiAnYS5wZGYnLFxuICAgICAgICAgIHNpemU6IDEsXG4gICAgICAgICAgdHlwZTogJ2FwcGxpY2F0aW9uL3BkZicsXG4gICAgICAgICAgZmlsZTogbmV3IEZpbGUoWyd4J10sICdhLnBkZicpLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKHRydWUpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgY2FuT3BlbkF0dGFjaG1lbnRQcmV2aWV3KHtcbiAgICAgICAgICBpZDogJzInLFxuICAgICAgICAgIG5hbWU6ICdiLnBkZicsXG4gICAgICAgICAgc2l6ZTogMSxcbiAgICAgICAgICB0eXBlOiAnYXBwbGljYXRpb24vcGRmJyxcbiAgICAgICAgICB1cmxfb3JpZ2luYWw6ICdodHRwczovL2V4YW1wbGUuY29tL2IucGRmJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSh0cnVlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2xpc3QgbWVzc2FnZSB2aXNpYmlsaXR5JywgKCkgPT4ge1xuICAgIGl0KCdza2lwcyBlbXB0eSBtZXNzYWdlcyB1bmxlc3Mgc3RyZWFtaW5nIG9yIHJpY2ggY29udGVudCBpcyBwcmVzZW50JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICBzaG91bGRTa2lwRW1wdHlDaGF0TGlzdE1lc3NhZ2Uoe1xuICAgICAgICAgIGlzU3RyZWFtaW5nUGxhY2Vob2xkZXI6IGZhbHNlLFxuICAgICAgICAgIGlzU3RyZWFtaW5nOiBmYWxzZSxcbiAgICAgICAgICBhdHRhY2htZW50Q291bnQ6IDAsXG4gICAgICAgICAgc291cmNlQ291bnQ6IDAsXG4gICAgICAgICAgbWVzc2FnZVRleHQ6ICcnLFxuICAgICAgICAgIGhhc0FwcHJvdmFsOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSh0cnVlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFNraXBFbXB0eUNoYXRMaXN0TWVzc2FnZSh7XG4gICAgICAgICAgaXNTdHJlYW1pbmdQbGFjZWhvbGRlcjogdHJ1ZSxcbiAgICAgICAgICBpc1N0cmVhbWluZzogZmFsc2UsXG4gICAgICAgICAgYXR0YWNobWVudENvdW50OiAwLFxuICAgICAgICAgIHNvdXJjZUNvdW50OiAwLFxuICAgICAgICAgIG1lc3NhZ2VUZXh0OiAnJyxcbiAgICAgICAgICBoYXNBcHByb3ZhbDogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoZmFsc2UpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkU2tpcEVtcHR5Q2hhdExpc3RNZXNzYWdlKHtcbiAgICAgICAgICBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyOiBmYWxzZSxcbiAgICAgICAgICBpc1N0cmVhbWluZzogdHJ1ZSxcbiAgICAgICAgICBhdHRhY2htZW50Q291bnQ6IDAsXG4gICAgICAgICAgc291cmNlQ291bnQ6IDAsXG4gICAgICAgICAgbWVzc2FnZVRleHQ6ICcnLFxuICAgICAgICAgIGhhc0FwcHJvdmFsOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZShmYWxzZSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBzaG91bGRTa2lwRW1wdHlDaGF0TGlzdE1lc3NhZ2Uoe1xuICAgICAgICAgIGlzU3RyZWFtaW5nUGxhY2Vob2xkZXI6IGZhbHNlLFxuICAgICAgICAgIGlzU3RyZWFtaW5nOiBmYWxzZSxcbiAgICAgICAgICBhdHRhY2htZW50Q291bnQ6IDAsXG4gICAgICAgICAgc291cmNlQ291bnQ6IDEsXG4gICAgICAgICAgbWVzc2FnZVRleHQ6ICcnLFxuICAgICAgICAgIGhhc0FwcHJvdmFsOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZShmYWxzZSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBzaG91bGRTa2lwRW1wdHlDaGF0TGlzdE1lc3NhZ2Uoe1xuICAgICAgICAgIGlzU3RyZWFtaW5nUGxhY2Vob2xkZXI6IGZhbHNlLFxuICAgICAgICAgIGlzU3RyZWFtaW5nOiBmYWxzZSxcbiAgICAgICAgICBhdHRhY2htZW50Q291bnQ6IDAsXG4gICAgICAgICAgc291cmNlQ291bnQ6IDAsXG4gICAgICAgICAgbWVzc2FnZVRleHQ6ICdob2xhJyxcbiAgICAgICAgICBoYXNBcHByb3ZhbDogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoZmFsc2UpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkU2tpcEVtcHR5Q2hhdExpc3RNZXNzYWdlKHtcbiAgICAgICAgICBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyOiBmYWxzZSxcbiAgICAgICAgICBpc1N0cmVhbWluZzogZmFsc2UsXG4gICAgICAgICAgYXR0YWNobWVudENvdW50OiAwLFxuICAgICAgICAgIHNvdXJjZUNvdW50OiAwLFxuICAgICAgICAgIG1lc3NhZ2VUZXh0OiAnJyxcbiAgICAgICAgICBwcm9qZWN0TmFtZTogJ1Byb3llY3RvJyxcbiAgICAgICAgICBoYXNBcHByb3ZhbDogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoZmFsc2UpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkU2tpcEVtcHR5Q2hhdExpc3RNZXNzYWdlKHtcbiAgICAgICAgICBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyOiBmYWxzZSxcbiAgICAgICAgICBpc1N0cmVhbWluZzogZmFsc2UsXG4gICAgICAgICAgYXR0YWNobWVudENvdW50OiAxLFxuICAgICAgICAgIHNvdXJjZUNvdW50OiAwLFxuICAgICAgICAgIG1lc3NhZ2VUZXh0OiAnJyxcbiAgICAgICAgICBoYXNBcHByb3ZhbDogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoZmFsc2UpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkU2tpcEVtcHR5Q2hhdExpc3RNZXNzYWdlKHtcbiAgICAgICAgICBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyOiBmYWxzZSxcbiAgICAgICAgICBpc1N0cmVhbWluZzogZmFsc2UsXG4gICAgICAgICAgYXR0YWNobWVudENvdW50OiAwLFxuICAgICAgICAgIHNvdXJjZUNvdW50OiAwLFxuICAgICAgICAgIG1lc3NhZ2VUZXh0OiAnJyxcbiAgICAgICAgICBoYXNBcHByb3ZhbDogdHJ1ZSxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZShmYWxzZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdyZXRyeSBhbmQgZmVlZGJhY2sgaGVscGVycycsICgpID0+IHtcbiAgICBpdCgnbWFwcyB3YXNIZWxwZnVsIHRvIGZlZWRiYWNrIGVudW0nLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZURpc2FibGVGZWVkYmFja0Zyb21XYXNIZWxwZnVsKHVuZGVmaW5lZCkpLnRvQmVOdWxsKClcbiAgICAgIGV4cGVjdChyZXNvbHZlRGlzYWJsZUZlZWRiYWNrRnJvbVdhc0hlbHBmdWwodHJ1ZSkpLnRvQmUoRmVlZGJhY2suVEhVTUJTX1VQKVxuICAgICAgZXhwZWN0KHJlc29sdmVEaXNhYmxlRmVlZGJhY2tGcm9tV2FzSGVscGZ1bChmYWxzZSkpLnRvQmUoRmVlZGJhY2suVEhVTUJTX0RPV04pXG4gICAgfSlcblxuICAgIGl0KCdhbGxvd3MgcmV0cnkgZm9yIGZyb250ZW5kLWNhbmNlbGxlZCB0dXJucyB3aXRoIGEgdXNlciBtZXNzYWdlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICBjYW5SZXRyeUFzc2lzdGFudE1lc3NhZ2Uoe1xuICAgICAgICAgIGhhc1VzZXJNZXNzYWdlRm9yUmV0cnk6IHRydWUsXG4gICAgICAgICAgaXNTdHJlYW1pbmc6IGZhbHNlLFxuICAgICAgICAgIGlzRXJyb3I6IGZhbHNlLFxuICAgICAgICAgIGhhc0FwcHJvdmFsOiBmYWxzZSxcbiAgICAgICAgICBpc0Zyb250ZW5kQ2FuY2VsbGVkOiB0cnVlLFxuICAgICAgICAgIHR1cm5JZDogbnVsbCxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgnYmxvY2tzIHJldHJ5IHdoZW4gc3RyZWFtaW5nLCBlcnJvciwgYXBwcm92YWwgb3IgbWlzc2luZyB1c2VyIG1lc3NhZ2UnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGNhblJldHJ5QXNzaXN0YW50TWVzc2FnZSh7XG4gICAgICAgICAgaGFzVXNlck1lc3NhZ2VGb3JSZXRyeTogZmFsc2UsXG4gICAgICAgICAgaXNTdHJlYW1pbmc6IGZhbHNlLFxuICAgICAgICAgIGlzRXJyb3I6IGZhbHNlLFxuICAgICAgICAgIGhhc0FwcHJvdmFsOiBmYWxzZSxcbiAgICAgICAgICB0dXJuSWQ6ICd0dXJuLTEnLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGNhblJldHJ5QXNzaXN0YW50TWVzc2FnZSh7XG4gICAgICAgICAgaGFzVXNlck1lc3NhZ2VGb3JSZXRyeTogdHJ1ZSxcbiAgICAgICAgICBpc1N0cmVhbWluZzogdHJ1ZSxcbiAgICAgICAgICBpc0Vycm9yOiBmYWxzZSxcbiAgICAgICAgICBoYXNBcHByb3ZhbDogZmFsc2UsXG4gICAgICAgICAgdHVybklkOiAndHVybi0xJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZShmYWxzZSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBjYW5SZXRyeUFzc2lzdGFudE1lc3NhZ2Uoe1xuICAgICAgICAgIGhhc1VzZXJNZXNzYWdlRm9yUmV0cnk6IHRydWUsXG4gICAgICAgICAgaXNTdHJlYW1pbmc6IGZhbHNlLFxuICAgICAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgICAgICAgaGFzQXBwcm92YWw6IGZhbHNlLFxuICAgICAgICAgIHR1cm5JZDogJ3R1cm4tMScsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoZmFsc2UpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgY2FuUmV0cnlBc3Npc3RhbnRNZXNzYWdlKHtcbiAgICAgICAgICBoYXNVc2VyTWVzc2FnZUZvclJldHJ5OiB0cnVlLFxuICAgICAgICAgIGlzU3RyZWFtaW5nOiBmYWxzZSxcbiAgICAgICAgICBpc0Vycm9yOiBmYWxzZSxcbiAgICAgICAgICBoYXNBcHByb3ZhbDogdHJ1ZSxcbiAgICAgICAgICB0dXJuSWQ6ICd0dXJuLTEnLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGNhblJldHJ5QXNzaXN0YW50TWVzc2FnZSh7XG4gICAgICAgICAgaGFzVXNlck1lc3NhZ2VGb3JSZXRyeTogdHJ1ZSxcbiAgICAgICAgICBpc1N0cmVhbWluZzogZmFsc2UsXG4gICAgICAgICAgaXNFcnJvcjogZmFsc2UsXG4gICAgICAgICAgaGFzQXBwcm92YWw6IGZhbHNlLFxuICAgICAgICAgIGlzQ2FuY2VsbGVkOiB0cnVlLFxuICAgICAgICAgIHR1cm5JZDogbnVsbCxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZShmYWxzZSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBjYW5SZXRyeUFzc2lzdGFudE1lc3NhZ2Uoe1xuICAgICAgICAgIGhhc1VzZXJNZXNzYWdlRm9yUmV0cnk6IHRydWUsXG4gICAgICAgICAgaXNTdHJlYW1pbmc6IGZhbHNlLFxuICAgICAgICAgIGlzRXJyb3I6IGZhbHNlLFxuICAgICAgICAgIGhhc0FwcHJvdmFsOiBmYWxzZSxcbiAgICAgICAgICBpc0NhbmNlbGxlZDogZmFsc2UsXG4gICAgICAgICAgdHVybklkOiAndHVybi0xJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSh0cnVlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2F0dGFjaG1lbnQgZG93bmxvYWQgaGVscGVycycsICgpID0+IHtcbiAgICBpdCgnYnVpbGRzIGZpbGUgbmFtZXMgYW5kIHBpY2tzIHRoZSBmaXJzdCBhdmFpbGFibGUgdXJsJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVBdHRhY2htZW50RG93bmxvYWRGaWxlTmFtZSh7IG5hbWU6ICdicmllZi5wZGYnLCB0eXBlOiAncGRmJyB9KSkudG9CZSgnYnJpZWYucGRmJylcbiAgICAgIGV4cGVjdChyZXNvbHZlQXR0YWNobWVudERvd25sb2FkRmlsZU5hbWUoeyBuYW1lOiAnYnJpZWYnLCB0eXBlOiAncGRmJyB9KSkudG9CZSgnYnJpZWYucGRmJylcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZFVybCh7XG4gICAgICAgICAgdXJsX29yaWdpbmFsOiAnaHR0cHM6Ly9hLnRlc3QvbycsXG4gICAgICAgICAgdXJsX2ZpbGU6ICdodHRwczovL2EudGVzdC9mJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSgnaHR0cHM6Ly9hLnRlc3QvbycpXG4gICAgfSlcblxuICAgIGl0KCdmYWxscyBiYWNrIHRvIHVzZXIgc291cmNlcyB3aGVuIGF0dGFjaG1lbnRzIGFyZSBtaXNzaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlcyA9IFt7IGlkOiAnczEnLCBuYW1lOiAnYS5wZGYnLCBzaXplOiAxLCB0eXBlOiAncGRmJyB9XVxuICAgICAgZXhwZWN0KHJlc29sdmVNZXNzYWdlQXR0YWNobWVudHModW5kZWZpbmVkLCBmYWxzZSwgc291cmNlcykpLnRvRXF1YWwoc291cmNlcylcbiAgICAgIGV4cGVjdChyZXNvbHZlTWVzc2FnZUF0dGFjaG1lbnRzKFtdLCB0cnVlLCBzb3VyY2VzKSkudG9FcXVhbChbXSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCd0dXJuIHNwYWNlIGhlbHBlcnMnLCAoKSA9PiB7XG4gICAgaXQoJ2ZpbmRzIHRoZSBsYXRlc3QgcXVlc3Rpb24gaWQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZmluZExhc3RRdWVzdGlvbklkKFt7IGlkOiAnYW5zd2VyLTEnIH0sIHsgaWQ6ICdxdWVzdGlvbi05JyB9LCB7IGlkOiAncXVlc3Rpb24tMTAnIH1dKSkudG9CZSgncXVlc3Rpb24tMTAnKVxuICAgIH0pXG5cbiAgICBpdCgnY29tcHV0ZXMgcmVzZXJ2ZWQgYW5kIHJlbW92YWJsZSBzcGFjZXIgaGVpZ2h0cycsICgpID0+IHtcbiAgICAgIGV4cGVjdChjb21wdXRlUmVzZXJ2ZWRUdXJuU3BhY2UoODAwLCA2MDAsIDgwMCkpLnRvQmUoNTYpXG4gICAgICBleHBlY3QoY29tcHV0ZVJlbW92YWJsZVR1cm5TcGFjZSgxMjAwLCA4MDAsIDIwMCwgMzAwKSkudG9CZSgxMDApXG4gICAgICBleHBlY3QoY29tcHV0ZVJlbW92YWJsZVR1cm5TcGFjZSgxMjAwLCA4MDAsIDIwMCwgMCkpLnRvQmUoMClcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdicmFuY2ggY292ZXJhZ2UgZ2FwcycsICgpID0+IHtcbiAgICBpdCgnaGFzTWVzc2FnZUxldmVsU3RyZWFtSW5kaWNhdG9yIHJlcXVpcmVzIHBsYWNlaG9sZGVyIGlkIGFuZCBhY3RpdmUgc3RyZWFtJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGhhc01lc3NhZ2VMZXZlbFN0cmVhbUluZGljYXRvcih1bmRlZmluZWQsIHRydWUsIHRydWUpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KGhhc01lc3NhZ2VMZXZlbFN0cmVhbUluZGljYXRvcignYW5zd2VyLXR1cm4tMS1zdHJlYW1pbmcnLCBmYWxzZSwgZmFsc2UpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgnc2hvdWxkSGlkZUFzc2lzdGFudFN1Z2dlc3Rpb25zIHJlc3BlY3RzIGRpc2FibGVkIGNoaXBzIG9uIHRoZSBsYXN0IG1lc3NhZ2UnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkSGlkZUFzc2lzdGFudFN1Z2dlc3Rpb25zKGZhbHNlLCB0cnVlLCB0cnVlKSkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgncmVzb2x2ZUNoYXRMaXN0SXRlbVN0cmVhbWluZ0ZsYWdzIG9ubHkgc3RyZWFtcyB0aGUgbGFzdCBhc3Npc3RhbnQgcGxhY2Vob2xkZXInLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVDaGF0TGlzdEl0ZW1TdHJlYW1pbmdGbGFncyh7XG4gICAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgICB1c2VySWQ6ICdhc3Npc3RhbnQnLFxuICAgICAgICAgIG1lc3NhZ2VJZDogJ2Fuc3dlci10dXJuLTEtc3RyZWFtaW5nJyxcbiAgICAgICAgICBpc0xhc3RNZXNzYWdlOiBmYWxzZSxcbiAgICAgICAgICB3YWl0aW5nUmVzcG9uc2U6IHRydWUsXG4gICAgICAgICAgaXNXcml0aW5nOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICkudG9NYXRjaE9iamVjdCh7IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXI6IGZhbHNlLCBpc1N0cmVhbWluZzogZmFsc2UgfSlcbiAgICB9KVxuXG4gICAgaXQoJ2lzQXVkaW9BdHRhY2htZW50IGRldGVjdHMgZXh0ZW5zaW9uLW9ubHkgZmlsZXMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNBdWRpb0F0dGFjaG1lbnQoeyB0eXBlOiAnJywgbmFtZTogJ3ZvaWNlLndhdicgfSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChpc0F1ZGlvQXR0YWNobWVudCh7IHR5cGU6ICdhdWRpby93ZWJtJywgbmFtZTogJ2NsaXAnIH0pKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIGl0KCdjYW5PcGVuQXR0YWNobWVudFByZXZpZXcgYWNjZXB0cyBvcmlnaW5hbEZpbGUgYW5kIHVybF9maWxlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICBjYW5PcGVuQXR0YWNobWVudFByZXZpZXcoe1xuICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgbmFtZTogJ2EucGRmJyxcbiAgICAgICAgICB0eXBlOiAncGRmJyxcbiAgICAgICAgICBzaXplOiAxLFxuICAgICAgICAgIGZpbGU6IHVuZGVmaW5lZCBhcyBuZXZlcixcbiAgICAgICAgICBvcmlnaW5hbEZpbGU6IG5ldyBGaWxlKFtdLCAnYS5wZGYnKSxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KFxuICAgICAgICBjYW5PcGVuQXR0YWNobWVudFByZXZpZXcoe1xuICAgICAgICAgIGlkOiAnMicsXG4gICAgICAgICAgbmFtZTogJ2IucGRmJyxcbiAgICAgICAgICB0eXBlOiAncGRmJyxcbiAgICAgICAgICBzaXplOiAxLFxuICAgICAgICAgIGZpbGU6IHVuZGVmaW5lZCBhcyBuZXZlcixcbiAgICAgICAgICB1cmxfZmlsZTogJ2h0dHBzOi8vY2RuL2ZpbGUnLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIGl0KCdyZXNvbHZlTWVzc2FnZUF0dGFjaG1lbnRzIGlnbm9yZXMgZW1wdHkgYXR0YWNobWVudCBhcnJheXMgZm9yIGFzc2lzdGFudHMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZU1lc3NhZ2VBdHRhY2htZW50cyhbXSwgdHJ1ZSwgW3sgaWQ6ICdzMScgfV0pKS50b0VxdWFsKFtdKVxuICAgIH0pXG5cbiAgICBpdCgncmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZFVybCBmYWxscyBiYWNrIHRvIHVybF9maWxlIGFuZCB0aHVtYm5haWwnLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZFVybCh7IHVybF9maWxlOiAnaHR0cHM6Ly9jZG4vZmlsZScgfSkpLnRvQmUoJ2h0dHBzOi8vY2RuL2ZpbGUnKVxuICAgICAgZXhwZWN0KHJlc29sdmVBdHRhY2htZW50RG93bmxvYWRVcmwoeyB1cmxfdGh1bWJuYWlsOiAnaHR0cHM6Ly9jZG4vdGh1bWInIH0pKS50b0JlKCdodHRwczovL2Nkbi90aHVtYicpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnc3RyZWFtaW5nIGFuZCBzY3JvbGwgbGlmZWN5Y2xlIGhlbHBlcnMnLCAoKSA9PiB7XG4gICAgaXQoJ2J1aWxkcyBzbW9vdGggc3RyZWFtIG9wdGlvbnMgZnJvbSB3aW5kb3cgZmxhZ3MnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoYnVpbGRTbW9vdGhTdHJlYW1UZXh0T3B0aW9ucyh7IHN0cmVhbUxhZ01zOiAxMDAgfSwgdHJ1ZSkpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICB0YXJnZXRMYWdNczogMTAwLFxuICAgICAgfSlcbiAgICAgIGV4cGVjdChcbiAgICAgICAgYnVpbGRTbW9vdGhTdHJlYW1UZXh0T3B0aW9ucyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdHJlYW1MYWdNczogMTAwLFxuICAgICAgICAgICAgc3RyZWFtQWRhcHQ6IHRydWUsXG4gICAgICAgICAgICBzdHJlYW1CdWZmZXJNczogMjAwLFxuICAgICAgICAgICAgc3RyZWFtTWluQnVmZmVyOiAxMCxcbiAgICAgICAgICAgIHN0cmVhbVdhcm11cE1zOiA1MCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKVxuICAgICAgKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgYWRhcHRUb0JhY2tlbmRSYXRlOiB0cnVlLFxuICAgICAgICB0YXJnZXRCdWZmZXJNczogMjAwLFxuICAgICAgICBtaW5CdWZmZXJDaGFyczogMTAsXG4gICAgICAgIHdhcm11cE1zOiA1MCxcbiAgICAgIH0pXG4gICAgICBleHBlY3QoYnVpbGRTbW9vdGhTdHJlYW1UZXh0T3B0aW9ucyh7fSwgZmFsc2UpLmVuYWJsZWQpLnRvQmUoZmFsc2UpXG4gICAgfSlcblxuICAgIGl0KCdyZWFkU21vb3RoU3RyZWFtV2luZG93RmxhZ3MgcmV0dXJucyBlbXB0eSB3aGVuIHdpbmRvdyBpcyB1bmF2YWlsYWJsZScsICgpID0+IHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsV2luZG93ID0gZ2xvYmFsLndpbmRvd1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBzaW11bGF0aW5nIG5vbi1icm93c2VyIHJ1bnRpbWVcbiAgICAgIGRlbGV0ZSBnbG9iYWwud2luZG93XG4gICAgICBleHBlY3QocmVhZFNtb290aFN0cmVhbVdpbmRvd0ZsYWdzKCkpLnRvRXF1YWwoe30pXG4gICAgICBnbG9iYWwud2luZG93ID0gb3JpZ2luYWxXaW5kb3dcbiAgICB9KVxuXG4gICAgaXQoJ3Jlc29sdmVzIHN0cmVhbWluZyByYXcgdGV4dCBhbmQgaG9vayBpZHMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZVN0cmVhbWluZ1Jhd1RleHQodHJ1ZSwgJ2xpdmUnLCAnZmluYWwnKSkudG9CZSgnbGl2ZScpXG4gICAgICBleHBlY3QocmVzb2x2ZVN0cmVhbWluZ01lc3NhZ2VIb29rSWQoZmFsc2UsICdpZC0xJykpLnRvQmVOdWxsKClcbiAgICAgIGV4cGVjdChyZXNvbHZlU3RyZWFtaW5nVGV4dEhvb2tJZCh0cnVlLCBmYWxzZSwgJ2lkLTEnKSkudG9CZSgnaWQtMScpXG4gICAgICBleHBlY3QocmVzb2x2ZVJlYXNvbmluZ1RyYWNlSG9va0lkKHRydWUsIHRydWUsICdpZC0xJykpLnRvQmUoJ2lkLTEnKVxuICAgIH0pXG5cbiAgICBpdCgnZ3VhcmRzIGNoYXQgaW5pdCwgdHVybiByZXNlcnZhdGlvbiBhbmQgc2Nyb2xsIGVmZmVjdHMnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkSW5pdGlhbGl6ZUNoYXQoZmFsc2UpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkQ2xlYXJMYXN0UmVzZXJ2ZWRRdWVzdGlvbih0cnVlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFNjaGVkdWxlVHVyblNwYWNlUmVzZXJ2YXRpb24oZmFsc2UsIGZhbHNlLCAncXVlc3Rpb24tMScsIG51bGwpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU2tpcE1lc3NhZ2VzU2Nyb2xsRWZmZWN0KGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFJ1blNlc3Npb25DYWNoZVNjcm9sbFRvQm90dG9tKGZhbHNlLCAnY2hhdC0xJywgMiwgbnVsbCkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChkZXRlY3RKdXN0RmluaXNoZWRMb2FkaW5nTWVzc2FnZXModHJ1ZSwgZmFsc2UpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU2Nyb2xsVG9Cb3R0b21BZnRlckxvYWQodHJ1ZSwgMCkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkVXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXNPbkxvYWRFbmQoZmFsc2UpKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIGl0KCdyZXN0b3JlcyBzY3JvbGwgcG9zaXRpb24gZnJvbSBzZXNzaW9uIHNuYXBzaG90JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVQZW5kaW5nU2Nyb2xsVG9wRnJvbVNlc3Npb24obnVsbCwgJ2NoYXQtMScpKS50b0JlTnVsbCgpXG4gICAgICBleHBlY3QocmVzb2x2ZVBlbmRpbmdTY3JvbGxUb3BGcm9tU2Vzc2lvbih7IHNjcm9sbFNlc3Npb25JZDogJ2NoYXQtMScsIHNjcm9sbFRvcDogMTIwIH0sICdjaGF0LTEnKSkudG9CZSgxMjApXG4gICAgICBleHBlY3Qoc2hvdWxkQXBwbHlQZW5kaW5nU2Nyb2xsUmVzdG9yZShmYWxzZSwgNTAsIHRydWUpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkQ2xlYXJTY3JvbGxSZXN0b3JlV2l0aG91dENoYXQobnVsbCkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRSZXN0b3JlU2Nyb2xsT25FeHBhbmRlZENoYW5nZShmYWxzZSwgdHJ1ZSwgdHJ1ZSkpLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ3Jlc29sdmVzIGxpc3Qga2V5cywgYW5hbHl0aWNzIGFuZCBjYW5jZWxsZWQgZmVlZGJhY2sgcHJvcHMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZU1lc3NhZ2VMaXN0SXRlbUtleSh1bmRlZmluZWQsIDMpKS50b0JlKCdtc2ctMycpXG4gICAgICBleHBlY3QocmVzb2x2ZVN1Z2dlc3Rpb25BbmFseXRpY3NBZ2VudFR5cGUodHJ1ZSwgJ2Nsb25lJykpLnRvQmUoJ21hcmtldHBsYWNlJylcbiAgICAgIGV4cGVjdChyZXNvbHZlRmVlZGJhY2tQcm9wc0ZvckNhbmNlbGxlZCh0cnVlLCBbeyBpZDogMSB9XSwgKCkgPT4gdW5kZWZpbmVkKS5zb3VyY2VzKS50b0JlVW5kZWZpbmVkKClcbiAgICAgIGV4cGVjdChzaG91bGRSZW5kZXJNZW50aW9uSW5saW5lTm9kZXModHJ1ZSwgWydub2RlJ10pKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QocmVzb2x2ZVNjcm9sbE9uUGFyZW50TW9kZSh0cnVlKSkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgncHJvY2Vzc2VzIHNjcm9sbCBmcmFtZXMgYW5kIHR1cm4gcmVzZXJ2YXRpb24gcGxhbnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBmcmFtZSA9IHByb2Nlc3NDaGF0TWVzc2FnZXNTY3JvbGxGcmFtZSh7XG4gICAgICAgIHNjcm9sbFRvcDogMjAwLFxuICAgICAgICBzY3JvbGxIZWlnaHQ6IDEwMDAsXG4gICAgICAgIGNsaWVudEhlaWdodDogNDAwLFxuICAgICAgICBsYXN0U2Nyb2xsVG9wOiAyNTAsXG4gICAgICAgIHNjcm9sbFRocmVzaG9sZDogMzksXG4gICAgICAgIGFuY2hvcmVkVHVybklkOiBudWxsLFxuICAgICAgICBpbml0aWFsQ2hhdElkOiAnY2hhdC0xJyxcbiAgICAgIH0pXG4gICAgICBleHBlY3QoZnJhbWUuc2hvdWxkRHJhaW5UdXJuU3BhY2UpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChmcmFtZS5zaG91bGRTY2hlZHVsZVNjcm9sbFBlcnNpc3QpLnRvQmUodHJ1ZSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBjb21wdXRlTWVhc3VyZVR1cm5MYXlvdXQoeyBjb250YWluZXJUb3A6IDEwLCBxdWVzdGlvblRvcDogNTAsIGNvbnRlbnRCb3R0b206IDI1MCwgc2Nyb2xsVG9wOiAxMDAgfSlcbiAgICAgICkudG9NYXRjaE9iamVjdCh7IHF1ZXN0aW9uVG9wOiAxNDAsIHR1cm5IZWlnaHQ6IDIwMCB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVSZXNlcnZlVHVyblNwYWNlUGxhbih7XG4gICAgICAgICAgY3VycmVudFNjcm9sbFRvcDogNTAwLFxuICAgICAgICAgIHRhcmdldFNjcm9sbFRvcDogMjAwLFxuICAgICAgICAgIGNsaWVudEhlaWdodDogNDAwLFxuICAgICAgICAgIHR1cm5IZWlnaHQ6IDEyMCxcbiAgICAgICAgfSkua2luZFxuICAgICAgKS50b0JlKCdza2lwLXJlc2VydmF0aW9uJylcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZVJlc2VydmVUdXJuU3BhY2VQbGFuKHtcbiAgICAgICAgICBjdXJyZW50U2Nyb2xsVG9wOiA1MCxcbiAgICAgICAgICB0YXJnZXRTY3JvbGxUb3A6IDIwMCxcbiAgICAgICAgICBjbGllbnRIZWlnaHQ6IDQwMCxcbiAgICAgICAgICB0dXJuSGVpZ2h0OiAxMjAsXG4gICAgICAgIH0pLmtpbmRcbiAgICAgICkudG9CZSgncmVzZXJ2ZScpXG4gICAgICBleHBlY3QocmVzb2x2ZVNjcm9sbFRvQm90dG9tVGFyZ2V0VG9wKDkwMCwgMzAwKSkudG9CZSg2MDApXG4gICAgICBleHBlY3QocmVzb2x2ZUNvbnRhaW5lckF0Qm90dG9tKHsgc2Nyb2xsSGVpZ2h0OiAxMDAsIHNjcm9sbFRvcDogMCwgY2xpZW50SGVpZ2h0OiAxMDAgfSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChyZXNvbHZlQ29udGFpbmVyQXRCb3R0b20obnVsbCkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3QocmVzb2x2ZVN0cmVhbWluZ01lc3NhZ2VIb29rSWQodHJ1ZSwgJ2lkLTEnKSkudG9CZSgnaWQtMScpXG4gICAgICBleHBlY3QoaXNBdWRpb0F0dGFjaG1lbnQoeyB0eXBlOiB1bmRlZmluZWQgYXMgbmV2ZXIsIG5hbWU6IHVuZGVmaW5lZCBhcyBuZXZlciB9KSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChyZXNvbHZlQ3JlYXRlQWdlbnRBY3Rpb25zQWdlbnRJZCh7IGFnZW50SWQ6ICdhMScgfSkpLnRvQmUoJ2ExJylcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUxhc3RVc2VyTWVzc2FnZUZvckF0dGFjaG1lbnRzKFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHsgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCwgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcgfSB9LFxuICAgICAgICAgICAgeyByb2xlOiBDaGF0SGlzdG9yeVJvbGUuVVNFUiwgdXNlcjogeyBpZDogJzcnIH0gfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgICc3J1xuICAgICAgICApPy51c2VyLmlkXG4gICAgICApLnRvQmUoJzcnKVxuICAgIH0pXG4gIH0pXG59KVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxRQUFRLFFBQVEsb0NBQW9DO0FBQzdELFNBQVNDLGVBQWUsUUFBUSxxQkFBcUI7QUFDckQsU0FDRUMsd0JBQXdCLEVBQ3hCQyx3QkFBd0IsRUFDeEJDLHlCQUF5QixFQUN6QkMseUJBQXlCLEVBQ3pCQyx3QkFBd0IsRUFDeEJDLDZCQUE2QixFQUM3QkMsMkJBQTJCLEVBQzNCQywwQkFBMEIsRUFDMUJDLDJCQUEyQixFQUMzQkMseUJBQXlCLEVBQ3pCQyx3QkFBd0IsRUFDeEJDLGtCQUFrQixFQUNsQkMsMkJBQTJCLEVBQzNCQyw4QkFBOEIsRUFDOUJDLHNCQUFzQixFQUN0QkMsK0JBQStCLEVBQy9CQyxxQkFBcUIsRUFDckJDLHNCQUFzQixFQUN0QkMsaUJBQWlCLEVBQ2pCQyx5QkFBeUIsRUFDekJDLG9CQUFvQixFQUNwQkMsa0JBQWtCLEVBQ2xCQyxxQkFBcUIsRUFDckJDLDBCQUEwQixFQUMxQkMsaUJBQWlCLEVBQ2pCQyxxQ0FBcUMsRUFDckNDLGlDQUFpQyxFQUNqQ0MsNEJBQTRCLEVBQzVC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