@cometchat/chat-uikit-angular 4.3.14 → 4.3.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/Calls/CometChatCallLogDetails/cometchat-call-log-details/cometchat-call-log-details.component.d.ts +21 -4
  2. package/CometChatAddMembers/cometchat-add-members/cometchat-add-members.component.d.ts +5 -1
  3. package/CometChatConversations/cometchat-conversations/cometchat-conversations.component.d.ts +3 -1
  4. package/CometChatGroupMembers/cometchat-group-members/cometchat-group-members.component.d.ts +4 -0
  5. package/CometChatMessageHeader/cometchat-message-header/cometchat-message-header.component.d.ts +4 -0
  6. package/CometChatMessageInformation/cometchat-message-information/cometchat-message-information.component.d.ts +3 -0
  7. package/CometChatMessageList/cometchat-message-list/cometchat-message-list.component.d.ts +2 -0
  8. package/CometChatThreadedMessages/cometchat-threaded-messages/cometchat-threaded-messages.component.d.ts +5 -2
  9. package/CometChatUsers/cometchat-users/cometchat-users.component.d.ts +4 -0
  10. package/esm2020/Calls/CometChatCallLogDetails/cometchat-call-log-details/cometchat-call-log-details.component.mjs +31 -9
  11. package/esm2020/Calls/CometChatCallLogsWithDetails/cometchat-call-logs-with-details/cometchat-call-logs-with-details.component.mjs +3 -3
  12. package/esm2020/CometChatAddMembers/cometchat-add-members/cometchat-add-members.component.mjs +9 -3
  13. package/esm2020/CometChatConversations/cometchat-conversations/cometchat-conversations.component.mjs +46 -35
  14. package/esm2020/CometChatDetails/cometchat-details/cometchat-details.component.mjs +1 -1
  15. package/esm2020/CometChatGroupMembers/cometchat-group-members/cometchat-group-members.component.mjs +19 -3
  16. package/esm2020/CometChatMessageComposer/cometchat-message-composer/cometchat-message-composer.component.mjs +2 -1
  17. package/esm2020/CometChatMessageHeader/cometchat-message-header/cometchat-message-header.component.mjs +19 -4
  18. package/esm2020/CometChatMessageInformation/cometchat-message-information/cometchat-message-information.component.mjs +19 -3
  19. package/esm2020/CometChatMessageList/cometchat-message-list/cometchat-message-list.component.mjs +22 -19
  20. package/esm2020/CometChatMessages/cometchat-messages/cometchat-messages.component.mjs +3 -3
  21. package/esm2020/CometChatThreadedMessages/cometchat-threaded-messages/cometchat-threaded-messages.component.mjs +21 -6
  22. package/esm2020/CometChatUsers/cometchat-users/cometchat-users.component.mjs +13 -3
  23. package/esm2020/CometChatUsersWithMessages/cometchat-users-with-messages/cometchat-users-with-messages.component.mjs +3 -3
  24. package/esm2020/Shared/CometChatUIkit/CometChatUIKit.mjs +2 -2
  25. package/fesm2015/cometchat-chat-uikit-angular.mjs +211 -95
  26. package/fesm2015/cometchat-chat-uikit-angular.mjs.map +1 -1
  27. package/fesm2020/cometchat-chat-uikit-angular.mjs +197 -82
  28. package/fesm2020/cometchat-chat-uikit-angular.mjs.map +1 -1
  29. package/package.json +5 -5
@@ -1,6 +1,6 @@
1
1
  import { OnInit, ChangeDetectorRef, TemplateRef, OnChanges, SimpleChanges } from "@angular/core";
2
2
  import "@cometchat/uikit-elements";
3
- import { AvatarStyle, DateStyle, IconStyle, ListItemStyle } from "@cometchat/uikit-elements";
3
+ import { AvatarStyle, DateStyle, IconStyle, LabelStyle, ListItemStyle } from "@cometchat/uikit-elements";
4
4
  import { CallButtonsStyle, CallButtonsConfiguration, CallLogDetailsStyle, CallLogParticipantsConfiguration, CallLogHistoryConfiguration, CallLogRecordingsConfiguration } from "@cometchat/uikit-shared";
5
5
  import { CometChatDetailsOption, CometChatDetailsTemplate, DatePatterns, CometChatCallDetailsOption } from "@cometchat/uikit-resources";
6
6
  import { CometChatThemeService } from "../../../CometChatTheme.service";
@@ -12,7 +12,7 @@ export declare class CometChatCallLogDetailsComponent implements OnInit, OnChang
12
12
  group: CometChat.Group;
13
13
  user: CometChat.User;
14
14
  title: string;
15
- onBackClick: () => void;
15
+ onBackClick?: () => void;
16
16
  hideProfile: boolean;
17
17
  subtitleView: TemplateRef<any>;
18
18
  customProfileView: TemplateRef<any>;
@@ -27,6 +27,7 @@ export declare class CometChatCallLogDetailsComponent implements OnInit, OnChang
27
27
  datePattern2: DatePatterns;
28
28
  data: CometChatDetailsTemplate[];
29
29
  avatarStyle: AvatarStyle;
30
+ labelStyle: LabelStyle;
30
31
  callDetailsStyle: CallLogDetailsStyle;
31
32
  listItemStyle: ListItemStyle;
32
33
  dateStyle: DateStyle;
@@ -40,7 +41,6 @@ export declare class CometChatCallLogDetailsComponent implements OnInit, OnChang
40
41
  showParticipantsList: Boolean;
41
42
  showCallRecordingList: Boolean;
42
43
  showCallHistory: Boolean;
43
- dividerStyle: any;
44
44
  getTitleStyle(): {
45
45
  textFont: string;
46
46
  textColor: string | undefined;
@@ -93,6 +93,23 @@ export declare class CometChatCallLogDetailsComponent implements OnInit, OnChang
93
93
  border: string | undefined;
94
94
  borderRadius: string | undefined;
95
95
  background: string | undefined;
96
+ padding: string;
97
+ };
98
+ profileContainerStyle: () => {
99
+ height: string;
100
+ width: string;
101
+ minHeight: string;
102
+ padding: string;
103
+ display: string;
104
+ flexDirection: string;
105
+ justifyContent: string;
106
+ alignItems: string;
107
+ boxSizing: string;
108
+ gap: string;
109
+ };
110
+ getTailViewStyle: () => {
111
+ font: string;
112
+ color: string | undefined;
96
113
  };
97
114
  getTailView(totalSeconds: number): string;
98
115
  getSubtitle(call: any): string;
@@ -115,5 +132,5 @@ export declare class CometChatCallLogDetailsComponent implements OnInit, OnChang
115
132
  hoverBackground: string | undefined;
116
133
  };
117
134
  static ɵfac: i0.ɵɵFactoryDeclaration<CometChatCallLogDetailsComponent, never>;
118
- static ɵcmp: i0.ɵɵComponentDeclaration<CometChatCallLogDetailsComponent, "cometchat-call-log-details", never, { "call": "call"; "group": "group"; "user": "user"; "title": "title"; "onBackClick": "onBackClick"; "hideProfile": "hideProfile"; "subtitleView": "subtitleView"; "customProfileView": "customProfileView"; "backIconUrl": "backIconUrl"; "greaterThanIconURL": "greaterThanIconURL"; "callButtonsConfiguration": "callButtonsConfiguration"; "callLogParticipantsConfiguration": "callLogParticipantsConfiguration"; "callLogHistoryConfiguration": "callLogHistoryConfiguration"; "callLogRecordingsConfiguration": "callLogRecordingsConfiguration"; "onError": "onError"; "datePattern": "datePattern"; "datePattern2": "datePattern2"; "data": "data"; "avatarStyle": "avatarStyle"; "callDetailsStyle": "callDetailsStyle"; "listItemStyle": "listItemStyle"; "dateStyle": "dateStyle"; "callButtonsStyle": "callButtonsStyle"; }, {}, never, never>;
135
+ static ɵcmp: i0.ɵɵComponentDeclaration<CometChatCallLogDetailsComponent, "cometchat-call-log-details", never, { "call": "call"; "group": "group"; "user": "user"; "title": "title"; "onBackClick": "onBackClick"; "hideProfile": "hideProfile"; "subtitleView": "subtitleView"; "customProfileView": "customProfileView"; "backIconUrl": "backIconUrl"; "greaterThanIconURL": "greaterThanIconURL"; "callButtonsConfiguration": "callButtonsConfiguration"; "callLogParticipantsConfiguration": "callLogParticipantsConfiguration"; "callLogHistoryConfiguration": "callLogHistoryConfiguration"; "callLogRecordingsConfiguration": "callLogRecordingsConfiguration"; "onError": "onError"; "datePattern": "datePattern"; "datePattern2": "datePattern2"; "data": "data"; "avatarStyle": "avatarStyle"; "labelStyle": "labelStyle"; "callDetailsStyle": "callDetailsStyle"; "listItemStyle": "listItemStyle"; "dateStyle": "dateStyle"; "callButtonsStyle": "callButtonsStyle"; }, {}, never, never>;
119
136
  }
@@ -55,7 +55,11 @@ export declare class CometChatAddMembersComponent implements OnInit {
55
55
  titleAlignmentEnum: typeof TitleAlignment;
56
56
  selectionmodeEnum: typeof SelectionMode;
57
57
  addMembersStyle: AddMembersStyle;
58
+ /**
59
+ * @deprecated This property is deprecated as of version 4.3.14. Use `statusIndicatorStyle` instead.
60
+ */
58
61
  StatusIndicatorStyle: BaseStyle;
62
+ statusIndicatorStyle: BaseStyle;
59
63
  avatarStyle: AvatarStyle;
60
64
  loggedInUser: CometChat.User | null;
61
65
  actionMessagesList: CometChat.Action[];
@@ -107,5 +111,5 @@ export declare class CometChatAddMembersComponent implements OnInit {
107
111
  padding: string | undefined;
108
112
  };
109
113
  static ɵfac: i0.ɵɵFactoryDeclaration<CometChatAddMembersComponent, never>;
110
- static ɵcmp: i0.ɵɵComponentDeclaration<CometChatAddMembersComponent, "cometchat-add-members", never, { "usersRequestBuilder": "usersRequestBuilder"; "searchRequestBuilder": "searchRequestBuilder"; "subtitleView": "subtitleView"; "listItemView": "listItemView"; "disableUsersPresence": "disableUsersPresence"; "menu": "menu"; "options": "options"; "backButtonIconURL": "backButtonIconURL"; "closeButtonIconURL": "closeButtonIconURL"; "showBackButton": "showBackButton"; "hideSeparator": "hideSeparator"; "selectionMode": "selectionMode"; "searchPlaceholder": "searchPlaceholder"; "hideError": "hideError"; "searchIconURL": "searchIconURL"; "hideSearch": "hideSearch"; "title": "title"; "onError": "onError"; "onBack": "onBack"; "onClose": "onClose"; "onSelect": "onSelect"; "buttonText": "buttonText"; "group": "group"; "emptyStateView": "emptyStateView"; "errorStateView": "errorStateView"; "loadingIconURL": "loadingIconURL"; "listItemStyle": "listItemStyle"; "showSectionHeader": "showSectionHeader"; "sectionHeaderField": "sectionHeaderField"; "loadingStateView": "loadingStateView"; "emptyStateText": "emptyStateText"; "errorStateText": "errorStateText"; "onAddMembersButtonClick": "onAddMembersButtonClick"; "titleAlignment": "titleAlignment"; "addMembersStyle": "addMembersStyle"; "StatusIndicatorStyle": "StatusIndicatorStyle"; "avatarStyle": "avatarStyle"; }, {}, never, never>;
114
+ static ɵcmp: i0.ɵɵComponentDeclaration<CometChatAddMembersComponent, "cometchat-add-members", never, { "usersRequestBuilder": "usersRequestBuilder"; "searchRequestBuilder": "searchRequestBuilder"; "subtitleView": "subtitleView"; "listItemView": "listItemView"; "disableUsersPresence": "disableUsersPresence"; "menu": "menu"; "options": "options"; "backButtonIconURL": "backButtonIconURL"; "closeButtonIconURL": "closeButtonIconURL"; "showBackButton": "showBackButton"; "hideSeparator": "hideSeparator"; "selectionMode": "selectionMode"; "searchPlaceholder": "searchPlaceholder"; "hideError": "hideError"; "searchIconURL": "searchIconURL"; "hideSearch": "hideSearch"; "title": "title"; "onError": "onError"; "onBack": "onBack"; "onClose": "onClose"; "onSelect": "onSelect"; "buttonText": "buttonText"; "group": "group"; "emptyStateView": "emptyStateView"; "errorStateView": "errorStateView"; "loadingIconURL": "loadingIconURL"; "listItemStyle": "listItemStyle"; "showSectionHeader": "showSectionHeader"; "sectionHeaderField": "sectionHeaderField"; "loadingStateView": "loadingStateView"; "emptyStateText": "emptyStateText"; "errorStateText": "errorStateText"; "onAddMembersButtonClick": "onAddMembersButtonClick"; "titleAlignment": "titleAlignment"; "addMembersStyle": "addMembersStyle"; "StatusIndicatorStyle": "StatusIndicatorStyle"; "statusIndicatorStyle": "statusIndicatorStyle"; "avatarStyle": "avatarStyle"; }, {}, never, never>;
111
115
  }
@@ -106,6 +106,8 @@ export declare class CometChatConversationsComponent implements OnInit, OnChange
106
106
  onCustomInteractiveMessageReceived: Subscription;
107
107
  onMessagesRead: Subscription;
108
108
  onMessageDeleted: Subscription;
109
+ onMessagesReadByAll: Subscription;
110
+ onMessagesDeliveredToAll: Subscription;
109
111
  onMessageEdited: Subscription;
110
112
  onMessagesDelivered: Subscription;
111
113
  onTypingStarted: Subscription;
@@ -190,7 +192,7 @@ export declare class CometChatConversationsComponent implements OnInit, OnChange
190
192
  deleteConversationOnClick: (() => void) | null;
191
193
  onConfirmClick: () => void;
192
194
  onConversationSelected(conversation: CometChat.Conversation, event: any): void;
193
- setStatusIndicatorStyle: (conversation: CometChat.Conversation) => any;
195
+ getStatusIndicatorStyle: (conversation: CometChat.Conversation) => any;
194
196
  /**
195
197
  * @param {CometChat.Conversation} conversation
196
198
  */
@@ -97,6 +97,10 @@ export declare class CometChatGroupMembersComponent implements OnInit, OnChanges
97
97
  * @param {CometChat.GroupMember} member
98
98
  */
99
99
  getStatusIndicatorColor: (member: CometChat.GroupMember) => string | null | undefined;
100
+ /**
101
+ * @param {CometChat.GroupMember} member
102
+ */
103
+ getStatusIndicatorStyle: (member: CometChat.GroupMember) => any;
100
104
  changeMemberScope(event: any): void;
101
105
  handleMenuAction: (menu: any, groupMember: CometChat.GroupMember) => void;
102
106
  blockMember: (member: CometChat.GroupMember) => void;
@@ -65,6 +65,10 @@ export declare class CometChatMessageHeaderComponent implements OnInit, OnChange
65
65
  setListItemStyle(): void;
66
66
  setAvatarStyle(): void;
67
67
  setStatusStyle(): void;
68
+ /**
69
+ * @param {CometChat.User} user
70
+ */
71
+ getStatusIndicatorStyle: (user: CometChat.User) => BaseStyle | null;
68
72
  getHeadersStyle(): MessageHeaderStyle;
69
73
  statusColor: any;
70
74
  backButtonStyle: any;
@@ -39,6 +39,8 @@ export declare class CometChatMessageInformationComponent implements OnInit, OnC
39
39
  errorStateView: TemplateRef<any>;
40
40
  onMessagesDelivered: Subscription;
41
41
  onMessagesRead: Subscription;
42
+ onMessagesReadByAll: Subscription;
43
+ onMessagesDeliveredToAll: Subscription;
42
44
  receipts: CometChat.MessageReceipt[];
43
45
  receiptStyle: ReceiptStyle;
44
46
  isUserType: boolean;
@@ -64,6 +66,7 @@ export declare class CometChatMessageInformationComponent implements OnInit, OnC
64
66
  getAvatarUrl(): string;
65
67
  getUserReceipt(): number;
66
68
  getMessageReceipt(): import("@cometchat/uikit-shared/dist/Utils/MessageReceiptUtils").receipts;
69
+ updateReceipt(receipt: CometChat.MessageReceipt): void;
67
70
  getMessageReceipts(): void;
68
71
  closeClicked(): void;
69
72
  closeButtonStyle: () => {
@@ -215,6 +215,8 @@ export declare class CometChatMessageListComponent implements OnInit, OnDestroy,
215
215
  onMediaMessageReceived: Subscription;
216
216
  onMessagesDelivered: Subscription;
217
217
  onMessagesRead: Subscription;
218
+ onMessagesReadByAll: Subscription;
219
+ onMessagesDeliveredToAll: Subscription;
218
220
  onMessageDeleted: Subscription;
219
221
  onMessageEdited: Subscription;
220
222
  onTransientMessageReceived: Subscription;
@@ -1,6 +1,6 @@
1
1
  import { AvatarStyle, BaseStyle, ListItemStyle } from '@cometchat/uikit-elements';
2
2
  import { ChangeDetectorRef, OnChanges, OnInit, SimpleChanges, TemplateRef } from "@angular/core";
3
- import { MessageComposerConfiguration, MessageComposerStyle, MessageListConfiguration, ThreadedMessagesStyle, UserMemberWrapperConfiguration } from "@cometchat/uikit-shared";
3
+ import { MessageComposerConfiguration, MessageComposerStyle, MessageListConfiguration, UserMemberWrapperConfiguration, ThreadedMessagesStyle } from "@cometchat/uikit-shared";
4
4
  import { CometChatThemeService } from "../../CometChatTheme.service";
5
5
  import { Subscription } from "rxjs";
6
6
  import * as i0 from "@angular/core";
@@ -30,6 +30,7 @@ export declare class CometChatThreadedMessagesComponent implements OnInit, OnCha
30
30
  hideMessageComposer: boolean;
31
31
  messageComposerView: TemplateRef<any>;
32
32
  messageListView: TemplateRef<any>;
33
+ disableSoundForMessages: boolean;
33
34
  user: CometChat.User;
34
35
  group: CometChat.Group;
35
36
  loggedInUser: CometChat.User | null;
@@ -49,6 +50,8 @@ export declare class CometChatThreadedMessagesComponent implements OnInit, OnCha
49
50
  onMessagesDelivered: Subscription;
50
51
  onMessagesRead: Subscription;
51
52
  onMessageDeleted: Subscription;
53
+ onMessagesDeliveredToAll: Subscription;
54
+ onMessagesReadByAll: Subscription;
52
55
  onMessageEdited: Subscription;
53
56
  onTextMessageReceived: Subscription;
54
57
  onCustomMessageReceived: Subscription;
@@ -78,5 +81,5 @@ export declare class CometChatThreadedMessagesComponent implements OnInit, OnCha
78
81
  borderRadius: string | undefined;
79
82
  };
80
83
  static ɵfac: i0.ɵɵFactoryDeclaration<CometChatThreadedMessagesComponent, never>;
81
- static ɵcmp: i0.ɵɵComponentDeclaration<CometChatThreadedMessagesComponent, "cometchat-threaded-messages", never, { "onClose": "onClose"; "onError": "onError"; "parentMessage": "parentMessage"; "title": "title"; "closeIconURL": "closeIconURL"; "bubbleView": "bubbleView"; "messageActionView": "messageActionView"; "messageListConfiguration": "messageListConfiguration"; "userMemberWrapperConfiguration": "userMemberWrapperConfiguration"; "messageComposerConfiguration": "messageComposerConfiguration"; "threadedMessagesStyle": "threadedMessagesStyle"; "hideMessageComposer": "hideMessageComposer"; "messageComposerView": "messageComposerView"; "messageListView": "messageListView"; }, {}, never, never>;
84
+ static ɵcmp: i0.ɵɵComponentDeclaration<CometChatThreadedMessagesComponent, "cometchat-threaded-messages", never, { "onClose": "onClose"; "onError": "onError"; "parentMessage": "parentMessage"; "title": "title"; "closeIconURL": "closeIconURL"; "bubbleView": "bubbleView"; "messageActionView": "messageActionView"; "messageListConfiguration": "messageListConfiguration"; "userMemberWrapperConfiguration": "userMemberWrapperConfiguration"; "messageComposerConfiguration": "messageComposerConfiguration"; "threadedMessagesStyle": "threadedMessagesStyle"; "hideMessageComposer": "hideMessageComposer"; "messageComposerView": "messageComposerView"; "messageListView": "messageListView"; "disableSoundForMessages": "disableSoundForMessages"; }, {}, never, never>;
82
85
  }
