tnx-shared 5.1.174 → 5.1.178

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 (51) hide show
  1. package/bundles/tnx-shared.umd.js +1639 -160
  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/tree-list-base.d.ts +125 -0
  6. package/classes/base/tree-list-base.d.ts.map +1 -0
  7. package/classes/public-function.d.ts +1 -1
  8. package/components/check-box-list/check-box-list.component.d.ts.map +1 -1
  9. package/components/crud/crud-form/crud-form.component.d.ts +4 -3
  10. package/components/crud/crud-form/crud-form.component.d.ts.map +1 -1
  11. package/components/crud/tree-table/tree-table.component.d.ts +71 -0
  12. package/components/crud/tree-table/tree-table.component.d.ts.map +1 -0
  13. package/components/crud/tree-table/tree-table.component.ngfactory.d.ts.map +1 -0
  14. package/components/crud/tree-table/tree-table.component.scss.shim.ngstyle.d.ts.map +1 -0
  15. package/components/tn-app-notification/tn-app-notification.component.d.ts +3 -3
  16. package/components/tn-app-notification/tn-app-notification.component.d.ts.map +1 -1
  17. package/configs/component-context.constant.d.ts +5 -0
  18. package/configs/component-context.constant.d.ts.map +1 -1
  19. package/directives/primeng/tn-table.directive.d.ts +9 -0
  20. package/directives/primeng/tn-table.directive.d.ts.map +1 -1
  21. package/esm2015/classes/base/tree-list-base.js +746 -0
  22. package/esm2015/components/chat/chat-box/chat-box.component.js +1 -1
  23. package/esm2015/components/chat/chat-send-message-box/chat-send-message-box.component.js +1 -1
  24. package/esm2015/components/check-box-list/check-box-list.component.js +60 -19
  25. package/esm2015/components/crud/crud-form/crud-form.component.js +6 -2
  26. package/esm2015/components/crud/tree-table/tree-table.component.js +377 -0
  27. package/esm2015/components/tn-app-notification/tn-app-notification.component.js +32 -22
  28. package/esm2015/configs/component-context.constant.js +6 -1
  29. package/esm2015/directives/primeng/tn-table.directive.js +44 -1
  30. package/esm2015/public-api.js +2 -1
  31. package/esm2015/services/base.service.js +11 -1
  32. package/esm2015/services/crud.service.js +1 -1
  33. package/esm2015/services/notification.service.js +5 -2
  34. package/esm2015/tnx-shared.js +119 -118
  35. package/esm2015/tnx-shared.module.js +5 -2
  36. package/fesm2015/tnx-shared.js +1243 -41
  37. package/fesm2015/tnx-shared.js.map +1 -1
  38. package/package.json +2 -2
  39. package/public-api.d.ts +1 -0
  40. package/public-api.d.ts.map +1 -1
  41. package/services/base.service.d.ts +2 -0
  42. package/services/base.service.d.ts.map +1 -1
  43. package/services/crud.service.d.ts.map +1 -1
  44. package/services/notification.service.d.ts +1 -0
  45. package/services/notification.service.d.ts.map +1 -1
  46. package/tnx-shared.d.ts +118 -117
  47. package/tnx-shared.d.ts.map +1 -1
  48. package/tnx-shared.metadata.json +1 -1
  49. package/tnx-shared.module.d.ts +3 -2
  50. package/tnx-shared.module.d.ts.map +1 -1
  51. package/tnx-shared.module.ngfactory.d.ts.map +1 -1
