botframework-webchat-component 4.13.0 → 4.14.2
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/.eslintignore +1 -9
- package/.eslintrc.yml +6 -0
- package/lib/Activity/Avatar.d.ts +10 -0
- package/lib/Activity/Avatar.d.ts.map +1 -0
- package/lib/Activity/Avatar.js +2 -1
- package/lib/Activity/Bubble.d.ts +11 -0
- package/lib/Activity/Bubble.d.ts.map +1 -0
- package/lib/Activity/Bubble.js +2 -2
- package/lib/Activity/CarouselFilmStrip.js +20 -30
- package/lib/Activity/CarouselFilmStripAttachment.js +120 -0
- package/lib/Activity/CarouselLayout.js +5 -5
- package/lib/Activity/Speak.d.ts +10 -0
- package/lib/Activity/Speak.d.ts.map +1 -0
- package/lib/Activity/Speak.js +10 -12
- package/lib/Activity/StackedLayout.d.ts +18 -0
- package/lib/Activity/StackedLayout.d.ts.map +1 -0
- package/lib/Activity/StackedLayout.js +18 -14
- package/lib/Assets/TypingAnimation.js +2 -2
- package/lib/Attachment/Assets/DownloadIcon.js +3 -1
- package/lib/Attachment/AudioAttachment.js +2 -2
- package/lib/Attachment/AudioContent.d.ts +11 -0
- package/lib/Attachment/AudioContent.d.ts.map +1 -0
- package/lib/Attachment/AudioContent.js +4 -4
- package/lib/Attachment/FileContent.d.ts +10 -0
- package/lib/Attachment/FileContent.d.ts.map +1 -0
- package/lib/Attachment/FileContent.js +4 -9
- package/lib/Attachment/HTMLVideoContent.d.ts +11 -0
- package/lib/Attachment/HTMLVideoContent.d.ts.map +1 -0
- package/lib/Attachment/HTMLVideoContent.js +2 -2
- package/lib/Attachment/ImageContent.d.ts +8 -0
- package/lib/Attachment/ImageContent.d.ts.map +1 -0
- package/lib/Attachment/ImageContent.js +2 -2
- package/lib/Attachment/TextContent.d.ts +8 -0
- package/lib/Attachment/TextContent.d.ts.map +1 -0
- package/lib/Attachment/TextContent.js +4 -4
- package/lib/Attachment/VideoAttachment.js +2 -2
- package/lib/Attachment/VideoContent.d.ts +11 -0
- package/lib/Attachment/VideoContent.d.ts.map +1 -0
- package/lib/Attachment/VideoContent.js +1 -1
- package/lib/Attachment/VimeoContent.d.ts +10 -0
- package/lib/Attachment/VimeoContent.d.ts.map +1 -0
- package/lib/Attachment/VimeoContent.js +8 -8
- package/lib/Attachment/YouTubeContent.d.ts +10 -0
- package/lib/Attachment/YouTubeContent.d.ts.map +1 -0
- package/lib/Attachment/YouTubeContent.js +5 -5
- package/lib/Avatar/ImageAvatar.js +2 -2
- package/lib/Avatar/InitialsAvatar.js +2 -2
- package/lib/BasicConnectivityStatus.js +2 -2
- package/lib/BasicSendBox.d.ts +9 -0
- package/lib/BasicSendBox.d.ts.map +1 -0
- package/lib/BasicSendBox.js +6 -5
- package/lib/BasicToast.js +4 -4
- package/lib/BasicToaster.js +4 -4
- package/lib/BasicTranscript.js +143 -123
- package/lib/BasicTypingIndicator.d.ts +5 -0
- package/lib/BasicTypingIndicator.d.ts.map +1 -0
- package/lib/BasicTypingIndicator.js +2 -2
- package/lib/BasicWebChat.d.ts +9 -0
- package/lib/BasicWebChat.d.ts.map +1 -0
- package/lib/BasicWebChat.js +6 -4
- package/lib/Composer.d.ts +23 -0
- package/lib/Composer.d.ts.map +1 -0
- package/lib/Composer.js +33 -55
- package/lib/ConnectivityStatus/Assets/ErrorNotificationIcon.js +2 -2
- package/lib/ConnectivityStatus/Assets/SpinnerAnimation.js +2 -2
- package/lib/ConnectivityStatus/Assets/WarningNotificationIcon.js +2 -2
- package/lib/ConnectivityStatus/Connected.js +1 -1
- package/lib/ConnectivityStatus/Connecting.js +4 -4
- package/lib/ConnectivityStatus/FailedToConnect.js +2 -2
- package/lib/ConnectivityStatus/JavaScriptError.js +2 -2
- package/lib/Dictation.js +13 -4
- package/lib/ErrorBox.d.ts +8 -0
- package/lib/ErrorBox.d.ts.map +1 -0
- package/lib/ErrorBox.js +2 -2
- package/lib/Middleware/Activity/createCoreMiddleware.d.ts +3 -0
- package/lib/Middleware/Activity/createCoreMiddleware.d.ts.map +1 -0
- package/lib/Middleware/Activity/createCoreMiddleware.js +1 -1
- package/lib/Middleware/ActivityStatus/AbsoluteTime.js +1 -1
- package/lib/Middleware/ActivityStatus/RelativeTime.js +1 -1
- package/lib/Middleware/ActivityStatus/SendStatus/SendFailedRetry.js +3 -3
- package/lib/Middleware/ActivityStatus/SendStatus/SendStatus.d.ts +11 -0
- package/lib/Middleware/ActivityStatus/SendStatus/SendStatus.d.ts.map +1 -0
- package/lib/Middleware/ActivityStatus/SendStatus/SendStatus.js +4 -4
- package/lib/Middleware/ActivityStatus/Timestamp.d.ts +9 -0
- package/lib/Middleware/ActivityStatus/Timestamp.d.ts.map +1 -0
- package/lib/Middleware/ActivityStatus/Timestamp.js +2 -2
- package/lib/Middleware/ActivityStatus/createCoreMiddleware.d.ts +3 -0
- package/lib/Middleware/ActivityStatus/createCoreMiddleware.d.ts.map +1 -0
- package/lib/Middleware/ActivityStatus/createCoreMiddleware.js +1 -1
- package/lib/Middleware/ActivityStatus/createSendStatusMiddleware.js +5 -3
- package/lib/Middleware/ActivityStatus/createTimestampMiddleware.js +1 -1
- package/lib/Middleware/Attachment/createCoreMiddleware.d.ts +3 -0
- package/lib/Middleware/Attachment/createCoreMiddleware.d.ts.map +1 -0
- package/lib/Middleware/Attachment/createCoreMiddleware.js +9 -9
- package/lib/Middleware/AttachmentForScreenReader/AudioAttachment.js +1 -1
- package/lib/Middleware/AttachmentForScreenReader/FileAttachment.js +1 -1
- package/lib/Middleware/AttachmentForScreenReader/ImageAttachment.js +1 -1
- package/lib/Middleware/AttachmentForScreenReader/TextAttachment.js +1 -1
- package/lib/Middleware/AttachmentForScreenReader/VideoAttachment.js +1 -1
- package/lib/Middleware/AttachmentForScreenReader/createCoreMiddleware.d.ts +3 -0
- package/lib/Middleware/AttachmentForScreenReader/createCoreMiddleware.d.ts.map +1 -0
- package/lib/Middleware/AttachmentForScreenReader/createCoreMiddleware.js +9 -5
- package/lib/Middleware/Avatar/createCoreMiddleware.d.ts +11 -0
- package/lib/Middleware/Avatar/createCoreMiddleware.d.ts.map +1 -0
- package/lib/Middleware/Avatar/createCoreMiddleware.js +2 -2
- package/lib/Middleware/CardAction/createCoreMiddleware.js +2 -2
- package/lib/Middleware/GroupActivities/createCoreMiddleware.js +1 -1
- package/lib/Middleware/ScrollToEndButton/ScrollToEndButton.js +71 -0
- package/lib/Middleware/ScrollToEndButton/createScrollToEndButtonMiddleware.d.ts +3 -0
- package/lib/Middleware/ScrollToEndButton/createScrollToEndButtonMiddleware.d.ts.map +1 -0
- package/lib/Middleware/ScrollToEndButton/createScrollToEndButtonMiddleware.js +27 -0
- package/lib/Middleware/Toast/createCoreMiddleware.d.ts +4 -0
- package/lib/Middleware/Toast/createCoreMiddleware.d.ts.map +1 -0
- package/lib/Middleware/Toast/createCoreMiddleware.js +1 -1
- package/lib/Middleware/TypingIndicator/createCoreMiddleware.d.ts +3 -0
- package/lib/Middleware/TypingIndicator/createCoreMiddleware.d.ts.map +1 -0
- package/lib/Middleware/TypingIndicator/createCoreMiddleware.js +3 -2
- package/lib/ReactWebChat.d.ts +10 -0
- package/lib/ReactWebChat.d.ts.map +1 -0
- package/lib/ReactWebChat.js +19 -7
- package/lib/ScreenReaderActivity.js +64 -45
- package/lib/SendBox/Assets/AttachmentIcon.js +3 -1
- package/lib/SendBox/Assets/MicrophoneIcon.js +3 -1
- package/lib/SendBox/Assets/SendIcon.js +2 -2
- package/lib/SendBox/AutoResizeTextArea.d.ts +23 -0
- package/lib/SendBox/AutoResizeTextArea.d.ts.map +1 -0
- package/lib/SendBox/AutoResizeTextArea.js +6 -6
- package/lib/SendBox/DictationInterims.d.ts +9 -0
- package/lib/SendBox/DictationInterims.d.ts.map +1 -0
- package/lib/SendBox/DictationInterims.js +2 -2
- package/lib/SendBox/IconButton.js +2 -2
- package/lib/SendBox/MicrophoneButton.d.ts +11 -0
- package/lib/SendBox/MicrophoneButton.d.ts.map +1 -0
- package/lib/SendBox/MicrophoneButton.js +25 -24
- package/lib/SendBox/SendButton.d.ts +9 -0
- package/lib/SendBox/SendButton.d.ts.map +1 -0
- package/lib/SendBox/SendButton.js +7 -5
- package/lib/SendBox/SuggestedAction.js +5 -9
- package/lib/SendBox/SuggestedActions.d.ts +5 -0
- package/lib/SendBox/SuggestedActions.d.ts.map +1 -0
- package/lib/SendBox/SuggestedActions.js +10 -7
- package/lib/SendBox/TextBox.d.ts +28 -0
- package/lib/SendBox/TextBox.d.ts.map +1 -0
- package/lib/SendBox/TextBox.js +12 -7
- package/lib/SendBox/UploadButton.d.ts +9 -0
- package/lib/SendBox/UploadButton.d.ts.map +1 -0
- package/lib/SendBox/UploadButton.js +5 -5
- package/lib/Styles/StyleSet/Activities.d.ts +5 -0
- package/lib/Styles/StyleSet/Activities.d.ts.map +1 -0
- package/lib/Styles/StyleSet/AudioAttachment.d.ts +6 -0
- package/lib/Styles/StyleSet/AudioAttachment.d.ts.map +1 -0
- package/lib/Styles/StyleSet/AudioContent.d.ts +4 -0
- package/lib/Styles/StyleSet/AudioContent.d.ts.map +1 -0
- package/lib/Styles/StyleSet/AutoResizeTextArea.d.ts +37 -0
- package/lib/Styles/StyleSet/AutoResizeTextArea.d.ts.map +1 -0
- package/lib/Styles/StyleSet/Avatar.d.ts +9 -0
- package/lib/Styles/StyleSet/Avatar.d.ts.map +1 -0
- package/lib/Styles/StyleSet/BasicTranscript.d.ts +77 -0
- package/lib/Styles/StyleSet/BasicTranscript.d.ts.map +1 -0
- package/lib/Styles/StyleSet/Bubble.d.ts +5 -0
- package/lib/Styles/StyleSet/Bubble.d.ts.map +1 -0
- package/lib/Styles/StyleSet/Bubble.js +1 -1
- package/lib/Styles/StyleSet/CarouselFilmStrip.d.ts +5 -0
- package/lib/Styles/StyleSet/CarouselFilmStrip.d.ts.map +1 -0
- package/lib/Styles/StyleSet/CarouselFilmStrip.js +2 -18
- package/lib/Styles/StyleSet/CarouselFilmStripAttachment.d.ts +3 -0
- package/lib/Styles/StyleSet/CarouselFilmStripAttachment.d.ts.map +1 -0
- package/lib/Styles/StyleSet/CarouselFilmStripAttachment.js +63 -0
- package/lib/Styles/StyleSet/CarouselFlipper.d.ts +27 -0
- package/lib/Styles/StyleSet/CarouselFlipper.d.ts.map +1 -0
- package/lib/Styles/StyleSet/ConnectivityNotification.d.ts +13 -0
- package/lib/Styles/StyleSet/ConnectivityNotification.d.ts.map +1 -0
- package/lib/Styles/StyleSet/DictationInterims.d.ts +13 -0
- package/lib/Styles/StyleSet/DictationInterims.d.ts.map +1 -0
- package/lib/Styles/StyleSet/ErrorBox.d.ts +33 -0
- package/lib/Styles/StyleSet/ErrorBox.d.ts.map +1 -0
- package/lib/Styles/StyleSet/ErrorNotification.d.ts +23 -0
- package/lib/Styles/StyleSet/ErrorNotification.d.ts.map +1 -0
- package/lib/Styles/StyleSet/FileContent.d.ts +32 -0
- package/lib/Styles/StyleSet/FileContent.d.ts.map +1 -0
- package/lib/Styles/StyleSet/ImageAvatar.d.ts +7 -0
- package/lib/Styles/StyleSet/ImageAvatar.d.ts.map +1 -0
- package/lib/Styles/StyleSet/InitialsAvatar.d.ts +19 -0
- package/lib/Styles/StyleSet/InitialsAvatar.d.ts.map +1 -0
- package/lib/Styles/StyleSet/MicrophoneButton.d.ts +13 -0
- package/lib/Styles/StyleSet/MicrophoneButton.d.ts.map +1 -0
- package/lib/Styles/StyleSet/Root.d.ts +8 -0
- package/lib/Styles/StyleSet/Root.d.ts.map +1 -0
- package/lib/Styles/StyleSet/ScrollToEndButton.d.ts +36 -0
- package/lib/Styles/StyleSet/ScrollToEndButton.d.ts.map +1 -0
- package/lib/Styles/StyleSet/ScrollToEndButton.js +36 -34
- package/lib/Styles/StyleSet/SendBox.d.ts +24 -0
- package/lib/Styles/StyleSet/SendBox.d.ts.map +1 -0
- package/lib/Styles/StyleSet/SendBoxButton.d.ts +33 -0
- package/lib/Styles/StyleSet/SendBoxButton.d.ts.map +1 -0
- package/lib/Styles/StyleSet/SendBoxTextBox.d.ts +41 -0
- package/lib/Styles/StyleSet/SendBoxTextBox.d.ts.map +1 -0
- package/lib/Styles/StyleSet/SendStatus.d.ts +8 -0
- package/lib/Styles/StyleSet/SendStatus.d.ts.map +1 -0
- package/lib/Styles/StyleSet/SingleAttachmentActivity.d.ts +11 -0
- package/lib/Styles/StyleSet/SingleAttachmentActivity.d.ts.map +1 -0
- package/lib/Styles/StyleSet/SpinnerAnimation.d.ts +15 -0
- package/lib/Styles/StyleSet/SpinnerAnimation.d.ts.map +1 -0
- package/lib/Styles/StyleSet/StackedLayout.d.ts +63 -0
- package/lib/Styles/StyleSet/StackedLayout.d.ts.map +1 -0
- package/lib/Styles/StyleSet/SuggestedAction.d.ts +49 -0
- package/lib/Styles/StyleSet/SuggestedAction.d.ts.map +1 -0
- package/lib/Styles/StyleSet/SuggestedAction.js +2 -2
- package/lib/Styles/StyleSet/SuggestedActions.d.ts +118 -0
- package/lib/Styles/StyleSet/SuggestedActions.d.ts.map +1 -0
- package/lib/Styles/StyleSet/TextContent.d.ts +28 -0
- package/lib/Styles/StyleSet/TextContent.d.ts.map +1 -0
- package/lib/Styles/StyleSet/Toast.d.ts +65 -0
- package/lib/Styles/StyleSet/Toast.d.ts.map +1 -0
- package/lib/Styles/StyleSet/Toaster.d.ts +111 -0
- package/lib/Styles/StyleSet/Toaster.d.ts.map +1 -0
- package/lib/Styles/StyleSet/TypingAnimation.d.ts +8 -0
- package/lib/Styles/StyleSet/TypingAnimation.d.ts.map +1 -0
- package/lib/Styles/StyleSet/TypingIndicator.d.ts +11 -0
- package/lib/Styles/StyleSet/TypingIndicator.d.ts.map +1 -0
- package/lib/Styles/StyleSet/UploadButton.d.ts +14 -0
- package/lib/Styles/StyleSet/UploadButton.d.ts.map +1 -0
- package/lib/Styles/StyleSet/VideoAttachment.d.ts +2 -0
- package/lib/Styles/StyleSet/VideoAttachment.d.ts.map +1 -0
- package/lib/Styles/StyleSet/VideoContent.d.ts +6 -0
- package/lib/Styles/StyleSet/VideoContent.d.ts.map +1 -0
- package/lib/Styles/StyleSet/VimeoContent.d.ts +7 -0
- package/lib/Styles/StyleSet/VimeoContent.d.ts.map +1 -0
- package/lib/Styles/StyleSet/WarningNotification.d.ts +22 -0
- package/lib/Styles/StyleSet/WarningNotification.d.ts.map +1 -0
- package/lib/Styles/StyleSet/YouTubeContent.d.ts +7 -0
- package/lib/Styles/StyleSet/YouTubeContent.d.ts.map +1 -0
- package/lib/Styles/createStyleSet.d.ts +1103 -0
- package/lib/Styles/createStyleSet.d.ts.map +1 -0
- package/lib/Styles/createStyleSet.js +44 -41
- package/lib/Styles/mirrorStyle.js +2 -2
- package/lib/Toast/CollapseIcon.js +3 -1
- package/lib/Toast/DismissIcon.js +3 -1
- package/lib/Toast/ExpandIcon.js +3 -1
- package/lib/Toast/NotificationIcon.js +1 -1
- package/lib/Toast/createToastMiddleware.d.ts +4 -0
- package/lib/Toast/createToastMiddleware.d.ts.map +1 -0
- package/lib/Toast/createToastMiddleware.js +2 -2
- package/lib/Utils/AccessKeySink/Surface.js +7 -5
- package/lib/Utils/AccessibleButton.js +6 -4
- package/lib/Utils/AccessibleInputText.d.ts +21 -0
- package/lib/Utils/AccessibleInputText.d.ts.map +1 -0
- package/lib/Utils/AccessibleInputText.js +29 -25
- package/lib/Utils/AccessibleTextArea.d.ts +20 -0
- package/lib/Utils/AccessibleTextArea.d.ts.map +1 -0
- package/lib/Utils/AccessibleTextArea.js +35 -24
- package/lib/Utils/CroppedImage.js +2 -2
- package/lib/Utils/Fade.js +2 -2
- package/lib/Utils/FocusRedirector.js +3 -3
- package/lib/Utils/InlineMarkdown.js +6 -6
- package/lib/Utils/TypeFocusSink/FocusBox.js +6 -4
- package/lib/Utils/TypeFocusSink/getTabIndex.d.ts +2 -0
- package/lib/Utils/TypeFocusSink/getTabIndex.d.ts.map +1 -0
- package/lib/Utils/TypeFocusSink/getTabIndex.js +1 -1
- package/lib/Utils/TypeFocusSink/navigableEvent.js +1 -1
- package/lib/Utils/activityAltText.js +100 -0
- package/lib/Utils/addTargetBlankToHyperlinksMarkdown.js +1 -1
- package/lib/Utils/createCustomEvent.js +1 -1
- package/lib/Utils/debounce.js +1 -1
- package/lib/Utils/detectBrowser.js +1 -1
- package/lib/Utils/downscaleImageToDataURL/downscaleImageToDataURLUsingWorker.js +2 -2
- package/lib/Utils/downscaleImageToDataURL/index.js +2 -2
- package/lib/Utils/filterMap.js +1 -1
- package/lib/Utils/findLastIndex.js +2 -2
- package/lib/Utils/mapMap.js +1 -1
- package/lib/Utils/readDataURIToBlob.js +2 -2
- package/lib/Utils/singleToArray.js +1 -1
- package/lib/connectToWebChat.js +5 -3
- package/lib/hooks/index.d.ts +21 -0
- package/lib/hooks/index.d.ts.map +1 -0
- package/lib/hooks/index.js +1 -1
- package/lib/hooks/internal/BypassSpeechSynthesisPonyfill.js +97 -39
- package/lib/hooks/internal/UITracker.js +2 -2
- package/lib/hooks/internal/useAcknowledgedActivity.js +2 -2
- package/lib/hooks/internal/useDispatchScrollPosition.js +1 -1
- package/lib/hooks/internal/useDispatchTranscriptFocus.js +1 -1
- package/lib/hooks/internal/useEnterKeyHint.js +1 -1
- package/lib/hooks/internal/useForceRender.js +2 -2
- package/lib/hooks/internal/useForceRenderAtInterval.js +2 -2
- package/lib/hooks/internal/useInternalRenderMarkdownInline.js +1 -1
- package/lib/hooks/internal/useLocalizeAccessKey.js +2 -2
- package/lib/hooks/internal/useMemoize.js +2 -2
- package/lib/hooks/internal/useNavigatorPlatform.js +1 -1
- package/lib/hooks/internal/useNonce.js +1 -1
- package/lib/hooks/internal/useRegisterFocusSendBox.js +1 -1
- package/lib/hooks/internal/useRegisterFocusTranscript.js +1 -1
- package/lib/hooks/internal/useRegisterScrollRelative.js +1 -1
- package/lib/hooks/internal/useRegisterScrollTo.js +1 -1
- package/lib/hooks/internal/useRegisterScrollToEnd.js +1 -1
- package/lib/hooks/internal/useReplaceEmoticon.js +2 -2
- package/lib/hooks/internal/useResumeAudioContext.js +33 -0
- package/lib/hooks/internal/useScrollRelative.js +1 -1
- package/lib/hooks/internal/useSettableDictateAbortable.js +1 -1
- package/lib/hooks/internal/useSuggestedActionsAccessKey.js +1 -1
- package/lib/hooks/internal/useUniqueId.d.ts +2 -0
- package/lib/hooks/internal/useUniqueId.d.ts.map +1 -0
- package/lib/hooks/internal/useUniqueId.js +1 -1
- package/lib/hooks/useDictateAbortable.d.ts +2 -0
- package/lib/hooks/useDictateAbortable.d.ts.map +1 -0
- package/lib/hooks/useDictateAbortable.js +2 -2
- package/lib/hooks/useFocus.d.ts +2 -0
- package/lib/hooks/useFocus.d.ts.map +1 -0
- package/lib/hooks/useFocus.js +1 -1
- package/lib/hooks/useFocusSendBox.d.ts +3 -0
- package/lib/hooks/useFocusSendBox.d.ts.map +1 -0
- package/lib/hooks/useFocusSendBox.js +2 -1
- package/lib/hooks/useObserveScrollPosition.d.ts +3 -0
- package/lib/hooks/useObserveScrollPosition.d.ts.map +1 -0
- package/lib/hooks/useObserveScrollPosition.js +2 -2
- package/lib/hooks/useObserveTranscriptFocus.d.ts +5 -0
- package/lib/hooks/useObserveTranscriptFocus.d.ts.map +1 -0
- package/lib/hooks/useObserveTranscriptFocus.js +2 -2
- package/lib/hooks/useRenderMarkdownAsHTML.d.ts +5 -0
- package/lib/hooks/useRenderMarkdownAsHTML.d.ts.map +1 -0
- package/lib/hooks/useRenderMarkdownAsHTML.js +2 -2
- package/lib/hooks/useScrollDown.d.ts +4 -0
- package/lib/hooks/useScrollDown.d.ts.map +1 -0
- package/lib/hooks/useScrollDown.js +1 -1
- package/lib/hooks/useScrollTo.d.ts +5 -0
- package/lib/hooks/useScrollTo.d.ts.map +1 -0
- package/lib/hooks/useScrollTo.js +1 -1
- package/lib/hooks/useScrollToEnd.d.ts +2 -0
- package/lib/hooks/useScrollToEnd.d.ts.map +1 -0
- package/lib/hooks/useScrollToEnd.js +1 -1
- package/lib/hooks/useScrollUp.d.ts +4 -0
- package/lib/hooks/useScrollUp.d.ts.map +1 -0
- package/lib/hooks/useScrollUp.js +1 -1
- package/lib/hooks/useSendFiles.d.ts +2 -0
- package/lib/hooks/useSendFiles.d.ts.map +1 -0
- package/lib/hooks/useSendFiles.js +3 -3
- package/lib/hooks/useStyleSet.d.ts +2 -0
- package/lib/hooks/useStyleSet.d.ts.map +1 -0
- package/lib/hooks/useStyleSet.js +1 -1
- package/lib/hooks/useWebSpeechPonyfill.d.ts +3 -0
- package/lib/hooks/useWebSpeechPonyfill.d.ts.map +1 -0
- package/lib/hooks/useWebSpeechPonyfill.js +1 -1
- package/lib/index.d.ts +209 -22
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +19 -19
- package/lib/tsconfig.json +1 -1
- package/lib/types/ScrollPosition.d.ts +6 -0
- package/lib/types/ScrollPosition.d.ts.map +1 -0
- package/lib/types/ScrollPosition.js +2 -0
- package/package.json +38 -38
- package/src/Activity/{Avatar.js → Avatar.tsx} +9 -2
- package/src/Activity/{Bubble.js → Bubble.tsx} +10 -2
- package/src/Activity/CarouselFilmStrip.js +20 -29
- package/src/Activity/CarouselFilmStripAttachment.js +92 -0
- package/src/Activity/{Speak.js → Speak.tsx} +12 -5
- package/src/Activity/{StackedLayout.js → StackedLayout.tsx} +36 -11
- package/src/Attachment/Assets/DownloadIcon.js +8 -1
- package/src/Attachment/{AudioContent.js → AudioContent.tsx} +12 -3
- package/src/Attachment/{FileContent.js → FileContent.tsx} +10 -7
- package/src/Attachment/{HTMLVideoContent.js → HTMLVideoContent.tsx} +10 -2
- package/src/Attachment/{ImageContent.js → ImageContent.tsx} +7 -2
- package/src/Attachment/{TextContent.js → TextContent.tsx} +14 -7
- package/src/Attachment/{VideoContent.js → VideoContent.tsx} +10 -2
- package/src/Attachment/{VimeoContent.js → VimeoContent.tsx} +15 -8
- package/src/Attachment/{YouTubeContent.js → YouTubeContent.tsx} +12 -5
- package/src/{BasicSendBox.js → BasicSendBox.tsx} +9 -5
- package/src/BasicToaster.js +4 -4
- package/src/BasicTranscript.js +114 -98
- package/src/{BasicTypingIndicator.js → BasicTypingIndicator.tsx} +1 -1
- package/src/{BasicWebChat.js → BasicWebChat.tsx} +13 -4
- package/src/{Composer.js → Composer.tsx} +41 -42
- package/src/Dictation.js +13 -4
- package/src/{ErrorBox.js → ErrorBox.tsx} +7 -2
- package/src/Middleware/Activity/{createCoreMiddleware.js → createCoreMiddleware.tsx} +2 -1
- package/src/Middleware/ActivityStatus/SendStatus/{SendStatus.js → SendStatus.tsx} +8 -3
- package/src/Middleware/ActivityStatus/{Timestamp.js → Timestamp.tsx} +8 -2
- package/src/Middleware/ActivityStatus/{createCoreMiddleware.js → createCoreMiddleware.tsx} +3 -1
- package/src/Middleware/ActivityStatus/createSendStatusMiddleware.js +8 -6
- package/src/Middleware/ActivityStatus/createTimestampMiddleware.js +10 -8
- package/src/Middleware/Attachment/{createCoreMiddleware.js → createCoreMiddleware.tsx} +8 -7
- package/src/Middleware/AttachmentForScreenReader/{createCoreMiddleware.js → createCoreMiddleware.tsx} +4 -3
- package/src/Middleware/Avatar/{createCoreMiddleware.js → createCoreMiddleware.tsx} +10 -3
- package/src/Middleware/CardAction/createCoreMiddleware.js +43 -41
- package/src/Middleware/GroupActivities/createCoreMiddleware.js +6 -4
- package/src/Middleware/ScrollToEndButton/ScrollToEndButton.js +45 -0
- package/src/Middleware/ScrollToEndButton/createScrollToEndButtonMiddleware.ts +17 -0
- package/src/Middleware/Toast/{createCoreMiddleware.js → createCoreMiddleware.tsx} +3 -1
- package/src/Middleware/TypingIndicator/{createCoreMiddleware.js → createCoreMiddleware.tsx} +3 -4
- package/src/{ReactWebChat.js → ReactWebChat.tsx} +25 -7
- package/src/ScreenReaderActivity.js +47 -37
- package/src/SendBox/Assets/AttachmentIcon.js +1 -1
- package/src/SendBox/Assets/MicrophoneIcon.js +1 -1
- package/src/SendBox/{AutoResizeTextArea.js → AutoResizeTextArea.tsx} +30 -4
- package/src/SendBox/{DictationInterims.js → DictationInterims.tsx} +6 -2
- package/src/SendBox/{MicrophoneButton.js → MicrophoneButton.tsx} +35 -25
- package/src/SendBox/{SendButton.js → SendButton.tsx} +8 -3
- package/src/SendBox/SuggestedAction.js +1 -15
- package/src/SendBox/{SuggestedActions.js → SuggestedActions.tsx} +42 -21
- package/src/SendBox/{TextBox.js → TextBox.tsx} +21 -7
- package/src/SendBox/{UploadButton.js → UploadButton.tsx} +7 -3
- package/src/Styles/StyleSet/CarouselFilmStrip.ts +0 -20
- package/src/Styles/StyleSet/CarouselFilmStripAttachment.ts +56 -0
- package/src/Styles/StyleSet/ScrollToEndButton.ts +33 -31
- package/src/Styles/StyleSet/SuggestedAction.ts +1 -1
- package/src/Styles/createStyleSet.ts +41 -39
- package/src/Toast/CollapseIcon.js +9 -1
- package/src/Toast/DismissIcon.js +9 -1
- package/src/Toast/ExpandIcon.js +9 -1
- package/src/Toast/{createToastMiddleware.js → createToastMiddleware.tsx} +3 -2
- package/src/Utils/{AccessibleInputText.js → AccessibleInputText.tsx} +48 -5
- package/src/Utils/{AccessibleTextArea.js → AccessibleTextArea.tsx} +67 -6
- package/src/Utils/TypeFocusSink/FocusBox.js +4 -4
- package/src/Utils/TypeFocusSink/getTabIndex.ts +1 -1
- package/src/Utils/activityAltText.ts +135 -0
- package/src/Utils/findLastIndex.spec.js +2 -0
- package/src/Utils/intersectionOf.spec.js +2 -0
- package/src/Utils/mapMap.spec.js +2 -0
- package/src/Utils/removeInline.spec.js +2 -0
- package/src/Utils/{singleToArray.js → singleToArray.ts} +1 -1
- package/src/Utils/walkMarkdownTokens.spec.js +3 -3
- package/src/hooks/{index.js → index.ts} +1 -0
- package/src/hooks/internal/BypassSpeechSynthesisPonyfill.js +68 -17
- package/src/hooks/internal/useMemoize.spec.js +2 -0
- package/src/hooks/internal/useResumeAudioContext.ts +7 -0
- package/src/hooks/internal/useScrollRelative.js +4 -3
- package/src/hooks/internal/{useUniqueId.js → useUniqueId.ts} +1 -1
- package/src/hooks/{useDictateAbortable.js → useDictateAbortable.ts} +1 -1
- package/src/hooks/{useFocus.js → useFocus.ts} +1 -1
- package/src/hooks/{useFocusSendBox.js → useFocusSendBox.ts} +2 -1
- package/src/hooks/{useObserveScrollPosition.js → useObserveScrollPosition.ts} +6 -1
- package/src/hooks/{useObserveTranscriptFocus.js → useObserveTranscriptFocus.ts} +6 -1
- package/src/hooks/{useRenderMarkdownAsHTML.js → useRenderMarkdownAsHTML.ts} +6 -2
- package/src/hooks/{useScrollDown.js → useScrollDown.ts} +1 -1
- package/src/hooks/{useScrollTo.js → useScrollTo.ts} +5 -1
- package/src/hooks/{useScrollToEnd.js → useScrollToEnd.ts} +1 -1
- package/src/hooks/{useScrollUp.js → useScrollUp.ts} +1 -1
- package/src/hooks/{useSendFiles.js → useSendFiles.ts} +3 -2
- package/src/hooks/{useStyleSet.js → useStyleSet.ts} +1 -1
- package/src/hooks/useWebSpeechPonyfill.ts +7 -0
- package/src/index.ts +7 -11
- package/src/tsconfig.json +1 -1
- package/src/types/ScrollPosition.ts +6 -0
- package/lib/Activity/ScrollToEndButton.js +0 -81
- package/lib/Attachment/Assets/ErrorIcon.js +0 -22
- package/lib/Utils/remarkStripMarkdown.js +0 -26
- package/lib/hooks/internal/useStripMarkdown.js +0 -19
- package/src/Activity/ScrollToEndButton.js +0 -58
- package/src/Attachment/Assets/ErrorIcon.js +0 -9
- package/src/Utils/remarkStripMarkdown.js +0 -13
- package/src/hooks/internal/useStripMarkdown.js +0 -7
- package/src/hooks/useWebSpeechPonyfill.js +0 -5
- package/src/index.tsx +0 -35
package/lib/BasicTranscript.js
CHANGED
|
@@ -41,8 +41,6 @@ var _ScreenReaderActivity = _interopRequireDefault(require("./ScreenReaderActivi
|
|
|
41
41
|
|
|
42
42
|
var _ScreenReaderText = _interopRequireDefault(require("./ScreenReaderText"));
|
|
43
43
|
|
|
44
|
-
var _ScrollToEndButton = _interopRequireDefault(require("./Activity/ScrollToEndButton"));
|
|
45
|
-
|
|
46
44
|
var _Speak = _interopRequireDefault(require("./Activity/Speak"));
|
|
47
45
|
|
|
48
46
|
var _tabbableElements = _interopRequireDefault(require("./Utils/tabbableElements"));
|
|
@@ -71,13 +69,13 @@ var _useStyleToEmotionObject = _interopRequireDefault(require("./hooks/internal/
|
|
|
71
69
|
|
|
72
70
|
var _useUniqueId = _interopRequireDefault(require("./hooks/internal/useUniqueId"));
|
|
73
71
|
|
|
74
|
-
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var
|
|
72
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
75
73
|
|
|
76
|
-
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
74
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
77
75
|
|
|
78
76
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
79
77
|
|
|
80
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
78
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
81
79
|
|
|
82
80
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
83
81
|
|
|
@@ -87,7 +85,7 @@ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableTo
|
|
|
87
85
|
|
|
88
86
|
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
89
87
|
|
|
90
|
-
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator
|
|
88
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
91
89
|
|
|
92
90
|
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
93
91
|
|
|
@@ -99,7 +97,7 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
|
|
|
99
97
|
|
|
100
98
|
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
101
99
|
|
|
102
|
-
function _iterableToArrayLimit(arr, i) {
|
|
100
|
+
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
103
101
|
|
|
104
102
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
105
103
|
|
|
@@ -107,6 +105,7 @@ var useActivities = _botframeworkWebchatApi.hooks.useActivities,
|
|
|
107
105
|
useCreateActivityRenderer = _botframeworkWebchatApi.hooks.useCreateActivityRenderer,
|
|
108
106
|
useCreateActivityStatusRenderer = _botframeworkWebchatApi.hooks.useCreateActivityStatusRenderer,
|
|
109
107
|
useCreateAvatarRenderer = _botframeworkWebchatApi.hooks.useCreateAvatarRenderer,
|
|
108
|
+
useCreateScrollToEndButtonRenderer = _botframeworkWebchatApi.hooks.useCreateScrollToEndButtonRenderer,
|
|
110
109
|
useDirection = _botframeworkWebchatApi.hooks.useDirection,
|
|
111
110
|
useGroupActivities = _botframeworkWebchatApi.hooks.useGroupActivities,
|
|
112
111
|
useLocalizer = _botframeworkWebchatApi.hooks.useLocalizer,
|
|
@@ -318,6 +317,8 @@ var InternalTranscript = function InternalTranscript(_ref) {
|
|
|
318
317
|
var firstInSenderGroup = !indexWithinSenderGroup;
|
|
319
318
|
var lastInSenderGroup = indexWithinSenderGroup === activitiesWithSameSender.length - 1;
|
|
320
319
|
activitiesWithSameSenderAndStatus.forEach(function (activity, indexWithinSenderAndStatusGroup) {
|
|
320
|
+
var _activity$channelData, _activity$channelData2, _activity$channelData3, _activity$channelData4, _activity$channelData5;
|
|
321
|
+
|
|
321
322
|
// We only show the timestamp at the end of the sender group. But we always show the "Send failed, retry" prompt.
|
|
322
323
|
var renderActivityStatus = createActivityStatusRenderer({
|
|
323
324
|
activity: activity
|
|
@@ -331,13 +332,10 @@ var InternalTranscript = function InternalTranscript(_ref) {
|
|
|
331
332
|
renderActivity = _activitiesWithRender.renderActivity;
|
|
332
333
|
|
|
333
334
|
var key = (0, _getActivityUniqueId.default)(activity) || renderingElements.length;
|
|
334
|
-
var _activity$channelData = activity.channelData;
|
|
335
|
-
|
|
336
|
-
var _activity$
|
|
337
|
-
|
|
338
|
-
var messageBackDisplayText = _activity$channelData2.displayText,
|
|
339
|
-
role = activity.from.role,
|
|
340
|
-
text = activity.text;
|
|
335
|
+
var baseAltText = typeof (activity === null || activity === void 0 ? void 0 : (_activity$channelData = activity.channelData) === null || _activity$channelData === void 0 ? void 0 : _activity$channelData['webchat:fallback-text']) === 'string' ? activity === null || activity === void 0 ? void 0 : (_activity$channelData2 = activity.channelData) === null || _activity$channelData2 === void 0 ? void 0 : _activity$channelData2['webchat:fallback-text'] : (activity === null || activity === void 0 ? void 0 : (_activity$channelData3 = activity.channelData) === null || _activity$channelData3 === void 0 ? void 0 : (_activity$channelData4 = _activity$channelData3.messageBack) === null || _activity$channelData4 === void 0 ? void 0 : _activity$channelData4.displayText) || activity.text; // If "webchat:fallback-text" field is set to empty string, the activity must not be narrated.
|
|
336
|
+
|
|
337
|
+
var supportScreenReader = (activity === null || activity === void 0 ? void 0 : (_activity$channelData5 = activity.channelData) === null || _activity$channelData5 === void 0 ? void 0 : _activity$channelData5['webchat:fallback-text']) !== '';
|
|
338
|
+
var role = activity.from.role;
|
|
341
339
|
var topSideNub = role === 'user' ? topSideUserNub : topSideBotNub;
|
|
342
340
|
var showCallout; // Depending on the "showAvatarInGroup" setting, the avatar will render in different positions.
|
|
343
341
|
|
|
@@ -408,15 +406,16 @@ var InternalTranscript = function InternalTranscript(_ref) {
|
|
|
408
406
|
// retry prompt. And show the screen reader version of the timestamp.
|
|
409
407
|
hideTimestamp: hideAllTimestamps || indexWithinSenderAndStatusGroup !== activitiesWithSameSenderAndStatus.length - 1,
|
|
410
408
|
key: key,
|
|
411
|
-
// When "liveRegionKey" changes, it will show up in the live region momentarily.
|
|
412
|
-
liveRegionKey: key + '|' +
|
|
409
|
+
// When "liveRegionKey" changes or contents that made up the alt text changed, it will show up in the live region momentarily.
|
|
410
|
+
liveRegionKey: key + '|' + baseAltText,
|
|
413
411
|
renderActivity: renderActivity,
|
|
414
412
|
renderActivityStatus: renderActivityStatus,
|
|
415
413
|
renderAvatar: renderAvatar,
|
|
416
414
|
role: role,
|
|
417
415
|
// TODO: [P2] #2858 We should use core/definitions/speakingActivity for this predicate instead
|
|
418
416
|
shouldSpeak: activity.channelData && activity.channelData.speak,
|
|
419
|
-
showCallout: showCallout
|
|
417
|
+
showCallout: showCallout,
|
|
418
|
+
supportScreenReader: supportScreenReader
|
|
420
419
|
});
|
|
421
420
|
});
|
|
422
421
|
});
|
|
@@ -509,6 +508,11 @@ var InternalTranscript = function InternalTranscript(_ref) {
|
|
|
509
508
|
}
|
|
510
509
|
}
|
|
511
510
|
}, [activityElementsRef, rootElementRef, scrollToBottomScrollTo]);
|
|
511
|
+
var scrollToEnd = (0, _react.useCallback)(function () {
|
|
512
|
+
return scrollToBottomScrollToEnd({
|
|
513
|
+
behavior: 'smooth'
|
|
514
|
+
});
|
|
515
|
+
}, [scrollToBottomScrollToEnd]);
|
|
512
516
|
var scrollRelative = (0, _react.useCallback)(function (direction) {
|
|
513
517
|
var _ref10 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
|
|
514
518
|
displacement = _ref10.displacement;
|
|
@@ -537,7 +541,7 @@ var InternalTranscript = function InternalTranscript(_ref) {
|
|
|
537
541
|
// We call `useRegisterScrollXXX` to register a callback function, the `useScrollXXX` will multiplex the call into each instance of <BasicTranscript>.
|
|
538
542
|
|
|
539
543
|
(0, _useRegisterScrollTo.default)(scrollTo);
|
|
540
|
-
(0, _useRegisterScrollToEnd.default)(
|
|
544
|
+
(0, _useRegisterScrollToEnd.default)(scrollToEnd);
|
|
541
545
|
(0, _useRegisterScrollRelative.default)(scrollRelative);
|
|
542
546
|
var dispatchScrollPosition = (0, _useDispatchScrollPosition.default)();
|
|
543
547
|
var patchedDispatchScrollPosition = (0, _react.useMemo)(function () {
|
|
@@ -824,9 +828,12 @@ var InternalTranscript = function InternalTranscript(_ref) {
|
|
|
824
828
|
"aria-relevant": "additions",
|
|
825
829
|
"aria-roledescription": transcriptRoleDescription,
|
|
826
830
|
role: "log"
|
|
827
|
-
}, renderingElements.
|
|
828
|
-
var
|
|
829
|
-
|
|
831
|
+
}, renderingElements.filter(function (_ref23) {
|
|
832
|
+
var supportScreenReader = _ref23.supportScreenReader;
|
|
833
|
+
return supportScreenReader;
|
|
834
|
+
}).map(function (_ref24) {
|
|
835
|
+
var activity = _ref24.activity,
|
|
836
|
+
liveRegionKey = _ref24.liveRegionKey;
|
|
830
837
|
return /*#__PURE__*/_react.default.createElement(_Fade.default, {
|
|
831
838
|
fadeAfter: internalLiveRegionFadeAfter,
|
|
832
839
|
key: liveRegionKey
|
|
@@ -840,27 +847,28 @@ var InternalTranscript = function InternalTranscript(_ref) {
|
|
|
840
847
|
onFocusActivity: handleFocusActivity,
|
|
841
848
|
onFocusFiller: handleFocusFiller,
|
|
842
849
|
terminatorRef: terminatorRef
|
|
843
|
-
}, renderingElements.map(function (
|
|
844
|
-
var activity =
|
|
845
|
-
callbackRef =
|
|
846
|
-
focusActivity =
|
|
847
|
-
handleFocus =
|
|
848
|
-
handleKeyDown =
|
|
849
|
-
handleMouseDownCapture =
|
|
850
|
-
hideTimestamp =
|
|
851
|
-
key =
|
|
852
|
-
renderActivity =
|
|
853
|
-
renderActivityStatus =
|
|
854
|
-
renderAvatar =
|
|
855
|
-
role =
|
|
856
|
-
shouldSpeak =
|
|
857
|
-
showCallout =
|
|
858
|
-
|
|
859
|
-
|
|
850
|
+
}, renderingElements.map(function (_ref25, index) {
|
|
851
|
+
var activity = _ref25.activity,
|
|
852
|
+
callbackRef = _ref25.callbackRef,
|
|
853
|
+
focusActivity = _ref25.focusActivity,
|
|
854
|
+
handleFocus = _ref25.handleFocus,
|
|
855
|
+
handleKeyDown = _ref25.handleKeyDown,
|
|
856
|
+
handleMouseDownCapture = _ref25.handleMouseDownCapture,
|
|
857
|
+
hideTimestamp = _ref25.hideTimestamp,
|
|
858
|
+
key = _ref25.key,
|
|
859
|
+
renderActivity = _ref25.renderActivity,
|
|
860
|
+
renderActivityStatus = _ref25.renderActivityStatus,
|
|
861
|
+
renderAvatar = _ref25.renderAvatar,
|
|
862
|
+
role = _ref25.role,
|
|
863
|
+
shouldSpeak = _ref25.shouldSpeak,
|
|
864
|
+
showCallout = _ref25.showCallout,
|
|
865
|
+
supportScreenReader = _ref25.supportScreenReader;
|
|
866
|
+
|
|
867
|
+
var _ref26 = activityElementsRef.current.find(function (entry) {
|
|
860
868
|
return entry.activity === activity;
|
|
861
869
|
}) || {},
|
|
862
|
-
ariaLabelID =
|
|
863
|
-
element =
|
|
870
|
+
ariaLabelID = _ref26.ariaLabelID,
|
|
871
|
+
element = _ref26.element;
|
|
864
872
|
|
|
865
873
|
var activeDescendant = focusedActivityKey === key;
|
|
866
874
|
var isContentInteractive = !!(element ? (0, _tabbableElements.default)(element.querySelector('.webchat__basic-transcript__activity-box')).length : 0);
|
|
@@ -880,7 +888,7 @@ var InternalTranscript = function InternalTranscript(_ref) {
|
|
|
880
888
|
onKeyDown: handleKeyDown,
|
|
881
889
|
onMouseDownCapture: handleMouseDownCapture,
|
|
882
890
|
ref: callbackRef
|
|
883
|
-
}, /*#__PURE__*/_react.default.createElement(_ScreenReaderActivity.default, {
|
|
891
|
+
}, supportScreenReader && /*#__PURE__*/_react.default.createElement(_ScreenReaderActivity.default, {
|
|
884
892
|
activity: activity,
|
|
885
893
|
id: ariaLabelID,
|
|
886
894
|
renderAttachments: false
|
|
@@ -934,8 +942,8 @@ InternalTranscript.propTypes = {
|
|
|
934
942
|
className: _propTypes.default.string
|
|
935
943
|
};
|
|
936
944
|
|
|
937
|
-
var InternalScreenReaderTranscript = function InternalScreenReaderTranscript(
|
|
938
|
-
var renderingElements =
|
|
945
|
+
var InternalScreenReaderTranscript = function InternalScreenReaderTranscript(_ref27) {
|
|
946
|
+
var renderingElements = _ref27.renderingElements;
|
|
939
947
|
var localize = useLocalizer();
|
|
940
948
|
|
|
941
949
|
var _useStyleOptions3 = useStyleOptions(),
|
|
@@ -949,9 +957,9 @@ var InternalScreenReaderTranscript = function InternalScreenReaderTranscript(_re
|
|
|
949
957
|
"aria-relevant": "additions",
|
|
950
958
|
"aria-roledescription": transcriptRoleDescription,
|
|
951
959
|
role: "log"
|
|
952
|
-
}, renderingElements.map(function (
|
|
953
|
-
var activity =
|
|
954
|
-
liveRegionKey =
|
|
960
|
+
}, renderingElements.map(function (_ref28) {
|
|
961
|
+
var activity = _ref28.activity,
|
|
962
|
+
liveRegionKey = _ref28.liveRegionKey;
|
|
955
963
|
return /*#__PURE__*/_react.default.createElement(_Fade.default, {
|
|
956
964
|
fadeAfter: internalLiveRegionFadeAfter,
|
|
957
965
|
key: liveRegionKey
|
|
@@ -970,40 +978,46 @@ InternalScreenReaderTranscript.propTypes = {
|
|
|
970
978
|
})).isRequired
|
|
971
979
|
}; // Separating high-frequency hooks to improve performance.
|
|
972
980
|
|
|
973
|
-
var InternalTranscriptScrollable = function InternalTranscriptScrollable(
|
|
974
|
-
var activities =
|
|
975
|
-
children =
|
|
976
|
-
onFocusActivity =
|
|
977
|
-
onFocusFiller =
|
|
978
|
-
terminatorRef =
|
|
981
|
+
var InternalTranscriptScrollable = function InternalTranscriptScrollable(_ref29) {
|
|
982
|
+
var activities = _ref29.activities,
|
|
983
|
+
children = _ref29.children,
|
|
984
|
+
onFocusActivity = _ref29.onFocusActivity,
|
|
985
|
+
onFocusFiller = _ref29.onFocusFiller,
|
|
986
|
+
terminatorRef = _ref29.terminatorRef;
|
|
979
987
|
|
|
980
988
|
var _useStyleSet3 = (0, _useStyleSet5.default)(),
|
|
981
989
|
_useStyleSet4 = _slicedToArray(_useStyleSet3, 1),
|
|
982
990
|
activitiesStyleSet = _useStyleSet4[0].activities;
|
|
983
991
|
|
|
984
|
-
var _useStyleOptions5 = useStyleOptions(),
|
|
985
|
-
_useStyleOptions6 = _slicedToArray(_useStyleOptions5, 1),
|
|
986
|
-
hideScrollToEndButton = _useStyleOptions6[0].hideScrollToEndButton;
|
|
987
|
-
|
|
988
992
|
var _useAnimatingToEnd = (0, _reactScrollToBottom.useAnimatingToEnd)(),
|
|
989
993
|
_useAnimatingToEnd2 = _slicedToArray(_useAnimatingToEnd, 1),
|
|
990
994
|
animatingToEnd = _useAnimatingToEnd2[0];
|
|
991
995
|
|
|
996
|
+
var _useAtEnd = (0, _reactScrollToBottom.useAtEnd)(),
|
|
997
|
+
_useAtEnd2 = _slicedToArray(_useAtEnd, 1),
|
|
998
|
+
atEnd = _useAtEnd2[0];
|
|
999
|
+
|
|
992
1000
|
var _useSticky = (0, _reactScrollToBottom.useSticky)(),
|
|
993
1001
|
_useSticky2 = _slicedToArray(_useSticky, 1),
|
|
994
1002
|
sticky = _useSticky2[0];
|
|
995
1003
|
|
|
1004
|
+
var _useStyleOptions5 = useStyleOptions(),
|
|
1005
|
+
_useStyleOptions6 = _slicedToArray(_useStyleOptions5, 1),
|
|
1006
|
+
styleOptions = _useStyleOptions6[0];
|
|
1007
|
+
|
|
996
1008
|
var lastVisibleActivityId = (0, _getActivityUniqueId.default)(activities[activities.length - 1] || {}); // Activity ID of the last visible activity in the list.
|
|
997
1009
|
|
|
998
1010
|
var localize = useLocalizer();
|
|
999
|
-
var
|
|
1011
|
+
var scrollToEnd = (0, _reactScrollToBottom.useScrollToEnd)();
|
|
1000
1012
|
var lastReadActivityIdRef = (0, _react.useRef)(lastVisibleActivityId);
|
|
1001
1013
|
var transcriptRoleDescription = localize('TRANSCRIPT_ARIA_ROLE_ALT');
|
|
1002
|
-
var allActivitiesRead = lastVisibleActivityId === lastReadActivityIdRef.current;
|
|
1003
1014
|
var handleScrollToEndButtonClick = (0, _react.useCallback)(function () {
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1015
|
+
scrollToEnd({
|
|
1016
|
+
behavior: 'smooth'
|
|
1017
|
+
}); // After the "New message" button is clicked, focus on the first unread activity.
|
|
1018
|
+
|
|
1019
|
+
var index = activities.findIndex(function (_ref30) {
|
|
1020
|
+
var id = _ref30.id;
|
|
1007
1021
|
return id === lastReadActivityIdRef.current;
|
|
1008
1022
|
});
|
|
1009
1023
|
|
|
@@ -1017,46 +1031,26 @@ var InternalTranscriptScrollable = function InternalTranscriptScrollable(_ref28)
|
|
|
1017
1031
|
|
|
1018
1032
|
var current = terminatorRef.current;
|
|
1019
1033
|
current && current.focus();
|
|
1020
|
-
}, [activities, lastReadActivityIdRef, onFocusActivity, terminatorRef]);
|
|
1034
|
+
}, [activities, lastReadActivityIdRef, onFocusActivity, scrollToEnd, terminatorRef]);
|
|
1021
1035
|
|
|
1022
|
-
if (sticky) {
|
|
1023
|
-
// If it is sticky, the user is at the bottom of the transcript, everything is read.
|
|
1036
|
+
if (atEnd || sticky) {
|
|
1037
|
+
// If it is sticky or at the end, the user is at the bottom of the transcript, everything is read.
|
|
1024
1038
|
// So mark the activity ID as read.
|
|
1025
1039
|
lastReadActivityIdRef.current = lastVisibleActivityId;
|
|
1026
|
-
}
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
var renderSeparatorAfterIndex = (0, _react.useMemo)(function () {
|
|
1030
|
-
// Don't show the button if:
|
|
1031
|
-
// - All activities have been read
|
|
1032
|
-
// - Currently animating towards bottom
|
|
1033
|
-
// - "New messages" button must not flash when: 1. Type "help", 2. Scroll to top, 3. Type "help" again, 4. Expect the "New messages" button not flashy
|
|
1034
|
-
// - Hidden by style options
|
|
1035
|
-
// - It is already at the bottom (sticky)
|
|
1036
|
-
// Any changes to this logic, verify:
|
|
1037
|
-
// - "New messages" button should persist while programmatically scrolling to mid-point of the transcript:
|
|
1038
|
-
// 1. Type "help"
|
|
1039
|
-
// 2. Type "proactive", then immediately scroll to top
|
|
1040
|
-
// Expect: the "New messages" button should appear
|
|
1041
|
-
// 3. Run hook "useScrollTo({ scrollTop: 500 })"
|
|
1042
|
-
// Expect: when the scroll is animating to 500px, the "New messages" button should kept on the screen
|
|
1043
|
-
// - "New messages" button must not flashy:
|
|
1044
|
-
// 1. Type "help"
|
|
1045
|
-
// 2. Scroll to top
|
|
1046
|
-
// Expect: no "New messages" button is shown
|
|
1047
|
-
// 3. Type "help" again
|
|
1048
|
-
// Expect: "New messages" button must not flash-appear
|
|
1049
|
-
if (allActivitiesRead || animatingToEnd || hideScrollToEndButton || sticky) {
|
|
1050
|
-
return -1;
|
|
1051
|
-
}
|
|
1040
|
+
}
|
|
1052
1041
|
|
|
1053
|
-
|
|
1042
|
+
var ScrollToEndButton = useCreateScrollToEndButtonRenderer()({
|
|
1043
|
+
atEnd: animatingToEnd || atEnd || sticky,
|
|
1044
|
+
styleOptions: styleOptions,
|
|
1045
|
+
// Unread means:
|
|
1046
|
+
// 1. Last read is not the last one in the transcript, and;
|
|
1047
|
+
// 2. Last read is still in the transcript.
|
|
1048
|
+
unread: lastVisibleActivityId !== lastReadActivityIdRef.current && !!~activities.findIndex(function (activity) {
|
|
1054
1049
|
return (0, _getActivityUniqueId.default)(activity) === lastReadActivityIdRef.current;
|
|
1055
|
-
})
|
|
1056
|
-
}
|
|
1057
|
-
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null,
|
|
1058
|
-
onClick: handleScrollToEndButtonClick
|
|
1059
|
-
ref: scrollToEndButtonRef
|
|
1050
|
+
})
|
|
1051
|
+
});
|
|
1052
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, ScrollToEndButton && /*#__PURE__*/_react.default.createElement(ScrollToEndButton, {
|
|
1053
|
+
onClick: handleScrollToEndButtonClick
|
|
1060
1054
|
}), !!_react.default.Children.count(children) && /*#__PURE__*/_react.default.createElement(_FocusRedirector.default, {
|
|
1061
1055
|
className: "webchat__basic-transcript__sentinel",
|
|
1062
1056
|
redirectRef: terminatorRef
|
|
@@ -1081,9 +1075,9 @@ InternalTranscriptScrollable.propTypes = {
|
|
|
1081
1075
|
terminatorRef: _propTypes.default.any.isRequired
|
|
1082
1076
|
};
|
|
1083
1077
|
|
|
1084
|
-
var SetScroller = function SetScroller(
|
|
1085
|
-
var activityElementsRef =
|
|
1086
|
-
scrollerRef =
|
|
1078
|
+
var SetScroller = function SetScroller(_ref31) {
|
|
1079
|
+
var activityElementsRef = _ref31.activityElementsRef,
|
|
1080
|
+
scrollerRef = _ref31.scrollerRef;
|
|
1087
1081
|
|
|
1088
1082
|
var _useStyleOptions7 = useStyleOptions(),
|
|
1089
1083
|
_useStyleOptions8 = _slicedToArray(_useStyleOptions7, 1),
|
|
@@ -1093,45 +1087,71 @@ var SetScroller = function SetScroller(_ref30) {
|
|
|
1093
1087
|
autoScrollSnapOnPage = _useStyleOptions8$.autoScrollSnapOnPage,
|
|
1094
1088
|
autoScrollSnapOnPageOffset = _useStyleOptions8$.autoScrollSnapOnPageOffset;
|
|
1095
1089
|
|
|
1090
|
+
var _useActivities3 = useActivities(),
|
|
1091
|
+
_useActivities4 = _slicedToArray(_useActivities3, 1),
|
|
1092
|
+
activities = _useActivities4[0];
|
|
1093
|
+
|
|
1096
1094
|
var _useAcknowledgedActiv3 = (0, _useAcknowledgedActivity.default)(),
|
|
1097
1095
|
_useAcknowledgedActiv4 = _slicedToArray(_useAcknowledgedActiv3, 1),
|
|
1098
1096
|
lastAcknowledgedActivity = _useAcknowledgedActiv4[0];
|
|
1099
1097
|
|
|
1098
|
+
var activitiesRef = (0, _react.useRef)(activities);
|
|
1100
1099
|
var lastAcknowledgedActivityRef = (0, _react.useRef)(lastAcknowledgedActivity);
|
|
1100
|
+
activitiesRef.current = activities;
|
|
1101
1101
|
lastAcknowledgedActivityRef.current = lastAcknowledgedActivity;
|
|
1102
|
-
scrollerRef.current = (0, _react.useCallback)(function (
|
|
1103
|
-
var offsetHeight =
|
|
1104
|
-
scrollTop =
|
|
1102
|
+
scrollerRef.current = (0, _react.useCallback)(function (_ref32) {
|
|
1103
|
+
var offsetHeight = _ref32.offsetHeight,
|
|
1104
|
+
scrollTop = _ref32.scrollTop;
|
|
1105
1105
|
var patchedAutoScrollSnapOnActivity = typeof autoScrollSnapOnActivity === 'number' ? Math.max(0, autoScrollSnapOnActivity) : autoScrollSnapOnActivity ? 1 : 0;
|
|
1106
1106
|
var patchedAutoScrollSnapOnPage = typeof autoScrollSnapOnPage === 'number' ? Math.max(0, Math.min(1, autoScrollSnapOnPage)) : autoScrollSnapOnPage ? 1 : 0;
|
|
1107
1107
|
var patchedAutoScrollSnapOnActivityOffset = typeof autoScrollSnapOnActivityOffset === 'number' ? autoScrollSnapOnActivityOffset : 0;
|
|
1108
1108
|
var patchedAutoScrollSnapOnPageOffset = typeof autoScrollSnapOnPageOffset === 'number' ? autoScrollSnapOnPageOffset : 0;
|
|
1109
1109
|
|
|
1110
1110
|
if (patchedAutoScrollSnapOnActivity || patchedAutoScrollSnapOnPage) {
|
|
1111
|
+
var _activities = activitiesRef.current;
|
|
1112
|
+
var activityElements = activityElementsRef.current;
|
|
1111
1113
|
var _lastAcknowledgedActivity = lastAcknowledgedActivityRef.current;
|
|
1112
1114
|
var values = [];
|
|
1113
1115
|
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1116
|
+
var lastAcknowledgedActivityIndex = _activities.indexOf(_lastAcknowledgedActivity);
|
|
1117
|
+
|
|
1118
|
+
if (~lastAcknowledgedActivityIndex) {
|
|
1119
|
+
// The activity that we acknowledged could be not rendered, such as post back activity.
|
|
1120
|
+
// When calculating scroll snap, we can only base on the first unacknowledged-and-rendering activity.
|
|
1121
|
+
var firstUnacknowledgedActivityElementIndex = -1;
|
|
1122
|
+
|
|
1123
|
+
var _loop2 = function _loop2(index, length) {
|
|
1124
|
+
var activity = _activities[index];
|
|
1125
|
+
var activityElementIndex = activityElements.findIndex(function (entry) {
|
|
1126
|
+
return entry.activity === activity;
|
|
1127
|
+
});
|
|
1128
|
+
|
|
1129
|
+
if (~activityElementIndex) {
|
|
1130
|
+
firstUnacknowledgedActivityElementIndex = activityElementIndex;
|
|
1131
|
+
return "break";
|
|
1132
|
+
}
|
|
1133
|
+
};
|
|
1134
|
+
|
|
1135
|
+
for (var index = lastAcknowledgedActivityIndex + 1, length = _activities.length; index < length; index++) {
|
|
1136
|
+
var _ret = _loop2(index, length);
|
|
1120
1137
|
|
|
1121
|
-
|
|
1122
|
-
values.push(nthUnacknowledgedActivityElement.offsetTop + nthUnacknowledgedActivityElement.offsetHeight - offsetHeight - scrollTop + patchedAutoScrollSnapOnActivityOffset);
|
|
1138
|
+
if (_ret === "break") break;
|
|
1123
1139
|
}
|
|
1124
|
-
}
|
|
1125
1140
|
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
}) + 1] || {},
|
|
1131
|
-
firstUnacknowledgedActivityElement = _ref34.element;
|
|
1141
|
+
if (~firstUnacknowledgedActivityElementIndex) {
|
|
1142
|
+
if (patchedAutoScrollSnapOnActivity) {
|
|
1143
|
+
// Gets the activity element which we should snap to.
|
|
1144
|
+
var nthUnacknowledgedActivityElement = activityElements[firstUnacknowledgedActivityElementIndex + patchedAutoScrollSnapOnActivity - 1].element;
|
|
1132
1145
|
|
|
1133
|
-
|
|
1134
|
-
|
|
1146
|
+
if (nthUnacknowledgedActivityElement) {
|
|
1147
|
+
values.push(nthUnacknowledgedActivityElement.offsetTop + nthUnacknowledgedActivityElement.offsetHeight - offsetHeight - scrollTop + patchedAutoScrollSnapOnActivityOffset);
|
|
1148
|
+
}
|
|
1149
|
+
}
|
|
1150
|
+
|
|
1151
|
+
if (patchedAutoScrollSnapOnPage) {
|
|
1152
|
+
var firstUnacknowledgedActivityElement = activityElements[firstUnacknowledgedActivityElementIndex].element;
|
|
1153
|
+
values.push(firstUnacknowledgedActivityElement.offsetTop - scrollTop - offsetHeight * (1 - patchedAutoScrollSnapOnPage) + patchedAutoScrollSnapOnPageOffset);
|
|
1154
|
+
}
|
|
1135
1155
|
}
|
|
1136
1156
|
}
|
|
1137
1157
|
|
|
@@ -1141,12 +1161,12 @@ var SetScroller = function SetScroller(_ref30) {
|
|
|
1141
1161
|
}
|
|
1142
1162
|
|
|
1143
1163
|
return Infinity;
|
|
1144
|
-
}, [activityElementsRef, autoScrollSnapOnActivity, autoScrollSnapOnActivityOffset, autoScrollSnapOnPage, autoScrollSnapOnPageOffset, lastAcknowledgedActivityRef]);
|
|
1164
|
+
}, [activitiesRef, activityElementsRef, autoScrollSnapOnActivity, autoScrollSnapOnActivityOffset, autoScrollSnapOnPage, autoScrollSnapOnPageOffset, lastAcknowledgedActivityRef]);
|
|
1145
1165
|
return false;
|
|
1146
1166
|
};
|
|
1147
1167
|
|
|
1148
|
-
var BasicTranscript = function BasicTranscript(
|
|
1149
|
-
var className =
|
|
1168
|
+
var BasicTranscript = function BasicTranscript(_ref33) {
|
|
1169
|
+
var className = _ref33.className;
|
|
1150
1170
|
var activityElementsRef = (0, _react.useRef)([]);
|
|
1151
1171
|
var scrollerRef = (0, _react.useRef)(function () {
|
|
1152
1172
|
return Infinity;
|
|
@@ -1173,4 +1193,4 @@ BasicTranscript.propTypes = {
|
|
|
1173
1193
|
};
|
|
1174
1194
|
var _default = BasicTranscript;
|
|
1175
1195
|
exports.default = _default;
|
|
1176
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9CYXNpY1RyYW5zY3JpcHQuanMiXSwibmFtZXMiOlsidXNlQWN0aXZpdGllcyIsImhvb2tzIiwidXNlQ3JlYXRlQWN0aXZpdHlSZW5kZXJlciIsInVzZUNyZWF0ZUFjdGl2aXR5U3RhdHVzUmVuZGVyZXIiLCJ1c2VDcmVhdGVBdmF0YXJSZW5kZXJlciIsInVzZURpcmVjdGlvbiIsInVzZUdyb3VwQWN0aXZpdGllcyIsInVzZUxvY2FsaXplciIsInVzZVN0eWxlT3B0aW9ucyIsIlJPT1RfU1RZTEUiLCJkaXNwbGF5IiwiZmxleERpcmVjdGlvbiIsIm92ZXJmbG93IiwicG9zaXRpb24iLCJmbGV4Iiwib3ZlcmZsb3dYIiwiV2Via2l0T3ZlcmZsb3dTY3JvbGxpbmciLCJsaXN0U3R5bGVUeXBlIiwidmFsaWRhdGVBbGxBY3Rpdml0aWVzVGFnZ2VkIiwiYWN0aXZpdGllcyIsImJpbnMiLCJldmVyeSIsImFjdGl2aXR5Iiwic29tZSIsImJpbiIsImluY2x1ZGVzIiwiSW50ZXJuYWxUcmFuc2NyaXB0IiwiYWN0aXZpdHlFbGVtZW50c1JlZiIsImNsYXNzTmFtZSIsImJhc2ljVHJhbnNjcmlwdFN0eWxlU2V0IiwiYmFzaWNUcmFuc2NyaXB0IiwiYnViYmxlRnJvbVVzZXJOdWJPZmZzZXQiLCJidWJibGVOdWJPZmZzZXQiLCJncm91cFRpbWVzdGFtcCIsImludGVybmFsTGl2ZVJlZ2lvbkZhZGVBZnRlciIsInNob3dBdmF0YXJJbkdyb3VwIiwiZm9jdXNlZEFjdGl2aXR5S2V5Iiwic2V0Rm9jdXNlZEFjdGl2aXR5S2V5IiwiZGlyZWN0aW9uIiwiY3JlYXRlQWN0aXZpdHlSZW5kZXJlciIsImNyZWF0ZUFjdGl2aXR5U3RhdHVzUmVuZGVyZXIiLCJjcmVhdGVBdmF0YXJSZW5kZXJlciIsImZvY3VzIiwiZ3JvdXBBY3Rpdml0aWVzIiwibG9jYWxpemUiLCJyb290Q2xhc3NOYW1lIiwicm9vdEVsZW1lbnRSZWYiLCJ0ZXJtaW5hdG9yUmVmIiwiYWN0aXZpdHlJbnRlcmFjdGl2ZUFsdCIsInRlcm1pbmF0b3JUZXh0IiwidHJhbnNjcmlwdEFyaWFMYWJlbCIsInRyYW5zY3JpcHRSb2xlRGVzY3JpcHRpb24iLCJoaWRlQWxsVGltZXN0YW1wcyIsImNyZWF0ZUFjdGl2aXR5UmVuZGVyZXJXaXRoTGl0ZXJhbEFyZ3MiLCJuZXh0VmlzaWJsZUFjdGl2aXR5IiwiYWN0aXZpdGllc1dpdGhSZW5kZXJlciIsImNyZWF0ZUFjdGl2aXR5UmVuZGVyZXJXaXRoTGl0ZXJhbEFyZ3NNZW1vaXplZCIsImluZGV4IiwibGVuZ3RoIiwicmVuZGVyQWN0aXZpdHkiLCJzcGxpY2UiLCJ2aXNpYmxlQWN0aXZpdGllcyIsIm1hcCIsImFjdGl2aXRpZXNHcm91cEJ5U2VuZGVyIiwic2VuZGVyIiwiYWN0aXZpdGllc0dyb3VwQnlTdGF0dXMiLCJzdGF0dXMiLCJjb25zb2xlIiwid2FybiIsImFjdGl2aXR5VHJlZSIsInZpc2libGVBY3Rpdml0aWVzUGVuZGluZ0dyb3VwaW5nIiwic2VuZGVyVHJlZSIsImFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlciIsImZpbmQiLCJwdXNoIiwiZm9yRWFjaCIsImFjdGl2aXRpZXNXaXRoU2FtZVN0YXR1cyIsImFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlckFuZFN0YXR1cyIsInJlbW92ZUlubGluZSIsInJlbmRlcmluZ0VsZW1lbnRzIiwidG9wU2lkZUJvdE51YiIsInRvcFNpZGVVc2VyTnViIiwiZmlyc3RBY3Rpdml0eSIsInJlbmRlckF2YXRhciIsImluZGV4V2l0aGluU2VuZGVyR3JvdXAiLCJmaXJzdEluU2VuZGVyR3JvdXAiLCJsYXN0SW5TZW5kZXJHcm91cCIsImluZGV4V2l0aGluU2VuZGVyQW5kU3RhdHVzR3JvdXAiLCJyZW5kZXJBY3Rpdml0eVN0YXR1cyIsImZpcnN0SW5TZW5kZXJBbmRTdGF0dXNHcm91cCIsImxhc3RJblNlbmRlckFuZFN0YXR1c0dyb3VwIiwiZW50cnkiLCJrZXkiLCJjaGFubmVsRGF0YSIsIm1lc3NhZ2VCYWNrIiwibWVzc2FnZUJhY2tEaXNwbGF5VGV4dCIsImRpc3BsYXlUZXh0Iiwicm9sZSIsImZyb20iLCJ0ZXh0IiwidG9wU2lkZU51YiIsInNob3dDYWxsb3V0IiwiZm9jdXNBY3Rpdml0eSIsInJvb3RFbGVtZW50IiwiY3VycmVudCIsImNhbGxiYWNrUmVmIiwiYWN0aXZpdHlFbGVtZW50IiwiYWN0aXZpdHlJRCIsImlkIiwiZWxlbWVudCIsImhhbmRsZUZvY3VzIiwiaGFuZGxlS2V5RG93biIsImV2ZW50IiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJoYW5kbGVNb3VzZURvd25DYXB0dXJlIiwidGFyZ2V0IiwidGFiSW5kZXgiLCJnZXRBdHRyaWJ1dGUiLCJoaWRlVGltZXN0YW1wIiwibGl2ZVJlZ2lvbktleSIsInNob3VsZFNwZWFrIiwic3BlYWsiLCJhY3Rpdml0eUVsZW1lbnRzIiwiZWxlbWVudElkIiwiZXhpc3RpbmdFbnRyeSIsImFyaWFMYWJlbElEIiwidG9TdHJpbmciLCJzdWJzdHIiLCJmb2N1c2VkIiwibGFzdEVsZW1lbnQiLCJyZW5kZXJpbmdBY3Rpdml0aWVzIiwic2Nyb2xsVG9Cb3R0b21TY3JvbGxUbyIsInNjcm9sbFRvQm90dG9tU2Nyb2xsVG9FbmQiLCJzY3JvbGxUbyIsImJlaGF2aW9yIiwiRXJyb3IiLCJzY3JvbGxUb3AiLCJzY3JvbGxhYmxlRWxlbWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJnZXRDbGllbnRSZWN0cyIsImFjdGl2aXR5RWxlbWVudEhlaWdodCIsImhlaWdodCIsImFjdGl2aXR5RWxlbWVudFkiLCJ5Iiwic2Nyb2xsYWJsZUhlaWdodCIsImFjdGl2aXR5RWxlbWVudE9mZnNldFRvcCIsIk1hdGgiLCJtaW4iLCJzY3JvbGxSZWxhdGl2ZSIsImRpc3BsYWNlbWVudCIsInNjcm9sbGFibGUiLCJuZXh0U2Nyb2xsVG9wIiwib2Zmc2V0SGVpZ2h0IiwibWF4Iiwic2Nyb2xsSGVpZ2h0IiwiZGlzcGF0Y2hTY3JvbGxQb3NpdGlvbiIsInBhdGNoZWREaXNwYXRjaFNjcm9sbFBvc2l0aW9uIiwicmV2ZXJzZSIsImxhc3RJbnRlcmFjdGVkQWN0aXZpdHkiLCJpbmRleE9mTGFzdEludGVyYWN0ZWRBY3Rpdml0eSIsImluZGV4T2YiLCJhY3RpdmVEZXNjZW5kYW50RWxlbWVudElkIiwic2Nyb2xsQWN0aXZlRGVzY2VuZGFudEludG9WaWV3IiwiYWN0aXZlRGVzY2VuZGFudCIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJjb250YWlucyIsImFjdGl2ZUVsZW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJzdHlsZSIsInNjcm9sbEludG9WaWV3IiwiYmxvY2siLCJzY3JvbGxUb3BBdFRvcFNpZGUiLCJvZmZzZXRUb3AiLCJzY3JvbGxUb3BBdEJvdHRvbVNpZGUiLCJoYW5kbGVUcmFuc2NyaXB0Rm9jdXMiLCJjdXJyZW50VGFyZ2V0IiwidW5kZWZpbmVkIiwiZm9jdXNSZWxhdGl2ZUFjdGl2aXR5IiwiZGVsdGEiLCJpc05hTiIsImZpbmRJbmRleCIsIm5leHRJbmRleCIsIm5leHRGb2N1c2VkQWN0aXZpdHkiLCJoYW5kbGVUcmFuc2NyaXB0S2V5RG93biIsImZyb21FbmRPZlRyYW5zY3JpcHRJbmRpY2F0b3IiLCJmcm9tVHJhbnNjcmlwdCIsImhhbmRsZWQiLCJJbmZpbml0eSIsImZvY3VzZWRBY3Rpdml0eUVudHJ5IiwiZm9jdXNlZEFjdGl2aXR5RWxlbWVudCIsImZpbHRlciIsImZpcnN0VGFiYmFibGVFbGVtZW50IiwibGFiZWxJZCIsInNldEJvdHRvbW1vc3RGb2N1c2VkQWN0aXZpdHlLZXlJZk5lZWRlZCIsImxhc3RBY3Rpdml0eUtleSIsImhhbmRsZVRyYW5zY3JpcHRLZXlEb3duQ2FwdHVyZSIsImFsdEtleSIsImN0cmxLZXkiLCJtZXRhS2V5IiwiZm9jdXNUcmFuc2NyaXB0Q2FsbGJhY2siLCJoYW5kbGVGb2N1c0FjdGl2aXR5IiwiZGlzcGF0Y2hUcmFuc2NyaXB0Rm9jdXMiLCJmb2N1c2VkQWN0aXZpdHkiLCJoYW5kbGVGb2N1c0ZpbGxlciIsImlzQ29udGVudEludGVyYWN0aXZlIiwiZGVmYXVsdFByb3BzIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwic2hhcGUiLCJhcnJheSIsImlzUmVxdWlyZWQiLCJzdHJpbmciLCJJbnRlcm5hbFNjcmVlblJlYWRlclRyYW5zY3JpcHQiLCJhcnJheU9mIiwiYW55IiwiSW50ZXJuYWxUcmFuc2NyaXB0U2Nyb2xsYWJsZSIsImNoaWxkcmVuIiwib25Gb2N1c0FjdGl2aXR5Iiwib25Gb2N1c0ZpbGxlciIsImFjdGl2aXRpZXNTdHlsZVNldCIsImhpZGVTY3JvbGxUb0VuZEJ1dHRvbiIsImFuaW1hdGluZ1RvRW5kIiwic3RpY2t5IiwibGFzdFZpc2libGVBY3Rpdml0eUlkIiwic2Nyb2xsVG9FbmRCdXR0b25SZWYiLCJsYXN0UmVhZEFjdGl2aXR5SWRSZWYiLCJhbGxBY3Rpdml0aWVzUmVhZCIsImhhbmRsZVNjcm9sbFRvRW5kQnV0dG9uQ2xpY2siLCJmaXJzdFVucmVhZEFjdGl2aXR5IiwicmVuZGVyU2VwYXJhdG9yQWZ0ZXJJbmRleCIsIlJlYWN0IiwiQ2hpbGRyZW4iLCJjb3VudCIsImZ1bmMiLCJTZXRTY3JvbGxlciIsInNjcm9sbGVyUmVmIiwiYXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5IiwiYXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5T2Zmc2V0IiwiYXV0b1Njcm9sbFNuYXBPblBhZ2UiLCJhdXRvU2Nyb2xsU25hcE9uUGFnZU9mZnNldCIsImxhc3RBY2tub3dsZWRnZWRBY3Rpdml0eSIsImxhc3RBY2tub3dsZWRnZWRBY3Rpdml0eVJlZiIsInBhdGNoZWRBdXRvU2Nyb2xsU25hcE9uQWN0aXZpdHkiLCJwYXRjaGVkQXV0b1Njcm9sbFNuYXBPblBhZ2UiLCJwYXRjaGVkQXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5T2Zmc2V0IiwicGF0Y2hlZEF1dG9TY3JvbGxTbmFwT25QYWdlT2Zmc2V0IiwidmFsdWVzIiwibnRoVW5hY2tub3dsZWRnZWRBY3Rpdml0eUVsZW1lbnQiLCJmaXJzdFVuYWNrbm93bGVkZ2VkQWN0aXZpdHlFbGVtZW50IiwicmVkdWNlIiwibWluVmFsdWUiLCJ2YWx1ZSIsIkJhc2ljVHJhbnNjcmlwdCIsInNjcm9sbGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFTQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUdFQSxhLEdBUUVDLDZCLENBUkZELGE7SUFDQUUseUIsR0FPRUQsNkIsQ0FQRkMseUI7SUFDQUMsK0IsR0FNRUYsNkIsQ0FORkUsK0I7SUFDQUMsdUIsR0FLRUgsNkIsQ0FMRkcsdUI7SUFDQUMsWSxHQUlFSiw2QixDQUpGSSxZO0lBQ0FDLGtCLEdBR0VMLDZCLENBSEZLLGtCO0lBQ0FDLFksR0FFRU4sNkIsQ0FGRk0sWTtJQUNBQyxlLEdBQ0VQLDZCLENBREZPLGU7QUFHRixJQUFNQyxVQUFVLEdBQUc7QUFDakIsaUNBQStCO0FBQzdCQyxJQUFBQSxPQUFPLEVBQUUsTUFEb0I7QUFFN0JDLElBQUFBLGFBQWEsRUFBRSxRQUZjO0FBRzdCQyxJQUFBQSxRQUFRLEVBQUUsUUFIbUI7QUFJN0I7QUFDQTtBQUNBO0FBQ0FDLElBQUFBLFFBQVEsRUFBRSxVQVBtQjtBQVM3Qiw0Q0FBd0M7QUFDdENDLE1BQUFBLElBQUksRUFBRTtBQURnQyxLQVRYO0FBYTdCLGdEQUE0QztBQUMxQ0osTUFBQUEsT0FBTyxFQUFFLE1BRGlDO0FBRTFDQyxNQUFBQSxhQUFhLEVBQUUsUUFGMkI7QUFHMUNJLE1BQUFBLFNBQVMsRUFBRSxRQUgrQjtBQUkxQ0MsTUFBQUEsdUJBQXVCLEVBQUU7QUFKaUIsS0FiZjtBQW9CN0IsZ0RBQTRDO0FBQzFDQyxNQUFBQSxhQUFhLEVB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QUEsUUFBUSxFQUFFa0I7QUFBdkMsa0JBQ0UsNkJBQUMsV0FBRDtBQUFhLElBQUEsbUJBQW1CLEVBQUVwTyxtQkFBbEM7QUFBdUQsSUFBQSxXQUFXLEVBQUVrTjtBQUFwRSxJQURGLGVBRUUsNkJBQUMsa0JBQUQ7QUFBb0IsSUFBQSxtQkFBbUIsRUFBRWxOLG1CQUF6QztBQUE4RCxJQUFBLFNBQVMsRUFBRUM7QUFBekUsSUFGRixDQURGO0FBTUQsQ0FaRDs7QUFjQWtPLGVBQWUsQ0FBQy9DLFlBQWhCLEdBQStCO0FBQzdCbkwsRUFBQUEsU0FBUyxFQUFFO0FBRGtCLENBQS9CO0FBSUFrTyxlQUFlLENBQUM5QyxTQUFoQixHQUE0QjtBQUMxQnBMLEVBQUFBLFNBQVMsRUFBRXFMLG1CQUFVSTtBQURLLENBQTVCO2VBSWV5QyxlIiwic291cmNlUm9vdCI6ImNvbXBvbmVudDovLy8iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgbm8tbWFnaWMtbnVtYmVyczogW1wiZXJyb3JcIiwgeyBcImlnbm9yZVwiOiBbLTEsIDAsIDEsIDIsIDUsIDM2XSB9XSAqL1xuXG5pbXBvcnQgeyBob29rcyB9IGZyb20gJ2JvdGZyYW1ld29yay13ZWJjaGF0LWFwaSc7XG5pbXBvcnQge1xuICBDb21wb3NlciBhcyBSZWFjdFNjcm9sbFRvQm90dG9tQ29tcG9zZXIsXG4gIFBhbmVsIGFzIFJlYWN0U2Nyb2xsVG9Cb3R0b21QYW5lbCxcbiAgdXNlQW5pbWF0aW5nVG9FbmQsXG4gIHVzZU9ic2VydmVTY3JvbGxQb3NpdGlvbixcbiAgdXNlU2Nyb2xsVG8sXG4gIHVzZVNjcm9sbFRvRW5kLFxuICB1c2VTdGlja3lcbn0gZnJvbSAncmVhY3Qtc2Nyb2xsLXRvLWJvdHRvbSc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgcmFuZG9tIGZyb20gJ21hdGgtcmFuZG9tJztcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgQmFzaWNUeXBpbmdJbmRpY2F0b3IgZnJvbSAnLi9CYXNpY1R5cGluZ0luZGljYXRvcic7XG5pbXBvcnQgRmFkZSBmcm9tICcuL1V0aWxzL0ZhZGUnO1xuaW1wb3J0IEZvY3VzUmVkaXJlY3RvciBmcm9tICcuL1V0aWxzL0ZvY3VzUmVkaXJlY3Rvcic7XG5pbXBvcnQgZ2V0QWN0aXZpdHlVbmlxdWVJZCBmcm9tICcuL1V0aWxzL2dldEFjdGl2aXR5VW5pcXVlSWQnO1xuaW1wb3J0IGdldFRhYkluZGV4IGZyb20gJy4vVXRpbHMvVHlwZUZvY3VzU2luay9nZXRUYWJJbmRleCc7XG5pbXBvcnQgaW5wdXR0YWJsZUtleSBmcm9tICcuL1V0aWxzL1R5cGVGb2N1c1NpbmsvaW5wdXR0YWJsZUtleSc7XG5pbXBvcnQgaW50ZXJzZWN0aW9uT2YgZnJvbSAnLi9VdGlscy9pbnRlcnNlY3Rpb25PZic7XG5pbXBvcnQgaXNaZXJvT3JQb3NpdGl2ZSBmcm9tICcuL1V0aWxzL2lzWmVyb09yUG9zaXRpdmUnO1xuaW1wb3J0IHJlbW92ZUlubGluZSBmcm9tICcuL1V0aWxzL3JlbW92ZUlubGluZSc7XG5pbXBvcnQgU2NyZWVuUmVhZGVyQWN0aXZpdHkgZnJvbSAnLi9TY3JlZW5SZWFkZXJBY3Rpdml0eSc7XG5pbXBvcnQgU2NyZWVuUmVhZGVyVGV4dCBmcm9tICcuL1NjcmVlblJlYWRlclRleHQnO1xuaW1wb3J0IFNjcm9sbFRvRW5kQnV0dG9uIGZyb20gJy4vQWN0aXZpdHkvU2Nyb2xsVG9FbmRCdXR0b24nO1xuaW1wb3J0IFNwZWFrQWN0aXZpdHkgZnJvbSAnLi9BY3Rpdml0eS9TcGVhayc7XG5pbXBvcnQgdGFiYmFibGVFbGVtZW50cyBmcm9tICcuL1V0aWxzL3RhYmJhYmxlRWxlbWVudHMnO1xuaW1wb3J0IHVzZUFja25vd2xlZGdlZEFjdGl2aXR5IGZyb20gJy4vaG9va3MvaW50ZXJuYWwvdXNlQWNrbm93bGVkZ2VkQWN0aXZpdHknO1xuaW1wb3J0IHVzZURpc3BhdGNoU2Nyb2xsUG9zaXRpb24gZnJvbSAnLi9ob29rcy9pbnRlcm5hbC91c2VEaXNwYXRjaFNjcm9sbFBvc2l0aW9uJztcbmltcG9ydCB1c2VEaXNwYXRjaFRyYW5zY3JpcHRGb2N1cyBmcm9tICcuL2hvb2tzL2ludGVybmFsL3VzZURpc3BhdGNoVHJhbnNjcmlwdEZvY3VzJztcbmltcG9ydCB1c2VGb2N1cyBmcm9tICcuL2hvb2tzL3VzZUZvY3VzJztcbmltcG9ydCB1c2VNZW1vaXplIGZyb20gJy4vaG9va3MvaW50ZXJuYWwvdXNlTWVtb2l6ZSc7XG5pbXBvcnQgdXNlUmVnaXN0ZXJGb2N1c1RyYW5zY3JpcHQgZnJvbSAnLi9ob29rcy9pbnRlcm5hbC91c2VSZWdpc3RlckZvY3VzVHJhbnNjcmlwdCc7XG5pbXBvcnQgdXNlUmVnaXN0ZXJTY3JvbGxSZWxhdGl2ZSBmcm9tICcuL2hvb2tzL2ludGVybmFsL3VzZVJlZ2lzdGVyU2Nyb2xsUmVsYXRpdmUnO1xuaW1wb3J0IHVzZVJlZ2lzdGVyU2Nyb2xsVG8gZnJvbSAnLi9ob29rcy9pbnRlcm5hbC91c2VSZWdpc3RlclNjcm9sbFRvJztcbmltcG9ydCB1c2VSZWdpc3RlclNjcm9sbFRvRW5kIGZyb20gJy4vaG9va3MvaW50ZXJuYWwvdXNlUmVnaXN0ZXJTY3JvbGxUb0VuZCc7XG5pbXBvcnQgdXNlU3R5bGVTZXQgZnJvbSAnLi9ob29rcy91c2VTdHlsZVNldCc7XG5pbXBvcnQgdXNlU3R5bGVUb0Vtb3Rpb25PYmplY3QgZnJvbSAnLi9ob29rcy9pbnRlcm5hbC91c2VTdHlsZVRvRW1vdGlvbk9iamVjdCc7XG5pbXBvcnQgdXNlVW5pcXVlSWQgZnJvbSAnLi9ob29rcy9pbnRlcm5hbC91c2VVbmlxdWVJZCc7XG5cbmNvbnN0IHtcbiAgdXNlQWN0aXZpdGllcyxcbiAgdXNlQ3JlYXRlQWN0aXZpdHlSZW5kZXJlcixcbiAgdXNlQ3JlYXRlQWN0aXZpdHlTdGF0dXNSZW5kZXJlcixcbiAgdXNlQ3JlYXRlQXZhdGFyUmVuZGVyZXIsXG4gIHVzZURpcmVjdGlvbixcbiAgdXNlR3JvdXBBY3Rpdml0aWVzLFxuICB1c2VMb2NhbGl6ZXIsXG4gIHVzZVN0eWxlT3B0aW9uc1xufSA9IGhvb2tzO1xuXG5jb25zdCBST09UX1NUWUxFID0ge1xuICAnJi53ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0Jzoge1xuICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgLy8gTWFrZSBzdXJlIHRvIHNldCBcInBvc2l0aW9uOiByZWxhdGl2ZVwiIGhlcmUgdG8gZm9ybSBhbm90aGVyIHN0YWNraW5nIGNvbnRleHQgZm9yIHRoZSBzY3JvbGwtdG8tZW5kIGJ1dHRvbi5cbiAgICAvLyBTdGFja2luZyBjb250ZXh0IGhlbHAgaXNvbGF0aW5nIGVsZW1lbnRzIHRoYXQgdXNlIFwiei1pbmRleFwiIGZyb20gZ2xvYmFsIHBvbGx1dGlvbi5cbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1Bvc2l0aW9uaW5nL1VuZGVyc3RhbmRpbmdfel9pbmRleC9UaGVfc3RhY2tpbmdfY29udGV4dFxuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuXG4gICAgJyYgLndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2ZpbGxlcic6IHtcbiAgICAgIGZsZXg6IDFcbiAgICB9LFxuXG4gICAgJyYgLndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX3Njcm9sbGFibGUnOiB7XG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICAgIG92ZXJmbG93WDogJ2hpZGRlbicsXG4gICAgICBXZWJraXRPdmVyZmxvd1Njcm9sbGluZzogJ3RvdWNoJ1xuICAgIH0sXG5cbiAgICAnJiAud2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fdHJhbnNjcmlwdCc6IHtcbiAgICAgIGxpc3RTdHlsZVR5cGU6ICdub25lJ1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gdmFsaWRhdGVBbGxBY3Rpdml0aWVzVGFnZ2VkKGFjdGl2aXRpZXMsIGJpbnMpIHtcbiAgcmV0dXJuIGFjdGl2aXRpZXMuZXZlcnkoYWN0aXZpdHkgPT4gYmlucy5zb21lKGJpbiA9PiBiaW4uaW5jbHVkZXMoYWN0aXZpdHkpKSk7XG59XG5cbmNvbnN0IEludGVybmFsVHJhbnNjcmlwdCA9ICh7IGFjdGl2aXR5RWxlbWVudHNSZWYsIGNsYXNzTmFtZSB9KSA9PiB7XG4gIGNvbnN0IFt7IGJhc2ljVHJhbnNjcmlwdDogYmFzaWNUcmFuc2NyaXB0U3R5bGVTZXQgfV0gPSB1c2VTdHlsZVNldCgpO1xuICBjb25zdCBbXG4gICAgeyBidWJibGVGcm9tVXNlck51Yk9mZnNldCwgYnViYmxlTnViT2Zmc2V0LCBncm91cFRpbWVzdGFtcCwgaW50ZXJuYWxMaXZlUmVnaW9uRmFkZUFmdGVyLCBzaG93QXZhdGFySW5Hcm91cCB9XG4gIF0gPSB1c2VTdHlsZU9wdGlvbnMoKTtcbiAgY29uc3QgW2ZvY3VzZWRBY3Rpdml0eUtleSwgc2V0Rm9jdXNlZEFjdGl2aXR5S2V5XSA9IHVzZVN0YXRlKCk7XG4gIGNvbnN0IFthY3Rpdml0aWVzXSA9IHVzZUFjdGl2aXRpZXMoKTtcbiAgY29uc3QgW2RpcmVjdGlvbl0gPSB1c2VEaXJlY3Rpb24oKTtcbiAgY29uc3QgY3JlYXRlQWN0aXZpdHlSZW5kZXJlciA9IHVzZUNyZWF0ZUFjdGl2aXR5UmVuZGVyZXIoKTtcbiAgY29uc3QgY3JlYXRlQWN0aXZpdHlTdGF0dXNSZW5kZXJlciA9IHVzZUNyZWF0ZUFjdGl2aXR5U3RhdHVzUmVuZGVyZXIoKTtcbiAgY29uc3QgY3JlYXRlQXZhdGFyUmVuZGVyZXIgPSB1c2VDcmVhdGVBdmF0YXJSZW5kZXJlcigpO1xuICBjb25zdCBmb2N1cyA9IHVzZUZvY3VzKCk7XG4gIGNvbnN0IGdyb3VwQWN0aXZpdGllcyA9IHVzZUdyb3VwQWN0aXZpdGllcygpO1xuICBjb25zdCBsb2NhbGl6ZSA9IHVzZUxvY2FsaXplcigpO1xuICBjb25zdCByb290Q2xhc3NOYW1lID0gdXNlU3R5bGVUb0Vtb3Rpb25PYmplY3QoKShST09UX1NUWUxFKSArICcnO1xuICBjb25zdCByb290RWxlbWVudFJlZiA9IHVzZVJlZigpO1xuICBjb25zdCB0ZXJtaW5hdG9yUmVmID0gdXNlUmVmKCk7XG5cbiAgY29uc3QgYWN0aXZpdHlJbnRlcmFjdGl2ZUFsdCA9IGxvY2FsaXplKCdBQ1RJVklUWV9JTlRFUkFDVElWRV9MQUJFTF9BTFQnKTtcbiAgY29uc3QgdGVybWluYXRvclRleHQgPSBsb2NhbGl6ZSgnVFJBTlNDUklQVF9URVJNSU5BVE9SX1RFWFQnKTtcbiAgY29uc3QgdHJhbnNjcmlwdEFyaWFMYWJlbCA9IGxvY2FsaXplKCdUUkFOU0NSSVBUX0FSSUFfTEFCRUxfQUxUJyk7XG4gIGNvbnN0IHRyYW5zY3JpcHRSb2xlRGVzY3JpcHRpb24gPSBsb2NhbGl6ZSgnVFJBTlNDUklQVF9BUklBX1JPTEVfQUxUJyk7XG5cbiAgY29uc3QgaGlkZUFsbFRpbWVzdGFtcHMgPSBncm91cFRpbWVzdGFtcCA9PT0gZmFsc2U7XG5cbiAgLy8gR2V0cyByZW5kZXJlciBmb3IgZXZlcnkgYWN0aXZpdHkuXG4gIC8vIEFjdGl2aXRpZXMgdGhhdCBhcmUgbm90IHZpc2libGUgd2lsbCByZXR1cm4gYSBmYWxzeSByZW5kZXJlci5cblxuICAvLyBDb252ZXJ0ZWQgZnJvbSBjcmVhdGVBY3Rpdml0eVJlbmRlcmVyKHsgYWN0aXZpdHksIG5leHRWaXNpYmxlQWN0aXZpdHkgfSkgdG8gY3JlYXRlQWN0aXZpdHlSZW5kZXJlcihhY3Rpdml0eSwgbmV4dFZpc2libGVBY3Rpdml0eSkuXG4gIC8vIFRoaXMgaXMgZm9yIHRoZSBtZW1vaXphdGlvbiBmdW5jdGlvbiB0byBjYWNoZSB0aGUgYXJndW1lbnRzLiBNZW1vaXplciBjYW4gb25seSBjYWNoZSBsaXRlcmFsIGFyZ3VtZW50cy5cbiAgY29uc3QgY3JlYXRlQWN0aXZpdHlSZW5kZXJlcldpdGhMaXRlcmFsQXJncyA9IHVzZUNhbGxiYWNrKFxuICAgIChhY3Rpdml0eSwgbmV4dFZpc2libGVBY3Rpdml0eSkgPT4gY3JlYXRlQWN0aXZpdHlSZW5kZXJlcih7IGFjdGl2aXR5LCBuZXh0VmlzaWJsZUFjdGl2aXR5IH0pLFxuICAgIFtjcmVhdGVBY3Rpdml0eVJlbmRlcmVyXVxuICApO1xuXG4gIC8vIENyZWF0ZSBhIG1lbW9pemVkIGNvbnRleHQgb2YgdGhlIGNyZWF0ZUFjdGl2aXR5UmVuZGVyZXIgZnVuY3Rpb24uXG4gIGNvbnN0IGFjdGl2aXRpZXNXaXRoUmVuZGVyZXIgPSB1c2VNZW1vaXplKFxuICAgIGNyZWF0ZUFjdGl2aXR5UmVuZGVyZXJXaXRoTGl0ZXJhbEFyZ3MsXG4gICAgY3JlYXRlQWN0aXZpdHlSZW5kZXJlcldpdGhMaXRlcmFsQXJnc01lbW9pemVkID0+IHtcbiAgICAgIC8vIEFsbCBjYWxscyB0byBjcmVhdGVBY3Rpdml0eVJlbmRlcmVyV2l0aExpdGVyYWxBcmdzTWVtb2l6ZWQoKSBpbiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgbWVtb2l6ZWQgKExSVSA9IDEpLlxuICAgICAgLy8gSW4gdGhlIG5leHQgcmVuZGVyIGN5Y2xlLCBjYWxscyB0byBjcmVhdGVBY3Rpdml0eVJlbmRlcmVyV2l0aExpdGVyYWxBcmdzTWVtb2l6ZWQoKSBtaWdodCByZXR1cm4gdGhlIG1lbW9pemVkIHJlc3VsdCBpbnN0ZWFkLlxuICAgICAgLy8gVGhpcyBpcyBhbiBpbXByb3ZlbWVudCB0byBSZWFjdCB1c2VNZW1vKCksIGJlY2F1c2UgaXQgb25seSBhbGxvd3MgMSBtZW1vaXphdGlvbi5cbiAgICAgIC8vIHVzZU1lbW9pemUoKSBhbGxvd3MgYW55IG51bWJlciBvZiBtZW1vaXphdGlvbi5cblxuICAgICAgY29uc3QgYWN0aXZpdGllc1dpdGhSZW5kZXJlciA9IFtdO1xuICAgICAgbGV0IG5leHRWaXNpYmxlQWN0aXZpdHk7XG5cbiAgICAgIGZvciAobGV0IGluZGV4ID0gYWN0aXZpdGllcy5sZW5ndGggLSAxOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7XG4gICAgICAgIGNvbnN0IGFjdGl2aXR5ID0gYWN0aXZpdGllc1tpbmRleF07XG4gICAgICAgIGNvbnN0IHJlbmRlckFjdGl2aXR5ID0gY3JlYXRlQWN0aXZpdHlSZW5kZXJlcldpdGhMaXRlcmFsQXJnc01lbW9pemVkKGFjdGl2aXR5LCBuZXh0VmlzaWJsZUFjdGl2aXR5KTtcblxuICAgICAgICBpZiAocmVuZGVyQWN0aXZpdHkpIHtcbiAgICAgICAgICBhY3Rpdml0aWVzV2l0aFJlbmRlcmVyLnNwbGljZSgwLCAwLCB7XG4gICAgICAgICAgICBhY3Rpdml0eSxcbiAgICAgICAgICAgIHJlbmRlckFjdGl2aXR5XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBuZXh0VmlzaWJsZUFjdGl2aXR5ID0gYWN0aXZpdHk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjdGl2aXRpZXNXaXRoUmVuZGVyZXI7XG4gICAgfSxcbiAgICBbYWN0aXZpdGllc11cbiAgKTtcblxuICBjb25zdCB2aXNpYmxlQWN0aXZpdGllcyA9IHVzZU1lbW8oKCkgPT4gYWN0aXZpdGllc1dpdGhSZW5kZXJlci5tYXAoKHsgYWN0aXZpdHkgfSkgPT4gYWN0aXZpdHkpLCBbXG4gICAgYWN0aXZpdGllc1dpdGhSZW5kZXJlclxuICBdKTtcblxuICAvLyBUYWcgYWN0aXZpdGllcyBiYXNlZCBvbiB0eXBlcy5cbiAgLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdGFnIGludG8gMiB0eXBlczogc2VuZGVyIGFuZCBzdGF0dXMuXG5cbiAgY29uc3QgeyBhY3Rpdml0aWVzR3JvdXBCeVNlbmRlciwgYWN0aXZpdGllc0dyb3VwQnlTdGF0dXMgfSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHsgc2VuZGVyOiBhY3Rpdml0aWVzR3JvdXBCeVNlbmRlciwgc3RhdHVzOiBhY3Rpdml0aWVzR3JvdXBCeVN0YXR1cyB9ID0gZ3JvdXBBY3Rpdml0aWVzKHtcbiAgICAgIGFjdGl2aXRpZXM6IHZpc2libGVBY3Rpdml0aWVzXG4gICAgfSk7XG5cbiAgICBpZiAoIXZhbGlkYXRlQWxsQWN0aXZpdGllc1RhZ2dlZCh2aXNpYmxlQWN0aXZpdGllcywgYWN0aXZpdGllc0dyb3VwQnlTZW5kZXIpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdib3RmcmFtZXdvcmstd2ViY2hhdDogTm90IGV2ZXJ5IGFjdGl2aXRpZXMgYXJlIGdyb3VwZWQgaW4gdGhlIFwic2VuZGVyXCIgcHJvcGVydHkuIFBsZWFzZSBmaXggXCJncm91cEFjdGl2aXRpZXNNaWRkbGV3YXJlXCIgYW5kIGdyb3VwIGV2ZXJ5IGFjdGl2aXRpZXMuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXZhbGlkYXRlQWxsQWN0aXZpdGllc1RhZ2dlZCh2aXNpYmxlQWN0aXZpdGllcywgYWN0aXZpdGllc0dyb3VwQnlTdGF0dXMpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdib3RmcmFtZXdvcmstd2ViY2hhdDogTm90IGV2ZXJ5IGFjdGl2aXRpZXMgYXJlIGdyb3VwZWQgaW4gdGhlIFwic3RhdHVzXCIgcHJvcGVydHkuIFBsZWFzZSBmaXggXCJncm91cEFjdGl2aXRpZXNNaWRkbGV3YXJlXCIgYW5kIGdyb3VwIGV2ZXJ5IGFjdGl2aXRpZXMuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWN0aXZpdGllc0dyb3VwQnlTZW5kZXIsXG4gICAgICBhY3Rpdml0aWVzR3JvdXBCeVN0YXR1c1xuICAgIH07XG4gIH0sIFtncm91cEFjdGl2aXRpZXMsIHZpc2libGVBY3Rpdml0aWVzXSk7XG5cbiAgLy8gQ3JlYXRlIGEgdHJlZSBvZiBhY3Rpdml0aWVzIHdpdGggMiBkaW1lbnNpb25zOiBzZW5kZXIsIGZvbGxvd2VkIGJ5IHN0YXR1cy5cblxuICBjb25zdCBhY3Rpdml0eVRyZWUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCB2aXNpYmxlQWN0aXZpdGllc1BlbmRpbmdHcm91cGluZyA9IFsuLi52aXNpYmxlQWN0aXZpdGllc107XG4gICAgY29uc3QgYWN0aXZpdHlUcmVlID0gW107XG5cbiAgICB3aGlsZSAodmlzaWJsZUFjdGl2aXRpZXNQZW5kaW5nR3JvdXBpbmcubGVuZ3RoKSB7XG4gICAgICBjb25zdCBbYWN0aXZpdHldID0gdmlzaWJsZUFjdGl2aXRpZXNQZW5kaW5nR3JvdXBpbmc7XG4gICAgICBjb25zdCBzZW5kZXJUcmVlID0gW107XG4gICAgICBjb25zdCBhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXIgPSBhY3Rpdml0aWVzR3JvdXBCeVNlbmRlci5maW5kKGFjdGl2aXRpZXMgPT4gYWN0aXZpdGllcy5pbmNsdWRlcyhhY3Rpdml0eSkpO1xuXG4gICAgICBhY3Rpdml0eVRyZWUucHVzaChzZW5kZXJUcmVlKTtcblxuICAgICAgYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyLmZvckVhY2goYWN0aXZpdHkgPT4ge1xuICAgICAgICBjb25zdCBhY3Rpdml0aWVzV2l0aFNhbWVTdGF0dXMgPSBhY3Rpdml0aWVzR3JvdXBCeVN0YXR1cy5maW5kKGFjdGl2aXRpZXMgPT4gYWN0aXZpdGllcy5pbmNsdWRlcyhhY3Rpdml0eSkpO1xuXG4gICAgICAgIGNvbnN0IGFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlckFuZFN0YXR1cyA9IGludGVyc2VjdGlvbk9mKFxuICAgICAgICAgIHZpc2libGVBY3Rpdml0aWVzUGVuZGluZ0dyb3VwaW5nLFxuICAgICAgICAgIGFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlcixcbiAgICAgICAgICBhY3Rpdml0aWVzV2l0aFNhbWVTdGF0dXNcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyQW5kU3RhdHVzLmxlbmd0aCkge1xuICAgICAgICAgIHNlbmRlclRyZWUucHVzaChhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXJBbmRTdGF0dXMpO1xuICAgICAgICAgIHJlbW92ZUlubGluZSh2aXNpYmxlQWN0aXZpdGllc1BlbmRpbmdHcm91cGluZywgLi4uYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyQW5kU3RhdHVzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQXNzZXJ0aW9uOiBBbGwgYWN0aXZpdGllcyBpbiB2aXNpYmxlQWN0aXZpdGllcywgbXVzdCBiZSBhc3NpZ25lZCB0byB0aGUgYWN0aXZpdHlUcmVlXG4gICAgaWYgKFxuICAgICAgIXZpc2libGVBY3Rpdml0aWVzLmV2ZXJ5KGFjdGl2aXR5ID0+XG4gICAgICAgIGFjdGl2aXR5VHJlZS5zb21lKGFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlciA9PlxuICAgICAgICAgIGFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlci5zb21lKGFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlckFuZFN0YXR1cyA9PlxuICAgICAgICAgICAgYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyQW5kU3RhdHVzLmluY2x1ZGVzKGFjdGl2aXR5KVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICkge1xuICAgICAgY29uc29sZS53YXJuKCdib3RmcmFtZXdvcmstd2ViY2hhdCBpbnRlcm5hbDogTm90IGFsbCB2aXNpYmxlIGFjdGl2aXRpZXMgYXJlIGdyb3VwZWQgaW4gdGhlIGFjdGl2aXR5VHJlZS4nLCB7XG4gICAgICAgIHZpc2libGVBY3Rpdml0aWVzLFxuICAgICAgICBhY3Rpdml0eVRyZWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBhY3Rpdml0eVRyZWU7XG4gIH0sIFthY3Rpdml0aWVzR3JvdXBCeVNlbmRlciwgYWN0aXZpdGllc0dyb3VwQnlTdGF0dXMsIHZpc2libGVBY3Rpdml0aWVzXSk7XG5cbiAgLy8gRmxhdHRlbiB0aGUgdHJlZSBiYWNrIGludG8gYW4gYXJyYXkgd2l0aCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHJlbmRlcmluZy5cblxuICBjb25zdCByZW5kZXJpbmdFbGVtZW50cyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHJlbmRlcmluZ0VsZW1lbnRzID0gW107XG4gICAgY29uc3QgdG9wU2lkZUJvdE51YiA9IGlzWmVyb09yUG9zaXRpdmUoYnViYmxlTnViT2Zmc2V0KTtcbiAgICBjb25zdCB0b3BTaWRlVXNlck51YiA9IGlzWmVyb09yUG9zaXRpdmUoYnViYmxlRnJvbVVzZXJOdWJPZmZzZXQpO1xuXG4gICAgYWN0aXZpdHlUcmVlLmZvckVhY2goYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyID0+IHtcbiAgICAgIGNvbnN0IFtbZmlyc3RBY3Rpdml0eV1dID0gYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyO1xuICAgICAgY29uc3QgcmVuZGVyQXZhdGFyID0gY3JlYXRlQXZhdGFyUmVuZGVyZXIoeyBhY3Rpdml0eTogZmlyc3RBY3Rpdml0eSB9KTtcblxuICAgICAgYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyLmZvckVhY2goKGFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlckFuZFN0YXR1cywgaW5kZXhXaXRoaW5TZW5kZXJHcm91cCkgPT4ge1xuICAgICAgICBjb25zdCBmaXJzdEluU2VuZGVyR3JvdXAgPSAhaW5kZXhXaXRoaW5TZW5kZXJHcm91cDtcbiAgICAgICAgY29uc3QgbGFzdEluU2VuZGVyR3JvdXAgPSBpbmRleFdpdGhpblNlbmRlckdyb3VwID09PSBhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXIubGVuZ3RoIC0gMTtcblxuICAgICAgICBhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXJBbmRTdGF0dXMuZm9yRWFjaCgoYWN0aXZpdHksIGluZGV4V2l0aGluU2VuZGVyQW5kU3RhdHVzR3JvdXApID0+IHtcbiAgICAgICAgICAvLyBXZSBvbmx5IHNob3cgdGhlIHRpbWVzdGFtcCBhdCB0aGUgZW5kIG9mIHRoZSBzZW5kZXIgZ3JvdXAuIEJ1dCB3ZSBhbHdheXMgc2hvdyB0aGUgXCJTZW5kIGZhaWxlZCwgcmV0cnlcIiBwcm9tcHQuXG4gICAgICAgICAgY29uc3QgcmVuZGVyQWN0aXZpdHlTdGF0dXMgPSBjcmVhdGVBY3Rpdml0eVN0YXR1c1JlbmRlcmVyKHtcbiAgICAgICAgICAgIGFjdGl2aXR5XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCBmaXJzdEluU2VuZGVyQW5kU3RhdHVzR3JvdXAgPSAhaW5kZXhXaXRoaW5TZW5kZXJBbmRTdGF0dXNHcm91cDtcbiAgICAgICAgICBjb25zdCBsYXN0SW5TZW5kZXJBbmRTdGF0dXNHcm91cCA9XG4gICAgICAgICAgICBpbmRleFdpdGhpblNlbmRlckFuZFN0YXR1c0dyb3VwID09PSBhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXJBbmRTdGF0dXMubGVuZ3RoIC0gMTtcblxuICAgICAgICAgIGNvbnN0IHsgcmVuZGVyQWN0aXZpdHkgfSA9IGFjdGl2aXRpZXNXaXRoUmVuZGVyZXIuZmluZChlbnRyeSA9PiBlbnRyeS5hY3Rpdml0eSA9PT0gYWN0aXZpdHkpO1xuICAgICAgICAgIGNvbnN0IGtleSA9IGdldEFjdGl2aXR5VW5pcXVlSWQoYWN0aXZpdHkpIHx8IHJlbmRlcmluZ0VsZW1lbnRzLmxlbmd0aDtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjaGFubmVsRGF0YTogeyBtZXNzYWdlQmFjazogeyBkaXNwbGF5VGV4dDogbWVzc2FnZUJhY2tEaXNwbGF5VGV4dCB9ID0ge30gfSA9IHt9LFxuICAgICAgICAgICAgZnJvbTogeyByb2xlIH0sXG4gICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgfSA9IGFjdGl2aXR5O1xuXG4gICAgICAgICAgY29uc3QgdG9wU2lkZU51YiA9IHJvbGUgPT09ICd1c2VyJyA/IHRvcFNpZGVVc2VyTnViIDogdG9wU2lkZUJvdE51YjtcblxuICAgICAgICAgIGxldCBzaG93Q2FsbG91dDtcblxuICAgICAgICAgIC8vIERlcGVuZGluZyBvbiB0aGUgXCJzaG93QXZhdGFySW5Hcm91cFwiIHNldHRpbmcsIHRoZSBhdmF0YXIgd2lsbCByZW5kZXIgaW4gZGlmZmVyZW50IHBvc2l0aW9ucy5cbiAgICAgICAgICBpZiAoc2hvd0F2YXRhckluR3JvdXAgPT09ICdzZW5kZXInKSB7XG4gICAgICAgICAgICBpZiAodG9wU2lkZU51Yikge1xuICAgICAgICAgICAgICBzaG93Q2FsbG91dCA9IGZpcnN0SW5TZW5kZXJHcm91cCAmJiBmaXJzdEluU2VuZGVyQW5kU3RhdHVzR3JvdXA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzaG93Q2FsbG91dCA9IGxhc3RJblNlbmRlckdyb3VwICYmIGxhc3RJblNlbmRlckFuZFN0YXR1c0dyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoc2hvd0F2YXRhckluR3JvdXAgPT09ICdzdGF0dXMnKSB7XG4gICAgICAgICAgICBpZiAodG9wU2lkZU51Yikge1xuICAgICAgICAgICAgICBzaG93Q2FsbG91dCA9IGZpcnN0SW5TZW5kZXJBbmRTdGF0dXNHcm91cDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNob3dDYWxsb3V0ID0gbGFzdEluU2VuZGVyQW5kU3RhdHVzR3JvdXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNob3dDYWxsb3V0ID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBmb2N1c0FjdGl2aXR5ID0gKCkgPT4ge1xuICAgICAgICAgICAgc2V0Rm9jdXNlZEFjdGl2aXR5S2V5KGdldEFjdGl2aXR5VW5pcXVlSWQoYWN0aXZpdHkpKTtcblxuICAgICAgICAgICAgLy8gSUUxMSBuZWVkIHRvIG1hbnVhbGx5IGZvY3VzIG9uIHRoZSB0cmFuc2NyaXB0LlxuICAgICAgICAgICAgY29uc3QgeyBjdXJyZW50OiByb290RWxlbWVudCB9ID0gcm9vdEVsZW1lbnRSZWY7XG5cbiAgICAgICAgICAgIHJvb3RFbGVtZW50ICYmIHJvb3RFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHJlbmRlcmluZ0VsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgYWN0aXZpdHksXG5cbiAgICAgICAgICAgIC8vIEFmdGVyIHRoZSBlbGVtZW50IGlzIG1vdW50ZWQsIHNldCBpdCB0byBhY3Rpdml0eUVsZW1lbnRzUmVmLlxuICAgICAgICAgICAgY2FsbGJhY2tSZWY6IGFjdGl2aXR5RWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gYWN0aXZpdHlFbGVtZW50c1JlZi5jdXJyZW50LmZpbmQoKHsgYWN0aXZpdHlJRCB9KSA9PiBhY3Rpdml0eUlEID09PSBhY3Rpdml0eS5pZCk7XG5cbiAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgZW50cnkuZWxlbWVudCA9IGFjdGl2aXR5RWxlbWVudDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgcHV0IHRoZSBmb2N1cyBvbiB0aGUgdHJhbnNjcmlwdCBhbmQgdGhlIGFjdGl2aXR5LlxuICAgICAgICAgICAgZm9jdXNBY3Rpdml0eSxcblxuICAgICAgICAgICAgLy8gV2hlbiBhIGNoaWxkIG9mIHRoZSBhY3Rpdml0eSByZWNlaXZlcyBmb2N1cywgbm90aWZ5IHRoZSB0cmFuc2NyaXB0IHRvIHNldCB0aGUgYXJpYS1hY3RpdmVkZXNjZW5kYW50IHRvIHRoaXMgYWN0aXZpdHkuXG4gICAgICAgICAgICBoYW5kbGVGb2N1czogKCkgPT4ge1xuICAgICAgICAgICAgICBzZXRGb2N1c2VkQWN0aXZpdHlLZXkoZ2V0QWN0aXZpdHlVbmlxdWVJZChhY3Rpdml0eSkpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgaGFuZGxlS2V5RG93bjogZXZlbnQgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICBzZXRGb2N1c2VkQWN0aXZpdHlLZXkoZ2V0QWN0aXZpdHlVbmlxdWVJZChhY3Rpdml0eSkpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgeyBjdXJyZW50IH0gPSByb290RWxlbWVudFJlZjtcblxuICAgICAgICAgICAgICAgIGN1cnJlbnQgJiYgY3VycmVudC5mb2N1cygpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBGb3IgYWNjZXNzaWJpbGl0eTogd2hlbiB0aGUgdXNlciBwcmVzcyB1cC9kb3duIGFycm93IGtleXMsIHdlIHB1dCBhIHZpc3VhbCBmb2N1cyBpbmRpY2F0b3IgYXJvdW5kIHRoZSBmb2N1c2VkIGFjdGl2aXR5LlxuICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGRvIHRoZSBzYW1lIGZvciBtb3VzZSwgdGhhdCBpcyB3aHkgd2UgaGF2ZSB0aGUgY2xpY2sgaGFuZGxlciBoZXJlLlxuICAgICAgICAgICAgLy8gV2UgYXJlIGRvaW5nIGl0IGluIGV2ZW50IGNhcHR1cmUgcGhhc2UgdG8gcHJldmVudCBvdGhlciBjb21wb25lbnRzIGZyb20gc3RvcHBpbmcgZXZlbnQgcHJvcGFnYXRpb24gdG8gdXMuXG4gICAgICAgICAgICBoYW5kbGVNb3VzZURvd25DYXB0dXJlOiAoeyB0YXJnZXQgfSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB0YWJJbmRleCA9IGdldFRhYkluZGV4KHRhcmdldCk7XG5cbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0YWJJbmRleCAhPT0gJ251bWJlcicgfHwgdGFiSW5kZXggPCAwIHx8IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNBY3Rpdml0eSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBcImhpZGVUaW1lc3RhbXBcIiBpcyBhIHJlbmRlci10aW1lIHBhcmFtZXRlciBmb3IgcmVuZGVyQWN0aXZpdHlTdGF0dXMoKS5cbiAgICAgICAgICAgIC8vIElmIHRydWUsIGl0IHdpbGwgaGlkZSB0aGUgdGltZXN0YW1wLCBidXQgaXQgd2lsbCBjb250aW51ZSB0byBzaG93IHRoZVxuICAgICAgICAgICAgLy8gcmV0cnkgcHJvbXB0LiBBbmQgc2hvdyB0aGUgc2NyZWVuIHJlYWRlciB2ZXJzaW9uIG9mIHRoZSB0aW1lc3RhbXAuXG4gICAgICAgICAgICBoaWRlVGltZXN0YW1wOlxuICAgICAgICAgICAgICBoaWRlQWxsVGltZXN0YW1wcyB8fCBpbmRleFdpdGhpblNlbmRlckFuZFN0YXR1c0dyb3VwICE9PSBhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXJBbmRTdGF0dXMubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgIGtleSxcblxuICAgICAgICAgICAgLy8gV2hlbiBcImxpdmVSZWdpb25LZXlcIiBjaGFuZ2VzLCBpdCB3aWxsIHNob3cgdXAgaW4gdGhlIGxpdmUgcmVnaW9uIG1vbWVudGFyaWx5LlxuICAgICAgICAgICAgbGl2ZVJlZ2lvbktleToga2V5ICsgJ3wnICsgKG1lc3NhZ2VCYWNrRGlzcGxheVRleHQgfHwgdGV4dCksXG4gICAgICAgICAgICByZW5kZXJBY3Rpdml0eSxcbiAgICAgICAgICAgIHJlbmRlckFjdGl2aXR5U3RhdHVzLFxuICAgICAgICAgICAgcmVuZGVyQXZhdGFyLFxuICAgICAgICAgICAgcm9sZSxcblxuICAgICAgICAgICAgLy8gVE9ETzogW1AyXSAjMjg1OCBXZSBzaG91bGQgdXNlIGNvcmUvZGVmaW5pdGlvbnMvc3BlYWtpbmdBY3Rpdml0eSBmb3IgdGhpcyBwcmVkaWNhdGUgaW5zdGVhZFxuICAgICAgICAgICAgc2hvdWxkU3BlYWs6IGFjdGl2aXR5LmNoYW5uZWxEYXRhICYmIGFjdGl2aXR5LmNoYW5uZWxEYXRhLnNwZWFrLFxuICAgICAgICAgICAgc2hvd0NhbGxvdXRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgY3VycmVudDogYWN0aXZpdHlFbGVtZW50cyB9ID0gYWN0aXZpdHlFbGVtZW50c1JlZjtcblxuICAgIC8vIFVwZGF0ZSBhY3Rpdml0eUVsZW1lbnRSZWYgd2l0aCBuZXcgc2V0cyBvZiBhY3Rpdml0eSwgd2hpbGUgcmV0YWluaW5nIHRoZSBleGlzdGluZyByZWZlcmVuY2luZyBlbGVtZW50IGlmIGV4aXN0cy5cbiAgICBhY3Rpdml0eUVsZW1lbnRzUmVmLmN1cnJlbnQgPSByZW5kZXJpbmdFbGVtZW50cy5tYXAoKHsgYWN0aXZpdHksIGFjdGl2aXR5OiB7IGlkIH0sIGVsZW1lbnRJZCwga2V5IH0pID0+IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nRW50cnkgPSBhY3Rpdml0eUVsZW1lbnRzLmZpbmQoZW50cnkgPT4gZW50cnkua2V5ID09PSBrZXkpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhY3Rpdml0eSxcbiAgICAgICAgYWN0aXZpdHlJRDogaWQsXG4gICAgICAgIGFyaWFMYWJlbElEOiBleGlzdGluZ0VudHJ5XG4gICAgICAgICAgPyBleGlzdGluZ0VudHJ5LmFyaWFMYWJlbElEXG4gICAgICAgICAgOiBgd2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZpdHktbGFiZWwtJHtyYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDUpfWAsXG4gICAgICAgIGVsZW1lbnQ6IGV4aXN0aW5nRW50cnkgJiYgZXhpc3RpbmdFbnRyeS5lbGVtZW50LFxuICAgICAgICBlbGVtZW50SWQsXG4gICAgICAgIGtleVxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vIFRoZXJlIG11c3QgYmUgb25lIGZvY3VzZWQgKGEuay5hLiBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQpIGRlc2lnbmF0ZWQuIFdlIGRlZmF1bHQgaXQgdG8gdGhlIGxhc3Qgb25lLlxuICAgIGlmICghcmVuZGVyaW5nRWxlbWVudHMuZmluZCgoeyBmb2N1c2VkIH0pID0+IGZvY3VzZWQpKSB7XG4gICAgICBjb25zdCBsYXN0RWxlbWVudCA9IHJlbmRlcmluZ0VsZW1lbnRzW3JlbmRlcmluZ0VsZW1lbnRzLmxlbmd0aCAtIDFdO1xuXG4gICAgICBpZiAobGFzdEVsZW1lbnQpIHtcbiAgICAgICAgbGFzdEVsZW1lbnQuZm9jdXNlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlbmRlcmluZ0VsZW1lbnRzO1xuICB9LCBbXG4gICAgYWN0aXZpdGllc1dpdGhSZW5kZXJlcixcbiAgICBhY3Rpdml0eUVsZW1lbnRzUmVmLFxuICAgIGFjdGl2aXR5VHJlZSxcbiAgICBidWJibGVGcm9tVXNlck51Yk9mZnNldCxcbiAgICBidWJibGVOdWJPZmZzZXQsXG4gICAgY3JlYXRlQWN0aXZpdHlTdGF0dXNSZW5kZXJlcixcbiAgICBjcmVhdGVBdmF0YXJSZW5kZXJlcixcbiAgICBoaWRlQWxsVGltZXN0YW1wcyxcbiAgICByb290RWxlbWVudFJlZixcbiAgICBzaG93QXZhdGFySW5Hcm91cFxuICBdKTtcblxuICBjb25zdCByZW5kZXJpbmdBY3Rpdml0aWVzID0gdXNlTWVtbygoKSA9PiByZW5kZXJpbmdFbGVtZW50cy5tYXAoKHsgYWN0aXZpdHkgfSkgPT4gYWN0aXZpdHkpLCBbcmVuZGVyaW5nRWxlbWVudHNdKTtcblxuICBjb25zdCBzY3JvbGxUb0JvdHRvbVNjcm9sbFRvID0gdXNlU2Nyb2xsVG8oKTtcbiAgY29uc3Qgc2Nyb2xsVG9Cb3R0b21TY3JvbGxUb0VuZCA9IHVzZVNjcm9sbFRvRW5kKCk7XG5cbiAgY29uc3Qgc2Nyb2xsVG8gPSB1c2VDYWxsYmFjayhcbiAgICAocG9zaXRpb24sIHsgYmVoYXZpb3IgPSAnYXV0bycgfSA9IHt9KSA9PiB7XG4gICAgICBpZiAoIXBvc2l0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnYm90ZnJhbWV3b3JrLXdlYmNoYXQ6IEZpcnN0IGFyZ3VtZW50IHBhc3NlZCB0byBcInVzZVNjcm9sbFRvXCIgbXVzdCBiZSBhIFNjcm9sbFBvc2l0aW9uIG9iamVjdC4nXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgYWN0aXZpdHlJRCwgc2Nyb2xsVG9wIH0gPSBwb3NpdGlvbjtcblxuICAgICAgaWYgKHR5cGVvZiBzY3JvbGxUb3AgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNjcm9sbFRvQm90dG9tU2Nyb2xsVG8oc2Nyb2xsVG9wLCB7IGJlaGF2aW9yIH0pO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYWN0aXZpdHlJRCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc3QgeyBjdXJyZW50OiByb290RWxlbWVudCB9ID0gcm9vdEVsZW1lbnRSZWY7XG4gICAgICAgIGNvbnN0IHsgZWxlbWVudDogYWN0aXZpdHlFbGVtZW50IH0gPVxuICAgICAgICAgIGFjdGl2aXR5RWxlbWVudHNSZWYuY3VycmVudC5maW5kKGVudHJ5ID0+IGVudHJ5LmFjdGl2aXR5SUQgPT09IGFjdGl2aXR5SUQpIHx8IHt9O1xuXG4gICAgICAgIGNvbnN0IHNjcm9sbGFibGVFbGVtZW50ID0gcm9vdEVsZW1lbnQucXVlcnlTZWxlY3RvcignLndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX3Njcm9sbGFibGUnKTtcblxuICAgICAgICBpZiAoc2Nyb2xsYWJsZUVsZW1lbnQgJiYgYWN0aXZpdHlFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgW3sgaGVpZ2h0OiBhY3Rpdml0eUVsZW1lbnRIZWlnaHQsIHk6IGFjdGl2aXR5RWxlbWVudFkgfV0gPSBhY3Rpdml0eUVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICAgICAgICBjb25zdCBbeyBoZWlnaHQ6IHNjcm9sbGFibGVIZWlnaHQgfV0gPSBzY3JvbGxhYmxlRWxlbWVudC5nZXRDbGllbnRSZWN0cygpO1xuXG4gICAgICAgICAgY29uc3QgYWN0aXZpdHlFbGVtZW50T2Zmc2V0VG9wID0gYWN0aXZpdHlFbGVtZW50WSArIHNjcm9sbGFibGVFbGVtZW50LnNjcm9sbFRvcDtcblxuICAgICAgICAgIGNvbnN0IHNjcm9sbFRvcCA9IE1hdGgubWluKFxuICAgICAgICAgICAgYWN0aXZpdHlFbGVtZW50T2Zmc2V0VG9wLFxuICAgICAgICAgICAgYWN0aXZpdHlFbGVtZW50T2Zmc2V0VG9wIC0gc2Nyb2xsYWJsZUhlaWdodCArIGFjdGl2aXR5RWxlbWVudEhlaWdodFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBzY3JvbGxUb0JvdHRvbVNjcm9sbFRvKHNjcm9sbFRvcCwgeyBiZWhhdmlvciB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW2FjdGl2aXR5RWxlbWVudHNSZWYsIHJvb3RFbGVtZW50UmVmLCBzY3JvbGxUb0JvdHRvbVNjcm9sbFRvXVxuICApO1xuXG4gIGNvbnN0IHNjcm9sbFJlbGF0aXZlID0gdXNlQ2FsbGJhY2soXG4gICAgKGRpcmVjdGlvbiwgeyBkaXNwbGFjZW1lbnQgfSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB7IGN1cnJlbnQ6IHJvb3RFbGVtZW50IH0gPSByb290RWxlbWVudFJlZjtcblxuICAgICAgaWYgKCFyb290RWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNjcm9sbGFibGUgPSByb290RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcud2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fc2Nyb2xsYWJsZScpO1xuICAgICAgbGV0IG5leHRTY3JvbGxUb3A7XG5cbiAgICAgIGlmICh0eXBlb2YgZGlzcGxhY2VtZW50ID09PSAnbnVtYmVyJykge1xuICAgICAgICBuZXh0U2Nyb2xsVG9wID0gc2Nyb2xsYWJsZS5zY3JvbGxUb3AgKyAoZGlyZWN0aW9uID09PSAnZG93bicgPyAxIDogLTEpICogZGlzcGxhY2VtZW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dFNjcm9sbFRvcCA9IHNjcm9sbGFibGUuc2Nyb2xsVG9wICsgKGRpcmVjdGlvbiA9PT0gJ2Rvd24nID8gMSA6IC0xKSAqIHNjcm9sbGFibGUub2Zmc2V0SGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICBzY3JvbGxUbyhcbiAgICAgICAge1xuICAgICAgICAgIHNjcm9sbFRvcDogTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Nyb2xsYWJsZS5zY3JvbGxIZWlnaHQgLSBzY3JvbGxhYmxlLm9mZnNldEhlaWdodCwgbmV4dFNjcm9sbFRvcCkpXG4gICAgICAgIH0sXG4gICAgICAgIHsgYmVoYXZpb3I6ICdzbW9vdGgnIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICBbcm9vdEVsZW1lbnRSZWYsIHNjcm9sbFRvXVxuICApO1xuXG4gIC8vIFNpbmNlIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGluc3RhbmNlcyBvZiA8QmFzaWNUcmFuc2NyaXB0PiBpbnNpZGUgdGhlIDxDb21wb3Nlcj4sIHdoZW4gdGhlIGRldmVsb3BlciBjYWxscyBgc2Nyb2xsWFhYYCwgd2UgbmVlZCB0byBjYWxsIGl0IG9uIGFsbCBpbnN0YW5jZXMuXG4gIC8vIFdlIGNhbGwgYHVzZVJlZ2lzdGVyU2Nyb2xsWFhYYCB0byByZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uLCB0aGUgYHVzZVNjcm9sbFhYWGAgd2lsbCBtdWx0aXBsZXggdGhlIGNhbGwgaW50byBlYWNoIGluc3RhbmNlIG9mIDxCYXNpY1RyYW5zY3JpcHQ+LlxuICB1c2VSZWdpc3RlclNjcm9sbFRvKHNjcm9sbFRvKTtcbiAgdXNlUmVnaXN0ZXJTY3JvbGxUb0VuZChzY3JvbGxUb0JvdHRvbVNjcm9sbFRvRW5kKTtcbiAgdXNlUmVnaXN0ZXJTY3JvbGxSZWxhdGl2ZShzY3JvbGxSZWxhdGl2ZSk7XG5cbiAgY29uc3QgZGlzcGF0Y2hTY3JvbGxQb3NpdGlvbiA9IHVzZURpc3BhdGNoU2Nyb2xsUG9zaXRpb24oKTtcbiAgY29uc3QgcGF0Y2hlZERpc3BhdGNoU2Nyb2xsUG9zaXRpb24gPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAoIWRpc3BhdGNoU2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gKHsgc2Nyb2xsVG9wIH0pID0+IHtcbiAgICAgIGNvbnN0IHsgY3VycmVudDogcm9vdEVsZW1lbnQgfSA9IHJvb3RFbGVtZW50UmVmO1xuXG4gICAgICBpZiAoIXJvb3RFbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2Nyb2xsYWJsZUVsZW1lbnQgPSByb290RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcud2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fc2Nyb2xsYWJsZScpO1xuXG4gICAgICBjb25zdCBbeyBoZWlnaHQ6IG9mZnNldEhlaWdodCB9ID0ge31dID0gc2Nyb2xsYWJsZUVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKTtcblxuICAgICAgLy8gRmluZCB0aGUgYWN0aXZpdHkganVzdCBhYm92ZSBzY3JvbGwgdmlldyBib3R0b20uXG4gICAgICAvLyBJZiB0aGUgc2Nyb2xsIHZpZXcgaXMgYWxyZWFkeSBvbiB0b3AsIGdldCB0aGUgZmlyc3QgYWN0aXZpdHkuXG4gICAgICBjb25zdCBlbnRyeSA9IHNjcm9sbGFibGVFbGVtZW50LnNjcm9sbFRvcFxuICAgICAgICA/IFsuLi5hY3Rpdml0eUVsZW1lbnRzUmVmLmN1cnJlbnRdLnJldmVyc2UoKS5maW5kKCh7IGVsZW1lbnQgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgW3sgeSB9ID0ge31dID0gZWxlbWVudC5nZXRDbGllbnRSZWN0cygpO1xuXG4gICAgICAgICAgICByZXR1cm4geSA8IG9mZnNldEhlaWdodDtcbiAgICAgICAgICB9KVxuICAgICAgICA6IGFjdGl2aXR5RWxlbWVudHNSZWYuY3VycmVudFswXTtcblxuICAgICAgY29uc3QgeyBhY3Rpdml0eUlEIH0gPSBlbnRyeSB8fCB7fTtcblxuICAgICAgZGlzcGF0Y2hTY3JvbGxQb3NpdGlvbih7IC4uLihhY3Rpdml0eUlEID8geyBhY3Rpdml0eUlEIH0gOiB7fSksIHNjcm9sbFRvcCB9KTtcbiAgICB9O1xuICB9LCBbYWN0aXZpdHlFbGVtZW50c1JlZiwgZGlzcGF0Y2hTY3JvbGxQb3NpdGlvbiwgcm9vdEVsZW1lbnRSZWZdKTtcblxuICB1c2VPYnNlcnZlU2Nyb2xsUG9zaXRpb24ocGF0Y2hlZERpc3BhdGNoU2Nyb2xsUG9zaXRpb24pO1xuXG4gIGNvbnN0IFtsYXN0SW50ZXJhY3RlZEFjdGl2aXR5XSA9IHVzZUFja25vd2xlZGdlZEFjdGl2aXR5KCk7XG5cbiAgY29uc3QgaW5kZXhPZkxhc3RJbnRlcmFjdGVkQWN0aXZpdHkgPSBhY3Rpdml0aWVzLmluZGV4T2YobGFzdEludGVyYWN0ZWRBY3Rpdml0eSk7XG5cbiAgLy8gQ3JlYXRlIGEgbmV3IElEIGZvciBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQgZXZlcnkgdGltZSB0aGUgYWN0aXZlIGRlc2NlbmRhbnQgY2hhbmdlLlxuICAvLyBJbiBvdXIgZGVzaWduLCB0aGUgdHJhbnNjcmlwdCB3aWxsIG9ubHkgaGF2ZSAxIGZvY3VzZWQgYWN0aXZpdHkgYW5kIGl0IGhhcyBhbiBJRC4gT3RoZXIgYmx1cnJlZCBhY3Rpdml0aWVzIHdpbGwgbm90IGhhdmUgSUQgYXNzaWduZWQuXG4gIC8vIFRoaXMgaGVscCB3aXRoIHBlcmZvcm1hbmNlLlxuICAvLyBCdXQgYnJvd3NlciB1c3VhbGx5IGRvIG5vb3AgaWYgdGhlIHZhbHVlIG9mIGFyaWEtYWN0aXZlZGVzY2VuZGFudCBkb2Vzbid0IGNoYW5nZS5cbiAgLy8gVGhhdCBtZWFucywgaWYgd2UgYXNzaWduIHRoZSBzYW1lIElEIHRvIGFub3RoZXIgZWxlbWVudCwgYnJvd3NlciB3aWxsIGRvIG5vb3AuXG4gIC8vIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBuZXcgSUQgc28gdGhlIGJyb3dzZXIgc2VlIHRoZXJlIGlzIGEgY2hhbmdlIGluIGFyaWEtYWN0aXZlZGVzY2VuZGFudCB2YWx1ZSBhbmQgcGVyZm9ybSBhY2NvcmRpbmdseS5cbiAgY29uc3QgYWN0aXZlRGVzY2VuZGFudEVsZW1lbnRJZCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gZm9jdXNlZEFjdGl2aXR5S2V5ICYmIGB3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19hY3RpdmUtZGVzY2VuZGFudC0ke3JhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgNSl9YCxcbiAgICBbZm9jdXNlZEFjdGl2aXR5S2V5XVxuICApO1xuXG4gIGNvbnN0IHNjcm9sbEFjdGl2ZURlc2NlbmRhbnRJbnRvVmlldyA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBhY3RpdmVEZXNjZW5kYW50ID0gYWN0aXZlRGVzY2VuZGFudEVsZW1lbnRJZCAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChhY3RpdmVEZXNjZW5kYW50RWxlbWVudElkKTtcblxuICAgIC8vIERvbid0IHNjcm9sbCBhY3RpdmUgZGVzY2VuZGFudCBpbnRvIHZpZXcgaWYgdGhlIGZvY3VzIGlzIGFscmVhZHkgaW5zaWRlIGl0LlxuICAgIC8vIE90aGVyd2lzZSwgZ2l2ZW4gdGhlIGZvY3VzIGlzIG9uIHRoZSBzZW5kIGJveCwgY2xpY2tpbmcgb24gYW55IDxpbnB1dD4gaW5zaWRlIHRoZSBBZGFwdGl2ZSBDYXJkcyBtYXkgY2F1c2UgdGhlIHZpZXcgdG8gbW92ZS5cbiAgICAvLyBUaGlzIFVYIGlzIG5vdCBkZXNpcmFibGUgYmVjYXVzZSBjbGljayBzaG91bGQgbm90IGNhdXNlIHNjcm9sbC5cbiAgICBpZiAoYWN0aXZlRGVzY2VuZGFudCAmJiAhYWN0aXZlRGVzY2VuZGFudC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgLy8gQ2hlY2tzIGlmIHNjcm9sbEludG9WaWV3IHN1cHBvcnQgb3B0aW9ucyBvciBub3QuXG4gICAgICAvLyAtIGh0dHBzOi8vZ2l0aHViLmNvbS9Nb2Rlcm5penIvTW9kZXJuaXpyL2lzc3Vlcy8xNTY4I2lzc3VlY29tbWVudC00MTk0NTc5NzJcbiAgICAgIC8vIC0gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDY5MTk2MjcvaXMtaXQtcG9zc2libGUtdG8tdGVzdC1mb3Itc2Nyb2xsaW50b3ZpZXctYnJvd3Nlci1jb21wYXRpYmlsaXR5XG4gICAgICBpZiAoJ3Njcm9sbEJlaGF2aW9yJyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUpIHtcbiAgICAgICAgYWN0aXZlRGVzY2VuZGFudC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGlzIGlzIGZvciBicm93c2VyIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBvcHRpb25zIHBhc3NlZCB0byBzY3JvbGxJbnRvVmlldygpLCBwb3NzaWJseSBJRTExLlxuICAgICAgICBjb25zdCBzY3JvbGxhYmxlRWxlbWVudCA9IHJvb3RFbGVtZW50UmVmLmN1cnJlbnQucXVlcnlTZWxlY3RvcignLndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX3Njcm9sbGFibGUnKTtcbiAgICAgICAgY29uc3Qgc2Nyb2xsVG9wQXRUb3BTaWRlID0gYWN0aXZlRGVzY2VuZGFudC5vZmZzZXRUb3A7XG4gICAgICAgIGNvbnN0IHNjcm9sbFRvcEF0Qm90dG9tU2lkZSA9IGFjdGl2ZURlc2NlbmRhbnQub2Zmc2V0VG9wICsgYWN0aXZlRGVzY2VuZGFudC5vZmZzZXRIZWlnaHQ7XG5cbiAgICAgICAgaWYgKHNjcm9sbFRvcEF0VG9wU2lkZSA8IHNjcm9sbGFibGVFbGVtZW50LnNjcm9sbFRvcCkge1xuICAgICAgICAgIHNjcm9sbGFibGVFbGVtZW50LnNjcm9sbFRvcCA9IHNjcm9sbFRvcEF0VG9wU2lkZTtcbiAgICAgICAgfSBlbHNlIGlmIChzY3JvbGxUb3BBdEJvdHRvbVNpZGUgPiBzY3JvbGxhYmxlRWxlbWVudC5zY3JvbGxUb3AgKyBzY3JvbGxhYmxlRWxlbWVudC5vZmZzZXRIZWlnaHQpIHtcbiAgICAgICAgICBzY3JvbGxhYmxlRWxlbWVudC5zY3JvbGxUb3AgPSBzY3JvbGxUb3BBdEJvdHRvbVNpZGUgLSBzY3JvbGxhYmxlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIFthY3RpdmVEZXNjZW5kYW50RWxlbWVudElkLCByb290RWxlbWVudFJlZl0pO1xuXG4gIGNvbnN0IGhhbmRsZVRyYW5zY3JpcHRGb2N1cyA9IHVzZUNhbGxiYWNrKFxuICAgIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IHsgY3VycmVudFRhcmdldCwgdGFyZ2V0IH0gPSBldmVudDtcblxuICAgICAgLy8gV2hlbiBmb2N1cyBpcyBwbGFjZWQgb24gdGhlIHRyYW5zY3JpcHQsIHNjcm9sbCBhY3RpdmUgZGVzY2VuZGFudCBpbnRvIHRoZSB2aWV3LlxuICAgICAgY3VycmVudFRhcmdldCA9PT0gdGFyZ2V0ICYmIHNjcm9sbEFjdGl2ZURlc2NlbmRhbnRJbnRvVmlldygpO1xuICAgIH0sXG4gICAgW3Njcm9sbEFjdGl2ZURlc2NlbmRhbnRJbnRvVmlld11cbiAgKTtcblxuICAvLyBBZnRlciBuZXcgYXJpYS1hY3RpdmVkZXNjZW5kYW50IGlzIGFzc2lnbmVkLCB3ZSB3aWxsIG5lZWQgdG8gc2Nyb2xsIGl0IGludG8gdmlldy5cbiAgLy8gVXNlciBhZ2VudCB3aWxsIHNjcm9sbCBhdXRvbWF0aWNhbGx5IGZvciBmb2N1c2luZyBlbGVtZW50LCBidXQgbm90IGZvciBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQuXG4gIC8vIFdlIG5lZWQgdG8gZG8gdGhlIHNjcm9sbGluZyBtYW51YWxseS5cbiAgdXNlRWZmZWN0KCgpID0+IHNjcm9sbEFjdGl2ZURlc2NlbmRhbnRJbnRvVmlldygpLCBbc2Nyb2xsQWN0aXZlRGVzY2VuZGFudEludG9WaWV3XSk7XG5cbiAgLy8gSWYgYW55IGFjdGl2aXRpZXMgaGFzIGNoYW5nZWQsIHJlc2V0IHRoZSBhY3RpdmUgZGVzY2VuZGFudC5cbiAgdXNlRWZmZWN0KCgpID0+IHNldEZvY3VzZWRBY3Rpdml0eUtleSh1bmRlZmluZWQpLCBbYWN0aXZpdGllcywgc2V0Rm9jdXNlZEFjdGl2aXR5S2V5XSk7XG5cbiAgY29uc3QgZm9jdXNSZWxhdGl2ZUFjdGl2aXR5ID0gdXNlQ2FsbGJhY2soXG4gICAgZGVsdGEgPT4ge1xuICAgICAgaWYgKGlzTmFOKGRlbHRhKSB8fCAhcmVuZGVyaW5nRWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzZXRGb2N1c2VkQWN0aXZpdHlLZXkodW5kZWZpbmVkKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW5kZXggPSByZW5kZXJpbmdFbGVtZW50cy5maW5kSW5kZXgoKHsga2V5IH0pID0+IGtleSA9PT0gZm9jdXNlZEFjdGl2aXR5S2V5KTtcbiAgICAgIGNvbnN0IG5leHRJbmRleCA9IH5pbmRleFxuICAgICAgICA/IE1hdGgubWF4KDAsIE1hdGgubWluKHJlbmRlcmluZ0VsZW1lbnRzLmxlbmd0aCAtIDEsIGluZGV4ICsgZGVsdGEpKVxuICAgICAgICA6IHJlbmRlcmluZ0VsZW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgICBjb25zdCBuZXh0Rm9jdXNlZEFjdGl2aXR5ID0gcmVuZGVyaW5nRWxlbWVudHNbbmV4dEluZGV4XTtcblxuICAgICAgc2V0Rm9jdXNlZEFjdGl2aXR5S2V5KG5leHRGb2N1c2VkQWN0aXZpdHkua2V5KTtcbiAgICAgIHJvb3RFbGVtZW50UmVmLmN1cnJlbnQgJiYgcm9vdEVsZW1lbnRSZWYuY3VycmVudC5mb2N1cygpO1xuICAgIH0sXG4gICAgW2ZvY3VzZWRBY3Rpdml0eUtleSwgcmVuZGVyaW5nRWxlbWVudHMsIHJvb3RFbGVtZW50UmVmLCBzZXRGb2N1c2VkQWN0aXZpdHlLZXldXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlVHJhbnNjcmlwdEtleURvd24gPSB1c2VDYWxsYmFjayhcbiAgICBldmVudCA9PiB7XG4gICAgICBjb25zdCB7IHRhcmdldCB9ID0gZXZlbnQ7XG5cbiAgICAgIGNvbnN0IGZyb21FbmRPZlRyYW5zY3JpcHRJbmRpY2F0b3IgPSB0YXJnZXQgPT09IHRlcm1pbmF0b3JSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IGZyb21UcmFuc2NyaXB0ID0gdGFyZ2V0ID09PSBldmVudC5jdXJyZW50VGFyZ2V0O1xuXG4gICAgICBpZiAoIWZyb21FbmRPZlRyYW5zY3JpcHRJbmRpY2F0b3IgJiYgIWZyb21UcmFuc2NyaXB0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGhhbmRsZWQgPSB0cnVlO1xuXG4gICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICAgIGZvY3VzUmVsYXRpdmVBY3Rpdml0eShmcm9tRW5kT2ZUcmFuc2NyaXB0SW5kaWNhdG9yID8gMCA6IDEpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgIGZvY3VzUmVsYXRpdmVBY3Rpdml0eShmcm9tRW5kT2ZUcmFuc2NyaXB0SW5kaWNhdG9yID8gMCA6IC0xKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdFbmQnOlxuICAgICAgICAgIGZvY3VzUmVsYXRpdmVBY3Rpdml0eShJbmZpbml0eSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICAgIGlmICghZnJvbUVuZE9mVHJhbnNjcmlwdEluZGljYXRvcikge1xuICAgICAgICAgICAgY29uc3QgZm9jdXNlZEFjdGl2aXR5RW50cnkgPSByZW5kZXJpbmdFbGVtZW50cy5maW5kKCh7IGtleSB9KSA9PiBrZXkgPT09IGZvY3VzZWRBY3Rpdml0eUtleSk7XG5cbiAgICAgICAgICAgIGlmIChmb2N1c2VkQWN0aXZpdHlFbnRyeSkge1xuICAgICAgICAgICAgICBjb25zdCB7IGVsZW1lbnQ6IGZvY3VzZWRBY3Rpdml0eUVsZW1lbnQgfSA9XG4gICAgICAgICAgICAgICAgYWN0aXZpdHlFbGVtZW50c1JlZi5jdXJyZW50LmZpbmQoKHsgYWN0aXZpdHkgfSkgPT4gYWN0aXZpdHkgPT09IGZvY3VzZWRBY3Rpdml0eUVudHJ5LmFjdGl2aXR5KSB8fCB7fTtcblxuICAgICAgICAgICAgICBpZiAoZm9jdXNlZEFjdGl2aXR5RWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtmaXJzdFRhYmJhYmxlRWxlbWVudF0gPSB0YWJiYWJsZUVsZW1lbnRzKGZvY3VzZWRBY3Rpdml0eUVsZW1lbnQpLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICh7IGNsYXNzTmFtZSB9KSA9PiBjbGFzc05hbWUgIT09ICd3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19hY3Rpdml0eS1zZW50aW5lbCdcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgZmlyc3RUYWJiYWJsZUVsZW1lbnQgJiYgZmlyc3RUYWJiYWJsZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgICAgZm9jdXMoJ3NlbmRCb3hXaXRob3V0S2V5Ym9hcmQnKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdIb21lJzpcbiAgICAgICAgICBmb2N1c1JlbGF0aXZlQWN0aXZpdHkoLUluZmluaXR5KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGhhbmRsZWQgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKGhhbmRsZWQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAvLyBJZiBhIGN1c3RvbSBIVE1MIGNvbnRyb2wgd2FudHMgdG8gaGFuZGxlIHVwL2Rvd24gYXJyb3csIHdlIHdpbGwgcHJldmVudCB0aGVtIGZyb20gbGlzdGVuaW5nIHRvIHRoaXMgZXZlbnQgdG8gcHJldmVudCBidWdzIGR1ZSB0byBoYW5kbGluZyBhcnJvdyBrZXlzIHR3aWNlLlxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtmb2N1c2VkQWN0aXZpdHlLZXksIGFjdGl2aXR5RWxlbWVudHNSZWYsIGZvY3VzUmVsYXRpdmVBY3Rpdml0eSwgZm9jdXMsIHRlcm1pbmF0b3JSZWYsIHJlbmRlcmluZ0VsZW1lbnRzXVxuICApO1xuXG4gIGNvbnN0IGxhYmVsSWQgPSB1c2VVbmlxdWVJZCgnd2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fbGFiZWwnKTtcblxuICAvLyBJZiBTSElGVC1UQUIgZnJvbSBcIkVuZCBvZiB0cmFuc2NyaXB0XCIgaW5kaWNhdG9yLCBpZiBmb2N1c2VkQWN0aXZpdHlLZXkgaXMgbm90IHNldCAob3Igbm8gbG9uZ2VyIGV4aXN0cyksIHNldCBpdCB0aGUgdGhlIGJvdHRvbW1vc3QgYWN0aXZpdHkuXG4gIGNvbnN0IHNldEJvdHRvbW1vc3RGb2N1c2VkQWN0aXZpdHlLZXlJZk5lZWRlZCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoIX5yZW5kZXJpbmdFbGVtZW50cy5maW5kSW5kZXgoKHsga2V5IH0pID0+IGtleSA9PT0gZm9jdXNlZEFjdGl2aXR5S2V5KSkge1xuICAgICAgY29uc3QgeyBrZXk6IGxhc3RBY3Rpdml0eUtleSB9ID0gcmVuZGVyaW5nRWxlbWVudHNbcmVuZGVyaW5nRWxlbWVudHMubGVuZ3RoIC0gMV0gfHwge307XG5cbiAgICAgIHNldEZvY3VzZWRBY3Rpdml0eUtleShsYXN0QWN0aXZpdHlLZXkpO1xuICAgIH1cbiAgfSwgW2ZvY3VzZWRBY3Rpdml0eUtleSwgcmVuZGVyaW5nRWxlbWVudHMsIHNldEZvY3VzZWRBY3Rpdml0eUtleV0pO1xuXG4gIGNvbnN0IGhhbmRsZVRyYW5zY3JpcHRLZXlEb3duQ2FwdHVyZSA9IHVzZUNhbGxiYWNrKFxuICAgIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IHsgYWx0S2V5LCBjdHJsS2V5LCBrZXksIG1ldGFLZXksIHRhcmdldCB9ID0gZXZlbnQ7XG5cbiAgICAgIGlmIChhbHRLZXkgfHwgKGN0cmxLZXkgJiYga2V5ICE9PSAndicpIHx8IG1ldGFLZXkgfHwgKCFpbnB1dHRhYmxlS2V5KGtleSkgJiYga2V5ICE9PSAnQmFja3NwYWNlJykpIHtcbiAgICAgICAgLy8gSWdub3JlIGlmIG9uZSBvZiB0aGUgdXRpbGl0eSBrZXkgKGV4Y2VwdCBTSElGVCkgaXMgcHJlc3NlZFxuICAgICAgICAvLyBFLmcuIENUUkwtQyBvbiBhIGxpbmsgaW4gb25lIG9mIHRoZSBtZXNzYWdlIHNob3VsZCBub3QganVtcCB0byBjaGF0IGJveFxuICAgICAgICAvLyBFLmcuIFwiQVwiIG9yIFwiQmFja3NwYWNlXCIgc2hvdWxkIGp1bXAgdG8gY2hhdCBib3hcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTZW5kIGtleXN0cm9rZXMgdG8gc2VuZCBib3ggaWYgd2UgYXJlIGZvY3VzaW5nIG9uIHRoZSB0cmFuc2NyaXB0IG9yIHRlcm1pbmF0b3IuXG4gICAgICBpZiAodGFyZ2V0ID09PSBldmVudC5jdXJyZW50VGFyZ2V0IHx8IHRhcmdldCA9PT0gdGVybWluYXRvclJlZi5jdXJyZW50KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGZvY3VzKCdzZW5kQm94Jyk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbZm9jdXNdXG4gICk7XG5cbiAgY29uc3QgZm9jdXNUcmFuc2NyaXB0Q2FsbGJhY2sgPSB1c2VDYWxsYmFjaygoKSA9PiByb290RWxlbWVudFJlZi5jdXJyZW50ICYmIHJvb3RFbGVtZW50UmVmLmN1cnJlbnQuZm9jdXMoKSwgW1xuICAgIHJvb3RFbGVtZW50UmVmXG4gIF0pO1xuXG4gIHVzZVJlZ2lzdGVyRm9jdXNUcmFuc2NyaXB0KGZvY3VzVHJhbnNjcmlwdENhbGxiYWNrKTtcblxuICBjb25zdCBoYW5kbGVGb2N1c0FjdGl2aXR5ID0gdXNlQ2FsbGJhY2soXG4gICAga2V5ID0+IHtcbiAgICAgIHNldEZvY3VzZWRBY3Rpdml0eUtleShrZXkpO1xuICAgICAgcm9vdEVsZW1lbnRSZWYuY3VycmVudCAmJiByb290RWxlbWVudFJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgfSxcbiAgICBbc2V0Rm9jdXNlZEFjdGl2aXR5S2V5XVxuICApO1xuXG4gIC8vIFdoZW4gdGhlIGZvY3VzaW5nIGFjdGl2aXR5IGhhcyBjaGFuZ2VkLCBkaXNwYXRjaCBhbiBldmVudCB0byBvYnNlcnZlcnMgb2YgXCJ1c2VPYnNlcnZlVHJhbnNjcmlwdEZvY3VzXCIuXG4gIGNvbnN0IGRpc3BhdGNoVHJhbnNjcmlwdEZvY3VzID0gdXNlRGlzcGF0Y2hUcmFuc2NyaXB0Rm9jdXMoKTtcbiAgY29uc3QgZm9jdXNlZEFjdGl2aXR5ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgeyBhY3Rpdml0eSB9ID0gcmVuZGVyaW5nRWxlbWVudHMuZmluZCgoeyBrZXkgfSkgPT4ga2V5ID09PSBmb2N1c2VkQWN0aXZpdHlLZXkpIHx8IHt9O1xuXG4gICAgcmV0dXJuIGFjdGl2aXR5O1xuICB9LCBbZm9jdXNlZEFjdGl2aXR5S2V5LCByZW5kZXJpbmdFbGVtZW50c10pO1xuXG4gIHVzZU1lbW8oKCkgPT4gZGlzcGF0Y2hUcmFuc2NyaXB0Rm9jdXMgJiYgZGlzcGF0Y2hUcmFuc2NyaXB0Rm9jdXMoeyBhY3Rpdml0eTogZm9jdXNlZEFjdGl2aXR5IH0pLCBbXG4gICAgZGlzcGF0Y2hUcmFuc2NyaXB0Rm9jdXMsXG4gICAgZm9jdXNlZEFjdGl2aXR5XG4gIF0pO1xuXG4gIC8vIFRoaXMgaXMgcmVxdWlyZWQgYnkgSUUxMS5cbiAgLy8gV2hlbiB0aGUgdXNlciBjbGlja3Mgb24gYW5kIGVtcHR5IHNwYWNlIChhLmsuYS4gZmlsbGVyKSBpbiBhbiBlbXB0eSB0cmFuc2NyaXB0LCBJRTExIHNheXMgdGhlIGZvY3VzIGlzIG9uIHRoZSA8ZGl2IGNsYXNzTmFtZT1cImZpbGxlclwiPixcbiAgLy8gZGVzcGl0ZSB0aGUgZmFjdCB0aGVyZSBhcmUgbm8gXCJ0YWJJbmRleFwiIGF0dHJpYnV0ZXMgc2V0IG9uIHRoZSBmaWxsZXIuXG4gIC8vIFdlIG5lZWQgdG8gYXJ0aWZpY2lhbGx5IHNlbmQgdGhlIGZvY3VzIGJhY2sgdG8gdGhlIHRyYW5zY3JpcHQuXG4gIGNvbnN0IGhhbmRsZUZvY3VzRmlsbGVyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IHsgY3VycmVudCB9ID0gcm9vdEVsZW1lbnRSZWY7XG5cbiAgICBjdXJyZW50ICYmIGN1cnJlbnQuZm9jdXMoKTtcbiAgfSwgW3Jvb3RFbGVtZW50UmVmXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQ9e2ZvY3VzZWRBY3Rpdml0eUtleSA/IGFjdGl2ZURlc2NlbmRhbnRFbGVtZW50SWQgOiB1bmRlZmluZWR9XG4gICAgICBhcmlhLWxhYmVsbGVkYnk9e2xhYmVsSWR9XG4gICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoXG4gICAgICAgICd3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0JyxcbiAgICAgICAgYmFzaWNUcmFuc2NyaXB0U3R5bGVTZXQgKyAnJyxcbiAgICAgICAgcm9vdENsYXNzTmFtZSxcbiAgICAgICAgKGNsYXNzTmFtZSB8fCAnJykgKyAnJ1xuICAgICAgKX1cbiAgICAgIGRpcj17ZGlyZWN0aW9ufVxuICAgICAgb25Gb2N1cz17aGFuZGxlVHJhbnNjcmlwdEZvY3VzfVxuICAgICAgb25LZXlEb3duPXtoYW5kbGVUcmFuc2NyaXB0S2V5RG93bn1cbiAgICAgIG9uS2V5RG93bkNhcHR1cmU9e2hhbmRsZVRyYW5zY3JpcHRLZXlEb3duQ2FwdHVyZX1cbiAgICAgIHJlZj17cm9vdEVsZW1lbnRSZWZ9XG4gICAgICAvLyBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiIHdpbGwgb25seSB3b3JrcyB3aXRoIGEgbnVtYmVyIG9mIHJvbGVzIGFuZCBpdCBtdXN0IGJlIGV4cGxpY2l0bHkgc2V0LlxuICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLyNhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcbiAgICAgIHJvbGU9XCJncm91cFwiXG4gICAgICAvLyBGb3IgdXAvZG93biBhcnJvdyBrZXkgbmF2aWdhdGlvbiBhY3Jvc3MgYWN0aXZpdGllcywgdGhpcyBjb21wb25lbnQgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgdGFiIHNlcXVlbmNlLlxuICAgICAgLy8gT3RoZXJ3aXNlLCBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiIHdpbGwgbm90IGJlIG5hcnJhdGVkIHdoZW4gdGhlIHVzZXIgcHJlc3MgdXAvZG93biBhcnJvdyBrZXlzLlxuICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLXByYWN0aWNlcy0xLjEvI2tiZF9mb2N1c19hY3RpdmVkZXNjZW5kYW50XG4gICAgICB0YWJJbmRleD17MH1cbiAgICA+XG4gICAgICA8U2NyZWVuUmVhZGVyVGV4dCBpZD17bGFiZWxJZH0gdGV4dD17dHJhbnNjcmlwdEFyaWFMYWJlbH0gLz5cbiAgICAgIHsvKiBUaGlzIDxzZWN0aW9uPiBpcyBmb3IgbGl2ZSByZWdpb24gb25seS4gQ29udGVudCBpcyBtYWRlIGludmlzaWJsZSB0aHJvdWdoIENTUy4gKi99XG4gICAgICA8c2VjdGlvblxuICAgICAgICBhcmlhLWF0b21pYz17ZmFsc2V9XG4gICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgIGFyaWEtcmVsZXZhbnQ9XCJhZGRpdGlvbnNcIlxuICAgICAgICBhcmlhLXJvbGVkZXNjcmlwdGlvbj17dHJhbnNjcmlwdFJvbGVEZXNjcmlwdGlvbn1cbiAgICAgICAgcm9sZT1cImxvZ1wiXG4gICAgICA+XG4gICAgICAgIHtyZW5kZXJpbmdFbGVtZW50cy5tYXAoKHsgYWN0aXZpdHksIGxpdmVSZWdpb25LZXkgfSkgPT4gKFxuICAgICAgICAgIDxGYWRlIGZhZGVBZnRlcj17aW50ZXJuYWxMaXZlUmVnaW9uRmFkZUFmdGVyfSBrZXk9e2xpdmVSZWdpb25LZXl9PlxuICAgICAgICAgICAgeygpID0+IDxTY3JlZW5SZWFkZXJBY3Rpdml0eSBhY3Rpdml0eT17YWN0aXZpdHl9IC8+fVxuICAgICAgICAgIDwvRmFkZT5cbiAgICAgICAgKSl9XG4gICAgICA8L3NlY3Rpb24+XG4gICAgICB7LyogVE9ETzogW1AyXSBGaXggRVNMaW50IGVycm9yIGBuby11c2UtYmVmb3JlLWRlZmluZWAgKi99XG4gICAgICB7LyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11c2UtYmVmb3JlLWRlZmluZSAqL31cbiAgICAgIDxJbnRlcm5hbFRyYW5zY3JpcHRTY3JvbGxhYmxlXG4gICAgICAgIGFjdGl2aXRpZXM9e3JlbmRlcmluZ0FjdGl2aXRpZXN9XG4gICAgICAgIG9uRm9jdXNBY3Rpdml0eT17aGFuZGxlRm9jdXNBY3Rpdml0eX1cbiAgICAgICAgb25Gb2N1c0ZpbGxlcj17aGFuZGxlRm9jdXNGaWxsZXJ9XG4gICAgICAgIHRlcm1pbmF0b3JSZWY9e3Rlcm1pbmF0b3JSZWZ9XG4gICAgICA+XG4gICAgICAgIHtyZW5kZXJpbmdFbGVtZW50cy5tYXAoXG4gICAgICAgICAgKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBhY3Rpdml0eSxcbiAgICAgICAgICAgICAgY2FsbGJhY2tSZWYsXG4gICAgICAgICAgICAgIGZvY3VzQWN0aXZpdHksXG4gICAgICAgICAgICAgIGhhbmRsZUZvY3VzLFxuICAgICAgICAgICAgICBoYW5kbGVLZXlEb3duLFxuICAgICAgICAgICAgICBoYW5kbGVNb3VzZURvd25DYXB0dXJlLFxuICAgICAgICAgICAgICBoaWRlVGltZXN0YW1wLFxuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIHJlbmRlckFjdGl2aXR5LFxuICAgICAgICAgICAgICByZW5kZXJBY3Rpdml0eVN0YXR1cyxcbiAgICAgICAgICAgICAgcmVuZGVyQXZhdGFyLFxuICAgICAgICAgICAgICByb2xlLFxuICAgICAgICAgICAgICBzaG91bGRTcGVhayxcbiAgICAgICAgICAgICAgc2hvd0NhbGxvdXRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbmRleFxuICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBhcmlhTGFiZWxJRCwgZWxlbWVudCB9ID1cbiAgICAgICAgICAgICAgYWN0aXZpdHlFbGVtZW50c1JlZi5jdXJyZW50LmZpbmQoZW50cnkgPT4gZW50cnkuYWN0aXZpdHkgPT09IGFjdGl2aXR5KSB8fCB7fTtcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZURlc2NlbmRhbnQgPSBmb2N1c2VkQWN0aXZpdHlLZXkgPT09IGtleTtcbiAgICAgICAgICAgIGNvbnN0IGlzQ29udGVudEludGVyYWN0aXZlID0gISEoZWxlbWVudFxuICAgICAgICAgICAgICA/IHRhYmJhYmxlRWxlbWVudHMoZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcud2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZpdHktYm94JykpLmxlbmd0aFxuICAgICAgICAgICAgICA6IDApO1xuXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICBhcmlhLWxhYmVsbGVkYnk9e2FyaWFMYWJlbElEfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcygnd2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZpdHknLCB7XG4gICAgICAgICAgICAgICAgICAnd2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZpdHktLWFja25vd2xlZGdlZCc6IGluZGV4IDw9IGluZGV4T2ZMYXN0SW50ZXJhY3RlZEFjdGl2aXR5LFxuICAgICAgICAgICAgICAgICAgJ3dlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2FjdGl2aXR5LS1mcm9tLWJvdCc6IHJvbGUgIT09ICd1c2VyJyxcbiAgICAgICAgICAgICAgICAgICd3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19hY3Rpdml0eS0tZnJvbS11c2VyJzogcm9sZSA9PT0gJ3VzZXInXG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgLy8gU2V0IFwiaWRcIiBmb3IgdmFsaWQgZm9yIGFjY2Vzc2liaWxpdHkuXG4gICAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L2ZvcmJpZC1kb20tcHJvcHMgKi9cbiAgICAgICAgICAgICAgICBpZD17YWN0aXZlRGVzY2VuZGFudCA/IGFjdGl2ZURlc2NlbmRhbnRFbGVtZW50SWQgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAga2V5PXtrZXl9XG4gICAgICAgICAgICAgICAgb25Gb2N1cz17aGFuZGxlRm9jdXN9XG4gICAgICAgICAgICAgICAgb25LZXlEb3duPXtoYW5kbGVLZXlEb3dufVxuICAgICAgICAgICAgICAgIG9uTW91c2VEb3duQ2FwdHVyZT17aGFuZGxlTW91c2VEb3duQ2FwdHVyZX1cbiAgICAgICAgICAgICAgICByZWY9e2NhbGxiYWNrUmVmfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPFNjcmVlblJlYWRlckFjdGl2aXR5IGFjdGl2aXR5PXthY3Rpdml0eX0gaWQ9e2FyaWFMYWJlbElEfSByZW5kZXJBdHRhY2htZW50cz17ZmFsc2V9PlxuICAgICAgICAgICAgICAgICAgeyEhaXNDb250ZW50SW50ZXJhY3RpdmUgJiYgPHA+e2FjdGl2aXR5SW50ZXJhY3RpdmVBbHR9PC9wPn1cbiAgICAgICAgICAgICAgICA8L1NjcmVlblJlYWRlckFjdGl2aXR5PlxuICAgICAgICAgICAgICAgIDxGb2N1c1JlZGlyZWN0b3JcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2FjdGl2aXR5LXNlbnRpbmVsXCJcbiAgICAgICAgICAgICAgICAgIG9uRm9jdXM9e2ZvY3VzQWN0aXZpdHl9XG4gICAgICAgICAgICAgICAgICByZWRpcmVjdFJlZj17cm9vdEVsZW1lbnRSZWZ9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2FjdGl2aXR5LWJveFwiPlxuICAgICAgICAgICAgICAgICAge3JlbmRlckFjdGl2aXR5KHtcbiAgICAgICAgICAgICAgICAgICAgaGlkZVRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyQWN0aXZpdHlTdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlckF2YXRhcixcbiAgICAgICAgICAgICAgICAgICAgc2hvd0NhbGxvdXRcbiAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIHtzaG91bGRTcGVhayAmJiA8U3BlYWtBY3Rpdml0eSBhY3Rpdml0eT17YWN0aXZpdHl9IC8+fVxuICAgICAgICAgICAgICAgIDxGb2N1c1JlZGlyZWN0b3JcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2FjdGl2aXR5LXNlbnRpbmVsXCJcbiAgICAgICAgICAgICAgICAgIG9uRm9jdXM9e2ZvY3VzQWN0aXZpdHl9XG4gICAgICAgICAgICAgICAgICByZWRpcmVjdFJlZj17cm9vdEVsZW1lbnRSZWZ9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoJ3dlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2FjdGl2aXR5LWluZGljYXRvcicsIHtcbiAgICAgICAgICAgICAgICAgICAgJ3dlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2FjdGl2aXR5LWluZGljYXRvci0tZmlyc3QnOiAhaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICd3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19hY3Rpdml0eS1pbmRpY2F0b3ItLWZvY3VzJzogYWN0aXZlRGVzY2VuZGFudFxuICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICApfVxuICAgICAgPC9JbnRlcm5hbFRyYW5zY3JpcHRTY3JvbGxhYmxlPlxuICAgICAgeyEhcmVuZGVyaW5nRWxlbWVudHMubGVuZ3RoICYmIChcbiAgICAgICAgPFJlYWN0LkZyYWdtZW50PlxuICAgICAgICAgIDxGb2N1c1JlZGlyZWN0b3JcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cIndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX3NlbnRpbmVsXCJcbiAgICAgICAgICAgIG9uRm9jdXM9e3NldEJvdHRvbW1vc3RGb2N1c2VkQWN0aXZpdHlLZXlJZk5lZWRlZH1cbiAgICAgICAgICAgIHJlZGlyZWN0UmVmPXtyb290RWxlbWVudFJlZn1cbiAgICAgICAgICAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fdGVybWluYXRvclwiIHJlZj17dGVybWluYXRvclJlZn0gdGFiSW5kZXg9ezB9PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X190ZXJtaW5hdG9yLWJvZHlcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X190ZXJtaW5hdG9yLXRleHRcIj57dGVybWluYXRvclRleHR9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgICAgICl9XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2ZvY3VzLWluZGljYXRvclwiIC8+XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5JbnRlcm5hbFRyYW5zY3JpcHQuZGVmYXVsdFByb3BzID0ge1xuICBjbGFzc05hbWU6ICcnXG59O1xuXG5JbnRlcm5hbFRyYW5zY3JpcHQucHJvcFR5cGVzID0ge1xuICBhY3Rpdml0eUVsZW1lbnRzUmVmOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGN1cnJlbnQ6IFByb3BUeXBlcy5hcnJheS5pc1JlcXVpcmVkXG4gIH0pLmlzUmVxdWlyZWQsXG4gIGNsYXNzTmFtZTogUHJvcFR5cGVzLnN0cmluZ1xufTtcblxuY29uc3QgSW50ZXJuYWxTY3JlZW5SZWFkZXJUcmFuc2NyaXB0ID0gKHsgcmVuZGVyaW5nRWxlbWVudHMgfSkgPT4ge1xuICBjb25zdCBsb2NhbGl6ZSA9IHVzZUxvY2FsaXplcigpO1xuICBjb25zdCBbaW50ZXJuYWxMaXZlUmVnaW9uRmFkZUFmdGVyXSA9IHVzZVN0eWxlT3B0aW9ucygpO1xuXG4gIGNvbnN0IHRyYW5zY3JpcHRSb2xlRGVzY3JpcHRpb24gPSBsb2NhbGl6ZSgnVFJBTlNDUklQVF9BUklBX1JPTEVfQUxUJyk7XG5cbiAgcmV0dXJuIChcbiAgICA8c2VjdGlvblxuICAgICAgYXJpYS1hdG9taWM9e2ZhbHNlfVxuICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgIGFyaWEtcmVsZXZhbnQ9XCJhZGRpdGlvbnNcIlxuICAgICAgYXJpYS1yb2xlZGVzY3JpcHRpb249e3RyYW5zY3JpcHRSb2xlRGVzY3JpcHRpb259XG4gICAgICByb2xlPVwibG9nXCJcbiAgICA+XG4gICAgICB7cmVuZGVyaW5nRWxlbWVudHMubWFwKCh7IGFjdGl2aXR5LCBsaXZlUmVnaW9uS2V5IH0pID0+IChcbiAgICAgICAgPEZhZGUgZmFkZUFmdGVyPXtpbnRlcm5hbExpdmVSZWdpb25GYWRlQWZ0ZXJ9IGtleT17bGl2ZVJlZ2lvbktleX0+XG4gICAgICAgICAgeygpID0+IDxTY3JlZW5SZWFkZXJBY3Rpdml0eSBhY3Rpdml0eT17YWN0aXZpdHl9IC8+fVxuICAgICAgICA8L0ZhZGU+XG4gICAgICApKX1cbiAgICA8L3NlY3Rpb24+XG4gICk7XG59O1xuXG5JbnRlcm5hbFNjcmVlblJlYWRlclRyYW5zY3JpcHQucHJvcFR5cGVzID0ge1xuICByZW5kZXJpbmdFbGVtZW50czogUHJvcFR5cGVzLmFycmF5T2YoXG4gICAgUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIGFjdGl2aXR5OiBQcm9wVHlwZXMuYW55LFxuICAgICAgbGl2ZVJlZ2lvbktleTogUHJvcFR5cGVzLnN0cmluZ1xuICAgIH0pXG4gICkuaXNSZXF1aXJlZFxufTtcblxuLy8gU2VwYXJhdGluZyBoaWdoLWZyZXF1ZW5jeSBob29rcyB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLlxuY29uc3QgSW50ZXJuYWxUcmFuc2NyaXB0U2Nyb2xsYWJsZSA9ICh7IGFjdGl2aXRpZXMsIGNoaWxkcmVuLCBvbkZvY3VzQWN0aXZpdHksIG9uRm9jdXNGaWxsZXIsIHRlcm1pbmF0b3JSZWYgfSkgPT4ge1xuICBjb25zdCBbeyBhY3Rpdml0aWVzOiBhY3Rpdml0aWVzU3R5bGVTZXQgfV0gPSB1c2VTdHlsZVNldCgpO1xuICBjb25zdCBbeyBoaWRlU2Nyb2xsVG9FbmRCdXR0b24gfV0gPSB1c2VTdHlsZU9wdGlvbnMoKTtcbiAgY29uc3QgW2FuaW1hdGluZ1RvRW5kXSA9IHVzZUFuaW1hdGluZ1RvRW5kKCk7XG4gIGNvbnN0IFtzdGlja3ldID0gdXNlU3RpY2t5KCk7XG4gIGNvbnN0IGxhc3RWaXNpYmxlQWN0aXZpdHlJZCA9IGdldEFjdGl2aXR5VW5pcXVlSWQoYWN0aXZpdGllc1thY3Rpdml0aWVzLmxlbmd0aCAtIDFdIHx8IHt9KTsgLy8gQWN0aXZpdHkgSUQgb2YgdGhlIGxhc3QgdmlzaWJsZSBhY3Rpdml0eSBpbiB0aGUgbGlzdC5cbiAgY29uc3QgbG9jYWxpemUgPSB1c2VMb2NhbGl6ZXIoKTtcbiAgY29uc3Qgc2Nyb2xsVG9FbmRCdXR0b25SZWYgPSB1c2VSZWYoKTtcblxuICBjb25zdCBsYXN0UmVhZEFjdGl2aXR5SWRSZWYgPSB1c2VSZWYobGFzdFZpc2libGVBY3Rpdml0eUlkKTtcbiAgY29uc3QgdHJhbnNjcmlwdFJvbGVEZXNjcmlwdGlvbiA9IGxvY2FsaXplKCdUUkFOU0NSSVBUX0FSSUFfUk9MRV9BTFQnKTtcblxuICBjb25zdCBhbGxBY3Rpdml0aWVzUmVhZCA9IGxhc3RWaXNpYmxlQWN0aXZpdHlJZCA9PT0gbGFzdFJlYWRBY3Rpdml0eUlkUmVmLmN1cnJlbnQ7XG5cbiAgY29uc3QgaGFuZGxlU2Nyb2xsVG9FbmRCdXR0b25DbGljayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAvLyBBZnRlciB0aGUgXCJOZXcgbWVzc2FnZVwiIGJ1dHRvbiBpcyBjbGlja2VkLCBmb2N1cyBvbiB0aGUgZmlyc3QgdW5yZWFkIGFjdGl2aXR5LlxuICAgIGNvbnN0IGluZGV4ID0gYWN0aXZpdGllcy5maW5kSW5kZXgoKHsgaWQgfSkgPT4gaWQgPT09IGxhc3RSZWFkQWN0aXZpdHlJZFJlZi5jdXJyZW50KTtcblxuICAgIGlmICh+aW5kZXgpIHtcbiAgICAgIGNvbnN0IGZpcnN0VW5yZWFkQWN0aXZpdHkgPSBhY3Rpdml0aWVzW2luZGV4ICsgMV07XG5cbiAgICAgIGlmIChmaXJzdFVucmVhZEFjdGl2aXR5KSB7XG4gICAgICAgIHJldHVybiBvbkZvY3VzQWN0aXZpdHkoZ2V0QWN0aXZpdHlVbmlxdWVJZChmaXJzdFVucmVhZEFjdGl2aXR5KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeyBjdXJyZW50IH0gPSB0ZXJtaW5hdG9yUmVmO1xuXG4gICAgY3VycmVudCAmJiBjdXJyZW50LmZvY3VzKCk7XG4gIH0sIFthY3Rpdml0aWVzLCBsYXN0UmVhZEFjdGl2aXR5SWRSZWYsIG9uRm9jdXNBY3Rpdml0eSwgdGVybWluYXRvclJlZl0pO1xuXG4gIGlmIChzdGlja3kpIHtcbiAgICAvLyBJZiBpdCBpcyBzdGlja3ksIHRoZSB1c2VyIGlzIGF0IHRoZSBib3R0b20gb2YgdGhlIHRyYW5zY3JpcHQsIGV2ZXJ5dGhpbmcgaXMgcmVhZC5cbiAgICAvLyBTbyBtYXJrIHRoZSBhY3Rpdml0eSBJRCBhcyByZWFkLlxuICAgIGxhc3RSZWFkQWN0aXZpdHlJZFJlZi5jdXJyZW50ID0gbGFzdFZpc2libGVBY3Rpdml0eUlkO1xuICB9XG5cbiAgLy8gRmluZHMgd2hlcmUgd2Ugc2hvdWxkIHJlbmRlciB0aGUgXCJOZXcgbWVzc2FnZXNcIiBidXR0b24sIGluIGluZGV4LiBSZXR1cm5zIC0xIHRvIGhpZGUgdGhlIGJ1dHRvbi5cbiAgY29uc3QgcmVuZGVyU2VwYXJhdG9yQWZ0ZXJJbmRleCA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIC8vIERvbid0IHNob3cgdGhlIGJ1dHRvbiBpZjpcbiAgICAvLyAtIEFsbCBhY3Rpdml0aWVzIGhhdmUgYmVlbiByZWFkXG4gICAgLy8gLSBDdXJyZW50bHkgYW5pbWF0aW5nIHRvd2FyZHMgYm90dG9tXG4gICAgLy8gICAtIFwiTmV3IG1lc3NhZ2VzXCIgYnV0dG9uIG11c3Qgbm90IGZsYXNoIHdoZW46IDEuIFR5cGUgXCJoZWxwXCIsIDIuIFNjcm9sbCB0byB0b3AsIDMuIFR5cGUgXCJoZWxwXCIgYWdhaW4sIDQuIEV4cGVjdCB0aGUgXCJOZXcgbWVzc2FnZXNcIiBidXR0b24gbm90IGZsYXNoeVxuICAgIC8vIC0gSGlkZGVuIGJ5IHN0eWxlIG9wdGlvbnNcbiAgICAvLyAtIEl0IGlzIGFscmVhZHkgYXQgdGhlIGJvdHRvbSAoc3RpY2t5KVxuXG4gICAgLy8gQW55IGNoYW5nZXMgdG8gdGhpcyBsb2dpYywgdmVyaWZ5OlxuICAgIC8vIC0gXCJOZXcgbWVzc2FnZXNcIiBidXR0b24gc2hvdWxkIHBlcnNpc3Qgd2hpbGUgcHJvZ3JhbW1hdGljYWxseSBzY3JvbGxpbmcgdG8gbWlkLXBvaW50IG9mIHRoZSB0cmFuc2NyaXB0OlxuICAgIC8vICAgMS4gVHlwZSBcImhlbHBcIlxuICAgIC8vICAgMi4gVHlwZSBcInByb2FjdGl2ZVwiLCB0aGVuIGltbWVkaWF0ZWx5IHNjcm9sbCB0byB0b3BcbiAgICAvLyAgICAgIEV4cGVjdDogdGhlIFwiTmV3IG1lc3NhZ2VzXCIgYnV0dG9uIHNob3VsZCBhcHBlYXJcbiAgICAvLyAgIDMuIFJ1biBob29rIFwidXNlU2Nyb2xsVG8oeyBzY3JvbGxUb3A6IDUwMCB9KVwiXG4gICAgLy8gICAgICBFeHBlY3Q6IHdoZW4gdGhlIHNjcm9sbCBpcyBhbmltYXRpbmcgdG8gNTAwcHgsIHRoZSBcIk5ldyBtZXNzYWdlc1wiIGJ1dHRvbiBzaG91bGQga2VwdCBvbiB0aGUgc2NyZWVuXG4gICAgLy8gLSBcIk5ldyBtZXNzYWdlc1wiIGJ1dHRvbiBtdXN0IG5vdCBmbGFzaHk6XG4gICAgLy8gICAxLiBUeXBlIFwiaGVscFwiXG4gICAgLy8gICAyLiBTY3JvbGwgdG8gdG9wXG4gICAgLy8gICAgICBFeHBlY3Q6IG5vIFwiTmV3IG1lc3NhZ2VzXCIgYnV0dG9uIGlzIHNob3duXG4gICAgLy8gICAzLiBUeXBlIFwiaGVscFwiIGFnYWluXG4gICAgLy8gICAgICBFeHBlY3Q6IFwiTmV3IG1lc3NhZ2VzXCIgYnV0dG9uIG11c3Qgbm90IGZsYXNoLWFwcGVhclxuXG4gICAgaWYgKGFsbEFjdGl2aXRpZXNSZWFkIHx8IGFuaW1hdGluZ1RvRW5kIHx8IGhpZGVTY3JvbGxUb0VuZEJ1dHRvbiB8fCBzdGlja3kpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aXZpdGllcy5maW5kSW5kZXgoYWN0aXZpdHkgPT4gZ2V0QWN0aXZpdHlVbmlxdWVJZChhY3Rpdml0eSkgPT09IGxhc3RSZWFkQWN0aXZpdHlJZFJlZi5jdXJyZW50KTtcbiAgfSwgW2FjdGl2aXRpZXMsIGFsbEFjdGl2aXRpZXNSZWFkLCBhbmltYXRpbmdUb0VuZCwgaGlkZVNjcm9sbFRvRW5kQnV0dG9uLCBsYXN0UmVhZEFjdGl2aXR5SWRSZWYsIHN0aWNreV0pO1xuXG4gIHJldHVybiAoXG4gICAgPFJlYWN0LkZyYWdtZW50PlxuICAgICAge3JlbmRlclNlcGFyYXRvckFmdGVySW5kZXggIT09IC0xICYmIChcbiAgICAgICAgPFNjcm9sbFRvRW5kQnV0dG9uIG9uQ2xpY2s9e2hhbmRsZVNjcm9sbFRvRW5kQnV0dG9uQ2xpY2t9IHJlZj17c2Nyb2xsVG9FbmRCdXR0b25SZWZ9IC8+XG4gICAgICApfVxuICAgICAgeyEhUmVhY3QuQ2hpbGRyZW4uY291bnQoY2hpbGRyZW4pICYmIChcbiAgICAgICAgPEZvY3VzUmVkaXJlY3RvciBjbGFzc05hbWU9XCJ3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19zZW50aW5lbFwiIHJlZGlyZWN0UmVmPXt0ZXJtaW5hdG9yUmVmfSAvPlxuICAgICAgKX1cbiAgICAgIDxSZWFjdFNjcm9sbFRvQm90dG9tUGFuZWwgY2xhc3NOYW1lPVwid2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fc2Nyb2xsYWJsZVwiPlxuICAgICAgICA8ZGl2IGFyaWEtaGlkZGVuPXt0cnVlfSBjbGFzc05hbWU9XCJ3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19maWxsZXJcIiBvbkZvY3VzPXtvbkZvY3VzRmlsbGVyfSAvPlxuICAgICAgICA8dWxcbiAgICAgICAgICBhcmlhLXJvbGVkZXNjcmlwdGlvbj17dHJhbnNjcmlwdFJvbGVEZXNjcmlwdGlvbn1cbiAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoYWN0aXZpdGllc1N0eWxlU2V0ICsgJycsICd3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X190cmFuc2NyaXB0Jyl9XG4gICAgICAgICAgcm9sZT1cImxpc3RcIlxuICAgICAgICA+XG4gICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8L3VsPlxuICAgICAgICA8QmFzaWNUeXBpbmdJbmRpY2F0b3IgLz5cbiAgICAgIDwvUmVhY3RTY3JvbGxUb0JvdHRvbVBhbmVsPlxuICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gICk7XG59O1xuXG5JbnRlcm5hbFRyYW5zY3JpcHRTY3JvbGxhYmxlLnByb3BUeXBlcyA9IHtcbiAgYWN0aXZpdGllczogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXG4gIGNoaWxkcmVuOiBQcm9wVHlwZXMuYW55LmlzUmVxdWlyZWQsXG4gIG9uRm9jdXNBY3Rpdml0eTogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgb25Gb2N1c0ZpbGxlcjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgdGVybWluYXRvclJlZjogUHJvcFR5cGVzLmFueS5pc1JlcXVpcmVkXG59O1xuXG5jb25zdCBTZXRTY3JvbGxlciA9ICh7IGFjdGl2aXR5RWxlbWVudHNSZWYsIHNjcm9sbGVyUmVmIH0pID0+IHtcbiAgY29uc3QgW1xuICAgIHsgYXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5LCBhdXRvU2Nyb2xsU25hcE9uQWN0aXZpdHlPZmZzZXQsIGF1dG9TY3JvbGxTbmFwT25QYWdlLCBhdXRvU2Nyb2xsU25hcE9uUGFnZU9mZnNldCB9XG4gIF0gPSB1c2VTdHlsZU9wdGlvbnMoKTtcbiAgY29uc3QgW2xhc3RBY2tub3dsZWRnZWRBY3Rpdml0eV0gPSB1c2VBY2tub3dsZWRnZWRBY3Rpdml0eSgpO1xuXG4gIGNvbnN0IGxhc3RBY2tub3dsZWRnZWRBY3Rpdml0eVJlZiA9IHVzZVJlZihsYXN0QWNrbm93bGVkZ2VkQWN0aXZpdHkpO1xuXG4gIGxhc3RBY2tub3dsZWRnZWRBY3Rpdml0eVJlZi5jdXJyZW50ID0gbGFzdEFja25vd2xlZGdlZEFjdGl2aXR5O1xuXG4gIHNjcm9sbGVyUmVmLmN1cnJlbnQgPSB1c2VDYWxsYmFjayhcbiAgICAoeyBvZmZzZXRIZWlnaHQsIHNjcm9sbFRvcCB9KSA9PiB7XG4gICAgICBjb25zdCBwYXRjaGVkQXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5ID1cbiAgICAgICAgdHlwZW9mIGF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eSA9PT0gJ251bWJlcidcbiAgICAgICAgICA/IE1hdGgubWF4KDAsIGF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eSlcbiAgICAgICAgICA6IGF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eVxuICAgICAgICAgID8gMVxuICAgICAgICAgIDogMDtcbiAgICAgIGNvbnN0IHBhdGNoZWRBdXRvU2Nyb2xsU25hcE9uUGFnZSA9XG4gICAgICAgIHR5cGVvZiBhdXRvU2Nyb2xsU25hcE9uUGFnZSA9PT0gJ251bWJlcidcbiAgICAgICAgICA/IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGF1dG9TY3JvbGxTbmFwT25QYWdlKSlcbiAgICAgICAgICA6IGF1dG9TY3JvbGxTbmFwT25QYWdlXG4gICAgICAgICAgPyAxXG4gICAgICAgICAgOiAwO1xuICAgICAgY29uc3QgcGF0Y2hlZEF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eU9mZnNldCA9XG4gICAgICAgIHR5cGVvZiBhdXRvU2Nyb2xsU25hcE9uQWN0aXZpdHlPZmZzZXQgPT09ICdudW1iZXInID8gYXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5T2Zmc2V0IDogMDtcbiAgICAgIGNvbnN0IHBhdGNoZWRBdXRvU2Nyb2xsU25hcE9uUGFnZU9mZnNldCA9XG4gICAgICAgIHR5cGVvZiBhdXRvU2Nyb2xsU25hcE9uUGFnZU9mZnNldCA9PT0gJ251bWJlcicgPyBhdXRvU2Nyb2xsU25hcE9uUGFnZU9mZnNldCA6IDA7XG5cbiAgICAgIGlmIChwYXRjaGVkQXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5IHx8IHBhdGNoZWRBdXRvU2Nyb2xsU25hcE9uUGFnZSkge1xuICAgICAgICBjb25zdCB7IGN1cnJlbnQ6IGxhc3RBY2tub3dsZWRnZWRBY3Rpdml0eSB9ID0gbGFzdEFja25vd2xlZGdlZEFjdGl2aXR5UmVmO1xuXG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuXG4gICAgICAgIGlmIChwYXRjaGVkQXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5KSB7XG4gICAgICAgICAgY29uc3QgeyBlbGVtZW50OiBudGhVbmFja25vd2xlZGdlZEFjdGl2aXR5RWxlbWVudCB9ID1cbiAgICAgICAgICAgIGFjdGl2aXR5RWxlbWVudHNSZWYuY3VycmVudFtcbiAgICAgICAgICAgICAgYWN0aXZpdHlFbGVtZW50c1JlZi5jdXJyZW50LmZpbmRJbmRleCgoeyBhY3Rpdml0eSB9KSA9PiBhY3Rpdml0eSA9PT0gbGFzdEFja25vd2xlZGdlZEFjdGl2aXR5KSArXG4gICAgICAgICAgICAgICAgcGF0Y2hlZEF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eVxuICAgICAgICAgICAgXSB8fCB7fTtcblxuICAgICAgICAgIGlmIChudGhVbmFja25vd2xlZGdlZEFjdGl2aXR5RWxlbWVudCkge1xuICAgICAgICAgICAgdmFsdWVzLnB1c2goXG4gICAgICAgICAgICAgIG50aFVuYWNrbm93bGVkZ2VkQWN0aXZpdHlFbGVtZW50Lm9mZnNldFRvcCArXG4gICAgICAgICAgICAgICAgbnRoVW5hY2tub3dsZWRnZWRBY3Rpdml0eUVsZW1lbnQub2Zmc2V0SGVpZ2h0IC1cbiAgICAgICAgICAgICAgICBvZmZzZXRIZWlnaHQgLVxuICAgICAgICAgICAgICAgIHNjcm9sbFRvcCArXG4gICAgICAgICAgICAgICAgcGF0Y2hlZEF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eU9mZnNldFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF0Y2hlZEF1dG9TY3JvbGxTbmFwT25QYWdlKSB7XG4gICAgICAgICAgY29uc3QgeyBlbGVtZW50OiBmaXJzdFVuYWNrbm93bGVkZ2VkQWN0aXZpdHlFbGVtZW50IH0gPVxuICAgICAgICAgICAgYWN0aXZpdHlFbGVtZW50c1JlZi5jdXJyZW50W1xuICAgICAgICAgICAgICBhY3Rpdml0eUVsZW1lbnRzUmVmLmN1cnJlbnQuZmluZEluZGV4KCh7IGFjdGl2aXR5IH0pID0+IGFjdGl2aXR5ID09PSBsYXN0QWNrbm93bGVkZ2VkQWN0aXZpdHkpICsgMVxuICAgICAgICAgICAgXSB8fCB7fTtcblxuICAgICAgICAgIGlmIChmaXJzdFVuYWNrbm93bGVkZ2VkQWN0aXZpdHlFbGVtZW50KSB7XG4gICAgICAgICAgICB2YWx1ZXMucHVzaChcbiAgICAgICAgICAgICAgZmlyc3RVbmFja25vd2xlZGdlZEFjdGl2aXR5RWxlbWVudC5vZmZzZXRUb3AgLVxuICAgICAgICAgICAgICAgIHNjcm9sbFRvcCAtXG4gICAgICAgICAgICAgICAgb2Zmc2V0SGVpZ2h0ICogKDEgLSBwYXRjaGVkQXV0b1Njcm9sbFNuYXBPblBhZ2UpICtcbiAgICAgICAgICAgICAgICBwYXRjaGVkQXV0b1Njcm9sbFNuYXBPblBhZ2VPZmZzZXRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlcy5yZWR1Y2UoKG1pblZhbHVlLCB2YWx1ZSkgPT4gTWF0aC5taW4obWluVmFsdWUsIHZhbHVlKSwgSW5maW5pdHkpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gSW5maW5pdHk7XG4gICAgfSxcbiAgICBbXG4gICAgICBhY3Rpdml0eUVsZW1lbnRzUmVmLFxuICAgICAgYXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5LFxuICAgICAgYXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5T2Zmc2V0LFxuICAgICAgYXV0b1Njcm9sbFNuYXBPblBhZ2UsXG4gICAgICBhdXRvU2Nyb2xsU25hcE9uUGFnZU9mZnNldCxcbiAgICAgIGxhc3RBY2tub3dsZWRnZWRBY3Rpdml0eVJlZlxuICAgIF1cbiAgKTtcblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBCYXNpY1RyYW5zY3JpcHQgPSAoeyBjbGFzc05hbWUgfSkgPT4ge1xuICBjb25zdCBhY3Rpdml0eUVsZW1lbnRzUmVmID0gdXNlUmVmKFtdKTtcbiAgY29uc3Qgc2Nyb2xsZXJSZWYgPSB1c2VSZWYoKCkgPT4gSW5maW5pdHkpO1xuXG4gIGNvbnN0IHNjcm9sbGVyID0gdXNlQ2FsbGJhY2soKC4uLmFyZ3MpID0+IHNjcm9sbGVyUmVmLmN1cnJlbnQoLi4uYXJncyksIFtzY3JvbGxlclJlZl0pO1xuXG4gIHJldHVybiAoXG4gICAgPFJlYWN0U2Nyb2xsVG9Cb3R0b21Db21wb3NlciBzY3JvbGxlcj17c2Nyb2xsZXJ9PlxuICAgICAgPFNldFNjcm9sbGVyIGFjdGl2aXR5RWxlbWVudHNSZWY9e2FjdGl2aXR5RWxlbWVudHNSZWZ9IHNjcm9sbGVyUmVmPXtzY3JvbGxlclJlZn0gLz5cbiAgICAgIDxJbnRlcm5hbFRyYW5zY3JpcHQgYWN0aXZpdHlFbGVtZW50c1JlZj17YWN0aXZpdHlFbGVtZW50c1JlZn0gY2xhc3NOYW1lPXtjbGFzc05hbWV9IC8+XG4gICAgPC9SZWFjdFNjcm9sbFRvQm90dG9tQ29tcG9zZXI+XG4gICk7XG59O1xuXG5CYXNpY1RyYW5zY3JpcHQuZGVmYXVsdFByb3BzID0ge1xuICBjbGFzc05hbWU6ICcnXG59O1xuXG5CYXNpY1RyYW5zY3JpcHQucHJvcFR5cGVzID0ge1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmdcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEJhc2ljVHJhbnNjcmlwdDtcbiJdfQ==
|
|
1196
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9CYXNpY1RyYW5zY3JpcHQuanMiXSwibmFtZXMiOlsidXNlQWN0aXZpdGllcyIsImhvb2tzIiwidXNlQ3JlYXRlQWN0aXZpdHlSZW5kZXJlciIsInVzZUNyZWF0ZUFjdGl2aXR5U3RhdHVzUmVuZGVyZXIiLCJ1c2VDcmVhdGVBdmF0YXJSZW5kZXJlciIsInVzZUNyZWF0ZVNjcm9sbFRvRW5kQnV0dG9uUmVuZGVyZXIiLCJ1c2VEaXJlY3Rpb24iLCJ1c2VHcm91cEFjdGl2aXRpZXMiLCJ1c2VMb2NhbGl6ZXIiLCJ1c2VTdHlsZU9wdGlvbnMiLCJST09UX1NUWUxFIiwiZGlzcGxheSIsImZsZXhEaXJlY3Rpb24iLCJvdmVyZmxvdyIsInBvc2l0aW9uIiwiZmxleCIsIm92ZXJmbG93WCIsIldlYmtpdE92ZXJmbG93U2Nyb2xsaW5nIiwibGlzdFN0eWxlVHlwZSIsInZhbGlkYXRlQWxsQWN0aXZpdGllc1RhZ2dlZCIsImFjdGl2aXRpZXMiLCJiaW5zIiwiZXZlcnkiLCJhY3Rpdml0eSIsInNvbWUiLCJiaW4iLCJpbmNsdWRlcyIsIkludGVybmFsVHJhbnNjcmlwdCIsImFjdGl2aXR5RWxlbWVudHNSZWYiLCJjbGFzc05hbWUiLCJiYXNpY1RyYW5zY3JpcHRTdHlsZVNldCIsImJhc2ljVHJhbnNjcmlwdCIsImJ1YmJsZUZyb21Vc2VyTnViT2Zmc2V0IiwiYnViYmxlTnViT2Zmc2V0IiwiZ3JvdXBUaW1lc3RhbXAiLCJpbnRlcm5hbExpdmVSZWdpb25GYWRlQWZ0ZXIiLCJzaG93QXZhdGFySW5Hcm91cCIsImZvY3VzZWRBY3Rpdml0eUtleSIsInNldEZvY3VzZWRBY3Rpdml0eUtleSIsImRpcmVjdGlvbiIsImNyZWF0ZUFjdGl2aXR5UmVuZGVyZXIiLCJjcmVhdGVBY3Rpdml0eVN0YXR1c1JlbmRlcmVyIiwiY3JlYXRlQXZhdGFyUmVuZGVyZXIiLCJmb2N1cyIsImdyb3VwQWN0aXZpdGllcyIsImxvY2FsaXplIiwicm9vdENsYXNzTmFtZSIsInJvb3RFbGVtZW50UmVmIiwidGVybWluYXRvclJlZiIsImFjdGl2aXR5SW50ZXJhY3RpdmVBbHQiLCJ0ZXJtaW5hdG9yVGV4dCIsInRyYW5zY3JpcHRBcmlhTGFiZWwiLCJ0cmFuc2NyaXB0Um9sZURlc2NyaXB0aW9uIiwiaGlkZUFsbFRpbWVzdGFtcHMiLCJjcmVhdGVBY3Rpdml0eVJlbmRlcmVyV2l0aExpdGVyYWxBcmdzIiwibmV4dFZpc2libGVBY3Rpdml0eSIsImFjdGl2aXRpZXNXaXRoUmVuZGVyZXIiLCJjcmVhdGVBY3Rpdml0eVJlbmRlcmVyV2l0aExpdGVyYWxBcmdzTWVtb2l6ZWQiLCJpbmRleCIsImxlbmd0aCIsInJlbmRlckFjdGl2aXR5Iiwic3BsaWNlIiwidmlzaWJsZUFjdGl2aXRpZXMiLCJtYXAiLCJhY3Rpdml0aWVzR3JvdXBCeVNlbmRlciIsInNlbmRlciIsImFjdGl2aXRpZXNHcm91cEJ5U3RhdHVzIiwic3RhdHVzIiwiY29uc29sZSIsIndhcm4iLCJhY3Rpdml0eVRyZWUiLCJ2aXNpYmxlQWN0aXZpdGllc1BlbmRpbmdHcm91cGluZyIsInNlbmRlclRyZWUiLCJhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXIiLCJmaW5kIiwicHVzaCIsImZvckVhY2giLCJhY3Rpdml0aWVzV2l0aFNhbWVTdGF0dXMiLCJhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXJBbmRTdGF0dXMiLCJyZW1vdmVJbmxpbmUiLCJyZW5kZXJpbmdFbGVtZW50cyIsInRvcFNpZGVCb3ROdWIiLCJ0b3BTaWRlVXNlck51YiIsImZpcnN0QWN0aXZpdHkiLCJyZW5kZXJBdmF0YXIiLCJpbmRleFdpdGhpblNlbmRlckdyb3VwIiwiZmlyc3RJblNlbmRlckdyb3VwIiwibGFzdEluU2VuZGVyR3JvdXAiLCJpbmRleFdpdGhpblNlbmRlckFuZFN0YXR1c0dyb3VwIiwicmVuZGVyQWN0aXZpdHlTdGF0dXMiLCJmaXJzdEluU2VuZGVyQW5kU3RhdHVzR3JvdXAiLCJsYXN0SW5TZW5kZXJBbmRTdGF0dXNHcm91cCIsImVudHJ5Iiwia2V5IiwiYmFzZUFsdFRleHQiLCJjaGFubmVsRGF0YSIsIm1lc3NhZ2VCYWNrIiwiZGlzcGxheVRleHQiLCJ0ZXh0Iiwic3VwcG9ydFNjcmVlblJlYWRlciIsInJvbGUiLCJmcm9tIiwidG9wU2lkZU51YiIsInNob3dDYWxsb3V0IiwiZm9jdXNBY3Rpdml0eSIsInJvb3RFbGVtZW50IiwiY3VycmVudCIsImNhbGxiYWNrUmVmIiwiYWN0aXZpdHlFbGVtZW50IiwiYWN0aXZpdHlJRCIsImlkIiwiZWxlbWVudCIsImhhbmRsZUZvY3VzIiwiaGFuZGxlS2V5RG93biIsImV2ZW50IiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJoYW5kbGVNb3VzZURvd25DYXB0dXJlIiwidGFyZ2V0IiwidGFiSW5kZXgiLCJnZXRBdHRyaWJ1dGUiLCJoaWRlVGltZXN0YW1wIiwibGl2ZVJlZ2lvbktleSIsInNob3VsZFNwZWFrIiwic3BlYWsiLCJhY3Rpdml0eUVsZW1lbnRzIiwiZWxlbWVudElkIiwiZXhpc3RpbmdFbnRyeSIsImFyaWFMYWJlbElEIiwidG9TdHJpbmciLCJzdWJzdHIiLCJmb2N1c2VkIiwibGFzdEVsZW1lbnQiLCJyZW5kZXJpbmdBY3Rpdml0aWVzIiwic2Nyb2xsVG9Cb3R0b21TY3JvbGxUbyIsInNjcm9sbFRvQm90dG9tU2Nyb2xsVG9FbmQiLCJzY3JvbGxUbyIsImJlaGF2aW9yIiwiRXJyb3IiLCJzY3JvbGxUb3AiLCJzY3JvbGxhYmxlRWxlbWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJnZXRDbGllbnRSZWN0cyIsImFjdGl2aXR5RWxlbWVudEhlaWdodCIsImhlaWdodCIsImFjdGl2aXR5RWxlbWVudFkiLCJ5Iiwic2Nyb2xsYWJsZUhlaWdodCIsImFjdGl2aXR5RWxlbWVudE9mZnNldFRvcCIsIk1hdGgiLCJtaW4iLCJzY3JvbGxUb0VuZCIsInNjcm9sbFJlbGF0aXZlIiwiZGlzcGxhY2VtZW50Iiwic2Nyb2xsYWJsZSIsIm5leHRTY3JvbGxUb3AiLCJvZmZzZXRIZWlnaHQiLCJtYXgiLCJzY3JvbGxIZWlnaHQiLCJkaXNwYXRjaFNjcm9sbFBvc2l0aW9uIiwicGF0Y2hlZERpc3BhdGNoU2Nyb2xsUG9zaXRpb24iLCJyZXZlcnNlIiwibGFzdEludGVyYWN0ZWRBY3Rpdml0eSIsImluZGV4T2ZMYXN0SW50ZXJhY3RlZEFjdGl2aXR5IiwiaW5kZXhPZiIsImFjdGl2ZURlc2NlbmRhbnRFbGVtZW50SWQiLCJzY3JvbGxBY3RpdmVEZXNjZW5kYW50SW50b1ZpZXciLCJhY3RpdmVEZXNjZW5kYW50IiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImNvbnRhaW5zIiwiYWN0aXZlRWxlbWVudCIsImRvY3VtZW50RWxlbWVudCIsInN0eWxlIiwic2Nyb2xsSW50b1ZpZXciLCJibG9jayIsInNjcm9sbFRvcEF0VG9wU2lkZSIsIm9mZnNldFRvcCIsInNjcm9sbFRvcEF0Qm90dG9tU2lkZSIsImhhbmRsZVRyYW5zY3JpcHRGb2N1cyIsImN1cnJlbnRUYXJnZXQiLCJ1bmRlZmluZWQiLCJmb2N1c1JlbGF0aXZlQWN0aXZpdHkiLCJkZWx0YSIsImlzTmFOIiwiZmluZEluZGV4IiwibmV4dEluZGV4IiwibmV4dEZvY3VzZWRBY3Rpdml0eSIsImhhbmRsZVRyYW5zY3JpcHRLZXlEb3duIiwiZnJvbUVuZE9mVHJhbnNjcmlwdEluZGljYXRvciIsImZyb21UcmFuc2NyaXB0IiwiaGFuZGxlZCIsIkluZmluaXR5IiwiZm9jdXNlZEFjdGl2aXR5RW50cnkiLCJmb2N1c2VkQWN0aXZpdHlFbGVtZW50IiwiZmlsdGVyIiwiZmlyc3RUYWJiYWJsZUVsZW1lbnQiLCJsYWJlbElkIiwic2V0Qm90dG9tbW9zdEZvY3VzZWRBY3Rpdml0eUtleUlmTmVlZGVkIiwibGFzdEFjdGl2aXR5S2V5IiwiaGFuZGxlVHJhbnNjcmlwdEtleURvd25DYXB0dXJlIiwiYWx0S2V5IiwiY3RybEtleSIsIm1ldGFLZXkiLCJmb2N1c1RyYW5zY3JpcHRDYWxsYmFjayIsImhhbmRsZUZvY3VzQWN0aXZpdHkiLCJkaXNwYXRjaFRyYW5zY3JpcHRGb2N1cyIsImZvY3VzZWRBY3Rpdml0eSIsImhhbmRsZUZvY3VzRmlsbGVyIiwiaXNDb250ZW50SW50ZXJhY3RpdmUiLCJkZWZhdWx0UHJvcHMiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJzaGFwZSIsImFycmF5IiwiaXNSZXF1aXJlZCIsInN0cmluZyIsIkludGVybmFsU2NyZWVuUmVhZGVyVHJhbnNjcmlwdCIsImFycmF5T2YiLCJhbnkiLCJJbnRlcm5hbFRyYW5zY3JpcHRTY3JvbGxhYmxlIiwiY2hpbGRyZW4iLCJvbkZvY3VzQWN0aXZpdHkiLCJvbkZvY3VzRmlsbGVyIiwiYWN0aXZpdGllc1N0eWxlU2V0IiwiYW5pbWF0aW5nVG9FbmQiLCJhdEVuZCIsInN0aWNreSIsInN0eWxlT3B0aW9ucyIsImxhc3RWaXNpYmxlQWN0aXZpdHlJZCIsImxhc3RSZWFkQWN0aXZpdHlJZFJlZiIsImhhbmRsZVNjcm9sbFRvRW5kQnV0dG9uQ2xpY2siLCJmaXJzdFVucmVhZEFjdGl2aXR5IiwiU2Nyb2xsVG9FbmRCdXR0b24iLCJ1bnJlYWQiLCJSZWFjdCIsIkNoaWxkcmVuIiwiY291bnQiLCJmdW5jIiwiU2V0U2Nyb2xsZXIiLCJzY3JvbGxlclJlZiIsImF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eSIsImF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eU9mZnNldCIsImF1dG9TY3JvbGxTbmFwT25QYWdlIiwiYXV0b1Njcm9sbFNuYXBPblBhZ2VPZmZzZXQiLCJsYXN0QWNrbm93bGVkZ2VkQWN0aXZpdHkiLCJhY3Rpdml0aWVzUmVmIiwibGFzdEFja25vd2xlZGdlZEFjdGl2aXR5UmVmIiwicGF0Y2hlZEF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eSIsInBhdGNoZWRBdXRvU2Nyb2xsU25hcE9uUGFnZSIsInBhdGNoZWRBdXRvU2Nyb2xsU25hcE9uQWN0aXZpdHlPZmZzZXQiLCJwYXRjaGVkQXV0b1Njcm9sbFNuYXBPblBhZ2VPZmZzZXQiLCJ2YWx1ZXMiLCJsYXN0QWNrbm93bGVkZ2VkQWN0aXZpdHlJbmRleCIsImZpcnN0VW5hY2tub3dsZWRnZWRBY3Rpdml0eUVsZW1lbnRJbmRleCIsImFjdGl2aXR5RWxlbWVudEluZGV4IiwibnRoVW5hY2tub3dsZWRnZWRBY3Rpdml0eUVsZW1lbnQiLCJmaXJzdFVuYWNrbm93bGVkZ2VkQWN0aXZpdHlFbGVtZW50IiwicmVkdWNlIiwibWluVmFsdWUiLCJ2YWx1ZSIsIkJhc2ljVHJhbnNjcmlwdCIsInNjcm9sbGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFFQTs7QUFDQTs7QUFVQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLElBQ0VBLGFBREYsR0FVSUMsNkJBVkosQ0FDRUQsYUFERjtBQUFBLElBRUVFLHlCQUZGLEdBVUlELDZCQVZKLENBRUVDLHlCQUZGO0FBQUEsSUFHRUMsK0JBSEYsR0FVSUYsNkJBVkosQ0FHRUUsK0JBSEY7QUFBQSxJQUlFQyx1QkFKRixHQVVJSCw2QkFWSixDQUlFRyx1QkFKRjtBQUFBLElBS0VDLGtDQUxGLEdBVUlKLDZCQVZKLENBS0VJLGtDQUxGO0FBQUEsSUFNRUMsWUFORixHQVVJTCw2QkFWSixDQU1FSyxZQU5GO0FBQUEsSUFPRUMsa0JBUEYsR0FVSU4sNkJBVkosQ0FPRU0sa0JBUEY7QUFBQSxJQVFFQyxZQVJGLEdBVUlQLDZCQVZKLENBUUVPLFlBUkY7QUFBQSxJQVNFQyxlQVRGLEdBVUlSLDZCQVZKLENBU0VRLGVBVEY7QUFZQSxJQUFNQyxVQUFVLEdBQUc7QUFDakIsaUNBQStCO0FBQzdCQyxJQUFBQSxPQUFPLEVBQUUsTUFEb0I7QUFFN0JDLElBQUFBLGFBQWEsRUFBRSxRQUZjO0FBRzdCQyxJQUFB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R0EsSUFBTWMsZUFBZSxHQUFHLFNBQWxCQSxlQUFrQixTQUFtQjtBQUFBLE1BQWhCeE8sU0FBZ0IsVUFBaEJBLFNBQWdCO0FBQ3pDLE1BQU1ELG1CQUFtQixHQUFHLG1CQUFPLEVBQVAsQ0FBNUI7QUFDQSxNQUFNb04sV0FBVyxHQUFHLG1CQUFPO0FBQUEsV0FBTWhELFFBQU47QUFBQSxHQUFQLENBQXBCO0FBRUEsTUFBTXNFLFFBQVEsR0FBRyx3QkFBWTtBQUFBLFdBQWF0QixXQUFXLENBQUN0SSxPQUFaLE9BQUFzSSxXQUFXLFlBQXhCO0FBQUEsR0FBWixFQUF1RCxDQUFDQSxXQUFELENBQXZELENBQWpCO0FBRUEsc0JBQ0UsNkJBQUMsNkJBQUQ7QUFBNkIsSUFBQSxRQUFRLEVBQUVzQjtBQUF2QyxrQkFDRSw2QkFBQyxXQUFEO0FBQWEsSUFBQSxtQkFBbUIsRUFBRTFPLG1CQUFsQztBQUF1RCxJQUFBLFdBQVcsRUFBRW9OO0FBQXBFLElBREYsZUFFRSw2QkFBQyxrQkFBRDtBQUFvQixJQUFBLG1CQUFtQixFQUFFcE4sbUJBQXpDO0FBQThELElBQUEsU0FBUyxFQUFFQztBQUF6RSxJQUZGLENBREY7QUFNRCxDQVpEOztBQWNBd08sZUFBZSxDQUFDbkQsWUFBaEIsR0FBK0I7QUFDN0JyTCxFQUFBQSxTQUFTLEVBQUU7QUFEa0IsQ0FBL0I7QUFJQXdPLGVBQWUsQ0FBQ2xELFNBQWhCLEdBQTRCO0FBQzFCdEwsRUFBQUEsU0FBUyxFQUFFdUwsbUJBQVVJO0FBREssQ0FBNUI7ZUFJZTZDLGUiLCJzb3VyY2VSb290IjoiY29tcG9uZW50Oi8vLyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludCBuby1tYWdpYy1udW1iZXJzOiBbXCJlcnJvclwiLCB7IFwiaWdub3JlXCI6IFstMSwgMCwgMSwgMiwgNSwgMzZdIH1dICovXG5cbmltcG9ydCB7IGhvb2tzIH0gZnJvbSAnYm90ZnJhbWV3b3JrLXdlYmNoYXQtYXBpJztcbmltcG9ydCB7XG4gIENvbXBvc2VyIGFzIFJlYWN0U2Nyb2xsVG9Cb3R0b21Db21wb3NlcixcbiAgUGFuZWwgYXMgUmVhY3RTY3JvbGxUb0JvdHRvbVBhbmVsLFxuICB1c2VBbmltYXRpbmdUb0VuZCxcbiAgdXNlQXRFbmQsXG4gIHVzZU9ic2VydmVTY3JvbGxQb3NpdGlvbixcbiAgdXNlU2Nyb2xsVG8sXG4gIHVzZVNjcm9sbFRvRW5kLFxuICB1c2VTdGlja3lcbn0gZnJvbSAncmVhY3Qtc2Nyb2xsLXRvLWJvdHRvbSc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgcmFuZG9tIGZyb20gJ21hdGgtcmFuZG9tJztcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgQmFzaWNUeXBpbmdJbmRpY2F0b3IgZnJvbSAnLi9CYXNpY1R5cGluZ0luZGljYXRvcic7XG5pbXBvcnQgRmFkZSBmcm9tICcuL1V0aWxzL0ZhZGUnO1xuaW1wb3J0IEZvY3VzUmVkaXJlY3RvciBmcm9tICcuL1V0aWxzL0ZvY3VzUmVkaXJlY3Rvcic7XG5pbXBvcnQgZ2V0QWN0aXZpdHlVbmlxdWVJZCBmcm9tICcuL1V0aWxzL2dldEFjdGl2aXR5VW5pcXVlSWQnO1xuaW1wb3J0IGdldFRhYkluZGV4IGZyb20gJy4vVXRpbHMvVHlwZUZvY3VzU2luay9nZXRUYWJJbmRleCc7XG5pbXBvcnQgaW5wdXR0YWJsZUtleSBmcm9tICcuL1V0aWxzL1R5cGVGb2N1c1NpbmsvaW5wdXR0YWJsZUtleSc7XG5pbXBvcnQgaW50ZXJzZWN0aW9uT2YgZnJvbSAnLi9VdGlscy9pbnRlcnNlY3Rpb25PZic7XG5pbXBvcnQgaXNaZXJvT3JQb3NpdGl2ZSBmcm9tICcuL1V0aWxzL2lzWmVyb09yUG9zaXRpdmUnO1xuaW1wb3J0IHJlbW92ZUlubGluZSBmcm9tICcuL1V0aWxzL3JlbW92ZUlubGluZSc7XG5pbXBvcnQgU2NyZWVuUmVhZGVyQWN0aXZpdHkgZnJvbSAnLi9TY3JlZW5SZWFkZXJBY3Rpdml0eSc7XG5pbXBvcnQgU2NyZWVuUmVhZGVyVGV4dCBmcm9tICcuL1NjcmVlblJlYWRlclRleHQnO1xuaW1wb3J0IFNwZWFrQWN0aXZpdHkgZnJvbSAnLi9BY3Rpdml0eS9TcGVhayc7XG5pbXBvcnQgdGFiYmFibGVFbGVtZW50cyBmcm9tICcuL1V0aWxzL3RhYmJhYmxlRWxlbWVudHMnO1xuaW1wb3J0IHVzZUFja25vd2xlZGdlZEFjdGl2aXR5IGZyb20gJy4vaG9va3MvaW50ZXJuYWwvdXNlQWNrbm93bGVkZ2VkQWN0aXZpdHknO1xuaW1wb3J0IHVzZURpc3BhdGNoU2Nyb2xsUG9zaXRpb24gZnJvbSAnLi9ob29rcy9pbnRlcm5hbC91c2VEaXNwYXRjaFNjcm9sbFBvc2l0aW9uJztcbmltcG9ydCB1c2VEaXNwYXRjaFRyYW5zY3JpcHRGb2N1cyBmcm9tICcuL2hvb2tzL2ludGVybmFsL3VzZURpc3BhdGNoVHJhbnNjcmlwdEZvY3VzJztcbmltcG9ydCB1c2VGb2N1cyBmcm9tICcuL2hvb2tzL3VzZUZvY3VzJztcbmltcG9ydCB1c2VNZW1vaXplIGZyb20gJy4vaG9va3MvaW50ZXJuYWwvdXNlTWVtb2l6ZSc7XG5pbXBvcnQgdXNlUmVnaXN0ZXJGb2N1c1RyYW5zY3JpcHQgZnJvbSAnLi9ob29rcy9pbnRlcm5hbC91c2VSZWdpc3RlckZvY3VzVHJhbnNjcmlwdCc7XG5pbXBvcnQgdXNlUmVnaXN0ZXJTY3JvbGxSZWxhdGl2ZSBmcm9tICcuL2hvb2tzL2ludGVybmFsL3VzZVJlZ2lzdGVyU2Nyb2xsUmVsYXRpdmUnO1xuaW1wb3J0IHVzZVJlZ2lzdGVyU2Nyb2xsVG8gZnJvbSAnLi9ob29rcy9pbnRlcm5hbC91c2VSZWdpc3RlclNjcm9sbFRvJztcbmltcG9ydCB1c2VSZWdpc3RlclNjcm9sbFRvRW5kIGZyb20gJy4vaG9va3MvaW50ZXJuYWwvdXNlUmVnaXN0ZXJTY3JvbGxUb0VuZCc7XG5pbXBvcnQgdXNlU3R5bGVTZXQgZnJvbSAnLi9ob29rcy91c2VTdHlsZVNldCc7XG5pbXBvcnQgdXNlU3R5bGVUb0Vtb3Rpb25PYmplY3QgZnJvbSAnLi9ob29rcy9pbnRlcm5hbC91c2VTdHlsZVRvRW1vdGlvbk9iamVjdCc7XG5pbXBvcnQgdXNlVW5pcXVlSWQgZnJvbSAnLi9ob29rcy9pbnRlcm5hbC91c2VVbmlxdWVJZCc7XG5cbmNvbnN0IHtcbiAgdXNlQWN0aXZpdGllcyxcbiAgdXNlQ3JlYXRlQWN0aXZpdHlSZW5kZXJlcixcbiAgdXNlQ3JlYXRlQWN0aXZpdHlTdGF0dXNSZW5kZXJlcixcbiAgdXNlQ3JlYXRlQXZhdGFyUmVuZGVyZXIsXG4gIHVzZUNyZWF0ZVNjcm9sbFRvRW5kQnV0dG9uUmVuZGVyZXIsXG4gIHVzZURpcmVjdGlvbixcbiAgdXNlR3JvdXBBY3Rpdml0aWVzLFxuICB1c2VMb2NhbGl6ZXIsXG4gIHVzZVN0eWxlT3B0aW9uc1xufSA9IGhvb2tzO1xuXG5jb25zdCBST09UX1NUWUxFID0ge1xuICAnJi53ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0Jzoge1xuICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgLy8gTWFrZSBzdXJlIHRvIHNldCBcInBvc2l0aW9uOiByZWxhdGl2ZVwiIGhlcmUgdG8gZm9ybSBhbm90aGVyIHN0YWNraW5nIGNvbnRleHQgZm9yIHRoZSBzY3JvbGwtdG8tZW5kIGJ1dHRvbi5cbiAgICAvLyBTdGFja2luZyBjb250ZXh0IGhlbHAgaXNvbGF0aW5nIGVsZW1lbnRzIHRoYXQgdXNlIFwiei1pbmRleFwiIGZyb20gZ2xvYmFsIHBvbGx1dGlvbi5cbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ1NTX1Bvc2l0aW9uaW5nL1VuZGVyc3RhbmRpbmdfel9pbmRleC9UaGVfc3RhY2tpbmdfY29udGV4dFxuICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuXG4gICAgJyYgLndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2ZpbGxlcic6IHtcbiAgICAgIGZsZXg6IDFcbiAgICB9LFxuXG4gICAgJyYgLndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX3Njcm9sbGFibGUnOiB7XG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICAgIG92ZXJmbG93WDogJ2hpZGRlbicsXG4gICAgICBXZWJraXRPdmVyZmxvd1Njcm9sbGluZzogJ3RvdWNoJ1xuICAgIH0sXG5cbiAgICAnJiAud2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fdHJhbnNjcmlwdCc6IHtcbiAgICAgIGxpc3RTdHlsZVR5cGU6ICdub25lJ1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gdmFsaWRhdGVBbGxBY3Rpdml0aWVzVGFnZ2VkKGFjdGl2aXRpZXMsIGJpbnMpIHtcbiAgcmV0dXJuIGFjdGl2aXRpZXMuZXZlcnkoYWN0aXZpdHkgPT4gYmlucy5zb21lKGJpbiA9PiBiaW4uaW5jbHVkZXMoYWN0aXZpdHkpKSk7XG59XG5cbmNvbnN0IEludGVybmFsVHJhbnNjcmlwdCA9ICh7IGFjdGl2aXR5RWxlbWVudHNSZWYsIGNsYXNzTmFtZSB9KSA9PiB7XG4gIGNvbnN0IFt7IGJhc2ljVHJhbnNjcmlwdDogYmFzaWNUcmFuc2NyaXB0U3R5bGVTZXQgfV0gPSB1c2VTdHlsZVNldCgpO1xuICBjb25zdCBbeyBidWJibGVGcm9tVXNlck51Yk9mZnNldCwgYnViYmxlTnViT2Zmc2V0LCBncm91cFRpbWVzdGFtcCwgaW50ZXJuYWxMaXZlUmVnaW9uRmFkZUFmdGVyLCBzaG93QXZhdGFySW5Hcm91cCB9XSA9XG4gICAgdXNlU3R5bGVPcHRpb25zKCk7XG4gIGNvbnN0IFtmb2N1c2VkQWN0aXZpdHlLZXksIHNldEZvY3VzZWRBY3Rpdml0eUtleV0gPSB1c2VTdGF0ZSgpO1xuICBjb25zdCBbYWN0aXZpdGllc10gPSB1c2VBY3Rpdml0aWVzKCk7XG4gIGNvbnN0IFtkaXJlY3Rpb25dID0gdXNlRGlyZWN0aW9uKCk7XG4gIGNvbnN0IGNyZWF0ZUFjdGl2aXR5UmVuZGVyZXIgPSB1c2VDcmVhdGVBY3Rpdml0eVJlbmRlcmVyKCk7XG4gIGNvbnN0IGNyZWF0ZUFjdGl2aXR5U3RhdHVzUmVuZGVyZXIgPSB1c2VDcmVhdGVBY3Rpdml0eVN0YXR1c1JlbmRlcmVyKCk7XG4gIGNvbnN0IGNyZWF0ZUF2YXRhclJlbmRlcmVyID0gdXNlQ3JlYXRlQXZhdGFyUmVuZGVyZXIoKTtcbiAgY29uc3QgZm9jdXMgPSB1c2VGb2N1cygpO1xuICBjb25zdCBncm91cEFjdGl2aXRpZXMgPSB1c2VHcm91cEFjdGl2aXRpZXMoKTtcbiAgY29uc3QgbG9jYWxpemUgPSB1c2VMb2NhbGl6ZXIoKTtcbiAgY29uc3Qgcm9vdENsYXNzTmFtZSA9IHVzZVN0eWxlVG9FbW90aW9uT2JqZWN0KCkoUk9PVF9TVFlMRSkgKyAnJztcbiAgY29uc3Qgcm9vdEVsZW1lbnRSZWYgPSB1c2VSZWYoKTtcbiAgY29uc3QgdGVybWluYXRvclJlZiA9IHVzZVJlZigpO1xuXG4gIGNvbnN0IGFjdGl2aXR5SW50ZXJhY3RpdmVBbHQgPSBsb2NhbGl6ZSgnQUNUSVZJVFlfSU5URVJBQ1RJVkVfTEFCRUxfQUxUJyk7XG4gIGNvbnN0IHRlcm1pbmF0b3JUZXh0ID0gbG9jYWxpemUoJ1RSQU5TQ1JJUFRfVEVSTUlOQVRPUl9URVhUJyk7XG4gIGNvbnN0IHRyYW5zY3JpcHRBcmlhTGFiZWwgPSBsb2NhbGl6ZSgnVFJBTlNDUklQVF9BUklBX0xBQkVMX0FMVCcpO1xuICBjb25zdCB0cmFuc2NyaXB0Um9sZURlc2NyaXB0aW9uID0gbG9jYWxpemUoJ1RSQU5TQ1JJUFRfQVJJQV9ST0xFX0FMVCcpO1xuXG4gIGNvbnN0IGhpZGVBbGxUaW1lc3RhbXBzID0gZ3JvdXBUaW1lc3RhbXAgPT09IGZhbHNlO1xuXG4gIC8vIEdldHMgcmVuZGVyZXIgZm9yIGV2ZXJ5IGFjdGl2aXR5LlxuICAvLyBBY3Rpdml0aWVzIHRoYXQgYXJlIG5vdCB2aXNpYmxlIHdpbGwgcmV0dXJuIGEgZmFsc3kgcmVuZGVyZXIuXG5cbiAgLy8gQ29udmVydGVkIGZyb20gY3JlYXRlQWN0aXZpdHlSZW5kZXJlcih7IGFjdGl2aXR5LCBuZXh0VmlzaWJsZUFjdGl2aXR5IH0pIHRvIGNyZWF0ZUFjdGl2aXR5UmVuZGVyZXIoYWN0aXZpdHksIG5leHRWaXNpYmxlQWN0aXZpdHkpLlxuICAvLyBUaGlzIGlzIGZvciB0aGUgbWVtb2l6YXRpb24gZnVuY3Rpb24gdG8gY2FjaGUgdGhlIGFyZ3VtZW50cy4gTWVtb2l6ZXIgY2FuIG9ubHkgY2FjaGUgbGl0ZXJhbCBhcmd1bWVudHMuXG4gIGNvbnN0IGNyZWF0ZUFjdGl2aXR5UmVuZGVyZXJXaXRoTGl0ZXJhbEFyZ3MgPSB1c2VDYWxsYmFjayhcbiAgICAoYWN0aXZpdHksIG5leHRWaXNpYmxlQWN0aXZpdHkpID0+IGNyZWF0ZUFjdGl2aXR5UmVuZGVyZXIoeyBhY3Rpdml0eSwgbmV4dFZpc2libGVBY3Rpdml0eSB9KSxcbiAgICBbY3JlYXRlQWN0aXZpdHlSZW5kZXJlcl1cbiAgKTtcblxuICAvLyBDcmVhdGUgYSBtZW1vaXplZCBjb250ZXh0IG9mIHRoZSBjcmVhdGVBY3Rpdml0eVJlbmRlcmVyIGZ1bmN0aW9uLlxuICBjb25zdCBhY3Rpdml0aWVzV2l0aFJlbmRlcmVyID0gdXNlTWVtb2l6ZShcbiAgICBjcmVhdGVBY3Rpdml0eVJlbmRlcmVyV2l0aExpdGVyYWxBcmdzLFxuICAgIGNyZWF0ZUFjdGl2aXR5UmVuZGVyZXJXaXRoTGl0ZXJhbEFyZ3NNZW1vaXplZCA9PiB7XG4gICAgICAvLyBBbGwgY2FsbHMgdG8gY3JlYXRlQWN0aXZpdHlSZW5kZXJlcldpdGhMaXRlcmFsQXJnc01lbW9pemVkKCkgaW4gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIG1lbW9pemVkIChMUlUgPSAxKS5cbiAgICAgIC8vIEluIHRoZSBuZXh0IHJlbmRlciBjeWNsZSwgY2FsbHMgdG8gY3JlYXRlQWN0aXZpdHlSZW5kZXJlcldpdGhMaXRlcmFsQXJnc01lbW9pemVkKCkgbWlnaHQgcmV0dXJuIHRoZSBtZW1vaXplZCByZXN1bHQgaW5zdGVhZC5cbiAgICAgIC8vIFRoaXMgaXMgYW4gaW1wcm92ZW1lbnQgdG8gUmVhY3QgdXNlTWVtbygpLCBiZWNhdXNlIGl0IG9ubHkgYWxsb3dzIDEgbWVtb2l6YXRpb24uXG4gICAgICAvLyB1c2VNZW1vaXplKCkgYWxsb3dzIGFueSBudW1iZXIgb2YgbWVtb2l6YXRpb24uXG5cbiAgICAgIGNvbnN0IGFjdGl2aXRpZXNXaXRoUmVuZGVyZXIgPSBbXTtcbiAgICAgIGxldCBuZXh0VmlzaWJsZUFjdGl2aXR5O1xuXG4gICAgICBmb3IgKGxldCBpbmRleCA9IGFjdGl2aXRpZXMubGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgaW5kZXgtLSkge1xuICAgICAgICBjb25zdCBhY3Rpdml0eSA9IGFjdGl2aXRpZXNbaW5kZXhdO1xuICAgICAgICBjb25zdCByZW5kZXJBY3Rpdml0eSA9IGNyZWF0ZUFjdGl2aXR5UmVuZGVyZXJXaXRoTGl0ZXJhbEFyZ3NNZW1vaXplZChhY3Rpdml0eSwgbmV4dFZpc2libGVBY3Rpdml0eSk7XG5cbiAgICAgICAgaWYgKHJlbmRlckFjdGl2aXR5KSB7XG4gICAgICAgICAgYWN0aXZpdGllc1dpdGhSZW5kZXJlci5zcGxpY2UoMCwgMCwge1xuICAgICAgICAgICAgYWN0aXZpdHksXG4gICAgICAgICAgICByZW5kZXJBY3Rpdml0eVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgbmV4dFZpc2libGVBY3Rpdml0eSA9IGFjdGl2aXR5O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY3Rpdml0aWVzV2l0aFJlbmRlcmVyO1xuICAgIH0sXG4gICAgW2FjdGl2aXRpZXNdXG4gICk7XG5cbiAgY29uc3QgdmlzaWJsZUFjdGl2aXRpZXMgPSB1c2VNZW1vKFxuICAgICgpID0+IGFjdGl2aXRpZXNXaXRoUmVuZGVyZXIubWFwKCh7IGFjdGl2aXR5IH0pID0+IGFjdGl2aXR5KSxcbiAgICBbYWN0aXZpdGllc1dpdGhSZW5kZXJlcl1cbiAgKTtcblxuICAvLyBUYWcgYWN0aXZpdGllcyBiYXNlZCBvbiB0eXBlcy5cbiAgLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdGFnIGludG8gMiB0eXBlczogc2VuZGVyIGFuZCBzdGF0dXMuXG5cbiAgY29uc3QgeyBhY3Rpdml0aWVzR3JvdXBCeVNlbmRlciwgYWN0aXZpdGllc0dyb3VwQnlTdGF0dXMgfSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHsgc2VuZGVyOiBhY3Rpdml0aWVzR3JvdXBCeVNlbmRlciwgc3RhdHVzOiBhY3Rpdml0aWVzR3JvdXBCeVN0YXR1cyB9ID0gZ3JvdXBBY3Rpdml0aWVzKHtcbiAgICAgIGFjdGl2aXRpZXM6IHZpc2libGVBY3Rpdml0aWVzXG4gICAgfSk7XG5cbiAgICBpZiAoIXZhbGlkYXRlQWxsQWN0aXZpdGllc1RhZ2dlZCh2aXNpYmxlQWN0aXZpdGllcywgYWN0aXZpdGllc0dyb3VwQnlTZW5kZXIpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdib3RmcmFtZXdvcmstd2ViY2hhdDogTm90IGV2ZXJ5IGFjdGl2aXRpZXMgYXJlIGdyb3VwZWQgaW4gdGhlIFwic2VuZGVyXCIgcHJvcGVydHkuIFBsZWFzZSBmaXggXCJncm91cEFjdGl2aXRpZXNNaWRkbGV3YXJlXCIgYW5kIGdyb3VwIGV2ZXJ5IGFjdGl2aXRpZXMuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXZhbGlkYXRlQWxsQWN0aXZpdGllc1RhZ2dlZCh2aXNpYmxlQWN0aXZpdGllcywgYWN0aXZpdGllc0dyb3VwQnlTdGF0dXMpKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdib3RmcmFtZXdvcmstd2ViY2hhdDogTm90IGV2ZXJ5IGFjdGl2aXRpZXMgYXJlIGdyb3VwZWQgaW4gdGhlIFwic3RhdHVzXCIgcHJvcGVydHkuIFBsZWFzZSBmaXggXCJncm91cEFjdGl2aXRpZXNNaWRkbGV3YXJlXCIgYW5kIGdyb3VwIGV2ZXJ5IGFjdGl2aXRpZXMuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWN0aXZpdGllc0dyb3VwQnlTZW5kZXIsXG4gICAgICBhY3Rpdml0aWVzR3JvdXBCeVN0YXR1c1xuICAgIH07XG4gIH0sIFtncm91cEFjdGl2aXRpZXMsIHZpc2libGVBY3Rpdml0aWVzXSk7XG5cbiAgLy8gQ3JlYXRlIGEgdHJlZSBvZiBhY3Rpdml0aWVzIHdpdGggMiBkaW1lbnNpb25zOiBzZW5kZXIsIGZvbGxvd2VkIGJ5IHN0YXR1cy5cblxuICBjb25zdCBhY3Rpdml0eVRyZWUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCB2aXNpYmxlQWN0aXZpdGllc1BlbmRpbmdHcm91cGluZyA9IFsuLi52aXNpYmxlQWN0aXZpdGllc107XG4gICAgY29uc3QgYWN0aXZpdHlUcmVlID0gW107XG5cbiAgICB3aGlsZSAodmlzaWJsZUFjdGl2aXRpZXNQZW5kaW5nR3JvdXBpbmcubGVuZ3RoKSB7XG4gICAgICBjb25zdCBbYWN0aXZpdHldID0gdmlzaWJsZUFjdGl2aXRpZXNQZW5kaW5nR3JvdXBpbmc7XG4gICAgICBjb25zdCBzZW5kZXJUcmVlID0gW107XG4gICAgICBjb25zdCBhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXIgPSBhY3Rpdml0aWVzR3JvdXBCeVNlbmRlci5maW5kKGFjdGl2aXRpZXMgPT4gYWN0aXZpdGllcy5pbmNsdWRlcyhhY3Rpdml0eSkpO1xuXG4gICAgICBhY3Rpdml0eVRyZWUucHVzaChzZW5kZXJUcmVlKTtcblxuICAgICAgYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyLmZvckVhY2goYWN0aXZpdHkgPT4ge1xuICAgICAgICBjb25zdCBhY3Rpdml0aWVzV2l0aFNhbWVTdGF0dXMgPSBhY3Rpdml0aWVzR3JvdXBCeVN0YXR1cy5maW5kKGFjdGl2aXRpZXMgPT4gYWN0aXZpdGllcy5pbmNsdWRlcyhhY3Rpdml0eSkpO1xuXG4gICAgICAgIGNvbnN0IGFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlckFuZFN0YXR1cyA9IGludGVyc2VjdGlvbk9mKFxuICAgICAgICAgIHZpc2libGVBY3Rpdml0aWVzUGVuZGluZ0dyb3VwaW5nLFxuICAgICAgICAgIGFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlcixcbiAgICAgICAgICBhY3Rpdml0aWVzV2l0aFNhbWVTdGF0dXNcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyQW5kU3RhdHVzLmxlbmd0aCkge1xuICAgICAgICAgIHNlbmRlclRyZWUucHVzaChhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXJBbmRTdGF0dXMpO1xuICAgICAgICAgIHJlbW92ZUlubGluZSh2aXNpYmxlQWN0aXZpdGllc1BlbmRpbmdHcm91cGluZywgLi4uYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyQW5kU3RhdHVzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQXNzZXJ0aW9uOiBBbGwgYWN0aXZpdGllcyBpbiB2aXNpYmxlQWN0aXZpdGllcywgbXVzdCBiZSBhc3NpZ25lZCB0byB0aGUgYWN0aXZpdHlUcmVlXG4gICAgaWYgKFxuICAgICAgIXZpc2libGVBY3Rpdml0aWVzLmV2ZXJ5KGFjdGl2aXR5ID0+XG4gICAgICAgIGFjdGl2aXR5VHJlZS5zb21lKGFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlciA9PlxuICAgICAgICAgIGFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlci5zb21lKGFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlckFuZFN0YXR1cyA9PlxuICAgICAgICAgICAgYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyQW5kU3RhdHVzLmluY2x1ZGVzKGFjdGl2aXR5KVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICkge1xuICAgICAgY29uc29sZS53YXJuKCdib3RmcmFtZXdvcmstd2ViY2hhdCBpbnRlcm5hbDogTm90IGFsbCB2aXNpYmxlIGFjdGl2aXRpZXMgYXJlIGdyb3VwZWQgaW4gdGhlIGFjdGl2aXR5VHJlZS4nLCB7XG4gICAgICAgIHZpc2libGVBY3Rpdml0aWVzLFxuICAgICAgICBhY3Rpdml0eVRyZWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBhY3Rpdml0eVRyZWU7XG4gIH0sIFthY3Rpdml0aWVzR3JvdXBCeVNlbmRlciwgYWN0aXZpdGllc0dyb3VwQnlTdGF0dXMsIHZpc2libGVBY3Rpdml0aWVzXSk7XG5cbiAgLy8gRmxhdHRlbiB0aGUgdHJlZSBiYWNrIGludG8gYW4gYXJyYXkgd2l0aCBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHJlbmRlcmluZy5cblxuICBjb25zdCByZW5kZXJpbmdFbGVtZW50cyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IHJlbmRlcmluZ0VsZW1lbnRzID0gW107XG4gICAgY29uc3QgdG9wU2lkZUJvdE51YiA9IGlzWmVyb09yUG9zaXRpdmUoYnViYmxlTnViT2Zmc2V0KTtcbiAgICBjb25zdCB0b3BTaWRlVXNlck51YiA9IGlzWmVyb09yUG9zaXRpdmUoYnViYmxlRnJvbVVzZXJOdWJPZmZzZXQpO1xuXG4gICAgYWN0aXZpdHlUcmVlLmZvckVhY2goYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyID0+IHtcbiAgICAgIGNvbnN0IFtbZmlyc3RBY3Rpdml0eV1dID0gYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyO1xuICAgICAgY29uc3QgcmVuZGVyQXZhdGFyID0gY3JlYXRlQXZhdGFyUmVuZGVyZXIoeyBhY3Rpdml0eTogZmlyc3RBY3Rpdml0eSB9KTtcblxuICAgICAgYWN0aXZpdGllc1dpdGhTYW1lU2VuZGVyLmZvckVhY2goKGFjdGl2aXRpZXNXaXRoU2FtZVNlbmRlckFuZFN0YXR1cywgaW5kZXhXaXRoaW5TZW5kZXJHcm91cCkgPT4ge1xuICAgICAgICBjb25zdCBmaXJzdEluU2VuZGVyR3JvdXAgPSAhaW5kZXhXaXRoaW5TZW5kZXJHcm91cDtcbiAgICAgICAgY29uc3QgbGFzdEluU2VuZGVyR3JvdXAgPSBpbmRleFdpdGhpblNlbmRlckdyb3VwID09PSBhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXIubGVuZ3RoIC0gMTtcblxuICAgICAgICBhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXJBbmRTdGF0dXMuZm9yRWFjaCgoYWN0aXZpdHksIGluZGV4V2l0aGluU2VuZGVyQW5kU3RhdHVzR3JvdXApID0+IHtcbiAgICAgICAgICAvLyBXZSBvbmx5IHNob3cgdGhlIHRpbWVzdGFtcCBhdCB0aGUgZW5kIG9mIHRoZSBzZW5kZXIgZ3JvdXAuIEJ1dCB3ZSBhbHdheXMgc2hvdyB0aGUgXCJTZW5kIGZhaWxlZCwgcmV0cnlcIiBwcm9tcHQuXG4gICAgICAgICAgY29uc3QgcmVuZGVyQWN0aXZpdHlTdGF0dXMgPSBjcmVhdGVBY3Rpdml0eVN0YXR1c1JlbmRlcmVyKHtcbiAgICAgICAgICAgIGFjdGl2aXR5XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCBmaXJzdEluU2VuZGVyQW5kU3RhdHVzR3JvdXAgPSAhaW5kZXhXaXRoaW5TZW5kZXJBbmRTdGF0dXNHcm91cDtcbiAgICAgICAgICBjb25zdCBsYXN0SW5TZW5kZXJBbmRTdGF0dXNHcm91cCA9XG4gICAgICAgICAgICBpbmRleFdpdGhpblNlbmRlckFuZFN0YXR1c0dyb3VwID09PSBhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXJBbmRTdGF0dXMubGVuZ3RoIC0gMTtcblxuICAgICAgICAgIGNvbnN0IHsgcmVuZGVyQWN0aXZpdHkgfSA9IGFjdGl2aXRpZXNXaXRoUmVuZGVyZXIuZmluZChlbnRyeSA9PiBlbnRyeS5hY3Rpdml0eSA9PT0gYWN0aXZpdHkpO1xuICAgICAgICAgIGNvbnN0IGtleSA9IGdldEFjdGl2aXR5VW5pcXVlSWQoYWN0aXZpdHkpIHx8IHJlbmRlcmluZ0VsZW1lbnRzLmxlbmd0aDtcbiAgICAgICAgICBjb25zdCBiYXNlQWx0VGV4dCA9XG4gICAgICAgICAgICB0eXBlb2YgYWN0aXZpdHk/LmNoYW5uZWxEYXRhPy5bJ3dlYmNoYXQ6ZmFsbGJhY2stdGV4dCddID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICA/IGFjdGl2aXR5Py5jaGFubmVsRGF0YT8uWyd3ZWJjaGF0OmZhbGxiYWNrLXRleHQnXVxuICAgICAgICAgICAgICA6IGFjdGl2aXR5Py5jaGFubmVsRGF0YT8ubWVzc2FnZUJhY2s/LmRpc3BsYXlUZXh0IHx8IGFjdGl2aXR5LnRleHQ7XG5cbiAgICAgICAgICAvLyBJZiBcIndlYmNoYXQ6ZmFsbGJhY2stdGV4dFwiIGZpZWxkIGlzIHNldCB0byBlbXB0eSBzdHJpbmcsIHRoZSBhY3Rpdml0eSBtdXN0IG5vdCBiZSBuYXJyYXRlZC5cbiAgICAgICAgICBjb25zdCBzdXBwb3J0U2NyZWVuUmVhZGVyID0gYWN0aXZpdHk/LmNoYW5uZWxEYXRhPy5bJ3dlYmNoYXQ6ZmFsbGJhY2stdGV4dCddICE9PSAnJztcblxuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGZyb206IHsgcm9sZSB9XG4gICAgICAgICAgfSA9IGFjdGl2aXR5O1xuXG4gICAgICAgICAgY29uc3QgdG9wU2lkZU51YiA9IHJvbGUgPT09ICd1c2VyJyA/IHRvcFNpZGVVc2VyTnViIDogdG9wU2lkZUJvdE51YjtcblxuICAgICAgICAgIGxldCBzaG93Q2FsbG91dDtcblxuICAgICAgICAgIC8vIERlcGVuZGluZyBvbiB0aGUgXCJzaG93QXZhdGFySW5Hcm91cFwiIHNldHRpbmcsIHRoZSBhdmF0YXIgd2lsbCByZW5kZXIgaW4gZGlmZmVyZW50IHBvc2l0aW9ucy5cbiAgICAgICAgICBpZiAoc2hvd0F2YXRhckluR3JvdXAgPT09ICdzZW5kZXInKSB7XG4gICAgICAgICAgICBpZiAodG9wU2lkZU51Yikge1xuICAgICAgICAgICAgICBzaG93Q2FsbG91dCA9IGZpcnN0SW5TZW5kZXJHcm91cCAmJiBmaXJzdEluU2VuZGVyQW5kU3RhdHVzR3JvdXA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzaG93Q2FsbG91dCA9IGxhc3RJblNlbmRlckdyb3VwICYmIGxhc3RJblNlbmRlckFuZFN0YXR1c0dyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoc2hvd0F2YXRhckluR3JvdXAgPT09ICdzdGF0dXMnKSB7XG4gICAgICAgICAgICBpZiAodG9wU2lkZU51Yikge1xuICAgICAgICAgICAgICBzaG93Q2FsbG91dCA9IGZpcnN0SW5TZW5kZXJBbmRTdGF0dXNHcm91cDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNob3dDYWxsb3V0ID0gbGFzdEluU2VuZGVyQW5kU3RhdHVzR3JvdXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNob3dDYWxsb3V0ID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBmb2N1c0FjdGl2aXR5ID0gKCkgPT4ge1xuICAgICAgICAgICAgc2V0Rm9jdXNlZEFjdGl2aXR5S2V5KGdldEFjdGl2aXR5VW5pcXVlSWQoYWN0aXZpdHkpKTtcblxuICAgICAgICAgICAgLy8gSUUxMSBuZWVkIHRvIG1hbnVhbGx5IGZvY3VzIG9uIHRoZSB0cmFuc2NyaXB0LlxuICAgICAgICAgICAgY29uc3QgeyBjdXJyZW50OiByb290RWxlbWVudCB9ID0gcm9vdEVsZW1lbnRSZWY7XG5cbiAgICAgICAgICAgIHJvb3RFbGVtZW50ICYmIHJvb3RFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHJlbmRlcmluZ0VsZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgYWN0aXZpdHksXG5cbiAgICAgICAgICAgIC8vIEFmdGVyIHRoZSBlbGVtZW50IGlzIG1vdW50ZWQsIHNldCBpdCB0byBhY3Rpdml0eUVsZW1lbnRzUmVmLlxuICAgICAgICAgICAgY2FsbGJhY2tSZWY6IGFjdGl2aXR5RWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gYWN0aXZpdHlFbGVtZW50c1JlZi5jdXJyZW50LmZpbmQoKHsgYWN0aXZpdHlJRCB9KSA9PiBhY3Rpdml0eUlEID09PSBhY3Rpdml0eS5pZCk7XG5cbiAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgZW50cnkuZWxlbWVudCA9IGFjdGl2aXR5RWxlbWVudDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgcHV0IHRoZSBmb2N1cyBvbiB0aGUgdHJhbnNjcmlwdCBhbmQgdGhlIGFjdGl2aXR5LlxuICAgICAgICAgICAgZm9jdXNBY3Rpdml0eSxcblxuICAgICAgICAgICAgLy8gV2hlbiBhIGNoaWxkIG9mIHRoZSBhY3Rpdml0eSByZWNlaXZlcyBmb2N1cywgbm90aWZ5IHRoZSB0cmFuc2NyaXB0IHRvIHNldCB0aGUgYXJpYS1hY3RpdmVkZXNjZW5kYW50IHRvIHRoaXMgYWN0aXZpdHkuXG4gICAgICAgICAgICBoYW5kbGVGb2N1czogKCkgPT4ge1xuICAgICAgICAgICAgICBzZXRGb2N1c2VkQWN0aXZpdHlLZXkoZ2V0QWN0aXZpdHlVbmlxdWVJZChhY3Rpdml0eSkpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgaGFuZGxlS2V5RG93bjogZXZlbnQgPT4ge1xuICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICBzZXRGb2N1c2VkQWN0aXZpdHlLZXkoZ2V0QWN0aXZpdHlVbmlxdWVJZChhY3Rpdml0eSkpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgeyBjdXJyZW50IH0gPSByb290RWxlbWVudFJlZjtcblxuICAgICAgICAgICAgICAgIGN1cnJlbnQgJiYgY3VycmVudC5mb2N1cygpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBGb3IgYWNjZXNzaWJpbGl0eTogd2hlbiB0aGUgdXNlciBwcmVzcyB1cC9kb3duIGFycm93IGtleXMsIHdlIHB1dCBhIHZpc3VhbCBmb2N1cyBpbmRpY2F0b3IgYXJvdW5kIHRoZSBmb2N1c2VkIGFjdGl2aXR5LlxuICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGRvIHRoZSBzYW1lIGZvciBtb3VzZSwgdGhhdCBpcyB3aHkgd2UgaGF2ZSB0aGUgY2xpY2sgaGFuZGxlciBoZXJlLlxuICAgICAgICAgICAgLy8gV2UgYXJlIGRvaW5nIGl0IGluIGV2ZW50IGNhcHR1cmUgcGhhc2UgdG8gcHJldmVudCBvdGhlciBjb21wb25lbnRzIGZyb20gc3RvcHBpbmcgZXZlbnQgcHJvcGFnYXRpb24gdG8gdXMuXG4gICAgICAgICAgICBoYW5kbGVNb3VzZURvd25DYXB0dXJlOiAoeyB0YXJnZXQgfSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB0YWJJbmRleCA9IGdldFRhYkluZGV4KHRhcmdldCk7XG5cbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0YWJJbmRleCAhPT0gJ251bWJlcicgfHwgdGFiSW5kZXggPCAwIHx8IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgICAgICAgZm9jdXNBY3Rpdml0eSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBcImhpZGVUaW1lc3RhbXBcIiBpcyBhIHJlbmRlci10aW1lIHBhcmFtZXRlciBmb3IgcmVuZGVyQWN0aXZpdHlTdGF0dXMoKS5cbiAgICAgICAgICAgIC8vIElmIHRydWUsIGl0IHdpbGwgaGlkZSB0aGUgdGltZXN0YW1wLCBidXQgaXQgd2lsbCBjb250aW51ZSB0byBzaG93IHRoZVxuICAgICAgICAgICAgLy8gcmV0cnkgcHJvbXB0LiBBbmQgc2hvdyB0aGUgc2NyZWVuIHJlYWRlciB2ZXJzaW9uIG9mIHRoZSB0aW1lc3RhbXAuXG4gICAgICAgICAgICBoaWRlVGltZXN0YW1wOlxuICAgICAgICAgICAgICBoaWRlQWxsVGltZXN0YW1wcyB8fCBpbmRleFdpdGhpblNlbmRlckFuZFN0YXR1c0dyb3VwICE9PSBhY3Rpdml0aWVzV2l0aFNhbWVTZW5kZXJBbmRTdGF0dXMubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgIGtleSxcblxuICAgICAgICAgICAgLy8gV2hlbiBcImxpdmVSZWdpb25LZXlcIiBjaGFuZ2VzIG9yIGNvbnRlbnRzIHRoYXQgbWFkZSB1cCB0aGUgYWx0IHRleHQgY2hhbmdlZCwgaXQgd2lsbCBzaG93IHVwIGluIHRoZSBsaXZlIHJlZ2lvbiBtb21lbnRhcmlseS5cbiAgICAgICAgICAgIGxpdmVSZWdpb25LZXk6IGtleSArICd8JyArIGJhc2VBbHRUZXh0LFxuICAgICAgICAgICAgcmVuZGVyQWN0aXZpdHksXG4gICAgICAgICAgICByZW5kZXJBY3Rpdml0eVN0YXR1cyxcbiAgICAgICAgICAgIHJlbmRlckF2YXRhcixcbiAgICAgICAgICAgIHJvbGUsXG5cbiAgICAgICAgICAgIC8vIFRPRE86IFtQMl0gIzI4NTggV2Ugc2hvdWxkIHVzZSBjb3JlL2RlZmluaXRpb25zL3NwZWFraW5nQWN0aXZpdHkgZm9yIHRoaXMgcHJlZGljYXRlIGluc3RlYWRcbiAgICAgICAgICAgIHNob3VsZFNwZWFrOiBhY3Rpdml0eS5jaGFubmVsRGF0YSAmJiBhY3Rpdml0eS5jaGFubmVsRGF0YS5zcGVhayxcbiAgICAgICAgICAgIHNob3dDYWxsb3V0LFxuICAgICAgICAgICAgc3VwcG9ydFNjcmVlblJlYWRlclxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgeyBjdXJyZW50OiBhY3Rpdml0eUVsZW1lbnRzIH0gPSBhY3Rpdml0eUVsZW1lbnRzUmVmO1xuXG4gICAgLy8gVXBkYXRlIGFjdGl2aXR5RWxlbWVudFJlZiB3aXRoIG5ldyBzZXRzIG9mIGFjdGl2aXR5LCB3aGlsZSByZXRhaW5pbmcgdGhlIGV4aXN0aW5nIHJlZmVyZW5jaW5nIGVsZW1lbnQgaWYgZXhpc3RzLlxuICAgIGFjdGl2aXR5RWxlbWVudHNSZWYuY3VycmVudCA9IHJlbmRlcmluZ0VsZW1lbnRzLm1hcCgoeyBhY3Rpdml0eSwgYWN0aXZpdHk6IHsgaWQgfSwgZWxlbWVudElkLCBrZXkgfSkgPT4ge1xuICAgICAgY29uc3QgZXhpc3RpbmdFbnRyeSA9IGFjdGl2aXR5RWxlbWVudHMuZmluZChlbnRyeSA9PiBlbnRyeS5rZXkgPT09IGtleSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFjdGl2aXR5LFxuICAgICAgICBhY3Rpdml0eUlEOiBpZCxcbiAgICAgICAgYXJpYUxhYmVsSUQ6IGV4aXN0aW5nRW50cnlcbiAgICAgICAgICA/IGV4aXN0aW5nRW50cnkuYXJpYUxhYmVsSURcbiAgICAgICAgICA6IGB3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19hY3Rpdml0eS1sYWJlbC0ke3JhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgNSl9YCxcbiAgICAgICAgZWxlbWVudDogZXhpc3RpbmdFbnRyeSAmJiBleGlzdGluZ0VudHJ5LmVsZW1lbnQsXG4gICAgICAgIGVsZW1lbnRJZCxcbiAgICAgICAga2V5XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgLy8gVGhlcmUgbXVzdCBiZSBvbmUgZm9jdXNlZCAoYS5rLmEuIGFyaWEtYWN0aXZlZGVzY2VuZGFudCkgZGVzaWduYXRlZC4gV2UgZGVmYXVsdCBpdCB0byB0aGUgbGFzdCBvbmUuXG4gICAgaWYgKCFyZW5kZXJpbmdFbGVtZW50cy5maW5kKCh7IGZvY3VzZWQgfSkgPT4gZm9jdXNlZCkpIHtcbiAgICAgIGNvbnN0IGxhc3RFbGVtZW50ID0gcmVuZGVyaW5nRWxlbWVudHNbcmVuZGVyaW5nRWxlbWVudHMubGVuZ3RoIC0gMV07XG5cbiAgICAgIGlmIChsYXN0RWxlbWVudCkge1xuICAgICAgICBsYXN0RWxlbWVudC5mb2N1c2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVuZGVyaW5nRWxlbWVudHM7XG4gIH0sIFtcbiAgICBhY3Rpdml0aWVzV2l0aFJlbmRlcmVyLFxuICAgIGFjdGl2aXR5RWxlbWVudHNSZWYsXG4gICAgYWN0aXZpdHlUcmVlLFxuICAgIGJ1YmJsZUZyb21Vc2VyTnViT2Zmc2V0LFxuICAgIGJ1YmJsZU51Yk9mZnNldCxcbiAgICBjcmVhdGVBY3Rpdml0eVN0YXR1c1JlbmRlcmVyLFxuICAgIGNyZWF0ZUF2YXRhclJlbmRlcmVyLFxuICAgIGhpZGVBbGxUaW1lc3RhbXBzLFxuICAgIHJvb3RFbGVtZW50UmVmLFxuICAgIHNob3dBdmF0YXJJbkdyb3VwXG4gIF0pO1xuXG4gIGNvbnN0IHJlbmRlcmluZ0FjdGl2aXRpZXMgPSB1c2VNZW1vKCgpID0+IHJlbmRlcmluZ0VsZW1lbnRzLm1hcCgoeyBhY3Rpdml0eSB9KSA9PiBhY3Rpdml0eSksIFtyZW5kZXJpbmdFbGVtZW50c10pO1xuXG4gIGNvbnN0IHNjcm9sbFRvQm90dG9tU2Nyb2xsVG8gPSB1c2VTY3JvbGxUbygpO1xuICBjb25zdCBzY3JvbGxUb0JvdHRvbVNjcm9sbFRvRW5kID0gdXNlU2Nyb2xsVG9FbmQoKTtcblxuICBjb25zdCBzY3JvbGxUbyA9IHVzZUNhbGxiYWNrKFxuICAgIChwb3NpdGlvbiwgeyBiZWhhdmlvciA9ICdhdXRvJyB9ID0ge30pID0+IHtcbiAgICAgIGlmICghcG9zaXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdib3RmcmFtZXdvcmstd2ViY2hhdDogRmlyc3QgYXJndW1lbnQgcGFzc2VkIHRvIFwidXNlU2Nyb2xsVG9cIiBtdXN0IGJlIGEgU2Nyb2xsUG9zaXRpb24gb2JqZWN0LidcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBhY3Rpdml0eUlELCBzY3JvbGxUb3AgfSA9IHBvc2l0aW9uO1xuXG4gICAgICBpZiAodHlwZW9mIHNjcm9sbFRvcCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc2Nyb2xsVG9Cb3R0b21TY3JvbGxUbyhzY3JvbGxUb3AsIHsgYmVoYXZpb3IgfSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhY3Rpdml0eUlEICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb25zdCB7IGN1cnJlbnQ6IHJvb3RFbGVtZW50IH0gPSByb290RWxlbWVudFJlZjtcbiAgICAgICAgY29uc3QgeyBlbGVtZW50OiBhY3Rpdml0eUVsZW1lbnQgfSA9XG4gICAgICAgICAgYWN0aXZpdHlFbGVtZW50c1JlZi5jdXJyZW50LmZpbmQoZW50cnkgPT4gZW50cnkuYWN0aXZpdHlJRCA9PT0gYWN0aXZpdHlJRCkgfHwge307XG5cbiAgICAgICAgY29uc3Qgc2Nyb2xsYWJsZUVsZW1lbnQgPSByb290RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcud2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fc2Nyb2xsYWJsZScpO1xuXG4gICAgICAgIGlmIChzY3JvbGxhYmxlRWxlbWVudCAmJiBhY3Rpdml0eUVsZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCBbeyBoZWlnaHQ6IGFjdGl2aXR5RWxlbWVudEhlaWdodCwgeTogYWN0aXZpdHlFbGVtZW50WSB9XSA9IGFjdGl2aXR5RWxlbWVudC5nZXRDbGllbnRSZWN0cygpO1xuICAgICAgICAgIGNvbnN0IFt7IGhlaWdodDogc2Nyb2xsYWJsZUhlaWdodCB9XSA9IHNjcm9sbGFibGVFbGVtZW50LmdldENsaWVudFJlY3RzKCk7XG5cbiAgICAgICAgICBjb25zdCBhY3Rpdml0eUVsZW1lbnRPZmZzZXRUb3AgPSBhY3Rpdml0eUVsZW1lbnRZICsgc2Nyb2xsYWJsZUVsZW1lbnQuc2Nyb2xsVG9wO1xuXG4gICAgICAgICAgY29uc3Qgc2Nyb2xsVG9wID0gTWF0aC5taW4oXG4gICAgICAgICAgICBhY3Rpdml0eUVsZW1lbnRPZmZzZXRUb3AsXG4gICAgICAgICAgICBhY3Rpdml0eUVsZW1lbnRPZmZzZXRUb3AgLSBzY3JvbGxhYmxlSGVpZ2h0ICsgYWN0aXZpdHlFbGVtZW50SGVpZ2h0XG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHNjcm9sbFRvQm90dG9tU2Nyb2xsVG8oc2Nyb2xsVG9wLCB7IGJlaGF2aW9yIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbYWN0aXZpdHlFbGVtZW50c1JlZiwgcm9vdEVsZW1lbnRSZWYsIHNjcm9sbFRvQm90dG9tU2Nyb2xsVG9dXG4gICk7XG5cbiAgY29uc3Qgc2Nyb2xsVG9FbmQgPSB1c2VDYWxsYmFjaygoKSA9PiBzY3JvbGxUb0JvdHRvbVNjcm9sbFRvRW5kKHsgYmVoYXZpb3I6ICdzbW9vdGgnIH0pLCBbc2Nyb2xsVG9Cb3R0b21TY3JvbGxUb0VuZF0pO1xuXG4gIGNvbnN0IHNjcm9sbFJlbGF0aXZlID0gdXNlQ2FsbGJhY2soXG4gICAgKGRpcmVjdGlvbiwgeyBkaXNwbGFjZW1lbnQgfSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB7IGN1cnJlbnQ6IHJvb3RFbGVtZW50IH0gPSByb290RWxlbWVudFJlZjtcblxuICAgICAgaWYgKCFyb290RWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNjcm9sbGFibGUgPSByb290RWxlbWVudC5xdWVyeVNlbGVjdG9yKCcud2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fc2Nyb2xsYWJsZScpO1xuICAgICAgbGV0IG5leHRTY3JvbGxUb3A7XG5cbiAgICAgIGlmICh0eXBlb2YgZGlzcGxhY2VtZW50ID09PSAnbnVtYmVyJykge1xuICAgICAgICBuZXh0U2Nyb2xsVG9wID0gc2Nyb2xsYWJsZS5zY3JvbGxUb3AgKyAoZGlyZWN0aW9uID09PSAnZG93bicgPyAxIDogLTEpICogZGlzcGxhY2VtZW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dFNjcm9sbFRvcCA9IHNjcm9sbGFibGUuc2Nyb2xsVG9wICsgKGRpcmVjdGlvbiA9PT0gJ2Rvd24nID8gMSA6IC0xKSAqIHNjcm9sbGFibGUub2Zmc2V0SGVpZ2h0O1xuICAgICAgfVxuXG4gICAgICBzY3JvbGxUbyhcbiAgICAgICAge1xuICAgICAgICAgIHNjcm9sbFRvcDogTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Nyb2xsYWJsZS5zY3JvbGxIZWlnaHQgLSBzY3JvbGxhYmxlLm9mZnNldEhlaWdodCwgbmV4dFNjcm9sbFRvcCkpXG4gICAgICAgIH0sXG4gICAgICAgIHsgYmVoYXZpb3I6ICdzbW9vdGgnIH1cbiAgICAgICk7XG4gICAgfSxcbiAgICBbcm9vdEVsZW1lbnRSZWYsIHNjcm9sbFRvXVxuICApO1xuXG4gIC8vIFNpbmNlIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGluc3RhbmNlcyBvZiA8QmFzaWNUcmFuc2NyaXB0PiBpbnNpZGUgdGhlIDxDb21wb3Nlcj4sIHdoZW4gdGhlIGRldmVsb3BlciBjYWxscyBgc2Nyb2xsWFhYYCwgd2UgbmVlZCB0byBjYWxsIGl0IG9uIGFsbCBpbnN0YW5jZXMuXG4gIC8vIFdlIGNhbGwgYHVzZVJlZ2lzdGVyU2Nyb2xsWFhYYCB0byByZWdpc3RlciBhIGNhbGxiYWNrIGZ1bmN0aW9uLCB0aGUgYHVzZVNjcm9sbFhYWGAgd2lsbCBtdWx0aXBsZXggdGhlIGNhbGwgaW50byBlYWNoIGluc3RhbmNlIG9mIDxCYXNpY1RyYW5zY3JpcHQ+LlxuICB1c2VSZWdpc3RlclNjcm9sbFRvKHNjcm9sbFRvKTtcbiAgdXNlUmVnaXN0ZXJTY3JvbGxUb0VuZChzY3JvbGxUb0VuZCk7XG4gIHVzZVJlZ2lzdGVyU2Nyb2xsUmVsYXRpdmUoc2Nyb2xsUmVsYXRpdmUpO1xuXG4gIGNvbnN0IGRpc3BhdGNoU2Nyb2xsUG9zaXRpb24gPSB1c2VEaXNwYXRjaFNjcm9sbFBvc2l0aW9uKCk7XG4gIGNvbnN0IHBhdGNoZWREaXNwYXRjaFNjcm9sbFBvc2l0aW9uID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFkaXNwYXRjaFNjcm9sbFBvc2l0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuICh7IHNjcm9sbFRvcCB9KSA9PiB7XG4gICAgICBjb25zdCB7IGN1cnJlbnQ6IHJvb3RFbGVtZW50IH0gPSByb290RWxlbWVudFJlZjtcblxuICAgICAgaWYgKCFyb290RWxlbWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNjcm9sbGFibGVFbGVtZW50ID0gcm9vdEVsZW1lbnQucXVlcnlTZWxlY3RvcignLndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX3Njcm9sbGFibGUnKTtcblxuICAgICAgY29uc3QgW3sgaGVpZ2h0OiBvZmZzZXRIZWlnaHQgfSA9IHt9XSA9IHNjcm9sbGFibGVFbGVtZW50LmdldENsaWVudFJlY3RzKCk7XG5cbiAgICAgIC8vIEZpbmQgdGhlIGFjdGl2aXR5IGp1c3QgYWJvdmUgc2Nyb2xsIHZpZXcgYm90dG9tLlxuICAgICAgLy8gSWYgdGhlIHNjcm9sbCB2aWV3IGlzIGFscmVhZHkgb24gdG9wLCBnZXQgdGhlIGZpcnN0IGFjdGl2aXR5LlxuICAgICAgY29uc3QgZW50cnkgPSBzY3JvbGxhYmxlRWxlbWVudC5zY3JvbGxUb3BcbiAgICAgICAgPyBbLi4uYWN0aXZpdHlFbGVtZW50c1JlZi5jdXJyZW50XS5yZXZlcnNlKCkuZmluZCgoeyBlbGVtZW50IH0pID0+IHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IFt7IHkgfSA9IHt9XSA9IGVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKTtcblxuICAgICAgICAgICAgcmV0dXJuIHkgPCBvZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgfSlcbiAgICAgICAgOiBhY3Rpdml0eUVsZW1lbnRzUmVmLmN1cnJlbnRbMF07XG5cbiAgICAgIGNvbnN0IHsgYWN0aXZpdHlJRCB9ID0gZW50cnkgfHwge307XG5cbiAgICAgIGRpc3BhdGNoU2Nyb2xsUG9zaXRpb24oeyAuLi4oYWN0aXZpdHlJRCA/IHsgYWN0aXZpdHlJRCB9IDoge30pLCBzY3JvbGxUb3AgfSk7XG4gICAgfTtcbiAgfSwgW2FjdGl2aXR5RWxlbWVudHNSZWYsIGRpc3BhdGNoU2Nyb2xsUG9zaXRpb24sIHJvb3RFbGVtZW50UmVmXSk7XG5cbiAgdXNlT2JzZXJ2ZVNjcm9sbFBvc2l0aW9uKHBhdGNoZWREaXNwYXRjaFNjcm9sbFBvc2l0aW9uKTtcblxuICBjb25zdCBbbGFzdEludGVyYWN0ZWRBY3Rpdml0eV0gPSB1c2VBY2tub3dsZWRnZWRBY3Rpdml0eSgpO1xuXG4gIGNvbnN0IGluZGV4T2ZMYXN0SW50ZXJhY3RlZEFjdGl2aXR5ID0gYWN0aXZpdGllcy5pbmRleE9mKGxhc3RJbnRlcmFjdGVkQWN0aXZpdHkpO1xuXG4gIC8vIENyZWF0ZSBhIG5ldyBJRCBmb3IgYXJpYS1hY3RpdmVkZXNjZW5kYW50IGV2ZXJ5IHRpbWUgdGhlIGFjdGl2ZSBkZXNjZW5kYW50IGNoYW5nZS5cbiAgLy8gSW4gb3VyIGRlc2lnbiwgdGhlIHRyYW5zY3JpcHQgd2lsbCBvbmx5IGhhdmUgMSBmb2N1c2VkIGFjdGl2aXR5IGFuZCBpdCBoYXMgYW4gSUQuIE90aGVyIGJsdXJyZWQgYWN0aXZpdGllcyB3aWxsIG5vdCBoYXZlIElEIGFzc2lnbmVkLlxuICAvLyBUaGlzIGhlbHAgd2l0aCBwZXJmb3JtYW5jZS5cbiAgLy8gQnV0IGJyb3dzZXIgdXN1YWxseSBkbyBub29wIGlmIHRoZSB2YWx1ZSBvZiBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQgZG9lc24ndCBjaGFuZ2UuXG4gIC8vIFRoYXQgbWVhbnMsIGlmIHdlIGFzc2lnbiB0aGUgc2FtZSBJRCB0byBhbm90aGVyIGVsZW1lbnQsIGJyb3dzZXIgd2lsbCBkbyBub29wLlxuICAvLyBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgbmV3IElEIHNvIHRoZSBicm93c2VyIHNlZSB0aGVyZSBpcyBhIGNoYW5nZSBpbiBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQgdmFsdWUgYW5kIHBlcmZvcm0gYWNjb3JkaW5nbHkuXG4gIGNvbnN0IGFjdGl2ZURlc2NlbmRhbnRFbGVtZW50SWQgPSB1c2VNZW1vKFxuICAgICgpID0+IGZvY3VzZWRBY3Rpdml0eUtleSAmJiBgd2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZlLWRlc2NlbmRhbnQtJHtyYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDUpfWAsXG4gICAgW2ZvY3VzZWRBY3Rpdml0eUtleV1cbiAgKTtcblxuICBjb25zdCBzY3JvbGxBY3RpdmVEZXNjZW5kYW50SW50b1ZpZXcgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgYWN0aXZlRGVzY2VuZGFudCA9IGFjdGl2ZURlc2NlbmRhbnRFbGVtZW50SWQgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYWN0aXZlRGVzY2VuZGFudEVsZW1lbnRJZCk7XG5cbiAgICAvLyBEb24ndCBzY3JvbGwgYWN0aXZlIGRlc2NlbmRhbnQgaW50byB2aWV3IGlmIHRoZSBmb2N1cyBpcyBhbHJlYWR5IGluc2lkZSBpdC5cbiAgICAvLyBPdGhlcndpc2UsIGdpdmVuIHRoZSBmb2N1cyBpcyBvbiB0aGUgc2VuZCBib3gsIGNsaWNraW5nIG9uIGFueSA8aW5wdXQ+IGluc2lkZSB0aGUgQWRhcHRpdmUgQ2FyZHMgbWF5IGNhdXNlIHRoZSB2aWV3IHRvIG1vdmUuXG4gICAgLy8gVGhpcyBVWCBpcyBub3QgZGVzaXJhYmxlIGJlY2F1c2UgY2xpY2sgc2hvdWxkIG5vdCBjYXVzZSBzY3JvbGwuXG4gICAgaWYgKGFjdGl2ZURlc2NlbmRhbnQgJiYgIWFjdGl2ZURlc2NlbmRhbnQuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgIC8vIENoZWNrcyBpZiBzY3JvbGxJbnRvVmlldyBzdXBwb3J0IG9wdGlvbnMgb3Igbm90LlxuICAgICAgLy8gLSBodHRwczovL2dpdGh1Yi5jb20vTW9kZXJuaXpyL01vZGVybml6ci9pc3N1ZXMvMTU2OCNpc3N1ZWNvbW1lbnQtNDE5NDU3OTcyXG4gICAgICAvLyAtIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ2OTE5NjI3L2lzLWl0LXBvc3NpYmxlLXRvLXRlc3QtZm9yLXNjcm9sbGludG92aWV3LWJyb3dzZXItY29tcGF0aWJpbGl0eVxuICAgICAgaWYgKCdzY3JvbGxCZWhhdmlvcicgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlKSB7XG4gICAgICAgIGFjdGl2ZURlc2NlbmRhbnQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBpcyBmb3IgYnJvd3NlciB0aGF0IGRvZXMgbm90IHN1cHBvcnQgb3B0aW9ucyBwYXNzZWQgdG8gc2Nyb2xsSW50b1ZpZXcoKSwgcG9zc2libHkgSUUxMS5cbiAgICAgICAgY29uc3Qgc2Nyb2xsYWJsZUVsZW1lbnQgPSByb290RWxlbWVudFJlZi5jdXJyZW50LnF1ZXJ5U2VsZWN0b3IoJy53ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19zY3JvbGxhYmxlJyk7XG4gICAgICAgIGNvbnN0IHNjcm9sbFRvcEF0VG9wU2lkZSA9IGFjdGl2ZURlc2NlbmRhbnQub2Zmc2V0VG9wO1xuICAgICAgICBjb25zdCBzY3JvbGxUb3BBdEJvdHRvbVNpZGUgPSBhY3RpdmVEZXNjZW5kYW50Lm9mZnNldFRvcCArIGFjdGl2ZURlc2NlbmRhbnQub2Zmc2V0SGVpZ2h0O1xuXG4gICAgICAgIGlmIChzY3JvbGxUb3BBdFRvcFNpZGUgPCBzY3JvbGxhYmxlRWxlbWVudC5zY3JvbGxUb3ApIHtcbiAgICAgICAgICBzY3JvbGxhYmxlRWxlbWVudC5zY3JvbGxUb3AgPSBzY3JvbGxUb3BBdFRvcFNpZGU7XG4gICAgICAgIH0gZWxzZSBpZiAoc2Nyb2xsVG9wQXRCb3R0b21TaWRlID4gc2Nyb2xsYWJsZUVsZW1lbnQuc2Nyb2xsVG9wICsgc2Nyb2xsYWJsZUVsZW1lbnQub2Zmc2V0SGVpZ2h0KSB7XG4gICAgICAgICAgc2Nyb2xsYWJsZUVsZW1lbnQuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wQXRCb3R0b21TaWRlIC0gc2Nyb2xsYWJsZUVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LCBbYWN0aXZlRGVzY2VuZGFudEVsZW1lbnRJZCwgcm9vdEVsZW1lbnRSZWZdKTtcblxuICBjb25zdCBoYW5kbGVUcmFuc2NyaXB0Rm9jdXMgPSB1c2VDYWxsYmFjayhcbiAgICBldmVudCA9PiB7XG4gICAgICBjb25zdCB7IGN1cnJlbnRUYXJnZXQsIHRhcmdldCB9ID0gZXZlbnQ7XG5cbiAgICAgIC8vIFdoZW4gZm9jdXMgaXMgcGxhY2VkIG9uIHRoZSB0cmFuc2NyaXB0LCBzY3JvbGwgYWN0aXZlIGRlc2NlbmRhbnQgaW50byB0aGUgdmlldy5cbiAgICAgIGN1cnJlbnRUYXJnZXQgPT09IHRhcmdldCAmJiBzY3JvbGxBY3RpdmVEZXNjZW5kYW50SW50b1ZpZXcoKTtcbiAgICB9LFxuICAgIFtzY3JvbGxBY3RpdmVEZXNjZW5kYW50SW50b1ZpZXddXG4gICk7XG5cbiAgLy8gQWZ0ZXIgbmV3IGFyaWEtYWN0aXZlZGVzY2VuZGFudCBpcyBhc3NpZ25lZCwgd2Ugd2lsbCBuZWVkIHRvIHNjcm9sbCBpdCBpbnRvIHZpZXcuXG4gIC8vIFVzZXIgYWdlbnQgd2lsbCBzY3JvbGwgYXV0b21hdGljYWxseSBmb3IgZm9jdXNpbmcgZWxlbWVudCwgYnV0IG5vdCBmb3IgYXJpYS1hY3RpdmVkZXNjZW5kYW50LlxuICAvLyBXZSBuZWVkIHRvIGRvIHRoZSBzY3JvbGxpbmcgbWFudWFsbHkuXG4gIHVzZUVmZmVjdCgoKSA9PiBzY3JvbGxBY3RpdmVEZXNjZW5kYW50SW50b1ZpZXcoKSwgW3Njcm9sbEFjdGl2ZURlc2NlbmRhbnRJbnRvVmlld10pO1xuXG4gIC8vIElmIGFueSBhY3Rpdml0aWVzIGhhcyBjaGFuZ2VkLCByZXNldCB0aGUgYWN0aXZlIGRlc2NlbmRhbnQuXG4gIHVzZUVmZmVjdCgoKSA9PiBzZXRGb2N1c2VkQWN0aXZpdHlLZXkodW5kZWZpbmVkKSwgW2FjdGl2aXRpZXMsIHNldEZvY3VzZWRBY3Rpdml0eUtleV0pO1xuXG4gIGNvbnN0IGZvY3VzUmVsYXRpdmVBY3Rpdml0eSA9IHVzZUNhbGxiYWNrKFxuICAgIGRlbHRhID0+IHtcbiAgICAgIGlmIChpc05hTihkZWx0YSkgfHwgIXJlbmRlcmluZ0VsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc2V0Rm9jdXNlZEFjdGl2aXR5S2V5KHVuZGVmaW5lZCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluZGV4ID0gcmVuZGVyaW5nRWxlbWVudHMuZmluZEluZGV4KCh7IGtleSB9KSA9PiBrZXkgPT09IGZvY3VzZWRBY3Rpdml0eUtleSk7XG4gICAgICBjb25zdCBuZXh0SW5kZXggPSB+aW5kZXhcbiAgICAgICAgPyBNYXRoLm1heCgwLCBNYXRoLm1pbihyZW5kZXJpbmdFbGVtZW50cy5sZW5ndGggLSAxLCBpbmRleCArIGRlbHRhKSlcbiAgICAgICAgOiByZW5kZXJpbmdFbGVtZW50cy5sZW5ndGggLSAxO1xuICAgICAgY29uc3QgbmV4dEZvY3VzZWRBY3Rpdml0eSA9IHJlbmRlcmluZ0VsZW1lbnRzW25leHRJbmRleF07XG5cbiAgICAgIHNldEZvY3VzZWRBY3Rpdml0eUtleShuZXh0Rm9jdXNlZEFjdGl2aXR5LmtleSk7XG4gICAgICByb290RWxlbWVudFJlZi5jdXJyZW50ICYmIHJvb3RFbGVtZW50UmVmLmN1cnJlbnQuZm9jdXMoKTtcbiAgICB9LFxuICAgIFtmb2N1c2VkQWN0aXZpdHlLZXksIHJlbmRlcmluZ0VsZW1lbnRzLCByb290RWxlbWVudFJlZiwgc2V0Rm9jdXNlZEFjdGl2aXR5S2V5XVxuICApO1xuXG4gIGNvbnN0IGhhbmRsZVRyYW5zY3JpcHRLZXlEb3duID0gdXNlQ2FsbGJhY2soXG4gICAgZXZlbnQgPT4ge1xuICAgICAgY29uc3QgeyB0YXJnZXQgfSA9IGV2ZW50O1xuXG4gICAgICBjb25zdCBmcm9tRW5kT2ZUcmFuc2NyaXB0SW5kaWNhdG9yID0gdGFyZ2V0ID09PSB0ZXJtaW5hdG9yUmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCBmcm9tVHJhbnNjcmlwdCA9IHRhcmdldCA9PT0gZXZlbnQuY3VycmVudFRhcmdldDtcblxuICAgICAgaWYgKCFmcm9tRW5kT2ZUcmFuc2NyaXB0SW5kaWNhdG9yICYmICFmcm9tVHJhbnNjcmlwdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBoYW5kbGVkID0gdHJ1ZTtcblxuICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICBmb2N1c1JlbGF0aXZlQWN0aXZpdHkoZnJvbUVuZE9mVHJhbnNjcmlwdEluZGljYXRvciA/IDAgOiAxKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgICBmb2N1c1JlbGF0aXZlQWN0aXZpdHkoZnJvbUVuZE9mVHJhbnNjcmlwdEluZGljYXRvciA/IDAgOiAtMSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnRW5kJzpcbiAgICAgICAgICBmb2N1c1JlbGF0aXZlQWN0aXZpdHkoSW5maW5pdHkpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgICBpZiAoIWZyb21FbmRPZlRyYW5zY3JpcHRJbmRpY2F0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzZWRBY3Rpdml0eUVudHJ5ID0gcmVuZGVyaW5nRWxlbWVudHMuZmluZCgoeyBrZXkgfSkgPT4ga2V5ID09PSBmb2N1c2VkQWN0aXZpdHlLZXkpO1xuXG4gICAgICAgICAgICBpZiAoZm9jdXNlZEFjdGl2aXR5RW50cnkpIHtcbiAgICAgICAgICAgICAgY29uc3QgeyBlbGVtZW50OiBmb2N1c2VkQWN0aXZpdHlFbGVtZW50IH0gPVxuICAgICAgICAgICAgICAgIGFjdGl2aXR5RWxlbWVudHNSZWYuY3VycmVudC5maW5kKCh7IGFjdGl2aXR5IH0pID0+IGFjdGl2aXR5ID09PSBmb2N1c2VkQWN0aXZpdHlFbnRyeS5hY3Rpdml0eSkgfHwge307XG5cbiAgICAgICAgICAgICAgaWYgKGZvY3VzZWRBY3Rpdml0eUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbZmlyc3RUYWJiYWJsZUVsZW1lbnRdID0gdGFiYmFibGVFbGVtZW50cyhmb2N1c2VkQWN0aXZpdHlFbGVtZW50KS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAoeyBjbGFzc05hbWUgfSkgPT4gY2xhc3NOYW1lICE9PSAnd2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZpdHktc2VudGluZWwnXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGZpcnN0VGFiYmFibGVFbGVtZW50ICYmIGZpcnN0VGFiYmFibGVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICAgIGZvY3VzKCdzZW5kQm94V2l0aG91dEtleWJvYXJkJyk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnSG9tZSc6XG4gICAgICAgICAgZm9jdXNSZWxhdGl2ZUFjdGl2aXR5KC1JbmZpbml0eSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBoYW5kbGVkID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChoYW5kbGVkKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgLy8gSWYgYSBjdXN0b20gSFRNTCBjb250cm9sIHdhbnRzIHRvIGhhbmRsZSB1cC9kb3duIGFycm93LCB3ZSB3aWxsIHByZXZlbnQgdGhlbSBmcm9tIGxpc3RlbmluZyB0byB0aGlzIGV2ZW50IHRvIHByZXZlbnQgYnVncyBkdWUgdG8gaGFuZGxpbmcgYXJyb3cga2V5cyB0d2ljZS5cbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbZm9jdXNlZEFjdGl2aXR5S2V5LCBhY3Rpdml0eUVsZW1lbnRzUmVmLCBmb2N1c1JlbGF0aXZlQWN0aXZpdHksIGZvY3VzLCB0ZXJtaW5hdG9yUmVmLCByZW5kZXJpbmdFbGVtZW50c11cbiAgKTtcblxuICBjb25zdCBsYWJlbElkID0gdXNlVW5pcXVlSWQoJ3dlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2xhYmVsJyk7XG5cbiAgLy8gSWYgU0hJRlQtVEFCIGZyb20gXCJFbmQgb2YgdHJhbnNjcmlwdFwiIGluZGljYXRvciwgaWYgZm9jdXNlZEFjdGl2aXR5S2V5IGlzIG5vdCBzZXQgKG9yIG5vIGxvbmdlciBleGlzdHMpLCBzZXQgaXQgdGhlIHRoZSBib3R0b21tb3N0IGFjdGl2aXR5LlxuICBjb25zdCBzZXRCb3R0b21tb3N0Rm9jdXNlZEFjdGl2aXR5S2V5SWZOZWVkZWQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKCF+cmVuZGVyaW5nRWxlbWVudHMuZmluZEluZGV4KCh7IGtleSB9KSA9PiBrZXkgPT09IGZvY3VzZWRBY3Rpdml0eUtleSkpIHtcbiAgICAgIGNvbnN0IHsga2V5OiBsYXN0QWN0aXZpdHlLZXkgfSA9IHJlbmRlcmluZ0VsZW1lbnRzW3JlbmRlcmluZ0VsZW1lbnRzLmxlbmd0aCAtIDFdIHx8IHt9O1xuXG4gICAgICBzZXRGb2N1c2VkQWN0aXZpdHlLZXkobGFzdEFjdGl2aXR5S2V5KTtcbiAgICB9XG4gIH0sIFtmb2N1c2VkQWN0aXZpdHlLZXksIHJlbmRlcmluZ0VsZW1lbnRzLCBzZXRGb2N1c2VkQWN0aXZpdHlLZXldKTtcblxuICBjb25zdCBoYW5kbGVUcmFuc2NyaXB0S2V5RG93bkNhcHR1cmUgPSB1c2VDYWxsYmFjayhcbiAgICBldmVudCA9PiB7XG4gICAgICBjb25zdCB7IGFsdEtleSwgY3RybEtleSwga2V5LCBtZXRhS2V5LCB0YXJnZXQgfSA9IGV2ZW50O1xuXG4gICAgICBpZiAoYWx0S2V5IHx8IChjdHJsS2V5ICYmIGtleSAhPT0gJ3YnKSB8fCBtZXRhS2V5IHx8ICghaW5wdXR0YWJsZUtleShrZXkpICYmIGtleSAhPT0gJ0JhY2tzcGFjZScpKSB7XG4gICAgICAgIC8vIElnbm9yZSBpZiBvbmUgb2YgdGhlIHV0aWxpdHkga2V5IChleGNlcHQgU0hJRlQpIGlzIHByZXNzZWRcbiAgICAgICAgLy8gRS5nLiBDVFJMLUMgb24gYSBsaW5rIGluIG9uZSBvZiB0aGUgbWVzc2FnZSBzaG91bGQgbm90IGp1bXAgdG8gY2hhdCBib3hcbiAgICAgICAgLy8gRS5nLiBcIkFcIiBvciBcIkJhY2tzcGFjZVwiIHNob3VsZCBqdW1wIHRvIGNoYXQgYm94XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gU2VuZCBrZXlzdHJva2VzIHRvIHNlbmQgYm94IGlmIHdlIGFyZSBmb2N1c2luZyBvbiB0aGUgdHJhbnNjcmlwdCBvciB0ZXJtaW5hdG9yLlxuICAgICAgaWYgKHRhcmdldCA9PT0gZXZlbnQuY3VycmVudFRhcmdldCB8fCB0YXJnZXQgPT09IHRlcm1pbmF0b3JSZWYuY3VycmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBmb2N1cygnc2VuZEJveCcpO1xuICAgICAgfVxuICAgIH0sXG4gICAgW2ZvY3VzXVxuICApO1xuXG4gIGNvbnN0IGZvY3VzVHJhbnNjcmlwdENhbGxiYWNrID0gdXNlQ2FsbGJhY2soXG4gICAgKCkgPT4gcm9vdEVsZW1lbnRSZWYuY3VycmVudCAmJiByb290RWxlbWVudFJlZi5jdXJyZW50LmZvY3VzKCksXG4gICAgW3Jvb3RFbGVtZW50UmVmXVxuICApO1xuXG4gIHVzZVJlZ2lzdGVyRm9jdXNUcmFuc2NyaXB0KGZvY3VzVHJhbnNjcmlwdENhbGxiYWNrKTtcblxuICBjb25zdCBoYW5kbGVGb2N1c0FjdGl2aXR5ID0gdXNlQ2FsbGJhY2soXG4gICAga2V5ID0+IHtcbiAgICAgIHNldEZvY3VzZWRBY3Rpdml0eUtleShrZXkpO1xuICAgICAgcm9vdEVsZW1lbnRSZWYuY3VycmVudCAmJiByb290RWxlbWVudFJlZi5jdXJyZW50LmZvY3VzKCk7XG4gICAgfSxcbiAgICBbc2V0Rm9jdXNlZEFjdGl2aXR5S2V5XVxuICApO1xuXG4gIC8vIFdoZW4gdGhlIGZvY3VzaW5nIGFjdGl2aXR5IGhhcyBjaGFuZ2VkLCBkaXNwYXRjaCBhbiBldmVudCB0byBvYnNlcnZlcnMgb2YgXCJ1c2VPYnNlcnZlVHJhbnNjcmlwdEZvY3VzXCIuXG4gIGNvbnN0IGRpc3BhdGNoVHJhbnNjcmlwdEZvY3VzID0gdXNlRGlzcGF0Y2hUcmFuc2NyaXB0Rm9jdXMoKTtcbiAgY29uc3QgZm9jdXNlZEFjdGl2aXR5ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgeyBhY3Rpdml0eSB9ID0gcmVuZGVyaW5nRWxlbWVudHMuZmluZCgoeyBrZXkgfSkgPT4ga2V5ID09PSBmb2N1c2VkQWN0aXZpdHlLZXkpIHx8IHt9O1xuXG4gICAgcmV0dXJuIGFjdGl2aXR5O1xuICB9LCBbZm9jdXNlZEFjdGl2aXR5S2V5LCByZW5kZXJpbmdFbGVtZW50c10pO1xuXG4gIHVzZU1lbW8oXG4gICAgKCkgPT4gZGlzcGF0Y2hUcmFuc2NyaXB0Rm9jdXMgJiYgZGlzcGF0Y2hUcmFuc2NyaXB0Rm9jdXMoeyBhY3Rpdml0eTogZm9jdXNlZEFjdGl2aXR5IH0pLFxuICAgIFtkaXNwYXRjaFRyYW5zY3JpcHRGb2N1cywgZm9jdXNlZEFjdGl2aXR5XVxuICApO1xuXG4gIC8vIFRoaXMgaXMgcmVxdWlyZWQgYnkgSUUxMS5cbiAgLy8gV2hlbiB0aGUgdXNlciBjbGlja3Mgb24gYW5kIGVtcHR5IHNwYWNlIChhLmsuYS4gZmlsbGVyKSBpbiBhbiBlbXB0eSB0cmFuc2NyaXB0LCBJRTExIHNheXMgdGhlIGZvY3VzIGlzIG9uIHRoZSA8ZGl2IGNsYXNzTmFtZT1cImZpbGxlclwiPixcbiAgLy8gZGVzcGl0ZSB0aGUgZmFjdCB0aGVyZSBhcmUgbm8gXCJ0YWJJbmRleFwiIGF0dHJpYnV0ZXMgc2V0IG9uIHRoZSBmaWxsZXIuXG4gIC8vIFdlIG5lZWQgdG8gYXJ0aWZpY2lhbGx5IHNlbmQgdGhlIGZvY3VzIGJhY2sgdG8gdGhlIHRyYW5zY3JpcHQuXG4gIGNvbnN0IGhhbmRsZUZvY3VzRmlsbGVyID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGNvbnN0IHsgY3VycmVudCB9ID0gcm9vdEVsZW1lbnRSZWY7XG5cbiAgICBjdXJyZW50ICYmIGN1cnJlbnQuZm9jdXMoKTtcbiAgfSwgW3Jvb3RFbGVtZW50UmVmXSk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQ9e2ZvY3VzZWRBY3Rpdml0eUtleSA/IGFjdGl2ZURlc2NlbmRhbnRFbGVtZW50SWQgOiB1bmRlZmluZWR9XG4gICAgICBhcmlhLWxhYmVsbGVkYnk9e2xhYmVsSWR9XG4gICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoXG4gICAgICAgICd3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0JyxcbiAgICAgICAgYmFzaWNUcmFuc2NyaXB0U3R5bGVTZXQgKyAnJyxcbiAgICAgICAgcm9vdENsYXNzTmFtZSxcbiAgICAgICAgKGNsYXNzTmFtZSB8fCAnJykgKyAnJ1xuICAgICAgKX1cbiAgICAgIGRpcj17ZGlyZWN0aW9ufVxuICAgICAgb25Gb2N1cz17aGFuZGxlVHJhbnNjcmlwdEZvY3VzfVxuICAgICAgb25LZXlEb3duPXtoYW5kbGVUcmFuc2NyaXB0S2V5RG93bn1cbiAgICAgIG9uS2V5RG93bkNhcHR1cmU9e2hhbmRsZVRyYW5zY3JpcHRLZXlEb3duQ2FwdHVyZX1cbiAgICAgIHJlZj17cm9vdEVsZW1lbnRSZWZ9XG4gICAgICAvLyBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiIHdpbGwgb25seSB3b3JrcyB3aXRoIGEgbnVtYmVyIG9mIHJvbGVzIGFuZCBpdCBtdXN0IGJlIGV4cGxpY2l0bHkgc2V0LlxuICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLyNhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcbiAgICAgIHJvbGU9XCJncm91cFwiXG4gICAgICAvLyBGb3IgdXAvZG93biBhcnJvdyBrZXkgbmF2aWdhdGlvbiBhY3Jvc3MgYWN0aXZpdGllcywgdGhpcyBjb21wb25lbnQgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgdGFiIHNlcXVlbmNlLlxuICAgICAgLy8gT3RoZXJ3aXNlLCBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiIHdpbGwgbm90IGJlIG5hcnJhdGVkIHdoZW4gdGhlIHVzZXIgcHJlc3MgdXAvZG93biBhcnJvdyBrZXlzLlxuICAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLXByYWN0aWNlcy0xLjEvI2tiZF9mb2N1c19hY3RpdmVkZXNjZW5kYW50XG4gICAgICB0YWJJbmRleD17MH1cbiAgICA+XG4gICAgICA8U2NyZWVuUmVhZGVyVGV4dCBpZD17bGFiZWxJZH0gdGV4dD17dHJhbnNjcmlwdEFyaWFMYWJlbH0gLz5cbiAgICAgIHsvKiBUaGlzIDxzZWN0aW9uPiBpcyBmb3IgbGl2ZSByZWdpb24gb25seS4gQ29udGVudCBpcyBtYWRlIGludmlzaWJsZSB0aHJvdWdoIENTUy4gKi99XG4gICAgICA8c2VjdGlvblxuICAgICAgICBhcmlhLWF0b21pYz17ZmFsc2V9XG4gICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgIGFyaWEtcmVsZXZhbnQ9XCJhZGRpdGlvbnNcIlxuICAgICAgICBhcmlhLXJvbGVkZXNjcmlwdGlvbj17dHJhbnNjcmlwdFJvbGVEZXNjcmlwdGlvbn1cbiAgICAgICAgcm9sZT1cImxvZ1wiXG4gICAgICA+XG4gICAgICAgIHtyZW5kZXJpbmdFbGVtZW50c1xuICAgICAgICAgIC5maWx0ZXIoKHsgc3VwcG9ydFNjcmVlblJlYWRlciB9KSA9PiBzdXBwb3J0U2NyZWVuUmVhZGVyKVxuICAgICAgICAgIC5tYXAoKHsgYWN0aXZpdHksIGxpdmVSZWdpb25LZXkgfSkgPT4gKFxuICAgICAgICAgICAgPEZhZGUgZmFkZUFmdGVyPXtpbnRlcm5hbExpdmVSZWdpb25GYWRlQWZ0ZXJ9IGtleT17bGl2ZVJlZ2lvbktleX0+XG4gICAgICAgICAgICAgIHsoKSA9PiA8U2NyZWVuUmVhZGVyQWN0aXZpdHkgYWN0aXZpdHk9e2FjdGl2aXR5fSAvPn1cbiAgICAgICAgICAgIDwvRmFkZT5cbiAgICAgICAgICApKX1cbiAgICAgIDwvc2VjdGlvbj5cbiAgICAgIHsvKiBUT0RPOiBbUDJdIEZpeCBFU0xpbnQgZXJyb3IgYG5vLXVzZS1iZWZvcmUtZGVmaW5lYCAqL31cbiAgICAgIHsvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVzZS1iZWZvcmUtZGVmaW5lICovfVxuICAgICAgPEludGVybmFsVHJhbnNjcmlwdFNjcm9sbGFibGVcbiAgICAgICAgYWN0aXZpdGllcz17cmVuZGVyaW5nQWN0aXZpdGllc31cbiAgICAgICAgb25Gb2N1c0FjdGl2aXR5PXtoYW5kbGVGb2N1c0FjdGl2aXR5fVxuICAgICAgICBvbkZvY3VzRmlsbGVyPXtoYW5kbGVGb2N1c0ZpbGxlcn1cbiAgICAgICAgdGVybWluYXRvclJlZj17dGVybWluYXRvclJlZn1cbiAgICAgID5cbiAgICAgICAge3JlbmRlcmluZ0VsZW1lbnRzLm1hcChcbiAgICAgICAgICAoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFjdGl2aXR5LFxuICAgICAgICAgICAgICBjYWxsYmFja1JlZixcbiAgICAgICAgICAgICAgZm9jdXNBY3Rpdml0eSxcbiAgICAgICAgICAgICAgaGFuZGxlRm9jdXMsXG4gICAgICAgICAgICAgIGhhbmRsZUtleURvd24sXG4gICAgICAgICAgICAgIGhhbmRsZU1vdXNlRG93bkNhcHR1cmUsXG4gICAgICAgICAgICAgIGhpZGVUaW1lc3RhbXAsXG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgcmVuZGVyQWN0aXZpdHksXG4gICAgICAgICAgICAgIHJlbmRlckFjdGl2aXR5U3RhdHVzLFxuICAgICAgICAgICAgICByZW5kZXJBdmF0YXIsXG4gICAgICAgICAgICAgIHJvbGUsXG4gICAgICAgICAgICAgIHNob3VsZFNwZWFrLFxuICAgICAgICAgICAgICBzaG93Q2FsbG91dCxcbiAgICAgICAgICAgICAgc3VwcG9ydFNjcmVlblJlYWRlclxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGluZGV4XG4gICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGFyaWFMYWJlbElELCBlbGVtZW50IH0gPVxuICAgICAgICAgICAgICBhY3Rpdml0eUVsZW1lbnRzUmVmLmN1cnJlbnQuZmluZChlbnRyeSA9PiBlbnRyeS5hY3Rpdml0eSA9PT0gYWN0aXZpdHkpIHx8IHt9O1xuICAgICAgICAgICAgY29uc3QgYWN0aXZlRGVzY2VuZGFudCA9IGZvY3VzZWRBY3Rpdml0eUtleSA9PT0ga2V5O1xuICAgICAgICAgICAgY29uc3QgaXNDb250ZW50SW50ZXJhY3RpdmUgPSAhIShlbGVtZW50XG4gICAgICAgICAgICAgID8gdGFiYmFibGVFbGVtZW50cyhlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy53ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19hY3Rpdml0eS1ib3gnKSkubGVuZ3RoXG4gICAgICAgICAgICAgIDogMCk7XG5cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWxsZWRieT17YXJpYUxhYmVsSUR9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKCd3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19hY3Rpdml0eScsIHtcbiAgICAgICAgICAgICAgICAgICd3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19hY3Rpdml0eS0tYWNrbm93bGVkZ2VkJzogaW5kZXggPD0gaW5kZXhPZkxhc3RJbnRlcmFjdGVkQWN0aXZpdHksXG4gICAgICAgICAgICAgICAgICAnd2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZpdHktLWZyb20tYm90Jzogcm9sZSAhPT0gJ3VzZXInLFxuICAgICAgICAgICAgICAgICAgJ3dlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2FjdGl2aXR5LS1mcm9tLXVzZXInOiByb2xlID09PSAndXNlcidcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAvLyBTZXQgXCJpZFwiIGZvciB2YWxpZCBmb3IgYWNjZXNzaWJpbGl0eS5cbiAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QvZm9yYmlkLWRvbS1wcm9wcyAqL1xuICAgICAgICAgICAgICAgIGlkPXthY3RpdmVEZXNjZW5kYW50ID8gYWN0aXZlRGVzY2VuZGFudEVsZW1lbnRJZCA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgICBrZXk9e2tleX1cbiAgICAgICAgICAgICAgICBvbkZvY3VzPXtoYW5kbGVGb2N1c31cbiAgICAgICAgICAgICAgICBvbktleURvd249e2hhbmRsZUtleURvd259XG4gICAgICAgICAgICAgICAgb25Nb3VzZURvd25DYXB0dXJlPXtoYW5kbGVNb3VzZURvd25DYXB0dXJlfVxuICAgICAgICAgICAgICAgIHJlZj17Y2FsbGJhY2tSZWZ9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7c3VwcG9ydFNjcmVlblJlYWRlciAmJiAoXG4gICAgICAgICAgICAgICAgICA8U2NyZWVuUmVhZGVyQWN0aXZpdHkgYWN0aXZpdHk9e2FjdGl2aXR5fSBpZD17YXJpYUxhYmVsSUR9IHJlbmRlckF0dGFjaG1lbnRzPXtmYWxzZX0+XG4gICAgICAgICAgICAgICAgICAgIHshIWlzQ29udGVudEludGVyYWN0aXZlICYmIDxwPnthY3Rpdml0eUludGVyYWN0aXZlQWx0fTwvcD59XG4gICAgICAgICAgICAgICAgICA8L1NjcmVlblJlYWRlckFjdGl2aXR5PlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPEZvY3VzUmVkaXJlY3RvclxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwid2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZpdHktc2VudGluZWxcIlxuICAgICAgICAgICAgICAgICAgb25Gb2N1cz17Zm9jdXNBY3Rpdml0eX1cbiAgICAgICAgICAgICAgICAgIHJlZGlyZWN0UmVmPXtyb290RWxlbWVudFJlZn1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZpdHktYm94XCI+XG4gICAgICAgICAgICAgICAgICB7cmVuZGVyQWN0aXZpdHkoe1xuICAgICAgICAgICAgICAgICAgICBoaWRlVGltZXN0YW1wLFxuICAgICAgICAgICAgICAgICAgICByZW5kZXJBY3Rpdml0eVN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyQXZhdGFyLFxuICAgICAgICAgICAgICAgICAgICBzaG93Q2FsbG91dFxuICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAge3Nob3VsZFNwZWFrICYmIDxTcGVha0FjdGl2aXR5IGFjdGl2aXR5PXthY3Rpdml0eX0gLz59XG4gICAgICAgICAgICAgICAgPEZvY3VzUmVkaXJlY3RvclxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwid2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZpdHktc2VudGluZWxcIlxuICAgICAgICAgICAgICAgICAgb25Gb2N1cz17Zm9jdXNBY3Rpdml0eX1cbiAgICAgICAgICAgICAgICAgIHJlZGlyZWN0UmVmPXtyb290RWxlbWVudFJlZn1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcygnd2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZpdHktaW5kaWNhdG9yJywge1xuICAgICAgICAgICAgICAgICAgICAnd2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fYWN0aXZpdHktaW5kaWNhdG9yLS1maXJzdCc6ICFpbmRleCxcbiAgICAgICAgICAgICAgICAgICAgJ3dlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2FjdGl2aXR5LWluZGljYXRvci0tZm9jdXMnOiBhY3RpdmVEZXNjZW5kYW50XG4gICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICl9XG4gICAgICA8L0ludGVybmFsVHJhbnNjcmlwdFNjcm9sbGFibGU+XG4gICAgICB7ISFyZW5kZXJpbmdFbGVtZW50cy5sZW5ndGggJiYgKFxuICAgICAgICA8UmVhY3QuRnJhZ21lbnQ+XG4gICAgICAgICAgPEZvY3VzUmVkaXJlY3RvclxuICAgICAgICAgICAgY2xhc3NOYW1lPVwid2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fc2VudGluZWxcIlxuICAgICAgICAgICAgb25Gb2N1cz17c2V0Qm90dG9tbW9zdEZvY3VzZWRBY3Rpdml0eUtleUlmTmVlZGVkfVxuICAgICAgICAgICAgcmVkaXJlY3RSZWY9e3Jvb3RFbGVtZW50UmVmfVxuICAgICAgICAgIC8+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X190ZXJtaW5hdG9yXCIgcmVmPXt0ZXJtaW5hdG9yUmVmfSB0YWJJbmRleD17MH0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX3Rlcm1pbmF0b3ItYm9keVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX3Rlcm1pbmF0b3ItdGV4dFwiPnt0ZXJtaW5hdG9yVGV4dH08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L1JlYWN0LkZyYWdtZW50PlxuICAgICAgKX1cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2ViY2hhdF9fYmFzaWMtdHJhbnNjcmlwdF9fZm9jdXMtaW5kaWNhdG9yXCIgLz5cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbkludGVybmFsVHJhbnNjcmlwdC5kZWZhdWx0UHJvcHMgPSB7XG4gIGNsYXNzTmFtZTogJydcbn07XG5cbkludGVybmFsVHJhbnNjcmlwdC5wcm9wVHlwZXMgPSB7XG4gIGFjdGl2aXR5RWxlbWVudHNSZWY6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgY3VycmVudDogUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWRcbiAgfSkuaXNSZXF1aXJlZCxcbiAgY2xhc3NOYW1lOiBQcm9wVHlwZXMuc3RyaW5nXG59O1xuXG5jb25zdCBJbnRlcm5hbFNjcmVlblJlYWRlclRyYW5zY3JpcHQgPSAoeyByZW5kZXJpbmdFbGVtZW50cyB9KSA9PiB7XG4gIGNvbnN0IGxvY2FsaXplID0gdXNlTG9jYWxpemVyKCk7XG4gIGNvbnN0IFtpbnRlcm5hbExpdmVSZWdpb25GYWRlQWZ0ZXJdID0gdXNlU3R5bGVPcHRpb25zKCk7XG5cbiAgY29uc3QgdHJhbnNjcmlwdFJvbGVEZXNjcmlwdGlvbiA9IGxvY2FsaXplKCdUUkFOU0NSSVBUX0FSSUFfUk9MRV9BTFQnKTtcblxuICByZXR1cm4gKFxuICAgIDxzZWN0aW9uXG4gICAgICBhcmlhLWF0b21pYz17ZmFsc2V9XG4gICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgYXJpYS1yZWxldmFudD1cImFkZGl0aW9uc1wiXG4gICAgICBhcmlhLXJvbGVkZXNjcmlwdGlvbj17dHJhbnNjcmlwdFJvbGVEZXNjcmlwdGlvbn1cbiAgICAgIHJvbGU9XCJsb2dcIlxuICAgID5cbiAgICAgIHtyZW5kZXJpbmdFbGVtZW50cy5tYXAoKHsgYWN0aXZpdHksIGxpdmVSZWdpb25LZXkgfSkgPT4gKFxuICAgICAgICA8RmFkZSBmYWRlQWZ0ZXI9e2ludGVybmFsTGl2ZVJlZ2lvbkZhZGVBZnRlcn0ga2V5PXtsaXZlUmVnaW9uS2V5fT5cbiAgICAgICAgICB7KCkgPT4gPFNjcmVlblJlYWRlckFjdGl2aXR5IGFjdGl2aXR5PXthY3Rpdml0eX0gLz59XG4gICAgICAgIDwvRmFkZT5cbiAgICAgICkpfVxuICAgIDwvc2VjdGlvbj5cbiAgKTtcbn07XG5cbkludGVybmFsU2NyZWVuUmVhZGVyVHJhbnNjcmlwdC5wcm9wVHlwZXMgPSB7XG4gIHJlbmRlcmluZ0VsZW1lbnRzOiBQcm9wVHlwZXMuYXJyYXlPZihcbiAgICBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgYWN0aXZpdHk6IFByb3BUeXBlcy5hbnksXG4gICAgICBsaXZlUmVnaW9uS2V5OiBQcm9wVHlwZXMuc3RyaW5nXG4gICAgfSlcbiAgKS5pc1JlcXVpcmVkXG59O1xuXG4vLyBTZXBhcmF0aW5nIGhpZ2gtZnJlcXVlbmN5IGhvb2tzIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuXG5jb25zdCBJbnRlcm5hbFRyYW5zY3JpcHRTY3JvbGxhYmxlID0gKHsgYWN0aXZpdGllcywgY2hpbGRyZW4sIG9uRm9jdXNBY3Rpdml0eSwgb25Gb2N1c0ZpbGxlciwgdGVybWluYXRvclJlZiB9KSA9PiB7XG4gIGNvbnN0IFt7IGFjdGl2aXRpZXM6IGFjdGl2aXRpZXNTdHlsZVNldCB9XSA9IHVzZVN0eWxlU2V0KCk7XG4gIGNvbnN0IFthbmltYXRpbmdUb0VuZF0gPSB1c2VBbmltYXRpbmdUb0VuZCgpO1xuICBjb25zdCBbYXRFbmRdID0gdXNlQXRFbmQoKTtcbiAgY29uc3QgW3N0aWNreV0gPSB1c2VTdGlja3koKTtcbiAgY29uc3QgW3N0eWxlT3B0aW9uc10gPSB1c2VTdHlsZU9wdGlvbnMoKTtcbiAgY29uc3QgbGFzdFZpc2libGVBY3Rpdml0eUlkID0gZ2V0QWN0aXZpdHlVbmlxdWVJZChhY3Rpdml0aWVzW2FjdGl2aXRpZXMubGVuZ3RoIC0gMV0gfHwge30pOyAvLyBBY3Rpdml0eSBJRCBvZiB0aGUgbGFzdCB2aXNpYmxlIGFjdGl2aXR5IGluIHRoZSBsaXN0LlxuICBjb25zdCBsb2NhbGl6ZSA9IHVzZUxvY2FsaXplcigpO1xuICBjb25zdCBzY3JvbGxUb0VuZCA9IHVzZVNjcm9sbFRvRW5kKCk7XG5cbiAgY29uc3QgbGFzdFJlYWRBY3Rpdml0eUlkUmVmID0gdXNlUmVmKGxhc3RWaXNpYmxlQWN0aXZpdHlJZCk7XG4gIGNvbnN0IHRyYW5zY3JpcHRSb2xlRGVzY3JpcHRpb24gPSBsb2NhbGl6ZSgnVFJBTlNDUklQVF9BUklBX1JPTEVfQUxUJyk7XG5cbiAgY29uc3QgaGFuZGxlU2Nyb2xsVG9FbmRCdXR0b25DbGljayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzY3JvbGxUb0VuZCh7IGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcblxuICAgIC8vIEFmdGVyIHRoZSBcIk5ldyBtZXNzYWdlXCIgYnV0dG9uIGlzIGNsaWNrZWQsIGZvY3VzIG9uIHRoZSBmaXJzdCB1bnJlYWQgYWN0aXZpdHkuXG4gICAgY29uc3QgaW5kZXggPSBhY3Rpdml0aWVzLmZpbmRJbmRleCgoeyBpZCB9KSA9PiBpZCA9PT0gbGFzdFJlYWRBY3Rpdml0eUlkUmVmLmN1cnJlbnQpO1xuXG4gICAgaWYgKH5pbmRleCkge1xuICAgICAgY29uc3QgZmlyc3RVbnJlYWRBY3Rpdml0eSA9IGFjdGl2aXRpZXNbaW5kZXggKyAxXTtcblxuICAgICAgaWYgKGZpcnN0VW5yZWFkQWN0aXZpdHkpIHtcbiAgICAgICAgcmV0dXJuIG9uRm9jdXNBY3Rpdml0eShnZXRBY3Rpdml0eVVuaXF1ZUlkKGZpcnN0VW5yZWFkQWN0aXZpdHkpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB7IGN1cnJlbnQgfSA9IHRlcm1pbmF0b3JSZWY7XG5cbiAgICBjdXJyZW50ICYmIGN1cnJlbnQuZm9jdXMoKTtcbiAgfSwgW2FjdGl2aXRpZXMsIGxhc3RSZWFkQWN0aXZpdHlJZFJlZiwgb25Gb2N1c0FjdGl2aXR5LCBzY3JvbGxUb0VuZCwgdGVybWluYXRvclJlZl0pO1xuXG4gIGlmIChhdEVuZCB8fCBzdGlja3kpIHtcbiAgICAvLyBJZiBpdCBpcyBzdGlja3kgb3IgYXQgdGhlIGVuZCwgdGhlIHVzZXIgaXMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgdHJhbnNjcmlwdCwgZXZlcnl0aGluZyBpcyByZWFkLlxuICAgIC8vIFNvIG1hcmsgdGhlIGFjdGl2aXR5IElEIGFzIHJlYWQuXG4gICAgbGFzdFJlYWRBY3Rpdml0eUlkUmVmLmN1cnJlbnQgPSBsYXN0VmlzaWJsZUFjdGl2aXR5SWQ7XG4gIH1cblxuICBjb25zdCBTY3JvbGxUb0VuZEJ1dHRvbiA9IHVzZUNyZWF0ZVNjcm9sbFRvRW5kQnV0dG9uUmVuZGVyZXIoKSh7XG4gICAgYXRFbmQ6IGFuaW1hdGluZ1RvRW5kIHx8IGF0RW5kIHx8IHN0aWNreSxcbiAgICBzdHlsZU9wdGlvbnMsXG5cbiAgICAvLyBVbnJlYWQgbWVhbnM6XG4gICAgLy8gMS4gTGFzdCByZWFkIGlzIG5vdCB0aGUgbGFzdCBvbmUgaW4gdGhlIHRyYW5zY3JpcHQsIGFuZDtcbiAgICAvLyAyLiBMYXN0IHJlYWQgaXMgc3RpbGwgaW4gdGhlIHRyYW5zY3JpcHQuXG4gICAgdW5yZWFkOlxuICAgICAgbGFzdFZpc2libGVBY3Rpdml0eUlkICE9PSBsYXN0UmVhZEFjdGl2aXR5SWRSZWYuY3VycmVudCAmJlxuICAgICAgISF+YWN0aXZpdGllcy5maW5kSW5kZXgoYWN0aXZpdHkgPT4gZ2V0QWN0aXZpdHlVbmlxdWVJZChhY3Rpdml0eSkgPT09IGxhc3RSZWFkQWN0aXZpdHlJZFJlZi5jdXJyZW50KVxuICB9KTtcblxuICByZXR1cm4gKFxuICAgIDxSZWFjdC5GcmFnbWVudD5cbiAgICAgIHtTY3JvbGxUb0VuZEJ1dHRvbiAmJiA8U2Nyb2xsVG9FbmRCdXR0b24gb25DbGljaz17aGFuZGxlU2Nyb2xsVG9FbmRCdXR0b25DbGlja30gLz59XG4gICAgICB7ISFSZWFjdC5DaGlsZHJlbi5jb3VudChjaGlsZHJlbikgJiYgKFxuICAgICAgICA8Rm9jdXNSZWRpcmVjdG9yIGNsYXNzTmFtZT1cIndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX3NlbnRpbmVsXCIgcmVkaXJlY3RSZWY9e3Rlcm1pbmF0b3JSZWZ9IC8+XG4gICAgICApfVxuICAgICAgPFJlYWN0U2Nyb2xsVG9Cb3R0b21QYW5lbCBjbGFzc05hbWU9XCJ3ZWJjaGF0X19iYXNpYy10cmFuc2NyaXB0X19zY3JvbGxhYmxlXCI+XG4gICAgICAgIDxkaXYgYXJpYS1oaWRkZW49e3RydWV9IGNsYXNzTmFtZT1cIndlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX2ZpbGxlclwiIG9uRm9jdXM9e29uRm9jdXNGaWxsZXJ9IC8+XG4gICAgICAgIDx1bFxuICAgICAgICAgIGFyaWEtcm9sZWRlc2NyaXB0aW9uPXt0cmFuc2NyaXB0Um9sZURlc2NyaXB0aW9ufVxuICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhhY3Rpdml0aWVzU3R5bGVTZXQgKyAnJywgJ3dlYmNoYXRfX2Jhc2ljLXRyYW5zY3JpcHRfX3RyYW5zY3JpcHQnKX1cbiAgICAgICAgICByb2xlPVwibGlzdFwiXG4gICAgICAgID5cbiAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDwvdWw+XG4gICAgICAgIDxCYXNpY1R5cGluZ0luZGljYXRvciAvPlxuICAgICAgPC9SZWFjdFNjcm9sbFRvQm90dG9tUGFuZWw+XG4gICAgPC9SZWFjdC5GcmFnbWVudD5cbiAgKTtcbn07XG5cbkludGVybmFsVHJhbnNjcmlwdFNjcm9sbGFibGUucHJvcFR5cGVzID0ge1xuICBhY3Rpdml0aWVzOiBQcm9wVHlwZXMuYXJyYXkuaXNSZXF1aXJlZCxcbiAgY2hpbGRyZW46IFByb3BUeXBlcy5hbnkuaXNSZXF1aXJlZCxcbiAgb25Gb2N1c0FjdGl2aXR5OiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBvbkZvY3VzRmlsbGVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICB0ZXJtaW5hdG9yUmVmOiBQcm9wVHlwZXMuYW55LmlzUmVxdWlyZWRcbn07XG5cbmNvbnN0IFNldFNjcm9sbGVyID0gKHsgYWN0aXZpdHlFbGVtZW50c1JlZiwgc2Nyb2xsZXJSZWYgfSkgPT4ge1xuICBjb25zdCBbXG4gICAgeyBhdXRvU2Nyb2xsU25hcE9uQWN0aXZpdHksIGF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eU9mZnNldCwgYXV0b1Njcm9sbFNuYXBPblBhZ2UsIGF1dG9TY3JvbGxTbmFwT25QYWdlT2Zmc2V0IH1cbiAgXSA9IHVzZVN0eWxlT3B0aW9ucygpO1xuICBjb25zdCBbYWN0aXZpdGllc10gPSB1c2VBY3Rpdml0aWVzKCk7XG4gIGNvbnN0IFtsYXN0QWNrbm93bGVkZ2VkQWN0aXZpdHldID0gdXNlQWNrbm93bGVkZ2VkQWN0aXZpdHkoKTtcblxuICBjb25zdCBhY3Rpdml0aWVzUmVmID0gdXNlUmVmKGFjdGl2aXRpZXMpO1xuICBjb25zdCBsYXN0QWNrbm93bGVkZ2VkQWN0aXZpdHlSZWYgPSB1c2VSZWYobGFzdEFja25vd2xlZGdlZEFjdGl2aXR5KTtcblxuICBhY3Rpdml0aWVzUmVmLmN1cnJlbnQgPSBhY3Rpdml0aWVzO1xuICBsYXN0QWNrbm93bGVkZ2VkQWN0aXZpdHlSZWYuY3VycmVudCA9IGxhc3RBY2tub3dsZWRnZWRBY3Rpdml0eTtcblxuICBzY3JvbGxlclJlZi5jdXJyZW50ID0gdXNlQ2FsbGJhY2soXG4gICAgKHsgb2Zmc2V0SGVpZ2h0LCBzY3JvbGxUb3AgfSkgPT4ge1xuICAgICAgY29uc3QgcGF0Y2hlZEF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eSA9XG4gICAgICAgIHR5cGVvZiBhdXRvU2Nyb2xsU25hcE9uQWN0aXZpdHkgPT09ICdudW1iZXInXG4gICAgICAgICAgPyBNYXRoLm1heCgwLCBhdXRvU2Nyb2xsU25hcE9uQWN0aXZpdHkpXG4gICAgICAgICAgOiBhdXRvU2Nyb2xsU25hcE9uQWN0aXZpdHlcbiAgICAgICAgICA/IDFcbiAgICAgICAgICA6IDA7XG4gICAgICBjb25zdCBwYXRjaGVkQXV0b1Njcm9sbFNuYXBPblBhZ2UgPVxuICAgICAgICB0eXBlb2YgYXV0b1Njcm9sbFNuYXBPblBhZ2UgPT09ICdudW1iZXInXG4gICAgICAgICAgPyBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBhdXRvU2Nyb2xsU25hcE9uUGFnZSkpXG4gICAgICAgICAgOiBhdXRvU2Nyb2xsU25hcE9uUGFnZVxuICAgICAgICAgID8gMVxuICAgICAgICAgIDogMDtcbiAgICAgIGNvbnN0IHBhdGNoZWRBdXRvU2Nyb2xsU25hcE9uQWN0aXZpdHlPZmZzZXQgPVxuICAgICAgICB0eXBlb2YgYXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5T2Zmc2V0ID09PSAnbnVtYmVyJyA/IGF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eU9mZnNldCA6IDA7XG4gICAgICBjb25zdCBwYXRjaGVkQXV0b1Njcm9sbFNuYXBPblBhZ2VPZmZzZXQgPVxuICAgICAgICB0eXBlb2YgYXV0b1Njcm9sbFNuYXBPblBhZ2VPZmZzZXQgPT09ICdudW1iZXInID8gYXV0b1Njcm9sbFNuYXBPblBhZ2VPZmZzZXQgOiAwO1xuXG4gICAgICBpZiAocGF0Y2hlZEF1dG9TY3JvbGxTbmFwT25BY3Rpdml0eSB8fCBwYXRjaGVkQXV0b1Njcm9sbFNuYXBPblBhZ2UpIHtcbiAgICAgICAgY29uc3QgeyBjdXJyZW50OiBhY3Rpdml0aWVzIH0gPSBhY3Rpdml0aWVzUmVmO1xuICAgICAgICBjb25zdCB7IGN1cnJlbnQ6IGFjdGl2aXR5RWxlbWVudHMgfSA9IGFjdGl2aXR5RWxlbWVudHNSZWY7XG4gICAgICAgIGNvbnN0IHsgY3VycmVudDogbGFzdEFja25vd2xlZGdlZEFjdGl2aXR5IH0gPSBsYXN0QWNrbm93bGVkZ2VkQWN0aXZpdHlSZWY7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGxhc3RBY2tub3dsZWRnZWRBY3Rpdml0eUluZGV4ID0gYWN0aXZpdGllcy5pbmRleE9mKGxhc3RBY2tub3dsZWRnZWRBY3Rpdml0eSk7XG5cbiAgICAgICAgaWYgKH5sYXN0QWNrbm93bGVkZ2VkQWN0aXZpdHlJbmRleCkge1xuICAgICAgICAgIC8vIFRoZSBhY3Rpdml0eSB0aGF0IHdlIGFja25vd2xlZGdlZCBjb3VsZCBiZSBub3QgcmVuZGVyZWQsIHN1Y2ggYXMgcG9zdCBiYWNrIGFjdGl2aXR5LlxuICAgICAgICAgIC8vIFdoZW4gY2FsY3VsYXRpbmcgc2Nyb2xsIHNuYXAsIHdlIGNhbiBvbmx5IGJhc2Ugb24gdGhlIGZpcnN0IHVuYWNrbm93bGVkZ2VkLWFuZC1yZW5kZXJpbmcgYWN0aXZpdHkuXG4gICAgICAgICAgbGV0IGZpcnN0VW5hY2tub3dsZWRnZWRBY3Rpdml0eUVsZW1lbnRJbmRleCA9IC0xO1xuXG4gICAgICAgICAgZm9yIChsZXQgaW5kZXggPSBsYXN0QWNrbm93bGVkZ2VkQWN0aXZpdHlJbmRleCArIDEsIHsgbGVuZ3RoIH0gPSBhY3Rpdml0aWVzOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgYWN0aXZpdHkgPSBhY3Rpdml0aWVzW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2aXR5RWxlbWVudEluZGV4ID0gYWN0aXZpdHlFbGVtZW50cy5maW5kSW5kZXgoZW50cnkgPT4gZW50cnkuYWN0aXZpdHkgPT09IGFjdGl2aXR5KTtcblxuICAgICAgICAgICAgaWYgKH5hY3Rpdml0eUVsZW1lbnRJbmRleCkge1xuICAgICAgICAgICAgICBmaXJzdFVuYWNrbm93bGVkZ2VkQWN0aXZpdHlFbGVtZW50SW5kZXggPSBhY3Rpdml0eUVsZW1lbnRJbmRleDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKH5maXJzdFVuYWNrbm93bGVkZ2VkQWN0aXZpdHlFbGVtZW50SW5kZXgpIHtcbiAgICAgICAgICAgIGlmIChwYXRjaGVkQXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5KSB7XG4gICAgICAgICAgICAgIC8vIEdldHMgdGhlIGFjdGl2aXR5IGVsZW1lbnQgd2hpY2ggd2Ugc2hvdWxkIHNuYXAgdG8uXG4gICAgICAgICAgICAgIGNvbnN0IHsgZWxlbWVudDogbnRoVW5hY2tub3dsZWRnZWRBY3Rpdml0eUVsZW1lbnQgfSA9XG4gICAgICAgICAgICAgICAgYWN0aXZpdHlFbGVtZW50c1tmaXJzdFVuYWNrbm93bGVkZ2VkQWN0aXZpdHlFbGVtZW50SW5kZXggKyBwYXRjaGVkQXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5IC0gMV07XG5cbiAgICAgICAgICAgICAgaWYgKG50aFVuYWNrbm93bGVkZ2VkQWN0aXZpdHlFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdmFsdWVzLnB1c2goXG4gICAgICAgICAgICAgICAgICBudGhVbmFja25vd2xlZGdlZEFjdGl2aXR5RWxlbWVudC5vZmZzZXRUb3AgK1xuICAgICAgICAgICAgICAgICAgICBudGhVbmFja25vd2xlZGdlZEFjdGl2aXR5RWxlbWVudC5vZmZzZXRIZWlnaHQgLVxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRIZWlnaHQgLVxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3AgK1xuICAgICAgICAgICAgICAgICAgICBwYXRjaGVkQXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5T2Zmc2V0XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocGF0Y2hlZEF1dG9TY3JvbGxTbmFwT25QYWdlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgZWxlbWVudDogZmlyc3RVbmFja25vd2xlZGdlZEFjdGl2aXR5RWxlbWVudCB9ID1cbiAgICAgICAgICAgICAgICBhY3Rpdml0eUVsZW1lbnRzW2ZpcnN0VW5hY2tub3dsZWRnZWRBY3Rpdml0eUVsZW1lbnRJbmRleF07XG5cbiAgICAgICAgICAgICAgdmFsdWVzLnB1c2goXG4gICAgICAgICAgICAgICAgZmlyc3RVbmFja25vd2xlZGdlZEFjdGl2aXR5RWxlbWVudC5vZmZzZXRUb3AgLVxuICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wIC1cbiAgICAgICAgICAgICAgICAgIG9mZnNldEhlaWdodCAqICgxIC0gcGF0Y2hlZEF1dG9TY3JvbGxTbmFwT25QYWdlKSArXG4gICAgICAgICAgICAgICAgICBwYXRjaGVkQXV0b1Njcm9sbFNuYXBPblBhZ2VPZmZzZXRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWVzLnJlZHVjZSgobWluVmFsdWUsIHZhbHVlKSA9PiBNYXRoLm1pbihtaW5WYWx1ZSwgdmFsdWUpLCBJbmZpbml0eSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICB9LFxuICAgIFtcbiAgICAgIGFjdGl2aXRpZXNSZWYsXG4gICAgICBhY3Rpdml0eUVsZW1lbnRzUmVmLFxuICAgICAgYXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5LFxuICAgICAgYXV0b1Njcm9sbFNuYXBPbkFjdGl2aXR5T2Zmc2V0LFxuICAgICAgYXV0b1Njcm9sbFNuYXBPblBhZ2UsXG4gICAgICBhdXRvU2Nyb2xsU25hcE9uUGFnZU9mZnNldCxcbiAgICAgIGxhc3RBY2tub3dsZWRnZWRBY3Rpdml0eVJlZlxuICAgIF1cbiAgKTtcblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBCYXNpY1RyYW5zY3JpcHQgPSAoeyBjbGFzc05hbWUgfSkgPT4ge1xuICBjb25zdCBhY3Rpdml0eUVsZW1lbnRzUmVmID0gdXNlUmVmKFtdKTtcbiAgY29uc3Qgc2Nyb2xsZXJSZWYgPSB1c2VSZWYoKCkgPT4gSW5maW5pdHkpO1xuXG4gIGNvbnN0IHNjcm9sbGVyID0gdXNlQ2FsbGJhY2soKC4uLmFyZ3MpID0+IHNjcm9sbGVyUmVmLmN1cnJlbnQoLi4uYXJncyksIFtzY3JvbGxlclJlZl0pO1xuXG4gIHJldHVybiAoXG4gICAgPFJlYWN0U2Nyb2xsVG9Cb3R0b21Db21wb3NlciBzY3JvbGxlcj17c2Nyb2xsZXJ9PlxuICAgICAgPFNldFNjcm9sbGVyIGFjdGl2aXR5RWxlbWVudHNSZWY9e2FjdGl2aXR5RWxlbWVudHNSZWZ9IHNjcm9sbGVyUmVmPXtzY3JvbGxlclJlZn0gLz5cbiAgICAgIDxJbnRlcm5hbFRyYW5zY3JpcHQgYWN0aXZpdHlFbGVtZW50c1JlZj17YWN0aXZpdHlFbGVtZW50c1JlZn0gY2xhc3NOYW1lPXtjbGFzc05hbWV9IC8+XG4gICAgPC9SZWFjdFNjcm9sbFRvQm90dG9tQ29tcG9zZXI+XG4gICk7XG59O1xuXG5CYXNpY1RyYW5zY3JpcHQuZGVmYXVsdFByb3BzID0ge1xuICBjbGFzc05hbWU6ICcnXG59O1xuXG5CYXNpY1RyYW5zY3JpcHQucHJvcFR5cGVzID0ge1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmdcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEJhc2ljVHJhbnNjcmlwdDtcbiJdfQ==
|