@projectcor/maia-components 2.49.1-1 → 2.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/lib/App.js +19 -44
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +1 -3
- package/lib/components/atoms/AttachmentCard/AttachmentCardImage.js +1 -3
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +14 -24
- package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.js +10 -28
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +15 -19
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +4 -8
- package/lib/components/atoms/ClientSelector/ClientSelector.js +13 -15
- package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.js +53 -0
- package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.styles.js +8 -0
- package/lib/components/atoms/ContextCompactedNotice/index.js +2 -0
- package/lib/components/atoms/Fade/Fade.js +6 -10
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +1 -3
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +7 -19
- package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.js +2 -3
- package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +2 -3
- package/lib/components/atoms/MAIAInput/MAIAInput.js +7 -14
- package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.js +4 -9
- package/lib/components/atoms/OptionAccessibility/OptionAccessibility.js +5 -4
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +2 -7
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +24 -41
- package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +10 -25
- package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +43 -78
- package/lib/components/atoms/ReasoningBlock/groupParallelSteps.js +11 -9
- package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +15 -37
- package/lib/components/index.js +1 -2
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +2 -3
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +4 -6
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +16 -25
- package/lib/components/molecules/ChatAIContent/ChatAIContent.js +3 -7
- package/lib/components/molecules/ChatAIHome/ChatAIHome.js +72 -93
- package/lib/components/molecules/ChatAIHome/styles.js +78 -85
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +35 -42
- package/lib/components/molecules/ChatAIMessages/newStyles.js +35 -32
- package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +1 -8
- package/lib/components/molecules/ChatAIModal/ChatAIModal.js +8 -25
- package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +2 -2
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +153 -15
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +26 -2
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +367 -63
- package/lib/components/molecules/ChatFooter/ChatFooter.js +4 -10
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +2 -5
- package/lib/components/molecules/Sidebar/Sidebar.js +23 -41
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +2 -2
- package/lib/components/organisms/ProjectSummary/ProjectSummary.js +7 -11
- package/lib/components/organisms/SourcesInformation/SourcesInformationModal.js +1 -4
- package/lib/constants/formatExtensions.js +8 -7
- package/lib/constants/permissions/index.js +2 -2
- package/lib/constants/permissions/utils.js +1 -4
- package/lib/dev/DevReasoningTimeline.js +86 -75
- package/lib/dev/Providers.js +3 -5
- package/lib/hooks/useAgentModel/useUpdateAgent.js +6 -7
- package/lib/hooks/useChatManager/useChatManager.helpers.js +20 -9
- package/lib/hooks/useChatManager/useChatManager.js +21 -15
- package/lib/hooks/useEntitySearch.js +1 -3
- package/lib/hooks/useFrequentlyUsedActions.js +22 -60
- package/lib/hooks/useKnowledge/downloadKnowledge.js +4 -4
- package/lib/hooks/useKnowledge/useKnowledgeOperations.js +15 -16
- package/lib/hooks/useProjectSummaryConfig.js +5 -10
- package/lib/hooks/useReasoningTrace/reasoningStore.js +39 -8
- package/lib/index.js +2 -5
- package/lib/lang/br/index.js +7 -26
- package/lib/lang/en/index.js +7 -26
- package/lib/lang/es/index.js +7 -26
- package/lib/lang/fr/index.js +7 -26
- package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
- package/lib/services/maia/Agents/connectors.js +1 -3
- package/lib/services/utils/mapChatMessages.helpers.js +12 -7
- package/lib/store/sessions/sessionStreamManager.js +101 -94
- package/lib/store/useChatsStore.js +3 -4
- package/lib/styles/cascade.js +3 -29
- package/lib/styles/transitions.js +1 -3
- package/lib/types/Chat.js +1 -1
- package/lib/types/contextCompaction.js +48 -0
- package/lib/types/global.d.js +1 -1
- package/lib/types/jest-dom.d.js +2 -0
- package/lib/types/reasoning.js +1 -1
- package/lib/utils/hoursPlannerQuickActionType.js +1 -74
- package/lib/utils/imagePreprocessor.js +3 -14
- package/lib/utils/navigateContextEntity.js +2 -2
- package/lib/utils/openTaskInCorPanel.js +2 -2
- package/lib/utils/streamActivityMessages.helpers.js +4 -5
- package/lib/utils/streamActivityMessages.js +20 -32
- package/package.json +2 -2
- package/lib/components/atoms/ActionableButton.spec.js +0 -111
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.spec.js +0 -52
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.spec.js +0 -11
- package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.spec.js +0 -63
- package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +0 -183
- package/lib/components/atoms/AttachmentCard/AttachmentCard.spec.js +0 -123
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.spec.js +0 -139
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.spec.js +0 -385
- package/lib/components/atoms/AttachmentCard/AttachmentCardImage.spec.js +0 -78
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.spec.js +0 -94
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.spec.js +0 -396
- package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.spec.js +0 -80
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.spec.js +0 -526
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.spec.js +0 -169
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.spec.js +0 -11
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.spec.js +0 -77
- package/lib/components/atoms/Backdrop/Backdrop.spec.js +0 -28
- package/lib/components/atoms/CardMenu/CardMenu.spec.js +0 -56
- package/lib/components/atoms/ChatClientSelector/ChatClientSelector.spec.js +0 -67
- package/lib/components/atoms/Checkbox/Checkbox.spec.js +0 -27
- package/lib/components/atoms/Chip/Chip.spec.js +0 -82
- package/lib/components/atoms/ChipLlm/ChipLlm.spec.js +0 -26
- package/lib/components/atoms/ClientSelector/ClientSelector.helpers.spec.js +0 -45
- package/lib/components/atoms/ClientSelector/ClientSelector.spec.js +0 -133
- package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +0 -29
- package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.spec.js +0 -46
- package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.spec.js +0 -109
- package/lib/components/atoms/ContextMentionChip/buildChipElement.spec.js +0 -81
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.spec.js +0 -92
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.spec.js +0 -319
- package/lib/components/atoms/ContextMentionItem/ContextMentionItem.spec.js +0 -107
- package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.spec.js +0 -136
- package/lib/components/atoms/CopyToClipboard.spec.js +0 -74
- package/lib/components/atoms/EditableLabel/EditableLabel.spec.js +0 -76
- package/lib/components/atoms/EntitySelector/EntitySelector.spec.js +0 -86
- package/lib/components/atoms/Expand/Expand.spec.js +0 -57
- package/lib/components/atoms/Fade/Fade.spec.js +0 -66
- package/lib/components/atoms/FeedbackButton/FeedbackButton.spec.js +0 -75
- package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.spec.js +0 -104
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.spec.js +0 -91
- package/lib/components/atoms/HelpButton.spec.js +0 -87
- package/lib/components/atoms/ImagePreview/ImagePreview.spec.js +0 -96
- package/lib/components/atoms/ListMenuOption/ListMenuOption.spec.js +0 -54
- package/lib/components/atoms/LoadingFaqs/LoadingFaqs.spec.js +0 -21
- package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.spec.js +0 -20
- package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.spec.js +0 -26
- package/lib/components/atoms/LoadingText/LoadingText.spec.js +0 -25
- package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +0 -42
- package/lib/components/atoms/MAIAError/MAIAError.spec.js +0 -27
- package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.spec.js +0 -113
- package/lib/components/atoms/MAIAInput/MAIAInput.helpers.spec.js +0 -381
- package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +0 -641
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.spec.js +0 -92
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.spec.js +0 -193
- package/lib/components/atoms/MAIAInput/maiaInputLayout.spec.js +0 -32
- package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.spec.js +0 -64
- package/lib/components/atoms/MaiaWrapper/MaiaWrapper.spec.js +0 -43
- package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.spec.js +0 -114
- package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.spec.js +0 -51
- package/lib/components/atoms/ModalClientAccess/ModalClientAccess.spec.js +0 -48
- package/lib/components/atoms/ModalProject/ModalProject.spec.js +0 -66
- package/lib/components/atoms/NextPageLoader.spec.js +0 -37
- package/lib/components/atoms/OnboardingModalButton/OnboardingModal.spec.js +0 -20
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.spec.js +0 -35
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.spec.js +0 -47
- package/lib/components/atoms/OptionAccessibility/OptionAccessibility.spec.js +0 -146
- package/lib/components/atoms/PrimaryButton.spec.js +0 -42
- package/lib/components/atoms/ProjectSelector/ProjectSelector.spec.js +0 -69
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +0 -69
- package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +0 -59
- package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +0 -170
- package/lib/components/atoms/ReasoningBlock/groupParallelSteps.spec.js +0 -199
- package/lib/components/atoms/ReasoningBlock/reasoningLeading.spec.js +0 -70
- package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +0 -120
- package/lib/components/atoms/ReasoningBlock/reasoningMotion.js +0 -8
- package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.spec.js +0 -31
- package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +0 -52
- package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +0 -90
- package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.js +0 -29
- package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.spec.js +0 -38
- package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.spec.js +0 -16
- package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +0 -107
- package/lib/components/atoms/SlashCommandChip/SlashCommandChip.spec.js +0 -24
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.spec.js +0 -71
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +0 -120
- package/lib/components/atoms/Switch/Switch.spec.js +0 -41
- package/lib/components/atoms/TextArea/CustomTextArea.spec.js +0 -52
- package/lib/components/atoms/TextArea/TextArea.helpers.spec.js +0 -25
- package/lib/components/atoms/TextArea/TextArea.spec.js +0 -126
- package/lib/components/atoms/ThirdButton.spec.js +0 -29
- package/lib/components/atoms/VideoModal/VideoModal.spec.js +0 -68
- package/lib/components/atoms/WithAppCfg.spec.js +0 -82
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.spec.js +0 -53
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +0 -742
- package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.spec.js +0 -107
- package/lib/components/molecules/AbmSection/AbmGeneralSection.spec.js +0 -256
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.spec.js +0 -175
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.spec.js +0 -318
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.spec.js +0 -50
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.spec.js +0 -94
- package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +0 -83
- package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +0 -30
- package/lib/components/molecules/AgentInputBlock/index.js +0 -5
- package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +0 -52
- package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +0 -76
- package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +0 -20
- package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +0 -34
- package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +0 -36
- package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.spec.js +0 -66
- package/lib/components/molecules/ChatAIContent/ChatAIContent.spec.js +0 -145
- package/lib/components/molecules/ChatAIHistory/ChatAIHistory.spec.js +0 -204
- package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.spec.js +0 -622
- package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +0 -264
- package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.spec.js +0 -86
- package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +0 -104
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.spec.js +0 -742
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +0 -541
- package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +0 -46
- package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +0 -1394
- package/lib/components/molecules/ChatAIModal/ChatAIModal.spec.js +0 -1401
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.spec.js +0 -33
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.spec.js +0 -116
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.spec.js +0 -134
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.spec.js +0 -142
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.spec.js +0 -241
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.utils.js +0 -69
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.utils.spec.js +0 -144
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeaderAgentDropdown.js +0 -95
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeaderAgentSelector.js +0 -174
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeaderLayoutMenu.js +0 -99
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeaderLayoutMenu.spec.js +0 -65
- package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +0 -37
- package/lib/components/molecules/ChatAIModal/constants.spec.js +0 -16
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.spec.js +0 -22
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.spec.js +0 -67
- package/lib/components/molecules/ChatAIModal/layout.spec.js +0 -72
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.spec.js +0 -93
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.spec.js +0 -297
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.spec.js +0 -62
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +0 -221
- package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.spec.js +0 -66
- package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +0 -369
- package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.spec.js +0 -10
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.spec.js +0 -104
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.spec.js +0 -139
- package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +0 -84
- package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +0 -116
- package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.spec.js +0 -126
- package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.spec.js +0 -115
- package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.spec.js +0 -79
- package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.spec.js +0 -37
- package/lib/components/molecules/Sidebar/Sidebar.helpers.spec.js +0 -119
- package/lib/components/molecules/Sidebar/Sidebar.spec.js +0 -464
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.spec.js +0 -1067
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +0 -1236
- package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.spec.js +0 -112
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.spec.js +0 -77
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +0 -503
- package/lib/components/organisms/ChatAI/ChatAI.spec.js +0 -174
- package/lib/components/organisms/ChatAIPage/ChatAIPage.js +0 -525
- package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +0 -246
- package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +0 -16
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +0 -253
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +0 -139
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +0 -13
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +0 -284
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +0 -275
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +0 -196
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +0 -94
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +0 -69
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +0 -38
- package/lib/components/organisms/ChatAIPage/getDaypart.js +0 -9
- package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +0 -19
- package/lib/components/organisms/ChatAIPage/index.js +0 -3
- package/lib/components/organisms/ClientAIButton/ClientAIButton.spec.js +0 -53
- package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +0 -59
- package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +0 -79
- package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +0 -86
- package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.spec.js +0 -49
- package/lib/components/organisms/ProjectAIButton/ProjectAIButton.spec.js +0 -67
- package/lib/components/organisms/ProjectSummary/ProjectSummary.spec.js +0 -117
- package/lib/components/organisms/SnackBar/Snackbar.spec.js +0 -66
- package/lib/components/organisms/SourcesInformation/SourceItem.spec.js +0 -19
- package/lib/components/organisms/SourcesInformation/SourcesInformationModal.spec.js +0 -52
- package/lib/constants/formatExtensions.spec.js +0 -14
- package/lib/constants/maiaExternalConnectorsAccess.spec.js +0 -29
- package/lib/constants/maiaFeatureAccess.spec.js +0 -30
- package/lib/constants/maiaHourAgentAccess.spec.js +0 -30
- package/lib/constants/maiaTaskPanelAccess.spec.js +0 -41
- package/lib/constants/permissions/clientRoleAccess.spec.js +0 -65
- package/lib/constants/permissions/utils.spec.js +0 -128
- package/lib/constants/plannerSyncEvents.spec.js +0 -31
- package/lib/constants/taskUrls.spec.js +0 -9
- package/lib/dev/DevMaiaPage.js +0 -30
- package/lib/hooks/frequentlyUsedActionsCache.js +0 -17
- package/lib/hooks/frequentlyUsedActionsCache.spec.js +0 -25
- package/lib/hooks/useAccessClient/useAccessClient.spec.js +0 -149
- package/lib/hooks/useAgentModel/useAgentModel.spec.js +0 -83
- package/lib/hooks/useAgentModel/useCreateAgent.helpers.spec.js +0 -268
- package/lib/hooks/useAgentModel/useCreateAgent.spec.js +0 -314
- package/lib/hooks/useAgentModel/useDeleteAgent.spec.js +0 -183
- package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +0 -374
- package/lib/hooks/useAgentSuggestions.spec.js +0 -89
- package/lib/hooks/useCaretPosition.spec.js +0 -58
- package/lib/hooks/useChatManager/useChatManager.helpers.spec.js +0 -2027
- package/lib/hooks/useChatManager/useChatManager.spec.js +0 -2409
- package/lib/hooks/useChatMessages/useChatMessages.helpers.spec.js +0 -491
- package/lib/hooks/useChatMessages/useChatMessages.spec.js +0 -729
- package/lib/hooks/useChats/useChats.spec.js +0 -208
- package/lib/hooks/useClientSearch.helpers.spec.js +0 -52
- package/lib/hooks/useClientSearch.spec.js +0 -86
- package/lib/hooks/useContextMentions.helpers.spec.js +0 -267
- package/lib/hooks/useContextMentions.spec.js +0 -338
- package/lib/hooks/useContextPinPopover.helpers.spec.js +0 -183
- package/lib/hooks/useContextPinPopover.spec.js +0 -159
- package/lib/hooks/useContinueLegacyContextInNewChat/index.js +0 -2
- package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +0 -93
- package/lib/hooks/useDebounce.spec.js +0 -42
- package/lib/hooks/useEntitySearch.helpers.spec.js +0 -723
- package/lib/hooks/useEntitySearch.spec.js +0 -718
- package/lib/hooks/useEvent.spec.js +0 -45
- package/lib/hooks/useFrequentlyAskedQuestions.spec.js +0 -222
- package/lib/hooks/useFrequentlyUsedActions.spec.js +0 -135
- package/lib/hooks/useIsMaiaPageRoute.js +0 -26
- package/lib/hooks/useIsMaiaPageRoute.spec.js +0 -26
- package/lib/hooks/useKnowledge/deleteKnowledge.spec.js +0 -122
- package/lib/hooks/useKnowledge/downloadKnowledge.spec.js +0 -148
- package/lib/hooks/useKnowledge/saveKnowledge.spec.js +0 -104
- package/lib/hooks/useKnowledge/useKnowledgeOperations.spec.js +0 -178
- package/lib/hooks/useMaiaChatSessionMeta/index.js +0 -2
- package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +0 -24
- package/lib/hooks/useMentionAllowedTypes.spec.js +0 -89
- package/lib/hooks/useMentionPopover.helpers.spec.js +0 -100
- package/lib/hooks/useMentionPopover.spec.js +0 -392
- package/lib/hooks/useMinimizedPillBottomOffset.helpers.spec.js +0 -176
- package/lib/hooks/useMinimizedPillBottomOffset.spec.js +0 -89
- package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +0 -67
- package/lib/hooks/useModal/useModal.spec.js +0 -73
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.spec.js +0 -138
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.spec.js +0 -417
- package/lib/hooks/useProjectSearch.helpers.spec.js +0 -89
- package/lib/hooks/useProjectSearch.spec.js +0 -91
- package/lib/hooks/useProjectSummary.spec.js +0 -193
- package/lib/hooks/useProjectSummaryConfig.helpers.spec.js +0 -151
- package/lib/hooks/useProjectSummaryConfig.spec.js +0 -133
- package/lib/hooks/useReasoningTrace/reasoningStore.spec.js +0 -112
- package/lib/hooks/useRecentClientsSearch.helpers.spec.js +0 -33
- package/lib/hooks/useRecentClientsSearch.spec.js +0 -85
- package/lib/hooks/useRecentContexts.spec.js +0 -139
- package/lib/hooks/useResize.spec.js +0 -37
- package/lib/hooks/useSkillsCatalog.spec.js +0 -88
- package/lib/hooks/useSlashCommands.spec.js +0 -139
- package/lib/hooks/useSmoothStreamText/useSmoothStreamText.spec.js +0 -101
- package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +0 -33
- package/lib/hooks/useStreamResponse.spec.js +0 -199
- package/lib/hooks/useT.spec.js +0 -20
- package/lib/hooks/useToggle.spec.js +0 -33
- package/lib/hooks/useToggleFavorite/useToggleFavorite.spec.js +0 -171
- package/lib/services/appcues.spec.js +0 -37
- package/lib/services/maia/Access/updateAccess.spec.js +0 -137
- package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +0 -56
- package/lib/services/maia/Actions/getSlashCommands.spec.js +0 -91
- package/lib/services/maia/Agents/connectors.spec.js +0 -496
- package/lib/services/maia/Agents/createAgent.spec.js +0 -55
- package/lib/services/maia/Agents/deleteAgent.spec.js +0 -57
- package/lib/services/maia/Agents/fetchAgentDetail.spec.js +0 -108
- package/lib/services/maia/Agents/getAgentById.spec.js +0 -190
- package/lib/services/maia/Agents/getAgentModels.spec.js +0 -190
- package/lib/services/maia/Agents/getAgentSuggestions.spec.js +0 -89
- package/lib/services/maia/Agents/getAgents.helpers.spec.js +0 -325
- package/lib/services/maia/Agents/getAgents.spec.js +0 -1135
- package/lib/services/maia/Agents/setAgentToolGroups.spec.js +0 -45
- package/lib/services/maia/Agents/toggleFavorite.spec.js +0 -59
- package/lib/services/maia/Agents/updateAgent.spec.js +0 -48
- package/lib/services/maia/Chats/deleteChat.spec.js +0 -31
- package/lib/services/maia/Chats/getChatMessages.spec.js +0 -150
- package/lib/services/maia/Chats/getChatsByUserId.spec.js +0 -149
- package/lib/services/maia/Chats/markSessionAsRead.spec.js +0 -30
- package/lib/services/maia/Chats/patchChat.spec.js +0 -41
- package/lib/services/maia/Chats/wasHelpfulChat.spec.js +0 -28
- package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +0 -58
- package/lib/services/maia/Knowledge/delete.spec.js +0 -45
- package/lib/services/maia/Knowledge/download.spec.js +0 -78
- package/lib/services/maia/Knowledge/save.spec.js +0 -58
- package/lib/services/maia/Orchestrator/orchestrator.helpers.spec.js +0 -225
- package/lib/services/maia/Orchestrator/orchestrator.spec.js +0 -181
- package/lib/services/maia/RecentClients/getRecentClients.spec.js +0 -52
- package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +0 -103
- package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +0 -82
- package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +0 -63
- package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +0 -82
- package/lib/services/maia/Skills/createSkill.spec.js +0 -68
- package/lib/services/maia/Skills/deleteSkill.spec.js +0 -42
- package/lib/services/maia/Skills/generateSkill.spec.js +0 -48
- package/lib/services/maia/Skills/getSkills.spec.js +0 -152
- package/lib/services/maia/Skills/updateSkill.spec.js +0 -62
- package/lib/services/maia/client.spec.js +0 -56
- package/lib/services/utils/fetchCOR.spec.js +0 -211
- package/lib/services/utils/getCookie.spec.js +0 -20
- package/lib/services/utils/mapChatMessages.helpers.spec.js +0 -336
- package/lib/services/utils/mapChatMessages.spec.js +0 -254
- package/lib/store/chatsSidebarOptimistic.spec.js +0 -145
- package/lib/store/maiaLastChatPersistence.spec.js +0 -22
- package/lib/store/maiaPanelSessionPersistence.spec.js +0 -62
- package/lib/store/sessions/sessionNotificationSound.spec.js +0 -145
- package/lib/store/sessions/sessionNotifications.helpers.spec.js +0 -63
- package/lib/store/sessions/sessionNotifications.spec.js +0 -106
- package/lib/store/sessions/sessionStreamManager.helpers.spec.js +0 -177
- package/lib/store/sessions/sessionStreamManager.spec.js +0 -939
- package/lib/store/sessions/sessions.types.spec.js +0 -16
- package/lib/store/sessions/useSessionsStore.spec.js +0 -135
- package/lib/store/useChatsStore.spec.js +0 -619
- package/lib/store/useFaqsStore.spec.js +0 -57
- package/lib/utils/actionCategoryMap.spec.js +0 -18
- package/lib/utils/agentDisplayName.spec.js +0 -48
- package/lib/utils/autoApproveStorage.spec.js +0 -25
- package/lib/utils/chatInputFiles.spec.js +0 -39
- package/lib/utils/contextMentionIcons.spec.js +0 -41
- package/lib/utils/contextMentionLabel.spec.js +0 -13
- package/lib/utils/contextMentionTriggers.spec.js +0 -44
- package/lib/utils/contextMentionTypeLabel.spec.js +0 -14
- package/lib/utils/corConnectorMentionTypes.spec.js +0 -23
- package/lib/utils/entityLinkRender.spec.js +0 -72
- package/lib/utils/fileDownloadHelper.spec.js +0 -67
- package/lib/utils/formatQuickActionMessage.spec.js +0 -27
- package/lib/utils/formatUnreadCount.spec.js +0 -12
- package/lib/utils/getUnitFileSize.spec.js +0 -18
- package/lib/utils/hitlAnalytics.spec.js +0 -136
- package/lib/utils/hoursPlannerQuickActionType.spec.js +0 -64
- package/lib/utils/imagePreprocessor.helpers.spec.js +0 -28
- package/lib/utils/imagePreprocessor.spec.js +0 -112
- package/lib/utils/maiaPageRoute.js +0 -24
- package/lib/utils/maiaPageRoute.spec.js +0 -23
- package/lib/utils/mapBackendLang.spec.js +0 -19
- package/lib/utils/navigateContextEntity.spec.js +0 -50
- package/lib/utils/normalizeAgentConnectors.spec.js +0 -98
- package/lib/utils/openTaskInCorPanel.spec.js +0 -43
- package/lib/utils/orchestratorSubagents.spec.js +0 -32
- package/lib/utils/reasoningMappers.spec.js +0 -103
- package/lib/utils/recentContextsHomeLimit.spec.js +0 -32
- package/lib/utils/renderContextMentions.helpers.spec.js +0 -87
- package/lib/utils/renderContextMentions.spec.js +0 -268
- package/lib/utils/retryCompletion.spec.js +0 -181
- package/lib/utils/skillContentSize.spec.js +0 -13
- package/lib/utils/slashCommandMarker.spec.js +0 -43
- package/lib/utils/sortManagerHoursHomeFuas.spec.js +0 -51
- package/lib/utils/sseStreamContent.spec.js +0 -31
- package/lib/utils/streamActivityMessages.helpers.spec.js +0 -84
- package/lib/utils/streamActivityMessages.spec.js +0 -336
- 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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
|