@@ -0,0 +1,746 @@
1
+ import { __awaiter } from "tslib";
2
+ import { DatePipe } from '@angular/common';
3
+ import { ChangeDetectorRef, Directive, Injector, Input, ViewChild } from '@angular/core';
4
+ import { ActivatedRoute, Router } from '@angular/router';
5
+ import { TranslateService } from '@ngx-translate/core';
6
+ import { TreeTableComponent } from '../../components/crud/tree-table/tree-table.component';
7
+ import { EntityPermissionService } from '../../components/entity-permission/services.cs/entity-permission.service';
8
+ import { StateMachinesService } from '../../components/statemachines/services/statemachines.service';
9
+ import { EntityWorkflowHistoryService } from '../../components/workflow/services/entity-workflow-history.service';
10
+ import { EntityWorkflowSettingService } from '../../components/workflow/services/entity-workflow-setting.service';
11
+ import { WorkflowPermissionDetailService } from '../../components/workflow/services/workflow-permission-detail.service';
12
+ import { WorkflowSettingsService } from '../../components/workflow/services/workflow-settings.service';
13
+ import { ComCtxConstants } from '../../configs/component-context.constant';
14
+ import { CongViecService } from '../../congviec/congviec/services/congviec.service';
15
+ import { PermissionBase } from '../../enums/common';
16
+ import { Filter, GridInfo } from '../../models/grid-info';
17
+ import { CommonService } from '../../services/common.service';
18
+ import { CrudService } from '../../services/crud.service';
19
+ import { CustomRouterService } from '../../services/custom-router.service';
20
+ import { ExportService } from '../../services/export.service';
21
+ import { ListHelperService } from '../../services/list-helper.service';
22
+ import { MasterDataService } from '../../services/master-data.service';
23
+ import { ModuleConfigService } from '../../services/module-config.service';
24
+ import { NotifierService } from '../../services/notifier.service';
25
+ import { UserService } from '../../services/user.service';
26
+ import { EnumGetRefType, FormState, KeyFieldGetRefType, KeyFlashShow, WorkflowFieldStateCode } from '../constants';
27
+ import { CrudFormData, CrudListData, CrudListSetting, DropdownOptions, Operator } from '../form-schema';
28
+ import { ComponentBase } from './component-base';
29
+ export class TreeListBase extends ComponentBase {
30
+ constructor(_injector) {
31
+ super(_injector);
32
+ this.notConfigBaseServiceMessage = 'Chưa cấu hình CRUD base service';
33
+ this.environment = {};
34
+ this.setting = new CrudListSetting();
35
+ this.model = new CrudListData();
36
+ this.formModel = new CrudFormData();
37
+ this.scopeDataEdit = {};
38
+ this.showDetailForm = false;
39
+ this.countReady = 0;
40
+ this.hasCrudList = true;
41
+ this.customGetData = false;
42
+ this.readyToTrinhKy = false;
43
+ this.plusUrl = '';
44
+ this.fieldParent = 'idParent';
45
+ this.isCrudList = false;
46
+ this.levelOpen = 1;
47
+ this._notifierService = this._injector.get(NotifierService);
48
+ this._activatedRoute = this._injector.get(ActivatedRoute);
49
+ this._router = this._injector.get(Router);
50
+ this._customRouterService = this._injector.get(CustomRouterService);
51
+ this._listHelperService = this._injector.get(ListHelperService);
52
+ this._commonService = this._injector.get(CommonService);
53
+ this._translateService = this._injector.get(TranslateService);
54
+ this._exportService = this._injector.get(ExportService);
55
+ this._crudService = this._injector.get(CrudService);
56
+ this._datePipe = this._injector.get(DatePipe);
57
+ this._cd = this._injector.get(ChangeDetectorRef);
58
+ this._userService = this._injector.get(UserService);
59
+ this._masterDataService = this._injector.get(MasterDataService);
60
+ this._entityWorkflowSettingService = this._injector.get(EntityWorkflowSettingService);
61
+ this._entityWorkflowHistoryService = this._injector.get(EntityWorkflowHistoryService);
62
+ this._entityPermissionService = this._injector.get(EntityPermissionService);
63
+ this._workflowSettingService = this._injector.get(WorkflowSettingsService);
64
+ this._workflowPermissionDetailService = this._injector.get(WorkflowPermissionDetailService);
65
+ this._stateMachinesService = this._injector.get(StateMachinesService);
66
+ this._congViecServiceInBase = this._injector.get(CongViecService);
67
+ }
68
+ set content(content) {
69
+ const beforeValue = this.crudList;
70
+ if (content) {
71
+ this.crudList = content;
72
+ if (!beforeValue) {
73
+ this.countReady++;
74
+ if (this.countReady < 2) {
75
+ return;
76
+ }
77
+ this.processData();
78
+ }
79
+ }
80
+ }
81
+ ngOnInit() {
82
+ this.model.baseReady = false;
83
+ if (this.setting.cols) {
84
+ this.setting.cols = this.setting.cols.filter(q => !q.removeOnInit);
85
+ }
86
+ this.mergeInfoToColumnSchema();
87
+ this.generateFieldSearchText();
88
+ if (!this.setting.baseService) {
89
+ this._notifierService.showWarning(this.notConfigBaseServiceMessage);
90
+ }
91
+ else {
92
+ if (!this.setting.hiddenSettingWorkflow
93
+ || !this.setting.hiddenSettingWorkflowNew) {
94
+ this.setting.baseService.useWorkflow = true;
95
+ }
96
+ this.registerGlobalService(this.setting.baseService);
97
+ }
98
+ const moduleConfigService = this._injector.get(ModuleConfigService);
99
+ this.environment = moduleConfigService.getConfig().environment;
100
+ if (this.environment.clientDomain
101
+ && this.setting.baseService
102
+ && this.environment.clientDomain[this.setting.baseService.serviceCode]
103
+ && !this.setting.targetPath) {
104
+ this.setting.targetPath = `${this.environment.clientDomain[this.setting.baseService.serviceCode]}/${this.setting.baseService.entityName.toLowerCase()}/detail`;
105
+ }
106
+ this.getMenuButtons = this.getMenuButtons.bind(this);
107
+ }
108
+ registerGlobalService(service) {
109
+ const key = service.getKeyWorkflowSetting();
110
+ this._entityWorkflowSettingService.registerService(key, service);
111
+ this._entityWorkflowHistoryService.registerService(key, service);
112
+ this._entityPermissionService.registerService(key, service);
113
+ this._workflowSettingService.registerService(key, service);
114
+ }
115
+ loadItemFromQueryParam() {
116
+ if (this.loadDetailFromQueryParam === undefined || this.loadDetailFromQueryParam === true) {
117
+ let idInQueryString = null;
118
+ let pid = null; // permission Id được người khác share
119
+ if (this._activatedRoute.snapshot
120
+ && this._activatedRoute.snapshot.queryParams) {
121
+ idInQueryString = this._activatedRoute.snapshot.queryParams.id || this._activatedRoute.snapshot.queryParams.entityKey;
122
+ pid = this._activatedRoute.snapshot.queryParams.pid;
123
+ }
124
+ if (pid) {
125
+ this.loadDetailPid(pid);
126
+ }
127
+ else if (idInQueryString) {
128
+ // get detail data
129
+ this.setting.baseService.getDetailWithPermission(idInQueryString)
130
+ .then(res => {
131
+ if (!res.data) {
132
+ this._notifierService.showWarning('Không tìm thấy bản ghi cần xem chi tiết');
133
+ }
134
+ if ((res.data.basePermission & PermissionBase.EDIT) == PermissionBase.EDIT
135
+ || (res.data.basePermission & PermissionBase.READ) == PermissionBase.READ) {
136
+ this._edit(res.data);
137
+ }
138
+ else {
139
+ this._notifierService.showWarning('Bạn không có quyền xem bản ghi');
140
+ }
141
+ }).catch(err => {
142
+ console.error('error on get detail from querystring', err);
143
+ this._notifierService.showWarning('Không tìm thấy bản ghi cần xem chi tiết');
144
+ });
145
+ }
146
+ }
147
+ }
148
+ loadDetailPid(pid) {
149
+ this.setting.baseService.getDetailByPid(pid)
150
+ .then(res => this.handleResponse(res, '', f => {
151
+ if (!res.data) {
152
+ this._notifierService.showWarning('Không tìm thấy bản ghi cần xem chi tiết');
153
+ }
154
+ if ((res.data.basePermission & PermissionBase.EDIT) == PermissionBase.EDIT
155
+ || (res.data.basePermission & PermissionBase.READ) == PermissionBase.READ) {
156
+ res.data.pid = pid;
157
+ res.data.basePermissionByPid = res.data.basePermission;
158
+ this._edit(res.data);
159
+ }
160
+ else {
161
+ this._notifierService.showWarning('Bạn không có quyền xem bản ghi');
162
+ }
163
+ })).catch(err => {
164
+ console.error('error on get detail from querystring', err);
165
+ this._notifierService.showWarning('Không tìm thấy bản ghi cần xem chi tiết');
166
+ });
167
+ }
168
+ ngAfterViewInit() {
169
+ this.handleAfterViewInit();
170
+ }
171
+ ngOnDestroy() {
172
+ super.ngOnDestroy();
173
+ clearTimeout(this.loadingTimeout);
174
+ }
175
+ handleAfterViewInit() {
176
+ return __awaiter(this, void 0, void 0, function* () {
177
+ this.countReady++;
178
+ if (this.countReady > 1) {
179
+ this.model.baseReady = true;
180
+ this._triggerProcessData();
181
+ }
182
+ this.loadItemFromQueryParam();
183
+ });
184
+ }
185
+ getMenuButtons(rowData) {
186
+ this.rowDataCurrent = rowData;
187
+ return [];
188
+ }
189
+ _add(evt) {
190
+ return __awaiter(this, void 0, void 0, function* () {
191
+ const resultValidate = yield this.validateAdd();
192
+ if (!resultValidate) {
193
+ return;
194
+ }
195
+ this.formModel.data = {};
196
+ this.formModel.formState = FormState.ADD;
197
+ yield this.beforeAdd();
198
+ this.setting.popupHeader = `Thêm mới ${this.setting.objectName}`;
199
+ this.setting.maskClass = null;
200
+ this.showDetailForm = true;
201
+ });
202
+ }
203
+ validateAdd() {
204
+ return __awaiter(this, void 0, void 0, function* () {
205
+ return true;
206
+ });
207
+ }
208
+ beforeAdd() {
209
+ return __awaiter(this, void 0, void 0, function* () {
210
+ });
211
+ }
212
+ _view(rowData) {
213
+ return __awaiter(this, void 0, void 0, function* () {
214
+ if (rowData.basePermission & PermissionBase.EDIT) {
215
+ this._edit(rowData);
216
+ }
217
+ else {
218
+ this.formModel.formState = FormState.VIEW;
219
+ yield this.beforeView();
220
+ this.setting.popupHeader = `Chi tiết ${this.setting.objectName}`;
221
+ this.setting.maskClass = null;
222
+ this.formModel.data = this.cloneData(rowData);
223
+ yield this.modifyViewModel(rowData);
224
+ this.showDetailForm = true;
225
+ }
226
+ });
227
+ }
228
+ beforeView() {
229
+ return __awaiter(this, void 0, void 0, function* () {
230
+ });
231
+ }
232
+ modifyViewModel(rowData) {
233
+ return __awaiter(this, void 0, void 0, function* () {
234
+ });
235
+ }
236
+ _copyLinkMultiple() {
237
+ return __awaiter(this, void 0, void 0, function* () {
238
+ const paths = [];
239
+ for (const item of this.model.selectedItems) {
240
+ paths.push(yield this.getCopyPath(this.setting, item));
241
+ }
242
+ this._commonService.copyByStorage(paths.join('\r\n'));
243
+ this._notifierService.showSuccess('Đã sao chép các liên kết đã chọn');
244
+ });
245
+ }
246
+ _copyLink(rowData) {
247
+ return __awaiter(this, void 0, void 0, function* () {
248
+ const path = yield this.getCopyPath(this.setting, rowData);
249
+ this._commonService.copyByStorage(path);
250
+ this._notifierService.showSuccess('Đã sao chép liên kết');
251
+ });
252
+ }
253
+ _edit(rowData, scopeDataEdit = {}) {
254
+ return __awaiter(this, void 0, void 0, function* () {
255
+ const flashShow = rowData[KeyFlashShow];
256
+ delete rowData[KeyFlashShow];
257
+ yield this.beforeEdit();
258
+ this.formModel.formState = FormState.EDIT;
259
+ this.setting.popupHeader = `Chi tiết ${this.setting.objectName}`;
260
+ this.setting.maskClass = flashShow ? 'hide' : null;
261
+ this.scopeDataEdit = scopeDataEdit;
262
+ this.formModel.data = this.cloneData(rowData);
263
+ yield this.modifyEditModel(rowData);
264
+ this.formModel.data[KeyFlashShow] = flashShow;
265
+ this.showDetailForm = true;
266
+ });
267
+ }
268
+ beforeEdit() {
269
+ return __awaiter(this, void 0, void 0, function* () {
270
+ });
271
+ }
272
+ modifyEditModel(rowData) {
273
+ return __awaiter(this, void 0, void 0, function* () {
274
+ });
275
+ }
276
+ cloneData(rowData) {
277
+ return {
278
+ pid: rowData.pid,
279
+ basePermissionByPid: rowData.basePermissionByPid,
280
+ id: rowData[this.setting.entityKey],
281
+ basePermission: rowData.basePermission
282
+ };
283
+ }
284
+ getPromiseDeleteItem(rowData) {
285
+ return this.setting.baseService.delete(rowData.id);
286
+ }
287
+ _delete(rowData) {
288
+ if (rowData.__disableDelete) {
289
+ return;
290
+ }
291
+ this._notifierService.showDeleteConfirm().then(rs => {
292
+ if (!rs) {
293
+ return;
294
+ }
295
+ if (this.setting.baseService) {
296
+ this.getPromiseDeleteItem(rowData)
297
+ .then(response => {
298
+ if (response.success) {
299
+ if (this.setting.showVersionButton) {
300
+ this.context.fireEvent(ComCtxConstants.COMMON.RELOAD_DATA_VERSION, {}, true);
301
+ }
302
+ else {
303
+ this._triggerProcessData();
304
+ }
305
+ this._notifierService.showDeleteDataSuccess();
306
+ }
307
+ else {
308
+ this._notifierService.showWarningByResponse(response);
309
+ }
310
+ }, error => {
311
+ this._notifierService.showDeleteDataError();
312
+ });
313
+ }
314
+ });
315
+ }
316
+ getPromiseDeleteItems(items) {
317
+ const ids = items.map(x => x.id).join(',');
318
+ return this.setting.baseService.deleteMany(ids);
319
+ }
320
+ _deleteMultiple(items) {
321
+ this._notifierService.showDeleteConfirm().then(rs => {
322
+ if (!rs) {
323
+ return;
324
+ }
325
+ if (this.setting.baseService) {
326
+ this.getPromiseDeleteItems(items).then(response => {
327
+ if (response.success) {
328
+ this._triggerProcessData();
329
+ this._notifierService.showDeleteDataSuccess();
330
+ }
331
+ else {
332
+ this._notifierService.showWarningByResponse(response);
333
+ }
334
+ });
335
+ }
336
+ });
337
+ }
338
+ onBeforeCancel() {
339
+ }
340
+ _handleSaved() {
341
+ this.showDetailForm = false;
342
+ this._triggerProcessData();
343
+ }
344
+ _handleCancel($event) {
345
+ this.onBeforeCancel();
346
+ this.showDetailForm = false;
347
+ }
348
+ getEntityMetadata() {
349
+ return __awaiter(this, void 0, void 0, function* () {
350
+ try {
351
+ // if (this._entityMetadataService) {
352
+ // this.setting.entityMetadataSetting.data = this._entityMetadataService.getWf1Setting();
353
+ // return;
354
+ // } else {
355
+ // this.setting.entityMetadataService = this._injector.get(EntityMetadataService);
356
+ // this._entityMetadataService = this.setting.entityMetadataService;
357
+ // await this._entityMetadataService.load(this._baseService, this.context, true); // force load để đọc từ csdl
358
+ // this.setting.entityMetadataSetting.data = this._entityMetadataService.getWf1Setting();
359
+ // }
360
+ }
361
+ catch (e) {
362
+ console.error('Please include EntityMetadataService in provider of component');
363
+ }
364
+ return null;
365
+ });
366
+ }
367
+ reload() {
368
+ return __awaiter(this, void 0, void 0, function* () {
369
+ this.crudList.reload();
370
+ });
371
+ }
372
+ _triggerProcessData(gridInfo) {
373
+ return __awaiter(this, void 0, void 0, function* () {
374
+ yield this.processData(gridInfo);
375
+ });
376
+ }
377
+ processData(gridInfo) {
378
+ return __awaiter(this, void 0, void 0, function* () {
379
+ this.readyToTrinhKy = false;
380
+ if (this.hasCrudList) {
381
+ if (!this.crudList) {
382
+ return;
383
+ }
384
+ if (!gridInfo) {
385
+ gridInfo = this.crudList.getGridInfo();
386
+ }
387
+ }
388
+ else {
389
+ if (!gridInfo) {
390
+ gridInfo = new GridInfo({
391
+ pageInfo: {
392
+ page: 1,
393
+ pageSize: 999
394
+ },
395
+ filters: [],
396
+ sorts: []
397
+ });
398
+ }
399
+ }
400
+ this.getData(gridInfo);
401
+ });
402
+ }
403
+ modifyGridInfo(gridInfo) {
404
+ return __awaiter(this, void 0, void 0, function* () {
405
+ return true;
406
+ });
407
+ }
408
+ getData(gridInfo) {
409
+ return __awaiter(this, void 0, void 0, function* () {
410
+ if (this.setting.baseService && this.model.ready) {
411
+ this._markLoading();
412
+ gridInfo.modifyFilter(WorkflowFieldStateCode, filter => {
413
+ if (filter.value) {
414
+ let hasNullValue = false;
415
+ const restValues = [];
416
+ JSON.parse(filter.value).forEach(value => {
417
+ if (value === null) {
418
+ hasNullValue = true;
419
+ }
420
+ else {
421
+ restValues.push(value);
422
+ }
423
+ });
424
+ if (hasNullValue) {
425
+ if (restValues.length == 0) {
426
+ filter.operator = Operator.isNull;
427
+ return;
428
+ }
429
+ filter.logic = 'or';
430
+ filter.field = null;
431
+ filter.value = null;
432
+ filter.operator = null;
433
+ filter.filters = [
434
+ this.newFilter(WorkflowFieldStateCode, Operator.isNull, ''),
435
+ this.newFilter(WorkflowFieldStateCode, Operator.in, restValues)
436
+ ];
437
+ }
438
+ }
439
+ });
440
+ const resultModify = yield this.modifyGridInfo(gridInfo);
441
+ if (resultModify === false) {
442
+ this.model.dataSource = [];
443
+ this.model.total = 0;
444
+ this.model.expandedRowKeys = {};
445
+ this._unmarkLoading();
446
+ return;
447
+ }
448
+ this.doGetRequest(gridInfo);
449
+ }
450
+ });
451
+ }
452
+ _markLoading() {
453
+ this.model.loading = true;
454
+ if (this.crudList) {
455
+ this.crudList.adjustPositionLoadingMask();
456
+ }
457
+ clearTimeout(this.loadingTimeout);
458
+ this.loadingTimeout = setTimeout(() => {
459
+ this._notifierService.showWarning('Máy chủ phản hồi quá lâu, vui lòng kiểm tra lại đường truyền mạng!');
460
+ this.model.loading = false;
461
+ }, 20000);
462
+ }
463
+ _handleReloaded(evt = null) {
464
+ this._unmarkLoading();
465
+ this.afterReloaded();
466
+ }
467
+ afterReloaded() {
468
+ return __awaiter(this, void 0, void 0, function* () { });
469
+ }
470
+ _unmarkLoading() {
471
+ clearTimeout(this.loadingTimeout);
472
+ this.model.loading = false;
473
+ }
474
+ fireDataLoaded(success = true) {
475
+ if (success && this.crudList) {
476
+ this.crudList.processBaseData();
477
+ }
478
+ this._unmarkLoading();
479
+ }
480
+ getPromiseGetData(gridInfo) {
481
+ return this.setting.baseService.baseGetTreeData(gridInfo, this.plusUrl);
482
+ }
483
+ getDataCustom(gridInfo) {
484
+ }
485
+ doGetRequest(gridInfo) {
486
+ if (!this.customGetData) {
487
+ if (this.setting.baseService) {
488
+ this.getPromiseGetData(gridInfo)
489
+ .then((response) => __awaiter(this, void 0, void 0, function* () {
490
+ if (response.success) {
491
+ yield this.processGetData(response);
492
+ this.fireDataLoaded();
493
+ }
494
+ else {
495
+ this._notifierService.showWarning(response.message);
496
+ this.fireDataLoaded(false);
497
+ }
498
+ }), error => {
499
+ this._notifierService.showHttpUnknowError();
500
+ this.fireDataLoaded(false);
501
+ });
502
+ }
503
+ }
504
+ else {
505
+ this.getDataCustom(gridInfo);
506
+ }
507
+ }
508
+ processGetData(response) {
509
+ return __awaiter(this, void 0, void 0, function* () {
510
+ this.model.expandedRowKeys = {};
511
+ this.model.total = response.totalRecord;
512
+ if (response.data && response.data.length > 0) {
513
+ yield this.beforeRenderDataSource(response.data);
514
+ }
515
+ yield this.afterProcessDataInBase(response.data);
516
+ const dataSource = [];
517
+ this.createTreeData(response.data, dataSource);
518
+ this.model.dataSource = dataSource;
519
+ const resetSelectedItems = this.model.selectedItems && this.model.selectedItems.length;
520
+ if (resetSelectedItems) {
521
+ this.model.selectedItems.length = 0;
522
+ }
523
+ yield this.afterGetData();
524
+ this._getRefDataDropdown(this.model.dataSource);
525
+ });
526
+ }
527
+ beforeRenderDataSource(datasource) {
528
+ return datasource;
529
+ }
530
+ afterProcessDataInBase(dataSource = []) {
531
+ return __awaiter(this, void 0, void 0, function* () {
532
+ });
533
+ }
534
+ createTreeData(dataSource, result, level = 1, idParent = null, lstIdParent = []) {
535
+ dataSource.forEach(item => {
536
+ if (item[this.fieldParent] != idParent)
537
+ return;
538
+ // Bị vòng lặp vô hạn
539
+ if (lstIdParent.indexOf(item.id) > -1)
540
+ return;
541
+ const node = {
542
+ data: item,
543
+ label: item.ten,
544
+ expanded: level <= this.levelOpen,
545
+ level,
546
+ children: []
547
+ };
548
+ result.push(node);
549
+ this.createTreeData(dataSource, node.children, level + 1, node.data.id, [...lstIdParent, item.id]);
550
+ });
551
+ return result;
552
+ }
553
+ afterGetData() {
554
+ return __awaiter(this, void 0, void 0, function* () {
555
+ });
556
+ }
557
+ _getRefDataDropdown(dataSource) {
558
+ return __awaiter(this, void 0, void 0, function* () {
559
+ if (dataSource && dataSource.length > 0) {
560
+ if (this.setting.advanceData.fieldNeedGetRef) {
561
+ const arrPromiseDontNeedWait = [];
562
+ const arrSchemaDontNeedWait = [];
563
+ for (const schema of this.setting.advanceData.fieldNeedGetRef) {
564
+ const field = schema.field;
565
+ if (schema[KeyFieldGetRefType] == EnumGetRefType.SERVER) {
566
+ if (schema.forceGetData
567
+ || (this.setting.groupColumn && this.setting.groupColumn.rawColumn && this.setting.groupColumn.rawColumn.field == schema.field)
568
+ || this.setting.cols.some(item => item.field == 'str' + field && item.visible != false)) {
569
+ const arrValue = [];
570
+ dataSource.forEach(itemData => {
571
+ const currentValue = itemData[field];
572
+ if (currentValue != null) {
573
+ if (schema.multiple) {
574
+ let ids = currentValue;
575
+ if (!Array.isArray(ids)) {
576
+ ids = ids.split(',');
577
+ }
578
+ ids.forEach(id => {
579
+ if (!id)
580
+ return;
581
+ if (!arrValue.some(p => p == id)) {
582
+ arrValue.push(id);
583
+ }
584
+ });
585
+ }
586
+ else if (!arrValue.some(p => p == currentValue)) {
587
+ arrValue.push(currentValue);
588
+ }
589
+ }
590
+ });
591
+ if (arrValue.length > 0) {
592
+ let promise = null;
593
+ if (schema.baseService instanceof MasterDataService) {
594
+ promise = schema.baseService.getDataDropdown(schema.groupCode, arrValue, this.createDropdownOptions(schema));
595
+ }
596
+ else {
597
+ promise = schema.baseService.getDataDropdownByFilter([this.newFilter(schema.valueField, Operator.in, arrValue)], this.createDropdownOptions(schema));
598
+ }
599
+ if (schema.order != null) {
600
+ const result = yield promise;
601
+ this.mergeRefDataToDatasource(dataSource, schema, result);
602
+ }
603
+ else {
604
+ arrPromiseDontNeedWait.push(promise);
605
+ arrSchemaDontNeedWait.push(schema);
606
+ }
607
+ }
608
+ }
609
+ }
610
+ else {
611
+ let funcGetLabel = item => item[schema.displayFieldInGrid] || item['label'];
612
+ if (schema.funcGetLabel) {
613
+ funcGetLabel = schema.funcGetLabel;
614
+ }
615
+ dataSource.forEach(itemData => {
616
+ const refItem = schema.dataSource.find(i => schema.funcCompare(i, itemData[field]));
617
+ if (refItem != null) {
618
+ itemData['str' + field] = funcGetLabel(refItem);
619
+ }
620
+ });
621
+ }
622
+ }
623
+ if (arrPromiseDontNeedWait.length > 0) {
624
+ const arrRes = yield Promise.all(arrPromiseDontNeedWait);
625
+ arrSchemaDontNeedWait.forEach((schema, index) => {
626
+ this.mergeRefDataToDatasource(dataSource, schema, arrRes[index]);
627
+ });
628
+ }
629
+ this.afterGetRefDataDropdown(null);
630
+ this.readyToTrinhKy = true;
631
+ }
632
+ else {
633
+ this.readyToTrinhKy = true;
634
+ }
635
+ }
636
+ });
637
+ }
638
+ mergeRefDataToDatasource(dataSource, schema, data) {
639
+ const field = schema.field;
640
+ let funcGetLabel = item => item[schema.displayFieldInGrid] || item['ten'];
641
+ if (schema.funcGetLabel) {
642
+ funcGetLabel = schema.funcGetLabel;
643
+ }
644
+ let funcSetValueRow = (rowItem, data) => { };
645
+ let funcGetRefDataRow = (refItems) => {
646
+ return refItems.map(item => funcGetLabel(item)).join(`${schema.separator} `);
647
+ };
648
+ if (schema.funcSetValueRow) {
649
+ funcSetValueRow = schema.funcSetValueRow;
650
+ }
651
+ if (schema.funcGetRefDataRow) {
652
+ funcGetRefDataRow = schema.funcGetRefDataRow;
653
+ }
654
+ if (schema.multiple) {
655
+ dataSource.forEach(itemData => {
656
+ if (itemData[field] != null) {
657
+ let ids = itemData[field];
658
+ if (!Array.isArray(ids)) {
659
+ ids = ids.split(',');
660
+ }
661
+ const refItems = data.filter(i => ids.some(q => schema.funcCompare(i, q)));
662
+ if (refItems.length > 0) {
663
+ itemData['str' + field] = funcGetRefDataRow(refItems);
664
+ funcSetValueRow(itemData, refItems);
665
+ }
666
+ }
667
+ });
668
+ }
669
+ else {
670
+ dataSource.forEach(itemData => {
671
+ if (itemData[field] != null) {
672
+ const refItem = data.find(i => schema.funcCompare(i, itemData[field]));
673
+ if (refItem != null) {
674
+ itemData['str' + field] = funcGetLabel(refItem);
675
+ funcSetValueRow(itemData, refItem);
676
+ }
677
+ }
678
+ });
679
+ }
680
+ this.afterGetRefDataDropdown(field);
681
+ }
682
+ createDropdownOptions(schema) {
683
+ return new DropdownOptions({
684
+ displayField: schema.displayField,
685
+ valueField: schema.valueField,
686
+ fieldPlus: schema.fieldPlus,
687
+ fieldTree: schema.fieldTree,
688
+ fieldParentTreeItem: schema.fieldParentTreeItem,
689
+ funcGetLabel: schema.funcGetLabel,
690
+ sortField: schema.sortField,
691
+ sortDir: schema.sortDir,
692
+ callbackDataFinish: schema.callbackDataFinish
693
+ });
694
+ }
695
+ afterGetRefDataDropdown(field) {
696
+ }
697
+ mergeInfoToColumnSchema() {
698
+ this.setting.cols.forEach(col => {
699
+ const columnModelSchema = this.setting.modelSchemas.find(p => p.field == col.field);
700
+ if (columnModelSchema) {
701
+ col.label = columnModelSchema.name;
702
+ col.fullLabel = columnModelSchema.fullName;
703
+ if (!col.displayFieldInGrid) {
704
+ col.displayFieldInGrid = col.displayField;
705
+ }
706
+ if (!col.dataType) {
707
+ col.dataType = this.getDataType(columnModelSchema.dataType);
708
+ }
709
+ }
710
+ });
711
+ }
712
+ getDataType(type) {
713
+ return type;
714
+ }
715
+ generateFieldSearchText() {
716
+ this.setting.cols.forEach(col => {
717
+ if (col.fullTextSearch) {
718
+ this.setting.fieldSearchText.push(col.field);
719
+ }
720
+ });
721
+ if (this.setting.fieldSearchText.length > 0) {
722
+ const filters = [];
723
+ this.setting.fieldSearchText.forEach(field => {
724
+ filters.push(new Filter({ field, operator: Operator.contain, sourceField: '_k' }));
725
+ });
726
+ if (this.setting.filterTemplateAdvs) {
727
+ this.setting.filterTemplateAdvs.splice(0, 0, new Filter({
728
+ logic: 'or',
729
+ filters
730
+ }));
731
+ }
732
+ }
733
+ }
734
+ }
735
+ TreeListBase.decorators = [
736
+ { type: Directive }
737
+ ];
738
+ TreeListBase.ctorParameters = () => [
739
+ { type: Injector }
740
+ ];
741
+ TreeListBase.propDecorators = {
742
+ content: [{ type: ViewChild, args: [TreeTableComponent,] }],
743
+ parentModel: [{ type: Input }],
744
+ loadDetailFromQueryParam: [{ type: Input }]
745
+ };
746
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1saXN0LWJhc2UuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG54LXNoYXJlZC9zcmMvbGliLyIsInNvdXJjZXMiOlsiY2xhc3Nlcy9iYXNlL3RyZWUtbGlzdC1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFpQixpQkFBaUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDM0YsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMEVBQTBFLENBQUM7QUFDbkgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sK0RBQStELENBQUM7QUFDckcsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sb0VBQW9FLENBQUM7QUFDbEgsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sb0VBQW9FLENBQUM7QUFDbEgsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sdUVBQXVFLENBQUM7QUFDeEgsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOERBQThELENBQUM7QUFDdkcsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUNwRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUcxRCxPQUFPLEVB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RTtZQUM1QixJQUFJLEdBQUcsQ0FBQyxjQUFjLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDaEQ7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN6QyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUN6QyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkYsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUU7Z0JBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUM7b0JBQ3BELEtBQUssRUFBRSxJQUFJO29CQUNYLE9BQU87aUJBQ1YsQ0FBQyxDQUFDLENBQUM7YUFDUDtTQUNKO0lBQ0wsQ0FBQzs7O1lBMXZCSixTQUFTOzs7WUEvQjRDLFFBQVE7OztzQkFrQ3pELFNBQVMsU0FBQyxrQkFBa0I7MEJBYTVCLEtBQUs7dUNBQ0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIERpcmVjdGl2ZSwgSW5qZWN0b3IsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IFRyZWVOb2RlIH0gZnJvbSAndG4tY3VzdG9tLXByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgVHJlZVRhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9jcnVkL3RyZWUtdGFibGUvdHJlZS10YWJsZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBFbnRpdHlQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvZW50aXR5LXBlcm1pc3Npb24vc2VydmljZXMuY3MvZW50aXR5LXBlcm1pc3Npb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFN0YXRlTWFjaGluZXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9zdGF0ZW1hY2hpbmVzL3NlcnZpY2VzL3N0YXRlbWFjaGluZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IEVudGl0eVdvcmtmbG93SGlzdG9yeVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL3dvcmtmbG93L3NlcnZpY2VzL2VudGl0eS13b3JrZmxvdy1oaXN0b3J5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnRpdHlXb3JrZmxvd1NldHRpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy93b3JrZmxvdy9zZXJ2aWNlcy9lbnRpdHktd29ya2Zsb3ctc2V0dGluZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgV29ya2Zsb3dQZXJtaXNzaW9uRGV0YWlsU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvd29ya2Zsb3cvc2VydmljZXMvd29ya2Zsb3ctcGVybWlzc2lvbi1kZXRhaWwuc2VydmljZSc7XHJcbmltcG9ydCB7IFdvcmtmbG93U2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy93b3JrZmxvdy9zZXJ2aWNlcy93b3JrZmxvdy1zZXR0aW5ncy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tQ3R4Q29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vY29uZmlncy9jb21wb25lbnQtY29udGV4dC5jb25zdGFudCc7XHJcbmltcG9ydCB7IENvbmdWaWVjU2VydmljZSB9IGZyb20gJy4uLy4uL2Nvbmd2aWVjL2Nvbmd2aWVjL3NlcnZpY2VzL2Nvbmd2aWVjLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQZXJtaXNzaW9uQmFzZSB9IGZyb20gJy4uLy4uL2VudW1zL2NvbW1vbic7XHJcbmltcG9ydCB7IEZpbHRlciwgR3JpZEluZm8gfSBmcm9tICcuLi8uLi9tb2RlbHMvZ3JpZC1pbmZvJztcclxuaW1wb3J0IHsgUmVzcG9uc2VSZXN1bHQgfSBmcm9tICcuLi8uLi9tb2RlbHMvcmVzcG9uc2UtcmVzdWx0JztcclxuaW1wb3J0IHsgQmFzZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9iYXNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvY29tbW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDcnVkU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NydWQuc2VydmljZSc7XHJcbmltcG9ydCB7IEN1c3RvbVJvdXRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jdXN0b20tcm91dGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnRpdHlNZXRhZGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9lbnRpdHktbWV0YWRhdGEuc2VydmljZSc7XHJcbmltcG9ydCB7IEV4cG9ydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9leHBvcnQuc2VydmljZSc7XHJcbmltcG9ydCB7IExpc3RIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbGlzdC1oZWxwZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hc3RlckRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbWFzdGVyLWRhdGEuc2VydmljZSc7XHJcbmltcG9ydCB7IE1vZHVsZUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2R1bGUtY29uZmlnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOb3RpZmllclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub3RpZmllci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy91c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnVtR2V0UmVmVHlwZSwgRm9ybVN0YXRlLCBLZXlGaWVsZEdldFJlZlR5cGUsIEtleUZsYXNoU2hvdywgV29ya2Zsb3dGaWVsZFN0YXRlQ29kZSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XHJcbmltcG9ydCB7IENvbHVtblNjaGVtYUJhc2UsIENydWRGb3JtRGF0YSwgQ3J1ZExpc3REYXRhLCBDcnVkTGlzdFNldHRpbmcsIERyb3Bkb3duT3B0aW9ucywgT3BlcmF0b3IgfSBmcm9tICcuLi9mb3JtLXNjaGVtYSc7XHJcbmltcG9ydCB7IENvbXBvbmVudEJhc2UgfSBmcm9tICcuL2NvbXBvbmVudC1iYXNlJztcclxuXHJcbkBEaXJlY3RpdmUoKVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVHJlZUxpc3RCYXNlIGV4dGVuZHMgQ29tcG9uZW50QmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcclxuICAgIHB1YmxpYyBjcnVkTGlzdDogVHJlZVRhYmxlQ29tcG9uZW50O1xyXG4gICAgQFZpZXdDaGlsZChUcmVlVGFibGVDb21wb25lbnQpIHNldCBjb250ZW50KGNvbnRlbnQ6IFRyZWVUYWJsZUNvbXBvbmVudCkge1xyXG4gICAgICAgIGNvbnN0IGJlZm9yZVZhbHVlID0gdGhpcy5jcnVkTGlzdDtcclxuICAgICAgICBpZiAoY29udGVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmNydWRMaXN0ID0gY29udGVudDtcclxuICAgICAgICAgICAgaWYgKCFiZWZvcmVWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudFJlYWR5Kys7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb3VudFJlYWR5IDwgMikge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0RhdGEoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIEBJbnB1dCgpIHBhcmVudE1vZGVsOiBDcnVkTGlzdERhdGE7XHJcbiAgICBASW5wdXQoKSBsb2FkRGV0YWlsRnJvbVF1ZXJ5UGFyYW06IGJvb2xlYW47XHJcblxyXG4gICAgcHJpdmF0ZSBub3RDb25maWdCYXNlU2VydmljZU1lc3NhZ2UgPSAnQ2jGsGEgY+G6pXUgaMOsbmggQ1JVRCBiYXNlIHNlcnZpY2UnO1xyXG4gICAgZW52aXJvbm1lbnQ6IGFueSA9IHt9O1xyXG4gICAgc2V0dGluZzogQ3J1ZExpc3RTZXR0aW5nID0gbmV3IENydWRMaXN0U2V0dGluZygpO1xyXG4gICAgbW9kZWw6IENydWRMaXN0RGF0YSA9IG5ldyBDcnVkTGlzdERhdGEoKTtcclxuICAgIGZvcm1Nb2RlbDogQ3J1ZEZvcm1EYXRhID0gbmV3IENydWRGb3JtRGF0YSgpO1xyXG4gICAgc2NvcGVEYXRhRWRpdDogYW55ID0ge307XHJcbiAgICBzaG93RGV0YWlsRm9ybSA9IGZhbHNlO1xyXG4gICAgY291bnRSZWFkeSA9IDA7XHJcbiAgICBoYXNDcnVkTGlzdCA9IHRydWU7XHJcbiAgICBjdXN0b21HZXREYXRhID0gZmFsc2U7XHJcbiAgICByZWFkeVRvVHJpbmhLeSA9IGZhbHNlO1xyXG4gICAgcGx1c1VybCA9ICcnO1xyXG4gICAgcm93RGF0YUN1cnJlbnQ6IGFueTtcclxuICAgIGZpZWxkUGFyZW50ID0gJ2lkUGFyZW50JztcclxuXHJcbiAgICBpc0NydWRMaXN0ID0gZmFsc2U7XHJcbiAgICBsb2FkaW5nVGltZW91dDtcclxuICAgIGxldmVsT3BlbiA9IDE7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9ub3RpZmllclNlcnZpY2U6IE5vdGlmaWVyU2VydmljZTtcclxuICAgIHByb3RlY3RlZCBfY3VzdG9tUm91dGVyU2VydmljZTogQ3VzdG9tUm91dGVyU2VydmljZTtcclxuICAgIHByb3RlY3RlZCBfbGlzdEhlbHBlclNlcnZpY2U6IExpc3RIZWxwZXJTZXJ2aWNlO1xyXG4gICAgcHJvdGVjdGVkIF9jb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlO1xyXG4gICAgcHJvdGVjdGVkIF90cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlO1xyXG4gICAgcHJvdGVjdGVkIF9leHBvcnRTZXJ2aWNlOiBFeHBvcnRTZXJ2aWNlO1xyXG4gICAgcHJvdGVjdGVkIF9yb3V0ZXI6IFJvdXRlcjtcclxuICAgIHByb3RlY3RlZCBfY3J1ZFNlcnZpY2U6IENydWRTZXJ2aWNlO1xyXG4gICAgcHJvdGVjdGVkIF9kYXRlUGlwZTogRGF0ZVBpcGU7XHJcbiAgICBwcm90ZWN0ZWQgX2NkOiBDaGFuZ2VEZXRlY3RvclJlZjtcclxuICAgIHByb3RlY3RlZCBfZW50aXR5TWV0YWRhdGFTZXJ2aWNlOiBFbnRpdHlNZXRhZGF0YVNlcnZpY2U7XHJcbiAgICBwcm90ZWN0ZWQgX3VzZXJTZXJ2aWNlOiBVc2VyU2VydmljZTtcclxuICAgIHByb3RlY3RlZCBfbWFzdGVyRGF0YVNlcnZpY2U6IE1hc3RlckRhdGFTZXJ2aWNlO1xyXG4gICAgcHJvdGVjdGVkIF9lbnRpdHlXb3JrZmxvd1NldHRpbmdTZXJ2aWNlOiBFbnRpdHlXb3JrZmxvd1NldHRpbmdTZXJ2aWNlO1xyXG4gICAgcHJvdGVjdGVkIF9lbnRpdHlXb3JrZmxvd0hpc3RvcnlTZXJ2aWNlOiBFbnRpdHlXb3JrZmxvd0hpc3RvcnlTZXJ2aWNlO1xyXG4gICAgcHJvdGVjdGVkIF9lbnRpdHlQZXJtaXNzaW9uU2VydmljZTogRW50aXR5UGVybWlzc2lvblNlcnZpY2U7XHJcbiAgICBwcm90ZWN0ZWQgX3dvcmtmbG93U2V0dGluZ1NlcnZpY2U6IFdvcmtmbG93U2V0dGluZ3NTZXJ2aWNlO1xyXG4gICAgcHJvdGVjdGVkIF93b3JrZmxvd1Blcm1pc3Npb25EZXRhaWxTZXJ2aWNlOiBXb3JrZmxvd1Blcm1pc3Npb25EZXRhaWxTZXJ2aWNlO1xyXG4gICAgcHJvdGVjdGVkIF9zdGF0ZU1hY2hpbmVzU2VydmljZTogU3RhdGVNYWNoaW5lc1NlcnZpY2U7XHJcbiAgICBwcm90ZWN0ZWQgX2NvbmdWaWVjU2VydmljZUluQmFzZTogQ29uZ1ZpZWNTZXJ2aWNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIF9pbmplY3RvcjogSW5qZWN0b3JcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKF9pbmplY3Rvcik7XHJcbiAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KE5vdGlmaWVyU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5fYWN0aXZhdGVkUm91dGUgPSB0aGlzLl9pbmplY3Rvci5nZXQoQWN0aXZhdGVkUm91dGUpO1xyXG4gICAgICAgIHRoaXMuX3JvdXRlciA9IHRoaXMuX2luamVjdG9yLmdldChSb3V0ZXIpO1xyXG4gICAgICAgIHRoaXMuX2N1c3RvbVJvdXRlclNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoQ3VzdG9tUm91dGVyU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5fbGlzdEhlbHBlclNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoTGlzdEhlbHBlclNlcnZpY2UpO1xyXG4gICAgICAgIHRoaXMuX2NvbW1vblNlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoQ29tbW9uU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNsYXRlU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChUcmFuc2xhdGVTZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLl9leHBvcnRTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KEV4cG9ydFNlcnZpY2UpO1xyXG4gICAgICAgIHRoaXMuX2NydWRTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KENydWRTZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLl9kYXRlUGlwZSA9IHRoaXMuX2luamVjdG9yLmdldChEYXRlUGlwZSk7XHJcbiAgICAgICAgdGhpcy5fY2QgPSB0aGlzLl9pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG4gICAgICAgIHRoaXMuX3VzZXJTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KFVzZXJTZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLl9tYXN0ZXJEYXRhU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChNYXN0ZXJEYXRhU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5fZW50aXR5V29ya2Zsb3dTZXR0aW5nU2VydmljZSA9IHRoaXMuX2luamVjdG9yLmdldChFbnRpdHlXb3JrZmxvd1NldHRpbmdTZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLl9lbnRpdHlXb3JrZmxvd0hpc3RvcnlTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KEVudGl0eVdvcmtmbG93SGlzdG9yeVNlcnZpY2UpO1xyXG4gICAgICAgIHRoaXMuX2VudGl0eVBlcm1pc3Npb25TZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KEVudGl0eVBlcm1pc3Npb25TZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLl93b3JrZmxvd1NldHRpbmdTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KFdvcmtmbG93U2V0dGluZ3NTZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLl93b3JrZmxvd1Blcm1pc3Npb25EZXRhaWxTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KFdvcmtmbG93UGVybWlzc2lvbkRldGFpbFNlcnZpY2UpO1xyXG4gICAgICAgIHRoaXMuX3N0YXRlTWFjaGluZXNTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KFN0YXRlTWFjaGluZXNTZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLl9jb25nVmllY1NlcnZpY2VJbkJhc2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoQ29uZ1ZpZWNTZXJ2aWNlKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLm1vZGVsLmJhc2VSZWFkeSA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmcuY29scykge1xyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcuY29scyA9IHRoaXMuc2V0dGluZy5jb2xzLmZpbHRlcihxID0+ICFxLnJlbW92ZU9uSW5pdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubWVyZ2VJbmZvVG9Db2x1bW5TY2hlbWEoKTtcclxuICAgICAgICB0aGlzLmdlbmVyYXRlRmllbGRTZWFyY2hUZXh0KCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UpIHtcclxuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKHRoaXMubm90Q29uZmlnQmFzZVNlcnZpY2VNZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5zZXR0aW5nLmhpZGRlblNldHRpbmdXb3JrZmxvd1xyXG4gICAgICAgICAgICAgICAgfHwgIXRoaXMuc2V0dGluZy5oaWRkZW5TZXR0aW5nV29ya2Zsb3dOZXdcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UudXNlV29ya2Zsb3cgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJHbG9iYWxTZXJ2aWNlKHRoaXMuc2V0dGluZy5iYXNlU2VydmljZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG1vZHVsZUNvbmZpZ1NlcnZpY2UgPSB0aGlzLl9pbmplY3Rvci5nZXQoTW9kdWxlQ29uZmlnU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5lbnZpcm9ubWVudCA9IG1vZHVsZUNvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlnKCkuZW52aXJvbm1lbnQ7XHJcbiAgICAgICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuY2xpZW50RG9tYWluXHJcbiAgICAgICAgICAgICYmIHRoaXMuc2V0dGluZy5iYXNlU2VydmljZVxyXG4gICAgICAgICAgICAmJiB0aGlzLmVudmlyb25tZW50LmNsaWVudERvbWFpblt0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2Uuc2VydmljZUNvZGVdXHJcbiAgICAgICAgICAgICYmICF0aGlzLnNldHRpbmcudGFyZ2V0UGF0aFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcudGFyZ2V0UGF0aCA9IGAke3RoaXMuZW52aXJvbm1lbnQuY2xpZW50RG9tYWluW3RoaXMuc2V0dGluZy5iYXNlU2VydmljZS5zZXJ2aWNlQ29kZV19LyR7dGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLmVudGl0eU5hbWUudG9Mb3dlckNhc2UoKX0vZGV0YWlsYDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5nZXRNZW51QnV0dG9ucyA9IHRoaXMuZ2V0TWVudUJ1dHRvbnMuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3Rlckdsb2JhbFNlcnZpY2Uoc2VydmljZTogQmFzZVNlcnZpY2UpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBzZXJ2aWNlLmdldEtleVdvcmtmbG93U2V0dGluZygpO1xyXG4gICAgICAgIHRoaXMuX2VudGl0eVdvcmtmbG93U2V0dGluZ1NlcnZpY2UucmVnaXN0ZXJTZXJ2aWNlKGtleSwgc2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5fZW50aXR5V29ya2Zsb3dIaXN0b3J5U2VydmljZS5yZWdpc3RlclNlcnZpY2Uoa2V5LCBzZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLl9lbnRpdHlQZXJtaXNzaW9uU2VydmljZS5yZWdpc3RlclNlcnZpY2Uoa2V5LCBzZXJ2aWNlKTtcclxuICAgICAgICB0aGlzLl93b3JrZmxvd1NldHRpbmdTZXJ2aWNlLnJlZ2lzdGVyU2VydmljZShrZXksIHNlcnZpY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWRJdGVtRnJvbVF1ZXJ5UGFyYW0oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubG9hZERldGFpbEZyb21RdWVyeVBhcmFtID09PSB1bmRlZmluZWQgfHwgdGhpcy5sb2FkRGV0YWlsRnJvbVF1ZXJ5UGFyYW0gPT09IHRydWUpIHtcclxuICAgICAgICAgICAgbGV0IGlkSW5RdWVyeVN0cmluZyA9IG51bGw7XHJcbiAgICAgICAgICAgIGxldCBwaWQgPSBudWxsOyAvLyBwZXJtaXNzaW9uIElkIMSRxrDhu6NjIG5nxrDhu51pIGtow6FjIHNoYXJlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdFxyXG4gICAgICAgICAgICAgICAgJiYgdGhpcy5fYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICBpZEluUXVlcnlTdHJpbmcgPSB0aGlzLl9hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcy5pZCB8fCB0aGlzLl9hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcy5lbnRpdHlLZXk7XHJcbiAgICAgICAgICAgICAgICBwaWQgPSB0aGlzLl9hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcy5waWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHBpZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkRGV0YWlsUGlkKHBpZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoaWRJblF1ZXJ5U3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBnZXQgZGV0YWlsIGRhdGFcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5iYXNlU2VydmljZS5nZXREZXRhaWxXaXRoUGVybWlzc2lvbihpZEluUXVlcnlTdHJpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXMuZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdLaMO0bmcgdMOsbSB0aOG6pXkgYuG6o24gZ2hpIGPhuqduIHhlbSBjaGkgdGnhur90Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyZXMuZGF0YS5iYXNlUGVybWlzc2lvbiAmIFBlcm1pc3Npb25CYXNlLkVESVQpID09IFBlcm1pc3Npb25CYXNlLkVESVRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChyZXMuZGF0YS5iYXNlUGVybWlzc2lvbiAmIFBlcm1pc3Npb25CYXNlLlJFQUQpID09IFBlcm1pc3Npb25CYXNlLlJFQURcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lZGl0KHJlcy5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnQuG6oW4ga2jDtG5nIGPDsyBxdXnhu4FuIHhlbSBi4bqjbiBnaGknKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2Vycm9yIG9uIGdldCBkZXRhaWwgZnJvbSBxdWVyeXN0cmluZycsIGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnS2jDtG5nIHTDrG0gdGjhuqV5IGLhuqNuIGdoaSBj4bqnbiB4ZW0gY2hpIHRp4bq/dCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGxvYWREZXRhaWxQaWQocGlkOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UuZ2V0RGV0YWlsQnlQaWQocGlkKVxyXG4gICAgICAgICAgICAudGhlbihyZXMgPT4gdGhpcy5oYW5kbGVSZXNwb25zZShyZXMsICcnLCBmID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghcmVzLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmcoJ0tow7RuZyB0w6xtIHRo4bqleSBi4bqjbiBnaGkgY+G6p24geGVtIGNoaSB0aeG6v3QnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICgocmVzLmRhdGEuYmFzZVBlcm1pc3Npb24gJiBQZXJtaXNzaW9uQmFzZS5FRElUKSA9PSBQZXJtaXNzaW9uQmFzZS5FRElUXHJcbiAgICAgICAgICAgICAgICAgICAgfHwgKHJlcy5kYXRhLmJhc2VQZXJtaXNzaW9uICYgUGVybWlzc2lvbkJhc2UuUkVBRCkgPT0gUGVybWlzc2lvbkJhc2UuUkVBRFxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzLmRhdGEucGlkID0gcGlkO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcy5kYXRhLmJhc2VQZXJtaXNzaW9uQnlQaWQgPSByZXMuZGF0YS5iYXNlUGVybWlzc2lvbjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lZGl0KHJlcy5kYXRhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZygnQuG6oW4ga2jDtG5nIGPDsyBxdXnhu4FuIHhlbSBi4bqjbiBnaGknKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkpLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdlcnJvciBvbiBnZXQgZGV0YWlsIGZyb20gcXVlcnlzdHJpbmcnLCBlcnIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdLaMO0bmcgdMOsbSB0aOG6pXkgYuG6o24gZ2hpIGPhuqduIHhlbSBjaGkgdGnhur90Jyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmhhbmRsZUFmdGVyVmlld0luaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRpbmdUaW1lb3V0KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGhhbmRsZUFmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgdGhpcy5jb3VudFJlYWR5Kys7XHJcbiAgICAgICAgaWYgKHRoaXMuY291bnRSZWFkeSA+IDEpIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RlbC5iYXNlUmVhZHkgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLl90cmlnZ2VyUHJvY2Vzc0RhdGEoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sb2FkSXRlbUZyb21RdWVyeVBhcmFtKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TWVudUJ1dHRvbnMocm93RGF0YSkge1xyXG4gICAgICAgIHRoaXMucm93RGF0YUN1cnJlbnQgPSByb3dEYXRhO1xyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfYWRkKGV2dCkge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdFZhbGlkYXRlID0gYXdhaXQgdGhpcy52YWxpZGF0ZUFkZCgpO1xyXG4gICAgICAgIGlmICghcmVzdWx0VmFsaWRhdGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZvcm1Nb2RlbC5kYXRhID0ge307XHJcbiAgICAgICAgdGhpcy5mb3JtTW9kZWwuZm9ybVN0YXRlID0gRm9ybVN0YXRlLkFERDtcclxuICAgICAgICBhd2FpdCB0aGlzLmJlZm9yZUFkZCgpO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5wb3B1cEhlYWRlciA9IGBUaMOqbSBt4bubaSAke3RoaXMuc2V0dGluZy5vYmplY3ROYW1lfWA7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLm1hc2tDbGFzcyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zaG93RGV0YWlsRm9ybSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdmFsaWRhdGVBZGQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgYmVmb3JlQWRkKCkge1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF92aWV3KHJvd0RhdGEpIHtcclxuICAgICAgICBpZiAocm93RGF0YS5iYXNlUGVybWlzc2lvbiAmIFBlcm1pc3Npb25CYXNlLkVESVQpIHtcclxuICAgICAgICAgICAgdGhpcy5fZWRpdChyb3dEYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybU1vZGVsLmZvcm1TdGF0ZSA9IEZvcm1TdGF0ZS5WSUVXO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmJlZm9yZVZpZXcoKTtcclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLnBvcHVwSGVhZGVyID0gYENoaSB0aeG6v3QgJHt0aGlzLnNldHRpbmcub2JqZWN0TmFtZX1gO1xyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmcubWFza0NsYXNzID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5mb3JtTW9kZWwuZGF0YSA9IHRoaXMuY2xvbmVEYXRhKHJvd0RhdGEpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1vZGlmeVZpZXdNb2RlbChyb3dEYXRhKTtcclxuICAgICAgICAgICAgdGhpcy5zaG93RGV0YWlsRm9ybSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGJlZm9yZVZpZXcoKSB7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbW9kaWZ5Vmlld01vZGVsKHJvd0RhdGE6IGFueSkge1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9jb3B5TGlua011bHRpcGxlKCkge1xyXG4gICAgICAgIGNvbnN0IHBhdGhzID0gW107XHJcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcykge1xyXG4gICAgICAgICAgICBwYXRocy5wdXNoKGF3YWl0IHRoaXMuZ2V0Q29weVBhdGgodGhpcy5zZXR0aW5nLCBpdGVtKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NvbW1vblNlcnZpY2UuY29weUJ5U3RvcmFnZShwYXRocy5qb2luKCdcXHJcXG4nKSk7XHJcbiAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dTdWNjZXNzKCfEkMOjIHNhbyBjaMOpcCBjw6FjIGxpw6puIGvhur90IMSRw6MgY2jhu41uJyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2NvcHlMaW5rKHJvd0RhdGE6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSBhd2FpdCB0aGlzLmdldENvcHlQYXRoKHRoaXMuc2V0dGluZywgcm93RGF0YSk7XHJcbiAgICAgICAgdGhpcy5fY29tbW9uU2VydmljZS5jb3B5QnlTdG9yYWdlKHBhdGgpO1xyXG4gICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93U3VjY2VzcygnxJDDoyBzYW8gY2jDqXAgbGnDqm4ga+G6v3QnKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfZWRpdChyb3dEYXRhLCBzY29wZURhdGFFZGl0OiBhbnkgPSB7fSkge1xyXG4gICAgICAgIGNvbnN0IGZsYXNoU2hvdyA9IHJvd0RhdGFbS2V5Rmxhc2hTaG93XTtcclxuICAgICAgICBkZWxldGUgcm93RGF0YVtLZXlGbGFzaFNob3ddO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuYmVmb3JlRWRpdCgpO1xyXG4gICAgICAgIHRoaXMuZm9ybU1vZGVsLmZvcm1TdGF0ZSA9IEZvcm1TdGF0ZS5FRElUO1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5wb3B1cEhlYWRlciA9IGBDaGkgdGnhur90ICR7dGhpcy5zZXR0aW5nLm9iamVjdE5hbWV9YDtcclxuICAgICAgICB0aGlzLnNldHRpbmcubWFza0NsYXNzID0gZmxhc2hTaG93ID8gJ2hpZGUnIDogbnVsbDtcclxuICAgICAgICB0aGlzLnNjb3BlRGF0YUVkaXQgPSBzY29wZURhdGFFZGl0O1xyXG4gICAgICAgIHRoaXMuZm9ybU1vZGVsLmRhdGEgPSB0aGlzLmNsb25lRGF0YShyb3dEYXRhKTtcclxuICAgICAgICBhd2FpdCB0aGlzLm1vZGlmeUVkaXRNb2RlbChyb3dEYXRhKTtcclxuICAgICAgICB0aGlzLmZvcm1Nb2RlbC5kYXRhW0tleUZsYXNoU2hvd10gPSBmbGFzaFNob3c7XHJcbiAgICAgICAgdGhpcy5zaG93RGV0YWlsRm9ybSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgYmVmb3JlRWRpdCgpIHtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBtb2RpZnlFZGl0TW9kZWwocm93RGF0YTogYW55KSB7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjbG9uZURhdGEocm93RGF0YSkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHBpZDogcm93RGF0YS5waWQsXHJcbiAgICAgICAgICAgIGJhc2VQZXJtaXNzaW9uQnlQaWQ6IHJvd0RhdGEuYmFzZVBlcm1pc3Npb25CeVBpZCxcclxuICAgICAgICAgICAgaWQ6IHJvd0RhdGFbdGhpcy5zZXR0aW5nLmVudGl0eUtleV0sXHJcbiAgICAgICAgICAgIGJhc2VQZXJtaXNzaW9uOiByb3dEYXRhLmJhc2VQZXJtaXNzaW9uXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcm9taXNlRGVsZXRlSXRlbShyb3dEYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZy5iYXNlU2VydmljZS5kZWxldGUocm93RGF0YS5pZCk7XHJcbiAgICB9XHJcblxyXG4gICAgX2RlbGV0ZShyb3dEYXRhKSB7XHJcbiAgICAgICAgaWYgKHJvd0RhdGEuX19kaXNhYmxlRGVsZXRlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dEZWxldGVDb25maXJtKCkudGhlbihycyA9PiB7XHJcbiAgICAgICAgICAgIGlmICghcnMpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb21pc2VEZWxldGVJdGVtKHJvd0RhdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5zaG93VmVyc2lvbkJ1dHRvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5maXJlRXZlbnQoQ29tQ3R4Q29uc3RhbnRzLkNPTU1PTi5SRUxPQURfREFUQV9WRVJTSU9OLCB7fSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyUHJvY2Vzc0RhdGEoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93RGVsZXRlRGF0YVN1Y2Nlc3MoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93V2FybmluZ0J5UmVzcG9uc2UocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd0RlbGV0ZURhdGFFcnJvcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJvbWlzZURlbGV0ZUl0ZW1zKGl0ZW1zKSB7XHJcbiAgICAgICAgY29uc3QgaWRzID0gaXRlbXMubWFwKHggPT4geC5pZCkuam9pbignLCcpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmcuYmFzZVNlcnZpY2UuZGVsZXRlTWFueShpZHMpO1xyXG4gICAgfVxyXG5cclxuICAgIF9kZWxldGVNdWx0aXBsZShpdGVtcykge1xyXG4gICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93RGVsZXRlQ29uZmlybSgpLnRoZW4ocnMgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXJzKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5iYXNlU2VydmljZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQcm9taXNlRGVsZXRlSXRlbXMoaXRlbXMpLnRoZW4ocmVzcG9uc2UgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJQcm9jZXNzRGF0YSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd0RlbGV0ZURhdGFTdWNjZXNzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmllclNlcnZpY2Uuc2hvd1dhcm5pbmdCeVJlc3BvbnNlKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQmVmb3JlQ2FuY2VsKCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlU2F2ZWQoKSB7XHJcbiAgICAgICAgdGhpcy5zaG93RGV0YWlsRm9ybSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3RyaWdnZXJQcm9jZXNzRGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVDYW5jZWwoJGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5vbkJlZm9yZUNhbmNlbCgpO1xyXG4gICAgICAgIHRoaXMuc2hvd0RldGFpbEZvcm0gPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIGdldEVudGl0eU1ldGFkYXRhKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLl9lbnRpdHlNZXRhZGF0YVNlcnZpY2UpIHtcclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuc2V0dGluZy5lbnRpdHlNZXRhZGF0YVNldHRpbmcuZGF0YSA9IHRoaXMuX2VudGl0eU1ldGFkYXRhU2VydmljZS5nZXRXZjFTZXR0aW5nKCk7XHJcbiAgICAgICAgICAgIC8vICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLnNldHRpbmcuZW50aXR5TWV0YWRhdGFTZXJ2aWNlID0gdGhpcy5faW5qZWN0b3IuZ2V0KEVudGl0eU1ldGFkYXRhU2VydmljZSk7XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLl9lbnRpdHlNZXRhZGF0YVNlcnZpY2UgPSB0aGlzLnNldHRpbmcuZW50aXR5TWV0YWRhdGFTZXJ2aWNlO1xyXG4gICAgICAgICAgICAvLyAgICAgYXdhaXQgdGhpcy5fZW50aXR5TWV0YWRhdGFTZXJ2aWNlLmxvYWQodGhpcy5fYmFzZVNlcnZpY2UsIHRoaXMuY29udGV4dCwgdHJ1ZSk7ICAvLyBmb3JjZSBsb2FkIMSR4buDIMSR4buNYyB04burIGNzZGxcclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuc2V0dGluZy5lbnRpdHlNZXRhZGF0YVNldHRpbmcuZGF0YSA9IHRoaXMuX2VudGl0eU1ldGFkYXRhU2VydmljZS5nZXRXZjFTZXR0aW5nKCk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignUGxlYXNlIGluY2x1ZGUgRW50aXR5TWV0YWRhdGFTZXJ2aWNlIGluIHByb3ZpZGVyIG9mIGNvbXBvbmVudCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZWxvYWQoKSB7XHJcbiAgICAgICAgdGhpcy5jcnVkTGlzdC5yZWxvYWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfdHJpZ2dlclByb2Nlc3NEYXRhKGdyaWRJbmZvPzogR3JpZEluZm8pIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnByb2Nlc3NEYXRhKGdyaWRJbmZvKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIHByb2Nlc3NEYXRhKGdyaWRJbmZvPzogR3JpZEluZm8pIHtcclxuICAgICAgICB0aGlzLnJlYWR5VG9UcmluaEt5ID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuaGFzQ3J1ZExpc3QpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmNydWRMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFncmlkSW5mbykge1xyXG4gICAgICAgICAgICAgICAgZ3JpZEluZm8gPSB0aGlzLmNydWRMaXN0LmdldEdyaWRJbmZvKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghZ3JpZEluZm8pIHtcclxuICAgICAgICAgICAgICAgIGdyaWRJbmZvID0gbmV3IEdyaWRJbmZvKHtcclxuICAgICAgICAgICAgICAgICAgICBwYWdlSW5mbzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiAxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlU2l6ZTogOTk5XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiBbXSxcclxuICAgICAgICAgICAgICAgICAgICBzb3J0czogW11cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZ2V0RGF0YShncmlkSW5mbyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbW9kaWZ5R3JpZEluZm8oZ3JpZEluZm86IEdyaWRJbmZvKTogUHJvbWlzZTxib29sZWFuIHwgdm9pZD4ge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgZ2V0RGF0YShncmlkSW5mbzogR3JpZEluZm8pIHtcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlICYmIHRoaXMubW9kZWwucmVhZHkpIHtcclxuICAgICAgICAgICAgdGhpcy5fbWFya0xvYWRpbmcoKTtcclxuICAgICAgICAgICAgZ3JpZEluZm8ubW9kaWZ5RmlsdGVyKFdvcmtmbG93RmllbGRTdGF0ZUNvZGUsIGZpbHRlciA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhhc051bGxWYWx1ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3RWYWx1ZXMgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICBKU09OLnBhcnNlKGZpbHRlci52YWx1ZSkuZm9yRWFjaCh2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzTnVsbFZhbHVlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RWYWx1ZXMucHVzaCh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzTnVsbFZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN0VmFsdWVzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIub3BlcmF0b3IgPSBPcGVyYXRvci5pc051bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLmxvZ2ljID0gJ29yJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLmZpZWxkID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLnZhbHVlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLm9wZXJhdG9yID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLmZpbHRlcnMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5ld0ZpbHRlcihXb3JrZmxvd0ZpZWxkU3RhdGVDb2RlLCBPcGVyYXRvci5pc051bGwsICcnKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmV3RmlsdGVyKFdvcmtmbG93RmllbGRTdGF0ZUNvZGUsIE9wZXJhdG9yLmluLCByZXN0VmFsdWVzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdE1vZGlmeSA9IGF3YWl0IHRoaXMubW9kaWZ5R3JpZEluZm8oZ3JpZEluZm8pO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0TW9kaWZ5ID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5kYXRhU291cmNlID0gW107XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnRvdGFsID0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZXhwYW5kZWRSb3dLZXlzID0ge307XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91bm1hcmtMb2FkaW5nKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5kb0dldFJlcXVlc3QoZ3JpZEluZm8pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfbWFya0xvYWRpbmcoKSB7XHJcbiAgICAgICAgdGhpcy5tb2RlbC5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICBpZiAodGhpcy5jcnVkTGlzdCkge1xyXG4gICAgICAgICAgICB0aGlzLmNydWRMaXN0LmFkanVzdFBvc2l0aW9uTG9hZGluZ01hc2soKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubG9hZGluZ1RpbWVvdXQpO1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKCdNw6F5IGNo4bunIHBo4bqjbiBo4buTaSBxdcOhIGzDonUsIHZ1aSBsw7JuZyBraeG7g20gdHJhIGzhuqFpIMSRxrDhu51uZyB0cnV54buBbiBt4bqhbmchJyk7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0sIDIwMDAwKTtcclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlUmVsb2FkZWQoZXZ0ID0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuX3VubWFya0xvYWRpbmcoKTtcclxuICAgICAgICB0aGlzLmFmdGVyUmVsb2FkZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBhZnRlclJlbG9hZGVkKCkgeyB9XHJcblxyXG4gICAgX3VubWFya0xvYWRpbmcoKSB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMubG9hZGluZ1RpbWVvdXQpO1xyXG4gICAgICAgIHRoaXMubW9kZWwubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZmlyZURhdGFMb2FkZWQoc3VjY2VzczogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgICAgICBpZiAoc3VjY2VzcyAmJiB0aGlzLmNydWRMaXN0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3J1ZExpc3QucHJvY2Vzc0Jhc2VEYXRhKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3VubWFya0xvYWRpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcm9taXNlR2V0RGF0YShncmlkSW5mbzogR3JpZEluZm8pIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlLmJhc2VHZXRUcmVlRGF0YShncmlkSW5mbywgdGhpcy5wbHVzVXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXREYXRhQ3VzdG9tKGdyaWRJbmZvOiBHcmlkSW5mbykge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRvR2V0UmVxdWVzdChncmlkSW5mbzogR3JpZEluZm8pIHtcclxuICAgICAgICBpZiAoIXRoaXMuY3VzdG9tR2V0RGF0YSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmJhc2VTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb21pc2VHZXREYXRhKGdyaWRJbmZvKVxyXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGFzeW5jIHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0dldERhdGEocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRGF0YUxvYWRlZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpZXJTZXJ2aWNlLnNob3dXYXJuaW5nKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRGF0YUxvYWRlZChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmaWVyU2VydmljZS5zaG93SHR0cFVua25vd0Vycm9yKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZURhdGFMb2FkZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmdldERhdGFDdXN0b20oZ3JpZEluZm8pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIHByb2Nlc3NHZXREYXRhKHJlc3BvbnNlOiBSZXNwb25zZVJlc3VsdCkge1xyXG4gICAgICAgIHRoaXMubW9kZWwuZXhwYW5kZWRSb3dLZXlzID0ge307XHJcbiAgICAgICAgdGhpcy5tb2RlbC50b3RhbCA9IHJlc3BvbnNlLnRvdGFsUmVjb3JkO1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5kYXRhICYmIHJlc3BvbnNlLmRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmJlZm9yZVJlbmRlckRhdGFTb3VyY2UocmVzcG9uc2UuZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuYWZ0ZXJQcm9jZXNzRGF0YUluQmFzZShyZXNwb25zZS5kYXRhKTtcclxuICAgICAgICBjb25zdCBkYXRhU291cmNlID0gW107XHJcbiAgICAgICAgdGhpcy5jcmVhdGVUcmVlRGF0YShyZXNwb25zZS5kYXRhLCBkYXRhU291cmNlKTtcclxuICAgICAgICB0aGlzLm1vZGVsLmRhdGFTb3VyY2UgPSBkYXRhU291cmNlO1xyXG5cclxuICAgICAgICBjb25zdCByZXNldFNlbGVjdGVkSXRlbXMgPSB0aGlzLm1vZGVsLnNlbGVjdGVkSXRlbXMgJiYgdGhpcy5tb2RlbC5zZWxlY3RlZEl0ZW1zLmxlbmd0aDtcclxuICAgICAgICBpZiAocmVzZXRTZWxlY3RlZEl0ZW1zKSB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5hZnRlckdldERhdGEoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZ2V0UmVmRGF0YURyb3Bkb3duKHRoaXMubW9kZWwuZGF0YVNvdXJjZSk7XHJcbiAgICB9XHJcblxyXG4gICAgYmVmb3JlUmVuZGVyRGF0YVNvdXJjZShkYXRhc291cmNlOiBhbnkpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiBkYXRhc291cmNlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGFmdGVyUHJvY2Vzc0RhdGFJbkJhc2UoZGF0YVNvdXJjZTogYW55W10gPSBbXSkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVUcmVlRGF0YShkYXRhU291cmNlOiBhbnlbXSwgcmVzdWx0OiBUcmVlTm9kZVtdLCBsZXZlbDogbnVtYmVyID0gMSwgaWRQYXJlbnQ6IHN0cmluZyA9IG51bGwsIGxzdElkUGFyZW50OiBzdHJpbmdbXSA9IFtdKSB7XHJcbiAgICAgICAgZGF0YVNvdXJjZS5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBpZiAoaXRlbVt0aGlzLmZpZWxkUGFyZW50XSAhPSBpZFBhcmVudCkgcmV0dXJuO1xyXG4gICAgICAgICAgICAvLyBC4buLIHbDsm5nIGzhurdwIHbDtCBo4bqhblxyXG4gICAgICAgICAgICBpZiAobHN0SWRQYXJlbnQuaW5kZXhPZihpdGVtLmlkKSA+IC0xKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiBpdGVtLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGl0ZW0udGVuLFxyXG4gICAgICAgICAgICAgICAgZXhwYW5kZWQ6IGxldmVsIDw9IHRoaXMubGV2ZWxPcGVuLFxyXG4gICAgICAgICAgICAgICAgbGV2ZWwsXHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW11cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmVzdWx0LnB1c2gobm9kZSk7XHJcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlVHJlZURhdGEoZGF0YVNvdXJjZSwgbm9kZS5jaGlsZHJlbiwgbGV2ZWwgKyAxLCBub2RlLmRhdGEuaWQsIFsuLi5sc3RJZFBhcmVudCwgaXRlbS5pZF0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgYWZ0ZXJHZXREYXRhKCkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIF9nZXRSZWZEYXRhRHJvcGRvd24oZGF0YVNvdXJjZSkge1xyXG4gICAgICAgIGlmIChkYXRhU291cmNlICYmIGRhdGFTb3VyY2UubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmFkdmFuY2VEYXRhLmZpZWxkTmVlZEdldFJlZikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXJyUHJvbWlzZURvbnROZWVkV2FpdCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXJyU2NoZW1hRG9udE5lZWRXYWl0ID0gW107XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNjaGVtYSBvZiB0aGlzLnNldHRpbmcuYWR2YW5jZURhdGEuZmllbGROZWVkR2V0UmVmKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSBzY2hlbWEuZmllbGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYVtLZXlGaWVsZEdldFJlZlR5cGVdID09IEVudW1HZXRSZWZUeXBlLlNFUlZFUikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hLmZvcmNlR2V0RGF0YVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHRoaXMuc2V0dGluZy5ncm91cENvbHVtbiAmJiB0aGlzLnNldHRpbmcuZ3JvdXBDb2x1bW4ucmF3Q29sdW1uICYmIHRoaXMuc2V0dGluZy5ncm91cENvbHVtbi5yYXdDb2x1bW4uZmllbGQgPT0gc2NoZW1hLmZpZWxkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdGhpcy5zZXR0aW5nLmNvbHMuc29tZShpdGVtID0+IGl0ZW0uZmllbGQgPT0gJ3N0cicgKyBmaWVsZCAmJiBpdGVtLnZpc2libGUgIT0gZmFsc2UpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyVmFsdWUgPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTb3VyY2UuZm9yRWFjaChpdGVtRGF0YSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gaXRlbURhdGFbZmllbGRdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaWRzID0gY3VycmVudFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGlkcykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHMgPSBpZHMuc3BsaXQoJywnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkcy5mb3JFYWNoKGlkID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlkKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnJWYWx1ZS5zb21lKHAgPT4gcCA9PSBpZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyVmFsdWUucHVzaChpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIWFyclZhbHVlLnNvbWUocCA9PiBwID09IGN1cnJlbnRWYWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyclZhbHVlLnB1c2goY3VycmVudFZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyclZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbWlzZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYS5iYXNlU2VydmljZSBpbnN0YW5jZW9mIE1hc3RlckRhdGFTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UgPSBzY2hlbWEuYmFzZVNlcnZpY2UuZ2V0RGF0YURyb3Bkb3duKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hLmdyb3VwQ29kZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBhcnJWYWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCB0aGlzLmNyZWF0ZURyb3Bkb3duT3B0aW9ucyhzY2hlbWEpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UgPSBzY2hlbWEuYmFzZVNlcnZpY2UuZ2V0RGF0YURyb3Bkb3duQnlGaWx0ZXIoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGhpcy5uZXdGaWx0ZXIoc2NoZW1hLnZhbHVlRmllbGQsIE9wZXJhdG9yLmluLCBhcnJWYWx1ZSldLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVEcm9wZG93bk9wdGlvbnMoc2NoZW1hKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hLm9yZGVyICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvbWlzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZVJlZkRhdGFUb0RhdGFzb3VyY2UoZGF0YVNvdXJjZSwgc2NoZW1hLCByZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyUHJvbWlzZURvbnROZWVkV2FpdC5wdXNoKHByb21pc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJTY2hlbWFEb250TmVlZFdhaXQucHVzaChzY2hlbWEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZ1bmNHZXRMYWJlbCA9IGl0ZW0gPT4gaXRlbVtzY2hlbWEuZGlzcGxheUZpZWxkSW5HcmlkXSB8fCBpdGVtWydsYWJlbCddO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hLmZ1bmNHZXRMYWJlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY0dldExhYmVsID0gc2NoZW1hLmZ1bmNHZXRMYWJlbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhU291cmNlLmZvckVhY2goaXRlbURhdGEgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVmSXRlbSA9IHNjaGVtYS5kYXRhU291cmNlLmZpbmQoaSA9PiBzY2hlbWEuZnVuY0NvbXBhcmUoaSwgaXRlbURhdGFbZmllbGRdKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmSXRlbSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbURhdGFbJ3N0cicgKyBmaWVsZF0gPSBmdW5jR2V0TGFiZWwocmVmSXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChhcnJQcm9taXNlRG9udE5lZWRXYWl0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJSZXMgPSBhd2FpdCBQcm9taXNlLmFsbChhcnJQcm9taXNlRG9udE5lZWRXYWl0KTtcclxuICAgICAgICAgICAgICAgICAgICBhcnJTY2hlbWFEb250TmVlZFdhaXQuZm9yRWFjaCgoc2NoZW1hLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lcmdlUmVmRGF0YVRvRGF0YXNvdXJjZShkYXRhU291cmNlLCBzY2hlbWEsIGFyclJlc1tpbmRleF0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5hZnRlckdldFJlZkRhdGFEcm9wZG93bihudWxsKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVhZHlUb1RyaW5oS3kgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWFkeVRvVHJpbmhLeSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBtZXJnZVJlZkRhdGFUb0RhdGFzb3VyY2UoZGF0YVNvdXJjZTogYW55W10sIHNjaGVtYTogQ29sdW1uU2NoZW1hQmFzZSwgZGF0YTogYW55W10pIHtcclxuICAgICAgICBjb25zdCBmaWVsZCA9IHNjaGVtYS5maWVsZDtcclxuICAgICAgICBsZXQgZnVuY0dldExhYmVsID0gaXRlbSA9PiBpdGVtW3NjaGVtYS5kaXNwbGF5RmllbGRJbkdyaWRdIHx8IGl0ZW1bJ3RlbiddO1xyXG4gICAgICAgIGlmIChzY2hlbWEuZnVuY0dldExhYmVsKSB7XHJcbiAgICAgICAgICAgIGZ1bmNHZXRMYWJlbCA9IHNjaGVtYS5mdW5jR2V0TGFiZWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBmdW5jU2V0VmFsdWVSb3cgPSAocm93SXRlbSwgZGF0YSkgPT4geyB9O1xyXG4gICAgICAgIGxldCBmdW5jR2V0UmVmRGF0YVJvdyA9IChyZWZJdGVtcykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVmSXRlbXMubWFwKGl0ZW0gPT4gZnVuY0dldExhYmVsKGl0ZW0pKS5qb2luKGAke3NjaGVtYS5zZXBhcmF0b3J9IGApO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHNjaGVtYS5mdW5jU2V0VmFsdWVSb3cpIHtcclxuICAgICAgICAgICAgZnVuY1NldFZhbHVlUm93ID0gc2NoZW1hLmZ1bmNTZXRWYWx1ZVJvdztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNjaGVtYS5mdW5jR2V0UmVmRGF0YVJvdykge1xyXG4gICAgICAgICAgICBmdW5jR2V0UmVmRGF0YVJvdyA9IHNjaGVtYS5mdW5jR2V0UmVmRGF0YVJvdztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNjaGVtYS5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgICBkYXRhU291cmNlLmZvckVhY2goaXRlbURhdGEgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1EYXRhW2ZpZWxkXSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlkcyA9IGl0ZW1EYXRhW2ZpZWxkXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaWRzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZHMgPSBpZHMuc3BsaXQoJywnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVmSXRlbXMgPSBkYXRhLmZpbHRlcihpID0+IGlkcy5zb21lKHEgPT4gc2NoZW1hLmZ1bmNDb21wYXJlKGksIHEpKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZkl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbURhdGFbJ3N0cicgKyBmaWVsZF0gPSBmdW5jR2V0UmVmRGF0YVJvdyhyZWZJdGVtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNTZXRWYWx1ZVJvdyhpdGVtRGF0YSwgcmVmSXRlbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBkYXRhU291cmNlLmZvckVhY2goaXRlbURhdGEgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1EYXRhW2ZpZWxkXSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVmSXRlbSA9IGRhdGEuZmluZChpID0+IHNjaGVtYS5mdW5jQ29tcGFyZShpLCBpdGVtRGF0YVtmaWVsZF0pKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVmSXRlbSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1EYXRhWydzdHInICsgZmllbGRdID0gZnVuY0dldExhYmVsKHJlZkl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jU2V0VmFsdWVSb3coaXRlbURhdGEsIHJlZkl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFmdGVyR2V0UmVmRGF0YURyb3Bkb3duKGZpZWxkKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZURyb3Bkb3duT3B0aW9ucyhzY2hlbWE6IENvbHVtblNjaGVtYUJhc2UpIHtcclxuICAgICAgICByZXR1cm4gbmV3IERyb3Bkb3duT3B0aW9ucyh7XHJcbiAgICAgICAgICAgIGRpc3BsYXlGaWVsZDogc2NoZW1hLmRpc3BsYXlGaWVsZCxcclxuICAgICAgICAgICAgdmFsdWVGaWVsZDogc2NoZW1hLnZhbHVlRmllbGQsXHJcbiAgICAgICAgICAgIGZpZWxkUGx1czogc2NoZW1hLmZpZWxkUGx1cyxcclxuICAgICAgICAgICAgZmllbGRUcmVlOiBzY2hlbWEuZmllbGRUcmVlLFxyXG4gICAgICAgICAgICBmaWVsZFBhcmVudFRyZWVJdGVtOiBzY2hlbWEuZmllbGRQYXJlbnRUcmVlSXRlbSxcclxuICAgICAgICAgICAgZnVuY0dldExhYmVsOiBzY2hlbWEuZnVuY0dldExhYmVsLFxyXG4gICAgICAgICAgICBzb3J0RmllbGQ6IHNjaGVtYS5zb3J0RmllbGQsXHJcbiAgICAgICAgICAgIHNvcnREaXI6IHNjaGVtYS5zb3J0RGlyLFxyXG4gICAgICAgICAgICBjYWxsYmFja0RhdGFGaW5pc2g6IHNjaGVtYS5jYWxsYmFja0RhdGFGaW5pc2hcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhZnRlckdldFJlZkRhdGFEcm9wZG93bihmaWVsZDogc3RyaW5nKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbWVyZ2VJbmZvVG9Db2x1bW5TY2hlbWEoKSB7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nLmNvbHMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjb2x1bW5Nb2RlbFNjaGVtYSA9IHRoaXMuc2V0dGluZy5tb2RlbFNjaGVtYXMuZmluZChwID0+IHAuZmllbGQgPT0gY29sLmZpZWxkKTtcclxuICAgICAgICAgICAgaWYgKGNvbHVtbk1vZGVsU2NoZW1hKSB7XHJcbiAgICAgICAgICAgICAgICBjb2wubGFiZWwgPSBjb2x1bW5Nb2RlbFNjaGVtYS5uYW1lO1xyXG4gICAgICAgICAgICAgICAgY29sLmZ1bGxMYWJlbCA9IGNvbHVtbk1vZGVsU2NoZW1hLmZ1bGxOYW1lO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjb2wuZGlzcGxheUZpZWxkSW5HcmlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29sLmRpc3BsYXlGaWVsZEluR3JpZCA9IGNvbC5kaXNwbGF5RmllbGQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNvbC5kYXRhVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbC5kYXRhVHlwZSA9IHRoaXMuZ2V0RGF0YVR5cGUoY29sdW1uTW9kZWxTY2hlbWEuZGF0YVR5cGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXREYXRhVHlwZSh0eXBlOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdlbmVyYXRlRmllbGRTZWFyY2hUZXh0KCkge1xyXG4gICAgICAgIHRoaXMuc2V0dGluZy5jb2xzLmZvckVhY2goY29sID0+IHtcclxuICAgICAgICAgICAgaWYgKGNvbC5mdWxsVGV4dFNlYXJjaCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmZpZWxkU2VhcmNoVGV4dC5wdXNoKGNvbC5maWVsZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5nLmZpZWxkU2VhcmNoVGV4dC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbHRlcnMgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmZpZWxkU2VhcmNoVGV4dC5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgICAgICAgICAgIGZpbHRlcnMucHVzaChuZXcgRmlsdGVyKHsgZmllbGQsIG9wZXJhdG9yOiBPcGVyYXRvci5jb250YWluLCBzb3VyY2VGaWVsZDogJ19rJyB9KSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5maWx0ZXJUZW1wbGF0ZUFkdnMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy5maWx0ZXJUZW1wbGF0ZUFkdnMuc3BsaWNlKDAsIDAsIG5ldyBGaWx0ZXIoe1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2ljOiAnb3InLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcnNcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=