@huntsman-cancer-institute/reporting-framework 16.0.0 → 17.0.0
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.
- package/datepicker/report-datepicker.component.d.ts +16 -16
- package/esm2022/datepicker/report-datepicker.component.mjs +61 -61
- package/esm2022/format/format.component.mjs +23 -23
- package/esm2022/huntsman-cancer-institute-reporting-framework.mjs +4 -4
- package/esm2022/index.mjs +2 -2
- package/esm2022/model/format.model.mjs +2 -2
- package/esm2022/model/option.model.mjs +2 -2
- package/esm2022/model/param.model.mjs +18 -18
- package/esm2022/model/report-tab.model.mjs +2 -2
- package/esm2022/model/report.model.mjs +6 -6
- package/esm2022/parameter/parameter.component.mjs +23 -23
- package/esm2022/report.module.mjs +79 -79
- package/esm2022/reporting-framework.component.mjs +424 -424
- package/esm2022/resizable-divider/resizable-section-divider.component.mjs +122 -122
- package/esm2022/spinner/dialogs.service.mjs +99 -99
- package/esm2022/spinner/spinner-dialog.component.mjs +45 -45
- package/fesm2022/huntsman-cancer-institute-reporting-framework.mjs +821 -821
- package/fesm2022/huntsman-cancer-institute-reporting-framework.mjs.map +1 -1
- package/format/format.component.d.ts +11 -11
- package/index.d.ts +2 -2
- package/model/format.model.d.ts +6 -6
- package/model/option.model.d.ts +5 -5
- package/model/param.model.d.ts +16 -16
- package/model/report-tab.model.d.ts +7 -7
- package/model/report.model.d.ts +15 -15
- package/package.json +16 -7
- package/parameter/parameter.component.d.ts +9 -9
- package/report.module.d.ts +21 -21
- package/reporting-framework.component.d.ts +58 -58
- package/resizable-divider/resizable-section-divider.component.d.ts +23 -23
- package/spinner/dialogs.service.d.ts +30 -30
- package/spinner/spinner-dialog.component.d.ts +12 -12
|
@@ -1,406 +1,406 @@
|
|
|
1
|
-
import { Component, ComponentFactoryResolver, Input, ViewChild, ViewContainerRef } from "@angular/core";
|
|
2
|
-
import { HttpClient, HttpParams } from "@angular/common/http";
|
|
3
|
-
import { Report } from "./model/report.model";
|
|
4
|
-
import { Param } from "./model/param.model";
|
|
5
|
-
import { ParameterComponent } from "./parameter/parameter.component";
|
|
6
|
-
import { Option } from "./model/option.model";
|
|
7
|
-
import { ReportTab } from "./model/report-tab.model";
|
|
8
|
-
import { Format } from "./model/format.model";
|
|
9
|
-
import { FormatComponent } from "./format/format.component";
|
|
10
|
-
import * as moment from "moment";
|
|
11
|
-
import { DatePipe } from "@angular/common";
|
|
12
|
-
import { ModalDismissReasons, NgbModal } from "@ng-bootstrap/ng-bootstrap";
|
|
13
|
-
import { DialogsService } from "./spinner/dialogs.service";
|
|
14
|
-
import * as i0 from "@angular/core";
|
|
15
|
-
import * as i1 from "@angular/common/http";
|
|
16
|
-
import * as i2 from "@angular/common";
|
|
17
|
-
import * as i3 from "./spinner/dialogs.service";
|
|
18
|
-
import * as i4 from "@ng-bootstrap/ng-bootstrap";
|
|
19
|
-
import * as i5 from "@angular/material/legacy-tabs";
|
|
20
|
-
import * as i6 from "ag-grid-angular";
|
|
21
|
-
import * as i7 from "./resizable-divider/resizable-section-divider.component";
|
|
22
|
-
export class ReportingFrameworkComponent {
|
|
23
|
-
constructor(http, resolver, datePipe, dialogsService, modalService) {
|
|
24
|
-
this.http = http;
|
|
25
|
-
this.resolver = resolver;
|
|
26
|
-
this.datePipe = datePipe;
|
|
27
|
-
this.dialogsService = dialogsService;
|
|
28
|
-
this.modalService = modalService;
|
|
29
|
-
this.fullGridList = [];
|
|
30
|
-
this.tabbedGridList = {};
|
|
31
|
-
this.gridOptions = {
|
|
32
|
-
rowStyle: {
|
|
33
|
-
"font-family": "Prompt, sans-serif"
|
|
34
|
-
},
|
|
35
|
-
rowHeight: 20,
|
|
36
|
-
enableCellTextSelection: true,
|
|
37
|
-
ensureDomOrder: true
|
|
38
|
-
}; //enableCellTextSelection should be combined with ensureDomOrder
|
|
39
|
-
this.tabbedGridApiList = {}; //a map of GridAPIs to tab names
|
|
40
|
-
this.reportList = [];
|
|
41
|
-
this.tabList = [];
|
|
42
|
-
this.tabTypeNameLookup = {}; //a kind of dict that maps the tab or type to the tab-name
|
|
43
|
-
this.selectedReport = new Report();
|
|
44
|
-
this.displayedParamComponentRefs = [];
|
|
45
|
-
this.displayedFormatComponentRefs = [];
|
|
46
|
-
}
|
|
47
|
-
ngOnInit() {
|
|
48
|
-
if (this.manageReportUrl != null) {
|
|
49
|
-
this.http.get(this.manageReportUrl, {
|
|
50
|
-
params: new HttpParams().set("action", "loadWithParams")
|
|
51
|
-
}).subscribe((resp) => {
|
|
52
|
-
console.log(resp);
|
|
53
|
-
var templist = [];
|
|
54
|
-
var tempTabbedGridList = {};
|
|
55
|
-
var tablist = resp["reportTabs"];
|
|
56
|
-
for (let row of tablist) {
|
|
57
|
-
var tab = new ReportTab();
|
|
58
|
-
tab.name = row.name;
|
|
59
|
-
tab.title = row.title;
|
|
60
|
-
tab.type = row.type;
|
|
61
|
-
tab.tab = row.tab;
|
|
62
|
-
tab.datakey = row.datakey;
|
|
63
|
-
if (!this.reportsByType) {
|
|
64
|
-
this.tabList.push(tab);
|
|
65
|
-
if (tab.tab) {
|
|
66
|
-
this.tabTypeNameLookup[tab.tab] = tab.name;
|
|
67
|
-
}
|
|
68
|
-
if (tab.type) {
|
|
69
|
-
this.tabTypeNameLookup[tab.type] = tab.name;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
if (this.reportsByType == tab.type) {
|
|
74
|
-
this.tabList.push(tab);
|
|
75
|
-
this.tabTypeNameLookup[tab.tab] = tab.name;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
var tabGridList = [];
|
|
79
|
-
this.tabbedGridList[tab.name] = tabGridList;
|
|
80
|
-
tempTabbedGridList[tab.name] = [];
|
|
81
|
-
}
|
|
82
|
-
var list = resp["reportList"];
|
|
83
|
-
// console.log(list);
|
|
84
|
-
for (let row of list) {
|
|
85
|
-
var report = new Report();
|
|
86
|
-
report.name = row.name;
|
|
87
|
-
report.title = row.title;
|
|
88
|
-
report.description = row.description;
|
|
89
|
-
report.className = row.className;
|
|
90
|
-
report.fileName = row.fileName;
|
|
91
|
-
report.type = row.type;
|
|
92
|
-
report.tab = row.tab;
|
|
93
|
-
report.datakey = row.datakey;
|
|
94
|
-
report.help = row.help;
|
|
95
|
-
const object = {
|
|
96
|
-
name: report.name,
|
|
97
|
-
title: report.title,
|
|
98
|
-
description: report.description
|
|
99
|
-
};
|
|
100
|
-
var tabname;
|
|
101
|
-
if (report.tab) {
|
|
102
|
-
tabname = this.tabTypeNameLookup[report.tab];
|
|
103
|
-
}
|
|
104
|
-
else if (!this.reportsByType && report.type) {
|
|
105
|
-
tabname = this.tabTypeNameLookup[report.type];
|
|
106
|
-
}
|
|
107
|
-
if (tabname) {
|
|
108
|
-
var gridlist = tempTabbedGridList[tabname];
|
|
109
|
-
if (this.reportsByType) {
|
|
110
|
-
if (report.type === this.reportsByType) {
|
|
111
|
-
gridlist.push(object);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
gridlist.push(object);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
let params = row.params;
|
|
119
|
-
if (params) {
|
|
120
|
-
for (let p of params) {
|
|
121
|
-
// console.log(p);
|
|
122
|
-
var newParam = new Param();
|
|
123
|
-
newParam.dictAPILeadIn = this.dictAPILeadIn;
|
|
124
|
-
newParam.caption = p.caption;
|
|
125
|
-
newParam.name = p.name;
|
|
126
|
-
newParam.type = p.type;
|
|
127
|
-
newParam.className = p.className;
|
|
128
|
-
newParam.valueXPath = p.valueXPath;
|
|
129
|
-
newParam.displayXPath = p.displayXPath;
|
|
130
|
-
newParam.displayOrder = p.displayOrder;
|
|
131
|
-
newParam.activeOnly = p.activeOnly;
|
|
132
|
-
if (newParam.valueXPath) {
|
|
133
|
-
newParam.valueXPath = newParam.valueXPath.replace("@", "");
|
|
134
|
-
}
|
|
135
|
-
if (newParam.displayXPath) {
|
|
136
|
-
newParam.displayXPath = newParam.displayXPath.replace("@", "");
|
|
137
|
-
}
|
|
138
|
-
let options = p.options;
|
|
139
|
-
if (options) {
|
|
140
|
-
for (let o of options) {
|
|
141
|
-
var newOption = new Option();
|
|
142
|
-
newOption.value = o.value;
|
|
143
|
-
newOption.display = o.display;
|
|
144
|
-
newOption.displayOrder = o.displayOrder;
|
|
145
|
-
newParam.options.push(newOption);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
report.params.push(newParam);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
let formats = row.formats;
|
|
152
|
-
if (formats) {
|
|
153
|
-
for (let f of formats) {
|
|
154
|
-
var newFormat = new Format();
|
|
155
|
-
newFormat.name = f.name;
|
|
156
|
-
newFormat.caption = f.caption;
|
|
157
|
-
newFormat.displayOrder = f.displayOrder;
|
|
158
|
-
report.formats.push(newFormat);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
this.reportList.push(report);
|
|
162
|
-
if (this.reportsByType) {
|
|
163
|
-
if (report.type === this.reportsByType) {
|
|
164
|
-
templist.push(object);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
else {
|
|
168
|
-
templist.push(object);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
this.fullGridList = templist.slice();
|
|
172
|
-
console.log("gridlist: ");
|
|
173
|
-
console.log(this.fullGridList);
|
|
174
|
-
for (let tab of this.tabList) {
|
|
175
|
-
this.tabbedGridList[tab.name] = tempTabbedGridList[tab.name].slice();
|
|
176
|
-
}
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
columnDef() {
|
|
181
|
-
return [
|
|
182
|
-
{
|
|
183
|
-
field: "title",
|
|
184
|
-
headerName: "Title",
|
|
185
|
-
width: 300,
|
|
186
|
-
sortable: true,
|
|
187
|
-
resizable: true,
|
|
188
|
-
editable: false
|
|
189
|
-
},
|
|
190
|
-
{
|
|
191
|
-
field: "description",
|
|
192
|
-
headerName: "Description",
|
|
193
|
-
sortable: true,
|
|
194
|
-
resizable: true,
|
|
195
|
-
editable: false
|
|
196
|
-
}
|
|
197
|
-
];
|
|
198
|
-
}
|
|
199
|
-
onMainGridReady(params) {
|
|
200
|
-
this.mainGridApi = params.api;
|
|
201
|
-
this.mainGridApi.setColumnDefs(this.columnDef());
|
|
202
|
-
this.mainGridApi.setRowData(this.fullGridList);
|
|
203
|
-
this.mainGridApi.sizeColumnsToFit();
|
|
204
|
-
}
|
|
205
|
-
onTabbedGridReady(params, tabname) {
|
|
206
|
-
this.tabbedGridApiList[tabname] = params.api;
|
|
207
|
-
this.tabbedGridApiList[tabname].setColumnDefs(this.columnDef());
|
|
208
|
-
this.tabbedGridApiList[tabname].setRowData(this.tabbedGridList[tabname]);
|
|
209
|
-
this.tabbedGridApiList[tabname].sizeColumnsToFit();
|
|
210
|
-
}
|
|
211
|
-
setSelectedRow(event) {
|
|
212
|
-
//console.log(event);
|
|
213
|
-
if (event.node.selected) {
|
|
214
|
-
let reportName = event.node.data.name;
|
|
215
|
-
console.log(event.node.data.name);
|
|
216
|
-
var matchedReport;
|
|
217
|
-
for (let r of this.reportList) {
|
|
218
|
-
if (r.name == reportName) {
|
|
219
|
-
matchedReport = r;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
if (matchedReport != null) {
|
|
223
|
-
this.selectedReport = matchedReport;
|
|
224
|
-
}
|
|
225
|
-
else {
|
|
226
|
-
this.selectedReport = new Report();
|
|
227
|
-
}
|
|
228
|
-
this.createParamComponents();
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
createParamComponents() {
|
|
232
|
-
if (this.paramContainer) {
|
|
233
|
-
this.paramContainer.clear();
|
|
234
|
-
}
|
|
235
|
-
if (this.formatContainer) {
|
|
236
|
-
this.formatContainer.clear();
|
|
237
|
-
}
|
|
238
|
-
//destroy previous components and clear the displayedRef lists..?
|
|
239
|
-
this.destroyComponentRefs();
|
|
240
|
-
this.displayedParamComponentRefs = [];
|
|
241
|
-
this.displayedFormatComponentRefs = [];
|
|
242
|
-
for (let p of this.selectedReport.params) {
|
|
243
|
-
const factory = this.resolver.resolveComponentFactory(ParameterComponent);
|
|
244
|
-
var componentRef = this.paramContainer.createComponent(factory);
|
|
245
|
-
this.displayedParamComponentRefs.push(componentRef);
|
|
246
|
-
componentRef.instance.setParam(p);
|
|
247
|
-
if (p.options.length > 0) {
|
|
248
|
-
var entries = [];
|
|
249
|
-
for (let o of p.options) {
|
|
250
|
-
var e = { id: o.value, display: o.display };
|
|
251
|
-
entries.push(e);
|
|
252
|
-
}
|
|
253
|
-
componentRef.instance.entries = entries;
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
var first = true;
|
|
257
|
-
for (let f of this.selectedReport.formats) {
|
|
258
|
-
const factory2 = this.resolver.resolveComponentFactory(FormatComponent);
|
|
259
|
-
var componentRef2 = this.formatContainer.createComponent(factory2);
|
|
260
|
-
this.displayedFormatComponentRefs.push(componentRef2);
|
|
261
|
-
componentRef2.instance.format = f;
|
|
262
|
-
componentRef2.instance.selectedValueChange.subscribe((s) => {
|
|
263
|
-
this.selectedFormat = s;
|
|
264
|
-
});
|
|
265
|
-
if (first) { //select the first format in the grouping
|
|
266
|
-
componentRef2.instance.selectedValue = f.name;
|
|
267
|
-
this.selectedFormat = f.name;
|
|
268
|
-
first = false;
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
openHelp(content) {
|
|
273
|
-
this.modalService.open(content, { ariaLabelledBy: "help-modal-title" })
|
|
274
|
-
.result.then((result) => {
|
|
275
|
-
// this.closeResult = `Closed with: ${result}`;
|
|
276
|
-
console.log(result);
|
|
277
|
-
}, (reason) => {
|
|
278
|
-
var closeResult = `Dismissed ${this.getDismissReason(reason)}`;
|
|
279
|
-
console.log(closeResult);
|
|
280
|
-
});
|
|
281
|
-
}
|
|
282
|
-
getDismissReason(reason) {
|
|
283
|
-
if (reason === ModalDismissReasons.ESC) {
|
|
284
|
-
return "by pressing ESC";
|
|
285
|
-
}
|
|
286
|
-
else if (reason === ModalDismissReasons.BACKDROP_CLICK) {
|
|
287
|
-
return "by clicking on a backdrop";
|
|
288
|
-
}
|
|
289
|
-
else {
|
|
290
|
-
return `with: ${reason}`;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
onRunReport() {
|
|
294
|
-
if (this.selectedReport) {
|
|
295
|
-
this.dialogsService.startDefaultSpinnerDialog();
|
|
296
|
-
console.log("format:" + this.selectedFormat);
|
|
297
|
-
if (!this.selectedFormat) {
|
|
298
|
-
this.selectedFormat = "html";
|
|
299
|
-
}
|
|
300
|
-
let runParams = new HttpParams();
|
|
301
|
-
runParams = runParams.append("format", this.selectedFormat);
|
|
302
|
-
runParams = runParams.append("action", "show");
|
|
303
|
-
runParams = runParams.append("reportName", this.selectedReport.name);
|
|
304
|
-
runParams = this.getRunParameters(runParams);
|
|
305
|
-
console.log(runParams);
|
|
306
|
-
this.http.get(this.commandPrefix + this.selectedReport.className, {
|
|
307
|
-
params: runParams,
|
|
308
|
-
observe: "response",
|
|
309
|
-
responseType: "blob"
|
|
310
|
-
}).subscribe((res) => {
|
|
311
|
-
console.log(res);
|
|
312
|
-
var filename;
|
|
313
|
-
if (this.selectedFormat != "html") {
|
|
314
|
-
filename = res.headers.get("content-disposition").split(";")[1].split("=")[1].replace(/\"/g, "");
|
|
315
|
-
}
|
|
316
|
-
var blob = new Blob([res.body], { type: res.body.type }); //, {type: "application/vnd.ms-excel"}
|
|
317
|
-
var fileURL = window.URL.createObjectURL(blob);
|
|
318
|
-
console.log(fileURL);
|
|
319
|
-
const a = document.createElement("a");
|
|
320
|
-
a.href = fileURL;
|
|
321
|
-
if (this.selectedFormat == "html") {
|
|
322
|
-
a.target = "_blank";
|
|
323
|
-
}
|
|
324
|
-
else {
|
|
325
|
-
a.download = filename;
|
|
326
|
-
}
|
|
327
|
-
window.document.body.appendChild(a);
|
|
328
|
-
a.click();
|
|
329
|
-
window.document.body.removeChild(a);
|
|
330
|
-
URL.revokeObjectURL(fileURL);
|
|
331
|
-
this.dialogsService.stopAllSpinnerDialogs();
|
|
332
|
-
});
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
getRunParameters(runParams) {
|
|
336
|
-
var newParams = runParams;
|
|
337
|
-
for (let o of this.displayedParamComponentRefs) {
|
|
338
|
-
var param = o.instance.param;
|
|
339
|
-
if (param.type == "multiselect") {
|
|
340
|
-
var resList = "";
|
|
341
|
-
for (let v of param.selectedValueList) {
|
|
342
|
-
if (resList != "") {
|
|
343
|
-
resList += ",";
|
|
344
|
-
}
|
|
345
|
-
resList += v;
|
|
346
|
-
}
|
|
347
|
-
newParams = newParams.append(param.name, resList);
|
|
348
|
-
}
|
|
349
|
-
else {
|
|
350
|
-
var value;
|
|
351
|
-
if (param.selectedValue) { //so we don't get "undefined" sent back
|
|
352
|
-
if (param.type == "date") {
|
|
353
|
-
value = this.getDateString(param.selectedValue);
|
|
354
|
-
}
|
|
355
|
-
else {
|
|
356
|
-
value = param.selectedValue;
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
else {
|
|
360
|
-
value = "";
|
|
361
|
-
}
|
|
362
|
-
newParams = newParams.append(param.name, value);
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
return newParams;
|
|
366
|
-
}
|
|
367
|
-
getDateString(date) {
|
|
368
|
-
if (date instanceof Date) {
|
|
369
|
-
if (!isNaN(date.getTime())) {
|
|
370
|
-
return this.datePipe.transform(date, "MM/dd/yyyy");
|
|
371
|
-
}
|
|
372
|
-
else {
|
|
373
|
-
return "";
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
else if (moment.isMoment(date)) {
|
|
377
|
-
if (date != null) {
|
|
378
|
-
return date.format("M/D/YYYY");
|
|
379
|
-
}
|
|
380
|
-
else {
|
|
381
|
-
return "";
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
else if (typeof date == "string") {
|
|
385
|
-
return date;
|
|
386
|
-
}
|
|
387
|
-
else {
|
|
388
|
-
return "";
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
destroyComponentRefs() {
|
|
392
|
-
for (let o of this.displayedParamComponentRefs) {
|
|
393
|
-
o.destroy();
|
|
394
|
-
}
|
|
395
|
-
for (let o of this.displayedFormatComponentRefs) {
|
|
396
|
-
o.destroy();
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
ngOnDestroy() {
|
|
400
|
-
this.destroyComponentRefs();
|
|
401
|
-
}
|
|
402
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
403
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
1
|
+
import { Component, ComponentFactoryResolver, Input, ViewChild, ViewContainerRef } from "@angular/core";
|
|
2
|
+
import { HttpClient, HttpParams } from "@angular/common/http";
|
|
3
|
+
import { Report } from "./model/report.model";
|
|
4
|
+
import { Param } from "./model/param.model";
|
|
5
|
+
import { ParameterComponent } from "./parameter/parameter.component";
|
|
6
|
+
import { Option } from "./model/option.model";
|
|
7
|
+
import { ReportTab } from "./model/report-tab.model";
|
|
8
|
+
import { Format } from "./model/format.model";
|
|
9
|
+
import { FormatComponent } from "./format/format.component";
|
|
10
|
+
import * as moment from "moment";
|
|
11
|
+
import { DatePipe } from "@angular/common";
|
|
12
|
+
import { ModalDismissReasons, NgbModal } from "@ng-bootstrap/ng-bootstrap";
|
|
13
|
+
import { DialogsService } from "./spinner/dialogs.service";
|
|
14
|
+
import * as i0 from "@angular/core";
|
|
15
|
+
import * as i1 from "@angular/common/http";
|
|
16
|
+
import * as i2 from "@angular/common";
|
|
17
|
+
import * as i3 from "./spinner/dialogs.service";
|
|
18
|
+
import * as i4 from "@ng-bootstrap/ng-bootstrap";
|
|
19
|
+
import * as i5 from "@angular/material/legacy-tabs";
|
|
20
|
+
import * as i6 from "ag-grid-angular";
|
|
21
|
+
import * as i7 from "./resizable-divider/resizable-section-divider.component";
|
|
22
|
+
export class ReportingFrameworkComponent {
|
|
23
|
+
constructor(http, resolver, datePipe, dialogsService, modalService) {
|
|
24
|
+
this.http = http;
|
|
25
|
+
this.resolver = resolver;
|
|
26
|
+
this.datePipe = datePipe;
|
|
27
|
+
this.dialogsService = dialogsService;
|
|
28
|
+
this.modalService = modalService;
|
|
29
|
+
this.fullGridList = [];
|
|
30
|
+
this.tabbedGridList = {};
|
|
31
|
+
this.gridOptions = {
|
|
32
|
+
rowStyle: {
|
|
33
|
+
"font-family": "Prompt, sans-serif"
|
|
34
|
+
},
|
|
35
|
+
rowHeight: 20,
|
|
36
|
+
enableCellTextSelection: true,
|
|
37
|
+
ensureDomOrder: true
|
|
38
|
+
}; //enableCellTextSelection should be combined with ensureDomOrder
|
|
39
|
+
this.tabbedGridApiList = {}; //a map of GridAPIs to tab names
|
|
40
|
+
this.reportList = [];
|
|
41
|
+
this.tabList = [];
|
|
42
|
+
this.tabTypeNameLookup = {}; //a kind of dict that maps the tab or type to the tab-name
|
|
43
|
+
this.selectedReport = new Report();
|
|
44
|
+
this.displayedParamComponentRefs = [];
|
|
45
|
+
this.displayedFormatComponentRefs = [];
|
|
46
|
+
}
|
|
47
|
+
ngOnInit() {
|
|
48
|
+
if (this.manageReportUrl != null) {
|
|
49
|
+
this.http.get(this.manageReportUrl, {
|
|
50
|
+
params: new HttpParams().set("action", "loadWithParams")
|
|
51
|
+
}).subscribe((resp) => {
|
|
52
|
+
console.log(resp);
|
|
53
|
+
var templist = [];
|
|
54
|
+
var tempTabbedGridList = {};
|
|
55
|
+
var tablist = resp["reportTabs"];
|
|
56
|
+
for (let row of tablist) {
|
|
57
|
+
var tab = new ReportTab();
|
|
58
|
+
tab.name = row.name;
|
|
59
|
+
tab.title = row.title;
|
|
60
|
+
tab.type = row.type;
|
|
61
|
+
tab.tab = row.tab;
|
|
62
|
+
tab.datakey = row.datakey;
|
|
63
|
+
if (!this.reportsByType) {
|
|
64
|
+
this.tabList.push(tab);
|
|
65
|
+
if (tab.tab) {
|
|
66
|
+
this.tabTypeNameLookup[tab.tab] = tab.name;
|
|
67
|
+
}
|
|
68
|
+
if (tab.type) {
|
|
69
|
+
this.tabTypeNameLookup[tab.type] = tab.name;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
if (this.reportsByType == tab.type) {
|
|
74
|
+
this.tabList.push(tab);
|
|
75
|
+
this.tabTypeNameLookup[tab.tab] = tab.name;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
var tabGridList = [];
|
|
79
|
+
this.tabbedGridList[tab.name] = tabGridList;
|
|
80
|
+
tempTabbedGridList[tab.name] = [];
|
|
81
|
+
}
|
|
82
|
+
var list = resp["reportList"];
|
|
83
|
+
// console.log(list);
|
|
84
|
+
for (let row of list) {
|
|
85
|
+
var report = new Report();
|
|
86
|
+
report.name = row.name;
|
|
87
|
+
report.title = row.title;
|
|
88
|
+
report.description = row.description;
|
|
89
|
+
report.className = row.className;
|
|
90
|
+
report.fileName = row.fileName;
|
|
91
|
+
report.type = row.type;
|
|
92
|
+
report.tab = row.tab;
|
|
93
|
+
report.datakey = row.datakey;
|
|
94
|
+
report.help = row.help;
|
|
95
|
+
const object = {
|
|
96
|
+
name: report.name,
|
|
97
|
+
title: report.title,
|
|
98
|
+
description: report.description
|
|
99
|
+
};
|
|
100
|
+
var tabname;
|
|
101
|
+
if (report.tab) {
|
|
102
|
+
tabname = this.tabTypeNameLookup[report.tab];
|
|
103
|
+
}
|
|
104
|
+
else if (!this.reportsByType && report.type) {
|
|
105
|
+
tabname = this.tabTypeNameLookup[report.type];
|
|
106
|
+
}
|
|
107
|
+
if (tabname) {
|
|
108
|
+
var gridlist = tempTabbedGridList[tabname];
|
|
109
|
+
if (this.reportsByType) {
|
|
110
|
+
if (report.type === this.reportsByType) {
|
|
111
|
+
gridlist.push(object);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
gridlist.push(object);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
let params = row.params;
|
|
119
|
+
if (params) {
|
|
120
|
+
for (let p of params) {
|
|
121
|
+
// console.log(p);
|
|
122
|
+
var newParam = new Param();
|
|
123
|
+
newParam.dictAPILeadIn = this.dictAPILeadIn;
|
|
124
|
+
newParam.caption = p.caption;
|
|
125
|
+
newParam.name = p.name;
|
|
126
|
+
newParam.type = p.type;
|
|
127
|
+
newParam.className = p.className;
|
|
128
|
+
newParam.valueXPath = p.valueXPath;
|
|
129
|
+
newParam.displayXPath = p.displayXPath;
|
|
130
|
+
newParam.displayOrder = p.displayOrder;
|
|
131
|
+
newParam.activeOnly = p.activeOnly;
|
|
132
|
+
if (newParam.valueXPath) {
|
|
133
|
+
newParam.valueXPath = newParam.valueXPath.replace("@", "");
|
|
134
|
+
}
|
|
135
|
+
if (newParam.displayXPath) {
|
|
136
|
+
newParam.displayXPath = newParam.displayXPath.replace("@", "");
|
|
137
|
+
}
|
|
138
|
+
let options = p.options;
|
|
139
|
+
if (options) {
|
|
140
|
+
for (let o of options) {
|
|
141
|
+
var newOption = new Option();
|
|
142
|
+
newOption.value = o.value;
|
|
143
|
+
newOption.display = o.display;
|
|
144
|
+
newOption.displayOrder = o.displayOrder;
|
|
145
|
+
newParam.options.push(newOption);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
report.params.push(newParam);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
let formats = row.formats;
|
|
152
|
+
if (formats) {
|
|
153
|
+
for (let f of formats) {
|
|
154
|
+
var newFormat = new Format();
|
|
155
|
+
newFormat.name = f.name;
|
|
156
|
+
newFormat.caption = f.caption;
|
|
157
|
+
newFormat.displayOrder = f.displayOrder;
|
|
158
|
+
report.formats.push(newFormat);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
this.reportList.push(report);
|
|
162
|
+
if (this.reportsByType) {
|
|
163
|
+
if (report.type === this.reportsByType) {
|
|
164
|
+
templist.push(object);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
templist.push(object);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
this.fullGridList = templist.slice();
|
|
172
|
+
console.log("gridlist: ");
|
|
173
|
+
console.log(this.fullGridList);
|
|
174
|
+
for (let tab of this.tabList) {
|
|
175
|
+
this.tabbedGridList[tab.name] = tempTabbedGridList[tab.name].slice();
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
columnDef() {
|
|
181
|
+
return [
|
|
182
|
+
{
|
|
183
|
+
field: "title",
|
|
184
|
+
headerName: "Title",
|
|
185
|
+
width: 300,
|
|
186
|
+
sortable: true,
|
|
187
|
+
resizable: true,
|
|
188
|
+
editable: false
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
field: "description",
|
|
192
|
+
headerName: "Description",
|
|
193
|
+
sortable: true,
|
|
194
|
+
resizable: true,
|
|
195
|
+
editable: false
|
|
196
|
+
}
|
|
197
|
+
];
|
|
198
|
+
}
|
|
199
|
+
onMainGridReady(params) {
|
|
200
|
+
this.mainGridApi = params.api;
|
|
201
|
+
this.mainGridApi.setColumnDefs(this.columnDef());
|
|
202
|
+
this.mainGridApi.setRowData(this.fullGridList);
|
|
203
|
+
this.mainGridApi.sizeColumnsToFit();
|
|
204
|
+
}
|
|
205
|
+
onTabbedGridReady(params, tabname) {
|
|
206
|
+
this.tabbedGridApiList[tabname] = params.api;
|
|
207
|
+
this.tabbedGridApiList[tabname].setColumnDefs(this.columnDef());
|
|
208
|
+
this.tabbedGridApiList[tabname].setRowData(this.tabbedGridList[tabname]);
|
|
209
|
+
this.tabbedGridApiList[tabname].sizeColumnsToFit();
|
|
210
|
+
}
|
|
211
|
+
setSelectedRow(event) {
|
|
212
|
+
//console.log(event);
|
|
213
|
+
if (event.node.selected) {
|
|
214
|
+
let reportName = event.node.data.name;
|
|
215
|
+
console.log(event.node.data.name);
|
|
216
|
+
var matchedReport;
|
|
217
|
+
for (let r of this.reportList) {
|
|
218
|
+
if (r.name == reportName) {
|
|
219
|
+
matchedReport = r;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if (matchedReport != null) {
|
|
223
|
+
this.selectedReport = matchedReport;
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
this.selectedReport = new Report();
|
|
227
|
+
}
|
|
228
|
+
this.createParamComponents();
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
createParamComponents() {
|
|
232
|
+
if (this.paramContainer) {
|
|
233
|
+
this.paramContainer.clear();
|
|
234
|
+
}
|
|
235
|
+
if (this.formatContainer) {
|
|
236
|
+
this.formatContainer.clear();
|
|
237
|
+
}
|
|
238
|
+
//destroy previous components and clear the displayedRef lists..?
|
|
239
|
+
this.destroyComponentRefs();
|
|
240
|
+
this.displayedParamComponentRefs = [];
|
|
241
|
+
this.displayedFormatComponentRefs = [];
|
|
242
|
+
for (let p of this.selectedReport.params) {
|
|
243
|
+
const factory = this.resolver.resolveComponentFactory(ParameterComponent);
|
|
244
|
+
var componentRef = this.paramContainer.createComponent(factory);
|
|
245
|
+
this.displayedParamComponentRefs.push(componentRef);
|
|
246
|
+
componentRef.instance.setParam(p);
|
|
247
|
+
if (p.options.length > 0) {
|
|
248
|
+
var entries = [];
|
|
249
|
+
for (let o of p.options) {
|
|
250
|
+
var e = { id: o.value, display: o.display };
|
|
251
|
+
entries.push(e);
|
|
252
|
+
}
|
|
253
|
+
componentRef.instance.entries = entries;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
var first = true;
|
|
257
|
+
for (let f of this.selectedReport.formats) {
|
|
258
|
+
const factory2 = this.resolver.resolveComponentFactory(FormatComponent);
|
|
259
|
+
var componentRef2 = this.formatContainer.createComponent(factory2);
|
|
260
|
+
this.displayedFormatComponentRefs.push(componentRef2);
|
|
261
|
+
componentRef2.instance.format = f;
|
|
262
|
+
componentRef2.instance.selectedValueChange.subscribe((s) => {
|
|
263
|
+
this.selectedFormat = s;
|
|
264
|
+
});
|
|
265
|
+
if (first) { //select the first format in the grouping
|
|
266
|
+
componentRef2.instance.selectedValue = f.name;
|
|
267
|
+
this.selectedFormat = f.name;
|
|
268
|
+
first = false;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
openHelp(content) {
|
|
273
|
+
this.modalService.open(content, { ariaLabelledBy: "help-modal-title" })
|
|
274
|
+
.result.then((result) => {
|
|
275
|
+
// this.closeResult = `Closed with: ${result}`;
|
|
276
|
+
console.log(result);
|
|
277
|
+
}, (reason) => {
|
|
278
|
+
var closeResult = `Dismissed ${this.getDismissReason(reason)}`;
|
|
279
|
+
console.log(closeResult);
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
getDismissReason(reason) {
|
|
283
|
+
if (reason === ModalDismissReasons.ESC) {
|
|
284
|
+
return "by pressing ESC";
|
|
285
|
+
}
|
|
286
|
+
else if (reason === ModalDismissReasons.BACKDROP_CLICK) {
|
|
287
|
+
return "by clicking on a backdrop";
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
return `with: ${reason}`;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
onRunReport() {
|
|
294
|
+
if (this.selectedReport) {
|
|
295
|
+
this.dialogsService.startDefaultSpinnerDialog();
|
|
296
|
+
console.log("format:" + this.selectedFormat);
|
|
297
|
+
if (!this.selectedFormat) {
|
|
298
|
+
this.selectedFormat = "html";
|
|
299
|
+
}
|
|
300
|
+
let runParams = new HttpParams();
|
|
301
|
+
runParams = runParams.append("format", this.selectedFormat);
|
|
302
|
+
runParams = runParams.append("action", "show");
|
|
303
|
+
runParams = runParams.append("reportName", this.selectedReport.name);
|
|
304
|
+
runParams = this.getRunParameters(runParams);
|
|
305
|
+
console.log(runParams);
|
|
306
|
+
this.http.get(this.commandPrefix + this.selectedReport.className, {
|
|
307
|
+
params: runParams,
|
|
308
|
+
observe: "response",
|
|
309
|
+
responseType: "blob"
|
|
310
|
+
}).subscribe((res) => {
|
|
311
|
+
console.log(res);
|
|
312
|
+
var filename;
|
|
313
|
+
if (this.selectedFormat != "html") {
|
|
314
|
+
filename = res.headers.get("content-disposition").split(";")[1].split("=")[1].replace(/\"/g, "");
|
|
315
|
+
}
|
|
316
|
+
var blob = new Blob([res.body], { type: res.body.type }); //, {type: "application/vnd.ms-excel"}
|
|
317
|
+
var fileURL = window.URL.createObjectURL(blob);
|
|
318
|
+
console.log(fileURL);
|
|
319
|
+
const a = document.createElement("a");
|
|
320
|
+
a.href = fileURL;
|
|
321
|
+
if (this.selectedFormat == "html") {
|
|
322
|
+
a.target = "_blank";
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
a.download = filename;
|
|
326
|
+
}
|
|
327
|
+
window.document.body.appendChild(a);
|
|
328
|
+
a.click();
|
|
329
|
+
window.document.body.removeChild(a);
|
|
330
|
+
URL.revokeObjectURL(fileURL);
|
|
331
|
+
this.dialogsService.stopAllSpinnerDialogs();
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
getRunParameters(runParams) {
|
|
336
|
+
var newParams = runParams;
|
|
337
|
+
for (let o of this.displayedParamComponentRefs) {
|
|
338
|
+
var param = o.instance.param;
|
|
339
|
+
if (param.type == "multiselect") {
|
|
340
|
+
var resList = "";
|
|
341
|
+
for (let v of param.selectedValueList) {
|
|
342
|
+
if (resList != "") {
|
|
343
|
+
resList += ",";
|
|
344
|
+
}
|
|
345
|
+
resList += v;
|
|
346
|
+
}
|
|
347
|
+
newParams = newParams.append(param.name, resList);
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
var value;
|
|
351
|
+
if (param.selectedValue) { //so we don't get "undefined" sent back
|
|
352
|
+
if (param.type == "date") {
|
|
353
|
+
value = this.getDateString(param.selectedValue);
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
value = param.selectedValue;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
value = "";
|
|
361
|
+
}
|
|
362
|
+
newParams = newParams.append(param.name, value);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
return newParams;
|
|
366
|
+
}
|
|
367
|
+
getDateString(date) {
|
|
368
|
+
if (date instanceof Date) {
|
|
369
|
+
if (!isNaN(date.getTime())) {
|
|
370
|
+
return this.datePipe.transform(date, "MM/dd/yyyy");
|
|
371
|
+
}
|
|
372
|
+
else {
|
|
373
|
+
return "";
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
else if (moment.isMoment(date)) {
|
|
377
|
+
if (date != null) {
|
|
378
|
+
return date.format("M/D/YYYY");
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
return "";
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
else if (typeof date == "string") {
|
|
385
|
+
return date;
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
return "";
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
destroyComponentRefs() {
|
|
392
|
+
for (let o of this.displayedParamComponentRefs) {
|
|
393
|
+
o.destroy();
|
|
394
|
+
}
|
|
395
|
+
for (let o of this.displayedFormatComponentRefs) {
|
|
396
|
+
o.destroy();
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
ngOnDestroy() {
|
|
400
|
+
this.destroyComponentRefs();
|
|
401
|
+
}
|
|
402
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: ReportingFrameworkComponent, deps: [{ token: i1.HttpClient }, { token: i0.ComponentFactoryResolver }, { token: i2.DatePipe }, { token: i3.DialogsService }, { token: i4.NgbModal }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
403
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.2", type: ReportingFrameworkComponent, selector: "hci-reporting-framework", inputs: { manageReportUrl: "manageReportUrl", commandPrefix: "commandPrefix", dictAPILeadIn: "dictAPILeadIn", reportsByType: "reportsByType" }, viewQueries: [{ propertyName: "paramContainer", first: true, predicate: ["paramContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "formatContainer", first: true, predicate: ["formatContainer"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: `
|
|
404
404
|
<div style="height: 100vh">
|
|
405
405
|
<resizable-section-divider class="flex-grow-1" [isVerticalLayout]="true">
|
|
406
406
|
<div topSection class="d-flex flex-column" style="height: 100%; width: 100%; overflow: auto;">
|
|
@@ -502,10 +502,10 @@ export class ReportingFrameworkComponent {
|
|
|
502
502
|
</div>
|
|
503
503
|
</ng-template>
|
|
504
504
|
|
|
505
|
-
`, isInline: true, styles: [":host ::ng-deep .mat-tab-body-wrapper{flex-grow:1}:host ::ng-deep .mat-tab-label{background-color:#98c7e0}:host ::ng-deep .mat-tab-label-active{background-color:#def4ff}.report-details{height:100%;width:100%;position:absolute}.center-row{margin-top:10px;margin-left:60vw}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatLegacyTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple"], exportAs: ["matTabGroup"] }, { kind: "component", type: i5.MatLegacyTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "directive", type: i5.MatLegacyTabContent, selector: "[matTabContent]" }, { kind: "component", type: i6.AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "suppressMenuHide", "enableBrowserTooltips", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "maintainColumnOrder", "suppressFieldDotNotation", "deltaColumnMode", "applyColumnDefOrder", "immutableColumns", "suppressSetColumnStateEvents", "suppressColumnStateEvents", "colWidth", "minColWidth", "maxColWidth", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressDragLeaveHidesColumns", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "components", "frameworkComponents", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterMovesDown", "enterMovesDownAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "stopEditingWhenGridLosesFocus", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "defaultExportParams", "quickFilterText", "cacheQuickFilter", "excludeChildrenWhenTreeDataFiltering", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "enableChartToolPanelsButton", "chartToolPanelsDef", "loadingCellRenderer", "loadingCellRendererFramework", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererFramework", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressParentsInRowNodes", "suppressTouch", "suppressFocusAfterRefresh", "suppressAsyncEvents", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentFramework", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentFramework", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "suppressAggAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "enableCellChangeFlash", "cellFlashDelay", "cellFadeDelay", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "fullWidthCellRenderer", "fullWidthCellRendererFramework", "fullWidthCellRendererParams", "embedFullWidthRows", "deprecatedEmbedFullWidthRows", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupAggFiltering", "groupIncludeFooter", "groupIncludeTotalFooter", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererFramework", "groupRowRendererParams", "suppressMakeColumnVisibleAfterUnGroup", "treeData", "rowGroupPanelSuppressSort", "groupRowsSticky", "groupRowInnerRenderer", "groupRowInnerRendererFramework", "groupMultiAutoColumn", "groupUseEntireRow", "groupSuppressAutoColumn", "rememberGroupStateWhenNewData", "pinnedTopRowData", "pinnedBottomRowData", "rowModelType", "rowData", "immutableData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "deltaRowDataMode", "batchUpdateWaitMillis", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "serverSideStoreType", "serverSideInfiniteScroll", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideFilterAllLevels", "serverSideSortOnServer", "serverSideFilterOnServer", "serverSideSortingAlwaysResets", "serverSideFilteringAlwaysResets", "suppressEnterpriseResetOnNewColumns", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellSelection", "suppressCellFocus", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "deltaSort", "treeDataDisplayType", "angularCompileRows", "angularCompileFilters", "functionsPassive", "enableGroupEdit", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "suppressKeyboardEvent", "localeTextFunc", "getLocaleText", "getDocument", "paginationNumberFormatter", "groupRowAggNodes", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "defaultGroupOrderComparator", "processSecondaryColDef", "processSecondaryColGroupDef", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "defaultGroupSortComparator", "getChildCount", "getServerSideGroupLevelParams", "getServerSideStoreParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowNodeId", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSort", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthCell", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "filterOpened", "filterChanged", "filterModified", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "cellKeyPress", "gridReady", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pinnedRowDataChanged", "rowDataChanged", "rowDataUpdated", "asyncTransactionsFlushed", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "sortChanged", "columnRowGroupChangeRequest", "columnPivotChangeRequest", "columnValueChangeRequest", "columnAggFuncChangeRequest"] }, { kind: "component", type: i7.ResizableSectionDividerComponent, selector: "resizable-section-divider", inputs: ["initialPercentage", "isVerticalLayout", "maxPercentage", "minPercentage"] }] }); }
|
|
506
|
-
}
|
|
507
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
508
|
-
type: Component,
|
|
505
|
+
`, isInline: true, styles: [":host ::ng-deep .mat-tab-body-wrapper{flex-grow:1}:host ::ng-deep .mat-tab-label{background-color:#98c7e0}:host ::ng-deep .mat-tab-label-active{background-color:#def4ff}.report-details{height:100%;width:100%;position:absolute}.center-row{margin-top:10px;margin-left:60vw}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.MatLegacyTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple"], exportAs: ["matTabGroup"] }, { kind: "component", type: i5.MatLegacyTab, selector: "mat-tab", inputs: ["disabled"], exportAs: ["matTab"] }, { kind: "directive", type: i5.MatLegacyTabContent, selector: "[matTabContent]" }, { kind: "component", type: i6.AgGridAngular, selector: "ag-grid-angular", inputs: ["gridOptions", "modules", "statusBar", "sideBar", "suppressContextMenu", "preventDefaultOnContextMenu", "allowContextMenuWithControlKey", "suppressMenuHide", "enableBrowserTooltips", "tooltipShowDelay", "tooltipHideDelay", "tooltipMouseTrack", "popupParent", "copyHeadersToClipboard", "copyGroupHeadersToClipboard", "clipboardDelimiter", "suppressCopyRowsToClipboard", "suppressCopySingleCellRanges", "suppressLastEmptyLineOnPaste", "suppressClipboardPaste", "suppressClipboardApi", "columnDefs", "defaultColDef", "defaultColGroupDef", "columnTypes", "maintainColumnOrder", "suppressFieldDotNotation", "deltaColumnMode", "applyColumnDefOrder", "immutableColumns", "suppressSetColumnStateEvents", "suppressColumnStateEvents", "colWidth", "minColWidth", "maxColWidth", "headerHeight", "groupHeaderHeight", "floatingFiltersHeight", "pivotHeaderHeight", "pivotGroupHeaderHeight", "allowDragFromColumnsToolPanel", "suppressMovableColumns", "suppressColumnMoveAnimation", "suppressDragLeaveHidesColumns", "suppressRowGroupHidesColumns", "colResizeDefault", "suppressAutoSize", "autoSizePadding", "skipHeaderOnAutoSize", "components", "frameworkComponents", "editType", "singleClickEdit", "suppressClickEdit", "readOnlyEdit", "stopEditingWhenCellsLoseFocus", "enterMovesDown", "enterMovesDownAfterEdit", "enableCellEditingOnBackspace", "undoRedoCellEditing", "undoRedoCellEditingLimit", "stopEditingWhenGridLosesFocus", "defaultCsvExportParams", "suppressCsvExport", "defaultExcelExportParams", "suppressExcelExport", "excelStyles", "defaultExportParams", "quickFilterText", "cacheQuickFilter", "excludeChildrenWhenTreeDataFiltering", "enableCharts", "chartThemes", "customChartThemes", "chartThemeOverrides", "enableChartToolPanelsButton", "chartToolPanelsDef", "loadingCellRenderer", "loadingCellRendererFramework", "loadingCellRendererParams", "loadingCellRendererSelector", "localeText", "masterDetail", "keepDetailRows", "keepDetailRowsCount", "detailCellRenderer", "detailCellRendererFramework", "detailCellRendererParams", "detailRowHeight", "detailRowAutoHeight", "context", "alignedGrids", "tabIndex", "rowBuffer", "valueCache", "valueCacheNeverExpires", "enableCellExpressions", "suppressParentsInRowNodes", "suppressTouch", "suppressFocusAfterRefresh", "suppressAsyncEvents", "suppressBrowserResizeObserver", "suppressPropertyNamesCheck", "suppressChangeDetection", "debug", "overlayLoadingTemplate", "loadingOverlayComponent", "loadingOverlayComponentFramework", "loadingOverlayComponentParams", "suppressLoadingOverlay", "overlayNoRowsTemplate", "noRowsOverlayComponent", "noRowsOverlayComponentFramework", "noRowsOverlayComponentParams", "suppressNoRowsOverlay", "pagination", "paginationPageSize", "paginationAutoPageSize", "paginateChildRows", "suppressPaginationPanel", "pivotMode", "pivotPanelShow", "pivotColumnGroupTotals", "pivotRowTotals", "pivotSuppressAutoColumn", "suppressExpandablePivotGroups", "functionsReadOnly", "aggFuncs", "suppressAggFuncInHeader", "suppressAggAtRootLevel", "aggregateOnlyChangedColumns", "suppressAggFilteredOnly", "removePivotHeaderRowWhenSingleValueColumn", "animateRows", "enableCellChangeFlash", "cellFlashDelay", "cellFadeDelay", "allowShowChangeAfterFilter", "domLayout", "ensureDomOrder", "enableRtl", "suppressColumnVirtualisation", "suppressMaxRenderedRowRestriction", "suppressRowVirtualisation", "rowDragManaged", "suppressRowDrag", "suppressMoveWhenRowDragging", "rowDragEntireRow", "rowDragMultiRow", "rowDragText", "fullWidthCellRenderer", "fullWidthCellRendererFramework", "fullWidthCellRendererParams", "embedFullWidthRows", "deprecatedEmbedFullWidthRows", "groupDisplayType", "groupDefaultExpanded", "autoGroupColumnDef", "groupMaintainOrder", "groupSelectsChildren", "groupAggFiltering", "groupIncludeFooter", "groupIncludeTotalFooter", "groupSuppressBlankHeader", "groupSelectsFiltered", "showOpenedGroup", "groupRemoveSingleChildren", "groupRemoveLowestSingleChildren", "groupHideOpenParents", "rowGroupPanelShow", "groupRowRenderer", "groupRowRendererFramework", "groupRowRendererParams", "suppressMakeColumnVisibleAfterUnGroup", "treeData", "rowGroupPanelSuppressSort", "groupRowsSticky", "groupRowInnerRenderer", "groupRowInnerRendererFramework", "groupMultiAutoColumn", "groupUseEntireRow", "groupSuppressAutoColumn", "rememberGroupStateWhenNewData", "pinnedTopRowData", "pinnedBottomRowData", "rowModelType", "rowData", "immutableData", "asyncTransactionWaitMillis", "suppressModelUpdateAfterUpdateTransaction", "deltaRowDataMode", "batchUpdateWaitMillis", "datasource", "cacheOverflowSize", "infiniteInitialRowCount", "serverSideInitialRowCount", "serverSideStoreType", "serverSideInfiniteScroll", "cacheBlockSize", "maxBlocksInCache", "maxConcurrentDatasourceRequests", "blockLoadDebounceMillis", "purgeClosedRowNodes", "serverSideDatasource", "serverSideSortAllLevels", "serverSideFilterAllLevels", "serverSideSortOnServer", "serverSideFilterOnServer", "serverSideSortingAlwaysResets", "serverSideFilteringAlwaysResets", "suppressEnterpriseResetOnNewColumns", "viewportDatasource", "viewportRowModelPageSize", "viewportRowModelBufferSize", "alwaysShowHorizontalScroll", "alwaysShowVerticalScroll", "debounceVerticalScrollbar", "suppressHorizontalScroll", "suppressScrollOnNewData", "suppressScrollWhenPopupsAreOpen", "suppressAnimationFrame", "suppressMiddleClickScrolls", "suppressPreventDefaultOnMouseWheel", "scrollbarWidth", "rowSelection", "rowMultiSelectWithClick", "suppressRowDeselection", "suppressRowClickSelection", "suppressCellSelection", "suppressCellFocus", "suppressMultiRangeSelection", "enableCellTextSelection", "enableRangeSelection", "enableRangeHandle", "enableFillHandle", "fillHandleDirection", "suppressClearOnFillReduction", "sortingOrder", "accentedSort", "unSortIcon", "suppressMultiSort", "alwaysMultiSort", "multiSortKey", "suppressMaintainUnsortedOrder", "icons", "rowHeight", "rowStyle", "rowClass", "rowClassRules", "suppressRowHoverHighlight", "suppressRowTransform", "columnHoverHighlight", "deltaSort", "treeDataDisplayType", "angularCompileRows", "angularCompileFilters", "functionsPassive", "enableGroupEdit", "getContextMenuItems", "getMainMenuItems", "postProcessPopup", "processCellForClipboard", "processHeaderForClipboard", "processGroupHeaderForClipboard", "processCellFromClipboard", "sendToClipboard", "processDataFromClipboard", "isExternalFilterPresent", "doesExternalFilterPass", "getChartToolbarItems", "createChartContainer", "navigateToNextHeader", "tabToNextHeader", "navigateToNextCell", "tabToNextCell", "suppressKeyboardEvent", "localeTextFunc", "getLocaleText", "getDocument", "paginationNumberFormatter", "groupRowAggNodes", "getGroupRowAgg", "isGroupOpenByDefault", "initialGroupOrderComparator", "defaultGroupOrderComparator", "processSecondaryColDef", "processSecondaryColGroupDef", "processPivotResultColDef", "processPivotResultColGroupDef", "getDataPath", "defaultGroupSortComparator", "getChildCount", "getServerSideGroupLevelParams", "getServerSideStoreParams", "isServerSideGroupOpenByDefault", "isApplyServerSideTransaction", "isServerSideGroup", "getServerSideGroupKey", "getBusinessKeyForNode", "getRowNodeId", "getRowId", "resetRowDataOnUpdate", "processRowPostCreate", "isRowSelectable", "isRowMaster", "fillOperation", "postSort", "postSortRows", "getRowStyle", "getRowClass", "getRowHeight", "isFullWidthCell", "isFullWidthRow"], outputs: ["toolPanelVisibleChanged", "toolPanelSizeChanged", "pasteStart", "pasteEnd", "columnVisible", "columnPinned", "columnResized", "columnMoved", "columnValueChanged", "columnPivotModeChanged", "columnPivotChanged", "columnGroupOpened", "newColumnsLoaded", "gridColumnsChanged", "displayedColumnsChanged", "virtualColumnsChanged", "columnEverythingChanged", "componentStateChanged", "cellValueChanged", "cellEditRequest", "rowValueChanged", "cellEditingStarted", "cellEditingStopped", "rowEditingStarted", "rowEditingStopped", "filterOpened", "filterChanged", "filterModified", "chartCreated", "chartRangeSelectionChanged", "chartOptionsChanged", "chartDestroyed", "cellKeyDown", "cellKeyPress", "gridReady", "firstDataRendered", "gridSizeChanged", "modelUpdated", "virtualRowRemoved", "viewportChanged", "bodyScroll", "bodyScrollEnd", "dragStarted", "dragStopped", "paginationChanged", "rowDragEnter", "rowDragMove", "rowDragLeave", "rowDragEnd", "columnRowGroupChanged", "rowGroupOpened", "expandOrCollapseAll", "pinnedRowDataChanged", "rowDataChanged", "rowDataUpdated", "asyncTransactionsFlushed", "cellClicked", "cellDoubleClicked", "cellFocused", "cellMouseOver", "cellMouseOut", "cellMouseDown", "rowClicked", "rowDoubleClicked", "rowSelected", "selectionChanged", "cellContextMenu", "rangeSelectionChanged", "sortChanged", "columnRowGroupChangeRequest", "columnPivotChangeRequest", "columnValueChangeRequest", "columnAggFuncChangeRequest"] }, { kind: "component", type: i7.ResizableSectionDividerComponent, selector: "resizable-section-divider", inputs: ["initialPercentage", "isVerticalLayout", "maxPercentage", "minPercentage"] }] }); }
|
|
506
|
+
}
|
|
507
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: ReportingFrameworkComponent, decorators: [{
|
|
508
|
+
type: Component,
|
|
509
509
|
args: [{ selector: "hci-reporting-framework", template: `
|
|
510
510
|
<div style="height: 100vh">
|
|
511
511
|
<resizable-section-divider class="flex-grow-1" [isVerticalLayout]="true">
|
|
@@ -608,20 +608,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
608
608
|
</div>
|
|
609
609
|
</ng-template>
|
|
610
610
|
|
|
611
|
-
`, styles: [":host ::ng-deep .mat-tab-body-wrapper{flex-grow:1}:host ::ng-deep .mat-tab-label{background-color:#98c7e0}:host ::ng-deep .mat-tab-label-active{background-color:#def4ff}.report-details{height:100%;width:100%;position:absolute}.center-row{margin-top:10px;margin-left:60vw}\n"] }]
|
|
612
|
-
}], ctorParameters:
|
|
613
|
-
type: Input
|
|
614
|
-
}], commandPrefix: [{
|
|
615
|
-
type: Input
|
|
616
|
-
}], dictAPILeadIn: [{
|
|
617
|
-
type: Input
|
|
618
|
-
}], reportsByType: [{
|
|
619
|
-
type: Input
|
|
620
|
-
}], paramContainer: [{
|
|
621
|
-
type: ViewChild,
|
|
622
|
-
args: ["paramContainer", { read: ViewContainerRef, static: false }]
|
|
623
|
-
}], formatContainer: [{
|
|
624
|
-
type: ViewChild,
|
|
625
|
-
args: ["formatContainer", { read: ViewContainerRef, static: false }]
|
|
626
|
-
}] } });
|
|
627
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLWZyYW1ld29yay5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9yZXBvcnRpbmctZnJhbWV3b3JrL3NyYy9yZXBvcnRpbmctZnJhbWV3b3JrLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULHdCQUF3QixFQUN4QixLQUFLLEVBRUwsU0FBUyxFQUNULGdCQUFnQixFQUNuQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsVUFBVSxFQUFFLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzVELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM1QyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDMUMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDNUMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUMsbUJBQW1CLEVBQUUsUUFBUSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDekUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7Ozs7QUFxSXpELE1BQU0sT0FBTywyQkFBMkI7SUFvQ3BDLFlBQW9CLElBQWdCLEVBQ2hCLFFBQWtDLEVBQ2xDLFFBQWtCLEVBQ2xCLGNBQThCLEVBQzlCLFlBQXNC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Q0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVnRSxjQUFjO3NCQUFuRixTQUFTO3VCQUFDLGdCQUFnQixFQUFFLEVBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUM7Z0JBQ0csZUFBZTtzQkFBckYsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCwgQ29tcG9uZW50RmFjdG9yeSxcclxuICAgIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgQ29tcG9uZW50UmVmLFxyXG4gICAgSW5wdXQsIE9uRGVzdHJveSxcclxuICAgIE9uSW5pdCxcclxuICAgIFZpZXdDaGlsZCxcclxuICAgIFZpZXdDb250YWluZXJSZWZcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0h0dHBDbGllbnQsIEh0dHBQYXJhbXN9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQge1JlcG9ydH0gZnJvbSBcIi4vbW9kZWwvcmVwb3J0Lm1vZGVsXCI7XHJcbmltcG9ydCB7UGFyYW19IGZyb20gXCIuL21vZGVsL3BhcmFtLm1vZGVsXCI7XHJcbmltcG9ydCB7UGFyYW1ldGVyQ29tcG9uZW50fSBmcm9tIFwiLi9wYXJhbWV0ZXIvcGFyYW1ldGVyLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge09wdGlvbn0gZnJvbSBcIi4vbW9kZWwvb3B0aW9uLm1vZGVsXCI7XHJcbmltcG9ydCB7UmVwb3J0VGFifSBmcm9tIFwiLi9tb2RlbC9yZXBvcnQtdGFiLm1vZGVsXCI7XHJcbmltcG9ydCB7Rm9ybWF0fSBmcm9tIFwiLi9tb2RlbC9mb3JtYXQubW9kZWxcIjtcclxuaW1wb3J0IHtGb3JtYXRDb21wb25lbnR9IGZyb20gXCIuL2Zvcm1hdC9mb3JtYXQuY29tcG9uZW50XCI7XHJcbmltcG9ydCAqIGFzIG1vbWVudCBmcm9tIFwibW9tZW50XCI7XHJcbmltcG9ydCB7RGF0ZVBpcGV9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHtNb2RhbERpc21pc3NSZWFzb25zLCBOZ2JNb2RhbH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcbmltcG9ydCB7RGlhbG9nc1NlcnZpY2V9IGZyb20gXCIuL3NwaW5uZXIvZGlhbG9ncy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEdyaWRBcGkgfSBmcm9tIFwiYWctZ3JpZC1jb21tdW5pdHlcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6IFwiaGNpLXJlcG9ydGluZy1mcmFtZXdvcmtcIixcclxuICAgIHRlbXBsYXRlOiBgXHJcbiAgICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6IDEwMHZoXCI+XHJcbiAgICAgICAgPHJlc2l6YWJsZS1zZWN0aW9uLWRpdmlkZXIgY2xhc3M9XCJmbGV4LWdyb3ctMVwiIFtpc1ZlcnRpY2FsTGF5b3V0XT1cInRydWVcIj5cclxuICAgICAgICAgIDxkaXYgdG9wU2VjdGlvbiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtblwiIHN0eWxlPVwiaGVpZ2h0OiAxMDAlOyB3aWR0aDogMTAwJTsgb3ZlcmZsb3c6IGF1dG87XCI+XHJcbiAgICAgICAgICAgIDwhLS1jYW4gd3JhcCBqdXN0IHRoZSBncmlkIHdpdGggdGhlIHRhYnMtLT5cclxuICAgICAgICAgICAgPG1hdC10YWItZ3JvdXAgKm5nSWY9XCJ0YWJMaXN0Lmxlbmd0aCA+IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC10YWIgKm5nRm9yPVwibGV0IHRhYiBvZiB0YWJMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7dGFiLnRpdGxlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRUYWJDb250ZW50PlxyXG4gICAgICAgICAgICAgICAgICA8YWctZ3JpZC1hbmd1bGFyXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhZy10aGVtZS1iYWxoYW0gZnVsbC13aWR0aCBmbGV4LWdyb3ctMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtaW4taGVpZ2h0OiAyMDBweDsgaGVpZ2h0OiAxMDAlO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKGdyaWRSZWFkeSk9XCJ0aGlzLm9uVGFiYmVkR3JpZFJlYWR5KCRldmVudCwgdGFiLm5hbWUpXCJcclxuICAgICAgICAgICAgICAgICAgICBbZ3JpZE9wdGlvbnNdPVwidGhpcy5ncmlkT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGlvbl09XCInc2luZ2xlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKHJvd1NlbGVjdGVkKT1cInNldFNlbGVjdGVkUm93KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtmcmFtZXdvcmtDb21wb25lbnRzXT1cImZyYW1ld29ya0NvbXBvbmVudHNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyb3dEYXRhXT1cInRhYmJlZEdyaWRMaXN0W3RhYi5uYW1lXVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L2FnLWdyaWQtYW5ndWxhcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9tYXQtdGFiPlxyXG4gICAgICAgICAgICA8L21hdC10YWItZ3JvdXA+XHJcblxyXG4gICAgICAgICAgICA8IS0tbmdiLXRhYnNldCAqbmdJZj1cInRhYkxpc3QubGVuZ3RoID4gMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lPbkhpZGU9XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0YWJzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4LWdyb3ctMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICNyZXBvcnRUYWJTZXQ9XCJuZ2JUYWJzZXRcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPG5nYi10YWIgKm5nRm9yPVwibGV0IHRhYiBvZiB0YWJMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7dGFiLm5hbWV9fVwiIHRpdGxlPVwie3t0YWIudGl0bGV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJib3JkZXI6IDVweCBzb2xpZDtcIiA+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbmdiVGFiQ29udGVudCA+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8YWctZ3JpZC1hbmd1bGFyXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhZy10aGVtZS1iYWxoYW0gZnVsbC13aWR0aCBmbGV4LWdyb3ctMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtaW4taGVpZ2h0OiAyMDBweDsgaGVpZ2h0OiAxMDAlO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKGdyaWRSZWFkeSk9XCJ0aGlzLm9uVGFiYmVkR3JpZFJlYWR5KCRldmVudCwgdGFiLm5hbWUpXCJcclxuICAgICAgICAgICAgICAgICAgICBbZ3JpZE9wdGlvbnNdPVwidGhpcy5ncmlkT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGlvbl09XCInc2luZ2xlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKHJvd1NlbGVjdGVkKT1cInNldFNlbGVjdGVkUm93KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtmcmFtZXdvcmtDb21wb25lbnRzXT1cImZyYW1ld29ya0NvbXBvbmVudHNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyb3dEYXRhXT1cInRhYmJlZEdyaWRMaXN0W3RhYi5uYW1lXVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L2FnLWdyaWQtYW5ndWxhcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9uZ2ItdGFiPlxyXG5cclxuICAgICAgICAgICAgPC9uZ2ItdGFic2V0LS0+XHJcblxyXG4gICAgICAgICAgICA8YWctZ3JpZC1hbmd1bGFyICpuZ0lmPVwidGFiTGlzdC5sZW5ndGggPD0gMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhZy10aGVtZS1iYWxoYW0gZnVsbC13aWR0aCBmbGV4LWdyb3ctMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtaW4taGVpZ2h0OiAyMDBweDsgaGVpZ2h0OiAxMDAlO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyaWRSZWFkeSk9XCJ0aGlzLm9uTWFpbkdyaWRSZWFkeSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZ3JpZE9wdGlvbnNdPVwidGhpcy5ncmlkT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGlvbl09XCInc2luZ2xlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJvd1NlbGVjdGVkKT1cInNldFNlbGVjdGVkUm93KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmcmFtZXdvcmtDb21wb25lbnRzXT1cImZyYW1ld29ya0NvbXBvbmVudHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dEYXRhXT1cImZ1bGxHcmlkTGlzdFwiPlxyXG4gICAgICAgICAgICA8L2FnLWdyaWQtYW5ndWxhcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBib3R0b21TZWN0aW9uIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uXCIgc3R5bGU9XCJoZWlnaHQ6IDgwJTsgd2lkdGg6IDEwMCU7IG92ZXJmbG93OiBhdXRvO1wiPlxyXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogYmxvY2s7XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDI1cHg7IGZvbnQtd2VpZ2h0OiBib2xkXCI+e3tzZWxlY3RlZFJlcG9ydC50aXRsZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG5cIiAqbmdJZj1cInNlbGVjdGVkUmVwb3J0LmhlbHAgJiYgc2VsZWN0ZWRSZXBvcnQuaGVscCAhPSAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuSGVscChjb250ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhciBmYS1xdWVzdGlvbi1jaXJjbGVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSAjcGFyYW1Db250YWluZXI+PC90ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGJsb2NrO1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgY2VudGVyLXJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlICNmb3JtYXRDb250YWluZXI+PC90ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzZWxlY3RlZFJlcG9ydC5uYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUnVuUmVwb3J0KClcIlxyXG4gICAgICAgICAgICAgICAgPlJ1biBSZXBvcnQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3Jlc2l6YWJsZS1zZWN0aW9uLWRpdmlkZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8bmctdGVtcGxhdGUgI2NvbnRlbnQgbGV0LW1vZGFsPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCIgaWQ9XCJoZWxwLW1vZGVsLXRpdGxlXCI+UmVwb3J0IEhlbHA8L2g0PlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKCdDcm9zcyBjbGljaycpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiID5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXJcIiBbaW5uZXJIVE1MXT1cInNlbGVjdGVkUmVwb3J0LmhlbHBcIj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoJ09rIGNsaWNrJylcIj5PSzwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIGAsXHJcbiAgICBzdHlsZXM6IFtgXHJcbiAgICAgIDpob3N0IDo6bmctZGVlcCAubWF0LXRhYi1ib2R5LXdyYXBwZXJ7XHJcbiAgICAgICAgZmxleC1ncm93OiAxO1xyXG4gICAgICB9XHJcblxyXG4gICAgICA6aG9zdCA6Om5nLWRlZXAgLm1hdC10YWItbGFiZWx7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzk4YzdlMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgOmhvc3QgOjpuZy1kZWVwIC5tYXQtdGFiLWxhYmVsLWFjdGl2ZXtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGVmNGZmO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAucmVwb3J0LWRldGFpbHN7XHJcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZVxyXG4gICAgICB9XHJcblxyXG4gICAgICAuY2VudGVyLXJvd3tcclxuICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xyXG4gICAgICAgIG1hcmdpbi1sZWZ0OiA2MHZ3O1xyXG4gICAgICB9XHJcbiAgICBgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmVwb3J0aW5nRnJhbWV3b3JrQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICAgIEBJbnB1dCgpIG1hbmFnZVJlcG9ydFVybDogc3RyaW5nOyAvLyAvYXJ0YWRtaW4vbGVnYWN5L2FwaS9oY2kuYXJ0YWRtaW4uY29udHJvbGxlci5NYW5hZ2VSZXBvcnRzXHJcbiAgICBASW5wdXQoKSBjb21tYW5kUHJlZml4OiBzdHJpbmc7IC8vICAvYXJ0YWRtaW4vbGVnYWN5L2FwaS9qc3BcclxuICAgIEBJbnB1dCgpIGRpY3RBUElMZWFkSW46IHN0cmluZzsgLy8gL2FydGFkbWluL2FwaS9kaWN0aW9uYXJpZXNcclxuICAgIEBJbnB1dCgpIHJlcG9ydHNCeVR5cGU6IHN0cmluZzsgLy9vcHRpb25hbC4gdXN1YWxseSBcImdsb2JhbFwiIG9yIFwicGF0aWVudFwiXHJcblxyXG4gICAgQFZpZXdDaGlsZChcInBhcmFtQ29udGFpbmVyXCIsIHtyZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IGZhbHNlfSkgcGFyYW1Db250YWluZXI6IFZpZXdDb250YWluZXJSZWY7XHJcbiAgICBAVmlld0NoaWxkKFwiZm9ybWF0Q29udGFpbmVyXCIsIHtyZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IGZhbHNlfSkgZm9ybWF0Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xyXG5cclxuICAgIGZ1bGxHcmlkTGlzdDogYW55W10gPSBbXTtcclxuICAgIHRhYmJlZEdyaWRMaXN0OiBhbnkgPSB7fTtcclxuXHJcblxyXG4gICAgZ3JpZE9wdGlvbnMgPSB7XHJcbiAgICAgIHJvd1N0eWxlOiB7XHJcbiAgICAgICAgXCJmb250LWZhbWlseVwiOiBcIlByb21wdCwgc2Fucy1zZXJpZlwiXHJcbiAgICAgIH0sXHJcbiAgICAgIHJvd0hlaWdodDogMjAsXHJcbiAgICAgIGVuYWJsZUNlbGxUZXh0U2VsZWN0aW9uOiB0cnVlLFxyXG4gICAgICBlbnN1cmVEb21PcmRlcjogdHJ1ZVxyXG4gICAgfTsgLy9lbmFibGVDZWxsVGV4dFNlbGVjdGlvbiBzaG91bGQgYmUgY29tYmluZWQgd2l0aCBlbnN1cmVEb21PcmRlclxyXG4gICAgZnJhbWV3b3JrQ29tcG9uZW50czogYW55O1xyXG5cclxuICAgIG1haW5HcmlkQXBpOiBHcmlkQXBpO1xyXG4gICAgdGFiYmVkR3JpZEFwaUxpc3Q6IGFueSA9IHt9OyAvL2EgbWFwIG9mIEdyaWRBUElzIHRvIHRhYiBuYW1lc1xyXG5cclxuICAgIHJlcG9ydExpc3Q6IFJlcG9ydFtdID0gW107XHJcbiAgICB0YWJMaXN0OiBSZXBvcnRUYWJbXSA9IFtdO1xyXG4gICAgdGFiVHlwZU5hbWVMb29rdXA6IGFueSA9IHt9OyAvL2Ega2luZCBvZiBkaWN0IHRoYXQgbWFwcyB0aGUgdGFiIG9yIHR5cGUgdG8gdGhlIHRhYi1uYW1lXHJcblxyXG4gICAgc2VsZWN0ZWRSZXBvcnQ6IFJlcG9ydCA9IG5ldyBSZXBvcnQoKTtcclxuICAgIHNlbGVjdGVkRm9ybWF0OiBzdHJpbmc7XHJcbiAgICBkaXNwbGF5ZWRQYXJhbUNvbXBvbmVudFJlZnM6IENvbXBvbmVudFJlZjxhbnk+W10gPSBbXTtcclxuICAgIGRpc3BsYXllZEZvcm1hdENvbXBvbmVudFJlZnM6IENvbXBvbmVudFJlZjxhbnk+W10gPSBbXTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZSxcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgZGlhbG9nc1NlcnZpY2U6IERpYWxvZ3NTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsKSB7fVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5tYW5hZ2VSZXBvcnRVcmwgIT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5odHRwLmdldCh0aGlzLm1hbmFnZVJlcG9ydFVybCxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IG5ldyBIdHRwUGFyYW1zKCkuc2V0KFwiYWN0aW9uXCIsIFwibG9hZFdpdGhQYXJhbXNcIilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAgICAocmVzcCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3ApO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGlzdCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wVGFiYmVkR3JpZExpc3QgPSB7fTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxpc3QgPSByZXNwW1wicmVwb3J0VGFic1wiXTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCByb3cgb2YgdGFibGlzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFiOiBSZXBvcnRUYWIgPSBuZXcgUmVwb3J0VGFiKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYi5uYW1lID0gcm93Lm5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYi50aXRsZSA9IHJvdy50aXRsZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFiLnR5cGUgPSByb3cudHlwZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFiLnRhYiA9IHJvdy50YWI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYi5kYXRha2V5ID0gcm93LmRhdGFrZXk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucmVwb3J0c0J5VHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJMaXN0LnB1c2godGFiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWIudGFiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJUeXBlTmFtZUxvb2t1cFt0YWIudGFiXSA9IHRhYi5uYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhYi50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJUeXBlTmFtZUxvb2t1cFt0YWIudHlwZV0gPSB0YWIubmFtZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVwb3J0c0J5VHlwZSA9PSB0YWIudHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFiTGlzdC5wdXNoKHRhYik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJUeXBlTmFtZUxvb2t1cFt0YWIudGFiXSA9IHRhYi5uYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFiR3JpZExpc3Q6IGFueVtdID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFiYmVkR3JpZExpc3RbdGFiLm5hbWVdID0gdGFiR3JpZExpc3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBUYWJiZWRHcmlkTGlzdFt0YWIubmFtZV0gPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgbGlzdCA9IHJlc3BbXCJyZXBvcnRMaXN0XCJdO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGxpc3QpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJvdyBvZiBsaXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXBvcnQ6IFJlcG9ydCA9IG5ldyBSZXBvcnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0Lm5hbWUgPSByb3cubmFtZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0LnRpdGxlID0gcm93LnRpdGxlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnQuZGVzY3JpcHRpb24gPSByb3cuZGVzY3JpcHRpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydC5jbGFzc05hbWUgPSByb3cuY2xhc3NOYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnQuZmlsZU5hbWUgPSByb3cuZmlsZU5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydC50eXBlID0gcm93LnR5cGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydC50YWIgPSByb3cudGFiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnQuZGF0YWtleSA9IHJvdy5kYXRha2V5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnQuaGVscCA9IHJvdy5oZWxwO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcmVwb3J0Lm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogcmVwb3J0LnRpdGxlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHJlcG9ydC5kZXNjcmlwdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YWJuYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVwb3J0LnRhYikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibmFtZSA9IHRoaXMudGFiVHlwZU5hbWVMb29rdXBbcmVwb3J0LnRhYl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMucmVwb3J0c0J5VHlwZSAmJiByZXBvcnQudHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibmFtZSA9IHRoaXMudGFiVHlwZU5hbWVMb29rdXBbcmVwb3J0LnR5cGVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFibmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdyaWRsaXN0OiBhbnlbXSA9IHRlbXBUYWJiZWRHcmlkTGlzdFt0YWJuYW1lXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnJlcG9ydHNCeVR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVwb3J0LnR5cGUgPT09IHRoaXMucmVwb3J0c0J5VHlwZSApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZGxpc3QucHVzaChvYmplY3QpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmlkbGlzdC5wdXNoKG9iamVjdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbXMgPSByb3cucGFyYW1zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgcCBvZiBwYXJhbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3UGFyYW06IFBhcmFtID0gbmV3IFBhcmFtKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyYW0uZGljdEFQSUxlYWRJbiA9IHRoaXMuZGljdEFQSUxlYWRJbjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyYW0uY2FwdGlvbiA9IHAuY2FwdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJhbS5uYW1lID0gcC5uYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcmFtLnR5cGUgPSBwLnR5cGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyYW0uY2xhc3NOYW1lID0gcC5jbGFzc05hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyYW0udmFsdWVYUGF0aCA9IHAudmFsdWVYUGF0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJhbS5kaXNwbGF5WFBhdGggPSBwLmRpc3BsYXlYUGF0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJhbS5kaXNwbGF5T3JkZXIgPSBwLmRpc3BsYXlPcmRlcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJhbS5hY3RpdmVPbmx5ID0gcC5hY3RpdmVPbmx5O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3UGFyYW0udmFsdWVYUGF0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJhbS52YWx1ZVhQYXRoID0gbmV3UGFyYW0udmFsdWVYUGF0aC5yZXBsYWNlKFwiQFwiLCBcIlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1BhcmFtLmRpc3BsYXlYUGF0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJhbS5kaXNwbGF5WFBhdGggPSBuZXdQYXJhbS5kaXNwbGF5WFBhdGgucmVwbGFjZShcIkBcIiwgXCJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3B0aW9ucyA9IHAub3B0aW9ucztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbyBvZiBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3T3B0aW9uOiBPcHRpb24gPSBuZXcgT3B0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPcHRpb24udmFsdWUgPSBvLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3T3B0aW9uLmRpc3BsYXkgPSBvLmRpc3BsYXk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPcHRpb24uZGlzcGxheU9yZGVyID0gby5kaXNwbGF5T3JkZXI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyYW0ub3B0aW9ucy5wdXNoKG5ld09wdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydC5wYXJhbXMucHVzaChuZXdQYXJhbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3JtYXRzID0gcm93LmZvcm1hdHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXRzKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZiBvZiBmb3JtYXRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0Zvcm1hdDogRm9ybWF0ID0gbmV3IEZvcm1hdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1hdC5uYW1lID0gZi5uYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1hdC5jYXB0aW9uID0gZi5jYXB0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1hdC5kaXNwbGF5T3JkZXIgPSBmLmRpc3BsYXlPcmRlcjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0LmZvcm1hdHMucHVzaChuZXdGb3JtYXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBvcnRMaXN0LnB1c2gocmVwb3J0KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlcG9ydHNCeVR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlcG9ydC50eXBlID09PSB0aGlzLnJlcG9ydHNCeVR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGlzdC5wdXNoKG9iamVjdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGlzdC5wdXNoKG9iamVjdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnVsbEdyaWRMaXN0ID0gdGVtcGxpc3Quc2xpY2UoKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImdyaWRsaXN0OiBcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5mdWxsR3JpZExpc3QpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IHRhYiBvZiB0aGlzLnRhYkxpc3Qpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmJlZEdyaWRMaXN0W3RhYi5uYW1lXSA9IHRlbXBUYWJiZWRHcmlkTGlzdFt0YWIubmFtZV0uc2xpY2UoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY29sdW1uRGVmKCkgOiBhbnlbXSB7XHJcbiAgICAgIHJldHVybiBbXHJcblxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGZpZWxkOiBcInRpdGxlXCIsXHJcbiAgICAgICAgICBoZWFkZXJOYW1lOiBcIlRpdGxlXCIsXHJcbiAgICAgICAgICB3aWR0aDogMzAwLFxyXG4gICAgICAgICAgc29ydGFibGU6IHRydWUsXHJcbiAgICAgICAgICByZXNpemFibGU6IHRydWUsXHJcbiAgICAgICAgICBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGZpZWxkOiBcImRlc2NyaXB0aW9uXCIsXHJcbiAgICAgICAgICBoZWFkZXJOYW1lOiBcIkRlc2NyaXB0aW9uXCIsXHJcbiAgICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcclxuICAgICAgICAgIHJlc2l6YWJsZTogdHJ1ZSxcclxuICAgICAgICAgIGVkaXRhYmxlOiBmYWxzZX1cclxuICAgICAgXTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgb25NYWluR3JpZFJlYWR5KHBhcmFtcyA6IGFueSkge1xyXG5cclxuICAgICAgdGhpcy5tYWluR3JpZEFwaSA9IHBhcmFtcy5hcGk7XHJcbiAgICAgIHRoaXMubWFpbkdyaWRBcGkuc2V0Q29sdW1uRGVmcyh0aGlzLmNvbHVtbkRlZigpKTtcclxuICAgICAgdGhpcy5tYWluR3JpZEFwaS5zZXRSb3dEYXRhKHRoaXMuZnVsbEdyaWRMaXN0KTtcclxuICAgICAgdGhpcy5tYWluR3JpZEFwaS5zaXplQ29sdW1uc1RvRml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25UYWJiZWRHcmlkUmVhZHkocGFyYW1zIDogYW55LCB0YWJuYW1lOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgIHRoaXMudGFiYmVkR3JpZEFwaUxpc3RbdGFibmFtZV0gPSBwYXJhbXMuYXBpO1xyXG4gICAgICB0aGlzLnRhYmJlZEdyaWRBcGlMaXN0W3RhYm5hbWVdLnNldENvbHVtbkRlZnModGhpcy5jb2x1bW5EZWYoKSk7XHJcbiAgICAgIHRoaXMudGFiYmVkR3JpZEFwaUxpc3RbdGFibmFtZV0uc2V0Um93RGF0YSh0aGlzLnRhYmJlZEdyaWRMaXN0W3RhYm5hbWVdKTtcclxuICAgICAgdGhpcy50YWJiZWRHcmlkQXBpTGlzdFt0YWJuYW1lXS5zaXplQ29sdW1uc1RvRml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0U2VsZWN0ZWRSb3coZXZlbnQpIHtcclxuXHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhldmVudCk7XHJcbiAgICAgICAgaWYoZXZlbnQubm9kZS5zZWxlY3RlZCkge1xyXG4gICAgICAgICAgbGV0IHJlcG9ydE5hbWUgPSBldmVudC5ub2RlLmRhdGEubmFtZTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGV2ZW50Lm5vZGUuZGF0YS5uYW1lKTtcclxuXHJcbiAgICAgICAgICB2YXIgbWF0Y2hlZFJlcG9ydDogUmVwb3J0O1xyXG4gICAgICAgICAgZm9yIChsZXQgciBvZiB0aGlzLnJlcG9ydExpc3QpIHtcclxuICAgICAgICAgICAgaWYgKHIubmFtZSA9PSByZXBvcnROYW1lKSB7XHJcbiAgICAgICAgICAgICAgbWF0Y2hlZFJlcG9ydCA9IHI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAobWF0Y2hlZFJlcG9ydCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSZXBvcnQgPSBtYXRjaGVkUmVwb3J0O1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJlcG9ydCA9IG5ldyBSZXBvcnQoKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZVBhcmFtQ29tcG9uZW50cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVQYXJhbUNvbXBvbmVudHMoKSB7XHJcbiAgICAgICAgaWYodGhpcy5wYXJhbUNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmFtQ29udGFpbmVyLmNsZWFyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHRoaXMuZm9ybWF0Q29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0Q29udGFpbmVyLmNsZWFyKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2Rlc3Ryb3kgcHJldmlvdXMgY29tcG9uZW50cyBhbmQgY2xlYXIgdGhlIGRpc3BsYXllZFJlZiBsaXN0cy4uP1xyXG4gICAgICAgIHRoaXMuZGVzdHJveUNvbXBvbmVudFJlZnMoKTtcclxuICAgICAgICB0aGlzLmRpc3BsYXllZFBhcmFtQ29tcG9uZW50UmVmcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuZGlzcGxheWVkRm9ybWF0Q29tcG9uZW50UmVmcyA9IFtdO1xyXG5cclxuICAgICAgICBmb3IobGV0IHAgb2YgdGhpcy5zZWxlY3RlZFJlcG9ydC5wYXJhbXMpe1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZmFjdG9yeTogQ29tcG9uZW50RmFjdG9yeTxQYXJhbWV0ZXJDb21wb25lbnQ+ID0gdGhpcy5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShQYXJhbWV0ZXJDb21wb25lbnQpO1xyXG4gICAgICAgICAgICB2YXIgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8UGFyYW1ldGVyQ29tcG9uZW50PiA9IHRoaXMucGFyYW1Db250YWluZXIuY3JlYXRlQ29tcG9uZW50KGZhY3RvcnkpO1xyXG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZFBhcmFtQ29tcG9uZW50UmVmcy5wdXNoKGNvbXBvbmVudFJlZik7XHJcblxyXG4gICAgICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2Uuc2V0UGFyYW0ocCk7XHJcblxyXG4gICAgICAgICAgICBpZihwLm9wdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGVudHJpZXM6IGFueVtdID0gW107XHJcbiAgICAgICAgICAgICAgICBmb3IobGV0IG8gb2YgcC5vcHRpb25zKXtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHtpZDogby52YWx1ZSwgZGlzcGxheTogby5kaXNwbGF5fTtcclxuICAgICAgICAgICAgICAgICAgICBlbnRyaWVzLnB1c2goZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UuZW50cmllcyA9IGVudHJpZXM7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZmlyc3Q6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICAgIGZvcihsZXQgZiBvZiB0aGlzLnNlbGVjdGVkUmVwb3J0LmZvcm1hdHMpe1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZmFjdG9yeTI6IENvbXBvbmVudEZhY3Rvcnk8Rm9ybWF0Q29tcG9uZW50PiA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoRm9ybWF0Q29tcG9uZW50KTtcclxuICAgICAgICAgICAgdmFyIGNvbXBvbmVudFJlZjI6IENvbXBvbmVudFJlZjxGb3JtYXRDb21wb25lbnQ+ID0gdGhpcy5mb3JtYXRDb250YWluZXIuY3JlYXRlQ29tcG9uZW50KGZhY3RvcnkyKTtcclxuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRGb3JtYXRDb21wb25lbnRSZWZzLnB1c2goY29tcG9uZW50UmVmMik7XHJcblxyXG4gICAgICAgICAgICBjb21wb25lbnRSZWYyLmluc3RhbmNlLmZvcm1hdCA9IGY7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudFJlZjIuaW5zdGFuY2Uuc2VsZWN0ZWRWYWx1ZUNoYW5nZS5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAgICAocykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGb3JtYXQgPSBzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZihmaXJzdCkgey8vc2VsZWN0IHRoZSBmaXJzdCBmb3JtYXQgaW4gdGhlIGdyb3VwaW5nXHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRSZWYyLmluc3RhbmNlLnNlbGVjdGVkVmFsdWUgPSBmLm5hbWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRm9ybWF0ID0gZi5uYW1lO1xyXG4gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIG9wZW5IZWxwKGNvbnRlbnQpIHtcclxuXHJcbiAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbihjb250ZW50LCB7YXJpYUxhYmVsbGVkQnk6IFwiaGVscC1tb2RhbC10aXRsZVwifSlcclxuICAgICAgICAgICAgLnJlc3VsdC50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgLy8gdGhpcy5jbG9zZVJlc3VsdCA9IGBDbG9zZWQgd2l0aDogJHtyZXN1bHR9YDtcclxuICAgICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcclxuXHJcbiAgICAgICAgfSwgKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgICB2YXIgY2xvc2VSZXN1bHQgPSBgRGlzbWlzc2VkICR7dGhpcy5nZXREaXNtaXNzUmVhc29uKHJlYXNvbil9YDtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coY2xvc2VSZXN1bHQpO1xyXG5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXREaXNtaXNzUmVhc29uKHJlYXNvbjogYW55KTogc3RyaW5nIHtcclxuICAgICAgICBpZiAocmVhc29uID09PSBNb2RhbERpc21pc3NSZWFzb25zLkVTQykge1xyXG4gICAgICAgICAgICByZXR1cm4gXCJieSBwcmVzc2luZyBFU0NcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKHJlYXNvbiA9PT0gTW9kYWxEaXNtaXNzUmVhc29ucy5CQUNLRFJPUF9DTElDSykge1xyXG4gICAgICAgICAgICByZXR1cm4gXCJieSBjbGlja2luZyBvbiBhIGJhY2tkcm9wXCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuICBgd2l0aDogJHtyZWFzb259YDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25SdW5SZXBvcnQoKSB7XHJcblxyXG4gICAgICAgIGlmKHRoaXMuc2VsZWN0ZWRSZXBvcnQpIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nc1NlcnZpY2Uuc3RhcnREZWZhdWx0U3Bpbm5lckRpYWxvZygpO1xyXG5cclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJmb3JtYXQ6XCIgKyB0aGlzLnNlbGVjdGVkRm9ybWF0KTtcclxuICAgICAgICAgICAgaWYoIXRoaXMuc2VsZWN0ZWRGb3JtYXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGb3JtYXQgPSBcImh0bWxcIjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHJ1blBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICAgICAgICAgIHJ1blBhcmFtcyA9IHJ1blBhcmFtcy5hcHBlbmQoXCJmb3JtYXRcIiwgdGhpcy5zZWxlY3RlZEZvcm1hdCk7XHJcbiAgICAgICAgICAgIHJ1blBhcmFtcyA9IHJ1blBhcmFtcy5hcHBlbmQoXCJhY3Rpb25cIiwgXCJzaG93XCIpO1xyXG4gICAgICAgICAgICBydW5QYXJhbXMgPSBydW5QYXJhbXMuYXBwZW5kKFwicmVwb3J0TmFtZVwiLCB0aGlzLnNlbGVjdGVkUmVwb3J0Lm5hbWUpO1xyXG5cclxuICAgICAgICAgICAgcnVuUGFyYW1zID0gdGhpcy5nZXRSdW5QYXJhbWV0ZXJzKHJ1blBhcmFtcyk7XHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhydW5QYXJhbXMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5odHRwLmdldCh0aGlzLmNvbW1hbmRQcmVmaXggKyB0aGlzLnNlbGVjdGVkUmVwb3J0LmNsYXNzTmFtZSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHJ1blBhcmFtcyxcclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApLnN1YnNjcmliZShcclxuICAgICAgICAgICAgICAgIChyZXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZW5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5zZWxlY3RlZEZvcm1hdCAhPSBcImh0bWxcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IHJlcy5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikuc3BsaXQoXCI7XCIpWzFdLnNwbGl0KFwiPVwiKVsxXS5yZXBsYWNlKC9cXFwiL2csIFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtyZXMuYm9keV0sIHt0eXBlOiByZXMuYm9keS50eXBlfSApOyAvLywge3R5cGU6IFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsXCJ9XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVVUkwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhmaWxlVVJMKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYTogSFRNTEFuY2hvckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKSBhcyBIVE1MQW5jaG9yRWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICBhLmhyZWYgPSBmaWxlVVJMO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuc2VsZWN0ZWRGb3JtYXQgPT0gXCJodG1sXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYS50YXJnZXQgPSBcIl9ibGFua1wiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYS5kb3dubG9hZCA9IGZpbGVuYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcclxuICAgICAgICAgICAgICAgICAgICBhLmNsaWNrKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChmaWxlVVJMKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWFsb2dzU2VydmljZS5zdG9wQWxsU3Bpbm5lckRpYWxvZ3MoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UnVuUGFyYW1ldGVycyhydW5QYXJhbXM6IEh0dHBQYXJhbXMpOiBIdHRwUGFyYW1zIHtcclxuICAgICAgICB2YXIgbmV3UGFyYW1zID0gcnVuUGFyYW1zO1xyXG5cclxuICAgICAgICBmb3IobGV0IG8gb2YgdGhpcy5kaXNwbGF5ZWRQYXJhbUNvbXBvbmVudFJlZnMpe1xyXG4gICAgICAgICAgICB2YXIgcGFyYW0gPSBvLmluc3RhbmNlLnBhcmFtO1xyXG5cclxuICAgICAgICAgICAgaWYocGFyYW0udHlwZSA9PSBcIm11bHRpc2VsZWN0XCIpIHtcclxuICAgICAgICAgICAgICAgIHZhciByZXNMaXN0ID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgdiBvZiBwYXJhbS5zZWxlY3RlZFZhbHVlTGlzdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYocmVzTGlzdCAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc0xpc3QgKz0gXCIsXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJlc0xpc3QgKz0gdjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG5ld1BhcmFtcyA9IG5ld1BhcmFtcy5hcHBlbmQocGFyYW0ubmFtZSwgcmVzTGlzdCk7XHJcbiAgICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIGlmKHBhcmFtLnNlbGVjdGVkVmFsdWUpIHsgLy9zbyB3ZSBkb24ndCBnZXQgXCJ1bmRlZmluZWRcIiBzZW50IGJhY2tcclxuICAgICAgICAgICAgICAgICAgICBpZihwYXJhbS50eXBlID09IFwiZGF0ZVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5nZXREYXRlU3RyaW5nKHBhcmFtLnNlbGVjdGVkVmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJhbS5zZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBuZXdQYXJhbXMgPSBuZXdQYXJhbXMuYXBwZW5kKHBhcmFtLm5hbWUsIHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3UGFyYW1zO1xyXG4gICAgfVxyXG5cclxuICAgIGdldERhdGVTdHJpbmcoZGF0ZTogYW55KTogc3RyaW5nIHtcclxuXHJcbiAgICAgICAgaWYgKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgICAgIGlmICghaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZGF0ZSwgXCJNTS9kZC95eXl5XCIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZSBpZihtb21lbnQuaXNNb21lbnQoZGF0ZSkgKSB7XHJcbiAgICAgICAgICAgIGlmKGRhdGUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUuZm9ybWF0KFwiTS9EL1lZWVlcIik7XHJcbiAgICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2UgaWYodHlwZW9mIGRhdGUgPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0ZTtcclxuICAgICAgICB9ZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkZXN0cm95Q29tcG9uZW50UmVmcygpIHtcclxuICAgICAgZm9yKGxldCBvIG9mIHRoaXMuZGlzcGxheWVkUGFyYW1Db21wb25lbnRSZWZzKXtcclxuICAgICAgICBvLmRlc3Ryb3koKTtcclxuICAgICAgfVxyXG4gICAgICBmb3IobGV0IG8gb2YgdGhpcy5kaXNwbGF5ZWRGb3JtYXRDb21wb25lbnRSZWZzKXtcclxuICAgICAgICBvLmRlc3Ryb3koKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGVzdHJveUNvbXBvbmVudFJlZnMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgc3R5bGVzOiBbYFxyXG4gICAgICAucmVwb3J0LWRldGFpbHN7XHJcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZVxyXG4gICAgICB9XHJcblxyXG4gICAgICAuY2VudGVyLXJvd3tcclxuICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xyXG4gICAgICAgIG1hcmdpbi1sZWZ0OiA2MHZ3O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAubWF0LXRhYi1ib2R5LXdyYXBwZXJ7XHJcbiAgICBmbGV4LWdyb3c6IDE7XHJcbiAgfVxyXG5cclxuLnRhYi1wYW5le1xyXG4gIGhlaWdodDogMTAwJTtcclxufVxyXG5gXSovXHJcbn1cclxuIl19
|
|
611
|
+
`, styles: [":host ::ng-deep .mat-tab-body-wrapper{flex-grow:1}:host ::ng-deep .mat-tab-label{background-color:#98c7e0}:host ::ng-deep .mat-tab-label-active{background-color:#def4ff}.report-details{height:100%;width:100%;position:absolute}.center-row{margin-top:10px;margin-left:60vw}\n"] }]
|
|
612
|
+
}], ctorParameters: () => [{ type: i1.HttpClient }, { type: i0.ComponentFactoryResolver }, { type: i2.DatePipe }, { type: i3.DialogsService }, { type: i4.NgbModal }], propDecorators: { manageReportUrl: [{
|
|
613
|
+
type: Input
|
|
614
|
+
}], commandPrefix: [{
|
|
615
|
+
type: Input
|
|
616
|
+
}], dictAPILeadIn: [{
|
|
617
|
+
type: Input
|
|
618
|
+
}], reportsByType: [{
|
|
619
|
+
type: Input
|
|
620
|
+
}], paramContainer: [{
|
|
621
|
+
type: ViewChild,
|
|
622
|
+
args: ["paramContainer", { read: ViewContainerRef, static: false }]
|
|
623
|
+
}], formatContainer: [{
|
|
624
|
+
type: ViewChild,
|
|
625
|
+
args: ["formatContainer", { read: ViewContainerRef, static: false }]
|
|
626
|
+
}] } });
|
|
627
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0aW5nLWZyYW1ld29yay5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9yZXBvcnRpbmctZnJhbWV3b3JrL3NyYy9yZXBvcnRpbmctZnJhbWV3b3JrLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULHdCQUF3QixFQUN4QixLQUFLLEVBRUwsU0FBUyxFQUNULGdCQUFnQixFQUNuQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsVUFBVSxFQUFFLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzVELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM1QyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDMUMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDbkUsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDNUMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUMsbUJBQW1CLEVBQUUsUUFBUSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDekUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7Ozs7QUFxSXpELE1BQU0sT0FBTywyQkFBMkI7SUFvQ3BDLFlBQW9CLElBQWdCLEVBQ2hCLFFBQWtDLEVBQ2xDLFFBQWtCLEVBQ2xCLGNBQThCLEVBQzlCLFlBQXNC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clxuICAgIENvbXBvbmVudCwgQ29tcG9uZW50RmFjdG9yeSxcclxuICAgIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgQ29tcG9uZW50UmVmLFxyXG4gICAgSW5wdXQsIE9uRGVzdHJveSxcclxuICAgIE9uSW5pdCxcclxuICAgIFZpZXdDaGlsZCxcclxuICAgIFZpZXdDb250YWluZXJSZWZcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0h0dHBDbGllbnQsIEh0dHBQYXJhbXN9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQge1JlcG9ydH0gZnJvbSBcIi4vbW9kZWwvcmVwb3J0Lm1vZGVsXCI7XHJcbmltcG9ydCB7UGFyYW19IGZyb20gXCIuL21vZGVsL3BhcmFtLm1vZGVsXCI7XHJcbmltcG9ydCB7UGFyYW1ldGVyQ29tcG9uZW50fSBmcm9tIFwiLi9wYXJhbWV0ZXIvcGFyYW1ldGVyLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge09wdGlvbn0gZnJvbSBcIi4vbW9kZWwvb3B0aW9uLm1vZGVsXCI7XHJcbmltcG9ydCB7UmVwb3J0VGFifSBmcm9tIFwiLi9tb2RlbC9yZXBvcnQtdGFiLm1vZGVsXCI7XHJcbmltcG9ydCB7Rm9ybWF0fSBmcm9tIFwiLi9tb2RlbC9mb3JtYXQubW9kZWxcIjtcclxuaW1wb3J0IHtGb3JtYXRDb21wb25lbnR9IGZyb20gXCIuL2Zvcm1hdC9mb3JtYXQuY29tcG9uZW50XCI7XHJcbmltcG9ydCAqIGFzIG1vbWVudCBmcm9tIFwibW9tZW50XCI7XHJcbmltcG9ydCB7RGF0ZVBpcGV9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHtNb2RhbERpc21pc3NSZWFzb25zLCBOZ2JNb2RhbH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcbmltcG9ydCB7RGlhbG9nc1NlcnZpY2V9IGZyb20gXCIuL3NwaW5uZXIvZGlhbG9ncy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEdyaWRBcGkgfSBmcm9tIFwiYWctZ3JpZC1jb21tdW5pdHlcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6IFwiaGNpLXJlcG9ydGluZy1mcmFtZXdvcmtcIixcclxuICAgIHRlbXBsYXRlOiBgXHJcbiAgICAgIDxkaXYgc3R5bGU9XCJoZWlnaHQ6IDEwMHZoXCI+XHJcbiAgICAgICAgPHJlc2l6YWJsZS1zZWN0aW9uLWRpdmlkZXIgY2xhc3M9XCJmbGV4LWdyb3ctMVwiIFtpc1ZlcnRpY2FsTGF5b3V0XT1cInRydWVcIj5cclxuICAgICAgICAgIDxkaXYgdG9wU2VjdGlvbiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtblwiIHN0eWxlPVwiaGVpZ2h0OiAxMDAlOyB3aWR0aDogMTAwJTsgb3ZlcmZsb3c6IGF1dG87XCI+XHJcbiAgICAgICAgICAgIDwhLS1jYW4gd3JhcCBqdXN0IHRoZSBncmlkIHdpdGggdGhlIHRhYnMtLT5cclxuICAgICAgICAgICAgPG1hdC10YWItZ3JvdXAgKm5nSWY9XCJ0YWJMaXN0Lmxlbmd0aCA+IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC10YWIgKm5nRm9yPVwibGV0IHRhYiBvZiB0YWJMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICBsYWJlbD1cInt7dGFiLnRpdGxlfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBtYXRUYWJDb250ZW50PlxyXG4gICAgICAgICAgICAgICAgICA8YWctZ3JpZC1hbmd1bGFyXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhZy10aGVtZS1iYWxoYW0gZnVsbC13aWR0aCBmbGV4LWdyb3ctMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtaW4taGVpZ2h0OiAyMDBweDsgaGVpZ2h0OiAxMDAlO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKGdyaWRSZWFkeSk9XCJ0aGlzLm9uVGFiYmVkR3JpZFJlYWR5KCRldmVudCwgdGFiLm5hbWUpXCJcclxuICAgICAgICAgICAgICAgICAgICBbZ3JpZE9wdGlvbnNdPVwidGhpcy5ncmlkT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGlvbl09XCInc2luZ2xlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKHJvd1NlbGVjdGVkKT1cInNldFNlbGVjdGVkUm93KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtmcmFtZXdvcmtDb21wb25lbnRzXT1cImZyYW1ld29ya0NvbXBvbmVudHNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyb3dEYXRhXT1cInRhYmJlZEdyaWRMaXN0W3RhYi5uYW1lXVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L2FnLWdyaWQtYW5ndWxhcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9tYXQtdGFiPlxyXG4gICAgICAgICAgICA8L21hdC10YWItZ3JvdXA+XHJcblxyXG4gICAgICAgICAgICA8IS0tbmdiLXRhYnNldCAqbmdJZj1cInRhYkxpc3QubGVuZ3RoID4gMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lPbkhpZGU9XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0YWJzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4LWdyb3ctMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICNyZXBvcnRUYWJTZXQ9XCJuZ2JUYWJzZXRcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPG5nYi10YWIgKm5nRm9yPVwibGV0IHRhYiBvZiB0YWJMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICBpZD1cInt7dGFiLm5hbWV9fVwiIHRpdGxlPVwie3t0YWIudGl0bGV9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJib3JkZXI6IDVweCBzb2xpZDtcIiA+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbmdiVGFiQ29udGVudCA+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8YWctZ3JpZC1hbmd1bGFyXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhZy10aGVtZS1iYWxoYW0gZnVsbC13aWR0aCBmbGV4LWdyb3ctMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtaW4taGVpZ2h0OiAyMDBweDsgaGVpZ2h0OiAxMDAlO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKGdyaWRSZWFkeSk9XCJ0aGlzLm9uVGFiYmVkR3JpZFJlYWR5KCRldmVudCwgdGFiLm5hbWUpXCJcclxuICAgICAgICAgICAgICAgICAgICBbZ3JpZE9wdGlvbnNdPVwidGhpcy5ncmlkT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGlvbl09XCInc2luZ2xlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgKHJvd1NlbGVjdGVkKT1cInNldFNlbGVjdGVkUm93KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtmcmFtZXdvcmtDb21wb25lbnRzXT1cImZyYW1ld29ya0NvbXBvbmVudHNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyb3dEYXRhXT1cInRhYmJlZEdyaWRMaXN0W3RhYi5uYW1lXVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L2FnLWdyaWQtYW5ndWxhcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgPC9uZ2ItdGFiPlxyXG5cclxuICAgICAgICAgICAgPC9uZ2ItdGFic2V0LS0+XHJcblxyXG4gICAgICAgICAgICA8YWctZ3JpZC1hbmd1bGFyICpuZ0lmPVwidGFiTGlzdC5sZW5ndGggPD0gMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhZy10aGVtZS1iYWxoYW0gZnVsbC13aWR0aCBmbGV4LWdyb3ctMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtaW4taGVpZ2h0OiAyMDBweDsgaGVpZ2h0OiAxMDAlO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyaWRSZWFkeSk9XCJ0aGlzLm9uTWFpbkdyaWRSZWFkeSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZ3JpZE9wdGlvbnNdPVwidGhpcy5ncmlkT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd1NlbGVjdGlvbl09XCInc2luZ2xlJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJvd1NlbGVjdGVkKT1cInNldFNlbGVjdGVkUm93KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmcmFtZXdvcmtDb21wb25lbnRzXT1cImZyYW1ld29ya0NvbXBvbmVudHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3dEYXRhXT1cImZ1bGxHcmlkTGlzdFwiPlxyXG4gICAgICAgICAgICA8L2FnLWdyaWQtYW5ndWxhcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBib3R0b21TZWN0aW9uIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uXCIgc3R5bGU9XCJoZWlnaHQ6IDgwJTsgd2lkdGg6IDEwMCU7IG92ZXJmbG93OiBhdXRvO1wiPlxyXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogYmxvY2s7XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDI1cHg7IGZvbnQtd2VpZ2h0OiBib2xkXCI+e3tzZWxlY3RlZFJlcG9ydC50aXRsZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG5cIiAqbmdJZj1cInNlbGVjdGVkUmVwb3J0LmhlbHAgJiYgc2VsZWN0ZWRSZXBvcnQuaGVscCAhPSAnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuSGVscChjb250ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhciBmYS1xdWVzdGlvbi1jaXJjbGVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDx0ZW1wbGF0ZSAjcGFyYW1Db250YWluZXI+PC90ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGJsb2NrO1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgY2VudGVyLXJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPHRlbXBsYXRlICNmb3JtYXRDb250YWluZXI+PC90ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJzZWxlY3RlZFJlcG9ydC5uYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUnVuUmVwb3J0KClcIlxyXG4gICAgICAgICAgICAgICAgPlJ1biBSZXBvcnQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3Jlc2l6YWJsZS1zZWN0aW9uLWRpdmlkZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8bmctdGVtcGxhdGUgI2NvbnRlbnQgbGV0LW1vZGFsPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCIgaWQ9XCJoZWxwLW1vZGVsLXRpdGxlXCI+UmVwb3J0IEhlbHA8L2g0PlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKCdDcm9zcyBjbGljaycpXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiID5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXJcIiBbaW5uZXJIVE1MXT1cInNlbGVjdGVkUmVwb3J0LmhlbHBcIj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoJ09rIGNsaWNrJylcIj5PSzwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIGAsXHJcbiAgICBzdHlsZXM6IFtgXHJcbiAgICAgIDpob3N0IDo6bmctZGVlcCAubWF0LXRhYi1ib2R5LXdyYXBwZXJ7XHJcbiAgICAgICAgZmxleC1ncm93OiAxO1xyXG4gICAgICB9XHJcblxyXG4gICAgICA6aG9zdCA6Om5nLWRlZXAgLm1hdC10YWItbGFiZWx7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzk4YzdlMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgOmhvc3QgOjpuZy1kZWVwIC5tYXQtdGFiLWxhYmVsLWFjdGl2ZXtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGVmNGZmO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAucmVwb3J0LWRldGFpbHN7XHJcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZVxyXG4gICAgICB9XHJcblxyXG4gICAgICAuY2VudGVyLXJvd3tcclxuICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xyXG4gICAgICAgIG1hcmdpbi1sZWZ0OiA2MHZ3O1xyXG4gICAgICB9XHJcbiAgICBgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmVwb3J0aW5nRnJhbWV3b3JrQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICAgIEBJbnB1dCgpIG1hbmFnZVJlcG9ydFVybDogc3RyaW5nOyAvLyAvYXJ0YWRtaW4vbGVnYWN5L2FwaS9oY2kuYXJ0YWRtaW4uY29udHJvbGxlci5NYW5hZ2VSZXBvcnRzXHJcbiAgICBASW5wdXQoKSBjb21tYW5kUHJlZml4OiBzdHJpbmc7IC8vICAvYXJ0YWRtaW4vbGVnYWN5L2FwaS9qc3BcclxuICAgIEBJbnB1dCgpIGRpY3RBUElMZWFkSW46IHN0cmluZzsgLy8gL2FydGFkbWluL2FwaS9kaWN0aW9uYXJpZXNcclxuICAgIEBJbnB1dCgpIHJlcG9ydHNCeVR5cGU6IHN0cmluZzsgLy9vcHRpb25hbC4gdXN1YWxseSBcImdsb2JhbFwiIG9yIFwicGF0aWVudFwiXHJcblxyXG4gICAgQFZpZXdDaGlsZChcInBhcmFtQ29udGFpbmVyXCIsIHtyZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IGZhbHNlfSkgcGFyYW1Db250YWluZXI6IFZpZXdDb250YWluZXJSZWY7XHJcbiAgICBAVmlld0NoaWxkKFwiZm9ybWF0Q29udGFpbmVyXCIsIHtyZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IGZhbHNlfSkgZm9ybWF0Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xyXG5cclxuICAgIGZ1bGxHcmlkTGlzdDogYW55W10gPSBbXTtcclxuICAgIHRhYmJlZEdyaWRMaXN0OiBhbnkgPSB7fTtcclxuXHJcblxyXG4gICAgZ3JpZE9wdGlvbnMgPSB7XHJcbiAgICAgIHJvd1N0eWxlOiB7XHJcbiAgICAgICAgXCJmb250LWZhbWlseVwiOiBcIlByb21wdCwgc2Fucy1zZXJpZlwiXHJcbiAgICAgIH0sXHJcbiAgICAgIHJvd0hlaWdodDogMjAsXHJcbiAgICAgIGVuYWJsZUNlbGxUZXh0U2VsZWN0aW9uOiB0cnVlLFxyXG4gICAgICBlbnN1cmVEb21PcmRlcjogdHJ1ZVxyXG4gICAgfTsgLy9lbmFibGVDZWxsVGV4dFNlbGVjdGlvbiBzaG91bGQgYmUgY29tYmluZWQgd2l0aCBlbnN1cmVEb21PcmRlclxyXG4gICAgZnJhbWV3b3JrQ29tcG9uZW50czogYW55O1xyXG5cclxuICAgIG1haW5HcmlkQXBpOiBHcmlkQXBpO1xyXG4gICAgdGFiYmVkR3JpZEFwaUxpc3Q6IGFueSA9IHt9OyAvL2EgbWFwIG9mIEdyaWRBUElzIHRvIHRhYiBuYW1lc1xyXG5cclxuICAgIHJlcG9ydExpc3Q6IFJlcG9ydFtdID0gW107XHJcbiAgICB0YWJMaXN0OiBSZXBvcnRUYWJbXSA9IFtdO1xyXG4gICAgdGFiVHlwZU5hbWVMb29rdXA6IGFueSA9IHt9OyAvL2Ega2luZCBvZiBkaWN0IHRoYXQgbWFwcyB0aGUgdGFiIG9yIHR5cGUgdG8gdGhlIHRhYi1uYW1lXHJcblxyXG4gICAgc2VsZWN0ZWRSZXBvcnQ6IFJlcG9ydCA9IG5ldyBSZXBvcnQoKTtcclxuICAgIHNlbGVjdGVkRm9ybWF0OiBzdHJpbmc7XHJcbiAgICBkaXNwbGF5ZWRQYXJhbUNvbXBvbmVudFJlZnM6IENvbXBvbmVudFJlZjxhbnk+W10gPSBbXTtcclxuICAgIGRpc3BsYXllZEZvcm1hdENvbXBvbmVudFJlZnM6IENvbXBvbmVudFJlZjxhbnk+W10gPSBbXTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZSxcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgZGlhbG9nc1NlcnZpY2U6IERpYWxvZ3NTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsKSB7fVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5tYW5hZ2VSZXBvcnRVcmwgIT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgdGhpcy5odHRwLmdldCh0aGlzLm1hbmFnZVJlcG9ydFVybCxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IG5ldyBIdHRwUGFyYW1zKCkuc2V0KFwiYWN0aW9uXCIsIFwibG9hZFdpdGhQYXJhbXNcIilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAgICAocmVzcCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3ApO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wbGlzdCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wVGFiYmVkR3JpZExpc3QgPSB7fTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRhYmxpc3QgPSByZXNwW1wicmVwb3J0VGFic1wiXTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCByb3cgb2YgdGFibGlzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFiOiBSZXBvcnRUYWIgPSBuZXcgUmVwb3J0VGFiKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYi5uYW1lID0gcm93Lm5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYi50aXRsZSA9IHJvdy50aXRsZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFiLnR5cGUgPSByb3cudHlwZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFiLnRhYiA9IHJvdy50YWI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYi5kYXRha2V5ID0gcm93LmRhdGFrZXk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMucmVwb3J0c0J5VHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJMaXN0LnB1c2godGFiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWIudGFiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJUeXBlTmFtZUxvb2t1cFt0YWIudGFiXSA9IHRhYi5uYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhYi50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJUeXBlTmFtZUxvb2t1cFt0YWIudHlwZV0gPSB0YWIubmFtZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVwb3J0c0J5VHlwZSA9PSB0YWIudHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFiTGlzdC5wdXNoKHRhYik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJUeXBlTmFtZUxvb2t1cFt0YWIudGFiXSA9IHRhYi5uYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFiR3JpZExpc3Q6IGFueVtdID0gW107XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFiYmVkR3JpZExpc3RbdGFiLm5hbWVdID0gdGFiR3JpZExpc3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBUYWJiZWRHcmlkTGlzdFt0YWIubmFtZV0gPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgbGlzdCA9IHJlc3BbXCJyZXBvcnRMaXN0XCJdO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGxpc3QpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJvdyBvZiBsaXN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXBvcnQ6IFJlcG9ydCA9IG5ldyBSZXBvcnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0Lm5hbWUgPSByb3cubmFtZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0LnRpdGxlID0gcm93LnRpdGxlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnQuZGVzY3JpcHRpb24gPSByb3cuZGVzY3JpcHRpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydC5jbGFzc05hbWUgPSByb3cuY2xhc3NOYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnQuZmlsZU5hbWUgPSByb3cuZmlsZU5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydC50eXBlID0gcm93LnR5cGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydC50YWIgPSByb3cudGFiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnQuZGF0YWtleSA9IHJvdy5kYXRha2V5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnQuaGVscCA9IHJvdy5oZWxwO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcmVwb3J0Lm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogcmVwb3J0LnRpdGxlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHJlcG9ydC5kZXNjcmlwdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YWJuYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVwb3J0LnRhYikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibmFtZSA9IHRoaXMudGFiVHlwZU5hbWVMb29rdXBbcmVwb3J0LnRhYl07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMucmVwb3J0c0J5VHlwZSAmJiByZXBvcnQudHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibmFtZSA9IHRoaXMudGFiVHlwZU5hbWVMb29rdXBbcmVwb3J0LnR5cGVdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFibmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdyaWRsaXN0OiBhbnlbXSA9IHRlbXBUYWJiZWRHcmlkTGlzdFt0YWJuYW1lXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnJlcG9ydHNCeVR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVwb3J0LnR5cGUgPT09IHRoaXMucmVwb3J0c0J5VHlwZSApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JpZGxpc3QucHVzaChvYmplY3QpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmlkbGlzdC5wdXNoKG9iamVjdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbXMgPSByb3cucGFyYW1zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgcCBvZiBwYXJhbXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3UGFyYW06IFBhcmFtID0gbmV3IFBhcmFtKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyYW0uZGljdEFQSUxlYWRJbiA9IHRoaXMuZGljdEFQSUxlYWRJbjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyYW0uY2FwdGlvbiA9IHAuY2FwdGlvbjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJhbS5uYW1lID0gcC5uYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhcmFtLnR5cGUgPSBwLnR5cGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyYW0uY2xhc3NOYW1lID0gcC5jbGFzc05hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyYW0udmFsdWVYUGF0aCA9IHAudmFsdWVYUGF0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJhbS5kaXNwbGF5WFBhdGggPSBwLmRpc3BsYXlYUGF0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJhbS5kaXNwbGF5T3JkZXIgPSBwLmRpc3BsYXlPcmRlcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJhbS5hY3RpdmVPbmx5ID0gcC5hY3RpdmVPbmx5O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3UGFyYW0udmFsdWVYUGF0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJhbS52YWx1ZVhQYXRoID0gbmV3UGFyYW0udmFsdWVYUGF0aC5yZXBsYWNlKFwiQFwiLCBcIlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1BhcmFtLmRpc3BsYXlYUGF0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXJhbS5kaXNwbGF5WFBhdGggPSBuZXdQYXJhbS5kaXNwbGF5WFBhdGgucmVwbGFjZShcIkBcIiwgXCJcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3B0aW9ucyA9IHAub3B0aW9ucztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbyBvZiBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3T3B0aW9uOiBPcHRpb24gPSBuZXcgT3B0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPcHRpb24udmFsdWUgPSBvLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3T3B0aW9uLmRpc3BsYXkgPSBvLmRpc3BsYXk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPcHRpb24uZGlzcGxheU9yZGVyID0gby5kaXNwbGF5T3JkZXI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFyYW0ub3B0aW9ucy5wdXNoKG5ld09wdGlvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydC5wYXJhbXMucHVzaChuZXdQYXJhbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3JtYXRzID0gcm93LmZvcm1hdHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXRzKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZiBvZiBmb3JtYXRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0Zvcm1hdDogRm9ybWF0ID0gbmV3IEZvcm1hdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1hdC5uYW1lID0gZi5uYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1hdC5jYXB0aW9uID0gZi5jYXB0aW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1hdC5kaXNwbGF5T3JkZXIgPSBmLmRpc3BsYXlPcmRlcjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0LmZvcm1hdHMucHVzaChuZXdGb3JtYXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBvcnRMaXN0LnB1c2gocmVwb3J0KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlcG9ydHNCeVR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlcG9ydC50eXBlID09PSB0aGlzLnJlcG9ydHNCeVR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGlzdC5wdXNoKG9iamVjdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGlzdC5wdXNoKG9iamVjdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnVsbEdyaWRMaXN0ID0gdGVtcGxpc3Quc2xpY2UoKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImdyaWRsaXN0OiBcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5mdWxsR3JpZExpc3QpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IHRhYiBvZiB0aGlzLnRhYkxpc3Qpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmJlZEdyaWRMaXN0W3RhYi5uYW1lXSA9IHRlbXBUYWJiZWRHcmlkTGlzdFt0YWIubmFtZV0uc2xpY2UoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY29sdW1uRGVmKCkgOiBhbnlbXSB7XHJcbiAgICAgIHJldHVybiBbXHJcblxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGZpZWxkOiBcInRpdGxlXCIsXHJcbiAgICAgICAgICBoZWFkZXJOYW1lOiBcIlRpdGxlXCIsXHJcbiAgICAgICAgICB3aWR0aDogMzAwLFxyXG4gICAgICAgICAgc29ydGFibGU6IHRydWUsXHJcbiAgICAgICAgICByZXNpemFibGU6IHRydWUsXHJcbiAgICAgICAgICBlZGl0YWJsZTogZmFsc2V9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGZpZWxkOiBcImRlc2NyaXB0aW9uXCIsXHJcbiAgICAgICAgICBoZWFkZXJOYW1lOiBcIkRlc2NyaXB0aW9uXCIsXHJcbiAgICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcclxuICAgICAgICAgIHJlc2l6YWJsZTogdHJ1ZSxcclxuICAgICAgICAgIGVkaXRhYmxlOiBmYWxzZX1cclxuICAgICAgXTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgb25NYWluR3JpZFJlYWR5KHBhcmFtcyA6IGFueSkge1xyXG5cclxuICAgICAgdGhpcy5tYWluR3JpZEFwaSA9IHBhcmFtcy5hcGk7XHJcbiAgICAgIHRoaXMubWFpbkdyaWRBcGkuc2V0Q29sdW1uRGVmcyh0aGlzLmNvbHVtbkRlZigpKTtcclxuICAgICAgdGhpcy5tYWluR3JpZEFwaS5zZXRSb3dEYXRhKHRoaXMuZnVsbEdyaWRMaXN0KTtcclxuICAgICAgdGhpcy5tYWluR3JpZEFwaS5zaXplQ29sdW1uc1RvRml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25UYWJiZWRHcmlkUmVhZHkocGFyYW1zIDogYW55LCB0YWJuYW1lOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgIHRoaXMudGFiYmVkR3JpZEFwaUxpc3RbdGFibmFtZV0gPSBwYXJhbXMuYXBpO1xyXG4gICAgICB0aGlzLnRhYmJlZEdyaWRBcGlMaXN0W3RhYm5hbWVdLnNldENvbHVtbkRlZnModGhpcy5jb2x1bW5EZWYoKSk7XHJcbiAgICAgIHRoaXMudGFiYmVkR3JpZEFwaUxpc3RbdGFibmFtZV0uc2V0Um93RGF0YSh0aGlzLnRhYmJlZEdyaWRMaXN0W3RhYm5hbWVdKTtcclxuICAgICAgdGhpcy50YWJiZWRHcmlkQXBpTGlzdFt0YWJuYW1lXS5zaXplQ29sdW1uc1RvRml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0U2VsZWN0ZWRSb3coZXZlbnQpIHtcclxuXHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhldmVudCk7XHJcbiAgICAgICAgaWYoZXZlbnQubm9kZS5zZWxlY3RlZCkge1xyXG4gICAgICAgICAgbGV0IHJlcG9ydE5hbWUgPSBldmVudC5ub2RlLmRhdGEubmFtZTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGV2ZW50Lm5vZGUuZGF0YS5uYW1lKTtcclxuXHJcbiAgICAgICAgICB2YXIgbWF0Y2hlZFJlcG9ydDogUmVwb3J0O1xyXG4gICAgICAgICAgZm9yIChsZXQgciBvZiB0aGlzLnJlcG9ydExpc3QpIHtcclxuICAgICAgICAgICAgaWYgKHIubmFtZSA9PSByZXBvcnROYW1lKSB7XHJcbiAgICAgICAgICAgICAgbWF0Y2hlZFJlcG9ydCA9IHI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAobWF0Y2hlZFJlcG9ydCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSZXBvcnQgPSBtYXRjaGVkUmVwb3J0O1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJlcG9ydCA9IG5ldyBSZXBvcnQoKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZVBhcmFtQ29tcG9uZW50cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVQYXJhbUNvbXBvbmVudHMoKSB7XHJcbiAgICAgICAgaWYodGhpcy5wYXJhbUNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICB0aGlzLnBhcmFtQ29udGFpbmVyLmNsZWFyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHRoaXMuZm9ybWF0Q29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0Q29udGFpbmVyLmNsZWFyKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2Rlc3Ryb3kgcHJldmlvdXMgY29tcG9uZW50cyBhbmQgY2xlYXIgdGhlIGRpc3BsYXllZFJlZiBsaXN0cy4uP1xyXG4gICAgICAgIHRoaXMuZGVzdHJveUNvbXBvbmVudFJlZnMoKTtcclxuICAgICAgICB0aGlzLmRpc3BsYXllZFBhcmFtQ29tcG9uZW50UmVmcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuZGlzcGxheWVkRm9ybWF0Q29tcG9uZW50UmVmcyA9IFtdO1xyXG5cclxuICAgICAgICBmb3IobGV0IHAgb2YgdGhpcy5zZWxlY3RlZFJlcG9ydC5wYXJhbXMpe1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZmFjdG9yeTogQ29tcG9uZW50RmFjdG9yeTxQYXJhbWV0ZXJDb21wb25lbnQ+ID0gdGhpcy5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShQYXJhbWV0ZXJDb21wb25lbnQpO1xyXG4gICAgICAgICAgICB2YXIgY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8UGFyYW1ldGVyQ29tcG9uZW50PiA9IHRoaXMucGFyYW1Db250YWluZXIuY3JlYXRlQ29tcG9uZW50KGZhY3RvcnkpO1xyXG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZFBhcmFtQ29tcG9uZW50UmVmcy5wdXNoKGNvbXBvbmVudFJlZik7XHJcblxyXG4gICAgICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2Uuc2V0UGFyYW0ocCk7XHJcblxyXG4gICAgICAgICAgICBpZihwLm9wdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGVudHJpZXM6IGFueVtdID0gW107XHJcbiAgICAgICAgICAgICAgICBmb3IobGV0IG8gb2YgcC5vcHRpb25zKXtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IHtpZDogby52YWx1ZSwgZGlzcGxheTogby5kaXNwbGF5fTtcclxuICAgICAgICAgICAgICAgICAgICBlbnRyaWVzLnB1c2goZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UuZW50cmllcyA9IGVudHJpZXM7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZmlyc3Q6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICAgIGZvcihsZXQgZiBvZiB0aGlzLnNlbGVjdGVkUmVwb3J0LmZvcm1hdHMpe1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZmFjdG9yeTI6IENvbXBvbmVudEZhY3Rvcnk8Rm9ybWF0Q29tcG9uZW50PiA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoRm9ybWF0Q29tcG9uZW50KTtcclxuICAgICAgICAgICAgdmFyIGNvbXBvbmVudFJlZjI6IENvbXBvbmVudFJlZjxGb3JtYXRDb21wb25lbnQ+ID0gdGhpcy5mb3JtYXRDb250YWluZXIuY3JlYXRlQ29tcG9uZW50KGZhY3RvcnkyKTtcclxuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWRGb3JtYXRDb21wb25lbnRSZWZzLnB1c2goY29tcG9uZW50UmVmMik7XHJcblxyXG4gICAgICAgICAgICBjb21wb25lbnRSZWYyLmluc3RhbmNlLmZvcm1hdCA9IGY7XHJcbiAgICAgICAgICAgIGNvbXBvbmVudFJlZjIuaW5zdGFuY2Uuc2VsZWN0ZWRWYWx1ZUNoYW5nZS5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAgICAocykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGb3JtYXQgPSBzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZihmaXJzdCkgey8vc2VsZWN0IHRoZSBmaXJzdCBmb3JtYXQgaW4gdGhlIGdyb3VwaW5nXHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnRSZWYyLmluc3RhbmNlLnNlbGVjdGVkVmFsdWUgPSBmLm5hbWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRm9ybWF0ID0gZi5uYW1lO1xyXG4gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIG9wZW5IZWxwKGNvbnRlbnQpIHtcclxuXHJcbiAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbihjb250ZW50LCB7YXJpYUxhYmVsbGVkQnk6IFwiaGVscC1tb2RhbC10aXRsZVwifSlcclxuICAgICAgICAgICAgLnJlc3VsdC50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgLy8gdGhpcy5jbG9zZVJlc3VsdCA9IGBDbG9zZWQgd2l0aDogJHtyZXN1bHR9YDtcclxuICAgICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcclxuXHJcbiAgICAgICAgfSwgKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgICB2YXIgY2xvc2VSZXN1bHQgPSBgRGlzbWlzc2VkICR7dGhpcy5nZXREaXNtaXNzUmVhc29uKHJlYXNvbil9YDtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coY2xvc2VSZXN1bHQpO1xyXG5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXREaXNtaXNzUmVhc29uKHJlYXNvbjogYW55KTogc3RyaW5nIHtcclxuICAgICAgICBpZiAocmVhc29uID09PSBNb2RhbERpc21pc3NSZWFzb25zLkVTQykge1xyXG4gICAgICAgICAgICByZXR1cm4gXCJieSBwcmVzc2luZyBFU0NcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKHJlYXNvbiA9PT0gTW9kYWxEaXNtaXNzUmVhc29ucy5CQUNLRFJPUF9DTElDSykge1xyXG4gICAgICAgICAgICByZXR1cm4gXCJieSBjbGlja2luZyBvbiBhIGJhY2tkcm9wXCI7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuICBgd2l0aDogJHtyZWFzb259YDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25SdW5SZXBvcnQoKSB7XHJcblxyXG4gICAgICAgIGlmKHRoaXMuc2VsZWN0ZWRSZXBvcnQpIHtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nc1NlcnZpY2Uuc3RhcnREZWZhdWx0U3Bpbm5lckRpYWxvZygpO1xyXG5cclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJmb3JtYXQ6XCIgKyB0aGlzLnNlbGVjdGVkRm9ybWF0KTtcclxuICAgICAgICAgICAgaWYoIXRoaXMuc2VsZWN0ZWRGb3JtYXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGb3JtYXQgPSBcImh0bWxcIjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHJ1blBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICAgICAgICAgIHJ1blBhcmFtcyA9IHJ1blBhcmFtcy5hcHBlbmQoXCJmb3JtYXRcIiwgdGhpcy5zZWxlY3RlZEZvcm1hdCk7XHJcbiAgICAgICAgICAgIHJ1blBhcmFtcyA9IHJ1blBhcmFtcy5hcHBlbmQoXCJhY3Rpb25cIiwgXCJzaG93XCIpO1xyXG4gICAgICAgICAgICBydW5QYXJhbXMgPSBydW5QYXJhbXMuYXBwZW5kKFwicmVwb3J0TmFtZVwiLCB0aGlzLnNlbGVjdGVkUmVwb3J0Lm5hbWUpO1xyXG5cclxuICAgICAgICAgICAgcnVuUGFyYW1zID0gdGhpcy5nZXRSdW5QYXJhbWV0ZXJzKHJ1blBhcmFtcyk7XHJcblxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhydW5QYXJhbXMpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5odHRwLmdldCh0aGlzLmNvbW1hbmRQcmVmaXggKyB0aGlzLnNlbGVjdGVkUmVwb3J0LmNsYXNzTmFtZSxcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHJ1blBhcmFtcyxcclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApLnN1YnNjcmliZShcclxuICAgICAgICAgICAgICAgIChyZXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXMpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZW5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5zZWxlY3RlZEZvcm1hdCAhPSBcImh0bWxcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IHJlcy5oZWFkZXJzLmdldChcImNvbnRlbnQtZGlzcG9zaXRpb25cIikuc3BsaXQoXCI7XCIpWzFdLnNwbGl0KFwiPVwiKVsxXS5yZXBsYWNlKC9cXFwiL2csIFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtyZXMuYm9keV0sIHt0eXBlOiByZXMuYm9keS50eXBlfSApOyAvLywge3R5cGU6IFwiYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsXCJ9XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVVUkwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhmaWxlVVJMKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYTogSFRNTEFuY2hvckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKSBhcyBIVE1MQW5jaG9yRWxlbWVudDtcclxuICAgICAgICAgICAgICAgICAgICBhLmhyZWYgPSBmaWxlVVJMO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuc2VsZWN0ZWRGb3JtYXQgPT0gXCJodG1sXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYS50YXJnZXQgPSBcIl9ibGFua1wiO1xyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYS5kb3dubG9hZCA9IGZpbGVuYW1lO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcclxuICAgICAgICAgICAgICAgICAgICBhLmNsaWNrKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChmaWxlVVJMKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWFsb2dzU2VydmljZS5zdG9wQWxsU3Bpbm5lckRpYWxvZ3MoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UnVuUGFyYW1ldGVycyhydW5QYXJhbXM6IEh0dHBQYXJhbXMpOiBIdHRwUGFyYW1zIHtcclxuICAgICAgICB2YXIgbmV3UGFyYW1zID0gcnVuUGFyYW1zO1xyXG5cclxuICAgICAgICBmb3IobGV0IG8gb2YgdGhpcy5kaXNwbGF5ZWRQYXJhbUNvbXBvbmVudFJlZnMpe1xyXG4gICAgICAgICAgICB2YXIgcGFyYW0gPSBvLmluc3RhbmNlLnBhcmFtO1xyXG5cclxuICAgICAgICAgICAgaWYocGFyYW0udHlwZSA9PSBcIm11bHRpc2VsZWN0XCIpIHtcclxuICAgICAgICAgICAgICAgIHZhciByZXNMaXN0ID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgdiBvZiBwYXJhbS5zZWxlY3RlZFZhbHVlTGlzdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYocmVzTGlzdCAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc0xpc3QgKz0gXCIsXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJlc0xpc3QgKz0gdjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG5ld1BhcmFtcyA9IG5ld1BhcmFtcy5hcHBlbmQocGFyYW0ubmFtZSwgcmVzTGlzdCk7XHJcbiAgICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgICAgIHZhciB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIGlmKHBhcmFtLnNlbGVjdGVkVmFsdWUpIHsgLy9zbyB3ZSBkb24ndCBnZXQgXCJ1bmRlZmluZWRcIiBzZW50IGJhY2tcclxuICAgICAgICAgICAgICAgICAgICBpZihwYXJhbS50eXBlID09IFwiZGF0ZVwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5nZXREYXRlU3RyaW5nKHBhcmFtLnNlbGVjdGVkVmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJhbS5zZWxlY3RlZFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBuZXdQYXJhbXMgPSBuZXdQYXJhbXMuYXBwZW5kKHBhcmFtLm5hbWUsIHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3UGFyYW1zO1xyXG4gICAgfVxyXG5cclxuICAgIGdldERhdGVTdHJpbmcoZGF0ZTogYW55KTogc3RyaW5nIHtcclxuXHJcbiAgICAgICAgaWYgKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgICAgIGlmICghaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZGF0ZSwgXCJNTS9kZC95eXl5XCIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZSBpZihtb21lbnQuaXNNb21lbnQoZGF0ZSkgKSB7XHJcbiAgICAgICAgICAgIGlmKGRhdGUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUuZm9ybWF0KFwiTS9EL1lZWVlcIik7XHJcbiAgICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2UgaWYodHlwZW9mIGRhdGUgPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0ZTtcclxuICAgICAgICB9ZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkZXN0cm95Q29tcG9uZW50UmVmcygpIHtcclxuICAgICAgZm9yKGxldCBvIG9mIHRoaXMuZGlzcGxheWVkUGFyYW1Db21wb25lbnRSZWZzKXtcclxuICAgICAgICBvLmRlc3Ryb3koKTtcclxuICAgICAgfVxyXG4gICAgICBmb3IobGV0IG8gb2YgdGhpcy5kaXNwbGF5ZWRGb3JtYXRDb21wb25lbnRSZWZzKXtcclxuICAgICAgICBvLmRlc3Ryb3koKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZGVzdHJveUNvbXBvbmVudFJlZnMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgc3R5bGVzOiBbYFxyXG4gICAgICAucmVwb3J0LWRldGFpbHN7XHJcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZVxyXG4gICAgICB9XHJcblxyXG4gICAgICAuY2VudGVyLXJvd3tcclxuICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xyXG4gICAgICAgIG1hcmdpbi1sZWZ0OiA2MHZ3O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAubWF0LXRhYi1ib2R5LXdyYXBwZXJ7XHJcbiAgICBmbGV4LWdyb3c6IDE7XHJcbiAgfVxyXG5cclxuLnRhYi1wYW5le1xyXG4gIGhlaWdodDogMTAwJTtcclxufVxyXG5gXSovXHJcbn1cclxuIl19
|