gamma-app-controller 1.2.8 → 1.2.10

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.
@@ -7,6 +7,8 @@ import { GammaTableWithPercentageComponent } from '../../shared/advanced-compone
7
7
  import { GammSingleNumberCardComponent } from '../../shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component';
8
8
  import { GammaAdvanceOperatorTableComponent } from '../../shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component';
9
9
  import { AdvanceWidgetHeaderFilterComponent } from '../../shared/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component';
10
+ import { GammaGeoChartComponent } from '../../shared/advanced-component/gamma-geo-chart/gamma-geo-chart.component';
11
+ import { GammaHeatChartComponent } from '../../shared/advanced-component/gamma-heatmap/gamma-heatmap.component';
10
12
  import { forkJoin } from 'rxjs';
11
13
  import * as i0 from "@angular/core";
12
14
  import * as i1 from "../../application-controller/common";
@@ -14,10 +16,11 @@ import * as i2 from "@angular/router";
14
16
  import * as i3 from "./landing-component.service";
15
17
  import * as i4 from "ngx-toastr";
16
18
  import * as i5 from "./landing-dataset-call.service";
17
- import * as i6 from "@angular/common";
18
- import * as i7 from "../../shared/loading/loading.component";
19
+ import * as i6 from "./landing.tokenStorage.servce";
20
+ import * as i7 from "@angular/common";
21
+ import * as i8 from "../../shared/loading/loading.component";
19
22
  export class LandingComponentComponent {
20
- constructor(commonService, activatedRoute, viewContainerRef, componentFactoryResolver, service, toastr, router, datasetService) {
23
+ constructor(commonService, activatedRoute, viewContainerRef, componentFactoryResolver, service, toastr, router, datasetService, storage) {
21
24
  this.commonService = commonService;
22
25
  this.activatedRoute = activatedRoute;
23
26
  this.viewContainerRef = viewContainerRef;
@@ -26,6 +29,7 @@ export class LandingComponentComponent {
26
29
  this.toastr = toastr;
27
30
  this.router = router;
28
31
  this.datasetService = datasetService;
32
+ this.storage = storage;
29
33
  this.dashbord_container = [];
30
34
  this.widget_width = ['w-full', 'w-1/2', 'w-1/3', 'w-1/4', 'w-1/5', 'w-1/6'];
31
35
  this.page_title = 'Dashboard';
@@ -37,7 +41,9 @@ export class LandingComponentComponent {
37
41
  GammaTableWithPercentageComponent,
38
42
  GammSingleNumberCardComponent,
39
43
  GammaAdvanceOperatorTableComponent,
40
- AdvanceWidgetHeaderFilterComponent
44
+ AdvanceWidgetHeaderFilterComponent,
45
+ GammaGeoChartComponent,
46
+ GammaHeatChartComponent
41
47
  };
42
48
  this.dataSourceMataData = [];
43
49
  this.queryType = "mongo";
@@ -62,11 +68,14 @@ export class LandingComponentComponent {
62
68
  this.contextMenuDataSource = [];
63
69
  this.havingDataObject = {};
64
70
  this.globalDefaultFilter = {};
65
- this.kpi_breadcrumbs_container = [];
71
+ this.defaultViewIds = [];
72
+ this.defaultViewIdsOnPageRefresh = [];
73
+ this.defaultMatchedFilters = { operationFilter: { startDate: "", endDate: "" } };
74
+ this.isDefaultFilterParams = false;
66
75
  }
67
76
  ngOnInit() {
68
77
  this.loadingModal = true;
69
- this.pageId = this.activatedRoute.snapshot.data['pageId'];
78
+ this.pageId = this.activatedRoute.snapshot.queryParams['pageId'];
70
79
  this.getPadeDataSource(false);
71
80
  }
72
81
  async getFiltersForTemplate(filter) {
@@ -82,9 +91,9 @@ export class LandingComponentComponent {
82
91
  let apiCalls = [];
83
92
  this.allWidgetByDataset.forEach(view => {
84
93
  view.datasetIds.forEach(id => {
85
- let found = this.dataSetModal.find(d => d.datasetId === id);
94
+ let found = this.dataSetModal.find(d => d.datasetId === id.datasetId);
86
95
  if (found) {
87
- apiCalls.push(this.datasetService.getDataFromDataSet(found, id, filter));
96
+ apiCalls.push(this.datasetService.getDataFromDataSet(found, id.datasetId, filter));
88
97
  }
89
98
  });
90
99
  });
@@ -102,11 +111,10 @@ export class LandingComponentComponent {
102
111
  this.pageTitle = data.pageName;
103
112
  this.dashBoardWidgetConfig = data;
104
113
  if (!context) {
105
- this.defaultStartDate = moment().subtract('30', 'days').format('YYYY-MM-DD');
106
- this.defaultEndDate = moment().subtract('1', 'days').format('YYYY-MM-DD');
107
- this.createDivElements(this.uniqueDataSetObject, false);
114
+ if (Object.keys(this.uniqueDataSetObject).length != 0) {
115
+ this.createDivElements(this.uniqueDataSetObject, false);
116
+ }
108
117
  this.getComponentConfigSet();
109
- this.loadingModal = false;
110
118
  }
111
119
  resolve();
112
120
  },
@@ -120,6 +128,7 @@ export class LandingComponentComponent {
120
128
  getComponentConfigSet() {
121
129
  let dataset = this.service.getAppDatasetConfigs();
122
130
  let viewComponent = this.service.getAppViewConfigs();
131
+ this.defaultViewIds = [];
123
132
  forkJoin({
124
133
  datasetConfig: dataset,
125
134
  viewConfig: viewComponent
@@ -128,12 +137,38 @@ export class LandingComponentComponent {
128
137
  this.componentConfigDataSource = viewConfig;
129
138
  this.dataSetModal = datasetConfig;
130
139
  this.allWidgetByDataset = [];
140
+ let { pageId, startDate, endDate, ...params } = this.activatedRoute.snapshot.queryParams;
141
+ let defaultFilters = { operationFilter: { startDate: "", endDate: "", ...params } };
131
142
  this.dashBoardWidgetConfig.widgets.forEach(widget => {
132
- let defaultFilters = { operationFilter: { startDate: "", endDate: "" } };
133
- if (widget.filters && widget.filters.filterItems) {
134
- widget.filters.filterItems.forEach(element => {
135
- if (element.filterType === 'date' || element.filterType === 'datetime') {
136
- if (element.defaultFilterType === "dynamic" && element.momentFunction !== "" && element.defaultFilterValue !== "" && element.momentFormat !== "") {
143
+ widget.filters.filterItems.forEach(element => {
144
+ if (element.filterType === 'date' || element.filterType === 'datetime') {
145
+ if (element.defaultFilterType === "dynamic" && element.momentFunction !== "" && element.defaultFilterValue !== "" && element.momentFormat !== "") {
146
+ if (element.momentFunction == "monthPicker") {
147
+ let [count, unit] = element.defaultFilterValue.split(',');
148
+ if (element.apiName === "endDate") {
149
+ if (element.display) {
150
+ defaultFilters.operationFilter.endDate = moment().subtract(parseInt(count), unit).endOf(unit).format(element.momentFormat);
151
+ this.defaultEndDate = moment().subtract(parseInt(count), unit).endOf(unit).format(element.momentFormat);
152
+ }
153
+ }
154
+ if (element.apiName === "startDate") {
155
+ defaultFilters.operationFilter.startDate = moment().subtract(parseInt(count), unit).startOf(unit).format(element.momentFormat);
156
+ ;
157
+ }
158
+ }
159
+ else if (element.momentFunction == "weekPicker") {
160
+ if (element.apiName === "endDate") {
161
+ if (element.display) {
162
+ defaultFilters.operationFilter.endDate = moment().endOf('week').format(element.momentFormat);
163
+ this.defaultEndDate = moment().endOf('week').format(element.momentFormat);
164
+ }
165
+ }
166
+ if (element.apiName === "startDate") {
167
+ defaultFilters.operationFilter.startDate = moment().startOf('week').format(element.momentFormat);
168
+ this.defaultStartDate = moment().startOf('week').format(element.momentFormat);
169
+ }
170
+ }
171
+ else {
137
172
  let [count, unit] = element.defaultFilterValue.split(',');
138
173
  if (element.apiName === "endDate") {
139
174
  if (element.display) {
@@ -143,37 +178,58 @@ export class LandingComponentComponent {
143
178
  }
144
179
  if (element.apiName === "startDate") {
145
180
  defaultFilters.operationFilter.startDate = moment()[element.momentFunction](parseInt(count), unit).format(element.momentFormat);
181
+ this.defaultStartDate = moment()[element.momentFunction](parseInt(count), unit).format(element.momentFormat);
146
182
  }
147
183
  }
148
184
  }
149
- else {
150
- if ((typeof element.filterDataSourceValue === "string" && element.filterDataSourceValue !== "") ||
151
- (Array.isArray(element.filterDataSourceValue) && element.filterDataSourceValue.length > 0)) {
152
- if (element.operatorName !== "") {
153
- defaultFilters.operationFilter[element.operatorName] = Array.isArray(element.filterDataSourceValue)
154
- ? element.filterDataSourceValue
155
- : [element.filterDataSourceValue];
156
- }
157
- else {
158
- defaultFilters.operationFilter[element.apiName] = element.filterDataSourceValue.join(",");
185
+ else if (element.defaultFilterType === "static" && element.defaultFilterValue !== "") {
186
+ if (element.apiName === "endDate") {
187
+ if (element.display) {
188
+ defaultFilters.operationFilter.endDate = element.defaultFilterValue;
189
+ this.defaultEndDate = element.defaultFilterValue;
159
190
  }
160
191
  }
192
+ if (element.apiName === "startDate") {
193
+ defaultFilters.operationFilter.startDate = element.defaultFilterValue;
194
+ this.defaultStartDate = element.defaultFilterValue;
195
+ }
161
196
  }
162
- });
163
- }
164
- let urlParams = defaultFilters.operationFilter;
165
- urlParams['pageId'] = this.pageId;
166
- let navigation = {
167
- queryParams: urlParams,
168
- queryParamsHandling: "merge"
169
- };
170
- this.router.navigate([], navigation);
197
+ }
198
+ else {
199
+ if ((typeof element.filterDataSourceValue === "string" && element.filterDataSourceValue !== "") ||
200
+ (Array.isArray(element.filterDataSourceValue) && element.filterDataSourceValue.length > 0)) {
201
+ if (element.operatorName !== "") {
202
+ defaultFilters.operationFilter[element.operatorName] = Array.isArray(element.filterDataSourceValue)
203
+ ? element.filterDataSourceValue
204
+ : [element.filterDataSourceValue];
205
+ }
206
+ else {
207
+ defaultFilters.operationFilter[element.apiName] = element.filterDataSourceValue.join(",");
208
+ }
209
+ }
210
+ }
211
+ });
171
212
  let datasetIds = new Set();
172
213
  let viewIds = new Set();
173
214
  widget.widgetNode.forEach(node => {
174
215
  if (node.nodeProperties.display) {
175
216
  node.compConfig.viewConfig.forEach(view => {
176
- datasetIds.add(view.datasetId);
217
+ this.defaultViewIds.push(view.viewId);
218
+ const foundObject = this.defaultViewIdsOnPageRefresh?.find(item => item.viewId === view.viewId);
219
+ const derivedFilters = foundObject ? this.getDrildownFilter(foundObject, defaultFilters) : defaultFilters;
220
+ let obj = {
221
+ "filters": JSON.parse(JSON.stringify(derivedFilters)),
222
+ "keyToPass": [],
223
+ "drillDownType": "natural",
224
+ "drilldownFrom": ""
225
+ };
226
+ this.stateDataSource.set(view.viewId, obj);
227
+ let node = {
228
+ datasetId: view.datasetId,
229
+ viewId: view.viewId,
230
+ filter: derivedFilters
231
+ };
232
+ datasetIds.add(node);
177
233
  viewIds.add(view.viewId);
178
234
  });
179
235
  }
@@ -183,15 +239,10 @@ export class LandingComponentComponent {
183
239
  });
184
240
  }
185
241
  });
186
- viewIds.forEach(element => {
187
- let obj = {
188
- "filters": JSON.parse(JSON.stringify(defaultFilters)),
189
- "keyToPass": [],
190
- "drillDownType": "natural",
191
- "drilldownFrom": ""
192
- };
193
- this.stateDataSource.set(element, obj);
194
- });
242
+ if (this.defaultViewIdsOnPageRefresh?.length) {
243
+ const newViews = this.defaultViewIdsOnPageRefresh.map(item => item.viewId);
244
+ this.defaultViewIds = [...this.defaultViewIds, ...newViews.filter(item => !this.defaultViewIds.includes(item))];
245
+ }
195
246
  let obj = {
196
247
  widgetId: widget.widgetId,
197
248
  pageId: widget.pageId,
@@ -200,14 +251,13 @@ export class LandingComponentComponent {
200
251
  };
201
252
  this.allWidgetByDataset.push(obj);
202
253
  });
203
- console.log(this.stateDataSource);
204
254
  this.uniqueDataSetObject = {};
205
255
  let apiCalls = [];
206
256
  this.allWidgetByDataset.forEach(view => {
207
257
  view.datasetIds.forEach(id => {
208
- let found = datasetConfig.find(d => d.datasetId === id);
258
+ let found = datasetConfig.find(d => d.datasetId === id.datasetId);
209
259
  if (found) {
210
- apiCalls.push(this.datasetService.getDataFromDataSet(found, id, view.filters));
260
+ apiCalls.push(this.datasetService.getDataFromDataSet(found, id.datasetId, id.filter));
211
261
  }
212
262
  });
213
263
  });
@@ -215,8 +265,16 @@ export class LandingComponentComponent {
215
265
  this.uniqueDataSetObject = this.datasetService.getUniqueDataSetObject();
216
266
  this.createDivElements(this.uniqueDataSetObject, false);
217
267
  this.loadingModal = false;
268
+ let urlParams = defaultFilters.operationFilter;
269
+ urlParams['pageId'] = this.pageId;
270
+ let navigation = {
271
+ queryParams: urlParams,
272
+ queryParamsHandling: "merge"
273
+ };
274
+ this.router.navigate([], navigation);
218
275
  });
219
276
  }), error: (err) => {
277
+ this.loadingModal = false;
220
278
  this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Error');
221
279
  }
222
280
  });
@@ -242,7 +300,7 @@ export class LandingComponentComponent {
242
300
  const filterItems = (div.filters) ? div.filters.filterItems : [];
243
301
  this.loadFilterComponent(div, filterDiv, filterItems, context_filter);
244
302
  rowDiv.appendChild(filterDiv);
245
- if (div.widgetNode && div.widgetNode.length != 0) {
303
+ if (div.widgetNode.length != 0) {
246
304
  let mainItemDiv = rowDiv.querySelector('.flex.flex-wrap');
247
305
  if (context && mainItemDiv) {
248
306
  mainItemDiv.innerHTML = "";
@@ -311,7 +369,13 @@ export class LandingComponentComponent {
311
369
  widgetDiv.classList.add('flex', 'items-center', 'justify-between', 'font-bold', 'text-md', 'text-gray-900', 'dark:text-white', 'border-b', 'p-3', 'bg-gray-800', 'mx-2', 'rounded-t-lg', 'relative');
312
370
  const titleDiv = document.createElement('div');
313
371
  titleDiv.classList.add('relative', 'group');
314
- const params = item.nodeProperties.widgetParams || "";
372
+ let params = "";
373
+ if (!item.nodeProperties.widgetParams && this.defaultViewIdsOnPageRefresh?.length) {
374
+ params = this.getTitleParams(item) || "";
375
+ }
376
+ else {
377
+ params = item.nodeProperties.widgetParams || "";
378
+ }
315
379
  const widgetTitle = item.nodeProperties.widgetTitle;
316
380
  const tooltipMatch = widgetTitle.match(/\$t\{([\s\S]*?)\}/);
317
381
  const displayTitle = widgetTitle.replace(/\$t\{[\s\S]*?\}/g, '').trim();
@@ -402,7 +466,7 @@ export class LandingComponentComponent {
402
466
  const dynamicComponentInstance = this.CompRefs.instance;
403
467
  dynamicComponentInstance.chartDataSource = data;
404
468
  dynamicComponentInstance.kpi_name = "";
405
- if (data.kpiConfig.componentName == "GammaAdvanceOperatorTableComponent" || data.kpiConfig.componentName == "GammaTableWithPercentageComponent" || data.kpiConfig.componentName == "GammaGeoChartComponent") {
469
+ if (data.kpiConfig.componentName == "GammaAdvanceOperatorTableComponent" || data.kpiConfig.componentName == "GammaTableWithPercentageComponent") {
406
470
  dynamicComponentInstance.oRowClick.subscribe((value) => {
407
471
  this.getRowClick(value);
408
472
  });
@@ -410,24 +474,37 @@ export class LandingComponentComponent {
410
474
  this.getContextClick(value);
411
475
  });
412
476
  }
477
+ else if (data.kpiConfig.componentName == "GammaAdvanceChartComponent") {
478
+ dynamicComponentInstance.onChartPointClick.subscribe((value) => {
479
+ this.getRowClick(value);
480
+ });
481
+ }
413
482
  const cssClass = "w-full";
414
483
  this.CompRefs.location.nativeElement.classList.add(cssClass);
415
484
  containerElement.appendChild(this.CompRefs.location.nativeElement);
416
485
  }
417
486
  loadFilterComponent(indexObj, containerElement, filterItems, context_filter) {
487
+ let userName = this.storage.get('user_name');
418
488
  let selectedDates = { startDate: this.defaultStartDate, endDate: this.defaultEndDate };
419
489
  const componentClass = this.componentClassMap['AppAdvanceHeaderComponent'];
420
490
  this.CompRefs = this.viewContainerRef.createComponent(componentClass);
421
491
  const dynamicComponentInstance = this.CompRefs.instance;
422
492
  dynamicComponentInstance.selectedDates = selectedDates;
423
493
  dynamicComponentInstance.filterItems = filterItems;
424
- dynamicComponentInstance.pageTitle = this.pageTitle;
425
494
  dynamicComponentInstance.contextFilterItems = context_filter;
495
+ dynamicComponentInstance.pageTitle = this.pageTitle;
426
496
  dynamicComponentInstance.bread_crumbs_container = this.kpi_breadcrumbs_container;
497
+ dynamicComponentInstance.isEditButton = (userName && userName == "admin") ? true : false;
427
498
  dynamicComponentInstance.isAdvanceButton = true;
428
499
  dynamicComponentInstance.getFilterPageConfig.subscribe((value) => {
429
500
  this.getFiltersForTemplate(value);
430
501
  });
502
+ dynamicComponentInstance.getOperatorName.subscribe((value) => {
503
+ this.loadDataByOperator(value);
504
+ });
505
+ dynamicComponentInstance.getContextFilterData.subscribe((value) => {
506
+ this.getContextFilterData(value);
507
+ });
431
508
  indexObj.compConfig.dynamicComponentRefs.push(this.CompRefs);
432
509
  const cssClass = "w-full";
433
510
  this.CompRefs.location.nativeElement.classList.add(cssClass);
@@ -460,6 +537,7 @@ export class LandingComponentComponent {
460
537
  if (this.getElementOfCurrentView(node, event.drilldownTo)) {
461
538
  let view = element.widgetNode[nodeIndex];
462
539
  let apiCalls = [];
540
+ let chatApiCall = [];
463
541
  let appliedFilters = this.getSetOperatorFilter(event, this.stateDataSource.get(event.drilldownFrom));
464
542
  view.compConfig.viewConfig.forEach(contentView => {
465
543
  let found = this.dataSetModal.find(d => d.datasetId === contentView.datasetId);
@@ -544,39 +622,14 @@ export class LandingComponentComponent {
544
622
  const queryParams = this.activatedRoute.snapshot.queryParamMap;
545
623
  if (currentViewNode) {
546
624
  const drildownsForCurrentView = [];
625
+ const drildownsForCurrentPage = [];
547
626
  currentViewNode.compConfig.viewConfig.forEach(async (element) => {
548
627
  if (element.kpiConfig.viewProperties.enableClickEvent) {
549
- this.dashBoardWidgetConfig.widgets.forEach(element => {
550
- for (let entry of deletedViewIds) {
551
- element.widgetNode.forEach(viewValue => {
552
- viewValue.compConfig.viewConfig.forEach(viewId => {
553
- if (viewId.viewId == entry) {
554
- const exists = this.contextMenuDataSource.some(item => item.viewId === viewId.viewId);
555
- if (!exists) {
556
- this.contextMenuDataSource.push({
557
- viewId: viewId.viewId,
558
- viewName: currentViewNode.nodeProperties.widgetTitle,
559
- displayKey: viewId.kpiConfig.keyToPass
560
- });
561
- }
562
- const startData = this.stateDataSource.get(entry);
563
- if (startData) {
564
- this.stateDataSource.delete(entry);
565
- }
566
- viewValue.nodeProperties['display'] = false;
567
- const prefixedId = `id-${viewValue.id}`;
568
- const elementToHide = document.querySelector(`#${prefixedId}`);
569
- if (elementToHide) {
570
- elementToHide.remove();
571
- }
572
- }
573
- });
574
- });
575
- }
576
- });
577
- if (element.kpiConfig.viewProperties.enableClickEvent && element.kpiConfig.viewProperties.clickEventOptions.eventType != "") {
628
+ if (element.kpiConfig.viewProperties.clickEventOptions?.eventType !== undefined &&
629
+ element.kpiConfig.viewProperties.clickEventOptions.eventType !== "") {
578
630
  let eventType = element.kpiConfig.viewProperties.clickEventOptions.eventType;
579
631
  let associatedViews = element.kpiConfig.viewProperties.clickEventOptions.associatedViews;
632
+ let associatedPage = (element.kpiConfig.viewProperties.clickEventOptions.associatedPage) ? element.kpiConfig.viewProperties.clickEventOptions.associatedPage : "";
580
633
  if (eventType == 'optionalDrillDown') {
581
634
  if (associatedViews && associatedViews.length != 0) {
582
635
  for (let viewForDrillDown of associatedViews) {
@@ -595,32 +648,74 @@ export class LandingComponentComponent {
595
648
  }
596
649
  }
597
650
  }
598
- else if (eventType == 'drilldown') {
651
+ else if (eventType == 'drilldown' || eventType == 'popup') {
599
652
  for (let entry of associatedViews) {
600
653
  drildownsForCurrentView.push(entry);
601
654
  }
602
655
  }
603
- else if (!eventType) {
604
- const nextViewIndex = stateData.indexOf(event.viewId) + 1;
605
- const nextView = this.dashBoardWidgetConfig.widgets
606
- .map(widget => widget.widgetNode[nextViewIndex])
607
- .find(node => node);
608
- if (nextView) {
609
- this.loadingModal = true;
610
- await this.getViewByRowCLick(event, nextView);
611
- }
656
+ else if (eventType == 'navigateToPage') {
657
+ this.service.getAppPageDetailConfig(associatedPage).subscribe({
658
+ next: (data) => {
659
+ let { pageId, ...params } = this.activatedRoute.snapshot.queryParams;
660
+ event.keyToPass.forEach(element => {
661
+ params[element] = event.data[element];
662
+ });
663
+ params['pageId'] = associatedPage;
664
+ const queryString = new URLSearchParams(params).toString();
665
+ const fullUrl = this.router.serializeUrl(this.router.createUrlTree([data.pageUrl], { queryParams: params }));
666
+ window.open(fullUrl, '_blank');
667
+ console.log(data);
668
+ }
669
+ });
670
+ }
671
+ else if (eventType == 'sameViewDrilldown') {
672
+ debugger;
612
673
  }
613
674
  if (drildownsForCurrentView.length != 0) {
614
675
  for (let viewIdForNext of drildownsForCurrentView) {
615
676
  const nextViewNode = this.dashBoardWidgetConfig.widgets
616
677
  .map(widget => widget.widgetNode.find(node => this.getElementOfCurrentView(node, viewIdForNext)))
617
678
  .find(node => node);
618
- this.loadingModal = true;
619
- await this.getViewByRowCLick(event, nextViewNode);
679
+ if (eventType == 'popup') {
680
+ this.loadingModal = true;
681
+ await this.getModalViewByRowCLick(event, nextViewNode);
682
+ }
683
+ else {
684
+ this.loadingModal = true;
685
+ await this.getViewByRowCLick(event, nextViewNode);
686
+ }
620
687
  }
621
688
  }
622
689
  }
623
690
  else {
691
+ this.dashBoardWidgetConfig.widgets.forEach(element => {
692
+ for (let entry of deletedViewIds) {
693
+ element.widgetNode.forEach(viewValue => {
694
+ viewValue.compConfig.viewConfig.forEach(viewId => {
695
+ if (viewId.viewId == entry) {
696
+ const exists = this.contextMenuDataSource.some(item => item.viewId === viewId.viewId);
697
+ if (!exists) {
698
+ this.contextMenuDataSource.push({
699
+ viewId: viewId.viewId,
700
+ viewName: currentViewNode.nodeProperties.widgetTitle,
701
+ displayKey: viewId.kpiConfig.keyToPass
702
+ });
703
+ }
704
+ const startData = this.stateDataSource.get(entry);
705
+ if (startData) {
706
+ this.stateDataSource.delete(entry);
707
+ }
708
+ viewValue.nodeProperties['display'] = false;
709
+ const prefixedId = `id-${viewValue.id}`;
710
+ const elementToHide = document.querySelector(`#${prefixedId}`);
711
+ if (elementToHide) {
712
+ elementToHide.remove();
713
+ }
714
+ }
715
+ });
716
+ });
717
+ }
718
+ });
624
719
  const nextViewIndex = stateData.indexOf(event.viewId) + 1;
625
720
  const nextView = this.dashBoardWidgetConfig.widgets
626
721
  .map(widget => widget.widgetNode[nextViewIndex])
@@ -652,10 +747,42 @@ export class LandingComponentComponent {
652
747
  this.scrollToBottom(this.mainPageDivElement);
653
748
  }, 200);
654
749
  });
655
- console.log(this.stateDataSource);
750
+ }
751
+ async getModalViewByRowCLick(event, view) {
752
+ let apiCalls = [];
753
+ let appliedFilters = this.getSetOperatorFilter(event, this.stateDataSource.get(event.viewId));
754
+ view.compConfig.viewConfig.forEach(contentView => {
755
+ let found = this.dataSetModal.find(d => d.datasetId === contentView.datasetId);
756
+ if (found) {
757
+ apiCalls.push(this.datasetService.getDataFromDataSet(found, contentView.datasetId, appliedFilters));
758
+ }
759
+ });
760
+ await Promise.all(apiCalls);
761
+ this.contextMenuDataSource = this.contextMenuDataSource.filter(e => e.displayKey !== event.keyToPass);
762
+ view.compConfig.viewConfig.forEach(viewforDataSet => {
763
+ let obj = {
764
+ "filters": appliedFilters,
765
+ "keyToPass": this.updateOperatorData(event.keyToPass, event.data),
766
+ "drillDownType": event.drillDownType,
767
+ "drilldownFrom": event.drilldownFrom
768
+ };
769
+ this.stateDataSource.set(viewforDataSet['viewId'], obj);
770
+ });
771
+ view.nodeProperties['display'] = true;
772
+ view.nodeProperties['widgetParams'] = event.tableTitle;
773
+ this.uniqueDataSetObject = this.datasetService.getUniqueDataSetObject();
774
+ this.modalConfigs = {
775
+ view: view,
776
+ datasource: this.uniqueDataSetObject
777
+ };
778
+ setTimeout(() => {
779
+ this.loadingModal = false;
780
+ this.isPopupView = true;
781
+ }, 200);
656
782
  }
657
783
  async getViewByRowCLick(event, view) {
658
784
  let apiCalls = [];
785
+ let chatApiCall = [];
659
786
  let appliedFilters = this.getSetOperatorFilter(event, this.stateDataSource.get(event.viewId));
660
787
  view.compConfig.viewConfig.forEach(contentView => {
661
788
  let found = this.dataSetModal.find(d => d.datasetId === contentView.datasetId);
@@ -680,15 +807,15 @@ export class LandingComponentComponent {
680
807
  const containerElement = document.querySelector(`#${prefixedId}`);
681
808
  this.uniqueDataSetObject = this.datasetService.getUniqueDataSetObject();
682
809
  this.loadSingleWidgetNode(view, this.mainPageDivElement, this.uniqueDataSetObject);
683
- setTimeout(() => {
684
- this.scrollToBottom(this.mainPageDivElement);
685
- }, 200);
686
810
  let navigation = {
687
811
  queryParams: appliedFilters['operationFilter'],
688
812
  queryParamsHandling: "merge"
689
813
  };
690
814
  this.router.navigate([], navigation);
691
815
  console.log(this.stateDataSource);
816
+ setTimeout(() => {
817
+ this.scrollToBottom(this.mainPageDivElement);
818
+ }, 200);
692
819
  }
693
820
  scrollToBottom(container) {
694
821
  setTimeout(() => {
@@ -732,7 +859,8 @@ export class LandingComponentComponent {
732
859
  const appliedFilter = JSON.parse(JSON.stringify(previousViewStates.filters.operationFilter));
733
860
  keyToPass.forEach(key => {
734
861
  if (key in data) {
735
- if (key === "recordDate" && "startDate" in appliedFilter && "endDate" in appliedFilter) {
862
+ const normalizedKey = key.toLowerCase().replace(/_/g, '');
863
+ if (normalizedKey === "recorddate" && "startDate" in appliedFilter && "endDate" in appliedFilter) {
736
864
  appliedFilter.startDate = data[key];
737
865
  appliedFilter.endDate = data[key];
738
866
  }
@@ -848,13 +976,187 @@ export class LandingComponentComponent {
848
976
  }, 200);
849
977
  });
850
978
  }
979
+ async loadDataByOperator(opName) {
980
+ let filter = { operationFilter: { startDate: "", endDate: "", operator_key: "" } };
981
+ filter.operationFilter['startDate'] = this.defaultStartDate;
982
+ filter.operationFilter['endDate'] = this.defaultEndDate;
983
+ filter.operationFilter['operator_key'] = opName;
984
+ this.loadingModal = true;
985
+ let navigation = {
986
+ queryParams: {
987
+ "operatorName": opName
988
+ },
989
+ queryParamsHandling: "merge"
990
+ };
991
+ this.router.navigate([], navigation);
992
+ await this.getPadeDataSource(true);
993
+ this.uniqueDataSetObject = {};
994
+ let apiCalls = [];
995
+ this.allWidgetByDataset.forEach(view => {
996
+ view.datasetIds.forEach(id => {
997
+ let found = this.dataSetModal.find(d => d.datasetId === id.datasetId);
998
+ if (found) {
999
+ apiCalls.push(this.datasetService.getDataFromDataSet(found, id.datasetId, filter));
1000
+ }
1001
+ });
1002
+ });
1003
+ Promise.all(apiCalls).then(() => {
1004
+ this.globalDefaultFilter = filter;
1005
+ this.uniqueDataSetObject = this.datasetService.getUniqueDataSetObject();
1006
+ this.createDivElements(this.uniqueDataSetObject, true);
1007
+ this.loadingModal = false;
1008
+ });
1009
+ }
1010
+ async getContextFilterData(value) {
1011
+ let filter = { operationFilter: { startDate: "", endDate: "" } };
1012
+ filter.operationFilter['startDate'] = this.defaultStartDate;
1013
+ filter.operationFilter['endDate'] = this.defaultEndDate;
1014
+ filter.operationFilter[value.operatorName] = this.parseInput(value.defaultFilterValue);
1015
+ this.loadingModal = true;
1016
+ let obj = {};
1017
+ obj[value.operatorName] = value.defaultFilterValue;
1018
+ let navigation = {
1019
+ queryParams: obj,
1020
+ queryParamsHandling: "merge"
1021
+ };
1022
+ this.router.navigate([], navigation);
1023
+ await this.getPadeDataSource(true);
1024
+ this.uniqueDataSetObject = {};
1025
+ let apiCalls = [];
1026
+ this.allWidgetByDataset.forEach(view => {
1027
+ view.datasetIds.forEach(id => {
1028
+ let found = this.dataSetModal.find(d => d.datasetId === id.datasetId);
1029
+ if (found) {
1030
+ apiCalls.push(this.datasetService.getDataFromDataSet(found, id.datasetId, filter));
1031
+ }
1032
+ });
1033
+ });
1034
+ Promise.all(apiCalls).then(() => {
1035
+ this.globalDefaultFilter = filter;
1036
+ this.uniqueDataSetObject = this.datasetService.getUniqueDataSetObject();
1037
+ this.createDivElements(this.uniqueDataSetObject, true);
1038
+ this.loadingModal = false;
1039
+ });
1040
+ }
1041
+ parseInput(input) {
1042
+ input = input.trim();
1043
+ if (input.includes(',')) {
1044
+ return input.split(',').map(item => item.trim());
1045
+ }
1046
+ else {
1047
+ return input;
1048
+ }
1049
+ }
1050
+ getDrilldownDisplayByUrlParams(all_views) {
1051
+ this.defaultViewIdsOnPageRefresh = [];
1052
+ const params = this.activatedRoute.snapshot.queryParams;
1053
+ this.defaultViewIdsOnPageRefresh = (params['views'] && params['views'] !== "") ? JSON.parse(decodeURIComponent(params['views'])) : [];
1054
+ debugger;
1055
+ all_views.forEach(element => {
1056
+ for (let entry of element.widgetNode) {
1057
+ let shouldDisplay = false;
1058
+ entry.compConfig.viewConfig.forEach(view => {
1059
+ if (this.defaultViewIdsOnPageRefresh.length !== 0) {
1060
+ const foundObject = this.defaultViewIdsOnPageRefresh.find(val => val.viewId === view.viewId);
1061
+ if (foundObject) {
1062
+ shouldDisplay = true;
1063
+ }
1064
+ }
1065
+ });
1066
+ if (shouldDisplay) {
1067
+ entry.nodeProperties.display = true;
1068
+ }
1069
+ }
1070
+ });
1071
+ }
1072
+ getFiltersForQueryParams(operators, filters, viewParams) {
1073
+ const operationFilter = operators.operationFilter || {};
1074
+ const currentParams = this.activatedRoute.snapshot.queryParams;
1075
+ let currentViews = [];
1076
+ if (currentParams['views']) {
1077
+ try {
1078
+ currentViews = JSON.parse(decodeURIComponent(currentParams['views']));
1079
+ }
1080
+ catch (e) {
1081
+ console.error("Invalid views param");
1082
+ }
1083
+ }
1084
+ const filterData = { viewId: viewParams.viewId };
1085
+ filters.forEach(filter => {
1086
+ const localKey = filter.localColumn;
1087
+ const serverKey = filter.serverColumn;
1088
+ let value = operationFilter[localKey];
1089
+ if (value !== undefined && value !== "") {
1090
+ filterData[serverKey] = value;
1091
+ }
1092
+ });
1093
+ const existingIndex = currentViews.findIndex(v => v.viewId === viewParams.viewId);
1094
+ if (existingIndex !== -1) {
1095
+ currentViews[existingIndex] = filterData;
1096
+ currentViews = currentViews.slice(0, existingIndex + 1);
1097
+ }
1098
+ else {
1099
+ currentViews.push(filterData);
1100
+ }
1101
+ const encodedViews = encodeURIComponent(JSON.stringify(currentViews));
1102
+ const mergedParams = {
1103
+ ...currentParams,
1104
+ views: encodedViews
1105
+ };
1106
+ const navigation = {
1107
+ queryParams: mergedParams,
1108
+ queryParamsHandling: 'merge'
1109
+ };
1110
+ this.router.navigate([], navigation);
1111
+ }
1112
+ getDrildownFilter(drildownFilter, defaultFilter) {
1113
+ const expectedDateFields = ['recordDate', 'record_date', 'eventDate', 'event_date'];
1114
+ const result = JSON.parse(JSON.stringify(defaultFilter));
1115
+ const { viewId, ...filteredDrilldown } = drildownFilter;
1116
+ let dateValue = null;
1117
+ for (const key of expectedDateFields) {
1118
+ if (filteredDrilldown[key]) {
1119
+ dateValue = filteredDrilldown[key];
1120
+ break;
1121
+ }
1122
+ }
1123
+ if (dateValue) {
1124
+ result.operationFilter.startDate = dateValue;
1125
+ result.operationFilter.endDate = dateValue;
1126
+ }
1127
+ for (const key in filteredDrilldown) {
1128
+ if (!expectedDateFields.includes(key)) {
1129
+ result.operationFilter[key] = filteredDrilldown[key];
1130
+ }
1131
+ }
1132
+ return result;
1133
+ }
1134
+ getTitleParams(items) {
1135
+ const results = [];
1136
+ items.compConfig.viewConfig.forEach(element => {
1137
+ const foundObject = this.defaultViewIdsOnPageRefresh.find(val => val.viewId === element.viewId);
1138
+ if (foundObject) {
1139
+ const result = Object.entries(foundObject)
1140
+ .filter(([key]) => key !== 'viewId')
1141
+ .map(([key, value]) => {
1142
+ const formattedKey = key
1143
+ .replace(/_/g, ' ')
1144
+ .replace(/\b\w/g, char => char.toUpperCase());
1145
+ return `${formattedKey} = ${value}`;
1146
+ })
1147
+ .join(' | ');
1148
+ results.push(`| ${result} `);
1149
+ }
1150
+ });
1151
+ return results.join('\n');
1152
+ }
851
1153
  }
852
- LandingComponentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: LandingComponentComponent, deps: [{ token: i1.CommonService }, { token: i2.ActivatedRoute }, { token: i0.ViewContainerRef }, { token: i0.ComponentFactoryResolver }, { token: i3.LandingComponentService }, { token: i4.ToastrService }, { token: i2.Router }, { token: i5.LandingApplicationDatssetsCall }], target: i0.ɵɵFactoryTarget.Component });
853
- LandingComponentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: LandingComponentComponent, selector: "app-landing-component", viewQueries: [{ propertyName: "dynamicComponentContainer", first: true, predicate: ["dynamicComponentContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "containerRef", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef }, { propertyName: "dynamicContainer", first: true, predicate: ["dynamicContainer"], descendants: true, static: true }], ngImport: i0, template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n\n<div class=\"w-full\">\n <div class=\"flex flex-wrap \" #dynamicContainer></div>\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.LoadingComponent, selector: "app-loading" }] });
1154
+ LandingComponentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: LandingComponentComponent, deps: [{ token: i1.CommonService }, { token: i2.ActivatedRoute }, { token: i0.ViewContainerRef }, { token: i0.ComponentFactoryResolver }, { token: i3.LandingComponentService }, { token: i4.ToastrService }, { token: i2.Router }, { token: i5.LandingApplicationDatssetsCall }, { token: i6.AppLandingLayoutLocalStorage }], target: i0.ɵɵFactoryTarget.Component });
1155
+ LandingComponentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: LandingComponentComponent, selector: "app-landing-component", viewQueries: [{ propertyName: "dynamicComponentContainer", first: true, predicate: ["dynamicComponentContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "containerRef", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef }, { propertyName: "dynamicContainer", first: true, predicate: ["dynamicContainer"], descendants: true, static: true }, { propertyName: "dynamicContainerForPopup", first: true, predicate: ["dynamicContainerForPopup"], descendants: true, static: true }], ngImport: i0, template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n\n<div class=\"w-full\">\n <div class=\"flex flex-wrap \" #dynamicContainer></div>\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i8.LoadingComponent, selector: "app-loading" }] });
854
1156
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: LandingComponentComponent, decorators: [{
855
1157
  type: Component,
856
1158
  args: [{ selector: 'app-landing-component', template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n\n<div class=\"w-full\">\n <div class=\"flex flex-wrap \" #dynamicContainer></div>\n</div>" }]
857
- }], ctorParameters: function () { return [{ type: i1.CommonService }, { type: i2.ActivatedRoute }, { type: i0.ViewContainerRef }, { type: i0.ComponentFactoryResolver }, { type: i3.LandingComponentService }, { type: i4.ToastrService }, { type: i2.Router }, { type: i5.LandingApplicationDatssetsCall }]; }, propDecorators: { dynamicComponentContainer: [{
1159
+ }], ctorParameters: function () { return [{ type: i1.CommonService }, { type: i2.ActivatedRoute }, { type: i0.ViewContainerRef }, { type: i0.ComponentFactoryResolver }, { type: i3.LandingComponentService }, { type: i4.ToastrService }, { type: i2.Router }, { type: i5.LandingApplicationDatssetsCall }, { type: i6.AppLandingLayoutLocalStorage }]; }, propDecorators: { dynamicComponentContainer: [{
858
1160
  type: ViewChild,
859
1161
  args: ['dynamicComponentContainer', { read: ViewContainerRef }]
860
1162
  }], containerRef: [{
@@ -863,5 +1165,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
863
1165
  }], dynamicContainer: [{
864
1166
  type: ViewChild,
865
1167
  args: ['dynamicContainer', { static: true }]
1168
+ }], dynamicContainerForPopup: [{
1169
+ type: ViewChild,
1170
+ args: ['dynamicContainerForPopup', { static: true }]
866
1171
  }] } });
867
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFuZGluZy1jb21wb25lbnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi90ZW1wbGF0ZS1tb2R1bGUvZGVmYXVsTGFuZGluZ0NvbXBvbmVudC9sYW5kaW5nLWNvbXBvbmVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL3RlbXBsYXRlLW1vZHVsZS9kZWZhdWxMYW5kaW5nQ29tcG9uZW50L2xhbmRpbmctY29tcG9uZW50LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFrRyxTQUFTLEVBQWdCLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXBNLE9BQU8sTUFBTSxNQUFNLDRDQUE0QyxDQUFDO0FBR2hFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLG1GQUFtRixDQUFDO0FBQy9ILE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHFGQUFxRixDQUFDO0FBQ2xJLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlFQUF5RSxDQUFDO0FBQ3BILE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLG1HQUFtRyxDQUFDO0FBQ3RKLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDJGQUEyRixDQUFDO0FBQzFJLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHFHQUFxRyxDQUFDO0FBQ3pKLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHFHQUFxRyxDQUFDO0FBSXpKLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7OztBQVdoQyxNQUFNLE9BQU8seUJBQXlCO0lBNEVwQyxZQUNTLGFBQTRCLEVBQzNCLGNBQThCLEVBQzlCLGdCQUFrQyxFQUNsQyx3QkFB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S0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQzthQUM5RjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQzlCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFFeEUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQzlGLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUMvQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFVixDQUFDLENBQUMsQ0FBQztJQUVMLENBQUM7O3NIQTVqQ1UseUJBQXlCOzBHQUF6Qix5QkFBeUIsZ0xBWVksZ0JBQWdCLG9HQUVoQyxnQkFBZ0Isa0pDeENsRCxtSkFJTTsyRkRzQk8seUJBQXlCO2tCQUxyQyxTQUFTOytCQUNFLHVCQUF1QjsyVUFpQmpDLHlCQUF5QjtzQkFEeEIsU0FBUzt1QkFBQywyQkFBMkIsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFHbEUsWUFBWTtzQkFEWCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFFRCxnQkFBZ0I7c0JBQWhFLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIENvbXBvbmVudFJlZiwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBPbkRlc3Ryb3ksIE9uSW5pdCwgUXVlcnlMaXN0LCBWaWV3Q2hpbGQsIFZpZXdDaGlsZHJlbiwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIE5hdmlnYXRpb25FeHRyYXMsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJy4uLy4uL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvbW9tZW50LWhlbHBlcic7XG5cbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tICcuLi8uLi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL2NvbW1vbic7XG5pbXBvcnQgeyBHYW1tYUFkdmFuY2VDaGFydENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ2FtbWEtYWR2YW5jZS1jaGFydC9nYW1tYS1hZHZhbmNlLWNoYXJ0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHYW1tYVRvZGF5UHJldmlvdXNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2dhbW1hLXRvZGF5LXByZXZpb3VzL2dhbW1hLXRvZGF5LXByZXZpb3VzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBcHBBZHZhbmNlSGVhZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FkdmFuY2VkLWNvbXBvbmVudC9hcHAtYWR2YW5jZS1oZWFkZXIvYXBwLWhlYWRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FtbWFUYWJsZVdpdGhQZXJjZW50YWdlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FkdmFuY2VkLWNvbXBvbmVudC9nYW1tYS10YWJsZS13aXRoLXBlcmNlbnRhZ2UvZ2FtbWEtdGFibGUtd2l0aC1wZXJjZW50YWdlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHYW1tU2luZ2xlTnVtYmVyQ2FyZENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ2FtbS1zaW5nbGUtbnVtYmVyLWNhcmQvZ2FtbS1zaW5nbGUtbnVtYmVyLWNhcmQuY29tcG9uZW50JztcbmltcG9ydCB7IEdhbW1hQWR2YW5jZU9wZXJhdG9yVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2dhbW1hLWFkdmFuY2Utb3BlcmF0b3ItdGFibGUvZ2FtbWEtYWR2YW5jZS1vcGVyYXRvci10YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQWR2YW5jZVdpZGdldEhlYWRlckZpbHRlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvYWR2YW5jZS13aWRnZXQtaGVhZGVyLWZpbHRlci9hZHZhbmNlLXdpZGdldC1oZWFkZXItZmlsdGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHYW1tYUdlb0NoYXJ0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FkdmFuY2VkLWNvbXBvbmVudC9nYW1tYS1nZW8tY2hhcnQvZ2FtbWEtZ2VvLWNoYXJ0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHYW1tYUhlYXRDaGFydENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ2FtbWEtaGVhdG1hcC9nYW1tYS1oZWF0bWFwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUb2FzdHJTZXJ2aWNlIH0gZnJvbSAnbmd4LXRvYXN0cic7XG5pbXBvcnQgeyBmb3JrSm9pbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTGFuZGluZ0NvbXBvbmVudFNlcnZpY2UgfSBmcm9tICcuL2xhbmRpbmctY29tcG9uZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgTGFuZGluZ0FwcGxpY2F0aW9uRGF0c3NldHNDYWxsIH0gZnJvbSAnLi9sYW5kaW5nLWRhdGFzZXQtY2FsbC5zZXJ2aWNlJztcbi8vIGltcG9ydCB7IEFwcExvY2FsU3RvcmFnZSB9IGZyb20gJy4uLy4uL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvdG9rZW5TdG9yYWdlLnNlcnZjZSc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWxhbmRpbmctY29tcG9uZW50JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2xhbmRpbmctY29tcG9uZW50LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbGFuZGluZy1jb21wb25lbnQuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBMYW5kaW5nQ29tcG9uZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgZGFzaGJvcmRfY29udGFpbmVyOiBhbnkgPSBbXTtcbiAgc2VsZWN0ZWRfd2lkdGg6IGFueTtcbiAgd2lkZ2V0X3dpZHRoID0gWyd3LWZ1bGwnLCAndy0xLzInLCAndy0xLzMnLCAndy0xLzQnLCAndy0xLzUnLCAndy0xLzYnXVxuICBsb2FkaW5nTW9kYWw6IGJvb2xlYW47XG4gIHBhZ2VfdGl0bGUgPSAnRGFzaGJvYXJkJztcbiAgZGVmYXVsdFN0YXJ0RGF0ZTtcbiAgZGVmYXVsdEVuZERhdGU7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKi9cblxuICBAVmlld0NoaWxkKCdkeW5hbWljQ29tcG9uZW50Q29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIGR5bmFtaWNDb21wb25lbnRDb250YWluZXI6IFZpZXdDb250YWluZXJSZWY7XG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICBjb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWY7XG4gIEBWaWV3Q2hpbGQoJ2R5bmFtaWNDb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBkeW5hbWljQ29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gIGR5bmFtaWNDb21wb25lbnRSZWZzOiBDb21wb25lbnRSZWY8YW55PltdID0gW107XG4gIC8vIGR5bmFtaWNDb21wb25lbnRSZWZzOiBDb21wb25lbnRSZWY8YW55PltdID0gW107XG5cbiAgQ29tcFJlZnM6IENvbXBvbmVudFJlZjxhbnk+O1xuXG4gIGNvbXBvbmVudENsYXNzTWFwID0ge1xuICAgIEdhbW1hQWR2YW5jZUNoYXJ0Q29tcG9uZW50LFxuICAgIEdhbW1hVG9kYXlQcmV2aW91c0NvbXBvbmVudCxcbiAgICBBcHBBZHZhbmNlSGVhZGVyQ29tcG9uZW50LFxuICAgIEdhbW1hVGFibGVXaXRoUGVyY2VudGFnZUNvbXBvbmVudCxcbiAgICBHYW1tU2luZ2xlTnVtYmVyQ2FyZENvbXBvbmVudCxcbiAgICBHYW1tYUFkdmFuY2VPcGVyYXRvclRhYmxlQ29tcG9uZW50LFxuICAgIEFkdmFuY2VXaWRnZXRIZWFkZXJGaWx0ZXJDb21wb25lbnRcbiAgfTtcbiAgZGF0YVNvdXJjZU1hdGFEYXRhOiBhbnkgPSBbXTtcbiAgcXVlcnlUeXBlID0gXCJtb25nb1wiO1xuICBkYXRhU2V0TW9kYWw6IGFueSA9IFtdO1xuICBjb21wb25lbnRDb25maWdEYXRhU291cmNlOiBhbnkgPSBbXTtcbiAgc2VsZXNjZWREYXRhU291cmNlOiBhbnk7XG4gIGRhdGFTb3VyY2VNb2RhbDogYW55ID0ge307XG4gIGlzRGFzaEJvYXJkQ29udGVudDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHNlbGVjdGVkVmlld0Zvcm1Db21wb25lbnQ6IGFueSA9IHt9O1xuICBhZGRlZHdpZEdldENvbmZpZyA9IHtcbiAgICBcImRpc3BsYXlcIjogdHJ1ZSxcbiAgICBcIndpZGdldFRpdGxlXCI6IFwiXCIsXG4gICAgXCJ3aWR0aFwiOiBcIlwiLFxuICAgIFwiaGVpZ2h0XCI6IFwiXCJcbiAgfVxuXG5cbiAgZGFzaEJvYXJkV2lkZ2V0Q29uZmlnOiBhbnkgPSBbXG5cbiAgXTtcbiAgaXNXaWRnZXRDcmVhdGlvbkNvbnRlbnQ6IGJvb2xlYW47XG4gIHNlbGVjdGVkV2lkdGg6IGFueTtcbiAgc2VsZWN0ZWRIZWlnaHQ6IGFueTtcbiAgbmV3V2lkZ2V0SW5kZXg6IGFueTtcbiAgc2VsZWN0ZWRJbmRleE9iakZvckNoYXJ0OiBhbnkgPSB7fTtcbiAgc2VsZWN0ZWRDb250YWluZXJPYmplY3RGb3JDaGFydDogYW55ID0ge307XG4gIGRhdGFTZXR0YWJsZURhdGFTb3VyY2U6IGFueTtcbiAgdW5pcXVlRGF0YVNldE9iamVjdCA9IHt9O1xuXG4gIGlzRGFzaEJvYXJkQ29udGVudFR5cGVWaWV3OiBib29sZWFuID0gdHJ1ZTtcbiAgZmlsdGVyczogYW55O1xuICBhbGxXaWRnZXRCeURhdGFzZXQgPSBbXTtcbiAgcGFnZVRpdGxlOiBhbnk7XG4gIHN0YXRlRGF0YVNvdXJjZSA9IG5ldyBNYXAoKTtcbiAgbWFpblBhZ2VEaXZFbGVtZW50OiBhbnk7XG4gIGNvbnRleHRNZW51RGF0YVNvdXJjZTogYW55ID0gW107XG4gIGhhdmluZ0RhdGFPYmplY3Q6IGFueSA9IHt9O1xuICBpc1dpZGdldEZpbHRlcnM6IGJvb2xlYW47XG4gIG5vZGVwcm9wZXJ0aWNlRmlsdGVyRGF0YVNvdXJjZTogYW55O1xuICBnbG9iYWxEZWZhdWx0RmlsdGVyOiBhbnkgPSB7fTtcbiAgcGFnZUlkOiBhbnk7XG5cbiAga3BpX2JyZWFkY3J1bWJzX2NvbnRhaW5lcjogYW55ID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGNvbW1vblNlcnZpY2U6IENvbW1vblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBMYW5kaW5nQ29tcG9uZW50U2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0cjogVG9hc3RyU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgZGF0YXNldFNlcnZpY2U6IExhbmRpbmdBcHBsaWNhdGlvbkRhdHNzZXRzQ2FsbCxcbiAgICAgICAgICAgIC8vIHByaXZhdGUgc3RvcmFnZTogQXBwTG9jYWxTdG9yYWdlXG4gICAgXG5cbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICAgIC8vIHRoaXMua3BpbGlzdFNlcnZpY2UubG9hZGVkJC5waXBlKHRha2UoMSksIHRhcChsb2FkZWQgPT4ge1xuICAgIC8vICAgaWYgKCFsb2FkZWQpIHtcbiAgICAvLyAgICAgdGhpcy5rcGlsaXN0U2VydmljZS5nZXRBbGwoKTtcbiAgICAvLyAgIH1cbiAgICAvLyB9KVxuICAgIC8vICkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAvLyAgIHRoaXMua3BpbGlzdFNlcnZpY2UuZW50aXRpZXMkLnN1YnNjcmliZShyZXNvbHZlZERhdGEgPT4ge1xuICAgIC8vICAgICB0aGlzLmtwaV9icmVhZGNydW1ic19jb250YWluZXIgPSByZXNvbHZlZERhdGE7XG4gICAgLy8gICB9KTtcbiAgICAvLyB9KTtcblxuICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLnBhZ2VJZCA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QuZGF0YVsncGFnZUlkJ107XG4gICAgLy8gdGhpcy5wYWdlSWQgPSBcIjYxODI4OTg5LTkxYjEtNDNiMC05YmY5LTc5MGJhYmJmYzEwN1wiO1xuICAgIHRoaXMuZ2V0UGFkZURhdGFTb3VyY2UoZmFsc2UpO1xuICB9XG5cbiAgYXN5bmMgZ2V0RmlsdGVyc0ZvclRlbXBsYXRlKGZpbHRlcikge1xuICAgIHRoaXMuZmlsdGVycyA9IGZpbHRlcjtcbiAgICB0aGlzLmRlZmF1bHRTdGFydERhdGUgPSBmaWx0ZXIuc3RhcnREYXRlO1xuICAgIHRoaXMuZGVmYXVsdEVuZERhdGUgPSBmaWx0ZXIuZW5kRGF0ZTtcbiAgICBmaWx0ZXIub3BlcmF0aW9uRmlsdGVyWydzdGFydERhdGUnXSA9IGZpbHRlci5zdGFydERhdGU7XG4gICAgZmlsdGVyLm9wZXJhdGlvbkZpbHRlclsnZW5kRGF0ZSddID0gZmlsdGVyLmVuZERhdGU7XG4gICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnID0gW107XG4gICAgYXdhaXQgdGhpcy5nZXRQYWRlRGF0YVNvdXJjZSh0cnVlKTtcbiAgICB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QgPSB7fTtcbiAgICBsZXQgYXBpQ2FsbHMgPSBbXTtcblxuICAgIHRoaXMuYWxsV2lkZ2V0QnlEYXRhc2V0LmZvckVhY2godmlldyA9PiB7XG4gICAgICB2aWV3LmRhdGFzZXRJZHMuZm9yRWFjaChpZCA9PiB7XG4gICAgICAgIGxldCBmb3VuZCA9ICh0aGlzLmRhdGFTZXRNb2RhbCBhcyBhbnlbXSkuZmluZChkID0+IGQuZGF0YXNldElkID09PSBpZCk7XG4gICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgIGFwaUNhbGxzLnB1c2godGhpcy5kYXRhc2V0U2VydmljZS5nZXREYXRhRnJvbURhdGFTZXQoZm91bmQsIGlkLCBmaWx0ZXIpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBQcm9taXNlLmFsbChhcGlDYWxscykudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmdsb2JhbERlZmF1bHRGaWx0ZXIgPSBmaWx0ZXI7XG4gICAgICB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QgPSB0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldFVuaXF1ZURhdGFTZXRPYmplY3QoKTtcbiAgICAgIHRoaXMuY3JlYXRlRGl2RWxlbWVudHModGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0LCB0cnVlKTtcbiAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBnZXRQYWRlRGF0YVNvdXJjZShjb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuc2VydmljZS5nZXRBcHBQYWdlRGV0YWlsQ29uZmlnKHRoaXMucGFnZUlkKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG5cbiAgICAgICAgICB0aGlzLnBhZ2VUaXRsZSA9IGRhdGEucGFnZU5hbWU7XG4gICAgICAgICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcgPSBkYXRhO1xuXG4gICAgICAgICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRTdGFydERhdGUgPSBtb21lbnQoKS5zdWJ0cmFjdCgnMzAnLCAnZGF5cycpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0RW5kRGF0ZSA9IG1vbWVudCgpLnN1YnRyYWN0KCcxJywgJ2RheXMnKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlRGl2RWxlbWVudHModGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0LCBmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmdldENvbXBvbmVudENvbmZpZ1NldCgpO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdFcnJvcicpO1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG5cblxuICBnZXRDb21wb25lbnRDb25maWdTZXQoKSB7XG4gICAgbGV0IGRhdGFzZXQgPSB0aGlzLnNlcnZpY2UuZ2V0QXBwRGF0YXNldENvbmZpZ3MoKTtcbiAgICBsZXQgdmlld0NvbXBvbmVudCA9IHRoaXMuc2VydmljZS5nZXRBcHBWaWV3Q29uZmlncygpO1xuXG4gICAgZm9ya0pvaW4oe1xuICAgICAgZGF0YXNldENvbmZpZzogZGF0YXNldCxcbiAgICAgIHZpZXdDb25maWc6IHZpZXdDb21wb25lbnRcbiAgICB9KS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCh7IGRhdGFzZXRDb25maWcsIHZpZXdDb25maWcgfSkgPT4ge1xuICAgICAgICB0aGlzLmNvbXBvbmVudENvbmZpZ0RhdGFTb3VyY2UgPSB2aWV3Q29uZmlnO1xuICAgICAgICB0aGlzLmRhdGFTZXRNb2RhbCA9IGRhdGFzZXRDb25maWc7XG4gICAgICAgIHRoaXMuYWxsV2lkZ2V0QnlEYXRhc2V0ID0gW107XG5cbiAgICAgICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5mb3JFYWNoKHdpZGdldCA9PiB7XG4gICAgICAgICAgbGV0IGRlZmF1bHRGaWx0ZXJzID0geyBvcGVyYXRpb25GaWx0ZXI6IHsgc3RhcnREYXRlOiBcIlwiLCBlbmREYXRlOiBcIlwiIH0gfTtcblxuICAgICAgICAgIGlmICh3aWRnZXQuZmlsdGVycyAmJiB3aWRnZXQuZmlsdGVycy5maWx0ZXJJdGVtcykge1xuICAgICAgICAgICAgd2lkZ2V0LmZpbHRlcnMuZmlsdGVySXRlbXMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZmlsdGVyVHlwZSA9PT0gJ2RhdGUnIHx8IGVsZW1lbnQuZmlsdGVyVHlwZSA9PT0gJ2RhdGV0aW1lJykge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmRlZmF1bHRGaWx0ZXJUeXBlID09PSBcImR5bmFtaWNcIiAmJiBlbGVtZW50Lm1vbWVudEZ1bmN0aW9uICE9PSBcIlwiICYmIGVsZW1lbnQuZGVmYXVsdEZpbHRlclZhbHVlICE9PSBcIlwiICYmIGVsZW1lbnQubW9tZW50Rm9ybWF0ICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICBsZXQgW2NvdW50LCB1bml0XSA9IGVsZW1lbnQuZGVmYXVsdEZpbHRlclZhbHVlLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5hcGlOYW1lID09PSBcImVuZERhdGVcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5kaXNwbGF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyLmVuZERhdGUgPSBtb21lbnQoKVtlbGVtZW50Lm1vbWVudEZ1bmN0aW9uXShwYXJzZUludChjb3VudCksIHVuaXQpLmZvcm1hdChlbGVtZW50Lm1vbWVudEZvcm1hdCk7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0RW5kRGF0ZSA9IG1vbWVudCgpW2VsZW1lbnQubW9tZW50RnVuY3Rpb25dKHBhcnNlSW50KGNvdW50KSwgdW5pdCkuZm9ybWF0KGVsZW1lbnQubW9tZW50Rm9ybWF0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuYXBpTmFtZSA9PT0gXCJzdGFydERhdGVcIikge1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVycy5vcGVyYXRpb25GaWx0ZXIuc3RhcnREYXRlID0gbW9tZW50KClbZWxlbWVudC5tb21lbnRGdW5jdGlvbl0ocGFyc2VJbnQoY291bnQpLCB1bml0KS5mb3JtYXQoZWxlbWVudC5tb21lbnRGb3JtYXQpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAodHlwZW9mIGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlID09PSBcInN0cmluZ1wiICYmIGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlICE9PSBcIlwiKSB8fFxuICAgICAgICAgICAgICAgICAgKEFycmF5LmlzQXJyYXkoZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWUpICYmIGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5vcGVyYXRvck5hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyW2VsZW1lbnQub3BlcmF0b3JOYW1lXSA9IEFycmF5LmlzQXJyYXkoZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgPyBlbGVtZW50LmZpbHRlckRhdGFTb3VyY2VWYWx1ZVxuICAgICAgICAgICAgICAgICAgICAgIDogW2VsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlXTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzLm9wZXJhdGlvbkZpbHRlcltlbGVtZW50LmFwaU5hbWVdID0gZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWUuam9pbihcIixcIik7XG5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuXG5cbiAgICAgICAgICBsZXQgdXJsUGFyYW1zOiBhbnkgPSBkZWZhdWx0RmlsdGVycy5vcGVyYXRpb25GaWx0ZXJcbiAgICAgICAgICB1cmxQYXJhbXNbJ3BhZ2VJZCddID0gdGhpcy5wYWdlSWRcbiAgICAgICAgICBsZXQgbmF2aWdhdGlvbjogTmF2aWdhdGlvbkV4dHJhcyA9IHtcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB1cmxQYXJhbXMsXG4gICAgICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiBcIm1lcmdlXCJcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCBuYXZpZ2F0aW9uKTtcblxuICAgICAgICAgIGxldCBkYXRhc2V0SWRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgICAgICAgICBsZXQgdmlld0lkczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gICAgICAgICAgd2lkZ2V0LndpZGdldE5vZGUuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICAgIGlmIChub2RlLm5vZGVQcm9wZXJ0aWVzLmRpc3BsYXkpIHtcbiAgICAgICAgICAgICAgbm9kZS5jb21wQ29uZmlnLnZpZXdDb25maWcuZm9yRWFjaCh2aWV3ID0+IHtcbiAgICAgICAgICAgICAgICBkYXRhc2V0SWRzLmFkZCh2aWV3LmRhdGFzZXRJZCk7XG4gICAgICAgICAgICAgICAgdmlld0lkcy5hZGQodmlldy52aWV3SWQpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG5vZGUuY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2godmlldyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0TWVudURhdGFTb3VyY2UucHVzaCh7IHZpZXdJZDogdmlldy52aWV3SWQsIHZpZXdOYW1lOiBub2RlLm5vZGVQcm9wZXJ0aWVzLndpZGdldFRpdGxlLCBkaXNwbGF5S2V5OiB2aWV3LmtwaUNvbmZpZy5rZXlUb1Bhc3MgfSlcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHZpZXdJZHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICAgIFwiZmlsdGVyc1wiOiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRlZmF1bHRGaWx0ZXJzKSksXG4gICAgICAgICAgICAgIFwia2V5VG9QYXNzXCI6IFtdLFxuICAgICAgICAgICAgICBcImRyaWxsRG93blR5cGVcIjogXCJuYXR1cmFsXCIsXG4gICAgICAgICAgICAgIFwiZHJpbGxkb3duRnJvbVwiOiBcIlwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN0YXRlRGF0YVNvdXJjZS5zZXQoZWxlbWVudCwgb2JqKVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICB3aWRnZXRJZDogd2lkZ2V0LndpZGdldElkLFxuICAgICAgICAgICAgcGFnZUlkOiB3aWRnZXQucGFnZUlkLFxuICAgICAgICAgICAgZmlsdGVyczogZGVmYXVsdEZpbHRlcnMsXG4gICAgICAgICAgICBkYXRhc2V0SWRzOiBkYXRhc2V0SWRzXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuYWxsV2lkZ2V0QnlEYXRhc2V0LnB1c2gob2JqKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc29sZS5sb2codGhpcy5zdGF0ZURhdGFTb3VyY2UpO1xuXG5cbiAgICAgICAgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0ID0ge307XG4gICAgICAgIGxldCBhcGlDYWxscyA9IFtdO1xuXG5cbiAgICAgICAgdGhpcy5hbGxXaWRnZXRCeURhdGFzZXQuZm9yRWFjaCh2aWV3ID0+IHtcbiAgICAgICAgICB2aWV3LmRhdGFzZXRJZHMuZm9yRWFjaChpZCA9PiB7XG4gICAgICAgICAgICBsZXQgZm91bmQgPSAoZGF0YXNldENvbmZpZyBhcyBhbnlbXSkuZmluZChkID0+IGQuZGF0YXNldElkID09PSBpZCk7XG4gICAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgICAgYXBpQ2FsbHMucHVzaCh0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YVNldChmb3VuZCwgaWQsIHZpZXcuZmlsdGVycykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgUHJvbWlzZS5hbGwoYXBpQ2FsbHMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCA9IHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0VW5pcXVlRGF0YVNldE9iamVjdCgpO1xuICAgICAgICAgIHRoaXMuY3JlYXRlRGl2RWxlbWVudHModGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0LCBmYWxzZSk7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICB9KSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ0Vycm9yJyk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGdldERhdGFTZXQoKSB7XG4gICAgdGhpcy5zZXJ2aWNlLmdldEFwcERhdGFzZXRDb25maWdzKCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5kYXRhU2V0dGFibGVEYXRhU291cmNlID0gZGF0YTtcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdEYXRhc2V0IENyZWF0aW9uJylcblxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuXG4gIGFzeW5jIGNyZWF0ZURpdkVsZW1lbnRzKGRhdGFzZXRCeUlkLCBjb250ZXh0KSB7XG5cbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmR5bmFtaWNDb250YWluZXIubmF0aXZlRWxlbWVudDtcbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgICBjb25zdCBjb250ZXh0X2ZpbHRlciA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLmZpbHRlcnMgPyB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy5maWx0ZXJzLmZpbHRlckl0ZW1zIDogbnVsbDtcblxuICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMuZm9yRWFjaChhc3luYyBkaXYgPT4ge1xuICAgICAgY29uc3Qgcm93RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBsZXQgd19oZWlnaHQgPSAoZGl2LndpZGdldFByb3BlcnRpZXMuaGVpZ2h0ID09IFwiXCIpID8gXCJoLWF1dG9cIiA6ICdoLVsnICsgZGl2LndpZGdldFByb3BlcnRpZXMuaGVpZ2h0ICsgJ10nO1xuICAgICAgcm93RGl2LmNsYXNzTGlzdC5hZGQoZGl2LndpZGdldFByb3BlcnRpZXMud2lkdGgsIHdfaGVpZ2h0KTtcbiAgICAgIGNvbnN0IGZpbHRlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgY29uc3QgZmlsdGVySXRlbXMgPSAoZGl2LmZpbHRlcnMpID8gZGl2LmZpbHRlcnMuZmlsdGVySXRlbXMgOiBbXTtcbiAgICAgIC8vIGlmIChkaXYuZmlsdGVycykge1xuICAgICAgdGhpcy5sb2FkRmlsdGVyQ29tcG9uZW50KGRpdiwgZmlsdGVyRGl2LCBmaWx0ZXJJdGVtcyxjb250ZXh0X2ZpbHRlcik7XG4gICAgICAvLyB9XG4gICAgICByb3dEaXYuYXBwZW5kQ2hpbGQoZmlsdGVyRGl2KTtcblxuICAgICAgaWYgKGRpdi53aWRnZXROb2RlICYmIGRpdi53aWRnZXROb2RlLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgIGxldCBtYWluSXRlbURpdiA9IHJvd0Rpdi5xdWVyeVNlbGVjdG9yKCcuZmxleC5mbGV4LXdyYXAnKTtcbiAgICAgICAgLy8gSWYgY29udGV4dCBpcyB0cnVlIGFuZCBtYWluSXRlbURpdiBleGlzdHMsIGNsZWFyIGl0cyBjb250ZW50c1xuICAgICAgICBpZiAoY29udGV4dCAmJiBtYWluSXRlbURpdikge1xuICAgICAgICAgIG1haW5JdGVtRGl2LmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIG1haW5JdGVtRGl2IGlmIGl0IGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgICBtYWluSXRlbURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIG1haW5JdGVtRGl2LmNsYXNzTGlzdC5hZGQoXCJmbGV4XCIsIFwiZmxleC13cmFwXCIpO1xuICAgICAgICAgIHJvd0Rpdi5hcHBlbmRDaGlsZChtYWluSXRlbURpdik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRXaWRnZXROb2RlcyhkaXYsIG1haW5JdGVtRGl2LCBkYXRhc2V0QnlJZCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChyb3dEaXYpO1xuICAgIH0pO1xuICB9XG4gIGxvYWRXaWRnZXROb2RlcyhkaXY6IGFueSwgbWFpbkl0ZW1EaXY6IGFueSwgZGF0YXNldEJ5SWQ6IGFueSkge1xuICAgIHRoaXMubWFpblBhZ2VEaXZFbGVtZW50ID0gbWFpbkl0ZW1EaXY7XG4gICAgZGl2LndpZGdldE5vZGUuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgdGhpcy5sb2FkU2luZ2xlV2lkZ2V0Tm9kZShpdGVtLCBtYWluSXRlbURpdiwgZGF0YXNldEJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgbG9hZFNpbmdsZVdpZGdldE5vZGUoaXRlbTogYW55LCBjb250YWluZXJFbGVtZW50OiBIVE1MRWxlbWVudCwgZGF0YXNldEJ5SWQ6IGFueSkge1xuICAgIGNvbnN0IGVsZW1lbnRJZCA9IGBpZC0ke2l0ZW0uaWR9YDtcbiAgICBjb25zdCBleGlzdGluZ0VsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtlbGVtZW50SWR9YCk7XG4gICAgaWYgKGl0ZW0ubm9kZVByb3BlcnRpZXMuZGlzcGxheSAmJiAhZXhpc3RpbmdFbGVtZW50KSB7XG4gICAgICBjb25zdCB3X2hlaWdodCA9IGl0ZW0ubm9kZVByb3BlcnRpZXMuaGVpZ2h0ID09PSBcIlwiID8gXCJoLWF1dG9cIiA6IGBoLVske2l0ZW0ubm9kZVByb3BlcnRpZXMuaGVpZ2h0fV1gO1xuICAgICAgY29uc3QgaXRlbURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgaXRlbURpdi5pZCA9IGVsZW1lbnRJZDtcbiAgICAgIGl0ZW1EaXYuY2xhc3NMaXN0LmFkZChpdGVtLm5vZGVQcm9wZXJ0aWVzLndpZHRoLCB3X2hlaWdodCwgJ21iLTInKTtcbiAgICAgIGNvbnN0IHdpZGdldERpdiA9IHRoaXMuZ2V0V2lkZ2V0VGl0bGVEaXYoaXRlbSk7XG4gICAgICBpdGVtRGl2LmFwcGVuZENoaWxkKHdpZGdldERpdik7XG4gICAgICBjb25zdCBpbm5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgaW5uZXJEaXYuY2xhc3NMaXN0LmFkZCgncm91bmRlZCcsICdqdXN0aWZ5LWNlbnRlcicsICdpdGVtcy1jZW50ZXInLCAnYm9yZGVyJywgJ3AtMScsICdtLTEnLCAnZmxleCcsICdmbGV4LXJvdycpO1xuICAgICAgaXRlbS5jb21wQ29uZmlnLnZpZXdDb25maWcuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgZWxlbWVudC5rcGlDb25maWdbJ2RhdGFTb3VyY2UnXSA9IGRhdGFzZXRCeUlkW2VsZW1lbnQuZGF0YXNldElkXTtcbiAgICAgICAgZWxlbWVudC5rcGlDb25maWdbJ2NvbnRleHRNZW51J10gPSB0aGlzLmNvbnRleHRNZW51RGF0YVNvdXJjZTtcbiAgICAgICAgZWxlbWVudFsndGl0bGVQYXJhbXMnXSA9IGl0ZW0ubm9kZVByb3BlcnRpZXMud2lkZ2V0UGFyYW1zIHx8IFwiXCI7XG4gICAgICAgIGNvbnN0IGNvbXBfb2JqZWN0ID0gdGhpcy5maW5kV2lkZ2V0QnlJZCh0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLCBpdGVtLmlkKTtcbiAgICAgICAgdGhpcy5sb2FkRHluYW1pY0NvbXBvbmVudChlbGVtZW50LCBjb21wX29iamVjdCwgaXRlbURpdik7XG4gICAgICB9KTtcbiAgICAgIGNvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQoaXRlbURpdik7XG4gICAgICBpZiAoIXRoaXMuaXNEYXNoQm9hcmRDb250ZW50VHlwZVZpZXcpIHtcbiAgICAgICAgaXRlbURpdi5hcHBlbmRDaGlsZChpbm5lckRpdik7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKGV4aXN0aW5nRWxlbWVudCkge1xuICAgICAgY29uc3QgaXRlbURpdiA9IGV4aXN0aW5nRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGl0ZW1EaXYuaW5uZXJIVE1MID0gJyc7XG4gICAgICBjb25zdCB3aWRnZXREaXYgPSB0aGlzLmdldFdpZGdldFRpdGxlRGl2KGl0ZW0pO1xuICAgICAgaXRlbURpdi5hcHBlbmRDaGlsZCh3aWRnZXREaXYpO1xuICAgICAgaXRlbS5jb21wQ29uZmlnLnZpZXdDb25maWcuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgZWxlbWVudC5rcGlDb25maWdbJ2RhdGFTb3VyY2UnXSA9IGRhdGFzZXRCeUlkW2VsZW1lbnQuZGF0YXNldElkXTtcbiAgICAgICAgZWxlbWVudC5rcGlDb25maWdbJ2NvbnRleHRNZW51J10gPSB0aGlzLmNvbnRleHRNZW51RGF0YVNvdXJjZTtcbiAgICAgICAgZWxlbWVudFsndGl0bGVQYXJhbXMnXSA9IGl0ZW0ubm9kZVByb3BlcnRpZXMud2lkZ2V0UGFyYW1zIHx8IFwiXCI7XG4gICAgICAgIGNvbnN0IGNvbXBfb2JqZWN0ID0gdGhpcy5maW5kV2lkZ2V0QnlJZCh0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLCBpdGVtLmlkKTtcbiAgICAgICAgdGhpcy5sb2FkRHluYW1pY0NvbXBvbmVudChlbGVtZW50LCBjb21wX29iamVjdCwgaXRlbURpdik7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCF0aGlzLmlzRGFzaEJvYXJkQ29udGVudFR5cGVWaWV3KSB7XG4gICAgICAgIGNvbnN0IGlubmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGlubmVyRGl2LmNsYXNzTGlzdC5hZGQoJ3JvdW5kZWQnLCAnanVzdGlmeS1jZW50ZXInLCAnaXRlbXMtY2VudGVyJywgJ2JvcmRlcicsICdwLTEnLCAnbS0xJywgJ2ZsZXgnLCAnZmxleC1yb3cnKTtcbiAgICAgICAgaXRlbURpdi5hcHBlbmRDaGlsZChpbm5lckRpdik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0V2lkZ2V0VGl0bGVEaXYoaXRlbSkge1xuICAgIC8vIGNvbnN0IHdpZGdldERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIC8vIHdpZGdldERpdi5jbGFzc0xpc3QuYWRkKCdmbGV4JywgJ2l0ZW1zLWNlbnRlcicsICdqdXN0aWZ5LWJldHdlZW4nLCAnZm9udC1ib2xkJywgJ3RleHQtbWQnLCAndGV4dC1ncmF5LTkwMCcsICdkYXJrOnRleHQtd2hpdGUnLCAnYm9yZGVyLWInLCAncC0zJywgJ2JnLWdyYXktODAwJywgJ214LTInLCAncm91bmRlZC10LWxnJyk7XG4gICAgLy8gY29uc3QgdGl0bGVEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAvLyBjb25zdCBwYXJhbXMgPSBpdGVtLm5vZGVQcm9wZXJ0aWVzLndpZGdldFBhcmFtcyB8fCBcIlwiO1xuICAgIC8vIHRpdGxlRGl2LmlubmVyVGV4dCA9IGl0ZW0ubm9kZVByb3BlcnRpZXMud2lkZ2V0VGl0bGUgKyBwYXJhbXM7XG4gICAgLy8gd2lkZ2V0RGl2LmFwcGVuZENoaWxkKHRpdGxlRGl2KTtcblxuICAgIGNvbnN0IHdpZGdldERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHdpZGdldERpdi5jbGFzc0xpc3QuYWRkKFxuICAgICAgJ2ZsZXgnLCAnaXRlbXMtY2VudGVyJywgJ2p1c3RpZnktYmV0d2VlbicsICdmb250LWJvbGQnLCAndGV4dC1tZCcsXG4gICAgICAndGV4dC1ncmF5LTkwMCcsICdkYXJrOnRleHQtd2hpdGUnLCAnYm9yZGVyLWInLCAncC0zJywgJ2JnLWdyYXktODAwJyxcbiAgICAgICdteC0yJywgJ3JvdW5kZWQtdC1sZycsICdyZWxhdGl2ZScgLy8gTmVlZGVkIGZvciBhYnNvbHV0ZSB0b29sdGlwIHBvc2l0aW9uaW5nXG4gICAgKTtcblxuICAgIGNvbnN0IHRpdGxlRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGl0bGVEaXYuY2xhc3NMaXN0LmFkZCgncmVsYXRpdmUnLCAnZ3JvdXAnKTsgLy8gVGFpbHdpbmQgZ3JvdXAgZm9yIGhvdmVyIGVmZmVjdFxuXG4gICAgY29uc3QgcGFyYW1zID0gaXRlbS5ub2RlUHJvcGVydGllcy53aWRnZXRQYXJhbXMgfHwgXCJcIjtcblxuICAgIC8vIEV4dHJhY3QgdG9vbHRpcCBjb250ZW50IGZyb20gd2lkZ2V0VGl0bGVcbiAgICBjb25zdCB3aWRnZXRUaXRsZSA9IGl0ZW0ubm9kZVByb3BlcnRpZXMud2lkZ2V0VGl0bGU7XG4gICAgY29uc3QgdG9vbHRpcE1hdGNoID0gd2lkZ2V0VGl0bGUubWF0Y2goL1xcJHRcXHsoW1xcc1xcU10qPylcXH0vKTsgLy8gU3VwcG9ydHMgbXVsdGktbGluZSBIVE1MXG5cbiAgICAvLyBSZW1vdmUgJyR0ey4uLn0nIGZyb20gZGlzcGxheWVkIHRpdGxlXG4gICAgY29uc3QgZGlzcGxheVRpdGxlID0gd2lkZ2V0VGl0bGUucmVwbGFjZSgvXFwkdFxce1tcXHNcXFNdKj9cXH0vZywgJycpLnRyaW0oKTtcblxuICAgIC8vIFNldCB0aXRsZSB0ZXh0XG4gICAgdGl0bGVEaXYuaW5uZXJUZXh0ID0gZGlzcGxheVRpdGxlICsgcGFyYW1zO1xuXG4gICAgLy8gSWYgYSB0b29sdGlwIGlzIGZvdW5kLCBjcmVhdGUgYSB0b29sdGlwIGRpdlxuICAgIGlmICh0b29sdGlwTWF0Y2gpIHtcbiAgICAgIGNvbnN0IHRvb2x0aXBDb250ZW50ID0gdG9vbHRpcE1hdGNoWzFdLnRyaW0oKTtcbiAgICAgIGNvbnN0IHRvb2x0aXBEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRvb2x0aXBEaXYuY2xhc3NMaXN0LmFkZChcbiAgICAgICAgJ2Fic29sdXRlJywgJ2xlZnQtMCcsICdib3R0b20tZnVsbCcsICdtYi0yJywgJ3ctbWF4JywgJ21heC13LXhzJyxcbiAgICAgICAgJ2JnLWJsYWNrJywgJ3RleHQtd2hpdGUnLCAndGV4dC1zbScsICdwLTInLCAncm91bmRlZC1sZycsICdzaGFkb3ctbGcnLFxuICAgICAgICAnb3BhY2l0eS0wJywgJ2dyb3VwLWhvdmVyOm9wYWNpdHktMTAwJywgJ3RyYW5zaXRpb24tb3BhY2l0eScsICdkdXJhdGlvbi0zMDAnLFxuICAgICAgICAnei01MCdcbiAgICAgICk7XG4gICAgICB0b29sdGlwRGl2LmlubmVySFRNTCA9IHRvb2x0aXBDb250ZW50OyAvLyBTZXQgaW5uZXJIVE1MIGZvciByaWNoIEhUTUwgdG9vbHRpcHNcblxuICAgICAgLy8gQXBwZW5kIHRvb2x0aXAgdG8gdGl0bGVEaXZcbiAgICAgIHRpdGxlRGl2LmFwcGVuZENoaWxkKHRvb2x0aXBEaXYpO1xuICAgIH1cblxuICAgIHdpZGdldERpdi5hcHBlbmRDaGlsZCh0aXRsZURpdik7XG5cbiAgICBjb25zdCBzZWFyY2hDb250YWluZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBzZWFyY2hDb250YWluZXJEaXYuY2xhc3NMaXN0LmFkZCgnZmxleCcsICdpdGVtcy1jZW50ZXInLCAnbWwtYXV0bycsICdzcGFjZS14LTInLCAnanVzdGlmeS1lbmQnKTsgLy8gbWwtYXV0byBwdXNoZXMgY29udGVudCB0byB0aGUgcmlnaHQgc2lkZVxuXG4gICAgLy8gQ2hlY2sgZm9yIHdpZGdldCBmaWx0ZXJcbiAgICBpZiAoaXRlbS5ub2RlUHJvcGVydGllcy5pc1dpZGdldEZpbHRlcikge1xuICAgICAgY29uc3Qgc2VhcmNoQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICBzZWFyY2hCdXR0b24uaW5uZXJUZXh0ID0gJ0ZpbHRlcic7XG4gICAgICBzZWFyY2hCdXR0b24uY2xhc3NMaXN0LmFkZCgncHgtMycsICdweS0xLjUnLCAnYmctYmx1ZS02MDAnLCAnbXItMicsICd0ZXh0LXdoaXRlJywgJ3JvdW5kZWQnLCAnaG92ZXI6YmctYmx1ZS03MDAnKTtcbiAgICAgIHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlID0ge307XG4gICAgICB0aGlzLm5vZGVwcm9wZXJ0aWNlRmlsdGVyRGF0YVNvdXJjZVsndmlld0NvbmZpZyddID0gaXRlbTtcbiAgICAgIHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlWydoYXZpbmdDb25maWcnXSA9IFtdO1xuXG4gICAgICBzZWFyY2hCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNXaWRnZXRGaWx0ZXJzID0gdHJ1ZTtcbiAgICAgICAgbGV0IGZpbHRlUHJvcGVydGljZSA9IFtdO1xuICAgICAgICBpdGVtLmNvbXBDb25maWcudmlld0NvbmZpZy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIGxldCBrZXlfbmFtZSA9IHRoaXMudW5pcXVlRGF0YVNldE9iamVjdFtlbGVtZW50LmRhdGFzZXRJZF1bMF07XG4gICAgICAgICAgT2JqZWN0LmtleXMoa2V5X25hbWUpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIGlmICghZmlsdGVQcm9wZXJ0aWNlLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgZmlsdGVQcm9wZXJ0aWNlLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZpbHRlUHJvcGVydGljZS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICBjb2x1bW5OYW1lOiBlbGVtZW50LFxuICAgICAgICAgICAgZGF0YVR5cGU6IFwiZmxvYXRcIixcbiAgICAgICAgICAgIG9wZXJhdG9yOiBcIlwiLFxuICAgICAgICAgICAgdmFsdWU6IFwiXCIsXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlLmhhdmluZ0NvbmZpZy5wdXNoKG9iailcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHNlYXJjaENvbnRhaW5lckRpdi5hcHBlbmRDaGlsZChzZWFyY2hCdXR0b24pXG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGl0ZW0gZmlsdGVySWRcbiAgICBpZiAoaXRlbS5maWx0ZXJJZCkge1xuICAgICAgdGhpcy5ub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2UgPSB7fTtcbiAgICAgIHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlWyd2aWV3Q29uZmlnJ10gPSBpdGVtO1xuICAgICAgdGhpcy5ub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2VbJ2hhdmluZ0NvbmZpZyddID0gW107XG5cbiAgICAgIHRoaXMuc2VydmljZS5nZXRBcHBGaWx0ZXJDb25maWcoaXRlbS5maWx0ZXJJZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZpbHRlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIHRoaXMubG9hZFdpZGdldEZpbHRlckNvbXBvbmVudChpdGVtLCB3aWRnZXREaXYsIGRhdGEuZmlsdGVySXRlbXMsIGl0ZW0pO1xuICAgICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG5cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIG5vZGUgZmlsdGVyc1xuICAgIGlmIChpdGVtLm5vZGVQcm9wZXJ0aWVzLm5vZGVmaWx0ZXJzICYmIGl0ZW0ubm9kZVByb3BlcnRpZXMubm9kZWZpbHRlcnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICBpdGVtLm5vZGVQcm9wZXJ0aWVzLm5vZGVmaWx0ZXJzLmZvckVhY2goZmlsdGVyID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGZpbHRlckRpdi5jbGFzc0xpc3QuYWRkKCdmbGV4JywgJ2l0ZW1zLWNlbnRlcicpO1xuXG4gICAgICAgIGlmIChmaWx0ZXIuaW5wdXRfdHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgY29uc3QgdGV4dEJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICAgICAgdGV4dEJveC50eXBlID0gJ3RleHQnO1xuICAgICAgICAgIHRleHRCb3gucGxhY2Vob2xkZXIgPSBgRW50ZXIgJHtmaWx0ZXIubG9jYWxfY29sdW1ufWA7XG4gICAgICAgICAgdGV4dEJveC5jbGFzc0xpc3QuYWRkKCdweC0yJywgJ3B5LTEuNScsICdyb3VuZGVkJywgJ2JvcmRlcicsICdtci0xJywgJ2JvcmRlci1ncmF5LTUwMCcsICd0ZXh0LWdyYXktOTAwJywgJ2Rhcms6YmctZ3JheS03MDAnLCAnZGFyazp0ZXh0LXdoaXRlJyk7XG5cbiAgICAgICAgICBjb25zdCBzZWFyY2hCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgICBzZWFyY2hCdXR0b24uaW5uZXJUZXh0ID0gJ1NlYXJjaCc7XG4gICAgICAgICAgc2VhcmNoQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ3B4LTMnLCAncHktMS41JywgJ2JnLWJsdWUtNjAwJywgJ21yLTInLCAndGV4dC13aGl0ZScsICdyb3VuZGVkJywgJ2hvdmVyOmJnLWJsdWUtNzAwJyk7XG5cbiAgICAgICAgICBjb25zdCBzZXBhcmVyb3RCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICBzZXBhcmVyb3RCdXR0b24uaW5uZXJIVE1MID0gJ3wnO1xuXG4gICAgICAgICAgc2VhcmNoQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VhcmNoVGVybSA9IHRleHRCb3gudmFsdWU7XG4gICAgICAgICAgICB0aGlzLmdldFJlYXJjaFJlc3VsdEZyb21JbnB1dEJveChzZWFyY2hUZXJtLCBpdGVtLCBmaWx0ZXIpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgZmlsdGVyRGl2LmFwcGVuZENoaWxkKHRleHRCb3gpO1xuICAgICAgICAgIGZpbHRlckRpdi5hcHBlbmRDaGlsZChzZWFyY2hCdXR0b24pO1xuICAgICAgICAgIGZpbHRlckRpdi5hcHBlbmRDaGlsZChzZXBhcmVyb3RCdXR0b24pO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VhcmNoQ29udGFpbmVyRGl2LmFwcGVuZENoaWxkKGZpbHRlckRpdik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB3aWRnZXREaXYuYXBwZW5kQ2hpbGQoc2VhcmNoQ29udGFpbmVyRGl2KTtcbiAgICByZXR1cm4gd2lkZ2V0RGl2O1xuICB9XG5cbiAgbG9hZER5bmFtaWNDb21wb25lbnQoZGF0YSwgaW5kZXhPYmosIGNvbnRhaW5lckVsZW1lbnQpOiBhbnkge1xuICAgIGNvbnN0IGNvbXBvbmVudENsYXNzID0gdGhpcy5jb21wb25lbnRDbGFzc01hcFtkYXRhLmtwaUNvbmZpZy5jb21wb25lbnROYW1lXTtcbiAgICB0aGlzLkNvbXBSZWZzID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRDbGFzcyk7XG4gICAgY29uc3QgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlID0gdGhpcy5Db21wUmVmcy5pbnN0YW5jZTtcblxuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5jaGFydERhdGFTb3VyY2UgPSBkYXRhO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5rcGlfbmFtZSA9IFwiXCI7XG4gICAgaWYgKGRhdGEua3BpQ29uZmlnLmNvbXBvbmVudE5hbWUgPT0gXCJHYW1tYUFkdmFuY2VPcGVyYXRvclRhYmxlQ29tcG9uZW50XCIgfHwgZGF0YS5rcGlDb25maWcuY29tcG9uZW50TmFtZSA9PSBcIkdhbW1hVGFibGVXaXRoUGVyY2VudGFnZUNvbXBvbmVudFwiIHx8IGRhdGEua3BpQ29uZmlnLmNvbXBvbmVudE5hbWUgPT0gXCJHYW1tYUdlb0NoYXJ0Q29tcG9uZW50XCIpIHtcbiAgICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5vUm93Q2xpY2suc3Vic2NyaWJlKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuZ2V0Um93Q2xpY2sodmFsdWUpO1xuICAgICAgfSk7XG4gICAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2Uub25yaWdodENsaWNrQ29udGV4dFNlbGVjdGlvbi5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5nZXRDb250ZXh0Q2xpY2sodmFsdWUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGluZGV4T2JqLmNvbXBDb25maWcuZHluYW1pY0NvbXBvbmVudFJlZnMucHVzaCh0aGlzLkNvbXBSZWZzKTtcbiAgICBjb25zdCBjc3NDbGFzcyA9IFwidy1mdWxsXCI7XG4gICAgdGhpcy5Db21wUmVmcy5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoY3NzQ2xhc3MpO1xuICAgIGNvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5Db21wUmVmcy5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KTtcbiAgfVxuXG4gIGxvYWRGaWx0ZXJDb21wb25lbnQoaW5kZXhPYmosIGNvbnRhaW5lckVsZW1lbnQsIGZpbHRlckl0ZW1zLGNvbnRleHRfZmlsdGVyKSB7XG4gICAgLy8gbGV0IHVzZXJOYW1lID0gdGhpcy5zdG9yYWdlLmdldCgndXNlcl9uYW1lJylcbiAgICBsZXQgc2VsZWN0ZWREYXRlcyA9IHsgc3RhcnREYXRlOiB0aGlzLmRlZmF1bHRTdGFydERhdGUsIGVuZERhdGU6IHRoaXMuZGVmYXVsdEVuZERhdGUgfVxuICAgIGNvbnN0IGNvbXBvbmVudENsYXNzID0gdGhpcy5jb21wb25lbnRDbGFzc01hcFsnQXBwQWR2YW5jZUhlYWRlckNvbXBvbmVudCddO1xuICAgIHRoaXMuQ29tcFJlZnMgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudENsYXNzKTtcbiAgICBjb25zdCBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UgPSB0aGlzLkNvbXBSZWZzLmluc3RhbmNlO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5zZWxlY3RlZERhdGVzID0gc2VsZWN0ZWREYXRlcztcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UuZmlsdGVySXRlbXMgPSBmaWx0ZXJJdGVtcztcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UucGFnZVRpdGxlID0gdGhpcy5wYWdlVGl0bGU7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmNvbnRleHRGaWx0ZXJJdGVtcyA9IGNvbnRleHRfZmlsdGVyO1xuXG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmJyZWFkX2NydW1ic19jb250YWluZXIgPSB0aGlzLmtwaV9icmVhZGNydW1ic19jb250YWluZXI7XG4gICAgLy8gZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmlzRWRpdEJ1dHRvbiA9ICh1c2VyTmFtZSAmJiB1c2VyTmFtZSA9PSBcImFkbWluXCIpID8gdHJ1ZSA6IGZhbHNlO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5pc0FkdmFuY2VCdXR0b24gPSB0cnVlO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5nZXRGaWx0ZXJQYWdlQ29uZmlnLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5nZXRGaWx0ZXJzRm9yVGVtcGxhdGUodmFsdWUpO1xuICAgIH0pO1xuXG5cbiAgICBpbmRleE9iai5jb21wQ29uZmlnLmR5bmFtaWNDb21wb25lbnRSZWZzLnB1c2godGhpcy5Db21wUmVmcyk7XG4gICAgY29uc3QgY3NzQ2xhc3MgPSBcInctZnVsbFwiO1xuICAgIHRoaXMuQ29tcFJlZnMubG9jYXRpb24ubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKGNzc0NsYXNzKTtcbiAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuQ29tcFJlZnMubG9jYXRpb24ubmF0aXZlRWxlbWVudCk7XG4gIH1cbiAgbG9hZFdpZGdldEZpbHRlckNvbXBvbmVudChpbmRleE9iaiwgY29udGFpbmVyRWxlbWVudCwgZmlsdGVySXRlbXMsIHZpZXdJZHMpIHtcbiAgICBsZXQgc2VsZWN0ZWREYXRlcyA9IHsgc3RhcnREYXRlOiB0aGlzLmRlZmF1bHRTdGFydERhdGUsIGVuZERhdGU6IHRoaXMuZGVmYXVsdEVuZERhdGUgfVxuICAgIGNvbnN0IGNvbXBvbmVudENsYXNzID0gdGhpcy5jb21wb25lbnRDbGFzc01hcFsnQWR2YW5jZVdpZGdldEhlYWRlckZpbHRlckNvbXBvbmVudCddO1xuICAgIHRoaXMuQ29tcFJlZnMgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudENsYXNzKTtcbiAgICBjb25zdCBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UgPSB0aGlzLkNvbXBSZWZzLmluc3RhbmNlO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5zZWxlY3RlZERhdGVzID0gc2VsZWN0ZWREYXRlcztcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UuZmlsdGVySXRlbXMgPSBmaWx0ZXJJdGVtcztcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2Uudmlld0lkcyA9IHZpZXdJZHM7XG5cbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UuZ2V0V2lkZ2V0RmlsdGVyQ29uZmlnLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5nZXRXaWRnZXRGaWx0ZXJGb3JUZW1wbGF0ZSh2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICBpbmRleE9iai5jb21wQ29uZmlnLmR5bmFtaWNDb21wb25lbnRSZWZzLnB1c2godGhpcy5Db21wUmVmcyk7XG4gICAgY29udGFpbmVyRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLkNvbXBSZWZzLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG4gIC8vIGZvciBjb250ZXh0IG1lbnUgZnVuY3Rpb25cbiAgZ2V0Q29udGV4dENsaWNrKGV2ZW50KSB7XG4gICAgY29uc3Qgc3RhdGVEYXRhID0gQXJyYXkuZnJvbSh0aGlzLnN0YXRlRGF0YVNvdXJjZS5rZXlzKCkpO1xuICAgIGNvbnN0IGN1cnJlbnRWaWV3SW5kZXggPSBzdGF0ZURhdGEuaW5kZXhPZihldmVudC52aWV3SWQpO1xuICAgIGNvbnN0IGRlbGV0ZWRWaWV3SWRzID0gW107XG4gICAgZm9yIChsZXQgaSA9IGN1cnJlbnRWaWV3SW5kZXggKyAxOyBpIDwgc3RhdGVEYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkZWxldGVkVmlld0lkcy5wdXNoKHN0YXRlRGF0YVtpXSlcbiAgICB9XG4gICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGVsZW1lbnQud2lkZ2V0Tm9kZS5mb3JFYWNoKChub2RlOiBhbnksIG5vZGVJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmdldEVsZW1lbnRPZkN1cnJlbnRWaWV3KG5vZGUsIGV2ZW50LmRyaWxsZG93blRvKSkge1xuICAgICAgICAgIGxldCB2aWV3ID0gZWxlbWVudC53aWRnZXROb2RlW25vZGVJbmRleF07XG4gICAgICAgICAgbGV0IGFwaUNhbGxzID0gW107XG4gICAgICAgICAgbGV0IGFwcGxpZWRGaWx0ZXJzID0gdGhpcy5nZXRTZXRPcGVyYXRvckZpbHRlcihldmVudCwgdGhpcy5zdGF0ZURhdGFTb3VyY2UuZ2V0KGV2ZW50LmRyaWxsZG93bkZyb20pKTtcblxuICAgICAgICAgIHZpZXcuY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2goY29udGVudFZpZXcgPT4ge1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gKHRoaXMuZGF0YVNldE1vZGFsIGFzIGFueVtdKS5maW5kKGQgPT4gZC5kYXRhc2V0SWQgPT09IGNvbnRlbnRWaWV3LmRhdGFzZXRJZCk7XG4gICAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgICAgYXBpQ2FsbHMucHVzaCh0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YVNldChmb3VuZCwgY29udGVudFZpZXcuZGF0YXNldElkLCBhcHBsaWVkRmlsdGVycykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIFByb21pc2UuYWxsKGFwaUNhbGxzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCA9IHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0VW5pcXVlRGF0YVNldE9iamVjdCgpO1xuICAgICAgICAgICAgZm9yIChsZXQgZW50cnkgb2YgZGVsZXRlZFZpZXdJZHMpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC53aWRnZXROb2RlLmZvckVhY2godmlld1ZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICB2aWV3VmFsdWUuY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2godmlld0lkID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICh2aWV3SWQudmlld0lkID09IGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuY29udGV4dE1lbnVEYXRhU291cmNlLnNvbWUoaXRlbSA9PiBpdGVtLnZpZXdJZCA9PT0gdmlld0lkLnZpZXdJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gSWYgbm90IGV4aXN0cywgcHVzaCB0aGUgbmV3IG9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dE1lbnVEYXRhU291cmNlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0lkOiB2aWV3SWQudmlld0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld05hbWU6IG5vZGUubm9kZVByb3BlcnRpZXMud2lkZ2V0VGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5S2V5OiB2aWV3SWQua3BpQ29uZmlnLmtleVRvUGFzc1xuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0YSA9IHRoaXMuc3RhdGVEYXRhU291cmNlLmdldChlbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydERhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlRGF0YVNvdXJjZS5kZWxldGUoZW50cnkpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmlld1ZhbHVlLm5vZGVQcm9wZXJ0aWVzWydkaXNwbGF5J10gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJlZml4ZWRJZCA9IGBpZC0ke3ZpZXdWYWx1ZS5pZH1gO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50VG9IaWRlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7cHJlZml4ZWRJZH1gKSBhcyBIVE1MRWxlbWVudDsgLy8gQ2FzdCB0byBIVE1MRWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFRvSGlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0hpZGUucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY29udGV4dE1lbnVEYXRhU291cmNlID0gdGhpcy5jb250ZXh0TWVudURhdGFTb3VyY2UuZmlsdGVyKGUgPT4gZS5kaXNwbGF5S2V5ICE9PSBldmVudC5rZXlUb1Bhc3MpO1xuICAgICAgICAgICAgdmlldy5jb21wQ29uZmlnLnZpZXdDb25maWcuZm9yRWFjaCh2YWwgPT4ge1xuICAgICAgICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgICAgIFwiZmlsdGVyc1wiOiBhcHBsaWVkRmlsdGVycyxcbiAgICAgICAgICAgICAgICBcImtleVRvUGFzc1wiOiB0aGlzLnVwZGF0ZU9wZXJhdG9yRGF0YShldmVudC5rZXlUb1Bhc3MsIGV2ZW50LmRhdGEpLFxuICAgICAgICAgICAgICAgIFwiZHJpbGxEb3duVHlwZVwiOiBldmVudC5kcmlsbERvd25UeXBlLFxuICAgICAgICAgICAgICAgIFwiZHJpbGxkb3duRnJvbVwiOiBldmVudC5kcmlsbGRvd25Gcm9tXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZURhdGFTb3VyY2Uuc2V0KHZhbFsndmlld0lkJ10sIG9iailcblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2aWV3Lm5vZGVQcm9wZXJ0aWVzWydkaXNwbGF5J10gPSB0cnVlO1xuICAgICAgICAgICAgdmlldy5ub2RlUHJvcGVydGllc1snd2lkZ2V0UGFyYW1zJ10gPSBldmVudC50YWJsZVRpdGxlO1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ZWRJZCA9IGBpZC0ke3ZpZXcuaWR9YDtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtwcmVmaXhlZElkfWApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgdGhpcy5sb2FkU2luZ2xlV2lkZ2V0Tm9kZSh2aWV3LCB0aGlzLm1haW5QYWdlRGl2RWxlbWVudCwgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0KTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKHRoaXMubWFpblBhZ2VEaXZFbGVtZW50KTtcbiAgICAgICAgICAgIH0sIDIwMCk7XG5cblxuICAgICAgICAgICAgbGV0IG5hdmlnYXRpb246IE5hdmlnYXRpb25FeHRyYXMgPSB7XG4gICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiBhcHBsaWVkRmlsdGVyc1snb3BlcmF0aW9uRmlsdGVyJ10sXG4gICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6IFwibWVyZ2VcIlxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCBuYXZpZ2F0aW9uKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG5vZGUubm9kZVByb3BlcnRpZXNbJ2Rpc3BsYXknXSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICAvLyBmb3Igcm93IGNsaWNrIGZ1bmN0aW9uXG4gIGFzeW5jIGdldFJvd0NsaWNrKGV2ZW50KSB7XG4gICAgY29uc3Qgc3RhdGVEYXRhID0gQXJyYXkuZnJvbSh0aGlzLnN0YXRlRGF0YVNvdXJjZS5rZXlzKCkpO1xuICAgIGNvbnN0IGN1cnJlbnRWaWV3SW5kZXggPSBzdGF0ZURhdGEuaW5kZXhPZihldmVudC52aWV3SWQpO1xuICAgIGNvbnN0IGRlbGV0ZWRWaWV3SWRzID0gW107XG4gICAgZm9yIChsZXQgaSA9IGN1cnJlbnRWaWV3SW5kZXggKyAxOyBpIDwgc3RhdGVEYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkZWxldGVkVmlld0lkcy5wdXNoKHN0YXRlRGF0YVtpXSk7XG4gICAgfVxuICAgIGNvbnN0IGhvdXJseU5vZGUgPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzXG4gICAgICAubWFwKHdpZGdldCA9PiB3aWRnZXQud2lkZ2V0Tm9kZS5maW5kKG5vZGUgPT4gdGhpcy5nZXRIb3VybHlEYXRhKG5vZGUpKSlcbiAgICAgIC5maW5kKG5vZGUgPT4gbm9kZSk7XG5cbiAgICBpZiAoaG91cmx5Tm9kZSAmJiBldmVudC5rZXlUb1Bhc3MuaW5jbHVkZXMoXCJyZWNvcmREYXRlXCIpKSB7XG4gICAgICB0aGlzLmdldFZpZXdCeVJvd0NMaWNrRm9ySG91cmx5Q2hhcnQoZXZlbnQsIGhvdXJseU5vZGUpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWaWV3Tm9kZSA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNcbiAgICAgIC5tYXAod2lkZ2V0ID0+IHdpZGdldC53aWRnZXROb2RlLmZpbmQobm9kZSA9PiB0aGlzLmdldEVsZW1lbnRPZkN1cnJlbnRWaWV3KG5vZGUsIGV2ZW50LnZpZXdJZCkpKVxuICAgICAgLmZpbmQobm9kZSA9PiBub2RlKTtcblxuXG5cbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcDtcbiAgICBpZiAoY3VycmVudFZpZXdOb2RlKSB7XG5cbiAgICAgIGNvbnN0IGRyaWxkb3duc0ZvckN1cnJlbnRWaWV3ID0gW107XG4gICAgICBjdXJyZW50Vmlld05vZGUuY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2goYXN5bmMgZWxlbWVudCA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50LmtwaUNvbmZpZy52aWV3UHJvcGVydGllcy5lbmFibGVDbGlja0V2ZW50KSB7XG5cbiAgICAgICAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiBkZWxldGVkVmlld0lkcykge1xuICAgICAgICAgICAgICBlbGVtZW50LndpZGdldE5vZGUuZm9yRWFjaCh2aWV3VmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgIHZpZXdWYWx1ZS5jb21wQ29uZmlnLnZpZXdDb25maWcuZm9yRWFjaCh2aWV3SWQgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKHZpZXdJZC52aWV3SWQgPT0gZW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RzID0gdGhpcy5jb250ZXh0TWVudURhdGFTb3VyY2Uuc29tZShpdGVtID0+IGl0ZW0udmlld0lkID09PSB2aWV3SWQudmlld0lkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51RGF0YVNvdXJjZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdJZDogdmlld0lkLnZpZXdJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdOYW1lOiBjdXJyZW50Vmlld05vZGUubm9kZVByb3BlcnRpZXMud2lkZ2V0VGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5S2V5OiB2aWV3SWQua3BpQ29uZmlnLmtleVRvUGFzc1xuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0YSA9IHRoaXMuc3RhdGVEYXRhU291cmNlLmdldChlbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydERhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlRGF0YVNvdXJjZS5kZWxldGUoZW50cnkpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmlld1ZhbHVlLm5vZGVQcm9wZXJ0aWVzWydkaXNwbGF5J10gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJlZml4ZWRJZCA9IGBpZC0ke3ZpZXdWYWx1ZS5pZH1gO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50VG9IaWRlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7cHJlZml4ZWRJZH1gKSBhcyBIVE1MRWxlbWVudDsgLy8gQ2FzdCB0byBIVE1MRWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFRvSGlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0hpZGUucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cblxuICAgICAgICAgIGlmIChlbGVtZW50LmtwaUNvbmZpZy52aWV3UHJvcGVydGllcy5lbmFibGVDbGlja0V2ZW50ICYmIGVsZW1lbnQua3BpQ29uZmlnLnZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmV2ZW50VHlwZSAhPSBcIlwiKSB7XG4gICAgICAgICAgICBsZXQgZXZlbnRUeXBlID0gZWxlbWVudC5rcGlDb25maWcudmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuZXZlbnRUeXBlO1xuICAgICAgICAgICAgbGV0IGFzc29jaWF0ZWRWaWV3cyA9IGVsZW1lbnQua3BpQ29uZmlnLnZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmFzc29jaWF0ZWRWaWV3cztcbiAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gJ29wdGlvbmFsRHJpbGxEb3duJykge1xuICAgICAgICAgICAgICBpZiAoYXNzb2NpYXRlZFZpZXdzICYmIGFzc29jaWF0ZWRWaWV3cy5sZW5ndGggIT0gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHZpZXdGb3JEcmlsbERvd24gb2YgYXNzb2NpYXRlZFZpZXdzKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJDb25kaXRpb24gPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHZpZXdGb3JEcmlsbERvd25bJ2ZpbHRlckNvbmRpdGlvbiddKTtcbiAgICAgICAgICAgICAgICAgIGxldCBtYXRjaEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIGZpbHRlckNvbmRpdGlvbi5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeVBhcmFtcy5nZXQoa2V5KSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBtYXRjaEZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoRm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlld0ZvckRyaWxsRG93blsndmlld0lkJ10uZm9yRWFjaCh2aWV3Rm9ySWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGRyaWxkb3duc0ZvckN1cnJlbnRWaWV3LnB1c2godmlld0ZvcklkKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT0gJ2RyaWxsZG93bicpIHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgZW50cnkgb2YgYXNzb2NpYXRlZFZpZXdzKSB7XG4gICAgICAgICAgICAgICAgZHJpbGRvd25zRm9yQ3VycmVudFZpZXcucHVzaChlbnRyeSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWV2ZW50VHlwZSkge1xuICAgICAgICAgICAgICBjb25zdCBuZXh0Vmlld0luZGV4ID0gc3RhdGVEYXRhLmluZGV4T2YoZXZlbnQudmlld0lkKSArIDE7XG4gICAgICAgICAgICAgIGNvbnN0IG5leHRWaWV3ID0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1xuICAgICAgICAgICAgICAgIC5tYXAod2lkZ2V0ID0+IHdpZGdldC53aWRnZXROb2RlW25leHRWaWV3SW5kZXhdKVxuICAgICAgICAgICAgICAgIC5maW5kKG5vZGUgPT4gbm9kZSk7XG5cbiAgICAgICAgICAgICAgaWYgKG5leHRWaWV3KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0Vmlld0J5Um93Q0xpY2soZXZlbnQsIG5leHRWaWV3KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZHJpbGRvd25zRm9yQ3VycmVudFZpZXcubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgdmlld0lkRm9yTmV4dCBvZiBkcmlsZG93bnNGb3JDdXJyZW50Vmlldykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRWaWV3Tm9kZSA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNcbiAgICAgICAgICAgICAgICAgIC5tYXAod2lkZ2V0ID0+IHdpZGdldC53aWRnZXROb2RlLmZpbmQobm9kZSA9PiB0aGlzLmdldEVsZW1lbnRPZkN1cnJlbnRWaWV3KG5vZGUsIHZpZXdJZEZvck5leHQpKSlcbiAgICAgICAgICAgICAgICAgIC5maW5kKG5vZGUgPT4gbm9kZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRWaWV3QnlSb3dDTGljayhldmVudCwgbmV4dFZpZXdOb2RlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICBjb25zdCBuZXh0Vmlld0luZGV4ID0gc3RhdGVEYXRhLmluZGV4T2YoZXZlbnQudmlld0lkKSArIDE7XG4gICAgICAgICAgICBjb25zdCBuZXh0VmlldyA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNcbiAgICAgICAgICAgICAgLm1hcCh3aWRnZXQgPT4gd2lkZ2V0LndpZGdldE5vZGVbbmV4dFZpZXdJbmRleF0pXG4gICAgICAgICAgICAgIC5maW5kKG5vZGUgPT4gbm9kZSk7XG5cbiAgICAgICAgICAgIGlmIChuZXh0Vmlldykge1xuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0Vmlld0J5Um93Q0xpY2soZXZlbnQsIG5leHRWaWV3KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cblxuXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG5cbiAgICAgIC8vIGZvciB2aWV3IGdyb3VwXG5cblxuXG4gICAgfVxuICB9XG5cbiAgZ2V0Vmlld0J5Um93Q0xpY2tGb3JIb3VybHlDaGFydChldmVudCwgbm9kZSkge1xuXG4gICAgbGV0IGFwaUNhbGxzID0gW107XG4gICAgY29uc3QgZGVsZXRlZFZpZXdJZHMgPSBbXTtcbiAgICBub2RlLmNvbXBDb25maWcudmlld0NvbmZpZy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgbGV0IGFwcGxpZWRGaWx0ZXJzID0gdGhpcy5nZXRTZXRPcGVyYXRvckZpbHRlcihldmVudCwgdGhpcy5zdGF0ZURhdGFTb3VyY2UuZ2V0KGl0ZW0udmlld0lkKSk7XG4gICAgICBsZXQgZm91bmQgPSAodGhpcy5kYXRhU2V0TW9kYWwgYXMgYW55W10pLmZpbmQoZCA9PiBkLmRhdGFzZXRJZCA9PT0gaXRlbS5kYXRhc2V0SWQpO1xuICAgICAgZGVsZXRlZFZpZXdJZHMucHVzaChpdGVtLnZpZXdJZCk7XG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgYXBpQ2FsbHMucHVzaCh0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YVNldChmb3VuZCwgaXRlbS5kYXRhc2V0SWQsIGFwcGxpZWRGaWx0ZXJzKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgUHJvbWlzZS5hbGwoYXBpQ2FsbHMpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0ID0gdGhpcy5kYXRhc2V0U2VydmljZS5nZXRVbmlxdWVEYXRhU2V0T2JqZWN0KCk7XG4gICAgICAvLyBub2RlLm5vZGVQcm9wZXJ0aWVzWyd3aWRnZXRQYXJhbXMnXSA9IGV2ZW50LnRhYmxlVGl0bGU7XG4gICAgICB0aGlzLmxvYWRTaW5nbGVXaWRnZXROb2RlKG5vZGUsIHRoaXMubWFpblBhZ2VEaXZFbGVtZW50LCB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20odGhpcy5tYWluUGFnZURpdkVsZW1lbnQpO1xuICAgICAgfSwgMjAwKTtcblxuICAgIH0pO1xuICAgIC8vIH1cbiAgICBjb25zb2xlLmxvZyh0aGlzLnN0YXRlRGF0YVNvdXJjZSk7XG4gIH1cblxuICBhc3luYyBnZXRWaWV3QnlSb3dDTGljayhldmVudCwgdmlldykge1xuICAgIGxldCBhcGlDYWxscyA9IFtdO1xuICAgIGxldCBhcHBsaWVkRmlsdGVycyA9IHRoaXMuZ2V0U2V0T3BlcmF0b3JGaWx0ZXIoZXZlbnQsIHRoaXMuc3RhdGVEYXRhU291cmNlLmdldChldmVudC52aWV3SWQpKTtcblxuXG4gICAgdmlldy5jb21wQ29uZmlnLnZpZXdDb25maWcuZm9yRWFjaChjb250ZW50VmlldyA9PiB7XG4gICAgICBsZXQgZm91bmQgPSAodGhpcy5kYXRhU2V0TW9kYWwgYXMgYW55W10pLmZpbmQoZCA9PiBkLmRhdGFzZXRJZCA9PT0gY29udGVudFZpZXcuZGF0YXNldElkKTtcbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICBhcGlDYWxscy5wdXNoKHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0RGF0YUZyb21EYXRhU2V0KGZvdW5kLCBjb250ZW50Vmlldy5kYXRhc2V0SWQsIGFwcGxpZWRGaWx0ZXJzKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoYXBpQ2FsbHMpXG4gICAgLy8gLnRoZW4oKCkgPT4ge1xuXG5cbiAgICAvLyBmb3IgKGxldCBlbnRyeSBvZiBkZWxldGVkVmlld0lkcykge1xuICAgIC8vICAgdmlldy5jb21wQ29uZmlnLnZpZXdDb25maWcuZm9yRWFjaCh2aWV3SWQgPT4ge1xuICAgIC8vICAgICBpZiAodmlld0lkLnZpZXdJZCA9PSBlbnRyeSkge1xuICAgIC8vICAgICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuY29udGV4dE1lbnVEYXRhU291cmNlLnNvbWUoaXRlbSA9PiBpdGVtLnZpZXdJZCA9PT0gdmlld0lkLnZpZXdJZCk7XG4gICAgLy8gICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAvLyAgICAgICAgIHRoaXMuY29udGV4dE1lbnVEYXRhU291cmNlLnB1c2goe1xuICAgIC8vICAgICAgICAgICB2aWV3SWQ6IHZpZXdJZC52aWV3SWQsXG4gICAgLy8gICAgICAgICAgIHZpZXdOYW1lOiB2aWV3Lm5vZGVQcm9wZXJ0aWVzLndpZGdldFRpdGxlLFxuICAgIC8vICAgICAgICAgICBkaXNwbGF5S2V5OiB2aWV3SWQua3BpQ29uZmlnLmtleVRvUGFzc1xuICAgIC8vICAgICAgICAgfSk7XG4gICAgLy8gICAgICAgfVxuXG4gICAgLy8gICAgICAgY29uc3Qgc3RhcnREYXRhID0gdGhpcy5zdGF0ZURhdGFTb3VyY2UuZ2V0KGVudHJ5KTtcbiAgICAvLyAgICAgICBpZiAoc3RhcnREYXRhKSB7XG4gICAgLy8gICAgICAgICB0aGlzLnN0YXRlRGF0YVNvdXJjZS5kZWxldGUoZW50cnkpXG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICAgIHZpZXcubm9kZVByb3BlcnRpZXNbJ2Rpc3BsYXknXSA9IGZhbHNlO1xuICAgIC8vICAgICAgIGNvbnN0IHByZWZpeGVkSWQgPSBgaWQtJHt2aWV3LmlkfWA7XG4gICAgLy8gICAgICAgY29uc3QgZWxlbWVudFRvSGlkZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3ByZWZpeGVkSWR9YCkgYXMgSFRNTEVsZW1lbnQ7IC8vIENhc3QgdG8gSFRNTEVsZW1lbnRcbiAgICAvLyAgICAgICBpZiAoZWxlbWVudFRvSGlkZSkge1xuICAgIC8vICAgICAgICAgZWxlbWVudFRvSGlkZS5yZW1vdmUoKTtcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgIH1cbiAgICAvLyAgIH0pO1xuICAgIC8vIH1cblxuICAgIHRoaXMuY29udGV4dE1lbnVEYXRhU291cmNlID0gdGhpcy5jb250ZXh0TWVudURhdGFTb3VyY2UuZmlsdGVyKGUgPT4gZS5kaXNwbGF5S2V5ICE9PSBldmVudC5rZXlUb1Bhc3MpO1xuICAgIHZpZXcuY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2godmlld2ZvckRhdGFTZXQgPT4ge1xuXG4gICAgICBsZXQgb2JqID0ge1xuICAgICAgICBcImZpbHRlcnNcIjogYXBwbGllZEZpbHRlcnMsXG4gICAgICAgIFwia2V5VG9QYXNzXCI6IHRoaXMudXBkYXRlT3BlcmF0b3JEYXRhKGV2ZW50LmtleVRvUGFzcywgZXZlbnQuZGF0YSksXG4gICAgICAgIFwiZHJpbGxEb3duVHlwZVwiOiBldmVudC5kcmlsbERvd25UeXBlLFxuICAgICAgICBcImRyaWxsZG93bkZyb21cIjogZXZlbnQuZHJpbGxkb3duRnJvbVxuICAgICAgfVxuICAgICAgdGhpcy5zdGF0ZURhdGFTb3VyY2Uuc2V0KHZpZXdmb3JEYXRhU2V0Wyd2aWV3SWQnXSwgb2JqKVxuICAgIH0pO1xuICAgIHZpZXcubm9kZVByb3BlcnRpZXNbJ2Rpc3BsYXknXSA9IHRydWU7XG4gICAgdmlldy5ub2RlUHJvcGVydGllc1snd2lkZ2V0UGFyYW1zJ10gPSBldmVudC50YWJsZVRpdGxlO1xuICAgIGNvbnN0IHByZWZpeGVkSWQgPSBgaWQtJHt2aWV3LmlkfWA7XG4gICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3ByZWZpeGVkSWR9YCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0ID0gdGhpcy5kYXRhc2V0U2VydmljZS5nZXRVbmlxdWVEYXRhU2V0T2JqZWN0KCk7XG4gICAgdGhpcy5sb2FkU2luZ2xlV2lkZ2V0Tm9kZSh2aWV3LCB0aGlzLm1haW5QYWdlRGl2RWxlbWVudCwgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0KTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20odGhpcy5tYWluUGFnZURpdkVsZW1lbnQpO1xuICAgIH0sIDIwMCk7XG4gICAgbGV0IG5hdmlnYXRpb246IE5hdmlnYXRpb25FeHRyYXMgPSB7XG4gICAgICBxdWVyeVBhcmFtczogYXBwbGllZEZpbHRlcnNbJ29wZXJhdGlvbkZpbHRlciddLFxuICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogXCJtZXJnZVwiXG4gICAgfTtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwgbmF2aWdhdGlvbik7XG4gICAgLy8gfSk7XG4gICAgLy8gfVxuICAgIGNvbnNvbGUubG9nKHRoaXMuc3RhdGVEYXRhU291cmNlKTtcbiAgfVxuXG4gIHNjcm9sbFRvQm90dG9tKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnRhaW5lci5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnZW5kJyB9KTtcbiAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgfSwgMCk7XG4gIH1cblxuICBmaW5kV2lkZ2V0QnlJZChjb25maWdzOiBhbnlbXSwgaWQ6IHN0cmluZyk6IGFueSB8IHVuZGVmaW5lZCB7XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgY29uZmlncykge1xuICAgICAgaWYgKGNvbmZpZy5pZCA9PT0gaWQpIHtcbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcud2lkZ2V0Tm9kZSAmJiBjb25maWcud2lkZ2V0Tm9kZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5maW5kV2lkZ2V0QnlJZChjb25maWcud2lkZ2V0Tm9kZSwgaWQpO1xuICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHVwZGF0ZU9wZXJhdG9yRGF0YShrZXlfbmFtZTogc3RyaW5nW10sIHZhbHVlX2RhdGE6IGFueSk6IGFueSB7XG4gICAgbGV0IG9wZXJhdG9yID0gW107XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5X25hbWUpIHtcbiAgICAgIGxldCBvYmo6IGFueSA9IHt9O1xuICAgICAgb2JqW2tleV0gPSB2YWx1ZV9kYXRhW2tleV07XG4gICAgICBvcGVyYXRvci5wdXNoKG9iailcbiAgICB9XG4gICAgcmV0dXJuIG9wZXJhdG9yO1xuICB9XG5cblxuICBnZXRFbGVtZW50T2ZDdXJyZW50Vmlldyhub2RlLCB2aWV3SWQpIHtcbiAgICBjb25zdCBtYXRjaGVkT2JqZWN0ID0gbm9kZS5jb21wQ29uZmlnLnZpZXdDb25maWcuZmluZChvYmplY3QgPT4gb2JqZWN0LnZpZXdJZCA9PT0gdmlld0lkKTtcbiAgICByZXR1cm4gbWF0Y2hlZE9iamVjdCA/IG5vZGUgOiBudWxsO1xuICB9XG4gIGdldEhvdXJseURhdGEobm9kZSkge1xuICAgIGNvbnN0IG1hdGNoZWRPYmplY3QgPSBub2RlLmNvbXBDb25maWcudmlld0NvbmZpZy5maW5kKG9iamVjdCA9PiBvYmplY3Qua3BpQ29uZmlnLmZvcm1hdGUgPT09ICdob3VybHknKTtcbiAgICByZXR1cm4gbWF0Y2hlZE9iamVjdCA/IG5vZGUgOiBudWxsO1xuICB9XG5cbiAgZ2V0U2V0T3BlcmF0b3JGaWx0ZXIob2JqZWN0RGF0YSwgcHJldmlvdXNWaWV3U3RhdGVzKSB7XG5cbiAgICBjb25zdCB7IGRhdGEsIGtleVRvUGFzcyB9ID0gb2JqZWN0RGF0YTtcbiAgICBjb25zdCBhcHBsaWVkRmlsdGVyID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwcmV2aW91c1ZpZXdTdGF0ZXMuZmlsdGVycy5vcGVyYXRpb25GaWx0ZXIpKTtcblxuICAgIGtleVRvUGFzcy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoa2V5IGluIGRhdGEpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJyZWNvcmREYXRlXCIgJiYgXCJzdGFydERhdGVcIiBpbiBhcHBsaWVkRmlsdGVyICYmIFwiZW5kRGF0ZVwiIGluIGFwcGxpZWRGaWx0ZXIpIHtcbiAgICAgICAgICBhcHBsaWVkRmlsdGVyLnN0YXJ0RGF0ZSA9IGRhdGFba2V5XTtcbiAgICAgICAgICBhcHBsaWVkRmlsdGVyLmVuZERhdGUgPSBkYXRhW2tleV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXBwbGllZEZpbHRlcltrZXldID0gZGF0YVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgZGVmYXVsdG9wZXJhdGlvbkZpbHRlciA9IHRoaXMuZ2xvYmFsRGVmYXVsdEZpbHRlci5vcGVyYXRpb25GaWx0ZXI7XG4gICAgaWYgKGRlZmF1bHRvcGVyYXRpb25GaWx0ZXIpIHtcbiAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRvcGVyYXRpb25GaWx0ZXIpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaWYgKCFhcHBsaWVkRmlsdGVyLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBhcHBsaWVkRmlsdGVyW2tleV0gPSBkZWZhdWx0b3BlcmF0aW9uRmlsdGVyW2tleV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IG9wZXJhdGlvbkZpbHRlciA9IHt9O1xuICAgIG9wZXJhdGlvbkZpbHRlclsnb3BlcmF0aW9uRmlsdGVyJ10gPSBhcHBsaWVkRmlsdGVyO1xuICAgIHJldHVybiBvcGVyYXRpb25GaWx0ZXI7XG4gIH1cblxuXG4gIGdldFJlYXJjaFJlc3VsdEZyb21JbnB1dEJveChpbnB1dFZhbHVlLCB2aWV3Q29uZmlnLCBmaWx0ZXJPYmplY3QpIHtcbiAgICBsZXQgdmlldyA9IHZpZXdDb25maWc7XG4gICAgbGV0IGV2ZW50Tm9kZSA9IHsgZGF0YToge30sIGtleVRvUGFzczogW10gfVxuICAgIGV2ZW50Tm9kZS5kYXRhW2ZpbHRlck9iamVjdC5zZXJ2ZXJfY29sdW1uXSA9IGlucHV0VmFsdWU7XG4gICAgZXZlbnROb2RlWydrZXlUb1Bhc3MnXSA9IFtmaWx0ZXJPYmplY3Quc2VydmVyX2NvbHVtbl07XG4gICAgbGV0IGFwaUNhbGxzID0gW107XG5cbiAgICB2aWV3LmNvbXBDb25maWcudmlld0NvbmZpZy5mb3JFYWNoKGNvbnRlbnRWaWV3ID0+IHtcbiAgICAgIGxldCBhcHBsaWVkRmlsdGVycyA9IHRoaXMuZ2V0U2V0T3BlcmF0b3JGaWx0ZXIoZXZlbnROb2RlLCB0aGlzLnN0YXRlRGF0YVNvdXJjZS5nZXQoY29udGVudFZpZXcudmlld0lkKSk7XG4gICAgICBsZXQgZm91bmQgPSAodGhpcy5kYXRhU2V0TW9kYWwgYXMgYW55W10pLmZpbmQoZCA9PiBkLmRhdGFzZXRJZCA9PT0gY29udGVudFZpZXcuZGF0YXNldElkKTtcbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICBhcGlDYWxscy5wdXNoKHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0RGF0YUZyb21EYXRhU2V0KGZvdW5kLCBjb250ZW50Vmlldy5kYXRhc2V0SWQsIGFwcGxpZWRGaWx0ZXJzKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdmlld0NvbmZpZy5ub2RlUHJvcGVydGllc1snZGlzcGxheSddID0gZmFsc2U7XG4gICAgY29uc3QgcHJlZml4ZWRJZCA9IGBpZC0ke3ZpZXdDb25maWcuaWR9YDtcbiAgICBjb25zdCBlbGVtZW50VG9IaWRlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7cHJlZml4ZWRJZH1gKSBhcyBIVE1MRWxlbWVudDsgLy8gQ2FzdCB0byBIVE1MRWxlbWVudFxuICAgIGlmIChlbGVtZW50VG9IaWRlKSB7XG4gICAgICBlbGVtZW50VG9IaWRlLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIFByb21pc2UuYWxsKGFwaUNhbGxzKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCA9IHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0VW5pcXVlRGF0YVNldE9iamVjdCgpO1xuXG4gICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgICB0aGlzLmNvbnRleHRNZW51RGF0YVNvdXJjZSA9IHRoaXMuY29udGV4dE1lbnVEYXRhU291cmNlLmZpbHRlcihlID0+IGUuZGlzcGxheUtleSAhPT0gdmlld0NvbmZpZy5rZXlUb1Bhc3MpO1xuXG4gICAgICB2aWV3Lm5vZGVQcm9wZXJ0aWVzWydkaXNwbGF5J10gPSB0cnVlO1xuICAgICAgLy8gdmlldy5ub2RlUHJvcGVydGllc1snd2lkZ2V0UGFyYW1zJ10gPSBldmVudC50YWJsZVRpdGxlO1xuICAgICAgY29uc3QgcHJlZml4ZWRJZCA9IGBpZC0ke3ZpZXcuaWR9YDtcbiAgICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtwcmVmaXhlZElkfWApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgdGhpcy5sb2FkU2luZ2xlV2lkZ2V0Tm9kZSh2aWV3LCB0aGlzLm1haW5QYWdlRGl2RWxlbWVudCwgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0KTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKHRoaXMubWFpblBhZ2VEaXZFbGVtZW50KTtcbiAgICAgIH0sIDIwMCk7XG4gICAgICBsZXQgcGFyYW1zID0ge307XG4gICAgICBwYXJhbXNbZmlsdGVyT2JqZWN0LnNlcnZlcl9jb2x1bW5dID0gaW5wdXRWYWx1ZTtcbiAgICAgIGxldCBuYXZpZ2F0aW9uOiBOYXZpZ2F0aW9uRXh0cmFzID0ge1xuICAgICAgICBxdWVyeVBhcmFtczogcGFyYW1zLFxuICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiBcIm1lcmdlXCJcbiAgICAgIH07XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwgbmF2aWdhdGlvbik7XG4gICAgfSk7XG4gIH1cblxuXG4gIHN1Ym1pdEZpbHRlcigpIHtcbiAgICBsZXQgdmlldyA9IHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlLnZpZXdDb25maWc7XG4gICAgLy8gbGV0IGNhbF92YWx1ZSA9IChwYXJzZUZsb2F0KHNlYXJjaFRlcm0pIC8gMTAwKVxuICAgIGxldCBhcGlDYWxscyA9IFtdO1xuICAgIHRoaXMuaGF2aW5nRGF0YU9iamVjdCA9IHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlLmhhdmluZ0NvbmZpZy5maWx0ZXIodmFsdWUgPT4gdmFsdWUudmFsdWUgIT09IFwiXCIpO1xuICAgIHZpZXcuY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2goY29udGVudFZpZXcgPT4ge1xuICAgICAgbGV0IGFwcGxpZWRGaWx0ZXJzID0gdGhpcy5zdGF0ZURhdGFTb3VyY2UuZ2V0KGNvbnRlbnRWaWV3LnZpZXdJZCk7XG4gICAgICBsZXQgZm91bmQgPSAodGhpcy5kYXRhU2V0TW9kYWwgYXMgYW55W10pLmZpbmQoZCA9PiBkLmRhdGFzZXRJZCA9PT0gY29udGVudFZpZXcuZGF0YXNldElkKTtcbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICBhcGlDYWxscy5wdXNoKHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0RGF0YUZyb21EYXRhU2V0KGZvdW5kLCBjb250ZW50Vmlldy5kYXRhc2V0SWQsIGFwcGxpZWRGaWx0ZXJzLmZpbHRlcnMpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBQcm9taXNlLmFsbChhcGlDYWxscykudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QgPSB0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldFVuaXF1ZURhdGFTZXRPYmplY3QoKTtcblxuICAgICAgdGhpcy5ub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2Uudmlld0NvbmZpZy5ub2RlUHJvcGVydGllc1snZGlzcGxheSddID0gZmFsc2U7XG4gICAgICBjb25zdCBwcmVmaXhlZElkID0gYGlkLSR7dGhpcy5ub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2Uudmlld0NvbmZpZy5pZH1gO1xuICAgICAgY29uc3QgZWxlbWVudFRvSGlkZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3ByZWZpeGVkSWR9YCkgYXMgSFRNTEVsZW1lbnQ7IC8vIENhc3QgdG8gSFRNTEVsZW1lbnRcbiAgICAgIGlmIChlbGVtZW50VG9IaWRlKSB7XG4gICAgICAgIGVsZW1lbnRUb0hpZGUucmVtb3ZlKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgICAgIHRoaXMuY29udGV4dE1lbnVEYXRhU291cmNlID0gdGhpcy5jb250ZXh0TWVudURhdGFTb3VyY2UuZmlsdGVyKGUgPT4gZS5kaXNwbGF5S2V5ICE9PSB0aGlzLm5vZGVwcm9wZXJ0aWNlRmlsdGVyRGF0YVNvdXJjZS52aWV3Q29uZmlnLmtleVRvUGFzcyk7XG4gICAgICB0aGlzLmlzV2lkZ2V0RmlsdGVycyA9IGZhbHNlO1xuICAgICAgdmlldy5ub2RlUHJvcGVydGllc1snZGlzcGxheSddID0gdHJ1ZTtcbiAgICAgIC8vIHZpZXcubm9kZVByb3BlcnRpZXNbJ3dpZGdldFBhcmFtcyddID0gZXZlbnQudGFibGVUaXRsZTtcbiAgICAgIC8vIGNvbnN0IHByZWZpeGVkSWQgPSBgaWQtJHt2aWV3LmlkfWA7XG4gICAgICAvLyBjb25zdCBjb250YWluZXJFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7cHJlZml4ZWRJZH1gKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIHRoaXMubG9hZFNpbmdsZVdpZGdldE5vZGUodmlldywgdGhpcy5tYWluUGFnZURpdkVsZW1lbnQsIHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSh0aGlzLm1haW5QYWdlRGl2RWxlbWVudCk7XG4gICAgICB9LCAyMDApO1xuICAgIH0pO1xuICB9XG5cblxuICBnZXRXaWRnZXRGaWx0ZXJGb3JUZW1wbGF0ZSh2YWx1ZSkge1xuICAgIGxldCBhcGlDYWxscyA9IFtdO1xuICAgIGNvbnN0IGRlbGV0ZWRWaWV3SWRzID0gW107XG4gICAgdmFsdWUudmlld05vZGVzLmNvbXBDb25maWcudmlld0NvbmZpZy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgbGV0IHdpZGdldEZpbHRlciA9IHRoaXMuc3RhdGVEYXRhU291cmNlLmdldChpdGVtLnZpZXdJZCk7XG4gICAgICBsZXQgYXBwbGllZEZpbHRlcnMgPSB3aWRnZXRGaWx0ZXIuZmlsdGVycztcbiAgICAgIGxldCBmb3VuZCA9ICh0aGlzLmRhdGFTZXRNb2RhbCBhcyBhbnlbXSkuZmluZChkID0+IGQuZGF0YXNldElkID09PSBpdGVtLmRhdGFzZXRJZCk7XG4gICAgICBkZWxldGVkVmlld0lkcy5wdXNoKGl0ZW0udmlld0lkKTtcbiAgICAgIGNvbnN0IGhhdmluZyA9IE9iamVjdC5lbnRyaWVzKHZhbHVlLm9wZXJhdGlvbkZpbHRlcikubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICAgIGNvbHVtbk5hbWU6IGtleSxcbiAgICAgICAgZGF0YVR5cGU6IFwiZmxvYXRcIixcbiAgICAgICAgb3BlcmF0b3I6IFwiZ3RlXCIsXG4gICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgfSkpO1xuXG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgZm91bmQuY29uZmlnLnF1ZXJ5Q29uZmlnWydoYXZpbmdzJ10gPSBoYXZpbmc7XG4gICAgICAgIGFwaUNhbGxzLnB1c2godGhpcy5kYXRhc2V0U2VydmljZS5nZXREYXRhRnJvbURhdGFTZXQoZm91bmQsIGl0ZW0uZGF0YXNldElkLCBhcHBsaWVkRmlsdGVycykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFByb21pc2UuYWxsKGFwaUNhbGxzKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCA9IHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0VW5pcXVlRGF0YVNldE9iamVjdCgpO1xuICAgICAgLy8gdmFsdWUudmlld05vZGVzLm5vZGVQcm9wZXJ0aWVzWyd3aWRnZXRQYXJhbXMnXSA9IGV2ZW50LnRhYmxlVGl0bGU7XG4gICAgICB0aGlzLmxvYWRTaW5nbGVXaWRnZXROb2RlKHZhbHVlLnZpZXdOb2RlcywgdGhpcy5tYWluUGFnZURpdkVsZW1lbnQsIHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSh0aGlzLm1haW5QYWdlRGl2RWxlbWVudCk7XG4gICAgICB9LCAyMDApO1xuXG4gICAgfSk7XG4gICAgLy8gfVxuICB9XG5cbn1cbiIsIjxhcHAtbG9hZGluZyAqbmdJZj1cImxvYWRpbmdNb2RhbFwiPjwvYXBwLWxvYWRpbmc+XG5cbjxkaXYgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgXCIgI2R5bmFtaWNDb250YWluZXI+PC9kaXY+XG48L2Rpdj4iXX0=
1172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFuZGluZy1jb21wb25lbnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FtbWEtYXBwLWNvbnRyb2xsZXIvc3JjL2xpYi90ZW1wbGF0ZS1tb2R1bGUvZGVmYXVsTGFuZGluZ0NvbXBvbmVudC9sYW5kaW5nLWNvbXBvbmVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL3RlbXBsYXRlLW1vZHVsZS9kZWZhdWxMYW5kaW5nQ29tcG9uZW50L2xhbmRpbmctY29tcG9uZW50LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFrRyxTQUFTLEVBQWdCLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXBNLE9BQU8sTUFBTSxNQUFNLDRDQUE0QyxDQUFDO0FBR2hFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLG1GQUFtRixDQUFDO0FBQy9ILE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHFGQUFxRixDQUFDO0FBQ2xJLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlFQUF5RSxDQUFDO0FBQ3BILE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLG1HQUFtRyxDQUFDO0FBQ3RKLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDJGQUEyRixDQUFDO0FBQzFJLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHFHQUFxRyxDQUFDO0FBQ3pKLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHFHQUFxRyxDQUFDO0FBQ3pKLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDJFQUEyRSxDQUFDO0FBQ25ILE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVFQUF1RSxDQUFDO0FBRWhILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFN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ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBDb21wb25lbnRSZWYsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgT25EZXN0cm95LCBPbkluaXQsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4sIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBOYXZpZ2F0aW9uRXh0cmFzLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IG1vbWVudCBmcm9tICcuLi8uLi9hcHBsaWNhdGlvbi1jb250cm9sbGVyL21vbWVudC1oZWxwZXInO1xuXG5pbXBvcnQgeyBDb21tb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vYXBwbGljYXRpb24tY29udHJvbGxlci9jb21tb24nO1xuaW1wb3J0IHsgR2FtbWFBZHZhbmNlQ2hhcnRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2dhbW1hLWFkdmFuY2UtY2hhcnQvZ2FtbWEtYWR2YW5jZS1jaGFydC5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FtbWFUb2RheVByZXZpb3VzQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FkdmFuY2VkLWNvbXBvbmVudC9nYW1tYS10b2RheS1wcmV2aW91cy9nYW1tYS10b2RheS1wcmV2aW91cy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXBwQWR2YW5jZUhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvYXBwLWFkdmFuY2UtaGVhZGVyL2FwcC1oZWFkZXIuY29tcG9uZW50JztcbmltcG9ydCB7IEdhbW1hVGFibGVXaXRoUGVyY2VudGFnZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ2FtbWEtdGFibGUtd2l0aC1wZXJjZW50YWdlL2dhbW1hLXRhYmxlLXdpdGgtcGVyY2VudGFnZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FtbVNpbmdsZU51bWJlckNhcmRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2dhbW0tc2luZ2xlLW51bWJlci1jYXJkL2dhbW0tc2luZ2xlLW51bWJlci1jYXJkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHYW1tYUFkdmFuY2VPcGVyYXRvclRhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FkdmFuY2VkLWNvbXBvbmVudC9nYW1tYS1hZHZhbmNlLW9wZXJhdG9yLXRhYmxlL2dhbW1hLWFkdmFuY2Utb3BlcmF0b3ItdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IEFkdmFuY2VXaWRnZXRIZWFkZXJGaWx0ZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2FkdmFuY2Utd2lkZ2V0LWhlYWRlci1maWx0ZXIvYWR2YW5jZS13aWRnZXQtaGVhZGVyLWZpbHRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FtbWFHZW9DaGFydENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ2FtbWEtZ2VvLWNoYXJ0L2dhbW1hLWdlby1jaGFydC5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FtbWFIZWF0Q2hhcnRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2dhbW1hLWhlYXRtYXAvZ2FtbWEtaGVhdG1hcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xuaW1wb3J0IHsgZm9ya0pvaW4gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IExhbmRpbmdDb21wb25lbnRTZXJ2aWNlIH0gZnJvbSAnLi9sYW5kaW5nLWNvbXBvbmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IExhbmRpbmdBcHBsaWNhdGlvbkRhdHNzZXRzQ2FsbCB9IGZyb20gJy4vbGFuZGluZy1kYXRhc2V0LWNhbGwuc2VydmljZSc7XG5pbXBvcnQgeyBBcHBMYW5kaW5nTGF5b3V0TG9jYWxTdG9yYWdlIH0gZnJvbSAnLi9sYW5kaW5nLnRva2VuU3RvcmFnZS5zZXJ2Y2UnO1xuLy8gaW1wb3J0IHsgQXBwTG9jYWxTdG9yYWdlIH0gZnJvbSAnLi4vLi4vYXBwbGljYXRpb24tY29udHJvbGxlci90b2tlblN0b3JhZ2Uuc2VydmNlJztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtbGFuZGluZy1jb21wb25lbnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vbGFuZGluZy1jb21wb25lbnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9sYW5kaW5nLWNvbXBvbmVudC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIExhbmRpbmdDb21wb25lbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIGRhc2hib3JkX2NvbnRhaW5lcjogYW55ID0gW107XG4gIHNlbGVjdGVkX3dpZHRoOiBhbnk7XG4gIHdpZGdldF93aWR0aCA9IFsndy1mdWxsJywgJ3ctMS8yJywgJ3ctMS8zJywgJ3ctMS80JywgJ3ctMS81JywgJ3ctMS82J11cbiAgbG9hZGluZ01vZGFsOiBib29sZWFuO1xuICBwYWdlX3RpdGxlID0gJ0Rhc2hib2FyZCc7XG4gIGRlZmF1bHRTdGFydERhdGU7XG4gIGRlZmF1bHRFbmREYXRlO1xuICAvKipcbiAgICogQ29uc3RydWN0b3JcbiAgICovXG5cbiAgQFZpZXdDaGlsZCgnZHluYW1pY0NvbXBvbmVudENvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICBkeW5hbWljQ29tcG9uZW50Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xuICBAVmlld0NoaWxkKCdjb250YWluZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgY29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmO1xuICBAVmlld0NoaWxkKCdkeW5hbWljQ29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSkgZHluYW1pY0NvbnRhaW5lcjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnZHluYW1pY0NvbnRhaW5lckZvclBvcHVwJywgeyBzdGF0aWM6IHRydWUgfSkgZHluYW1pY0NvbnRhaW5lckZvclBvcHVwOiBFbGVtZW50UmVmO1xuXG4gIGR5bmFtaWNDb21wb25lbnRSZWZzOiBDb21wb25lbnRSZWY8YW55PltdID0gW107XG4gIC8vIGR5bmFtaWNDb21wb25lbnRSZWZzOiBDb21wb25lbnRSZWY8YW55PltdID0gW107XG5cbiAgQ29tcFJlZnM6IENvbXBvbmVudFJlZjxhbnk+O1xuXG4gIGNvbXBvbmVudENsYXNzTWFwID0ge1xuICAgIEdhbW1hQWR2YW5jZUNoYXJ0Q29tcG9uZW50LFxuICAgIEdhbW1hVG9kYXlQcmV2aW91c0NvbXBvbmVudCxcbiAgICBBcHBBZHZhbmNlSGVhZGVyQ29tcG9uZW50LFxuICAgIEdhbW1hVGFibGVXaXRoUGVyY2VudGFnZUNvbXBvbmVudCxcbiAgICBHYW1tU2luZ2xlTnVtYmVyQ2FyZENvbXBvbmVudCxcbiAgICBHYW1tYUFkdmFuY2VPcGVyYXRvclRhYmxlQ29tcG9uZW50LFxuICAgIEFkdmFuY2VXaWRnZXRIZWFkZXJGaWx0ZXJDb21wb25lbnQsXG4gICAgR2FtbWFHZW9DaGFydENvbXBvbmVudCxcbiAgICBHYW1tYUhlYXRDaGFydENvbXBvbmVudFxuICB9O1xuICBkYXRhU291cmNlTWF0YURhdGE6IGFueSA9IFtdO1xuICBxdWVyeVR5cGUgPSBcIm1vbmdvXCI7XG4gIGRhdGFTZXRNb2RhbDogYW55ID0gW107XG4gIGNvbXBvbmVudENvbmZpZ0RhdGFTb3VyY2U6IGFueSA9IFtdO1xuICBzZWxlc2NlZERhdGFTb3VyY2U6IGFueTtcbiAgZGF0YVNvdXJjZU1vZGFsOiBhbnkgPSB7fTtcbiAgaXNEYXNoQm9hcmRDb250ZW50OiBib29sZWFuID0gZmFsc2U7XG5cbiAgc2VsZWN0ZWRWaWV3Rm9ybUNvbXBvbmVudDogYW55ID0ge307XG4gIGFkZGVkd2lkR2V0Q29uZmlnID0ge1xuICAgIFwiZGlzcGxheVwiOiB0cnVlLFxuICAgIFwid2lkZ2V0VGl0bGVcIjogXCJcIixcbiAgICBcIndpZHRoXCI6IFwiXCIsXG4gICAgXCJoZWlnaHRcIjogXCJcIlxuICB9XG5cblxuICBkYXNoQm9hcmRXaWRnZXRDb25maWc6IGFueSA9IFtcblxuICBdO1xuICBpc1dpZGdldENyZWF0aW9uQ29udGVudDogYm9vbGVhbjtcbiAgc2VsZWN0ZWRXaWR0aDogYW55O1xuICBzZWxlY3RlZEhlaWdodDogYW55O1xuICBuZXdXaWRnZXRJbmRleDogYW55O1xuICBzZWxlY3RlZEluZGV4T2JqRm9yQ2hhcnQ6IGFueSA9IHt9O1xuICBzZWxlY3RlZENvbnRhaW5lck9iamVjdEZvckNoYXJ0OiBhbnkgPSB7fTtcbiAgZGF0YVNldHRhYmxlRGF0YVNvdXJjZTogYW55O1xuICB1bmlxdWVEYXRhU2V0T2JqZWN0ID0ge307XG5cbiAgaXNEYXNoQm9hcmRDb250ZW50VHlwZVZpZXc6IGJvb2xlYW4gPSB0cnVlO1xuICBmaWx0ZXJzOiBhbnk7XG4gIGFsbFdpZGdldEJ5RGF0YXNldCA9IFtdO1xuICBwYWdlVGl0bGU6IGFueTtcbiAgc3RhdGVEYXRhU291cmNlID0gbmV3IE1hcCgpO1xuICBtYWluUGFnZURpdkVsZW1lbnQ6IGFueTtcbiAgY29udGV4dE1lbnVEYXRhU291cmNlOiBhbnkgPSBbXTtcbiAgaGF2aW5nRGF0YU9iamVjdDogYW55ID0ge307XG4gIGlzV2lkZ2V0RmlsdGVyczogYm9vbGVhbjtcbiAgbm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlOiBhbnk7XG4gIGdsb2JhbERlZmF1bHRGaWx0ZXI6IGFueSA9IHt9O1xuICBwYWdlSWQ6IGFueTtcblxuICBrcGlfYnJlYWRjcnVtYnNfY29udGFpbmVyOiBhbnk7XG4gIG9wZXJhdG9yTmFtZTogYW55O1xuXG4gIGRlZmF1bHRWaWV3SWRzOiBhbnkgPSBbXTtcbiAgZGVmYXVsdFZpZXdJZHNPblBhZ2VSZWZyZXNoOiBhbnkgPSBbXTtcbiAgaXNQb3B1cFZpZXc6IGJvb2xlYW47XG4gIG1vZGFsQ29uZmlnczogYW55O1xuICBkZWZhdWx0TWF0Y2hlZEZpbHRlcnMgPSB7IG9wZXJhdGlvbkZpbHRlcjogeyBzdGFydERhdGU6IFwiXCIsIGVuZERhdGU6IFwiXCIgfSB9O1xuICBpc0RlZmF1bHRGaWx0ZXJQYXJhbXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICB2aWV3UGFyYW1zOiBhbnk7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgc2VydmljZTogTGFuZGluZ0NvbXBvbmVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2FzdHI6IFRvYXN0clNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGRhdGFzZXRTZXJ2aWNlOiBMYW5kaW5nQXBwbGljYXRpb25EYXRzc2V0c0NhbGwsXG4gICAgcHJpdmF0ZSBzdG9yYWdlOiBBcHBMYW5kaW5nTGF5b3V0TG9jYWxTdG9yYWdlXG5cbiAgICAvLyBwcml2YXRlIHN0b3JhZ2U6IEFwcExvY2FsU3RvcmFnZVxuXG5cbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICAgIC8vIHRoaXMuc2VydmljZS5nZXRsaXN0S3BpQnJvd3NlcigpLnN1YnNjcmliZSh7XG4gICAgLy8gICBuZXh0OiAoKGRhdGE6IGFueSkgPT4ge1xuICAgIC8vICAgICB0aGlzLmtwaV9icmVhZGNydW1ic19jb250YWluZXIgPSBkYXRhO1xuICAgIC8vICAgfSlcbiAgICAvLyB9KVxuXG5cblxuICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLnBhZ2VJZCA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbJ3BhZ2VJZCddO1xuICAgIHRoaXMuZ2V0UGFkZURhdGFTb3VyY2UoZmFsc2UpO1xuXG4gIH1cblxuICBhc3luYyBnZXRGaWx0ZXJzRm9yVGVtcGxhdGUoZmlsdGVyKSB7XG4gICAgdGhpcy5maWx0ZXJzID0gZmlsdGVyO1xuICAgIHRoaXMuZGVmYXVsdFN0YXJ0RGF0ZSA9IGZpbHRlci5zdGFydERhdGU7XG4gICAgdGhpcy5kZWZhdWx0RW5kRGF0ZSA9IGZpbHRlci5lbmREYXRlO1xuICAgIGZpbHRlci5vcGVyYXRpb25GaWx0ZXJbJ3N0YXJ0RGF0ZSddID0gZmlsdGVyLnN0YXJ0RGF0ZTtcbiAgICBmaWx0ZXIub3BlcmF0aW9uRmlsdGVyWydlbmREYXRlJ10gPSBmaWx0ZXIuZW5kRGF0ZTtcbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcgPSBbXTtcbiAgICBhd2FpdCB0aGlzLmdldFBhZGVEYXRhU291cmNlKHRydWUpO1xuICAgIHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCA9IHt9O1xuICAgIGxldCBhcGlDYWxscyA9IFtdO1xuXG4gICAgdGhpcy5hbGxXaWRnZXRCeURhdGFzZXQuZm9yRWFjaCh2aWV3ID0+IHtcbiAgICAgIHZpZXcuZGF0YXNldElkcy5mb3JFYWNoKGlkID0+IHtcbiAgICAgICAgbGV0IGZvdW5kID0gKHRoaXMuZGF0YVNldE1vZGFsIGFzIGFueVtdKS5maW5kKGQgPT4gZC5kYXRhc2V0SWQgPT09IGlkLmRhdGFzZXRJZCk7XG4gICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgIGFwaUNhbGxzLnB1c2godGhpcy5kYXRhc2V0U2VydmljZS5nZXREYXRhRnJvbURhdGFTZXQoZm91bmQsIGlkLmRhdGFzZXRJZCwgZmlsdGVyKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgUHJvbWlzZS5hbGwoYXBpQ2FsbHMpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5nbG9iYWxEZWZhdWx0RmlsdGVyID0gZmlsdGVyO1xuICAgICAgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0ID0gdGhpcy5kYXRhc2V0U2VydmljZS5nZXRVbmlxdWVEYXRhU2V0T2JqZWN0KCk7XG4gICAgICB0aGlzLmNyZWF0ZURpdkVsZW1lbnRzKHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCwgdHJ1ZSk7XG4gICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0UGFkZURhdGFTb3VyY2UoY29udGV4dCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnNlcnZpY2UuZ2V0QXBwUGFnZURldGFpbENvbmZpZyh0aGlzLnBhZ2VJZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuXG4gICAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBkYXRhLnBhZ2VOYW1lO1xuICAgICAgICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnID0gZGF0YTtcblxuICAgICAgICAgIC8vIHRoaXMuZ2V0RHJpbGxkb3duRGlzcGxheUJ5VXJsUGFyYW1zKGRhdGEud2lkZ2V0cyk7XG5cbiAgICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIHRoaXMuZGVmYXVsdFN0YXJ0RGF0ZSA9IG1vbWVudCgpLnN1YnRyYWN0KCczMCcsICdkYXlzJykuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG4gICAgICAgICAgICAvLyB0aGlzLmRlZmF1bHRFbmREYXRlID0gbW9tZW50KCkuc3VidHJhY3QoJzEnLCAnZGF5cycpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0KS5sZW5ndGggIT0gMCkge1xuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZURpdkVsZW1lbnRzKHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCwgZmFsc2UpO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZ2V0Q29tcG9uZW50Q29uZmlnU2V0KCk7XG4gICAgICAgICAgICAvLyB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuXG5cbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdFcnJvcicpO1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG5cblxuICBnZXRDb21wb25lbnRDb25maWdTZXQoKSB7XG4gICAgbGV0IGRhdGFzZXQgPSB0aGlzLnNlcnZpY2UuZ2V0QXBwRGF0YXNldENvbmZpZ3MoKTtcbiAgICBsZXQgdmlld0NvbXBvbmVudCA9IHRoaXMuc2VydmljZS5nZXRBcHBWaWV3Q29uZmlncygpO1xuICAgIHRoaXMuZGVmYXVsdFZpZXdJZHMgPSBbXTtcbiAgICBmb3JrSm9pbih7XG4gICAgICBkYXRhc2V0Q29uZmlnOiBkYXRhc2V0LFxuICAgICAgdmlld0NvbmZpZzogdmlld0NvbXBvbmVudFxuICAgIH0pLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKHsgZGF0YXNldENvbmZpZywgdmlld0NvbmZpZyB9KSA9PiB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50Q29uZmlnRGF0YVNvdXJjZSA9IHZpZXdDb25maWc7XG4gICAgICAgIHRoaXMuZGF0YVNldE1vZGFsID0gZGF0YXNldENvbmZpZztcbiAgICAgICAgdGhpcy5hbGxXaWRnZXRCeURhdGFzZXQgPSBbXTtcbiAgICAgICAgbGV0IHsgcGFnZUlkLCBzdGFydERhdGUsIGVuZERhdGUsIC4uLnBhcmFtcyB9ID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcztcbiAgICAgICAgbGV0IGRlZmF1bHRGaWx0ZXJzID0geyBvcGVyYXRpb25GaWx0ZXI6IHsgc3RhcnREYXRlOiBcIlwiLCBlbmREYXRlOiBcIlwiLCAuLi5wYXJhbXMgfSB9O1xuXG5cbiAgICAgICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5mb3JFYWNoKHdpZGdldCA9PiB7XG4gICAgICAgICAgd2lkZ2V0LmZpbHRlcnMuZmlsdGVySXRlbXMuZm9yRWFjaChlbGVtZW50ID0+IHtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZmlsdGVyVHlwZSA9PT0gJ2RhdGUnIHx8IGVsZW1lbnQuZmlsdGVyVHlwZSA9PT0gJ2RhdGV0aW1lJykge1xuICAgICAgICAgICAgICBpZiAoZWxlbWVudC5kZWZhdWx0RmlsdGVyVHlwZSA9PT0gXCJkeW5hbWljXCIgJiYgZWxlbWVudC5tb21lbnRGdW5jdGlvbiAhPT0gXCJcIiAmJiBlbGVtZW50LmRlZmF1bHRGaWx0ZXJWYWx1ZSAhPT0gXCJcIiAmJiBlbGVtZW50Lm1vbWVudEZvcm1hdCAhPT0gXCJcIikge1xuXG5cbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5tb21lbnRGdW5jdGlvbiA9PSBcIm1vbnRoUGlja2VyXCIpIHtcbiAgICAgICAgICAgICAgICAgIGxldCBbY291bnQsIHVuaXRdID0gZWxlbWVudC5kZWZhdWx0RmlsdGVyVmFsdWUuc3BsaXQoJywnKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuYXBpTmFtZSA9PT0gXCJlbmREYXRlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGlzcGxheSkge1xuICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzLm9wZXJhdGlvbkZpbHRlci5lbmREYXRlID0gbW9tZW50KCkuc3VidHJhY3QocGFyc2VJbnQoY291bnQpLCB1bml0KS5lbmRPZih1bml0KS5mb3JtYXQoZWxlbWVudC5tb21lbnRGb3JtYXQpO1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEVuZERhdGUgPSBtb21lbnQoKS5zdWJ0cmFjdChwYXJzZUludChjb3VudCksIHVuaXQpLmVuZE9mKHVuaXQpLmZvcm1hdChlbGVtZW50Lm1vbWVudEZvcm1hdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmFwaU5hbWUgPT09IFwic3RhcnREYXRlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyLnN0YXJ0RGF0ZSA9IG1vbWVudCgpLnN1YnRyYWN0KHBhcnNlSW50KGNvdW50KSwgdW5pdCkuc3RhcnRPZih1bml0KS5mb3JtYXQoZWxlbWVudC5tb21lbnRGb3JtYXQpOztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQubW9tZW50RnVuY3Rpb24gPT0gXCJ3ZWVrUGlja2VyXCIpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmFwaU5hbWUgPT09IFwiZW5kRGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmRpc3BsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVycy5vcGVyYXRpb25GaWx0ZXIuZW5kRGF0ZSA9IG1vbWVudCgpLmVuZE9mKCd3ZWVrJykuZm9ybWF0KGVsZW1lbnQubW9tZW50Rm9ybWF0KTtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRFbmREYXRlID0gbW9tZW50KCkuZW5kT2YoJ3dlZWsnKS5mb3JtYXQoZWxlbWVudC5tb21lbnRGb3JtYXQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5hcGlOYW1lID09PSBcInN0YXJ0RGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzLm9wZXJhdGlvbkZpbHRlci5zdGFydERhdGUgPSBtb21lbnQoKS5zdGFydE9mKCd3ZWVrJykuZm9ybWF0KGVsZW1lbnQubW9tZW50Rm9ybWF0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U3RhcnREYXRlID0gbW9tZW50KCkuc3RhcnRPZignd2VlaycpLmZvcm1hdChlbGVtZW50Lm1vbWVudEZvcm1hdCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGxldCBbY291bnQsIHVuaXRdID0gZWxlbWVudC5kZWZhdWx0RmlsdGVyVmFsdWUuc3BsaXQoJywnKTtcbiAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmFwaU5hbWUgPT09IFwiZW5kRGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmRpc3BsYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVycy5vcGVyYXRpb25GaWx0ZXIuZW5kRGF0ZSA9IG1vbWVudCgpW2VsZW1lbnQubW9tZW50RnVuY3Rpb25dKHBhcnNlSW50KGNvdW50KSwgdW5pdCkuZm9ybWF0KGVsZW1lbnQubW9tZW50Rm9ybWF0KTtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRFbmREYXRlID0gbW9tZW50KClbZWxlbWVudC5tb21lbnRGdW5jdGlvbl0ocGFyc2VJbnQoY291bnQpLCB1bml0KS5mb3JtYXQoZWxlbWVudC5tb21lbnRGb3JtYXQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5hcGlOYW1lID09PSBcInN0YXJ0RGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzLm9wZXJhdGlvbkZpbHRlci5zdGFydERhdGUgPSBtb21lbnQoKVtlbGVtZW50Lm1vbWVudEZ1bmN0aW9uXShwYXJzZUludChjb3VudCksIHVuaXQpLmZvcm1hdChlbGVtZW50Lm1vbWVudEZvcm1hdCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFN0YXJ0RGF0ZSA9IG1vbWVudCgpW2VsZW1lbnQubW9tZW50RnVuY3Rpb25dKHBhcnNlSW50KGNvdW50KSwgdW5pdCkuZm9ybWF0KGVsZW1lbnQubW9tZW50Rm9ybWF0KTtcblxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5kZWZhdWx0RmlsdGVyVHlwZSA9PT0gXCJzdGF0aWNcIiAmJiBlbGVtZW50LmRlZmF1bHRGaWx0ZXJWYWx1ZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmFwaU5hbWUgPT09IFwiZW5kRGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5kaXNwbGF5KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzLm9wZXJhdGlvbkZpbHRlci5lbmREYXRlID0gZWxlbWVudC5kZWZhdWx0RmlsdGVyVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEVuZERhdGUgPSBlbGVtZW50LmRlZmF1bHRGaWx0ZXJWYWx1ZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuYXBpTmFtZSA9PT0gXCJzdGFydERhdGVcIikge1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyLnN0YXJ0RGF0ZSA9IGVsZW1lbnQuZGVmYXVsdEZpbHRlclZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTdGFydERhdGUgPSBlbGVtZW50LmRlZmF1bHRGaWx0ZXJWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAodHlwZW9mIGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlID09PSBcInN0cmluZ1wiICYmIGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlICE9PSBcIlwiKSB8fFxuICAgICAgICAgICAgICAgIChBcnJheS5pc0FycmF5KGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlKSAmJiBlbGVtZW50LmZpbHRlckRhdGFTb3VyY2VWYWx1ZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5vcGVyYXRvck5hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzLm9wZXJhdGlvbkZpbHRlcltlbGVtZW50Lm9wZXJhdG9yTmFtZV0gPSBBcnJheS5pc0FycmF5KGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA/IGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlXG4gICAgICAgICAgICAgICAgICAgIDogW2VsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyW2VsZW1lbnQuYXBpTmFtZV0gPSBlbGVtZW50LmZpbHRlckRhdGFTb3VyY2VWYWx1ZS5qb2luKFwiLFwiKTtcblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBsZXQgZGF0YXNldElkczogU2V0PGFueT4gPSBuZXcgU2V0KCk7XG4gICAgICAgICAgbGV0IHZpZXdJZHM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICAgICAgICAgIHdpZGdldC53aWRnZXROb2RlLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlUHJvcGVydGllcy5kaXNwbGF5KSB7XG4gICAgICAgICAgICAgIG5vZGUuY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2godmlldyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0Vmlld0lkcy5wdXNoKHZpZXcudmlld0lkKVxuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kT2JqZWN0ID0gdGhpcy5kZWZhdWx0Vmlld0lkc09uUGFnZVJlZnJlc2g/LmZpbmQoaXRlbSA9PiBpdGVtLnZpZXdJZCA9PT0gdmlldy52aWV3SWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlcml2ZWRGaWx0ZXJzID0gZm91bmRPYmplY3QgPyB0aGlzLmdldERyaWxkb3duRmlsdGVyKGZvdW5kT2JqZWN0LCBkZWZhdWx0RmlsdGVycykgOiBkZWZhdWx0RmlsdGVycztcbiAgICAgICAgICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgICAgICAgXCJmaWx0ZXJzXCI6IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGVyaXZlZEZpbHRlcnMpKSxcbiAgICAgICAgICAgICAgICAgIFwia2V5VG9QYXNzXCI6IFtdLFxuICAgICAgICAgICAgICAgICAgXCJkcmlsbERvd25UeXBlXCI6IFwibmF0dXJhbFwiLFxuICAgICAgICAgICAgICAgICAgXCJkcmlsbGRvd25Gcm9tXCI6IFwiXCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZURhdGFTb3VyY2Uuc2V0KHZpZXcudmlld0lkLCBvYmopXG4gICAgICAgICAgICAgICAgbGV0IG5vZGUgPSB7XG4gICAgICAgICAgICAgICAgICBkYXRhc2V0SWQ6IHZpZXcuZGF0YXNldElkLFxuICAgICAgICAgICAgICAgICAgdmlld0lkOiB2aWV3LnZpZXdJZCxcbiAgICAgICAgICAgICAgICAgIGZpbHRlcjogZGVyaXZlZEZpbHRlcnNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGF0YXNldElkcy5hZGQobm9kZSk7XG4gICAgICAgICAgICAgICAgdmlld0lkcy5hZGQodmlldy52aWV3SWQpO1xuXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbm9kZS5jb21wQ29uZmlnLnZpZXdDb25maWcuZm9yRWFjaCh2aWV3ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51RGF0YVNvdXJjZS5wdXNoKHsgdmlld0lkOiB2aWV3LnZpZXdJZCwgdmlld05hbWU6IG5vZGUubm9kZVByb3BlcnRpZXMud2lkZ2V0VGl0bGUsIGRpc3BsYXlLZXk6IHZpZXcua3BpQ29uZmlnLmtleVRvUGFzcyB9KVxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFZpZXdJZHNPblBhZ2VSZWZyZXNoPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZpZXdzID0gdGhpcy5kZWZhdWx0Vmlld0lkc09uUGFnZVJlZnJlc2gubWFwKGl0ZW0gPT4gaXRlbS52aWV3SWQpO1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0Vmlld0lkcyA9IFsuLi50aGlzLmRlZmF1bHRWaWV3SWRzLCAuLi5uZXdWaWV3cy5maWx0ZXIoaXRlbSA9PiAhdGhpcy5kZWZhdWx0Vmlld0lkcy5pbmNsdWRlcyhpdGVtKSldO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGZvciBSVERNUyBvcGVyYXRvcm5hbWVcbiAgICAgICAgICAvLyB0aGlzLm9wZXJhdG9yTmFtZSA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbJ29wZXJhdG9yTmFtZSddO1xuICAgICAgICAgIC8vIGlmICh0aGlzLm9wZXJhdG9yTmFtZSkge1xuICAgICAgICAgIC8vICAgZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyWydvcGVyYXRvcl9rZXknXSA9IHRoaXMub3BlcmF0b3JOYW1lO1xuICAgICAgICAgIC8vIH1cblxuICAgICAgICAgIGxldCBvYmogPSB7XG4gICAgICAgICAgICB3aWRnZXRJZDogd2lkZ2V0LndpZGdldElkLFxuICAgICAgICAgICAgcGFnZUlkOiB3aWRnZXQucGFnZUlkLFxuICAgICAgICAgICAgZmlsdGVyczogZGVmYXVsdEZpbHRlcnMsXG4gICAgICAgICAgICBkYXRhc2V0SWRzOiBkYXRhc2V0SWRzXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuYWxsV2lkZ2V0QnlEYXRhc2V0LnB1c2gob2JqKTtcbiAgICAgICAgfSk7XG5cblxuXG4gICAgICAgIHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCA9IHt9O1xuICAgICAgICBsZXQgYXBpQ2FsbHMgPSBbXTtcbiAgICAgICAgdGhpcy5hbGxXaWRnZXRCeURhdGFzZXQuZm9yRWFjaCh2aWV3ID0+IHtcbiAgICAgICAgICB2aWV3LmRhdGFzZXRJZHMuZm9yRWFjaChpZCA9PiB7XG4gICAgICAgICAgICBsZXQgZm91bmQgPSAoZGF0YXNldENvbmZpZyBhcyBhbnlbXSkuZmluZChkID0+IGQuZGF0YXNldElkID09PSBpZC5kYXRhc2V0SWQpO1xuICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgIGFwaUNhbGxzLnB1c2godGhpcy5kYXRhc2V0U2VydmljZS5nZXREYXRhRnJvbURhdGFTZXQoZm91bmQsIGlkLmRhdGFzZXRJZCwgaWQuZmlsdGVyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBQcm9taXNlLmFsbChhcGlDYWxscykudGhlbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0ID0gdGhpcy5kYXRhc2V0U2VydmljZS5nZXRVbmlxdWVEYXRhU2V0T2JqZWN0KCk7XG4gICAgICAgICAgdGhpcy5jcmVhdGVEaXZFbGVtZW50cyh0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QsIGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgICAgIGxldCB1cmxQYXJhbXM6IGFueSA9IGRlZmF1bHRGaWx0ZXJzLm9wZXJhdGlvbkZpbHRlclxuICAgICAgICAgIHVybFBhcmFtc1sncGFnZUlkJ10gPSB0aGlzLnBhZ2VJZFxuICAgICAgICAgIGxldCBuYXZpZ2F0aW9uOiBOYXZpZ2F0aW9uRXh0cmFzID0ge1xuICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHVybFBhcmFtcyxcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6IFwibWVyZ2VcIlxuICAgICAgICAgIH07XG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIG5hdmlnYXRpb24pO1xuICAgICAgICB9KTtcbiAgICAgIH0pLCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnRXJyb3InKTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZ2V0RGF0YVNldCgpIHtcbiAgICB0aGlzLnNlcnZpY2UuZ2V0QXBwRGF0YXNldENvbmZpZ3MoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmRhdGFTZXR0YWJsZURhdGFTb3VyY2UgPSBkYXRhO1xuICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ0RhdGFzZXQgQ3JlYXRpb24nKVxuXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG5cblxuXG4gIGFzeW5jIGNyZWF0ZURpdkVsZW1lbnRzKGRhdGFzZXRCeUlkLCBjb250ZXh0KSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5keW5hbWljQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gICAgY29uc3QgY29udGV4dF9maWx0ZXIgPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy5maWx0ZXJzID8gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcuZmlsdGVycy5maWx0ZXJJdGVtcyA6IG51bGw7XG5cbiAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLmZvckVhY2goYXN5bmMgZGl2ID0+IHtcbiAgICAgIGNvbnN0IHJvd0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgbGV0IHdfaGVpZ2h0ID0gKGRpdi53aWRnZXRQcm9wZXJ0aWVzLmhlaWdodCA9PSBcIlwiKSA/IFwiaC1hdXRvXCIgOiAnaC1bJyArIGRpdi53aWRnZXRQcm9wZXJ0aWVzLmhlaWdodCArICddJztcbiAgICAgIHJvd0Rpdi5jbGFzc0xpc3QuYWRkKGRpdi53aWRnZXRQcm9wZXJ0aWVzLndpZHRoLCB3X2hlaWdodCk7XG4gICAgICBjb25zdCBmaWx0ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgY29uc3QgZmlsdGVySXRlbXMgPSAoZGl2LmZpbHRlcnMpID8gZGl2LmZpbHRlcnMuZmlsdGVySXRlbXMgOiBbXTtcbiAgICAgIHRoaXMubG9hZEZpbHRlckNvbXBvbmVudChkaXYsIGZpbHRlckRpdiwgZmlsdGVySXRlbXMsIGNvbnRleHRfZmlsdGVyKTtcbiAgICAgIHJvd0Rpdi5hcHBlbmRDaGlsZChmaWx0ZXJEaXYpO1xuXG4gICAgICBpZiAoZGl2LndpZGdldE5vZGUubGVuZ3RoICE9IDApIHtcbiAgICAgICAgbGV0IG1haW5JdGVtRGl2ID0gcm93RGl2LnF1ZXJ5U2VsZWN0b3IoJy5mbGV4LmZsZXgtd3JhcCcpO1xuXG5cblxuICAgICAgICAvLyBJZiBjb250ZXh0IGlzIHRydWUgYW5kIG1haW5JdGVtRGl2IGV4aXN0cywgY2xlYXIgaXRzIGNvbnRlbnRzXG4gICAgICAgIGlmIChjb250ZXh0ICYmIG1haW5JdGVtRGl2KSB7XG4gICAgICAgICAgbWFpbkl0ZW1EaXYuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBDcmVhdGUgbWFpbkl0ZW1EaXYgaWYgaXQgZG9lc24ndCBleGlzdFxuICAgICAgICAgIG1haW5JdGVtRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgbWFpbkl0ZW1EaXYuY2xhc3NMaXN0LmFkZChcImZsZXhcIiwgXCJmbGV4LXdyYXBcIik7XG4gICAgICAgICAgcm93RGl2LmFwcGVuZENoaWxkKG1haW5JdGVtRGl2KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZFdpZGdldE5vZGVzKGRpdiwgbWFpbkl0ZW1EaXYsIGRhdGFzZXRCeUlkKTtcbiAgICAgIH1cblxuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHJvd0Rpdik7XG4gICAgfSk7XG4gIH1cbiAgbG9hZFdpZGdldE5vZGVzKGRpdjogYW55LCBtYWluSXRlbURpdjogYW55LCBkYXRhc2V0QnlJZDogYW55KSB7XG4gICAgdGhpcy5tYWluUGFnZURpdkVsZW1lbnQgPSBtYWluSXRlbURpdjtcbiAgICBkaXYud2lkZ2V0Tm9kZS5mb3JFYWNoKGl0ZW0gPT4ge1xuXG4gICAgICB0aGlzLmxvYWRTaW5nbGVXaWRnZXROb2RlKGl0ZW0sIG1haW5JdGVtRGl2LCBkYXRhc2V0QnlJZCk7XG4gICAgfSk7XG4gIH1cblxuXG4gIGxvYWRTaW5nbGVXaWRnZXROb2RlKGl0ZW06IGFueSwgY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQsIGRhdGFzZXRCeUlkOiBhbnkpIHtcbiAgICBjb25zdCBlbGVtZW50SWQgPSBgaWQtJHtpdGVtLmlkfWA7XG4gICAgY29uc3QgZXhpc3RpbmdFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7ZWxlbWVudElkfWApO1xuICAgIGlmIChpdGVtLm5vZGVQcm9wZXJ0aWVzLmRpc3BsYXkgJiYgIWV4aXN0aW5nRWxlbWVudCkge1xuICAgICAgY29uc3Qgd19oZWlnaHQgPSBpdGVtLm5vZGVQcm9wZXJ0aWVzLmhlaWdodCA9PT0gXCJcIiA/IFwiaC1hdXRvXCIgOiBgaC1bJHtpdGVtLm5vZGVQcm9wZXJ0aWVzLmhlaWdodH1dYDtcbiAgICAgIGNvbnN0IGl0ZW1EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGl0ZW1EaXYuaWQgPSBlbGVtZW50SWQ7XG4gICAgICBpdGVtRGl2LmNsYXNzTGlzdC5hZGQoaXRlbS5ub2RlUHJvcGVydGllcy53aWR0aCwgd19oZWlnaHQsICdtYi0yJyk7XG4gICAgICBjb25zdCB3aWRnZXREaXYgPSB0aGlzLmdldFdpZGdldFRpdGxlRGl2KGl0ZW0pO1xuICAgICAgaXRlbURpdi5hcHBlbmRDaGlsZCh3aWRnZXREaXYpO1xuICAgICAgY29uc3QgaW5uZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGlubmVyRGl2LmNsYXNzTGlzdC5hZGQoJ3JvdW5kZWQnLCAnanVzdGlmeS1jZW50ZXInLCAnaXRlbXMtY2VudGVyJywgJ2JvcmRlcicsICdwLTEnLCAnbS0xJywgJ2ZsZXgnLCAnZmxleC1yb3cnKTtcbiAgICAgIGl0ZW0uY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIGVsZW1lbnQua3BpQ29uZmlnWydkYXRhU291cmNlJ10gPSBkYXRhc2V0QnlJZFtlbGVtZW50LmRhdGFzZXRJZF07XG4gICAgICAgIGVsZW1lbnQua3BpQ29uZmlnWydjb250ZXh0TWVudSddID0gdGhpcy5jb250ZXh0TWVudURhdGFTb3VyY2U7XG4gICAgICAgIGVsZW1lbnRbJ3RpdGxlUGFyYW1zJ10gPSBpdGVtLm5vZGVQcm9wZXJ0aWVzLndpZGdldFBhcmFtcyB8fCBcIlwiO1xuICAgICAgICBjb25zdCBjb21wX29iamVjdCA9IHRoaXMuZmluZFdpZGdldEJ5SWQodGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cywgaXRlbS5pZCk7XG4gICAgICAgIHRoaXMubG9hZER5bmFtaWNDb21wb25lbnQoZWxlbWVudCwgY29tcF9vYmplY3QsIGl0ZW1EaXYpO1xuICAgICAgfSk7XG4gICAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKGl0ZW1EaXYpO1xuICAgICAgaWYgKCF0aGlzLmlzRGFzaEJvYXJkQ29udGVudFR5cGVWaWV3KSB7XG4gICAgICAgIGl0ZW1EaXYuYXBwZW5kQ2hpbGQoaW5uZXJEaXYpO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIGlmIChleGlzdGluZ0VsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGl0ZW1EaXYgPSBleGlzdGluZ0VsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpdGVtRGl2LmlubmVySFRNTCA9ICcnO1xuICAgICAgY29uc3Qgd2lkZ2V0RGl2ID0gdGhpcy5nZXRXaWRnZXRUaXRsZURpdihpdGVtKTtcbiAgICAgIGl0ZW1EaXYuYXBwZW5kQ2hpbGQod2lkZ2V0RGl2KTtcbiAgICAgIGl0ZW0uY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIGVsZW1lbnQua3BpQ29uZmlnWydkYXRhU291cmNlJ10gPSBkYXRhc2V0QnlJZFtlbGVtZW50LmRhdGFzZXRJZF07XG4gICAgICAgIGVsZW1lbnQua3BpQ29uZmlnWydjb250ZXh0TWVudSddID0gdGhpcy5jb250ZXh0TWVudURhdGFTb3VyY2U7XG4gICAgICAgIGVsZW1lbnRbJ3RpdGxlUGFyYW1zJ10gPSBpdGVtLm5vZGVQcm9wZXJ0aWVzLndpZGdldFBhcmFtcyB8fCBcIlwiO1xuICAgICAgICBjb25zdCBjb21wX29iamVjdCA9IHRoaXMuZmluZFdpZGdldEJ5SWQodGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cywgaXRlbS5pZCk7XG4gICAgICAgIHRoaXMubG9hZER5bmFtaWNDb21wb25lbnQoZWxlbWVudCwgY29tcF9vYmplY3QsIGl0ZW1EaXYpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICghdGhpcy5pc0Rhc2hCb2FyZENvbnRlbnRUeXBlVmlldykge1xuICAgICAgICBjb25zdCBpbm5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBpbm5lckRpdi5jbGFzc0xpc3QuYWRkKCdyb3VuZGVkJywgJ2p1c3RpZnktY2VudGVyJywgJ2l0ZW1zLWNlbnRlcicsICdib3JkZXInLCAncC0xJywgJ20tMScsICdmbGV4JywgJ2ZsZXgtcm93Jyk7XG4gICAgICAgIGl0ZW1EaXYuYXBwZW5kQ2hpbGQoaW5uZXJEaXYpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldFdpZGdldFRpdGxlRGl2KGl0ZW0pIHtcblxuICAgIGNvbnN0IHdpZGdldERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHdpZGdldERpdi5jbGFzc0xpc3QuYWRkKFxuICAgICAgJ2ZsZXgnLCAnaXRlbXMtY2VudGVyJywgJ2p1c3RpZnktYmV0d2VlbicsICdmb250LWJvbGQnLCAndGV4dC1tZCcsXG4gICAgICAndGV4dC1ncmF5LTkwMCcsICdkYXJrOnRleHQtd2hpdGUnLCAnYm9yZGVyLWInLCAncC0zJywgJ2JnLWdyYXktODAwJyxcbiAgICAgICdteC0yJywgJ3JvdW5kZWQtdC1sZycsICdyZWxhdGl2ZSdcbiAgICApO1xuXG4gICAgY29uc3QgdGl0bGVEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aXRsZURpdi5jbGFzc0xpc3QuYWRkKCdyZWxhdGl2ZScsICdncm91cCcpO1xuXG4gICAgbGV0IHBhcmFtcyA9IFwiXCI7XG4gICAgaWYgKCFpdGVtLm5vZGVQcm9wZXJ0aWVzLndpZGdldFBhcmFtcyAmJiB0aGlzLmRlZmF1bHRWaWV3SWRzT25QYWdlUmVmcmVzaD8ubGVuZ3RoKSB7XG4gICAgICBwYXJhbXMgPSB0aGlzLmdldFRpdGxlUGFyYW1zKGl0ZW0pIHx8IFwiXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmFtcyA9IGl0ZW0ubm9kZVByb3BlcnRpZXMud2lkZ2V0UGFyYW1zIHx8IFwiXCI7XG4gICAgfVxuXG4gICAgY29uc3Qgd2lkZ2V0VGl0bGUgPSBpdGVtLm5vZGVQcm9wZXJ0aWVzLndpZGdldFRpdGxlO1xuICAgIGNvbnN0IHRvb2x0aXBNYXRjaCA9IHdpZGdldFRpdGxlLm1hdGNoKC9cXCR0XFx7KFtcXHNcXFNdKj8pXFx9Lyk7XG5cbiAgICBjb25zdCBkaXNwbGF5VGl0bGUgPSB3aWRnZXRUaXRsZS5yZXBsYWNlKC9cXCR0XFx7W1xcc1xcU10qP1xcfS9nLCAnJykudHJpbSgpO1xuXG4gICAgdGl0bGVEaXYuaW5uZXJUZXh0ID0gZGlzcGxheVRpdGxlICsgcGFyYW1zO1xuXG4gICAgaWYgKHRvb2x0aXBNYXRjaCkge1xuICAgICAgY29uc3QgdG9vbHRpcENvbnRlbnQgPSB0b29sdGlwTWF0Y2hbMV0udHJpbSgpO1xuICAgICAgY29uc3QgdG9vbHRpcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgdG9vbHRpcERpdi5jbGFzc0xpc3QuYWRkKFxuICAgICAgICAnYWJzb2x1dGUnLCAnbGVmdC0wJywgJ2JvdHRvbS1mdWxsJywgJ21iLTInLCAndy1tYXgnLCAnbWF4LXcteHMnLFxuICAgICAgICAnYmctYmxhY2snLCAndGV4dC13aGl0ZScsICd0ZXh0LXNtJywgJ3AtMicsICdyb3VuZGVkLWxnJywgJ3NoYWRvdy1sZycsXG4gICAgICAgICdvcGFjaXR5LTAnLCAnZ3JvdXAtaG92ZXI6b3BhY2l0eS0xMDAnLCAndHJhbnNpdGlvbi1vcGFjaXR5JywgJ2R1cmF0aW9uLTMwMCcsXG4gICAgICAgICd6LTUwJ1xuICAgICAgKTtcbiAgICAgIHRvb2x0aXBEaXYuaW5uZXJIVE1MID0gdG9vbHRpcENvbnRlbnQ7XG5cbiAgICAgIHRpdGxlRGl2LmFwcGVuZENoaWxkKHRvb2x0aXBEaXYpO1xuICAgIH1cblxuICAgIHdpZGdldERpdi5hcHBlbmRDaGlsZCh0aXRsZURpdik7XG5cblxuICAgIGNvbnN0IHNlYXJjaENvbnRhaW5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHNlYXJjaENvbnRhaW5lckRpdi5jbGFzc0xpc3QuYWRkKCdmbGV4JywgJ2l0ZW1zLWNlbnRlcicsICdtbC1hdXRvJywgJ3NwYWNlLXgtMicsICdqdXN0aWZ5LWVuZCcpOyAvLyBtbC1hdXRvIHB1c2hlcyBjb250ZW50IHRvIHRoZSByaWdodCBzaWRlXG5cbiAgICAvLyBDaGVjayBmb3Igd2lkZ2V0IGZpbHRlclxuICAgIGlmIChpdGVtLm5vZGVQcm9wZXJ0aWVzLmlzV2lkZ2V0RmlsdGVyKSB7XG4gICAgICBjb25zdCBzZWFyY2hCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgIHNlYXJjaEJ1dHRvbi5pbm5lclRleHQgPSAnRmlsdGVyJztcbiAgICAgIHNlYXJjaEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdweC0zJywgJ3B5LTEuNScsICdiZy1ibHVlLTYwMCcsICdtci0yJywgJ3RleHQtd2hpdGUnLCAncm91bmRlZCcsICdob3ZlcjpiZy1ibHVlLTcwMCcpO1xuICAgICAgdGhpcy5ub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2UgPSB7fTtcbiAgICAgIHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlWyd2aWV3Q29uZmlnJ10gPSBpdGVtO1xuICAgICAgdGhpcy5ub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2VbJ2hhdmluZ0NvbmZpZyddID0gW107XG5cbiAgICAgIHNlYXJjaEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgdGhpcy5pc1dpZGdldEZpbHRlcnMgPSB0cnVlO1xuICAgICAgICBsZXQgZmlsdGVQcm9wZXJ0aWNlID0gW107XG4gICAgICAgIGl0ZW0uY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgbGV0IGtleV9uYW1lID0gdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0W2VsZW1lbnQuZGF0YXNldElkXVswXTtcbiAgICAgICAgICBPYmplY3Qua2V5cyhrZXlfbmFtZSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKCFmaWx0ZVByb3BlcnRpY2UuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICBmaWx0ZVByb3BlcnRpY2UucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgZmlsdGVQcm9wZXJ0aWNlLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgICAgIGNvbHVtbk5hbWU6IGVsZW1lbnQsXG4gICAgICAgICAgICBkYXRhVHlwZTogXCJmbG9hdFwiLFxuICAgICAgICAgICAgb3BlcmF0b3I6IFwiXCIsXG4gICAgICAgICAgICB2YWx1ZTogXCJcIixcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5ub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2UuaGF2aW5nQ29uZmlnLnB1c2gob2JqKVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgc2VhcmNoQ29udGFpbmVyRGl2LmFwcGVuZENoaWxkKHNlYXJjaEJ1dHRvbilcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgaXRlbSBmaWx0ZXJJZFxuICAgIGlmIChpdGVtLmZpbHRlcklkKSB7XG4gICAgICB0aGlzLm5vZGVwcm9wZXJ0aWNlRmlsdGVyRGF0YVNvdXJjZSA9IHt9O1xuICAgICAgdGhpcy5ub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2VbJ3ZpZXdDb25maWcnXSA9IGl0ZW07XG4gICAgICB0aGlzLm5vZGVwcm9wZXJ0aWNlRmlsdGVyRGF0YVNvdXJjZVsnaGF2aW5nQ29uZmlnJ10gPSBbXTtcblxuICAgICAgdGhpcy5zZXJ2aWNlLmdldEFwcEZpbHRlckNvbmZpZyhpdGVtLmZpbHRlcklkKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgdGhpcy5sb2FkV2lkZ2V0RmlsdGVyQ29tcG9uZW50KGl0ZW0sIHdpZGdldERpdiwgZGF0YS5maWx0ZXJJdGVtcywgaXRlbSk7XG4gICAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcblxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3Igbm9kZSBmaWx0ZXJzXG4gICAgaWYgKGl0ZW0ubm9kZVByb3BlcnRpZXMubm9kZWZpbHRlcnMgJiYgaXRlbS5ub2RlUHJvcGVydGllcy5ub2RlZmlsdGVycy5sZW5ndGggIT09IDApIHtcbiAgICAgIGl0ZW0ubm9kZVByb3BlcnRpZXMubm9kZWZpbHRlcnMuZm9yRWFjaChmaWx0ZXIgPT4ge1xuICAgICAgICBjb25zdCBmaWx0ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZmlsdGVyRGl2LmNsYXNzTGlzdC5hZGQoJ2ZsZXgnLCAnaXRlbXMtY2VudGVyJyk7XG5cbiAgICAgICAgaWYgKGZpbHRlci5pbnB1dF90eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICBjb25zdCB0ZXh0Qm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgICAgICB0ZXh0Qm94LnR5cGUgPSAndGV4dCc7XG4gICAgICAgICAgdGV4dEJveC5wbGFjZWhvbGRlciA9IGBFbnRlciAke2ZpbHRlci5sb2NhbF9jb2x1bW59YDtcbiAgICAgICAgICB0ZXh0Qm94LmNsYXNzTGlzdC5hZGQoJ3B4LTInLCAncHktMS41JywgJ3JvdW5kZWQnLCAnYm9yZGVyJywgJ21yLTEnLCAnYm9yZGVyLWdyYXktNTAwJywgJ3RleHQtZ3JheS05MDAnLCAnZGFyazpiZy1ncmF5LTcwMCcsICdkYXJrOnRleHQtd2hpdGUnKTtcblxuICAgICAgICAgIGNvbnN0IHNlYXJjaEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgICAgIHNlYXJjaEJ1dHRvbi5pbm5lclRleHQgPSAnU2VhcmNoJztcbiAgICAgICAgICBzZWFyY2hCdXR0b24uY2xhc3NMaXN0LmFkZCgncHgtMycsICdweS0xLjUnLCAnYmctYmx1ZS02MDAnLCAnbXItMicsICd0ZXh0LXdoaXRlJywgJ3JvdW5kZWQnLCAnaG92ZXI6YmctYmx1ZS03MDAnKTtcblxuICAgICAgICAgIGNvbnN0IHNlcGFyZXJvdEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIHNlcGFyZXJvdEJ1dHRvbi5pbm5lckhUTUwgPSAnfCc7XG5cbiAgICAgICAgICBzZWFyY2hCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZWFyY2hUZXJtID0gdGV4dEJveC52YWx1ZTtcbiAgICAgICAgICAgIHRoaXMuZ2V0UmVhcmNoUmVzdWx0RnJvbUlucHV0Qm94KHNlYXJjaFRlcm0sIGl0ZW0sIGZpbHRlcik7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBmaWx0ZXJEaXYuYXBwZW5kQ2hpbGQodGV4dEJveCk7XG4gICAgICAgICAgZmlsdGVyRGl2LmFwcGVuZENoaWxkKHNlYXJjaEJ1dHRvbik7XG4gICAgICAgICAgZmlsdGVyRGl2LmFwcGVuZENoaWxkKHNlcGFyZXJvdEJ1dHRvbik7XG4gICAgICAgIH1cblxuICAgICAgICBzZWFyY2hDb250YWluZXJEaXYuYXBwZW5kQ2hpbGQoZmlsdGVyRGl2KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHdpZGdldERpdi5hcHBlbmRDaGlsZChzZWFyY2hDb250YWluZXJEaXYpO1xuICAgIHJldHVybiB3aWRnZXREaXY7XG4gIH1cblxuXG5cbiAgbG9hZER5bmFtaWNDb21wb25lbnQoZGF0YSwgaW5kZXhPYmosIGNvbnRhaW5lckVsZW1lbnQpOiBhbnkge1xuICAgIGNvbnN0IGNvbXBvbmVudENsYXNzID0gdGhpcy5jb21wb25lbnRDbGFzc01hcFtkYXRhLmtwaUNvbmZpZy5jb21wb25lbnROYW1lXTtcbiAgICB0aGlzLkNvbXBSZWZzID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRDbGFzcyk7XG4gICAgY29uc3QgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlID0gdGhpcy5Db21wUmVmcy5pbnN0YW5jZTtcblxuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5jaGFydERhdGFTb3VyY2UgPSBkYXRhO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5rcGlfbmFtZSA9IFwiXCI7XG4gICAgaWYgKGRhdGEua3BpQ29uZmlnLmNvbXBvbmVudE5hbWUgPT0gXCJHYW1tYUFkdmFuY2VPcGVyYXRvclRhYmxlQ29tcG9uZW50XCIgfHwgZGF0YS5rcGlDb25maWcuY29tcG9uZW50TmFtZSA9PSBcIkdhbW1hVGFibGVXaXRoUGVyY2VudGFnZUNvbXBvbmVudFwiKSB7XG4gICAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2Uub1Jvd0NsaWNrLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLmdldFJvd0NsaWNrKHZhbHVlKTtcbiAgICAgIH0pO1xuICAgICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLm9ucmlnaHRDbGlja0NvbnRleHRTZWxlY3Rpb24uc3Vic2NyaWJlKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMuZ2V0Q29udGV4dENsaWNrKHZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZGF0YS5rcGlDb25maWcuY29tcG9uZW50TmFtZSA9PSBcIkdhbW1hQWR2YW5jZUNoYXJ0Q29tcG9uZW50XCIpIHtcblxuICAgICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLm9uQ2hhcnRQb2ludENsaWNrLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xuXG4gICAgICAgIHRoaXMuZ2V0Um93Q2xpY2sodmFsdWUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGluZGV4T2JqLmNvbXBDb25maWcuZHluYW1pY0NvbXBvbmVudFJlZnMucHVzaCh0aGlzLkNvbXBSZWZzKTtcbiAgICBjb25zdCBjc3NDbGFzcyA9IFwidy1mdWxsXCI7XG4gICAgdGhpcy5Db21wUmVmcy5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoY3NzQ2xhc3MpO1xuICAgIGNvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5Db21wUmVmcy5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KTtcbiAgfVxuXG4gIGxvYWRGaWx0ZXJDb21wb25lbnQoaW5kZXhPYmosIGNvbnRhaW5lckVsZW1lbnQsIGZpbHRlckl0ZW1zLCBjb250ZXh0X2ZpbHRlcikge1xuICAgIGxldCB1c2VyTmFtZSA9IHRoaXMuc3RvcmFnZS5nZXQoJ3VzZXJfbmFtZScpXG4gICAgbGV0IHNlbGVjdGVkRGF0ZXMgPSB7IHN0YXJ0RGF0ZTogdGhpcy5kZWZhdWx0U3RhcnREYXRlLCBlbmREYXRlOiB0aGlzLmRlZmF1bHRFbmREYXRlIH1cbiAgICBjb25zdCBjb21wb25lbnRDbGFzcyA9IHRoaXMuY29tcG9uZW50Q2xhc3NNYXBbJ0FwcEFkdmFuY2VIZWFkZXJDb21wb25lbnQnXTtcbiAgICB0aGlzLkNvbXBSZWZzID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRDbGFzcyk7XG4gICAgY29uc3QgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlID0gdGhpcy5Db21wUmVmcy5pbnN0YW5jZTtcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2Uuc2VsZWN0ZWREYXRlcyA9IHNlbGVjdGVkRGF0ZXM7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmZpbHRlckl0ZW1zID0gZmlsdGVySXRlbXM7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmNvbnRleHRGaWx0ZXJJdGVtcyA9IGNvbnRleHRfZmlsdGVyO1xuXG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLnBhZ2VUaXRsZSA9IHRoaXMucGFnZVRpdGxlO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5icmVhZF9jcnVtYnNfY29udGFpbmVyID0gdGhpcy5rcGlfYnJlYWRjcnVtYnNfY29udGFpbmVyO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5pc0VkaXRCdXR0b24gPSAodXNlck5hbWUgJiYgdXNlck5hbWUgPT0gXCJhZG1pblwiKSA/IHRydWUgOiBmYWxzZTtcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UuaXNBZHZhbmNlQnV0dG9uID0gdHJ1ZTtcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UuZ2V0RmlsdGVyUGFnZUNvbmZpZy5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMuZ2V0RmlsdGVyc0ZvclRlbXBsYXRlKHZhbHVlKTtcbiAgICB9KTtcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UuZ2V0T3BlcmF0b3JOYW1lLnN1YnNjcmliZSgodmFsdWU6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5sb2FkRGF0YUJ5T3BlcmF0b3IodmFsdWUpO1xuICAgIH0pO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5nZXRDb250ZXh0RmlsdGVyRGF0YS5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMuZ2V0Q29udGV4dEZpbHRlckRhdGEodmFsdWUpO1xuICAgIH0pO1xuXG4gICAgaW5kZXhPYmouY29tcENvbmZpZy5keW5hbWljQ29tcG9uZW50UmVmcy5wdXNoKHRoaXMuQ29tcFJlZnMpO1xuICAgIGNvbnN0IGNzc0NsYXNzID0gXCJ3LWZ1bGxcIjtcbiAgICB0aGlzLkNvbXBSZWZzLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZChjc3NDbGFzcyk7XG4gICAgY29udGFpbmVyRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLkNvbXBSZWZzLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG4gIGxvYWRXaWRnZXRGaWx0ZXJDb21wb25lbnQoaW5kZXhPYmosIGNvbnRhaW5lckVsZW1lbnQsIGZpbHRlckl0ZW1zLCB2aWV3SWRzKSB7XG4gICAgbGV0IHNlbGVjdGVkRGF0ZXMgPSB7IHN0YXJ0RGF0ZTogdGhpcy5kZWZhdWx0U3RhcnREYXRlLCBlbmREYXRlOiB0aGlzLmRlZmF1bHRFbmREYXRlIH1cbiAgICBjb25zdCBjb21wb25lbnRDbGFzcyA9IHRoaXMuY29tcG9uZW50Q2xhc3NNYXBbJ0FkdmFuY2VXaWRnZXRIZWFkZXJGaWx0ZXJDb21wb25lbnQnXTtcbiAgICB0aGlzLkNvbXBSZWZzID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRDbGFzcyk7XG4gICAgY29uc3QgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlID0gdGhpcy5Db21wUmVmcy5pbnN0YW5jZTtcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2Uuc2VsZWN0ZWREYXRlcyA9IHNlbGVjdGVkRGF0ZXM7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmZpbHRlckl0ZW1zID0gZmlsdGVySXRlbXM7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLnZpZXdJZHMgPSB2aWV3SWRzO1xuXG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmdldFdpZGdldEZpbHRlckNvbmZpZy5zdWJzY3JpYmUoKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMuZ2V0V2lkZ2V0RmlsdGVyRm9yVGVtcGxhdGUodmFsdWUpO1xuICAgIH0pO1xuXG4gICAgaW5kZXhPYmouY29tcENvbmZpZy5keW5hbWljQ29tcG9uZW50UmVmcy5wdXNoKHRoaXMuQ29tcFJlZnMpO1xuICAgIGNvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5Db21wUmVmcy5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KTtcbiAgfVxuXG4gIC8vIGZvciBjb250ZXh0IG1lbnUgZnVuY3Rpb25cbiAgZ2V0Q29udGV4dENsaWNrKGV2ZW50KSB7XG4gICAgY29uc3Qgc3RhdGVEYXRhID0gQXJyYXkuZnJvbSh0aGlzLnN0YXRlRGF0YVNvdXJjZS5rZXlzKCkpO1xuICAgIGNvbnN0IGN1cnJlbnRWaWV3SW5kZXggPSBzdGF0ZURhdGEuaW5kZXhPZihldmVudC52aWV3SWQpO1xuICAgIGNvbnN0IGRlbGV0ZWRWaWV3SWRzID0gW107XG4gICAgZm9yIChsZXQgaSA9IGN1cnJlbnRWaWV3SW5kZXggKyAxOyBpIDwgc3RhdGVEYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkZWxldGVkVmlld0lkcy5wdXNoKHN0YXRlRGF0YVtpXSlcbiAgICB9XG4gICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGVsZW1lbnQud2lkZ2V0Tm9kZS5mb3JFYWNoKChub2RlOiBhbnksIG5vZGVJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmdldEVsZW1lbnRPZkN1cnJlbnRWaWV3KG5vZGUsIGV2ZW50LmRyaWxsZG93blRvKSkge1xuICAgICAgICAgIGxldCB2aWV3ID0gZWxlbWVudC53aWRnZXROb2RlW25vZGVJbmRleF07XG4gICAgICAgICAgbGV0IGFwaUNhbGxzID0gW107XG4gICAgICAgICAgbGV0IGNoYXRBcGlDYWxsID0gW107XG5cbiAgICAgICAgICBsZXQgYXBwbGllZEZpbHRlcnMgPSB0aGlzLmdldFNldE9wZXJhdG9yRmlsdGVyKGV2ZW50LCB0aGlzLnN0YXRlRGF0YVNvdXJjZS5nZXQoZXZlbnQuZHJpbGxkb3duRnJvbSkpO1xuICAgICAgICAgIHZpZXcuY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2goY29udGVudFZpZXcgPT4ge1xuICAgICAgICAgICAgbGV0IGZvdW5kID0gKHRoaXMuZGF0YVNldE1vZGFsIGFzIGFueVtdKS5maW5kKGQgPT4gZC5kYXRhc2V0SWQgPT09IGNvbnRlbnRWaWV3LmRhdGFzZXRJZCk7XG4gICAgICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICAgICAgYXBpQ2FsbHMucHVzaCh0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YVNldChmb3VuZCwgY29udGVudFZpZXcuZGF0YXNldElkLCBhcHBsaWVkRmlsdGVycykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIFByb21pc2UuYWxsKGFwaUNhbGxzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCA9IHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0VW5pcXVlRGF0YVNldE9iamVjdCgpO1xuICAgICAgICAgICAgZm9yIChsZXQgZW50cnkgb2YgZGVsZXRlZFZpZXdJZHMpIHtcbiAgICAgICAgICAgICAgZWxlbWVudC53aWRnZXROb2RlLmZvckVhY2godmlld1ZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICB2aWV3VmFsdWUuY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2godmlld0lkID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmICh2aWV3SWQudmlld0lkID09IGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuY29udGV4dE1lbnVEYXRhU291cmNlLnNvbWUoaXRlbSA9PiBpdGVtLnZpZXdJZCA9PT0gdmlld0lkLnZpZXdJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gSWYgbm90IGV4aXN0cywgcHVzaCB0aGUgbmV3IG9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dE1lbnVEYXRhU291cmNlLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlld0lkOiB2aWV3SWQudmlld0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld05hbWU6IG5vZGUubm9kZVByb3BlcnRpZXMud2lkZ2V0VGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5S2V5OiB2aWV3SWQua3BpQ29uZmlnLmtleVRvUGFzc1xuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0YSA9IHRoaXMuc3RhdGVEYXRhU291cmNlLmdldChlbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydERhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlRGF0YVNvdXJjZS5kZWxldGUoZW50cnkpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmlld1ZhbHVlLm5vZGVQcm9wZXJ0aWVzWydkaXNwbGF5J10gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJlZml4ZWRJZCA9IGBpZC0ke3ZpZXdWYWx1ZS5pZH1gO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50VG9IaWRlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7cHJlZml4ZWRJZH1gKSBhcyBIVE1MRWxlbWVudDsgLy8gQ2FzdCB0byBIVE1MRWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFRvSGlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0hpZGUucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY29udGV4dE1lbnVEYXRhU291cmNlID0gdGhpcy5jb250ZXh0TWVudURhdGFTb3VyY2UuZmlsdGVyKGUgPT4gZS5kaXNwbGF5S2V5ICE9PSBldmVudC5rZXlUb1Bhc3MpO1xuICAgICAgICAgICAgdmlldy5jb21wQ29uZmlnLnZpZXdDb25maWcuZm9yRWFjaCh2YWwgPT4ge1xuICAgICAgICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgICAgIFwiZmlsdGVyc1wiOiBhcHBsaWVkRmlsdGVycyxcbiAgICAgICAgICAgICAgICBcImtleVRvUGFzc1wiOiB0aGlzLnVwZGF0ZU9wZXJhdG9yRGF0YShldmVudC5rZXlUb1Bhc3MsIGV2ZW50LmRhdGEpLFxuICAgICAgICAgICAgICAgIFwiZHJpbGxEb3duVHlwZVwiOiBldmVudC5kcmlsbERvd25UeXBlLFxuICAgICAgICAgICAgICAgIFwiZHJpbGxkb3duRnJvbVwiOiBldmVudC5kcmlsbGRvd25Gcm9tXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZURhdGFTb3VyY2Uuc2V0KHZhbFsndmlld0lkJ10sIG9iailcblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2aWV3Lm5vZGVQcm9wZXJ0aWVzWydkaXNwbGF5J10gPSB0cnVlO1xuICAgICAgICAgICAgdmlldy5ub2RlUHJvcGVydGllc1snd2lkZ2V0UGFyYW1zJ10gPSBldmVudC50YWJsZVRpdGxlO1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ZWRJZCA9IGBpZC0ke3ZpZXcuaWR9YDtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtwcmVmaXhlZElkfWApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgdGhpcy5sb2FkU2luZ2xlV2lkZ2V0Tm9kZSh2aWV3LCB0aGlzLm1haW5QYWdlRGl2RWxlbWVudCwgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0KTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKHRoaXMubWFpblBhZ2VEaXZFbGVtZW50KTtcbiAgICAgICAgICAgIH0sIDIwMCk7XG5cblxuICAgICAgICAgICAgbGV0IG5hdmlnYXRpb246IE5hdmlnYXRpb25FeHRyYXMgPSB7XG4gICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiBhcHBsaWVkRmlsdGVyc1snb3BlcmF0aW9uRmlsdGVyJ10sXG4gICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6IFwibWVyZ2VcIlxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCBuYXZpZ2F0aW9uKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIG5vZGUubm9kZVByb3BlcnRpZXNbJ2Rpc3BsYXknXSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICAvLyBmb3Igcm93IGNsaWNrIGZ1bmN0aW9uXG4gIGFzeW5jIGdldFJvd0NsaWNrKGV2ZW50KSB7XG5cbiAgICBjb25zdCBzdGF0ZURhdGEgPSBBcnJheS5mcm9tKHRoaXMuc3RhdGVEYXRhU291cmNlLmtleXMoKSk7XG4gICAgY29uc3QgY3VycmVudFZpZXdJbmRleCA9IHN0YXRlRGF0YS5pbmRleE9mKGV2ZW50LnZpZXdJZCk7XG4gICAgY29uc3QgZGVsZXRlZFZpZXdJZHMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSBjdXJyZW50Vmlld0luZGV4ICsgMTsgaSA8IHN0YXRlRGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gaWYgKCF0aGlzLmRlZmF1bHRWaWV3SWRzLmluY2x1ZGVzKHN0YXRlRGF0YVtpXSkpIHtcbiAgICAgIGRlbGV0ZWRWaWV3SWRzLnB1c2goc3RhdGVEYXRhW2ldKTtcbiAgICAgIC8vIH1cbiAgICB9XG4gICAgY29uc3QgaG91cmx5Tm9kZSA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNcbiAgICAgIC5tYXAod2lkZ2V0ID0+IHdpZGdldC53aWRnZXROb2RlLmZpbmQobm9kZSA9PiB0aGlzLmdldEhvdXJseURhdGEobm9kZSkpKVxuICAgICAgLmZpbmQobm9kZSA9PiBub2RlKTtcblxuICAgIGlmIChob3VybHlOb2RlICYmIGV2ZW50LmtleVRvUGFzcy5pbmNsdWRlcyhcInJlY29yZERhdGVcIikpIHtcbiAgICAgIHRoaXMuZ2V0Vmlld0J5Um93Q0xpY2tGb3JIb3VybHlDaGFydChldmVudCwgaG91cmx5Tm9kZSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFZpZXdOb2RlID0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1xuICAgICAgLm1hcCh3aWRnZXQgPT4gd2lkZ2V0LndpZGdldE5vZGUuZmluZChub2RlID0+IHRoaXMuZ2V0RWxlbWVudE9mQ3VycmVudFZpZXcobm9kZSwgZXZlbnQudmlld0lkKSkpXG4gICAgICAuZmluZChub2RlID0+IG5vZGUpO1xuXG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1NYXA7XG4gICAgaWYgKGN1cnJlbnRWaWV3Tm9kZSkge1xuICAgICAgY29uc3QgZHJpbGRvd25zRm9yQ3VycmVudFZpZXcgPSBbXTtcbiAgICAgIGNvbnN0IGRyaWxkb3duc0ZvckN1cnJlbnRQYWdlID0gW107XG4gICAgICBjdXJyZW50Vmlld05vZGUuY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2goYXN5bmMgZWxlbWVudCA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50LmtwaUNvbmZpZy52aWV3UHJvcGVydGllcy5lbmFibGVDbGlja0V2ZW50KSB7XG4gICAgICAgICAgaWYgKGVsZW1lbnQua3BpQ29uZmlnLnZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zPy5ldmVudFR5cGUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgZWxlbWVudC5rcGlDb25maWcudmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuZXZlbnRUeXBlICE9PSBcIlwiKSB7XG4gICAgICAgICAgICBsZXQgZXZlbnRUeXBlID0gZWxlbWVudC5rcGlDb25maWcudmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuZXZlbnRUeXBlO1xuICAgICAgICAgICAgbGV0IGFzc29jaWF0ZWRWaWV3cyA9IGVsZW1lbnQua3BpQ29uZmlnLnZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmFzc29jaWF0ZWRWaWV3cztcbiAgICAgICAgICAgIGxldCBhc3NvY2lhdGVkUGFnZSA9IChlbGVtZW50LmtwaUNvbmZpZy52aWV3UHJvcGVydGllcy5jbGlja0V2ZW50T3B0aW9ucy5hc3NvY2lhdGVkUGFnZSkgPyBlbGVtZW50LmtwaUNvbmZpZy52aWV3UHJvcGVydGllcy5jbGlja0V2ZW50T3B0aW9ucy5hc3NvY2lhdGVkUGFnZSA6IFwiXCI7XG5cbiAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gJ29wdGlvbmFsRHJpbGxEb3duJykge1xuICAgICAgICAgICAgICBpZiAoYXNzb2NpYXRlZFZpZXdzICYmIGFzc29jaWF0ZWRWaWV3cy5sZW5ndGggIT0gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHZpZXdGb3JEcmlsbERvd24gb2YgYXNzb2NpYXRlZFZpZXdzKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJDb25kaXRpb24gPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHZpZXdGb3JEcmlsbERvd25bJ2ZpbHRlckNvbmRpdGlvbiddKTtcbiAgICAgICAgICAgICAgICAgIGxldCBtYXRjaEZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgIGZpbHRlckNvbmRpdGlvbi5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeVBhcmFtcy5nZXQoa2V5KSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBtYXRjaEZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoRm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlld0ZvckRyaWxsRG93blsndmlld0lkJ10uZm9yRWFjaCh2aWV3Rm9ySWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGRyaWxkb3duc0ZvckN1cnJlbnRWaWV3LnB1c2godmlld0ZvcklkKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT0gJ2RyaWxsZG93bicgfHwgZXZlbnRUeXBlID09ICdwb3B1cCcpIHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgZW50cnkgb2YgYXNzb2NpYXRlZFZpZXdzKSB7XG4gICAgICAgICAgICAgICAgZHJpbGRvd25zRm9yQ3VycmVudFZpZXcucHVzaChlbnRyeSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09ICduYXZpZ2F0ZVRvUGFnZScpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLmdldEFwcFBhZ2VEZXRhaWxDb25maWcoYXNzb2NpYXRlZFBhZ2UpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgbGV0IHsgcGFnZUlkLCAuLi5wYXJhbXMgfSA9IHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXM7XG5cbiAgICAgICAgICAgICAgICAgIGV2ZW50LmtleVRvUGFzcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXNbZWxlbWVudF0gPSBldmVudC5kYXRhW2VsZW1lbnRdO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBwYXJhbXNbJ3BhZ2VJZCddID0gYXNzb2NpYXRlZFBhZ2U7XG5cbiAgICAgICAgICAgICAgICAgIC8vIGJ1aWxkIHF1ZXJ5IHBhcmFtcyBhcyBhIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgY29uc3QgcXVlcnlTdHJpbmcgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHBhcmFtcykudG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgICAgICAgLy8gY29uc3RydWN0IHRoZSBmdWxsIFVSTCB1c2luZyBBbmd1bGFyIHJvdXRlclxuICAgICAgICAgICAgICAgICAgY29uc3QgZnVsbFVybCA9IHRoaXMucm91dGVyLnNlcmlhbGl6ZVVybChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIuY3JlYXRlVXJsVHJlZShbZGF0YS5wYWdlVXJsXSwgeyBxdWVyeVBhcmFtczogcGFyYW1zIH0pXG4gICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAvLyBvcGVuIGluIG5ldyB0YWJcbiAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKGZ1bGxVcmwsICdfYmxhbmsnKTsgXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhkYXRhKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcblxuXG5cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09ICdzYW1lVmlld0RyaWxsZG93bicpIHtcbiAgICAgICAgICAgICAgZGVidWdnZXJcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBpZiAoZHJpbGRvd25zRm9yQ3VycmVudFZpZXcubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgdmlld0lkRm9yTmV4dCBvZiBkcmlsZG93bnNGb3JDdXJyZW50Vmlldykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRWaWV3Tm9kZSA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNcbiAgICAgICAgICAgICAgICAgIC5tYXAod2lkZ2V0ID0+IHdpZGdldC53aWRnZXROb2RlLmZpbmQobm9kZSA9PiB0aGlzLmdldEVsZW1lbnRPZkN1cnJlbnRWaWV3KG5vZGUsIHZpZXdJZEZvck5leHQpKSlcbiAgICAgICAgICAgICAgICAgIC5maW5kKG5vZGUgPT4gbm9kZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09ICdwb3B1cCcpIHtcbiAgICAgICAgICAgICAgICAgIC8vIHRoaXMuaXNQb3B1cFZpZXcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRNb2RhbFZpZXdCeVJvd0NMaWNrKGV2ZW50LCBuZXh0Vmlld05vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdldFZpZXdCeVJvd0NMaWNrKGV2ZW50LCBuZXh0Vmlld05vZGUpO1xuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiBkZWxldGVkVmlld0lkcykge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQud2lkZ2V0Tm9kZS5mb3JFYWNoKHZpZXdWYWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICB2aWV3VmFsdWUuY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2godmlld0lkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXdJZC52aWV3SWQgPT0gZW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdHMgPSB0aGlzLmNvbnRleHRNZW51RGF0YVNvdXJjZS5zb21lKGl0ZW0gPT4gaXRlbS52aWV3SWQgPT09IHZpZXdJZC52aWV3SWQpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51RGF0YVNvdXJjZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0lkOiB2aWV3SWQudmlld0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3TmFtZTogY3VycmVudFZpZXdOb2RlLm5vZGVQcm9wZXJ0aWVzLndpZGdldFRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5S2V5OiB2aWV3SWQua3BpQ29uZmlnLmtleVRvUGFzc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0YSA9IHRoaXMuc3RhdGVEYXRhU291cmNlLmdldChlbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0RGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZURhdGFTb3VyY2UuZGVsZXRlKGVudHJ5KVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB2aWV3VmFsdWUubm9kZVByb3BlcnRpZXNbJ2Rpc3BsYXknXSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZWZpeGVkSWQgPSBgaWQtJHt2aWV3VmFsdWUuaWR9YDtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50VG9IaWRlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7cHJlZml4ZWRJZH1gKSBhcyBIVE1MRWxlbWVudDsgLy8gQ2FzdCB0byBIVE1MRWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50VG9IaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9IaWRlLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgbmV4dFZpZXdJbmRleCA9IHN0YXRlRGF0YS5pbmRleE9mKGV2ZW50LnZpZXdJZCkgKyAxO1xuICAgICAgICAgICAgY29uc3QgbmV4dFZpZXcgPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzXG4gICAgICAgICAgICAgIC5tYXAod2lkZ2V0ID0+IHdpZGdldC53aWRnZXROb2RlW25leHRWaWV3SW5kZXhdKVxuICAgICAgICAgICAgICAuZmluZChub2RlID0+IG5vZGUpO1xuXG4gICAgICAgICAgICBpZiAobmV4dFZpZXcpIHtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmdldFZpZXdCeVJvd0NMaWNrKGV2ZW50LCBuZXh0Vmlldyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIH0pO1xuXG5cbiAgICAgIC8vIGZvciB2aWV3IGdyb3VwXG5cblxuXG4gICAgfVxuICB9XG5cbiAgZ2V0Vmlld0J5Um93Q0xpY2tGb3JIb3VybHlDaGFydChldmVudCwgbm9kZSkge1xuXG4gICAgbGV0IGFwaUNhbGxzID0gW107XG4gICAgY29uc3QgZGVsZXRlZFZpZXdJZHMgPSBbXTtcbiAgICBub2RlLmNvbXBDb25maWcudmlld0NvbmZpZy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgbGV0IGFwcGxpZWRGaWx0ZXJzID0gdGhpcy5nZXRTZXRPcGVyYXRvckZpbHRlcihldmVudCwgdGhpcy5zdGF0ZURhdGFTb3VyY2UuZ2V0KGl0ZW0udmlld0lkKSk7XG4gICAgICBsZXQgZm91bmQgPSAodGhpcy5kYXRhU2V0TW9kYWwgYXMgYW55W10pLmZpbmQoZCA9PiBkLmRhdGFzZXRJZCA9PT0gaXRlbS5kYXRhc2V0SWQpO1xuICAgICAgZGVsZXRlZFZpZXdJZHMucHVzaChpdGVtLnZpZXdJZCk7XG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgYXBpQ2FsbHMucHVzaCh0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YVNldChmb3VuZCwgaXRlbS5kYXRhc2V0SWQsIGFwcGxpZWRGaWx0ZXJzKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgUHJvbWlzZS5hbGwoYXBpQ2FsbHMpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0ID0gdGhpcy5kYXRhc2V0U2VydmljZS5nZXRVbmlxdWVEYXRhU2V0T2JqZWN0KCk7XG4gICAgICAvLyBub2RlLm5vZGVQcm9wZXJ0aWVzWyd3aWRnZXRQYXJhbXMnXSA9IGV2ZW50LnRhYmxlVGl0bGU7XG4gICAgICB0aGlzLmxvYWRTaW5nbGVXaWRnZXROb2RlKG5vZGUsIHRoaXMubWFpblBhZ2VEaXZFbGVtZW50LCB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20odGhpcy5tYWluUGFnZURpdkVsZW1lbnQpO1xuICAgICAgfSwgMjAwKTtcblxuICAgIH0pO1xuICAgIC8vIH1cbiAgfVxuXG4gIGFzeW5jIGdldE1vZGFsVmlld0J5Um93Q0xpY2soZXZlbnQsIHZpZXcpIHtcbiAgICBsZXQgYXBpQ2FsbHMgPSBbXTtcbiAgICBsZXQgYXBwbGllZEZpbHRlcnMgPSB0aGlzLmdldFNldE9wZXJhdG9yRmlsdGVyKGV2ZW50LCB0aGlzLnN0YXRlRGF0YVNvdXJjZS5nZXQoZXZlbnQudmlld0lkKSk7XG4gICAgdmlldy5jb21wQ29uZmlnLnZpZXdDb25maWcuZm9yRWFjaChjb250ZW50VmlldyA9PiB7XG4gICAgICBsZXQgZm91bmQgPSAodGhpcy5kYXRhU2V0TW9kYWwgYXMgYW55W10pLmZpbmQoZCA9PiBkLmRhdGFzZXRJZCA9PT0gY29udGVudFZpZXcuZGF0YXNldElkKTtcbiAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICBhcGlDYWxscy5wdXNoKHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0RGF0YUZyb21EYXRhU2V0KGZvdW5kLCBjb250ZW50Vmlldy5kYXRhc2V0SWQsIGFwcGxpZWRGaWx0ZXJzKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoYXBpQ2FsbHMpXG5cblxuICAgIHRoaXMuY29udGV4dE1lbnVEYXRhU291cmNlID0gdGhpcy5jb250ZXh0TWVudURhdGFTb3VyY2UuZmlsdGVyKGUgPT4gZS5kaXNwbGF5S2V5ICE9PSBldmVudC5rZXlUb1Bhc3MpO1xuICAgIHZpZXcuY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2godmlld2ZvckRhdGFTZXQgPT4ge1xuXG4gICAgICBsZXQgb2JqID0ge1xuICAgICAgICBcImZpbHRlcnNcIjogYXBwbGllZEZpbHRlcnMsXG4gICAgICAgIFwia2V5VG9QYXNzXCI6IHRoaXMudXBkYXRlT3BlcmF0b3JEYXRhKGV2ZW50LmtleVRvUGFzcywgZXZlbnQuZGF0YSksXG4gICAgICAgIFwiZHJpbGxEb3duVHlwZVwiOiBldmVudC5kcmlsbERvd25UeXBlLFxuICAgICAgICBcImRyaWxsZG93bkZyb21cIjogZXZlbnQuZHJpbGxkb3duRnJvbVxuICAgICAgfVxuICAgICAgdGhpcy5zdGF0ZURhdGFTb3VyY2Uuc2V0KHZpZXdmb3JEYXRhU2V0Wyd2aWV3SWQnXSwgb2JqKVxuICAgIH0pO1xuICAgIHZpZXcubm9kZVByb3BlcnRpZXNbJ2Rpc3BsYXknXSA9IHRydWU7XG4gICAgdmlldy5ub2RlUHJvcGVydGllc1snd2lkZ2V0UGFyYW1zJ10gPSBldmVudC50YWJsZVRpdGxlO1xuICAgIHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCA9IHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0VW5pcXVlRGF0YVNldE9iamVjdCgpO1xuICAgIHRoaXMubW9kYWxDb25maWdzID0ge1xuICAgICAgdmlldzogdmlldyxcbiAgICAgIGRhdGFzb3VyY2U6IHRoaXMudW5pcXVlRGF0YVNldE9iamVjdFxuICAgIH1cbiAgICAvLyB0aGlzLmxvYWRTaW5nbGVXaWRnZXROb2RlKHZpZXcsIHRoaXMubWFpblBhZ2VEaXZFbGVtZW50LCB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNQb3B1cFZpZXcgPSB0cnVlO1xuICAgIH0sIDIwMCk7XG4gIH1cbiAgYXN5bmMgZ2V0Vmlld0J5Um93Q0xpY2soZXZlbnQsIHZpZXcpIHtcbiAgICBsZXQgYXBpQ2FsbHMgPSBbXTtcbiAgICBsZXQgY2hhdEFwaUNhbGwgPSBbXTtcbiAgICBsZXQgYXBwbGllZEZpbHRlcnMgPSB0aGlzLmdldFNldE9wZXJhdG9yRmlsdGVyKGV2ZW50LCB0aGlzLnN0YXRlRGF0YVNvdXJjZS5nZXQoZXZlbnQudmlld0lkKSk7XG5cbiAgICB2aWV3LmNvbXBDb25maWcudmlld0NvbmZpZy5mb3JFYWNoKGNvbnRlbnRWaWV3ID0+IHtcbiAgICAgIGxldCBmb3VuZCA9ICh0aGlzLmRhdGFTZXRNb2RhbCBhcyBhbnlbXSkuZmluZChkID0+IGQuZGF0YXNldElkID09PSBjb250ZW50Vmlldy5kYXRhc2V0SWQpO1xuICAgICAgLy8gbGV0IHF1ZXJ5UGFyYW1zID0gdGhpcy5nZXRGaWx0ZXJzRm9yUXVlcnlQYXJhbXMoYXBwbGllZEZpbHRlcnMsIGZvdW5kLmNvbmZpZy5xdWVyeUNvbmZpZy5tYXBlZEZpbHRlcnMsIGNvbnRlbnRWaWV3KTtcblxuICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgIGFwaUNhbGxzLnB1c2godGhpcy5kYXRhc2V0U2VydmljZS5nZXREYXRhRnJvbURhdGFTZXQoZm91bmQsIGNvbnRlbnRWaWV3LmRhdGFzZXRJZCwgYXBwbGllZEZpbHRlcnMpKTtcblxuICAgICAgfVxuICAgIH0pO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGFwaUNhbGxzKVxuXG5cbiAgICB0aGlzLmNvbnRleHRNZW51RGF0YVNvdXJjZSA9IHRoaXMuY29udGV4dE1lbnVEYXRhU291cmNlLmZpbHRlcihlID0+IGUuZGlzcGxheUtleSAhPT0gZXZlbnQua2V5VG9QYXNzKTtcbiAgICB2aWV3LmNvbXBDb25maWcudmlld0NvbmZpZy5mb3JFYWNoKHZpZXdmb3JEYXRhU2V0ID0+IHtcblxuICAgICAgbGV0IG9iaiA9IHtcbiAgICAgICAgXCJmaWx0ZXJzXCI6IGFwcGxpZWRGaWx0ZXJzLFxuICAgICAgICBcImtleVRvUGFzc1wiOiB0aGlzLnVwZGF0ZU9wZXJhdG9yRGF0YShldmVudC5rZXlUb1Bhc3MsIGV2ZW50LmRhdGEpLFxuICAgICAgICBcImRyaWxsRG93blR5cGVcIjogZXZlbnQuZHJpbGxEb3duVHlwZSxcbiAgICAgICAgXCJkcmlsbGRvd25Gcm9tXCI6IGV2ZW50LmRyaWxsZG93bkZyb21cbiAgICAgIH1cbiAgICAgIHRoaXMuc3RhdGVEYXRhU291cmNlLnNldCh2aWV3Zm9yRGF0YVNldFsndmlld0lkJ10sIG9iailcbiAgICB9KTtcbiAgICB2aWV3Lm5vZGVQcm9wZXJ0aWVzWydkaXNwbGF5J10gPSB0cnVlO1xuICAgIHZpZXcubm9kZVByb3BlcnRpZXNbJ3dpZGdldFBhcmFtcyddID0gZXZlbnQudGFibGVUaXRsZTtcbiAgICBjb25zdCBwcmVmaXhlZElkID0gYGlkLSR7dmlldy5pZH1gO1xuICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtwcmVmaXhlZElkfWApIGFzIEhUTUxFbGVtZW50O1xuICAgIHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCA9IHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0VW5pcXVlRGF0YVNldE9iamVjdCgpO1xuICAgIHRoaXMubG9hZFNpbmdsZVdpZGdldE5vZGUodmlldywgdGhpcy5tYWluUGFnZURpdkVsZW1lbnQsIHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCk7XG5cbiAgICBsZXQgbmF2aWdhdGlvbjogTmF2aWdhdGlvbkV4dHJhcyA9IHtcbiAgICAgIHF1ZXJ5UGFyYW1zOiBhcHBsaWVkRmlsdGVyc1snb3BlcmF0aW9uRmlsdGVyJ10sXG4gICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiBcIm1lcmdlXCJcbiAgICB9O1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCBuYXZpZ2F0aW9uKTtcbiAgICBjb25zb2xlLmxvZyh0aGlzLnN0YXRlRGF0YVNvdXJjZSk7XG5cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSh0aGlzLm1haW5QYWdlRGl2RWxlbWVudCk7XG4gICAgfSwgMjAwKTtcbiAgfVxuXG5cbiAgc2Nyb2xsVG9Cb3R0b20oY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29udGFpbmVyLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdlbmQnIH0pO1xuICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIGZpbmRXaWRnZXRCeUlkKGNvbmZpZ3M6IGFueVtdLCBpZDogc3RyaW5nKTogYW55IHwgdW5kZWZpbmVkIHtcbiAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBjb25maWdzKSB7XG4gICAgICBpZiAoY29uZmlnLmlkID09PSBpZCkge1xuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy53aWRnZXROb2RlICYmIGNvbmZpZy53aWRnZXROb2RlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmZpbmRXaWRnZXRCeUlkKGNvbmZpZy53aWRnZXROb2RlLCBpZCk7XG4gICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgIHJldHVybiBmb3VuZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgdXBkYXRlT3BlcmF0b3JEYXRhKGtleV9uYW1lOiBzdHJpbmdbXSwgdmFsdWVfZGF0YTogYW55KTogYW55IHtcbiAgICBsZXQgb3BlcmF0b3IgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlfbmFtZSkge1xuICAgICAgbGV0IG9iajogYW55ID0ge307XG4gICAgICBvYmpba2V5XSA9IHZhbHVlX2RhdGFba2V5XTtcbiAgICAgIG9wZXJhdG9yLnB1c2gob2JqKVxuICAgIH1cbiAgICByZXR1cm4gb3BlcmF0b3I7XG4gIH1cblxuXG4gIGdldEVsZW1lbnRPZkN1cnJlbnRWaWV3KG5vZGUsIHZpZXdJZCkge1xuICAgIGNvbnN0IG1hdGNoZWRPYmplY3QgPSBub2RlLmNvbXBDb25maWcudmlld0NvbmZpZy5maW5kKG9iamVjdCA9PiBvYmplY3Qudmlld0lkID09PSB2aWV3SWQpO1xuICAgIHJldHVybiBtYXRjaGVkT2JqZWN0ID8gbm9kZSA6IG51bGw7XG4gIH1cbiAgZ2V0SG91cmx5RGF0YShub2RlKSB7XG4gICAgY29uc3QgbWF0Y2hlZE9iamVjdCA9IG5vZGUuY29tcENvbmZpZy52aWV3Q29uZmlnLmZpbmQob2JqZWN0ID0+IG9iamVjdC5rcGlDb25maWcuZm9ybWF0ZSA9PT0gJ2hvdXJseScpO1xuICAgIHJldHVybiBtYXRjaGVkT2JqZWN0ID8gbm9kZSA6IG51bGw7XG4gIH1cblxuICBnZXRTZXRPcGVyYXRvckZpbHRlcihvYmplY3REYXRhLCBwcmV2aW91c1ZpZXdTdGF0ZXMpIHtcblxuICAgIGNvbnN0IHsgZGF0YSwga2V5VG9QYXNzIH0gPSBvYmplY3REYXRhO1xuICAgIGNvbnN0IGFwcGxpZWRGaWx0ZXIgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHByZXZpb3VzVmlld1N0YXRlcy5maWx0ZXJzLm9wZXJhdGlvbkZpbHRlcikpO1xuXG4gICAga2V5VG9QYXNzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChrZXkgaW4gZGF0YSkge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkS2V5ID0ga2V5LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXy9nLCAnJyk7XG4gICAgICAgIGlmIChub3JtYWxpemVkS2V5ID09PSBcInJlY29yZGRhdGVcIiAmJiBcInN0YXJ0RGF0ZVwiIGluIGFwcGxpZWRGaWx0ZXIgJiYgXCJlbmREYXRlXCIgaW4gYXBwbGllZEZpbHRlcikge1xuICAgICAgICAgIGFwcGxpZWRGaWx0ZXIuc3RhcnREYXRlID0gZGF0YVtrZXldO1xuICAgICAgICAgIGFwcGxpZWRGaWx0ZXIuZW5kRGF0ZSA9IGRhdGFba2V5XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhcHBsaWVkRmlsdGVyW2tleV0gPSBkYXRhW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBkZWZhdWx0b3BlcmF0aW9uRmlsdGVyID0gdGhpcy5nbG9iYWxEZWZhdWx0RmlsdGVyLm9wZXJhdGlvbkZpbHRlcjtcbiAgICBpZiAoZGVmYXVsdG9wZXJhdGlvbkZpbHRlcikge1xuICAgICAgT2JqZWN0LmtleXMoZGVmYXVsdG9wZXJhdGlvbkZpbHRlcikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoIWFwcGxpZWRGaWx0ZXIuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGFwcGxpZWRGaWx0ZXJba2V5XSA9IGRlZmF1bHRvcGVyYXRpb25GaWx0ZXJba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3BlcmF0aW9uRmlsdGVyID0ge307XG4gICAgb3BlcmF0aW9uRmlsdGVyWydvcGVyYXRpb25GaWx0ZXInXSA9IGFwcGxpZWRGaWx0ZXI7XG4gICAgcmV0dXJuIG9wZXJhdGlvbkZpbHRlcjtcbiAgfVxuXG5cbiAgZ2V0UmVhcmNoUmVzdWx0RnJvbUlucHV0Qm94KGlucHV0VmFsdWUsIHZpZXdDb25maWcsIGZpbHRlck9iamVjdCkge1xuICAgIGxldCB2aWV3ID0gdmlld0NvbmZpZztcbiAgICBsZXQgZXZlbnROb2RlID0geyBkYXRhOiB7fSwga2V5VG9QYXNzOiBbXSB9XG4gICAgZXZlbnROb2RlLmRhdGFbZmlsdGVyT2JqZWN0LnNlcnZlcl9jb2x1bW5dID0gaW5wdXRWYWx1ZTtcbiAgICBldmVudE5vZGVbJ2tleVRvUGFzcyddID0gW2ZpbHRlck9iamVjdC5zZXJ2ZXJfY29sdW1uXTtcbiAgICBsZXQgYXBpQ2FsbHMgPSBbXTtcblxuICAgIHZpZXcuY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2goY29udGVudFZpZXcgPT4ge1xuICAgICAgbGV0IGFwcGxpZWRGaWx0ZXJzID0gdGhpcy5nZXRTZXRPcGVyYXRvckZpbHRlcihldmVudE5vZGUsIHRoaXMuc3RhdGVEYXRhU291cmNlLmdldChjb250ZW50Vmlldy52aWV3SWQpKTtcbiAgICAgIGxldCBmb3VuZCA9ICh0aGlzLmRhdGFTZXRNb2RhbCBhcyBhbnlbXSkuZmluZChkID0+IGQuZGF0YXNldElkID09PSBjb250ZW50Vmlldy5kYXRhc2V0SWQpO1xuICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgIGFwaUNhbGxzLnB1c2godGhpcy5kYXRhc2V0U2VydmljZS5nZXREYXRhRnJvbURhdGFTZXQoZm91bmQsIGNvbnRlbnRWaWV3LmRhdGFzZXRJZCwgYXBwbGllZEZpbHRlcnMpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB2aWV3Q29uZmlnLm5vZGVQcm9wZXJ0aWVzWydkaXNwbGF5J10gPSBmYWxzZTtcbiAgICBjb25zdCBwcmVmaXhlZElkID0gYGlkLSR7dmlld0NvbmZpZy5pZH1gO1xuICAgIGNvbnN0IGVsZW1lbnRUb0hpZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtwcmVmaXhlZElkfWApIGFzIEhUTUxFbGVtZW50OyAvLyBDYXN0IHRvIEhUTUxFbGVtZW50XG4gICAgaWYgKGVsZW1lbnRUb0hpZGUpIHtcbiAgICAgIGVsZW1lbnRUb0hpZGUucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgUHJvbWlzZS5hbGwoYXBpQ2FsbHMpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0ID0gdGhpcy5kYXRhc2V0U2VydmljZS5nZXRVbmlxdWVEYXRhU2V0T2JqZWN0KCk7XG5cbiAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgICAgIHRoaXMuY29udGV4dE1lbnVEYXRhU291cmNlID0gdGhpcy5jb250ZXh0TWVudURhdGFTb3VyY2UuZmlsdGVyKGUgPT4gZS5kaXNwbGF5S2V5ICE9PSB2aWV3Q29uZmlnLmtleVRvUGFzcyk7XG5cbiAgICAgIHZpZXcubm9kZVByb3BlcnRpZXNbJ2Rpc3BsYXknXSA9IHRydWU7XG4gICAgICAvLyB2aWV3Lm5vZGVQcm9wZXJ0aWVzWyd3aWRnZXRQYXJhbXMnXSA9IGV2ZW50LnRhYmxlVGl0bGU7XG4gICAgICBjb25zdCBwcmVmaXhlZElkID0gYGlkLSR7dmlldy5pZH1gO1xuICAgICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke3ByZWZpeGVkSWR9YCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICB0aGlzLmxvYWRTaW5nbGVXaWRnZXROb2RlKHZpZXcsIHRoaXMubWFpblBhZ2VEaXZFbGVtZW50LCB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20odGhpcy5tYWluUGFnZURpdkVsZW1lbnQpO1xuICAgICAgfSwgMjAwKTtcbiAgICAgIGxldCBwYXJhbXMgPSB7fTtcbiAgICAgIHBhcmFtc1tmaWx0ZXJPYmplY3Quc2VydmVyX2NvbHVtbl0gPSBpbnB1dFZhbHVlO1xuICAgICAgbGV0IG5hdmlnYXRpb246IE5hdmlnYXRpb25FeHRyYXMgPSB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zOiBwYXJhbXMsXG4gICAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6IFwibWVyZ2VcIlxuICAgICAgfTtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCBuYXZpZ2F0aW9uKTtcbiAgICB9KTtcbiAgfVxuXG5cbiAgc3VibWl0RmlsdGVyKCkge1xuICAgIGxldCB2aWV3ID0gdGhpcy5ub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2Uudmlld0NvbmZpZztcbiAgICAvLyBsZXQgY2FsX3ZhbHVlID0gKHBhcnNlRmxvYXQoc2VhcmNoVGVybSkgLyAxMDApXG4gICAgbGV0IGFwaUNhbGxzID0gW107XG4gICAgdGhpcy5oYXZpbmdEYXRhT2JqZWN0ID0gdGhpcy5ub2RlcHJvcGVydGljZUZpbHRlckRhdGFTb3VyY2UuaGF2aW5nQ29uZmlnLmZpbHRlcih2YWx1ZSA9PiB2YWx1ZS52YWx1ZSAhPT0gXCJcIik7XG4gICAgdmlldy5jb21wQ29uZmlnLnZpZXdDb25maWcuZm9yRWFjaChjb250ZW50VmlldyA9PiB7XG4gICAgICBsZXQgYXBwbGllZEZpbHRlcnMgPSB0aGlzLnN0YXRlRGF0YVNvdXJjZS5nZXQoY29udGVudFZpZXcudmlld0lkKTtcbiAgICAgIGxldCBmb3VuZCA9ICh0aGlzLmRhdGFTZXRNb2RhbCBhcyBhbnlbXSkuZmluZChkID0+IGQuZGF0YXNldElkID09PSBjb250ZW50Vmlldy5kYXRhc2V0SWQpO1xuICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgIGFwaUNhbGxzLnB1c2godGhpcy5kYXRhc2V0U2VydmljZS5nZXREYXRhRnJvbURhdGFTZXQoZm91bmQsIGNvbnRlbnRWaWV3LmRhdGFzZXRJZCwgYXBwbGllZEZpbHRlcnMuZmlsdGVycykpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFByb21pc2UuYWxsKGFwaUNhbGxzKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCA9IHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0VW5pcXVlRGF0YVNldE9iamVjdCgpO1xuXG4gICAgICB0aGlzLm5vZGVwcm9wZXJ0aWNlRmlsdGVyRGF0YVNvdXJjZS52aWV3Q29uZmlnLm5vZGVQcm9wZXJ0aWVzWydkaXNwbGF5J10gPSBmYWxzZTtcbiAgICAgIGNvbnN0IHByZWZpeGVkSWQgPSBgaWQtJHt0aGlzLm5vZGVwcm9wZXJ0aWNlRmlsdGVyRGF0YVNvdXJjZS52aWV3Q29uZmlnLmlkfWA7XG4gICAgICBjb25zdCBlbGVtZW50VG9IaWRlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgIyR7cHJlZml4ZWRJZH1gKSBhcyBIVE1MRWxlbWVudDsgLy8gQ2FzdCB0byBIVE1MRWxlbWVudFxuICAgICAgaWYgKGVsZW1lbnRUb0hpZGUpIHtcbiAgICAgICAgZWxlbWVudFRvSGlkZS5yZW1vdmUoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgICAgdGhpcy5jb250ZXh0TWVudURhdGFTb3VyY2UgPSB0aGlzLmNvbnRleHRNZW51RGF0YVNvdXJjZS5maWx0ZXIoZSA9PiBlLmRpc3BsYXlLZXkgIT09IHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlLnZpZXdDb25maWcua2V5VG9QYXNzKTtcbiAgICAgIHRoaXMuaXNXaWRnZXRGaWx0ZXJzID0gZmFsc2U7XG4gICAgICB2aWV3Lm5vZGVQcm9wZXJ0aWVzWydkaXNwbGF5J10gPSB0cnVlO1xuICAgICAgLy8gdmlldy5ub2RlUHJvcGVydGllc1snd2lkZ2V0UGFyYW1zJ10gPSBldmVudC50YWJsZVRpdGxlO1xuICAgICAgLy8gY29uc3QgcHJlZml4ZWRJZCA9IGBpZC0ke3ZpZXcuaWR9YDtcbiAgICAgIC8vIGNvbnN0IGNvbnRhaW5lckVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHtwcmVmaXhlZElkfWApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgdGhpcy5sb2FkU2luZ2xlV2lkZ2V0Tm9kZSh2aWV3LCB0aGlzLm1haW5QYWdlRGl2RWxlbWVudCwgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0KTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnNjcm9sbFRvQm90dG9tKHRoaXMubWFpblBhZ2VEaXZFbGVtZW50KTtcbiAgICAgIH0sIDIwMCk7XG4gICAgfSk7XG4gIH1cblxuXG4gIGdldFdpZGdldEZpbHRlckZvclRlbXBsYXRlKHZhbHVlKSB7XG5cbiAgICBsZXQgYXBpQ2FsbHMgPSBbXTtcbiAgICBjb25zdCBkZWxldGVkVmlld0lkcyA9IFtdO1xuICAgIHZhbHVlLnZpZXdOb2Rlcy5jb21wQ29uZmlnLnZpZXdDb25maWcuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGxldCB3aWRnZXRGaWx0ZXIgPSB0aGlzLnN0YXRlRGF0YVNvdXJjZS5nZXQoaXRlbS52aWV3SWQpO1xuICAgICAgbGV0IGFwcGxpZWRGaWx0ZXJzID0gd2lkZ2V0RmlsdGVyLmZpbHRlcnM7XG4gICAgICBsZXQgZm91bmQgPSAodGhpcy5kYXRhU2V0TW9kYWwgYXMgYW55W10pLmZpbmQoZCA9PiBkLmRhdGFzZXRJZCA9PT0gaXRlbS5kYXRhc2V0SWQpO1xuICAgICAgZGVsZXRlZFZpZXdJZHMucHVzaChpdGVtLnZpZXdJZCk7XG4gICAgICBjb25zdCBoYXZpbmcgPSBPYmplY3QuZW50cmllcyh2YWx1ZS5vcGVyYXRpb25GaWx0ZXIpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiAoe1xuICAgICAgICBjb2x1bW5OYW1lOiBrZXksXG4gICAgICAgIGRhdGFUeXBlOiBcImZsb2F0XCIsXG4gICAgICAgIG9wZXJhdG9yOiBcImd0ZVwiLFxuICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgIH0pKTtcblxuICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgIGZvdW5kLmNvbmZpZy5xdWVyeUNvbmZpZ1snaGF2aW5ncyddID0gaGF2aW5nO1xuICAgICAgICBhcGlDYWxscy5wdXNoKHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0RGF0YUZyb21EYXRhU2V0KGZvdW5kLCBpdGVtLmRhdGFzZXRJZCwgYXBwbGllZEZpbHRlcnMpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBQcm9taXNlLmFsbChhcGlDYWxscykudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QgPSB0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldFVuaXF1ZURhdGFTZXRPYmplY3QoKTtcbiAgICAgIC8vIHZhbHVlLnZpZXdOb2Rlcy5ub2RlUHJvcGVydGllc1snd2lkZ2V0UGFyYW1zJ10gPSBldmVudC50YWJsZVRpdGxlO1xuICAgICAgdGhpcy5sb2FkU2luZ2xlV2lkZ2V0Tm9kZSh2YWx1ZS52aWV3Tm9kZXMsIHRoaXMubWFpblBhZ2VEaXZFbGVtZW50LCB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20odGhpcy5tYWluUGFnZURpdkVsZW1lbnQpO1xuICAgICAgfSwgMjAwKTtcblxuICAgIH0pO1xuICAgIC8vIH1cbiAgfVxuXG4gIGFzeW5jIGxvYWREYXRhQnlPcGVyYXRvcihvcE5hbWUpIHtcbiAgICBsZXQgZmlsdGVyID0geyBvcGVyYXRpb25GaWx0ZXI6IHsgc3RhcnREYXRlOiBcIlwiLCBlbmREYXRlOiBcIlwiLCBvcGVyYXRvcl9rZXk6IFwiXCIgfSB9O1xuICAgIGZpbHRlci5vcGVyYXRpb25GaWx0ZXJbJ3N0YXJ0RGF0ZSddID0gdGhpcy5kZWZhdWx0U3RhcnREYXRlO1xuICAgIGZpbHRlci5vcGVyYXRpb25GaWx0ZXJbJ2VuZERhdGUnXSA9IHRoaXMuZGVmYXVsdEVuZERhdGU7XG4gICAgZmlsdGVyLm9wZXJhdGlvbkZpbHRlclsnb3BlcmF0b3Jfa2V5J10gPSBvcE5hbWU7XG4gICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuXG4gICAgbGV0IG5hdmlnYXRpb246IE5hdmlnYXRpb25FeHRyYXMgPSB7XG4gICAgICBxdWVyeVBhcmFtczoge1xuICAgICAgICBcIm9wZXJhdG9yTmFtZVwiOiBvcE5hbWVcbiAgICAgIH0sXG4gICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiBcIm1lcmdlXCJcbiAgICB9O1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCBuYXZpZ2F0aW9uKTtcblxuICAgIC8vIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnID0gW107XG4gICAgYXdhaXQgdGhpcy5nZXRQYWRlRGF0YVNvdXJjZSh0cnVlKTtcbiAgICB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QgPSB7fTtcbiAgICBsZXQgYXBpQ2FsbHMgPSBbXTtcblxuICAgIHRoaXMuYWxsV2lkZ2V0QnlEYXRhc2V0LmZvckVhY2godmlldyA9PiB7XG4gICAgICB2aWV3LmRhdGFzZXRJZHMuZm9yRWFjaChpZCA9PiB7XG4gICAgICAgIGxldCBmb3VuZCA9ICh0aGlzLmRhdGFTZXRNb2RhbCBhcyBhbnlbXSkuZmluZChkID0+IGQuZGF0YXNldElkID09PSBpZC5kYXRhc2V0SWQpO1xuICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICBhcGlDYWxscy5wdXNoKHRoaXMuZGF0YXNldFNlcnZpY2UuZ2V0RGF0YUZyb21EYXRhU2V0KGZvdW5kLCBpZC5kYXRhc2V0SWQsIGZpbHRlcikpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBQcm9taXNlLmFsbChhcGlDYWxscykudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmdsb2JhbERlZmF1bHRGaWx0ZXIgPSBmaWx0ZXI7XG4gICAgICB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QgPSB0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldFVuaXF1ZURhdGFTZXRPYmplY3QoKTtcbiAgICAgIHRoaXMuY3JlYXRlRGl2RWxlbWVudHModGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0LCB0cnVlKTtcbiAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgfSk7XG5cbiAgfVxuXG4gIGFzeW5jIGdldENvbnRleHRGaWx0ZXJEYXRhKHZhbHVlKSB7XG5cbiAgICBsZXQgZmlsdGVyID0geyBvcGVyYXRpb25GaWx0ZXI6IHsgc3RhcnREYXRlOiBcIlwiLCBlbmREYXRlOiBcIlwiIH0gfTtcbiAgICBmaWx0ZXIub3BlcmF0aW9uRmlsdGVyWydzdGFydERhdGUnXSA9IHRoaXMuZGVmYXVsdFN0YXJ0RGF0ZTtcbiAgICBmaWx0ZXIub3BlcmF0aW9uRmlsdGVyWydlbmREYXRlJ10gPSB0aGlzLmRlZmF1bHRFbmREYXRlO1xuICAgIGZpbHRlci5vcGVyYXRpb25GaWx0ZXJbdmFsdWUub3BlcmF0b3JOYW1lXSA9IHRoaXMucGFyc2VJbnB1dCh2YWx1ZS5kZWZhdWx0RmlsdGVyVmFsdWUpO1xuICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgICBsZXQgb2JqID0ge307XG4gICAgb2JqW3ZhbHVlLm9wZXJhdG9yTmFtZV0gPSB2YWx1ZS5kZWZhdWx0RmlsdGVyVmFsdWU7XG4gICAgbGV0IG5hdmlnYXRpb246IE5hdmlnYXRpb25FeHRyYXMgPSB7XG4gICAgICBxdWVyeVBhcmFtczogb2JqLFxuICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogXCJtZXJnZVwiXG4gICAgfTtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwgbmF2aWdhdGlvbik7XG5cbiAgICAvLyB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZyA9IFtdO1xuICAgIGF3YWl0IHRoaXMuZ2V0UGFkZURhdGFTb3VyY2UodHJ1ZSk7XG4gICAgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0ID0ge307XG4gICAgbGV0IGFwaUNhbGxzID0gW107XG5cbiAgICB0aGlzLmFsbFdpZGdldEJ5RGF0YXNldC5mb3JFYWNoKHZpZXcgPT4ge1xuICAgICAgdmlldy5kYXRhc2V0SWRzLmZvckVhY2goaWQgPT4ge1xuICAgICAgICBsZXQgZm91bmQgPSAodGhpcy5kYXRhU2V0TW9kYWwgYXMgYW55W10pLmZpbmQoZCA9PiBkLmRhdGFzZXRJZCA9PT0gaWQuZGF0YXNldElkKTtcbiAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgYXBpQ2FsbHMucHVzaCh0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YVNldChmb3VuZCwgaWQuZGF0YXNldElkLCBmaWx0ZXIpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgUHJvbWlzZS5hbGwoYXBpQ2FsbHMpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5nbG9iYWxEZWZhdWx0RmlsdGVyID0gZmlsdGVyO1xuICAgICAgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0ID0gdGhpcy5kYXRhc2V0U2VydmljZS5nZXRVbmlxdWVEYXRhU2V0T2JqZWN0KCk7XG4gICAgICB0aGlzLmNyZWF0ZURpdkVsZW1lbnRzKHRoaXMudW5pcXVlRGF0YVNldE9iamVjdCwgdHJ1ZSk7XG4gICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgcGFyc2VJbnB1dChpbnB1dCkge1xuICAgIGlucHV0ID0gaW5wdXQudHJpbSgpO1xuXG4gICAgaWYgKGlucHV0LmluY2x1ZGVzKCcsJykpIHtcbiAgICAgIHJldHVybiBpbnB1dC5zcGxpdCgnLCcpLm1hcChpdGVtID0+IGl0ZW0udHJpbSgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH1cbiAgfVxuXG5cbiAgZ2V0RHJpbGxkb3duRGlzcGxheUJ5VXJsUGFyYW1zKGFsbF92aWV3cykge1xuICAgIHRoaXMuZGVmYXVsdFZpZXdJZHNPblBhZ2VSZWZyZXNoID0gW107XG4gICAgY29uc3QgcGFyYW1zID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcztcbiAgICB0aGlzLmRlZmF1bHRWaWV3SWRzT25QYWdlUmVmcmVzaCA9IChwYXJhbXNbJ3ZpZXdzJ10gJiYgcGFyYW1zWyd2aWV3cyddICE9PSBcIlwiKSA/IEpTT04ucGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KHBhcmFtc1sndmlld3MnXSkpIDogW107XG4gICAgZGVidWdnZXJcbiAgICBhbGxfdmlld3MuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGZvciAobGV0IGVudHJ5IG9mIGVsZW1lbnQud2lkZ2V0Tm9kZSkge1xuICAgICAgICBsZXQgc2hvdWxkRGlzcGxheSA9IGZhbHNlO1xuICAgICAgICBlbnRyeS5jb21wQ29uZmlnLnZpZXdDb25maWcuZm9yRWFjaCh2aWV3ID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0Vmlld0lkc09uUGFnZVJlZnJlc2gubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBmb3VuZE9iamVjdCA9IHRoaXMuZGVmYXVsdFZpZXdJZHNPblBhZ2VSZWZyZXNoLmZpbmQodmFsID0+IHZhbC52aWV3SWQgPT09IHZpZXcudmlld0lkKTtcbiAgICAgICAgICAgIGlmIChmb3VuZE9iamVjdCkge1xuICAgICAgICAgICAgICBzaG91bGREaXNwbGF5ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoc2hvdWxkRGlzcGxheSkge1xuICAgICAgICAgIGVudHJ5Lm5vZGVQcm9wZXJ0aWVzLmRpc3BsYXkgPSB0cnVlO1xuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuXG4gIH1cblxuXG4gIGdldEZpbHRlcnNGb3JRdWVyeVBhcmFtcyhvcGVyYXRvcnMsIGZpbHRlcnMsIHZpZXdQYXJhbXMpIHtcbiAgICBjb25zdCBvcGVyYXRpb25GaWx0ZXIgPSBvcGVyYXRvcnMub3BlcmF0aW9uRmlsdGVyIHx8IHt9O1xuICAgIGNvbnN0IGN1cnJlbnRQYXJhbXMgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zO1xuXG4gICAgbGV0IGN1cnJlbnRWaWV3czogYW55W10gPSBbXTtcbiAgICBpZiAoY3VycmVudFBhcmFtc1sndmlld3MnXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY3VycmVudFZpZXdzID0gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQoY3VycmVudFBhcmFtc1sndmlld3MnXSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiSW52YWxpZCB2aWV3cyBwYXJhbVwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJEYXRhOiBhbnkgPSB7IHZpZXdJZDogdmlld1BhcmFtcy52aWV3SWQgfTtcblxuICAgIGZpbHRlcnMuZm9yRWFjaChmaWx0ZXIgPT4ge1xuICAgICAgY29uc3QgbG9jYWxLZXkgPSBmaWx0ZXIubG9jYWxDb2x1bW47XG4gICAgICBjb25zdCBzZXJ2ZXJLZXkgPSBmaWx0ZXIuc2VydmVyQ29sdW1uO1xuICAgICAgbGV0IHZhbHVlID0gb3BlcmF0aW9uRmlsdGVyW2xvY2FsS2V5XTtcblxuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IFwiXCIpIHtcbiAgICAgICAgZmlsdGVyRGF0YVtzZXJ2ZXJLZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBleGlzdGluZ0luZGV4ID0gY3VycmVudFZpZXdzLmZpbmRJbmRleCh2ID0+IHYudmlld0lkID09PSB2aWV3UGFyYW1zLnZpZXdJZCk7XG5cbiAgICBpZiAoZXhpc3RpbmdJbmRleCAhPT0gLTEpIHtcbiAgICAgIGN1cnJlbnRWaWV3c1tleGlzdGluZ0luZGV4XSA9IGZpbHRlckRhdGE7XG4gICAgICBjdXJyZW50Vmlld3MgPSBjdXJyZW50Vmlld3Muc2xpY2UoMCwgZXhpc3RpbmdJbmRleCArIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50Vmlld3MucHVzaChmaWx0ZXJEYXRhKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbmNvZGVkVmlld3MgPSBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoY3VycmVudFZpZXdzKSk7XG5cbiAgICBjb25zdCBtZXJnZWRQYXJhbXMgPSB7XG4gICAgICAuLi5jdXJyZW50UGFyYW1zLFxuICAgICAgdmlld3M6IGVuY29kZWRWaWV3c1xuICAgIH07XG5cbiAgICBjb25zdCBuYXZpZ2F0aW9uOiBOYXZpZ2F0aW9uRXh0cmFzID0ge1xuICAgICAgcXVlcnlQYXJhbXM6IG1lcmdlZFBhcmFtcyxcbiAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZSdcbiAgICB9O1xuXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIG5hdmlnYXRpb24pO1xuICB9XG5cbiAgZ2V0RHJpbGRvd25GaWx0ZXIoZHJpbGRvd25GaWx0ZXIsIGRlZmF1bHRGaWx0ZXIpIHtcbiAgICBjb25zdCBleHBlY3RlZERhdGVGaWVsZHMgPSBbJ3JlY29yZERhdGUnLCAncmVjb3JkX2RhdGUnLCAnZXZlbnREYXRlJywgJ2V2ZW50X2RhdGUnXTtcbiAgICBjb25zdCByZXN1bHQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRlZmF1bHRGaWx0ZXIpKTtcbiAgICBjb25zdCB7IHZpZXdJZCwgLi4uZmlsdGVyZWREcmlsbGRvd24gfSA9IGRyaWxkb3duRmlsdGVyO1xuICAgIGxldCBkYXRlVmFsdWUgPSBudWxsO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGV4cGVjdGVkRGF0ZUZpZWxkcykge1xuICAgICAgaWYgKGZpbHRlcmVkRHJpbGxkb3duW2tleV0pIHtcbiAgICAgICAgZGF0ZVZhbHVlID0gZmlsdGVyZWREcmlsbGRvd25ba2V5XTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkYXRlVmFsdWUpIHtcbiAgICAgIHJlc3VsdC5vcGVyYXRpb25GaWx0ZXIuc3RhcnREYXRlID0gZGF0ZVZhbHVlO1xuICAgICAgcmVzdWx0Lm9wZXJhdGlvbkZpbHRlci5lbmREYXRlID0gZGF0ZVZhbHVlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBmaWx0ZXJlZERyaWxsZG93bikge1xuICAgICAgaWYgKCFleHBlY3RlZERhdGVGaWVsZHMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICByZXN1bHQub3BlcmF0aW9uRmlsdGVyW2tleV0gPSBmaWx0ZXJlZERyaWxsZG93bltrZXldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG5cbiAgfVxuXG5cbiAgZ2V0VGl0bGVQYXJhbXMoaXRlbXMpIHtcbiAgICBjb25zdCByZXN1bHRzID0gW107XG5cbiAgICBpdGVtcy5jb21wQ29uZmlnLnZpZXdDb25maWcuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGNvbnN0IGZvdW5kT2JqZWN0ID0gdGhpcy5kZWZhdWx0Vmlld0lkc09uUGFnZVJlZnJlc2guZmluZCh2YWwgPT4gdmFsLnZpZXdJZCA9PT0gZWxlbWVudC52aWV3SWQpO1xuICAgICAgaWYgKGZvdW5kT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5lbnRyaWVzKGZvdW5kT2JqZWN0KVxuICAgICAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiBrZXkgIT09ICd2aWV3SWQnKVxuICAgICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgLy8gQ29udmVydCBrZXkgdG8gVGl0bGUgQ2FzZSB3aXRoIHNwYWNlc1xuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkS2V5ID0ga2V5XG4gICAgICAgICAgICAgIC5yZXBsYWNlKC9fL2csICcgJykgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgdW5kZXJzY29yZXMgd2l0aCBzcGFjZXNcbiAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcYlxcdy9nLCBjaGFyID0+IGNoYXIudG9VcHBlckNhc2UoKSk7IC8vIGNhcGl0YWxpemUgZWFjaCB3b3JkXG4gICAgICAgICAgICByZXR1cm4gYCR7Zm9ybWF0dGVkS2V5fSA9ICR7dmFsdWV9YDtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5qb2luKCcgfCAnKTtcblxuICAgICAgICByZXN1bHRzLnB1c2goYHwgJHtyZXN1bHR9IGApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdHMuam9pbignXFxuJyk7IC8vIG9yIHdoYXRldmVyIHNlcGFyYXRvciB5b3UgcHJlZmVyIGJldHdlZW4gbXVsdGlwbGUgcmVzdWx0c1xuICB9XG5cbn1cbiIsIjxhcHAtbG9hZGluZyAqbmdJZj1cImxvYWRpbmdNb2RhbFwiPjwvYXBwLWxvYWRpbmc+XG5cbjxkaXYgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgXCIgI2R5bmFtaWNDb250YWluZXI+PC9kaXY+XG48L2Rpdj4iXX0=