@@ -91,6 +91,10 @@ export declare class CometChatUsersComponent implements OnInit {
91
91
  * @param {CometChat.User} user
92
92
  */
93
93
  getStatusIndicatorColor: (user: CometChat.User) => string | null | undefined;
94
+ /**
95
+ * @param {CometChat.User} user
96
+ */
97
+ getStatusIndicatorStyle: (user: CometChat.User) => BaseStyle | null;
94
98
  /**
95
99
  * @param {CometChat.User} user
96
100
  */
@@ -37,6 +37,10 @@ export class CometChatCallLogDetailsComponent {
37
37
  height: "28px",
38
38
  border: "none",
39
39
  };
40
+ this.labelStyle = {
41
+ textFont: '600 22px sans-serif, Inter',
42
+ textColor: 'rgb(20, 20, 20)'
43
+ };
40
44
  this.callDetailsStyle = {
41
45
  width: "100%",
42
46
  height: "100%",
@@ -63,11 +67,6 @@ export class CometChatCallLogDetailsComponent {
63
67
  this.showParticipantsList = false;
64
68
  this.showCallRecordingList = false;
65
69
  this.showCallHistory = false;
66
- this.dividerStyle = {
67
- background: "rgb(222 222 222 / 46%)",
68
- height: "1px",
69
- width: "100%",
70
- };
71
70
  this.userListenerId = "userlist_" + new Date().getTime();
72
71
  this.limit = 5;
73
72
  this.onItemClick = (call) => {
@@ -126,6 +125,27 @@ export class CometChatCallLogDetailsComponent {
126
125
  border: this.callDetailsStyle.border,
127
126
  borderRadius: this.callDetailsStyle.borderRadius,
128
127
  background: this.callDetailsStyle.background,
128
+ padding: '16px',
129
+ };
130
+ };
131
+ this.profileContainerStyle = () => {
132
+ return {
133
+ height: "auto",
134
+ width: "100%",
135
+ minHeight: "150px",
136
+ padding: "16px",
137
+ display: "flex",
138
+ flexDirection: "column",
139
+ justifyContent: "center",
140
+ alignItems: "center",
141
+ boxSizing: "border-box",
142
+ gap: "8px",
143
+ };
144
+ };
145
+ this.getTailViewStyle = () => {
146
+ return {
147
+ font: fontHelper(this.themeService?.theme.typography.text3),
148
+ color: this.themeService.theme.palette.getAccent600()
129
149
  };
130
150
  };
131
151
  this.backButtonStyle = () => {
@@ -287,7 +307,7 @@ export class CometChatCallLogDetailsComponent {
287
307
  width: "100%",
288
308
  background: option?.backgroundColor ||
289
309
  this.themeService.theme.palette.getBackground(),
290
- borderRadius: "0",
310
+ borderRadius: "8px",
291
311
  titleFont: option?.titleFont ||
292
312
  fontHelper(this.themeService.theme.typography.title2),
293
313
  border: "none",
@@ -297,10 +317,10 @@ export class CometChatCallLogDetailsComponent {
297
317
  }
298
318
  }
299
319
  CometChatCallLogDetailsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: CometChatCallLogDetailsComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.CometChatThemeService }], target: i0.ɵɵFactoryTarget.Component });
