tnx-shared 5.1.26 → 5.1.30

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 (120) hide show
  1. package/bundles/tnx-shared.umd.js +1999 -249
  2. package/bundles/tnx-shared.umd.js.map +1 -1
  3. package/bundles/tnx-shared.umd.min.js +1 -1
  4. package/bundles/tnx-shared.umd.min.js.map +1 -1
  5. package/classes/base/data-list-base.d.ts +2 -0
  6. package/classes/base/data-list-base.d.ts.map +1 -1
  7. package/classes/form-schema.d.ts +3 -0
  8. package/classes/form-schema.d.ts.map +1 -1
  9. package/components/chat/chat-box/chat-box.component.d.ts +102 -0
  10. package/components/chat/chat-box/chat-box.component.d.ts.map +1 -0
  11. package/components/chat/chat-box/chat-box.component.ngfactory.d.ts.map +1 -0
  12. package/components/chat/chat-box/chat-box.component.scss.shim.ngstyle.d.ts.map +1 -0
  13. package/components/chat/chat-send-message-box/chat-send-message-box.component.d.ts +37 -0
  14. package/components/chat/chat-send-message-box/chat-send-message-box.component.d.ts.map +1 -0
  15. package/components/chat/chat-send-message-box/chat-send-message-box.component.ngfactory.d.ts.map +1 -0
  16. package/components/chat/chat-send-message-box/chat-send-message-box.component.scss.shim.ngstyle.d.ts.map +1 -0
  17. package/components/chat/common-style.scss.shim.ngstyle.d.ts.map +1 -0
  18. package/components/chat/models/enums.d.ts +11 -0
  19. package/components/chat/models/enums.d.ts.map +1 -0
  20. package/components/chat/models/models.d.ts +10 -0
  21. package/components/chat/models/models.d.ts.map +1 -0
  22. package/components/chat/services/chat.service.d.ts +34 -0
  23. package/components/chat/services/chat.service.d.ts.map +1 -0
  24. package/components/chat/services/chat.service.ngfactory.d.ts.map +1 -0
  25. package/components/chat/services/content.service.d.ts +20 -0
  26. package/components/chat/services/content.service.d.ts.map +1 -0
  27. package/components/chat/services/content.service.ngfactory.d.ts.map +1 -0
  28. package/components/chat/services/message-board.service.d.ts +15 -0
  29. package/components/chat/services/message-board.service.d.ts.map +1 -0
  30. package/components/chat/services/message-board.service.ngfactory.d.ts.map +1 -0
  31. package/components/chat/services/status.service.d.ts +14 -0
  32. package/components/chat/services/status.service.d.ts.map +1 -0
  33. package/components/chat/services/status.service.ngfactory.d.ts.map +1 -0
  34. package/components/crud/crud-list/crud-list.component.d.ts +6 -0
  35. package/components/crud/crud-list/crud-list.component.d.ts.map +1 -1
  36. package/components/file-explorer/file-manager/file-manager.component.d.ts +6 -0
  37. package/components/file-explorer/file-manager/file-manager.component.d.ts.map +1 -1
  38. package/components/file-explorer/models/service-request-model.d.ts +1 -0
  39. package/components/file-explorer/models/service-request-model.d.ts.map +1 -1
  40. package/components/statemachines/models/enums.d.ts +4 -0
  41. package/components/statemachines/models/enums.d.ts.map +1 -1
  42. package/components/statemachines/statemachines-designer/statemachines-designer.component.d.ts +1 -1
  43. package/components/statemachines/statemachines-designer/statemachines-designer.component.d.ts.map +1 -1
  44. package/components/tn-custom-scrollbar/tn-custom-scrollbar.component.d.ts +1 -0
  45. package/components/tn-custom-scrollbar/tn-custom-scrollbar.component.d.ts.map +1 -1
  46. package/components/tn-dialog/tn-dialog.component.d.ts +1 -0
  47. package/components/tn-dialog/tn-dialog.component.d.ts.map +1 -1
  48. package/components/user-picker/user-picker-dialog/user-picker-dialog.component.d.ts +23 -0
  49. package/components/user-picker/user-picker-dialog/user-picker-dialog.component.d.ts.map +1 -0
  50. package/components/user-picker/user-picker-dialog/user-picker-dialog.component.ngfactory.d.ts.map +1 -0
  51. package/components/user-picker/user-picker-dialog/user-picker-dialog.component.scss.shim.ngstyle.d.ts.map +1 -0
  52. package/components/workflow/permission-sharing/permission-sharing.component.d.ts +21 -0
  53. package/components/workflow/permission-sharing/permission-sharing.component.d.ts.map +1 -0
  54. package/components/workflow/permission-sharing/permission-sharing.component.ngfactory.d.ts.map +1 -0
  55. package/components/workflow/permission-sharing/permission-sharing.component.scss.shim.ngstyle.d.ts.map +1 -0
  56. package/components/workflow/services/workflow-permission.service.d.ts +10 -0
  57. package/components/workflow/services/workflow-permission.service.d.ts.map +1 -0
  58. package/components/workflow/services/workflow-permission.service.ngfactory.d.ts.map +1 -0
  59. package/components/workflow/workflow-history-new/workflow-history-new.component.d.ts.map +1 -1
  60. package/congviec/congviec/congviec-dinhkem/congviec-dinhkem.component.d.ts +6 -2
  61. package/congviec/congviec/congviec-dinhkem/congviec-dinhkem.component.d.ts.map +1 -1
  62. package/congviec/congviec/congviec-form/congviec-form.component.d.ts +9 -1
  63. package/congviec/congviec/congviec-form/congviec-form.component.d.ts.map +1 -1
  64. package/esm2015/classes/base/data-form-base.js +3 -3
  65. package/esm2015/classes/base/data-list-base.js +41 -6
  66. package/esm2015/classes/form-schema.js +1 -1
  67. package/esm2015/components/chat/chat-box/chat-box.component.js +626 -0
  68. package/esm2015/components/chat/chat-send-message-box/chat-send-message-box.component.js +245 -0
  69. package/esm2015/components/chat/models/enums.js +13 -0
  70. package/esm2015/components/chat/models/models.js +12 -0
  71. package/esm2015/components/chat/services/chat.service.js +113 -0
  72. package/esm2015/components/chat/services/content.service.js +57 -0
  73. package/esm2015/components/chat/services/message-board.service.js +40 -0
  74. package/esm2015/components/chat/services/status.service.js +36 -0
  75. package/esm2015/components/crud/crud-list/crud-list.component.js +55 -4
  76. package/esm2015/components/file-explorer/file-manager/file-manager.component.js +69 -16
  77. package/esm2015/components/file-explorer/file-viewer/file-viewer.component.js +2 -2
  78. package/esm2015/components/file-explorer/models/service-request-model.js +5 -2
  79. package/esm2015/components/statemachines/models/enums.js +6 -1
  80. package/esm2015/components/tn-custom-scrollbar/tn-custom-scrollbar.component.js +26 -11
  81. package/esm2015/components/tn-dialog/tn-dialog.component.js +4 -2
  82. package/esm2015/components/user-picker/user-picker-dialog/user-picker-dialog.component.js +52 -0
  83. package/esm2015/components/workflow/permission-sharing/permission-sharing.component.js +123 -0
  84. package/esm2015/components/workflow/services/workflow-permission.service.js +27 -0
  85. package/esm2015/components/workflow/workflow-history-new/workflow-history-new.component.js +4 -1
  86. package/esm2015/congviec/cauhinh-workflow/cauhinh-workflow-detail/cauhinh-workflow-detail.component.js +2 -2
  87. package/esm2015/congviec/congviec/congviec-dinhkem/congviec-dinhkem.component.js +38 -14
  88. package/esm2015/congviec/congviec/congviec-form/congviec-form.component.js +25 -4
  89. package/esm2015/congviec/congviec/congviec.component.js +3 -3
  90. package/esm2015/models/basic-user-info.js +6 -1
  91. package/esm2015/public-api.js +4 -1
  92. package/esm2015/services/base.service.js +33 -9
  93. package/esm2015/services/common.service.js +3 -18
  94. package/esm2015/services/crud.service.js +56 -41
  95. package/esm2015/services/notifier.service.js +2 -2
  96. package/esm2015/services/user.service.js +37 -23
  97. package/esm2015/tnx-shared.js +49 -43
  98. package/esm2015/tnx-shared.module.js +10 -2
  99. package/fesm2015/tnx-shared.js +1705 -202
  100. package/fesm2015/tnx-shared.js.map +1 -1
  101. package/models/basic-user-info.d.ts +2 -3
  102. package/models/basic-user-info.d.ts.map +1 -1
  103. package/package.json +2 -2
  104. package/public-api.d.ts +3 -0
  105. package/public-api.d.ts.map +1 -1
  106. package/services/base.service.d.ts +5 -1
  107. package/services/base.service.d.ts.map +1 -1
  108. package/services/common.service.d.ts +3 -3
  109. package/services/common.service.d.ts.map +1 -1
  110. package/services/crud.service.d.ts.map +1 -1
  111. package/services/notifier.service.d.ts +1 -1
  112. package/services/notifier.service.d.ts.map +1 -1
  113. package/services/user.service.d.ts +14 -2
  114. package/services/user.service.d.ts.map +1 -1
  115. package/tnx-shared.d.ts +48 -42
  116. package/tnx-shared.d.ts.map +1 -1
  117. package/tnx-shared.metadata.json +1 -1
  118. package/tnx-shared.module.d.ts +5 -1
  119. package/tnx-shared.module.d.ts.map +1 -1
  120. package/tnx-shared.module.ngfactory.d.ts.map +1 -1
