@projectcor/maia-components 2.29.0 → 2.30.1-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +656 -0
- package/lib/App.js +55 -0
- package/lib/components/atoms/ActionableButton.js +60 -0
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.js +89 -0
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.styles.js +21 -0
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.js +9 -0
- package/lib/components/atoms/AgentActivityIndicator/index.js +2 -0
- package/lib/components/atoms/ApprovalBox/ApprovalBox.js +209 -0
- package/lib/components/atoms/ApprovalBox/ApprovalBox.styles.js +93 -0
- package/lib/components/atoms/ApprovalBox/index.js +2 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCard.js +218 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCard.styles.js +52 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +448 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.styles.js +58 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCardImage.js +55 -0
- package/lib/components/atoms/AttachmentCard/AttachmentCardImage.styles.js +14 -0
- package/lib/components/atoms/AttachmentCard/index.js +4 -0
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +442 -0
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.styles.js +119 -0
- package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.js +222 -0
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +313 -0
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +128 -0
- package/lib/components/atoms/AttachmentPreviewModal/index.js +2 -0
- package/lib/components/atoms/Backdrop/Backdrop.js +17 -0
- package/lib/components/atoms/Backdrop/Backdrop.styles.js +9 -0
- package/lib/components/atoms/Backdrop/index.js +2 -0
- package/lib/components/atoms/CardItem.js +7 -0
- package/lib/components/atoms/CardMenu/CardMenu.js +131 -0
- package/lib/components/atoms/CardMenu/index.js +2 -0
- package/lib/components/atoms/CardMenu/styles.js +21 -0
- package/lib/components/atoms/ChatClientSelector/ChatClientSelector.js +77 -0
- package/lib/components/atoms/ChatClientSelector/index.js +2 -0
- package/lib/components/atoms/ChatDisclaimerMessage/ChatDisclaimerMessage.js +9 -0
- package/lib/components/atoms/ChatDisclaimerMessage/index.js +2 -0
- package/lib/components/atoms/ChatDisclaimerMessage/styles.js +6 -0
- package/lib/components/atoms/Checkbox/Checkbox.js +34 -0
- package/lib/components/atoms/Checkbox/index.js +2 -0
- package/lib/components/atoms/Checkbox/styles.js +39 -0
- package/lib/components/atoms/Chip/Chip.js +150 -0
- package/lib/components/atoms/Chip/index.js +2 -0
- package/lib/components/atoms/Chip/styles.js +43 -0
- package/lib/components/atoms/ChipLlm/ChipLlm.js +45 -0
- package/lib/components/atoms/ChipLlm/ChipLlm.style.js +21 -0
- package/lib/components/atoms/ChipLlm/index.js +2 -0
- package/lib/components/atoms/ChipStatus/ChipStatus.interface.js +2 -0
- package/lib/components/atoms/ChipStatus/ChipStatus.js +14 -0
- package/lib/components/atoms/ChipStatus/ChipStatus.styles.js +27 -0
- package/lib/components/atoms/ChipStatus/index.js +2 -0
- package/lib/components/atoms/ClearButton.js +6 -0
- package/lib/components/atoms/ClientSelector/ClientSelector.js +146 -0
- package/lib/components/atoms/ClientSelector/ClientSelector.styles.js +15 -0
- package/lib/components/atoms/ClientSelector/index.js +2 -0
- package/lib/components/atoms/ContextMentionChip/ContextMentionChip.js +38 -0
- package/lib/components/atoms/ContextMentionChip/ContextMentionChip.styles.js +188 -0
- package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.js +39 -0
- package/lib/components/atoms/ContextMentionChip/buildChipElement.js +445 -0
- package/lib/components/atoms/ContextMentionChip/index.js +4 -0
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +533 -0
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.styles.js +10 -0
- package/lib/components/atoms/ContextMentionEditor/index.js +2 -0
- package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +282 -0
- package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +148 -0
- package/lib/components/atoms/ContextMentionItem/index.js +2 -0
- package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +290 -0
- package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.styles.js +108 -0
- package/lib/components/atoms/ContextMentionPopover/index.js +3 -0
- package/lib/components/atoms/CopyToClipboard.js +70 -0
- package/lib/components/atoms/EditableLabel/EditableLabel.js +110 -0
- package/lib/components/atoms/EditableLabel/index.js +2 -0
- package/lib/components/atoms/EditableLabel/styles.js +7 -0
- package/lib/components/atoms/EmptySearchClients/EmptySearchClients.js +22 -0
- package/lib/components/atoms/EmptySearchClients/EmptySearchClients.styles.js +18 -0
- package/lib/components/atoms/EmptySearchClients/index.js +2 -0
- package/lib/components/atoms/EmptySearchProjects/EmptySearchProjects.js +19 -0
- package/lib/components/atoms/EmptySearchProjects/EmptySearchProjects.styles.js +15 -0
- package/lib/components/atoms/EmptySearchProjects/index.js +2 -0
- package/lib/components/atoms/EntitySelector/EntitySelector.js +247 -0
- package/lib/components/atoms/EntitySelector/EntitySelector.skeleton.js +38 -0
- package/lib/components/atoms/EntitySelector/EntitySelector.styles.js +67 -0
- package/lib/components/atoms/EntitySelector/index.js +2 -0
- package/lib/components/atoms/ErrorSearchClients/ErrorSearchClients.js +14 -0
- package/lib/components/atoms/ErrorSearchClients/ErrorSearchClients.styles.js +15 -0
- package/lib/components/atoms/ErrorSearchFaqs/ErrorSearchFaqs.js +14 -0
- package/lib/components/atoms/ErrorSearchFaqs/ErrorSearchFaqs.style.js +15 -0
- package/lib/components/atoms/ErrorSearchFaqs/index.js +2 -0
- package/lib/components/atoms/ErrorSearchProjects/ErrorSearchProjects.js +18 -0
- package/lib/components/atoms/ErrorSearchProjects/ErrorSearchProjects.style.js +15 -0
- package/lib/components/atoms/ErrorSearchProjects/index.js +2 -0
- package/lib/components/atoms/Expand/Expand.js +32 -0
- package/lib/components/atoms/Expand/index.js +2 -0
- package/lib/components/atoms/Fade/Fade.js +56 -0
- package/lib/components/atoms/Fade/index.js +2 -0
- package/lib/components/atoms/FeedbackButton/FeedbackButton.js +59 -0
- package/lib/components/atoms/FeedbackButton/FeedbackButton.styles.js +14 -0
- package/lib/components/atoms/FeedbackButton/index.js +2 -0
- package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.js +138 -0
- package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.skeleton.js +44 -0
- package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.styles.js +43 -0
- package/lib/components/atoms/FrequentlyAskedQuestions/index.js +2 -0
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +122 -0
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.skeleton.js +43 -0
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +62 -0
- package/lib/components/atoms/FrequentlyUsedActions/index.js +2 -0
- package/lib/components/atoms/GoBackButton.js +24 -0
- package/lib/components/atoms/HelpButton.js +44 -0
- package/lib/components/atoms/IconButton.js +56 -0
- package/lib/components/atoms/ImagePreview/ImagePreview.js +96 -0
- package/lib/components/atoms/ImagePreview/ImagePreview.styles.js +70 -0
- package/lib/components/atoms/Input/CustomInput.interface.js +2 -0
- package/lib/components/atoms/Input/CustomInput.js +91 -0
- package/lib/components/atoms/Input/CustomInput.styles.js +39 -0
- package/lib/components/atoms/Input/index.js +2 -0
- package/lib/components/atoms/ListMenuOption/ListMenuOption.js +41 -0
- package/lib/components/atoms/ListMenuOption/index.js +2 -0
- package/lib/components/atoms/ListMenuOption/styles.js +9 -0
- package/lib/components/atoms/Loader.js +41 -0
- package/lib/components/atoms/LoadingFaqs/LoadingFaqs.js +11 -0
- package/lib/components/atoms/LoadingFaqs/LoadingFaqs.style.js +6 -0
- package/lib/components/atoms/LoadingFaqs/index.js +2 -0
- package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.js +11 -0
- package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.styles.js +6 -0
- package/lib/components/atoms/LoadingSearchClients/index.js +2 -0
- package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.js +14 -0
- package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.style.js +10 -0
- package/lib/components/atoms/LoadingSearchProjects/index.js +2 -0
- package/lib/components/atoms/LoadingText/LoadingText.js +18 -0
- package/lib/components/atoms/LoadingText/index.js +2 -0
- package/lib/components/atoms/LoadingText/styles.js +7 -0
- package/lib/components/atoms/MAIAButton/MAIAButton.js +33 -0
- package/lib/components/atoms/MAIAButton/index.js +2 -0
- package/lib/components/atoms/MAIAError/MAIAError.js +15 -0
- package/lib/components/atoms/MAIAError/index.js +2 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.js +1233 -0
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +266 -0
- package/lib/components/atoms/MAIAInput/index.js +2 -0
- package/lib/components/atoms/MAIAInput/maiaInputLayout.js +25 -0
- package/lib/components/atoms/MAIAInput/styles.js +186 -0
- package/lib/components/atoms/MAIAMessage/MAIAMessage.interfaces.js +2 -0
- package/lib/components/atoms/MAIAMessage/MAIAMessage.js +22 -0
- package/lib/components/atoms/MAIAMessage/index.js +2 -0
- package/lib/components/atoms/MAIAMessage/styles.js +7 -0
- package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.config.js +23 -0
- package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.interfaces.js +2 -0
- package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.js +51 -0
- package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.styles.js +26 -0
- package/lib/components/atoms/MaiaStreamdown/index.js +2 -0
- package/lib/components/atoms/MaiaWrapper/MaiaWrapper.js +18 -0
- package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.js +84 -0
- package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.js +15 -0
- package/lib/components/atoms/MaiaWrapper/index.js +3 -0
- package/lib/components/atoms/MaiaWrapper/styles.js +21 -0
- package/lib/components/atoms/ModalClientAccess/ModalClientAccess.interface.js +2 -0
- package/lib/components/atoms/ModalClientAccess/ModalClientAccess.js +84 -0
- package/lib/components/atoms/ModalClientAccess/ModalClientAccess.styles.js +53 -0
- package/lib/components/atoms/ModalClientAccess/index.js +2 -0
- package/lib/components/atoms/ModalInfo/ModalInfo.js +52 -0
- package/lib/components/atoms/ModalInfo/ModalInfoContent.js +7 -0
- package/lib/components/atoms/ModalInfo/index.js +3 -0
- package/lib/components/atoms/ModalInfo/styles.js +7 -0
- package/lib/components/atoms/ModalProject/ModalProject.interface.js +2 -0
- package/lib/components/atoms/ModalProject/ModalProject.js +112 -0
- package/lib/components/atoms/ModalProject/ModalProject.style.js +59 -0
- package/lib/components/atoms/ModalProject/index.js +2 -0
- package/lib/components/atoms/NextPageLoader.js +33 -0
- package/lib/components/atoms/OnboardingModalButton/OnboardingModal.js +28 -0
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +180 -0
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.styles.js +34 -0
- package/lib/components/atoms/OnboardingModalButton/index.js +3 -0
- package/lib/components/atoms/OptionAccessibility/OptionAccessibility.js +131 -0
- package/lib/components/atoms/OptionAccessibility/OptionAccessibility.styles.js +59 -0
- package/lib/components/atoms/OptionAccessibility/index.js +2 -0
- package/lib/components/atoms/OptionCorPermission/OptionCorPermission.js +27 -0
- package/lib/components/atoms/OptionCorPermission/OptionCorPermission.styles.js +18 -0
- package/lib/components/atoms/OptionCorPermission/index.js +2 -0
- package/lib/components/atoms/PrimaryButton.js +31 -0
- package/lib/components/atoms/ProjectSelector/ProjectSelector.js +77 -0
- package/lib/components/atoms/ProjectSelector/ProjectSelector.styles.js +61 -0
- package/lib/components/atoms/ProjectSelector/index.js +2 -0
- package/lib/components/atoms/SecondaryButton.js +20 -0
- package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.js +20 -0
- package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.styles.js +20 -0
- package/lib/components/atoms/SessionGeneratingDot/index.js +2 -0
- package/lib/components/atoms/Skeleton/Skeleton.js +36 -0
- package/lib/components/atoms/Skeleton/index.js +2 -0
- package/lib/components/atoms/SkillsDropdown/SkillsDropdown.js +208 -0
- package/lib/components/atoms/SkillsDropdown/SkillsDropdown.styles.js +77 -0
- package/lib/components/atoms/SkillsDropdown/index.js +2 -0
- package/lib/components/atoms/SlashCommandChip/SlashCommandChip.js +16 -0
- package/lib/components/atoms/SlashCommandChip/SlashCommandChip.styles.js +24 -0
- package/lib/components/atoms/SlashCommandChip/buildSlashChipElement.js +18 -0
- package/lib/components/atoms/SlashCommandChip/index.js +4 -0
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +210 -0
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.styles.js +53 -0
- package/lib/components/atoms/SlashCommandDropdown/index.js +2 -0
- package/lib/components/atoms/Switch/Switch.js +27 -0
- package/lib/components/atoms/Switch/Switch.styles.js +22 -0
- package/lib/components/atoms/Switch/index.js +2 -0
- package/lib/components/atoms/TextArea/CustomTextArea.interface.js +2 -0
- package/lib/components/atoms/TextArea/CustomTextArea.js +93 -0
- package/lib/components/atoms/TextArea/CustomTextArea.styles.js +25 -0
- package/lib/components/atoms/TextArea/TextArea.interfaces.js +2 -0
- package/lib/components/atoms/TextArea/TextArea.js +172 -0
- package/lib/components/atoms/TextArea/TextArea.styles.js +16 -0
- package/lib/components/atoms/TextArea/index.js +2 -0
- package/lib/components/atoms/ThirdButton.js +19 -0
- package/lib/components/atoms/VideoModal/VideoModal.js +76 -0
- package/lib/components/atoms/VideoModal/index.js +2 -0
- package/lib/components/atoms/WithAppCfg.js +26 -0
- package/lib/components/atoms/WithFeatureValidation.js +23 -0
- package/lib/components/atoms/WrapperCenterIcon/WrapperCenterIcon.js +9 -0
- package/lib/components/atoms/WrapperCenterIcon/WrapperCenterIcon.styles.js +6 -0
- package/lib/components/atoms/WrapperCenterIcon/index.js +2 -0
- package/lib/components/atoms/icons/AIIcon.js +23 -0
- package/lib/components/atoms/icons/AacFile.js +39 -0
- package/lib/components/atoms/icons/AccessibilityIcon.js +42 -0
- package/lib/components/atoms/icons/ActionAssignIcon.js +111 -0
- package/lib/components/atoms/icons/ActionCalendarIcon.js +112 -0
- package/lib/components/atoms/icons/ActionChargeHoursIcon.js +111 -0
- package/lib/components/atoms/icons/ActionChatIcon.js +71 -0
- package/lib/components/atoms/icons/ActionCreateIcon.js +91 -0
- package/lib/components/atoms/icons/ActionCreateReworkIcon.js +39 -0
- package/lib/components/atoms/icons/ActionCreateSubtaskIcon.js +37 -0
- package/lib/components/atoms/icons/ActionEditIcon.js +39 -0
- package/lib/components/atoms/icons/ActionSummaryMessagesIcon.js +88 -0
- package/lib/components/atoms/icons/ActionSummaryTaskIcon.js +37 -0
- package/lib/components/atoms/icons/ActionTimeBackIcon.js +112 -0
- package/lib/components/atoms/icons/AgentMaiaIcon.js +31 -0
- package/lib/components/atoms/icons/Brain.js +77 -0
- package/lib/components/atoms/icons/CorAccessIcon.js +41 -0
- package/lib/components/atoms/icons/CorLogo.js +76 -0
- package/lib/components/atoms/icons/CsvFile.js +41 -0
- package/lib/components/atoms/icons/DocFile.js +41 -0
- package/lib/components/atoms/icons/DocxFile.js +41 -0
- package/lib/components/atoms/icons/EmptyClientIllustration.js +67 -0
- package/lib/components/atoms/icons/EmptyHistory.js +46 -0
- package/lib/components/atoms/icons/EmptySearchIllustration.js +37 -0
- package/lib/components/atoms/icons/EmptyState.js +84 -0
- package/lib/components/atoms/icons/EmptyStateAgents.js +58 -0
- package/lib/components/atoms/icons/ErrorIcon.js +14 -0
- package/lib/components/atoms/icons/ErrorSearchIllustration.js +52 -0
- package/lib/components/atoms/icons/ErrorState.js +51 -0
- package/lib/components/atoms/icons/FaqChevronIcon.js +39 -0
- package/lib/components/atoms/icons/FaqsIcon.js +51 -0
- package/lib/components/atoms/icons/FlacIcon.js +39 -0
- package/lib/components/atoms/icons/FolderIcon.js +29 -0
- package/lib/components/atoms/icons/HomeIcon.js +30 -0
- package/lib/components/atoms/icons/ImageFile.js +46 -0
- package/lib/components/atoms/icons/M4aFile.js +39 -0
- package/lib/components/atoms/icons/MAIAIcon.js +20 -0
- package/lib/components/atoms/icons/MAIAIsologo.js +65 -0
- package/lib/components/atoms/icons/MDFile.js +41 -0
- package/lib/components/atoms/icons/MaiaChatLayoutFloatingIcon.js +41 -0
- package/lib/components/atoms/icons/MaiaChatLayoutFullscreenIcon.js +41 -0
- package/lib/components/atoms/icons/MaiaChatLayoutMenuIcon.js +33 -0
- package/lib/components/atoms/icons/MaiaChatLayoutSidebarIcon.js +41 -0
- package/lib/components/atoms/icons/MaiaInputAddIcon.js +42 -0
- package/lib/components/atoms/icons/MaiaInputAttachIcon.js +29 -0
- package/lib/components/atoms/icons/MaiaInputAttachmentImageIcon.js +33 -0
- package/lib/components/atoms/icons/MaiaInputDeepSearchIcon.js +35 -0
- package/lib/components/atoms/icons/MaiaInputMentionIcon.js +44 -0
- package/lib/components/atoms/icons/MaiaInputRobotIcon.js +29 -0
- package/lib/components/atoms/icons/MaiaInputSendIcon.js +29 -0
- package/lib/components/atoms/icons/MaiaInputSlashIcon.js +29 -0
- package/lib/components/atoms/icons/MaiaInputWebSearchIcon.js +35 -0
- package/lib/components/atoms/icons/MaiaSettingsProject.js +111 -0
- package/lib/components/atoms/icons/MaiaSettingsProjectV2.js +193 -0
- package/lib/components/atoms/icons/MaiaSparkleIcon.js +75 -0
- package/lib/components/atoms/icons/MaiaStoreIcon.js +31 -0
- package/lib/components/atoms/icons/Mp3File.js +39 -0
- package/lib/components/atoms/icons/Mp4File.js +39 -0
- package/lib/components/atoms/icons/MyAgentsNavIcon.js +51 -0
- package/lib/components/atoms/icons/NewChat.js +29 -0
- package/lib/components/atoms/icons/NotionIcon.js +36 -0
- package/lib/components/atoms/icons/OgaFile.js +39 -0
- package/lib/components/atoms/icons/OggFile.js +39 -0
- package/lib/components/atoms/icons/PdfFile.js +39 -0
- package/lib/components/atoms/icons/PlusIcon.js +29 -0
- package/lib/components/atoms/icons/PptFile.js +47 -0
- package/lib/components/atoms/icons/PptxFile.js +49 -0
- package/lib/components/atoms/icons/RetryIcon.js +34 -0
- package/lib/components/atoms/icons/SkillCreatedByIcon.js +20 -0
- package/lib/components/atoms/icons/SkillIcon.js +30 -0
- package/lib/components/atoms/icons/SkillVisibilityEveryoneIcon.js +23 -0
- package/lib/components/atoms/icons/SkillVisibilityOnlyMeIcon.js +23 -0
- package/lib/components/atoms/icons/SkillsNavIcon.js +24 -0
- package/lib/components/atoms/icons/SubtaskIcon.js +36 -0
- package/lib/components/atoms/icons/TaskLinkIcon.js +27 -0
- package/lib/components/atoms/icons/TelescopeIcon.js +60 -0
- package/lib/components/atoms/icons/TemplateGradientIcon.js +42 -0
- package/lib/components/atoms/icons/TextFile.js +41 -0
- package/lib/components/atoms/icons/WavFile.js +39 -0
- package/lib/components/atoms/icons/WebmFile.js +50 -0
- package/lib/components/atoms/icons/XlsFile.js +42 -0
- package/lib/components/atoms/icons/XlsxFile.js +42 -0
- package/lib/components/atoms/icons/index.js +54 -0
- package/lib/components/atoms/index.js +42 -0
- package/lib/components/index.js +11 -0
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.interface.js +2 -0
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +236 -0
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.styles.js +53 -0
- package/lib/components/molecules/AbmSection/AbmGeneralSection.js +415 -0
- package/lib/components/molecules/AbmSection/AbmGeneralSection.styles.js +152 -0
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +374 -0
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.styles.js +106 -0
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +92 -0
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.styles.js +57 -0
- package/lib/components/molecules/AbmSection/index.js +4 -0
- package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.js +52 -0
- package/lib/components/molecules/ChatAIClientSelector/index.js +2 -0
- package/lib/components/molecules/ChatAIContent/ChatAIContent.js +119 -0
- package/lib/components/molecules/ChatAIContent/ChatAIContent.skeleton.js +187 -0
- package/lib/components/molecules/ChatAIContent/ChatAIContent.styles.js +6 -0
- package/lib/components/molecules/ChatAIContent/index.js +2 -0
- package/lib/components/molecules/ChatAIHistory/ChatAIHistory.js +241 -0
- package/lib/components/molecules/ChatAIHistory/index.js +2 -0
- package/lib/components/molecules/ChatAIHistory/styles.js +22 -0
- package/lib/components/molecules/ChatAIHome/ChatAIHome.js +649 -0
- package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.js +115 -0
- package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.styles.js +95 -0
- package/lib/components/molecules/ChatAIHome/index.js +2 -0
- package/lib/components/molecules/ChatAIHome/styles.js +335 -0
- package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.js +137 -0
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +853 -0
- package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.js +47 -0
- package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.styles.js +37 -0
- package/lib/components/molecules/ChatAIMessages/README.md +101 -0
- package/lib/components/molecules/ChatAIMessages/index.js +2 -0
- package/lib/components/molecules/ChatAIMessages/newStyles.js +131 -0
- package/lib/components/molecules/ChatAIMessages/styles.js +94 -0
- package/lib/components/molecules/ChatAIModal/ChatAIModal.js +1254 -0
- package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +58 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +127 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.styles.js +34 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/index.js +2 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +189 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +26 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/index.js +2 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +453 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.styles.js +108 -0
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/index.js +2 -0
- package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.js +48 -0
- package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.styles.js +38 -0
- package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/index.js +2 -0
- package/lib/components/molecules/ChatAIModal/constants.js +40 -0
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.js +16 -0
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.styles.js +12 -0
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/constants.js +13 -0
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/index.js +3 -0
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.js +57 -0
- package/lib/components/molecules/ChatAIModal/index.js +2 -0
- package/lib/components/molecules/ChatAIModal/layout.js +74 -0
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +457 -0
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.styles.js +218 -0
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +430 -0
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.styles.js +169 -0
- package/lib/components/molecules/ChatAIMySkills/index.js +2 -0
- package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.js +48 -0
- package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.styles.js +49 -0
- package/lib/components/molecules/ChatAIProjectSelector/index.js +2 -0
- package/lib/components/molecules/ChatFooter/ChatFooter.js +337 -0
- package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.js +32 -0
- package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.styles.js +14 -0
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +201 -0
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.styles.js +51 -0
- package/lib/components/molecules/ChatFooter/index.js +2 -0
- package/lib/components/molecules/ChatFooter/styles.js +23 -0
- package/lib/components/molecules/ContextMentionInput/ContextMentionInput.js +60 -0
- package/lib/components/molecules/ContextMentionInput/ContextMentionInput.styles.js +6 -0
- package/lib/components/molecules/ContextMentionInput/index.js +2 -0
- package/lib/components/molecules/MessageFeedback/MessageFeedback.js +118 -0
- package/lib/components/molecules/MessageFeedback/index.js +2 -0
- package/lib/components/molecules/MessageFeedback/styles.js +14 -0
- package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.js +127 -0
- package/lib/components/molecules/ProjectSummaryChat/index.js +2 -0
- package/lib/components/molecules/ProjectSummaryChat/styles.js +8 -0
- package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.js +152 -0
- package/lib/components/molecules/ProjectSummaryConfig/index.js +2 -0
- package/lib/components/molecules/ProjectSummaryConfig/styles.js +86 -0
- package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.js +49 -0
- package/lib/components/molecules/ProjectSummaryContent/index.js +2 -0
- package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.js +19 -0
- package/lib/components/molecules/ProjectSummaryModal/index.js +2 -0
- package/lib/components/molecules/ProjectSummaryModal/styles.js +2 -0
- package/lib/components/molecules/Sidebar/Sidebar.js +716 -0
- package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +157 -0
- package/lib/components/molecules/Sidebar/Sidebar.skeleton.js +48 -0
- package/lib/components/molecules/Sidebar/Sidebar.styles.js +75 -0
- package/lib/components/molecules/Sidebar/index.js +2 -0
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +1449 -0
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.styles.js +93 -0
- package/lib/components/organisms/AbmAgentModal/index.js +2 -0
- package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.js +182 -0
- package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.styles.js +34 -0
- package/lib/components/organisms/AbmSkillGenerateModal/index.js +2 -0
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +585 -0
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.styles.js +154 -0
- package/lib/components/organisms/AbmSkillModal/index.js +2 -0
- package/lib/components/organisms/ChatAI/ChatAI.js +167 -0
- package/lib/components/organisms/ChatAI/index.js +2 -0
- package/lib/components/organisms/ChatAI/styles.js +7 -0
- package/lib/components/organisms/ClientAIButton/ClientAIButton.js +23 -0
- package/lib/components/organisms/ClientAIButton/index.js +2 -0
- package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.js +86 -0
- package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.styles.js +39 -0
- package/lib/components/organisms/DeleteAgentModal/index.js +2 -0
- package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.js +122 -0
- package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.styles.js +47 -0
- package/lib/components/organisms/DeleteQuestionModal/index.js +2 -0
- package/lib/components/organisms/EditQuestionModal/EditQuestionModal.js +138 -0
- package/lib/components/organisms/EditQuestionModal/EditQuestionModal.styles.js +69 -0
- package/lib/components/organisms/EditQuestionModal/index.js +2 -0
- package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.js +113 -0
- package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.styles.js +54 -0
- package/lib/components/organisms/ModalFileExceeds/index.js +2 -0
- package/lib/components/organisms/ProjectAIButton/ProjectAIButton.js +26 -0
- package/lib/components/organisms/ProjectAIButton/index.js +2 -0
- package/lib/components/organisms/ProjectSummary/ProjectSummary.js +60 -0
- package/lib/components/organisms/ProjectSummary/index.js +2 -0
- package/lib/components/organisms/ProjectSummary/styles.js +7 -0
- package/lib/components/organisms/SnackBar/Snackbar.interface.js +2 -0
- package/lib/components/organisms/SnackBar/Snackbar.js +73 -0
- package/lib/components/organisms/SnackBar/Snackbar.styles.js +9 -0
- package/lib/components/organisms/SnackBar/index.js +2 -0
- package/lib/components/organisms/SourcesInformation/SourceItem.js +18 -0
- package/lib/components/organisms/SourcesInformation/SourceItem.styles.js +14 -0
- package/lib/components/organisms/SourcesInformation/SourcesInformationModal.js +66 -0
- package/lib/components/organisms/SourcesInformation/SourcesInformationModal.styles.js +27 -0
- package/lib/components/organisms/SourcesInformation/index.js +2 -0
- package/lib/constants/config.js +10 -0
- package/lib/constants/formatExtensions.js +55 -0
- package/lib/constants/gqlClient.js +4 -0
- package/lib/constants/maiaHourAgentAccess.js +15 -0
- package/lib/constants/maiaTaskPanelAccess.js +24 -0
- package/lib/constants/maiaTaskPanelOutsideClick.js +9 -0
- package/lib/constants/maiaTaskPanelZIndex.js +19 -0
- package/lib/constants/permissions/config.js +72 -0
- package/lib/constants/permissions/index.js +3 -0
- package/lib/constants/permissions/types.js +2 -0
- package/lib/constants/permissions/utils.js +18 -0
- package/lib/constants/plannerSyncEvents.js +15 -0
- package/lib/constants/taskLinkIcon.js +15 -0
- package/lib/constants/taskUrls.js +11 -0
- package/lib/context/cor-user.js +31 -0
- package/lib/context/global-context.js +39 -0
- package/lib/dev/DevChatAI.js +101 -0
- package/lib/dev/DevContextMentionInput.js +67 -0
- package/lib/dev/ProjectSummary.js +9 -0
- package/lib/dev/Providers.js +27 -0
- package/lib/exports.js +2 -0
- package/lib/hooks/README.md +192 -0
- package/lib/hooks/index.js +30 -0
- package/lib/hooks/useAccessClient/index.js +2 -0
- package/lib/hooks/useAccessClient/useAccessClient.js +81 -0
- package/lib/hooks/useAgentModel/index.js +2 -0
- package/lib/hooks/useAgentModel/useAgentModel.js +62 -0
- package/lib/hooks/useAgentModel/useCreateAgent.js +175 -0
- package/lib/hooks/useAgentModel/useDeleteAgent.js +88 -0
- package/lib/hooks/useAgentModel/useUpdateAgent.js +176 -0
- package/lib/hooks/useAgentSuggestions.js +60 -0
- package/lib/hooks/useCaretPosition.js +65 -0
- package/lib/hooks/useChatManager/index.js +2 -0
- package/lib/hooks/useChatManager/useChatManager.interface.js +2 -0
- package/lib/hooks/useChatManager/useChatManager.js +1782 -0
- package/lib/hooks/useChatMessages/index.js +2 -0
- package/lib/hooks/useChatMessages/useChatMessages.interface.js +2 -0
- package/lib/hooks/useChatMessages/useChatMessages.js +722 -0
- package/lib/hooks/useChats/index.js +2 -0
- package/lib/hooks/useChats/useChats.interfaces.js +2 -0
- package/lib/hooks/useChats/useChats.js +187 -0
- package/lib/hooks/useClientSearch.js +163 -0
- package/lib/hooks/useContextMentions.js +500 -0
- package/lib/hooks/useContextPinPopover.js +228 -0
- package/lib/hooks/useDebounce.js +18 -0
- package/lib/hooks/useEntitySearch.js +1053 -0
- package/lib/hooks/useEvent.js +94 -0
- package/lib/hooks/useFrequentlyAskedQuestions.js +150 -0
- package/lib/hooks/useFrequentlyUsedActions.js +94 -0
- package/lib/hooks/useKnowledge/deleteKnowledge.js +69 -0
- package/lib/hooks/useKnowledge/downloadKnowledge.js +81 -0
- package/lib/hooks/useKnowledge/index.js +4 -0
- package/lib/hooks/useKnowledge/saveKnowledge.js +107 -0
- package/lib/hooks/useKnowledge/useKnowledgeOperations.js +156 -0
- package/lib/hooks/useMaiaTaskPanelZIndex.js +17 -0
- package/lib/hooks/useMentionAllowedTypes.js +120 -0
- package/lib/hooks/useMentionPopover.js +342 -0
- package/lib/hooks/useMinimizedPillBottomOffset.js +110 -0
- package/lib/hooks/useModal/index.js +2 -0
- package/lib/hooks/useModal/useModal.interfaces.js +2 -0
- package/lib/hooks/useModal/useModal.js +47 -0
- package/lib/hooks/useOnboardingNavigation.js +20 -0
- package/lib/hooks/useOrchestratorStream/index.js +2 -0
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +2 -0
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +269 -0
- package/lib/hooks/useProjectSearch.js +183 -0
- package/lib/hooks/useProjectSummary.js +101 -0
- package/lib/hooks/useProjectSummaryConfig.js +211 -0
- package/lib/hooks/useProjects.js +46 -0
- package/lib/hooks/useRecentClientsSearch.js +150 -0
- package/lib/hooks/useRecentContexts.js +86 -0
- package/lib/hooks/useResize.js +29 -0
- package/lib/hooks/useSkillsCatalog.js +66 -0
- package/lib/hooks/useSlashCommands.js +84 -0
- package/lib/hooks/useSmoothStreamText/index.js +2 -0
- package/lib/hooks/useSmoothStreamText/useSmoothStreamText.js +197 -0
- package/lib/hooks/useSnackBarManager/useSnackBarManager.js +41 -0
- package/lib/hooks/useStreamResponse.js +112 -0
- package/lib/hooks/useStreamdownStyles.js +13 -0
- package/lib/hooks/useStreamingMessage/index.js +2 -0
- package/lib/hooks/useStreamingMessage/useStreamingMessage.js +18 -0
- package/lib/hooks/useT.js +17 -0
- package/lib/hooks/useTabTaskDefault.js +33 -0
- package/lib/hooks/useTaskPanel.js +22 -0
- package/lib/hooks/useTextOverflowEllipsisTooltip.js +34 -0
- package/lib/hooks/useToggle.js +19 -0
- package/lib/hooks/useToggleFavorite/index.js +2 -0
- package/lib/hooks/useToggleFavorite/useToggleFavorite.js +83 -0
- package/lib/index.css +76 -0
- package/lib/index.js +30 -0
- package/lib/lang/br/index.js +793 -0
- package/lib/lang/en/index.js +793 -0
- package/lib/lang/es/index.js +794 -0
- package/lib/lang/fr/index.js +614 -0
- package/lib/lang/index.js +24 -0
- package/lib/lang/utils.js +33 -0
- package/lib/mocks/mockChats.js +395 -0
- package/lib/mocks/mockOrchestrator.js +5 -0
- package/lib/mocks/mockProject.js +11 -0
- package/lib/mocks/mockProjectSummary.js +6 -0
- package/lib/mocks/mockedUser.js +169 -0
- package/lib/services/apolloClient.js +3 -0
- package/lib/services/appcues.js +19 -0
- package/lib/services/corpilot/ProjectSummary/getProjectSummary.js +31 -0
- package/lib/services/corpilot/ProjectSummary/index.js +5 -0
- package/lib/services/corpilot/client.js +27 -0
- package/lib/services/corpilot/index.js +5 -0
- package/lib/services/maia/Access/updateAccess.js +59 -0
- package/lib/services/maia/Actions/getFrequentlyUsedActions.js +46 -0
- package/lib/services/maia/Actions/getSlashCommands.js +39 -0
- package/lib/services/maia/Actions/index.js +7 -0
- package/lib/services/maia/Agents/connectors.js +250 -0
- package/lib/services/maia/Agents/createAgent.js +39 -0
- package/lib/services/maia/Agents/deleteAgent.js +38 -0
- package/lib/services/maia/Agents/fetchAgentDetail.js +122 -0
- package/lib/services/maia/Agents/getAgentById.js +162 -0
- package/lib/services/maia/Agents/getAgentModels.js +112 -0
- package/lib/services/maia/Agents/getAgentSuggestions.js +44 -0
- package/lib/services/maia/Agents/getAgents.js +718 -0
- package/lib/services/maia/Agents/setAgentToolGroups.js +42 -0
- package/lib/services/maia/Agents/toggleFavorite.js +34 -0
- package/lib/services/maia/Agents/updateAgent.js +39 -0
- package/lib/services/maia/Chats/deleteChat.js +32 -0
- package/lib/services/maia/Chats/getChatMessages.js +144 -0
- package/lib/services/maia/Chats/getChatsByUserId.js +82 -0
- package/lib/services/maia/Chats/index.js +15 -0
- package/lib/services/maia/Chats/markSessionAsRead.js +32 -0
- package/lib/services/maia/Chats/patchChat.js +43 -0
- package/lib/services/maia/Chats/wasHelpfulChat.js +31 -0
- package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.js +55 -0
- package/lib/services/maia/Faqs/index.js +5 -0
- package/lib/services/maia/Knowledge/delete.js +41 -0
- package/lib/services/maia/Knowledge/download.js +48 -0
- package/lib/services/maia/Knowledge/index.js +3 -0
- package/lib/services/maia/Knowledge/save.js +43 -0
- package/lib/services/maia/Orchestrator/index.js +7 -0
- package/lib/services/maia/Orchestrator/orchestrator.js +246 -0
- package/lib/services/maia/RecentClients/getRecentClients.js +43 -0
- package/lib/services/maia/RecentClients/index.js +6 -0
- package/lib/services/maia/RecentContexts/getRecentContexts.js +54 -0
- package/lib/services/maia/RecentContexts/index.js +6 -0
- package/lib/services/maia/RecentProjects/getRecentProjects.js +55 -0
- package/lib/services/maia/RecentProjects/index.js +6 -0
- package/lib/services/maia/RecentTasks/getRecentTasks.js +54 -0
- package/lib/services/maia/RecentTasks/index.js +6 -0
- package/lib/services/maia/RecentUsers/getRecentUsers.js +59 -0
- package/lib/services/maia/RecentUsers/index.js +6 -0
- package/lib/services/maia/Skills/createSkill.js +39 -0
- package/lib/services/maia/Skills/deleteSkill.js +38 -0
- package/lib/services/maia/Skills/generateSkill.js +41 -0
- package/lib/services/maia/Skills/getSkills.js +120 -0
- package/lib/services/maia/Skills/updateSkill.js +39 -0
- package/lib/services/maia/client.js +27 -0
- package/lib/services/maia/index.js +17 -0
- package/lib/services/query/ClientSearchQuery.js +5 -0
- package/lib/services/query/entitySearchQuery.js +18 -0
- package/lib/services/query/index.js +2 -0
- package/lib/services/query/projectSearchByValueQuery.js +5 -0
- package/lib/services/query/taskUserTabQuery.js +8 -0
- package/lib/services/query/usersDirectoryQuery.js +19 -0
- package/lib/services/types.js +6 -0
- package/lib/services/utils/fetchCOR.js +117 -0
- package/lib/services/utils/getCookie.js +10 -0
- package/lib/services/utils/index.js +3 -0
- package/lib/services/utils/mapChatMessages.js +287 -0
- package/lib/services/utils/validateIsMaia.js +4 -0
- package/lib/store/chatsSidebarOptimistic.js +92 -0
- package/lib/store/chatsStore.types.js +2 -0
- package/lib/store/chatsStoreLifecycle.js +8 -0
- package/lib/store/faqsStore.types.js +2 -0
- package/lib/store/index.js +4 -0
- package/lib/store/maiaLastChatPersistence.js +35 -0
- package/lib/store/sessions/activeView.js +22 -0
- package/lib/store/sessions/index.js +9 -0
- package/lib/store/sessions/sessionHitlContext.js +15 -0
- package/lib/store/sessions/sessionNotificationSound.js +57 -0
- package/lib/store/sessions/sessionNotifications.js +110 -0
- package/lib/store/sessions/sessionNotifications.types.js +2 -0
- package/lib/store/sessions/sessionStreamManager.js +715 -0
- package/lib/store/sessions/sessionStreamingText.js +80 -0
- package/lib/store/sessions/sessions.types.js +35 -0
- package/lib/store/sessions/useSessionMeta.js +39 -0
- package/lib/store/sessions/useSessionStreamingText.js +18 -0
- package/lib/store/sessions/useSessionsStore.js +197 -0
- package/lib/store/useChatsStore.js +387 -0
- package/lib/store/useFaqsStore.js +27 -0
- package/lib/streamdownStyles.js +9 -0
- package/lib/styles/StyledCleanContainer.js +7 -0
- package/lib/styles/cascade.js +14 -0
- package/lib/styles/config.js +47 -0
- package/lib/styles/shared/scrollable.js +3 -0
- package/lib/styles/transitions.js +21 -0
- package/lib/types/Action.js +2 -0
- package/lib/types/AgentSuggestion.js +2 -0
- package/lib/types/Chat.js +10 -0
- package/lib/types/Client.js +2 -0
- package/lib/types/FrequentlyAskedQuestion.js +2 -0
- package/lib/types/Project.js +2 -0
- package/lib/types/ProjectSummaryConfigKeys.js +9 -0
- package/lib/types/Task.js +2 -0
- package/lib/types/agent.js +2 -0
- package/lib/types/agentModal.js +2 -0
- package/lib/types/contextMention.js +37 -0
- package/lib/types/global.d.js +2 -0
- package/lib/types/skill.js +2 -0
- package/lib/types/streamActivity.js +2 -0
- package/lib/types/userType.d.js +2 -0
- package/lib/utils/actionCategoryMap.js +37 -0
- package/lib/utils/actionIconMap.js +61 -0
- package/lib/utils/agentDisplayName.js +42 -0
- package/lib/utils/chatInputFiles.js +52 -0
- package/lib/utils/contextMentionIcons.js +134 -0
- package/lib/utils/contextMentionLabel.js +4 -0
- package/lib/utils/contextMentionTriggers.js +51 -0
- package/lib/utils/contextMentionTypeLabel.js +17 -0
- package/lib/utils/corConnectorMentionTypes.js +41 -0
- package/lib/utils/ensureStreamdownStyles.js +21 -0
- package/lib/utils/entityLinkRender.js +135 -0
- package/lib/utils/fileDownloadHelper.js +40 -0
- package/lib/utils/formatQuickActionMessage.js +16 -0
- package/lib/utils/formatUnreadCount.js +6 -0
- package/lib/utils/getUnitFileSize.js +13 -0
- package/lib/utils/hitlAnalytics.js +65 -0
- package/lib/utils/hoursPlannerQuickActionType.js +64 -0
- package/lib/utils/imagePreprocessor.js +108 -0
- package/lib/utils/index.js +3 -0
- package/lib/utils/maiaHostOpen.js +19 -0
- package/lib/utils/maiaStreamdownRehypePlugins.js +27 -0
- package/lib/utils/mapBackendLang.js +8 -0
- package/lib/utils/normalizeAgentConnectors.js +95 -0
- package/lib/utils/openTaskInCorPanel.js +22 -0
- package/lib/utils/orchestratorSubagents.js +11 -0
- package/lib/utils/renderContextMentions.js +420 -0
- package/lib/utils/retryCompletion.js +85 -0
- package/lib/utils/slashCommandMarker.js +30 -0
- package/lib/utils/sortManagerHoursHomeFuas.js +14 -0
- package/lib/utils/sseStreamContent.js +17 -0
- package/lib/utils/streamActivityMessages.js +359 -0
- package/lib/utils/validateTrimmedFields.js +8 -0
- package/package.json +1 -1
- package/README.md +0 -2
|
@@ -0,0 +1,718 @@
|
|
|
1
|
+
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
2
|
+
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
|
|
3
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
4
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
5
|
+
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
|
|
6
|
+
var _excluded = ["message"],
|
|
7
|
+
_excluded2 = ["message"],
|
|
8
|
+
_excluded3 = ["message"];
|
|
9
|
+
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
10
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
11
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
12
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
13
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
14
|
+
/* eslint-disable no-nested-ternary */
|
|
15
|
+
/* eslint-disable no-console */
|
|
16
|
+
import { useState, useCallback, useRef } from 'react';
|
|
17
|
+
import { useTranslation } from 'react-i18next';
|
|
18
|
+
import { useSnackBarManager } from '../../../hooks/useSnackBarManager/useSnackBarManager';
|
|
19
|
+
import { fetchMaia } from '../client';
|
|
20
|
+
import { withNormalizedConnectors } from '../../../utils/normalizeAgentConnectors';
|
|
21
|
+
import { useUser } from '../../../context/cor-user';
|
|
22
|
+
import { isMaiaCloneAgentsRoleBlocked } from '../../../constants/maiaTaskPanelAccess';
|
|
23
|
+
import { mapCORLang } from '../../../lang/utils';
|
|
24
|
+
var isMaiaAgent = function isMaiaAgent(agent) {
|
|
25
|
+
return (agent === null || agent === void 0 ? void 0 : agent.type) === 'orchestrator';
|
|
26
|
+
};
|
|
27
|
+
var is403AgentFetchError = function is403AgentFetchError(err) {
|
|
28
|
+
var _error$response, _error$message, _error$message2;
|
|
29
|
+
var error = err;
|
|
30
|
+
return (error === null || error === void 0 || (_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.status) === 403 || (error === null || error === void 0 ? void 0 : error.status) === 403 || Boolean(error === null || error === void 0 || (_error$message = error.message) === null || _error$message === void 0 ? void 0 : _error$message.includes("You don't have permission to view agents")) || Boolean(error === null || error === void 0 || (_error$message2 = error.message) === null || _error$message2 === void 0 ? void 0 : _error$message2.includes('Failed fetching data'));
|
|
31
|
+
};
|
|
32
|
+
var mergeAgentsWithoutDuplicates = function mergeAgentsWithoutDuplicates(base, extra) {
|
|
33
|
+
var ids = new Set(base.map(function (agent) {
|
|
34
|
+
return agent.id;
|
|
35
|
+
}));
|
|
36
|
+
var merged = _toConsumableArray(base);
|
|
37
|
+
extra.forEach(function (agent) {
|
|
38
|
+
if (!ids.has(agent.id)) merged.push(agent);
|
|
39
|
+
});
|
|
40
|
+
return merged;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Ordena los agentes: MAIA primero (si existe), luego favoritos alfabéticamente, luego no favoritos alfabéticamente
|
|
45
|
+
*/
|
|
46
|
+
var sortAgents = function sortAgents(agents) {
|
|
47
|
+
var maiaAgents = agents.filter(isMaiaAgent);
|
|
48
|
+
var otherAgents = agents.filter(function (ag) {
|
|
49
|
+
return !isMaiaAgent(ag);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
// Separar favoritos y no favoritos
|
|
53
|
+
var favorites = otherAgents.filter(function (ag) {
|
|
54
|
+
return ag.is_favorite;
|
|
55
|
+
}).sort(function (a, b) {
|
|
56
|
+
return a.name.localeCompare(b.name);
|
|
57
|
+
});
|
|
58
|
+
var nonFavorites = otherAgents.filter(function (ag) {
|
|
59
|
+
return !ag.is_favorite;
|
|
60
|
+
}).sort(function (a, b) {
|
|
61
|
+
return a.name.localeCompare(b.name);
|
|
62
|
+
});
|
|
63
|
+
return maiaAgents.length ? [].concat(_toConsumableArray(maiaAgents), _toConsumableArray(favorites), _toConsumableArray(nonFavorites)) : [].concat(_toConsumableArray(favorites), _toConsumableArray(nonFavorites));
|
|
64
|
+
};
|
|
65
|
+
var normalizeCustomAgentsFromApi = function normalizeCustomAgentsFromApi(agents) {
|
|
66
|
+
return agents.map(function (agent) {
|
|
67
|
+
return agent.type === 'custom' ? withNormalizedConnectors(agent) : agent;
|
|
68
|
+
});
|
|
69
|
+
};
|
|
70
|
+
export var useGetAgents = function useGetAgents(_ref) {
|
|
71
|
+
var selectAgent = _ref.selectAgent,
|
|
72
|
+
section = _ref.section,
|
|
73
|
+
agent = _ref.agent,
|
|
74
|
+
handleGoHome = _ref.handleGoHome;
|
|
75
|
+
var user = useUser();
|
|
76
|
+
var _useState = useState({
|
|
77
|
+
data: []
|
|
78
|
+
}),
|
|
79
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
80
|
+
agents = _useState2[0],
|
|
81
|
+
setAgents = _useState2[1];
|
|
82
|
+
var _useState3 = useState(false),
|
|
83
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
84
|
+
loading = _useState4[0],
|
|
85
|
+
setLoading = _useState4[1];
|
|
86
|
+
var _useState5 = useState(false),
|
|
87
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
88
|
+
loadingMore = _useState6[0],
|
|
89
|
+
setLoadingMore = _useState6[1];
|
|
90
|
+
var _useState7 = useState(false),
|
|
91
|
+
_useState8 = _slicedToArray(_useState7, 2),
|
|
92
|
+
searchLoading = _useState8[0],
|
|
93
|
+
setSearchLoading = _useState8[1];
|
|
94
|
+
var _useState9 = useState(null),
|
|
95
|
+
_useState0 = _slicedToArray(_useState9, 2),
|
|
96
|
+
error = _useState0[0],
|
|
97
|
+
setError = _useState0[1];
|
|
98
|
+
var _useSnackBarManager = useSnackBarManager(),
|
|
99
|
+
handleSnackbarError = _useSnackBarManager.handleSnackbarError;
|
|
100
|
+
var _useTranslation = useTranslation('chat_ai_section'),
|
|
101
|
+
t = _useTranslation.t,
|
|
102
|
+
i18n = _useTranslation.i18n;
|
|
103
|
+
var lastSelectedAgentRef = useRef(null);
|
|
104
|
+
var isRefreshingRef = useRef(false);
|
|
105
|
+
var lastRequestRef = useRef(null);
|
|
106
|
+
var agentsRef = useRef(agents);
|
|
107
|
+
var preSearchAgentsRef = useRef(null);
|
|
108
|
+
agentsRef.current = agents;
|
|
109
|
+
var addAgent = useCallback(function (newAgent, options) {
|
|
110
|
+
setAgents(function (prev) {
|
|
111
|
+
// Verificar si el agente ya existe para evitar duplicados
|
|
112
|
+
var agentExists = prev.data.some(function (existingAgent) {
|
|
113
|
+
return existingAgent.id === newAgent.id;
|
|
114
|
+
});
|
|
115
|
+
if (agentExists) {
|
|
116
|
+
return prev;
|
|
117
|
+
}
|
|
118
|
+
var newData = [].concat(_toConsumableArray(prev.data), [newAgent]);
|
|
119
|
+
var sortedData = sortAgents(newData);
|
|
120
|
+
return _objectSpread(_objectSpread({}, prev), {}, {
|
|
121
|
+
data: sortedData
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
if ((options === null || options === void 0 ? void 0 : options.navigateHome) !== false) {
|
|
125
|
+
handleGoHome();
|
|
126
|
+
}
|
|
127
|
+
}, [handleGoHome]);
|
|
128
|
+
var removeAgent = useCallback(function (agentId) {
|
|
129
|
+
setAgents(function (prev) {
|
|
130
|
+
return _objectSpread(_objectSpread({}, prev), {}, {
|
|
131
|
+
data: prev.data.filter(function (a) {
|
|
132
|
+
return a.id !== agentId.toString();
|
|
133
|
+
})
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
}, []);
|
|
137
|
+
var updateAgent = useCallback(function (updatedAgent) {
|
|
138
|
+
setAgents(function (prev) {
|
|
139
|
+
var updatedData = prev.data.map(function (existingAgent) {
|
|
140
|
+
return existingAgent.id === updatedAgent.id ? updatedAgent : existingAgent;
|
|
141
|
+
});
|
|
142
|
+
var sortedData = sortAgents(updatedData);
|
|
143
|
+
return _objectSpread(_objectSpread({}, prev), {}, {
|
|
144
|
+
data: sortedData
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
}, []);
|
|
148
|
+
var updateAgentFavorite = useCallback(function (updatedAgent) {
|
|
149
|
+
var shouldSort = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
150
|
+
setAgents(function (prev) {
|
|
151
|
+
var updatedData = prev.data.map(function (existingAgent) {
|
|
152
|
+
if (existingAgent.id === updatedAgent.id) {
|
|
153
|
+
var _ref2 = updatedAgent,
|
|
154
|
+
message = _ref2.message,
|
|
155
|
+
agentFields = _objectWithoutProperties(_ref2, _excluded);
|
|
156
|
+
var mergedAgent = _objectSpread(_objectSpread({}, existingAgent), agentFields);
|
|
157
|
+
return mergedAgent;
|
|
158
|
+
}
|
|
159
|
+
return existingAgent;
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
// Solo ordenar si shouldSort es true
|
|
163
|
+
var finalData = shouldSort ? sortAgents(updatedData) : updatedData;
|
|
164
|
+
return _objectSpread(_objectSpread({}, prev), {}, {
|
|
165
|
+
data: finalData
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
// Actualizar el agente seleccionado si es el que se está actualizando
|
|
170
|
+
if ((agent === null || agent === void 0 ? void 0 : agent.id) === updatedAgent.id) {
|
|
171
|
+
var existingAgent = agents.data.find(function (a) {
|
|
172
|
+
return a.id === updatedAgent.id;
|
|
173
|
+
});
|
|
174
|
+
if (existingAgent) {
|
|
175
|
+
var _ref3 = updatedAgent,
|
|
176
|
+
message = _ref3.message,
|
|
177
|
+
agentFields = _objectWithoutProperties(_ref3, _excluded2);
|
|
178
|
+
var mergedAgent = _objectSpread(_objectSpread({}, existingAgent), agentFields);
|
|
179
|
+
selectAgent(mergedAgent);
|
|
180
|
+
} else {
|
|
181
|
+
var _ref4 = updatedAgent,
|
|
182
|
+
_message = _ref4.message,
|
|
183
|
+
_agentFields = _objectWithoutProperties(_ref4, _excluded3);
|
|
184
|
+
selectAgent(_agentFields);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}, [agent, selectAgent, agents.data]);
|
|
188
|
+
var sortAgentsList = useCallback(function () {
|
|
189
|
+
setAgents(function (prev) {
|
|
190
|
+
var sortedData = sortAgents(prev.data);
|
|
191
|
+
return _objectSpread(_objectSpread({}, prev), {}, {
|
|
192
|
+
data: sortedData
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
}, []);
|
|
196
|
+
var selectFirstAgent = useCallback(function (agentId) {
|
|
197
|
+
if (agents.data.length) {
|
|
198
|
+
var firstAgent = agents.data.findIndex(function (agentData) {
|
|
199
|
+
return agentData.id === agentId;
|
|
200
|
+
});
|
|
201
|
+
lastSelectedAgentRef.current = agents.data[firstAgent === 0 ? 1 : 0];
|
|
202
|
+
selectAgent(agents.data[firstAgent === 0 ? 1 : 0]);
|
|
203
|
+
}
|
|
204
|
+
}, [agents.data, selectAgent]);
|
|
205
|
+
var handleGetAgents = useCallback(/*#__PURE__*/function () {
|
|
206
|
+
var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(agentToSelect) {
|
|
207
|
+
var _agentToSelect$id;
|
|
208
|
+
var requestKey, isMultiAgents, agentParsed, hasMore, nextOffset, cloneAgentsRoleBlocked, canFetchCloneAgents, fetchGlobalCloneAgents, customAgents, customHasMore, customNextOffset, is403, maiaAgents, loadCloneAgents, loadCustomAgents, queryParams, queryString, path, response, data, globalCloneAgents, _responseError$respon, _responseError$messag, _responseError$messag2, is403Error, _agentParsed, _agentParsed2, _lastSelectedAgentRef, _lastSelectedAgentRef2, availableAgents, _availableAgents, firstAgent, _lastSelectedAgentRef3, _availableAgents2, _availableAgents3, firstAvailableAgent, _t4, _t5;
|
|
209
|
+
return _regeneratorRuntime.wrap(function (_context4) {
|
|
210
|
+
while (1) switch (_context4.prev = _context4.next) {
|
|
211
|
+
case 0:
|
|
212
|
+
if (!isRefreshingRef.current) {
|
|
213
|
+
_context4.next = 1;
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
return _context4.abrupt("return");
|
|
217
|
+
case 1:
|
|
218
|
+
requestKey = (agentToSelect === null || agentToSelect === void 0 || (_agentToSelect$id = agentToSelect.id) === null || _agentToSelect$id === void 0 ? void 0 : _agentToSelect$id.toString()) || 'default';
|
|
219
|
+
if (!(lastRequestRef.current === requestKey && !loading)) {
|
|
220
|
+
_context4.next = 2;
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
return _context4.abrupt("return");
|
|
224
|
+
case 2:
|
|
225
|
+
isRefreshingRef.current = true;
|
|
226
|
+
lastRequestRef.current = requestKey;
|
|
227
|
+
setLoading(true);
|
|
228
|
+
setError(null);
|
|
229
|
+
isMultiAgents = !!window.MAIA_CHAT_AI_FEATURE_ACCESS && !!window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS;
|
|
230
|
+
_context4.prev = 3;
|
|
231
|
+
agentParsed = [];
|
|
232
|
+
hasMore = false;
|
|
233
|
+
nextOffset = null;
|
|
234
|
+
cloneAgentsRoleBlocked = isMaiaCloneAgentsRoleBlocked(user, section);
|
|
235
|
+
canFetchCloneAgents = !cloneAgentsRoleBlocked;
|
|
236
|
+
fetchGlobalCloneAgents = /*#__PURE__*/function () {
|
|
237
|
+
var _ref6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
|
|
238
|
+
var cloneResponse, cloneData, _t;
|
|
239
|
+
return _regeneratorRuntime.wrap(function (_context) {
|
|
240
|
+
while (1) switch (_context.prev = _context.next) {
|
|
241
|
+
case 0:
|
|
242
|
+
if (!(!window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS || !canFetchCloneAgents)) {
|
|
243
|
+
_context.next = 1;
|
|
244
|
+
break;
|
|
245
|
+
}
|
|
246
|
+
return _context.abrupt("return", []);
|
|
247
|
+
case 1:
|
|
248
|
+
_context.prev = 1;
|
|
249
|
+
_context.next = 2;
|
|
250
|
+
return fetchMaia({
|
|
251
|
+
path: "agents?agent_type=clone&entity=global&lang=".concat(mapCORLang(i18n.language)),
|
|
252
|
+
method: 'GET'
|
|
253
|
+
});
|
|
254
|
+
case 2:
|
|
255
|
+
cloneResponse = _context.sent;
|
|
256
|
+
_context.next = 3;
|
|
257
|
+
return cloneResponse.json();
|
|
258
|
+
case 3:
|
|
259
|
+
cloneData = _context.sent;
|
|
260
|
+
return _context.abrupt("return", (cloneData.data || []).filter(function (ag) {
|
|
261
|
+
return ag.type === 'clone';
|
|
262
|
+
}));
|
|
263
|
+
case 4:
|
|
264
|
+
_context.prev = 4;
|
|
265
|
+
_t = _context["catch"](1);
|
|
266
|
+
if (!is403AgentFetchError(_t)) {
|
|
267
|
+
_context.next = 5;
|
|
268
|
+
break;
|
|
269
|
+
}
|
|
270
|
+
return _context.abrupt("return", []);
|
|
271
|
+
case 5:
|
|
272
|
+
throw _t;
|
|
273
|
+
case 6:
|
|
274
|
+
case "end":
|
|
275
|
+
return _context.stop();
|
|
276
|
+
}
|
|
277
|
+
}, _callee, null, [[1, 4]]);
|
|
278
|
+
}));
|
|
279
|
+
return function fetchGlobalCloneAgents() {
|
|
280
|
+
return _ref6.apply(this, arguments);
|
|
281
|
+
};
|
|
282
|
+
}(); // Si tiene feature access multi agents, hacer dos queries (Maia + custom) en cualquier sección
|
|
283
|
+
if (!isMultiAgents) {
|
|
284
|
+
_context4.next = 5;
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
// Query clone (Maia) y custom son independientes → se disparan en paralelo.
|
|
288
|
+
customAgents = [];
|
|
289
|
+
customHasMore = false;
|
|
290
|
+
customNextOffset = null;
|
|
291
|
+
is403 = is403AgentFetchError;
|
|
292
|
+
maiaAgents = [];
|
|
293
|
+
loadCloneAgents = /*#__PURE__*/function () {
|
|
294
|
+
var _ref7 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
|
|
295
|
+
var _maiaData$data, maiaResponse, maiaData, globalCloneAgents, _t2;
|
|
296
|
+
return _regeneratorRuntime.wrap(function (_context2) {
|
|
297
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
298
|
+
case 0:
|
|
299
|
+
if (canFetchCloneAgents) {
|
|
300
|
+
_context2.next = 1;
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
return _context2.abrupt("return");
|
|
304
|
+
case 1:
|
|
305
|
+
_context2.prev = 1;
|
|
306
|
+
_context2.next = 2;
|
|
307
|
+
return fetchMaia({
|
|
308
|
+
path: "agents?agent_type=orchestrator&lang=".concat(mapCORLang(i18n.language)),
|
|
309
|
+
method: 'GET'
|
|
310
|
+
});
|
|
311
|
+
case 2:
|
|
312
|
+
maiaResponse = _context2.sent;
|
|
313
|
+
_context2.next = 3;
|
|
314
|
+
return maiaResponse.json();
|
|
315
|
+
case 3:
|
|
316
|
+
maiaData = _context2.sent;
|
|
317
|
+
maiaAgents = ((_maiaData$data = maiaData.data) === null || _maiaData$data === void 0 ? void 0 : _maiaData$data.filter(isMaiaAgent)) || [];
|
|
318
|
+
_context2.next = 4;
|
|
319
|
+
return fetchGlobalCloneAgents();
|
|
320
|
+
case 4:
|
|
321
|
+
globalCloneAgents = _context2.sent;
|
|
322
|
+
maiaAgents = mergeAgentsWithoutDuplicates(maiaAgents, globalCloneAgents);
|
|
323
|
+
_context2.next = 6;
|
|
324
|
+
break;
|
|
325
|
+
case 5:
|
|
326
|
+
_context2.prev = 5;
|
|
327
|
+
_t2 = _context2["catch"](1);
|
|
328
|
+
if (is403(_t2)) {
|
|
329
|
+
_context2.next = 6;
|
|
330
|
+
break;
|
|
331
|
+
}
|
|
332
|
+
throw _t2;
|
|
333
|
+
case 6:
|
|
334
|
+
case "end":
|
|
335
|
+
return _context2.stop();
|
|
336
|
+
}
|
|
337
|
+
}, _callee2, null, [[1, 5]]);
|
|
338
|
+
}));
|
|
339
|
+
return function loadCloneAgents() {
|
|
340
|
+
return _ref7.apply(this, arguments);
|
|
341
|
+
};
|
|
342
|
+
}();
|
|
343
|
+
loadCustomAgents = /*#__PURE__*/function () {
|
|
344
|
+
var _ref8 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
|
|
345
|
+
var customResponse, customData, _t3;
|
|
346
|
+
return _regeneratorRuntime.wrap(function (_context3) {
|
|
347
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
348
|
+
case 0:
|
|
349
|
+
_context3.prev = 0;
|
|
350
|
+
_context3.next = 1;
|
|
351
|
+
return fetchMaia({
|
|
352
|
+
path: 'agents?agent_type=custom&limit=7&offset=0',
|
|
353
|
+
method: 'GET'
|
|
354
|
+
});
|
|
355
|
+
case 1:
|
|
356
|
+
customResponse = _context3.sent;
|
|
357
|
+
_context3.next = 2;
|
|
358
|
+
return customResponse.json();
|
|
359
|
+
case 2:
|
|
360
|
+
customData = _context3.sent;
|
|
361
|
+
customAgents = normalizeCustomAgentsFromApi(customData.data || []);
|
|
362
|
+
customHasMore = customData.has_more || false;
|
|
363
|
+
customNextOffset = customData.next_offset || null;
|
|
364
|
+
_context3.next = 4;
|
|
365
|
+
break;
|
|
366
|
+
case 3:
|
|
367
|
+
_context3.prev = 3;
|
|
368
|
+
_t3 = _context3["catch"](0);
|
|
369
|
+
if (is403(_t3)) {
|
|
370
|
+
_context3.next = 4;
|
|
371
|
+
break;
|
|
372
|
+
}
|
|
373
|
+
throw _t3;
|
|
374
|
+
case 4:
|
|
375
|
+
case "end":
|
|
376
|
+
return _context3.stop();
|
|
377
|
+
}
|
|
378
|
+
}, _callee3, null, [[0, 3]]);
|
|
379
|
+
}));
|
|
380
|
+
return function loadCustomAgents() {
|
|
381
|
+
return _ref8.apply(this, arguments);
|
|
382
|
+
};
|
|
383
|
+
}();
|
|
384
|
+
_context4.next = 4;
|
|
385
|
+
return Promise.all([loadCloneAgents(), loadCustomAgents()]);
|
|
386
|
+
case 4:
|
|
387
|
+
// Combinar: agentes clone primero, luego los custom (si existen)
|
|
388
|
+
// Si el usuario tiene un rol deshabilitado, no incluir cloneAgents
|
|
389
|
+
if (!canFetchCloneAgents) {
|
|
390
|
+
// Rol sin acceso a clones (p. ej. freelancer/cliente o colaborador en project/client): solo customAgents
|
|
391
|
+
// Si customAgents está vacío (por 403), agentParsed será []
|
|
392
|
+
agentParsed = customAgents;
|
|
393
|
+
} else {
|
|
394
|
+
agentParsed = maiaAgents.length ? [].concat(_toConsumableArray(maiaAgents), _toConsumableArray(customAgents)) : customAgents;
|
|
395
|
+
}
|
|
396
|
+
// Ordenar: Maia primero, luego favoritos alfabéticamente, luego no favoritos alfabéticamente
|
|
397
|
+
agentParsed = sortAgents(agentParsed);
|
|
398
|
+
hasMore = customHasMore;
|
|
399
|
+
nextOffset = customNextOffset;
|
|
400
|
+
setAgents({
|
|
401
|
+
data: agentParsed,
|
|
402
|
+
has_more: hasMore,
|
|
403
|
+
next_offset: nextOffset
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
// Si no hay agentes después de procesar las queries, limpiar el error
|
|
407
|
+
if (agentParsed.length === 0) {
|
|
408
|
+
setError(null);
|
|
409
|
+
}
|
|
410
|
+
_context4.next = 12;
|
|
411
|
+
break;
|
|
412
|
+
case 5:
|
|
413
|
+
// Lógica para project, client o header sin multiAgents (mismo criterio de orden project/client; header añade paginación)
|
|
414
|
+
queryParams = new URLSearchParams();
|
|
415
|
+
if (section === 'project' || section === 'client' || section === 'header' || section === 'task' || section === 'planner') {
|
|
416
|
+
queryParams.append('agent_type', 'orchestrator');
|
|
417
|
+
queryParams.append('lang', mapCORLang(i18n.language));
|
|
418
|
+
if (section === 'header') {
|
|
419
|
+
queryParams.append('limit', '7');
|
|
420
|
+
queryParams.append('offset', '0');
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
queryString = queryParams.toString();
|
|
424
|
+
path = "agents".concat(queryString ? "?".concat(queryString) : '');
|
|
425
|
+
_context4.prev = 6;
|
|
426
|
+
_context4.next = 7;
|
|
427
|
+
return fetchMaia({
|
|
428
|
+
path: path,
|
|
429
|
+
method: 'GET'
|
|
430
|
+
});
|
|
431
|
+
case 7:
|
|
432
|
+
response = _context4.sent;
|
|
433
|
+
_context4.next = 8;
|
|
434
|
+
return response.json();
|
|
435
|
+
case 8:
|
|
436
|
+
data = _context4.sent;
|
|
437
|
+
// data.data ya contiene el/los agentes orquestadores de la query agent_type=orchestrator
|
|
438
|
+
agentParsed = data.data || [];
|
|
439
|
+
_context4.next = 9;
|
|
440
|
+
return fetchGlobalCloneAgents();
|
|
441
|
+
case 9:
|
|
442
|
+
globalCloneAgents = _context4.sent;
|
|
443
|
+
agentParsed = mergeAgentsWithoutDuplicates(agentParsed, globalCloneAgents);
|
|
444
|
+
// Ordenar: Maia primero, luego favoritos alfabéticamente, luego no favoritos alfabéticamente
|
|
445
|
+
agentParsed = sortAgents(agentParsed);
|
|
446
|
+
hasMore = data.has_more;
|
|
447
|
+
nextOffset = data.next_offset;
|
|
448
|
+
setAgents(_objectSpread(_objectSpread({}, data), {}, {
|
|
449
|
+
data: agentParsed
|
|
450
|
+
}));
|
|
451
|
+
_context4.next = 12;
|
|
452
|
+
break;
|
|
453
|
+
case 10:
|
|
454
|
+
_context4.prev = 10;
|
|
455
|
+
_t4 = _context4["catch"](6);
|
|
456
|
+
// Verificar si el error es 403
|
|
457
|
+
// fetchCOR puede lanzar diferentes tipos de errores:
|
|
458
|
+
// 1. Error con errorData.detail si incluye 'Access denied'
|
|
459
|
+
// 2. Error genérico 'Failed fetching data' si es 403 pero no incluye 'Access denied'
|
|
460
|
+
// 3. Necesitamos verificar el status code si está disponible
|
|
461
|
+
is403Error = (_t4 === null || _t4 === void 0 || (_responseError$respon = _t4.response) === null || _responseError$respon === void 0 ? void 0 : _responseError$respon.status) === 403 || (_t4 === null || _t4 === void 0 ? void 0 : _t4.status) === 403 || (_t4 === null || _t4 === void 0 || (_responseError$messag = _t4.message) === null || _responseError$messag === void 0 ? void 0 : _responseError$messag.includes("You don't have permission to view agents")) || (_t4 === null || _t4 === void 0 || (_responseError$messag2 = _t4.message) === null || _responseError$messag2 === void 0 ? void 0 : _responseError$messag2.includes('Failed fetching data')); // fetchCOR lanza esto para 403 sin 'Access denied'
|
|
462
|
+
if (!is403Error) {
|
|
463
|
+
_context4.next = 11;
|
|
464
|
+
break;
|
|
465
|
+
}
|
|
466
|
+
// Si es 403, establecer agentes vacíos y continuar
|
|
467
|
+
setAgents({
|
|
468
|
+
data: [],
|
|
469
|
+
has_more: false,
|
|
470
|
+
next_offset: null
|
|
471
|
+
});
|
|
472
|
+
setError(null);
|
|
473
|
+
_context4.next = 12;
|
|
474
|
+
break;
|
|
475
|
+
case 11:
|
|
476
|
+
throw _t4;
|
|
477
|
+
case 12:
|
|
478
|
+
// Lógica de select agent - Solo seleccionar si hay agentes disponibles
|
|
479
|
+
if (agentParsed.length > 0) {
|
|
480
|
+
if (agentToSelect && agentParsed.find(function (agentToRequest) {
|
|
481
|
+
return agentToRequest.id === agentToSelect.id;
|
|
482
|
+
})) {
|
|
483
|
+
if (((_lastSelectedAgentRef = lastSelectedAgentRef.current) === null || _lastSelectedAgentRef === void 0 ? void 0 : _lastSelectedAgentRef.id) !== agentToSelect.id) {
|
|
484
|
+
lastSelectedAgentRef.current = agentToSelect;
|
|
485
|
+
selectAgent(agentToSelect);
|
|
486
|
+
}
|
|
487
|
+
} else if ((_agentParsed = agentParsed) !== null && _agentParsed !== void 0 && _agentParsed[0] && (!agent || !agentParsed.find(function (a) {
|
|
488
|
+
return a.id === agent.id;
|
|
489
|
+
}))) {
|
|
490
|
+
availableAgents = window.MAIA_CHAT_AI_FEATURE_ACCESS && !cloneAgentsRoleBlocked ? agentParsed : agentParsed.filter(function (agentItem) {
|
|
491
|
+
return !isMaiaAgent(agentItem);
|
|
492
|
+
});
|
|
493
|
+
_availableAgents = _slicedToArray(availableAgents, 1), firstAgent = _availableAgents[0];
|
|
494
|
+
if (firstAgent && ((_lastSelectedAgentRef2 = lastSelectedAgentRef.current) === null || _lastSelectedAgentRef2 === void 0 ? void 0 : _lastSelectedAgentRef2.id) !== firstAgent.id) {
|
|
495
|
+
lastSelectedAgentRef.current = firstAgent;
|
|
496
|
+
selectAgent(firstAgent);
|
|
497
|
+
}
|
|
498
|
+
} else if (agentToSelect && (_agentParsed2 = agentParsed) !== null && _agentParsed2 !== void 0 && _agentParsed2.length) {
|
|
499
|
+
_availableAgents2 = window.MAIA_CHAT_AI_FEATURE_ACCESS && !cloneAgentsRoleBlocked ? agentParsed : agentParsed.filter(function (agentItem) {
|
|
500
|
+
return !isMaiaAgent(agentItem);
|
|
501
|
+
});
|
|
502
|
+
_availableAgents3 = _slicedToArray(_availableAgents2, 1), firstAvailableAgent = _availableAgents3[0];
|
|
503
|
+
if (firstAvailableAgent && ((_lastSelectedAgentRef3 = lastSelectedAgentRef.current) === null || _lastSelectedAgentRef3 === void 0 ? void 0 : _lastSelectedAgentRef3.id) !== firstAvailableAgent.id) {
|
|
504
|
+
lastSelectedAgentRef.current = firstAvailableAgent;
|
|
505
|
+
selectAgent(firstAvailableAgent);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
setLoading(false);
|
|
510
|
+
_context4.next = 14;
|
|
511
|
+
break;
|
|
512
|
+
case 13:
|
|
513
|
+
_context4.prev = 13;
|
|
514
|
+
_t5 = _context4["catch"](3);
|
|
515
|
+
setError(_t5 instanceof Error ? _t5.message : 'An unknown error occurred');
|
|
516
|
+
setLoading(false);
|
|
517
|
+
case 14:
|
|
518
|
+
_context4.prev = 14;
|
|
519
|
+
isRefreshingRef.current = false;
|
|
520
|
+
setTimeout(function () {
|
|
521
|
+
if (!isRefreshingRef.current) {
|
|
522
|
+
lastRequestRef.current = null;
|
|
523
|
+
}
|
|
524
|
+
}, 100);
|
|
525
|
+
return _context4.finish(14);
|
|
526
|
+
case 15:
|
|
527
|
+
case "end":
|
|
528
|
+
return _context4.stop();
|
|
529
|
+
}
|
|
530
|
+
}, _callee4, null, [[3, 13, 14, 15], [6, 10]]);
|
|
531
|
+
}));
|
|
532
|
+
return function (_x) {
|
|
533
|
+
return _ref5.apply(this, arguments);
|
|
534
|
+
};
|
|
535
|
+
}(), [selectAgent, section, agent, loading]);
|
|
536
|
+
var searchCustomAgents = useCallback(/*#__PURE__*/function () {
|
|
537
|
+
var _ref9 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5(query) {
|
|
538
|
+
var response, data, _t6;
|
|
539
|
+
return _regeneratorRuntime.wrap(function (_context5) {
|
|
540
|
+
while (1) switch (_context5.prev = _context5.next) {
|
|
541
|
+
case 0:
|
|
542
|
+
if (query) {
|
|
543
|
+
_context5.next = 1;
|
|
544
|
+
break;
|
|
545
|
+
}
|
|
546
|
+
if (preSearchAgentsRef.current) {
|
|
547
|
+
setAgents(preSearchAgentsRef.current);
|
|
548
|
+
preSearchAgentsRef.current = null;
|
|
549
|
+
}
|
|
550
|
+
return _context5.abrupt("return");
|
|
551
|
+
case 1:
|
|
552
|
+
if (!preSearchAgentsRef.current) {
|
|
553
|
+
preSearchAgentsRef.current = agentsRef.current;
|
|
554
|
+
}
|
|
555
|
+
setSearchLoading(true);
|
|
556
|
+
_context5.prev = 2;
|
|
557
|
+
_context5.next = 3;
|
|
558
|
+
return fetchMaia({
|
|
559
|
+
path: "agents?agent_type=custom&limit=20&offset=0&q=".concat(encodeURIComponent(query)),
|
|
560
|
+
method: 'GET'
|
|
561
|
+
});
|
|
562
|
+
case 3:
|
|
563
|
+
response = _context5.sent;
|
|
564
|
+
_context5.next = 4;
|
|
565
|
+
return response.json();
|
|
566
|
+
case 4:
|
|
567
|
+
data = _context5.sent;
|
|
568
|
+
setAgents(function (prev) {
|
|
569
|
+
var cloneAgents = prev.data.filter(function (ag) {
|
|
570
|
+
return ag.type === 'clone';
|
|
571
|
+
});
|
|
572
|
+
var customResults = data.data || [];
|
|
573
|
+
return {
|
|
574
|
+
data: cloneAgents.length ? [].concat(_toConsumableArray(cloneAgents), _toConsumableArray(customResults)) : customResults,
|
|
575
|
+
has_more: false,
|
|
576
|
+
next_offset: null
|
|
577
|
+
};
|
|
578
|
+
});
|
|
579
|
+
_context5.next = 6;
|
|
580
|
+
break;
|
|
581
|
+
case 5:
|
|
582
|
+
_context5.prev = 5;
|
|
583
|
+
_t6 = _context5["catch"](2);
|
|
584
|
+
handleSnackbarError(t('snackbar.loadMoreAgents.error'));
|
|
585
|
+
case 6:
|
|
586
|
+
_context5.prev = 6;
|
|
587
|
+
setSearchLoading(false);
|
|
588
|
+
return _context5.finish(6);
|
|
589
|
+
case 7:
|
|
590
|
+
case "end":
|
|
591
|
+
return _context5.stop();
|
|
592
|
+
}
|
|
593
|
+
}, _callee5, null, [[2, 5, 6, 7]]);
|
|
594
|
+
}));
|
|
595
|
+
return function (_x2) {
|
|
596
|
+
return _ref9.apply(this, arguments);
|
|
597
|
+
};
|
|
598
|
+
}(), []);
|
|
599
|
+
var loadMoreAgents = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee6() {
|
|
600
|
+
var isMultiAgents, canLoadMore, path, queryParams, response, data, _t7;
|
|
601
|
+
return _regeneratorRuntime.wrap(function (_context6) {
|
|
602
|
+
while (1) switch (_context6.prev = _context6.next) {
|
|
603
|
+
case 0:
|
|
604
|
+
isMultiAgents = !!window.MAIA_CHAT_AI_FEATURE_ACCESS && !!window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS; // Cargar más: en header siempre; en project solo si isMultiAgents (porque solo entonces hay paginación de custom)
|
|
605
|
+
canLoadMore = section === 'header' || isMultiAgents;
|
|
606
|
+
if (!(!canLoadMore || !agents.has_more || !agents.next_offset || loadingMore)) {
|
|
607
|
+
_context6.next = 1;
|
|
608
|
+
break;
|
|
609
|
+
}
|
|
610
|
+
return _context6.abrupt("return");
|
|
611
|
+
case 1:
|
|
612
|
+
setLoadingMore(true);
|
|
613
|
+
setError(null);
|
|
614
|
+
_context6.prev = 2;
|
|
615
|
+
// Si es multiAgents, solo cargar agents custom (Maia ya está cargado)
|
|
616
|
+
if (isMultiAgents) {
|
|
617
|
+
// Mantener cantidad impar de cards: primera carga 7, siguientes +6 (7, 13, 19, ...)
|
|
618
|
+
path = "agents?agent_type=custom&limit=6&offset=".concat(agents.next_offset);
|
|
619
|
+
} else {
|
|
620
|
+
// Si no es multiAgents, cargar más agentes orquestadores (MAIA)
|
|
621
|
+
queryParams = new URLSearchParams();
|
|
622
|
+
queryParams.append('agent_type', 'orchestrator');
|
|
623
|
+
queryParams.append('lang', mapCORLang(i18n.language));
|
|
624
|
+
queryParams.append('limit', '7');
|
|
625
|
+
queryParams.append('offset', agents.next_offset.toString());
|
|
626
|
+
path = "agents?".concat(queryParams.toString());
|
|
627
|
+
}
|
|
628
|
+
_context6.next = 3;
|
|
629
|
+
return fetchMaia({
|
|
630
|
+
path: path,
|
|
631
|
+
method: 'GET'
|
|
632
|
+
});
|
|
633
|
+
case 3:
|
|
634
|
+
response = _context6.sent;
|
|
635
|
+
_context6.next = 4;
|
|
636
|
+
return response.json();
|
|
637
|
+
case 4:
|
|
638
|
+
data = _context6.sent;
|
|
639
|
+
// Acumular agentes, excluyendo duplicados
|
|
640
|
+
setAgents(function (prev) {
|
|
641
|
+
if (isMultiAgents) {
|
|
642
|
+
// Lógica para multiAgents: separar MAIA y custom
|
|
643
|
+
var existingMaiaAgents = prev.data.filter(isMaiaAgent);
|
|
644
|
+
|
|
645
|
+
// Obtener IDs existentes (excluyendo MAIA)
|
|
646
|
+
var _existingIds = new Set(prev.data.filter(function (ag) {
|
|
647
|
+
return !isMaiaAgent(ag);
|
|
648
|
+
}).map(function (ag) {
|
|
649
|
+
return ag.id;
|
|
650
|
+
}));
|
|
651
|
+
|
|
652
|
+
// Filtrar nuevos agents que no estén ya en la lista (excluyendo MAIA y clones), normalizando custom
|
|
653
|
+
var _newAgents = normalizeCustomAgentsFromApi(data.data.filter(function (ag) {
|
|
654
|
+
return !isMaiaAgent(ag) && ag.type !== 'clone' && !_existingIds.has(ag.id);
|
|
655
|
+
}));
|
|
656
|
+
var _newData = existingMaiaAgents.length ? [].concat(_toConsumableArray(existingMaiaAgents), _toConsumableArray(prev.data.filter(function (ag) {
|
|
657
|
+
return !isMaiaAgent(ag);
|
|
658
|
+
})), _toConsumableArray(_newAgents)) : [].concat(_toConsumableArray(prev.data.filter(function (ag) {
|
|
659
|
+
return !isMaiaAgent(ag);
|
|
660
|
+
})), _toConsumableArray(_newAgents));
|
|
661
|
+
|
|
662
|
+
// Ordenar: Maia primero, luego favoritos alfabéticamente, luego no favoritos alfabéticamente
|
|
663
|
+
var _sortedData = sortAgents(_newData);
|
|
664
|
+
return {
|
|
665
|
+
data: _sortedData,
|
|
666
|
+
has_more: data.has_more,
|
|
667
|
+
next_offset: data.next_offset
|
|
668
|
+
};
|
|
669
|
+
}
|
|
670
|
+
// Lógica para !isMultiAgents: agregar evitando duplicados
|
|
671
|
+
var existingIds = new Set(prev.data.map(function (ag) {
|
|
672
|
+
return ag.id;
|
|
673
|
+
}));
|
|
674
|
+
var newAgents = (data.data || []).filter(function (ag) {
|
|
675
|
+
return !existingIds.has(ag.id);
|
|
676
|
+
});
|
|
677
|
+
var newData = [].concat(_toConsumableArray(prev.data), _toConsumableArray(newAgents));
|
|
678
|
+
|
|
679
|
+
// Ordenar: Maia primero, luego favoritos alfabéticamente, luego no favoritos alfabéticamente
|
|
680
|
+
var sortedData = sortAgents(newData);
|
|
681
|
+
return {
|
|
682
|
+
data: sortedData,
|
|
683
|
+
has_more: data.has_more,
|
|
684
|
+
next_offset: data.next_offset
|
|
685
|
+
};
|
|
686
|
+
});
|
|
687
|
+
setLoadingMore(false);
|
|
688
|
+
_context6.next = 6;
|
|
689
|
+
break;
|
|
690
|
+
case 5:
|
|
691
|
+
_context6.prev = 5;
|
|
692
|
+
_t7 = _context6["catch"](2);
|
|
693
|
+
handleSnackbarError(t('snackbar.loadMoreAgents.error'));
|
|
694
|
+
setLoadingMore(false);
|
|
695
|
+
case 6:
|
|
696
|
+
case "end":
|
|
697
|
+
return _context6.stop();
|
|
698
|
+
}
|
|
699
|
+
}, _callee6, null, [[2, 5]]);
|
|
700
|
+
})), [section, agents.has_more, agents.next_offset, loadingMore, i18n.language]);
|
|
701
|
+
return {
|
|
702
|
+
agents: agents,
|
|
703
|
+
loading: loading,
|
|
704
|
+
loadingMore: loadingMore,
|
|
705
|
+
error: error,
|
|
706
|
+
handleGetAgents: handleGetAgents,
|
|
707
|
+
loadMoreAgents: loadMoreAgents,
|
|
708
|
+
searchCustomAgents: searchCustomAgents,
|
|
709
|
+
searchLoading: searchLoading,
|
|
710
|
+
addAgent: addAgent,
|
|
711
|
+
removeAgent: removeAgent,
|
|
712
|
+
updateAgent: updateAgent,
|
|
713
|
+
updateAgentFavorite: updateAgentFavorite,
|
|
714
|
+
selectFirstAgent: selectFirstAgent,
|
|
715
|
+
sortAgentsList: sortAgentsList
|
|
716
|
+
};
|
|
717
|
+
};
|
|
718
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VTdGF0ZSIsInVzZUNhbGxiYWNrIiwidXNlUmVmIiwidXNlVHJhbnNsYXRpb24iLCJ1c2VTbmFja0Jhck1hbmFnZXIiLCJmZXRjaE1haWEiLCJ3aXRoTm9ybWFsaXplZENvbm5lY3RvcnMiLCJ1c2VVc2VyIiwiaXNNYWlhQ2xvbmVBZ2VudHNSb2xlQmxvY2tlZCIsIm1hcENPUkxhbmciLCJpc01haWFBZ2VudCIsImFnZW50IiwidHlwZSIsImlzNDAzQWdlbnRGZXRjaEVycm9yIiwiZXJyIiwiX2Vycm9yJHJlc3BvbnNlIiwiX2Vycm9yJG1lc3NhZ2UiLCJfZXJyb3IkbWVzc2FnZTIiLCJlcnJvciIsInJlc3BvbnNlIiwic3RhdHVzIiwiQm9vbGVhbiIsIm1lc3NhZ2UiLCJpbmNsdWRlcyIsIm1lcmdlQWdlbnRzV2l0aG91dER1cGxpY2F0ZXMiLCJiYXNlIiwiZXh0cmEiLCJpZHMiLCJTZXQiLCJtYXAiLCJpZCIsIm1lcmdlZCIsIl90b0NvbnN1bWFibGVBcnJheSIsImZvckVhY2giLCJoYXMiLCJwdXNoIiwic29ydEFnZW50cyIsImFnZW50cyIsIm1haWFBZ2VudHMiLCJmaWx0ZXIiLCJvdGhlckFnZW50cyIsImFnIiwiZmF2b3JpdGVzIiwiaXNfZmF2b3JpdGUiLCJzb3J0IiwiYSIsImIiLCJuYW1lIiwibG9jYWxlQ29tcGFyZSIsIm5vbkZhdm9yaXRlcyIsImxlbmd0aCIsImNvbmNhdCIsIm5vcm1hbGl6ZUN1c3RvbUFnZW50c0Zyb21BcGkiLCJ1c2VHZXRBZ2VudHMiLCJfcmVmIiwic2VsZWN0QWdlbnQiLCJzZWN0aW9uIiwiaGFuZGxlR29Ib21lIiwidXNlciIsIl91c2VTdGF0ZSIsImRhdGEiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJzZXRBZ2VudHMiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsImxvYWRpbmciLCJzZXRMb2FkaW5nIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJsb2FkaW5nTW9yZSIsInNldExvYWRpbmdNb3JlIiwiX3VzZVN0YXRlNyIsIl91c2VTdGF0ZTgiLCJzZWFyY2hMb2FkaW5nIiwic2V0U2VhcmNoTG9hZGluZyIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUwIiwic2V0RXJyb3IiLCJfdXNlU25hY2tCYXJNYW5hZ2VyIiwiaGFuZGxlU25hY2tiYXJFcnJvciIsIl91c2VUcmFuc2xhdGlvbiIsInQiLCJpMThuIiwibGFzdFNlbGVjdGVkQWdlbnRSZWYiLCJpc1JlZnJlc2hpbmdSZWYiLCJsYXN0UmVxdWVzdFJlZiIsImFnZW50c1JlZiIsInByZVNlYXJjaEFnZW50c1JlZiIsImN1cnJlbnQiLCJhZGRBZ2VudCIsIm5ld0FnZW50Iiwib3B0aW9ucyIsInByZXYiLCJhZ2VudEV4aXN0cyIsInNvbWUiLCJleGlzdGluZ0FnZW50IiwibmV3RGF0YSIsInNvcnRlZERhdGEiLCJfb2JqZWN0U3ByZWFkIiwibmF2aWdhdGVIb21lIiwicmVtb3ZlQWdlbnQiLCJhZ2VudElkIiwidG9TdHJpbmciLCJ1cGRhdGVBZ2VudCIsInVwZGF0ZWRBZ2VudCIsInVwZGF0ZWREYXRhIiwidXBkYXRlQWdlbnRGYXZvcml0ZSIsInNob3VsZFNvcnQiLCJhcmd1bWVudHMiLCJ1bmRlZmluZWQiLCJfcmVmMiIsImFnZW50RmllbGRzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiX2V4Y2x1ZGVkIiwibWVyZ2VkQWdlbnQiLCJmaW5hbERhdGEiLCJmaW5kIiwiX3JlZjMiLCJfZXhjbHVkZWQyIiwiX3JlZjQiLCJfZXhjbHVkZWQzIiwic29ydEFnZW50c0xpc3QiLCJzZWxlY3RGaXJzdEFnZW50IiwiZmlyc3RBZ2VudCIsImZpbmRJbmRleCIsImFnZW50RGF0YSIsImhhbmRsZUdldEFnZW50cyIsIl9yZWY1IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWU0IiwiYWdlbnRUb1NlbGVjdCIsIl9hZ2VudFRvU2VsZWN0JGlkIiwicmVxdWVzdEtleSIsImlzTXVsdGlBZ2VudHMiLCJhZ2VudFBhcnNlZCIsImhhc01vcmUiLCJuZXh0T2Zmc2V0IiwiY2xvbmVBZ2VudHNSb2xlQmxvY2tlZCIsImNhbkZldGNoQ2xvbmVBZ2VudHMiLCJmZXRjaEdsb2JhbENsb25lQWdlbnRzIiwiY3VzdG9tQWdlbnRzIiwiY3VzdG9tSGFzTW9yZSIsImN1c3RvbU5leHRPZmZzZXQiLCJpczQwMyIsImxvYWRDbG9uZUFnZW50cyIsImxvYWRDdXN0b21BZ2VudHMiLCJxdWVyeVBhcmFtcyIsInF1ZXJ5U3RyaW5nIiwicGF0aCIsImdsb2JhbENsb25lQWdlbnRzIiwiX3Jlc3BvbnNlRXJyb3IkcmVzcG9uIiwiX3Jlc3BvbnNlRXJyb3IkbWVzc2FnIiwiX3Jlc3BvbnNlRXJyb3IkbWVzc2FnMiIsImlzNDAzRXJyb3IiLCJfYWdlbnRQYXJzZWQiLCJfYWdlbnRQYXJzZWQyIiwiX2xhc3RTZWxlY3RlZEFnZW50UmVmIiwiX2xhc3RTZWxlY3RlZEFnZW50UmVmMiIsImF2YWlsYWJsZUFnZW50cyIsIl9hdmFpbGFibGVBZ2VudHMiLCJfbGFzdFNlbGVjdGVkQWdlbnRSZWYzIiwiX2F2YWlsYWJsZUFnZW50czIiLCJfYXZhaWxhYmxlQWdlbnRzMyIsImZpcnN0QXZhaWxhYmxlQWdlbnQiLCJfdDQiLCJfdDUiLCJ3cmFwIiwiX2NvbnRleHQ0IiwibmV4dCIsImFicnVwdCIsIndpbmRvdyIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTUyIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMiLCJfcmVmNiIsIl9jYWxsZWUiLCJjbG9uZVJlc3BvbnNlIiwiY2xvbmVEYXRhIiwiX3QiLCJfY29udGV4dCIsImxhbmd1YWdlIiwibWV0aG9kIiwic2VudCIsImpzb24iLCJzdG9wIiwiYXBwbHkiLCJfcmVmNyIsIl9jYWxsZWUyIiwiX21haWFEYXRhJGRhdGEiLCJtYWlhUmVzcG9uc2UiLCJtYWlhRGF0YSIsIl90MiIsIl9jb250ZXh0MiIsIl9yZWY4IiwiX2NhbGxlZTMiLCJjdXN0b21SZXNwb25zZSIsImN1c3RvbURhdGEiLCJfdDMiLCJfY29udGV4dDMiLCJoYXNfbW9yZSIsIm5leHRfb2Zmc2V0IiwiUHJvbWlzZSIsImFsbCIsIlVSTFNlYXJjaFBhcmFtcyIsImFwcGVuZCIsImFnZW50VG9SZXF1ZXN0IiwiYWdlbnRJdGVtIiwiRXJyb3IiLCJzZXRUaW1lb3V0IiwiZmluaXNoIiwiX3giLCJzZWFyY2hDdXN0b21BZ2VudHMiLCJfcmVmOSIsIl9jYWxsZWU1IiwicXVlcnkiLCJfdDYiLCJfY29udGV4dDUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJjbG9uZUFnZW50cyIsImN1c3RvbVJlc3VsdHMiLCJfeDIiLCJsb2FkTW9yZUFnZW50cyIsIl9jYWxsZWU2IiwiY2FuTG9hZE1vcmUiLCJfdDciLCJfY29udGV4dDYiLCJleGlzdGluZ01haWFBZ2VudHMiLCJleGlzdGluZ0lkcyIsIm5ld0FnZW50cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9tYWlhL0FnZW50cy9nZXRBZ2VudHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1uZXN0ZWQtdGVybmFyeSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuaW1wb3J0IHsgdXNlU3RhdGUsIHVzZUNhbGxiYWNrLCB1c2VSZWYgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAncmVhY3QtaTE4bmV4dCdcbmltcG9ydCB7IHVzZVNuYWNrQmFyTWFuYWdlciB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVNuYWNrQmFyTWFuYWdlci91c2VTbmFja0Jhck1hbmFnZXInXG5pbXBvcnQgeyBmZXRjaE1haWEgfSBmcm9tICcuLi9jbGllbnQnXG5pbXBvcnQgeyB3aXRoTm9ybWFsaXplZENvbm5lY3RvcnMgfSBmcm9tICcuLi8uLi8uLi91dGlscy9ub3JtYWxpemVBZ2VudENvbm5lY3RvcnMnXG5pbXBvcnQgeyBBZ2VudCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2FnZW50J1xuaW1wb3J0IHsgdXNlVXNlciB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHQvY29yLXVzZXInXG5pbXBvcnQgeyBpc01haWFDbG9uZUFnZW50c1JvbGVCbG9ja2VkIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL21haWFUYXNrUGFuZWxBY2Nlc3MnXG5pbXBvcnQgeyBTZWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9nbG9iYWwtY29udGV4dCdcbmltcG9ydCB7IG1hcENPUkxhbmcgfSBmcm9tICcuLi8uLi8uLi9sYW5nL3V0aWxzJ1xuXG5jb25zdCBpc01haWFBZ2VudCA9IChhZ2VudDogQWdlbnQpID0+IGFnZW50Py50eXBlID09PSAnb3JjaGVzdHJhdG9yJ1xuXG5jb25zdCBpczQwM0FnZW50RmV0Y2hFcnJvciA9IChlcnI6IHVua25vd24pOiBib29sZWFuID0+IHtcbiAgY29uc3QgZXJyb3IgPSBlcnIgYXMgeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyIH07IHN0YXR1cz86IG51bWJlcjsgbWVzc2FnZT86IHN0cmluZyB9XG4gIHJldHVybiAoXG4gICAgZXJyb3I/LnJlc3BvbnNlPy5zdGF0dXMgPT09IDQwMyB8fFxuICAgIGVycm9yPy5zdGF0dXMgPT09IDQwMyB8fFxuICAgIEJvb2xlYW4oZXJyb3I/Lm1lc3NhZ2U/LmluY2x1ZGVzKFwiWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byB2aWV3IGFnZW50c1wiKSkgfHxcbiAgICBCb29sZWFuKGVycm9yPy5tZXNzYWdlPy5pbmNsdWRlcygnRmFpbGVkIGZldGNoaW5nIGRhdGEnKSlcbiAgKVxufVxuXG5jb25zdCBtZXJnZUFnZW50c1dpdGhvdXREdXBsaWNhdGVzID0gKGJhc2U6IEFnZW50W10sIGV4dHJhOiBBZ2VudFtdKTogQWdlbnRbXSA9PiB7XG4gIGNvbnN0IGlkcyA9IG5ldyBTZXQoYmFzZS5tYXAoYWdlbnQgPT4gYWdlbnQuaWQpKVxuICBjb25zdCBtZXJnZWQgPSBbLi4uYmFzZV1cbiAgZXh0cmEuZm9yRWFjaChhZ2VudCA9PiB7XG4gICAgaWYgKCFpZHMuaGFzKGFnZW50LmlkKSkgbWVyZ2VkLnB1c2goYWdlbnQpXG4gIH0pXG4gIHJldHVybiBtZXJnZWRcbn1cblxuLyoqXG4gKiBPcmRlbmEgbG9zIGFnZW50ZXM6IE1BSUEgcHJpbWVybyAoc2kgZXhpc3RlKSwgbHVlZ28gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGUsIGx1ZWdvIG5vIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlXG4gKi9cbmNvbnN0IHNvcnRBZ2VudHMgPSAoYWdlbnRzOiBBZ2VudFtdKTogQWdlbnRbXSA9PiB7XG4gIGNvbnN0IG1haWFBZ2VudHMgPSBhZ2VudHMuZmlsdGVyKGlzTWFpYUFnZW50KVxuICBjb25zdCBvdGhlckFnZW50cyA9IGFnZW50cy5maWx0ZXIoYWcgPT4gIWlzTWFpYUFnZW50KGFnKSlcblxuICAvLyBTZXBhcmFyIGZhdm9yaXRvcyB5IG5vIGZhdm9yaXRvc1xuICBjb25zdCBmYXZvcml0ZXMgPSBvdGhlckFnZW50cy5maWx0ZXIoYWcgPT4gYWcuaXNfZmF2b3JpdGUpLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpXG4gIGNvbnN0IG5vbkZhdm9yaXRlcyA9IG90aGVyQWdlbnRzLmZpbHRlcihhZyA9PiAhYWcuaXNfZmF2b3JpdGUpLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpXG5cbiAgcmV0dXJuIG1haWFBZ2VudHMubGVuZ3RoID8gWy4uLm1haWFBZ2VudHMsIC4uLmZhdm9yaXRlcywgLi4ubm9uRmF2b3JpdGVzXSA6IFsuLi5mYXZvcml0ZXMsIC4uLm5vbkZhdm9yaXRlc11cbn1cblxuY29uc3Qgbm9ybWFsaXplQ3VzdG9tQWdlbnRzRnJvbUFwaSA9IChhZ2VudHM6IEFnZW50W10pOiBBZ2VudFtdID0+XG4gIGFnZW50cy5tYXAoYWdlbnQgPT4gKGFnZW50LnR5cGUgPT09ICdjdXN0b20nID8gd2l0aE5vcm1hbGl6ZWRDb25uZWN0b3JzKGFnZW50KSA6IGFnZW50KSlcblxudHlwZSBVc2VHZXRBZ2VudHNQcm9wcyA9IHtcbiAgc2VsZWN0QWdlbnQ6IChhZ2VudDogQWdlbnQpID0+IHZvaWRcbiAgc2VjdGlvbjogU2VjdGlvblxuICBhZ2VudDogQWdlbnQgfCBudWxsXG4gIGhhbmRsZUdvSG9tZTogKCkgPT4gdm9pZFxufVxuXG5leHBvcnQgdHlwZSBBZGRBZ2VudE9wdGlvbnMgPSB7XG4gIC8qKiBQb3IgZGVmZWN0byBgdHJ1ZWAgKGNvbXBvcnRhbWllbnRvIEFCTSkuIFBhc2FyIGBmYWxzZWAgYWwgaW5zZXJ0YXIgYWdlbnRlIGNyZWFkbyBwb3IgY2hhdCBzaW4gY2FtYmlhciBkZSB2aXN0YS4gKi9cbiAgbmF2aWdhdGVIb21lPzogYm9vbGVhblxufVxuXG5leHBvcnQgY29uc3QgdXNlR2V0QWdlbnRzID0gKHsgc2VsZWN0QWdlbnQsIHNlY3Rpb24sIGFnZW50LCBoYW5kbGVHb0hvbWUgfTogVXNlR2V0QWdlbnRzUHJvcHMpID0+IHtcbiAgY29uc3QgdXNlciA9IHVzZVVzZXIoKVxuICBjb25zdCBbYWdlbnRzLCBzZXRBZ2VudHNdID0gdXNlU3RhdGU8eyBkYXRhOiBBZ2VudFtdOyBoYXNfbW9yZT86IGJvb2xlYW47IG5leHRfb2Zmc2V0PzogbnVtYmVyIHwgbnVsbCB9Pih7IGRhdGE6IFtdIH0pXG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbbG9hZGluZ01vcmUsIHNldExvYWRpbmdNb3JlXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbc2VhcmNoTG9hZGluZywgc2V0U2VhcmNoTG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCB7IGhhbmRsZVNuYWNrYmFyRXJyb3IgfSA9IHVzZVNuYWNrQmFyTWFuYWdlcigpXG4gIGNvbnN0IHsgdCwgaTE4biB9ID0gdXNlVHJhbnNsYXRpb24oJ2NoYXRfYWlfc2VjdGlvbicpXG4gIGNvbnN0IGxhc3RTZWxlY3RlZEFnZW50UmVmID0gdXNlUmVmPEFnZW50IHwgbnVsbD4obnVsbClcbiAgY29uc3QgaXNSZWZyZXNoaW5nUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBsYXN0UmVxdWVzdFJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBhZ2VudHNSZWYgPSB1c2VSZWYoYWdlbnRzKVxuICBjb25zdCBwcmVTZWFyY2hBZ2VudHNSZWYgPSB1c2VSZWY8eyBkYXRhOiBBZ2VudFtdOyBoYXNfbW9yZT86IGJvb2xlYW47IG5leHRfb2Zmc2V0PzogbnVtYmVyIHwgbnVsbCB9IHwgbnVsbD4obnVsbClcblxuICBhZ2VudHNSZWYuY3VycmVudCA9IGFnZW50c1xuXG4gIGNvbnN0IGFkZEFnZW50ID0gdXNlQ2FsbGJhY2soXG4gICAgKG5ld0FnZW50OiBBZ2VudCwgb3B0aW9ucz86IEFkZEFnZW50T3B0aW9ucykgPT4ge1xuICAgICAgc2V0QWdlbnRzKHByZXYgPT4ge1xuICAgICAgICAvLyBWZXJpZmljYXIgc2kgZWwgYWdlbnRlIHlhIGV4aXN0ZSBwYXJhIGV2aXRhciBkdXBsaWNhZG9zXG4gICAgICAgIGNvbnN0IGFnZW50RXhpc3RzID0gcHJldi5kYXRhLnNvbWUoZXhpc3RpbmdBZ2VudCA9PiBleGlzdGluZ0FnZW50LmlkID09PSBuZXdBZ2VudC5pZClcbiAgICAgICAgaWYgKGFnZW50RXhpc3RzKSB7XG4gICAgICAgICAgcmV0dXJuIHByZXZcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdEYXRhID0gWy4uLnByZXYuZGF0YSwgbmV3QWdlbnRdXG4gICAgICAgIGNvbnN0IHNvcnRlZERhdGEgPSBzb3J0QWdlbnRzKG5ld0RhdGEpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICBkYXRhOiBzb3J0ZWREYXRhLFxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgaWYgKG9wdGlvbnM/Lm5hdmlnYXRlSG9tZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgaGFuZGxlR29Ib21lKClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtoYW5kbGVHb0hvbWVdXG4gIClcblxuICBjb25zdCByZW1vdmVBZ2VudCA9IHVzZUNhbGxiYWNrKChhZ2VudElkOiBudW1iZXIgfCBzdHJpbmcpID0+IHtcbiAgICBzZXRBZ2VudHMocHJldiA9PiAoe1xuICAgICAgLi4ucHJldixcbiAgICAgIGRhdGE6IHByZXYuZGF0YS5maWx0ZXIoYSA9PiBhLmlkICE9PSBhZ2VudElkLnRvU3RyaW5nKCkpLFxuICAgIH0pKVxuICB9LCBbXSlcblxuICBjb25zdCB1cGRhdGVBZ2VudCA9IHVzZUNhbGxiYWNrKCh1cGRhdGVkQWdlbnQ6IEFnZW50KSA9PiB7XG4gICAgc2V0QWdlbnRzKHByZXYgPT4ge1xuICAgICAgY29uc3QgdXBkYXRlZERhdGEgPSBwcmV2LmRhdGEubWFwKGV4aXN0aW5nQWdlbnQgPT5cbiAgICAgICAgZXhpc3RpbmdBZ2VudC5pZCA9PT0gdXBkYXRlZEFnZW50LmlkID8gdXBkYXRlZEFnZW50IDogZXhpc3RpbmdBZ2VudFxuICAgICAgKVxuICAgICAgY29uc3Qgc29ydGVkRGF0YSA9IHNvcnRBZ2VudHModXBkYXRlZERhdGEpXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5wcmV2LFxuICAgICAgICBkYXRhOiBzb3J0ZWREYXRhLFxuICAgICAgfVxuICAgIH0pXG4gIH0sIFtdKVxuXG4gIGNvbnN0IHVwZGF0ZUFnZW50RmF2b3JpdGUgPSB1c2VDYWxsYmFjayhcbiAgICAodXBkYXRlZEFnZW50OiBBZ2VudCwgc2hvdWxkU29ydDogYm9vbGVhbiA9IGZhbHNlKSA9PiB7XG4gICAgICBzZXRBZ2VudHMocHJldiA9PiB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWREYXRhID0gcHJldi5kYXRhLm1hcChleGlzdGluZ0FnZW50ID0+IHtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdBZ2VudC5pZCA9PT0gdXBkYXRlZEFnZW50LmlkKSB7XG4gICAgICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIC4uLmFnZW50RmllbGRzIH0gPSB1cGRhdGVkQWdlbnQgYXMgYW55XG4gICAgICAgICAgICBjb25zdCBtZXJnZWRBZ2VudCA9IHsgLi4uZXhpc3RpbmdBZ2VudCwgLi4uYWdlbnRGaWVsZHMgfVxuICAgICAgICAgICAgcmV0dXJuIG1lcmdlZEFnZW50XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBleGlzdGluZ0FnZW50XG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gU29sbyBvcmRlbmFyIHNpIHNob3VsZFNvcnQgZXMgdHJ1ZVxuICAgICAgICBjb25zdCBmaW5hbERhdGEgPSBzaG91bGRTb3J0ID8gc29ydEFnZW50cyh1cGRhdGVkRGF0YSkgOiB1cGRhdGVkRGF0YVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICBkYXRhOiBmaW5hbERhdGEsXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIEFjdHVhbGl6YXIgZWwgYWdlbnRlIHNlbGVjY2lvbmFkbyBzaSBlcyBlbCBxdWUgc2UgZXN0w6EgYWN0dWFsaXphbmRvXG4gICAgICBpZiAoYWdlbnQ/LmlkID09PSB1cGRhdGVkQWdlbnQuaWQpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdBZ2VudCA9IGFnZW50cy5kYXRhLmZpbmQoYSA9PiBhLmlkID09PSB1cGRhdGVkQWdlbnQuaWQpXG4gICAgICAgIGlmIChleGlzdGluZ0FnZW50KSB7XG4gICAgICAgICAgY29uc3QgeyBtZXNzYWdlLCAuLi5hZ2VudEZpZWxkcyB9ID0gdXBkYXRlZEFnZW50IGFzIGFueVxuICAgICAgICAgIGNvbnN0IG1lcmdlZEFnZW50ID0geyAuLi5leGlzdGluZ0FnZW50LCAuLi5hZ2VudEZpZWxkcyB9XG4gICAgICAgICAgc2VsZWN0QWdlbnQobWVyZ2VkQWdlbnQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgeyBtZXNzYWdlLCAuLi5hZ2VudEZpZWxkcyB9ID0gdXBkYXRlZEFnZW50IGFzIGFueVxuICAgICAgICAgIHNlbGVjdEFnZW50KGFnZW50RmllbGRzIGFzIEFnZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbYWdlbnQsIHNlbGVjdEFnZW50LCBhZ2VudHMuZGF0YV1cbiAgKVxuXG4gIGNvbnN0IHNvcnRBZ2VudHNMaXN0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldEFnZW50cyhwcmV2ID0+IHtcbiAgICAgIGNvbnN0IHNvcnRlZERhdGEgPSBzb3J0QWdlbnRzKHByZXYuZGF0YSlcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIGRhdGE6IHNvcnRlZERhdGEsXG4gICAgICB9XG4gICAgfSlcbiAgfSwgW10pXG5cbiAgY29uc3Qgc2VsZWN0Rmlyc3RBZ2VudCA9IHVzZUNhbGxiYWNrKFxuICAgIChhZ2VudElkPzogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoYWdlbnRzLmRhdGEubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0QWdlbnQgPSBhZ2VudHMuZGF0YS5maW5kSW5kZXgoYWdlbnREYXRhID0+IGFnZW50RGF0YS5pZCA9PT0gYWdlbnRJZClcbiAgICAgICAgbGFzdFNlbGVjdGVkQWdlbnRSZWYuY3VycmVudCA9IGFnZW50cy5kYXRhW2ZpcnN0QWdlbnQgPT09IDAgPyAxIDogMF1cbiAgICAgICAgc2VsZWN0QWdlbnQoYWdlbnRzLmRhdGFbZmlyc3RBZ2VudCA9PT0gMCA/IDEgOiAwXSlcbiAgICAgIH1cbiAgICB9LFxuICAgIFthZ2VudHMuZGF0YSwgc2VsZWN0QWdlbnRdXG4gIClcblxuICBjb25zdCBoYW5kbGVHZXRBZ2VudHMgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoYWdlbnRUb1NlbGVjdD86IEFnZW50KSA9PiB7XG4gICAgICBpZiAoaXNSZWZyZXNoaW5nUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcXVlc3RLZXkgPSBhZ2VudFRvU2VsZWN0Py5pZD8udG9TdHJpbmcoKSB8fCAnZGVmYXVsdCdcbiAgICAgIGlmIChsYXN0UmVxdWVzdFJlZi5jdXJyZW50ID09PSByZXF1ZXN0S2V5ICYmICFsb2FkaW5nKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpc1JlZnJlc2hpbmdSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIGxhc3RSZXF1ZXN0UmVmLmN1cnJlbnQgPSByZXF1ZXN0S2V5XG4gICAgICBzZXRMb2FkaW5nKHRydWUpXG4gICAgICBzZXRFcnJvcihudWxsKVxuXG4gICAgICBjb25zdCBpc011bHRpQWdlbnRzID0gISF3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTICYmICEhd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFNcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IGFnZW50UGFyc2VkOiBBZ2VudFtdID0gW11cbiAgICAgICAgbGV0IGhhc01vcmUgPSBmYWxzZVxuICAgICAgICBsZXQgbmV4dE9mZnNldDogbnVtYmVyIHwgbnVsbCA9IG51bGxcbiAgICAgICAgY29uc3QgY2xvbmVBZ2VudHNSb2xlQmxvY2tlZCA9IGlzTWFpYUNsb25lQWdlbnRzUm9sZUJsb2NrZWQodXNlciwgc2VjdGlvbilcbiAgICAgICAgY29uc3QgY2FuRmV0Y2hDbG9uZUFnZW50cyA9ICFjbG9uZUFnZW50c1JvbGVCbG9ja2VkXG5cbiAgICAgICAgY29uc3QgZmV0Y2hHbG9iYWxDbG9uZUFnZW50cyA9IGFzeW5jICgpOiBQcm9taXNlPEFnZW50W10+ID0+IHtcbiAgICAgICAgICBpZiAoIXdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTIHx8ICFjYW5GZXRjaENsb25lQWdlbnRzKSByZXR1cm4gW11cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY2xvbmVSZXNwb25zZSA9IGF3YWl0IGZldGNoTWFpYSh7XG4gICAgICAgICAgICAgIHBhdGg6IGBhZ2VudHM/YWdlbnRfdHlwZT1jbG9uZSZlbnRpdHk9Z2xvYmFsJmxhbmc9JHttYXBDT1JMYW5nKGkxOG4ubGFuZ3VhZ2UpfWAsXG4gICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY29uc3QgY2xvbmVEYXRhID0gYXdhaXQgY2xvbmVSZXNwb25zZS5qc29uKClcbiAgICAgICAgICAgIHJldHVybiAoY2xvbmVEYXRhLmRhdGEgfHwgW10pLmZpbHRlcigoYWc6IEFnZW50KSA9PiBhZy50eXBlID09PSAnY2xvbmUnKVxuICAgICAgICAgIH0gY2F0Y2ggKGNsb25lRXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChpczQwM0FnZW50RmV0Y2hFcnJvcihjbG9uZUVycm9yKSkgcmV0dXJuIFtdXG4gICAgICAgICAgICB0aHJvdyBjbG9uZUVycm9yXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2kgdGllbmUgZmVhdHVyZSBhY2Nlc3MgbXVsdGkgYWdlbnRzLCBoYWNlciBkb3MgcXVlcmllcyAoTWFpYSArIGN1c3RvbSkgZW4gY3VhbHF1aWVyIHNlY2Npw7NuXG4gICAgICAgIGlmIChpc011bHRpQWdlbnRzKSB7XG4gICAgICAgICAgLy8gUXVlcnkgY2xvbmUgKE1haWEpIHkgY3VzdG9tIHNvbiBpbmRlcGVuZGllbnRlcyDihpIgc2UgZGlzcGFyYW4gZW4gcGFyYWxlbG8uXG4gICAgICAgICAgbGV0IGN1c3RvbUFnZW50czogQWdlbnRbXSA9IFtdXG4gICAgICAgICAgbGV0IGN1c3RvbUhhc01vcmUgPSBmYWxzZVxuICAgICAgICAgIGxldCBjdXN0b21OZXh0T2Zmc2V0OiBudW1iZXIgfCBudWxsID0gbnVsbFxuXG4gICAgICAgICAgY29uc3QgaXM0MDMgPSBpczQwM0FnZW50RmV0Y2hFcnJvclxuXG4gICAgICAgICAgbGV0IG1haWFBZ2VudHM6IEFnZW50W10gPSBbXVxuXG4gICAgICAgICAgY29uc3QgbG9hZENsb25lQWdlbnRzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjYW5GZXRjaENsb25lQWdlbnRzKSByZXR1cm5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IG1haWFSZXNwb25zZSA9IGF3YWl0IGZldGNoTWFpYSh7XG4gICAgICAgICAgICAgICAgcGF0aDogYGFnZW50cz9hZ2VudF90eXBlPW9yY2hlc3RyYXRvciZsYW5nPSR7bWFwQ09STGFuZyhpMThuLmxhbmd1YWdlKX1gLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIGNvbnN0IG1haWFEYXRhID0gYXdhaXQgbWFpYVJlc3BvbnNlLmpzb24oKVxuICAgICAgICAgICAgICBtYWlhQWdlbnRzID0gbWFpYURhdGEuZGF0YT8uZmlsdGVyKGlzTWFpYUFnZW50KSB8fCBbXVxuICAgICAgICAgICAgICBjb25zdCBnbG9iYWxDbG9uZUFnZW50cyA9IGF3YWl0IGZldGNoR2xvYmFsQ2xvbmVBZ2VudHMoKVxuICAgICAgICAgICAgICBtYWlhQWdlbnRzID0gbWVyZ2VBZ2VudHNXaXRob3V0RHVwbGljYXRlcyhtYWlhQWdlbnRzLCBnbG9iYWxDbG9uZUFnZW50cylcbiAgICAgICAgICAgIH0gY2F0Y2ggKG1haWFFcnJvcjogdW5rbm93bikge1xuICAgICAgICAgICAgICAvLyBTaSBlcyA0MDMsIGNvbnRpbnVhciBzaW4gbG9zIGNsb25lQWdlbnRzOyBzaSBlcyBvdHJvIGVycm9yLCBwcm9wYWdhcmxvXG4gICAgICAgICAgICAgIGlmICghaXM0MDMobWFpYUVycm9yKSkgdGhyb3cgbWFpYUVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgbG9hZEN1c3RvbUFnZW50cyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1c3RvbVJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnYWdlbnRzP2FnZW50X3R5cGU9Y3VzdG9tJmxpbWl0PTcmb2Zmc2V0PTAnLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIGNvbnN0IGN1c3RvbURhdGEgPSBhd2FpdCBjdXN0b21SZXNwb25zZS5qc29uKClcbiAgICAgICAgICAgICAgY3VzdG9tQWdlbnRzID0gbm9ybWFsaXplQ3VzdG9tQWdlbnRzRnJvbUFwaShjdXN0b21EYXRhLmRhdGEgfHwgW10pXG4gICAgICAgICAgICAgIGN1c3RvbUhhc01vcmUgPSBjdXN0b21EYXRhLmhhc19tb3JlIHx8IGZhbHNlXG4gICAgICAgICAgICAgIGN1c3RvbU5leHRPZmZzZXQgPSBjdXN0b21EYXRhLm5leHRfb2Zmc2V0IHx8IG51bGxcbiAgICAgICAgICAgIH0gY2F0Y2ggKGN1c3RvbUVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgLy8gU2kgZXMgNDAzLCBjb250aW51YXIgc2luIGxvcyBjdXN0b21BZ2VudHMgKHF1ZWRhIGNvbW8gYXJyYXkgdmFjw61vKTsgc2kgbm8sIHByb3BhZ2FybG9cbiAgICAgICAgICAgICAgaWYgKCFpczQwMyhjdXN0b21FcnJvcikpIHRocm93IGN1c3RvbUVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW2xvYWRDbG9uZUFnZW50cygpLCBsb2FkQ3VzdG9tQWdlbnRzKCldKVxuXG4gICAgICAgICAgLy8gQ29tYmluYXI6IGFnZW50ZXMgY2xvbmUgcHJpbWVybywgbHVlZ28gbG9zIGN1c3RvbSAoc2kgZXhpc3RlbilcbiAgICAgICAgICAvLyBTaSBlbCB1c3VhcmlvIHRpZW5lIHVuIHJvbCBkZXNoYWJpbGl0YWRvLCBubyBpbmNsdWlyIGNsb25lQWdlbnRzXG4gICAgICAgICAgaWYgKCFjYW5GZXRjaENsb25lQWdlbnRzKSB7XG4gICAgICAgICAgICAvLyBSb2wgc2luIGFjY2VzbyBhIGNsb25lcyAocC4gZWouIGZyZWVsYW5jZXIvY2xpZW50ZSBvIGNvbGFib3JhZG9yIGVuIHByb2plY3QvY2xpZW50KTogc29sbyBjdXN0b21BZ2VudHNcbiAgICAgICAgICAgIC8vIFNpIGN1c3RvbUFnZW50cyBlc3TDoSB2YWPDrW8gKHBvciA0MDMpLCBhZ2VudFBhcnNlZCBzZXLDoSBbXVxuICAgICAgICAgICAgYWdlbnRQYXJzZWQgPSBjdXN0b21BZ2VudHNcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWdlbnRQYXJzZWQgPSBtYWlhQWdlbnRzLmxlbmd0aCA/IFsuLi5tYWlhQWdlbnRzLCAuLi5jdXN0b21BZ2VudHNdIDogY3VzdG9tQWdlbnRzXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIE9yZGVuYXI6IE1haWEgcHJpbWVybywgbHVlZ28gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGUsIGx1ZWdvIG5vIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlXG4gICAgICAgICAgYWdlbnRQYXJzZWQgPSBzb3J0QWdlbnRzKGFnZW50UGFyc2VkKVxuICAgICAgICAgIGhhc01vcmUgPSBjdXN0b21IYXNNb3JlXG4gICAgICAgICAgbmV4dE9mZnNldCA9IGN1c3RvbU5leHRPZmZzZXRcblxuICAgICAgICAgIHNldEFnZW50cyh7XG4gICAgICAgICAgICBkYXRhOiBhZ2VudFBhcnNlZCxcbiAgICAgICAgICAgIGhhc19tb3JlOiBoYXNNb3JlLFxuICAgICAgICAgICAgbmV4dF9vZmZzZXQ6IG5leHRPZmZzZXQsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIC8vIFNpIG5vIGhheSBhZ2VudGVzIGRlc3B1w6lzIGRlIHByb2Nlc2FyIGxhcyBxdWVyaWVzLCBsaW1waWFyIGVsIGVycm9yXG4gICAgICAgICAgaWYgKGFnZW50UGFyc2VkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgc2V0RXJyb3IobnVsbClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTMOzZ2ljYSBwYXJhIHByb2plY3QsIGNsaWVudCBvIGhlYWRlciBzaW4gbXVsdGlBZ2VudHMgKG1pc21vIGNyaXRlcmlvIGRlIG9yZGVuIHByb2plY3QvY2xpZW50OyBoZWFkZXIgYcOxYWRlIHBhZ2luYWNpw7NuKVxuICAgICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgc2VjdGlvbiA9PT0gJ3Byb2plY3QnIHx8XG4gICAgICAgICAgICBzZWN0aW9uID09PSAnY2xpZW50JyB8fFxuICAgICAgICAgICAgc2VjdGlvbiA9PT0gJ2hlYWRlcicgfHxcbiAgICAgICAgICAgIHNlY3Rpb24gPT09ICd0YXNrJyB8fFxuICAgICAgICAgICAgc2VjdGlvbiA9PT0gJ3BsYW5uZXInXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtcy5hcHBlbmQoJ2FnZW50X3R5cGUnLCAnb3JjaGVzdHJhdG9yJylcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnbGFuZycsIG1hcENPUkxhbmcoaTE4bi5sYW5ndWFnZSkpXG4gICAgICAgICAgICBpZiAoc2VjdGlvbiA9PT0gJ2hlYWRlcicpIHtcbiAgICAgICAgICAgICAgcXVlcnlQYXJhbXMuYXBwZW5kKCdsaW1pdCcsICc3JylcbiAgICAgICAgICAgICAgcXVlcnlQYXJhbXMuYXBwZW5kKCdvZmZzZXQnLCAnMCcpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcXVlcnlTdHJpbmcgPSBxdWVyeVBhcmFtcy50b1N0cmluZygpXG4gICAgICAgICAgY29uc3QgcGF0aCA9IGBhZ2VudHMke3F1ZXJ5U3RyaW5nID8gYD8ke3F1ZXJ5U3RyaW5nfWAgOiAnJ31gXG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaE1haWEoe1xuICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuICAgICAgICAgICAgLy8gZGF0YS5kYXRhIHlhIGNvbnRpZW5lIGVsL2xvcyBhZ2VudGVzIG9ycXVlc3RhZG9yZXMgZGUgbGEgcXVlcnkgYWdlbnRfdHlwZT1vcmNoZXN0cmF0b3JcbiAgICAgICAgICAgIGFnZW50UGFyc2VkID0gZGF0YS5kYXRhIHx8IFtdXG4gICAgICAgICAgICBjb25zdCBnbG9iYWxDbG9uZUFnZW50cyA9IGF3YWl0IGZldGNoR2xvYmFsQ2xvbmVBZ2VudHMoKVxuICAgICAgICAgICAgYWdlbnRQYXJzZWQgPSBtZXJnZUFnZW50c1dpdGhvdXREdXBsaWNhdGVzKGFnZW50UGFyc2VkLCBnbG9iYWxDbG9uZUFnZW50cylcbiAgICAgICAgICAgIC8vIE9yZGVuYXI6IE1haWEgcHJpbWVybywgbHVlZ28gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGUsIGx1ZWdvIG5vIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlXG4gICAgICAgICAgICBhZ2VudFBhcnNlZCA9IHNvcnRBZ2VudHMoYWdlbnRQYXJzZWQpXG4gICAgICAgICAgICBoYXNNb3JlID0gZGF0YS5oYXNfbW9yZVxuICAgICAgICAgICAgbmV4dE9mZnNldCA9IGRhdGEubmV4dF9vZmZzZXRcblxuICAgICAgICAgICAgc2V0QWdlbnRzKHtcbiAgICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgICAgZGF0YTogYWdlbnRQYXJzZWQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gY2F0Y2ggKHJlc3BvbnNlRXJyb3I6IGFueSkge1xuICAgICAgICAgICAgLy8gVmVyaWZpY2FyIHNpIGVsIGVycm9yIGVzIDQwM1xuICAgICAgICAgICAgLy8gZmV0Y2hDT1IgcHVlZGUgbGFuemFyIGRpZmVyZW50ZXMgdGlwb3MgZGUgZXJyb3JlczpcbiAgICAgICAgICAgIC8vIDEuIEVycm9yIGNvbiBlcnJvckRhdGEuZGV0YWlsIHNpIGluY2x1eWUgJ0FjY2VzcyBkZW5pZWQnXG4gICAgICAgICAgICAvLyAyLiBFcnJvciBnZW7DqXJpY28gJ0ZhaWxlZCBmZXRjaGluZyBkYXRhJyBzaSBlcyA0MDMgcGVybyBubyBpbmNsdXllICdBY2Nlc3MgZGVuaWVkJ1xuICAgICAgICAgICAgLy8gMy4gTmVjZXNpdGFtb3MgdmVyaWZpY2FyIGVsIHN0YXR1cyBjb2RlIHNpIGVzdMOhIGRpc3BvbmlibGVcbiAgICAgICAgICAgIGNvbnN0IGlzNDAzRXJyb3IgPVxuICAgICAgICAgICAgICByZXNwb25zZUVycm9yPy5yZXNwb25zZT8uc3RhdHVzID09PSA0MDMgfHxcbiAgICAgICAgICAgICAgcmVzcG9uc2VFcnJvcj8uc3RhdHVzID09PSA0MDMgfHxcbiAgICAgICAgICAgICAgcmVzcG9uc2VFcnJvcj8ubWVzc2FnZT8uaW5jbHVkZXMoXCJZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHZpZXcgYWdlbnRzXCIpIHx8XG4gICAgICAgICAgICAgIHJlc3BvbnNlRXJyb3I/Lm1lc3NhZ2U/LmluY2x1ZGVzKCdGYWlsZWQgZmV0Y2hpbmcgZGF0YScpIC8vIGZldGNoQ09SIGxhbnphIGVzdG8gcGFyYSA0MDMgc2luICdBY2Nlc3MgZGVuaWVkJ1xuXG4gICAgICAgICAgICBpZiAoaXM0MDNFcnJvcikge1xuICAgICAgICAgICAgICAvLyBTaSBlcyA0MDMsIGVzdGFibGVjZXIgYWdlbnRlcyB2YWPDrW9zIHkgY29udGludWFyXG4gICAgICAgICAgICAgIHNldEFnZW50cyh7XG4gICAgICAgICAgICAgICAgZGF0YTogW10sXG4gICAgICAgICAgICAgICAgaGFzX21vcmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIG5leHRfb2Zmc2V0OiBudWxsLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICBzZXRFcnJvcihudWxsKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gU2kgZXMgb3RybyBlcnJvciwgbGFuemFybG9cbiAgICAgICAgICAgICAgdGhyb3cgcmVzcG9uc2VFcnJvclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEzDs2dpY2EgZGUgc2VsZWN0IGFnZW50IC0gU29sbyBzZWxlY2Npb25hciBzaSBoYXkgYWdlbnRlcyBkaXNwb25pYmxlc1xuICAgICAgICBpZiAoYWdlbnRQYXJzZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGlmIChhZ2VudFRvU2VsZWN0ICYmIGFnZW50UGFyc2VkLmZpbmQoKGFnZW50VG9SZXF1ZXN0OiBBZ2VudCkgPT4gYWdlbnRUb1JlcXVlc3QuaWQgPT09IGFnZW50VG9TZWxlY3QuaWQpKSB7XG4gICAgICAgICAgICBpZiAobGFzdFNlbGVjdGVkQWdlbnRSZWYuY3VycmVudD8uaWQgIT09IGFnZW50VG9TZWxlY3QuaWQpIHtcbiAgICAgICAgICAgICAgbGFzdFNlbGVjdGVkQWdlbnRSZWYuY3VycmVudCA9IGFnZW50VG9TZWxlY3RcbiAgICAgICAgICAgICAgc2VsZWN0QWdlbnQoYWdlbnRUb1NlbGVjdClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKGFnZW50UGFyc2VkPy5bMF0gJiYgKCFhZ2VudCB8fCAhYWdlbnRQYXJzZWQuZmluZCgoYTogQWdlbnQpID0+IGEuaWQgPT09IGFnZW50LmlkKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZUFnZW50cyA9XG4gICAgICAgICAgICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MgJiYgIWNsb25lQWdlbnRzUm9sZUJsb2NrZWRcbiAgICAgICAgICAgICAgICA/IGFnZW50UGFyc2VkXG4gICAgICAgICAgICAgICAgOiBhZ2VudFBhcnNlZC5maWx0ZXIoKGFnZW50SXRlbTogQWdlbnQpID0+ICFpc01haWFBZ2VudChhZ2VudEl0ZW0pKVxuXG4gICAgICAgICAgICBjb25zdCBbZmlyc3RBZ2VudF0gPSBhdmFpbGFibGVBZ2VudHNcbiAgICAgICAgICAgIGlmIChmaXJzdEFnZW50ICYmIGxhc3RTZWxlY3RlZEFnZW50UmVmLmN1cnJlbnQ/LmlkICE9PSBmaXJzdEFnZW50LmlkKSB7XG4gICAgICAgICAgICAgIGxhc3RTZWxlY3RlZEFnZW50UmVmLmN1cnJlbnQgPSBmaXJzdEFnZW50XG4gICAgICAgICAgICAgIHNlbGVjdEFnZW50KGZpcnN0QWdlbnQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChhZ2VudFRvU2VsZWN0ICYmIGFnZW50UGFyc2VkPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZUFnZW50cyA9XG4gICAgICAgICAgICAgIHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MgJiYgIWNsb25lQWdlbnRzUm9sZUJsb2NrZWRcbiAgICAgICAgICAgICAgICA/IGFnZW50UGFyc2VkXG4gICAgICAgICAgICAgICAgOiBhZ2VudFBhcnNlZC5maWx0ZXIoKGFnZW50SXRlbTogQWdlbnQpID0+ICFpc01haWFBZ2VudChhZ2VudEl0ZW0pKVxuXG4gICAgICAgICAgICBjb25zdCBbZmlyc3RBdmFpbGFibGVBZ2VudF0gPSBhdmFpbGFibGVBZ2VudHNcbiAgICAgICAgICAgIGlmIChmaXJzdEF2YWlsYWJsZUFnZW50ICYmIGxhc3RTZWxlY3RlZEFnZW50UmVmLmN1cnJlbnQ/LmlkICE9PSBmaXJzdEF2YWlsYWJsZUFnZW50LmlkKSB7XG4gICAgICAgICAgICAgIGxhc3RTZWxlY3RlZEFnZW50UmVmLmN1cnJlbnQgPSBmaXJzdEF2YWlsYWJsZUFnZW50XG4gICAgICAgICAgICAgIHNlbGVjdEFnZW50KGZpcnN0QXZhaWxhYmxlQWdlbnQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzZXRFcnJvcihlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ0FuIHVua25vd24gZXJyb3Igb2NjdXJyZWQnKVxuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaXNSZWZyZXNoaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAoIWlzUmVmcmVzaGluZ1JlZi5jdXJyZW50KSB7XG4gICAgICAgICAgICBsYXN0UmVxdWVzdFJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwKVxuICAgICAgfVxuICAgIH0sXG4gICAgW3NlbGVjdEFnZW50LCBzZWN0aW9uLCBhZ2VudCwgbG9hZGluZ11cbiAgKVxuXG4gIGNvbnN0IHNlYXJjaEN1c3RvbUFnZW50cyA9IHVzZUNhbGxiYWNrKGFzeW5jIChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgaWYgKCFxdWVyeSkge1xuICAgICAgaWYgKHByZVNlYXJjaEFnZW50c1JlZi5jdXJyZW50KSB7XG4gICAgICAgIHNldEFnZW50cyhwcmVTZWFyY2hBZ2VudHNSZWYuY3VycmVudClcbiAgICAgICAgcHJlU2VhcmNoQWdlbnRzUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIXByZVNlYXJjaEFnZW50c1JlZi5jdXJyZW50KSB7XG4gICAgICBwcmVTZWFyY2hBZ2VudHNSZWYuY3VycmVudCA9IGFnZW50c1JlZi5jdXJyZW50XG4gICAgfVxuXG4gICAgc2V0U2VhcmNoTG9hZGluZyh0cnVlKVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICAgICAgcGF0aDogYGFnZW50cz9hZ2VudF90eXBlPWN1c3RvbSZsaW1pdD0yMCZvZmZzZXQ9MCZxPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX1gLFxuICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgfSlcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcblxuICAgICAgc2V0QWdlbnRzKHByZXYgPT4ge1xuICAgICAgICBjb25zdCBjbG9uZUFnZW50cyA9IHByZXYuZGF0YS5maWx0ZXIoKGFnOiBBZ2VudCkgPT4gYWcudHlwZSA9PT0gJ2Nsb25lJylcbiAgICAgICAgY29uc3QgY3VzdG9tUmVzdWx0czogQWdlbnRbXSA9IGRhdGEuZGF0YSB8fCBbXVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRhdGE6IGNsb25lQWdlbnRzLmxlbmd0aCA/IFsuLi5jbG9uZUFnZW50cywgLi4uY3VzdG9tUmVzdWx0c10gOiBjdXN0b21SZXN1bHRzLFxuICAgICAgICAgIGhhc19tb3JlOiBmYWxzZSxcbiAgICAgICAgICBuZXh0X29mZnNldDogbnVsbCxcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGhhbmRsZVNuYWNrYmFyRXJyb3IodCgnc25hY2tiYXIubG9hZE1vcmVBZ2VudHMuZXJyb3InKSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0U2VhcmNoTG9hZGluZyhmYWxzZSlcbiAgICB9XG4gIH0sIFtdKVxuXG4gIGNvbnN0IGxvYWRNb3JlQWdlbnRzID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGlzTXVsdGlBZ2VudHMgPSAhIXdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MgJiYgISF3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UU1xuICAgIC8vIENhcmdhciBtw6FzOiBlbiBoZWFkZXIgc2llbXByZTsgZW4gcHJvamVjdCBzb2xvIHNpIGlzTXVsdGlBZ2VudHMgKHBvcnF1ZSBzb2xvIGVudG9uY2VzIGhheSBwYWdpbmFjacOzbiBkZSBjdXN0b20pXG4gICAgY29uc3QgY2FuTG9hZE1vcmUgPSBzZWN0aW9uID09PSAnaGVhZGVyJyB8fCBpc011bHRpQWdlbnRzXG4gICAgaWYgKCFjYW5Mb2FkTW9yZSB8fCAhYWdlbnRzLmhhc19tb3JlIHx8ICFhZ2VudHMubmV4dF9vZmZzZXQgfHwgbG9hZGluZ01vcmUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHNldExvYWRpbmdNb3JlKHRydWUpXG4gICAgc2V0RXJyb3IobnVsbClcblxuICAgIHRyeSB7XG4gICAgICBsZXQgcGF0aDogc3RyaW5nXG5cbiAgICAgIC8vIFNpIGVzIG11bHRpQWdlbnRzLCBzb2xvIGNhcmdhciBhZ2VudHMgY3VzdG9tIChNYWlhIHlhIGVzdMOhIGNhcmdhZG8pXG4gICAgICBpZiAoaXNNdWx0aUFnZW50cykge1xuICAgICAgICAvLyBNYW50ZW5lciBjYW50aWRhZCBpbXBhciBkZSBjYXJkczogcHJpbWVyYSBjYXJnYSA3LCBzaWd1aWVudGVzICs2ICg3LCAxMywgMTksIC4uLilcbiAgICAgICAgcGF0aCA9IGBhZ2VudHM/YWdlbnRfdHlwZT1jdXN0b20mbGltaXQ9NiZvZmZzZXQ9JHthZ2VudHMubmV4dF9vZmZzZXR9YFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU2kgbm8gZXMgbXVsdGlBZ2VudHMsIGNhcmdhciBtw6FzIGFnZW50ZXMgb3JxdWVzdGFkb3JlcyAoTUFJQSlcbiAgICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKClcbiAgICAgICAgcXVlcnlQYXJhbXMuYXBwZW5kKCdhZ2VudF90eXBlJywgJ29yY2hlc3RyYXRvcicpXG4gICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnbGFuZycsIG1hcENPUkxhbmcoaTE4bi5sYW5ndWFnZSkpXG4gICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnbGltaXQnLCAnNycpXG4gICAgICAgIHF1ZXJ5UGFyYW1zLmFwcGVuZCgnb2Zmc2V0JywgYWdlbnRzLm5leHRfb2Zmc2V0LnRvU3RyaW5nKCkpXG4gICAgICAgIHBhdGggPSBgYWdlbnRzPyR7cXVlcnlQYXJhbXMudG9TdHJpbmcoKX1gXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICAgICAgcGF0aCxcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcblxuICAgICAgLy8gQWN1bXVsYXIgYWdlbnRlcywgZXhjbHV5ZW5kbyBkdXBsaWNhZG9zXG4gICAgICBzZXRBZ2VudHMocHJldiA9PiB7XG4gICAgICAgIGlmIChpc011bHRpQWdlbnRzKSB7XG4gICAgICAgICAgLy8gTMOzZ2ljYSBwYXJhIG11bHRpQWdlbnRzOiBzZXBhcmFyIE1BSUEgeSBjdXN0b21cbiAgICAgICAgICBjb25zdCBleGlzdGluZ01haWFBZ2VudHMgPSBwcmV2LmRhdGEuZmlsdGVyKGlzTWFpYUFnZW50KVxuXG4gICAgICAgICAgLy8gT2J0ZW5lciBJRHMgZXhpc3RlbnRlcyAoZXhjbHV5ZW5kbyBNQUlBKVxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChwcmV2LmRhdGEuZmlsdGVyKChhZzogQWdlbnQpID0+ICFpc01haWFBZ2VudChhZykpLm1hcCgoYWc6IEFnZW50KSA9PiBhZy5pZCkpXG5cbiAgICAgICAgICAvLyBGaWx0cmFyIG51ZXZvcyBhZ2VudHMgcXVlIG5vIGVzdMOpbiB5YSBlbiBsYSBsaXN0YSAoZXhjbHV5ZW5kbyBNQUlBIHkgY2xvbmVzKSwgbm9ybWFsaXphbmRvIGN1c3RvbVxuICAgICAgICAgIGNvbnN0IG5ld0FnZW50cyA9IG5vcm1hbGl6ZUN1c3RvbUFnZW50c0Zyb21BcGkoXG4gICAgICAgICAgICBkYXRhLmRhdGEuZmlsdGVyKChhZzogQWdlbnQpID0+ICFpc01haWFBZ2VudChhZykgJiYgYWcudHlwZSAhPT0gJ2Nsb25lJyAmJiAhZXhpc3RpbmdJZHMuaGFzKGFnLmlkKSlcbiAgICAgICAgICApXG5cbiAgICAgICAgICBjb25zdCBuZXdEYXRhID0gZXhpc3RpbmdNYWlhQWdlbnRzLmxlbmd0aFxuICAgICAgICAgICAgPyBbLi4uZXhpc3RpbmdNYWlhQWdlbnRzLCAuLi5wcmV2LmRhdGEuZmlsdGVyKChhZzogQWdlbnQpID0+ICFpc01haWFBZ2VudChhZykpLCAuLi5uZXdBZ2VudHNdXG4gICAgICAgICAgICA6IFsuLi5wcmV2LmRhdGEuZmlsdGVyKChhZzogQWdlbnQpID0+ICFpc01haWFBZ2VudChhZykpLCAuLi5uZXdBZ2VudHNdXG5cbiAgICAgICAgICAvLyBPcmRlbmFyOiBNYWlhIHByaW1lcm8sIGx1ZWdvIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlLCBsdWVnbyBubyBmYXZvcml0b3MgYWxmYWLDqXRpY2FtZW50ZVxuICAgICAgICAgIGNvbnN0IHNvcnRlZERhdGEgPSBzb3J0QWdlbnRzKG5ld0RhdGEpXG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGF0YTogc29ydGVkRGF0YSxcbiAgICAgICAgICAgIGhhc19tb3JlOiBkYXRhLmhhc19tb3JlLFxuICAgICAgICAgICAgbmV4dF9vZmZzZXQ6IGRhdGEubmV4dF9vZmZzZXQsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEzDs2dpY2EgcGFyYSAhaXNNdWx0aUFnZW50czogYWdyZWdhciBldml0YW5kbyBkdXBsaWNhZG9zXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChwcmV2LmRhdGEubWFwKChhZzogQWdlbnQpID0+IGFnLmlkKSlcbiAgICAgICAgY29uc3QgbmV3QWdlbnRzID0gKGRhdGEuZGF0YSB8fCBbXSkuZmlsdGVyKChhZzogQWdlbnQpID0+ICFleGlzdGluZ0lkcy5oYXMoYWcuaWQpKVxuICAgICAgICBjb25zdCBuZXdEYXRhID0gWy4uLnByZXYuZGF0YSwgLi4ubmV3QWdlbnRzXVxuXG4gICAgICAgIC8vIE9yZGVuYXI6IE1haWEgcHJpbWVybywgbHVlZ28gZmF2b3JpdG9zIGFsZmFiw6l0aWNhbWVudGUsIGx1ZWdvIG5vIGZhdm9yaXRvcyBhbGZhYsOpdGljYW1lbnRlXG4gICAgICAgIGNvbnN0IHNvcnRlZERhdGEgPSBzb3J0QWdlbnRzKG5ld0RhdGEpXG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiBzb3J0ZWREYXRhLFxuICAgICAgICAgIGhhc19tb3JlOiBkYXRhLmhhc19tb3JlLFxuICAgICAgICAgIG5leHRfb2Zmc2V0OiBkYXRhLm5leHRfb2Zmc2V0LFxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBzZXRMb2FkaW5nTW9yZShmYWxzZSlcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGhhbmRsZVNuYWNrYmFyRXJyb3IodCgnc25hY2tiYXIubG9hZE1vcmVBZ2VudHMuZXJyb3InKSlcbiAgICAgIHNldExvYWRpbmdNb3JlKGZhbHNlKVxuICAgIH1cbiAgfSwgW3NlY3Rpb24sIGFnZW50cy5oYXNfbW9yZSwgYWdlbnRzLm5leHRfb2Zmc2V0LCBsb2FkaW5nTW9yZSwgaTE4bi5sYW5ndWFnZV0pXG5cbiAgcmV0dXJuIHtcbiAgICBhZ2VudHMsXG4gICAgbG9hZGluZyxcbiAgICBsb2FkaW5nTW9yZSxcbiAgICBlcnJvcixcbiAgICBoYW5kbGVHZXRBZ2VudHMsXG4gICAgbG9hZE1vcmVBZ2VudHMsXG4gICAgc2VhcmNoQ3VzdG9tQWdlbnRzLFxuICAgIHNlYXJjaExvYWRpbmcsXG4gICAgYWRkQWdlbnQsXG4gICAgcmVtb3ZlQWdlbnQsXG4gICAgdXBkYXRlQWdlbnQsXG4gICAgdXBkYXRlQWdlbnRGYXZvcml0ZSxcbiAgICBzZWxlY3RGaXJzdEFnZW50LFxuICAgIHNvcnRBZ2VudHNMaXN0LFxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSxRQUFRLEVBQUVDLFdBQVcsRUFBRUMsTUFBTSxRQUFRLE9BQU87QUFDckQsU0FBU0MsY0FBYyxRQUFRLGVBQWU7QUFDOUMsU0FBU0Msa0JBQWtCLFFBQVEsc0RBQXNEO0FBQ3pGLFNBQVNDLFNBQVMsUUFBUSxXQUFXO0FBQ3JDLFNBQVNDLHdCQUF3QixRQUFRLHlDQUF5QztBQUVsRixTQUFTQyxPQUFPLFFBQVEsMkJBQTJCO0FBQ25ELFNBQVNDLDRCQUE0QixRQUFRLHdDQUF3QztBQUVyRixTQUFTQyxVQUFVLFFBQVEscUJBQXFCO0FBRWhELElBQU1DLFdBQVcsR0FBRyxTQUFkQSxXQUFXQSxDQUFJQyxLQUFZO0VBQUEsT0FBSyxDQUFBQSxLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRUMsSUFBSSxNQUFLLGNBQWM7QUFBQTtBQUVwRSxJQUFNQyxvQkFBb0IsR0FBRyxTQUF2QkEsb0JBQW9CQSxDQUFJQyxHQUFZLEVBQWM7RUFBQSxJQUFBQyxlQUFBLEVBQUFDLGNBQUEsRUFBQUMsZUFBQTtFQUN0RCxJQUFNQyxLQUFLLEdBQUdKLEdBQTRFO0VBQzFGLE9BQ0UsQ0FBQUksS0FBSyxhQUFMQSxLQUFLLGdCQUFBSCxlQUFBLEdBQUxHLEtBQUssQ0FBRUMsUUFBUSxjQUFBSixlQUFBLHVCQUFmQSxlQUFBLENBQWlCSyxNQUFNLE1BQUssR0FBRyxJQUMvQixDQUFBRixLQUFLLGFBQUxBLEtBQUssdUJBQUxBLEtBQUssQ0FBRUUsTUFBTSxNQUFLLEdBQUcsSUFDckJDLE9BQU8sQ0FBQ0gsS0FBSyxhQUFMQSxLQUFLLGdCQUFBRixjQUFBLEdBQUxFLEtBQUssQ0FBRUksT0FBTyxjQUFBTixjQUFB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
|