@muraai/mnl-chat 0.0.1 → 0.2.0-alpha-db495b1

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 (87) hide show
  1. package/esm2022/lib/chat.module.mjs +87 -0
  2. package/esm2022/lib/components/ng-chat/ng-chat.component.mjs +594 -0
  3. package/esm2022/lib/components/ng-chat-friends-list/ng-chat-friends-list.component.mjs +166 -0
  4. package/esm2022/lib/components/ng-chat-options/ng-chat-options.component.mjs +29 -0
  5. package/esm2022/lib/components/ng-chat-window/ng-chat-window.component.mjs +272 -0
  6. package/esm2022/lib/core/chat-adapter.mjs +18 -0
  7. package/esm2022/lib/core/chat-controller.mjs +2 -0
  8. package/esm2022/lib/core/chat-group-adapter.mjs +2 -0
  9. package/esm2022/lib/core/chat-option.mjs +2 -0
  10. package/esm2022/lib/core/chat-participant-status-descriptor.mjs +6 -0
  11. package/{esm2020 → esm2022}/lib/core/chat-participant-status.enum.mjs +1 -1
  12. package/esm2022/lib/core/chat-participant-type.enum.mjs +6 -0
  13. package/esm2022/lib/core/chat-participant.mjs +2 -0
  14. package/esm2022/lib/core/default-file-upload-adapter.mjs +43 -0
  15. package/esm2022/lib/core/file-upload-adapter.mjs +2 -0
  16. package/esm2022/lib/core/group.mjs +14 -0
  17. package/esm2022/lib/core/guid.mjs +11 -0
  18. package/esm2022/lib/core/localization.mjs +2 -0
  19. package/esm2022/lib/core/message-counter.mjs +25 -0
  20. package/esm2022/lib/core/message-type.enum.mjs +7 -0
  21. package/esm2022/lib/core/message.mjs +7 -0
  22. package/esm2022/lib/core/paged-history-chat-adapter.mjs +9 -0
  23. package/esm2022/lib/core/participant-metadata.mjs +6 -0
  24. package/esm2022/lib/core/participant-response.mjs +3 -0
  25. package/esm2022/lib/core/scroll-direction.enum.mjs +6 -0
  26. package/esm2022/lib/core/theme.enum.mjs +7 -0
  27. package/esm2022/lib/core/user.mjs +7 -0
  28. package/esm2022/lib/core/window.mjs +20 -0
  29. package/esm2022/lib/firstLetter.pipe.mjs +20 -0
  30. package/esm2022/lib/material.module.mjs +65 -0
  31. package/esm2022/lib/pipes/emojify.pipe.mjs +41 -0
  32. package/esm2022/lib/pipes/group-message-display-name.pipe.mjs +24 -0
  33. package/esm2022/lib/pipes/linkfy.pipe.mjs +34 -0
  34. package/esm2022/lib/pipes/sanitize.pipe.mjs +21 -0
  35. package/esm2022/lib/services/chat.service.mjs +14 -0
  36. package/esm2022/muraai-mnl-chat.mjs +5 -0
  37. package/esm2022/public-api.mjs +25 -0
  38. package/fesm2022/muraai-mnl-chat.mjs +1507 -0
  39. package/fesm2022/muraai-mnl-chat.mjs.map +1 -0
  40. package/lib/components/ng-chat/ng-chat.component.d.ts +3 -1
  41. package/lib/components/ng-chat-friends-list/ng-chat-friends-list.component.d.ts +11 -3
  42. package/lib/components/ng-chat-options/ng-chat-options.component.d.ts +1 -1
  43. package/lib/components/ng-chat-window/ng-chat-window.component.d.ts +3 -1
  44. package/lib/core/chat-participant.d.ts +12 -0
  45. package/lib/material.module.d.ts +6 -3
  46. package/package.json +7 -13
  47. package/src/assets/themes/ng-chat.theme.dark.scss +1 -1
  48. package/esm2020/lib/chat.module.mjs +0 -87
  49. package/esm2020/lib/components/ng-chat/ng-chat.component.mjs +0 -588
  50. package/esm2020/lib/components/ng-chat-friends-list/ng-chat-friends-list.component.mjs +0 -128
  51. package/esm2020/lib/components/ng-chat-options/ng-chat-options.component.mjs +0 -29
  52. package/esm2020/lib/components/ng-chat-window/ng-chat-window.component.mjs +0 -247
  53. package/esm2020/lib/core/chat-adapter.mjs +0 -18
  54. package/esm2020/lib/core/chat-controller.mjs +0 -2
  55. package/esm2020/lib/core/chat-group-adapter.mjs +0 -2
  56. package/esm2020/lib/core/chat-option.mjs +0 -2
  57. package/esm2020/lib/core/chat-participant-status-descriptor.mjs +0 -6
  58. package/esm2020/lib/core/chat-participant-type.enum.mjs +0 -6
  59. package/esm2020/lib/core/chat-participant.mjs +0 -2
  60. package/esm2020/lib/core/default-file-upload-adapter.mjs +0 -43
  61. package/esm2020/lib/core/file-upload-adapter.mjs +0 -2
  62. package/esm2020/lib/core/group.mjs +0 -14
  63. package/esm2020/lib/core/guid.mjs +0 -11
  64. package/esm2020/lib/core/localization.mjs +0 -2
  65. package/esm2020/lib/core/message-counter.mjs +0 -25
  66. package/esm2020/lib/core/message-type.enum.mjs +0 -7
  67. package/esm2020/lib/core/message.mjs +0 -7
  68. package/esm2020/lib/core/paged-history-chat-adapter.mjs +0 -9
  69. package/esm2020/lib/core/participant-metadata.mjs +0 -6
  70. package/esm2020/lib/core/participant-response.mjs +0 -3
  71. package/esm2020/lib/core/scroll-direction.enum.mjs +0 -6
  72. package/esm2020/lib/core/theme.enum.mjs +0 -7
  73. package/esm2020/lib/core/user.mjs +0 -7
  74. package/esm2020/lib/core/window.mjs +0 -20
  75. package/esm2020/lib/firstLetter.pipe.mjs +0 -20
  76. package/esm2020/lib/material.module.mjs +0 -50
  77. package/esm2020/lib/pipes/emojify.pipe.mjs +0 -41
  78. package/esm2020/lib/pipes/group-message-display-name.pipe.mjs +0 -24
  79. package/esm2020/lib/pipes/linkfy.pipe.mjs +0 -34
  80. package/esm2020/lib/pipes/sanitize.pipe.mjs +0 -21
  81. package/esm2020/lib/services/chat.service.mjs +0 -14
  82. package/esm2020/muraai-mnl-chat.mjs +0 -5
  83. package/esm2020/public-api.mjs +0 -25
  84. package/fesm2015/muraai-mnl-chat.mjs +0 -1426
  85. package/fesm2015/muraai-mnl-chat.mjs.map +0 -1
  86. package/fesm2020/muraai-mnl-chat.mjs +0 -1424
  87. package/fesm2020/muraai-mnl-chat.mjs.map +0 -1
