gamma-app-controller 1.0.9 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/esm2020/lib/application-controller/application-controller.module.mjs +14 -5
  2. package/esm2020/lib/application-controller/application-dataset-call.service.mjs +3 -3
  3. package/esm2020/lib/application-controller/application-dataset-component/create-dataset/create-dataset.component.mjs +7 -7
  4. package/esm2020/lib/application-controller/application-dataset-component/dataset-query-bulder/dataset-query-bulder.component.mjs +4 -3
  5. package/esm2020/lib/application-controller/application-filter/application-filter.component.mjs +2 -2
  6. package/esm2020/lib/application-controller/application-view-components/create-comp-view/create-comp-view.component.mjs +1 -7
  7. package/esm2020/lib/application-controller/page-controller/page-config/page-config.component.mjs +5 -3
  8. package/esm2020/lib/application-controller/page-controller/page-config-multi-layout/page-config-multi-layout.component.mjs +984 -0
  9. package/esm2020/lib/application-controller/page-controller/page-controller/page-controller.component.mjs +9 -2
  10. package/esm2020/lib/application-controller/shared/advanced-component/app-advance-header/app-header.component.mjs +23 -6
  11. package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.mjs +101 -127
  12. package/esm2020/lib/application-controller/support-components/dash-table/dash-table.component.mjs +3 -3
  13. package/esm2020/lib/application-controller/support-components/table-with-bar/table-with-bar.component.mjs +2 -1
  14. package/esm2020/public-api.mjs +4 -1
  15. package/fesm2015/gamma-app-controller.mjs +1137 -182
  16. package/fesm2015/gamma-app-controller.mjs.map +1 -1
  17. package/fesm2020/gamma-app-controller.mjs +1135 -182
  18. package/fesm2020/gamma-app-controller.mjs.map +1 -1
  19. package/lib/application-controller/application-controller.module.d.ts +12 -11
  20. package/lib/application-controller/page-controller/page-config/page-config.component.d.ts +1 -1
  21. package/lib/application-controller/page-controller/page-config-multi-layout/page-config-multi-layout.component.d.ts +190 -0
  22. package/lib/application-controller/shared/advanced-component/app-advance-header/app-header.component.d.ts +3 -1
  23. package/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.d.ts +15 -12
  24. package/package.json +1 -1
  25. package/public-api.d.ts +3 -0