@@ -0,0 +1,626 @@
1
+ import { __awaiter } from "tslib";
2
+ import { Component, ElementRef, Injector, Input, ViewChild } from '@angular/core';
3
+ import * as moment_ from 'moment';
4
+ import { FileUpload } from 'tn-custom-primeng/fileupload';
5
+ import { ComponentBase } from '../../../classes/base/component-base';
6
+ import { CrudService } from '../../../services/crud.service';
7
+ import { NotifierService } from '../../../services/notifier.service';
8
+ import { SignalRService } from '../../../services/signalr.service';
9
+ import { UserService } from '../../../services/user.service';
10
+ import { GenerateLinkDownloadDTO } from '../../file-explorer/models/generate-link-download-dto';
11
+ import { FileExplorerService } from '../../file-explorer/services/file-explorer.service';
12
+ import { ChatService } from '../services/chat.service';
13
+ import { MessageBoardService } from '../services/message-board.service';
14
+ import { ComponentContextService } from '../../../app-context/component-context.service';
15
+ import { ComCtxConstants } from '../../../configs/component-context.constant';
16
+ import { CheckControlVisibleService } from '../../../services/check-control-visible.service';
17
+ import { ModuleConfigService } from '../../../services/module-config.service';
18
+ import { PopupSize, UserPickerControlSchema } from '../../../classes/form-schema';
19
+ import { MessageType, NEW_MESSAGE, NotificationType, PINNED_CHANGED } from '../models/enums';
20
+ // fix for build prod
21
+ const moment = moment_;
22
+ export class ChatBoxComponent extends ComponentBase {
23
+ constructor(injector, _chatService, _messageBoardService, _userService, _checkControlVisible, _signalrService, _fileService, _crudService, _notifierService, _moduleConfigService) {
24
+ super(injector);
25
+ this._chatService = _chatService;
26
+ this._messageBoardService = _messageBoardService;
27
+ this._userService = _userService;
28
+ this._checkControlVisible = _checkControlVisible;
29
+ this._signalrService = _signalrService;
30
+ this._fileService = _fileService;
31
+ this._crudService = _crudService;
32
+ this._notifierService = _notifierService;
33
+ this._moduleConfigService = _moduleConfigService;
34
+ this.showSendMessageBox = true;
35
+ this.userPickerForm = {
36
+ selectedValue: [],
37
+ data: null,
38
+ };
39
+ this.topic = '';
40
+ this.firstTime = true;
41
+ this.multiple = true;
42
+ this.showAddNoteForm = false;
43
+ this.fileApi = '';
44
+ this.peopleAll = [];
45
+ this.correlationIds = [];
46
+ this.attachments = [];
47
+ this.image = '';
48
+ this.peopleAllUsers = [];
49
+ this.peopleRelatedUsers = [];
50
+ this.editFormModel = {};
51
+ this._moduleConfig = this._moduleConfigService.getConfig();
52
+ this.environment = this._moduleConfig.environment;
53
+ this.defaultAvatar = this.environment.appMetadata.main.defaultMaleAvatar;
54
+ this.fileApi = this.environment.apiDomain.fileEndpoint;
55
+ this.model.userPickerForm = { popupSize: PopupSize, data: {} };
56
+ this.model.quickNoteForm = { popupSize: {}, data: {} };
57
+ this.context.subscribe('QUICK_NOTE_POPUP.CLOSE_POPUP', response => {
58
+ this.model.editFormModel.showQuickNoteForm = false;
59
+ });
60
+ }
61
+ updateUsers(assignee, assigner, relatedUser) {
62
+ this.assignee = assignee;
63
+ this.assigner = assigner;
64
+ this.relatedUser = relatedUser;
65
+ let all = [];
66
+ all.push(assignee);
67
+ all.push(assigner);
68
+ if (this.relatedUser.length > 0) {
69
+ all = all.concat(relatedUser);
70
+ }
71
+ this.peopleAll = all.filter((x, i, a) => a.indexOf(x) == i);
72
+ }
73
+ ngOnInit() {
74
+ this.initClassVar();
75
+ this.getMessages(null);
76
+ this._chatService.getChatIdByTask(this.serviceRequestModel, this.taskId).then(rs => {
77
+ if (!rs.success)
78
+ this._notifierService.showWarning(rs.message);
79
+ if (!rs.data)
80
+ return;
81
+ this.model.id = rs.data;
82
+ this.rootContext.fireEvent(ComCtxConstants.ROOT.CHAT_INSTANCE_ID_LOADED, this.model.id);
83
+ this.topic = `chat.${this.model.id}`;
84
+ this._signalrService.start(null, this.topic, data => this.handleChanges(data));
85
+ // get pinned message
86
+ if (this.model.id) {
87
+ this._messageBoardService.getLatestPinnedMessage(this.model.id).then(rs => {
88
+ if (rs.data) {
89
+ this.model.pinnedMessage = rs.data.content;
90
+ }
91
+ });
92
+ }
93
+ });
94
+ this.rootContext.subscribe(ComCtxConstants.ROOT.CHAT_MESSAGE_SENDING, (data) => __awaiter(this, void 0, void 0, function* () {
95
+ this.model.correlationIds.push(data.message.correlationId);
96
+ if (data.attachments && data.attachments.length > 0) {
97
+ data.attachments = data.attachments.map(x => {
98
+ x.url = null;
99
+ return x;
100
+ });
101
+ }
102
+ const temp = yield this.appendMessage(data.message.messageContent, 'own', 'sending', this.currentUser.userName, data.attachments, data.message.correlationId, false);
103
+ console.log(temp);
104
+ }));
105
+ this.rootContext.subscribe(ComCtxConstants.ROOT.CHAT_MESSAGE_SENT, data => {
106
+ });
107
+ this.rootContext.subscribe(ComCtxConstants.ROOT.CHAT_LOAD_MORE, data => {
108
+ // this.getMessages(this.model.createdFrom);
109
+ });
110
+ this.rootContext.subscribe(ComCtxConstants.ROOT.CHAT_SCROLLING, scrolling => {
111
+ if (scrolling) {
112
+ this.model.scrolling = true;
113
+ }
114
+ else {
115
+ this.model.scrolling = false;
116
+ this.model.newMessageNotUpdatedCount = 0;
117
+ }
118
+ });
119
+ this.rootContext.subscribe(ComCtxConstants.ROOT.CHAT_HAS_NEW_MESSAGE_NOT_UPDATED, count => {
120
+ this.model.scrolling = count !== 0;
121
+ this.model.newMessageNotUpdatedCount = count;
122
+ });
123
+ this.context.subscribe('CLOSE_POPUP', rs => {
124
+ this.model.userPickerForm.show = false;
125
+ this.parentContext.fireEvent('TASK.RELATED_USER_CHANGED', rs);
126
+ });
127
+ this.parentContext.subscribe('TASK.DATA_CHANGED', rs => {
128
+ this.updateUsers(rs.assignee, rs.assigner, rs.relatedUser);
129
+ });
130
+ }
131
+ handleChanges(data) {
132
+ return __awaiter(this, void 0, void 0, function* () {
133
+ const newMessage = JSON.parse(data);
134
+ if (!newMessage || !newMessage.data) {
135
+ this._notifierService.showWarning('SYS_ERR_DEV: Lỗi SignalR');
136
+ return;
137
+ }
138
+ switch (newMessage.notificationType) {
139
+ case NotificationType.NewMessage:
140
+ case NEW_MESSAGE: {
141
+ yield this.handleNewMessageNotification(newMessage.data);
142
+ break;
143
+ }
144
+ case NotificationType.PinnedChanged:
145
+ case PINNED_CHANGED: {
146
+ const ind = this.model.correlationIds.findIndex(x => x == newMessage.correlationId);
147
+ if (ind > -1) {
148
+ this.model.correlationIds.splice(ind, 1);
149
+ }
150
+ else {
151
+ yield this.handlePinnedChangeNotification(newMessage.data);
152
+ }
153
+ break;
154
+ }
155
+ }
156
+ });
157
+ }
158
+ initClassVar() {
159
+ this.fileViewerModel = {
160
+ data: {},
161
+ showEditForm: false,
162
+ };
163
+ this.userPickerControl = new UserPickerControlSchema({
164
+ field: 'id',
165
+ label: '',
166
+ fullLabel: '',
167
+ multiple: true,
168
+ hiddenCheck: () => this.userPickerForm.show,
169
+ });
170
+ this.serviceRequestModel = {
171
+ service: this.serviceCode,
172
+ serviceCode: this.serviceCode,
173
+ entity: this.entity,
174
+ entityKey: 'id',
175
+ entityInstanceId: this.taskId
176
+ };
177
+ this.model.dataSource = [];
178
+ this.model.correlationIds = [];
179
+ this.model.attachments = [];
180
+ this.model.maxFileSize = 3000000;
181
+ this.model.img = {};
182
+ this.currentUser = this._userService.getCurrentUser();
183
+ this.peopleAllUsers = [];
184
+ this.peopleRelatedUsers = [];
185
+ this.model.editFormModel = [];
186
+ if (this.users) {
187
+ this.model.taskName = this.users.taskName;
188
+ this.updateUsers(this.users.assignee, this.users.assigner, this.users.relatedUsers);
189
+ this.getRelatedUserInfo();
190
+ }
191
+ }
192
+ getRelatedUserInfo() {
193
+ return __awaiter(this, void 0, void 0, function* () {
194
+ const peopleRelatedUsers = yield this._userService.getBasicUsersInfo(this.relatedUser.join());
195
+ if (peopleRelatedUsers == null || peopleRelatedUsers.length == 0) {
196
+ return;
197
+ }
198
+ for (const item of peopleRelatedUsers) {
199
+ this.peopleRelatedUsers.push({
200
+ title: item.fullName,
201
+ label: item.fullName,
202
+ value: item.id
203
+ });
204
+ }
205
+ });
206
+ }
207
+ handlePinnedChangeNotification(data) {
208
+ return __awaiter(this, void 0, void 0, function* () {
209
+ if (data.pinned) {
210
+ this.model.pinnedMessage = data.message;
211
+ }
212
+ else {
213
+ this.model.pinnedMessage = null;
214
+ }
215
+ });
216
+ }
217
+ handleNewMessageNotification(newMessage) {
218
+ return __awaiter(this, void 0, void 0, function* () {
219
+ const ind = this.model.correlationIds.findIndex(x => x == newMessage.correlationId);
220
+ if (newMessage.messageType == MessageType.FILE) {
221
+ newMessage.attachments = yield this._chatService.getListAttachment(newMessage.id);
222
+ }
223
+ if (ind === -1) {
224
+ yield this.appendMessage(newMessage.content, this.getTypeOfMessage(newMessage.createdBy), 'received', newMessage.createdBy, newMessage.attachments, '', true);
225
+ }
226
+ else {
227
+ this.updateMessage(newMessage.correlationId, newMessage);
228
+ this.model.correlationIds.splice(ind, 1);
229
+ }
230
+ });
231
+ }
232
+ getMessages(createdFrom) {
233
+ this._chatService.getContentByTaskId(this.serviceRequestModel, this.taskId).then((rs) => __awaiter(this, void 0, void 0, function* () {
234
+ const currentUserName = this.currentUser.userName;
235
+ let nearByCreated = '';
236
+ let index = 0;
237
+ let userNames = '';
238
+ if (!rs.success) {
239
+ return this._notifierService.showWarning(rs.message);
240
+ }
241
+ for (const item of rs.data) {
242
+ if (item.createdBy && item.createdBy != '')
243
+ userNames += `${index == 0 ? '' : ','}${item.createdBy}`;
244
+ if (index === 0)
245
+ this.model.createdFrom = item.created;
246
+ item.type = item.createdBy === currentUserName ? 'own' : 'from';
247
+ if (item.messageType === MessageType.FILE) {
248
+ item.attachments = yield this._chatService.getListAttachment(item.id);
249
+ }
250
+ item.isLastMessageFlow = false;
251
+ if (item.createdBy !== nearByCreated) {
252
+ if (+item > -0) {
253
+ rs.data[+item - 1].isLastMessageFlow = true;
254
+ }
255
+ nearByCreated = item.createdBy;
256
+ item.isFirstMessageFlow = true;
257
+ }
258
+ else {
259
+ item.isFirstMessageFlow = false;
260
+ }
261
+ if (+index === rs.data.length - 1)
262
+ item.isLastMessageFlow = true;
263
+ index++;
264
+ }
265
+ if (createdFrom) {
266
+ this.model.dataSource = [...rs.data, ...this.model.dataSource];
267
+ }
268
+ else {
269
+ this.model.dataSource = rs.data;
270
+ }
271
+ if (userNames != '') {
272
+ const userInfos = yield this._userService.getBasicUsersInfoByUserNames(userNames);
273
+ if (userInfos != null) {
274
+ for (const item of this.model.dataSource) {
275
+ const user = userInfos.find(x => x.userName == item.createdBy);
276
+ if (!user) {
277
+ continue;
278
+ }
279
+ item.avatar = user.avatar;
280
+ item.fullName = user.fullName;
281
+ }
282
+ }
283
+ }
284
+ this.rootContext.fireEvent(ComCtxConstants.ROOT.CHAT_DATA_LOADED, true);
285
+ }));
286
+ }
287
+ scrollToBottom(speed = 0, force = false, sent) {
288
+ if (!this.model.scrolling) {
289
+ this.rootContext.fireEvent(ComCtxConstants.ROOT.CHAT_HAS_NEW_MESSAGE, { speed, force: true });
290
+ }
291
+ else if (sent !== false) {
292
+ this.rootContext.fireEvent(ComCtxConstants.ROOT.CHAT_HAS_NEW_MESSAGE, { speed, force });
293
+ }
294
+ }
295
+ appendMessage(message, type, status, createdBy, attachments = [], correlationId = '', sent) {
296
+ var _a, _b;
297
+ return __awaiter(this, void 0, void 0, function* () {
298
+ let fullName = '';
299
+ let avatar = '';
300
+ const user = yield this._userService.getBasicUserInfoByUserName(createdBy);
301
+ fullName = (_a = user.fullName) !== null && _a !== void 0 ? _a : '';
302
+ avatar = (_b = user.avatar) !== null && _b !== void 0 ? _b : '';
303
+ if (attachments && attachments.length > 0) {
304
+ const clonedAttachment = JSON.parse(JSON.stringify(attachments));
305
+ this.model.dataSource.push({
306
+ created: new Date(),
307
+ createdBy: createdBy,
308
+ fullName: fullName,
309
+ status: status,
310
+ type: type,
311
+ avatar: avatar,
312
+ attachments: clonedAttachment,
313
+ correlationId: correlationId,
314
+ isFirstMessageFlow: false,
315
+ isLastMessageFlow: false,
316
+ sent: sent
317
+ });
318
+ this.updateFirstOrLastMessage();
319
+ }
320
+ if (message && message.trim() != '') {
321
+ this.model.dataSource.push({
322
+ created: new Date(),
323
+ createdBy: createdBy,
324
+ fullName: fullName,
325
+ content: message,
326
+ status: status,
327
+ type: type,
328
+ avatar: avatar,
329
+ correlationId: correlationId,
330
+ isFirstMessageFlow: false,
331
+ isLastMessageFlow: false,
332
+ sent: sent
333
+ });
334
+ this.updateFirstOrLastMessage();
335
+ }
336
+ return this.model.dataSource;
337
+ });
338
+ }
339
+ updateFirstOrLastMessage() {
340
+ if (this.model.dataSource.length > 0) {
341
+ const length = this.model.dataSource.length;
342
+ if (length === 1) {
343
+ this.model.dataSource[0].isFirstMessageFlow = true;
344
+ }
345
+ else {
346
+ const createdBy = this.model.dataSource[length - 2].createdBy;
347
+ const createdBy2 = this.model.dataSource[length - 1].createdBy;
348
+ if (createdBy !== createdBy2) {
349
+ this.model.dataSource[length - 2].isLastMessageFlow = true;
350
+ this.model.dataSource[length - 1].isFirstMessageFlow = true;
351
+ }
352
+ else {
353
+ this.model.dataSource[length - 2].isLastMessageFlow = false;
354
+ this.model.dataSource[length - 1].isLastMessageFlow = true;
355
+ }
356
+ }
357
+ }
358
+ }
359
+ updateMessage(correlationId, message) {
360
+ const item = this.model.dataSource.find(x => x.correlationId === correlationId);
361
+ if (item) {
362
+ if (message.attachments && message.attachments.length > 0) {
363
+ item.attachments = message.attachments;
364
+ }
365
+ item.id = message.id;
366
+ item.sent = true;
367
+ }
368
+ }
369
+ updateMessageStatus(message, status, errorMessage = '') {
370
+ const item = this.model.dataSource.find(x => x.message === message);
371
+ item.status = status;
372
+ item.errorMessage = errorMessage;
373
+ }
374
+ getDisplayStatus(status) {
375
+ switch (status) {
376
+ case 'sending':
377
+ return 'Đang gửi';
378
+ case 'sent':
379
+ return 'Đã gửi';
380
+ default:
381
+ return '';
382
+ }
383
+ }
384
+ ngOnDestroy() {
385
+ // unscrible signalr
386
+ this._signalrService.unSubscribeViewCode(null, this.topic);
387
+ this.rootContext.unSubscribe(ComCtxConstants.ROOT.CHAT_MESSAGE_SENDING);
388
+ this.rootContext.unSubscribe(ComCtxConstants.ROOT.CHAT_MESSAGE_SENT);
389
+ this.rootContext.unSubscribe(ComCtxConstants.ROOT.CHAT_LOAD_MORE);
390
+ this.rootContext.unSubscribe(ComCtxConstants.ROOT.CHAT_SCROLLING);
391
+ this.rootContext.unSubscribe(ComCtxConstants.ROOT.CHAT_HAS_NEW_MESSAGE_NOT_UPDATED);
392
+ super.ngOnDestroy();
393
+ }
394
+ getTypeOfMessage(createdBy) {
395
+ return createdBy === this.currentUser.userName ? 'own' : 'from';
396
+ }
397
+ trackByFunc(index, item) {
398
+ return item.id;
399
+ }
400
+ trackAttachmentByFunc(index, item) {
401
+ return item.fileName;
402
+ }
403
+ handlePaste(event) {
404
+ const objectData = this.getImageClipboardData(event);
405
+ if (objectData) {
406
+ this.model.attachments.push({
407
+ type: 'image',
408
+ url: objectData.url,
409
+ data: objectData.blob,
410
+ fileName: this._commonService.guid() + '.png'
411
+ });
412
+ }
413
+ }
414
+ getImageClipboardData(e) {
415
+ for (let i = 0; i < e.clipboardData.items.length; i++) {
416
+ const item = e.clipboardData.items[i];
417
+ if (item.type.indexOf('image') != -1) {
418
+ const imageObj = item.getAsFile();
419
+ if (imageObj.size < this.model.maxFileSize) {
420
+ return { url: URL.createObjectURL(imageObj), blob: imageObj };
421
+ }
422
+ else {
423
+ return null;
424
+ }
425
+ }
426
+ }
427
+ return null;
428
+ }
429
+ viewOrDownloadFile(evt, attachmentItem) {
430
+ return __awaiter(this, void 0, void 0, function* () {
431
+ if (this._fileService.isSupportedViewOnline(attachmentItem.fileName)) {
432
+ // this.model.fileViewer.data = {};
433
+ // this.model.fileViewer.data.fileId = attachmentItem.id;
434
+ // this.model.fileViewer.data.fileName = attachmentItem.fileName;
435
+ // this.model.fileViewer.data.isFileVersion = false;
436
+ // this.model.fileViewer.show = true;
437
+ this.fileViewerModel = {
438
+ data: {
439
+ fileId: attachmentItem.id,
440
+ fileName: attachmentItem.fileName,
441
+ isFileVersion: false,
442
+ },
443
+ showEditForm: true,
444
+ };
445
+ }
446
+ else {
447
+ top.location.href = yield this.getDownloadLink(attachmentItem);
448
+ }
449
+ });
450
+ }
451
+ getDownloadLink(file) {
452
+ return new Promise((resolve, reject) => {
453
+ const model = new GenerateLinkDownloadDTO();
454
+ model.fileId = file.id;
455
+ model.isFileVersion = false;
456
+ this._fileService.generateLinkDownload(model)
457
+ .then(response => {
458
+ const downloadUrl = this._fileService.getAnonymousDownloadUrl(response.data);
459
+ resolve(downloadUrl);
460
+ }, error => {
461
+ throw new Error('Cannot get download link');
462
+ });
463
+ });
464
+ }
465
+ browseFileFromPersonal() {
466
+ }
467
+ browseFileFromComputer() {
468
+ this.fileElement.advancedFileInput.nativeElement.click();
469
+ }
470
+ onSelectFileFromComputer(evt) {
471
+ try {
472
+ if (evt.files && evt.files.length > 0) {
473
+ for (let index = 0; index < evt.files.length; index++) {
474
+ const fileName = evt.files[index].name;
475
+ const type = this._commonService.isImage(fileName) ? 'image' : 'file';
476
+ const attachmentItem = {
477
+ type: type,
478
+ data: evt.files[index], fileName: fileName
479
+ };
480
+ if (attachmentItem.type == 'image') {
481
+ attachmentItem.url = evt.files[index].objectURL.changingThisBreaksApplicationSecurity;
482
+ }
483
+ this.model.attachments.push(attachmentItem);
484
+ }
485
+ }
486
+ }
487
+ catch (e) {
488
+ console.error('error on process select file computer', e);
489
+ }
490
+ // this.fileElement.clear();
491
+ }
492
+ removeAttachment(item) {
493
+ const ind = this.model.attachments.findIndex(x => x.url === item.url);
494
+ this.model.attachments.splice(ind, 1);
495
+ }
496
+ hasAttachment(item) {
497
+ return item.attachments && item.attachments.length > 0;
498
+ }
499
+ loadImg(evt, parentIndex, index) {
500
+ this.model.img[`${parentIndex}${index}`] = true;
501
+ this.model.img[`${parentIndex}width${index}`] = (evt.target.width + 32) + 'px';
502
+ }
503
+ inTheSameTime(i, item, dataSource) {
504
+ if (i < dataSource.length - 1) {
505
+ const d1 = new Date(dataSource[i + 1].created);
506
+ const d2 = new Date(item.created);
507
+ const ms = d1.getTime() - d2.getTime();
508
+ return ms < 30000;
509
+ }
510
+ return false;
511
+ }
512
+ pinMessage(item) {
513
+ if (this.model.pinnedMessage) {
514
+ if (this.model.pinnedMessage.id != item.id) {
515
+ this._notifierService.showConfirm('Bạn có chắc chắn muốn ghim tin nhắn này? Tin nhắn đã ghim trước đó sẽ được bỏ ghim.').then(rs => {
516
+ if (!rs)
517
+ return;
518
+ this.doPin(item, item.id, true);
519
+ });
520
+ }
521
+ else {
522
+ this.doPin(item, item.id, false);
523
+ }
524
+ }
525
+ else {
526
+ this.doPin(item, item.id, true);
527
+ }
528
+ }
529
+ doPin(item, id, pinned) {
530
+ const correlationId = this._commonService.guid();
531
+ this.model.correlationIds.push(correlationId);
532
+ this._messageBoardService.pinMessage(id, pinned, correlationId).then(rs => {
533
+ if (pinned) {
534
+ this.model.pinnedMessage = item;
535
+ }
536
+ else {
537
+ this.model.pinnedMessage = null;
538
+ }
539
+ });
540
+ }
541
+ getCurrentUserAvatar(avatar) {
542
+ if (avatar != null) {
543
+ return `${this.fileApi}/file/public/${avatar}/Download`;
544
+ }
545
+ else {
546
+ return this.defaultAvatar;
547
+ }
548
+ }
549
+ addPeople() {
550
+ this.userPickerForm.selectedValue = this.peopleRelatedUsers;
551
+ this.userPickerForm.multiple = this.multiple;
552
+ this.userPickerForm.show = true;
553
+ }
554
+ quickNote(item) {
555
+ return __awaiter(this, void 0, void 0, function* () {
556
+ const userResult = yield this._userService.getBasicUserInfo(item.createdBy);
557
+ this.context.data.noteDataModel = {
558
+ editFormModel: {
559
+ showEditForm: true,
560
+ showQuickNoteForm: true,
561
+ popupSize: {},
562
+ data: {
563
+ name: item.content1,
564
+ content: '<b>' + userResult.fullName + '</b>' + ' đã chat tại công việc '
565
+ + '<b>' + this.model.taskName + '</b>' + ' với nội dung '
566
+ + '<b>' + item.content1 + '</b>' + ' vào lúc ' + moment(new Date(item.created)).format('YYYY-MM-DD hh:mm:ss A')
567
+ }
568
+ }
569
+ };
570
+ this.model.editFormModel.showQuickNoteForm = true;
571
+ this.showAddNoteForm = true;
572
+ });
573
+ }
574
+ onMouseUp(event) {
575
+ event.cancelBubble = true;
576
+ event.stopPropagation();
577
+ }
578
+ addClassToMessage(item, isPinnedMessage) {
579
+ let styleClass = '';
580
+ if (!isPinnedMessage) {
581
+ if (item.isFirstMessageFlow) {
582
+ styleClass = 'first';
583
+ }
584
+ else if (item.isLastMessageFlow) {
585
+ styleClass = 'last';
586
+ }
587
+ else {
588
+ styleClass = 'middle';
589
+ }
590
+ }
591
+ if (item.sent == false) {
592
+ styleClass = 'sending';
593
+ }
594
+ return styleClass;
595
+ }
596
+ }
597
+ ChatBoxComponent.decorators = [
598
+ { type: Component, args: [{
599
+ selector: 'chat-box',
600
+ template: "<div class=\"dashboard\">\r\n <div class=\"chat\">\r\n <div class=\"group-info\">\r\n <a href=\"javascript:\">C\u00F3 {{peopleAll.length}} ng\u01B0\u1EDDi trong nh\u00F3m n\u00E0y</a>\r\n <div class=\"circleButton\" pTooltip=\"Xem to\u00E0n b\u1ED9 \u0111\u00EDnh k\u00E8m\" tooltipPosition=\"top\">\r\n <a href=\"javascript:\"><i class=\"far fa-images\"></i></a>\r\n </div>\r\n <div (click)=\"addPeople()\" class=\"circleButton\" pTooltip=\"Th\u00EAm m\u1EDBi ng\u01B0\u1EDDi v\u00E0o nh\u00F3m\" tooltipPosition=\"top\"\r\n disabled=\"true\">\r\n <a href=\"javascript:\"><i class=\"fas fa-user-plus\"></i></a>\r\n </div>\r\n </div>\r\n <ul #scrollMe [ngClass]=\"{'hasPin': model.pinnedMessage != null}\">\r\n <li *ngIf=\"model.pinnedMessage\" class=\"clearfix pin\" [ngClass]=\"{'message-from': true}\">\r\n <ng-container\r\n *ngTemplateOutlet=\"messageItem; context: { i : -1, item: model.pinnedMessage, isPinnedMessage: true}\">\r\n </ng-container>\r\n </li>\r\n <li *ngFor=\"let item of model.dataSource; let i = index; trackBy: trackByFunc\" class=\"clearfix\"\r\n [ngClass]=\"{ 'message-own': item.type == 'own'}\">\r\n <ng-container *ngTemplateOutlet=\"messageItem; context: { i : i, item: item}\">\r\n </ng-container>\r\n </li>\r\n </ul>\r\n <!-- <chat-send-message-box *ngIf=\"showSendMessageBox\"></chat-send-message-box>-->\r\n <div [ngClass]=\"{'visible2': model.scrolling, 'hidden2': !model.scrolling}\" class=\"scroll-to-bottom\">\r\n <span *ngIf=\"model.newMessageNotUpdatedCount > 0\" (click)=\"scrollToBottom(350, true, null)\">\r\n {{model.newMessageNotUpdatedCount <= 5 ? model.newMessageNotUpdatedCount : '5+' }} </span>\r\n <span (click)=\"scrollToBottom(350, true, null)\" *ngIf=\"model.newMessageNotUpdatedCount == 0\">\r\n <i class=\"fas fa-chevron-down\"></i>\r\n </span>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<file-viewer *ngIf=\"fileViewerModel.showEditForm\" [parentContext]=\"context\" [parentModel]=\"model\"\r\n [model]=\"fileViewerModel\">\r\n</file-viewer>\r\n\r\n<ng-template #messageItem let-i=\"i\" let-isPinnedMessage=\"isPinnedMessage\" let-item=\"item\">\r\n <img *ngIf=\"item.isFirstMessageFlow && item.type != 'own' && !isPinnedMessage && item.avatar != null\" alt=\"\"\r\n class=\"chat-avatar\" src=\"{{getCurrentUserAvatar(item.avatar)}}\">\r\n <p *ngIf=\"(item.isFirstMessageFlow && item.type != 'own') && !isPinnedMessage\" class=\"message-created-by\">\r\n {{item.fullName}}\r\n </p>\r\n <span *ngIf=\"!hasAttachment(item)\">\r\n <!-- [class]=\"addClassToMessage(item, isPinnedMessage)\">-->\r\n <p *ngIf=\"!hasAttachment(item)\" class=\"message-content\">\r\n <i (click)=\"pinMessage(item)\" class=\"fas fa-thumbtack\" style=\"right: 0;\"></i>\r\n <i (click)=\"quickNote(item)\" class=\"fas fa-sticky-note\"></i>\r\n {{item.content}}\r\n </p>\r\n <p *ngIf=\"!isPinnedMessage && (item.isLastMessageFlow || !inTheSameTime(i, item, model.dataSource))\"\r\n class=\"message-created\" pTooltip=\"{{item.created | date:'dd/MM/yyyy HH:mm'}}\"\r\n tooltipPosition=\"{{item.type != 'own'?'right':'left'}}\">\r\n {{_crudService.renderDateTime(item.created)}}\r\n </p>\r\n <p *ngIf=\"isPinnedMessage\" class=\"message-created\">\r\n {{item.createdBy}} \u0111\u00E3 g\u1EEDi l\u00FAc {{item.created | date:'dd/MM/yyyy HH:mm'}}\r\n </p>\r\n </span>\r\n <ng-container *ngIf=\"hasAttachment(item)\">\r\n <ng-container *ngFor=\"let attachmentItem of item.attachments;let index=index\">\r\n <div class=\"file\"\r\n [ngClass]=\"{'first':item.isFirstMessageFlow && index == 0, 'middle':index > 0 || !item.isFirstMessageFlow, 'image' : attachmentItem.type == 'image'}\"\r\n [ngStyle]=\"{'width': model.img[i + 'width' + index]}\">\r\n <p class=\"attachment\">\r\n <span (mouseup)=\"onMouseUp($event)\" class=\"attachment-item\">\r\n <a *ngIf=\"attachmentItem.type != 'image'\" (click)=\"viewOrDownloadFile($event, attachmentItem)\">\r\n <i class=\"fas fa-paperclip\"></i>{{attachmentItem.fileName}}\r\n </a>\r\n <a *ngIf=\"attachmentItem.type == 'image'\" #aElement\r\n [ngClass]=\"{'hidden': !model.img[i + '' + index], 'visible':model.img[i + '' + index]}\"\r\n (click)=\"viewOrDownloadFile($event, attachmentItem)\">\r\n <img class=\"message-img\" (load)=\"loadImg($event, i, index)\"\r\n [src]=\"attachmentItem.url | secure | async\" />\r\n </a>\r\n </span>\r\n </p>\r\n <div style=\"clear: both\"></div>\r\n <p class=\"message-created\" pTooltip=\"{{item.created | date:'dd/MM/yyyy HH:mm'}}\"\r\n tooltipPosition=\"{{item.type != 'own'?'right':'left'}}\">\r\n {{_crudService.renderDateTime(item.created)}}\r\n </p>\r\n </div>\r\n <div style=\"clear: both\"></div>\r\n </ng-container>\r\n </ng-container>\r\n <after-view-checked *ngIf=\"model.dataSource.length == i + 1\" (loading)=\"scrollToBottom(0, false, item.sent)\">\r\n </after-view-checked>\r\n</ng-template>\r\n\r\n<!--<tn-dialog *ngIf=\"userPickerForm.show\" #dialog [styleClass]=\"'tn-form-dialog'\"-->\r\n<!-- [header]=\"'Th\u00EAm m\u1EDBi ng\u01B0\u1EDDi d\u00F9ng' | translate\" [popupSize]=\"userPickerForm.popupSize\"-->\r\n<!-- (onCancel)=\"userPickerForm.show = false\"-->\r\n<!-- (onHide)=\"userPickerForm.show = false\">-->\r\n<!-- &lt;!&ndash; <congviec-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"formModel\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; (onSaved)=\"showDetailForm = false;crudList.reload()\" (onCancel)=\"_handleCancel($event)\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; (onAfterSaved)=\"onAfterSaved($event)\"></congviec-form>&ndash;&gt;-->\r\n<!-- <user-picker-box #formBase [control]=\"userPickerControl\"-->\r\n<!-- [(ngModel)]=\"this.peopleAll\" [multiple]=\"userPickerControl.multiple\">-->\r\n<!-- </user-picker-box>-->\r\n<!--</tn-dialog>-->\r\n\r\n\r\n<!--<tn-dialog *ngIf=\"userPickerForm.show\" #dialog [styleClass]=\"'tn-form-dialog'\"-->\r\n<!-- [header]=\"'Th\u00EAm m\u1EDBi ng\u01B0\u1EDDi d\u00F9ng' | translate\" [popupSize]=\"userPickerForm.popupSize\" (onHide)=\"userPickerForm.show == false\">-->\r\n<!-- &lt;!&ndash; <congviec-form #formBase [parentModel]=\"model\" [parentContext]=\"context\" [model]=\"formModel\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; (onSaved)=\"showDetailForm = false;crudList.reload()\" (onCancel)=\"_handleCancel($event)\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; (onAfterSaved)=\"onAfterSaved($event)\"></congviec-form>&ndash;&gt;-->\r\n\r\n<!-- &lt;!&ndash;<quick-add-form *ngIf=\"model.editFormModel.showQuickNoteForm\" [parentContext]=\"context\"&ndash;&gt;-->\r\n<!-- &lt;!&ndash; [parentModel]=\"context.data.noteDataModel\"></quick-add-form>&ndash;&gt;-->\r\n<!--</tn-dialog>-->",
601
+ providers: [ComponentContextService, CheckControlVisibleService],
602
+ styles: [".paging-advance{list-style:none;margin:3px 0;padding-left:0}.paging-advance li{line-height:30;padding-left:15px;width:150px}.paging-advance li.disabled{color:#bdbdbd;outline:none}.paging-advance li.disabled:hover{background:none;cursor:default}.paging-advance li:hover{background:red;cursor:pointer}.paging-advance-overlay .ui-overlaypanel-content{padding:0}.paging-advance-overlay.ui-overlaypanel-shifted:before{left:1.25em;margin-left:-10;right:auto}.paging-advance-overlay.ui-overlaypanel-shifted:after{left:1.25em;margin-left:-8px;right:auto}.chat-avatar{border:2px solid #eee;height:36px}", "@charset \"UTF-8\";@import url(C:\\Users\\vietp\\source\\repos\\5.1\\shared\\AppSharedV5\\node_modules\\@angular\\material\\prebuilt-themes\\indigo-pink.css);@import url(C:\\Users\\vietp\\source\\repos\\5.1\\shared\\AppSharedV5\\node_modules\\jsoneditor\\dist\\jsoneditor.min.css);.flex{display:flex}.flex .fit{flex:1 1}.flex.flex-column{flex-direction:column}.flex.flex-wrap{flex-wrap:wrap}.flex.center-v{align-items:center}.flex.center-all,.flex.center-h{justify-content:center}.flex.center-all{align-items:center}.validate-item{color:#e00000;display:inline-block;font-size:.9em;white-space:nowrap}.tn-scroll-bar.bgWhite>div,.validate-item{background-color:#fff}.label-primary{background-color:#1ab394;padding:2px}.label-danger,.label-primary{border-radius:.25em;color:#fff;display:inline-block;font-size:12px;margin-left:3px;margin-right:3px;min-width:60px}.label-danger{background-color:#ed5565;padding:2px 5px}.label-warning{background-color:#b8860b}.label-secondary,.label-warning{border-radius:.25em;color:#fff;display:inline-block;font-size:12px;margin-left:3px;margin-right:3px;min-width:60px;padding:2px}.label-secondary{background-color:#a9a9a9}.label-done{background-color:#3b1ef7;border-radius:.25em;color:#fff;display:inline-block;font-size:12px;margin-left:3px;margin-right:3px;min-width:60px;padding:2px}.text-navy{color:#1ab394!important}.text-danger{color:red!important}.fa-user-edit{font-size:14px}.flexcolumn{border:1px solid #eee;border-radius:5px;min-height:80px;overflow-x:hidden;overflow-y:hidden}.flexcolumn,.has2ScrollZone2 .flexcolumn{max-height:calc(100vh - 180px)}.headerNoBorder>th{border:none!important;border-bottom:1px solid #eee!important}.cellNoBorder table tr td{border:0!important}.layout-wrapper .layout-main{overflow:hidden;padding:60px 0 0}div.circleButton{border-radius:50%;display:inline-block;height:32px;line-height:32px;margin-bottom:4px;margin-top:4px;overflow:hidden;position:relative;text-align:center;transform:perspective(1px);width:32px}div.circleButton>a{line-height:32px;padding:0!important}div.circleButton>a>i{width:24px!important}div.circleButton:before{background:#e6e6e6;border-radius:50%;bottom:0;content:\"\";left:0;position:absolute;right:0;top:0;transform:scale(0);transition:all .3s cubic-bezier(.4,.34,.01,.97);z-index:-1}div.circleButton:hover:before{transform:scale(1)}.message-notice{background:#e0e0e0;text-align:center}.message-created-by{color:#888;font-size:.82em;font-weight:400;margin-bottom:3px;margin-left:45px;margin-top:5px}.message-created{color:#495057;display:inline-block;font-size:.82em;margin-bottom:0;margin-top:0}.message-own .message-created{padding-left:10px;padding-right:6px}.message-from .message-created{padding-left:6px;padding-right:10px}.message-content{color:#000;line-height:20px;margin-bottom:6px;margin-top:3px;position:relative}.message-content i{display:none}.message-content:hover i{display:block}.message-content:hover{padding-right:20px!important}.chat-box-content{max-height:500px}.attachment-list .attachment-item{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;background:#f1f1f1;border:1px solid #ccc;border-radius:8px;box-shadow:1px 2px 3px rgba(0,0,0,.06);float:left;height:84px;margin:8px;overflow:hidden;position:relative;text-align:center;user-select:none;width:84px}.attachment-list .attachment-item img{height:100%;width:100%}.attachment-list .attachment-item span{left:0;padding:5px;position:absolute;top:25px;width:100%;word-break:break-all}.clearfix{clear:both}.dashboard .chat ul li img.message-img{float:none;height:120px;margin-left:0;width:auto}.message-attachment{cursor:pointer;font-size:1.5em;margin:0 5px 0 0;position:relative}.hidden{display:none}.message-input{width:100%}.message-input label{font-size:1.2rem}.remove-file-attachment{background:#495057;border-radius:50%;color:#fff;cursor:pointer;font-size:20px;position:absolute;right:5px;top:5px}.attachment-list{background:#fff;bottom:51px;box-shadow:0 -2px 3px -3px rgba(0,0,0,.21176470588235294);display:none;height:100px;left:-15px;position:absolute;width:calc(100% + 30px)}.attachment-list.attached-file{display:block}.dashboard{margin-bottom:-15px;margin-top:-5px}.dashboard .timeline>.ui-g .ui-g-9 .event-text{color:#555;white-space:nowrap}.dashboard .timeline>.ui-g .ui-g-9 .event-text.event-text2{line-height:18px;padding-left:30px;text-align:justify;white-space:pre-wrap}.dashboard .timeline>.ui-g .ui-g-9 .event-text.event-text2 i{left:20px;margin-top:3px;position:absolute}.new-message{align-items:center;justify-content:center}.dashboard .chat .new-message{border:0;display:flex;margin:0;padding:0;text-align:left}.dashboard .chat .new-message i{color:#495057}.dashboard .chat .new-message .message-attachment{border:0}.dashboard .chat .new-message .button-send{display:inline-block;line-height:40px;position:relative}.dashboard .chat .new-message .button-send .p-button-label{text-align:center}.dashboard .chat .new-message .message-emotion{display:inline-block;height:100%;line-height:40px;text-align:center;width:40px}.dashboard .chat .new-message .message-emotion i{font-size:24px;line-height:inherit}.dashboard .chat .new-message .message-input{width:calc(100% - 155px)}.dashboard .chat ul li.message-from,.dashboard .chat ul li.message-own{padding:0}.dashboard .chat ul li.message-from>span{background-color:#f0e3fd;border:0;border-radius:2px 20px 20px 2px}.dashboard .chat ul li.message-from>.first,.dashboard .chat ul li.message-from>.middle{margin-left:45px!important}.dashboard .chat ul li.message-from>.last{border-radius:2px 20px 20px 20px;margin-left:45px!important}.dashboard .chat ul li.message-from>img{border-radius:50%;margin-top:5px;position:absolute;width:36px}.dashboard .chat ul li.message-own>span{background-color:#def6f8;border:0;border-radius:20px 2px 2px 20px;text-align:right}.dashboard .chat ul li.message-own>span.sending{background-color:#eee}.dashboard .chat ul li.message-own>span.last{border-radius:20px 2px 20px 20px}.dashboard .chat ul li.message-own .attachment span.attachment-item{background-color:#f1f1f1!important;border:0!important;padding-left:0;padding-right:0}.dashboard .chat ul li.message-own .attachment span.attachment-item a{color:#555;cursor:pointer;display:inline-block;font-weight:700}.dashboard .chat ul li.message-own>div.file{background:#f1f1f1;border:1px solid #e4e4e4;border-radius:6px;display:inline-block;margin:1px;overflow:hidden;text-align:right}.dashboard .chat ul li.message-from .attachment span.attachment-item{background-color:#f1f1f1!important;border:0!important;padding-left:0;padding-right:0}.dashboard .chat ul li.message-from .attachment span.attachment-item a{color:#555;cursor:pointer;display:inline-block;font-weight:700}.dashboard .chat ul li.message-from .attachment span.attachment-item a img{margin-right:0}.dashboard .chat ul li.message-from>div.file{background:#f1f1f1;border:1px solid #e4e4e4;border-radius:6px;display:inline-block;margin:1px;overflow:hidden;text-align:left}.dashboard .chat ul li .attachment span.attachment-item a>i{padding-right:8px}.dashboard .chat ul li div.file p.attachment{display:inline-block;margin-bottom:5px}.dashboard .chat ul li.message-from{text-align:left}.dashboard .chat ul li.message-own{text-align:right}.dashboard .chat ul li>div.file.image{height:170px;max-width:100%;padding:15px;transition:width .15s linear;width:220px}.dashboard .chat ul li>div.file.image p.attachment{height:120px}.dashboard .chat ul li>div.file{padding:15px}.dashboard .chat ul li>div.file p,.dashboard .chat ul li>div.file span{display:inline-block;margin:0;padding:0}.visible{opacity:1;transition:opacity .15s linear;visibility:visible}.hidden{opacity:0;transition:visibility 0s .1s,opacity .1s linear;visibility:hidden}.visible2{opacity:1;transition:opacity .35s linear;visibility:visible}.hidden2{opacity:0;transition:visibility 0s .3s,opacity .3s linear;visibility:hidden}.dashboard .chat{position:relative}.dashboard .chat .scroll-to-bottom{bottom:6px;min-height:40px;padding-right:12px;position:sticky;text-align:right}.dashboard .chat .scroll-to-bottom span{background:#495057;border:2px solid #fff;border-radius:50%;box-shadow:0 0 10px rgba(0,0,0,.34901960784313724);color:#fff;cursor:pointer;display:inline-block;font-size:20px;height:35px;line-height:35px;overflow:hidden;text-align:center;width:35px}.dashboard .chat .group-info{line-height:30px;margin:-10px;padding:5px 10px;top:0;z-index:99}.dashboard .chat .group-info,.dashboard .chat .pin{background:#fff;box-shadow:0 0 3px -1px rgba(0,0,0,.21176470588235294);position:sticky}.dashboard .chat .pin{margin-bottom:10px;margin-left:-10px;top:40px;width:calc(100% + 20px);z-index:98}.dashboard .chat ul li.message-from.pin>span,.dashboard .chat ul li.message-own.pin>span{background-color:transparent}.dashboard .chat ul li.message-from.pin>span{margin-left:0}.dashboard .chat .message-content i{color:#495057;cursor:pointer;font-size:11px}.dashboard .chat .pin .message-content i{display:block}.dashboard .chat li.message-from .message-content{padding-left:6px}.dashboard .chat li.message-from .message-content i{padding:5px}.dashboard .chat li.message-own .message-content i{padding:5px;position:absolute;right:-15px}.dashboard .chat .group-info .circleButton{float:right;margin-bottom:0;margin-top:0}.dashboard .chat ul{margin-top:20px;padding:0}.dashboard .chat .new-message .message-input input.ui-inputtext:focus{box-shadow:none;outline:none}.dashboard .chat ul.hasPin{margin-top:10px}.dashboard .chat .group-info a{color:#495057}.normalHtml,.normalHtml b,.normalHtml strong{font-weight:400}.normalHtml{display:inline-block}.avatar-viewer .profile-image{border:1px solid #fff;border-radius:50%;height:40px;margin-top:-6px;width:40px}a.button>i{margin-right:5px}.dashboard .timeline{padding-top:20px}.ui-inputgroup .ui-inputtext{padding-right:0}.new-message .ui-inputtext{width:100%}.full-screen,.full-screen>.p-dialog{height:100%!important;left:0!important;max-height:100%;min-height:unset!important;min-width:100%!important;top:0!important;width:100%!important}#image-view-list.image-gallery-2{background-color:rgba(0,0,0,.4);height:calc(100vh - 41px);margin:-14px auto 0;touch-action:none;width:100%}#image-view-list.image-gallery-2 .image-container{background-color:transparent;border:0;bottom:0;height:85%;margin:auto}#image-view-list.image-gallery-2 .image-container .iv-snap-view{bottom:20px;left:calc(50% - 75px);top:auto}#image-view-list.image-gallery-2 .image-container .iv-image-view img{touch-action:auto}#image-view-list .inline-icon{margin-top:-41px}#image-view-list .footer-info,#image-view-list .material-icons.next,#image-view-list .material-icons.prev{display:none}#image-view-list .options-image-viewer{-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;margin-right:37px;user-select:none}.mobile-image-viewer-close{color:#fff;cursor:pointer;font-size:x-large;height:42px;line-height:42px;padding-right:7px;padding-top:2px;position:absolute;right:0;text-align:center;top:0;vertical-align:middle;width:37px}.mobile-image-viewer-close:hover{color:#feca37!important}.hide-holder{padding:0}.file-ex-name{word-break:break-all}.box-function{background:#fff;border-radius:0 0 5px 5px;border-top:1px solid #e8e8e8;bottom:0;left:0;padding:8px 30px;position:absolute;text-align:right;width:100%}.box-function button{margin-left:5px}.quick-note-button-holder{bottom:40px;display:none;height:50px;position:absolute;right:50px;width:50px;z-index:99}.quick-note-button{background:#ffc107;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 5px 0 #b9b9b9;color:#fff;display:block;font-size:2em;height:50px;line-height:50px;outline:none;text-align:center;width:50px}.quick-note-button:hover{color:#fff}.all-note-button{background:#ffd24b;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 5px 0 #b9b9b9;color:#fff;display:block;font-size:1.5em;height:40px;line-height:40px;outline:none;position:absolute;right:5px;text-align:center;top:5px;transition:right;transition-duration:.16s;transition-timing-function:ease-in;width:40px;z-index:-1}.all-note-button:hover{color:#fff}.setting-note-button{background:#ffd24b;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 5px 0 #b9b9b9;color:#fff;display:block;font-size:1.5em;height:40px;line-height:40px;outline:none;position:absolute;right:5px;text-align:center;top:5px;transition:right;transition-duration:.16s;transition-timing-function:ease-in;width:40px;z-index:-1}.setting-note-button:hover{color:#fff}.pinned-notes-holder{bottom:20px;display:none;left:20px;position:absolute;width:250px;z-index:98}.pinned-notes{background:transparent;display:block;outline:none;padding:0}.pinned-notes-header{font-size:1rem;font-weight:700}.pinned-notes-setting{position:absolute;right:.5rem}.pinned-note{background-color:#fff1ac;box-shadow:1px 2px 3px rgba(185,139,6,.6313725490196078);font-size:.8rem;margin-bottom:10px;padding:0;position:relative}.pinned-note:last-child{margin-bottom:0}.pinned-notes-minimize-button{background:#ffc003;border:1px solid #fff;border-radius:50%;box-shadow:1px 2px 3px rgba(185,139,6,.6313725490196078);color:#fff;cursor:pointer;height:25px;padding-top:5px;position:absolute;right:-15px;text-align:center;top:-15px;width:25px;z-index:1}.pinned-note-header-line{border:1px solid #fff;box-shadow:1px 1px 2px rgba(0,0,0,.4);height:calc(100% - 1rem);left:3px;margin-bottom:.5rem;margin-top:.5rem;max-height:20px;position:absolute;width:13px}.pinned-note-header-right{cursor:pointer;float:right;margin-left:3px;width:32px}.pinned-note-header-time{font-size:.6rem}.pinned-note-header-button-unpin{display:none;float:left;height:14px;margin-right:2px;opacity:.8;width:14px}.pinned-note-header-button-complete{display:none;padding-top:2px}.pinned-note-body{float:right;padding:.5rem .5rem .5rem 25px;width:100%}.pinned-note-body:hover{background-color:#feeb82}.pinned-note-body:hover .pinned-note-header-time{display:none}.pinned-note-body:hover .pinned-note-header-button-complete,.pinned-note-body:hover .pinned-note-header-button-unpin{display:block}.pinned-note-line-title{color:#333;display:block;font-weight:700;padding-bottom:6px}.pinned-note-line{display:block}.view-port{border-radius:5px;box-shadow:0 0 0 9999px rgba(0,0,0,.5882352941176471);display:none;height:0;width:0;z-index:999}.view-port,.view-port-mask{background:transparent;position:absolute}.view-port-mask{display:block;height:100%;left:0;top:0;width:100%;z-index:9998}.tinymce-control{border:1px solid #ccc;display:none;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;width:100%}.input-tab-trap{filter:alpha(opacity=0)!important;opacity:0!important;overflow:hidden!important;width:0!important}.color-value input{font-size:.8em;line-height:16px}.dialog-material.mobile{width:100%!important}audio,audio:focus,video,video:focus{outline:none}.iv-image-view img.iv-image{-webkit-animation:fadein .5s;animation:fadein .5s;visibility:hidden!important}@-webkit-keyframes fadein{0%{opacity:0}to{opacity:1}}@keyframes fadein{0%{opacity:0}to{opacity:1}}.iv-image-view img.iv-image.show{visibility:visible!important}.row-line{padding-bottom:0;padding-top:0}.fc-ltr{padding-bottom:7px}.padding-bottom-5px{padding-bottom:5px}.no-margin{margin:0!important}.no-padding{padding:0}.no-padding-left{padding-left:0}.float-left{float:left}body .fc .fc-toolbar .fc-button{background-color:#007ad9;border:1px solid #007ad9;border-radius:3px;color:#fff;font-size:14px;transition:background-color .2s,box-shadow .2s}body .fc .fc-toolbar .fc-button:enabled:hover{background-color:#116fbf;border-color:#116fbf;color:#fff}body .fc .fc-toolbar .fc-button:focus{box-shadow:0 0 0 .2em #8dcdff;outline:0 none;outline-offset:0}body .fc .fc-toolbar .fc-button-group .fc-button{border-radius:0}body .fc .fc-toolbar .fc-button-group .fc-button:first-child{border-bottom-left-radius:3px;border-top-left-radius:3px}body .fc .fc-toolbar .fc-button-group .fc-button:last-child{border-bottom-right-radius:3px;border-top-right-radius:3px}body .fc .fc-toolbar .fc-right .fc-button{border-radius:0}body .fc .fc-toolbar .fc-right .fc-button:first-child{border-bottom-left-radius:3px;border-top-left-radius:3px}body .fc .fc-toolbar .fc-right .fc-button:last-child{border-bottom-right-radius:3px;border-top-right-radius:3px}.fc-toolbar>*>:not(:first-child){margin-left:0}.fc-axis,.fc-dayGridMonth-button,.fc-timeGridDay-button,.fc-timeGridWeek-button,.old-content{line-height:0;text-indent:-9999px}.fc-axis:after,.fc-dayGridMonth-button:after,.fc-timeGridDay-button:after,.fc-timeGridWeek-button:after,.new-content{display:block;line-height:normal;text-indent:0}.fc-dayGridMonth-button:after{content:\"Th\u00E1ng\";padding:.2em}.fc-timeGridWeek-button:after{content:\"Tu\u1EA7n\";padding:.2em}.fc-timeGridDay-button:after{content:\"Ng\u00E0y\";padding:.2em}body .fc th{background-color:#f4f4f4;border:1px solid #c8c8c8;color:#333;padding:.571em 1em}.ui-fluid .button-group button,.ui-fluid .button-group p-button{margin-right:.5em!important;text-align:left;width:auto}.layout-wrapper .layout-menu-container{z-index:97}.base-status,.base-status-aborted,.base-status-approved,.base-status-completed,.base-status-create-new,.base-status-ended,.base-status-high,.base-status-immediately,.base-status-low,.base-status-medium,.base-status-on-conducting,.base-status-on-going,.base-status-pending,.base-status-rejected,.base-status-returned,.base-status-urgent{border-radius:.25em;color:#fff;font-size:.8em;padding:3px;text-align:center}.base-status-create-new{background-color:#f2f2f2;color:#666}.base-status-on-conducting,.base-status-on-going{background-color:#337ab7}.base-status-pending{background-color:#ffba01}.base-status-approved{background-color:#34a835}.base-status-returned{background-color:#ffba01}.base-status-rejected{background-color:#d9534f}.base-status-completed{background-color:#34a835}.base-status-aborted{background-color:#ffba01}.base-status-ended{background-color:#34a835}.base-status-low,.base-status-medium{background-color:#f2f2f2;color:#666}.base-status-high{background-color:#ffba01}.base-status-immediately,.base-status-urgent{background-color:#d9534f}.text-align-center{text-align:center}.font-weight-bold{font-weight:700}.landing-body .landing-menu li a:hover{border-bottom:none}.landing-body .landing-menu li:first-child{margin-left:8px}.crud-form .label-control p{margin:0;padding:0}.crud-form .tn-check-box-list .p-row{display:block;padding:.5em;width:100%}.crud-form dropdown,.crud-form tn-mask{width:100%}.crud-form .tn-dropdown{min-height:32px}.crud-form .tn-dropdown.free-text.horizontal{display:flex}.crud-form .tn-dropdown.free-text.horizontal>div{flex-grow:1;padding-left:.5em;padding-right:.5em}.crud-form .tn-dropdown.free-text.horizontal>div:first-child{padding-left:0}.crud-form .tn-dropdown.free-text.horizontal>div:last-child{padding-right:0}.crud-form .tn-dropdown.free-text.vertical input.ui-inputtext.input-free-text{margin-top:.5em}.crud-form.assessment .label-control{font-weight:700}.crud-form.assessment .label-control.haveIndex{display:block;margin-bottom:5px;padding-left:20px;position:relative}.crud-form.assessment .label-control.haveIndex:before{content:\" \" attr(label-index) \".\";left:0;position:absolute;top:0}.crud-form.assessment .ViewMode{border-bottom:none}.crud-form.assessment .ViewMode .label-control{margin-bottom:0}body .ui-inputtext.min-width{padding:6px}.ps__rail-x,.ps__rail-y{z-index:2}.zIndex5 .ps__rail-x,.zIndex5 .ps__rail-y{z-index:5}.table-sticky table{border-collapse:separate;border-spacing:0}.table-sticky tr td,.table-sticky tr th{border:1px solid #eee!important;border-left:none!important;border-top:none!important}.table-sticky tr td:first-child,.table-sticky tr th:first-child{border-left:1px solid #eee!important}.table-sticky tr td:last-child,.table-sticky tr th:last-child{border-right:none!important}.table-sticky tr:first-child th{border-top:1px solid #eee!important}.table-sticky th{background:#eee}.table-sticky tbody td.disabled{background:#eee!important}.table-sticky tbody td.disabled:not(:last-child){border-right:1px solid #fff!important}.table-sticky.fix-height tr:first-child th{position:sticky;top:0;z-index:2}.container-flex{align-items:center;display:flex}.container-flex>div:first-child{flex:0 0 auto;margin-right:.5em}.container-flex>div:last-child{flex-grow:1}.container-control{display:flex}.container-control>span.label{flex:0 0 auto;padding-right:.5em;padding-top:.5em}.container-control>span.label+*{flex-grow:1;flex-shrink:1;position:relative}.container-control>span.label+* .tn-dropdown,.container-control>span.label+* .ui-autocomplete-multiple,.container-control>span.label+* .ui-inputgroup .ui-inputtext{width:100%}.container-control>span.label+* .validation-container{margin-top:3px}.container-control>span.label+* .validation-container .validate-item{white-space:unset}.container-control>span.label+*>div{left:0;position:absolute;top:0;width:100%}.container-control.no-label>span.label{display:none}.container-control.inline{display:inline-flex}.align-flex-center{align-items:center;display:flex;justify-content:center}@media print{.isPrinting>*{display:none}.isPrinting app-print-layout{display:block}}.layout-wrapper .topbar .topbar-left,.layout-wrapper .topbar .topbar-right{background:#397ac3}#searchResultPanel-holder{padding:0 .5em}.cus-dropdown{line-height:normal;margin-right:1em}.tn-thumbnail{padding:.5rem}.tn-thumbnail.tn-thumbnail.tn-thumbnail{box-sizing:border-box}.fa-10:before{content:\"A+\";font-family:cursive;font-weight:700}.layout-wrapper .topbar .topbar-right #menu-button i{font-size:20px;margin-top:4px}.layout-wrapper .layout-menu li a i.menuitem-toggle-icon{font-size:15px;margin-left:auto}.flex-container-main-content{display:flex;flex-direction:column}.flex-container-main-content>div:last-child{background-color:#f4f4f4;display:flex;flex:1 1;overflow:hidden;position:relative}.flex-container-main-content>div:last-child>div{height:100%;left:0;overflow:hidden;padding-top:.5em;position:absolute;top:0;width:100%}.flex-container-main-content .block-with-button-search{display:flex;justify-content:flex-end}.flex-container-main-content .block-with-button-search>*{margin-left:.5em}.flex-container-main-content .block-with-button-search>input{height:26px;margin-left:0;max-width:200px;width:100%}.flex-container-main-content .block-with-button-search>dropdown{max-width:140px;width:100%}.flex-container-main-content .title-main-component{border-bottom:2px solid #1ca7ff}.clickable-table.clickable-table{cursor:pointer}.main-crud-container{height:calc(100vh - 76px)}.flex-container-fit-child{display:flex;flex-direction:column;height:100%;overflow:hidden}.flex-container-fit-child>div.fit-content{flex:1 1;position:relative}.flex-container-fit-child>div.fit-content>div{height:100%;overflow:auto;position:absolute;width:100%}.waiting-box{display:none;height:100%;left:0;position:fixed;top:0;width:100%;z-index:9999}.waiting-box .overlay{background-color:red;background-color:hsla(0,0%,42.7%,.5019607843137255);height:100%;width:100%}.waiting-box .content-loading{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.waiting-box.show{display:block}.function-topbar>*{vertical-align:top}.function-topbar button{width:auto}.function-topbar p-fileUpload{margin-right:1em}.function-topbar .container-control{display:inline-flex;line-height:normal}.function-topbar .container-control dropdown{width:100%}:focus{outline-color:#a6d5fa!important}address{font-style:normal}body .p-toast .p-toast-message{border-radius:0;border-width:0 0 0 4px!important}.__status span,.status span{font-size:.8rem}p-table.single-check .p-datatable .p-datatable-tbody>tr{cursor:pointer}p-table.single-check .p-datatable .p-datatable-tbody>tr.ui-state-highlight{background:#e3f2fd!important;outline:2px solid #a6d5fa}p-table.single-check .p-datatable .p-datatable-tbody>tr td.sticky .fix-sticky.top{display:none}p-table.multi-check .p-datatable .p-datatable-tbody>tr.ui-state-highlight{background:#e3f2fd!important}p-table.multi-check .p-datatable .p-datatable-tbody>tr.ui-state-highlight td{border-color:#fff}p-table.multi-check .p-datatable .p-datatable-tbody>tr.ui-state-highlight td .fix-sticky{background-color:#fff}.tn-animated-left-arrow-icon,.tn-animated-right-arrow-icon{height:32px;position:relative;width:14px;z-index:10}.tn-animated-right-arrow-icon{-webkit-animation:arrowBounceToRight .8s ease-in-out infinite alternate;animation:arrowBounceToRight .8s ease-in-out infinite alternate}.tn-animated-left-arrow-icon{-webkit-animation:arrowBounceToLeft .8s ease-in-out infinite alternate;animation:arrowBounceToLeft .8s ease-in-out infinite alternate}.tn-animated-left-arrow-icon:after,.tn-animated-left-arrow-icon:before,.tn-animated-right-arrow-icon:after,.tn-animated-right-arrow-icon:before{background-color:#88b0dd;content:\"\";display:block;height:20px;position:absolute;width:5px}.tn-animated-right-arrow-icon:before{left:4px;top:0;transform:rotate(-35deg)}.tn-animated-right-arrow-icon:after{left:4px;top:14px;transform:rotate(35deg)}.tn-animated-left-arrow-icon:before{right:4px;top:0;transform:rotate(35deg)}.tn-animated-left-arrow-icon:after{right:4px;top:14px;transform:rotate(-35deg)}@-webkit-keyframes arrowBounceToLeft{0%{transform:translateX(-3px)}to{transform:translateX(3px)}}@keyframes arrowBounceToLeft{0%{transform:translateX(-3px)}to{transform:translateX(3px)}}@-webkit-keyframes arrowBounceToRight{0%{transform:translateX(3px)}to{transform:translateX(-3px)}}@keyframes arrowBounceToRight{0%{transform:translateX(3px)}to{transform:translateX(-3px)}}.pass{color:#49c949}.not-pass,.pass{margin:5px;text-align:center}.not-pass{color:red}"]
603
+ },] }
604
+ ];
605
+ ChatBoxComponent.ctorParameters = () => [
606
+ { type: Injector },
607
+ { type: ChatService },
608
+ { type: MessageBoardService },
609
+ { type: UserService },
610
+ { type: CheckControlVisibleService },
611
+ { type: SignalRService },
612
+ { type: FileExplorerService },
613
+ { type: CrudService },
614
+ { type: NotifierService },
615
+ { type: ModuleConfigService }
616
+ ];
617
+ ChatBoxComponent.propDecorators = {
618
+ taskId: [{ type: Input }],
619
+ serviceCode: [{ type: Input }],
620
+ entity: [{ type: Input }],
621
+ users: [{ type: Input }],
622
+ showSendMessageBox: [{ type: Input }],
623
+ input: [{ type: ViewChild, args: ['input',] }],
624
+ fileElement: [{ type: ViewChild, args: ['fileElement',] }]
625
+ };
626
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uL3Byb2plY3RzL3RueC1zaGFyZWQvc3JjL2xpYi8iLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvY2hhdC9jaGF0LWJveC9jaGF0LWJveC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQXFCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRyxPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUNsQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDckUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUNoRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvREFBb0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDeEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBRTlFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQzdGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxN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MEJBQ2pCLFNBQVMsU0FBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbmplY3RvciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQgeyBGaWxlVXBsb2FkIH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvZmlsZXVwbG9hZCc7XHJcblxyXG5pbXBvcnQgeyBDb21wb25lbnRCYXNlIH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9iYXNlL2NvbXBvbmVudC1iYXNlJztcclxuaW1wb3J0IHsgQ3J1ZFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jcnVkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOb3RpZmllclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9ub3RpZmllci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2lnbmFsUlNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zaWduYWxyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBVc2VyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3VzZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEdlbmVyYXRlTGlua0Rvd25sb2FkRFRPIH0gZnJvbSAnLi4vLi4vZmlsZS1leHBsb3Jlci9tb2RlbHMvZ2VuZXJhdGUtbGluay1kb3dubG9hZC1kdG8nO1xyXG5pbXBvcnQgeyBGaWxlRXhwbG9yZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZmlsZS1leHBsb3Jlci9zZXJ2aWNlcy9maWxlLWV4cGxvcmVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDaGF0U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2NoYXQuc2VydmljZSc7XHJcbmltcG9ydCB7IE1lc3NhZ2VCb2FyZFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9tZXNzYWdlLWJvYXJkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRDb250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2FwcC1jb250ZXh0L2NvbXBvbmVudC1jb250ZXh0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21DdHhDb25zdGFudHMgfSBmcm9tICcuLi8uLi8uLi9jb25maWdzL2NvbXBvbmVudC1jb250ZXh0LmNvbnN0YW50JztcclxuaW1wb3J0IHsgTW9kdWxlQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vY29uZmlncy9tb2R1bGUtY29uZmlnJztcclxuaW1wb3J0IHsgQ2hlY2tDb250cm9sVmlzaWJsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jaGVjay1jb250cm9sLXZpc2libGUuc2VydmljZSc7XHJcbmltcG9ydCB7IE1vZHVsZUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tb2R1bGUtY29uZmlnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTZXJ2aWNlUmVxdWVzdE1vZGVsIH0gZnJvbSAnLi4vLi4vZmlsZS1leHBsb3Jlci9tb2RlbHMvc2VydmljZS1yZXF1ZXN0LW1vZGVsJztcclxuaW1wb3J0IHsgRWRpdEZvcm1Nb2RlbCB9IGZyb20gJy4uL21vZGVscy9tb2RlbHMnO1xyXG5pbXBvcnQgeyBQb3B1cFNpemUsIFVzZXJQaWNrZXJDb250cm9sU2NoZW1hIH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9mb3JtLXNjaGVtYSc7XHJcbmltcG9ydCB7IFRuVXNlciB9IGZyb20gJy4uLy4uLy4uL21vZGVscy90bi11c2VyJztcclxuaW1wb3J0IHsgTWVzc2FnZVR5cGUsIE5FV19NRVNTQUdFLCBOb3RpZmljYXRpb25UeXBlLCBQSU5ORURfQ0hBTkdFRCB9IGZyb20gJy4uL21vZGVscy9lbnVtcyc7XHJcblxyXG4vLyBmaXggZm9yIGJ1aWxkIHByb2RcclxuY29uc3QgbW9tZW50ID0gbW9tZW50XztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdjaGF0LWJveCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2hhdC1ib3guY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vY2hhdC1ib3guY29tcG9uZW50LnNjc3MnLCAnLi4vY29tbW9uLXN0eWxlLnNjc3MnXSxcclxuICAgIHByb3ZpZGVyczogW0NvbXBvbmVudENvbnRleHRTZXJ2aWNlLCBDaGVja0NvbnRyb2xWaXNpYmxlU2VydmljZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIENoYXRCb3hDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRCYXNlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgQElucHV0KCkgdGFza0lkOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBzZXJ2aWNlQ29kZTogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgZW50aXR5OiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSB1c2VyczogYW55O1xyXG4gICAgQElucHV0KCkgc2hvd1NlbmRNZXNzYWdlQm94OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdpbnB1dCcpIGlucHV0OiBFbGVtZW50UmVmO1xyXG4gICAgQFZpZXdDaGlsZCgnZmlsZUVsZW1lbnQnKSBmaWxlRWxlbWVudDogRmlsZVVwbG9hZDtcclxuXHJcbiAgICBwcml2YXRlIF9tb2R1bGVDb25maWc6IE1vZHVsZUNvbmZpZztcclxuICAgIHJlYWRvbmx5IGRlZmF1bHRBdmF0YXI7XHJcbiAgICByZWFkb25seSBlbnZpcm9ubWVudDogYW55O1xyXG5cclxuICAgIHVzZXJQaWNrZXJGb3JtOiBFZGl0Rm9ybU1vZGVsID0ge1xyXG4gICAgICAgIHNlbGVjdGVkVmFsdWU6IFtdLFxyXG4gICAgICAgIGRhdGE6IG51bGwsXHJcbiAgICB9O1xyXG4gICAgdXNlclBpY2tlckNvbnRyb2w6IFVzZXJQaWNrZXJDb250cm9sU2NoZW1hO1xyXG4gICAgZmlsZVZpZXdlck1vZGVsOiB7XHJcbiAgICAgICAgZGF0YTogYW55LFxyXG4gICAgICAgIHNob3dFZGl0Rm9ybTogYm9vbGVhbixcclxuICAgIH07XHJcblxyXG4gICAgdG9waWMgPSAnJztcclxuICAgIGZpcnN0VGltZSA9IHRydWU7XHJcbiAgICBtdWx0aXBsZSA9IHRydWU7XHJcbiAgICBzaG93QWRkTm90ZUZvcm0gPSBmYWxzZTtcclxuICAgIGZpbGVBcGkgPSAnJztcclxuICAgIHBlb3BsZUFsbDogYW55ID0gW107XHJcbiAgICBjb3JyZWxhdGlvbklkcyA9IFtdO1xyXG4gICAgYXR0YWNobWVudHMgPSBbXTtcclxuICAgIGltYWdlID0gJyc7XHJcbiAgICBwZW9wbGVBbGxVc2VycyA9IFtdO1xyXG4gICAgcGVvcGxlUmVsYXRlZFVzZXJzID0gW107XHJcbiAgICBlZGl0Rm9ybU1vZGVsID0ge307XHJcblxyXG4gICAgc2VydmljZVJlcXVlc3RNb2RlbDogU2VydmljZVJlcXVlc3RNb2RlbDtcclxuICAgIGN1cnJlbnRVc2VyOiBUblVzZXI7XHJcbiAgICBtYXhGaWxlU2l6ZTogbnVtYmVyO1xyXG4gICAgLy8gZmlsZVZpZXdlcjogYW55O1xyXG4gICAgYXNzaWduZWU6IGFueTtcclxuICAgIGFzc2lnbmVyOiBhbnk7XHJcbiAgICByZWxhdGVkVXNlcjogYW55O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGluamVjdG9yOiBJbmplY3RvcixcclxuICAgICAgICBwcml2YXRlIF9jaGF0U2VydmljZTogQ2hhdFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfbWVzc2FnZUJvYXJkU2VydmljZTogTWVzc2FnZUJvYXJkU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF91c2VyU2VydmljZTogVXNlclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfY2hlY2tDb250cm9sVmlzaWJsZTogQ2hlY2tDb250cm9sVmlzaWJsZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBfc2lnbmFsclNlcnZpY2U6IFNpZ25hbFJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2ZpbGVTZXJ2aWNlOiBGaWxlRXhwbG9yZXJTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBfY3J1ZFNlcnZpY2U6IENydWRTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX25vdGlmaWVyU2VydmljZTogTm90aWZpZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX21vZHVsZUNvbmZpZ1NlcnZpY2U6IE1vZHVsZUNvbmZpZ1NlcnZpY2VcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcclxuICAgICAgICB0aGlzLl9tb2R1bGVDb25maWcgPSB0aGlzLl9tb2R1bGVDb25maWdTZXJ2aWNlLmdldENvbmZpZygpO1xyXG4gICAgICAgIHRoaXMuZW52aXJvbm1lbnQgPSB0aGlzLl9tb2R1bGVDb25maWcuZW52aXJvbm1lbnQ7XHJcbiAgICAgICAgdGhpcy5kZWZhdWx0QXZhdGFyID0gdGhpcy5lbnZpcm9ubWVudC5hcHBNZXRhZGF0YS5tYWluLmRlZmF1bHRNYWxlQXZhdGFyO1xyXG4gICAgICAgIHRoaXMuZmlsZUFwaSA9IHRoaXMuZW52aXJvbm1lbnQuYXBpRG9tYWluLmZpbGVFbmRwb2ludDtcclxuXHJcbiAgICAgICAgdGhpcy5tb2RlbC51c2VyUGlja2VyRm9ybSA9IHsgcG9wdXBTaXplOiBQb3B1cFNpemUsIGRhdGE6IHt9IH07XHJcbiAgICAgICAgdGhpcy5tb2RlbC5xdWlja05vdGVGb3JtID0geyBwb3B1cFNpemU6IDxhbnk+e30sIGRhdGE6IHt9IH07XHJcblxyXG4gICAgICAgIHRoaXMuY29udGV4dC5zdWJzY3JpYmUoJ1FVSUNLX05PVEVfUE9QVVAuQ0xPU0VfUE9QVVAnLCByZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuZWRpdEZvcm1Nb2RlbC5zaG93UXVpY2tOb3RlRm9ybSA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVVzZXJzKGFzc2lnbmVlOiBhbnksIGFzc2lnbmVyOiBhbnksIHJlbGF0ZWRVc2VyOiBhbnlbXSkge1xyXG4gICAgICAgIHRoaXMuYXNzaWduZWUgPSBhc3NpZ25lZTtcclxuICAgICAgICB0aGlzLmFzc2lnbmVyID0gYXNzaWduZXI7XHJcbiAgICAgICAgdGhpcy5yZWxhdGVkVXNlciA9IHJlbGF0ZWRVc2VyO1xyXG4gICAgICAgIGxldCBhbGwgPSBbXTtcclxuICAgICAgICBhbGwucHVzaChhc3NpZ25lZSk7XHJcbiAgICAgICAgYWxsLnB1c2goYXNzaWduZXIpO1xyXG4gICAgICAgIGlmICh0aGlzLnJlbGF0ZWRVc2VyLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgYWxsID0gYWxsLmNvbmNhdChyZWxhdGVkVXNlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucGVvcGxlQWxsID0gYWxsLmZpbHRlcigoeCwgaSwgYSkgPT4gYS5pbmRleE9mKHgpID09IGkpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMuaW5pdENsYXNzVmFyKCk7XHJcblxyXG4gICAgICAgIHRoaXMuZ2V0TWVzc2FnZXMobnVsbCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NoYXRTZXJ2aWNlLmdldENoYXRJZEJ5VGFzayh0aGlzLnNlcnZpY2VSZXF1ZXN0TW9kZWwsIHRoaXMudGFza0lkKS50aGVuKHJzID0+IHtcclxuICAgICAgICAgICAgaWYgKCFycy5zdWNjZXNzKSB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcocnMubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIGlmICghcnMuZGF0YSkgcmV0dXJuO1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLmlkID0gcnMuZGF0YTtcclxuICAgICAgICAgICAgdGhpcy5yb290Q29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuQ0hBVF9JTlNUQU5DRV9JRF9MT0FERUQsIHRoaXMubW9kZWwuaWQpO1xyXG4gICAgICAgICAgICB0aGlzLnRvcGljID0gYGNoYXQuJHt0aGlzLm1vZGVsLmlkfWA7XHJcbiAgICAgICAgICAgIHRoaXMuX3NpZ25hbHJTZXJ2aWNlLnN0YXJ0KG51bGwsIHRoaXMudG9waWMsIGRhdGEgPT4gdGhpcy5oYW5kbGVDaGFuZ2VzKGRhdGEpKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGdldCBwaW5uZWQgbWVzc2FnZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5tb2RlbC5pZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWVzc2FnZUJvYXJkU2VydmljZS5nZXRMYXRlc3RQaW5uZWRNZXNzYWdlKHRoaXMubW9kZWwuaWQpLnRoZW4ocnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChycy5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwucGlubmVkTWVzc2FnZSA9IHJzLmRhdGEuY29udGVudDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnJvb3RDb250ZXh0LnN1YnNjcmliZShDb21DdHhDb25zdGFudHMuUk9PVC5DSEFUX01FU1NBR0VfU0VORElORywgYXN5bmMgZGF0YSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuY29ycmVsYXRpb25JZHMucHVzaChkYXRhLm1lc3NhZ2UuY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgICAgIGlmIChkYXRhLmF0dGFjaG1lbnRzICYmIGRhdGEuYXR0YWNobWVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgZGF0YS5hdHRhY2htZW50cyA9IGRhdGEuYXR0YWNobWVudHMubWFwKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHgudXJsID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geDtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCB0ZW1wID0gYXdhaXQgdGhpcy5hcHBlbmRNZXNzYWdlKGRhdGEubWVzc2FnZS5tZXNzYWdlQ29udGVudCwgJ293bicsICdzZW5kaW5nJywgdGhpcy5jdXJyZW50VXNlci51c2VyTmFtZSwgZGF0YS5hdHRhY2htZW50cywgZGF0YS5tZXNzYWdlLmNvcnJlbGF0aW9uSWQsIGZhbHNlKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2codGVtcCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucm9vdENvbnRleHQuc3Vic2NyaWJlKENvbUN0eENvbnN0YW50cy5ST09ULkNIQVRfTUVTU0FHRV9TRU5ULCBkYXRhID0+IHtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5yb290Q29udGV4dC5zdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuQ0hBVF9MT0FEX01PUkUsIGRhdGEgPT4ge1xyXG4gICAgICAgICAgICAvLyB0aGlzLmdldE1lc3NhZ2VzKHRoaXMubW9kZWwuY3JlYXRlZEZyb20pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnJvb3RDb250ZXh0LnN1YnNjcmliZShDb21DdHhDb25zdGFudHMuUk9PVC5DSEFUX1NDUk9MTElORywgc2Nyb2xsaW5nID0+IHtcclxuICAgICAgICAgICAgaWYgKHNjcm9sbGluZykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5zY3JvbGxpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5zY3JvbGxpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwubmV3TWVzc2FnZU5vdFVwZGF0ZWRDb3VudCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5yb290Q29udGV4dC5zdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuQ0hBVF9IQVNfTkVXX01FU1NBR0VfTk9UX1VQREFURUQsIGNvdW50ID0+IHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5zY3JvbGxpbmcgPSBjb3VudCAhPT0gMDtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5uZXdNZXNzYWdlTm90VXBkYXRlZENvdW50ID0gY291bnQ7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuY29udGV4dC5zdWJzY3JpYmUoJ0NMT1NFX1BPUFVQJywgcnMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLnVzZXJQaWNrZXJGb3JtLnNob3cgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnRDb250ZXh0LmZpcmVFdmVudCgnVEFTSy5SRUxBVEVEX1VTRVJfQ0hBTkdFRCcsIHJzKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5wYXJlbnRDb250ZXh0LnN1YnNjcmliZSgnVEFTSy5EQVRBX0NIQU5HRUQnLCBycyA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVXNlcnMocnMuYXNzaWduZWUsIHJzLmFzc2lnbmVyLCBycy5yZWxhdGVkVXNlcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVDaGFuZ2VzKGRhdGEpIHtcclxuICAgICAgICBjb25zdCBuZXdNZXNzYWdlID0gSlNPTi5wYXJzZShkYXRhKTtcclxuICAgICAgICBpZiAoIW5ld01lc3NhZ2UgfHwgIW5ld01lc3NhZ2UuZGF0YSkge1xyXG4gICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ1NZU19FUlJfREVWOiBM4buXaSBTaWduYWxSJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN3aXRjaCAobmV3TWVzc2FnZS5ub3RpZmljYXRpb25UeXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uVHlwZS5OZXdNZXNzYWdlOlxyXG4gICAgICAgICAgICBjYXNlIE5FV19NRVNTQUdFOiB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZU5ld01lc3NhZ2VOb3RpZmljYXRpb24obmV3TWVzc2FnZS5kYXRhKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgTm90aWZpY2F0aW9uVHlwZS5QaW5uZWRDaGFuZ2VkOlxyXG4gICAgICAgICAgICBjYXNlIFBJTk5FRF9DSEFOR0VEOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbmQgPSB0aGlzLm1vZGVsLmNvcnJlbGF0aW9uSWRzLmZpbmRJbmRleCh4ID0+IHggPT0gbmV3TWVzc2FnZS5jb3JyZWxhdGlvbklkKTtcclxuICAgICAgICAgICAgICAgIGlmIChpbmQgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuY29ycmVsYXRpb25JZHMuc3BsaWNlKGluZCwgMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZVBpbm5lZENoYW5nZU5vdGlmaWNhdGlvbihuZXdNZXNzYWdlLmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0Q2xhc3NWYXIoKSB7XHJcbiAgICAgICAgdGhpcy5maWxlVmlld2VyTW9kZWwgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IHt9LFxyXG4gICAgICAgICAgICBzaG93RWRpdEZvcm06IGZhbHNlLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy51c2VyUGlja2VyQ29udHJvbCA9IG5ldyBVc2VyUGlja2VyQ29udHJvbFNjaGVtYSh7XHJcbiAgICAgICAgICAgIGZpZWxkOiAnaWQnLFxyXG4gICAgICAgICAgICBsYWJlbDogJycsXHJcbiAgICAgICAgICAgIGZ1bGxMYWJlbDogJycsXHJcbiAgICAgICAgICAgIG11bHRpcGxlOiB0cnVlLFxyXG4gICAgICAgICAgICBoaWRkZW5DaGVjazogKCkgPT4gdGhpcy51c2VyUGlja2VyRm9ybS5zaG93LFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuc2VydmljZVJlcXVlc3RNb2RlbCA9IDxTZXJ2aWNlUmVxdWVzdE1vZGVsPntcclxuICAgICAgICAgICAgc2VydmljZTogdGhpcy5zZXJ2aWNlQ29kZSxcclxuICAgICAgICAgICAgc2VydmljZUNvZGU6IHRoaXMuc2VydmljZUNvZGUsXHJcbiAgICAgICAgICAgIGVudGl0eTogdGhpcy5lbnRpdHksXHJcbiAgICAgICAgICAgIGVudGl0eUtleTogJ2lkJyxcclxuICAgICAgICAgICAgZW50aXR5SW5zdGFuY2VJZDogdGhpcy50YXNrSWRcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMubW9kZWwuZGF0YVNvdXJjZSA9IFtdO1xyXG4gICAgICAgIHRoaXMubW9kZWwuY29ycmVsYXRpb25JZHMgPSBbXTtcclxuICAgICAgICB0aGlzLm1vZGVsLmF0dGFjaG1lbnRzID0gW107XHJcbiAgICAgICAgdGhpcy5tb2RlbC5tYXhGaWxlU2l6ZSA9IDMwMDAwMDA7XHJcbiAgICAgICAgdGhpcy5tb2RlbC5pbWcgPSB7fTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRVc2VyID0gdGhpcy5fdXNlclNlcnZpY2UuZ2V0Q3VycmVudFVzZXIoKTtcclxuICAgICAgICB0aGlzLnBlb3BsZUFsbFVzZXJzID0gW107XHJcbiAgICAgICAgdGhpcy5wZW9wbGVSZWxhdGVkVXNlcnMgPSBbXTtcclxuICAgICAgICB0aGlzLm1vZGVsLmVkaXRGb3JtTW9kZWwgPSBbXTtcclxuICAgICAgICBpZiAodGhpcy51c2Vycykge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLnRhc2tOYW1lID0gdGhpcy51c2Vycy50YXNrTmFtZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVXNlcnMoXHJcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJzLmFzc2lnbmVlLFxyXG4gICAgICAgICAgICAgICAgdGhpcy51c2Vycy5hc3NpZ25lcixcclxuICAgICAgICAgICAgICAgIHRoaXMudXNlcnMucmVsYXRlZFVzZXJzXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmdldFJlbGF0ZWRVc2VySW5mbygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRSZWxhdGVkVXNlckluZm8oKSB7XHJcbiAgICAgICAgY29uc3QgcGVvcGxlUmVsYXRlZFVzZXJzID0gYXdhaXQgdGhpcy5fdXNlclNlcnZpY2UuZ2V0QmFzaWNVc2Vyc0luZm8odGhpcy5yZWxhdGVkVXNlci5qb2luKCkpO1xyXG4gICAgICAgIGlmIChwZW9wbGVSZWxhdGVkVXNlcnMgPT0gbnVsbCB8fCBwZW9wbGVSZWxhdGVkVXNlcnMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGVvcGxlUmVsYXRlZFVzZXJzKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGVvcGxlUmVsYXRlZFVzZXJzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6IGl0ZW0uZnVsbE5hbWUsXHJcbiAgICAgICAgICAgICAgICBsYWJlbDogaXRlbS5mdWxsTmFtZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBpdGVtLmlkXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBoYW5kbGVQaW5uZWRDaGFuZ2VOb3RpZmljYXRpb24oZGF0YSkge1xyXG4gICAgICAgIGlmIChkYXRhLnBpbm5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLnBpbm5lZE1lc3NhZ2UgPSBkYXRhLm1lc3NhZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLnBpbm5lZE1lc3NhZ2UgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBoYW5kbGVOZXdNZXNzYWdlTm90aWZpY2F0aW9uKG5ld01lc3NhZ2UpIHtcclxuICAgICAgICBjb25zdCBpbmQgPSB0aGlzLm1vZGVsLmNvcnJlbGF0aW9uSWRzLmZpbmRJbmRleCh4ID0+IHggPT0gbmV3TWVzc2FnZS5jb3JyZWxhdGlvbklkKTtcclxuXHJcbiAgICAgICAgaWYgKG5ld01lc3NhZ2UubWVzc2FnZVR5cGUgPT0gTWVzc2FnZVR5cGUuRklMRSkge1xyXG4gICAgICAgICAgICBuZXdNZXNzYWdlLmF0dGFjaG1lbnRzID0gYXdhaXQgdGhpcy5fY2hhdFNlcnZpY2UuZ2V0TGlzdEF0dGFjaG1lbnQobmV3TWVzc2FnZS5pZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaW5kID09PSAtMSkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmFwcGVuZE1lc3NhZ2UobmV3TWVzc2FnZS5jb250ZW50LCB0aGlzLmdldFR5cGVPZk1lc3NhZ2UobmV3TWVzc2FnZS5jcmVhdGVkQnkpLCAncmVjZWl2ZWQnLCBuZXdNZXNzYWdlLmNyZWF0ZWRCeSwgbmV3TWVzc2FnZS5hdHRhY2htZW50cywgJycsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVNZXNzYWdlKG5ld01lc3NhZ2UuY29ycmVsYXRpb25JZCwgbmV3TWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuY29ycmVsYXRpb25JZHMuc3BsaWNlKGluZCwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldE1lc3NhZ2VzKGNyZWF0ZWRGcm9tKSB7XHJcbiAgICAgICAgdGhpcy5fY2hhdFNlcnZpY2UuZ2V0Q29udGVudEJ5VGFza0lkKHRoaXMuc2VydmljZVJlcXVlc3RNb2RlbCwgdGhpcy50YXNrSWQpLnRoZW4oYXN5bmMgcnMgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VXNlck5hbWUgPSB0aGlzLmN1cnJlbnRVc2VyLnVzZXJOYW1lO1xyXG4gICAgICAgICAgICBsZXQgbmVhckJ5Q3JlYXRlZCA9ICcnO1xyXG4gICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgICAgICBsZXQgdXNlck5hbWVzOiBzdHJpbmcgPSAnJztcclxuICAgICAgICAgICAgaWYgKCFycy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKHJzLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBycy5kYXRhKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbS5jcmVhdGVkQnkgJiYgaXRlbS5jcmVhdGVkQnkgIT0gJycpIHVzZXJOYW1lcyArPSBgJHtpbmRleCA9PSAwID8gJycgOiAnLCd9JHtpdGVtLmNyZWF0ZWRCeX1gO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkgdGhpcy5tb2RlbC5jcmVhdGVkRnJvbSA9IGl0ZW0uY3JlYXRlZDtcclxuXHJcbiAgICAgICAgICAgICAgICBpdGVtLnR5cGUgPSBpdGVtLmNyZWF0ZWRCeSA9PT0gY3VycmVudFVzZXJOYW1lID8gJ293bicgOiAnZnJvbSc7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0ubWVzc2FnZVR5cGUgPT09IE1lc3NhZ2VUeXBlLkZJTEUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLmF0dGFjaG1lbnRzID0gYXdhaXQgdGhpcy5fY2hhdFNlcnZpY2UuZ2V0TGlzdEF0dGFjaG1lbnQoaXRlbS5pZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaXRlbS5pc0xhc3RNZXNzYWdlRmxvdyA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpdGVtLmNyZWF0ZWRCeSAhPT0gbmVhckJ5Q3JlYXRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICgraXRlbSA+IC0wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJzLmRhdGFbK2l0ZW0gLSAxXS5pc0xhc3RNZXNzYWdlRmxvdyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIG5lYXJCeUNyZWF0ZWQgPSBpdGVtLmNyZWF0ZWRCeTtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLmlzRmlyc3RNZXNzYWdlRmxvdyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLmlzRmlyc3RNZXNzYWdlRmxvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICgraW5kZXggPT09IHJzLmRhdGEubGVuZ3RoIC0gMSkgaXRlbS5pc0xhc3RNZXNzYWdlRmxvdyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY3JlYXRlZEZyb20pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YVNvdXJjZSA9IFsuLi5ycy5kYXRhLCAuLi50aGlzLm1vZGVsLmRhdGFTb3VyY2VdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5kYXRhU291cmNlID0gcnMuZGF0YTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodXNlck5hbWVzICE9ICcnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VySW5mb3MgPSBhd2FpdCB0aGlzLl91c2VyU2VydmljZS5nZXRCYXNpY1VzZXJzSW5mb0J5VXNlck5hbWVzKHVzZXJOYW1lcyk7XHJcbiAgICAgICAgICAgICAgICBpZiAodXNlckluZm9zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5tb2RlbC5kYXRhU291cmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXIgPSB1c2VySW5mb3MuZmluZCh4ID0+IHgudXNlck5hbWUgPT0gaXRlbS5jcmVhdGVkQnkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXVzZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYXZhdGFyID0gdXNlci5hdmF0YXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uZnVsbE5hbWUgPSB1c2VyLmZ1bGxOYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnJvb3RDb250ZXh0LmZpcmVFdmVudChDb21DdHhDb25zdGFudHMuUk9PVC5DSEFUX0RBVEFfTE9BREVELCB0cnVlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzY3JvbGxUb0JvdHRvbShzcGVlZCA9IDAsIGZvcmNlID0gZmFsc2UsIHNlbnQpIHtcclxuICAgICAgICBpZiAoIXRoaXMubW9kZWwuc2Nyb2xsaW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm9vdENvbnRleHQuZmlyZUV2ZW50KENvbUN0eENvbnN0YW50cy5ST09ULkNIQVRfSEFTX05FV19NRVNTQUdFLCB7IHNwZWVkLCBmb3JjZTogdHJ1ZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc2VudCAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgdGhpcy5yb290Q29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuQ0hBVF9IQVNfTkVXX01FU1NBR0UsIHsgc3BlZWQsIGZvcmNlIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBhcHBlbmRNZXNzYWdlKG1lc3NhZ2UsIHR5cGUsIHN0YXR1cywgY3JlYXRlZEJ5LCBhdHRhY2htZW50cyA9IFtdLCBjb3JyZWxhdGlvbklkID0gJycsIHNlbnQpIHtcclxuICAgICAgICBsZXQgZnVsbE5hbWUgPSAnJztcclxuICAgICAgICBsZXQgYXZhdGFyID0gJyc7XHJcblxyXG4gICAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLl91c2VyU2VydmljZS5nZXRCYXNpY1VzZXJJbmZvQnlVc2VyTmFtZShjcmVhdGVkQnkpO1xyXG4gICAgICAgIGZ1bGxOYW1lID0gdXNlci5mdWxsTmFtZSA/PyAnJztcclxuICAgICAgICBhdmF0YXIgPSB1c2VyLmF2YXRhciA/PyAnJztcclxuXHJcbiAgICAgICAgaWYgKGF0dGFjaG1lbnRzICYmIGF0dGFjaG1lbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgY2xvbmVkQXR0YWNobWVudCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYXR0YWNobWVudHMpKTtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5kYXRhU291cmNlLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgY3JlYXRlZDogbmV3IERhdGUoKSxcclxuICAgICAgICAgICAgICAgIGNyZWF0ZWRCeTogY3JlYXRlZEJ5LFxyXG4gICAgICAgICAgICAgICAgZnVsbE5hbWU6IGZ1bGxOYW1lLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxyXG4gICAgICAgICAgICAgICAgYXZhdGFyOiBhdmF0YXIsXHJcbiAgICAgICAgICAgICAgICBhdHRhY2htZW50czogY2xvbmVkQXR0YWNobWVudCxcclxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGNvcnJlbGF0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICBpc0ZpcnN0TWVzc2FnZUZsb3c6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgaXNMYXN0TWVzc2FnZUZsb3c6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgc2VudDogc2VudFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVGaXJzdE9yTGFzdE1lc3NhZ2UoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChtZXNzYWdlICYmIG1lc3NhZ2UudHJpbSgpICE9ICcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YVNvdXJjZS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGNyZWF0ZWQ6IG5ldyBEYXRlKCksXHJcbiAgICAgICAgICAgICAgICBjcmVhdGVkQnk6IGNyZWF0ZWRCeSxcclxuICAgICAgICAgICAgICAgIGZ1bGxOYW1lOiBmdWxsTmFtZSxcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IG1lc3NhZ2UsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXHJcbiAgICAgICAgICAgICAgICBhdmF0YXI6IGF2YXRhcixcclxuICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGNvcnJlbGF0aW9uSWQsXHJcbiAgICAgICAgICAgICAgICBpc0ZpcnN0TWVzc2FnZUZsb3c6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgaXNMYXN0TWVzc2FnZUZsb3c6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgc2VudDogc2VudFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVGaXJzdE9yTGFzdE1lc3NhZ2UoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsLmRhdGFTb3VyY2U7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlRmlyc3RPckxhc3RNZXNzYWdlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmRhdGFTb3VyY2UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBsZW5ndGggPSB0aGlzLm1vZGVsLmRhdGFTb3VyY2UubGVuZ3RoO1xyXG4gICAgICAgICAgICBpZiAobGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGFTb3VyY2VbMF0uaXNGaXJzdE1lc3NhZ2VGbG93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRCeSA9IHRoaXMubW9kZWwuZGF0YVNvdXJjZVtsZW5ndGggLSAyXS5jcmVhdGVkQnk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjcmVhdGVkQnkyID0gdGhpcy5tb2RlbC5kYXRhU291cmNlW2xlbmd0aCAtIDFdLmNyZWF0ZWRCeTtcclxuICAgICAgICAgICAgICAgIGlmIChjcmVhdGVkQnkgIT09IGNyZWF0ZWRCeTIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmRhdGFTb3VyY2VbbGVuZ3RoIC0gMl0uaXNMYXN0TWVzc2FnZUZsb3cgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZGF0YVNvdXJjZVtsZW5ndGggLSAxXS5pc0ZpcnN0TWVzc2FnZUZsb3cgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5kYXRhU291cmNlW2xlbmd0aCAtIDJdLmlzTGFzdE1lc3NhZ2VGbG93ID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5kYXRhU291cmNlW2xlbmd0aCAtIDFdLmlzTGFzdE1lc3NhZ2VGbG93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVNZXNzYWdlKGNvcnJlbGF0aW9uSWQsIG1lc3NhZ2UpIHtcclxuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5tb2RlbC5kYXRhU291cmNlLmZpbmQoeCA9PiB4LmNvcnJlbGF0aW9uSWQgPT09IGNvcnJlbGF0aW9uSWQpO1xyXG5cclxuICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5hdHRhY2htZW50cyAmJiBtZXNzYWdlLmF0dGFjaG1lbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uYXR0YWNobWVudHMgPSBtZXNzYWdlLmF0dGFjaG1lbnRzO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpdGVtLmlkID0gbWVzc2FnZS5pZDtcclxuICAgICAgICAgICAgaXRlbS5zZW50ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlTWVzc2FnZVN0YXR1cyhtZXNzYWdlLCBzdGF0dXMsIGVycm9yTWVzc2FnZSA9ICcnKSB7XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMubW9kZWwuZGF0YVNvdXJjZS5maW5kKHggPT4geC5tZXNzYWdlID09PSBtZXNzYWdlKTtcclxuICAgICAgICBpdGVtLnN0YXR1cyA9IHN0YXR1cztcclxuICAgICAgICBpdGVtLmVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXREaXNwbGF5U3RhdHVzKHN0YXR1cykge1xyXG4gICAgICAgIHN3aXRjaCAoc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ3NlbmRpbmcnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICfEkGFuZyBn4butaSc7XHJcbiAgICAgICAgICAgIGNhc2UgJ3NlbnQnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICfEkMOjIGfhu61pJztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgLy8gdW5zY3JpYmxlIHNpZ25hbHJcclxuICAgICAgICB0aGlzLl9zaWduYWxyU2VydmljZS51blN1YnNjcmliZVZpZXdDb2RlKG51bGwsIHRoaXMudG9waWMpO1xyXG4gICAgICAgIHRoaXMucm9vdENvbnRleHQudW5TdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuQ0hBVF9NRVNTQUdFX1NFTkRJTkcpO1xyXG4gICAgICAgIHRoaXMucm9vdENvbnRleHQudW5TdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuQ0hBVF9NRVNTQUdFX1NFTlQpO1xyXG4gICAgICAgIHRoaXMucm9vdENvbnRleHQudW5TdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuQ0hBVF9MT0FEX01PUkUpO1xyXG4gICAgICAgIHRoaXMucm9vdENvbnRleHQudW5TdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuQ0hBVF9TQ1JPTExJTkcpO1xyXG4gICAgICAgIHRoaXMucm9vdENvbnRleHQudW5TdWJzY3JpYmUoQ29tQ3R4Q29uc3RhbnRzLlJPT1QuQ0hBVF9IQVNfTkVXX01FU1NBR0VfTk9UX1VQREFURUQpO1xyXG5cclxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFR5cGVPZk1lc3NhZ2UoY3JlYXRlZEJ5KSB7XHJcbiAgICAgICAgcmV0dXJuIGNyZWF0ZWRCeSA9PT0gdGhpcy5jdXJyZW50VXNlci51c2VyTmFtZSA/ICdvd24nIDogJ2Zyb20nO1xyXG4gICAgfVxyXG5cclxuICAgIHRyYWNrQnlGdW5jKGluZGV4LCBpdGVtKSB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW0uaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgdHJhY2tBdHRhY2htZW50QnlGdW5jKGluZGV4LCBpdGVtKSB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW0uZmlsZU5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3Qgb2JqZWN0RGF0YSA9IHRoaXMuZ2V0SW1hZ2VDbGlwYm9hcmREYXRhKGV2ZW50KTtcclxuICAgICAgICBpZiAob2JqZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGVsLmF0dGFjaG1lbnRzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2ltYWdlJyxcclxuICAgICAgICAgICAgICAgIHVybDogb2JqZWN0RGF0YS51cmwsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBvYmplY3REYXRhLmJsb2IsXHJcbiAgICAgICAgICAgICAgICBmaWxlTmFtZTogdGhpcy5fY29tbW9uU2VydmljZS5ndWlkKCkgKyAnLnBuZydcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldEltYWdlQ2xpcGJvYXJkRGF0YShlKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlLmNsaXBib2FyZERhdGEuaXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGUuY2xpcGJvYXJkRGF0YS5pdGVtc1tpXTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0udHlwZS5pbmRleE9mKCdpbWFnZScpICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbWFnZU9iaiA9IGl0ZW0uZ2V0QXNGaWxlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW1hZ2VPYmouc2l6ZSA8IHRoaXMubW9kZWwubWF4RmlsZVNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB1cmw6IFVSTC5jcmVhdGVPYmplY3RVUkwoaW1hZ2VPYmopLCBibG9iOiBpbWFnZU9iaiB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHZpZXdPckRvd25sb2FkRmlsZShldnQsIGF0dGFjaG1lbnRJdGVtKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2ZpbGVTZXJ2aWNlLmlzU3VwcG9ydGVkVmlld09ubGluZShhdHRhY2htZW50SXRlbS5maWxlTmFtZSkpIHtcclxuICAgICAgICAgICAgLy8gdGhpcy5tb2RlbC5maWxlVmlld2VyLmRhdGEgPSB7fTtcclxuICAgICAgICAgICAgLy8gdGhpcy5tb2RlbC5maWxlVmlld2VyLmRhdGEuZmlsZUlkID0gYXR0YWNobWVudEl0ZW0uaWQ7XHJcbiAgICAgICAgICAgIC8vIHRoaXMubW9kZWwuZmlsZVZpZXdlci5kYXRhLmZpbGVOYW1lID0gYXR0YWNobWVudEl0ZW0uZmlsZU5hbWU7XHJcbiAgICAgICAgICAgIC8vIHRoaXMubW9kZWwuZmlsZVZpZXdlci5kYXRhLmlzRmlsZVZlcnNpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgLy8gdGhpcy5tb2RlbC5maWxlVmlld2VyLnNob3cgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmZpbGVWaWV3ZXJNb2RlbCA9IHtcclxuICAgICAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgICBmaWxlSWQ6IGF0dGFjaG1lbnRJdGVtLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiBhdHRhY2htZW50SXRlbS5maWxlTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICBpc0ZpbGVWZXJzaW9uOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBzaG93RWRpdEZvcm06IHRydWUsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0b3AubG9jYXRpb24uaHJlZiA9IGF3YWl0IHRoaXMuZ2V0RG93bmxvYWRMaW5rKGF0dGFjaG1lbnRJdGVtKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGdldERvd25sb2FkTGluayhmaWxlKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBtb2RlbCA9IG5ldyBHZW5lcmF0ZUxpbmtEb3dubG9hZERUTygpO1xyXG4gICAgICAgICAgICBtb2RlbC5maWxlSWQgPSBmaWxlLmlkO1xyXG4gICAgICAgICAgICBtb2RlbC5pc0ZpbGVWZXJzaW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuX2ZpbGVTZXJ2aWNlLmdlbmVyYXRlTGlua0Rvd25sb2FkKG1vZGVsKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvd25sb2FkVXJsID0gdGhpcy5fZmlsZVNlcnZpY2UuZ2V0QW5vbnltb3VzRG93bmxvYWRVcmwocmVzcG9uc2UuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkb3dubG9hZFVybCk7XHJcbiAgICAgICAgICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZ2V0IGRvd25sb2FkIGxpbmsnKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGJyb3dzZUZpbGVGcm9tUGVyc29uYWwoKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGJyb3dzZUZpbGVGcm9tQ29tcHV0ZXIoKSB7XHJcbiAgICAgICAgdGhpcy5maWxlRWxlbWVudC5hZHZhbmNlZEZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25TZWxlY3RGaWxlRnJvbUNvbXB1dGVyKGV2dCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChldnQuZmlsZXMgJiYgZXZ0LmZpbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBldnQuZmlsZXMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBldnQuZmlsZXNbaW5kZXhdLm5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuX2NvbW1vblNlcnZpY2UuaXNJbWFnZShmaWxlTmFtZSkgPyAnaW1hZ2UnIDogJ2ZpbGUnO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnRJdGVtOiBhbnkgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGV2dC5maWxlc1tpbmRleF0sIGZpbGVOYW1lOiBmaWxlTmFtZVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2htZW50SXRlbS50eXBlID09ICdpbWFnZScpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudEl0ZW0udXJsID0gZXZ0LmZpbGVzW2luZGV4XS5vYmplY3RVUkwuY2hhbmdpbmdUaGlzQnJlYWtzQXBwbGljYXRpb25TZWN1cml0eTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5hdHRhY2htZW50cy5wdXNoKGF0dGFjaG1lbnRJdGVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdlcnJvciBvbiBwcm9jZXNzIHNlbGVjdCBmaWxlIGNvbXB1dGVyJywgZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyB0aGlzLmZpbGVFbGVtZW50LmNsZWFyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlQXR0YWNobWVudChpdGVtKSB7XHJcbiAgICAgICAgY29uc3QgaW5kID0gdGhpcy5tb2RlbC5hdHRhY2htZW50cy5maW5kSW5kZXgoeCA9PiB4LnVybCA9PT0gaXRlbS51cmwpO1xyXG4gICAgICAgIHRoaXMubW9kZWwuYXR0YWNobWVudHMuc3BsaWNlKGluZCwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFzQXR0YWNobWVudChpdGVtKSB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW0uYXR0YWNobWVudHMgJiYgaXRlbS5hdHRhY2htZW50cy5sZW5ndGggPiAwO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWRJbWcoZXZ0LCBwYXJlbnRJbmRleDogbnVtYmVyLCBpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5tb2RlbC5pbWdbYCR7cGFyZW50SW5kZXh9JHtpbmRleH1gXSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5tb2RlbC5pbWdbYCR7cGFyZW50SW5kZXh9d2lkdGgke2luZGV4fWBdID0gKGV2dC50YXJnZXQud2lkdGggKyAzMikgKyAncHgnO1xyXG4gICAgfVxyXG5cclxuICAgIGluVGhlU2FtZVRpbWUoaTogbnVtYmVyLCBpdGVtOiBhbnksIGRhdGFTb3VyY2U6IGFueSkge1xyXG4gICAgICAgIGlmIChpIDwgZGF0YVNvdXJjZS5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGQxID0gbmV3IERhdGUoZGF0YVNvdXJjZVtpICsgMV0uY3JlYXRlZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGQyID0gbmV3IERhdGUoaXRlbS5jcmVhdGVkKTtcclxuICAgICAgICAgICAgY29uc3QgbXMgPSBkMS5nZXRUaW1lKCkgLSBkMi5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBtcyA8IDMwMDAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcGluTWVzc2FnZShpdGVtKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubW9kZWwucGlubmVkTWVzc2FnZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5tb2RlbC5waW5uZWRNZXNzYWdlLmlkICE9IGl0ZW0uaWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93Q29uZmlybSgnQuG6oW4gY8OzIGNo4bqvYyBjaOG6r24gbXXhu5FuIGdoaW0gdGluIG5o4bqvbiBuw6B5PyBUaW4gbmjhuq9uIMSRw6MgZ2hpbSB0csaw4bubYyDEkcOzIHPhur0gxJHGsOG7o2MgYuG7jyBnaGltLicpLnRoZW4ocnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghcnMpIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvUGluKGl0ZW0sIGl0ZW0uaWQsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRvUGluKGl0ZW0sIGl0ZW0uaWQsIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kb1BpbihpdGVtLCBpdGVtLmlkLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZG9QaW4oaXRlbSwgaWQsIHBpbm5lZCkge1xyXG4gICAgICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSB0aGlzLl9jb21tb25TZXJ2aWNlLmd1aWQoKTtcclxuICAgICAgICB0aGlzLm1vZGVsLmNvcnJlbGF0aW9uSWRzLnB1c2goY29ycmVsYXRpb25JZCk7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZUJvYXJkU2VydmljZS5waW5NZXNzYWdlKGlkLCBwaW5uZWQsIGNvcnJlbGF0aW9uSWQpLnRoZW4ocnMgPT4ge1xyXG4gICAgICAgICAgICBpZiAocGlubmVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnBpbm5lZE1lc3NhZ2UgPSBpdGVtO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5waW5uZWRNZXNzYWdlID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEN1cnJlbnRVc2VyQXZhdGFyKGF2YXRhcjogYW55KSB7XHJcbiAgICAgICAgaWYgKGF2YXRhciAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBgJHt0aGlzLmZpbGVBcGl9L2ZpbGUvcHVibGljLyR7YXZhdGFyfS9Eb3dubG9hZGA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0QXZhdGFyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhZGRQZW9wbGUoKSB7XHJcbiAgICAgICAgdGhpcy51c2VyUGlja2VyRm9ybS5zZWxlY3RlZFZhbHVlID0gdGhpcy5wZW9wbGVSZWxhdGVkVXNlcnM7XHJcbiAgICAgICAgdGhpcy51c2VyUGlja2VyRm9ybS5tdWx0aXBsZSA9IHRoaXMubXVsdGlwbGU7XHJcbiAgICAgICAgdGhpcy51c2VyUGlja2VyRm9ybS5zaG93ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBxdWlja05vdGUoaXRlbTogYW55KSB7XHJcbiAgICAgICAgY29uc3QgdXNlclJlc3VsdCA9IGF3YWl0IHRoaXMuX3VzZXJTZXJ2aWNlLmdldEJhc2ljVXNlckluZm8oaXRlbS5jcmVhdGVkQnkpO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5kYXRhLm5vdGVEYXRhTW9kZWwgPSA8YW55PntcclxuICAgICAgICAgICAgZWRpdEZvcm1Nb2RlbDogPGFueT57XHJcbiAgICAgICAgICAgICAgICBzaG93RWRpdEZvcm06IHRydWUsXHJcbiAgICAgICAgICAgICAgICBzaG93UXVpY2tOb3RlRm9ybTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHBvcHVwU2l6ZTogPGFueT57fSxcclxuICAgICAgICAgICAgICAgIGRhdGE6IDxhbnk+e1xyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0uY29udGVudDEsXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogJzxiPicgKyB1c2VyUmVzdWx0LmZ1bGxOYW1lICsgJzwvYj4nICsgJyDEkcOjIGNoYXQgdOG6oWkgY8O0bmcgdmnhu4djICdcclxuICAgICAgICAgICAgICAgICAgICAgICAgKyAnPGI+JyArIHRoaXMubW9kZWwudGFza05hbWUgKyAnPC9iPicgKyAnIHbhu5tpIG7hu5lpIGR1bmcgJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICArICc8Yj4nICsgaXRlbS5jb250ZW50MSArICc8L2I+JyArICcgdsOgbyBsw7pjICcgKyBtb21lbnQobmV3IERhdGUoaXRlbS5jcmVhdGVkKSkuZm9ybWF0KCdZWVlZLU1NLUREIGhoOm1tOnNzIEEnKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLm1vZGVsLmVkaXRGb3JtTW9kZWwuc2hvd1F1aWNrTm90ZUZvcm0gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2hvd0FkZE5vdGVGb3JtID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBvbk1vdXNlVXAoZXZlbnQpIHtcclxuICAgICAgICBldmVudC5jYW5jZWxCdWJibGUgPSB0cnVlO1xyXG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZENsYXNzVG9NZXNzYWdlKGl0ZW06IGFueSwgaXNQaW5uZWRNZXNzYWdlOiBib29sZWFuKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgc3R5bGVDbGFzcyA9ICcnO1xyXG4gICAgICAgIGlmICghaXNQaW5uZWRNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLmlzRmlyc3RNZXNzYWdlRmxvdykge1xyXG4gICAgICAgICAgICAgICAgc3R5bGVDbGFzcyA9ICdmaXJzdCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoaXRlbS5pc0xhc3RNZXNzYWdlRmxvdykge1xyXG4gICAgICAgICAgICAgICAgc3R5bGVDbGFzcyA9ICdsYXN0JztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3MgPSAnbWlkZGxlJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXRlbS5zZW50ID09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHN0eWxlQ2xhc3MgPSAnc2VuZGluZyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdHlsZUNsYXNzO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==