@@ -0,0 +1,272 @@
1
+ /* eslint-disable */
2
+ import { Component, Input, Output, EventEmitter, ViewEncapsulation, ViewChild } from '@angular/core';
3
+ import { Message } from "../../core/message";
4
+ import { MessageType } from "../../core/message-type.enum";
5
+ import { ChatParticipantStatus } from "../../core/chat-participant-status.enum";
6
+ import { ScrollDirection } from "../../core/scroll-direction.enum";
7
+ import { ChatParticipantType } from "../../core/chat-participant-type.enum";
8
+ import { MessageCounter } from "../../core/message-counter";
9
+ import { chatParticipantStatusDescriptor } from '../../core/chat-participant-status-descriptor';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@angular/forms";
12
+ import * as i2 from "@angular/material/tooltip";
13
+ import * as i3 from "@angular/common";
14
+ import * as i4 from "../../pipes/emojify.pipe";
15
+ import * as i5 from "../../pipes/linkfy.pipe";
16
+ import * as i6 from "../../pipes/group-message-display-name.pipe";
17
+ export class NgChatWindowComponent {
18
+ constructor() {
19
+ this.emojisEnabled = true;
20
+ this.linkfyEnabled = true;
21
+ this.showMessageDate = true;
22
+ this.messageDatePipeFormat = "short";
23
+ this.hasPagedHistory = true;
24
+ this.onChatWindowClosed = new EventEmitter();
25
+ this.onMessagesSeen = new EventEmitter();
26
+ this.onMessageSent = new EventEmitter();
27
+ this.onTabTriggered = new EventEmitter();
28
+ this.onOptionTriggered = new EventEmitter();
29
+ this.onLoadHistoryTriggered = new EventEmitter();
30
+ // File upload state
31
+ this.fileUploadersInUse = []; // Id bucket of uploaders in use
32
+ // Exposes enums and functions for the ng-template
33
+ this.ChatParticipantType = ChatParticipantType;
34
+ this.ChatParticipantStatus = ChatParticipantStatus;
35
+ this.MessageType = MessageType;
36
+ this.chatParticipantStatusDescriptor = chatParticipantStatusDescriptor;
37
+ }
38
+ defaultWindowOptions(currentWindow) {
39
+ if (this.showOptions && currentWindow.participant.participantType == ChatParticipantType.User) {
40
+ return [{
41
+ isActive: false,
42
+ chattingTo: currentWindow,
43
+ validateContext: (participant) => {
44
+ return participant.participantType == ChatParticipantType.User;
45
+ },
46
+ displayLabel: 'Add People' // TODO: Localize this
47
+ }];
48
+ }
49
+ return [];
50
+ }
51
+ // Asserts if a user avatar is visible in a chat cluster
52
+ isAvatarVisible(window, message, index) {
53
+ if (message.fromId != this.userId) {
54
+ if (index == 0) {
55
+ return true; // First message, good to show the thumbnail
56
+ }
57
+ else {
58
+ // Check if the previous message belongs to the same user, if it belongs there is no need to show the avatar again to form the message cluster
59
+ if (window.messages[index - 1].fromId != message.fromId) {
60
+ return true;
61
+ }
62
+ }
63
+ }
64
+ return false;
65
+ }
66
+ getChatWindowAvatar(participant, message) {
67
+ if (participant.participantType == ChatParticipantType.User) {
68
+ return participant.avatar;
69
+ }
70
+ else if (participant.participantType == ChatParticipantType.Group) {
71
+ let group = participant;
72
+ let userIndex = group.chattingTo.findIndex(x => x.id == message.fromId);
73
+ return group.chattingTo[userIndex >= 0 ? userIndex : 0].avatar;
74
+ }
75
+ return null;
76
+ }
77
+ isUploadingFile(window) {
78
+ const fileUploadInstanceId = this.getUniqueFileUploadInstanceId(window);
79
+ return this.fileUploadersInUse.indexOf(fileUploadInstanceId) > -1;
80
+ }
81
+ // Generates a unique file uploader id for each participant
82
+ getUniqueFileUploadInstanceId(window) {
83
+ if (window && window.participant) {
84
+ return `ng-chat-file-upload-${window.participant.id}`;
85
+ }
86
+ return 'ng-chat-file-upload';
87
+ }
88
+ unreadMessagesTotal(window) {
89
+ return MessageCounter.unreadMessagesTotal(window, this.userId);
90
+ }
91
+ // Scrolls a chat window message flow to the bottom
92
+ scrollChatWindow(window, direction) {
93
+ if (!window.isCollapsed) {
94
+ setTimeout(() => {
95
+ if (this.chatMessages) {
96
+ let element = this.chatMessages.nativeElement;
97
+ let position = (direction === ScrollDirection.Top) ? 0 : element.scrollHeight;
98
+ element.scrollTop = position;
99
+ }
100
+ });
101
+ }
102
+ }
103
+ activeOptionTrackerChange(option) {
104
+ this.onOptionTriggered.emit(option);
105
+ }
106
+ // Triggers native file upload for file selection from the user
107
+ triggerNativeFileUpload(window) {
108
+ if (window) {
109
+ if (this.nativeFileInput)
110
+ this.nativeFileInput.nativeElement.click();
111
+ }
112
+ }
113
+ // Toggles a window focus on the focus/blur of a 'newMessage' input
114
+ toggleWindowFocus(window) {
115
+ window.hasFocus = !window.hasFocus;
116
+ if (window.hasFocus) {
117
+ const unreadMessages = window.messages
118
+ .filter(message => message.dateSeen == null
119
+ && (message.toId == this.userId || window.participant.participantType === ChatParticipantType.Group));
120
+ if (unreadMessages && unreadMessages.length > 0) {
121
+ this.onMessagesSeen.emit(unreadMessages);
122
+ }
123
+ }
124
+ }
125
+ markMessagesAsRead(messages) {
126
+ this.onMessagesSeen.emit(messages);
127
+ }
128
+ fetchMessageHistory(window) {
129
+ this.onLoadHistoryTriggered.emit(window);
130
+ }
131
+ // Closes a chat window via the close 'X' button
132
+ onCloseChatWindow() {
133
+ this.onChatWindowClosed.emit({ closedWindow: this.window, closedViaEscapeKey: false });
134
+ }
135
+ /* Monitors pressed keys on a chat window
136
+ - Dispatches a message when the ENTER key is pressed
137
+ - Tabs between windows on TAB or SHIFT + TAB
138
+ - Closes the current focused window on ESC
139
+ */
140
+ onChatInputTyped(event, window) {
141
+ switch (event.keyCode) {
142
+ case 13:
143
+ if (window.newMessage && window.newMessage.trim() != "") {
144
+ let message = new Message();
145
+ message.fromId = this.userId;
146
+ message.toId = window.participant.id;
147
+ message.message = window.newMessage;
148
+ message.dateSent = new Date();
149
+ window.messages.push(message);
150
+ this.onMessageSent.emit(message);
151
+ window.newMessage = ""; // Resets the new message input
152
+ this.scrollChatWindow(window, ScrollDirection.Bottom);
153
+ }
154
+ break;
155
+ case 9:
156
+ event.preventDefault();
157
+ this.onTabTriggered.emit({ triggeringWindow: window, shiftKeyPressed: event.shiftKey });
158
+ break;
159
+ case 27:
160
+ this.onChatWindowClosed.emit({ closedWindow: window, closedViaEscapeKey: true });
161
+ break;
162
+ }
163
+ }
164
+ // Toggles a chat window visibility between maximized/minimized
165
+ onChatWindowClicked(window) {
166
+ window.isCollapsed = !window.isCollapsed;
167
+ this.scrollChatWindow(window, ScrollDirection.Bottom);
168
+ }
169
+ clearInUseFileUploader(fileUploadInstanceId) {
170
+ const uploaderInstanceIdIndex = this.fileUploadersInUse.indexOf(fileUploadInstanceId);
171
+ if (uploaderInstanceIdIndex > -1) {
172
+ this.fileUploadersInUse.splice(uploaderInstanceIdIndex, 1);
173
+ }
174
+ }
175
+ // Handles file selection and uploads the selected file using the file upload adapter
176
+ onFileChosen(window) {
177
+ const fileUploadInstanceId = this.getUniqueFileUploadInstanceId(window);
178
+ const uploadElementRef = this.nativeFileInput;
179
+ if (uploadElementRef) {
180
+ const file = uploadElementRef.nativeElement.files[0];
181
+ this.fileUploadersInUse.push(fileUploadInstanceId);
182
+ this.fileUploadAdapter.uploadFile(file, window.participant.id)
183
+ .subscribe(fileMessage => {
184
+ this.clearInUseFileUploader(fileUploadInstanceId);
185
+ fileMessage.fromId = this.userId;
186
+ // Push file message to current user window
187
+ window.messages.push(fileMessage);
188
+ this.onMessageSent.emit(fileMessage);
189
+ this.scrollChatWindow(window, ScrollDirection.Bottom);
190
+ // Resets the file upload element
191
+ uploadElementRef.nativeElement.value = '';
192
+ }, (error) => {
193
+ this.clearInUseFileUploader(fileUploadInstanceId);
194
+ // Resets the file upload element
195
+ uploadElementRef.nativeElement.value = '';
196
+ // TODO: Invoke a file upload adapter error here
197
+ });
198
+ }
199
+ }
200
+ getParticipantTooltip(participant) {
201
+ const { metadata, displayName } = participant;
202
+ if (!metadata)
203
+ return displayName;
204
+ const { primary, secondary, tertiary } = metadata;
205
+ const parts = [primary, secondary, tertiary].filter(Boolean);
206
+ return parts.length > 0 ? parts.join(' | ') : displayName;
207
+ }
208
+ getMetadataDisplay(participant) {
209
+ if (!participant.metadata || !participant.showMetadataInTitle) {
210
+ return '';
211
+ }
212
+ const parts = [];
213
+ if (participant.showMetadataInTitle.primary && participant.metadata.primary) {
214
+ parts.push(participant.metadata.primary);
215
+ }
216
+ if (participant.showMetadataInTitle.secondary && participant.metadata.secondary) {
217
+ parts.push(participant.metadata.secondary);
218
+ }
219
+ if (participant.showMetadataInTitle.tertiary && participant.metadata.tertiary) {
220
+ parts.push(participant.metadata.tertiary);
221
+ }
222
+ return parts.join(' | ');
223
+ }
224
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NgChatWindowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
225
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: NgChatWindowComponent, selector: "ng-chat-window", inputs: { fileUploadAdapter: "fileUploadAdapter", window: "window", userId: "userId", localization: "localization", showOptions: "showOptions", emojisEnabled: "emojisEnabled", linkfyEnabled: "linkfyEnabled", showMessageDate: "showMessageDate", messageDatePipeFormat: "messageDatePipeFormat", hasPagedHistory: "hasPagedHistory" }, outputs: { onChatWindowClosed: "onChatWindowClosed", onMessagesSeen: "onMessagesSeen", onMessageSent: "onMessageSent", onTabTriggered: "onTabTriggered", onOptionTriggered: "onOptionTriggered", onLoadHistoryTriggered: "onLoadHistoryTriggered" }, viewQueries: [{ propertyName: "chatMessages", first: true, predicate: ["chatMessages"], descendants: true }, { propertyName: "nativeFileInput", first: true, predicate: ["nativeFileInput"], descendants: true }, { propertyName: "chatWindowInput", first: true, predicate: ["chatWindowInput"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"window && window.isCollapsed\">\n\t<div class=\"ng-chat-title secondary-background\">\n\t\t<div class=\"ng-chat-title-visibility-toggle-area\" (click)=\"onChatWindowClicked(window)\">\n\t\t\t<strong [matTooltip]=\"getParticipantTooltip(window.participant)\">\n\t\t\t\t{{window.participant.displayName}} <span *ngIf=\"getMetadataDisplay(window.participant)\">({{ getMetadataDisplay(window.participant) }})</span>\n\t\t\t</strong>\n\t\t\t<span [ngClass]=\"{'ng-chat-participant-status': true, 'online': window.participant.status === ChatParticipantStatus.Online, 'busy': window.participant.status === ChatParticipantStatus.Busy, 'away': window.participant.status === ChatParticipantStatus.Away, 'offline': window.participant.status === ChatParticipantStatus.Offline}\" [matTooltip]=\"chatParticipantStatusDescriptor(window.participant.status, localization)\"></span>\n\t\t\t<span *ngIf=\"unreadMessagesTotal(window).length > 0\" class=\"ng-chat-unread-messages-count unread-messages-counter-container primary-text\">{{unreadMessagesTotal(window)}}</span>\n\t\t</div>\n\t\t<a href=\"javascript:void(0);\" class=\"ng-chat-close primary-text\" (click)=\"onCloseChatWindow()\">&#x2715;</a>\n\t</div>\n</ng-container>\n<ng-container *ngIf=\"window && !window.isCollapsed\"> \n\t<div class=\"ng-chat-title secondary-background\">\n\t\t<div class=\"ng-chat-title-visibility-toggle-area\" (click)=\"onChatWindowClicked(window)\">\n\t\t\t<strong [matTooltip]=\"getParticipantTooltip(window.participant)\">\n\t\t\t\t{{window.participant.displayName}} <span *ngIf=\"getMetadataDisplay(window.participant)\">({{ getMetadataDisplay(window.participant) }})</span>\n\t\t\t</strong>\n\t\t\t<span [ngClass]=\"{'ng-chat-participant-status': true, 'online': window.participant.status === ChatParticipantStatus.Online, 'busy': window.participant.status === ChatParticipantStatus.Busy, 'away': window.participant.status === ChatParticipantStatus.Away, 'offline': window.participant.status === ChatParticipantStatus.Offline}\" [matTooltip]=\"chatParticipantStatusDescriptor(window.participant.status, localization)\"></span>\n\t\t\t<span *ngIf=\"unreadMessagesTotal(window).length > 0\" class=\"ng-chat-unread-messages-count unread-messages-counter-container primary-text\">{{unreadMessagesTotal(window)}}</span>\n\t\t</div>\n\t\t<a href=\"javascript:void(0);\" class=\"ng-chat-close primary-text\" (click)=\"onCloseChatWindow()\">&#x2715;</a>\n\t\t<!-- <ng-chat-options [ngClass]=\"'ng-chat-options-container'\" [options]=\"defaultWindowOptions(window)\" (activeOptionTrackerChange)=\"activeOptionTrackerChange($event)\"></ng-chat-options> -->\n\t</div>\n\t\t<div #chatMessages class=\"ng-chat-messages primary-background\">\n\t\t\t<div *ngIf=\"window.isLoadingHistory\" class=\"ng-chat-loading-wrapper\">\n\t\t\t\t<div class=\"loader\">Loading history...</div>\n\t\t\t</div>\n\t\t\t<div *ngIf=\"hasPagedHistory && window.hasMoreMessages && !window.isLoadingHistory\" class=\"ng-chat-load-history\">\n\t\t\t\t<a class=\"load-history-action\" (click)=\"fetchMessageHistory(window)\">{{localization.loadMessageHistoryPlaceholder}}</a>\n\t\t\t</div>\n\n\t\t\t<div *ngFor=\"let message of window.messages; let i = index\" [ngClass]=\"{'ng-chat-message': true, 'ng-chat-message-received': message.fromId !== userId}\">\n\t\t\t\t<ng-container *ngIf=\"isAvatarVisible(window, message, i)\">\n\t\t\t\t\t<div *ngIf=\"!getChatWindowAvatar(window.participant, message)\" class=\"icon-wrapper\">\n\t\t\t\t\t\t<i class=\"user-icon\"></i>\n\t\t\t\t\t</div>\n\t\t\t\t\t<!-- <img *ngIf=\"getChatWindowAvatar(window.participant, message)\" alt=\"\" class=\"avatar\" height=\"30\" width=\"30\" [src]=\"getChatWindowAvatar(window.participant, message) | sanitize\" /> -->\n\t\t\t\t\t<span *ngIf=\"window.participant.participantType === ChatParticipantType.Group\" class=\"ng-chat-participant-name\">{{window.participant | groupMessageDisplayName:message}}</span>\n\t\t\t\t</ng-container>\n\t\t\t\t<ng-container [ngSwitch]=\"message.type\">\n\t\t\t\t\t<div *ngSwitchCase=\"MessageType.Text\" [ngClass]=\"{'sent-chat-message-container': message.fromId === userId, 'received-chat-message-container': message.fromId !== userId}\">\n\t\t\t \t\t\t<span [innerHtml]=\"message.message | emojify:emojisEnabled | linkfy:linkfyEnabled\"></span>\n\t\t\t\t\t\t<span *ngIf=\"showMessageDate && message.dateSent\" class=\"message-sent-date\">{{message.dateSent | date:'dd'}}/{{message.dateSent | date:'MM'}}/{{message.dateSent | date:'y'}} {{message.dateSent | date:'h:mm a '}}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div *ngSwitchCase=\"MessageType.Image\" [ngClass]=\"{'sent-chat-message-container': message.fromId === userId, 'received-chat-message-container': message.fromId !== userId}\">\n\t\n\t\t\t \t\t\t<img src=\"{{message.message}}\" class=\"image-message\" />\n\t\n\t\t\t\t\t\t<span *ngIf=\"showMessageDate && message.dateSent\" class=\"message-sent-date\">{{message.dateSent | date:'dd'}}/{{message.dateSent | date:'MM'}}/{{message.dateSent | date:'y'}} {{message.dateSent | date:'h:mm a '}}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div *ngSwitchCase=\"MessageType.File\" [ngClass]=\"{'file-message-container': true, 'received': message.fromId !== userId}\">\n\t\t\t\t\t\t<div class=\"file-message-icon-container\">\n\t\t\t\t\t\t\t<i class=\"paperclip-icon\"></i>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<!-- <a class=\"file-details\" [attr.href]=\"message.downloadUrl\" target=\"_blank\" rel=\"noopener noreferrer\" (click)=\"this.markMessagesAsRead([message])\" download>\n\t\t\t\t\t\t\t<span class=\"file-message-title\" [attr.title]=\"message.message\">{{message.message}}</span>\n\t\t\t\t\t\t\t<span *ngIf=\"message.fileSizeInBytes\" class=\"file-message-size\">{{message.fileSizeInBytes}} Bytes</span>\n\t\t\t\t\t\t</a> -->\n\t\t\t\t\t</div>\n\t\t\t\t</ng-container>\n\t\t\t</div>\n\t</div>\n\n\t<div class=\"ng-chat-footer primary-outline-color primary-background\">\n\t\t<input #chatWindowInput\n\t\t\ttype=\"text\"\n\t\t\t[ngModel]=\"window.newMessage | emojify:emojisEnabled\"\n\t\t\t(ngModelChange)=\"window.newMessage=$event\"\n\t\t\t[placeholder]=\"localization.messagePlaceholder\"\n\t\t\t[ngClass]=\"{'chat-window-input': true, 'has-side-action': fileUploadAdapter}\"\n\t\t\t(keydown)=\"onChatInputTyped($event, window)\"\n\t\t\t(blur)=\"toggleWindowFocus(window)\"\n\t\t\t(focus)=\"toggleWindowFocus(window)\"/>\n\n\t\t<!-- File Upload -->\n\t\t<ng-container *ngIf=\"fileUploadAdapter\">\n\t\t\t<a *ngIf=\"!isUploadingFile(window)\" class=\"btn-add-file\" (click)=\"triggerNativeFileUpload(window)\">\n\t\t\t\t<i class=\"upload-icon\"></i>\n\t\t\t</a>\n\t\t\t<input\n\t\t\t\ttype=\"file\"\n\t\t\t\t#nativeFileInput\n\t\t\t\tstyle=\"display: none;\"\n\t\t\t\t[attr.id]=\"getUniqueFileUploadInstanceId(window)\"\n\t\t\t\t(change)=\"onFileChosen(window)\" />\n\t\t\t<div *ngIf=\"isUploadingFile(window)\" class=\"loader\"></div>\n\t\t</ng-container>\n\t</div>\n</ng-container>", styles: [".ng-chat-window{right:260px;height:360px;z-index:999;bottom:0;width:300px;position:fixed;border-width:1px;border-style:solid;border-bottom:0;box-shadow:0 4px 8px #00000040;margin-bottom:10px!important;border:1px solid grey!important;border-radius:10px!important;box-sizing:border-box!important;overflow:hidden!important;background-color:#fff}.ng-chat-window ::-webkit-scrollbar{width:8px!important}.ng-chat-window ::-webkit-scrollbar-thumb{background:#1b1b70!important;border-radius:5px!important}.ng-chat-window-collapsed{height:30px!important}.ng-chat-window .ng-chat-footer{box-sizing:border-box!important;padding-bottom:10px!important;display:block;height:10%;width:95%!important;margin:auto!important;background-color:inherit!important}.ng-chat-window .ng-chat-footer>input{font-size:.8em;box-sizing:border-box!important;padding:15px!important;height:100%;width:100%;border-radius:20px!important;border:1px solid grey!important}.ng-chat-window .ng-chat-footer>input.has-side-action{width:calc(100% - 30px)}.ng-chat-window .ng-chat-footer .btn-add-file{position:absolute;right:5px;bottom:7px;height:20px;width:20px;cursor:pointer}.ng-chat-window .ng-chat-footer .loader{position:absolute;right:14px;bottom:8px}.ng-chat-window .ng-chat-load-history{height:30px;text-align:center;font-size:.8em}.ng-chat-window .ng-chat-load-history>a{border-radius:15px;cursor:pointer;padding:5px 10px}.ng-chat-window .ng-chat-messages{padding:10px;width:100%;height:calc(90% - 30px);box-sizing:border-box;position:relative;overflow:auto}.ng-chat-window .ng-chat-messages .ng-chat-message{clear:both}.ng-chat-window .ng-chat-messages .ng-chat-message>img.avatar,.ng-chat-window .ng-chat-messages .ng-chat-message>.icon-wrapper{position:absolute;left:10px;border-radius:25px}.ng-chat-window .ng-chat-messages .ng-chat-message .ng-chat-participant-name{display:inline-block;margin-left:40px;padding-bottom:5px;font-weight:700;font-size:.8em;text-overflow:ellipsis;max-width:180px}.ng-chat-window .ng-chat-messages .ng-chat-message>.icon-wrapper{background-color:#bababa;overflow:hidden;width:30px;height:30px;padding:0}.ng-chat-window .ng-chat-messages .ng-chat-message>.icon-wrapper>i{color:#fff;transform:scale(.7)}.ng-chat-window .ng-chat-messages .ng-chat-message .message-sent-date{font-size:.5em!important;display:block;text-align:right;margin-top:5px;color:#a1a0a0!important;font-style:italic!important}.ng-chat-window .ng-chat-messages .ng-chat-message>div{float:right;width:182px;border-radius:15px 15px 0!important;padding:10px;margin-top:0;margin-bottom:5px;font-size:.9em;word-wrap:break-word;background-color:#93d4f0!important}.ng-chat-window .ng-chat-message-received>div.received-chat-message-container{float:left;margin-left:40px;padding-top:7px;padding-bottom:7px;margin-top:0;margin-bottom:5px;background-color:#daf2fc!important;border-radius:15px 15px 15px 0!important}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container{float:right;width:202px;border-style:solid;border-width:3px;border-radius:5px;overflow:hidden;margin-bottom:5px;display:block;text-decoration:none;font-size:.9em;padding:0;box-sizing:border-box}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container.received{float:left;margin-left:40px;width:208px}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-message-icon-container{width:20px;height:35px;padding:10px 5px;float:left}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-message-icon-container i{margin-top:8px}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-details{float:left;padding:10px;width:calc(100% - 60px);color:currentColor;text-decoration:none}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-details:hover{text-decoration:underline}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-details span{display:block;width:100%;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-details .file-message-title{font-weight:700}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-details .file-message-size{font-size:.8em;margin-top:5px}.ng-chat-window .image-message{width:100%;height:auto}@media only screen and (max-width: 581px){.ng-chat-window{position:initial}}\n"], dependencies: [{ kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "pipe", type: i3.DatePipe, name: "date" }, { kind: "pipe", type: i4.EmojifyPipe, name: "emojify" }, { kind: "pipe", type: i5.LinkfyPipe, name: "linkfy" }, { kind: "pipe", type: i6.GroupMessageDisplayNamePipe, name: "groupMessageDisplayName" }], encapsulation: i0.ViewEncapsulation.None }); }
226
+ }
227
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: NgChatWindowComponent, decorators: [{
228
+ type: Component,
229
+ args: [{ selector: 'ng-chat-window', encapsulation: ViewEncapsulation.None, template: "<ng-container *ngIf=\"window && window.isCollapsed\">\n\t<div class=\"ng-chat-title secondary-background\">\n\t\t<div class=\"ng-chat-title-visibility-toggle-area\" (click)=\"onChatWindowClicked(window)\">\n\t\t\t<strong [matTooltip]=\"getParticipantTooltip(window.participant)\">\n\t\t\t\t{{window.participant.displayName}} <span *ngIf=\"getMetadataDisplay(window.participant)\">({{ getMetadataDisplay(window.participant) }})</span>\n\t\t\t</strong>\n\t\t\t<span [ngClass]=\"{'ng-chat-participant-status': true, 'online': window.participant.status === ChatParticipantStatus.Online, 'busy': window.participant.status === ChatParticipantStatus.Busy, 'away': window.participant.status === ChatParticipantStatus.Away, 'offline': window.participant.status === ChatParticipantStatus.Offline}\" [matTooltip]=\"chatParticipantStatusDescriptor(window.participant.status, localization)\"></span>\n\t\t\t<span *ngIf=\"unreadMessagesTotal(window).length > 0\" class=\"ng-chat-unread-messages-count unread-messages-counter-container primary-text\">{{unreadMessagesTotal(window)}}</span>\n\t\t</div>\n\t\t<a href=\"javascript:void(0);\" class=\"ng-chat-close primary-text\" (click)=\"onCloseChatWindow()\">&#x2715;</a>\n\t</div>\n</ng-container>\n<ng-container *ngIf=\"window && !window.isCollapsed\"> \n\t<div class=\"ng-chat-title secondary-background\">\n\t\t<div class=\"ng-chat-title-visibility-toggle-area\" (click)=\"onChatWindowClicked(window)\">\n\t\t\t<strong [matTooltip]=\"getParticipantTooltip(window.participant)\">\n\t\t\t\t{{window.participant.displayName}} <span *ngIf=\"getMetadataDisplay(window.participant)\">({{ getMetadataDisplay(window.participant) }})</span>\n\t\t\t</strong>\n\t\t\t<span [ngClass]=\"{'ng-chat-participant-status': true, 'online': window.participant.status === ChatParticipantStatus.Online, 'busy': window.participant.status === ChatParticipantStatus.Busy, 'away': window.participant.status === ChatParticipantStatus.Away, 'offline': window.participant.status === ChatParticipantStatus.Offline}\" [matTooltip]=\"chatParticipantStatusDescriptor(window.participant.status, localization)\"></span>\n\t\t\t<span *ngIf=\"unreadMessagesTotal(window).length > 0\" class=\"ng-chat-unread-messages-count unread-messages-counter-container primary-text\">{{unreadMessagesTotal(window)}}</span>\n\t\t</div>\n\t\t<a href=\"javascript:void(0);\" class=\"ng-chat-close primary-text\" (click)=\"onCloseChatWindow()\">&#x2715;</a>\n\t\t<!-- <ng-chat-options [ngClass]=\"'ng-chat-options-container'\" [options]=\"defaultWindowOptions(window)\" (activeOptionTrackerChange)=\"activeOptionTrackerChange($event)\"></ng-chat-options> -->\n\t</div>\n\t\t<div #chatMessages class=\"ng-chat-messages primary-background\">\n\t\t\t<div *ngIf=\"window.isLoadingHistory\" class=\"ng-chat-loading-wrapper\">\n\t\t\t\t<div class=\"loader\">Loading history...</div>\n\t\t\t</div>\n\t\t\t<div *ngIf=\"hasPagedHistory && window.hasMoreMessages && !window.isLoadingHistory\" class=\"ng-chat-load-history\">\n\t\t\t\t<a class=\"load-history-action\" (click)=\"fetchMessageHistory(window)\">{{localization.loadMessageHistoryPlaceholder}}</a>\n\t\t\t</div>\n\n\t\t\t<div *ngFor=\"let message of window.messages; let i = index\" [ngClass]=\"{'ng-chat-message': true, 'ng-chat-message-received': message.fromId !== userId}\">\n\t\t\t\t<ng-container *ngIf=\"isAvatarVisible(window, message, i)\">\n\t\t\t\t\t<div *ngIf=\"!getChatWindowAvatar(window.participant, message)\" class=\"icon-wrapper\">\n\t\t\t\t\t\t<i class=\"user-icon\"></i>\n\t\t\t\t\t</div>\n\t\t\t\t\t<!-- <img *ngIf=\"getChatWindowAvatar(window.participant, message)\" alt=\"\" class=\"avatar\" height=\"30\" width=\"30\" [src]=\"getChatWindowAvatar(window.participant, message) | sanitize\" /> -->\n\t\t\t\t\t<span *ngIf=\"window.participant.participantType === ChatParticipantType.Group\" class=\"ng-chat-participant-name\">{{window.participant | groupMessageDisplayName:message}}</span>\n\t\t\t\t</ng-container>\n\t\t\t\t<ng-container [ngSwitch]=\"message.type\">\n\t\t\t\t\t<div *ngSwitchCase=\"MessageType.Text\" [ngClass]=\"{'sent-chat-message-container': message.fromId === userId, 'received-chat-message-container': message.fromId !== userId}\">\n\t\t\t \t\t\t<span [innerHtml]=\"message.message | emojify:emojisEnabled | linkfy:linkfyEnabled\"></span>\n\t\t\t\t\t\t<span *ngIf=\"showMessageDate && message.dateSent\" class=\"message-sent-date\">{{message.dateSent | date:'dd'}}/{{message.dateSent | date:'MM'}}/{{message.dateSent | date:'y'}} {{message.dateSent | date:'h:mm a '}}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div *ngSwitchCase=\"MessageType.Image\" [ngClass]=\"{'sent-chat-message-container': message.fromId === userId, 'received-chat-message-container': message.fromId !== userId}\">\n\t\n\t\t\t \t\t\t<img src=\"{{message.message}}\" class=\"image-message\" />\n\t\n\t\t\t\t\t\t<span *ngIf=\"showMessageDate && message.dateSent\" class=\"message-sent-date\">{{message.dateSent | date:'dd'}}/{{message.dateSent | date:'MM'}}/{{message.dateSent | date:'y'}} {{message.dateSent | date:'h:mm a '}}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div *ngSwitchCase=\"MessageType.File\" [ngClass]=\"{'file-message-container': true, 'received': message.fromId !== userId}\">\n\t\t\t\t\t\t<div class=\"file-message-icon-container\">\n\t\t\t\t\t\t\t<i class=\"paperclip-icon\"></i>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<!-- <a class=\"file-details\" [attr.href]=\"message.downloadUrl\" target=\"_blank\" rel=\"noopener noreferrer\" (click)=\"this.markMessagesAsRead([message])\" download>\n\t\t\t\t\t\t\t<span class=\"file-message-title\" [attr.title]=\"message.message\">{{message.message}}</span>\n\t\t\t\t\t\t\t<span *ngIf=\"message.fileSizeInBytes\" class=\"file-message-size\">{{message.fileSizeInBytes}} Bytes</span>\n\t\t\t\t\t\t</a> -->\n\t\t\t\t\t</div>\n\t\t\t\t</ng-container>\n\t\t\t</div>\n\t</div>\n\n\t<div class=\"ng-chat-footer primary-outline-color primary-background\">\n\t\t<input #chatWindowInput\n\t\t\ttype=\"text\"\n\t\t\t[ngModel]=\"window.newMessage | emojify:emojisEnabled\"\n\t\t\t(ngModelChange)=\"window.newMessage=$event\"\n\t\t\t[placeholder]=\"localization.messagePlaceholder\"\n\t\t\t[ngClass]=\"{'chat-window-input': true, 'has-side-action': fileUploadAdapter}\"\n\t\t\t(keydown)=\"onChatInputTyped($event, window)\"\n\t\t\t(blur)=\"toggleWindowFocus(window)\"\n\t\t\t(focus)=\"toggleWindowFocus(window)\"/>\n\n\t\t<!-- File Upload -->\n\t\t<ng-container *ngIf=\"fileUploadAdapter\">\n\t\t\t<a *ngIf=\"!isUploadingFile(window)\" class=\"btn-add-file\" (click)=\"triggerNativeFileUpload(window)\">\n\t\t\t\t<i class=\"upload-icon\"></i>\n\t\t\t</a>\n\t\t\t<input\n\t\t\t\ttype=\"file\"\n\t\t\t\t#nativeFileInput\n\t\t\t\tstyle=\"display: none;\"\n\t\t\t\t[attr.id]=\"getUniqueFileUploadInstanceId(window)\"\n\t\t\t\t(change)=\"onFileChosen(window)\" />\n\t\t\t<div *ngIf=\"isUploadingFile(window)\" class=\"loader\"></div>\n\t\t</ng-container>\n\t</div>\n</ng-container>", styles: [".ng-chat-window{right:260px;height:360px;z-index:999;bottom:0;width:300px;position:fixed;border-width:1px;border-style:solid;border-bottom:0;box-shadow:0 4px 8px #00000040;margin-bottom:10px!important;border:1px solid grey!important;border-radius:10px!important;box-sizing:border-box!important;overflow:hidden!important;background-color:#fff}.ng-chat-window ::-webkit-scrollbar{width:8px!important}.ng-chat-window ::-webkit-scrollbar-thumb{background:#1b1b70!important;border-radius:5px!important}.ng-chat-window-collapsed{height:30px!important}.ng-chat-window .ng-chat-footer{box-sizing:border-box!important;padding-bottom:10px!important;display:block;height:10%;width:95%!important;margin:auto!important;background-color:inherit!important}.ng-chat-window .ng-chat-footer>input{font-size:.8em;box-sizing:border-box!important;padding:15px!important;height:100%;width:100%;border-radius:20px!important;border:1px solid grey!important}.ng-chat-window .ng-chat-footer>input.has-side-action{width:calc(100% - 30px)}.ng-chat-window .ng-chat-footer .btn-add-file{position:absolute;right:5px;bottom:7px;height:20px;width:20px;cursor:pointer}.ng-chat-window .ng-chat-footer .loader{position:absolute;right:14px;bottom:8px}.ng-chat-window .ng-chat-load-history{height:30px;text-align:center;font-size:.8em}.ng-chat-window .ng-chat-load-history>a{border-radius:15px;cursor:pointer;padding:5px 10px}.ng-chat-window .ng-chat-messages{padding:10px;width:100%;height:calc(90% - 30px);box-sizing:border-box;position:relative;overflow:auto}.ng-chat-window .ng-chat-messages .ng-chat-message{clear:both}.ng-chat-window .ng-chat-messages .ng-chat-message>img.avatar,.ng-chat-window .ng-chat-messages .ng-chat-message>.icon-wrapper{position:absolute;left:10px;border-radius:25px}.ng-chat-window .ng-chat-messages .ng-chat-message .ng-chat-participant-name{display:inline-block;margin-left:40px;padding-bottom:5px;font-weight:700;font-size:.8em;text-overflow:ellipsis;max-width:180px}.ng-chat-window .ng-chat-messages .ng-chat-message>.icon-wrapper{background-color:#bababa;overflow:hidden;width:30px;height:30px;padding:0}.ng-chat-window .ng-chat-messages .ng-chat-message>.icon-wrapper>i{color:#fff;transform:scale(.7)}.ng-chat-window .ng-chat-messages .ng-chat-message .message-sent-date{font-size:.5em!important;display:block;text-align:right;margin-top:5px;color:#a1a0a0!important;font-style:italic!important}.ng-chat-window .ng-chat-messages .ng-chat-message>div{float:right;width:182px;border-radius:15px 15px 0!important;padding:10px;margin-top:0;margin-bottom:5px;font-size:.9em;word-wrap:break-word;background-color:#93d4f0!important}.ng-chat-window .ng-chat-message-received>div.received-chat-message-container{float:left;margin-left:40px;padding-top:7px;padding-bottom:7px;margin-top:0;margin-bottom:5px;background-color:#daf2fc!important;border-radius:15px 15px 15px 0!important}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container{float:right;width:202px;border-style:solid;border-width:3px;border-radius:5px;overflow:hidden;margin-bottom:5px;display:block;text-decoration:none;font-size:.9em;padding:0;box-sizing:border-box}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container.received{float:left;margin-left:40px;width:208px}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-message-icon-container{width:20px;height:35px;padding:10px 5px;float:left}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-message-icon-container i{margin-top:8px}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-details{float:left;padding:10px;width:calc(100% - 60px);color:currentColor;text-decoration:none}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-details:hover{text-decoration:underline}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-details span{display:block;width:100%;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-details .file-message-title{font-weight:700}.ng-chat-window .ng-chat-messages .ng-chat-message .file-message-container>.file-details .file-message-size{font-size:.8em;margin-top:5px}.ng-chat-window .image-message{width:100%;height:auto}@media only screen and (max-width: 581px){.ng-chat-window{position:initial}}\n"] }]
230
+ }], ctorParameters: () => [], propDecorators: { fileUploadAdapter: [{
231
+ type: Input
232
+ }], window: [{
233
+ type: Input
234
+ }], userId: [{
235
+ type: Input
236
+ }], localization: [{
237
+ type: Input
238
+ }], showOptions: [{
239
+ type: Input
240
+ }], emojisEnabled: [{
241
+ type: Input
242
+ }], linkfyEnabled: [{
243
+ type: Input
244
+ }], showMessageDate: [{
245
+ type: Input
246
+ }], messageDatePipeFormat: [{
247
+ type: Input
248
+ }], hasPagedHistory: [{
249
+ type: Input
250
+ }], onChatWindowClosed: [{
251
+ type: Output
252
+ }], onMessagesSeen: [{
253
+ type: Output
254
+ }], onMessageSent: [{
255
+ type: Output
256
+ }], onTabTriggered: [{
257
+ type: Output
258
+ }], onOptionTriggered: [{
259
+ type: Output
260
+ }], onLoadHistoryTriggered: [{
261
+ type: Output
262
+ }], chatMessages: [{
263
+ type: ViewChild,
264
+ args: ['chatMessages']
265
+ }], nativeFileInput: [{
266
+ type: ViewChild,
267
+ args: ['nativeFileInput']
268
+ }], chatWindowInput: [{
269
+ type: ViewChild,
270
+ args: ['chatWindowInput']
271
+ }] } });
272
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctY2hhdC13aW5kb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jaGF0L3NyYy9saWIvY29tcG9uZW50cy9uZy1jaGF0LXdpbmRvdy9uZy1jaGF0LXdpbmRvdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NoYXQvc3JjL2xpYi9jb21wb25lbnRzL25nLWNoYXQtd2luZG93L25nLWNoYXQtd2luZG93LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9CQUFvQjtBQUNwQixPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUNqSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTNELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUtuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUU1RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sK0NBQStDLENBQUM7Ozs7Ozs7O0FBUWhHLE1BQU0sT0FBTyxxQkFBcUI7SUFDOUI7UUFrQk8sa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFHOUIsa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFHOUIsb0JBQWUsR0FBWSxJQUFJLENBQUM7UUFHaEMsMEJBQXFCLEdBQVcsT0FBTyxDQUFDO1FBR3hDLG9CQUFlLEdBQVksSUFBSSxDQUFDO1FBR2hDLHVCQUFrQixHQUF1RSxJQUFJ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QU07Z0JBSUEsY0FBYztzQkFEcEIsTUFBTTtnQkFJQSxhQUFhO3NCQURuQixNQUFNO2dCQUlBLGNBQWM7c0JBRHBCLE1BQU07Z0JBSUEsaUJBQWlCO3NCQUR2QixNQUFNO2dCQUlBLHNCQUFzQjtzQkFENUIsTUFBTTtnQkFHb0IsWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNLLGVBQWU7c0JBQTVDLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUNFLGVBQWU7c0JBQTVDLFNBQVM7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3RW5jYXBzdWxhdGlvbiwgVmlld0NoaWxkLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSBcIi4uLy4uL2NvcmUvbWVzc2FnZVwiO1xuaW1wb3J0IHsgTWVzc2FnZVR5cGUgfSBmcm9tIFwiLi4vLi4vY29yZS9tZXNzYWdlLXR5cGUuZW51bVwiO1xuaW1wb3J0IHsgV2luZG93IH0gZnJvbSBcIi4uLy4uL2NvcmUvd2luZG93XCI7XG5pbXBvcnQgeyBDaGF0UGFydGljaXBhbnRTdGF0dXMgfSBmcm9tIFwiLi4vLi4vY29yZS9jaGF0LXBhcnRpY2lwYW50LXN0YXR1cy5lbnVtXCI7XG5pbXBvcnQgeyBTY3JvbGxEaXJlY3Rpb24gfSBmcm9tIFwiLi4vLi4vY29yZS9zY3JvbGwtZGlyZWN0aW9uLmVudW1cIjtcbmltcG9ydCB7IExvY2FsaXphdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvbG9jYWxpemF0aW9uJztcbmltcG9ydCB7IElGaWxlVXBsb2FkQWRhcHRlciB9IGZyb20gJy4uLy4uL2NvcmUvZmlsZS11cGxvYWQtYWRhcHRlcic7XG5pbXBvcnQgeyBJQ2hhdE9wdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvY2hhdC1vcHRpb24nO1xuaW1wb3J0IHsgR3JvdXAgfSBmcm9tIFwiLi4vLi4vY29yZS9ncm91cFwiO1xuaW1wb3J0IHsgQ2hhdFBhcnRpY2lwYW50VHlwZSB9IGZyb20gXCIuLi8uLi9jb3JlL2NoYXQtcGFydGljaXBhbnQtdHlwZS5lbnVtXCI7XG5pbXBvcnQgeyBJQ2hhdFBhcnRpY2lwYW50IH0gZnJvbSBcIi4uLy4uL2NvcmUvY2hhdC1wYXJ0aWNpcGFudFwiO1xuaW1wb3J0IHsgTWVzc2FnZUNvdW50ZXIgfSBmcm9tIFwiLi4vLi4vY29yZS9tZXNzYWdlLWNvdW50ZXJcIjtcbmltcG9ydCB7IGNoYXRQYXJ0aWNpcGFudFN0YXR1c0Rlc2NyaXB0b3IgfSBmcm9tICcuLi8uLi9jb3JlL2NoYXQtcGFydGljaXBhbnQtc3RhdHVzLWRlc2NyaXB0b3InO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25nLWNoYXQtd2luZG93JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbmctY2hhdC13aW5kb3cuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL25nLWNoYXQtd2luZG93LmNvbXBvbmVudC5jc3MnXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIE5nQ2hhdFdpbmRvd0NvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7IH1cblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGZpbGVVcGxvYWRBZGFwdGVyOiBJRmlsZVVwbG9hZEFkYXB0ZXI7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB3aW5kb3c6IFdpbmRvdztcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHVzZXJJZDogYW55O1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbG9jYWxpemF0aW9uOiBMb2NhbGl6YXRpb247XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzaG93T3B0aW9uczogYm9vbGVhbjtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGVtb2ppc0VuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbGlua2Z5RW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzaG93TWVzc2FnZURhdGU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWVzc2FnZURhdGVQaXBlRm9ybWF0OiBzdHJpbmcgPSBcInNob3J0XCI7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBoYXNQYWdlZEhpc3Rvcnk6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uQ2hhdFdpbmRvd0Nsb3NlZDogRXZlbnRFbWl0dGVyPHsgY2xvc2VkV2luZG93OiBXaW5kb3csIGNsb3NlZFZpYUVzY2FwZUtleTogYm9vbGVhbn0+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uTWVzc2FnZXNTZWVuOiBFdmVudEVtaXR0ZXI8TWVzc2FnZVtdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvbk1lc3NhZ2VTZW50OiBFdmVudEVtaXR0ZXI8TWVzc2FnZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25UYWJUcmlnZ2VyZWQ6IEV2ZW50RW1pdHRlcjx7IHRyaWdnZXJpbmdXaW5kb3c6IFdpbmRvdywgc2hpZnRLZXlQcmVzc2VkOiBib29sZWFuIH0+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uT3B0aW9uVHJpZ2dlcmVkOiBFdmVudEVtaXR0ZXI8SUNoYXRPcHRpb24+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uTG9hZEhpc3RvcnlUcmlnZ2VyZWQ6IEV2ZW50RW1pdHRlcjxXaW5kb3c+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQFZpZXdDaGlsZCgnY2hhdE1lc3NhZ2VzJykgY2hhdE1lc3NhZ2VzOiBhbnk7XG4gICAgQFZpZXdDaGlsZCgnbmF0aXZlRmlsZUlucHV0JykgbmF0aXZlRmlsZUlucHV0OiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ2NoYXRXaW5kb3dJbnB1dCcpIGNoYXRXaW5kb3dJbnB1dDogYW55O1xuXG4gICAgLy8gRmlsZSB1cGxvYWQgc3RhdGVcbiAgICBwdWJsaWMgZmlsZVVwbG9hZGVyc0luVXNlOiBzdHJpbmdbXSA9IFtdOyAvLyBJZCBidWNrZXQgb2YgdXBsb2FkZXJzIGluIHVzZVxuXG4gICAgLy8gRXhwb3NlcyBlbnVtcyBhbmQgZnVuY3Rpb25zIGZvciB0aGUgbmctdGVtcGxhdGVcbiAgICBwdWJsaWMgQ2hhdFBhcnRpY2lwYW50VHlwZSA9IENoYXRQYXJ0aWNpcGFudFR5cGU7XG4gICAgcHVibGljIENoYXRQYXJ0aWNpcGFudFN0YXR1cyA9IENoYXRQYXJ0aWNpcGFudFN0YXR1cztcbiAgICBwdWJsaWMgTWVzc2FnZVR5cGUgPSBNZXNzYWdlVHlwZTtcbiAgICBwdWJsaWMgY2hhdFBhcnRpY2lwYW50U3RhdHVzRGVzY3JpcHRvciA9IGNoYXRQYXJ0aWNpcGFudFN0YXR1c0Rlc2NyaXB0b3I7XG5cbiAgICBkZWZhdWx0V2luZG93T3B0aW9ucyhjdXJyZW50V2luZG93OiBXaW5kb3cpOiBJQ2hhdE9wdGlvbltdXG4gICAge1xuICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucyAmJiBjdXJyZW50V2luZG93LnBhcnRpY2lwYW50LnBhcnRpY2lwYW50VHlwZSA9PSBDaGF0UGFydGljaXBhbnRUeXBlLlVzZXIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBbe1xuICAgICAgICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjaGF0dGluZ1RvOiBjdXJyZW50V2luZG93LFxuICAgICAgICAgICAgICAgIHZhbGlkYXRlQ29udGV4dDogKHBhcnRpY2lwYW50OiBJQ2hhdFBhcnRpY2lwYW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0aWNpcGFudC5wYXJ0aWNpcGFudFR5cGUgPT0gQ2hhdFBhcnRpY2lwYW50VHlwZS5Vc2VyO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZGlzcGxheUxhYmVsOiAnQWRkIFBlb3BsZScgLy8gVE9ETzogTG9jYWxpemUgdGhpc1xuICAgICAgICAgICAgfV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gQXNzZXJ0cyBpZiBhIHVzZXIgYXZhdGFyIGlzIHZpc2libGUgaW4gYSBjaGF0IGNsdXN0ZXJcbiAgICBpc0F2YXRhclZpc2libGUod2luZG93OiBXaW5kb3csIG1lc3NhZ2U6IE1lc3NhZ2UsIGluZGV4OiBudW1iZXIpOiBib29sZWFuXG4gICAge1xuICAgICAgICBpZiAobWVzc2FnZS5mcm9tSWQgIT0gdGhpcy51c2VySWQpe1xuICAgICAgICAgICAgaWYgKGluZGV4ID09IDApe1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBGaXJzdCBtZXNzYWdlLCBnb29kIHRvIHNob3cgdGhlIHRodW1ibmFpbFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZXtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJldmlvdXMgbWVzc2FnZSBiZWxvbmdzIHRvIHRoZSBzYW1lIHVzZXIsIGlmIGl0IGJlbG9uZ3MgdGhlcmUgaXMgbm8gbmVlZCB0byBzaG93IHRoZSBhdmF0YXIgYWdhaW4gdG8gZm9ybSB0aGUgbWVzc2FnZSBjbHVzdGVyXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5tZXNzYWdlc1tpbmRleCAtIDFdLmZyb21JZCAhPSBtZXNzYWdlLmZyb21JZCl7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXRDaGF0V2luZG93QXZhdGFyKHBhcnRpY2lwYW50OiBJQ2hhdFBhcnRpY2lwYW50LCBtZXNzYWdlOiBNZXNzYWdlKTogc3RyaW5nIHwgbnVsbFxuICAgIHtcbiAgICAgICAgaWYgKHBhcnRpY2lwYW50LnBhcnRpY2lwYW50VHlwZSA9PSBDaGF0UGFydGljaXBhbnRUeXBlLlVzZXIpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJ0aWNpcGFudC5hdmF0YXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFydGljaXBhbnQucGFydGljaXBhbnRUeXBlID09IENoYXRQYXJ0aWNpcGFudFR5cGUuR3JvdXApXG4gICAgICAgIHtcbiAgICAgICAgICAgIGxldCBncm91cCA9IHBhcnRpY2lwYW50IGFzIEdyb3VwO1xuICAgICAgICAgICAgbGV0IHVzZXJJbmRleCA9IGdyb3VwLmNoYXR0aW5nVG8uZmluZEluZGV4KHggPT4geC5pZCA9PSBtZXNzYWdlLmZyb21JZCk7XG5cbiAgICAgICAgICAgIHJldHVybiBncm91cC5jaGF0dGluZ1RvW3VzZXJJbmRleCA+PSAwID8gdXNlckluZGV4IDogMF0uYXZhdGFyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaXNVcGxvYWRpbmdGaWxlKHdpbmRvdzogV2luZG93KTogYm9vbGVhblxuICAgIHtcbiAgICAgICAgY29uc3QgZmlsZVVwbG9hZEluc3RhbmNlSWQgPSB0aGlzLmdldFVuaXF1ZUZpbGVVcGxvYWRJbnN0YW5jZUlkKHdpbmRvdyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsZVVwbG9hZGVyc0luVXNlLmluZGV4T2YoZmlsZVVwbG9hZEluc3RhbmNlSWQpID4gLTE7XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhdGVzIGEgdW5pcXVlIGZpbGUgdXBsb2FkZXIgaWQgZm9yIGVhY2ggcGFydGljaXBhbnRcbiAgICBnZXRVbmlxdWVGaWxlVXBsb2FkSW5zdGFuY2VJZCh3aW5kb3c6IFdpbmRvdyk6IHN0cmluZ1xuICAgIHtcbiAgICAgICAgaWYgKHdpbmRvdyAmJiB3aW5kb3cucGFydGljaXBhbnQpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBgbmctY2hhdC1maWxlLXVwbG9hZC0ke3dpbmRvdy5wYXJ0aWNpcGFudC5pZH1gO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gJ25nLWNoYXQtZmlsZS11cGxvYWQnO1xuICAgIH1cblxuICAgIHVucmVhZE1lc3NhZ2VzVG90YWwod2luZG93OiBXaW5kb3cpOiBzdHJpbmdcbiAgICB7XG4gICAgICAgIHJldHVybiBNZXNzYWdlQ291bnRlci51bnJlYWRNZXNzYWdlc1RvdGFsKHdpbmRvdywgdGhpcy51c2VySWQpO1xuICAgIH1cblxuICAgIC8vIFNjcm9sbHMgYSBjaGF0IHdpbmRvdyBtZXNzYWdlIGZsb3cgdG8gdGhlIGJvdHRvbVxuICAgIHNjcm9sbENoYXRXaW5kb3cod2luZG93OiBXaW5kb3csIGRpcmVjdGlvbjogU2Nyb2xsRGlyZWN0aW9uKTogdm9pZFxuICAgIHtcbiAgICAgICAgaWYgKCF3aW5kb3cuaXNDb2xsYXBzZWQpe1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hhdE1lc3NhZ2VzKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSB0aGlzLmNoYXRNZXNzYWdlcy5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBsZXQgcG9zaXRpb24gPSAoIGRpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLlRvcCApID8gMCA6IGVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNjcm9sbFRvcCA9IHBvc2l0aW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWN0aXZlT3B0aW9uVHJhY2tlckNoYW5nZShvcHRpb246IElDaGF0T3B0aW9uKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25PcHRpb25UcmlnZ2VyZWQuZW1pdChvcHRpb24pO1xuICAgIH1cblxuICAgIC8vIFRyaWdnZXJzIG5hdGl2ZSBmaWxlIHVwbG9hZCBmb3IgZmlsZSBzZWxlY3Rpb24gZnJvbSB0aGUgdXNlclxuICAgIHRyaWdnZXJOYXRpdmVGaWxlVXBsb2FkKHdpbmRvdzogV2luZG93KTogdm9pZFxuICAgIHtcbiAgICAgICAgaWYgKHdpbmRvdylcbiAgICAgICAge1xuICAgICAgICAgICAgaWYgKHRoaXMubmF0aXZlRmlsZUlucHV0KSB0aGlzLm5hdGl2ZUZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUb2dnbGVzIGEgd2luZG93IGZvY3VzIG9uIHRoZSBmb2N1cy9ibHVyIG9mIGEgJ25ld01lc3NhZ2UnIGlucHV0XG4gICAgdG9nZ2xlV2luZG93Rm9jdXMod2luZG93OiBXaW5kb3cpOiB2b2lkXG4gICAge1xuICAgICAgICB3aW5kb3cuaGFzRm9jdXMgPSAhd2luZG93Lmhhc0ZvY3VzO1xuICAgICAgICBpZih3aW5kb3cuaGFzRm9jdXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHVucmVhZE1lc3NhZ2VzID0gd2luZG93Lm1lc3NhZ2VzXG4gICAgICAgICAgICAgICAgLmZpbHRlcihtZXNzYWdlID0+IG1lc3NhZ2UuZGF0ZVNlZW4gPT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICAmJiAobWVzc2FnZS50b0lkID09IHRoaXMudXNlcklkIHx8IHdpbmRvdy5wYXJ0aWNpcGFudC5wYXJ0aWNpcGFudFR5cGUgPT09IENoYXRQYXJ0aWNpcGFudFR5cGUuR3JvdXApKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKHVucmVhZE1lc3NhZ2VzICYmIHVucmVhZE1lc3NhZ2VzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbk1lc3NhZ2VzU2Vlbi5lbWl0KHVucmVhZE1lc3NhZ2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG1hcmtNZXNzYWdlc0FzUmVhZChtZXNzYWdlczogTWVzc2FnZVtdKTogdm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5vbk1lc3NhZ2VzU2Vlbi5lbWl0KG1lc3NhZ2VzKTtcbiAgICB9XG5cbiAgICBmZXRjaE1lc3NhZ2VIaXN0b3J5KHdpbmRvdzogV2luZG93KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Mb2FkSGlzdG9yeVRyaWdnZXJlZC5lbWl0KHdpbmRvdyk7XG4gICAgfVxuXG4gICAgLy8gQ2xvc2VzIGEgY2hhdCB3aW5kb3cgdmlhIHRoZSBjbG9zZSAnWCcgYnV0dG9uXG4gICAgb25DbG9zZUNoYXRXaW5kb3coKTogdm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5vbkNoYXRXaW5kb3dDbG9zZWQuZW1pdCh7IGNsb3NlZFdpbmRvdzogdGhpcy53aW5kb3csIGNsb3NlZFZpYUVzY2FwZUtleTogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgLyogIE1vbml0b3JzIHByZXNzZWQga2V5cyBvbiBhIGNoYXQgd2luZG93XG4gICAgICAgIC0gRGlzcGF0Y2hlcyBhIG1lc3NhZ2Ugd2hlbiB0aGUgRU5URVIga2V5IGlzIHByZXNzZWRcbiAgICAgICAgLSBUYWJzIGJldHdlZW4gd2luZG93cyBvbiBUQUIgb3IgU0hJRlQgKyBUQUJcbiAgICAgICAgLSBDbG9zZXMgdGhlIGN1cnJlbnQgZm9jdXNlZCB3aW5kb3cgb24gRVNDXG4gICAgKi9cbiAgIG9uQ2hhdElucHV0VHlwZWQoZXZlbnQ6IGFueSwgd2luZG93OiBXaW5kb3cpOiB2b2lkXG4gICB7XG4gICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKVxuICAgICAgIHtcbiAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgIGlmICh3aW5kb3cubmV3TWVzc2FnZSAmJiB3aW5kb3cubmV3TWVzc2FnZS50cmltKCkgIT0gXCJcIilcbiAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmZyb21JZCA9IHRoaXMudXNlcklkO1xuICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudG9JZCA9IHdpbmRvdy5wYXJ0aWNpcGFudC5pZDtcbiAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1lc3NhZ2UgPSB3aW5kb3cubmV3TWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRhdGVTZW50ID0gbmV3IERhdGUoKTtcbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICB3aW5kb3cubWVzc2FnZXMucHVzaChtZXNzYWdlKTtcbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICB0aGlzLm9uTWVzc2FnZVNlbnQuZW1pdChtZXNzYWdlKTtcbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICB3aW5kb3cubmV3TWVzc2FnZSA9IFwiXCI7IC8vIFJlc2V0cyB0aGUgbmV3IG1lc3NhZ2UgaW5wdXRcbiAgICAgICBcbiAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbENoYXRXaW5kb3cod2luZG93LCBTY3JvbGxEaXJlY3Rpb24uQm90dG9tKTtcbiAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAgICB0aGlzLm9uVGFiVHJpZ2dlcmVkLmVtaXQoeyB0cmlnZ2VyaW5nV2luZG93OiB3aW5kb3csIHNoaWZ0S2V5UHJlc3NlZDogZXZlbnQuc2hpZnRLZXkgfSk7XG5cbiAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgICAgICAgdGhpcy5vbkNoYXRXaW5kb3dDbG9zZWQuZW1pdCh7IGNsb3NlZFdpbmRvdzogd2luZG93LCBjbG9zZWRWaWFFc2NhcGVLZXk6IHRydWUgfSk7XG5cbiAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgIH1cbiAgIH1cblxuICAgIC8vIFRvZ2dsZXMgYSBjaGF0IHdpbmRvdyB2aXNpYmlsaXR5IGJldHdlZW4gbWF4aW1pemVkL21pbmltaXplZFxuICAgIG9uQ2hhdFdpbmRvd0NsaWNrZWQod2luZG93OiBXaW5kb3cpOiB2b2lkXG4gICAge1xuICAgICAgICB3aW5kb3cuaXNDb2xsYXBzZWQgPSAhd2luZG93LmlzQ29sbGFwc2VkO1xuICAgICAgICB0aGlzLnNjcm9sbENoYXRXaW5kb3cod2luZG93LCBTY3JvbGxEaXJlY3Rpb24uQm90dG9tKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFySW5Vc2VGaWxlVXBsb2FkZXIoZmlsZVVwbG9hZEluc3RhbmNlSWQ6IHN0cmluZyk6IHZvaWRcbiAgICB7XG4gICAgICAgIGNvbnN0IHVwbG9hZGVySW5zdGFuY2VJZEluZGV4ID0gdGhpcy5maWxlVXBsb2FkZXJzSW5Vc2UuaW5kZXhPZihmaWxlVXBsb2FkSW5zdGFuY2VJZCk7XG5cbiAgICAgICAgaWYgKHVwbG9hZGVySW5zdGFuY2VJZEluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsZVVwbG9hZGVyc0luVXNlLnNwbGljZSh1cGxvYWRlckluc3RhbmNlSWRJbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBIYW5kbGVzIGZpbGUgc2VsZWN0aW9uIGFuZCB1cGxvYWRzIHRoZSBzZWxlY3RlZCBmaWxlIHVzaW5nIHRoZSBmaWxlIHVwbG9hZCBhZGFwdGVyXG4gICAgb25GaWxlQ2hvc2VuKHdpbmRvdzogV2luZG93KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpbGVVcGxvYWRJbnN0YW5jZUlkID0gdGhpcy5nZXRVbmlxdWVGaWxlVXBsb2FkSW5zdGFuY2VJZCh3aW5kb3cpO1xuICAgICAgICBjb25zdCB1cGxvYWRFbGVtZW50UmVmID0gdGhpcy5uYXRpdmVGaWxlSW5wdXQ7XG5cbiAgICAgICAgaWYgKHVwbG9hZEVsZW1lbnRSZWYpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGU6IEZpbGUgPSB1cGxvYWRFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZmlsZXNbMF07XG5cbiAgICAgICAgICAgIHRoaXMuZmlsZVVwbG9hZGVyc0luVXNlLnB1c2goZmlsZVVwbG9hZEluc3RhbmNlSWQpO1xuXG4gICAgICAgICAgICB0aGlzLmZpbGVVcGxvYWRBZGFwdGVyLnVwbG9hZEZpbGUoZmlsZSwgd2luZG93LnBhcnRpY2lwYW50LmlkKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoZmlsZU1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFySW5Vc2VGaWxlVXBsb2FkZXIoZmlsZVVwbG9hZEluc3RhbmNlSWQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGZpbGVNZXNzYWdlLmZyb21JZCA9IHRoaXMudXNlcklkO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFB1c2ggZmlsZSBtZXNzYWdlIHRvIGN1cnJlbnQgdXNlciB3aW5kb3dcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm1lc3NhZ2VzLnB1c2goZmlsZU1lc3NhZ2UpO1xuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbk1lc3NhZ2VTZW50LmVtaXQoZmlsZU1lc3NhZ2UpO1xuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxDaGF0V2luZG93KHdpbmRvdywgU2Nyb2xsRGlyZWN0aW9uLkJvdHRvbSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXRzIHRoZSBmaWxlIHVwbG9hZCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIHVwbG9hZEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFySW5Vc2VGaWxlVXBsb2FkZXIoZmlsZVVwbG9hZEluc3RhbmNlSWQpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0cyB0aGUgZmlsZSB1cGxvYWQgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICB1cGxvYWRFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcblxuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBJbnZva2UgYSBmaWxlIHVwbG9hZCBhZGFwdGVyIGVycm9yIGhlcmVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXRQYXJ0aWNpcGFudFRvb2x0aXAocGFydGljaXBhbnQ6IElDaGF0UGFydGljaXBhbnQpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCB7IG1ldGFkYXRhLCBkaXNwbGF5TmFtZSB9ID0gcGFydGljaXBhbnQ7XG4gICAgICAgIGlmICghbWV0YWRhdGEpIHJldHVybiBkaXNwbGF5TmFtZTtcblxuICAgICAgICBjb25zdCB7IHByaW1hcnksIHNlY29uZGFyeSwgdGVydGlhcnkgfSA9IG1ldGFkYXRhO1xuICAgICAgICBjb25zdCBwYXJ0cyA9IFtwcmltYXJ5LCBzZWNvbmRhcnksIHRlcnRpYXJ5XS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA+IDAgPyBwYXJ0cy5qb2luKCcgfCAnKSA6IGRpc3BsYXlOYW1lO1xuICAgIH1cbiAgICBcbiAgICBnZXRNZXRhZGF0YURpc3BsYXkocGFydGljaXBhbnQ6IElDaGF0UGFydGljaXBhbnQpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXBhcnRpY2lwYW50Lm1ldGFkYXRhIHx8ICFwYXJ0aWNpcGFudC5zaG93TWV0YWRhdGFJblRpdGxlKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJ0cyA9IFtdO1xuICAgICAgICBpZiAocGFydGljaXBhbnQuc2hvd01ldGFkYXRhSW5UaXRsZS5wcmltYXJ5ICYmIHBhcnRpY2lwYW50Lm1ldGFkYXRhLnByaW1hcnkpIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2gocGFydGljaXBhbnQubWV0YWRhdGEucHJpbWFyeSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnRpY2lwYW50LnNob3dNZXRhZGF0YUluVGl0bGUuc2Vjb25kYXJ5ICYmIHBhcnRpY2lwYW50Lm1ldGFkYXRhLnNlY29uZGFyeSkge1xuICAgICAgICAgICAgcGFydHMucHVzaChwYXJ0aWNpcGFudC5tZXRhZGF0YS5zZWNvbmRhcnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJ0aWNpcGFudC5zaG93TWV0YWRhdGFJblRpdGxlLnRlcnRpYXJ5ICYmIHBhcnRpY2lwYW50Lm1ldGFkYXRhLnRlcnRpYXJ5KSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKHBhcnRpY2lwYW50Lm1ldGFkYXRhLnRlcnRpYXJ5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFydHMuam9pbignIHwgJyk7XG4gICAgfVxufVxuXG4vKiBlc2xpbnQtZW5hYmxlICovIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cIndpbmRvdyAmJiB3aW5kb3cuaXNDb2xsYXBzZWRcIj5cblx0PGRpdiBjbGFzcz1cIm5nLWNoYXQtdGl0bGUgc2Vjb25kYXJ5LWJhY2tncm91bmRcIj5cblx0XHQ8ZGl2IGNsYXNzPVwibmctY2hhdC10aXRsZS12aXNpYmlsaXR5LXRvZ2dsZS1hcmVhXCIgKGNsaWNrKT1cIm9uQ2hhdFdpbmRvd0NsaWNrZWQod2luZG93KVwiPlxuXHRcdFx0PHN0cm9uZyBbbWF0VG9vbHRpcF09XCJnZXRQYXJ0aWNpcGFudFRvb2x0aXAod2luZG93LnBhcnRpY2lwYW50KVwiPlxuXHRcdFx0XHR7e3dpbmRvdy5wYXJ0aWNpcGFudC5kaXNwbGF5TmFtZX19IDxzcGFuICpuZ0lmPVwiZ2V0TWV0YWRhdGFEaXNwbGF5KHdpbmRvdy5wYXJ0aWNpcGFudClcIj4oe3sgZ2V0TWV0YWRhdGFEaXNwbGF5KHdpbmRvdy5wYXJ0aWNpcGFudCkgfX0pPC9zcGFuPlxuXHRcdFx0PC9zdHJvbmc+XG5cdFx0XHQ8c3BhbiBbbmdDbGFzc109XCJ7J25nLWNoYXQtcGFydGljaXBhbnQtc3RhdHVzJzogdHJ1ZSwgJ29ubGluZSc6IHdpbmRvdy5wYXJ0aWNpcGFudC5zdGF0dXMgPT09IENoYXRQYXJ0aWNpcGFudFN0YXR1cy5PbmxpbmUsICdidXN5Jzogd2luZG93LnBhcnRpY2lwYW50LnN0YXR1cyA9PT0gQ2hhdFBhcnRpY2lwYW50U3RhdHVzLkJ1c3ksICdhd2F5Jzogd2luZG93LnBhcnRpY2lwYW50LnN0YXR1cyA9PT0gQ2hhdFBhcnRpY2lwYW50U3RhdHVzLkF3YXksICdvZmZsaW5lJzogd2luZG93LnBhcnRpY2lwYW50LnN0YXR1cyA9PT0gQ2hhdFBhcnRpY2lwYW50U3RhdHVzLk9mZmxpbmV9XCIgW21hdFRvb2x0aXBdPVwiY2hhdFBhcnRpY2lwYW50U3RhdHVzRGVzY3JpcHRvcih3aW5kb3cucGFydGljaXBhbnQuc3RhdHVzLCBsb2NhbGl6YXRpb24pXCI+PC9zcGFuPlxuXHRcdFx0PHNwYW4gKm5nSWY9XCJ1bnJlYWRNZXNzYWdlc1RvdGFsKHdpbmRvdykubGVuZ3RoID4gMFwiIGNsYXNzPVwibmctY2hhdC11bnJlYWQtbWVzc2FnZXMtY291bnQgdW5yZWFkLW1lc3NhZ2VzLWNvdW50ZXItY29udGFpbmVyIHByaW1hcnktdGV4dFwiPnt7dW5yZWFkTWVzc2FnZXNUb3RhbCh3aW5kb3cpfX08L3NwYW4+XG5cdFx0PC9kaXY+XG5cdFx0PGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIiBjbGFzcz1cIm5nLWNoYXQtY2xvc2UgcHJpbWFyeS10ZXh0XCIgKGNsaWNrKT1cIm9uQ2xvc2VDaGF0V2luZG93KClcIj4mI3gyNzE1OzwvYT5cblx0PC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJ3aW5kb3cgJiYgIXdpbmRvdy5pc0NvbGxhcHNlZFwiPiAgXG5cdDxkaXYgY2xhc3M9XCJuZy1jaGF0LXRpdGxlIHNlY29uZGFyeS1iYWNrZ3JvdW5kXCI+XG5cdFx0PGRpdiBjbGFzcz1cIm5nLWNoYXQtdGl0bGUtdmlzaWJpbGl0eS10b2dnbGUtYXJlYVwiIChjbGljayk9XCJvbkNoYXRXaW5kb3dDbGlja2VkKHdpbmRvdylcIj5cblx0XHRcdDxzdHJvbmcgW21hdFRvb2x0aXBdPVwiZ2V0UGFydGljaXBhbnRUb29sdGlwKHdpbmRvdy5wYXJ0aWNpcGFudClcIj5cblx0XHRcdFx0e3t3aW5kb3cucGFydGljaXBhbnQuZGlzcGxheU5hbWV9fSA8c3BhbiAqbmdJZj1cImdldE1ldGFkYXRhRGlzcGxheSh3aW5kb3cucGFydGljaXBhbnQpXCI+KHt7IGdldE1ldGFkYXRhRGlzcGxheSh3aW5kb3cucGFydGljaXBhbnQpIH19KTwvc3Bhbj5cblx0XHRcdDwvc3Ryb25nPlxuXHRcdFx0PHNwYW4gW25nQ2xhc3NdPVwieyduZy1jaGF0LXBhcnRpY2lwYW50LXN0YXR1cyc6IHRydWUsICdvbmxpbmUnOiB3aW5kb3cucGFydGljaXBhbnQuc3RhdHVzID09PSBDaGF0UGFydGljaXBhbnRTdGF0dXMuT25saW5lLCAnYnVzeSc6IHdpbmRvdy5wYXJ0aWNpcGFudC5zdGF0dXMgPT09IENoYXRQYXJ0aWNpcGFudFN0YXR1cy5CdXN5LCAnYXdheSc6IHdpbmRvdy5wYXJ0aWNpcGFudC5zdGF0dXMgPT09IENoYXRQYXJ0aWNpcGFudFN0YXR1cy5Bd2F5LCAnb2ZmbGluZSc6IHdpbmRvdy5wYXJ0aWNpcGFudC5zdGF0dXMgPT09IENoYXRQYXJ0aWNpcGFudFN0YXR1cy5PZmZsaW5lfVwiIFttYXRUb29sdGlwXT1cImNoYXRQYXJ0aWNpcGFudFN0YXR1c0Rlc2NyaXB0b3Iod2luZG93LnBhcnRpY2lwYW50LnN0YXR1cywgbG9jYWxpemF0aW9uKVwiPjwvc3Bhbj5cblx0XHRcdDxzcGFuICpuZ0lmPVwidW5yZWFkTWVzc2FnZXNUb3RhbCh3aW5kb3cpLmxlbmd0aCA+IDBcIiBjbGFzcz1cIm5nLWNoYXQtdW5yZWFkLW1lc3NhZ2VzLWNvdW50IHVucmVhZC1tZXNzYWdlcy1jb3VudGVyLWNvbnRhaW5lciBwcmltYXJ5LXRleHRcIj57e3VucmVhZE1lc3NhZ2VzVG90YWwod2luZG93KX19PC9zcGFuPlxuXHRcdDwvZGl2PlxuXHRcdDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCIgY2xhc3M9XCJuZy1jaGF0LWNsb3NlIHByaW1hcnktdGV4dFwiIChjbGljayk9XCJvbkNsb3NlQ2hhdFdpbmRvdygpXCI+JiN4MjcxNTs8L2E+XG5cdFx0PCEtLSA8bmctY2hhdC1vcHRpb25zIFtuZ0NsYXNzXT1cIiduZy1jaGF0LW9wdGlvbnMtY29udGFpbmVyJ1wiIFtvcHRpb25zXT1cImRlZmF1bHRXaW5kb3dPcHRpb25zKHdpbmRvdylcIiAoYWN0aXZlT3B0aW9uVHJhY2tlckNoYW5nZSk9XCJhY3RpdmVPcHRpb25UcmFja2VyQ2hhbmdlKCRldmVudClcIj48L25nLWNoYXQtb3B0aW9ucz4gLS0+XG5cdDwvZGl2PlxuXHRcdDxkaXYgI2NoYXRNZXNzYWdlcyBjbGFzcz1cIm5nLWNoYXQtbWVzc2FnZXMgcHJpbWFyeS1iYWNrZ3JvdW5kXCI+XG5cdFx0XHQ8ZGl2ICpuZ0lmPVwid2luZG93LmlzTG9hZGluZ0hpc3RvcnlcIiBjbGFzcz1cIm5nLWNoYXQtbG9hZGluZy13cmFwcGVyXCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJsb2FkZXJcIj5Mb2FkaW5nIGhpc3RvcnkuLi48L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdFx0PGRpdiAqbmdJZj1cImhhc1BhZ2VkSGlzdG9yeSAmJiB3aW5kb3cuaGFzTW9yZU1lc3NhZ2VzICYmICF3aW5kb3cuaXNMb2FkaW5nSGlzdG9yeVwiIGNsYXNzPVwibmctY2hhdC1sb2FkLWhpc3RvcnlcIj5cblx0XHRcdFx0PGEgY2xhc3M9XCJsb2FkLWhpc3RvcnktYWN0aW9uXCIgKGNsaWNrKT1cImZldGNoTWVzc2FnZUhpc3Rvcnkod2luZG93KVwiPnt7bG9jYWxpemF0aW9uLmxvYWRNZXNzYWdlSGlzdG9yeVBsYWNlaG9sZGVyfX08L2E+XG5cdFx0XHQ8L2Rpdj5cblxuXHRcdFx0PGRpdiAqbmdGb3I9XCJsZXQgbWVzc2FnZSBvZiB3aW5kb3cubWVzc2FnZXM7IGxldCBpID0gaW5kZXhcIiBbbmdDbGFzc109XCJ7J25nLWNoYXQtbWVzc2FnZSc6IHRydWUsICduZy1jaGF0LW1lc3NhZ2UtcmVjZWl2ZWQnOiBtZXNzYWdlLmZyb21JZCAhPT0gdXNlcklkfVwiPlxuXHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiaXNBdmF0YXJWaXNpYmxlKHdpbmRvdywgbWVzc2FnZSwgaSlcIj5cblx0XHRcdFx0XHQ8ZGl2ICpuZ0lmPVwiIWdldENoYXRXaW5kb3dBdmF0YXIod2luZG93LnBhcnRpY2lwYW50LCBtZXNzYWdlKVwiIGNsYXNzPVwiaWNvbi13cmFwcGVyXCI+XG5cdFx0XHRcdFx0XHQ8aSBjbGFzcz1cInVzZXItaWNvblwiPjwvaT5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8IS0tIDxpbWcgKm5nSWY9XCJnZXRDaGF0V2luZG93QXZhdGFyKHdpbmRvdy5wYXJ0aWNpcGFudCwgbWVzc2FnZSlcIiBhbHQ9XCJcIiBjbGFzcz1cImF2YXRhclwiIGhlaWdodD1cIjMwXCIgd2lkdGg9XCIzMFwiIFtzcmNdPVwiZ2V0Q2hhdFdpbmRvd0F2YXRhcih3aW5kb3cucGFydGljaXBhbnQsIG1lc3NhZ2UpIHwgc2FuaXRpemVcIiAvPiAtLT5cblx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cIndpbmRvdy5wYXJ0aWNpcGFudC5wYXJ0aWNpcGFudFR5cGUgPT09IENoYXRQYXJ0aWNpcGFudFR5cGUuR3JvdXBcIiBjbGFzcz1cIm5nLWNoYXQtcGFydGljaXBhbnQtbmFtZVwiPnt7d2luZG93LnBhcnRpY2lwYW50IHwgZ3JvdXBNZXNzYWdlRGlzcGxheU5hbWU6bWVzc2FnZX19PC9zcGFuPlxuXHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cblx0XHRcdFx0PG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwibWVzc2FnZS50eXBlXCI+XG5cdFx0XHRcdFx0PGRpdiAqbmdTd2l0Y2hDYXNlPVwiTWVzc2FnZVR5cGUuVGV4dFwiIFtuZ0NsYXNzXT1cInsnc2VudC1jaGF0LW1lc3NhZ2UtY29udGFpbmVyJzogbWVzc2FnZS5mcm9tSWQgPT09IHVzZXJJZCwgJ3JlY2VpdmVkLWNoYXQtbWVzc2FnZS1jb250YWluZXInOiBtZXNzYWdlLmZyb21JZCAhPT0gdXNlcklkfVwiPlxuXHRcdFx0ICBcdFx0XHQ8c3BhbiBbaW5uZXJIdG1sXT1cIm1lc3NhZ2UubWVzc2FnZSB8IGVtb2ppZnk6ZW1vamlzRW5hYmxlZCB8IGxpbmtmeTpsaW5rZnlFbmFibGVkXCI+PC9zcGFuPlxuXHRcdFx0XHRcdFx0PHNwYW4gKm5nSWY9XCJzaG93TWVzc2FnZURhdGUgJiYgbWVzc2FnZS5kYXRlU2VudFwiIGNsYXNzPVwibWVzc2FnZS1zZW50LWRhdGVcIj57e21lc3NhZ2UuZGF0ZVNlbnQgfCBkYXRlOidkZCd9fS97e21lc3NhZ2UuZGF0ZVNlbnQgfCBkYXRlOidNTSd9fS97e21lc3NhZ2UuZGF0ZVNlbnQgfCBkYXRlOid5J319IHt7bWVzc2FnZS5kYXRlU2VudCB8IGRhdGU6J2g6bW0gYSAnfX08L3NwYW4+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PGRpdiAqbmdTd2l0Y2hDYXNlPVwiTWVzc2FnZVR5cGUuSW1hZ2VcIiBbbmdDbGFzc109XCJ7J3NlbnQtY2hhdC1tZXNzYWdlLWNvbnRhaW5lcic6IG1lc3NhZ2UuZnJvbUlkID09PSB1c2VySWQsICdyZWNlaXZlZC1jaGF0LW1lc3NhZ2UtY29udGFpbmVyJzogbWVzc2FnZS5mcm9tSWQgIT09IHVzZXJJZH1cIj5cblx0XG5cdFx0XHQgIFx0XHRcdDxpbWcgc3JjPVwie3ttZXNzYWdlLm1lc3NhZ2V9fVwiIGNsYXNzPVwiaW1hZ2UtbWVzc2FnZVwiIC8+XG5cdFxuXHRcdFx0XHRcdFx0PHNwYW4gKm5nSWY9XCJzaG93TWVzc2FnZURhdGUgJiYgbWVzc2FnZS5kYXRlU2VudFwiIGNsYXNzPVwibWVzc2FnZS1zZW50LWRhdGVcIj57e21lc3NhZ2UuZGF0ZVNlbnQgfCBkYXRlOidkZCd9fS97e21lc3NhZ2UuZGF0ZVNlbnQgfCBkYXRlOidNTSd9fS97e21lc3NhZ2UuZGF0ZVNlbnQgfCBkYXRlOid5J319IHt7bWVzc2FnZS5kYXRlU2VudCB8IGRhdGU6J2g6bW0gYSAnfX08L3NwYW4+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PGRpdiAqbmdTd2l0Y2hDYXNlPVwiTWVzc2FnZVR5cGUuRmlsZVwiIFtuZ0NsYXNzXT1cInsnZmlsZS1tZXNzYWdlLWNvbnRhaW5lcic6IHRydWUsICdyZWNlaXZlZCc6IG1lc3NhZ2UuZnJvbUlkICE9PSB1c2VySWR9XCI+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZmlsZS1tZXNzYWdlLWljb24tY29udGFpbmVyXCI+XG5cdFx0XHRcdFx0XHRcdDxpIGNsYXNzPVwicGFwZXJjbGlwLWljb25cIj48L2k+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHRcdDwhLS0gPGEgY2xhc3M9XCJmaWxlLWRldGFpbHNcIiBbYXR0ci5ocmVmXT1cIm1lc3NhZ2UuZG93bmxvYWRVcmxcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCIgKGNsaWNrKT1cInRoaXMubWFya01lc3NhZ2VzQXNSZWFkKFttZXNzYWdlXSlcIiBkb3dubG9hZD5cblx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJmaWxlLW1lc3NhZ2UtdGl0bGVcIiBbYXR0ci50aXRsZV09XCJtZXNzYWdlLm1lc3NhZ2VcIj57e21lc3NhZ2UubWVzc2FnZX19PC9zcGFuPlxuXHRcdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cIm1lc3NhZ2UuZmlsZVNpemVJbkJ5dGVzXCIgIGNsYXNzPVwiZmlsZS1tZXNzYWdlLXNpemVcIj57e21lc3NhZ2UuZmlsZVNpemVJbkJ5dGVzfX0gQnl0ZXM8L3NwYW4+XG5cdFx0XHRcdFx0XHQ8L2E+IC0tPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cblx0XHRcdDwvZGl2PlxuXHQ8L2Rpdj5cblxuXHQ8ZGl2IGNsYXNzPVwibmctY2hhdC1mb290ZXIgcHJpbWFyeS1vdXRsaW5lLWNvbG9yIHByaW1hcnktYmFja2dyb3VuZFwiPlxuXHRcdDxpbnB1dCAjY2hhdFdpbmRvd0lucHV0XG5cdFx0XHR0eXBlPVwidGV4dFwiXG5cdFx0XHRbbmdNb2RlbF09XCJ3aW5kb3cubmV3TWVzc2FnZSB8IGVtb2ppZnk6ZW1vamlzRW5hYmxlZFwiXG5cdFx0XHQobmdNb2RlbENoYW5nZSk9XCJ3aW5kb3cubmV3TWVzc2FnZT0kZXZlbnRcIlxuXHRcdFx0W3BsYWNlaG9sZGVyXT1cImxvY2FsaXphdGlvbi5tZXNzYWdlUGxhY2Vob2xkZXJcIlxuXHRcdFx0W25nQ2xhc3NdPVwieydjaGF0LXdpbmRvdy1pbnB1dCc6IHRydWUsICdoYXMtc2lkZS1hY3Rpb24nOiBmaWxlVXBsb2FkQWRhcHRlcn1cIlxuXHRcdFx0KGtleWRvd24pPVwib25DaGF0SW5wdXRUeXBlZCgkZXZlbnQsIHdpbmRvdylcIlxuXHRcdFx0KGJsdXIpPVwidG9nZ2xlV2luZG93Rm9jdXMod2luZG93KVwiXG5cdFx0XHQoZm9jdXMpPVwidG9nZ2xlV2luZG93Rm9jdXMod2luZG93KVwiLz5cblxuXHRcdDwhLS0gRmlsZSBVcGxvYWQgLS0+XG5cdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbGVVcGxvYWRBZGFwdGVyXCI+XG5cdFx0XHQ8YSAqbmdJZj1cIiFpc1VwbG9hZGluZ0ZpbGUod2luZG93KVwiIGNsYXNzPVwiYnRuLWFkZC1maWxlXCIgKGNsaWNrKT1cInRyaWdnZXJOYXRpdmVGaWxlVXBsb2FkKHdpbmRvdylcIj5cblx0XHRcdFx0PGkgY2xhc3M9XCJ1cGxvYWQtaWNvblwiPjwvaT5cblx0XHRcdDwvYT5cblx0XHRcdDxpbnB1dFxuXHRcdFx0XHR0eXBlPVwiZmlsZVwiXG5cdFx0XHRcdCNuYXRpdmVGaWxlSW5wdXRcblx0XHRcdFx0c3R5bGU9XCJkaXNwbGF5OiBub25lO1wiXG5cdFx0XHRcdFthdHRyLmlkXT1cImdldFVuaXF1ZUZpbGVVcGxvYWRJbnN0YW5jZUlkKHdpbmRvdylcIlxuXHRcdFx0XHQoY2hhbmdlKT1cIm9uRmlsZUNob3Nlbih3aW5kb3cpXCIgLz5cblx0XHRcdDxkaXYgKm5nSWY9XCJpc1VwbG9hZGluZ0ZpbGUod2luZG93KVwiIGNsYXNzPVwibG9hZGVyXCI+PC9kaXY+XG5cdFx0PC9uZy1jb250YWluZXI+XG5cdDwvZGl2PlxuPC9uZy1jb250YWluZXI+Il19
@@ -0,0 +1,18 @@
1
+ export class ChatAdapter {
2
+ constructor() {
3
+ // ### Abstract adapter methods ###
4
+ // Event handlers
5
+ /** @internal */
6
+ this.friendsListChangedHandler = (participantsResponse) => { };
7
+ /** @internal */
8
+ this.messageReceivedHandler = (participant, message) => { };
9
+ }
10
+ // ### Adapter/Chat income/ingress events ###
11
+ onFriendsListChanged(participantsResponse) {
12
+ this.friendsListChangedHandler(participantsResponse);
13
+ }
14
+ onMessageReceived(participant, message) {
15
+ this.messageReceivedHandler(participant, message);
16
+ }
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jaGF0L3NyYy9saWIvY29yZS9jaGF0LWFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsTUFBTSxPQUFnQixXQUFXO0lBQWpDO1FBRUksbUNBQW1DO1FBb0JuQyxpQkFBaUI7UUFDakIsZ0JBQWdCO1FBQ2hCLDhCQUF5QixHQUEyRCxDQUFDLG9CQUEyQyxFQUFFLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFDeEksZ0JBQWdCO1FBQ2hCLDJCQUFzQixHQUE4RCxDQUFDLFdBQTZCLEVBQUUsT0FBZ0IsRUFBRSxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBQ2hKLENBQUM7SUFqQkcsNkNBQTZDO0lBRXRDLG9CQUFvQixDQUFDLG9CQUEyQztRQUVuRSxJQUFJLENBQUMseUJBQXlCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRU0saUJBQWlCLENBQUMsV0FBNkIsRUFBRSxPQUFnQjtRQUVwRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3RELENBQUM7Q0FPSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tIFwiLi9tZXNzYWdlXCI7XG4vLyBpbXBvcnQgeyBVc2VyIH0gZnJvbSBcIi4vdXNlclwiO1xuaW1wb3J0IHsgUGFydGljaXBhbnRSZXNwb25zZSB9IGZyb20gXCIuL3BhcnRpY2lwYW50LXJlc3BvbnNlXCI7XG5pbXBvcnQgeyBJQ2hhdFBhcnRpY2lwYW50IH0gZnJvbSAnLi9jaGF0LXBhcnRpY2lwYW50JztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENoYXRBZGFwdGVyXG57XG4gICAgLy8gIyMjIEFic3RyYWN0IGFkYXB0ZXIgbWV0aG9kcyAjIyNcblxuICAgIHB1YmxpYyBhYnN0cmFjdCBsaXN0RnJpZW5kcygpOiBPYnNlcnZhYmxlPFBhcnRpY2lwYW50UmVzcG9uc2VbXT47XG4gICAgXG4gICAgcHVibGljIGFic3RyYWN0IGdldE1lc3NhZ2VIaXN0b3J5KGRlc3RpbmF0YXJ5SWQ6IGFueSk6IE9ic2VydmFibGU8TWVzc2FnZVtdPjtcblxuICAgIHB1YmxpYyBhYnN0cmFjdCBzZW5kTWVzc2FnZShtZXNzYWdlOiBNZXNzYWdlKTogdm9pZDtcblxuICAgIC8vICMjIyBBZGFwdGVyL0NoYXQgaW5jb21lL2luZ3Jlc3MgZXZlbnRzICMjI1xuXG4gICAgcHVibGljIG9uRnJpZW5kc0xpc3RDaGFuZ2VkKHBhcnRpY2lwYW50c1Jlc3BvbnNlOiBQYXJ0aWNpcGFudFJlc3BvbnNlW10pOiB2b2lkXG4gICAge1xuICAgICAgICB0aGlzLmZyaWVuZHNMaXN0Q2hhbmdlZEhhbmRsZXIocGFydGljaXBhbnRzUmVzcG9uc2UpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbk1lc3NhZ2VSZWNlaXZlZChwYXJ0aWNpcGFudDogSUNoYXRQYXJ0aWNpcGFudCwgbWVzc2FnZTogTWVzc2FnZSk6IHZvaWRcbiAgICB7XG4gICAgICAgIHRoaXMubWVzc2FnZVJlY2VpdmVkSGFuZGxlcihwYXJ0aWNpcGFudCwgbWVzc2FnZSk7XG4gICAgfVxuICAgIFxuICAgIC8vIEV2ZW50IGhhbmRsZXJzXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIGZyaWVuZHNMaXN0Q2hhbmdlZEhhbmRsZXI6IChwYXJ0aWNpcGFudHNSZXNwb25zZTogUGFydGljaXBhbnRSZXNwb25zZVtdKSA9PiB2b2lkICA9IChwYXJ0aWNpcGFudHNSZXNwb25zZTogUGFydGljaXBhbnRSZXNwb25zZVtdKSA9PiB7fTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgbWVzc2FnZVJlY2VpdmVkSGFuZGxlcjogKHBhcnRpY2lwYW50OiBJQ2hhdFBhcnRpY2lwYW50LCBtZXNzYWdlOiBNZXNzYWdlKSA9PiB2b2lkID0gKHBhcnRpY2lwYW50OiBJQ2hhdFBhcnRpY2lwYW50LCBtZXNzYWdlOiBNZXNzYWdlKSA9PiB7fTtcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jaGF0L3NyYy9saWIvY29yZS9jaGF0LWNvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFVzZXIgfSBmcm9tICcuL3VzZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIElDaGF0Q29udHJvbGxlclxue1xuICAgIHRyaWdnZXJPcGVuQ2hhdFdpbmRvdyh1c2VyOiBVc2VyKTogdm9pZDtcblxuICAgIHRyaWdnZXJDbG9zZUNoYXRXaW5kb3codXNlcklkOiBhbnkpOiB2b2lkO1xuXG4gICAgdHJpZ2dlclRvZ2dsZUNoYXRXaW5kb3dWaXNpYmlsaXR5KHVzZXJJZDogYW55KTogdm9pZDtcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1ncm91cC1hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jaGF0L3NyYy9saWIvY29yZS9jaGF0LWdyb3VwLWFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdyb3VwIH0gZnJvbSBcIi4vZ3JvdXBcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJQ2hhdEdyb3VwQWRhcHRlclxue1xuICAgIGdyb3VwQ3JlYXRlZChncm91cDogR3JvdXApOiB2b2lkO1xufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1vcHRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NoYXQvc3JjL2xpYi9jb3JlL2NoYXQtb3B0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXaW5kb3cgfSBmcm9tICcuLi9jb3JlL3dpbmRvdyc7XG5pbXBvcnQgeyBJQ2hhdFBhcnRpY2lwYW50IH0gZnJvbSAnLi4vY29yZS9jaGF0LXBhcnRpY2lwYW50JztcblxuZXhwb3J0IGludGVyZmFjZSBJQ2hhdE9wdGlvblxue1xuICAgIGlzQWN0aXZlOiBib29sZWFuO1xuICAgIGRpc3BsYXlMYWJlbDogc3RyaW5nO1xuICAgIGNoYXR0aW5nVG86IFdpbmRvdztcbiAgICBhY3Rpb24/OiAoY2hhdHRpbmdUbzogV2luZG93KSA9PiB2b2lkO1xuICAgIHZhbGlkYXRlQ29udGV4dDogKHBhcnRpY2lwYW50OiBJQ2hhdFBhcnRpY2lwYW50KSA9PiBib29sZWFuO1xufVxuIl19
@@ -0,0 +1,6 @@
1
+ import { ChatParticipantStatus } from './chat-participant-status.enum';
2
+ export function chatParticipantStatusDescriptor(status, localization) {
3
+ const currentStatus = ChatParticipantStatus[status].toString().toLowerCase();
4
+ return localization.statusDescription[currentStatus];
5
+ }
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1wYXJ0aWNpcGFudC1zdGF0dXMtZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY2hhdC9zcmMvbGliL2NvcmUvY2hhdC1wYXJ0aWNpcGFudC1zdGF0dXMtZGVzY3JpcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUd2RSxNQUFNLFVBQVUsK0JBQStCLENBQUMsTUFBNkIsRUFBRSxZQUEwQjtJQUNyRyxNQUFNLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUU3RSxPQUFPLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUN6RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhdFBhcnRpY2lwYW50U3RhdHVzIH0gZnJvbSAnLi9jaGF0LXBhcnRpY2lwYW50LXN0YXR1cy5lbnVtJztcbmltcG9ydCB7IExvY2FsaXphdGlvbiB9IGZyb20gJy4vbG9jYWxpemF0aW9uJ1xuIFxuZXhwb3J0IGZ1bmN0aW9uIGNoYXRQYXJ0aWNpcGFudFN0YXR1c0Rlc2NyaXB0b3Ioc3RhdHVzOiBDaGF0UGFydGljaXBhbnRTdGF0dXMsIGxvY2FsaXphdGlvbjogTG9jYWxpemF0aW9uKSB7XG4gICAgY29uc3QgY3VycmVudFN0YXR1cyA9IENoYXRQYXJ0aWNpcGFudFN0YXR1c1tzdGF0dXNdLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcbiAgICBcbiAgICByZXR1cm4gbG9jYWxpemF0aW9uLnN0YXR1c0Rlc2NyaXB0aW9uW2N1cnJlbnRTdGF0dXNdO1xufSJdfQ==
@@ -5,4 +5,4 @@ export var ChatParticipantStatus;
5
5
  ChatParticipantStatus[ChatParticipantStatus["Away"] = 2] = "Away";
6
6
  ChatParticipantStatus[ChatParticipantStatus["Offline"] = 3] = "Offline";
7
7
  })(ChatParticipantStatus || (ChatParticipantStatus = {}));
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1wYXJ0aWNpcGFudC1zdGF0dXMuZW51bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NoYXQvc3JjL2xpYi9jb3JlL2NoYXQtcGFydGljaXBhbnQtc3RhdHVzLmVudW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFOLElBQVkscUJBTVg7QUFORCxXQUFZLHFCQUFxQjtJQUU3QixxRUFBTSxDQUFBO0lBQ04saUVBQUksQ0FBQTtJQUNKLGlFQUFJLENBQUE7SUFDSix1RUFBTyxDQUFBO0FBQ1gsQ0FBQyxFQU5XLHFCQUFxQixLQUFyQixxQkFBcUIsUUFNaEMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZW51bSBDaGF0UGFydGljaXBhbnRTdGF0dXNcbntcbiAgICBPbmxpbmUsXG4gICAgQnVzeSxcbiAgICBBd2F5LFxuICAgIE9mZmxpbmVcbn1cbiJdfQ==
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1wYXJ0aWNpcGFudC1zdGF0dXMuZW51bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY2hhdC9zcmMvbGliL2NvcmUvY2hhdC1wYXJ0aWNpcGFudC1zdGF0dXMuZW51bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSxxQkFNWDtBQU5ELFdBQVkscUJBQXFCO0lBRTdCLHFFQUFNLENBQUE7SUFDTixpRUFBSSxDQUFBO0lBQ0osaUVBQUksQ0FBQTtJQUNKLHVFQUFPLENBQUE7QUFDWCxDQUFDLEVBTlcscUJBQXFCLEtBQXJCLHFCQUFxQixRQU1oQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIENoYXRQYXJ0aWNpcGFudFN0YXR1c1xue1xuICAgIE9ubGluZSxcbiAgICBCdXN5LFxuICAgIEF3YXksXG4gICAgT2ZmbGluZVxufVxuIl19
@@ -0,0 +1,6 @@
1
+ export var ChatParticipantType;
2
+ (function (ChatParticipantType) {
3
+ ChatParticipantType[ChatParticipantType["User"] = 0] = "User";
4
+ ChatParticipantType[ChatParticipantType["Group"] = 1] = "Group";
5
+ })(ChatParticipantType || (ChatParticipantType = {}));
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1wYXJ0aWNpcGFudC10eXBlLmVudW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NoYXQvc3JjL2xpYi9jb3JlL2NoYXQtcGFydGljaXBhbnQtdHlwZS5lbnVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBTixJQUFZLG1CQUlYO0FBSkQsV0FBWSxtQkFBbUI7SUFFM0IsNkRBQUksQ0FBQTtJQUNKLCtEQUFLLENBQUE7QUFDVCxDQUFDLEVBSlcsbUJBQW1CLEtBQW5CLG1CQUFtQixRQUk5QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIENoYXRQYXJ0aWNpcGFudFR5cGVcbntcbiAgICBVc2VyLFxuICAgIEdyb3VwXG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1wYXJ0aWNpcGFudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY2hhdC9zcmMvbGliL2NvcmUvY2hhdC1wYXJ0aWNpcGFudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhdFBhcnRpY2lwYW50U3RhdHVzIH0gZnJvbSBcIi4vY2hhdC1wYXJ0aWNpcGFudC1zdGF0dXMuZW51bVwiO1xuaW1wb3J0IHsgQ2hhdFBhcnRpY2lwYW50VHlwZSB9IGZyb20gXCIuL2NoYXQtcGFydGljaXBhbnQtdHlwZS5lbnVtXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNoYXRQYXJ0aWNpcGFudCB7XG4gICAgcmVhZG9ubHkgcGFydGljaXBhbnRUeXBlOiBDaGF0UGFydGljaXBhbnRUeXBlO1xuICAgIHJlYWRvbmx5IGlkOiBhbnk7XG4gICAgcmVhZG9ubHkgc3RhdHVzOiBDaGF0UGFydGljaXBhbnRTdGF0dXM7XG4gICAgcmVhZG9ubHkgYXZhdGFyOiBzdHJpbmd8bnVsbDtcbiAgICByZWFkb25seSBkaXNwbGF5TmFtZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IG1ldGFkYXRhPzogSU1ldGFkYXRhO1xuICAgIHJlYWRvbmx5IHNob3dNZXRhZGF0YUluVGl0bGU/OiBJTWV0YWRhdGFJblRpdGxlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNZXRhZGF0YSB7XG4gICAgcHJpbWFyeT86IHN0cmluZztcbiAgICBzZWNvbmRhcnk/OiBzdHJpbmc7XG4gICAgdGVydGlhcnk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1ldGFkYXRhSW5UaXRsZSB7XG4gICAgcHJpbWFyeT86IGJvb2xlYW47XG4gICAgc2Vjb25kYXJ5PzogYm9vbGVhbjtcbiAgICB0ZXJ0aWFyeT86IGJvb2xlYW47XG59XG4iXX0=
@@ -0,0 +1,43 @@
1
+ /*import { IFileUploadAdapter } from './file-upload-adapter';
2
+ import { HttpClient, HttpRequest, HttpEventType, HttpResponse, HttpHeaders } from '@angular/common/http';
3
+ import { Observable, Subject } from 'rxjs';
4
+ import { User } from './user';
5
+ import { Message } from './message';*/
6
+ export class DefaultFileUploadAdapter {
7
+ /**
8
+ * @summary Basic file upload adapter implementation for HTTP request form file consumption
9
+ * @param _serverEndpointUrl The API endpoint full qualified address that will receive a form file to process and return the metadata.
10
+ */
11
+ constructor(_serverEndpointUrl, _http) {
12
+ this._serverEndpointUrl = _serverEndpointUrl;
13
+ this._http = _http;
14
+ }
15
+ uploadFile(file, participantId) {
16
+ const formData = new FormData();
17
+ //formData.append('ng-chat-sender-userid', currentUserId);
18
+ formData.append('ng-chat-participant-id', participantId);
19
+ formData.append('file', file, file.name);
20
+ return this._http.post(this._serverEndpointUrl, formData);
21
+ // TODO: Leaving this if we want to track upload progress in detail in the future. Might need a different Subject generic type wrapper
22
+ // const fileRequest = new HttpRequest('POST', this._serverEndpointUrl, formData, {
23
+ // reportProgress: true
24
+ // });
25
+ // const uploadProgress = new Subject<number>();
26
+ // const uploadStatus = uploadProgress.asObservable();
27
+ //const responsePromise = new Subject<Message>();
28
+ // this._http
29
+ // .request(fileRequest)
30
+ // .subscribe(event => {
31
+ // // if (event.type == HttpEventType.UploadProgress)
32
+ // // {
33
+ // // const percentDone = Math.round(100 * event.loaded / event.total);
34
+ // // uploadProgress.next(percentDone);
35
+ // // }
36
+ // // else if (event instanceof HttpResponse)
37
+ // // {
38
+ // // uploadProgress.complete();
39
+ // // }
40
+ // });
41
+ }
42
+ }
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1maWxlLXVwbG9hZC1hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jaGF0L3NyYy9saWIvY29yZS9kZWZhdWx0LWZpbGUtdXBsb2FkLWFkYXB0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0E7Ozs7c0NBSXNDO0FBRXRDLE1BQU0sT0FBTyx3QkFBd0I7SUFFakM7OztPQUdHO0lBQ0gsWUFBb0Isa0JBQTBCLEVBQVUsS0FBaUI7UUFBckQsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFRO1FBQVUsVUFBSyxHQUFMLEtBQUssQ0FBWTtJQUN6RSxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQVUsRUFBRSxhQUFrQjtRQUNyQyxNQUFNLFFBQVEsR0FBYSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBRTFDLDBEQUEwRDtRQUMxRCxRQUFRLENBQUMsTUFBTSxDQUFDLHdCQUF3QixFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3pELFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFekMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBVSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFbkUsc0lBQXNJO1FBQ3RJLG1GQUFtRjtRQUNuRiwyQkFBMkI7UUFDM0IsTUFBTTtRQUVOLGdEQUFnRDtRQUNoRCxzREFBc0Q7UUFFdEQsaURBQWlEO1FBRWpELGFBQWE7UUFDYiw0QkFBNEI7UUFDNUIsNEJBQTRCO1FBQzVCLDZEQUE2RDtRQUM3RCxlQUFlO1FBQ2YsbUZBQW1GO1FBRW5GLG1EQUFtRDtRQUNuRCxlQUFlO1FBQ2YscURBQXFEO1FBQ3JELGVBQWU7UUFFZiw0Q0FBNEM7UUFDNUMsZUFBZTtRQUNmLFVBQVU7SUFDZCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJRmlsZVVwbG9hZEFkYXB0ZXIgfSBmcm9tICcuL2ZpbGUtdXBsb2FkLWFkYXB0ZXInO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICcuL21lc3NhZ2UnO1xuXG4vKmltcG9ydCB7IElGaWxlVXBsb2FkQWRhcHRlciB9IGZyb20gJy4vZmlsZS11cGxvYWQtYWRhcHRlcic7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwUmVxdWVzdCwgSHR0cEV2ZW50VHlwZSwgSHR0cFJlc3BvbnNlLCBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuL3VzZXInO1xuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJy4vbWVzc2FnZSc7Ki9cblxuZXhwb3J0IGNsYXNzIERlZmF1bHRGaWxlVXBsb2FkQWRhcHRlciBpbXBsZW1lbnRzIElGaWxlVXBsb2FkQWRhcHRlclxue1xuICAgIC8qKlxuICAgICAqIEBzdW1tYXJ5IEJhc2ljIGZpbGUgdXBsb2FkIGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gZm9yIEhUVFAgcmVxdWVzdCBmb3JtIGZpbGUgY29uc3VtcHRpb25cbiAgICAgKiBAcGFyYW0gX3NlcnZlckVuZHBvaW50VXJsIFRoZSBBUEkgZW5kcG9pbnQgZnVsbCBxdWFsaWZpZWQgYWRkcmVzcyB0aGF0IHdpbGwgcmVjZWl2ZSBhIGZvcm0gZmlsZSB0byBwcm9jZXNzIGFuZCByZXR1cm4gdGhlIG1ldGFkYXRhLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX3NlcnZlckVuZHBvaW50VXJsOiBzdHJpbmcsIHByaXZhdGUgX2h0dHA6IEh0dHBDbGllbnQpIHtcbiAgICB9XG5cbiAgICB1cGxvYWRGaWxlKGZpbGU6IEZpbGUsIHBhcnRpY2lwYW50SWQ6IGFueSk6IE9ic2VydmFibGU8TWVzc2FnZT4ge1xuICAgICAgICBjb25zdCBmb3JtRGF0YTogRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcblxuICAgICAgICAvL2Zvcm1EYXRhLmFwcGVuZCgnbmctY2hhdC1zZW5kZXItdXNlcmlkJywgY3VycmVudFVzZXJJZCk7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnbmctY2hhdC1wYXJ0aWNpcGFudC1pZCcsIHBhcnRpY2lwYW50SWQpO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlLCBmaWxlLm5hbWUpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwLnBvc3Q8TWVzc2FnZT4odGhpcy5fc2VydmVyRW5kcG9pbnRVcmwsIGZvcm1EYXRhKTtcblxuICAgICAgICAvLyBUT0RPOiBMZWF2aW5nIHRoaXMgaWYgd2Ugd2FudCB0byB0cmFjayB1cGxvYWQgcHJvZ3Jlc3MgaW4gZGV0YWlsIGluIHRoZSBmdXR1cmUuIE1pZ2h0IG5lZWQgYSBkaWZmZXJlbnQgU3ViamVjdCBnZW5lcmljIHR5cGUgd3JhcHBlclxuICAgICAgICAvLyBjb25zdCBmaWxlUmVxdWVzdCA9IG5ldyBIdHRwUmVxdWVzdCgnUE9TVCcsIHRoaXMuX3NlcnZlckVuZHBvaW50VXJsLCBmb3JtRGF0YSwge1xuICAgICAgICAvLyAgICAgcmVwb3J0UHJvZ3Jlc3M6IHRydWVcbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgLy8gY29uc3QgdXBsb2FkUHJvZ3Jlc3MgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG4gICAgICAgIC8vIGNvbnN0IHVwbG9hZFN0YXR1cyA9IHVwbG9hZFByb2dyZXNzLmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgICAgIC8vY29uc3QgcmVzcG9uc2VQcm9taXNlID0gbmV3IFN1YmplY3Q8TWVzc2FnZT4oKTtcblxuICAgICAgICAvLyB0aGlzLl9odHRwXG4gICAgICAgIC8vICAgICAucmVxdWVzdChmaWxlUmVxdWVzdClcbiAgICAgICAgLy8gICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICAvLyAgICAgICAgIC8vIGlmIChldmVudC50eXBlID09IEh0dHBFdmVudFR5cGUuVXBsb2FkUHJvZ3Jlc3MpXG4gICAgICAgIC8vICAgICAgICAgLy8ge1xuICAgICAgICAvLyAgICAgICAgIC8vICAgICBjb25zdCBwZXJjZW50RG9uZSA9IE1hdGgucm91bmQoMTAwICogZXZlbnQubG9hZGVkIC8gZXZlbnQudG90YWwpO1xuXG4gICAgICAgIC8vICAgICAgICAgLy8gICAgIHVwbG9hZFByb2dyZXNzLm5leHQocGVyY2VudERvbmUpO1xuICAgICAgICAvLyAgICAgICAgIC8vIH1cbiAgICAgICAgLy8gICAgICAgICAvLyBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSlcbiAgICAgICAgLy8gICAgICAgICAvLyB7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAvLyAgICAgICAgIC8vICAgICB1cGxvYWRQcm9ncmVzcy5jb21wbGV0ZSgpO1xuICAgICAgICAvLyAgICAgICAgIC8vIH1cbiAgICAgICAgLy8gICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWQtYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY2hhdC9zcmMvbGliL2NvcmUvZmlsZS11cGxvYWQtYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuLy8gaW1wb3J0IHsgVXNlciB9IGZyb20gJy4vdXNlcic7XG5pbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAnLi9tZXNzYWdlJztcblxuZXhwb3J0IGludGVyZmFjZSBJRmlsZVVwbG9hZEFkYXB0ZXJcbntcbiAgICB1cGxvYWRGaWxlKGZpbGU6IEZpbGUsIHBhcnRpY2lwYW50SWQ6IGFueSk6IE9ic2VydmFibGU8TWVzc2FnZT47XG59XG4iXX0=
@@ -0,0 +1,14 @@
1
+ import { Guid } from "./guid";
2
+ import { ChatParticipantStatus } from "./chat-participant-status.enum";
3
+ import { ChatParticipantType } from "./chat-participant-type.enum";
4
+ export class Group {
5
+ constructor(participants) {
6
+ this.id = Guid.newGuid();
7
+ this.participantType = ChatParticipantType.Group;
8
+ this.chattingTo = participants;
9
+ this.status = ChatParticipantStatus.Online;
10
+ // TODO: Add some customization for this in future releases
11
+ this.displayName = participants.map((p) => p.displayName).sort((first, second) => second > first ? -1 : 1).join(", ");
12
+ }
13
+ }
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NoYXQvc3JjL2xpYi9jb3JlL2dyb3VwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFOUIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFdkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFbkUsTUFBTSxPQUFPLEtBQUs7SUFFZCxZQUFZLFlBQW9CO1FBU3pCLE9BQUUsR0FBVyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFHbkIsb0JBQWUsR0FBd0IsbUJBQW1CLENBQUMsS0FBSyxDQUFDO1FBVjdFLElBQUksQ0FBQyxVQUFVLEdBQUcsWUFBWSxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcscUJBQXFCLENBQUMsTUFBTSxDQUFDO1FBRTNDLDJEQUEyRDtRQUMzRCxJQUFJLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFILENBQUM7Q0FVSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEd1aWQgfSBmcm9tIFwiLi9ndWlkXCI7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSBcIi4vdXNlclwiO1xuaW1wb3J0IHsgQ2hhdFBhcnRpY2lwYW50U3RhdHVzIH0gZnJvbSBcIi4vY2hhdC1wYXJ0aWNpcGFudC1zdGF0dXMuZW51bVwiO1xuaW1wb3J0IHsgSUNoYXRQYXJ0aWNpcGFudCB9IGZyb20gXCIuL2NoYXQtcGFydGljaXBhbnRcIjtcbmltcG9ydCB7IENoYXRQYXJ0aWNpcGFudFR5cGUgfSBmcm9tIFwiLi9jaGF0LXBhcnRpY2lwYW50LXR5cGUuZW51bVwiO1xuXG5leHBvcnQgY2xhc3MgR3JvdXAgaW1wbGVtZW50cyBJQ2hhdFBhcnRpY2lwYW50XG57XG4gICAgY29uc3RydWN0b3IocGFydGljaXBhbnRzOiBVc2VyW10pXG4gICAge1xuICAgICAgICB0aGlzLmNoYXR0aW5nVG8gPSBwYXJ0aWNpcGFudHM7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gQ2hhdFBhcnRpY2lwYW50U3RhdHVzLk9ubGluZTtcblxuICAgICAgICAvLyBUT0RPOiBBZGQgc29tZSBjdXN0b21pemF0aW9uIGZvciB0aGlzIGluIGZ1dHVyZSByZWxlYXNlc1xuICAgICAgICB0aGlzLmRpc3BsYXlOYW1lID0gcGFydGljaXBhbnRzLm1hcCgocCkgPT4gcC5kaXNwbGF5TmFtZSkuc29ydCgoZmlyc3QsIHNlY29uZCkgPT4gc2Vjb25kID4gZmlyc3QgPyAtMSA6IDEpLmpvaW4oXCIsIFwiKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaWQ6IHN0cmluZyA9IEd1aWQubmV3R3VpZCgpO1xuICAgIHB1YmxpYyBjaGF0dGluZ1RvOiBVc2VyW107XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgcGFydGljaXBhbnRUeXBlOiBDaGF0UGFydGljaXBhbnRUeXBlID0gQ2hhdFBhcnRpY2lwYW50VHlwZS5Hcm91cDtcblxuICAgIHB1YmxpYyBzdGF0dXM6IENoYXRQYXJ0aWNpcGFudFN0YXR1cztcbiAgICBwdWJsaWMgYXZhdGFyOiBzdHJpbmcgfCBudWxsO1xuICAgIHB1YmxpYyBkaXNwbGF5TmFtZTogc3RyaW5nO1xufVxuIl19
@@ -0,0 +1,11 @@
1
+ // Poached from: https://github.com/Steve-Fenton/TypeScriptUtilities
2
+ // @dynamic
3
+ export class Guid {
4
+ static newGuid() {
5
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
6
+ var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
7
+ return v.toString(16);
8
+ });
9
+ }
10
+ }
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY2hhdC9zcmMvbGliL2NvcmUvZ3VpZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxvRUFBb0U7QUFDcEUsV0FBVztBQUNYLE1BQU0sT0FBTyxJQUFJO0lBQ2IsTUFBTSxDQUFDLE9BQU87UUFDVixPQUFPLHNDQUFzQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsVUFBUyxDQUFDO1lBQ3JFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBQyxFQUFFLEdBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFDLEdBQUcsR0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzRCxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBQb2FjaGVkIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9TdGV2ZS1GZW50b24vVHlwZVNjcmlwdFV0aWxpdGllc1xuLy8gQGR5bmFtaWNcbmV4cG9ydCBjbGFzcyBHdWlkIHtcbiAgICBzdGF0aWMgbmV3R3VpZCgpIHtcbiAgICAgICAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24oYykge1xuICAgICAgICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpKjE2fDAsIHYgPSBjID09ICd4JyA/IHIgOiAociYweDN8MHg4KTtcbiAgICAgICAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxpemF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jaGF0L3NyYy9saWIvY29yZS9sb2NhbGl6YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgTG9jYWxpemF0aW9uXG57XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBtZXNzYWdlUGxhY2Vob2xkZXI6IHN0cmluZztcbiAgICBzZWFyY2hQbGFjZWhvbGRlcjogc3RyaW5nO1xuICAgIHN0YXR1c0Rlc2NyaXB0aW9uOiBTdGF0dXNEZXNjcmlwdGlvbjtcbiAgICBicm93c2VyTm90aWZpY2F0aW9uVGl0bGU6IHN0cmluZztcbiAgICBsb2FkTWVzc2FnZUhpc3RvcnlQbGFjZWhvbGRlcjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXR1c0Rlc2NyaXB0aW9uXG57XG4gICAgb25saW5lOiBzdHJpbmc7XG4gICAgYnVzeTogc3RyaW5nO1xuICAgIGF3YXk6IHN0cmluZztcbiAgICBvZmZsaW5lOiBzdHJpbmc7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xufVxuIl19
@@ -0,0 +1,25 @@
1
+ export class MessageCounter {
2
+ static formatUnreadMessagesTotal(totalUnreadMessages) {
3
+ if (totalUnreadMessages > 0) {
4
+ if (totalUnreadMessages > 99)
5
+ return "99+";
6
+ else
7
+ return String(totalUnreadMessages);
8
+ }
9
+ // Empty fallback.
10
+ return "";
11
+ }
12
+ /**
13
+ * Returns a formatted string containing the total unread messages of a chat window.
14
+ * @param window The window instance to count the unread total messages.
15
+ * @param currentUserId The current chat instance user id. In this context it would be the sender.
16
+ */
17
+ static unreadMessagesTotal(window, currentUserId) {
18
+ let totalUnreadMessages = 0;
19
+ if (window) {
20
+ totalUnreadMessages = window.messages.filter(x => x.fromId != currentUserId && !x.dateSeen).length;
21
+ }
22
+ return MessageCounter.formatUnreadMessagesTotal(totalUnreadMessages);
23
+ }
24
+ }
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1jb3VudGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jaGF0L3NyYy9saWIvY29yZS9tZXNzYWdlLWNvdW50ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxPQUFPLGNBQWM7SUFFaEIsTUFBTSxDQUFDLHlCQUF5QixDQUFDLG1CQUEyQjtRQUUvRCxJQUFJLG1CQUFtQixHQUFHLENBQUMsRUFBQyxDQUFDO1lBRXpCLElBQUksbUJBQW1CLEdBQUcsRUFBRTtnQkFDeEIsT0FBUSxLQUFLLENBQUM7O2dCQUVkLE9BQU8sTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUVELGtCQUFrQjtRQUNsQixPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLG1CQUFtQixDQUFDLE1BQWMsRUFBRSxhQUFrQjtRQUVoRSxJQUFJLG1CQUFtQixHQUFHLENBQUMsQ0FBQztRQUU1QixJQUFJLE1BQU0sRUFBQyxDQUFDO1lBQ1IsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLGFBQWEsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDdkcsQ0FBQztRQUVELE9BQU8sY0FBYyxDQUFDLHlCQUF5QixDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDekUsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV2luZG93IH0gZnJvbSAnLi93aW5kb3cnO1xuXG5leHBvcnQgY2xhc3MgTWVzc2FnZUNvdW50ZXJcbntcbiAgICBwdWJsaWMgc3RhdGljIGZvcm1hdFVucmVhZE1lc3NhZ2VzVG90YWwodG90YWxVbnJlYWRNZXNzYWdlczogbnVtYmVyKTogc3RyaW5nXG4gICAge1xuICAgICAgICBpZiAodG90YWxVbnJlYWRNZXNzYWdlcyA+IDApe1xuXG4gICAgICAgICAgICBpZiAodG90YWxVbnJlYWRNZXNzYWdlcyA+IDk5KVxuICAgICAgICAgICAgICAgIHJldHVybiAgXCI5OStcIjtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHRvdGFsVW5yZWFkTWVzc2FnZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1wdHkgZmFsbGJhY2suXG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBmb3JtYXR0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHRvdGFsIHVucmVhZCBtZXNzYWdlcyBvZiBhIGNoYXQgd2luZG93LlxuICAgICAqIEBwYXJhbSB3aW5kb3cgVGhlIHdpbmRvdyBpbnN0YW5jZSB0byBjb3VudCB0aGUgdW5yZWFkIHRvdGFsIG1lc3NhZ2VzLlxuICAgICAqIEBwYXJhbSBjdXJyZW50VXNlcklkIFRoZSBjdXJyZW50IGNoYXQgaW5zdGFuY2UgdXNlciBpZC4gSW4gdGhpcyBjb250ZXh0IGl0IHdvdWxkIGJlIHRoZSBzZW5kZXIuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyB1bnJlYWRNZXNzYWdlc1RvdGFsKHdpbmRvdzogV2luZG93LCBjdXJyZW50VXNlcklkOiBhbnkpOiBzdHJpbmdcbiAgICB7XG4gICAgICAgIGxldCB0b3RhbFVucmVhZE1lc3NhZ2VzID0gMDtcblxuICAgICAgICBpZiAod2luZG93KXtcbiAgICAgICAgICAgIHRvdGFsVW5yZWFkTWVzc2FnZXMgPSB3aW5kb3cubWVzc2FnZXMuZmlsdGVyKHggPT4geC5mcm9tSWQgIT0gY3VycmVudFVzZXJJZCAmJiAheC5kYXRlU2VlbikubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgcmV0dXJuIE1lc3NhZ2VDb3VudGVyLmZvcm1hdFVucmVhZE1lc3NhZ2VzVG90YWwodG90YWxVbnJlYWRNZXNzYWdlcyk7XG4gICAgfVxufVxuIl19