@@ -0,0 +1,984 @@
1
+ import { Component, ViewChild, ViewContainerRef } from '@angular/core';
2
+ import { confirm } from 'devextreme/ui/dialog';
3
+ import { DxScrollViewComponent } from 'devextreme-angular';
4
+ import moment from '../../moment-helper';
5
+ import { GammaTodayPreviousComponent } from '../../shared/advanced-component/gamma-today-previous/gamma-today-previous.component';
6
+ import { AppAdvanceHeaderComponent } from '../../shared/advanced-component/app-advance-header/app-header.component';
7
+ import { GammaTableWithPercentageComponent } from '../../shared/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component';
8
+ import { GammSingleNumberCardComponent } from '../../shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component';
9
+ import { GammaAdvanceOperatorTableComponent } from '../../shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component';
10
+ import { AdvanceWidgetHeaderFilterComponent } from '../../shared/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component';
11
+ import { GammaAdvanceChartComponent } from '../../shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component';
12
+ import { GammaGeoChartComponent } from '../../shared/advanced-component/gamma-geo-chart/gamma-geo-chart.component';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "../../common";
15
+ import * as i2 from "@angular/router";
16
+ import * as i3 from "../../application-content.service";
17
+ import * as i4 from "ngx-toastr";
18
+ import * as i5 from "../../application-dataset-call.service";
19
+ import * as i6 from "@angular/common";
20
+ import * as i7 from "devextreme-angular/core";
21
+ import * as i8 from "devextreme-angular/ui/check-box";
22
+ import * as i9 from "devextreme-angular/ui/popup";
23
+ import * as i10 from "devextreme-angular/ui/scroll-view";
24
+ import * as i11 from "devextreme-angular/ui/select-box";
25
+ import * as i12 from "devextreme-angular/ui/tag-box";
26
+ import * as i13 from "devextreme-angular/ui/text-box";
27
+ import * as i14 from "@angular/forms";
28
+ import * as i15 from "@angular/material/icon";
29
+ import * as i16 from "../../shared/loading/loading.component";
30
+ import * as i17 from "../../application-view-components/create-comp-view/create-comp-view.component";
31
+ import * as i18 from "../../support-components/dash-chart/dash-chart.component";
32
+ import * as i19 from "../../support-components/dash-table/dash-table.component";
33
+ import * as i20 from "../../application-dataset-component/create-dataset/create-dataset.component";
34
+ import * as i21 from "../../common-header/common-header.component";
35
+ export class PageConfigMultilayoutComponent {
36
+ constructor(commonService, activatedRoute, viewContainerRef, componentFactoryResolver, service, toastr, router, datasetService) {
37
+ this.commonService = commonService;
38
+ this.activatedRoute = activatedRoute;
39
+ this.viewContainerRef = viewContainerRef;
40
+ this.componentFactoryResolver = componentFactoryResolver;
41
+ this.service = service;
42
+ this.toastr = toastr;
43
+ this.router = router;
44
+ this.datasetService = datasetService;
45
+ this.dashbord_container = [];
46
+ this.widget_width = ['w-full', 'w-1/2', 'w-1/3', 'w-2/3', 'w-1/4', 'w-3/4', 'w-1/5', 'w-4/5', 'w-1/6', 'w-5/6'];
47
+ this.loadingModal = true;
48
+ this.page_title = 'Dashboard';
49
+ this.isToggleSwich = true;
50
+ this.isDatePicker = false;
51
+ this.isToggleEventStatus = false;
52
+ this.isEditClick = false;
53
+ this.isUpdateWidget = false;
54
+ this.dynamicComponentRefs = [];
55
+ this.componentClassMap = {
56
+ GammaAdvanceChartComponent,
57
+ GammaTodayPreviousComponent,
58
+ AppAdvanceHeaderComponent,
59
+ GammaTableWithPercentageComponent,
60
+ GammSingleNumberCardComponent,
61
+ GammaAdvanceOperatorTableComponent,
62
+ AdvanceWidgetHeaderFilterComponent,
63
+ GammaGeoChartComponent
64
+ };
65
+ this.dataSourceMataData = [];
66
+ this.queryType = "mongo";
67
+ this.dataSetModal = [];
68
+ this.componentConfigDataSource = [];
69
+ this.dataSourceModal = {};
70
+ this.isDashBoardContent = false;
71
+ this.selectedViewFormComponent = {};
72
+ this.addedwidGetConfig = {
73
+ "display": true,
74
+ "widgetTitle": "",
75
+ "width": "",
76
+ "height": "",
77
+ "isWidgetFilter": false
78
+ };
79
+ this.dashBoardWidgetConfig = [];
80
+ this.selectedIndexObjForChart = {};
81
+ this.selectedContainerObjectForChart = {};
82
+ this.uniqueDataSetObject = {};
83
+ this.islayoutCreate = false;
84
+ this.isDefaultView = true;
85
+ this.viewToSearch = '';
86
+ this.filteredComponentConfig = [];
87
+ this.editViewdataSourceModal = {};
88
+ this.editItemForUpdate = {};
89
+ this.allWidgetByDataset = [];
90
+ this.nodeProperticeFilters = [];
91
+ this.selectedFilterDatasource = {};
92
+ this.selectedViewsIds = [];
93
+ this.advanceLayoutContainer = [];
94
+ }
95
+ ngOnInit() {
96
+ this.isDashBoardContentTypeView = (this.activatedRoute.snapshot.queryParams['contentType'] == 'view') ? true : false;
97
+ this.pageId = this.activatedRoute.snapshot.queryParams['pageId'];
98
+ this.getDataSet();
99
+ this.defaultStartDate = moment().subtract('10', 'days').format('YYYY-MM-DD');
100
+ this.defaultEndDate = moment().subtract('1', 'days').format('YYYY-MM-DD');
101
+ this.getFilterItems();
102
+ this.getAllViewsItems();
103
+ this.getAppPageDetailConfigByPageId();
104
+ }
105
+ getAllViewsItems() {
106
+ this.service.getAppViewConfigs().subscribe({
107
+ next: (data) => {
108
+ this.componentConfigDataSource = data;
109
+ this.filteredComponentConfig = this.componentConfigDataSource;
110
+ }, error: (err) => {
111
+ this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'View Config');
112
+ }
113
+ });
114
+ }
115
+ getFilterItems() {
116
+ this.service.getAppFilterConfigs().subscribe({
117
+ next: (data) => {
118
+ this.filterDataSource = data;
119
+ }, error: (err) => {
120
+ this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Error');
121
+ }
122
+ });
123
+ }
124
+ getAppPageDetailConfigByPageId() {
125
+ this.service.getAppPageDetailConfig(this.pageId).subscribe({
126
+ next: (data) => {
127
+ this.dashBoardWidgetConfig = data;
128
+ this.pageTitle = data.pageName;
129
+ this.pageUrl = data.pageUrl;
130
+ if (data.widgets && data.widgets.length !== 0) {
131
+ this.getComponentConfigSet();
132
+ }
133
+ else {
134
+ this.loadingModal = false;
135
+ }
136
+ },
137
+ error: (err) => {
138
+ this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Error');
139
+ }
140
+ });
141
+ }
142
+ getComponentConfigSet() {
143
+ let defaultFilters = { operationFilter: { startDate: "", endDate: "" } };
144
+ this.dashBoardWidgetConfig.widgets.forEach(widget => {
145
+ if (widget.filters) {
146
+ widget.filters.filterItems.forEach(element => {
147
+ if (element.filterType === 'date' || element.filterType === 'datetime') {
148
+ if (element.defaultFilterType === "dynamic" && element.momentFunction !== "" && element.defaultFilterValue !== "" && element.momentFormat !== "") {
149
+ let [count, unit] = element.defaultFilterValue.split(',');
150
+ if (element.apiName === "endDate") {
151
+ if (element.display) {
152
+ defaultFilters.operationFilter.endDate = moment()[element.momentFunction](parseInt(count), unit).format(element.momentFormat);
153
+ this.defaultEndDate = moment()[element.momentFunction](parseInt(count), unit).format(element.momentFormat);
154
+ }
155
+ }
156
+ if (element.apiName === "startDate") {
157
+ defaultFilters.operationFilter.startDate = moment()[element.momentFunction](parseInt(count), unit).format(element.momentFormat);
158
+ }
159
+ }
160
+ else if (element.defaultFilterType === "static" && element.defaultFilterValue !== "") {
161
+ if (element.apiName === "endDate") {
162
+ if (element.display) {
163
+ defaultFilters.operationFilter.endDate = element.defaultFilterValue;
164
+ this.defaultEndDate = element.defaultFilterValue;
165
+ }
166
+ }
167
+ if (element.apiName === "startDate") {
168
+ defaultFilters.operationFilter.startDate = element.defaultFilterValue;
169
+ this.defaultStartDate = element.defaultFilterValue;
170
+ }
171
+ }
172
+ }
173
+ else {
174
+ if ((typeof element.filterDataSourceValue === "string" && element.filterDataSourceValue !== "") ||
175
+ (Array.isArray(element.filterDataSourceValue) && element.filterDataSourceValue.length > 0)) {
176
+ if (element.operatorName !== "") {
177
+ defaultFilters.operationFilter[element.operatorName] = Array.isArray(element.filterDataSourceValue)
178
+ ? element.filterDataSourceValue
179
+ : [element.filterDataSourceValue];
180
+ }
181
+ else {
182
+ defaultFilters.operationFilter[element.apiName] = element.filterDataSourceValue.join(",");
183
+ }
184
+ }
185
+ }
186
+ });
187
+ }
188
+ });
189
+ let apiCalls = [];
190
+ this.defaultApplyedFilter = defaultFilters;
191
+ Promise.all(apiCalls).then(() => {
192
+ this.createDivElements(this.uniqueDataSetObject);
193
+ this.loadingModal = false;
194
+ });
195
+ }
196
+ ngOnDestroy() {
197
+ }
198
+ getDataSet() {
199
+ this.isLoader = true;
200
+ this.service.getAppDatasetConfigs().subscribe({
201
+ next: (data) => {
202
+ this.dataSettableDataSource = data;
203
+ this.isLoader = false;
204
+ }, error: (err) => {
205
+ this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Dataset Creation');
206
+ }
207
+ });
208
+ }
209
+ getComponentConfig(event) {
210
+ const foundObject = this.componentConfigDataSource.find(view => view.viewId === event.viewId);
211
+ this.getEmitNewChartConfig(foundObject);
212
+ this.loadingModal = true;
213
+ }
214
+ addNewchart() {
215
+ this.isGenerate = false;
216
+ this.isChartButtonClick = true;
217
+ this.isWidgetCreationContent = false;
218
+ this.isDefaultView = false;
219
+ }
220
+ addWidget() {
221
+ this.newWidgetIndex = undefined;
222
+ this.isWidgetCreationContent = true;
223
+ this.isDefaultView = false;
224
+ this.isEditMainLayout = false;
225
+ this.isChartButtonClick = false;
226
+ this.isUpdateWidget = false;
227
+ this.widgetName = '';
228
+ this.widgetTitle = '';
229
+ this.addedwidGetConfig = {
230
+ "display": true,
231
+ "widgetTitle": "",
232
+ "width": "",
233
+ "height": "",
234
+ "isWidgetFilter": false
235
+ };
236
+ }
237
+ getWith(e) {
238
+ this.selectedWidth = e.value;
239
+ }
240
+ getHeight(e) {
241
+ this.selectedHeight = e.value;
242
+ }
243
+ addLayoutTOview() {
244
+ let inner_node = {
245
+ id: this.commonService.primeryRendomeId(5),
246
+ nodeTitle: "",
247
+ filterId: this.selectedFilterId,
248
+ nodeProperties: this.addedwidGetConfig,
249
+ compConfig: {
250
+ dynamicComponentRefs: [],
251
+ viewConfig: []
252
+ },
253
+ };
254
+ if (this.dashBoardWidgetConfig.widgets[this.newWidgetIndex].widgetNode) {
255
+ this.dashBoardWidgetConfig.widgets[this.newWidgetIndex].widgetNode.push(inner_node);
256
+ }
257
+ else {
258
+ this.dashBoardWidgetConfig.widgets[this.newWidgetIndex].widgetNode = [];
259
+ this.dashBoardWidgetConfig.widgets[this.newWidgetIndex].widgetNode.push(inner_node);
260
+ }
261
+ this.loadingModal = true;
262
+ this.updateWidget();
263
+ }
264
+ reformatWidgetConfig(dashBoardWidgetConfig, index = null) {
265
+ const processWidget = (widget) => {
266
+ widget.compConfig.viewConfig = widget.compConfig.viewConfig.map(config => config.viewId);
267
+ widget.compConfig.dynamicComponentRefs = [];
268
+ if (widget.widgetNode && widget.widgetNode.length > 0) {
269
+ widget.widgetNode.forEach(node => {
270
+ node.compConfig.viewConfig = node.compConfig.viewConfig.map(config => config.viewId);
271
+ node.compConfig.dynamicComponentRefs = [];
272
+ });
273
+ }
274
+ };
275
+ if (index !== null && index >= 0 && index < dashBoardWidgetConfig.widgets.length) {
276
+ processWidget(dashBoardWidgetConfig.widgets[index]);
277
+ }
278
+ else {
279
+ dashBoardWidgetConfig.widgets.forEach(widget => processWidget(widget));
280
+ }
281
+ return dashBoardWidgetConfig.widgets[index];
282
+ }
283
+ updateWidget() {
284
+ let modifiedConfig = this.reformatWidgetConfig(this.dashBoardWidgetConfig, this.newWidgetIndex);
285
+ modifiedConfig['filterId'] = (modifiedConfig.filters && modifiedConfig.filters.filterId) ? modifiedConfig.filters.filterId : null;
286
+ delete modifiedConfig['filters'];
287
+ this.service.editAppWidgetConfig(modifiedConfig).subscribe({
288
+ next: (data) => {
289
+ this.getAppPageDetailConfigByPageId();
290
+ this.backToMainView();
291
+ }, error: (err) => {
292
+ this.loadingModal = false;
293
+ this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Widget Creation');
294
+ }
295
+ });
296
+ this.newWidgetIndex = undefined;
297
+ this.isWidgetCreationContent = false;
298
+ this.isDefaultView = true;
299
+ }
300
+ updateLayoutWidgetTOview() {
301
+ this.loadingModal = true;
302
+ this.updateWidget();
303
+ }
304
+ addWidgetTOview() {
305
+ let obj = {
306
+ widgetId: this.commonService.primeryRendomeId(5),
307
+ widgetName: this.widgetName,
308
+ widgetTitle: this.widgetTitle,
309
+ widgetProperties: this.addedwidGetConfig,
310
+ pageId: this.pageId,
311
+ filterId: this.selectedFilterId,
312
+ widgetNode: [],
313
+ compConfig: {
314
+ dynamicComponentRefs: [],
315
+ viewConfig: []
316
+ },
317
+ };
318
+ this.loadingModal = true;
319
+ this.service.createAppWidgetConfig(obj).subscribe({
320
+ next: (data) => {
321
+ this.loadingModal = false;
322
+ this.getAppPageDetailConfigByPageId();
323
+ }, error: (err) => {
324
+ this.loadingModal = false;
325
+ this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Widget Creation');
326
+ }
327
+ });
328
+ this.dashBoardWidgetConfig.widgets.push(obj);
329
+ this.dynamicContainer.nativeElement.innerHTML = '';
330
+ this.isWidgetCreationContent = false;
331
+ this.isDefaultView = true;
332
+ }
333
+ insertNewWiget(index) {
334
+ this.addedwidGetConfig = {
335
+ "display": true,
336
+ "widgetTitle": "",
337
+ "width": "",
338
+ "height": "",
339
+ "isWidgetFilter": false
340
+ };
341
+ this.isUpdateWidget = false;
342
+ this.isWidgetCreationContent = true;
343
+ this.isDefaultView = false;
344
+ this.isChartButtonClick = false;
345
+ this.islayoutCreate = true;
346
+ this.newWidgetIndex = index;
347
+ }
348
+ insertChartWiget(indexObj, containerElement) {
349
+ this.isGenerate = false;
350
+ this.isChartButtonClick = true;
351
+ this.isWidgetCreationContent = false;
352
+ this.isDefaultView = false;
353
+ this.selectedContainerObjectForChart = containerElement;
354
+ this.selectedIndexObjForChart = indexObj;
355
+ this.selectedViewFormComponent = {};
356
+ }
357
+ async getEmitNewChartConfig(data) {
358
+ this.selectedIndexObjForChart.compConfig.viewConfig.push(data);
359
+ this.loadDynamicComponent(data, this.selectedIndexObjForChart, this.selectedContainerObjectForChart);
360
+ console.log(this.dashBoardWidgetConfig);
361
+ this.updateWidget();
362
+ this.loadingModal = false;
363
+ this.isChartButtonClick = false;
364
+ }
365
+ updateToView() {
366
+ this.loadingModal = true;
367
+ this.updateWidget();
368
+ }
369
+ deleteWidget(item, index) {
370
+ this.dashBoardWidgetConfig.widgets.splice(index, 1);
371
+ this.newWidgetIndex = undefined;
372
+ }
373
+ deleteInsertWidget(item, childIndex, parentIndex) {
374
+ this.dashBoardWidgetConfig.widgets[parentIndex].widgetNode.splice(childIndex, 1);
375
+ this.newWidgetIndex = undefined;
376
+ }
377
+ getWidgetTitleDiv(item, div) {
378
+ const widgetDiv = document.createElement('div');
379
+ 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');
380
+ const titleDiv = document.createElement('div');
381
+ titleDiv.innerText = (item.nodeProperties) ? item.nodeProperties.widgetTitle : "";
382
+ widgetDiv.append(titleDiv);
383
+ const editIcon = document.createElement('i');
384
+ editIcon.classList.add('fa', 'fa-pencil', 'ml-2', 'cursor-pointer', 'text-blue-400', 'hover:text-blue-700');
385
+ widgetDiv.append(editIcon);
386
+ if (item.nodeProperties.isWidgetFilter) {
387
+ const searchContainerDiv = document.createElement('div');
388
+ searchContainerDiv.classList.add('flex', 'items-center', 'space-x-2');
389
+ const searchButton = document.createElement('button');
390
+ searchButton.innerText = 'Filter';
391
+ searchButton.classList.add('px-3', 'py-1.5', 'bg-blue-600', 'mr-2', 'text-white', 'rounded', 'hover:bg-blue-700');
392
+ this.nodeproperticeFilterDataSource = [];
393
+ searchButton.addEventListener('click', () => {
394
+ this.isWidgetFilters = true;
395
+ let filtePropertice = [];
396
+ item.compConfig.viewConfig.forEach(element => {
397
+ let key_name = this.uniqueDataSetObject[element.datasetId][0];
398
+ Object.keys(key_name).forEach(key => {
399
+ if (!filtePropertice.includes(key)) {
400
+ filtePropertice.push(key);
401
+ }
402
+ });
403
+ });
404
+ filtePropertice.forEach(element => {
405
+ let obj = {
406
+ columnName: element,
407
+ dataType: "float",
408
+ operator: "",
409
+ value: "",
410
+ };
411
+ this.nodeproperticeFilterDataSource.push(obj);
412
+ });
413
+ });
414
+ searchContainerDiv.appendChild(searchButton);
415
+ widgetDiv.appendChild(titleDiv);
416
+ widgetDiv.appendChild(searchContainerDiv);
417
+ }
418
+ if (item.filterId) {
419
+ this.nodeproperticeFilterDataSource = {};
420
+ this.nodeproperticeFilterDataSource['viewConfig'] = item;
421
+ this.nodeproperticeFilterDataSource['havingConfig'] = [];
422
+ this.service.getAppFilterConfig(item.filterId).subscribe({
423
+ next: (data) => {
424
+ const filterDiv = document.createElement('div');
425
+ this.loadWidgetFilterComponent(item, widgetDiv, data.filterItems);
426
+ }, error: (err) => {
427
+ }
428
+ });
429
+ }
430
+ if (item.nodeProperties.nodefilters && item.nodeProperties.nodefilters.length !== 0) {
431
+ const searchContainerDiv = document.createElement('div');
432
+ searchContainerDiv.classList.add('flex', 'items-center', 'space-x-2');
433
+ item.nodeProperties.nodefilters.forEach(filter => {
434
+ const filterDiv = document.createElement('div');
435
+ filterDiv.classList.add('flex', 'items-center');
436
+ if (filter.input_type === 'text') {
437
+ const textBox = document.createElement('input');
438
+ textBox.type = 'text';
439
+ textBox.placeholder = `Enter ${filter.local_column}`;
440
+ textBox.classList.add('px-2', 'py-1.5', 'rounded', 'border', 'mr-1', 'border-gray-500', 'text-gray-900', 'dark:bg-gray-700', 'dark:text-white');
441
+ const searchButton = document.createElement('button');
442
+ searchButton.innerText = 'Search';
443
+ searchButton.classList.add('px-3', 'py-1.5', 'bg-blue-600', 'mr-2', 'text-white', 'rounded', 'hover:bg-blue-700');
444
+ const separerotButton = document.createElement('div');
445
+ separerotButton.innerHTML = '|';
446
+ searchButton.addEventListener('click', () => {
447
+ const searchTerm = textBox.value;
448
+ console.log('Text search button clicked with:', searchTerm);
449
+ });
450
+ filterDiv.appendChild(textBox);
451
+ filterDiv.appendChild(searchButton);
452
+ filterDiv.appendChild(separerotButton);
453
+ }
454
+ searchContainerDiv.appendChild(filterDiv);
455
+ });
456
+ widgetDiv.appendChild(searchContainerDiv);
457
+ }
458
+ editIcon.addEventListener('click', () => {
459
+ this.newWidgetIndex = this.dashBoardWidgetConfig.widgets.findIndex(object => object.widgetId === div.widgetId);
460
+ this.isUpdateWidget = true;
461
+ this.islayoutCreate = true;
462
+ this.isWidgetCreationContent = true;
463
+ this.isDefaultView = false;
464
+ this.isChartButtonClick = false;
465
+ this.nodeProperticeFilters = (item.nodeProperties.nodefilters && item.nodeProperties.nodefilters.length !== 0) ? item.nodeProperties.nodefilters : [];
466
+ item.nodeProperties['nodefilters'] = this.nodeProperticeFilters;
467
+ this.addedwidGetConfig = item.nodeProperties;
468
+ this.allWidgetInnerContent = item.compConfig.viewConfig;
469
+ this.selectedFilterId = (item.filterId) ? item.filterId : "";
470
+ this.editViewdataSourceModal = {};
471
+ this.selectedFilterDatasource = item;
472
+ });
473
+ return widgetDiv;
474
+ }
475
+ getFilterValueById(event) {
476
+ if (event.event) {
477
+ this.service.getAppFilterConfig(event.value).subscribe({
478
+ next: (data) => {
479
+ if (Object.keys(this.selectedFilterDatasource).length !== 0) {
480
+ this.selectedFilterDatasource.filterId = this.selectedFilterId;
481
+ }
482
+ else {
483
+ this.dashBoardWidgetConfig.widgets[this.newWidgetIndex].filters = data;
484
+ }
485
+ this.toastr.success("Filter Changed");
486
+ }, erroe: (err) => {
487
+ this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Filter Update');
488
+ }
489
+ });
490
+ }
491
+ }
492
+ createDivElements(datasetById) {
493
+ const container = this.dynamicContainer.nativeElement;
494
+ container.innerHTML = "";
495
+ const multiItemDiv = document.createElement('div');
496
+ multiItemDiv.classList.add("flex", "flex-row", "justify-between");
497
+ const context_filter = this.dashBoardWidgetConfig.filters ? this.dashBoardWidgetConfig.filters.filterItems : null;
498
+ this.dashBoardWidgetConfig.widgets.forEach(async (div) => {
499
+ const rowDiv = document.createElement('div');
500
+ let w_height = (div.widgetProperties.height == "") ? "h-auto" : 'h-[' + div.widgetProperties.height + ']';
501
+ rowDiv.classList.add(div.widgetProperties.width, w_height, 'border');
502
+ const filterDiv = document.createElement('div');
503
+ const filterItems = (div.filters) ? div.filters.filterItems : [];
504
+ this.loadFilterComponent(div, filterDiv, filterItems, context_filter);
505
+ rowDiv.appendChild(filterDiv);
506
+ if (div.widgetNode && div.widgetNode.length && div.widgetNode.length != 0) {
507
+ const mainItemDiv = document.createElement('div');
508
+ mainItemDiv.classList.add("flex", "flex-wrap", "w-full");
509
+ this.loadWidgetNodes(div, mainItemDiv, datasetById);
510
+ rowDiv.appendChild(mainItemDiv);
511
+ }
512
+ const p_innerDiv = document.createElement('div');
513
+ p_innerDiv.classList.add('rounded', 'justify-center', 'items-center', 'border', 'p-1', 'm-1', 'flex', 'flex-row');
514
+ const p_button_widget = document.createElement('div');
515
+ p_button_widget.innerText = 'Add Single Layout';
516
+ p_button_widget.classList.add('bg-blue-700', "p-1", "w-fit", "cursor-pointer", 'text-xs');
517
+ p_button_widget.addEventListener('click', () => {
518
+ let index = this.dashBoardWidgetConfig.widgets.findIndex(object => object.widgetId === div.widgetId);
519
+ this.insertNewWiget(index);
520
+ });
521
+ const p_del_button = document.createElement('div');
522
+ p_del_button.innerText = 'Detete layout';
523
+ p_del_button.classList.add('bg-red-700', "p-1", "w-fit", "cursor-pointer", 'text-xs');
524
+ p_del_button.addEventListener('click', () => {
525
+ let result = confirm("<i>Are You Sure?</i>", "Delete Layout");
526
+ result.then((dialogResult) => {
527
+ if (dialogResult) {
528
+ this.loadingModal = true;
529
+ this.dashBoardWidgetConfig.widgets = this.dashBoardWidgetConfig.widgets.map(config => config.widgetId);
530
+ rowDiv.remove();
531
+ this.service.editAppPageConfig(this.dashBoardWidgetConfig).subscribe({
532
+ next: (data) => {
533
+ this.getAppPageDetailConfigByPageId();
534
+ }, error: (err) => {
535
+ this.loadingModal = false;
536
+ this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Widget Creation');
537
+ }
538
+ });
539
+ this.newWidgetIndex = undefined;
540
+ this.isWidgetCreationContent = false;
541
+ this.isDefaultView = true;
542
+ }
543
+ });
544
+ });
545
+ const advance_button = document.createElement('div');
546
+ advance_button.innerText = 'Advance Layout';
547
+ advance_button.classList.add('bg-yellow-700', "p-1", "w-fit", "cursor-pointer", 'text-xs');
548
+ advance_button.addEventListener('click', () => {
549
+ const comp_object = this.findWidgetById(this.dashBoardWidgetConfig.widgets, div.widgetId);
550
+ this.newWidgetIndex = this.dashBoardWidgetConfig.widgets.findIndex(object => object.widgetId === div.widgetId);
551
+ this.isAdvanceLayout = true;
552
+ });
553
+ p_innerDiv.appendChild(advance_button);
554
+ p_innerDiv.appendChild(p_button_widget);
555
+ p_innerDiv.appendChild(p_del_button);
556
+ if (!this.isDashBoardContentTypeView) {
557
+ rowDiv.appendChild(p_innerDiv);
558
+ }
559
+ multiItemDiv.appendChild(rowDiv);
560
+ container.appendChild(multiItemDiv);
561
+ });
562
+ }
563
+ loadWidgetNodes(div, mainItemDiv, datasetById) {
564
+ div.widgetNode.forEach(item => {
565
+ this.loadSingleWidgetNode(item, mainItemDiv, datasetById, div);
566
+ });
567
+ }
568
+ loadSingleWidgetNode(item, containerElement, datasetById, div) {
569
+ let w_height = (item.nodeProperties.height == "") ? "h-auto" : 'h-[' + item.nodeProperties.height + ']';
570
+ let w_width = (item.nodeProperties.width == "") ? "w-full" : item.nodeProperties.width;
571
+ const itemDiv = document.createElement('div');
572
+ itemDiv.classList.add(w_width, w_height, 'border', 'p-1');
573
+ const flexContainer = document.createElement('div');
574
+ flexContainer.classList.add('flex', 'justify-between', 'items-center', 'text-gray-900', 'dark:text-white', 'bg-gray-800', 'mx-2', 'rounded-t-lg');
575
+ const widgetDiv = this.getWidgetTitleDiv(item, div);
576
+ item.compConfig.viewConfig.forEach(element => {
577
+ if (element.kpiConfig) {
578
+ let apiCalls = [];
579
+ this.service.getAppDatasetConfig(element.datasetId).subscribe({
580
+ next: (dataset) => {
581
+ if (dataset.datasetType !== "sqlQuery" && dataset.datasetType !== "plainjson") {
582
+ const datasetWithLimit = this.setDataSetsLimit(dataset);
583
+ apiCalls.push(this.datasetService.getDataFromDataSet(datasetWithLimit, datasetWithLimit.datasetId, this.defaultApplyedFilter));
584
+ }
585
+ else {
586
+ apiCalls.push(this.datasetService.getDataFromDataSet(dataset, dataset.datasetId, this.defaultApplyedFilter));
587
+ }
588
+ Promise.all(apiCalls).then(() => {
589
+ this.uniqueDataSetObject = this.datasetService.getUniqueDataSetObject();
590
+ element.kpiConfig['dataSource'] = this.uniqueDataSetObject[element.datasetId];
591
+ const comp_object = this.findWidgetById(this.dashBoardWidgetConfig.widgets, item.id);
592
+ this.loadDynamicComponent(element, comp_object, itemDiv);
593
+ });
594
+ }, error: (err) => {
595
+ }
596
+ });
597
+ }
598
+ });
599
+ flexContainer.appendChild(widgetDiv);
600
+ const buttonsContainer = document.createElement('div');
601
+ buttonsContainer.classList.add('flex', 'mx-2');
602
+ const innerDiv = document.createElement('div');
603
+ innerDiv.classList.add('rounded', 'justify-center', 'items-center', 'p-1', 'm-1', 'flex', 'flex-row');
604
+ const button_chart = document.createElement('div');
605
+ button_chart.innerText = 'Add View';
606
+ button_chart.classList.add('bg-green-700', "p-1", "w-fit", "cursor-pointer", 'text-xs');
607
+ button_chart.addEventListener('click', () => {
608
+ this.newWidgetIndex = this.dashBoardWidgetConfig.widgets.findIndex(object => object.widgetId === div.widgetId);
609
+ const comp_object = this.findWidgetById(this.dashBoardWidgetConfig.widgets, item.id);
610
+ this.insertChartWiget(comp_object, itemDiv);
611
+ });
612
+ const del_button_chart = document.createElement('div');
613
+ del_button_chart.innerText = 'Detete';
614
+ del_button_chart.classList.add('bg-red-700', "p-1", "w-fit", "cursor-pointer", 'text-xs');
615
+ del_button_chart.addEventListener('click', () => {
616
+ let result = confirm("<i>Are You Sure?</i>", "Delete View");
617
+ result.then((dialogResult) => {
618
+ if (dialogResult) {
619
+ let widgetIndex = this.dashBoardWidgetConfig.widgets.findIndex(object => object.widgetId === div.widgetId);
620
+ const mapedObject = this.dashBoardWidgetConfig.widgets[widgetIndex];
621
+ if (mapedObject.widgetNode && mapedObject.widgetNode.length > 0) {
622
+ let mapIndex = mapedObject.widgetNode.findIndex(ind => ind.id === item.id);
623
+ mapedObject.widgetNode.forEach(node => {
624
+ node.compConfig.viewConfig = node.compConfig.viewConfig.map(config => config.viewId);
625
+ node.compConfig.dynamicComponentRefs = [];
626
+ });
627
+ mapedObject.widgetNode.splice(mapIndex, 1);
628
+ }
629
+ mapedObject['filterId'] = (mapedObject.filters) ? mapedObject.filters.filterId : null;
630
+ delete mapedObject['filters'];
631
+ mapedObject.compConfig.dynamicComponentRefs = [];
632
+ this.service.editAppWidgetConfig(mapedObject).subscribe({
633
+ next: (data) => {
634
+ this.getAppPageDetailConfigByPageId();
635
+ }, error: (err) => {
636
+ this.loadingModal = false;
637
+ this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Widget Creation');
638
+ }
639
+ });
640
+ this.newWidgetIndex = undefined;
641
+ itemDiv.remove();
642
+ }
643
+ });
644
+ });
645
+ buttonsContainer.appendChild(button_chart);
646
+ buttonsContainer.appendChild(del_button_chart);
647
+ flexContainer.appendChild(buttonsContainer);
648
+ if (!this.isDashBoardContentTypeView) {
649
+ }
650
+ itemDiv.appendChild(flexContainer);
651
+ containerElement.appendChild(itemDiv);
652
+ }
653
+ findWidgetById(configs, id) {
654
+ for (const config of configs) {
655
+ if (config.id === id) {
656
+ return config;
657
+ }
658
+ if (config.widgetNode && config.widgetNode.length > 0) {
659
+ const found = this.findWidgetById(config.widgetNode, id);
660
+ if (found) {
661
+ return found;
662
+ }
663
+ }
664
+ }
665
+ return undefined;
666
+ }
667
+ deleteWidgetById(configs, id) {
668
+ for (let i = configs.length - 1; i >= 0; i--) {
669
+ if (configs[i].id === id) {
670
+ configs.splice(i, 1);
671
+ }
672
+ else if (configs[i].widgetNode && configs[i].widgetNode.length > 0) {
673
+ this.deleteWidgetById(configs[i].widgetNode, id);
674
+ }
675
+ }
676
+ }
677
+ loadDynamicComponent(data, indexObj, containerElement) {
678
+ const componentClass = this.componentClassMap[data.kpiConfig['componentName']];
679
+ this.CompRefs = this.viewContainerRef.createComponent(componentClass);
680
+ const dynamicComponentInstance = this.CompRefs.instance;
681
+ dynamicComponentInstance.chartDataSource = data;
682
+ dynamicComponentInstance.kpi_name = "";
683
+ indexObj.compConfig.dynamicComponentRefs.push(this.CompRefs);
684
+ const cssClass = "w-full";
685
+ this.CompRefs.location.nativeElement.classList.add(cssClass);
686
+ containerElement.appendChild(this.CompRefs.location.nativeElement);
687
+ }
688
+ loadFilterComponent(indexObj, containerElement, filterItems, context_filter) {
689
+ let selectedDates = { startDate: this.defaultStartDate, endDate: this.defaultEndDate };
690
+ const componentClass = this.componentClassMap['AppAdvanceHeaderComponent'];
691
+ this.CompRefs = this.viewContainerRef.createComponent(componentClass);
692
+ const dynamicComponentInstance = this.CompRefs.instance;
693
+ dynamicComponentInstance.selectedDates = selectedDates;
694
+ dynamicComponentInstance.filterItems = filterItems;
695
+ dynamicComponentInstance.contextFilterItems = context_filter;
696
+ dynamicComponentInstance.pageTitle = this.pageTitle;
697
+ dynamicComponentInstance.isEditButton = false;
698
+ dynamicComponentInstance.isAdvanceButton = true;
699
+ indexObj.compConfig.dynamicComponentRefs.push(this.CompRefs);
700
+ const cssClass = "w-full";
701
+ this.CompRefs.location.nativeElement.classList.add(cssClass);
702
+ containerElement.appendChild(this.CompRefs.location.nativeElement);
703
+ }
704
+ loadWidgetFilterComponent(indexObj, containerElement, filterItems) {
705
+ let userName = localStorage.getItem('user_name');
706
+ let selectedDates = { startDate: this.defaultStartDate, endDate: this.defaultEndDate };
707
+ const componentClass = this.componentClassMap['AdvanceWidgetHeaderFilterComponent'];
708
+ this.CompRefs = this.viewContainerRef.createComponent(componentClass);
709
+ const dynamicComponentInstance = this.CompRefs.instance;
710
+ dynamicComponentInstance.selectedDates = selectedDates;
711
+ dynamicComponentInstance.filterItems = filterItems;
712
+ dynamicComponentInstance.getWidgetFilterConfig.subscribe((value) => {
713
+ this.getWidgetFilterForTemplate(value);
714
+ });
715
+ indexObj.compConfig.dynamicComponentRefs.push(this.CompRefs);
716
+ containerElement.appendChild(this.CompRefs.location.nativeElement);
717
+ }
718
+ getDeleteViewFromConfig(index) {
719
+ console.log(index);
720
+ this.allWidgetInnerContent.splice(index, 1);
721
+ }
722
+ moveItemForPageView(index, direction) {
723
+ if (index < 0 || index >= this.dashBoardWidgetConfig.widgets[this.newWidgetIndex].widgetNode.length)
724
+ return;
725
+ const newPosition = direction === 'up' ? index - 1 : index + 1;
726
+ if (newPosition < 0 || newPosition >= this.dashBoardWidgetConfig.widgets[this.newWidgetIndex].widgetNode.length)
727
+ return;
728
+ const itemToMove = this.dashBoardWidgetConfig.widgets[this.newWidgetIndex].widgetNode[index];
729
+ this.dashBoardWidgetConfig.widgets[this.newWidgetIndex].widgetNode.splice(index, 1);
730
+ this.dashBoardWidgetConfig.widgets[this.newWidgetIndex].widgetNode.splice(newPosition, 0, itemToMove);
731
+ }
732
+ moveItemForColumns(index, direction) {
733
+ if (index < 0 || index >= this.allWidgetInnerContent.length)
734
+ return;
735
+ const newPosition = direction === 'up' ? index - 1 : index + 1;
736
+ if (newPosition < 0 || newPosition >= this.allWidgetInnerContent.length)
737
+ return;
738
+ const itemToMove = this.allWidgetInnerContent[index];
739
+ this.allWidgetInnerContent.splice(index, 1);
740
+ this.allWidgetInnerContent.splice(newPosition, 0, itemToMove);
741
+ }
742
+ moveItemForWidget(index, direction) {
743
+ if (index < 0 || index >= this.dashBoardWidgetConfig.widgets.length)
744
+ return;
745
+ const newPosition = direction === 'up' ? index - 1 : index + 1;
746
+ if (newPosition < 0 || newPosition >= this.dashBoardWidgetConfig.widgets.length)
747
+ return;
748
+ const itemToMove = this.dashBoardWidgetConfig.widgets[index];
749
+ this.dashBoardWidgetConfig.widgets.splice(index, 1);
750
+ this.dashBoardWidgetConfig.widgets.splice(newPosition, 0, itemToMove);
751
+ }
752
+ getEditViewFromLayout(data, index) {
753
+ this.isEditMainLayout = true;
754
+ this.newWidgetIndex = index;
755
+ this.isWidgetCreationContent = true;
756
+ this.isDefaultView = false;
757
+ this.isChartButtonClick = false;
758
+ this.isUpdateWidget = false;
759
+ this.widgetName = data.widgetName;
760
+ this.widgetTitle = data.widgetTitle;
761
+ this.selectedFilterId = data.filters.filterId;
762
+ this.addedwidGetConfig = data.widgetProperties;
763
+ }
764
+ backToMainView() {
765
+ this.isDefaultView = true;
766
+ this.isUpdateWidget = false;
767
+ this.isWidgetCreationContent = false;
768
+ this.isChartButtonClick = false;
769
+ this.isEditMainLayout = false;
770
+ this.islayoutCreate = false;
771
+ this.newWidgetIndex = undefined;
772
+ this.selectedFilterId = undefined;
773
+ }
774
+ filterViews() {
775
+ if (this.viewToSearch.trim() !== '') {
776
+ this.filteredComponentConfig = this.componentConfigDataSource.filter((item) => item.viewName.toLowerCase().includes(this.viewToSearch.toLowerCase()));
777
+ }
778
+ else {
779
+ this.filteredComponentConfig = this.componentConfigDataSource;
780
+ }
781
+ }
782
+ editComponentViews(item) {
783
+ this.loadingModal = true;
784
+ this.editItemForUpdate = item;
785
+ if (this.isUpdateWidget && !this.isChartButtonClick) {
786
+ this.selectedViewId = item.viewId;
787
+ setTimeout(() => {
788
+ this.isCreateNewViewWithDefaultView = true;
789
+ this.loadingModal = false;
790
+ }, 400);
791
+ }
792
+ else {
793
+ let navigation = {
794
+ queryParams: {
795
+ 'viewId': item.viewId,
796
+ 'pageId': this.pageId
797
+ }
798
+ };
799
+ this.router.navigate(['apps/controlPanel/applicationContent/applicationViews'], navigation);
800
+ }
801
+ }
802
+ editComponentDatasets(item) {
803
+ this.loadingModal = true;
804
+ this.editItemForUpdate = item;
805
+ if (this.isUpdateWidget && !this.isChartButtonClick) {
806
+ this.selectedDatasetId = item.datasetId;
807
+ setTimeout(() => {
808
+ this.isCreateDatasetWithDatasetId = true;
809
+ this.loadingModal = false;
810
+ }, 400);
811
+ }
812
+ else {
813
+ let navigation = {
814
+ queryParams: {
815
+ 'viewId': item.viewId,
816
+ 'pageId': this.pageId
817
+ }
818
+ };
819
+ this.router.navigate(['apps/controlPanel/applicationContent/applicationViews'], navigation);
820
+ }
821
+ }
822
+ getAllPage() {
823
+ this.router.navigate(['apps/controlPanel/applicationContent/applicationDashboard']);
824
+ }
825
+ transformColumnsForColumns(inputColumns) {
826
+ const columns = [];
827
+ inputColumns.forEach(col => {
828
+ columns.push({
829
+ dataField: col.dataField,
830
+ visible: true,
831
+ caption: col.caption,
832
+ });
833
+ });
834
+ return columns;
835
+ }
836
+ getCreateDataSetPage() {
837
+ this.isCreateDataset = true;
838
+ }
839
+ getCreateViewPage() {
840
+ this.selectedViewId = undefined;
841
+ this.loadingModal = true;
842
+ setTimeout(() => {
843
+ this.isCreateNewView = true;
844
+ this.loadingModal = false;
845
+ }, 400);
846
+ }
847
+ getEmitNewChartCongig(event) {
848
+ delete event.kpiConfig.dataSource;
849
+ this.editItemForUpdate['kpiConfig'] = event.kpiConfig;
850
+ console.log(this.editItemForUpdate);
851
+ this.service.updateAppViewConfig(this.editItemForUpdate).subscribe({
852
+ next: (data) => {
853
+ this.isEditOptionClick = false;
854
+ this.toastr.success('View Update Successfully');
855
+ }, error: (err) => {
856
+ this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'View Creation');
857
+ }
858
+ });
859
+ }
860
+ getViewPage() {
861
+ let navigationExtras = {
862
+ queryParams: {
863
+ "pageId": this.pageId
864
+ }
865
+ };
866
+ this.router.navigate([this.pageUrl], navigationExtras);
867
+ }
868
+ getNodeProperticeFilterOption() {
869
+ let obj = {
870
+ input_type: "text",
871
+ server_column: "",
872
+ local_column: "",
873
+ select_box_option: "",
874
+ };
875
+ this.nodeProperticeFilters.push(obj);
876
+ }
877
+ deleteNodeFilter(index) {
878
+ this.nodeProperticeFilters.splice(index, 1);
879
+ }
880
+ setDataSetsLimit(dataset) {
881
+ let limit = { "limit": "10" };
882
+ dataset.config.queryConfig.reqFields.push(limit);
883
+ return dataset;
884
+ }
885
+ getViewPopupHide(e) {
886
+ this.getAllViewsItems();
887
+ }
888
+ getDatasetPopupHide(e) {
889
+ }
890
+ submitFilter() {
891
+ }
892
+ getWidgetFilterForTemplate(value) {
893
+ this.getDataSet();
894
+ }
895
+ getDeleteViewFromLayout(item, i) {
896
+ this.dashBoardWidgetConfig.widgets.splice(i, 1);
897
+ this.dashBoardWidgetConfig.widgets.forEach(widget => {
898
+ widget.compConfig.viewConfig = widget.compConfig.viewConfig.map(config => config.viewId);
899
+ widget.compConfig.dynamicComponentRefs = [];
900
+ if (widget.widgetNode && widget.widgetNode.length > 0) {
901
+ widget.widgetNode.forEach(node => {
902
+ node.compConfig.viewConfig = node.compConfig.viewConfig.map(config => config.viewId);
903
+ node.compConfig.dynamicComponentRefs = [];
904
+ });
905
+ }
906
+ });
907
+ const widgetData = this.dashBoardWidgetConfig;
908
+ widgetData['widgets'] = this.dashBoardWidgetConfig.widgets.map(item => item.widgetId);
909
+ widgetData['filterId'] = (widgetData.filters) ? widgetData.filters.filterId : null;
910
+ delete widgetData['filters'];
911
+ this.service.editAppPageConfig(widgetData).subscribe({
912
+ next: (data) => {
913
+ this.toastr.success("Layout Deleted Successfully");
914
+ this.getAppPageDetailConfigByPageId();
915
+ }, error: (err) => {
916
+ this.loadingModal = false;
917
+ this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Widget Creation');
918
+ }
919
+ });
920
+ }
921
+ getProcessForConfig() {
922
+ this.advanceLayoutContainer = [];
923
+ const filteredColumns = this.componentConfigDataSource.filter(column => this.selectedViewsIds.includes(column.viewId));
924
+ const columnDefList = [];
925
+ filteredColumns.forEach(element => {
926
+ let obj = {
927
+ "id": this.commonService.primeryRendomeId(5),
928
+ "nodeTitle": "",
929
+ "compConfig": {
930
+ "dynamicComponentRefs": [],
931
+ "viewConfig": [element]
932
+ },
933
+ "filterId": null,
934
+ "nodeProperties": {
935
+ "display": true,
936
+ "widgetTitle": "",
937
+ "width": "",
938
+ "height": "",
939
+ "isWidgetFilter": false
940
+ }
941
+ };
942
+ this.advanceLayoutContainer.push(obj);
943
+ });
944
+ this.isProceed = true;
945
+ }
946
+ getSelectedColumnSource(event) {
947
+ if (event.event) {
948
+ this.selectedViewsIds = event.value;
949
+ }
950
+ }
951
+ submitAdvanceView() {
952
+ if (this.dashBoardWidgetConfig.widgets[this.newWidgetIndex].widgetNode && this.dashBoardWidgetConfig.widgets[this.newWidgetIndex].widgetNode.length !== 0) {
953
+ this.dashBoardWidgetConfig.widgets[this.newWidgetIndex].widgetNode = [...this.dashBoardWidgetConfig.widgets[this.newWidgetIndex].widgetNode, ...this.advanceLayoutContainer];
954
+ }
955
+ else {
956
+ this.dashBoardWidgetConfig.widgets[this.newWidgetIndex].widgetNode = this.advanceLayoutContainer;
957
+ }
958
+ this.isAdvanceLayout = false;
959
+ this.advanceLayoutContainer = [];
960
+ this.isProceed = false;
961
+ this.updateWidget();
962
+ }
963
+ deleteView(i) {
964
+ }
965
+ }
966
+ PageConfigMultilayoutComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PageConfigMultilayoutComponent, deps: [{ token: i1.CommonService }, { token: i2.ActivatedRoute }, { token: i0.ViewContainerRef }, { token: i0.ComponentFactoryResolver }, { token: i3.ApplicationContentService }, { token: i4.ToastrService }, { token: i2.Router }, { token: i5.ApplicationDatssetsCall }], target: i0.ɵɵFactoryTarget.Component });
967
+ PageConfigMultilayoutComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: PageConfigMultilayoutComponent, selector: "app-dashbord-config", 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: "scrollView", first: true, predicate: DxScrollViewComponent, descendants: true }], ngImport: i0, template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n\n<div class=\"flex flex-row h-[90vh] w-full\">\n <div class=\"w-3/4 border-r h-full flex flex-col px-2\">\n <!-- Scrollable content -->\n <div class=\"flex-grow overflow-y-auto\">\n <div class=\"flex flex-wrap my-3\" #dynamicContainer></div>\n </div>\n\n <!-- Fixed bottom section -->\n <div class=\"flex flex-row justify-center items-center h-16 m-2 border shrink-0\">\n <lib-common-header [pageTitle]=\"''\"></lib-common-header>\n <div class=\"{{commonService.btn_primary_md}} m-2\" (click)=\"addWidget()\">Add Layout</div>\n <div class=\"{{commonService.btnOthersPurple}} m-2 cursor-pointer\" (click)=\"getViewPage()\">View Page</div>\n </div>\n </div>\n <div class=\"w-1/4 p-2 h-full\">\n <ng-container *ngIf=\"isDashBoardContent\">\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursar-pointer\" (click)=\"backToMainView()\">\n Back\n </div>\n <ng-container *ngFor=\"let item of page_config.api_config; let i = index\">\n <div class=\"mb-2 flex flex-row justify-between items-center border-b\">\n <div class=\"text-md py-2 font-bold text-white px-2\">\n {{item.widGetConfig.widgetTitle}}\n </div>\n <div class=\"flex space-x-2\">\n <!-- <button (click)=\"editSelectedWidget(item, i)\"\n class=\"w-8 h-8 bg-sky-600 hover:bg-blue-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-edit\"></i>\n </button> -->\n <button\n class=\"w-8 h-8 bg-red-600 hover:bg-red-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-trash-o\"></i>\n </button>\n </div>\n </div>\n\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"isWidgetCreationContent\">\n <h6 class=\"mb-2 font-bold text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3\">\n <span *ngIf=\"!islayoutCreate\">Widget Settings</span>\n <span *ngIf=\"islayoutCreate\">Layout Settings</span>\n </h6>\n <div class=\"flex flex-row my-4\">\n <dx-check-box class=\"ml-auto\" [(ngModel)]=\"addedwidGetConfig.display\" text=\"Display\"></dx-check-box>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Width</span>\n <dx-select-box class=\"w-1/2\" [items]=\"widget_width\"\n [(ngModel)]=\"addedwidGetConfig.width\"></dx-select-box>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Height</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"addedwidGetConfig.height\"></dx-text-box>\n </div>\n\n <div class=\"flex flex-row mb-2 justify-between\" *ngIf=\"!islayoutCreate\">\n <div class=\"text-md my-auto px-2\">Widget Title</div>\n <div><dx-text-box class=\"w-1/2\" [(ngModel)]=\"widgetTitle\"></dx-text-box></div>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\" *ngIf=\"!islayoutCreate\">\n <span class=\"text-md my-auto px-2\">Widget Name</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"widgetName\"></dx-text-box>\n </div>\n\n\n <div class=\"flex flex-row mb-5 justify-between\" *ngIf=\"islayoutCreate\">\n <span class=\"text-sm my-auto px-2\">Layout Title</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"addedwidGetConfig.widgetTitle\"></dx-text-box>\n </div>\n\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Filter</span>\n <dx-select-box class=\"w-1/2\" [items]=\"filterDataSource\" displayExpr=\"filterName\" [searchEnabled]=\"true\"\n valueExpr=\"filterId\" [(ngModel)]=\"selectedFilterId\"\n (onValueChanged)=\"getFilterValueById($event)\"></dx-select-box>\n </div>\n <ng-container *ngIf=\"!isUpdateWidget\">\n <div class=\"mt-6\" *ngIf=\"!islayoutCreate && isEditMainLayout\">\n <ng-container\n *ngFor=\"let item of dashBoardWidgetConfig.widgets[newWidgetIndex].widgetNode;let i = index\">\n <div class=\"mb-2 flex flex-row justify-between items-center border-b \">\n <div class=\"text-md py-2 font-bold text-white px-2\">\n {{item.nodeProperties.widgetTitle}}\n </div>\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForPageView(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n *ngIf=\"i !== dashBoardWidgetConfig.widgets[newWidgetIndex].widgetNode.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForPageView(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button\n class=\"w-8 h-8 bg-red-600 hover:bg-red-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-trash-o\"></i>\n </button>\n </div>\n </div>\n\n </ng-container>\n </div>\n </ng-container>\n\n\n\n <ng-container *ngIf=\"isUpdateWidget\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Application Views\n </div>\n <div class=\"border-x border-b p-2\">\n <ng-container *ngFor=\"let item of allWidgetInnerContent; let i = index\">\n <div class=\"group w-full flex justify-between border-b items-center\">\n <div class=\"text-md font-bold py-2 cursor-pointer\">\n {{item.viewName}}\n </div>\n\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== allWidgetInnerContent.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"editComponentViews(item)\">\n <i class=\"fa fa-eye\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"editComponentDatasets(item)\">\n <i class=\"fa fa-database\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-red-500 hover:bg-red-700 mb-2\"\n (click)=\"getDeleteViewFromConfig(i)\">\n <i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n </div>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isUpdateWidget\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Add Filter For View\n\n </div>\n <div class=\"border-x border-b p-2\">\n <div class=\"flex flex-row py-3 border-b\">\n <dx-check-box [(ngModel)]=\"addedwidGetConfig.isWidgetFilter\"\n text=\"Popup Columns Filter Enable\"></dx-check-box>\n </div>\n <div class=\"flex flex-row my-2 border-b\">\n <ng-container *ngFor=\"let item of nodeProperticeFilters; let i = index\">\n <div class=\"flex flex-wrap border-b\">\n <div class=\"px-1 w-1/3\">\n <div class=\"text-md\">Input Type</div>\n <dx-select-box [items]=\"['text']\" [(ngModel)]=\"item.input_type\"\n value=\"text\"></dx-select-box>\n </div>\n <div class=\"px-1-1 w-2/3\" *ngIf=\"item.input_type == 'text'\">\n <div class=\"text-md\">Server Column</div>\n <dx-text-box [(ngModel)]=\"item.server_column\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/2\" *ngIf=\"item.input_type == 'text'\">\n <div class=\"text-md\">Local Column</div>\n <dx-text-box [(ngModel)]=\"item.local_column\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/3\" *ngIf=\"item.input_type == 'select'\">\n <div class=\"text-md\">Columns Name</div>\n <dx-text-box [(ngModel)]=\"item.select_box_option\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/2\">\n <div class=\"flex justify-end\">\n <div class=\"{{commonService.btn_danger_sm}} w-24 mt-6 text-center\"\n (click)=\"deleteNodeFilter(i)\">Delete Filter</div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"{{commonService.btn_primary_sm}} w-auto text-center\"\n (click)=\"getNodeProperticeFilterOption()\">Add\n Filter</div>\n </div>\n </ng-container>\n\n <div class=\"flex flex-row justify-end items-center h-16 m-2\">\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"backToMainView()\">Back\n </div>\n <ng-container *ngIf=\"!isUpdateWidget\">\n <div *ngIf=\"islayoutCreate\"\n class=\"{{commonService.btn_success_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"addLayoutTOview()\">Add View\n </div>\n <div *ngIf=\"!islayoutCreate && !isEditMainLayout\"\n class=\"{{commonService.btn_primary_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"addWidgetTOview()\">Add Layout\n </div>\n <div *ngIf=\"!islayoutCreate && isEditMainLayout\"\n class=\"{{commonService.btn_primary_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"updateLayoutWidgetTOview()\">Update Layout\n </div>\n\n </ng-container>\n\n <div class=\"{{commonService.btn_warning_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"updateToView()\" *ngIf=\"isUpdateWidget\">Update View\n </div>\n\n </div>\n\n\n <!-- <pre><code>{{dashBoardWidgetConfig | json}}</code></pre> -->\n </ng-container>\n <ng-container *ngIf=\"isChartButtonClick\">\n <h6\n class=\"mb-2 font-bold text-md tracking-tight text-gray-900 dark:text-white border-b pb-3 flex items-center\">\n <i class=\"fa fa-bar-chart-o mr-2\"></i> Select View\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursor-pointer\"\n (click)=\"backToMainView()\">Back\n </div>\n </h6>\n <div class=\" h-[80vh] overflow-x-auto\">\n <div class=\"relative my-2 \">\n <input type=\"text\" [(ngModel)]=\"viewToSearch\" (keyup)=\"filterViews()\" (keydown)=\"filterViews()\"\n class=\"bg-gray-800 border border-gray-700 text-gray-200 text-sm focus:ring-gray-400 focus:border-gray-500 block w-full p-4 h-8 rounded\"\n placeholder=\"Search View\" />\n <button type=\"button\" class=\"absolute inset-y-0 right-0 flex items-center pr-6\">\n <mat-icon class=\"rotate-90 cursor-pointer\" [svgIcon]=\"'heroicons_outline:search'\"></mat-icon>\n </button>\n </div>\n <ng-container *ngFor=\"let item of filteredComponentConfig\">\n <div class=\"relative group my-3 w-full\">\n <!-- Item View Name -->\n <div class=\"text-md font-bold border-b py-2 cursar-pointer\">\n {{item.viewName}}</div>\n\n <!-- Hover Buttons -->\n <div\n class=\"absolute top-0 right-0 flex space-x-2 opacity-0 group-hover:opacity-100 transition-opacity duration-300 pb-2\">\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700\">\n <i class=\"fa fa-pencil-square-o\" aria-hidden=\"true\"\n (click)=\"editComponentViews(item)\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-green-500 hover:bg-green-700\"\n (click)=\"getComponentConfig(item)\">\n <i class=\"fa fa-plus\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n\n </ng-container>\n <ng-container *ngIf=\"isDefaultView\">\n <ng-container *ngFor=\"let item of dashBoardWidgetConfig.widgets; let i = index\">\n <div class=\"group my-3 w-full flex justify-between border-b items-center\">\n <div class=\"text-md font-bold py-2 cursor-pointer\">\n {{item.widgetTitle}}\n </div>\n\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForWidget(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== dashBoardWidgetConfig.widgets.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForWidget(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"getEditViewFromLayout(item,i)\">\n <i class=\"fa fa-pencil-square\" aria-hidden=\"true\"></i>\n\n </button>\n <button class=\"rounded-full p-2 text-white bg-red-500 hover:bg-red-700 mb-2\"\n (click)=\"getDeleteViewFromLayout(item,i)\">\n <i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n\n </div>\n</div>\n<!-- </div> -->\n\n<dx-popup [(visible)]=\"isEditOptionClick\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"'auto'\" [showTitle]=\"true\" class=\"popup\" title=\"{{editViewdataSourceModal.viewName}}\">\n <div *dxTemplate=\"let data of 'content'\">\n\n <app-dash-chart [datasetmodal]=\"editViewdataSourceModal\" (getChartConfigOutPut)=\"getEmitNewChartCongig($event)\"\n *ngIf=\"editViewdataSourceModal.viewType == 'chart'\"></app-dash-chart>\n <app-dash-table [datasetmodal]=\"editViewdataSourceModal\" (getTableConfigOutPut)=\"getEmitNewChartCongig($event)\"\n *ngIf=\"editViewdataSourceModal.viewType == 'table'\"></app-dash-table>\n <!-- <app-dash-other [datasetmodal]=\"editViewdataSourceModal\" *ngIf=\"editViewdataSourceModal.viewType == 'others'\"\n (createOtherComponentView)=\"getEmitNewChartCongig($event)\"></app-dash-other> -->\n </div>\n</dx-popup>\n\n\n<dx-popup [(visible)]=\"isCreateDataset\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Editor\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-dataset [isHeader]=\"false\"></app-create-dataset>\n </dx-scroll-view>\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isCreateDatasetWithDatasetId\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Editor\" (onHidden)=\"getDatasetPopupHide($event)\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-dataset [selectedDatasetId]=\"selectedDatasetId\" [isHeader]=\"false\"></app-create-dataset>\n </dx-scroll-view>\n </div>\n</dx-popup>\n\n<dx-popup [(visible)]=\"isCreateNewViewWithDefaultView\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\"\n [width]=\"1200\" [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Views Editor\"\n (onHidden)=\"getViewPopupHide($event)\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-comp-view [selectedViewId]=\"selectedViewId\" [isHeader]=\"false\"></app-create-comp-view>\n </dx-scroll-view>\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isCreateNewView\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Views Editor\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-comp-view [isHeader]=\"false\"></app-create-comp-view>\n </dx-scroll-view>\n </div>\n</dx-popup>\n\n\n<dx-popup [(visible)]=\"isWidgetFilters\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"800\" [height]=\"400\"\n [showTitle]=\"true\" class=\"popup\" title=\"Dataset Filter\">\n <div *dxTemplate=\"let data of 'content'\">\n <div class=\"my-2\">\n <dx-scroll-view [width]=\"'100%'\" [height]=\"'85%'\">\n <ng-container *ngFor=\"let item of nodeproperticeFilterDataSource; let i = index\">\n <div class=\"flex flex-row my-2\">\n <div class=\"m-1\">\n <dx-text-box [(ngModel)]=\"item.columnName\"></dx-text-box>\n </div>\n <div class=\"m-1\">\n <dx-select-box [items]=\"['get','let']\" [(ngModel)]=\"item.operator\"\n placeholder=\"Operator\"></dx-select-box>\n </div>\n <div class=\"m-1\">\n <dx-text-box [(ngModel)]=\"item.value\"></dx-text-box>\n </div>\n </div>\n </ng-container>\n\n </dx-scroll-view>\n <div class=\"flex justify-end mx-1 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\"\n (click)=\"submitFilter()\">Submit</button>\n </div>\n\n </div>\n\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isAdvanceLayout\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"700\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Filter\">\n <div *dxTemplate=\"let data of 'content'\">\n <div class=\"flex flex-row px-2 mb-3\">\n <div class=\"w-2/3 mb-2\">\n <div class=\"text-md mb-2\">Select Views</div>\n <dx-tag-box [dataSource]=\"componentConfigDataSource\" valueExpr=\"viewId\" displayExpr=\"viewName\"\n [multiline]=\"true\" [showSelectionControls]=\"true\" [(ngModel)]=\"selectedViewsIds\"\n [maxDisplayedTags]=\"3\" (onValueChanged)=\"getSelectedColumnSource($event)\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n <div class=\"w-1/3 px-2\">\n <button class=\"{{commonService.btn_primary_md}} mt-6\" (click)=\"getProcessForConfig()\">\n Add To View\n </button>\n <!-- <button class=\"{{commonService.btn_danger_md}} cursor-pointer mt-6\" (click)=\"cancelCdrConfig()\">Cancel\n </button> -->\n </div>\n </div>\n <dx-scroll-view [width]=\"'100%'\" [height]=\"'80%'\">\n\n <div class=\"m-2 border-b\" *ngIf=\"isProceed\">\n <ng-container *ngFor=\"let item of advanceLayoutContainer; let i = index;\">\n <div class=\"flex flex-row m-2\">\n <div class=\"mx-2 w-1/2\">\n <div class=\"text-md mb-2\">View Name</div>\n <dx-text-box [(ngModel)]=\"item.compConfig.viewConfig[0].viewName\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Title</div>\n <dx-text-box [(ngModel)]=\"item.nodeProperties.widgetTitle\"></dx-text-box>\n </div>\n\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Width</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"widget_width\"\n [(ngModel)]=\"item.nodeProperties.width\"></dx-select-box>\n </div>\n\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Height</div>\n <dx-text-box [(ngModel)]=\"item.nodeProperties.height\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Filter</div>\n <dx-select-box [items]=\"filterDataSource\" displayExpr=\"filterName\" [searchEnabled]=\"true\"\n valueExpr=\"filterId\" [(ngModel)]=\"item.filterId\"></dx-select-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mt-8\">\n <dx-check-box [(ngModel)]=\"item.nodeProperties.display\" text=\"Display\"></dx-check-box>\n </div>\n </div>\n <div class=\"mx-2\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer mt-8\"\n (click)=\"deleteView(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n </dx-scroll-view>\n <div class=\"flex justify-end mx-1 my-2 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\" (click)=\"submitAdvanceView()\">Add\n Layout</button>\n </div>\n </div>\n</dx-popup>", styles: ["::ng-deep #scrollview-demo{min-height:550px}::ng-deep #scrollview{height:auto;position:absolute;top:0;bottom:300px;padding:20px}::ng-deep #scrollview-content{white-space:pre-wrap}.scrollable-content{height:90vh;overflow-y:auto}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { kind: "component", type: i8.DxCheckBoxComponent, selector: "dx-check-box", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "iconSize", "isValid", "name", "readOnly", "rtlEnabled", "tabIndex", "text", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "visible", "width"], outputs: ["onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconSizeChange", "isValidChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "tabIndexChange", "textChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i9.DxPopupComponent, selector: "dx-popup", inputs: ["accessKey", "animation", "closeOnOutsideClick", "container", "contentTemplate", "copyRootClassesToWrapper", "deferRendering", "disabled", "dragAndResizeArea", "dragEnabled", "dragOutsideBoundary", "elementAttr", "focusStateEnabled", "fullScreen", "height", "hideOnOutsideClick", "hideOnParentScroll", "hint", "hoverStateEnabled", "maxHeight", "maxWidth", "minHeight", "minWidth", "position", "resizeEnabled", "restorePosition", "rtlEnabled", "shading", "shadingColor", "showCloseButton", "showTitle", "tabIndex", "title", "titleTemplate", "toolbarItems", "visible", "width", "wrapperAttr"], outputs: ["onContentReady", "onDisposing", "onHidden", "onHiding", "onInitialized", "onOptionChanged", "onResize", "onResizeEnd", "onResizeStart", "onShowing", "onShown", "onTitleRendered", "accessKeyChange", "animationChange", "closeOnOutsideClickChange", "containerChange", "contentTemplateChange", "copyRootClassesToWrapperChange", "deferRenderingChange", "disabledChange", "dragAndResizeAreaChange", "dragEnabledChange", "dragOutsideBoundaryChange", "elementAttrChange", "focusStateEnabledChange", "fullScreenChange", "heightChange", "hideOnOutsideClickChange", "hideOnParentScrollChange", "hintChange", "hoverStateEnabledChange", "maxHeightChange", "maxWidthChange", "minHeightChange", "minWidthChange", "positionChange", "resizeEnabledChange", "restorePositionChange", "rtlEnabledChange", "shadingChange", "shadingColorChange", "showCloseButtonChange", "showTitleChange", "tabIndexChange", "titleChange", "titleTemplateChange", "toolbarItemsChange", "visibleChange", "widthChange", "wrapperAttrChange"] }, { kind: "component", type: i10.DxScrollViewComponent, selector: "dx-scroll-view", inputs: ["bounceEnabled", "direction", "disabled", "elementAttr", "height", "pulledDownText", "pullingDownText", "reachBottomText", "refreshingText", "rtlEnabled", "scrollByContent", "scrollByThumb", "showScrollbar", "useNative", "width"], outputs: ["onDisposing", "onInitialized", "onOptionChanged", "onPullDown", "onReachBottom", "onScroll", "onUpdated", "bounceEnabledChange", "directionChange", "disabledChange", "elementAttrChange", "heightChange", "pulledDownTextChange", "pullingDownTextChange", "reachBottomTextChange", "refreshingTextChange", "rtlEnabledChange", "scrollByContentChange", "scrollByThumbChange", "showScrollbarChange", "useNativeChange", "widthChange"] }, { kind: "component", type: i11.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i12.DxTagBoxComponent, selector: "dx-tag-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "applyValueMode", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hideSelectedItems", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxDisplayedTags", "maxFilterQueryLength", "maxLength", "minSearchLength", "multiline", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectAllMode", "selectAllText", "selectedItems", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showMultiTagOnly", "showSelectionControls", "stylingMode", "tabIndex", "tagTemplate", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCustomItemCreating", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onMultiTagPreparing", "onOpened", "onOptionChanged", "onSelectAllValueChanged", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "applyValueModeChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hideSelectedItemsChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxDisplayedTagsChange", "maxFilterQueryLengthChange", "maxLengthChange", "minSearchLengthChange", "multilineChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectAllModeChange", "selectAllTextChange", "selectedItemsChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showMultiTagOnlyChange", "showSelectionControlsChange", "stylingModeChange", "tabIndexChange", "tagTemplateChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i13.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "directive", type: i14.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i14.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i14.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i16.LoadingComponent, selector: "app-loading" }, { kind: "component", type: i17.CreateCompViewComponent, selector: "app-create-comp-view", inputs: ["kpiTreeData", "isHeader", "selectedViewId"] }, { kind: "component", type: i18.DashChartComponent, selector: "app-dash-chart", inputs: ["datasetmodal"], outputs: ["getChartConfigOutPut"] }, { kind: "component", type: i19.DashTableComponent, selector: "app-dash-table", inputs: ["datasetmodal"], outputs: ["getTableConfigOutPut"] }, { kind: "component", type: i20.CreateDatasetComponent, selector: "app-create-dataset", inputs: ["isHeader", "selectedDatasetId"] }, { kind: "component", type: i21.CommonHeaderComponent, selector: "lib-common-header", inputs: ["pageTitle"] }] });
968
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: PageConfigMultilayoutComponent, decorators: [{
969
+ type: Component,
970
+ args: [{ selector: 'app-dashbord-config', template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n\n<div class=\"flex flex-row h-[90vh] w-full\">\n <div class=\"w-3/4 border-r h-full flex flex-col px-2\">\n <!-- Scrollable content -->\n <div class=\"flex-grow overflow-y-auto\">\n <div class=\"flex flex-wrap my-3\" #dynamicContainer></div>\n </div>\n\n <!-- Fixed bottom section -->\n <div class=\"flex flex-row justify-center items-center h-16 m-2 border shrink-0\">\n <lib-common-header [pageTitle]=\"''\"></lib-common-header>\n <div class=\"{{commonService.btn_primary_md}} m-2\" (click)=\"addWidget()\">Add Layout</div>\n <div class=\"{{commonService.btnOthersPurple}} m-2 cursor-pointer\" (click)=\"getViewPage()\">View Page</div>\n </div>\n </div>\n <div class=\"w-1/4 p-2 h-full\">\n <ng-container *ngIf=\"isDashBoardContent\">\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursar-pointer\" (click)=\"backToMainView()\">\n Back\n </div>\n <ng-container *ngFor=\"let item of page_config.api_config; let i = index\">\n <div class=\"mb-2 flex flex-row justify-between items-center border-b\">\n <div class=\"text-md py-2 font-bold text-white px-2\">\n {{item.widGetConfig.widgetTitle}}\n </div>\n <div class=\"flex space-x-2\">\n <!-- <button (click)=\"editSelectedWidget(item, i)\"\n class=\"w-8 h-8 bg-sky-600 hover:bg-blue-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-edit\"></i>\n </button> -->\n <button\n class=\"w-8 h-8 bg-red-600 hover:bg-red-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-trash-o\"></i>\n </button>\n </div>\n </div>\n\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"isWidgetCreationContent\">\n <h6 class=\"mb-2 font-bold text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3\">\n <span *ngIf=\"!islayoutCreate\">Widget Settings</span>\n <span *ngIf=\"islayoutCreate\">Layout Settings</span>\n </h6>\n <div class=\"flex flex-row my-4\">\n <dx-check-box class=\"ml-auto\" [(ngModel)]=\"addedwidGetConfig.display\" text=\"Display\"></dx-check-box>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Width</span>\n <dx-select-box class=\"w-1/2\" [items]=\"widget_width\"\n [(ngModel)]=\"addedwidGetConfig.width\"></dx-select-box>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Height</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"addedwidGetConfig.height\"></dx-text-box>\n </div>\n\n <div class=\"flex flex-row mb-2 justify-between\" *ngIf=\"!islayoutCreate\">\n <div class=\"text-md my-auto px-2\">Widget Title</div>\n <div><dx-text-box class=\"w-1/2\" [(ngModel)]=\"widgetTitle\"></dx-text-box></div>\n </div>\n <div class=\"flex flex-row mb-2 justify-between\" *ngIf=\"!islayoutCreate\">\n <span class=\"text-md my-auto px-2\">Widget Name</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"widgetName\"></dx-text-box>\n </div>\n\n\n <div class=\"flex flex-row mb-5 justify-between\" *ngIf=\"islayoutCreate\">\n <span class=\"text-sm my-auto px-2\">Layout Title</span>\n <dx-text-box class=\"w-1/2\" [(ngModel)]=\"addedwidGetConfig.widgetTitle\"></dx-text-box>\n </div>\n\n <div class=\"flex flex-row mb-2 justify-between\">\n <span class=\"text-md my-auto px-2\">Filter</span>\n <dx-select-box class=\"w-1/2\" [items]=\"filterDataSource\" displayExpr=\"filterName\" [searchEnabled]=\"true\"\n valueExpr=\"filterId\" [(ngModel)]=\"selectedFilterId\"\n (onValueChanged)=\"getFilterValueById($event)\"></dx-select-box>\n </div>\n <ng-container *ngIf=\"!isUpdateWidget\">\n <div class=\"mt-6\" *ngIf=\"!islayoutCreate && isEditMainLayout\">\n <ng-container\n *ngFor=\"let item of dashBoardWidgetConfig.widgets[newWidgetIndex].widgetNode;let i = index\">\n <div class=\"mb-2 flex flex-row justify-between items-center border-b \">\n <div class=\"text-md py-2 font-bold text-white px-2\">\n {{item.nodeProperties.widgetTitle}}\n </div>\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForPageView(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n *ngIf=\"i !== dashBoardWidgetConfig.widgets[newWidgetIndex].widgetNode.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForPageView(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button\n class=\"w-8 h-8 bg-red-600 hover:bg-red-800 text-white rounded-full flex items-center justify-center\">\n <i class=\"fa fa-trash-o\"></i>\n </button>\n </div>\n </div>\n\n </ng-container>\n </div>\n </ng-container>\n\n\n\n <ng-container *ngIf=\"isUpdateWidget\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Application Views\n </div>\n <div class=\"border-x border-b p-2\">\n <ng-container *ngFor=\"let item of allWidgetInnerContent; let i = index\">\n <div class=\"group w-full flex justify-between border-b items-center\">\n <div class=\"text-md font-bold py-2 cursor-pointer\">\n {{item.viewName}}\n </div>\n\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== allWidgetInnerContent.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"editComponentViews(item)\">\n <i class=\"fa fa-eye\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"editComponentDatasets(item)\">\n <i class=\"fa fa-database\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-red-500 hover:bg-red-700 mb-2\"\n (click)=\"getDeleteViewFromConfig(i)\">\n <i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n </div>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"isUpdateWidget\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Add Filter For View\n\n </div>\n <div class=\"border-x border-b p-2\">\n <div class=\"flex flex-row py-3 border-b\">\n <dx-check-box [(ngModel)]=\"addedwidGetConfig.isWidgetFilter\"\n text=\"Popup Columns Filter Enable\"></dx-check-box>\n </div>\n <div class=\"flex flex-row my-2 border-b\">\n <ng-container *ngFor=\"let item of nodeProperticeFilters; let i = index\">\n <div class=\"flex flex-wrap border-b\">\n <div class=\"px-1 w-1/3\">\n <div class=\"text-md\">Input Type</div>\n <dx-select-box [items]=\"['text']\" [(ngModel)]=\"item.input_type\"\n value=\"text\"></dx-select-box>\n </div>\n <div class=\"px-1-1 w-2/3\" *ngIf=\"item.input_type == 'text'\">\n <div class=\"text-md\">Server Column</div>\n <dx-text-box [(ngModel)]=\"item.server_column\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/2\" *ngIf=\"item.input_type == 'text'\">\n <div class=\"text-md\">Local Column</div>\n <dx-text-box [(ngModel)]=\"item.local_column\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/3\" *ngIf=\"item.input_type == 'select'\">\n <div class=\"text-md\">Columns Name</div>\n <dx-text-box [(ngModel)]=\"item.select_box_option\"></dx-text-box>\n </div>\n <div class=\"px-1-1 w-1/2\">\n <div class=\"flex justify-end\">\n <div class=\"{{commonService.btn_danger_sm}} w-24 mt-6 text-center\"\n (click)=\"deleteNodeFilter(i)\">Delete Filter</div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"{{commonService.btn_primary_sm}} w-auto text-center\"\n (click)=\"getNodeProperticeFilterOption()\">Add\n Filter</div>\n </div>\n </ng-container>\n\n <div class=\"flex flex-row justify-end items-center h-16 m-2\">\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"backToMainView()\">Back\n </div>\n <ng-container *ngIf=\"!isUpdateWidget\">\n <div *ngIf=\"islayoutCreate\"\n class=\"{{commonService.btn_success_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"addLayoutTOview()\">Add View\n </div>\n <div *ngIf=\"!islayoutCreate && !isEditMainLayout\"\n class=\"{{commonService.btn_primary_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"addWidgetTOview()\">Add Layout\n </div>\n <div *ngIf=\"!islayoutCreate && isEditMainLayout\"\n class=\"{{commonService.btn_primary_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"updateLayoutWidgetTOview()\">Update Layout\n </div>\n\n </ng-container>\n\n <div class=\"{{commonService.btn_warning_md}} m-2 w-fit text-center cursar-pointer\"\n (click)=\"updateToView()\" *ngIf=\"isUpdateWidget\">Update View\n </div>\n\n </div>\n\n\n <!-- <pre><code>{{dashBoardWidgetConfig | json}}</code></pre> -->\n </ng-container>\n <ng-container *ngIf=\"isChartButtonClick\">\n <h6\n class=\"mb-2 font-bold text-md tracking-tight text-gray-900 dark:text-white border-b pb-3 flex items-center\">\n <i class=\"fa fa-bar-chart-o mr-2\"></i> Select View\n <div class=\"{{commonService.btnDarkBlack}} m-2 w-fit text-center cursor-pointer\"\n (click)=\"backToMainView()\">Back\n </div>\n </h6>\n <div class=\" h-[80vh] overflow-x-auto\">\n <div class=\"relative my-2 \">\n <input type=\"text\" [(ngModel)]=\"viewToSearch\" (keyup)=\"filterViews()\" (keydown)=\"filterViews()\"\n class=\"bg-gray-800 border border-gray-700 text-gray-200 text-sm focus:ring-gray-400 focus:border-gray-500 block w-full p-4 h-8 rounded\"\n placeholder=\"Search View\" />\n <button type=\"button\" class=\"absolute inset-y-0 right-0 flex items-center pr-6\">\n <mat-icon class=\"rotate-90 cursor-pointer\" [svgIcon]=\"'heroicons_outline:search'\"></mat-icon>\n </button>\n </div>\n <ng-container *ngFor=\"let item of filteredComponentConfig\">\n <div class=\"relative group my-3 w-full\">\n <!-- Item View Name -->\n <div class=\"text-md font-bold border-b py-2 cursar-pointer\">\n {{item.viewName}}</div>\n\n <!-- Hover Buttons -->\n <div\n class=\"absolute top-0 right-0 flex space-x-2 opacity-0 group-hover:opacity-100 transition-opacity duration-300 pb-2\">\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700\">\n <i class=\"fa fa-pencil-square-o\" aria-hidden=\"true\"\n (click)=\"editComponentViews(item)\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-green-500 hover:bg-green-700\"\n (click)=\"getComponentConfig(item)\">\n <i class=\"fa fa-plus\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n\n </ng-container>\n <ng-container *ngIf=\"isDefaultView\">\n <ng-container *ngFor=\"let item of dashBoardWidgetConfig.widgets; let i = index\">\n <div class=\"group my-3 w-full flex justify-between border-b items-center\">\n <div class=\"text-md font-bold py-2 cursor-pointer\">\n {{item.widgetTitle}}\n </div>\n\n <div class=\"flex space-x-2\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForWidget(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== dashBoardWidgetConfig.widgets.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForWidget(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"rounded-full p-2 text-white bg-blue-500 hover:bg-blue-700 mb-2\"\n (click)=\"getEditViewFromLayout(item,i)\">\n <i class=\"fa fa-pencil-square\" aria-hidden=\"true\"></i>\n\n </button>\n <button class=\"rounded-full p-2 text-white bg-red-500 hover:bg-red-700 mb-2\"\n (click)=\"getDeleteViewFromLayout(item,i)\">\n <i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n\n </div>\n</div>\n<!-- </div> -->\n\n<dx-popup [(visible)]=\"isEditOptionClick\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"'auto'\" [showTitle]=\"true\" class=\"popup\" title=\"{{editViewdataSourceModal.viewName}}\">\n <div *dxTemplate=\"let data of 'content'\">\n\n <app-dash-chart [datasetmodal]=\"editViewdataSourceModal\" (getChartConfigOutPut)=\"getEmitNewChartCongig($event)\"\n *ngIf=\"editViewdataSourceModal.viewType == 'chart'\"></app-dash-chart>\n <app-dash-table [datasetmodal]=\"editViewdataSourceModal\" (getTableConfigOutPut)=\"getEmitNewChartCongig($event)\"\n *ngIf=\"editViewdataSourceModal.viewType == 'table'\"></app-dash-table>\n <!-- <app-dash-other [datasetmodal]=\"editViewdataSourceModal\" *ngIf=\"editViewdataSourceModal.viewType == 'others'\"\n (createOtherComponentView)=\"getEmitNewChartCongig($event)\"></app-dash-other> -->\n </div>\n</dx-popup>\n\n\n<dx-popup [(visible)]=\"isCreateDataset\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Editor\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-dataset [isHeader]=\"false\"></app-create-dataset>\n </dx-scroll-view>\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isCreateDatasetWithDatasetId\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Editor\" (onHidden)=\"getDatasetPopupHide($event)\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-dataset [selectedDatasetId]=\"selectedDatasetId\" [isHeader]=\"false\"></app-create-dataset>\n </dx-scroll-view>\n </div>\n</dx-popup>\n\n<dx-popup [(visible)]=\"isCreateNewViewWithDefaultView\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\"\n [width]=\"1200\" [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Views Editor\"\n (onHidden)=\"getViewPopupHide($event)\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-comp-view [selectedViewId]=\"selectedViewId\" [isHeader]=\"false\"></app-create-comp-view>\n </dx-scroll-view>\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isCreateNewView\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"600\" [showTitle]=\"true\" class=\"popup\" title=\"Views Editor\">\n <div *dxTemplate=\"let data of 'content'\">\n <dx-scroll-view class=\"h-full\" [width]=\"'100%'\" [height]=\"'100%'\">\n <app-create-comp-view [isHeader]=\"false\"></app-create-comp-view>\n </dx-scroll-view>\n </div>\n</dx-popup>\n\n\n<dx-popup [(visible)]=\"isWidgetFilters\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"800\" [height]=\"400\"\n [showTitle]=\"true\" class=\"popup\" title=\"Dataset Filter\">\n <div *dxTemplate=\"let data of 'content'\">\n <div class=\"my-2\">\n <dx-scroll-view [width]=\"'100%'\" [height]=\"'85%'\">\n <ng-container *ngFor=\"let item of nodeproperticeFilterDataSource; let i = index\">\n <div class=\"flex flex-row my-2\">\n <div class=\"m-1\">\n <dx-text-box [(ngModel)]=\"item.columnName\"></dx-text-box>\n </div>\n <div class=\"m-1\">\n <dx-select-box [items]=\"['get','let']\" [(ngModel)]=\"item.operator\"\n placeholder=\"Operator\"></dx-select-box>\n </div>\n <div class=\"m-1\">\n <dx-text-box [(ngModel)]=\"item.value\"></dx-text-box>\n </div>\n </div>\n </ng-container>\n\n </dx-scroll-view>\n <div class=\"flex justify-end mx-1 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\"\n (click)=\"submitFilter()\">Submit</button>\n </div>\n\n </div>\n\n </div>\n</dx-popup>\n<dx-popup [(visible)]=\"isAdvanceLayout\" [closeOnOutsideClick]=\"false\" [dragEnabled]=\"false\" [width]=\"1200\"\n [height]=\"700\" [showTitle]=\"true\" class=\"popup\" title=\"Dataset Filter\">\n <div *dxTemplate=\"let data of 'content'\">\n <div class=\"flex flex-row px-2 mb-3\">\n <div class=\"w-2/3 mb-2\">\n <div class=\"text-md mb-2\">Select Views</div>\n <dx-tag-box [dataSource]=\"componentConfigDataSource\" valueExpr=\"viewId\" displayExpr=\"viewName\"\n [multiline]=\"true\" [showSelectionControls]=\"true\" [(ngModel)]=\"selectedViewsIds\"\n [maxDisplayedTags]=\"3\" (onValueChanged)=\"getSelectedColumnSource($event)\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n <div class=\"w-1/3 px-2\">\n <button class=\"{{commonService.btn_primary_md}} mt-6\" (click)=\"getProcessForConfig()\">\n Add To View\n </button>\n <!-- <button class=\"{{commonService.btn_danger_md}} cursor-pointer mt-6\" (click)=\"cancelCdrConfig()\">Cancel\n </button> -->\n </div>\n </div>\n <dx-scroll-view [width]=\"'100%'\" [height]=\"'80%'\">\n\n <div class=\"m-2 border-b\" *ngIf=\"isProceed\">\n <ng-container *ngFor=\"let item of advanceLayoutContainer; let i = index;\">\n <div class=\"flex flex-row m-2\">\n <div class=\"mx-2 w-1/2\">\n <div class=\"text-md mb-2\">View Name</div>\n <dx-text-box [(ngModel)]=\"item.compConfig.viewConfig[0].viewName\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Title</div>\n <dx-text-box [(ngModel)]=\"item.nodeProperties.widgetTitle\"></dx-text-box>\n </div>\n\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Width</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"widget_width\"\n [(ngModel)]=\"item.nodeProperties.width\"></dx-select-box>\n </div>\n\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Height</div>\n <dx-text-box [(ngModel)]=\"item.nodeProperties.height\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\">Widget Filter</div>\n <dx-select-box [items]=\"filterDataSource\" displayExpr=\"filterName\" [searchEnabled]=\"true\"\n valueExpr=\"filterId\" [(ngModel)]=\"item.filterId\"></dx-select-box>\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mt-8\">\n <dx-check-box [(ngModel)]=\"item.nodeProperties.display\" text=\"Display\"></dx-check-box>\n </div>\n </div>\n <div class=\"mx-2\">\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer mt-8\"\n (click)=\"deleteView(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n </dx-scroll-view>\n <div class=\"flex justify-end mx-1 my-2 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\" (click)=\"submitAdvanceView()\">Add\n Layout</button>\n </div>\n </div>\n</dx-popup>", styles: ["::ng-deep #scrollview-demo{min-height:550px}::ng-deep #scrollview{height:auto;position:absolute;top:0;bottom:300px;padding:20px}::ng-deep #scrollview-content{white-space:pre-wrap}.scrollable-content{height:90vh;overflow-y:auto}\n"] }]
971
+ }], ctorParameters: function () { return [{ type: i1.CommonService }, { type: i2.ActivatedRoute }, { type: i0.ViewContainerRef }, { type: i0.ComponentFactoryResolver }, { type: i3.ApplicationContentService }, { type: i4.ToastrService }, { type: i2.Router }, { type: i5.ApplicationDatssetsCall }]; }, propDecorators: { dynamicComponentContainer: [{
972
+ type: ViewChild,
973
+ args: ['dynamicComponentContainer', { read: ViewContainerRef }]
974
+ }], containerRef: [{
975
+ type: ViewChild,
976
+ args: ['container', { read: ViewContainerRef }]
977
+ }], dynamicContainer: [{
978
+ type: ViewChild,
979
+ args: ['dynamicContainer', { static: true }]
980
+ }], scrollView: [{
981
+ type: ViewChild,
982
+ args: [DxScrollViewComponent, { static: false }]
983
+ }] } });
984
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1jb25maWctbXVsdGktbGF5b3V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dhbW1hLWFwcC1jb250cm9sbGVyL3NyYy9saWIvYXBwbGljYXRpb24tY29udHJvbGxlci9wYWdlLWNvbnRyb2xsZXIvcGFnZS1jb25maWctbXVsdGktbGF5b3V0L3BhZ2UtY29uZmlnLW11bHRpLWxheW91dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvcGFnZS1jb250cm9sbGVyL3BhZ2UtY29uZmlnLW11bHRpLWxheW91dC9wYWdlLWNvbmZpZy1tdWx0aS1sYXlvdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQWtHLFNBQVMsRUFBZ0IsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJcE0sT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTNELE9BQU8sTUFBTSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHFGQUFxRixDQUFDO0FBQ2xJLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlFQUF5RSxDQUFDO0FBQ3BILE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLG1HQUFtRyxDQUFDO0FBQ3RKLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDJGQUEyRixDQUFDO0FBQzFJLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHFHQUFxRyxDQUFDO0FBQ3pKLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLHFHQUFxRyxDQUFDO0FBRXpK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b25lbnQsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgQ29tcG9uZW50UmVmLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIE9uRGVzdHJveSwgT25Jbml0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgTmF2aWdhdGlvbkV4dHJhcywgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcbmltcG9ydCB7IGZvcmtKb2luIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjb25maXJtIH0gZnJvbSAnZGV2ZXh0cmVtZS91aS9kaWFsb2cnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25Db250ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL2FwcGxpY2F0aW9uLWNvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBEeFNjcm9sbFZpZXdDb21wb25lbnQgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXInO1xuaW1wb3J0IHsgQXBwbGljYXRpb25EYXRzc2V0c0NhbGwgfSBmcm9tICcuLi8uLi9hcHBsaWNhdGlvbi1kYXRhc2V0LWNhbGwuc2VydmljZSc7XG5pbXBvcnQgbW9tZW50IGZyb20gJy4uLy4uL21vbWVudC1oZWxwZXInO1xuaW1wb3J0IHsgR2FtbWFUb2RheVByZXZpb3VzQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FkdmFuY2VkLWNvbXBvbmVudC9nYW1tYS10b2RheS1wcmV2aW91cy9nYW1tYS10b2RheS1wcmV2aW91cy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXBwQWR2YW5jZUhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvYXBwLWFkdmFuY2UtaGVhZGVyL2FwcC1oZWFkZXIuY29tcG9uZW50JztcbmltcG9ydCB7IEdhbW1hVGFibGVXaXRoUGVyY2VudGFnZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ2FtbWEtdGFibGUtd2l0aC1wZXJjZW50YWdlL2dhbW1hLXRhYmxlLXdpdGgtcGVyY2VudGFnZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgR2FtbVNpbmdsZU51bWJlckNhcmRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2dhbW0tc2luZ2xlLW51bWJlci1jYXJkL2dhbW0tc2luZ2xlLW51bWJlci1jYXJkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHYW1tYUFkdmFuY2VPcGVyYXRvclRhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FkdmFuY2VkLWNvbXBvbmVudC9nYW1tYS1hZHZhbmNlLW9wZXJhdG9yLXRhYmxlL2dhbW1hLWFkdmFuY2Utb3BlcmF0b3ItdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IEFkdmFuY2VXaWRnZXRIZWFkZXJGaWx0ZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWR2YW5jZWQtY29tcG9uZW50L2FkdmFuY2Utd2lkZ2V0LWhlYWRlci1maWx0ZXIvYWR2YW5jZS13aWRnZXQtaGVhZGVyLWZpbHRlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tbW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbic7XG5pbXBvcnQgeyBHYW1tYUFkdmFuY2VDaGFydENvbXBvbmVudCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hZHZhbmNlZC1jb21wb25lbnQvZ2FtbWEtYWR2YW5jZS1jaGFydC9nYW1tYS1hZHZhbmNlLWNoYXJ0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHYW1tYUdlb0NoYXJ0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FkdmFuY2VkLWNvbXBvbmVudC9nYW1tYS1nZW8tY2hhcnQvZ2FtbWEtZ2VvLWNoYXJ0LmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1kYXNoYm9yZC1jb25maWcnLFxuICB0ZW1wbGF0ZVVybDogJy4vcGFnZS1jb25maWctbXVsdGktbGF5b3V0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcGFnZS1jb25maWctbXVsdGktbGF5b3V0LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBQYWdlQ29uZmlnTXVsdGlsYXlvdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIGRhc2hib3JkX2NvbnRhaW5lcjogYW55ID0gW107XG4gIHNlbGVjdGVkX3dpZHRoOiBhbnk7XG4gIHdpZGdldF93aWR0aCA9IFsndy1mdWxsJywgJ3ctMS8yJywgJ3ctMS8zJywgJ3ctMi8zJywgJ3ctMS80JywgJ3ctMy80JywgJ3ctMS81JywgJ3ctNC81JywgJ3ctMS82JywgJ3ctNS82J11cbiAgbG9hZGluZ01vZGFsOiBib29sZWFuID0gdHJ1ZTtcbiAgY3VzdG9tZXJzOiBhbnk7XG4gIHBhZ2VIZWFkZXJzRGF0YTogYW55O1xuICBwYWdlX3RpdGxlID0gJ0Rhc2hib2FyZCc7XG4gIGlzU3J2VHlwZU9wZXJhdG9yOiBib29sZWFuO1xuICBkZWZhdWx0U3RhcnREYXRlO1xuICBkZWZhdWx0RW5kRGF0ZTtcbiAgcGFnZV9jb25maWc7XG4gIG9wZXJhdGlvbkxldmVsczogYW55O1xuICBmaWx0ZXJfdmFsdWU7XG4gIGlzVG9nZ2xlU3dpY2g6IGJvb2xlYW4gPSB0cnVlO1xuICBpc0RhdGVQaWNrZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNUb2dnbGVFdmVudFN0YXR1czogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0VkaXRDbGljazogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0NvbmZpZ1ZpZXc6IGJvb2xlYW47XG4gIGlzTG9hZGVyOiBib29sZWFuO1xuICBjb21wb25lbnROYW1lOiBhbnk7XG4gIGlzVXBkYXRlV2lkZ2V0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgaXNDaGFydEJ1dHRvbkNsaWNrOiBib29sZWFuO1xuICBjaGFydEFjY2VzczogYW55O1xuICBjaGFydFR5cGU6IGFueTtcbiAgZGFzaENoYXJ0Q29tU291cmNlOiBhbnk7XG4gIGlzR2VuZXJhdGU6IGJvb2xlYW5cbiAgaXNGaWx0ZXJJbnB1dHM6IGJvb2xlYW5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqL1xuXG4gIEBWaWV3Q2hpbGQoJ2R5bmFtaWNDb21wb25lbnRDb250YWluZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgZHluYW1pY0NvbXBvbmVudENvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZjtcbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXG4gIGNvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZjtcbiAgQFZpZXdDaGlsZCgnZHluYW1pY0NvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pIGR5bmFtaWNDb250YWluZXI6IEVsZW1lbnRSZWY7XG5cbiAgZHluYW1pY0NvbXBvbmVudFJlZnM6IENvbXBvbmVudFJlZjxhbnk+W10gPSBbXTtcbiAgLy8gZHluYW1pY0NvbXBvbmVudFJlZnM6IENvbXBvbmVudFJlZjxhbnk+W10gPSBbXTtcblxuICBDb21wUmVmczogQ29tcG9uZW50UmVmPGFueT47XG5cbiAgY29tcG9uZW50Q2xhc3NNYXAgPSB7XG4gICAgR2FtbWFBZHZhbmNlQ2hhcnRDb21wb25lbnQsXG4gICAgR2FtbWFUb2RheVByZXZpb3VzQ29tcG9uZW50LFxuICAgIEFwcEFkdmFuY2VIZWFkZXJDb21wb25lbnQsXG4gICAgR2FtbWFUYWJsZVdpdGhQZXJjZW50YWdlQ29tcG9uZW50LFxuICAgIEdhbW1TaW5nbGVOdW1iZXJDYXJkQ29tcG9uZW50LFxuICAgIEdhbW1hQWR2YW5jZU9wZXJhdG9yVGFibGVDb21wb25lbnQsXG4gICAgQWR2YW5jZVdpZGdldEhlYWRlckZpbHRlckNvbXBvbmVudCxcbiAgICBHYW1tYUdlb0NoYXJ0Q29tcG9uZW50XG4gIH07XG4gIGRhdGFTb3VyY2VNYXRhRGF0YTogYW55ID0gW107XG4gIHF1ZXJ5VHlwZSA9IFwibW9uZ29cIjtcbiAgZGF0YVNldE1vZGFsOiBhbnkgPSBbXTtcbiAgY29tcG9uZW50Q29uZmlnRGF0YVNvdXJjZTogYW55ID0gW107XG4gIHNlbGVzY2VkRGF0YVNvdXJjZTogYW55O1xuICBkYXRhU291cmNlTW9kYWw6IGFueSA9IHt9O1xuICBpc0Rhc2hCb2FyZENvbnRlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBzZWxlY3RlZFZpZXdGb3JtQ29tcG9uZW50OiBhbnkgPSB7fTtcbiAgYWRkZWR3aWRHZXRDb25maWcgPSB7XG4gICAgXCJkaXNwbGF5XCI6IHRydWUsXG4gICAgXCJ3aWRnZXRUaXRsZVwiOiBcIlwiLFxuICAgIFwid2lkdGhcIjogXCJcIixcbiAgICBcImhlaWdodFwiOiBcIlwiLFxuICAgIFwiaXNXaWRnZXRGaWx0ZXJcIjogZmFsc2VcbiAgfVxuXG4gIGRhc2hCb2FyZFdpZGdldENvbmZpZzogYW55ID0gW1xuICBdO1xuICBpc1dpZGdldENyZWF0aW9uQ29udGVudDogYm9vbGVhbjtcbiAgc2VsZWN0ZWRXaWR0aDogYW55O1xuICBzZWxlY3RlZEhlaWdodDogYW55O1xuICBuZXdXaWRnZXRJbmRleDogYW55O1xuICBzZWxlY3RlZEluZGV4T2JqRm9yQ2hhcnQ6IGFueSA9IHt9O1xuICBzZWxlY3RlZENvbnRhaW5lck9iamVjdEZvckNoYXJ0OiBhbnkgPSB7fTtcbiAgZGF0YVNldHRhYmxlRGF0YVNvdXJjZTogYW55O1xuICB1bmlxdWVEYXRhU2V0T2JqZWN0ID0ge307XG5cbiAgaXNEYXNoQm9hcmRDb250ZW50VHlwZVZpZXc6IGJvb2xlYW47XG4gIHBhZ2VJZDogYW55O1xuICBpc2xheW91dENyZWF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICB3aWRnZXROYW1lOiBhbnk7XG4gIHdpZGdldFRpdGxlOiBhbnk7XG4gIGFsbFdpZGdldElubmVyQ29udGVudDogYW55O1xuICBpc0RlZmF1bHRWaWV3OiBCb29sZWFuID0gdHJ1ZTtcbiAgaXNFZGl0TWFpbkxheW91dDogQm9vbGVhbjtcbiAgZmlsdGVyRGF0YVNvdXJjZTogYW55O1xuICBzZWxlY3RlZEZpbHRlcklkOiBhbnk7XG5cbiAgdmlld1RvU2VhcmNoOiBzdHJpbmcgPSAnJztcbiAgZmlsdGVyZWRDb21wb25lbnRDb25maWc6IGFueVtdID0gW107XG4gIGlzRWRpdE9wdGlvbkNsaWNrOiBib29sZWFuO1xuICBlZGl0Vmlld2RhdGFTb3VyY2VNb2RhbDogYW55ID0ge307XG5cbiAgZWRpdEl0ZW1Gb3JVcGRhdGU6IGFueSA9IHt9O1xuICBwYWdlVGl0bGU6IGFueTtcbiAgcGFnZVVybDogYW55O1xuICBhbGxXaWRnZXRCeURhdGFzZXQ6IGFueSA9IFtdO1xuXG4gIHNlbGVjdGVkRmlsdGVyc0RlZmF1bHQ6IGFueTtcblxuICBub2RlUHJvcGVydGljZUZpbHRlcnM6IGFueSA9IFtdO1xuXG4gIGlzQ3JlYXRlRGF0YXNldDogYm9vbGVhbjtcbiAgc2VsZWN0ZWREYXRhc2V0SWQ6IGFueTtcbiAgaXNDcmVhdGVEYXRhc2V0V2l0aERhdGFzZXRJZDogYm9vbGVhbjtcblxuICBpc0NyZWF0ZU5ld1ZpZXc6IGJvb2xlYW47XG4gIGlzQ3JlYXRlTmV3Vmlld1dpdGhEZWZhdWx0VmlldzogYm9vbGVhbjtcblxuICBkZWZhdWx0QXBwbHllZEZpbHRlcjogYW55O1xuICBpc1dpZGdldEZpbHRlcnM6IGJvb2xlYW47XG4gIG5vZGVwcm9wZXJ0aWNlRmlsdGVyRGF0YVNvdXJjZTogYW55O1xuICBzZWxlY3RlZEZpbHRlckRhdGFzb3VyY2U6IGFueSA9IHt9O1xuICBAVmlld0NoaWxkKER4U2Nyb2xsVmlld0NvbXBvbmVudCwgeyBzdGF0aWM6IGZhbHNlIH0pIHNjcm9sbFZpZXc6IER4U2Nyb2xsVmlld0NvbXBvbmVudDtcblxuICBzZWxlY3RlZFZpZXdJZDogYW55O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIHByaXZhdGUgc2VydmljZTogQXBwbGljYXRpb25Db250ZW50U2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0cjogVG9hc3RyU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgZGF0YXNldFNlcnZpY2U6IEFwcGxpY2F0aW9uRGF0c3NldHNDYWxsLFxuICApIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNEYXNoQm9hcmRDb250ZW50VHlwZVZpZXcgPSAodGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1snY29udGVudFR5cGUnXSA9PSAndmlldycpID8gdHJ1ZSA6IGZhbHNlO1xuICAgIHRoaXMucGFnZUlkID0gdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1sncGFnZUlkJ107XG5cbiAgICB0aGlzLmdldERhdGFTZXQoKTtcbiAgICB0aGlzLmRlZmF1bHRTdGFydERhdGUgPSBtb21lbnQoKS5zdWJ0cmFjdCgnMTAnLCAnZGF5cycpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICAgIHRoaXMuZGVmYXVsdEVuZERhdGUgPSBtb21lbnQoKS5zdWJ0cmFjdCgnMScsICdkYXlzJykuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG4gICAgdGhpcy5nZXRGaWx0ZXJJdGVtcygpXG4gICAgdGhpcy5nZXRBbGxWaWV3c0l0ZW1zKClcblxuICAgIHRoaXMuZ2V0QXBwUGFnZURldGFpbENvbmZpZ0J5UGFnZUlkKClcbiAgfVxuXG4gIGdldEFsbFZpZXdzSXRlbXMoKSB7XG4gICAgdGhpcy5zZXJ2aWNlLmdldEFwcFZpZXdDb25maWdzKCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRDb25maWdEYXRhU291cmNlID0gZGF0YTtcbiAgICAgICAgdGhpcy5maWx0ZXJlZENvbXBvbmVudENvbmZpZyA9IHRoaXMuY29tcG9uZW50Q29uZmlnRGF0YVNvdXJjZTtcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdWaWV3IENvbmZpZycpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBnZXRGaWx0ZXJJdGVtcygpIHtcbiAgICB0aGlzLnNlcnZpY2UuZ2V0QXBwRmlsdGVyQ29uZmlncygpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZmlsdGVyRGF0YVNvdXJjZSA9IGRhdGE7XG4gICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnRXJyb3InKTtcblxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGdldEFwcFBhZ2VEZXRhaWxDb25maWdCeVBhZ2VJZCgpIHtcbiAgICB0aGlzLnNlcnZpY2UuZ2V0QXBwUGFnZURldGFpbENvbmZpZyh0aGlzLnBhZ2VJZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcgPSBkYXRhO1xuICAgICAgICB0aGlzLnBhZ2VUaXRsZSA9IGRhdGEucGFnZU5hbWU7XG4gICAgICAgIHRoaXMucGFnZVVybCA9IGRhdGEucGFnZVVybDtcbiAgICAgICAgaWYgKGRhdGEud2lkZ2V0cyAmJiBkYXRhLndpZGdldHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgdGhpcy5nZXRDb21wb25lbnRDb25maWdTZXQoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnRXJyb3InKTtcblxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuXG4gIGdldENvbXBvbmVudENvbmZpZ1NldCgpIHtcbiAgICBsZXQgZGVmYXVsdEZpbHRlcnMgPSB7IG9wZXJhdGlvbkZpbHRlcjogeyBzdGFydERhdGU6IFwiXCIsIGVuZERhdGU6IFwiXCIgfSB9O1xuICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMuZm9yRWFjaCh3aWRnZXQgPT4ge1xuICAgICAgaWYgKHdpZGdldC5maWx0ZXJzKSB7XG4gICAgICAgIHdpZGdldC5maWx0ZXJzLmZpbHRlckl0ZW1zLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgaWYgKGVsZW1lbnQuZmlsdGVyVHlwZSA9PT0gJ2RhdGUnIHx8IGVsZW1lbnQuZmlsdGVyVHlwZSA9PT0gJ2RhdGV0aW1lJykge1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5kZWZhdWx0RmlsdGVyVHlwZSA9PT0gXCJkeW5hbWljXCIgJiYgZWxlbWVudC5tb21lbnRGdW5jdGlvbiAhPT0gXCJcIiAmJiBlbGVtZW50LmRlZmF1bHRGaWx0ZXJWYWx1ZSAhPT0gXCJcIiAmJiBlbGVtZW50Lm1vbWVudEZvcm1hdCAhPT0gXCJcIikge1xuICAgICAgICAgICAgICBsZXQgW2NvdW50LCB1bml0XSA9IGVsZW1lbnQuZGVmYXVsdEZpbHRlclZhbHVlLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50LmFwaU5hbWUgPT09IFwiZW5kRGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGlzcGxheSkge1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyLmVuZERhdGUgPSBtb21lbnQoKVtlbGVtZW50Lm1vbWVudEZ1bmN0aW9uXShwYXJzZUludChjb3VudCksIHVuaXQpLmZvcm1hdChlbGVtZW50Lm1vbWVudEZvcm1hdCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRFbmREYXRlID0gbW9tZW50KClbZWxlbWVudC5tb21lbnRGdW5jdGlvbl0ocGFyc2VJbnQoY291bnQpLCB1bml0KS5mb3JtYXQoZWxlbWVudC5tb21lbnRGb3JtYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZWxlbWVudC5hcGlOYW1lID09PSBcInN0YXJ0RGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyLnN0YXJ0RGF0ZSA9IG1vbWVudCgpW2VsZW1lbnQubW9tZW50RnVuY3Rpb25dKHBhcnNlSW50KGNvdW50KSwgdW5pdCkuZm9ybWF0KGVsZW1lbnQubW9tZW50Rm9ybWF0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmRlZmF1bHRGaWx0ZXJUeXBlID09PSBcInN0YXRpY1wiICYmIGVsZW1lbnQuZGVmYXVsdEZpbHRlclZhbHVlICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50LmFwaU5hbWUgPT09IFwiZW5kRGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGlzcGxheSkge1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdEZpbHRlcnMub3BlcmF0aW9uRmlsdGVyLmVuZERhdGUgPSBlbGVtZW50LmRlZmF1bHRGaWx0ZXJWYWx1ZTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdEVuZERhdGUgPSBlbGVtZW50LmRlZmF1bHRGaWx0ZXJWYWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuYXBpTmFtZSA9PT0gXCJzdGFydERhdGVcIikge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzLm9wZXJhdGlvbkZpbHRlci5zdGFydERhdGUgPSBlbGVtZW50LmRlZmF1bHRGaWx0ZXJWYWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTdGFydERhdGUgPSBlbGVtZW50LmRlZmF1bHRGaWx0ZXJWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICh0eXBlb2YgZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWUgPT09IFwic3RyaW5nXCIgJiYgZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWUgIT09IFwiXCIpIHx8XG4gICAgICAgICAgICAgIChBcnJheS5pc0FycmF5KGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlKSAmJiBlbGVtZW50LmZpbHRlckRhdGFTb3VyY2VWYWx1ZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmIChlbGVtZW50Lm9wZXJhdG9yTmFtZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzLm9wZXJhdGlvbkZpbHRlcltlbGVtZW50Lm9wZXJhdG9yTmFtZV0gPSBBcnJheS5pc0FycmF5KGVsZW1lbnQuZmlsdGVyRGF0YVNvdXJjZVZhbHVlKVxuICAgICAgICAgICAgICAgICAgPyBlbGVtZW50LmZpbHRlckRhdGFTb3VyY2VWYWx1ZVxuICAgICAgICAgICAgICAgICAgOiBbZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWVdO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXJzLm9wZXJhdGlvbkZpbHRlcltlbGVtZW50LmFwaU5hbWVdID0gZWxlbWVudC5maWx0ZXJEYXRhU291cmNlVmFsdWUuam9pbihcIixcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICB9KTtcbiAgICBsZXQgYXBpQ2FsbHMgPSBbXTtcbiAgICB0aGlzLmRlZmF1bHRBcHBseWVkRmlsdGVyID0gZGVmYXVsdEZpbHRlcnM7XG5cbiAgICBQcm9taXNlLmFsbChhcGlDYWxscykudGhlbigoKSA9PiB7XG4gICAgICAvLyB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3QgPSB0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldFVuaXF1ZURhdGFTZXRPYmplY3QoKTtcbiAgICAgIHRoaXMuY3JlYXRlRGl2RWxlbWVudHModGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0KTtcbiAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuXG4gIH1cblxuICBnZXREYXRhU2V0KCkge1xuICAgIHRoaXMuaXNMb2FkZXIgPSB0cnVlO1xuICAgIHRoaXMuc2VydmljZS5nZXRBcHBEYXRhc2V0Q29uZmlncygpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZGF0YVNldHRhYmxlRGF0YVNvdXJjZSA9IGRhdGE7XG4gICAgICAgIHRoaXMuaXNMb2FkZXIgPSBmYWxzZTtcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdEYXRhc2V0IENyZWF0aW9uJylcblxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuXG5cblxuICBnZXRDb21wb25lbnRDb25maWcoZXZlbnQpIHtcbiAgICBjb25zdCBmb3VuZE9iamVjdCA9IHRoaXMuY29tcG9uZW50Q29uZmlnRGF0YVNvdXJjZS5maW5kKHZpZXcgPT4gdmlldy52aWV3SWQgPT09IGV2ZW50LnZpZXdJZCk7XG4gICAgdGhpcy5nZXRFbWl0TmV3Q2hhcnRDb25maWcoZm91bmRPYmplY3QpO1xuICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgfVxuXG4gIGFkZE5ld2NoYXJ0KCkge1xuICAgIHRoaXMuaXNHZW5lcmF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuaXNDaGFydEJ1dHRvbkNsaWNrID0gdHJ1ZTtcbiAgICB0aGlzLmlzV2lkZ2V0Q3JlYXRpb25Db250ZW50ID0gZmFsc2U7XG4gICAgdGhpcy5pc0RlZmF1bHRWaWV3ID0gZmFsc2U7XG4gIH1cblxuXG4gIGFkZFdpZGdldCgpIHtcbiAgICB0aGlzLm5ld1dpZGdldEluZGV4ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuaXNXaWRnZXRDcmVhdGlvbkNvbnRlbnQgPSB0cnVlO1xuICAgIHRoaXMuaXNEZWZhdWx0VmlldyA9IGZhbHNlO1xuICAgIHRoaXMuaXNFZGl0TWFpbkxheW91dCA9IGZhbHNlO1xuICAgIHRoaXMuaXNDaGFydEJ1dHRvbkNsaWNrID0gZmFsc2U7XG4gICAgdGhpcy5pc1VwZGF0ZVdpZGdldCA9IGZhbHNlO1xuICAgIHRoaXMud2lkZ2V0TmFtZSA9ICcnO1xuICAgIHRoaXMud2lkZ2V0VGl0bGUgPSAnJztcbiAgICB0aGlzLmFkZGVkd2lkR2V0Q29uZmlnID0ge1xuICAgICAgXCJkaXNwbGF5XCI6IHRydWUsXG4gICAgICBcIndpZGdldFRpdGxlXCI6IFwiXCIsXG4gICAgICBcIndpZHRoXCI6IFwiXCIsXG4gICAgICBcImhlaWdodFwiOiBcIlwiLFxuICAgICAgXCJpc1dpZGdldEZpbHRlclwiOiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIGdldFdpdGgoZSkge1xuICAgIHRoaXMuc2VsZWN0ZWRXaWR0aCA9IGUudmFsdWU7XG4gIH1cblxuICBnZXRIZWlnaHQoZSkge1xuICAgIHRoaXMuc2VsZWN0ZWRIZWlnaHQgPSBlLnZhbHVlO1xuICB9XG5cbiAgYWRkTGF5b3V0VE92aWV3KCkge1xuICAgIGxldCBpbm5lcl9ub2RlID0ge1xuICAgICAgaWQ6IHRoaXMuY29tbW9uU2VydmljZS5wcmltZXJ5UmVuZG9tZUlkKDUpLFxuICAgICAgbm9kZVRpdGxlOiBcIlwiLFxuICAgICAgZmlsdGVySWQ6IHRoaXMuc2VsZWN0ZWRGaWx0ZXJJZCxcbiAgICAgIG5vZGVQcm9wZXJ0aWVzOiB0aGlzLmFkZGVkd2lkR2V0Q29uZmlnLFxuICAgICAgY29tcENvbmZpZzoge1xuICAgICAgICBkeW5hbWljQ29tcG9uZW50UmVmczogW10sXG4gICAgICAgIHZpZXdDb25maWc6IFtdXG4gICAgICB9LFxuICAgIH1cbiAgICBpZiAodGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t0aGlzLm5ld1dpZGdldEluZGV4XS53aWRnZXROb2RlKSB7XG4gICAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUucHVzaChpbm5lcl9ub2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t0aGlzLm5ld1dpZGdldEluZGV4XS53aWRnZXROb2RlID0gW107XG4gICAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUucHVzaChpbm5lcl9ub2RlKTtcbiAgICB9XG5cbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgdGhpcy51cGRhdGVXaWRnZXQoKTtcbiAgfVxuXG5cblxuICByZWZvcm1hdFdpZGdldENvbmZpZyhkYXNoQm9hcmRXaWRnZXRDb25maWcsIGluZGV4ID0gbnVsbCkge1xuICAgIGNvbnN0IHByb2Nlc3NXaWRnZXQgPSAod2lkZ2V0KSA9PiB7XG4gICAgICB3aWRnZXQuY29tcENvbmZpZy52aWV3Q29uZmlnID0gd2lkZ2V0LmNvbXBDb25maWcudmlld0NvbmZpZy5tYXAoY29uZmlnID0+IGNvbmZpZy52aWV3SWQpO1xuICAgICAgd2lkZ2V0LmNvbXBDb25maWcuZHluYW1pY0NvbXBvbmVudFJlZnMgPSBbXTtcblxuICAgICAgaWYgKHdpZGdldC53aWRnZXROb2RlICYmIHdpZGdldC53aWRnZXROb2RlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgd2lkZ2V0LndpZGdldE5vZGUuZm9yRWFjaChub2RlID0+IHtcbiAgICAgICAgICBub2RlLmNvbXBDb25maWcudmlld0NvbmZpZyA9IG5vZGUuY29tcENvbmZpZy52aWV3Q29uZmlnLm1hcChjb25maWcgPT4gY29uZmlnLnZpZXdJZCk7XG4gICAgICAgICAgbm9kZS5jb21wQ29uZmlnLmR5bmFtaWNDb21wb25lbnRSZWZzID0gW107XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoaW5kZXggIT09IG51bGwgJiYgaW5kZXggPj0gMCAmJiBpbmRleCA8IGRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLmxlbmd0aCkge1xuICAgICAgcHJvY2Vzc1dpZGdldChkYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1tpbmRleF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5mb3JFYWNoKHdpZGdldCA9PiBwcm9jZXNzV2lkZ2V0KHdpZGdldCkpO1xuICAgIH1cblxuICAgIHJldHVybiBkYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1tpbmRleF07XG4gIH1cblxuICB1cGRhdGVXaWRnZXQoKSB7XG4gICAgbGV0IG1vZGlmaWVkQ29uZmlnID0gdGhpcy5yZWZvcm1hdFdpZGdldENvbmZpZyh0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZywgdGhpcy5uZXdXaWRnZXRJbmRleCk7XG4gICAgbW9kaWZpZWRDb25maWdbJ2ZpbHRlcklkJ10gPSAobW9kaWZpZWRDb25maWcuZmlsdGVycyAmJiBtb2RpZmllZENvbmZpZy5maWx0ZXJzLmZpbHRlcklkKSA/IG1vZGlmaWVkQ29uZmlnLmZpbHRlcnMuZmlsdGVySWQgOiBudWxsO1xuICAgIGRlbGV0ZSBtb2RpZmllZENvbmZpZ1snZmlsdGVycyddO1xuICAgIHRoaXMuc2VydmljZS5lZGl0QXBwV2lkZ2V0Q29uZmlnKG1vZGlmaWVkQ29uZmlnKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmdldEFwcFBhZ2VEZXRhaWxDb25maWdCeVBhZ2VJZCgpXG4gICAgICAgIHRoaXMuYmFja1RvTWFpblZpZXcoKTtcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdXaWRnZXQgQ3JlYXRpb24nKVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5uZXdXaWRnZXRJbmRleCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmlzV2lkZ2V0Q3JlYXRpb25Db250ZW50ID0gZmFsc2U7XG4gICAgdGhpcy5pc0RlZmF1bHRWaWV3ID0gdHJ1ZTtcbiAgfVxuXG4gIHVwZGF0ZUxheW91dFdpZGdldFRPdmlldygpIHtcbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgdGhpcy51cGRhdGVXaWRnZXQoKTtcbiAgfVxuXG4gIGFkZFdpZGdldFRPdmlldygpIHtcbiAgICBsZXQgb2JqID0ge1xuICAgICAgd2lkZ2V0SWQ6IHRoaXMuY29tbW9uU2VydmljZS5wcmltZXJ5UmVuZG9tZUlkKDUpLFxuICAgICAgd2lkZ2V0TmFtZTogdGhpcy53aWRnZXROYW1lLFxuICAgICAgd2lkZ2V0VGl0bGU6IHRoaXMud2lkZ2V0VGl0bGUsXG4gICAgICB3aWRnZXRQcm9wZXJ0aWVzOiB0aGlzLmFkZGVkd2lkR2V0Q29uZmlnLFxuICAgICAgcGFnZUlkOiB0aGlzLnBhZ2VJZCxcbiAgICAgIGZpbHRlcklkOiB0aGlzLnNlbGVjdGVkRmlsdGVySWQsXG4gICAgICB3aWRnZXROb2RlOiBbXG4gICAgICAgIFxuICAgICAgXSxcbiAgICAgIGNvbXBDb25maWc6IHtcbiAgICAgICAgZHluYW1pY0NvbXBvbmVudFJlZnM6IFtdLFxuICAgICAgICB2aWV3Q29uZmlnOiBbXVxuICAgICAgfSxcbiAgICB9XG4gICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgIHRoaXMuc2VydmljZS5jcmVhdGVBcHBXaWRnZXRDb25maWcob2JqKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgICAvLyB0aGlzLmNyZWF0ZURpdkVsZW1lbnRzKHRoaXMudW5pcXVlRGF0YVNldE9iamVjdClcbiAgICAgICAgdGhpcy5nZXRBcHBQYWdlRGV0YWlsQ29uZmlnQnlQYWdlSWQoKVxuXG4gICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdXaWRnZXQgQ3JlYXRpb24nKVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5wdXNoKG9iailcbiAgICAvLyB0aGlzLmluc2VydER5bmFtaWNDb21wb25lbnRzKCk7XG5cblxuICAgIHRoaXMuZHluYW1pY0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9ICcnO1xuXG4gICAgdGhpcy5pc1dpZGdldENyZWF0aW9uQ29udGVudCA9IGZhbHNlO1xuICAgIHRoaXMuaXNEZWZhdWx0VmlldyA9IHRydWU7XG4gIH1cblxuICBpbnNlcnROZXdXaWdldChpbmRleCkge1xuICAgIHRoaXMuYWRkZWR3aWRHZXRDb25maWcgPSB7XG4gICAgICBcImRpc3BsYXlcIjogdHJ1ZSxcbiAgICAgIFwid2lkZ2V0VGl0bGVcIjogXCJcIixcbiAgICAgIFwid2lkdGhcIjogXCJcIixcbiAgICAgIFwiaGVpZ2h0XCI6IFwiXCIsXG4gICAgICBcImlzV2lkZ2V0RmlsdGVyXCI6IGZhbHNlXG4gICAgfVxuICAgIHRoaXMuaXNVcGRhdGVXaWRnZXQgPSBmYWxzZTtcbiAgICB0aGlzLmlzV2lkZ2V0Q3JlYXRpb25Db250ZW50ID0gdHJ1ZTtcbiAgICB0aGlzLmlzRGVmYXVsdFZpZXcgPSBmYWxzZTtcbiAgICB0aGlzLmlzQ2hhcnRCdXR0b25DbGljayA9IGZhbHNlO1xuICAgIHRoaXMuaXNsYXlvdXRDcmVhdGUgPSB0cnVlO1xuICAgIHRoaXMubmV3V2lkZ2V0SW5kZXggPSBpbmRleDtcbiAgfVxuICBpbnNlcnRDaGFydFdpZ2V0KGluZGV4T2JqLCBjb250YWluZXJFbGVtZW50KSB7XG5cbiAgICB0aGlzLmlzR2VuZXJhdGUgPSBmYWxzZTtcbiAgICB0aGlzLmlzQ2hhcnRCdXR0b25DbGljayA9IHRydWU7XG4gICAgdGhpcy5pc1dpZGdldENyZWF0aW9uQ29udGVudCA9IGZhbHNlO1xuICAgIHRoaXMuaXNEZWZhdWx0VmlldyA9IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0ZWRDb250YWluZXJPYmplY3RGb3JDaGFydCA9IGNvbnRhaW5lckVsZW1lbnQ7XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4T2JqRm9yQ2hhcnQgPSBpbmRleE9iajtcbiAgICB0aGlzLnNlbGVjdGVkVmlld0Zvcm1Db21wb25lbnQgPSB7fTtcbiAgfVxuXG4gIGFzeW5jIGdldEVtaXROZXdDaGFydENvbmZpZyhkYXRhKSB7XG4gICAgLy8gbGV0IGRhdGFzZXRfY29uZmlnID0gdGhpcy5kYXRhU2V0TW9kYWwuZmluZChkYXRhc2V0ID0+IGRhdGFzZXQuZGF0YXNldElkID09IGRhdGEuZGF0YXNldElkKTtcbiAgICAvLyBhd2FpdCB0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YVNldChkYXRhc2V0X2NvbmZpZywgZGF0YXNldF9jb25maWcuZGF0YXNldElkLCB0aGlzLnNlbGVjdGVkRmlsdGVyc0RlZmF1bHQpXG4gICAgLy8gZGF0YS5rcGlDb25maWdbJ2RhdGFTb3VyY2UnXSA9IHRoaXMudW5pcXVlRGF0YVNldE9iamVjdFtkYXRhc2V0X2NvbmZpZy5kYXRhc2V0SWRdO1xuICAgIHRoaXMuc2VsZWN0ZWRJbmRleE9iakZvckNoYXJ0LmNvbXBDb25maWcudmlld0NvbmZpZy5wdXNoKGRhdGEpXG4gICAgdGhpcy5sb2FkRHluYW1pY0NvbXBvbmVudChkYXRhLCB0aGlzLnNlbGVjdGVkSW5kZXhPYmpGb3JDaGFydCwgdGhpcy5zZWxlY3RlZENvbnRhaW5lck9iamVjdEZvckNoYXJ0KTtcbiAgICBjb25zb2xlLmxvZyh0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZylcbiAgICB0aGlzLnVwZGF0ZVdpZGdldCgpO1xuICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgdGhpcy5pc0NoYXJ0QnV0dG9uQ2xpY2sgPSBmYWxzZTtcblxuICAgIC8vIH1cblxuICB9XG5cbiAgdXBkYXRlVG9WaWV3KCkge1xuICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLnVwZGF0ZVdpZGdldCgpO1xuICB9XG5cbiAgZGVsZXRlV2lkZ2V0KGl0ZW0sIGluZGV4KSB7XG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgdGhpcy5uZXdXaWRnZXRJbmRleCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGRlbGV0ZUluc2VydFdpZGdldChpdGVtLCBjaGlsZEluZGV4LCBwYXJlbnRJbmRleCkge1xuICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbcGFyZW50SW5kZXhdLndpZGdldE5vZGUuc3BsaWNlKGNoaWxkSW5kZXgsIDEpXG4gICAgdGhpcy5uZXdXaWRnZXRJbmRleCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldFdpZGdldFRpdGxlRGl2KGl0ZW0sIGRpdikge1xuICAgIGNvbnN0IHdpZGdldERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHdpZGdldERpdi5jbGFzc0xpc3QuYWRkKCdmbGV4JywgJ2l0ZW1zLWNlbnRlcicsICdqdXN0aWZ5LWJldHdlZW4nLCAnZm9udC1ib2xkJywgJ3RleHQtbWQnLCAndGV4dC1ncmF5LTkwMCcsICdkYXJrOnRleHQtd2hpdGUnLCAnYm9yZGVyLWInLCAncC0zJywgJ2JnLWdyYXktODAwJywgJ214LTInLCAncm91bmRlZC10LWxnJyk7XG4gICAgY29uc3QgdGl0bGVEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aXRsZURpdi5pbm5lclRleHQgPSAoaXRlbS5ub2RlUHJvcGVydGllcykgPyBpdGVtLm5vZGVQcm9wZXJ0aWVzLndpZGdldFRpdGxlIDogXCJcIjtcbiAgICB3aWRnZXREaXYuYXBwZW5kKHRpdGxlRGl2KVxuXG4gICAgLy8gQWRkIEZvbnRBd2Vzb21lIGVkaXQgaWNvblxuICAgIGNvbnN0IGVkaXRJY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xuICAgIGVkaXRJY29uLmNsYXNzTGlzdC5hZGQoJ2ZhJywgJ2ZhLXBlbmNpbCcsICdtbC0yJywgJ2N1cnNvci1wb2ludGVyJywgJ3RleHQtYmx1ZS00MDAnLCAnaG92ZXI6dGV4dC1ibHVlLTcwMCcpO1xuICAgIHdpZGdldERpdi5hcHBlbmQoZWRpdEljb24pO1xuXG4gICAgaWYgKGl0ZW0ubm9kZVByb3BlcnRpZXMuaXNXaWRnZXRGaWx0ZXIpIHtcbiAgICAgIGNvbnN0IHNlYXJjaENvbnRhaW5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgc2VhcmNoQ29udGFpbmVyRGl2LmNsYXNzTGlzdC5hZGQoJ2ZsZXgnLCAnaXRlbXMtY2VudGVyJywgJ3NwYWNlLXgtMicpO1xuICAgICAgY29uc3Qgc2VhcmNoQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICBzZWFyY2hCdXR0b24uaW5uZXJUZXh0ID0gJ0ZpbHRlcic7XG4gICAgICBzZWFyY2hCdXR0b24uY2xhc3NMaXN0LmFkZCgncHgtMycsICdweS0xLjUnLCAnYmctYmx1ZS02MDAnLCAnbXItMicsICd0ZXh0LXdoaXRlJywgJ3JvdW5kZWQnLCAnaG92ZXI6YmctYmx1ZS03MDAnKTtcbiAgICAgIHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlID0gW107XG5cbiAgICAgIHNlYXJjaEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgdGhpcy5pc1dpZGdldEZpbHRlcnMgPSB0cnVlO1xuICAgICAgICBsZXQgZmlsdGVQcm9wZXJ0aWNlID0gW107XG4gICAgICAgIGl0ZW0uY29tcENvbmZpZy52aWV3Q29uZmlnLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgbGV0IGtleV9uYW1lID0gdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0W2VsZW1lbnQuZGF0YXNldElkXVswXTtcbiAgICAgICAgICBPYmplY3Qua2V5cyhrZXlfbmFtZSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKCFmaWx0ZVByb3BlcnRpY2UuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICBmaWx0ZVByb3BlcnRpY2UucHVzaChrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBmaWx0ZVByb3BlcnRpY2UuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgY29sdW1uTmFtZTogZWxlbWVudCxcbiAgICAgICAgICAgIGRhdGFUeXBlOiBcImZsb2F0XCIsXG4gICAgICAgICAgICBvcGVyYXRvcjogXCJcIixcbiAgICAgICAgICAgIHZhbHVlOiBcIlwiLFxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm5vZGVwcm9wZXJ0aWNlRmlsdGVyRGF0YVNvdXJjZS5wdXNoKG9iailcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHNlYXJjaENvbnRhaW5lckRpdi5hcHBlbmRDaGlsZChzZWFyY2hCdXR0b24pXG4gICAgICB3aWRnZXREaXYuYXBwZW5kQ2hpbGQodGl0bGVEaXYpO1xuICAgICAgd2lkZ2V0RGl2LmFwcGVuZENoaWxkKHNlYXJjaENvbnRhaW5lckRpdik7XG4gICAgfVxuXG4gICAgaWYgKGl0ZW0uZmlsdGVySWQpIHtcbiAgICAgIHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlID0ge307XG4gICAgICB0aGlzLm5vZGVwcm9wZXJ0aWNlRmlsdGVyRGF0YVNvdXJjZVsndmlld0NvbmZpZyddID0gaXRlbTtcbiAgICAgIHRoaXMubm9kZXByb3BlcnRpY2VGaWx0ZXJEYXRhU291cmNlWydoYXZpbmdDb25maWcnXSA9IFtdO1xuXG4gICAgICB0aGlzLnNlcnZpY2UuZ2V0QXBwRmlsdGVyQ29uZmlnKGl0ZW0uZmlsdGVySWQpLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICB0aGlzLmxvYWRXaWRnZXRGaWx0ZXJDb21wb25lbnQoaXRlbSwgd2lkZ2V0RGl2LCBkYXRhLmZpbHRlckl0ZW1zKTtcbiAgICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoaXRlbS5ub2RlUHJvcGVydGllcy5ub2RlZmlsdGVycyAmJiBpdGVtLm5vZGVQcm9wZXJ0aWVzLm5vZGVmaWx0ZXJzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgY29uc3Qgc2VhcmNoQ29udGFpbmVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBzZWFyY2hDb250YWluZXJEaXYuY2xhc3NMaXN0LmFkZCgnZmxleCcsICdpdGVtcy1jZW50ZXInLCAnc3BhY2UteC0yJyk7XG4gICAgICBpdGVtLm5vZGVQcm9wZXJ0aWVzLm5vZGVmaWx0ZXJzLmZvckVhY2goZmlsdGVyID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGZpbHRlckRpdi5jbGFzc0xpc3QuYWRkKCdmbGV4JywgJ2l0ZW1zLWNlbnRlcicpO1xuICAgICAgICBpZiAoZmlsdGVyLmlucHV0X3R5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgIGNvbnN0IHRleHRCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgICAgIHRleHRCb3gudHlwZSA9ICd0ZXh0JztcbiAgICAgICAgICB0ZXh0Qm94LnBsYWNlaG9sZGVyID0gYEVudGVyICR7ZmlsdGVyLmxvY2FsX2NvbHVtbn1gO1xuICAgICAgICAgIHRleHRCb3guY2xhc3NMaXN0LmFkZCgncHgtMicsICdweS0xLjUnLCAncm91bmRlZCcsICdib3JkZXInLCAnbXItMScsICdib3JkZXItZ3JheS01MDAnLCAndGV4dC1ncmF5LTkwMCcsICdkYXJrOmJnLWdyYXktNzAwJywgJ2Rhcms6dGV4dC13aGl0ZScpO1xuICAgICAgICAgIGNvbnN0IHNlYXJjaEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgICAgIHNlYXJjaEJ1dHRvbi5pbm5lclRleHQgPSAnU2VhcmNoJztcbiAgICAgICAgICBzZWFyY2hCdXR0b24uY2xhc3NMaXN0LmFkZCgncHgtMycsICdweS0xLjUnLCAnYmctYmx1ZS02MDAnLCAnbXItMicsICd0ZXh0LXdoaXRlJywgJ3JvdW5kZWQnLCAnaG92ZXI6YmctYmx1ZS03MDAnKTtcbiAgICAgICAgICBjb25zdCBzZXBhcmVyb3RCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICBzZXBhcmVyb3RCdXR0b24uaW5uZXJIVE1MID0gJ3wnO1xuICAgICAgICAgIHNlYXJjaEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlYXJjaFRlcm0gPSB0ZXh0Qm94LnZhbHVlO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1RleHQgc2VhcmNoIGJ1dHRvbiBjbGlja2VkIHdpdGg6Jywgc2VhcmNoVGVybSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZmlsdGVyRGl2LmFwcGVuZENoaWxkKHRleHRCb3gpO1xuICAgICAgICAgIGZpbHRlckRpdi5hcHBlbmRDaGlsZChzZWFyY2hCdXR0b24pO1xuICAgICAgICAgIGZpbHRlckRpdi5hcHBlbmRDaGlsZChzZXBhcmVyb3RCdXR0b24pO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VhcmNoQ29udGFpbmVyRGl2LmFwcGVuZENoaWxkKGZpbHRlckRpdik7XG4gICAgICB9KTtcbiAgICAgIHdpZGdldERpdi5hcHBlbmRDaGlsZChzZWFyY2hDb250YWluZXJEaXYpO1xuICAgIH1cblxuICAgIGVkaXRJY29uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuXG4gICAgICB0aGlzLm5ld1dpZGdldEluZGV4ID0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5maW5kSW5kZXgob2JqZWN0ID0+IG9iamVjdC53aWRnZXRJZCA9PT0gZGl2LndpZGdldElkKTtcbiAgICAgIHRoaXMuaXNVcGRhdGVXaWRnZXQgPSB0cnVlO1xuICAgICAgdGhpcy5pc2xheW91dENyZWF0ZSA9IHRydWU7XG4gICAgICB0aGlzLmlzV2lkZ2V0Q3JlYXRpb25Db250ZW50ID0gdHJ1ZTtcbiAgICAgIHRoaXMuaXNEZWZhdWx0VmlldyA9IGZhbHNlO1xuICAgICAgdGhpcy5pc0NoYXJ0QnV0dG9uQ2xpY2sgPSBmYWxzZTtcbiAgICAgIHRoaXMubm9kZVByb3BlcnRpY2VGaWx0ZXJzID0gKGl0ZW0ubm9kZVByb3BlcnRpZXMubm9kZWZpbHRlcnMgJiYgaXRlbS5ub2RlUHJvcGVydGllcy5ub2RlZmlsdGVycy5sZW5ndGggIT09IDApID8gaXRlbS5ub2RlUHJvcGVydGllcy5ub2RlZmlsdGVycyA6IFtdO1xuICAgICAgaXRlbS5ub2RlUHJvcGVydGllc1snbm9kZWZpbHRlcnMnXSA9IHRoaXMubm9kZVByb3BlcnRpY2VGaWx0ZXJzO1xuICAgICAgdGhpcy5hZGRlZHdpZEdldENvbmZpZyA9IGl0ZW0ubm9kZVByb3BlcnRpZXM7XG4gICAgICB0aGlzLmFsbFdpZGdldElubmVyQ29udGVudCA9IGl0ZW0uY29tcENvbmZpZy52aWV3Q29uZmlnO1xuICAgICAgdGhpcy5zZWxlY3RlZEZpbHRlcklkID0gKGl0ZW0uZmlsdGVySWQpID8gaXRlbS5maWx0ZXJJZCA6IFwiXCI7XG4gICAgICB0aGlzLmVkaXRWaWV3ZGF0YVNvdXJjZU1vZGFsID0ge307XG4gICAgICB0aGlzLnNlbGVjdGVkRmlsdGVyRGF0YXNvdXJjZSA9IGl0ZW07XG4gICAgfSk7XG4gICAgcmV0dXJuIHdpZGdldERpdjtcbiAgfVxuXG5cbiAgZ2V0RmlsdGVyVmFsdWVCeUlkKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmV2ZW50KSB7XG4gICAgICB0aGlzLnNlcnZpY2UuZ2V0QXBwRmlsdGVyQ29uZmlnKGV2ZW50LnZhbHVlKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuc2VsZWN0ZWRGaWx0ZXJEYXRhc291cmNlKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJEYXRhc291cmNlLmZpbHRlcklkID0gdGhpcy5zZWxlY3RlZEZpbHRlcklkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLmZpbHRlcnMgPSBkYXRhO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKFwiRmlsdGVyIENoYW5nZWRcIilcbiAgICAgICAgfSwgZXJyb2U6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnRmlsdGVyIFVwZGF0ZScpXG5cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuXG4gIGNyZWF0ZURpdkVsZW1lbnRzKGRhdGFzZXRCeUlkKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5keW5hbWljQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcblxuICAgIGNvbnN0IG11bHRpSXRlbURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIG11bHRpSXRlbURpdi5jbGFzc0xpc3QuYWRkKFwiZmxleFwiLCBcImZsZXgtcm93XCIsIFwianVzdGlmeS1iZXR3ZWVuXCIpO1xuICAgIC8vIGNvbnRhaW5lci5hcHBlbmRDaGlsZChtdWx0aUl0ZW1EaXYpXG4gICAgXG4gICAgY29uc3QgY29udGV4dF9maWx0ZXIgPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy5maWx0ZXJzID8gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcuZmlsdGVycy5maWx0ZXJJdGVtcyA6IG51bGw7XG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5mb3JFYWNoKGFzeW5jIGRpdiA9PiB7XG4gICAgICBjb25zdCByb3dEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGxldCB3X2hlaWdodCA9IChkaXYud2lkZ2V0UHJvcGVydGllcy5oZWlnaHQgPT0gXCJcIikgPyBcImgtYXV0b1wiIDogJ2gtWycgKyBkaXYud2lkZ2V0UHJvcGVydGllcy5oZWlnaHQgKyAnXSc7XG4gICAgICByb3dEaXYuY2xhc3NMaXN0LmFkZChkaXYud2lkZ2V0UHJvcGVydGllcy53aWR0aCwgd19oZWlnaHQsICdib3JkZXInKTtcbiAgICAgIGNvbnN0IGZpbHRlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICBjb25zdCBmaWx0ZXJJdGVtcyA9IChkaXYuZmlsdGVycykgPyBkaXYuZmlsdGVycy5maWx0ZXJJdGVtcyA6IFtdO1xuICAgICAgLy8gaWYgKGRpdi5maWx0ZXJzKSB7XG4gICAgICB0aGlzLmxvYWRGaWx0ZXJDb21wb25lbnQoZGl2LCBmaWx0ZXJEaXYsIGZpbHRlckl0ZW1zLCBjb250ZXh0X2ZpbHRlcik7XG5cbiAgICAgIC8vIH1cblxuICAgICAgcm93RGl2LmFwcGVuZENoaWxkKGZpbHRlckRpdilcbiAgICAgIC8vZm9yIG11bHRpcGxlIHZpZXdcbiAgICAgXG5cbiAgICAgIGlmIChkaXYud2lkZ2V0Tm9kZSAmJiBkaXYud2lkZ2V0Tm9kZS5sZW5ndGggJiYgZGl2LndpZGdldE5vZGUubGVuZ3RoICE9IDApIHtcbiAgICAgICAgY29uc3QgbWFpbkl0ZW1EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgbWFpbkl0ZW1EaXYuY2xhc3NMaXN0LmFkZChcImZsZXhcIiwgXCJmbGV4LXdyYXBcIixcInctZnVsbFwiKTtcbiAgICAgICAgdGhpcy5sb2FkV2lkZ2V0Tm9kZXMoZGl2LCBtYWluSXRlbURpdiwgZGF0YXNldEJ5SWQpO1xuICAgICAgICAvLyBmb3IgbG9vcCBvbiB3aWRnZXRcbiAgICAgICAgcm93RGl2LmFwcGVuZENoaWxkKG1haW5JdGVtRGl2KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcF9pbm5lckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgcF9pbm5lckRpdi5jbGFzc0xpc3QuYWRkKCdyb3VuZGVkJywgJ2p1c3RpZnktY2VudGVyJywgJ2l0ZW1zLWNlbnRlcicsICdib3JkZXInLCAncC0xJywgJ20tMScsICdmbGV4JywgJ2ZsZXgtcm93Jyk7XG4gICAgICAvLyBhZGQgd2lkZ2V0IGJ1dHRvblxuICAgICAgY29uc3QgcF9idXR0b25fd2lkZ2V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBwX2J1dHRvbl93aWRnZXQuaW5uZXJUZXh0ID0gJ0FkZCBTaW5nbGUgTGF5b3V0JztcbiAgICAgIHBfYnV0dG9uX3dpZGdldC5jbGFzc0xpc3QuYWRkKCdiZy1ibHVlLTcwMCcsIFwicC0xXCIsIFwidy1maXRcIiwgXCJjdXJzb3ItcG9pbnRlclwiLCAndGV4dC14cycpXG4gICAgICBwX2J1dHRvbl93aWRnZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG5cbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5maW5kSW5kZXgob2JqZWN0ID0+IG9iamVjdC53aWRnZXRJZCA9PT0gZGl2LndpZGdldElkKTtcbiAgICAgICAgdGhpcy5pbnNlcnROZXdXaWdldChpbmRleCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gZGVsZXRlIHdpZGdldCBidXR0b25cbiAgICAgIGNvbnN0IHBfZGVsX2J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgcF9kZWxfYnV0dG9uLmlubmVyVGV4dCA9ICdEZXRldGUgbGF5b3V0JztcbiAgICAgIHBfZGVsX2J1dHRvbi5jbGFzc0xpc3QuYWRkKCdiZy1yZWQtNzAwJywgXCJwLTFcIiwgXCJ3LWZpdFwiLCBcImN1cnNvci1wb2ludGVyXCIsICd0ZXh0LXhzJylcbiAgICAgIHBfZGVsX2J1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcblxuXG4gICAgICAgIGxldCByZXN1bHQgPSBjb25maXJtKFwiPGk+QXJlIFlvdSBTdXJlPzwvaT5cIiwgXCJEZWxldGUgTGF5b3V0XCIpO1xuICAgICAgICByZXN1bHQudGhlbigoZGlhbG9nUmVzdWx0KSA9PiB7XG4gICAgICAgICAgaWYgKGRpYWxvZ1Jlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cyA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMubWFwKGNvbmZpZyA9PiBjb25maWcud2lkZ2V0SWQpO1xuICAgICAgICAgICAgcm93RGl2LnJlbW92ZSgpXG5cbiAgICAgICAgICAgIHRoaXMuc2VydmljZS5lZGl0QXBwUGFnZUNvbmZpZyh0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZykuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0QXBwUGFnZURldGFpbENvbmZpZ0J5UGFnZUlkKClcbiAgICAgICAgICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdXaWRnZXQgQ3JlYXRpb24nKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdGhpcy5uZXdXaWRnZXRJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuaXNXaWRnZXRDcmVhdGlvbkNvbnRlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaXNEZWZhdWx0VmlldyA9IHRydWU7XG5cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICAvLyBhZHZhbmNlZCBidXR0b25cbiAgICAgIGNvbnN0IGFkdmFuY2VfYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBhZHZhbmNlX2J1dHRvbi5pbm5lclRleHQgPSAnQWR2YW5jZSBMYXlvdXQnO1xuICAgICAgYWR2YW5jZV9idXR0b24uY2xhc3NMaXN0LmFkZCgnYmcteWVsbG93LTcwMCcsIFwicC0xXCIsIFwidy1maXRcIiwgXCJjdXJzb3ItcG9pbnRlclwiLCAndGV4dC14cycpXG4gICAgICBhZHZhbmNlX2J1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgY29uc3QgY29tcF9vYmplY3QgPSB0aGlzLmZpbmRXaWRnZXRCeUlkKHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMsIGRpdi53aWRnZXRJZCk7XG4gICAgICAgIHRoaXMubmV3V2lkZ2V0SW5kZXggPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLmZpbmRJbmRleChvYmplY3QgPT4gb2JqZWN0LndpZGdldElkID09PSBkaXYud2lkZ2V0SWQpO1xuXG4gICAgICAgIHRoaXMuaXNBZHZhbmNlTGF5b3V0ID0gdHJ1ZTtcblxuICAgICAgfSk7XG5cbiAgICAgIHBfaW5uZXJEaXYuYXBwZW5kQ2hpbGQoYWR2YW5jZV9idXR0b24pO1xuICAgICAgcF9pbm5lckRpdi5hcHBlbmRDaGlsZChwX2J1dHRvbl93aWRnZXQpO1xuICAgICAgcF9pbm5lckRpdi5hcHBlbmRDaGlsZChwX2RlbF9idXR0b24pO1xuXG4gICAgICBpZiAoIXRoaXMuaXNEYXNoQm9hcmRDb250ZW50VHlwZVZpZXcpIHtcbiAgICAgICAgcm93RGl2LmFwcGVuZENoaWxkKHBfaW5uZXJEaXYpO1xuICAgICAgfVxuICAgICAgbXVsdGlJdGVtRGl2LmFwcGVuZENoaWxkKHJvd0Rpdik7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQobXVsdGlJdGVtRGl2KTtcbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRXaWRnZXROb2RlcyhkaXY6IGFueSwgbWFpbkl0ZW1EaXY6IGFueSwgZGF0YXNldEJ5SWQ6IGFueSkge1xuICAgIGRpdi53aWRnZXROb2RlLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICB0aGlzLmxvYWRTaW5nbGVXaWRnZXROb2RlKGl0ZW0sIG1haW5JdGVtRGl2LCBkYXRhc2V0QnlJZCwgZGl2KTtcbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRTaW5nbGVXaWRnZXROb2RlKGl0ZW06IGFueSwgY29udGFpbmVyRWxlbWVudDogSFRNTEVsZW1lbnQsIGRhdGFzZXRCeUlkOiBhbnksIGRpdikge1xuICAgIGxldCB3X2hlaWdodCA9IChpdGVtLm5vZGVQcm9wZXJ0aWVzLmhlaWdodCA9PSBcIlwiKSA/IFwiaC1hdXRvXCIgOiAnaC1bJyArIGl0ZW0ubm9kZVByb3BlcnRpZXMuaGVpZ2h0ICsgJ10nO1xuICAgIGxldCB3X3dpZHRoID0gKGl0ZW0ubm9kZVByb3BlcnRpZXMud2lkdGggPT0gXCJcIikgPyBcInctZnVsbFwiIDogaXRlbS5ub2RlUHJvcGVydGllcy53aWR0aDtcbiAgICBjb25zdCBpdGVtRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgaXRlbURpdi5jbGFzc0xpc3QuYWRkKHdfd2lkdGgsIHdfaGVpZ2h0LCAnYm9yZGVyJywgJ3AtMScpO1xuXG4gICAgY29uc3QgZmxleENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGZsZXhDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZmxleCcsICdqdXN0aWZ5LWJldHdlZW4nLCAnaXRlbXMtY2VudGVyJywgJ3RleHQtZ3JheS05MDAnLCAnZGFyazp0ZXh0LXdoaXRlJywgJ2JnLWdyYXktODAwJywgJ214LTInLCAncm91bmRlZC10LWxnJyk7IC8vIEZsZXhib3ggY29udGFpbmVyXG5cbiAgICBjb25zdCB3aWRnZXREaXYgPSB0aGlzLmdldFdpZGdldFRpdGxlRGl2KGl0ZW0sIGRpdilcbiAgICBpdGVtLmNvbXBDb25maWcudmlld0NvbmZpZy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQua3BpQ29uZmlnKSB7XG4gICAgICAgIGxldCBhcGlDYWxscyA9IFtdO1xuICAgICAgICB0aGlzLnNlcnZpY2UuZ2V0QXBwRGF0YXNldENvbmZpZyhlbGVtZW50LmRhdGFzZXRJZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAoZGF0YXNldDogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoZGF0YXNldC5kYXRhc2V0VHlwZSAhPT0gXCJzcWxRdWVyeVwiICYmIGRhdGFzZXQuZGF0YXNldFR5cGUgIT09IFwicGxhaW5qc29uXCIpIHtcbiAgICAgICAgICAgICAgY29uc3QgZGF0YXNldFdpdGhMaW1pdCA9IHRoaXMuc2V0RGF0YVNldHNMaW1pdChkYXRhc2V0KTtcbiAgICAgICAgICAgICAgYXBpQ2FsbHMucHVzaCh0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YVNldChkYXRhc2V0V2l0aExpbWl0LCBkYXRhc2V0V2l0aExpbWl0LmRhdGFzZXRJZCwgdGhpcy5kZWZhdWx0QXBwbHllZEZpbHRlcikpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYXBpQ2FsbHMucHVzaCh0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFGcm9tRGF0YVNldChkYXRhc2V0LCBkYXRhc2V0LmRhdGFzZXRJZCwgdGhpcy5kZWZhdWx0QXBwbHllZEZpbHRlcikpO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFByb21pc2UuYWxsKGFwaUNhbGxzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy51bmlxdWVEYXRhU2V0T2JqZWN0ID0gdGhpcy5kYXRhc2V0U2VydmljZS5nZXRVbmlxdWVEYXRhU2V0T2JqZWN0KCk7XG4gICAgICAgICAgICAgIGVsZW1lbnQua3BpQ29uZmlnWydkYXRhU291cmNlJ10gPSB0aGlzLnVuaXF1ZURhdGFTZXRPYmplY3RbZWxlbWVudC5kYXRhc2V0SWRdXG4gICAgICAgICAgICAgIGNvbnN0IGNvbXBfb2JqZWN0ID0gdGhpcy5maW5kV2lkZ2V0QnlJZCh0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLCBpdGVtLmlkKTtcbiAgICAgICAgICAgICAgdGhpcy5sb2FkRHluYW1pY0NvbXBvbmVudChlbGVtZW50LCBjb21wX29iamVjdCwgaXRlbURpdik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG5cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSk7XG4gICAgZmxleENvbnRhaW5lci5hcHBlbmRDaGlsZCh3aWRnZXREaXYpO1xuXG4gICAgLy8gQ3JlYXRlIGJ1dHRvbnMgY29udGFpbmVyIGZvciBhbGlnbm1lbnRcbiAgICBjb25zdCBidXR0b25zQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgYnV0dG9uc0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdmbGV4JywgJ214LTInKTsgLy8gVG8gYWxpZ24gYnV0dG9ucyBzaWRlIGJ5IHNpZGUgd2l0aCBzb21lIHNwYWNpbmdcblxuXG4gICAgY29uc3QgaW5uZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBpbm5lckRpdi5jbGFzc0xpc3QuYWRkKCdyb3VuZGVkJywgJ2p1c3RpZnktY2VudGVyJywgJ2l0ZW1zLWNlbnRlcicsICdwLTEnLCAnbS0xJywgJ2ZsZXgnLCAnZmxleC1yb3cnKTtcblxuICAgIGNvbnN0IGJ1dHRvbl9jaGFydCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGJ1dHRvbl9jaGFydC5pbm5lclRleHQgPSAnQWRkIFZpZXcnO1xuICAgIGJ1dHRvbl9jaGFydC5jbGFzc0xpc3QuYWRkKCdiZy1ncmVlbi03MDAnLCBcInAtMVwiLCBcInctZml0XCIsIFwiY3Vyc29yLXBvaW50ZXJcIiwgJ3RleHQteHMnKVxuICAgIGJ1dHRvbl9jaGFydC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRoaXMubmV3V2lkZ2V0SW5kZXggPSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLmZpbmRJbmRleChvYmplY3QgPT4gb2JqZWN0LndpZGdldElkID09PSBkaXYud2lkZ2V0SWQpO1xuICAgICAgY29uc3QgY29tcF9vYmplY3QgPSB0aGlzLmZpbmRXaWRnZXRCeUlkKHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMsIGl0ZW0uaWQpO1xuICAgICAgdGhpcy5pbnNlcnRDaGFydFdpZ2V0KGNvbXBfb2JqZWN0LCBpdGVtRGl2KTtcbiAgICB9KTtcblxuXG4gICAgY29uc3QgZGVsX2J1dHRvbl9jaGFydCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRlbF9idXR0b25fY2hhcnQuaW5uZXJUZXh0ID0gJ0RldGV0ZSc7XG4gICAgZGVsX2J1dHRvbl9jaGFydC5jbGFzc0xpc3QuYWRkKCdiZy1yZWQtNzAwJywgXCJwLTFcIiwgXCJ3LWZpdFwiLCBcImN1cnNvci1wb2ludGVyXCIsICd0ZXh0LXhzJylcbiAgICBkZWxfYnV0dG9uX2NoYXJ0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgbGV0IHJlc3VsdCA9IGNvbmZpcm0oXCI8aT5BcmUgWW91IFN1cmU/PC9pPlwiLCBcIkRlbGV0ZSBWaWV3XCIpO1xuICAgICAgcmVzdWx0LnRoZW4oKGRpYWxvZ1Jlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoZGlhbG9nUmVzdWx0KSB7XG4gICAgICAgICAgbGV0IHdpZGdldEluZGV4ID0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5maW5kSW5kZXgob2JqZWN0ID0+IG9iamVjdC53aWRnZXRJZCA9PT0gZGl2LndpZGdldElkKTtcbiAgICAgICAgICBjb25zdCBtYXBlZE9iamVjdCA9IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbd2lkZ2V0SW5kZXhdXG4gICAgICAgICAgaWYgKG1hcGVkT2JqZWN0LndpZGdldE5vZGUgJiYgbWFwZWRPYmplY3Qud2lkZ2V0Tm9kZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgbWFwSW5kZXggPSBtYXBlZE9iamVjdC53aWRnZXROb2RlLmZpbmRJbmRleChpbmQgPT4gaW5kLmlkID09PSBpdGVtLmlkKVxuICAgICAgICAgICAgbWFwZWRPYmplY3Qud2lkZ2V0Tm9kZS5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgICAgICBub2RlLmNvbXBDb25maWcudmlld0NvbmZpZyA9IG5vZGUuY29tcENvbmZpZy52aWV3Q29uZmlnLm1hcChjb25maWcgPT4gY29uZmlnLnZpZXdJZCk7XG4gICAgICAgICAgICAgIG5vZGUuY29tcENvbmZpZy5keW5hbWljQ29tcG9uZW50UmVmcyA9IFtdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBtYXBlZE9iamVjdC53aWRnZXROb2RlLnNwbGljZShtYXBJbmRleCwgMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1hcGVkT2JqZWN0WydmaWx0ZXJJZCddID0gKG1hcGVkT2JqZWN0LmZpbHRlcnMpID8gbWFwZWRPYmplY3QuZmlsdGVycy5maWx0ZXJJZCA6IG51bGw7XG4gICAgICAgICAgZGVsZXRlIG1hcGVkT2JqZWN0WydmaWx0ZXJzJ107XG4gICAgICAgICAgbWFwZWRPYmplY3QuY29tcENvbmZpZy5keW5hbWljQ29tcG9uZW50UmVmcyA9IFtdO1xuICAgICAgICAgIHRoaXMuc2VydmljZS5lZGl0QXBwV2lkZ2V0Q29uZmlnKG1hcGVkT2JqZWN0KS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmdldEFwcFBhZ2VEZXRhaWxDb25maWdCeVBhZ2VJZCgpXG4gICAgICAgICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnV2lkZ2V0IENyZWF0aW9uJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIHRoaXMubmV3V2lkZ2V0SW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICAgICAgaXRlbURpdi5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuXG4gICAgLy8gaW5uZXJEaXYuYXBwZW5kQ2hpbGQoYnV0dG9uX2NoYXJ0KTtcbiAgICAvLyBpbm5lckRpdi5hcHBlbmRDaGlsZChkZWxfYnV0dG9uX2NoYXJ0KTtcbiAgICAvLyBBcHBlbmQgYnV0dG9ucyB0byBidXR0b25zIGNvbnRhaW5lclxuICAgIGJ1dHRvbnNDb250YWluZXIuYXBwZW5kQ2hpbGQoYnV0dG9uX2NoYXJ0KTtcbiAgICBidXR0b25zQ29udGFpbmVyLmFwcGVuZENoaWxkKGRlbF9idXR0b25fY2hhcnQpO1xuXG4gICAgLy8gQWRkIHRoZSBidXR0b25zIGNvbnRhaW5lciB0byB0aGUgZmxleCBjb250YWluZXJcbiAgICBmbGV4Q29udGFpbmVyLmFwcGVuZENoaWxkKGJ1dHRvbnNDb250YWluZXIpO1xuICAgIGlmICghdGhpcy5pc0Rhc2hCb2FyZENvbnRlbnRUeXBlVmlldykge1xuICAgIH1cbiAgICBpdGVtRGl2LmFwcGVuZENoaWxkKGZsZXhDb250YWluZXIpO1xuICAgIC8vIGl0ZW1EaXYuYXBwZW5kQ2hpbGQod2lkZ2V0RGl2KTtcblxuICAgIGNvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQoaXRlbURpdilcblxuXG5cbiAgfVxuXG5cblxuICBmaW5kV2lkZ2V0QnlJZChjb25maWdzOiBhbnlbXSwgaWQ6IHN0cmluZyk6IGFueSB8IHVuZGVmaW5lZCB7XG4gICAgZm9yIChjb25zdCBjb25maWcgb2YgY29uZmlncykge1xuICAgICAgaWYgKGNvbmZpZy5pZCA9PT0gaWQpIHtcbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWcud2lkZ2V0Tm9kZSAmJiBjb25maWcud2lkZ2V0Tm9kZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5maW5kV2lkZ2V0QnlJZChjb25maWcud2lkZ2V0Tm9kZSwgaWQpO1xuICAgICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgICByZXR1cm4gZm91bmQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGRlbGV0ZVdpZGdldEJ5SWQoY29uZmlnczogYW55W10sIGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBmb3IgKGxldCBpID0gY29uZmlncy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgaWYgKGNvbmZpZ3NbaV0uaWQgPT09IGlkKSB7XG4gICAgICAgIGNvbmZpZ3Muc3BsaWNlKGksIDEpO1xuICAgICAgfSBlbHNlIGlmIChjb25maWdzW2ldLndpZGdldE5vZGUgJiYgY29uZmlnc1tpXS53aWRnZXROb2RlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5kZWxldGVXaWRnZXRCeUlkKGNvbmZpZ3NbaV0ud2lkZ2V0Tm9kZSwgaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxvYWREeW5hbWljQ29tcG9uZW50KGRhdGEsIGluZGV4T2JqLCBjb250YWluZXJFbGVtZW50KTogYW55IHtcbiAgICBjb25zdCBjb21wb25lbnRDbGFzcyA9IHRoaXMuY29tcG9uZW50Q2xhc3NNYXBbZGF0YS5rcGlDb25maWdbJ2NvbXBvbmVudE5hbWUnXV07XG4gICAgdGhpcy5Db21wUmVmcyA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50Q2xhc3MpO1xuICAgIGNvbnN0IGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZSA9IHRoaXMuQ29tcFJlZnMuaW5zdGFuY2U7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmNoYXJ0RGF0YVNvdXJjZSA9IGRhdGE7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmtwaV9uYW1lID0gXCJcIjtcblxuICAgIGluZGV4T2JqLmNvbXBDb25maWcuZHluYW1pY0NvbXBvbmVudFJlZnMucHVzaCh0aGlzLkNvbXBSZWZzKTtcbiAgICBjb25zdCBjc3NDbGFzcyA9IFwidy1mdWxsXCI7XG4gICAgdGhpcy5Db21wUmVmcy5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoY3NzQ2xhc3MpO1xuICAgIGNvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5Db21wUmVmcy5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KTtcbiAgfVxuXG4gIGxvYWRGaWx0ZXJDb21wb25lbnQoaW5kZXhPYmosIGNvbnRhaW5lckVsZW1lbnQsIGZpbHRlckl0ZW1zLCBjb250ZXh0X2ZpbHRlcikge1xuICAgIFxuICAgIGxldCBzZWxlY3RlZERhdGVzID0geyBzdGFydERhdGU6IHRoaXMuZGVmYXVsdFN0YXJ0RGF0ZSwgZW5kRGF0ZTogdGhpcy5kZWZhdWx0RW5kRGF0ZSB9XG4gICAgY29uc3QgY29tcG9uZW50Q2xhc3MgPSB0aGlzLmNvbXBvbmVudENsYXNzTWFwWydBcHBBZHZhbmNlSGVhZGVyQ29tcG9uZW50J107XG4gICAgdGhpcy5Db21wUmVmcyA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50Q2xhc3MpO1xuICAgIGNvbnN0IGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZSA9IHRoaXMuQ29tcFJlZnMuaW5zdGFuY2U7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLnNlbGVjdGVkRGF0ZXMgPSBzZWxlY3RlZERhdGVzO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5maWx0ZXJJdGVtcyA9IGZpbHRlckl0ZW1zO1xuXG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmNvbnRleHRGaWx0ZXJJdGVtcyA9IGNvbnRleHRfZmlsdGVyO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5wYWdlVGl0bGUgPSB0aGlzLnBhZ2VUaXRsZTtcbiAgICBkeW5hbWljQ29tcG9uZW50SW5zdGFuY2UuaXNFZGl0QnV0dG9uID0gZmFsc2U7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLmlzQWR2YW5jZUJ1dHRvbiA9IHRydWU7XG5cbiAgICBpbmRleE9iai5jb21wQ29uZmlnLmR5bmFtaWNDb21wb25lbnRSZWZzLnB1c2godGhpcy5Db21wUmVmcyk7XG4gICAgY29uc3QgY3NzQ2xhc3MgPSBcInctZnVsbFwiO1xuICAgIHRoaXMuQ29tcFJlZnMubG9jYXRpb24ubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKGNzc0NsYXNzKTtcbiAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuQ29tcFJlZnMubG9jYXRpb24ubmF0aXZlRWxlbWVudCk7XG4gIH1cblxuICBsb2FkV2lkZ2V0RmlsdGVyQ29tcG9uZW50KGluZGV4T2JqLCBjb250YWluZXJFbGVtZW50LCBmaWx0ZXJJdGVtcykge1xuICAgIGxldCB1c2VyTmFtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyX25hbWUnKVxuICAgIGxldCBzZWxlY3RlZERhdGVzID0geyBzdGFydERhdGU6IHRoaXMuZGVmYXVsdFN0YXJ0RGF0ZSwgZW5kRGF0ZTogdGhpcy5kZWZhdWx0RW5kRGF0ZSB9XG4gICAgY29uc3QgY29tcG9uZW50Q2xhc3MgPSB0aGlzLmNvbXBvbmVudENsYXNzTWFwWydBZHZhbmNlV2lkZ2V0SGVhZGVyRmlsdGVyQ29tcG9uZW50J107XG4gICAgdGhpcy5Db21wUmVmcyA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50Q2xhc3MpO1xuICAgIGNvbnN0IGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZSA9IHRoaXMuQ29tcFJlZnMuaW5zdGFuY2U7XG4gICAgZHluYW1pY0NvbXBvbmVudEluc3RhbmNlLnNlbGVjdGVkRGF0ZXMgPSBzZWxlY3RlZERhdGVzO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5maWx0ZXJJdGVtcyA9IGZpbHRlckl0ZW1zO1xuICAgIGR5bmFtaWNDb21wb25lbnRJbnN0YW5jZS5nZXRXaWRnZXRGaWx0ZXJDb25maWcuc3Vic2NyaWJlKCh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLmdldFdpZGdldEZpbHRlckZvclRlbXBsYXRlKHZhbHVlKTtcbiAgICB9KTtcblxuICAgIGluZGV4T2JqLmNvbXBDb25maWcuZHluYW1pY0NvbXBvbmVudFJlZnMucHVzaCh0aGlzLkNvbXBSZWZzKTtcbiAgICBjb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuQ29tcFJlZnMubG9jYXRpb24ubmF0aXZlRWxlbWVudCk7XG4gIH1cblxuICBnZXREZWxldGVWaWV3RnJvbUNvbmZpZyhpbmRleCkge1xuICAgIGNvbnNvbGUubG9nKGluZGV4KTtcbiAgICB0aGlzLmFsbFdpZGdldElubmVyQ29udGVudC5zcGxpY2UoaW5kZXgsIDEpXG4gIH1cblxuICBtb3ZlSXRlbUZvclBhZ2VWaWV3KGluZGV4OiBudW1iZXIsIGRpcmVjdGlvbjogJ3VwJyB8ICdkb3duJyk6IHZvaWQge1xuICAgIC8vIFByZXZlbnQgbW92aW5nIGJleW9uZCBhcnJheSBib3VuZHNcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbdGhpcy5uZXdXaWRnZXRJbmRleF0ud2lkZ2V0Tm9kZS5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBuZXdQb3NpdGlvbiA9IGRpcmVjdGlvbiA9PT0gJ3VwJyA/IGluZGV4IC0gMSA6IGluZGV4ICsgMTtcbiAgICAvLyBQcmV2ZW50IG1vdmluZyBiZXlvbmQgYXJyYXkgYm91bmRzXG4gICAgaWYgKG5ld1Bvc2l0aW9uIDwgMCB8fCBuZXdQb3NpdGlvbiA+PSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUubGVuZ3RoKSByZXR1cm47XG5cbiAgICAvLyBNb3ZlIGl0ZW1cbiAgICBjb25zdCBpdGVtVG9Nb3ZlID0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t0aGlzLm5ld1dpZGdldEluZGV4XS53aWRnZXROb2RlW2luZGV4XTtcbiAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUuc3BsaWNlKGluZGV4LCAxKTsgLy8gUmVtb3ZlIGl0ZW0gZnJvbSBjdXJyZW50IHBvc2l0aW9uXG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t0aGlzLm5ld1dpZGdldEluZGV4XS53aWRnZXROb2RlLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaXRlbVRvTW92ZSk7IC8vIEluc2VydCBpdGVtIGluIG5ldyBwb3NpdGlvblxuICB9XG4gIG1vdmVJdGVtRm9yQ29sdW1ucyhpbmRleDogbnVtYmVyLCBkaXJlY3Rpb246ICd1cCcgfCAnZG93bicpOiB2b2lkIHtcbiAgICAvLyBQcmV2ZW50IG1vdmluZyBiZXlvbmQgYXJyYXkgYm91bmRzXG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmFsbFdpZGdldElubmVyQ29udGVudC5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBuZXdQb3NpdGlvbiA9IGRpcmVjdGlvbiA9PT0gJ3VwJyA/IGluZGV4IC0gMSA6IGluZGV4ICsgMTtcbiAgICAvLyBQcmV2ZW50IG1vdmluZyBiZXlvbmQgYXJyYXkgYm91bmRzXG4gICAgaWYgKG5ld1Bvc2l0aW9uIDwgMCB8fCBuZXdQb3NpdGlvbiA+PSB0aGlzLmFsbFdpZGdldElubmVyQ29udGVudC5sZW5ndGgpIHJldHVybjtcblxuICAgIC8vIE1vdmUgaXRlbVxuICAgIGNvbnN0IGl0ZW1Ub01vdmUgPSB0aGlzLmFsbFdpZGdldElubmVyQ29udGVudFtpbmRleF07XG4gICAgdGhpcy5hbGxXaWRnZXRJbm5lckNvbnRlbnQuc3BsaWNlKGluZGV4LCAxKTsgLy8gUmVtb3ZlIGl0ZW0gZnJvbSBjdXJyZW50IHBvc2l0aW9uXG4gICAgdGhpcy5hbGxXaWRnZXRJbm5lckNvbnRlbnQuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBpdGVtVG9Nb3ZlKTsgLy8gSW5zZXJ0IGl0ZW0gaW4gbmV3IHBvc2l0aW9uXG4gIH1cblxuICBtb3ZlSXRlbUZvcldpZGdldChpbmRleDogbnVtYmVyLCBkaXJlY3Rpb246ICd1cCcgfCAnZG93bicpOiB2b2lkIHtcbiAgICAvLyBQcmV2ZW50IG1vdmluZyBiZXlvbmQgYXJyYXkgYm91bmRzXG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlyZWN0aW9uID09PSAndXAnID8gaW5kZXggLSAxIDogaW5kZXggKyAxO1xuICAgIC8vIFByZXZlbnQgbW92aW5nIGJleW9uZCBhcnJheSBib3VuZHNcbiAgICBpZiAobmV3UG9zaXRpb24gPCAwIHx8IG5ld1Bvc2l0aW9uID49IHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMubGVuZ3RoKSByZXR1cm47XG5cbiAgICAvLyBNb3ZlIGl0ZW1cbiAgICBjb25zdCBpdGVtVG9Nb3ZlID0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1tpbmRleF07XG4gICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5zcGxpY2UoaW5kZXgsIDEpOyAvLyBSZW1vdmUgaXRlbSBmcm9tIGN1cnJlbnQgcG9zaXRpb25cbiAgICB0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaXRlbVRvTW92ZSk7IC8vIEluc2VydCBpdGVtIGluIG5ldyBwb3NpdGlvblxuICB9XG5cbiAgZ2V0RWRpdFZpZXdGcm9tTGF5b3V0KGRhdGEsIGluZGV4KSB7XG5cbiAgICB0aGlzLmlzRWRpdE1haW5MYXlvdXQgPSB0cnVlO1xuICAgIHRoaXMubmV3V2lkZ2V0SW5kZXggPSBpbmRleDtcbiAgICB0aGlzLmlzV2lkZ2V0Q3JlYXRpb25Db250ZW50ID0gdHJ1ZTtcbiAgICB0aGlzLmlzRGVmYXVsdFZpZXcgPSBmYWxzZTtcbiAgICB0aGlzLmlzQ2hhcnRCdXR0b25DbGljayA9IGZhbHNlO1xuICAgIHRoaXMuaXNVcGRhdGVXaWRnZXQgPSBmYWxzZTtcbiAgICB0aGlzLndpZGdldE5hbWUgPSBkYXRhLndpZGdldE5hbWU7XG4gICAgdGhpcy53aWRnZXRUaXRsZSA9IGRhdGEud2lkZ2V0VGl0bGU7XG4gICAgdGhpcy5zZWxlY3RlZEZpbHRlcklkID0gZGF0YS5maWx0ZXJzLmZpbHRlcklkO1xuICAgIHRoaXMuYWRkZWR3aWRHZXRDb25maWcgPSBkYXRhLndpZGdldFByb3BlcnRpZXM7XG4gIH1cblxuXG4gIGJhY2tUb01haW5WaWV3KCkge1xuICAgIHRoaXMuaXNEZWZhdWx0VmlldyA9IHRydWU7XG4gICAgdGhpcy5pc1VwZGF0ZVdpZGdldCA9IGZhbHNlO1xuICAgIHRoaXMuaXNXaWRnZXRDcmVhdGlvbkNvbnRlbnQgPSBmYWxzZTtcbiAgICB0aGlzLmlzQ2hhcnRCdXR0b25DbGljayA9IGZhbHNlO1xuICAgIHRoaXMuaXNFZGl0TWFpbkxheW91dCA9IGZhbHNlO1xuICAgIHRoaXMuaXNsYXlvdXRDcmVhdGUgPSBmYWxzZTtcbiAgICB0aGlzLm5ld1dpZGdldEluZGV4ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc2VsZWN0ZWRGaWx0ZXJJZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZpbHRlclZpZXdzKCkge1xuICAgIGlmICh0aGlzLnZpZXdUb1NlYXJjaC50cmltKCkgIT09ICcnKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkQ29tcG9uZW50Q29uZmlnID0gdGhpcy5jb21wb25lbnRDb25maWdEYXRhU291cmNlLmZpbHRlcigoaXRlbTogYW55KSA9PlxuICAgICAgICBpdGVtLnZpZXdOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy52aWV3VG9TZWFyY2gudG9Mb3dlckNhc2UoKSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRDb21wb25lbnRDb25maWcgPSB0aGlzLmNvbXBvbmVudENvbmZpZ0RhdGFTb3VyY2U7XG4gICAgfVxuICB9XG5cbiAgZWRpdENvbXBvbmVudFZpZXdzKGl0ZW0pIHtcbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgdGhpcy5lZGl0SXRlbUZvclVwZGF0ZSA9IGl0ZW07XG4gICAgaWYgKHRoaXMuaXNVcGRhdGVXaWRnZXQgJiYgIXRoaXMuaXNDaGFydEJ1dHRvbkNsaWNrKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVmlld0lkID0gaXRlbS52aWV3SWQ7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pc0NyZWF0ZU5ld1ZpZXdXaXRoRGVmYXVsdFZpZXcgPSB0cnVlO1xuICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgfSwgNDAwKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbmF2aWdhdGlvbjogTmF2aWdhdGlvbkV4dHJhcyA9IHtcbiAgICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgICAndmlld0lkJzogaXRlbS52aWV3SWQsXG4gICAgICAgICAgJ3BhZ2VJZCc6IHRoaXMucGFnZUlkXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2FwcHMvY29udHJvbFBhbmVsL2FwcGxpY2F0aW9uQ29udGVudC9hcHBsaWNhdGlvblZpZXdzJ10sIG5hdmlnYXRpb24pO1xuICAgIH1cbiAgfVxuICBlZGl0Q29tcG9uZW50RGF0YXNldHMoaXRlbSkge1xuICAgIHRoaXMubG9hZGluZ01vZGFsID0gdHJ1ZTtcbiAgICB0aGlzLmVkaXRJdGVtRm9yVXBkYXRlID0gaXRlbTtcbiAgICBpZiAodGhpcy5pc1VwZGF0ZVdpZGdldCAmJiAhdGhpcy5pc0NoYXJ0QnV0dG9uQ2xpY2spIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRhc2V0SWQgPSBpdGVtLmRhdGFzZXRJZDtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmlzQ3JlYXRlRGF0YXNldFdpdGhEYXRhc2V0SWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgfSwgNDAwKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgbmF2aWdhdGlvbjogTmF2aWdhdGlvbkV4dHJhcyA9IHtcbiAgICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgICAndmlld0lkJzogaXRlbS52aWV3SWQsXG4gICAgICAgICAgJ3BhZ2VJZCc6IHRoaXMucGFnZUlkXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2FwcHMvY29udHJvbFBhbmVsL2FwcGxpY2F0aW9uQ29udGVudC9hcHBsaWNhdGlvblZpZXdzJ10sIG5hdmlnYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIGdldEFsbFBhZ2UoKSB7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydhcHBzL2NvbnRyb2xQYW5lbC9hcHBsaWNhdGlvbkNvbnRlbnQvYXBwbGljYXRpb25EYXNoYm9hcmQnXSk7XG4gIH1cblxuICB0cmFuc2Zvcm1Db2x1bW5zRm9yQ29sdW1ucyhpbnB1dENvbHVtbnMpIHtcbiAgICBjb25zdCBjb2x1bW5zID0gW107XG5cbiAgICBpbnB1dENvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xuICAgICAgY29sdW1ucy5wdXNoKHtcbiAgICAgICAgZGF0YUZpZWxkOiBjb2wuZGF0YUZpZWxkLFxuICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICBjYXB0aW9uOiBjb2wuY2FwdGlvbixcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbHVtbnM7XG4gIH1cblxuXG4gIGdldENyZWF0ZURhdGFTZXRQYWdlKCkge1xuICAgIHRoaXMuaXNDcmVhdGVEYXRhc2V0ID0gdHJ1ZTtcbiAgfVxuXG4gIGdldENyZWF0ZVZpZXdQYWdlKCkge1xuXG4gICAgdGhpcy5zZWxlY3RlZFZpZXdJZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmlzQ3JlYXRlTmV3VmlldyA9IHRydWU7XG4gICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgIH0sIDQwMCk7XG4gIH1cblxuXG4gIGdldEVtaXROZXdDaGFydENvbmdpZyhldmVudCkge1xuICAgIGRlbGV0ZSBldmVudC5rcGlDb25maWcuZGF0YVNvdXJjZTtcbiAgICB0aGlzLmVkaXRJdGVtRm9yVXBkYXRlWydrcGlDb25maWcnXSA9IGV2ZW50LmtwaUNvbmZpZztcblxuICAgIGNvbnNvbGUubG9nKHRoaXMuZWRpdEl0ZW1Gb3JVcGRhdGUpO1xuICAgIHRoaXMuc2VydmljZS51cGRhdGVBcHBWaWV3Q29uZmlnKHRoaXMuZWRpdEl0ZW1Gb3JVcGRhdGUpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuaXNFZGl0T3B0aW9uQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2FzdHIuc3VjY2VzcygnVmlldyBVcGRhdGUgU3VjY2Vzc2Z1bGx5JylcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdWaWV3IENyZWF0aW9uJylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cblxuICBnZXRWaWV3UGFnZSgpIHtcbiAgICBsZXQgbmF2aWdhdGlvbkV4dHJhczogTmF2aWdhdGlvbkV4dHJhcyA9IHtcbiAgICAgIHF1ZXJ5UGFyYW1zOiB7XG4gICAgICAgIFwicGFnZUlkXCI6IHRoaXMucGFnZUlkXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt0aGlzLnBhZ2VVcmxdLCBuYXZpZ2F0aW9uRXh0cmFzKVxuXG4gIH1cbiAgLy8gbm9kZXByb3BlcnRpY2UgZmlsdGVyIFxuXG4gIGdldE5vZGVQcm9wZXJ0aWNlRmlsdGVyT3B0aW9uKCkge1xuICAgIGxldCBvYmogPSB7XG4gICAgICBpbnB1dF90eXBlOiBcInRleHRcIixcbiAgICAgIHNlcnZlcl9jb2x1bW46IFwiXCIsXG4gICAgICBsb2NhbF9jb2x1bW46IFwiXCIsXG4gICAgICBzZWxlY3RfYm94X29wdGlvbjogXCJcIixcbiAgICB9XG4gICAgdGhpcy5ub2RlUHJvcGVydGljZUZpbHRlcnMucHVzaChvYmopXG4gIH1cblxuICBkZWxldGVOb2RlRmlsdGVyKGluZGV4KSB7XG4gICAgdGhpcy5ub2RlUHJvcGVydGljZUZpbHRlcnMuc3BsaWNlKGluZGV4LCAxKVxuICB9XG5cbiAgc2V0RGF0YVNldHNMaW1pdChkYXRhc2V0KSB7XG4gICAgbGV0IGxpbWl0ID0geyBcImxpbWl0XCI6IFwiMTBcIiB9XG4gICAgZGF0YXNldC5jb25maWcucXVlcnlDb25maWcucmVxRmllbGRzLnB1c2gobGltaXQpO1xuICAgIHJldHVybiBkYXRhc2V0O1xuICB9XG5cbiAgZ2V0Vmlld1BvcHVwSGlkZShlKSB7XG4gICAgdGhpcy5nZXRBbGxWaWV3c0l0ZW1zKCk7XG4gIH1cblxuICBnZXREYXRhc2V0UG9wdXBIaWRlKGUpIHtcblxuICB9XG5cbiAgc3VibWl0RmlsdGVyKCkge1xuXG4gIH1cblxuICBnZXRXaWRnZXRGaWx0ZXJGb3JUZW1wbGF0ZSh2YWx1ZSkge1xuICAgIHRoaXMuZ2V0RGF0YVNldCgpO1xuICB9XG5cbiAgZ2V0RGVsZXRlVmlld0Zyb21MYXlvdXQoaXRlbSwgaSkge1xuICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMuc3BsaWNlKGksIDEpO1xuICAgIHRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMuZm9yRWFjaCh3aWRnZXQgPT4ge1xuICAgICAgd2lkZ2V0LmNvbXBDb25maWcudmlld0NvbmZpZyA9IHdpZGdldC5jb21wQ29uZmlnLnZpZXdDb25maWcubWFwKGNvbmZpZyA9PiBjb25maWcudmlld0lkKTtcbiAgICAgIHdpZGdldC5jb21wQ29uZmlnLmR5bmFtaWNDb21wb25lbnRSZWZzID0gW107XG4gICAgICBpZiAod2lkZ2V0LndpZGdldE5vZGUgJiYgd2lkZ2V0LndpZGdldE5vZGUubGVuZ3RoID4gMCkge1xuICAgICAgICB3aWRnZXQud2lkZ2V0Tm9kZS5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICAgIG5vZGUuY29tcENvbmZpZy52aWV3Q29uZmlnID0gbm9kZS5jb21wQ29uZmlnLnZpZXdDb25maWcubWFwKGNvbmZpZyA9PiBjb25maWcudmlld0lkKTtcbiAgICAgICAgICBub2RlLmNvbXBDb25maWcuZHluYW1pY0NvbXBvbmVudFJlZnMgPSBbXTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSlcbiAgICBjb25zdCB3aWRnZXREYXRhID0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWc7XG4gICAgd2lkZ2V0RGF0YVsnd2lkZ2V0cyddID0gdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0cy5tYXAoaXRlbSA9PiBpdGVtLndpZGdldElkKTtcbiAgICB3aWRnZXREYXRhWydmaWx0ZXJJZCddID0gKHdpZGdldERhdGEuZmlsdGVycykgPyB3aWRnZXREYXRhLmZpbHRlcnMuZmlsdGVySWQgOiBudWxsO1xuICAgIGRlbGV0ZSB3aWRnZXREYXRhWydmaWx0ZXJzJ107XG5cbiAgICB0aGlzLnNlcnZpY2UuZWRpdEFwcFBhZ2VDb25maWcod2lkZ2V0RGF0YSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdHIuc3VjY2VzcyhcIkxheW91dCBEZWxldGVkIFN1Y2Nlc3NmdWxseVwiKVxuICAgICAgICB0aGlzLmdldEFwcFBhZ2VEZXRhaWxDb25maWdCeVBhZ2VJZCgpXG4gICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnV2lkZ2V0IENyZWF0aW9uJylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cblxuICAvLyBhZHZhbmNlIExheW91dCBcbiAgaXNBZHZhbmNlTGF5b3V0OiBib29sZWFuO1xuICBpc1Byb2NlZWQ6IGJvb2xlYW47XG4gIHNlbGVjdGVkVmlld3NJZHM6IGFueSA9IFtdO1xuICBhZHZhbmNlTGF5b3V0Q29udGFpbmVyOiBhbnkgPSBbXTtcbiAgZ2V0UHJvY2Vzc0ZvckNvbmZpZygpIHtcbiAgICB0aGlzLmFkdmFuY2VMYXlvdXRDb250YWluZXIgPSBbXTtcbiAgICBjb25zdCBmaWx0ZXJlZENvbHVtbnMgPSB0aGlzLmNvbXBvbmVudENvbmZpZ0RhdGFTb3VyY2UuZmlsdGVyKGNvbHVtbiA9PiB0aGlzLnNlbGVjdGVkVmlld3NJZHMuaW5jbHVkZXMoY29sdW1uLnZpZXdJZCkpO1xuICAgIGNvbnN0IGNvbHVtbkRlZkxpc3QgPSBbXTtcblxuICAgIGZpbHRlcmVkQ29sdW1ucy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgLy8gY29uc3QgZXhpc3RpbmdDb2x1bW4gPSBmYWxzZTtcbiAgICAgIGxldCBvYmogPSB7XG4gICAgICAgIFwiaWRcIjogdGhpcy5jb21tb25TZXJ2aWNlLnByaW1lcnlSZW5kb21lSWQoNSksXG4gICAgICAgIFwibm9kZVRpdGxlXCI6IFwiXCIsXG4gICAgICAgIFwiY29tcENvbmZpZ1wiOiB7XG4gICAgICAgICAgXCJkeW5hbWljQ29tcG9uZW50UmVmc1wiOiBbXSxcbiAgICAgICAgICBcInZpZXdDb25maWdcIjogW2VsZW1lbnRdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZmlsdGVySWRcIjogbnVsbCxcbiAgICAgICAgXCJub2RlUHJvcGVydGllc1wiOiB7XG4gICAgICAgICAgXCJkaXNwbGF5XCI6IHRydWUsXG4gICAgICAgICAgXCJ3aWRnZXRUaXRsZVwiOiBcIlwiLFxuICAgICAgICAgIFwid2lkdGhcIjogXCJcIixcbiAgICAgICAgICBcImhlaWdodFwiOiBcIlwiLFxuICAgICAgICAgIFwiaXNXaWRnZXRGaWx0ZXJcIjogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5hZHZhbmNlTGF5b3V0Q29udGFpbmVyLnB1c2gob2JqKTtcblxuICAgIH0pO1xuXG4gICAgdGhpcy5pc1Byb2NlZWQgPSB0cnVlO1xuICB9XG5cbiAgZ2V0U2VsZWN0ZWRDb2x1bW5Tb3VyY2UoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuZXZlbnQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRWaWV3c0lkcyA9IGV2ZW50LnZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHN1Ym1pdEFkdmFuY2VWaWV3KCkge1xuICAgIGlmICh0aGlzLmRhc2hCb2FyZFdpZGdldENvbmZpZy53aWRnZXRzW3RoaXMubmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGUgJiYgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t0aGlzLm5ld1dpZGdldEluZGV4XS53aWRnZXROb2RlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t0aGlzLm5ld1dpZGdldEluZGV4XS53aWRnZXROb2RlID0gWy4uLnRoaXMuZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbdGhpcy5uZXdXaWRnZXRJbmRleF0ud2lkZ2V0Tm9kZSwgLi4udGhpcy5hZHZhbmNlTGF5b3V0Q29udGFpbmVyXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1t0aGlzLm5ld1dpZGdldEluZGV4XS53aWRnZXROb2RlID0gdGhpcy5hZHZhbmNlTGF5b3V0Q29udGFpbmVyO1xuICAgIH1cbiAgICB0aGlzLmlzQWR2YW5jZUxheW91dCA9IGZhbHNlO1xuICAgIHRoaXMuYWR2YW5jZUxheW91dENvbnRhaW5lciA9IFtdO1xuICAgIHRoaXMuaXNQcm9jZWVkID0gZmFsc2U7XG4gICAgdGhpcy51cGRhdGVXaWRnZXQoKTtcbiAgfVxuXG5cblxuICBkZWxldGVWaWV3KGkpIHtcblxuICB9XG59XG4iLCI8YXBwLWxvYWRpbmcgKm5nSWY9XCJsb2FkaW5nTW9kYWxcIj48L2FwcC1sb2FkaW5nPlxuXG48ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBoLVs5MHZoXSB3LWZ1bGxcIj5cbiAgICA8ZGl2IGNsYXNzPVwidy0zLzQgYm9yZGVyLXIgaC1mdWxsIGZsZXggZmxleC1jb2wgcHgtMlwiPlxuICAgICAgICA8IS0tIFNjcm9sbGFibGUgY29udGVudCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZ3JvdyBvdmVyZmxvdy15LWF1dG9cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBteS0zXCIgI2R5bmFtaWNDb250YWluZXI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gRml4ZWQgYm90dG9tIHNlY3Rpb24gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciBoLTE2IG0tMiBib3JkZXIgc2hyaW5rLTBcIj5cbiAgICAgICAgICAgIDxsaWItY29tbW9uLWhlYWRlciBbcGFnZVRpdGxlXT1cIicnXCI+PC9saWItY29tbW9uLWhlYWRlcj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfbWR9fSBtLTJcIiAoY2xpY2spPVwiYWRkV2lkZ2V0KClcIj5BZGQgTGF5b3V0PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bk90aGVyc1B1cnBsZX19IG0tMiBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJnZXRWaWV3UGFnZSgpXCI+VmlldyBQYWdlPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ3LTEvNCBwLTIgaC1mdWxsXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0Rhc2hCb2FyZENvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuRGFya0JsYWNrfX0gbS0yIHctZml0IHRleHQtY2VudGVyIGN1cnNhci1wb2ludGVyXCIgKGNsaWNrKT1cImJhY2tUb01haW5WaWV3KClcIj5cbiAgICAgICAgICAgICAgICBCYWNrXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgcGFnZV9jb25maWcuYXBpX2NvbmZpZzsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yIGZsZXggZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBib3JkZXItYlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBweS0yIGZvbnQtYm9sZCAgdGV4dC13aGl0ZSBweC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0ud2lkR2V0Q29uZmlnLndpZGdldFRpdGxlfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHNwYWNlLXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8YnV0dG9uIChjbGljayk9XCJlZGl0U2VsZWN0ZWRXaWRnZXQoaXRlbSwgaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy04IGgtOCBiZy1za3ktNjAwIGhvdmVyOmJnLWJsdWUtODAwIHRleHQtd2hpdGUgcm91bmRlZC1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1lZGl0XCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy04IGgtOCBiZy1yZWQtNjAwIGhvdmVyOmJnLXJlZC04MDAgdGV4dC13aGl0ZSByb3VuZGVkLWZ1bGwgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRyYXNoLW9cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzV2lkZ2V0Q3JlYXRpb25Db250ZW50XCI+XG4gICAgICAgICAgICA8aDYgY2xhc3M9XCJtYi0yIGZvbnQtYm9sZCB0ZXh0LWxnIHRyYWNraW5nLXRpZ2h0IHRleHQtZ3JheS05MDAgZGFyazp0ZXh0LXdoaXRlIGJvcmRlci1iIHBiLTNcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc2xheW91dENyZWF0ZVwiPldpZGdldCBTZXR0aW5nczwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImlzbGF5b3V0Q3JlYXRlXCI+TGF5b3V0IFNldHRpbmdzPC9zcGFuPlxuICAgICAgICAgICAgPC9oNj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IG15LTRcIj5cbiAgICAgICAgICAgICAgICA8ZHgtY2hlY2stYm94IGNsYXNzPVwibWwtYXV0b1wiIFsobmdNb2RlbCldPVwiYWRkZWR3aWRHZXRDb25maWcuZGlzcGxheVwiIHRleHQ9XCJEaXNwbGF5XCI+PC9keC1jaGVjay1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IG1iLTIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW1kIG15LWF1dG8gcHgtMlwiPldpZHRoPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IGNsYXNzPVwidy0xLzJcIiBbaXRlbXNdPVwid2lkZ2V0X3dpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhZGRlZHdpZEdldENvbmZpZy53aWR0aFwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbWItMiBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbWQgbXktYXV0byBweC0yXCI+SGVpZ2h0PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBjbGFzcz1cInctMS8yXCIgWyhuZ01vZGVsKV09XCJhZGRlZHdpZEdldENvbmZpZy5oZWlnaHRcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IG1iLTIganVzdGlmeS1iZXR3ZWVuXCIgKm5nSWY9XCIhaXNsYXlvdXRDcmVhdGVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBteS1hdXRvIHB4LTJcIj5XaWRnZXQgVGl0bGU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PjxkeC10ZXh0LWJveCBjbGFzcz1cInctMS8yXCIgWyhuZ01vZGVsKV09XCJ3aWRnZXRUaXRsZVwiPjwvZHgtdGV4dC1ib3g+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IG1iLTIganVzdGlmeS1iZXR3ZWVuXCIgKm5nSWY9XCIhaXNsYXlvdXRDcmVhdGVcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbWQgbXktYXV0byBweC0yXCI+V2lkZ2V0IE5hbWU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IGNsYXNzPVwidy0xLzJcIiBbKG5nTW9kZWwpXT1cIndpZGdldE5hbWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbWItNSBqdXN0aWZ5LWJldHdlZW5cIiAqbmdJZj1cImlzbGF5b3V0Q3JlYXRlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXNtIG15LWF1dG8gcHgtMlwiPkxheW91dCBUaXRsZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggY2xhc3M9XCJ3LTEvMlwiIFsobmdNb2RlbCldPVwiYWRkZWR3aWRHZXRDb25maWcud2lkZ2V0VGl0bGVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IG1iLTIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW1kIG15LWF1dG8gcHgtMlwiPkZpbHRlcjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBjbGFzcz1cInctMS8yXCIgW2l0ZW1zXT1cImZpbHRlckRhdGFTb3VyY2VcIiBkaXNwbGF5RXhwcj1cImZpbHRlck5hbWVcIiBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVFeHByPVwiZmlsdGVySWRcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRmlsdGVySWRcIlxuICAgICAgICAgICAgICAgICAgICAob25WYWx1ZUNoYW5nZWQpPVwiZ2V0RmlsdGVyVmFsdWVCeUlkKCRldmVudClcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNVcGRhdGVXaWRnZXRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNlwiICpuZ0lmPVwiIWlzbGF5b3V0Q3JlYXRlICYmIGlzRWRpdE1haW5MYXlvdXRcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHNbbmV3V2lkZ2V0SW5kZXhdLndpZGdldE5vZGU7bGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTIgZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIGJvcmRlci1iIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIHB5LTIgZm9udC1ib2xkICB0ZXh0LXdoaXRlIHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLm5vZGVQcm9wZXJ0aWVzLndpZGdldFRpdGxlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBzcGFjZS14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImkgIT09IDBcIiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fbGlnaHRfc219fSBjdXJzb3ItcG9pbnRlciBteC0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlSXRlbUZvclBhZ2VWaWV3KGksICd1cCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFycm93LXVwXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImkgIT09ICBkYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0c1tuZXdXaWRnZXRJbmRleF0ud2lkZ2V0Tm9kZS5sZW5ndGggLSAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9saWdodF9zbX19IGN1cnNvci1wb2ludGVyIG14LTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVJdGVtRm9yUGFnZVZpZXcoaSwgJ2Rvd24nKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hcnJvdy1kb3duXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTggaC04IGJnLXJlZC02MDAgaG92ZXI6YmctcmVkLTgwMCB0ZXh0LXdoaXRlIHJvdW5kZWQtZnVsbCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNVcGRhdGVXaWRnZXRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBweS0xIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPiBBcHBsaWNhdGlvbiBWaWV3c1xuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3JkZXIteCBib3JkZXItYiBwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBhbGxXaWRnZXRJbm5lckNvbnRlbnQ7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cCAgdy1mdWxsIGZsZXgganVzdGlmeS1iZXR3ZWVuIGJvcmRlci1iIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIGZvbnQtYm9sZCAgcHktMiBjdXJzb3ItcG9pbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0udmlld05hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggc3BhY2UteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpICE9PSAwXCIgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2xpZ2h0X3NtfX0gY3Vyc29yLXBvaW50ZXIgbXgtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUl0ZW1Gb3JDb2x1bW5zKGksICd1cCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFycm93LXVwXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaSAhPT0gYWxsV2lkZ2V0SW5uZXJDb250ZW50Lmxlbmd0aCAtIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2xpZ2h0X3NtfX0gY3Vyc29yLXBvaW50ZXIgbXgtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUl0ZW1Gb3JDb2x1bW5zKGksICdkb3duJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctZG93blwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyb3VuZGVkLWZ1bGwgcC0yIHRleHQtd2hpdGUgYmctYmx1ZS01MDAgaG92ZXI6YmctYmx1ZS03MDAgbWItMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdENvbXBvbmVudFZpZXdzKGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWV5ZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyb3VuZGVkLWZ1bGwgcC0yIHRleHQtd2hpdGUgYmctYmx1ZS01MDAgaG92ZXI6YmctYmx1ZS03MDAgbWItMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdENvbXBvbmVudERhdGFzZXRzKGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWRhdGFiYXNlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInJvdW5kZWQtZnVsbCBwLTIgdGV4dC13aGl0ZSBiZy1yZWQtNTAwIGhvdmVyOmJnLXJlZC03MDAgbWItMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ2V0RGVsZXRlVmlld0Zyb21Db25maWcoaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdHJhc2gtb1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzVXBkYXRlV2lkZ2V0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gcHktMSBmb250LWV4dHJhYm9sZCBib3JkZXItYiBiZy1ncmF5LTcwMCB0ZXh0LXdoaXRlIHB4LTJcIj4gQWRkIEZpbHRlciBGb3IgVmlld1xuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvcmRlci14IGJvcmRlci1iIHAtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBweS0zIGJvcmRlci1iXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZHgtY2hlY2stYm94IFsobmdNb2RlbCldPVwiYWRkZWR3aWRHZXRDb25maWcuaXNXaWRnZXRGaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9XCJQb3B1cCBDb2x1bW5zIEZpbHRlciBFbmFibGVcIj48L2R4LWNoZWNrLWJveD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IG15LTIgYm9yZGVyLWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygbm9kZVByb3BlcnRpY2VGaWx0ZXJzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGJvcmRlci1iXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZFwiPklucHV0IFR5cGU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJbJ3RleHQnXVwiIFsobmdNb2RlbCldPVwiaXRlbS5pbnB1dF90eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cInRleHRcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMS0xIHctMi8zXCIgKm5nSWY9XCJpdGVtLmlucHV0X3R5cGUgPT0gJ3RleHQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZFwiPlNlcnZlciBDb2x1bW48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0uc2VydmVyX2NvbHVtblwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMS0xIHctMS8yXCIgKm5nSWY9XCJpdGVtLmlucHV0X3R5cGUgPT0gJ3RleHQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZFwiPkxvY2FsIENvbHVtbjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5sb2NhbF9jb2x1bW5cIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEtMSB3LTEvM1wiICpuZ0lmPVwiaXRlbS5pbnB1dF90eXBlID09ICdzZWxlY3QnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZFwiPkNvbHVtbnMgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5zZWxlY3RfYm94X29wdGlvblwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMS0xIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2Rhbmdlcl9zbX19IHctMjQgbXQtNiB0ZXh0LWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVOb2RlRmlsdGVyKGkpXCI+RGVsZXRlIEZpbHRlcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X3NtfX0gdy1hdXRvIHRleHQtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnZXROb2RlUHJvcGVydGljZUZpbHRlck9wdGlvbigpXCI+QWRkXG4gICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXI8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWVuZCBpdGVtcy1jZW50ZXIgaC0xNiBtLTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bkRhcmtCbGFja319IG0tMiB3LWZpdCB0ZXh0LWNlbnRlciBjdXJzYXItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJiYWNrVG9NYWluVmlldygpXCI+QmFja1xuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNVcGRhdGVXaWRnZXRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzbGF5b3V0Q3JlYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9zdWNjZXNzX21kfX0gbS0yIHctZml0IHRleHQtY2VudGVyIGN1cnNhci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRMYXlvdXRUT3ZpZXcoKVwiPkFkZCBWaWV3XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzbGF5b3V0Q3JlYXRlICYmICFpc0VkaXRNYWluTGF5b3V0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X21kfX0gbS0yIHctZml0IHRleHQtY2VudGVyIGN1cnNhci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRXaWRnZXRUT3ZpZXcoKVwiPkFkZCBMYXlvdXRcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNsYXlvdXRDcmVhdGUgJiYgaXNFZGl0TWFpbkxheW91dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9tZH19IG0tMiB3LWZpdCB0ZXh0LWNlbnRlciBjdXJzYXItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlTGF5b3V0V2lkZ2V0VE92aWV3KClcIj5VcGRhdGUgTGF5b3V0XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl93YXJuaW5nX21kfX0gbS0yIHctZml0IHRleHQtY2VudGVyIGN1cnNhci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZVRvVmlldygpXCIgKm5nSWY9XCJpc1VwZGF0ZVdpZGdldFwiPlVwZGF0ZSBWaWV3XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgIDwhLS0gPHByZT48Y29kZT57e2Rhc2hCb2FyZFdpZGdldENvbmZpZyB8IGpzb259fTwvY29kZT48L3ByZT4gLS0+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDaGFydEJ1dHRvbkNsaWNrXCI+XG4gICAgICAgICAgICA8aDZcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1iLTIgZm9udC1ib2xkIHRleHQtbWQgdHJhY2tpbmctdGlnaHQgdGV4dC1ncmF5LTkwMCBkYXJrOnRleHQtd2hpdGUgYm9yZGVyLWIgcGItMyBmbGV4ICBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWJhci1jaGFydC1vIG1yLTJcIj48L2k+IFNlbGVjdCBWaWV3XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5EYXJrQmxhY2t9fSBtLTIgdy1maXQgdGV4dC1jZW50ZXIgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYmFja1RvTWFpblZpZXcoKVwiPkJhY2tcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvaDY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIGgtWzgwdmhdIG92ZXJmbG93LXgtYXV0b1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBteS0yIFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInZpZXdUb1NlYXJjaFwiIChrZXl1cCk9XCJmaWx0ZXJWaWV3cygpXCIgKGtleWRvd24pPVwiZmlsdGVyVmlld3MoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJnLWdyYXktODAwIGJvcmRlciBib3JkZXItZ3JheS03MDAgdGV4dC1ncmF5LTIwMCB0ZXh0LXNtIGZvY3VzOnJpbmctZ3JheS00MDAgZm9jdXM6Ym9yZGVyLWdyYXktNTAwIGJsb2NrIHctZnVsbCBwLTQgaC04IHJvdW5kZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggVmlld1wiIC8+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYWJzb2x1dGUgaW5zZXQteS0wIHJpZ2h0LTAgZmxleCBpdGVtcy1jZW50ZXIgcHItNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwicm90YXRlLTkwIGN1cnNvci1wb2ludGVyXCIgW3N2Z0ljb25dPVwiJ2hlcm9pY29uc19vdXRsaW5lOnNlYXJjaCdcIj48L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbHRlcmVkQ29tcG9uZW50Q29uZmlnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBncm91cCBteS0zIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBJdGVtIFZpZXcgTmFtZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIGZvbnQtYm9sZCBib3JkZXItYiBweS0yIGN1cnNhci1wb2ludGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLnZpZXdOYW1lfX08L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBIb3ZlciBCdXR0b25zIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgdG9wLTAgIHJpZ2h0LTAgZmxleCBzcGFjZS14LTIgb3BhY2l0eS0wIGdyb3VwLWhvdmVyOm9wYWNpdHktMTAwIHRyYW5zaXRpb24tb3BhY2l0eSBkdXJhdGlvbi0zMDAgcGItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyb3VuZGVkLWZ1bGwgcC0yIHRleHQtd2hpdGUgYmctYmx1ZS01MDAgaG92ZXI6YmctYmx1ZS03MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wZW5jaWwtc3F1YXJlLW9cIiBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRDb21wb25lbnRWaWV3cyhpdGVtKVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwicm91bmRlZC1mdWxsIHAtMiB0ZXh0LXdoaXRlIGJnLWdyZWVuLTUwMCBob3ZlcjpiZy1ncmVlbi03MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ2V0Q29tcG9uZW50Q29uZmlnKGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGx1c1wiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNEZWZhdWx0Vmlld1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkYXNoQm9hcmRXaWRnZXRDb25maWcud2lkZ2V0czsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncm91cCBteS0zIHctZnVsbCBmbGV4IGp1c3RpZnktYmV0d2VlbiBib3JkZXItYiBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgZm9udC1ib2xkICBweS0yIGN1cnNvci1wb2ludGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0ud2lkZ2V0VGl0bGV9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBzcGFjZS14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpICE9PSAwXCIgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2xpZ2h0X3NtfX0gY3Vyc29yLXBvaW50ZXIgbXgtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVJdGVtRm9yV2lkZ2V0KGksICd1cCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hcnJvdy11cFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaSAhPT0gZGFzaEJvYXJkV2lkZ2V0Q29uZmlnLndpZGdldHMubGVuZ3RoIC0gMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2xpZ2h0X3NtfX0gY3Vyc29yLXBvaW50ZXIgbXgtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVJdGVtRm9yV2lkZ2V0KGksICdkb3duJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFycm93LWRvd25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyb3VuZGVkLWZ1bGwgcC0yIHRleHQtd2hpdGUgYmctYmx1ZS01MDAgaG92ZXI6YmctYmx1ZS03MDAgbWItMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdldEVkaXRWaWV3RnJvbUxheW91dChpdGVtLGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wZW5jaWwtc3F1YXJlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJyb3VuZGVkLWZ1bGwgcC0yIHRleHQtd2hpdGUgYmctcmVkLTUwMCBob3ZlcjpiZy1yZWQtNzAwIG1iLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnZXREZWxldGVWaWV3RnJvbUxheW91dChpdGVtLGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgIDwvZGl2PlxuPC9kaXY+XG48IS0tIDwvZGl2PiAtLT5cblxuPGR4LXBvcHVwIFsodmlzaWJsZSldPVwiaXNFZGl0T3B0aW9uQ2xpY2tcIiBbY2xvc2VPbk91dHNpZGVDbGlja109XCJmYWxzZVwiIFtkcmFnRW5hYmxlZF09XCJmYWxzZVwiIFt3aWR0aF09XCIxMjAwXCJcbiAgICBbaGVpZ2h0XT1cIidhdXRvJ1wiIFtzaG93VGl0bGVdPVwidHJ1ZVwiIGNsYXNzPVwicG9wdXBcIiB0aXRsZT1cInt7ZWRpdFZpZXdkYXRhU291cmNlTW9kYWwudmlld05hbWV9fVwiPlxuICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgZGF0YSBvZiAnY29udGVudCdcIj5cblxuICAgICAgICA8YXBwLWRhc2gtY2hhcnQgW2RhdGFzZXRtb2RhbF09XCJlZGl0Vmlld2RhdGFTb3VyY2VNb2RhbFwiIChnZXRDaGFydENvbmZpZ091dFB1dCk9XCJnZXRFbWl0TmV3Q2hhcnRDb25naWcoJGV2ZW50KVwiXG4gICAgICAgICAgICAqbmdJZj1cImVkaXRWaWV3ZGF0YVNvdXJjZU1vZGFsLnZpZXdUeXBlID09ICdjaGFydCdcIj48L2FwcC1kYXNoLWNoYXJ0PlxuICAgICAgICA8YXBwLWRhc2gtdGFibGUgW2RhdGFzZXRtb2RhbF09XCJlZGl0Vmlld2RhdGFTb3VyY2VNb2RhbFwiIChnZXRUYWJsZUNvbmZpZ091dFB1dCk9XCJnZXRFbWl0TmV3Q2hhcnRDb25naWcoJGV2ZW50KVwiXG4gICAgICAgICAgICAqbmdJZj1cImVkaXRWaWV3ZGF0YVNvdXJjZU1vZGFsLnZpZXdUeXBlID09ICd0YWJsZSdcIj48L2FwcC1kYXNoLXRhYmxlPlxuICAgICAgICA8IS0tIDxhcHAtZGFzaC1vdGhlciBbZGF0YXNldG1vZGFsXT1cImVkaXRWaWV3ZGF0YVNvdXJjZU1vZGFsXCIgKm5nSWY9XCJlZGl0Vmlld2RhdGFTb3VyY2VNb2RhbC52aWV3VHlwZSA9PSAnb3RoZXJzJ1wiXG4gICAgICAgICAgICAoY3JlYXRlT3RoZXJDb21wb25lbnRWaWV3KT1cImdldEVtaXROZXdDaGFydENvbmdpZygkZXZlbnQpXCI+PC9hcHAtZGFzaC1vdGhlcj4gLS0+XG4gICAgPC9kaXY+XG48L2R4LXBvcHVwPlxuXG5cbjxkeC1wb3B1cCBbKHZpc2libGUpXT1cImlzQ3JlYXRlRGF0YXNldFwiIFtjbG9zZU9uT3V0c2lkZUNsaWNrXT1cImZhbHNlXCIgW2RyYWdFbmFibGVkXT1cImZhbHNlXCIgW3dpZHRoXT1cIjEyMDBcIlxuICAgIFtoZWlnaHRdPVwiNjAwXCIgW3Nob3dUaXRsZV09XCJ0cnVlXCIgY2xhc3M9XCJwb3B1cFwiIHRpdGxlPVwiRGF0YXNldCBFZGl0b3JcIj5cbiAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NvbnRlbnQnXCI+XG4gICAgICAgIDxkeC1zY3JvbGwtdmlldyBjbGFzcz1cImgtZnVsbFwiIFt3aWR0aF09XCInMTAwJSdcIiBbaGVpZ2h0XT1cIicxMDAlJ1wiPlxuICAgICAgICAgICAgPGFwcC1jcmVhdGUtZGF0YXNldCBbaXNIZWFkZXJdPVwiZmFsc2VcIj48L2FwcC1jcmVhdGUtZGF0YXNldD5cbiAgICAgICAgPC9keC1zY3JvbGwtdmlldz5cbiAgICA8L2Rpdj5cbjwvZHgtcG9wdXA+XG48ZHgtcG9wdXAgWyh2aXNpYmxlKV09XCJpc0NyZWF0ZURhdGFzZXRXaXRoRGF0YXNldElkXCIgW2Nsb3NlT25PdXRzaWRlQ2xpY2tdPVwiZmFsc2VcIiBbZHJhZ0VuYWJsZWRdPVwiZmFsc2VcIiBbd2lkdGhdPVwiMTIwMFwiXG4gICAgW2hlaWdodF09XCI2MDBcIiBbc2hvd1RpdGxlXT1cInRydWVcIiBjbGFzcz1cInBvcHVwXCIgdGl0bGU9XCJEYXRhc2V0IEVkaXRvclwiIChvbkhpZGRlbik9XCJnZXREYXRhc2V0UG9wdXBIaWRlKCRldmVudClcIj5cbiAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NvbnRlbnQnXCI+XG4gICAgICAgIDxkeC1zY3JvbGwtdmlldyBjbGFzcz1cImgtZnVsbFwiIFt3aWR0aF09XCInMTAwJSdcIiBbaGVpZ2h0XT1cIicxMDAlJ1wiPlxuICAgICAgICAgICAgPGFwcC1jcmVhdGUtZGF0YXNldCBbc2VsZWN0ZWREYXRhc2V0SWRdPVwic2VsZWN0ZWREYXRhc2V0SWRcIiBbaXNIZWFkZXJdPVwiZmFsc2VcIj48L2FwcC1jcmVhdGUtZGF0YXNldD5cbiAgICAgICAgPC9keC1zY3JvbGwtdmlldz5cbiAgICA8L2Rpdj5cbjwvZHgtcG9wdXA+XG5cbjxkeC1wb3B1cCBbKHZpc2libGUpXT1cImlzQ3JlYXRlTmV3Vmlld1dpdGhEZWZhdWx0Vmlld1wiIFtjbG9zZU9uT3V0c2lkZUNsaWNrXT1cImZhbHNlXCIgW2RyYWdFbmFibGVkXT1cImZhbHNlXCJcbiAgICBbd2lkdGhdPVwiMTIwMFwiIFtoZWlnaHRdPVwiNjAwXCIgW3Nob3dUaXRsZV09XCJ0cnVlXCIgY2xhc3M9XCJwb3B1cFwiIHRpdGxlPVwiVmlld3MgRWRpdG9yXCJcbiAgICAob25IaWRkZW4pPVwiZ2V0Vmlld1BvcHVwSGlkZSgkZXZlbnQpXCI+XG4gICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBkYXRhIG9mICdjb250ZW50J1wiPlxuICAgICAgICA8ZHgtc2Nyb2xsLXZpZXcgY2xhc3M9XCJoLWZ1bGxcIiBbd2lkdGhdPVwiJzEwMCUnXCIgW2hlaWdodF09XCInMTAwJSdcIj5cbiAgICAgICAgICAgIDxhcHAtY3JlYXRlLWNvbXAtdmlldyBbc2VsZWN0ZWRWaWV3SWRdPVwic2VsZWN0ZWRWaWV3SWRcIiBbaXNIZWFkZXJdPVwiZmFsc2VcIj48L2FwcC1jcmVhdGUtY29tcC12aWV3PlxuICAgICAgICA8L2R4LXNjcm9sbC12aWV3PlxuICAgIDwvZGl2PlxuPC9keC1wb3B1cD5cbjxkeC1wb3B1cCBbKHZpc2libGUpXT1cImlzQ3JlYXRlTmV3Vmlld1wiIFtjbG9zZU9uT3V0c2lkZUNsaWNrXT1cImZhbHNlXCIgW2RyYWdFbmFibGVkXT1cImZhbHNlXCIgW3dpZHRoXT1cIjEyMDBcIlxuICAgIFtoZWlnaHRdPVwiNjAwXCIgW3Nob3dUaXRsZV09XCJ0cnVlXCIgY2xhc3M9XCJwb3B1cFwiIHRpdGxlPVwiVmlld3MgRWRpdG9yXCI+XG4gICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBkYXRhIG9mICdjb250ZW50J1wiPlxuICAgICAgICA8ZHgtc2Nyb2xsLXZpZXcgY2xhc3M9XCJoLWZ1bGxcIiBbd2lkdGhdPVwiJzEwMCUnXCIgW2hlaWdodF09XCInMTAwJSdcIj5cbiAgICAgICAgICAgIDxhcHAtY3JlYXRlLWNvbXAtdmlldyBbaXNIZWFkZXJdPVwiZmFsc2VcIj48L2FwcC1jcmVhdGUtY29tcC12aWV3PlxuICAgICAgICA8L2R4LXNjcm9sbC12aWV3PlxuICAgIDwvZGl2PlxuPC9keC1wb3B1cD5cblxuXG48ZHgtcG9wdXAgWyh2aXNpYmxlKV09XCJpc1dpZGdldEZpbHRlcnNcIiBbY2xvc2VPbk91dHNpZGVDbGlja109XCJmYWxzZVwiIFtkcmFnRW5hYmxlZF09XCJmYWxzZVwiIFt3aWR0aF09XCI4MDBcIiBbaGVpZ2h0XT1cIjQwMFwiXG4gICAgW3Nob3dUaXRsZV09XCJ0cnVlXCIgY2xhc3M9XCJwb3B1cFwiIHRpdGxlPVwiRGF0YXNldCBGaWx0ZXJcIj5cbiAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NvbnRlbnQnXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJteS0yXCI+XG4gICAgICAgICAgICA8ZHgtc2Nyb2xsLXZpZXcgW3dpZHRoXT1cIicxMDAlJ1wiIFtoZWlnaHRdPVwiJzg1JSdcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIG5vZGVwcm9wZXJ0aWNlRmlsdGVyRGF0YVNvdXJjZTsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBteS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbS5jb2x1bW5OYW1lXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJbJ2dldCcsJ2xldCddXCIgWyhuZ01vZGVsKV09XCJpdGVtLm9wZXJhdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJPcGVyYXRvclwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0udmFsdWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8L2R4LXNjcm9sbC12aWV3PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1lbmQgbXgtMSBmbGV4LWdyb3dcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9zdWNjZXNzX21kfX0gY3Vyc29yLXBvaW50ZXIgbXQtMlwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzdWJtaXRGaWx0ZXIoKVwiPlN1Ym1pdDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cbjwvZHgtcG9wdXA+XG48ZHgtcG9wdXAgWyh2aXNpYmxlKV09XCJpc0FkdmFuY2VMYXlvdXRcIiBbY2xvc2VPbk91dHNpZGVDbGlja109XCJmYWxzZVwiIFtkcmFnRW5hYmxlZF09XCJmYWxzZVwiIFt3aWR0aF09XCIxMjAwXCJcbiAgICBbaGVpZ2h0XT1cIjcwMFwiIFtzaG93VGl0bGVdPVwidHJ1ZVwiIGNsYXNzPVwicG9wdXBcIiB0aXRsZT1cIkRhdGFzZXQgRmlsdGVyXCI+XG4gICAgPGRpdiAqZHhUZW1wbGF0ZT1cImxldCBkYXRhIG9mICdjb250ZW50J1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBweC0yIG1iLTNcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTIvMyBtYi0yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPlNlbGVjdCBWaWV3czwvZGl2PlxuICAgICAgICAgICAgICAgIDxkeC10YWctYm94IFtkYXRhU291cmNlXT1cImNvbXBvbmVudENvbmZpZ0RhdGFTb3VyY2VcIiB2YWx1ZUV4cHI9XCJ2aWV3SWRcIiBkaXNwbGF5RXhwcj1cInZpZXdOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgW211bHRpbGluZV09XCJ0cnVlXCIgW3Nob3dTZWxlY3Rpb25Db250cm9sc109XCJ0cnVlXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFZpZXdzSWRzXCJcbiAgICAgICAgICAgICAgICAgICAgW21heERpc3BsYXllZFRhZ3NdPVwiM1wiIChvblZhbHVlQ2hhbmdlZCk9XCJnZXRTZWxlY3RlZENvbHVtblNvdXJjZSgkZXZlbnQpXCIgW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIDwvZHgtdGFnLWJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMS8zIHB4LTJcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X21kfX0gbXQtNlwiIChjbGljayk9XCJnZXRQcm9jZXNzRm9yQ29uZmlnKClcIj5cbiAgICAgICAgICAgICAgICAgICAgQWRkIFRvIFZpZXdcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8IS0tIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2Rhbmdlcl9tZH19IGN1cnNvci1wb2ludGVyIG10LTZcIiAoY2xpY2spPVwiY2FuY2VsQ2RyQ29uZmlnKClcIj5DYW5jZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPiAtLT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGR4LXNjcm9sbC12aWV3IFt3aWR0aF09XCInMTAwJSdcIiBbaGVpZ2h0XT1cIic4MCUnXCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLTIgYm9yZGVyLWJcIiAqbmdJZj1cImlzUHJvY2VlZFwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgYWR2YW5jZUxheW91dENvbnRhaW5lcjsgbGV0IGkgPSBpbmRleDtcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMiB3LTEvMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj5WaWV3IE5hbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLmNvbXBDb25maWcudmlld0NvbmZpZ1swXS52aWV3TmFtZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPldpZGdldCBUaXRsZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0ubm9kZVByb3BlcnRpZXMud2lkZ2V0VGl0bGVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPldpZGdldCBXaWR0aDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtzZWFyY2hFbmFibGVkXT1cInRydWVcIiBbaXRlbXNdPVwid2lkZ2V0X3dpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLm5vZGVQcm9wZXJ0aWVzLndpZHRoXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPldpZGdldCBIZWlnaHQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLm5vZGVQcm9wZXJ0aWVzLmhlaWdodFwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPldpZGdldCBGaWx0ZXI8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiZmlsdGVyRGF0YVNvdXJjZVwiIGRpc3BsYXlFeHByPVwiZmlsdGVyTmFtZVwiIFtzZWFyY2hFbmFibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUV4cHI9XCJmaWx0ZXJJZFwiIFsobmdNb2RlbCldPVwiaXRlbS5maWx0ZXJJZFwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtdC04XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggWyhuZ01vZGVsKV09XCJpdGVtLm5vZGVQcm9wZXJ0aWVzLmRpc3BsYXlcIiB0ZXh0PVwiRGlzcGxheVwiPjwvZHgtY2hlY2stYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2Rhbmdlcl9zbX19IGN1cnNvci1wb2ludGVyIG10LThcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlVmlldyhpKVwiPjxpIGNsYXNzPVwiZmEgZmEtdHJhc2gtb1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2R4LXNjcm9sbC12aWV3PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZCBteC0xIG15LTIgZmxleC1ncm93XCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9zdWNjZXNzX21kfX0gY3Vyc29yLXBvaW50ZXIgbXQtMlwiIChjbGljayk9XCJzdWJtaXRBZHZhbmNlVmlldygpXCI+QWRkXG4gICAgICAgICAgICAgICAgTGF5b3V0PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9keC1wb3B1cD4iXX0=