@cometchat/chat-uikit-angular 4.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Calls/CallingExtension.d.ts +5 -0
- package/Calls/CallingExtensionDecorator.d.ts +17 -0
- package/Calls/CometChatCallButtons/cometchat-call-buttons/cometchat-call-buttons.component.d.ts +75 -0
- package/Calls/CometChatCallButtons/cometchat-call-buttons.module.d.ts +11 -0
- package/Calls/CometChatIncomingCall/cometchat-incoming-call/cometchat-incoming-call.component.d.ts +80 -0
- package/Calls/CometChatIncomingCall/cometchat-incoming-call.module.d.ts +11 -0
- package/Calls/CometChatOngoingCall/cometchat-ongoing-call/cometchat-ongoing-call.component.d.ts +26 -0
- package/Calls/CometChatOngoingCall/cometchat-ongoing-call.module.d.ts +9 -0
- package/Calls/CometChatOutgoingCall/cometchat-outgoing-call/cometchat-outgoing-call.component.d.ts +58 -0
- package/Calls/CometChatOutgoingCall/cometchat-outgoing-call.module.d.ts +10 -0
- package/CometChatAddMembers/cometchat-add-members/cometchat-add-members.component.d.ts +109 -0
- package/CometChatAddMembers/cometchat-add-members.module.d.ts +12 -0
- package/CometChatBannedMembers/cometchat-banned-members/cometchat-banned-members.component.d.ts +140 -0
- package/CometChatBannedMembers/cometchat-banned-members.module.d.ts +13 -0
- package/CometChatConversations/cometchat-conversations/cometchat-conversations.component.d.ts +335 -0
- package/CometChatConversations/cometchat-conversations.module.d.ts +10 -0
- package/CometChatConversationsWithMessages/cometchat-conversations-with-messages/cometchat-conversations-with-messages.component.d.ts +86 -0
- package/CometChatConversationsWithMessages/cometchat-conversations-with-messages.module.d.ts +12 -0
- package/CometChatDetails/cometchat-details/cometchat-details.component.d.ts +149 -0
- package/CometChatDetails/cometchat-details.module.d.ts +12 -0
- package/CometChatGroupMembers/cometchat-group-members/cometchat-group-members.component.d.ts +145 -0
- package/CometChatGroupMembers/cometchat-group-members.module.d.ts +13 -0
- package/CometChatGroups/cometchat-groups/cometchat-groups.component.d.ts +136 -0
- package/CometChatGroups/cometchat-groups.module.d.ts +10 -0
- package/CometChatGroupsWithMessages/cometchat-groups-with-messages/cometchat-groups-with-messages.component.d.ts +100 -0
- package/CometChatGroupsWithMessages/cometchat-groups-with-messages.module.d.ts +13 -0
- package/CometChatList/cometchat-list.component.d.ts +87 -0
- package/CometChatList/cometchat-list.module.d.ts +10 -0
- package/CometChatMessageBubble/cometchat-message-bubble/cometchat-message-bubble.component.d.ts +62 -0
- package/CometChatMessageBubble/cometchat-message-bubble.module.d.ts +8 -0
- package/CometChatMessageComposer/cometchat-message-composer/cometchat-message-composer.component.d.ts +165 -0
- package/CometChatMessageComposer/cometchat-message-composer.module.d.ts +9 -0
- package/CometChatMessageHeader/cometchat-message-header/cometchat-message-header.component.d.ts +85 -0
- package/CometChatMessageHeader/cometchat-message-header.module.d.ts +9 -0
- package/CometChatMessageList/cometchat-message-list/cometchat-message-list.component.d.ts +510 -0
- package/CometChatMessageList/cometchat-message-list.module.d.ts +11 -0
- package/CometChatMessages/cometchat-messages/cometchat-messages.component.d.ts +136 -0
- package/CometChatMessages/cometchat-messages.module.d.ts +15 -0
- package/CometChatTheme.service.d.ts +7 -0
- package/CometChatThreadedMessages/cometchat-threaded-messages/cometchat-threaded-messages.component.d.ts +73 -0
- package/CometChatThreadedMessages/cometchat-threaded-messages.module.d.ts +12 -0
- package/CometChatTransferOwnership/cometchat-transfer-ownership/cometchat-transfer-ownership.component.d.ts +88 -0
- package/CometChatTransferOwnership/cometchat-transfer-ownership.module.d.ts +10 -0
- package/CometChatUsers/cometchat-users/cometchat-users.component.d.ts +105 -0
- package/CometChatUsers/cometchat-users.module.d.ts +11 -0
- package/CometChatUsersWithMessages/cometchat-users-with-messages/cometchat-users-with-messages.component.d.ts +71 -0
- package/CometChatUsersWithMessages/cometchat-users-with-messages.module.d.ts +12 -0
- package/Extensions/CollaborativeDocument/CollaborativeDocumentExtension.d.ts +9 -0
- package/Extensions/CollaborativeDocument/CollaborativeDocumentExtensionDecorator.d.ts +17 -0
- package/Extensions/CollaborativeWhiteboard/CollaborativeWhiteboardExtension.d.ts +9 -0
- package/Extensions/CollaborativeWhiteboard/CollaborativeWhiteboardExtensionDecorator.d.ts +17 -0
- package/Extensions/ImageModeration/ImageModerationExtension.d.ts +5 -0
- package/Extensions/ImageModeration/ImageModerationExtensionDecorator.d.ts +6 -0
- package/Extensions/LinkPreviewExtension/LinkPreviewExtension.d.ts +5 -0
- package/Extensions/LinkPreviewExtension/LinkPreviewExtensionDecorator.d.ts +6 -0
- package/Extensions/MessageTranslation/MessageTranslationExtension.d.ts +9 -0
- package/Extensions/MessageTranslation/MessageTranslationExtensionDecorator.d.ts +12 -0
- package/Extensions/PollsExtension/PollsExtension.d.ts +5 -0
- package/Extensions/PollsExtension/PollsExtensionDecorator.d.ts +15 -0
- package/Extensions/Reactions/ReactionExtension.d.ts +5 -0
- package/Extensions/Reactions/ReactionExtensionDecorator.d.ts +10 -0
- package/Extensions/SmartReplies/SmartRepliesExtension.d.ts +9 -0
- package/Extensions/SmartReplies/SmartRepliesExtensionDecorator.d.ts +16 -0
- package/Extensions/Stickers/StickersExtension.d.ts +9 -0
- package/Extensions/Stickers/StickersExtensionDecorator.d.ts +27 -0
- package/Extensions/TextModerator/TextModeratorExtension.d.ts +5 -0
- package/Extensions/TextModerator/TextModeratorExtensionDecorator.d.ts +9 -0
- package/Extensions/ThumbnailGeneration/ThumbnailGenerationExtension.d.ts +5 -0
- package/Extensions/ThumbnailGeneration/ThumbnailGenerationExtensionDecorator.d.ts +6 -0
- package/README.md +60 -0
- package/Shared/CometChatUIkit/CometChatUIKit.d.ts +18 -0
- package/Shared/Framework/ChatConfigurator.d.ts +8 -0
- package/Shared/Framework/DataSource.d.ts +29 -0
- package/Shared/Framework/DataSourceDecorator.d.ts +32 -0
- package/Shared/Framework/ExtensionDataSource.d.ts +3 -0
- package/Shared/Utils/MessageUtils.d.ts +43 -0
- package/assets/.gitkeep +0 -0
- package/assets/Audio-Call.svg +11 -0
- package/assets/Audio-Call2x.svg +11 -0
- package/assets/Copy.svg +17 -0
- package/assets/Grid-layout.svg +1 -0
- package/assets/Heart.svg +11 -0
- package/assets/Imagemoderation.svg +14 -0
- package/assets/Info.svg +13 -0
- package/assets/Locked.svg +10 -0
- package/assets/More@2x.svg +9 -0
- package/assets/Plus.svg +13 -0
- package/assets/Private.svg +10 -0
- package/assets/Reactionsicon.svg +9 -0
- package/assets/Send.svg +12 -0
- package/assets/Spinner.svg +15 -0
- package/assets/Stickers.svg +16 -0
- package/assets/Stipop.svg +9 -0
- package/assets/Video-call.svg +12 -0
- package/assets/Video-call2x.svg +12 -0
- package/assets/activity.svg +22 -0
- package/assets/addreaction.svg +9 -0
- package/assets/animals.svg +15 -0
- package/assets/attachment-file.svg +14 -0
- package/assets/audio-file.svg +12 -0
- package/assets/back.png +0 -0
- package/assets/backbutton.svg +12 -0
- package/assets/call.svg +1 -0
- package/assets/chats.svg +1 -0
- package/assets/checkmark.svg +11 -0
- package/assets/close.svg +12 -0
- package/assets/close2x.svg +12 -0
- package/assets/collaborativedocument.svg +13 -0
- package/assets/collaborativewhiteboard.svg +12 -0
- package/assets/create-button.svg +12 -0
- package/assets/declaration.d.ts +3 -0
- package/assets/delete.svg +7 -0
- package/assets/deleteicon.svg +15 -0
- package/assets/down-arrow.svg +1 -0
- package/assets/download.svg +13 -0
- package/assets/editicon.svg +14 -0
- package/assets/emoji.svg +2693 -0
- package/assets/file-upload.svg +2693 -0
- package/assets/flags.svg +12 -0
- package/assets/food.svg +26 -0
- package/assets/group.svg +40 -0
- package/assets/heart-reaction.png +0 -0
- package/assets/heart.png +0 -0
- package/assets/image.svg +2693 -0
- package/assets/incomingcall.wav +0 -0
- package/assets/increase-size.svg +6 -0
- package/assets/location.svg +2693 -0
- package/assets/message-delivered.png +0 -0
- package/assets/message-delivered.svg +4 -0
- package/assets/message-read.png +0 -0
- package/assets/message-read.svg +4 -0
- package/assets/message-sent.png +0 -0
- package/assets/message-sent.svg +3 -0
- package/assets/moreicon.svg +9 -0
- package/assets/objects.svg +13 -0
- package/assets/open-thread.svg +11 -0
- package/assets/password-protected-group.svg +3 -0
- package/assets/photolibrary.svg +11 -0
- package/assets/placeholder.png +0 -0
- package/assets/plus-rotated.svg +13 -0
- package/assets/polls.svg +14 -0
- package/assets/privacy.svg +4 -0
- package/assets/private-group.svg +9 -0
- package/assets/public.svg +3 -0
- package/assets/reduce-size.svg +6 -0
- package/assets/right-arrow.svg +6 -0
- package/assets/search.png +0 -0
- package/assets/search.svg +4 -0
- package/assets/side-arrow.svg +1 -0
- package/assets/smileys.svg +16 -0
- package/assets/start-chat.svg +1 -0
- package/assets/symbols.svg +16 -0
- package/assets/thread-arrow.svg +1 -0
- package/assets/thread-icon.svg +38 -0
- package/assets/threadicon.svg +14 -0
- package/assets/translation.svg +16 -0
- package/assets/travel.svg +18 -0
- package/assets/unsafe-content.svg +23 -0
- package/assets/user.svg +31 -0
- package/assets/video-upload.svg +2693 -0
- package/assets/video.svg +12 -0
- package/assets/wait.png +0 -0
- package/assets/wait.svg +4 -0
- package/assets/warning-small.png +0 -0
- package/assets/warning-small.svg +5 -0
- package/cometchat-chat-uikit-angular.d.ts +5 -0
- package/esm2020/Calls/CallingExtension.mjs +11 -0
- package/esm2020/Calls/CallingExtensionDecorator.mjs +114 -0
- package/esm2020/Calls/CometChatCallButtons/cometchat-call-buttons/cometchat-call-buttons.component.mjs +358 -0
- package/esm2020/Calls/CometChatCallButtons/cometchat-call-buttons.module.mjs +32 -0
- package/esm2020/Calls/CometChatIncomingCall/cometchat-incoming-call/cometchat-incoming-call.component.mjs +423 -0
- package/esm2020/Calls/CometChatIncomingCall/cometchat-incoming-call.module.mjs +32 -0
- package/esm2020/Calls/CometChatOngoingCall/cometchat-ongoing-call/cometchat-ongoing-call.component.mjs +54 -0
- package/esm2020/Calls/CometChatOngoingCall/cometchat-ongoing-call.module.mjs +27 -0
- package/esm2020/Calls/CometChatOutgoingCall/cometchat-outgoing-call/cometchat-outgoing-call.component.mjs +196 -0
- package/esm2020/Calls/CometChatOutgoingCall/cometchat-outgoing-call.module.mjs +28 -0
- package/esm2020/CometChatAddMembers/cometchat-add-members/cometchat-add-members.component.mjs +353 -0
- package/esm2020/CometChatAddMembers/cometchat-add-members.module.mjs +23 -0
- package/esm2020/CometChatBannedMembers/cometchat-banned-members/cometchat-banned-members.component.mjs +446 -0
- package/esm2020/CometChatBannedMembers/cometchat-banned-members.module.mjs +24 -0
- package/esm2020/CometChatConversations/cometchat-conversations/cometchat-conversations.component.mjs +1400 -0
- package/esm2020/CometChatConversations/cometchat-conversations.module.mjs +28 -0
- package/esm2020/CometChatConversationsWithMessages/cometchat-conversations-with-messages/cometchat-conversations-with-messages.component.mjs +272 -0
- package/esm2020/CometChatConversationsWithMessages/cometchat-conversations-with-messages.module.mjs +39 -0
- package/esm2020/CometChatDetails/cometchat-details/cometchat-details.component.mjs +696 -0
- package/esm2020/CometChatDetails/cometchat-details.module.mjs +27 -0
- package/esm2020/CometChatGroupMembers/cometchat-group-members/cometchat-group-members.component.mjs +676 -0
- package/esm2020/CometChatGroupMembers/cometchat-group-members.module.mjs +24 -0
- package/esm2020/CometChatGroups/cometchat-groups/cometchat-groups.component.mjs +564 -0
- package/esm2020/CometChatGroups/cometchat-groups.module.mjs +28 -0
- package/esm2020/CometChatGroupsWithMessages/cometchat-groups-with-messages/cometchat-groups-with-messages.component.mjs +430 -0
- package/esm2020/CometChatGroupsWithMessages/cometchat-groups-with-messages.module.mjs +43 -0
- package/esm2020/CometChatList/cometchat-list.component.mjs +210 -0
- package/esm2020/CometChatList/cometchat-list.module.mjs +28 -0
- package/esm2020/CometChatMessageBubble/cometchat-message-bubble/cometchat-message-bubble.component.mjs +157 -0
- package/esm2020/CometChatMessageBubble/cometchat-message-bubble.module.mjs +23 -0
- package/esm2020/CometChatMessageComposer/cometchat-message-composer/cometchat-message-composer.component.mjs +930 -0
- package/esm2020/CometChatMessageComposer/cometchat-message-composer.module.mjs +24 -0
- package/esm2020/CometChatMessageHeader/cometchat-message-header/cometchat-message-header.component.mjs +420 -0
- package/esm2020/CometChatMessageHeader/cometchat-message-header.module.mjs +26 -0
- package/esm2020/CometChatMessageList/cometchat-message-list/cometchat-message-list.component.mjs +2598 -0
- package/esm2020/CometChatMessageList/cometchat-message-list.module.mjs +34 -0
- package/esm2020/CometChatMessages/cometchat-messages/cometchat-messages.component.mjs +393 -0
- package/esm2020/CometChatMessages/cometchat-messages.module.mjs +48 -0
- package/esm2020/CometChatTheme.service.mjs +17 -0
- package/esm2020/CometChatThreadedMessages/cometchat-threaded-messages/cometchat-threaded-messages.component.mjs +304 -0
- package/esm2020/CometChatThreadedMessages/cometchat-threaded-messages.module.mjs +36 -0
- package/esm2020/CometChatTransferOwnership/cometchat-transfer-ownership/cometchat-transfer-ownership.component.mjs +337 -0
- package/esm2020/CometChatTransferOwnership/cometchat-transfer-ownership.module.mjs +21 -0
- package/esm2020/CometChatUsers/cometchat-users/cometchat-users.component.mjs +447 -0
- package/esm2020/CometChatUsers/cometchat-users.module.mjs +32 -0
- package/esm2020/CometChatUsersWithMessages/cometchat-users-with-messages/cometchat-users-with-messages.component.mjs +185 -0
- package/esm2020/CometChatUsersWithMessages/cometchat-users-with-messages.module.mjs +39 -0
- package/esm2020/Extensions/CollaborativeDocument/CollaborativeDocumentExtension.mjs +11 -0
- package/esm2020/Extensions/CollaborativeDocument/CollaborativeDocumentExtensionDecorator.mjs +89 -0
- package/esm2020/Extensions/CollaborativeWhiteboard/CollaborativeWhiteboardExtension.mjs +11 -0
- package/esm2020/Extensions/CollaborativeWhiteboard/CollaborativeWhiteboardExtensionDecorator.mjs +89 -0
- package/esm2020/Extensions/ImageModeration/ImageModerationExtension.mjs +10 -0
- package/esm2020/Extensions/ImageModeration/ImageModerationExtensionDecorator.mjs +10 -0
- package/esm2020/Extensions/LinkPreviewExtension/LinkPreviewExtension.mjs +10 -0
- package/esm2020/Extensions/LinkPreviewExtension/LinkPreviewExtensionDecorator.mjs +10 -0
- package/esm2020/Extensions/MessageTranslation/MessageTranslationExtension.mjs +11 -0
- package/esm2020/Extensions/MessageTranslation/MessageTranslationExtensionDecorator.mjs +33 -0
- package/esm2020/Extensions/PollsExtension/PollsExtension.mjs +10 -0
- package/esm2020/Extensions/PollsExtension/PollsExtensionDecorator.mjs +75 -0
- package/esm2020/Extensions/Reactions/ReactionExtension.mjs +10 -0
- package/esm2020/Extensions/Reactions/ReactionExtensionDecorator.mjs +30 -0
- package/esm2020/Extensions/SmartReplies/SmartRepliesExtension.mjs +11 -0
- package/esm2020/Extensions/SmartReplies/SmartRepliesExtensionDecorator.mjs +117 -0
- package/esm2020/Extensions/Stickers/StickersExtension.mjs +15 -0
- package/esm2020/Extensions/Stickers/StickersExtensionDecorator.mjs +118 -0
- package/esm2020/Extensions/TextModerator/TextModeratorExtension.mjs +10 -0
- package/esm2020/Extensions/TextModerator/TextModeratorExtensionDecorator.mjs +32 -0
- package/esm2020/Extensions/ThumbnailGeneration/ThumbnailGenerationExtension.mjs +10 -0
- package/esm2020/Extensions/ThumbnailGeneration/ThumbnailGenerationExtensionDecorator.mjs +10 -0
- package/esm2020/Shared/CometChatUIkit/CometChatUIKit.mjs +180 -0
- package/esm2020/Shared/Framework/ChatConfigurator.mjs +20 -0
- package/esm2020/Shared/Framework/DataSource.mjs +3 -0
- package/esm2020/Shared/Framework/DataSourceDecorator.mjs +80 -0
- package/esm2020/Shared/Framework/ExtensionDataSource.mjs +4 -0
- package/esm2020/Shared/Utils/MessageUtils.mjs +342 -0
- package/esm2020/cometchat-chat-uikit-angular.mjs +5 -0
- package/esm2020/public-api.mjs +93 -0
- package/fesm2015/cometchat-chat-uikit-angular.mjs +13683 -0
- package/fesm2015/cometchat-chat-uikit-angular.mjs.map +1 -0
- package/fesm2020/cometchat-chat-uikit-angular.mjs +13586 -0
- package/fesm2020/cometchat-chat-uikit-angular.mjs.map +1 -0
- package/package.json +51 -0
- package/public-api.d.ts +79 -0
package/esm2020/CometChatConversations/cometchat-conversations/cometchat-conversations.component.mjs
ADDED
|
@@ -0,0 +1,1400 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, Input, } from "@angular/core";
|
|
2
|
+
import { CometChat } from "@cometchat-pro/chat";
|
|
3
|
+
import { SelectionMode, States, TitleAlignment, ConversationUtils, MessageReceiptUtils, CometChatSoundManager, CometChatUIKitUtility, ConversationsStyle, ListStyle, MessageStatus } from "@cometchat/uikit-shared";
|
|
4
|
+
import { fontHelper, localize, CometChatGroupEvents, CometChatUIKitConstants, CometChatUserEvents, CometChatMessageEvents, CometChatConversationEvents, DatePatterns, CometChatCallEvents } from '@cometchat/uikit-resources';
|
|
5
|
+
import '@cometchat/uikit-elements';
|
|
6
|
+
import { AvatarStyle, ListItemStyle, ConfirmDialogStyle, ReceiptStyle, DateStyle, BadgeStyle } from '@cometchat/uikit-elements';
|
|
7
|
+
import { ChatConfigurator } from "../../Shared/Framework/ChatConfigurator";
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "../../CometChatTheme.service";
|
|
10
|
+
import * as i2 from "../../CometChatList/cometchat-list.component";
|
|
11
|
+
import * as i3 from "@angular/common";
|
|
12
|
+
/**
|
|
13
|
+
*
|
|
14
|
+
* CometChatConversation is a wrapper component consists of CometChatListBaseComponent and ConversationListComponent.
|
|
15
|
+
*
|
|
16
|
+
* @version 1.0.0
|
|
17
|
+
* @author CometChatTeam
|
|
18
|
+
* @copyright © 2022 CometChat Inc.
|
|
19
|
+
*
|
|
20
|
+
*/
|
|
21
|
+
export class CometChatConversationsComponent {
|
|
22
|
+
constructor(ngZone, ref, themeService) {
|
|
23
|
+
this.ngZone = ngZone;
|
|
24
|
+
this.ref = ref;
|
|
25
|
+
this.themeService = themeService;
|
|
26
|
+
this.title = localize("CHATS"); //Title of the component
|
|
27
|
+
this.searchPlaceHolder = localize("SEARCH"); // placeholder text of search input
|
|
28
|
+
this.disableUsersPresence = false;
|
|
29
|
+
this.disableReceipt = true;
|
|
30
|
+
this.disableTyping = false;
|
|
31
|
+
this.deliveredIcon = "assets/message-delivered.svg";
|
|
32
|
+
this.readIcon = "assets/message-read.svg";
|
|
33
|
+
this.errorIcon = "assets/warning-small.svg";
|
|
34
|
+
this.datePattern = DatePatterns.DayDateTime;
|
|
35
|
+
this.onError = (error) => {
|
|
36
|
+
console.log(error);
|
|
37
|
+
};
|
|
38
|
+
this.sentIcon = "assets/message-sent.svg";
|
|
39
|
+
this.privateGroupIcon = "assets/Private.svg";
|
|
40
|
+
this.protectedGroupIcon = "assets/Locked.svg";
|
|
41
|
+
this.customSoundForMessages = "";
|
|
42
|
+
this.activeConversation = null; //selected conversation
|
|
43
|
+
this.searchIconURL = "assets/search.svg"; //image URL of the search icon
|
|
44
|
+
this.hideSearch = true; //switch on/ff search input
|
|
45
|
+
this.loadingIconURL = "assets/Spinner.svg";
|
|
46
|
+
this.emptyStateText = localize("NO_CHATS_FOUND");
|
|
47
|
+
this.errorStateText = localize("SOMETHING_WRONG");
|
|
48
|
+
this.titleAlignment = TitleAlignment.left;
|
|
49
|
+
this.hideSeparator = false;
|
|
50
|
+
this.searchPlaceholder = localize("SEARCH");
|
|
51
|
+
this.hideError = false;
|
|
52
|
+
this.selectionMode = SelectionMode.none;
|
|
53
|
+
this.disableSoundForMessages = false;
|
|
54
|
+
this.confirmDialogTitle = localize("DELETE_CONVERSATION");
|
|
55
|
+
this.confirmButtonText = localize("DELETE");
|
|
56
|
+
this.cancelButtonText = localize("CANCEL");
|
|
57
|
+
this.confirmDialogMessage = localize("WOULD__YOU_LIKE_TO_DELETE_THIS_CONVERSATION");
|
|
58
|
+
this.deleteConversationDialogStyle = {
|
|
59
|
+
confirmButtonBackground: "",
|
|
60
|
+
cancelButtonBackground: "",
|
|
61
|
+
confirmButtonTextColor: "",
|
|
62
|
+
confirmButtonTextFont: "",
|
|
63
|
+
cancelButtonTextColor: "",
|
|
64
|
+
cancelButtonTextFont: "",
|
|
65
|
+
titleFont: "",
|
|
66
|
+
titleColor: "",
|
|
67
|
+
messageTextFont: "",
|
|
68
|
+
messageTextColor: "",
|
|
69
|
+
background: "",
|
|
70
|
+
border: "1px solid #f2f2f2",
|
|
71
|
+
height: "100%",
|
|
72
|
+
width: "100%"
|
|
73
|
+
};
|
|
74
|
+
this.backdropStyle = {
|
|
75
|
+
height: "100%",
|
|
76
|
+
width: "100%",
|
|
77
|
+
background: "rgba(0, 0, 0, 0.5)"
|
|
78
|
+
};
|
|
79
|
+
this.badgeStyle = {
|
|
80
|
+
width: "25px",
|
|
81
|
+
height: "15px",
|
|
82
|
+
background: "#5aaeff",
|
|
83
|
+
textColor: "white",
|
|
84
|
+
textFont: "400 13px Inter, sans-serif",
|
|
85
|
+
borderRadius: "16px"
|
|
86
|
+
};
|
|
87
|
+
this.dateStyle = {
|
|
88
|
+
textFont: "400 11px Inter, sans-serif",
|
|
89
|
+
textColor: "rgba(20, 20, 20, 0.58)",
|
|
90
|
+
};
|
|
91
|
+
this.conversationsStyle = {
|
|
92
|
+
width: "",
|
|
93
|
+
height: "",
|
|
94
|
+
border: "",
|
|
95
|
+
borderRadius: "",
|
|
96
|
+
};
|
|
97
|
+
this.listItemStyle = {
|
|
98
|
+
height: "100%",
|
|
99
|
+
width: "100%",
|
|
100
|
+
background: "",
|
|
101
|
+
activeBackground: "",
|
|
102
|
+
borderRadius: "grey",
|
|
103
|
+
titleFont: "",
|
|
104
|
+
titleColor: "",
|
|
105
|
+
border: "",
|
|
106
|
+
separatorColor: "rgb(232, 232, 232)"
|
|
107
|
+
};
|
|
108
|
+
this.statusIndicatorStyle = {
|
|
109
|
+
height: "10px",
|
|
110
|
+
width: "10px",
|
|
111
|
+
borderRadius: "16px"
|
|
112
|
+
};
|
|
113
|
+
this.typingIndicatorText = localize("IS_TYPING");
|
|
114
|
+
this.threadIndicatorText = localize("IN_A_THREAD");
|
|
115
|
+
this.avatarStyle = {};
|
|
116
|
+
this.receiptStyle = {};
|
|
117
|
+
this.iconStyle = {
|
|
118
|
+
iconTint: "lightgrey",
|
|
119
|
+
height: "20px",
|
|
120
|
+
width: "20px"
|
|
121
|
+
};
|
|
122
|
+
this.listStyle = new ListStyle({});
|
|
123
|
+
this.menustyle = {
|
|
124
|
+
width: "",
|
|
125
|
+
height: "",
|
|
126
|
+
border: "none",
|
|
127
|
+
borderRadius: "8px",
|
|
128
|
+
background: "transparent",
|
|
129
|
+
textFont: "",
|
|
130
|
+
textColor: "black",
|
|
131
|
+
iconTint: "grey",
|
|
132
|
+
iconBackground: "transparent",
|
|
133
|
+
iconBorder: "none",
|
|
134
|
+
iconBorderRadius: "0",
|
|
135
|
+
submenuWidth: "70px",
|
|
136
|
+
submenuHeight: "20px",
|
|
137
|
+
submenuBorder: "1px solid #e8e8e8",
|
|
138
|
+
submenuBorderRadius: "8px",
|
|
139
|
+
submenuBackground: "white",
|
|
140
|
+
};
|
|
141
|
+
this.typingListenerId = "conversation__LISTENER" + new Date().getTime();
|
|
142
|
+
this.callListenerId = "call_" + new Date().getTime();
|
|
143
|
+
this.selectionmodeEnum = SelectionMode;
|
|
144
|
+
this.isDialogOpen = false;
|
|
145
|
+
// public loggedInUser!: CometChat.User | null;
|
|
146
|
+
this.isEmpty = false;
|
|
147
|
+
this.isLoading = true;
|
|
148
|
+
this.state = States.loading;
|
|
149
|
+
this.statusColor = {
|
|
150
|
+
online: "",
|
|
151
|
+
private: "",
|
|
152
|
+
password: "#F7A500",
|
|
153
|
+
public: ""
|
|
154
|
+
};
|
|
155
|
+
this.limit = 30;
|
|
156
|
+
this.isError = false;
|
|
157
|
+
this.conversationList = [];
|
|
158
|
+
this.scrolledToBottom = false;
|
|
159
|
+
this.checkItemChange = false;
|
|
160
|
+
this.showConfirmDialog = false;
|
|
161
|
+
this.conversationToBeDeleted = null;
|
|
162
|
+
this.conversationListenerId = "chatlist_" + new Date().getTime();
|
|
163
|
+
this.userListenerId = "chatlist_user_" + new Date().getTime();
|
|
164
|
+
this.groupListenerId = "chatlist_group_" + new Date().getTime();
|
|
165
|
+
this.groupToUpdate = {};
|
|
166
|
+
this.enablePolls = false;
|
|
167
|
+
this.enableStickers = false;
|
|
168
|
+
this.enableWhiteboard = false;
|
|
169
|
+
this.enableDocument = false;
|
|
170
|
+
this.threadIconURL = "assets/thread-arrow.svg";
|
|
171
|
+
this.confirmDialogStyle = {
|
|
172
|
+
height: "100%",
|
|
173
|
+
width: "100%",
|
|
174
|
+
borderRadius: "8px"
|
|
175
|
+
};
|
|
176
|
+
this.modalStyle = {
|
|
177
|
+
height: "230px",
|
|
178
|
+
width: "270px"
|
|
179
|
+
};
|
|
180
|
+
/**
|
|
181
|
+
* Properties for internal use
|
|
182
|
+
*/
|
|
183
|
+
this.localize = localize;
|
|
184
|
+
/**
|
|
185
|
+
* Properties for internal use
|
|
186
|
+
*/
|
|
187
|
+
/**
|
|
188
|
+
* passing this callback to menuList component on delete click
|
|
189
|
+
* @param {CometChat.Conversation} conversation
|
|
190
|
+
*/
|
|
191
|
+
this.deleteConversationOnClick = () => {
|
|
192
|
+
this.showConfirmationDialog(this.conversationToBeDeleted);
|
|
193
|
+
};
|
|
194
|
+
// callback for confirmDialogComponent
|
|
195
|
+
this.onConfirmClick = () => {
|
|
196
|
+
this.deleteSelectedConversation();
|
|
197
|
+
};
|
|
198
|
+
this.setStatusIndicatorStyle = (conversation) => {
|
|
199
|
+
if (conversation.getConversationType() == CometChatUIKitConstants.MessageReceiverType.group) {
|
|
200
|
+
return {
|
|
201
|
+
height: "12px",
|
|
202
|
+
width: "12px",
|
|
203
|
+
borderRadius: "16px"
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
return this.statusIndicatorStyle;
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
this.setSubtitle = (conversationObject) => {
|
|
211
|
+
if (this.typingIndicator) {
|
|
212
|
+
const isTyping = conversationObject?.conversationWith?.guid == this.typingIndicator.getReceiverId();
|
|
213
|
+
if (isTyping) {
|
|
214
|
+
return `${this.typingIndicator.getSender().getName()} ${this.typingIndicatorText}`;
|
|
215
|
+
}
|
|
216
|
+
else if (conversationObject?.conversationWith?.uid == this.typingIndicator?.getSender().getUid() && this.typingIndicator.getReceiverType() !== CometChatUIKitConstants.MessageReceiverType.group) {
|
|
217
|
+
return this.typingIndicatorText;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
let subtitle = ChatConfigurator.getDataSource().getLastConversationMessage(conversationObject, this.loggedInUser);
|
|
221
|
+
let icon = conversationObject?.getLastMessage()?.getType() == CometChatUIKitConstants.MessageTypes.audio ? "📞 " : "📹 ";
|
|
222
|
+
return conversationObject?.getLastMessage()?.getCategory() == CometChatUIKitConstants.MessageCategory.call ? icon + subtitle : subtitle;
|
|
223
|
+
};
|
|
224
|
+
// callback for confirmDialogComponent
|
|
225
|
+
this.onCancelClick = () => {
|
|
226
|
+
this.isDialogOpen = false;
|
|
227
|
+
this.conversationToBeDeleted = null;
|
|
228
|
+
this.ref.detectChanges();
|
|
229
|
+
};
|
|
230
|
+
this.getMessageReceipt = (conversation) => {
|
|
231
|
+
let receipt = MessageReceiptUtils.getReceiptStatus(conversation.getLastMessage());
|
|
232
|
+
return receipt;
|
|
233
|
+
};
|
|
234
|
+
this.optionsStyle = {
|
|
235
|
+
background: "transparent",
|
|
236
|
+
border: "none"
|
|
237
|
+
};
|
|
238
|
+
this.isActive = true;
|
|
239
|
+
this.contactsNotFound = false;
|
|
240
|
+
/**
|
|
241
|
+
* Fetches Conversations Details with all the users
|
|
242
|
+
*/
|
|
243
|
+
this.getConversation = () => {
|
|
244
|
+
if ((this.conversationsRequestBuilder && !this.conversationsRequestBuilder?.pagination) || (this.conversationsRequestBuilder.pagination.current_page == 0 || this.conversationsRequestBuilder.pagination.current_page != this.conversationsRequestBuilder.pagination.total_pages)) {
|
|
245
|
+
this.state = States.loading;
|
|
246
|
+
try {
|
|
247
|
+
CometChat.getLoggedinUser()
|
|
248
|
+
.then((user) => {
|
|
249
|
+
this.loggedInUser = user;
|
|
250
|
+
this.fetchNextConversation()
|
|
251
|
+
.then((conversationList) => {
|
|
252
|
+
conversationList.forEach((conversation) => {
|
|
253
|
+
if (this.activeConversation && this.activeConversation !== null &&
|
|
254
|
+
this.activeConversation.getConversationType() === conversation.getConversationType()) {
|
|
255
|
+
if (this.activeConversation.getConversationId() == conversation.getConversationId()) {
|
|
256
|
+
conversation.setUnreadMessageCount(0);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
this.conversationList = [
|
|
261
|
+
...this.conversationList,
|
|
262
|
+
...conversationList,
|
|
263
|
+
];
|
|
264
|
+
if ((conversationList.length <= 0 && this.conversationList?.length <= 0) || (conversationList.length === 0 && this.conversationList?.length <= 0)) {
|
|
265
|
+
this.ngZone.run(() => {
|
|
266
|
+
if (this.state != States.empty) {
|
|
267
|
+
this.state = States.empty;
|
|
268
|
+
this.ref.detectChanges();
|
|
269
|
+
}
|
|
270
|
+
this.ref.detach(); // Detach the change detector
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
this.ngZone.run(() => {
|
|
275
|
+
if (this.state != States.loaded) {
|
|
276
|
+
this.state = States.loaded;
|
|
277
|
+
this.ref.detectChanges();
|
|
278
|
+
}
|
|
279
|
+
this.ref.detach(); // Detach the change detector
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
})
|
|
283
|
+
.catch((error) => {
|
|
284
|
+
this.state = States.error;
|
|
285
|
+
this.ref.detectChanges();
|
|
286
|
+
});
|
|
287
|
+
})
|
|
288
|
+
.catch((error) => {
|
|
289
|
+
this.state = States.error;
|
|
290
|
+
this.ref.detectChanges();
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
catch (error) {
|
|
294
|
+
if (this.onError) {
|
|
295
|
+
this.onError(error);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
this.state = States.loaded;
|
|
301
|
+
}
|
|
302
|
+
};
|
|
303
|
+
/**
|
|
304
|
+
* Updates the conversation list's last message , badgeCount , user presence based on activities propagated by listeners
|
|
305
|
+
*/
|
|
306
|
+
this.conversationUpdated = (key, item = null, message, options = null) => {
|
|
307
|
+
try {
|
|
308
|
+
switch (key) {
|
|
309
|
+
case CometChatUIKitConstants.userStatusType.online:
|
|
310
|
+
case CometChatUIKitConstants.userStatusType.online: {
|
|
311
|
+
this.updateUser(item);
|
|
312
|
+
break;
|
|
313
|
+
}
|
|
314
|
+
case CometChatUIKitConstants.messages.MESSAGE_READ: {
|
|
315
|
+
this.updateConversation(message, false);
|
|
316
|
+
break;
|
|
317
|
+
}
|
|
318
|
+
case CometChatUIKitConstants.messages.MESSAGE_DELIVERED: {
|
|
319
|
+
this.updateConversation(message, false);
|
|
320
|
+
break;
|
|
321
|
+
}
|
|
322
|
+
case CometChatUIKitConstants.messages.TEXT_MESSAGE_RECEIVED:
|
|
323
|
+
case CometChatUIKitConstants.messages.MEDIA_MESSAGE_RECEIVED:
|
|
324
|
+
case CometChatUIKitConstants.messages.CUSTOM_MESSAGE_RECEIVED:
|
|
325
|
+
if (!this.disableReceipt) {
|
|
326
|
+
this.markMessageAsDelivered(message);
|
|
327
|
+
}
|
|
328
|
+
this.updateConversation(message);
|
|
329
|
+
break;
|
|
330
|
+
case CometChatUIKitConstants.groupMemberAction.ADDED:
|
|
331
|
+
case CometChatUIKitConstants.groupMemberAction.BANNED:
|
|
332
|
+
case CometChatUIKitConstants.groupMemberAction.JOINED:
|
|
333
|
+
case CometChatUIKitConstants.groupMemberAction.KICKED:
|
|
334
|
+
case CometChatUIKitConstants.groupMemberAction.LEFT:
|
|
335
|
+
case CometChatUIKitConstants.groupMemberAction.UNBANNED:
|
|
336
|
+
case CometChatUIKitConstants.groupMemberAction.SCOPE_CHANGE:
|
|
337
|
+
this.updateConversation(message);
|
|
338
|
+
break;
|
|
339
|
+
case CometChatUIKitConstants.messages.MESSAGE_EDITED:
|
|
340
|
+
case CometChatUIKitConstants.messages.MESSAGE_DELETED:
|
|
341
|
+
this.conversationEditedDeleted(message);
|
|
342
|
+
break;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
catch (error) {
|
|
346
|
+
if (this.onError) {
|
|
347
|
+
this.onError(error);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
/**
|
|
352
|
+
* @param {CometChat.BaseMessage} message
|
|
353
|
+
*/
|
|
354
|
+
this.markMessageAsDelivered = (message) => {
|
|
355
|
+
//if chat window is not open, mark message as delivered
|
|
356
|
+
if (this.activeConversation?.getConversationType() == CometChatUIKitConstants.MessageReceiverType.user) {
|
|
357
|
+
if ((!this.activeConversation || this.activeConversation?.getConversationWith()?.getUid() !== message?.getSender()?.getUid())
|
|
358
|
+
&& !message.hasOwnProperty("deliveredAt")) {
|
|
359
|
+
CometChat.markAsDelivered(message);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
if ((!this.activeConversation || this.activeConversation?.getConversationWith()?.getGuid() !== message?.getReceiverId())
|
|
364
|
+
&& !message.hasOwnProperty("deliveredAt")) {
|
|
365
|
+
CometChat.markAsDelivered(message);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
/**
|
|
370
|
+
* @param {CometChat.BaseMessage} readMessage
|
|
371
|
+
*/
|
|
372
|
+
this.getUinx = () => {
|
|
373
|
+
return String(Math.round(+new Date() / 1000));
|
|
374
|
+
};
|
|
375
|
+
/**
|
|
376
|
+
* showing dialog for confirm and cancel
|
|
377
|
+
* @param {CometChat.Conversation|{}} conversation
|
|
378
|
+
*/
|
|
379
|
+
this.showConfirmationDialog = (conversation) => {
|
|
380
|
+
this.isDialogOpen = true;
|
|
381
|
+
this.conversationToBeDeleted = conversation;
|
|
382
|
+
this.ref.detectChanges();
|
|
383
|
+
};
|
|
384
|
+
this.styles = {
|
|
385
|
+
wrapperStyle: () => {
|
|
386
|
+
return {
|
|
387
|
+
height: this.conversationsStyle.height,
|
|
388
|
+
width: this.conversationsStyle.width,
|
|
389
|
+
border: this.conversationsStyle.border || `1px solid ${this.themeService.theme.palette.getAccent400()}`,
|
|
390
|
+
borderRadius: this.conversationsStyle.borderRadius,
|
|
391
|
+
background: this.conversationsStyle.background || this.themeService.theme.palette.getBackground(),
|
|
392
|
+
};
|
|
393
|
+
},
|
|
394
|
+
};
|
|
395
|
+
this.subtitleStyle = (conversation) => {
|
|
396
|
+
if (this.typingIndicator && (this.typingIndicator.getReceiverType() == CometChatUIKitConstants.MessageReceiverType.user && this.typingIndicator.getSender().getUid() == conversation.conversationWith?.uid || this.typingIndicator.getReceiverId() == conversation.conversationWith?.guid)) {
|
|
397
|
+
return {
|
|
398
|
+
font: this.conversationsStyle.typingIndictorTextColor,
|
|
399
|
+
color: this.conversationsStyle.typingIndictorTextColor
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
return {
|
|
403
|
+
font: this.conversationsStyle.lastMessageTextFont,
|
|
404
|
+
color: this.conversationsStyle.lastMessageTextColor
|
|
405
|
+
};
|
|
406
|
+
};
|
|
407
|
+
this.itemThreadIndicatorStyle = () => {
|
|
408
|
+
return {
|
|
409
|
+
textFont: this.conversationsStyle.threadIndicatorTextFont || fontHelper(this.themeService.theme.typography.caption2),
|
|
410
|
+
textColor: this.conversationsStyle.threadIndicatorTextColor || this.themeService.theme.palette.getAccent400(),
|
|
411
|
+
};
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* @param {CometChat.Conversation} conversation
|
|
416
|
+
*/
|
|
417
|
+
checkStatusType(conversation) {
|
|
418
|
+
let user = conversation.getConversationWith();
|
|
419
|
+
if (conversation.getConversationType() == CometChatUIKitConstants.MessageReceiverType.user && !this.disableUsersPresence) {
|
|
420
|
+
return this.statusColor[user.getStatus()];
|
|
421
|
+
}
|
|
422
|
+
else {
|
|
423
|
+
return this.statusColor[conversation.getConversationType()];
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
getExtensionData(messageObject) {
|
|
427
|
+
let messageText;
|
|
428
|
+
//xss extensions data
|
|
429
|
+
const xssData = CometChatUIKitUtility.checkMessageForExtensionsData(messageObject, "xss-filter");
|
|
430
|
+
if (xssData && CometChatUIKitUtility.checkHasOwnProperty(xssData, "sanitized_text") && CometChatUIKitUtility.checkHasOwnProperty(xssData, "hasXSS") && xssData.hasXSS === "yes") {
|
|
431
|
+
messageText = xssData.sanitized_text;
|
|
432
|
+
}
|
|
433
|
+
//datamasking extensions data
|
|
434
|
+
const maskedData = CometChatUIKitUtility.checkMessageForExtensionsData(messageObject, "data-masking");
|
|
435
|
+
if (maskedData && CometChatUIKitUtility.checkHasOwnProperty(maskedData, "data") && CometChatUIKitUtility.checkHasOwnProperty(maskedData.data, "sensitive_data") && CometChatUIKitUtility.checkHasOwnProperty(maskedData.data, "message_masked") && maskedData.data.sensitive_data === "yes") {
|
|
436
|
+
messageText = maskedData.data.message_masked;
|
|
437
|
+
}
|
|
438
|
+
//profanity extensions data
|
|
439
|
+
const profaneData = CometChatUIKitUtility.checkMessageForExtensionsData(messageObject, "profanity-filter");
|
|
440
|
+
if (profaneData && CometChatUIKitUtility.checkHasOwnProperty(profaneData, "profanity") && CometChatUIKitUtility.checkHasOwnProperty(profaneData, "message_clean") && profaneData.profanity === "yes") {
|
|
441
|
+
messageText = profaneData.message_clean;
|
|
442
|
+
}
|
|
443
|
+
return messageText || messageObject.text;
|
|
444
|
+
}
|
|
445
|
+
checkGroupType(conversation) {
|
|
446
|
+
let image = "";
|
|
447
|
+
if (conversation.getConversationType() == CometChatUIKitConstants.MessageReceiverType.group) {
|
|
448
|
+
switch (conversation.getConversationType()) {
|
|
449
|
+
case CometChatUIKitConstants.GroupTypes.password:
|
|
450
|
+
image = this.protectedGroupIcon;
|
|
451
|
+
break;
|
|
452
|
+
case CometChatUIKitConstants.GroupTypes.private:
|
|
453
|
+
image = this.privateGroupIcon;
|
|
454
|
+
break;
|
|
455
|
+
default:
|
|
456
|
+
image = "";
|
|
457
|
+
break;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
return image;
|
|
461
|
+
}
|
|
462
|
+
getDate() {
|
|
463
|
+
return this.datePattern || DatePatterns.DayDateTime;
|
|
464
|
+
}
|
|
465
|
+
ngOnInit() {
|
|
466
|
+
this.setThemeStyle();
|
|
467
|
+
this.subscribeToEvents();
|
|
468
|
+
if (this.conversationsRequestBuilder) {
|
|
469
|
+
this.conversationsRequestBuilder?.build();
|
|
470
|
+
}
|
|
471
|
+
else {
|
|
472
|
+
this.conversationsRequestBuilder = new CometChat.ConversationsRequestBuilder().setLimit(this.limit).build();
|
|
473
|
+
}
|
|
474
|
+
this.state = States.loading;
|
|
475
|
+
this.setConversationOptions();
|
|
476
|
+
try {
|
|
477
|
+
this.getConversation();
|
|
478
|
+
this.attachListeners(this.conversationUpdated);
|
|
479
|
+
}
|
|
480
|
+
catch (error) {
|
|
481
|
+
if (this.onError) {
|
|
482
|
+
this.onError(error);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
this.ref.detectChanges();
|
|
486
|
+
}
|
|
487
|
+
updateConversationObject(conversation) {
|
|
488
|
+
let index = this.conversationList.findIndex((element) => element.getConversationId() == conversation.getConversationId());
|
|
489
|
+
this.conversationList.splice(index, 1, conversation);
|
|
490
|
+
this.ref.detectChanges();
|
|
491
|
+
}
|
|
492
|
+
subscribeToEvents() {
|
|
493
|
+
this.ccGroupMemberScopeChanged = CometChatGroupEvents.ccGroupMemberScopeChanged.subscribe((item) => {
|
|
494
|
+
let conversation = this.getConversationFromGroup(item.group);
|
|
495
|
+
if (conversation) {
|
|
496
|
+
conversation.setLastMessage(item.message);
|
|
497
|
+
this.updateConversationObject(conversation);
|
|
498
|
+
}
|
|
499
|
+
});
|
|
500
|
+
this.ccGroupMemberAdded = CometChatGroupEvents.ccGroupMemberAdded.subscribe((item) => {
|
|
501
|
+
let group = item.userAddedIn;
|
|
502
|
+
let actionMessage = item.messages;
|
|
503
|
+
let conversation = this.getConversationFromGroup(item.userAddedIn);
|
|
504
|
+
conversation?.setConversationWith(group);
|
|
505
|
+
conversation?.setLastMessage(actionMessage[actionMessage?.length - 1]);
|
|
506
|
+
this.updateConversationObject(conversation);
|
|
507
|
+
});
|
|
508
|
+
this.ccGroupMemberKicked = CometChatGroupEvents.ccGroupMemberKicked.subscribe((item) => {
|
|
509
|
+
let conversation = this.getConversationFromGroup(item.kickedFrom);
|
|
510
|
+
if (conversation) {
|
|
511
|
+
conversation.setLastMessage(item.message);
|
|
512
|
+
this.updateConversationObject(conversation);
|
|
513
|
+
}
|
|
514
|
+
});
|
|
515
|
+
this.ccGroupMemberBanned = CometChatGroupEvents.ccGroupMemberBanned.subscribe((item) => {
|
|
516
|
+
let conversation = this.getConversationFromGroup(item.kickedFrom);
|
|
517
|
+
if (conversation) {
|
|
518
|
+
conversation.setLastMessage(item.message);
|
|
519
|
+
this.updateConversationObject(conversation);
|
|
520
|
+
}
|
|
521
|
+
});
|
|
522
|
+
this.ccGroupDeleted = CometChatGroupEvents.ccGroupDeleted.subscribe((item) => {
|
|
523
|
+
let conversation = this.getConversationFromGroup(item);
|
|
524
|
+
if (conversation) {
|
|
525
|
+
this.removeConversation(conversation);
|
|
526
|
+
}
|
|
527
|
+
});
|
|
528
|
+
this.ccGroupLeft = CometChatGroupEvents.ccGroupLeft.subscribe((item) => {
|
|
529
|
+
this.updateConversation(item.message);
|
|
530
|
+
this.ref.detectChanges();
|
|
531
|
+
});
|
|
532
|
+
this.ccUserBlocked = CometChatUserEvents.ccUserBlocked.subscribe((item) => {
|
|
533
|
+
let conversation = this.getConversationFromUser(item);
|
|
534
|
+
if (conversation) {
|
|
535
|
+
this.removeConversation(conversation);
|
|
536
|
+
}
|
|
537
|
+
});
|
|
538
|
+
this.ccMessageEdit = CometChatMessageEvents.ccMessageEdited.subscribe((object) => {
|
|
539
|
+
let message = object.message;
|
|
540
|
+
if (object.status == MessageStatus.success) {
|
|
541
|
+
this.updateEditedMessage(message);
|
|
542
|
+
}
|
|
543
|
+
});
|
|
544
|
+
this.ccMessageSent = CometChatMessageEvents.ccMessageSent.subscribe((obj) => {
|
|
545
|
+
let message = obj.message;
|
|
546
|
+
if (obj.status == MessageStatus.success) {
|
|
547
|
+
this.updateConversation(message);
|
|
548
|
+
}
|
|
549
|
+
});
|
|
550
|
+
this.ccMessageDelete = CometChatMessageEvents.ccMessageDeleted.subscribe((messageObject) => {
|
|
551
|
+
this.updateConversation(messageObject);
|
|
552
|
+
this.ref.detectChanges();
|
|
553
|
+
});
|
|
554
|
+
this.ccMessageRead = CometChatMessageEvents.ccMessageRead.subscribe((messageObject) => {
|
|
555
|
+
CometChat.CometChatHelper.getConversationFromMessage(messageObject).then((conversation) => {
|
|
556
|
+
if (conversation && this.activeConversation && conversation?.getConversationId() == this.activeConversation?.getConversationId()) {
|
|
557
|
+
this.updateEditedMessage(messageObject);
|
|
558
|
+
this.resetUnreadCount();
|
|
559
|
+
}
|
|
560
|
+
});
|
|
561
|
+
});
|
|
562
|
+
this.ccCallEnded = CometChatCallEvents.ccCallEnded.subscribe((call) => {
|
|
563
|
+
if (call) {
|
|
564
|
+
this.updateConversation(call);
|
|
565
|
+
}
|
|
566
|
+
});
|
|
567
|
+
this.ccCallRejected = CometChatCallEvents.ccCallRejected.subscribe((call) => {
|
|
568
|
+
this.updateConversation(call);
|
|
569
|
+
});
|
|
570
|
+
this.ccOutgoingCall = CometChatCallEvents.ccOutgoingCall.subscribe((call) => {
|
|
571
|
+
this.updateConversation(call);
|
|
572
|
+
});
|
|
573
|
+
this.ccCallAccepted = CometChatCallEvents.ccCallAccepted.subscribe((call) => {
|
|
574
|
+
this.updateConversation(call);
|
|
575
|
+
});
|
|
576
|
+
}
|
|
577
|
+
unsubscribeToEvents() {
|
|
578
|
+
this.ccGroupMemberAdded?.unsubscribe();
|
|
579
|
+
this.ccGroupMemberKicked?.unsubscribe();
|
|
580
|
+
this.ccGroupMemberBanned?.unsubscribe();
|
|
581
|
+
this.ccMessageEdit?.unsubscribe();
|
|
582
|
+
this.ccMessageSent?.unsubscribe();
|
|
583
|
+
this.ccMessageEdited?.unsubscribe();
|
|
584
|
+
this.ccMessageDelete?.unsubscribe();
|
|
585
|
+
this.ccGroupDeleted?.unsubscribe();
|
|
586
|
+
this.ccGroupLeft?.unsubscribe();
|
|
587
|
+
this.ccUserBlocked?.unsubscribe();
|
|
588
|
+
this.ccMessageRead?.unsubscribe();
|
|
589
|
+
}
|
|
590
|
+
getConversationFromUser(user) {
|
|
591
|
+
let index = this.conversationList.findIndex((element) => element.getConversationType() == CometChatUIKitConstants.MessageReceiverType.user && element.getConversationWith().getUid() == user.getUid());
|
|
592
|
+
if (index >= 0) {
|
|
593
|
+
return this.conversationList[index];
|
|
594
|
+
}
|
|
595
|
+
return null;
|
|
596
|
+
}
|
|
597
|
+
getConversationFromGroup(group) {
|
|
598
|
+
let index = this.conversationList.findIndex((element) => element.getConversationType() == CometChatUIKitConstants.MessageReceiverType.group && element.getConversationWith().getGuid() == group.getGuid());
|
|
599
|
+
if (index >= 0) {
|
|
600
|
+
return this.conversationList[index];
|
|
601
|
+
}
|
|
602
|
+
return null;
|
|
603
|
+
}
|
|
604
|
+
ngOnChanges(change) {
|
|
605
|
+
try {
|
|
606
|
+
if (change["activeConversation"]) {
|
|
607
|
+
this.resetUnreadCount();
|
|
608
|
+
}
|
|
609
|
+
/**
|
|
610
|
+
* When user sends message conversationList is updated with latest message
|
|
611
|
+
*/
|
|
612
|
+
}
|
|
613
|
+
catch (error) {
|
|
614
|
+
if (this.onError) {
|
|
615
|
+
this.onError(error);
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
ngOnDestroy() {
|
|
620
|
+
try {
|
|
621
|
+
this.removeListeners();
|
|
622
|
+
this.unsubscribeToEvents();
|
|
623
|
+
}
|
|
624
|
+
catch (error) {
|
|
625
|
+
if (this.onError) {
|
|
626
|
+
this.onError(error);
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
this.ref.detectChanges();
|
|
630
|
+
}
|
|
631
|
+
// getting default conversation option and adding callback in it
|
|
632
|
+
setConversationOptions() {
|
|
633
|
+
if (this.options) {
|
|
634
|
+
return;
|
|
635
|
+
}
|
|
636
|
+
this.conversationOptions = ConversationUtils.getDefaultOptions();
|
|
637
|
+
this.conversationOptions.forEach((element) => {
|
|
638
|
+
if (!element.onClick && element.id == CometChatUIKitConstants.ConversationOptions.delete) {
|
|
639
|
+
element.onClick = this.deleteConversationOnClick;
|
|
640
|
+
}
|
|
641
|
+
});
|
|
642
|
+
return;
|
|
643
|
+
}
|
|
644
|
+
// reset unread count
|
|
645
|
+
onClick(conversation) {
|
|
646
|
+
if (this.onItemClick) {
|
|
647
|
+
this.onItemClick(conversation);
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
// set unread count
|
|
651
|
+
resetUnreadCount() {
|
|
652
|
+
if (this.activeConversation) {
|
|
653
|
+
const conversationlist = [...this.conversationList];
|
|
654
|
+
//Gets the index of user which comes offline/online
|
|
655
|
+
const conversationKey = conversationlist.findIndex((conversationObj) => conversationObj?.getConversationId() === this.activeConversation?.getConversationId());
|
|
656
|
+
if (conversationKey > -1) {
|
|
657
|
+
let conversationObj = conversationlist[conversationKey];
|
|
658
|
+
let newConversationObj = conversationObj;
|
|
659
|
+
newConversationObj.setUnreadMessageCount(0);
|
|
660
|
+
newConversationObj.getLastMessage()?.setMuid(this.getUinx());
|
|
661
|
+
conversationlist.splice(conversationKey, 1, newConversationObj);
|
|
662
|
+
this.conversationList = [...conversationlist];
|
|
663
|
+
this.ref.detectChanges();
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
// sets property from theme to style object
|
|
668
|
+
setThemeStyle() {
|
|
669
|
+
this.setAvatarStyle();
|
|
670
|
+
this.setBadgeStyle();
|
|
671
|
+
this.setConfirmDialogStyle();
|
|
672
|
+
this.setConversationsStyle();
|
|
673
|
+
this.setListItemStyle();
|
|
674
|
+
this.setDateStyle();
|
|
675
|
+
this.setStatusStyle();
|
|
676
|
+
this.setReceiptStyle();
|
|
677
|
+
this.statusColor.private = this.conversationsStyle?.privateGroupIconBackground;
|
|
678
|
+
this.statusColor.online = this.conversationsStyle?.onlineStatusColor;
|
|
679
|
+
this.statusColor.password = this.conversationsStyle?.passwordGroupIconBackground;
|
|
680
|
+
this.listStyle = {
|
|
681
|
+
titleTextFont: this.conversationsStyle.titleTextFont,
|
|
682
|
+
titleTextColor: this.conversationsStyle.titleTextColor,
|
|
683
|
+
emptyStateTextFont: this.conversationsStyle.emptyStateTextFont,
|
|
684
|
+
emptyStateTextColor: this.conversationsStyle.emptyStateTextColor,
|
|
685
|
+
errorStateTextFont: this.conversationsStyle.errorStateTextFont,
|
|
686
|
+
errorStateTextColor: this.conversationsStyle.errorStateTextColor,
|
|
687
|
+
loadingIconTint: this.conversationsStyle.loadingIconTint,
|
|
688
|
+
separatorColor: this.conversationsStyle.separatorColor,
|
|
689
|
+
};
|
|
690
|
+
this.iconStyle.iconTint = this.themeService.theme.palette.getAccent400();
|
|
691
|
+
}
|
|
692
|
+
setListItemStyle() {
|
|
693
|
+
let defaultStyle = new ListItemStyle({
|
|
694
|
+
height: "100%",
|
|
695
|
+
width: "100%",
|
|
696
|
+
background: this.themeService.theme.palette.getBackground(),
|
|
697
|
+
activeBackground: this.themeService.theme.palette.getAccent50(),
|
|
698
|
+
borderRadius: "0",
|
|
699
|
+
titleFont: fontHelper(this.themeService.theme.typography.title2),
|
|
700
|
+
titleColor: this.themeService.theme.palette.getAccent(),
|
|
701
|
+
border: "none",
|
|
702
|
+
separatorColor: this.themeService.theme.palette.getAccent200(),
|
|
703
|
+
hoverBackground: this.themeService.theme.palette.getAccent50()
|
|
704
|
+
});
|
|
705
|
+
this.listItemStyle = { ...defaultStyle, ...this.listItemStyle };
|
|
706
|
+
}
|
|
707
|
+
setAvatarStyle() {
|
|
708
|
+
let defaultStyle = new AvatarStyle({
|
|
709
|
+
borderRadius: "24px",
|
|
710
|
+
width: "36px",
|
|
711
|
+
height: "36px",
|
|
712
|
+
border: `1px solid ${this.themeService.theme.palette.getAccent200()}`,
|
|
713
|
+
backgroundColor: this.themeService.theme.palette.getAccent700(),
|
|
714
|
+
nameTextColor: this.themeService.theme.palette.getAccent900(),
|
|
715
|
+
backgroundSize: "cover",
|
|
716
|
+
nameTextFont: fontHelper(this.themeService.theme.typography.subtitle1),
|
|
717
|
+
outerViewBorder: "",
|
|
718
|
+
outerViewBorderSpacing: "",
|
|
719
|
+
});
|
|
720
|
+
this.avatarStyle = { ...defaultStyle, ...this.avatarStyle };
|
|
721
|
+
}
|
|
722
|
+
setStatusStyle() {
|
|
723
|
+
let defaultStyle = {
|
|
724
|
+
height: "12px",
|
|
725
|
+
width: "12px",
|
|
726
|
+
border: "none",
|
|
727
|
+
borderRadius: "24px",
|
|
728
|
+
};
|
|
729
|
+
this.statusIndicatorStyle = { ...defaultStyle, ...this.statusIndicatorStyle };
|
|
730
|
+
}
|
|
731
|
+
setConversationsStyle() {
|
|
732
|
+
let defaultStyle = new ConversationsStyle({
|
|
733
|
+
lastMessageTextFont: fontHelper(this.themeService.theme.typography.subtitle2),
|
|
734
|
+
lastMessageTextColor: this.themeService.theme.palette.getAccent600(),
|
|
735
|
+
background: this.themeService.theme.palette.getBackground(),
|
|
736
|
+
border: `1px solid ${this.themeService.theme.palette.getAccent50()}`,
|
|
737
|
+
titleTextFont: fontHelper(this.themeService.theme.typography.title1),
|
|
738
|
+
titleTextColor: this.themeService.theme.palette.getAccent(),
|
|
739
|
+
emptyStateTextFont: fontHelper(this.themeService.theme.typography.title1),
|
|
740
|
+
emptyStateTextColor: this.themeService.theme.palette.getAccent600(),
|
|
741
|
+
errorStateTextFont: fontHelper(this.themeService.theme.typography.title1),
|
|
742
|
+
errorStateTextColor: this.themeService.theme.palette.getAccent600(),
|
|
743
|
+
loadingIconTint: this.themeService.theme.palette.getAccent600(),
|
|
744
|
+
onlineStatusColor: this.themeService.theme.palette.getSuccess(),
|
|
745
|
+
separatorColor: this.themeService.theme.palette.getAccent400(),
|
|
746
|
+
privateGroupIconBackground: this.themeService.theme.palette.getSuccess(),
|
|
747
|
+
passwordGroupIconBackground: "RGB(247, 165, 0)",
|
|
748
|
+
typingIndictorTextColor: this.themeService.theme.palette.getPrimary(),
|
|
749
|
+
typingIndictorTextFont: fontHelper(this.themeService.theme.typography.subtitle2),
|
|
750
|
+
threadIndicatorTextFont: fontHelper(this.themeService.theme.typography.caption2),
|
|
751
|
+
threadIndicatorTextColor: this.themeService.theme.palette.getAccent600(),
|
|
752
|
+
});
|
|
753
|
+
this.conversationsStyle = { ...defaultStyle, ...this.conversationsStyle };
|
|
754
|
+
}
|
|
755
|
+
setDateStyle() {
|
|
756
|
+
let defaultStyle = new DateStyle({
|
|
757
|
+
textFont: fontHelper(this.themeService.theme.typography.caption2),
|
|
758
|
+
textColor: this.themeService.theme.palette.getAccent600(),
|
|
759
|
+
background: "transparent"
|
|
760
|
+
});
|
|
761
|
+
this.dateStyle = { ...defaultStyle, ...this.dateStyle };
|
|
762
|
+
}
|
|
763
|
+
setReceiptStyle() {
|
|
764
|
+
let defaultStyle = new ReceiptStyle({
|
|
765
|
+
waitIconTint: this.themeService.theme.palette.getAccent700(),
|
|
766
|
+
sentIconTint: this.themeService.theme.palette.getAccent600(),
|
|
767
|
+
deliveredIconTint: this.themeService.theme.palette.getAccent600(),
|
|
768
|
+
readIconTint: this.themeService.theme.palette.getPrimary(),
|
|
769
|
+
errorIconTint: this.themeService.theme.palette.getError(),
|
|
770
|
+
});
|
|
771
|
+
this.receiptStyle = { ...defaultStyle, ...this.receiptStyle };
|
|
772
|
+
}
|
|
773
|
+
setBadgeStyle() {
|
|
774
|
+
let defaultStyle = new BadgeStyle({
|
|
775
|
+
textFont: fontHelper(this.themeService.theme.typography.subtitle2),
|
|
776
|
+
textColor: this.themeService.theme.palette.getAccent("dark"),
|
|
777
|
+
background: this.themeService.theme.palette.getPrimary(),
|
|
778
|
+
borderRadius: "16px",
|
|
779
|
+
width: "24px",
|
|
780
|
+
});
|
|
781
|
+
this.badgeStyle = { ...defaultStyle, ...this.badgeStyle };
|
|
782
|
+
}
|
|
783
|
+
setConfirmDialogStyle() {
|
|
784
|
+
let defaultStyle = new ConfirmDialogStyle({
|
|
785
|
+
confirmButtonBackground: this.themeService.theme.palette.getError(),
|
|
786
|
+
cancelButtonBackground: this.themeService.theme.palette.getSecondary(),
|
|
787
|
+
confirmButtonTextColor: this.themeService.theme.palette.getAccent900("light"),
|
|
788
|
+
confirmButtonTextFont: fontHelper(this.themeService.theme.typography.text2),
|
|
789
|
+
cancelButtonTextColor: this.themeService.theme.palette.getAccent900("dark"),
|
|
790
|
+
cancelButtonTextFont: fontHelper(this.themeService.theme.typography.text2),
|
|
791
|
+
titleFont: fontHelper(this.themeService.theme.typography.title1),
|
|
792
|
+
titleColor: this.themeService.theme.palette.getAccent(),
|
|
793
|
+
messageTextFont: fontHelper(this.themeService.theme.typography.subtitle2),
|
|
794
|
+
messageTextColor: this.themeService.theme.palette.getAccent600(),
|
|
795
|
+
background: this.themeService.theme.palette.getBackground(),
|
|
796
|
+
height: "100%",
|
|
797
|
+
width: "350px",
|
|
798
|
+
});
|
|
799
|
+
this.deleteConversationDialogStyle = { ...defaultStyle, ...this.deleteConversationDialogStyle };
|
|
800
|
+
}
|
|
801
|
+
// checking if user has his own configuration else will use default configuration
|
|
802
|
+
/**
|
|
803
|
+
* @param {Object={}} config
|
|
804
|
+
* @param {Object} defaultConfig?
|
|
805
|
+
* @returns defaultConfig
|
|
806
|
+
*/
|
|
807
|
+
// calling subtitle callback from configurations
|
|
808
|
+
/**
|
|
809
|
+
* @param {CometChat.Conversation} conversation
|
|
810
|
+
*/
|
|
811
|
+
/**
|
|
812
|
+
* Fetches the coversation based on the conversationRequest config
|
|
813
|
+
*/
|
|
814
|
+
fetchNextConversation() {
|
|
815
|
+
try {
|
|
816
|
+
return this.conversationsRequestBuilder?.fetchNext();
|
|
817
|
+
}
|
|
818
|
+
catch (error) {
|
|
819
|
+
if (this.onError) {
|
|
820
|
+
this.onError(error);
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
updateEditedMessage(message) {
|
|
825
|
+
let index = this.conversationList.findIndex((conversationObj) => conversationObj.getLastMessage() && conversationObj.getLastMessage().getId() == message?.getId());
|
|
826
|
+
if (index >= 0) {
|
|
827
|
+
this.conversationEditedDeleted(message);
|
|
828
|
+
}
|
|
829
|
+
}
|
|
830
|
+
/**
|
|
831
|
+
* attaches Listeners for user activity , group activities and calling
|
|
832
|
+
* @param callback
|
|
833
|
+
*/
|
|
834
|
+
/**
|
|
835
|
+
* @param {Function} callback
|
|
836
|
+
*/
|
|
837
|
+
attachListeners(callback) {
|
|
838
|
+
try {
|
|
839
|
+
if (!this.disableUsersPresence) {
|
|
840
|
+
CometChat.addUserListener(this.userListenerId, new CometChat.UserListener({
|
|
841
|
+
onUserOnline: (onlineUser) => {
|
|
842
|
+
/* when someuser/friend comes online, user will be received here */
|
|
843
|
+
callback(CometChatUIKitConstants.userStatusType.online, onlineUser);
|
|
844
|
+
},
|
|
845
|
+
onUserOffline: (offlineUser) => {
|
|
846
|
+
/* when someuser/friend went offline, user will be received here */
|
|
847
|
+
callback(CometChatUIKitConstants.userStatusType.offline, offlineUser);
|
|
848
|
+
},
|
|
849
|
+
}));
|
|
850
|
+
}
|
|
851
|
+
CometChat.addGroupListener(this.groupListenerId, new CometChat.GroupListener({
|
|
852
|
+
onGroupMemberScopeChanged: (message, changedUser, newScope, oldScope, changedGroup) => {
|
|
853
|
+
this.updateConversation(message);
|
|
854
|
+
},
|
|
855
|
+
onGroupMemberKicked: (message, kickedUser, kickedBy, kickedFrom) => {
|
|
856
|
+
this.updateConversation(message);
|
|
857
|
+
},
|
|
858
|
+
onGroupMemberBanned: (message, bannedUser, bannedBy, bannedFrom) => {
|
|
859
|
+
this.updateConversation(message);
|
|
860
|
+
},
|
|
861
|
+
onGroupMemberUnbanned: (message, unbannedUser, unbannedBy, unbannedFrom) => {
|
|
862
|
+
// this.updateConversation(message)
|
|
863
|
+
},
|
|
864
|
+
onMemberAddedToGroup: (message, userAdded, userAddedBy, userAddedIn) => {
|
|
865
|
+
this.updateConversation(message);
|
|
866
|
+
},
|
|
867
|
+
onGroupMemberLeft: (message, leavingUser, group) => {
|
|
868
|
+
this.updateConversation(message);
|
|
869
|
+
},
|
|
870
|
+
onGroupMemberJoined: (message, joinedUser, joinedGroup) => {
|
|
871
|
+
this.updateConversation(message);
|
|
872
|
+
},
|
|
873
|
+
}));
|
|
874
|
+
CometChat.addMessageListener(this.conversationListenerId, new CometChat.MessageListener({
|
|
875
|
+
onTextMessageReceived: (textMessage) => {
|
|
876
|
+
callback(CometChatUIKitConstants.messages.TEXT_MESSAGE_RECEIVED, null, textMessage);
|
|
877
|
+
},
|
|
878
|
+
onMediaMessageReceived: (mediaMessage) => {
|
|
879
|
+
callback(CometChatUIKitConstants.messages.MEDIA_MESSAGE_RECEIVED, null, mediaMessage);
|
|
880
|
+
},
|
|
881
|
+
onCustomMessageReceived: (customMessage) => {
|
|
882
|
+
callback(CometChatUIKitConstants.messages.CUSTOM_MESSAGE_RECEIVED, null, customMessage);
|
|
883
|
+
},
|
|
884
|
+
onMessagesRead: (messageReceipt) => {
|
|
885
|
+
if (!this.disableReceipt) {
|
|
886
|
+
this.markAsRead(messageReceipt);
|
|
887
|
+
}
|
|
888
|
+
},
|
|
889
|
+
onMessageDeleted: (deletedMessage) => {
|
|
890
|
+
callback(CometChatUIKitConstants.messages.MESSAGE_DELETED, null, deletedMessage);
|
|
891
|
+
},
|
|
892
|
+
onMessageEdited: (editedMessage) => {
|
|
893
|
+
callback(CometChatUIKitConstants.messages.MESSAGE_EDITED, null, editedMessage);
|
|
894
|
+
},
|
|
895
|
+
onMessagesDelivered: (messageReceipt) => {
|
|
896
|
+
if (!this.disableReceipt) {
|
|
897
|
+
this.updateDeliveredMessage(messageReceipt);
|
|
898
|
+
}
|
|
899
|
+
},
|
|
900
|
+
onTypingStarted: (typingIndicator) => {
|
|
901
|
+
if (!this.disableTyping) {
|
|
902
|
+
this.typingIndicator = typingIndicator;
|
|
903
|
+
this.ref.detectChanges();
|
|
904
|
+
}
|
|
905
|
+
},
|
|
906
|
+
onTypingEnded: (typingIndicator) => {
|
|
907
|
+
this.typingIndicator = null;
|
|
908
|
+
this.ref.detectChanges();
|
|
909
|
+
}
|
|
910
|
+
}));
|
|
911
|
+
CometChat.addCallListener(this.callListenerId, new CometChat.CallListener({
|
|
912
|
+
onIncomingCallReceived: (call) => {
|
|
913
|
+
this.updateConversation(call);
|
|
914
|
+
},
|
|
915
|
+
onIncomingCallCancelled: (call) => {
|
|
916
|
+
this.updateConversation(call);
|
|
917
|
+
},
|
|
918
|
+
onOutgoingCallRejected: (call) => {
|
|
919
|
+
this.updateConversation(call);
|
|
920
|
+
},
|
|
921
|
+
onOutgoingCallAccepted: (call) => {
|
|
922
|
+
this.updateConversation(call);
|
|
923
|
+
},
|
|
924
|
+
}));
|
|
925
|
+
}
|
|
926
|
+
catch (error) {
|
|
927
|
+
if (this.onError) {
|
|
928
|
+
this.onError(error);
|
|
929
|
+
}
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
/**
|
|
933
|
+
* Removes all listeners
|
|
934
|
+
*/
|
|
935
|
+
removeListeners() {
|
|
936
|
+
try {
|
|
937
|
+
CometChat.removeMessageListener(this.conversationListenerId);
|
|
938
|
+
CometChat.removeUserListener(this.userListenerId);
|
|
939
|
+
CometChat.removeGroupListener(this.groupListenerId);
|
|
940
|
+
}
|
|
941
|
+
catch (error) {
|
|
942
|
+
if (this.onError) {
|
|
943
|
+
this.onError(error);
|
|
944
|
+
}
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
isReceiptDisable(conversation) {
|
|
948
|
+
let item = conversation.getConversationWith();
|
|
949
|
+
let message = conversation.getLastMessage();
|
|
950
|
+
if (!this.disableReceipt && message && message?.getCategory() != CometChatUIKitConstants.MessageCategory.action && message?.getCategory() != CometChatUIKitConstants.MessageCategory.call
|
|
951
|
+
&& (!this.typingIndicator || (item?.uid != this.typingIndicator.getReceiverId() && item?.guid != this.typingIndicator.getReceiverId()))
|
|
952
|
+
&& message.getSender()?.getUid() == this.loggedInUser?.getUid()) {
|
|
953
|
+
return true;
|
|
954
|
+
}
|
|
955
|
+
else {
|
|
956
|
+
return false;
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
markAsRead(readMessage) {
|
|
960
|
+
let conversationlist = [...this.conversationList];
|
|
961
|
+
const conversationKey = conversationlist.findIndex((conversationObj) => conversationObj.getLastMessage().getReceiverId() == readMessage.getSender().getUid());
|
|
962
|
+
if (conversationKey > -1) {
|
|
963
|
+
let newConversationObject;
|
|
964
|
+
if (!conversationlist[conversationKey].getLastMessage().getReadAt()) {
|
|
965
|
+
newConversationObject = conversationlist[conversationKey];
|
|
966
|
+
newConversationObject.getLastMessage().setReadAt(readMessage.getReadAt());
|
|
967
|
+
newConversationObject.getLastMessage().setMuid(this.getUinx());
|
|
968
|
+
conversationlist.splice(conversationKey, 1, newConversationObject);
|
|
969
|
+
this.conversationList = [...conversationlist];
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
}
|
|
973
|
+
/**
|
|
974
|
+
* Updates Detail when user comes online/offline
|
|
975
|
+
* @param
|
|
976
|
+
*/
|
|
977
|
+
/**
|
|
978
|
+
* @param {CometChat.User|CometChat.Group|null} user
|
|
979
|
+
*/
|
|
980
|
+
updateUser(user) {
|
|
981
|
+
try {
|
|
982
|
+
//when user updates
|
|
983
|
+
const conversationlist = [...this.conversationList];
|
|
984
|
+
//Gets the index of user which comes offline/online
|
|
985
|
+
const conversationKey = conversationlist.findIndex((conversationObj) => conversationObj.getConversationType() === CometChatUIKitConstants.MessageReceiverType.user &&
|
|
986
|
+
conversationObj.getConversationWith().getUid() === user.getUid());
|
|
987
|
+
if (conversationKey > -1) {
|
|
988
|
+
let conversationObj = conversationlist[conversationKey];
|
|
989
|
+
let conversationWithObj = conversationObj.getConversationWith();
|
|
990
|
+
conversationWithObj.setStatus(user.getStatus());
|
|
991
|
+
let newConversationObj = conversationObj;
|
|
992
|
+
newConversationObj.setConversationWith(conversationWithObj);
|
|
993
|
+
newConversationObj.getLastMessage().setMuid(this.getUinx());
|
|
994
|
+
conversationlist.splice(conversationKey, 1, newConversationObj);
|
|
995
|
+
this.conversationList = conversationlist;
|
|
996
|
+
this.ref.detectChanges();
|
|
997
|
+
}
|
|
998
|
+
}
|
|
999
|
+
catch (error) {
|
|
1000
|
+
if (this.onError) {
|
|
1001
|
+
this.onError(error);
|
|
1002
|
+
}
|
|
1003
|
+
this.ref.detectChanges();
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
/**
|
|
1007
|
+
*
|
|
1008
|
+
* Gets the last message
|
|
1009
|
+
* @param conversation
|
|
1010
|
+
/**
|
|
1011
|
+
* @param {CometChat.BaseMessage} message
|
|
1012
|
+
* @param {CometChat.Conversation|{}} conversation
|
|
1013
|
+
*/
|
|
1014
|
+
makeLastMessage(message, conversation = {}) {
|
|
1015
|
+
const newMessage = message;
|
|
1016
|
+
return newMessage;
|
|
1017
|
+
}
|
|
1018
|
+
/**
|
|
1019
|
+
*
|
|
1020
|
+
* Updates Conversations as Text/Custom Messages are received
|
|
1021
|
+
* @param
|
|
1022
|
+
*
|
|
1023
|
+
*/
|
|
1024
|
+
/**
|
|
1025
|
+
* @param {CometChat.BaseMessage} message
|
|
1026
|
+
* @param {boolean} notification
|
|
1027
|
+
*/
|
|
1028
|
+
updateConversation(message, notification = true) {
|
|
1029
|
+
try {
|
|
1030
|
+
this.makeConversation(message)
|
|
1031
|
+
.then((response) => {
|
|
1032
|
+
const conversationKey = response.conversationKey;
|
|
1033
|
+
const conversationObj = response.conversationObj;
|
|
1034
|
+
const conversationList = response.conversationList;
|
|
1035
|
+
if (conversationKey > -1) {
|
|
1036
|
+
// if sender is not logged in user then increment count
|
|
1037
|
+
let unreadMessageCount = this.loggedInUser?.getUid() != message.getSender().getUid() || this.loggedInUser?.getUid() == message.getReceiverId() ? this.makeUnreadMessageCount(conversationObj) : this.makeUnreadMessageCount(conversationObj) - 1;
|
|
1038
|
+
let lastMessageObj = this.makeLastMessage(message, conversationObj);
|
|
1039
|
+
let newConversationObj = conversationObj;
|
|
1040
|
+
newConversationObj.setLastMessage(lastMessageObj);
|
|
1041
|
+
newConversationObj.setUnreadMessageCount(unreadMessageCount);
|
|
1042
|
+
newConversationObj.getLastMessage().setMuid(this.getUinx());
|
|
1043
|
+
conversationList.splice(conversationKey, 1);
|
|
1044
|
+
conversationList.unshift(newConversationObj);
|
|
1045
|
+
this.conversationList = [...conversationList];
|
|
1046
|
+
if (notification && this.loggedInUser?.getUid() != message?.getSender()?.getUid()) {
|
|
1047
|
+
this.playAudio();
|
|
1048
|
+
this.ref.detectChanges();
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
else {
|
|
1052
|
+
let lastMessageObj = this.makeLastMessage(message);
|
|
1053
|
+
conversationObj.setLastMessage(lastMessageObj);
|
|
1054
|
+
conversationObj.setUnreadMessageCount(1);
|
|
1055
|
+
conversationList.unshift(conversationObj);
|
|
1056
|
+
this.conversationList = conversationList;
|
|
1057
|
+
this.ref.detectChanges();
|
|
1058
|
+
// this.ref.detectChanges()
|
|
1059
|
+
if (notification && this.loggedInUser?.getUid() != message?.getSender()?.getUid()) {
|
|
1060
|
+
this.playAudio();
|
|
1061
|
+
this.ref.detectChanges();
|
|
1062
|
+
}
|
|
1063
|
+
}
|
|
1064
|
+
this.ref.detectChanges();
|
|
1065
|
+
})
|
|
1066
|
+
.catch((error) => {
|
|
1067
|
+
if (this.onError) {
|
|
1068
|
+
this.onError(error);
|
|
1069
|
+
}
|
|
1070
|
+
this.ref.detectChanges();
|
|
1071
|
+
});
|
|
1072
|
+
}
|
|
1073
|
+
catch (error) {
|
|
1074
|
+
if (this.onError) {
|
|
1075
|
+
this.onError(error);
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
1078
|
+
this.ref.detectChanges();
|
|
1079
|
+
}
|
|
1080
|
+
updateDeliveredMessage(messageReceipt) {
|
|
1081
|
+
let conversationList = [...this.conversationList];
|
|
1082
|
+
let conversationKey = conversationList.findIndex((c) => c.getLastMessage().getId() == Number(messageReceipt.getMessageId()));
|
|
1083
|
+
let conversationObj;
|
|
1084
|
+
if (conversationKey > -1) {
|
|
1085
|
+
conversationObj = conversationList[conversationKey];
|
|
1086
|
+
if (!conversationObj.getLastMessage().getDeliveredAt()) {
|
|
1087
|
+
conversationObj.getLastMessage().setDeliveredAt(Number(this.getUinx()));
|
|
1088
|
+
conversationObj.getLastMessage().setMuid(this.getUinx());
|
|
1089
|
+
conversationList.splice(conversationKey, 1, conversationObj);
|
|
1090
|
+
this.conversationList = [...conversationList];
|
|
1091
|
+
this.ref.detectChanges();
|
|
1092
|
+
}
|
|
1093
|
+
}
|
|
1094
|
+
}
|
|
1095
|
+
/**
|
|
1096
|
+
*
|
|
1097
|
+
* Gets The Count of Unread Messages
|
|
1098
|
+
* @param
|
|
1099
|
+
*/
|
|
1100
|
+
/**
|
|
1101
|
+
* @param {any} conversation
|
|
1102
|
+
* @param {any} operator
|
|
1103
|
+
*/
|
|
1104
|
+
makeUnreadMessageCount(conversation, operator = null) {
|
|
1105
|
+
if (Object.keys(conversation).length === 0) {
|
|
1106
|
+
return 1;
|
|
1107
|
+
}
|
|
1108
|
+
let unreadMessageCount = conversation.getUnreadMessageCount();
|
|
1109
|
+
if (this.activeConversation &&
|
|
1110
|
+
this.activeConversation.getConversationId() === conversation.getConversationId()) {
|
|
1111
|
+
unreadMessageCount += 1;
|
|
1112
|
+
}
|
|
1113
|
+
else if ((this.activeConversation &&
|
|
1114
|
+
this.activeConversation.hasOwnProperty("guid") &&
|
|
1115
|
+
conversation.getConversationWith().hasOwnProperty("guid") &&
|
|
1116
|
+
this.activeConversation.getConversationWith().getGuid() === conversation.getConversationWith().getGuid()) ||
|
|
1117
|
+
(this.activeConversation &&
|
|
1118
|
+
this.activeConversation.hasOwnProperty("uid") &&
|
|
1119
|
+
conversation.getConversationWith().hasOwnProperty("uid") &&
|
|
1120
|
+
this.activeConversation.getConversationWith().getUid() === conversation.getConversationWith().getUid())) {
|
|
1121
|
+
unreadMessageCount = 0;
|
|
1122
|
+
}
|
|
1123
|
+
else {
|
|
1124
|
+
if (operator && operator === "decrement") {
|
|
1125
|
+
unreadMessageCount = unreadMessageCount ? unreadMessageCount - 1 : 0;
|
|
1126
|
+
}
|
|
1127
|
+
else {
|
|
1128
|
+
unreadMessageCount = unreadMessageCount + 1;
|
|
1129
|
+
}
|
|
1130
|
+
}
|
|
1131
|
+
return unreadMessageCount;
|
|
1132
|
+
}
|
|
1133
|
+
/**
|
|
1134
|
+
* Changes detail of conversations
|
|
1135
|
+
* @param
|
|
1136
|
+
*/
|
|
1137
|
+
/**
|
|
1138
|
+
* @param {CometChat.BaseMessage} message
|
|
1139
|
+
*/
|
|
1140
|
+
makeConversation(message) {
|
|
1141
|
+
const promise = new Promise((resolve, reject) => {
|
|
1142
|
+
CometChat.CometChatHelper.getConversationFromMessage(message)
|
|
1143
|
+
.then((conversation) => {
|
|
1144
|
+
let conversationList = [...this.conversationList];
|
|
1145
|
+
let conversationKey = conversationList.findIndex((c) => c?.getConversationId() === conversation.getConversationId());
|
|
1146
|
+
let conversationObj = conversation;
|
|
1147
|
+
if (conversationKey > -1) {
|
|
1148
|
+
conversationObj = conversationList[conversationKey];
|
|
1149
|
+
}
|
|
1150
|
+
resolve({
|
|
1151
|
+
conversationKey: conversationKey,
|
|
1152
|
+
conversationObj: conversationObj,
|
|
1153
|
+
conversationList: conversationList,
|
|
1154
|
+
});
|
|
1155
|
+
this.ref.detectChanges();
|
|
1156
|
+
})
|
|
1157
|
+
.catch((error) => reject(error));
|
|
1158
|
+
});
|
|
1159
|
+
return promise;
|
|
1160
|
+
}
|
|
1161
|
+
/**
|
|
1162
|
+
* Updates Conversation View when message is edited or deleted
|
|
1163
|
+
*/
|
|
1164
|
+
conversationEditedDeleted(message) {
|
|
1165
|
+
try {
|
|
1166
|
+
this.makeConversation(message)
|
|
1167
|
+
.then((response) => {
|
|
1168
|
+
const conversationKey = response.conversationKey;
|
|
1169
|
+
const conversationObj = response.conversationObj;
|
|
1170
|
+
const conversationList = response.conversationList;
|
|
1171
|
+
if (conversationKey > -1) {
|
|
1172
|
+
let lastMessageObj = conversationObj.getLastMessage();
|
|
1173
|
+
if (lastMessageObj.getId() === message.getId()) {
|
|
1174
|
+
conversationObj.setLastMessage(message);
|
|
1175
|
+
conversationObj.getLastMessage().setMuid(this.getUinx());
|
|
1176
|
+
conversationList.splice(conversationKey, 1, conversationObj);
|
|
1177
|
+
this.conversationList = [...conversationList];
|
|
1178
|
+
this.ref.detectChanges();
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
})
|
|
1182
|
+
.catch((error) => {
|
|
1183
|
+
if (this.onError) {
|
|
1184
|
+
this.onError(error);
|
|
1185
|
+
}
|
|
1186
|
+
this.ref.detectChanges();
|
|
1187
|
+
});
|
|
1188
|
+
}
|
|
1189
|
+
catch (error) {
|
|
1190
|
+
if (this.onError) {
|
|
1191
|
+
this.onError(error);
|
|
1192
|
+
}
|
|
1193
|
+
}
|
|
1194
|
+
}
|
|
1195
|
+
/**
|
|
1196
|
+
* If User scrolls to the bottom of the current Conversation list than fetch next items of the Conversation list and append
|
|
1197
|
+
* @param Event
|
|
1198
|
+
*/
|
|
1199
|
+
/**
|
|
1200
|
+
* Plays Audio When Message is Received
|
|
1201
|
+
*/
|
|
1202
|
+
playAudio() {
|
|
1203
|
+
try {
|
|
1204
|
+
if (!this.disableSoundForMessages) {
|
|
1205
|
+
if (this.customSoundForMessages) {
|
|
1206
|
+
CometChatSoundManager.play(this.customSoundForMessages);
|
|
1207
|
+
}
|
|
1208
|
+
else {
|
|
1209
|
+
CometChatSoundManager.play(CometChatSoundManager.Sound.incomingMessageFromOther);
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1212
|
+
else {
|
|
1213
|
+
return;
|
|
1214
|
+
}
|
|
1215
|
+
}
|
|
1216
|
+
catch (error) {
|
|
1217
|
+
if (this.onError) {
|
|
1218
|
+
this.onError(error);
|
|
1219
|
+
}
|
|
1220
|
+
}
|
|
1221
|
+
}
|
|
1222
|
+
/*
|
|
1223
|
+
* Updates the convesation list when deleted.
|
|
1224
|
+
* Adding Conversation Object to CometchatService
|
|
1225
|
+
*/
|
|
1226
|
+
/**
|
|
1227
|
+
* @param {CometChat.Conversation|{}} conversation
|
|
1228
|
+
*/
|
|
1229
|
+
updateConversationList(conversation) {
|
|
1230
|
+
let index = this.conversationList.findIndex((element) => element?.getConversationId() == conversation?.getConversationId());
|
|
1231
|
+
this.conversationList.splice(index, 1);
|
|
1232
|
+
this.ref.detectChanges();
|
|
1233
|
+
}
|
|
1234
|
+
onOptionClick(event, conversation) {
|
|
1235
|
+
let option = event?.detail?.data;
|
|
1236
|
+
this.conversationToBeDeleted = conversation;
|
|
1237
|
+
if (option) {
|
|
1238
|
+
option.onClick();
|
|
1239
|
+
}
|
|
1240
|
+
}
|
|
1241
|
+
/**
|
|
1242
|
+
* show confirm dialog screen
|
|
1243
|
+
* @param {CometChat.Conversation|{}} conversaton
|
|
1244
|
+
*/
|
|
1245
|
+
// check is there is any active conversation and mark it as active
|
|
1246
|
+
getActiveConversation(conversation) {
|
|
1247
|
+
if (this.selectionMode == SelectionMode.none || !this.selectionMode) {
|
|
1248
|
+
return this.activeConversation && this.activeConversation?.conversationId == conversation?.conversationId;
|
|
1249
|
+
}
|
|
1250
|
+
else {
|
|
1251
|
+
return false;
|
|
1252
|
+
}
|
|
1253
|
+
}
|
|
1254
|
+
/**
|
|
1255
|
+
* handle confirm dialog response
|
|
1256
|
+
* @param {string} value
|
|
1257
|
+
*/
|
|
1258
|
+
// calling cometchat.deleteConversation method
|
|
1259
|
+
deleteSelectedConversation() {
|
|
1260
|
+
if (this.conversationToBeDeleted) {
|
|
1261
|
+
if (this.activeConversation && this.activeConversation.getConversationId() == this.conversationToBeDeleted.getConversationId()) {
|
|
1262
|
+
this.activeConversation = null;
|
|
1263
|
+
}
|
|
1264
|
+
let conversationWith;
|
|
1265
|
+
let conversationType = this.conversationToBeDeleted.getConversationType();
|
|
1266
|
+
if (conversationType === CometChatUIKitConstants.MessageReceiverType.user) {
|
|
1267
|
+
conversationWith = this.conversationToBeDeleted.getConversationWith().getUid();
|
|
1268
|
+
}
|
|
1269
|
+
else {
|
|
1270
|
+
conversationWith = this.conversationToBeDeleted.getConversationWith().getGuid();
|
|
1271
|
+
}
|
|
1272
|
+
CometChat.deleteConversation(conversationWith, conversationType).then(deletedConversation => {
|
|
1273
|
+
CometChatConversationEvents.ccConversationDeleted.next(this.conversationToBeDeleted);
|
|
1274
|
+
this.updateConversationList(this.conversationToBeDeleted);
|
|
1275
|
+
this.conversationToBeDeleted = null;
|
|
1276
|
+
this.ref.detectChanges();
|
|
1277
|
+
});
|
|
1278
|
+
this.isDialogOpen = false;
|
|
1279
|
+
this.ref.detectChanges();
|
|
1280
|
+
}
|
|
1281
|
+
}
|
|
1282
|
+
// exposed methods to users.
|
|
1283
|
+
updateLastMessage(message) {
|
|
1284
|
+
this.updateConversation(message);
|
|
1285
|
+
}
|
|
1286
|
+
removeConversation(conversation) {
|
|
1287
|
+
this.updateConversationList(conversation);
|
|
1288
|
+
}
|
|
1289
|
+
}
|
|
1290
|
+
CometChatConversationsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: CometChatConversationsComponent, deps: [{ token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i1.CometChatThemeService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1291
|
+
CometChatConversationsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: CometChatConversationsComponent, selector: "cometchat-conversations", inputs: { subtitleView: "subtitleView", title: "title", options: "options", searchPlaceHolder: "searchPlaceHolder", disableUsersPresence: "disableUsersPresence", disableReceipt: "disableReceipt", disableTyping: "disableTyping", deliveredIcon: "deliveredIcon", readIcon: "readIcon", errorIcon: "errorIcon", datePattern: "datePattern", onError: "onError", sentIcon: "sentIcon", privateGroupIcon: "privateGroupIcon", protectedGroupIcon: "protectedGroupIcon", customSoundForMessages: "customSoundForMessages", activeConversation: "activeConversation", searchIconURL: "searchIconURL", hideSearch: "hideSearch", conversationsRequestBuilder: "conversationsRequestBuilder", emptyStateView: "emptyStateView", onSelect: "onSelect", loadingIconURL: "loadingIconURL", errorStateView: "errorStateView", loadingStateView: "loadingStateView", emptyStateText: "emptyStateText", errorStateText: "errorStateText", titleAlignment: "titleAlignment", listItemView: "listItemView", menu: "menu", hideSeparator: "hideSeparator", searchPlaceholder: "searchPlaceholder", hideError: "hideError", selectionMode: "selectionMode", disableSoundForMessages: "disableSoundForMessages", confirmDialogTitle: "confirmDialogTitle", confirmButtonText: "confirmButtonText", cancelButtonText: "cancelButtonText", confirmDialogMessage: "confirmDialogMessage", onItemClick: "onItemClick", deleteConversationDialogStyle: "deleteConversationDialogStyle", backdropStyle: "backdropStyle", badgeStyle: "badgeStyle", dateStyle: "dateStyle", conversationsStyle: "conversationsStyle", listItemStyle: "listItemStyle", statusIndicatorStyle: "statusIndicatorStyle", typingIndicatorText: "typingIndicatorText", threadIndicatorText: "threadIndicatorText", avatarStyle: "avatarStyle", receiptStyle: "receiptStyle", loggedInUser: "loggedInUser" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cc-conversations\" [ngStyle]=\"styles.wrapperStyle()\">\n <cometchat-backdrop [backdropStyle]=\"backdropStyle\" *ngIf=\"isDialogOpen\">\n <cometchat-confirm-dialog [title]=\"confirmDialogTitle\" [messageText]=\"confirmDialogMessage\" [cancelButtonText]=\"cancelButtonText\" [confirmButtonText]=\"confirmButtonText\" (cc-confirm-clicked)=\"onConfirmClick()\" (cc-cancel-clicked)=\"onCancelClick()\" [confirmDialogStyle]=\"deleteConversationDialogStyle\">\n </cometchat-confirm-dialog>\n </cometchat-backdrop>\n <div class=\"cc-conversations__menus\" *ngIf=\"menu\">\n\n <ng-container *ngTemplateOutlet=\"menu\">\n </ng-container>\n\n </div>\n<cometchat-list [state]=\"state\"\n[searchIconURL]=\"searchIconURL\" [hideError]=\"hideError\"\n[emptyStateText]=\"emptyStateText\" [loadingIconURL]=\"loadingIconURL\"\n[titleAlignment]=\"titleAlignment\" [loadingView]=\"loadingStateView\" [listStyle]=\"listStyle\" [emptyStateView]=\"emptyStateView\"\n[errorStateText]=\"errorStateText\" [errorView]=\"errorStateView\"\n[onScrolledToBottom]=\"getConversation\" [list]=\"conversationList\" [listItemView]=\"listItemView ? listItemView : listItem\" [title]=\"title\" [hideSearch]=\"hideSearch\"></cometchat-list>\n</div>\n<ng-template #listItem let-conversation>\n <cometchat-list-item [hideSeparator]=\"hideSeparator\" [avatarStyle]=\"avatarStyle\" [statusIndicatorStyle]=\"setStatusIndicatorStyle(conversation)\"\n [id]=\"conversation?.conversationId\" [isActive]=\"getActiveConversation(conversation)\"\n (cc-listitem-clicked)=\"onClick(conversation)\" [title]=\"conversation?.conversationWith?.name\"\n [statusIndicatorIcon]=\"checkGroupType(conversation)\" [statusIndicatorColor]=\"checkStatusType(conversation)\"\n [listItemStyle]=\"listItemStyle\" [avatarURL]=\"conversation?.conversationWith?.avatar\" [avatarName]=\"conversation?.conversationWith?.name\">\n <div slot=\"subtitleView\" *ngIf=\"subtitleView;else conversationSubtitle\">\n <ng-container *ngTemplateOutlet=\"subtitleView\">\n </ng-container>\n </div>\n <ng-template #conversationSubtitle>\n\n <div class=\"cc-conversations__subtitle-view \" slot=\"subtitleView\" >\n <div class=\"cc-conversations__threadview\" *ngIf=\"conversation?.lastMessage?.parentMessageId\">\n <cometchat-label [labelStyle]=\"itemThreadIndicatorStyle()\" [text]=\"threadIndicatorText\"> </cometchat-label>\n <cometchat-icon [URL]=\"threadIconURL\" [iconStyle]=\"iconStyle\"></cometchat-icon>\n\n </div>\n<div class=\"cc-conversations__subtitle\">\n <div class=\"cc-conversations__readreceipt\" *ngIf=\"isReceiptDisable(conversation)\">\n <cometchat-receipt [receipt]=\"getMessageReceipt(conversation)\" [receiptStyle]=\"receiptStyle\" [sentIcon]=\"sentIcon\" [errorIcon]=\"errorIcon\" [deliveredIcon]=\"deliveredIcon\" [readIcon]=\"readIcon\"></cometchat-receipt>\n </div>\n\n <div [ngStyle]=\"subtitleStyle(conversation)\" class=\"cc-subtitle__text\"> {{setSubtitle(conversation)}} </div>\n</div>\n\n </div>\n </ng-template>\n <div slot=\"menuView\" class=\"cc-conversations__optionsview\" *ngIf=\"selectionMode == selectionmodeEnum.none\">\n <div *ngIf=\"options\">\n <cometchat-menu-list [data]=\"options(conversation)\" (cc-menu-clicked)=\"onOptionClick($event,conversation)\" [menuListStyle]=\"menustyle\">\n\n </cometchat-menu-list>\n </div>\n <div *ngIf=\"!options && conversationOptions\">\n <cometchat-menu-list [data]=\"conversationOptions\" (cc-menu-clicked)=\"onOptionClick($event,conversation)\" [menuListStyle]=\"menustyle\">\n\n </cometchat-menu-list>\n </div>\n</div>\n<div slot=\"tailView\" class=\"cc-conversations__tail-view\">\n<div class=\"tail__view\" *ngIf=\"selectionMode == selectionmodeEnum.none\">\n <div class=\"cc-date\">\n <cometchat-date [dateStyle]=\"dateStyle\" [timestamp]=\"conversation?.lastMessage?.sentAt\" [pattern]=\"getDate()\"></cometchat-date>\n </div>\n <div class=\"cc-conversations__badge\">\n <cometchat-badge [count]=\"conversation?.unreadMessageCount\" [badgeStyle]=\"badgeStyle\"></cometchat-badge>\n </div>\n</div>\n<div class=\"cc-conversations__selection-view\" *ngIf=\"selectionMode != selectionmodeEnum.none\">\n <ng-container *ngTemplateOutlet=\"tailView\">\n </ng-container>\n</div>\n</div>\n </cometchat-list-item>\n <ng-template #tailView>\n <div *ngIf=\"selectionMode == selectionmodeEnum.single\">\n <cometchat-radio-button (cc-radio-button-changed)=\"onSelect ? onSelect(conversation) : null\"></cometchat-radio-button>\n </div>\n <div *ngIf=\"selectionMode == selectionmodeEnum.multiple\">\n <cometchat-checkbox (cc-checkbox-changed)=\"onSelect ? onSelect(conversation) : null\"></cometchat-checkbox>\n </div>\n </ng-template>\n</ng-template>\n\n\n", styles: [".cc-conversations{height:100%;width:100%;box-sizing:border-box;margin-bottom:16px;position:relative}.cc-conversations__selection-view{position:relative}.tail__view{display:flex;flex-direction:column;justify-content:flex-start;align-items:center}.cc-subtitle__text{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.cc-conversations__menus{position:absolute;right:12px;padding:12px;cursor:pointer}.cc-menus__icon{height:24px;width:24px}.cc-conversations__subtitle-view{display:flex;align-items:center;width:90%;flex-direction:column;justify-content:flex-start}.cc-conversations__subtitle{display:flex;justify-content:flex-start;width:100%;align-items:center;min-height:22px}.cc-conversations__threadview{height:12px;display:flex;justify-content:flex-start;width:100%;align-items:center}.cc-conversations__badge{display:flex;align-items:flex-end;justify-content:flex-end;width:100%;padding-right:8px}\n"], components: [{ type: i2.CometchatListComponent, selector: "cometchat-list", inputs: ["listItemView", "onScrolledToBottom", "onScrolledToTop", "list", "onSearch", "searchText", "searchIconURL", "listStyle", "searchPlaceholderText", "hideSearch", "hideError", "title", "titleAlignment", "errorStateView", "loadingStateView", "emptyStateView", "state", "errorStateText", "emptyStateText", "loadingIconURL", "showSectionHeader", "sectionHeaderField"] }], directives: [{ type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
1292
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: CometChatConversationsComponent, decorators: [{
|
|
1293
|
+
type: Component,
|
|
1294
|
+
args: [{ selector: "cometchat-conversations", changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cc-conversations\" [ngStyle]=\"styles.wrapperStyle()\">\n <cometchat-backdrop [backdropStyle]=\"backdropStyle\" *ngIf=\"isDialogOpen\">\n <cometchat-confirm-dialog [title]=\"confirmDialogTitle\" [messageText]=\"confirmDialogMessage\" [cancelButtonText]=\"cancelButtonText\" [confirmButtonText]=\"confirmButtonText\" (cc-confirm-clicked)=\"onConfirmClick()\" (cc-cancel-clicked)=\"onCancelClick()\" [confirmDialogStyle]=\"deleteConversationDialogStyle\">\n </cometchat-confirm-dialog>\n </cometchat-backdrop>\n <div class=\"cc-conversations__menus\" *ngIf=\"menu\">\n\n <ng-container *ngTemplateOutlet=\"menu\">\n </ng-container>\n\n </div>\n<cometchat-list [state]=\"state\"\n[searchIconURL]=\"searchIconURL\" [hideError]=\"hideError\"\n[emptyStateText]=\"emptyStateText\" [loadingIconURL]=\"loadingIconURL\"\n[titleAlignment]=\"titleAlignment\" [loadingView]=\"loadingStateView\" [listStyle]=\"listStyle\" [emptyStateView]=\"emptyStateView\"\n[errorStateText]=\"errorStateText\" [errorView]=\"errorStateView\"\n[onScrolledToBottom]=\"getConversation\" [list]=\"conversationList\" [listItemView]=\"listItemView ? listItemView : listItem\" [title]=\"title\" [hideSearch]=\"hideSearch\"></cometchat-list>\n</div>\n<ng-template #listItem let-conversation>\n <cometchat-list-item [hideSeparator]=\"hideSeparator\" [avatarStyle]=\"avatarStyle\" [statusIndicatorStyle]=\"setStatusIndicatorStyle(conversation)\"\n [id]=\"conversation?.conversationId\" [isActive]=\"getActiveConversation(conversation)\"\n (cc-listitem-clicked)=\"onClick(conversation)\" [title]=\"conversation?.conversationWith?.name\"\n [statusIndicatorIcon]=\"checkGroupType(conversation)\" [statusIndicatorColor]=\"checkStatusType(conversation)\"\n [listItemStyle]=\"listItemStyle\" [avatarURL]=\"conversation?.conversationWith?.avatar\" [avatarName]=\"conversation?.conversationWith?.name\">\n <div slot=\"subtitleView\" *ngIf=\"subtitleView;else conversationSubtitle\">\n <ng-container *ngTemplateOutlet=\"subtitleView\">\n </ng-container>\n </div>\n <ng-template #conversationSubtitle>\n\n <div class=\"cc-conversations__subtitle-view \" slot=\"subtitleView\" >\n <div class=\"cc-conversations__threadview\" *ngIf=\"conversation?.lastMessage?.parentMessageId\">\n <cometchat-label [labelStyle]=\"itemThreadIndicatorStyle()\" [text]=\"threadIndicatorText\"> </cometchat-label>\n <cometchat-icon [URL]=\"threadIconURL\" [iconStyle]=\"iconStyle\"></cometchat-icon>\n\n </div>\n<div class=\"cc-conversations__subtitle\">\n <div class=\"cc-conversations__readreceipt\" *ngIf=\"isReceiptDisable(conversation)\">\n <cometchat-receipt [receipt]=\"getMessageReceipt(conversation)\" [receiptStyle]=\"receiptStyle\" [sentIcon]=\"sentIcon\" [errorIcon]=\"errorIcon\" [deliveredIcon]=\"deliveredIcon\" [readIcon]=\"readIcon\"></cometchat-receipt>\n </div>\n\n <div [ngStyle]=\"subtitleStyle(conversation)\" class=\"cc-subtitle__text\"> {{setSubtitle(conversation)}} </div>\n</div>\n\n </div>\n </ng-template>\n <div slot=\"menuView\" class=\"cc-conversations__optionsview\" *ngIf=\"selectionMode == selectionmodeEnum.none\">\n <div *ngIf=\"options\">\n <cometchat-menu-list [data]=\"options(conversation)\" (cc-menu-clicked)=\"onOptionClick($event,conversation)\" [menuListStyle]=\"menustyle\">\n\n </cometchat-menu-list>\n </div>\n <div *ngIf=\"!options && conversationOptions\">\n <cometchat-menu-list [data]=\"conversationOptions\" (cc-menu-clicked)=\"onOptionClick($event,conversation)\" [menuListStyle]=\"menustyle\">\n\n </cometchat-menu-list>\n </div>\n</div>\n<div slot=\"tailView\" class=\"cc-conversations__tail-view\">\n<div class=\"tail__view\" *ngIf=\"selectionMode == selectionmodeEnum.none\">\n <div class=\"cc-date\">\n <cometchat-date [dateStyle]=\"dateStyle\" [timestamp]=\"conversation?.lastMessage?.sentAt\" [pattern]=\"getDate()\"></cometchat-date>\n </div>\n <div class=\"cc-conversations__badge\">\n <cometchat-badge [count]=\"conversation?.unreadMessageCount\" [badgeStyle]=\"badgeStyle\"></cometchat-badge>\n </div>\n</div>\n<div class=\"cc-conversations__selection-view\" *ngIf=\"selectionMode != selectionmodeEnum.none\">\n <ng-container *ngTemplateOutlet=\"tailView\">\n </ng-container>\n</div>\n</div>\n </cometchat-list-item>\n <ng-template #tailView>\n <div *ngIf=\"selectionMode == selectionmodeEnum.single\">\n <cometchat-radio-button (cc-radio-button-changed)=\"onSelect ? onSelect(conversation) : null\"></cometchat-radio-button>\n </div>\n <div *ngIf=\"selectionMode == selectionmodeEnum.multiple\">\n <cometchat-checkbox (cc-checkbox-changed)=\"onSelect ? onSelect(conversation) : null\"></cometchat-checkbox>\n </div>\n </ng-template>\n</ng-template>\n\n\n", styles: [".cc-conversations{height:100%;width:100%;box-sizing:border-box;margin-bottom:16px;position:relative}.cc-conversations__selection-view{position:relative}.tail__view{display:flex;flex-direction:column;justify-content:flex-start;align-items:center}.cc-subtitle__text{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.cc-conversations__menus{position:absolute;right:12px;padding:12px;cursor:pointer}.cc-menus__icon{height:24px;width:24px}.cc-conversations__subtitle-view{display:flex;align-items:center;width:90%;flex-direction:column;justify-content:flex-start}.cc-conversations__subtitle{display:flex;justify-content:flex-start;width:100%;align-items:center;min-height:22px}.cc-conversations__threadview{height:12px;display:flex;justify-content:flex-start;width:100%;align-items:center}.cc-conversations__badge{display:flex;align-items:flex-end;justify-content:flex-end;width:100%;padding-right:8px}\n"] }]
|
|
1295
|
+
}], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: i1.CometChatThemeService }]; }, propDecorators: { subtitleView: [{
|
|
1296
|
+
type: Input
|
|
1297
|
+
}], title: [{
|
|
1298
|
+
type: Input
|
|
1299
|
+
}], options: [{
|
|
1300
|
+
type: Input
|
|
1301
|
+
}], searchPlaceHolder: [{
|
|
1302
|
+
type: Input
|
|
1303
|
+
}], disableUsersPresence: [{
|
|
1304
|
+
type: Input
|
|
1305
|
+
}], disableReceipt: [{
|
|
1306
|
+
type: Input
|
|
1307
|
+
}], disableTyping: [{
|
|
1308
|
+
type: Input
|
|
1309
|
+
}], deliveredIcon: [{
|
|
1310
|
+
type: Input
|
|
1311
|
+
}], readIcon: [{
|
|
1312
|
+
type: Input
|
|
1313
|
+
}], errorIcon: [{
|
|
1314
|
+
type: Input
|
|
1315
|
+
}], datePattern: [{
|
|
1316
|
+
type: Input
|
|
1317
|
+
}], onError: [{
|
|
1318
|
+
type: Input
|
|
1319
|
+
}], sentIcon: [{
|
|
1320
|
+
type: Input
|
|
1321
|
+
}], privateGroupIcon: [{
|
|
1322
|
+
type: Input
|
|
1323
|
+
}], protectedGroupIcon: [{
|
|
1324
|
+
type: Input
|
|
1325
|
+
}], customSoundForMessages: [{
|
|
1326
|
+
type: Input
|
|
1327
|
+
}], activeConversation: [{
|
|
1328
|
+
type: Input
|
|
1329
|
+
}], searchIconURL: [{
|
|
1330
|
+
type: Input
|
|
1331
|
+
}], hideSearch: [{
|
|
1332
|
+
type: Input
|
|
1333
|
+
}], conversationsRequestBuilder: [{
|
|
1334
|
+
type: Input
|
|
1335
|
+
}], emptyStateView: [{
|
|
1336
|
+
type: Input
|
|
1337
|
+
}], onSelect: [{
|
|
1338
|
+
type: Input
|
|
1339
|
+
}], loadingIconURL: [{
|
|
1340
|
+
type: Input
|
|
1341
|
+
}], errorStateView: [{
|
|
1342
|
+
type: Input
|
|
1343
|
+
}], loadingStateView: [{
|
|
1344
|
+
type: Input
|
|
1345
|
+
}], emptyStateText: [{
|
|
1346
|
+
type: Input
|
|
1347
|
+
}], errorStateText: [{
|
|
1348
|
+
type: Input
|
|
1349
|
+
}], titleAlignment: [{
|
|
1350
|
+
type: Input
|
|
1351
|
+
}], listItemView: [{
|
|
1352
|
+
type: Input
|
|
1353
|
+
}], menu: [{
|
|
1354
|
+
type: Input
|
|
1355
|
+
}], hideSeparator: [{
|
|
1356
|
+
type: Input
|
|
1357
|
+
}], searchPlaceholder: [{
|
|
1358
|
+
type: Input
|
|
1359
|
+
}], hideError: [{
|
|
1360
|
+
type: Input
|
|
1361
|
+
}], selectionMode: [{
|
|
1362
|
+
type: Input
|
|
1363
|
+
}], disableSoundForMessages: [{
|
|
1364
|
+
type: Input
|
|
1365
|
+
}], confirmDialogTitle: [{
|
|
1366
|
+
type: Input
|
|
1367
|
+
}], confirmButtonText: [{
|
|
1368
|
+
type: Input
|
|
1369
|
+
}], cancelButtonText: [{
|
|
1370
|
+
type: Input
|
|
1371
|
+
}], confirmDialogMessage: [{
|
|
1372
|
+
type: Input
|
|
1373
|
+
}], onItemClick: [{
|
|
1374
|
+
type: Input
|
|
1375
|
+
}], deleteConversationDialogStyle: [{
|
|
1376
|
+
type: Input
|
|
1377
|
+
}], backdropStyle: [{
|
|
1378
|
+
type: Input
|
|
1379
|
+
}], badgeStyle: [{
|
|
1380
|
+
type: Input
|
|
1381
|
+
}], dateStyle: [{
|
|
1382
|
+
type: Input
|
|
1383
|
+
}], conversationsStyle: [{
|
|
1384
|
+
type: Input
|
|
1385
|
+
}], listItemStyle: [{
|
|
1386
|
+
type: Input
|
|
1387
|
+
}], statusIndicatorStyle: [{
|
|
1388
|
+
type: Input
|
|
1389
|
+
}], typingIndicatorText: [{
|
|
1390
|
+
type: Input
|
|
1391
|
+
}], threadIndicatorText: [{
|
|
1392
|
+
type: Input
|
|
1393
|
+
}], avatarStyle: [{
|
|
1394
|
+
type: Input
|
|
1395
|
+
}], receiptStyle: [{
|
|
1396
|
+
type: Input
|
|
1397
|
+
}], loggedInUser: [{
|
|
1398
|
+
type: Input
|
|
1399
|
+
}] } });
|
|
1400
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tZXRjaGF0LWNvbnZlcnNhdGlvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2hhdC11aWtpdC1hbmd1bGFyL3NyYy9Db21ldENoYXRDb252ZXJzYXRpb25zL2NvbWV0Y2hhdC1jb252ZXJzYXRpb25zL2NvbWV0Y2hhdC1jb252ZXJzYXRpb25zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NoYXQtdWlraXQtYW5ndWxhci9zcmMvQ29tZXRDaGF0Q29udmVyc2F0aW9ucy9jb21ldGNoYXQtY29udmVyc2F0aW9ucy9jb21ldGNoYXQtY29udmVyc2F0aW9ucy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxLQUFLLEdBT04sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWhELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxFQUFFLGNBQWMsRUFBQyxpQkFBaUIsRUFBRyxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBQyxxQkFBcUIsRUFBYSxrQkFBa0IsRUFBRSxTQUFTLEVBQUcsYUFBYSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN04sT0FBTyxFQUFpQixVQUFVLEVBQUUsUUFBUSxFQUFrQixvQkFBb0IsRUFBRSx1QkFBdUIsRUFBOEYsbUJBQW1CLEVBQUUsc0JBQXNCLEVBQUUsMkJBQTJCLEVBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFDLE1BQU0sNEJBQTRCLENBQUE7QUFDdFYsT0FBTywyQkFBMkIsQ0FBQTtBQUNsQyxPQUFRLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBQyxrQkFBa0IsRUFBQyxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBQyxNQUFNLDJCQUEyQixDQUFBO0FBSTdILE9BQU8sRUFBRSxn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QUk7c0JBQVosS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLDZCQUE2QjtzQkFBckMsS0FBSztnQkFnQkcsYUFBYTtzQkFBckIsS0FBSztnQkFLRyxVQUFVO3NCQUFsQixLQUFLO2dCQVFHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBSUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQU1HLGFBQWE7c0JBQXJCLEtBQUs7Z0JBV0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUtHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQTZGRyxZQUFZO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXBwbGljYXRpb25SZWYsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IENvbWV0Q2hhdCB9IGZyb20gXCJAY29tZXRjaGF0LXByby9jaGF0XCI7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHtTZWxlY3Rpb25Nb2RlLFN0YXRlcywgVGl0bGVBbGlnbm1lbnQsQ29udmVyc2F0aW9uVXRpbHMgLCBNZXNzYWdlUmVjZWlwdFV0aWxzLCBDb21ldENoYXRTb3VuZE1hbmFnZXIsQ29tZXRDaGF0VUlLaXRVdGlsaXR5LCBCYXNlU3R5bGUsIENvbnZlcnNhdGlvbnNTdHlsZSwgTGlzdFN0eWxlLCAgTWVzc2FnZVN0YXR1cyB9IGZyb20gXCJAY29tZXRjaGF0L3Vpa2l0LXNoYXJlZFwiO1xuaW1wb3J0IHtDb21ldENoYXRUaGVtZSwgZm9udEhlbHBlciwgbG9jYWxpemUsQ29tZXRDaGF0T3B0aW9uLCBDb21ldENoYXRHcm91cEV2ZW50cywgQ29tZXRDaGF0VUlLaXRDb25zdGFudHMsSUdyb3VwTGVmdCwgSUdyb3VwTWVtYmVyQWRkZWQsIElHcm91cE1lbWJlcktpY2tlZEJhbm5lZCwgSUdyb3VwTWVtYmVyU2NvcGVDaGFuZ2VkLElNZXNzYWdlcywgQ29tZXRDaGF0VXNlckV2ZW50cywgQ29tZXRDaGF0TWVzc2FnZUV2ZW50cywgQ29tZXRDaGF0Q29udmVyc2F0aW9uRXZlbnRzLERhdGVQYXR0ZXJucywgQ29tZXRDaGF0Q2FsbEV2ZW50c30gZnJvbSAnQGNvbWV0Y2hhdC91aWtpdC1yZXNvdXJjZXMnXG5pbXBvcnQgJ0Bjb21ldGNoYXQvdWlraXQtZWxlbWVudHMnXG5pbXBvcnQgIHsgQXZhdGFyU3R5bGUsIExpc3RJdGVtU3R5bGUsQ29uZmlybURpYWxvZ1N0eWxlLFJlY2VpcHRTdHlsZSwgRGF0ZVN0eWxlLCBCYWRnZVN0eWxlfSBmcm9tICdAY29tZXRjaGF0L3Vpa2l0LWVsZW1lbnRzJ1xuaW1wb3J0IHsgQ29tZXRjaGF0TGlzdENvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9Db21ldENoYXRMaXN0L2NvbWV0Y2hhdC1saXN0LmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gXCJAYW5ndWxhci9jb21waWxlci9zcmMvaTE4bi9pMThuX2FzdFwiO1xuaW1wb3J0IHsgQ29tZXRDaGF0VGhlbWVTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL0NvbWV0Q2hhdFRoZW1lLnNlcnZpY2VcIjtcbmltcG9ydCB7IENoYXRDb25maWd1cmF0b3IgfSBmcm9tIFwiLi4vLi4vU2hhcmVkL0ZyYW1ld29yay9DaGF0Q29uZmlndXJhdG9yXCI7XG4vKipcbipcbiogQ29tZXRDaGF0Q29udmVyc2F0aW9uIGlzIGEgd3JhcHBlciBjb21wb25lbnQgY29uc2lzdHMgb2YgQ29tZXRDaGF0TGlzdEJhc2VDb21wb25lbnQgYW5kIENvbnZlcnNhdGlvbkxpc3RDb21wb25lbnQuXG4qXG4qIEB2ZXJzaW9uIDEuMC4wXG4qIEBhdXRob3IgQ29tZXRDaGF0VGVhbVxuKiBAY29weXJpZ2h0IMKpIDIwMjIgQ29tZXRDaGF0IEluYy5cbipcbiovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiY29tZXRjaGF0LWNvbnZlcnNhdGlvbnNcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9jb21ldGNoYXQtY29udmVyc2F0aW9ucy5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vY29tZXRjaGF0LWNvbnZlcnNhdGlvbnMuY29tcG9uZW50LnNjc3NcIl0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBDb21ldENoYXRDb252ZXJzYXRpb25zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAvKipcbiogVGhpcyBwcm9wZXJ0aWVzIHdpbGwgY29tZSBmcm9tIFBhcmVudC5cbiovXG4gIEBJbnB1dCgpIHN1YnRpdGxlVmlldyE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmcgPSBsb2NhbGl6ZShcIkNIQVRTXCIpOyAvL1RpdGxlIG9mIHRoZSBjb21wb25lbnRcbiAgQElucHV0KCkgICBvcHRpb25zITogKChtZW1iZXI6Q29tZXRDaGF0LkNvbnZlcnNhdGlvbik9PkNvbWV0Q2hhdE9wdGlvbltdKSB8IG51bGw7XG4gIEBJbnB1dCgpIHNlYXJjaFBsYWNlSG9sZGVyOiBzdHJpbmcgPSBsb2NhbGl6ZShcIlNFQVJDSFwiKTsgLy8gcGxhY2Vob2xkZXIgdGV4dCBvZiBzZWFyY2ggaW5wdXRcbiAgQElucHV0KCkgZGlzYWJsZVVzZXJzUHJlc2VuY2U6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZGlzYWJsZVJlY2VpcHQ6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBkaXNhYmxlVHlwaW5nOmJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZGVsaXZlcmVkSWNvbjpzdHJpbmcgPSBcImFzc2V0cy9tZXNzYWdlLWRlbGl2ZXJlZC5zdmdcIlxuICBASW5wdXQoKSByZWFkSWNvbjpzdHJpbmcgPSBcImFzc2V0cy9tZXNzYWdlLXJlYWQuc3ZnXCI7XG4gIEBJbnB1dCgpIGVycm9ySWNvbjpzdHJpbmcgPSBcImFzc2V0cy93YXJuaW5nLXNtYWxsLnN2Z1wiO1xuICBASW5wdXQoKSBkYXRlUGF0dGVybjpEYXRlUGF0dGVybnMgPSBEYXRlUGF0dGVybnMuRGF5RGF0ZVRpbWU7XG4gIEBJbnB1dCgpIG9uRXJyb3I6KGVycm9yOkNvbWV0Q2hhdC5Db21ldENoYXRFeGNlcHRpb24pPT52b2lkID0gKGVycm9yOkNvbWV0Q2hhdC5Db21ldENoYXRFeGNlcHRpb24pPT57XG4gICAgY29uc29sZS5sb2coZXJyb3IpXG4gIH1cbiAgQElucHV0KCkgc2VudEljb246c3RyaW5nID0gXCJhc3NldHMvbWVzc2FnZS1zZW50LnN2Z1wiO1xuICBASW5wdXQoKSBwcml2YXRlR3JvdXBJY29uOnN0cmluZyA9XCJhc3NldHMvUHJpdmF0ZS5zdmdcIjtcbiAgQElucHV0KCkgcHJvdGVjdGVkR3JvdXBJY29uOnN0cmluZyA9IFwiYXNzZXRzL0xvY2tlZC5zdmdcIjtcbiAgQElucHV0KCkgY3VzdG9tU291bmRGb3JNZXNzYWdlczpzdHJpbmcgPSBcIlwiO1xuICBASW5wdXQoKSBhY3RpdmVDb252ZXJzYXRpb246IENvbWV0Q2hhdC5Db252ZXJzYXRpb24gfCBudWxsID0gbnVsbDsgLy9zZWxlY3RlZCBjb252ZXJzYXRpb25cbiAgQElucHV0KCkgc2VhcmNoSWNvblVSTDogc3RyaW5nID0gXCJhc3NldHMvc2VhcmNoLnN2Z1wiOyAvL2ltYWdlIFVSTCBvZiB0aGUgc2VhcmNoIGljb25cbiAgQElucHV0KCkgaGlkZVNlYXJjaDogYm9vbGVhbiA9IHRydWU7IC8vc3dpdGNoIG9uL2ZmIHNlYXJjaCBpbnB1dFxuICBASW5wdXQoKSBjb252ZXJzYXRpb25zUmVxdWVzdEJ1aWxkZXI6IGFueTtcbiAgQElucHV0KCkgZW1wdHlTdGF0ZVZpZXchOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBASW5wdXQoKSBvblNlbGVjdCE6IChjb252ZXJzYXRpb246Q29tZXRDaGF0LkNvbnZlcnNhdGlvbik9PnZvaWQ7XG4gIEBJbnB1dCgpIGxvYWRpbmdJY29uVVJMOnN0cmluZyA9IFwiYXNzZXRzL1NwaW5uZXIuc3ZnXCJcbiAgQElucHV0KCkgZXJyb3JTdGF0ZVZpZXchOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBASW5wdXQoKSBsb2FkaW5nU3RhdGVWaWV3ITogVGVtcGxhdGVSZWY8YW55PjtcbiAgQElucHV0KCkgZW1wdHlTdGF0ZVRleHQ6IHN0cmluZyA9IGxvY2FsaXplKFwiTk9fQ0hBVFNfRk9VTkRcIilcbiAgQElucHV0KCkgZXJyb3JTdGF0ZVRleHQ6IHN0cmluZyA9IGxvY2FsaXplKFwiU09NRVRISU5HX1dST05HXCIpO1xuICBASW5wdXQoKSB0aXRsZUFsaWdubWVudDogVGl0bGVBbGlnbm1lbnQgPSBUaXRsZUFsaWdubWVudC5sZWZ0O1xuXG4gIEBJbnB1dCgpIGxpc3RJdGVtVmlldyE6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBJbnB1dCgpIG1lbnUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBASW5wdXQoKSBoaWRlU2VwYXJhdG9yOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNlYXJjaFBsYWNlaG9sZGVyOiBzdHJpbmcgPSBsb2NhbGl6ZShcIlNFQVJDSFwiKTtcbiAgQElucHV0KCkgaGlkZUVycm9yOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNlbGVjdGlvbk1vZGU6IFNlbGVjdGlvbk1vZGUgPSBTZWxlY3Rpb25Nb2RlLm5vbmU7XG4gIEBJbnB1dCgpIGRpc2FibGVTb3VuZEZvck1lc3NhZ2VzOmJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgY29uZmlybURpYWxvZ1RpdGxlID0gbG9jYWxpemUoXCJERUxFVEVfQ09OVkVSU0FUSU9OXCIpXG4gIEBJbnB1dCgpIGNvbmZpcm1CdXR0b25UZXh0OiBzdHJpbmcgPSBsb2NhbGl6ZShcIkRFTEVURVwiKTtcbiAgQElucHV0KCkgY2FuY2VsQnV0dG9uVGV4dDogc3RyaW5nID0gbG9jYWxpemUoXCJDQU5DRUxcIik7XG4gIEBJbnB1dCgpIGNvbmZpcm1EaWFsb2dNZXNzYWdlOiBzdHJpbmcgPSBsb2NhbGl6ZShcIldPVUxEX19ZT1VfTElLRV9UT19ERUxFVEVfVEhJU19DT05WRVJTQVRJT05cIik7XG4gIEBJbnB1dCgpIG9uSXRlbUNsaWNrITooY29udmVyc2F0aW9uOkNvbWV0Q2hhdC5Db252ZXJzYXRpb24pPT52b2lkO1xuICBASW5wdXQoKSBkZWxldGVDb252ZXJzYXRpb25EaWFsb2dTdHlsZTogQ29uZmlybURpYWxvZ1N0eWxlID0ge1xuICAgIGNvbmZpcm1CdXR0b25CYWNrZ3JvdW5kOiBcIlwiLFxuICAgIGNhbmNlbEJ1dHRvbkJhY2tncm91bmQ6IFwiXCIsXG4gICAgY29uZmlybUJ1dHRvblRleHRDb2xvcjogXCJcIixcbiAgICBjb25maXJtQnV0dG9uVGV4dEZvbnQ6IFwiXCIsXG4gICAgY2FuY2VsQnV0dG9uVGV4dENvbG9yOiBcIlwiLFxuICAgIGNhbmNlbEJ1dHRvblRleHRGb250OiBcIlwiLFxuICAgIHRpdGxlRm9udDogXCJcIixcbiAgICB0aXRsZUNvbG9yOiBcIlwiLFxuICAgIG1lc3NhZ2VUZXh0Rm9udDogXCJcIixcbiAgICBtZXNzYWdlVGV4dENvbG9yOiBcIlwiLFxuICAgIGJhY2tncm91bmQ6IFwiXCIsXG4gICAgYm9yZGVyOlwiMXB4IHNvbGlkICNmMmYyZjJcIixcbiAgICBoZWlnaHQ6XCIxMDAlXCIsXG4gICAgd2lkdGg6XCIxMDAlXCJcbiAgfVxuICBASW5wdXQoKSBiYWNrZHJvcFN0eWxlIDpCYXNlU3R5bGUgPSB7XG4gICAgaGVpZ2h0OlwiMTAwJVwiLFxuICAgIHdpZHRoOlwiMTAwJVwiLFxuICAgIGJhY2tncm91bmQ6XCJyZ2JhKDAsIDAsIDAsIDAuNSlcIlxuICB9XG4gIEBJbnB1dCgpIGJhZGdlU3R5bGU6IEJhZGdlU3R5bGUgPSB7XG4gICAgd2lkdGg6IFwiMjVweFwiLFxuICAgIGhlaWdodDogXCIxNXB4XCIsXG4gICAgYmFja2dyb3VuZDogXCIjNWFhZWZmXCIsXG4gICAgdGV4dENvbG9yOiBcIndoaXRlXCIsXG4gICAgdGV4dEZvbnQ6IFwiNDAwIDEzcHggSW50ZXIsIHNhbnMtc2VyaWZcIixcbiAgICBib3JkZXJSYWRpdXM6XCIxNnB4XCJcbiAgfVxuICBASW5wdXQoKSBkYXRlU3R5bGU6IERhdGVTdHlsZSA9IHtcbiAgICB0ZXh0Rm9udDogXCI0MDAgMTFweCBJbnRlciwgc2Fucy1zZXJpZlwiLFxuICAgIHRleHRDb2xvcjogXCJyZ2JhKDIwLCAyMCwgMjAsIDAuNTgpXCIsXG4gIH1cbiAgQElucHV0KCkgY29udmVyc2F0aW9uc1N0eWxlOiBDb252ZXJzYXRpb25zU3R5bGUgPSB7XG4gICAgd2lkdGg6XCJcIixcbiAgICBoZWlnaHQ6XCJcIixcbiAgICBib3JkZXI6XCJcIixcbiAgICBib3JkZXJSYWRpdXM6XCJcIixcbiAgfVxuICBASW5wdXQoKSBsaXN0SXRlbVN0eWxlOiBMaXN0SXRlbVN0eWxlID0ge1xuICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgIGJhY2tncm91bmQ6IFwiXCIsXG4gICAgYWN0aXZlQmFja2dyb3VuZDogXCJcIixcbiAgICBib3JkZXJSYWRpdXM6IFwiZ3JleVwiLFxuICAgIHRpdGxlRm9udDogXCJcIixcbiAgICB0aXRsZUNvbG9yOiBcIlwiLFxuICAgIGJvcmRlcjogXCJcIixcbiAgICBzZXBhcmF0b3JDb2xvcjpcInJnYigyMzIsIDIzMiwgMjMyKVwiXG4gIH07XG4gIEBJbnB1dCgpIHN0YXR1c0luZGljYXRvclN0eWxlOiBhbnkgPSB7XG4gICAgaGVpZ2h0OiBcIjEwcHhcIixcbiAgICB3aWR0aDogXCIxMHB4XCIsXG4gICAgYm9yZGVyUmFkaXVzOiBcIjE2cHhcIlxuICB9O1xuICBASW5wdXQoKSB0eXBpbmdJbmRpY2F0b3JUZXh0OnN0cmluZyA9IGxvY2FsaXplKFwiSVNfVFlQSU5HXCIpO1xuICBASW5wdXQoKSB0aHJlYWRJbmRpY2F0b3JUZXh0OnN0cmluZyA9IGxvY2FsaXplKFwiSU5fQV9USFJFQURcIik7XG4gIEBJbnB1dCgpIGF2YXRhclN0eWxlOiBBdmF0YXJTdHlsZSA9IHt9O1xuICBASW5wdXQoKSByZWNlaXB0U3R5bGU6UmVjZWlwdFN0eWxlID0ge31cbiAgY2NHcm91cE1lbWJlckFkZGVkITpTdWJzY3JpcHRpb247XG4gIGNjR3JvdXBNZW1iZXJKb2luZWQhOlN1YnNjcmlwdGlvbjtcbiAgY2NHcm91cE1lbWJlcktpY2tlZCE6U3Vic2NyaXB0aW9uO1xuICBjY0dyb3VwTWVtYmVyQmFubmVkITpTdWJzY3JpcHRpb247XG4gIGNjR3JvdXBNZW1iZXJTY29wZUNoYW5nZWQhOlN1YnNjcmlwdGlvbjtcbiAgY2NPd25lcnNoaXBDaGFuZ2VkITpTdWJzY3JpcHRpb247XG4gICBjY01lc3NhZ2VFZGl0ITogU3Vic2NyaXB0aW9uO1xuICAgY2NNZXNzYWdlU2VudCE6IFN1YnNjcmlwdGlvbjtcbiAgIGNjTWVzc2FnZUVkaXRlZCE6IFN1YnNjcmlwdGlvbjtcbiAgIGNjTWVzc2FnZURlbGV0ZSE6IFN1YnNjcmlwdGlvbjtcbiAgIGNjR3JvdXBEZWxldGVkITogU3Vic2NyaXB0aW9uO1xuICAgY2NHcm91cExlZnQhOiBTdWJzY3JpcHRpb247XG4gICBjY1VzZXJCbG9ja2VkITogU3Vic2NyaXB0aW9uO1xuICAgY2NNZXNzYWdlUmVhZCE6IFN1YnNjcmlwdGlvbjtcbiAgIHB1YmxpYyBjY091dGdvaW5nQ2FsbCE6IFN1YnNjcmlwdGlvbjtcbiAgIHB1YmxpYyBjY0NhbGxSZWplY3RlZCE6IFN1YnNjcmlwdGlvbjtcbiAgIHB1YmxpYyBjY0NhbGxFbmRlZCE6IFN1YnNjcmlwdGlvbjtcbiAgIHB1YmxpYyBjY0NhbGxBY2NlcHRlZCE6U3Vic2NyaXB0aW9uO1xuICBpY29uU3R5bGU6YW55ID0ge1xuICAgIGljb25UaW50OlwibGlnaHRncmV5XCIsXG4gICAgaGVpZ2h0OlwiMjBweFwiLFxuICAgIHdpZHRoOlwiMjBweFwiXG4gIH1cbiAgbGlzdFN0eWxlOkxpc3RTdHlsZSA9IG5ldyBMaXN0U3R5bGUoe30pXG4gIG1lbnVzdHlsZSA9IHtcbiAgICB3aWR0aDogXCJcIixcbiAgICBoZWlnaHQ6IFwiXCIsXG4gICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgICBib3JkZXJSYWRpdXM6IFwiOHB4XCIsXG4gICAgYmFja2dyb3VuZDogXCJ0cmFuc3BhcmVudFwiLFxuICAgIHRleHRGb250OiBcIlwiLFxuICAgIHRleHRDb2xvcjogXCJibGFja1wiLFxuICAgIGljb25UaW50OiBcImdyZXlcIixcbiAgICBpY29uQmFja2dyb3VuZDogXCJ0cmFuc3BhcmVudFwiLFxuICAgIGljb25Cb3JkZXI6IFwibm9uZVwiLFxuICAgIGljb25Cb3JkZXJSYWRpdXM6IFwiMFwiLFxuICAgIHN1Ym1lbnVXaWR0aDogXCI3MHB4XCIsXG4gICAgc3VibWVudUhlaWdodDogXCIyMHB4XCIsXG4gICAgc3VibWVudUJvcmRlcjogXCIxcHggc29saWQgI2U4ZThlOFwiLFxuICAgIHN1Ym1lbnVCb3JkZXJSYWRpdXM6IFwiOHB4XCIsXG4gICAgc3VibWVudUJhY2tncm91bmQ6IFwid2hpdGVcIixcbiAgfVxuICBwdWJsaWMgdHlwaW5nSW5kaWNhdG9yITpDb21ldENoYXQuVHlwaW5nSW5kaWNhdG9yIHwgbnVsbFxuICBwdWJsaWMgdHlwaW5nTGlzdGVuZXJJZDogc3RyaW5nID0gXCJjb252ZXJzYXRpb25fX0xJU1RFTkVSXCIgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgcHVibGljIGNhbGxMaXN0ZW5lcklkID0gXCJjYWxsX1wiKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgc2VsZWN0aW9ubW9kZUVudW06IHR5cGVvZiBTZWxlY3Rpb25Nb2RlID0gU2VsZWN0aW9uTW9kZTtcbiAgcHVibGljIGlzRGlhbG9nT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyBwdWJsaWMgbG9nZ2VkSW5Vc2VyITogQ29tZXRDaGF0LlVzZXIgfCBudWxsO1xuICBwdWJsaWMgaXNFbXB0eTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgaXNMb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcbiAgcHVibGljIHN0YXRlOiBTdGF0ZXMgPSBTdGF0ZXMubG9hZGluZztcbiAgcHVibGljIHN0YXR1c0NvbG9yOiBhbnkgPSB7XG4gICAgb25saW5lOiBcIlwiLFxuICAgIHByaXZhdGU6IFwiXCIsXG4gICAgcGFzc3dvcmQ6IFwiI0Y3QTUwMFwiLFxuICAgIHB1YmxpYzogXCJcIlxuICB9XG4gIHB1YmxpYyBsaW1pdDpudW1iZXIgPSAzMDtcbiAgcHVibGljIGlzRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGNvbnZlcnNhdGlvbkxpc3Q6IENvbWV0Q2hhdC5Db252ZXJzYXRpb25bXSA9IFtdO1xuICBwdWJsaWMgc2Nyb2xsZWRUb0JvdHRvbTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgY2hlY2tJdGVtQ2hhbmdlOiBib29sZWFuID0gZmFsc2U7XG4gIGNvbnZlcnNhdGlvbk9wdGlvbnMhOkNvbWV0Q2hhdE9wdGlvbltdO1xuICBwdWJsaWMgc2hvd0NvbmZpcm1EaWFsb2c6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGNvbnZlcnNhdGlvblRvQmVEZWxldGVkOiBDb21ldENoYXQuQ29udmVyc2F0aW9uIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBjb252ZXJzYXRpb25MaXN0ZW5lcklkOiBzdHJpbmcgPSBcImNoYXRsaXN0X1wiICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIHB1YmxpYyB1c2VyTGlzdGVuZXJJZDogc3RyaW5nID0gXCJjaGF0bGlzdF91c2VyX1wiICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIHB1YmxpYyBncm91cExpc3RlbmVySWQ6IHN0cmluZyA9IFwiY2hhdGxpc3RfZ3JvdXBfXCIgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgcHVibGljIGdyb3VwVG9VcGRhdGU6IENvbWV0Q2hhdC5Hcm91cCB8IHt9ID0ge307XG4gIGVuYWJsZVBvbGxzOmJvb2xlYW4gPSBmYWxzZTtcbiAgZW5hYmxlU3RpY2tlcnM6Ym9vbGVhbiA9IGZhbHNlO1xuICBlbmFibGVXaGl0ZWJvYXJkOmJvb2xlYW4gPSBmYWxzZVxuICBlbmFibGVEb2N1bWVudDpib29sZWFuID0gZmFsc2VcbiAgdGhyZWFkSWNvblVSTDpzdHJpbmcgPSBcImFzc2V0cy90aHJlYWQtYXJyb3cuc3ZnXCJcbiAgcHVibGljIGNvbmZpcm1EaWFsb2dTdHlsZTogQ29uZmlybURpYWxvZ1N0eWxlID0ge1xuICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgIGJvcmRlclJhZGl1czogXCI4cHhcIlxuICB9XG4gIHN1YnRpdGxlVmFsdWUhOiBzdHJpbmc7XG4gIG1vZGFsU3R5bGU6QmFzZVN0eWxlID0ge1xuICAgIGhlaWdodDpcIjIzMHB4XCIsXG4gICAgd2lkdGg6XCIyNzBweFwiXG5cbiAgfVxuICAvKipcbiAgICAqIFByb3BlcnRpZXMgZm9yIGludGVybmFsIHVzZVxuICAgICovXG4gIHB1YmxpYyBsb2NhbGl6ZSA9IGxvY2FsaXplO1xuICAvKipcbiogVGhpcyBwcm9wZXJ0aWVzIHdpbGwgY29tZSBmcm9tIFBhcmVudC5cbiovXG4gIEBJbnB1dCgpIGxvZ2dlZEluVXNlciE6IENvbWV0Q2hhdC5Vc2VyIHwgbnVsbDtcbiAgLyoqXG4gICogUHJvcGVydGllcyBmb3IgaW50ZXJuYWwgdXNlXG4gICovXG4gIC8qKlxuICAgKiBwYXNzaW5nIHRoaXMgY2FsbGJhY2sgdG8gbWVudUxpc3QgY29tcG9uZW50IG9uIGRlbGV0ZSBjbGlja1xuICAgKiBAcGFyYW0gIHtDb21ldENoYXQuQ29udmVyc2F0aW9ufSBjb252ZXJzYXRpb25cbiAgICovXG4gIGRlbGV0ZUNvbnZlcnNhdGlvbk9uQ2xpY2s6ICgoKT0+dm9pZCkgfCBudWxsID0gICgpPT4ge1xuICAgdGhpcy5zaG93Q29uZmlybWF0aW9uRGlhbG9nKHRoaXMuY29udmVyc2F0aW9uVG9CZURlbGV0ZWQhKVxuICB9XG4gIC8vIGNhbGxiYWNrIGZvciBjb25maXJtRGlhbG9nQ29tcG9uZW50XG4gIG9uQ29uZmlybUNsaWNrID0gKCkgPT4ge1xuICAgICAgdGhpcy5kZWxldGVTZWxlY3RlZENvbnZlcnNhdGlvbigpO1xuICB9XG4gIHNldFN0YXR1c0luZGljYXRvclN0eWxlID0gKGNvbnZlcnNhdGlvbjogQ29tZXRDaGF0LkNvbnZlcnNhdGlvbikgPT4ge1xuICAgIGlmIChjb252ZXJzYXRpb24uZ2V0Q29udmVyc2F0aW9uVHlwZSgpID09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VSZWNlaXZlclR5cGUuZ3JvdXApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhlaWdodDogXCIxMnB4XCIsXG4gICAgICAgIHdpZHRoOiBcIjEycHhcIixcbiAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjE2cHhcIlxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXR1c0luZGljYXRvclN0eWxlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0gIHtDb21ldENoYXQuQ29udmVyc2F0aW9ufSBjb252ZXJzYXRpb25cbiAqL1xuICBjaGVja1N0YXR1c1R5cGUoY29udmVyc2F0aW9uOiBDb21ldENoYXQuQ29udmVyc2F0aW9uKSB7XG4gICAgbGV0IHVzZXI6Q29tZXRDaGF0LlVzZXIgPSBjb252ZXJzYXRpb24uZ2V0Q29udmVyc2F0aW9uV2l0aCgpIGFzIENvbWV0Q2hhdC5Vc2VyXG4gICAgaWYgKGNvbnZlcnNhdGlvbi5nZXRDb252ZXJzYXRpb25UeXBlKCkgPT0gQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuTWVzc2FnZVJlY2VpdmVyVHlwZS51c2VyICYmICF0aGlzLmRpc2FibGVVc2Vyc1ByZXNlbmNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0dXNDb2xvclt1c2VyLmdldFN0YXR1cygpXVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXR1c0NvbG9yW2NvbnZlcnNhdGlvbi5nZXRDb252ZXJzYXRpb25UeXBlKCldXG4gICAgfVxuICB9XG4gIGdldEV4dGVuc2lvbkRhdGEobWVzc2FnZU9iamVjdDogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKSB7XG4gICAgbGV0IG1lc3NhZ2VUZXh0XG4gICAgLy94c3MgZXh0ZW5zaW9ucyBkYXRhXG4gICAgY29uc3QgeHNzRGF0YSA9IENvbWV0Q2hhdFVJS2l0VXRpbGl0eS5jaGVja01lc3NhZ2VGb3JFeHRlbnNpb25zRGF0YShtZXNzYWdlT2JqZWN0LCBcInhzcy1maWx0ZXJcIik7XG4gICAgaWYgKHhzc0RhdGEgJiYgQ29tZXRDaGF0VUlLaXRVdGlsaXR5LmNoZWNrSGFzT3duUHJvcGVydHkoeHNzRGF0YSwgXCJzYW5pdGl6ZWRfdGV4dFwiKSAmJiBDb21ldENoYXRVSUtpdFV0aWxpdHkuY2hlY2tIYXNPd25Qcm9wZXJ0eSh4c3NEYXRhLCBcImhhc1hTU1wiKSAmJiB4c3NEYXRhLmhhc1hTUyA9PT0gXCJ5ZXNcIikge1xuICAgICAgbWVzc2FnZVRleHQgPSB4c3NEYXRhLnNhbml0aXplZF90ZXh0O1xuICAgIH1cbiAgICAvL2RhdGFtYXNraW5nIGV4dGVuc2lvbnMgZGF0YVxuICAgIGNvbnN0IG1hc2tlZERhdGEgPSBDb21ldENoYXRVSUtpdFV0aWxpdHkuY2hlY2tNZXNzYWdlRm9yRXh0ZW5zaW9uc0RhdGEobWVzc2FnZU9iamVjdCwgXCJkYXRhLW1hc2tpbmdcIik7XG4gICAgaWYgKG1hc2tlZERhdGEgJiYgQ29tZXRDaGF0VUlLaXRVdGlsaXR5LmNoZWNrSGFzT3duUHJvcGVydHkobWFza2VkRGF0YSwgXCJkYXRhXCIpICYmIENvbWV0Q2hhdFVJS2l0VXRpbGl0eS5jaGVja0hhc093blByb3BlcnR5KG1hc2tlZERhdGEuZGF0YSwgXCJzZW5zaXRpdmVfZGF0YVwiKSAmJiBDb21ldENoYXRVSUtpdFV0aWxpdHkuY2hlY2tIYXNPd25Qcm9wZXJ0eShtYXNrZWREYXRhLmRhdGEsIFwibWVzc2FnZV9tYXNrZWRcIikgJiYgbWFza2VkRGF0YS5kYXRhLnNlbnNpdGl2ZV9kYXRhID09PSBcInllc1wiKSB7XG4gICAgICBtZXNzYWdlVGV4dCA9IG1hc2tlZERhdGEuZGF0YS5tZXNzYWdlX21hc2tlZDtcbiAgICB9XG4gICAgLy9wcm9mYW5pdHkgZXh0ZW5zaW9ucyBkYXRhXG4gICAgY29uc3QgcHJvZmFuZURhdGEgPSBDb21ldENoYXRVSUtpdFV0aWxpdHkuY2hlY2tNZXNzYWdlRm9yRXh0ZW5zaW9uc0RhdGEobWVzc2FnZU9iamVjdCwgXCJwcm9mYW5pdHktZmlsdGVyXCIpO1xuICAgIGlmIChwcm9mYW5lRGF0YSAmJiBDb21ldENoYXRVSUtpdFV0aWxpdHkuY2hlY2tIYXNPd25Qcm9wZXJ0eShwcm9mYW5lRGF0YSwgXCJwcm9mYW5pdHlcIikgJiYgQ29tZXRDaGF0VUlLaXRVdGlsaXR5LmNoZWNrSGFzT3duUHJvcGVydHkocHJvZmFuZURhdGEsIFwibWVzc2FnZV9jbGVhblwiKSAmJiBwcm9mYW5lRGF0YS5wcm9mYW5pdHkgPT09IFwieWVzXCIpIHtcbiAgICAgIG1lc3NhZ2VUZXh0ID0gcHJvZmFuZURhdGEubWVzc2FnZV9jbGVhbjtcbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2VUZXh0IHx8IChtZXNzYWdlT2JqZWN0IGFzIGFueSkudGV4dFxuICB9XG4gIHNldFN1YnRpdGxlID0gKGNvbnZlcnNhdGlvbk9iamVjdDogQ29tZXRDaGF0LkNvbnZlcnNhdGlvbikgPT4ge1xuICAgIGlmICh0aGlzLnR5cGluZ0luZGljYXRvcikge1xuICAgICAgY29uc3QgaXNUeXBpbmcgPSAoY29udmVyc2F0aW9uT2JqZWN0IGFzIGFueSk/LmNvbnZlcnNhdGlvbldpdGg/Lmd1aWQgPT0gdGhpcy50eXBpbmdJbmRpY2F0b3IuZ2V0UmVjZWl2ZXJJZCgpO1xuICAgICAgaWYgKGlzVHlwaW5nKSB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLnR5cGluZ0luZGljYXRvci5nZXRTZW5kZXIoKS5nZXROYW1lKCl9ICR7dGhpcy50eXBpbmdJbmRpY2F0b3JUZXh0fWA7XG4gICAgICB9IGVsc2UgaWYgKChjb252ZXJzYXRpb25PYmplY3QgYXMgYW55KT8uY29udmVyc2F0aW9uV2l0aD8udWlkID09IHRoaXMudHlwaW5nSW5kaWNhdG9yPy5nZXRTZW5kZXIoKS5nZXRVaWQoKSAmJiB0aGlzLnR5cGluZ0luZGljYXRvci5nZXRSZWNlaXZlclR5cGUoKSAhPT0gQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuTWVzc2FnZVJlY2VpdmVyVHlwZS5ncm91cCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBpbmdJbmRpY2F0b3JUZXh0O1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgc3VidGl0bGUgPSAgQ2hhdENvbmZpZ3VyYXRvci5nZXREYXRhU291cmNlKCkuZ2V0TGFzdENvbnZlcnNhdGlvbk1lc3NhZ2UoY29udmVyc2F0aW9uT2JqZWN0LCB0aGlzLmxvZ2dlZEluVXNlciEpXG4gICAgbGV0IGljb24gPSBjb252ZXJzYXRpb25PYmplY3Q/LmdldExhc3RNZXNzYWdlKCk/LmdldFR5cGUoKSA9PSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlVHlwZXMuYXVkaW8gPyBcIvCfk54gXCIgOiBcIvCfk7kgXCJcbiAgICByZXR1cm4gY29udmVyc2F0aW9uT2JqZWN0Py5nZXRMYXN0TWVzc2FnZSgpPy5nZXRDYXRlZ29yeSgpID09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VDYXRlZ29yeS5jYWxsID8gaWNvbiArIHN1YnRpdGxlIDogc3VidGl0bGVcbiAgfVxuICBjaGVja0dyb3VwVHlwZShjb252ZXJzYXRpb246IENvbWV0Q2hhdC5Db252ZXJzYXRpb24pOiBzdHJpbmcge1xuICAgIGxldCBpbWFnZTogc3RyaW5nID0gXCJcIjtcbiAgICBpZiAoY29udmVyc2F0aW9uLmdldENvbnZlcnNhdGlvblR5cGUoKSA9PSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlUmVjZWl2ZXJUeXBlLmdyb3VwKSB7XG4gICAgICBzd2l0Y2ggKGNvbnZlcnNhdGlvbi5nZXRDb252ZXJzYXRpb25UeXBlKCkpIHtcbiAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5Hcm91cFR5cGVzLnBhc3N3b3JkOlxuICAgICAgICAgIGltYWdlID0gdGhpcy5wcm90ZWN0ZWRHcm91cEljb247XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuR3JvdXBUeXBlcy5wcml2YXRlOlxuICAgICAgICAgIGltYWdlID0gdGhpcy5wcml2YXRlR3JvdXBJY29uO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGltYWdlID0gXCJcIlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW1hZ2VcbiAgfVxuICAvLyBjYWxsYmFjayBmb3IgY29uZmlybURpYWxvZ0NvbXBvbmVudFxuICBvbkNhbmNlbENsaWNrID0gKCkgPT4ge1xuICAgIHRoaXMuaXNEaWFsb2dPcGVuID0gZmFsc2VcbiAgICB0aGlzLmNvbnZlcnNhdGlvblRvQmVEZWxldGVkID0gbnVsbFxuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICB9XG4gIGdldE1lc3NhZ2VSZWNlaXB0ID0gKGNvbnZlcnNhdGlvbjogQ29tZXRDaGF0LkNvbnZlcnNhdGlvbikgPT4ge1xuICAgIGxldCByZWNlaXB0ID0gTWVzc2FnZVJlY2VpcHRVdGlscy5nZXRSZWNlaXB0U3RhdHVzKGNvbnZlcnNhdGlvbi5nZXRMYXN0TWVzc2FnZSgpKVxuICAgIHJldHVybiByZWNlaXB0XG4gIH1cbiAgZ2V0RGF0ZSgpe1xuICAgIHJldHVybiB0aGlzLmRhdGVQYXR0ZXJuIHx8IERhdGVQYXR0ZXJucy5EYXlEYXRlVGltZVxuICB9XG4gIG9wdGlvbnNTdHlsZSA9IHtcbiAgICBiYWNrZ3JvdW5kOiBcInRyYW5zcGFyZW50XCIsXG4gICAgYm9yZGVyOiBcIm5vbmVcIlxuICB9XG4gIGlzQWN0aXZlOiBib29sZWFuID0gdHJ1ZTtcbiAgY29udGFjdHNOb3RGb3VuZDogYm9vbGVhbiA9IGZhbHNlO1xuICBjaGF0U2VhcmNoITogYm9vbGVhbjtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYscHJpdmF0ZSB0aGVtZVNlcnZpY2U6Q29tZXRDaGF0VGhlbWVTZXJ2aWNlKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNldFRoZW1lU3R5bGUoKTtcbiAgICB0aGlzLnN1YnNjcmliZVRvRXZlbnRzKClcbmlmKHRoaXMuY29udmVyc2F0aW9uc1JlcXVlc3RCdWlsZGVyKXtcbiAgdGhpcy5jb252ZXJzYXRpb25zUmVxdWVzdEJ1aWxkZXI/LmJ1aWxkKClcbn1cbmVsc2V7XG4gIHRoaXMuY29udmVyc2F0aW9uc1JlcXVlc3RCdWlsZGVyID0gbmV3IENvbWV0Q2hhdC5Db252ZXJzYXRpb25zUmVxdWVzdEJ1aWxkZXIoKS5zZXRMaW1pdCh0aGlzLmxpbWl0KS5idWlsZCgpXG59XG4gICAgdGhpcy5zdGF0ZSA9IFN0YXRlcy5sb2FkaW5nO1xuICAgIHRoaXMuc2V0Q29udmVyc2F0aW9uT3B0aW9ucygpO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmdldENvbnZlcnNhdGlvbigpO1xuICAgICAgdGhpcy5hdHRhY2hMaXN0ZW5lcnModGhpcy5jb252ZXJzYXRpb25VcGRhdGVkKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZih0aGlzLm9uRXJyb3Ipe1xuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICB9XG51cGRhdGVDb252ZXJzYXRpb25PYmplY3QoY29udmVyc2F0aW9uOkNvbWV0Q2hhdC5Db252ZXJzYXRpb24pe1xuICBsZXQgaW5kZXggPSB0aGlzLmNvbnZlcnNhdGlvbkxpc3QuZmluZEluZGV4KChlbGVtZW50OiBDb21ldENoYXQuQ29udmVyc2F0aW9uKSA9PiBlbGVtZW50LmdldENvbnZlcnNhdGlvbklkKCkgPT0gY29udmVyc2F0aW9uLmdldENvbnZlcnNhdGlvbklkKCkpO1xuICB0aGlzLmNvbnZlcnNhdGlvbkxpc3Quc3BsaWNlKGluZGV4LCAxLCBjb252ZXJzYXRpb24pO1xuICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbn1cbiAgc3Vic2NyaWJlVG9FdmVudHMoKXtcbiAgICB0aGlzLmNjR3JvdXBNZW1iZXJTY29wZUNoYW5nZWQgPSBDb21ldENoYXRHcm91cEV2ZW50cy5jY0dyb3VwTWVtYmVyU2NvcGVDaGFuZ2VkLnN1YnNjcmliZSgoaXRlbTpJR3JvdXBNZW1iZXJTY29wZUNoYW5nZWQpPT57XG4gICAgICBsZXQgY29udmVyc2F0aW9uID0gdGhpcy5nZXRDb252ZXJzYXRpb25Gcm9tR3JvdXAoaXRlbS5ncm91cCEpXG4gICAgICBpZihjb252ZXJzYXRpb24pe1xuICAgICAgICBjb252ZXJzYXRpb24uc2V0TGFzdE1lc3NhZ2UoaXRlbS5tZXNzYWdlKVxuICAgICAgICB0aGlzLnVwZGF0ZUNvbnZlcnNhdGlvbk9iamVjdChjb252ZXJzYXRpb24pXG4gICAgICB9XG4gICAgfSlcbiAgICB0aGlzLmNjR3JvdXBNZW1iZXJBZGRlZCA9IENvbWV0Q2hhdEdyb3VwRXZlbnRzLmNjR3JvdXBNZW1iZXJBZGRlZC5zdWJzY3JpYmUoKGl0ZW06SUdyb3VwTWVtYmVyQWRkZWQpPT57XG4gICAgICBsZXQgZ3JvdXA6Q29tZXRDaGF0Lkdyb3VwID0gaXRlbS51c2VyQWRkZWRJbiFcbiAgICAgIGxldCBhY3Rpb25NZXNzYWdlOkNvbWV0Q2hhdC5BY3Rpb25bXSA9IGl0ZW0ubWVzc2FnZXMhXG4gICAgICBsZXQgY29udmVyc2F0aW9uOkNvbWV0Q2hhdC5Db252ZXJzYXRpb24gfCBudWxsID0gdGhpcy5nZXRDb252ZXJzYXRpb25Gcm9tR3JvdXAoaXRlbS51c2VyQWRkZWRJbiEpXG4gICAgICBjb252ZXJzYXRpb24/LnNldENvbnZlcnNhdGlvbldpdGgoZ3JvdXApXG4gICAgICBjb252ZXJzYXRpb24/LnNldExhc3RNZXNzYWdlKGFjdGlvbk1lc3NhZ2VbYWN0aW9uTWVzc2FnZT8ubGVuZ3RoIC0xXSlcbiAgICAgIHRoaXMudXBkYXRlQ29udmVyc2F0aW9uT2JqZWN0KGNvbnZlcnNhdGlvbiEpXG4gICAgfSlcbiAgICB0aGlzLmNjR3JvdXBNZW1iZXJLaWNrZWQgPSBDb21ldENoYXRHcm91cEV2ZW50cy5jY0dyb3VwTWVtYmVyS2lja2VkLnN1YnNjcmliZSgoaXRlbTpJR3JvdXBNZW1iZXJLaWNrZWRCYW5uZWQpPT57XG4gICAgICAgICBsZXQgY29udmVyc2F0aW9uID0gdGhpcy5nZXRDb252ZXJzYXRpb25Gcm9tR3JvdXAoaXRlbS5raWNrZWRGcm9tISlcbiAgICAgICAgIGlmKGNvbnZlcnNhdGlvbil7XG4gICAgICAgICAgIGNvbnZlcnNhdGlvbi5zZXRMYXN0TWVzc2FnZShpdGVtLm1lc3NhZ2UpXG4gICAgICAgICAgIHRoaXMudXBkYXRlQ29udmVyc2F0aW9uT2JqZWN0KGNvbnZlcnNhdGlvbilcbiAgICAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmNjR3JvdXBNZW1iZXJCYW5uZWQgPSBDb21ldENoYXRHcm91cEV2ZW50cy5jY0dyb3VwTWVtYmVyQmFubmVkLnN1YnNjcmliZSgoaXRlbTpJR3JvdXBNZW1iZXJLaWNrZWRCYW5uZWQpPT57XG4gICAgICBsZXQgY29udmVyc2F0aW9uID0gdGhpcy5nZXRDb252ZXJzYXRpb25Gcm9tR3JvdXAoaXRlbS5raWNrZWRGcm9tISlcbiAgICAgIGlmKGNvbnZlcnNhdGlvbil7XG4gICAgICAgIGNvbnZlcnNhdGlvbi5zZXRMYXN0TWVzc2FnZShpdGVtLm1lc3NhZ2UpXG4gICAgICAgIHRoaXMudXBkYXRlQ29udmVyc2F0aW9uT2JqZWN0KGNvbnZlcnNhdGlvbilcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmNjR3JvdXBEZWxldGVkID0gQ29tZXRDaGF0R3JvdXBFdmVudHMuY2NHcm91cERlbGV0ZWQuc3Vic2NyaWJlKChpdGVtOkNvbWV0Q2hhdC5Hcm91cCk9PntcbiAgICAgIGxldCBjb252ZXJzYXRpb246Q29tZXRDaGF0LkNvbnZlcnNhdGlvbiB8IG51bGwgPSB0aGlzLmdldENvbnZlcnNhdGlvbkZyb21Hcm91cChpdGVtKVxuICAgICAgaWYoY29udmVyc2F0aW9uKXtcbiAgICAgdGhpcy5yZW1vdmVDb252ZXJzYXRpb24oY29udmVyc2F0aW9uKVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuY2NHcm91cExlZnQgPSBDb21ldENoYXRHcm91cEV2ZW50cy5jY0dyb3VwTGVmdC5zdWJzY3JpYmUoKGl0ZW06SUdyb3VwTGVmdCk9PntcblxuICAgICAgdGhpcy51cGRhdGVDb252ZXJzYXRpb24oaXRlbS5tZXNzYWdlISlcbiAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9KTtcbiAgICB0aGlzLmNjVXNlckJsb2NrZWQgPSBDb21ldENoYXRVc2VyRXZlbnRzLmNjVXNlckJsb2NrZWQuc3Vic2NyaWJlKChpdGVtOkNvbWV0Q2hhdC5Vc2VyKT0+e1xuICAgICAgbGV0IGNvbnZlcnNhdGlvbjpDb21ldENoYXQuQ29udmVyc2F0aW9uIHwgbnVsbCA9IHRoaXMuZ2V0Q29udmVyc2F0aW9uRnJvbVVzZXIoaXRlbSlcbiAgICAgIGlmKGNvbnZlcnNhdGlvbil7XG4gICAgICAgIHRoaXMucmVtb3ZlQ29udmVyc2F0aW9uKGNvbnZlcnNhdGlvbilcbiAgICAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmNjTWVzc2FnZUVkaXQgPSBDb21ldENoYXRNZXNzYWdlRXZlbnRzLmNjTWVzc2FnZUVkaXRlZC5zdWJzY3JpYmUoKG9iamVjdDogSU1lc3NhZ2VzKSA9PiB7XG4gICAgICBsZXQgbWVzc2FnZTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlID0gb2JqZWN0Lm1lc3NhZ2UhXG4gICAgICBpZihvYmplY3Quc3RhdHVzID09IE1lc3NhZ2VTdGF0dXMuc3VjY2Vzcyl7XG4gICAgICAgIHRoaXMudXBkYXRlRWRpdGVkTWVzc2FnZShtZXNzYWdlIGFzIENvbWV0Q2hhdC5UZXh0TWVzc2FnZSlcbiAgICAgIH1cbiAgIH0pXG4gICB0aGlzLmNjTWVzc2FnZVNlbnQgPSBDb21ldENoYXRNZXNzYWdlRXZlbnRzLmNjTWVzc2FnZVNlbnQuc3Vic2NyaWJlKChvYmo6IElNZXNzYWdlcykgPT4ge1xuICAgICBsZXQgbWVzc2FnZTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlID0gb2JqLm1lc3NhZ2UhXG4gICAgIGlmKG9iai5zdGF0dXMgPT0gTWVzc2FnZVN0YXR1cy5zdWNjZXNzKXtcbiAgICAgICB0aGlzLnVwZGF0ZUNvbnZlcnNhdGlvbihtZXNzYWdlKVxuICAgICB9XG4gICB9KVxuICAgdGhpcy5jY01lc3NhZ2VEZWxldGUgPSBDb21ldENoYXRNZXNzYWdlRXZlbnRzLmNjTWVzc2FnZURlbGV0ZWQuc3Vic2NyaWJlKChtZXNzYWdlT2JqZWN0OiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpID0+IHtcbiAgICAgICB0aGlzLnVwZGF0ZUNvbnZlcnNhdGlvbihtZXNzYWdlT2JqZWN0KVxuICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgIH0pXG4gICB0aGlzLmNjTWVzc2FnZVJlYWQgPSBDb21ldENoYXRNZXNzYWdlRXZlbnRzLmNjTWVzc2FnZVJlYWQuc3Vic2NyaWJlKChtZXNzYWdlT2JqZWN0OiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpID0+IHtcbiAgQ29tZXRDaGF0LkNvbWV0Q2hhdEhlbHBlci5nZXRDb252ZXJzYXRpb25Gcm9tTWVzc2FnZShtZXNzYWdlT2JqZWN0KS50aGVuKChjb252ZXJzYXRpb246Q29tZXRDaGF0LkNvbnZlcnNhdGlvbik9PntcbiAgICBpZihjb252ZXJzYXRpb24gJiYgIHRoaXMuYWN0aXZlQ29udmVyc2F0aW9uICYmIGNvbnZlcnNhdGlvbj8uZ2V0Q29udmVyc2F0aW9uSWQoKSA9PSB0aGlzLmFjdGl2ZUNvbnZlcnNhdGlvbj8uZ2V0Q29udmVyc2F0aW9uSWQoKSl7XG4gICAgICB0aGlzLnVwZGF0ZUVkaXRlZE1lc3NhZ2UobWVzc2FnZU9iamVjdCBhcyBDb21ldENoYXQuVGV4dE1lc3NhZ2UpXG4gICAgICB0aGlzLnJlc2V0VW5yZWFkQ291bnQoKTtcbiAgICB9XG4gIH0pXG4gIH0pXG4gIHRoaXMuY2NDYWxsRW5kZWQgPSBDb21ldENoYXRDYWxsRXZlbnRzLmNjQ2FsbEVuZGVkLnN1YnNjcmliZSgoY2FsbDpDb21ldENoYXQuQ2FsbCk9PntcbiAgICBpZihjYWxsKXtcbiAgICAgIHRoaXMudXBkYXRlQ29udmVyc2F0aW9uKGNhbGwpXG4gICAgfVxuICB9KVxuICB0aGlzLmNjQ2FsbFJlamVjdGVkID0gQ29tZXRDaGF0Q2FsbEV2ZW50cy5jY0NhbGxSZWplY3RlZC5zdWJzY3JpYmUoKGNhbGw6IENvbWV0Q2hhdC5DYWxsKSA9PiB7XG4gICAgdGhpcy51cGRhdGVDb252ZXJzYXRpb24oY2FsbClcbiAgfSlcbiAgdGhpcy5jY091dGdvaW5nQ2FsbCA9IENvbWV0Q2hhdENhbGxFdmVudHMuY2NPdXRnb2luZ0NhbGwuc3Vic2NyaWJlKChjYWxsOiBDb21ldENoYXQuQ2FsbCkgPT4ge1xuICAgIHRoaXMudXBkYXRlQ29udmVyc2F0aW9uKGNhbGwpXG4gIH0pXG4gIHRoaXMuY2NDYWxsQWNjZXB0ZWQgPSBDb21ldENoYXRDYWxsRXZlbnRzLmNjQ2FsbEFjY2VwdGVkLnN1YnNjcmliZSgoY2FsbDogQ29tZXRDaGF0LkNhbGwpID0+IHtcbiAgICB0aGlzLnVwZGF0ZUNvbnZlcnNhdGlvbihjYWxsKVxuICB9KVxuICB9XG4gIHVuc3Vic2NyaWJlVG9FdmVudHMoKXtcbiAgICB0aGlzLmNjR3JvdXBNZW1iZXJBZGRlZD8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmNjR3JvdXBNZW1iZXJLaWNrZWQ/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jY0dyb3VwTWVtYmVyQmFubmVkPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2NNZXNzYWdlRWRpdD8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmNjTWVzc2FnZVNlbnQ/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jY01lc3NhZ2VFZGl0ZWQ/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jY01lc3NhZ2VEZWxldGU/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jY0dyb3VwRGVsZXRlZD8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmNjR3JvdXBMZWZ0Py51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2NVc2VyQmxvY2tlZD8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmNjTWVzc2FnZVJlYWQ/LnVuc3Vic2NyaWJlKCk7XG4gIH1cbiAgZ2V0Q29udmVyc2F0aW9uRnJvbVVzZXIodXNlcjpDb21ldENoYXQuVXNlcil7XG4gICAgbGV0IGluZGV4ID0gdGhpcy5jb252ZXJzYXRpb25MaXN0LmZpbmRJbmRleCgoZWxlbWVudDogQ29tZXRDaGF0LkNvbnZlcnNhdGlvbikgPT4gZWxlbWVudC5nZXRDb252ZXJzYXRpb25UeXBlKCkgPT0gQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuTWVzc2FnZVJlY2VpdmVyVHlwZS51c2VyICYmICAoZWxlbWVudC5nZXRDb252ZXJzYXRpb25XaXRoKCkgYXMgQ29tZXRDaGF0LlVzZXIpLmdldFVpZCgpID09IHVzZXIuZ2V0VWlkKCkpO1xuICAgIGlmKGluZGV4ID49IDApe1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVyc2F0aW9uTGlzdFtpbmRleF1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICBnZXRDb252ZXJzYXRpb25Gcm9tR3JvdXAoZ3JvdXA6Q29tZXRDaGF0Lkdyb3VwKTpDb21ldENoYXQuQ29udmVyc2F0aW9uIHwgbnVsbHtcbiAgbGV0IGluZGV4ID0gdGhpcy5jb252ZXJzYXRpb25MaXN0LmZpbmRJbmRleCgoZWxlbWVudDogQ29tZXRDaGF0LkNvbnZlcnNhdGlvbikgPT4gZWxlbWVudC5nZXRDb252ZXJzYXRpb25UeXBlKCkgPT0gQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuTWVzc2FnZVJlY2VpdmVyVHlwZS5ncm91cCAmJiAgKGVsZW1lbnQuZ2V0Q29udmVyc2F0aW9uV2l0aCgpIGFzIENvbWV0Q2hhdC5Hcm91cCkuZ2V0R3VpZCgpID09IGdyb3VwLmdldEd1aWQoKSk7XG4gICAgaWYoaW5kZXggPj0gMCl7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJzYXRpb25MaXN0W2luZGV4XVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG4gIG5nT25DaGFuZ2VzKGNoYW5nZTogU2ltcGxlQ2hhbmdlcykge1xuICAgIHRyeSB7XG4gICAgICBpZihjaGFuZ2VbXCJhY3RpdmVDb252ZXJzYXRpb25cIl0pe1xuICAgICAgICB0aGlzLnJlc2V0VW5yZWFkQ291bnQoKVxuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBXaGVuIHVzZXIgc2VuZHMgbWVzc2FnZSBjb252ZXJzYXRpb25MaXN0IGlzIHVwZGF0ZWQgd2l0aCBsYXRlc3QgbWVzc2FnZVxuICAgICAgICovXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgICAgaWYodGhpcy5vbkVycm9yKXtcbiAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVUb0V2ZW50cygpXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgICAgaWYodGhpcy5vbkVycm9yKXtcbiAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yKVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgfVxuICAvLyBnZXR0aW5nIGRlZmF1bHQgY29udmVyc2F0aW9uIG9wdGlvbiBhbmQgYWRkaW5nIGNhbGxiYWNrIGluIGl0XG4gIHNldENvbnZlcnNhdGlvbk9wdGlvbnMoKSB7XG4gaWYodGhpcy5vcHRpb25zKXtcbiByZXR1cm47XG4gfVxuIHRoaXMuY29udmVyc2F0aW9uT3B0aW9ucyA9IENvbnZlcnNhdGlvblV0aWxzLmdldERlZmF1bHRPcHRpb25zKCk7XG4gdGhpcy5jb252ZXJzYXRpb25PcHRpb25zLmZvckVhY2goKGVsZW1lbnQ6IENvbWV0Q2hhdE9wdGlvbikgPT4ge1xuICAgaWYgKCFlbGVtZW50Lm9uQ2xpY2sgJiYgZWxlbWVudC5pZCA9PSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5Db252ZXJzYXRpb25PcHRpb25zLmRlbGV0ZSkge1xuICAgICBlbGVtZW50Lm9uQ2xpY2sgPSB0aGlzLmRlbGV0ZUNvbnZlcnNhdGlvbk9uQ2xpY2tcbiAgIH1cbiB9KTtcbiByZXR1cm47XG4gIH1cbiAgLy8gcmVzZXQgdW5yZWFkIGNvdW50XG4gIG9uQ2xpY2soY29udmVyc2F0aW9uOiBDb21ldENoYXQuQ29udmVyc2F0aW9uKSB7XG4gICBpZih0aGlzLm9uSXRlbUNsaWNrKXtcbiAgICAgdGhpcy5vbkl0ZW1DbGljayhjb252ZXJzYXRpb24pXG4gICB9XG4gIH1cbiAgLy8gc2V0IHVucmVhZCBjb3VudFxuICByZXNldFVucmVhZENvdW50KCkge1xuICAgIGlmICh0aGlzLmFjdGl2ZUNvbnZlcnNhdGlvbikge1xuICAgICAgY29uc3QgY29udmVyc2F0aW9ubGlzdDogQ29tZXRDaGF0LkNvbnZlcnNhdGlvbltdID0gWy4uLnRoaXMuY29udmVyc2F0aW9uTGlzdF07XG4gICAgICAvL0dldHMgdGhlIGluZGV4IG9mIHVzZXIgd2hpY2ggY29tZXMgb2ZmbGluZS9vbmxpbmVcbiAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbktleSA9IGNvbnZlcnNhdGlvbmxpc3QuZmluZEluZGV4KFxuICAgICAgICAoY29udmVyc2F0aW9uT2JqOiBDb21ldENoYXQuQ29udmVyc2F0aW9uKSA9PlxuICAgICAgICAgIGNvbnZlcnNhdGlvbk9iaj8uZ2V0Q29udmVyc2F0aW9uSWQoKSA9PT0gdGhpcy5hY3RpdmVDb252ZXJzYXRpb24/LmdldENvbnZlcnNhdGlvbklkKClcbiAgICAgICk7XG4gICAgICBpZiAoY29udmVyc2F0aW9uS2V5ID4gLTEpIHtcbiAgICAgICAgbGV0IGNvbnZlcnNhdGlvbk9iajogQ29tZXRDaGF0LkNvbnZlcnNhdGlvbiA9IGNvbnZlcnNhdGlvbmxpc3RbY29udmVyc2F0aW9uS2V5XTtcbiAgICAgICAgbGV0IG5ld0NvbnZlcnNhdGlvbk9iajogQ29tZXRDaGF0LkNvbnZlcnNhdGlvbiA9IGNvbnZlcnNhdGlvbk9ialxuICAgICAgICBuZXdDb252ZXJzYXRpb25PYmouc2V0VW5yZWFkTWVzc2FnZUNvdW50KDApO1xuICAgICAgICAobmV3Q29udmVyc2F0aW9uT2JqLmdldExhc3RNZXNzYWdlKCkgYXMgQ29tZXRDaGF0LlRleHRNZXNzYWdlKT8uc2V0TXVpZCh0aGlzLmdldFVpbngoKSlcbiAgICAgICAgY29udmVyc2F0aW9ubGlzdC5zcGxpY2UoY29udmVyc2F0aW9uS2V5LCAxLCBuZXdDb252ZXJzYXRpb25PYmopO1xuICAgICAgICB0aGlzLmNvbnZlcnNhdGlvbkxpc3QgPSBbLi4uY29udmVyc2F0aW9ubGlzdF07XG4gICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBzZXRzIHByb3BlcnR5IGZyb20gdGhlbWUgdG8gc3R5bGUgb2JqZWN0XG4gIHNldFRoZW1lU3R5bGUoKSB7XG4gICAgdGhpcy5zZXRBdmF0YXJTdHlsZSgpO1xuICAgIHRoaXMuc2V0QmFkZ2VTdHlsZSgpO1xuICAgIHRoaXMuc2V0Q29uZmlybURpYWxvZ1N0eWxlKCk7XG4gICAgdGhpcy5zZXRDb252ZXJzYXRpb25zU3R5bGUoKTtcbiAgICB0aGlzLnNldExpc3RJdGVtU3R5bGUoKTtcbiAgICB0aGlzLnNldERhdGVTdHlsZSgpO1xuICAgIHRoaXMuc2V0U3RhdHVzU3R5bGUoKTtcbiAgICB0aGlzLnNldFJlY2VpcHRTdHlsZSgpO1xuICAgIHRoaXMuc3RhdHVzQ29sb3IucHJpdmF0ZSA9dGhpcy5jb252ZXJzYXRpb25zU3R5bGU/LnByaXZhdGVHcm91cEljb25CYWNrZ3JvdW5kIDtcbiAgICB0aGlzLnN0YXR1c0NvbG9yLm9ubGluZSA9dGhpcy5jb252ZXJzYXRpb25zU3R5bGU/Lm9ubGluZVN0YXR1c0NvbG9yIDtcbiAgICB0aGlzLnN0YXR1c0NvbG9yLnBhc3N3b3JkID10aGlzLmNvbnZlcnNhdGlvbnNTdHlsZT8ucGFzc3dvcmRHcm91cEljb25CYWNrZ3JvdW5kO1xuICAgIHRoaXMubGlzdFN0eWxlID17XG4gICAgICB0aXRsZVRleHRGb250IDogdGhpcy5jb252ZXJzYXRpb25zU3R5bGUudGl0bGVUZXh0Rm9udCxcbiAgICAgIHRpdGxlVGV4dENvbG9yIDogdGhpcy5jb252ZXJzYXRpb25zU3R5bGUudGl0bGVUZXh0Q29sb3IsXG4gICAgICBlbXB0eVN0YXRlVGV4dEZvbnQgOiB0aGlzLmNvbnZlcnNhdGlvbnNTdHlsZS5lbXB0eVN0YXRlVGV4dEZvbnQsXG4gICAgICBlbXB0eVN0YXRlVGV4dENvbG9yIDogdGhpcy5jb252ZXJzYXRpb25zU3R5bGUuZW1wdHlTdGF0ZVRleHRDb2xvcixcbiAgICAgIGVycm9yU3RhdGVUZXh0Rm9udCA6IHRoaXMuY29udmVyc2F0aW9uc1N0eWxlLmVycm9yU3RhdGVUZXh0Rm9udCxcbiAgICAgIGVycm9yU3RhdGVUZXh0Q29sb3IgOiB0aGlzLmNvbnZlcnNhdGlvbnNTdHlsZS5lcnJvclN0YXRlVGV4dENvbG9yLFxuICAgICAgbG9hZGluZ0ljb25UaW50IDogdGhpcy5jb252ZXJzYXRpb25zU3R5bGUubG9hZGluZ0ljb25UaW50LFxuICAgICAgc2VwYXJhdG9yQ29sb3IgOiB0aGlzLmNvbnZlcnNhdGlvbnNTdHlsZS5zZXBhcmF0b3JDb2xvcixcbiAgICB9XG4gICAgdGhpcy5pY29uU3R5bGUuaWNvblRpbnQgPSAgICB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDQwMCgpO1xuICB9XG4gIHNldExpc3RJdGVtU3R5bGUoKXtcbiAgICBsZXQgZGVmYXVsdFN0eWxlOkxpc3RJdGVtU3R5bGUgPSBuZXcgTGlzdEl0ZW1TdHlsZSh7XG4gICAgICBoZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgYmFja2dyb3VuZDogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRCYWNrZ3JvdW5kKCksXG4gICAgICBhY3RpdmVCYWNrZ3JvdW5kOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDUwKCksXG4gICAgICBib3JkZXJSYWRpdXM6IFwiMFwiLFxuICAgICAgdGl0bGVGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkudGl0bGUyKSxcbiAgICAgIHRpdGxlQ29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50KCksXG4gICAgICBib3JkZXI6IFwibm9uZVwiLFxuICAgICAgc2VwYXJhdG9yQ29sb3I6dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQyMDAoKSxcbiAgICAgIGhvdmVyQmFja2dyb3VuZDp0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDUwKClcbiAgICB9KVxuICAgIHRoaXMubGlzdEl0ZW1TdHlsZSA9IHsuLi5kZWZhdWx0U3R5bGUsLi4udGhpcy5saXN0SXRlbVN0eWxlfVxuICB9XG4gIHNldEF2YXRhclN0eWxlKCl7XG4gICAgbGV0IGRlZmF1bHRTdHlsZTpBdmF0YXJTdHlsZSA9IG5ldyBBdmF0YXJTdHlsZSh7XG4gICAgICBib3JkZXJSYWRpdXM6IFwiMjRweFwiLFxuICAgICAgd2lkdGg6IFwiMzZweFwiLFxuICAgICAgaGVpZ2h0OiBcIjM2cHhcIixcbiAgICAgIGJvcmRlcjogYDFweCBzb2xpZCAke3RoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50MjAwKCl9YCxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ3MDAoKSxcbiAgICAgIG5hbWVUZXh0Q29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50OTAwKCksXG4gICAgICBiYWNrZ3JvdW5kU2l6ZTogXCJjb3ZlclwiLFxuICAgICAgbmFtZVRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkuc3VidGl0bGUxKSxcbiAgICAgIG91dGVyVmlld0JvcmRlcjogXCJcIixcbiAgICAgIG91dGVyVmlld0JvcmRlclNwYWNpbmc6IFwiXCIsXG4gICAgfSlcbiAgICB0aGlzLmF2YXRhclN0eWxlID0gey4uLmRlZmF1bHRTdHlsZSwuLi50aGlzLmF2YXRhclN0eWxlfVxuICB9XG4gIHNldFN0YXR1c1N0eWxlKCl7XG4gICAgbGV0IGRlZmF1bHRTdHlsZTpCYXNlU3R5bGUgPSB7XG4gICAgICAgIGhlaWdodDogXCIxMnB4XCIsXG4gICAgICAgIHdpZHRoOlwiMTJweFwiLFxuICAgICAgICBib3JkZXI6XCJub25lXCIsXG4gICAgICAgIGJvcmRlclJhZGl1czpcIjI0cHhcIixcbiAgICB9XG4gICAgdGhpcy5zdGF0dXNJbmRpY2F0b3JTdHlsZSA9IHsuLi5kZWZhdWx0U3R5bGUsLi4udGhpcy5zdGF0dXNJbmRpY2F0b3JTdHlsZX1cbiAgfVxuICBzZXRDb252ZXJzYXRpb25zU3R5bGUoKXtcbiAgICBsZXQgZGVmYXVsdFN0eWxlOkNvbnZlcnNhdGlvbnNTdHlsZSA9IG5ldyBDb252ZXJzYXRpb25zU3R5bGUoe1xuICAgICAgbGFzdE1lc3NhZ2VUZXh0Rm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnN1YnRpdGxlMiksXG4gICAgICBsYXN0TWVzc2FnZVRleHRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ2MDAoKSxcbiAgICAgIGJhY2tncm91bmQ6dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRCYWNrZ3JvdW5kKCksXG4gICAgICBib3JkZXI6YDFweCBzb2xpZCAke3RoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NTAoKX1gLFxuICAgICAgdGl0bGVUZXh0Rm9udDpmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkudGl0bGUxKSxcbiAgICAgIHRpdGxlVGV4dENvbG9yOnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50KCksXG4gICAgICBlbXB0eVN0YXRlVGV4dEZvbnQ6Zm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRpdGxlMSksXG4gICAgICBlbXB0eVN0YXRlVGV4dENvbG9yOnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG4gICAgICBlcnJvclN0YXRlVGV4dEZvbnQ6Zm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRpdGxlMSksXG4gICAgICBlcnJvclN0YXRlVGV4dENvbG9yOnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG4gICAgICBsb2FkaW5nSWNvblRpbnQ6dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ2MDAoKSxcbiAgICAgIG9ubGluZVN0YXR1c0NvbG9yOnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0U3VjY2VzcygpLFxuICAgICAgc2VwYXJhdG9yQ29sb3I6dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ0MDAoKSxcbiAgICAgIHByaXZhdGVHcm91cEljb25CYWNrZ3JvdW5kOnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0U3VjY2VzcygpLFxuICAgICAgcGFzc3dvcmRHcm91cEljb25CYWNrZ3JvdW5kOlwiUkdCKDI0NywgMTY1LCAwKVwiLFxuICAgICAgdHlwaW5nSW5kaWN0b3JUZXh0Q29sb3I6dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRQcmltYXJ5KCksXG4gICAgICB0eXBpbmdJbmRpY3RvclRleHRGb250OmZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS5zdWJ0aXRsZTIpLFxuICAgICAgdGhyZWFkSW5kaWNhdG9yVGV4dEZvbnQ6Zm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LmNhcHRpb24yKSxcbiAgICAgIHRocmVhZEluZGljYXRvclRleHRDb2xvcjp0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDYwMCgpLFxuICAgIH0pXG4gICAgdGhpcy5jb252ZXJzYXRpb25zU3R5bGUgPSB7Li4uZGVmYXVsdFN0eWxlLC4uLnRoaXMuY29udmVyc2F0aW9uc1N0eWxlfVxuICB9XG4gIHNldERhdGVTdHlsZSgpe1xuICAgIGxldCBkZWZhdWx0U3R5bGU6RGF0ZVN0eWxlID0gbmV3IERhdGVTdHlsZSh7XG4gICAgICB0ZXh0Rm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LmNhcHRpb24yKSxcbiAgICAgIHRleHRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ2MDAoKSxcbiAgICAgIGJhY2tncm91bmQ6XCJ0cmFuc3BhcmVudFwiXG4gICAgfSlcbiAgICB0aGlzLmRhdGVTdHlsZSA9IHsuLi5kZWZhdWx0U3R5bGUsLi4udGhpcy5kYXRlU3R5bGV9XG4gIH1cbiAgc2V0UmVjZWlwdFN0eWxlKCl7XG5cbiAgICBsZXQgZGVmYXVsdFN0eWxlOlJlY2VpcHRTdHlsZSA9IG5ldyBSZWNlaXB0U3R5bGUoe1xud2FpdEljb25UaW50OnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NzAwKCksXG5zZW50SWNvblRpbnQ6dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ2MDAoKSxcbmRlbGl2ZXJlZEljb25UaW50OnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG5yZWFkSWNvblRpbnQ6dGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRQcmltYXJ5KCksXG5lcnJvckljb25UaW50OnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0RXJyb3IoKSxcbiAgICB9KVxuICAgIHRoaXMucmVjZWlwdFN0eWxlID0gey4uLmRlZmF1bHRTdHlsZSwuLi50aGlzLnJlY2VpcHRTdHlsZX1cbiAgfVxuICBzZXRCYWRnZVN0eWxlKCl7XG4gICAgbGV0IGRlZmF1bHRTdHlsZTpCYWRnZVN0eWxlID0gbmV3IEJhZGdlU3R5bGUoe1xuICAgICAgdGV4dEZvbnQ6IGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS5zdWJ0aXRsZTIpLFxuICAgICAgdGV4dENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudChcImRhcmtcIiksXG4gICAgICBiYWNrZ3JvdW5kOnRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0UHJpbWFyeSgpLFxuICAgICAgYm9yZGVyUmFkaXVzOlwiMTZweFwiLFxuICAgICAgd2lkdGg6XCIyNHB4XCIsXG4gICAgfSlcbiAgICB0aGlzLmJhZGdlU3R5bGUgPSB7Li4uZGVmYXVsdFN0eWxlLC4uLnRoaXMuYmFkZ2VTdHlsZX1cbiAgfVxuICBzZXRDb25maXJtRGlhbG9nU3R5bGUoKXtcbiAgICBsZXQgZGVmYXVsdFN0eWxlOkNvbmZpcm1EaWFsb2dTdHlsZSA9IG5ldyBDb25maXJtRGlhbG9nU3R5bGUoe1xuICAgICAgY29uZmlybUJ1dHRvbkJhY2tncm91bmQ6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0RXJyb3IoKSxcbiAgICAgIGNhbmNlbEJ1dHRvbkJhY2tncm91bmQ6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0U2Vjb25kYXJ5KCksXG4gICAgICBjb25maXJtQnV0dG9uVGV4dENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDkwMChcImxpZ2h0XCIpLFxuICAgICAgY29uZmlybUJ1dHRvblRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkudGV4dDIpLFxuICAgICAgY2FuY2VsQnV0dG9uVGV4dENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDkwMChcImRhcmtcIiksXG4gICAgICBjYW5jZWxCdXR0b25UZXh0Rm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRleHQyKSxcbiAgICAgIHRpdGxlRm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRpdGxlMSksXG4gICAgICB0aXRsZUNvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudCgpLFxuICAgICAgbWVzc2FnZVRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkuc3VidGl0bGUyKSxcbiAgICAgIG1lc3NhZ2VUZXh0Q29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NjAwKCksXG4gICAgICBiYWNrZ3JvdW5kOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEJhY2tncm91bmQoKSxcbiAgICAgIGhlaWdodDpcIjEwMCVcIixcbiAgICAgIHdpZHRoOlwiMzUwcHhcIixcbiAgICB9KVxuICAgIHRoaXMuZGVsZXRlQ29udmVyc2F0aW9uRGlhbG9nU3R5bGUgPSB7Li4uZGVmYXVsdFN0eWxlLC4uLnRoaXMuZGVsZXRlQ29udmVyc2F0aW9uRGlhbG9nU3R5bGV9XG4gIH1cbiAgLy8gY2hlY2tpbmcgaWYgdXNlciBoYXMgaGlzIG93biBjb25maWd1cmF0aW9uIGVsc2Ugd2lsbCB1c2UgZGVmYXVsdCBjb25maWd1cmF0aW9uXG4gIC8qKlxuICAgKiBAcGFyYW0gIHtPYmplY3Q9e319IGNvbmZpZ1xuICAgKiBAcGFyYW0gIHtPYmplY3R9IGRlZmF1bHRDb25maWc/XG4gICAqIEByZXR1cm5zIGRlZmF1bHRDb25maWdcbiAgICovXG4gIC8vIGNhbGxpbmcgc3VidGl0bGUgY2FsbGJhY2sgZnJvbSBjb25maWd1cmF0aW9uc1xuICAvKipcbiAgICogQHBhcmFtICB7Q29tZXRDaGF0LkNvbnZlcnNhdGlvbn0gY29udmVyc2F0aW9uXG4gICAqL1xuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgY292ZXJzYXRpb24gYmFzZWQgb24gdGhlIGNvbnZlcnNhdGlvblJlcXVlc3QgY29uZmlnXG4gICAqL1xuICBmZXRjaE5leHRDb252ZXJzYXRpb24oKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnNhdGlvbnNSZXF1ZXN0QnVpbGRlcj8uZmV0Y2hOZXh0KCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYodGhpcy5vbkVycm9yKXtcbiAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICB1cGRhdGVFZGl0ZWRNZXNzYWdlKG1lc3NhZ2U6Q29tZXRDaGF0LlRleHRNZXNzYWdlKXtcbiAgICBsZXQgaW5kZXggPSB0aGlzLmNvbnZlcnNhdGlvbkxpc3QuZmluZEluZGV4KFxuICAgICAgKGNvbnZlcnNhdGlvbk9iajogQ29tZXRDaGF0LkNvbnZlcnNhdGlvbikgPT4gY29udmVyc2F0aW9uT2JqLmdldExhc3RNZXNzYWdlKCkgJiYgKGNvbnZlcnNhdGlvbk9iai5nZXRMYXN0TWVzc2FnZSgpIGFzIENvbWV0Q2hhdC5CYXNlTWVzc2FnZSkuZ2V0SWQoKSA9PSBtZXNzYWdlPy5nZXRJZCgpXG4gICAgKTtcbiAgICBpZihpbmRleCA+PSAwKXtcbiAgICAgIHRoaXMuY29udmVyc2F0aW9uRWRpdGVkRGVsZXRlZChtZXNzYWdlKVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogYXR0YWNoZXMgTGlzdGVuZXJzIGZvciB1c2VyIGFjdGl2aXR5ICwgZ3JvdXAgYWN0aXZpdGllcyBhbmQgY2FsbGluZ1xuICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICovXG4gIC8qKlxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIGF0dGFjaExpc3RlbmVycyhjYWxsYmFjazogYW55KSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlVXNlcnNQcmVzZW5jZSkge1xuICAgICAgICBDb21ldENoYXQuYWRkVXNlckxpc3RlbmVyKFxuICAgICAgICAgIHRoaXMudXNlckxpc3RlbmVySWQsXG4gICAgICAgICAgbmV3IENvbWV0Q2hhdC5Vc2VyTGlzdGVuZXIoe1xuICAgICAgICAgICAgb25Vc2VyT25saW5lOiAob25saW5lVXNlcjogb2JqZWN0KSA9PiB7XG4gICAgICAgICAgICAgIC8qIHdoZW4gc29tZXVzZXIvZnJpZW5kIGNvbWVzIG9ubGluZSwgdXNlciB3aWxsIGJlIHJlY2VpdmVkIGhlcmUgKi9cbiAgICAgICAgICAgICAgY2FsbGJhY2soQ29tZXRDaGF0VUlLaXRDb25zdGFudHMudXNlclN0YXR1c1R5cGUub25saW5lLCBvbmxpbmVVc2VyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvblVzZXJPZmZsaW5lOiAob2ZmbGluZVVzZXI6IG9iamVjdCkgPT4ge1xuICAgICAgICAgICAgICAvKiB3aGVuIHNvbWV1c2VyL2ZyaWVuZCB3ZW50IG9mZmxpbmUsIHVzZXIgd2lsbCBiZSByZWNlaXZlZCBoZXJlICovXG4gICAgICAgICAgICAgIGNhbGxiYWNrKENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLnVzZXJTdGF0dXNUeXBlLm9mZmxpbmUsIG9mZmxpbmVVc2VyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIENvbWV0Q2hhdC5hZGRHcm91cExpc3RlbmVyKFxuICAgICAgICB0aGlzLmdyb3VwTGlzdGVuZXJJZCxcbiAgICAgICAgbmV3IENvbWV0Q2hhdC5Hcm91cExpc3RlbmVyKHtcbiAgICAgICAgICBvbkdyb3VwTWVtYmVyU2NvcGVDaGFuZ2VkOiAoXG4gICAgICAgICAgICBtZXNzYWdlOiBhbnksXG4gICAgICAgICAgICBjaGFuZ2VkVXNlcjogYW55LFxuICAgICAgICAgICAgbmV3U2NvcGU6IGFueSxcbiAgICAgICAgICAgIG9sZFNjb3BlOiBhbnksXG4gICAgICAgICAgICBjaGFuZ2VkR3JvdXA6IGFueVxuICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDb252ZXJzYXRpb24obWVzc2FnZSlcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uR3JvdXBNZW1iZXJLaWNrZWQ6IChtZXNzYWdlOiBhbnksIGtpY2tlZFVzZXI6IGFueSwga2lja2VkQnk6IGFueSwga2lja2VkRnJvbTogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnZlcnNhdGlvbihtZXNzYWdlKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Hcm91cE1lbWJlckJhbm5lZDogKG1lc3NhZ2U6IGFueSwgYmFubmVkVXNlcjogYW55LCBiYW5uZWRCeTogYW55LCBiYW5uZWRGcm9tOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29udmVyc2F0aW9uKG1lc3NhZ2UpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkdyb3VwTWVtYmVyVW5iYW5uZWQ6IChcbiAgICAgICAgICAgIG1lc3NhZ2U6IGFueSxcbiAgICAgICAgICAgIHVuYmFubmVkVXNlcjogYW55LFxuICAgICAgICAgICAgdW5iYW5uZWRCeTogYW55LFxuICAgICAgICAgICAgdW5iYW5uZWRGcm9tOiBhbnlcbiAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgIC8vIHRoaXMudXBkYXRlQ29udmVyc2F0aW9uKG1lc3NhZ2UpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbk1lbWJlckFkZGVkVG9Hcm91cDogKFxuICAgICAgICAgICAgbWVzc2FnZTogYW55LFxuICAgICAgICAgICAgdXNlckFkZGVkOiBhbnksXG4gICAgICAgICAgICB1c2VyQWRkZWRCeTogYW55LFxuICAgICAgICAgICAgdXNlckFkZGVkSW46IGFueVxuICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDb252ZXJzYXRpb24obWVzc2FnZSlcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uR3JvdXBNZW1iZXJMZWZ0OiAobWVzc2FnZTogYW55LCBsZWF2aW5nVXNlcjogYW55LCBncm91cDogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnZlcnNhdGlvbihtZXNzYWdlKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Hcm91cE1lbWJlckpvaW5lZDogKG1lc3NhZ2U6IGFueSwgam9pbmVkVXNlcjogYW55LCBqb2luZWRHcm91cDogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnZlcnNhdGlvbihtZXNzYWdlKVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgQ29tZXRDaGF0LmFkZE1lc3NhZ2VMaXN0ZW5lcihcbiAgICAgICAgdGhpcy5jb252ZXJzYXRpb25MaXN0ZW5lcklkLFxuICAgICAgICBuZXcgQ29tZXRDaGF0Lk1lc3NhZ2VMaXN0ZW5lcih7XG4gICAgICAgICAgb25UZXh0TWVzc2FnZVJlY2VpdmVkOiAodGV4dE1lc3NhZ2U6IENvbWV0Q2hhdC5UZXh0TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2soQ29tZXRDaGF0VUlLaXRDb25zdGFudHMubWVzc2FnZXMuVEVYVF9NRVNTQUdFX1JFQ0VJVkVELCBudWxsLCB0ZXh0TWVzc2FnZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbk1lZGlhTWVzc2FnZVJlY2VpdmVkOiAobWVkaWFNZXNzYWdlOiBDb21ldENoYXQuTWVkaWFNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayhDb21ldENoYXRVSUtpdENvbnN0YW50cy5tZXNzYWdlcy5NRURJQV9NRVNTQUdFX1JFQ0VJVkVELCBudWxsLCBtZWRpYU1lc3NhZ2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25DdXN0b21NZXNzYWdlUmVjZWl2ZWQ6IChjdXN0b21NZXNzYWdlOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soQ29tZXRDaGF0VUlLaXRDb25zdGFudHMubWVzc2FnZXMuQ1VTVE9NX01FU1NBR0VfUkVDRUlWRUQsIG51bGwsIGN1c3RvbU1lc3NhZ2UpO1xuXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbk1lc3NhZ2VzUmVhZDogKG1lc3NhZ2VSZWNlaXB0OiBDb21ldENoYXQuTWVzc2FnZVJlY2VpcHQpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlUmVjZWlwdCkge1xuICAgICAgICAgICAgICB0aGlzLm1hcmtBc1JlYWQobWVzc2FnZVJlY2VpcHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25NZXNzYWdlRGVsZXRlZDogKGRlbGV0ZWRNZXNzYWdlOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLm1lc3NhZ2VzLk1FU1NBR0VfREVMRVRFRCwgbnVsbCwgZGVsZXRlZE1lc3NhZ2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25NZXNzYWdlRWRpdGVkOiAoZWRpdGVkTWVzc2FnZTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICBjYWxsYmFjayhDb21ldENoYXRVSUtpdENvbnN0YW50cy5tZXNzYWdlcy5NRVNTQUdFX0VESVRFRCwgbnVsbCwgZWRpdGVkTWVzc2FnZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbk1lc3NhZ2VzRGVsaXZlcmVkOiAobWVzc2FnZVJlY2VpcHQ6IENvbWV0Q2hhdC5NZXNzYWdlUmVjZWlwdCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVSZWNlaXB0KSB7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlRGVsaXZlcmVkTWVzc2FnZShtZXNzYWdlUmVjZWlwdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvblR5cGluZ1N0YXJ0ZWQ6ICh0eXBpbmdJbmRpY2F0b3I6IENvbWV0Q2hhdC5UeXBpbmdJbmRpY2F0b3IpID0+IHtcbiAgICAgICAgICAgIGlmKCF0aGlzLmRpc2FibGVUeXBpbmcpe1xuICAgICAgICAgICAgICB0aGlzLnR5cGluZ0luZGljYXRvciA9IHR5cGluZ0luZGljYXRvclxuICAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uVHlwaW5nRW5kZWQ6ICh0eXBpbmdJbmRpY2F0b3I6IENvbWV0Q2hhdC5UeXBpbmdJbmRpY2F0b3IpID0+IHtcbiAgICAgICAgICAgIHRoaXMudHlwaW5nSW5kaWNhdG9yID0gbnVsbFxuICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgICAgQ29tZXRDaGF0LmFkZENhbGxMaXN0ZW5lcihcbiAgICAgICAgICB0aGlzLmNhbGxMaXN0ZW5lcklkLFxuICAgICAgICAgIG5ldyBDb21ldENoYXQuQ2FsbExpc3RlbmVyKHtcbiAgICAgICAgICAgIG9uSW5jb21pbmdDYWxsUmVjZWl2ZWQ6IChjYWxsOiBDb21ldENoYXQuQ2FsbCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnZlcnNhdGlvbihjYWxsKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uSW5jb21pbmdDYWxsQ2FuY2VsbGVkOiAoY2FsbDogQ29tZXRDaGF0LkNhbGwpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVDb252ZXJzYXRpb24oY2FsbClcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbk91dGdvaW5nQ2FsbFJlamVjdGVkOiAoY2FsbDogQ29tZXRDaGF0LkNhbGwpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVDb252ZXJzYXRpb24oY2FsbClcblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uT3V0Z29pbmdDYWxsQWNjZXB0ZWQ6IChjYWxsOiBDb21ldENoYXQuQ2FsbCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnZlcnNhdGlvbihjYWxsKVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICBpZih0aGlzLm9uRXJyb3Ipe1xuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZW1vdmVzIGFsbCBsaXN0ZW5lcnNcbiAgICovXG4gIHJlbW92ZUxpc3RlbmVycygpIHtcbiAgICB0cnkge1xuICAgICAgQ29tZXRDaGF0LnJlbW92ZU1lc3NhZ2VMaXN0ZW5lcih0aGlzLmNvbnZlcnNhdGlvbkxpc3RlbmVySWQpO1xuICAgICAgQ29tZXRDaGF0LnJlbW92ZVVzZXJMaXN0ZW5lcih0aGlzLnVzZXJMaXN0ZW5lcklkKTtcbiAgICAgIENvbWV0Q2hhdC5yZW1vdmVHcm91cExpc3RlbmVyKHRoaXMuZ3JvdXBMaXN0ZW5lcklkKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICBpZih0aGlzLm9uRXJyb3Ipe1xuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBGZXRjaGVzIENvbnZlcnNhdGlvbnMgRGV0YWlscyB3aXRoIGFsbCB0aGUgdXNlcnNcbiAgICovXG4gIGdldENvbnZlcnNhdGlvbiA9ICgpID0+IHtcbiAgICBpZigodGhpcy5jb252ZXJzYXRpb25zUmVxdWVzdEJ1aWxkZXIgJiYgIXRoaXMuY29udmVyc2F0aW9uc1JlcXVlc3RCdWlsZGVyPy5wYWdpbmF0aW9uKSB8fCAgKHRoaXMuY29udmVyc2F0aW9uc1JlcXVlc3RCdWlsZGVyLnBhZ2luYXRpb24uY3VycmVudF9wYWdlID09IDAgfHwgdGhpcy5jb252ZXJzYXRpb25zUmVxdWVzdEJ1aWxkZXIucGFnaW5hdGlvbi5jdXJyZW50X3BhZ2UgIT0gIHRoaXMuY29udmVyc2F0aW9uc1JlcXVlc3RCdWlsZGVyLnBhZ2luYXRpb24udG90YWxfcGFnZXMpKXtcbiAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZXMubG9hZGluZ1xuICAgICAgdHJ5IHtcbiAgICAgICAgQ29tZXRDaGF0LmdldExvZ2dlZGluVXNlcigpXG4gICAgICAgICAgLnRoZW4oKHVzZXI6IENvbWV0Q2hhdC5Vc2VyIHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2dnZWRJblVzZXIgPSB1c2VyO1xuICAgICAgICAgICAgdGhpcy5mZXRjaE5leHRDb252ZXJzYXRpb24oKVxuICAgICAgICAgICAgICAudGhlbigoY29udmVyc2F0aW9uTGlzdDogQ29tZXRDaGF0LkNvbnZlcnNhdGlvbltdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29udmVyc2F0aW9uTGlzdC5mb3JFYWNoKChjb252ZXJzYXRpb246IENvbWV0Q2hhdC5Db252ZXJzYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVDb252ZXJzYXRpb24gJiYgdGhpcy5hY3RpdmVDb252ZXJzYXRpb24gIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVDb252ZXJzYXRpb24uZ2V0Q29udmVyc2F0aW9uVHlwZSgpID09PSBjb252ZXJzYXRpb24uZ2V0Q29udmVyc2F0aW9uVHlwZSgpXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlQ29udmVyc2F0aW9uLmdldENvbnZlcnNhdGlvbklkKCkgPT0gY29udmVyc2F0aW9uLmdldENvbnZlcnNhdGlvbklkKClcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uLnNldFVucmVhZE1lc3NhZ2VDb3VudCgwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuY29udmVyc2F0aW9uTGlzdCA9IFtcbiAgICAgICAgICAgICAgICAgIC4uLnRoaXMuY29udmVyc2F0aW9uTGlzdCxcbiAgICAgICAgICAgICAgICAgIC4uLmNvbnZlcnNhdGlvbkxpc3QsXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBpZiAoKGNvbnZlcnNhdGlvbkxpc3QubGVuZ3RoIDw9IDAgJiYgdGhpcy5jb252ZXJzYXRpb25MaXN0Py5sZW5ndGggPD0gMCkgfHwgKGNvbnZlcnNhdGlvbkxpc3QubGVuZ3RoID09PSAwICYmIHRoaXMuY29udmVyc2F0aW9uTGlzdD8ubGVuZ3RoIDw9IDApKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnN0YXRlICE9IFN0YXRlcy5lbXB0eSl7XG4gICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGVzLmVtcHR5XG4gICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmLmRldGFjaCgpOyAvLyBEZXRhY2ggdGhlIGNoYW5nZSBkZXRlY3RvclxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5zdGF0ZSAhPSBTdGF0ZXMubG9hZGVkKXtcbiAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZXMubG9hZGVkXG4gICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmLmRldGFjaCgpOyAvLyBEZXRhY2ggdGhlIGNoYW5nZSBkZXRlY3RvclxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFN0YXRlcy5lcnJvclxuICAgICAgICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZXMuZXJyb3JcbiAgICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgaWYodGhpcy5vbkVycm9yKXtcbiAgICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZXtcbiAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZXMubG9hZGVkO1xuICAgIH1cbiAgfVxuICBpc1JlY2VpcHREaXNhYmxlKGNvbnZlcnNhdGlvbjpDb21ldENoYXQuQ29udmVyc2F0aW9uKXtcbiAgICBsZXQgaXRlbTphbnkgPSBjb252ZXJzYXRpb24uZ2V0Q29udmVyc2F0aW9uV2l0aCgpXG4gICAgbGV0IG1lc3NhZ2U6Q29tZXRDaGF0LkJhc2VNZXNzYWdlID0gY29udmVyc2F0aW9uLmdldExhc3RNZXNzYWdlKClcbiAgICBpZighdGhpcy5kaXNhYmxlUmVjZWlwdCAmJiBtZXNzYWdlICYmIG1lc3NhZ2U/LmdldENhdGVnb3J5KCkgIT0gQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuTWVzc2FnZUNhdGVnb3J5LmFjdGlvbiAmJiBtZXNzYWdlPy5nZXRDYXRlZ29yeSgpICE9IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VDYXRlZ29yeS5jYWxsXG4gICAgJiYgKCF0aGlzLnR5cGluZ0luZGljYXRvciB8fCAoaXRlbT8udWlkICE9IHRoaXMudHlwaW5nSW5kaWNhdG9yLmdldFJlY2VpdmVySWQoKSAmJiBpdGVtPy5ndWlkICE9IHRoaXMudHlwaW5nSW5kaWNhdG9yLmdldFJlY2VpdmVySWQoKSkpXG4gICAgJiYgbWVzc2FnZS5nZXRTZW5kZXIoKT8uZ2V0VWlkKCkgPT0gdGhpcy5sb2dnZWRJblVzZXI/LmdldFVpZCgpXG4gICApXG4gICAge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgZWxzZXtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgY29udmVyc2F0aW9uIGxpc3QncyBsYXN0IG1lc3NhZ2UgLCBiYWRnZUNvdW50ICwgdXNlciBwcmVzZW5jZSBiYXNlZCBvbiBhY3Rpdml0aWVzIHByb3BhZ2F0ZWQgYnkgbGlzdGVuZXJzXG4gICAqL1xuICBjb252ZXJzYXRpb25VcGRhdGVkID0gKFxuICAgIGtleTogYW55LFxuICAgIGl0ZW06IENvbWV0Q2hhdC5Vc2VyIHwgQ29tZXRDaGF0Lkdyb3VwIHwgbnVsbCA9IG51bGwsXG4gICAgbWVzc2FnZTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlLFxuICAgIG9wdGlvbnMgPSBudWxsXG4gICkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLnVzZXJTdGF0dXNUeXBlLm9ubGluZTpcbiAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy51c2VyU3RhdHVzVHlwZS5vbmxpbmU6IHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVVzZXIoaXRlbSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5tZXNzYWdlcy5NRVNTQUdFX1JFQUQ6IHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnZlcnNhdGlvbihtZXNzYWdlLCBmYWxzZSlcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLm1lc3NhZ2VzLk1FU1NBR0VfREVMSVZFUkVEOiB7XG4gICAgICAgICAgdGhpcy51cGRhdGVDb252ZXJzYXRpb24obWVzc2FnZSwgZmFsc2UpXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5tZXNzYWdlcy5URVhUX01FU1NBR0VfUkVDRUlWRUQ6XG4gICAgICAgIGNhc2UgQ29tZXRDaGF0VUlLaXRDb25zdGFudHMubWVzc2FnZXMuTUVESUFfTUVTU0FHRV9SRUNFSVZFRDpcbiAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5tZXNzYWdlcy5DVVNUT01fTUVTU0FHRV9SRUNFSVZFRDpcbiAgICAgICAgICBpZighdGhpcy5kaXNhYmxlUmVjZWlwdCl7XG4gICAgICAgICAgICB0aGlzLm1hcmtNZXNzYWdlQXNEZWxpdmVyZWQobWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudXBkYXRlQ29udmVyc2F0aW9uKG1lc3NhZ2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLmdyb3VwTWVtYmVyQWN0aW9uLkFEREVEOlxuICAgICAgICBjYXNlIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLmdyb3VwTWVtYmVyQWN0aW9uLkJBTk5FRDpcbiAgICAgICAgY2FzZSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5ncm91cE1lbWJlckFjdGlvbi5KT0lORUQ6XG4gICAgICAgIGNhc2UgQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuZ3JvdXBNZW1iZXJBY3Rpb24uS0lDS0VEOlxuICAgICAgICBjYXNlIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLmdyb3VwTWVtYmVyQWN0aW9uLkxFRlQ6XG4gICAgICAgIGNhc2UgQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuZ3JvdXBNZW1iZXJBY3Rpb24uVU5CQU5ORUQ6XG4gICAgICAgIGNhc2UgQ29tZXRDaGF0VUlLaXRDb25zdGFudHMuZ3JvdXBNZW1iZXJBY3Rpb24uU0NPUEVfQ0hBTkdFOlxuICAgICAgICAgIHRoaXMudXBkYXRlQ29udmVyc2F0aW9uKG1lc3NhZ2UpXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgQ29tZXRDaGF0VUlLaXRDb25zdGFudHMubWVzc2FnZXMuTUVTU0FHRV9FRElURUQ6XG4gICAgICAgIGNhc2UgQ29tZXRDaGF0VUlLaXRDb25zdGFudHMubWVzc2FnZXMuTUVTU0FHRV9ERUxFVEVEOlxuICAgICAgICAgIHRoaXMuY29udmVyc2F0aW9uRWRpdGVkRGVsZXRlZChtZXNzYWdlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICBpZih0aGlzLm9uRXJyb3Ipe1xuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpXG4gICAgICB9XG4gICAgfVxuICB9O1xuICAvKipcbiAgICogQHBhcmFtICB7Q29tZXRDaGF0LkJhc2VNZXNzYWdlfSBtZXNzYWdlXG4gICAqL1xuICBtYXJrTWVzc2FnZUFzRGVsaXZlcmVkID0gKG1lc3NhZ2U6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSkgPT4ge1xuICAgIC8vaWYgY2hhdCB3aW5kb3cgaXMgbm90IG9wZW4sIG1hcmsgbWVzc2FnZSBhcyBkZWxpdmVyZWRcbiAgICBpZiAodGhpcy5hY3RpdmVDb252ZXJzYXRpb24/LmdldENvbnZlcnNhdGlvblR5cGUoKSA9PSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlUmVjZWl2ZXJUeXBlLnVzZXIpIHtcbiAgICAgIGlmICgoIXRoaXMuYWN0aXZlQ29udmVyc2F0aW9uIHx8ICh0aGlzLmFjdGl2ZUNvbnZlcnNhdGlvbj8uZ2V0Q29udmVyc2F0aW9uV2l0aCgpIGFzIENvbWV0Q2hhdC5Vc2VyKT8uZ2V0VWlkKCkgIT09IG1lc3NhZ2U/LmdldFNlbmRlcigpPy5nZXRVaWQoKSlcbiAgICAgICAgJiYgIW1lc3NhZ2UuaGFzT3duUHJvcGVydHkoXCJkZWxpdmVyZWRBdFwiKSkge1xuICAgICAgICBDb21ldENoYXQubWFya0FzRGVsaXZlcmVkKG1lc3NhZ2UpXG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaWYgKCghdGhpcy5hY3RpdmVDb252ZXJzYXRpb24gfHwgKHRoaXMuYWN0aXZlQ29udmVyc2F0aW9uPy5nZXRDb252ZXJzYXRpb25XaXRoKCkgYXMgQ29tZXRDaGF0Lkdyb3VwKT8uZ2V0R3VpZCgpICE9PSBtZXNzYWdlPy5nZXRSZWNlaXZlcklkKCkpXG4gICAgICAgICYmICFtZXNzYWdlLmhhc093blByb3BlcnR5KFwiZGVsaXZlcmVkQXRcIikpIHtcbiAgICAgICAgQ29tZXRDaGF0Lm1hcmtBc0RlbGl2ZXJlZChtZXNzYWdlKVxuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIEBwYXJhbSAge0NvbWV0Q2hhdC5CYXNlTWVzc2FnZX0gcmVhZE1lc3NhZ2VcbiAgICovXG4gIGdldFVpbnggPSAoKSA9PiB7XG4gICAgcmV0dXJuIFN0cmluZyhNYXRoLnJvdW5kKCtuZXcgRGF0ZSgpIC8gMTAwMCkpXG4gIH1cbiAgbWFya0FzUmVhZChyZWFkTWVzc2FnZTogQ29tZXRDaGF0Lk1lc3NhZ2VSZWNlaXB0KSB7XG4gICAgbGV0IGNvbnZlcnNhdGlvbmxpc3Q6IENvbWV0Q2hhdC5Db252ZXJzYXRpb25bXSA9IFsuLi50aGlzLmNvbnZlcnNhdGlvbkxpc3RdXG4gICAgY29uc3QgY29udmVyc2F0aW9uS2V5ID0gY29udmVyc2F0aW9ubGlzdC5maW5kSW5kZXgoXG4gICAgICAoY29udmVyc2F0aW9uT2JqOiBDb21ldENoYXQuQ29udmVyc2F0aW9uKSA9PiAoY29udmVyc2F0aW9uT2JqLmdldExhc3RNZXNzYWdlKCkgYXMgQ29tZXRDaGF0LkJhc2VNZXNzYWdlKS5nZXRSZWNlaXZlcklkKCkgPT0gcmVhZE1lc3NhZ2UuZ2V0U2VuZGVyKCkuZ2V0VWlkKClcbiAgICApO1xuICAgIGlmIChjb252ZXJzYXRpb25LZXkgPiAtMSkge1xuICAgICAgbGV0IG5ld0NvbnZlcnNhdGlvbk9iamVjdCE6IENvbWV0Q2hhdC5Db252ZXJzYXRpb247XG4gICAgICBpZiAoIShjb252ZXJzYXRpb25saXN0W2NvbnZlcnNhdGlvbktleV0uZ2V0TGFzdE1lc3NhZ2UoKSBhcyBDb21ldENoYXQuVGV4dE1lc3NhZ2UpLmdldFJlYWRBdCgpKSB7XG4gICAgICAgIG5ld0NvbnZlcnNhdGlvbk9iamVjdCA9IGNvbnZlcnNhdGlvbmxpc3RbY29udmVyc2F0aW9uS2V5XTtcbiAgICAgICAgKG5ld0NvbnZlcnNhdGlvbk9iamVjdC5nZXRMYXN0TWVzc2FnZSgpIGFzIENvbWV0Q2hhdC5UZXh0TWVzc2FnZSkuc2V0UmVhZEF0KHJlYWRNZXNzYWdlLmdldFJlYWRBdCgpKTtcbiAgICAgICAgKG5ld0NvbnZlcnNhdGlvbk9iamVjdC5nZXRMYXN0TWVzc2FnZSgpIGFzIENvbWV0Q2hhdC5UZXh0TWVzc2FnZSkuc2V0TXVpZCh0aGlzLmdldFVpbngoKSk7XG4gICAgICAgIGNvbnZlcnNhdGlvbmxpc3Quc3BsaWNlKGNvbnZlcnNhdGlvbktleSwgMSwgbmV3Q29udmVyc2F0aW9uT2JqZWN0KTtcbiAgICAgICAgdGhpcy5jb252ZXJzYXRpb25MaXN0ID0gWy4uLmNvbnZlcnNhdGlvbmxpc3RdO1xuXG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBVcGRhdGVzIERldGFpbCB3aGVuIHVzZXIgY29tZXMgb25saW5lL29mZmxpbmVcbiAgICogQHBhcmFtXG4gICAqL1xuICAvKipcbiAgICogQHBhcmFtICB7Q29tZXRDaGF0LlVzZXJ8Q29tZXRDaGF0Lkdyb3VwfG51bGx9IHVzZXJcbiAgICovXG4gIHVwZGF0ZVVzZXIodXNlcjogQ29tZXRDaGF0LlVzZXIgfCBDb21ldENoYXQuR3JvdXAgfCBudWxsKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vd2hlbiB1c2VyIHVwZGF0ZXNcbiAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbmxpc3Q6IENvbWV0Q2hhdC5Db252ZXJzYXRpb25bXSA9IFsuLi50aGlzLmNvbnZlcnNhdGlvbkxpc3RdO1xuICAgICAgLy9HZXRzIHRoZSBpbmRleCBvZiB1c2VyIHdoaWNoIGNvbWVzIG9mZmxpbmUvb25saW5lXG4gICAgICBjb25zdCBjb252ZXJzYXRpb25LZXkgPSBjb252ZXJzYXRpb25saXN0LmZpbmRJbmRleChcbiAgICAgICAgKGNvbnZlcnNhdGlvbk9iajogQ29tZXRDaGF0LkNvbnZlcnNhdGlvbikgPT5cbiAgICAgICAgICBjb252ZXJzYXRpb25PYmouZ2V0Q29udmVyc2F0aW9uVHlwZSgpID09PSBDb21ldENoYXRVSUtpdENvbnN0YW50cy5NZXNzYWdlUmVjZWl2ZXJUeXBlLnVzZXIgJiZcbiAgICAgICAgICAoY29udmVyc2F0aW9uT2JqLmdldENvbnZlcnNhdGlvbldpdGgoKSBhcyBDb21ldENoYXQuVXNlcikuZ2V0VWlkKCkgPT09ICh1c2VyIGFzIENvbWV0Q2hhdC5Vc2VyKS5nZXRVaWQoKVxuICAgICAgKTtcbiAgICAgIGlmIChjb252ZXJzYXRpb25LZXkgPiAtMSkge1xuICAgICAgICBsZXQgY29udmVyc2F0aW9uT2JqOiBDb21ldENoYXQuQ29udmVyc2F0aW9uID0gY29udmVyc2F0aW9ubGlzdFtjb252ZXJzYXRpb25LZXldO1xuICAgICAgICBsZXQgY29udmVyc2F0aW9uV2l0aE9iajogQ29tZXRDaGF0LlVzZXIgPSAoY29udmVyc2F0aW9uT2JqLmdldENvbnZlcnNhdGlvbldpdGgoKSBhcyBDb21ldENoYXQuVXNlcilcbiAgICAgICAgY29udmVyc2F0aW9uV2l0aE9iai5zZXRTdGF0dXMoKHVzZXIgYXMgQ29tZXRDaGF0LlVzZXIpLmdldFN0YXR1cygpKVxuICAgICAgICBsZXQgbmV3Q29udmVyc2F0aW9uT2JqOiBDb21ldENoYXQuQ29udmVyc2F0aW9uID0gY29udmVyc2F0aW9uT2JqXG4gICAgICAgIG5ld0NvbnZlcnNhdGlvbk9iai5zZXRDb252ZXJzYXRpb25XaXRoKGNvbnZlcnNhdGlvbldpdGhPYmopO1xuICAgICAgICAobmV3Q29udmVyc2F0aW9uT2JqLmdldExhc3RNZXNzYWdlKCkgYXMgQ29tZXRDaGF0LlRleHRNZXNzYWdlKS5zZXRNdWlkKHRoaXMuZ2V0VWlueCgpKVxuICAgICAgICBjb252ZXJzYXRpb25saXN0LnNwbGljZShjb252ZXJzYXRpb25LZXksIDEsIG5ld0NvbnZlcnNhdGlvbk9iaik7XG4gICAgICAgIHRoaXMuY29udmVyc2F0aW9uTGlzdCA9IGNvbnZlcnNhdGlvbmxpc3Q7XG4gICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgIGlmKHRoaXMub25FcnJvcil7XG4gICAgICAgIHRoaXMub25FcnJvcihlcnJvcilcbiAgICAgIH1cbiAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqXG4gICAqIEdldHMgdGhlIGxhc3QgbWVzc2FnZVxuICAgKiBAcGFyYW0gY29udmVyc2F0aW9uXG4gIC8qKlxuICAgKiBAcGFyYW0gIHtDb21ldENoYXQuQmFzZU1lc3NhZ2V9IG1lc3NhZ2VcbiAgICogQHBhcmFtICB7Q29tZXRDaGF0LkNvbnZlcnNhdGlvbnx7fX0gY29udmVyc2F0aW9uXG4gICAqL1xuICBtYWtlTGFzdE1lc3NhZ2UobWVzc2FnZTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlLCBjb252ZXJzYXRpb246IENvbWV0Q2hhdC5Db252ZXJzYXRpb24gfCB7fSA9IHt9KSB7XG4gICAgY29uc3QgbmV3TWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgcmV0dXJuIG5ld01lc3NhZ2U7XG4gIH1cbiAgLyoqXG4gICAqXG4gICAqIFVwZGF0ZXMgQ29udmVyc2F0aW9ucyBhcyBUZXh0L0N1c3RvbSBNZXNzYWdlcyBhcmUgcmVjZWl2ZWRcbiAgICogQHBhcmFtXG4gICAqXG4gICAqL1xuICAvKipcbiAgICogQHBhcmFtICB7Q29tZXRDaGF0LkJhc2VNZXNzYWdlfSBtZXNzYWdlXG4gICAqIEBwYXJhbSAge2Jvb2xlYW59IG5vdGlmaWNhdGlvblxuICAgKi9cbiAgdXBkYXRlQ29udmVyc2F0aW9uKG1lc3NhZ2U6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSwgbm90aWZpY2F0aW9uOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLm1ha2VDb252ZXJzYXRpb24obWVzc2FnZSlcbiAgICAgICAgLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcblxuICAgICAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbktleSA9IHJlc3BvbnNlLmNvbnZlcnNhdGlvbktleTtcbiAgICAgICAgICBjb25zdCBjb252ZXJzYXRpb25PYmo6IENvbWV0Q2hhdC5Db252ZXJzYXRpb24gPSByZXNwb25zZS5jb252ZXJzYXRpb25PYmo7XG4gICAgICAgICAgY29uc3QgY29udmVyc2F0aW9uTGlzdCA9IHJlc3BvbnNlLmNvbnZlcnNhdGlvbkxpc3Q7XG4gICAgICAgICAgaWYgKGNvbnZlcnNhdGlvbktleSA+IC0xKSB7XG4gICAgICAgICAgICAvLyBpZiBzZW5kZXIgaXMgbm90IGxvZ2dlZCBpbiB1c2VyIHRoZW4gIGluY3JlbWVudCBjb3VudFxuICAgICAgICAgICAgbGV0IHVucmVhZE1lc3NhZ2VDb3VudCA9IHRoaXMubG9nZ2VkSW5Vc2VyPy5nZXRVaWQoKSAhPSBtZXNzYWdlLmdldFNlbmRlcigpLmdldFVpZCgpIHx8IHRoaXMubG9nZ2VkSW5Vc2VyPy5nZXRVaWQoKSA9PSBtZXNzYWdlLmdldFJlY2VpdmVySWQoKSA/IHRoaXMubWFrZVVucmVhZE1lc3NhZ2VDb3VudChcbiAgICAgICAgICAgICAgY29udmVyc2F0aW9uT2JqXG4gICAgICAgICAgICApIDogdGhpcy5tYWtlVW5yZWFkTWVzc2FnZUNvdW50KGNvbnZlcnNhdGlvbk9iaikgLSAxO1xuICAgICAgICAgICAgbGV0IGxhc3RNZXNzYWdlT2JqOiBDb21ldENoYXQuQmFzZU1lc3NhZ2UgPSB0aGlzLm1ha2VMYXN0TWVzc2FnZShtZXNzYWdlLCBjb252ZXJzYXRpb25PYmopO1xuICAgICAgICAgICAgbGV0IG5ld0NvbnZlcnNhdGlvbk9iajogQ29tZXRDaGF0LkNvbnZlcnNhdGlvbiA9IGNvbnZlcnNhdGlvbk9ialxuICAgICAgICAgICAgbmV3Q29udmVyc2F0aW9uT2JqLnNldExhc3RNZXNzYWdlKGxhc3RNZXNzYWdlT2JqKTtcbiAgICAgICAgICAgIG5ld0NvbnZlcnNhdGlvbk9iai5zZXRVbnJlYWRNZXNzYWdlQ291bnQodW5yZWFkTWVzc2FnZUNvdW50KTtcbiAgICAgICAgICAgIChuZXdDb252ZXJzYXRpb25PYmouZ2V0TGFzdE1lc3NhZ2UoKSBhcyBDb21ldENoYXQuVGV4dE1lc3NhZ2UpLnNldE11aWQodGhpcy5nZXRVaW54KCkpXG4gICAgICAgICAgICBjb252ZXJzYXRpb25MaXN0LnNwbGljZShjb252ZXJzYXRpb25LZXksIDEpO1xuICAgICAgICAgICAgY29udmVyc2F0aW9uTGlzdC51bnNoaWZ0KG5ld0NvbnZlcnNhdGlvbk9iaik7XG4gICAgICAgICAgICB0aGlzLmNvbnZlcnNhdGlvbkxpc3QgPSBbLi4uY29udmVyc2F0aW9uTGlzdF07XG4gICAgICAgICAgICBpZiAobm90aWZpY2F0aW9uICYmIHRoaXMubG9nZ2VkSW5Vc2VyPy5nZXRVaWQoKSAhPSBtZXNzYWdlPy5nZXRTZW5kZXIoKT8uZ2V0VWlkKCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5wbGF5QXVkaW8oKTtcbiAgICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsYXN0TWVzc2FnZU9iaiA9IHRoaXMubWFrZUxhc3RNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgICAgICAgY29udmVyc2F0aW9uT2JqLnNldExhc3RNZXNzYWdlKGxhc3RNZXNzYWdlT2JqKTtcbiAgICAgICAgICAgIGNvbnZlcnNhdGlvbk9iai5zZXRVbnJlYWRNZXNzYWdlQ291bnQoMSlcbiAgICAgICAgICAgIGNvbnZlcnNhdGlvbkxpc3QudW5zaGlmdChjb252ZXJzYXRpb25PYmopO1xuICAgICAgICAgICAgdGhpcy5jb252ZXJzYXRpb25MaXN0ID0gY29udmVyc2F0aW9uTGlzdDtcbiAgICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICAgICAgICAgICAgLy8gdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG4gICAgICAgICAgICBpZiAobm90aWZpY2F0aW9uICYmIHRoaXMubG9nZ2VkSW5Vc2VyPy5nZXRVaWQoKSAhPSBtZXNzYWdlPy5nZXRTZW5kZXIoKT8uZ2V0VWlkKCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5wbGF5QXVkaW8oKTtcbiAgICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICBpZih0aGlzLm9uRXJyb3Ipe1xuICAgICAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yKVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgICAgaWYodGhpcy5vbkVycm9yKXtcbiAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yKVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgfVxuICB1cGRhdGVEZWxpdmVyZWRNZXNzYWdlKG1lc3NhZ2VSZWNlaXB0OiBDb21ldENoYXQuTWVzc2FnZVJlY2VpcHQpIHtcbiAgICBsZXQgY29udmVyc2F0aW9uTGlzdDogQ29tZXRDaGF0LkNvbnZlcnNhdGlvbltdID0gWy4uLnRoaXMuY29udmVyc2F0aW9uTGlzdF07XG4gICAgbGV0IGNvbnZlcnNhdGlvbktleTogbnVtYmVyID0gY29udmVyc2F0aW9uTGlzdC5maW5kSW5kZXgoXG4gICAgICAoYzogQ29tZXRDaGF0LkNvbnZlcnNhdGlvbikgPT4gKGMuZ2V0TGFzdE1lc3NhZ2UoKSBhcyBDb21ldENoYXQuVGV4dE1lc3NhZ2UpLmdldElkKCkgPT0gTnVtYmVyKG1lc3NhZ2VSZWNlaXB0LmdldE1lc3NhZ2VJZCgpKVxuICAgICk7XG4gICAgbGV0IGNvbnZlcnNhdGlvbk9iajogQ29tZXRDaGF0LkNvbnZlcnNhdGlvbjtcbiAgICBpZiAoY29udmVyc2F0aW9uS2V5ID4gLTEpIHtcbiAgICAgIGNvbnZlcnNhdGlvbk9iaiA9IGNvbnZlcnNhdGlvbkxpc3RbY29udmVyc2F0aW9uS2V5XTtcbiAgICAgIGlmICghKGNvbnZlcnNhdGlvbk9iai5nZXRMYXN0TWVzc2FnZSgpIGFzIENvbWV0Q2hhdC5UZXh0TWVzc2FnZSkuZ2V0RGVsaXZlcmVkQXQoKSkge1xuICAgICAgICAoY29udmVyc2F0aW9uT2JqLmdldExhc3RNZXNzYWdlKCkgYXMgQ29tZXRDaGF0LlRleHRNZXNzYWdlKS5zZXREZWxpdmVyZWRBdChOdW1iZXIodGhpcy5nZXRVaW54KCkpKTtcbiAgICAgICAgKGNvbnZlcnNhdGlvbk9iai5nZXRMYXN0TWVzc2FnZSgpIGFzIENvbWV0Q2hhdC5UZXh0TWVzc2FnZSkuc2V0TXVpZCh0aGlzLmdldFVpbngoKSk7XG4gICAgICAgIGNvbnZlcnNhdGlvbkxpc3Quc3BsaWNlKGNvbnZlcnNhdGlvbktleSwgMSwgY29udmVyc2F0aW9uT2JqKVxuICAgICAgICB0aGlzLmNvbnZlcnNhdGlvbkxpc3QgPSBbLi4uY29udmVyc2F0aW9uTGlzdF07XG4gICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICpcbiAgICogR2V0cyBUaGUgQ291bnQgb2YgVW5yZWFkIE1lc3NhZ2VzXG4gICAqIEBwYXJhbVxuICAgKi9cbiAgLyoqXG4gICAqIEBwYXJhbSAge2FueX0gY29udmVyc2F0aW9uXG4gICAqIEBwYXJhbSAge2FueX0gb3BlcmF0b3JcbiAgICovXG4gIG1ha2VVbnJlYWRNZXNzYWdlQ291bnQoY29udmVyc2F0aW9uOiBDb21ldENoYXQuQ29udmVyc2F0aW9uLCBvcGVyYXRvcjogYW55ID0gbnVsbCkge1xuICAgIGlmIChPYmplY3Qua2V5cyhjb252ZXJzYXRpb24pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGxldCB1bnJlYWRNZXNzYWdlQ291bnQ6bnVtYmVyID0gY29udmVyc2F0aW9uLmdldFVucmVhZE1lc3NhZ2VDb3VudCgpO1xuICAgIGlmIChcbiAgICAgIHRoaXMuYWN0aXZlQ29udmVyc2F0aW9uICYmXG4gICAgICB0aGlzLmFjdGl2ZUNvbnZlcnNhdGlvbi5nZXRDb252ZXJzYXRpb25JZCgpID09PSBjb252ZXJzYXRpb24uZ2V0Q29udmVyc2F0aW9uSWQoKVxuICAgICkge1xuICAgICAgdW5yZWFkTWVzc2FnZUNvdW50ICs9IDE7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICh0aGlzLmFjdGl2ZUNvbnZlcnNhdGlvbiAmJlxuICAgICAgICB0aGlzLmFjdGl2ZUNvbnZlcnNhdGlvbi5oYXNPd25Qcm9wZXJ0eShcImd1aWRcIikgJiZcbiAgICAgICAgY29udmVyc2F0aW9uLmdldENvbnZlcnNhdGlvbldpdGgoKS5oYXNPd25Qcm9wZXJ0eShcImd1aWRcIikgJiZcbiAgICAgICAgKHRoaXMuYWN0aXZlQ29udmVyc2F0aW9uLmdldENvbnZlcnNhdGlvbldpdGgoKSBhcyBDb21ldENoYXQuR3JvdXApLmdldEd1aWQoKSA9PT0gKGNvbnZlcnNhdGlvbi5nZXRDb252ZXJzYXRpb25XaXRoKCkgYXMgQ29tZXRDaGF0Lkdyb3VwKS5nZXRHdWlkKCkpIHx8XG4gICAgICAodGhpcy5hY3RpdmVDb252ZXJzYXRpb24gJiZcbiAgICAgICAgdGhpcy5hY3RpdmVDb252ZXJzYXRpb24uaGFzT3duUHJvcGVydHkoXCJ1aWRcIikgJiZcbiAgICAgICAgY29udmVyc2F0aW9uLmdldENvbnZlcnNhdGlvbldpdGgoKS5oYXNPd25Qcm9wZXJ0eShcInVpZFwiKSAmJlxuICAgICAgICAodGhpcy5hY3RpdmVDb252ZXJzYXRpb24uZ2V0Q29udmVyc2F0aW9uV2l0aCgpIGFzIENvbWV0Q2hhdC5Vc2VyKS5nZXRVaWQoKSA9PT0gKGNvbnZlcnNhdGlvbi5nZXRDb252ZXJzYXRpb25XaXRoKCkgYXMgQ29tZXRDaGF0LlVzZXIpLmdldFVpZCgpKVxuICAgICkge1xuICAgICAgdW5yZWFkTWVzc2FnZUNvdW50ID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG9wZXJhdG9yICYmIG9wZXJhdG9yID09PSBcImRlY3JlbWVudFwiKSB7XG4gICAgICAgIHVucmVhZE1lc3NhZ2VDb3VudCA9IHVucmVhZE1lc3NhZ2VDb3VudCA/IHVucmVhZE1lc3NhZ2VDb3VudCAtIDEgOiAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdW5yZWFkTWVzc2FnZUNvdW50ID0gdW5yZWFkTWVzc2FnZUNvdW50ICsgMTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVucmVhZE1lc3NhZ2VDb3VudDtcbiAgfVxuICAvKipcbiAgICogQ2hhbmdlcyBkZXRhaWwgb2YgY29udmVyc2F0aW9uc1xuICAgKiBAcGFyYW1cbiAgICovXG4gIC8qKlxuICAgKiBAcGFyYW0gIHtDb21ldENoYXQuQmFzZU1lc3NhZ2V9IG1lc3NhZ2VcbiAgICovXG4gIG1ha2VDb252ZXJzYXRpb24obWVzc2FnZTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKSB7XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIENvbWV0Q2hhdC5Db21ldENoYXRIZWxwZXIuZ2V0Q29udmVyc2F0aW9uRnJvbU1lc3NhZ2UobWVzc2FnZSlcbiAgICAgICAgLnRoZW4oKGNvbnZlcnNhdGlvbjogQ29tZXRDaGF0LkNvbnZlcnNhdGlvbikgPT4ge1xuICAgICAgICAgIGxldCBjb252ZXJzYXRpb25MaXN0OiBDb21ldENoYXQuQ29udmVyc2F0aW9uW10gPSBbLi4udGhpcy5jb252ZXJzYXRpb25MaXN0XTtcbiAgICAgICAgICBsZXQgY29udmVyc2F0aW9uS2V5OiBudW1iZXIgPSBjb252ZXJzYXRpb25MaXN0LmZpbmRJbmRleChcbiAgICAgICAgICAgIChjOiBDb21ldENoYXQuQ29udmVyc2F0aW9uKSA9PiBjPy5nZXRDb252ZXJzYXRpb25JZCgpID09PSBjb252ZXJzYXRpb24uZ2V0Q29udmVyc2F0aW9uSWQoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgbGV0IGNvbnZlcnNhdGlvbk9iajogQ29tZXRDaGF0LkNvbnZlcnNhdGlvbiA9IGNvbnZlcnNhdGlvbjtcbiAgICAgICAgICBpZiAoY29udmVyc2F0aW9uS2V5ID4gLTEpIHtcbiAgICAgICAgICAgIGNvbnZlcnNhdGlvbk9iaiA9IGNvbnZlcnNhdGlvbkxpc3RbY29udmVyc2F0aW9uS2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBjb252ZXJzYXRpb25LZXk6IGNvbnZlcnNhdGlvbktleSxcbiAgICAgICAgICAgIGNvbnZlcnNhdGlvbk9iajogY29udmVyc2F0aW9uT2JqLFxuICAgICAgICAgICAgY29udmVyc2F0aW9uTGlzdDogY29udmVyc2F0aW9uTGlzdCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcjogYW55KSA9PiByZWplY3QoZXJyb3IpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuICAvKipcbiAgICogVXBkYXRlcyBDb252ZXJzYXRpb24gVmlldyB3aGVuIG1lc3NhZ2UgaXMgZWRpdGVkIG9yIGRlbGV0ZWRcbiAgICovXG4gIGNvbnZlcnNhdGlvbkVkaXRlZERlbGV0ZWQobWVzc2FnZTogQ29tZXRDaGF0LkJhc2VNZXNzYWdlKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubWFrZUNvbnZlcnNhdGlvbihtZXNzYWdlKVxuICAgICAgICAudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbktleSA9IHJlc3BvbnNlLmNvbnZlcnNhdGlvbktleTtcbiAgICAgICAgICBjb25zdCBjb252ZXJzYXRpb25PYmo6IENvbWV0Q2hhdC5Db252ZXJzYXRpb24gPSByZXNwb25zZS5jb252ZXJzYXRpb25PYmo7XG4gICAgICAgICAgY29uc3QgY29udmVyc2F0aW9uTGlzdCA9IHJlc3BvbnNlLmNvbnZlcnNhdGlvbkxpc3Q7XG4gICAgICAgICAgaWYgKGNvbnZlcnNhdGlvbktleSA+IC0xKSB7XG4gICAgICAgICAgICBsZXQgbGFzdE1lc3NhZ2VPYmo6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSA9IGNvbnZlcnNhdGlvbk9iai5nZXRMYXN0TWVzc2FnZSgpO1xuICAgICAgICAgICAgaWYgKGxhc3RNZXNzYWdlT2JqLmdldElkKCkgPT09IG1lc3NhZ2UuZ2V0SWQoKSkge1xuICAgICAgICAgICAgICBjb252ZXJzYXRpb25PYmouc2V0TGFzdE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgICAgIChjb252ZXJzYXRpb25PYmouZ2V0TGFzdE1lc3NhZ2UoKSBhcyBDb21ldENoYXQuVGV4dE1lc3NhZ2UpLnNldE11aWQodGhpcy5nZXRVaW54KCkpO1xuICAgICAgICAgICAgICBjb252ZXJzYXRpb25MaXN0LnNwbGljZShjb252ZXJzYXRpb25LZXksIDEsIGNvbnZlcnNhdGlvbk9iaik7XG4gICAgICAgICAgICAgIHRoaXMuY29udmVyc2F0aW9uTGlzdCA9IFsuLi5jb252ZXJzYXRpb25MaXN0XTtcbiAgICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICBpZih0aGlzLm9uRXJyb3Ipe1xuICAgICAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yKVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6YW55KSB7XG4gICAgICAgICAgICBpZih0aGlzLm9uRXJyb3Ipe1xuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBJZiBVc2VyIHNjcm9sbHMgdG8gdGhlIGJvdHRvbSBvZiB0aGUgY3VycmVudCBDb252ZXJzYXRpb24gbGlzdCB0aGFuIGZldGNoIG5leHQgaXRlbXMgb2YgdGhlIENvbnZlcnNhdGlvbiBsaXN0IGFuZCBhcHBlbmRcbiAgICogQHBhcmFtIEV2ZW50XG4gICAqL1xuICAvKipcbiAgICogUGxheXMgQXVkaW8gV2hlbiBNZXNzYWdlIGlzIFJlY2VpdmVkXG4gICAqL1xuICBwbGF5QXVkaW8oKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmKCF0aGlzLmRpc2FibGVTb3VuZEZvck1lc3NhZ2VzKXtcbiAgICAgICAgaWYodGhpcy5jdXN0b21Tb3VuZEZvck1lc3NhZ2VzKXtcbiAgICAgICAgICBDb21ldENoYXRTb3VuZE1hbmFnZXIucGxheSh0aGlzLmN1c3RvbVNvdW5kRm9yTWVzc2FnZXMpXG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICBDb21ldENoYXRTb3VuZE1hbmFnZXIucGxheShDb21ldENoYXRTb3VuZE1hbmFnZXIuU291bmQuaW5jb21pbmdNZXNzYWdlRnJvbU90aGVyKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNle1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICBpZih0aGlzLm9uRXJyb3Ipe1xuICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpXG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qXG4gICAqIFVwZGF0ZXMgdGhlIGNvbnZlc2F0aW9uIGxpc3Qgd2hlbiBkZWxldGVkLlxuICAgKiBBZGRpbmcgQ29udmVyc2F0aW9uIE9iamVjdCB0byBDb21ldGNoYXRTZXJ2aWNlXG4gICAqL1xuICAvKipcbiAgICogQHBhcmFtICB7Q29tZXRDaGF0LkNvbnZlcnNhdGlvbnx7fX0gY29udmVyc2F0aW9uXG4gICAqL1xuICB1cGRhdGVDb252ZXJzYXRpb25MaXN0KGNvbnZlcnNhdGlvbjogQ29tZXRDaGF0LkNvbnZlcnNhdGlvbiB8IG51bGwpIHtcbiAgICBsZXQgaW5kZXggPSB0aGlzLmNvbnZlcnNhdGlvbkxpc3QuZmluZEluZGV4KChlbGVtZW50OiBDb21ldENoYXQuQ29udmVyc2F0aW9uKSA9PiBlbGVtZW50Py5nZXRDb252ZXJzYXRpb25JZCgpID09IGNvbnZlcnNhdGlvbj8uZ2V0Q29udmVyc2F0aW9uSWQoKSk7XG4gICAgdGhpcy5jb252ZXJzYXRpb25MaXN0LnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG4gIH1cbiAgLyoqXG4gICAqIHNob3dpbmcgZGlhbG9nIGZvciBjb25maXJtIGFuZCBjYW5jZWxcbiAgICogQHBhcmFtICB7Q29tZXRDaGF0LkNvbnZlcnNhdGlvbnx7fX0gY29udmVyc2F0aW9uXG4gICAqL1xuICBzaG93Q29uZmlybWF0aW9uRGlhbG9nID0gKGNvbnZlcnNhdGlvbjogQ29tZXRDaGF0LkNvbnZlcnNhdGlvbikgPT4ge1xuICAgIHRoaXMuaXNEaWFsb2dPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLmNvbnZlcnNhdGlvblRvQmVEZWxldGVkID0gY29udmVyc2F0aW9uO1xuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICB9XG4gIG9uT3B0aW9uQ2xpY2soZXZlbnQ6YW55LGNvbnZlcnNhdGlvbjogQ29tZXRDaGF0LkNvbnZlcnNhdGlvbil7XG4gICAgbGV0IG9wdGlvbjpDb21ldENoYXRPcHRpb24gPSBldmVudD8uZGV0YWlsPy5kYXRhXG4gICAgdGhpcy5jb252ZXJzYXRpb25Ub0JlRGVsZXRlZCA9IGNvbnZlcnNhdGlvbjtcbiAgICBpZihvcHRpb24pe1xuICAgICAgb3B0aW9uLm9uQ2xpY2shKClcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIHNob3cgY29uZmlybSBkaWFsb2cgc2NyZWVuXG4gICAqIEBwYXJhbSAge0NvbWV0Q2hhdC5Db252ZXJzYXRpb258e319IGNvbnZlcnNhdG9uXG4gICAqL1xuICAvLyBjaGVjayBpcyB0aGVyZSBpcyBhbnkgYWN0aXZlIGNvbnZlcnNhdGlvbiBhbmQgbWFyayBpdCBhcyBhY3RpdmVcbiAgZ2V0QWN0aXZlQ29udmVyc2F0aW9uKGNvbnZlcnNhdGlvbjogQ29tZXRDaGF0LkNvbnZlcnNhdGlvbikge1xuICAgIGlmKHRoaXMuc2VsZWN0aW9uTW9kZSA9PSBTZWxlY3Rpb25Nb2RlLm5vbmUgfHwgIXRoaXMuc2VsZWN0aW9uTW9kZSApIHtcbiAgICAgIHJldHVybiB0aGlzLmFjdGl2ZUNvbnZlcnNhdGlvbiAmJiAodGhpcy5hY3RpdmVDb252ZXJzYXRpb24gYXMgYW55KT8uY29udmVyc2F0aW9uSWQgPT0gKGNvbnZlcnNhdGlvbiBhcyBhbnkpPy5jb252ZXJzYXRpb25JZFxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogaGFuZGxlIGNvbmZpcm0gZGlhbG9nIHJlc3BvbnNlXG4gICAqIEBwYXJhbSAge3N0cmluZ30gdmFsdWVcbiAgICovXG4gIC8vIGNhbGxpbmcgY29tZXRjaGF0LmRlbGV0ZUNvbnZlcnNhdGlvbiBtZXRob2RcbiAgZGVsZXRlU2VsZWN0ZWRDb252ZXJzYXRpb24oKXtcbiAgICBpZiAodGhpcy5jb252ZXJzYXRpb25Ub0JlRGVsZXRlZCkge1xuICAgICAgaWYgKHRoaXMuYWN0aXZlQ29udmVyc2F0aW9uICYmIHRoaXMuYWN0aXZlQ29udmVyc2F0aW9uLmdldENvbnZlcnNhdGlvbklkKCkgPT0gdGhpcy5jb252ZXJzYXRpb25Ub0JlRGVsZXRlZC5nZXRDb252ZXJzYXRpb25JZCgpKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlQ29udmVyc2F0aW9uID0gbnVsbFxuICAgICAgfVxuICAgICAgbGV0IGNvbnZlcnNhdGlvbldpdGg7XG4gICAgICBsZXQgY29udmVyc2F0aW9uVHlwZSA9IHRoaXMuY29udmVyc2F0aW9uVG9CZURlbGV0ZWQuZ2V0Q29udmVyc2F0aW9uVHlwZSgpO1xuICAgICAgaWYgKGNvbnZlcnNhdGlvblR5cGUgPT09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VSZWNlaXZlclR5cGUudXNlcikge1xuICAgICAgICBjb252ZXJzYXRpb25XaXRoID0gKHRoaXMuY29udmVyc2F0aW9uVG9CZURlbGV0ZWQuZ2V0Q29udmVyc2F0aW9uV2l0aCgpIGFzIENvbWV0Q2hhdC5Vc2VyKS5nZXRVaWQoKVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnZlcnNhdGlvbldpdGggPSAodGhpcy5jb252ZXJzYXRpb25Ub0JlRGVsZXRlZC5nZXRDb252ZXJzYXRpb25XaXRoKCkgYXMgQ29tZXRDaGF0Lkdyb3VwKS5nZXRHdWlkKClcbiAgICAgIH1cbiAgICAgIENvbWV0Q2hhdC5kZWxldGVDb252ZXJzYXRpb24oY29udmVyc2F0aW9uV2l0aCwgY29udmVyc2F0aW9uVHlwZSkudGhlbihcbiAgICAgICAgZGVsZXRlZENvbnZlcnNhdGlvbiA9PiB7XG4gICAgICAgICAgQ29tZXRDaGF0Q29udmVyc2F0aW9uRXZlbnRzLmNjQ29udmVyc2F0aW9uRGVsZXRlZC5uZXh0KHRoaXMuY29udmVyc2F0aW9uVG9CZURlbGV0ZWQhKVxuICAgICAgICAgIHRoaXMudXBkYXRlQ29udmVyc2F0aW9uTGlzdCh0aGlzLmNvbnZlcnNhdGlvblRvQmVEZWxldGVkKVxuICAgICAgICAgIHRoaXMuY29udmVyc2F0aW9uVG9CZURlbGV0ZWQgPSBudWxsO1xuICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHRoaXMuaXNEaWFsb2dPcGVuID0gZmFsc2VcbiAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuICAgIH1cbiAgfVxuICAvLyBleHBvc2VkIG1ldGhvZHMgdG8gdXNlcnMuXG4gIHVwZGF0ZUxhc3RNZXNzYWdlKG1lc3NhZ2U6IENvbWV0Q2hhdC5CYXNlTWVzc2FnZSkge1xuICAgIHRoaXMudXBkYXRlQ29udmVyc2F0aW9uKG1lc3NhZ2UpO1xuICB9XG4gIHJlbW92ZUNvbnZlcnNhdGlvbihjb252ZXJzYXRpb246IENvbWV0Q2hhdC5Db252ZXJzYXRpb24pIHtcbiAgICB0aGlzLnVwZGF0ZUNvbnZlcnNhdGlvbkxpc3QoY29udmVyc2F0aW9uKTtcbiAgfVxuICBzdHlsZXM6IGFueSA9IHtcbiAgICB3cmFwcGVyU3R5bGU6ICgpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGhlaWdodDogdGhpcy5jb252ZXJzYXRpb25zU3R5bGUuaGVpZ2h0LFxuICAgICAgICB3aWR0aDogdGhpcy5jb252ZXJzYXRpb25zU3R5bGUud2lkdGgsXG4gICAgICAgIGJvcmRlcjogdGhpcy5jb252ZXJzYXRpb25zU3R5bGUuYm9yZGVyIHx8IGAxcHggc29saWQgJHt0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDQwMCgpfWAsXG4gICAgICAgIGJvcmRlclJhZGl1czogdGhpcy5jb252ZXJzYXRpb25zU3R5bGUuYm9yZGVyUmFkaXVzLFxuICAgICAgICBiYWNrZ3JvdW5kOiB0aGlzLmNvbnZlcnNhdGlvbnNTdHlsZS5iYWNrZ3JvdW5kIHx8IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QmFja2dyb3VuZCgpLFxuICAgICAgfVxuICAgIH0sXG4gIH1cbiAgc3VidGl0bGVTdHlsZSA9IChjb252ZXJzYXRpb246YW55KSA9PiB7XG4gICBpZih0aGlzLnR5cGluZ0luZGljYXRvciAmJiAoIHRoaXMudHlwaW5nSW5kaWNhdG9yLmdldFJlY2VpdmVyVHlwZSgpID09IENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLk1lc3NhZ2VSZWNlaXZlclR5cGUudXNlciAmJiB0aGlzLnR5cGluZ0luZGljYXRvci5nZXRTZW5kZXIoKS5nZXRVaWQoKSA9PSBjb252ZXJzYXRpb24uY29udmVyc2F0aW9uV2l0aD8udWlkIHx8IHRoaXMudHlwaW5nSW5kaWNhdG9yLmdldFJlY2VpdmVySWQoKSA9PSBjb252ZXJzYXRpb24uY29udmVyc2F0aW9uV2l0aD8uZ3VpZCkpe1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZm9udDogdGhpcy5jb252ZXJzYXRpb25zU3R5bGUudHlwaW5nSW5kaWN0b3JUZXh0Q29sb3IsXG4gICAgICAgIGNvbG9yOiB0aGlzLmNvbnZlcnNhdGlvbnNTdHlsZS50eXBpbmdJbmRpY3RvclRleHRDb2xvclxuICAgICAgfVxuICAgfVxuICAgIHJldHVybiB7XG4gICAgICBmb250OiAgICB0aGlzLmNvbnZlcnNhdGlvbnNTdHlsZS5sYXN0TWVzc2FnZVRleHRGb250LFxuICAgICAgY29sb3I6ICAgdGhpcy5jb252ZXJzYXRpb25zU3R5bGUubGFzdE1lc3NhZ2VUZXh0Q29sb3JcbiAgICB9XG4gIH1cbiAgaXRlbVRocmVhZEluZGljYXRvclN0eWxlID0gKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICB0ZXh0Rm9udDogdGhpcy5jb252ZXJzYXRpb25zU3R5bGUudGhyZWFkSW5kaWNhdG9yVGV4dEZvbnQgfHwgZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LmNhcHRpb24yKSxcbiAgICAgIHRleHRDb2xvcjogdGhpcy5jb252ZXJzYXRpb25zU3R5bGUudGhyZWFkSW5kaWNhdG9yVGV4dENvbG9yIHx8IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50NDAwKCksXG4gICAgfTtcbiAgfVxufVxuIiwiPGRpdiAgY2xhc3M9XCJjYy1jb252ZXJzYXRpb25zXCIgW25nU3R5bGVdPVwic3R5bGVzLndyYXBwZXJTdHlsZSgpXCI+XG4gIDxjb21ldGNoYXQtYmFja2Ryb3AgW2JhY2tkcm9wU3R5bGVdPVwiYmFja2Ryb3BTdHlsZVwiICpuZ0lmPVwiaXNEaWFsb2dPcGVuXCI+XG4gICAgPGNvbWV0Y2hhdC1jb25maXJtLWRpYWxvZyBbdGl0bGVdPVwiY29uZmlybURpYWxvZ1RpdGxlXCIgW21lc3NhZ2VUZXh0XT1cImNvbmZpcm1EaWFsb2dNZXNzYWdlXCIgW2NhbmNlbEJ1dHRvblRleHRdPVwiY2FuY2VsQnV0dG9uVGV4dFwiIFtjb25maXJtQnV0dG9uVGV4dF09XCJjb25maXJtQnV0dG9uVGV4dFwiIChjYy1jb25maXJtLWNsaWNrZWQpPVwib25Db25maXJtQ2xpY2soKVwiIChjYy1jYW5jZWwtY2xpY2tlZCk9XCJvbkNhbmNlbENsaWNrKClcIiBbY29uZmlybURpYWxvZ1N0eWxlXT1cImRlbGV0ZUNvbnZlcnNhdGlvbkRpYWxvZ1N0eWxlXCI+XG4gICAgPC9jb21ldGNoYXQtY29uZmlybS1kaWFsb2c+XG4gIDwvY29tZXRjaGF0LWJhY2tkcm9wPlxuICA8ZGl2IGNsYXNzPVwiY2MtY29udmVyc2F0aW9uc19fbWVudXNcIiAqbmdJZj1cIm1lbnVcIj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1lbnVcIj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gIDwvZGl2PlxuPGNvbWV0Y2hhdC1saXN0IFtzdGF0ZV09XCJzdGF0ZVwiXG5bc2VhcmNoSWNvblVSTF09XCJzZWFyY2hJY29uVVJMXCIgIFtoaWRlRXJyb3JdPVwiaGlkZUVycm9yXCJcbltlbXB0eVN0YXRlVGV4dF09XCJlbXB0eVN0YXRlVGV4dFwiIFtsb2FkaW5nSWNvblVSTF09XCJsb2FkaW5nSWNvblVSTFwiXG5bdGl0bGVBbGlnbm1lbnRdPVwidGl0bGVBbGlnbm1lbnRcIiBbbG9hZGluZ1ZpZXddPVwibG9hZGluZ1N0YXRlVmlld1wiIFtsaXN0U3R5bGVdPVwibGlzdFN0eWxlXCIgW2VtcHR5U3RhdGVWaWV3XT1cImVtcHR5U3RhdGVWaWV3XCJcbltlcnJvclN0YXRlVGV4dF09XCJlcnJvclN0YXRlVGV4dFwiIFtlcnJvclZpZXddPVwiZXJyb3JTdGF0ZVZpZXdcIlxuW29uU2Nyb2xsZWRUb0JvdHRvbV09XCJnZXRDb252ZXJzYXRpb25cIiBbbGlzdF09XCJjb252ZXJzYXRpb25MaXN0XCIgIFtsaXN0SXRlbVZpZXddPVwibGlzdEl0ZW1WaWV3ID8gbGlzdEl0ZW1WaWV3IDogbGlzdEl0ZW1cIiBbdGl0bGVdPVwidGl0bGVcIiAgW2hpZGVTZWFyY2hdPVwiaGlkZVNlYXJjaFwiPjwvY29tZXRjaGF0LWxpc3Q+XG48L2Rpdj5cbjxuZy10ZW1wbGF0ZSAjbGlzdEl0ZW0gbGV0LWNvbnZlcnNhdGlvbj5cbiAgPGNvbWV0Y2hhdC1saXN0LWl0ZW0gW2hpZGVTZXBhcmF0b3JdPVwiaGlkZVNlcGFyYXRvclwiIFthdmF0YXJTdHlsZV09XCJhdmF0YXJTdHlsZVwiIFtzdGF0dXNJbmRpY2F0b3JTdHlsZV09XCJzZXRTdGF0dXNJbmRpY2F0b3JTdHlsZShjb252ZXJzYXRpb24pXCJcbiAgW2lkXT1cImNvbnZlcnNhdGlvbj8uY29udmVyc2F0aW9uSWRcIiBbaXNBY3RpdmVdPVwiZ2V0QWN0aXZlQ29udmVyc2F0aW9uKGNvbnZlcnNhdGlvbilcIlxuICAoY2MtbGlzdGl0ZW0tY2xpY2tlZCk9XCJvbkNsaWNrKGNvbnZlcnNhdGlvbilcIiBbdGl0bGVdPVwiY29udmVyc2F0aW9uPy5jb252ZXJzYXRpb25XaXRoPy5uYW1lXCJcbiAgW3N0YXR1c0luZGljYXRvckljb25dPVwiY2hlY2tHcm91cFR5cGUoY29udmVyc2F0aW9uKVwiIFtzdGF0dXNJbmRpY2F0b3JDb2xvcl09XCJjaGVja1N0YXR1c1R5cGUoY29udmVyc2F0aW9uKVwiXG4gIFtsaXN0SXRlbVN0eWxlXT1cImxpc3RJdGVtU3R5bGVcIiBbYXZhdGFyVVJMXT1cImNvbnZlcnNhdGlvbj8uY29udmVyc2F0aW9uV2l0aD8uYXZhdGFyXCIgW2F2YXRhck5hbWVdPVwiY29udmVyc2F0aW9uPy5jb252ZXJzYXRpb25XaXRoPy5uYW1lXCI+XG4gICAgPGRpdiBzbG90PVwic3VidGl0bGVWaWV3XCIgKm5nSWY9XCJzdWJ0aXRsZVZpZXc7ZWxzZSBjb252ZXJzYXRpb25TdWJ0aXRsZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInN1YnRpdGxlVmlld1wiPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuICA8bmctdGVtcGxhdGUgI2NvbnZlcnNhdGlvblN1YnRpdGxlPlxuXG4gIDxkaXYgY2xhc3M9XCJjYy1jb252ZXJzYXRpb25zX19zdWJ0aXRsZS12aWV3IFwiIHNsb3Q9XCJzdWJ0aXRsZVZpZXdcIiA+XG4gICAgPGRpdiBjbGFzcz1cImNjLWNvbnZlcnNhdGlvbnNfX3RocmVhZHZpZXdcIiAqbmdJZj1cImNvbnZlcnNhdGlvbj8ubGFzdE1lc3NhZ2U/LnBhcmVudE1lc3NhZ2VJZFwiPlxuICAgICAgPGNvbWV0Y2hhdC1sYWJlbCBbbGFiZWxTdHlsZV09XCJpdGVtVGhyZWFkSW5kaWNhdG9yU3R5bGUoKVwiIFt0ZXh0XT1cInRocmVhZEluZGljYXRvclRleHRcIj4gPC9jb21ldGNoYXQtbGFiZWw+XG4gICAgICA8Y29tZXRjaGF0LWljb24gW1VSTF09XCJ0aHJlYWRJY29uVVJMXCIgW2ljb25TdHlsZV09XCJpY29uU3R5bGVcIj48L2NvbWV0Y2hhdC1pY29uPlxuXG4gICAgPC9kaXY+XG48ZGl2IGNsYXNzPVwiY2MtY29udmVyc2F0aW9uc19fc3VidGl0bGVcIj5cbiAgPGRpdiBjbGFzcz1cImNjLWNvbnZlcnNhdGlvbnNfX3JlYWRyZWNlaXB0XCIgKm5nSWY9XCJpc1JlY2VpcHREaXNhYmxlKGNvbnZlcnNhdGlvbilcIj5cbiAgICA8Y29tZXRjaGF0LXJlY2VpcHQgIFtyZWNlaXB0XT1cImdldE1lc3NhZ2VSZWNlaXB0KGNvbnZlcnNhdGlvbilcIiBbcmVjZWlwdFN0eWxlXT1cInJlY2VpcHRTdHlsZVwiIFtzZW50SWNvbl09XCJzZW50SWNvblwiIFtlcnJvckljb25dPVwiZXJyb3JJY29uXCIgW2RlbGl2ZXJlZEljb25dPVwiZGVsaXZlcmVkSWNvblwiIFtyZWFkSWNvbl09XCJyZWFkSWNvblwiPjwvY29tZXRjaGF0LXJlY2VpcHQ+XG4gIDwvZGl2PlxuXG4gIDxkaXYgW25nU3R5bGVdPVwic3VidGl0bGVTdHlsZShjb252ZXJzYXRpb24pXCIgY2xhc3M9XCJjYy1zdWJ0aXRsZV9fdGV4dFwiPiB7e3NldFN1YnRpdGxlKGNvbnZlcnNhdGlvbil9fSA8L2Rpdj5cbjwvZGl2PlxuXG4gIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuICA8ZGl2IHNsb3Q9XCJtZW51Vmlld1wiIGNsYXNzPVwiY2MtY29udmVyc2F0aW9uc19fb3B0aW9uc3ZpZXdcIiAqbmdJZj1cInNlbGVjdGlvbk1vZGUgPT0gc2VsZWN0aW9ubW9kZUVudW0ubm9uZVwiPlxuICAgIDxkaXYgKm5nSWY9XCJvcHRpb25zXCI+XG4gICAgICA8Y29tZXRjaGF0LW1lbnUtbGlzdCBbZGF0YV09XCJvcHRpb25zKGNvbnZlcnNhdGlvbilcIiAoY2MtbWVudS1jbGlja2VkKT1cIm9uT3B0aW9uQ2xpY2soJGV2ZW50LGNvbnZlcnNhdGlvbilcIiBbbWVudUxpc3RTdHlsZV09XCJtZW51c3R5bGVcIj5cblxuICAgICAgPC9jb21ldGNoYXQtbWVudS1saXN0PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCIhb3B0aW9ucyAmJiBjb252ZXJzYXRpb25PcHRpb25zXCI+XG4gICAgICA8Y29tZXRjaGF0LW1lbnUtbGlzdCBbZGF0YV09XCJjb252ZXJzYXRpb25PcHRpb25zXCIgKGNjLW1lbnUtY2xpY2tlZCk9XCJvbk9wdGlvbkNsaWNrKCRldmVudCxjb252ZXJzYXRpb24pXCIgW21lbnVMaXN0U3R5bGVdPVwibWVudXN0eWxlXCI+XG5cbiAgICAgIDwvY29tZXRjaGF0LW1lbnUtbGlzdD5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBzbG90PVwidGFpbFZpZXdcIiAgY2xhc3M9XCJjYy1jb252ZXJzYXRpb25zX190YWlsLXZpZXdcIj5cbjxkaXYgY2xhc3M9XCJ0YWlsX192aWV3XCIgKm5nSWY9XCJzZWxlY3Rpb25Nb2RlID09IHNlbGVjdGlvbm1vZGVFbnVtLm5vbmVcIj5cbiAgPGRpdiBjbGFzcz1cImNjLWRhdGVcIj5cbiAgICA8Y29tZXRjaGF0LWRhdGUgW2RhdGVTdHlsZV09XCJkYXRlU3R5bGVcIiBbdGltZXN0YW1wXT1cImNvbnZlcnNhdGlvbj8ubGFzdE1lc3NhZ2U/LnNlbnRBdFwiIFtwYXR0ZXJuXT1cImdldERhdGUoKVwiPjwvY29tZXRjaGF0LWRhdGU+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY2MtY29udmVyc2F0aW9uc19fYmFkZ2VcIj5cbiAgICAgPGNvbWV0Y2hhdC1iYWRnZSBbY291bnRdPVwiY29udmVyc2F0aW9uPy51bnJlYWRNZXNzYWdlQ291bnRcIiBbYmFkZ2VTdHlsZV09XCJiYWRnZVN0eWxlXCI+PC9jb21ldGNoYXQtYmFkZ2U+XG4gIDwvZGl2PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwiY2MtY29udmVyc2F0aW9uc19fc2VsZWN0aW9uLXZpZXdcIiAqbmdJZj1cInNlbGVjdGlvbk1vZGUgIT0gc2VsZWN0aW9ubW9kZUVudW0ubm9uZVwiPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFpbFZpZXdcIj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cbjwvZGl2PlxuICA8L2NvbWV0Y2hhdC1saXN0LWl0ZW0+XG4gIDxuZy10ZW1wbGF0ZSAjdGFpbFZpZXc+XG4gICAgPGRpdiAgKm5nSWY9XCJzZWxlY3Rpb25Nb2RlID09IHNlbGVjdGlvbm1vZGVFbnVtLnNpbmdsZVwiPlxuICAgICAgPGNvbWV0Y2hhdC1yYWRpby1idXR0b24gKGNjLXJhZGlvLWJ1dHRvbi1jaGFuZ2VkKT1cIm9uU2VsZWN0ID8gb25TZWxlY3QoY29udmVyc2F0aW9uKSA6IG51bGxcIj48L2NvbWV0Y2hhdC1yYWRpby1idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAgKm5nSWY9XCJzZWxlY3Rpb25Nb2RlID09IHNlbGVjdGlvbm1vZGVFbnVtLm11bHRpcGxlXCI+XG4gICAgICA8Y29tZXRjaGF0LWNoZWNrYm94IChjYy1jaGVja2JveC1jaGFuZ2VkKT1cIm9uU2VsZWN0ID8gb25TZWxlY3QoY29udmVyc2F0aW9uKSA6IG51bGxcIj48L2NvbWV0Y2hhdC1jaGVja2JveD5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvbmctdGVtcGxhdGU+XG5cblxuIl19
|