300
- CometChatCallLogDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: CometChatCallLogDetailsComponent, selector: "cometchat-call-log-details", inputs: { call: "call", group: "group", user: "user", title: "title", onBackClick: "onBackClick", hideProfile: "hideProfile", subtitleView: "subtitleView", customProfileView: "customProfileView", backIconUrl: "backIconUrl", greaterThanIconURL: "greaterThanIconURL", callButtonsConfiguration: "callButtonsConfiguration", callLogParticipantsConfiguration: "callLogParticipantsConfiguration", callLogHistoryConfiguration: "callLogHistoryConfiguration", callLogRecordingsConfiguration: "callLogRecordingsConfiguration", onError: "onError", datePattern: "datePattern", datePattern2: "datePattern2", data: "data", avatarStyle: "avatarStyle", callDetailsStyle: "callDetailsStyle", listItemStyle: "listItemStyle", dateStyle: "dateStyle", callButtonsStyle: "callButtonsStyle" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cc-call-log-details__wrapper\" *ngIf=\"user || group\" [ngStyle]=\"wrapperStyle()\">\n\n <div class=\"cc-call-log-details__header\"\n *ngIf=\"onBackClick && !(showParticipantsList || showCallRecordingList || showCallHistory)\">\n <cometchat-button [iconURL]=\"backIconUrl\" class=\"cc-call-log-details__close-button\" [buttonStyle]=\"backButtonStyle()\"\n (cc-button-clicked)=\"onBackClick()\"></cometchat-button>\n <cometchat-label [text]=\"title\" [labelStyle]=\"getTitleStyle()\"></cometchat-label>\n </div>\n\n <div class=\"cc-call-log-details\">\n <div class=\"cc-call-log-details__profile\"\n *ngIf=\"!hideProfile && showCallLogDetailOptionList && !(showParticipantsList || showCallRecordingList || showCallHistory)\">\n\n\n <div class=\" cc-call-log-details__default-profile\" *ngIf=\"!customProfileView;else listitem\">\n <cometchat-avatar [name]=\"user?.getName() ?? group?.getName()\" [avatarStyle]=\"avatarStyle\"\n [image]=\"user?.getAvatar() ?? group?.getIcon()\">\n </cometchat-avatar>\n\n <cometchat-label [text]=\"user?.getName() ?? this.group?.getName()\"></cometchat-label>\n </div>\n </div>\n <div class=\"cc-call-log-details__section-list\"\n *ngIf=\"showCallLogDetailOptionList && defaultTemplate && defaultTemplate.length > 0\">\n <div class=\"cc-call-log-details__section\" *ngFor=\"let item of defaultTemplate\">\n <div class=\"cc-call-log-details__section-separator\" *ngIf=\"item.title\">\n <cometchat-label [text]=\"item.title\"></cometchat-label>\n </div>\n <div class=\"cc-call-log-details__options-wrapper\" *ngIf=\"getTemplateOptions(item)\">\n <div class=\"cc-call-log-details__options\" *ngFor=\"let option of getTemplateOptions(item); trackBy: trackByFnOption \">\n <div class=\"cc-call-log-details__option\" *ngIf=\"!getCustomOptionView(option);else customView\">\n <div class=\"cc-call-log-details__option-element\">\n\n <div class=\"cc-call-log-details__calling-default-option\" *ngIf=\"option.id=='calls'\">\n\n <cometchat-call-buttons [user]=\"user\" [group]=\"group\"\n [callButtonsStyle]=\"callButtonsConfiguration.callButtonsStyle\"\n [onVideoCallClick]=\"callButtonsConfiguration.onVideoCallClick\"\n [onVoiceCallClick]=\"callButtonsConfiguration.onVoiceCallClick\"\n [videoCallIconURL]=\"callButtonsConfiguration.videoCallIconURL\"\n [voiceCallIconURL]=\"callButtonsConfiguration.voiceCallIconURL\"></cometchat-call-buttons>\n </div>\n <cometchat-list-item *ngIf=\"option.id==='callStatus'\" [listItemStyle]=\"getListItemStyle(option)\"\n [hideSeparator]=\"true\">\n <div class=\"cc-call-log-details__call-Status\" slot=\"subtitleView\" >\n <div *ngIf=\"!subtitleView; else subtitle\" style=\"width: 100%;\">\n <div> <cometchat-date [dateStyle]=\"dateStyle\" [timestamp]=\"call?.getInitiatedAt()\"\n [pattern]=\"datePattern2\">\n </cometchat-date></div>\n\n <div\n class=\"cc-call-log-details__call-Status__subTitle\">\n <div>\n\n <cometchat-date [dateStyle]=\"dateStyle\" [timestamp]=\"call?.getInitiatedAt()\"\n [pattern]=\"datePattern\">\n </cometchat-date>\n <cometchat-label [text]=\"getSubtitle(call)\" [labelStyle]=\"subtitleStyle(option)\">\n </cometchat-label>\n </div>\n <div class=\"cc-call-log-details__call-Status__tailview\"> {{ getTailView(call?.getTotalDurationInMinutes()!) }}\n </div>\n\n </div>\n\n\n </div>\n\n <ng-template #subtitle>\n <ng-container *ngTemplateOutlet=\"subtitleView;context:{ $implicit: user ?? group }\">\n </ng-container>\n </ng-template>\n </div>\n\n\n </cometchat-list-item>\n <cometchat-list-item *ngIf=\"option.id!=='calls' && option.id!=='callStatus' \"\n (cc-listitem-clicked)=\"onOptionClick(option)\" [listItemStyle]=\"getListItemStyle(option)\"\n [title]=\"option.title\" [hideSeparator]=\"true\">\n \n <div slot=\"tailView\" class=\"cc-call-log-details__secondary-view__tail-view\"\n >\n {{option.tail}}\n <cometchat-icon [iconStyle]=\"iconStyle\" [URL]=\"greaterThanIconURL\"></cometchat-icon>\n </div>\n\n \n\n </cometchat-list-item>\n\n </div>\n <cometchat-divider [dividerStyle]=\"dividerStyle\"></cometchat-divider>\n </div>\n <ng-template #customView>\n <ng-container *ngTemplateOutlet=\"getCustomOptionView(option)\">\n </ng-container>\n </ng-template>\n </div>\n </div>\n </div>\n </div>\n\n\n\n <div *ngIf=\"showParticipantsList || showCallRecordingList || showCallHistory\" style=\" height: 100%;\">\n\n <div *ngIf=\"showParticipantsList\" style=\"height: 100%;\">\n <cometchat-call-log-participants [call]=\"call\"\n [onBackClick]=\"callLogParticipantsConfiguration.onBackClick || handlePageOnBackClick\"\n [backIconUrl]=\"callLogParticipantsConfiguration.backIconUrl || backIconUrl\"\n [avatarStyle]=\"callLogParticipantsConfiguration.avatarStyle\"\n [onItemClick]=\"callLogParticipantsConfiguration.onItemClick!\"\n [datePattern]=\"callLogParticipantsConfiguration.datePattern\"\n [subtitleView]=\"callLogParticipantsConfiguration.subtitleView\"\n [listItemView]=\"callLogParticipantsConfiguration.listItemView\"\n\n [listItemStyle]=\"callLogParticipantsConfiguration.listItemStyle\" [callLogParticipantsStyle]=\"\n callLogParticipantsConfiguration.callLogParticipantsStyle\"\n \n [tailView]=\"callLogParticipantsConfiguration.tailView\"></cometchat-call-log-participants>\n </div>\n <div *ngIf=\"showCallRecordingList\" style=\"height:100%;\">\n <cometchat-call-log-recordings [call]=\"call\"\n [backIconUrl]=\"callLogRecordingsConfiguration.backIconUrl || backIconUrl\" [onBackClick]=\"\n callLogRecordingsConfiguration.onBackClick || handlePageOnBackClick\n \" [onItemClick]=\"callLogRecordingsConfiguration.onItemClick!\"\n [datePattern]=\"callLogRecordingsConfiguration.datePattern!\"\n [listItemStyle]=\"callLogRecordingsConfiguration.listItemStyle\" callLogRecordingsStyle=\"\n callLogRecordingsConfiguration.callLogRecordingsStyle\n callLogRecordingsConfiguration.hideDownloadButton || false\n \" [onDownloadClick]=\"callLogRecordingsConfiguration.onDownloadClick!\"\n [listItemView]=\"callLogRecordingsConfiguration.listItemView\"\n [subtitleView]=\"callLogRecordingsConfiguration.subtitleView\"\n [tailView]=\"callLogRecordingsConfiguration.tailView\"></cometchat-call-log-recordings>\n </div>\n <div *ngIf=\"showCallHistory\" style=\"height: 100%; \">\n <cometchat-call-log-history [call]=\"call\" [user]=\"user\" [group]=\"group\" [onBackClick]=\"handlePageOnBackClick\"\n [backIconUrl]=\"callLogHistoryConfiguration.backIconUrl || backIconUrl\"\n [emptyStateView]=\"callLogHistoryConfiguration.emptyStateView\"\n [errorStateView]=\"callLogHistoryConfiguration.errorStateView\"\n [loadingIconURL]=\"callLogHistoryConfiguration.loadingIconURL\"\n [loadingStateView]=\"callLogHistoryConfiguration.loadingStateView\"\n [tailView]=\"callLogHistoryConfiguration.tailView\" [callLogRequestBuilder]=\"\n callLogHistoryConfiguration.callLogRequestBuilder\n \" [onItemClick]=\"callLogHistoryConfiguration.onItemClick || onItemClick\" [onBackClick]=\"\n callLogHistoryConfiguration.onBackClick || handlePageOnBackClick\n \" [listItemStyle]=\"callLogHistoryConfiguration.listItemStyle\"\n [datePattern]=\"callLogHistoryConfiguration.datePattern\" [dateSeparatorPattern]=\"\n callLogHistoryConfiguration.dateSeparatorPattern\n \" [callLogHistoryStyle]=\"\n callLogHistoryConfiguration.callLogHistoryStyle\n \" [onError]=\"callLogHistoryConfiguration.onError!\"></cometchat-call-log-history>\n </div>\n\n </div>\n </div>\n</div>\n\n\n<ng-template #listitem>\n <ng-container *ngTemplateOutlet=\"customProfileView\">\n </ng-container>\n</ng-template>", styles: ["*{box-sizing:border-box;margin:0;padding:0}.cc-call-log-details__header{display:flex;gap:10px;align-items:center;height:3%}.cc-call-log-details{height:98%}.cc-call-log-details__profile{display:flex;align-items:center;justify-content:center}.cc-call-log-details__default-profile{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%}.cc-call-log-details__section{margin:10px 3px 3px}.cc-call-log-details__option{margin-top:5px}.cc-call-log-details__calling-default-option{display:flex;align-items:center;justify-content:center;margin:10px}.cc-call-log-details__call-Status{display:flex;justify-content:space-between}.cc-call-log-details__call-Status__subTitle{display:flex;justify-content:space-between;margin:10px 0;padding-right:8px;width:100%}.cc-call-log-details__call-Status__tailview{color:gray}.cc-call-log-details__secondary-view__tail-view{display:flex;align-items:center;justify-content:center;gap:5px;color:RGBA(20,20,20,.68)}\n"], components: [{ type: i2.CometChatCallButtonsComponent, selector: "cometchat-call-buttons", inputs: ["user", "group", "voiceCallIconURL", "voiceCallIconText", "voiceCallIconHoverText", "videoCallIconURL", "videoCallIconText", "videoCallIconHoverText", "onVoiceCallClick", "onVideoCallClick", "onError", "callButtonsStyle", "outgoingCallConfiguration", "ongoingCallConfiguration"] }, { type: i3.CometChatCallLogParticipantsComponent, selector: "cometchat-call-log-participants", inputs: ["title", "call", "backIconUrl", "onBackClick", "datePattern", "subtitleView", "listItemView", "onError", "hideSeparator", "avatarStyle", "dateStyle", "CallLogParticipantsStyle", "listItemStyle"] }, { type: i4.CometChatCallLogRecordingsComponent, selector: "cometchat-call-log-recordings", inputs: ["title", "call", "onBackClick", "backIconURL", "datePattern", "subtitleView", "listItemView", "downloadIconURL", "onDownloadClick", "hideDownloadButton", "onError", "avatarStyle", "dateStyle", "CallLogRecordingsStyle", "listItemStyle", "options"] }, { type: i5.CometChatCallLogHistoryComponent, selector: "cometchat-call-log-history", inputs: ["user", "group", "title", "emptyStateView", "errorStateView", "loadingStateView", "subtitleView", "listItemView", "menu", "emptyStateText", "errorStateText", "loadingIconURL", "backIconUrl", "onItemClick", "onBackClick", "callLogRequestBuilder", "DateSeparatorPattern", "hideSeparator", "dateSeparatorStyle", "hideError", "onError", "showSectionHeader", "sectionHeaderField", "datePattern", "avatarStyle", "dateStyle", "CallLogHistoryStyle", "listItemStyle"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
320
+ CometChatCallLogDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: CometChatCallLogDetailsComponent, selector: "cometchat-call-log-details", inputs: { call: "call", group: "group", user: "user", title: "title", onBackClick: "onBackClick", hideProfile: "hideProfile", subtitleView: "subtitleView", customProfileView: "customProfileView", backIconUrl: "backIconUrl", greaterThanIconURL: "greaterThanIconURL", callButtonsConfiguration: "callButtonsConfiguration", callLogParticipantsConfiguration: "callLogParticipantsConfiguration", callLogHistoryConfiguration: "callLogHistoryConfiguration", callLogRecordingsConfiguration: "callLogRecordingsConfiguration", onError: "onError", datePattern: "datePattern", datePattern2: "datePattern2", data: "data", avatarStyle: "avatarStyle", labelStyle: "labelStyle", callDetailsStyle: "callDetailsStyle", listItemStyle: "listItemStyle", dateStyle: "dateStyle", callButtonsStyle: "callButtonsStyle" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"cc-call-log-details__wrapper\" *ngIf=\"user || group\" [ngStyle]=\"wrapperStyle()\">\n\n <div class=\"cc-call-log-details__header\"\n *ngIf=\"onBackClick && !(showParticipantsList || showCallRecordingList || showCallHistory)\">\n <cometchat-button [iconURL]=\"backIconUrl\" class=\"cc-call-log-details__close-button\" [buttonStyle]=\"backButtonStyle()\"\n (cc-button-clicked)=\"onBackClick()\"></cometchat-button>\n <cometchat-label [text]=\"title\" [labelStyle]=\"getTitleStyle()\"></cometchat-label>\n </div>\n\n <div class=\"cc-call-log-details\">\n <div class=\"cc-call-log-details__profile\"\n *ngIf=\"!hideProfile && showCallLogDetailOptionList && !(showParticipantsList || showCallRecordingList || showCallHistory)\">\n\n\n <div class=\" cc-call-log-details__default-profile\" *ngIf=\"!customProfileView;else listitem\" [ngStyle]=\"profileContainerStyle()\">\n <cometchat-avatar [name]=\"user?.getName() ?? group?.getName()\" [avatarStyle]=\"avatarStyle\"\n [image]=\"user?.getAvatar() ?? group?.getIcon()\">\n </cometchat-avatar>\n\n <cometchat-label [text]=\"user?.getName() ?? this.group?.getName()\" [labelStyle]=\"labelStyle\"></cometchat-label>\n </div>\n </div>\n <div class=\"cc-call-log-details__section-list\"\n *ngIf=\"showCallLogDetailOptionList && defaultTemplate && defaultTemplate.length > 0\">\n <div class=\"cc-call-log-details__section\" *ngFor=\"let item of defaultTemplate\">\n <div class=\"cc-call-log-details__section-separator\" *ngIf=\"item.title\">\n <cometchat-label [text]=\"item.title\"></cometchat-label>\n </div>\n <div class=\"cc-call-log-details__options-wrapper\" *ngIf=\"getTemplateOptions(item)\">\n <div class=\"cc-call-log-details__options\" *ngFor=\"let option of getTemplateOptions(item); trackBy: trackByFnOption \">\n <div class=\"cc-call-log-details__option\" *ngIf=\"!getCustomOptionView(option);else customView\">\n <div class=\"cc-call-log-details__option-element\">\n\n <div class=\"cc-call-log-details__calling-default-option\" *ngIf=\"option.id=='calls'\">\n\n <cometchat-call-buttons [user]=\"user\" [group]=\"group\"\n [callButtonsStyle]=\"callButtonsConfiguration.callButtonsStyle\"\n [onVideoCallClick]=\"callButtonsConfiguration.onVideoCallClick\"\n [onVoiceCallClick]=\"callButtonsConfiguration.onVoiceCallClick\"\n [videoCallIconURL]=\"callButtonsConfiguration.videoCallIconURL\"\n [voiceCallIconURL]=\"callButtonsConfiguration.voiceCallIconURL\"></cometchat-call-buttons>\n </div>\n <cometchat-list-item *ngIf=\"option.id==='callStatus'\" [listItemStyle]=\"getListItemStyle(option)\"\n [hideSeparator]=\"true\">\n <div class=\"cc-call-log-details__call-Status\" slot=\"subtitleView\" >\n <div *ngIf=\"!subtitleView; else subtitle\" style=\"width: 100%;\">\n <div> <cometchat-date [dateStyle]=\"dateStyle\" [timestamp]=\"call?.getInitiatedAt()\"\n [pattern]=\"datePattern2\">\n </cometchat-date></div>\n\n <div\n class=\"cc-call-log-details__call-Status__subTitle\">\n <div>\n\n <cometchat-date [dateStyle]=\"dateStyle\" [timestamp]=\"call?.getInitiatedAt()\"\n [pattern]=\"datePattern\">\n </cometchat-date>\n <cometchat-label [text]=\"getSubtitle(call)\" [labelStyle]=\"subtitleStyle(option)\">\n </cometchat-label>\n </div>\n <div class=\"cc-call-log-details__call-Status__tailview\" [style]=\"getTailViewStyle()\"> {{ getTailView(call?.getTotalDurationInMinutes()!) }}\n </div>\n\n </div>\n\n\n </div>\n\n <ng-template #subtitle>\n <ng-container *ngTemplateOutlet=\"subtitleView;context:{ $implicit: user ?? group }\">\n </ng-container>\n </ng-template>\n </div>\n\n\n </cometchat-list-item>\n <cometchat-list-item *ngIf=\"option.id!=='calls' && option.id!=='callStatus' \"\n (cc-listitem-clicked)=\"onOptionClick(option)\" [listItemStyle]=\"getListItemStyle(option)\"\n [title]=\"option.title\" [hideSeparator]=\"true\">\n \n <div slot=\"tailView\" class=\"cc-call-log-details__secondary-view__tail-view\" [style]=\"getTailViewStyle()\"\n >\n {{option.tail}}\n <cometchat-icon [iconStyle]=\"iconStyle\" [URL]=\"greaterThanIconURL\"></cometchat-icon>\n </div>\n\n \n\n </cometchat-list-item>\n\n </div>\n </div>\n <ng-template #customView>\n <ng-container *ngTemplateOutlet=\"getCustomOptionView(option)\">\n </ng-container>\n </ng-template>\n </div>\n </div>\n </div>\n </div>\n\n\n\n <div *ngIf=\"showParticipantsList || showCallRecordingList || showCallHistory\" style=\" height: 100%;\">\n\n <div *ngIf=\"showParticipantsList\" style=\"height: 100%;\">\n <cometchat-call-log-participants [call]=\"call\"\n [onBackClick]=\"callLogParticipantsConfiguration.onBackClick || handlePageOnBackClick\"\n [backIconUrl]=\"callLogParticipantsConfiguration.backIconUrl || backIconUrl\"\n [avatarStyle]=\"callLogParticipantsConfiguration.avatarStyle\"\n [onItemClick]=\"callLogParticipantsConfiguration.onItemClick!\"\n [datePattern]=\"callLogParticipantsConfiguration.datePattern\"\n [subtitleView]=\"callLogParticipantsConfiguration.subtitleView\"\n [listItemView]=\"callLogParticipantsConfiguration.listItemView\"\n\n [listItemStyle]=\"callLogParticipantsConfiguration.listItemStyle\" [callLogParticipantsStyle]=\"\n callLogParticipantsConfiguration.callLogParticipantsStyle\"\n \n [tailView]=\"callLogParticipantsConfiguration.tailView\"></cometchat-call-log-participants>\n </div>\n <div *ngIf=\"showCallRecordingList\" style=\"height:100%;\">\n <cometchat-call-log-recordings [call]=\"call\"\n [backIconUrl]=\"callLogRecordingsConfiguration.backIconUrl || backIconUrl\" [onBackClick]=\"\n callLogRecordingsConfiguration.onBackClick || handlePageOnBackClick\n \" [onItemClick]=\"callLogRecordingsConfiguration.onItemClick!\"\n [datePattern]=\"callLogRecordingsConfiguration.datePattern!\"\n [listItemStyle]=\"callLogRecordingsConfiguration.listItemStyle\" callLogRecordingsStyle=\"\n callLogRecordingsConfiguration.callLogRecordingsStyle\n callLogRecordingsConfiguration.hideDownloadButton || false\n \" [onDownloadClick]=\"callLogRecordingsConfiguration.onDownloadClick!\"\n [listItemView]=\"callLogRecordingsConfiguration.listItemView\"\n [subtitleView]=\"callLogRecordingsConfiguration.subtitleView\"\n [tailView]=\"callLogRecordingsConfiguration.tailView\"></cometchat-call-log-recordings>\n </div>\n <div *ngIf=\"showCallHistory\" style=\"height: 100%; \">\n <cometchat-call-log-history [call]=\"call\" [user]=\"user\" [group]=\"group\" [onBackClick]=\"handlePageOnBackClick\"\n [backIconUrl]=\"callLogHistoryConfiguration.backIconUrl || backIconUrl\"\n [emptyStateView]=\"callLogHistoryConfiguration.emptyStateView\"\n [errorStateView]=\"callLogHistoryConfiguration.errorStateView\"\n [loadingIconURL]=\"callLogHistoryConfiguration.loadingIconURL\"\n [loadingStateView]=\"callLogHistoryConfiguration.loadingStateView\"\n [tailView]=\"callLogHistoryConfiguration.tailView\" [callLogRequestBuilder]=\"\n callLogHistoryConfiguration.callLogRequestBuilder\n \" [onItemClick]=\"callLogHistoryConfiguration.onItemClick || onItemClick\" [onBackClick]=\"\n callLogHistoryConfiguration.onBackClick || handlePageOnBackClick\n \" [listItemStyle]=\"callLogHistoryConfiguration.listItemStyle\"\n [datePattern]=\"callLogHistoryConfiguration.datePattern\" [dateSeparatorPattern]=\"\n callLogHistoryConfiguration.dateSeparatorPattern\n \" [callLogHistoryStyle]=\"\n callLogHistoryConfiguration.callLogHistoryStyle\n \" [onError]=\"callLogHistoryConfiguration.onError!\"></cometchat-call-log-history>\n </div>\n\n </div>\n </div>\n</div>\n\n\n<ng-template #listitem>\n <ng-container *ngTemplateOutlet=\"customProfileView\">\n </ng-container>\n</ng-template>", styles: ["*{box-sizing:border-box;margin:0;padding:0}.cc-call-log-details__header{display:flex;gap:10px;align-items:center;height:3%}.cc-call-log-details{height:98%}.cc-call-log-details__profile{display:flex;align-items:center;justify-content:center}.cc-call-log-details__default-profile{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%}.cc-call-log-details__section{margin:10px 3px 3px}.cc-call-log-details__option{margin-top:5px}.cc-call-log-details__calling-default-option{display:flex;align-items:center;justify-content:center;margin:10px}.cc-call-log-details__call-Status{display:flex;justify-content:space-between}.cc-call-log-details__call-Status__subTitle{display:flex;justify-content:space-between;margin:10px 0;padding-right:8px;width:100%}.cc-call-log-details__call-Status__tailview{color:gray}.cc-call-log-details__secondary-view__tail-view{display:flex;align-items:center;justify-content:center;gap:5px;color:RGBA(20,20,20,.68)}\n"], components: [{ type: i2.CometChatCallButtonsComponent, selector: "cometchat-call-buttons", inputs: ["user", "group", "voiceCallIconURL", "voiceCallIconText", "voiceCallIconHoverText", "videoCallIconURL", "videoCallIconText", "videoCallIconHoverText", "onVoiceCallClick", "onVideoCallClick", "onError", "callButtonsStyle", "outgoingCallConfiguration", "ongoingCallConfiguration"] }, { type: i3.CometChatCallLogParticipantsComponent, selector: "cometchat-call-log-participants", inputs: ["title", "call", "backIconUrl", "onBackClick", "datePattern", "subtitleView", "listItemView", "onError", "hideSeparator", "avatarStyle", "dateStyle", "CallLogParticipantsStyle", "listItemStyle"] }, { type: i4.CometChatCallLogRecordingsComponent, selector: "cometchat-call-log-recordings", inputs: ["title", "call", "onBackClick", "backIconURL", "datePattern", "subtitleView", "listItemView", "downloadIconURL", "onDownloadClick", "hideDownloadButton", "onError", "avatarStyle", "dateStyle", "CallLogRecordingsStyle", "listItemStyle", "options"] }, { type: i5.CometChatCallLogHistoryComponent, selector: "cometchat-call-log-history", inputs: ["user", "group", "title", "emptyStateView", "errorStateView", "loadingStateView", "subtitleView", "listItemView", "menu", "emptyStateText", "errorStateText", "loadingIconURL", "backIconUrl", "onItemClick", "onBackClick", "callLogRequestBuilder", "DateSeparatorPattern", "hideSeparator", "dateSeparatorStyle", "hideError", "onError", "showSectionHeader", "sectionHeaderField", "datePattern", "avatarStyle", "dateStyle", "CallLogHistoryStyle", "listItemStyle"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
301
321
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: CometChatCallLogDetailsComponent, decorators: [{
302
322
  type: Component,
303
- args: [{ selector: "cometchat-call-log-details", changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cc-call-log-details__wrapper\" *ngIf=\"user || group\" [ngStyle]=\"wrapperStyle()\">\n\n <div class=\"cc-call-log-details__header\"\n *ngIf=\"onBackClick && !(showParticipantsList || showCallRecordingList || showCallHistory)\">\n <cometchat-button [iconURL]=\"backIconUrl\" class=\"cc-call-log-details__close-button\" [buttonStyle]=\"backButtonStyle()\"\n (cc-button-clicked)=\"onBackClick()\"></cometchat-button>\n <cometchat-label [text]=\"title\" [labelStyle]=\"getTitleStyle()\"></cometchat-label>\n </div>\n\n <div class=\"cc-call-log-details\">\n <div class=\"cc-call-log-details__profile\"\n *ngIf=\"!hideProfile && showCallLogDetailOptionList && !(showParticipantsList || showCallRecordingList || showCallHistory)\">\n\n\n <div class=\" cc-call-log-details__default-profile\" *ngIf=\"!customProfileView;else listitem\">\n <cometchat-avatar [name]=\"user?.getName() ?? group?.getName()\" [avatarStyle]=\"avatarStyle\"\n [image]=\"user?.getAvatar() ?? group?.getIcon()\">\n </cometchat-avatar>\n\n <cometchat-label [text]=\"user?.getName() ?? this.group?.getName()\"></cometchat-label>\n </div>\n </div>\n <div class=\"cc-call-log-details__section-list\"\n *ngIf=\"showCallLogDetailOptionList && defaultTemplate && defaultTemplate.length > 0\">\n <div class=\"cc-call-log-details__section\" *ngFor=\"let item of defaultTemplate\">\n <div class=\"cc-call-log-details__section-separator\" *ngIf=\"item.title\">\n <cometchat-label [text]=\"item.title\"></cometchat-label>\n </div>\n <div class=\"cc-call-log-details__options-wrapper\" *ngIf=\"getTemplateOptions(item)\">\n <div class=\"cc-call-log-details__options\" *ngFor=\"let option of getTemplateOptions(item); trackBy: trackByFnOption \">\n <div class=\"cc-call-log-details__option\" *ngIf=\"!getCustomOptionView(option);else customView\">\n <div class=\"cc-call-log-details__option-element\">\n\n <div class=\"cc-call-log-details__calling-default-option\" *ngIf=\"option.id=='calls'\">\n\n <cometchat-call-buttons [user]=\"user\" [group]=\"group\"\n [callButtonsStyle]=\"callButtonsConfiguration.callButtonsStyle\"\n [onVideoCallClick]=\"callButtonsConfiguration.onVideoCallClick\"\n [onVoiceCallClick]=\"callButtonsConfiguration.onVoiceCallClick\"\n [videoCallIconURL]=\"callButtonsConfiguration.videoCallIconURL\"\n [voiceCallIconURL]=\"callButtonsConfiguration.voiceCallIconURL\"></cometchat-call-buttons>\n </div>\n <cometchat-list-item *ngIf=\"option.id==='callStatus'\" [listItemStyle]=\"getListItemStyle(option)\"\n [hideSeparator]=\"true\">\n <div class=\"cc-call-log-details__call-Status\" slot=\"subtitleView\" >\n <div *ngIf=\"!subtitleView; else subtitle\" style=\"width: 100%;\">\n <div> <cometchat-date [dateStyle]=\"dateStyle\" [timestamp]=\"call?.getInitiatedAt()\"\n [pattern]=\"datePattern2\">\n </cometchat-date></div>\n\n <div\n class=\"cc-call-log-details__call-Status__subTitle\">\n <div>\n\n <cometchat-date [dateStyle]=\"dateStyle\" [timestamp]=\"call?.getInitiatedAt()\"\n [pattern]=\"datePattern\">\n </cometchat-date>\n <cometchat-label [text]=\"getSubtitle(call)\" [labelStyle]=\"subtitleStyle(option)\">\n </cometchat-label>\n </div>\n <div class=\"cc-call-log-details__call-Status__tailview\"> {{ getTailView(call?.getTotalDurationInMinutes()!) }}\n </div>\n\n </div>\n\n\n </div>\n\n <ng-template #subtitle>\n <ng-container *ngTemplateOutlet=\"subtitleView;context:{ $implicit: user ?? group }\">\n </ng-container>\n </ng-template>\n </div>\n\n\n </cometchat-list-item>\n <cometchat-list-item *ngIf=\"option.id!=='calls' && option.id!=='callStatus' \"\n (cc-listitem-clicked)=\"onOptionClick(option)\" [listItemStyle]=\"getListItemStyle(option)\"\n [title]=\"option.title\" [hideSeparator]=\"true\">\n \n <div slot=\"tailView\" class=\"cc-call-log-details__secondary-view__tail-view\"\n >\n {{option.tail}}\n <cometchat-icon [iconStyle]=\"iconStyle\" [URL]=\"greaterThanIconURL\"></cometchat-icon>\n </div>\n\n \n\n </cometchat-list-item>\n\n </div>\n <cometchat-divider [dividerStyle]=\"dividerStyle\"></cometchat-divider>\n </div>\n <ng-template #customView>\n <ng-container *ngTemplateOutlet=\"getCustomOptionView(option)\">\n </ng-container>\n </ng-template>\n </div>\n </div>\n </div>\n </div>\n\n\n\n <div *ngIf=\"showParticipantsList || showCallRecordingList || showCallHistory\" style=\" height: 100%;\">\n\n <div *ngIf=\"showParticipantsList\" style=\"height: 100%;\">\n <cometchat-call-log-participants [call]=\"call\"\n [onBackClick]=\"callLogParticipantsConfiguration.onBackClick || handlePageOnBackClick\"\n [backIconUrl]=\"callLogParticipantsConfiguration.backIconUrl || backIconUrl\"\n [avatarStyle]=\"callLogParticipantsConfiguration.avatarStyle\"\n [onItemClick]=\"callLogParticipantsConfiguration.onItemClick!\"\n [datePattern]=\"callLogParticipantsConfiguration.datePattern\"\n [subtitleView]=\"callLogParticipantsConfiguration.subtitleView\"\n [listItemView]=\"callLogParticipantsConfiguration.listItemView\"\n\n [listItemStyle]=\"callLogParticipantsConfiguration.listItemStyle\" [callLogParticipantsStyle]=\"\n callLogParticipantsConfiguration.callLogParticipantsStyle\"\n \n [tailView]=\"callLogParticipantsConfiguration.tailView\"></cometchat-call-log-participants>\n </div>\n <div *ngIf=\"showCallRecordingList\" style=\"height:100%;\">\n <cometchat-call-log-recordings [call]=\"call\"\n [backIconUrl]=\"callLogRecordingsConfiguration.backIconUrl || backIconUrl\" [onBackClick]=\"\n callLogRecordingsConfiguration.onBackClick || handlePageOnBackClick\n \" [onItemClick]=\"callLogRecordingsConfiguration.onItemClick!\"\n [datePattern]=\"callLogRecordingsConfiguration.datePattern!\"\n [listItemStyle]=\"callLogRecordingsConfiguration.listItemStyle\" callLogRecordingsStyle=\"\n callLogRecordingsConfiguration.callLogRecordingsStyle\n callLogRecordingsConfiguration.hideDownloadButton || false\n \" [onDownloadClick]=\"callLogRecordingsConfiguration.onDownloadClick!\"\n [listItemView]=\"callLogRecordingsConfiguration.listItemView\"\n [subtitleView]=\"callLogRecordingsConfiguration.subtitleView\"\n [tailView]=\"callLogRecordingsConfiguration.tailView\"></cometchat-call-log-recordings>\n </div>\n <div *ngIf=\"showCallHistory\" style=\"height: 100%; \">\n <cometchat-call-log-history [call]=\"call\" [user]=\"user\" [group]=\"group\" [onBackClick]=\"handlePageOnBackClick\"\n [backIconUrl]=\"callLogHistoryConfiguration.backIconUrl || backIconUrl\"\n [emptyStateView]=\"callLogHistoryConfiguration.emptyStateView\"\n [errorStateView]=\"callLogHistoryConfiguration.errorStateView\"\n [loadingIconURL]=\"callLogHistoryConfiguration.loadingIconURL\"\n [loadingStateView]=\"callLogHistoryConfiguration.loadingStateView\"\n [tailView]=\"callLogHistoryConfiguration.tailView\" [callLogRequestBuilder]=\"\n callLogHistoryConfiguration.callLogRequestBuilder\n \" [onItemClick]=\"callLogHistoryConfiguration.onItemClick || onItemClick\" [onBackClick]=\"\n callLogHistoryConfiguration.onBackClick || handlePageOnBackClick\n \" [listItemStyle]=\"callLogHistoryConfiguration.listItemStyle\"\n [datePattern]=\"callLogHistoryConfiguration.datePattern\" [dateSeparatorPattern]=\"\n callLogHistoryConfiguration.dateSeparatorPattern\n \" [callLogHistoryStyle]=\"\n callLogHistoryConfiguration.callLogHistoryStyle\n \" [onError]=\"callLogHistoryConfiguration.onError!\"></cometchat-call-log-history>\n </div>\n\n </div>\n </div>\n</div>\n\n\n<ng-template #listitem>\n <ng-container *ngTemplateOutlet=\"customProfileView\">\n </ng-container>\n</ng-template>", styles: ["*{box-sizing:border-box;margin:0;padding:0}.cc-call-log-details__header{display:flex;gap:10px;align-items:center;height:3%}.cc-call-log-details{height:98%}.cc-call-log-details__profile{display:flex;align-items:center;justify-content:center}.cc-call-log-details__default-profile{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%}.cc-call-log-details__section{margin:10px 3px 3px}.cc-call-log-details__option{margin-top:5px}.cc-call-log-details__calling-default-option{display:flex;align-items:center;justify-content:center;margin:10px}.cc-call-log-details__call-Status{display:flex;justify-content:space-between}.cc-call-log-details__call-Status__subTitle{display:flex;justify-content:space-between;margin:10px 0;padding-right:8px;width:100%}.cc-call-log-details__call-Status__tailview{color:gray}.cc-call-log-details__secondary-view__tail-view{display:flex;align-items:center;justify-content:center;gap:5px;color:RGBA(20,20,20,.68)}\n"] }]
323
+ args: [{ selector: "cometchat-call-log-details", changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"cc-call-log-details__wrapper\" *ngIf=\"user || group\" [ngStyle]=\"wrapperStyle()\">\n\n <div class=\"cc-call-log-details__header\"\n *ngIf=\"onBackClick && !(showParticipantsList || showCallRecordingList || showCallHistory)\">\n <cometchat-button [iconURL]=\"backIconUrl\" class=\"cc-call-log-details__close-button\" [buttonStyle]=\"backButtonStyle()\"\n (cc-button-clicked)=\"onBackClick()\"></cometchat-button>\n <cometchat-label [text]=\"title\" [labelStyle]=\"getTitleStyle()\"></cometchat-label>\n </div>\n\n <div class=\"cc-call-log-details\">\n <div class=\"cc-call-log-details__profile\"\n *ngIf=\"!hideProfile && showCallLogDetailOptionList && !(showParticipantsList || showCallRecordingList || showCallHistory)\">\n\n\n <div class=\" cc-call-log-details__default-profile\" *ngIf=\"!customProfileView;else listitem\" [ngStyle]=\"profileContainerStyle()\">\n <cometchat-avatar [name]=\"user?.getName() ?? group?.getName()\" [avatarStyle]=\"avatarStyle\"\n [image]=\"user?.getAvatar() ?? group?.getIcon()\">\n </cometchat-avatar>\n\n <cometchat-label [text]=\"user?.getName() ?? this.group?.getName()\" [labelStyle]=\"labelStyle\"></cometchat-label>\n </div>\n </div>\n <div class=\"cc-call-log-details__section-list\"\n *ngIf=\"showCallLogDetailOptionList && defaultTemplate && defaultTemplate.length > 0\">\n <div class=\"cc-call-log-details__section\" *ngFor=\"let item of defaultTemplate\">\n <div class=\"cc-call-log-details__section-separator\" *ngIf=\"item.title\">\n <cometchat-label [text]=\"item.title\"></cometchat-label>\n </div>\n <div class=\"cc-call-log-details__options-wrapper\" *ngIf=\"getTemplateOptions(item)\">\n <div class=\"cc-call-log-details__options\" *ngFor=\"let option of getTemplateOptions(item); trackBy: trackByFnOption \">\n <div class=\"cc-call-log-details__option\" *ngIf=\"!getCustomOptionView(option);else customView\">\n <div class=\"cc-call-log-details__option-element\">\n\n <div class=\"cc-call-log-details__calling-default-option\" *ngIf=\"option.id=='calls'\">\n\n <cometchat-call-buttons [user]=\"user\" [group]=\"group\"\n [callButtonsStyle]=\"callButtonsConfiguration.callButtonsStyle\"\n [onVideoCallClick]=\"callButtonsConfiguration.onVideoCallClick\"\n [onVoiceCallClick]=\"callButtonsConfiguration.onVoiceCallClick\"\n [videoCallIconURL]=\"callButtonsConfiguration.videoCallIconURL\"\n [voiceCallIconURL]=\"callButtonsConfiguration.voiceCallIconURL\"></cometchat-call-buttons>\n </div>\n <cometchat-list-item *ngIf=\"option.id==='callStatus'\" [listItemStyle]=\"getListItemStyle(option)\"\n [hideSeparator]=\"true\">\n <div class=\"cc-call-log-details__call-Status\" slot=\"subtitleView\" >\n <div *ngIf=\"!subtitleView; else subtitle\" style=\"width: 100%;\">\n <div> <cometchat-date [dateStyle]=\"dateStyle\" [timestamp]=\"call?.getInitiatedAt()\"\n [pattern]=\"datePattern2\">\n </cometchat-date></div>\n\n <div\n class=\"cc-call-log-details__call-Status__subTitle\">\n <div>\n\n <cometchat-date [dateStyle]=\"dateStyle\" [timestamp]=\"call?.getInitiatedAt()\"\n [pattern]=\"datePattern\">\n </cometchat-date>\n <cometchat-label [text]=\"getSubtitle(call)\" [labelStyle]=\"subtitleStyle(option)\">\n </cometchat-label>\n </div>\n <div class=\"cc-call-log-details__call-Status__tailview\" [style]=\"getTailViewStyle()\"> {{ getTailView(call?.getTotalDurationInMinutes()!) }}\n </div>\n\n </div>\n\n\n </div>\n\n <ng-template #subtitle>\n <ng-container *ngTemplateOutlet=\"subtitleView;context:{ $implicit: user ?? group }\">\n </ng-container>\n </ng-template>\n </div>\n\n\n </cometchat-list-item>\n <cometchat-list-item *ngIf=\"option.id!=='calls' && option.id!=='callStatus' \"\n (cc-listitem-clicked)=\"onOptionClick(option)\" [listItemStyle]=\"getListItemStyle(option)\"\n [title]=\"option.title\" [hideSeparator]=\"true\">\n \n <div slot=\"tailView\" class=\"cc-call-log-details__secondary-view__tail-view\" [style]=\"getTailViewStyle()\"\n >\n {{option.tail}}\n <cometchat-icon [iconStyle]=\"iconStyle\" [URL]=\"greaterThanIconURL\"></cometchat-icon>\n </div>\n\n \n\n </cometchat-list-item>\n\n </div>\n </div>\n <ng-template #customView>\n <ng-container *ngTemplateOutlet=\"getCustomOptionView(option)\">\n </ng-container>\n </ng-template>\n </div>\n </div>\n </div>\n </div>\n\n\n\n <div *ngIf=\"showParticipantsList || showCallRecordingList || showCallHistory\" style=\" height: 100%;\">\n\n <div *ngIf=\"showParticipantsList\" style=\"height: 100%;\">\n <cometchat-call-log-participants [call]=\"call\"\n [onBackClick]=\"callLogParticipantsConfiguration.onBackClick || handlePageOnBackClick\"\n [backIconUrl]=\"callLogParticipantsConfiguration.backIconUrl || backIconUrl\"\n [avatarStyle]=\"callLogParticipantsConfiguration.avatarStyle\"\n [onItemClick]=\"callLogParticipantsConfiguration.onItemClick!\"\n [datePattern]=\"callLogParticipantsConfiguration.datePattern\"\n [subtitleView]=\"callLogParticipantsConfiguration.subtitleView\"\n [listItemView]=\"callLogParticipantsConfiguration.listItemView\"\n\n [listItemStyle]=\"callLogParticipantsConfiguration.listItemStyle\" [callLogParticipantsStyle]=\"\n callLogParticipantsConfiguration.callLogParticipantsStyle\"\n \n [tailView]=\"callLogParticipantsConfiguration.tailView\"></cometchat-call-log-participants>\n </div>\n <div *ngIf=\"showCallRecordingList\" style=\"height:100%;\">\n <cometchat-call-log-recordings [call]=\"call\"\n [backIconUrl]=\"callLogRecordingsConfiguration.backIconUrl || backIconUrl\" [onBackClick]=\"\n callLogRecordingsConfiguration.onBackClick || handlePageOnBackClick\n \" [onItemClick]=\"callLogRecordingsConfiguration.onItemClick!\"\n [datePattern]=\"callLogRecordingsConfiguration.datePattern!\"\n [listItemStyle]=\"callLogRecordingsConfiguration.listItemStyle\" callLogRecordingsStyle=\"\n callLogRecordingsConfiguration.callLogRecordingsStyle\n callLogRecordingsConfiguration.hideDownloadButton || false\n \" [onDownloadClick]=\"callLogRecordingsConfiguration.onDownloadClick!\"\n [listItemView]=\"callLogRecordingsConfiguration.listItemView\"\n [subtitleView]=\"callLogRecordingsConfiguration.subtitleView\"\n [tailView]=\"callLogRecordingsConfiguration.tailView\"></cometchat-call-log-recordings>\n </div>\n <div *ngIf=\"showCallHistory\" style=\"height: 100%; \">\n <cometchat-call-log-history [call]=\"call\" [user]=\"user\" [group]=\"group\" [onBackClick]=\"handlePageOnBackClick\"\n [backIconUrl]=\"callLogHistoryConfiguration.backIconUrl || backIconUrl\"\n [emptyStateView]=\"callLogHistoryConfiguration.emptyStateView\"\n [errorStateView]=\"callLogHistoryConfiguration.errorStateView\"\n [loadingIconURL]=\"callLogHistoryConfiguration.loadingIconURL\"\n [loadingStateView]=\"callLogHistoryConfiguration.loadingStateView\"\n [tailView]=\"callLogHistoryConfiguration.tailView\" [callLogRequestBuilder]=\"\n callLogHistoryConfiguration.callLogRequestBuilder\n \" [onItemClick]=\"callLogHistoryConfiguration.onItemClick || onItemClick\" [onBackClick]=\"\n callLogHistoryConfiguration.onBackClick || handlePageOnBackClick\n \" [listItemStyle]=\"callLogHistoryConfiguration.listItemStyle\"\n [datePattern]=\"callLogHistoryConfiguration.datePattern\" [dateSeparatorPattern]=\"\n callLogHistoryConfiguration.dateSeparatorPattern\n \" [callLogHistoryStyle]=\"\n callLogHistoryConfiguration.callLogHistoryStyle\n \" [onError]=\"callLogHistoryConfiguration.onError!\"></cometchat-call-log-history>\n </div>\n\n </div>\n </div>\n</div>\n\n\n<ng-template #listitem>\n <ng-container *ngTemplateOutlet=\"customProfileView\">\n </ng-container>\n</ng-template>", styles: ["*{box-sizing:border-box;margin:0;padding:0}.cc-call-log-details__header{display:flex;gap:10px;align-items:center;height:3%}.cc-call-log-details{height:98%}.cc-call-log-details__profile{display:flex;align-items:center;justify-content:center}.cc-call-log-details__default-profile{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%}.cc-call-log-details__section{margin:10px 3px 3px}.cc-call-log-details__option{margin-top:5px}.cc-call-log-details__calling-default-option{display:flex;align-items:center;justify-content:center;margin:10px}.cc-call-log-details__call-Status{display:flex;justify-content:space-between}.cc-call-log-details__call-Status__subTitle{display:flex;justify-content:space-between;margin:10px 0;padding-right:8px;width:100%}.cc-call-log-details__call-Status__tailview{color:gray}.cc-call-log-details__secondary-view__tail-view{display:flex;align-items:center;justify-content:center;gap:5px;color:RGBA(20,20,20,.68)}\n"] }]
304
324
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.CometChatThemeService }]; }, propDecorators: { call: [{
305
325
  type: Input
306
326
  }], group: [{
@@ -339,6 +359,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImpo
339
359
  type: Input
340
360
  }], avatarStyle: [{
341
361
  type: Input
362
+ }], labelStyle: [{
363
+ type: Input
342
364
  }], callDetailsStyle: [{
343
365
  type: Input
344
366
  }], listItemStyle: [{
@@ -348,4 +370,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImpo
348
370
  }], callButtonsStyle: [{
349
371
  type: Input
350
372
  }] } });
351
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tZXRjaGF0LWNhbGwtbG9nLWRldGFpbHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2hhdC11aWtpdC1hbmd1bGFyL3NyYy9DYWxscy9Db21ldENoYXRDYWxsTG9nRGV0YWlscy9jb21ldGNoYXQtY2FsbC1sb2ctZGV0YWlscy9jb21ldGNoYXQtY2FsbC1sb2ctZGV0YWlscy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jaGF0LXVpa2l0LWFuZ3VsYXIvc3JjL0NhbGxzL0NvbWV0Q2hhdENhbGxMb2dEZXRhaWxzL2NvbWV0Y2hhdC1jYWxsLWxvZy1kZXRhaWxzL2NvbWV0Y2hhdC1jYWxsLWxvZy1kZXRhaWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUVMLHVCQUF1QixHQUt4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFDTCxXQUFXLEVBQ1gsU0FBUyxFQUVULGFBQWEsR0FDZCxNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFFTCx3QkFBd0IsRUFDeEIsbUJBQW1CLEVBQ25CLGdDQUFnQyxFQUNoQywyQkFBMkIsRUFDM0IsOEJBQThCLEdBQy9CLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUNMLFVBQVUsRUFDVixRQUFRLEVBSVIsWUFBWSxHQUViLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRTNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQTtBQUN2RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7O0FBUWxFLE1BQU0sT0FBTyxnQ0FBZ0M7SUFzRzNDLFlBQ1UsR0FBc0Is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LENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO1lBQzlELGVBQWUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO1NBQ2hFLENBQUM7SUFDSixDQUFDOzs4SEFyVlUsZ0NBQWdDO2tIQUFoQyxnQ0FBZ0MseTFCQzdDN0MsdXlSQWtLYzs0RkRySEQsZ0NBQWdDO2tCQU41QyxTQUFTOytCQUNFLDRCQUE0QixtQkFHckIsdUJBQXVCLENBQUMsTUFBTTs0SUFHdEMsSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBR0csZ0NBQWdDO3NCQUF4QyxLQUFLO2dCQUdHLDJCQUEyQjtzQkFBbkMsS0FBSztnQkFHRyw4QkFBOEI7c0JBQXRDLEtBQUs7Z0JBR0csT0FBTztzQkFBZixLQUFLO2dCQUtHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFNRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBS0csYUFBYTtzQkFBckIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBUZW1wbGF0ZVJlZixcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IFwiQGNvbWV0Y2hhdC91aWtpdC1lbGVtZW50c1wiO1xuaW1wb3J0IHtcbiAgQXZhdGFyU3R5bGUsXG4gIERhdGVTdHlsZSxcbiAgSWNvblN0eWxlLFxuICBMaXN0SXRlbVN0eWxlLFxufSBmcm9tIFwiQGNvbWV0Y2hhdC91aWtpdC1lbGVtZW50c1wiO1xuaW1wb3J0IHtcbiAgQ2FsbEJ1dHRvbnNTdHlsZSxcbiAgQ2FsbEJ1dHRvbnNDb25maWd1cmF0aW9uLFxuICBDYWxsTG9nRGV0YWlsc1N0eWxlLFxuICBDYWxsTG9nUGFydGljaXBhbnRzQ29uZmlndXJhdGlvbixcbiAgQ2FsbExvZ0hpc3RvcnlDb25maWd1cmF0aW9uLFxuICBDYWxsTG9nUmVjb3JkaW5nc0NvbmZpZ3VyYXRpb24sXG59IGZyb20gXCJAY29tZXRjaGF0L3Vpa2l0LXNoYXJlZFwiO1xuaW1wb3J0IHtcbiAgZm9udEhlbHBlcixcbiAgbG9jYWxpemUsXG4gIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLFxuICBDb21ldENoYXREZXRhaWxzT3B0aW9uLFxuICBDb21ldENoYXREZXRhaWxzVGVtcGxhdGUsXG4gIERhdGVQYXR0ZXJucyxcbiAgQ29tZXRDaGF0Q2FsbERldGFpbHNPcHRpb24sXG59IGZyb20gXCJAY29tZXRjaGF0L3Vpa2l0LXJlc291cmNlc1wiO1xuaW1wb3J0IHsgQ29tZXRDaGF0IH0gZnJvbSBcIkBjb21ldGNoYXQvY2hhdC1zZGstamF2YXNjcmlwdFwiO1xuaW1wb3J0IHsgQ29tZXRDaGF0VGhlbWVTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL0NvbWV0Q2hhdFRoZW1lLnNlcnZpY2VcIjtcbmltcG9ydCB7IENhbGxEZXRhaWxVdGlscyB9IGZyb20gXCIuLi8uLi8uLi9TaGFyZWQvVXRpbHMvQ2FsbERldGFpbFV0aWxzXCJcbmltcG9ydCB7IENhbGxMb2dVdGlscyB9IGZyb20gXCIuLi8uLi8uLi9TaGFyZWQvVXRpbHMvQ2FsbExvZ1V0aWxzXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJjb21ldGNoYXQtY2FsbC1sb2ctZGV0YWlsc1wiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2NvbWV0Y2hhdC1jYWxsLWxvZy1kZXRhaWxzLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9jb21ldGNoYXQtY2FsbC1sb2ctZGV0YWlscy5jb21wb25lbnQuc2Nzc1wiXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIENvbWV0Q2hhdENhbGxMb2dEZXRhaWxzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBjYWxsITogYW55O1xuICBASW5wdXQoKSBncm91cCE6IENvbWV0Q2hhdC5Hcm91cDtcbiAgQElucHV0KCkgdXNlciE6IENvbWV0Q2hhdC5Vc2VyO1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gbG9jYWxpemUoXCJDQUxMX0RFVEFJTFNcIik7XG4gIEBJbnB1dCgpIG9uQmFja0NsaWNrITogKCkgPT4gdm9pZDtcbiBcbiAgQElucHV0KCkgaGlkZVByb2ZpbGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc3VidGl0bGVWaWV3ITogVGVtcGxhdGVSZWY8YW55PjtcbiAgQElucHV0KCkgY3VzdG9tUHJvZmlsZVZpZXchOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBJbnB1dCgpIGJhY2tJY29uVXJsOiBzdHJpbmcgPSBcImFzc2V0cy9iYWNrYnV0dG9uLnN2Z1wiO1xuICBASW5wdXQoKSBncmVhdGVyVGhhbkljb25VUkw6IHN0cmluZyA9IFwiYXNzZXRzL2dyZWF0ZXJUaGFuSWNvbi5zdmdcIjtcblxuICBASW5wdXQoKSBjYWxsQnV0dG9uc0NvbmZpZ3VyYXRpb246IENhbGxCdXR0b25zQ29uZmlndXJhdGlvbiA9XG4gICAgbmV3IENhbGxCdXR0b25zQ29uZmlndXJhdGlvbih7fSk7XG5cbiAgQElucHV0KCkgY2FsbExvZ1BhcnRpY2lwYW50c0NvbmZpZ3VyYXRpb246IENhbGxMb2dQYXJ0aWNpcGFudHNDb25maWd1cmF0aW9uID1cbiAgICBuZXcgQ2FsbExvZ1BhcnRpY2lwYW50c0NvbmZpZ3VyYXRpb24oe30pO1xuXG4gIEBJbnB1dCgpIGNhbGxMb2dIaXN0b3J5Q29uZmlndXJhdGlvbjogQ2FsbExvZ0hpc3RvcnlDb25maWd1cmF0aW9uID1cbiAgICBuZXcgQ2FsbExvZ0hpc3RvcnlDb25maWd1cmF0aW9uKHt9KTtcblxuICBASW5wdXQoKSBjYWxsTG9nUmVjb3JkaW5nc0NvbmZpZ3VyYXRpb246IENhbGxMb2dSZWNvcmRpbmdzQ29uZmlndXJhdGlvbiA9XG4gICAgbmV3IENhbGxMb2dSZWNvcmRpbmdzQ29uZmlndXJhdGlvbih7fSk7XG5cbiAgQElucHV0KCkgb25FcnJvcjogKChlcnJvcjogQ29tZXRDaGF0LkNvbWV0Q2hhdEV4Y2VwdGlvbikgPT4gdm9pZCkgfCBudWxsID0gKFxuICAgIGVycm9yOiBDb21ldENoYXQuQ29tZXRDaGF0RXhjZXB0aW9uXG4gICkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgfTtcbiAgQElucHV0KCkgZGF0ZVBhdHRlcm46IERhdGVQYXR0ZXJucyA9IERhdGVQYXR0ZXJucy50aW1lO1xuICBASW5wdXQoKSBkYXRlUGF0dGVybjI6IERhdGVQYXR0ZXJucyA9IERhdGVQYXR0ZXJucy5EYXlEYXRlO1xuXG4gIEBJbnB1dCgpIGRhdGE6IENvbWV0Q2hhdERldGFpbHNUZW1wbGF0ZVtdID0gW107XG5cbiAgQElucHV0KCkgYXZhdGFyU3R5bGU6IEF2YXRhclN0eWxlID0ge1xuICAgIGJvcmRlclJhZGl1czogXCIxNnB4XCIsXG4gICAgd2lkdGg6IFwiMjhweFwiLFxuICAgIGhlaWdodDogXCIyOHB4XCIsXG4gICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgfTtcbiAgQElucHV0KCkgY2FsbERldGFpbHNTdHlsZTogQ2FsbExvZ0RldGFpbHNTdHlsZSA9IHtcbiAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgfTtcblxuICBASW5wdXQoKSBsaXN0SXRlbVN0eWxlOiBMaXN0SXRlbVN0eWxlID0ge307XG5cbiAgQElucHV0KCkgZGF0ZVN0eWxlOiBEYXRlU3R5bGUgPSB7fTtcbiAgQElucHV0KCkgY2FsbEJ1dHRvbnNTdHlsZTogQ2FsbEJ1dHRvbnNTdHlsZSA9IHtcbiAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgICBib3JkZXI6IFwibm9uZVwiLFxuICAgIGJvcmRlclJhZGl1czogXCIwXCIsXG4gICAgYmFja2dyb3VuZDogXCJ0cmFuc3BhcmVudFwiLFxuICB9O1xuXG4gIGljb25TdHlsZTogSWNvblN0eWxlID0ge1xuICAgIGhlaWdodDogXCIxNnB4XCIsXG4gICAgd2lkdGg6IFwiMTZweFwiLFxuICAgIGljb25UaW50OiBcIlJHQkEoMjAsIDIwLCAyMCwgMC42OClcIixcbiAgfTtcblxuICBkZWZhdWx0VGVtcGxhdGU6IENvbWV0Q2hhdERldGFpbHNUZW1wbGF0ZVtdID0gW107XG5cbiAgcHVibGljIGF1dGhUb2tlbjogc3RyaW5nID0gXCJcIjtcbiAgcHVibGljIGxvZ2dlZEluVXNlcjogQ29tZXRDaGF0LlVzZXIgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIHNob3dDYWxsTG9nRGV0YWlsT3B0aW9uTGlzdDogQm9vbGVhbiA9IHRydWU7XG4gIHB1YmxpYyBzaG93Q29tZXRDaGF0TWVzc2FnZXM6IEJvb2xlYW4gPSB0cnVlO1xuICBwdWJsaWMgc2hvd1BhcnRpY2lwYW50c0xpc3Q6IEJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHNob3dDYWxsUmVjb3JkaW5nTGlzdDogQm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgc2hvd0NhbGxIaXN0b3J5OiBCb29sZWFuID0gZmFsc2U7XG5cbiAgZGl2aWRlclN0eWxlOiBhbnkgPSB7XG4gICAgYmFja2dyb3VuZDogXCJyZ2IoMjIyIDIyMiAyMjIgLyA0NiUpXCIsXG4gICAgaGVpZ2h0OiBcIjFweFwiLFxuICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgfTtcblxuICBnZXRUaXRsZVN0eWxlKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0ZXh0Rm9udDpcbiAgICAgICAgdGhpcy5jYWxsRGV0YWlsc1N0eWxlLnRpdGxlRm9udCB8fFxuICAgICAgICBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkudGl0bGUxKSxcbiAgICAgIHRleHRDb2xvcjpcbiAgICAgICAgdGhpcy5jYWxsRGV0YWlsc1N0eWxlLnRpdGxlQ29sb3IgfHxcbiAgICAgICAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoKSxcbiAgICB9O1xuICB9XG4gIHB1YmxpYyB1c2VyTGlzdGVuZXJJZCA9IFwidXNlcmxpc3RfXCIgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgcHVibGljIHJlcXVlc3RCdWlsZGVyOiBhbnk7XG4gIHB1YmxpYyBsaW1pdDogbnVtYmVyID0gNTtcblxuICBwdWJsaWMgb25JdGVtQ2xpY2s6IChjYWxsOiBhbnkpID0+IHZvaWQgPSAoY2FsbDogYW55KSA9PiB7XG4gICAgdGhpcy5jYWxsID0gY2FsbDtcbiAgICB0aGlzLnNob3dDYWxsTG9nRGV0YWlsT3B0aW9uTGlzdCA9IHRydWU7XG4gICAgdGhpcy5zaG93Q2FsbEhpc3RvcnkgPSBmYWxzZTtcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH07XG4gIHR5cGVzOiBzdHJpbmdbXSA9IFtdO1xuICBjYXRlZ29yaWVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSB0aGVtZVNlcnZpY2U6IENvbWV0Q2hhdFRoZW1lU2VydmljZVxuICApIHt9XG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1tcInVzZXJcIl0gfHwgY2hhbmdlc1tcImdyb3VwXCJdKSB7XG4gICAgICB0aGlzLnNob3dDYWxsTG9nRGV0YWlsT3B0aW9uTGlzdCA9IHRydWU7XG4gICAgICB0aGlzLnNob3dQYXJ0aWNpcGFudHNMaXN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnNob3dDYWxsUmVjb3JkaW5nTGlzdCA9IGZhbHNlO1xuICAgICAgdGhpcy5zaG93Q2FsbEhpc3RvcnkgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2hvd0NvbWV0Q2hhdE1lc3NhZ2VzID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlTGlzdGVuZXIoKSB7XG4gICAgQ29tZXRDaGF0LnJlbW92ZVVzZXJMaXN0ZW5lcih0aGlzLnVzZXJMaXN0ZW5lcklkKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIENvbWV0Q2hhdC5nZXRMb2dnZWRpblVzZXIoKVxuICAgICAgLnRoZW4oKHVzZXI6IENvbWV0Q2hhdC5Vc2VyIHwgbnVsbCkgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlZEluVXNlciA9IHVzZXI7XG4gICAgICAgIHRoaXMuYXV0aFRva2VuID0gdGhpcy5sb2dnZWRJblVzZXIhLmdldEF1dGhUb2tlbigpO1xuICAgICAgICB0aGlzLmdldFRlbXBsYXRlKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcjogQ29tZXRDaGF0LkNvbWV0Q2hhdEV4Y2VwdGlvbikgPT4ge1xuICAgICAgICBpZiAodGhpcy5vbkVycm9yKSB7XG4gICAgICAgICAgdGhpcy5vbkVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICB0aGlzLnNldFRoZW1lU3R5bGUoKTtcbiAgfVxuXG4gIHRyYWNrQnlGbk9wdGlvbihpbmRleDogbnVtYmVyLCBvcHRpb246IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG9wdGlvbi5pZDtcbiAgfVxuICBnZXRUZW1wbGF0ZSgpIHtcbiAgICBpZiAodGhpcy5kYXRhICYmIHRoaXMuZGF0YT8ubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5kZWZhdWx0VGVtcGxhdGUgPSB0aGlzLmRhdGE7XG4gICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGVmYXVsdFRlbXBsYXRlID0gQ2FsbERldGFpbFV0aWxzLmdldERlZmF1bHRDYWxsVGVtcGxhdGUoXG4gICAgICAgIHRoaXMuY2FsbCxcbiAgICAgICAgdGhpcy5sb2dnZWRJblVzZXIhLFxuICAgICAgICB0aGlzLnRoZW1lU2VydmljZS50aGVtZVxuICAgICAgKTtcblxuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIGdldFRlbXBsYXRlT3B0aW9ucyA9ICh0ZW1wbGF0ZTogQ29tZXRDaGF0RGV0YWlsc1RlbXBsYXRlKSA9PiB7XG4gICAgaWYgKHRlbXBsYXRlLm9wdGlvbnMpIHtcbiAgICAgIHJldHVybiB0ZW1wbGF0ZS5vcHRpb25zKHRoaXMudXNlciwgdGhpcy5ncm91cCwgdGVtcGxhdGUuaWQgYXMgc3RyaW5nKTtcbiAgICB9IGVsc2UgcmV0dXJuIFtdO1xuICB9O1xuXG4gIGdldEN1c3RvbU9wdGlvblZpZXcob3B0aW9uOiBDb21ldENoYXREZXRhaWxzT3B0aW9uKSB7XG4gICAgcmV0dXJuIG9wdGlvbj8uY3VzdG9tVmlldztcbiAgfVxuXG4gIGdldFNlY3Rpb25IZWFkZXJTdHlsZSh0ZW1wbGF0ZTogQ29tZXRDaGF0RGV0YWlsc1RlbXBsYXRlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHRGb250OiB0ZW1wbGF0ZS50aXRsZUZvbnQsXG4gICAgICB0ZXh0Q29sb3I6IHRlbXBsYXRlLnRpdGxlQ29sb3IsXG4gICAgfTtcbiAgfVxuXG4gIG9uT3B0aW9uQ2xpY2sgPSAob3B0aW9uOiBDb21ldENoYXRDYWxsRGV0YWlsc09wdGlvbikgPT4ge1xuICAgIGlmIChvcHRpb24/Lm9uQ2xpY2spIHtcbiAgICAgIG9wdGlvbi5vbkNsaWNrKHRoaXMuY2FsbCEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKG9wdGlvbi5pZCkge1xuICAgICAgICBjYXNlIFwicGFydGljaXBhbnRzXCI6XG4gICAgICAgICAgdGhpcy5zaG93Q2FsbExvZ0RldGFpbE9wdGlvbkxpc3QgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnNob3dQYXJ0aWNpcGFudHNMaXN0ID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInJlY29yZGluZ3NcIjpcbiAgICAgICAgICB0aGlzLnNob3dDYWxsTG9nRGV0YWlsT3B0aW9uTGlzdCA9IGZhbHNlO1xuXG4gICAgICAgICAgdGhpcy5zaG93Q2FsbFJlY29yZGluZ0xpc3QgPSB0cnVlO1xuICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJjYWxsSGlzdG9yeVwiOlxuICAgICAgICAgIHRoaXMuc2hvd0NhbGxMb2dEZXRhaWxPcHRpb25MaXN0ID0gZmFsc2U7XG5cbiAgICAgICAgICB0aGlzLnNob3dDYWxsSGlzdG9yeSA9IHRydWU7XG4gICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgZ2V0QnV0dG9uU3R5bGUob3B0aW9uOiBDb21ldENoYXREZXRhaWxzT3B0aW9uKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICBib3JkZXI6IFwibm9uZVwiLFxuICAgICAgYm9yZGVyUmFkaXVzOiBcIjBcIixcbiAgICAgIGJ1dHRvblRleHRGb250OiBvcHRpb24/LnRpdGxlRm9udCxcbiAgICAgIGJ1dHRvblRleHRDb2xvcjogb3B0aW9uPy50aXRsZUNvbG9yLFxuICAgICAgYmFja2dyb3VuZDogb3B0aW9uPy5iYWNrZ3JvdW5kQ29sb3IgfHwgXCJ0cmFuc3BhcmVudFwiLFxuICAgIH07XG4gIH1cblxuXG4gIGhhbmRsZVBhZ2VPbkJhY2tDbGljayA9ICgpID0+IHtcbiAgICB0aGlzLnNob3dDYWxsSGlzdG9yeSA9IGZhbHNlO1xuICAgIHRoaXMuc2hvd0NhbGxSZWNvcmRpbmdMaXN0ID0gZmFsc2U7XG4gICAgdGhpcy5zaG93UGFydGljaXBhbnRzTGlzdCA9IGZhbHNlO1xuICAgIHRoaXMuc2hvd0NvbWV0Q2hhdE1lc3NhZ2VzID0gZmFsc2U7XG4gICAgdGhpcy5zaG93Q2FsbExvZ0RldGFpbE9wdGlvbkxpc3QgPSB0cnVlO1xuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfTtcblxuICBzdWJ0aXRsZVN0eWxlKHRlbXBsYXRlOiBDb21ldENoYXREZXRhaWxzVGVtcGxhdGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dEZvbnQ6IHRlbXBsYXRlLnRpdGxlRm9udCxcbiAgICAgIHRleHRDb2xvcjogdGVtcGxhdGUudGl0bGVDb2xvcixcbiAgICB9O1xuICB9XG4gIHNob3dEYXRhU2VjdGlvblN0eWxlKHRlbXBsYXRlOiBDb21ldENoYXREZXRhaWxzVGVtcGxhdGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dEZvbnQ6IHRlbXBsYXRlLnRpdGxlRm9udCxcbiAgICAgIHRleHRDb2xvcjogdGVtcGxhdGUudGl0bGVDb2xvcixcbiAgICB9O1xuICB9XG5cbiAgc2V0VGhlbWVTdHlsZSgpIHtcbiAgICB0aGlzLnNldERldGFpbHNTdHlsZSgpO1xuICAgIHRoaXMuc2V0QXZhdGFyU3R5bGUoKTtcbiAgICB0aGlzLnNldExpc3RJdGVtU3R5bGUoKTtcbiAgICB0aGlzLnNldERhdGVTdHlsZSgpO1xuICB9XG4gIHNldExpc3RJdGVtU3R5bGUoKSB7XG4gICAgbGV0IGRlZmF1bHRTdHlsZTogTGlzdEl0ZW1TdHlsZSA9IG5ldyBMaXN0SXRlbVN0eWxlKHtcbiAgICAgIGhlaWdodDogXCI0NXB4XCIsXG4gICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICBiYWNrZ3JvdW5kOlxuICAgICAgICB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDUwKCkgfHxcbiAgICAgICAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRCYWNrZ3JvdW5kKCksXG4gICAgICBhY3RpdmVCYWNrZ3JvdW5kOiBcInRyYW5zcGFyZW50XCIsXG4gICAgICBib3JkZXJSYWRpdXM6IFwiNXB4XCIsXG4gICAgICB0aXRsZUZvbnQ6IGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS50aXRsZTIpLFxuICAgICAgdGl0bGVDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoKSxcbiAgICAgIGJvcmRlcjogXCJub25lXCIsXG4gICAgICBzZXBhcmF0b3JDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQyMDAoKSxcbiAgICAgIGhvdmVyQmFja2dyb3VuZDogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQxMDAoKSxcbiAgICB9KTtcbiAgICB0aGlzLmxpc3RJdGVtU3R5bGUgPSB7IC4uLmRlZmF1bHRTdHlsZSwgLi4udGhpcy5saXN0SXRlbVN0eWxlIH07XG4gIH1cbiAgc2V0QXZhdGFyU3R5bGUoKSB7XG4gICAgbGV0IGRlZmF1bHRTdHlsZTogQXZhdGFyU3R5bGUgPSBuZXcgQXZhdGFyU3R5bGUoe1xuICAgICAgYm9yZGVyUmFkaXVzOiBcIjI0cHhcIixcbiAgICAgIHdpZHRoOiBcIjQ2cHhcIixcbiAgICAgIGhlaWdodDogXCI0NnB4XCIsXG4gICAgICBib3JkZXI6IFwibm9uZVwiLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDcwMCgpLFxuICAgICAgbmFtZVRleHRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ5MDAoKSxcbiAgICAgIGJhY2tncm91bmRTaXplOiBcImNvdmVyXCIsXG4gICAgICBuYW1lVGV4dEZvbnQ6IGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS5zdWJ0aXRsZTEpLFxuXG4gICAgICBvdXRlclZpZXdCb3JkZXJTcGFjaW5nOiBcIlwiLFxuICAgIH0pO1xuICAgIHRoaXMuYXZhdGFyU3R5bGUgPSB7IC4uLmRlZmF1bHRTdHlsZSwgLi4udGhpcy5hdmF0YXJTdHlsZSB9O1xuICB9XG5cbiAgc2V0RGV0YWlsc1N0eWxlKCkge1xuICAgIGxldCBkZWZhdWx0U3R5bGU6IENhbGxMb2dEZXRhaWxzU3R5bGUgPSBuZXcgQ2FsbExvZ0RldGFpbHNTdHlsZSh7XG4gICAgICBiYWNrZ3JvdW5kOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEJhY2tncm91bmQoKSxcbiAgICAgIHRpdGxlRm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRpdGxlMSksXG4gICAgICB0aXRsZUNvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudCgpLFxuICAgICAgYmFja0ljb25UaW50OiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldFByaW1hcnkoKSxcbiAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgICBib3JkZXJSYWRpdXM6IFwiXCIsXG4gICAgICBuYW1lVGV4dEZvbnQ6IGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS5zdWJ0aXRsZTIpLFxuICAgIH0pO1xuICAgIHRoaXMuY2FsbERldGFpbHNTdHlsZSA9IHsgLi4uZGVmYXVsdFN0eWxlLCAuLi50aGlzLmNhbGxEZXRhaWxzU3R5bGUgfTtcbiAgfVxuXG4gIHNldERhdGVTdHlsZSgpIHtcbiAgICBsZXQgZGVmYXVsdFN0eWxlOiBEYXRlU3R5bGUgPSBuZXcgRGF0ZVN0eWxlKHtcbiAgICAgIHRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkuY2FwdGlvbjIpLFxuICAgICAgdGV4dENvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDYwMCgpLFxuICAgICAgYmFja2dyb3VuZDogXCJ0cmFuc3BhcmVudFwiLFxuICAgIH0pO1xuICAgIHRoaXMuZGF0ZVN0eWxlID0geyAuLi5kZWZhdWx0U3R5bGUsIC4uLnRoaXMuZGF0ZVN0eWxlIH07XG4gIH1cbiAgd3JhcHBlclN0eWxlID0gKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogdGhpcy5jYWxsRGV0YWlsc1N0eWxlLndpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLmNhbGxEZXRhaWxzU3R5bGUuaGVpZ2h0LFxuICAgICAgYm9yZGVyOiB0aGlzLmNhbGxEZXRhaWxzU3R5bGUuYm9yZGVyLFxuICAgICAgYm9yZGVyUmFkaXVzOiB0aGlzLmNhbGxEZXRhaWxzU3R5bGUuYm9yZGVyUmFkaXVzLFxuICAgICAgYmFja2dyb3VuZDogdGhpcy5jYWxsRGV0YWlsc1N0eWxlLmJhY2tncm91bmQsXG4gICAgfTtcbiAgfTtcblxuICBnZXRUYWlsVmlldyh0b3RhbFNlY29uZHM6IG51bWJlcikge1xuICAgIHJldHVybiBDYWxsTG9nVXRpbHMuY29udmVydE1pbnV0ZXNUb0hvdXJzTWludXRlc1NlY29uZHModG90YWxTZWNvbmRzKTtcbiAgfVxuXG4gIGdldFN1YnRpdGxlKGNhbGw6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIENhbGxMb2dVdGlscy5nZXRDYWxsU3RhdHVzV2l0aFR5cGUoY2FsbCwgdGhpcy5sb2dnZWRJblVzZXIhKTtcbiAgfVxuXG4gIGJhY2tCdXR0b25TdHlsZSA9ICgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgaGVpZ2h0OiBcIjI0cHhcIixcbiAgICAgIHdpZHRoOiBcIjI0cHhcIixcbiAgICAgIGJvcmRlcjogXCJub25lXCIsXG4gICAgICBib3JkZXJSYWRpdXM6IFwiMFwiLFxuICAgICAgYmFja2dyb3VuZDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgYnV0dG9uSWNvblRpbnQ6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0UHJpbWFyeSgpLFxuICAgIH07XG4gIH07XG4gIGdldExpc3RJdGVtU3R5bGUob3B0aW9uOiBDb21ldENoYXREZXRhaWxzT3B0aW9uKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlaWdodDogXCJhdXRvXCIsXG4gICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICBiYWNrZ3JvdW5kOlxuICAgICAgICBvcHRpb24/LmJhY2tncm91bmRDb2xvciB8fFxuICAgICAgICB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEJhY2tncm91bmQoKSxcbiAgICAgIGJvcmRlclJhZGl1czogXCIwXCIsXG4gICAgICB0aXRsZUZvbnQ6XG4gICAgICAgIG9wdGlvbj8udGl0bGVGb250IHx8XG4gICAgICAgIGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS50aXRsZTIpLFxuXG4gICAgICBib3JkZXI6IFwibm9uZVwiLFxuICAgICAgc2VwYXJhdG9yQ29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50MjAwKCksXG4gICAgICBob3ZlckJhY2tncm91bmQ6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50MTAwKCksXG4gICAgfTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNjLWNhbGwtbG9nLWRldGFpbHNfX3dyYXBwZXJcIiAqbmdJZj1cInVzZXIgfHwgZ3JvdXBcIiBbbmdTdHlsZV09XCJ3cmFwcGVyU3R5bGUoKVwiPlxuXG4gIDxkaXYgY2xhc3M9XCJjYy1jYWxsLWxvZy1kZXRhaWxzX19oZWFkZXJcIlxuICAgICpuZ0lmPVwib25CYWNrQ2xpY2sgJiYgIShzaG93UGFydGljaXBhbnRzTGlzdCB8fCBzaG93Q2FsbFJlY29yZGluZ0xpc3QgfHwgc2hvd0NhbGxIaXN0b3J5KVwiPlxuICAgIDxjb21ldGNoYXQtYnV0dG9uIFtpY29uVVJMXT1cImJhY2tJY29uVXJsXCIgY2xhc3M9XCJjYy1jYWxsLWxvZy1kZXRhaWxzX19jbG9zZS1idXR0b25cIiBbYnV0dG9uU3R5bGVdPVwiYmFja0J1dHRvblN0eWxlKClcIlxuICAgICAgKGNjLWJ1dHRvbi1jbGlja2VkKT1cIm9uQmFja0NsaWNrKClcIj48L2NvbWV0Y2hhdC1idXR0b24+XG4gICAgPGNvbWV0Y2hhdC1sYWJlbCBbdGV4dF09XCJ0aXRsZVwiIFtsYWJlbFN0eWxlXT1cImdldFRpdGxlU3R5bGUoKVwiPjwvY29tZXRjaGF0LWxhYmVsPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiY2MtY2FsbC1sb2ctZGV0YWlsc1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjYy1jYWxsLWxvZy1kZXRhaWxzX19wcm9maWxlXCJcbiAgICAgICpuZ0lmPVwiIWhpZGVQcm9maWxlICYmIHNob3dDYWxsTG9nRGV0YWlsT3B0aW9uTGlzdCAmJiAhKHNob3dQYXJ0aWNpcGFudHNMaXN0IHx8IHNob3dDYWxsUmVjb3JkaW5nTGlzdCB8fCBzaG93Q2FsbEhpc3RvcnkpXCI+XG5cblxuICAgICAgPGRpdiBjbGFzcz1cIiBjYy1jYWxsLWxvZy1kZXRhaWxzX19kZWZhdWx0LXByb2ZpbGVcIiAqbmdJZj1cIiFjdXN0b21Qcm9maWxlVmlldztlbHNlIGxpc3RpdGVtXCI+XG4gICAgICAgIDxjb21ldGNoYXQtYXZhdGFyIFtuYW1lXT1cInVzZXI/LmdldE5hbWUoKSA/PyBncm91cD8uZ2V0TmFtZSgpXCIgW2F2YXRhclN0eWxlXT1cImF2YXRhclN0eWxlXCJcbiAgICAgICAgICBbaW1hZ2VdPVwidXNlcj8uZ2V0QXZhdGFyKCkgPz8gZ3JvdXA/LmdldEljb24oKVwiPlxuICAgICAgICA8L2NvbWV0Y2hhdC1hdmF0YXI+XG5cbiAgICAgICAgPGNvbWV0Y2hhdC1sYWJlbCBbdGV4dF09XCJ1c2VyPy5nZXROYW1lKCkgPz8gdGhpcy5ncm91cD8uZ2V0TmFtZSgpXCI+PC9jb21ldGNoYXQtbGFiZWw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2MtY2FsbC1sb2ctZGV0YWlsc19fc2VjdGlvbi1saXN0XCJcbiAgICAgICpuZ0lmPVwic2hvd0NhbGxMb2dEZXRhaWxPcHRpb25MaXN0ICYmIGRlZmF1bHRUZW1wbGF0ZSAmJiBkZWZhdWx0VGVtcGxhdGUubGVuZ3RoID4gMFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNjLWNhbGwtbG9nLWRldGFpbHNfX3NlY3Rpb25cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkZWZhdWx0VGVtcGxhdGVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNjLWNhbGwtbG9nLWRldGFpbHNfX3NlY3Rpb24tc2VwYXJhdG9yXCIgKm5nSWY9XCJpdGVtLnRpdGxlXCI+XG4gICAgICAgICAgPGNvbWV0Y2hhdC1sYWJlbCBbdGV4dF09XCJpdGVtLnRpdGxlXCI+PC9jb21ldGNoYXQtbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2MtY2FsbC1sb2ctZGV0YWlsc19fb3B0aW9ucy13cmFwcGVyXCIgKm5nSWY9XCJnZXRUZW1wbGF0ZU9wdGlvbnMoaXRlbSlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2MtY2FsbC1sb2ctZGV0YWlsc19fb3B0aW9uc1wiICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZ2V0VGVtcGxhdGVPcHRpb25zKGl0ZW0pOyAgdHJhY2tCeTogdHJhY2tCeUZuT3B0aW9uIFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNjLWNhbGwtbG9nLWRldGFpbHNfX29wdGlvblwiICpuZ0lmPVwiIWdldEN1c3RvbU9wdGlvblZpZXcob3B0aW9uKTtlbHNlIGN1c3RvbVZpZXdcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNjLWNhbGwtbG9nLWRldGFpbHNfX29wdGlvbi1lbGVtZW50XCI+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2MtY2FsbC1sb2ctZGV0YWlsc19fY2FsbGluZy1kZWZhdWx0LW9wdGlvblwiICpuZ0lmPVwib3B0aW9uLmlkPT0nY2FsbHMnXCI+XG5cbiAgICAgICAgICAgICAgICAgIDxjb21ldGNoYXQtY2FsbC1idXR0b25zIFt1c2VyXT1cInVzZXJcIiBbZ3JvdXBdPVwiZ3JvdXBcIlxuICAgICAgICAgICAgICAgICAgICBbY2FsbEJ1dHRvbnNTdHlsZV09XCJjYWxsQnV0dG9uc0NvbmZpZ3VyYXRpb24uY2FsbEJ1dHRvbnNTdHlsZVwiXG4gICAgICAgICAgICAgICAgICAgIFtvblZpZGVvQ2FsbENsaWNrXT1cImNhbGxCdXR0b25zQ29uZmlndXJhdGlvbi5vblZpZGVvQ2FsbENsaWNrXCJcbiAgICAgICAgICAgICAgICAgICAgW29uVm9pY2VDYWxsQ2xpY2tdPVwiY2FsbEJ1dHRvbnNDb25maWd1cmF0aW9uLm9uVm9pY2VDYWxsQ2xpY2tcIlxuICAgICAgICAgICAgICAgICAgICBbdmlkZW9DYWxsSWNvblVSTF09XCJjYWxsQnV0dG9uc0NvbmZpZ3VyYXRpb24udmlkZW9DYWxsSWNvblVSTFwiXG4gICAgICAgICAgICAgICAgICAgIFt2b2ljZUNhbGxJY29uVVJMXT1cImNhbGxCdXR0b25zQ29uZmlndXJhdGlvbi52b2ljZUNhbGxJY29uVVJMXCI+PC9jb21ldGNoYXQtY2FsbC1idXR0b25zPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxjb21ldGNoYXQtbGlzdC1pdGVtICpuZ0lmPVwib3B0aW9uLmlkPT09J2NhbGxTdGF0dXMnXCIgW2xpc3RJdGVtU3R5bGVdPVwiZ2V0TGlzdEl0ZW1TdHlsZShvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgIFtoaWRlU2VwYXJhdG9yXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYy1jYWxsLWxvZy1kZXRhaWxzX19jYWxsLVN0YXR1c1wiIHNsb3Q9XCJzdWJ0aXRsZVZpZXdcIiA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc3VidGl0bGVWaWV3OyBlbHNlIHN1YnRpdGxlXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2PiA8Y29tZXRjaGF0LWRhdGUgW2RhdGVTdHlsZV09XCJkYXRlU3R5bGVcIiBbdGltZXN0YW1wXT1cImNhbGw/LmdldEluaXRpYXRlZEF0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcGF0dGVybl09XCJkYXRlUGF0dGVybjJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvY29tZXRjaGF0LWRhdGU+PC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYy1jYWxsLWxvZy1kZXRhaWxzX19jYWxsLVN0YXR1c19fc3ViVGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbWV0Y2hhdC1kYXRlIFtkYXRlU3R5bGVdPVwiZGF0ZVN0eWxlXCIgW3RpbWVzdGFtcF09XCJjYWxsPy5nZXRJbml0aWF0ZWRBdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGF0dGVybl09XCJkYXRlUGF0dGVyblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbWV0Y2hhdC1kYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29tZXRjaGF0LWxhYmVsIFt0ZXh0XT1cImdldFN1YnRpdGxlKGNhbGwpXCIgW2xhYmVsU3R5bGVdPVwic3VidGl0bGVTdHlsZShvcHRpb24pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29tZXRjaGF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2MtY2FsbC1sb2ctZGV0YWlsc19fY2FsbC1TdGF0dXNfX3RhaWx2aWV3XCI+IHt7IGdldFRhaWxWaWV3KGNhbGw/LmdldFRvdGFsRHVyYXRpb25Jbk1pbnV0ZXMoKSEpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzdWJ0aXRsZT5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic3VidGl0bGVWaWV3O2NvbnRleHQ6eyAkaW1wbGljaXQ6IHVzZXIgPz8gZ3JvdXAgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgICAgIDwvY29tZXRjaGF0LWxpc3QtaXRlbT5cbiAgICAgICAgICAgICAgICA8Y29tZXRjaGF0LWxpc3QtaXRlbSAqbmdJZj1cIm9wdGlvbi5pZCE9PSdjYWxscycgJiYgb3B0aW9uLmlkIT09J2NhbGxTdGF0dXMnIFwiXG4gICAgICAgICAgICAgICAgICAoY2MtbGlzdGl0ZW0tY2xpY2tlZCk9XCJvbk9wdGlvbkNsaWNrKG9wdGlvbilcIiBbbGlzdEl0ZW1TdHlsZV09XCJnZXRMaXN0SXRlbVN0eWxlKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIm9wdGlvbi50aXRsZVwiIFtoaWRlU2VwYXJhdG9yXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc2xvdD1cInRhaWxWaWV3XCIgY2xhc3M9XCJjYy1jYWxsLWxvZy1kZXRhaWxzX19zZWNvbmRhcnktdmlld19fdGFpbC12aWV3XCJcbiAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3tvcHRpb24udGFpbH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8Y29tZXRjaGF0LWljb24gW2ljb25TdHlsZV09XCJpY29uU3R5bGVcIiBbVVJMXT1cImdyZWF0ZXJUaGFuSWNvblVSTFwiPjwvY29tZXRjaGF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgPC9jb21ldGNoYXQtbGlzdC1pdGVtPlxuXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8Y29tZXRjaGF0LWRpdmlkZXIgW2RpdmlkZXJTdHlsZV09XCJkaXZpZGVyU3R5bGVcIj48L2NvbWV0Y2hhdC1kaXZpZGVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2N1c3RvbVZpZXc+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJnZXRDdXN0b21PcHRpb25WaWV3KG9wdGlvbilcIj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG5cblxuICAgIDxkaXYgKm5nSWY9XCJzaG93UGFydGljaXBhbnRzTGlzdCB8fCBzaG93Q2FsbFJlY29yZGluZ0xpc3QgfHwgc2hvd0NhbGxIaXN0b3J5XCIgc3R5bGU9XCIgaGVpZ2h0OiAxMDAlO1wiPlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwic2hvd1BhcnRpY2lwYW50c0xpc3RcIiBzdHlsZT1cImhlaWdodDogMTAwJTtcIj5cbiAgICAgICAgPGNvbWV0Y2hhdC1jYWxsLWxvZy1wYXJ0aWNpcGFudHMgW2NhbGxdPVwiY2FsbFwiXG4gICAgICAgICAgW29uQmFja0NsaWNrXT1cImNhbGxMb2dQYXJ0aWNpcGFudHNDb25maWd1cmF0aW9uLm9uQmFja0NsaWNrIHx8IGhhbmRsZVBhZ2VPbkJhY2tDbGlja1wiXG4gICAgICAgICAgW2JhY2tJY29uVXJsXT1cImNhbGxMb2dQYXJ0aWNpcGFudHNDb25maWd1cmF0aW9uLmJhY2tJY29uVXJsIHx8IGJhY2tJY29uVXJsXCJcbiAgICAgICAgICBbYXZhdGFyU3R5bGVdPVwiY2FsbExvZ1BhcnRpY2lwYW50c0NvbmZpZ3VyYXRpb24uYXZhdGFyU3R5bGVcIlxuICAgICAgICAgIFtvbkl0ZW1DbGlja109XCJjYWxsTG9nUGFydGljaXBhbnRzQ29uZmlndXJhdGlvbi5vbkl0ZW1DbGljayFcIlxuICAgICAgICAgIFtkYXRlUGF0dGVybl09XCJjYWxsTG9nUGFydGljaXBhbnRzQ29uZmlndXJhdGlvbi5kYXRlUGF0dGVyblwiXG4gICAgICAgICAgW3N1YnRpdGxlVmlld109XCJjYWxsTG9nUGFydGljaXBhbnRzQ29uZmlndXJhdGlvbi5zdWJ0aXRsZVZpZXdcIlxuICAgICAgICAgIFtsaXN0SXRlbVZpZXddPVwiY2FsbExvZ1BhcnRpY2lwYW50c0NvbmZpZ3VyYXRpb24ubGlzdEl0ZW1WaWV3XCJcblxuICAgICAgICAgIFtsaXN0SXRlbVN0eWxlXT1cImNhbGxMb2dQYXJ0aWNpcGFudHNDb25maWd1cmF0aW9uLmxpc3RJdGVtU3R5bGVcIiBbY2FsbExvZ1BhcnRpY2lwYW50c1N0eWxlXT1cIlxuICAgICAgICBjYWxsTG9nUGFydGljaXBhbnRzQ29uZmlndXJhdGlvbi5jYWxsTG9nUGFydGljaXBhbnRzU3R5bGVcIlxuICAgICAgIFxuICAgICAgICAgIFt0YWlsVmlld109XCJjYWxsTG9nUGFydGljaXBhbnRzQ29uZmlndXJhdGlvbi50YWlsVmlld1wiPjwvY29tZXRjaGF0LWNhbGwtbG9nLXBhcnRpY2lwYW50cz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cInNob3dDYWxsUmVjb3JkaW5nTGlzdFwiIHN0eWxlPVwiaGVpZ2h0OjEwMCU7XCI+XG4gICAgICAgIDxjb21ldGNoYXQtY2FsbC1sb2ctcmVjb3JkaW5ncyBbY2FsbF09XCJjYWxsXCJcbiAgICAgICAgICBbYmFja0ljb25VcmxdPVwiY2FsbExvZ1JlY29yZGluZ3NDb25maWd1cmF0aW9uLmJhY2tJY29uVXJsIHx8IGJhY2tJY29uVXJsXCIgW29uQmFja0NsaWNrXT1cIlxuICAgICAgICBjYWxsTG9nUmVjb3JkaW5nc0NvbmZpZ3VyYXRpb24ub25CYWNrQ2xpY2sgfHwgaGFuZGxlUGFnZU9uQmFja0NsaWNrXG4gICAgICBcIiBbb25JdGVtQ2xpY2tdPVwiY2FsbExvZ1JlY29yZGluZ3NDb25maWd1cmF0aW9uLm9uSXRlbUNsaWNrIVwiXG4gICAgICAgICAgW2RhdGVQYXR0ZXJuXT1cImNhbGxMb2dSZWNvcmRpbmdzQ29uZmlndXJhdGlvbi5kYXRlUGF0dGVybiFcIlxuICAgICAgICAgIFtsaXN0SXRlbVN0eWxlXT1cImNhbGxMb2dSZWNvcmRpbmdzQ29uZmlndXJhdGlvbi5saXN0SXRlbVN0eWxlXCIgY2FsbExvZ1JlY29yZGluZ3NTdHlsZT1cIlxuICAgICAgICBjYWxsTG9nUmVjb3JkaW5nc0NvbmZpZ3VyYXRpb24uY2FsbExvZ1JlY29yZGluZ3NTdHlsZVxuICAgICAgICBjYWxsTG9nUmVjb3JkaW5nc0NvbmZpZ3VyYXRpb24uaGlkZURvd25sb2FkQnV0dG9uIHx8IGZhbHNlXG4gICAgICBcIiBbb25Eb3dubG9hZENsaWNrXT1cImNhbGxMb2dSZWNvcmRpbmdzQ29uZmlndXJhdGlvbi5vbkRvd25sb2FkQ2xpY2shXCJcbiAgICAgICAgICBbbGlzdEl0ZW1WaWV3XT1cImNhbGxMb2dSZWNvcmRpbmdzQ29uZmlndXJhdGlvbi5saXN0SXRlbVZpZXdcIlxuICAgICAgICAgIFtzdWJ0aXRsZVZpZXddPVwiY2FsbExvZ1JlY29yZGluZ3NDb25maWd1cmF0aW9uLnN1YnRpdGxlVmlld1wiXG4gICAgICAgICAgW3RhaWxWaWV3XT1cImNhbGxMb2dSZWNvcmRpbmdzQ29uZmlndXJhdGlvbi50YWlsVmlld1wiPjwvY29tZXRjaGF0LWNhbGwtbG9nLXJlY29yZGluZ3M+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCJzaG93Q2FsbEhpc3RvcnlcIiBzdHlsZT1cImhlaWdodDogMTAwJTsgXCI+XG4gICAgICAgIDxjb21ldGNoYXQtY2FsbC1sb2ctaGlzdG9yeSBbY2FsbF09XCJjYWxsXCIgW3VzZXJdPVwidXNlclwiIFtncm91cF09XCJncm91cFwiIFtvbkJhY2tDbGlja109XCJoYW5kbGVQYWdlT25CYWNrQ2xpY2tcIlxuICAgICAgICAgIFtiYWNrSWNvblVybF09XCJjYWxsTG9nSGlzdG9yeUNvbmZpZ3VyYXRpb24uYmFja0ljb25VcmwgfHwgYmFja0ljb25VcmxcIlxuICAgICAgICAgIFtlbXB0eVN0YXRlVmlld109XCJjYWxsTG9nSGlzdG9yeUNvbmZpZ3VyYXRpb24uZW1wdHlTdGF0ZVZpZXdcIlxuICAgICAgICAgIFtlcnJvclN0YXRlVmlld109XCJjYWxsTG9nSGlzdG9yeUNvbmZpZ3VyYXRpb24uZXJyb3JTdGF0ZVZpZXdcIlxuICAgICAgICAgIFtsb2FkaW5nSWNvblVSTF09XCJjYWxsTG9nSGlzdG9yeUNvbmZpZ3VyYXRpb24ubG9hZGluZ0ljb25VUkxcIlxuICAgICAgICAgIFtsb2FkaW5nU3RhdGVWaWV3XT1cImNhbGxMb2dIaXN0b3J5Q29uZmlndXJhdGlvbi5sb2FkaW5nU3RhdGVWaWV3XCJcbiAgICAgICAgICBbdGFpbFZpZXddPVwiY2FsbExvZ0hpc3RvcnlDb25maWd1cmF0aW9uLnRhaWxWaWV3XCIgW2NhbGxMb2dSZXF1ZXN0QnVpbGRlcl09XCJcbiAgICAgICAgICAgIGNhbGxMb2dIaXN0b3J5Q29uZmlndXJhdGlvbi5jYWxsTG9nUmVxdWVzdEJ1aWxkZXJcbiAgICAgICAgICBcIiBbb25JdGVtQ2xpY2tdPVwiY2FsbExvZ0hpc3RvcnlDb25maWd1cmF0aW9uLm9uSXRlbUNsaWNrIHx8IG9uSXRlbUNsaWNrXCIgW29uQmFja0NsaWNrXT1cIlxuICAgICAgICAgICAgY2FsbExvZ0hpc3RvcnlDb25maWd1cmF0aW9uLm9uQmFja0NsaWNrIHx8IGhhbmRsZVBhZ2VPbkJhY2tDbGlja1xuICAgICAgICAgIFwiIFtsaXN0SXRlbVN0eWxlXT1cImNhbGxMb2dIaXN0b3J5Q29uZmlndXJhdGlvbi5saXN0SXRlbVN0eWxlXCJcbiAgICAgICAgICBbZGF0ZVBhdHRlcm5dPVwiY2FsbExvZ0hpc3RvcnlDb25maWd1cmF0aW9uLmRhdGVQYXR0ZXJuXCIgW2RhdGVTZXBhcmF0b3JQYXR0ZXJuXT1cIlxuICAgICAgICAgICAgY2FsbExvZ0hpc3RvcnlDb25maWd1cmF0aW9uLmRhdGVTZXBhcmF0b3JQYXR0ZXJuXG4gICAgICAgICAgXCIgW2NhbGxMb2dIaXN0b3J5U3R5bGVdPVwiXG4gICAgICAgICAgICBjYWxsTG9nSGlzdG9yeUNvbmZpZ3VyYXRpb24uY2FsbExvZ0hpc3RvcnlTdHlsZVxuICAgICAgICAgIFwiIFtvbkVycm9yXT1cImNhbGxMb2dIaXN0b3J5Q29uZmlndXJhdGlvbi5vbkVycm9yIVwiPjwvY29tZXRjaGF0LWNhbGwtbG9nLWhpc3Rvcnk+XG4gICAgICA8L2Rpdj5cblxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG5cbjxuZy10ZW1wbGF0ZSAjbGlzdGl0ZW0+XG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21Qcm9maWxlVmlld1wiPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+Il19
373
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tZXRjaGF0LWNhbGwtbG9nLWRldGFpbHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2hhdC11aWtpdC1hbmd1bGFyL3NyYy9DYWxscy9Db21ldENoYXRDYWxsTG9nRGV0YWlscy9jb21ldGNoYXQtY2FsbC1sb2ctZGV0YWlscy9jb21ldGNoYXQtY2FsbC1sb2ctZGV0YWlscy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jaGF0LXVpa2l0LWFuZ3VsYXIvc3JjL0NhbGxzL0NvbWV0Q2hhdENhbGxMb2dEZXRhaWxzL2NvbWV0Y2hhdC1jYWxsLWxvZy1kZXRhaWxzL2NvbWV0Y2hhdC1jYWxsLWxvZy1kZXRhaWxzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUVMLHVCQUF1QixHQUt4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFDTCxXQUFXLEVBQ1gsU0FBUyxFQUdULGFBQWEsR0FDZCxNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFFTCx3QkFBd0IsRUFDeEIsbUJBQW1CLEVBQ25CLGdDQUFnQyxFQUNoQywyQkFBMkIsRUFDM0IsOEJBQThCLEdBQy9CLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUNMLFVBQVUsRUFDVixRQUFRLEVBSVIsWUFBWSxHQUViLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRTNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQTtBQUN2RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7O0FBUWxFLE1BQU0sT0FBTyxnQ0FBZ0M7SUFvRzNDLFlBQ1UsR0FBc0Is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aUI7c0JBQXpCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRUcsd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUdHLGdDQUFnQztzQkFBeEMsS0FBSztnQkFHRywyQkFBMkI7c0JBQW5DLEtBQUs7Z0JBR0csOEJBQThCO3NCQUF0QyxLQUFLO2dCQUdHLE9BQU87c0JBQWYsS0FBSztnQkFLRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBTUcsVUFBVTtzQkFBbEIsS0FBSztnQkFJRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBS0csYUFBYTtzQkFBckIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBUZW1wbGF0ZVJlZixcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IFwiQGNvbWV0Y2hhdC91aWtpdC1lbGVtZW50c1wiO1xuaW1wb3J0IHtcbiAgQXZhdGFyU3R5bGUsXG4gIERhdGVTdHlsZSxcbiAgSWNvblN0eWxlLFxuICBMYWJlbFN0eWxlLFxuICBMaXN0SXRlbVN0eWxlLFxufSBmcm9tIFwiQGNvbWV0Y2hhdC91aWtpdC1lbGVtZW50c1wiO1xuaW1wb3J0IHtcbiAgQ2FsbEJ1dHRvbnNTdHlsZSxcbiAgQ2FsbEJ1dHRvbnNDb25maWd1cmF0aW9uLFxuICBDYWxsTG9nRGV0YWlsc1N0eWxlLFxuICBDYWxsTG9nUGFydGljaXBhbnRzQ29uZmlndXJhdGlvbixcbiAgQ2FsbExvZ0hpc3RvcnlDb25maWd1cmF0aW9uLFxuICBDYWxsTG9nUmVjb3JkaW5nc0NvbmZpZ3VyYXRpb24sXG59IGZyb20gXCJAY29tZXRjaGF0L3Vpa2l0LXNoYXJlZFwiO1xuaW1wb3J0IHtcbiAgZm9udEhlbHBlcixcbiAgbG9jYWxpemUsXG4gIENvbWV0Q2hhdFVJS2l0Q29uc3RhbnRzLFxuICBDb21ldENoYXREZXRhaWxzT3B0aW9uLFxuICBDb21ldENoYXREZXRhaWxzVGVtcGxhdGUsXG4gIERhdGVQYXR0ZXJucyxcbiAgQ29tZXRDaGF0Q2FsbERldGFpbHNPcHRpb24sXG59IGZyb20gXCJAY29tZXRjaGF0L3Vpa2l0LXJlc291cmNlc1wiO1xuaW1wb3J0IHsgQ29tZXRDaGF0IH0gZnJvbSBcIkBjb21ldGNoYXQvY2hhdC1zZGstamF2YXNjcmlwdFwiO1xuaW1wb3J0IHsgQ29tZXRDaGF0VGhlbWVTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL0NvbWV0Q2hhdFRoZW1lLnNlcnZpY2VcIjtcbmltcG9ydCB7IENhbGxEZXRhaWxVdGlscyB9IGZyb20gXCIuLi8uLi8uLi9TaGFyZWQvVXRpbHMvQ2FsbERldGFpbFV0aWxzXCJcbmltcG9ydCB7IENhbGxMb2dVdGlscyB9IGZyb20gXCIuLi8uLi8uLi9TaGFyZWQvVXRpbHMvQ2FsbExvZ1V0aWxzXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJjb21ldGNoYXQtY2FsbC1sb2ctZGV0YWlsc1wiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2NvbWV0Y2hhdC1jYWxsLWxvZy1kZXRhaWxzLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogW1wiLi9jb21ldGNoYXQtY2FsbC1sb2ctZGV0YWlscy5jb21wb25lbnQuc2Nzc1wiXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIENvbWV0Q2hhdENhbGxMb2dEZXRhaWxzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBjYWxsITogYW55O1xuICBASW5wdXQoKSBncm91cCE6IENvbWV0Q2hhdC5Hcm91cDtcbiAgQElucHV0KCkgdXNlciE6IENvbWV0Q2hhdC5Vc2VyO1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gbG9jYWxpemUoXCJDQUxMX0RFVEFJTFNcIik7XG4gIEBJbnB1dCgpIG9uQmFja0NsaWNrPzogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgaGlkZVByb2ZpbGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc3VidGl0bGVWaWV3ITogVGVtcGxhdGVSZWY8YW55PjtcbiAgQElucHV0KCkgY3VzdG9tUHJvZmlsZVZpZXchOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBJbnB1dCgpIGJhY2tJY29uVXJsOiBzdHJpbmcgPSBcImFzc2V0cy9iYWNrYnV0dG9uLnN2Z1wiO1xuICBASW5wdXQoKSBncmVhdGVyVGhhbkljb25VUkw6IHN0cmluZyA9IFwiYXNzZXRzL2dyZWF0ZXJUaGFuSWNvbi5zdmdcIjtcblxuICBASW5wdXQoKSBjYWxsQnV0dG9uc0NvbmZpZ3VyYXRpb246IENhbGxCdXR0b25zQ29uZmlndXJhdGlvbiA9XG4gICAgbmV3IENhbGxCdXR0b25zQ29uZmlndXJhdGlvbih7fSk7XG5cbiAgQElucHV0KCkgY2FsbExvZ1BhcnRpY2lwYW50c0NvbmZpZ3VyYXRpb246IENhbGxMb2dQYXJ0aWNpcGFudHNDb25maWd1cmF0aW9uID1cbiAgICBuZXcgQ2FsbExvZ1BhcnRpY2lwYW50c0NvbmZpZ3VyYXRpb24oe30pO1xuXG4gIEBJbnB1dCgpIGNhbGxMb2dIaXN0b3J5Q29uZmlndXJhdGlvbjogQ2FsbExvZ0hpc3RvcnlDb25maWd1cmF0aW9uID1cbiAgICBuZXcgQ2FsbExvZ0hpc3RvcnlDb25maWd1cmF0aW9uKHt9KTtcblxuICBASW5wdXQoKSBjYWxsTG9nUmVjb3JkaW5nc0NvbmZpZ3VyYXRpb246IENhbGxMb2dSZWNvcmRpbmdzQ29uZmlndXJhdGlvbiA9XG4gICAgbmV3IENhbGxMb2dSZWNvcmRpbmdzQ29uZmlndXJhdGlvbih7fSk7XG5cbiAgQElucHV0KCkgb25FcnJvcjogKChlcnJvcjogQ29tZXRDaGF0LkNvbWV0Q2hhdEV4Y2VwdGlvbikgPT4gdm9pZCkgfCBudWxsID0gKFxuICAgIGVycm9yOiBDb21ldENoYXQuQ29tZXRDaGF0RXhjZXB0aW9uXG4gICkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgfTtcbiAgQElucHV0KCkgZGF0ZVBhdHRlcm46IERhdGVQYXR0ZXJucyA9IERhdGVQYXR0ZXJucy50aW1lO1xuICBASW5wdXQoKSBkYXRlUGF0dGVybjI6IERhdGVQYXR0ZXJucyA9IERhdGVQYXR0ZXJucy5EYXlEYXRlO1xuXG4gIEBJbnB1dCgpIGRhdGE6IENvbWV0Q2hhdERldGFpbHNUZW1wbGF0ZVtdID0gW107XG5cbiAgQElucHV0KCkgYXZhdGFyU3R5bGU6IEF2YXRhclN0eWxlID0ge1xuICAgIGJvcmRlclJhZGl1czogXCIxNnB4XCIsXG4gICAgd2lkdGg6IFwiMjhweFwiLFxuICAgIGhlaWdodDogXCIyOHB4XCIsXG4gICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgfTtcbiAgQElucHV0KCkgbGFiZWxTdHlsZTogTGFiZWxTdHlsZSA9IHtcbiAgICB0ZXh0Rm9udDogJzYwMCAyMnB4IHNhbnMtc2VyaWYsIEludGVyJyxcbiAgICB0ZXh0Q29sb3I6ICdyZ2IoMjAsIDIwLCAyMCknXG4gIH07XG4gIEBJbnB1dCgpIGNhbGxEZXRhaWxzU3R5bGU6IENhbGxMb2dEZXRhaWxzU3R5bGUgPSB7XG4gICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgIGhlaWdodDogXCIxMDAlXCIsXG4gIH07XG5cbiAgQElucHV0KCkgbGlzdEl0ZW1TdHlsZTogTGlzdEl0ZW1TdHlsZSA9IHt9O1xuXG4gIEBJbnB1dCgpIGRhdGVTdHlsZTogRGF0ZVN0eWxlID0ge307XG4gIEBJbnB1dCgpIGNhbGxCdXR0b25zU3R5bGU6IENhbGxCdXR0b25zU3R5bGUgPSB7XG4gICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgIGhlaWdodDogXCIxMDAlXCIsXG4gICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgICBib3JkZXJSYWRpdXM6IFwiMFwiLFxuICAgIGJhY2tncm91bmQ6IFwidHJhbnNwYXJlbnRcIixcbiAgfTtcblxuICBpY29uU3R5bGU6IEljb25TdHlsZSA9IHtcbiAgICBoZWlnaHQ6IFwiMTZweFwiLFxuICAgIHdpZHRoOiBcIjE2cHhcIixcbiAgICBpY29uVGludDogXCJSR0JBKDIwLCAyMCwgMjAsIDAuNjgpXCIsXG4gIH07XG5cbiAgZGVmYXVsdFRlbXBsYXRlOiBDb21ldENoYXREZXRhaWxzVGVtcGxhdGVbXSA9IFtdO1xuXG4gIHB1YmxpYyBhdXRoVG9rZW46IHN0cmluZyA9IFwiXCI7XG4gIHB1YmxpYyBsb2dnZWRJblVzZXI6IENvbWV0Q2hhdC5Vc2VyIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBzaG93Q2FsbExvZ0RldGFpbE9wdGlvbkxpc3Q6IEJvb2xlYW4gPSB0cnVlO1xuICBwdWJsaWMgc2hvd0NvbWV0Q2hhdE1lc3NhZ2VzOiBCb29sZWFuID0gdHJ1ZTtcbiAgcHVibGljIHNob3dQYXJ0aWNpcGFudHNMaXN0OiBCb29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBzaG93Q2FsbFJlY29yZGluZ0xpc3Q6IEJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIHNob3dDYWxsSGlzdG9yeTogQm9vbGVhbiA9IGZhbHNlO1xuXG5cbiAgZ2V0VGl0bGVTdHlsZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dEZvbnQ6XG4gICAgICAgIHRoaXMuY2FsbERldGFpbHNTdHlsZS50aXRsZUZvbnQgfHxcbiAgICAgICAgZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LnRpdGxlMSksXG4gICAgICB0ZXh0Q29sb3I6XG4gICAgICAgIHRoaXMuY2FsbERldGFpbHNTdHlsZS50aXRsZUNvbG9yIHx8XG4gICAgICAgIHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50KCksXG4gICAgfTtcbiAgfVxuICBwdWJsaWMgdXNlckxpc3RlbmVySWQgPSBcInVzZXJsaXN0X1wiICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIHB1YmxpYyByZXF1ZXN0QnVpbGRlcjogYW55O1xuICBwdWJsaWMgbGltaXQ6IG51bWJlciA9IDU7XG5cbiAgcHVibGljIG9uSXRlbUNsaWNrOiAoY2FsbDogYW55KSA9PiB2b2lkID0gKGNhbGw6IGFueSkgPT4ge1xuICAgIHRoaXMuY2FsbCA9IGNhbGw7XG4gICAgdGhpcy5zaG93Q2FsbExvZ0RldGFpbE9wdGlvbkxpc3QgPSB0cnVlO1xuICAgIHRoaXMuc2hvd0NhbGxIaXN0b3J5ID0gZmFsc2U7XG4gICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9O1xuICB0eXBlczogc3RyaW5nW10gPSBbXTtcbiAgY2F0ZWdvcmllczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgdGhlbWVTZXJ2aWNlOiBDb21ldENoYXRUaGVtZVNlcnZpY2VcbiAgKSB7fVxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbXCJ1c2VyXCJdIHx8IGNoYW5nZXNbXCJncm91cFwiXSkge1xuICAgICAgdGhpcy5zaG93Q2FsbExvZ0RldGFpbE9wdGlvbkxpc3QgPSB0cnVlO1xuICAgICAgdGhpcy5zaG93UGFydGljaXBhbnRzTGlzdCA9IGZhbHNlO1xuICAgICAgdGhpcy5zaG93Q2FsbFJlY29yZGluZ0xpc3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2hvd0NhbGxIaXN0b3J5ID0gZmFsc2U7XG4gICAgICB0aGlzLnNob3dDb21ldENoYXRNZXNzYWdlcyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUxpc3RlbmVyKCkge1xuICAgIENvbWV0Q2hhdC5yZW1vdmVVc2VyTGlzdGVuZXIodGhpcy51c2VyTGlzdGVuZXJJZCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBDb21ldENoYXQuZ2V0TG9nZ2VkaW5Vc2VyKClcbiAgICAgIC50aGVuKCh1c2VyOiBDb21ldENoYXQuVXNlciB8IG51bGwpID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZWRJblVzZXIgPSB1c2VyO1xuICAgICAgICB0aGlzLmF1dGhUb2tlbiA9IHRoaXMubG9nZ2VkSW5Vc2VyIS5nZXRBdXRoVG9rZW4oKTtcbiAgICAgICAgdGhpcy5nZXRUZW1wbGF0ZSgpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IENvbWV0Q2hhdC5Db21ldENoYXRFeGNlcHRpb24pID0+IHtcbiAgICAgICAgaWYgKHRoaXMub25FcnJvcikge1xuICAgICAgICAgIHRoaXMub25FcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgdGhpcy5zZXRUaGVtZVN0eWxlKCk7XG4gIH1cblxuICB0cmFja0J5Rm5PcHRpb24oaW5kZXg6IG51bWJlciwgb3B0aW9uOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBvcHRpb24uaWQ7XG4gIH1cbiAgZ2V0VGVtcGxhdGUoKSB7XG4gICAgaWYgKHRoaXMuZGF0YSAmJiB0aGlzLmRhdGE/Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZGVmYXVsdFRlbXBsYXRlID0gdGhpcy5kYXRhO1xuICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRlZmF1bHRUZW1wbGF0ZSA9IENhbGxEZXRhaWxVdGlscy5nZXREZWZhdWx0Q2FsbFRlbXBsYXRlKFxuICAgICAgICB0aGlzLmNhbGwsXG4gICAgICAgIHRoaXMubG9nZ2VkSW5Vc2VyISxcbiAgICAgICAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWVcbiAgICAgICk7XG5cbiAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBnZXRUZW1wbGF0ZU9wdGlvbnMgPSAodGVtcGxhdGU6IENvbWV0Q2hhdERldGFpbHNUZW1wbGF0ZSkgPT4ge1xuICAgIGlmICh0ZW1wbGF0ZS5vcHRpb25zKSB7XG4gICAgICByZXR1cm4gdGVtcGxhdGUub3B0aW9ucyh0aGlzLnVzZXIsIHRoaXMuZ3JvdXAsIHRlbXBsYXRlLmlkIGFzIHN0cmluZyk7XG4gICAgfSBlbHNlIHJldHVybiBbXTtcbiAgfTtcblxuICBnZXRDdXN0b21PcHRpb25WaWV3KG9wdGlvbjogQ29tZXRDaGF0RGV0YWlsc09wdGlvbikge1xuICAgIHJldHVybiBvcHRpb24/LmN1c3RvbVZpZXc7XG4gIH1cblxuICBnZXRTZWN0aW9uSGVhZGVyU3R5bGUodGVtcGxhdGU6IENvbWV0Q2hhdERldGFpbHNUZW1wbGF0ZSkge1xuICAgIHJldHVybiB7XG4gICAgICB0ZXh0Rm9udDogdGVtcGxhdGUudGl0bGVGb250LFxuICAgICAgdGV4dENvbG9yOiB0ZW1wbGF0ZS50aXRsZUNvbG9yLFxuICAgIH07XG4gIH1cblxuICBvbk9wdGlvbkNsaWNrID0gKG9wdGlvbjogQ29tZXRDaGF0Q2FsbERldGFpbHNPcHRpb24pID0+IHtcbiAgICBpZiAob3B0aW9uPy5vbkNsaWNrKSB7XG4gICAgICBvcHRpb24ub25DbGljayh0aGlzLmNhbGwhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3dpdGNoIChvcHRpb24uaWQpIHtcbiAgICAgICAgY2FzZSBcInBhcnRpY2lwYW50c1wiOlxuICAgICAgICAgIHRoaXMuc2hvd0NhbGxMb2dEZXRhaWxPcHRpb25MaXN0ID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5zaG93UGFydGljaXBhbnRzTGlzdCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJyZWNvcmRpbmdzXCI6XG4gICAgICAgICAgdGhpcy5zaG93Q2FsbExvZ0RldGFpbE9wdGlvbkxpc3QgPSBmYWxzZTtcblxuICAgICAgICAgIHRoaXMuc2hvd0NhbGxSZWNvcmRpbmdMaXN0ID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKClcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiY2FsbEhpc3RvcnlcIjpcbiAgICAgICAgICB0aGlzLnNob3dDYWxsTG9nRGV0YWlsT3B0aW9uTGlzdCA9IGZhbHNlO1xuXG4gICAgICAgICAgdGhpcy5zaG93Q2FsbEhpc3RvcnkgPSB0cnVlO1xuICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKVxuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGdldEJ1dHRvblN0eWxlKG9wdGlvbjogQ29tZXRDaGF0RGV0YWlsc09wdGlvbikge1xuICAgIHJldHVybiB7XG4gICAgICBoZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgICAgIGJvcmRlclJhZGl1czogXCIwXCIsXG4gICAgICBidXR0b25UZXh0Rm9udDogb3B0aW9uPy50aXRsZUZvbnQsXG4gICAgICBidXR0b25UZXh0Q29sb3I6IG9wdGlvbj8udGl0bGVDb2xvcixcbiAgICAgIGJhY2tncm91bmQ6IG9wdGlvbj8uYmFja2dyb3VuZENvbG9yIHx8IFwidHJhbnNwYXJlbnRcIixcbiAgICB9O1xuICB9XG5cblxuICBoYW5kbGVQYWdlT25CYWNrQ2xpY2sgPSAoKSA9PiB7XG4gICAgdGhpcy5zaG93Q2FsbEhpc3RvcnkgPSBmYWxzZTtcbiAgICB0aGlzLnNob3dDYWxsUmVjb3JkaW5nTGlzdCA9IGZhbHNlO1xuICAgIHRoaXMuc2hvd1BhcnRpY2lwYW50c0xpc3QgPSBmYWxzZTtcbiAgICB0aGlzLnNob3dDb21ldENoYXRNZXNzYWdlcyA9IGZhbHNlO1xuICAgIHRoaXMuc2hvd0NhbGxMb2dEZXRhaWxPcHRpb25MaXN0ID0gdHJ1ZTtcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH07XG5cbiAgc3VidGl0bGVTdHlsZSh0ZW1wbGF0ZTogQ29tZXRDaGF0RGV0YWlsc1RlbXBsYXRlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHRGb250OiB0ZW1wbGF0ZS50aXRsZUZvbnQsXG4gICAgICB0ZXh0Q29sb3I6IHRlbXBsYXRlLnRpdGxlQ29sb3IsXG4gICAgfTtcbiAgfVxuICBzaG93RGF0YVNlY3Rpb25TdHlsZSh0ZW1wbGF0ZTogQ29tZXRDaGF0RGV0YWlsc1RlbXBsYXRlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHRGb250OiB0ZW1wbGF0ZS50aXRsZUZvbnQsXG4gICAgICB0ZXh0Q29sb3I6IHRlbXBsYXRlLnRpdGxlQ29sb3IsXG4gICAgfTtcbiAgfVxuXG4gIHNldFRoZW1lU3R5bGUoKSB7XG4gICAgdGhpcy5zZXREZXRhaWxzU3R5bGUoKTtcbiAgICB0aGlzLnNldEF2YXRhclN0eWxlKCk7XG4gICAgdGhpcy5zZXRMaXN0SXRlbVN0eWxlKCk7XG4gICAgdGhpcy5zZXREYXRlU3R5bGUoKTtcbiAgfVxuICBzZXRMaXN0SXRlbVN0eWxlKCkge1xuICAgIGxldCBkZWZhdWx0U3R5bGU6IExpc3RJdGVtU3R5bGUgPSBuZXcgTGlzdEl0ZW1TdHlsZSh7XG4gICAgICBoZWlnaHQ6IFwiNDVweFwiLFxuICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgYmFja2dyb3VuZDpcbiAgICAgICAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ1MCgpIHx8XG4gICAgICAgIHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QmFja2dyb3VuZCgpLFxuICAgICAgYWN0aXZlQmFja2dyb3VuZDogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgYm9yZGVyUmFkaXVzOiBcIjVweFwiLFxuICAgICAgdGl0bGVGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkudGl0bGUyKSxcbiAgICAgIHRpdGxlQ29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50KCksXG4gICAgICBib3JkZXI6IFwibm9uZVwiLFxuICAgICAgc2VwYXJhdG9yQ29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50MjAwKCksXG4gICAgICBob3ZlckJhY2tncm91bmQ6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50MTAwKCksXG4gICAgfSk7XG4gICAgdGhpcy5saXN0SXRlbVN0eWxlID0geyAuLi5kZWZhdWx0U3R5bGUsIC4uLnRoaXMubGlzdEl0ZW1TdHlsZSB9O1xuICB9XG4gIHNldEF2YXRhclN0eWxlKCkge1xuICAgIGxldCBkZWZhdWx0U3R5bGU6IEF2YXRhclN0eWxlID0gbmV3IEF2YXRhclN0eWxlKHtcbiAgICAgIGJvcmRlclJhZGl1czogXCIyNHB4XCIsXG4gICAgICB3aWR0aDogXCI0NnB4XCIsXG4gICAgICBoZWlnaHQ6IFwiNDZweFwiLFxuICAgICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ3MDAoKSxcbiAgICAgIG5hbWVUZXh0Q29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50OTAwKCksXG4gICAgICBiYWNrZ3JvdW5kU2l6ZTogXCJjb3ZlclwiLFxuICAgICAgbmFtZVRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkuc3VidGl0bGUxKSxcblxuICAgICAgb3V0ZXJWaWV3Qm9yZGVyU3BhY2luZzogXCJcIixcbiAgICB9KTtcbiAgICB0aGlzLmF2YXRhclN0eWxlID0geyAuLi5kZWZhdWx0U3R5bGUsIC4uLnRoaXMuYXZhdGFyU3R5bGUgfTtcbiAgfVxuXG4gIHNldERldGFpbHNTdHlsZSgpIHtcbiAgICBsZXQgZGVmYXVsdFN0eWxlOiBDYWxsTG9nRGV0YWlsc1N0eWxlID0gbmV3IENhbGxMb2dEZXRhaWxzU3R5bGUoe1xuICAgICAgYmFja2dyb3VuZDogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRCYWNrZ3JvdW5kKCksXG4gICAgICB0aXRsZUZvbnQ6IGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS50aXRsZTEpLFxuICAgICAgdGl0bGVDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQoKSxcbiAgICAgIGJhY2tJY29uVGludDogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRQcmltYXJ5KCksXG4gICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICBoZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgYm9yZGVyUmFkaXVzOiBcIlwiLFxuICAgICAgbmFtZVRleHRGb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnR5cG9ncmFwaHkuc3VidGl0bGUyKSxcbiAgICB9KTtcbiAgICB0aGlzLmNhbGxEZXRhaWxzU3R5bGUgPSB7IC4uLmRlZmF1bHRTdHlsZSwgLi4udGhpcy5jYWxsRGV0YWlsc1N0eWxlIH07XG4gIH1cblxuICBzZXREYXRlU3R5bGUoKSB7XG4gICAgbGV0IGRlZmF1bHRTdHlsZTogRGF0ZVN0eWxlID0gbmV3IERhdGVTdHlsZSh7XG4gICAgICB0ZXh0Rm9udDogZm9udEhlbHBlcih0aGlzLnRoZW1lU2VydmljZS50aGVtZS50eXBvZ3JhcGh5LmNhcHRpb24yKSxcbiAgICAgIHRleHRDb2xvcjogdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRBY2NlbnQ2MDAoKSxcbiAgICAgIGJhY2tncm91bmQ6IFwidHJhbnNwYXJlbnRcIixcbiAgICB9KTtcbiAgICB0aGlzLmRhdGVTdHlsZSA9IHsgLi4uZGVmYXVsdFN0eWxlLCAuLi50aGlzLmRhdGVTdHlsZSB9O1xuICB9XG4gIHdyYXBwZXJTdHlsZSA9ICgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IHRoaXMuY2FsbERldGFpbHNTdHlsZS53aWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5jYWxsRGV0YWlsc1N0eWxlLmhlaWdodCxcbiAgICAgIGJvcmRlcjogdGhpcy5jYWxsRGV0YWlsc1N0eWxlLmJvcmRlcixcbiAgICAgIGJvcmRlclJhZGl1czogdGhpcy5jYWxsRGV0YWlsc1N0eWxlLmJvcmRlclJhZGl1cyxcbiAgICAgIGJhY2tncm91bmQ6IHRoaXMuY2FsbERldGFpbHNTdHlsZS5iYWNrZ3JvdW5kLFxuICAgICAgcGFkZGluZzogJzE2cHgnLFxuICAgIH07XG4gIH07XG5cbiAgcHJvZmlsZUNvbnRhaW5lclN0eWxlID0gKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBoZWlnaHQ6IFwiYXV0b1wiLFxuICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgbWluSGVpZ2h0OiBcIjE1MHB4XCIsXG4gICAgICBwYWRkaW5nOiBcIjE2cHhcIixcbiAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcbiAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgIGJveFNpemluZzogXCJib3JkZXItYm94XCIsXG4gICAgICBnYXA6IFwiOHB4XCIsXG4gICAgfVxuICB9XG5cbiAgZ2V0VGFpbFZpZXdTdHlsZSA9ICgpID0+IHtcbiAgICByZXR1cm57XG4gICAgICBmb250OiBmb250SGVscGVyKHRoaXMudGhlbWVTZXJ2aWNlPy50aGVtZS50eXBvZ3JhcGh5LnRleHQzKSxcbiAgICAgIGNvbG9yOiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldEFjY2VudDYwMCgpXG4gICAgfVxuICB9XG5cbiAgZ2V0VGFpbFZpZXcodG90YWxTZWNvbmRzOiBudW1iZXIpIHtcbiAgICByZXR1cm4gQ2FsbExvZ1V0aWxzLmNvbnZlcnRNaW51dGVzVG9Ib3Vyc01pbnV0ZXNTZWNvbmRzKHRvdGFsU2Vjb25kcyk7XG4gIH1cblxuICBnZXRTdWJ0aXRsZShjYWxsOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBDYWxsTG9nVXRpbHMuZ2V0Q2FsbFN0YXR1c1dpdGhUeXBlKGNhbGwsIHRoaXMubG9nZ2VkSW5Vc2VyISk7XG4gIH1cblxuICBiYWNrQnV0dG9uU3R5bGUgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGhlaWdodDogXCIyNHB4XCIsXG4gICAgICB3aWR0aDogXCIyNHB4XCIsXG4gICAgICBib3JkZXI6IFwibm9uZVwiLFxuICAgICAgYm9yZGVyUmFkaXVzOiBcIjBcIixcbiAgICAgIGJhY2tncm91bmQ6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgIGJ1dHRvbkljb25UaW50OiB0aGlzLnRoZW1lU2VydmljZS50aGVtZS5wYWxldHRlLmdldFByaW1hcnkoKSxcbiAgICB9O1xuICB9O1xuICBnZXRMaXN0SXRlbVN0eWxlKG9wdGlvbjogQ29tZXRDaGF0RGV0YWlsc09wdGlvbikge1xuICAgIHJldHVybiB7XG4gICAgICBoZWlnaHQ6IFwiYXV0b1wiLFxuICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgYmFja2dyb3VuZDpcbiAgICAgICAgb3B0aW9uPy5iYWNrZ3JvdW5kQ29sb3IgfHxcbiAgICAgICAgdGhpcy50aGVtZVNlcnZpY2UudGhlbWUucGFsZXR0ZS5nZXRCYWNrZ3JvdW5kKCksXG4gICAgICBib3JkZXJSYWRpdXM6IFwiOHB4XCIsXG4gICAgICB0aXRsZUZvbnQ6XG4gICAgICAgIG9wdGlvbj8udGl0bGVGb250IHx8XG4gICAgICAgIGZvbnRIZWxwZXIodGhpcy50aGVtZVNlcnZpY2UudGhlbWUudHlwb2dyYXBoeS50aXRsZTIpLFxuXG4gICAgICBib3JkZXI6IFwibm9uZVwiLFxuICAgICAgc2VwYXJhdG9yQ29sb3I6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50MjAwKCksXG4gICAgICBob3ZlckJhY2tncm91bmQ6IHRoaXMudGhlbWVTZXJ2aWNlLnRoZW1lLnBhbGV0dGUuZ2V0QWNjZW50MTAwKCksXG4gICAgfTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNjLWNhbGwtbG9nLWRldGFpbHNfX3dyYXBwZXJcIiAqbmdJZj1cInVzZXIgfHwgZ3JvdXBcIiBbbmdTdHlsZV09XCJ3cmFwcGVyU3R5bGUoKVwiPlxuXG4gIDxkaXYgY2xhc3M9XCJjYy1jYWxsLWxvZy1kZXRhaWxzX19oZWFkZXJcIlxuICAgICpuZ0lmPVwib25CYWNrQ2xpY2sgJiYgIShzaG93UGFydGljaXBhbnRzTGlzdCB8fCBzaG93Q2FsbFJlY29yZGluZ0xpc3QgfHwgc2hvd0NhbGxIaXN0b3J5KVwiPlxuICAgIDxjb21ldGNoYXQtYnV0dG9uIFtpY29uVVJMXT1cImJhY2tJY29uVXJsXCIgY2xhc3M9XCJjYy1jYWxsLWxvZy1kZXRhaWxzX19jbG9zZS1idXR0b25cIiBbYnV0dG9uU3R5bGVdPVwiYmFja0J1dHRvblN0eWxlKClcIlxuICAgICAgKGNjLWJ1dHRvbi1jbGlja2VkKT1cIm9uQmFja0NsaWNrKClcIj48L2NvbWV0Y2hhdC1idXR0b24+XG4gICAgPGNvbWV0Y2hhdC1sYWJlbCBbdGV4dF09XCJ0aXRsZVwiIFtsYWJlbFN0eWxlXT1cImdldFRpdGxlU3R5bGUoKVwiPjwvY29tZXRjaGF0LWxhYmVsPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiY2MtY2FsbC1sb2ctZGV0YWlsc1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjYy1jYWxsLWxvZy1kZXRhaWxzX19wcm9maWxlXCJcbiAgICAgICpuZ0lmPVwiIWhpZGVQcm9maWxlICYmIHNob3dDYWxsTG9nRGV0YWlsT3B0aW9uTGlzdCAmJiAhKHNob3dQYXJ0aWNpcGFudHNMaXN0IHx8IHNob3dDYWxsUmVjb3JkaW5nTGlzdCB8fCBzaG93Q2FsbEhpc3RvcnkpXCI+XG5cblxuICAgICAgPGRpdiBjbGFzcz1cIiBjYy1jYWxsLWxvZy1kZXRhaWxzX19kZWZhdWx0LXByb2ZpbGVcIiAqbmdJZj1cIiFjdXN0b21Qcm9maWxlVmlldztlbHNlIGxpc3RpdGVtXCIgW25nU3R5bGVdPVwicHJvZmlsZUNvbnRhaW5lclN0eWxlKClcIj5cbiAgICAgICAgPGNvbWV0Y2hhdC1hdmF0YXIgW25hbWVdPVwidXNlcj8uZ2V0TmFtZSgpID8/IGdyb3VwPy5nZXROYW1lKClcIiBbYXZhdGFyU3R5bGVdPVwiYXZhdGFyU3R5bGVcIlxuICAgICAgICAgIFtpbWFnZV09XCJ1c2VyPy5nZXRBdmF0YXIoKSA/PyBncm91cD8uZ2V0SWNvbigpXCI+XG4gICAgICAgIDwvY29tZXRjaGF0LWF2YXRhcj5cblxuICAgICAgICA8Y29tZXRjaGF0LWxhYmVsIFt0ZXh0XT1cInVzZXI/LmdldE5hbWUoKSA/PyB0aGlzLmdyb3VwPy5nZXROYW1lKClcIiBbbGFiZWxTdHlsZV09XCJsYWJlbFN0eWxlXCI+PC9jb21ldGNoYXQtbGFiZWw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2MtY2FsbC1sb2ctZGV0YWlsc19fc2VjdGlvbi1saXN0XCJcbiAgICAgICpuZ0lmPVwic2hvd0NhbGxMb2dEZXRhaWxPcHRpb25MaXN0ICYmIGRlZmF1bHRUZW1wbGF0ZSAmJiBkZWZhdWx0VGVtcGxhdGUubGVuZ3RoID4gMFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNjLWNhbGwtbG9nLWRldGFpbHNfX3NlY3Rpb25cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkZWZhdWx0VGVtcGxhdGVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNjLWNhbGwtbG9nLWRldGFpbHNfX3NlY3Rpb24tc2VwYXJhdG9yXCIgKm5nSWY9XCJpdGVtLnRpdGxlXCI+XG4gICAgICAgICAgPGNvbWV0Y2hhdC1sYWJlbCBbdGV4dF09XCJpdGVtLnRpdGxlXCI+PC9jb21ldGNoYXQtbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2MtY2FsbC1sb2ctZGV0YWlsc19fb3B0aW9ucy13cmFwcGVyXCIgKm5nSWY9XCJnZXRUZW1wbGF0ZU9wdGlvbnMoaXRlbSlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2MtY2FsbC1sb2ctZGV0YWlsc19fb3B0aW9uc1wiICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgZ2V0VGVtcGxhdGVPcHRpb25zKGl0ZW0pOyAgdHJhY2tCeTogdHJhY2tCeUZuT3B0aW9uIFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNjLWNhbGwtbG9nLWRldGFpbHNfX29wdGlvblwiICpuZ0lmPVwiIWdldEN1c3RvbU9wdGlvblZpZXcob3B0aW9uKTtlbHNlIGN1c3RvbVZpZXdcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNjLWNhbGwtbG9nLWRldGFpbHNfX29wdGlvbi1lbGVtZW50XCI+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2MtY2FsbC1sb2ctZGV0YWlsc19fY2FsbGluZy1kZWZhdWx0LW9wdGlvblwiICpuZ0lmPVwib3B0aW9uLmlkPT0nY2FsbHMnXCI+XG5cbiAgICAgICAgICAgICAgICAgIDxjb21ldGNoYXQtY2FsbC1idXR0b25zIFt1c2VyXT1cInVzZXJcIiBbZ3JvdXBdPVwiZ3JvdXBcIlxuICAgICAgICAgICAgICAgICAgICBbY2FsbEJ1dHRvbnNTdHlsZV09XCJjYWxsQnV0dG9uc0NvbmZpZ3VyYXRpb24uY2FsbEJ1dHRvbnNTdHlsZVwiXG4gICAgICAgICAgICAgICAgICAgIFtvblZpZGVvQ2FsbENsaWNrXT1cImNhbGxCdXR0b25zQ29uZmlndXJhdGlvbi5vblZpZGVvQ2FsbENsaWNrXCJcbiAgICAgICAgICAgICAgICAgICAgW29uVm9pY2VDYWxsQ2xpY2tdPVwiY2FsbEJ1dHRvbnNDb25maWd1cmF0aW9uLm9uVm9pY2VDYWxsQ2xpY2tcIlxuICAgICAgICAgICAgICAgICAgICBbdmlkZW9DYWxsSWNvblVSTF09XCJjYWxsQnV0dG9uc0NvbmZpZ3VyYXRpb24udmlkZW9DYWxsSWNvblVSTFwiXG4gICAgICAgICAgICAgICAgICAgIFt2b2ljZUNhbGxJY29uVVJMXT1cImNhbGxCdXR0b25zQ29uZmlndXJhdGlvbi52b2ljZUNhbGxJY29uVVJMXCI+PC9jb21ldGNoYXQtY2FsbC1idXR0b25zPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxjb21ldGNoYXQtbGlzdC1pdGVtICpuZ0lmPVwib3B0aW9uLmlkPT09J2NhbGxTdGF0dXMnXCIgW2xpc3RJdGVtU3R5bGVdPVwiZ2V0TGlzdEl0ZW1TdHlsZShvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgIFtoaWRlU2VwYXJhdG9yXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYy1jYWxsLWxvZy1kZXRhaWxzX19jYWxsLVN0YXR1c1wiIHNsb3Q9XCJzdWJ0aXRsZVZpZXdcIiA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc3VidGl0bGVWaWV3OyBlbHNlIHN1YnRpdGxlXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2PiA8Y29tZXRjaGF0LWRhdGUgW2RhdGVTdHlsZV09XCJkYXRlU3R5bGVcIiBbdGltZXN0YW1wXT1cImNhbGw/LmdldEluaXRpYXRlZEF0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbcGF0dGVybl09XCJkYXRlUGF0dGVybjJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvY29tZXRjaGF0LWRhdGU+PC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYy1jYWxsLWxvZy1kZXRhaWxzX19jYWxsLVN0YXR1c19fc3ViVGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbWV0Y2hhdC1kYXRlIFtkYXRlU3R5bGVdPVwiZGF0ZVN0eWxlXCIgW3RpbWVzdGFtcF09XCJjYWxsPy5nZXRJbml0aWF0ZWRBdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGF0dGVybl09XCJkYXRlUGF0dGVyblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbWV0Y2hhdC1kYXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29tZXRjaGF0LWxhYmVsIFt0ZXh0XT1cImdldFN1YnRpdGxlKGNhbGwpXCIgW2xhYmVsU3R5bGVdPVwic3VidGl0bGVTdHlsZShvcHRpb24pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29tZXRjaGF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2MtY2FsbC1sb2ctZGV0YWlsc19fY2FsbC1TdGF0dXNfX3RhaWx2aWV3XCIgW3N0eWxlXT1cImdldFRhaWxWaWV3U3R5bGUoKVwiPiB7eyBnZXRUYWlsVmlldyhjYWxsPy5nZXRUb3RhbER1cmF0aW9uSW5NaW51dGVzKCkhKSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc3VidGl0bGU+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInN1YnRpdGxlVmlldztjb250ZXh0OnsgJGltcGxpY2l0OiB1c2VyID8/IGdyb3VwIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICA8L2NvbWV0Y2hhdC1saXN0LWl0ZW0+XG4gICAgICAgICAgICAgICAgPGNvbWV0Y2hhdC1saXN0LWl0ZW0gKm5nSWY9XCJvcHRpb24uaWQhPT0nY2FsbHMnICYmIG9wdGlvbi5pZCE9PSdjYWxsU3RhdHVzJyBcIlxuICAgICAgICAgICAgICAgICAgKGNjLWxpc3RpdGVtLWNsaWNrZWQpPVwib25PcHRpb25DbGljayhvcHRpb24pXCIgW2xpc3RJdGVtU3R5bGVdPVwiZ2V0TGlzdEl0ZW1TdHlsZShvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCJvcHRpb24udGl0bGVcIiBbaGlkZVNlcGFyYXRvcl09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHNsb3Q9XCJ0YWlsVmlld1wiIGNsYXNzPVwiY2MtY2FsbC1sb2ctZGV0YWlsc19fc2Vjb25kYXJ5LXZpZXdfX3RhaWwtdmlld1wiIFtzdHlsZV09XCJnZXRUYWlsVmlld1N0eWxlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e29wdGlvbi50YWlsfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb21ldGNoYXQtaWNvbiBbaWNvblN0eWxlXT1cImljb25TdHlsZVwiIFtVUkxdPVwiZ3JlYXRlclRoYW5JY29uVVJMXCI+PC9jb21ldGNoYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICA8L2NvbWV0Y2hhdC1saXN0LWl0ZW0+XG5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VzdG9tVmlldz5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImdldEN1c3RvbU9wdGlvblZpZXcob3B0aW9uKVwiPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cblxuXG4gICAgPGRpdiAqbmdJZj1cInNob3dQYXJ0aWNpcGFudHNMaXN0IHx8IHNob3dDYWxsUmVjb3JkaW5nTGlzdCB8fCBzaG93Q2FsbEhpc3RvcnlcIiBzdHlsZT1cIiBoZWlnaHQ6IDEwMCU7XCI+XG5cbiAgICAgIDxkaXYgKm5nSWY9XCJzaG93UGFydGljaXBhbnRzTGlzdFwiIHN0eWxlPVwiaGVpZ2h0OiAxMDAlO1wiPlxuICAgICAgICA8Y29tZXRjaGF0LWNhbGwtbG9nLXBhcnRpY2lwYW50cyBbY2FsbF09XCJjYWxsXCJcbiAgICAgICAgICBbb25CYWNrQ2xpY2tdPVwiY2FsbExvZ1BhcnRpY2lwYW50c0NvbmZpZ3VyYXRpb24ub25CYWNrQ2xpY2sgfHwgaGFuZGxlUGFnZU9uQmFja0NsaWNrXCJcbiAgICAgICAgICBbYmFja0ljb25VcmxdPVwiY2FsbExvZ1BhcnRpY2lwYW50c0NvbmZpZ3VyYXRpb24uYmFja0ljb25VcmwgfHwgYmFja0ljb25VcmxcIlxuICAgICAgICAgIFthdmF0YXJTdHlsZV09XCJjYWxsTG9nUGFydGljaXBhbnRzQ29uZmlndXJhdGlvbi5hdmF0YXJTdHlsZVwiXG4gICAgICAgICAgW29uSXRlbUNsaWNrXT1cImNhbGxMb2dQYXJ0aWNpcGFudHNDb25maWd1cmF0aW9uLm9uSXRlbUNsaWNrIVwiXG4gICAgICAgICAgW2RhdGVQYXR0ZXJuXT1cImNhbGxMb2dQYXJ0aWNpcGFudHNDb25maWd1cmF0aW9uLmRhdGVQYXR0ZXJuXCJcbiAgICAgICAgICBbc3VidGl0bGVWaWV3XT1cImNhbGxMb2dQYXJ0aWNpcGFudHNDb25maWd1cmF0aW9uLnN1YnRpdGxlVmlld1wiXG4gICAgICAgICAgW2xpc3RJdGVtVmlld109XCJjYWxsTG9nUGFydGljaXBhbnRzQ29uZmlndXJhdGlvbi5saXN0SXRlbVZpZXdcIlxuXG4gICAgICAgICAgW2xpc3RJdGVtU3R5bGVdPVwiY2FsbExvZ1BhcnRpY2lwYW50c0NvbmZpZ3VyYXRpb24ubGlzdEl0ZW1TdHlsZVwiIFtjYWxsTG9nUGFydGljaXBhbnRzU3R5bGVdPVwiXG4gICAgICAgIGNhbGxMb2dQYXJ0aWNpcGFudHNDb25maWd1cmF0aW9uLmNhbGxMb2dQYXJ0aWNpcGFudHNTdHlsZVwiXG4gICAgICAgXG4gICAgICAgICAgW3RhaWxWaWV3XT1cImNhbGxMb2dQYXJ0aWNpcGFudHNDb25maWd1cmF0aW9uLnRhaWxWaWV3XCI+PC9jb21ldGNoYXQtY2FsbC1sb2ctcGFydGljaXBhbnRzPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwic2hvd0NhbGxSZWNvcmRpbmdMaXN0XCIgc3R5bGU9XCJoZWlnaHQ6MTAwJTtcIj5cbiAgICAgICAgPGNvbWV0Y2hhdC1jYWxsLWxvZy1yZWNvcmRpbmdzIFtjYWxsXT1cImNhbGxcIlxuICAgICAgICAgIFtiYWNrSWNvblVybF09XCJjYWxsTG9nUmVjb3JkaW5nc0NvbmZpZ3VyYXRpb24uYmFja0ljb25VcmwgfHwgYmFja0ljb25VcmxcIiBbb25CYWNrQ2xpY2tdPVwiXG4gICAgICAgIGNhbGxMb2dSZWNvcmRpbmdzQ29uZmlndXJhdGlvbi5vbkJhY2tDbGljayB8fCBoYW5kbGVQYWdlT25CYWNrQ2xpY2tcbiAgICAgIFwiIFtvbkl0ZW1DbGlja109XCJjYWxsTG9nUmVjb3JkaW5nc0NvbmZpZ3VyYXRpb24ub25JdGVtQ2xpY2shXCJcbiAgICAgICAgICBbZGF0ZVBhdHRlcm5dPVwiY2FsbExvZ1JlY29yZGluZ3NDb25maWd1cmF0aW9uLmRhdGVQYXR0ZXJuIVwiXG4gICAgICAgICAgW2xpc3RJdGVtU3R5bGVdPVwiY2FsbExvZ1JlY29yZGluZ3NDb25maWd1cmF0aW9uLmxpc3RJdGVtU3R5bGVcIiBjYWxsTG9nUmVjb3JkaW5nc1N0eWxlPVwiXG4gICAgICAgIGNhbGxMb2dSZWNvcmRpbmdzQ29uZmlndXJhdGlvbi5jYWxsTG9nUmVjb3JkaW5nc1N0eWxlXG4gICAgICAgIGNhbGxMb2dSZWNvcmRpbmdzQ29uZmlndXJhdGlvbi5oaWRlRG93bmxvYWRCdXR0b24gfHwgZmFsc2VcbiAgICAgIFwiIFtvbkRvd25sb2FkQ2xpY2tdPVwiY2FsbExvZ1JlY29yZGluZ3NDb25maWd1cmF0aW9uLm9uRG93bmxvYWRDbGljayFcIlxuICAgICAgICAgIFtsaXN0SXRlbVZpZXddPVwiY2FsbExvZ1JlY29yZGluZ3NDb25maWd1cmF0aW9uLmxpc3RJdGVtVmlld1wiXG4gICAgICAgICAgW3N1YnRpdGxlVmlld109XCJjYWxsTG9nUmVjb3JkaW5nc0NvbmZpZ3VyYXRpb24uc3VidGl0bGVWaWV3XCJcbiAgICAgICAgICBbdGFpbFZpZXddPVwiY2FsbExvZ1JlY29yZGluZ3NDb25maWd1cmF0aW9uLnRhaWxWaWV3XCI+PC9jb21ldGNoYXQtY2FsbC1sb2ctcmVjb3JkaW5ncz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cInNob3dDYWxsSGlzdG9yeVwiIHN0eWxlPVwiaGVpZ2h0OiAxMDAlOyBcIj5cbiAgICAgICAgPGNvbWV0Y2hhdC1jYWxsLWxvZy1oaXN0b3J5IFtjYWxsXT1cImNhbGxcIiBbdXNlcl09XCJ1c2VyXCIgW2dyb3VwXT1cImdyb3VwXCIgW29uQmFja0NsaWNrXT1cImhhbmRsZVBhZ2VPbkJhY2tDbGlja1wiXG4gICAgICAgICAgW2JhY2tJY29uVXJsXT1cImNhbGxMb2dIaXN0b3J5Q29uZmlndXJhdGlvbi5iYWNrSWNvblVybCB8fCBiYWNrSWNvblVybFwiXG4gICAgICAgICAgW2VtcHR5U3RhdGVWaWV3XT1cImNhbGxMb2dIaXN0b3J5Q29uZmlndXJhdGlvbi5lbXB0eVN0YXRlVmlld1wiXG4gICAgICAgICAgW2Vycm9yU3RhdGVWaWV3XT1cImNhbGxMb2dIaXN0b3J5Q29uZmlndXJhdGlvbi5lcnJvclN0YXRlVmlld1wiXG4gICAgICAgICAgW2xvYWRpbmdJY29uVVJMXT1cImNhbGxMb2dIaXN0b3J5Q29uZmlndXJhdGlvbi5sb2FkaW5nSWNvblVSTFwiXG4gICAgICAgICAgW2xvYWRpbmdTdGF0ZVZpZXddPVwiY2FsbExvZ0hpc3RvcnlDb25maWd1cmF0aW9uLmxvYWRpbmdTdGF0ZVZpZXdcIlxuICAgICAgICAgIFt0YWlsVmlld109XCJjYWxsTG9nSGlzdG9yeUNvbmZpZ3VyYXRpb24udGFpbFZpZXdcIiBbY2FsbExvZ1JlcXVlc3RCdWlsZGVyXT1cIlxuICAgICAgICAgICAgY2FsbExvZ0hpc3RvcnlDb25maWd1cmF0aW9uLmNhbGxMb2dSZXF1ZXN0QnVpbGRlclxuICAgICAgICAgIFwiIFtvbkl0ZW1DbGlja109XCJjYWxsTG9nSGlzdG9yeUNvbmZpZ3VyYXRpb24ub25JdGVtQ2xpY2sgfHwgb25JdGVtQ2xpY2tcIiBbb25CYWNrQ2xpY2tdPVwiXG4gICAgICAgICAgICBjYWxsTG9nSGlzdG9yeUNvbmZpZ3VyYXRpb24ub25CYWNrQ2xpY2sgfHwgaGFuZGxlUGFnZU9uQmFja0NsaWNrXG4gICAgICAgICAgXCIgW2xpc3RJdGVtU3R5bGVdPVwiY2FsbExvZ0hpc3RvcnlDb25maWd1cmF0aW9uLmxpc3RJdGVtU3R5bGVcIlxuICAgICAgICAgIFtkYXRlUGF0dGVybl09XCJjYWxsTG9nSGlzdG9yeUNvbmZpZ3VyYXRpb24uZGF0ZVBhdHRlcm5cIiBbZGF0ZVNlcGFyYXRvclBhdHRlcm5dPVwiXG4gICAgICAgICAgICBjYWxsTG9nSGlzdG9yeUNvbmZpZ3VyYXRpb24uZGF0ZVNlcGFyYXRvclBhdHRlcm5cbiAgICAgICAgICBcIiBbY2FsbExvZ0hpc3RvcnlTdHlsZV09XCJcbiAgICAgICAgICAgIGNhbGxMb2dIaXN0b3J5Q29uZmlndXJhdGlvbi5jYWxsTG9nSGlzdG9yeVN0eWxlXG4gICAgICAgICAgXCIgW29uRXJyb3JdPVwiY2FsbExvZ0hpc3RvcnlDb25maWd1cmF0aW9uLm9uRXJyb3IhXCI+PC9jb21ldGNoYXQtY2FsbC1sb2ctaGlzdG9yeT5cbiAgICAgIDwvZGl2PlxuXG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cblxuPG5nLXRlbXBsYXRlICNsaXN0aXRlbT5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbVByb2ZpbGVWaWV3XCI+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT4iXX0=